diff --git a/.editorconfig b/.editorconfig index 76edc491c..1059bcdeb 100644 --- a/.editorconfig +++ b/.editorconfig @@ -16,6 +16,17 @@ tab_width = 4 # New line preferences end_of_line = lf insert_final_newline = true +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_explicit_tuple_names = true:suggestion # Markdown, JSON, YAML, props and csproj files [*.{md,json,yml,props,csproj}] @@ -106,7 +117,7 @@ csharp_style_conditional_delegate_call = true:suggestion csharp_prefer_static_local_function = true:suggestion csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent csharp_style_prefer_readonly_struct = true -csharp_style_prefer_method_group_conversion = true +csharp_style_prefer_method_group_conversion = true:silent # Code-block preferences csharp_prefer_braces = true:silent @@ -177,9 +188,9 @@ csharp_preserve_single_line_statements = false # Naming rules -dotnet_naming_rule.interfaces_should_be_prefixed_with_I.severity = suggestion +dotnet_naming_rule.interfaces_should_be_prefixed_with_i.severity = suggestion dotnet_naming_rule.interfaces_should_be_prefixed_with_I.symbols = interface -dotnet_naming_rule.interfaces_should_be_prefixed_with_I.style = IPascalCase +dotnet_naming_rule.interfaces_should_be_prefixed_with_i.style = IPascalCase dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion dotnet_naming_rule.types_should_be_pascal_case.symbols = types @@ -236,28 +247,22 @@ dotnet_naming_style.IPascalCase.required_suffix = dotnet_naming_style.IPascalCase.word_separator = dotnet_naming_style.IPascalCase.capitalization = pascal_case -# TODO: -# .NET 8 migration (new warnings are caused by the NET 8 C# compiler and analyzer) -# The following info messages might need to be fixed in the source code instead of hiding the actual message -# Without the following lines, dotnet format would fail -# Disable "Collection initialization can be simplified" +# Other settings +csharp_style_prefer_top_level_statements = true:suggestion +csharp_style_prefer_primary_constructors = false:suggestion +csharp_prefer_system_threading_lock = true:suggestion + + +# Analyzers +dotnet_diagnostic.CA1069.severity = none # CA1069: Enums values should not be duplicated +# Disable Collection initialization can be simplified dotnet_diagnostic.IDE0028.severity = none dotnet_diagnostic.IDE0300.severity = none dotnet_diagnostic.IDE0301.severity = none dotnet_diagnostic.IDE0302.severity = none dotnet_diagnostic.IDE0305.severity = none -# Disable "'new' expression can be simplified" -dotnet_diagnostic.IDE0090.severity = none -# Disable "Use primary constructor" -dotnet_diagnostic.IDE0290.severity = none -# Disable "Member '' does not access instance data and can be marked as static" -dotnet_diagnostic.CA1822.severity = none -# Disable "Change type of field '' from '' to '' for improved performance" -dotnet_diagnostic.CA1859.severity = none -# Disable "Prefer 'static readonly' fields over constant array arguments if the called method is called repeatedly and is not mutating the passed array" -dotnet_diagnostic.CA1861.severity = none -# Disable "Prefer using 'string.Equals(string, StringComparison)' to perform a case-insensitive comparison, but keep in mind that this might cause subtle changes in behavior, so make sure to conduct thorough testing after applying the suggestion, or if culturally sensitive comparison is not required, consider using 'StringComparison.OrdinalIgnoreCase'" -dotnet_diagnostic.CA1862.severity = none +dotnet_diagnostic.CS9113.severity = none # CS9113: Parameter 'value' is unread +dotnet_diagnostic.IDE0130.severity = none # IDE0130: Namespace does not match folder structure [src/Ryujinx/UI/ViewModels/**.cs] # Disable "mark members as static" rule for ViewModels diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index ffb5d5f8b..45f233dff 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -22,7 +22,7 @@ body: id: log attributes: label: Log file - description: A log file will help our developers to better diagnose and fix the issue. + description: "A log file will help our developers to better diagnose and fix the issue. UPLOAD THE FILE. DO NOT COPY AND PASTE THE FILE'S CONTENT." placeholder: Logs files can be found under "Logs" folder in Ryujinx program folder. They can also be accessed by opening Ryujinx, then going to File > Open Logs Folder. You can drag and drop the log on to the text area (do not copy paste). validations: required: true diff --git a/.github/labeler.yml b/.github/labeler.yml index 871f9945f..b80dbb1fb 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -18,6 +18,10 @@ gpu: - changed-files: - any-glob-to-any-file: ['src/Ryujinx.Graphics.Vulkan/**', 'src/Spv.Generator/**'] +'graphics-backend:metal': + - changed-files: + - any-glob-to-any-file: ['src/Ryujinx.Graphics.Metal/**', 'src/Ryujinx.Graphics.Metal.SharpMetalExtensions/**'] + gui: - changed-files: - any-glob-to-any-file: ['src/Ryujinx/**', 'src/Ryujinx.UI.Common/**', 'src/Ryujinx.UI.LocaleGenerator/**'] @@ -32,7 +36,7 @@ kernel: infra: - changed-files: - - any-glob-to-any-file: ['.github/**', 'distribution/**', 'Directory.Packages.props'] + - any-glob-to-any-file: ['.github/**', 'distribution/**', 'Directory.Packages.props', 'src/Ryujinx.BuildValidationTasks/**'] documentation: - changed-files: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 21dc3eb0b..a70dcc6f8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,6 +19,7 @@ jobs: configuration: [Debug, Release] platform: - { name: win-x64, os: windows-latest, zip_os_name: win_x64 } + - { name: win-arm64, os: windows-latest, zip_os_name: win_arm64 } - { name: linux-x64, os: ubuntu-latest, zip_os_name: linux_x64 } - { name: linux-arm64, os: ubuntu-latest, zip_os_name: linux_arm64 } - { name: osx-x64, os: macos-13, zip_os_name: osx_x64 } @@ -64,14 +65,9 @@ jobs: run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - - name: Publish Ryujinx.Headless.SDL2 - run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained - if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - - name: Set executable bit run: | chmod +x ./publish/Ryujinx ./publish/Ryujinx.sh - chmod +x ./publish_sdl2_headless/Ryujinx.Headless.SDL2 ./publish_sdl2_headless/Ryujinx.sh if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest' - name: Build AppImage @@ -119,13 +115,6 @@ jobs: name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}-AppImage path: publish_appimage - - name: Upload Ryujinx.Headless.SDL2 artifact - uses: actions/upload-artifact@v4 - with: - name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }} - path: publish_sdl2_headless - if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13' - build_macos: name: macOS Universal (${{ matrix.configuration }}) runs-on: ubuntu-latest @@ -141,11 +130,11 @@ jobs: with: global-json-file: global.json - - name: Setup LLVM 14 + - name: Setup LLVM 17 run: | wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 14 + sudo ./llvm.sh 17 - name: Install rcodesign run: | @@ -171,20 +160,9 @@ jobs: run: | ./distribution/macos/create_macos_build_ava.sh . publish_tmp publish ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER" - - name: Publish macOS Ryujinx.Headless.SDL2 - run: | - ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER" - - name: Upload Ryujinx artifact uses: actions/upload-artifact@v4 with: name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal path: "publish/*.tar.gz" if: github.event_name == 'pull_request' - - - name: Upload Ryujinx.Headless.SDL2 artifact - uses: actions/upload-artifact@v4 - with: - name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal - path: "publish_headless/*.tar.gz" - if: github.event_name == 'pull_request' diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index df28e4784..cf250eb08 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -19,47 +19,11 @@ concurrency: release env: POWERSHELL_TELEMETRY_OPTOUT: 1 DOTNET_CLI_TELEMETRY_OPTOUT: 1 - RYUJINX_BASE_VERSION: "1.2" + RYUJINX_BASE_VERSION: "1.3" RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "canary" - RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "GreemDev" - RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO: "Ryujinx" - RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx-Canary" RELEASE: 1 jobs: - tag: - name: Create tag - runs-on: ubuntu-20.04 - steps: - - name: Get version info - id: version_info - run: | - echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.${{ github.run_number }}" >> $GITHUB_OUTPUT - echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT - shell: bash - - - name: Create tag - uses: actions/github-script@v7 - with: - script: | - github.rest.git.createRef({ - owner: context.repo.owner, - repo: context.repo.repo, - ref: 'refs/tags/Canary-${{ steps.version_info.outputs.build_version }}', - sha: context.sha - }) - - - name: Create release - uses: ncipollo/release-action@v1 - with: - name: "Canary ${{ steps.version_info.outputs.build_version }}" - tag: ${{ steps.version_info.outputs.build_version }} - body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}" - omitBodyDuringUpdate: true - owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }} - repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }} - token: ${{ secrets.RELEASE_TOKEN }} - release: name: Release for ${{ matrix.platform.name }} runs-on: ${{ matrix.platform.os }} @@ -67,6 +31,7 @@ jobs: matrix: platform: - { name: win-x64, os: windows-latest, zip_os_name: win_x64 } + #- { name: win-arm64, os: windows-latest, zip_os_name: win_arm64 } - { name: linux-x64, os: ubuntu-latest, zip_os_name: linux_x64 } - { name: linux-arm64, os: ubuntu-latest, zip_os_name: linux_arm64 } steps: @@ -92,10 +57,8 @@ jobs: sed -r --in-place 's/\%\%RYUJINX_BUILD_VERSION\%\%/${{ steps.version_info.outputs.build_version }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_BUILD_GIT_HASH\%\%/${{ steps.version_info.outputs.git_short_hash }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_NAME\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_NAME }}/g;' src/Ryujinx.Common/ReleaseInformation.cs - sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_OWNER\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/g;' src/Ryujinx.Common/ReleaseInformation.cs - sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs - sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs + sed -r --in-place '/^Name=Ryujinx$/s/Name=Ryujinx/Name=Ryujinx-Canary/' distribution/linux/Ryujinx.desktop shell: bash - name: Create output dir @@ -103,95 +66,89 @@ jobs: - name: Publish run: | - dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_ava/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained - dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained + dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained - name: Packing Windows builds if: matrix.platform.os == 'windows-latest' run: | - pushd publish_ava - rm publish/libarmeilleure-jitsupport.dylib - 7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish - popd - - pushd publish_sdl2_headless - rm publish/libarmeilleure-jitsupport.dylib - 7z a ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish + pushd publish + rm libarmeilleure-jitsupport.dylib + 7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish popd + + gh release download -R GreemDev/GLI -O gli.exe -p 'GitLabCli-win_x64.exe' + + ./gli.exe --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=UploadGenericPackage "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip" shell: bash + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install GitLabCli + if: matrix.platform.os == 'ubuntu-latest' + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Packing Linux builds if: matrix.platform.os == 'ubuntu-latest' run: | - pushd publish_ava - rm publish/libarmeilleure-jitsupport.dylib - chmod +x publish/Ryujinx.sh publish/Ryujinx - tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish - popd - - pushd publish_sdl2_headless - rm publish/libarmeilleure-jitsupport.dylib - chmod +x publish/Ryujinx.sh publish/Ryujinx.Headless.SDL2 - tar -czvf ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish + pushd publish + rm libarmeilleure-jitsupport.dylib + chmod +x Ryujinx.sh Ryujinx + tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish popd + + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=UploadGenericPackage "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz" shell: bash - #- name: Build AppImage (Linux) - # if: matrix.platform.os == 'ubuntu-latest' - # run: | - # BUILD_VERSION="${{ steps.version_info.outputs.build_version }}" - # PLATFORM_NAME="${{ matrix.platform.name }}" + - name: Build AppImage (Linux) + if: matrix.platform.os == 'ubuntu-latest' + run: | + BUILD_VERSION="${{ steps.version_info.outputs.build_version }}" + PLATFORM_NAME="${{ matrix.platform.name }}" - # sudo apt install -y zsync desktop-file-utils appstream + sudo apt install -y zsync desktop-file-utils appstream - # mkdir -p tools - # export PATH="$PATH:$(readlink -f tools)" + mkdir -p tools + export PATH="$PATH:$(readlink -f tools)" # Setup appimagetool - # wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" - # chmod +x tools/appimagetool - # chmod +x distribution/linux/appimage/build-appimage.sh + wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" + chmod +x tools/appimagetool + chmod +x distribution/linux/appimage/build-appimage.sh # Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name) - # if [ "$PLATFORM_NAME" = "linux-x64" ]; then - # ARCH_NAME=x64 - # export ARCH=x86_64 - # elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then - # ARCH_NAME=arm64 - # export ARCH=aarch64 - # else - # echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME"" - # exit 1 - # fi + if [ "$PLATFORM_NAME" = "linux-x64" ]; then + ARCH_NAME=x64 + export ARCH=x86_64 + elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then + ARCH_NAME=arm64 + export ARCH=aarch64 + else + echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME"" + exit 1 + fi - # export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync" - # BUILDDIR=publish_ava OUTDIR=publish_ava_appimage distribution/linux/appimage/build-appimage.sh + export UFLAG="gh-releases-zsync|${{ secrets.RC_OWNER }}${{ secrets.RC_CANARY_NAME }}|latest|*-$ARCH_NAME.AppImage.zsync" + BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh - # Add to release output - # pushd publish_ava_appimage - # mv Ryujinx.AppImage ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage - # mv Ryujinx.AppImage.zsync ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync - # popd - # shell: bash - - - name: Pushing new release - uses: ncipollo/release-action@v1 - with: - name: ${{ steps.version_info.outputs.build_version }} - artifacts: "release_output/*.tar.gz,release_output/*.zip" - #artifacts: "release_output/*.tar.gz,release_output/*.zip/*AppImage*" - tag: ${{ steps.version_info.outputs.build_version }} - body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}" - omitBodyDuringUpdate: true - allowUpdates: true - replacesArtifacts: true - owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }} - repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }} - token: ${{ secrets.RELEASE_TOKEN }} + pushd publish_appimage + mv Ryujinx.AppImage ../release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage + mv Ryujinx.AppImage.zsync ../release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync + popd + + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=UploadGenericPackage "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage" + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=UploadGenericPackage "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-canary-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync" + shell: bash macos_release: name: Release MacOS universal - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -199,11 +156,21 @@ jobs: with: global-json-file: global.json - - name: Setup LLVM 15 + - name: Setup LLVM 17 run: | wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 15 + sudo ./llvm.sh 17 + + - name: Install GitLabCli + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Install rcodesign run: | @@ -230,28 +197,53 @@ jobs: sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_NAME\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_NAME }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_OWNER\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs - sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs shell: bash - name: Publish macOS Ryujinx run: | ./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish_ava ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1 + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=UploadGenericPackage "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|publish_ava/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz" - - name: Publish macOS Ryujinx.Headless.SDL2 + create_gitlab_release: + name: Create GitLab Release + runs-on: ubuntu-24.04 + needs: + - macos_release + - release + steps: + - uses: actions/checkout@v4 + + - name: Get version info + id: version_info run: | - ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1 + echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.${{ github.run_number }}" >> $GITHUB_OUTPUT + echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + shell: bash - - name: Pushing new release - uses: ncipollo/release-action@v1 - with: - name: "Canary ${{ steps.version_info.outputs.build_version }}" - artifacts: "publish_ava/*.tar.gz, publish_headless/*.tar.gz" - tag: ${{ steps.version_info.outputs.build_version }} - body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}" - omitBodyDuringUpdate: true - allowUpdates: true - replacesArtifacts: true - owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }} - repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }} - token: ${{ secrets.RELEASE_TOKEN }} + - name: Install GitLabCli + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create tag + run: | + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=CreateTag "Canary-${{ steps.version_info.outputs.build_version }}|${{ steps.version_info.outputs.git_short_hash }}" + + - name: Create release + run: | + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=CreateReleaseFromGenericPackageFiles "Ryubing-Canary|${{ steps.version_info.outputs.build_version }}|main|Canary ${{ steps.version_info.outputs.build_version }}|**Full Changelog:** [${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}](https://git.ryujinx.app/ryubing/ryujinx/-/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }})" + + - name: Send notification webhook + run: | + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=SendUpdateMessage "${{ steps.version_info.outputs.build_version }}|FF4500|${{ secrets.CANARY_DISCORD_WEBHOOK }}|https://avatars.githubusercontent.com/u/192939710?s=200&v=4|false" + + - name: Notify update server of new builds + run: | + curl 'https://update.ryujinx.app/api/v1/admin/refresh_cache?rc=canary' -X PATCH -H 'accept: */*' -H 'Authorization: ${{ secrets.UPDATE_SERVER_ADMIN_TOKEN }}' diff --git a/.github/workflows/debug_release.yml b/.github/workflows/debug_release.yml new file mode 100644 index 000000000..b166adb61 --- /dev/null +++ b/.github/workflows/debug_release.yml @@ -0,0 +1,224 @@ +name: Release job (Debug) + +on: + workflow_dispatch: + inputs: {} + +concurrency: release + +env: + POWERSHELL_TELEMETRY_OPTOUT: 1 + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + RYUJINX_BASE_VERSION: "1.3" + RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "release" + RELEASE: 1 + +jobs: + release: + name: Release for ${{ matrix.platform.name }} + runs-on: ${{ matrix.platform.os }} + strategy: + matrix: + platform: + - { name: win-x64, os: windows-latest, zip_os_name: win_x64 } + #- { name: win-arm64, os: windows-latest, zip_os_name: win_arm64 } + - { name: linux-x64, os: ubuntu-latest, zip_os_name: linux_x64 } + - { name: linux-arm64, os: ubuntu-latest, zip_os_name: linux_arm64 } + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-dotnet@v4 + with: + global-json-file: global.json + + - name: Overwrite csc problem matcher + run: echo "::add-matcher::.github/csc.json" + + - name: Get version info + id: version_info + run: | + echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} + 10))" >> $GITHUB_OUTPUT + echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + shell: bash + + - name: Configure for release + run: | + sed -r --in-place 's/\%\%RYUJINX_BUILD_VERSION\%\%/${{ steps.version_info.outputs.build_version }}/g;' src/Ryujinx.Common/ReleaseInformation.cs + sed -r --in-place 's/\%\%RYUJINX_BUILD_GIT_HASH\%\%/${{ steps.version_info.outputs.git_short_hash }}/g;' src/Ryujinx.Common/ReleaseInformation.cs + sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_NAME\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_NAME }}/g;' src/Ryujinx.Common/ReleaseInformation.cs + sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs + shell: bash + + - name: Create output dir + run: "mkdir release_output" + + - name: Publish + run: | + dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained + + - name: Packing Windows builds + if: matrix.platform.os == 'windows-latest' + run: | + pushd publish + rm libarmeilleure-jitsupport.dylib + 7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish + popd + + gh release download -R GreemDev/GLI -O gli.exe -p 'GitLabCli-win_x64.exe' + + ./gli.exe --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip" + shell: bash + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install GitLabCli + if: matrix.platform.os == 'ubuntu-latest' + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Packing Linux builds + if: matrix.platform.os == 'ubuntu-latest' + run: | + pushd publish + rm libarmeilleure-jitsupport.dylib + chmod +x Ryujinx.sh Ryujinx + tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish + popd + + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz" + shell: bash + + - name: Build AppImage (Linux) + if: matrix.platform.os == 'ubuntu-latest' + run: | + BUILD_VERSION="${{ steps.version_info.outputs.build_version }}" + PLATFORM_NAME="${{ matrix.platform.name }}" + + sudo apt install -y zsync desktop-file-utils appstream + + mkdir -p tools + export PATH="$PATH:$(readlink -f tools)" + + # Setup appimagetool + wget -q -O tools/appimagetool "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" + chmod +x tools/appimagetool + chmod +x distribution/linux/appimage/build-appimage.sh + + # Explicitly set $ARCH for appimagetool ($ARCH_NAME is for the file name) + if [ "$PLATFORM_NAME" = "linux-x64" ]; then + ARCH_NAME=x64 + export ARCH=x86_64 + elif [ "$PLATFORM_NAME" = "linux-arm64" ]; then + ARCH_NAME=arm64 + export ARCH=aarch64 + else + echo "Unexpected PLATFORM_NAME "$PLATFORM_NAME"" + exit 1 + fi + + export UFLAG="gh-releases-zsync|${{ github.repository_owner }}|${{ github.event.repository.name }}|latest|*-$ARCH_NAME.AppImage.zsync" + BUILDDIR=publish OUTDIR=publish_appimage distribution/linux/appimage/build-appimage.sh + + pushd publish_appimage + mv Ryujinx.AppImage ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage + mv Ryujinx.AppImage.zsync ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync + popd + + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage" + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync" + shell: bash + + macos_release: + name: Release MacOS universal + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-dotnet@v4 + with: + global-json-file: global.json + + - name: Setup LLVM 17 + run: | + wget https://apt.llvm.org/llvm.sh + chmod +x llvm.sh + sudo ./llvm.sh 17 + + - name: Install GitLabCli + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install rcodesign + run: | + mkdir -p $HOME/.bin + gh release download -R indygreg/apple-platform-rs -O apple-codesign.tar.gz -p 'apple-codesign-*-x86_64-unknown-linux-musl.tar.gz' + tar -xzvf apple-codesign.tar.gz --wildcards '*/rcodesign' --strip-components=1 + rm apple-codesign.tar.gz + mv rcodesign $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Get version info + id: version_info + run: | + echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} + 10))" >> $GITHUB_OUTPUT + echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + + - name: Configure for release + run: | + sed -r --in-place 's/\%\%RYUJINX_BUILD_VERSION\%\%/${{ steps.version_info.outputs.build_version }}/g;' src/Ryujinx.Common/ReleaseInformation.cs + sed -r --in-place 's/\%\%RYUJINX_BUILD_GIT_HASH\%\%/${{ steps.version_info.outputs.git_short_hash }}/g;' src/Ryujinx.Common/ReleaseInformation.cs + sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_NAME\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_NAME }}/g;' src/Ryujinx.Common/ReleaseInformation.cs + sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs + shell: bash + + - name: Publish macOS Ryujinx + run: | + ./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0 + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|publish/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz" + + create_gitlab_release: + name: Create GitLab Release + runs-on: ubuntu-24.04 + needs: + - macos_release + - release + steps: + - uses: actions/checkout@v4 + + - name: Get version info + id: version_info + run: | + echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} + 10))" >> $GITHUB_OUTPUT + echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + shell: bash + + - name: Install GitLabCli + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create release + run: | + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=CreateReleaseFromGenericPackageFiles "Ryubing|${{ steps.version_info.outputs.build_version }}|${{ steps.version_info.outputs.git_short_hash }}|test|THIS IS NOT INTENDED FOR END USER USAGE" diff --git a/.github/workflows/nightly_pr_comment.yml b/.github/workflows/nightly_pr_comment.yml index 85a6e2de4..24d23d98b 100644 --- a/.github/workflows/nightly_pr_comment.yml +++ b/.github/workflows/nightly_pr_comment.yml @@ -38,20 +38,16 @@ jobs: return core.error(`No artifacts found`); } let body = `Download the artifacts for this pull request:\n`; - let hidden_headless_artifacts = `\n\n
GUI-less\n`; let hidden_debug_artifacts = `\n\n
Only for Developers\n`; for (const art of artifacts) { - if(art.name.includes('Debug')) { - hidden_debug_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; - } else if(art.name.includes('nogui-ryujinx')) { - hidden_headless_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; + const url = `https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip`; + if (art.name.includes('Debug')) { + hidden_debug_artifacts += `\n* [${art.name}](${url})`; } else { - body += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; + body += `\n* [${art.name}](${url})`; } } - hidden_headless_artifacts += `\n
`; hidden_debug_artifacts += `\n
`; - body += hidden_headless_artifacts; body += hidden_debug_artifacts; const {data: comments} = await github.rest.issues.listComments({repo, owner, issue_number}); diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fbf715756..9f2099719 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,62 +3,17 @@ name: Release job on: workflow_dispatch: inputs: {} - push: - branches: [ release ] - paths-ignore: - - '.github/**' - - 'docs/**' - - 'assets/**' - - '*.yml' - - '*.json' - - '*.config' - - '*.md' concurrency: release env: POWERSHELL_TELEMETRY_OPTOUT: 1 DOTNET_CLI_TELEMETRY_OPTOUT: 1 - RYUJINX_BASE_VERSION: "1.2" + RYUJINX_BASE_VERSION: "1.3" RYUJINX_TARGET_RELEASE_CHANNEL_NAME: "release" - RYUJINX_TARGET_RELEASE_CHANNEL_OWNER: "GreemDev" - RYUJINX_TARGET_RELEASE_CHANNEL_REPO: "Ryujinx" RELEASE: 1 jobs: - tag: - name: Create tag - runs-on: ubuntu-20.04 - steps: - - name: Get version info - id: version_info - run: | - echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.${{ github.run_number }}" >> $GITHUB_OUTPUT - echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT - shell: bash - - - name: Create tag - uses: actions/github-script@v7 - with: - script: | - github.rest.git.createRef({ - owner: context.repo.owner, - repo: context.repo.repo, - ref: 'refs/tags/${{ steps.version_info.outputs.build_version }}', - sha: context.sha - }) - - - name: Create release - uses: ncipollo/release-action@v1 - with: - name: ${{ steps.version_info.outputs.build_version }} - tag: ${{ steps.version_info.outputs.build_version }} - body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}" - omitBodyDuringUpdate: true - owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }} - repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }} - token: ${{ secrets.RELEASE_TOKEN }} - release: name: Release for ${{ matrix.platform.name }} runs-on: ${{ matrix.platform.os }} @@ -66,6 +21,7 @@ jobs: matrix: platform: - { name: win-x64, os: windows-latest, zip_os_name: win_x64 } + #- { name: win-arm64, os: windows-latest, zip_os_name: win_arm64 } - { name: linux-x64, os: ubuntu-latest, zip_os_name: linux_x64 } - { name: linux-arm64, os: ubuntu-latest, zip_os_name: linux_arm64 } steps: @@ -91,9 +47,6 @@ jobs: sed -r --in-place 's/\%\%RYUJINX_BUILD_VERSION\%\%/${{ steps.version_info.outputs.build_version }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_BUILD_GIT_HASH\%\%/${{ steps.version_info.outputs.git_short_hash }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_NAME\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_NAME }}/g;' src/Ryujinx.Common/ReleaseInformation.cs - sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_OWNER\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/g;' src/Ryujinx.Common/ReleaseInformation.cs - sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs - sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs shell: bash @@ -103,7 +56,6 @@ jobs: - name: Publish run: | dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained - dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained - name: Packing Windows builds if: matrix.platform.os == 'windows-latest' @@ -112,12 +64,38 @@ jobs: rm libarmeilleure-jitsupport.dylib 7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish popd - - pushd publish_sdl2_headless - rm libarmeilleure-jitsupport.dylib - 7z a ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish - popd + + gh release download -R GreemDev/GLI -O gli.exe -p 'GitLabCli-win_x64.exe' + + ./gli.exe --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip" shell: bash + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install GitLabCli + if: matrix.platform.os == 'ubuntu-latest' + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Packing Linux builds + if: matrix.platform.os == 'ubuntu-latest' + run: | + pushd publish + rm libarmeilleure-jitsupport.dylib + chmod +x Ryujinx.sh Ryujinx + tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish + popd + + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz" + shell: bash + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Build AppImage (Linux) if: matrix.platform.os == 'ubuntu-latest' @@ -154,39 +132,14 @@ jobs: mv Ryujinx.AppImage ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage mv Ryujinx.AppImage.zsync ../release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync popd - shell: bash - - - name: Packing Linux builds - if: matrix.platform.os == 'ubuntu-latest' - run: | - pushd publish - chmod +x Ryujinx.sh Ryujinx - tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish - popd - - pushd publish_sdl2_headless - chmod +x Ryujinx.sh Ryujinx.Headless.SDL2 - tar -czvf ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish - popd + + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage" + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync" shell: bash - - name: Pushing new release - uses: ncipollo/release-action@v1 - with: - name: ${{ steps.version_info.outputs.build_version }} - artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*" - tag: ${{ steps.version_info.outputs.build_version }} - body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}" - omitBodyDuringUpdate: true - allowUpdates: true - replacesArtifacts: true - owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }} - repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }} - token: ${{ secrets.RELEASE_TOKEN }} - macos_release: name: Release MacOS universal - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -194,11 +147,21 @@ jobs: with: global-json-file: global.json - - name: Setup LLVM 15 + - name: Setup LLVM 17 run: | wget https://apt.llvm.org/llvm.sh chmod +x llvm.sh - sudo ./llvm.sh 15 + sudo ./llvm.sh 17 + + - name: Install GitLabCli + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Install rcodesign run: | @@ -223,30 +186,49 @@ jobs: sed -r --in-place 's/\%\%RYUJINX_BUILD_VERSION\%\%/${{ steps.version_info.outputs.build_version }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_BUILD_GIT_HASH\%\%/${{ steps.version_info.outputs.git_short_hash }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_NAME\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_NAME }}/g;' src/Ryujinx.Common/ReleaseInformation.cs - sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_OWNER\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }}/g;' src/Ryujinx.Common/ReleaseInformation.cs - sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs - sed -r --in-place 's/\%\%RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO\%\%/${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }}/g;' src/Ryujinx.Common/ReleaseInformation.cs sed -r --in-place 's/\%\%RYUJINX_CONFIG_FILE_NAME\%\%/Config\.json/g;' src/Ryujinx.Common/ReleaseInformation.cs shell: bash - name: Publish macOS Ryujinx run: | ./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0 - - - name: Publish macOS Ryujinx.Headless.SDL2 + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|publish/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz" + + create_gitlab_release: + name: Create GitLab Release + runs-on: ubuntu-24.04 + needs: + - macos_release + - release + steps: + - uses: actions/checkout@v4 + + - name: Get version info + id: version_info run: | - ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0 + echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.${{ github.run_number }}" >> $GITHUB_OUTPUT + echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT + echo "git_short_hash=$(git rev-parse --short "${{ github.sha }}")" >> $GITHUB_OUTPUT + shell: bash - - name: Pushing new release - uses: ncipollo/release-action@v1 - with: - name: ${{ steps.version_info.outputs.build_version }} - artifacts: "publish/*.tar.gz, publish_headless/*.tar.gz" - tag: ${{ steps.version_info.outputs.build_version }} - body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}" - omitBodyDuringUpdate: true - allowUpdates: true - replacesArtifacts: true - owner: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_OWNER }} - repo: ${{ env.RYUJINX_TARGET_RELEASE_CHANNEL_REPO }} - token: ${{ secrets.RELEASE_TOKEN }} + - name: Install GitLabCli + run: | + mkdir -p $HOME/.bin + gh release download -R GreemDev/GLI -O gli -p 'GitLabCli-linux_x64' + chmod +x gli + mv gli $HOME/.bin/ + echo "$HOME/.bin" >> $GITHUB_PATH + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create release + run: | + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=CreateReleaseFromGenericPackageFiles "Ryubing|${{ steps.version_info.outputs.build_version }}|${{ steps.version_info.outputs.git_short_hash }}|${{ steps.version_info.outputs.build_version }}|msd:${{ steps.version_info.outputs.build_version }}" + + - name: Send notification webhook + run: | + gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=SendUpdateMessage "${{ steps.version_info.outputs.build_version }}|32cd32|${{ secrets.STABLE_DISCORD_WEBHOOK }}|https://avatars.githubusercontent.com/u/192939710?s=200&v=4|false" + + - name: Notify update server of new builds + run: | + curl 'https://update.ryujinx.app/api/v1/admin/refresh_cache?rc=stable' -X PATCH -H 'accept: */*' -H 'Authorization: ${{ secrets.UPDATE_SERVER_ADMIN_TOKEN }}' diff --git a/.gitignore b/.gitignore index 9a192926f..8357033e6 100644 --- a/.gitignore +++ b/.gitignore @@ -178,3 +178,7 @@ PublishProfiles/ # Ignore MacOS Attribute Files ._* + +# Ignore distribution build files +distribution/macos/temp/ +distribution/macos/output/ diff --git a/BuildAndPushLibraries.sh b/BuildAndPushLibraries.sh new file mode 100644 index 000000000..4bd6cfc55 --- /dev/null +++ b/BuildAndPushLibraries.sh @@ -0,0 +1,18 @@ +function pub { + dotnet publish -c release +} + +function package { + cd src/$1 + pub + mv bin/Release/$1.1.0.0.nupkg ../../pkgs/$1.1.0.0.nupkg + cd ../../ +} + +rm -rf pkgs +mkdir pkgs + +package ARMeilleure +package Ryujinx.Memory + +dotnet nuget push pkgs/*.nupkg --source RyubingPkgs \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..9a2b4ccb8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,254 @@ +# Ryujinx Changelog + +All updates to this Ryujinx branch will be documented in this file. + +## [1.3.2]() - 2025-06-09 + +## [1.3.1]() - 2025-04-23 + +## [1.2.86]() - 2025-03-13 + +## [1.2.82]() - 2025-02-16 + +## [1.2.80-81]() - 2025-01-22 + +## [1.2.78]() - 2024-12-19 + +## [1.2.73-1.2.76]() - 2024-11-19 +A list of notable changes can be found on the release linked in the version number above. + +Additionally, 1.2.74 & 75 were fixes for uploading Windows build artifacts. + +1.2.76 fixes a rare crash on startup. + +## [1.2.72]() - 2024-11-03 +PRs [#163](), [#164](), [#139]() +### HLE: + - Add DebugMouse HID device. + - Fixes "Clock Tower Rewind" crashing while loading. +### Audio: + - Fix index bounds check in GetCoefficientAtIndex. + - Fixes crashing in Super Mario Party Jamboree. +### misc: + - Update macOS distribution .icns. + +## [1.2.69]() - 2024-11-01 +### Infra: + - Compile the native libraries into the Ryujinx executable. + - Remove `libarmeilleure-jitsupport.dylib` from Windows & Linux releases (dylibs are macOS-only) +### Misc: + - Remove custom themes in config. + - This is a leftover from the GTK UI, as Avalonia does not have custom themes. + - Replace "" with `string.Empty`. + - Code cleanups & simplifications. + +## [1.2.67]() - 2024-11-01 +PRs [#36](), [#135]() + +### GUI: + - Set UseFloatingWatermark to false when watermark is empty + - Should prevent the text prompt box from having weird jumpy behavior. +### GPU: + - Increase the amount of VRAM cache available for textures based on selected DRAM amount. +### Misc: + - Fix homebrew loading. + + +## [1.2.64](https://github.com/GreemDev/Ryujinx/releases/tag/1.2.64) - 2024-10-30 +PRs [#92](https://github.com/GreemDev/Ryujinx/pull/92), [#96](https://github.com/GreemDev/Ryujinx/pull/96), [#97](https://github.com/GreemDev/Ryujinx/pull/97), [#101](https://github.com/GreemDev/Ryujinx/pull/101), [#103](https://github.com/GreemDev/Ryujinx/pull/103) +### GUI: +- Option to show classic-style title bar. Requires restart of emulator to take effect. + - This is only relevant on Windows. Other Operating Systems default to this being on and not being changeable, because the custom (current) title bar only works on Windows in the first place. +### i18n: +- it_IT: + - Add missing Italian strings. +- pt_BR: + - Add missing Brazilian Portuguese strings. +- fr_FR: + - Fix some French strings. +### MISC: +- Higher-res logo. + +## 1.2.59 - 2024-10-27 + +PRs [#88](https://github.com/GreemDev/Ryujinx/pull/88), [#87](https://github.com/GreemDev/Ryujinx/pull/87) +### i18n: +- fr_FR: + - Add missing translations for new features & fix a couple wrong ones. + - Fix Ignore Missing Services / Ignore Applet tooltip. + +## 1.2.57 - 2024-10-27 +PRs [#60](https://github.com/GreemDev/Ryujinx/pull/60), [#42](https://github.com/GreemDev/Ryujinx/pull/42) +### GUI: +- Automatically remove invalid DLC & updates as part of autoload. +- Added Thai translation for Ignore Applet hover tooltip. +### INPUT: +- When using multiple gamepads, when reconnecting they will no longer be mixed up between players. + +## 1.2.50 - 2024-10-25 +### GUI: +- Fix crash when using "delete all" button in mod manager. +### Updater: +- Remove Avalonia migration code. +### MISC: +- Replace references to IntPtr/UIntPtr to nint/nuint. + +## 1.2.45 - 2024-10-25 +### GUI: +- Added program icon to windows other than the main. +- Reference translations added in the last version. +- Shader compile counter is now translated. +### RPC: +- Added SONIC X SHADOW GENERATIONS asset image. +### MISC: +- Code cleanup. + +## 1.2.44 - 2024-10-25 +PR [#59](https://github.com/GreemDev/Ryujinx/pull/59) +### GUI: +- Add descriptions for "ignoring applet" translated into other languages. + +NOTE: The translation isn't referenced in the code yet, it will be in the next update. These are just the translations. + +## Hotfix: 1.2.43 - 2024-10-24 +### GUI: +- Do not enable Ignore Applet by default when upgrading config version. + +## 1.2.42 - 2024-10-24 +Sources: + +Init function: https://github.com/MutantAura/Ryujinx/commit/9cef4ceba40d66492ff775af793ff70e6e7551a9 + +Shader counter: https://github.com/MutantAura/Ryujinx/commit/67b873645fd593e83d042a77bf7ab12e5ec97357 + +Thanks MutantAura :D +### GUI: +- Implement shader compile counter (currently not translated, will change, need to pull changes.) +- Remove graphics backend / GPU name event logic in favor of a single init function. + +## 1.2.41 - 2024-10-24 +PR [#54](https://github.com/GreemDev/Ryujinx/pull/54) + +Thanks Whitescatz! +### i18n: +- th_TH (Thai): Added missing translations, reduce transliterated words, fix grammar. + +## 1.2.40 - 2024-10-23 +PR [#40](https://github.com/GreemDev/Ryujinx/pull/40) + +Thanks Вова С! +### GUI: +- Add option to ignore controller applet upon start. + +*This option is under the hacks section for a reason; it ignores intended behavior. Use with caution. + +## 1.2.39 - 2024-10-23 +### MISC: +- Null-coalesce autoloaddirs on config load. + - Should prevent crashing on config loads in some circumstances. + +## 1.2.38 - 2024-10-23 +PR [#51](https://github.com/GreemDev/Ryujinx/pull/51) +### i18n: +- zh_CH (Simplified Chinese): Add some missing translations. + +## 1.2.37 - 2024-10-23 +PR [#37](https://github.com/GreemDev/Ryujinx/pull/37) + +Thanks Last Breath! +### GUI: +- Set the default controller to the Pro Controller. + +## 1.2.36 - 2024-10-21 +PR [#30](https://github.com/GreemDev/Ryujinx/pull/30) +### GUI: +- Fix repeated dialog popup notifying you of new updates when there aren't any, while having a bundled update inside an XCI and an external update file. + +## 1.2.35 - 2024-10-21 +PR [#32](https://github.com/GreemDev/Ryujinx/pull/32) +### GUI: +- Replace "expand DRAM" option with a DRAM size dropdown. + - Allows for using mods which require a ridiculous amount of memory to allocate from. + +## 1.2.34 - 2024-10-21 +PR [#29](https://github.com/GreemDev/Ryujinx/pull/29) +### GUI: +- Fix duplicate controller names when 2 controllers of the same type are connected. +### INPUT: +- Fix invert x, y, and rotate when mapping physical left stick to logical right stick and vice versa. + +## 1.2.32-1.2.33 - 2024-10-21 +### i18n: +- fr_FR: Added missing strings and general improvements. + - Improve French translation clarity & add missing translations by Nebroc351, helped by Fredy27 in the Discord. + +## 1.2.31 - 2024-10-21 +### GUI: +- Revert maximized = fullscreen change. + - Fixes fullscreen not hiding the Windows taskbar. + +## 1.2.30 - 2024-10-19 +### GUI: +- Reload game list on locale change. +- Add keybinds to useful things (namely opening Amiibo scan window (Ctrl + A) and the scan button (Enter)). +- Reset RPC state when AppHost stops. + +### MISC: +- XML & code cleanups. + +## 1.2.29 - 2024-10-19 +### GUI: +- Remove references to ryujinx.org in the localization files. +- Switch from downloading amiibo.ryujinx.org to just referencing a file in the repo & images in the repo, under assets/amiibo. + +This fork is now entirely independent of the existing Ryujinx infrastructure, and as such the Amiibo features will continue to work in my version when they break in the mainline version. + +## 1.2.28 - 2024-10-17 +### GUI: +- Fix dialog popups doubling the window controls and laying text over the menu bar. + +## 1.2.26 - 2024-10-17 +### I18n: +Added Low-power PPTC mode strings to the translation files. +### GUI: +- Remove OS-provided title bar and put the Ryujinx logo next to "File" in the menu bar. + - What was in the title bar, Ryujinx version & current game information, is still visible by hovering the Ryujinx icon. +- Added icons to many actions in dropdown menus. +### RPC: +- Added Kirby and the Forgotten Land, Elder Scrolls V Skyrim, and Hyrule Warriors: Age of Calamity to the RPC assets. + +## 1.2.25 - 2024-10-14 +### CPU: +- Add low-power PPTC mode. + - Specifically, this setting causes the core count to get reduced by two-thirds, for lower-power but still fast loading if desired, and for unstable CPUs. + +## 1.2.24 - 2024-10-14 +### SDL: +- Move Mouse & MouseDriver to Input project, instead of Headless. + +## 1.2.22 - 2024-10-12 +### GUI/RPC: +- Added RDR, Luigi's Mansion 2 HD & 3 asset images. +### MISC: +- Minor code cleanups & improvements. +- Removed duplicate executable in the release bundle (leftovers from GTK & Avalonia dual releases). +- Removed Avalonia test release bundle, which was kept in Ryujinx for the OG Avalonia testers. That doesn't apply to this fork, so it's removed. + +## 1.2.21 - 2024-10-11 +### GUI/RPC: +- Add game version string when hovering large image asset. +- Add version information about this fork to the Ryujinx logo (big when in main menu, small when in game) when hovering. + +## 1.2.20 - 2024-10-11 +### MISC: +- Code cleanups & remove references to Ryujinx Patreon & Twitter. +### GUI: +- Add more Discord presence assets. + +## 1.2.1-1.2.19 - 2024-10-08 - 2024-10-11 +### GUI/INFRA/MISC: +- Remove GTK UI. +- Autoload DLC/Updates from dir ([#12](https://github.com/GreemDev/Ryujinx/pull/12)). +- Changed executable icon to rainbow logo. +- Extract Data > Logo now also extracts the square thumbnail you see for the game in the UI. +- The "use random UUID hack" checkbox in the Amiibo screen now remembers its last state when you reopen the window in a given session. diff --git a/COMPILING.md b/COMPILING.md index 20a2eb7ff..c989a50eb 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -5,12 +5,12 @@ If you wish to build the emulator yourself, follow these steps: ### Step 1 -Install the [.NET 8.0 (or higher) SDK](https://dotnet.microsoft.com/download/dotnet/8.0). +Install the [.NET 9.0 (or higher) SDK](https://dotnet.microsoft.com/download/dotnet/9.0). Make sure your SDK version is higher or equal to the required version specified in [global.json](global.json). ### Step 2 -Either use `git clone https://github.com/GreemDev/Ryujinx` on the command line to clone the repository or use Code --> Download zip button to get the files. +Either use `git clone https://github.com/Ryubing/Ryujinx` on the command line to clone the repository or use Code --> Download zip button to get the files. ### Step 3 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 686ea3994..f2f3c3af2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,13 +14,13 @@ We always welcome bug reports, feature proposals and overall feedback. Here are ### Finding Existing Issues -Before filing a new issue, please search our [open issues](https://github.com/GreemDev/Ryujinx/issues) to check if it already exists. +Before filing a new issue, please search our [open issues](https://github.com/Ryubing/Ryujinx/issues) to check if it already exists. If you do find an existing issue, please include your own feedback in the discussion. Do consider upvoting (👍 reaction) the original post, as this helps us prioritize popular issues in our backlog. ### Writing a Good Feature Request -Please review any feature requests already opened to both check it has not already been suggested, and to familiarize yourself with the format. When ready to submit a proposal, please use the [Feature Request issue template](https://github.com/GreemDev/Ryujinx/issues/new?assignees=&labels=&projects=&template=feature_request.yml&title=%5BFeature+Request%5D). +Please review any feature requests already opened to both check it has not already been suggested, and to familiarize yourself with the format. When ready to submit a proposal, please use the [Feature Request issue template](https://github.com/Ryubing/Ryujinx/issues/new?assignees=&labels=&projects=&template=feature_request.yml&title=%5BFeature+Request%5D). ### Writing a Good Bug Report @@ -34,13 +34,13 @@ Ideally, a bug report should contain the following information: * A Ryujinx log file of the run instance where the issue occurred. Log files can be found in `[Executable Folder]/Logs` and are named chronologically. * Additional information, e.g. is it a regression from previous versions? Are there any known workarounds? -When ready to submit a bug report, please use the [Bug Report issue template](https://github.com/GreemDev/Ryujinx/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml&title=%5BBug%5D). +When ready to submit a bug report, please use the [Bug Report issue template](https://github.com/Ryubing/Ryujinx/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml&title=%5BBug%5D). ## Contributing Changes Project maintainers will merge changes that both improve the project and meet our standards for code quality. -The [Pull Request Guide](docs/workflow/pr-guide.md) and [License](https://github.com/GreemDev/Ryujinx/blob/master/LICENSE.txt) docs define additional guidance. +The [Pull Request Guide](docs/workflow/pr-guide.md) and [License](https://github.com/Ryubing/Ryujinx/blob/master/LICENSE.txt) docs define additional guidance. ### DOs and DON'Ts @@ -74,14 +74,14 @@ We use and recommend the following workflow: 3. In your fork, create a branch off of main (`git checkout -b mybranch`). - Branches are useful since they isolate your changes from incoming changes from upstream. They also enable you to create multiple PRs from the same fork. 4. Make and commit your changes to your branch. - - [Build Instructions](https://github.com/GreemDev/Ryujinx/blob/master/COMPILING.md) explains how to build and test. + - [Build Instructions](https://github.com/Ryubing/Ryujinx/blob/master/COMPILING.md) explains how to build and test. - Commit messages should be clear statements of action and intent. 6. Build the repository with your changes. - Make sure that the builds are clean. - Make sure that `dotnet format` has been run and any corrections tested and committed. 7. Create a pull request (PR) against the Ryujinx/Ryujinx repository's **main** branch. - State in the description what issue or improvement your change is addressing. - - Check if all the Continuous Integration checks are passing. Refer to [Actions](https://github.com/GreemDev/Ryujinx/actions) to check for outstanding errors. + - Check if all the Continuous Integration checks are passing. Refer to [Actions](https://github.com/Ryubing/Ryujinx/actions) to check for outstanding errors. 8. Wait for feedback or approval of your changes from the core development team - Details about the pull request [review procedure](docs/workflow/pr-guide.md). 9. When the team members have signed off, and all checks are green, your PR will be merged. @@ -90,7 +90,7 @@ We use and recommend the following workflow: ### Good First Issues -The team marks the most straightforward issues as [good first issues](https://github.com/GreemDev/Ryujinx/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). This set of issues is the place to start if you are interested in contributing but new to the codebase. +The team marks the most straightforward issues as [good first issues](https://github.com/Ryubing/Ryujinx/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). This set of issues is the place to start if you are interested in contributing but new to the codebase. ### Commit Messages @@ -113,7 +113,7 @@ Also do your best to factor commits appropriately, not too large with unrelated ### PR - CI Process -The [Ryujinx continuous integration](https://github.com/GreemDev/Ryujinx/actions) (CI) system will automatically perform the required builds and run tests (including the ones you are expected to run) for PRs. Builds and test runs must be clean or have bugs properly filed against flaky/unexpected failures that are unrelated to your change. +The [Ryujinx continuous integration](https://github.com/Ryubing/Ryujinx/actions) (CI) system will automatically perform the required builds and run tests (including the ones you are expected to run) for PRs. Builds and test runs must be clean or have bugs properly filed against flaky/unexpected failures that are unrelated to your change. If the CI build fails for any reason, the PR actions tab should be consulted for further information on the failure. There are a few usual suspects for such a failure: * `dotnet format` has not been run on the PR and has outstanding stylistic issues. @@ -134,5 +134,5 @@ Ryujinx uses some implementations and frameworks from other projects. The follow - The license of the file is [permissive](https://en.wikipedia.org/wiki/Permissive_free_software_licence). - The license of the file is left in-tact. -- The contribution is correctly attributed in the [3rd party notices](https://github.com/GreemDev/Ryujinx/blob/master/distribution/legal/THIRDPARTY.md) file in the repository, as needed. +- The contribution is correctly attributed in the [3rd party notices](https://github.com/Ryubing/Ryujinx/blob/master/distribution/legal/THIRDPARTY.md) file in the repository, as needed. diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 000000000..d7a2ac1f2 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,6 @@ + + + net9.0 + latest + + diff --git a/Directory.Packages.props b/Directory.Packages.props index 7059af0e0..602295d15 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,26 +3,29 @@ true - - - - - - - + + + + + + + + + + - + + - - + @@ -35,21 +38,25 @@ - + + - + + + + - - - - - + + + + + - - + + diff --git a/README.md b/README.md index f6783b412..a9e04ccf6 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,27 @@ -

-
- Ryujinx -
- Ryujinx -
- (REE-YOU-JINX) -
- - - - - Latest Release - -
- - - - - Latest Canary Release - -

+ + + + + +
+ Ryujinx + + +# Ryujinx + +[![Latest release](https://img.shields.io/gitlab/v/release/ryubing%2Fryujinx?gitlab_url=https%3A%2F%2Fgit.ryujinx.app&label=stable&color=32cd32)](https://git.ryujinx.app/ryubing/ryujinx/-/releases) +[![Latest canary release](https://img.shields.io/gitlab/v/release/ryubing%2Fcanary?gitlab_url=https%3A%2F%2Fgit.ryujinx.app&label=canary&color=FF4500)](https://git.ryujinx.app/ryubing/canary/-/releases) +
+ +Discord + +

Ryujinx is an open-source Nintendo Switch emulator, originally created by gdkchan, written in C#. This emulator aims at providing excellent accuracy and performance, a user-friendly interface and consistent builds. It was written from scratch and development on the project began in September 2017. - Ryujinx is available on Github under the MIT license. + Ryujinx is available on a self-managed GitLab instance under the MIT license.

@@ -39,21 +31,11 @@
This is not a Ryujinx revival project. This is not a Phoenix project.
- Guides and documentation can be found on the Wiki tab. -

-

- If you would like a more preservative fork of Ryujinx, check out ryujinx-mirror. + Guides and documentation can be found on the Wiki tab.

- Click below to join the Discord: -
- - Discord - -
-
- + Ryujinx example

## Usage @@ -63,16 +45,17 @@ failing to meet this requirement may result in a poor gameplay experience or une ## Latest build -Stable builds are made every so often onto a separate "release" branch that then gets put into the releases you know and love. +Stable builds are made every so often, based on the `master` branch, that then gets put into the releases you know and love. These stable builds exist so that the end user can get a more **enjoyable and stable experience**. +They are released every month or so, to ensure consistent updates, while not being an annoying amount of individual updates to download over the course of that month. -You can find the latest stable release [here](https://github.com/GreemDev/Ryujinx/releases/latest). +You can find the stable releases [here](https://git.ryujinx.app/ryubing/ryujinx/-/releases). -Canary builds are compiled automatically for each commit on the master branch. +Canary builds are compiled automatically for each commit on the `master` branch. While we strive to ensure optimal stability and performance prior to pushing an update, these builds **may be unstable or completely broken**. These canary builds are only recommended for experienced users. -You can find the latest canary release [here](https://github.com/GreemDev/Ryujinx-Canary/releases/latest). +You can find the canary releases [here](https://git.ryujinx.app/ryubing/canary/-/releases). ## Documentation @@ -91,7 +74,7 @@ If you are planning to contribute or just want to learn more about this project It translates the ARM code to a custom IR, performs a few optimizations, and turns that into x86 code. There are three memory manager options available depending on the user's preference, leveraging both software-based (slower) and host-mapped modes (much faster). The fastest option (host, unchecked) is set by default. - Ryujinx also features an optional Profiled Persistent Translation Cache, which essentially caches translated functions so that they do not need to be translated every time the game loads. + Ryujinx also features an optional Profiled Persistent Translation Cache, which essentially caches translated functions so that they do not need to be translated every time the game loads. The net result is a significant reduction in load times (the amount of time between launching a game and arriving at the title screen) for nearly every game. NOTE: This feature is enabled by default in the Options menu > System tab. You must launch the game at least twice to the title screen or beyond before performance improvements are unlocked on the third launch! @@ -105,7 +88,7 @@ If you are planning to contribute or just want to learn more about this project - **Input** - We currently have support for keyboard, mouse, touch input, JoyCon input support, and nearly all controllers. + We currently have support for keyboard, mouse, touch input, Joy-Con input support, and nearly all controllers. Motion controls are natively supported in most cases; for dual-JoyCon motion support, DS4Windows or BetterJoy are currently required. In all scenarios, you can set up everything inside the input configuration menu. @@ -118,7 +101,7 @@ If you are planning to contribute or just want to learn more about this project - **Configuration** The emulator has settings for enabling or disabling some logging, remapping controllers, and more. - You can configure all of them through the graphical interface or manually through the config file, `Config.json`, found in the user folder which can be accessed by clicking `Open Ryujinx Folder` under the File menu in the GUI. + You can configure all of them through the graphical interface or manually through the config file, `Config.json`, found in the Ryujinx data folder which can be accessed by clicking `Open Ryujinx Folder` under the File menu in the GUI. ## License @@ -128,7 +111,7 @@ See [LICENSE.txt](LICENSE.txt) and [THIRDPARTY.md](distribution/legal/THIRDPARTY ## Credits -- [LibHac](https://github.com/Thealexbarney/LibHac) is used for our file-system. +- [LibHac](https://git.ryujinx.app/ryubing/libhac) is used for our file-system. - [AmiiboAPI](https://www.amiiboapi.com) is used in our Amiibo emulation. - [ldn_mitm](https://github.com/spacemeowx2/ldn_mitm) is used for one of our available multiplayer modes. -- [ShellLink](https://github.com/securifybv/ShellLink) is used for Windows shortcut generation. +- [ShellLink](https://github.com/securifybv/ShellLink) is used for Windows shortcut generation. \ No newline at end of file diff --git a/Ryujinx.sln b/Ryujinx.sln index d661b903c..4babf3fb9 100644 --- a/Ryujinx.sln +++ b/Ryujinx.sln @@ -57,14 +57,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.SDL2.Common", "src\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio.Backends.SDL2", "src\Ryujinx.Audio.Backends.SDL2\Ryujinx.Audio.Backends.SDL2.csproj", "{D99A395A-8569-4DB0-B336-900647890052}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Headless.SDL2", "src\Ryujinx.Headless.SDL2\Ryujinx.Headless.SDL2.csproj", "{390DC343-5CB4-4C79-A5DD-E3ED235E4C49}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec.FFmpeg", "src\Ryujinx.Graphics.Nvdec.FFmpeg\Ryujinx.Graphics.Nvdec.FFmpeg.csproj", "{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx", "src\Ryujinx\Ryujinx.csproj", "{7C1B2721-13DA-4B62-B046-C626605ECCE6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.UI.Common", "src\Ryujinx.UI.Common\Ryujinx.UI.Common.csproj", "{BA161CA0-CD65-4E6E-B644-51C8D1E542DC}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Generators", "src\Ryujinx.Horizon.Generators\Ryujinx.Horizon.Generators.csproj", "{6AE2A5E8-4C5A-48B9-997B-E1455C0355C6}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Vulkan", "src\Ryujinx.Graphics.Vulkan\Ryujinx.Graphics.Vulkan.csproj", "{D4D09B08-D580-4D69-B886-C35D2853F6C8}" @@ -81,13 +77,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Kernel.Gene EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.BuildValidationTasks", "src\Ryujinx.BuildValidationTasks\Ryujinx.BuildValidationTasks.csproj", "{4A89A234-4F19-497D-A576-DDE8CDFC5B22}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{36F870C1-3E5F-485F-B426-F0645AF78751}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig + .github\workflows\build.yml = .github\workflows\build.yml + .github\workflows\canary.yml = .github\workflows\canary.yml Directory.Packages.props = Directory.Packages.props - .github/workflows/release.yml = .github/workflows/release.yml - .github/workflows/canary.yml = .github/workflows/canary.yml - .github/workflows/build.yml = .github/workflows/build.yml + .github\workflows\release.yml = .github\workflows\release.yml + nuget.config = nuget.config EndProjectSection EndProject Global @@ -204,10 +203,6 @@ Global {D99A395A-8569-4DB0-B336-900647890052}.Debug|Any CPU.Build.0 = Debug|Any CPU {D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.ActiveCfg = Release|Any CPU {D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.Build.0 = Release|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.Build.0 = Debug|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.ActiveCfg = Release|Any CPU - {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.Build.0 = Release|Any CPU {BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.Build.0 = Debug|Any CPU {BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -252,6 +247,9 @@ Global {B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Debug|Any CPU.Build.0 = Debug|Any CPU {B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Release|Any CPU.ActiveCfg = Release|Any CPU {B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}.Release|Any CPU.Build.0 = Release|Any CPU + {4A89A234-4F19-497D-A576-DDE8CDFC5B22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A89A234-4F19-497D-A576-DDE8CDFC5B22}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A89A234-4F19-497D-A576-DDE8CDFC5B22}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/assets/amiibo/Amiibo.json b/assets/amiibo/Amiibo.json deleted file mode 100644 index 03c2c020e..000000000 --- a/assets/amiibo/Amiibo.json +++ /dev/null @@ -1,48348 +0,0 @@ -{ - "amiibo": [ - { - "amiiboSeries": "Animal Crossing", - "character": "Sandy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04380001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04380001-03000502.png", - "name": "Sandy", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03000502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Isabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01810101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01810101-00b40502.png", - "name": "Isabelle - Winter", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00b40502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Sonic", - "gameSeries": "Sonic", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "32000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_32000000-00300002.png", - "name": "Sonic", - "release": { - "au": "2015-01-29", - "eu": "2015-02-20", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "00300002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ava", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "029e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_029e0001-013d0502.png", - "name": "Ava", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "013d0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Blanca", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01b30001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01b30001-00b50502.png", - "name": "Blanca", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00b50502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Mac", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02f80001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02f80001-01380502.png", - "name": "Mac", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01380502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lucha", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "023c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_023c0001-00bd0502.png", - "name": "Lucha", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00bd0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Punchy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02630001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02630001-00750502.png", - "name": "Punchy", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00750502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Violet", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03700001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03700001-015d0502.png", - "name": "Violet", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "015d0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Mii", - "gameSeries": "Mii", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07c00000-00210002.png", - "name": "Mii Brawler", - "release": { - "au": "2015-09-26", - "eu": "2015-09-25", - "jp": "2015-09-10", - "na": "2015-11-01" - }, - "tail": "00210002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Wario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c50201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c50201-02830e02.png", - "name": "Wario - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02830e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tom", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "026c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_026c0001-00c30502.png", - "name": "Tom", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00c30502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Zelda", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Quickly travel between the surface and the sky", - "write": false - } - ], - "gameID": [ - "01002DA013484000" - ], - "gameName": "The Legend of Zelda: Skyward Sword HD" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Blue Attire", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01010300", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01010300-04140902.png", - "name": "Zelda & Loftwing", - "release": { - "au": "2021-07-16", - "eu": "2021-07-16", - "jp": "2021-07-16", - "na": "2021-07-16" - }, - "tail": "04140902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Mint", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04e60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04e60001-00820502.png", - "name": "Mint", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00820502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Caroline", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04e30001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04e30001-01650502.png", - "name": "Caroline", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01650502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Mabel", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01880001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01880001-01120502.png", - "name": "Mabel", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01120502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08000100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000100-04150402.png", - "name": "Inkling - Yellow", - "release": { - "au": "2022-11-11", - "eu": "2022-11-11", - "jp": "2022-11-11", - "na": "2022-11-11" - }, - "tail": "04150402", - "type": "Figure" - }, - { - "amiiboSeries": "Splatoon", - "character": "Shiver", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - } - ], - "head": "08070000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08070000-04330402.png", - "name": "Shiver", - "release": { - "au": "2023-11-17", - "eu": "2023-11-17", - "jp": "2023-11-17", - "na": "2023-11-17" - }, - "tail": "04330402", - "type": "Figure" - }, - { - "amiiboSeries": "Splatoon", - "character": "Frye", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - } - ], - "head": "08080000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08080000-04340402.png", - "name": "Frye", - "release": { - "au": "2023-11-17", - "eu": "2023-11-17", - "jp": "2023-11-17", - "na": "2023-11-17" - }, - "tail": "04340402", - "type": "Figure" - }, - { - "amiiboSeries": "Splatoon", - "character": "Big Man", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - } - ], - "head": "08090000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08090000-04350402.png", - "name": "Big Man", - "release": { - "au": "2023-11-17", - "eu": "2023-11-17", - "jp": "2023-11-17", - "na": "2023-11-17" - }, - "tail": "04350402", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Frett", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a1d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a1d0001-03d40502.png", - "name": "Frett", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03d40502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kidd", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "035d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_035d0001-00c90502.png", - "name": "Kidd", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00c90502", - "type": "Card" - }, - { - "amiiboSeries": "BoxBoy!", - "character": "Qbby", - "gameSeries": "BoxBoy!", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive star coins and a boost item", - "write": false - } - ], - "gameID": [ - "01004D300C5AE000" - ], - "gameName": "Kirby and the Forgotten Land" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive two Picture Pieces, a Maxim Tomato, and two Point Stars", - "write": false - } - ], - "gameID": [ - "01007E3006DDA000" - ], - "gameName": "Kirby Star Allies" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive more useful items", - "write": false - } - ], - "gameID": [ - "01006B601380E000" - ], - "gameName": "Kirby's Return to Dream Land Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive 20 Fragments", - "write": false - } - ], - "gameID": [ - "01003FB00C5A8000" - ], - "gameName": "Super Kirby Clash" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1f400000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1f400000-035e1002.png", - "name": "Qbby", - "release": { - "au": null, - "eu": null, - "jp": "2017-02-02", - "na": null - }, - "tail": "035e1002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Waluigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c60101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c60101-02870e02.png", - "name": "Waluigi - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02870e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Purrl", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02640001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02640001-01ac0502.png", - "name": "Purrl", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01ac0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Mitzi", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "025e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_025e0001-01250502.png", - "name": "Mitzi", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01250502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Reneigh", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a100001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a100001-03c70502.png", - "name": "Reneigh", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03c70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rasher", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "047a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_047a0001-00600502.png", - "name": "Rasher", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00600502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chrissy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04a10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04a10001-016f0502.png", - "name": "Chrissy", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "016f0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Metal Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09d00301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09d00301-02bb0e02.png", - "name": "Metal Mario - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02bb0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Harriet", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01910001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01910001-004e0502.png", - "name": "Harriet", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "004e0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Daisy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02f10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02f10001-01450502.png", - "name": "Daisy", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01450502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bam", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02d70001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02d70001-01300502.png", - "name": "Bam", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01300502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Anabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02030001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02030001-019a0502.png", - "name": "Anabelle", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "019a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Label", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01890001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01890001-00ab0502.png", - "name": "Labelle", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ab0502", - "type": "Card" - }, - { - "amiiboSeries": "Yu-Gi-Oh!", - "character": "Tatsuhisa \u201cLuke\u201d Kamij\u014d", - "gameSeries": "Yu-Gi-Oh!", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive items/bonuses", - "write": false - } - ], - "gameID": [ - "01003C101454A000" - ], - "gameName": "Yu-Gi-Oh! Rush Duel Saikyo Battle Royale" - } - ], - "head": "38410001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38410001-04251902.png", - "name": "Tatsuhisa \u201cLuke\u201d Kamij\u014d", - "release": { - "au": null, - "eu": null, - "jp": null, - "na": "2021-08-12" - }, - "tail": "04251902", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Smallfry", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - } - ], - "head": "08060100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08060100-041c0402.png", - "name": "Smallfry", - "release": { - "au": "2022-11-11", - "eu": "2022-11-11", - "jp": "2022-11-11", - "na": "2022-11-11" - }, - "tail": "041c0402", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08000100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000100-03820002.png", - "name": "Inkling", - "release": { - "au": "2018-12-07", - "eu": "2018-12-07", - "jp": "2018-12-07", - "na": "2018-12-07" - }, - "tail": "03820002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rover", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "018d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018d0001-010c0502.png", - "name": "Rover", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "010c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Wendell", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a70001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a70001-01140502.png", - "name": "Wendell", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01140502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ren\u00e9e", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04ba0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04ba0001-005d0502.png", - "name": "Ren\u00e9e", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "005d0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Agnes", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04890001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04890001-00ef0502.png", - "name": "Agnes", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ef0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Resetti", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "018e0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018e0101-01780502.png", - "name": "Resetti - Without Hat", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01780502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Daisy Mae", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a040001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a040001-03b50502.png", - "name": "Daisy Mae", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03b50502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Merry", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "026d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_026d0001-013f0502.png", - "name": "Merry", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "013f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Big Top", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03250001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03250001-010a0502.png", - "name": "Big Top", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "010a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Leif", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01b40001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01b40001-01130502.png", - "name": "Leif", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01130502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rocco", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03900001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03900001-01850502.png", - "name": "Rocco", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01850502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Donkey Kong", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c70501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c70501-02900e02.png", - "name": "Donkey Kong - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02900e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gladys", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04370001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04370001-01050502.png", - "name": "Gladys", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "01050502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Twiggy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02300001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02300001-01d20502.png", - "name": "Twiggy", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01d20502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Camofrog", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "033b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_033b0001-00fa0502.png", - "name": "Camofrog", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00fa0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lottie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01c10000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01c10000-02440502.png", - "name": "Lottie", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-22" - }, - "tail": "02440502", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "King K. Rool", - "gameSeries": "Donkey Kong", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00c00000-037b0002.png", - "name": "King K. Rool", - "release": { - "au": "2019-02-15", - "eu": "2019-02-15", - "jp": "2019-02-15", - "na": "2019-02-15" - }, - "tail": "037b0002", - "type": "Figure" - }, - { - "amiiboSeries": "Yu-Gi-Oh!", - "character": "Nail Saionji", - "gameSeries": "Yu-Gi-Oh!", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive items/bonuses", - "write": false - } - ], - "gameID": [ - "01003C101454A000" - ], - "gameName": "Yu-Gi-Oh! Rush Duel Saikyo Battle Royale" - } - ], - "head": "38450001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38450001-04291902.png", - "name": "Nail Saionji", - "release": { - "au": null, - "eu": null, - "jp": null, - "na": "2021-08-12" - }, - "tail": "04291902", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Sephiroth", - "gameSeries": "Final Fantasy", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "36010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_36010000-04210002.png", - "name": "Sephiroth", - "release": { - "au": "2023-01-13", - "eu": "2023-01-13", - "jp": "2023-01-13", - "na": "2023-01-13" - }, - "tail": "04210002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Deirdre", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02da0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02da0001-01330502.png", - "name": "Deirdre", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01330502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Flick", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a030001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a030001-03b40502.png", - "name": "Flick", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03b40502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Lucina", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21020000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21020000-00290002.png", - "name": "Lucina", - "release": { - "au": "2015-04-25", - "eu": "2015-04-24", - "jp": "2015-04-29", - "na": "2015-05-29" - }, - "tail": "00290002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Naomi", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02b80001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02b80001-019c0502.png", - "name": "Naomi", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "019c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Raddle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03470001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03470001-03020502.png", - "name": "Raddle", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03020502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tortimer", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01b00001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01b00001-00520502.png", - "name": "Tortimer", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00520502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Digby", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "018c0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018c0000-02430502.png", - "name": "Digby", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-13" - }, - "tail": "02430502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Puddles", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "033e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_033e0001-01a20502.png", - "name": "Puddles", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01a20502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Octoling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08050200", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08050200-038f0402.png", - "name": "Octoling Boy", - "release": { - "au": "2018-11-11", - "eu": "2018-11-09", - "jp": "2018-11-09", - "na": "2018-11-09" - }, - "tail": "038f0402", - "type": "Figure" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Guardian", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Black Cat Clothes", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01400000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01400000-03550902.png", - "name": "Guardian", - "release": { - "au": "2017-03-03", - "eu": "2017-03-03", - "jp": "2017-03-03", - "na": "2017-03-03" - }, - "tail": "03550902", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Squirtle", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "19070000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_19070000-03840002.png", - "name": "Squirtle", - "release": { - "au": "2019-09-20", - "eu": "2019-09-20", - "jp": "2019-09-20", - "na": "2019-09-20" - }, - "tail": "03840002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Nintendo World", - "character": "Peach", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a life-up heart", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00020003", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00020003-039dff02.png", - "name": "Peach - Power Up Band", - "release": { - "au": null, - "eu": null, - "jp": "2021-02-04", - "na": null - }, - "tail": "039dff02", - "type": "Band" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Jacob", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02380001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02380001-02f80502.png", - "name": "Jacob", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02f80502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Boo", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Chain Chomp weapon", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00170000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00170000-02680102.png", - "name": "Boo", - "release": { - "au": "2016-10-08", - "eu": "2016-10-07", - "jp": "2016-10-20", - "na": "2016-11-04" - }, - "tail": "02680102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pashmina", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "035e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_035e0001-018e0502.png", - "name": "Pashmina", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "018e0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Paolo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03280001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03280001-02eb0502.png", - "name": "Paolo", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02eb0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "June", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "028a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_028a0001-02e90502.png", - "name": "June", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02e90502", - "type": "Card" - }, - { - "amiiboSeries": "Others", - "character": "Mario Cereal", - "gameSeries": "Kellogs", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "See the location of a Power Moon (as \"delicious amiibo\")", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - } - ], - "head": "37400001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_37400001-03741402.png", - "name": "Super Mario Cereal", - "release": { - "au": null, - "eu": null, - "jp": null, - "na": "2017-12-11" - }, - "tail": "03741402", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Bring Epona into the game as a rideable horse", - "write": false - }, - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Bring Epona into the game as a rideable horse", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-00040002.png", - "name": "Link", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "00040002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Cloud Strife", - "gameSeries": "Final Fantasy", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "36000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_36000000-02590002.png", - "name": "Cloud", - "release": { - "au": "2017-07-22", - "eu": "2017-07-21", - "jp": "2017-07-21", - "na": "2017-07-21" - }, - "tail": "02590002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rudy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02710001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02710001-019b0502.png", - "name": "Rudy", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "019b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Flurry", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03840001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03840001-00860502.png", - "name": "Flurry", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00860502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tammy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "028e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_028e0001-019e0502.png", - "name": "Tammy", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "019e0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Teddy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02140001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02140001-00e40502.png", - "name": "Teddy", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00e40502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Frank", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04510001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04510001-015e0502.png", - "name": "Frank", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "015e0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Peach", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c20501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c20501-02770e02.png", - "name": "Peach - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02770e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Stu", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "024d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_024d0001-02f60502.png", - "name": "Stu", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02f60502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Roscoe", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03a80001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03a80001-00910502.png", - "name": "Roscoe", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00910502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Ike", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21010000-00180002.png", - "name": "Ike", - "release": { - "au": "2015-01-29", - "eu": "2015-01-23", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "00180002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Luigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c10401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c10401-02710e02.png", - "name": "Luigi - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02710e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rodney", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03810001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03810001-00d50502.png", - "name": "Rodney", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00d50502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Baby Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cc0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cc0101-02a50e02.png", - "name": "Baby Mario - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02a50e02", - "type": "Card" - }, - { - "amiiboSeries": "Power Pros", - "character": "Daijobu", - "gameSeries": "Power Pros", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive in-game items and power-ups / Save items to your card after playing with friends to bring them home", - "write": true - } - ], - "gameID": [ - "0100E9C00BF28000" - ], - "gameName": "Jikkyou Powerful Pro Baseball" - } - ], - "head": "38050001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38050001-03981702.png", - "name": "Daijobu", - "release": { - "au": null, - "eu": null, - "jp": "2019-06-27", - "na": null - }, - "tail": "03981702", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bruce", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02d90001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02d90001-01c80502.png", - "name": "Bruce", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01c80502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bree", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "040f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_040f0001-01500502.png", - "name": "Bree", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01500502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bangle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04fd0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04fd0001-007b0502.png", - "name": "Bangle", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "007b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Stitches", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02820001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02820001-01810502.png", - "name": "Stitches", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01810502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Aurora", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "045f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_045f0001-01a80502.png", - "name": "Aurora", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01a80502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Iggly", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "046a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_046a0001-01d00502.png", - "name": "Iggly", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01d00502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Vic", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02520001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02520001-00fe0502.png", - "name": "Vic", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00fe0502", - "type": "Card" - }, - { - "amiiboSeries": "Monster Hunter Rise", - "character": "Palico", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock special layered armor / Enter daily lottery for a variety of useful items", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hunter Sticker Set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - } - ], - "head": "35090100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35090100-042b1802.png", - "name": "Palico", - "release": { - "au": "2022-06-30", - "eu": "2022-06-30", - "jp": "2022-06-30", - "na": "2022-06-30" - }, - "tail": "042b1802", - "type": "Figure" - }, - { - "amiiboSeries": "Super Nintendo World", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - }, - { - "Usage": "Gain temporary invincibility", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00000003", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000003-0430ff02.png", - "name": "Golden - Power Up Band", - "release": { - "au": null, - "eu": null, - "jp": "2023-03-18", - "na": null - }, - "tail": "0430ff02", - "type": "Band" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Amelia", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "044c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_044c0001-008e0502.png", - "name": "Amelia", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "008e0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Miranda", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03130001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03130001-01210502.png", - "name": "Miranda", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01210502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Katrina", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a50001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a50001-01720502.png", - "name": "Katrina", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01720502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Audie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a0c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a0c0001-03c30502.png", - "name": "Audie", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03c30502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Diddy Kong", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c80501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c80501-02950e02.png", - "name": "Diddy Kong - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02950e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bill", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03070001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03070001-00640502.png", - "name": "Bill", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00640502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Anchovy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "022f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_022f0001-011e0502.png", - "name": "Anchovy", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "011e0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Harvey", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a050001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a050001-03b80502.png", - "name": "Harvey", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03b80502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-03530902.png", - "name": "Link - Archer", - "release": { - "au": "2017-03-03", - "eu": "2017-03-03", - "jp": "2017-03-03", - "na": "2017-03-03" - }, - "tail": "03530902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tommy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01860101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01860101-00af0502.png", - "name": "Tommy - Uniform", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00af0502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Octoling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08050100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08050100-038e0402.png", - "name": "Octoling Girl", - "release": { - "au": "2018-11-11", - "eu": "2018-11-09", - "jp": "2018-11-09", - "na": "2018-11-09" - }, - "tail": "038e0402", - "type": "Figure" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-034f0902.png", - "name": "8-Bit Link", - "release": { - "au": "2016-12-03", - "eu": "2016-12-02", - "jp": "2016-12-01", - "na": "2016-12-02" - }, - "tail": "034f0902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Maggie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04820001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04820001-02fd0502.png", - "name": "Maggie", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02fd0502", - "type": "Card" - }, - { - "amiiboSeries": "Mega Man", - "character": "Mega Man", - "gameSeries": "Megaman", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive E Tanks and other useful in-game items", - "write": false - } - ], - "gameID": [ - "0100B0C0086B0000" - ], - "gameName": "Mega Man 11" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock 11 exclusive challenge stages designed by fans", - "write": false - } - ], - "gameID": [ - "01002D4007AE0000" - ], - "gameName": "Mega Man Legacy Collection" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock new platforming challenges", - "write": false - } - ], - "gameID": [ - "0100842008EC4000" - ], - "gameName": "Mega Man Legacy Collection 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "0100643002136000" - ], - "gameName": "Resident Evil Revelations" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "010095300212A000" - ], - "gameName": "Resident Evil Revelations 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "34800000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_34800000-03791502.png", - "name": "Mega Man", - "release": { - "au": null, - "eu": null, - "jp": "2018-10-04", - "na": "2018-10-02" - }, - "tail": "03791502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Orville", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a000001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a000001-03ab0502.png", - "name": "Orville", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03ab0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chai", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - }, - { - "Usage": "Unlock special furniture items and a poster based on the card's Sanrio character", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "032e0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_032e0101-031c0502.png", - "name": "Chai", - "release": { - "au": null, - "eu": "2016-11-25", - "jp": "2016-11-03", - "na": null - }, - "tail": "031c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Dom", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a0b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a0b0001-03c20502.png", - "name": "Dom", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03c20502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kapp'n", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01960000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01960000-024e0502.png", - "name": "Kapp'n", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-03-24", - "na": "2016-03-18" - }, - "tail": "024e0502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Limberg", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "040d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_040d0001-00780502.png", - "name": "Limberg", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00780502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Weber", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03120001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03120001-03090502.png", - "name": "Weber", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03090502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bunnie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04940001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04940001-009a0502.png", - "name": "Bunnie", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "009a0502", - "type": "Card" - }, - { - "amiiboSeries": "Yoshi's Woolly World", - "character": "Poochy", - "gameSeries": "Yoshi's Woolly World", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00800102", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00800102-035d0302.png", - "name": "Poochy", - "release": { - "au": "2017-02-04", - "eu": "2017-02-03", - "jp": "2017-01-19", - "na": "2017-02-03" - }, - "tail": "035d0302", - "type": "Yarn" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Waluigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c60301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c60301-02890e02.png", - "name": "Waluigi - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02890e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pelly", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a00001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a00001-010f0502.png", - "name": "Pelly", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "010f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Frobert", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "033a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_033a0001-01cc0502.png", - "name": "Frobert", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01cc0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Birdo", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09ce0501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09ce0501-02b30e02.png", - "name": "Birdo - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02b30e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tasha", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04ea0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04ea0001-03180502.png", - "name": "Tasha", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03180502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Robin", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "022e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_022e0001-01d30502.png", - "name": "Robin", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01d30502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Alfonso", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02c30001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02c30001-00dc0502.png", - "name": "Alfonso", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00dc0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Peck", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "023e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_023e0001-00d10502.png", - "name": "Peck", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00d10502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Baby Luigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cd0201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cd0201-02ab0e02.png", - "name": "Baby Luigi - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02ab0e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Rosalina", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00040000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00040000-02620102.png", - "name": "Rosalina", - "release": { - "au": "2016-10-08", - "eu": "2016-10-07", - "jp": "2016-10-20", - "na": "2016-11-04" - }, - "tail": "02620102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cyrus", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "018b0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018b0000-02460502.png", - "name": "Cyrus", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-13" - }, - "tail": "02460502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Frita", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04d00001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04d00001-01960502.png", - "name": "Frita", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01960502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sprinkle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "046d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_046d0001-00f30502.png", - "name": "Sprinkle", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00f30502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bella", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "040e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_040e0001-00880502.png", - "name": "Bella", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00880502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Drago", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02cb0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02cb0001-01360502.png", - "name": "Drago", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01360502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Grams", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01990001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01990001-01160502.png", - "name": "Grams", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01160502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Corrin", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21050000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21050000-025a0002.png", - "name": "Corrin", - "release": { - "au": "2017-07-22", - "eu": "2017-07-21", - "jp": "2017-07-21", - "na": "2017-07-21" - }, - "tail": "025a0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "OHare", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04a30001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04a30001-01c90502.png", - "name": "OHare", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01c90502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Dark Pit", - "gameSeries": "Kid Icarus", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07410000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07410000-00200002.png", - "name": "Dark Pit", - "release": { - "au": "2015-07-04", - "eu": "2015-06-26", - "jp": "2015-06-11", - "na": "2015-07-31" - }, - "tail": "00200002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Rosalina", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00040100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00040100-00130002.png", - "name": "Rosalina & Luma", - "release": { - "au": "2015-01-29", - "eu": "2015-01-23", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "00130002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Redd", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a80001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a80001-004f0502.png", - "name": "Redd", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "004f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Mabel", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01880000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01880000-02410502.png", - "name": "Mabel", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-13" - }, - "tail": "02410502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Hamphrey", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03850001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03850001-01060502.png", - "name": "Hamphrey", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "01060502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pave", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01ab0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01ab0001-017c0502.png", - "name": "Pave", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "017c0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Wario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c50101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c50101-02820e02.png", - "name": "Wario - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02820e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Alli", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02c40001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02c40001-00670502.png", - "name": "Alli", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00670502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Yoshi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c40401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c40401-02800e02.png", - "name": "Yoshi - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02800e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bones", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02ee0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02ee0001-01990502.png", - "name": "Bones", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01990502", - "type": "Card" - }, - { - "amiiboSeries": "Metroid", - "character": "E.M.M.I.", - "gameSeries": "Metroid", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Metroid-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Permanently increase missile capacity by 10", - "write": false - } - ], - "gameID": [ - "010093801237C000" - ], - "gameName": "Metroid Dread" - }, - { - "amiiboUsage": [ - { - "Usage": "Replenish a random amount of missiles once per day", - "write": false - } - ], - "gameID": [ - "010093801237C000" - ], - "gameName": "Metroid Dread" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05c40000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05c40000-04131302.png", - "name": "E.M.M.I.", - "release": { - "au": "2021-10-08", - "eu": "2021-11-05", - "jp": "2021-10-08", - "na": "2021-10-08" - }, - "tail": "04131302", - "type": "Figure" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-03540902.png", - "name": "Link - Rider", - "release": { - "au": "2017-03-03", - "eu": "2017-03-03", - "jp": "2017-03-03", - "na": "2017-03-03" - }, - "tail": "03540902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gaston", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04980001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04980001-014a0502.png", - "name": "Gaston", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "014a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Quillson", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03180001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03180001-006c0502.png", - "name": "Quillson", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "006c0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Pink Gold Peach", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09d10101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09d10101-02be0e02.png", - "name": "Pink Gold Peach - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02be0e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Wii Fit Trainer", - "gameSeries": "Wii Fit", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07000000-00070002.png", - "name": "Wii Fit Trainer", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "00070002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Wario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00070000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00070000-001a0002.png", - "name": "Wario", - "release": { - "au": "2015-04-25", - "eu": "2015-04-24", - "jp": "2015-04-29", - "na": "2015-05-29" - }, - "tail": "001a0002", - "type": "Figure" - }, - { - "amiiboSeries": "Chibi-Robo!", - "character": "Chibi-Robo", - "gameSeries": "Chibi Robo", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "22c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_22c00000-003a0202.png", - "name": "Chibi Robo", - "release": { - "au": "2015-11-07", - "eu": "2015-11-06", - "jp": "2015-10-08", - "na": "2015-10-09" - }, - "tail": "003a0202", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Diddy Kong", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00090000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00090000-000d0002.png", - "name": "Diddy Kong", - "release": { - "au": "2014-12-12", - "eu": "2014-12-19", - "jp": "2014-12-06", - "na": "2014-12-14" - }, - "tail": "000d0002", - "type": "Figure" - }, - { - "amiiboSeries": "Monster Hunter", - "character": "Razewing Ratha", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock Monster Hunter Stories 2 sticker set", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume for Navirou", - "write": false - } - ], - "gameID": [ - "010069301B1D4000" - ], - "gameName": "Monster Hunter Stories" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific special layered armor set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - } - ], - "head": "35050000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35050000-040c0f02.png", - "name": "Razewing Ratha", - "release": { - "au": "2021-07-09", - "eu": "2021-07-09", - "jp": "2021-07-09", - "na": "2021-07-09" - }, - "tail": "040c0f02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Zipper", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01ac0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01ac0001-017f0502.png", - "name": "Zipper", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "017f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pierce", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "044d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_044d0001-01930502.png", - "name": "Pierce", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01930502", - "type": "Card" - }, - { - "amiiboSeries": "Power Pros", - "character": "Ikari", - "gameSeries": "Power Pros", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive in-game items and power-ups / Save items to your card after playing with friends to bring them home", - "write": true - } - ], - "gameID": [ - "0100E9C00BF28000" - ], - "gameName": "Jikkyou Powerful Pro Baseball" - } - ], - "head": "38010001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38010001-03941702.png", - "name": "Ikari", - "release": { - "au": null, - "eu": null, - "jp": "2019-06-27", - "na": null - }, - "tail": "03941702", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000100-03500902.png", - "name": "Toon Link - The Wind Waker", - "release": { - "au": "2016-12-03", - "eu": "2016-12-02", - "jp": "2016-12-01", - "na": "2016-12-02" - }, - "tail": "03500902", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Hero", - "gameSeries": "Dragon Quest", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "36400000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_36400000-03a20002.png", - "name": "Hero", - "release": { - "au": "2020-09-25", - "eu": "2020-09-25", - "jp": "2020-09-25", - "na": "2020-10-05" - }, - "tail": "03a20002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kapp'n", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01960001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01960001-00480502.png", - "name": "Kapp'n", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00480502", - "type": "Card" - }, - { - "amiiboSeries": "Super Nintendo World", - "character": "Luigi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00010003", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00010003-039cff02.png", - "name": "Luigi - Power Up Band", - "release": { - "au": null, - "eu": null, - "jp": "2021-02-04", - "na": null - }, - "tail": "039cff02", - "type": "Band" - }, - { - "amiiboSeries": "Splatoon", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08000100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000100-003e0402.png", - "name": "Inkling Girl", - "release": { - "au": "2015-05-30", - "eu": "2015-05-29", - "jp": "2015-05-28", - "na": "2015-05-29" - }, - "tail": "003e0402", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lobo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "050c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_050c0001-01c10502.png", - "name": "Lobo", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01c10502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Zelda", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Blue Attire", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01010000-03560902.png", - "name": "Zelda", - "release": { - "au": "2017-03-03", - "eu": "2017-03-03", - "jp": "2017-03-03", - "na": "2017-03-03" - }, - "tail": "03560902", - "type": "Figure" - }, - { - "amiiboSeries": "Monster Hunter", - "character": "Rathian", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock Monster Hunter Stories 2 sticker set", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based monstie egg", - "write": false - } - ], - "gameID": [ - "010069301B1D4000" - ], - "gameName": "Monster Hunter Stories" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hakum Rider Outfit layered armor set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "0100643002136000" - ], - "gameName": "Resident Evil Revelations" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "010095300212A000" - ], - "gameName": "Resident Evil Revelations 2" - } - ], - "head": "35020100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35020100-02e40f02.png", - "name": "Rathian and Cheval", - "release": { - "au": null, - "eu": null, - "jp": "2016-12-08", - "na": null - }, - "tail": "02e40f02", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Waluigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c60501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c60501-028b0e02.png", - "name": "Waluigi - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "028b0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Quinn", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a180001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a180001-03cf0502.png", - "name": "Quinn", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03cf0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Digby", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "018c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018c0001-004c0502.png", - "name": "Digby", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "004c0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-037c0002.png", - "name": "Young Link", - "release": { - "au": "2019-04-12", - "eu": "2019-04-12", - "jp": "2019-04-12", - "na": "2019-04-12" - }, - "tail": "037c0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Huck", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03430001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03430001-02ef0502.png", - "name": "Huck", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02ef0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Avery", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04500001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04500001-00cf0502.png", - "name": "Avery", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00cf0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Carrie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03d30001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03d30001-02f30502.png", - "name": "Carrie", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02f30502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kiki", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02610001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02610001-00650502.png", - "name": "Kiki", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00650502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Isabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01810000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01810000-024b0502.png", - "name": "Isabelle - Summer Outfit", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "024b0502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rooney", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03da0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03da0001-01510502.png", - "name": "Rooney", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01510502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Nate", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02190001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02190001-007e0502.png", - "name": "Nate", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "007e0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Metal Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09d00101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09d00101-02b90e02.png", - "name": "Metal Mario - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02b90e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pippy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "049a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_049a0001-014e0502.png", - "name": "Pippy", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "014e0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Yoshi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00030000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00030000-00020002.png", - "name": "Yoshi", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "00020002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Birdo", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09ce0301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09ce0301-02b10e02.png", - "name": "Birdo - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02b10e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Mythra", - "gameSeries": "Xenoblade Chronicles", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific weapon skin for characters using the Swordfighter Class", - "write": false - } - ], - "gameID": [ - "010074F013262000" - ], - "gameName": "Xenoblade Chronicles 3" - } - ], - "head": "22420000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_22420000-041f0002.png", - "name": "Mythra", - "release": { - "au": "2023-07-21", - "eu": "2023-07-21", - "jp": "2023-07-21", - "na": "2023-07-21" - }, - "tail": "041f0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rocket", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03720001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03720001-010b0502.png", - "name": "Rocket", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "010b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Peaches", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03ac0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03ac0001-01880502.png", - "name": "Peaches", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01880502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ken", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02a60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02a60001-01240502.png", - "name": "Ken", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01240502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - } - ], - "head": "08000200", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000200-003f0402.png", - "name": "Inkling Boy", - "release": { - "au": "2015-05-30", - "eu": "2015-05-29", - "jp": "2015-05-28", - "na": "2015-05-29" - }, - "tail": "003f0402", - "type": "Figure" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Luigi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00010000-00350102.png", - "name": "Luigi", - "release": { - "au": "2015-03-21", - "eu": "2015-03-20", - "jp": "2015-03-12", - "na": "2015-03-20" - }, - "tail": "00350102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chip", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "019a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_019a0001-00b70502.png", - "name": "Chip", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00b70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Claudia", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04ff0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04ff0001-01620502.png", - "name": "Claudia", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01620502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Greta", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "041c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_041c0001-01410502.png", - "name": "Greta", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01410502", - "type": "Card" - }, - { - "amiiboSeries": "Fire Emblem", - "character": "Celica", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21070000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21070000-03611202.png", - "name": "Celica", - "release": { - "au": "2017-05-20", - "eu": "2017-05-19", - "jp": "2017-04-20", - "na": "2017-05-19" - }, - "tail": "03611202", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Deena", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "030b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_030b0001-00790502.png", - "name": "Deena", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00790502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Ivysaur", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "19020000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_19020000-03830002.png", - "name": "Ivysaur", - "release": { - "au": "2019-09-20", - "eu": "2019-09-20", - "jp": "2019-09-20", - "na": "2019-09-20" - }, - "tail": "03830002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Filbert", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04df0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04df0001-00e80502.png", - "name": "Filbert", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00e80502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Velma", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "035c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_035c0001-01290502.png", - "name": "Velma", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01290502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Beardo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02210001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02210001-013c0502.png", - "name": "Beardo", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "013c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Azalea", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a1e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a1e0001-03d50502.png", - "name": "Azalea", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03d50502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Samus", - "gameSeries": "Metroid", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Metroid-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Restore a random amount of health once per day", - "write": false - } - ], - "gameID": [ - "010093801237C000" - ], - "gameName": "Metroid Dread" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05c00000-00060002.png", - "name": "Samus", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "00060002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Simon", - "gameSeries": "Castlevania", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "37c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_37c00000-038b0002.png", - "name": "Simon", - "release": { - "au": "2019-11-15", - "eu": "2019-11-15", - "jp": "2019-11-08", - "na": "2019-11-15" - }, - "tail": "038b0002", - "type": "Figure" - }, - { - "amiiboSeries": "Monster Hunter Rise", - "character": "Magnamalo", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock special layered armor / Enter daily lottery for a variety of useful items", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hunter Sticker Set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - } - ], - "head": "35080000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35080000-040f1802.png", - "name": "Magnamalo", - "release": { - "au": "2021-03-26", - "eu": "2021-03-26", - "jp": "2021-03-26", - "na": "2021-03-26" - }, - "tail": "040f1802", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Rosalina", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cf0301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cf0301-02b60e02.png", - "name": "Rosalina - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02b60e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Boo", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cb0401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cb0401-02a30e02.png", - "name": "Boo - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02a30e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Flip", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03ff0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03ff0001-00f40502.png", - "name": "Flip", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00f40502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Hazel", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04ef0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04ef0001-013b0502.png", - "name": "Hazel", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "013b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bubbles", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03920001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03920001-01270502.png", - "name": "Bubbles", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01270502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Elmer", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03a70001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03a70001-01a10502.png", - "name": "Elmer", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01a10502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Boots", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02c50001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02c50001-03080502.png", - "name": "Boots", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03080502", - "type": "Card" - }, - { - "amiiboSeries": "Skylanders", - "character": "Bowser", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Chain Chomp weapon", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - }, - { - "Usage": "Make Fury Bowser appear (in Bowser's Fury mode)", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "0005ff00", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0005ff00-023a0702.png", - "name": "Hammer Slam Bowser", - "release": { - "au": "2015-09-24", - "eu": "2015-09-25", - "jp": null, - "na": "2015-09-20" - }, - "tail": "023a0702", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bea", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02f40001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02f40001-03050502.png", - "name": "Bea", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03050502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Boone", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "036b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_036b0001-018b0502.png", - "name": "Boone", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "018b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Wardell", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a080001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a080001-03bd0502.png", - "name": "Wardell", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03bd0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Petri", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a160001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a160001-03cd0502.png", - "name": "Petri", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03cd0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ace", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a1b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a1b0001-03d20502.png", - "name": "Ace", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03d20502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Mii", - "gameSeries": "Mii", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07c00100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07c00100-00220002.png", - "name": "Mii Swordfighter", - "release": { - "au": "2015-09-26", - "eu": "2015-09-25", - "jp": "2015-09-10", - "na": "2015-11-01" - }, - "tail": "00220002", - "type": "Figure" - }, - { - "amiiboSeries": "Yu-Gi-Oh!", - "character": "Gakuto S\u014dgetsu", - "gameSeries": "Yu-Gi-Oh!", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive items/bonuses", - "write": false - } - ], - "gameID": [ - "01003C101454A000" - ], - "gameName": "Yu-Gi-Oh! Rush Duel Saikyo Battle Royale" - } - ], - "head": "38420001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38420001-04261902.png", - "name": "Gakuto S\u014dgetsu", - "release": { - "au": null, - "eu": null, - "jp": null, - "na": "2021-08-12" - }, - "tail": "04261902", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Terry", - "gameSeries": "Fatal Fury", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "3c800000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_3c800000-03a40002.png", - "name": "Terry", - "release": { - "au": "2021-03-26", - "eu": "2021-03-26", - "jp": "2021-03-26", - "na": "2021-03-26" - }, - "tail": "03a40002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Daisy", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c30501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c30501-027c0e02.png", - "name": "Daisy - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "027c0e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Snake", - "gameSeries": "Metal Gear Solid", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "37800000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_37800000-038a0002.png", - "name": "Snake", - "release": { - "au": "2019-09-20", - "eu": "2019-09-20", - "jp": "2019-09-20", - "na": "2019-09-20" - }, - "tail": "038a0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Franklin", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01ae0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01ae0001-011b0502.png", - "name": "Franklin", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "011b0502", - "type": "Card" - }, - { - "amiiboSeries": "Pokemon", - "character": "Detective Pikachu", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1d010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1d010000-03750d02.png", - "name": "Detective Pikachu", - "release": { - "au": "2018-03-24", - "eu": "2018-03-23", - "jp": "2018-03-23", - "na": "2018-03-23" - }, - "tail": "03750d02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Hopper", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04620001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04620001-00f60502.png", - "name": "Hopper", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00f60502", - "type": "Card" - }, - { - "amiiboSeries": "Monster Hunter Rise", - "character": "Palamute", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock special layered armor / Enter daily lottery for a variety of useful items", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hunter Sticker Set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - } - ], - "head": "350a0100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_350a0100-042c1802.png", - "name": "Palamute", - "release": { - "au": "2022-06-30", - "eu": "2022-06-30", - "jp": "2022-06-30", - "na": "2022-06-30" - }, - "tail": "042c1802", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Colton", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03af0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03af0001-012c0502.png", - "name": "Colton", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "012c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Phoebe", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04400001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04400001-00ca0502.png", - "name": "Phoebe", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ca0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ursala", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "021c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_021c0001-02f70502.png", - "name": "Ursala", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02f70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gayle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02ca0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02ca0001-01ca0502.png", - "name": "Gayle", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01ca0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Daisy", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00130000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00130000-037a0002.png", - "name": "Daisy", - "release": { - "au": "2019-04-12", - "eu": "2019-04-12", - "jp": "2019-04-12", - "na": "2019-04-12" - }, - "tail": "037a0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lucy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "047c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_047c0001-01a00502.png", - "name": "Lucy", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01a00502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sylvana", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04eb0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04eb0001-02f00502.png", - "name": "Sylvana", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02f00502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Billy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03580001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03580001-02fa0502.png", - "name": "Billy", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02fa0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tutu", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "021b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_021b0001-00800502.png", - "name": "Tutu", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00800502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Niko", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a070001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a070001-03bc0502.png", - "name": "Niko", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03bc0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Grizzly", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "021d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_021d0001-01cd0502.png", - "name": "Grizzly", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01cd0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Isabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01810001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01810001-00440502.png", - "name": "Isabelle", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00440502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Hopkins", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04a20001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04a20001-02e80502.png", - "name": "Hopkins", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02e80502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Scoot", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03110001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03110001-00d60502.png", - "name": "Scoot", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00d60502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sydney", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03bf0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03bf0001-01bc0502.png", - "name": "Sydney", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01bc0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Candi", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04140001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04140001-030a0502.png", - "name": "Candi", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "030a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "\u00c9toile", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - }, - { - "Usage": "Unlock special furniture items and a poster based on the card's Sanrio character", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04d30101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04d30101-031b0502.png", - "name": "\u00c9toile", - "release": { - "au": null, - "eu": "2016-11-25", - "jp": "2016-11-03", - "na": null - }, - "tail": "031b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Axel", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03290001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03290001-009d0502.png", - "name": "Axel", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "009d0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rowan", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04fb0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04fb0001-01c60502.png", - "name": "Rowan", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01c60502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rosie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "025f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_025f0001-01d70502.png", - "name": "Rosie - Amiibo Festival", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-13" - }, - "tail": "01d70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kicks", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01940000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01940000-024a0502.png", - "name": "Kicks", - "release": { - "au": "2016-01-30", - "eu": "2016-01-29", - "jp": "2015-12-17", - "na": "2016-01-22" - }, - "tail": "024a0502", - "type": "Figure" - }, - { - "amiiboSeries": "Monster Hunter", - "character": "One-Eyed Rathalos", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock Monster Hunter Stories 2 sticker set", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based monstie egg", - "write": false - } - ], - "gameID": [ - "010069301B1D4000" - ], - "gameName": "Monster Hunter Stories" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hakum Rider Outfit layered armor set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "0100643002136000" - ], - "gameName": "Resident Evil Revelations" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "010095300212A000" - ], - "gameName": "Resident Evil Revelations 2" - } - ], - "head": "35000200", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35000200-02e20f02.png", - "name": "One-Eyed Rathalos and Rider - Female", - "release": { - "au": null, - "eu": null, - "jp": "2016-10-08", - "na": null - }, - "tail": "02e20f02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Copper", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "019d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_019d0001-00ac0502.png", - "name": "Copper", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ac0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Admiral", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - } - ], - "head": "02330001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02330001-03060502.png", - "name": "Admiral", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03060502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cranston", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "043c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_043c0001-01cb0502.png", - "name": "Cranston", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01cb0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Wolf", - "gameSeries": "Star Fox", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05840000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05840000-037e0002.png", - "name": "Wolf", - "release": { - "au": "2018-12-07", - "eu": "2018-12-07", - "jp": "2018-12-07", - "na": "2018-12-07" - }, - "tail": "037e0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Apple", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "037f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_037f0001-01aa0502.png", - "name": "Apple", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01aa0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Resetti", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "018e0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018e0000-02490502.png", - "name": "Resetti", - "release": { - "au": "2016-01-30", - "eu": "2016-01-29", - "jp": "2015-12-17", - "na": "2016-01-22" - }, - "tail": "02490502", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Daisy", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c30101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c30101-02780e02.png", - "name": "Daisy - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02780e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Pikachu", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "19190000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_19190000-00090002.png", - "name": "Pikachu", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "00090002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Monty", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03fd0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03fd0001-01580502.png", - "name": "Monty", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01580502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Snooty", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02060001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02060001-03120502.png", - "name": "Snooty", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03120502", - "type": "Card" - }, - { - "amiiboSeries": "Yoshi's Woolly World", - "character": "Yoshi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00030102", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00030102-023e0302.png", - "name": "Mega Yarn Yoshi", - "release": { - "au": "2015-11-28", - "eu": "2015-11-27", - "jp": "2015-12-10", - "na": "2015-11-15" - }, - "tail": "023e0302", - "type": "Yarn" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Plucky", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02a30001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02a30001-02ff0502.png", - "name": "Plucky", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02ff0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Genji", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "049c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_049c0001-01400502.png", - "name": "Genji", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01400502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Timmy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01850001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01850001-004b0502.png", - "name": "Timmy", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "004b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ketchup", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03140001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03140001-02f40502.png", - "name": "Ketchup", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02f40502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Midna", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Bring Wolf Link into the game as a partner character", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01030000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01030000-024f0902.png", - "name": "Midna & Wolf Link", - "release": { - "au": "2016-03-05", - "eu": "2016-03-04", - "jp": "2016-03-10", - "na": "2016-03-04" - }, - "tail": "024f0902", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Luigi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00010000-000c0002.png", - "name": "Luigi", - "release": { - "au": "2014-12-12", - "eu": "2014-12-19", - "jp": "2014-12-06", - "na": "2014-12-14" - }, - "tail": "000c0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Label", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01890101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01890101-03b10502.png", - "name": "Label", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03b10502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Steve", - "gameSeries": "Minecraft", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "3dc00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_3dc00000-04220002.png", - "name": "Steve", - "release": { - "au": "2022-09-09", - "eu": "2022-09-09", - "jp": "2022-09-09", - "na": "2022-09-09" - }, - "tail": "04220002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Timmy & Tommy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - }, - { - "Usage": "Unlock Timmy & Tommy's shop early", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01840000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01840000-024d0502.png", - "name": "Timmy & Tommy", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-03-24", - "na": "2016-03-18" - }, - "tail": "024d0502", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Marth", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21000000-000b0002.png", - "name": "Marth", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "000b0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Porter", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01950001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01950001-00b00502.png", - "name": "Porter", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00b00502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Yoshi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00030000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00030000-00370102.png", - "name": "Yoshi", - "release": { - "au": "2015-03-21", - "eu": "2015-03-20", - "jp": "2015-03-12", - "na": "2015-03-20" - }, - "tail": "00370102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Derwin", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "030f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_030f0001-016d0502.png", - "name": "Derwin", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "016d0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "R.O.B.", - "gameSeries": "Classic Nintendo", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07810000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07810000-002e0002.png", - "name": "R.O.B. - Famicom", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2015-10-29", - "na": "2016-03-18" - }, - "tail": "002e0002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Cloud Strife", - "gameSeries": "Final Fantasy", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "36000100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_36000100-03620002.png", - "name": "Cloud - Player 2", - "release": { - "au": "2017-07-22", - "eu": "2017-07-21", - "jp": "2017-07-21", - "na": "2017-07-21" - }, - "tail": "03620002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Olaf", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02090001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02090001-019f0502.png", - "name": "Olaf", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "019f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rhonda", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04b30001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04b30001-00dd0502.png", - "name": "Rhonda", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00dd0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Waluigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c60401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c60401-028a0e02.png", - "name": "Waluigi - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "028a0e02", - "type": "Card" - }, - { - "amiiboSeries": "Fire Emblem", - "character": "Chrom", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon", - "write": false - }, - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21080000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21080000-036f1202.png", - "name": "Chrom", - "release": { - "au": "2017-10-20", - "eu": "2017-10-20", - "jp": "2017-09-28", - "na": "2017-10-20" - }, - "tail": "036f1202", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Birdo", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09ce0401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09ce0401-02b20e02.png", - "name": "Birdo - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02b20e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Wario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c50401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c50401-02850e02.png", - "name": "Wario - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02850e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cesar", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03690001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03690001-00d30502.png", - "name": "Cesar", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00d30502", - "type": "Card" - }, - { - "amiiboSeries": "Others", - "character": "Solaire of Astora", - "gameSeries": "Dark Souls", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock and perform the \u201cPraise the Sun\u201d gesture", - "write": false - } - ], - "gameID": [ - "01004AB00A260000" - ], - "gameName": "Dark Souls: Remastered" - } - ], - "head": "33800000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_33800000-03781402.png", - "name": "Solaire of Astora", - "release": { - "au": "2018-10-19", - "eu": "2018-10-19", - "jp": "2018-10-18", - "na": "2018-10-19" - }, - "tail": "03781402", - "type": "Figure" - }, - { - "amiiboSeries": "Yu-Gi-Oh!", - "character": "Roa Kirishima", - "gameSeries": "Yu-Gi-Oh!", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive items/bonuses", - "write": false - } - ], - "gameID": [ - "01003C101454A000" - ], - "gameName": "Yu-Gi-Oh! Rush Duel Saikyo Battle Royale" - } - ], - "head": "38440001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38440001-04281902.png", - "name": "Roa Kirishima", - "release": { - "au": null, - "eu": null, - "jp": null, - "na": "2021-08-12" - }, - "tail": "04281902", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pinky", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02150001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02150001-01820502.png", - "name": "Pinky", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01820502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Olive", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02860001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02860001-03130502.png", - "name": "Olive", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03130502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Ice Climbers", - "gameSeries": "Classic Nintendo", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "078f0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_078f0000-03810002.png", - "name": "Ice Climbers", - "release": { - "au": "2019-02-15", - "eu": "2019-02-15", - "jp": "2019-02-15", - "na": "2019-02-15" - }, - "tail": "03810002", - "type": "Figure" - }, - { - "amiiboSeries": "Yu-Gi-Oh!", - "character": "Asana Mutsuba", - "gameSeries": "Yu-Gi-Oh!", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive items/bonuses", - "write": false - } - ], - "gameID": [ - "01003C101454A000" - ], - "gameName": "Yu-Gi-Oh! Rush Duel Saikyo Battle Royale" - } - ], - "head": "38460001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38460001-042a1902.png", - "name": "Asana Mutsuba", - "release": { - "au": null, - "eu": null, - "jp": null, - "na": "2021-08-12" - }, - "tail": "042a1902", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tom Nook", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01830101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01830101-010e0502.png", - "name": "Tom Nook - Jacket", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "010e0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Anicotti", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04160001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04160001-00fb0502.png", - "name": "Anicotti", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00fb0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c00101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c00101-02690e02.png", - "name": "Mario - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02690e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Croque", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03490001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03490001-018d0502.png", - "name": "Croque", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "018d0502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Daruk", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Black Cat Clothes", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01050000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01050000-03580902.png", - "name": "Daruk", - "release": { - "au": "2017-11-10", - "eu": "2017-11-10", - "jp": "2017-11-10", - "na": "2017-11-10" - }, - "tail": "03580902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chops", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04860001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04860001-00fc0502.png", - "name": "Chops", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00fc0502", - "type": "Card" - }, - { - "amiiboSeries": "Shovel Knight", - "character": "Shovel Knight", - "gameSeries": "Shovel Knight", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock boss fight against Shovel Knight", - "write": false - } - ], - "gameID": [ - "0100192003FA4000" - ], - "gameName": "Azure Striker Gunvolt: Striker Pack" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a fairy companion and player color palette matching the character", - "write": false - } - ], - "gameID": [ - "01008D100DE46000" - ], - "gameName": "Cyber Shadow" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific Shovel Knight remix immediately", - "write": false - } - ], - "gameID": [ - "0100830008426000" - ], - "gameName": "Just Shapes & Beats" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock Custom Knight, and save customizations to the amiibo (Shovel of Hope only)", - "write": true - }, - { - "Usage": "Unlock character-specific challenge stages, a character-based fairy companion, and costumes for the character", - "write": false - } - ], - "gameID": [ - "010057D0021E8000" - ], - "gameName": "Shovel Knight" - }, - { - "amiiboUsage": [ - { - "Usage": "Summon a fairy friend", - "write": false - } - ], - "gameID": [ - "0100B62017E68000" - ], - "gameName": "Shovel Knight Dig" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume for the character", - "write": false - } - ], - "gameID": [ - "0100B380022AE000" - ], - "gameName": "Shovel Knight Showdown" - } - ], - "head": "35c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35c00000-03920a02.png", - "name": "Shovel Knight - Gold Edition", - "release": { - "au": null, - "eu": "2019-12-10", - "jp": null, - "na": "2019-12-10" - }, - "tail": "03920a02", - "type": "Figure" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Bowser", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Chain Chomp weapon", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock Super Mario Odyssey-themed levels early", - "write": false - } - ], - "gameID": [ - "01009BF0072D4000" - ], - "gameName": "Captain Toad: Treasure Tracker" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - }, - { - "Usage": "Make Fury Bowser appear (in Bowser's Fury mode)", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Reveal regional coin locations", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00050000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00050000-03730102.png", - "name": "Bowser - Wedding", - "release": { - "au": "2017-10-27", - "eu": "2017-10-27", - "jp": "2017-10-27", - "na": "2017-10-27" - }, - "tail": "03730102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "K.K. Slider", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01820101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01820101-00460502.png", - "name": "DJ KK", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00460502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Saharah", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a60001-03b70502.png", - "name": "Saharah", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03b70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Jitters", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02310001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02310001-006a0502.png", - "name": "Jitters", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "006a0502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Mipha", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Black Cat Clothes", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01070000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01070000-035a0902.png", - "name": "Mipha", - "release": { - "au": "2017-11-10", - "eu": "2017-11-10", - "jp": "2017-11-10", - "na": "2017-11-10" - }, - "tail": "035a0902", - "type": "Figure" - }, - { - "amiiboSeries": "Monster Hunter", - "character": "Tsukino", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock Monster Hunter Stories 2 sticker set", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume for Navirou", - "write": false - } - ], - "gameID": [ - "010069301B1D4000" - ], - "gameName": "Monster Hunter Stories" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific special layered armor set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - } - ], - "head": "35070000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35070000-040e0f02.png", - "name": "Tsukino", - "release": { - "au": "2021-07-09", - "eu": "2021-07-09", - "jp": "2021-07-09", - "na": "2021-07-09" - }, - "tail": "040e0f02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Coach", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02510001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02510001-00c10502.png", - "name": "Coach", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00c10502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Erik", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02df0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02df0001-01910502.png", - "name": "Erik", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01910502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tammi", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03fc0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03fc0001-01470502.png", - "name": "Tammi", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01470502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gigi", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03480001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03480001-006b0502.png", - "name": "Gigi", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "006b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Biskit", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02ed0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02ed0001-015a0502.png", - "name": "Biskit", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "015a0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Ken", - "gameSeries": "Street fighter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "34c10000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_34c10000-03890002.png", - "name": "Ken", - "release": { - "au": "2019-04-12", - "eu": "2019-04-12", - "jp": "2019-04-12", - "na": "2019-04-12" - }, - "tail": "03890002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sable", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01870001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01870001-00470502.png", - "name": "Sable", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00470502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Brewster", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01900001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01900001-01710502.png", - "name": "Brewster", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01710502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lyman", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03c50001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03c50001-015c0502.png", - "name": "Lyman", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "015c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cyrano", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02000001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02000001-00a10502.png", - "name": "Cyrano", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00a10502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Broccolo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04180001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04180001-00d80502.png", - "name": "Broccolo", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00d80502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Winnie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03a90001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03a90001-00710502.png", - "name": "Winnie", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00710502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Midge", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02350001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02350001-00840502.png", - "name": "Midge", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00840502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cally", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04e80001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04e80001-01ce0502.png", - "name": "Cally", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01ce0502", - "type": "Card" - }, - { - "amiiboSeries": "Monster Hunter", - "character": "Qurupeco", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock Monster Hunter Stories 2 sticker set", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based monstie egg", - "write": false - } - ], - "gameID": [ - "010069301B1D4000" - ], - "gameName": "Monster Hunter Stories" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hakum Rider Outfit layered armor set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "0100643002136000" - ], - "gameName": "Resident Evil Revelations" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "010095300212A000" - ], - "gameName": "Resident Evil Revelations 2" - } - ], - "head": "35040100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35040100-02e60f02.png", - "name": "Qurupeco and Dan", - "release": { - "au": null, - "eu": null, - "jp": "2016-12-08", - "na": null - }, - "tail": "02e60f02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Vladimir", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02830001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02830001-00c70502.png", - "name": "Vladimir", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00c70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Leopold", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03ea0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03ea0001-030b0502.png", - "name": "Leopold", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "030b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Maelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "030a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_030a0001-01c70502.png", - "name": "Maelle", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01c70502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Callie", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08010000-025d0402.png", - "name": "Callie", - "release": { - "au": "2016-07-09", - "eu": "2016-07-08", - "jp": "2016-07-07", - "na": "2016-07-08" - }, - "tail": "025d0402", - "type": "Figure" - }, - { - "amiiboSeries": "Splatoon", - "character": "Callie", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - } - ], - "head": "08010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08010000-04360402.png", - "name": "Callie - Alterna", - "release": { - "au": "2024-09-05", - "eu": "2024-09-05", - "jp": "2024-09-05", - "na": "2024-09-05" - }, - "tail": "04360402", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Toby", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - }, - { - "Usage": "Unlock special furniture items and a poster based on the card's Sanrio character", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04a80101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04a80101-031e0502.png", - "name": "Toby", - "release": { - "au": null, - "eu": "2016-11-25", - "jp": "2016-11-03", - "na": null - }, - "tail": "031e0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Coco", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04960001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04960001-00d90502.png", - "name": "Coco", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00d90502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sprocket", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04390001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04390001-03110502.png", - "name": "Sprocket", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03110502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Jack", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01ad0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01ad0001-00b80502.png", - "name": "Jack", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00b80502", - "type": "Card" - }, - { - "amiiboSeries": "Power Pros", - "character": "Pawapuro", - "gameSeries": "Power Pros", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive in-game items and power-ups / Save items to your card after playing with friends to bring them home", - "write": true - } - ], - "gameID": [ - "0100E9C00BF28000" - ], - "gameName": "Jikkyou Powerful Pro Baseball" - } - ], - "head": "38000001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38000001-03931702.png", - "name": "Pawapuro", - "release": { - "au": null, - "eu": null, - "jp": "2019-06-27", - "na": null - }, - "tail": "03931702", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Banjo", - "gameSeries": "Banjo Kazooie", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "3b400000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_3b400000-03a30002.png", - "name": "Banjo & Kazooie", - "release": { - "au": "2021-03-26", - "eu": "2021-03-26", - "jp": "2021-03-26", - "na": "2021-03-26" - }, - "tail": "03a30002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sylvia", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03d70001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03d70001-01b40502.png", - "name": "Sylvia", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01b40502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Whitney", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "050e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_050e0001-00d70502.png", - "name": "Whitney", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00d70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Redd", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a80101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a80101-017e0502.png", - "name": "Redd - Shirt", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "017e0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Min Min", - "gameSeries": "ARMS", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "0a400000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a400000-041d0002.png", - "name": "Min Min", - "release": { - "au": "2022-04-29", - "eu": "2022-04-29", - "jp": "2022-04-29", - "na": "2022-04-29" - }, - "tail": "041d0002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Peach", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c20101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c20101-02730e02.png", - "name": "Peach - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02730e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sherb", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a090001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a090001-03c00502.png", - "name": "Sherb", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03c00502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Stinky", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "026a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_026a0001-01460502.png", - "name": "Stinky", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01460502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Francine", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04a00001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04a00001-016e0502.png", - "name": "Francine", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "016e0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Roald", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04600001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04600001-00a50502.png", - "name": "Roald", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00a50502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Boo", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cb0501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cb0501-02a40e02.png", - "name": "Boo - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02a40e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Monique", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02680001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02680001-007d0502.png", - "name": "Monique", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "007d0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tybalt", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04fc0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04fc0001-02ee0502.png", - "name": "Tybalt", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02ee0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Melba", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03be0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03be0001-01980502.png", - "name": "Melba", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01980502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Luigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c10101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c10101-026e0e02.png", - "name": "Luigi - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "026e0e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Chrom", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon", - "write": false - }, - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21080000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21080000-03880002.png", - "name": "Chrom", - "release": { - "au": "2019-11-15", - "eu": "2019-11-15", - "jp": "2019-11-08", - "na": "2019-11-15" - }, - "tail": "03880002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Meta Knight", - "gameSeries": "Kirby", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive star coins and a boost item", - "write": false - } - ], - "gameID": [ - "01004D300C5AE000" - ], - "gameName": "Kirby and the Forgotten Land" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive two Picture Pieces, a Maxim Tomato, and two Point Stars", - "write": false - } - ], - "gameID": [ - "01007E3006DDA000" - ], - "gameName": "Kirby Star Allies" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive more useful items", - "write": false - } - ], - "gameID": [ - "01006B601380E000" - ], - "gameName": "Kirby's Return to Dream Land Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Kirby-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive 10 Fragments", - "write": false - } - ], - "gameID": [ - "01003FB00C5A8000" - ], - "gameName": "Super Kirby Clash" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1f010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1f010000-00270002.png", - "name": "Meta Knight", - "release": { - "au": "2015-01-29", - "eu": "2015-02-20", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "00270002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Nibbles", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04e10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04e10001-01be0502.png", - "name": "Nibbles", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01be0502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Marie", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08020000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08020000-025e0402.png", - "name": "Marie", - "release": { - "au": "2016-07-09", - "eu": "2016-07-08", - "jp": "2016-07-07", - "na": "2016-07-08" - }, - "tail": "025e0402", - "type": "Figure" - }, - { - "amiiboSeries": "Splatoon", - "character": "Marie", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - } - ], - "head": "08020000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08020000-04370402.png", - "name": "Marie - Alterna", - "release": { - "au": "2024-09-05", - "eu": "2024-09-05", - "jp": "2024-09-05", - "na": "2024-09-05" - }, - "tail": "04370402", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Marty", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - }, - { - "Usage": "Unlock special furniture items and a poster based on the card's Sanrio character", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "028f0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_028f0101-031a0502.png", - "name": "Marty", - "release": { - "au": null, - "eu": "2016-11-25", - "jp": "2016-11-03", - "na": null - }, - "tail": "031a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Spork/Crackle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "047d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_047d0001-012e0502.png", - "name": "Spork/Crackle", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "012e0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Boo", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cb0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cb0101-02a00e02.png", - "name": "Boo - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02a00e02", - "type": "Card" - }, - { - "amiiboSeries": "Shovel Knight", - "character": "King Knight", - "gameSeries": "Shovel Knight", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a fairy companion and player color palette matching the character", - "write": false - } - ], - "gameID": [ - "01008D100DE46000" - ], - "gameName": "Cyber Shadow" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific Shovel Knight remix immediately", - "write": false - } - ], - "gameID": [ - "0100830008426000" - ], - "gameName": "Just Shapes & Beats" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock character-specific challenge stages, a character-based fairy companion, and costumes for the character", - "write": false - } - ], - "gameID": [ - "010057D0021E8000" - ], - "gameName": "Shovel Knight" - }, - { - "amiiboUsage": [ - { - "Usage": "Summon a fairy friend", - "write": false - } - ], - "gameID": [ - "0100B62017E68000" - ], - "gameName": "Shovel Knight Dig" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume for the character", - "write": false - } - ], - "gameID": [ - "0100B380022AE000" - ], - "gameName": "Shovel Knight Showdown" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "35c30000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35c30000-036e0a02.png", - "name": "King Knight", - "release": { - "au": null, - "eu": "2019-12-10", - "jp": null, - "na": "2019-12-10" - }, - "tail": "036e0a02", - "type": "Figure" - }, - { - "amiiboSeries": "Splatoon", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08000300", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000300-00400402.png", - "name": "Inkling Squid", - "release": { - "au": "2015-05-30", - "eu": "2015-05-29", - "jp": "2015-05-28", - "na": "2015-05-29" - }, - "tail": "00400402", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Henry", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "034b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_034b0001-009f0502.png", - "name": "Henry", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "009f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Blathers", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01920000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01920000-02470502.png", - "name": "Blathers", - "release": { - "au": "2016-01-30", - "eu": "2016-01-29", - "jp": "2015-12-17", - "na": "2016-01-22" - }, - "tail": "02470502", - "type": "Figure" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Revali", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Black Cat Clothes", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01080000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01080000-035b0902.png", - "name": "Revali", - "release": { - "au": "2017-11-10", - "eu": "2017-11-10", - "jp": "2017-11-10", - "na": "2017-11-10" - }, - "tail": "035b0902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Timbra", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04cf0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04cf0001-00e10502.png", - "name": "Timbra", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00e10502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ed", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03aa0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03aa0001-00e60502.png", - "name": "Ed", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00e60502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sable", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01870001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01870001-03b00502.png", - "name": "Sable", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03b00502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Keaton", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04530001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04530001-01040502.png", - "name": "Keaton", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "01040502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Hugh", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "047b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_047b0001-00f50502.png", - "name": "Hugh", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00f50502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Wart Jr.", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "033d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_033d0001-013a0502.png", - "name": "Wart Jr.", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "013a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kicks", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01940001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01940001-00aa0502.png", - "name": "Kicks", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00aa0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Shrunk", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01b10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01b10001-00b20502.png", - "name": "Shrunk", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00b20502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Eugene", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03c60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03c60001-00930502.png", - "name": "Eugene", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00930502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pecan", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04e00001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04e00001-00f70502.png", - "name": "Pecan", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00f70502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Lucario", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1ac00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1ac00000-00110002.png", - "name": "Lucario", - "release": { - "au": "2015-01-29", - "eu": "2015-01-23", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "00110002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sparro", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "023f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_023f0001-01660502.png", - "name": "Sparro", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01660502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Zelda", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Blue Attire", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01010000-03520902.png", - "name": "Toon Zelda - The Wind Waker", - "release": { - "au": "2016-12-03", - "eu": "2016-12-02", - "jp": "2016-12-01", - "na": "2016-12-02" - }, - "tail": "03520902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Isabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01810301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01810301-01700502.png", - "name": "Isabelle - Dress", - "release": { - "au": "2016-06-18", - "eu": "2016-06-17", - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01700502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kabuki", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02660001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02660001-00680502.png", - "name": "Kabuki", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00680502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Eloise", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03260001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03260001-01390502.png", - "name": "Eloise", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01390502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gala", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04850001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04850001-014c0502.png", - "name": "Gala", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "014c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tex", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "046b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_046b0001-01970502.png", - "name": "Tex", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01970502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Reese", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "018a0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018a0000-02450502.png", - "name": "Reese", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-13" - }, - "tail": "02450502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bianca", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "05000001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05000001-00e70502.png", - "name": "Bianca", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00e70502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - }, - { - "Usage": "Gain temporary invincibility", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000000-00340102.png", - "name": "Mario", - "release": { - "au": "2015-03-21", - "eu": "2015-03-20", - "jp": "2015-03-12", - "na": "2015-03-20" - }, - "tail": "00340102", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Mii", - "gameSeries": "Mii", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07c00200", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07c00200-00230002.png", - "name": "Mii Gunner", - "release": { - "au": "2015-09-26", - "eu": "2015-09-25", - "jp": "2015-09-10", - "na": "2015-11-01" - }, - "tail": "00230002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Peach", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock Super Mario Odyssey-themed levels early", - "write": false - } - ], - "gameID": [ - "01009BF0072D4000" - ], - "gameName": "Captain Toad: Treasure Tracker" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a life-up heart", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00020000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00020000-03720102.png", - "name": "Peach - Wedding", - "release": { - "au": "2017-10-27", - "eu": "2017-10-27", - "jp": "2017-10-27", - "na": "2017-10-27" - }, - "tail": "03720102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cephalobot", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a170001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a170001-03ce0502.png", - "name": "Cephalobot", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03ce0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gwen", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04640001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04640001-00c00502.png", - "name": "Gwen", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00c00502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Donkey Kong", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c70101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c70101-028c0e02.png", - "name": "Donkey Kong - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "028c0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kevin", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04870001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04870001-01bf0502.png", - "name": "Kevin", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01bf0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Blaire", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04de0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04de0001-00ce0502.png", - "name": "Blaire", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ce0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Wolfgang", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "050d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_050d0001-01420502.png", - "name": "Wolfgang", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01420502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Yoshi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c40301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c40301-027f0e02.png", - "name": "Yoshi - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "027f0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Resetti", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "018e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018e0001-00490502.png", - "name": "Resetti", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00490502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Peggy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04830001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04830001-01b00502.png", - "name": "Peggy", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01b00502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Bring Epona into the game as a rideable horse", - "write": false - }, - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Bring Epona into the game as a rideable horse", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-034d0902.png", - "name": "Link - Twilight Princess", - "release": { - "au": "2017-06-24", - "eu": "2017-06-23", - "jp": "2017-06-23", - "na": "2017-06-23" - }, - "tail": "034d0902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Boyd", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "036e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_036e0001-02fb0502.png", - "name": "Boyd", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02fb0502", - "type": "Card" - }, - { - "amiiboSeries": "Monster Hunter", - "character": "One-Eyed Rathalos", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock Monster Hunter Stories 2 sticker set", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based monstie egg", - "write": false - } - ], - "gameID": [ - "010069301B1D4000" - ], - "gameName": "Monster Hunter Stories" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hakum Rider Outfit layered armor set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "0100643002136000" - ], - "gameName": "Resident Evil Revelations" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "010095300212A000" - ], - "gameName": "Resident Evil Revelations 2" - } - ], - "head": "35000100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35000100-02e10f02.png", - "name": "One-Eyed Rathalos and Rider - Male", - "release": { - "au": null, - "eu": null, - "jp": "2016-10-08", - "na": null - }, - "tail": "02e10f02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gabi", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04990001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04990001-00df0502.png", - "name": "Gabi", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00df0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "T-Bone", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "024f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_024f0001-00810502.png", - "name": "T-Bone", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00810502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Wario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c50301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c50301-02840e02.png", - "name": "Wario - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02840e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Fox", - "gameSeries": "Star Fox", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a Star Fox costume", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05800000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05800000-00050002.png", - "name": "Fox", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "00050002", - "type": "Figure" - }, - { - "amiiboSeries": "Splatoon", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08000300", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000300-02610402.png", - "name": "Inkling Squid - Orange", - "release": { - "au": "2016-07-09", - "eu": "2016-07-08", - "jp": "2016-07-07", - "na": "2016-07-08" - }, - "tail": "02610402", - "type": "Figure" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Ganon", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Black Cat Clothes", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01020100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01020100-041a0902.png", - "name": "Ganondorf - Tears of the Kingdom", - "release": { - "au": "2023-11-03", - "eu": "2023-11-03", - "jp": "2023-11-03", - "na": "2023-11-03" - }, - "tail": "041a0902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Boris", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04810001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04810001-02f10502.png", - "name": "Boris", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02f10502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Antonio", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02010001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02010001-016a0502.png", - "name": "Antonio", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "016a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Murphy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02840001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02840001-02fe0502.png", - "name": "Murphy", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02fe0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Wade", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04680001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04680001-02f20502.png", - "name": "Wade", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02f20502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Stitches", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02820001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02820001-01d60502.png", - "name": "Stitches - Amiibo Festival", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-13" - }, - "tail": "01d60502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pascal", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a40001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a40001-004d0502.png", - "name": "Pascal", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "004d0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Wisp", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a060001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a060001-03ba0502.png", - "name": "Wisp", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03ba0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Fuchsia", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02dc0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02dc0001-00be0502.png", - "name": "Fuchsia", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00be0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Jigglypuff", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "19270000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_19270000-00260002.png", - "name": "Jigglypuff", - "release": { - "au": "2015-05-30", - "eu": "2015-05-29", - "jp": "2015-04-29", - "na": "2015-05-29" - }, - "tail": "00260002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tucker", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "032c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_032c0001-01480502.png", - "name": "Tucker", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01480502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-034b0902.png", - "name": "Link - Ocarina of Time", - "release": { - "au": "2016-12-03", - "eu": "2016-12-02", - "jp": "2016-12-01", - "na": "2016-12-02" - }, - "tail": "034b0902", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Boo", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cb0201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cb0201-02a10e02.png", - "name": "Boo - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02a10e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Peach", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c20401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c20401-02760e02.png", - "name": "Peach - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02760e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Elvis", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03e70001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03e70001-012a0502.png", - "name": "Elvis", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "012a0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Pichu", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "19ac0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_19ac0000-03850002.png", - "name": "Pichu", - "release": { - "au": "2019-07-19", - "eu": "2019-07-19", - "jp": "2019-07-19", - "na": "2019-07-19" - }, - "tail": "03850002", - "type": "Figure" - }, - { - "amiiboSeries": "Splatoon", - "character": "Pearl", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08030000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08030000-03760402.png", - "name": "Pearl", - "release": { - "au": "2018-07-13", - "eu": "2018-07-13", - "jp": "2018-07-13", - "na": "2018-07-13" - }, - "tail": "03760402", - "type": "Figure" - }, - { - "amiiboSeries": "Splatoon", - "character": "Pearl", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - } - ], - "head": "08030000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08030000-04380402.png", - "name": "Pearl - Side Order", - "release": { - "au": "2024-09-05", - "eu": "2024-09-05", - "jp": "2024-09-05", - "na": "2024-09-05" - }, - "tail": "04380402", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Shino", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a140001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a140001-03cb0502.png", - "name": "Shino", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03cb0502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-034c0902.png", - "name": "Link - Majora's Mask", - "release": { - "au": "2017-06-24", - "eu": "2017-06-23", - "jp": "2017-06-23", - "na": "2017-06-23" - }, - "tail": "034c0902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lottie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01c10101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01c10101-017a0502.png", - "name": "Lottie - Black Skirt And Bow", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "017a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Vivian", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "05130001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05130001-02e70502.png", - "name": "Vivian", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02e70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bettina", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "041b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_041b0001-00f10502.png", - "name": "Bettina", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00f10502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Alex", - "gameSeries": "Minecraft", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "3dc10000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_3dc10000-04230002.png", - "name": "Alex", - "release": { - "au": "2022-09-09", - "eu": "2022-09-09", - "jp": "2022-09-09", - "na": "2022-09-09" - }, - "tail": "04230002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lyle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01aa0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01aa0001-00530502.png", - "name": "Lyle", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00530502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Walker", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02f00001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02f00001-00a70502.png", - "name": "Walker", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00a70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ozzie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03c10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03c10001-00bb0502.png", - "name": "Ozzie", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00bb0502", - "type": "Card" - }, - { - "amiiboSeries": "Skylanders", - "character": "Donkey Kong", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "0008ff00", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0008ff00-023b0702.png", - "name": "Turbo Charge Donkey Kong", - "release": { - "au": "2015-09-24", - "eu": "2015-09-25", - "jp": null, - "na": "2015-09-20" - }, - "tail": "023b0702", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sterling", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04520001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04520001-00730502.png", - "name": "Sterling", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00730502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Isabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01810001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01810001-01d40502.png", - "name": "Isabelle - Character Parfait", - "release": { - "au": null, - "eu": null, - "jp": "2015-08-01", - "na": null - }, - "tail": "01d40502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Claude", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "049f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_049f0001-03010502.png", - "name": "Claude", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03010502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Goldie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02ea0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02ea0001-01d50502.png", - "name": "Goldie - Amiibo Festival", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-13" - }, - "tail": "01d50502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Fauna", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02d60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02d60001-00560502.png", - "name": "Fauna", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00560502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ankha", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02700001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02700001-00ff0502.png", - "name": "Ankha", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ff0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gulliver", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a20001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a20001-03b90502.png", - "name": "Gulliver", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03b90502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kid Cat", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02670001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02670001-01080502.png", - "name": "Kid Cat", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "01080502", - "type": "Card" - }, - { - "amiiboSeries": "Yu-Gi-Oh!", - "character": "Romin Kirishima", - "gameSeries": "Yu-Gi-Oh!", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive items/bonuses", - "write": false - } - ], - "gameID": [ - "01003C101454A000" - ], - "gameName": "Yu-Gi-Oh! Rush Duel Saikyo Battle Royale" - } - ], - "head": "38430001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38430001-04271902.png", - "name": "Romin Kirishima", - "release": { - "au": null, - "eu": null, - "jp": null, - "na": "2021-08-12" - }, - "tail": "04271902", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Katt", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02720001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02720001-01860502.png", - "name": "Katt", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01860502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Piranha Plant", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00240000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00240000-038d0002.png", - "name": "Piranha Plant", - "release": { - "au": "2019-02-15", - "eu": "2019-02-15", - "jp": "2019-02-15", - "na": "2019-02-15" - }, - "tail": "038d0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rex", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03e80001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03e80001-02f50502.png", - "name": "Rex", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02f50502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Beau", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02dd0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02dd0001-00ea0502.png", - "name": "Beau", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ea0502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Bokoblin", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Black Cat Clothes", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01410000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01410000-035c0902.png", - "name": "Bokoblin", - "release": { - "au": "2017-03-03", - "eu": "2017-03-03", - "jp": "2017-03-03", - "na": "2017-03-03" - }, - "tail": "035c0902", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Rosalina", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cf0201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cf0201-02b50e02.png", - "name": "Rosalina - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02b50e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Mewtwo", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "19960000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_19960000-023d0002.png", - "name": "Mewtwo", - "release": { - "au": "2015-10-24", - "eu": "2015-10-23", - "jp": "2015-10-29", - "na": "2015-11-13" - }, - "tail": "023d0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bertha", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03930001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03930001-00a00502.png", - "name": "Bertha", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00a00502", - "type": "Card" - }, - { - "amiiboSeries": "Pokemon", - "character": "Shadow Mewtwo", - "gameSeries": "Pokemon", - "gamesSwitch": [], - "head": "1d000001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1d000001-025c0d02.png", - "name": "Shadow Mewtwo", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-03-18", - "na": "2016-03-18" - }, - "tail": "025c0d02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Puck", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04650001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04650001-006e0502.png", - "name": "Puck", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "006e0502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Urbosa", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Black Cat Clothes", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01060000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01060000-03590902.png", - "name": "Urbosa", - "release": { - "au": "2017-11-10", - "eu": "2017-11-10", - "jp": "2017-11-10", - "na": "2017-11-10" - }, - "tail": "03590902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rosie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "025f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_025f0001-01c50502.png", - "name": "Rosie", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01c50502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Byleth", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "210b0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_210b0000-03a50002.png", - "name": "Byleth", - "release": { - "au": "2021-03-26", - "eu": "2021-03-26", - "jp": "2021-03-26", - "na": "2021-03-26" - }, - "tail": "03a50002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Spike", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04b40001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04b40001-030c0502.png", - "name": "Spike", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "030c0502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Shadow Link Plus Effect for Chamber Dungeons", - "write": false - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-03990902.png", - "name": "Link - Link's Awakening", - "release": { - "au": "2019-09-20", - "eu": "2019-09-20", - "jp": "2019-09-20", - "na": "2019-09-20" - }, - "tail": "03990902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Moose", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "041a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_041a0001-00e00502.png", - "name": "Moose", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00e00502", - "type": "Card" - }, - { - "amiiboSeries": "8-bit Mario", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - }, - { - "Usage": "Gain temporary invincibility", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000000-02390602.png", - "name": "8-Bit Mario Modern Color", - "release": { - "au": "2015-10-24", - "eu": "2015-10-23", - "jp": "2015-09-10", - "na": "2015-09-11" - }, - "tail": "02390602", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cobb", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04800001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04800001-008d0502.png", - "name": "Cobb", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "008d0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Diddy Kong", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c80101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c80101-02910e02.png", - "name": "Diddy Kong - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02910e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Portia", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02ef0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02ef0001-00580502.png", - "name": "Portia", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00580502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Benedict", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "029a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_029a0001-00ee0502.png", - "name": "Benedict", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ee0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pudge", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02800001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02800001-00830502.png", - "name": "Pudge", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00830502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Jay", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "022d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_022d0001-00f20502.png", - "name": "Jay", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00f20502", - "type": "Card" - }, - { - "amiiboSeries": "Shovel Knight", - "character": "Shovel Knight", - "gameSeries": "Shovel Knight", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock boss fight against Shovel Knight", - "write": false - } - ], - "gameID": [ - "0100192003FA4000" - ], - "gameName": "Azure Striker Gunvolt: Striker Pack" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a fairy companion and player color palette matching the character", - "write": false - } - ], - "gameID": [ - "01008D100DE46000" - ], - "gameName": "Cyber Shadow" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific Shovel Knight remix immediately", - "write": false - } - ], - "gameID": [ - "0100830008426000" - ], - "gameName": "Just Shapes & Beats" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock Custom Knight, and save customizations to the amiibo (Shovel of Hope only)", - "write": true - }, - { - "Usage": "Unlock character-specific challenge stages, a character-based fairy companion, and costumes for the character", - "write": false - } - ], - "gameID": [ - "010057D0021E8000" - ], - "gameName": "Shovel Knight" - }, - { - "amiiboUsage": [ - { - "Usage": "Summon a fairy friend", - "write": false - } - ], - "gameID": [ - "0100B62017E68000" - ], - "gameName": "Shovel Knight Dig" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume for the character", - "write": false - } - ], - "gameID": [ - "0100B380022AE000" - ], - "gameName": "Shovel Knight Showdown" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "35c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35c00000-02500a02.png", - "name": "Shovel Knight", - "release": { - "au": "2015-12-11", - "eu": "2016-01-08", - "jp": "2016-06-30", - "na": "2016-01-08" - }, - "tail": "02500a02", - "type": "Figure" - }, - { - "amiiboSeries": "Diablo", - "character": "Loot Goblin", - "gameSeries": "Diablo", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Summon a portal to Golden Greed's Domain", - "write": false - } - ], - "gameID": [ - "01001B300B9BE000" - ], - "gameName": "Diablo III: Eternal Collection" - } - ], - "head": "38c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38c00000-03911602.png", - "name": "Loot Goblin", - "release": { - "au": null, - "eu": null, - "jp": null, - "na": "2018-12-21" - }, - "tail": "03911602", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tabby", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02690001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02690001-011f0502.png", - "name": "Tabby", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "011f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kody", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02810001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02810001-01200502.png", - "name": "Kody", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01200502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Bowser Jr.", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09ca0501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09ca0501-029f0e02.png", - "name": "Bowser Jr. - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "029f0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Apollo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "044b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_044b0001-016c0502.png", - "name": "Apollo", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "016c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Timmy & Tommy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01840501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01840501-03a90502.png", - "name": "Timmy & Tommy", - "release": { - "au": "2021-10-05", - "eu": "2021-10-05", - "jp": "2021-10-05", - "na": "2021-10-05" - }, - "tail": "03a90502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Maple", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "027e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_027e0001-01690502.png", - "name": "Maple", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01690502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - }, - { - "Usage": "Gain temporary invincibility", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00000100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000100-00190002.png", - "name": "Dr. Mario", - "release": { - "au": "2015-07-23", - "eu": "2015-07-17", - "jp": "2015-07-17", - "na": "2015-09-11" - }, - "tail": "00190002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Baby Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cc0501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cc0501-02a90e02.png", - "name": "Baby Mario - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02a90e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Baby Luigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cd0301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cd0301-02ac0e02.png", - "name": "Baby Luigi - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02ac0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Annalisa", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02080001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02080001-00960502.png", - "name": "Annalisa", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00960502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tia", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "032d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_032d0001-00bc0502.png", - "name": "Tia", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00bc0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Yuka", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03bc0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03bc0001-008a0502.png", - "name": "Yuka", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "008a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tom Nook", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01830000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01830000-02420502.png", - "name": "Tom Nook", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-13" - }, - "tail": "02420502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pate", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03090001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03090001-00c60502.png", - "name": "Pate", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00c60502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Kirby", - "gameSeries": "Kirby", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive star coins and a boost item", - "write": false - } - ], - "gameID": [ - "01004D300C5AE000" - ], - "gameName": "Kirby and the Forgotten Land" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive two Picture Pieces, a Maxim Tomato, and two Point Stars", - "write": false - } - ], - "gameID": [ - "01007E3006DDA000" - ], - "gameName": "Kirby Star Allies" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive more useful items", - "write": false - } - ], - "gameID": [ - "01006B601380E000" - ], - "gameName": "Kirby's Return to Dream Land Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Kirby-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive 10 Fragments", - "write": false - } - ], - "gameID": [ - "01003FB00C5A8000" - ], - "gameName": "Super Kirby Clash" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1f000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1f000000-000a0002.png", - "name": "Kirby", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "000a0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Carmen", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04a40001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04a40001-00d40502.png", - "name": "Carmen", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00d40502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Phineas", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "019c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_019c0001-01730502.png", - "name": "Phineas", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01730502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lily", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03380001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03380001-011d0502.png", - "name": "Lily", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "011d0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bob", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "025d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_025d0001-00550502.png", - "name": "Bob", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00550502", - "type": "Card" - }, - { - "amiiboSeries": "Monster Hunter", - "character": "Nabiru", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock Monster Hunter Stories 2 sticker set", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based monstie egg", - "write": false - } - ], - "gameID": [ - "010069301B1D4000" - ], - "gameName": "Monster Hunter Stories" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hakum Rider Outfit layered armor set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "0100643002136000" - ], - "gameName": "Resident Evil Revelations" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "010095300212A000" - ], - "gameName": "Resident Evil Revelations 2" - } - ], - "head": "35010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35010000-02e30f02.png", - "name": "Nabiru", - "release": { - "au": null, - "eu": null, - "jp": "2016-10-08", - "na": null - }, - "tail": "02e30f02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cyrus", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "018b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018b0001-01150502.png", - "name": "Cyrus", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01150502", - "type": "Card" - }, - { - "amiiboSeries": "Monster Hunter Rise", - "character": "Palamute", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock special layered armor / Enter daily lottery for a variety of useful items", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hunter Sticker Set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - } - ], - "head": "350a0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_350a0000-04111802.png", - "name": "Palamute", - "release": { - "au": "2021-03-26", - "eu": "2021-03-26", - "jp": "2021-03-26", - "na": "2021-03-26" - }, - "tail": "04111802", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Isabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01810401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01810401-03aa0502.png", - "name": "Isabelle", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03aa0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Kazuya", - "gameSeries": "Tekken", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "33c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_33c00000-04200002.png", - "name": "Kazuya", - "release": { - "au": "2023-01-13", - "eu": "2023-01-13", - "jp": "2023-01-13", - "na": "2023-01-13" - }, - "tail": "04200002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Falco", - "gameSeries": "Star Fox", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a Star Fox costume", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05810000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05810000-001c0002.png", - "name": "Falco", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-05", - "na": "2015-11-20" - }, - "tail": "001c0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Savannah", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03a60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03a60001-00c80502.png", - "name": "Savannah", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00c80502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Lucas", - "gameSeries": "Earthbound", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "22810000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_22810000-02510002.png", - "name": "Lucas", - "release": { - "au": "2016-01-30", - "eu": "2016-01-29", - "jp": "2015-12-17", - "na": "2016-01-30" - }, - "tail": "02510002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Phil", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "043d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_043d0001-007c0502.png", - "name": "Phil", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "007c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pete", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "019f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_019f0001-01110502.png", - "name": "Pete", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01110502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Graham", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03800001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03800001-01870502.png", - "name": "Graham", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01870502", - "type": "Card" - }, - { - "amiiboSeries": "Monster Hunter", - "character": "Barioth", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock Monster Hunter Stories 2 sticker set", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based monstie egg", - "write": false - } - ], - "gameID": [ - "010069301B1D4000" - ], - "gameName": "Monster Hunter Stories" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hakum Rider Outfit layered armor set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "0100643002136000" - ], - "gameName": "Resident Evil Revelations" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "010095300212A000" - ], - "gameName": "Resident Evil Revelations 2" - } - ], - "head": "35030100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35030100-02e50f02.png", - "name": "Barioth and Ayuria", - "release": { - "au": null, - "eu": null, - "jp": "2016-12-08", - "na": null - }, - "tail": "02e50f02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Freckles", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "030e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_030e0001-012f0502.png", - "name": "Freckles", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "012f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Roswell", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a1f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a1f0001-03d60502.png", - "name": "Roswell", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03d60502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Bowser", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Chain Chomp weapon", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - }, - { - "Usage": "Make Fury Bowser appear (in Bowser's Fury mode)", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Reveal regional coin locations", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00050000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00050000-00140002.png", - "name": "Bowser", - "release": { - "au": "2015-01-29", - "eu": "2015-01-23", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "00140002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Benjamin", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02fa0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02fa0001-00970502.png", - "name": "Benjamin", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00970502", - "type": "Card" - }, - { - "amiiboSeries": "Metroid", - "character": "Samus", - "gameSeries": "Metroid", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Metroid-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Permanently increase health by 100", - "write": false - } - ], - "gameID": [ - "010093801237C000" - ], - "gameName": "Metroid Dread" - }, - { - "amiiboUsage": [ - { - "Usage": "Restore a random amount of health once per day", - "write": false - } - ], - "gameID": [ - "010093801237C000" - ], - "gameName": "Metroid Dread" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05c00000-04121302.png", - "name": "Samus - Metroid Dread", - "release": { - "au": "2021-10-08", - "eu": "2021-11-05", - "jp": "2021-10-08", - "na": "2021-10-08" - }, - "tail": "04121302", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lopez", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02db0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02db0001-005e0502.png", - "name": "Lopez", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "005e0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Willow", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04cc0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04cc0001-00a40502.png", - "name": "Willow", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00a40502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Jambette", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03450001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03450001-005f0502.png", - "name": "Jambette", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "005f0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Charizard", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "19060000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_19060000-00240002.png", - "name": "Charizard", - "release": { - "au": "2015-04-25", - "eu": "2015-04-24", - "jp": "2015-04-29", - "na": "2015-05-29" - }, - "tail": "00240002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Mira", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04a70001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04a70001-01a60502.png", - "name": "Mira", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01a60502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00000300", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000300-03a60102.png", - "name": "Mario - Cat", - "release": { - "au": "2021-02-12", - "eu": "2021-02-12", - "jp": "2021-02-12", - "na": "2021-02-12" - }, - "tail": "03a60102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Shrunk", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01b10101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01b10101-017b0502.png", - "name": "Shrunk - Loud Jacket", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "017b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Raymond", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a0f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a0f0001-03c60502.png", - "name": "Raymond", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03c60502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ione", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a120001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a120001-03c90502.png", - "name": "Ione", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03c90502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Molly", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03170001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03170001-00a60502.png", - "name": "Molly", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00a60502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gracie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a90001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a90001-01760502.png", - "name": "Gracie", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01760502", - "type": "Card" - }, - { - "amiiboSeries": "Fire Emblem", - "character": "Tiki", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon", - "write": false - }, - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21090000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21090000-03701202.png", - "name": "Tiki", - "release": { - "au": "2017-10-20", - "eu": "2017-10-20", - "jp": "2017-09-28", - "na": "2017-10-20" - }, - "tail": "03701202", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Hans", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03730001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03730001-01340502.png", - "name": "Hans", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01340502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Nat", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "019b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_019b0001-00b60502.png", - "name": "Nat", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00b60502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tommy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01860301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01860301-01750502.png", - "name": "Tommy - Suit", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01750502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Mega Man", - "gameSeries": "Megaman", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive E Tanks and other useful in-game items", - "write": false - } - ], - "gameID": [ - "0100B0C0086B0000" - ], - "gameName": "Mega Man 11" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock 11 exclusive challenge stages designed by fans", - "write": false - } - ], - "gameID": [ - "01002D4007AE0000" - ], - "gameName": "Mega Man Legacy Collection" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock new platforming challenges", - "write": false - } - ], - "gameID": [ - "0100842008EC4000" - ], - "gameName": "Mega Man Legacy Collection 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "0100643002136000" - ], - "gameName": "Resident Evil Revelations" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "010095300212A000" - ], - "gameName": "Resident Evil Revelations 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "34800000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_34800000-02580002.png", - "name": "Mega Man - Gold Edition", - "release": { - "au": null, - "eu": null, - "jp": null, - "na": "2016-02-23" - }, - "tail": "02580002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Timmy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01850201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01850201-01170502.png", - "name": "Timmy - Full Apron", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01170502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Zelda", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Blue Attire", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01010000-04190902.png", - "name": "Zelda - Tears of the Kingdom", - "release": { - "au": "2023-11-03", - "eu": "2023-11-03", - "jp": "2023-11-03", - "na": "2023-11-03" - }, - "tail": "04190902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Felicity", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "026e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_026e0001-00ba0502.png", - "name": "Felicity", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ba0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gulliver", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a20001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a20001-017d0502.png", - "name": "Gulliver", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "017d0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Waluigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c60201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c60201-02880e02.png", - "name": "Waluigi - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02880e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Blathers", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01920001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01920001-010d0502.png", - "name": "Blathers", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "010d0502", - "type": "Card" - }, - { - "amiiboSeries": "Kirby", - "character": "Kirby", - "gameSeries": "Kirby", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive star coins and a boost item", - "write": false - } - ], - "gameID": [ - "01004D300C5AE000" - ], - "gameName": "Kirby and the Forgotten Land" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive two Picture Pieces, a Maxim Tomato, and two Point Stars", - "write": false - } - ], - "gameID": [ - "01007E3006DDA000" - ], - "gameName": "Kirby Star Allies" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive more useful items", - "write": false - } - ], - "gameID": [ - "01006B601380E000" - ], - "gameName": "Kirby's Return to Dream Land Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Kirby-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive 20 Fragments", - "write": false - } - ], - "gameID": [ - "01003FB00C5A8000" - ], - "gameName": "Super Kirby Clash" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1f000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1f000000-02540c02.png", - "name": "Kirby", - "release": { - "au": "2016-06-11", - "eu": "2016-06-10", - "jp": "2016-04-28", - "na": "2016-06-10" - }, - "tail": "02540c02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rodeo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "024b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_024b0001-01260502.png", - "name": "Rodeo", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01260502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Baby Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cc0401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cc0401-02a80e02.png", - "name": "Baby Mario - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02a80e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kitt", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03d10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03d10001-00c20502.png", - "name": "Kitt", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00c20502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Prince", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03440001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03440001-00c50502.png", - "name": "Prince", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00c50502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "K.K. Slider", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01820001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01820001-01d80502.png", - "name": "K. K. Slider - Pikopuri", - "release": { - "au": null, - "eu": null, - "jp": "2016-03-15", - "na": null - }, - "tail": "01d80502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Olimar", - "gameSeries": "Pikmin", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a Pikmin-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "06400100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_06400100-001e0002.png", - "name": "Olimar", - "release": { - "au": "2015-07-23", - "eu": "2015-07-17", - "jp": "2015-07-17", - "na": "2015-09-11" - }, - "tail": "001e0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Clyde", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03ae0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03ae0001-00870502.png", - "name": "Clyde", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00870502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ruby", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "049d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_049d0001-00ed0502.png", - "name": "Ruby", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ed0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Groucho", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "021a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_021a0001-00da0502.png", - "name": "Groucho", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00da0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "King Dedede", - "gameSeries": "Kirby", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive star coins and a boost item", - "write": false - } - ], - "gameID": [ - "01004D300C5AE000" - ], - "gameName": "Kirby and the Forgotten Land" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive two Picture Pieces, a Maxim Tomato, and two Point Stars", - "write": false - } - ], - "gameID": [ - "01007E3006DDA000" - ], - "gameName": "Kirby Star Allies" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive more useful items", - "write": false - } - ], - "gameID": [ - "01006B601380E000" - ], - "gameName": "Kirby's Return to Dream Land Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Kirby-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive 10 Fragments", - "write": false - } - ], - "gameID": [ - "01003FB00C5A8000" - ], - "gameName": "Super Kirby Clash" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1f020000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1f020000-00280002.png", - "name": "King Dedede", - "release": { - "au": "2015-01-29", - "eu": "2015-02-20", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "00280002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Roy", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21040000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21040000-02520002.png", - "name": "Roy", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-04-28", - "na": "2016-03-18" - }, - "tail": "02520002", - "type": "Figure" - }, - { - "amiiboSeries": "Monster Hunter Rise", - "character": "Malzeno", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock special layered armor / Enter daily lottery for a variety of useful items", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - } - ], - "head": "350b0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_350b0000-042d1802.png", - "name": "Malzeno", - "release": { - "au": "2022-06-30", - "eu": "2022-06-30", - "jp": "2022-06-30", - "na": "2022-06-30" - }, - "tail": "042d1802", - "type": "Figure" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock Super Mario Odyssey-themed levels early", - "write": false - } - ], - "gameID": [ - "01009BF0072D4000" - ], - "gameName": "Captain Toad: Treasure Tracker" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Gain temporary invincibility", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000000-03710102.png", - "name": "Mario - Wedding", - "release": { - "au": "2017-10-27", - "eu": "2017-10-27", - "jp": "2017-10-27", - "na": "2017-10-27" - }, - "tail": "03710102", - "type": "Figure" - }, - { - "amiiboSeries": "Yoshi's Woolly World", - "character": "Yoshi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00030102", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00030102-00430302.png", - "name": "Light Blue Yarn Yoshi", - "release": { - "au": "2015-06-25", - "eu": "2015-06-26", - "jp": "2015-07-16", - "na": "2015-10-16" - }, - "tail": "00430302", - "type": "Yarn" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Baabara", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04c60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04c60001-01670502.png", - "name": "Baabara", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01670502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Mr. G&W", - "gameSeries": "Classic Nintendo", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07800000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07800000-002d0002.png", - "name": "Mr. Game & Watch", - "release": { - "au": "2015-09-26", - "eu": "2015-09-25", - "jp": "2015-10-29", - "na": "2015-09-25" - }, - "tail": "002d0002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Captain Falcon", - "gameSeries": "F-Zero", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "06000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_06000000-00120002.png", - "name": "Captain Falcon", - "release": { - "au": "2014-12-12", - "eu": "2014-12-19", - "jp": "2014-12-06", - "na": "2014-12-14" - }, - "tail": "00120002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Static", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04e50001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04e50001-01ad0502.png", - "name": "Static", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01ad0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rod", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04110001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04110001-01ab0502.png", - "name": "Rod", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01ab0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bitty", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03950001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03950001-02fc0502.png", - "name": "Bitty", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02fc0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Peach", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00020100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00020100-03a70102.png", - "name": "Peach - Cat", - "release": { - "au": "2021-02-12", - "eu": "2021-02-12", - "jp": "2021-02-12", - "na": "2021-02-12" - }, - "tail": "03a70102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Buzz", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "044e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_044e0001-03150502.png", - "name": "Buzz", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03150502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Blathers", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01920001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01920001-03ad0502.png", - "name": "Blathers", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03ad0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bonbon", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04a50001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04a50001-00740502.png", - "name": "Bonbon", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00740502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rolf", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04fa0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04fa0001-01680502.png", - "name": "Rolf", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01680502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Queenie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04360001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04360001-01940502.png", - "name": "Queenie", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01940502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Diana", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02de0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02de0001-009c0502.png", - "name": "Diana", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "009c0502", - "type": "Card" - }, - { - "amiiboSeries": "Power Pros", - "character": "Hayakawa", - "gameSeries": "Power Pros", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive in-game items and power-ups / Save items to your card after playing with friends to bring them home", - "write": true - } - ], - "gameID": [ - "0100E9C00BF28000" - ], - "gameName": "Jikkyou Powerful Pro Baseball" - } - ], - "head": "38030001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38030001-03961702.png", - "name": "Hayakawa", - "release": { - "au": null, - "eu": null, - "jp": "2019-06-27", - "na": null - }, - "tail": "03961702", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Alice", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03bd0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03bd0001-00f90502.png", - "name": "Alice", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00f90502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Wario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00070000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00070000-02630102.png", - "name": "Wario", - "release": { - "au": "2016-10-08", - "eu": "2016-10-07", - "jp": "2016-10-20", - "na": "2016-11-04" - }, - "tail": "02630102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Paula", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "021e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_021e0001-01230502.png", - "name": "Paula", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01230502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Metal Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09d00401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09d00401-02bc0e02.png", - "name": "Metal Mario - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02bc0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Piper", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02320001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02320001-02ea0502.png", - "name": "Piper", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02ea0502", - "type": "Card" - }, - { - "amiiboSeries": "Kirby", - "character": "Meta Knight", - "gameSeries": "Kirby", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive star coins and a boost item", - "write": false - } - ], - "gameID": [ - "01004D300C5AE000" - ], - "gameName": "Kirby and the Forgotten Land" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive two Picture Pieces, a Maxim Tomato, and two Point Stars", - "write": false - } - ], - "gameID": [ - "01007E3006DDA000" - ], - "gameName": "Kirby Star Allies" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive more useful items", - "write": false - } - ], - "gameID": [ - "01006B601380E000" - ], - "gameName": "Kirby's Return to Dream Land Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Kirby-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive 20 Fragments", - "write": false - } - ], - "gameID": [ - "01003FB00C5A8000" - ], - "gameName": "Super Kirby Clash" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1f010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1f010000-02550c02.png", - "name": "Meta Knight", - "release": { - "au": "2016-06-11", - "eu": "2016-06-10", - "jp": "2016-04-28", - "na": "2016-06-10" - }, - "tail": "02550c02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ribbot", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03390001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03390001-01b10502.png", - "name": "Ribbot", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01b10502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Hornsby", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04b60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04b60001-02ec0502.png", - "name": "Hornsby", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02ec0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Timmy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01850401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01850401-01790502.png", - "name": "Timmy - Suit", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01790502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Wilbur", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a010001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a010001-03ac0502.png", - "name": "Wilbur", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03ac0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ellie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "032a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_032a0001-03070502.png", - "name": "Ellie", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03070502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bluebear", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "027d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_027d0001-00630502.png", - "name": "Bluebear", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00630502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Bowser Jr.", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Chain Chomp weapon", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - }, - { - "Usage": "Unleash a powerful shockwave to knock out nearby enemies and blocks (in Bowser's Fury mode)", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00060000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00060000-00150002.png", - "name": "Bowser Jr.", - "release": { - "au": "2015-07-23", - "eu": "2015-07-17", - "jp": "2015-07-17", - "na": "2015-09-11" - }, - "tail": "00150002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Shulk", - "gameSeries": "Xenoblade Chronicles", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific weapon skin for characters using the Swordfighter Class", - "write": false - } - ], - "gameID": [ - "010074F013262000" - ], - "gameName": "Xenoblade Chronicles 3" - } - ], - "head": "22400000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_22400000-002b0002.png", - "name": "Shulk", - "release": { - "au": "2015-01-29", - "eu": "2015-02-20", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "002b0002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Daisy", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - } - ], - "head": "00130000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00130000-02660102.png", - "name": "Daisy", - "release": { - "au": "2016-11-05", - "eu": "2016-11-04", - "jp": "2016-10-20", - "na": "2016-11-04" - }, - "tail": "02660102", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Bowser", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c90101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c90101-02960e02.png", - "name": "Bowser - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02960e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sally", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04e40001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04e40001-01b60502.png", - "name": "Sally", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01b60502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sasha", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a110001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a110001-03c80502.png", - "name": "Sasha", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03c80502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Robin", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21030000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21030000-002a0002.png", - "name": "Robin", - "release": { - "au": "2015-04-25", - "eu": "2015-04-24", - "jp": "2015-04-29", - "na": "2015-05-29" - }, - "tail": "002a0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Patty", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02b10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02b10001-00690502.png", - "name": "Patty", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00690502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gloria", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03160001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03160001-01c00502.png", - "name": "Gloria", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01c00502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "K.K. Slider", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01820001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01820001-00a80502.png", - "name": "K.K. Slider", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00a80502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Simon", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03fb0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03fb0001-01cf0502.png", - "name": "Simon", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01cf0502", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-04180902.png", - "name": "Link - Tears of the Kingdom", - "release": { - "au": "2023-05-12", - "eu": "2023-05-12", - "jp": "2023-05-12", - "na": "2023-05-12" - }, - "tail": "04180902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Papi", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03b00001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03b00001-01a90502.png", - "name": "Papi", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01a90502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Dizzy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03240001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03240001-01890502.png", - "name": "Dizzy", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01890502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chow", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02170001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02170001-01b30502.png", - "name": "Chow", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01b30502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tipper", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02b20001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02b20001-00c40502.png", - "name": "Tipper", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00c40502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Leonardo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04fe0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04fe0001-00590502.png", - "name": "Leonardo", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00590502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000100-00160002.png", - "name": "Toon Link", - "release": { - "au": "2015-01-29", - "eu": "2015-01-23", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "00160002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pango", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02020001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02020001-01030502.png", - "name": "Pango", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "01030502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "R.O.B.", - "gameSeries": "Classic Nintendo", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07810000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07810000-00330002.png", - "name": "R.O.B. - NES", - "release": { - "au": "2015-09-26", - "eu": "2015-09-25", - "jp": null, - "na": "2015-09-25" - }, - "tail": "00330002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Pink Gold Peach", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09d10201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09d10201-02bf0e02.png", - "name": "Pink Gold Peach - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02bf0e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "PAC-MAN", - "gameSeries": "Pac-man", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Pakku Mask", - "write": false - } - ], - "gameID": [ - "01002FC00412C000" - ], - "gameName": "Little Nightmares: Complete Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "33400000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_33400000-00320002.png", - "name": "Pac-Man", - "release": { - "au": "2015-04-25", - "eu": "2015-04-24", - "jp": "2015-04-29", - "na": "2015-05-29" - }, - "tail": "00320002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Marlo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a150001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a150001-03cc0502.png", - "name": "Marlo", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03cc0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Luigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c10301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c10301-02700e02.png", - "name": "Luigi - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02700e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lottie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01c10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01c10001-00540502.png", - "name": "Lottie", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00540502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Peach", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c20301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c20301-02750e02.png", - "name": "Peach - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02750e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Poncho", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "027f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_027f0001-00b90502.png", - "name": "Poncho", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00b90502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Mott", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03ec0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03ec0001-01830502.png", - "name": "Mott", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01830502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Zucker", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "042b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_042b0001-01af0502.png", - "name": "Zucker", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01af0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Nintendo World", - "character": "Daisy", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - } - ], - "head": "00130003", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00130003-039eff02.png", - "name": "Daisy - Power Up Band", - "release": { - "au": null, - "eu": null, - "jp": "2021-02-04", - "na": null - }, - "tail": "039eff02", - "type": "Band" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Mega Man", - "gameSeries": "Megaman", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive E Tanks and other useful in-game items", - "write": false - } - ], - "gameID": [ - "0100B0C0086B0000" - ], - "gameName": "Mega Man 11" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock 11 exclusive challenge stages designed by fans", - "write": false - } - ], - "gameID": [ - "01002D4007AE0000" - ], - "gameName": "Mega Man Legacy Collection" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock new platforming challenges", - "write": false - } - ], - "gameID": [ - "0100842008EC4000" - ], - "gameName": "Mega Man Legacy Collection 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "0100643002136000" - ], - "gameName": "Resident Evil Revelations" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "010095300212A000" - ], - "gameName": "Resident Evil Revelations 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "34800000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_34800000-00310002.png", - "name": "Mega Man", - "release": { - "au": "2015-01-29", - "eu": "2015-02-20", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "00310002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gruff", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "035a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_035a0001-00850502.png", - "name": "Gruff", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00850502", - "type": "Card" - }, - { - "amiiboSeries": "Metroid", - "character": "Metroid", - "gameSeries": "Metroid", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Metroid-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Replenish a random amount of missiles once per day", - "write": false - } - ], - "gameID": [ - "010093801237C000" - ], - "gameName": "Metroid Dread" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05c10000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05c10000-03661302.png", - "name": "Metroid", - "release": { - "au": "2017-09-16", - "eu": "2017-09-15", - "jp": "2017-09-15", - "na": "2017-09-15" - }, - "tail": "03661302", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pompom", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "030c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_030c0001-01b80502.png", - "name": "Pompom", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01b80502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Celeste", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01930001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01930001-03ae0502.png", - "name": "Celeste", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03ae0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cashmere", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04c90001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04c90001-030d0502.png", - "name": "Cashmere", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "030d0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Diva", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "034a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_034a0001-01430502.png", - "name": "Diva", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01430502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Truffles", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04790001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04790001-00920502.png", - "name": "Truffles", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00920502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Marina", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "042a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_042a0001-012d0502.png", - "name": "Marina", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "012d0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Nana", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03fa0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03fa0001-00d00502.png", - "name": "Nana", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00d00502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Bowser Jr.", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09ca0301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09ca0301-029d0e02.png", - "name": "Bowser Jr. - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "029d0e02", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08000200", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000200-02600402.png", - "name": "Inkling Boy - Purple", - "release": { - "au": "2016-07-09", - "eu": "2016-07-08", - "jp": "2016-07-07", - "na": "2016-07-08" - }, - "tail": "02600402", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Eunice", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04c70001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04c70001-00940502.png", - "name": "Eunice", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00940502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Bowser", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c90501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c90501-029a0e02.png", - "name": "Bowser - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "029a0e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Donkey Kong", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00080000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00080000-00030002.png", - "name": "Donkey Kong", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "00030002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Nintendo World", - "character": "Toad", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive an invincibility mushroom", - "write": false - } - ], - "gameID": [ - "01009BF0072D4000" - ], - "gameName": "Captain Toad: Treasure Tracker" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "000a0003", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_000a0003-03a0ff02.png", - "name": "Toad - Power Up Band", - "release": { - "au": null, - "eu": null, - "jp": "2021-02-04", - "na": null - }, - "tail": "03a0ff02", - "type": "Band" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rory", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03ed0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03ed0001-01a30502.png", - "name": "Rory", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01a30502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Egbert", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "029b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_029b0001-00cb0502.png", - "name": "Egbert", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00cb0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - }, - { - "Usage": "Gain temporary invincibility", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000000-00000002.png", - "name": "Mario", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "00000002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Rosalina", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cf0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cf0101-02b40e02.png", - "name": "Rosalina - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02b40e02", - "type": "Card" - }, - { - "amiiboSeries": "Legend Of Zelda", - "character": "Link", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Red Tunic", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01000000-034e0902.png", - "name": "Link - Skyward Sword", - "release": { - "au": "2017-06-24", - "eu": "2017-06-23", - "jp": "2017-06-23", - "na": "2017-06-23" - }, - "tail": "034e0902", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cheri", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02870001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02870001-005a0502.png", - "name": "Cheri", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "005a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tom Nook", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01830201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01830201-03a80502.png", - "name": "Tom Nook", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03a80502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Luigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c10501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c10501-02720e02.png", - "name": "Luigi - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02720e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Yoshi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c40101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c40101-027d0e02.png", - "name": "Yoshi - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "027d0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Mathilda", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03d20001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03d20001-00e50502.png", - "name": "Mathilda", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00e50502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c00301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c00301-026b0e02.png", - "name": "Mario - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "026b0e02", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08000300", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000300-036b0402.png", - "name": "Inkling Squid - Neon Purple", - "release": { - "au": "2017-07-21", - "eu": "2017-07-21", - "jp": "2017-07-21", - "na": "2017-07-21" - }, - "tail": "036b0402", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pietro", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04d20001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04d20001-01a70502.png", - "name": "Pietro", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01a70502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Baby Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cc0301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cc0301-02a70e02.png", - "name": "Baby Mario - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02a70e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Diddy Kong", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c80201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c80201-02920e02.png", - "name": "Diddy Kong - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02920e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Drake", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03100001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03100001-00f80502.png", - "name": "Drake", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00f80502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Dobie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "050f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_050f0001-03140502.png", - "name": "Dobie", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03140502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Peach", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a life-up heart", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00020000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00020000-00360102.png", - "name": "Peach", - "release": { - "au": "2015-03-21", - "eu": "2015-03-20", - "jp": "2015-03-12", - "na": "2015-03-20" - }, - "tail": "00360102", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Donkey Kong", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c70201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c70201-028d0e02.png", - "name": "Donkey Kong - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "028d0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Zoe", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a1a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a1a0001-03d10502.png", - "name": "Zoe", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03d10502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tom Nook", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01830001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01830001-00450502.png", - "name": "Tom Nook", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00450502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Nan", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03570001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03570001-00eb0502.png", - "name": "Nan", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00eb0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Yoshi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c40201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c40201-027e0e02.png", - "name": "Yoshi - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "027e0e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Peach", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a life-up heart", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00020000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00020000-00010002.png", - "name": "Peach", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "00010002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Waluigi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00140000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00140000-02670102.png", - "name": "Waluigi", - "release": { - "au": "2016-11-05", - "eu": "2016-11-04", - "jp": "2016-10-20", - "na": "2016-11-04" - }, - "tail": "02670102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "K.K. Slider", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01820001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01820001-03b20502.png", - "name": "K.K. Slider", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03b20502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Victoria", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03a50001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03a50001-015b0502.png", - "name": "Victoria", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "015b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kitty", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "026b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_026b0001-00e90502.png", - "name": "Kitty", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00e90502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rizzo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04150001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04150001-01bb0502.png", - "name": "Rizzo", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01bb0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Diddy Kong", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c80401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c80401-02940e02.png", - "name": "Diddy Kong - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02940e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Agent S", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04e20001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04e20001-01090502.png", - "name": "Agent S", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "01090502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Greninja", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1b920000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1b920000-00250002.png", - "name": "Greninja", - "release": { - "au": "2015-05-30", - "eu": "2015-05-29", - "jp": "2015-04-29", - "na": "2015-05-29" - }, - "tail": "00250002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Peach", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c20201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c20201-02740e02.png", - "name": "Peach - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02740e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Flora", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "043f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_043f0001-01550502.png", - "name": "Flora", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01550502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cole", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04a60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04a60001-00a30502.png", - "name": "Cole", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00a30502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Octavian", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04290001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04290001-00700502.png", - "name": "Octavian", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00700502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Koopa Troopa", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Chain Chomp weapon", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00230000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00230000-03680102.png", - "name": "Koopa Troopa", - "release": { - "au": "2017-10-07", - "eu": "2017-10-06", - "jp": "2017-10-05", - "na": "2017-10-06" - }, - "tail": "03680102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Friga", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04630001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04630001-01310502.png", - "name": "Friga", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01310502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cousteau", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03420001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03420001-01280502.png", - "name": "Cousteau", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01280502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Don Resetti", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "018f0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018f0101-01190502.png", - "name": "Don Resetti - Without Hat", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01190502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tiansheng", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a130001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a130001-03ca0502.png", - "name": "Tiansheng", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03ca0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Becky", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02a20001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02a20001-01ba0502.png", - "name": "Becky", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01ba0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Klaus", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02220001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02220001-01440502.png", - "name": "Klaus", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01440502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chadder", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "041e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_041e0001-015f0502.png", - "name": "Chadder", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "015f0502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08000100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000100-03690402.png", - "name": "Inkling Girl - Neon Pink", - "release": { - "au": "2017-07-21", - "eu": "2017-07-21", - "jp": "2017-07-21", - "na": "2017-07-21" - }, - "tail": "03690402", - "type": "Figure" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Goomba", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Chain Chomp weapon", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00150000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00150000-03670102.png", - "name": "Goomba", - "release": { - "au": "2017-10-07", - "eu": "2017-10-06", - "jp": "2017-10-05", - "na": "2017-10-06" - }, - "tail": "03670102", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Bayonetta", - "gameSeries": "Bayonetta", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Super Mirror and Super Mirror 64 and all the costumes they contain", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "32400100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_32400100-03640002.png", - "name": "Bayonetta - Player 2", - "release": { - "au": "2017-07-22", - "eu": "2017-07-21", - "jp": "2017-07-21", - "na": "2017-07-21" - }, - "tail": "03640002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Gain temporary invincibility", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000000-003c0102.png", - "name": "Mario - Gold Edition", - "release": { - "au": "2015-06-25", - "eu": null, - "jp": "2015-12-17", - "na": "2015-03-20" - }, - "tail": "003c0102", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Samus", - "gameSeries": "Metroid", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Metroid-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Restore a random amount of health once per day", - "write": false - } - ], - "gameID": [ - "010093801237C000" - ], - "gameName": "Metroid Dread" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05c00100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05c00100-001d0002.png", - "name": "Zero Suit Samus", - "release": { - "au": "2015-07-04", - "eu": "2015-06-26", - "jp": "2015-06-11", - "na": "2015-09-11" - }, - "tail": "001d0002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Nintendo World", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - }, - { - "Usage": "Gain temporary invincibility", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - } - ], - "head": "00000003", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000003-039bff02.png", - "name": "Mario - Power Up Band", - "release": { - "au": null, - "eu": null, - "jp": "2021-02-04", - "na": null - }, - "tail": "039bff02", - "type": "Band" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Pit", - "gameSeries": "Kid Icarus", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07400000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07400000-00100002.png", - "name": "Pit", - "release": { - "au": "2014-12-12", - "eu": "2014-12-19", - "jp": "2014-12-06", - "na": "2014-12-14" - }, - "tail": "00100002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Dotty", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04950001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04950001-01920502.png", - "name": "Dotty", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01920502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Katie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01b60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01b60001-00ae0502.png", - "name": "Katie", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ae0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Zelda", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Blue Attire", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01010100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01010100-00170002.png", - "name": "Sheik", - "release": { - "au": "2015-01-29", - "eu": "2015-01-23", - "jp": "2015-01-22", - "na": "2015-02-01" - }, - "tail": "00170002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Pink Gold Peach", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09d10501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09d10501-02c20e02.png", - "name": "Pink Gold Peach - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02c20e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Jingle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01af0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01af0001-011c0502.png", - "name": "Jingle", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "011c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lolly", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "026f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_026f0001-01900502.png", - "name": "Lolly", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01900502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08000100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000100-025f0402.png", - "name": "Inkling Girl - Lime Green", - "release": { - "au": "2016-07-09", - "eu": "2016-07-08", - "jp": "2016-07-07", - "na": "2016-07-08" - }, - "tail": "025f0402", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Metal Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09d00501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09d00501-02bd0e02.png", - "name": "Metal Mario - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02bd0e02", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Octoling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - } - ], - "head": "08050200", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08050200-041b0402.png", - "name": "Octoling - Blue", - "release": { - "au": "2022-11-11", - "eu": "2022-11-11", - "jp": "2022-11-11", - "na": "2022-11-11" - }, - "tail": "041b0402", - "type": "Figure" - }, - { - "amiiboSeries": "Fire Emblem", - "character": "Alm", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21060000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21060000-03601202.png", - "name": "Alm", - "release": { - "au": "2017-05-20", - "eu": "2017-05-19", - "jp": "2017-04-20", - "na": "2017-05-19" - }, - "tail": "03601202", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Richter", - "gameSeries": "Castlevania", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "37c10000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_37c10000-038c0002.png", - "name": "Richter", - "release": { - "au": "2020-01-17", - "eu": "2020-01-17", - "jp": "2020-01-17", - "na": "2020-01-17" - }, - "tail": "038c0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Jeremiah", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "033f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_033f0001-008f0502.png", - "name": "Jeremiah", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "008f0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Bowser", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c90401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c90401-02990e02.png", - "name": "Bowser - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02990e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Booker", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "019e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_019e0001-00ad0502.png", - "name": "Booker", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ad0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lucky", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02ec0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02ec0001-01c40502.png", - "name": "Lucky", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01c40502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "K.K. Slider", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01820000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01820000-02400502.png", - "name": "K. K. Slider", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-13" - }, - "tail": "02400502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Luna", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01b50001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01b50001-00510502.png", - "name": "Luna", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00510502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Doc", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "049e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_049e0001-01b70502.png", - "name": "Doc", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01b70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Celia", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04540001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04540001-01ae0502.png", - "name": "Celia", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01ae0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Hippeux", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03990001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03990001-01c20502.png", - "name": "Hippeux", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01c20502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Baby Luigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cd0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cd0101-02aa0e02.png", - "name": "Baby Luigi - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02aa0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Poppy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04ec0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04ec0001-00770502.png", - "name": "Poppy", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00770502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tank", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04b20001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04b20001-01b90502.png", - "name": "Tank", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01b90502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lottie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01c10201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01c10201-03bb0502.png", - "name": "Lottie - Island", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03bb0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Marcel", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02f90001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02f90001-01020502.png", - "name": "Marcel", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "01020502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Reese", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "018a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018a0001-00a90502.png", - "name": "Reese", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00a90502", - "type": "Card" - }, - { - "amiiboSeries": "Pikmin", - "character": "Pikmin", - "gameSeries": "Pikmin", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a Pikmin-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "06420000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_06420000-035f1102.png", - "name": "Pikmin", - "release": { - "au": "2017-07-29", - "eu": "2017-07-28", - "jp": "2017-07-13", - "na": "2017-07-28" - }, - "tail": "035f1102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Buck", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03a40001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03a40001-014f0502.png", - "name": "Buck", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "014f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ricky", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04e70001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04e70001-01320502.png", - "name": "Ricky", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01320502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cube", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04610001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04610001-01610502.png", - "name": "Cube", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01610502", - "type": "Card" - }, - { - "amiiboSeries": "Yu-Gi-Oh!", - "character": "Yuga Ohdo", - "gameSeries": "Yu-Gi-Oh!", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive items/bonuses", - "write": false - } - ], - "gameID": [ - "01003C101454A000" - ], - "gameName": "Yu-Gi-Oh! Rush Duel Saikyo Battle Royale" - } - ], - "head": "38400001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38400001-04241902.png", - "name": "Yuga Ohdo", - "release": { - "au": null, - "eu": null, - "jp": null, - "na": "2021-08-12" - }, - "tail": "04241902", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Birdo", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09ce0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09ce0101-02af0e02.png", - "name": "Birdo - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02af0e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Daisy", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c30301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c30301-027a0e02.png", - "name": "Daisy - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "027a0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Astrid", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03d60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03d60001-01570502.png", - "name": "Astrid", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01570502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Isabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01810100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01810100-023f0502.png", - "name": "Isabelle - Winter Outfit", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-11-21", - "na": "2015-11-13" - }, - "tail": "023f0502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Celeste", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01930000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01930000-02480502.png", - "name": "Celeste", - "release": { - "au": "2016-01-30", - "eu": "2016-01-29", - "jp": "2015-12-17", - "na": "2016-01-22" - }, - "tail": "02480502", - "type": "Figure" - }, - { - "amiiboSeries": "Yoshi's Woolly World", - "character": "Yoshi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00030102", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00030102-00420302.png", - "name": "Pink Yarn Yoshi", - "release": { - "au": "2015-06-25", - "eu": "2015-06-26", - "jp": "2015-07-16", - "na": "2015-10-16" - }, - "tail": "00420302", - "type": "Yarn" - }, - { - "amiiboSeries": "Power Pros", - "character": "Ganda", - "gameSeries": "Power Pros", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive in-game items and power-ups / Save items to your card after playing with friends to bring them home", - "write": true - } - ], - "gameID": [ - "0100E9C00BF28000" - ], - "gameName": "Jikkyou Powerful Pro Baseball" - } - ], - "head": "38040001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38040001-03971702.png", - "name": "Ganda", - "release": { - "au": null, - "eu": null, - "jp": "2019-06-27", - "na": null - }, - "tail": "03971702", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Daisy", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c30201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c30201-02790e02.png", - "name": "Daisy - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02790e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Bowser", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c90301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c90301-02980e02.png", - "name": "Bowser - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02980e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Boomer", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04690001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04690001-01640502.png", - "name": "Boomer", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01640502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Diddy Kong", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00090000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00090000-02650102.png", - "name": "Diddy Kong", - "release": { - "au": "2016-11-05", - "eu": "2016-11-04", - "jp": "2016-10-20", - "na": "2016-11-04" - }, - "tail": "02650102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Canberra", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03c40001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03c40001-012b0502.png", - "name": "Canberra", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "012b0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Pink Gold Peach", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09d10401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09d10401-02c10e02.png", - "name": "Pink Gold Peach - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02c10e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chief", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "050b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_050b0001-00990502.png", - "name": "Chief", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00990502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Inkling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08000200", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08000200-036a0402.png", - "name": "Inkling Boy - Neon Green", - "release": { - "au": "2017-07-21", - "eu": "2017-07-21", - "jp": "2017-07-21", - "na": "2017-07-21" - }, - "tail": "036a0402", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Biff", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03940001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03940001-00890502.png", - "name": "Biff", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00890502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Little Mac", - "gameSeries": "Punch Out", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "06c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_06c00000-000f0002.png", - "name": "Little Mac", - "release": { - "au": "2014-12-12", - "eu": "2014-12-19", - "jp": "2014-12-06", - "na": "2014-12-14" - }, - "tail": "000f0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Julian", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03b10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03b10001-00f00502.png", - "name": "Julian", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00f00502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Moe", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02650001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02650001-01540502.png", - "name": "Moe", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01540502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Baby Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cc0201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cc0201-02a60e02.png", - "name": "Baby Mario - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02a60e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Phyllis", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a10001-01100502.png", - "name": "Phyllis", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01100502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Megan", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a0a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a0a0001-03c10502.png", - "name": "Megan", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03c10502", - "type": "Card" - }, - { - "amiiboSeries": "Yoshi's Woolly World", - "character": "Yoshi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00030102", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00030102-00410302.png", - "name": "Green Yarn Yoshi", - "release": { - "au": "2015-06-25", - "eu": "2015-06-26", - "jp": "2015-07-16", - "na": "2015-10-16" - }, - "tail": "00410302", - "type": "Yarn" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Maddie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02f30001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02f30001-02f90502.png", - "name": "Maddie", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02f90502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Wendy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04ce0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04ce0001-00db0502.png", - "name": "Wendy", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00db0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Peanut", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04dd0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04dd0001-00a20502.png", - "name": "Peanut", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00a20502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chabwick", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a190001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a190001-03d00502.png", - "name": "Chabwick", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03d00502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Leila", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01980001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01980001-00b10502.png", - "name": "Leila", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00b10502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Pyra", - "gameSeries": "Xenoblade Chronicles", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific weapon skin for characters using the Swordfighter Class", - "write": false - } - ], - "gameID": [ - "010074F013262000" - ], - "gameName": "Xenoblade Chronicles 3" - } - ], - "head": "22410000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_22410000-041e0002.png", - "name": "Pyra", - "release": { - "au": "2023-07-21", - "eu": "2023-07-21", - "jp": "2023-07-21", - "na": "2023-07-21" - }, - "tail": "041e0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rilla", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - }, - { - "Usage": "Unlock special furniture items and a poster based on the card's Sanrio character", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03740101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03740101-03190502.png", - "name": "Rilla", - "release": { - "au": null, - "eu": "2016-11-25", - "jp": "2016-11-03", - "na": null - }, - "tail": "03190502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Villager", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special poster of the character", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01800000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01800000-00080002.png", - "name": "Villager", - "release": { - "au": "2014-11-29", - "eu": "2014-11-28", - "jp": "2014-12-06", - "na": "2014-11-21" - }, - "tail": "00080002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Mabel", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01880001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01880001-03af0502.png", - "name": "Mabel", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03af0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tiffany", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "049b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_049b0001-00610502.png", - "name": "Tiffany", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00610502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Bowser Jr.", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09ca0401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09ca0401-029e0e02.png", - "name": "Bowser Jr. - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "029e0e02", - "type": "Card" - }, - { - "amiiboSeries": "Kirby", - "character": "Waddle Dee", - "gameSeries": "Kirby", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive star coins and a boost item", - "write": false - } - ], - "gameID": [ - "01004D300C5AE000" - ], - "gameName": "Kirby and the Forgotten Land" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive two Picture Pieces, a Maxim Tomato, and two Point Stars", - "write": false - } - ], - "gameID": [ - "01007E3006DDA000" - ], - "gameName": "Kirby Star Allies" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive more useful items", - "write": false - } - ], - "gameID": [ - "01006B601380E000" - ], - "gameName": "Kirby's Return to Dream Land Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Kirby-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive 20 Fragments", - "write": false - } - ], - "gameID": [ - "01003FB00C5A8000" - ], - "gameName": "Super Kirby Clash" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1f030000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1f030000-02570c02.png", - "name": "Waddle Dee", - "release": { - "au": "2016-06-11", - "eu": "2016-06-10", - "jp": "2016-04-28", - "na": "2016-06-10" - }, - "tail": "02570c02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Del", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02c70001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02c70001-01220502.png", - "name": "Del", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01220502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cookie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02f20001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02f20001-00cc0502.png", - "name": "Cookie", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00cc0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Donkey Kong", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c70301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c70301-028e0e02.png", - "name": "Donkey Kong - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "028e0e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Isabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01810000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01810000-037d0002.png", - "name": "Isabelle", - "release": { - "au": "2019-07-19", - "eu": "2019-07-19", - "jp": "2019-07-19", - "na": "2019-07-26" - }, - "tail": "037d0002", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Ryu", - "gameSeries": "Street fighter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "0100643002136000" - ], - "gameName": "Resident Evil Revelations" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a lot of BP / Receive better supplies (compared to other amiibo)", - "write": false - } - ], - "gameID": [ - "010095300212A000" - ], - "gameName": "Resident Evil Revelations 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "34c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_34c00000-02530002.png", - "name": "Ryu", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-04-28", - "na": "2016-03-18" - }, - "tail": "02530002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Harry", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03980001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03980001-00bf0502.png", - "name": "Harry", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00bf0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Deli", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04010001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04010001-00660502.png", - "name": "Deli", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00660502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chelsea", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - }, - { - "Usage": "Unlock special furniture items and a poster based on the card's Sanrio character", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02e00101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02e00101-031d0502.png", - "name": "Chelsea", - "release": { - "au": null, - "eu": "2016-11-25", - "jp": "2016-11-03", - "na": null - }, - "tail": "031d0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Ganon", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Black Cat Clothes", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01020100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01020100-001b0002.png", - "name": "Ganondorf", - "release": { - "au": "2015-07-04", - "eu": "2015-06-26", - "jp": "2015-06-11", - "na": "2015-09-11" - }, - "tail": "001b0002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Daisy", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c30401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c30401-027b0e02.png", - "name": "Daisy - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "027b0e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Pink Gold Peach", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09d10301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09d10301-02c00e02.png", - "name": "Pink Gold Peach - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02c00e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Bud", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03e60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03e60001-00ec0502.png", - "name": "Bud", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00ec0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Joker", - "gameSeries": "Persona", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "3a000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_3a000000-03a10002.png", - "name": "Joker", - "release": { - "au": "2020-09-25", - "eu": "2020-09-25", - "jp": "2020-09-25", - "na": "2020-10-02" - }, - "tail": "03a10002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Al", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "03710001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03710001-005c0502.png", - "name": "Al", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "005c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Elise", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03fe0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03fe0001-01a40502.png", - "name": "Elise", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01a40502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Dark Samus", - "gameSeries": "Metroid", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a Metroid-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Replenish a random amount of missiles once per day", - "write": false - } - ], - "gameID": [ - "010093801237C000" - ], - "gameName": "Metroid Dread" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05c30000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05c30000-03800002.png", - "name": "Dark Samus", - "release": { - "au": "2020-01-17", - "eu": "2020-01-17", - "jp": "2020-01-17", - "na": "2020-01-17" - }, - "tail": "03800002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Marcie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03db0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03db0001-006d0502.png", - "name": "Marcie", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "006d0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Curt", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02160001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02160001-00570502.png", - "name": "Curt", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00570502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kyle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "05150001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05150001-005b0502.png", - "name": "Kyle", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "005b0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Corrin", - "gameSeries": "Fire Emblem", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive a Fashion Ticket and a Music Ticket, for unlocking any of the available costumes and music tracks", - "write": false - } - ], - "gameID": [ - "0100A6301214E000" - ], - "gameName": "Fire Emblem Engage" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon", - "write": false - } - ], - "gameID": [ - "0100F15003E64000" - ], - "gameName": "Fire Emblem Warriors" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive better-quality randomized resources, weapons, or equipment", - "write": false - } - ], - "gameID": [ - "010071F0143EA000" - ], - "gameName": "Fire Emblem Warriors: Three Hopes" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special piece of battle music / Receive higher-quality items and materials", - "write": false - } - ], - "gameID": [ - "010055D009F78000" - ], - "gameName": "Fire Emblem: Three Houses" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "21050100", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_21050100-03630002.png", - "name": "Corrin - Player 2", - "release": { - "au": "2017-07-22", - "eu": "2017-07-21", - "jp": "2017-07-21", - "na": "2017-07-21" - }, - "tail": "03630002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Angus", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "024a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_024a0001-01d10502.png", - "name": "Angus", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01d10502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Curly", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04780001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04780001-01630502.png", - "name": "Curly", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01630502", - "type": "Card" - }, - { - "amiiboSeries": "Super Nintendo World", - "character": "Yoshi", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00030003", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00030003-039fff02.png", - "name": "Yoshi - Power Up Band", - "release": { - "au": null, - "eu": null, - "jp": "2021-02-04", - "na": null - }, - "tail": "039fff02", - "type": "Band" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c00401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c00401-026c0e02.png", - "name": "Mario - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "026c0e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Baby Luigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cd0401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cd0401-02ad0e02.png", - "name": "Baby Luigi - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02ad0e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Wario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c50501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c50501-02860e02.png", - "name": "Wario - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02860e02", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Bowser Jr.", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09ca0201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09ca0201-029c0e02.png", - "name": "Bowser Jr. - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "029c0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Isabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01810201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01810201-011a0502.png", - "name": "Isabelle - Kimono", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "011a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Drift", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "033c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_033c0001-01000502.png", - "name": "Drift", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "01000502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Margie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03270001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03270001-01c30502.png", - "name": "Margie", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01c30502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Mallary", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "030d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_030d0001-01840502.png", - "name": "Mallary", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01840502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Bowser", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c90201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c90201-02970e02.png", - "name": "Bowser - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02970e02", - "type": "Card" - }, - { - "amiiboSeries": "Kirby", - "character": "King Dedede", - "gameSeries": "Kirby", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive star coins and a boost item", - "write": false - } - ], - "gameID": [ - "01004D300C5AE000" - ], - "gameName": "Kirby and the Forgotten Land" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive two Picture Pieces, a Maxim Tomato, and two Point Stars", - "write": false - } - ], - "gameID": [ - "01007E3006DDA000" - ], - "gameName": "Kirby Star Allies" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive more useful items", - "write": false - } - ], - "gameID": [ - "01006B601380E000" - ], - "gameName": "Kirby's Return to Dream Land Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Kirby-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive 20 Fragments", - "write": false - } - ], - "gameID": [ - "01003FB00C5A8000" - ], - "gameName": "Super Kirby Clash" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1f020000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1f020000-02560c02.png", - "name": "King Dedede", - "release": { - "au": "2016-06-11", - "eu": "2016-06-10", - "jp": "2016-04-28", - "na": "2016-06-10" - }, - "tail": "02560c02", - "type": "Figure" - }, - { - "amiiboSeries": "Monster Hunter", - "character": "Ena", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock Monster Hunter Stories 2 sticker set", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume for Navirou", - "write": false - } - ], - "gameID": [ - "010069301B1D4000" - ], - "gameName": "Monster Hunter Stories" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific special layered armor set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - } - ], - "head": "35060000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35060000-040d0f02.png", - "name": "Ena", - "release": { - "au": "2021-07-09", - "eu": "2021-07-09", - "jp": "2021-07-09", - "na": "2021-07-09" - }, - "tail": "040d0f02", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Luigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c10201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c10201-026f0e02.png", - "name": "Luigi - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "026f0e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Duck Hunt", - "gameSeries": "Classic Nintendo", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07820000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07820000-002f0002.png", - "name": "Duck Hunt", - "release": { - "au": "2015-09-26", - "eu": "2015-09-25", - "jp": "2015-10-29", - "na": "2015-09-25" - }, - "tail": "002f0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cleo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03ab0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03ab0001-03160502.png", - "name": "Cleo", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03160502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Digby", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "018c0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018c0101-01180502.png", - "name": "Digby - Raincoat", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01180502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Rosalina", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cf0501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cf0501-02b80e02.png", - "name": "Rosalina - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02b80e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cyd", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a0d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a0d0001-03c40502.png", - "name": "Cyd", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03c40502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Bowser", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Chain Chomp weapon", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - }, - { - "Usage": "Make Fury Bowser appear (in Bowser's Fury mode)", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Reveal regional coin locations", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00050000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00050000-00390102.png", - "name": "Bowser", - "release": { - "au": "2015-03-21", - "eu": "2015-03-20", - "jp": "2015-03-12", - "na": "2015-03-20" - }, - "tail": "00390102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Faith", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a200001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a200001-03d70502.png", - "name": "Faith", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03d70502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Annalise", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03ad0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03ad0001-01b20502.png", - "name": "Annalise", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01b20502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Gain temporary invincibility", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000000-003d0102.png", - "name": "Mario - Silver Edition", - "release": { - "au": "2015-05-30", - "eu": null, - "jp": null, - "na": "2015-05-29" - }, - "tail": "003d0102", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Incineroar", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1bd70000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1bd70000-03860002.png", - "name": "Incineroar", - "release": { - "au": "2019-11-15", - "eu": "2019-11-15", - "jp": "2019-11-08", - "na": "2019-11-15" - }, - "tail": "03860002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Yoshi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c40501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c40501-02810e02.png", - "name": "Yoshi - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02810e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sly", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02c90001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02c90001-00cd0502.png", - "name": "Sly", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00cd0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Goose", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02990001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02990001-00950502.png", - "name": "Goose", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00950502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Marina", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08040000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08040000-03770402.png", - "name": "Marina", - "release": { - "au": "2018-07-13", - "eu": "2018-07-13", - "jp": "2018-07-13", - "na": "2018-07-13" - }, - "tail": "03770402", - "type": "Figure" - }, - { - "amiiboSeries": "Splatoon", - "character": "Marina", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - } - ], - "head": "08040000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08040000-04390402.png", - "name": "Marina - Side Order", - "release": { - "au": "2024-09-05", - "eu": "2024-09-05", - "jp": "2024-09-05", - "na": "2024-09-05" - }, - "tail": "04390402", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Bayonetta", - "gameSeries": "Bayonetta", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the Super Mirror 2 and all the costumes it contains", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "32400000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_32400000-025b0002.png", - "name": "Bayonetta", - "release": { - "au": "2017-07-22", - "eu": "2017-07-21", - "jp": "2017-07-21", - "na": "2017-07-21" - }, - "tail": "025b0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Joey", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03080001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03080001-014d0502.png", - "name": "Joey", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "014d0502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Pokemon Trainer", - "gameSeries": "Pokemon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "1d400000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_1d400000-03870002.png", - "name": "Pokemon Trainer", - "release": { - "au": "2019-07-19", - "eu": "2019-07-19", - "jp": "2019-07-19", - "na": "2019-07-26" - }, - "tail": "03870002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tangy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02620001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02620001-01370502.png", - "name": "Tangy", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01370502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pancetti", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04880001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04880001-00980502.png", - "name": "Pancetti", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00980502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Ridley", - "gameSeries": "Metroid", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a Metroid-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Replenish a random amount of missiles once per day", - "write": false - } - ], - "gameID": [ - "010093801237C000" - ], - "gameName": "Metroid Dread" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05c20000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05c20000-037f0002.png", - "name": "Ridley", - "release": { - "au": "2018-12-07", - "eu": "2018-12-07", - "jp": "2018-12-07", - "na": "2018-12-07" - }, - "tail": "037f0002", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Donkey Kong", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c70401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c70401-028f0e02.png", - "name": "Donkey Kong - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "028f0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Louie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "036d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_036d0001-03040502.png", - "name": "Louie", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03040502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Dora", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "040c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_040c0001-01590502.png", - "name": "Dora", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01590502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Broffina", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02a50001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02a50001-018c0502.png", - "name": "Broffina", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "018c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Blanche", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "043e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_043e0001-01490502.png", - "name": "Blanche", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01490502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c00501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c00501-026d0e02.png", - "name": "Mario - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "026d0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Lionel", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03ee0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03ee0001-008b0502.png", - "name": "Lionel", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "008b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Jacques", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "023d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_023d0001-01b50502.png", - "name": "Jacques", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01b50502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Vesta", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04c50001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04c50001-01010502.png", - "name": "Vesta", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "01010502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chevre", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03560001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03560001-01350502.png", - "name": "Chevre", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01350502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Shep", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02fc0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02fc0001-018f0502.png", - "name": "Shep", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "018f0502", - "type": "Card" - }, - { - "amiiboSeries": "Shovel Knight", - "character": "Specter Knight", - "gameSeries": "Shovel Knight", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a fairy companion and player color palette matching the character", - "write": false - } - ], - "gameID": [ - "01008D100DE46000" - ], - "gameName": "Cyber Shadow" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific Shovel Knight remix immediately", - "write": false - } - ], - "gameID": [ - "0100830008426000" - ], - "gameName": "Just Shapes & Beats" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock character-specific challenge stages, a character-based fairy companion, and costumes for the character", - "write": false - } - ], - "gameID": [ - "010057D0021E8000" - ], - "gameName": "Shovel Knight" - }, - { - "amiiboUsage": [ - { - "Usage": "Summon a fairy friend", - "write": false - } - ], - "gameID": [ - "0100B62017E68000" - ], - "gameName": "Shovel Knight Dig" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume for the character", - "write": false - } - ], - "gameID": [ - "0100B380022AE000" - ], - "gameName": "Shovel Knight Showdown" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "35c20000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35c20000-036d0a02.png", - "name": "Specter Knight", - "release": { - "au": null, - "eu": "2019-12-10", - "jp": null, - "na": "2019-12-10" - }, - "tail": "036d0a02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Fang", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "05110001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05110001-01950502.png", - "name": "Fang", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01950502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Isabelle", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "01810501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01810501-03bf0502.png", - "name": "Isabelle - Sweater", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03bf0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Snake", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04970001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04970001-007a0502.png", - "name": "Snake", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "007a0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rio", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - }, - { - "Usage": "Unlock special furniture items and a poster based on the card's Sanrio character", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a1c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a1c0001-03d30502.png", - "name": "Rio", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03d30502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Pekoe", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "028b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_028b0001-00e30502.png", - "name": "Pekoe", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00e30502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Celeste", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01930001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01930001-01740502.png", - "name": "Celeste", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01740502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Norma", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02b70001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02b70001-030f0502.png", - "name": "Norma", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "030f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Butch", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02eb0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02eb0001-00de0502.png", - "name": "Butch", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00de0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Marshal", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04ee0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04ee0001-014b0502.png", - "name": "Marshal", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "014b0502", - "type": "Card" - }, - { - "amiiboSeries": "Splatoon", - "character": "Octoling", - "gameSeries": "Splatoon", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Splatoon-themed racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "01003BC0000A0000" - ], - "gameName": "Splatoon 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock exclusive gear / Save favorite weapons, gear, and control settings / Take photos with the character or saved gear", - "write": true - } - ], - "gameID": [ - "0100C2500FC20000" - ], - "gameName": "Splatoon 3" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "08050300", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_08050300-03900402.png", - "name": "Octoling Octopus", - "release": { - "au": "2018-11-11", - "eu": "2018-11-09", - "jp": "2018-11-09", - "na": "2018-11-09" - }, - "tail": "03900402", - "type": "Figure" - }, - { - "amiiboSeries": "8-bit Mario", - "character": "Mario", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive weapon for the character and their Rabbid counterpart", - "write": false - } - ], - "gameID": [ - "010067300059A000" - ], - "gameName": "Mario + Rabbids: Kingdom Battle" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a character-based costume", - "write": false - }, - { - "Usage": "Gain temporary invincibility", - "write": false - } - ], - "gameID": [ - "0100000000010000" - ], - "gameName": "Super Mario Odyssey" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "00000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00000000-02380602.png", - "name": "8-Bit Mario Classic Color", - "release": { - "au": "2015-09-12", - "eu": "2015-11-09", - "jp": "2015-09-10", - "na": "2015-09-11" - }, - "tail": "02380602", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Olivia", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02600001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02600001-00d20502.png", - "name": "Olivia", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00d20502", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Zelda", - "gameSeries": "The Legend of Zelda", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive specific crafting materials or a weapon for the character", - "write": false - } - ], - "gameID": [ - "01002B00111A2000" - ], - "gameName": "Hyrule Warriors: Age of Calamity" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a weapon rated 3 stars or higher", - "write": false - } - ], - "gameID": [ - "0100AE00096EA000" - ], - "gameName": "Hyrule Warriors: Definitive Edition" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Legend of Zelda-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a chest of loot, potentially containing gear inspired by the Legend of Zelda series", - "write": false - } - ], - "gameID": [ - "01000A10041EA000" - ], - "gameName": "The Elder Scrolls V: Skyrim" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive materials and a rare or exclusive item", - "write": false - } - ], - "gameID": [ - "01007EF00011E000" - ], - "gameName": "The Legend of Zelda: Breath of the Wild" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock one of five amiibo-exclusive Chamber Dungeon chambers", - "write": false - }, - { - "Usage": "Save your Chamber Dungeon to the amiibo to share with friends", - "write": true - } - ], - "gameID": [ - "01006BB00C6F0000" - ], - "gameName": "The Legend of Zelda: Link's Awakening" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an amiibo-exclusive character-specific paraglider fabric", - "write": false - }, - { - "Usage": "Receive materials and a weapon or rare item", - "write": false - } - ], - "gameID": [ - "0100F2C0115B6000" - ], - "gameName": "The Legend of Zelda: Tears of the Kingdom" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive the Blue Attire", - "write": false - }, - { - "Usage": "Receive random materials", - "write": false - } - ], - "gameID": [ - "01008CF01BAAC000" - ], - "gameName": "The Legend of Zelda: Echoes of Wisdom" - } - ], - "head": "01010000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01010000-000e0002.png", - "name": "Zelda", - "release": { - "au": "2014-12-12", - "eu": "2014-12-19", - "jp": "2014-12-06", - "na": "2014-12-14" - }, - "tail": "000e0002", - "type": "Figure" - }, - { - "amiiboSeries": "Metroid", - "character": "Samus", - "gameSeries": "Metroid", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a costume based on the character (short-hair version)", - "write": false - } - ], - "gameID": [ - "01007960049A0000" - ], - "gameName": "Bayonetta 2" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a Metroid-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Restore a random amount of health once per day", - "write": false - } - ], - "gameID": [ - "010093801237C000" - ], - "gameName": "Metroid Dread" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "05c00000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05c00000-03651302.png", - "name": "Samus Aran", - "release": { - "au": "2017-09-16", - "eu": "2017-09-15", - "jp": "2017-09-15", - "na": "2017-09-15" - }, - "tail": "03651302", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Zell", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02d80001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02d80001-00e20502.png", - "name": "Zell", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00e20502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Clay", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03830001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03830001-009b0502.png", - "name": "Clay", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "009b0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Boo", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cb0301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cb0301-02a20e02.png", - "name": "Boo - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02a20e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Goldie", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02ea0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02ea0001-01800502.png", - "name": "Goldie", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01800502", - "type": "Card" - }, - { - "amiiboSeries": "Power Pros", - "character": "Yabe", - "gameSeries": "Power Pros", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive in-game items and power-ups / Save items to your card after playing with friends to bring them home", - "write": true - } - ], - "gameID": [ - "0100E9C00BF28000" - ], - "gameName": "Jikkyou Powerful Pro Baseball" - } - ], - "head": "38020001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_38020001-03951702.png", - "name": "Yabe", - "release": { - "au": null, - "eu": null, - "jp": "2019-06-27", - "na": null - }, - "tail": "03951702", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Ness", - "gameSeries": "Earthbound", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "22800000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_22800000-002c0002.png", - "name": "Ness", - "release": { - "au": "2015-04-25", - "eu": "2015-04-24", - "jp": "2015-04-29", - "na": "2015-05-29" - }, - "tail": "002c0002", - "type": "Figure" - }, - { - "amiiboSeries": "Shovel Knight", - "character": "Plague Knight", - "gameSeries": "Shovel Knight", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a fairy companion and player color palette matching the character", - "write": false - } - ], - "gameID": [ - "01008D100DE46000" - ], - "gameName": "Cyber Shadow" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-specific Shovel Knight remix immediately", - "write": false - } - ], - "gameID": [ - "0100830008426000" - ], - "gameName": "Just Shapes & Beats" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock character-specific challenge stages, a character-based fairy companion, and costumes for the character", - "write": false - } - ], - "gameID": [ - "010057D0021E8000" - ], - "gameName": "Shovel Knight" - }, - { - "amiiboUsage": [ - { - "Usage": "Summon a fairy friend", - "write": false - } - ], - "gameID": [ - "0100B62017E68000" - ], - "gameName": "Shovel Knight Dig" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume for the character", - "write": false - } - ], - "gameID": [ - "0100B380022AE000" - ], - "gameName": "Shovel Knight Showdown" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "35c10000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35c10000-036c0a02.png", - "name": "Plague Knight", - "release": { - "au": null, - "eu": "2019-12-10", - "jp": null, - "na": "2019-12-10" - }, - "tail": "036c0a02", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tad", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03410001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03410001-030e0502.png", - "name": "Tad", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "030e0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Penelope", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "041d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_041d0001-018a0502.png", - "name": "Penelope", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "018a0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Rosalina", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cf0401", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cf0401-02b70e02.png", - "name": "Rosalina - Golf", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02b70e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Palutena", - "gameSeries": "Kid Icarus", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "07420000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_07420000-001f0002.png", - "name": "Palutena", - "release": { - "au": "2015-07-04", - "eu": "2015-06-26", - "jp": "2015-06-11", - "na": "2015-07-24" - }, - "tail": "001f0002", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Curlos", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04cd0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04cd0001-01520502.png", - "name": "Curlos", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01520502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Samson", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04100001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04100001-007f0502.png", - "name": "Samson", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "007f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Saharah", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a60001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a60001-00500502.png", - "name": "Saharah", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00500502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Walt", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03d90001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03d90001-01a50502.png", - "name": "Walt", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01a50502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Julia", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "043b0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_043b0001-03030502.png", - "name": "Julia", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03030502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Hamlet", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "037e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_037e0001-01560502.png", - "name": "Hamlet", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01560502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Charlise", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02200001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02200001-00fd0502.png", - "name": "Charlise", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00fd0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Gonzo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03c00001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03c00001-03100502.png", - "name": "Gonzo", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03100502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Opal", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03230001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03230001-00760502.png", - "name": "Opal", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00760502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Flo", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "046c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_046c0001-008c0502.png", - "name": "Flo", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "008c0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Knox", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02a40001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02a40001-00720502.png", - "name": "Knox", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00720502", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Donkey Kong", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the character's shiny sticker", - "write": false - } - ], - "gameID": [ - "010036B0034E4000" - ], - "gameName": "Super Mario Party" - }, - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "00080000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_00080000-02640102.png", - "name": "Donkey Kong", - "release": { - "au": "2016-10-08", - "eu": "2016-10-07", - "jp": "2016-10-20", - "na": "2016-11-04" - }, - "tail": "02640102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Cherry", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "02fb0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_02fb0001-00900502.png", - "name": "Cherry", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00900502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Rover", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "018d0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018d0000-024c0502.png", - "name": "Rover", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-03-24", - "na": "2016-03-18" - }, - "tail": "024c0502", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Soleil", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "03820001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_03820001-016b0502.png", - "name": "Soleil", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "016b0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Barold", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "028d0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_028d0001-01bd0502.png", - "name": "Barold", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01bd0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Birdo", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09ce0201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09ce0201-02b00e02.png", - "name": "Birdo - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02b00e02", - "type": "Card" - }, - { - "amiiboSeries": "Super Mario Bros.", - "character": "Toad", - "gameSeries": "Super Mario", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Receive an invincibility mushroom", - "write": false - } - ], - "gameID": [ - "01009BF0072D4000" - ], - "gameName": "Captain Toad: Treasure Tracker" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01003DA010E8A000" - ], - "gameName": "Miitopia" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a particular power-up depending on the character", - "write": false - } - ], - "gameID": [ - "010028600EBDA000" - ], - "gameName": "Super Mario 3D World + Bowser's Fury" - }, - { - "amiiboUsage": [ - { - "Usage": "Receive a Spirit of the character", - "write": false - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a character-based costume", - "write": false - } - ], - "gameID": [ - "01006000040C2000" - ], - "gameName": "Yoshi's Crafted World" - } - ], - "head": "000a0000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_000a0000-00380102.png", - "name": "Toad", - "release": { - "au": "2015-03-21", - "eu": "2015-03-20", - "jp": "2015-03-12", - "na": "2015-03-20" - }, - "tail": "00380102", - "type": "Figure" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Shari", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04000001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04000001-006f0502.png", - "name": "Shari", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "006f0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Joan", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01a30001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01a30001-004a0502.png", - "name": "Joan", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "004a0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Bowser Jr.", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09ca0101", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09ca0101-029b0e02.png", - "name": "Bowser Jr. - Soccer", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "029b0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Sheldon", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04ed0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04ed0001-00620502.png", - "name": "Sheldon", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "00620502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Chester", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "028c0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_028c0001-013e0502.png", - "name": "Chester", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "013e0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Baby Luigi", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09cd0501", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09cd0501-02ae0e02.png", - "name": "Baby Luigi - Horse Racing", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02ae0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Ike", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "021f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_021f0001-03170502.png", - "name": "Ike", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "03170502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Leilani", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01970001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01970001-01770502.png", - "name": "Leilani", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "01770502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Skye", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "05140001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05140001-01530502.png", - "name": "Skye", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01530502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "C.J.", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a020001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a020001-03b30502.png", - "name": "C.J.", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03b30502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Metal Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09d00201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09d00201-02ba0e02.png", - "name": "Metal Mario - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02ba0e02", - "type": "Card" - }, - { - "amiiboSeries": "Monster Hunter Rise", - "character": "Palico", - "gameSeries": "Monster Hunter", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock special layered armor / Enter daily lottery for a variety of useful items", - "write": false - } - ], - "gameID": [ - "0100B04011742000" - ], - "gameName": "Monster Hunter Rise" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock the Hunter Sticker Set / Have Tsukino read your fortune and receive a random item", - "write": false - } - ], - "gameID": [ - "0100E21011446000" - ], - "gameName": "Monster Hunter Stories 2: Wings of Ruin" - } - ], - "head": "35090000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_35090000-04101802.png", - "name": "Palico", - "release": { - "au": "2021-03-26", - "eu": "2021-03-26", - "jp": "2021-03-26", - "na": "2021-03-26" - }, - "tail": "04101802", - "type": "Figure" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Mario", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c00201", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c00201-026a0e02.png", - "name": "Mario - Baseball", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "026a0e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Kicks", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01940001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01940001-03b60502.png", - "name": "Kicks", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03b60502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Stella", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04c80001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04c80001-02ed0502.png", - "name": "Stella", - "release": { - "au": "2016-11-10", - "eu": "2016-11-11", - "jp": "2016-11-03", - "na": "2016-12-02" - }, - "tail": "02ed0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Freya", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "05100001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_05100001-01070502.png", - "name": "Freya", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "01070502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Judy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "0a0e0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_0a0e0001-03c50502.png", - "name": "Judy", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03c50502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Peewee", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "036a0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_036a0001-019d0502.png", - "name": "Peewee", - "release": { - "au": "2016-06-18", - "eu": null, - "jp": "2016-03-24", - "na": "2016-06-10" - }, - "tail": "019d0502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Tom Nook", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "01830301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_01830301-03be0502.png", - "name": "Tom Nook - Coat", - "release": { - "au": "2021-11-05", - "eu": "2021-11-05", - "jp": "2021-11-05", - "na": "2021-11-05" - }, - "tail": "03be0502", - "type": "Card" - }, - { - "amiiboSeries": "Mario Sports Superstars", - "character": "Diddy Kong", - "gameSeries": "Mario Sports Superstars", - "gamesSwitch": [], - "head": "09c80301", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_09c80301-02930e02.png", - "name": "Diddy Kong - Tennis", - "release": { - "au": "2017-03-11", - "eu": "2017-03-10", - "jp": "2017-03-30", - "na": "2017-03-24" - }, - "tail": "02930e02", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Don Resetti", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "018f0001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_018f0001-00b30502.png", - "name": "Don Resetti", - "release": { - "au": "2015-11-21", - "eu": "2015-11-20", - "jp": "2015-10-29", - "na": "2016-01-22" - }, - "tail": "00b30502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Merengue", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04b90001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04b90001-01600502.png", - "name": "Merengue", - "release": { - "au": "2016-03-19", - "eu": "2016-03-18", - "jp": "2016-01-14", - "na": "2016-03-18" - }, - "tail": "01600502", - "type": "Card" - }, - { - "amiiboSeries": "Animal Crossing", - "character": "Muffy", - "gameSeries": "Animal Crossing", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Invite the character to your campsite and, eventually, to move to your island / Invite the character for photo shoots at Photopia / Unlock a special poster of the character / Invite the character to the Roost for a cup of coffee / Invite the character to Happy Home Paradise to design their vacation home", - "write": false - } - ], - "gameID": [ - "01006F8002326000" - ], - "gameName": "Animal Crossing: New Horizons" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock a special costume", - "write": false - } - ], - "gameID": [ - "01007EF00399C000" - ], - "gameName": "Conga Master Party!" - }, - { - "amiiboUsage": [ - { - "Usage": "Unlock an Animal Crossing-themed Mii racing suit", - "write": false - } - ], - "gameID": [ - "0100152000022000" - ], - "gameName": "Mario Kart 8 Deluxe" - } - ], - "head": "04d10001", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_04d10001-009e0502.png", - "name": "Muffy", - "release": { - "au": "2015-10-03", - "eu": "2015-10-02", - "jp": "2015-07-30", - "na": "2015-09-25" - }, - "tail": "009e0502", - "type": "Card" - }, - { - "amiiboSeries": "Xenoblade Chronicles 3", - "character": "Noah", - "gameSeries": "Xenoblade Chronicles", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the \u201cN\u2019s Consul Suit\u201d outfit for Noah as well as Noah, Lanz, and Eunie costumes without jackets", - "write": false - } - ], - "gameID": [ - "010074F013262000" - ], - "gameName": "Xenoblade Chronicles 3" - } - ], - "head": "22430000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_22430000-043d1b02.png", - "name": "Noah", - "release": { - "au": "2024-01-19", - "eu": "2024-01-19", - "jp": "2024-01-19", - "na": "2024-01-19" - }, - "tail": "043d1b02", - "type": "Figure" - }, - { - "amiiboSeries": "Xenoblade Chronicles 3", - "character": "Mio", - "gameSeries": "Xenoblade Chronicles", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Unlock the \u201cM\u2019s Consul Suit\u201d outfit for Mio as well as Mio, Sena, and Taion costumes without jackets", - "write": false - } - ], - "gameID": [ - "010074F013262000" - ], - "gameName": "Xenoblade Chronicles 3" - } - ], - "head": "22440000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_22440000-043e1b02.png", - "name": "Mio", - "release": { - "au": "2024-01-19", - "eu": "2024-01-19", - "jp": "2024-01-19", - "na": "2024-01-19" - }, - "tail": "043e1b02", - "type": "Figure" - }, - { - "amiiboSeries": "Super Smash Bros.", - "character": "Sora", - "gameSeries": "Kingdom Hearts", - "gamesSwitch": [ - { - "amiiboUsage": [ - { - "Usage": "Battle and train up a computer-controlled Figure Player of the character", - "write": true - } - ], - "gameID": [ - "01006A800016E000" - ], - "gameName": "Super Smash Bros. Ultimate" - } - ], - "head": "3f000000", - "image": "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/images/icon_3f000000-042e0002.png", - "name": "Sora", - "release": { - "au": "2024-02-16", - "eu": "2024-02-16", - "jp": "2024-02-16", - "na": "2024-02-16" - }, - "tail": "042e0002", - "type": "Figure" - } - ], - "lastUpdated": "2024-11-17T15:28:47.035619" -} diff --git a/assets/amiibo/images/icon_00000000-00000002.png b/assets/amiibo/images/icon_00000000-00000002.png deleted file mode 100644 index 7e238140d..000000000 Binary files a/assets/amiibo/images/icon_00000000-00000002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00000000-00340102.png b/assets/amiibo/images/icon_00000000-00340102.png deleted file mode 100644 index 0566243de..000000000 Binary files a/assets/amiibo/images/icon_00000000-00340102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00000000-003c0102.png b/assets/amiibo/images/icon_00000000-003c0102.png deleted file mode 100644 index 0c93ab0dd..000000000 Binary files a/assets/amiibo/images/icon_00000000-003c0102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00000000-003d0102.png b/assets/amiibo/images/icon_00000000-003d0102.png deleted file mode 100644 index ceb3232b1..000000000 Binary files a/assets/amiibo/images/icon_00000000-003d0102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00000000-02380602.png b/assets/amiibo/images/icon_00000000-02380602.png deleted file mode 100644 index e17bfa297..000000000 Binary files a/assets/amiibo/images/icon_00000000-02380602.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00000000-02390602.png b/assets/amiibo/images/icon_00000000-02390602.png deleted file mode 100644 index 71293f2d6..000000000 Binary files a/assets/amiibo/images/icon_00000000-02390602.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00000000-03710102.png b/assets/amiibo/images/icon_00000000-03710102.png deleted file mode 100644 index b42ada43b..000000000 Binary files a/assets/amiibo/images/icon_00000000-03710102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00000003-039bff02.png b/assets/amiibo/images/icon_00000003-039bff02.png deleted file mode 100644 index c7e12e520..000000000 Binary files a/assets/amiibo/images/icon_00000003-039bff02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00000003-0430ff02.png b/assets/amiibo/images/icon_00000003-0430ff02.png deleted file mode 100644 index 188b8b1ea..000000000 Binary files a/assets/amiibo/images/icon_00000003-0430ff02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00000100-00190002.png b/assets/amiibo/images/icon_00000100-00190002.png deleted file mode 100644 index 0a61be06e..000000000 Binary files a/assets/amiibo/images/icon_00000100-00190002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00000300-03a60102.png b/assets/amiibo/images/icon_00000300-03a60102.png deleted file mode 100644 index e76e47ac2..000000000 Binary files a/assets/amiibo/images/icon_00000300-03a60102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00010000-000c0002.png b/assets/amiibo/images/icon_00010000-000c0002.png deleted file mode 100644 index 4c34aae16..000000000 Binary files a/assets/amiibo/images/icon_00010000-000c0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00010000-00350102.png b/assets/amiibo/images/icon_00010000-00350102.png deleted file mode 100644 index d51680212..000000000 Binary files a/assets/amiibo/images/icon_00010000-00350102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00010003-039cff02.png b/assets/amiibo/images/icon_00010003-039cff02.png deleted file mode 100644 index 5c91d4319..000000000 Binary files a/assets/amiibo/images/icon_00010003-039cff02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00020000-00010002.png b/assets/amiibo/images/icon_00020000-00010002.png deleted file mode 100644 index b90bbbd21..000000000 Binary files a/assets/amiibo/images/icon_00020000-00010002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00020000-00360102.png b/assets/amiibo/images/icon_00020000-00360102.png deleted file mode 100644 index 69e45a3ab..000000000 Binary files a/assets/amiibo/images/icon_00020000-00360102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00020000-03720102.png b/assets/amiibo/images/icon_00020000-03720102.png deleted file mode 100644 index 0808fc2ab..000000000 Binary files a/assets/amiibo/images/icon_00020000-03720102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00020003-039dff02.png b/assets/amiibo/images/icon_00020003-039dff02.png deleted file mode 100644 index 2e62af9e4..000000000 Binary files a/assets/amiibo/images/icon_00020003-039dff02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00020100-03a70102.png b/assets/amiibo/images/icon_00020100-03a70102.png deleted file mode 100644 index dac040cac..000000000 Binary files a/assets/amiibo/images/icon_00020100-03a70102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00030000-00020002.png b/assets/amiibo/images/icon_00030000-00020002.png deleted file mode 100644 index 1b3b1f81a..000000000 Binary files a/assets/amiibo/images/icon_00030000-00020002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00030000-00370102.png b/assets/amiibo/images/icon_00030000-00370102.png deleted file mode 100644 index 337dc3db2..000000000 Binary files a/assets/amiibo/images/icon_00030000-00370102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00030003-039fff02.png b/assets/amiibo/images/icon_00030003-039fff02.png deleted file mode 100644 index ec3ce7a9c..000000000 Binary files a/assets/amiibo/images/icon_00030003-039fff02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00030102-00410302.png b/assets/amiibo/images/icon_00030102-00410302.png deleted file mode 100644 index 518e40610..000000000 Binary files a/assets/amiibo/images/icon_00030102-00410302.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00030102-00420302.png b/assets/amiibo/images/icon_00030102-00420302.png deleted file mode 100644 index 51945ca20..000000000 Binary files a/assets/amiibo/images/icon_00030102-00420302.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00030102-00430302.png b/assets/amiibo/images/icon_00030102-00430302.png deleted file mode 100644 index b426fbaf5..000000000 Binary files a/assets/amiibo/images/icon_00030102-00430302.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00030102-023e0302.png b/assets/amiibo/images/icon_00030102-023e0302.png deleted file mode 100644 index 3f1396ad9..000000000 Binary files a/assets/amiibo/images/icon_00030102-023e0302.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00040000-02620102.png b/assets/amiibo/images/icon_00040000-02620102.png deleted file mode 100644 index 29a96ae90..000000000 Binary files a/assets/amiibo/images/icon_00040000-02620102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00040100-00130002.png b/assets/amiibo/images/icon_00040100-00130002.png deleted file mode 100644 index 3399daf93..000000000 Binary files a/assets/amiibo/images/icon_00040100-00130002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00050000-00140002.png b/assets/amiibo/images/icon_00050000-00140002.png deleted file mode 100644 index 76f480d03..000000000 Binary files a/assets/amiibo/images/icon_00050000-00140002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00050000-00390102.png b/assets/amiibo/images/icon_00050000-00390102.png deleted file mode 100644 index 23a574d6c..000000000 Binary files a/assets/amiibo/images/icon_00050000-00390102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00050000-03730102.png b/assets/amiibo/images/icon_00050000-03730102.png deleted file mode 100644 index 59ef48e1e..000000000 Binary files a/assets/amiibo/images/icon_00050000-03730102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0005ff00-023a0702.png b/assets/amiibo/images/icon_0005ff00-023a0702.png deleted file mode 100644 index ba99e5a18..000000000 Binary files a/assets/amiibo/images/icon_0005ff00-023a0702.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00060000-00150002.png b/assets/amiibo/images/icon_00060000-00150002.png deleted file mode 100644 index 307d0981d..000000000 Binary files a/assets/amiibo/images/icon_00060000-00150002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00070000-001a0002.png b/assets/amiibo/images/icon_00070000-001a0002.png deleted file mode 100644 index 97e3c66fa..000000000 Binary files a/assets/amiibo/images/icon_00070000-001a0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00070000-02630102.png b/assets/amiibo/images/icon_00070000-02630102.png deleted file mode 100644 index aed740985..000000000 Binary files a/assets/amiibo/images/icon_00070000-02630102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00080000-00030002.png b/assets/amiibo/images/icon_00080000-00030002.png deleted file mode 100644 index 5b43fc4f4..000000000 Binary files a/assets/amiibo/images/icon_00080000-00030002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00080000-02640102.png b/assets/amiibo/images/icon_00080000-02640102.png deleted file mode 100644 index f4a6d291a..000000000 Binary files a/assets/amiibo/images/icon_00080000-02640102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0008ff00-023b0702.png b/assets/amiibo/images/icon_0008ff00-023b0702.png deleted file mode 100644 index f4869fee9..000000000 Binary files a/assets/amiibo/images/icon_0008ff00-023b0702.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00090000-000d0002.png b/assets/amiibo/images/icon_00090000-000d0002.png deleted file mode 100644 index 43f563daf..000000000 Binary files a/assets/amiibo/images/icon_00090000-000d0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00090000-02650102.png b/assets/amiibo/images/icon_00090000-02650102.png deleted file mode 100644 index 6219c458d..000000000 Binary files a/assets/amiibo/images/icon_00090000-02650102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_000a0000-00380102.png b/assets/amiibo/images/icon_000a0000-00380102.png deleted file mode 100644 index 0da5fbdfd..000000000 Binary files a/assets/amiibo/images/icon_000a0000-00380102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_000a0003-03a0ff02.png b/assets/amiibo/images/icon_000a0003-03a0ff02.png deleted file mode 100644 index c638956e7..000000000 Binary files a/assets/amiibo/images/icon_000a0003-03a0ff02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00130000-02660102.png b/assets/amiibo/images/icon_00130000-02660102.png deleted file mode 100644 index 502850e8f..000000000 Binary files a/assets/amiibo/images/icon_00130000-02660102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00130000-037a0002.png b/assets/amiibo/images/icon_00130000-037a0002.png deleted file mode 100644 index cc5d09782..000000000 Binary files a/assets/amiibo/images/icon_00130000-037a0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00130003-039eff02.png b/assets/amiibo/images/icon_00130003-039eff02.png deleted file mode 100644 index 215ea5bcc..000000000 Binary files a/assets/amiibo/images/icon_00130003-039eff02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00140000-02670102.png b/assets/amiibo/images/icon_00140000-02670102.png deleted file mode 100644 index e04bba004..000000000 Binary files a/assets/amiibo/images/icon_00140000-02670102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00150000-03670102.png b/assets/amiibo/images/icon_00150000-03670102.png deleted file mode 100644 index 76524c612..000000000 Binary files a/assets/amiibo/images/icon_00150000-03670102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00170000-02680102.png b/assets/amiibo/images/icon_00170000-02680102.png deleted file mode 100644 index 0b93845c4..000000000 Binary files a/assets/amiibo/images/icon_00170000-02680102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00230000-03680102.png b/assets/amiibo/images/icon_00230000-03680102.png deleted file mode 100644 index d3e966cf4..000000000 Binary files a/assets/amiibo/images/icon_00230000-03680102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00240000-038d0002.png b/assets/amiibo/images/icon_00240000-038d0002.png deleted file mode 100644 index 1b06313b5..000000000 Binary files a/assets/amiibo/images/icon_00240000-038d0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00800102-035d0302.png b/assets/amiibo/images/icon_00800102-035d0302.png deleted file mode 100644 index 1b0bb1f9f..000000000 Binary files a/assets/amiibo/images/icon_00800102-035d0302.png and /dev/null differ diff --git a/assets/amiibo/images/icon_00c00000-037b0002.png b/assets/amiibo/images/icon_00c00000-037b0002.png deleted file mode 100644 index 2ecb86bb9..000000000 Binary files a/assets/amiibo/images/icon_00c00000-037b0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-00040002.png b/assets/amiibo/images/icon_01000000-00040002.png deleted file mode 100644 index 89db88178..000000000 Binary files a/assets/amiibo/images/icon_01000000-00040002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-034b0902.png b/assets/amiibo/images/icon_01000000-034b0902.png deleted file mode 100644 index d76fc5f51..000000000 Binary files a/assets/amiibo/images/icon_01000000-034b0902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-034c0902.png b/assets/amiibo/images/icon_01000000-034c0902.png deleted file mode 100644 index d0fefccda..000000000 Binary files a/assets/amiibo/images/icon_01000000-034c0902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-034d0902.png b/assets/amiibo/images/icon_01000000-034d0902.png deleted file mode 100644 index 5e75dcfa4..000000000 Binary files a/assets/amiibo/images/icon_01000000-034d0902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-034e0902.png b/assets/amiibo/images/icon_01000000-034e0902.png deleted file mode 100644 index aef55553f..000000000 Binary files a/assets/amiibo/images/icon_01000000-034e0902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-034f0902.png b/assets/amiibo/images/icon_01000000-034f0902.png deleted file mode 100644 index 11a59e917..000000000 Binary files a/assets/amiibo/images/icon_01000000-034f0902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-03530902.png b/assets/amiibo/images/icon_01000000-03530902.png deleted file mode 100644 index 46d157378..000000000 Binary files a/assets/amiibo/images/icon_01000000-03530902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-03540902.png b/assets/amiibo/images/icon_01000000-03540902.png deleted file mode 100644 index 23c61e036..000000000 Binary files a/assets/amiibo/images/icon_01000000-03540902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-037c0002.png b/assets/amiibo/images/icon_01000000-037c0002.png deleted file mode 100644 index 95dec8361..000000000 Binary files a/assets/amiibo/images/icon_01000000-037c0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-03990902.png b/assets/amiibo/images/icon_01000000-03990902.png deleted file mode 100644 index 37d7a0db0..000000000 Binary files a/assets/amiibo/images/icon_01000000-03990902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000000-04180902.png b/assets/amiibo/images/icon_01000000-04180902.png deleted file mode 100644 index 939071f54..000000000 Binary files a/assets/amiibo/images/icon_01000000-04180902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000100-00160002.png b/assets/amiibo/images/icon_01000100-00160002.png deleted file mode 100644 index 2d8738b53..000000000 Binary files a/assets/amiibo/images/icon_01000100-00160002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01000100-03500902.png b/assets/amiibo/images/icon_01000100-03500902.png deleted file mode 100644 index bbb04cd21..000000000 Binary files a/assets/amiibo/images/icon_01000100-03500902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01010000-000e0002.png b/assets/amiibo/images/icon_01010000-000e0002.png deleted file mode 100644 index b399f67a1..000000000 Binary files a/assets/amiibo/images/icon_01010000-000e0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01010000-03520902.png b/assets/amiibo/images/icon_01010000-03520902.png deleted file mode 100644 index c2259a606..000000000 Binary files a/assets/amiibo/images/icon_01010000-03520902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01010000-03560902.png b/assets/amiibo/images/icon_01010000-03560902.png deleted file mode 100644 index 8d336a55d..000000000 Binary files a/assets/amiibo/images/icon_01010000-03560902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01010000-04190902.png b/assets/amiibo/images/icon_01010000-04190902.png deleted file mode 100644 index 155656e7c..000000000 Binary files a/assets/amiibo/images/icon_01010000-04190902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01010100-00170002.png b/assets/amiibo/images/icon_01010100-00170002.png deleted file mode 100644 index 418b500f7..000000000 Binary files a/assets/amiibo/images/icon_01010100-00170002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01010300-04140902.png b/assets/amiibo/images/icon_01010300-04140902.png deleted file mode 100644 index c1db27252..000000000 Binary files a/assets/amiibo/images/icon_01010300-04140902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01020100-001b0002.png b/assets/amiibo/images/icon_01020100-001b0002.png deleted file mode 100644 index 8a5b3a0a2..000000000 Binary files a/assets/amiibo/images/icon_01020100-001b0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01020100-041a0902.png b/assets/amiibo/images/icon_01020100-041a0902.png deleted file mode 100644 index f1729e327..000000000 Binary files a/assets/amiibo/images/icon_01020100-041a0902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01030000-024f0902.png b/assets/amiibo/images/icon_01030000-024f0902.png deleted file mode 100644 index e044af322..000000000 Binary files a/assets/amiibo/images/icon_01030000-024f0902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01050000-03580902.png b/assets/amiibo/images/icon_01050000-03580902.png deleted file mode 100644 index 4680bbbd6..000000000 Binary files a/assets/amiibo/images/icon_01050000-03580902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01060000-03590902.png b/assets/amiibo/images/icon_01060000-03590902.png deleted file mode 100644 index 18c1b0f11..000000000 Binary files a/assets/amiibo/images/icon_01060000-03590902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01070000-035a0902.png b/assets/amiibo/images/icon_01070000-035a0902.png deleted file mode 100644 index 19971ab00..000000000 Binary files a/assets/amiibo/images/icon_01070000-035a0902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01080000-035b0902.png b/assets/amiibo/images/icon_01080000-035b0902.png deleted file mode 100644 index 215829c7b..000000000 Binary files a/assets/amiibo/images/icon_01080000-035b0902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01400000-03550902.png b/assets/amiibo/images/icon_01400000-03550902.png deleted file mode 100644 index 8d669c7f8..000000000 Binary files a/assets/amiibo/images/icon_01400000-03550902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01410000-035c0902.png b/assets/amiibo/images/icon_01410000-035c0902.png deleted file mode 100644 index d09e84278..000000000 Binary files a/assets/amiibo/images/icon_01410000-035c0902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01800000-00080002.png b/assets/amiibo/images/icon_01800000-00080002.png deleted file mode 100644 index 3c229cb35..000000000 Binary files a/assets/amiibo/images/icon_01800000-00080002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01810000-024b0502.png b/assets/amiibo/images/icon_01810000-024b0502.png deleted file mode 100644 index 9cdfdf5ac..000000000 Binary files a/assets/amiibo/images/icon_01810000-024b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01810000-037d0002.png b/assets/amiibo/images/icon_01810000-037d0002.png deleted file mode 100644 index c46642153..000000000 Binary files a/assets/amiibo/images/icon_01810000-037d0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01810001-00440502.png b/assets/amiibo/images/icon_01810001-00440502.png deleted file mode 100644 index 0d4439f02..000000000 Binary files a/assets/amiibo/images/icon_01810001-00440502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01810001-01d40502.png b/assets/amiibo/images/icon_01810001-01d40502.png deleted file mode 100644 index fb6e5c8ad..000000000 Binary files a/assets/amiibo/images/icon_01810001-01d40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01810100-023f0502.png b/assets/amiibo/images/icon_01810100-023f0502.png deleted file mode 100644 index 26a5c0c11..000000000 Binary files a/assets/amiibo/images/icon_01810100-023f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01810101-00b40502.png b/assets/amiibo/images/icon_01810101-00b40502.png deleted file mode 100644 index d5a901289..000000000 Binary files a/assets/amiibo/images/icon_01810101-00b40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01810201-011a0502.png b/assets/amiibo/images/icon_01810201-011a0502.png deleted file mode 100644 index 22dc77e1f..000000000 Binary files a/assets/amiibo/images/icon_01810201-011a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01810301-01700502.png b/assets/amiibo/images/icon_01810301-01700502.png deleted file mode 100644 index bdd969b3a..000000000 Binary files a/assets/amiibo/images/icon_01810301-01700502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01810401-03aa0502.png b/assets/amiibo/images/icon_01810401-03aa0502.png deleted file mode 100644 index 44e646f67..000000000 Binary files a/assets/amiibo/images/icon_01810401-03aa0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01810501-03bf0502.png b/assets/amiibo/images/icon_01810501-03bf0502.png deleted file mode 100644 index 97c89b5fb..000000000 Binary files a/assets/amiibo/images/icon_01810501-03bf0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01820000-02400502.png b/assets/amiibo/images/icon_01820000-02400502.png deleted file mode 100644 index fae58f523..000000000 Binary files a/assets/amiibo/images/icon_01820000-02400502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01820001-00a80502.png b/assets/amiibo/images/icon_01820001-00a80502.png deleted file mode 100644 index aedee2c99..000000000 Binary files a/assets/amiibo/images/icon_01820001-00a80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01820001-01d80502.png b/assets/amiibo/images/icon_01820001-01d80502.png deleted file mode 100644 index f31ded694..000000000 Binary files a/assets/amiibo/images/icon_01820001-01d80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01820001-03b20502.png b/assets/amiibo/images/icon_01820001-03b20502.png deleted file mode 100644 index 974b4415d..000000000 Binary files a/assets/amiibo/images/icon_01820001-03b20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01820101-00460502.png b/assets/amiibo/images/icon_01820101-00460502.png deleted file mode 100644 index 4eee12a4d..000000000 Binary files a/assets/amiibo/images/icon_01820101-00460502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01830000-02420502.png b/assets/amiibo/images/icon_01830000-02420502.png deleted file mode 100644 index df6a8df77..000000000 Binary files a/assets/amiibo/images/icon_01830000-02420502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01830001-00450502.png b/assets/amiibo/images/icon_01830001-00450502.png deleted file mode 100644 index e7a8edd06..000000000 Binary files a/assets/amiibo/images/icon_01830001-00450502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01830101-010e0502.png b/assets/amiibo/images/icon_01830101-010e0502.png deleted file mode 100644 index c397bc1c4..000000000 Binary files a/assets/amiibo/images/icon_01830101-010e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01830201-03a80502.png b/assets/amiibo/images/icon_01830201-03a80502.png deleted file mode 100644 index 7c53003ea..000000000 Binary files a/assets/amiibo/images/icon_01830201-03a80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01830301-03be0502.png b/assets/amiibo/images/icon_01830301-03be0502.png deleted file mode 100644 index a25b00bd9..000000000 Binary files a/assets/amiibo/images/icon_01830301-03be0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01840000-024d0502.png b/assets/amiibo/images/icon_01840000-024d0502.png deleted file mode 100644 index af0b9c5ae..000000000 Binary files a/assets/amiibo/images/icon_01840000-024d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01840501-03a90502.png b/assets/amiibo/images/icon_01840501-03a90502.png deleted file mode 100644 index 6f3dd2672..000000000 Binary files a/assets/amiibo/images/icon_01840501-03a90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01850001-004b0502.png b/assets/amiibo/images/icon_01850001-004b0502.png deleted file mode 100644 index 70043a090..000000000 Binary files a/assets/amiibo/images/icon_01850001-004b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01850201-01170502.png b/assets/amiibo/images/icon_01850201-01170502.png deleted file mode 100644 index d3950e2bd..000000000 Binary files a/assets/amiibo/images/icon_01850201-01170502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01850401-01790502.png b/assets/amiibo/images/icon_01850401-01790502.png deleted file mode 100644 index 2f49cc6e2..000000000 Binary files a/assets/amiibo/images/icon_01850401-01790502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01860101-00af0502.png b/assets/amiibo/images/icon_01860101-00af0502.png deleted file mode 100644 index a75b5ddc5..000000000 Binary files a/assets/amiibo/images/icon_01860101-00af0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01860301-01750502.png b/assets/amiibo/images/icon_01860301-01750502.png deleted file mode 100644 index 82075f79e..000000000 Binary files a/assets/amiibo/images/icon_01860301-01750502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01870001-00470502.png b/assets/amiibo/images/icon_01870001-00470502.png deleted file mode 100644 index e068c1e52..000000000 Binary files a/assets/amiibo/images/icon_01870001-00470502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01870001-03b00502.png b/assets/amiibo/images/icon_01870001-03b00502.png deleted file mode 100644 index 736abcaec..000000000 Binary files a/assets/amiibo/images/icon_01870001-03b00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01880000-02410502.png b/assets/amiibo/images/icon_01880000-02410502.png deleted file mode 100644 index cbfef0032..000000000 Binary files a/assets/amiibo/images/icon_01880000-02410502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01880001-01120502.png b/assets/amiibo/images/icon_01880001-01120502.png deleted file mode 100644 index 1167638f9..000000000 Binary files a/assets/amiibo/images/icon_01880001-01120502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01880001-03af0502.png b/assets/amiibo/images/icon_01880001-03af0502.png deleted file mode 100644 index 6e162e6d3..000000000 Binary files a/assets/amiibo/images/icon_01880001-03af0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01890001-00ab0502.png b/assets/amiibo/images/icon_01890001-00ab0502.png deleted file mode 100644 index a96ad753e..000000000 Binary files a/assets/amiibo/images/icon_01890001-00ab0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01890101-03b10502.png b/assets/amiibo/images/icon_01890101-03b10502.png deleted file mode 100644 index c973f9e65..000000000 Binary files a/assets/amiibo/images/icon_01890101-03b10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018a0000-02450502.png b/assets/amiibo/images/icon_018a0000-02450502.png deleted file mode 100644 index 29bcf9427..000000000 Binary files a/assets/amiibo/images/icon_018a0000-02450502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018a0001-00a90502.png b/assets/amiibo/images/icon_018a0001-00a90502.png deleted file mode 100644 index a08a53e75..000000000 Binary files a/assets/amiibo/images/icon_018a0001-00a90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018b0000-02460502.png b/assets/amiibo/images/icon_018b0000-02460502.png deleted file mode 100644 index d3ca3157f..000000000 Binary files a/assets/amiibo/images/icon_018b0000-02460502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018b0001-01150502.png b/assets/amiibo/images/icon_018b0001-01150502.png deleted file mode 100644 index 0b50ed0d0..000000000 Binary files a/assets/amiibo/images/icon_018b0001-01150502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018c0000-02430502.png b/assets/amiibo/images/icon_018c0000-02430502.png deleted file mode 100644 index 5b8af1a5e..000000000 Binary files a/assets/amiibo/images/icon_018c0000-02430502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018c0001-004c0502.png b/assets/amiibo/images/icon_018c0001-004c0502.png deleted file mode 100644 index c67f64bbc..000000000 Binary files a/assets/amiibo/images/icon_018c0001-004c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018c0101-01180502.png b/assets/amiibo/images/icon_018c0101-01180502.png deleted file mode 100644 index 93fbe1bce..000000000 Binary files a/assets/amiibo/images/icon_018c0101-01180502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018d0000-024c0502.png b/assets/amiibo/images/icon_018d0000-024c0502.png deleted file mode 100644 index 38c2dcb37..000000000 Binary files a/assets/amiibo/images/icon_018d0000-024c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018d0001-010c0502.png b/assets/amiibo/images/icon_018d0001-010c0502.png deleted file mode 100644 index fb328b1c0..000000000 Binary files a/assets/amiibo/images/icon_018d0001-010c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018e0000-02490502.png b/assets/amiibo/images/icon_018e0000-02490502.png deleted file mode 100644 index f27bd19fa..000000000 Binary files a/assets/amiibo/images/icon_018e0000-02490502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018e0001-00490502.png b/assets/amiibo/images/icon_018e0001-00490502.png deleted file mode 100644 index d3f5e504b..000000000 Binary files a/assets/amiibo/images/icon_018e0001-00490502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018e0101-01780502.png b/assets/amiibo/images/icon_018e0101-01780502.png deleted file mode 100644 index fb579f84d..000000000 Binary files a/assets/amiibo/images/icon_018e0101-01780502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018f0001-00b30502.png b/assets/amiibo/images/icon_018f0001-00b30502.png deleted file mode 100644 index 5c8bf0d0d..000000000 Binary files a/assets/amiibo/images/icon_018f0001-00b30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_018f0101-01190502.png b/assets/amiibo/images/icon_018f0101-01190502.png deleted file mode 100644 index 805ae3eb4..000000000 Binary files a/assets/amiibo/images/icon_018f0101-01190502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01900001-01710502.png b/assets/amiibo/images/icon_01900001-01710502.png deleted file mode 100644 index df82724d5..000000000 Binary files a/assets/amiibo/images/icon_01900001-01710502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01910001-004e0502.png b/assets/amiibo/images/icon_01910001-004e0502.png deleted file mode 100644 index 62ab4d28a..000000000 Binary files a/assets/amiibo/images/icon_01910001-004e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01920000-02470502.png b/assets/amiibo/images/icon_01920000-02470502.png deleted file mode 100644 index c605f10dd..000000000 Binary files a/assets/amiibo/images/icon_01920000-02470502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01920001-010d0502.png b/assets/amiibo/images/icon_01920001-010d0502.png deleted file mode 100644 index 465c7d348..000000000 Binary files a/assets/amiibo/images/icon_01920001-010d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01920001-03ad0502.png b/assets/amiibo/images/icon_01920001-03ad0502.png deleted file mode 100644 index 371e97846..000000000 Binary files a/assets/amiibo/images/icon_01920001-03ad0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01930000-02480502.png b/assets/amiibo/images/icon_01930000-02480502.png deleted file mode 100644 index 033acf278..000000000 Binary files a/assets/amiibo/images/icon_01930000-02480502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01930001-01740502.png b/assets/amiibo/images/icon_01930001-01740502.png deleted file mode 100644 index 3ccafabe9..000000000 Binary files a/assets/amiibo/images/icon_01930001-01740502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01930001-03ae0502.png b/assets/amiibo/images/icon_01930001-03ae0502.png deleted file mode 100644 index 7d85c371c..000000000 Binary files a/assets/amiibo/images/icon_01930001-03ae0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01940000-024a0502.png b/assets/amiibo/images/icon_01940000-024a0502.png deleted file mode 100644 index 5d0571c61..000000000 Binary files a/assets/amiibo/images/icon_01940000-024a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01940001-00aa0502.png b/assets/amiibo/images/icon_01940001-00aa0502.png deleted file mode 100644 index 8fbaa48ab..000000000 Binary files a/assets/amiibo/images/icon_01940001-00aa0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01940001-03b60502.png b/assets/amiibo/images/icon_01940001-03b60502.png deleted file mode 100644 index 5ce1e16ad..000000000 Binary files a/assets/amiibo/images/icon_01940001-03b60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01950001-00b00502.png b/assets/amiibo/images/icon_01950001-00b00502.png deleted file mode 100644 index 31e3f7c4a..000000000 Binary files a/assets/amiibo/images/icon_01950001-00b00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01960000-024e0502.png b/assets/amiibo/images/icon_01960000-024e0502.png deleted file mode 100644 index 3eb260263..000000000 Binary files a/assets/amiibo/images/icon_01960000-024e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01960001-00480502.png b/assets/amiibo/images/icon_01960001-00480502.png deleted file mode 100644 index 2b5f81c6f..000000000 Binary files a/assets/amiibo/images/icon_01960001-00480502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01970001-01770502.png b/assets/amiibo/images/icon_01970001-01770502.png deleted file mode 100644 index 64d3a0cee..000000000 Binary files a/assets/amiibo/images/icon_01970001-01770502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01980001-00b10502.png b/assets/amiibo/images/icon_01980001-00b10502.png deleted file mode 100644 index 5b0fed906..000000000 Binary files a/assets/amiibo/images/icon_01980001-00b10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01990001-01160502.png b/assets/amiibo/images/icon_01990001-01160502.png deleted file mode 100644 index 1fba27a52..000000000 Binary files a/assets/amiibo/images/icon_01990001-01160502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_019a0001-00b70502.png b/assets/amiibo/images/icon_019a0001-00b70502.png deleted file mode 100644 index 03723b3e9..000000000 Binary files a/assets/amiibo/images/icon_019a0001-00b70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_019b0001-00b60502.png b/assets/amiibo/images/icon_019b0001-00b60502.png deleted file mode 100644 index f1a8d4730..000000000 Binary files a/assets/amiibo/images/icon_019b0001-00b60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_019c0001-01730502.png b/assets/amiibo/images/icon_019c0001-01730502.png deleted file mode 100644 index bacbaa11e..000000000 Binary files a/assets/amiibo/images/icon_019c0001-01730502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_019d0001-00ac0502.png b/assets/amiibo/images/icon_019d0001-00ac0502.png deleted file mode 100644 index fbc0976fd..000000000 Binary files a/assets/amiibo/images/icon_019d0001-00ac0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_019e0001-00ad0502.png b/assets/amiibo/images/icon_019e0001-00ad0502.png deleted file mode 100644 index 16ed5854f..000000000 Binary files a/assets/amiibo/images/icon_019e0001-00ad0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_019f0001-01110502.png b/assets/amiibo/images/icon_019f0001-01110502.png deleted file mode 100644 index 42d0ae64e..000000000 Binary files a/assets/amiibo/images/icon_019f0001-01110502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a00001-010f0502.png b/assets/amiibo/images/icon_01a00001-010f0502.png deleted file mode 100644 index 76283ef27..000000000 Binary files a/assets/amiibo/images/icon_01a00001-010f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a10001-01100502.png b/assets/amiibo/images/icon_01a10001-01100502.png deleted file mode 100644 index 9f09fbced..000000000 Binary files a/assets/amiibo/images/icon_01a10001-01100502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a20001-017d0502.png b/assets/amiibo/images/icon_01a20001-017d0502.png deleted file mode 100644 index 821fb22f7..000000000 Binary files a/assets/amiibo/images/icon_01a20001-017d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a20001-03b90502.png b/assets/amiibo/images/icon_01a20001-03b90502.png deleted file mode 100644 index 768c08f4f..000000000 Binary files a/assets/amiibo/images/icon_01a20001-03b90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a30001-004a0502.png b/assets/amiibo/images/icon_01a30001-004a0502.png deleted file mode 100644 index c7c3ac4f3..000000000 Binary files a/assets/amiibo/images/icon_01a30001-004a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a40001-004d0502.png b/assets/amiibo/images/icon_01a40001-004d0502.png deleted file mode 100644 index b7fc5a5ca..000000000 Binary files a/assets/amiibo/images/icon_01a40001-004d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a50001-01720502.png b/assets/amiibo/images/icon_01a50001-01720502.png deleted file mode 100644 index c2606e78c..000000000 Binary files a/assets/amiibo/images/icon_01a50001-01720502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a60001-00500502.png b/assets/amiibo/images/icon_01a60001-00500502.png deleted file mode 100644 index e1979133e..000000000 Binary files a/assets/amiibo/images/icon_01a60001-00500502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a60001-03b70502.png b/assets/amiibo/images/icon_01a60001-03b70502.png deleted file mode 100644 index 4679e138a..000000000 Binary files a/assets/amiibo/images/icon_01a60001-03b70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a70001-01140502.png b/assets/amiibo/images/icon_01a70001-01140502.png deleted file mode 100644 index 40d9725c6..000000000 Binary files a/assets/amiibo/images/icon_01a70001-01140502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a80001-004f0502.png b/assets/amiibo/images/icon_01a80001-004f0502.png deleted file mode 100644 index 45f21ea13..000000000 Binary files a/assets/amiibo/images/icon_01a80001-004f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a80101-017e0502.png b/assets/amiibo/images/icon_01a80101-017e0502.png deleted file mode 100644 index f5df61dfa..000000000 Binary files a/assets/amiibo/images/icon_01a80101-017e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01a90001-01760502.png b/assets/amiibo/images/icon_01a90001-01760502.png deleted file mode 100644 index 67651098f..000000000 Binary files a/assets/amiibo/images/icon_01a90001-01760502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01aa0001-00530502.png b/assets/amiibo/images/icon_01aa0001-00530502.png deleted file mode 100644 index a68c51f4d..000000000 Binary files a/assets/amiibo/images/icon_01aa0001-00530502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01ab0001-017c0502.png b/assets/amiibo/images/icon_01ab0001-017c0502.png deleted file mode 100644 index 345a0e7f6..000000000 Binary files a/assets/amiibo/images/icon_01ab0001-017c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01ac0001-017f0502.png b/assets/amiibo/images/icon_01ac0001-017f0502.png deleted file mode 100644 index 9a54b2bfa..000000000 Binary files a/assets/amiibo/images/icon_01ac0001-017f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01ad0001-00b80502.png b/assets/amiibo/images/icon_01ad0001-00b80502.png deleted file mode 100644 index 78ec67d2d..000000000 Binary files a/assets/amiibo/images/icon_01ad0001-00b80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01ae0001-011b0502.png b/assets/amiibo/images/icon_01ae0001-011b0502.png deleted file mode 100644 index b12d3c1e2..000000000 Binary files a/assets/amiibo/images/icon_01ae0001-011b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01af0001-011c0502.png b/assets/amiibo/images/icon_01af0001-011c0502.png deleted file mode 100644 index 0b4e4ac27..000000000 Binary files a/assets/amiibo/images/icon_01af0001-011c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01b00001-00520502.png b/assets/amiibo/images/icon_01b00001-00520502.png deleted file mode 100644 index 57f138b37..000000000 Binary files a/assets/amiibo/images/icon_01b00001-00520502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01b10001-00b20502.png b/assets/amiibo/images/icon_01b10001-00b20502.png deleted file mode 100644 index 7a1fbef4f..000000000 Binary files a/assets/amiibo/images/icon_01b10001-00b20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01b10101-017b0502.png b/assets/amiibo/images/icon_01b10101-017b0502.png deleted file mode 100644 index eac173ad6..000000000 Binary files a/assets/amiibo/images/icon_01b10101-017b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01b30001-00b50502.png b/assets/amiibo/images/icon_01b30001-00b50502.png deleted file mode 100644 index 4a9db5473..000000000 Binary files a/assets/amiibo/images/icon_01b30001-00b50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01b40001-01130502.png b/assets/amiibo/images/icon_01b40001-01130502.png deleted file mode 100644 index 426021a34..000000000 Binary files a/assets/amiibo/images/icon_01b40001-01130502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01b50001-00510502.png b/assets/amiibo/images/icon_01b50001-00510502.png deleted file mode 100644 index 5f2979eff..000000000 Binary files a/assets/amiibo/images/icon_01b50001-00510502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01b60001-00ae0502.png b/assets/amiibo/images/icon_01b60001-00ae0502.png deleted file mode 100644 index ff7b9006d..000000000 Binary files a/assets/amiibo/images/icon_01b60001-00ae0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01c10000-02440502.png b/assets/amiibo/images/icon_01c10000-02440502.png deleted file mode 100644 index 9707816af..000000000 Binary files a/assets/amiibo/images/icon_01c10000-02440502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01c10001-00540502.png b/assets/amiibo/images/icon_01c10001-00540502.png deleted file mode 100644 index 3971b1a63..000000000 Binary files a/assets/amiibo/images/icon_01c10001-00540502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01c10101-017a0502.png b/assets/amiibo/images/icon_01c10101-017a0502.png deleted file mode 100644 index ee4f4a096..000000000 Binary files a/assets/amiibo/images/icon_01c10101-017a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_01c10201-03bb0502.png b/assets/amiibo/images/icon_01c10201-03bb0502.png deleted file mode 100644 index 5421bf70b..000000000 Binary files a/assets/amiibo/images/icon_01c10201-03bb0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02000001-00a10502.png b/assets/amiibo/images/icon_02000001-00a10502.png deleted file mode 100644 index 3a85b87db..000000000 Binary files a/assets/amiibo/images/icon_02000001-00a10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02010001-016a0502.png b/assets/amiibo/images/icon_02010001-016a0502.png deleted file mode 100644 index 0f0560f48..000000000 Binary files a/assets/amiibo/images/icon_02010001-016a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02020001-01030502.png b/assets/amiibo/images/icon_02020001-01030502.png deleted file mode 100644 index d498b6828..000000000 Binary files a/assets/amiibo/images/icon_02020001-01030502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02030001-019a0502.png b/assets/amiibo/images/icon_02030001-019a0502.png deleted file mode 100644 index e47a6c82b..000000000 Binary files a/assets/amiibo/images/icon_02030001-019a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02060001-03120502.png b/assets/amiibo/images/icon_02060001-03120502.png deleted file mode 100644 index fee76bd28..000000000 Binary files a/assets/amiibo/images/icon_02060001-03120502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02080001-00960502.png b/assets/amiibo/images/icon_02080001-00960502.png deleted file mode 100644 index 74b1f0fed..000000000 Binary files a/assets/amiibo/images/icon_02080001-00960502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02090001-019f0502.png b/assets/amiibo/images/icon_02090001-019f0502.png deleted file mode 100644 index b964bb673..000000000 Binary files a/assets/amiibo/images/icon_02090001-019f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02140001-00e40502.png b/assets/amiibo/images/icon_02140001-00e40502.png deleted file mode 100644 index 0bdc41652..000000000 Binary files a/assets/amiibo/images/icon_02140001-00e40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02150001-01820502.png b/assets/amiibo/images/icon_02150001-01820502.png deleted file mode 100644 index 1ed1e3fb3..000000000 Binary files a/assets/amiibo/images/icon_02150001-01820502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02160001-00570502.png b/assets/amiibo/images/icon_02160001-00570502.png deleted file mode 100644 index d1c719550..000000000 Binary files a/assets/amiibo/images/icon_02160001-00570502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02170001-01b30502.png b/assets/amiibo/images/icon_02170001-01b30502.png deleted file mode 100644 index ca2fb9742..000000000 Binary files a/assets/amiibo/images/icon_02170001-01b30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02190001-007e0502.png b/assets/amiibo/images/icon_02190001-007e0502.png deleted file mode 100644 index 7a83357c8..000000000 Binary files a/assets/amiibo/images/icon_02190001-007e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_021a0001-00da0502.png b/assets/amiibo/images/icon_021a0001-00da0502.png deleted file mode 100644 index 84cf671b3..000000000 Binary files a/assets/amiibo/images/icon_021a0001-00da0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_021b0001-00800502.png b/assets/amiibo/images/icon_021b0001-00800502.png deleted file mode 100644 index 2062ec0ff..000000000 Binary files a/assets/amiibo/images/icon_021b0001-00800502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_021c0001-02f70502.png b/assets/amiibo/images/icon_021c0001-02f70502.png deleted file mode 100644 index e90ac27be..000000000 Binary files a/assets/amiibo/images/icon_021c0001-02f70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_021d0001-01cd0502.png b/assets/amiibo/images/icon_021d0001-01cd0502.png deleted file mode 100644 index 1cc55a53c..000000000 Binary files a/assets/amiibo/images/icon_021d0001-01cd0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_021e0001-01230502.png b/assets/amiibo/images/icon_021e0001-01230502.png deleted file mode 100644 index e00d6b0b2..000000000 Binary files a/assets/amiibo/images/icon_021e0001-01230502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_021f0001-03170502.png b/assets/amiibo/images/icon_021f0001-03170502.png deleted file mode 100644 index b1ed41933..000000000 Binary files a/assets/amiibo/images/icon_021f0001-03170502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02200001-00fd0502.png b/assets/amiibo/images/icon_02200001-00fd0502.png deleted file mode 100644 index 9d39523c1..000000000 Binary files a/assets/amiibo/images/icon_02200001-00fd0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02210001-013c0502.png b/assets/amiibo/images/icon_02210001-013c0502.png deleted file mode 100644 index ec0d12d1a..000000000 Binary files a/assets/amiibo/images/icon_02210001-013c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02220001-01440502.png b/assets/amiibo/images/icon_02220001-01440502.png deleted file mode 100644 index 1bcd9f160..000000000 Binary files a/assets/amiibo/images/icon_02220001-01440502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_022d0001-00f20502.png b/assets/amiibo/images/icon_022d0001-00f20502.png deleted file mode 100644 index ca575920e..000000000 Binary files a/assets/amiibo/images/icon_022d0001-00f20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_022e0001-01d30502.png b/assets/amiibo/images/icon_022e0001-01d30502.png deleted file mode 100644 index 8b3d0db28..000000000 Binary files a/assets/amiibo/images/icon_022e0001-01d30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_022f0001-011e0502.png b/assets/amiibo/images/icon_022f0001-011e0502.png deleted file mode 100644 index 5c9df328a..000000000 Binary files a/assets/amiibo/images/icon_022f0001-011e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02300001-01d20502.png b/assets/amiibo/images/icon_02300001-01d20502.png deleted file mode 100644 index d35c91e6d..000000000 Binary files a/assets/amiibo/images/icon_02300001-01d20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02310001-006a0502.png b/assets/amiibo/images/icon_02310001-006a0502.png deleted file mode 100644 index 67051c521..000000000 Binary files a/assets/amiibo/images/icon_02310001-006a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02320001-02ea0502.png b/assets/amiibo/images/icon_02320001-02ea0502.png deleted file mode 100644 index 3d8b089b0..000000000 Binary files a/assets/amiibo/images/icon_02320001-02ea0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02330001-03060502.png b/assets/amiibo/images/icon_02330001-03060502.png deleted file mode 100644 index d918fa161..000000000 Binary files a/assets/amiibo/images/icon_02330001-03060502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02350001-00840502.png b/assets/amiibo/images/icon_02350001-00840502.png deleted file mode 100644 index 5b16b02d5..000000000 Binary files a/assets/amiibo/images/icon_02350001-00840502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02380001-02f80502.png b/assets/amiibo/images/icon_02380001-02f80502.png deleted file mode 100644 index 7a6f375c5..000000000 Binary files a/assets/amiibo/images/icon_02380001-02f80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_023c0001-00bd0502.png b/assets/amiibo/images/icon_023c0001-00bd0502.png deleted file mode 100644 index 4b79159c7..000000000 Binary files a/assets/amiibo/images/icon_023c0001-00bd0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_023d0001-01b50502.png b/assets/amiibo/images/icon_023d0001-01b50502.png deleted file mode 100644 index 3f80dff60..000000000 Binary files a/assets/amiibo/images/icon_023d0001-01b50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_023e0001-00d10502.png b/assets/amiibo/images/icon_023e0001-00d10502.png deleted file mode 100644 index 8c76abb05..000000000 Binary files a/assets/amiibo/images/icon_023e0001-00d10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_023f0001-01660502.png b/assets/amiibo/images/icon_023f0001-01660502.png deleted file mode 100644 index 7036a0c27..000000000 Binary files a/assets/amiibo/images/icon_023f0001-01660502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_024a0001-01d10502.png b/assets/amiibo/images/icon_024a0001-01d10502.png deleted file mode 100644 index d7f6430b2..000000000 Binary files a/assets/amiibo/images/icon_024a0001-01d10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_024b0001-01260502.png b/assets/amiibo/images/icon_024b0001-01260502.png deleted file mode 100644 index fed4228a0..000000000 Binary files a/assets/amiibo/images/icon_024b0001-01260502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_024d0001-02f60502.png b/assets/amiibo/images/icon_024d0001-02f60502.png deleted file mode 100644 index a2d0832ef..000000000 Binary files a/assets/amiibo/images/icon_024d0001-02f60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_024f0001-00810502.png b/assets/amiibo/images/icon_024f0001-00810502.png deleted file mode 100644 index 9456ed75c..000000000 Binary files a/assets/amiibo/images/icon_024f0001-00810502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02510001-00c10502.png b/assets/amiibo/images/icon_02510001-00c10502.png deleted file mode 100644 index 9ce5c04d0..000000000 Binary files a/assets/amiibo/images/icon_02510001-00c10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02520001-00fe0502.png b/assets/amiibo/images/icon_02520001-00fe0502.png deleted file mode 100644 index 915a8942f..000000000 Binary files a/assets/amiibo/images/icon_02520001-00fe0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_025d0001-00550502.png b/assets/amiibo/images/icon_025d0001-00550502.png deleted file mode 100644 index 96b45ecdd..000000000 Binary files a/assets/amiibo/images/icon_025d0001-00550502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_025e0001-01250502.png b/assets/amiibo/images/icon_025e0001-01250502.png deleted file mode 100644 index 83a06f997..000000000 Binary files a/assets/amiibo/images/icon_025e0001-01250502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_025f0001-01c50502.png b/assets/amiibo/images/icon_025f0001-01c50502.png deleted file mode 100644 index 372cea8ba..000000000 Binary files a/assets/amiibo/images/icon_025f0001-01c50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_025f0001-01d70502.png b/assets/amiibo/images/icon_025f0001-01d70502.png deleted file mode 100644 index d44a31cac..000000000 Binary files a/assets/amiibo/images/icon_025f0001-01d70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02600001-00d20502.png b/assets/amiibo/images/icon_02600001-00d20502.png deleted file mode 100644 index e1941dab6..000000000 Binary files a/assets/amiibo/images/icon_02600001-00d20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02610001-00650502.png b/assets/amiibo/images/icon_02610001-00650502.png deleted file mode 100644 index fe5bddf16..000000000 Binary files a/assets/amiibo/images/icon_02610001-00650502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02620001-01370502.png b/assets/amiibo/images/icon_02620001-01370502.png deleted file mode 100644 index 6af1156a5..000000000 Binary files a/assets/amiibo/images/icon_02620001-01370502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02630001-00750502.png b/assets/amiibo/images/icon_02630001-00750502.png deleted file mode 100644 index b4ae4ecbb..000000000 Binary files a/assets/amiibo/images/icon_02630001-00750502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02640001-01ac0502.png b/assets/amiibo/images/icon_02640001-01ac0502.png deleted file mode 100644 index 9ddb980a3..000000000 Binary files a/assets/amiibo/images/icon_02640001-01ac0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02650001-01540502.png b/assets/amiibo/images/icon_02650001-01540502.png deleted file mode 100644 index 2912b78f6..000000000 Binary files a/assets/amiibo/images/icon_02650001-01540502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02660001-00680502.png b/assets/amiibo/images/icon_02660001-00680502.png deleted file mode 100644 index 8b6937be3..000000000 Binary files a/assets/amiibo/images/icon_02660001-00680502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02670001-01080502.png b/assets/amiibo/images/icon_02670001-01080502.png deleted file mode 100644 index 95882b58b..000000000 Binary files a/assets/amiibo/images/icon_02670001-01080502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02680001-007d0502.png b/assets/amiibo/images/icon_02680001-007d0502.png deleted file mode 100644 index 18882d1be..000000000 Binary files a/assets/amiibo/images/icon_02680001-007d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02690001-011f0502.png b/assets/amiibo/images/icon_02690001-011f0502.png deleted file mode 100644 index e83b0c984..000000000 Binary files a/assets/amiibo/images/icon_02690001-011f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_026a0001-01460502.png b/assets/amiibo/images/icon_026a0001-01460502.png deleted file mode 100644 index 9f0e870ec..000000000 Binary files a/assets/amiibo/images/icon_026a0001-01460502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_026b0001-00e90502.png b/assets/amiibo/images/icon_026b0001-00e90502.png deleted file mode 100644 index b2c9407bd..000000000 Binary files a/assets/amiibo/images/icon_026b0001-00e90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_026c0001-00c30502.png b/assets/amiibo/images/icon_026c0001-00c30502.png deleted file mode 100644 index d47fde6b8..000000000 Binary files a/assets/amiibo/images/icon_026c0001-00c30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_026d0001-013f0502.png b/assets/amiibo/images/icon_026d0001-013f0502.png deleted file mode 100644 index ce54b0201..000000000 Binary files a/assets/amiibo/images/icon_026d0001-013f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_026e0001-00ba0502.png b/assets/amiibo/images/icon_026e0001-00ba0502.png deleted file mode 100644 index eb6d3b580..000000000 Binary files a/assets/amiibo/images/icon_026e0001-00ba0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_026f0001-01900502.png b/assets/amiibo/images/icon_026f0001-01900502.png deleted file mode 100644 index a3a008e52..000000000 Binary files a/assets/amiibo/images/icon_026f0001-01900502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02700001-00ff0502.png b/assets/amiibo/images/icon_02700001-00ff0502.png deleted file mode 100644 index d748bb1cb..000000000 Binary files a/assets/amiibo/images/icon_02700001-00ff0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02710001-019b0502.png b/assets/amiibo/images/icon_02710001-019b0502.png deleted file mode 100644 index fd8f7bbe8..000000000 Binary files a/assets/amiibo/images/icon_02710001-019b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02720001-01860502.png b/assets/amiibo/images/icon_02720001-01860502.png deleted file mode 100644 index 76854ded4..000000000 Binary files a/assets/amiibo/images/icon_02720001-01860502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_027d0001-00630502.png b/assets/amiibo/images/icon_027d0001-00630502.png deleted file mode 100644 index d205c6105..000000000 Binary files a/assets/amiibo/images/icon_027d0001-00630502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_027e0001-01690502.png b/assets/amiibo/images/icon_027e0001-01690502.png deleted file mode 100644 index ce2146352..000000000 Binary files a/assets/amiibo/images/icon_027e0001-01690502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_027f0001-00b90502.png b/assets/amiibo/images/icon_027f0001-00b90502.png deleted file mode 100644 index 2dcf62c96..000000000 Binary files a/assets/amiibo/images/icon_027f0001-00b90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02800001-00830502.png b/assets/amiibo/images/icon_02800001-00830502.png deleted file mode 100644 index 59acd3e09..000000000 Binary files a/assets/amiibo/images/icon_02800001-00830502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02810001-01200502.png b/assets/amiibo/images/icon_02810001-01200502.png deleted file mode 100644 index 6d1fe3acb..000000000 Binary files a/assets/amiibo/images/icon_02810001-01200502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02820001-01810502.png b/assets/amiibo/images/icon_02820001-01810502.png deleted file mode 100644 index 88066c59a..000000000 Binary files a/assets/amiibo/images/icon_02820001-01810502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02820001-01d60502.png b/assets/amiibo/images/icon_02820001-01d60502.png deleted file mode 100644 index 0ea8032cf..000000000 Binary files a/assets/amiibo/images/icon_02820001-01d60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02830001-00c70502.png b/assets/amiibo/images/icon_02830001-00c70502.png deleted file mode 100644 index 1d263c7cb..000000000 Binary files a/assets/amiibo/images/icon_02830001-00c70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02840001-02fe0502.png b/assets/amiibo/images/icon_02840001-02fe0502.png deleted file mode 100644 index f5df3dddf..000000000 Binary files a/assets/amiibo/images/icon_02840001-02fe0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02860001-03130502.png b/assets/amiibo/images/icon_02860001-03130502.png deleted file mode 100644 index 769a4aceb..000000000 Binary files a/assets/amiibo/images/icon_02860001-03130502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02870001-005a0502.png b/assets/amiibo/images/icon_02870001-005a0502.png deleted file mode 100644 index 6a81c697c..000000000 Binary files a/assets/amiibo/images/icon_02870001-005a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_028a0001-02e90502.png b/assets/amiibo/images/icon_028a0001-02e90502.png deleted file mode 100644 index d9f28c379..000000000 Binary files a/assets/amiibo/images/icon_028a0001-02e90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_028b0001-00e30502.png b/assets/amiibo/images/icon_028b0001-00e30502.png deleted file mode 100644 index 609bc7d27..000000000 Binary files a/assets/amiibo/images/icon_028b0001-00e30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_028c0001-013e0502.png b/assets/amiibo/images/icon_028c0001-013e0502.png deleted file mode 100644 index 5ba4e987c..000000000 Binary files a/assets/amiibo/images/icon_028c0001-013e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_028d0001-01bd0502.png b/assets/amiibo/images/icon_028d0001-01bd0502.png deleted file mode 100644 index b5c349f7e..000000000 Binary files a/assets/amiibo/images/icon_028d0001-01bd0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_028e0001-019e0502.png b/assets/amiibo/images/icon_028e0001-019e0502.png deleted file mode 100644 index 4edb9846b..000000000 Binary files a/assets/amiibo/images/icon_028e0001-019e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_028f0101-031a0502.png b/assets/amiibo/images/icon_028f0101-031a0502.png deleted file mode 100644 index 8c6620594..000000000 Binary files a/assets/amiibo/images/icon_028f0101-031a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02990001-00950502.png b/assets/amiibo/images/icon_02990001-00950502.png deleted file mode 100644 index 43a7fdb0d..000000000 Binary files a/assets/amiibo/images/icon_02990001-00950502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_029a0001-00ee0502.png b/assets/amiibo/images/icon_029a0001-00ee0502.png deleted file mode 100644 index ce13951b8..000000000 Binary files a/assets/amiibo/images/icon_029a0001-00ee0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_029b0001-00cb0502.png b/assets/amiibo/images/icon_029b0001-00cb0502.png deleted file mode 100644 index a4205538b..000000000 Binary files a/assets/amiibo/images/icon_029b0001-00cb0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_029e0001-013d0502.png b/assets/amiibo/images/icon_029e0001-013d0502.png deleted file mode 100644 index 1a0b16897..000000000 Binary files a/assets/amiibo/images/icon_029e0001-013d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02a20001-01ba0502.png b/assets/amiibo/images/icon_02a20001-01ba0502.png deleted file mode 100644 index c08f5439f..000000000 Binary files a/assets/amiibo/images/icon_02a20001-01ba0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02a30001-02ff0502.png b/assets/amiibo/images/icon_02a30001-02ff0502.png deleted file mode 100644 index f817f4b6f..000000000 Binary files a/assets/amiibo/images/icon_02a30001-02ff0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02a40001-00720502.png b/assets/amiibo/images/icon_02a40001-00720502.png deleted file mode 100644 index bb2a694b7..000000000 Binary files a/assets/amiibo/images/icon_02a40001-00720502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02a50001-018c0502.png b/assets/amiibo/images/icon_02a50001-018c0502.png deleted file mode 100644 index 8fa364a7b..000000000 Binary files a/assets/amiibo/images/icon_02a50001-018c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02a60001-01240502.png b/assets/amiibo/images/icon_02a60001-01240502.png deleted file mode 100644 index be41540e5..000000000 Binary files a/assets/amiibo/images/icon_02a60001-01240502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02b10001-00690502.png b/assets/amiibo/images/icon_02b10001-00690502.png deleted file mode 100644 index 738cfe08a..000000000 Binary files a/assets/amiibo/images/icon_02b10001-00690502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02b20001-00c40502.png b/assets/amiibo/images/icon_02b20001-00c40502.png deleted file mode 100644 index 02484d867..000000000 Binary files a/assets/amiibo/images/icon_02b20001-00c40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02b70001-030f0502.png b/assets/amiibo/images/icon_02b70001-030f0502.png deleted file mode 100644 index c516fd13f..000000000 Binary files a/assets/amiibo/images/icon_02b70001-030f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02b80001-019c0502.png b/assets/amiibo/images/icon_02b80001-019c0502.png deleted file mode 100644 index d09751c2a..000000000 Binary files a/assets/amiibo/images/icon_02b80001-019c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02c30001-00dc0502.png b/assets/amiibo/images/icon_02c30001-00dc0502.png deleted file mode 100644 index dcb38f063..000000000 Binary files a/assets/amiibo/images/icon_02c30001-00dc0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02c40001-00670502.png b/assets/amiibo/images/icon_02c40001-00670502.png deleted file mode 100644 index 0f360252d..000000000 Binary files a/assets/amiibo/images/icon_02c40001-00670502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02c50001-03080502.png b/assets/amiibo/images/icon_02c50001-03080502.png deleted file mode 100644 index ed57c3dc8..000000000 Binary files a/assets/amiibo/images/icon_02c50001-03080502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02c70001-01220502.png b/assets/amiibo/images/icon_02c70001-01220502.png deleted file mode 100644 index a9e004a29..000000000 Binary files a/assets/amiibo/images/icon_02c70001-01220502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02c90001-00cd0502.png b/assets/amiibo/images/icon_02c90001-00cd0502.png deleted file mode 100644 index 243025e28..000000000 Binary files a/assets/amiibo/images/icon_02c90001-00cd0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02ca0001-01ca0502.png b/assets/amiibo/images/icon_02ca0001-01ca0502.png deleted file mode 100644 index 3e9f542ee..000000000 Binary files a/assets/amiibo/images/icon_02ca0001-01ca0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02cb0001-01360502.png b/assets/amiibo/images/icon_02cb0001-01360502.png deleted file mode 100644 index f2cf11f71..000000000 Binary files a/assets/amiibo/images/icon_02cb0001-01360502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02d60001-00560502.png b/assets/amiibo/images/icon_02d60001-00560502.png deleted file mode 100644 index da83d04bb..000000000 Binary files a/assets/amiibo/images/icon_02d60001-00560502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02d70001-01300502.png b/assets/amiibo/images/icon_02d70001-01300502.png deleted file mode 100644 index 82573edb8..000000000 Binary files a/assets/amiibo/images/icon_02d70001-01300502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02d80001-00e20502.png b/assets/amiibo/images/icon_02d80001-00e20502.png deleted file mode 100644 index 2d0fdfe06..000000000 Binary files a/assets/amiibo/images/icon_02d80001-00e20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02d90001-01c80502.png b/assets/amiibo/images/icon_02d90001-01c80502.png deleted file mode 100644 index 60b0c8bcf..000000000 Binary files a/assets/amiibo/images/icon_02d90001-01c80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02da0001-01330502.png b/assets/amiibo/images/icon_02da0001-01330502.png deleted file mode 100644 index 41710be35..000000000 Binary files a/assets/amiibo/images/icon_02da0001-01330502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02db0001-005e0502.png b/assets/amiibo/images/icon_02db0001-005e0502.png deleted file mode 100644 index 9c275d06d..000000000 Binary files a/assets/amiibo/images/icon_02db0001-005e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02dc0001-00be0502.png b/assets/amiibo/images/icon_02dc0001-00be0502.png deleted file mode 100644 index 3a6bd74e5..000000000 Binary files a/assets/amiibo/images/icon_02dc0001-00be0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02dd0001-00ea0502.png b/assets/amiibo/images/icon_02dd0001-00ea0502.png deleted file mode 100644 index 14f97b6db..000000000 Binary files a/assets/amiibo/images/icon_02dd0001-00ea0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02de0001-009c0502.png b/assets/amiibo/images/icon_02de0001-009c0502.png deleted file mode 100644 index 36be4a260..000000000 Binary files a/assets/amiibo/images/icon_02de0001-009c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02df0001-01910502.png b/assets/amiibo/images/icon_02df0001-01910502.png deleted file mode 100644 index e5dec7031..000000000 Binary files a/assets/amiibo/images/icon_02df0001-01910502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02e00101-031d0502.png b/assets/amiibo/images/icon_02e00101-031d0502.png deleted file mode 100644 index 5433fe297..000000000 Binary files a/assets/amiibo/images/icon_02e00101-031d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02ea0001-01800502.png b/assets/amiibo/images/icon_02ea0001-01800502.png deleted file mode 100644 index 5a267856d..000000000 Binary files a/assets/amiibo/images/icon_02ea0001-01800502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02ea0001-01d50502.png b/assets/amiibo/images/icon_02ea0001-01d50502.png deleted file mode 100644 index 4c0a9820a..000000000 Binary files a/assets/amiibo/images/icon_02ea0001-01d50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02eb0001-00de0502.png b/assets/amiibo/images/icon_02eb0001-00de0502.png deleted file mode 100644 index 3ebf34fb1..000000000 Binary files a/assets/amiibo/images/icon_02eb0001-00de0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02ec0001-01c40502.png b/assets/amiibo/images/icon_02ec0001-01c40502.png deleted file mode 100644 index a999e5720..000000000 Binary files a/assets/amiibo/images/icon_02ec0001-01c40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02ed0001-015a0502.png b/assets/amiibo/images/icon_02ed0001-015a0502.png deleted file mode 100644 index cb5991f34..000000000 Binary files a/assets/amiibo/images/icon_02ed0001-015a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02ee0001-01990502.png b/assets/amiibo/images/icon_02ee0001-01990502.png deleted file mode 100644 index e38d197c8..000000000 Binary files a/assets/amiibo/images/icon_02ee0001-01990502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02ef0001-00580502.png b/assets/amiibo/images/icon_02ef0001-00580502.png deleted file mode 100644 index 17eb8cbe0..000000000 Binary files a/assets/amiibo/images/icon_02ef0001-00580502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02f00001-00a70502.png b/assets/amiibo/images/icon_02f00001-00a70502.png deleted file mode 100644 index bcdb3ec80..000000000 Binary files a/assets/amiibo/images/icon_02f00001-00a70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02f10001-01450502.png b/assets/amiibo/images/icon_02f10001-01450502.png deleted file mode 100644 index 9db98f772..000000000 Binary files a/assets/amiibo/images/icon_02f10001-01450502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02f20001-00cc0502.png b/assets/amiibo/images/icon_02f20001-00cc0502.png deleted file mode 100644 index 172e7641a..000000000 Binary files a/assets/amiibo/images/icon_02f20001-00cc0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02f30001-02f90502.png b/assets/amiibo/images/icon_02f30001-02f90502.png deleted file mode 100644 index d13d3ec6a..000000000 Binary files a/assets/amiibo/images/icon_02f30001-02f90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02f40001-03050502.png b/assets/amiibo/images/icon_02f40001-03050502.png deleted file mode 100644 index 029075d2c..000000000 Binary files a/assets/amiibo/images/icon_02f40001-03050502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02f80001-01380502.png b/assets/amiibo/images/icon_02f80001-01380502.png deleted file mode 100644 index 971ce7bad..000000000 Binary files a/assets/amiibo/images/icon_02f80001-01380502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02f90001-01020502.png b/assets/amiibo/images/icon_02f90001-01020502.png deleted file mode 100644 index d21d32053..000000000 Binary files a/assets/amiibo/images/icon_02f90001-01020502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02fa0001-00970502.png b/assets/amiibo/images/icon_02fa0001-00970502.png deleted file mode 100644 index f0e5d0f1e..000000000 Binary files a/assets/amiibo/images/icon_02fa0001-00970502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02fb0001-00900502.png b/assets/amiibo/images/icon_02fb0001-00900502.png deleted file mode 100644 index 0834b1e52..000000000 Binary files a/assets/amiibo/images/icon_02fb0001-00900502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_02fc0001-018f0502.png b/assets/amiibo/images/icon_02fc0001-018f0502.png deleted file mode 100644 index 016a029f3..000000000 Binary files a/assets/amiibo/images/icon_02fc0001-018f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03070001-00640502.png b/assets/amiibo/images/icon_03070001-00640502.png deleted file mode 100644 index 93c08298b..000000000 Binary files a/assets/amiibo/images/icon_03070001-00640502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03080001-014d0502.png b/assets/amiibo/images/icon_03080001-014d0502.png deleted file mode 100644 index 1171a607e..000000000 Binary files a/assets/amiibo/images/icon_03080001-014d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03090001-00c60502.png b/assets/amiibo/images/icon_03090001-00c60502.png deleted file mode 100644 index a47eebcf4..000000000 Binary files a/assets/amiibo/images/icon_03090001-00c60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_030a0001-01c70502.png b/assets/amiibo/images/icon_030a0001-01c70502.png deleted file mode 100644 index 547aa7125..000000000 Binary files a/assets/amiibo/images/icon_030a0001-01c70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_030b0001-00790502.png b/assets/amiibo/images/icon_030b0001-00790502.png deleted file mode 100644 index 8fec4500d..000000000 Binary files a/assets/amiibo/images/icon_030b0001-00790502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_030c0001-01b80502.png b/assets/amiibo/images/icon_030c0001-01b80502.png deleted file mode 100644 index 6ba27c7c8..000000000 Binary files a/assets/amiibo/images/icon_030c0001-01b80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_030d0001-01840502.png b/assets/amiibo/images/icon_030d0001-01840502.png deleted file mode 100644 index f7c81b472..000000000 Binary files a/assets/amiibo/images/icon_030d0001-01840502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_030e0001-012f0502.png b/assets/amiibo/images/icon_030e0001-012f0502.png deleted file mode 100644 index 0a03741e5..000000000 Binary files a/assets/amiibo/images/icon_030e0001-012f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_030f0001-016d0502.png b/assets/amiibo/images/icon_030f0001-016d0502.png deleted file mode 100644 index 562aec36f..000000000 Binary files a/assets/amiibo/images/icon_030f0001-016d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03100001-00f80502.png b/assets/amiibo/images/icon_03100001-00f80502.png deleted file mode 100644 index e6bd987e4..000000000 Binary files a/assets/amiibo/images/icon_03100001-00f80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03110001-00d60502.png b/assets/amiibo/images/icon_03110001-00d60502.png deleted file mode 100644 index 5075a1ff6..000000000 Binary files a/assets/amiibo/images/icon_03110001-00d60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03120001-03090502.png b/assets/amiibo/images/icon_03120001-03090502.png deleted file mode 100644 index d7075e5e1..000000000 Binary files a/assets/amiibo/images/icon_03120001-03090502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03130001-01210502.png b/assets/amiibo/images/icon_03130001-01210502.png deleted file mode 100644 index 272cd46c1..000000000 Binary files a/assets/amiibo/images/icon_03130001-01210502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03140001-02f40502.png b/assets/amiibo/images/icon_03140001-02f40502.png deleted file mode 100644 index 6eb1f94f1..000000000 Binary files a/assets/amiibo/images/icon_03140001-02f40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03160001-01c00502.png b/assets/amiibo/images/icon_03160001-01c00502.png deleted file mode 100644 index f9098de66..000000000 Binary files a/assets/amiibo/images/icon_03160001-01c00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03170001-00a60502.png b/assets/amiibo/images/icon_03170001-00a60502.png deleted file mode 100644 index bad1e9869..000000000 Binary files a/assets/amiibo/images/icon_03170001-00a60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03180001-006c0502.png b/assets/amiibo/images/icon_03180001-006c0502.png deleted file mode 100644 index da154406c..000000000 Binary files a/assets/amiibo/images/icon_03180001-006c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03230001-00760502.png b/assets/amiibo/images/icon_03230001-00760502.png deleted file mode 100644 index 48414da5e..000000000 Binary files a/assets/amiibo/images/icon_03230001-00760502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03240001-01890502.png b/assets/amiibo/images/icon_03240001-01890502.png deleted file mode 100644 index e1462000f..000000000 Binary files a/assets/amiibo/images/icon_03240001-01890502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03250001-010a0502.png b/assets/amiibo/images/icon_03250001-010a0502.png deleted file mode 100644 index 6f99a0539..000000000 Binary files a/assets/amiibo/images/icon_03250001-010a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03260001-01390502.png b/assets/amiibo/images/icon_03260001-01390502.png deleted file mode 100644 index 2ef5b99a8..000000000 Binary files a/assets/amiibo/images/icon_03260001-01390502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03270001-01c30502.png b/assets/amiibo/images/icon_03270001-01c30502.png deleted file mode 100644 index 07a18b1ac..000000000 Binary files a/assets/amiibo/images/icon_03270001-01c30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03280001-02eb0502.png b/assets/amiibo/images/icon_03280001-02eb0502.png deleted file mode 100644 index e1041ad62..000000000 Binary files a/assets/amiibo/images/icon_03280001-02eb0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03290001-009d0502.png b/assets/amiibo/images/icon_03290001-009d0502.png deleted file mode 100644 index 9dc2efb62..000000000 Binary files a/assets/amiibo/images/icon_03290001-009d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_032a0001-03070502.png b/assets/amiibo/images/icon_032a0001-03070502.png deleted file mode 100644 index d66af0365..000000000 Binary files a/assets/amiibo/images/icon_032a0001-03070502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_032c0001-01480502.png b/assets/amiibo/images/icon_032c0001-01480502.png deleted file mode 100644 index f104dd4ca..000000000 Binary files a/assets/amiibo/images/icon_032c0001-01480502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_032d0001-00bc0502.png b/assets/amiibo/images/icon_032d0001-00bc0502.png deleted file mode 100644 index 2ecb354fc..000000000 Binary files a/assets/amiibo/images/icon_032d0001-00bc0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_032e0101-031c0502.png b/assets/amiibo/images/icon_032e0101-031c0502.png deleted file mode 100644 index 322986fa5..000000000 Binary files a/assets/amiibo/images/icon_032e0101-031c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03380001-011d0502.png b/assets/amiibo/images/icon_03380001-011d0502.png deleted file mode 100644 index 11061b7e5..000000000 Binary files a/assets/amiibo/images/icon_03380001-011d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03390001-01b10502.png b/assets/amiibo/images/icon_03390001-01b10502.png deleted file mode 100644 index 030259000..000000000 Binary files a/assets/amiibo/images/icon_03390001-01b10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_033a0001-01cc0502.png b/assets/amiibo/images/icon_033a0001-01cc0502.png deleted file mode 100644 index 352a20851..000000000 Binary files a/assets/amiibo/images/icon_033a0001-01cc0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_033b0001-00fa0502.png b/assets/amiibo/images/icon_033b0001-00fa0502.png deleted file mode 100644 index ac370dd6f..000000000 Binary files a/assets/amiibo/images/icon_033b0001-00fa0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_033c0001-01000502.png b/assets/amiibo/images/icon_033c0001-01000502.png deleted file mode 100644 index cc28dc6b2..000000000 Binary files a/assets/amiibo/images/icon_033c0001-01000502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_033d0001-013a0502.png b/assets/amiibo/images/icon_033d0001-013a0502.png deleted file mode 100644 index cf23f8b8c..000000000 Binary files a/assets/amiibo/images/icon_033d0001-013a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_033e0001-01a20502.png b/assets/amiibo/images/icon_033e0001-01a20502.png deleted file mode 100644 index ae87a860a..000000000 Binary files a/assets/amiibo/images/icon_033e0001-01a20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_033f0001-008f0502.png b/assets/amiibo/images/icon_033f0001-008f0502.png deleted file mode 100644 index 3d9ebcb22..000000000 Binary files a/assets/amiibo/images/icon_033f0001-008f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03410001-030e0502.png b/assets/amiibo/images/icon_03410001-030e0502.png deleted file mode 100644 index c1b04a37a..000000000 Binary files a/assets/amiibo/images/icon_03410001-030e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03420001-01280502.png b/assets/amiibo/images/icon_03420001-01280502.png deleted file mode 100644 index 86296d34d..000000000 Binary files a/assets/amiibo/images/icon_03420001-01280502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03430001-02ef0502.png b/assets/amiibo/images/icon_03430001-02ef0502.png deleted file mode 100644 index 15bc190cc..000000000 Binary files a/assets/amiibo/images/icon_03430001-02ef0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03440001-00c50502.png b/assets/amiibo/images/icon_03440001-00c50502.png deleted file mode 100644 index 910935482..000000000 Binary files a/assets/amiibo/images/icon_03440001-00c50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03450001-005f0502.png b/assets/amiibo/images/icon_03450001-005f0502.png deleted file mode 100644 index 47b7d63d3..000000000 Binary files a/assets/amiibo/images/icon_03450001-005f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03470001-03020502.png b/assets/amiibo/images/icon_03470001-03020502.png deleted file mode 100644 index 177f635e9..000000000 Binary files a/assets/amiibo/images/icon_03470001-03020502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03480001-006b0502.png b/assets/amiibo/images/icon_03480001-006b0502.png deleted file mode 100644 index 280be9772..000000000 Binary files a/assets/amiibo/images/icon_03480001-006b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03490001-018d0502.png b/assets/amiibo/images/icon_03490001-018d0502.png deleted file mode 100644 index 4588dcd51..000000000 Binary files a/assets/amiibo/images/icon_03490001-018d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_034a0001-01430502.png b/assets/amiibo/images/icon_034a0001-01430502.png deleted file mode 100644 index 207e31c7d..000000000 Binary files a/assets/amiibo/images/icon_034a0001-01430502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_034b0001-009f0502.png b/assets/amiibo/images/icon_034b0001-009f0502.png deleted file mode 100644 index d2372fe58..000000000 Binary files a/assets/amiibo/images/icon_034b0001-009f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03560001-01350502.png b/assets/amiibo/images/icon_03560001-01350502.png deleted file mode 100644 index 91bab9566..000000000 Binary files a/assets/amiibo/images/icon_03560001-01350502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03570001-00eb0502.png b/assets/amiibo/images/icon_03570001-00eb0502.png deleted file mode 100644 index 18231d6a1..000000000 Binary files a/assets/amiibo/images/icon_03570001-00eb0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03580001-02fa0502.png b/assets/amiibo/images/icon_03580001-02fa0502.png deleted file mode 100644 index 51b60e18b..000000000 Binary files a/assets/amiibo/images/icon_03580001-02fa0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_035a0001-00850502.png b/assets/amiibo/images/icon_035a0001-00850502.png deleted file mode 100644 index caff771e8..000000000 Binary files a/assets/amiibo/images/icon_035a0001-00850502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_035c0001-01290502.png b/assets/amiibo/images/icon_035c0001-01290502.png deleted file mode 100644 index 36a08c4fe..000000000 Binary files a/assets/amiibo/images/icon_035c0001-01290502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_035d0001-00c90502.png b/assets/amiibo/images/icon_035d0001-00c90502.png deleted file mode 100644 index 1e3eb5fae..000000000 Binary files a/assets/amiibo/images/icon_035d0001-00c90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_035e0001-018e0502.png b/assets/amiibo/images/icon_035e0001-018e0502.png deleted file mode 100644 index 458379e12..000000000 Binary files a/assets/amiibo/images/icon_035e0001-018e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03690001-00d30502.png b/assets/amiibo/images/icon_03690001-00d30502.png deleted file mode 100644 index dfe73c64b..000000000 Binary files a/assets/amiibo/images/icon_03690001-00d30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_036a0001-019d0502.png b/assets/amiibo/images/icon_036a0001-019d0502.png deleted file mode 100644 index 28ea32165..000000000 Binary files a/assets/amiibo/images/icon_036a0001-019d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_036b0001-018b0502.png b/assets/amiibo/images/icon_036b0001-018b0502.png deleted file mode 100644 index 8e6d1ae2a..000000000 Binary files a/assets/amiibo/images/icon_036b0001-018b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_036d0001-03040502.png b/assets/amiibo/images/icon_036d0001-03040502.png deleted file mode 100644 index e7f92cd53..000000000 Binary files a/assets/amiibo/images/icon_036d0001-03040502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_036e0001-02fb0502.png b/assets/amiibo/images/icon_036e0001-02fb0502.png deleted file mode 100644 index 4faaef80d..000000000 Binary files a/assets/amiibo/images/icon_036e0001-02fb0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03700001-015d0502.png b/assets/amiibo/images/icon_03700001-015d0502.png deleted file mode 100644 index 6ad05a10b..000000000 Binary files a/assets/amiibo/images/icon_03700001-015d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03710001-005c0502.png b/assets/amiibo/images/icon_03710001-005c0502.png deleted file mode 100644 index 03f3d8c71..000000000 Binary files a/assets/amiibo/images/icon_03710001-005c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03720001-010b0502.png b/assets/amiibo/images/icon_03720001-010b0502.png deleted file mode 100644 index e3fb76304..000000000 Binary files a/assets/amiibo/images/icon_03720001-010b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03730001-01340502.png b/assets/amiibo/images/icon_03730001-01340502.png deleted file mode 100644 index 14909d468..000000000 Binary files a/assets/amiibo/images/icon_03730001-01340502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03740101-03190502.png b/assets/amiibo/images/icon_03740101-03190502.png deleted file mode 100644 index e83cf5925..000000000 Binary files a/assets/amiibo/images/icon_03740101-03190502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_037e0001-01560502.png b/assets/amiibo/images/icon_037e0001-01560502.png deleted file mode 100644 index fdbe3f50b..000000000 Binary files a/assets/amiibo/images/icon_037e0001-01560502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_037f0001-01aa0502.png b/assets/amiibo/images/icon_037f0001-01aa0502.png deleted file mode 100644 index b36e5eb3d..000000000 Binary files a/assets/amiibo/images/icon_037f0001-01aa0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03800001-01870502.png b/assets/amiibo/images/icon_03800001-01870502.png deleted file mode 100644 index 0c73368ed..000000000 Binary files a/assets/amiibo/images/icon_03800001-01870502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03810001-00d50502.png b/assets/amiibo/images/icon_03810001-00d50502.png deleted file mode 100644 index eeb9db20c..000000000 Binary files a/assets/amiibo/images/icon_03810001-00d50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03820001-016b0502.png b/assets/amiibo/images/icon_03820001-016b0502.png deleted file mode 100644 index b53577381..000000000 Binary files a/assets/amiibo/images/icon_03820001-016b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03830001-009b0502.png b/assets/amiibo/images/icon_03830001-009b0502.png deleted file mode 100644 index 21f77c24c..000000000 Binary files a/assets/amiibo/images/icon_03830001-009b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03840001-00860502.png b/assets/amiibo/images/icon_03840001-00860502.png deleted file mode 100644 index fb98b0086..000000000 Binary files a/assets/amiibo/images/icon_03840001-00860502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03850001-01060502.png b/assets/amiibo/images/icon_03850001-01060502.png deleted file mode 100644 index 5f306ef46..000000000 Binary files a/assets/amiibo/images/icon_03850001-01060502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03900001-01850502.png b/assets/amiibo/images/icon_03900001-01850502.png deleted file mode 100644 index 5118b7d58..000000000 Binary files a/assets/amiibo/images/icon_03900001-01850502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03920001-01270502.png b/assets/amiibo/images/icon_03920001-01270502.png deleted file mode 100644 index a57a9090b..000000000 Binary files a/assets/amiibo/images/icon_03920001-01270502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03930001-00a00502.png b/assets/amiibo/images/icon_03930001-00a00502.png deleted file mode 100644 index 0d1b2b0d9..000000000 Binary files a/assets/amiibo/images/icon_03930001-00a00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03940001-00890502.png b/assets/amiibo/images/icon_03940001-00890502.png deleted file mode 100644 index f39909723..000000000 Binary files a/assets/amiibo/images/icon_03940001-00890502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03950001-02fc0502.png b/assets/amiibo/images/icon_03950001-02fc0502.png deleted file mode 100644 index 4dbb794f2..000000000 Binary files a/assets/amiibo/images/icon_03950001-02fc0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03980001-00bf0502.png b/assets/amiibo/images/icon_03980001-00bf0502.png deleted file mode 100644 index ff4abd930..000000000 Binary files a/assets/amiibo/images/icon_03980001-00bf0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03990001-01c20502.png b/assets/amiibo/images/icon_03990001-01c20502.png deleted file mode 100644 index 591d765bf..000000000 Binary files a/assets/amiibo/images/icon_03990001-01c20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03a40001-014f0502.png b/assets/amiibo/images/icon_03a40001-014f0502.png deleted file mode 100644 index 8d994aba0..000000000 Binary files a/assets/amiibo/images/icon_03a40001-014f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03a50001-015b0502.png b/assets/amiibo/images/icon_03a50001-015b0502.png deleted file mode 100644 index 6a7920391..000000000 Binary files a/assets/amiibo/images/icon_03a50001-015b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03a60001-00c80502.png b/assets/amiibo/images/icon_03a60001-00c80502.png deleted file mode 100644 index bf5eabed8..000000000 Binary files a/assets/amiibo/images/icon_03a60001-00c80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03a70001-01a10502.png b/assets/amiibo/images/icon_03a70001-01a10502.png deleted file mode 100644 index 08ed537e6..000000000 Binary files a/assets/amiibo/images/icon_03a70001-01a10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03a80001-00910502.png b/assets/amiibo/images/icon_03a80001-00910502.png deleted file mode 100644 index 30f550e72..000000000 Binary files a/assets/amiibo/images/icon_03a80001-00910502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03a90001-00710502.png b/assets/amiibo/images/icon_03a90001-00710502.png deleted file mode 100644 index d944f0375..000000000 Binary files a/assets/amiibo/images/icon_03a90001-00710502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03aa0001-00e60502.png b/assets/amiibo/images/icon_03aa0001-00e60502.png deleted file mode 100644 index 50cdff012..000000000 Binary files a/assets/amiibo/images/icon_03aa0001-00e60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03ab0001-03160502.png b/assets/amiibo/images/icon_03ab0001-03160502.png deleted file mode 100644 index 3d63e2ca0..000000000 Binary files a/assets/amiibo/images/icon_03ab0001-03160502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03ac0001-01880502.png b/assets/amiibo/images/icon_03ac0001-01880502.png deleted file mode 100644 index 90341b5b9..000000000 Binary files a/assets/amiibo/images/icon_03ac0001-01880502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03ad0001-01b20502.png b/assets/amiibo/images/icon_03ad0001-01b20502.png deleted file mode 100644 index 5c144b07f..000000000 Binary files a/assets/amiibo/images/icon_03ad0001-01b20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03ae0001-00870502.png b/assets/amiibo/images/icon_03ae0001-00870502.png deleted file mode 100644 index 765d97b33..000000000 Binary files a/assets/amiibo/images/icon_03ae0001-00870502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03af0001-012c0502.png b/assets/amiibo/images/icon_03af0001-012c0502.png deleted file mode 100644 index 23de0e475..000000000 Binary files a/assets/amiibo/images/icon_03af0001-012c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03b00001-01a90502.png b/assets/amiibo/images/icon_03b00001-01a90502.png deleted file mode 100644 index 585d160fa..000000000 Binary files a/assets/amiibo/images/icon_03b00001-01a90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03b10001-00f00502.png b/assets/amiibo/images/icon_03b10001-00f00502.png deleted file mode 100644 index 9a9e5753a..000000000 Binary files a/assets/amiibo/images/icon_03b10001-00f00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03bc0001-008a0502.png b/assets/amiibo/images/icon_03bc0001-008a0502.png deleted file mode 100644 index e6961eb13..000000000 Binary files a/assets/amiibo/images/icon_03bc0001-008a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03bd0001-00f90502.png b/assets/amiibo/images/icon_03bd0001-00f90502.png deleted file mode 100644 index 6a8dd6768..000000000 Binary files a/assets/amiibo/images/icon_03bd0001-00f90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03be0001-01980502.png b/assets/amiibo/images/icon_03be0001-01980502.png deleted file mode 100644 index 8c0007366..000000000 Binary files a/assets/amiibo/images/icon_03be0001-01980502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03bf0001-01bc0502.png b/assets/amiibo/images/icon_03bf0001-01bc0502.png deleted file mode 100644 index 270bf1180..000000000 Binary files a/assets/amiibo/images/icon_03bf0001-01bc0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03c00001-03100502.png b/assets/amiibo/images/icon_03c00001-03100502.png deleted file mode 100644 index 67dabbb83..000000000 Binary files a/assets/amiibo/images/icon_03c00001-03100502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03c10001-00bb0502.png b/assets/amiibo/images/icon_03c10001-00bb0502.png deleted file mode 100644 index 20f70a119..000000000 Binary files a/assets/amiibo/images/icon_03c10001-00bb0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03c40001-012b0502.png b/assets/amiibo/images/icon_03c40001-012b0502.png deleted file mode 100644 index 9ae17c709..000000000 Binary files a/assets/amiibo/images/icon_03c40001-012b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03c50001-015c0502.png b/assets/amiibo/images/icon_03c50001-015c0502.png deleted file mode 100644 index dfe8385cd..000000000 Binary files a/assets/amiibo/images/icon_03c50001-015c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03c60001-00930502.png b/assets/amiibo/images/icon_03c60001-00930502.png deleted file mode 100644 index 10095b607..000000000 Binary files a/assets/amiibo/images/icon_03c60001-00930502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03d10001-00c20502.png b/assets/amiibo/images/icon_03d10001-00c20502.png deleted file mode 100644 index 98de5e48f..000000000 Binary files a/assets/amiibo/images/icon_03d10001-00c20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03d20001-00e50502.png b/assets/amiibo/images/icon_03d20001-00e50502.png deleted file mode 100644 index fe4bd1853..000000000 Binary files a/assets/amiibo/images/icon_03d20001-00e50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03d30001-02f30502.png b/assets/amiibo/images/icon_03d30001-02f30502.png deleted file mode 100644 index 66ed073e3..000000000 Binary files a/assets/amiibo/images/icon_03d30001-02f30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03d60001-01570502.png b/assets/amiibo/images/icon_03d60001-01570502.png deleted file mode 100644 index b0e001da4..000000000 Binary files a/assets/amiibo/images/icon_03d60001-01570502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03d70001-01b40502.png b/assets/amiibo/images/icon_03d70001-01b40502.png deleted file mode 100644 index 6bf80eee1..000000000 Binary files a/assets/amiibo/images/icon_03d70001-01b40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03d90001-01a50502.png b/assets/amiibo/images/icon_03d90001-01a50502.png deleted file mode 100644 index 7b6feae20..000000000 Binary files a/assets/amiibo/images/icon_03d90001-01a50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03da0001-01510502.png b/assets/amiibo/images/icon_03da0001-01510502.png deleted file mode 100644 index 2b99f8760..000000000 Binary files a/assets/amiibo/images/icon_03da0001-01510502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03db0001-006d0502.png b/assets/amiibo/images/icon_03db0001-006d0502.png deleted file mode 100644 index 2251a5cc0..000000000 Binary files a/assets/amiibo/images/icon_03db0001-006d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03e60001-00ec0502.png b/assets/amiibo/images/icon_03e60001-00ec0502.png deleted file mode 100644 index 9dfad5926..000000000 Binary files a/assets/amiibo/images/icon_03e60001-00ec0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03e70001-012a0502.png b/assets/amiibo/images/icon_03e70001-012a0502.png deleted file mode 100644 index b075a3210..000000000 Binary files a/assets/amiibo/images/icon_03e70001-012a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03e80001-02f50502.png b/assets/amiibo/images/icon_03e80001-02f50502.png deleted file mode 100644 index 3dfeac4db..000000000 Binary files a/assets/amiibo/images/icon_03e80001-02f50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03ea0001-030b0502.png b/assets/amiibo/images/icon_03ea0001-030b0502.png deleted file mode 100644 index 2994374cd..000000000 Binary files a/assets/amiibo/images/icon_03ea0001-030b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03ec0001-01830502.png b/assets/amiibo/images/icon_03ec0001-01830502.png deleted file mode 100644 index f36a4c5d1..000000000 Binary files a/assets/amiibo/images/icon_03ec0001-01830502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03ed0001-01a30502.png b/assets/amiibo/images/icon_03ed0001-01a30502.png deleted file mode 100644 index 82e50fe0a..000000000 Binary files a/assets/amiibo/images/icon_03ed0001-01a30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03ee0001-008b0502.png b/assets/amiibo/images/icon_03ee0001-008b0502.png deleted file mode 100644 index b147f180f..000000000 Binary files a/assets/amiibo/images/icon_03ee0001-008b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03fa0001-00d00502.png b/assets/amiibo/images/icon_03fa0001-00d00502.png deleted file mode 100644 index d36868c07..000000000 Binary files a/assets/amiibo/images/icon_03fa0001-00d00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03fb0001-01cf0502.png b/assets/amiibo/images/icon_03fb0001-01cf0502.png deleted file mode 100644 index 51b844c62..000000000 Binary files a/assets/amiibo/images/icon_03fb0001-01cf0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03fc0001-01470502.png b/assets/amiibo/images/icon_03fc0001-01470502.png deleted file mode 100644 index a2e0d07cd..000000000 Binary files a/assets/amiibo/images/icon_03fc0001-01470502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03fd0001-01580502.png b/assets/amiibo/images/icon_03fd0001-01580502.png deleted file mode 100644 index e7260d1c5..000000000 Binary files a/assets/amiibo/images/icon_03fd0001-01580502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03fe0001-01a40502.png b/assets/amiibo/images/icon_03fe0001-01a40502.png deleted file mode 100644 index 2a453accd..000000000 Binary files a/assets/amiibo/images/icon_03fe0001-01a40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_03ff0001-00f40502.png b/assets/amiibo/images/icon_03ff0001-00f40502.png deleted file mode 100644 index 5e96cc5fb..000000000 Binary files a/assets/amiibo/images/icon_03ff0001-00f40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04000001-006f0502.png b/assets/amiibo/images/icon_04000001-006f0502.png deleted file mode 100644 index 5339ed84e..000000000 Binary files a/assets/amiibo/images/icon_04000001-006f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04010001-00660502.png b/assets/amiibo/images/icon_04010001-00660502.png deleted file mode 100644 index 01d2bf99f..000000000 Binary files a/assets/amiibo/images/icon_04010001-00660502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_040c0001-01590502.png b/assets/amiibo/images/icon_040c0001-01590502.png deleted file mode 100644 index 47cc39b9a..000000000 Binary files a/assets/amiibo/images/icon_040c0001-01590502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_040d0001-00780502.png b/assets/amiibo/images/icon_040d0001-00780502.png deleted file mode 100644 index 5bd30b5ad..000000000 Binary files a/assets/amiibo/images/icon_040d0001-00780502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_040e0001-00880502.png b/assets/amiibo/images/icon_040e0001-00880502.png deleted file mode 100644 index 49849c3cb..000000000 Binary files a/assets/amiibo/images/icon_040e0001-00880502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_040f0001-01500502.png b/assets/amiibo/images/icon_040f0001-01500502.png deleted file mode 100644 index af18b2c22..000000000 Binary files a/assets/amiibo/images/icon_040f0001-01500502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04100001-007f0502.png b/assets/amiibo/images/icon_04100001-007f0502.png deleted file mode 100644 index b7bb883f3..000000000 Binary files a/assets/amiibo/images/icon_04100001-007f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04110001-01ab0502.png b/assets/amiibo/images/icon_04110001-01ab0502.png deleted file mode 100644 index 9f058ab98..000000000 Binary files a/assets/amiibo/images/icon_04110001-01ab0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04140001-030a0502.png b/assets/amiibo/images/icon_04140001-030a0502.png deleted file mode 100644 index e3a2d3b67..000000000 Binary files a/assets/amiibo/images/icon_04140001-030a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04150001-01bb0502.png b/assets/amiibo/images/icon_04150001-01bb0502.png deleted file mode 100644 index 4ea1fcc40..000000000 Binary files a/assets/amiibo/images/icon_04150001-01bb0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04160001-00fb0502.png b/assets/amiibo/images/icon_04160001-00fb0502.png deleted file mode 100644 index 55288c8af..000000000 Binary files a/assets/amiibo/images/icon_04160001-00fb0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04180001-00d80502.png b/assets/amiibo/images/icon_04180001-00d80502.png deleted file mode 100644 index 02940a384..000000000 Binary files a/assets/amiibo/images/icon_04180001-00d80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_041a0001-00e00502.png b/assets/amiibo/images/icon_041a0001-00e00502.png deleted file mode 100644 index a100014ba..000000000 Binary files a/assets/amiibo/images/icon_041a0001-00e00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_041b0001-00f10502.png b/assets/amiibo/images/icon_041b0001-00f10502.png deleted file mode 100644 index 371ed0838..000000000 Binary files a/assets/amiibo/images/icon_041b0001-00f10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_041c0001-01410502.png b/assets/amiibo/images/icon_041c0001-01410502.png deleted file mode 100644 index f0f3241e9..000000000 Binary files a/assets/amiibo/images/icon_041c0001-01410502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_041d0001-018a0502.png b/assets/amiibo/images/icon_041d0001-018a0502.png deleted file mode 100644 index 1009e18c4..000000000 Binary files a/assets/amiibo/images/icon_041d0001-018a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_041e0001-015f0502.png b/assets/amiibo/images/icon_041e0001-015f0502.png deleted file mode 100644 index a9d532763..000000000 Binary files a/assets/amiibo/images/icon_041e0001-015f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04290001-00700502.png b/assets/amiibo/images/icon_04290001-00700502.png deleted file mode 100644 index b75f15fd4..000000000 Binary files a/assets/amiibo/images/icon_04290001-00700502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_042a0001-012d0502.png b/assets/amiibo/images/icon_042a0001-012d0502.png deleted file mode 100644 index d6b0901d9..000000000 Binary files a/assets/amiibo/images/icon_042a0001-012d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_042b0001-01af0502.png b/assets/amiibo/images/icon_042b0001-01af0502.png deleted file mode 100644 index 568784816..000000000 Binary files a/assets/amiibo/images/icon_042b0001-01af0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04360001-01940502.png b/assets/amiibo/images/icon_04360001-01940502.png deleted file mode 100644 index dfe7ab602..000000000 Binary files a/assets/amiibo/images/icon_04360001-01940502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04370001-01050502.png b/assets/amiibo/images/icon_04370001-01050502.png deleted file mode 100644 index b4105b6a8..000000000 Binary files a/assets/amiibo/images/icon_04370001-01050502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04380001-03000502.png b/assets/amiibo/images/icon_04380001-03000502.png deleted file mode 100644 index 1febdfad9..000000000 Binary files a/assets/amiibo/images/icon_04380001-03000502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04390001-03110502.png b/assets/amiibo/images/icon_04390001-03110502.png deleted file mode 100644 index effd0143b..000000000 Binary files a/assets/amiibo/images/icon_04390001-03110502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_043b0001-03030502.png b/assets/amiibo/images/icon_043b0001-03030502.png deleted file mode 100644 index 11d4f5767..000000000 Binary files a/assets/amiibo/images/icon_043b0001-03030502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_043c0001-01cb0502.png b/assets/amiibo/images/icon_043c0001-01cb0502.png deleted file mode 100644 index 732f4b31f..000000000 Binary files a/assets/amiibo/images/icon_043c0001-01cb0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_043d0001-007c0502.png b/assets/amiibo/images/icon_043d0001-007c0502.png deleted file mode 100644 index 34e958ff7..000000000 Binary files a/assets/amiibo/images/icon_043d0001-007c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_043e0001-01490502.png b/assets/amiibo/images/icon_043e0001-01490502.png deleted file mode 100644 index 9ba22b901..000000000 Binary files a/assets/amiibo/images/icon_043e0001-01490502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_043f0001-01550502.png b/assets/amiibo/images/icon_043f0001-01550502.png deleted file mode 100644 index 4a672c317..000000000 Binary files a/assets/amiibo/images/icon_043f0001-01550502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04400001-00ca0502.png b/assets/amiibo/images/icon_04400001-00ca0502.png deleted file mode 100644 index b0a8729c0..000000000 Binary files a/assets/amiibo/images/icon_04400001-00ca0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_044b0001-016c0502.png b/assets/amiibo/images/icon_044b0001-016c0502.png deleted file mode 100644 index a9233d9e9..000000000 Binary files a/assets/amiibo/images/icon_044b0001-016c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_044c0001-008e0502.png b/assets/amiibo/images/icon_044c0001-008e0502.png deleted file mode 100644 index 6c726a616..000000000 Binary files a/assets/amiibo/images/icon_044c0001-008e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_044d0001-01930502.png b/assets/amiibo/images/icon_044d0001-01930502.png deleted file mode 100644 index a71549608..000000000 Binary files a/assets/amiibo/images/icon_044d0001-01930502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_044e0001-03150502.png b/assets/amiibo/images/icon_044e0001-03150502.png deleted file mode 100644 index 49141cc04..000000000 Binary files a/assets/amiibo/images/icon_044e0001-03150502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04500001-00cf0502.png b/assets/amiibo/images/icon_04500001-00cf0502.png deleted file mode 100644 index 13be22964..000000000 Binary files a/assets/amiibo/images/icon_04500001-00cf0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04510001-015e0502.png b/assets/amiibo/images/icon_04510001-015e0502.png deleted file mode 100644 index 35e6e8e7d..000000000 Binary files a/assets/amiibo/images/icon_04510001-015e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04520001-00730502.png b/assets/amiibo/images/icon_04520001-00730502.png deleted file mode 100644 index 3ed3c81bc..000000000 Binary files a/assets/amiibo/images/icon_04520001-00730502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04530001-01040502.png b/assets/amiibo/images/icon_04530001-01040502.png deleted file mode 100644 index eba854c14..000000000 Binary files a/assets/amiibo/images/icon_04530001-01040502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04540001-01ae0502.png b/assets/amiibo/images/icon_04540001-01ae0502.png deleted file mode 100644 index b157f5b61..000000000 Binary files a/assets/amiibo/images/icon_04540001-01ae0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_045f0001-01a80502.png b/assets/amiibo/images/icon_045f0001-01a80502.png deleted file mode 100644 index 15f988762..000000000 Binary files a/assets/amiibo/images/icon_045f0001-01a80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04600001-00a50502.png b/assets/amiibo/images/icon_04600001-00a50502.png deleted file mode 100644 index 8fa50c665..000000000 Binary files a/assets/amiibo/images/icon_04600001-00a50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04610001-01610502.png b/assets/amiibo/images/icon_04610001-01610502.png deleted file mode 100644 index a9a5c84ea..000000000 Binary files a/assets/amiibo/images/icon_04610001-01610502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04620001-00f60502.png b/assets/amiibo/images/icon_04620001-00f60502.png deleted file mode 100644 index 731e551d4..000000000 Binary files a/assets/amiibo/images/icon_04620001-00f60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04630001-01310502.png b/assets/amiibo/images/icon_04630001-01310502.png deleted file mode 100644 index f9f65b68f..000000000 Binary files a/assets/amiibo/images/icon_04630001-01310502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04640001-00c00502.png b/assets/amiibo/images/icon_04640001-00c00502.png deleted file mode 100644 index 4866ccf00..000000000 Binary files a/assets/amiibo/images/icon_04640001-00c00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04650001-006e0502.png b/assets/amiibo/images/icon_04650001-006e0502.png deleted file mode 100644 index ccf44f8fe..000000000 Binary files a/assets/amiibo/images/icon_04650001-006e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04680001-02f20502.png b/assets/amiibo/images/icon_04680001-02f20502.png deleted file mode 100644 index 2a9400b03..000000000 Binary files a/assets/amiibo/images/icon_04680001-02f20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04690001-01640502.png b/assets/amiibo/images/icon_04690001-01640502.png deleted file mode 100644 index 5d0c55a48..000000000 Binary files a/assets/amiibo/images/icon_04690001-01640502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_046a0001-01d00502.png b/assets/amiibo/images/icon_046a0001-01d00502.png deleted file mode 100644 index 499ac6b4a..000000000 Binary files a/assets/amiibo/images/icon_046a0001-01d00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_046b0001-01970502.png b/assets/amiibo/images/icon_046b0001-01970502.png deleted file mode 100644 index 11baad688..000000000 Binary files a/assets/amiibo/images/icon_046b0001-01970502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_046c0001-008c0502.png b/assets/amiibo/images/icon_046c0001-008c0502.png deleted file mode 100644 index d0c18d3ca..000000000 Binary files a/assets/amiibo/images/icon_046c0001-008c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_046d0001-00f30502.png b/assets/amiibo/images/icon_046d0001-00f30502.png deleted file mode 100644 index 3d52d9285..000000000 Binary files a/assets/amiibo/images/icon_046d0001-00f30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04780001-01630502.png b/assets/amiibo/images/icon_04780001-01630502.png deleted file mode 100644 index fc72e2691..000000000 Binary files a/assets/amiibo/images/icon_04780001-01630502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04790001-00920502.png b/assets/amiibo/images/icon_04790001-00920502.png deleted file mode 100644 index d7d5bd169..000000000 Binary files a/assets/amiibo/images/icon_04790001-00920502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_047a0001-00600502.png b/assets/amiibo/images/icon_047a0001-00600502.png deleted file mode 100644 index b047d7ef3..000000000 Binary files a/assets/amiibo/images/icon_047a0001-00600502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_047b0001-00f50502.png b/assets/amiibo/images/icon_047b0001-00f50502.png deleted file mode 100644 index c7bf99573..000000000 Binary files a/assets/amiibo/images/icon_047b0001-00f50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_047c0001-01a00502.png b/assets/amiibo/images/icon_047c0001-01a00502.png deleted file mode 100644 index 29b0f6e45..000000000 Binary files a/assets/amiibo/images/icon_047c0001-01a00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_047d0001-012e0502.png b/assets/amiibo/images/icon_047d0001-012e0502.png deleted file mode 100644 index d67d9926e..000000000 Binary files a/assets/amiibo/images/icon_047d0001-012e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04800001-008d0502.png b/assets/amiibo/images/icon_04800001-008d0502.png deleted file mode 100644 index 80a4ea82d..000000000 Binary files a/assets/amiibo/images/icon_04800001-008d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04810001-02f10502.png b/assets/amiibo/images/icon_04810001-02f10502.png deleted file mode 100644 index 51e1b6ed9..000000000 Binary files a/assets/amiibo/images/icon_04810001-02f10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04820001-02fd0502.png b/assets/amiibo/images/icon_04820001-02fd0502.png deleted file mode 100644 index 911c35d00..000000000 Binary files a/assets/amiibo/images/icon_04820001-02fd0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04830001-01b00502.png b/assets/amiibo/images/icon_04830001-01b00502.png deleted file mode 100644 index cbd81bd4b..000000000 Binary files a/assets/amiibo/images/icon_04830001-01b00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04850001-014c0502.png b/assets/amiibo/images/icon_04850001-014c0502.png deleted file mode 100644 index 6bbb3dd03..000000000 Binary files a/assets/amiibo/images/icon_04850001-014c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04860001-00fc0502.png b/assets/amiibo/images/icon_04860001-00fc0502.png deleted file mode 100644 index 974999f4d..000000000 Binary files a/assets/amiibo/images/icon_04860001-00fc0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04870001-01bf0502.png b/assets/amiibo/images/icon_04870001-01bf0502.png deleted file mode 100644 index afec0720a..000000000 Binary files a/assets/amiibo/images/icon_04870001-01bf0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04880001-00980502.png b/assets/amiibo/images/icon_04880001-00980502.png deleted file mode 100644 index b7a96db41..000000000 Binary files a/assets/amiibo/images/icon_04880001-00980502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04890001-00ef0502.png b/assets/amiibo/images/icon_04890001-00ef0502.png deleted file mode 100644 index 5b6376b80..000000000 Binary files a/assets/amiibo/images/icon_04890001-00ef0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04940001-009a0502.png b/assets/amiibo/images/icon_04940001-009a0502.png deleted file mode 100644 index 904e3c38f..000000000 Binary files a/assets/amiibo/images/icon_04940001-009a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04950001-01920502.png b/assets/amiibo/images/icon_04950001-01920502.png deleted file mode 100644 index b8e0bff4c..000000000 Binary files a/assets/amiibo/images/icon_04950001-01920502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04960001-00d90502.png b/assets/amiibo/images/icon_04960001-00d90502.png deleted file mode 100644 index 706c7c38a..000000000 Binary files a/assets/amiibo/images/icon_04960001-00d90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04970001-007a0502.png b/assets/amiibo/images/icon_04970001-007a0502.png deleted file mode 100644 index 281b38190..000000000 Binary files a/assets/amiibo/images/icon_04970001-007a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04980001-014a0502.png b/assets/amiibo/images/icon_04980001-014a0502.png deleted file mode 100644 index d6255e4d9..000000000 Binary files a/assets/amiibo/images/icon_04980001-014a0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04990001-00df0502.png b/assets/amiibo/images/icon_04990001-00df0502.png deleted file mode 100644 index d4fb987ce..000000000 Binary files a/assets/amiibo/images/icon_04990001-00df0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_049a0001-014e0502.png b/assets/amiibo/images/icon_049a0001-014e0502.png deleted file mode 100644 index 7fee6f9bf..000000000 Binary files a/assets/amiibo/images/icon_049a0001-014e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_049b0001-00610502.png b/assets/amiibo/images/icon_049b0001-00610502.png deleted file mode 100644 index 23b46d064..000000000 Binary files a/assets/amiibo/images/icon_049b0001-00610502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_049c0001-01400502.png b/assets/amiibo/images/icon_049c0001-01400502.png deleted file mode 100644 index 9074dc403..000000000 Binary files a/assets/amiibo/images/icon_049c0001-01400502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_049d0001-00ed0502.png b/assets/amiibo/images/icon_049d0001-00ed0502.png deleted file mode 100644 index cf18eb9aa..000000000 Binary files a/assets/amiibo/images/icon_049d0001-00ed0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_049e0001-01b70502.png b/assets/amiibo/images/icon_049e0001-01b70502.png deleted file mode 100644 index 5bbb1ae02..000000000 Binary files a/assets/amiibo/images/icon_049e0001-01b70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_049f0001-03010502.png b/assets/amiibo/images/icon_049f0001-03010502.png deleted file mode 100644 index b3b4417c6..000000000 Binary files a/assets/amiibo/images/icon_049f0001-03010502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04a00001-016e0502.png b/assets/amiibo/images/icon_04a00001-016e0502.png deleted file mode 100644 index 4cb4f0083..000000000 Binary files a/assets/amiibo/images/icon_04a00001-016e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04a10001-016f0502.png b/assets/amiibo/images/icon_04a10001-016f0502.png deleted file mode 100644 index 513f2da6c..000000000 Binary files a/assets/amiibo/images/icon_04a10001-016f0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04a20001-02e80502.png b/assets/amiibo/images/icon_04a20001-02e80502.png deleted file mode 100644 index b5947612d..000000000 Binary files a/assets/amiibo/images/icon_04a20001-02e80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04a30001-01c90502.png b/assets/amiibo/images/icon_04a30001-01c90502.png deleted file mode 100644 index cf1195fcf..000000000 Binary files a/assets/amiibo/images/icon_04a30001-01c90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04a40001-00d40502.png b/assets/amiibo/images/icon_04a40001-00d40502.png deleted file mode 100644 index f6e7a9919..000000000 Binary files a/assets/amiibo/images/icon_04a40001-00d40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04a50001-00740502.png b/assets/amiibo/images/icon_04a50001-00740502.png deleted file mode 100644 index 132809dcf..000000000 Binary files a/assets/amiibo/images/icon_04a50001-00740502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04a60001-00a30502.png b/assets/amiibo/images/icon_04a60001-00a30502.png deleted file mode 100644 index 2c3f56b3b..000000000 Binary files a/assets/amiibo/images/icon_04a60001-00a30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04a70001-01a60502.png b/assets/amiibo/images/icon_04a70001-01a60502.png deleted file mode 100644 index 765967df6..000000000 Binary files a/assets/amiibo/images/icon_04a70001-01a60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04a80101-031e0502.png b/assets/amiibo/images/icon_04a80101-031e0502.png deleted file mode 100644 index 7fa0c4759..000000000 Binary files a/assets/amiibo/images/icon_04a80101-031e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04b20001-01b90502.png b/assets/amiibo/images/icon_04b20001-01b90502.png deleted file mode 100644 index 944f685e1..000000000 Binary files a/assets/amiibo/images/icon_04b20001-01b90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04b30001-00dd0502.png b/assets/amiibo/images/icon_04b30001-00dd0502.png deleted file mode 100644 index b15f5bbe1..000000000 Binary files a/assets/amiibo/images/icon_04b30001-00dd0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04b40001-030c0502.png b/assets/amiibo/images/icon_04b40001-030c0502.png deleted file mode 100644 index 626afa842..000000000 Binary files a/assets/amiibo/images/icon_04b40001-030c0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04b60001-02ec0502.png b/assets/amiibo/images/icon_04b60001-02ec0502.png deleted file mode 100644 index f866d240c..000000000 Binary files a/assets/amiibo/images/icon_04b60001-02ec0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04b90001-01600502.png b/assets/amiibo/images/icon_04b90001-01600502.png deleted file mode 100644 index 1a7cb5d0a..000000000 Binary files a/assets/amiibo/images/icon_04b90001-01600502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04ba0001-005d0502.png b/assets/amiibo/images/icon_04ba0001-005d0502.png deleted file mode 100644 index 523b6993f..000000000 Binary files a/assets/amiibo/images/icon_04ba0001-005d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04c50001-01010502.png b/assets/amiibo/images/icon_04c50001-01010502.png deleted file mode 100644 index 91aaa2926..000000000 Binary files a/assets/amiibo/images/icon_04c50001-01010502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04c60001-01670502.png b/assets/amiibo/images/icon_04c60001-01670502.png deleted file mode 100644 index a6c846513..000000000 Binary files a/assets/amiibo/images/icon_04c60001-01670502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04c70001-00940502.png b/assets/amiibo/images/icon_04c70001-00940502.png deleted file mode 100644 index 59ab69e99..000000000 Binary files a/assets/amiibo/images/icon_04c70001-00940502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04c80001-02ed0502.png b/assets/amiibo/images/icon_04c80001-02ed0502.png deleted file mode 100644 index c092125e6..000000000 Binary files a/assets/amiibo/images/icon_04c80001-02ed0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04c90001-030d0502.png b/assets/amiibo/images/icon_04c90001-030d0502.png deleted file mode 100644 index 44ae1f18c..000000000 Binary files a/assets/amiibo/images/icon_04c90001-030d0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04cc0001-00a40502.png b/assets/amiibo/images/icon_04cc0001-00a40502.png deleted file mode 100644 index 48e0c40a1..000000000 Binary files a/assets/amiibo/images/icon_04cc0001-00a40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04cd0001-01520502.png b/assets/amiibo/images/icon_04cd0001-01520502.png deleted file mode 100644 index 4f68d039b..000000000 Binary files a/assets/amiibo/images/icon_04cd0001-01520502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04ce0001-00db0502.png b/assets/amiibo/images/icon_04ce0001-00db0502.png deleted file mode 100644 index 229987607..000000000 Binary files a/assets/amiibo/images/icon_04ce0001-00db0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04cf0001-00e10502.png b/assets/amiibo/images/icon_04cf0001-00e10502.png deleted file mode 100644 index 8d7805621..000000000 Binary files a/assets/amiibo/images/icon_04cf0001-00e10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04d00001-01960502.png b/assets/amiibo/images/icon_04d00001-01960502.png deleted file mode 100644 index 9aa3c0d2d..000000000 Binary files a/assets/amiibo/images/icon_04d00001-01960502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04d10001-009e0502.png b/assets/amiibo/images/icon_04d10001-009e0502.png deleted file mode 100644 index 7db7be011..000000000 Binary files a/assets/amiibo/images/icon_04d10001-009e0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04d20001-01a70502.png b/assets/amiibo/images/icon_04d20001-01a70502.png deleted file mode 100644 index 1b39b02ad..000000000 Binary files a/assets/amiibo/images/icon_04d20001-01a70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04d30101-031b0502.png b/assets/amiibo/images/icon_04d30101-031b0502.png deleted file mode 100644 index bac3e9ef2..000000000 Binary files a/assets/amiibo/images/icon_04d30101-031b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04dd0001-00a20502.png b/assets/amiibo/images/icon_04dd0001-00a20502.png deleted file mode 100644 index d0d5f1bf2..000000000 Binary files a/assets/amiibo/images/icon_04dd0001-00a20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04de0001-00ce0502.png b/assets/amiibo/images/icon_04de0001-00ce0502.png deleted file mode 100644 index ea0bb8759..000000000 Binary files a/assets/amiibo/images/icon_04de0001-00ce0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04df0001-00e80502.png b/assets/amiibo/images/icon_04df0001-00e80502.png deleted file mode 100644 index 8f1335d1a..000000000 Binary files a/assets/amiibo/images/icon_04df0001-00e80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04e00001-00f70502.png b/assets/amiibo/images/icon_04e00001-00f70502.png deleted file mode 100644 index e9c66d594..000000000 Binary files a/assets/amiibo/images/icon_04e00001-00f70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04e10001-01be0502.png b/assets/amiibo/images/icon_04e10001-01be0502.png deleted file mode 100644 index 9bdd6e29a..000000000 Binary files a/assets/amiibo/images/icon_04e10001-01be0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04e20001-01090502.png b/assets/amiibo/images/icon_04e20001-01090502.png deleted file mode 100644 index e75376d4a..000000000 Binary files a/assets/amiibo/images/icon_04e20001-01090502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04e30001-01650502.png b/assets/amiibo/images/icon_04e30001-01650502.png deleted file mode 100644 index 534c4c7fd..000000000 Binary files a/assets/amiibo/images/icon_04e30001-01650502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04e40001-01b60502.png b/assets/amiibo/images/icon_04e40001-01b60502.png deleted file mode 100644 index f0132edf7..000000000 Binary files a/assets/amiibo/images/icon_04e40001-01b60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04e50001-01ad0502.png b/assets/amiibo/images/icon_04e50001-01ad0502.png deleted file mode 100644 index e4f6011c7..000000000 Binary files a/assets/amiibo/images/icon_04e50001-01ad0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04e60001-00820502.png b/assets/amiibo/images/icon_04e60001-00820502.png deleted file mode 100644 index 7417922d7..000000000 Binary files a/assets/amiibo/images/icon_04e60001-00820502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04e70001-01320502.png b/assets/amiibo/images/icon_04e70001-01320502.png deleted file mode 100644 index 1ab787712..000000000 Binary files a/assets/amiibo/images/icon_04e70001-01320502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04e80001-01ce0502.png b/assets/amiibo/images/icon_04e80001-01ce0502.png deleted file mode 100644 index a8e854a18..000000000 Binary files a/assets/amiibo/images/icon_04e80001-01ce0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04ea0001-03180502.png b/assets/amiibo/images/icon_04ea0001-03180502.png deleted file mode 100644 index d6109cdde..000000000 Binary files a/assets/amiibo/images/icon_04ea0001-03180502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04eb0001-02f00502.png b/assets/amiibo/images/icon_04eb0001-02f00502.png deleted file mode 100644 index 3a3a2e89a..000000000 Binary files a/assets/amiibo/images/icon_04eb0001-02f00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04ec0001-00770502.png b/assets/amiibo/images/icon_04ec0001-00770502.png deleted file mode 100644 index dc8033191..000000000 Binary files a/assets/amiibo/images/icon_04ec0001-00770502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04ed0001-00620502.png b/assets/amiibo/images/icon_04ed0001-00620502.png deleted file mode 100644 index 911e03c9b..000000000 Binary files a/assets/amiibo/images/icon_04ed0001-00620502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04ee0001-014b0502.png b/assets/amiibo/images/icon_04ee0001-014b0502.png deleted file mode 100644 index 7f1dad03e..000000000 Binary files a/assets/amiibo/images/icon_04ee0001-014b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04ef0001-013b0502.png b/assets/amiibo/images/icon_04ef0001-013b0502.png deleted file mode 100644 index 1fc03fcba..000000000 Binary files a/assets/amiibo/images/icon_04ef0001-013b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04fa0001-01680502.png b/assets/amiibo/images/icon_04fa0001-01680502.png deleted file mode 100644 index 82b44dbec..000000000 Binary files a/assets/amiibo/images/icon_04fa0001-01680502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04fb0001-01c60502.png b/assets/amiibo/images/icon_04fb0001-01c60502.png deleted file mode 100644 index 29d0dbce5..000000000 Binary files a/assets/amiibo/images/icon_04fb0001-01c60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04fc0001-02ee0502.png b/assets/amiibo/images/icon_04fc0001-02ee0502.png deleted file mode 100644 index 3426938a4..000000000 Binary files a/assets/amiibo/images/icon_04fc0001-02ee0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04fd0001-007b0502.png b/assets/amiibo/images/icon_04fd0001-007b0502.png deleted file mode 100644 index 001c0e76d..000000000 Binary files a/assets/amiibo/images/icon_04fd0001-007b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04fe0001-00590502.png b/assets/amiibo/images/icon_04fe0001-00590502.png deleted file mode 100644 index fc41a4ac2..000000000 Binary files a/assets/amiibo/images/icon_04fe0001-00590502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_04ff0001-01620502.png b/assets/amiibo/images/icon_04ff0001-01620502.png deleted file mode 100644 index 42457c5b2..000000000 Binary files a/assets/amiibo/images/icon_04ff0001-01620502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05000001-00e70502.png b/assets/amiibo/images/icon_05000001-00e70502.png deleted file mode 100644 index 73163bed2..000000000 Binary files a/assets/amiibo/images/icon_05000001-00e70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_050b0001-00990502.png b/assets/amiibo/images/icon_050b0001-00990502.png deleted file mode 100644 index a3774feec..000000000 Binary files a/assets/amiibo/images/icon_050b0001-00990502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_050c0001-01c10502.png b/assets/amiibo/images/icon_050c0001-01c10502.png deleted file mode 100644 index 460cea4ab..000000000 Binary files a/assets/amiibo/images/icon_050c0001-01c10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_050d0001-01420502.png b/assets/amiibo/images/icon_050d0001-01420502.png deleted file mode 100644 index b4e07f997..000000000 Binary files a/assets/amiibo/images/icon_050d0001-01420502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_050e0001-00d70502.png b/assets/amiibo/images/icon_050e0001-00d70502.png deleted file mode 100644 index 2b69f818b..000000000 Binary files a/assets/amiibo/images/icon_050e0001-00d70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_050f0001-03140502.png b/assets/amiibo/images/icon_050f0001-03140502.png deleted file mode 100644 index 1a1211383..000000000 Binary files a/assets/amiibo/images/icon_050f0001-03140502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05100001-01070502.png b/assets/amiibo/images/icon_05100001-01070502.png deleted file mode 100644 index 1d1f5e4b5..000000000 Binary files a/assets/amiibo/images/icon_05100001-01070502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05110001-01950502.png b/assets/amiibo/images/icon_05110001-01950502.png deleted file mode 100644 index 1367350b9..000000000 Binary files a/assets/amiibo/images/icon_05110001-01950502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05130001-02e70502.png b/assets/amiibo/images/icon_05130001-02e70502.png deleted file mode 100644 index ad3925f85..000000000 Binary files a/assets/amiibo/images/icon_05130001-02e70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05140001-01530502.png b/assets/amiibo/images/icon_05140001-01530502.png deleted file mode 100644 index c594d3330..000000000 Binary files a/assets/amiibo/images/icon_05140001-01530502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05150001-005b0502.png b/assets/amiibo/images/icon_05150001-005b0502.png deleted file mode 100644 index a6246088c..000000000 Binary files a/assets/amiibo/images/icon_05150001-005b0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05800000-00050002.png b/assets/amiibo/images/icon_05800000-00050002.png deleted file mode 100644 index 7ef3ef1d3..000000000 Binary files a/assets/amiibo/images/icon_05800000-00050002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05810000-001c0002.png b/assets/amiibo/images/icon_05810000-001c0002.png deleted file mode 100644 index 76cf31c0d..000000000 Binary files a/assets/amiibo/images/icon_05810000-001c0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05840000-037e0002.png b/assets/amiibo/images/icon_05840000-037e0002.png deleted file mode 100644 index 4f5511d59..000000000 Binary files a/assets/amiibo/images/icon_05840000-037e0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05c00000-00060002.png b/assets/amiibo/images/icon_05c00000-00060002.png deleted file mode 100644 index f05b04bfb..000000000 Binary files a/assets/amiibo/images/icon_05c00000-00060002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05c00000-03651302.png b/assets/amiibo/images/icon_05c00000-03651302.png deleted file mode 100644 index 71b80ee00..000000000 Binary files a/assets/amiibo/images/icon_05c00000-03651302.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05c00000-04121302.png b/assets/amiibo/images/icon_05c00000-04121302.png deleted file mode 100644 index f59e2e38d..000000000 Binary files a/assets/amiibo/images/icon_05c00000-04121302.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05c00100-001d0002.png b/assets/amiibo/images/icon_05c00100-001d0002.png deleted file mode 100644 index 4a3f91858..000000000 Binary files a/assets/amiibo/images/icon_05c00100-001d0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05c10000-03661302.png b/assets/amiibo/images/icon_05c10000-03661302.png deleted file mode 100644 index d0fea06de..000000000 Binary files a/assets/amiibo/images/icon_05c10000-03661302.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05c20000-037f0002.png b/assets/amiibo/images/icon_05c20000-037f0002.png deleted file mode 100644 index 395bbd458..000000000 Binary files a/assets/amiibo/images/icon_05c20000-037f0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05c30000-03800002.png b/assets/amiibo/images/icon_05c30000-03800002.png deleted file mode 100644 index 372efafbd..000000000 Binary files a/assets/amiibo/images/icon_05c30000-03800002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_05c40000-04131302.png b/assets/amiibo/images/icon_05c40000-04131302.png deleted file mode 100644 index 61e224c17..000000000 Binary files a/assets/amiibo/images/icon_05c40000-04131302.png and /dev/null differ diff --git a/assets/amiibo/images/icon_06000000-00120002.png b/assets/amiibo/images/icon_06000000-00120002.png deleted file mode 100644 index 77d355410..000000000 Binary files a/assets/amiibo/images/icon_06000000-00120002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_06400100-001e0002.png b/assets/amiibo/images/icon_06400100-001e0002.png deleted file mode 100644 index 1f6948f1a..000000000 Binary files a/assets/amiibo/images/icon_06400100-001e0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_06420000-035f1102.png b/assets/amiibo/images/icon_06420000-035f1102.png deleted file mode 100644 index 6e851d7e9..000000000 Binary files a/assets/amiibo/images/icon_06420000-035f1102.png and /dev/null differ diff --git a/assets/amiibo/images/icon_06c00000-000f0002.png b/assets/amiibo/images/icon_06c00000-000f0002.png deleted file mode 100644 index 1f07b9ec1..000000000 Binary files a/assets/amiibo/images/icon_06c00000-000f0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07000000-00070002.png b/assets/amiibo/images/icon_07000000-00070002.png deleted file mode 100644 index 3cd5bd046..000000000 Binary files a/assets/amiibo/images/icon_07000000-00070002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07400000-00100002.png b/assets/amiibo/images/icon_07400000-00100002.png deleted file mode 100644 index c5be3753d..000000000 Binary files a/assets/amiibo/images/icon_07400000-00100002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07410000-00200002.png b/assets/amiibo/images/icon_07410000-00200002.png deleted file mode 100644 index 3ba5b062f..000000000 Binary files a/assets/amiibo/images/icon_07410000-00200002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07420000-001f0002.png b/assets/amiibo/images/icon_07420000-001f0002.png deleted file mode 100644 index b60823370..000000000 Binary files a/assets/amiibo/images/icon_07420000-001f0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07800000-002d0002.png b/assets/amiibo/images/icon_07800000-002d0002.png deleted file mode 100644 index afa8d7d15..000000000 Binary files a/assets/amiibo/images/icon_07800000-002d0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07810000-002e0002.png b/assets/amiibo/images/icon_07810000-002e0002.png deleted file mode 100644 index 5491c00cc..000000000 Binary files a/assets/amiibo/images/icon_07810000-002e0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07810000-00330002.png b/assets/amiibo/images/icon_07810000-00330002.png deleted file mode 100644 index cacdaa0fd..000000000 Binary files a/assets/amiibo/images/icon_07810000-00330002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07820000-002f0002.png b/assets/amiibo/images/icon_07820000-002f0002.png deleted file mode 100644 index b6a0fd750..000000000 Binary files a/assets/amiibo/images/icon_07820000-002f0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_078f0000-03810002.png b/assets/amiibo/images/icon_078f0000-03810002.png deleted file mode 100644 index c33e7947a..000000000 Binary files a/assets/amiibo/images/icon_078f0000-03810002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07c00000-00210002.png b/assets/amiibo/images/icon_07c00000-00210002.png deleted file mode 100644 index a9c717d52..000000000 Binary files a/assets/amiibo/images/icon_07c00000-00210002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07c00100-00220002.png b/assets/amiibo/images/icon_07c00100-00220002.png deleted file mode 100644 index 5b6f292e5..000000000 Binary files a/assets/amiibo/images/icon_07c00100-00220002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_07c00200-00230002.png b/assets/amiibo/images/icon_07c00200-00230002.png deleted file mode 100644 index b0a722736..000000000 Binary files a/assets/amiibo/images/icon_07c00200-00230002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000100-003e0402.png b/assets/amiibo/images/icon_08000100-003e0402.png deleted file mode 100644 index 8b36f2ecb..000000000 Binary files a/assets/amiibo/images/icon_08000100-003e0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000100-025f0402.png b/assets/amiibo/images/icon_08000100-025f0402.png deleted file mode 100644 index 124eadf55..000000000 Binary files a/assets/amiibo/images/icon_08000100-025f0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000100-03690402.png b/assets/amiibo/images/icon_08000100-03690402.png deleted file mode 100644 index 280a4bc23..000000000 Binary files a/assets/amiibo/images/icon_08000100-03690402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000100-03820002.png b/assets/amiibo/images/icon_08000100-03820002.png deleted file mode 100644 index cf1f34b7d..000000000 Binary files a/assets/amiibo/images/icon_08000100-03820002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000100-04150402.png b/assets/amiibo/images/icon_08000100-04150402.png deleted file mode 100644 index 1b30696e5..000000000 Binary files a/assets/amiibo/images/icon_08000100-04150402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000200-003f0402.png b/assets/amiibo/images/icon_08000200-003f0402.png deleted file mode 100644 index ad67ecfcb..000000000 Binary files a/assets/amiibo/images/icon_08000200-003f0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000200-02600402.png b/assets/amiibo/images/icon_08000200-02600402.png deleted file mode 100644 index 1dbb393db..000000000 Binary files a/assets/amiibo/images/icon_08000200-02600402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000200-036a0402.png b/assets/amiibo/images/icon_08000200-036a0402.png deleted file mode 100644 index de98a445b..000000000 Binary files a/assets/amiibo/images/icon_08000200-036a0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000300-00400402.png b/assets/amiibo/images/icon_08000300-00400402.png deleted file mode 100644 index 42cd5a5b6..000000000 Binary files a/assets/amiibo/images/icon_08000300-00400402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000300-02610402.png b/assets/amiibo/images/icon_08000300-02610402.png deleted file mode 100644 index e18b73f3f..000000000 Binary files a/assets/amiibo/images/icon_08000300-02610402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08000300-036b0402.png b/assets/amiibo/images/icon_08000300-036b0402.png deleted file mode 100644 index 6bc022f43..000000000 Binary files a/assets/amiibo/images/icon_08000300-036b0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08010000-025d0402.png b/assets/amiibo/images/icon_08010000-025d0402.png deleted file mode 100644 index 6cbee1a7a..000000000 Binary files a/assets/amiibo/images/icon_08010000-025d0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08010000-04360402.png b/assets/amiibo/images/icon_08010000-04360402.png deleted file mode 100644 index b45684564..000000000 Binary files a/assets/amiibo/images/icon_08010000-04360402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08020000-025e0402.png b/assets/amiibo/images/icon_08020000-025e0402.png deleted file mode 100644 index 5fa18cc97..000000000 Binary files a/assets/amiibo/images/icon_08020000-025e0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08020000-04370402.png b/assets/amiibo/images/icon_08020000-04370402.png deleted file mode 100644 index 10cb5987a..000000000 Binary files a/assets/amiibo/images/icon_08020000-04370402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08030000-03760402.png b/assets/amiibo/images/icon_08030000-03760402.png deleted file mode 100644 index 85a5e9f6a..000000000 Binary files a/assets/amiibo/images/icon_08030000-03760402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08030000-04380402.png b/assets/amiibo/images/icon_08030000-04380402.png deleted file mode 100644 index 84425939e..000000000 Binary files a/assets/amiibo/images/icon_08030000-04380402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08040000-03770402.png b/assets/amiibo/images/icon_08040000-03770402.png deleted file mode 100644 index 35880b996..000000000 Binary files a/assets/amiibo/images/icon_08040000-03770402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08040000-04390402.png b/assets/amiibo/images/icon_08040000-04390402.png deleted file mode 100644 index ab3ee111b..000000000 Binary files a/assets/amiibo/images/icon_08040000-04390402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08050100-038e0402.png b/assets/amiibo/images/icon_08050100-038e0402.png deleted file mode 100644 index a14e3641a..000000000 Binary files a/assets/amiibo/images/icon_08050100-038e0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08050200-038f0402.png b/assets/amiibo/images/icon_08050200-038f0402.png deleted file mode 100644 index 6764e467d..000000000 Binary files a/assets/amiibo/images/icon_08050200-038f0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08050200-041b0402.png b/assets/amiibo/images/icon_08050200-041b0402.png deleted file mode 100644 index 03c0cb37a..000000000 Binary files a/assets/amiibo/images/icon_08050200-041b0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08050300-03900402.png b/assets/amiibo/images/icon_08050300-03900402.png deleted file mode 100644 index 8359af06b..000000000 Binary files a/assets/amiibo/images/icon_08050300-03900402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08060100-041c0402.png b/assets/amiibo/images/icon_08060100-041c0402.png deleted file mode 100644 index 695b655c9..000000000 Binary files a/assets/amiibo/images/icon_08060100-041c0402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08070000-04330402.png b/assets/amiibo/images/icon_08070000-04330402.png deleted file mode 100644 index 55641008b..000000000 Binary files a/assets/amiibo/images/icon_08070000-04330402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08080000-04340402.png b/assets/amiibo/images/icon_08080000-04340402.png deleted file mode 100644 index d3070548d..000000000 Binary files a/assets/amiibo/images/icon_08080000-04340402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_08090000-04350402.png b/assets/amiibo/images/icon_08090000-04350402.png deleted file mode 100644 index c7d9baee8..000000000 Binary files a/assets/amiibo/images/icon_08090000-04350402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c00101-02690e02.png b/assets/amiibo/images/icon_09c00101-02690e02.png deleted file mode 100644 index 4b06e9379..000000000 Binary files a/assets/amiibo/images/icon_09c00101-02690e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c00201-026a0e02.png b/assets/amiibo/images/icon_09c00201-026a0e02.png deleted file mode 100644 index cf281b228..000000000 Binary files a/assets/amiibo/images/icon_09c00201-026a0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c00301-026b0e02.png b/assets/amiibo/images/icon_09c00301-026b0e02.png deleted file mode 100644 index 2b34ce4f4..000000000 Binary files a/assets/amiibo/images/icon_09c00301-026b0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c00401-026c0e02.png b/assets/amiibo/images/icon_09c00401-026c0e02.png deleted file mode 100644 index 3626bf2f2..000000000 Binary files a/assets/amiibo/images/icon_09c00401-026c0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c00501-026d0e02.png b/assets/amiibo/images/icon_09c00501-026d0e02.png deleted file mode 100644 index eb75ff4a2..000000000 Binary files a/assets/amiibo/images/icon_09c00501-026d0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c10101-026e0e02.png b/assets/amiibo/images/icon_09c10101-026e0e02.png deleted file mode 100644 index 5ed8fa848..000000000 Binary files a/assets/amiibo/images/icon_09c10101-026e0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c10201-026f0e02.png b/assets/amiibo/images/icon_09c10201-026f0e02.png deleted file mode 100644 index a41f561b1..000000000 Binary files a/assets/amiibo/images/icon_09c10201-026f0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c10301-02700e02.png b/assets/amiibo/images/icon_09c10301-02700e02.png deleted file mode 100644 index 41f0303ab..000000000 Binary files a/assets/amiibo/images/icon_09c10301-02700e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c10401-02710e02.png b/assets/amiibo/images/icon_09c10401-02710e02.png deleted file mode 100644 index a2e9857b3..000000000 Binary files a/assets/amiibo/images/icon_09c10401-02710e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c10501-02720e02.png b/assets/amiibo/images/icon_09c10501-02720e02.png deleted file mode 100644 index 1e2435e58..000000000 Binary files a/assets/amiibo/images/icon_09c10501-02720e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c20101-02730e02.png b/assets/amiibo/images/icon_09c20101-02730e02.png deleted file mode 100644 index e16422004..000000000 Binary files a/assets/amiibo/images/icon_09c20101-02730e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c20201-02740e02.png b/assets/amiibo/images/icon_09c20201-02740e02.png deleted file mode 100644 index 67151ed3e..000000000 Binary files a/assets/amiibo/images/icon_09c20201-02740e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c20301-02750e02.png b/assets/amiibo/images/icon_09c20301-02750e02.png deleted file mode 100644 index 850bf778e..000000000 Binary files a/assets/amiibo/images/icon_09c20301-02750e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c20401-02760e02.png b/assets/amiibo/images/icon_09c20401-02760e02.png deleted file mode 100644 index ee6e9a14c..000000000 Binary files a/assets/amiibo/images/icon_09c20401-02760e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c20501-02770e02.png b/assets/amiibo/images/icon_09c20501-02770e02.png deleted file mode 100644 index 1d78c40f3..000000000 Binary files a/assets/amiibo/images/icon_09c20501-02770e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c30101-02780e02.png b/assets/amiibo/images/icon_09c30101-02780e02.png deleted file mode 100644 index f43043198..000000000 Binary files a/assets/amiibo/images/icon_09c30101-02780e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c30201-02790e02.png b/assets/amiibo/images/icon_09c30201-02790e02.png deleted file mode 100644 index ef5474478..000000000 Binary files a/assets/amiibo/images/icon_09c30201-02790e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c30301-027a0e02.png b/assets/amiibo/images/icon_09c30301-027a0e02.png deleted file mode 100644 index f4499e97c..000000000 Binary files a/assets/amiibo/images/icon_09c30301-027a0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c30401-027b0e02.png b/assets/amiibo/images/icon_09c30401-027b0e02.png deleted file mode 100644 index ad4534890..000000000 Binary files a/assets/amiibo/images/icon_09c30401-027b0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c30501-027c0e02.png b/assets/amiibo/images/icon_09c30501-027c0e02.png deleted file mode 100644 index fd7dd66f4..000000000 Binary files a/assets/amiibo/images/icon_09c30501-027c0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c40101-027d0e02.png b/assets/amiibo/images/icon_09c40101-027d0e02.png deleted file mode 100644 index a06217baf..000000000 Binary files a/assets/amiibo/images/icon_09c40101-027d0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c40201-027e0e02.png b/assets/amiibo/images/icon_09c40201-027e0e02.png deleted file mode 100644 index fe801a167..000000000 Binary files a/assets/amiibo/images/icon_09c40201-027e0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c40301-027f0e02.png b/assets/amiibo/images/icon_09c40301-027f0e02.png deleted file mode 100644 index fe358924d..000000000 Binary files a/assets/amiibo/images/icon_09c40301-027f0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c40401-02800e02.png b/assets/amiibo/images/icon_09c40401-02800e02.png deleted file mode 100644 index 1b29d1338..000000000 Binary files a/assets/amiibo/images/icon_09c40401-02800e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c40501-02810e02.png b/assets/amiibo/images/icon_09c40501-02810e02.png deleted file mode 100644 index 35c48cf56..000000000 Binary files a/assets/amiibo/images/icon_09c40501-02810e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c50101-02820e02.png b/assets/amiibo/images/icon_09c50101-02820e02.png deleted file mode 100644 index 8f6833c11..000000000 Binary files a/assets/amiibo/images/icon_09c50101-02820e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c50201-02830e02.png b/assets/amiibo/images/icon_09c50201-02830e02.png deleted file mode 100644 index 4eac5dbdb..000000000 Binary files a/assets/amiibo/images/icon_09c50201-02830e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c50301-02840e02.png b/assets/amiibo/images/icon_09c50301-02840e02.png deleted file mode 100644 index 5bc86c598..000000000 Binary files a/assets/amiibo/images/icon_09c50301-02840e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c50401-02850e02.png b/assets/amiibo/images/icon_09c50401-02850e02.png deleted file mode 100644 index daaee032a..000000000 Binary files a/assets/amiibo/images/icon_09c50401-02850e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c50501-02860e02.png b/assets/amiibo/images/icon_09c50501-02860e02.png deleted file mode 100644 index 88c3f6338..000000000 Binary files a/assets/amiibo/images/icon_09c50501-02860e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c60101-02870e02.png b/assets/amiibo/images/icon_09c60101-02870e02.png deleted file mode 100644 index d3874a25b..000000000 Binary files a/assets/amiibo/images/icon_09c60101-02870e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c60201-02880e02.png b/assets/amiibo/images/icon_09c60201-02880e02.png deleted file mode 100644 index 9d16e06c5..000000000 Binary files a/assets/amiibo/images/icon_09c60201-02880e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c60301-02890e02.png b/assets/amiibo/images/icon_09c60301-02890e02.png deleted file mode 100644 index 5e6ae378b..000000000 Binary files a/assets/amiibo/images/icon_09c60301-02890e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c60401-028a0e02.png b/assets/amiibo/images/icon_09c60401-028a0e02.png deleted file mode 100644 index 8bae55726..000000000 Binary files a/assets/amiibo/images/icon_09c60401-028a0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c60501-028b0e02.png b/assets/amiibo/images/icon_09c60501-028b0e02.png deleted file mode 100644 index 1f97ae4ed..000000000 Binary files a/assets/amiibo/images/icon_09c60501-028b0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c70101-028c0e02.png b/assets/amiibo/images/icon_09c70101-028c0e02.png deleted file mode 100644 index d13ce245d..000000000 Binary files a/assets/amiibo/images/icon_09c70101-028c0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c70201-028d0e02.png b/assets/amiibo/images/icon_09c70201-028d0e02.png deleted file mode 100644 index e20cae51d..000000000 Binary files a/assets/amiibo/images/icon_09c70201-028d0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c70301-028e0e02.png b/assets/amiibo/images/icon_09c70301-028e0e02.png deleted file mode 100644 index 952ecc950..000000000 Binary files a/assets/amiibo/images/icon_09c70301-028e0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c70401-028f0e02.png b/assets/amiibo/images/icon_09c70401-028f0e02.png deleted file mode 100644 index d0dc99b28..000000000 Binary files a/assets/amiibo/images/icon_09c70401-028f0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c70501-02900e02.png b/assets/amiibo/images/icon_09c70501-02900e02.png deleted file mode 100644 index 9945ad8fe..000000000 Binary files a/assets/amiibo/images/icon_09c70501-02900e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c80101-02910e02.png b/assets/amiibo/images/icon_09c80101-02910e02.png deleted file mode 100644 index b3b1677dc..000000000 Binary files a/assets/amiibo/images/icon_09c80101-02910e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c80201-02920e02.png b/assets/amiibo/images/icon_09c80201-02920e02.png deleted file mode 100644 index 2b8d35f4e..000000000 Binary files a/assets/amiibo/images/icon_09c80201-02920e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c80301-02930e02.png b/assets/amiibo/images/icon_09c80301-02930e02.png deleted file mode 100644 index 436ade949..000000000 Binary files a/assets/amiibo/images/icon_09c80301-02930e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c80401-02940e02.png b/assets/amiibo/images/icon_09c80401-02940e02.png deleted file mode 100644 index c5e3778e7..000000000 Binary files a/assets/amiibo/images/icon_09c80401-02940e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c80501-02950e02.png b/assets/amiibo/images/icon_09c80501-02950e02.png deleted file mode 100644 index fe389a659..000000000 Binary files a/assets/amiibo/images/icon_09c80501-02950e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c90101-02960e02.png b/assets/amiibo/images/icon_09c90101-02960e02.png deleted file mode 100644 index d57f5999e..000000000 Binary files a/assets/amiibo/images/icon_09c90101-02960e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c90201-02970e02.png b/assets/amiibo/images/icon_09c90201-02970e02.png deleted file mode 100644 index 7baf1ce76..000000000 Binary files a/assets/amiibo/images/icon_09c90201-02970e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c90301-02980e02.png b/assets/amiibo/images/icon_09c90301-02980e02.png deleted file mode 100644 index 616b3b598..000000000 Binary files a/assets/amiibo/images/icon_09c90301-02980e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c90401-02990e02.png b/assets/amiibo/images/icon_09c90401-02990e02.png deleted file mode 100644 index dcb3a1c8d..000000000 Binary files a/assets/amiibo/images/icon_09c90401-02990e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09c90501-029a0e02.png b/assets/amiibo/images/icon_09c90501-029a0e02.png deleted file mode 100644 index a7568ace1..000000000 Binary files a/assets/amiibo/images/icon_09c90501-029a0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09ca0101-029b0e02.png b/assets/amiibo/images/icon_09ca0101-029b0e02.png deleted file mode 100644 index 78eb4604d..000000000 Binary files a/assets/amiibo/images/icon_09ca0101-029b0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09ca0201-029c0e02.png b/assets/amiibo/images/icon_09ca0201-029c0e02.png deleted file mode 100644 index 4252e0811..000000000 Binary files a/assets/amiibo/images/icon_09ca0201-029c0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09ca0301-029d0e02.png b/assets/amiibo/images/icon_09ca0301-029d0e02.png deleted file mode 100644 index 9b2000936..000000000 Binary files a/assets/amiibo/images/icon_09ca0301-029d0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09ca0401-029e0e02.png b/assets/amiibo/images/icon_09ca0401-029e0e02.png deleted file mode 100644 index 75629fba4..000000000 Binary files a/assets/amiibo/images/icon_09ca0401-029e0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09ca0501-029f0e02.png b/assets/amiibo/images/icon_09ca0501-029f0e02.png deleted file mode 100644 index bf7b20627..000000000 Binary files a/assets/amiibo/images/icon_09ca0501-029f0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cb0101-02a00e02.png b/assets/amiibo/images/icon_09cb0101-02a00e02.png deleted file mode 100644 index 0be53a6ec..000000000 Binary files a/assets/amiibo/images/icon_09cb0101-02a00e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cb0201-02a10e02.png b/assets/amiibo/images/icon_09cb0201-02a10e02.png deleted file mode 100644 index cbeab29a0..000000000 Binary files a/assets/amiibo/images/icon_09cb0201-02a10e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cb0301-02a20e02.png b/assets/amiibo/images/icon_09cb0301-02a20e02.png deleted file mode 100644 index 116c54001..000000000 Binary files a/assets/amiibo/images/icon_09cb0301-02a20e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cb0401-02a30e02.png b/assets/amiibo/images/icon_09cb0401-02a30e02.png deleted file mode 100644 index cc6dd95e3..000000000 Binary files a/assets/amiibo/images/icon_09cb0401-02a30e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cb0501-02a40e02.png b/assets/amiibo/images/icon_09cb0501-02a40e02.png deleted file mode 100644 index 2d83d372a..000000000 Binary files a/assets/amiibo/images/icon_09cb0501-02a40e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cc0101-02a50e02.png b/assets/amiibo/images/icon_09cc0101-02a50e02.png deleted file mode 100644 index fed772541..000000000 Binary files a/assets/amiibo/images/icon_09cc0101-02a50e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cc0201-02a60e02.png b/assets/amiibo/images/icon_09cc0201-02a60e02.png deleted file mode 100644 index b9e0f5d60..000000000 Binary files a/assets/amiibo/images/icon_09cc0201-02a60e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cc0301-02a70e02.png b/assets/amiibo/images/icon_09cc0301-02a70e02.png deleted file mode 100644 index 6ae820337..000000000 Binary files a/assets/amiibo/images/icon_09cc0301-02a70e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cc0401-02a80e02.png b/assets/amiibo/images/icon_09cc0401-02a80e02.png deleted file mode 100644 index 5683d4d60..000000000 Binary files a/assets/amiibo/images/icon_09cc0401-02a80e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cc0501-02a90e02.png b/assets/amiibo/images/icon_09cc0501-02a90e02.png deleted file mode 100644 index 14563a651..000000000 Binary files a/assets/amiibo/images/icon_09cc0501-02a90e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cd0101-02aa0e02.png b/assets/amiibo/images/icon_09cd0101-02aa0e02.png deleted file mode 100644 index b078973ea..000000000 Binary files a/assets/amiibo/images/icon_09cd0101-02aa0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cd0201-02ab0e02.png b/assets/amiibo/images/icon_09cd0201-02ab0e02.png deleted file mode 100644 index 40e8ebe08..000000000 Binary files a/assets/amiibo/images/icon_09cd0201-02ab0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cd0301-02ac0e02.png b/assets/amiibo/images/icon_09cd0301-02ac0e02.png deleted file mode 100644 index 728bdd9bc..000000000 Binary files a/assets/amiibo/images/icon_09cd0301-02ac0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cd0401-02ad0e02.png b/assets/amiibo/images/icon_09cd0401-02ad0e02.png deleted file mode 100644 index dd4c21a1c..000000000 Binary files a/assets/amiibo/images/icon_09cd0401-02ad0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cd0501-02ae0e02.png b/assets/amiibo/images/icon_09cd0501-02ae0e02.png deleted file mode 100644 index 589141a07..000000000 Binary files a/assets/amiibo/images/icon_09cd0501-02ae0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09ce0101-02af0e02.png b/assets/amiibo/images/icon_09ce0101-02af0e02.png deleted file mode 100644 index f11a9255d..000000000 Binary files a/assets/amiibo/images/icon_09ce0101-02af0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09ce0201-02b00e02.png b/assets/amiibo/images/icon_09ce0201-02b00e02.png deleted file mode 100644 index a00c613bd..000000000 Binary files a/assets/amiibo/images/icon_09ce0201-02b00e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09ce0301-02b10e02.png b/assets/amiibo/images/icon_09ce0301-02b10e02.png deleted file mode 100644 index cd80a6c9d..000000000 Binary files a/assets/amiibo/images/icon_09ce0301-02b10e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09ce0401-02b20e02.png b/assets/amiibo/images/icon_09ce0401-02b20e02.png deleted file mode 100644 index 0a487fa8c..000000000 Binary files a/assets/amiibo/images/icon_09ce0401-02b20e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09ce0501-02b30e02.png b/assets/amiibo/images/icon_09ce0501-02b30e02.png deleted file mode 100644 index f0b64e622..000000000 Binary files a/assets/amiibo/images/icon_09ce0501-02b30e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cf0101-02b40e02.png b/assets/amiibo/images/icon_09cf0101-02b40e02.png deleted file mode 100644 index 631fc0625..000000000 Binary files a/assets/amiibo/images/icon_09cf0101-02b40e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cf0201-02b50e02.png b/assets/amiibo/images/icon_09cf0201-02b50e02.png deleted file mode 100644 index 1369f4a0a..000000000 Binary files a/assets/amiibo/images/icon_09cf0201-02b50e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cf0301-02b60e02.png b/assets/amiibo/images/icon_09cf0301-02b60e02.png deleted file mode 100644 index 47583c338..000000000 Binary files a/assets/amiibo/images/icon_09cf0301-02b60e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cf0401-02b70e02.png b/assets/amiibo/images/icon_09cf0401-02b70e02.png deleted file mode 100644 index 7ccca04fb..000000000 Binary files a/assets/amiibo/images/icon_09cf0401-02b70e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09cf0501-02b80e02.png b/assets/amiibo/images/icon_09cf0501-02b80e02.png deleted file mode 100644 index d89f69c11..000000000 Binary files a/assets/amiibo/images/icon_09cf0501-02b80e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09d00101-02b90e02.png b/assets/amiibo/images/icon_09d00101-02b90e02.png deleted file mode 100644 index 98251a253..000000000 Binary files a/assets/amiibo/images/icon_09d00101-02b90e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09d00201-02ba0e02.png b/assets/amiibo/images/icon_09d00201-02ba0e02.png deleted file mode 100644 index 6fd847af8..000000000 Binary files a/assets/amiibo/images/icon_09d00201-02ba0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09d00301-02bb0e02.png b/assets/amiibo/images/icon_09d00301-02bb0e02.png deleted file mode 100644 index d1777e410..000000000 Binary files a/assets/amiibo/images/icon_09d00301-02bb0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09d00401-02bc0e02.png b/assets/amiibo/images/icon_09d00401-02bc0e02.png deleted file mode 100644 index d406b5401..000000000 Binary files a/assets/amiibo/images/icon_09d00401-02bc0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09d00501-02bd0e02.png b/assets/amiibo/images/icon_09d00501-02bd0e02.png deleted file mode 100644 index 3ace8999f..000000000 Binary files a/assets/amiibo/images/icon_09d00501-02bd0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09d10101-02be0e02.png b/assets/amiibo/images/icon_09d10101-02be0e02.png deleted file mode 100644 index faa60b54e..000000000 Binary files a/assets/amiibo/images/icon_09d10101-02be0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09d10201-02bf0e02.png b/assets/amiibo/images/icon_09d10201-02bf0e02.png deleted file mode 100644 index 14d77a191..000000000 Binary files a/assets/amiibo/images/icon_09d10201-02bf0e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09d10301-02c00e02.png b/assets/amiibo/images/icon_09d10301-02c00e02.png deleted file mode 100644 index 327294a0a..000000000 Binary files a/assets/amiibo/images/icon_09d10301-02c00e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09d10401-02c10e02.png b/assets/amiibo/images/icon_09d10401-02c10e02.png deleted file mode 100644 index 71d4cdbbf..000000000 Binary files a/assets/amiibo/images/icon_09d10401-02c10e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_09d10501-02c20e02.png b/assets/amiibo/images/icon_09d10501-02c20e02.png deleted file mode 100644 index 4ec9c4fcd..000000000 Binary files a/assets/amiibo/images/icon_09d10501-02c20e02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a000001-03ab0502.png b/assets/amiibo/images/icon_0a000001-03ab0502.png deleted file mode 100644 index 510277318..000000000 Binary files a/assets/amiibo/images/icon_0a000001-03ab0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a010001-03ac0502.png b/assets/amiibo/images/icon_0a010001-03ac0502.png deleted file mode 100644 index c7c554873..000000000 Binary files a/assets/amiibo/images/icon_0a010001-03ac0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a020001-03b30502.png b/assets/amiibo/images/icon_0a020001-03b30502.png deleted file mode 100644 index d18384c2c..000000000 Binary files a/assets/amiibo/images/icon_0a020001-03b30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a030001-03b40502.png b/assets/amiibo/images/icon_0a030001-03b40502.png deleted file mode 100644 index 926e0f1aa..000000000 Binary files a/assets/amiibo/images/icon_0a030001-03b40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a040001-03b50502.png b/assets/amiibo/images/icon_0a040001-03b50502.png deleted file mode 100644 index 363f70b2f..000000000 Binary files a/assets/amiibo/images/icon_0a040001-03b50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a050001-03b80502.png b/assets/amiibo/images/icon_0a050001-03b80502.png deleted file mode 100644 index 16d9bb7cd..000000000 Binary files a/assets/amiibo/images/icon_0a050001-03b80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a060001-03ba0502.png b/assets/amiibo/images/icon_0a060001-03ba0502.png deleted file mode 100644 index 07bc3cd25..000000000 Binary files a/assets/amiibo/images/icon_0a060001-03ba0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a070001-03bc0502.png b/assets/amiibo/images/icon_0a070001-03bc0502.png deleted file mode 100644 index 3aa13de02..000000000 Binary files a/assets/amiibo/images/icon_0a070001-03bc0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a080001-03bd0502.png b/assets/amiibo/images/icon_0a080001-03bd0502.png deleted file mode 100644 index caecf627c..000000000 Binary files a/assets/amiibo/images/icon_0a080001-03bd0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a090001-03c00502.png b/assets/amiibo/images/icon_0a090001-03c00502.png deleted file mode 100644 index d86a8f141..000000000 Binary files a/assets/amiibo/images/icon_0a090001-03c00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a0a0001-03c10502.png b/assets/amiibo/images/icon_0a0a0001-03c10502.png deleted file mode 100644 index 746aacea7..000000000 Binary files a/assets/amiibo/images/icon_0a0a0001-03c10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a0b0001-03c20502.png b/assets/amiibo/images/icon_0a0b0001-03c20502.png deleted file mode 100644 index e29db73ab..000000000 Binary files a/assets/amiibo/images/icon_0a0b0001-03c20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a0c0001-03c30502.png b/assets/amiibo/images/icon_0a0c0001-03c30502.png deleted file mode 100644 index 22f1a3f45..000000000 Binary files a/assets/amiibo/images/icon_0a0c0001-03c30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a0d0001-03c40502.png b/assets/amiibo/images/icon_0a0d0001-03c40502.png deleted file mode 100644 index 91c74f3c2..000000000 Binary files a/assets/amiibo/images/icon_0a0d0001-03c40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a0e0001-03c50502.png b/assets/amiibo/images/icon_0a0e0001-03c50502.png deleted file mode 100644 index 40f7bbc90..000000000 Binary files a/assets/amiibo/images/icon_0a0e0001-03c50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a0f0001-03c60502.png b/assets/amiibo/images/icon_0a0f0001-03c60502.png deleted file mode 100644 index 718cf8cb1..000000000 Binary files a/assets/amiibo/images/icon_0a0f0001-03c60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a100001-03c70502.png b/assets/amiibo/images/icon_0a100001-03c70502.png deleted file mode 100644 index a94756028..000000000 Binary files a/assets/amiibo/images/icon_0a100001-03c70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a110001-03c80502.png b/assets/amiibo/images/icon_0a110001-03c80502.png deleted file mode 100644 index 8d1780827..000000000 Binary files a/assets/amiibo/images/icon_0a110001-03c80502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a120001-03c90502.png b/assets/amiibo/images/icon_0a120001-03c90502.png deleted file mode 100644 index 501457991..000000000 Binary files a/assets/amiibo/images/icon_0a120001-03c90502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a130001-03ca0502.png b/assets/amiibo/images/icon_0a130001-03ca0502.png deleted file mode 100644 index 8f00679e7..000000000 Binary files a/assets/amiibo/images/icon_0a130001-03ca0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a140001-03cb0502.png b/assets/amiibo/images/icon_0a140001-03cb0502.png deleted file mode 100644 index 2bb0a28c1..000000000 Binary files a/assets/amiibo/images/icon_0a140001-03cb0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a150001-03cc0502.png b/assets/amiibo/images/icon_0a150001-03cc0502.png deleted file mode 100644 index 5c4613f86..000000000 Binary files a/assets/amiibo/images/icon_0a150001-03cc0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a160001-03cd0502.png b/assets/amiibo/images/icon_0a160001-03cd0502.png deleted file mode 100644 index d30a7be4e..000000000 Binary files a/assets/amiibo/images/icon_0a160001-03cd0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a170001-03ce0502.png b/assets/amiibo/images/icon_0a170001-03ce0502.png deleted file mode 100644 index ce8a63e93..000000000 Binary files a/assets/amiibo/images/icon_0a170001-03ce0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a180001-03cf0502.png b/assets/amiibo/images/icon_0a180001-03cf0502.png deleted file mode 100644 index e6d69cef8..000000000 Binary files a/assets/amiibo/images/icon_0a180001-03cf0502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a190001-03d00502.png b/assets/amiibo/images/icon_0a190001-03d00502.png deleted file mode 100644 index 49be62741..000000000 Binary files a/assets/amiibo/images/icon_0a190001-03d00502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a1a0001-03d10502.png b/assets/amiibo/images/icon_0a1a0001-03d10502.png deleted file mode 100644 index 8d66162d9..000000000 Binary files a/assets/amiibo/images/icon_0a1a0001-03d10502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a1b0001-03d20502.png b/assets/amiibo/images/icon_0a1b0001-03d20502.png deleted file mode 100644 index 5e8a03b75..000000000 Binary files a/assets/amiibo/images/icon_0a1b0001-03d20502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a1c0001-03d30502.png b/assets/amiibo/images/icon_0a1c0001-03d30502.png deleted file mode 100644 index ae4162a06..000000000 Binary files a/assets/amiibo/images/icon_0a1c0001-03d30502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a1d0001-03d40502.png b/assets/amiibo/images/icon_0a1d0001-03d40502.png deleted file mode 100644 index 4f1882c01..000000000 Binary files a/assets/amiibo/images/icon_0a1d0001-03d40502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a1e0001-03d50502.png b/assets/amiibo/images/icon_0a1e0001-03d50502.png deleted file mode 100644 index 28708b09e..000000000 Binary files a/assets/amiibo/images/icon_0a1e0001-03d50502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a1f0001-03d60502.png b/assets/amiibo/images/icon_0a1f0001-03d60502.png deleted file mode 100644 index e7af35a0b..000000000 Binary files a/assets/amiibo/images/icon_0a1f0001-03d60502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a200001-03d70502.png b/assets/amiibo/images/icon_0a200001-03d70502.png deleted file mode 100644 index 6d22d1c07..000000000 Binary files a/assets/amiibo/images/icon_0a200001-03d70502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_0a400000-041d0002.png b/assets/amiibo/images/icon_0a400000-041d0002.png deleted file mode 100644 index 9274e6a6f..000000000 Binary files a/assets/amiibo/images/icon_0a400000-041d0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_19020000-03830002.png b/assets/amiibo/images/icon_19020000-03830002.png deleted file mode 100644 index 380231ccd..000000000 Binary files a/assets/amiibo/images/icon_19020000-03830002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_19060000-00240002.png b/assets/amiibo/images/icon_19060000-00240002.png deleted file mode 100644 index cb3ed0a25..000000000 Binary files a/assets/amiibo/images/icon_19060000-00240002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_19070000-03840002.png b/assets/amiibo/images/icon_19070000-03840002.png deleted file mode 100644 index 973b04912..000000000 Binary files a/assets/amiibo/images/icon_19070000-03840002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_19190000-00090002.png b/assets/amiibo/images/icon_19190000-00090002.png deleted file mode 100644 index bb245cc1a..000000000 Binary files a/assets/amiibo/images/icon_19190000-00090002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_19270000-00260002.png b/assets/amiibo/images/icon_19270000-00260002.png deleted file mode 100644 index 95ef6c6b4..000000000 Binary files a/assets/amiibo/images/icon_19270000-00260002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_19960000-023d0002.png b/assets/amiibo/images/icon_19960000-023d0002.png deleted file mode 100644 index fbf00009f..000000000 Binary files a/assets/amiibo/images/icon_19960000-023d0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_19ac0000-03850002.png b/assets/amiibo/images/icon_19ac0000-03850002.png deleted file mode 100644 index 907fa0f29..000000000 Binary files a/assets/amiibo/images/icon_19ac0000-03850002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1ac00000-00110002.png b/assets/amiibo/images/icon_1ac00000-00110002.png deleted file mode 100644 index 160d69dd8..000000000 Binary files a/assets/amiibo/images/icon_1ac00000-00110002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1b920000-00250002.png b/assets/amiibo/images/icon_1b920000-00250002.png deleted file mode 100644 index 585dfffce..000000000 Binary files a/assets/amiibo/images/icon_1b920000-00250002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1bd70000-03860002.png b/assets/amiibo/images/icon_1bd70000-03860002.png deleted file mode 100644 index 0a9991ee9..000000000 Binary files a/assets/amiibo/images/icon_1bd70000-03860002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1d000001-025c0d02.png b/assets/amiibo/images/icon_1d000001-025c0d02.png deleted file mode 100644 index 8aa9c256a..000000000 Binary files a/assets/amiibo/images/icon_1d000001-025c0d02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1d010000-03750d02.png b/assets/amiibo/images/icon_1d010000-03750d02.png deleted file mode 100644 index df0819ccb..000000000 Binary files a/assets/amiibo/images/icon_1d010000-03750d02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1d400000-03870002.png b/assets/amiibo/images/icon_1d400000-03870002.png deleted file mode 100644 index 709bdb51d..000000000 Binary files a/assets/amiibo/images/icon_1d400000-03870002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1f000000-000a0002.png b/assets/amiibo/images/icon_1f000000-000a0002.png deleted file mode 100644 index a5b1eabbe..000000000 Binary files a/assets/amiibo/images/icon_1f000000-000a0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1f000000-02540c02.png b/assets/amiibo/images/icon_1f000000-02540c02.png deleted file mode 100644 index 8ddf186b9..000000000 Binary files a/assets/amiibo/images/icon_1f000000-02540c02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1f010000-00270002.png b/assets/amiibo/images/icon_1f010000-00270002.png deleted file mode 100644 index 448d7ede5..000000000 Binary files a/assets/amiibo/images/icon_1f010000-00270002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1f010000-02550c02.png b/assets/amiibo/images/icon_1f010000-02550c02.png deleted file mode 100644 index d25052f61..000000000 Binary files a/assets/amiibo/images/icon_1f010000-02550c02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1f020000-00280002.png b/assets/amiibo/images/icon_1f020000-00280002.png deleted file mode 100644 index d0d74dceb..000000000 Binary files a/assets/amiibo/images/icon_1f020000-00280002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1f020000-02560c02.png b/assets/amiibo/images/icon_1f020000-02560c02.png deleted file mode 100644 index 20b535278..000000000 Binary files a/assets/amiibo/images/icon_1f020000-02560c02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1f030000-02570c02.png b/assets/amiibo/images/icon_1f030000-02570c02.png deleted file mode 100644 index e4632f365..000000000 Binary files a/assets/amiibo/images/icon_1f030000-02570c02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_1f400000-035e1002.png b/assets/amiibo/images/icon_1f400000-035e1002.png deleted file mode 100644 index 37f22b45a..000000000 Binary files a/assets/amiibo/images/icon_1f400000-035e1002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21000000-000b0002.png b/assets/amiibo/images/icon_21000000-000b0002.png deleted file mode 100644 index 2760763fe..000000000 Binary files a/assets/amiibo/images/icon_21000000-000b0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21010000-00180002.png b/assets/amiibo/images/icon_21010000-00180002.png deleted file mode 100644 index b17a65b05..000000000 Binary files a/assets/amiibo/images/icon_21010000-00180002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21020000-00290002.png b/assets/amiibo/images/icon_21020000-00290002.png deleted file mode 100644 index 7f39e642f..000000000 Binary files a/assets/amiibo/images/icon_21020000-00290002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21030000-002a0002.png b/assets/amiibo/images/icon_21030000-002a0002.png deleted file mode 100644 index f90edce7f..000000000 Binary files a/assets/amiibo/images/icon_21030000-002a0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21040000-02520002.png b/assets/amiibo/images/icon_21040000-02520002.png deleted file mode 100644 index 60dfd9339..000000000 Binary files a/assets/amiibo/images/icon_21040000-02520002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21050000-025a0002.png b/assets/amiibo/images/icon_21050000-025a0002.png deleted file mode 100644 index 8d351018c..000000000 Binary files a/assets/amiibo/images/icon_21050000-025a0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21050100-03630002.png b/assets/amiibo/images/icon_21050100-03630002.png deleted file mode 100644 index 9d8eabefb..000000000 Binary files a/assets/amiibo/images/icon_21050100-03630002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21060000-03601202.png b/assets/amiibo/images/icon_21060000-03601202.png deleted file mode 100644 index 0d0130aef..000000000 Binary files a/assets/amiibo/images/icon_21060000-03601202.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21070000-03611202.png b/assets/amiibo/images/icon_21070000-03611202.png deleted file mode 100644 index 1b7908769..000000000 Binary files a/assets/amiibo/images/icon_21070000-03611202.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21080000-036f1202.png b/assets/amiibo/images/icon_21080000-036f1202.png deleted file mode 100644 index 383ee8346..000000000 Binary files a/assets/amiibo/images/icon_21080000-036f1202.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21080000-03880002.png b/assets/amiibo/images/icon_21080000-03880002.png deleted file mode 100644 index b33e47866..000000000 Binary files a/assets/amiibo/images/icon_21080000-03880002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_21090000-03701202.png b/assets/amiibo/images/icon_21090000-03701202.png deleted file mode 100644 index b7650618d..000000000 Binary files a/assets/amiibo/images/icon_21090000-03701202.png and /dev/null differ diff --git a/assets/amiibo/images/icon_210b0000-03a50002.png b/assets/amiibo/images/icon_210b0000-03a50002.png deleted file mode 100644 index 51c6bca8c..000000000 Binary files a/assets/amiibo/images/icon_210b0000-03a50002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_22400000-002b0002.png b/assets/amiibo/images/icon_22400000-002b0002.png deleted file mode 100644 index c2a350ac3..000000000 Binary files a/assets/amiibo/images/icon_22400000-002b0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_22410000-041e0002.png b/assets/amiibo/images/icon_22410000-041e0002.png deleted file mode 100644 index 56ac2d891..000000000 Binary files a/assets/amiibo/images/icon_22410000-041e0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_22420000-041f0002.png b/assets/amiibo/images/icon_22420000-041f0002.png deleted file mode 100644 index 98ad4d2c1..000000000 Binary files a/assets/amiibo/images/icon_22420000-041f0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_22430000-043d1b02.png b/assets/amiibo/images/icon_22430000-043d1b02.png deleted file mode 100644 index e26698a04..000000000 Binary files a/assets/amiibo/images/icon_22430000-043d1b02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_22440000-043e1b02.png b/assets/amiibo/images/icon_22440000-043e1b02.png deleted file mode 100644 index 79b056f02..000000000 Binary files a/assets/amiibo/images/icon_22440000-043e1b02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_22800000-002c0002.png b/assets/amiibo/images/icon_22800000-002c0002.png deleted file mode 100644 index dd550c5cb..000000000 Binary files a/assets/amiibo/images/icon_22800000-002c0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_22810000-02510002.png b/assets/amiibo/images/icon_22810000-02510002.png deleted file mode 100644 index 2956ad517..000000000 Binary files a/assets/amiibo/images/icon_22810000-02510002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_22c00000-003a0202.png b/assets/amiibo/images/icon_22c00000-003a0202.png deleted file mode 100644 index c2849b126..000000000 Binary files a/assets/amiibo/images/icon_22c00000-003a0202.png and /dev/null differ diff --git a/assets/amiibo/images/icon_32000000-00300002.png b/assets/amiibo/images/icon_32000000-00300002.png deleted file mode 100644 index e1b5f5b6c..000000000 Binary files a/assets/amiibo/images/icon_32000000-00300002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_32400000-025b0002.png b/assets/amiibo/images/icon_32400000-025b0002.png deleted file mode 100644 index 50e456668..000000000 Binary files a/assets/amiibo/images/icon_32400000-025b0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_32400100-03640002.png b/assets/amiibo/images/icon_32400100-03640002.png deleted file mode 100644 index 95994cb88..000000000 Binary files a/assets/amiibo/images/icon_32400100-03640002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_33400000-00320002.png b/assets/amiibo/images/icon_33400000-00320002.png deleted file mode 100644 index eb0ec7edd..000000000 Binary files a/assets/amiibo/images/icon_33400000-00320002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_33800000-03781402.png b/assets/amiibo/images/icon_33800000-03781402.png deleted file mode 100644 index fe1caf2c3..000000000 Binary files a/assets/amiibo/images/icon_33800000-03781402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_33c00000-04200002.png b/assets/amiibo/images/icon_33c00000-04200002.png deleted file mode 100644 index b234756ef..000000000 Binary files a/assets/amiibo/images/icon_33c00000-04200002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_34800000-00310002.png b/assets/amiibo/images/icon_34800000-00310002.png deleted file mode 100644 index 8a47fc455..000000000 Binary files a/assets/amiibo/images/icon_34800000-00310002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_34800000-02580002.png b/assets/amiibo/images/icon_34800000-02580002.png deleted file mode 100644 index 9bb39319f..000000000 Binary files a/assets/amiibo/images/icon_34800000-02580002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_34800000-03791502.png b/assets/amiibo/images/icon_34800000-03791502.png deleted file mode 100644 index 67c2d9bd5..000000000 Binary files a/assets/amiibo/images/icon_34800000-03791502.png and /dev/null differ diff --git a/assets/amiibo/images/icon_34c00000-02530002.png b/assets/amiibo/images/icon_34c00000-02530002.png deleted file mode 100644 index 67b03e459..000000000 Binary files a/assets/amiibo/images/icon_34c00000-02530002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_34c10000-03890002.png b/assets/amiibo/images/icon_34c10000-03890002.png deleted file mode 100644 index 4f42acca7..000000000 Binary files a/assets/amiibo/images/icon_34c10000-03890002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35000100-02e10f02.png b/assets/amiibo/images/icon_35000100-02e10f02.png deleted file mode 100644 index 98ea3e053..000000000 Binary files a/assets/amiibo/images/icon_35000100-02e10f02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35000200-02e20f02.png b/assets/amiibo/images/icon_35000200-02e20f02.png deleted file mode 100644 index 46ccb906e..000000000 Binary files a/assets/amiibo/images/icon_35000200-02e20f02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35010000-02e30f02.png b/assets/amiibo/images/icon_35010000-02e30f02.png deleted file mode 100644 index 747b4c001..000000000 Binary files a/assets/amiibo/images/icon_35010000-02e30f02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35020100-02e40f02.png b/assets/amiibo/images/icon_35020100-02e40f02.png deleted file mode 100644 index bb15618c1..000000000 Binary files a/assets/amiibo/images/icon_35020100-02e40f02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35030100-02e50f02.png b/assets/amiibo/images/icon_35030100-02e50f02.png deleted file mode 100644 index ce4ca715c..000000000 Binary files a/assets/amiibo/images/icon_35030100-02e50f02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35040100-02e60f02.png b/assets/amiibo/images/icon_35040100-02e60f02.png deleted file mode 100644 index 82ef53cd8..000000000 Binary files a/assets/amiibo/images/icon_35040100-02e60f02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35050000-040c0f02.png b/assets/amiibo/images/icon_35050000-040c0f02.png deleted file mode 100644 index f36c21ae5..000000000 Binary files a/assets/amiibo/images/icon_35050000-040c0f02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35060000-040d0f02.png b/assets/amiibo/images/icon_35060000-040d0f02.png deleted file mode 100644 index c3e362e30..000000000 Binary files a/assets/amiibo/images/icon_35060000-040d0f02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35070000-040e0f02.png b/assets/amiibo/images/icon_35070000-040e0f02.png deleted file mode 100644 index 0268c77df..000000000 Binary files a/assets/amiibo/images/icon_35070000-040e0f02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35080000-040f1802.png b/assets/amiibo/images/icon_35080000-040f1802.png deleted file mode 100644 index 180032a97..000000000 Binary files a/assets/amiibo/images/icon_35080000-040f1802.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35090000-04101802.png b/assets/amiibo/images/icon_35090000-04101802.png deleted file mode 100644 index b51e56865..000000000 Binary files a/assets/amiibo/images/icon_35090000-04101802.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35090100-042b1802.png b/assets/amiibo/images/icon_35090100-042b1802.png deleted file mode 100644 index 5f9be1e18..000000000 Binary files a/assets/amiibo/images/icon_35090100-042b1802.png and /dev/null differ diff --git a/assets/amiibo/images/icon_350a0000-04111802.png b/assets/amiibo/images/icon_350a0000-04111802.png deleted file mode 100644 index 86a830c38..000000000 Binary files a/assets/amiibo/images/icon_350a0000-04111802.png and /dev/null differ diff --git a/assets/amiibo/images/icon_350a0100-042c1802.png b/assets/amiibo/images/icon_350a0100-042c1802.png deleted file mode 100644 index 0bf05657b..000000000 Binary files a/assets/amiibo/images/icon_350a0100-042c1802.png and /dev/null differ diff --git a/assets/amiibo/images/icon_350b0000-042d1802.png b/assets/amiibo/images/icon_350b0000-042d1802.png deleted file mode 100644 index 0cbfd3112..000000000 Binary files a/assets/amiibo/images/icon_350b0000-042d1802.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35c00000-02500a02.png b/assets/amiibo/images/icon_35c00000-02500a02.png deleted file mode 100644 index 3b451e5fd..000000000 Binary files a/assets/amiibo/images/icon_35c00000-02500a02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35c00000-03920a02.png b/assets/amiibo/images/icon_35c00000-03920a02.png deleted file mode 100644 index 3eff209bf..000000000 Binary files a/assets/amiibo/images/icon_35c00000-03920a02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35c10000-036c0a02.png b/assets/amiibo/images/icon_35c10000-036c0a02.png deleted file mode 100644 index 6a6cc340b..000000000 Binary files a/assets/amiibo/images/icon_35c10000-036c0a02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35c20000-036d0a02.png b/assets/amiibo/images/icon_35c20000-036d0a02.png deleted file mode 100644 index a40f12e06..000000000 Binary files a/assets/amiibo/images/icon_35c20000-036d0a02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_35c30000-036e0a02.png b/assets/amiibo/images/icon_35c30000-036e0a02.png deleted file mode 100644 index f9b10e3b4..000000000 Binary files a/assets/amiibo/images/icon_35c30000-036e0a02.png and /dev/null differ diff --git a/assets/amiibo/images/icon_36000000-02590002.png b/assets/amiibo/images/icon_36000000-02590002.png deleted file mode 100644 index 5f989aa44..000000000 Binary files a/assets/amiibo/images/icon_36000000-02590002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_36000100-03620002.png b/assets/amiibo/images/icon_36000100-03620002.png deleted file mode 100644 index 9d7fd0bb7..000000000 Binary files a/assets/amiibo/images/icon_36000100-03620002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_36010000-04210002.png b/assets/amiibo/images/icon_36010000-04210002.png deleted file mode 100644 index ea0a4faca..000000000 Binary files a/assets/amiibo/images/icon_36010000-04210002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_36400000-03a20002.png b/assets/amiibo/images/icon_36400000-03a20002.png deleted file mode 100644 index ac5396b0a..000000000 Binary files a/assets/amiibo/images/icon_36400000-03a20002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_37400001-03741402.png b/assets/amiibo/images/icon_37400001-03741402.png deleted file mode 100644 index 379f45227..000000000 Binary files a/assets/amiibo/images/icon_37400001-03741402.png and /dev/null differ diff --git a/assets/amiibo/images/icon_37800000-038a0002.png b/assets/amiibo/images/icon_37800000-038a0002.png deleted file mode 100644 index d9ee41829..000000000 Binary files a/assets/amiibo/images/icon_37800000-038a0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_37c00000-038b0002.png b/assets/amiibo/images/icon_37c00000-038b0002.png deleted file mode 100644 index b27281627..000000000 Binary files a/assets/amiibo/images/icon_37c00000-038b0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_37c10000-038c0002.png b/assets/amiibo/images/icon_37c10000-038c0002.png deleted file mode 100644 index 80de69f07..000000000 Binary files a/assets/amiibo/images/icon_37c10000-038c0002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38000001-03931702.png b/assets/amiibo/images/icon_38000001-03931702.png deleted file mode 100644 index ef4ac5d96..000000000 Binary files a/assets/amiibo/images/icon_38000001-03931702.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38010001-03941702.png b/assets/amiibo/images/icon_38010001-03941702.png deleted file mode 100644 index 9eac608a1..000000000 Binary files a/assets/amiibo/images/icon_38010001-03941702.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38020001-03951702.png b/assets/amiibo/images/icon_38020001-03951702.png deleted file mode 100644 index c9871b605..000000000 Binary files a/assets/amiibo/images/icon_38020001-03951702.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38030001-03961702.png b/assets/amiibo/images/icon_38030001-03961702.png deleted file mode 100644 index 5df5e5451..000000000 Binary files a/assets/amiibo/images/icon_38030001-03961702.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38040001-03971702.png b/assets/amiibo/images/icon_38040001-03971702.png deleted file mode 100644 index 7a4ea23f2..000000000 Binary files a/assets/amiibo/images/icon_38040001-03971702.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38050001-03981702.png b/assets/amiibo/images/icon_38050001-03981702.png deleted file mode 100644 index 761af21c2..000000000 Binary files a/assets/amiibo/images/icon_38050001-03981702.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38400001-04241902.png b/assets/amiibo/images/icon_38400001-04241902.png deleted file mode 100644 index 026dba66e..000000000 Binary files a/assets/amiibo/images/icon_38400001-04241902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38410001-04251902.png b/assets/amiibo/images/icon_38410001-04251902.png deleted file mode 100644 index ca0e85254..000000000 Binary files a/assets/amiibo/images/icon_38410001-04251902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38420001-04261902.png b/assets/amiibo/images/icon_38420001-04261902.png deleted file mode 100644 index d2124f8f8..000000000 Binary files a/assets/amiibo/images/icon_38420001-04261902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38430001-04271902.png b/assets/amiibo/images/icon_38430001-04271902.png deleted file mode 100644 index d3b43a51c..000000000 Binary files a/assets/amiibo/images/icon_38430001-04271902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38440001-04281902.png b/assets/amiibo/images/icon_38440001-04281902.png deleted file mode 100644 index e492f8682..000000000 Binary files a/assets/amiibo/images/icon_38440001-04281902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38450001-04291902.png b/assets/amiibo/images/icon_38450001-04291902.png deleted file mode 100644 index 45fcc10f7..000000000 Binary files a/assets/amiibo/images/icon_38450001-04291902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38460001-042a1902.png b/assets/amiibo/images/icon_38460001-042a1902.png deleted file mode 100644 index 7d6001adb..000000000 Binary files a/assets/amiibo/images/icon_38460001-042a1902.png and /dev/null differ diff --git a/assets/amiibo/images/icon_38c00000-03911602.png b/assets/amiibo/images/icon_38c00000-03911602.png deleted file mode 100644 index c0b859397..000000000 Binary files a/assets/amiibo/images/icon_38c00000-03911602.png and /dev/null differ diff --git a/assets/amiibo/images/icon_3a000000-03a10002.png b/assets/amiibo/images/icon_3a000000-03a10002.png deleted file mode 100644 index 74d62f68d..000000000 Binary files a/assets/amiibo/images/icon_3a000000-03a10002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_3b400000-03a30002.png b/assets/amiibo/images/icon_3b400000-03a30002.png deleted file mode 100644 index 31f46a05e..000000000 Binary files a/assets/amiibo/images/icon_3b400000-03a30002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_3c800000-03a40002.png b/assets/amiibo/images/icon_3c800000-03a40002.png deleted file mode 100644 index a84d3e7c0..000000000 Binary files a/assets/amiibo/images/icon_3c800000-03a40002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_3dc00000-04220002.png b/assets/amiibo/images/icon_3dc00000-04220002.png deleted file mode 100644 index cf567ee88..000000000 Binary files a/assets/amiibo/images/icon_3dc00000-04220002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_3dc10000-04230002.png b/assets/amiibo/images/icon_3dc10000-04230002.png deleted file mode 100644 index f218ad8d9..000000000 Binary files a/assets/amiibo/images/icon_3dc10000-04230002.png and /dev/null differ diff --git a/assets/amiibo/images/icon_3f000000-042e0002.png b/assets/amiibo/images/icon_3f000000-042e0002.png deleted file mode 100644 index 90f97bd2d..000000000 Binary files a/assets/amiibo/images/icon_3f000000-042e0002.png and /dev/null differ diff --git a/assets/locales.json b/assets/locales.json new file mode 100644 index 000000000..d931017aa --- /dev/null +++ b/assets/locales.json @@ -0,0 +1,25026 @@ +{ + "Languages": [ + "ar_SA", + "de_DE", + "el_GR", + "en_US", + "es_ES", + "fr_FR", + "he_IL", + "it_IT", + "ja_JP", + "ko_KR", + "no_NO", + "pl_PL", + "pt_BR", + "ru_RU", + "sv_SE", + "th_TH", + "tr_TR", + "uk_UA", + "zh_CN", + "zh_TW" + ], + "Locales": [ + { + "ID": "Language", + "Translations": { + "ar_SA": "اَلْعَرَبِيَّةُ", + "de_DE": "Deutsch", + "el_GR": "Ελληνικά", + "en_US": "English (US)", + "es_ES": "Español (ES)", + "fr_FR": "Français (FR)", + "he_IL": "עִברִית", + "it_IT": "Italiano", + "ja_JP": "日本語", + "ko_KR": "한국어", + "no_NO": "Norsk", + "pl_PL": "Polski", + "pt_BR": "Português (BR)", + "ru_RU": "Русский (RU)", + "sv_SE": "Svenska", + "th_TH": "ภาษาไทย", + "tr_TR": "Türkçe", + "uk_UA": "Українська", + "zh_CN": "简体中文", + "zh_TW": "繁體中文 (台灣)" + } + }, + { + "ID": "MenuBarFileOpenApplet", + "Translations": { + "ar_SA": "فتح التطبيق المصغر", + "de_DE": "Öffne Anwendung", + "el_GR": "Άνοιγμα Applet", + "en_US": "Open Applet", + "es_ES": "Abrir applet", + "fr_FR": "Ouvrir une applet", + "he_IL": "פתח יישומון", + "it_IT": "Apri applet", + "ja_JP": "アプレットを開く", + "ko_KR": "애플릿 열기", + "no_NO": "Åpne Program", + "pl_PL": "Otwórz Aplet", + "pt_BR": "Abrir Applet", + "ru_RU": "Открыть апплет", + "sv_SE": "Öppna applet", + "th_TH": "เปิด Applet", + "tr_TR": "Applet'i Aç", + "uk_UA": "Відкрити аплет", + "zh_CN": "打开小程序", + "zh_TW": "開啟小程式" + } + }, + { + "ID": "MenuBarFileOpenAppletOpenMiiApplet", + "Translations": { + "ar_SA": "", + "de_DE": "Mii-Bearbeitungsapplet", + "el_GR": "", + "en_US": "Mii Edit Applet", + "es_ES": "Applet Editor Mii", + "fr_FR": "Éditeur de Mii", + "he_IL": "", + "it_IT": "Applet Editor Mii", + "ja_JP": "", + "ko_KR": "애플릿 Mii 편집기", + "no_NO": "Mii-redigeringsapplet", + "pl_PL": "", + "pt_BR": "Editor de Mii", + "ru_RU": "Апплет Mii Editor", + "sv_SE": "Redigera Mii-applet", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Аплет редагування Mii", + "zh_CN": "Mii 小程序", + "zh_TW": "Mii 編輯器小程式" + } + }, + { + "ID": "MenuBarFileOpenAppletOpenMiiAppletToolTip", + "Translations": { + "ar_SA": "‫افتح تطبيق تحرير Mii في الوضع المستقل", + "de_DE": "Öffnet das Mii-Editor-Applet im Standalone-Modus", + "el_GR": "Άνοιγμα του Mii Editor Applet σε Αυτόνομη λειτουργία", + "en_US": "Open Mii Editor Applet in Standalone mode", + "es_ES": "Abre el editor de Mii en modo autónomo", + "fr_FR": "Ouvrir l’applet Éditeur Mii en mode autonome", + "he_IL": "פתח את יישומון עורך ה- Mii במצב עצמאי", + "it_IT": "Apri l'applet Editor Mii in modalità Standalone", + "ja_JP": "スタンドアロンモードで Mii エディタアプレットを開きます", + "ko_KR": "독립 실행형 모드로 Mii 편집기 애플릿 열기", + "no_NO": "Åpne Mii Redigerings program i eget vindu", + "pl_PL": "Otwórz aplet Mii Editor w trybie indywidualnym", + "pt_BR": "Abrir Editor de Mii em Modo Independente", + "ru_RU": "Открывает апплет Mii Editor в автономном режиме", + "sv_SE": "Öppna Mii Editor Applet i fristående läge", + "th_TH": "เปิดโปรแกรม Mii Editor Applet", + "tr_TR": "Mii Editör Applet'ini Bağımsız Mod'da Aç", + "uk_UA": "Відкрити аплет Mii Editor в автономному режимі", + "zh_CN": "打开独立的 Mii 小程序", + "zh_TW": "在獨立模式下開啟 Mii 編輯器小程式" + } + }, + { + "ID": "SettingsTabInputDirectMouseAccess", + "Translations": { + "ar_SA": "الوصول المباشر للفأرة", + "de_DE": "Direkter Mauszugriff", + "el_GR": "Άμεση Πρόσβαση Ποντικιού", + "en_US": "Direct Mouse Access", + "es_ES": "Acceso directo al ratón", + "fr_FR": "Accès direct à la souris", + "he_IL": "גישה ישירה לעכבר", + "it_IT": "Accesso diretto al mouse", + "ja_JP": "マウス直接アクセス", + "ko_KR": "마우스 직접 접근", + "no_NO": "Direkte tilgang med Mus", + "pl_PL": "Bezpośredni dostęp do myszy", + "pt_BR": "Acesso Direto ao Mouse", + "ru_RU": "Прямой ввод мыши", + "sv_SE": "Direkt musåtkomst", + "th_TH": "เข้าถึงเมาส์ได้โดยตรง", + "tr_TR": "Doğrudan Mouse Erişimi", + "uk_UA": "Пряме керування мишею", + "zh_CN": "直通鼠标操作", + "zh_TW": "滑鼠直接存取" + } + }, + { + "ID": "SettingsTabSystemMemoryManagerMode", + "Translations": { + "ar_SA": "وضع إدارة الذاكرة:", + "de_DE": "Speichermanagermodus:", + "el_GR": "Λειτουργία Διαχείρισης Μνήμης:", + "en_US": "Memory Manager Mode:", + "es_ES": "Modo del administrador de memoria:", + "fr_FR": "Mode de gestion de la mémoire :", + "he_IL": "מצב מנהל זיכרון:", + "it_IT": "Modalità di gestione della memoria:", + "ja_JP": "メモリ管理モード:", + "ko_KR": "메모리 관리자 모드 :", + "no_NO": "Memory Manager-modus", + "pl_PL": "Tryb menedżera pamięci:", + "pt_BR": "Modo de Gerenciamento da Memória:", + "ru_RU": "Режим менеджера памяти:", + "sv_SE": "Läge för minnehanterare:", + "th_TH": "โหมดจัดการหน่วยความจำ:", + "tr_TR": "Hafıza Yönetim Modu:", + "uk_UA": "Режим диспетчера пам’яті:", + "zh_CN": "内存管理模式:", + "zh_TW": "記憶體管理員模式:" + } + }, + { + "ID": "SettingsTabSystemMemoryManagerModeSoftware", + "Translations": { + "ar_SA": "البرنامج", + "de_DE": "Programme", + "el_GR": "Λογισμικό", + "en_US": "Software", + "es_ES": "", + "fr_FR": "Logiciel", + "he_IL": "תוכנה", + "it_IT": "", + "ja_JP": "ソフトウェア", + "ko_KR": "소프트웨어", + "no_NO": "Programvare", + "pl_PL": "Oprogramowanie", + "pt_BR": "Programa", + "ru_RU": "Программное обеспечение", + "sv_SE": "Programvara", + "th_TH": "ซอฟต์แวร์", + "tr_TR": "Yazılım", + "uk_UA": "Програмне забезпечення", + "zh_CN": "软件管理", + "zh_TW": "軟體模式" + } + }, + { + "ID": "SettingsTabSystemMemoryManagerModeHost", + "Translations": { + "ar_SA": "المُضيف (سريع)", + "de_DE": "Host (schnell)", + "el_GR": "Υπολογιστής (γρήγορο)", + "en_US": "Host (fast)", + "es_ES": "Host (rápido)", + "fr_FR": "Hôte (rapide)", + "he_IL": "מארח (מהיר)", + "it_IT": "Host (veloce)", + "ja_JP": "ホスト (高速)", + "ko_KR": "호스트(빠름)", + "no_NO": "Vert (rask)", + "pl_PL": "Gospodarz (szybki)", + "pt_BR": "Hóspede (rápido)", + "ru_RU": "Хост (быстро)", + "sv_SE": "Värd (snabb)", + "th_TH": "โฮสต์ (เร็ว)", + "tr_TR": "Host (hızlı)", + "uk_UA": "Хост (швидко)", + "zh_CN": "本机映射 (较快)", + "zh_TW": "主體模式 (快速)" + } + }, + { + "ID": "SettingsTabSystemMemoryManagerModeHostUnchecked", + "Translations": { + "ar_SA": "المضيف (غير مفحوص) (أسرع، غير آمن)", + "de_DE": "Host ungeprüft (am schnellsten, unsicher)", + "el_GR": "Χωρίς Ελέγχους (γρηγορότερο, μη ασφαλές)", + "en_US": "Host Unchecked (fastest, unsafe)", + "es_ES": "Host sin verificación (más rápido, inseguro)", + "fr_FR": "Hôte non vérifié (plus rapide, non sécurisé)", + "he_IL": "מארח לא מבוקר (המהיר ביותר, לא בטוח)", + "it_IT": "Host Unchecked (più veloce, non sicura)", + "ja_JP": "ホスト, チェックなし (最高速, 安全でない)", + "ko_KR": "호스트 확인 안함(가장 빠르나 위험)", + "no_NO": "Vert Ukontrollert (raskets, utrygt)", + "pl_PL": "Gospodarza (NIESPRAWDZONY, najszybszy, niebezpieczne)", + "pt_BR": "Hóspede sem Verificação (mais rápido, inseguro)", + "ru_RU": "Хост не установлен (самый быстрый, небезопасный)", + "sv_SE": "Värd inte kontrollerad (snabbaste, osäkert)", + "th_TH": "ไม่ได้ตรวจสอบโฮสต์ (เร็วที่สุด, แต่ไม่ปลอดภัย)", + "tr_TR": "Host Unchecked (en hızlısı, tehlikeli)", + "uk_UA": "Неперевірений хост (найшвидший, небезпечний)", + "zh_CN": "跳过检查的本机映射 (最快,不安全)", + "zh_TW": "主體略過檢查模式 (最快,不安全)" + } + }, + { + "ID": "SettingsTabSystemUseHypervisor", + "Translations": { + "ar_SA": "استخدم مراقب الأجهزة الافتراضية", + "de_DE": "Hypervisor verwenden", + "el_GR": "Χρήση Hypervisor", + "en_US": "Use Hypervisor", + "es_ES": "Usar hipervisor", + "fr_FR": "Utiliser l'Hyperviseur", + "he_IL": "השתמש ב Hypervisor", + "it_IT": "Usa Hypervisor", + "ja_JP": "ハイパーバイザーを使用", + "ko_KR": "하이퍼바이저 사용", + "no_NO": "Bruk Hypervisor", + "pl_PL": "Użyj Hipernadzorcy", + "pt_BR": "Usar Hipervisor", + "ru_RU": "Использовать Hypervisor", + "sv_SE": "Använd Hypervisor", + "th_TH": "ใช้งาน Hypervisor", + "tr_TR": "Hypervisor Kullan", + "uk_UA": "Використовувати гіпервізор", + "zh_CN": "使用 Hypervisor 虚拟化", + "zh_TW": "使用 Hypervisor" + } + }, + { + "ID": "MenuBarFile", + "Translations": { + "ar_SA": "_ملف", + "de_DE": "_Datei", + "el_GR": "_Αρχείο", + "en_US": "_File", + "es_ES": "_Archivo", + "fr_FR": "_Fichier", + "he_IL": "_קובץ", + "it_IT": "", + "ja_JP": "ファイル(_F)", + "ko_KR": "파일(_F)", + "no_NO": "_Fil", + "pl_PL": "_Plik", + "pt_BR": "_Arquivo", + "ru_RU": "_Файл", + "sv_SE": "_Arkiv", + "th_TH": "ไฟล์", + "tr_TR": "_Dosya", + "uk_UA": "_Файл", + "zh_CN": "文件(_F)", + "zh_TW": "檔案(_F)" + } + }, + { + "ID": "MenuBarFileOpenFromFile", + "Translations": { + "ar_SA": "_تحميل تطبيق من ملف", + "de_DE": "Datei _öffnen", + "el_GR": "_Φόρτωση Αρχείου Εφαρμογής", + "en_US": "_Load Application From File", + "es_ES": "_Cargar aplicación desde un archivo", + "fr_FR": "_Charger une application à partir d’un fichier", + "he_IL": "_טען יישום מקובץ", + "it_IT": "_Carica applicazione da un file", + "ja_JP": "ファイルからアプリケーションをロード(_L)", + "ko_KR": "파일에서 앱 불러오기(_L)", + "no_NO": "_Last inn program fra fil", + "pl_PL": "_Załaduj aplikację z pliku", + "pt_BR": "_Abrir ROM do Jogo", + "ru_RU": "_Добавить приложение из файла", + "sv_SE": "_Läs in applikation från fil", + "th_TH": "โหลดแอปพลิเคชั่นจากไฟล์", + "tr_TR": "_Dosyadan Uygulama Aç", + "uk_UA": "_Завантажити програму з файлу", + "zh_CN": "加载游戏文件(_L)", + "zh_TW": "從檔案載入應用程式(_L)" + } + }, + { + "ID": "MenuBarFileOpenFromFileError", + "Translations": { + "ar_SA": "", + "de_DE": "Keine Anwendungen im ausgewählten Datei gefunden.", + "el_GR": "", + "en_US": "No applications found in selected file.", + "es_ES": "No se encontraron aplicaciones en el archivo seleccionado.", + "fr_FR": "Aucune application trouvée dans le fichier sélectionné.", + "he_IL": "", + "it_IT": "Nessuna applicazione trovata nel file selezionato.", + "ja_JP": "", + "ko_KR": "선택한 파일에서 앱을 찾을 수 없습니다.", + "no_NO": "Ingen apper ble funnet i valgt fil.", + "pl_PL": "", + "pt_BR": "Nenhum aplicativo encontrado no arquivo selecionado.", + "ru_RU": "Приложения в выбранном файле не найдены", + "sv_SE": "Inga applikationer hittades i vald fil.", + "th_TH": "ไม่พบแอปพลิเคชั่นจากไฟล์ที่เลือก", + "tr_TR": "", + "uk_UA": "У вибраному файлі не знайдено жодних додатків.", + "zh_CN": "未发现应用", + "zh_TW": "未能從已選擇的檔案中找到應用程式。" + } + }, + { + "ID": "MenuBarFileOpenUnpacked", + "Translations": { + "ar_SA": "تحميل لُعْبَة غير محزومة", + "de_DE": "_Entpacktes Spiel öffnen", + "el_GR": "Φόρτωση Απακετάριστου _Παιχνιδιού", + "en_US": "Load _Unpacked Game", + "es_ES": "Cargar juego _desempaquetado", + "fr_FR": "Charger un jeu décompressé", + "he_IL": "טען משחק _שאינו ארוז", + "it_IT": "Carica _gioco estratto", + "ja_JP": "展開されたゲームをロード", + "ko_KR": "압축 푼 게임 불러오기(_U)", + "no_NO": "Last inn _Upakket spill", + "pl_PL": "Załaduj _rozpakowaną grę", + "pt_BR": "Abrir Jogo _Extraído", + "ru_RU": "Добавить _распакованную игру", + "sv_SE": "Läs in _uppackat spel", + "th_TH": "โหลดเกมที่แตกไฟล์แล้ว", + "tr_TR": "_Sıkıştırılmamış Oyun Aç", + "uk_UA": "Завантажити _розпаковану гру", + "zh_CN": "加载解包后的游戏(_U)", + "zh_TW": "載入未封裝的遊戲(_U)" + } + }, + { + "ID": "MenuBarFileLoadDlcFromFolder", + "Translations": { + "ar_SA": "", + "de_DE": "DLC aus Ordner laden", + "el_GR": "", + "en_US": "Load DLC From Folder", + "es_ES": "Cargar DLC Desde Carpeta", + "fr_FR": "Charger les DLC à partir d’un dossier", + "he_IL": "", + "it_IT": "Carica DLC da una cartella", + "ja_JP": "", + "ko_KR": "폴더에서 DLC 불러오기", + "no_NO": "Last inn DLC fra mappe", + "pl_PL": "", + "pt_BR": "Carregar DLC da Pasta", + "ru_RU": "Загрузить DLC из папки", + "sv_SE": "Läs in DLC från mapp", + "th_TH": "โหลด DLC จากโฟลเดอร์", + "tr_TR": "", + "uk_UA": "Завантажити DLC з теки", + "zh_CN": "从文件夹加载 DLC", + "zh_TW": "從資料夾中載入 DLC" + } + }, + { + "ID": "MenuBarFileLoadTitleUpdatesFromFolder", + "Translations": { + "ar_SA": "", + "de_DE": "Titel-Updates aus Ordner laden", + "el_GR": "", + "en_US": "Load Title Updates From Folder", + "es_ES": "Cargar Actualizaciones de Títulos Desde Carpeta", + "fr_FR": "Charger les mises à jour du titre à partir d’un dossier", + "he_IL": "", + "it_IT": "Carica aggiornamenti da una cartella", + "ja_JP": "", + "ko_KR": "폴더에서 타이틀 업데이트 불러오기", + "no_NO": "Last inn titteloppdateringer fra mappe", + "pl_PL": "", + "pt_BR": "Carregar Atualizações de Jogo da Pasta", + "ru_RU": "Загрузить обновления из папки", + "sv_SE": "Läs in titeluppdateringar från mapp", + "th_TH": "โหลดไฟล์อัพเดตจากโฟลเดอร์", + "tr_TR": "", + "uk_UA": "Завантажити оновлення ігор з теки", + "zh_CN": "从文件夹加载游戏更新", + "zh_TW": "從資料夾中載入遊戲更新" + } + }, + { + "ID": "MenuBarFileOpenEmuFolder", + "Translations": { + "ar_SA": "‫فتح مجلد Ryujinx", + "de_DE": "Ryujinx-Ordner öffnen", + "el_GR": "Άνοιγμα Φακέλου Ryujinx", + "en_US": "Open Ryujinx Folder", + "es_ES": "Abrir carpeta de Ryujinx", + "fr_FR": "Ouvrir le dossier Ryujinx", + "he_IL": "פתח את תיקיית ריוג'ינקס", + "it_IT": "Apri cartella di Ryujinx", + "ja_JP": "Ryujinx フォルダを開く", + "ko_KR": "Ryujinx 폴더 열기", + "no_NO": "Åpne Ryujinx mappe", + "pl_PL": "Otwórz folder Ryujinx", + "pt_BR": "Abrir Pasta do Ryujinx", + "ru_RU": "Открыть папку Ryujinx", + "sv_SE": "Öppna Ryujinx-mapp", + "th_TH": "เปิดโฟลเดอร์ Ryujinx", + "tr_TR": "Ryujinx Klasörünü aç", + "uk_UA": "Відкрити теку Ryujinx", + "zh_CN": "打开 Ryujinx 系统目录", + "zh_TW": "開啟 Ryujinx 資料夾" + } + }, + { + "ID": "MenuBarFileOpenScreenshotsFolder", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Open Screenshots Folder", + "es_ES": "", + "fr_FR": "Ouvrir le dossier des captures d’écran", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "스크린샷 폴더 열기", + "no_NO": "Åpne Skjermbilde Mappen", + "pl_PL": "", + "pt_BR": "Abrir Pasta de Capturas de Tela", + "ru_RU": "Открыть папку со скриншотами", + "sv_SE": "Öppna skärmbildsmappen", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Відкрити теку скріншотів", + "zh_CN": "打开截图文件夹", + "zh_TW": "開啟螢幕擷取畫面資料夾" + } + }, + { + "ID": "MenuBarFileOpenLogsFolder", + "Translations": { + "ar_SA": "فتح مجلد السجلات", + "de_DE": "Logs-Ordner öffnen", + "el_GR": "Άνοιγμα Φακέλου Καταγραφής", + "en_US": "Open Logs Folder", + "es_ES": "Abrir carpeta de registros", + "fr_FR": "Ouvrir le dossier des journaux", + "he_IL": "פתח את תיקיית קבצי הלוג", + "it_IT": "Apri cartella dei log", + "ja_JP": "ログフォルダを開く", + "ko_KR": "로그 폴더 열기", + "no_NO": "Åpne Logg mappen", + "pl_PL": "Otwórz folder plików dziennika zdarzeń", + "pt_BR": "Abrir Pasta de _Logs", + "ru_RU": "Открыть папку с логами", + "sv_SE": "Öppna loggmapp", + "th_TH": "เปิดโฟลเดอร์ Logs", + "tr_TR": "Logs Klasörünü aç", + "uk_UA": "Відкрити теку журналів змін", + "zh_CN": "打开日志目录", + "zh_TW": "開啟日誌資料夾" + } + }, + { + "ID": "MenuBarFileExit", + "Translations": { + "ar_SA": "_خروج", + "de_DE": "_Beenden", + "el_GR": "_Έξοδος", + "en_US": "_Exit", + "es_ES": "_Salir", + "fr_FR": "_Quitter", + "he_IL": "_יציאה", + "it_IT": "_Esci", + "ja_JP": "終了(_E)", + "ko_KR": "종료(_E)", + "no_NO": "_Avslutt", + "pl_PL": "_Wyjdź", + "pt_BR": "_Sair", + "ru_RU": "_Выход", + "sv_SE": "A_vsluta", + "th_TH": "_ออก", + "tr_TR": "_Çıkış", + "uk_UA": "_Вихід", + "zh_CN": "退出(_E)", + "zh_TW": "結束(_E)" + } + }, + { + "ID": "MenuBarOptions", + "Translations": { + "ar_SA": "_خيارات", + "de_DE": "_Optionen", + "el_GR": "_Επιλογές", + "en_US": "_Options", + "es_ES": "_Opciones", + "fr_FR": "", + "he_IL": "_אפשרויות", + "it_IT": "_Opzioni", + "ja_JP": "オプション(_O)", + "ko_KR": "옵션(_O)", + "no_NO": "_Alternativer", + "pl_PL": "_Opcje", + "pt_BR": "_Opções", + "ru_RU": "_Настройки", + "sv_SE": "I_nställningar", + "th_TH": "_ตัวเลือก", + "tr_TR": "_Seçenekler", + "uk_UA": "_Параметри", + "zh_CN": "选项(_O)", + "zh_TW": "選項(_O)" + } + }, + { + "ID": "MenuBarOptionsToggleFullscreen", + "Translations": { + "ar_SA": "التبديل إلى وضع ملء الشاشة", + "de_DE": "Vollbild", + "el_GR": "Λειτουργία Πλήρους Οθόνης", + "en_US": "Toggle Fullscreen", + "es_ES": "Cambiar a pantalla completa.", + "fr_FR": "Basculer en plein écran", + "he_IL": "שנה מצב- מסך מלא", + "it_IT": "Schermo intero", + "ja_JP": "全画面切り替え", + "ko_KR": "전체 화면 전환", + "no_NO": "Fullskjermsvisning av/på", + "pl_PL": "Przełącz na tryb pełnoekranowy", + "pt_BR": "_Mudar para Tela Cheia", + "ru_RU": "Включить полноэкранный режим", + "sv_SE": "Växla helskärm", + "th_TH": "สลับเป็นโหมดเต็มหน้าจอ", + "tr_TR": "Tam Ekran Modunu Aç", + "uk_UA": "На весь екран", + "zh_CN": "切换全屏", + "zh_TW": "切換全螢幕模式" + } + }, + { + "ID": "MenuBarOptionsStartGamesInFullscreen", + "Translations": { + "ar_SA": "ابدأ الألعاب في وضع ملء الشاشة", + "de_DE": "Spiele im Vollbildmodus starten", + "el_GR": "Εκκίνηση Παιχνιδιών σε Πλήρη Οθόνη", + "en_US": "Start Games in Fullscreen Mode", + "es_ES": "Iniciar juegos en pantalla completa", + "fr_FR": "Démarrer les jeux en mode plein écran", + "he_IL": "התחל משחקים במסך מלא", + "it_IT": "Avvia i giochi a schermo intero", + "ja_JP": "全画面モードでゲームを開始", + "ko_KR": "전체 화면 모드로 게임 시작", + "no_NO": "Start spill i Fullskjermmodus", + "pl_PL": "Uruchamiaj gry w trybie pełnoekranowym", + "pt_BR": "Iniciar Jogos em Tela Cheia", + "ru_RU": "Запускать игры в полноэкранном режиме", + "sv_SE": "Starta spel i helskärmsläge", + "th_TH": "เริ่มเกมในโหมดเต็มหน้าจอ", + "tr_TR": "Oyunları Tam Ekran Modunda Başlat", + "uk_UA": "Запускати ігри на весь екран", + "zh_CN": "全屏模式启动游戏", + "zh_TW": "使用全螢幕模式啟動遊戲" + } + }, + { + "ID": "MenuBarOptionsStartGamesWithoutUI", + "Translations": { + "ar_SA": "", + "de_DE": "Spiele ohne Benutzeroberfläche starten", + "el_GR": "", + "en_US": "Start Games with UI Hidden", + "es_ES": "", + "fr_FR": "Démarrer les jeux avec l’interface cachée", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "UI를 숨긴 상태에서 게임 시작", + "no_NO": "Start Spillet med UI Gjemt", + "pl_PL": "", + "pt_BR": "Iniciar Jogos Ocultando a Interface", + "ru_RU": "Запускать игры скрывая интерфейс", + "sv_SE": "Starta spel med dolt användargränssnitt", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Запускати ігри з прихованим інтерфейсом", + "zh_CN": "启动游戏时隐藏 UI", + "zh_TW": "開啟遊戲時隱藏 UI" + } + }, + { + "ID": "MenuBarOptionsStopEmulation", + "Translations": { + "ar_SA": "إيقاف المحاكاة", + "de_DE": "Emulation beenden", + "el_GR": "Διακοπή Εξομοίωσης", + "en_US": "Stop Emulation", + "es_ES": "Detener emulación", + "fr_FR": "Arrêter l'émulation", + "he_IL": "עצור אמולציה", + "it_IT": "Ferma emulazione", + "ja_JP": "エミュレーションを中止", + "ko_KR": "에뮬레이션 중지", + "no_NO": "Stopp Emulering", + "pl_PL": "Zatrzymaj emulację", + "pt_BR": "_Parar a Emulação", + "ru_RU": "Остановить эмуляцию", + "sv_SE": "Stoppa emulering", + "th_TH": "หยุดการจำลอง", + "tr_TR": "Emülasyonu Durdur", + "uk_UA": "Зупинити емуляцію", + "zh_CN": "停止模拟", + "zh_TW": "停止模擬" + } + }, + { + "ID": "MenuBarOptionsSettings", + "Translations": { + "ar_SA": "_الإعدادات", + "de_DE": "_Einstellungen", + "el_GR": "_Ρυθμίσεις", + "en_US": "_Settings", + "es_ES": "_Configuración", + "fr_FR": "_Paramètres", + "he_IL": "_הגדרות", + "it_IT": "_Impostazioni", + "ja_JP": "設定(_S)", + "ko_KR": "설정(_S)", + "no_NO": "_Innstillinger", + "pl_PL": "_Ustawienia", + "pt_BR": "_Configurações", + "ru_RU": "_Параметры", + "sv_SE": "_Inställningar", + "th_TH": "_ตั้งค่า", + "tr_TR": "_Seçenekler", + "uk_UA": "_Налаштування", + "zh_CN": "设置(_S)", + "zh_TW": "設定(_S)" + } + }, + { + "ID": "MenuBarOptionsManageUserProfiles", + "Translations": { + "ar_SA": "_إدارة الملفات الشخصية للمستخدم", + "de_DE": "_Benutzerprofile verwalten", + "el_GR": "Διαχείριση Προφίλ _Χρηστών", + "en_US": "_Manage User Profiles", + "es_ES": "_Gestionar perfiles de usuario", + "fr_FR": "_Gérer les profils utilisateur", + "he_IL": "_נהל פרופילי משתמש", + "it_IT": "_Gestisci i profili utente", + "ja_JP": "ユーザプロファイルを管理(_M)", + "ko_KR": "사용자 프로필 관리(_M)", + "no_NO": "_Administrere Brukerprofiler", + "pl_PL": "_Zarządzaj profilami użytkowników", + "pt_BR": "_Gerenciar Perfis de Usuário", + "ru_RU": "_Менеджер учётных записей", + "sv_SE": "_Hantera användarprofiler", + "th_TH": "_จัดการโปรไฟล์ผู้ใช้งาน", + "tr_TR": "_Kullanıcı Profillerini Yönet", + "uk_UA": "_Керувати профілями користувачів", + "zh_CN": "管理用户账户(_M)", + "zh_TW": "管理使用者設定檔(_M)" + } + }, + { + "ID": "MenuBarActions", + "Translations": { + "ar_SA": "_الإجراءات", + "de_DE": "_Aktionen", + "el_GR": "_Δράσεις", + "en_US": "_Actions", + "es_ES": "_Acciones", + "fr_FR": "", + "he_IL": "_פעולות", + "it_IT": "_Azioni", + "ja_JP": "アクション(_A)", + "ko_KR": "동작(_A)", + "no_NO": "_Handlinger", + "pl_PL": "_Akcje", + "pt_BR": "_Ações", + "ru_RU": "_Действия", + "sv_SE": "Åt_gärder", + "th_TH": "การดำเนินการ", + "tr_TR": "_Eylemler", + "uk_UA": "_Дії", + "zh_CN": "操作(_A)", + "zh_TW": "動作(_A)" + } + }, + { + "ID": "MenuBarOptionsSimulateWakeUpMessage", + "Translations": { + "ar_SA": "محاكاة رسالة الاستيقاظ", + "de_DE": "Aufwachnachricht simulieren", + "el_GR": "Προσομοίωση Μηνύματος Αφύπνισης", + "en_US": "Simulate Wake-up message", + "es_ES": "Simular mensaje de reactivación", + "fr_FR": "Simuler un message de réveil", + "he_IL": "דמה הודעת השכמה", + "it_IT": "Simula messaggio Wake-up", + "ja_JP": "スリープ復帰メッセージをシミュレート", + "ko_KR": "웨이크업 메시지 시뮬레이션", + "no_NO": "Simuler oppvåknings-melding", + "pl_PL": "Symuluj wiadomość wybudzania", + "pt_BR": "_Simular Mensagem de Acordar o Console", + "ru_RU": "Имитировать сообщение пробуждения", + "sv_SE": "Simulera uppvakningsmeddelande", + "th_TH": "จำลองข้อความปลุก", + "tr_TR": "Uyandırma Mesajı Simüle Et", + "uk_UA": "Симулювати повідомлення про пробудження", + "zh_CN": "模拟唤醒消息", + "zh_TW": "模擬喚醒訊息" + } + }, + { + "ID": "MenuBarActionsScanAmiibo", + "Translations": { + "ar_SA": "‫فحص Amiibo", + "de_DE": "Amiibo scannen", + "el_GR": "Σάρωση Amiibo", + "en_US": "Scan An Amiibo", + "es_ES": "Escanear Amiibo", + "fr_FR": "Scanner un Amiibo", + "he_IL": "סרוק אמיבו", + "it_IT": "Scansiona un Amiibo", + "ja_JP": "Amiibo をスキャン", + "ko_KR": "Amiibo 스캔", + "no_NO": "Skann en Amiibo", + "pl_PL": "Skanuj Amiibo", + "pt_BR": "Escanear um Amiibo", + "ru_RU": "Сканировать Amiibo", + "sv_SE": "Skanna en Amiibo", + "th_TH": "สแกนหา Amiibo", + "tr_TR": "Bir Amiibo Tara", + "uk_UA": "Сканувати Amiibo", + "zh_CN": "扫描 Amiibo", + "zh_TW": "掃描 Amiibo" + } + }, + { + "ID": "MenuBarActionsScanAmiiboBin", + "Translations": { + "ar_SA": "", + "de_DE": "Amiibo scannen (aus Bin-Datei)", + "el_GR": "", + "en_US": "Scan An Amiibo (From Bin)", + "es_ES": "", + "fr_FR": "Scanner un Amiibo (à partir d'un .bin)", + "he_IL": "", + "it_IT": "Scansiona un Amiibo (da file .bin)", + "ja_JP": "", + "ko_KR": "Amiibo 스캔(빈에서)", + "no_NO": "Skann en Amiibo (fra bin fil)", + "pl_PL": "", + "pt_BR": "Escaneie um Amiibo (de um .bin)", + "ru_RU": "Сканировать Amiibo (из папки Bin)", + "sv_SE": "Skanna en Amiibo (från bin-fil)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Сканувати Amiibo (з теки Bin)", + "zh_CN": "扫描 Amiibo (从 bin 文件)", + "zh_TW": "掃瞄 Amiibo (從 Bin 檔案)" + } + }, + { + "ID": "MenuBarActionsInstallFirmware", + "Translations": { + "ar_SA": "تثبيت البرنامج الثابت", + "de_DE": "Firmware installieren", + "el_GR": "Εγκατάσταση Firmware", + "en_US": "Install Firmware", + "es_ES": "Instalar firmware", + "fr_FR": "Installer le firmware", + "he_IL": "התקן קושחה", + "it_IT": "Installa firmware", + "ja_JP": "ファームウェアをインストール", + "ko_KR": "펌웨어 설치", + "no_NO": "Installer fastvare", + "pl_PL": "Zainstaluj oprogramowanie", + "pt_BR": "_Instalar Firmware", + "ru_RU": "Установка прошивки", + "sv_SE": "Installera firmware", + "th_TH": "ติดตั้งเฟิร์มแวร์", + "tr_TR": "Yazılım Yükle", + "uk_UA": "Встановити прошивку (Firmware)", + "zh_CN": "安装系统固件", + "zh_TW": "安裝韌體" + } + }, + { + "ID": "MenuBarActionsInstallFirmwareFromFile", + "Translations": { + "ar_SA": "تثبيت برنامج ثابت من XCI أو ZIP", + "de_DE": "Firmware von einer XCI- oder einer ZIP-Datei installieren", + "el_GR": "Εγκατάσταση Firmware από XCI ή ZIP", + "en_US": "Install a firmware from XCI or ZIP", + "es_ES": "Instalar firmware desde un archivo XCI o ZIP", + "fr_FR": "Installer un firmware depuis un fichier XCI ou ZIP", + "he_IL": "התקן קושחה מקובץ- ZIP/XCI", + "it_IT": "Installa un firmware da file XCI o ZIP", + "ja_JP": "XCI または ZIP からファームウェアをインストール", + "ko_KR": "XCI 또는 ZIP으로 펌웨어 설치", + "no_NO": "Installer en fastvare fra XCI eller ZIP", + "pl_PL": "Zainstaluj oprogramowanie z XCI lub ZIP", + "pt_BR": "Instalar firmware a partir de um arquivo ZIP/XCI", + "ru_RU": "Установить прошивку из XCI или ZIP", + "sv_SE": "Installera en firmware från XCI eller ZIP", + "th_TH": "ติดตั้งเฟิร์มแวร์จาก ไฟล์ XCI หรือ ไฟล์ ZIP", + "tr_TR": "XCI veya ZIP'ten Yazılım Yükle", + "uk_UA": "Встановити прошивку з XCI або ZIP", + "zh_CN": "从 XCI 或 ZIP 文件安装系统固件", + "zh_TW": "從 XCI 或 ZIP 安裝韌體" + } + }, + { + "ID": "MenuBarActionsInstallFirmwareFromDirectory", + "Translations": { + "ar_SA": "تثبيت برنامج ثابت من مجلد", + "de_DE": "Firmware aus einem Verzeichnis installieren", + "el_GR": "Εγκατάσταση Firmware από τοποθεσία", + "en_US": "Install a firmware from a directory", + "es_ES": "Instalar firmware desde una carpeta", + "fr_FR": "Installer un firmware à partir d’un dossier", + "he_IL": "התקן קושחה מתוך תקייה", + "it_IT": "Installa un firmware da una cartella", + "ja_JP": "ディレクトリからファームウェアをインストール", + "ko_KR": "디렉터리에서 펌웨어 설치", + "no_NO": "Installer en fastvare fra en mappe", + "pl_PL": "Zainstaluj oprogramowanie z katalogu", + "pt_BR": "Instalar firmware a partir de um diretório", + "ru_RU": "Установить прошивку из папки", + "sv_SE": "Installera en firmware från en katalog", + "th_TH": "ติดตั้งเฟิร์มแวร์จากไดเร็กทอรี", + "tr_TR": "Bir Dizin Üzerinden Yazılım Yükle", + "uk_UA": "Встановити прошивку з теки", + "zh_CN": "从文件夹安装系统固件", + "zh_TW": "從資料夾安裝韌體" + } + }, + { + "ID": "MenuBarActionsInstallKeys", + "Translations": { + "ar_SA": "", + "de_DE": "Schlüssel installieren", + "el_GR": "", + "en_US": "Install Keys", + "es_ES": "", + "fr_FR": "Installer des clés", + "he_IL": "", + "it_IT": "Installa chiavi", + "ja_JP": "", + "ko_KR": "설치 키", + "no_NO": "Installere nøkler", + "pl_PL": "", + "pt_BR": "Instalar Chaves", + "ru_RU": "Установить ключи", + "sv_SE": "Installera nycklar", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Встановити ключі", + "zh_CN": "安装密匙", + "zh_TW": "安裝金鑰" + } + }, + { + "ID": "MenuBarFileActionsInstallKeysFromFile", + "Translations": { + "ar_SA": "", + "de_DE": "Schlüssel aus KEYS oder ZIP installieren", + "el_GR": "", + "en_US": "Install keys from KEYS or ZIP", + "es_ES": "Instalar keys de KEYS o ZIP", + "fr_FR": "Installer des clés à partir de .KEYS ou .ZIP", + "he_IL": "", + "it_IT": "Installa chiavi da file KEYS o ZIP", + "ja_JP": "", + "ko_KR": "키나 ZIP에서 키 설치", + "no_NO": "Installer nøkler fra KEYS eller ZIP", + "pl_PL": "", + "pt_BR": "Instalar chaves de CHAVES ou ZIP", + "ru_RU": "Установить ключи из файла KEYS или ZIP", + "sv_SE": "Installera nycklar från KEYS eller ZIP", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Встановити ключі з файлу .KEYS або .ZIP", + "zh_CN": "从 .KEYS 文件或 .ZIP 压缩包安装密匙", + "zh_TW": "從 .KEYS 或 .ZIP 安裝金鑰" + } + }, + { + "ID": "MenuBarFileActionsInstallKeysFromFolder", + "Translations": { + "ar_SA": "", + "de_DE": "Schlüssel aus einem Verzeichnis installieren", + "el_GR": "", + "en_US": "Install keys from a directory", + "es_ES": "Instalar keys de un directorio", + "fr_FR": "Installer des clés à partir d'un dossier", + "he_IL": "", + "it_IT": "Installa chiavi da una cartella", + "ja_JP": "", + "ko_KR": "디렉터리에서 키 설치", + "no_NO": "Installer nøkler fra en mappe", + "pl_PL": "", + "pt_BR": "Instalar chaves de um diretório", + "ru_RU": "Установить ключи из папки", + "sv_SE": "Installera nycklar från en katalog", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Встановити ключі з теки", + "zh_CN": "从一个文件夹安装密匙", + "zh_TW": "從資料夾安裝金鑰" + } + }, + { + "ID": "MenuBarActionsManageFileTypes", + "Translations": { + "ar_SA": "إدارة أنواع الملفات", + "de_DE": "Dateitypen verwalten", + "el_GR": "Διαχείριση τύπων αρχείων", + "en_US": "Manage file types", + "es_ES": "Administrar tipos de archivo", + "fr_FR": "Gérer les types de fichiers", + "he_IL": "ניהול סוגי קבצים", + "it_IT": "Gestisci i tipi di file", + "ja_JP": "ファイル形式を管理", + "ko_KR": "파일 형식 관리", + "no_NO": "Behandle filtyper", + "pl_PL": "Zarządzaj rodzajami plików", + "pt_BR": "Gerenciar Tipos de Arquivos", + "ru_RU": "Управление типами файлов", + "sv_SE": "Hantera filtyper", + "th_TH": "จัดการประเภทไฟล์", + "tr_TR": "Dosya uzantılarını yönet", + "uk_UA": "Керувати типами файлів", + "zh_CN": "管理文件扩展名", + "zh_TW": "管理檔案類型" + } + }, + { + "ID": "MenuBarActionsInstallFileTypes", + "Translations": { + "ar_SA": "تثبيت أنواع الملفات", + "de_DE": "Dateitypen installieren", + "el_GR": "Εγκαταστήσετε τύπους αρχείων.", + "en_US": "Install file types", + "es_ES": "Instalar tipos de archivo", + "fr_FR": "Installer des types de fichiers", + "he_IL": "סוגי קבצי התקנה", + "it_IT": "Installa i tipi di file", + "ja_JP": "ファイル形式をインストール", + "ko_KR": "파일 형식 설치", + "no_NO": "Installer filtyper", + "pl_PL": "Typy plików instalacyjnych", + "pt_BR": "Instalar tipos de arquivos", + "ru_RU": "Установить типы файлов", + "sv_SE": "Installera filtyper", + "th_TH": "ติดตั้งประเภทไฟล์", + "tr_TR": "Dosya uzantılarını yükle", + "uk_UA": "Встановити типи файлів", + "zh_CN": "关联文件扩展名", + "zh_TW": "安裝檔案類型" + } + }, + { + "ID": "MenuBarActionsUninstallFileTypes", + "Translations": { + "ar_SA": "إزالة أنواع الملفات", + "de_DE": "Dateitypen deinstallieren", + "el_GR": "Απεγκαταστήσετε τύπους αρχείων", + "en_US": "Uninstall file types", + "es_ES": "Desinstalar tipos de archivo", + "fr_FR": "Désinstaller des types de fichiers", + "he_IL": "סוגי קבצי הסרה", + "it_IT": "Disinstalla i tipi di file", + "ja_JP": "ファイル形式をアンインストール", + "ko_KR": "파일 형식 제거", + "no_NO": "Avinstaller filtyper", + "pl_PL": "Typy plików dezinstalacyjnych", + "pt_BR": "Desinstalar tipos de arquivos", + "ru_RU": "Удалить типы файлов", + "sv_SE": "Avinstallera filtyper", + "th_TH": "ถอนการติดตั้งประเภทไฟล์", + "tr_TR": "Dosya uzantılarını kaldır", + "uk_UA": "Видалити типи файлів", + "zh_CN": "取消关联扩展名", + "zh_TW": "移除檔案類型" + } + }, + { + "ID": "MenuBarActionsXCITrimmer", + "Translations": { + "ar_SA": "", + "de_DE": "XCI-Dateien trimmen", + "el_GR": "", + "en_US": "Trim XCI Files", + "es_ES": "Recortar archivos XCI", + "fr_FR": "Réduire les fichiers XCI", + "he_IL": "", + "it_IT": "Riduci dimensioni dei file XCI", + "ja_JP": "", + "ko_KR": "XCI 파일 트리머", + "no_NO": "Trim XCI-filer", + "pl_PL": "", + "pt_BR": "Reduzir Arquivos XCI", + "ru_RU": "Уменьшить размер XCI файлов", + "sv_SE": "Optimera XCI-filer", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Обрізати XCI файли", + "zh_CN": "瘦身 XCI 文件", + "zh_TW": "修剪 XCI 檔案" + } + }, + { + "ID": "MenuBarView", + "Translations": { + "ar_SA": "_عرض", + "de_DE": "_Ansicht", + "el_GR": "", + "en_US": "_View", + "es_ES": "", + "fr_FR": "_Fenêtre", + "he_IL": "", + "it_IT": "_Vista", + "ja_JP": "", + "ko_KR": "보기(_V)", + "no_NO": "_Vis", + "pl_PL": "", + "pt_BR": "Ver", + "ru_RU": "_Вид", + "sv_SE": "_Visa", + "th_TH": "_มุมมอง", + "tr_TR": "_Görüntüle", + "uk_UA": "_Вид", + "zh_CN": "视图(_V)", + "zh_TW": "檢視(_V)" + } + }, + { + "ID": "MenuBarViewWindow", + "Translations": { + "ar_SA": "حجم النافذة", + "de_DE": "Fenstergröße", + "el_GR": "", + "en_US": "Window Size", + "es_ES": "Tamaño Ventana", + "fr_FR": "Taille de la fenêtre", + "he_IL": "", + "it_IT": "Dimensione finestra", + "ja_JP": "", + "ko_KR": "윈도 창", + "no_NO": "Vindu størrelse", + "pl_PL": "", + "pt_BR": "Tamanho da Janela", + "ru_RU": "Размер окна", + "sv_SE": "Fönsterstorlek", + "th_TH": "ขนาดหน้าต่าง", + "tr_TR": "Pencere Boyutu", + "uk_UA": "Розмір вікна", + "zh_CN": "窗口大小", + "zh_TW": "視窗大小" + } + }, + { + "ID": "MenuBarViewWindow720", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "720p", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "MenuBarViewWindow1080", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "1080p", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "MenuBarViewWindow1440", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "1440p", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "MenuBarViewWindow2160", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "2160p", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "MenuBarHelp", + "Translations": { + "ar_SA": "_مساعدة", + "de_DE": "_Hilfe", + "el_GR": "_Βοήθεια", + "en_US": "_Help", + "es_ES": "_Ayuda", + "fr_FR": "_Aide", + "he_IL": "_עזרה", + "it_IT": "_Aiuto", + "ja_JP": "ヘルプ(_H)", + "ko_KR": "도움말(_H)", + "no_NO": "_Hjelp", + "pl_PL": "_Pomoc", + "pt_BR": "_Ajuda", + "ru_RU": "_Помощь", + "sv_SE": "_Hjälp", + "th_TH": "_ช่วยเหลือ", + "tr_TR": "_Yardım", + "uk_UA": "_Довідка", + "zh_CN": "帮助(_H)", + "zh_TW": "說明(_H)" + } + }, + { + "ID": "MenuBarHelpCheckForUpdates", + "Translations": { + "ar_SA": "تحقق من التحديثات", + "de_DE": "Nach Updates suchen", + "el_GR": "Έλεγχος για Ενημερώσεις", + "en_US": "Check for Updates", + "es_ES": "Buscar actualizaciones", + "fr_FR": "Vérifier les mises à jour", + "he_IL": "חפש עדכונים", + "it_IT": "Controlla aggiornamenti", + "ja_JP": "アップデートを確認", + "ko_KR": "업데이트 확인", + "no_NO": "Se etter oppdateringer", + "pl_PL": "Sprawdź aktualizacje", + "pt_BR": "_Verificar Atualizações", + "ru_RU": "Проверить наличие обновлений", + "sv_SE": "Leta efter uppdateringar", + "th_TH": "ตรวจสอบอัปเดต", + "tr_TR": "Güncellemeleri Denetle", + "uk_UA": "Перевірити оновлення", + "zh_CN": "检查更新", + "zh_TW": "檢查更新" + } + }, + { + "ID": "MenuBarHelpFaqAndGuides", + "Translations": { + "ar_SA": "", + "de_DE": "FAQ & Anleitungen", + "el_GR": "", + "en_US": "FAQ & Guides", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "Guide e domande frequenti", + "ja_JP": "", + "ko_KR": "자주 묻는 질문(FAQ) 및 안내", + "no_NO": "Vanlige spørsmål og veiledninger", + "pl_PL": "", + "pt_BR": "FAQ & Guias", + "ru_RU": "FAQ и Руководства", + "sv_SE": "Frågor, svar och guider", + "th_TH": "", + "tr_TR": "", + "uk_UA": "FAQ та посібники", + "zh_CN": "问答与指南", + "zh_TW": "常見問題 (FAQ) 和指南" + } + }, + { + "ID": "MenuBarHelpFaq", + "Translations": { + "ar_SA": "", + "de_DE": "FAQ & Fehlerbehebung Seite", + "el_GR": "", + "en_US": "FAQ & Troubleshooting Page", + "es_ES": "", + "fr_FR": "FAQ et Dépannage", + "he_IL": "", + "it_IT": "Domande frequenti e risoluzione dei problemi", + "ja_JP": "", + "ko_KR": "자주 묻는 질문(FAQ) 및 문제해결 페이지", + "no_NO": "FAQ- og feilsøkingsside", + "pl_PL": "", + "pt_BR": "FAQ e Solução de Problemas", + "ru_RU": "FAQ & Устранение неполадок", + "sv_SE": "Frågor, svar och felsökningssida", + "th_TH": "", + "tr_TR": "", + "uk_UA": "FAQ та усунення несправностей (eng)", + "zh_CN": "常见问题和问题排除页面", + "zh_TW": "常見問題 (FAQ) 和疑難排解頁面" + } + }, + { + "ID": "MenuBarHelpFaqTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Öffnet die FAQ- und Fehlerbehebungsseite im offiziellen Ryujinx-Wiki", + "el_GR": "", + "en_US": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki", + "es_ES": "", + "fr_FR": "Ouvre la page FAQ et Dépannage sur le wiki officiel de Ryujinx", + "he_IL": "", + "it_IT": "Apre la pagina della wiki ufficiale di Ryujinx relativa alle domande frequenti e alla risoluzione dei problemi", + "ja_JP": "", + "ko_KR": "공식 Ryujinx 위키에서 자주 묻는 질문(FAQ) 및 문제 해결 페이지 열기", + "no_NO": "Åpner FAQ- og feilsøkingssiden på den offisielle Ryujinx-wikien", + "pl_PL": "", + "pt_BR": "Abre a página de FAQ e solução de problemas no wiki oficial do Ryujinx", + "ru_RU": "Открывает страницы с FAQ и Устранением неполадок на официальной странице вики Ryujinx", + "sv_SE": "Öppnar Frågor, svar och felsökningssidan på den officiella Ryujinx-wikin", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Відкриває сторінку з Посібником по усуненню помилок та несправностей на офіційній вікі-сторінці Ryujinx (англійською)", + "zh_CN": "打开 Ryujinx 官方 Wiki 的常见问题和问题排除页面", + "zh_TW": "開啟官方 Ryujinx Wiki 常見問題 (FAQ) 和疑難排解頁面" + } + }, + { + "ID": "MenuBarHelpSetup", + "Translations": { + "ar_SA": "", + "de_DE": "Setup- und Konfigurationsanleitung", + "el_GR": "", + "en_US": "Setup & Configuration Guide", + "es_ES": "", + "fr_FR": "Guide d'Installation et de Configuration", + "he_IL": "", + "it_IT": "Guida all'installazione e alla configurazione", + "ja_JP": "", + "ko_KR": "설치 및 구성 안내", + "no_NO": "Oppsett- og konfigurasjonsveiledning", + "pl_PL": "", + "pt_BR": "Guia de Instalação e Configuração", + "ru_RU": "Руководство по установке и настройке", + "sv_SE": "Konfigurationsguide", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Посібник зі встановлення та налаштування (eng)", + "zh_CN": "安装与配置指南", + "zh_TW": "設定和配置指南" + } + }, + { + "ID": "MenuBarHelpSetupTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Öffnet die Setup- und Konfigurationsanleitung im offiziellen Ryujinx-Wiki", + "el_GR": "", + "en_US": "Opens the Setup & Configuration guide on the official Ryujinx wiki", + "es_ES": "", + "fr_FR": "Ouvre le guide d'installation et de configuration sur le wiki officiel de Ryujinx", + "he_IL": "", + "it_IT": "Apre la guida all'installazione e alla configurazione presente nella wiki ufficiale di Ryujinx", + "ja_JP": "", + "ko_KR": "공식 Ryujinx 위키에서 설정 및 구성 안내 열기", + "no_NO": "Åpner oppsett- og konfigurasjonsveiledningen på den offisielle Ryujinx-wikien", + "pl_PL": "", + "pt_BR": "Abre o guia de instalação e configuração no wiki oficial do Ryujinx", + "ru_RU": "Открывает страницу Руководство по установке и настройке на официальной странице вики Ryujinx", + "sv_SE": "Öppnar konfigurationsguiden på den officiella Ryujinx-wikin", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Відкриває посібник з Налаштування та конфігурації на офіційній вікі-сторінці Ryujinx (англійською)", + "zh_CN": "打开 Ryujinx 官方 Wiki 的安装与配置指南", + "zh_TW": "開啟官方 Ryujinx Wiki 設定和配置指南" + } + }, + { + "ID": "MenuBarHelpMultiplayer", + "Translations": { + "ar_SA": "", + "de_DE": "Multiplayer (LDN/LAN) Anleitung", + "el_GR": "", + "en_US": "Multiplayer (LDN/LAN) Guide", + "es_ES": "", + "fr_FR": "Guide Multijoueur (LDN/LAN)", + "he_IL": "", + "it_IT": "Guida alla modalità multigiocatore (LDN/LAN)", + "ja_JP": "", + "ko_KR": "멀티플레이어(LDN/LAN) 안내", + "no_NO": "Flerspillerveiledning (LDN/LAN)", + "pl_PL": "", + "pt_BR": "Guia Multijogador (LDN/LAN)", + "ru_RU": "Гайд по мультиплееру (LDN/LAN)", + "sv_SE": "Flerspelarguide (LDN/LAN)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Посібник з мультиплеєру (LDN/LAN) (eng)", + "zh_CN": "多人游戏(LDN/LAN)指南", + "zh_TW": "多人遊戲 (LDN/LAN) 指南" + } + }, + { + "ID": "MenuBarHelpMultiplayerTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Öffnet die Multiplayer-Anleitung im offiziellen Ryujinx-Wiki", + "el_GR": "", + "en_US": "Opens the Multiplayer guide on the official Ryujinx wiki", + "es_ES": "", + "fr_FR": "Ouvre le guide de Multijoueur sur le wiki officiel de Ryujinx", + "he_IL": "", + "it_IT": "Apre la guida alla modalità multigiocatore presente nella wiki ufficiale di Ryujinx", + "ja_JP": "", + "ko_KR": "공식 Ryujinx 위키에서 멀티플레이어 안내 열기", + "no_NO": "Åpner flerspillerveiledningen på den offisielle Ryujinx-wikien", + "pl_PL": "", + "pt_BR": "Abre o guia multijogador no wiki oficial do Ryujinx", + "ru_RU": "Открывает гайд по мультиплееру на официальной странице вики Ryujinx", + "sv_SE": "Öppnar flerspelarguiden på den officiella Ryujinx-wikin", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Відкриває посібник з налаштування Мультиплеєру на офіційній вікі-сторінці Ryujinx (англійською)", + "zh_CN": "打开 Ryujinx 官方 Wiki 的多人游戏指南", + "zh_TW": "開啟官方 Ryujinx Wiki 多人遊戲 (LDN/LAN) 指南" + } + }, + { + "ID": "MenuBarHelpAbout", + "Translations": { + "ar_SA": "حول", + "de_DE": "Über Ryujinx", + "el_GR": "Σχετικά με", + "en_US": "About", + "es_ES": "Acerca de", + "fr_FR": "À propos", + "he_IL": "אודות", + "it_IT": "Informazioni", + "ja_JP": "Ryujinx について", + "ko_KR": "정보", + "no_NO": "Om", + "pl_PL": "O programie", + "pt_BR": "_Sobre", + "ru_RU": "О программе", + "sv_SE": "Om", + "th_TH": "เกี่ยวกับ", + "tr_TR": "Hakkında", + "uk_UA": "Про застосунок", + "zh_CN": "关于", + "zh_TW": "關於" + } + }, + { + "ID": "MenuSearch", + "Translations": { + "ar_SA": "بحث...", + "de_DE": "Suchen...", + "el_GR": "Αναζήτηση...", + "en_US": "Search...", + "es_ES": "Buscar...", + "fr_FR": "Rechercher...", + "he_IL": "חפש...", + "it_IT": "Cerca...", + "ja_JP": "検索...", + "ko_KR": "찾기...", + "no_NO": "Søk ...", + "pl_PL": "Wyszukaj...", + "pt_BR": "Buscar...", + "ru_RU": "Поиск...", + "sv_SE": "Sök...", + "th_TH": "กำลังค้นหา...", + "tr_TR": "Ara...", + "uk_UA": "Пошук...", + "zh_CN": "搜索...", + "zh_TW": "搜尋..." + } + }, + { + "ID": "GameListHeaderFavorite", + "Translations": { + "ar_SA": "مفضلة", + "de_DE": "Favorit", + "el_GR": "Αγαπημένο", + "en_US": "Fav", + "es_ES": "Favoritos", + "fr_FR": "Favoris", + "he_IL": "אהוב", + "it_IT": "Preferito", + "ja_JP": "お気に入り", + "ko_KR": "즐겨찾기", + "no_NO": "Favoritter", + "pl_PL": "Ulubione", + "pt_BR": "Favorito", + "ru_RU": "Избранное", + "sv_SE": "Favorit", + "th_TH": "ชื่นชอบ", + "tr_TR": "Favori", + "uk_UA": "Обране", + "zh_CN": "收藏", + "zh_TW": "我的最愛" + } + }, + { + "ID": "GameListHeaderIcon", + "Translations": { + "ar_SA": "الأيقونة", + "de_DE": "", + "el_GR": "Εικονίδιο", + "en_US": "Icon", + "es_ES": "Icono", + "fr_FR": "Icône", + "he_IL": "סמל", + "it_IT": "Icona", + "ja_JP": "アイコン", + "ko_KR": "아이콘", + "no_NO": "Ikon", + "pl_PL": "Ikona", + "pt_BR": "Ícone", + "ru_RU": "Значок", + "sv_SE": "Ikon", + "th_TH": "ไอคอน", + "tr_TR": "Simge", + "uk_UA": "Значок", + "zh_CN": "图标", + "zh_TW": "圖示" + } + }, + { + "ID": "GameListHeaderApplication", + "Translations": { + "ar_SA": "الاسم", + "de_DE": "", + "el_GR": "Όνομα", + "en_US": "Name", + "es_ES": "Nombre", + "fr_FR": "Nom", + "he_IL": "שם", + "it_IT": "Nome", + "ja_JP": "名称", + "ko_KR": "이름", + "no_NO": "Navn", + "pl_PL": "Nazwa", + "pt_BR": "Nome", + "ru_RU": "Название", + "sv_SE": "Namn", + "th_TH": "ชื่อ", + "tr_TR": "Oyun Adı", + "uk_UA": "Назва", + "zh_CN": "名称", + "zh_TW": "名稱" + } + }, + { + "ID": "GameListHeaderDeveloper", + "Translations": { + "ar_SA": "", + "de_DE": "Entwickelt von {0}", + "el_GR": "", + "en_US": "Developed by {0}", + "es_ES": "", + "fr_FR": "Développé par {0}", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "{0}에서 개발", + "no_NO": "Utviklet av {0}", + "pl_PL": "", + "pt_BR": "Desenvolvido por {0}", + "ru_RU": "Разработана {0}", + "sv_SE": "Utvecklat av {0}", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Розроблено: {0}", + "zh_CN": "由 {0} 开发", + "zh_TW": "由 {0} 開發" + } + }, + { + "ID": "GameListHeaderVersion", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "Έκδοση: {0}", + "en_US": "Version: {0}", + "es_ES": "Versión: {0}", + "fr_FR": "", + "he_IL": "", + "it_IT": "Versione: {0}", + "ja_JP": "バージョン: {0}", + "ko_KR": "버전: {0}", + "no_NO": "Versjon: {0}", + "pl_PL": "Wersja: {0}", + "pt_BR": "Versão: {0}", + "ru_RU": "Версия: {0}", + "sv_SE": "", + "th_TH": "เวอร์ชั่น: {0}", + "tr_TR": "Sürüm: {0}", + "uk_UA": "Версія: {0}", + "zh_CN": "版本: {0}", + "zh_TW": "版本: {0}" + } + }, + { + "ID": "GameListHeaderTimePlayed", + "Translations": { + "ar_SA": "", + "de_DE": "Spielzeit:", + "el_GR": "Χρόνος:", + "en_US": "Play Time:", + "es_ES": "Tiempo jugado:", + "fr_FR": "Temps de jeu:", + "he_IL": "", + "it_IT": "Tempo di gioco:", + "ja_JP": "プレイ時間:", + "ko_KR": "플레이 타임:", + "no_NO": "Spilletid:", + "pl_PL": "Czas w grze:", + "pt_BR": "Tempo de Jogo:", + "ru_RU": "Время в игре:", + "sv_SE": "Speltid:", + "th_TH": "เล่นไปแล้ว:", + "tr_TR": "Oynama Süresi:", + "uk_UA": "Зіграно часу:", + "zh_CN": "游玩时长:", + "zh_TW": "遊玩時數:" + } + }, + { + "ID": "GameListHeaderLastPlayed", + "Translations": { + "ar_SA": "", + "de_DE": "Zuletzt gespielt: ", + "el_GR": "Παίχτηκε: ", + "en_US": "Last Played:", + "es_ES": "Jugado por última vez:", + "fr_FR": "Dernière partie jouée:", + "he_IL": "", + "it_IT": "Ultima partita:", + "ja_JP": "最終プレイ日時:", + "ko_KR": "마지막 플레이:", + "no_NO": "Sist Spilt:", + "pl_PL": "Ostatnio grane:", + "pt_BR": "Última vez Jogado:", + "ru_RU": "Последний запуск:", + "sv_SE": "Senast spelad:", + "th_TH": "เล่นล่าสุด:", + "tr_TR": "Son Oynama Tarihi:", + "uk_UA": "Востаннє зіграно:", + "zh_CN": "最近游玩:", + "zh_TW": "最近遊玩:" + } + }, + { + "ID": "GameListHeaderFileExtension", + "Translations": { + "ar_SA": "", + "de_DE": "Dateiformat: {0}", + "el_GR": "Κατάληξη: {0}", + "en_US": "Extension: {0}", + "es_ES": "Extensión: {0}", + "fr_FR": "Extension du fichier: {0}", + "he_IL": "", + "it_IT": "Estensione: {0}", + "ja_JP": "ファイル拡張子: {0}", + "ko_KR": "파일 확장자: {0}", + "no_NO": "Fil Eks.: {0}", + "pl_PL": "Rozszerzenie pliku: {0}", + "pt_BR": "Extensão: {0}", + "ru_RU": "Расширение файла: {0}", + "sv_SE": "Filändelse: {0}", + "th_TH": "นามสกุลไฟล์: {0}", + "tr_TR": "Dosya Uzantısı: {0}", + "uk_UA": "Розширення файлу: {0}", + "zh_CN": "扩展名: {0}", + "zh_TW": "副檔名: {0}" + } + }, + { + "ID": "GameListHeaderFileSize", + "Translations": { + "ar_SA": "", + "de_DE": "Dateigröße: {0}", + "el_GR": "Μέγεθος Αρχείου: {0}", + "en_US": "File Size: {0}", + "es_ES": "Tamaño del archivo: {0}", + "fr_FR": "Taille du fichier: {0}", + "he_IL": "", + "it_IT": "Dimensione file: {0}", + "ja_JP": "ファイルサイズ: {0}", + "ko_KR": "파일 크기: {0}", + "no_NO": "Fil Størrelse: {0}", + "pl_PL": "Rozmiar pliku: {0}", + "pt_BR": "Tamanho: {0}", + "ru_RU": "Размер файла: {0}", + "sv_SE": "Filstorlek: {0}", + "th_TH": "ขนาดไฟล์: {0}", + "tr_TR": "Dosya Boyutu: {0}", + "uk_UA": "Розмір файлу: {0}", + "zh_CN": "大小: {0}", + "zh_TW": "檔案大小: {0}" + } + }, + { + "ID": "GameListSortDeveloper", + "Translations": { + "ar_SA": "المطور", + "de_DE": "Entwickler", + "el_GR": "Προγραμματιστής", + "en_US": "Developer", + "es_ES": "Desarrollador", + "fr_FR": "Développeur", + "he_IL": "מפתח", + "it_IT": "Sviluppatore", + "ja_JP": "開発元", + "ko_KR": "개발자", + "no_NO": "Utvikler", + "pl_PL": "Twórca", + "pt_BR": "Desenvolvedor", + "ru_RU": "Разработчик", + "sv_SE": "Utvecklare", + "th_TH": "ผู้พัฒนา", + "tr_TR": "Geliştirici", + "uk_UA": "Розробник", + "zh_CN": "制作商", + "zh_TW": "開發者" + } + }, + { + "ID": "GameListSortTimePlayed", + "Translations": { + "ar_SA": "وقت اللعب", + "de_DE": "Spielzeit", + "el_GR": "Χρόνος", + "en_US": "Play Time", + "es_ES": "Tiempo jugado", + "fr_FR": "Temps de jeu", + "he_IL": "זמן משחק", + "it_IT": "Tempo di gioco", + "ja_JP": "プレイ時間", + "ko_KR": "플레이 타임", + "no_NO": "Spilletid", + "pl_PL": "Czas w grze:", + "pt_BR": "Tempo de Jogo", + "ru_RU": "Время в игре", + "sv_SE": "Speltid", + "th_TH": "เล่นไปแล้ว", + "tr_TR": "Oynama Süresi", + "uk_UA": "Зіграно часу", + "zh_CN": "游玩时长", + "zh_TW": "遊玩時數" + } + }, + { + "ID": "GameListSortLastPlayed", + "Translations": { + "ar_SA": "آخر مرة لُعبت", + "de_DE": "Zuletzt gespielt", + "el_GR": "Παίχτηκε", + "en_US": "Last Played", + "es_ES": "Jugado por última vez", + "fr_FR": "Dernière partie jouée", + "he_IL": "שוחק לאחרונה", + "it_IT": "Ultima partita", + "ja_JP": "最終プレイ日時", + "ko_KR": "마지막 플레이", + "no_NO": "Sist Spilt", + "pl_PL": "Ostatnio grane", + "pt_BR": "Última vez Jogado", + "ru_RU": "Последний запуск", + "sv_SE": "Senast spelad", + "th_TH": "เล่นล่าสุด", + "tr_TR": "Son Oynama Tarihi", + "uk_UA": "Востаннє зіграно", + "zh_CN": "最近游玩", + "zh_TW": "最近遊玩" + } + }, + { + "ID": "GameListSortFileExtension", + "Translations": { + "ar_SA": "صيغة الملف", + "de_DE": "Dateiformat", + "el_GR": "Κατάληξη", + "en_US": "File Ext", + "es_ES": "Extensión", + "fr_FR": "Extension du fichier", + "he_IL": "סיומת קובץ", + "it_IT": "Estensione", + "ja_JP": "ファイル拡張子", + "ko_KR": "파일 확장자", + "no_NO": "Fil Eks.", + "pl_PL": "Rozszerzenie pliku", + "pt_BR": "Extensão", + "ru_RU": "Расширение файла", + "sv_SE": "Filändelse", + "th_TH": "นามสกุลไฟล์", + "tr_TR": "Dosya Uzantısı", + "uk_UA": "Розширення файлу", + "zh_CN": "扩展名", + "zh_TW": "副檔名" + } + }, + { + "ID": "GameListSortFileSize", + "Translations": { + "ar_SA": "حجم الملف", + "de_DE": "Dateigröße", + "el_GR": "Μέγεθος Αρχείου", + "en_US": "File Size", + "es_ES": "Tamaño del archivo", + "fr_FR": "Taille du fichier", + "he_IL": "גודל הקובץ", + "it_IT": "Dimensione file", + "ja_JP": "ファイルサイズ", + "ko_KR": "파일 크기", + "no_NO": "Fil Størrelse", + "pl_PL": "Rozmiar pliku", + "pt_BR": "Tamanho", + "ru_RU": "Размер файла", + "sv_SE": "Filstorlek", + "th_TH": "ขนาดไฟล์", + "tr_TR": "Dosya Boyutu", + "uk_UA": "Розмір файлу", + "zh_CN": "大小", + "zh_TW": "檔案大小" + } + }, + { + "ID": "GameListSortPath", + "Translations": { + "ar_SA": "المسار", + "de_DE": "Pfad", + "el_GR": "Τοποθεσία", + "en_US": "Path", + "es_ES": "Directorio", + "fr_FR": "Chemin", + "he_IL": "נתיב", + "it_IT": "Percorso", + "ja_JP": "パス", + "ko_KR": "경로", + "no_NO": "Bane", + "pl_PL": "Ścieżka", + "pt_BR": "Caminho", + "ru_RU": "Путь", + "sv_SE": "Sökväg", + "th_TH": "ที่อยู่ไฟล์", + "tr_TR": "Yol", + "uk_UA": "Шлях", + "zh_CN": "路径", + "zh_TW": "路徑" + } + }, + { + "ID": "GameListSortStatusNameAscending", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "Όνομα: A-Z", + "en_US": "Title: A-Z", + "es_ES": "Título: A-Z", + "fr_FR": "Titre : A-Z", + "he_IL": "", + "it_IT": "Titolo: A-Z", + "ja_JP": "タイトル:A-Z", + "ko_KR": "제목: A-Z", + "no_NO": "Tittel: A-Z", + "pl_PL": "Tytuł: A-Z", + "pt_BR": "Título: A-Z", + "ru_RU": "Название: А-Z", + "sv_SE": "Titel: A-Z", + "th_TH": "ชื่อเรื่อง: A-Z", + "tr_TR": "Başlık: A-Z", + "uk_UA": "Назва: A-Z", + "zh_CN": "标题:A-Z", + "zh_TW": "標題:A-Z" + } + }, + { + "ID": "GameListSortStatusNameDescending", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "Τίτλος: Z-A", + "en_US": "Title: Z-A", + "es_ES": "Título: Z-A", + "fr_FR": "Titre : Z-A", + "he_IL": "", + "it_IT": "Titolo: Z-A", + "ja_JP": "タイトル:Z-A", + "ko_KR": "제목: Z-A", + "no_NO": "Tittel: Z-A", + "pl_PL": "Tytuł: Z-A", + "pt_BR": "Título: Z-A", + "ru_RU": "Название: Z-A", + "sv_SE": "Titel: Z-A", + "th_TH": "ชื่อเรื่อง: Z-A", + "tr_TR": "Başlık: Z-A", + "uk_UA": "Назва: Z-A", + "zh_CN": "标题:Z-A", + "zh_TW": "標題:Z-A" + } + }, + { + "ID": "GameListSortStatusDisable", + "Translations": { + "ar_SA": "", + "de_DE": "Status: Deaktiviert", + "el_GR": "Κατάσταση: Απενεργοποιημένο", + "en_US": "Status: Disabled", + "es_ES": "Estado: Desactivado", + "fr_FR": "Statut : Désactivé", + "he_IL": "", + "it_IT": "Stato: Disabilitato", + "ja_JP": "ステータス:無効", + "ko_KR": "상태: 비활성화됨", + "no_NO": "Status: Deaktivert", + "pl_PL": "Status: Wyłączony", + "pt_BR": "Status: Desativado", + "ru_RU": "Статус: Отключено", + "sv_SE": "Status: Inaktiverad", + "th_TH": "", + "tr_TR": "Durum: Devre Dışı", + "uk_UA": "Статус: Вимкнено", + "zh_CN": "状态:禁用", + "zh_TW": "狀態:停用" + } + }, + { + "ID": "GameListSortStatusAscending", + "Translations": { + "ar_SA": "الحالة: تصاعدي", + "de_DE": "Status: Aufsteigend", + "el_GR": "Κατάσταση: Αναγόμενη", + "en_US": "Status: Ascending", + "es_ES": "", + "fr_FR": "Statut : Croissant", + "he_IL": "סטטוס: עולה", + "it_IT": "Stato: Crescente", + "ja_JP": "ステータス:昇順", + "ko_KR": "상태: 오름차순", + "no_NO": "Status: Stigende", + "pl_PL": "Stan: Rosnący", + "pt_BR": "Status: Crescente", + "ru_RU": "Статус: По возрастанию", + "sv_SE": "Status: Stigande", + "th_TH": "สถานะ: เพิ่มขึ้น", + "tr_TR": "Durum: Artan", + "uk_UA": "Статус: Зростання", + "zh_CN": "状态:升序", + "zh_TW": "狀態:遞增" + } + }, + { + "ID": "GameListSortStatusDescending", + "Translations": { + "ar_SA": "الحالة: تنازلي", + "de_DE": "Status: Absteigend", + "el_GR": "Κατάσταση: Καθοδική", + "en_US": "Status: Descending", + "es_ES": "", + "fr_FR": "Statut : Décroissant", + "he_IL": "סטטוס: יורד", + "it_IT": "Stato: Decrescente", + "ja_JP": "ステータス:降順", + "ko_KR": "상태: 내림차순", + "no_NO": "Status: Synkende", + "pl_PL": "Stan: Malejący", + "pt_BR": "Status: Decrescente", + "ru_RU": "Статус: По Убыванию", + "sv_SE": "Status: Fallande", + "th_TH": "สถานะ: ลดลง", + "tr_TR": "Durum: Azalan", + "uk_UA": "Статус: Зменшення", + "zh_CN": "状态:降序", + "zh_TW": "狀態:遞減" + } + }, + { + "ID": "GameListHeaderCompatibilityStatus", + "Translations": { + "ar_SA": "", + "de_DE": "Kompatibilität:", + "el_GR": "", + "en_US": "Compatibility:", + "es_ES": "", + "fr_FR": "Compatibilité :", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "호환성 :", + "no_NO": "Kompatibilitet", + "pl_PL": "", + "pt_BR": "Compatibilidade:", + "ru_RU": "Совместимость:", + "sv_SE": "Kompatibilitet:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Сумісність:", + "zh_CN": "兼容性:", + "zh_TW": "相容性:" + } + }, + { + "ID": "GameListHeaderTitleId", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Title ID:", + "es_ES": "", + "fr_FR": "ID du titre :", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "타이틀 ID :", + "no_NO": "Tittel ID:", + "pl_PL": "", + "pt_BR": "ID do Título:", + "ru_RU": "ID приложения", + "sv_SE": "Titel-id:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "ID гри:", + "zh_CN": "标题 ID:", + "zh_TW": "標題 ID:" + } + }, + { + "ID": "GameListHeaderHostedGames", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Hosted Games: {0}", + "es_ES": "", + "fr_FR": "Jeux hébergés : {0}", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "호스트 게임 : {0}", + "no_NO": "Spill som Arrangeres: {0}", + "pl_PL": "", + "pt_BR": "Jogos Hospedados: {0}", + "ru_RU": "Запущенно игр: {0}", + "sv_SE": "Värdskap för spel: {0}", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Розміщені ігри: {0}", + "zh_CN": "服务的游戏: {0}", + "zh_TW": "LDN 上主持的遊戲數量: {0}" + } + }, + { + "ID": "GameListHeaderPlayerCount", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Online Players: {0}", + "es_ES": "", + "fr_FR": "Joueurs en ligne : {0}", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "온라인 플레이어 : {0}", + "no_NO": "Online-spillere: {0}", + "pl_PL": "", + "pt_BR": "Jogadores Online: {0}", + "ru_RU": "Игроков онлайн: {0}", + "sv_SE": "Online-spelare: {0}", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Гравців онлайн: {0}", + "zh_CN": "在线玩家: {0}", + "zh_TW": "LDN 上在線的玩家數量: {0}" + } + }, + { + "ID": "GameListLabelTotalTimePlayed", + "Translations": { + "ar_SA": "", + "de_DE": "Gesamte Spielzeit: {0}", + "el_GR": "Συνολικός χρόνος παιχνιδιού: {0}", + "en_US": "Total Play Time: {0}", + "es_ES": "Tiempo total de juego: {0}", + "fr_FR": "Temps de jeu total: {0}", + "he_IL": "", + "it_IT": "Tempo totale di gioco: {0}", + "ja_JP": "", + "ko_KR": "총 플레이 시간 : {0}", + "no_NO": "", + "pl_PL": "Całkowity czas gry: {0}", + "pt_BR": "Tempo total de jogo: {0}", + "ru_RU": "", + "sv_SE": "Total speltid: {0}", + "th_TH": "", + "tr_TR": "Toplam Oyun Süresi: {0}", + "uk_UA": "", + "zh_CN": "总游戏时间: {0}", + "zh_TW": "總遊戲時間: {0}" + } + }, + { + "ID": "GameListContextMenuOpenUserSaveDirectory", + "Translations": { + "ar_SA": "فتح مجلد حفظ المستخدم", + "de_DE": "Spielstand-Verzeichnis öffnen", + "el_GR": "Άνοιγμα Τοποθεσίας Αποθήκευσης Χρήστη", + "en_US": "Open User Save Directory", + "es_ES": "Abrir carpeta de guardado de este usuario", + "fr_FR": "Ouvrir le dossier de sauvegarde utilisateur", + "he_IL": "פתח את תקיית השמור של המשתמש", + "it_IT": "Apri la cartella dei salvataggi dell'utente", + "ja_JP": "セーブディレクトリを開く", + "ko_KR": "사용자 저장 디렉터리 열기", + "no_NO": "Åpne bruker lagrings mappe", + "pl_PL": "Otwórz katalog zapisów użytkownika", + "pt_BR": "Abrir Diretório de Saves do Usuário", + "ru_RU": "Открыть папку с сохранениями", + "sv_SE": "Öppna användarkatalog för sparningar", + "th_TH": "เปิดไดเร็กทอรี่บันทึกของผู้ใช้", + "tr_TR": "Kullanıcı Kayıt Dosyası Dizinini Aç", + "uk_UA": "Відкрити теку збережень користувача", + "zh_CN": "打开用户存档目录", + "zh_TW": "開啟使用者存檔資料夾" + } + }, + { + "ID": "GameListContextMenuOpenUserSaveDirectoryToolTip", + "Translations": { + "ar_SA": "يفتح المجلد الذي يحتوي على حفظ المستخدم للتطبيق", + "de_DE": "Öffnet das Verzeichnis, welches den Benutzer-Spielstand beinhaltet", + "el_GR": "Ανοίγει την τοποθεσία που περιέχει την Αποθήκευση Χρήστη της εφαρμογής", + "en_US": "Opens the directory which contains Application's User Save", + "es_ES": "Abre la carpeta que contiene la partida guardada del usuario para esta aplicación", + "fr_FR": "Ouvre le dossier contenant la sauvegarde utilisateur de l’application", + "he_IL": "פותח את תקיית השמור של המשתמש ביישום הנוכחי", + "it_IT": "Apre la cartella che contiene i dati di salvataggio dell'utente", + "ja_JP": "アプリケーションのユーザセーブデータを格納するディレクトリを開きます", + "ko_KR": "앱의 사용자 저장이 포함된 디렉터리 열기", + "no_NO": "Åpner mappen som inneholder programmets bruker lagring", + "pl_PL": "Otwiera katalog, który zawiera zapis użytkownika dla tej aplikacji", + "pt_BR": "Abre o diretório que contém jogos salvos para o usuário atual", + "ru_RU": "Открывает папку с пользовательскими сохранениями", + "sv_SE": "Öppnar katalogen som innehåller applikationens användarsparade spel", + "th_TH": "เปิดไดเร็กทอรี่ซึ่งมีการบันทึกข้อมูลของผู้ใช้แอปพลิเคชัน", + "tr_TR": "Uygulamanın Kullanıcı Kaydı'nın bulunduğu dizini açar", + "uk_UA": "Відкриває теку, яка містить збереження користувача", + "zh_CN": "打开储存游戏用户存档的目录", + "zh_TW": "開啟此應用程式的使用者存檔資料夾" + } + }, + { + "ID": "GameListContextMenuOpenDeviceSaveDirectory", + "Translations": { + "ar_SA": "فتح مجلد حفظ الجهاز", + "de_DE": "Benutzer-Geräte-Verzeichnis öffnen", + "el_GR": "Άνοιγμα Τοποθεσίας Συσκευής Χρήστη", + "en_US": "Open Device Save Directory", + "es_ES": "Abrir carpeta de guardado del sistema para el usuario actual", + "fr_FR": "Ouvrir le dossier de sauvegarde de l’appareil", + "he_IL": "פתח את תקיית השמור של המכשיר", + "it_IT": "Apri la cartella dei salvataggi del dispositivo", + "ja_JP": "デバイスディレクトリを開く", + "ko_KR": "기기 저장 디렉터리 열기", + "no_NO": "Åpne lagringsmappe for enheten", + "pl_PL": "Otwórz katalog zapisów urządzenia", + "pt_BR": "Abrir Diretório de Saves de Dispositivo do Usuário", + "ru_RU": "Открыть папку сохраненных устройств", + "sv_SE": "Öppna enhetens katalog för sparade spel", + "th_TH": "เปิดไดเร็กทอรี่บันทึกของอุปกรณ์", + "tr_TR": "Kullanıcı Cihaz Dizinini Aç", + "uk_UA": "Відкрити теку пристроїв користувача", + "zh_CN": "打开系统数据目录", + "zh_TW": "開啟裝置存檔資料夾" + } + }, + { + "ID": "GameListContextMenuOpenDeviceSaveDirectoryToolTip", + "Translations": { + "ar_SA": "يفتح المجلد الذي يحتوي على حفظ الجهاز للتطبيق", + "de_DE": "Öffnet das Verzeichnis, welches den Geräte-Spielstände beinhaltet", + "el_GR": "Ανοίγει την τοποθεσία που περιέχει την Αποθήκευση Συσκευής της εφαρμογής", + "en_US": "Opens the directory which contains Application's Device Save", + "es_ES": "Abre la carpeta que contiene la partida guardada del sistema para esta aplicación", + "fr_FR": "Ouvre le dossier contenant la sauvegarde locale de l’application", + "he_IL": "פותח את הספרייה המכילה את שמור המכשיר של היישום", + "it_IT": "Apre la cartella che contiene i dati di salvataggio del dispositivo", + "ja_JP": "アプリケーションのデバイスセーブデータを格納するディレクトリを開きます", + "ko_KR": "앱의 장치 저장이 포함된 디렉터리 열기", + "no_NO": "Åpner mappen som inneholder programmets lagringsenhet", + "pl_PL": "Otwiera katalog, który zawiera zapis urządzenia dla tej aplikacji", + "pt_BR": "Abre o diretório que contém saves do dispositivo para o usuário atual", + "ru_RU": "Открывает папку, содержащую сохраненные устройства", + "sv_SE": "Öppnar katalogen som innehåller applikationens sparade spel på enheten", + "th_TH": "เปิดไดเรกทอรี่ซึ่งมีบันทึกข้อมูลของอุปกรณ์ในแอปพลิเคชัน", + "tr_TR": "Uygulamanın Kullanıcı Cihaz Kaydı'nın bulunduğu dizini açar", + "uk_UA": "Відкриває теку, яка містить збережені пристрої", + "zh_CN": "打开储存游戏系统数据的目录", + "zh_TW": "開啟此應用程式的裝置存檔資料夾" + } + }, + { + "ID": "GameListContextMenuOpenBcatSaveDirectory", + "Translations": { + "ar_SA": "‫فتح مجلد حفظ الـBCAT", + "de_DE": "Benutzer-BCAT-Vezeichnis öffnen", + "el_GR": "Άνοιγμα Τοποθεσίας BCAT", + "en_US": "Open BCAT Save Directory", + "es_ES": "Abrir carpeta de guardado BCAT del usuario", + "fr_FR": "Ouvrir le dossier de sauvegarde BCAT", + "he_IL": "פתח את תקיית השמור של ה-BCAT", + "it_IT": "Apri la cartella del salvataggio BCAT", + "ja_JP": "BCATディレクトリを開く", + "ko_KR": "BCAT 저장 디렉터리 열기", + "no_NO": "Åpne BCAT lagringsmappe", + "pl_PL": "Otwórz katalog zapisu BCAT obecnego użytkownika", + "pt_BR": "Abrir Diretório de Saves BCAT do Usuário", + "ru_RU": "Открыть папку сохраненных BCAT", + "sv_SE": "Öppna katalog för BCAT-sparningar", + "th_TH": "เปิดไดเรกทอรี่บันทึกของ BCAT", + "tr_TR": "Kullanıcı BCAT Dizinini Aç", + "uk_UA": "Відкрити теку збережень BCAT", + "zh_CN": "打开 BCAT 数据目录", + "zh_TW": "開啟 BCAT 存檔資料夾" + } + }, + { + "ID": "GameListContextMenuOpenBcatSaveDirectoryToolTip", + "Translations": { + "ar_SA": "‫يفتح المجلد الذي يحتوي على حفظ الـBCAT للتطبيق", + "de_DE": "Öffnet das Verzeichnis, welches den BCAT-Cache des Spiels beinhaltet", + "el_GR": "Ανοίγει την τοποθεσία που περιέχει την Αποθήκευση BCAT της εφαρμογής", + "en_US": "Opens the directory which contains Application's BCAT Save", + "es_ES": "Abrir la carpeta que contiene el guardado BCAT de esta aplicación", + "fr_FR": "Ouvre le dossier contenant la sauvegarde BCAT de l’application", + "he_IL": "פותח את תקיית שמור ה-BCAT של היישום", + "it_IT": "Apre la cartella che contiene il salvataggio BCAT dell'applicazione", + "ja_JP": "アプリケーションの BCAT セーブデータを格納するディレクトリを開きます", + "ko_KR": "앱의 BCAT 저장이 포함된 디렉터리 열기", + "no_NO": "Åpner mappen som inneholder programmets BCAT-lagring", + "pl_PL": "Otwiera katalog, który zawiera zapis BCAT dla tej aplikacji", + "pt_BR": "Abre o diretório que contém saves BCAT para o usuário atual", + "ru_RU": "Открывает папку, содержащую сохраненные BCAT", + "sv_SE": "Öppnar katalogen som innehåller applikationens BCAT-sparningar", + "th_TH": "เปิดไดเรกทอรี่ซึ่งมีการบันทึกข้อมูลของ BCAT ในแอปพลิเคชัน", + "tr_TR": "Uygulamanın Kullanıcı BCAT Kaydı'nın bulunduğu dizini açar", + "uk_UA": "Відкриває теку, яка містить BCAT-збереження програми", + "zh_CN": "打开储存游戏 BCAT 数据的目录", + "zh_TW": "開啟此應用程式的 BCAT 存檔資料夾" + } + }, + { + "ID": "GameListContextMenuManageTitleUpdates", + "Translations": { + "ar_SA": "إدارة تحديثات اللُعبة", + "de_DE": "Verwalte Spiel-Updates", + "el_GR": "Διαχείριση Ενημερώσεων Παιχνιδιού", + "en_US": "Manage Title Updates", + "es_ES": "Gestionar actualizaciones del juego", + "fr_FR": "Gérer les mises à jour du titre", + "he_IL": "מנהל עדכוני משחקים", + "it_IT": "Gestisci aggiornamenti del gioco", + "ja_JP": "アップデートを管理", + "ko_KR": "타이틀 업데이트 관리", + "no_NO": "Administrer titteloppdateringer", + "pl_PL": "Zarządzaj aktualizacjami", + "pt_BR": "Gerenciar Atualizações do Jogo", + "ru_RU": "Управление обновлениями", + "sv_SE": "Hantera speluppdateringar", + "th_TH": "จัดการเวอร์ชั่นอัปเดต", + "tr_TR": "Oyun Güncellemelerini Yönet", + "uk_UA": "Керування оновленнями", + "zh_CN": "管理游戏更新", + "zh_TW": "管理遊戲更新" + } + }, + { + "ID": "GameListContextMenuManageTitleUpdatesToolTip", + "Translations": { + "ar_SA": "يفتح نافذة إدارة تحديث اللُعبة", + "de_DE": "Öffnet den Spiel-Update-Manager", + "el_GR": "Ανοίγει το παράθυρο διαχείρισης Ενημερώσεων Παιχνιδιού", + "en_US": "Opens the Title Update management window", + "es_ES": "Abrir la ventana de gestión de actualizaciones de esta aplicación", + "fr_FR": "Ouvre la fenêtre de gestion des mises à jour du titre", + "he_IL": "פותח את חלון מנהל עדכוני המשחקים", + "it_IT": "Apre la finestra di gestione aggiornamenti del gioco", + "ja_JP": "タイトルのアップデート管理ウインドウを開きます", + "ko_KR": "타이틀 업데이트 관리 창 열기", + "no_NO": "Åpner vinduet Tittel - Oppdateringskontroll", + "pl_PL": "Otwiera okno zarządzania aktualizacjami danej aplikacji", + "pt_BR": "Abre a janela de gerenciamento de atualizações", + "ru_RU": "Открывает окно управления обновлениями приложения", + "sv_SE": "Öppnar spelets hanteringsfönster för uppdateringar", + "th_TH": "เปิดหน้าต่างการจัดการเวอร์ชั่นการอัพเดต", + "tr_TR": "Oyun Güncelleme Yönetim Penceresini Açar", + "uk_UA": "Відкриває меню керування оновленнями до гри (застосунку)", + "zh_CN": "打开游戏更新管理窗口", + "zh_TW": "開啟遊戲更新管理視窗" + } + }, + { + "ID": "GameListContextMenuManageDlc", + "Translations": { + "ar_SA": "إدارة المحتوي الإضافي", + "de_DE": "Verwalten von DLC", + "el_GR": "Διαχείριση DLC", + "en_US": "Manage DLC", + "es_ES": "Gestionar DLC", + "fr_FR": "Gérer les DLC", + "he_IL": "מנהל הרחבות", + "it_IT": "Gestisci DLC", + "ja_JP": "DLCを管理", + "ko_KR": "DLC 관리", + "no_NO": "Administrer DLC", + "pl_PL": "Zarządzaj dodatkową zawartością (DLC)", + "pt_BR": "Gerenciar DLCs", + "ru_RU": "Управление DLC", + "sv_SE": "Hantera DLC", + "th_TH": "จัดการ DLC", + "tr_TR": "DLC'leri Yönet", + "uk_UA": "Керування DLC", + "zh_CN": "管理 DLC", + "zh_TW": "管理 DLC" + } + }, + { + "ID": "GameListContextMenuManageDlcToolTip", + "Translations": { + "ar_SA": "يفتح نافذة إدارة المحتوي الإضافي", + "de_DE": "Öffnet den DLC-Manager", + "el_GR": "Ανοίγει το παράθυρο διαχείρισης DLC", + "en_US": "Opens the DLC management window", + "es_ES": "Abrir la ventana de gestión del DLC", + "fr_FR": "Ouvre la fenêtre de gestion des DLC", + "he_IL": "פותח את חלון מנהל הרחבות המשחקים", + "it_IT": "Apre la finestra di gestione dei DLC", + "ja_JP": "DLC管理ウインドウを開きます", + "ko_KR": "DLC 관리 창 열기", + "no_NO": "Åpner DLC håndteringsvinduet", + "pl_PL": "Otwiera okno zarządzania dodatkową zawartością", + "pt_BR": "Abre a janela de gerenciamento de DLCs", + "ru_RU": "Открывает окно управления DLC", + "sv_SE": "Öppnar DLC-hanteringsfönstret", + "th_TH": "เปิดหน้าต่างจัดการ DLC", + "tr_TR": "DLC yönetim penceresini açar", + "uk_UA": "Відкриває меню керування DLC", + "zh_CN": "打开 DLC 管理窗口", + "zh_TW": "開啟 DLC 管理視窗" + } + }, + { + "ID": "GameListContextMenuCacheManagement", + "Translations": { + "ar_SA": "إدارة ذاكرة التخزين المؤقت", + "de_DE": "Cache-Verwaltung", + "el_GR": "Διαχείριση Προσωρινής Μνήμης", + "en_US": "Cache Management", + "es_ES": "Gestión de caché ", + "fr_FR": "Gestion des caches", + "he_IL": "ניהול מטמון", + "it_IT": "Gestione della cache", + "ja_JP": "キャッシュ管理", + "ko_KR": "캐시 관리", + "no_NO": "Cache administrasjon", + "pl_PL": "Zarządzanie Cache", + "pt_BR": "Gerenciamento de Cache", + "ru_RU": "Управление кэшем", + "sv_SE": "Cachehantering", + "th_TH": "จัดการแคช", + "tr_TR": "Önbellek Yönetimi", + "uk_UA": "Керування кешем", + "zh_CN": "缓存管理", + "zh_TW": "快取管理" + } + }, + { + "ID": "GameListContextMenuCacheManagementPurgePptc", + "Translations": { + "ar_SA": "قائمة انتظار إعادة بناء الـ‫PPTC", + "de_DE": "PPTC als ungültig markieren", + "el_GR": "Εκκαθάριση Προσωρινής Μνήμης PPTC", + "en_US": "Queue PPTC Rebuild", + "es_ES": "Reconstruir PPTC en cola", + "fr_FR": "Reconstruire le cache PPTC", + "he_IL": "הוסף PPTC לתור בנייה מחדש", + "it_IT": "Accoda rigenerazione della cache PPTC", + "ja_JP": "PPTC を再構築", + "ko_KR": "대기열 PPTC 재구성", + "no_NO": "Start PPTC gjenoppbygging", + "pl_PL": "Zakolejkuj rekompilację PPTC", + "pt_BR": "Reconstruir Cache PPTC", + "ru_RU": "Перестроить очередь PPTC", + "sv_SE": "Kölägg PPTC Rebuild", + "th_TH": "เพิ่มคิวการสร้าง PPTC ใหม่", + "tr_TR": "PPTC Yeniden Yapılandırmasını Başlat", + "uk_UA": "Додати до черги перекомпіляцію PPTC", + "zh_CN": "清除 PPTC 缓存文件", + "zh_TW": "佇列 PPTC 重建" + } + }, + { + "ID": "GameListContextMenuCacheManagementPurgePptcToolTip", + "Translations": { + "ar_SA": "تنشيط ‫PPTC لإعادة البناء في وقت الإقلاع عند بدء تشغيل اللعبة التالي", + "de_DE": "Markiert den PPTC als ungültig, sodass dieser beim nächsten Spielstart neu erstellt wird", + "el_GR": "Διαγράφει την προσωρινή μνήμη PPTC της εφαρμογής", + "en_US": "Trigger PPTC to rebuild at boot time on the next game launch", + "es_ES": "Elimina la caché de PPTC de esta aplicación", + "fr_FR": "Déclencher la reconstruction du cache PPTC au prochain démarrage du jeu", + "he_IL": "גרום ל-PPTC להבנות מחדש בפתיחה הבאה של המשחק", + "it_IT": "Esegue la rigenerazione della cache PPTC al prossimo avvio del gioco", + "ja_JP": "次回のゲーム起動時に PPTC を再構築します", + "ko_KR": "다음 게임 실행 부팅 시, PPTC를 트리거하여 다시 구성", + "no_NO": "Utløs PPTC for å gjenoppbygge ved oppstart av neste spill-start", + "pl_PL": "Zainicjuj Rekompilację PPTC przy następnym uruchomieniu gry", + "pt_BR": "Aciona o PPTC para reconstruir o cache no momento da próxima inicialização do jogo", + "ru_RU": "Запускает перестройку PPTC во время следующего запуска игры.", + "sv_SE": "Gör så att PPTC bygger om vid uppstart när nästa spel startas", + "th_TH": "ให้ PPTC สร้างใหม่ในเวลาบูตเมื่อเปิดเกมครั้งถัดไป", + "tr_TR": "Oyunun bir sonraki açılışında PPTC'yi yeniden yapılandır", + "uk_UA": "Видаляє кеш PPTC застосунку (гри)", + "zh_CN": "删除游戏的 PPTC 缓存文件,下次启动游戏时重新编译生成 PPTC 缓存文件", + "zh_TW": "下一次啟動遊戲時,觸發 PPTC 進行重建" + } + }, + { + "ID": "GameListContextMenuCacheManagementNukePptc", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Purge PPTC cache", + "es_ES": "", + "fr_FR": "Purger le cache PPTC", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "PPTC 캐시 제거", + "no_NO": "Tøm PPTC-bufferen", + "pl_PL": "", + "pt_BR": "Limpar Cache PPTC", + "ru_RU": "Очистить кэш PPTC", + "sv_SE": "Rensa PPTC-cache", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Очистити кеш PPTC", + "zh_CN": "清理 PPTC 缓存", + "zh_TW": "清除 PPTC" + } + }, + { + "ID": "GameListContextMenuCacheManagementNukePptcToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Deletes all PPTC cache files for the Application", + "es_ES": "", + "fr_FR": "Supprime tous les fichiers de cache PPTC de l’application", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "앱의 모든 PPTC 캐시 파일 삭제", + "no_NO": "Sletter alle PPTC-cache-filer for applikasjonen", + "pl_PL": "", + "pt_BR": "Apaga os arquivos de cache PPTC do aplicativo", + "ru_RU": "Удаляет все файлы кэша PPTC для приложения", + "sv_SE": "Tar bort alla PPTC-cachefiler för applikationen", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Видаляє всі файли кешу PPTC для застосунку", + "zh_CN": "删除应用程序的所有 PPTC 缓存", + "zh_TW": "清除應用程式的 PPTC" + } + }, + { + "ID": "GameListContextMenuCacheManagementPurgeShaderCache", + "Translations": { + "ar_SA": "تنظيف ذاكرة مرشحات الفيديو المؤقتة", + "de_DE": "Shader Cache löschen", + "el_GR": "Εκκαθάριση Προσωρινής Μνήμης Shader", + "en_US": "Purge Shader Cache", + "es_ES": "Limpiar caché de sombreadores", + "fr_FR": "Purger le cache des shaders", + "he_IL": "ניקוי מטמון הצללות", + "it_IT": "Elimina la cache degli shader", + "ja_JP": "シェーダーキャッシュを破棄", + "ko_KR": "퍼지 셰이더 캐시", + "no_NO": "Tøm shader cache", + "pl_PL": "Wyczyść pamięć podręczną cieni", + "pt_BR": "Limpar Cache de Shader", + "ru_RU": "Очистить кэш шейдеров", + "sv_SE": "Töm shader cache", + "th_TH": "ล้างแคช แสงเงา", + "tr_TR": "Shader Önbelleğini Temizle", + "uk_UA": "Очистити кеш шейдерів", + "zh_CN": "清除着色器缓存文件", + "zh_TW": "清除著色器快取" + } + }, + { + "ID": "GameListContextMenuCacheManagementPurgeShaderCacheToolTip", + "Translations": { + "ar_SA": "يحذف ذاكرة مرشحات الفيديو المؤقتة الخاصة بالتطبيق", + "de_DE": "Löscht den Shader-Cache der Anwendung", + "el_GR": "Διαγράφει την προσωρινή μνήμη Shader της εφαρμογής", + "en_US": "Deletes Application's shader cache", + "es_ES": "Eliminar la caché de sombreadores de esta aplicación", + "fr_FR": "Supprime le cache des shaders de l’application", + "he_IL": "מוחק את מטמון ההצללות של היישום", + "it_IT": "Elimina la cache degli shader dell'applicazione", + "ja_JP": "アプリケーションのシェーダーキャッシュを破棄します", + "ko_KR": "앱의 셰이더 캐시 삭제", + "no_NO": "Sletter applikasjonens shader cache", + "pl_PL": "Usuwa pamięć podręczną cieni danej aplikacji", + "pt_BR": "Deleta o cache de Shader do jogo armazenado em disco", + "ru_RU": "Удаляет кеш шейдеров приложения", + "sv_SE": "Tar bort applikationens shader cache", + "th_TH": "ลบแคช แสงเงา ของแอปพลิเคชัน", + "tr_TR": "Uygulamanın shader önbelleğini temizler", + "uk_UA": "Видаляє кеш шейдерів застосунку (гри)", + "zh_CN": "删除游戏的着色器缓存文件,下次启动游戏时重新生成着色器缓存文件", + "zh_TW": "清除應用程式的著色器快取檔案" + } + }, + { + "ID": "GameListContextMenuCacheManagementOpenPptcDirectory", + "Translations": { + "ar_SA": "‫فتح مجلد PPTC", + "de_DE": "PPTC-Verzeichnis öffnen", + "el_GR": "Άνοιγμα Τοποθεσίας PPTC", + "en_US": "Open PPTC Directory", + "es_ES": "Abrir carpeta de PPTC", + "fr_FR": "Ouvrir le dossier PPTC", + "he_IL": "פתח את תקיית PPTC", + "it_IT": "Apri la cartella della cache PPTC", + "ja_JP": "PPTC ディレクトリを開く", + "ko_KR": "PPTC 디렉터리 열기", + "no_NO": "Åpne PPTC mappe", + "pl_PL": "Otwórz katalog PPTC", + "pt_BR": "Abrir Diretório de Cache PPTC", + "ru_RU": "Открыть папку PPTC", + "sv_SE": "Öppna PPTC-katalog", + "th_TH": "เปิดไดเรกทอรี่ PPTC", + "tr_TR": "PPTC Dizinini Aç", + "uk_UA": "Відкрити теку PPTC", + "zh_CN": "打开 PPTC 缓存目录", + "zh_TW": "開啟 PPTC 資料夾" + } + }, + { + "ID": "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip", + "Translations": { + "ar_SA": "‫‫يفتح المجلد الذي يحتوي على ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) للتطبيق", + "de_DE": "Öffnet das Verzeichnis, das den PPTC-Cache der Anwendung beinhaltet", + "el_GR": "Ανοίγει την τοποθεσία που περιέχει τη προσωρινή μνήμη PPTC της εφαρμογής", + "en_US": "Opens the directory which contains Application's PPTC cache", + "es_ES": "Abrir la carpeta que contiene la caché de PPTC de esta aplicación", + "fr_FR": "Ouvre le dossier contenant le cache PPTC de l’application", + "he_IL": "פותח את התקייה של מטמון ה-PPTC של האפליקציה", + "it_IT": "Apre la cartella che contiene la cache PPTC dell'applicazione", + "ja_JP": "アプリケーションの PPTC キャッシュを格納するディレクトリを開きます", + "ko_KR": "앱의 PPTC 캐시가 포함된 디렉터리 열기", + "no_NO": "Åpner mappen som inneholder programmets PPTC cache", + "pl_PL": "Otwiera katalog, który zawiera pamięć podręczną PPTC aplikacji", + "pt_BR": "Abre o diretório contendo os arquivos do cache PPTC", + "ru_RU": "Открывает папку, содержащую PPTC кэш приложений и игр", + "sv_SE": "Öppnar katalogen som innehåller applikationens PPTC-cache", + "th_TH": "เปิดไดเร็กทอรี่ของ แคช PPTC ในแอปพลิเคชัน", + "tr_TR": "Uygulamanın PPTC Önbelleğinin bulunduğu dizini açar", + "uk_UA": "Відкриває теку, яка містить PPTC кеш застосунку (гри)", + "zh_CN": "打开储存游戏 PPTC 缓存文件的目录", + "zh_TW": "開啟此應用程式的 PPTC 快取資料夾" + } + }, + { + "ID": "GameListContextMenuCacheManagementOpenShaderCacheDirectory", + "Translations": { + "ar_SA": "فتح مجلد الذاكرة المؤقتة لمرشحات الفيديو ", + "de_DE": "Shader-Cache-Verzeichnis öffnen", + "el_GR": "Άνοιγμα τοποθεσίας προσωρινής μνήμης Shader", + "en_US": "Open Shader Cache Directory", + "es_ES": "Abrir carpeta de caché de sombreadores", + "fr_FR": "Ouvrir le dossier du cache des shaders", + "he_IL": "פתח את תקיית המטמון של ההצללות", + "it_IT": "Apri la cartella della cache degli shader", + "ja_JP": "シェーダーキャッシュディレクトリを開く", + "ko_KR": "셰이더 캐시 디렉터리 열기", + "no_NO": "Åpne Shader Cache-mappen", + "pl_PL": "Otwórz katalog pamięci podręcznej cieni", + "pt_BR": "Abrir Diretório de Shader Cache", + "ru_RU": "Открыть папку с кэшем шейдеров", + "sv_SE": "Öppna katalog för shader cache", + "th_TH": "เปิดไดเรกทอรี่ แคช แสงเงา", + "tr_TR": "Shader Önbelleği Dizinini Aç", + "uk_UA": "Відкрити теку з кешем шейдерів", + "zh_CN": "打开着色器缓存目录", + "zh_TW": "開啟著色器快取資料夾" + } + }, + { + "ID": "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip", + "Translations": { + "ar_SA": "يفتح المجلد الذي يحتوي على ذاكرة المظللات المؤقتة للتطبيق", + "de_DE": "Öffnet das Verzeichnis, das den Shader Cache der Anwendung beinhaltet", + "el_GR": "Ανοίγει την τοποθεσία που περιέχει την προσωρινή μνήμη Shader της εφαρμογής", + "en_US": "Opens the directory which contains Application's shader cache", + "es_ES": "Abrir la carpeta que contiene la caché de sombreadores de esta aplicación", + "fr_FR": "Ouvre le dossier contenant le cache des shaders de l’application", + "he_IL": "פותח את תקיית מטמון ההצללות של היישום", + "it_IT": "Apre la cartella che contiene la cache degli shader dell'applicazione", + "ja_JP": "アプリケーションのシェーダーキャッシュを格納するディレクトリを開きます", + "ko_KR": "앱의 셰이더 캐시가 포함된 디렉터리 열기", + "no_NO": "Åpner mappen som inneholder Programmets shader cache", + "pl_PL": "Otwiera katalog, który zawiera pamięć podręczną cieni aplikacji", + "pt_BR": "Abre o diretório contendo os arquivos do cache de Shader", + "ru_RU": "Открывает папку, содержащую кэш шейдеров приложений и игр", + "sv_SE": "Öppnar katalogen som innehåller applikationens shader cache", + "th_TH": "เปิดไดเรกทอรี่ของ แคช แสงเงา ในแอปพลิเคชัน", + "tr_TR": "Uygulamanın shader önbelleğinin bulunduğu dizini açar", + "uk_UA": "Відкриває теку, яка містить кеш шейдерів застосунку (гри)", + "zh_CN": "打开储存游戏着色器缓存文件的目录", + "zh_TW": "開啟此應用程式的著色器快取資料夾" + } + }, + { + "ID": "GameListContextMenuExtractData", + "Translations": { + "ar_SA": "استخراج البيانات", + "de_DE": "Daten extrahieren", + "el_GR": "Εξαγωγή Δεδομένων", + "en_US": "Extract Data", + "es_ES": "Extraer datos", + "fr_FR": "Extraire les données", + "he_IL": "חילוץ נתונים", + "it_IT": "Estrai dati", + "ja_JP": "データを展開", + "ko_KR": "데이터 추출", + "no_NO": "Hent ut data", + "pl_PL": "Wypakuj dane", + "pt_BR": "Extrair Dados", + "ru_RU": "Извлечь данные", + "sv_SE": "Extrahera data", + "th_TH": "แยกส่วนข้อมูล", + "tr_TR": "Veriyi Ayıkla", + "uk_UA": "Видобути дані", + "zh_CN": "提取数据", + "zh_TW": "提取資料" + } + }, + { + "ID": "GameListContextMenuExtractDataExeFS", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "ExeFS", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "GameListContextMenuExtractDataExeFSToolTip", + "Translations": { + "ar_SA": "‫‫ استخراج قسم نظام الملفات القابل للتنفيذ (ExeFS) من الإعدادات الحالية للتطبيقات (يتضمن التحديثات)", + "de_DE": "Extrahiert das ExeFS aus der aktuellen Anwendungskonfiguration (einschließlich Updates)", + "el_GR": "Εξαγωγή της ενότητας ExeFS από την τρέχουσα διαμόρφωση της εφαρμογής (συμπεριλαμβανομένου ενημερώσεων)", + "en_US": "Extract the ExeFS section from Application's current config (including updates)", + "es_ES": "Extraer la sección ExeFS de la configuración actual de la aplicación (incluyendo actualizaciones)", + "fr_FR": "Extraire la section ExeFS de la configuration actuelle de l’application (mises à jour incluses)", + "he_IL": "חלץ את קטע ה-ExeFS מתצורת היישום הנוכחית (כולל עדכונים)", + "it_IT": "Estrae la sezione ExeFS dall'attuale configurazione dell'applicazione (inclusi gli aggiornamenti)", + "ja_JP": "現在のアプリケーション設定(アップデート含む)から ExeFS セクションを展開します", + "ko_KR": "앱의 현재 구성에서 ExeFS 추출(업데이트 포함)", + "no_NO": "Pakk ut ExeFS seksjonen fra Programmets gjeldende konfigurasjon (inkludert oppdateringer)", + "pl_PL": "Wyodrębnij sekcję ExeFS z bieżącej konfiguracji aplikacji (w tym aktualizacje)", + "pt_BR": "Extrai a seção ExeFS do jogo (incluindo atualizações)", + "ru_RU": "Извлечение раздела ExeFS из текущих настроек приложения (включая обновления)", + "sv_SE": "Extrahera ExeFS-sektionen från applikationens aktuella konfiguration (inkl uppdateringar)", + "th_TH": "แยกส่วน ExeFS ออกจากการตั้งค่าปัจจุบันของแอปพลิเคชัน (รวมถึงอัปเดต)", + "tr_TR": "Uygulamanın geçerli yapılandırmasından ExeFS kısmını ayıkla (Güncellemeler dahil)", + "uk_UA": "Видобуває розділ ExeFS із поточної конфігурації програми (включаючи оновлення)", + "zh_CN": "从游戏的当前状态中提取 ExeFS 分区 (包括更新)", + "zh_TW": "從應用程式的目前配置中提取 ExeFS 分區 (包含更新)" + } + }, + { + "ID": "GameListContextMenuExtractDataRomFS", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "RomFS", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "GameListContextMenuExtractDataRomFSToolTip", + "Translations": { + "ar_SA": "استخراج قسم RomFS من الإعدادات الحالية للتطبيقات (يتضمن التحديثات)", + "de_DE": "Extrahiert das RomFS aus der aktuellen Anwendungskonfiguration (einschließlich Updates)", + "el_GR": "Εξαγωγή της ενότητας RomFS από την τρέχουσα διαμόρφωση της εφαρμογής (συμπεριλαμβανομένου ενημερώσεων)", + "en_US": "Extract the RomFS section from Application's current config (including updates)", + "es_ES": "Extraer la sección RomFS de la configuración actual de la aplicación (incluyendo actualizaciones)", + "fr_FR": "Extraire la section RomFS de la configuration actuelle de l’application (mises à jour incluses)", + "he_IL": "חלץ את קטע ה-RomFS מתצורת היישום הנוכחית (כולל עדכונים)", + "it_IT": "Estrae la sezione RomFS dall'attuale configurazione dell'applicazione (inclusi gli aggiornamenti)", + "ja_JP": "現在のアプリケーション設定(アップデート含む)から RomFS セクションを展開します", + "ko_KR": "앱의 현재 구성에서 RomFS 추출(업데이트 포함)", + "no_NO": "Pakk ut RomFS seksjonen fra applikasjonens gjeldende konfigurasjon (inkludert oppdateringer)", + "pl_PL": "Wyodrębnij sekcję RomFS z bieżącej konfiguracji aplikacji (w tym aktualizacje)", + "pt_BR": "Extrai a seção RomFS do jogo (incluindo atualizações)", + "ru_RU": "Извлечение раздела RomFS из текущих настроек приложения (включая обновления)", + "sv_SE": "Extrahera RomFS-sektionen från applikationens aktuella konfiguration (inkl uppdateringar)", + "th_TH": "แยกส่วน RomFS ออกจากการตั้งค่าปัจจุบันของแอปพลิเคชัน (รวมถึงอัพเดต)", + "tr_TR": "Uygulamanın geçerli yapılandırmasından RomFS kısmını ayıkla (Güncellemeler dahil)", + "uk_UA": "Видобуває розділ RomFS із поточної конфігурації застосунку (включно з оновленнями)", + "zh_CN": "从游戏的当前状态中提取 RomFS 分区 (包括更新)", + "zh_TW": "從應用程式的目前配置中提取 RomFS 分區 (包含更新)" + } + }, + { + "ID": "GameListContextMenuExtractDataAocRomFS", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "DLC RomFS", + "es_ES": "", + "fr_FR": "RomFS du DLC", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "GameListContextMenuExtractDataAocRomFSToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Extract the RomFS from a selected DLC file", + "es_ES": "", + "fr_FR": "Extraire la RomFS du fichier DLC sélectionné", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "선택한 DLC 파일에서 RomFS 추출", + "no_NO": "Pakk ut RomFS filene fra valgt DLC fil", + "pl_PL": "", + "pt_BR": "Extraia o RomFS de um arquivo DLC selecionado", + "ru_RU": "Извлекает файлы RomFS из выбранного файла DLC", + "sv_SE": "Extrahera RomFS från en vald DLC-fil", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Витягти RomFS з обраного файлу DLC", + "zh_CN": "从选定的 DLC 文件中解压 RomFS", + "zh_TW": "從已選擇的 DLC 檔案中提取 RomFS" + } + }, + { + "ID": "GameListContextMenuExtractDataLogo", + "Translations": { + "ar_SA": "شعار", + "de_DE": "", + "el_GR": "Λογότυπο", + "en_US": "Logo", + "es_ES": "Logotipo", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "ロゴ", + "ko_KR": "로고", + "no_NO": "", + "pl_PL": "", + "pt_BR": "Logotipo", + "ru_RU": "Лого", + "sv_SE": "Logotyp", + "th_TH": "โลโก้", + "tr_TR": "Simge", + "uk_UA": "Логотип", + "zh_CN": "图标", + "zh_TW": "圖示" + } + }, + { + "ID": "GameListContextMenuExtractDataLogoToolTip", + "Translations": { + "ar_SA": "استخراج قسم الشعار من الإعدادات الحالية للتطبيقات (يتضمن التحديثات)", + "de_DE": "Extrahiert das Logo aus der aktuellen Anwendungskonfiguration (einschließlich Updates)", + "el_GR": "Εξαγωγή της ενότητας Logo από την τρέχουσα διαμόρφωση της εφαρμογής (συμπεριλαμβανομένου ενημερώσεων)", + "en_US": "Extract the Logo section from Application's current config (including updates)", + "es_ES": "Extraer la sección Logo de la configuración actual de la aplicación (incluyendo actualizaciones)", + "fr_FR": "Extraire la section Logo de la configuration actuelle de l’application (mises à jour incluses)", + "he_IL": "חלץ את קטע ה-Logo מתצורת היישום הנוכחית (כולל עדכונים)", + "it_IT": "Estrae la sezione Logo dall'attuale configurazione dell'applicazione (inclusi gli aggiornamenti)", + "ja_JP": "現在のアプリケーション設定(アップデート含む)からロゴセクションを展開します", + "ko_KR": "앱의 현재 구성에서 로고 섹션 추출 (업데이트 포함)", + "no_NO": "Pakk ut Logo-seksjonen fra applikasjonens gjeldende konfigurasjon (inkludert oppdateringer)", + "pl_PL": "Wyodrębnij sekcję z logiem z bieżącej konfiguracji aplikacji (w tym aktualizacje)", + "pt_BR": "Extrai a seção Logo do jogo (incluindo atualizações)", + "ru_RU": "Извлечение раздела с логотипом из текущих настроек приложения (включая обновления)", + "sv_SE": "Extrahera Logo-sektionen från applikationens aktuella konfiguration (inkl uppdateringar)", + "th_TH": "แยกส่วน โลโก้ ออกจากการตั้งค่าปัจจุบันของแอปพลิเคชัน (รวมถึงอัปเดต)", + "tr_TR": "Uygulamanın geçerli yapılandırmasından Logo kısmını ayıkla (Güncellemeler dahil)", + "uk_UA": "Видобуває розділ логотипу з поточної конфігурації програми (включаючи оновлення)", + "zh_CN": "从游戏的当前状态中提取图标 (包括更新)", + "zh_TW": "從應用程式的目前配置中提取 Logo 分區 (包含更新)" + } + }, + { + "ID": "GameListContextMenuCreateShortcut", + "Translations": { + "ar_SA": "إنشاء اختصار للتطبيق", + "de_DE": "Erstelle Anwendungsverknüpfung", + "el_GR": "Δημιουργία Συντόμευσης Εφαρμογής", + "en_US": "Create Application Shortcut", + "es_ES": "Crear acceso directo de aplicación", + "fr_FR": "Créer un raccourci de l’application", + "he_IL": "ליצור קיצור דרך לאפליקציה", + "it_IT": "Crea collegamento", + "ja_JP": "アプリケーションのショートカットを作成", + "ko_KR": "바로 가기 만들기", + "no_NO": "Lag programsnarvei", + "pl_PL": "Utwórz skrót aplikacji", + "pt_BR": "Criar Atalho da Aplicação", + "ru_RU": "Создать ярлык приложения", + "sv_SE": "Skapa genväg till applikation", + "th_TH": "สร้างทางลัดของแอปพลิเคชัน", + "tr_TR": "Uygulama Kısayolu Oluştur", + "uk_UA": "Створити ярлик застосунку", + "zh_CN": "创建游戏快捷方式", + "zh_TW": "建立應用程式捷徑" + } + }, + { + "ID": "GameListContextMenuCreateShortcutToolTip", + "Translations": { + "ar_SA": "أنشئ اختصار سطح مكتب لتشغيل التطبيق المحدد", + "de_DE": "Erstelle eine Desktop-Verknüpfung die die gewählte Anwendung startet", + "el_GR": "Δημιουργία συντόμευσης επιφάνειας εργασίας που ανοίγει την επιλεγμένη εφαρμογή", + "en_US": "Create a Desktop Shortcut that launches the selected Application", + "es_ES": "Crear un acceso directo en el escritorio que lance la aplicación seleccionada", + "fr_FR": "Créer un raccourci sur le bureau qui lance l’application sélectionnée", + "he_IL": "ליצור קיצור דרך בשולחן העבודה שיפתח את אפליקציה זו", + "it_IT": "Crea un collegamento sul desktop che avvia l'applicazione selezionata", + "ja_JP": "選択したアプリケーションを起動するデスクトップショートカットを作成します", + "ko_KR": "선택한 앱을 실행하는 바탕 화면에 바로 가기를 생성", + "no_NO": "Lag en snarvei på skrivebordet som starter den valgte Applikasjonen", + "pl_PL": "Utwórz skrót na pulpicie, który uruchamia wybraną aplikację", + "pt_BR": "Criar um atalho na área de trabalho que inicia o aplicativo selecionado", + "ru_RU": "Создает ярлык на рабочем столе, с помощью которого можно запустить игру или приложение", + "sv_SE": "Skapa en skrivbordsgenväg som startar vald applikation", + "th_TH": "สร้างทางลัดบนเดสก์ท็อปสำหรับใช้แอปพลิเคชันที่เลือก", + "tr_TR": "Seçilmiş uygulamayı çalıştıracak bir masaüstü kısayolu oluştur", + "uk_UA": "Створити ярлик на робочому столі, який запускатиме вибраний застосунок (гру)", + "zh_CN": "创建一个直接启动此游戏的桌面快捷方式", + "zh_TW": "建立桌面捷徑,啟動選取的應用程式" + } + }, + { + "ID": "GameListContextMenuCreateCustomConfiguration", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Create Custom Configuration", + "es_ES": "", + "fr_FR": "Créer une configuration personnalisée", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "사용자 정의 구성 만들기", + "no_NO": "Opprett egendefinert konfigurasjon", + "pl_PL": "", + "pt_BR": "Criar Configuração Custumizada", + "ru_RU": "Задать индивидуальные параметры", + "sv_SE": "Skapa anpassad konfiguration", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Створити користувацьку конфігурацію", + "zh_CN": "创建自定义设置", + "zh_TW": "建立遊戲獨立自訂 (per-game) 設定檔" + } + }, + { + "ID": "GameListContextMenuEditCustomConfiguration", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Edit Custom Configuration", + "es_ES": "", + "fr_FR": "Modifier la configuration personnalisée", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "사용자 정의 구성 편집", + "no_NO": "Rediger egendefinert konfigurasjon", + "pl_PL": "", + "pt_BR": "Editar Configuração Customizada", + "ru_RU": "Изменить индивидуальные параметры", + "sv_SE": "Redigera anpassad konfiguration", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Редагувати користувацьку конфігурацію", + "zh_CN": "编辑自定义设置", + "zh_TW": "編輯遊戲獨立自訂 (per-game) 設定檔" + } + }, + { + "ID": "GameListContextMenuCreateShortcutToolTipMacOS", + "Translations": { + "ar_SA": "أنشئ اختصار يُشغل التطبيق المحدد في مجلد تطبيقات ‫macOS", + "de_DE": "Erstellen Sie eine Verknüpfung im MacOS-Programme-Ordner, die die ausgewählte Anwendung startet", + "el_GR": "", + "en_US": "Create a shortcut in macOS's Applications folder that launches the selected Application", + "es_ES": "Crea un acceso directo en la carpeta de Aplicaciones de macOS que inicie la Aplicación seleccionada", + "fr_FR": "Créer un raccourci dans le dossier Applications de macOS qui lance l’application sélectionnée", + "he_IL": "ליצור קיצור דרך בתיקיית האפליקציות של macOS שיפתח את אפליקציה זו", + "it_IT": "Crea un collegamento nella cartella Applicazioni di macOS che avvia l'applicazione selezionata", + "ja_JP": "選択したアプリケーションを起動する ショートカットを macOS の Applications フォルダに作成します", + "ko_KR": "선택한 앱을 실행하는 macOS 앱 폴더에 바로 가기 만들기", + "no_NO": "Lag snarvei i macOSs Program-mappen som starter det valgte programmet", + "pl_PL": "Utwórz skrót w folderze 'Aplikacje' w systemie macOS, który uruchamia wybraną aplikację", + "pt_BR": "Crie um atalho na pasta Aplicativos do macOS que abre o Aplicativo selecionado", + "ru_RU": "Создает ярлык игры или приложения в папке Программы macOS", + "sv_SE": "Skapa en genväg i macOS-programmapp som startar vald applikation", + "th_TH": "สร้างทางลัดในโฟลเดอร์ Applications ของ macOS สำหรับใช้แอปพลิเคชันที่เลือก", + "tr_TR": "", + "uk_UA": "Створити ярлик у каталозі програм macOS, що запускатиме обраний застосунок (гру)", + "zh_CN": "在 macOS 的应用程序目录中创建一个直接启动此游戏的快捷方式", + "zh_TW": "在 macOS 的應用程式資料夾中建立捷徑,啟動選取的應用程式" + } + }, + { + "ID": "CreateCustomConfigurationToolTip", + "Translations": { + "ar_SA": "ينشئ تكوينًا مستقلًا للعبة الحالية", + "de_DE": "Erstellt eine unabhängige Konfiguration für das aktuelle Spiel", + "el_GR": "Δημιουργεί μια ανεξάρτητη διαμόρφωση για το τρέχον παιχνίδι", + "en_US": "Creates an independent configuration for the selected game", + "es_ES": "Crea una configuración independiente para el juego actual", + "fr_FR": "Crée une configuration indépendante pour le jeu sélectionné", + "he_IL": "יוצר תצורה עצמאית למשחק הנוכחי", + "it_IT": "Crea una configurazione indipendente per il gioco attuale", + "ja_JP": "現在のゲーム用の独立した設定を作成します", + "ko_KR": "현재 게임에 대한 독립적인 설정을 생성합니다", + "no_NO": "Oppretter en uavhengig konfigurasjon for det gjeldende spillet", + "pl_PL": "Tworzy niezależną konfigurację dla bieżącej gry", + "pt_BR": "Cria uma configuração independente para o jogo atual", + "ru_RU": "Создает независимую конфигурацию для текущей игры", + "sv_SE": "Skapar en oberoende konfiguration för det aktuella spelet", + "th_TH": "สร้างการกำหนดค่าที่เป็นอิสระสำหรับเกมปัจจุบัน", + "tr_TR": "Mevcut oyun için bağımsız bir yapılandırma oluşturur", + "uk_UA": "Створюйте незалежну конфігурацію для поточної гри", + "zh_CN": "为当前游戏创建独立的配置", + "zh_TW": "為已選擇的遊戲建立遊戲獨立自訂 (game-specific) 的設定檔" + } + }, + { + "ID": "EditCustomConfigurationToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Edit your existing independent configuration for the selected game", + "es_ES": "", + "fr_FR": "Modifier votre configuration indépendante existante pour le jeu sélectionné", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "선택한 게임에 대한 기존 독립 구성 편집", + "no_NO": "Rediger din eksisterende uavhengige konfigurasjon for det valgte spillet", + "pl_PL": "", + "pt_BR": "Editar sua configuração independente existente para o jogo selecionado", + "ru_RU": "Отредактировать существующие независимые параметры для выбранной игры.", + "sv_SE": "Redigera din befintliga oberoende konfiguration för det valda spelet", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Відредагувати наявну індивідуальну конфігурацію для цієї гри.", + "zh_CN": "编辑选定游戏的现存独立配置", + "zh_TW": "為已選擇的遊戲編輯遊戲獨立自訂 (game-specific) 的設定檔" + } + }, + { + "ID": "GameListContextMenuShowCompatEntry", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Show Compatibility Entry", + "es_ES": "", + "fr_FR": "Afficher l’entrée de compatibilité", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "호환성 항목 표시", + "no_NO": "Vis kompatibilitetsoppføring", + "pl_PL": "", + "pt_BR": "Mostrar Dados de Compatibilidade", + "ru_RU": "Показать записи о совместимости", + "sv_SE": "Visa kompatibilitetspost", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Iнформація про сумісність", + "zh_CN": "显示兼容性项目", + "zh_TW": "顯示相容性資訊" + } + }, + { + "ID": "GameListContextMenuShowCompatEntryToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Show the selected game in the Compatibility List you can normally access via the Help menu.", + "es_ES": "", + "fr_FR": "Afficher le jeu sélectionné dans la liste de compatibilité accessible normalement via le menu Aide.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "일반적으로 도움말 메뉴를 통해 접근할 수 있는 호환성 목록에 선택한 게임을 표시합니다.", + "no_NO": "Vis det valgte spillet i kompatibilitetslisten, som du vanligvis får tilgang til via Hjelp-menyen.", + "pl_PL": "", + "pt_BR": "Exibe o jogo selecionado na Lista de Compatibilidade, que normalmente pode ser acessada pelo menu Ajuda.", + "ru_RU": "Отобразить выбранную игру в списке совместимости, доступ к которому вы обычно можете получить через меню Справки.", + "sv_SE": "Visa valt spel i kompatibilitetslistan som du normalt sett kan komma åt via hjälpmenyn.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Показати цю гру в Списку Сумісності. Список сумісності також можна зайти в меню Довідки.", + "zh_CN": "在兼容性列表中显示选定的游戏,您通常可以通过帮助菜单访问。", + "zh_TW": "在相容性列表中顯示已選擇的遊戲。你也可以透過「說明」選單開啟。" + } + }, + { + "ID": "GameListContextMenuShowGameData", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Show Game Info", + "es_ES": "", + "fr_FR": "Afficher les informations du jeu", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "게임 통계 표시", + "no_NO": "Vis Spill Info", + "pl_PL": "", + "pt_BR": "Mostrar Informações do Jogo", + "ru_RU": "Показать информацию об игре", + "sv_SE": "Visa spelinformation", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Інформація про гру", + "zh_CN": "显示游戏信息", + "zh_TW": "顯示遊戲資訊" + } + }, + { + "ID": "GameListContextMenuShowGameDataToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Show stats & details about the currently selected game.", + "es_ES": "", + "fr_FR": "Afficher les statistiques et les détails sur le jeu actuellement sélectionné.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "그리드 보기 레이아웃에서 누락된 현재 선택된 게임에 대한 다양한 정보를 표시합니다.", + "no_NO": "Vis statistikk og detaljer om det valgte spillet.", + "pl_PL": "", + "pt_BR": "Exibe estatísticas e detalhes sobre o jogo selecionado.", + "ru_RU": "Показывать статистику и подробную информацию о выбранной игре.", + "sv_SE": "Visa statistik och detaljer om det aktuella spelet.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Показати статистику та деталі обраної гри.", + "zh_CN": "显示当前选定游戏的状态与详细信息。", + "zh_TW": "顯示目前已選擇遊戲的狀態及詳細資訊。" + } + }, + { + "ID": "GameListContextMenuOpenModsDirectory", + "Translations": { + "ar_SA": "‫فتح مجلد التعديلات (Mods)", + "de_DE": "Mod-Verzeichnis öffnen", + "el_GR": "", + "en_US": "Open Mods Directory", + "es_ES": "Abrir Directorio de Mods", + "fr_FR": "Ouvrir le dossier des mods", + "he_IL": "פתח תיקיית מודים", + "it_IT": "Apri la cartella delle mod", + "ja_JP": "Modディレクトリを開く", + "ko_KR": "모드 디렉터리 열기", + "no_NO": "Åpne Modifikasjonsmappen", + "pl_PL": "Otwórz katalog modów", + "pt_BR": "Abrir Pasta de Mods", + "ru_RU": "Открыть папку с модами", + "sv_SE": "Öppna Mods-katalog", + "th_TH": "เปิดไดเร็กทอรี่ Mods", + "tr_TR": "Mod Dizinini Aç", + "uk_UA": "Відкрити теку з модами", + "zh_CN": "打开 MOD 目录", + "zh_TW": "開啟模組資料夾" + } + }, + { + "ID": "GameListContextMenuOpenModsDirectoryToolTip", + "Translations": { + "ar_SA": "يفتح المجلد الذي يحتوي على تعديلات‫(mods) التطبيق", + "de_DE": "Öffnet das Verzeichnis, welches Mods für die Spiele beinhaltet", + "el_GR": "", + "en_US": "Opens the directory which contains Application's Mods", + "es_ES": "Abre el directorio que contiene los Mods de la Aplicación.", + "fr_FR": "Ouvre le dossier contenant les mods de l’application", + "he_IL": "פותח את התיקייה שמכילה מודים של האפליקציה", + "it_IT": "Apre la cartella che contiene le mod dell'applicazione", + "ja_JP": "アプリケーションの Mod データを格納するディレクトリを開きます", + "ko_KR": "앱의 모드가 포함된 디렉터리 열기", + "no_NO": "Åpner mappen som inneholder programmets modifikasjoner", + "pl_PL": "Otwiera katalog zawierający mody dla danej aplikacji", + "pt_BR": "Abre a pasta que contém os mods da aplicação", + "ru_RU": "Открывает папку, содержащую моды для приложений и игр", + "sv_SE": "Öppnar katalogen som innehåller applikationens Mods", + "th_TH": "เปิดไดเร็กทอรี่ Mods ของแอปพลิเคชัน", + "tr_TR": "", + "uk_UA": "Відкриває теку, яка містить модифікації застосунків (ігор)", + "zh_CN": "打开存放游戏 MOD 的目录", + "zh_TW": "開啟此應用程式模組的資料夾" + } + }, + { + "ID": "GameListContextMenuOpenSdModsDirectory", + "Translations": { + "ar_SA": "فتح مجلد تعديلات‫(mods) أتموسفير", + "de_DE": "Atmosphere-Mod-Verzeichnis öffnen", + "el_GR": "", + "en_US": "Open Atmosphere Mods Directory", + "es_ES": "Abrir Directorio de Mods de Atmosphere\n\n\n\n\n\n", + "fr_FR": "Ouvrir le dossier des mods Atmosphère", + "he_IL": "פתח תיקיית מודים של Atmosphere", + "it_IT": "Apri la cartella delle mod Atmosphere", + "ja_JP": "Atmosphere Mods ディレクトリを開く", + "ko_KR": "Atmosphere 모드 디렉터리 열기", + "no_NO": "Åpne Atmosfære modifikasjons mappen", + "pl_PL": "Otwórz katalog modów Atmosphere", + "pt_BR": "Abrir Diretório de Mods Atmosphere", + "ru_RU": "Открыть папку с модами Atmosphere", + "sv_SE": "Öppna Atmosphere Mods-katalogen", + "th_TH": "เปิดไดเร็กทอรี่ Mods Atmosphere", + "tr_TR": "", + "uk_UA": "Відкрити теку модифікацій Atmosphere", + "zh_CN": "打开大气层系统 MOD 目录", + "zh_TW": "開啟 Atmosphere 模組資料夾" + } + }, + { + "ID": "GameListContextMenuOpenSdModsDirectoryToolTip", + "Translations": { + "ar_SA": "يفتح مجلد أتموسفير لبطاقة SD البديلة الذي يحتوي على تعديلات التطبيق. مفيد للتعديلات التي تم تعبئتها للأجهزة الحقيقية.", + "de_DE": "Öffnet das alternative SD-Karten-Atmosphere-Verzeichnis, das die Mods der Anwendung enthält. Dieser Ordner ist nützlich für Mods, die für echte Hardware erstellt worden sind.", + "el_GR": "", + "en_US": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.", + "es_ES": "Abre el directorio alternativo de la tarjeta SD de Atmosphere que contiene los Mods de la Aplicación. Útil para los mods que están empaquetados para el hardware real.", + "fr_FR": "Ouvre le dossier Atmosphere d’une carte SD alternative contenant les mods de l’application. Utile pour les mods conçus pour fonctionner sur un matériel réel.", + "he_IL": "פותח את תיקיית כרטיס ה-SD החלופית של Atmosphere המכילה את המודים של האפליקציה. שימושי עבור מודים שארוזים עבור חומרה אמיתית.", + "it_IT": "Apre la cartella alternativa di Atmosphere sulla scheda SD che contiene le mod dell'applicazione. Utile per le mod create per funzionare sull'hardware reale.", + "ja_JP": "アプリケーションの Mod データを格納する SD カードの Atmosphere ディレクトリを開きます. 実際のハードウェア用に作成された Mod データに有用です.", + "ko_KR": "해당 게임의 모드가 포함된 대체 SD 카드 Atmosphere 디렉터리를 엽니다. 실제 하드웨어용으로 패키징된 모드에 유용합니다.", + "no_NO": "Åpner den alternative SD-kortets Atmosfære-mappe som inneholder programmoduser. Nyttig for modifikasjoner som er pakket for ekte maskinvare.", + "pl_PL": "Otwiera alternatywny katalog Atmosphere na karcie SD, który zawiera mody danej aplikacji. Przydatne dla modów przygotowanych pod prawdziwy sprzęt.", + "pt_BR": "Abre o diretório Atmosphere do cartão SD alternativo que contém os Mods do aplicativo. Útil para mods que são empacotados para hardware real.", + "ru_RU": "Открывает папку Atmosphere на альтернативной SD-карте, которая содержит моды для приложений и игр. Полезно для модов, сделанных для реальной консоли.", + "sv_SE": "Öppnar den alternativa Atmosphere-katalogen på SD-kort som innehåller applikationens Mods. Användbart för Mods som är paketerade för riktig hårdvara.", + "th_TH": "เปิดไดเร็กทอรี่ Atmosphere ของการ์ด SD สำรองซึ่งมี Mods ของแอปพลิเคชัน ซึ่งมีประโยชน์สำหรับ Mods ที่บรรจุมากับฮาร์ดแวร์จริง", + "tr_TR": "", + "uk_UA": "Відкриває альтернативну теку SD-карти Atmosphere, що містить модифікації до застосунків або ігор. Корисно для модифікацій, зроблених для реального обладнання.", + "zh_CN": "打开存放适用于大气层系统的游戏 MOD 的目录,对于为真实硬件打包的 MOD 非常有用", + "zh_TW": "開啟此應用程式模組的另一個 SD 卡 Atmosphere 資料夾。適用於為真實硬體封裝的模組。" + } + }, + { + "ID": "GameListContextMenuTrimXCI", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Check and Trim XCI File", + "es_ES": "Verificar y recortar archivo XCI", + "fr_FR": "Vérifier et réduire le fichier XCI", + "he_IL": "", + "it_IT": "Controlla e riduci la dimensione del file XCI", + "ja_JP": "", + "ko_KR": "XCI 파일 확인 및 트림", + "no_NO": "Kontroller og trim XCI-filen", + "pl_PL": "", + "pt_BR": "Verificar e Reduzir o Arquivo XCI", + "ru_RU": "Проверить и обрезать XCI файл", + "sv_SE": "Kontrollera och optimera XCI-fil", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Перевірка та нарізка XCI Файлу", + "zh_CN": "检查并瘦身 XCI 文件", + "zh_TW": "檢查及修剪 XCI 檔案" + } + }, + { + "ID": "GameListContextMenuTrimXCIToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Check and Trim XCI File to Save Disk Space", + "es_ES": "Verificar y recortar archivo XCI para ahorrar espacio en disco", + "fr_FR": "Vérifier et découper le fichier XCI pour économiser de l’espace disque", + "he_IL": "", + "it_IT": "Controlla e riduci la dimensione del file XCI per risparmiare spazio su disco", + "ja_JP": "", + "ko_KR": "디스크 공간을 절약하기 위해 XCI 파일 확인 및 트림", + "no_NO": "Kontroller og trimm XCI-filen for å spare diskplass", + "pl_PL": "", + "pt_BR": "Verifique e reduza o arquivo XCI para economizar espaço em disco", + "ru_RU": "Проверить и обрезать XCI файл для уменьшения его размера", + "sv_SE": "Kontrollera och optimera XCI-fil för att spara diskutrymme", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Перевірити та обрізати XCI Файл задля збереження місця на диску", + "zh_CN": "检查并瘦身 XCI 文件以节约磁盘空间", + "zh_TW": "檢查及修剪 XCI 檔案以節省儲存空間" + } + }, + { + "ID": "StatusBarGamesLoaded", + "Translations": { + "ar_SA": "{0}/{1} لعبة تم تحميلها", + "de_DE": "{0}/{1} Spiele geladen", + "el_GR": "{0}/{1} Φορτωμένα Παιχνίδια", + "en_US": "{0}/{1} Games Loaded", + "es_ES": "{0}/{1} juegos cargados", + "fr_FR": "{0}/{1} Jeux chargés", + "he_IL": "{1}/{0} משחקים נטענו", + "it_IT": "{0}/{1} giochi caricati", + "ja_JP": "{0}/{1} ゲーム", + "ko_KR": "{0}/{1}개의 게임 타이틀", + "no_NO": "{0}/{1} Spill Lastet", + "pl_PL": "{0}/{1} Załadowane gry", + "pt_BR": "{0}/{1} Jogos Carregados", + "ru_RU": "{0}/{1} игр загружено", + "sv_SE": "{0}/{1} spel inlästa", + "th_TH": "เกมส์โหลดแล้ว {0}/{1}", + "tr_TR": "{0}/{1} Oyun Yüklendi", + "uk_UA": "{0}/{1} ігор завантажено", + "zh_CN": "{0}/{1} 游戏加载完成", + "zh_TW": "{0}/{1} 遊戲已載入" + } + }, + { + "ID": "StatusBarSystemVersion", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Firmware Version: {0}", + "es_ES": "", + "fr_FR": "Version du firmware: {0}", + "he_IL": "", + "it_IT": "Versione firmware: {0}", + "ja_JP": "", + "ko_KR": "펌웨어 버전 : {0}", + "no_NO": "Fastvareversjon: {0}", + "pl_PL": "", + "pt_BR": "Versão do Firmware: {0}", + "ru_RU": "Версия прошивки: {0}", + "sv_SE": "Firmware-version: {0}", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Версія прошивки: {0}", + "zh_CN": "系统固件版本:{0}", + "zh_TW": "系統韌體版本: {0}" + } + }, + { + "ID": "StatusBarXCIFileTrimming", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Trimming XCI File '{0}'", + "es_ES": "Recortando el siguiente archivo XCI: '{0}'", + "fr_FR": "Réduction du fichier XCI '{0}'", + "he_IL": "", + "it_IT": "Riduzione della dimensione del file XCI '{0}'", + "ja_JP": "", + "ko_KR": "XCI 파일 '{0}' 트리밍", + "no_NO": "Trimming av XCI-filen '{0}'", + "pl_PL": "", + "pt_BR": "Reduzindo o Arquivo XCI '{0}'", + "ru_RU": "Обрезается XCI файл '{0}'", + "sv_SE": "Optimerar XCI-filen '{0}'", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Обрізається XCI Файлів '{0}'", + "zh_CN": "正在瘦身 XCI 文件 '{0}'", + "zh_TW": "正在修剪 XCI 檔案 '{0}'" + } + }, + { + "ID": "LinuxVmMaxMapCountDialogTitle", + "Translations": { + "ar_SA": "الحد الأدنى لتعيينات الذاكرة المكتشفة", + "de_DE": "Niedriges Limit für Speicherzuordnungen erkannt", + "el_GR": "Εντοπίστηκε χαμηλό όριο για αντιστοιχίσεις μνήμης", + "en_US": "Low limit for memory mappings detected", + "es_ES": "Límite inferior para mapeos de memoria detectado", + "fr_FR": "Limite basse pour les mappages mémoire détectée", + "he_IL": "זוהתה מגבלה נמוכה עבור מיפויי זיכרון", + "it_IT": "Rilevato limite basso per le mappature di memoria", + "ja_JP": "メモリマッピング上限値が小さすぎます", + "ko_KR": "메모리 매핑 한계 감지", + "no_NO": "Lav grense for minnetildelinger oppdaget", + "pl_PL": "Wykryto niski limit dla przypisań pamięci", + "pt_BR": "Detectado limite baixo para mapeamentos de memória", + "ru_RU": "Обнаружен низкий лимит разметки памяти", + "sv_SE": "Låg gräns för minnesmappningar upptäcktes", + "th_TH": "การตั้งค่าหน่วยความถึงขีดจำกัดต่ำสุดแล้ว", + "tr_TR": "Bellek Haritaları İçin Düşük Limit Tespit Edildi ", + "uk_UA": "Виявлено низьку межу для відображення памʼяті", + "zh_CN": "检测到操作系统内存映射最大数量被设置的过低", + "zh_TW": "檢測到記憶體映射的低限值" + } + }, + { + "ID": "LinuxVmMaxMapCountDialogTextPrimary", + "Translations": { + "ar_SA": "هل ترغب في زيادة قيمة vm.max_map_count إلى {0}", + "de_DE": "Möchtest Du den Wert von vm.max_map_count auf {0} erhöhen", + "el_GR": "Θα θέλατε να αυξήσετε την τιμή του vm.max_map_count σε {0}", + "en_US": "Would you like to increase the value of vm.max_map_count to {0}", + "es_ES": "¿Quieres aumentar el valor de vm.max_map_count a {0}?", + "fr_FR": "Voulez-vous augmenter la valeur de vm.max_map_count à {0}", + "he_IL": "האם תרצה להגביר את הערך של vm.max_map_count ל{0}", + "it_IT": "Vuoi aumentare il valore di vm.max_map_count a {0}?", + "ja_JP": "vm.max_map_count の値を {0}に増やしますか?", + "ko_KR": "vm.max_map_count의 값을 {0}으로 늘리시겠습니까?", + "no_NO": "Ønsker du å øke verdien av vm.max_map_count til {0}", + "pl_PL": "Czy chcesz zwiększyć wartość vm.max_map_count do {0}", + "pt_BR": "Você gostaria de aumentar o valor de vm.max_map_count para {0}", + "ru_RU": "Хотите увеличить значение vm.max_map_count до {0}", + "sv_SE": "Vill du öka värdet för vm.max_map_count till {0}", + "th_TH": "คุณต้องเพิ่มค่า vm.max_map_count ไปยัง {0}", + "tr_TR": "vm.max_map_count değerini {0} sayısına yükseltmek ister misiniz", + "uk_UA": "Бажаєте збільшити значення vm.max_map_count до {0}", + "zh_CN": "你想要将操作系统 vm.max_map_count 的值增加到 {0} 吗", + "zh_TW": "您是否要將 vm.max_map_count 的數值增至 {0}?" + } + }, + { + "ID": "LinuxVmMaxMapCountDialogTextSecondary", + "Translations": { + "ar_SA": "قد تحاول بعض الألعاب إنشاء المزيد من تعيينات الذاكرة أكثر مما هو مسموح به حاليا. سيغلق ريوجينكس بمجرد تجاوز هذا الحد.", + "de_DE": "Einige Spiele könnten versuchen, mehr Speicherzuordnungen zu erstellen, als derzeit erlaubt. Ryujinx wird abstürzen, sobald dieses Limit überschritten wird.", + "el_GR": "Μερικά παιχνίδια μπορεί να προσπαθήσουν να δημιουργήσουν περισσότερες αντιστοιχίσεις μνήμης από αυτές που επιτρέπονται τώρα. Ο Ryujinx θα καταρρεύσει μόλις ξεπεραστεί αυτό το όριο.", + "en_US": "Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.", + "es_ES": "Algunos juegos podrían intentar crear más mapeos de memoria de los permitidos. Ryujinx se bloqueará tan pronto como se supere este límite.", + "fr_FR": "Certains jeux peuvent tenter de créer plus de mappages mémoire que ce qui est actuellement autorisé. Ryujinx plantera dès que cette limite sera dépassée.", + "he_IL": "משחקים מסוימים עלולים לייצר עוד מיפויי זיכרון ממה שמתאפשר. Ryujinx יקרוס ברגע שהמגבלה תחרוג.", + "it_IT": "Alcuni giochi potrebbero provare a creare più mappature di memoria di quanto sia attualmente consentito. Ryujinx si bloccherà non appena questo limite viene superato.", + "ja_JP": "ゲームによっては, 現在許可されているサイズより大きなメモリマッピングを作成しようとすることがあります. この制限を超えると, Ryjinx はすぐにクラッシュします.", + "ko_KR": "일부 게임은 현재 허용된 것보다 더 많은 메모리 매핑을 만들려고 할 수 있습니다. 이 제한을 초과하면 Ryujinx가 충돌이 발생할 수 있습니다.", + "no_NO": "Noen spill kan prøve å lage flere minnekartlegging enn det som er tillatt. Ryujinx vil krasjes så snart denne grensen overskrides.", + "pl_PL": "Niektóre gry mogą próbować przypisać sobie więcej pamięci niż obecnie, jest to dozwolone. Ryujinx ulegnie awarii, gdy limit zostanie przekroczony.", + "pt_BR": "Alguns jogos podem tentar criar mais mapeamentos de memória do que o atualmente permitido. Ryujinx irá falhar assim que este limite for excedido.", + "ru_RU": "Некоторые игры могут создавать большую разметку памяти, чем разрешено на данный момент по умолчанию. Ryujinx вылетит при превышении этого лимита.", + "sv_SE": "Vissa spel kan försöka att skapa fler minnesmappningar än vad som tillåts. Ryujinx kommer att krascha så snart som denna gräns överstigs.", + "th_TH": "บางเกมอาจพยายามใช้งานหน่วยความจำมากกว่าที่ได้รับอนุญาตในปัจจุบัน Ryujinx จะปิดตัวลงเมื่อเกินขีดจำกัดนี้", + "tr_TR": "Bazı oyunlar şu an izin verilen bellek haritası limitinden daha fazlasını yaratmaya çalışabilir. Ryujinx bu limitin geçildiği takdirde kendini kapatıcaktır.", + "uk_UA": "Деякі ігри можуть спробувати створити більше відображень памʼяті, ніж це дозволено зараз. Ryujinx закриється (крашнеться), щойно цей ліміт буде перевищено.", + "zh_CN": "有些游戏可能会尝试创建超过当前系统允许的内存映射最大数量,若超过当前最大数量,Ryujinx 模拟器将会闪退。", + "zh_TW": "某些遊戲可能會嘗試建立超過目前允許的記憶體映射。一旦超過此限制,Ryujinx 就會崩潰。" + } + }, + { + "ID": "LinuxVmMaxMapCountDialogButtonUntilRestart", + "Translations": { + "ar_SA": "نعم، حتى إعادة التشغيل التالية", + "de_DE": "Ja, bis zum nächsten Neustart", + "el_GR": "Ναι, μέχρι την επόμενη επανεκκίνηση", + "en_US": "Yes, until the next restart", + "es_ES": "Sí, hasta el próximo reinicio", + "fr_FR": "Oui, jusqu'au prochain redémarrage", + "he_IL": "כן, עד האתחול הבא", + "it_IT": "Sì, fino al prossimo riavvio", + "ja_JP": "はい, 次回再起動まで", + "ko_KR": "예, 다음에 다시 시작할 때까지", + "no_NO": "Ja, frem til neste omstart", + "pl_PL": "Tak, do następnego ponownego uruchomienia", + "pt_BR": "Sim, até a próxima reinicialização", + "ru_RU": "Да, до следующего перезапуска", + "sv_SE": "Ja, tills nästa omstart", + "th_TH": "ใช่, จนกว่าจะรีสตาร์ทครั้งถัดไป", + "tr_TR": "Evet, bir sonraki yeniden başlatmaya kadar", + "uk_UA": "Так, до наст. перезапуску", + "zh_CN": "确定,临时保存(重启后失效)", + "zh_TW": "是的,直到下次重新啟動" + } + }, + { + "ID": "LinuxVmMaxMapCountDialogButtonPersistent", + "Translations": { + "ar_SA": "نعم، دائمًا", + "de_DE": "Ja, permanent", + "el_GR": "Ναι, μόνιμα", + "en_US": "Yes, permanently", + "es_ES": "Si, permanentemente", + "fr_FR": "Oui, en permanence", + "he_IL": "כן, לצמיתות", + "it_IT": "Sì, in modo permanente", + "ja_JP": "はい, 恒久的に", + "ko_KR": "예, 영구적으로", + "no_NO": "Ja, permanent", + "pl_PL": "Tak, permanentnie ", + "pt_BR": "Sim, permanentemente", + "ru_RU": "Да, постоянно", + "sv_SE": "Ja, permanent", + "th_TH": "ใช่, อย่างถาวร", + "tr_TR": "Evet, kalıcı olarak", + "uk_UA": "Так, постійно", + "zh_CN": "确定,永久保存", + "zh_TW": "是的,永久設定" + } + }, + { + "ID": "LinuxVmMaxMapCountWarningTextPrimary", + "Translations": { + "ar_SA": "الحد الأقصى لمقدار تعيينات الذاكرة أقل من الموصى به.", + "de_DE": "Maximale Anzahl an Speicherzuordnungen ist niedriger als empfohlen.", + "el_GR": "Ο μέγιστος αριθμός αντιστοιχίσεων μνήμης είναι μικρότερος από τον συνιστώμενο.", + "en_US": "Max amount of memory mappings is lower than recommended.", + "es_ES": "La cantidad máxima de mapeos de memoria es menor de lo recomendado.", + "fr_FR": "La quantité maximale de mappages mémoire est inférieure à la valeur recommandée.", + "he_IL": "הכמות המירבית של מיפויי הזיכרון נמוכה מהמומלץ.", + "it_IT": "La quantità massima di mappature di memoria è inferiore a quella consigliata.", + "ja_JP": "メモリマッピングの最大量が推奨値よりも小さいです.", + "ko_KR": "메모리 매핑의 최대 용량이 권장 용량보다 부족합니다.", + "no_NO": "Den maksimale mengden Minnetilordninger er lavere enn anbefalt.", + "pl_PL": "Maksymalna ilość przypisanej pamięci jest mniejsza niż zalecana.", + "pt_BR": "A quantidade máxima de mapeamentos de memória é menor que a recomendada.", + "ru_RU": "Максимальная разметка памяти меньше, чем рекомендуется.", + "sv_SE": "Maximal mängd minnesmappningar är lägre än rekommenderat.", + "th_TH": "จำนวนสูงสุดของการจัดการหน่วยความจำ ต่ำกว่าที่แนะนำ", + "tr_TR": "İzin verilen maksimum bellek haritası değeri tavsiye edildiğinden daha düşük. ", + "uk_UA": "Максимальний обсяг виділеної пам'яті менший за рекомендований.", + "zh_CN": "内存映射的最大数量低于推荐值。", + "zh_TW": "記憶體映射的最大值低於建議值。" + } + }, + { + "ID": "LinuxVmMaxMapCountWarningTextSecondary", + "Translations": { + "ar_SA": "القيمة الحالية لـ vm.max_map_count ({0}) أقل من {1}. قد تحاول بعض الألعاب إنشاء المزيد من تعيينات الذاكرة أكثر مما هو مسموح به حاليا. سيغلق ريوجينكس بمجرد تجاوز هذا الحد.\n\nقد ترغب إما في زيادة الحد يدويا أو تثبيت pkexec، مما يسمح لـ ريوجينكس بالمساعدة في ذلك.", + "de_DE": "Der aktuelle Wert von vm.max_map_count ({0}) ist kleiner als {1}. Einige Spiele könnten versuchen, mehr Speicherzuordnungen zu erstellen, als derzeit erlaubt. Ryujinx wird abstürzen, sobald dieses Limit überschritten wird.\n\nDu kannst das Limit entweder manuell erhöhen oder pkexec installieren, damit Ryujinx Dir dabei hilft.", + "el_GR": "Η τρέχουσα τιμή του vm.max_map_count ({0}) είναι χαμηλότερη από {1}. Ορισμένα παιχνίδια μπορεί να προσπαθήσουν να δημιουργήσουν περισσότερες αντιστοιχίσεις μνήμης από αυτές που επιτρέπονται τώρα. Ο Ryujinx θα συντριβεί μόλις ξεπεραστεί το όριο.\n\nΜπορεί να θέλετε είτε να αυξήσετε χειροκίνητα το όριο ή να εγκαταστήσετε το pkexec, το οποίο επιτρέπει Ryujinx να βοηθήσει με αυτό.", + "en_US": "The current value of vm.max_map_count ({0}) is lower than {1}. Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.\n\nYou might want to either manually increase the limit or install pkexec, which allows Ryujinx to assist with that.", + "es_ES": "El valor actual de vm.max_map_count ({0}) es menor que {1}. Algunos juegos podrían intentar crear más mapeos de memoria de los permitidos actualmente. Ryujinx se bloqueará tan pronto como se supere este límite.\n\nPuede que desee aumentar manualmente el límite o instalar pkexec, lo que permite a Ryujinx ayudar con eso.", + "fr_FR": "La valeur actuelle de vm.max_map_count ({0}) est inférieure à {1}. Certains jeux pourraient tenter de créer plus de mappages mémoire que ce qui est actuellement autorisé. Ryujinx plantera dès que cette limite sera dépassée.\n\nVous pouvez soit augmenter manuellement cette limite, soit installer pkexec, qui permet à Ryujinx de vous aider dans cette opération.", + "he_IL": "הערך הנוכחי של vm.max_map_count {0} נמוך מ{1}. משחקים מסוימים עלולים לייצר עוד מיפוי זיכרון ממה שמתאפשר.Ryujinx יקרוס ברגע שהמגבלה תחרוג.\n\nיתכן ותרצה להעלות את המגבלה הנוכחית או להתקין את pkexec, אשר יאפשר לRyujinx לסייע בכך.", + "it_IT": "Il valore corrente di vm.max_map_count ({0}) è inferiore a {1}. Alcuni giochi potrebbero provare a creare più mappature di memoria di quanto sia attualmente consentito. Ryujinx si bloccherà non appena questo limite viene superato.\n\nPotresti voler aumentare manualmente il limite o installare pkexec, il che permette a Ryujinx di assisterlo.", + "ja_JP": "vm.max_map_count の現在値 {0} は {1} よりも小さいです. ゲームによっては現在許可されている値よりも大きなメモリマッピングを作成しようとする場合があります. 上限を越えた場合, Ryujinx はクラッシュします.", + "ko_KR": "vm.max_map_count({0})의 현재 값은 {1}보다 낮습니다. 일부 게임은 현재 허용된 것보다 더 많은 메모리 매핑을 만들려고 할 수 있습니다. Ryujinx는 이 제한을 초과하자마자 충돌할 것입니다.\n\n제한을 수동으로 늘리거나 Ryujinx가 이를 지원할 수 있도록 pkexec를 설치하는 것을 추천합니다.", + "no_NO": "Gjeldende verdi av vm.max_map_count ({0}) er lavere enn {1}. Noen spill kan prøve å lage flere minnedelinger enn det som er tillatt. Ryujinx vil kræsje så snart denne grensen overskrides.\n\nDet kan hende du ønsker å enten øke grensen eller installere pkexec manuelt, slik at Ryujinx kan hjelpe til med det.", + "pl_PL": "Obecna wartość vm.max_map_count ({0}) jest mniejsza niż {1}. Niektóre gry mogą próbować stworzyć więcej mapowań pamięci niż obecnie jest to dozwolone. Ryujinx napotka crash, gdy dojdzie do takiej sytuacji.\n\nMożesz chcieć ręcznie zwiększyć limit lub zainstalować pkexec, co pozwala Ryujinx na pomoc w tym zakresie.", + "pt_BR": "O valor atual de vm.max_map_count ({0}) é menor que {1}. Alguns jogos podem tentar criar mais mapeamentos de memória do que o permitido no momento. Ryujinx vai falhar assim que este limite for excedido.\n\nTalvez você queira aumentar o limite manualmente ou instalar pkexec, o que permite que Ryujinx ajude com isso.", + "ru_RU": "Текущее значение vm.max_map_count ({0}) меньше, чем {1}. Некоторые игры могут попытаться создать большую разметку памяти, чем разрешено в данный момент. Ryujinx вылетит как только этот лимит будет превышен.\n\nВозможно, вам потребуется вручную увеличить лимит или установить pkexec, что позволит Ryujinx помочь справиться с превышением лимита.", + "sv_SE": "Det aktuella värdet för vm.max_map_count ({0}) är lägre än {1}. Vissa spel kan försöka att skapa fler minnesmappningar än vad som tillåts. Ryujinx kommer att krascha så snart som denna gräns överstigs.\n\nDu kanske vill manuellt öka gränsen eller installera pkexec, vilket tillåter att Ryujinx hjälper till med det.", + "th_TH": "ค่าปัจจุบันของ vm.max_map_count ({0}) มีค่าต่ำกว่า {1} บางเกมอาจพยายามใช้หน่วยความจำมากกว่าที่ได้รับอนุญาตในปัจจุบัน Ryujinx จะปิดตัวลงเมื่อเกินขีดจำกัดนี้\n\nคุณอาจต้องการตั้งค่าเพิ่มขีดจำกัดด้วยตนเองหรือติดตั้ง pkexec ซึ่งอนุญาตให้ Ryujinx ช่วยเหลือคุณได้", + "tr_TR": "Şu anki vm.max_map_count değeri {0}, bu {1} değerinden daha az. Bazı oyunlar şu an izin verilen bellek haritası limitinden daha fazlasını yaratmaya çalışabilir. Ryujinx bu limitin geçildiği takdirde kendini kapatıcaktır.\n\nManuel olarak bu limiti arttırmayı deneyebilir ya da pkexec'i yükleyebilirsiniz, bu da Ryujinx'in yardımcı olmasına izin verir.", + "uk_UA": "Поточне значення vm.max_map_count ({0}) менше за {1}. Деякі ігри можуть спробувати створити більше відображень пам’яті, ніж дозволено наразі. Ryujinx закриється (крашнеться), щойно цей ліміт буде перевищено.\n\nВи можете збільшити ліміт власноруч або встановити pkexec, який допоможе Ryujinx впоратися з перевищенням ліміту.", + "zh_CN": "vm.max_map_count ({0}) 的当前值小于 {1}。 有些游戏可能会尝试创建超过当前系统允许的内存映射最大数量,若超过当前最大数量,Ryujinx 模拟器将会闪退。\n\n你可以手动增加内存映射最大数量,或者安装 pkexec,它可以辅助 Ryujinx 完成内存映射最大数量的修改操作。", + "zh_TW": "目前 vm.max_map_count ({0}) 的數值小於 {1}。某些遊戲可能會嘗試建立比目前允許值更多的記憶體映射。一旦超過此限制,Ryujinx 就會崩潰。\n\n您可能需要手動提高上限,或者安裝 pkexec,讓 Ryujinx 協助提高上限。" + } + }, + { + "ID": "Settings", + "Translations": { + "ar_SA": "إعدادات", + "de_DE": "Einstellungen", + "el_GR": "Ρυθμίσεις", + "en_US": "Settings", + "es_ES": "Configuración", + "fr_FR": "Paramètres", + "he_IL": "הגדרות", + "it_IT": "Impostazioni", + "ja_JP": "設定", + "ko_KR": "설정", + "no_NO": "Innstillinger", + "pl_PL": "Ustawienia", + "pt_BR": "Configurações", + "ru_RU": "Параметры", + "sv_SE": "Inställningar", + "th_TH": "ตั้งค่า", + "tr_TR": "Ayarlar", + "uk_UA": "Налаштування", + "zh_CN": "设置", + "zh_TW": "設定" + } + }, + { + "ID": "SettingsWithInfo", + "Translations": { + "ar_SA": "{0} - إعدادات", + "de_DE": "Einstellungen - {0}", + "el_GR": "Ρυθμίσεις - {0}", + "en_US": "Settings - {0}", + "es_ES": "Configuración - {0}", + "fr_FR": "Paramètres - {0}", + "he_IL": "{0} - הגדרות", + "it_IT": "Impostazioni - {0}", + "ja_JP": "設定 - {0}", + "ko_KR": "설정 - {0}", + "no_NO": "Innstillinger - {0}", + "pl_PL": "Ustawienia - {0}", + "pt_BR": "Configurações - {0}", + "ru_RU": "Параметры - {0}", + "sv_SE": "Inställningar - {0}", + "th_TH": "ตั้งค่า - {0}", + "tr_TR": "Ayarlar - {0}", + "uk_UA": "Налаштування - {0}", + "zh_CN": "设置 - {0}", + "zh_TW": "設定 - {0}" + } + }, + { + "ID": "SettingsTabGeneral", + "Translations": { + "ar_SA": "واجهة المستخدم", + "de_DE": "Oberfläche", + "el_GR": "Εμφάνιση", + "en_US": "User Interface", + "es_ES": "Interfaz de usuario", + "fr_FR": "Interface Utilisateur", + "he_IL": "ממשק משתמש", + "it_IT": "Interfaccia utente", + "ja_JP": "ユーザインタフェース", + "ko_KR": "사용자 인터페이스", + "no_NO": "Brukergrensesnitt", + "pl_PL": "Interfejs użytkownika", + "pt_BR": "Interface do Usuário", + "ru_RU": "Интерфейс", + "sv_SE": "Användargränssnitt", + "th_TH": "หน้าจอผู้ใช้", + "tr_TR": "Kullancı Arayüzü", + "uk_UA": "Інтерфейс", + "zh_CN": "用户界面", + "zh_TW": "使用者介面" + } + }, + { + "ID": "SettingsTabGeneralGeneral", + "Translations": { + "ar_SA": "عام", + "de_DE": "Allgemein", + "el_GR": "Γενικά", + "en_US": "General", + "es_ES": "", + "fr_FR": "Général", + "he_IL": "כללי", + "it_IT": "Generali", + "ja_JP": "一般", + "ko_KR": "일반", + "no_NO": "Generelt", + "pl_PL": "Ogólne", + "pt_BR": "Geral", + "ru_RU": "Общее", + "sv_SE": "Allmänt", + "th_TH": "ทั่วไป", + "tr_TR": "Genel", + "uk_UA": "Загальні", + "zh_CN": "常规", + "zh_TW": "一般" + } + }, + { + "ID": "SettingsTabGeneralEnableDiscordRichPresence", + "Translations": { + "ar_SA": "تمكين وجود ديسكورد الغني", + "de_DE": "Aktiviere die Statusanzeige für Discord", + "el_GR": "Ενεργοποίηση Εμπλουτισμένης Παρουσίας Discord", + "en_US": "Enable Discord Rich Presence", + "es_ES": "Habilitar estado en Discord", + "fr_FR": "Activer Discord Rich Presence", + "he_IL": "הפעלת תצוגה עשירה בדיסקורד", + "it_IT": "Attiva Discord Rich Presence", + "ja_JP": "Discord リッチプレゼンスを有効にする", + "ko_KR": "디스코드 활동 상태 활성화", + "no_NO": "Aktiver Discord Rik Tilstedeværelse", + "pl_PL": "Włącz Bogatą Obecność Discord", + "pt_BR": "Habilitar Presença no Discord", + "ru_RU": "Статус активности в Discord", + "sv_SE": "Aktivera Discord Rich Presence", + "th_TH": "เปิดใช้งาน Discord Rich Presence", + "tr_TR": "Discord Zengin İçerik'i Etkinleştir", + "uk_UA": "Увімкнути розширену присутність Discord", + "zh_CN": "启用 Discord 在线状态展示", + "zh_TW": "啟用 Discord 動態狀態展示" + } + }, + { + "ID": "SettingsTabGeneralCheckUpdatesOnLaunch", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Check for Updates:", + "es_ES": "", + "fr_FR": "Vérifier les mises à jour : ", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "업데이트 확인 :", + "no_NO": "Se etter Oppdateringer:", + "pl_PL": "", + "pt_BR": "Verificar Atualizações:", + "ru_RU": "Проверка наличия обновлений", + "sv_SE": "Leta efter uppdateringar:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Перевірка оновлень:", + "zh_CN": "检查更新", + "zh_TW": "檢查更新:" + } + }, + { + "ID": "SettingsTabGeneralCheckUpdatesOnLaunchOff", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Off", + "es_ES": "", + "fr_FR": "Désactivé", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "끔", + "no_NO": "Av", + "pl_PL": "", + "pt_BR": "Desligado", + "ru_RU": "Отключить", + "sv_SE": "Av", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вимкнути", + "zh_CN": "关闭", + "zh_TW": "關閉" + } + }, + { + "ID": "SettingsTabGeneralCheckUpdatesOnLaunchPromptAtStartup", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Prompt", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "프롬프트", + "no_NO": "Spør", + "pl_PL": "", + "pt_BR": "Ao Abrir", + "ru_RU": "При запуске", + "sv_SE": "Fråga", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Запитувати щоразу", + "zh_CN": "提示", + "zh_TW": "提示" + } + }, + { + "ID": "SettingsTabGeneralCheckUpdatesOnLaunchBackground", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Background", + "es_ES": "", + "fr_FR": "En arrière-plan", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "백그라운드", + "no_NO": "Bakgrunn", + "pl_PL": "", + "pt_BR": "2° Plano", + "ru_RU": "В фоне", + "sv_SE": "Bakgrund", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Оновлювати в фоні", + "zh_CN": "背景", + "zh_TW": "背景" + } + }, + { + "ID": "SettingsTabGeneralFocusLossType", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "On Emulator Focus Lost:", + "es_ES": "", + "fr_FR": "Lorsque l’émulateur perd le focus :", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "에뮬레이터 초점 손실 :", + "no_NO": "På Emulator Fokus Tapt:", + "pl_PL": "", + "pt_BR": "Ao Perder o Foco:", + "ru_RU": "При выходе эмулятора из фокуса", + "sv_SE": "När emulatorn tappar fokus:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "При втраті фокуса емулятором:", + "zh_CN": "当模拟器在后台时:", + "zh_TW": "當模擬器「失去焦點」(如切換工作)時:" + } + }, + { + "ID": "SettingsTabGeneralFocusLossTypeDoNothing", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Do Nothing", + "es_ES": "", + "fr_FR": "Ne rien faire", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "아무것도 하지 않음", + "no_NO": "Gjør Ingenting", + "pl_PL": "", + "pt_BR": "Não Fazer Nada", + "ru_RU": "Ничего не делать", + "sv_SE": "Gör ingenting", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Нічого не робити", + "zh_CN": "什么事情也不做", + "zh_TW": "沒有動作" + } + }, + { + "ID": "SettingsTabGeneralFocusLossTypeBlockInput", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Block Input", + "es_ES": "", + "fr_FR": "Bloquer la saisie", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "입력 차단", + "no_NO": "Blokkinngang", + "pl_PL": "", + "pt_BR": "Bloquear Controles", + "ru_RU": "Блокировать управление", + "sv_SE": "Blockera inmatning", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Блокувати введення", + "zh_CN": "禁用输入", + "zh_TW": "停用輸入" + } + }, + { + "ID": "SettingsTabGeneralFocusLossTypeMuteAudio", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Mute Volume", + "es_ES": "", + "fr_FR": "Couper le son", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "음소거", + "no_NO": "Demp Lyd", + "pl_PL": "", + "pt_BR": "Ficar Mudo", + "ru_RU": "Отключить звук", + "sv_SE": "Stäng av ljudet", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вимкнути звук", + "zh_CN": "静音", + "zh_TW": "靜音" + } + }, + { + "ID": "SettingsTabGeneralFocusLossTypeBlockInputAndMuteAudio", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Block Input & Mute Volume", + "es_ES": "", + "fr_FR": "Bloquer la saisie & couper le son", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "입력 차단 및 음소거", + "no_NO": "Blokker Inputs og demp Volumet", + "pl_PL": "", + "pt_BR": "Bloquear Controles & Ficar Mudo", + "ru_RU": "Блокировать управление и отключить звук", + "sv_SE": "Blockera inmatningar och stäng av ljudet", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Блокувати введення та Вимкнути звук", + "zh_CN": "阻止输入且静音", + "zh_TW": "停用輸入且靜音" + } + }, + { + "ID": "SettingsTabGeneralFocusLossTypePauseEmulation", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Pause Emulation", + "es_ES": "", + "fr_FR": "Mettre l’émulation en pause", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "에뮬레이션 일시 중지", + "no_NO": "Pause Emulatoren", + "pl_PL": "", + "pt_BR": "Pausar a Emulação", + "ru_RU": "Поставить паузу", + "sv_SE": "Pausa emuleringen", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Поставити на паузу", + "zh_CN": "暂停模拟", + "zh_TW": "暫停模擬" + } + }, + { + "ID": "SettingsTabGeneralShowConfirmExitDialog", + "Translations": { + "ar_SA": "إظهار مربع حوار \"تأكيد الخروج\"", + "de_DE": "Zeige den \"Beenden bestätigen\"-Dialog", + "el_GR": "Εμφάνιση διαλόγου \"Επιβεβαίωση Εξόδου\".", + "en_US": "Show \"Confirm Exit\" Dialog", + "es_ES": "Mostrar diálogo de confirmación al cerrar", + "fr_FR": "Afficher le message de \"Confirmation de sortie\"", + "he_IL": "הראה דיאלוג \"אשר יציאה\"", + "it_IT": "Mostra dialogo \"Conferma Uscita\"", + "ja_JP": "\"終了を確認\" ダイアログを表示する", + "ko_KR": "\"종료 확인\" 대화 상자 표시", + "no_NO": "Vis \"Bekreft Avslutt\" vinduet", + "pl_PL": "Pokazuj okno dialogowe \"Potwierdź wyjście\"", + "pt_BR": "Exibir \"Diálogo de confirmação\" ao Sair", + "ru_RU": "Подтверждать выход из приложения", + "sv_SE": "Visa \"Bekräfta avslut\"-dialog", + "th_TH": "แสดง \"ปุ่มยืนยันการออก\" เมื่อออกเกม", + "tr_TR": "\"Çıkışı Onayla\" Diyaloğunu Göster", + "uk_UA": "Показати діалогове вікно «Підтвердити вихід».", + "zh_CN": "退出游戏时需要确认", + "zh_TW": "顯示「確認結束」對話方塊" + } + }, + { + "ID": "SettingsTabGeneralRememberWindowState", + "Translations": { + "ar_SA": "تذكر حجم/موضع النافذة", + "de_DE": "Fenstergröße/-position merken", + "el_GR": "", + "en_US": "Remember Window Size/Position", + "es_ES": "Recordar Tamaño/Posición de la Ventana", + "fr_FR": "Mémoriser la taille/position de la fenêtre", + "he_IL": "", + "it_IT": "Ricorda la dimensione e la posizione della finestra", + "ja_JP": "", + "ko_KR": "창 크기/위치 기억", + "no_NO": "Husk vinduets størrelse/posisjon", + "pl_PL": "", + "pt_BR": "Lembrar Tamanho e Posição da Janela", + "ru_RU": "Запомнить размер/положение окна", + "sv_SE": "Kom ihåg fönstrets storlek/position", + "th_TH": "จดจำ ขนาดหน้าต่างแอพพลิเคชั่น/คำแหน่ง", + "tr_TR": "", + "uk_UA": "Запам'ятати Розмір/Позицію вікна", + "zh_CN": "记住窗口大小和位置", + "zh_TW": "記住視窗大小/位置" + } + }, + { + "ID": "SettingsTabGeneralDisableInputWhenOutOfFocus", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Disable Input when Out of Focus", + "es_ES": "", + "fr_FR": "Désactiver la saisie en cas de perte de focus", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "초점이 맞지 않으면 입력 비활성화", + "no_NO": "Deaktiver inndata når vinduet er ute av fokus", + "pl_PL": "", + "pt_BR": "Desativar Controles Quando Estiver Fora de Foco", + "ru_RU": "Отключает управление при выходе из фокуса", + "sv_SE": "Inaktivera inmatning när fokus tappas", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вимкнути введення, якщо вікно неактивне", + "zh_CN": "在后台时禁用输入", + "zh_TW": "在「失去焦點」時停用輸入" + } + }, + { + "ID": "SettingsTabGeneralShowOldUI", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Show Original UI Style (Requires restart)", + "es_ES": "", + "fr_FR": "Afficher le style d’interface original (redémarrage requis)", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "원래 UI 스타일 표시(다시 시작 필요)", + "no_NO": "Vis original UI-stil (krever omstart)", + "pl_PL": "", + "pt_BR": "Mostrar Estilo Original da Interface (Requer Reinicialização)", + "ru_RU": "Включить оригинальный интерфейса (требуется перезагрузка)", + "sv_SE": "Visa ursprunglig gränssnittsstil (kräver omstart)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Показати оригінальний UI (Потрібен перезапуск)", + "zh_CN": "显示原始 UI 样式 (需要重启)", + "zh_TW": "顯示原始 UI 樣式 (需要重新啟動 Ryujinx)" + } + }, + { + "ID": "SettingsTabGeneralShowOldUIToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Show the older Avalonia Ryujinx UI reminiscent of Ryujinx 1.1.1403. This is enabled by default on platforms that are not Windows.\nThe classic-style title bar is back and major window layout reworkings are reversed; such as the settings navigation placement above this tooltip.", + "es_ES": "", + "fr_FR": "Afficher l’ancienne interface Avalonia Ryujinx, rappelant Ryujinx 1.1.1403. Cette option est activée par défaut sur les plateformes autres que Windows.\nLa barre de titre au style classique est de retour et les modifications majeures de la disposition des fenêtres sont annulées, comme le placement de la navigation des paramètres au-dessus de cette infobulle.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "Ryujinx 1.1.1403을 연상시키는 이전 Avalonia Ryujinx UI를 표시합니다. 이 기능은 윈도가 아닌 플랫폼에서는 기본적으로 활성화됩니다.\n 클래식 스타일의 타이틀 바가 돌아왔고 주요 창 레이아웃 변경 사항이 원래대로 적용됩니다. 이 툴팁 위의 설정 탐색 배치와 같은 경우입니다.", + "no_NO": "Vis det eldre Avalonia Ryujinx-grensesnittet som minner om Ryujinx 1.1.1403. Dette er aktivert som standard på plattformer som ikke er Windows.\nTittellinjen i klassisk stil er tilbake, og store omarbeidinger av vindusoppsettet er reversert, for eksempel plasseringen av innstillingsnavigasjonen over dette verktøytipset.", + "pl_PL": "", + "pt_BR": "Mostrar a Interface Avalonia antiga do Ryujinx 1.1.1403. Esta versão é ativada por padrão nas plataformas que não sejam Windows. \nO estilo clássico da Barra de Título retorna e grande parte das mudanças do Layout de janela são revertidas; assim como as configurações de posicionamento da navegação acima dessa descrição.", + "ru_RU": "Показать старый пользовательский интерфейс Avalonia Ryujinx, напоминающий Ryujinx 1.1.1403. Включено по умолчанию на платформах, отличных от Windows.\nСтрока заголовка в классическом стиле вернётся на место, а основные изменения в оформлении окна будут отменены; например, расположение навигации по настройкам над этой всплывающей подсказкой.", + "sv_SE": "Visa det gamla Ryuijinx-gränssnittet baserat på Avalonia som påminner om version 1.1.1403. Detta är aktiverat som standard på plattformat som inte är Windows.\nDen klassiska titelfältet är tillbaka och de stora omarbetningarna av fönsterlayouten är omvända, till exempel placeringen av inställningsnavigeringen ovanför detta verktygstips.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Показати старий інтерфейс Avalonia Ryujinx, який був у Ryujinx 1.1.1403. Ця опція активна за замовчуванням на всіх інших, окрім Windows платформах.\nПовернеться класична панель заголовка, а всі суттєві зміни інтерфейсу будуть скасовані, зокрема горизонтальне розміщення навігації в налаштуваннях.", + "zh_CN": "显示旧的类似 Ryujinx 1.1.1403 的 Avalonia Ryujinx UI。在非 Windows 平台上默认启用此选项。\n经典样式的标题栏已回归并且恢复了对窗口布局的重大重构;例如在工具提示上方放置设置导航。", + "zh_TW": "顯示舊版 Ryujinx 1.1.1403 的 Avalonia UI 樣式。在非 Windows 平台預設啟用。\n經典樣式的標題欄已回歸,並且還原了對設定視窗佈局的大型重構:例如在工具提示上方設置導覽列。" + } + }, + { + "ID": "SettingsTabGeneralHideCursor", + "Translations": { + "ar_SA": "إخفاء المؤشر:", + "de_DE": "Mauszeiger ausblenden", + "el_GR": "Απόκρυψη Κέρσορα:", + "en_US": "Hide Cursor:", + "es_ES": "Esconder el cursor:", + "fr_FR": "Masquer le Curseur :", + "he_IL": "הסתר את הסמן", + "it_IT": "Nascondi il cursore:", + "ja_JP": "マウスカーソルを非表示", + "ko_KR": "커서 숨기기 :", + "no_NO": "Skjul musepeker:", + "pl_PL": "Ukryj kursor:", + "pt_BR": "Esconder Cursor do Mouse:", + "ru_RU": "Скрывать курсор", + "sv_SE": "Dölj markör:", + "th_TH": "ซ่อน เคอร์เซอร์:", + "tr_TR": "İşaretçiyi Gizle:", + "uk_UA": "Сховати курсор:", + "zh_CN": "隐藏鼠标指针:", + "zh_TW": "隱藏滑鼠游標:" + } + }, + { + "ID": "SettingsTabGeneralHideCursorNever", + "Translations": { + "ar_SA": "مطلقا", + "de_DE": "Niemals", + "el_GR": "Ποτέ", + "en_US": "Never", + "es_ES": "Nunca", + "fr_FR": "Jamais", + "he_IL": "אף פעם", + "it_IT": "Mai", + "ja_JP": "決して", + "ko_KR": "절대 안 함", + "no_NO": "Aldri", + "pl_PL": "Nigdy", + "pt_BR": "Nunca", + "ru_RU": "Никогда", + "sv_SE": "Aldrig", + "th_TH": "ไม่ต้อง", + "tr_TR": "Hiçbir Zaman", + "uk_UA": "Ніколи", + "zh_CN": "从不隐藏", + "zh_TW": "從不" + } + }, + { + "ID": "SettingsTabGeneralHideCursorOnIdle", + "Translations": { + "ar_SA": "عند الخمول", + "de_DE": "Mauszeiger bei Inaktivität ausblenden", + "el_GR": "Απόκρυψη Δρομέα στην Αδράνεια", + "en_US": "On Idle", + "es_ES": "Ocultar cursor cuando esté inactivo", + "fr_FR": "Si inactif", + "he_IL": "במצב סרק", + "it_IT": "Quando è inattivo", + "ja_JP": "アイドル時", + "ko_KR": "유휴 상태", + "no_NO": "Når inaktiv", + "pl_PL": "Gdy bezczynny", + "pt_BR": "Quando Ocioso", + "ru_RU": "В простое", + "sv_SE": "Vid overksam", + "th_TH": "เมื่อไม่ได้ใช้งาน", + "tr_TR": "Hareketsiz Durumda", + "uk_UA": "Сховати у режимі очікування", + "zh_CN": "自动隐藏", + "zh_TW": "閒置時" + } + }, + { + "ID": "SettingsTabGeneralHideCursorAlways", + "Translations": { + "ar_SA": "دائما", + "de_DE": "Immer", + "el_GR": "Πάντα", + "en_US": "Always", + "es_ES": "Siempre", + "fr_FR": "Toujours", + "he_IL": "תמיד", + "it_IT": "Sempre", + "ja_JP": "常時", + "ko_KR": "항상", + "no_NO": "Alltid", + "pl_PL": "Zawsze", + "pt_BR": "Sempre", + "ru_RU": "Всегда", + "sv_SE": "Alltid", + "th_TH": "ตลอดเวลา", + "tr_TR": "Her Zaman", + "uk_UA": "Завжди", + "zh_CN": "始终隐藏", + "zh_TW": "總是" + } + }, + { + "ID": "SettingsTabGeneralGameDirectories", + "Translations": { + "ar_SA": "مجلدات الألعاب", + "de_DE": "Spielverzeichnisse", + "el_GR": "Τοποθεσίες παιχνιδιών", + "en_US": "Game Directories", + "es_ES": "Carpetas de juegos", + "fr_FR": "Dossiers des jeux", + "he_IL": "תקיות משחקים", + "it_IT": "Cartelle dei giochi", + "ja_JP": "ゲームディレクトリ", + "ko_KR": "게임 데릭터리", + "no_NO": "Spillmapper", + "pl_PL": "Katalogi gier", + "pt_BR": "Pasta de Jogos", + "ru_RU": "Папки с играми", + "sv_SE": "Spelkataloger", + "th_TH": "ไดเรกทอรี่ของเกม", + "tr_TR": "Oyun Dizinleri", + "uk_UA": "Тека ігор", + "zh_CN": "游戏目录", + "zh_TW": "遊戲資料夾" + } + }, + { + "ID": "SettingsTabGeneralAutoloadDirectories", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Autoload DLC/Updates Directories", + "es_ES": "Carpetas de DLC/Actualizaciones para Carga Automática", + "fr_FR": "Charger automatiquement les dossiers de DLC/mises à jour", + "he_IL": "", + "it_IT": "Cartelle di caricamento automatico di DLC/aggiornamenti", + "ja_JP": "", + "ko_KR": "DLC/업데이트 디렉터리 자동 불러오기", + "no_NO": "Autoload DLC/Updates-mapper", + "pl_PL": "", + "pt_BR": "Carregar Automaticamente Pasta de DLC e Atualizações", + "ru_RU": "Автозагрузка папки с DLC/Обновлениями", + "sv_SE": "Läs automatiskt in DLC/speluppdateringar", + "th_TH": "โหลดไดเรกทอรี DLC/ไฟล์อัปเดต อัตโนมัติ", + "tr_TR": "", + "uk_UA": "Автозавантаження теки DLC/Оновлень", + "zh_CN": "自动加载 DLC 及 游戏更新 的目录", + "zh_TW": "自動載入 DLC/遊戲更新資料夾" + } + }, + { + "ID": "SettingsTabGeneralAutoloadNote", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "DLC and Updates which refer to missing files will be unloaded automatically", + "es_ES": "DLC y Actualizaciones que hacen referencia a archivos ausentes serán desactivado automáticamente", + "fr_FR": "Les DLC et mises à jour faisant référence à des fichiers manquants seront déchargés automatiquement.", + "he_IL": "", + "it_IT": "Aggiornamenti e DLC che fanno riferimento a file mancanti verranno disabilitati automaticamente", + "ja_JP": "", + "ko_KR": "누락된 파일을 참조하는 DLC 및 업데이트가 자동으로 불러오기 취소", + "no_NO": "DLC og oppdateringer som henviser til manglende filer, vil bli lastet ned automatisk", + "pl_PL": "", + "pt_BR": "DLCs e Atualizações que se referem a arquivos ausentes serão desabilitados automaticamente", + "ru_RU": "DLC и обновления, которые ссылаются на отсутствующие файлы, будут выгружаться автоматически", + "sv_SE": "DLC och speluppdateringar som refererar till saknade filer kommer inte att läsas in automatiskt", + "th_TH": "", + "tr_TR": "", + "uk_UA": "DLC та Оновлення, які посилаються на відсутні файли, будуть автоматично вимкнуті.", + "zh_CN": "DLC 及 游戏更新 可自动加载和卸载", + "zh_TW": "遺失的 DLC 及遊戲更新檔案將會在自動載入中移除" + } + }, + { + "ID": "SettingsTabGeneralAdd", + "Translations": { + "ar_SA": "إضافة", + "de_DE": "Hinzufügen", + "el_GR": "Προσθήκη", + "en_US": "Add", + "es_ES": "Agregar", + "fr_FR": "Ajouter", + "he_IL": "הוסף", + "it_IT": "Aggiungi", + "ja_JP": "追加", + "ko_KR": "추가", + "no_NO": "Legg til", + "pl_PL": "Dodaj", + "pt_BR": "Adicionar", + "ru_RU": "Добавить", + "sv_SE": "Lägg till", + "th_TH": "เพิ่ม", + "tr_TR": "Ekle", + "uk_UA": "Додати", + "zh_CN": "添加", + "zh_TW": "新增" + } + }, + { + "ID": "SettingsTabGeneralRemove", + "Translations": { + "ar_SA": "إزالة", + "de_DE": "Entfernen", + "el_GR": "Αφαίρεση", + "en_US": "Remove", + "es_ES": "Quitar", + "fr_FR": "Retirer", + "he_IL": "הסר", + "it_IT": "Rimuovi", + "ja_JP": "削除", + "ko_KR": "제거", + "no_NO": "Fjern", + "pl_PL": "Usuń", + "pt_BR": "Remover", + "ru_RU": "Удалить", + "sv_SE": "Ta bort", + "th_TH": "เอาออก", + "tr_TR": "Kaldır", + "uk_UA": "Видалити", + "zh_CN": "删除", + "zh_TW": "刪除" + } + }, + { + "ID": "SettingsTabSystem", + "Translations": { + "ar_SA": "النظام", + "de_DE": "", + "el_GR": "Σύστημα", + "en_US": "System", + "es_ES": "Sistema", + "fr_FR": "Système", + "he_IL": "מערכת", + "it_IT": "Sistema", + "ja_JP": "システム", + "ko_KR": "시스템", + "no_NO": "", + "pl_PL": "", + "pt_BR": "Sistema", + "ru_RU": "Система", + "sv_SE": "", + "th_TH": "ระบบ", + "tr_TR": "Sistem", + "uk_UA": "Система", + "zh_CN": "系统", + "zh_TW": "系統" + } + }, + { + "ID": "SettingsTabSystemCore", + "Translations": { + "ar_SA": "النواة", + "de_DE": "Kern", + "el_GR": "Πυρήνας", + "en_US": "Core", + "es_ES": "Núcleo", + "fr_FR": "Paramètres généraux", + "he_IL": "ליבה", + "it_IT": "Principale", + "ja_JP": "コア", + "ko_KR": "코어", + "no_NO": "Kjerne", + "pl_PL": "Główne", + "pt_BR": "Principal", + "ru_RU": "Основные настройки", + "sv_SE": "Kärna", + "th_TH": "แกนกลาง", + "tr_TR": "Çekirdek", + "uk_UA": "Ядро", + "zh_CN": "核心", + "zh_TW": "核心" + } + }, + { + "ID": "SettingsTabSystemSystemRegion", + "Translations": { + "ar_SA": "منطقة النظام:", + "de_DE": "Systemregion:", + "el_GR": "Περιοχή Συστήματος:", + "en_US": "System Region:", + "es_ES": "Región del sistema:", + "fr_FR": "Région du système :", + "he_IL": "אזור מערכת:", + "it_IT": "Regione del sistema:", + "ja_JP": "地域:", + "ko_KR": "시스템 지역 :", + "no_NO": "System region:", + "pl_PL": "Region systemu:", + "pt_BR": "Região do Sistema:", + "ru_RU": "Регион прошивки:", + "sv_SE": "Systemregion:", + "th_TH": "ภูมิภาคของระบบ:", + "tr_TR": "Sistem Bölgesi:", + "uk_UA": "Регіон системи:", + "zh_CN": "系统区域:", + "zh_TW": "系統區域:" + } + }, + { + "ID": "SettingsTabSystemSystemRegionJapan", + "Translations": { + "ar_SA": "اليابان", + "de_DE": "", + "el_GR": "Ιαπωνία", + "en_US": "Japan", + "es_ES": "Japón", + "fr_FR": "Japon", + "he_IL": "יפן", + "it_IT": "Giappone", + "ja_JP": "日本", + "ko_KR": "일본", + "no_NO": "", + "pl_PL": "Japonia", + "pt_BR": "Japão", + "ru_RU": "Япония", + "sv_SE": "", + "th_TH": "ญี่ปุ่น", + "tr_TR": "Japonya", + "uk_UA": "Японія", + "zh_CN": "日本", + "zh_TW": "日本" + } + }, + { + "ID": "SettingsTabSystemSystemRegionUSA", + "Translations": { + "ar_SA": "الولايات المتحدة الأمريكية", + "de_DE": "", + "el_GR": "ΗΠΑ", + "en_US": "USA", + "es_ES": "EEUU", + "fr_FR": "États-Unis", + "he_IL": "ארה\"ב", + "it_IT": "Stati Uniti d'America", + "ja_JP": "アメリカ", + "ko_KR": "미국", + "no_NO": "", + "pl_PL": "Stany Zjednoczone", + "pt_BR": "EUA", + "ru_RU": "США", + "sv_SE": "", + "th_TH": "สหรัฐอเมริกา", + "tr_TR": "ABD", + "uk_UA": "США", + "zh_CN": "美国", + "zh_TW": "美國" + } + }, + { + "ID": "SettingsTabSystemSystemRegionEurope", + "Translations": { + "ar_SA": "أوروبا", + "de_DE": "Europa", + "el_GR": "Ευρώπη", + "en_US": "Europe", + "es_ES": "Europa", + "fr_FR": "", + "he_IL": "אירופה", + "it_IT": "Europa", + "ja_JP": "ヨーロッパ", + "ko_KR": "유럽", + "no_NO": "Europa", + "pl_PL": "Europa", + "pt_BR": "Europa", + "ru_RU": "Европа", + "sv_SE": "Europa", + "th_TH": "ยุโรป", + "tr_TR": "Avrupa", + "uk_UA": "Європа", + "zh_CN": "欧洲", + "zh_TW": "歐洲" + } + }, + { + "ID": "SettingsTabSystemSystemRegionAustralia", + "Translations": { + "ar_SA": "أستراليا", + "de_DE": "Australien", + "el_GR": "Αυστραλία", + "en_US": "Australia", + "es_ES": "", + "fr_FR": "Australie", + "he_IL": "אוסטרליה", + "it_IT": "", + "ja_JP": "オーストラリア", + "ko_KR": "호주", + "no_NO": "", + "pl_PL": "", + "pt_BR": "Austrália", + "ru_RU": "Австралия", + "sv_SE": "Australien", + "th_TH": "ออสเตรเลีย", + "tr_TR": "Avustralya", + "uk_UA": "Австралія", + "zh_CN": "澳大利亚", + "zh_TW": "澳洲" + } + }, + { + "ID": "SettingsTabSystemSystemRegionChina", + "Translations": { + "ar_SA": "الصين", + "de_DE": "", + "el_GR": "Κίνα", + "en_US": "China", + "es_ES": "", + "fr_FR": "Chine", + "he_IL": "סין", + "it_IT": "Cina", + "ja_JP": "中国", + "ko_KR": "중국", + "no_NO": "Kina", + "pl_PL": "Chiny", + "pt_BR": "", + "ru_RU": "Китай", + "sv_SE": "Kina", + "th_TH": "จีน", + "tr_TR": "Çin", + "uk_UA": "Китай", + "zh_CN": "中国", + "zh_TW": "中國" + } + }, + { + "ID": "SettingsTabSystemSystemRegionKorea", + "Translations": { + "ar_SA": "كوريا", + "de_DE": "", + "el_GR": "Κορέα", + "en_US": "Korea", + "es_ES": "Corea", + "fr_FR": "Corée", + "he_IL": "קוריאה", + "it_IT": "Corea", + "ja_JP": "韓国", + "ko_KR": "한국", + "no_NO": "Koreansk", + "pl_PL": "", + "pt_BR": "Coreia", + "ru_RU": "Корея", + "sv_SE": "", + "th_TH": "เกาหลี", + "tr_TR": "Kore", + "uk_UA": "Корея", + "zh_CN": "韩国", + "zh_TW": "韓國" + } + }, + { + "ID": "SettingsTabSystemSystemRegionTaiwan", + "Translations": { + "ar_SA": "تايوان", + "de_DE": "", + "el_GR": "Ταϊβάν", + "en_US": "Taiwan", + "es_ES": "Taiwán", + "fr_FR": "Taïwan", + "he_IL": "טייוואן", + "it_IT": "", + "ja_JP": "台湾", + "ko_KR": "대만", + "no_NO": "", + "pl_PL": "Tajwan", + "pt_BR": "", + "ru_RU": "Тайвань", + "sv_SE": "", + "th_TH": "ไต้หวัน", + "tr_TR": "Tayvan", + "uk_UA": "Тайвань", + "zh_CN": "台湾地区", + "zh_TW": "台灣 (中華民國)" + } + }, + { + "ID": "SettingsTabSystemSystemLanguage", + "Translations": { + "ar_SA": "لغة النظام:", + "de_DE": "Systemsprache:", + "el_GR": "Γλώσσα Συστήματος:", + "en_US": "System Language:", + "es_ES": "Idioma del sistema:", + "fr_FR": "Langue du système :", + "he_IL": "שפת המערכת:", + "it_IT": "Lingua del sistema:", + "ja_JP": "言語:", + "ko_KR": "시스템 언어 :", + "no_NO": "Systemspråk", + "pl_PL": "Język systemu:", + "pt_BR": "Idioma do Sistema:", + "ru_RU": "Язык системы:", + "sv_SE": "Systemspråk:", + "th_TH": "ภาษาของระบบ:", + "tr_TR": "Sistem Dili:", + "uk_UA": "Мова системи:", + "zh_CN": "系统语言:", + "zh_TW": "系統語言:" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageJapanese", + "Translations": { + "ar_SA": "اليابانية", + "de_DE": "Japanisch", + "el_GR": "Ιαπωνικά", + "en_US": "Japanese", + "es_ES": "Japonés", + "fr_FR": "Japonais", + "he_IL": "יפנית", + "it_IT": "Giapponese", + "ja_JP": "日本語", + "ko_KR": "일본어", + "no_NO": "Japansk", + "pl_PL": "Japoński", + "pt_BR": "Japonês", + "ru_RU": "Японский", + "sv_SE": "Japanska", + "th_TH": "ญี่ปุ่น", + "tr_TR": "Japonca", + "uk_UA": "Японська", + "zh_CN": "日语", + "zh_TW": "日文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageAmericanEnglish", + "Translations": { + "ar_SA": "الإنجليزية الأمريكية", + "de_DE": "Amerikanisches Englisch", + "el_GR": "Αμερικάνικα Αγγλικά", + "en_US": "American English", + "es_ES": "Inglés americano", + "fr_FR": "Anglais Américain", + "he_IL": "אנגלית אמריקאית", + "it_IT": "Inglese americano", + "ja_JP": "英語(アメリカ)", + "ko_KR": "미국 영어", + "no_NO": "Amerikansk engelsk", + "pl_PL": "Angielski (Stany Zjednoczone)", + "pt_BR": "Inglês Americano", + "ru_RU": "Английский (США)", + "sv_SE": "Amerikansk engelska", + "th_TH": "อังกฤษ (อเมริกัน)", + "tr_TR": "Amerikan İngilizcesi", + "uk_UA": "Англійська (США)", + "zh_CN": "英语(美国)", + "zh_TW": "英文 (美國)" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageFrench", + "Translations": { + "ar_SA": "الفرنسية", + "de_DE": "Französisch", + "el_GR": "Γαλλικά", + "en_US": "French", + "es_ES": "Francés", + "fr_FR": "Français", + "he_IL": "צרפתית", + "it_IT": "Francese", + "ja_JP": "フランス語", + "ko_KR": "프랑스어", + "no_NO": "Fransk", + "pl_PL": "Francuski", + "pt_BR": "Francês", + "ru_RU": "Французский", + "sv_SE": "Franska", + "th_TH": "ฝรั่งเศส", + "tr_TR": "Fransızca", + "uk_UA": "Французька", + "zh_CN": "法语", + "zh_TW": "法文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageGerman", + "Translations": { + "ar_SA": "الألمانية", + "de_DE": "Deutsch", + "el_GR": "Γερμανικά", + "en_US": "German", + "es_ES": "Alemán", + "fr_FR": "Allemand", + "he_IL": "גרמנית", + "it_IT": "Tedesco", + "ja_JP": "ドイツ語", + "ko_KR": "독일어", + "no_NO": "Tysk", + "pl_PL": "Niemiecki", + "pt_BR": "Alemão", + "ru_RU": "Немецкий", + "sv_SE": "Tyska", + "th_TH": "เยอรมัน", + "tr_TR": "Almanca", + "uk_UA": "Німецька", + "zh_CN": "德语", + "zh_TW": "德文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageItalian", + "Translations": { + "ar_SA": "الإيطالية", + "de_DE": "Italienisch", + "el_GR": "Ιταλικά", + "en_US": "Italian", + "es_ES": "Italiano", + "fr_FR": "Italien", + "he_IL": "איטלקית", + "it_IT": "Italiano", + "ja_JP": "イタリア語", + "ko_KR": "이탈리아어", + "no_NO": "Italiensk", + "pl_PL": "Włoski", + "pt_BR": "Italiano", + "ru_RU": "Итальянский", + "sv_SE": "Italienska", + "th_TH": "อิตาลี", + "tr_TR": "İtalyanca", + "uk_UA": "Італійська", + "zh_CN": "意大利语", + "zh_TW": "義大利文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageSpanish", + "Translations": { + "ar_SA": "الإسبانية", + "de_DE": "Spanisch", + "el_GR": "Ισπανικά", + "en_US": "Spanish", + "es_ES": "Español", + "fr_FR": "Espagnol", + "he_IL": "ספרדית", + "it_IT": "Spagnolo", + "ja_JP": "スペイン語", + "ko_KR": "스페인어", + "no_NO": "Spansk", + "pl_PL": "Hiszpański", + "pt_BR": "Espanhol", + "ru_RU": "Испанский", + "sv_SE": "Spanska", + "th_TH": "สเปน", + "tr_TR": "İspanyolca", + "uk_UA": "Іспанська", + "zh_CN": "西班牙语", + "zh_TW": "西班牙文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageChinese", + "Translations": { + "ar_SA": "الصينية", + "de_DE": "Chinesisch", + "el_GR": "Κινέζικα", + "en_US": "Chinese", + "es_ES": "Chino", + "fr_FR": "Chinois", + "he_IL": "סינית", + "it_IT": "Cinese", + "ja_JP": "中国語", + "ko_KR": "중국어", + "no_NO": "Kinesisk", + "pl_PL": "Chiński", + "pt_BR": "Chinês", + "ru_RU": "Китайский", + "sv_SE": "Kinesiska", + "th_TH": "จีน", + "tr_TR": "Çince", + "uk_UA": "Китайська", + "zh_CN": "中文(简体)——无效", + "zh_TW": "中文 (中國)" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageKorean", + "Translations": { + "ar_SA": "الكورية", + "de_DE": "Koreanisch", + "el_GR": "Κορεάτικα", + "en_US": "Korean", + "es_ES": "Coreano", + "fr_FR": "Coréen", + "he_IL": "קוריאנית", + "it_IT": "Coreano", + "ja_JP": "韓国語", + "ko_KR": "한국어", + "no_NO": "Koreansk", + "pl_PL": "Koreański", + "pt_BR": "Coreano", + "ru_RU": "Корейский", + "sv_SE": "Koreanska", + "th_TH": "เกาหลี", + "tr_TR": "Korece", + "uk_UA": "Корейська", + "zh_CN": "韩语", + "zh_TW": "韓文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageDutch", + "Translations": { + "ar_SA": "الهولندية", + "de_DE": "Niederländisch", + "el_GR": "Ολλανδικά", + "en_US": "Dutch", + "es_ES": "Neerlandés/Holandés", + "fr_FR": "Néerlandais", + "he_IL": "הולנדית", + "it_IT": "Olandese", + "ja_JP": "オランダ語", + "ko_KR": "네덜란드어", + "no_NO": "Nederlandsk", + "pl_PL": "Holenderski", + "pt_BR": "Holandês", + "ru_RU": "Нидерландский", + "sv_SE": "Nederländska", + "th_TH": "ดัตช์", + "tr_TR": "Flemenkçe", + "uk_UA": "Нідерландська", + "zh_CN": "荷兰语", + "zh_TW": "荷蘭文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguagePortuguese", + "Translations": { + "ar_SA": "البرتغالية", + "de_DE": "Portugiesisch", + "el_GR": "Πορτογαλικά", + "en_US": "Portuguese", + "es_ES": "Portugués", + "fr_FR": "Portugais", + "he_IL": "פורטוגזית", + "it_IT": "Portoghese", + "ja_JP": "ポルトガル語", + "ko_KR": "포르투갈어", + "no_NO": "Portugisisk", + "pl_PL": "Portugalski", + "pt_BR": "Português", + "ru_RU": "Португальский", + "sv_SE": "Portugisiska", + "th_TH": "โปรตุเกส", + "tr_TR": "Portekizce", + "uk_UA": "Португальська", + "zh_CN": "葡萄牙语", + "zh_TW": "葡萄牙文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageRussian", + "Translations": { + "ar_SA": "الروسية", + "de_DE": "Russisch", + "el_GR": "Ρώσικα", + "en_US": "Russian", + "es_ES": "Ruso", + "fr_FR": "Russe", + "he_IL": "רוסית", + "it_IT": "Russo", + "ja_JP": "ロシア語", + "ko_KR": "러시아어", + "no_NO": "Russisk", + "pl_PL": "Rosyjski", + "pt_BR": "Russo", + "ru_RU": "Русский", + "sv_SE": "Ryska", + "th_TH": "รัสเซีย", + "tr_TR": "Rusça", + "uk_UA": "Російська", + "zh_CN": "俄语", + "zh_TW": "俄文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageTaiwanese", + "Translations": { + "ar_SA": "التايوانية", + "de_DE": "Taiwanesisch", + "el_GR": "Ταϊβανέζικα", + "en_US": "Taiwanese", + "es_ES": "Taiwanés", + "fr_FR": "Taïwanais", + "he_IL": "טייוואנית", + "it_IT": "", + "ja_JP": "台湾語", + "ko_KR": "대만어", + "no_NO": "Taiwansk", + "pl_PL": "Tajwański", + "pt_BR": "Taiwanês", + "ru_RU": "Тайваньский", + "sv_SE": "Taiwanesiska", + "th_TH": "จีนตัวเต็ม (ไต้หวัน)", + "tr_TR": "Tayvanca", + "uk_UA": "Тайванська", + "zh_CN": "中文(繁体)——无效", + "zh_TW": "中文 (台灣)" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageBritishEnglish", + "Translations": { + "ar_SA": "الإنجليزية البريطانية", + "de_DE": "Britisches Englisch", + "el_GR": "Βρετανικά Αγγλικά", + "en_US": "British English", + "es_ES": "Inglés británico", + "fr_FR": "Anglais Britannique ", + "he_IL": "אנגלית בריטית", + "it_IT": "Inglese britannico", + "ja_JP": "英語(イギリス)", + "ko_KR": "영국 영어", + "no_NO": "Britisk engelsk", + "pl_PL": "Angielski (Wielka Brytania)", + "pt_BR": "Inglês Britânico", + "ru_RU": "Английский (Великобритания)", + "sv_SE": "Brittisk engelska", + "th_TH": "อังกฤษ (บริติช)", + "tr_TR": "İngiliz İngilizcesi", + "uk_UA": "Англійська (Великобританія)", + "zh_CN": "英语(英国)", + "zh_TW": "英文 (英國)" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageCanadianFrench", + "Translations": { + "ar_SA": "الفرنسية الكندية", + "de_DE": "Kanadisches Französisch", + "el_GR": "Καναδικά Γαλλικά", + "en_US": "Canadian French", + "es_ES": "Francés canadiense", + "fr_FR": "Français Canadien", + "he_IL": "צרפתית קנדית", + "it_IT": "Francese canadese", + "ja_JP": "フランス語(カナダ)", + "ko_KR": "캐나다 프랑스어", + "no_NO": "Canadisk Fransk", + "pl_PL": "Kanadyjski Francuski", + "pt_BR": "Francês Canadense", + "ru_RU": "Французский (Канада)", + "sv_SE": "Kanadensisk franska", + "th_TH": "ฝรั่งเศส (แคนาดา)", + "tr_TR": "Kanada Fransızcası", + "uk_UA": "Французька (Канада)", + "zh_CN": "加拿大法语", + "zh_TW": "加拿大法文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageLatinAmericanSpanish", + "Translations": { + "ar_SA": "إسبانية أمريكا اللاتينية", + "de_DE": "Lateinamerikanisches Spanisch", + "el_GR": "Λατινοαμερικάνικα Ισπανικά", + "en_US": "Latin American Spanish", + "es_ES": "Español latinoamericano", + "fr_FR": "Espagnol Latino-Américain", + "he_IL": "ספרדית אמריקה הלטינית", + "it_IT": "Spagnolo latino americano", + "ja_JP": "スペイン語(ラテンアメリカ)", + "ko_KR": "남미 스페인어", + "no_NO": "Latinamerikansk spansk", + "pl_PL": "Hiszpański (Ameryka Łacińska)", + "pt_BR": "Espanhol Latino", + "ru_RU": "Испанский (Латинская Америка)", + "sv_SE": "Latinamerikansk spanska", + "th_TH": "สเปน (ลาตินอเมริกา)", + "tr_TR": "Latin Amerika İspanyolcası", + "uk_UA": "Іспанська (Латиноамериканська)", + "zh_CN": "拉美西班牙语", + "zh_TW": "美洲西班牙文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageSimplifiedChinese", + "Translations": { + "ar_SA": "الصينية المبسطة", + "de_DE": "Vereinfachtes Chinesisch", + "el_GR": "Απλοποιημένα Κινέζικα", + "en_US": "Simplified Chinese", + "es_ES": "Chino simplificado", + "fr_FR": "Chinois simplifié", + "he_IL": "סינית פשוטה", + "it_IT": "Cinese semplificato", + "ja_JP": "中国語", + "ko_KR": "중국어 간체", + "no_NO": "Forenklet kinesisk", + "pl_PL": "Chiński (Uproszczony)", + "pt_BR": "Chinês Simplificado", + "ru_RU": "Китайский (упрощённый)", + "sv_SE": "Förenklad kinesiska", + "th_TH": "จีน (ตัวย่อ)", + "tr_TR": "Basitleştirilmiş Çince", + "uk_UA": "Спрощена китайська", + "zh_CN": "简体中文(推荐)", + "zh_TW": "簡體中文" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageTraditionalChinese", + "Translations": { + "ar_SA": "الصينية التقليدية", + "de_DE": "Traditionelles Chinesisch", + "el_GR": "Παραδοσιακά Κινεζικά", + "en_US": "Traditional Chinese", + "es_ES": "Chino tradicional", + "fr_FR": "Chinois traditionnel", + "he_IL": "סינית מסורתית", + "it_IT": "Cinese tradizionale", + "ja_JP": "台湾語", + "ko_KR": "중국어 번체", + "no_NO": "Tradisjonell Kinesisk", + "pl_PL": "Chiński (Tradycyjny)", + "pt_BR": "Chinês Tradicional", + "ru_RU": "Китайский (традиционный)", + "sv_SE": "Traditionell kinesiska", + "th_TH": "จีน (ดั้งเดิม)", + "tr_TR": "Geleneksel Çince", + "uk_UA": "Традиційна китайська", + "zh_CN": "繁体中文(推荐)", + "zh_TW": "正體中文 (建議)" + } + }, + { + "ID": "SettingsTabSystemSystemTimeZone", + "Translations": { + "ar_SA": "النطاق الزمني للنظام:", + "de_DE": "System-Zeitzone:", + "el_GR": "Ζώνη Ώρας Συστήματος:", + "en_US": "System Time Zone:", + "es_ES": "Zona horaria del sistema:", + "fr_FR": "Fuseau horaire du système\u00A0:", + "he_IL": "אזור זמן מערכת:", + "it_IT": "Fuso orario del sistema:", + "ja_JP": "タイムゾーン:", + "ko_KR": "시스템 시간대 :", + "no_NO": "System Tidssone:", + "pl_PL": "Strefa czasowa systemu:", + "pt_BR": "Fuso Horário do Sistema:", + "ru_RU": "Часовой пояс системы:", + "sv_SE": "Systemets tidszon:", + "th_TH": "เขตเวลาของระบบ:", + "tr_TR": "Sistem Saat Dilimi:", + "uk_UA": "Часовий пояс системи:", + "zh_CN": "系统时区:", + "zh_TW": "系統時區:" + } + }, + { + "ID": "SettingsTabSystemSystemTime", + "Translations": { + "ar_SA": "توقيت النظام:", + "de_DE": "Systemzeit:", + "el_GR": "Ώρα Συστήματος:", + "en_US": "System Time:", + "es_ES": "Hora del sistema:", + "fr_FR": "Heure du système :", + "he_IL": "זמן מערכת:", + "it_IT": "Data e ora del sistema:", + "ja_JP": "時刻:", + "ko_KR": "시스템 시간 :", + "no_NO": "System tid:", + "pl_PL": "Czas systemu:", + "pt_BR": "Data e Hora do Sistema:", + "ru_RU": "Системное время:", + "sv_SE": "Systemtid:", + "th_TH": "เวลาของระบบ:", + "tr_TR": "Sistem Saati:", + "uk_UA": "Час системи:", + "zh_CN": "系统时钟:", + "zh_TW": "系統時鐘:" + } + }, + { + "ID": "SettingsTabSystemSystemTimeMatch", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Match System Time", + "es_ES": "", + "fr_FR": "Synchroniser avec l’heure du système", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "매치 시스템 시간", + "no_NO": "Match systemtid", + "pl_PL": "", + "pt_BR": "Sincronizar com o Sistema PC", + "ru_RU": "Соответствовать времени в системе", + "sv_SE": "Matcha systemtid", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Синхронізувати з системним годинником", + "zh_CN": "与系统时间同步", + "zh_TW": "與系統時間同步" + } + }, + { + "ID": "SettingsTabSystemEnablePptc", + "Translations": { + "ar_SA": "PPTC (ذاكرة التخزين المؤقت للترجمة المستمرة)", + "de_DE": "", + "el_GR": "Ενεργοποίηση PPTC (Profiled Persistent Translation Cache)", + "en_US": "PPTC (Profiled Persistent Translation Cache)", + "es_ES": "PPTC (Cache de Traducción de Perfil Persistente)", + "fr_FR": "Activer le PPTC (Profiled Persistent Translation Cache)", + "he_IL": "", + "it_IT": "Attiva PPTC (Profiled Persistent Translation Cache)", + "ja_JP": "", + "ko_KR": "PPTC(프로파일된 영구 번역 캐시)", + "no_NO": "PPTC (Profilert Vedvarende Oversettelseshurtigbuffer)", + "pl_PL": "PPTC (Profilowana pamięć podręczna trwałych łłumaczeń)", + "pt_BR": "PPTC (Cache de Tradução Persistente de Perfil)", + "ru_RU": "Использовать PPTC (Profiled Persistent Translation Cache)", + "sv_SE": "PPTC (Profilerad bestående översättningscache)", + "th_TH": "PPTC (แคชโปรไฟล์การแปลแบบถาวร)", + "tr_TR": "PPTC (Profilli Sürekli Çeviri Önbelleği)", + "uk_UA": "PPTC (профільований постійний кеш перекладу)", + "zh_CN": "开启 PPTC 缓存", + "zh_TW": "PPTC (剖析式持久轉譯快取, Profiled Persistent Translation Cache)" + } + }, + { + "ID": "SettingsTabSystemEnableLowPowerPptc", + "Translations": { + "ar_SA": "Low-power PPTC", + "de_DE": "Kleinleistungs-PPTC", + "el_GR": "Low-power PPTC", + "en_US": "Low-power PPTC cache", + "es_ES": "Cache PPTC de bajo consumo", + "fr_FR": "Cache PPTC de faible puissance", + "he_IL": "Low-power PPTC", + "it_IT": "Caricamento PPTC a basso consumo energetico", + "ja_JP": "Low-power PPTC", + "ko_KR": "저전력 PPTC 캐시", + "no_NO": "PPTC med lavt strømforbruk", + "pl_PL": "Low-power PPTC", + "pt_BR": "Cache PPTC com Baixo Consumo de Energia", + "ru_RU": "PPTC с низким электропотреблением", + "sv_SE": "PPTC med låg strömförbrukning", + "th_TH": "PPTC แบบพลังงานตํ่า", + "tr_TR": "Low-power PPTC", + "uk_UA": "Low-power PPTC", + "zh_CN": "低功耗 PPTC 加载", + "zh_TW": "低功耗 PPTC" + } + }, + { + "ID": "SettingsTabSystemTurboMultiplier", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Turbo Mode multiplier:", + "es_ES": "", + "fr_FR": "Multiplicateur du Mode Turbo :", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "터보 모드 배수 :", + "no_NO": "Multiplikator i turbomodus:", + "pl_PL": "", + "pt_BR": "Multiplicador do Modo Turbo", + "ru_RU": "", + "sv_SE": "Multiplikator för turboläge:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Множник Турборежиму:", + "zh_CN": "涡轮模式倍数:", + "zh_TW": "加速模式倍數:" + } + }, + { + "ID": "SettingsTabSystemTurboMultiplierValueToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "The Turbo mode multiplier target value.\n\nLeave at 200 if unsure.", + "es_ES": "", + "fr_FR": "La valeur souhaitée du multiplicateur du mode Turbo.\n\nLaissez à 200 si vous n'êtes pas sûr.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "터보 모드 배수 목표 값입니다.\n\n모르면 200으로 두세요.", + "no_NO": "Målverdien for multiplikatoren i turbomodus. \n\nLa syå på 200 hvis du er usikker.", + "pl_PL": "", + "pt_BR": "O valor do Multiplicador do Modo Turbo. Deixe em 200 se não tiver certeza.", + "ru_RU": "", + "sv_SE": "Målvärdet för multiplikatorn i turboläget. \n\nLämna den på 200 om du är osäker.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Цільове значення коефіцієнта Турборежиму.\n\nЗалиште 200, якщо не впевнені", + "zh_CN": "涡轮模式倍数的目标值。\n\n如果不确定请保留为 200。", + "zh_TW": "加速模式倍數的數值。\n\n如果不確定,請保持數值為 200。" + } + }, + { + "ID": "SettingsTabSystemTurboMultiplierToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Turbo mode is an emulator feature which effectively causes speed up or slow down when a game is not frame-rate sensitive.\nYou can toggle this feature in-game with a hotkey, configurable in Ryujinx Keyboard Hotkeys settings.\n\nLeave at 200 if unsure.", + "es_ES": "", + "fr_FR": "Le Mode Turbo est une fonctionnalité de l’émulateur qui permet d’accélérer ou de ralentir le jeu lorsque celui-ci n’est pas sensible au taux de rafraîchissement.\nVous pouvez activer ou désactiver cette fonction en jeu via un raccourci clavier, configurable dans les paramètres des raccourcis clavier de Ryujinx.\n\nLaissez à 200 si vous n’êtes pas sûr.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "터보 모드는 게임이 프레임 속도에 민감하지 않을 때 효과적으로 속도를 높이거나 낮추는 에뮬레이터 기능입니다.\n이 기능은 Ryujinx 키보드 단축키 설정에서 구성할 수 있는 단축키를 사용하여 게임 내에서 전환할 수 있습니다.\n\n모르면 200으로 두세요.", + "no_NO": "Turbo-modus er en emulatorfunksjon som effektivt øker eller senker hastigheten når et spill ikke er følsom for bildefrekvens.\nDu kan slå på denne funksjonen i spillet med en hurtigtast, som kan konfigureres i Ryujinx Keyboard Hotkeys-innstillingene.\n\nLa den stå på 200 hvis du er usikker.", + "pl_PL": "", + "pt_BR": "O Modo Turbo é um recurso do emulador que efetivamente aumenta ou dimimui a velocidade de um jogo quando o mesmo não é sensivel à taxa de quadros. \nVocê pode ativar esse recurso dentro do jogo com uma tecla de atalho, configurável nas Configurações de Teclas de Atalho do Ryujinx. \n\nDeixe em 200 se não tiver certeza.", + "ru_RU": "", + "sv_SE": "Turboläget är en emulatorfunktion som effektivt ökar eller sänker hastigheten när ett spel inte är känsligt för bildfrekvens.\nDu kan växla denna funktion i spelet med en snabbtangent, konfigurerbar i Ryujinx inställningar för snabbtangenter.\n\nLämna den på 200 om du är osäker.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Турборежим (Turbo mode) – функція емулятора, що ефективно прискорює або сповільнює гру, якщо та не чутлива до частоти кадрів. Цю функцію можна ввімкнути/вимкнути безпосередньо під час гри за допомогою гарячої клавіші, яку можна прив'язати в меню \"Гарячі клавіші\" в налаштуваннях.", + "zh_CN": "涡轮模式是一种模拟器功能当游戏对帧率不敏感时它可以有效地导致加速或降速。\n您可以在游戏中使用热键切换此功能,它可以在 Ryujinx 的键盘热键设置进行设置。\n\n如果不确定则保留为 200。", + "zh_TW": "加速模式是一種模擬器功能,其目的為加速或減速對不是以影格速率為速度 (frame-rate sensitive) 的遊戲。\n你可以在遊戲中以快捷鍵切換此功能,而快捷鍵可於 Ryujinx 鍵盤快捷鍵中設置。\n\n如果不確定,請保持數值為 200。" + } + }, + { + "ID": "SettingsTabSystemEnableFsIntegrityChecks", + "Translations": { + "ar_SA": "التحقق من سلامة نظام الملفات", + "de_DE": "FS Integritätsprüfung", + "el_GR": "Ενεργοποίηση Ελέγχων Ακεραιότητας FS", + "en_US": "FS Integrity Checks", + "es_ES": "Comprobar integridad de los archivos", + "fr_FR": "Vérification de l’intégrité du système de fichiers (FS)", + "he_IL": "FS בדיקות תקינות", + "it_IT": "Attiva controlli d'integrità FS", + "ja_JP": "ファイルシステム整合性チェック", + "ko_KR": "파일 시스템 무결성 검사", + "no_NO": "FS Integritetssjekk", + "pl_PL": "Sprawdzanie integralności systemu plików", + "pt_BR": "Verificações de Integridade do FS", + "ru_RU": "Проверка целостности файловой системы", + "sv_SE": "Integritetskontroller av filsystem", + "th_TH": "ตรวจสอบความถูกต้องของ FS", + "tr_TR": "FS Bütünlük Kontrolleri", + "uk_UA": "Перевірка цілісності FS", + "zh_CN": "启用文件系统完整性检查", + "zh_TW": "啟用檔案系統完整性檢查" + } + }, + { + "ID": "SettingsTabSystemAudioBackend", + "Translations": { + "ar_SA": "خلفية الصوت:", + "de_DE": "Audio-Backend:", + "el_GR": "Backend Ήχου:", + "en_US": "Audio Backend:", + "es_ES": "Motor de audio:", + "fr_FR": "Bibliothèque Audio :", + "he_IL": "אחראי שמע:", + "it_IT": "Backend audio:", + "ja_JP": "音声バックエンド:", + "ko_KR": "음향 후단부 :", + "no_NO": "Lyd Backend:", + "pl_PL": "Backend Dżwięku:", + "pt_BR": "Módulo de Áudio:", + "ru_RU": "Аудио бэкенд:", + "sv_SE": "Ljudbakände:", + "th_TH": "ระบบเสียงเบื้องหลัง:", + "tr_TR": "Ses Motoru:", + "uk_UA": "Аудіосистема:", + "zh_CN": "音频处理引擎:", + "zh_TW": "音效後端:" + } + }, + { + "ID": "SettingsTabSystemAudioBackendDummy", + "Translations": { + "ar_SA": "زائف", + "de_DE": "Ohne Funktion", + "el_GR": "Απενεργοποιημένο", + "en_US": "Dummy", + "es_ES": "Vacío", + "fr_FR": "Désactivée", + "he_IL": "גולם", + "it_IT": "", + "ja_JP": "ダミー", + "ko_KR": "더미", + "no_NO": "", + "pl_PL": "Atrapa", + "pt_BR": "Nenhum", + "ru_RU": "Без звука", + "sv_SE": "", + "th_TH": "", + "tr_TR": "Yapay", + "uk_UA": "Вимкнено", + "zh_CN": "无", + "zh_TW": "虛設 (Dummy)" + } + }, + { + "ID": "SettingsTabSystemAudioBackendOpenAL", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "OpenAL", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabSystemAudioBackendSoundIO", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "SoundIO", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Lyd Inn/Ut", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabSystemAudioBackendSDL2", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "SDL2", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabSystemHacks", + "Translations": { + "ar_SA": "هاكات", + "de_DE": "", + "el_GR": "Μικροδιορθώσεις", + "en_US": "Hacks", + "es_ES": "", + "fr_FR": "", + "he_IL": "האצות", + "it_IT": "Espedienti", + "ja_JP": "ハック", + "ko_KR": "핵", + "no_NO": "", + "pl_PL": "Hacki", + "pt_BR": "Trapaças", + "ru_RU": "Хаки", + "sv_SE": "Hack", + "th_TH": "แฮ็ก", + "tr_TR": "Hack'ler", + "uk_UA": "Хитрощі", + "zh_CN": "修改", + "zh_TW": "補釘修正" + } + }, + { + "ID": "SettingsTabSystemHacksNote", + "Translations": { + "ar_SA": "قد يتسبب في عدم الاستقرار", + "de_DE": " (Kann Fehler verursachen)", + "el_GR": " (Μπορεί να προκαλέσουν αστάθεια)", + "en_US": "May cause instability", + "es_ES": " (Pueden causar inestabilidad)", + "fr_FR": "Peut causer des instabilités", + "he_IL": "עלול לגרום לאי יציבות", + "it_IT": "Possono causare instabilità", + "ja_JP": " (挙動が不安定になる可能性があります)", + "ko_KR": "불안정성을 유발할 수 있음", + "no_NO": "Kan forårsake ustabilitet", + "pl_PL": " (mogą powodować niestabilność)", + "pt_BR": "Pode causar instabilidade", + "ru_RU": "Возможна нестабильная работа", + "sv_SE": "Kan orsaka instabilitet", + "th_TH": "อาจทำให้เกิดข้อผิดพลาดได้", + "tr_TR": " (dengesizlik oluşturabilir)", + "uk_UA": " (може викликати нестабільність)", + "zh_CN": "会导致模拟器不稳定", + "zh_TW": "可能導致模擬器不穩定" + } + }, + { + "ID": "SettingsTabSystemDramSize", + "Translations": { + "ar_SA": "استخدام تخطيط الذاكرة البديل (المطورين)", + "de_DE": "DRAM Größe:", + "el_GR": "Μέγεθος DRAM:", + "en_US": "DRAM size:", + "es_ES": "Tamaño DRAM:", + "fr_FR": "Taille de la DRAM :", + "he_IL": "השתמש בפריסת זיכרון חלופית (נועד למפתחים)", + "it_IT": "Dimensione memoria DRAM:", + "ja_JP": "DRAMサイズ:", + "ko_KR": "DRAM 크기 :", + "no_NO": "DRAM Mengde", + "pl_PL": "Użyj alternatywnego układu pamięci (Deweloperzy)", + "pt_BR": "Tamanho da DRAM:", + "ru_RU": "Использовать альтернативный макет памяти (для разработчиков)", + "sv_SE": "DRAM-storlek:", + "th_TH": "ใช้หน่วยความจำสำรอง (โหมดนักพัฒนา)", + "tr_TR": "Alternatif bellek düzeni kullan (Geliştirici)", + "uk_UA": "Використовувати альтернативне розташування пам'яті (для розробників)", + "zh_CN": "使用开发机的内存布局(开发人员使用)", + "zh_TW": "使用替代的記憶體配置 (開發者專用)" + } + }, + { + "ID": "SettingsTabSystemDramSize4GiB", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "4GiB", + "es_ES": "", + "fr_FR": "4GiO", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "4GB", + "no_NO": "4GB", + "pl_PL": "", + "pt_BR": "4GB", + "ru_RU": "4ГиБ", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "4Гб", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabSystemDramSize6GiB", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "6GiB", + "es_ES": "", + "fr_FR": "6GiO", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "6GB", + "no_NO": "6GB", + "pl_PL": "", + "pt_BR": "6GB", + "ru_RU": "6ГиБ", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "6Гб", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabSystemDramSize8GiB", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "8GiB", + "es_ES": "", + "fr_FR": "8GiO", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "8GB", + "no_NO": "8GB", + "pl_PL": "", + "pt_BR": "8GB", + "ru_RU": "8ГиБ", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "8Гб", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabSystemDramSize12GiB", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "12GiB", + "es_ES": "", + "fr_FR": "12GiO", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "12GB", + "no_NO": "12GB", + "pl_PL": "", + "pt_BR": "12GB", + "ru_RU": "12ГиБ", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "12Гб", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabSystemIgnoreMissingServices", + "Translations": { + "ar_SA": "تجاهل الخدمات المفقودة", + "de_DE": "Ignoriere fehlende Dienste", + "el_GR": "Αγνόηση υπηρεσιών που λείπουν", + "en_US": "Ignore Missing Services", + "es_ES": "Ignorar servicios no implementados", + "fr_FR": "Ignorer les services manquants", + "he_IL": "התעלם משירותים חסרים", + "it_IT": "Ignora servizi mancanti", + "ja_JP": "未実装サービスを無視する", + "ko_KR": "누락된 서비스 무시", + "no_NO": "Ignorer manglende tjenester", + "pl_PL": "Ignoruj Brakujące Usługi", + "pt_BR": "Ignorar Serviços Ausentes", + "ru_RU": "Игнорировать отсутствующие службы", + "sv_SE": "Ignorera saknade tjänster", + "th_TH": "เมินเฉยบริการที่หายไป", + "tr_TR": "Eksik Servisleri Görmezden Gel", + "uk_UA": "Ігнорувати відсутні служби", + "zh_CN": "忽略缺失的服务", + "zh_TW": "忽略缺少的模擬器功能" + } + }, + { + "ID": "SettingsTabSystemIgnoreControllerApplet", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Ignore Controller Applet", + "es_ES": "", + "fr_FR": "Ignorer l’applet de contrôleur", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "컨트롤러 애플릿 무시", + "no_NO": "Ignorer Kontroller-applet", + "pl_PL": "", + "pt_BR": "Ignorar Applet do Controlador", + "ru_RU": "Игнорировать апплет контроллера", + "sv_SE": "Ignorera kontroller-applet", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Ігнорувати Аплет Контролера", + "zh_CN": "忽略控制器小程序", + "zh_TW": "忽略控制器小程式" + } + }, + { + "ID": "SettingsTabSystemSkipUserProfilesManager", + "Translations": { + "ar_SA": "تخطي مربع حوار 'إدارة الملفات الشخصية للمستخدم'", + "de_DE": "Überspringen des Dialogs 'Benutzerprofile verwalten'", + "el_GR": "Παράκαμψη διαλόγου 'Διαχείριση Προφίλ _Χρηστών'", + "en_US": "Skip dialog 'Manage User Profiles'", + "es_ES": "Omitir el diálogo 'Gestionar perfiles de usuario'", + "fr_FR": "Ignorer la boîte de dialogue « Gérer les profils utilisateur »", + "he_IL": "דילוג על הדיאלוג 'נהל פרופילי משתמש'", + "it_IT": "Salta la finestra di dialogo 'Gestisci i profili utente'", + "ja_JP": "「ユーザプロファイルを管理」ダイアログをスキップ", + "ko_KR": "'사용자 프로필 관리' 대화 상자 건너뛰기", + "no_NO": "Hopp over dialogen 'Administrere Brukerprofiler'", + "pl_PL": "Pomiń okno dialogowe 'Zarządzaj profilami użytkowników'", + "pt_BR": "Ignorar a caixa de diálogo 'Gerenciar Perfis de Usuário'", + "ru_RU": "Пропустить диалог 'Менеджер учётных записей'", + "sv_SE": "Hoppa över dialogen 'Hantera användarprofiler'", + "th_TH": "ข้ามหน้าต่างโต้ตอบ 'จัดการโปรไฟล์ผู้ใช้งาน'", + "tr_TR": "'Kullanıcı Profillerini Yönet' iletişim kutusunu atla", + "uk_UA": "Пропустити діалог 'Керувати профілями користувачів'", + "zh_CN": "跳过 “管理用户账户” 对话框", + "zh_TW": "略過對話框「管理使用者設定檔」" + } + }, + { + "ID": "SettingsTabGraphics", + "Translations": { + "ar_SA": "الرسومات", + "de_DE": "Grafik", + "el_GR": "Γραφικά", + "en_US": "Graphics", + "es_ES": "Gráficos", + "fr_FR": "Graphismes", + "he_IL": "גרפיקה", + "it_IT": "Grafica", + "ja_JP": "グラフィックス", + "ko_KR": "그래픽", + "no_NO": "Grafikk", + "pl_PL": "Grafika", + "pt_BR": "Gráficos", + "ru_RU": "Графика", + "sv_SE": "Grafik", + "th_TH": "กราฟฟิก", + "tr_TR": "Grafikler", + "uk_UA": "Графіка", + "zh_CN": "图形", + "zh_TW": "圖形" + } + }, + { + "ID": "SettingsTabGraphicsAPI", + "Translations": { + "ar_SA": "API الرسومات و تحسين", + "de_DE": "Grafik-API & Optimierung", + "el_GR": "API Γραφικά & Βελτιστοποίηση", + "en_US": "Graphics API & Optimization", + "es_ES": "API de gráficos & Optimización", + "fr_FR": "API Graphique & Optimisation", + "he_IL": "ממשק גראפי & אופטימיזציה", + "it_IT": "API grafica & Ottimizzazione", + "ja_JP": "グラフィックスAPI&最適化", + "ko_KR": "그래픽 API & 최적화", + "no_NO": "Grafikk-API & Optimalisering", + "pl_PL": "Graficzne API & Optymalizacja", + "pt_BR": "API gráfica & Otimização", + "ru_RU": "Графический API & Оптимизация", + "sv_SE": "Grafik-API & Optimering", + "th_TH": "API กราฟฟิก & การเพิ่มประสิทธิภาพ", + "tr_TR": "Grafikler API & Optimizasyon", + "uk_UA": "Графічний API & Оптимізація", + "zh_CN": "图形 API & 优化", + "zh_TW": "圖形 API & 優化" + } + }, + { + "ID": "SettingsTabGraphicsEnableShaderCache", + "Translations": { + "ar_SA": "تفعيل ذاكرة المظللات المؤقتة", + "de_DE": "Shader-Cache aktivieren", + "el_GR": "Ενεργοποίηση Προσωρινής Μνήμης Shader", + "en_US": "Enable Shader Cache", + "es_ES": "Habilitar caché de sombreadores", + "fr_FR": "Activer le cache des shaders", + "he_IL": "הפעל מטמון הצללות", + "it_IT": "Attiva la cache degli shader", + "ja_JP": "シェーダーキャッシュを有効にする", + "ko_KR": "셰이더 캐시 활성화", + "no_NO": "Aktiver Shader Cachen", + "pl_PL": "Włącz pamięć podręczną cieni", + "pt_BR": "Habilitar Cache de Shader", + "ru_RU": "Кэшировать шейдеры", + "sv_SE": "Aktivera Shader Cache", + "th_TH": "เปิดใช้งาน แคชแสงเงา", + "tr_TR": "Shader Önbelleğini Etkinleştir", + "uk_UA": "Увімкнути кеш шейдерів", + "zh_CN": "启用着色器缓存", + "zh_TW": "啟用著色器快取" + } + }, + { + "ID": "SettingsTabGraphicsAnisotropicFiltering", + "Translations": { + "ar_SA": "تصفية:", + "de_DE": "Anisotrope Filterung:", + "el_GR": "Ανισότροπο Φιλτράρισμα:", + "en_US": "Anisotropic Filtering:", + "es_ES": "Filtro anisotrópico:", + "fr_FR": "Filtrage anisotrope :", + "he_IL": "סינון אניסוטרופי:", + "it_IT": "Filtro anisotropico:", + "ja_JP": "異方性フィルタリング:", + "ko_KR": "이방성 필터링 :", + "no_NO": "Anisotropisk filtrering:", + "pl_PL": "Filtrowanie anizotropowe:", + "pt_BR": "Filtro Anisotrópico:", + "ru_RU": "Анизотропная фильтрация:", + "sv_SE": "Anisotropisk filtrering:", + "th_TH": "ตัวกรองแบบ Anisotropic:", + "tr_TR": "Eşyönsüz Doku Süzmesi:", + "uk_UA": "Анізотропна фільтрація:", + "zh_CN": "各向异性过滤:", + "zh_TW": "各向異性過濾:" + } + }, + { + "ID": "SettingsTabGraphicsAnisotropicFilteringAuto", + "Translations": { + "ar_SA": "تلقائي", + "de_DE": "", + "el_GR": "Αυτόματο", + "en_US": "Auto", + "es_ES": "Automático", + "fr_FR": "", + "he_IL": "אוטומטי", + "it_IT": "Automatico", + "ja_JP": "自動", + "ko_KR": "자동", + "no_NO": "Automatisk", + "pl_PL": "Automatyczne", + "pt_BR": "Automático", + "ru_RU": "Автоматически", + "sv_SE": "Automatiskt", + "th_TH": "อัตโนมัติ", + "tr_TR": "Otomatik", + "uk_UA": "Авто", + "zh_CN": "自动", + "zh_TW": "自動" + } + }, + { + "ID": "SettingsTabGraphicsAnisotropicFiltering2x", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "2x", + "es_ES": "x2", + "fr_FR": "x2", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "2배", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "2 倍" + } + }, + { + "ID": "SettingsTabGraphicsAnisotropicFiltering4x", + "Translations": { + "ar_SA": "4×", + "de_DE": "", + "el_GR": "", + "en_US": "4x", + "es_ES": "x4", + "fr_FR": "x4", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "4배", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "4 倍" + } + }, + { + "ID": "SettingsTabGraphicsAnisotropicFiltering8x", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "8x", + "es_ES": "x8", + "fr_FR": "x8", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "8배", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "8 倍" + } + }, + { + "ID": "SettingsTabGraphicsAnisotropicFiltering16x", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "16x", + "es_ES": "x16", + "fr_FR": "x16", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "16배", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "16 倍" + } + }, + { + "ID": "SettingsTabGraphicsResolutionScale", + "Translations": { + "ar_SA": "مقياس الدقة", + "de_DE": "Auflösungsskalierung:", + "el_GR": "Κλίμακα Ανάλυσης:", + "en_US": "Resolution Scale:", + "es_ES": "Escala de resolución:", + "fr_FR": "Échelle de résolution :", + "he_IL": "קנה מידה של רזולוציה:", + "it_IT": "Scala della risoluzione:", + "ja_JP": "解像度:", + "ko_KR": "해상도 배율 :", + "no_NO": "Oppløsnings skala:", + "pl_PL": "Skalowanie rozdzielczości:", + "pt_BR": "Escala de Resolução:", + "ru_RU": "Масштабирование:", + "sv_SE": "Upplösningsskalning:", + "th_TH": "อัตราส่วนความละเอียด:", + "tr_TR": "Çözünürlük Ölçeği:", + "uk_UA": "Роздільна здатність:", + "zh_CN": "分辨率缩放:", + "zh_TW": "解析度比例:" + } + }, + { + "ID": "SettingsTabGraphicsResolutionScaleCustom", + "Translations": { + "ar_SA": "مخصص (لا ينصح به)", + "de_DE": "Benutzerdefiniert (nicht empfohlen)", + "el_GR": "Προσαρμοσμένο (Δεν συνιστάται)", + "en_US": "Custom (Not recommended)", + "es_ES": "Personalizada (no recomendado)", + "fr_FR": "Personnalisée (non recommandée)", + "he_IL": "מותאם אישית (לא מומלץ)", + "it_IT": "Personalizzata (Non raccomandata)", + "ja_JP": "カスタム (非推奨)", + "ko_KR": "사용자 정의(권장하지 않음)", + "no_NO": "Egendefinert (anbefales ikke)", + "pl_PL": "Niestandardowa (Niezalecane)", + "pt_BR": "Customizada (Não recomendado)", + "ru_RU": "Пользовательское (не рекомендуется)", + "sv_SE": "Anpassad (rekommenderas inte)", + "th_TH": "กำหนดเอง (ไม่แนะนำ)", + "tr_TR": "Özel (Tavsiye Edilmez)", + "uk_UA": "Користувацька (не рекомендовано)", + "zh_CN": "自定义(不推荐)", + "zh_TW": "自訂 (不建議使用)" + } + }, + { + "ID": "SettingsTabGraphicsResolutionScaleNative", + "Translations": { + "ar_SA": "الأصل ‫(720p/1080p)", + "de_DE": "Nativ (720p/1080p)", + "el_GR": "Εγγενής (720p/1080p)", + "en_US": "Native (720p/1080p)", + "es_ES": "Nativa (720p/1080p)", + "fr_FR": "Natif (720p/1080p)", + "he_IL": "מקורי (720p/1080p)", + "it_IT": "Nativa (720p/1080p)", + "ja_JP": "ネイティブ (720p/1080p)", + "ko_KR": "원본(720p/1080p)", + "no_NO": "Naturlig (720p/1080p)", + "pl_PL": "Natywna (720p/1080p)", + "pt_BR": "Nativa (720p/1080p)", + "ru_RU": "Нативное (720p/1080p)", + "sv_SE": "Inbyggd (720p/1080p)", + "th_TH": "พื้นฐานระบบ (720p/1080p)", + "tr_TR": "Yerel (720p/1080p)", + "uk_UA": "Стандартний (720p/1080p)", + "zh_CN": "原生 (720p/1080p)", + "zh_TW": "原生 (720p/1080p)" + } + }, + { + "ID": "SettingsTabGraphicsResolutionScale2x", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "2x (1440p/2160p)", + "es_ES": "x2 (1440p/2160p)", + "fr_FR": "x2 (1440p/2160p)", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "2배(1440p/2160p)", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "2 倍 (1440p/2160p)", + "zh_TW": "2 倍 (1440p/2160p)" + } + }, + { + "ID": "SettingsTabGraphicsResolutionScale3x", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "3x (2160p/3240p)", + "es_ES": "x3 (2160p/3240p)", + "fr_FR": "x3 (2160p/3240p)", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "3배(2160p/3240p)", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "3 倍 (2160p/3240p)", + "zh_TW": "3 倍 (2160p/3240p)" + } + }, + { + "ID": "SettingsTabGraphicsResolutionScale4x", + "Translations": { + "ar_SA": "4x (2880p/4320p) (لا ينصح به)", + "de_DE": "4x (2880p/4320p) (Nicht empfohlen)", + "el_GR": "", + "en_US": "4x (2880p/4320p) (Not recommended)", + "es_ES": "4x (2880p/4320p) (no recomendado)", + "fr_FR": "x4 (2880p/4320p) (non recommandé)", + "he_IL": "4x (2880p/4320p) (לא מומלץ)", + "it_IT": "4x (2880p/4320p) (Non consigliato)", + "ja_JP": "4x (2880p/4320p) (非推奨)", + "ko_KR": "4배(2880p/4320p) (권장하지 않음)", + "no_NO": "4x (2880p/4320p) (anbefales ikke)", + "pl_PL": "4x (2880p/4320p) (niezalecane)", + "pt_BR": "4x (2880p/4320p) (Não recomendado)", + "ru_RU": "4x (2880p/4320p) (не рекомендуется)", + "sv_SE": "4x (2880p/4320p) (rekommenderas inte)", + "th_TH": "4x (2880p/4320p) (ไม่แนะนำ)", + "tr_TR": "4x (2880p/4320p) (Tavsiye Edilmez)", + "uk_UA": "4x (2880p/4320p) (Не рекомендується)", + "zh_CN": "4 倍 (2880p/4320p) (不推荐)", + "zh_TW": "4 倍 (2880p/4320p) (不建議使用)" + } + }, + { + "ID": "SettingsTabGraphicsAspectRatio", + "Translations": { + "ar_SA": "نسبة الارتفاع إلى العرض:", + "de_DE": "Bildseitenverhältnis:", + "el_GR": "Αναλογία Απεικόνισης:", + "en_US": "Aspect Ratio:", + "es_ES": "Relación de aspecto:", + "fr_FR": "Format d'image :", + "he_IL": "יחס גובה-רוחב:", + "it_IT": "Rapporto d'aspetto:", + "ja_JP": "アスペクト比:", + "ko_KR": "종횡비 :", + "no_NO": "Bildeformat", + "pl_PL": "Format obrazu:", + "pt_BR": "Proporção da Tela:", + "ru_RU": "Соотношение сторон:", + "sv_SE": "Bildförhållande:", + "th_TH": "อัตราส่วนภาพ:", + "tr_TR": "En-Boy Oranı:", + "uk_UA": "Співвідношення сторін:", + "zh_CN": "宽高比:", + "zh_TW": "顯示長寬比例:" + } + }, + { + "ID": "SettingsTabGraphicsAspectRatio4x3", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "4:3", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabGraphicsAspectRatio16x9", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "16:9", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabGraphicsAspectRatio16x10", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "16:10", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabGraphicsAspectRatio21x9", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "21:9", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabGraphicsAspectRatio32x9", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "32:9", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabGraphicsAspectRatioStretch", + "Translations": { + "ar_SA": "تمديد لتناسب النافذة", + "de_DE": "An Fenster anpassen", + "el_GR": "Έκταση σε όλο το παράθυρο", + "en_US": "Stretch to Fit Window", + "es_ES": "Estirar a la ventana", + "fr_FR": "Ajuster à la taille de la fenêtre", + "he_IL": "מתח לגודל חלון", + "it_IT": "Adatta alla finestra", + "ja_JP": "ウインドウサイズに合わせる", + "ko_KR": "창에 맞춰 늘리기", + "no_NO": "Strekk for og Tilpasse vindu", + "pl_PL": "Rozciągnij do Okna", + "pt_BR": "Esticar até Caber", + "ru_RU": "Растянуть до размеров окна", + "sv_SE": "Sträck ut för att passa fönster", + "th_TH": "ยืดภาพเพื่อให้พอดีกับหน้าต่าง", + "tr_TR": "Pencereye Sığdırmak İçin Genişlet", + "uk_UA": "Розтягнути до розміру вікна", + "zh_CN": "拉伸以适应窗口", + "zh_TW": "拉伸以適應視窗" + } + }, + { + "ID": "SettingsTabGraphicsDeveloperOptions", + "Translations": { + "ar_SA": "خيارات المطور", + "de_DE": "Optionen für Entwickler", + "el_GR": "Επιλογές Προγραμματιστή", + "en_US": "Developer Options", + "es_ES": "Opciones de desarrollador", + "fr_FR": "Options pour les développeurs", + "he_IL": "אפשרויות מפתח", + "it_IT": "Opzioni per sviluppatori", + "ja_JP": "開発者向けオプション", + "ko_KR": "개발자 옵션", + "no_NO": "Utvikleralternativer", + "pl_PL": "Opcje programisty", + "pt_BR": "Opções do Desenvolvedor", + "ru_RU": "Параметры разработчика", + "sv_SE": "Utvecklarinställningar", + "th_TH": "ตัวเลือกนักพัฒนา", + "tr_TR": "Geliştirici Seçenekleri", + "uk_UA": "Параметри розробника", + "zh_CN": "开发者选项", + "zh_TW": "開發者選項" + } + }, + { + "ID": "SettingsTabGraphicsShaderDumpPath", + "Translations": { + "ar_SA": "مسار تفريغ المظللات:", + "de_DE": "Grafik-Shader-Dump-Pfad:", + "el_GR": "Τοποθεσία Shaders Γραφικών:", + "en_US": "Graphics Shader Dump Path:", + "es_ES": "Directorio de volcado de sombreadores:", + "fr_FR": "Chemin de vidage des shaders graphiques :", + "he_IL": "", + "it_IT": "Percorso di dump degli shader:", + "ja_JP": "グラフィックス シェーダー ダンプパス:", + "ko_KR": "그래픽 셰이더 덤프 경로 :", + "no_NO": "Grafikk Shader Dump bane:", + "pl_PL": "Ścieżka do zgranych cieni graficznych:", + "pt_BR": "Diretório para Despejo de Shaders:", + "ru_RU": "Путь дампа графических шейдеров", + "sv_SE": "Sökväg för Graphics Shader Dump:", + "th_TH": "ที่เก็บ ดัมพ์ไฟล์ แสงเงา:", + "tr_TR": "Grafik Shader Döküm Yolu:", + "uk_UA": "Шлях скидання графічного шейдера:", + "zh_CN": "图形着色器转储路径:", + "zh_TW": "圖形著色器傾印路徑:" + } + }, + { + "ID": "SettingsTabLogging", + "Translations": { + "ar_SA": "تسجيل", + "de_DE": "Logs", + "el_GR": "Καταγραφή", + "en_US": "Logging", + "es_ES": "Registros", + "fr_FR": "Journalisation", + "he_IL": "רישום", + "it_IT": "Log", + "ja_JP": "ロギング", + "ko_KR": "로그 기록", + "no_NO": "", + "pl_PL": "Dziennik zdarzeń", + "pt_BR": "Log", + "ru_RU": "Журналирование", + "sv_SE": "Loggning", + "th_TH": "ประวัติ", + "tr_TR": "Loglama", + "uk_UA": "Налагодження", + "zh_CN": "日志", + "zh_TW": "日誌" + } + }, + { + "ID": "SettingsTabLoggingLogging", + "Translations": { + "ar_SA": "تسجيل", + "de_DE": "Logs", + "el_GR": "Καταγραφή", + "en_US": "Logging", + "es_ES": "Registros", + "fr_FR": "Journalisation", + "he_IL": "רישום", + "it_IT": "Log", + "ja_JP": "ロギング", + "ko_KR": "로그 기록", + "no_NO": "", + "pl_PL": "Dziennik zdarzeń", + "pt_BR": "Log", + "ru_RU": "Журналирование", + "sv_SE": "Loggning", + "th_TH": "ประวัติ", + "tr_TR": "Loglama", + "uk_UA": "Налагодження", + "zh_CN": "日志", + "zh_TW": "日誌" + } + }, + { + "ID": "SettingsTabLoggingEnableLoggingToFile", + "Translations": { + "ar_SA": "تفعيل التسجيل إلى ملف", + "de_DE": "Protokollierung in Datei aktivieren", + "el_GR": "Ενεργοποίηση Καταγραφής Αρχείου", + "en_US": "Enable Logging to File", + "es_ES": "Habilitar registro a archivo", + "fr_FR": "Activer la journalisation dans un fichier", + "he_IL": "אפשר רישום לקובץ", + "it_IT": "Salva i log su file", + "ja_JP": "ファイルへのロギングを有効にする", + "ko_KR": "파일에 로그 기록 활성화", + "no_NO": "Aktiver logging til fil", + "pl_PL": "Włącz rejestrowanie zdarzeń do pliku", + "pt_BR": "Salvar Logs em Arquivo", + "ru_RU": "Включить запись в файл", + "sv_SE": "Aktivera loggning till fil", + "th_TH": "เปิดใช้งานการบันทึกประวัติ ไปยังไฟล์", + "tr_TR": "Logları Dosyaya Kaydetmeyi Etkinleştir", + "uk_UA": "Увімкнути налагодження у файл", + "zh_CN": "将日志写入文件", + "zh_TW": "啟用日誌寫入到檔案" + } + }, + { + "ID": "SettingsTabLoggingEnableStubLogs", + "Translations": { + "ar_SA": "تفعيل سجلات الـStub", + "de_DE": "Aktiviere Stub-Logs", + "el_GR": "Ενεργοποίηση Καταγραφής Stub", + "en_US": "Enable Stub Logs", + "es_ES": "Habilitar registros de Stub", + "fr_FR": "Activer les journaux stub", + "he_IL": "אפשר רישום בדל", + "it_IT": "Attiva log di stub", + "ja_JP": "Stub ログを有効にする", + "ko_KR": "조각 기록 활성화", + "no_NO": "Aktiver Stub-logger", + "pl_PL": "Wlącz Skróty Logów", + "pt_BR": "Habilitar Logs de Stub", + "ru_RU": "Включить журнал-заглушку", + "sv_SE": "Aktivera stubbloggar", + "th_TH": "เปิดใช้งานการบันทึกประวัติ", + "tr_TR": "Stub Loglarını Etkinleştir", + "uk_UA": "Увімкнути журнали заглушки", + "zh_CN": "启用存根日志", + "zh_TW": "啟用 Stub 日誌" + } + }, + { + "ID": "SettingsTabLoggingEnableInfoLogs", + "Translations": { + "ar_SA": "تفعيل سجلات المعلومات", + "de_DE": "Aktiviere Info-Logs", + "el_GR": "Ενεργοποίηση Καταγραφής Πληροφοριών", + "en_US": "Enable Info Logs", + "es_ES": "Habilitar registros de Info", + "fr_FR": "Activer les journaux d'informations", + "he_IL": "אפשר רישום מידע", + "it_IT": "Attiva log di informazioni", + "ja_JP": "Info ログを有効にする", + "ko_KR": "정보 기록 활성화", + "no_NO": "Aktiver informasjonslogger", + "pl_PL": "Włącz Logi Informacyjne", + "pt_BR": "Habilitar Logs de Informação", + "ru_RU": "Включить информационный журнал", + "sv_SE": "Aktivera informationsloggar", + "th_TH": "เปิดใช้งานการบันทึกประวัติการใช้งาน", + "tr_TR": "Bilgi Loglarını Etkinleştir", + "uk_UA": "Увімкнути інформаційні журнали", + "zh_CN": "启用信息日志", + "zh_TW": "啟用資訊日誌" + } + }, + { + "ID": "SettingsTabLoggingEnableWarningLogs", + "Translations": { + "ar_SA": "تفعيل سجلات التحذير", + "de_DE": "Aktiviere Warn-Logs", + "el_GR": "Ενεργοποίηση Καταγραφής Προειδοποίησης", + "en_US": "Enable Warning Logs", + "es_ES": "Habilitar registros de Advertencia", + "fr_FR": "Activer les journaux d'avertissements", + "he_IL": "אפשר רישום אזהרות", + "it_IT": "Attiva log di avviso", + "ja_JP": "Warning ログを有効にする", + "ko_KR": "경고 기록 활성화", + "no_NO": "Aktiver varsellogger", + "pl_PL": "Włącz Logi Ostrzeżeń", + "pt_BR": "Habilitar Logs de Alerta", + "ru_RU": "Включить журнал предупреждений", + "sv_SE": "Aktivera varningsloggar", + "th_TH": "เปิดใช้งานการบันทึกประวัติคำเตือน", + "tr_TR": "Uyarı Loglarını Etkinleştir", + "uk_UA": "Увімкнути журнали попереджень", + "zh_CN": "启用警告日志", + "zh_TW": "啟用警告日誌" + } + }, + { + "ID": "SettingsTabLoggingEnableErrorLogs", + "Translations": { + "ar_SA": "تفعيل سجلات الأخطاء", + "de_DE": "Aktiviere Fehler-Logs", + "el_GR": "Ενεργοποίηση Καταγραφής Σφαλμάτων", + "en_US": "Enable Error Logs", + "es_ES": "Habilitar registros de Error", + "fr_FR": "Activer les journaux d'erreurs", + "he_IL": "אפשר רישום שגיאות", + "it_IT": "Attiva log di errore", + "ja_JP": "Error ログを有効にする", + "ko_KR": "오류 기록 활성화", + "no_NO": "Aktiver feillogger", + "pl_PL": "Włącz Logi Błędów", + "pt_BR": "Habilitar Logs de Erro", + "ru_RU": "Включить журнал ошибок", + "sv_SE": "Aktivera felloggar", + "th_TH": "เปิดใช้งานการบันทึกประวัติข้อผิดพลาด", + "tr_TR": "Hata Loglarını Etkinleştir", + "uk_UA": "Увімкнути журнали помилок", + "zh_CN": "启用错误日志", + "zh_TW": "啟用錯誤日誌" + } + }, + { + "ID": "SettingsTabLoggingEnableTraceLogs", + "Translations": { + "ar_SA": "تفعيل سجلات التتبع", + "de_DE": "Aktiviere Trace-Logs", + "el_GR": "Ενεργοποίηση Καταγραφής Ιχνών", + "en_US": "Enable Trace Logs", + "es_ES": "Habilitar registros de Rastro", + "fr_FR": "Activer les journaux de trace", + "he_IL": "הפעל רישום מעקבי", + "it_IT": "Attiva log di trace", + "ja_JP": "Trace ログを有効にする", + "ko_KR": "추적 기록 활성화", + "no_NO": "Aktiver spor logger", + "pl_PL": "Włącz Logi Śledzenia", + "pt_BR": "Habilitar Logs de Rastreamento", + "ru_RU": "Включить журнал трассировки", + "sv_SE": "Aktivera spårloggar", + "th_TH": "เปิดใช้งานการบันทึกประวัติการติดตาม", + "tr_TR": "Trace Loglarını Etkinleştir", + "uk_UA": "Увімкнути журнали трасування", + "zh_CN": "启用跟踪日志", + "zh_TW": "啟用追蹤日誌" + } + }, + { + "ID": "SettingsTabLoggingEnableGuestLogs", + "Translations": { + "ar_SA": "تفعيل سجلات الضيوف", + "de_DE": "Aktiviere Gast-Logs", + "el_GR": "Ενεργοποίηση Καταγραφής Επισκεπτών", + "en_US": "Enable Guest Logs", + "es_ES": "Habilitar registros de Guest", + "fr_FR": "Activer les journaux invités", + "he_IL": "הפעל רישום מארח", + "it_IT": "Attiva log del guest", + "ja_JP": "Guest ログを有効にする", + "ko_KR": "방문 기록 활성화", + "no_NO": "Aktiver gjestelogger", + "pl_PL": "Włącz Logi Gości", + "pt_BR": "Habilitar Logs de Convidados", + "ru_RU": "Включить гостевые журналы", + "sv_SE": "Aktivera gästloggar", + "th_TH": "เปิดใช้งานการบันทึกประวัติผู้เยี่ยมชม", + "tr_TR": "Guest Loglarını Etkinleştir", + "uk_UA": "Увімкнути журнали гостей", + "zh_CN": "启用访客日志", + "zh_TW": "啟用客體日誌" + } + }, + { + "ID": "SettingsTabLoggingEnableAvaloniaLogs", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Enable UI Logs", + "es_ES": "", + "fr_FR": "Activer les journaux UI", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "UI 로그 활성화", + "no_NO": "Aktivere UI-logger", + "pl_PL": "", + "pt_BR": "Habilitar Logs da IU", + "ru_RU": "Включить журнал интерфейса", + "sv_SE": "Aktivera gränssnittsloggar", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Увімкнути журнали інтерфейсу", + "zh_CN": "启用 UI 日志", + "zh_TW": "啟用 UI 日誌" + } + }, + { + "ID": "SettingsTabLoggingEnableFsAccessLogs", + "Translations": { + "ar_SA": "تمكين سجلات الوصول إلى نظام الملفات", + "de_DE": "Aktiviere Fs Zugriff-Logs", + "el_GR": "Ενεργοποίηση Καταγραφής Πρόσβασης FS", + "en_US": "Enable Fs Access Logs", + "es_ES": "Habilitar registros de Fs Access", + "fr_FR": "Activer les journaux d'accès au système de fichiers", + "he_IL": "אפשר רישום גישת קבצי מערכת", + "it_IT": "Attiva log di accesso FS", + "ja_JP": "Fs アクセスログを有効にする", + "ko_KR": "파일 시스템 접속 기록 활성화", + "no_NO": "Aktiver Fs tilgangslogger", + "pl_PL": "Włącz Logi Dostępu do Systemu Plików", + "pt_BR": "Habilitar Logs de Acesso Fs", + "ru_RU": "Включить журналы доступа файловой системы", + "sv_SE": "Aktivera loggar för filsystemsåtkomst", + "th_TH": "เปิดใช้งานการบันทึกประวัติการเข้าถึง Fs", + "tr_TR": "Fs Erişim Loglarını Etkinleştir", + "uk_UA": "Увімкнути журнали доступу до файлової системи", + "zh_CN": "启用文件访问日志", + "zh_TW": "啟用檔案系統存取日誌" + } + }, + { + "ID": "SettingsTabLoggingFsGlobalAccessLogMode", + "Translations": { + "ar_SA": "وضع سجل الوصول العالمي لنظام الملفات:", + "de_DE": "Fs Globaler Zugriff-Log-Modus:", + "el_GR": "Λειτουργία Καταγραφής Καθολικής Πρόσβασης FS:", + "en_US": "Fs Global Access Log Mode:", + "es_ES": "Modo de registros Fs Global Access:", + "fr_FR": "Mode global des journaux d’accès FS", + "he_IL": "מצב רישום גלובלי של גישת קבצי מערכת", + "it_IT": "Modalità log di accesso globale FS:", + "ja_JP": "Fs グローバルアクセスログモード:", + "ko_KR": "파일 시스템 전역 접속 로그 모드 :", + "no_NO": "Fs Global Access-logg-modus:", + "pl_PL": "Tryb globalnego dziennika zdarzeń systemu plików:", + "pt_BR": "Modo de Log de Acesso Global Fs:", + "ru_RU": "Режим журнала глобального доступа файловой системы:", + "sv_SE": "Loggläge för global filsystemsåtkomst:", + "th_TH": "โหมด การเข้าถึงประวัติส่วนกลาง:", + "tr_TR": "Fs Evrensel Erişim Log Modu:", + "uk_UA": "Режим журналу глобального доступу файлової системи:", + "zh_CN": "文件系统全局访问日志模式:", + "zh_TW": "檔案系統全域存取日誌模式:" + } + }, + { + "ID": "SettingsTabLoggingDeveloperOptions", + "Translations": { + "ar_SA": "خيارات المطور", + "de_DE": "Entwickleroptionen", + "el_GR": "Επιλογές Προγραμματιστή (ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η απόδοση Θα μειωθεί)", + "en_US": "Developer Options", + "es_ES": "Opciones de desarrollador (ADVERTENCIA: empeorarán el rendimiento)", + "fr_FR": "Options pour les développeurs", + "he_IL": "אפשרויות מפתח", + "it_IT": "Opzioni per sviluppatori", + "ja_JP": "開発者オプション", + "ko_KR": "개발자 옵션", + "no_NO": "Utvikleralternativer", + "pl_PL": "Opcje programisty (UWAGA: wpływa na wydajność)", + "pt_BR": "Opções do Desenvolvedor", + "ru_RU": "Параметры разработчика", + "sv_SE": "Utvecklarinställningar", + "th_TH": "ตัวเลือกนักพัฒนา", + "tr_TR": "Geliştirici Seçenekleri (UYARI: Performansı düşürecektir)", + "uk_UA": "Параметри розробника (УВАГА: шкодить продуктивності!)", + "zh_CN": "开发者选项", + "zh_TW": "開發者選項" + } + }, + { + "ID": "SettingsTabLoggingDeveloperOptionsNote", + "Translations": { + "ar_SA": "تحذير: سوف يقلل من الأداء", + "de_DE": "ACHTUNG: Wird die Leistung reduzieren", + "el_GR": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Θα μειώσει την απόδοση", + "en_US": "WARNING: Will reduce performance", + "es_ES": "ADVERTENCIA: Reducirá el rendimiento", + "fr_FR": "ATTENTION : Réduira les performances", + "he_IL": "אזהרה: יפחית ביצועים", + "it_IT": "ATTENZIONE: ridurranno le prestazioni", + "ja_JP": "警告: パフォーマンスを低下させます", + "ko_KR": "경고 : 성능이 감소합니다.", + "no_NO": "Advarsel: Vil redusere ytelsen", + "pl_PL": "UWAGA: Pogrorszy wydajność", + "pt_BR": "AVISO: Reduzirá o desempenho", + "ru_RU": "ВНИМАНИЕ: эти настройки снижают производительность", + "sv_SE": "VARNING: Kommer att reducera prestandan", + "th_TH": "คำเตือน: จะทำให้ประสิทธิภาพลดลง", + "tr_TR": "UYARI: Oyun performansı azalacak", + "uk_UA": "УВАГА: Зміна параметрів нижче має негативний вплив на продуктивність", + "zh_CN": "警告:会降低模拟器性能", + "zh_TW": "警告: 會降低效能" + } + }, + { + "ID": "SettingsTabLoggingGraphicsBackendLogLevel", + "Translations": { + "ar_SA": "مستوى سجل خلفية الرسومات:", + "de_DE": "Protokollstufe des Grafik-Backends:", + "el_GR": "Επίπεδο Καταγραφής Διεπαφής Γραφικών:", + "en_US": "Graphics Backend Log Level:", + "es_ES": "Nivel de registro de backend gráficos:", + "fr_FR": "Niveau de journalisation du backend graphique :", + "he_IL": "רישום גרפיקת קצה אחורי:", + "it_IT": "Livello di log del backend grafico:", + "ja_JP": "グラフィックスバックエンド ログレベル:", + "ko_KR": "그래픽 후단부 기록 레벨 :", + "no_NO": "Grafikk Backend-loggnivå:", + "pl_PL": "Poziom rejestrowania do dziennika zdarzeń Backendu Graficznego:", + "pt_BR": "Nível de Log do Renderizador Gráfico:", + "ru_RU": "Уровень журнала бэкенда графики:", + "sv_SE": "Loggnivå för grafikbakände:", + "th_TH": "ระดับการบันทึกประวัติ กราฟิกเบื้องหลัง:", + "tr_TR": "Grafik Arka Uç Günlük Düzeyi", + "uk_UA": "Рівень журналу графічного бекенда:", + "zh_CN": "图形引擎日志级别:", + "zh_TW": "圖形後端日誌等級:" + } + }, + { + "ID": "SettingsTabLoggingGraphicsBackendLogLevelNone", + "Translations": { + "ar_SA": "لا شيء", + "de_DE": "Keine", + "el_GR": "Κανένα", + "en_US": "None", + "es_ES": "Nada", + "fr_FR": "Aucun", + "he_IL": "כלום", + "it_IT": "Nessuno", + "ja_JP": "なし", + "ko_KR": "없음", + "no_NO": "Ingen", + "pl_PL": "Nic", + "pt_BR": "Nenhum", + "ru_RU": "Нет", + "sv_SE": "Ingen", + "th_TH": "ไม่มี", + "tr_TR": "Hiçbiri", + "uk_UA": "Немає", + "zh_CN": "无", + "zh_TW": "無" + } + }, + { + "ID": "SettingsTabLoggingGraphicsBackendLogLevelError", + "Translations": { + "ar_SA": "خطأ", + "de_DE": "Fehler", + "el_GR": "Σφάλμα", + "en_US": "Error", + "es_ES": "Errores", + "fr_FR": "Erreur", + "he_IL": "שגיאה", + "it_IT": "Errore", + "ja_JP": "エラー", + "ko_KR": "오류", + "no_NO": "Feil", + "pl_PL": "Błędy", + "pt_BR": "Erro", + "ru_RU": "Ошибка", + "sv_SE": "Fel", + "th_TH": "ผิดพลาด", + "tr_TR": "Hata", + "uk_UA": "Помилка", + "zh_CN": "错误", + "zh_TW": "錯誤" + } + }, + { + "ID": "SettingsTabLoggingGraphicsBackendLogLevelPerformance", + "Translations": { + "ar_SA": "تباطؤ", + "de_DE": "Verlangsamungen", + "el_GR": "Επιβραδύνσεις", + "en_US": "Slowdowns", + "es_ES": "Ralentizaciones", + "fr_FR": "Ralentissements", + "he_IL": "האטות", + "it_IT": "Rallentamenti", + "ja_JP": "パフォーマンス低下", + "ko_KR": "감속", + "no_NO": "Tregere", + "pl_PL": "Spowolnienia", + "pt_BR": "Lentidão", + "ru_RU": "Замедления", + "sv_SE": "Långsamheter", + "th_TH": "ช้าลง", + "tr_TR": "Yavaşlamalar", + "uk_UA": "Уповільнення", + "zh_CN": "减速", + "zh_TW": "減速" + } + }, + { + "ID": "SettingsTabLoggingGraphicsBackendLogLevelAll", + "Translations": { + "ar_SA": "الكل", + "de_DE": "Alle", + "el_GR": "Όλα", + "en_US": "All", + "es_ES": "Todo", + "fr_FR": "Tout", + "he_IL": "הכל", + "it_IT": "Tutto", + "ja_JP": "すべて", + "ko_KR": "모두", + "no_NO": "Alle", + "pl_PL": "Wszystko", + "pt_BR": "Todos", + "ru_RU": "Всё", + "sv_SE": "Alla", + "th_TH": "ทั้งหมด", + "tr_TR": "Hepsi", + "uk_UA": "Все", + "zh_CN": "全部", + "zh_TW": "全部" + } + }, + { + "ID": "SettingsTabLoggingEnableDebugLogs", + "Translations": { + "ar_SA": "تمكين سجلات التصحيح", + "de_DE": "Aktiviere Debug-Log", + "el_GR": "Ενεργοποίηση Αρχείων Καταγραφής Εντοπισμού Σφαλμάτων", + "en_US": "Enable Debug Logs", + "es_ES": "Habilitar registros de debug", + "fr_FR": "Activer les journaux de débogage", + "he_IL": "אפשר רישום ניפוי באגים", + "it_IT": "Attiva log di debug", + "ja_JP": "デバッグログを有効にする", + "ko_KR": "디버그 기록 활성화", + "no_NO": "Aktiver feilsøkingslogger", + "pl_PL": "Włącz dzienniki zdarzeń do debugowania", + "pt_BR": "Habilitar Logs de Depuração", + "ru_RU": "Включить журнал отладки", + "sv_SE": "Aktivera felsökningsloggar", + "th_TH": "เปิดใช้งาน ประวัติข้อบกพร่อง", + "tr_TR": "Hata Ayıklama Loglarını Etkinleştir", + "uk_UA": "Увімкнути журнали налагодження", + "zh_CN": "启用调试日志", + "zh_TW": "啟用偵錯日誌" + } + }, + { + "ID": "SettingsTabInput", + "Translations": { + "ar_SA": "الإدخال", + "de_DE": "Eingabe", + "el_GR": "Χειρισμός", + "en_US": "Input", + "es_ES": "Entrada", + "fr_FR": "Contrôles", + "he_IL": "קלט", + "it_IT": "Comandi", + "ja_JP": "入力", + "ko_KR": "입력", + "no_NO": "Inndata", + "pl_PL": "Sterowanie", + "pt_BR": "Controle", + "ru_RU": "Управление", + "sv_SE": "Inmatning", + "th_TH": "ป้อนข้อมูล", + "tr_TR": "Giriş Yöntemi", + "uk_UA": "Керування", + "zh_CN": "输入", + "zh_TW": "輸入" + } + }, + { + "ID": "SettingsTabInputUseGlobalInput", + "Translations": { + "ar_SA": "إدخال عالمي", + "de_DE": "Globale Eingabe", + "el_GR": "Παγκόσμια εισαγωγή", + "en_US": "Global Input", + "es_ES": "Entrada Global", + "fr_FR": "Saisie Globale", + "he_IL": "קלט גלובלי", + "it_IT": "Input Globale", + "ja_JP": "グローバル入力", + "ko_KR": "글로벌 입력", + "no_NO": "Global Inndata", + "pl_PL": "Globalny Wpis", + "pt_BR": "Entrada Global", + "ru_RU": "Глобальный Ввод", + "sv_SE": "Global Input", + "th_TH": "การป้อนข้อมูลแบบโกลบอล", + "tr_TR": "Küresel Girdi", + "uk_UA": "Глобальний Ввід", + "zh_CN": "全局输入", + "zh_TW": "全域輸入" + } + }, + { + "ID": "SettingsTabInputEnableDockedMode", + "Translations": { + "ar_SA": "تركيب بالمنصة", + "de_DE": "Angedockter Modus", + "el_GR": "Ενεργοποίηση Docked Mode", + "en_US": "Docked Mode", + "es_ES": "Modo dock/TV", + "fr_FR": "Mode Docké", + "he_IL": "מצב עגינה", + "it_IT": "Attiva modalità TV", + "ja_JP": "ドッキングモード", + "ko_KR": "도킹 모드", + "no_NO": "Forankret modus", + "pl_PL": "Tryb zadokowany", + "pt_BR": "Modo TV", + "ru_RU": "Стационарный режим", + "sv_SE": "Dockat läge", + "th_TH": "ด็อกโหมด", + "tr_TR": "Docked Modu Etkinleştir", + "uk_UA": "Режим док-станції", + "zh_CN": "主机模式", + "zh_TW": "底座模式" + } + }, + { + "ID": "SettingsTabInputDirectKeyboardAccess", + "Translations": { + "ar_SA": "الوصول المباشر للوحة المفاتيح", + "de_DE": "Direkter Tastaturzugriff", + "el_GR": "Άμεση Πρόσβαση στο Πληκτρολόγιο", + "en_US": "Direct Keyboard Access", + "es_ES": "Acceso directo al teclado", + "fr_FR": "Accès direct au clavier", + "he_IL": "גישה ישירה למקלדת", + "it_IT": "Accesso diretto alla tastiera", + "ja_JP": "キーボード直接アクセス", + "ko_KR": "키보드 직접 접속", + "no_NO": "Direkte tastaturtilgang", + "pl_PL": "Bezpośredni dostęp do klawiatury", + "pt_BR": "Acesso Direto ao Teclado", + "ru_RU": "Прямой ввод клавиатуры", + "sv_SE": "Direkt tangentbordsåtkomst", + "th_TH": "เข้าถึงคีย์บอร์ดโดยตรง", + "tr_TR": "Doğrudan Klavye Erişimi", + "uk_UA": "Прямий доступ з клавіатури", + "zh_CN": "直通键盘控制", + "zh_TW": "鍵盤直接存取" + } + }, + { + "ID": "SettingsButtonSave", + "Translations": { + "ar_SA": "حفظ", + "de_DE": "Speichern", + "el_GR": "Αποθήκευση", + "en_US": "Save", + "es_ES": "Guardar", + "fr_FR": "Enregistrer", + "he_IL": "שמירה", + "it_IT": "Salva", + "ja_JP": "セーブ", + "ko_KR": "저장", + "no_NO": "Lagre", + "pl_PL": "Zapisz", + "pt_BR": "Salvar", + "ru_RU": "Сохранить", + "sv_SE": "Spara", + "th_TH": "บันทึก", + "tr_TR": "Kaydet", + "uk_UA": "Зберегти", + "zh_CN": "保存", + "zh_TW": "儲存" + } + }, + { + "ID": "SettingsButtonClose", + "Translations": { + "ar_SA": "إغلاق", + "de_DE": "Schließen", + "el_GR": "Κλείσιμο", + "en_US": "Close", + "es_ES": "Cerrar", + "fr_FR": "Fermer", + "he_IL": "סגירה", + "it_IT": "Chiudi", + "ja_JP": "閉じる", + "ko_KR": "닫기", + "no_NO": "Lukk", + "pl_PL": "Zamknij", + "pt_BR": "Fechar", + "ru_RU": "Закрыть", + "sv_SE": "Stäng", + "th_TH": "ปิด", + "tr_TR": "Kapat", + "uk_UA": "Закрити", + "zh_CN": "关闭", + "zh_TW": "關閉" + } + }, + { + "ID": "SettingsButtonReset", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Reset Settings", + "es_ES": "", + "fr_FR": "Réinitialiser les paramètres", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "설정 초기화", + "no_NO": "Tilbakestill innstillinger", + "pl_PL": "", + "pt_BR": "Redefinir Configurações", + "ru_RU": "Сбросить настройки", + "sv_SE": "Nollställ inställningar", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Скинути налаштування", + "zh_CN": "重置设置", + "zh_TW": "重設設定" + } + }, + { + "ID": "SettingsButtonResetConfirm", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "I want to reset my settings.", + "es_ES": "", + "fr_FR": "Je veux réinitialiser mes paramètres.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "설정을 초기화하고 싶습니다.", + "no_NO": "Jeg vil tilbakestille innstillingene mine.", + "pl_PL": "", + "pt_BR": "Quero redefinir minhas configurações.", + "ru_RU": "Я хочу сбросить свои настройки.", + "sv_SE": "Jag vill nollställa mina inställningar.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Я хочу скинути налаштування.", + "zh_CN": "我要重置我的设置。", + "zh_TW": "我想重設我的設定。" + } + }, + { + "ID": "SettingsButtonOk", + "Translations": { + "ar_SA": "موافق", + "de_DE": "", + "el_GR": "", + "en_US": "OK", + "es_ES": "Aceptar", + "fr_FR": "", + "he_IL": "אישור", + "it_IT": "", + "ja_JP": "", + "ko_KR": "확인", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Ok", + "th_TH": "ตกลง", + "tr_TR": "Tamam", + "uk_UA": "", + "zh_CN": "确定", + "zh_TW": "確定" + } + }, + { + "ID": "SettingsButtonCancel", + "Translations": { + "ar_SA": "إلغاء", + "de_DE": "Abbrechen", + "el_GR": "Ακύρωση", + "en_US": "Cancel", + "es_ES": "Cancelar", + "fr_FR": "Annuler", + "he_IL": "ביטול", + "it_IT": "Annulla", + "ja_JP": "キャンセル", + "ko_KR": "취소", + "no_NO": "Avbryt", + "pl_PL": "Anuluj", + "pt_BR": "Cancelar", + "ru_RU": "Отмена", + "sv_SE": "Avbryt", + "th_TH": "ยกเลิก", + "tr_TR": "İptal", + "uk_UA": "Скасувати", + "zh_CN": "取消", + "zh_TW": "取消" + } + }, + { + "ID": "SettingsButtonApply", + "Translations": { + "ar_SA": "تطبيق", + "de_DE": "Übernehmen", + "el_GR": "Εφαρμογή", + "en_US": "Apply", + "es_ES": "Aplicar", + "fr_FR": "Appliquer", + "he_IL": "החל", + "it_IT": "Applica", + "ja_JP": "適用", + "ko_KR": "적용", + "no_NO": "Bruk", + "pl_PL": "Zastosuj", + "pt_BR": "Aplicar", + "ru_RU": "Применить", + "sv_SE": "Verkställ", + "th_TH": "นำไปใช้", + "tr_TR": "Uygula", + "uk_UA": "Застосувати", + "zh_CN": "应用", + "zh_TW": "套用" + } + }, + { + "ID": "ControllerSettingsPlayer", + "Translations": { + "ar_SA": "اللاعب", + "de_DE": "Spieler", + "el_GR": "Παίχτης", + "en_US": "Player", + "es_ES": "Jugador", + "fr_FR": "Joueur", + "he_IL": "שחקן/ית", + "it_IT": "Giocatore", + "ja_JP": "プレイヤー", + "ko_KR": "플레이어", + "no_NO": "Spiller", + "pl_PL": "Gracz", + "pt_BR": "Jogador", + "ru_RU": "Игрок", + "sv_SE": "Spelare", + "th_TH": "ผู้เล่น", + "tr_TR": "Oyuncu", + "uk_UA": "Гравець", + "zh_CN": "玩家", + "zh_TW": "玩家" + } + }, + { + "ID": "ControllerSettingsPlayer1", + "Translations": { + "ar_SA": "اللاعب 1", + "de_DE": "Spieler 1", + "el_GR": "Παίχτης 1", + "en_US": "Player 1", + "es_ES": "Jugador 1", + "fr_FR": "Joueur 1", + "he_IL": "שחקן/ית 1", + "it_IT": "Giocatore 1", + "ja_JP": "プレイヤー 1", + "ko_KR": "플레이어 1", + "no_NO": "Spiller 1", + "pl_PL": "Gracz 1", + "pt_BR": "Jogador 1", + "ru_RU": "Игрок 1", + "sv_SE": "Spelare 1", + "th_TH": "ผู้เล่นคนที่ 1", + "tr_TR": "Oyuncu 1", + "uk_UA": "Гравець 1", + "zh_CN": "玩家 1", + "zh_TW": "玩家 1" + } + }, + { + "ID": "ControllerSettingsPlayer2", + "Translations": { + "ar_SA": "اللاعب 2", + "de_DE": "Spieler 2", + "el_GR": "Παίχτης 2", + "en_US": "Player 2", + "es_ES": "Jugador 2", + "fr_FR": "Joueur 2", + "he_IL": "שחקן/ית 2", + "it_IT": "Giocatore 2", + "ja_JP": "プレイヤー 2", + "ko_KR": "플레이어 2", + "no_NO": "Spiller 2", + "pl_PL": "Gracz 2", + "pt_BR": "Jogador 2", + "ru_RU": "Игрок 2", + "sv_SE": "Spelare 2", + "th_TH": "ผู้เล่นคนที่ 2", + "tr_TR": "Oyuncu 2", + "uk_UA": "Гравець 2", + "zh_CN": "玩家 2", + "zh_TW": "玩家 2" + } + }, + { + "ID": "ControllerSettingsPlayer3", + "Translations": { + "ar_SA": "اللاعب 3", + "de_DE": "Spieler 3", + "el_GR": "Παίχτης 3", + "en_US": "Player 3", + "es_ES": "Jugador 3", + "fr_FR": "Joueur 3", + "he_IL": "שחקן/ית 3", + "it_IT": "Giocatore 3", + "ja_JP": "プレイヤー 3", + "ko_KR": "플레이어 3", + "no_NO": "Spiller 3", + "pl_PL": "Gracz 3", + "pt_BR": "Jogador 3", + "ru_RU": "Игрок 3", + "sv_SE": "Spelare 3", + "th_TH": "ผู้เล่นคนที่ 3", + "tr_TR": "Oyuncu 3", + "uk_UA": "Гравець 3", + "zh_CN": "玩家 3", + "zh_TW": "玩家 3" + } + }, + { + "ID": "ControllerSettingsPlayer4", + "Translations": { + "ar_SA": "اللاعب 4", + "de_DE": "Spieler 4", + "el_GR": "Παίχτης 4", + "en_US": "Player 4", + "es_ES": "Jugador 4", + "fr_FR": "Joueur 4", + "he_IL": "שחקן/ית 4", + "it_IT": "Giocatore 4", + "ja_JP": "プレイヤー 4", + "ko_KR": "플레이어 4", + "no_NO": "Spiller 4", + "pl_PL": "Gracz 4", + "pt_BR": "Jogador 4", + "ru_RU": "Игрок 4", + "sv_SE": "Spelare 4", + "th_TH": "ผู้เล่นคนที่ 4", + "tr_TR": "Oyuncu 4", + "uk_UA": "Гравець 4", + "zh_CN": "玩家 4", + "zh_TW": "玩家 4" + } + }, + { + "ID": "ControllerSettingsPlayer5", + "Translations": { + "ar_SA": "اللاعب 5", + "de_DE": "Spieler 5", + "el_GR": "Παίχτης 5", + "en_US": "Player 5", + "es_ES": "Jugador 5", + "fr_FR": "Joueur 5", + "he_IL": "שחקן/ית 5", + "it_IT": "Giocatore 5", + "ja_JP": "プレイヤー 5", + "ko_KR": "플레이어 5", + "no_NO": "Spiller 5", + "pl_PL": "Gracz 5", + "pt_BR": "Jogador 5", + "ru_RU": "Игрок 5", + "sv_SE": "Spelare 5", + "th_TH": "ผู้เล่นคนที่ 5", + "tr_TR": "Oyuncu 5", + "uk_UA": "Гравець 5", + "zh_CN": "玩家 5", + "zh_TW": "玩家 5" + } + }, + { + "ID": "ControllerSettingsPlayer6", + "Translations": { + "ar_SA": "اللاعب 6", + "de_DE": "Spieler 6", + "el_GR": "Παίχτης 6", + "en_US": "Player 6", + "es_ES": "Jugador 6", + "fr_FR": "Joueur 6", + "he_IL": "שחקן/ית 6", + "it_IT": "Giocatore 6", + "ja_JP": "プレイヤー 6", + "ko_KR": "플레이어 6", + "no_NO": "Spiller 6", + "pl_PL": "Gracz 6", + "pt_BR": "Jogador 6", + "ru_RU": "Игрок 6", + "sv_SE": "Spelare 6", + "th_TH": "ผู้เล่นคนที่ 6", + "tr_TR": "Oyuncu 6", + "uk_UA": "Гравець 6", + "zh_CN": "玩家 6", + "zh_TW": "玩家 6" + } + }, + { + "ID": "ControllerSettingsPlayer7", + "Translations": { + "ar_SA": "اللاعب 7", + "de_DE": "Spieler 7", + "el_GR": "Παίχτης 7", + "en_US": "Player 7", + "es_ES": "Jugador 7", + "fr_FR": "Joueur 7", + "he_IL": "שחקן/ית 7", + "it_IT": "Giocatore 7", + "ja_JP": "プレイヤー 7", + "ko_KR": "플레이어 7", + "no_NO": "Spiller 7", + "pl_PL": "Gracz 7", + "pt_BR": "Jogador 7", + "ru_RU": "Игрок 7", + "sv_SE": "Spelare 7", + "th_TH": "ผู้เล่นคนที่ 7", + "tr_TR": "Oyuncu 7", + "uk_UA": "Гравець 7", + "zh_CN": "玩家 7", + "zh_TW": "玩家 7" + } + }, + { + "ID": "ControllerSettingsPlayer8", + "Translations": { + "ar_SA": "اللاعب 8", + "de_DE": "Spieler 8", + "el_GR": "Παίχτης 8", + "en_US": "Player 8", + "es_ES": "Jugador 8", + "fr_FR": "Joueur 8", + "he_IL": "שחקן/ית 8", + "it_IT": "Giocatore 8", + "ja_JP": "プレイヤー 8", + "ko_KR": "플레이어 8", + "no_NO": "Spiller 8", + "pl_PL": "Gracz 8", + "pt_BR": "Jogador 8", + "ru_RU": "Игрок 8", + "sv_SE": "Spelare 8", + "th_TH": "ผู้เล่นคนที่ 8", + "tr_TR": "Oyuncu 8", + "uk_UA": "Гравець 8", + "zh_CN": "玩家 8", + "zh_TW": "玩家 8" + } + }, + { + "ID": "ControllerSettingsHandheld", + "Translations": { + "ar_SA": "محمول", + "de_DE": "", + "el_GR": "Χειροκίνητο", + "en_US": "Handheld", + "es_ES": "Portátil", + "fr_FR": "Portable", + "he_IL": "נייד", + "it_IT": "Portatile", + "ja_JP": "携帯", + "ko_KR": "휴대", + "no_NO": "Håndholdt", + "pl_PL": "Przenośny", + "pt_BR": "Portátil", + "ru_RU": "Портативный", + "sv_SE": "Handhållen", + "th_TH": "แฮนด์เฮลด์โหมด", + "tr_TR": "Portatif Mod", + "uk_UA": "Портативний", + "zh_CN": "掌机模式", + "zh_TW": "手提模式" + } + }, + { + "ID": "ControllerSettingsInputDevice", + "Translations": { + "ar_SA": "جهاز الإدخال", + "de_DE": "Eingabegerät", + "el_GR": "Συσκευή Χειρισμού", + "en_US": "Input Device", + "es_ES": "Dispositivo de entrada", + "fr_FR": "Périphérique", + "he_IL": "מכשיר קלט", + "it_IT": "Dispositivo di input", + "ja_JP": "入力デバイス", + "ko_KR": "입력 장치", + "no_NO": "Inndataenhet", + "pl_PL": "Urządzenie wejściowe", + "pt_BR": "Dispositivo de Entrada", + "ru_RU": "Устройство ввода", + "sv_SE": "Inmatningsenhet", + "th_TH": "อุปกรณ์ป้อนข้อมูล", + "tr_TR": "Giriş Cihazı", + "uk_UA": "Пристрій введення", + "zh_CN": "输入设备", + "zh_TW": "輸入裝置" + } + }, + { + "ID": "ControllerSettingsWaitingConnectDevice", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Configuration found:\n\nName:\t{0}\nGUID:\t{1}\n\n Waiting for controller connection...", + "es_ES": "", + "fr_FR": "Configuration trouvée:\n\nNom:\t{0}\nGUID:\t{1}\n\nEn attente de la connexion de la manette...", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "발견된 구성 :\n\n이름 : \t{0}\n가이드 : \t{1}\n\n 컨트롤러 연결 대기 중...", + "no_NO": "", + "pl_PL": "", + "pt_BR": "Configuração encontrada:\n\nNome:\t{0}\nGUID:\t{1}\n\n Aguardando conexão do controle...", + "ru_RU": "", + "sv_SE": "Konfiguration hittad:\n\nNamn:\t{0}\nGUID:\t{1}\n\n Väntar på anslutning till kontroller...", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "发现配置:\n\n名称:\t{0}\nGUID:\t{1}\n\n 正在等待控制器连接...", + "zh_TW": "找到控制器的配置:\n\n名稱:\t{0}\nGUID:\t{1}\n\n 正在等待控制器連線..." + } + }, + { + "ID": "ControllerSettingsRefresh", + "Translations": { + "ar_SA": "تحديث", + "de_DE": "Aktualisieren", + "el_GR": "Ανανέωση", + "en_US": "Refresh", + "es_ES": "Actualizar", + "fr_FR": "Actualiser", + "he_IL": "רענון", + "it_IT": "Ricarica", + "ja_JP": "更新", + "ko_KR": "새로 고침", + "no_NO": "Oppdater", + "pl_PL": "Odśwież", + "pt_BR": "Atualizar", + "ru_RU": "Обновить", + "sv_SE": "Uppdatera", + "th_TH": "รีเฟรช", + "tr_TR": "Yenile", + "uk_UA": "Оновити", + "zh_CN": "刷新", + "zh_TW": "重新整理" + } + }, + { + "ID": "ControllerSettingsDeviceDisabled", + "Translations": { + "ar_SA": "معطل", + "de_DE": "Deaktiviert", + "el_GR": "Απενεργοποιημένο", + "en_US": "Disabled", + "es_ES": "Deshabilitado", + "fr_FR": "Désactivé", + "he_IL": "מושבת", + "it_IT": "Disabilitato", + "ja_JP": "無効", + "ko_KR": "비활성화", + "no_NO": "Deaktivert", + "pl_PL": "Wyłączone", + "pt_BR": "Desabilitado", + "ru_RU": "Отключить", + "sv_SE": "Inaktiverad", + "th_TH": "ปิดการใช้งาน", + "tr_TR": "Devre Dışı", + "uk_UA": "Вимкнено", + "zh_CN": "禁用", + "zh_TW": "已停用" + } + }, + { + "ID": "ControllerSettingsControllerType", + "Translations": { + "ar_SA": "نوع وحدة التحكم", + "de_DE": "Controller-Typ", + "el_GR": "Τύπος Χειριστηρίου", + "en_US": "Controller Type", + "es_ES": "Tipo de Mando", + "fr_FR": "Type de manette", + "he_IL": "סוג שלט", + "it_IT": "Tipo di controller", + "ja_JP": "コントローラ種別", + "ko_KR": "컨트롤러 유형", + "no_NO": "Kontrollertype", + "pl_PL": "Typ kontrolera", + "pt_BR": "Tipo de Controle", + "ru_RU": "Тип контроллера", + "sv_SE": "Kontrollertyp", + "th_TH": "ประเภทคอนโทรลเลอร์", + "tr_TR": "Kumanda Tipi", + "uk_UA": "Тип контролера", + "zh_CN": "手柄类型", + "zh_TW": "控制器類型" + } + }, + { + "ID": "ControllerSettingsControllerTypeHandheld", + "Translations": { + "ar_SA": "محمول", + "de_DE": "", + "el_GR": "Φορητό", + "en_US": "Handheld", + "es_ES": "Portátil", + "fr_FR": "Portable", + "he_IL": "נייד", + "it_IT": "Portatile", + "ja_JP": "携帯", + "ko_KR": "휴대용", + "no_NO": "Håndholdt", + "pl_PL": "Przenośny", + "pt_BR": "Portátil", + "ru_RU": "Портативный", + "sv_SE": "Handhållen", + "th_TH": "แฮนด์เฮลด์", + "tr_TR": "Portatif Mod", + "uk_UA": "Портативний", + "zh_CN": "掌机", + "zh_TW": "手提模式" + } + }, + { + "ID": "ControllerSettingsControllerTypeProController", + "Translations": { + "ar_SA": "وحدة تحكم برو", + "de_DE": "", + "el_GR": "", + "en_US": "Pro Controller", + "es_ES": "Mando Pro", + "fr_FR": "Manette Switch Pro", + "he_IL": "שלט פרו ", + "it_IT": "", + "ja_JP": "Pro コントローラ", + "ko_KR": "프로 컨트롤러", + "no_NO": "", + "pl_PL": "Pro Kontroler", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "โปรคอนโทรลเลอร์", + "tr_TR": "Profesyonel Kumanda", + "uk_UA": "Геймпад Nintendo Switch Pro", + "zh_CN": "Pro 手柄", + "zh_TW": "Pro 控制器" + } + }, + { + "ID": "ControllerSettingsControllerTypeJoyConPair", + "Translations": { + "ar_SA": "زوج جوي كون", + "de_DE": "Joy-Con-Paar", + "el_GR": "Ζεύγος JoyCon", + "en_US": "JoyCon Pair", + "es_ES": "Doble Joy-Con", + "fr_FR": "JoyCon Joints", + "he_IL": "ג'ויקון הותאם", + "it_IT": "Coppia di JoyCon", + "ja_JP": "JoyCon ペア", + "ko_KR": "조이콘 페어링", + "no_NO": "JoyCon Par", + "pl_PL": "Para JoyCon-ów", + "pt_BR": "Par de JoyCon", + "ru_RU": "JoyCon (пара)", + "sv_SE": "JoyCon (par)", + "th_TH": "จับคู่ จอยคอน", + "tr_TR": "JoyCon Çifti", + "uk_UA": "Обидва JoyCon", + "zh_CN": "双 JoyCon 手柄", + "zh_TW": "雙 JoyCon" + } + }, + { + "ID": "ControllerSettingsControllerTypeJoyConLeft", + "Translations": { + "ar_SA": "جوي كون اليسار ", + "de_DE": "Linker Joy-Con", + "el_GR": "Αριστερό JoyCon", + "en_US": "JoyCon Left", + "es_ES": "Joy-Con Izquierdo", + "fr_FR": "JoyCon Gauche", + "he_IL": "ג'ויקון שמאלי ", + "it_IT": "JoyCon sinistro", + "ja_JP": "JoyCon 左", + "ko_KR": "좌측 조이콘", + "no_NO": "JoyCon venstre", + "pl_PL": "Lewy JoyCon", + "pt_BR": "JoyCon Esquerdo", + "ru_RU": "JoyCon (левый)", + "sv_SE": "JoyCon vänster", + "th_TH": "จอยคอน ด้านซ้าย", + "tr_TR": "JoyCon Sol", + "uk_UA": "Лівий JoyCon", + "zh_CN": "左 JoyCon 手柄", + "zh_TW": "左 JoyCon" + } + }, + { + "ID": "ControllerSettingsControllerTypeJoyConRight", + "Translations": { + "ar_SA": " جوي كون اليمين", + "de_DE": "Rechter Joy-Con", + "el_GR": "Δεξί JoyCon", + "en_US": "JoyCon Right", + "es_ES": "Joy-Con Derecho", + "fr_FR": "JoyCon Droite", + "he_IL": "ג'ויקון ימני", + "it_IT": "JoyCon destro", + "ja_JP": "JoyCon 右", + "ko_KR": "우측 조이콘", + "no_NO": "JoyCon høyre", + "pl_PL": "Prawy JoyCon", + "pt_BR": "JoyCon Direito", + "ru_RU": "JoyCon (правый)", + "sv_SE": "JoyCon höger", + "th_TH": "จอยคอน ด้านขวา", + "tr_TR": "JoyCon Sağ", + "uk_UA": "Правий JoyCon", + "zh_CN": "右 JoyCon 手柄", + "zh_TW": "右 JoyCon" + } + }, + { + "ID": "ControllerSettingsProfile", + "Translations": { + "ar_SA": "الملف الشخصي", + "de_DE": "Profil", + "el_GR": "Προφίλ", + "en_US": "Profile", + "es_ES": "Perfil", + "fr_FR": "Profil", + "he_IL": "פרופיל", + "it_IT": "Profilo", + "ja_JP": "プロファイル", + "ko_KR": "프로필", + "no_NO": "Profil", + "pl_PL": "Profil", + "pt_BR": "Perfil", + "ru_RU": "Профиль", + "sv_SE": "Profil", + "th_TH": "โปรไฟล์", + "tr_TR": "Profil", + "uk_UA": "Профіль", + "zh_CN": "配置文件", + "zh_TW": "設定檔" + } + }, + { + "ID": "ControllerSettingsProfileDefault", + "Translations": { + "ar_SA": "افتراضي", + "de_DE": "Standard", + "el_GR": "Προκαθορισμένο", + "en_US": "Default", + "es_ES": "Predeterminado", + "fr_FR": "Défaut", + "he_IL": "ברירת המחדל", + "it_IT": "Predefinito", + "ja_JP": "デフォルト", + "ko_KR": "기본", + "no_NO": "Standard", + "pl_PL": "Domyślny", + "pt_BR": "Padrão", + "ru_RU": "По умолчанию", + "sv_SE": "Standard", + "th_TH": "ค่าเริ่มต้น", + "tr_TR": "Varsayılan", + "uk_UA": "Типовий", + "zh_CN": "默认设置", + "zh_TW": "預設" + } + }, + { + "ID": "ControllerSettingsLoad", + "Translations": { + "ar_SA": "تحميل", + "de_DE": "Laden", + "el_GR": "Φόρτωση", + "en_US": "Load", + "es_ES": "Cargar", + "fr_FR": "Charger", + "he_IL": "טעינה", + "it_IT": "Carica", + "ja_JP": "ロード", + "ko_KR": "불러오기", + "no_NO": "Last", + "pl_PL": "Wczytaj", + "pt_BR": "Carregar", + "ru_RU": "Загрузить", + "sv_SE": "Läs in", + "th_TH": "โหลด", + "tr_TR": "Yükle", + "uk_UA": "Завантажити", + "zh_CN": "加载", + "zh_TW": "載入" + } + }, + { + "ID": "ControllerSettingsAdd", + "Translations": { + "ar_SA": "إضافة", + "de_DE": "Hinzufügen", + "el_GR": "Προσθήκη", + "en_US": "Add", + "es_ES": "Agregar", + "fr_FR": "Ajouter", + "he_IL": "הוספה", + "it_IT": "Aggiungi", + "ja_JP": "追加", + "ko_KR": "추가", + "no_NO": "Legg til", + "pl_PL": "Dodaj", + "pt_BR": "Adicionar", + "ru_RU": "Добавить", + "sv_SE": "Lägg till", + "th_TH": "เพิ่ม", + "tr_TR": "Ekle", + "uk_UA": "Додати", + "zh_CN": "新建", + "zh_TW": "新增" + } + }, + { + "ID": "ControllerSettingsModifiedNotification", + "Translations": { + "ar_SA": "(تم التعديل!)", + "de_DE": "(modifiziert!)", + "el_GR": "(τροποποιημένο!)", + "en_US": "(Modified!)", + "es_ES": "(modificado!)", + "fr_FR": "(modifié!)", + "he_IL": "(שונה!)", + "it_IT": "(modificato!)", + "ja_JP": "(変更済み!)", + "ko_KR": "(수정됨!)", + "no_NO": "(modifisert!)", + "pl_PL": "(zmodyfikowane!)", + "pt_BR": "(modificado!)", + "ru_RU": "(изменено!)", + "sv_SE": "(ändrad!)", + "th_TH": "(แก้ไขแล้ว!)", + "tr_TR": "(değiştirildi!)", + "uk_UA": "(модифіковано!)", + "zh_CN": "(已修改!)", + "zh_TW": "(已修改!)" + } + }, + { + "ID": "ControllerSettingsDisableDeviceForSaving", + "Translations": { + "ar_SA": "تم إعداد التحكم.\n\nفي انتظار اتصال وحدة التحكم...", + "de_DE": "Steuerung konfiguriert.\n\nWarten auf die Verbindung des Controllers...", + "el_GR": "Η διαχείριση έχει ρυθμιστεί.\n\nΑναμένεται σύνδεση του χειριστηρίου...", + "en_US": "Control configured.\n\nWaiting for controller connection...", + "es_ES": "Control configurado.\n\nEsperando la conexión del controlador...", + "fr_FR": "Contrôle configuré.\n\nEn attente de la connexion de la manette...", + "he_IL": "השליטה הוגדרה.\n\nממתין לחיבור הבקר...", + "it_IT": "Controllo configurato.\n\nIn attesa della connessione del controller...", + "ja_JP": "コントロールが設定されました。\n\nコントローラーの接続を待っています...", + "ko_KR": "제어가 설정되었습니다.\n\n컨트롤러 연결 대기 중...", + "no_NO": "Kontroll konfigurert.\n\nVenter på tilkobling av kontroller...", + "pl_PL": "Sterowanie skonfigurowane.\n\nOczekiwanie na połączenie kontrolera...", + "pt_BR": "Controle configurado.\n\nAguardando conexão do controle...", + "ru_RU": "Управление настроено.\n\nОжидается подключение контроллера...", + "sv_SE": "Kontroll konfigurerad.\n\nVäntar på anslutning av kontrollen...", + "th_TH": "การควบคุมได้รับการตั้งค่าแล้ว\n\nกำลังรอการเชื่อมต่อคอนโทรลเลอร์...", + "tr_TR": "Kontrol yapılandırıldı.\n\nKontrolcü bağlantısı bekleniyor...", + "uk_UA": "Керування налаштовано.\n\nОчікується підключення контролера...", + "zh_CN": "已配置控制器。\n\n正在等待控制器连接...", + "zh_TW": "控制已設定。\n\n等待控制器連接..." + } + }, + { + "ID": "ControllerSettingsUnlink", + "Translations": { + "ar_SA": "إلغاء الربط", + "de_DE": "Entkoppeln", + "el_GR": "Αποσύνδεση", + "en_US": "Unlink", + "es_ES": "Desvincular", + "fr_FR": "Dissocier", + "he_IL": "ניתוק קישור", + "it_IT": "Scollega", + "ja_JP": "リンク解除", + "ko_KR": "연결 해제", + "no_NO": "Frakoble", + "pl_PL": "Odłącz", + "pt_BR": "Desvincular", + "ru_RU": "Отвязать", + "sv_SE": "Koppla från", + "th_TH": "ยกเลิกการเชื่อมโยง", + "tr_TR": "Bağlantıyı Kes", + "uk_UA": "Відв'язати", + "zh_CN": "取消绑定", + "zh_TW": "解除綁定" + } + }, + { + "ID": "ControllerSettingsRemove", + "Translations": { + "ar_SA": "إزالة", + "de_DE": "Entfernen", + "el_GR": "Αφαίρεση", + "en_US": "Remove", + "es_ES": "Quitar", + "fr_FR": "Supprimer", + "he_IL": "הסר", + "it_IT": "Rimuovi", + "ja_JP": "削除", + "ko_KR": "제거", + "no_NO": "Fjern", + "pl_PL": "Usuń", + "pt_BR": "Remover", + "ru_RU": "Удалить", + "sv_SE": "Ta bort", + "th_TH": "เอาออก", + "tr_TR": "Kaldır", + "uk_UA": "Видалити", + "zh_CN": "删除", + "zh_TW": "刪除" + } + }, + { + "ID": "ControllerSettingsButtons", + "Translations": { + "ar_SA": "الأزرار", + "de_DE": "Aktionstasten", + "el_GR": "Κουμπιά", + "en_US": "Buttons", + "es_ES": "Botones", + "fr_FR": "Boutons", + "he_IL": "כפתורים", + "it_IT": "Pulsanti", + "ja_JP": "ボタン", + "ko_KR": "버튼", + "no_NO": "Knapper", + "pl_PL": "Przyciski", + "pt_BR": "Botões", + "ru_RU": "Кнопки", + "sv_SE": "Handlingsknappar", + "th_TH": "ปุ่มกด", + "tr_TR": "Tuşlar", + "uk_UA": "Кнопки", + "zh_CN": "基础按键", + "zh_TW": "按鍵" + } + }, + { + "ID": "ControllerSettingsButtonA", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "Α", + "en_US": "A", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsButtonB", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "B", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsButtonX", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "X", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsButtonY", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Y", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsButtonPlus", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "+", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsButtonMinus", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "-", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsDPad", + "Translations": { + "ar_SA": "أسهم الاتجاهات", + "de_DE": "Steuerkreuz", + "el_GR": "Κατευθυντικό Pad", + "en_US": "Directional Pad", + "es_ES": "Pad direccional", + "fr_FR": "Croix directionnelle", + "he_IL": "כפתורי כיוונים", + "it_IT": "Croce direzionale", + "ja_JP": "十字キー", + "ko_KR": "방향키", + "no_NO": "Retningsfelt", + "pl_PL": "Krzyżak (D-Pad)", + "pt_BR": "Direcional (D-Pad)", + "ru_RU": "Кнопки направления (D-pad)", + "sv_SE": "Riktningsknappar", + "th_TH": "ปุ่มลูกศร", + "tr_TR": "Yön Tuşları", + "uk_UA": "Панель направлення", + "zh_CN": "方向键", + "zh_TW": "方向鍵" + } + }, + { + "ID": "ControllerSettingsDPadUp", + "Translations": { + "ar_SA": "اعلى", + "de_DE": "Hoch", + "el_GR": "Πάνω", + "en_US": "Up", + "es_ES": "Arriba", + "fr_FR": "Haut", + "he_IL": "מעלה", + "it_IT": "Su", + "ja_JP": "上", + "ko_KR": "↑", + "no_NO": "Opp", + "pl_PL": "Góra", + "pt_BR": "Cima", + "ru_RU": "Вверх", + "sv_SE": "Upp", + "th_TH": "ขึ้น", + "tr_TR": "Yukarı", + "uk_UA": "Вгору", + "zh_CN": "上", + "zh_TW": "上" + } + }, + { + "ID": "ControllerSettingsDPadDown", + "Translations": { + "ar_SA": "أسفل", + "de_DE": "Runter", + "el_GR": "Κάτω", + "en_US": "Down", + "es_ES": "Abajo", + "fr_FR": "Bas", + "he_IL": "מטה", + "it_IT": "Giù", + "ja_JP": "下", + "ko_KR": "↓", + "no_NO": "Ned", + "pl_PL": "Dół", + "pt_BR": "Baixo", + "ru_RU": "Вниз", + "sv_SE": "Ner", + "th_TH": "ลง", + "tr_TR": "Aşağı", + "uk_UA": "Вниз", + "zh_CN": "下", + "zh_TW": "下" + } + }, + { + "ID": "ControllerSettingsDPadLeft", + "Translations": { + "ar_SA": "يسار", + "de_DE": "Links", + "el_GR": "Αριστερά", + "en_US": "Left", + "es_ES": "Izquierda", + "fr_FR": "Gauche", + "he_IL": "שמאלה", + "it_IT": "Sinistra", + "ja_JP": "左", + "ko_KR": "←", + "no_NO": "Venstre", + "pl_PL": "Lewo", + "pt_BR": "Esquerda", + "ru_RU": "Влево", + "sv_SE": "Vänster", + "th_TH": "ซ้าย", + "tr_TR": "Sol", + "uk_UA": "Вліво", + "zh_CN": "左", + "zh_TW": "左" + } + }, + { + "ID": "ControllerSettingsDPadRight", + "Translations": { + "ar_SA": "يمين", + "de_DE": "Rechts", + "el_GR": "Δεξιά", + "en_US": "Right", + "es_ES": "Derecha", + "fr_FR": "Droite", + "he_IL": "ימינה", + "it_IT": "Destra", + "ja_JP": "右", + "ko_KR": "→", + "no_NO": "Høyre", + "pl_PL": "Prawo", + "pt_BR": "Direita", + "ru_RU": "Вправо", + "sv_SE": "Höger", + "th_TH": "ขวา", + "tr_TR": "Sağ", + "uk_UA": "Вправо", + "zh_CN": "右", + "zh_TW": "右" + } + }, + { + "ID": "ControllerSettingsStickButton", + "Translations": { + "ar_SA": "زر", + "de_DE": "", + "el_GR": "Κουμπί", + "en_US": "Button", + "es_ES": "Botón", + "fr_FR": "Bouton", + "he_IL": "כפתור", + "it_IT": "Pulsante", + "ja_JP": "ボタン", + "ko_KR": "버튼", + "no_NO": "Knapp", + "pl_PL": "Przycisk", + "pt_BR": "Botão", + "ru_RU": "Нажатие на стик", + "sv_SE": "Knapp", + "th_TH": "ปุ่ม", + "tr_TR": "Tuş", + "uk_UA": "Кнопка", + "zh_CN": "按下摇杆", + "zh_TW": "搖桿按鍵" + } + }, + { + "ID": "ControllerSettingsStickUp", + "Translations": { + "ar_SA": "فوق", + "de_DE": "Hoch", + "el_GR": "Πάνω", + "en_US": "Up", + "es_ES": "Arriba", + "fr_FR": "Haut", + "he_IL": "למעלה", + "it_IT": "Su", + "ja_JP": "上", + "ko_KR": "↑", + "no_NO": "Opp", + "pl_PL": "Góra ", + "pt_BR": "Cima", + "ru_RU": "Вверх", + "sv_SE": "Upp", + "th_TH": "ขึ้น", + "tr_TR": "Yukarı", + "uk_UA": "Уверх", + "zh_CN": "上", + "zh_TW": "上" + } + }, + { + "ID": "ControllerSettingsStickDown", + "Translations": { + "ar_SA": "أسفل", + "de_DE": "Runter", + "el_GR": "Κάτω", + "en_US": "Down", + "es_ES": "Abajo", + "fr_FR": "Bas", + "he_IL": "למטה", + "it_IT": "Giù", + "ja_JP": "下", + "ko_KR": "↓", + "no_NO": "Ned", + "pl_PL": "Dół ", + "pt_BR": "Baixo", + "ru_RU": "Вниз", + "sv_SE": "Ner", + "th_TH": "ลง", + "tr_TR": "Aşağı", + "uk_UA": "Униз", + "zh_CN": "下", + "zh_TW": "下" + } + }, + { + "ID": "ControllerSettingsStickLeft", + "Translations": { + "ar_SA": "يسار", + "de_DE": "Links", + "el_GR": "Αριστερά", + "en_US": "Left", + "es_ES": "Izquierda", + "fr_FR": "Gauche", + "he_IL": "שמאלה", + "it_IT": "Sinistra", + "ja_JP": "左", + "ko_KR": "←", + "no_NO": "Venstre", + "pl_PL": "Lewo", + "pt_BR": "Esquerda", + "ru_RU": "Влево", + "sv_SE": "Vänster", + "th_TH": "ซ้าย", + "tr_TR": "Sol", + "uk_UA": "Ліворуч", + "zh_CN": "左", + "zh_TW": "左" + } + }, + { + "ID": "ControllerSettingsStickRight", + "Translations": { + "ar_SA": "يمين", + "de_DE": "Rechts", + "el_GR": "Δεξιά", + "en_US": "Right", + "es_ES": "Derecha", + "fr_FR": "Droite", + "he_IL": "ימינה", + "it_IT": "Destra", + "ja_JP": "右", + "ko_KR": "→", + "no_NO": "Høyre", + "pl_PL": "Prawo", + "pt_BR": "Direita", + "ru_RU": "Вправо", + "sv_SE": "Höger", + "th_TH": "ขวา", + "tr_TR": "Sağ", + "uk_UA": "Праворуч", + "zh_CN": "右", + "zh_TW": "右" + } + }, + { + "ID": "ControllerSettingsStickStick", + "Translations": { + "ar_SA": "عصا", + "de_DE": "", + "el_GR": "Μοχλός", + "en_US": "Stick", + "es_ES": "Palanca", + "fr_FR": "Joystick", + "he_IL": "סטיק", + "it_IT": "Levetta", + "ja_JP": "スティック", + "ko_KR": "스틴", + "no_NO": "Styrespak", + "pl_PL": "Gałka", + "pt_BR": "Analógico", + "ru_RU": "Стик", + "sv_SE": "Spak", + "th_TH": "จอยสติ๊ก", + "tr_TR": "Analog", + "uk_UA": "Стик", + "zh_CN": "摇杆", + "zh_TW": "搖桿" + } + }, + { + "ID": "ControllerSettingsStickInvertXAxis", + "Translations": { + "ar_SA": "عكس عرض العصا", + "de_DE": "X-Achse invertieren", + "el_GR": "Αντιστροφή Μοχλού X", + "en_US": "Invert Stick X", + "es_ES": "Invertir eje X", + "fr_FR": "Inverser l'axe X", + "he_IL": "הפיכת הX של הסטיק", + "it_IT": "Inverti levetta X", + "ja_JP": "X軸を反転", + "ko_KR": "스틱 X축 반전", + "no_NO": "Inverter Styrespak X", + "pl_PL": "Odwróć gałkę X", + "pt_BR": "Inverter Eixo X", + "ru_RU": "Инвертировать ось X", + "sv_SE": "Invertera Spak X", + "th_TH": "กลับทิศทางของแกน X", + "tr_TR": "X Eksenini Tersine Çevir", + "uk_UA": "Обернути вісь стику X", + "zh_CN": "摇杆左右反转", + "zh_TW": "搖桿左右反向" + } + }, + { + "ID": "ControllerSettingsStickInvertYAxis", + "Translations": { + "ar_SA": "عكس أفق العصا", + "de_DE": "Y-Achse invertieren", + "el_GR": "Αντιστροφή Μοχλού Y", + "en_US": "Invert Stick Y", + "es_ES": "Invertir eje Y", + "fr_FR": "Inverser l'axe Y", + "he_IL": "הפיכת הY של הסטיק", + "it_IT": "Inverti levetta Y", + "ja_JP": "Y軸を反転", + "ko_KR": "스틱 Y축 반전", + "no_NO": "Inverter Styrespak Y", + "pl_PL": "Odwróć gałkę Y", + "pt_BR": "Inverter Eixo Y", + "ru_RU": "Инвертировать ось Y", + "sv_SE": "Invertera Spak Y", + "th_TH": "กลับทิศทางของแกน Y", + "tr_TR": "Y Eksenini Tersine Çevir", + "uk_UA": "Обернути вісь стику Y", + "zh_CN": "摇杆上下反转", + "zh_TW": "搖桿上下反向" + } + }, + { + "ID": "ControllerSettingsStickDeadzone", + "Translations": { + "ar_SA": "المنطقة الميتة:", + "de_DE": "", + "el_GR": "Νεκρή Ζώνη:", + "en_US": "Deadzone:", + "es_ES": "Zona muerta:", + "fr_FR": "Zone morte :", + "he_IL": "שטח מת:", + "it_IT": "Zona morta:", + "ja_JP": "遊び:", + "ko_KR": "데드존 :", + "no_NO": "Død sone:", + "pl_PL": "Martwa strefa:", + "pt_BR": "Zona Morta:", + "ru_RU": "Мёртвая зона:", + "sv_SE": "Dödläge:", + "th_TH": "โซนที่ไม่ทำงานของ จอยสติ๊ก:", + "tr_TR": "Ölü Bölge", + "uk_UA": "Мертва зона:", + "zh_CN": "死区:", + "zh_TW": "無感帶:" + } + }, + { + "ID": "ControllerSettingsLStick", + "Translations": { + "ar_SA": "العصا اليسرى", + "de_DE": "Linker Analogstick", + "el_GR": "Αριστερός Μοχλός", + "en_US": "Left Stick", + "es_ES": "Palanca izquierda", + "fr_FR": "Joystick Gauche", + "he_IL": "מקל שמאלי", + "it_IT": "Levetta sinistra", + "ja_JP": "左スティック", + "ko_KR": "좌측 스틱", + "no_NO": "Venstre styrespak", + "pl_PL": "Lewa Gałka", + "pt_BR": "Analógico Esquerdo", + "ru_RU": "Левый стик", + "sv_SE": "Vänster spak", + "th_TH": "จอยสติ๊ก ด้านซ้าย", + "tr_TR": "Sol Analog", + "uk_UA": "Лівий джойстик", + "zh_CN": "左摇杆", + "zh_TW": "左搖桿" + } + }, + { + "ID": "ControllerSettingsRStick", + "Translations": { + "ar_SA": "العصا اليمنى", + "de_DE": "Rechter Analogstick", + "el_GR": "Δεξιός Μοχλός", + "en_US": "Right Stick", + "es_ES": "Palanca derecha", + "fr_FR": "Joystick Droit", + "he_IL": "מקל ימני", + "it_IT": "Levetta destra", + "ja_JP": "右スティック", + "ko_KR": "우측 스틱", + "no_NO": "Høyre styrespak", + "pl_PL": "Prawa Gałka", + "pt_BR": "Analógico Direito", + "ru_RU": "Правый стик", + "sv_SE": "Höger spak", + "th_TH": "จอยสติ๊ก ด้านขวา", + "tr_TR": "Sağ Analog", + "uk_UA": "Правий джойстик", + "zh_CN": "右摇杆", + "zh_TW": "右搖桿" + } + }, + { + "ID": "ControllerSettingsTriggersLeft", + "Translations": { + "ar_SA": "الأزندة اليسرى", + "de_DE": "Linker Trigger", + "el_GR": "Αριστερή Σκανδάλη", + "en_US": "Triggers Left", + "es_ES": "Gatillos izquierdos", + "fr_FR": "Gâchettes Gauche", + "he_IL": "הדק שמאלי", + "it_IT": "Grilletto sinistro", + "ja_JP": "左トリガー", + "ko_KR": "좌측 트리거", + "no_NO": "Utløsere venstre", + "pl_PL": "Lewe Triggery", + "pt_BR": "Gatilho Esquerda", + "ru_RU": "Триггеры слева", + "sv_SE": "Avtryckare vänster", + "th_TH": "ทริกเกอร์ ด้านซ้าย", + "tr_TR": "Tetikler Sol", + "uk_UA": "Тригери ліворуч", + "zh_CN": "左扳机", + "zh_TW": "左扳機" + } + }, + { + "ID": "ControllerSettingsTriggersRight", + "Translations": { + "ar_SA": "الأزندة اليمني", + "de_DE": "Rechter Trigger", + "el_GR": "Δεξιά Σκανδάλη", + "en_US": "Triggers Right", + "es_ES": "Gatillos derechos", + "fr_FR": "Gâchettes Droite", + "he_IL": "הדק ימני", + "it_IT": "Grilletto destro", + "ja_JP": "右トリガー", + "ko_KR": "우측 트리거", + "no_NO": "Utløsere høyre", + "pl_PL": "Prawe Triggery", + "pt_BR": "Gatilho Direita", + "ru_RU": "Триггеры справа", + "sv_SE": "Avtryckare höger", + "th_TH": "ทริกเกอร์ ด้านขวา", + "tr_TR": "Tetikler Sağ", + "uk_UA": "Тригери праворуч", + "zh_CN": "右扳机", + "zh_TW": "右扳機" + } + }, + { + "ID": "ControllerSettingsTriggersButtonsLeft", + "Translations": { + "ar_SA": "أزرار الزناد اليسرى", + "de_DE": "Linke Schultertaste", + "el_GR": "Αριστερά Κουμπιά Σκανδάλης", + "en_US": "Trigger Buttons Left", + "es_ES": "Botones de gatillo izquierdos", + "fr_FR": "Boutons Gâchettes Gauche", + "he_IL": "כפתור הדק שמאלי", + "it_IT": "Pulsante dorsale sinistro", + "ja_JP": "左トリガーボタン", + "ko_KR": "좌측 트리거 버튼", + "no_NO": "Utløserknapper Venstre", + "pl_PL": "Lewe Przyciski Triggerów", + "pt_BR": "Botões de Gatilho da Esquerda", + "ru_RU": "Триггерные кнопки слева", + "sv_SE": "Avtryckare knappar vänster", + "th_TH": "ปุ่มทริกเกอร์ ด้านซ้าย", + "tr_TR": "Tetik Tuşları Sol", + "uk_UA": "Кнопки тригерів ліворуч", + "zh_CN": "左扳机键", + "zh_TW": "左扳機鍵" + } + }, + { + "ID": "ControllerSettingsTriggersButtonsRight", + "Translations": { + "ar_SA": "أزرار الزناد اليمنى", + "de_DE": "Rechte Schultertaste", + "el_GR": "Δεξιά Κουμπιά Σκανδάλης", + "en_US": "Trigger Buttons Right", + "es_ES": "Botones de gatillo derechos", + "fr_FR": "Boutons Gâchettes Droite", + "he_IL": "כפתור הדק ימני", + "it_IT": "Pulsante dorsale destro", + "ja_JP": "右トリガーボタン", + "ko_KR": "우측 트리거 버튼", + "no_NO": "Utløserknapper høyre", + "pl_PL": "Prawe Przyciski Triggerów", + "pt_BR": "Botões de Gatilho da Direita", + "ru_RU": "Триггерные кнопки справа", + "sv_SE": "Avtryckare knappar höger", + "th_TH": "ปุ่มทริกเกอร์ ด้านขวา", + "tr_TR": "Tetik Tuşları Sağ", + "uk_UA": "Кнопки тригерів праворуч", + "zh_CN": "右扳机键", + "zh_TW": "右扳機鍵" + } + }, + { + "ID": "ControllerSettingsTriggers", + "Translations": { + "ar_SA": "أزندة", + "de_DE": "Trigger", + "el_GR": "Σκανδάλες", + "en_US": "Triggers", + "es_ES": "Gatillos", + "fr_FR": "Gâchettes", + "he_IL": "הדקים", + "it_IT": "Grilletti", + "ja_JP": "トリガー", + "ko_KR": "트리거", + "no_NO": "Utløsere", + "pl_PL": "Triggery", + "pt_BR": "Gatilhos", + "ru_RU": "Триггеры", + "sv_SE": "Avtryckare", + "th_TH": "ทริกเกอร์", + "tr_TR": "Tetikler", + "uk_UA": "Тригери", + "zh_CN": "扳机", + "zh_TW": "板機" + } + }, + { + "ID": "ControllerSettingsTriggerL", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "L", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsTriggerR", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "R", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsTriggerZL", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "ZL", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsTriggerZR", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "ZR", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsLeftSL", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "SL", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsLeftSR", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "SR", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsRightSL", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "SL", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsRightSR", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "SR", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsExtraButtonsLeft", + "Translations": { + "ar_SA": "الأزرار اليسار", + "de_DE": "Linke Aktionstasten", + "el_GR": "Αριστερά Κουμπιά", + "en_US": "Buttons Left", + "es_ES": "Botones izquierdos", + "fr_FR": "Boutons Gauche", + "he_IL": "כפתורים משמאל", + "it_IT": "Tasto sinistro", + "ja_JP": "左ボタン", + "ko_KR": "좌측 버튼", + "no_NO": "Knapper til venstre", + "pl_PL": "Lewe Przyciski", + "pt_BR": "Botões da Esquerda", + "ru_RU": "Левые кнопки", + "sv_SE": "Knappar vänster", + "th_TH": "ปุ่มกดเสริม ด้านซ้าย", + "tr_TR": "Tuşlar Sol", + "uk_UA": "Кнопки ліворуч", + "zh_CN": "左背键", + "zh_TW": "左背鍵" + } + }, + { + "ID": "ControllerSettingsExtraButtonsRight", + "Translations": { + "ar_SA": "الأزرار اليمين", + "de_DE": "Rechte Aktionstasten", + "el_GR": "Δεξιά Κουμπιά", + "en_US": "Buttons Right", + "es_ES": "Botones derechos", + "fr_FR": "Boutons Droite", + "he_IL": "כפתורים מימין", + "it_IT": "Tasto destro", + "ja_JP": "右ボタン", + "ko_KR": "우측 버튼", + "no_NO": "Knapper til høyre", + "pl_PL": "Prawe Przyciski", + "pt_BR": "Botões da Direita", + "ru_RU": "Правые кнопки", + "sv_SE": "Knappar höger", + "th_TH": "ปุ่มกดเสริม ด้านขวา", + "tr_TR": "Tuşlar Sağ", + "uk_UA": "Кнопки праворуч", + "zh_CN": "右背键", + "zh_TW": "右背鍵" + } + }, + { + "ID": "ControllerSettingsMisc", + "Translations": { + "ar_SA": "إعدادات إضافية", + "de_DE": "Verschiedenes", + "el_GR": "Διάφορα", + "en_US": "Miscellaneous", + "es_ES": "Misceláneo", + "fr_FR": "Divers", + "he_IL": "שונות", + "it_IT": "Varie", + "ja_JP": "その他", + "ko_KR": "기타", + "no_NO": "Diverse", + "pl_PL": "Różne", + "pt_BR": "Miscelâneas", + "ru_RU": "Разное", + "sv_SE": "Diverse", + "th_TH": "การควบคุมเพิ่มเติม", + "tr_TR": "Diğer", + "uk_UA": "Різне", + "zh_CN": "其他", + "zh_TW": "其他" + } + }, + { + "ID": "ControllerSettingsTriggerThreshold", + "Translations": { + "ar_SA": "قوة التحفيز:", + "de_DE": "Empfindlichkeit:", + "el_GR": "Κατώφλι Σκανδάλης:", + "en_US": "Trigger Threshold:", + "es_ES": "Límite de gatillos:", + "fr_FR": "Seuil de déclenchement :", + "he_IL": "סף הדק:", + "it_IT": "Sensibilità dei grilletti:", + "ja_JP": "トリガーしきい値:", + "ko_KR": "트리거 임계값 :", + "no_NO": "Utløser terskel:", + "pl_PL": "Próg Triggerów:", + "pt_BR": "Sensibilidade do Gatilho:", + "ru_RU": "Порог срабатывания:", + "sv_SE": "Tröskelvärde avtryckare:", + "th_TH": "ตั้งค่าขีดจำกัดการกด:", + "tr_TR": "Tetik Eşiği:", + "uk_UA": "Поріг спрацьовування:", + "zh_CN": "扳机阈值:", + "zh_TW": "扳機閾值:" + } + }, + { + "ID": "ControllerSettingsMotion", + "Translations": { + "ar_SA": "الحركة", + "de_DE": "Bewegung", + "el_GR": "Κίνηση", + "en_US": "Motion", + "es_ES": "Movimiento", + "fr_FR": "Mouvements", + "he_IL": "תנועה", + "it_IT": "Movimento", + "ja_JP": "モーション", + "ko_KR": "모션", + "no_NO": "Bevegelse", + "pl_PL": "Ruch", + "pt_BR": "Sensor de Movimento", + "ru_RU": "Движение", + "sv_SE": "Rörelse", + "th_TH": "การเคลื่อนไหว", + "tr_TR": "Hareket", + "uk_UA": "Рух", + "zh_CN": "体感", + "zh_TW": "體感" + } + }, + { + "ID": "ControllerSettingsMotionUseCemuhookCompatibleMotion", + "Translations": { + "ar_SA": "استخدام الحركة المتوافقة مع CemuHook", + "de_DE": "CemuHook kompatible Bewegungssteuerung", + "el_GR": "Κίνηση συμβατή με CemuHook", + "en_US": "Use CemuHook compatible motion", + "es_ES": "Usar movimiento compatible con CemuHook", + "fr_FR": "Utiliser la détection de mouvements compatible CemuHook", + "he_IL": "השתמש בתנועת CemuHook תואמת ", + "it_IT": "Usa sensore compatibile con CemuHook", + "ja_JP": "CemuHook 互換モーションを使用", + "ko_KR": "CemuHook 호환 모션 사용", + "no_NO": "Bruk CemuHook kompatibel bevegelse", + "pl_PL": "Użyj ruchu zgodnego z CemuHook", + "pt_BR": "Usar Sensor Compatível com CemuHook", + "ru_RU": "Включить совместимость с CemuHook", + "sv_SE": "Använd CemuHook-kompatibel rörelse", + "th_TH": "ใช้การเคลื่อนไหวที่เข้ากันได้กับ CemuHook", + "tr_TR": "CemuHook uyumlu hareket kullan", + "uk_UA": "Використовувати рух, сумісний з CemuHook", + "zh_CN": "使用 CemuHook 兼容的体感协议", + "zh_TW": "使用與 CemuHook 相容的體感" + } + }, + { + "ID": "ControllerSettingsMotionControllerSlot", + "Translations": { + "ar_SA": "خانة وحدة التحكم:", + "de_DE": "Controller-Slot:", + "el_GR": "Υποδοχή Χειριστηρίου:", + "en_US": "Controller Slot:", + "es_ES": "Puerto del mando:", + "fr_FR": "Contrôleur ID :", + "he_IL": "מיקום שלט", + "it_IT": "Slot del controller:", + "ja_JP": "コントローラ スロット:", + "ko_KR": "컨트롤러 슬롯 :", + "no_NO": "Kontrollertype:", + "pl_PL": "Slot Kontrolera:", + "pt_BR": "Slot do Controle:", + "ru_RU": "Слот контроллера:", + "sv_SE": "Kontrollerplats:", + "th_TH": "ช่องเสียบ คอนโทรลเลอร์:", + "tr_TR": "Kumanda Yuvası:", + "uk_UA": "Слот контролера:", + "zh_CN": "手柄槽位:", + "zh_TW": "控制器插槽:" + } + }, + { + "ID": "ControllerSettingsMotionMirrorInput", + "Translations": { + "ar_SA": "إعادة الإدخال", + "de_DE": "Eingabe spiegeln", + "el_GR": "Καθρεπτισμός Χειρισμού", + "en_US": "Mirror Input", + "es_ES": "Paralelizar derecho e izquierdo", + "fr_FR": "Inverser les contrôles", + "he_IL": "קלט מראה", + "it_IT": "Input specchiato", + "ja_JP": "入力反転", + "ko_KR": "미러 입력", + "no_NO": "Speilvend", + "pl_PL": "Odzwierciedlaj Sterowanie", + "pt_BR": "Espelhar Movimento", + "ru_RU": "Зеркальный ввод", + "sv_SE": "Spegla inmatning", + "th_TH": "นำเข้าการสะท้อน การควบคุม", + "tr_TR": "Girişi Aynala", + "uk_UA": "Дзеркальний вхід", + "zh_CN": "镜像操作", + "zh_TW": "鏡像輸入" + } + }, + { + "ID": "ControllerSettingsMotionRightJoyConSlot", + "Translations": { + "ar_SA": "خانة جويكون اليمين :", + "de_DE": "Rechter Joy-Con-Slot:", + "el_GR": "Δεξιά Υποδοχή JoyCon:", + "en_US": "Right JoyCon Slot:", + "es_ES": "Puerto del Joy-Con derecho:", + "fr_FR": "JoyCon Droit ID :", + "he_IL": "מיקום ג'ויקון ימני", + "it_IT": "Slot JoyCon destro:", + "ja_JP": "JoyCon 右 スロット:", + "ko_KR": "우측 조이콘 슬롯:", + "no_NO": "Høyre JoyCon set:", + "pl_PL": "Prawy Slot JoyCon:", + "pt_BR": "Slot do JoyCon Direito:", + "ru_RU": "Слот правого JoyCon:", + "sv_SE": "Höger JoyCon-plats:", + "th_TH": "ช่องเสียบ จอยคอน ด้านขวา:", + "tr_TR": "Sağ JoyCon Yuvası:", + "uk_UA": "Правий слот JoyCon:", + "zh_CN": "右 JoyCon 槽位:", + "zh_TW": "右 JoyCon 插槽:" + } + }, + { + "ID": "ControllerSettingsMotionServerHost", + "Translations": { + "ar_SA": "مضيف الخادم:", + "de_DE": "", + "el_GR": "Κεντρικός Υπολογιστής Διακομιστή:", + "en_US": "Server Host:", + "es_ES": "Host del servidor:", + "fr_FR": "Serveur d'hébergement :", + "he_IL": "מארח השרת:", + "it_IT": "Server:", + "ja_JP": "サーバ:", + "ko_KR": "서버 호스트 :", + "no_NO": "Server Vert:", + "pl_PL": "Host Serwera:", + "pt_BR": "Endereço do Servidor:", + "ru_RU": "Хост сервера:", + "sv_SE": "Servervärd:", + "th_TH": "เจ้าของเซิร์ฟเวอร์:", + "tr_TR": "Sunucu Sahibi:", + "uk_UA": "Хост сервера:", + "zh_CN": "服务器地址:", + "zh_TW": "伺服器主機位址:" + } + }, + { + "ID": "ControllerSettingsMotionGyroSensitivity", + "Translations": { + "ar_SA": "حساسية مستشعر الحركة:", + "de_DE": "Gyro-Empfindlichkeit:", + "el_GR": "Ευαισθησία Γυροσκοπίου:", + "en_US": "Gyro Sensitivity:", + "es_ES": "Sensibilidad de Gyro:", + "fr_FR": "Sensibilitée du gyroscope :", + "he_IL": "רגישות ג'ירוסקופ:", + "it_IT": "Sensibilità del giroscopio:", + "ja_JP": "ジャイロ感度:", + "ko_KR": "자이로 감도 :", + "no_NO": "Gyro følsomhet:", + "pl_PL": "Czułość Żyroskopu:", + "pt_BR": "Sensibilidade do Giroscópio:", + "ru_RU": "Чувствительность гироскопа:", + "sv_SE": "Känslighet för gyro:", + "th_TH": "ความไวของ Gyro:", + "tr_TR": "Gyro Hassasiyeti:", + "uk_UA": "Чутливість гіроскопа:", + "zh_CN": "陀螺仪敏感度:", + "zh_TW": "陀螺儀靈敏度:" + } + }, + { + "ID": "ControllerSettingsMotionGyroDeadzone", + "Translations": { + "ar_SA": "منطقة مستشعر الحركة الميتة:", + "de_DE": "Gyro-Deadzone:", + "el_GR": "Νεκρή Ζώνη Γυροσκοπίου:", + "en_US": "Gyro Deadzone:", + "es_ES": "Zona muerta de Gyro:", + "fr_FR": "Zone morte du gyroscope :", + "he_IL": "שטח מת של הג'ירוסקופ:", + "it_IT": "Zona morta del giroscopio:", + "ja_JP": "ジャイロ遊び:", + "ko_KR": "자이로 데드존 :", + "no_NO": "Gyro Dødsone:", + "pl_PL": "Deadzone Żyroskopu:", + "pt_BR": "Zona Morta do Giroscópio:", + "ru_RU": "Мертвая зона гироскопа:", + "sv_SE": "Dödläge för gyro:", + "th_TH": "ส่วนไม่ทำงานของ Gyro:", + "tr_TR": "Gyro Ölü Bölgesi:", + "uk_UA": "Мертва зона гіроскопа:", + "zh_CN": "陀螺仪死区:", + "zh_TW": "陀螺儀無感帶:" + } + }, + { + "ID": "ControllerSettingsLed", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "LED", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "LED-подсветка", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "LED-підсвітка", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "ControllerSettingsLedColorDisable", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Disable", + "es_ES": "", + "fr_FR": "Désactiver", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "비활성화", + "no_NO": "Deaktiver", + "pl_PL": "", + "pt_BR": "Desabilitar", + "ru_RU": "Отключить", + "sv_SE": "Inaktivera", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вимкнути", + "zh_CN": "关闭", + "zh_TW": "關閉" + } + }, + { + "ID": "ControllerSettingsLedColorRainbow", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Rainbow", + "es_ES": "", + "fr_FR": "Arc-en-ciel", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "레인보우", + "no_NO": "Regnbue", + "pl_PL": "", + "pt_BR": "Arco-íris", + "ru_RU": "Радужная", + "sv_SE": "Regnbåge", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Веселка", + "zh_CN": "彩虹", + "zh_TW": "彩虹" + } + }, + { + "ID": "ControllerSettingsLedColorRainbowSpeed", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Rainbow Speed", + "es_ES": "", + "fr_FR": "Vitesse des couleurs", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "레인보우 속도", + "no_NO": "Regnbue Hastighet", + "pl_PL": "", + "pt_BR": "Velocidade do Arco-íris", + "ru_RU": "Скорость переливания", + "sv_SE": "Regnbågshastighet", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Швидкість зміни кольорів", + "zh_CN": "彩虹滚动速度", + "zh_TW": "彩虹滾動速度" + } + }, + { + "ID": "ControllerSettingsLedColor", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Color", + "es_ES": "", + "fr_FR": "Couleur", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "색상", + "no_NO": "Farge", + "pl_PL": "", + "pt_BR": "Cor", + "ru_RU": "Цвет", + "sv_SE": "Färg", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Колір", + "zh_CN": "颜色", + "zh_TW": "顏色" + } + }, + { + "ID": "ControllerSettingsSave", + "Translations": { + "ar_SA": "حفظ", + "de_DE": "Speichern", + "el_GR": "Αποθήκευση", + "en_US": "Save", + "es_ES": "Guardar", + "fr_FR": "Enregistrer", + "he_IL": "שמירה", + "it_IT": "Salva", + "ja_JP": "セーブ", + "ko_KR": "저장", + "no_NO": "Lagre", + "pl_PL": "Zapisz", + "pt_BR": "Salvar", + "ru_RU": "Сохранить", + "sv_SE": "Spara", + "th_TH": "บันทึก", + "tr_TR": "Kaydet", + "uk_UA": "Зберегти", + "zh_CN": "保存", + "zh_TW": "儲存" + } + }, + { + "ID": "ControllerSettingsClose", + "Translations": { + "ar_SA": "إغلاق", + "de_DE": "Schließen", + "el_GR": "Κλείσιμο", + "en_US": "Close", + "es_ES": "Cerrar", + "fr_FR": "Fermer", + "he_IL": "סגירה", + "it_IT": "Chiudi", + "ja_JP": "閉じる", + "ko_KR": "닫기", + "no_NO": "Lukk", + "pl_PL": "Zamknij", + "pt_BR": "Fechar", + "ru_RU": "Закрыть", + "sv_SE": "Stäng", + "th_TH": "ปิด", + "tr_TR": "Kapat", + "uk_UA": "Закрити", + "zh_CN": "关闭", + "zh_TW": "關閉" + } + }, + { + "ID": "KeyUnknown", + "Translations": { + "ar_SA": "مجهول", + "de_DE": "Unbekannt", + "el_GR": "", + "en_US": "Unknown", + "es_ES": "Desconocido", + "fr_FR": "Inconnu", + "he_IL": "", + "it_IT": "Sconosciuto", + "ja_JP": "", + "ko_KR": "알 수 없음", + "no_NO": "Ukjent", + "pl_PL": "", + "pt_BR": "Desconhecido", + "ru_RU": "Неизвестно", + "sv_SE": "Okänd", + "th_TH": "ไม่รู้จัก", + "tr_TR": "", + "uk_UA": "Невизначено", + "zh_CN": "未知", + "zh_TW": "未知" + } + }, + { + "ID": "KeyShiftLeft", + "Translations": { + "ar_SA": "زر ‫Shift الأيسر", + "de_DE": "", + "el_GR": "", + "en_US": "Shift Left", + "es_ES": "", + "fr_FR": "Maj Gauche", + "he_IL": "", + "it_IT": "Maiusc sinistro", + "ja_JP": "", + "ko_KR": "좌측 Shift", + "no_NO": "Skift venstre", + "pl_PL": "", + "pt_BR": "Shift Esquerdo", + "ru_RU": "Левый Shift", + "sv_SE": "Skift vänster", + "th_TH": "", + "tr_TR": "Sol Shift", + "uk_UA": "Shift Лівий", + "zh_CN": "左侧Shift", + "zh_TW": "左 Shift" + } + }, + { + "ID": "KeyShiftRight", + "Translations": { + "ar_SA": "زر ‫Shift الأيمن", + "de_DE": "", + "el_GR": "", + "en_US": "Shift Right", + "es_ES": "", + "fr_FR": "Maj Droite", + "he_IL": "", + "it_IT": "Maiusc destro", + "ja_JP": "", + "ko_KR": "우측 Shift", + "no_NO": "Skift høyre", + "pl_PL": "", + "pt_BR": "Shift Direito", + "ru_RU": "Правый Shift", + "sv_SE": "Skift höger", + "th_TH": "", + "tr_TR": "Sağ Shift", + "uk_UA": "Shift Правий", + "zh_CN": "右侧Shift", + "zh_TW": "右 Shift" + } + }, + { + "ID": "KeyControlLeft", + "Translations": { + "ar_SA": "زر ‫Ctrl الأيسر", + "de_DE": "", + "el_GR": "", + "en_US": "Ctrl Left", + "es_ES": "", + "fr_FR": "Ctrl Gauche", + "he_IL": "", + "it_IT": "Ctrl sinistro", + "ja_JP": "", + "ko_KR": "좌측 Ctrl", + "no_NO": "Ctrl venstre", + "pl_PL": "", + "pt_BR": "Ctrl Esquerdo", + "ru_RU": "Левый Ctrl", + "sv_SE": "Ctrl vänster", + "th_TH": "", + "tr_TR": "Sol Ctrl", + "uk_UA": "Ctrl Лівий", + "zh_CN": "左侧Ctrl", + "zh_TW": "左 Ctrl" + } + }, + { + "ID": "KeyMacControlLeft", + "Translations": { + "ar_SA": "زر ⌃ الأيسر", + "de_DE": "", + "el_GR": "", + "en_US": "⌃ Left", + "es_ES": "", + "fr_FR": "⌃ Gauche", + "he_IL": "", + "it_IT": "⌃ sinistro", + "ja_JP": "", + "ko_KR": "좌측 ⌃", + "no_NO": "⌃ Venstre", + "pl_PL": "", + "pt_BR": "⌃ Esquerda", + "ru_RU": "Левый ⌃", + "sv_SE": "^ Vänster", + "th_TH": "", + "tr_TR": "⌃ Sol", + "uk_UA": "⌃ Лівий", + "zh_CN": "左侧⌃", + "zh_TW": "左 ⌃" + } + }, + { + "ID": "KeyControlRight", + "Translations": { + "ar_SA": "زر ‫Ctrl الأيمن", + "de_DE": "", + "el_GR": "", + "en_US": "Ctrl Right", + "es_ES": "", + "fr_FR": "Ctrl Droite", + "he_IL": "", + "it_IT": "Ctrl destro", + "ja_JP": "", + "ko_KR": "우측 Ctrl", + "no_NO": "Ctrl høyre", + "pl_PL": "", + "pt_BR": "Ctrl Direito", + "ru_RU": "Правый Ctrl", + "sv_SE": "Ctrl höger", + "th_TH": "", + "tr_TR": "Sağ Control", + "uk_UA": "Ctrl Правий", + "zh_CN": "右侧Ctrl", + "zh_TW": "右 Ctrl" + } + }, + { + "ID": "KeyMacControlRight", + "Translations": { + "ar_SA": "زر ⌃ الأيمن", + "de_DE": "", + "el_GR": "", + "en_US": "⌃ Right", + "es_ES": "", + "fr_FR": "⌃ Droite", + "he_IL": "", + "it_IT": "⌃ destro", + "ja_JP": "", + "ko_KR": "우측 ⌃", + "no_NO": "⌃ Høyre", + "pl_PL": "", + "pt_BR": "⌃ Direito", + "ru_RU": "Правый ⌃", + "sv_SE": "^ Höger", + "th_TH": "", + "tr_TR": "⌃ Sağ", + "uk_UA": "⌃ Правий", + "zh_CN": "右侧⌃", + "zh_TW": "右 ⌃" + } + }, + { + "ID": "KeyAltLeft", + "Translations": { + "ar_SA": "زر ‫Alt الأيسر", + "de_DE": "", + "el_GR": "", + "en_US": "Alt Left", + "es_ES": "", + "fr_FR": "Alt Gauche", + "he_IL": "", + "it_IT": "Alt sinistro", + "ja_JP": "", + "ko_KR": "좌측 Alt", + "no_NO": "Alt Venstre", + "pl_PL": "", + "pt_BR": "Alt Esquerdo", + "ru_RU": "Левый Alt", + "sv_SE": "Alt vänster", + "th_TH": "", + "tr_TR": "Sol Alt", + "uk_UA": "Alt Лівий", + "zh_CN": "左侧Alt", + "zh_TW": "左 Alt" + } + }, + { + "ID": "KeyMacAltLeft", + "Translations": { + "ar_SA": "زر ⌥ الأيسر", + "de_DE": "", + "el_GR": "", + "en_US": "⌥ Left", + "es_ES": "", + "fr_FR": "⌥ Gauche", + "he_IL": "", + "it_IT": "⌥ sinistro", + "ja_JP": "", + "ko_KR": "좌측 ⌥", + "no_NO": "⌥ Venstre", + "pl_PL": "", + "pt_BR": "⌥ Esquerda", + "ru_RU": "Левый ⌥", + "sv_SE": "⌥ vänster", + "th_TH": "", + "tr_TR": "⌥ Sol", + "uk_UA": "⌥ Лівий", + "zh_CN": "左侧⌥", + "zh_TW": "左 ⌥" + } + }, + { + "ID": "KeyAltRight", + "Translations": { + "ar_SA": "زر ‫Alt الأيمن", + "de_DE": "", + "el_GR": "", + "en_US": "Alt Right", + "es_ES": "", + "fr_FR": "Alt Droite", + "he_IL": "", + "it_IT": "Alt destro", + "ja_JP": "", + "ko_KR": "우측 Alt", + "no_NO": "Alt høyre", + "pl_PL": "", + "pt_BR": "Alt Direito", + "ru_RU": "Правый Alt", + "sv_SE": "Alt höger", + "th_TH": "", + "tr_TR": "Sağ Alt", + "uk_UA": "Alt Правий", + "zh_CN": "右侧Alt", + "zh_TW": "右 Alt" + } + }, + { + "ID": "KeyMacAltRight", + "Translations": { + "ar_SA": "زر ⌥ الأيمن", + "de_DE": "", + "el_GR": "", + "en_US": "⌥ Right", + "es_ES": "", + "fr_FR": "⌥ Droite", + "he_IL": "", + "it_IT": "⌥ destro", + "ja_JP": "", + "ko_KR": "우측 ⌥", + "no_NO": "⌥ Høyre", + "pl_PL": "", + "pt_BR": "⌥ Direito", + "ru_RU": "Правый ⌥", + "sv_SE": "⌥ höger", + "th_TH": "", + "tr_TR": "⌥ Sağ", + "uk_UA": "⌥ Правий", + "zh_CN": "右侧⌥", + "zh_TW": "右 ⌥" + } + }, + { + "ID": "KeyWinLeft", + "Translations": { + "ar_SA": "زر ⊞ الأيسر", + "de_DE": "", + "el_GR": "", + "en_US": "⊞ Left", + "es_ES": "", + "fr_FR": "⊞ Gauche", + "he_IL": "", + "it_IT": "⊞ sinistro", + "ja_JP": "", + "ko_KR": "좌측 ⊞", + "no_NO": "⊞ Venstre", + "pl_PL": "", + "pt_BR": "⊞ Esquerdo", + "ru_RU": "Левый ⊞", + "sv_SE": "⊞ vänster", + "th_TH": "", + "tr_TR": "⊞ Sol", + "uk_UA": "⊞ Лівий", + "zh_CN": "左侧⊞", + "zh_TW": "左 ⊞" + } + }, + { + "ID": "KeyMacWinLeft", + "Translations": { + "ar_SA": "زر ⌘ الأيسر", + "de_DE": "", + "el_GR": "", + "en_US": "⌘ Left", + "es_ES": "", + "fr_FR": "⌘ Gauche", + "he_IL": "", + "it_IT": "⌘ sinistro", + "ja_JP": "", + "ko_KR": "좌측 ⌘", + "no_NO": "⌘ Venstre", + "pl_PL": "", + "pt_BR": "⌘ Esquerdo", + "ru_RU": "Левый ⌘", + "sv_SE": "⌘ vänster", + "th_TH": "", + "tr_TR": "⌘ Sol", + "uk_UA": "⌘ Лівий", + "zh_CN": "左侧⌘", + "zh_TW": "左 ⌘" + } + }, + { + "ID": "KeyWinRight", + "Translations": { + "ar_SA": "زر ⊞ الأيمن", + "de_DE": "", + "el_GR": "", + "en_US": "⊞ Right", + "es_ES": "", + "fr_FR": "⊞ Droite", + "he_IL": "", + "it_IT": "⊞ destro", + "ja_JP": "", + "ko_KR": "우측 ⊞", + "no_NO": "⊞ Høyre", + "pl_PL": "", + "pt_BR": "⊞ Direito", + "ru_RU": "Правый ⊞", + "sv_SE": "⊞ höger", + "th_TH": "", + "tr_TR": "⊞ Sağ", + "uk_UA": "⊞ Правий", + "zh_CN": "右侧⊞", + "zh_TW": "右 ⊞" + } + }, + { + "ID": "KeyMacWinRight", + "Translations": { + "ar_SA": "زر ⌘ الأيمن", + "de_DE": "", + "el_GR": "", + "en_US": "⌘ Right", + "es_ES": "", + "fr_FR": "⌘ Droite", + "he_IL": "", + "it_IT": "⌘ destro", + "ja_JP": "", + "ko_KR": "우측 ⌘", + "no_NO": "⌘ Høyre", + "pl_PL": "", + "pt_BR": "⌘ Direito", + "ru_RU": "Правый ⌘", + "sv_SE": "⌘ höger", + "th_TH": "", + "tr_TR": "⌘ Sağ", + "uk_UA": "⌘ Правий", + "zh_CN": "右侧⌘", + "zh_TW": "右 ⌘" + } + }, + { + "ID": "KeyMenu", + "Translations": { + "ar_SA": "زر القائمة", + "de_DE": "", + "el_GR": "", + "en_US": "Menu", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "Menù", + "ja_JP": "", + "ko_KR": "메뉴", + "no_NO": "Meny", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Меню", + "sv_SE": "Meny", + "th_TH": "", + "tr_TR": "Menü", + "uk_UA": "Меню", + "zh_CN": "菜单键", + "zh_TW": "功能表鍵" + } + }, + { + "ID": "KeyUp", + "Translations": { + "ar_SA": "فوق", + "de_DE": "", + "el_GR": "", + "en_US": "Up", + "es_ES": "", + "fr_FR": "Haut", + "he_IL": "", + "it_IT": "Su", + "ja_JP": "", + "ko_KR": "↑", + "no_NO": "Opp", + "pl_PL": "", + "pt_BR": "Cima", + "ru_RU": "Вверх", + "sv_SE": "Upp", + "th_TH": "", + "tr_TR": "Yukarı", + "uk_UA": "Вгору ↑", + "zh_CN": "上", + "zh_TW": "上" + } + }, + { + "ID": "KeyDown", + "Translations": { + "ar_SA": "اسفل", + "de_DE": "", + "el_GR": "", + "en_US": "Down", + "es_ES": "", + "fr_FR": "Bas", + "he_IL": "", + "it_IT": "Giù", + "ja_JP": "", + "ko_KR": "↓", + "no_NO": "Ned", + "pl_PL": "", + "pt_BR": "Baixo", + "ru_RU": "Вниз", + "sv_SE": "Ner", + "th_TH": "", + "tr_TR": "Aşağı", + "uk_UA": "Вниз ↓", + "zh_CN": "下", + "zh_TW": "下" + } + }, + { + "ID": "KeyLeft", + "Translations": { + "ar_SA": "يسار", + "de_DE": "", + "el_GR": "", + "en_US": "Left", + "es_ES": "", + "fr_FR": "Gauche", + "he_IL": "", + "it_IT": "Sinistra", + "ja_JP": "", + "ko_KR": "←", + "no_NO": "Venstre", + "pl_PL": "", + "pt_BR": "Esquerda", + "ru_RU": "Влево", + "sv_SE": "Vänster", + "th_TH": "", + "tr_TR": "Sol", + "uk_UA": "Вліво ←", + "zh_CN": "左", + "zh_TW": "左" + } + }, + { + "ID": "KeyRight", + "Translations": { + "ar_SA": "يمين", + "de_DE": "", + "el_GR": "", + "en_US": "Right", + "es_ES": "", + "fr_FR": "Droite", + "he_IL": "", + "it_IT": "Destra", + "ja_JP": "", + "ko_KR": "→", + "no_NO": "Høyre", + "pl_PL": "", + "pt_BR": "Direita", + "ru_RU": "Вправо", + "sv_SE": "Höger", + "th_TH": "", + "tr_TR": "Sağ", + "uk_UA": "Вправо →", + "zh_CN": "右", + "zh_TW": "右" + } + }, + { + "ID": "KeyEnter", + "Translations": { + "ar_SA": "مفتاح الإدخال", + "de_DE": "", + "el_GR": "", + "en_US": "Enter", + "es_ES": "", + "fr_FR": "Entrée", + "he_IL": "", + "it_IT": "Invio", + "ja_JP": "", + "ko_KR": "엔터", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "回车键", + "zh_TW": "Enter 鍵" + } + }, + { + "ID": "KeyEscape", + "Translations": { + "ar_SA": "زر ‫Escape", + "de_DE": "", + "el_GR": "", + "en_US": "Escape", + "es_ES": "", + "fr_FR": "Esc", + "he_IL": "", + "it_IT": "Esc", + "ja_JP": "", + "ko_KR": "Esc", + "no_NO": "Esc-tast", + "pl_PL": "", + "pt_BR": "Esc", + "ru_RU": "Esc", + "sv_SE": "", + "th_TH": "", + "tr_TR": "Esc", + "uk_UA": "Esc", + "zh_CN": "Esc", + "zh_TW": "Esc 鍵" + } + }, + { + "ID": "KeySpace", + "Translations": { + "ar_SA": "مسافة", + "de_DE": "", + "el_GR": "", + "en_US": "Space", + "es_ES": "", + "fr_FR": "Espace", + "he_IL": "", + "it_IT": "Spazio", + "ja_JP": "", + "ko_KR": "스페이스", + "no_NO": "Mellomrom", + "pl_PL": "", + "pt_BR": "Espaço", + "ru_RU": "Пробел", + "sv_SE": "Blanksteg", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Пробіл", + "zh_CN": "空格键", + "zh_TW": "空白鍵" + } + }, + { + "ID": "KeyTab", + "Translations": { + "ar_SA": "زر ‫Tab", + "de_DE": "", + "el_GR": "", + "en_US": "Tab", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "탭", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "Tab 鍵" + } + }, + { + "ID": "KeyBackSpace", + "Translations": { + "ar_SA": "زر المسح للخلف", + "de_DE": "", + "el_GR": "", + "en_US": "Backspace", + "es_ES": "", + "fr_FR": "Retour arrière", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "백스페이스", + "no_NO": "Tilbaketast", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "Geri tuşu", + "uk_UA": "", + "zh_CN": "退格键", + "zh_TW": "Backspace 鍵" + } + }, + { + "ID": "KeyInsert", + "Translations": { + "ar_SA": "زر Insert", + "de_DE": "", + "el_GR": "", + "en_US": "Insert", + "es_ES": "", + "fr_FR": "Inser", + "he_IL": "", + "it_IT": "Ins", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Sett inn", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "Insert 鍵" + } + }, + { + "ID": "KeyDelete", + "Translations": { + "ar_SA": "زر الحذف", + "de_DE": "", + "el_GR": "", + "en_US": "Delete", + "es_ES": "", + "fr_FR": "Suppr", + "he_IL": "", + "it_IT": "Canc", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Slett", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "Delete 鍵" + } + }, + { + "ID": "KeyPageUp", + "Translations": { + "ar_SA": "زر ‫Page Up", + "de_DE": "", + "el_GR": "", + "en_US": "Page Up", + "es_ES": "", + "fr_FR": "Pg.Préc", + "he_IL": "", + "it_IT": "Pag. Su", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Side opp", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "向上捲頁鍵" + } + }, + { + "ID": "KeyPageDown", + "Translations": { + "ar_SA": "زر ‫Page Down", + "de_DE": "", + "el_GR": "", + "en_US": "Page Down", + "es_ES": "", + "fr_FR": "Pg.Suiv", + "he_IL": "", + "it_IT": "Pag. Giù", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Side ned", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "向下捲頁鍵" + } + }, + { + "ID": "KeyHome", + "Translations": { + "ar_SA": "زر ‫Home", + "de_DE": "", + "el_GR": "", + "en_US": "Home", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "Inizio", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Hjem", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "Home 鍵" + } + }, + { + "ID": "KeyEnd", + "Translations": { + "ar_SA": "زر ‫End", + "de_DE": "", + "el_GR": "", + "en_US": "End", + "es_ES": "", + "fr_FR": "Fin", + "he_IL": "", + "it_IT": "Fine", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Avslutt", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "End 鍵" + } + }, + { + "ID": "KeyCapsLock", + "Translations": { + "ar_SA": "زر الحروف الكبيرة", + "de_DE": "", + "el_GR": "", + "en_US": "Caps Lock", + "es_ES": "", + "fr_FR": "Verr. Maj", + "he_IL": "", + "it_IT": "Bloc Maiusc", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Skiftelås", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "Caps Lock 鍵" + } + }, + { + "ID": "KeyScrollLock", + "Translations": { + "ar_SA": "زر ‫Scroll Lock", + "de_DE": "", + "el_GR": "", + "en_US": "Scroll Lock", + "es_ES": "", + "fr_FR": "Arr. Déf.", + "he_IL": "", + "it_IT": "Bloc Scorr", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Rullelås", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "Scroll Lock 鍵" + } + }, + { + "ID": "KeyPrintScreen", + "Translations": { + "ar_SA": "زر ‫Print Screen", + "de_DE": "", + "el_GR": "", + "en_US": "Print Screen", + "es_ES": "", + "fr_FR": "Imp. Écran", + "he_IL": "", + "it_IT": "Stamp", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Skjermbilde", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "Print Screen 鍵" + } + }, + { + "ID": "KeyPause", + "Translations": { + "ar_SA": "زر Pause", + "de_DE": "", + "el_GR": "", + "en_US": "Pause", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "Pausa", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Stans midlertidig", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "Pause 鍵" + } + }, + { + "ID": "KeyNumLock", + "Translations": { + "ar_SA": "زر Num Lock", + "de_DE": "", + "el_GR": "", + "en_US": "Num Lock", + "es_ES": "", + "fr_FR": "Verr. Num", + "he_IL": "", + "it_IT": "Bloc Num", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Numerisk Lås", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "Num Lock 鍵" + } + }, + { + "ID": "KeyClear", + "Translations": { + "ar_SA": "زر Clear", + "de_DE": "", + "el_GR": "", + "en_US": "Clear", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Tøm", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "Töm", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Очистити", + "zh_CN": "清除键", + "zh_TW": "清除" + } + }, + { + "ID": "KeyKeypad0", + "Translations": { + "ar_SA": "لوحة الأرقام 0", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad 0", + "es_ES": "", + "fr_FR": "Num. 0", + "he_IL": "", + "it_IT": "Tast. num. 0", + "ja_JP": "", + "ko_KR": "키패드 0", + "no_NO": "Numerisk 0", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "0 (цифровий блок)", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Блок цифр 0", + "zh_CN": "小键盘0", + "zh_TW": "數字鍵 0" + } + }, + { + "ID": "KeyKeypad1", + "Translations": { + "ar_SA": "لوحة الأرقام 1", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad 1", + "es_ES": "", + "fr_FR": "Num. 1", + "he_IL": "", + "it_IT": "Tast. num. 1", + "ja_JP": "", + "ko_KR": "키패드 1", + "no_NO": "Numerisk 1", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Блок цифр 1", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Блок цифр 1", + "zh_CN": "小键盘1", + "zh_TW": "數字鍵 1" + } + }, + { + "ID": "KeyKeypad2", + "Translations": { + "ar_SA": "لوحة الأرقام 2", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad 2", + "es_ES": "", + "fr_FR": "Num. 2", + "he_IL": "", + "it_IT": "Tast. num. 2", + "ja_JP": "", + "ko_KR": "키패드 2", + "no_NO": "Numerisk 2", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Блок цифр 2", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "2 (цифровий блок)", + "zh_CN": "小键盘2", + "zh_TW": "數字鍵 2" + } + }, + { + "ID": "KeyKeypad3", + "Translations": { + "ar_SA": "لوحة الأرقام 3", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad 3", + "es_ES": "", + "fr_FR": "Num. 3", + "he_IL": "", + "it_IT": "Tast. num. 3", + "ja_JP": "", + "ko_KR": "키패드 3", + "no_NO": "Numerisk 3", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Блок цифр 3", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "3 (цифровий блок)", + "zh_CN": "小键盘3", + "zh_TW": "數字鍵 3" + } + }, + { + "ID": "KeyKeypad4", + "Translations": { + "ar_SA": "لوحة الأرقام 4", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad 4", + "es_ES": "", + "fr_FR": "Num. 4", + "he_IL": "", + "it_IT": "Tast. num. 4", + "ja_JP": "", + "ko_KR": "키패드 4", + "no_NO": "Numerisk 4", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Блок цифр 4", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "4 (цифровий блок)", + "zh_CN": "小键盘4", + "zh_TW": "數字鍵 4" + } + }, + { + "ID": "KeyKeypad5", + "Translations": { + "ar_SA": "لوحة الأرقام 5", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad 5", + "es_ES": "", + "fr_FR": "Num. 5", + "he_IL": "", + "it_IT": "Tast. num. 5", + "ja_JP": "", + "ko_KR": "키패드 5", + "no_NO": "Numerisk 5", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Блок цифр 5", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "5 (цифровий блок)", + "zh_CN": "小键盘5", + "zh_TW": "數字鍵 5" + } + }, + { + "ID": "KeyKeypad6", + "Translations": { + "ar_SA": "لوحة الأرقام 6", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad 6", + "es_ES": "", + "fr_FR": "Num. 6", + "he_IL": "", + "it_IT": "Tast. num. 6", + "ja_JP": "", + "ko_KR": "키패드 6", + "no_NO": "Numerisk 6", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Блок цифр 6", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "6 (цифровий блок)", + "zh_CN": "小键盘6", + "zh_TW": "數字鍵 6" + } + }, + { + "ID": "KeyKeypad7", + "Translations": { + "ar_SA": "لوحة الأرقام 7", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad 7", + "es_ES": "", + "fr_FR": "Num. 7", + "he_IL": "", + "it_IT": "Tast. num. 7", + "ja_JP": "", + "ko_KR": "키패드 7", + "no_NO": "Numerisk 7", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Блок цифр 7", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "7 (цифровий блок)", + "zh_CN": "小键盘7", + "zh_TW": "數字鍵 7" + } + }, + { + "ID": "KeyKeypad8", + "Translations": { + "ar_SA": "لوحة الأرقام 8", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad 8", + "es_ES": "", + "fr_FR": "Num. 8", + "he_IL": "", + "it_IT": "Tast. num. 8", + "ja_JP": "", + "ko_KR": "키패드 8", + "no_NO": "Numerisk 8", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Блок цифр 8", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "8 (цифровий блок)", + "zh_CN": "小键盘8", + "zh_TW": "數字鍵 8" + } + }, + { + "ID": "KeyKeypad9", + "Translations": { + "ar_SA": "لوحة الأرقام 9", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad 9", + "es_ES": "", + "fr_FR": "Num. 9", + "he_IL": "", + "it_IT": "Tast. num. 9", + "ja_JP": "", + "ko_KR": "키패드 9", + "no_NO": "Numerisk 9", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Блок цифр 9", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "9 (цифровий блок)", + "zh_CN": "小键盘9", + "zh_TW": "數字鍵 9" + } + }, + { + "ID": "KeyKeypadDivide", + "Translations": { + "ar_SA": "لوحة الأرقام علامة القسمة", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad Divide", + "es_ES": "", + "fr_FR": "Num. Diviser", + "he_IL": "", + "it_IT": "Tast. num. /", + "ja_JP": "", + "ko_KR": "키패드 분할", + "no_NO": "Numerisk Dele", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "/ (блок цифр)", + "sv_SE": "Keypad /", + "th_TH": "", + "tr_TR": "", + "uk_UA": "/ (цифровий блок)", + "zh_CN": "小键盘/", + "zh_TW": "數字鍵除號" + } + }, + { + "ID": "KeyKeypadMultiply", + "Translations": { + "ar_SA": "لوحة الأرقام علامة الضرب", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad Multiply", + "es_ES": "", + "fr_FR": "Num. Multiplier", + "he_IL": "", + "it_IT": "Tast. num. *", + "ja_JP": "", + "ko_KR": "키패드 멀티플", + "no_NO": "Numerisk Multiplisere", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "* (блок цифр)", + "sv_SE": "Keypad *", + "th_TH": "", + "tr_TR": "", + "uk_UA": "* (цифровий блок)", + "zh_CN": "小键盘*", + "zh_TW": "數字鍵乘號" + } + }, + { + "ID": "KeyKeypadSubtract", + "Translations": { + "ar_SA": "لوحة الأرقام علامة الطرح\n", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad Subtract", + "es_ES": "", + "fr_FR": "Num. Soustraire", + "he_IL": "", + "it_IT": "Tast. num. -", + "ja_JP": "", + "ko_KR": "키패드 빼기", + "no_NO": "Numerisk Subtrakt", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "- (блок цифр)", + "sv_SE": "Keypad -", + "th_TH": "", + "tr_TR": "", + "uk_UA": "- (цифровий блок)", + "zh_CN": "小键盘-", + "zh_TW": "數字鍵減號" + } + }, + { + "ID": "KeyKeypadAdd", + "Translations": { + "ar_SA": "لوحة الأرقام علامة الزائد", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad Add", + "es_ES": "", + "fr_FR": "Num. Ajouter", + "he_IL": "", + "it_IT": "Tast. num. +", + "ja_JP": "", + "ko_KR": "키패드 추가", + "no_NO": "Numerisk Legg til", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "+ (блок цифр)", + "sv_SE": "Keypad +", + "th_TH": "", + "tr_TR": "", + "uk_UA": "+ (цифровий блок)", + "zh_CN": "小键盘+", + "zh_TW": "數字鍵加號" + } + }, + { + "ID": "KeyKeypadDecimal", + "Translations": { + "ar_SA": "لوحة الأرقام الفاصلة العشرية", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad Decimal", + "es_ES": "", + "fr_FR": "Num. Point", + "he_IL": "", + "it_IT": "Tast. num. sep. decimale", + "ja_JP": "", + "ko_KR": "숫자 키패드", + "no_NO": "Numerisk Desimal", + "pl_PL": "", + "pt_BR": "", + "ru_RU": ". (блок цифр)", + "sv_SE": "Keypad ,", + "th_TH": "", + "tr_TR": "", + "uk_UA": ". (цифровий блок)", + "zh_CN": "小键盘.", + "zh_TW": "數字鍵小數點" + } + }, + { + "ID": "KeyKeypadEnter", + "Translations": { + "ar_SA": "لوحة الأرقام زر الإدخال", + "de_DE": "", + "el_GR": "", + "en_US": "Keypad Enter", + "es_ES": "", + "fr_FR": "Num. Ent", + "he_IL": "", + "it_IT": "Tast. num. Invio", + "ja_JP": "", + "ko_KR": "키패드 입력", + "no_NO": "Numerisk Enter", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Enter (блок цифр)", + "sv_SE": "Enter (numerisk)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Enter (цифровий блок)", + "zh_CN": "小键盘回车键", + "zh_TW": "數字鍵 Enter" + } + }, + { + "ID": "KeyNumber0", + "Translations": { + "ar_SA": "٠", + "de_DE": "", + "el_GR": "", + "en_US": "0", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyNumber1", + "Translations": { + "ar_SA": "١", + "de_DE": "", + "el_GR": "", + "en_US": "1", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyNumber2", + "Translations": { + "ar_SA": "٢", + "de_DE": "", + "el_GR": "", + "en_US": "2", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyNumber3", + "Translations": { + "ar_SA": "٣", + "de_DE": "", + "el_GR": "", + "en_US": "3", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyNumber4", + "Translations": { + "ar_SA": "٤", + "de_DE": "", + "el_GR": "", + "en_US": "4", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyNumber5", + "Translations": { + "ar_SA": "٥", + "de_DE": "", + "el_GR": "", + "en_US": "5", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyNumber6", + "Translations": { + "ar_SA": "٦", + "de_DE": "", + "el_GR": "", + "en_US": "6", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyNumber7", + "Translations": { + "ar_SA": "٧", + "de_DE": "", + "el_GR": "", + "en_US": "7", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyNumber8", + "Translations": { + "ar_SA": "٨", + "de_DE": "", + "el_GR": "", + "en_US": "8", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyNumber9", + "Translations": { + "ar_SA": "٩", + "de_DE": "", + "el_GR": "", + "en_US": "9", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyTilde", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "~", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "ò", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyGrave", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "`", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyMinus", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "-", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyPlus", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "+", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyBracketLeft", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "[", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "'", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyBracketRight", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "]", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "ì", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeySemicolon", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": ";", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "è", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyQuote", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "\"", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "à", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyComma", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": ",", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyPeriod", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": ".", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeySlash", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "/", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "ù", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyBackSlash", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "\\", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "<", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "KeyUnbound", + "Translations": { + "ar_SA": "غير مرتبط", + "de_DE": "", + "el_GR": "", + "en_US": "Unbound", + "es_ES": "", + "fr_FR": "Non Attribuée", + "he_IL": "", + "it_IT": "Non assegnato", + "ja_JP": "", + "ko_KR": "연동 해제", + "no_NO": "Ikke bundet", + "pl_PL": "", + "pt_BR": "Não Atribuído", + "ru_RU": "Не привязано", + "sv_SE": "Obunden", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Відв'язати", + "zh_CN": "未分配", + "zh_TW": "未分配" + } + }, + { + "ID": "GamepadLeftStick", + "Translations": { + "ar_SA": "زر عصا التحكم اليسرى", + "de_DE": "", + "el_GR": "", + "en_US": "L Stick Button", + "es_ES": "", + "fr_FR": "Bouton Joystick G.", + "he_IL": "", + "it_IT": "Pulsante levetta sinistra", + "ja_JP": "", + "ko_KR": "좌측 스틱 버튼", + "no_NO": "Venstre Styrespak Trykk", + "pl_PL": "", + "pt_BR": "Botão Analógico Esquerdo", + "ru_RU": "Кнопка лев. стика", + "sv_SE": "L-spakknapp", + "th_TH": "", + "tr_TR": "", + "uk_UA": "L Кнопка Стіку", + "zh_CN": "左摇杆按键", + "zh_TW": "左搖桿按鍵" + } + }, + { + "ID": "GamepadRightStick", + "Translations": { + "ar_SA": "زر عصا التحكم اليمنى", + "de_DE": "", + "el_GR": "", + "en_US": "R Stick Button", + "es_ES": "", + "fr_FR": "Bouton Joystick D.", + "he_IL": "", + "it_IT": "Pulsante levetta destra", + "ja_JP": "", + "ko_KR": "우측 스틱 버튼", + "no_NO": "Høyre Styrespak Trykk", + "pl_PL": "", + "pt_BR": "Botão Analógico Direito", + "ru_RU": "Кнопка пр. стика", + "sv_SE": "R-spakknapp", + "th_TH": "", + "tr_TR": "", + "uk_UA": "R Кнопка Стіку", + "zh_CN": "右摇杆按键", + "zh_TW": "右搖桿按鍵" + } + }, + { + "ID": "GamepadLeftShoulder", + "Translations": { + "ar_SA": "زر الكتف الأيسر‫ L", + "de_DE": "", + "el_GR": "", + "en_US": "Left Shoulder", + "es_ES": "", + "fr_FR": "Bouton Gâchette G.", + "he_IL": "", + "it_IT": "Pulsante dorsale sinistro", + "ja_JP": "", + "ko_KR": "좌측 숄더", + "no_NO": "Venstre Skulder", + "pl_PL": "", + "pt_BR": "Ombro Esquerdo", + "ru_RU": "Левый бампер", + "sv_SE": "Vänster kantknapp", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Лівий Бампер", + "zh_CN": "左肩键L", + "zh_TW": "左肩鍵" + } + }, + { + "ID": "GamepadRightShoulder", + "Translations": { + "ar_SA": "زر الكتف الأيمن‫ R", + "de_DE": "", + "el_GR": "", + "en_US": "Right Shoulder", + "es_ES": "", + "fr_FR": "Bouton Gâchette D.", + "he_IL": "", + "it_IT": "Pulsante dorsale destro", + "ja_JP": "", + "ko_KR": "우측 숄더", + "no_NO": "Høyre Skulder", + "pl_PL": "", + "pt_BR": "Ombro Direito", + "ru_RU": "Правый бампер", + "sv_SE": "Höger kantknapp", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Правий Бампер", + "zh_CN": "右肩键R", + "zh_TW": "右肩鍵" + } + }, + { + "ID": "GamepadLeftTrigger", + "Translations": { + "ar_SA": "زر الزناد الأيسر‫ (ZL)", + "de_DE": "", + "el_GR": "", + "en_US": "Left Trigger", + "es_ES": "", + "fr_FR": "Gâchette Gauche", + "he_IL": "", + "it_IT": "Grilletto sinistro", + "ja_JP": "", + "ko_KR": "좌측 트리거", + "no_NO": "Venstre utløser", + "pl_PL": "", + "pt_BR": "Gatilho Esquerdo", + "ru_RU": "Левый триггер", + "sv_SE": "Vänster avtryckare", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Лівий Тригер", + "zh_CN": "左扳机键ZL", + "zh_TW": "左扳機" + } + }, + { + "ID": "GamepadRightTrigger", + "Translations": { + "ar_SA": "زر الزناد الأيمن‫ (ZR)", + "de_DE": "", + "el_GR": "", + "en_US": "Right Trigger", + "es_ES": "", + "fr_FR": "Gâchette Droite", + "he_IL": "", + "it_IT": "Grilletto destro", + "ja_JP": "", + "ko_KR": "우측 트리거", + "no_NO": "Høyre utløser", + "pl_PL": "", + "pt_BR": "Gatilho Direito", + "ru_RU": "Правый триггер", + "sv_SE": "Höger avtryckare", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Правий Тригер", + "zh_CN": "右扳机键ZR", + "zh_TW": "右扳機" + } + }, + { + "ID": "GamepadDpadUp", + "Translations": { + "ar_SA": "فوق", + "de_DE": "", + "el_GR": "", + "en_US": "Up", + "es_ES": "", + "fr_FR": "Haut", + "he_IL": "", + "it_IT": "Su", + "ja_JP": "", + "ko_KR": "↑", + "no_NO": "Opp", + "pl_PL": "", + "pt_BR": "Cima", + "ru_RU": "Вверх", + "sv_SE": "Upp", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вверх", + "zh_CN": "上键", + "zh_TW": "上" + } + }, + { + "ID": "GamepadDpadDown", + "Translations": { + "ar_SA": "اسفل", + "de_DE": "", + "el_GR": "", + "en_US": "Down", + "es_ES": "", + "fr_FR": "Bas", + "he_IL": "", + "it_IT": "Giù", + "ja_JP": "", + "ko_KR": "↓", + "no_NO": "Ned", + "pl_PL": "", + "pt_BR": "Baixo", + "ru_RU": "Вниз", + "sv_SE": "Ner", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вниз", + "zh_CN": "下键", + "zh_TW": "下" + } + }, + { + "ID": "GamepadDpadLeft", + "Translations": { + "ar_SA": "يسار", + "de_DE": "", + "el_GR": "", + "en_US": "Left", + "es_ES": "", + "fr_FR": "Gauche", + "he_IL": "", + "it_IT": "Sinistra", + "ja_JP": "", + "ko_KR": "←", + "no_NO": "Venstre", + "pl_PL": "", + "pt_BR": "Esquerda", + "ru_RU": "Влево", + "sv_SE": "Vänster", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вліво", + "zh_CN": "左键", + "zh_TW": "左" + } + }, + { + "ID": "GamepadDpadRight", + "Translations": { + "ar_SA": "يمين", + "de_DE": "", + "el_GR": "", + "en_US": "Right", + "es_ES": "", + "fr_FR": "Droite", + "he_IL": "", + "it_IT": "Destra", + "ja_JP": "", + "ko_KR": "→", + "no_NO": "Høyre", + "pl_PL": "", + "pt_BR": "Direita", + "ru_RU": "Вправо", + "sv_SE": "Höger", + "th_TH": "", + "tr_TR": "Sağ", + "uk_UA": "Вправо", + "zh_CN": "右键", + "zh_TW": "右" + } + }, + { + "ID": "GamepadMinus", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "-", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "-键", + "zh_TW": "" + } + }, + { + "ID": "GamepadPlus", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "+", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "4", + "uk_UA": "", + "zh_CN": "+键", + "zh_TW": "" + } + }, + { + "ID": "GamepadGuide", + "Translations": { + "ar_SA": "دليل", + "de_DE": "", + "el_GR": "", + "en_US": "Guide", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "Guida", + "ja_JP": "", + "ko_KR": "가이드", + "no_NO": "Veiledning", + "pl_PL": "", + "pt_BR": "Guia", + "ru_RU": "Кнопка меню", + "sv_SE": "", + "th_TH": "", + "tr_TR": "Rehber", + "uk_UA": "Меню", + "zh_CN": "主页键", + "zh_TW": "快顯功能表鍵" + } + }, + { + "ID": "GamepadMisc1", + "Translations": { + "ar_SA": "متنوع", + "de_DE": "", + "el_GR": "", + "en_US": "Misc", + "es_ES": "", + "fr_FR": "Autre", + "he_IL": "", + "it_IT": "Altro", + "ja_JP": "", + "ko_KR": "기타", + "no_NO": "Diverse", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Прочее", + "sv_SE": "Diverse", + "th_TH": "", + "tr_TR": "Diğer", + "uk_UA": "Інше", + "zh_CN": "截图键", + "zh_TW": "其他按鍵" + } + }, + { + "ID": "GamepadPaddle1", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Paddle 1", + "es_ES": "", + "fr_FR": "Palette 1", + "he_IL": "", + "it_IT": "Tasto extra 1", + "ja_JP": "", + "ko_KR": "패들 1", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Доп.кнопка 1", + "sv_SE": "", + "th_TH": "", + "tr_TR": "Pedal 1", + "uk_UA": "Додаткова кнопка 1", + "zh_CN": "其他按键1", + "zh_TW": "其他按鍵 1" + } + }, + { + "ID": "GamepadPaddle2", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Paddle 2", + "es_ES": "", + "fr_FR": "Palette 2", + "he_IL": "", + "it_IT": "Tasto extra 2", + "ja_JP": "", + "ko_KR": "패들 2", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Доп.кнопка 2", + "sv_SE": "", + "th_TH": "", + "tr_TR": "Pedal 2", + "uk_UA": "Додаткова кнопка 2", + "zh_CN": "其他按键2", + "zh_TW": "其他按鍵 2" + } + }, + { + "ID": "GamepadPaddle3", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Paddle 3", + "es_ES": "", + "fr_FR": "Palette 3", + "he_IL": "", + "it_IT": "Tasto extra 3", + "ja_JP": "", + "ko_KR": "패들 3", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Доп.кнопка 3", + "sv_SE": "", + "th_TH": "", + "tr_TR": "Pedal 3", + "uk_UA": "Додаткова кнопка 3", + "zh_CN": "其他按键3", + "zh_TW": "其他按鍵 3" + } + }, + { + "ID": "GamepadPaddle4", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Paddle 4", + "es_ES": "", + "fr_FR": "Palette 4", + "he_IL": "", + "it_IT": "Tasto extra 4", + "ja_JP": "", + "ko_KR": "패들 4", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Доп.кнопка 4", + "sv_SE": "", + "th_TH": "", + "tr_TR": "Pedal 4", + "uk_UA": "Додаткова кнопка 4", + "zh_CN": "其他按键4", + "zh_TW": "其他按鍵 4" + } + }, + { + "ID": "GamepadTouchpad", + "Translations": { + "ar_SA": "لوحة اللمس", + "de_DE": "", + "el_GR": "", + "en_US": "Touchpad", + "es_ES": "", + "fr_FR": "Pavé tactile", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "터치패드", + "no_NO": "Berøringsplate", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Тачпад", + "sv_SE": "Pekplatta", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Сенсорна панель", + "zh_CN": "触摸板", + "zh_TW": "觸控板" + } + }, + { + "ID": "GamepadSingleLeftTrigger0", + "Translations": { + "ar_SA": "زر الزناد الأيسر 0", + "de_DE": "", + "el_GR": "", + "en_US": "Left Trigger 0", + "es_ES": "", + "fr_FR": "Gâchette Gauche 0", + "he_IL": "", + "it_IT": "Grilletto sinistro 0", + "ja_JP": "", + "ko_KR": "좌측 트리거 0", + "no_NO": "Venstre utløser 0", + "pl_PL": "", + "pt_BR": "Gatilho Esquerdo 0", + "ru_RU": "Левый триггер 0", + "sv_SE": "Vänster avtryckare 0", + "th_TH": "", + "tr_TR": "Sol Tetik 0", + "uk_UA": "Лівий Тригер 0", + "zh_CN": "左扳机0", + "zh_TW": "左扳機 0" + } + }, + { + "ID": "GamepadSingleRightTrigger0", + "Translations": { + "ar_SA": "زر الزناد الأيمن 0", + "de_DE": "", + "el_GR": "", + "en_US": "Right Trigger 0", + "es_ES": "", + "fr_FR": "Gâchette Droite 0", + "he_IL": "", + "it_IT": "Grilletto destro 0", + "ja_JP": "", + "ko_KR": "우측 트리거 0", + "no_NO": "Høyre utløser 0", + "pl_PL": "", + "pt_BR": "Gatilho Direito 0", + "ru_RU": "Правый триггер 0", + "sv_SE": "Höger avtryckare 0", + "th_TH": "", + "tr_TR": "Sağ Tetik 0", + "uk_UA": "Правий Тригер 0", + "zh_CN": "右扳机0", + "zh_TW": "右扳機 0" + } + }, + { + "ID": "GamepadSingleLeftTrigger1", + "Translations": { + "ar_SA": "زر الزناد الأيسر 1", + "de_DE": "", + "el_GR": "", + "en_US": "Left Trigger 1", + "es_ES": "", + "fr_FR": "Gâchette Gauche 1", + "he_IL": "", + "it_IT": "Grilletto sinistro 1", + "ja_JP": "", + "ko_KR": "좌측 트리거 1", + "no_NO": "Venstre utløser 1", + "pl_PL": "", + "pt_BR": " Gatilho Esquerdo 1", + "ru_RU": "Левый триггер 1", + "sv_SE": "Vänster avtryckare 1", + "th_TH": "", + "tr_TR": "Sol Tetik 1", + "uk_UA": "Лівий Тригер 1", + "zh_CN": "左扳机1", + "zh_TW": "左扳機 1" + } + }, + { + "ID": "GamepadSingleRightTrigger1", + "Translations": { + "ar_SA": "زر الزناد الأيمن 1", + "de_DE": "", + "el_GR": "", + "en_US": "Right Trigger 1", + "es_ES": "", + "fr_FR": "Gâchette Droite 1", + "he_IL": "", + "it_IT": "Grilletto destro 1", + "ja_JP": "", + "ko_KR": "우측 트리거 1", + "no_NO": "Høyre utløser 1", + "pl_PL": "", + "pt_BR": "Gatilho Direito 1", + "ru_RU": "Правый триггер 1", + "sv_SE": "Höger avtryckare 1", + "th_TH": "", + "tr_TR": "Sağ Tetik 1", + "uk_UA": "Правий Тригер 1", + "zh_CN": "右扳机1", + "zh_TW": "右扳機 1" + } + }, + { + "ID": "StickLeft", + "Translations": { + "ar_SA": "عصا التحكم اليسرى", + "de_DE": "", + "el_GR": "", + "en_US": "Left Stick", + "es_ES": "", + "fr_FR": "Joystick Gauche", + "he_IL": "", + "it_IT": "Levetta sinistra", + "ja_JP": "", + "ko_KR": "좌측 스틱", + "no_NO": "Venstre styrespak", + "pl_PL": "", + "pt_BR": "Analógico Esquerdo", + "ru_RU": "Левый стик", + "sv_SE": "Vänster spak", + "th_TH": "", + "tr_TR": "Sol Çubuk", + "uk_UA": "Лівий Стік", + "zh_CN": "左摇杆", + "zh_TW": "左搖桿" + } + }, + { + "ID": "StickRight", + "Translations": { + "ar_SA": "عصا التحكم اليمنى", + "de_DE": "", + "el_GR": "", + "en_US": "Right Stick", + "es_ES": "", + "fr_FR": "Joystick Droite", + "he_IL": "", + "it_IT": "Levetta destra", + "ja_JP": "", + "ko_KR": "우측 스틱", + "no_NO": "Høyre styrespak", + "pl_PL": "", + "pt_BR": "Analógico Direito", + "ru_RU": "Правый стик", + "sv_SE": "Höger spak", + "th_TH": "", + "tr_TR": "Sağ çubuk", + "uk_UA": "Правий Стік", + "zh_CN": "右摇杆", + "zh_TW": "右搖桿" + } + }, + { + "ID": "UserProfilesSelectedUserProfile", + "Translations": { + "ar_SA": "الملف الشخصي المحدد للمستخدم:", + "de_DE": "Ausgewähltes Profil:", + "el_GR": "Επιλεγμένο Προφίλ Χρήστη:", + "en_US": "Selected User Profile:", + "es_ES": "Perfil de usuario seleccionado:", + "fr_FR": "Profil utilisateur sélectionné :", + "he_IL": "פרופיל המשתמש הנבחר:", + "it_IT": "Profilo utente selezionato:", + "ja_JP": "選択されたユーザプロファイル:", + "ko_KR": "선택된 사용자 프로필 :", + "no_NO": "Valgt brukerprofil:", + "pl_PL": "Wybrany profil użytkownika:", + "pt_BR": "Perfil de Usuário Selecionado:", + "ru_RU": "Выбранный пользовательский профиль:", + "sv_SE": "Vald användarprofil:", + "th_TH": "เลือกโปรไฟล์ผู้ใช้งาน:", + "tr_TR": "Seçili Kullanıcı Profili:", + "uk_UA": "Вибраний профіль користувача:", + "zh_CN": "选定的用户账户:", + "zh_TW": "選取的使用者設定檔:" + } + }, + { + "ID": "UserProfilesSaveProfileName", + "Translations": { + "ar_SA": "حفظ اسم الملف الشخصي", + "de_DE": "Profilname speichern", + "el_GR": "Αποθήκευση Ονόματος Προφίλ", + "en_US": "Save Profile Name", + "es_ES": "Guardar nombre de perfil", + "fr_FR": "Enregistrer le nom du profil", + "he_IL": "שמור שם פרופיל", + "it_IT": "Salva nome del profilo", + "ja_JP": "プロファイル名をセーブ", + "ko_KR": "프로필 이름 저장", + "no_NO": "Lagre profilnavnet", + "pl_PL": "Zapisz nazwę profilu", + "pt_BR": "Salvar Nome de Perfil", + "ru_RU": "Сохранить пользовательский профиль", + "sv_SE": "Spara profilnamn", + "th_TH": "บันทึกชื่อโปรไฟล์", + "tr_TR": "Profil İsmini Kaydet", + "uk_UA": "Зберегти ім'я профілю", + "zh_CN": "保存名称", + "zh_TW": "儲存設定檔名稱" + } + }, + { + "ID": "UserProfilesChangeProfileImage", + "Translations": { + "ar_SA": "تغيير صورة الملف الشخصي", + "de_DE": "Profilbild ändern", + "el_GR": "Αλλαγή Εικόνας Προφίλ", + "en_US": "Change Profile Image", + "es_ES": "Cambiar imagen de perfil", + "fr_FR": "Changer l'image du profil", + "he_IL": "שנה תמונת פרופיל", + "it_IT": "Cambia immagine profilo", + "ja_JP": "プロファイル画像を変更", + "ko_KR": "프로필 이미지 변경", + "no_NO": "Endre profilbilde", + "pl_PL": "Zmień obrazek profilu", + "pt_BR": "Mudar Imagem de Perfil", + "ru_RU": "Изменить аватар", + "sv_SE": "Byt profilbild", + "th_TH": "เปลี่ยนรูปโปรไฟล์", + "tr_TR": "Profil Resmini Değiştir", + "uk_UA": "Змінити зображення профілю", + "zh_CN": "更换头像", + "zh_TW": "變更設定檔圖像" + } + }, + { + "ID": "UserProfilesAvailableUserProfiles", + "Translations": { + "ar_SA": "الملفات الشخصية للمستخدم المتاحة:", + "de_DE": "Verfügbare Profile:", + "el_GR": "Διαθέσιμα Προφίλ Χρηστών:", + "en_US": "Available User Profiles:", + "es_ES": "Perfiles de usuario disponibles:", + "fr_FR": "Profils utilisateurs disponibles :", + "he_IL": "פרופילי משתמש זמינים:", + "it_IT": "Profili utente disponibili:", + "ja_JP": "利用可能なユーザプロファイル:", + "ko_KR": "사용 가능한 사용자 프로필 :", + "no_NO": "Tilgjengelige brukerprofiler:", + "pl_PL": "Dostępne profile użytkownika:", + "pt_BR": "Perfis de Usuário Disponíveis:", + "ru_RU": "Доступные профили пользователей:", + "sv_SE": "Tillgängliga användarprofiler:", + "th_TH": "โปรไฟล์ผู้ใช้ที่ใช้งานได้:", + "tr_TR": "Mevcut Kullanıcı Profilleri:", + "uk_UA": "Доступні профілі користувачів:", + "zh_CN": "现有用户账户:", + "zh_TW": "可用的使用者設定檔:" + } + }, + { + "ID": "UserProfilesAddNewProfile", + "Translations": { + "ar_SA": "إنشاء ملف الشخصي", + "de_DE": "Neues Profil", + "el_GR": "Προσθήκη Νέου Προφίλ", + "en_US": "Create Profile", + "es_ES": "Añadir nuevo perfil", + "fr_FR": "Créer un profil", + "he_IL": "צור פרופיל", + "it_IT": "Aggiungi nuovo profilo", + "ja_JP": "プロファイルを作成", + "ko_KR": "프로필 만들기", + "no_NO": "Opprett Profil", + "pl_PL": "Utwórz profil", + "pt_BR": "Criar Perfil", + "ru_RU": "Добавить новый профиль", + "sv_SE": "Skapa profil", + "th_TH": "สร้างโปรไฟล์ใหม่", + "tr_TR": "Yeni Profil Ekle", + "uk_UA": "Створити профіль", + "zh_CN": "新建账户", + "zh_TW": "建立設定檔" + } + }, + { + "ID": "UserProfilesDelete", + "Translations": { + "ar_SA": "حذف", + "de_DE": "Löschen", + "el_GR": "Διαγράφω", + "en_US": "Delete", + "es_ES": "Eliminar", + "fr_FR": "Supprimer", + "he_IL": "מחיקה", + "it_IT": "Elimina", + "ja_JP": "削除", + "ko_KR": "삭제", + "no_NO": "Slett", + "pl_PL": "Usuń", + "pt_BR": "Apagar", + "ru_RU": "Удалить", + "sv_SE": "Ta bort", + "th_TH": "ลบ", + "tr_TR": "Sil", + "uk_UA": "Видалити", + "zh_CN": "删除", + "zh_TW": "刪除" + } + }, + { + "ID": "UserProfilesClose", + "Translations": { + "ar_SA": "إغلاق", + "de_DE": "Schließen", + "el_GR": "Κλείσιμο", + "en_US": "Close", + "es_ES": "Cerrar", + "fr_FR": "Fermer", + "he_IL": "סגור", + "it_IT": "Chiudi", + "ja_JP": "閉じる", + "ko_KR": "닫기", + "no_NO": "Lukk", + "pl_PL": "Zamknij", + "pt_BR": "Fechar", + "ru_RU": "Закрыть", + "sv_SE": "Stäng", + "th_TH": "ปิด", + "tr_TR": "Kapat", + "uk_UA": "Закрити", + "zh_CN": "关闭", + "zh_TW": "關閉" + } + }, + { + "ID": "ProfileNameSelectionWatermark", + "Translations": { + "ar_SA": "اختر اسم مستعار", + "de_DE": "Wähle einen Spitznamen", + "el_GR": "Επιλέξτε ψευδώνυμο", + "en_US": "Choose a nickname", + "es_ES": "Escoge un apodo", + "fr_FR": "Choisir un pseudo", + "he_IL": "בחרו כינוי", + "it_IT": "Scegli un soprannome", + "ja_JP": "ニックネームを選択", + "ko_KR": "별명 선택", + "no_NO": "Velg ett kallenavn", + "pl_PL": "Wybierz pseudonim", + "pt_BR": "Escolha um Apelido", + "ru_RU": "Введите никнейм", + "sv_SE": "Välj ett smeknamn", + "th_TH": "เลือก ชื่อเล่น", + "tr_TR": "Kullanıcı Adı Seç", + "uk_UA": "Оберіть псевдонім", + "zh_CN": "输入昵称", + "zh_TW": "選擇暱稱" + } + }, + { + "ID": "ProfileImageSelectionTitle", + "Translations": { + "ar_SA": "تحديد صورة الملف الشخصي", + "de_DE": "Auswahl des Profilbildes", + "el_GR": "Επιλογή Εικόνας Προφίλ", + "en_US": "Profile Image Selection", + "es_ES": "Selección de imagen de perfil", + "fr_FR": "Sélection de l'image du profil", + "he_IL": "בחירת תמונת פרופיל", + "it_IT": "Selezione dell'immagine profilo", + "ja_JP": "プロファイル画像選択", + "ko_KR": "프로필 이미지 선택", + "no_NO": "Valg av profilbilde", + "pl_PL": "Wybór Obrazu Profilu", + "pt_BR": "Seleção da Imagem de Perfil", + "ru_RU": "Выбор изображения профиля", + "sv_SE": "Välj profilbild", + "th_TH": "เลือก รูปโปรไฟล์ ของคุณ", + "tr_TR": "Profil Resmi Seçimi", + "uk_UA": "Вибір зображення профілю", + "zh_CN": "选择头像", + "zh_TW": "設定檔圖像選取" + } + }, + { + "ID": "ProfileImageSelectionHeader", + "Translations": { + "ar_SA": "اختر صورة الملف الشخصي", + "de_DE": "Wähle ein Profilbild aus", + "el_GR": "Επιλέξτε μία Εικόνα Προφίλ", + "en_US": "Choose a profile Image", + "es_ES": "Elige una imagen de perfil", + "fr_FR": "Choisir l'image du profil", + "he_IL": "בחרו תמונת פרופיל", + "it_IT": "Scegli un'immagine profilo", + "ja_JP": "プロファイル画像を選択", + "ko_KR": "프로필 이미지를 선택", + "no_NO": "Velg et profilbilde", + "pl_PL": "Wybierz zdjęcie profilowe", + "pt_BR": "Escolha uma Imagem de Perfil", + "ru_RU": "Выбор аватара", + "sv_SE": "Välj en profilbild", + "th_TH": "เลือก รูปโปรไฟล์", + "tr_TR": "Profil Resmi Seç", + "uk_UA": "Виберіть зображення профілю", + "zh_CN": "选择合适的头像图片", + "zh_TW": "選擇設定檔圖像" + } + }, + { + "ID": "ProfileImageSelectionNote", + "Translations": { + "ar_SA": "يمكنك استيراد صورة ملف شخصي مخصصة، أو تحديد صورة رمزية من البرامج الثابتة للنظام", + "de_DE": "Es kann ein eigenes Profilbild importiert werden oder ein Avatar aus der System-Firmware", + "el_GR": "Μπορείτε να εισαγάγετε μία προσαρμοσμένη εικόνα προφίλ ή να επιλέξετε ένα avatar από το Firmware", + "en_US": "You may import a custom profile image, or select an avatar from system firmware", + "es_ES": "Puedes importar una imagen de perfil personalizada, o seleccionar un avatar del firmware de sistema", + "fr_FR": "Vous pouvez importer une image de profil personnalisée ou sélectionner un avatar depuis le firmware système", + "he_IL": "אתם יכולים לייבא תמונת פרופיל מותאמת אישית, או לבחור אווטאר מקושחת המערכת", + "it_IT": "Puoi importare un'immagine profilo personalizzata o selezionare un avatar dal firmware del sistema", + "ja_JP": "カスタム画像をインポート, またはファームウェア内のアバターを選択できます", + "ko_KR": "사용자 지정 프로필 이미지를 가져오거나 시스템 펌웨어에서 아바타 선택 가능", + "no_NO": "Du kan importere et tilpasset profilbilde, eller velge en avatar fra system fastvare", + "pl_PL": "Możesz zaimportować niestandardowy obraz profilu lub wybrać awatar z firmware'u systemowego", + "pt_BR": "Você pode importar uma imagem customizada, ou selecionar um avatar do Firmware", + "ru_RU": "Вы можете импортировать собственное изображение или выбрать аватар из системной прошивки.", + "sv_SE": "Du kan importera en anpassad profilbild eller välja en avatar från systemets firmware", + "th_TH": "คุณสามารถนำเข้ารูปโปรไฟล์ที่กำหนดเองได้ หรือ เลือกรูปที่มีจากระบบ", + "tr_TR": "Özel bir profil resmi içeri aktarabilir veya sistem avatarlarından birini seçebilirsiniz", + "uk_UA": "Ви можете імпортувати власне зображення профілю або вибрати аватар із мікропрограми системи", + "zh_CN": "您可以导入自定义头像,或从模拟器系统固件中选择预设头像", + "zh_TW": "您可以匯入自訂的設定檔圖像,或從系統韌體中選取大頭貼。" + } + }, + { + "ID": "ProfileImageSelectionImportImage", + "Translations": { + "ar_SA": "استيراد ملف الصورة", + "de_DE": "Bilddatei importieren", + "el_GR": "Εισαγωγή Αρχείου Εικόνας", + "en_US": "Import Image File", + "es_ES": "Importar imagen", + "fr_FR": "Importer une image", + "he_IL": "ייבוא קובץ תמונה", + "it_IT": "Importa file immagine", + "ja_JP": "画像ファイルをインポート", + "ko_KR": "이미지 파일 가져오기", + "no_NO": "Importer bildefil", + "pl_PL": "Importuj Plik Obrazu", + "pt_BR": "Importar Arquivo de Imagem", + "ru_RU": "Импорт изображения", + "sv_SE": "Importera bildfil", + "th_TH": "นำเข้า ไฟล์รูปภาพ", + "tr_TR": "Resim İçeri Aktar", + "uk_UA": "Імпорт файлу зображення", + "zh_CN": "导入图像文件", + "zh_TW": "匯入圖像檔案" + } + }, + { + "ID": "ProfileImageSelectionSelectAvatar", + "Translations": { + "ar_SA": "حدد الصورة الرمزية من البرنامج الثابتة", + "de_DE": "Firmware-Avatar auswählen", + "el_GR": "Επιλέξτε Avatar από Firmware", + "en_US": "Select Firmware Avatar", + "es_ES": "Seleccionar avatar del firmware", + "fr_FR": "Choisir un avatar du firmware", + "he_IL": "בחרו אוואטר קושחה", + "it_IT": "Seleziona avatar dal firmware", + "ja_JP": "ファームウェア内のアバターを選択", + "ko_KR": "펌웨어 아바타 선택", + "no_NO": "Velg fastvare profilbilde", + "pl_PL": "Wybierz domyślny awatar z oprogramowania konsoli", + "pt_BR": "Selecionar Avatar do Firmware", + "ru_RU": "Встроенные аватары", + "sv_SE": "Välj avatar från firmware", + "th_TH": "เลือก รูปอวาต้า จากระบบ", + "tr_TR": "Yazılım Avatarı Seç", + "uk_UA": "Виберіть аватар прошивки ", + "zh_CN": "选择预设头像", + "zh_TW": "選取韌體大頭貼" + } + }, + { + "ID": "InputDialogTitle", + "Translations": { + "ar_SA": "حوار الإدخال", + "de_DE": "Eingabe-Dialog", + "el_GR": "Διάλογος Εισαγωγής", + "en_US": "Input Dialog", + "es_ES": "Cuadro de diálogo de entrada", + "fr_FR": "Boîte de saisie", + "he_IL": "דיאלוג קלט", + "it_IT": "Finestra di input", + "ja_JP": "入力ダイアログ", + "ko_KR": "대화 상자 입력", + "no_NO": "Dialogboksen Inndata", + "pl_PL": "Okno Dialogowe Wprowadzania", + "pt_BR": "Diálogo de texto", + "ru_RU": "Диалоговое окно ввода", + "sv_SE": "Inmatningsdialog", + "th_TH": "กล่องโต้ตอบการป้อนข้อมูล", + "tr_TR": "Giriş Yöntemi Diyaloğu", + "uk_UA": "Діалог введення", + "zh_CN": "输入对话框", + "zh_TW": "輸入對話方塊" + } + }, + { + "ID": "InputDialogOk", + "Translations": { + "ar_SA": "موافق", + "de_DE": "", + "el_GR": "ΟΚ", + "en_US": "OK", + "es_ES": "Aceptar", + "fr_FR": "", + "he_IL": "בסדר", + "it_IT": "", + "ja_JP": "", + "ko_KR": "확인", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "ОК", + "sv_SE": "Ok", + "th_TH": "ตกลง", + "tr_TR": "Tamam", + "uk_UA": "", + "zh_CN": "完成", + "zh_TW": "確定" + } + }, + { + "ID": "InputDialogCancel", + "Translations": { + "ar_SA": "إلغاء", + "de_DE": "Abbrechen", + "el_GR": "Ακύρωση", + "en_US": "Cancel", + "es_ES": "Cancelar", + "fr_FR": "Annuler", + "he_IL": "ביטול", + "it_IT": "Annulla", + "ja_JP": "キャンセル", + "ko_KR": "취소", + "no_NO": "Avbryt", + "pl_PL": "Anuluj", + "pt_BR": "Cancelar", + "ru_RU": "Отмена", + "sv_SE": "Avbryt", + "th_TH": "ยกเลิก", + "tr_TR": "İptal", + "uk_UA": "Скасувати", + "zh_CN": "取消", + "zh_TW": "取消" + } + }, + { + "ID": "InputDialogCancelling", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Cancelling", + "es_ES": "", + "fr_FR": "Annulation en cours", + "he_IL": "", + "it_IT": "Annullamento in corso", + "ja_JP": "", + "ko_KR": "취소하기", + "no_NO": "Kansellerer", + "pl_PL": "", + "pt_BR": "Cancelando", + "ru_RU": "Отмена", + "sv_SE": "Avbryter", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Скасування", + "zh_CN": "正在取消", + "zh_TW": "正在取消" + } + }, + { + "ID": "InputDialogClose", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Close", + "es_ES": "", + "fr_FR": "Fermer", + "he_IL": "", + "it_IT": "Chiudi", + "ja_JP": "", + "ko_KR": "닫기", + "no_NO": "Lukk", + "pl_PL": "", + "pt_BR": "Fechar", + "ru_RU": "Закрыть", + "sv_SE": "Stäng", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Закрити", + "zh_CN": "关闭", + "zh_TW": "關閉" + } + }, + { + "ID": "InputDialogAddNewProfileTitle", + "Translations": { + "ar_SA": "اختر اسم الملف الشخصي", + "de_DE": "Wähle den Profilnamen", + "el_GR": "Επιλογή Ονόματος Προφίλ", + "en_US": "Choose the Profile Name", + "es_ES": "Introducir nombre de perfil", + "fr_FR": "Choisir un nom de profil", + "he_IL": "בחרו את שם הפרופיל", + "it_IT": "Scegli il nome del profilo", + "ja_JP": "プロファイル名を選択", + "ko_KR": "프로필 이름 선택", + "no_NO": "Velg profilnavnet", + "pl_PL": "Wybierz nazwę profilu", + "pt_BR": "Escolha o Nome de Perfil", + "ru_RU": "Выберите никнейм", + "sv_SE": "Välj ett profilnamn", + "th_TH": "เลือก ชื่อโปรไฟล์", + "tr_TR": "Profil İsmini Seç", + "uk_UA": "Виберіть ім'я профілю", + "zh_CN": "选择用户名称", + "zh_TW": "選擇設定檔名稱" + } + }, + { + "ID": "InputDialogAddNewProfileHeader", + "Translations": { + "ar_SA": "الرجاء إدخال اسم الملف الشخصي", + "de_DE": "Bitte gebe einen Profilnamen ein", + "el_GR": "Εισαγωγή Ονόματος Προφίλ", + "en_US": "Please Enter a Profile Name", + "es_ES": "Por favor elige un nombre de usuario", + "fr_FR": "Veuillez saisir un nom de profil.", + "he_IL": "אנא הזינו שם לפרופיל", + "it_IT": "Digita un nome profilo", + "ja_JP": "プロファイル名を入力してください", + "ko_KR": "프로필 이름을 입력", + "no_NO": "Vennligst skriv inn et profilnavn", + "pl_PL": "Wprowadź nazwę profilu", + "pt_BR": "Escreva o Nome do Perfil", + "ru_RU": "Пожалуйста, введите никнейм", + "sv_SE": "Ange ett profilnamn", + "th_TH": "กรุณาใส่ชื่อโปรไฟล์", + "tr_TR": "Lütfen Bir Profil İsmi Girin", + "uk_UA": "Будь ласка, введіть ім'я профілю", + "zh_CN": "请输入账户名称", + "zh_TW": "請輸入設定檔名稱" + } + }, + { + "ID": "InputDialogAddNewProfileSubtext", + "Translations": { + "ar_SA": "(الطول الأقصى: {0})", + "de_DE": "(Maximale Länge: {0})", + "el_GR": "(Σύνολο Χαρακτήρων: {0})", + "en_US": "(Max Length: {0})", + "es_ES": "(Máximo de caracteres: {0})", + "fr_FR": "(Longueur max.: {0})", + "he_IL": "(אורך מרבי: {0})", + "it_IT": "(Lunghezza massima: {0})", + "ja_JP": "(最大長: {0})", + "ko_KR": "(최대 길이 : {0})", + "no_NO": "(Maks lengde: {0})", + "pl_PL": "(Maksymalna długość: {0})", + "pt_BR": "(Máximo de Caracteres: {0})", + "ru_RU": "(Максимальная длина: {0})", + "sv_SE": "(Max längd: {0})", + "th_TH": "(ความยาวสูงสุด: {0})", + "tr_TR": "(Maksimum Uzunluk: {0})", + "uk_UA": "(Макс. довжина: {0})", + "zh_CN": "(最大长度:{0})", + "zh_TW": "(最大長度: {0})" + } + }, + { + "ID": "AvatarChoose", + "Translations": { + "ar_SA": "اختر الصورة الرمزية", + "de_DE": "Bestätigen", + "el_GR": "Επιλογή", + "en_US": "Choose Avatar", + "es_ES": "Escoger", + "fr_FR": "Choisir un avatar", + "he_IL": "בחרו דמות", + "it_IT": "Scegli", + "ja_JP": "選択", + "ko_KR": "아바타 선택", + "no_NO": "Velg profilbilde", + "pl_PL": "Wybierz awatar", + "pt_BR": "Escolha o Avatar", + "ru_RU": "Выбрать аватар", + "sv_SE": "Välj avatar", + "th_TH": "เลือก รูปอวาต้า ของคุณ", + "tr_TR": "Seç", + "uk_UA": "Вибрати", + "zh_CN": "保存选定头像", + "zh_TW": "選擇大頭貼" + } + }, + { + "ID": "AvatarSetBackgroundColor", + "Translations": { + "ar_SA": "تعيين لون الخلفية", + "de_DE": "Hintergrundfarbe auswählen", + "el_GR": "Ορισμός Χρώματος Φόντου", + "en_US": "Set Background Color", + "es_ES": "Establecer color de fondo", + "fr_FR": "Choisir une couleur de fond", + "he_IL": "הגדר צבע רקע", + "it_IT": "Imposta colore di sfondo", + "ja_JP": "背景色を指定", + "ko_KR": "배경색 설정", + "no_NO": "Angi bakgrunnsfarge", + "pl_PL": "Ustaw kolor tła", + "pt_BR": "Definir cor de Fundo", + "ru_RU": "Установить цвет фона", + "sv_SE": "Välj bakgrundsfärg", + "th_TH": "ตั้งค่าสีพื้นหลัง", + "tr_TR": "Arka Plan Rengi Ayarla", + "uk_UA": "Встановити колір фону", + "zh_CN": "设置背景色", + "zh_TW": "設定背景顏色" + } + }, + { + "ID": "AvatarClose", + "Translations": { + "ar_SA": "إغلاق", + "de_DE": "Schließen", + "el_GR": "Κλείσιμο", + "en_US": "Close", + "es_ES": "Cerrar", + "fr_FR": "Fermer", + "he_IL": "סגור", + "it_IT": "Chiudi", + "ja_JP": "閉じる", + "ko_KR": "닫기", + "no_NO": "Lukk", + "pl_PL": "Zamknij", + "pt_BR": "Fechar", + "ru_RU": "Закрыть", + "sv_SE": "Stäng", + "th_TH": "ปิด", + "tr_TR": "Kapat", + "uk_UA": "Закрити", + "zh_CN": "关闭", + "zh_TW": "關閉" + } + }, + { + "ID": "ControllerSettingsLoadProfileToolTip", + "Translations": { + "ar_SA": "تحميل الملف الشخصي", + "de_DE": "Lädt ein Profil", + "el_GR": "Φόρτωση Προφίλ", + "en_US": "Load Profile", + "es_ES": "Cargar perfil", + "fr_FR": "Charger un profil", + "he_IL": "טען פרופיל", + "it_IT": "Carica profilo", + "ja_JP": "プロファイルをロード", + "ko_KR": "프로필 불러오기", + "no_NO": "Last inn profil", + "pl_PL": "Wczytaj profil", + "pt_BR": "Carregar Perfil", + "ru_RU": "Загрузить профиль", + "sv_SE": "Läs in profil", + "th_TH": "โหลด โปรไฟล์", + "tr_TR": "Profil Yükle", + "uk_UA": "Завантажити профіль", + "zh_CN": "加载配置文件", + "zh_TW": "載入設定檔" + } + }, + { + "ID": "ControllerSettingsViewProfileToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "View Profile", + "es_ES": "Ver perfil", + "fr_FR": "Voir Profil", + "he_IL": "", + "it_IT": "Visualizza profilo", + "ja_JP": "", + "ko_KR": "프로필 보기", + "no_NO": "Se Profil", + "pl_PL": "", + "pt_BR": "Ver Perfil", + "ru_RU": "Показать профиль", + "sv_SE": "Visa profil", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Показати профіль", + "zh_CN": "预览配置文件", + "zh_TW": "檢視設定檔" + } + }, + { + "ID": "ControllerSettingsAddProfileToolTip", + "Translations": { + "ar_SA": "إضافة ملف شخصي", + "de_DE": "Fügt ein Profil hinzu", + "el_GR": "Προσθήκη Προφίλ", + "en_US": "Add Profile", + "es_ES": "Agregar perfil", + "fr_FR": "Ajouter un profil", + "he_IL": "הוסף פרופיל", + "it_IT": "Aggiungi profilo", + "ja_JP": "プロファイルを追加", + "ko_KR": "프로필 추가", + "no_NO": "Legg til profil", + "pl_PL": "Dodaj profil", + "pt_BR": "Adicionar Perfil", + "ru_RU": "Добавить профиль", + "sv_SE": "Lägg till profil", + "th_TH": "เพิ่ม โปรไฟล์", + "tr_TR": "Profil Ekle", + "uk_UA": "Додати профіль", + "zh_CN": "新增配置文件", + "zh_TW": "新增設定檔" + } + }, + { + "ID": "ControllerSettingsRemoveProfileToolTip", + "Translations": { + "ar_SA": "إزالة الملف الشخصي", + "de_DE": "Entfernt ein Profil", + "el_GR": "Κατάργηση Προφίλ", + "en_US": "Remove Profile", + "es_ES": "Eliminar perfil", + "fr_FR": "Supprimer un profil", + "he_IL": "הסר פרופיל", + "it_IT": "Rimuovi profilo", + "ja_JP": "プロファイルを削除", + "ko_KR": "프로필 삭제", + "no_NO": "Fjern profil", + "pl_PL": "Usuń profil", + "pt_BR": "Remover Perfil", + "ru_RU": "Удалить профиль", + "sv_SE": "Ta bort profil", + "th_TH": "ลบ โปรไฟล์", + "tr_TR": "Profili Kaldır", + "uk_UA": "Видалити профіль", + "zh_CN": "删除配置文件", + "zh_TW": "刪除設定檔" + } + }, + { + "ID": "ControllerSettingsSaveProfileToolTip", + "Translations": { + "ar_SA": "حفظ الملف الشخصي", + "de_DE": "Speichert ein Profil", + "el_GR": "Αποθήκευση Προφίλ", + "en_US": "Save Profile", + "es_ES": "Guardar perfil", + "fr_FR": "Enregistrer un profil", + "he_IL": "שמור פרופיל", + "it_IT": "Salva profilo", + "ja_JP": "プロファイルをセーブ", + "ko_KR": "프로필 추가", + "no_NO": "Lagre Profil", + "pl_PL": "Zapisz profil", + "pt_BR": "Salvar Perfil", + "ru_RU": "Сохранить профиль", + "sv_SE": "Spara profil", + "th_TH": "บันทึก โปรไฟล์", + "tr_TR": "Profili Kaydet", + "uk_UA": "Зберегти профіль", + "zh_CN": "保存配置文件", + "zh_TW": "儲存設定檔" + } + }, + { + "ID": "ControllerSettingsCancelCurrentChangesToolTip", + "Translations": { + "ar_SA": "إلغاء التغييرات الحالية", + "de_DE": "Aktuelle Änderungen abbrechen", + "el_GR": "Ακύρωση τρεχουσών αλλαγών", + "en_US": "Cancel current changes", + "es_ES": "Cancelar los cambios actuales", + "fr_FR": "Annuler les modifications en cours", + "he_IL": "ביטול השינויים הנוכחיים", + "it_IT": "Annulla le modifiche correnti", + "ja_JP": "現在の変更をキャンセル", + "ko_KR": "현재 변경 취소", + "no_NO": "Avbryt gjeldende endringer", + "pl_PL": "Anuluj bieżące zmiany", + "pt_BR": "Cancelar alterações atuais", + "ru_RU": "Отменить текущие изменения", + "sv_SE": "Avbryt aktuella ändringar", + "th_TH": "ยกเลิกการเปลี่ยนแปลงปัจจุบัน", + "tr_TR": "Geçerli değişiklikleri iptal et", + "uk_UA": "Скасувати поточні зміни", + "zh_CN": "取消当前更改", + "zh_TW": "取消當前變更" + } + }, + { + "ID": "MenuBarFileToolsTakeScreenshot", + "Translations": { + "ar_SA": "أخذ لقطة للشاشة", + "de_DE": "Screenshot aufnehmen", + "el_GR": "Λήψη Στιγμιότυπου", + "en_US": "Take Screenshot", + "es_ES": "Captura de pantalla", + "fr_FR": "Prendre une capture d'écran", + "he_IL": "צלם מסך", + "it_IT": "Cattura uno screenshot", + "ja_JP": "スクリーンショットを撮影", + "ko_KR": "스크린샷 찍기", + "no_NO": "Ta skjermbilde", + "pl_PL": "Zrób zrzut ekranu", + "pt_BR": "Tirar Captura de tela", + "ru_RU": "Сделать снимок экрана", + "sv_SE": "Ta skärmbild", + "th_TH": "ถ่ายภาพหน้าจอ", + "tr_TR": "Ekran Görüntüsü Al", + "uk_UA": "Зробити знімок екрана", + "zh_CN": "保存截屏", + "zh_TW": "儲存擷取畫面" + } + }, + { + "ID": "MenuBarFileToolsHideUi", + "Translations": { + "ar_SA": "إخفاء واجهة المستخدم", + "de_DE": "Oberfläche ausblenden", + "el_GR": "Απόκρυψη UI", + "en_US": "Hide UI", + "es_ES": "Ocultar interfaz", + "fr_FR": "Masquer l'interface utilisateur", + "he_IL": "הסתר ממשק משתמש ", + "it_IT": "Nascondi l'interfaccia", + "ja_JP": "UIを隠す", + "ko_KR": "UI 숨기기", + "no_NO": "Skjul brukergrensesnitt", + "pl_PL": "Ukryj interfejs użytkownika", + "pt_BR": "Esconder Interface", + "ru_RU": "Скрыть интерфейс", + "sv_SE": "Dölj gränssnittet", + "th_TH": "ซ่อน UI", + "tr_TR": "Arayüzü Gizle", + "uk_UA": "Сховати інтерфейс", + "zh_CN": "隐藏菜单栏和状态栏", + "zh_TW": "隱藏 UI" + } + }, + { + "ID": "GameListContextMenuRunApplication", + "Translations": { + "ar_SA": "تشغيل التطبيق", + "de_DE": "Anwendung ausführen", + "el_GR": "Εκτέλεση Εφαρμογής", + "en_US": "Run Application", + "es_ES": "Ejecutar aplicación", + "fr_FR": "Démarrer l'application", + "he_IL": "הרץ יישום", + "it_IT": "Esegui applicazione", + "ja_JP": "アプリケーションを実行", + "ko_KR": "앱 실행", + "no_NO": "Kjør programmet", + "pl_PL": "Uruchom aplikację ", + "pt_BR": "Executar Aplicativo", + "ru_RU": "Запуск приложения", + "sv_SE": "Kör applikation", + "th_TH": "เปิดใช้งานแอปพลิเคชัน", + "tr_TR": "Uygulamayı Çalıştır", + "uk_UA": "Запустити", + "zh_CN": "启动游戏", + "zh_TW": "執行應用程式" + } + }, + { + "ID": "GameListContextMenuToggleFavorite", + "Translations": { + "ar_SA": "تعيين كمفضل", + "de_DE": "Als Favoriten hinzufügen/entfernen", + "el_GR": "Εναλλαγή Αγαπημένου", + "en_US": "Toggle Favorite", + "es_ES": "Marcar favorito", + "fr_FR": "Basculer favori", + "he_IL": "למתג העדפה", + "it_IT": "Preferito", + "ja_JP": "お気に入りを切り替え", + "ko_KR": "즐겨찾기 전환", + "no_NO": "Vis/Skjul favoritter", + "pl_PL": "Przełącz na ulubione", + "pt_BR": "Marcar como Favorito", + "ru_RU": "Добавить в избранное", + "sv_SE": "Växla som favorit", + "th_TH": "สลับรายการโปรด", + "tr_TR": "Favori Ayarla", + "uk_UA": "Додати в обрані", + "zh_CN": "收藏", + "zh_TW": "加入/移除為我的最愛" + } + }, + { + "ID": "GameListContextMenuToggleFavoriteToolTip", + "Translations": { + "ar_SA": "تبديل الحالة المفضلة للعبة", + "de_DE": "Aktiviert den Favoriten-Status des Spiels", + "el_GR": "Εναλλαγή της Κατάστασης Αγαπημένο του Παιχνιδιού", + "en_US": "Toggle Favorite status of Game", + "es_ES": "Marca o desmarca el juego como favorito", + "fr_FR": "Basculer le statut favori du jeu", + "he_IL": "למתג סטטוס העדפה של משחק", + "it_IT": "Segna il gioco come preferito", + "ja_JP": "ゲームをお気に入りに含めるかどうかを切り替えます", + "ko_KR": "게임의 즐겨찾기 상태 전환", + "no_NO": "Vis/Skjul favorittstatus for spillet", + "pl_PL": "Przełącz status Ulubionej Gry", + "pt_BR": "Marca ou desmarca o jogo como favorito", + "ru_RU": "Добавляет игру в избранное и помечает звёздочкой", + "sv_SE": "Växla favoritstatus för spelet", + "th_TH": "สลับสถานะเกมที่ชื่นชอบ", + "tr_TR": "Oyunu Favorilere Ekle/Çıkar", + "uk_UA": "Додати або вилучити гру з обраних", + "zh_CN": "切换游戏的收藏状态", + "zh_TW": "切換遊戲的我的最愛狀態" + } + }, + { + "ID": "SettingsTabGeneralTheme", + "Translations": { + "ar_SA": "السمة:", + "de_DE": "Design:", + "el_GR": "", + "en_US": "Theme:", + "es_ES": "Tema:", + "fr_FR": "Thème :", + "he_IL": "ערכת נושא:", + "it_IT": "Tema:", + "ja_JP": "テーマ:", + "ko_KR": "테마 :", + "no_NO": "Tema:", + "pl_PL": "Motyw:", + "pt_BR": "Tema:", + "ru_RU": "Тема:", + "sv_SE": "Tema:", + "th_TH": "ธีม:", + "tr_TR": "Tema:", + "uk_UA": "Тема:", + "zh_CN": "主题:", + "zh_TW": "佈景主題:" + } + }, + { + "ID": "SettingsTabGeneralThemeAuto", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Auto", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "Automatico", + "ja_JP": "", + "ko_KR": "자동", + "no_NO": "Automatisk", + "pl_PL": "", + "pt_BR": "Automático", + "ru_RU": "Авто", + "sv_SE": "Automatiskt", + "th_TH": "อัตโนมัติ", + "tr_TR": "", + "uk_UA": "Авто.", + "zh_CN": "自动", + "zh_TW": "自動" + } + }, + { + "ID": "SettingsTabGeneralThemeDark", + "Translations": { + "ar_SA": "داكن", + "de_DE": "Dunkel", + "el_GR": "", + "en_US": "Dark", + "es_ES": "Oscuro", + "fr_FR": "Sombre", + "he_IL": "כהה", + "it_IT": "Scuro", + "ja_JP": "ダーク", + "ko_KR": "다크", + "no_NO": "Mørk", + "pl_PL": "Ciemny", + "pt_BR": "Escuro", + "ru_RU": "Тёмная", + "sv_SE": "Mörkt", + "th_TH": "มืด", + "tr_TR": "Karanlık", + "uk_UA": "Темна", + "zh_CN": "深色(暗黑)", + "zh_TW": "深色" + } + }, + { + "ID": "SettingsTabGeneralThemeLight", + "Translations": { + "ar_SA": "فاتح", + "de_DE": "Hell", + "el_GR": "", + "en_US": "Light", + "es_ES": "Claro", + "fr_FR": "Clair", + "he_IL": "בהיר", + "it_IT": "Chiaro", + "ja_JP": "ライト", + "ko_KR": "라이트", + "no_NO": "Lys", + "pl_PL": "Jasny", + "pt_BR": "Claro", + "ru_RU": "Светлая", + "sv_SE": "Ljust", + "th_TH": "สว่าง", + "tr_TR": "Aydınlık", + "uk_UA": "Світла", + "zh_CN": "浅色(亮色)", + "zh_TW": "淺色" + } + }, + { + "ID": "ControllerSettingsConfigureGeneral", + "Translations": { + "ar_SA": "ضبط", + "de_DE": "Konfigurieren", + "el_GR": "Παραμέτρων", + "en_US": "Configure", + "es_ES": "Configurar", + "fr_FR": "Configurer", + "he_IL": "הגדר", + "it_IT": "Configura", + "ja_JP": "設定", + "ko_KR": "설정", + "no_NO": "Konfigurer", + "pl_PL": "Konfiguruj", + "pt_BR": "Configurar", + "ru_RU": "Настройка", + "sv_SE": "Konfigurera", + "th_TH": "กำหนดค่า", + "tr_TR": "Ayarla", + "uk_UA": "Налаштування", + "zh_CN": "配置", + "zh_TW": "配置" + } + }, + { + "ID": "ControllerSettingsRumble", + "Translations": { + "ar_SA": "الاهتزاز", + "de_DE": "Vibration", + "el_GR": "Δόνηση", + "en_US": "Rumble", + "es_ES": "Vibración", + "fr_FR": "Vibration", + "he_IL": "רטט", + "it_IT": "Vibrazione", + "ja_JP": "振動", + "ko_KR": "진동", + "no_NO": "Vibrasjon", + "pl_PL": "Wibracje", + "pt_BR": "Vibração", + "ru_RU": "Вибрация", + "sv_SE": "Vibration", + "th_TH": "การสั่นไหว", + "tr_TR": "Titreşim", + "uk_UA": "Вібрація", + "zh_CN": "震动", + "zh_TW": "震動" + } + }, + { + "ID": "ControllerSettingsRumbleStrongMultiplier", + "Translations": { + "ar_SA": "مضاعف اهتزاز قوي", + "de_DE": "Starker Vibrations-Multiplikator", + "el_GR": "Ισχυρός Πολλαπλασιαστής Δόνησης", + "en_US": "Strong Rumble Multiplier", + "es_ES": "Multiplicador de vibraciones fuertes", + "fr_FR": "Multiplicateur de vibrations fortes", + "he_IL": "העצמת רטט חזק", + "it_IT": "Moltiplicatore vibrazione forte", + "ja_JP": "強振動の補正値", + "ko_KR": "강력한 진동 증폭기", + "no_NO": "Sterk Vibrasjon multiplikator", + "pl_PL": "Mnożnik mocnych wibracji", + "pt_BR": "Multiplicador de Vibração Forte", + "ru_RU": "Множитель сильной вибрации", + "sv_SE": "Försvaga stark vibration", + "th_TH": "เพิ่มความแรงการสั่น", + "tr_TR": "Güçlü Titreşim Çoklayıcı", + "uk_UA": "Множник сильної вібрації", + "zh_CN": "强震动幅度", + "zh_TW": "強震動調節" + } + }, + { + "ID": "ControllerSettingsRumbleWeakMultiplier", + "Translations": { + "ar_SA": "مضاعف اهتزاز ضعيف", + "de_DE": "Schwacher Vibrations-Multiplikator", + "el_GR": "Αδύναμος Πολλαπλασιαστής Δόνησης", + "en_US": "Weak Rumble Multiplier", + "es_ES": "Multiplicador de vibraciones débiles", + "fr_FR": "Multiplicateur de vibrations faibles", + "he_IL": "מכפיל רטט חלש", + "it_IT": "Moltiplicatore vibrazione debole", + "ja_JP": "弱振動の補正値", + "ko_KR": "약한 진동 증폭기", + "no_NO": "Svak Vibrasjon multiplikator", + "pl_PL": "Mnożnik słabych wibracji", + "pt_BR": "Multiplicador de Vibração Fraca", + "ru_RU": "Множитель слабой вибрации", + "sv_SE": "Förstärk svag vibration", + "th_TH": "ลดความแรงการสั่น", + "tr_TR": "Zayıf Titreşim Seviyesi", + "uk_UA": "Множник слабкої вібрації", + "zh_CN": "弱震动幅度", + "zh_TW": "弱震動調節" + } + }, + { + "ID": "DialogMessageSaveNotAvailableMessage", + "Translations": { + "ar_SA": "لا توجد بيانات الحفظ لـ {0} [{1:x16}]", + "de_DE": "Es existieren keine Speicherdaten für {0} [{1:x16}]", + "el_GR": "Δεν υπάρχουν αποθηκευμένα δεδομένα για το {0} [{1:x16}]", + "en_US": "There is no savedata for {0} [{1:x16}]", + "es_ES": "No hay datos de guardado para {0} [{1:x16}]", + "fr_FR": "Il n'y a aucune sauvegarde pour {0} [{1:x16}]", + "he_IL": "אין שמור משחק עבור [{1:x16}] {0}", + "it_IT": "Non ci sono dati di salvataggio per {0} [{1:x16}]", + "ja_JP": "{0} [{1:x16}] のセーブデータはありません", + "ko_KR": "{0} [{1:x16}]에 대한 저장 데이터가 없음", + "no_NO": "Det er ingen lagrede data for {0} [{1:x16}]", + "pl_PL": "Nie ma zapisanych danych dla {0} [{1:x16}]", + "pt_BR": "Não há jogos salvos para {0} [{1:x16}]", + "ru_RU": "Нет сохранений для {0} [{1:x16}]", + "sv_SE": "Det finns inget sparat spel för {0} [{1:x16}]", + "th_TH": "ไม่มีข้อมูลบันทึกไว้สำหรับ {0} [{1:x16}]", + "tr_TR": "{0} [{1:x16}] için kayıt verisi bulunamadı", + "uk_UA": "Немає збережених даних для {0} [{1:x16}]", + "zh_CN": "没有 {0} [{1:x16}] 的游戏存档", + "zh_TW": "沒有 {0} [{1:x16}] 的存檔" + } + }, + { + "ID": "DialogMessageSaveNotAvailableCreateSaveMessage", + "Translations": { + "ar_SA": "هل ترغب في إنشاء بيانات الحفظ لهذه اللعبة؟", + "de_DE": "Sollen Speicherdaten für dieses Spiel erstellt werden?", + "el_GR": "Θέλετε να αποθηκεύσετε δεδομένα για αυτό το παιχνίδι;", + "en_US": "Would you like to create savedata for this game?", + "es_ES": "¿Quieres crear datos de guardado para este juego?", + "fr_FR": "Voulez-vous créer une sauvegarde pour ce jeu ?", + "he_IL": "האם תרצה ליצור שמור משחק עבור המשחק הזה?", + "it_IT": "Vuoi creare dei dati di salvataggio per questo gioco?", + "ja_JP": "このゲームのセーブデータを作成してよろしいですか?", + "ko_KR": "이 게임의 저장 데이터를 만들겠습니까?", + "no_NO": "Vil du lage lagrede data for dette spillet", + "pl_PL": "Czy chcesz utworzyć zapis danych dla tej gry?", + "pt_BR": "Você gostaria de criar dados salvos para este jogo?", + "ru_RU": "Создать сохранение для этой игры?", + "sv_SE": "Vill du skapa sparat spel för detta spel?", + "th_TH": "คุณต้องการสร้างบันทึกข้อมูลสำหรับเกมนี้หรือไม่?", + "tr_TR": "Bu oyun için kayıt verisi oluşturmak ister misiniz?", + "uk_UA": "Хочете створити дані збереження для цієї гри?", + "zh_CN": "是否创建该游戏的存档?", + "zh_TW": "您想為這款遊戲建立存檔嗎?" + } + }, + { + "ID": "DialogConfirmationTitle", + "Translations": { + "ar_SA": "{0} - تأكيد", + "de_DE": "{0} - Bestätigung", + "el_GR": "{0} - Επιβεβαίωση", + "en_US": "{0} - Confirmation", + "es_ES": "{0} - Confirmación", + "fr_FR": "", + "he_IL": "{0} - אישור", + "it_IT": "{0} - Conferma", + "ja_JP": "{0} - 確認", + "ko_KR": "{0} - 확인", + "no_NO": "{0} - Bekreftelse", + "pl_PL": "{0} - Potwierdzenie", + "pt_BR": "{0} - Confirmação", + "ru_RU": "{0} — Подтверждение", + "sv_SE": "{0} - Bekräftelse", + "th_TH": "{0} - ยืนยัน", + "tr_TR": "{0} - Onay", + "uk_UA": "{0} - Підтвердження", + "zh_CN": "{0} - 确认", + "zh_TW": "{0} - 確認" + } + }, + { + "ID": "DialogUpdaterTitle", + "Translations": { + "ar_SA": "{0} - المحدث", + "de_DE": "", + "el_GR": "{0} - Ενημερωτής", + "en_US": "{0} - Updater", + "es_ES": "{0} - Actualizador", + "fr_FR": "{0} - Mise à Jour", + "he_IL": "{0} - מעדכן", + "it_IT": "{0} - Aggiornamento", + "ja_JP": "{0} - アップデータ", + "ko_KR": "{0} - 업데이터", + "no_NO": "{0} – Oppdaterer", + "pl_PL": "{0} - Asystent aktualizacji", + "pt_BR": "{0} - Atualizador", + "ru_RU": "{0} — Обновление", + "sv_SE": "{0} - Uppdatering", + "th_TH": "{0} - อัพเดต", + "tr_TR": "{0} - Güncelleyici", + "uk_UA": "{0} - Програма оновлення", + "zh_CN": "{0} - 更新", + "zh_TW": "{0} - 更新程式" + } + }, + { + "ID": "DialogErrorTitle", + "Translations": { + "ar_SA": "{0} - خطأ", + "de_DE": "{0} - Fehler", + "el_GR": "{0} - Σφάλμα", + "en_US": "{0} - Error", + "es_ES": "", + "fr_FR": "{0} - Erreur", + "he_IL": "{0} - שגיאה", + "it_IT": "{0} - Errore", + "ja_JP": "{0} - エラー", + "ko_KR": "{0} - 오류", + "no_NO": "{0} - Feil", + "pl_PL": "{0} - Błąd", + "pt_BR": "{0} - Erro", + "ru_RU": "{0} — Ошибка", + "sv_SE": "{0} - Fel", + "th_TH": "{0} - ผิดพลาด", + "tr_TR": "{0} - Hata", + "uk_UA": "{0} - Помилка", + "zh_CN": "{0} - 错误", + "zh_TW": "{0} - 錯誤" + } + }, + { + "ID": "DialogWarningTitle", + "Translations": { + "ar_SA": "{0} - تحذير", + "de_DE": "{0} - Warnung", + "el_GR": "{0} - Προειδοποίηση", + "en_US": "{0} - Warning", + "es_ES": "{0} - Advertencia", + "fr_FR": "{0} - Avertissement", + "he_IL": "{0} - אזהרה", + "it_IT": "{0} - Avviso", + "ja_JP": "{0} - 警告", + "ko_KR": "{0} - 경고", + "no_NO": "{0} - Advarsel", + "pl_PL": "{0} - Ostrzeżenie", + "pt_BR": "{0} - Alerta", + "ru_RU": "{0} — Предупреждение", + "sv_SE": "{0} - Varning", + "th_TH": "{0} - คำเตือน", + "tr_TR": "{0} - Uyarı", + "uk_UA": "{0} - Попередження", + "zh_CN": "{0} - 警告", + "zh_TW": "{0} - 警告" + } + }, + { + "ID": "DialogExitTitle", + "Translations": { + "ar_SA": "{0} - الخروج", + "de_DE": "{0} - Beenden", + "el_GR": "{0} - Έξοδος", + "en_US": "{0} - Exit", + "es_ES": "{0} - Salir", + "fr_FR": "{0} - Quitter", + "he_IL": "{0} - יציאה", + "it_IT": "{0} - Esci", + "ja_JP": "{0} - 終了", + "ko_KR": "{0} - 종료", + "no_NO": "{0} - Avslutt", + "pl_PL": "{0} - Wyjdź", + "pt_BR": "{0} - Sair", + "ru_RU": "{0} — Выход", + "sv_SE": "{0} - Avslut", + "th_TH": "{0} - ออก", + "tr_TR": "{0} - Çıkış", + "uk_UA": "{0} - Вихід", + "zh_CN": "{0} - 退出", + "zh_TW": "{0} - 結束" + } + }, + { + "ID": "DialogErrorMessage", + "Translations": { + "ar_SA": "واجه ريوجينكس خطأ", + "de_DE": "Ein Fehler ist aufgetreten", + "el_GR": "Το Ryujinx αντιμετώπισε σφάλμα", + "en_US": "Ryujinx has encountered an error", + "es_ES": "Ryujinx encontró un error", + "fr_FR": "Ryujinx a rencontré une erreur", + "he_IL": "ריוג'ינקס נתקל בשגיאה", + "it_IT": "Ryujinx ha riscontrato un problema", + "ja_JP": "エラーが発生しました", + "ko_KR": "Ryujinx에서 오류 발생", + "no_NO": "Ryujinx har støtt på ett problem", + "pl_PL": "Ryujinx napotkał błąd", + "pt_BR": "Ryujinx encontrou um erro", + "ru_RU": "Ryujinx обнаружил ошибку", + "sv_SE": "Ryujinx har påträffat ett fel", + "th_TH": "Ryujinx พบข้อผิดพลาด", + "tr_TR": "Ryujinx bir hata ile karşılaştı", + "uk_UA": "У Ryujinx сталася помилка", + "zh_CN": "Ryujinx 模拟器发生错误", + "zh_TW": "Ryujinx 遇到了錯誤" + } + }, + { + "ID": "DialogExitMessage", + "Translations": { + "ar_SA": "هل أنت متأكد من أنك تريد إغلاق ريوجينكس؟", + "de_DE": "Ryujinx wirklich schließen?", + "el_GR": "Είστε βέβαιοι ότι θέλετε να κλείσετε το Ryujinx;", + "en_US": "Are you sure you want to close Ryujinx?", + "es_ES": "¿Seguro que quieres cerrar Ryujinx?", + "fr_FR": "Êtes-vous sûr de vouloir fermer Ryujinx ?", + "he_IL": "האם אתם בטוחים שאתם רוצים לסגור את ריוג'ינקס?", + "it_IT": "Sei sicuro di voler chiudere Ryujinx?", + "ja_JP": "Ryujinx を閉じてよろしいですか?", + "ko_KR": "정말 Ryujinx를 닫으시겠습니까?", + "no_NO": "Er du sikker på at du ønsker å lukke Ryujinx?", + "pl_PL": "Czy na pewno chcesz zamknąć Ryujinx?", + "pt_BR": "Tem certeza que deseja fechar o Ryujinx?", + "ru_RU": "Вы уверены, что хотите выйти из Ryujinx?", + "sv_SE": "Är du säker på att du vill avsluta Ryujinx?", + "th_TH": "คุณแน่ใจหรือไม่ว่าต้องการปิด Ryujinx หรือไม่?", + "tr_TR": "Ryujinx'i kapatmak istediğinizden emin misiniz?", + "uk_UA": "Ви впевнені, що бажаєте закрити Ryujinx?", + "zh_CN": "是否关闭 Ryujinx 模拟器?", + "zh_TW": "您確定要關閉 Ryujinx 嗎?" + } + }, + { + "ID": "DialogExitSubMessage", + "Translations": { + "ar_SA": "سيتم فقدان كافة البيانات غير المحفوظة!", + "de_DE": "Alle nicht gespeicherten Daten gehen verloren!", + "el_GR": "Όλα τα μη αποθηκευμένα δεδομένα θα χαθούν!", + "en_US": "All unsaved data will be lost!", + "es_ES": "¡Se perderán los datos no guardados!", + "fr_FR": "Toutes les données non enregistrées seront perdues !", + "he_IL": "כל הנתונים שלא נשמרו יאבדו!", + "it_IT": "Tutti i dati non salvati andranno persi!", + "ja_JP": "セーブされていないデータはすべて失われます!", + "ko_KR": "저장되지 않은 모든 데이터는 손실됩니다!", + "no_NO": "Alle ulagrede data vil gå tapt!", + "pl_PL": "Wszystkie niezapisane dane zostaną utracone!", + "pt_BR": "Todos os dados que não foram salvos serão perdidos!", + "ru_RU": "Все несохранённые данные будут потеряны", + "sv_SE": "Allt data som inte sparats kommer att förloras!", + "th_TH": "ข้อมูลทั้งหมดที่ไม่ได้บันทึกทั้งหมดจะสูญหาย!", + "tr_TR": "Kaydedilmeyen bütün veriler kaybedilecek!", + "uk_UA": "Усі незбережені дані буде втрачено!", + "zh_CN": "未保存的进度将会丢失!", + "zh_TW": "所有未儲存的資料將會遺失!" + } + }, + { + "ID": "DialogMessageCreateSaveErrorMessage", + "Translations": { + "ar_SA": "حدث خطأ أثناء إنشاء بيانات الحفظ المحددة: {0}", + "de_DE": "Es ist ein Fehler bei der Erstellung der angegebenen Speicherdaten aufgetreten: {0}", + "el_GR": "Σφάλμα κατά τη δημιουργία των αποθηκευμένων δεδομένων: {0}", + "en_US": "There was an error creating the specified savedata: {0}", + "es_ES": "Hubo un error al crear los datos de guardado especificados: {0}", + "fr_FR": "Une erreur s'est produite lors de la création de la sauvegarde spécifiée : {0}", + "he_IL": "אירעה שגיאה ביצירת שמור המשחק שצויין: {0}", + "it_IT": "C'è stato un errore durante la creazione dei dati di salvataggio: {0}", + "ja_JP": "セーブデータ: {0} の作成中にエラーが発生しました", + "ko_KR": "지정된 저장 데이터를 생성하는 동안 오류가 발생 : {0}", + "no_NO": "Det oppstod en feil under oppretting av den angitte lagredata: {0}", + "pl_PL": "Wystąpił błąd podczas tworzenia określonych zapisanych danych: {0}", + "pt_BR": "Ocorreu um erro ao criar os dados salvos especificados: {0}", + "ru_RU": "Произошла ошибка при создании указанных данных сохранения: {0}", + "sv_SE": "Det inträffade ett fel vid skapandet av angivet sparat spel: {0}", + "th_TH": "มีข้อผิดพลาดในการสร้างข้อมูลบันทึกที่ระบุ: {0}", + "tr_TR": "Belirtilen kayıt verisi oluşturulurken bir hata oluştu: {0}", + "uk_UA": "Під час створення вказаних даних збереження сталася помилка: {0}", + "zh_CN": "创建指定存档时出错:{0}", + "zh_TW": "建立指定的存檔時出現錯誤: {0}" + } + }, + { + "ID": "DialogMessageFindSaveErrorMessage", + "Translations": { + "ar_SA": "حدث خطأ أثناء البحث عن بيانات الحفظ المحددة: {0}", + "de_DE": "Es ist ein Fehler beim Suchen der angegebenen Speicherdaten aufgetreten: {0}", + "el_GR": "Σφάλμα κατά την εύρεση των αποθηκευμένων δεδομένων: {0}", + "en_US": "There was an error finding the specified savedata: {0}", + "es_ES": "Hubo un error encontrando los datos de guardado especificados: {0}", + "fr_FR": "Une erreur s'est produite lors de la recherche de la sauvegarde spécifiée : {0}", + "he_IL": "אירעה שגיאה במציאת שמור המשחק שצויין: {0}", + "it_IT": "C'è stato un errore durante la ricerca dei dati di salvataggio: {0}", + "ja_JP": "セーブデータ: {0} の検索中にエラーが発生しました", + "ko_KR": "지정된 저장 데이터를 찾는 중 오류가 발생 : {0}", + "no_NO": "Det oppstod en feil under oppretting av den angitte lagredata: {0}", + "pl_PL": "Wystąpił błąd podczas próby znalezienia określonych zapisanych danych: {0}", + "pt_BR": "Ocorreu um erro ao encontrar os dados salvos especificados: {0}", + "ru_RU": "Произошла ошибка при поиске указанных данных сохранения: {0}", + "sv_SE": "Det inträffade ett fel vid sökandet av angivet sparat spel: {0}", + "th_TH": "มีข้อผิดพลาดในการค้นหาข้อมูลบันทึกที่ระบุไว้: {0}", + "tr_TR": "Belirtilen kayıt verisi bulunmaya çalışırken hata: {0}", + "uk_UA": "Під час пошуку вказаних даних збереження сталася помилка: {0}", + "zh_CN": "查找指定存档时出错:{0}", + "zh_TW": "尋找指定的存檔時出現錯誤: {0}" + } + }, + { + "ID": "FolderDialogExtractTitle", + "Translations": { + "ar_SA": "اختر المجلد الذي تريد الاستخراج إليه", + "de_DE": "Wähle den Ordner, in welchen die Dateien entpackt werden sollen", + "el_GR": "Επιλέξτε τον φάκελο στον οποίο θέλετε να εξαγάγετε", + "en_US": "Choose the folder to extract into", + "es_ES": "Elige la carpeta en la que deseas extraer", + "fr_FR": "Choisissez le dossier dans lequel extraire", + "he_IL": "בחרו את התיקייה לחילוץ", + "it_IT": "Scegli una cartella in cui estrarre", + "ja_JP": "展開フォルダを選択", + "ko_KR": "압축을 풀 폴더를 선택", + "no_NO": "Velg mappen å pakke ut i", + "pl_PL": "Wybierz folder, do którego chcesz rozpakować", + "pt_BR": "Escolha a pasta para extrair", + "ru_RU": "Выберите папку для извлечения", + "sv_SE": "Välj en mapp att extrahera till", + "th_TH": "เลือกโฟลเดอร์ที่จะแตกไฟล์เข้าไป", + "tr_TR": "İçine ayıklanacak klasörü seç", + "uk_UA": "Виберіть теку для видобування", + "zh_CN": "选择要提取到的文件夹", + "zh_TW": "選擇要解壓到的資料夾" + } + }, + { + "ID": "DialogNcaExtractionMessage", + "Translations": { + "ar_SA": "استخراج قسم {0} من {1}...", + "de_DE": "Extrahiert {0} abschnitt von {1}...", + "el_GR": "Εξαγωγή ενότητας {0} από {1}...", + "en_US": "Extracting {0} section from {1}...", + "es_ES": "Extrayendo {0} sección de {1}...", + "fr_FR": "Extraction de la section {0} depuis {1}...", + "he_IL": "מלחץ {0} ממקטע {1}...", + "it_IT": "Estrazione della sezione {0} da {1}...", + "ja_JP": "{1} から {0} セクションを展開中...", + "ko_KR": "{1}에서 {0} 단면 추출 중...", + "no_NO": "Trekker ut {0} seksjonen fra {1}...", + "pl_PL": "Wypakowywanie sekcji {0} z {1}...", + "pt_BR": "Extraindo seção {0} de {1}...", + "ru_RU": "Извлечение {0} раздела из {1}...", + "sv_SE": "Extraherar {0}-sektion från {1}...", + "th_TH": "กำลังแตกไฟล์ {0} จากส่วน {1}...", + "tr_TR": "{1} den {0} kısmı ayıklanıyor...", + "uk_UA": "Видобування розділу {0} з {1}...", + "zh_CN": "提取 {1} 的 {0} 分区...", + "zh_TW": "從 {1} 提取 {0} 分區..." + } + }, + { + "ID": "DialogNcaExtractionTitle", + "Translations": { + "ar_SA": "مستخرج قسم NCA", + "de_DE": "NCA-Abschnitt-Extraktor", + "el_GR": "NCA Εξαγωγέας Τμημάτων", + "en_US": "NCA Section Extractor", + "es_ES": "Extractor de sección NCA", + "fr_FR": "Extracteur de la section NCA", + "he_IL": "מחלץ מקטע NCA", + "it_IT": "Estrazione sezione NCA", + "ja_JP": "NCA セクション展開", + "ko_KR": "NCA 단면 추출기", + "no_NO": "Ryujinx - NCA Seksjon Ekstraktor", + "pl_PL": "Asystent wypakowania sekcji NCA", + "pt_BR": "Extrator de Seções NCA", + "ru_RU": "Извлечение разделов NCA", + "sv_SE": "Ryujinx - Extrahera NCA-sektion", + "th_TH": "เครื่องมือแตกไฟล์ของ NCA", + "tr_TR": "NCA Kısmı Ayıklayıcısı", + "uk_UA": "Екстрактор розділів NCA", + "zh_CN": "NCA 分区提取", + "zh_TW": "NCA 分區提取器" + } + }, + { + "ID": "DialogNcaExtractionMainNcaNotFoundErrorMessage", + "Translations": { + "ar_SA": "فشل الاستخراج. لم يكن NCA الرئيسي موجودا في الملف المحدد.", + "de_DE": "Extraktion fehlgeschlagen. Der Hauptheader der NCA war in der ausgewählten Datei nicht vorhanden.", + "el_GR": "Αποτυχία εξαγωγής. Η κύρια NCA δεν υπήρχε στο επιλεγμένο αρχείο.", + "en_US": "Extraction failure. The main NCA was not present in the selected file.", + "es_ES": "Fallo de extracción. El NCA principal no estaba presente en el archivo seleccionado.", + "fr_FR": "Échec de l'extraction. Le NCA principal n'était pas présent dans le fichier sélectionné.", + "he_IL": "כשל בחילוץ. ה-NCA הראשי לא היה קיים בקובץ שנבחר.", + "it_IT": "L'estrazione è fallita. L'NCA principale non era presente nel file selezionato.", + "ja_JP": "展開に失敗しました. 選択されたファイルにはメイン NCA が存在しません.", + "ko_KR": "추출에 실패했습니다. 선택한 파일에 기본 NCA가 없습니다.", + "no_NO": "Uttrekksfeil. Hoveddelen av NCA var ikke tilstede i valgt fil.", + "pl_PL": "Niepowodzenie podczas wypakowywania. W wybranym pliku nie było głównego NCA.", + "pt_BR": "Falha na extração. O NCA principal não foi encontrado no arquivo selecionado.", + "ru_RU": "Ошибка извлечения. Основной NCA не присутствовал в выбранном файле.", + "sv_SE": "Fel vid extrahering. Main NCA hittades inte i vald fil.", + "th_TH": "เกิดความล้มเหลวในการแตกไฟล์เนื่องจากไม่พบ NCA หลักในไฟล์ที่เลือก", + "tr_TR": "Ayıklama hatası. Ana NCA seçilen dosyada bulunamadı.", + "uk_UA": "Помилка видобування. Основний NCA не був присутній у вибраному файлі.", + "zh_CN": "提取失败,所选文件中没有 NCA 文件", + "zh_TW": "提取失敗。所選檔案中不存在主 NCA 檔案。" + } + }, + { + "ID": "DialogNcaExtractionCheckLogErrorMessage", + "Translations": { + "ar_SA": "فشل الاستخراج. اقرأ ملف التسجيل لمزيد من المعلومات.", + "de_DE": "Extraktion fehlgeschlagen. Überprüfe die Logs für weitere Informationen.", + "el_GR": "Αποτυχία εξαγωγής. Διαβάστε το αρχείο καταγραφής για περισσότερες πληροφορίες.", + "en_US": "Extraction failed. Please check the log file for more details.", + "es_ES": "Fallo de extracción. Lee el registro para más información.", + "fr_FR": "Échec de l'extraction. Lisez le fichier journal pour plus d'informations.", + "he_IL": "כשל בחילוץ. קרא את קובץ הרישום למידע נוסף.", + "it_IT": "L'estrazione è fallita. Consulta il file di log per maggiori informazioni.", + "ja_JP": "展開に失敗しました. 詳細はログを確認してください.", + "ko_KR": "추출에 실패했습니다. 자세한 내용은 로그 파일을 확인하시기 바랍니다.", + "no_NO": "Uttrekkingsfeil. Les loggfilen for mer informasjon.", + "pl_PL": "Niepowodzenie podczas wypakowywania. Przeczytaj plik dziennika, aby uzyskać więcej informacji.", + "pt_BR": "Falha na extração. Leia o arquivo de log para mais informações.", + "ru_RU": "Ошибка извлечения. Прочтите файл журнала для получения дополнительной информации.", + "sv_SE": "Fel vid extrahering. Läs i loggfilen för mer information.", + "th_TH": "เกิดความล้มเหลวในการแตกไฟล์ โปรดอ่านไฟล์บันทึกประวัติเพื่อดูข้อมูลเพิ่มเติม", + "tr_TR": "Ayıklama hatası. Ek bilgi için kayıt dosyasını okuyun.", + "uk_UA": "Помилка видобування. Прочитайте файл журналу для отримання додаткової інформації.", + "zh_CN": "提取失败,请查看日志文件获取详情", + "zh_TW": "提取失敗。請閱讀日誌檔案了解更多資訊。" + } + }, + { + "ID": "DialogNcaExtractionSuccessMessage", + "Translations": { + "ar_SA": "تم الاستخراج بنجاح.", + "de_DE": "Extraktion erfolgreich abgeschlossen.", + "el_GR": "Η εξαγωγή ολοκληρώθηκε με επιτυχία.", + "en_US": "Extraction completed successfully.", + "es_ES": "Se completó la extracción con éxito.", + "fr_FR": "Extraction terminée avec succès.", + "he_IL": "החילוץ הושלם בהצלחה.", + "it_IT": "Estrazione completata con successo.", + "ja_JP": "展開が正常終了しました", + "ko_KR": "성공적으로 추출이 완료되었습니다.", + "no_NO": "Utvinningen er fullført.", + "pl_PL": "Wypakowywanie zakończone pomyślnie.", + "pt_BR": "Extração concluída com êxito.", + "ru_RU": "Извлечение завершено успешно.", + "sv_SE": "Extraheringen lyckades.", + "th_TH": "การแตกไฟล์เสร็จสมบูรณ์แล้ว", + "tr_TR": "Ayıklama başarıyla tamamlandı.", + "uk_UA": "Видобування успішно завершено.", + "zh_CN": "提取成功!", + "zh_TW": "提取成功。" + } + }, + { + "ID": "DialogUpdaterConvertFailedMessage", + "Translations": { + "ar_SA": "فشل تحويل إصدار ريوجينكس الحالي.", + "de_DE": "Die Konvertierung der aktuellen Ryujinx-Version ist fehlgeschlagen.", + "el_GR": "Αποτυχία μετατροπής της τρέχουσας έκδοσης Ryujinx.", + "en_US": "Unable to convert the current Ryujinx version.", + "es_ES": "No se pudo convertir la versión actual de Ryujinx.", + "fr_FR": "Échec de la conversion de la version actuelle de Ryujinx.", + "he_IL": "המרת הגרסה הנוכחית של ריוג'ינקס נכשלה.", + "it_IT": "La conversione dell'attuale versione di Ryujinx è fallita.", + "ja_JP": "現在の Ryujinx バージョンの変換に失敗しました.", + "ko_KR": "현재 Ryujinx 버전을 변환할 수 없습니다.", + "no_NO": "Kunne ikke konvertere gjeldende Ryujinx-versjon.", + "pl_PL": "Nie udało się przekonwertować obecnej wersji Ryujinx.", + "pt_BR": "Falha ao converter a versão atual do Ryujinx.", + "ru_RU": "Не удалось преобразовать текущую версию Ryujinx.", + "sv_SE": "Misslyckades med att konvertera aktuell Ryujinx-version.", + "th_TH": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ปัจจุบันได้", + "tr_TR": "Güncel Ryujinx sürümü dönüştürülemedi.", + "uk_UA": "Не вдалося конвертувати поточну версію Ryujinx.", + "zh_CN": "无法切换当前 Ryujinx 版本。", + "zh_TW": "無法轉換目前的 Ryujinx 版本。" + } + }, + { + "ID": "DialogUpdaterCancelUpdateMessage", + "Translations": { + "ar_SA": "إلغاء التحديث", + "de_DE": "Update wird abgebrochen!", + "el_GR": "Ακύρωση Ενημέρωσης!", + "en_US": "Update canceled!", + "es_ES": "¡Cancelando actualización!", + "fr_FR": "Annuler la mise à jour !", + "he_IL": "מבטל עדכון!", + "it_IT": "Annullamento dell'aggiornamento in corso!", + "ja_JP": "アップデータをキャンセル中!", + "ko_KR": "업데이트가 취소되었습니다!", + "no_NO": "Avbryter oppdatering!", + "pl_PL": "Anulowanie aktualizacji!", + "pt_BR": "Atualização Cancelada!", + "ru_RU": "Отмена обновления...", + "sv_SE": "Avbryter uppdatering!", + "th_TH": "ยกเลิกการอัพเดต!", + "tr_TR": "Güncelleme iptal ediliyor!", + "uk_UA": "Скасування оновлення!", + "zh_CN": "取消更新!", + "zh_TW": "取消更新!" + } + }, + { + "ID": "DialogUpdaterAlreadyOnLatestVersionMessage", + "Translations": { + "ar_SA": "أنت تستخدم بالفعل أحدث إصدار من ريوجينكس!", + "de_DE": "Es wird bereits die aktuellste Version von Ryujinx benutzt", + "el_GR": "Χρησιμοποιείτε ήδη την πιο ενημερωμένη έκδοση του Ryujinx!", + "en_US": "You are already using the latest version of Ryujinx!", + "es_ES": "¡Ya tienes la versión más reciente de Ryujinx!", + "fr_FR": "Vous utilisez déjà la dernière version de Ryujinx !", + "he_IL": "אתם כבר משתמשים בגרסה המעודכנת ביותר של ריוג'ינקס!", + "it_IT": "Stai già usando la versione più recente di Ryujinx!", + "ja_JP": "最新バージョンの Ryujinx を使用中です!", + "ko_KR": "이미 최신 버전의 Ryujinx를 사용 중입니다!", + "no_NO": "Du bruker allerede den nyeste versjonen av Ryujinx!", + "pl_PL": "Używasz już najnowszej wersji Ryujinx!", + "pt_BR": "Você já está usando a versão mais recente do Ryujinx!", + "ru_RU": "Вы используете самую последнюю версию Ryujinx", + "sv_SE": "Du använder redan den senaste versionen av Ryujinx!", + "th_TH": "คุณกำลังใช้ Ryujinx เวอร์ชั่นที่อัปเดตล่าสุด!", + "tr_TR": "Zaten Ryujinx'in en güncel sürümünü kullanıyorsunuz!", + "uk_UA": "Ви вже використовуєте останню версію Ryujinx!", + "zh_CN": "您使用的 Ryujinx 模拟器是最新版本。", + "zh_TW": "您已經在使用最新版本的 Ryujinx!" + } + }, + { + "ID": "DialogUpdaterConvertFailedServerMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Failed to convert the Ryujinx version received from the update server.", + "es_ES": "", + "fr_FR": "Échec de la conversion de la version de Ryujinx reçue du serveur de mise à jour.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "업데이트 서버에서 받은 Ryujinx 버전을 변환하는 데 실패했습니다.", + "no_NO": "Kunne ikke konvertere Ryujinx-versjonen som ble mottatt fra oppdateringsserveren.", + "pl_PL": "", + "pt_BR": "Falha em atualizar a versão do Ryujinx recebida do servidor de atualização.", + "ru_RU": "", + "sv_SE": "Det gick inte att konvertera Ryujinx-versionen som mottogs från uppdateringsservern.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "无法转换从更新服务器接收的 Ryujinx 版本。", + "zh_TW": "無法轉換從更新伺服器接收的 Ryujinx 版本。" + } + }, + { + "ID": "DialogUpdaterDownloadingMessage", + "Translations": { + "ar_SA": "جاري تنزيل التحديث...", + "de_DE": "Update wird heruntergeladen...", + "el_GR": "Λήψη Ενημέρωσης...", + "en_US": "Downloading Update...", + "es_ES": "Descargando actualización...", + "fr_FR": "Téléchargement de la mise à jour...", + "he_IL": "מוריד עדכון...", + "it_IT": "Download dell'aggiornamento...", + "ja_JP": "アップデートをダウンロード中...", + "ko_KR": "업데이트 내려받는 중...", + "no_NO": "Laster ned oppdatering...", + "pl_PL": "Pobieranie aktualizacji...", + "pt_BR": "Baixando Atualização...", + "ru_RU": "Загрузка обновления...", + "sv_SE": "Hämtar uppdatering...", + "th_TH": "กำลังดาวน์โหลดอัปเดต...", + "tr_TR": "Güncelleme İndiriliyor...", + "uk_UA": "Завантаження оновлення...", + "zh_CN": "下载更新中...", + "zh_TW": "正在下載更新..." + } + }, + { + "ID": "DialogRebooterMessage", + "Translations": { + "ar_SA": "من فضلك انتظر، المحاكي في طور إعادة التشغيل", + "de_DE": "Bitte warten Sie, der Emulator wird neu gestartet", + "el_GR": "Παρακαλώ περιμένετε, ο εξομοιωτής επανεκκινείται", + "en_US": "Please wait, the emulator is restarting", + "es_ES": "Por favor, espere, el emulador se está reiniciando", + "fr_FR": "Veuillez patienter, l’émulateur redémarre", + "he_IL": "אנא המתן, המחקה מתארגן מחדש", + "it_IT": "Attendere prego, l'emulatore si sta riavviando", + "ja_JP": "お待ちください、エミュレーターが再起動しています", + "ko_KR": "잠시만 기다려 주세요, 에뮬레이터가 재시작 중입니다", + "no_NO": "Vennligst vent, emulatoren starter på nytt", + "pl_PL": "Proszę czekać, emulator jest w trakcie ponownego uruchamiania", + "pt_BR": "Por favor, aguarde, o emulador está reiniciando", + "ru_RU": "Пожалуйста, подождите, эмулятор перезапускается", + "sv_SE": "Vänligen vänta, emulatorn startar om", + "th_TH": "กรุณารอสักครู่, ตัวจำลองกำลังเริ่มใหม่", + "tr_TR": "Lütfen bekleyin, emülatör yeniden başlatılıyor", + "uk_UA": "Будь ласка, зачекайте, емулятор перезавантажується", + "zh_CN": "请稍等,模拟器正在重新启动", + "zh_TW": "請稍候,模擬器正在重新啟動" + } + }, + { + "ID": "DialogUpdaterExtractionMessage", + "Translations": { + "ar_SA": "جاري استخراج التحديث...", + "de_DE": "Update wird entpackt...", + "el_GR": "Εξαγωγή Ενημέρωσης...", + "en_US": "Extracting Update...", + "es_ES": "Extrayendo actualización...", + "fr_FR": "Extraction de la mise à jour…", + "he_IL": "מחלץ עדכון...", + "it_IT": "Estrazione dell'aggiornamento...", + "ja_JP": "アップデートを展開中...", + "ko_KR": "업데이트 추출 중...", + "no_NO": "Pakker ut oppdatering...", + "pl_PL": "Wypakowywanie Aktualizacji...", + "pt_BR": "Extraindo Atualização...", + "ru_RU": "Извлечение обновления...", + "sv_SE": "Extraherar uppdatering...", + "th_TH": "กำลังแตกไฟล์อัปเดต...", + "tr_TR": "Güncelleme Ayıklanıyor...", + "uk_UA": "Видобування оновлення...", + "zh_CN": "正在提取更新...", + "zh_TW": "正在提取更新..." + } + }, + { + "ID": "DialogUpdaterRenamingMessage", + "Translations": { + "ar_SA": "إعادة تسمية التحديث...", + "de_DE": "Update wird umbenannt...", + "el_GR": "Μετονομασία Ενημέρωσης...", + "en_US": "Renaming Update...", + "es_ES": "Renombrando actualización...", + "fr_FR": "Renommage de la mise à jour...", + "he_IL": "משנה את שם העדכון...", + "it_IT": "Ridenominazione dell'aggiornamento...", + "ja_JP": "アップデートをリネーム中...", + "ko_KR": "이름 변경 업데이트...", + "no_NO": "Endrer navn på oppdatering...", + "pl_PL": "Zmiana Nazwy Aktualizacji...", + "pt_BR": "Renomeando Atualização...", + "ru_RU": "Переименование обновления...", + "sv_SE": "Byter namn på uppdatering...", + "th_TH": "กำลังลบไฟล์เก่า...", + "tr_TR": "Güncelleme Yeniden Adlandırılıyor...", + "uk_UA": "Перейменування оновлення...", + "zh_CN": "正在重命名更新...", + "zh_TW": "重新命名更新..." + } + }, + { + "ID": "DialogUpdaterAddingFilesMessage", + "Translations": { + "ar_SA": "إضافة تحديث جديد...", + "de_DE": "Update wird hinzugefügt...", + "el_GR": "Προσθήκη Νέας Ενημέρωσης...", + "en_US": "Adding New Update...", + "es_ES": "Aplicando actualización...", + "fr_FR": "Ajout d'une nouvelle mise à jour...", + "he_IL": "מוסיף עדכון חדש...", + "it_IT": "Aggiunta del nuovo aggiornamento...", + "ja_JP": "新規アップデートを追加中...", + "ko_KR": "새 업데이트 추가 중...", + "no_NO": "Legger til ny oppdatering...", + "pl_PL": "Dodawanie Nowej Aktualizacji...", + "pt_BR": "Adicionando Nova Atualização...", + "ru_RU": "Добавление нового обновления...", + "sv_SE": "Lägger till ny uppdatering...", + "th_TH": "กำลังเพิ่มไฟล์อัปเดตใหม่...", + "tr_TR": "Yeni Güncelleme Ekleniyor...", + "uk_UA": "Додавання нового оновлення...", + "zh_CN": "安装更新中...", + "zh_TW": "加入新更新..." + } + }, + { + "ID": "DialogUpdaterShowChangelogMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Show Changelog", + "es_ES": "", + "fr_FR": "Afficher Changelog", + "he_IL": "", + "it_IT": "Mostra il changelog", + "ja_JP": "", + "ko_KR": "변경 로그 보기", + "no_NO": "Vis endringslogg", + "pl_PL": "", + "pt_BR": "Ver Registro de Alterações", + "ru_RU": "Показать список изменений", + "sv_SE": "Visa ändringslogg", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Показати список змін", + "zh_CN": "显示更新日志", + "zh_TW": "顯示更新日誌" + } + }, + { + "ID": "DialogUpdaterCompleteMessage", + "Translations": { + "ar_SA": "اكتمل التحديث", + "de_DE": "Update abgeschlossen!", + "el_GR": "Η Ενημέρωση Ολοκληρώθηκε!", + "en_US": "Update Complete!", + "es_ES": "¡Actualización completa!", + "fr_FR": "Mise à jour terminée !", + "he_IL": "העדכון הושלם!", + "it_IT": "Aggiornamento completato!", + "ja_JP": "アップデート完了!", + "ko_KR": "업데이트가 완료되었습니다!", + "no_NO": "Oppdateringen er fullført!", + "pl_PL": "Aktualizacja Zakończona!", + "pt_BR": "Atualização Concluída!", + "ru_RU": "Обновление завершено", + "sv_SE": "Uppdatering färdig!", + "th_TH": "อัปเดตเสร็จสมบูรณ์แล้ว!", + "tr_TR": "Güncelleme Tamamlandı!", + "uk_UA": "Оновлення завершено!", + "zh_CN": "更新成功!", + "zh_TW": "更新成功!" + } + }, + { + "ID": "DialogUpdaterRestartMessage", + "Translations": { + "ar_SA": "هل تريد إعادة تشغيل ريوجينكس الآن؟", + "de_DE": "Ryujinx jetzt neu starten?", + "el_GR": "Θέλετε να επανεκκινήσετε το Ryujinx τώρα;", + "en_US": "Do you want to restart Ryujinx now?", + "es_ES": "¿Quieres reiniciar Ryujinx?", + "fr_FR": "Voulez-vous redémarrer Ryujinx maintenant ?", + "he_IL": "האם אתם רוצים להפעיל מחדש את ריוג'ינקס עכשיו?", + "it_IT": "Vuoi riavviare Ryujinx adesso?", + "ja_JP": "すぐに Ryujinx を再起動しますか?", + "ko_KR": "지금 Ryujinx를 다시 시작하시겠습니까?", + "no_NO": "Vil du starte Ryujinx på nytt nå?", + "pl_PL": "Czy chcesz teraz zrestartować Ryujinx?", + "pt_BR": "Deseja reiniciar o Ryujinx agora?", + "ru_RU": "Перезапустить Ryujinx?", + "sv_SE": "Vill du starta om Ryujinx nu?", + "th_TH": "คุณต้องการรีสตาร์ท Ryujinx ตอนนี้หรือไม่?", + "tr_TR": "Ryujinx'i şimdi yeniden başlatmak istiyor musunuz?", + "uk_UA": "Перезапустити Ryujinx зараз?", + "zh_CN": "是否立即重启 Ryujinx 模拟器?", + "zh_TW": "您現在要重新啟動 Ryujinx 嗎?" + } + }, + { + "ID": "DialogUpdaterNoInternetMessage", + "Translations": { + "ar_SA": "أنت غير متصل بالإنترنت.", + "de_DE": "Es besteht keine Verbindung mit dem Internet!", + "el_GR": "Δεν είστε συνδεδεμένοι στο Διαδίκτυο!", + "en_US": "You are not connected to the Internet!", + "es_ES": "¡No estás conectado a internet!", + "fr_FR": "Vous n'êtes pas connecté à Internet !", + "he_IL": "אתם לא מחוברים לאינטרנט!", + "it_IT": "Non sei connesso ad Internet!", + "ja_JP": "インターネットに接続されていません!", + "ko_KR": "인터넷에 연결되어 있지 않습니다!", + "no_NO": "Du er ikke tilkoblet internett", + "pl_PL": "Nie masz połączenia z Internetem!", + "pt_BR": "Você não está conectado à Internet!", + "ru_RU": "Вы не подключены к интернету", + "sv_SE": "Du är inte ansluten till internet!", + "th_TH": "คุณไม่ได้เชื่อมต่อกับอินเทอร์เน็ต!", + "tr_TR": "İnternete bağlı değilsiniz!", + "uk_UA": "Ви не підключені до Інтернету!", + "zh_CN": "没有连接到网络", + "zh_TW": "您沒有連線到網際網路!" + } + }, + { + "ID": "DialogUpdaterNoInternetSubMessage", + "Translations": { + "ar_SA": "يرجى التحقق من أن لديك اتصال إنترنت فعال!", + "de_DE": "Bitte vergewissern, dass eine funktionierende Internetverbindung existiert!", + "el_GR": "Επαληθεύστε ότι έχετε σύνδεση στο Διαδίκτυο που λειτουργεί!", + "en_US": "Please verify that you have a working Internet connection!", + "es_ES": "¡Por favor, verifica que tu conexión a Internet funciona!", + "fr_FR": "Veuillez vérifier que vous avez une connexion Internet fonctionnelle !", + "he_IL": "אנא ודא שיש לך חיבור אינטרנט תקין!", + "it_IT": "Verifica di avere una connessione ad Internet funzionante!", + "ja_JP": "インターネット接続が正常動作しているか確認してください!", + "ko_KR": "인터넷이 제대로 연결되어 있는지 확인하세요!", + "no_NO": "Kontroller at du har en fungerende Internett-tilkobling!", + "pl_PL": "Sprawdź, czy masz działające połączenie internetowe!", + "pt_BR": "Por favor, certifique-se de que você tem uma conexão funcional à Internet!", + "ru_RU": "Убедитесь, что у вас работает подключение к интернету", + "sv_SE": "Försäkra dig om att du har en fungerande internetanslutning!", + "th_TH": "โปรดตรวจสอบว่าคุณมีการเชื่อมต่ออินเทอร์เน็ตว่ามีการใช้งานได้หรือไม่!", + "tr_TR": "Lütfen aktif bir internet bağlantınız olduğunu kontrol edin!", + "uk_UA": "Будь ласка, переконайтеся, що у вас є робоче підключення до Інтернету!", + "zh_CN": "请确保互联网连接正常。", + "zh_TW": "請確認您的網際網路連線正常!" + } + }, + { + "ID": "DialogUpdaterDirtyBuildMessage", + "Translations": { + "ar_SA": "لا يمكنك تحديث نسخة القذرة من ريوجينكس!", + "de_DE": "Inoffizielle Versionen von Ryujinx können nicht aktualisiert werden", + "el_GR": "Δεν μπορείτε να ενημερώσετε μία Πρόχειρη Έκδοση του Ryujinx!", + "en_US": "You cannot update a Dirty build of Ryujinx!", + "es_ES": "¡No puedes actualizar una versión \"dirty\" de Ryujinx!", + "fr_FR": "Vous ne pouvez pas mettre à jour une version Dirty de Ryujinx !", + "he_IL": "אתם לא יכולים לעדכן מבנה מלוכלך של ריוג'ינקס!", + "it_IT": "Non puoi aggiornare una Dirty build di Ryujinx!", + "ja_JP": "Dirty ビルドの Ryujinx はアップデートできません!", + "ko_KR": "Ryujinx의 더티 빌드는 업데이트할 수 없습니다!", + "no_NO": "Du kan ikke oppdatere en skitten versjon av Ryujinx!", + "pl_PL": "Nie możesz zaktualizować Dirty wersji Ryujinx!", + "pt_BR": "Você não pode atualizar uma compilação Dirty do Ryujinx!", + "ru_RU": "Вы не можете обновлять Dirty Build", + "sv_SE": "Du kan inte uppdatera en Dirty build av Ryujinx!", + "th_TH": "คุณไม่สามารถอัปเดต Dirty build ของ Ryujinx ได้!", + "tr_TR": "Ryujinx'in Dirty build'lerini güncelleyemezsiniz!", + "uk_UA": "Ви не можете оновити брудну збірку Ryujinx!", + "zh_CN": "无法更新非官方版本的 Ryujinx 模拟器!", + "zh_TW": "您無法更新非官方版本的 Ryujinx!" + } + }, + { + "ID": "DialogUpdaterDirtyBuildSubMessage", + "Translations": { + "ar_SA": "الرجاء تحميل ريوجينكس من https://ryujinx.app/download إذا كنت تبحث عن إصدار مدعوم.", + "de_DE": "Lade Ryujinx bitte von hier herunter, um eine unterstützte Version zu erhalten: https://ryujinx.app/download", + "el_GR": "Κάντε λήψη του Ryujinx στη διεύθυνση https://ryujinx.app/download εάν αναζητάτε μία υποστηριζόμενη έκδοση.", + "en_US": "Please download Ryujinx at https://ryujinx.app/download if you are looking for a supported version.", + "es_ES": "Por favor, descarga Ryujinx en https://ryujinx.app/download si buscas una versión con soporte.", + "fr_FR": "Veuillez télécharger Ryujinx sur https://ryujinx.app/download si vous recherchez une version prise en charge.", + "he_IL": "אם אתם מחפשים גרסא נתמכת, אנא הורידו את ריוג'ינקס בכתובת https://ryujinx.app/download", + "it_IT": "Scarica Ryujinx da https://ryujinx.app/download se stai cercando una versione supportata.", + "ja_JP": "サポートされているバージョンをお探しなら, https://ryujinx.app/download で Ryujinx をダウンロードしてください.", + "ko_KR": "지원되는 버전을 찾으신다면 https://ryujinx.app/download 에서 Ryujinx를 내려받으세요.", + "no_NO": "Vennligst last ned Ryujinx på https://ryujinx.app/download hvis du ser etter en støttet versjon.", + "pl_PL": "Pobierz Ryujinx ze strony https://ryujinx.app/download, jeśli szukasz obsługiwanej wersji.", + "pt_BR": "Por favor, baixe o Ryujinx em https://ryujinx.app/download se está procurando por uma versão suportada.", + "ru_RU": "Загрузите Ryujinx по адресу https://ryujinx.app/download если вам нужна поддерживаемая версия.", + "sv_SE": "Hämta Ryujinx från https://ryujinx.app/download om du letar efter en version som stöds.", + "th_TH": "โปรดดาวน์โหลด Ryujinx ได้ที่ https://ryujinx.app/download หากคุณกำลังมองหาเวอร์ชั่นที่รองรับ", + "tr_TR": "Desteklenen bir sürüm için lütfen Ryujinx'i https://ryujinx.app/download sitesinden indirin.", + "uk_UA": "Будь ласка, завантажте Ryujinx на https://ryujinx.app/download, якщо ви шукаєте підтримувану версію.", + "zh_CN": "如果想使用受支持的版本,请您在 https://ryujinx.app/download 下载官方版本。", + "zh_TW": "如果您正在尋找受官方支援的版本,請從 https://ryujinx.app/download 下載 Ryujinx。" + } + }, + { + "ID": "DialogRestartRequiredMessage", + "Translations": { + "ar_SA": "يتطلب إعادة التشغيل", + "de_DE": "Neustart erforderlich", + "el_GR": "Απαιτείται Επανεκκίνηση", + "en_US": "Restart Required", + "es_ES": "Se necesita reiniciar", + "fr_FR": "Redémarrage requis", + "he_IL": "אתחול נדרש", + "it_IT": "Riavvio richiesto", + "ja_JP": "再起動が必要", + "ko_KR": "다시 시작 필요", + "no_NO": "Omstart Kreves", + "pl_PL": "Wymagane Ponowne Uruchomienie", + "pt_BR": "Reinicialização Necessária", + "ru_RU": "Требуется перезапуск", + "sv_SE": "Omstart krävs", + "th_TH": "จำเป็นต้องรีสตาร์ทเพื่อให้การอัพเดตสามารถให้งานได้", + "tr_TR": "Yeniden Başlatma Gerekli", + "uk_UA": "Потрібен перезапуск", + "zh_CN": "需要重启模拟器", + "zh_TW": "需要重新啟動" + } + }, + { + "ID": "DialogThemeRestartMessage", + "Translations": { + "ar_SA": "تم حفظ السمة. إعادة التشغيل مطلوبة لتطبيق السمة.", + "de_DE": "Das Design wurde gespeichert. Ein Neustart ist erforderlich, um das Design anzuwenden.", + "el_GR": "Το θέμα έχει αποθηκευτεί. Απαιτείται επανεκκίνηση για την εφαρμογή του θέματος.", + "en_US": "Theme has been saved. A restart is needed to apply the theme.", + "es_ES": "Tema guardado. Se necesita reiniciar para aplicar el tema.", + "fr_FR": "Le thème a été enregistré. Un redémarrage est requis pour appliquer le thème.", + "he_IL": "ערכת הנושא נשמרה. יש צורך בהפעלה מחדש כדי להחיל את ערכת הנושא.", + "it_IT": "Il tema è stato salvato. È richiesto un riavvio per applicare il tema.", + "ja_JP": "テーマがセーブされました. テーマを適用するには再起動が必要です.", + "ko_KR": "테마를 저장했습니다. 테마를 적용하려면 다시 시작해야 합니다.", + "no_NO": "Temaet har blitt lagret. En omstart kreves for å bruke temaet.", + "pl_PL": "Motyw został zapisany. Aby zastosować motyw, konieczne jest ponowne uruchomienie.", + "pt_BR": "O tema foi salvo. Uma reinicialização é necessária para aplicar o tema.", + "ru_RU": "Тема сохранена. Для применения темы требуется выполнить перезапуск.", + "sv_SE": "Temat har sparats. En omstart krävs för att verkställa ändringen.", + "th_TH": "บันทึกธีมแล้ว จำเป็นต้องรีสตาร์ทเพื่อใช้ธีม", + "tr_TR": "Tema kaydedildi. Temayı uygulamak için yeniden başlatma gerekiyor.", + "uk_UA": "Тему збережено. Щоб застосувати тему, потрібен перезапуск.", + "zh_CN": "主题设置已保存,需要重启模拟器才能生效。", + "zh_TW": "佈景主題設定已儲存。需要重新啟動才能套用主題。" + } + }, + { + "ID": "DialogThemeRestartSubMessage", + "Translations": { + "ar_SA": "هل تريد إعادة التشغيل", + "de_DE": "Jetzt neu starten?", + "el_GR": "Θέλετε να κάνετε επανεκκίνηση", + "en_US": "Do you want to restart", + "es_ES": "¿Quieres reiniciar?", + "fr_FR": "Voulez-vous redémarrer ?", + "he_IL": "האם ברצונך להפעיל מחדש?", + "it_IT": "Vuoi riavviare?", + "ja_JP": "再起動しますか", + "ko_KR": "다시 시작하시겠습니까?", + "no_NO": "Vil du starte på nytt", + "pl_PL": "Czy chcesz uruchomić ponownie?", + "pt_BR": "Deseja reiniciar?", + "ru_RU": "Выполнить перезапуск?", + "sv_SE": "Vill du starta om", + "th_TH": "คุณต้องการรีสตาร์ทหรือไม่?", + "tr_TR": "Yeniden başlatmak ister misiniz", + "uk_UA": "Ви хочете перезапустити", + "zh_CN": "是否要重启模拟器?", + "zh_TW": "您要重新啟動嗎" + } + }, + { + "ID": "DialogFirmwareInstallEmbeddedMessage", + "Translations": { + "ar_SA": "هل ترغب في تثبيت البرنامج الثابت المدمج في هذه اللعبة؟ (البرنامج الثابت {0})", + "de_DE": "Die in diesem Spiel enthaltene Firmware installieren? (Firmware {0})", + "el_GR": "Θα θέλατε να εγκαταστήσετε το Firmware που είναι ενσωματωμένο σε αυτό το παιχνίδι; (Firmware {0})", + "en_US": "Would you like to install the firmware embedded in this game? (Firmware {0})", + "es_ES": "¿Quieres instalar el firmware incluido en este juego? (Firmware versión {0})", + "fr_FR": "Voulez-vous installer le firmware intégré dans ce jeu ? (Firmware {0})", + "he_IL": "האם תרצו להתקין את הקושחה המוטמעת במשחק הזה? (קושחה {0})", + "it_IT": "Vuoi installare il firmware incluso in questo gioco? (Firmware {0})", + "ja_JP": "このゲームに含まれるファームウェアをインストールしてよろしいですか? (ファームウェア {0})", + "ko_KR": "이 게임에 포함된 펌웨어를 설치하시겠습니까?(Firmware {0})", + "no_NO": "Ønsker du å installere fastvaren innebygd i dette spillet? (Firmware {0})", + "pl_PL": "Czy chcesz zainstalować firmware wbudowany w tę grę? (Firmware {0})", + "pt_BR": "Gostaria de instalar o firmware incluso neste jogo? (Firmware {0})", + "ru_RU": "Хотите установить прошивку, встроенную в эту игру? (Прошивка {0})", + "sv_SE": "Vill du installera det firmware som är inbäddat i detta spel? (Firmware {0})", + "th_TH": "คุณต้องการติดตั้งเฟิร์มแวร์ที่ฝังอยู่ในเกมนี้หรือไม่? (เฟิร์มแวร์ {0})", + "tr_TR": "Bu oyunun içine gömülü olan yazılımı yüklemek ister misiniz? (Firmware {0})", + "uk_UA": "Бажаєте встановити прошивку, вбудовану в цю гру? (Прошивка {0})", + "zh_CN": "要安装游戏文件中内嵌的系统固件吗?(固件版本 {0})", + "zh_TW": "您想安裝遊戲內建的韌體嗎? (韌體 {0})" + } + }, + { + "ID": "DialogFirmwareInstallEmbeddedSuccessMessage", + "Translations": { + "ar_SA": "لم يتم العثور على أي برنامج ثابت مثبت ولكن ريوجينكس كان قادرا على تثبيت البرنامج الثابت {0} من اللعبة المقدمة.\nسيبدأ المحاكي الآن.", + "de_DE": "Es wurde keine installierte Firmware gefunden, aber Ryujinx konnte die Firmware {0} aus dem bereitgestellten Spiel installieren.\nRyujinx wird nun gestartet.", + "el_GR": "", + "en_US": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.", + "es_ES": "No se encontró ning{un firmware instalado pero Ryujinx pudo instalar firmware {0} del juego proporcionado.\nEl emulador iniciará.", + "fr_FR": "Aucun firmware installé n'a été trouvé mais Ryujinx a pu installer le firmware {0} à partir du jeu fourni.\nL'émulateur va maintenant démarrer.", + "he_IL": "לא נמצאה קושחה מותקנת אבל ריוג'ינקס הצליח להתקין קושחה {0} מהמשחק שסופק. \nהאמולטור יופעל כעת.", + "it_IT": "Non è stato trovato alcun firmware installato, ma Ryujinx è riuscito ad installare il firmware {0} dal gioco fornito.\nL'emulatore si avvierà adesso.", + "ja_JP": "ファームウェアがインストールされていませんが, ゲームに含まれるファームウェア {0} をインストールできます.\nエミュレータが開始します.", + "ko_KR": "설치된 펌웨어를 찾을 수 없지만 Ryujinx는 제공된 게임에서 펌웨어 {0}을(를) 설치할 수 있습니다.\n이제 에뮬레이터가 시작됩니다.", + "no_NO": "Det ble ikke funnet noen installert fastvare, men Ryujinx kunne installere fastvare {0} fra det oppgitte spillet.\nemulatoren vil nå starte.", + "pl_PL": "Nie znaleziono zainstalowanego oprogramowania, ale Ryujinx był w stanie zainstalować oprogramowanie {0} z dostarczonej gry.\n\nEmulator uruchomi się teraz.", + "pt_BR": "Nenhum firmware instalado foi encontrado, mas o Ryujinx conseguiu instalar o firmware {0} a partir do jogo fornecido.\nO emulador será iniciado agora.", + "ru_RU": "Установленная прошивка не была найдена, но Ryujinx удалось установить прошивку {0} из предоставленной игры.\nТеперь эмулятор запустится.", + "sv_SE": "Inget installerat firmware hittades men Ryujinx kunde installera firmware {0} från angiven spel.\nEmulatorn kommer nu att startas.", + "th_TH": "ไม่พบเฟิร์มแวร์ที่ติดตั้งไว้ แต่ Ryujinx จะติดตั้งเฟิร์มแวร์ได้ {0} จากเกมที่ให้มา\nขณะนี้โปรแกรมจำลองจะเริ่มทำงาน", + "tr_TR": "", + "uk_UA": "Встановлену прошивку не знайдено, але Ryujinx вдалося встановити прошивку {0} з наданої гри.\nТепер запуститься емулятор.", + "zh_CN": "Ryujinx 模拟器已经从当前游戏文件中安装了系统固件 {0} 。\n模拟器现在可以正常运行了。", + "zh_TW": "未找到已安裝的韌體,但 Ryujinx 可以從現有的遊戲安裝韌體{0}。\n模擬器現在可以執行。" + } + }, + { + "ID": "DialogFirmwareNoFirmwareInstalledMessage", + "Translations": { + "ar_SA": "لا يوجد برنامج ثابت مثبت", + "de_DE": "Keine Firmware installiert", + "el_GR": "Δεν έχει εγκατασταθεί Firmware", + "en_US": "No Firmware Installed", + "es_ES": "No hay firmware instalado", + "fr_FR": "Aucun Firmware installé", + "he_IL": "לא מותקנת קושחה", + "it_IT": "Nessun firmware installato", + "ja_JP": "ファームウェアがインストールされていません", + "ko_KR": "펌웨어가 설치되어 있지 않음", + "no_NO": "Ingen fastvare installert", + "pl_PL": "Brak Zainstalowanego Firmware'u", + "pt_BR": "Nenhum Firmware Instalado", + "ru_RU": "Прошивка не установлена", + "sv_SE": "Inget firmware installerat", + "th_TH": "ไม่มีการติดตั้งเฟิร์มแวร์", + "tr_TR": "Yazılım Yüklü Değil", + "uk_UA": "Прошивка не встановлена", + "zh_CN": "未安装系统固件", + "zh_TW": "未安裝韌體" + } + }, + { + "ID": "DialogFirmwareInstalledMessage", + "Translations": { + "ar_SA": "تم تثبيت البرنامج الثابت {0}", + "de_DE": "Firmware {0} wurde installiert", + "el_GR": "Το Firmware {0} εγκαταστάθηκε", + "en_US": "Firmware {0} was installed", + "es_ES": "Se instaló el firmware {0}", + "fr_FR": "Le firmware {0} a été installé", + "he_IL": "הקושחה {0} הותקנה", + "it_IT": "Il firmware {0} è stato installato", + "ja_JP": "ファームウェア {0} がインストールされました", + "ko_KR": "펌웨어 {0}이(가) 설치됨", + "no_NO": "fastvare {0} ble installert", + "pl_PL": "Firmware {0} został zainstalowany", + "pt_BR": "Firmware {0} foi instalado", + "ru_RU": "Прошивка {0} была установлена", + "sv_SE": "Firmware {0} installerades", + "th_TH": "เฟิร์มแวร์ {0} ติดตั้งแล้ว", + "tr_TR": "Yazılım {0} yüklendi", + "uk_UA": "Встановлено прошивку {0}", + "zh_CN": "已安装系统固件 {0}", + "zh_TW": "已安裝韌體{0}" + } + }, + { + "ID": "DialogInstallFileTypesSuccessMessage", + "Translations": { + "ar_SA": "تم تثبيت أنواع الملفات بنجاح!", + "de_DE": "Dateitypen erfolgreich installiert!", + "el_GR": "Επιτυχής εγκατάσταση τύπων αρχείων!", + "en_US": "Successfully installed file types!", + "es_ES": "¡Tipos de archivos instalados con éxito!", + "fr_FR": "Types de fichiers installés avec succès!", + "he_IL": "סוגי קבצים הותקנו בהצלחה!", + "it_IT": "Tipi di file installati con successo!", + "ja_JP": "ファイル形式のインストールに成功しました!", + "ko_KR": "파일 형식을 성공적으로 설치했습니다!", + "no_NO": "Filtyper ble installert!", + "pl_PL": "Pomyślnie zainstalowano typy plików!", + "pt_BR": "Tipos de arquivo instalados com sucesso!", + "ru_RU": "Типы файлов успешно установлены", + "sv_SE": "Filtyper har installerats!", + "th_TH": "ติดตั้งตามประเภทของไฟล์สำเร็จแล้ว!", + "tr_TR": "Dosya uzantıları başarıyla yüklendi!", + "uk_UA": "Успішно встановлено типи файлів!", + "zh_CN": "关联文件类型成功!", + "zh_TW": "成功安裝檔案類型!" + } + }, + { + "ID": "DialogInstallFileTypesErrorMessage", + "Translations": { + "ar_SA": "فشل تثبيت أنواع الملفات.", + "de_DE": "Dateitypen konnten nicht installiert werden.", + "el_GR": "Απέτυχε η εγκατάσταση τύπων αρχείων.", + "en_US": "Failed to install file types.", + "es_ES": "No se pudo desinstalar los tipos de archivo.", + "fr_FR": "Échec de l'installation des types de fichiers.", + "he_IL": "נכשל בהתקנת סוגי קבצים.", + "it_IT": "Impossibile installare i tipi di file.", + "ja_JP": "ファイル形式のインストールに失敗しました.", + "ko_KR": "파일 형식을 설치하지 못했습니다.", + "no_NO": "Kunne ikke installere filtyper.", + "pl_PL": "Nie udało się zainstalować typów plików.", + "pt_BR": "Falha ao instalar tipos de arquivo.", + "ru_RU": "Не удалось установить типы файлов.", + "sv_SE": "Misslyckades med att installera filtyper.", + "th_TH": "ติดตั้งตามประเภทของไฟล์ไม่สำเร็จ", + "tr_TR": "Dosya uzantıları yükleme işlemi başarısız oldu.", + "uk_UA": "Не вдалося встановити типи файлів.", + "zh_CN": "关联文件类型失败!", + "zh_TW": "無法安裝檔案類型。" + } + }, + { + "ID": "DialogUninstallFileTypesSuccessMessage", + "Translations": { + "ar_SA": "تم إلغاء تثبيت أنواع الملفات بنجاح!", + "de_DE": "Dateitypen erfolgreich deinstalliert!", + "el_GR": "Επιτυχής απεγκατάσταση τύπων αρχείων!", + "en_US": "Successfully uninstalled file types!", + "es_ES": "¡Tipos de archivos desinstalados con éxito!", + "fr_FR": "Types de fichiers désinstallés avec succès!", + "he_IL": "סוגי קבצים הוסרו בהצלחה!", + "it_IT": "Tipi di file disinstallati con successo!", + "ja_JP": "ファイル形式のアンインストールに成功しました!", + "ko_KR": "파일 형식이 성공적으로 제거되었습니다!", + "no_NO": "Filtyper ble avinstallert!", + "pl_PL": "Pomyślnie odinstalowano typy plików!", + "pt_BR": "Tipos de arquivo desinstalados com sucesso!", + "ru_RU": "Типы файлов успешно удалены", + "sv_SE": "Filtyper avinstallerades!", + "th_TH": "ถอนการติดตั้งตามประเภทของไฟล์สำเร็จแล้ว!", + "tr_TR": "Dosya uzantıları başarıyla kaldırıldı!", + "uk_UA": "Успішно видалено типи файлів!", + "zh_CN": "成功解除文件类型关联!", + "zh_TW": "成功移除檔案類型!" + } + }, + { + "ID": "DialogUninstallFileTypesErrorMessage", + "Translations": { + "ar_SA": "فشل إلغاء تثبيت أنواع الملفات.", + "de_DE": "Deinstallation der Dateitypen fehlgeschlagen.", + "el_GR": "Αποτυχία απεγκατάστασης τύπων αρχείων.", + "en_US": "Failed to uninstall file types.", + "es_ES": "No se pudo desinstalar los tipos de archivo.", + "fr_FR": "Échec de la désinstallation des types de fichiers.", + "he_IL": "נכשל בהסרת סוגי קבצים.", + "it_IT": "Disinstallazione dei tipi di file non riuscita.", + "ja_JP": "ファイル形式のアンインストールに失敗しました.", + "ko_KR": "파일 형식을 제거하지 못했습니다.", + "no_NO": "Kunne ikke avinstallere filtyper.", + "pl_PL": "Nie udało się odinstalować typów plików.", + "pt_BR": "Falha ao desinstalar tipos de arquivo.", + "ru_RU": "Не удалось удалить типы файлов.", + "sv_SE": "Misslyckades med att avinstallera filtyper.", + "th_TH": "ไม่สามารถถอนการติดตั้งตามประเภทของไฟล์ได้", + "tr_TR": "Dosya uzantıları kaldırma işlemi başarısız oldu.", + "uk_UA": "Не вдалося видалити типи файлів.", + "zh_CN": "解除文件类型关联失败!", + "zh_TW": "無法移除檔案類型。" + } + }, + { + "ID": "DialogOpenSettingsWindowLabel", + "Translations": { + "ar_SA": "فتح نافذة الإعدادات", + "de_DE": "Fenster-Einstellungen öffnen", + "el_GR": "Άνοιγμα Παραθύρου Ρυθμίσεων", + "en_US": "Open Settings Window", + "es_ES": "Abrir ventana de opciones", + "fr_FR": "Ouvrir la fenêtre des paramètres", + "he_IL": "פתח את חלון ההגדרות", + "it_IT": "Apri finestra delle impostazioni", + "ja_JP": "設定ウインドウを開く", + "ko_KR": "설정 창 열기", + "no_NO": "Åpne innstillinger-vinduet", + "pl_PL": "Otwórz Okno Ustawień", + "pt_BR": "Abrir Janela de Configurações", + "ru_RU": "Открывает окно параметров", + "sv_SE": "Öppna inställningar", + "th_TH": "เปิดหน้าต่างการตั้งค่า", + "tr_TR": "Seçenekler Penceresini Aç", + "uk_UA": "Відкрити вікно налаштувань", + "zh_CN": "打开设置窗口", + "zh_TW": "開啟設定視窗" + } + }, + { + "ID": "DialogOpenXCITrimmerWindowLabel", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "XCI Trimmer Window", + "es_ES": "Ventana recortador XCI", + "fr_FR": "Fenêtre de réduction de fichiers XCI", + "he_IL": "", + "it_IT": "Riduci dimensioni dei file XCI", + "ja_JP": "", + "ko_KR": "XCI 트리머 창", + "no_NO": "XCI Trimmervindu", + "pl_PL": "", + "pt_BR": "Janela de Redução XCI", + "ru_RU": "Окно триммера XCI", + "sv_SE": "XCI-optimerare", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вікно XCI Тримера", + "zh_CN": "XCI 文件瘦身窗口", + "zh_TW": "XCI 修剪器視窗" + } + }, + { + "ID": "DialogControllerAppletTitle", + "Translations": { + "ar_SA": "تطبيق وحدة التحكم المصغر", + "de_DE": "Controller-Applet", + "el_GR": "Applet Χειρισμού", + "en_US": "Controller Applet", + "es_ES": "Applet de mandos", + "fr_FR": "Programme Manette", + "he_IL": "יישומון בקר", + "it_IT": "Applet del controller", + "ja_JP": "コントローラアプレット", + "ko_KR": "컨트롤러 애플릿", + "no_NO": "Kontroller Applet", + "pl_PL": "Aplet Kontrolera", + "pt_BR": "Applet de Controle", + "ru_RU": "Апплет контроллера", + "sv_SE": "Handkontroller-applet", + "th_TH": "คอนโทรลเลอร์ Applet", + "tr_TR": "Kumanda Applet'i", + "uk_UA": "Аплет контролера", + "zh_CN": "控制器小窗口", + "zh_TW": "控制器小程式" + } + }, + { + "ID": "DialogMessageDialogErrorExceptionMessage", + "Translations": { + "ar_SA": "خطأ في عرض مربع حوار الرسالة: {0}", + "de_DE": "Fehler bei der Anzeige des Meldungs-Dialogs: {0}", + "el_GR": "Σφάλμα εμφάνισης του διαλόγου Μηνυμάτων: {0}", + "en_US": "Error displaying Message Dialog: {0}", + "es_ES": "Error al mostrar cuadro de diálogo: {0}", + "fr_FR": "Erreur lors de l'affichage de la boîte de dialogue : {0}", + "he_IL": "שגיאה בהצגת דיאלוג ההודעה: {0}", + "it_IT": "Errore nella visualizzazione della finestra di dialogo: {0}", + "ja_JP": "メッセージダイアログ表示エラー: {0}", + "ko_KR": "메시지 대화 상자 표시 오류 : {0}", + "no_NO": "Feil ved visning av meldings-dialog: {0}", + "pl_PL": "Błąd wyświetlania okna Dialogowego Wiadomości: {0}", + "pt_BR": "Erro ao exibir diálogo de mensagem: {0}", + "ru_RU": "Ошибка отображения сообщения: {0}", + "sv_SE": "Fel vid visning av meddelandedialog: {0}", + "th_TH": "เกิดข้อผิดพลาดในการแสดงกล่องโต้ตอบข้อความ: {0}", + "tr_TR": "Mesaj diyaloğu gösterilirken hata: {0}", + "uk_UA": "Помилка показу діалогового вікна повідомлення: {0}", + "zh_CN": "显示消息对话框时出错:{0}", + "zh_TW": "顯示訊息對話方塊時出現錯誤: {0}" + } + }, + { + "ID": "DialogSoftwareKeyboardErrorExceptionMessage", + "Translations": { + "ar_SA": "خطأ في عرض لوحة مفاتيح البرامج: {0}", + "de_DE": "Fehler bei der Anzeige der Software-Tastatur: {0}", + "el_GR": "Σφάλμα εμφάνισης Λογισμικού Πληκτρολογίου: {0}", + "en_US": "Error displaying Software Keyboard: {0}", + "es_ES": "Error al mostrar teclado de software: {0}", + "fr_FR": "Erreur lors de l'affichage du clavier logiciel: {0}", + "he_IL": "שגיאה בהצגת תוכנת המקלדת: {0}", + "it_IT": "Errore nella visualizzazione della tastiera software: {0}", + "ja_JP": "ソフトウェアキーボード表示エラー: {0}", + "ko_KR": "소프트웨어 키보드 표시 오류 : {0}", + "no_NO": "Feil ved visning av programvaretastatur: {0}", + "pl_PL": "Błąd wyświetlania Klawiatury Oprogramowania: {0}", + "pt_BR": "Erro ao exibir teclado virtual: {0}", + "ru_RU": "Ошибка отображения программной клавиатуры: {0}", + "sv_SE": "Fel vid visning av programvarutangentbord: {0}", + "th_TH": "เกิดข้อผิดพลาดในการแสดงซอฟต์แวร์แป้นพิมพ์: {0}", + "tr_TR": "Mesaj diyaloğu gösterilirken hata: {0}", + "uk_UA": "Помилка показу програмної клавіатури: {0}", + "zh_CN": "显示软件键盘时出错:{0}", + "zh_TW": "顯示軟體鍵盤時出現錯誤: {0}" + } + }, + { + "ID": "DialogErrorAppletErrorExceptionMessage", + "Translations": { + "ar_SA": "خطأ في عرض مربع حوار خطأ التطبيق المصغر: {0}", + "de_DE": "Fehler beim Anzeigen des ErrorApplet-Dialogs: {0}", + "el_GR": "Σφάλμα εμφάνισης του διαλόγου ErrorApplet: {0}", + "en_US": "Error displaying ErrorApplet Dialog: {0}", + "es_ES": "Error al mostrar díalogo ErrorApplet: {0}", + "fr_FR": "Erreur lors de l'affichage de la boîte de dialogue ErrorApplet: {0}", + "he_IL": "שגיאה בהצגת דיאלוג ErrorApplet: {0}", + "it_IT": "Errore nella visualizzazione della finestra dell'ErrorApplet: {0}", + "ja_JP": "エラーアプレットダイアログ表示エラー: {0}", + "ko_KR": "애플릿 오류 대화 상자 표시 오류 : {0}", + "no_NO": "Feil ved visning av Feilmeldingsdialog: {0}", + "pl_PL": "Błąd wyświetlania okna Dialogowego ErrorApplet: {0}", + "pt_BR": "Erro ao exibir applet ErrorApplet: {0}", + "ru_RU": "Ошибка отображения диалогового окна ErrorApplet: {0}", + "sv_SE": "Fel vid visning av ErrorApplet-dialog: {0}", + "th_TH": "เกิดข้อผิดพลาดในการแสดงกล่องโต้ตอบ ข้อผิดพลาดของ Applet: {0}", + "tr_TR": "Applet diyaloğu gösterilirken hata: {0}", + "uk_UA": "Помилка показу діалогового вікна ErrorApplet: {0}", + "zh_CN": "显示错误对话框时出错:{0}", + "zh_TW": "顯示錯誤對話方塊時出現錯誤: {0}" + } + }, + { + "ID": "DialogUserErrorDialogMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0}: {1}", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "{0} : {1}", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "DialogUserErrorDialogInfoMessage", + "Translations": { + "ar_SA": "لمزيد من المعلومات حول كيفية إصلاح هذا الخطأ، اتبع دليل الإعداد الخاص بنا.", + "de_DE": "\nWeitere Informationen zur Behebung dieses Fehlers können in unserem Setup-Guide gefunden werden.", + "el_GR": "\nΓια πληροφορίες σχετικά με τον τρόπο διόρθωσης του σφάλματος, ακολουθήστε τον Οδηγό Εγκατάστασης.", + "en_US": "\nFor more information on how to fix this error, follow our Setup Guide.", + "es_ES": "\nPara más información sobre cómo arreglar este error, sigue nuestra Guía de Instalación.", + "fr_FR": "\nPour plus d'informations sur la manière de corriger cette erreur, suivez notre Guide d'Installation.", + "he_IL": "\nלמידע נוסף על איך לתקן שגיאה זו, עקוב אחר מדריך ההתקנה שלנו.", + "it_IT": "\nPer maggiori informazioni su come risolvere questo errore, segui la nostra guida all'installazione.", + "ja_JP": "\nこのエラーへの対処方法については, セットアップガイドを参照してください.", + "ko_KR": "\n이 오류를 해결하는 방법에 대한 자세한 내용은 설정 가이드를 참조하세요.", + "no_NO": "\nFor mer informasjon om hvordan du fikser denne feilen, følg vår oppsettsveiledning.", + "pl_PL": "\nAby uzyskać więcej informacji o tym, jak naprawić ten błąd, zapoznaj się z naszym Przewodnikiem instalacji.", + "pt_BR": "\nPara mais informações sobre como corrigir esse erro, siga nosso Guia de Configuração.", + "ru_RU": "\nДля получения дополнительной информации о том, как исправить эту ошибку, следуйте нашему Руководству по установке.", + "sv_SE": "\nFölj vår konfigurationsguide för mer information om hur man rättar till detta fel.", + "th_TH": "\nสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขข้อผิดพลาดนี้ โปรดทำตามคำแนะนำในการตั้งค่าของเรา", + "tr_TR": "\nBu hatayı düzeltmek adına daha fazla bilgi için kurulum kılavuzumuzu takip edin.", + "uk_UA": "\nДля отримання додаткової інформації про те, як виправити цю помилку, дотримуйтесь нашого посібника з налаштування.", + "zh_CN": "\n有关修复此错误的更多信息,可以查看我们的安装指南。", + "zh_TW": "\n有關如何修復此錯誤的更多資訊,請參閱我們的設定指南。" + } + }, + { + "ID": "DialogUserErrorDialogTitle", + "Translations": { + "ar_SA": "خطأ ريوجينكس ({0})", + "de_DE": "Ryujinx Fehler ({0})", + "el_GR": "Σφάλμα Ryujinx ({0})", + "en_US": "Ryujinx Error ({0})", + "es_ES": "", + "fr_FR": "Erreur Ryujinx ({0})", + "he_IL": "שגיאת Ryujinx ({0})", + "it_IT": "Errore di Ryujinx ({0})", + "ja_JP": "Ryujinx エラー ({0})", + "ko_KR": "Ryujinx 오류 ({0})", + "no_NO": "Ryujinx Feilmelding ({0})", + "pl_PL": "Błąd Ryujinxa ({0})", + "pt_BR": "Erro do Ryujinx ({0})", + "ru_RU": "Ошибка Ryujinx ({0})", + "sv_SE": "Ryujinx-fel ({0}", + "th_TH": "ข้อผิดพลาด Ryujinx ({0})", + "tr_TR": "Ryujinx Hatası ({0})", + "uk_UA": "Помилка Ryujinx ({0})", + "zh_CN": "Ryujinx 错误 ({0})", + "zh_TW": "Ryujinx 錯誤 ({0})" + } + }, + { + "ID": "DialogAmiiboApiTitle", + "Translations": { + "ar_SA": "أميبو API", + "de_DE": "Amiibo-API", + "el_GR": "API για Amiibo.", + "en_US": "Amiibo API", + "es_ES": "", + "fr_FR": "API Amiibo", + "he_IL": "ממשק תכנות אמיבו", + "it_IT": "API Amiibo", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "API Amiibo", + "pt_BR": "API Amiibo", + "ru_RU": "API Amiibo", + "sv_SE": "Amiibo-API", + "th_TH": "", + "tr_TR": "", + "uk_UA": "API Amiibo", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "DialogAmiiboApiFailFetchMessage", + "Translations": { + "ar_SA": "حدث خطأ أثناء جلب المعلومات من API.", + "de_DE": "Beim Abrufen von Informationen aus der API ist ein Fehler aufgetreten.", + "el_GR": "Παρουσιάστηκε σφάλμα κατά την ανάκτηση πληροφοριών από το API.", + "en_US": "An error occured while fetching information from the API.", + "es_ES": "Ocurrió un error al recibir información de la API.", + "fr_FR": "Une erreur est survenue lors de la récupération des informations de l'API.", + "he_IL": "אירעה שגיאה בעת שליפת מידע מהממשק.", + "it_IT": "Si è verificato un errore durante il recupero delle informazioni dall'API.", + "ja_JP": "API からの情報取得中にエラーが発生しました.", + "ko_KR": "API에서 정보를 가져오는 중에 오류가 발생했습니다.", + "no_NO": "En feil oppstod under henting av informasjon fra API.", + "pl_PL": "Wystąpił błąd podczas pobierania informacji z API.", + "pt_BR": "Um erro ocorreu ao tentar obter informações da API.", + "ru_RU": "Произошла ошибка при получении информации из API.", + "sv_SE": "Ett fel inträffade vid hämtning av information från API.", + "th_TH": "เกิดข้อผิดพลาดขณะเรียกข้อมูลจาก API", + "tr_TR": "API'dan bilgi alırken bir hata oluştu.", + "uk_UA": "Під час отримання інформації з API сталася помилка.", + "zh_CN": "从 API 获取信息时出错。", + "zh_TW": "從 API 取得資訊時出現錯誤。" + } + }, + { + "ID": "DialogAmiiboApiConnectErrorMessage", + "Translations": { + "ar_SA": "غير قادر على الاتصال بخادم API أميبو. قد تكون الخدمة معطلة أو قد تحتاج إلى التحقق من اتصالك بالإنترنت.", + "de_DE": "Verbindung zum Amiibo API Server kann nicht hergestellt werden. Der Dienst ist möglicherweise nicht verfügbar oder es existiert keine Internetverbindung.", + "el_GR": "Δεν είναι δυνατή η σύνδεση με τον διακομιστή Amiibo API. Η υπηρεσία μπορεί να είναι εκτός λειτουργίας ή μπορεί να χρειαστεί να επαληθεύσετε ότι έχετε ενεργή σύνδεσή στο Διαδίκτυο.", + "en_US": "Unable to connect to Amiibo API server. The service may be down or you may need to verify your internet connection is online.", + "es_ES": "No se pudo conectar al servidor de la API Amiibo. El servicio puede estar caído o tu conexión a internet puede haberse desconectado.", + "fr_FR": "Impossible de se connecter au serveur API Amiibo. Le service est peut-être hors service ou vous devriez peut-être vérifier que votre connexion internet est connectée.", + "he_IL": "לא ניתן להתחבר לממשק שרת האמיבו. ייתכן שהשירות מושבת או שתצטרך לוודא שהחיבור לאינטרנט שלך מקוון.", + "it_IT": "Impossibile connettersi al server dell'API Amiibo. Il servizio potrebbe non essere disponibile o potresti non essere connesso a Internet.", + "ja_JP": "Amiibo API サーバに接続できませんでした. サーバがダウンしているか, インターネット接続に問題があるかもしれません.", + "ko_KR": "Amiibo API 서버에 연결할 수 없습니다. 서비스가 다운되었거나 인터넷 연결이 온라인 상태인지 확인이 필요합니다.", + "no_NO": "Kan ikke koble til Amiibo API server. Tjenesten kan være nede, eller du må kanskje verifisere at din internettforbindelse er tilkoblet.", + "pl_PL": "Nie można połączyć się z serwerem API Amiibo. Usługa może nie działać lub może być konieczne sprawdzenie, czy połączenie internetowe jest online.", + "pt_BR": "Não foi possível conectar ao servidor da API Amiibo. O serviço pode estar fora do ar ou você precisa verificar sua conexão com a Internet.", + "ru_RU": "Не удалось подключиться к серверу Amiibo API. Служба может быть недоступна или вам может потребоваться проверить ваше интернет-соединение.", + "sv_SE": "Kunde inte ansluta till Amiibo API-server. Tjänsten kanske är nere eller så behöver du kontrollera att din internetanslutning fungerar.", + "th_TH": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ Amiibo API บางบริการอาจหยุดทำงาน หรือไม่คุณต้องทำการตรวจสอบว่าอินเทอร์เน็ตของคุณอยู่ในสถานะเชื่อมต่ออยู่หรือไม่", + "tr_TR": "Amiibo API sunucusuna bağlanılamadı. Sunucu çevrimdışı olabilir veya uygun bir internet bağlantınızın olduğunu kontrol etmeniz gerekebilir.", + "uk_UA": "Неможливо підключитися до сервера Amiibo API. Можливо, служба не працює або вам потрібно перевірити, чи є підключення до Інтернету.", + "zh_CN": "无法连接到 Amiibo API 服务器,服务可能已关闭,或者没有连接互联网。", + "zh_TW": "無法連接 Amiibo API 伺服器。服務可能已停機,或者您可能需要確認網際網路連線是否在線上。" + } + }, + { + "ID": "DialogProfileInvalidProfileErrorMessage", + "Translations": { + "ar_SA": "الملف الشخصي {0} غير متوافق مع نظام تكوين الإدخال الحالي.", + "de_DE": "Das Profil {0} ist mit dem aktuellen Eingabekonfigurationssystem nicht kompatibel.", + "el_GR": "Το προφίλ {0} δεν είναι συμβατό με το τρέχον σύστημα χειρισμού.", + "en_US": "Profile {0} is incompatible with the current input configuration system.", + "es_ES": "El perfil {0} no es compatible con el sistema actual de configuración de entrada.", + "fr_FR": "Le profil {0} est incompatible avec le système de configuration de manette actuel.", + "he_IL": "הפרופיל {0} אינו תואם למערכת תצורת הקלט הנוכחית.", + "it_IT": "Il profilo {0} non è compatibile con l'attuale sistema di configurazione input.", + "ja_JP": "プロファイル {0} は現在の入力設定システムと互換性がありません.", + "ko_KR": "프로필 {0}은(는) 현재 입력 구성 시스템과 호환되지 않습니다.", + "no_NO": "Profil {0} er ikke kompatibel med den gjeldende inndata konfigurasjonen", + "pl_PL": "Profil {0} jest niezgodny z bieżącym systemem konfiguracji sterowania.", + "pt_BR": "Perfil {0} é incompatível com o sistema de configuração de controle atual.", + "ru_RU": "Профиль {0} несовместим с текущей системой конфигурации ввода.", + "sv_SE": "Profilen {0} är inte kompatibel med aktuell konfiguration för inmatning.", + "th_TH": "โปรไฟล์ {0} ไม่สามารถทำงานได้กับระบบกำหนดค่าอินพุตปัจจุบัน", + "tr_TR": "Profil {0} güncel giriş konfigürasyon sistemi ile uyumlu değil.", + "uk_UA": "Профіль {0} несумісний із поточною системою конфігурації вводу.", + "zh_CN": "配置文件 {0} 与当前输入配置系统不兼容。", + "zh_TW": "設定檔 {0} 與目前輸入配置系統不相容。" + } + }, + { + "ID": "DialogProfileDefaultProfileOverwriteErrorMessage", + "Translations": { + "ar_SA": "لا يمكن الكتابة فوق الملف الشخصي الافتراضي", + "de_DE": "Das Standardprofil kann nicht überschrieben werden", + "el_GR": "Το προεπιλεγμένο προφίλ δεν μπορεί να αντικατασταθεί", + "en_US": "Default Profile can not be overwritten", + "es_ES": "El perfil predeterminado no se puede sobreescribir", + "fr_FR": "Le profil par défaut ne peut pas être écrasé", + "he_IL": "לא ניתן להחליף את פרופיל ברירת המחדל", + "it_IT": "Il profilo predefinito non può essere sovrascritto", + "ja_JP": "デフォルトのプロファイルは上書きできません", + "ko_KR": "기본 프로필은 덮어쓸 수 없음", + "no_NO": "Standard profil kan ikke overskrives", + "pl_PL": "Profil Domyślny nie może zostać nadpisany", + "pt_BR": "O perfil Padrão não pode ser substituído", + "ru_RU": "Профиль по умолчанию не может быть перезаписан", + "sv_SE": "Standardprofilen kan inte skrivas över", + "th_TH": "โปรไฟล์เริ่มต้นไม่สามารถเขียนทับได้", + "tr_TR": "Varsayılan Profil'in üstüne yazılamaz", + "uk_UA": "Стандартний профіль не можна перезаписати", + "zh_CN": "不允许覆盖默认配置文件", + "zh_TW": "無法覆蓋預設設定檔" + } + }, + { + "ID": "DialogProfileDeleteProfileTitle", + "Translations": { + "ar_SA": "حذف الملف الشخصي", + "de_DE": "Profil löschen", + "el_GR": "Διαγραφή Προφίλ", + "en_US": "Deleting Profile", + "es_ES": "Eliminando perfil", + "fr_FR": "Suppression du profil", + "he_IL": "מוחק פרופיל", + "it_IT": "Eliminazione profilo", + "ja_JP": "プロファイルを削除中", + "ko_KR": "프로필 삭제하기", + "no_NO": "Sletter profil", + "pl_PL": "Usuwanie Profilu", + "pt_BR": "Apagando Perfil", + "ru_RU": "Удаление профиля", + "sv_SE": "Tar bort profilen", + "th_TH": "กำลังลบโปรไฟล์", + "tr_TR": "Profil Siliniyor", + "uk_UA": "Видалення профілю", + "zh_CN": "删除配置文件", + "zh_TW": "刪除設定檔" + } + }, + { + "ID": "DialogProfileDeleteProfileMessage", + "Translations": { + "ar_SA": "هذا الإجراء لا رجعة فيه، هل أنت متأكد من أنك تريد المتابعة؟", + "de_DE": "Diese Aktion kann nicht rückgängig gemacht werden. Wirklich fortfahren?", + "el_GR": "Αυτή η ενέργεια είναι μη αναστρέψιμη, είστε βέβαιοι ότι θέλετε να συνεχίσετε;", + "en_US": "This action is irreversible, are you sure you want to continue?", + "es_ES": "Esta acción es irreversible, ¿estás seguro de querer continuar?", + "fr_FR": "Cette action est irréversible, êtes-vous sûr de vouloir continuer ?", + "he_IL": "פעולה זו היא בלתי הפיכה, האם אתם בטוחים שברצונכם להמשיך?", + "it_IT": "Quest'azione è irreversibile, sei sicuro di voler continuare?", + "ja_JP": "このアクションは元に戻せません. 本当に続けてよろしいですか?", + "ko_KR": "이 작업은 되돌릴 수 없습니다. 계속하시겠습니까?", + "no_NO": "Denne handlingen er irreversibel, er du sikker på at du vil fortsette?", + "pl_PL": "Ta czynność jest nieodwracalna, czy na pewno chcesz kontynuować?", + "pt_BR": "Essa ação é irreversível, tem certeza que deseja continuar?", + "ru_RU": "Это действие необратимо. Вы уверены, что хотите продолжить?", + "sv_SE": "Denna åtgärd går inte att ångra. Är du säker på att du vill fortsätta?", + "th_TH": "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", + "tr_TR": "Bu eylem geri döndürülemez, devam etmek istediğinizden emin misiniz?", + "uk_UA": "Цю дію неможливо скасувати. Ви впевнені, що бажаєте продовжити?", + "zh_CN": "删除后不可恢复,确认删除吗?", + "zh_TW": "此動作不可復原,您確定要繼續嗎?" + } + }, + { + "ID": "DialogWarning", + "Translations": { + "ar_SA": "تحذير", + "de_DE": "Warnung", + "el_GR": "Προειδοποίηση", + "en_US": "Warning", + "es_ES": "Advertencia", + "fr_FR": "Avertissement", + "he_IL": "אזהרה", + "it_IT": "Avviso", + "ja_JP": "警告", + "ko_KR": "경고", + "no_NO": "Advarsel", + "pl_PL": "Uwaga", + "pt_BR": "Alerta", + "ru_RU": "Внимание", + "sv_SE": "Varning", + "th_TH": "คำเตือน", + "tr_TR": "Uyarı", + "uk_UA": "Увага", + "zh_CN": "警告", + "zh_TW": "警告" + } + }, + { + "ID": "DialogPPTCDeletionMessage", + "Translations": { + "ar_SA": "أنت على وشك الإنتظار لإعادة بناء ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) عند الإقلاع التالي لـ:\n\n{0}\n\nأمتأكد من رغبتك في المتابعة؟", + "de_DE": "Du bist dabei den PPTC für das folgende Spiel als ungültig zu markieren:\n\n{0}\n\nWirklich fortfahren?", + "el_GR": "Πρόκειται να διαγράψετε την προσωρινή μνήμη PPTC για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;", + "en_US": "You are about to queue a PPTC rebuild on the next boot of:\n\n{0}\n\nAre you sure you want to proceed?", + "es_ES": "Vas a borrar la caché de PPTC para:\n\n{0}\n\n¿Estás seguro de querer continuar?", + "fr_FR": "Vous êtes sur le point de programmer une reconstruction PPTC au prochain démarrage de :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?", + "he_IL": "אם תמשיכו אתם עומדים לגרום לבנייה מחדש של מטמון ה-PPTC עבור:\n\n{0}", + "it_IT": "Stai per accodare la rigenerazione della cache PPTC al prossimo avvio per:\n\n{0}\n\nSei sicuro di voler proseguire?", + "ja_JP": "次回起動時に PPTC を再構築します:\n\n{0}\n\n実行してよろしいですか?", + "ko_KR": "다음에 부팅할 때, PPTC 재구축을 대기열에 추가하려고 합니다.\n\n{0}\n\n계속하시겠습니까?", + "no_NO": "Du er i ferd med å bygge en PPTC i køen ved neste oppstart av:\n\n{0}\n\nEr du sikker på at du vil fortsette?", + "pl_PL": "Masz zamiar umieścić w kolejce rekompilację PPTC przy następnym uruchomieniu:\n\n{0}\n\nCzy na pewno chcesz kontynuować?", + "pt_BR": "Você está prestes a enfileirar uma reconstrução PPTC na próxima inicialização de:\n\n{0}\n\nTem certeza de que deseja continuar?", + "ru_RU": "Вы собираетесь перестроить кэш PPTC при следующем запуске для:\n\n{0}\n\nВы уверены, что хотите продолжить?", + "sv_SE": "Du är på väg att kölägga en PPTC rebuild vid nästa uppstart av:\n\n{0}\n\nÄr du säker på att du vill fortsätta?", + "th_TH": "คุณกำลังตั้งค่าให้มีการสร้าง PPTC ใหม่ในการบูตครั้งถัดไป:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", + "tr_TR": "Belirtilen PPTC cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?", + "uk_UA": "Ви збираєтеся видалити кеш PPTC для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?", + "zh_CN": "您即将删除:\n\n{0} 的 PPTC 缓存文件\n\n确定吗?", + "zh_TW": "您將在下一次啟動時佇列重建以下遊戲的 PPTC:\n\n{0}\n\n您確定要繼續嗎?" + } + }, + { + "ID": "DialogPPTCDeletionErrorMessage", + "Translations": { + "ar_SA": "خطأ خلال تنظيف ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) في {0}: {1}", + "de_DE": "Fehler bei der Löschung des PPTC Caches bei {0}: {1}", + "el_GR": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης PPTC στο {0}: {1}", + "en_US": "Error purging PPTC cache at {0}: {1}", + "es_ES": "Error purgando la caché de PPTC en {0}: {1}", + "fr_FR": "Erreur lors de la purge du cache PPTC à {0}: {1}", + "he_IL": "שגיאה בטיהור מטמון PPTC ב-{0}: {1}", + "it_IT": "Errore nell'eliminazione della cache PPTC a {0}: {1}", + "ja_JP": "PPTC キャッシュ破棄エラー {0}: {1}", + "ko_KR": "{0}에서 PPTC 캐시를 지우는 중 오류 발생 : {1}", + "no_NO": "Feil under rensing av PPTC cache ved {0}: {1}", + "pl_PL": "Błąd czyszczenia cache PPTC w {0}: {1}", + "pt_BR": "Erro ao limpar cache PPTC em {0}: {1}", + "ru_RU": "Ошибка очистки кэша PPTC в {0}: {1}", + "sv_SE": "Fel vid tömning av PPTC-cache i {0}: {1}", + "th_TH": "มีข้อผิดพลาดในการล้างแคช PPTC {0}: {1}", + "tr_TR": "Belirtilen PPTC cache temizlenirken hata {0}: {1}", + "uk_UA": "Помилка очищення кешу PPTC на {0}: {1}", + "zh_CN": "清除 {0} 的 PPTC 缓存文件时出错:{1}", + "zh_TW": "在 {0} 清除 PPTC 快取時出錯: {1}" + } + }, + { + "ID": "DialogPPTCNukeMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "You are about to purge all PPTC data from:\n\n{0}\n\nAre you sure you want to proceed?", + "es_ES": "", + "fr_FR": "Vous êtes sur le point de supprimer toutes les données PPTC de :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "다음에서 모든 PPTC 데이터를 제거하려고 합니다:\n\n{0}\n\n계속하시겠습니까?", + "no_NO": "Du er i ferd med å slette alle PPTC-data fra:\n\n{0}\n\n\nEr du sikker på at du vil fortsette?", + "pl_PL": "", + "pt_BR": "Você está prestes a limpar todos os dados PPTC de:\n\n{0}\n\nTem certeza de que deseja continuar?", + "ru_RU": "Вы собираетесь удалить все данные PPTC из:\n\n{0}\n\nВы уверены, что хотите продолжить?", + "sv_SE": "Du är på väg att ta bort allt PPTC-data från:\n\n{0}\n\nÄr du säker på att du vill fortsätta?", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Ви збираєтесь видалити всі дані PPTC з:\n\n{0}\n\nБажаєте продовжити цю операцію?", + "zh_CN": "您正要清理 PPTC 数据:\n\n{0}\n\n您确实要继续吗?", + "zh_TW": "您將要刪除以下遊戲的 PPTC:\n\n{0}\n\n您確定要繼續嗎?" + } + }, + { + "ID": "DialogShaderDeletionMessage", + "Translations": { + "ar_SA": "أنت على وشك حذف ذاكرة المظللات المؤقتة ل:\n\n{0}\n\nهل انت متأكد انك تريد المتابعة؟", + "de_DE": "Du bist dabei, den Shader Cache zu löschen für :\n\n{0}\n\nWirklich fortfahren?", + "el_GR": "Πρόκειται να διαγράψετε την προσωρινή μνήμη Shader για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;", + "en_US": "You are about to delete the Shader cache for :\n\n{0}\n\nAre you sure you want to proceed?", + "es_ES": "Vas a borrar la caché de sombreadores para:\n\n{0}\n\n¿Estás seguro de querer continuar?", + "fr_FR": "Vous êtes sur le point de supprimer le cache des shaders pour :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?", + "he_IL": "אם תמשיכו אתם עומדים למחוק את מטמון ההצללות עבור:\n\n{0}", + "it_IT": "Stai per eliminare la cache degli shader per:\n\n{0}\n\nSei sicuro di voler proseguire?", + "ja_JP": "シェーダーキャッシュを破棄しようとしています:\n\n{0}\n\n実行してよろしいですか?", + "ko_KR": "다음 셰이더 캐시를 삭제 :\n\n{0}\n\n계속하시겠습니까?", + "no_NO": "Du er i ferd med å slette Shader cachen for :\n\n{0}\n\nEr du sikker på at du vil fortsette?", + "pl_PL": "Zamierzasz usunąć cache Shaderów dla :\n\n{0}\n\nNa pewno chcesz kontynuować?", + "pt_BR": "Você está prestes a apagar o cache de Shader para :\n\n{0}\n\nTem certeza que deseja continuar?", + "ru_RU": "Вы собираетесь удалить кэш шейдеров для:\n\n{0}\n\nВы уверены, что хотите продолжить?", + "sv_SE": "Du är på väg att ta bort shader cache för :\n\n{0}\n\nÄr du säker på att du vill fortsätta?", + "th_TH": "คุณกำลังจะลบแคชแสงเงา:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", + "tr_TR": "Belirtilen Shader cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?", + "uk_UA": "Ви збираєтеся видалити кеш шейдерів для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?", + "zh_CN": "您即将删除:\n\n{0} 的着色器缓存文件\n\n确定吗?", + "zh_TW": "您將刪除以下遊戲的著色器快取:\n\n{0}\n\n您確定要繼續嗎?" + } + }, + { + "ID": "DialogShaderDeletionErrorMessage", + "Translations": { + "ar_SA": "حدث خطأ أثناء تنظيف ذاكرة المظللات المؤقتة في {0}: {1}", + "de_DE": "Es ist ein Fehler bei der Löschung des Shader Caches bei {0}: {1} aufgetreten", + "el_GR": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης Shader στο {0}: {1}", + "en_US": "Error purging Shader cache at {0}: {1}", + "es_ES": "Error purgando la caché de sombreadores en {0}: {1}", + "fr_FR": "Erreur lors de l’élimination du cache des shaders à {0} : {1}", + "he_IL": "שגיאה בניקוי מטמון ההצללות ב-{0}: {1}", + "it_IT": "Errore nell'eliminazione della cache degli shader a {0}: {1}", + "ja_JP": "シェーダーキャッシュ破棄エラー {0}: {1}", + "ko_KR": "{0}에서 셰이더 캐시를 삭제하는 중 오류 발생 : {1}", + "no_NO": "Feil under tømming av Shader cache ved {0}: {1}", + "pl_PL": "Błąd czyszczenia cache Shaderów w {0}: {1}", + "pt_BR": "Erro ao limpar o cache do Shader em {0}: {1}", + "ru_RU": "Ошибка очистки кэша шейдеров в {0}: {1}", + "sv_SE": "Fel vid tömning av shader cache i {0}: {1}", + "th_TH": "เกิดข้อผิดพลาดในการล้าง แคชแสงเงา {0}: {1}", + "tr_TR": "Belirtilen Shader cache temizlenirken hata {0}: {1}", + "uk_UA": "Помилка очищення кешу шейдерів на {0}: {1}", + "zh_CN": "清除 {0} 的着色器缓存文件时出错:{1}", + "zh_TW": "在 {0} 清除著色器快取時出錯: {1}" + } + }, + { + "ID": "DialogRyujinxErrorMessage", + "Translations": { + "ar_SA": "واجه ريوجينكس خطأ", + "de_DE": "Ein Fehler ist aufgetreten", + "el_GR": "Το Ryujinx αντιμετώπισε σφάλμα", + "en_US": "Ryujinx has encountered an error", + "es_ES": "Ryujinx ha encontrado un error", + "fr_FR": "Ryujinx a rencontré une erreur", + "he_IL": "ריוג'ינקס נתקלה בשגיאה", + "it_IT": "Ryujinx ha incontrato un errore", + "ja_JP": "エラーが発生しました", + "ko_KR": "Ryujinx에서 오류 발생", + "no_NO": "Ryujinx har støtt på ett problem", + "pl_PL": "Ryujinx napotkał błąd", + "pt_BR": "Ryujinx encontrou um erro", + "ru_RU": "Ryujinx обнаружил ошибку", + "sv_SE": "Ryujinx har påträffat ett fel", + "th_TH": "Ryujinx พบข้อผิดพลาด", + "tr_TR": "Ryujinx bir hata ile karşılaştı", + "uk_UA": "У Ryujinx сталася помилка", + "zh_CN": "Ryujinx 模拟器发生错误", + "zh_TW": "Ryujinx 遇到錯誤" + } + }, + { + "ID": "DialogInvalidTitleIdErrorMessage", + "Translations": { + "ar_SA": "خطأ في واجهة المستخدم: اللعبة المحددة لم يكن لديها معرف عنوان صالح", + "de_DE": "UI Fehler: Das ausgewählte Spiel hat keine gültige Titel-ID", + "el_GR": "Σφάλμα UI: Το επιλεγμένο παιχνίδι δεν έχει έγκυρο αναγνωριστικό τίτλου", + "en_US": "UI error: The selected game did not have a valid title ID", + "es_ES": "Error de interfaz: El juego seleccionado no tiene una ID válida", + "fr_FR": "Erreur d'UI : Le jeu sélectionné n'a pas d'ID de titre valide", + "he_IL": "שגיאת ממשק משתמש: למשחק שנבחר לא קיים מזהה משחק", + "it_IT": "Errore UI: Il gioco selezionato non ha un ID titolo valido", + "ja_JP": "UI エラー: 選択されたゲームは有効なタイトル ID を保持していません", + "ko_KR": "UI 오류 : 선택한 게임에 유효한 타이틀 ID가 없음", + "no_NO": "UI-feil: Det valgte spillet har ikke en gyldig tittel-ID", + "pl_PL": "Błąd UI: Wybrana gra nie miała prawidłowego ID tytułu", + "pt_BR": "Erro de interface: O jogo selecionado não tem um ID de título válido", + "ru_RU": "Ошибка пользовательского интерфейса: выбранная игра не имеет действительного ID.", + "sv_SE": "Gränssnittsfel: Angivet spel saknar ett giltigt title ID", + "th_TH": "ข้อผิดพลาดของ UI: เกมที่เลือกไม่มีชื่อ ID ที่ถูกต้อง", + "tr_TR": "Arayüz hatası: Seçilen oyun geçerli bir title ID'ye sahip değil", + "uk_UA": "Помилка інтерфейсу: вибрана гра не мала дійсного ідентифікатора назви", + "zh_CN": "用户界面错误:所选游戏没有有效的游戏 ID", + "zh_TW": "UI 錯誤: 所選遊戲沒有有效的遊戲 ID" + } + }, + { + "ID": "DialogFirmwareInstallerFirmwareNotFoundErrorMessage", + "Translations": { + "ar_SA": "لم يتم العثور على برنامج ثابت للنظام صالح في {0}.", + "de_DE": "Es wurde keine gültige System-Firmware gefunden in {0}.", + "el_GR": "Δεν βρέθηκε έγκυρο Firmware συστήματος στο {0}.", + "en_US": "A valid system firmware was not found in {0}.", + "es_ES": "No se pudo encontrar un firmware válido en {0}.", + "fr_FR": "Un firmware valide n'a pas été trouvé dans {0}.", + "he_IL": "לא נמצאה קושחת מערכת תקפה ב-{0}.", + "it_IT": "Un firmware del sistema valido non è stato trovato in {0}.", + "ja_JP": "{0} には有効なシステムファームウェアがありません.", + "ko_KR": "{0}에서 유효한 시스템 펌웨어를 찾을 수 없습니다.", + "no_NO": "En gyldig systemfastvare ble ikke funnet i {0}.", + "pl_PL": "Nie znaleziono prawidłowego firmware'u systemowego w {0}.", + "pt_BR": "Um firmware de sistema válido não foi encontrado em {0}.", + "ru_RU": "Валидная системная прошивка не найдена в {0}.", + "sv_SE": "Ett giltigt systemfirmware hittades inte i {0}.", + "th_TH": "ไม่พบเฟิร์มแวร์ของระบบที่ถูกต้อง {0}.", + "tr_TR": "{0} da geçerli bir sistem firmware'i bulunamadı.", + "uk_UA": "Дійсна прошивка системи не знайдена в {0}.", + "zh_CN": "在路径 {0} 中找不到有效的 Switch 系统固件。", + "zh_TW": "在 {0} 中未發現有效的系統韌體。" + } + }, + { + "ID": "DialogFirmwareInstallerFirmwareInstallTitle", + "Translations": { + "ar_SA": "تثبيت البرنامج الثابت {0}", + "de_DE": "Installiere Firmware {0}", + "el_GR": "Εγκατάσταση Firmware {0}", + "en_US": "Install Firmware {0}", + "es_ES": "Instalar firmware {0}", + "fr_FR": "Installer le Firmware {0}", + "he_IL": "התקן קושחה {0}", + "it_IT": "Installa firmware {0}", + "ja_JP": "ファームウェア {0} をインストール", + "ko_KR": "펌웨어 {0} 설치", + "no_NO": "Installer fastvare {0}", + "pl_PL": "Zainstaluj Firmware {0}", + "pt_BR": "Instalar Firmware {0}", + "ru_RU": "Установить прошивку {0}", + "sv_SE": "Installera firmware {0}", + "th_TH": "ติดตั้งเฟิร์มแวร์ {0}", + "tr_TR": "Firmware {0} Yükle", + "uk_UA": "Встановити прошивку {0}", + "zh_CN": "安装系统固件 {0}", + "zh_TW": "安裝韌體 {0}" + } + }, + { + "ID": "DialogFirmwareInstallerFirmwareInstallMessage", + "Translations": { + "ar_SA": "سيتم تثبيت إصدار النظام {0}.", + "de_DE": "Systemversion {0} wird jetzt installiert.", + "el_GR": "Θα εγκατασταθεί η έκδοση συστήματος {0}.", + "en_US": "System version {0} will be installed.", + "es_ES": "Se instalará la versión de sistema {0}.", + "fr_FR": "La version {0} du système sera installée.", + "he_IL": "גירסת המערכת {0} תותקן.", + "it_IT": "La versione del sistema {0} sarà installata.", + "ja_JP": "システムバージョン {0} がインストールされます.", + "ko_KR": "시스템 버전 {0}이(가) 설치됩니다.", + "no_NO": "Systemversjon {0} vil bli installert.", + "pl_PL": "Wersja systemu {0} zostanie zainstalowana.", + "pt_BR": "A versão do sistema {0} será instalada.", + "ru_RU": "Будет установлена версия прошивки {0}.", + "sv_SE": "Systemversion {0} kommer att installeras.", + "th_TH": "ระบบเวอร์ชั่น {0} ได้รับการติดตั้งเร็วๆ นี้", + "tr_TR": "Sistem sürümü {0} yüklenecek.", + "uk_UA": "Буде встановлено версію системи {0}.", + "zh_CN": "即将安装系统固件版本 {0} 。", + "zh_TW": "即將安裝系統韌體版本 {0}。" + } + }, + { + "ID": "DialogFirmwareInstallerFirmwareInstallSubMessage", + "Translations": { + "ar_SA": "\n\nهذا سيحل محل إصدار النظام الحالي {0}.", + "de_DE": "\n\nDies wird die aktuelle Systemversion {0} ersetzen.", + "el_GR": "\n\nΑυτό θα αντικαταστήσει την τρέχουσα έκδοση συστήματος {0}.", + "en_US": "\n\nThis will replace the current system version {0}.", + "es_ES": "\n\nEsto reemplazará la versión de sistema actual, {0}.", + "fr_FR": "\n\nCela remplacera la version actuelle du système {0}.", + "he_IL": "\n\nזה יחליף את גרסת המערכת הנוכחית {0}.", + "it_IT": "\n\nQuesta sostituirà l'attuale versione del sistema ({0}).", + "ja_JP": "\n\n現在のシステムバージョン {0} を置き換えます.", + "ko_KR": "\n\n현재 시스템 버전 {0}을(를) 대체합니다.", + "no_NO": "\n\nDette erstatter den gjeldende systemversjonen {0}.", + "pl_PL": "\n\nZastąpi to obecną wersję systemu {0}.", + "pt_BR": "\n\nIsso substituirá a versão do sistema atual {0}.", + "ru_RU": "\n\nЭто заменит текущую версию прошивки {0}.", + "sv_SE": "\n\nDetta kommer att ersätta aktuella systemversionen {0}.", + "th_TH": "\n\nสิ่งนี้จะแทนที่เวอร์ชั่นของระบบเวอร์ชั่นปัจจุบัน {0}.", + "tr_TR": "\n\nBu şimdiki sistem sürümünün yerini alacak {0}.", + "uk_UA": "\n\nЦе замінить поточну версію системи {0}.", + "zh_CN": "\n\n替换当前系统固件版本 {0} 。", + "zh_TW": "\n\n這將取代目前的系統韌體版本 {0}。" + } + }, + { + "ID": "DialogFirmwareInstallerFirmwareInstallConfirmMessage", + "Translations": { + "ar_SA": "\nهل تريد المتابعة؟", + "de_DE": "\n\nMöchtest du fortfahren?", + "el_GR": "\n\nΘέλετε να συνεχίσετε;", + "en_US": "\n\nDo you want to continue?", + "es_ES": "\n\n¿Continuar?", + "fr_FR": "\n\nVoulez-vous continuer ?", + "he_IL": "\n\nהאם ברצונך להמשיך?", + "it_IT": "\n\nVuoi continuare?", + "ja_JP": "\n\n続けてよろしいですか?", + "ko_KR": "\n\n계속하시겠습니까?", + "no_NO": "Vil du fortsette?", + "pl_PL": "\n\nCzy chcesz kontynuować?", + "pt_BR": "\n\nDeseja continuar?", + "ru_RU": "\n\nПродолжить?", + "sv_SE": "\n\nVill du fortsätta?", + "th_TH": "\n\nคุณต้องการดำเนินการต่อหรือไม่?", + "tr_TR": "\n\nDevam etmek istiyor musunuz?", + "uk_UA": "\n\nВи хочете продовжити?", + "zh_CN": "\n\n是否继续?", + "zh_TW": "\n\n您確定要繼續嗎?" + } + }, + { + "ID": "DialogFirmwareInstallerFirmwareInstallWaitMessage", + "Translations": { + "ar_SA": "تثبيت البرنامج الثابت...", + "de_DE": "Firmware wird installiert...", + "el_GR": "Εγκατάσταση Firmware...", + "en_US": "Installing firmware...", + "es_ES": "Instalando firmware...", + "fr_FR": "Installation du firmware...", + "he_IL": "מתקין קושחה...", + "it_IT": "Installazione del firmware...", + "ja_JP": "ファームウェアをインストール中...", + "ko_KR": "펌웨어 설치 중...", + "no_NO": "Installerer fastvare...", + "pl_PL": "Instalowanie firmware'u...", + "pt_BR": "Instalando firmware...", + "ru_RU": "Установка прошивки...", + "sv_SE": "Installerar firmware...", + "th_TH": "กำลังติดตั้งเฟิร์มแวร์...", + "tr_TR": "Firmware yükleniyor...", + "uk_UA": "Встановлення прошивки...", + "zh_CN": "安装系统固件中...", + "zh_TW": "正在安裝韌體..." + } + }, + { + "ID": "DialogFirmwareInstallerFirmwareInstallSuccessMessage", + "Translations": { + "ar_SA": "تم تثبيت إصدار النظام {0} بنجاح.", + "de_DE": "Systemversion {0} wurde erfolgreich installiert.", + "el_GR": "Η έκδοση συστήματος {0} εγκαταστάθηκε με επιτυχία.", + "en_US": "System version {0} successfully installed.", + "es_ES": "Versión de sistema {0} instalada con éxito.", + "fr_FR": "Version du système {0} installée avec succès.", + "he_IL": "גרסת המערכת {0} הותקנה בהצלחה.", + "it_IT": "La versione del sistema {0} è stata installata.", + "ja_JP": "システムバージョン {0} が正常にインストールされました.", + "ko_KR": "시스템 버전 {0}이(가) 설치되었습니다.", + "no_NO": "Systemversjon {0} ble installert.", + "pl_PL": "Wersja systemu {0} została pomyślnie zainstalowana.", + "pt_BR": "Versão do sistema {0} instalada com sucesso.", + "ru_RU": "Прошивка версии {0} успешно установлена.", + "sv_SE": "Systemversion {0} har installerats.", + "th_TH": "ระบบเวอร์ชั่น {0} ติดตั้งเรียบร้อยแล้ว", + "tr_TR": "Sistem sürümü {0} başarıyla yüklendi.", + "uk_UA": "Версію системи {0} успішно встановлено.", + "zh_CN": "成功安装系统固件版本 {0} 。", + "zh_TW": "成功安裝系統韌體版本 {0}。" + } + }, + { + "ID": "DialogKeysInstallerKeysNotFoundErrorMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "An invalid Keys file was found in {0}", + "es_ES": "Se halló un archivo Keys inválido en {0}", + "fr_FR": "Un fichier de clés invalide a été trouvé dans {0}", + "he_IL": "", + "it_IT": "È stato trovato un file di chiavi non valido in {0}", + "ja_JP": "", + "ko_KR": "{0}에서 잘못된 키 파일이 발견", + "no_NO": "En ugyldig Keys-fil ble funnet i {0}.", + "pl_PL": "", + "pt_BR": "Um arquivo Chaves inválido foi encontrado em {0}", + "ru_RU": "В {0} были найдены некорректные ключи", + "sv_SE": "En ogiltig nyckelfil hittades i {0}", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Виявлено неправильний файл ключів у теці {0}", + "zh_CN": "在 {0} 发现了一个无效的密匙文件", + "zh_TW": "找到無效的金鑰檔案 {0}" + } + }, + { + "ID": "DialogKeysInstallerKeysInstallTitle", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Install Keys", + "es_ES": "Instalar Keys", + "fr_FR": "Installer des clés", + "he_IL": "", + "it_IT": "Installa chiavi", + "ja_JP": "", + "ko_KR": "설치 키", + "no_NO": "Installere nøkler", + "pl_PL": "", + "pt_BR": "Instalar Chaves", + "ru_RU": "Установить ключи", + "sv_SE": "Installera nycklar", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Встановлення Ключів", + "zh_CN": "安装密匙", + "zh_TW": "安裝金鑰" + } + }, + { + "ID": "DialogKeysInstallerKeysInstallMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "New Keys file will be installed.", + "es_ES": "Un nuevo archivo Keys será instalado.", + "fr_FR": "Nouveau fichier de clés sera installé.", + "he_IL": "", + "it_IT": "Un nuovo file di chiavi sarà installato.", + "ja_JP": "", + "ko_KR": "새로운 키 파일이 설치됩니다.", + "no_NO": "Ny Keys-fil vil bli installert.", + "pl_PL": "", + "pt_BR": "O novo arquivo Chaves será instalado", + "ru_RU": "Будут установлены новые ключи.", + "sv_SE": "Ny nyckelfil kommer att installeras.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Новий файл Ключів буде встановлено", + "zh_CN": "将会安装新密匙文件", + "zh_TW": "將會安裝新增的金鑰檔案。" + } + }, + { + "ID": "DialogKeysInstallerKeysInstallSubMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "\n\nThis may replace some of the current installed Keys.", + "es_ES": "\n\nEsto puede reemplazar algunas de las Keys actualmente instaladas.", + "fr_FR": "\n\nCela peut remplacer certaines des clés actuellement installées.", + "he_IL": "", + "it_IT": "\n\nAlcune delle chiavi già installate potrebbero essere sovrascritte.", + "ja_JP": "", + "ko_KR": "\n\n이로 인해 현재 설치된 키 중 일부가 대체될 수 있습니다.", + "no_NO": "\n\nDette kan erstatte noen av de nåværende installerte nøklene.", + "pl_PL": "", + "pt_BR": "\n\nIsso pode substituir algumas das chaves instaladas atualmente.", + "ru_RU": "\n\nЭто действие может перезаписать установленные ключи.", + "sv_SE": "\n\nDetta kan ersätta några av de redan installerade nycklarna.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "\n\nЦе замінить собою поточні файли Ключів.", + "zh_CN": "\n\n这也许会替换掉一些当前已安装的密匙", + "zh_TW": "\n\n這將取代部分已安裝的金鑰。" + } + }, + { + "ID": "DialogKeysInstallerKeysInstallConfirmMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "\n\nDo you want to continue?", + "es_ES": "\n\nDeseas continuar?", + "fr_FR": "\n\nVoulez-vous continuer ?", + "he_IL": "", + "it_IT": "\n\nVuoi continuare?", + "ja_JP": "", + "ko_KR": "\n\n계속하시겠습니까?", + "no_NO": "\n\nVil du fortsette?", + "pl_PL": "", + "pt_BR": "\n\nVocê quer continuar?", + "ru_RU": "\n\nХотите продолжить?", + "sv_SE": "\n\nVill du fortsätta?", + "th_TH": "", + "tr_TR": "", + "uk_UA": "\n\nВи хочете продовжити?", + "zh_CN": "\n\n你想要继续吗?", + "zh_TW": "\n\n是否繼續?" + } + }, + { + "ID": "DialogKeysInstallerKeysInstallWaitMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Installing Keys...", + "es_ES": "Instalando Keys...", + "fr_FR": "Installation des clés...", + "he_IL": "", + "it_IT": "Installazione delle chiavi...", + "ja_JP": "", + "ko_KR": "키 설치 중...", + "no_NO": "Installere nøkler...", + "pl_PL": "", + "pt_BR": "Instalando Chaves...", + "ru_RU": "Установка ключей...", + "sv_SE": "Installerar nycklar...", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Встановлення Ключів...", + "zh_CN": "安装密匙中。。。", + "zh_TW": "正在安裝金鑰..." + } + }, + { + "ID": "DialogKeysInstallerKeysInstallSuccessMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "New Keys file successfully installed.", + "es_ES": "Nuevo archivo Keys instalado con éxito.", + "fr_FR": "Nouveau fichier de clés a été installé.", + "he_IL": "", + "it_IT": "Nuovo file di chiavi installato con successo.", + "ja_JP": "", + "ko_KR": "새로운 키 파일이 성공적으로 설치되었습니다.", + "no_NO": "Ny Keys -fil installert.", + "pl_PL": "", + "pt_BR": "Novo arquivo de chaves instalado com sucesso.", + "ru_RU": "Новые ключи были успешно установлены.", + "sv_SE": "Ny nyckelfil installerades.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Нові ключі встановлено.", + "zh_CN": "已成功安装新密匙文件", + "zh_TW": "成功安裝新增的金鑰檔案。" + } + }, + { + "ID": "DialogUserProfileDeletionWarningMessage", + "Translations": { + "ar_SA": "لن تكون هناك ملفات الشخصية أخرى لفتحها إذا تم حذف الملف الشخصي المحدد", + "de_DE": "Es können keine anderen Profile geöffnet werden, wenn das ausgewählte Profil gelöscht wird.", + "el_GR": "Δεν θα υπάρχουν άλλα προφίλ εάν διαγραφεί το επιλεγμένο", + "en_US": "There would be no other profiles to be opened if selected profile is deleted", + "es_ES": "Si eliminas el perfil seleccionado no quedará ningún otro perfil", + "fr_FR": "Il n'y aurait aucun autre profil à ouvrir si le profil sélectionné est supprimé", + "he_IL": "לא יהיו פרופילים אחרים שייפתחו אם הפרופיל שנבחר יימחק", + "it_IT": "Non ci sarebbero altri profili da aprire se il profilo selezionato venisse cancellato", + "ja_JP": "選択されたプロファイルを削除すると,プロファイルがひとつも存在しなくなります", + "ko_KR": "선택한 프로필을 삭제하면 다른 프로필을 열 수 없음", + "no_NO": "Det vil ikke være noen profiler å åpnes hvis valgt profil blir slettet", + "pl_PL": "Nie będzie innych profili do otwarcia, jeśli wybrany profil zostanie usunięty", + "pt_BR": "Não haveria nenhum perfil selecionado se o perfil atual fosse deletado", + "ru_RU": "Если выбранный профиль будет удален, другие профили не будут открываться.", + "sv_SE": "Det skulle inte finnas några andra profiler att öppnas om angiven profil tas bort", + "th_TH": "จะไม่มีโปรไฟล์อื่นให้เปิดหากโปรไฟล์ที่เลือกถูกลบ", + "tr_TR": "Seçilen profil silinirse kullanılabilen başka profil kalmayacak", + "uk_UA": "Якщо вибраний профіль буде видалено, інші профілі не відкриватимуться", + "zh_CN": "删除后将没有可用的账户", + "zh_TW": "如果刪除選取的設定檔,將無法開啟其他設定檔" + } + }, + { + "ID": "DialogUserProfileDeletionConfirmMessage", + "Translations": { + "ar_SA": "هل تريد حذف الملف الشخصي المحدد", + "de_DE": "Möchtest du das ausgewählte Profil löschen?", + "el_GR": "Θέλετε να διαγράψετε το επιλεγμένο προφίλ", + "en_US": "Do you want to delete the selected profile", + "es_ES": "¿Quieres eliminar el perfil seleccionado?", + "fr_FR": "Voulez-vous supprimer le profil sélectionné ?", + "he_IL": "האם ברצונך למחוק את הפרופיל שנבחר", + "it_IT": "Vuoi eliminare il profilo selezionato?", + "ja_JP": "選択されたプロファイルを削除しますか", + "ko_KR": "선택한 프로필을 삭제하시겠습니까?", + "no_NO": "Vil du slette den valgte profilen", + "pl_PL": "Czy chcesz usunąć wybrany profil", + "pt_BR": "Deseja deletar o perfil selecionado", + "ru_RU": "Удалить выбранный профиль?", + "sv_SE": "Vill du ta bort den valda profilen", + "th_TH": "คุณต้องการลบโปรไฟล์ที่เลือกหรือไม่?", + "tr_TR": "Seçilen profili silmek istiyor musunuz", + "uk_UA": "Ви хочете видалити вибраний профіль", + "zh_CN": "是否删除所选账户", + "zh_TW": "您是否要刪除所選設定檔" + } + }, + { + "ID": "DialogUserProfileUnsavedChangesTitle", + "Translations": { + "ar_SA": "تحذير - التغييرات غير محفوظة", + "de_DE": "Warnung - Nicht gespeicherte Änderungen", + "el_GR": "Προσοχή - Μην Αποθηκευμένες Αλλαγές.", + "en_US": "Warning - Unsaved Changes", + "es_ES": "Advertencia - Cambios sin guardar", + "fr_FR": "Avertissement - Modifications non enregistrées", + "he_IL": "אזהרה - שינויים לא שמורים", + "it_IT": "Attenzione - Modifiche non salvate", + "ja_JP": "警告 - 保存されていない変更", + "ko_KR": "경고 - 저장되지 않은 변경 사항", + "no_NO": "Advarsel - Ulagrede endringer", + "pl_PL": "Uwaga - Niezapisane zmiany", + "pt_BR": "Alerta - Alterações não salvas", + "ru_RU": "Внимание - Несохраненные изменения", + "sv_SE": "Varning - Ej sparade ändringar", + "th_TH": "คำเตือน - มีการเปลี่ยนแปลงที่ไม่ได้บันทึก", + "tr_TR": "Uyarı - Kaydedilmemiş Değişiklikler", + "uk_UA": "Увага — Незбережені зміни", + "zh_CN": "警告 - 有未保存的更改", + "zh_TW": "警告 - 未儲存的變更" + } + }, + { + "ID": "DialogUserProfileUnsavedChangesMessage", + "Translations": { + "ar_SA": "لقد قمت بإجراء تغييرات على الملف الشخصي لهذا المستخدم هذا ولم يتم حفظها.", + "de_DE": "Sie haben Änderungen an diesem Nutzerprofil vorgenommen, die nicht gespeichert wurden.", + "el_GR": "Έχετε κάνει αλλαγές σε αυτό το προφίλ χρήστη που δεν έχουν αποθηκευτεί.", + "en_US": "You have made changes to this user profile that have not been saved.", + "es_ES": "Ha realizado cambios en este perfil de usuario que no han sido guardados.", + "fr_FR": "Vous avez apporté des modifications à ce profil utilisateur qui n'ont pas été enregistrées.", + "he_IL": "ביצעת שינויים בפרופיל משתמש זה שלא נשמרו.", + "it_IT": "Hai apportato modifiche a questo profilo utente che non sono state salvate.", + "ja_JP": "保存されていないユーザプロファイルを変更しました.", + "ko_KR": "저장되지 않은 사용자 프로필의 변경 사항이 있습니다.", + "no_NO": "Du har gjort endringer i denne brukerprofilen som ikke er lagret.", + "pl_PL": "Wprowadziłeś zmiany dla tego profilu użytkownika, które nie zostały zapisane.", + "pt_BR": "Você fez alterações para este perfil de usuário que não foram salvas.", + "ru_RU": "В эту учётную запись внесены изменения, которые не были сохранены.", + "sv_SE": "Du har gjort ändringar i denna användarprofil som inte har sparats.", + "th_TH": "คุณได้ทำการเปลี่ยนแปลงโปรไฟล์ผู้ใช้นี้โดยไม่ได้รับการบันทึก", + "tr_TR": "Kullanıcı profilinizde kaydedilmemiş değişiklikler var.", + "uk_UA": "Ви зробили зміни у цьому профілю користувача які не було збережено.", + "zh_CN": "您对该账户的更改尚未保存。", + "zh_TW": "您對該使用者設定檔所做的變更尚未儲存。" + } + }, + { + "ID": "DialogUserProfileUnsavedChangesSubMessage", + "Translations": { + "ar_SA": "هل تريد تجاهل التغييرات؟", + "de_DE": "Möchten Sie Ihre Änderungen wirklich verwerfen?", + "el_GR": "Θέλετε να απορρίψετε τις αλλαγές σας;", + "en_US": "Do you want to discard your changes?", + "es_ES": "¿Quieres descartar los cambios realizados?", + "fr_FR": "Voulez-vous annuler vos modifications ?", + "he_IL": "האם ברצונך למחוק את השינויים האחרונים?", + "it_IT": "Vuoi scartare le modifiche?", + "ja_JP": "変更を破棄しますか?", + "ko_KR": "변경 사항을 취소하시겠습니까?", + "no_NO": "Vil du forkaste endringene dine?", + "pl_PL": "Czy chcesz odrzucić zmiany?", + "pt_BR": "Deseja descartar as alterações?", + "ru_RU": "Отменить изменения?", + "sv_SE": "Vill du förkasta dina ändringar?", + "th_TH": "คุณต้องการทิ้งการเปลี่ยนแปลงของคุณหรือไม่?", + "tr_TR": "Yaptığınız değişiklikleri iptal etmek istediğinize emin misiniz?", + "uk_UA": "Бажаєте скасувати зміни?", + "zh_CN": "确定要放弃更改吗?", + "zh_TW": "您確定要放棄變更嗎?" + } + }, + { + "ID": "DialogControllerSettingsModifiedConfirmMessage", + "Translations": { + "ar_SA": "تم تحديث إعدادات وحدة التحكم الحالية.", + "de_DE": "Die aktuellen Controller-Einstellungen wurden aktualisiert.", + "el_GR": "Οι τρέχουσες ρυθμίσεις χειρισμού έχουν ενημερωθεί.", + "en_US": "The current controller settings has been updated.", + "es_ES": "Se ha actualizado la configuración del mando actual.", + "fr_FR": "Les paramètres actuels de la manette ont été mis à jour.", + "he_IL": "הגדרות השלט הנוכחי עודכנו.", + "it_IT": "Le attuali impostazioni del controller sono state aggiornate.", + "ja_JP": "現在のコントローラ設定が更新されました.", + "ko_KR": "현재 컨트롤러 설정이 업데이트되었습니다.", + "no_NO": "Innstillinger for gjeldende kontroller har blitt oppdatert.", + "pl_PL": "Aktualne ustawienia kontrolera zostały zaktualizowane.", + "pt_BR": "As configurações de controle atuais foram atualizadas.", + "ru_RU": "Текущие настройки управления обновлены.", + "sv_SE": "Aktuella kontrollerinställningar har uppdaterats.", + "th_TH": "การตั้งค่าคอนโทรลเลอร์ปัจจุบันได้รับการอัปเดตแล้ว", + "tr_TR": "Geçerli kumanda seçenekleri güncellendi.", + "uk_UA": "Поточні налаштування контролера оновлено.", + "zh_CN": "当前的输入设置已更新", + "zh_TW": "目前控制器設定已更新。" + } + }, + { + "ID": "DialogControllerSettingsModifiedConfirmSubMessage", + "Translations": { + "ar_SA": "هل تريد الحفظ ؟", + "de_DE": "Controller-Einstellungen speichern?", + "el_GR": "Θέλετε να αποθηκεύσετε;", + "en_US": "Do you want to save?", + "es_ES": "¿Guardar cambios?", + "fr_FR": "Voulez-vous sauvegarder ?", + "he_IL": "האם ברצונך לשמור?", + "it_IT": "Vuoi salvare?", + "ja_JP": "セーブしますか?", + "ko_KR": "저장하시겠습니까?", + "no_NO": "Vil du lagre?", + "pl_PL": "Czy chcesz zapisać?", + "pt_BR": "Deseja salvar?", + "ru_RU": "Сохранить?", + "sv_SE": "Vill du spara?", + "th_TH": "คุณต้องการบันทึกหรือไม่?", + "tr_TR": "Kaydetmek istiyor musunuz?", + "uk_UA": "Ви хочете зберегти?", + "zh_CN": "是否保存?", + "zh_TW": "您想要儲存嗎?" + } + }, + { + "ID": "DialogLoadFileErrorMessage", + "Translations": { + "ar_SA": "{0}. ملف خاطئ: {1}", + "de_DE": "{0}. Fehlerhafte Datei: {1}", + "el_GR": "", + "en_US": "{0}. Errored File: {1}", + "es_ES": "{0}. Archivo con error: {1}", + "fr_FR": "{0}. Fichier avec erreur : {1}", + "he_IL": "{0}. קובץ שגוי: {1}", + "it_IT": "{0}. Errore file: {1}", + "ja_JP": "{0}. エラー発生ファイル: {1}", + "ko_KR": "{0}. 오류 파일 : {1}", + "no_NO": "{0}. Feilet fil: {1}", + "pl_PL": "{0}. Błędny plik: {1}", + "pt_BR": "{0}. Arquivo com erro: {1}", + "ru_RU": "{0}. Файл с ошибкой: {1}", + "sv_SE": "{0}. Fel i filen: {1}", + "th_TH": "{0} ไฟล์เกิดข้อผิดพลาด: {1}", + "tr_TR": "{0}. Hatalı Dosya: {1}", + "uk_UA": "{0}. Файл з помилкою: {1}", + "zh_CN": "{0}. 错误的文件:{1}", + "zh_TW": "{0}。出錯檔案: {1}" + } + }, + { + "ID": "DialogModAlreadyExistsMessage", + "Translations": { + "ar_SA": "التعديل موجود بالفعل", + "de_DE": "Mod ist bereits vorhanden", + "el_GR": "", + "en_US": "Mod already exists", + "es_ES": "El mod ya existe", + "fr_FR": "Le mod existe déjà", + "he_IL": "מוד כבר קיים", + "it_IT": "La mod risulta già installata", + "ja_JP": "Modはすでに存在します", + "ko_KR": "이미 존재하는 모드", + "no_NO": "Modifikasjon eksisterer allerede", + "pl_PL": "Modyfikacja już istnieje", + "pt_BR": "O mod já existe", + "ru_RU": "Мод уже существует", + "sv_SE": "Modd finns redan", + "th_TH": "มีม็อดนี้อยู่แล้ว", + "tr_TR": "Mod zaten var", + "uk_UA": "Модифікація вже існує", + "zh_CN": "MOD 已存在", + "zh_TW": "模組已經存在" + } + }, + { + "ID": "DialogModInvalidMessage", + "Translations": { + "ar_SA": "المجلد المحدد لا يحتوي على تعديل!", + "de_DE": "Das angegebene Verzeichnis enthält keine Mods!", + "el_GR": "", + "en_US": "The specified directory does not contain a mod!", + "es_ES": "¡El directorio especificado no contiene un mod!", + "fr_FR": "Le répertoire spécifié ne contient pas de mod !", + "he_IL": "התיקייה שצוינה אינה מכילה מוד", + "it_IT": "La cartella specificata non contiene nessuna mod!", + "ja_JP": "指定したディレクトリにはmodが含まれていません!", + "ko_KR": "지정한 디렉터리에 모드가 없습니다!", + "no_NO": "Den angitte mappen inneholder ikke en modifikasjon!", + "pl_PL": "Podany katalog nie zawiera modyfikacji!", + "pt_BR": "O diretório especificado não contém um mod!", + "ru_RU": "Выбранная папка не содержит модов", + "sv_SE": "Den angivna katalogen innehåller inte en modd!", + "th_TH": "ไดเร็กทอรีที่ระบุไม่มี ม็อดอยู่!", + "tr_TR": "", + "uk_UA": "Вказана тека не містить модифікації!", + "zh_CN": "指定的目录找不到 MOD 文件!", + "zh_TW": "指定資料夾不包含模組!" + } + }, + { + "ID": "DialogModDeleteNoParentMessage", + "Translations": { + "ar_SA": "فشل الحذف: لم يمكن العثور على المجلد الرئيسي للتعديل\"{0}\"!", + "de_DE": "Löschen fehlgeschlagen: Das übergeordnete Verzeichnis für den Mod \"{0}\" konnte nicht gefunden werden!", + "el_GR": "", + "en_US": "Failed to Delete: Could not find the parent directory for mod \"{0}\"!", + "es_ES": "Error al eliminar: ¡No se pudo encontrar el directorio principal para el mod \"{0}\"!", + "fr_FR": "Échec de la suppression : impossible de trouver le répertoire parent du mod \"{0} \" !", + "he_IL": "נכשל למחוק: לא היה ניתן למצוא את תיקיית האב למוד \"{0}\"!\n", + "it_IT": "Eliminazione non riuscita: impossibile trovare la directory superiore per la mod \"{0}\"!", + "ja_JP": "削除に失敗しました: Mod \"{0}\" の親ディレクトリが見つかりませんでした!", + "ko_KR": "삭제 실패 : \"{0}\" 모드의 상위 디렉터리를 찾을 수 없습니다!", + "no_NO": "Kunne ikke slette: Fant ikke overordnet mappe for mod \"{0}\"!", + "pl_PL": "Nie udało się usunąć: Nie można odnaleźć katalogu nadrzędnego dla modyfikacji \"{0}\"!", + "pt_BR": "Falha ao excluir: Não foi possível encontrar o diretório pai do mod \"{0}\"!", + "ru_RU": "Невозможно удалить: не удалось найти папку мода \"{0}\"", + "sv_SE": "Misslyckades med att ta bort: Kunde inte hitta föräldrakatalogen för modden \"{0}\"!", + "th_TH": "ไม่สามารถลบ: ไม่พบไดเร็กทอรีหลักสำหรับ ม็อด \"{0}\"!", + "tr_TR": "Silme Başarısız: \"{0}\" Modu için üst dizin bulunamadı! ", + "uk_UA": "Не видалено: Не знайдено батьківський каталог (теку) для модифікації \"{0}\"!", + "zh_CN": "删除失败:找不到 MOD 的父目录“{0}”!", + "zh_TW": "刪除失敗: 無法找到模組「{0}」的父資料夾!" + } + }, + { + "ID": "DialogDlcNoDlcErrorMessage", + "Translations": { + "ar_SA": "الملف المحدد لا يحتوي على محتوى إضافي للعنوان المحدد!", + "de_DE": "Die angegebene Datei enthält keinen DLC für den ausgewählten Titel!", + "el_GR": "Το αρχείο δεν περιέχει DLC για τον επιλεγμένο τίτλο!", + "en_US": "The specified file does not contain a DLC for the selected title!", + "es_ES": "¡Ese archivo no contiene contenido descargable para el título seleccionado!", + "fr_FR": "Le fichier spécifié ne contient pas de DLC pour le titre sélectionné !", + "he_IL": "הקובץ שצוין אינו מכיל DLC עבור המשחק שנבחר!", + "it_IT": "Il file specificato non contiene un DLC per il titolo selezionato!", + "ja_JP": "選択されたファイルはこのタイトル用の DLC ではありません!", + "ko_KR": "지정된 파일에 선택한 타이틀의 DLC가 포함되어 있지 않습니다!", + "no_NO": "Den angitte filen inneholder ikke en DLC for den valgte tittelen!", + "pl_PL": "Określony plik nie zawiera DLC dla wybranego tytułu!", + "pt_BR": "O arquivo especificado não contém DLCs para o título selecionado!", + "ru_RU": "Указанный файл не содержит DLC для выбранной игры", + "sv_SE": "Den angivna filen innehåller inte en DLC för angivet spel!", + "th_TH": "ไฟล์ที่ระบุไม่มี DLC สำหรับชื่อที่เลือก!", + "tr_TR": "Belirtilen dosya seçilen oyun için DLC içermiyor!", + "uk_UA": "Зазначений файл не містить DLC для обраної гри!", + "zh_CN": "选择的文件不是当前游戏的 DLC!", + "zh_TW": "指定檔案不包含所選遊戲的 DLC!" + } + }, + { + "ID": "DialogPerformanceCheckLoggingEnabledMessage", + "Translations": { + "ar_SA": "لقد تم تمكين تسجيل التتبع، والذي تم تصميمه ليتم استخدامه من قبل المطورين فقط.", + "de_DE": "Es wurde die Debug Protokollierung aktiviert", + "el_GR": "Έχετε ενεργοποιημένη την καταγραφή εντοπισμού σφαλμάτων, η οποία έχει σχεδιαστεί για χρήση μόνο από προγραμματιστές.", + "en_US": "You have trace logging enabled, which is designed to be used by developers only.", + "es_ES": "Has habilitado los registros debug, diseñados solo para uso de los desarrolladores.", + "fr_FR": "Vous avez activé la journalisation des traces, conçue pour être utilisée uniquement par les développeurs.", + "he_IL": "הפעלת רישום מעקב, אשר נועד לשמש מפתחים בלבד.", + "it_IT": "Hai abilitato il trace logging, che è progettato per essere usato solo dagli sviluppatori.", + "ja_JP": "トレースロギングを有効にします. これは開発者のみに有用な機能です.", + "ko_KR": "개발자만 사용하도록 설계된 추적 기록이 활성화되어 있습니다.", + "no_NO": "Du har sporing aktivert, noe som er designet til å bli brukt av utviklere.", + "pl_PL": "Masz włączone rejestrowanie śledzenia, które jest przeznaczone tylko dla programistów.", + "pt_BR": "Os logs de depuração estão ativos, esse recurso é feito para ser usado apenas por desenvolvedores.", + "ru_RU": "У вас включено ведение журнала отладки, предназначенное только для разработчиков.", + "sv_SE": "Du har spårloggning aktiverat som endast är designat att användas av utvecklare.", + "th_TH": "คุณได้เปิดใช้งานการบันทึกการติดตาม ซึ่งออกแบบมาเพื่อให้นักพัฒนาใช้เท่านั้น", + "tr_TR": "Sadece geliştiriler için dizayn edilen Trace Loglama seçeneği etkin.", + "uk_UA": "Ви увімкнули журнал налагодження, призначений лише для розробників.", + "zh_CN": "您启用了跟踪日志,该功能仅供开发人员使用。", + "zh_TW": "您已啟用追蹤日誌,該功能僅供開發者使用。" + } + }, + { + "ID": "DialogPerformanceCheckLoggingEnabledConfirmMessage", + "Translations": { + "ar_SA": "للحصول على الأداء الأمثل، يوصى بتعطيل تسجيل التتبع. هل ترغب في تعطيل تسجيل التتبع الآن؟", + "de_DE": "Um eine optimale Leistung zu erzielen, wird empfohlen, die Debug Protokollierung zu deaktivieren. Debug Protokollierung jetzt deaktivieren?", + "el_GR": "Για βέλτιστη απόδοση, συνιστάται η απενεργοποίηση καταγραφής εντοπισμού σφαλμάτων. Θέλετε να απενεργοποιήσετε την καταγραφή τώρα;", + "en_US": "For optimal performance, it's recommended to disable trace logging. Would you like to disable trace logging now?", + "es_ES": "Para un rendimiento óptimo, se recomienda deshabilitar los registros debug. ¿Quieres deshabilitarlos ahora?", + "fr_FR": "Pour des performances optimales, il est recommandé de désactiver la journalisation de trace. Souhaitez-vous désactiver la journalisation de trace maintenant ?", + "he_IL": "לביצועים מיטביים, מומלץ להשבית את רישום המעקב. האם ברצונך להשבית את רישום המעקב כעת?", + "it_IT": "Per prestazioni ottimali, si raccomanda di disabilitare il trace logging. Vuoi disabilitarlo adesso?", + "ja_JP": "パフォーマンス最適化のためには,トレースロギングを無効にすることを推奨します. トレースロギングを無効にしてよろしいですか?", + "ko_KR": "최적의 성능을 위해서는 추적 기록을 비활성화하는 것이 좋습니다. 지금 추적 기록을 비활성화하시겠습니까?", + "no_NO": "For optimal ytelse er det anbefalt å deaktivere spor-logging. Ønsker du å deaktivere spor-logging nå?", + "pl_PL": "Aby uzyskać optymalną wydajność, zaleca się wyłączenie rejestrowania śledzenia. Czy chcesz teraz wyłączyć rejestrowanie śledzenia?", + "pt_BR": "Para melhor performance, é recomendável desabilitar os logs de depuração. Gostaria de desabilitar os logs de depuração agora?", + "ru_RU": "Для оптимальной производительности рекомендуется отключить ведение журнала отладки. Хотите отключить?", + "sv_SE": "Det rekommenderas att inaktivera spårloggning för optimal prestanda. Vill du inaktivera spårloggning nu?", + "th_TH": "เพื่อประสิทธิภาพสูงสุด ขอแนะนำให้ปิดใช้งานการบันทึกการติดตาม คุณต้องการปิดใช้การบันทึกการติดตามตอนนี้หรือไม่?", + "tr_TR": "En iyi performans için trace loglama'nın devre dışı bırakılması tavsiye edilir. Trace loglama seçeneğini şimdi devre dışı bırakmak ister misiniz?", + "uk_UA": "Для оптимальної продуктивності рекомендується вимкнути ведення журналу налагодження. Ви хочете вимкнути ведення журналу налагодження зараз?", + "zh_CN": "为了获得最佳性能,建议禁用跟踪日志记录。您是否要立即禁用?", + "zh_TW": "為獲得最佳效能,建議停用追蹤日誌。您是否要立即停用追蹤日誌嗎?" + } + }, + { + "ID": "DialogPerformanceCheckShaderDumpEnabledMessage", + "Translations": { + "ar_SA": "لقد قمت بتمكين تفريغ المظللات، والذي تم تصميمه ليستخدمه المطورون فقط.", + "de_DE": "Es wurde das Shader Dumping aktiviert, das nur von Entwicklern verwendet werden soll.", + "el_GR": "Έχετε ενεργοποιήσει το Shader Dumping, το οποίο έχει σχεδιαστεί για χρήση μόνο από προγραμματιστές.", + "en_US": "You have shader dumping enabled, which is designed to be used by developers only.", + "es_ES": "Has habilitado el volcado de sombreadores, diseñado solo para uso de los desarrolladores.", + "fr_FR": "Vous avez activé l'extraction des shaders, qui est conçu pour être utilisé par les développeurs uniquement.", + "he_IL": "הפעלת השלכת הצללה, שנועדה לשמש מפתחים בלבד.", + "it_IT": "Hai abilitato il dump degli shader, che è progettato per essere usato solo dagli sviluppatori.", + "ja_JP": "シェーダーダンプを有効にします. これは開発者のみに有用な機能です.", + "ko_KR": "개발자만 사용하도록 설계된 셰이더 덤핑이 활성화되어 있습니다.", + "no_NO": "Du har aktiv dumping av shader, som bare er laget for å brukes av utviklere.", + "pl_PL": "Masz włączone zrzucanie shaderów, które jest przeznaczone tylko dla programistów.", + "pt_BR": "O despejo de shaders está ativo, esse recurso é feito para ser usado apenas por desenvolvedores.", + "ru_RU": "У вас включен дамп шейдеров, который предназначен только для разработчиков.", + "sv_SE": "Du har aktiverat shader dumping som endast är designat att användas av utvecklare.", + "th_TH": "คุณได้เปิดใช้งาน การดัมพ์เชเดอร์ ซึ่งออกแบบมาเพื่อให้นักพัฒนาใช้งานเท่านั้น", + "tr_TR": "Sadece geliştiriler için dizayn edilen Shader Dumping seçeneği etkin.", + "uk_UA": "Ви увімкнули скидання шейдерів, призначений лише для розробників.", + "zh_CN": "您启用了着色器转储,该功能仅供开发人员使用。", + "zh_TW": "您已啟用著色器傾印,該功能僅供開發者使用。" + } + }, + { + "ID": "DialogPerformanceCheckShaderDumpEnabledConfirmMessage", + "Translations": { + "ar_SA": "للحصول على الأداء الأمثل، يوصى بتعطيل تفريغ المظللات. هل ترغب في تعطيل تفريغ المظللات الآن؟", + "de_DE": "Für eine optimale Leistung wird empfohlen, das Shader Dumping zu deaktivieren. Shader Dumping jetzt deaktivieren?", + "el_GR": "Για βέλτιστη απόδοση, συνιστάται να απενεργοποιήσετε το Shader Dumping. Θέλετε να απενεργοποιήσετε τώρα το Shader Dumping;", + "en_US": "For optimal performance, it's recommended to disable shader dumping. Would you like to disable shader dumping now?", + "es_ES": "Para un rendimiento óptimo, se recomienda deshabilitar el volcado de sombreadores. ¿Quieres deshabilitarlo ahora?", + "fr_FR": "Pour des performances optimales, il est recommandé de désactiver l'extraction des shaders. Souhaitez-vous désactiver l'extraction des shaders maintenant ?", + "he_IL": "לביצועים מיטביים, מומלץ להשבית את השלכת הצללה. האם ברצונך להשבית את השלכת הצללה עכשיו?", + "it_IT": "Per prestazioni ottimali, si raccomanda di disabilitare il dump degli shader. Vuoi disabilitarlo adesso?", + "ja_JP": "パフォーマンス最適化のためには, シェーダーダンプを無効にすることを推奨します. シェーダーダンプを無効にしてよろしいですか?", + "ko_KR": "최적의 성능을 위해서는 셰이더 덤핑을 비활성화하는 것이 좋습니다. 지금 셰이더 덤핑을 비활성화하시겠습니까?", + "no_NO": "For optimal ytelse er det anbefalt å deaktivere dumping. Ønsker du å deaktivere shader dumping nå?", + "pl_PL": "Aby uzyskać optymalną wydajność, zaleca się wyłączenie zrzucania shaderów. Czy chcesz teraz wyłączyć zrzucanie shaderów?", + "pt_BR": "Para melhor performance, é recomendável desabilitar o despejo de shaders. Gostaria de desabilitar o despejo de shaders agora?", + "ru_RU": "Для оптимальной производительности рекомендуется отключить дамп шейдеров. Хотите отключить дамп шейдеров?", + "sv_SE": "Det rekommenderas att inaktivera shader dumping för optimal prestanda. Vill du inaktivera shader dumping nu?", + "th_TH": "เพื่อประสิทธิภาพสูงสุด ขอแนะนำให้ปิดใช้การดัมพ์เชเดอร์ คุณต้องการปิดการใช้งานการ ดัมพ์เชเดอร์ ตอนนี้หรือไม่?", + "tr_TR": "En iyi performans için Shader Dumping'in devre dışı bırakılması tavsiye edilir. Shader Dumping seçeneğini şimdi devre dışı bırakmak ister misiniz?", + "uk_UA": "Для оптимальної продуктивності рекомендується вимкнути скидання шейдерів. Ви хочете вимкнути скидання шейдерів зараз?", + "zh_CN": "为了获得最佳性能,建议禁用着色器转储。您是否要立即禁用?", + "zh_TW": "為獲得最佳效能,建議停用著色器傾印。您是否要立即停用著色器傾印嗎?" + } + }, + { + "ID": "DialogLoadAppGameAlreadyLoadedMessage", + "Translations": { + "ar_SA": "تم تحميل لعبة بالفعل", + "de_DE": "Es wurde bereits ein Spiel gestartet", + "el_GR": "Ένα παιχνίδι έχει ήδη φορτωθεί", + "en_US": "A game has already been loaded", + "es_ES": "Ya has cargado un juego", + "fr_FR": "Un jeu a déjà été chargé", + "he_IL": "ישנו משחק שכבר רץ כעת", + "it_IT": "Un gioco è già stato caricato", + "ja_JP": "ゲームはすでにロード済みです", + "ko_KR": "이미 게임을 불러옴", + "no_NO": "Et spill er allerede lastet inn", + "pl_PL": "Gra została już załadowana", + "pt_BR": "Um jogo já foi carregado", + "ru_RU": "Игра уже загружена", + "sv_SE": "Ett spel har redan lästs in", + "th_TH": "ทำการโหลดเกมเรียบร้อยแล้ว", + "tr_TR": "Bir oyun zaten yüklendi", + "uk_UA": "Гру вже завантажено", + "zh_CN": "游戏已经启动", + "zh_TW": "已載入此遊戲" + } + }, + { + "ID": "DialogLoadAppGameAlreadyLoadedSubMessage", + "Translations": { + "ar_SA": "الرجاء إيقاف المحاكاة أو إغلاق المحاكي قبل بدء لعبة أخرى.", + "de_DE": "Bitte beende die Emulation oder schließe den Emulator, vor dem Starten eines neuen Spiels", + "el_GR": "Σταματήστε την εξομοίωση ή κλείστε τον εξομοιωτή πριν ξεκινήσετε ένα άλλο παιχνίδι.", + "en_US": "Please stop emulation or close the emulator before launching another game.", + "es_ES": "Por favor, detén la emulación o cierra el emulador antes de iniciar otro juego.", + "fr_FR": "Veuillez arrêter l'émulation ou fermer l'émulateur avant de lancer un autre jeu.", + "he_IL": "אנא הפסק את האמולציה או סגור את האמולטור לפני הפעלת משחק אחר.", + "it_IT": "Ferma l'emulazione o chiudi l'emulatore prima di avviare un altro gioco.", + "ja_JP": "別のゲームを起動する前に, エミュレーションを中止またはエミュレータを閉じてください.", + "ko_KR": "다른 게임을 실행하기 전에 에뮬레이션을 중지하거나 에뮬레이터를 닫으세요.", + "no_NO": "Slutt å emulere eller lukk emulatoren før du starter et annet spill.", + "pl_PL": "Zatrzymaj emulację lub zamknij emulator przed uruchomieniem innej gry.", + "pt_BR": "Por favor, pare a emulação ou feche o emulador antes de abrir outro jogo.", + "ru_RU": "Пожалуйста, остановите эмуляцию или закройте эмулятор перед запуском другой игры.", + "sv_SE": "Stoppa emuleringen eller stäng emulatorn innan du startar ett annat spel.", + "th_TH": "โปรดหยุดการจำลอง หรือปิดโปรแกรมจำลองก่อนที่จะเปิดเกมอื่น", + "tr_TR": "Lütfen yeni bir oyun açmadan önce emülasyonu durdurun veya emülatörü kapatın.", + "uk_UA": "Зупиніть емуляцію або закрийте емулятор перед запуском іншої гри.", + "zh_CN": "请停止模拟或关闭模拟器,再启动另一个游戏。", + "zh_TW": "請停止模擬或關閉模擬器,然後再啟動另一款遊戲。" + } + }, + { + "ID": "DialogUpdateAddUpdateErrorMessage", + "Translations": { + "ar_SA": "الملف المحدد لا يحتوي على تحديث للعنوان المحدد!", + "de_DE": "Die angegebene Datei enthält keine Updates für den ausgewählten Titel!", + "el_GR": "Το αρχείο δεν περιέχει ενημέρωση για τον επιλεγμένο τίτλο!", + "en_US": "The specified file does not contain an update for the selected title!", + "es_ES": "¡Ese archivo no contiene una actualización para el título seleccionado!", + "fr_FR": "Le fichier spécifié ne contient pas de mise à jour pour le titre sélectionné !", + "he_IL": "הקובץ שצוין אינו מכיל עדכון עבור המשחק שנבחר!", + "it_IT": "Il file specificato non contiene un aggiornamento per il titolo selezionato!", + "ja_JP": "選択されたファイルはこのタイトル用のアップデートではありません!", + "ko_KR": "지정한 파일에 선택한 타이틀에 대한 업데이트가 포함되어 있지 않습니다!", + "no_NO": "Den angitte filen inneholder ikke en oppdatering for den valgte tittelen!", + "pl_PL": "Określony plik nie zawiera aktualizacji dla wybranego tytułu!", + "pt_BR": "O arquivo especificado não contém atualizações para o título selecionado!", + "ru_RU": "Указанный файл не содержит обновлений для выбранного приложения", + "sv_SE": "Angiven fil innehåller inte en uppdatering för angivet spel!", + "th_TH": "ไฟล์ที่ระบุไม่มีการอัพเดตสำหรับชื่อเรื่องที่เลือก!", + "tr_TR": "Belirtilen dosya seçilen oyun için güncelleme içermiyor!", + "uk_UA": "Зазначений файл не містить оновлення для вибраного заголовка!", + "zh_CN": "选择的文件不是当前游戏的更新!", + "zh_TW": "指定檔案不包含所選遊戲的更新!" + } + }, + { + "ID": "DialogSettingsBackendThreadingWarningTitle", + "Translations": { + "ar_SA": "تحذير - خلفية متعددة المسارات", + "de_DE": "Warnung - Render Threading", + "el_GR": "Προειδοποίηση - Backend Threading", + "en_US": "Warning - Backend Threading", + "es_ES": "Advertencia - multihilado de gráficos", + "fr_FR": "Avertissement - Backend Threading ", + "he_IL": "אזהרה - ריבוי תהליכי רקע", + "it_IT": "Avviso - Backend Threading", + "ja_JP": "警告 - バックエンドスレッディング", + "ko_KR": "경고 - 후단부 스레딩", + "no_NO": "Advarsel - Backend Tråd", + "pl_PL": "Ostrzeżenie — Wątki Backend", + "pt_BR": "Alerta - Enfileiramento do Renderizador Gráfico", + "ru_RU": "Предупреждение: многопоточность в бэкенде", + "sv_SE": "Varning - Backend Threading", + "th_TH": "คำเตือน - การทำเธรดแบ็กเอนด์", + "tr_TR": "Uyarı - Backend Threading", + "uk_UA": "Попередження - потокове керування сервером", + "zh_CN": "警告 - 图形引擎多线程", + "zh_TW": "警告 - 後端執行緒處理中" + } + }, + { + "ID": "DialogSettingsBackendThreadingWarningMessage", + "Translations": { + "ar_SA": "يجب إعادة تشغيل ريوجينكس بعد تغيير هذا الخيار حتى يتم تطبيقه بالكامل. اعتمادا على النظام الأساسي الخاص بك، قد تحتاج إلى تعطيل تعدد المسارات الخاص ببرنامج الرسومات التشغيل الخاص بك يدويًا عند استخدام الخاص بريوجينكس.", + "de_DE": "Ryujinx muss muss neu gestartet werden, damit die Änderungen wirksam werden. Abhängig von dem Betriebssystem muss möglicherweise das Multithreading des Treibers manuell deaktiviert werden, wenn Ryujinx verwendet wird.", + "el_GR": "Το Ryujinx πρέπει να επανεκκινηθεί αφού αλλάξει αυτή η επιλογή για να εφαρμοστεί πλήρως. Ανάλογα με την πλατφόρμα σας, μπορεί να χρειαστεί να απενεργοποιήσετε με μη αυτόματο τρόπο το multithreading του ίδιου του προγράμματος οδήγησης όταν χρησιμοποιείτε το Ryujinx.", + "en_US": "Ryujinx must be restarted after changing this option for it to apply fully. Depending on your platform, you may need to manually disable your driver's own multithreading when using Ryujinx's.", + "es_ES": "Ryujinx debe reiniciarse para aplicar este cambio. Dependiendo de tu plataforma, puede que tengas que desactivar manualmente la optimización enlazada de tus controladores gráficos para usar el multihilo de Ryujinx.", + "fr_FR": "Ryujinx doit être redémarré après avoir modifié cette option pour que les changements soient pleinement pris en compte. Selon votre plateforme, il se peut que vous deviez désactiver manuellement le multithreading propre à votre pilote lorsque vous utilisez celui de Ryujinx", + "he_IL": "יש להפעיל מחדש את ריוג'ינקס לאחר שינוי אפשרות זו כדי שהיא תחול במלואה. בהתאם לפלטפורמה שלך, ייתכן שיהיה עליך להשבית ידנית את ריבוי ההליכים של ההתקן שלך בעת השימוש ב-ריוג'ינקס.", + "it_IT": "Ryujinx deve essere riavviato dopo aver cambiato questa opzione per applicarla completamente. A seconda della tua piattaforma, potrebbe essere necessario disabilitare manualmente il multithreading del driver quando usi quello di Ryujinx.", + "ja_JP": "このオプションの変更を完全に適用するには Ryujinx の再起動が必要です. プラットフォームによっては, Ryujinx のものを使用する前に手動でドライバ自身のマルチスレッディングを無効にする必要があるかもしれません.", + "ko_KR": "완전히 적용하려면 이 옵션을 변경한 후 Ryujinx를 다시 시작해야 합니다. 플랫폼에 따라 Ryujinx를 사용할 때 드라이버 자체의 다중 스레딩을 수동으로 비활성화해야 할 수도 있습니다.", + "no_NO": "Ryujinx må startes på nytt etter at dette alternativet er endret slik at det tas i bruk helt. Avhengig av plattformen din, må du kanskje manuelt skru av driveren's egen flertråder når du bruker Ryujinx's.", + "pl_PL": "Ryujinx musi zostać ponownie uruchomiony po zmianie tej opcji, aby działał w pełni. W zależności od platformy może być konieczne ręczne wyłączenie sterownika wielowątkowości podczas korzystania z Ryujinx.", + "pt_BR": "Ryujinx precisa ser reiniciado após mudar essa opção para que ela tenha efeito. Dependendo da sua plataforma, pode ser preciso desabilitar o multithreading do driver de vídeo quando usar o Ryujinx.", + "ru_RU": "Для применения этой настройки необходимо перезапустить Ryujinx. В зависимости от используемой вами операционной системы, вам может потребоваться вручную отключить многопоточность драйвера при использовании Ryujinx.", + "sv_SE": "Ryujinx måste startas om efter att denna inställning ändras för att verkställa den. Beroende på din plattform så kanske du måste manuellt inaktivera drivrutinens egna multithreading när Ryujinx används.", + "th_TH": "Ryujinx ต้องรีสตาร์ทหลังจากเปลี่ยนตัวเลือกนี้จึงจะใช้งานได้อย่างสมบูรณ์ คุณอาจต้องปิดการใช้งาน มัลติเธรด ของไดรเวอร์ของคุณด้วยตนเองเมื่อใช้ Ryujinx ทั้งนี้ขึ้นอยู่กับแพลตฟอร์มของคุณ", + "tr_TR": "Bu seçeneğin tamamen uygulanması için Ryujinx'in kapatıp açılması gerekir. Kullandığınız işletim sistemine bağlı olarak, Ryujinx'in multithreading'ini kullanırken driver'ınızın multithreading seçeneğini kapatmanız gerekebilir.", + "uk_UA": "Ryujinx потрібно перезапустити після зміни цього параметра, щоб він застосовувався повністю. Залежно від вашої платформи вам може знадобитися вручну вимкнути власну багатопотоковість драйвера під час використання Ryujinx.", + "zh_CN": "更改此选项后,必须重启 Ryujinx 模拟器才能生效。\n\n当启用图形引擎多线程时,根据显卡不同,您可能需要手动禁用显卡驱动程序自身的多线程(线程优化)。", + "zh_TW": "變更此選項後,必須重新啟動 Ryujinx 才能完全生效。使用 Ryujinx 的多執行緒功能時,可能需要手動停用驅動程式本身的多執行緒功能,這取決於您的平台。" + } + }, + { + "ID": "DialogModManagerDeletionWarningMessage", + "Translations": { + "ar_SA": "أنت على وشك حذف التعديل: {0}\n\nهل انت متأكد انك تريد المتابعة؟", + "de_DE": "Du bist dabei, diesen Mod zu lösche. {0}\n\nMöchtest du wirklich fortfahren?", + "el_GR": "", + "en_US": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?", + "es_ES": "Estás a punto de eliminar el mod: {0}\n\n¿Estás seguro de que quieres continuar?", + "fr_FR": "Vous êtes sur le point de supprimer le mod : {0}\n\nÊtes-vous sûr de vouloir continuer ?", + "he_IL": "אתה עומד למחוק את המוד: {0}\nהאם אתה בטוח שאתה רוצה להמשיך?", + "it_IT": "Stai per eliminare la mod: {0}\n\nConfermi di voler procedere?", + "ja_JP": "以下のModを削除しようとしています: {0}\n\n続行してもよろしいですか?", + "ko_KR": "모드 삭제 : {0}\n\n계속하시겠습니까?", + "no_NO": "Du er i ferd med å slette modifikasjonen: {0}\n\ner du sikker på at du vil fortsette?", + "pl_PL": "Zamierzasz usunąć modyfikacje: {0}\n\nCzy na pewno chcesz kontynuować?", + "pt_BR": "Você está prestes a excluir o mod: {0}\n\nTem certeza de que deseja continuar?", + "ru_RU": "Вы сейчас удалите мод: {0}\n\nВы уверены, что хотите продолжить?", + "sv_SE": "Du är på väg att ta bort modden: {0}\n\nÄr du säker på att du vill fortsätta?", + "th_TH": "คุณกำลังจะลบ ม็อด: {0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", + "tr_TR": "", + "uk_UA": "Ви збираєтесь видалити модифікацію: {0}\n\nВи дійсно бажаєте продовжити?", + "zh_CN": "您即将删除 MOD:{0} \n\n确定吗?", + "zh_TW": "您將刪除模組: {0}\n\n您確定要繼續嗎?" + } + }, + { + "ID": "DialogModManagerDeletionAllWarningMessage", + "Translations": { + "ar_SA": "أنت على وشك حذف كافة التعديلات لهذا العنوان.\n\nهل انت متأكد انك تريد المتابعة؟", + "de_DE": "Du bist dabei, alle Mods für diesen Titel zu löschen.\n\nMöchtest du wirklich fortfahren?", + "el_GR": "", + "en_US": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?", + "es_ES": "Estás a punto de eliminar todos los Mods para este título.\n\n¿Estás seguro de que quieres continuar?", + "fr_FR": "Vous êtes sur le point de supprimer tous les mods pour ce titre.\n\nÊtes-vous sûr de vouloir continuer ?", + "he_IL": "אתה עומד למחוק את כל המודים בשביל משחק זה.\n\nהאם אתה בטוח שאתה רוצה להמשיך?", + "it_IT": "Stai per eliminare tutte le mod per questo titolo.\n\nVuoi davvero procedere?", + "ja_JP": "このタイトルの Mod をすべて削除しようとしています.\n\n続行してもよろしいですか?", + "ko_KR": "이 타이틀에 대한 모드를 모두 삭제하려고 합니다.\n\n계속하시겠습니까?", + "no_NO": "Du er i ferd med å slette alle modifikasjonene for denne tittelen: {0}\n\ner du sikker på at du vil fortsette?", + "pl_PL": "Zamierzasz usunąć wszystkie modyfikacje dla wybranego tytułu: {0}\n\nCzy na pewno chcesz kontynuować?", + "pt_BR": "Você está prestes a excluir todos os mods para este jogo.\n\nTem certeza de que deseja continuar?", + "ru_RU": "Вы сейчас удалите все выбранные моды для этой игры.\n\nВы уверены, что хотите продолжить?", + "sv_SE": "Du är på väg att ta bort alla moddar för detta spel.\n\nÄr du säker på att du vill fortsätta?", + "th_TH": "คุณกำลังจะลบม็อดทั้งหมดสำหรับชื่อนี้\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", + "tr_TR": "", + "uk_UA": "Ви збираєтесь видалити всі модифікації для цього Додатка.\n\nВи дійсно бажаєте продовжити?", + "zh_CN": "您即将删除该游戏的所有 MOD,\n\n确定吗?", + "zh_TW": "您即將刪除此遊戲的所有模組。\n\n您確定要繼續嗎?" + } + }, + { + "ID": "SettingsTabGraphicsFeaturesOptions", + "Translations": { + "ar_SA": "المميزات", + "de_DE": "Erweiterungen", + "el_GR": "Χαρακτηριστικά", + "en_US": "Features", + "es_ES": "Funcionalidades", + "fr_FR": "Fonctionnalités", + "he_IL": "אפשרויות", + "it_IT": "Funzionalità", + "ja_JP": "機能", + "ko_KR": "기능", + "no_NO": "Funksjoner", + "pl_PL": "Funkcje", + "pt_BR": "Recursos", + "ru_RU": "Функции", + "sv_SE": "Funktioner", + "th_TH": "คุณสมบัติ", + "tr_TR": "Özellikler", + "uk_UA": "Особливості", + "zh_CN": "功能", + "zh_TW": "功能" + } + }, + { + "ID": "SettingsTabGraphicsBackendMultithreading", + "Translations": { + "ar_SA": "تعدد المسارات لخلفية الرسومات:", + "de_DE": "Grafik-Backend Multithreading:", + "el_GR": "Πολυνηματική Επεξεργασία Γραφικών:", + "en_US": "Graphics Backend Multithreading:", + "es_ES": "Multihilado del motor gráfico:", + "fr_FR": "Interface graphique multithread :", + "he_IL": "אחראי גרפיקה רב-תהליכי:", + "it_IT": "Multithreading del backend grafico:", + "ja_JP": "グラフィックスバックエンドのマルチスレッド実行:", + "ko_KR": "그래픽 후단부 다중 스레딩 :", + "no_NO": "Grafikk Backend Fleroppgavekjøring", + "pl_PL": "Wielowątkowość Backendu Graficznego:", + "pt_BR": "Multi Enfileiramento do Renderizador Gráfico:", + "ru_RU": "Многопоточность графического бэкенда:", + "sv_SE": "Multitrådning för grafikbakände:", + "th_TH": "มัลติเธรด กราฟิกเบื้องหลัง:", + "tr_TR": "Grafik Backend Multithreading:", + "uk_UA": "Багатопотоковість графічного сервера:", + "zh_CN": "图形引擎多线程:", + "zh_TW": "圖形後端多執行緒:" + } + }, + { + "ID": "CommonAuto", + "Translations": { + "ar_SA": "تلقائي", + "de_DE": "", + "el_GR": "Αυτόματο", + "en_US": "Auto", + "es_ES": "Automático", + "fr_FR": "", + "he_IL": "אוטומטי", + "it_IT": "Automatico", + "ja_JP": "自動", + "ko_KR": "자동", + "no_NO": "Automatisk", + "pl_PL": "", + "pt_BR": "Automático", + "ru_RU": "Автоматически", + "sv_SE": "Automatiskt", + "th_TH": "อัตโนมัติ", + "tr_TR": "Otomatik", + "uk_UA": "Авто", + "zh_CN": "自动(推荐)", + "zh_TW": "自動" + } + }, + { + "ID": "CommonOff", + "Translations": { + "ar_SA": "معطل", + "de_DE": "Aus", + "el_GR": "Ανενεργό", + "en_US": "Off", + "es_ES": "Desactivado", + "fr_FR": "Désactivé", + "he_IL": "כבוי", + "it_IT": "Disattivato", + "ja_JP": "オフ", + "ko_KR": "끔", + "no_NO": "Av", + "pl_PL": "Wyłączone", + "pt_BR": "Desligado", + "ru_RU": "Выключено", + "sv_SE": "Av", + "th_TH": "ปิดการใช้งาน", + "tr_TR": "Kapalı", + "uk_UA": "Вимкнути", + "zh_CN": "关闭", + "zh_TW": "關閉" + } + }, + { + "ID": "CommonOn", + "Translations": { + "ar_SA": "تشغيل", + "de_DE": "An", + "el_GR": "Ενεργό", + "en_US": "On", + "es_ES": "Activado", + "fr_FR": "Activé", + "he_IL": "דלוק", + "it_IT": "Attivo", + "ja_JP": "オン", + "ko_KR": "켬", + "no_NO": "På", + "pl_PL": "Włączone", + "pt_BR": "Ligado", + "ru_RU": "Включено", + "sv_SE": "På", + "th_TH": "เปิดใช้งาน", + "tr_TR": "Açık", + "uk_UA": "Увімкнути", + "zh_CN": "打开", + "zh_TW": "開啟" + } + }, + { + "ID": "InputDialogYes", + "Translations": { + "ar_SA": "نعم", + "de_DE": "Ja", + "el_GR": "Ναι", + "en_US": "Yes", + "es_ES": "Sí", + "fr_FR": "Oui", + "he_IL": "כן", + "it_IT": "Sì", + "ja_JP": "はい", + "ko_KR": "예", + "no_NO": "Ja", + "pl_PL": "Tak", + "pt_BR": "Sim", + "ru_RU": "Да", + "sv_SE": "Ja", + "th_TH": "ใช่", + "tr_TR": "Evet", + "uk_UA": "Так", + "zh_CN": "是", + "zh_TW": "是" + } + }, + { + "ID": "InputDialogNo", + "Translations": { + "ar_SA": "لا", + "de_DE": "Nein", + "el_GR": "Όχι", + "en_US": "No", + "es_ES": "", + "fr_FR": "Non", + "he_IL": "לא", + "it_IT": "", + "ja_JP": "いいえ", + "ko_KR": "아니오", + "no_NO": "Nei", + "pl_PL": "Nie", + "pt_BR": "Não", + "ru_RU": "Нет", + "sv_SE": "Nej", + "th_TH": "ไม่ใช่", + "tr_TR": "Hayır", + "uk_UA": "Ні", + "zh_CN": "否", + "zh_TW": "否" + } + }, + { + "ID": "DialogProfileInvalidProfileNameErrorMessage", + "Translations": { + "ar_SA": "يحتوي اسم الملف على أحرف غير صالحة. يرجى المحاولة مرة أخرى.", + "de_DE": "Der Dateiname enthält ungültige Zeichen. Bitte erneut versuchen.", + "el_GR": "Το όνομα αρχείου περιέχει μη έγκυρους χαρακτήρες. Παρακαλώ προσπαθήστε ξανά.", + "en_US": "The file name contains invalid characters. Please try again.", + "es_ES": "El nombre de archivo contiene caracteres inválidos. Por favor, inténtalo de nuevo.", + "fr_FR": "Le nom du fichier contient des caractères invalides. Veuillez réessayer.", + "he_IL": "שם הקובץ מכיל תווים לא חוקיים. אנא נסה שוב.", + "it_IT": "Il nome del file contiene dei caratteri non validi. Riprova.", + "ja_JP": "プロファイル名に無効な文字が含まれています. 再度試してみてください.", + "ko_KR": "파일 이름에 잘못된 문자가 포함되어 있습니다. 다시 시도하세요.", + "no_NO": "Filnavnet inneholder ugyldige tegn. Prøv på nytt.", + "pl_PL": "Nazwa pliku zawiera nieprawidłowe znaki. Proszę spróbuj ponownie.", + "pt_BR": "O nome do arquivo contém caracteres inválidos. Por favor, tente novamente.", + "ru_RU": "Имя файла содержит недопустимые символы. Пожалуйста, попробуйте еще раз.", + "sv_SE": "Filnamnet innehåller ogiltiga tecken. Försök igen.", + "th_TH": "ชื่อไฟล์ประกอบด้วยอักขระที่ไม่ถูกต้อง กรุณาลองอีกครั้ง", + "tr_TR": "Dosya adı geçersiz karakter içeriyor. Lütfen tekrar deneyin.", + "uk_UA": "Ім'я файлу містить неприпустимі символи. Будь ласка, спробуйте ще раз.", + "zh_CN": "文件名包含无效字符,请重试。", + "zh_TW": "檔案名稱包含無效字元。請重試。" + } + }, + { + "ID": "MenuBarOptionsPauseEmulation", + "Translations": { + "ar_SA": "إيقاف مؤقت", + "de_DE": "", + "el_GR": "Παύση", + "en_US": "Pause", + "es_ES": "Pausar", + "fr_FR": "", + "he_IL": "הפסק", + "it_IT": "Metti in pausa", + "ja_JP": "一時停止", + "ko_KR": "일시 중지", + "no_NO": "Stans midlertidig", + "pl_PL": "Pauza", + "pt_BR": "Pausar", + "ru_RU": "Пауза эмуляции", + "sv_SE": "Paus", + "th_TH": "หยุดชั่วคราว", + "tr_TR": "Durdur", + "uk_UA": "Пауза", + "zh_CN": "暂停", + "zh_TW": "暫停" + } + }, + { + "ID": "MenuBarOptionsResumeEmulation", + "Translations": { + "ar_SA": "استئناف", + "de_DE": "Fortsetzen", + "el_GR": "Συνέχιση", + "en_US": "Resume", + "es_ES": "Reanudar", + "fr_FR": "Reprendre", + "he_IL": "המשך", + "it_IT": "Riprendi", + "ja_JP": "再開", + "ko_KR": "다시 시작", + "no_NO": "Gjenoppta", + "pl_PL": "Wznów", + "pt_BR": "Resumir", + "ru_RU": "Продолжить", + "sv_SE": "Återuppta", + "th_TH": "ดำเนินการต่อ", + "tr_TR": "Devam Et", + "uk_UA": "Продовжити", + "zh_CN": "继续", + "zh_TW": "繼續" + } + }, + { + "ID": "AboutUrlTooltipMessage", + "Translations": { + "ar_SA": "انقر لفتح موقع ريوجينكس في متصفحك الافتراضي.", + "de_DE": "Klicke hier, um die Ryujinx Website im Standardbrowser zu öffnen.", + "el_GR": "Κάντε κλικ για να ανοίξετε τον ιστότοπο Ryujinx στο προεπιλεγμένο πρόγραμμα περιήγησης.", + "en_US": "Click to open the Ryujinx website in your default browser.", + "es_ES": "Haz clic para abrir el sitio web de Ryujinx en tu navegador predeterminado.", + "fr_FR": "Cliquez pour ouvrir le site de Ryujinx dans votre navigateur par défaut", + "he_IL": "לחץ כדי לפתוח את אתר ריוג'ינקס בדפדפן ברירת המחדל שלך.", + "it_IT": "Clicca per aprire il sito web di Ryujinx nel tuo browser predefinito.", + "ja_JP": "クリックするとデフォルトのブラウザで Ryujinx のウェブサイトを開きます.", + "ko_KR": "클릭하면 기본 브라우저에서 Ryujinx 웹사이트가 열립니다.", + "no_NO": "Klikk for å åpne Ryujinx nettsiden i din standardnettleser.", + "pl_PL": "Kliknij, aby otworzyć stronę Ryujinx w domyślnej przeglądarce.", + "pt_BR": "Clique para abrir o site do Ryujinx no seu navegador padrão.", + "ru_RU": "Нажмите, чтобы открыть веб-сайт Ryujinx в браузере", + "sv_SE": "Klicka för att öppna Ryujinx webbsida i din webbläsare.", + "th_TH": "คลิกเพื่อเปิดเว็บไซต์ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", + "tr_TR": "Ryujinx'in websitesini varsayılan tarayıcınızda açmak için tıklayın.", + "uk_UA": "Натисніть, щоб відкрити сайт Ryujinx у браузері за замовчування.", + "zh_CN": "在浏览器中打开 Ryujinx 模拟器官网。", + "zh_TW": "在預設瀏覽器中開啟 Ryujinx 網站。" + } + }, + { + "ID": "AboutDisclaimerMessage", + "Translations": { + "ar_SA": "ريوجينكس لا ينتمي إلى نينتندو™،\nأو أي من شركائها بأي شكل من الأشكال.", + "de_DE": "Ryujinx ist in keinster Weise weder mit Nintendo™, \nnoch mit deren Partnern verbunden.", + "el_GR": "Το Ryujinx δεν είναι συνδεδεμένο με τη Nintendo™,\nούτε με κανέναν από τους συνεργάτες της, με οποιονδήποτε τρόπο.", + "en_US": "Ryujinx is not affiliated with Nintendo™,\nor any of its partners, in any way.", + "es_ES": "Ryujinx no tiene afiliación alguna con Nintendo™,\nni con ninguno de sus socios.", + "fr_FR": "Ryujinx n’est en aucun cas affilié à Nintendo™,\nni à aucun de ses partenaires, de quelque manière que ce soit.", + "he_IL": "ריוג'ינקס אינה מזוהת עם נינטנדו,\nאו שוטפייה בכל דרך שהיא.", + "it_IT": "Ryujinx non è affiliato con Nintendo™,\no i suoi partner, in alcun modo.", + "ja_JP": "Ryujinx は Nintendo™ および\nそのパートナー企業とは一切関係ありません.", + "ko_KR": "Ryujinx는 Nintendo™\n또는 그 파트너와 제휴한 바가 없습니다.", + "no_NO": "Ryujinx er ikke knyttet til NintendoTM,\neller noen av samarbeidspartnerne sine, på noen som helst måte.", + "pl_PL": "Ryujinx nie jest w żaden sposób powiązany z Nintendo™,\nani z żadnym z jej partnerów.", + "pt_BR": "Ryujinx não é afiliado com a Nintendo™,\nou qualquer um de seus parceiros, de nenhum modo.", + "ru_RU": "Ryujinx никоим образом не связан ни с Nintendo™, ни с кем-либо из ее партнеров.", + "sv_SE": "Ryujinx har ingen koppling till Nintendo™,\neller någon av dess samarbetspartners.", + "th_TH": "ทางผู้พัฒนาโปรแกรม Ryujinx ไม่มีส่วนเกี่ยวข้องกับทางบริษัท Nintendo™\nหรือพันธมิตรใดๆ ทั้งสิ้น!", + "tr_TR": "Ryujinx, Nintendo™ veya ortaklarıyla herhangi bir şekilde bağlantılı değildir.", + "uk_UA": "Ryujinx жодним чином не пов’язаний з Nintendo™,\nчи будь-яким із їхніх партнерів.", + "zh_CN": "Ryujinx 与 Nintendo™ 以及其合作伙伴没有任何关联。", + "zh_TW": "Ryujinx 和 Nintendo™\n或其任何合作夥伴完全沒有關聯。" + } + }, + { + "ID": "AboutAmiiboDisclaimerMessage", + "Translations": { + "ar_SA": "AmiiboAPI (www.amiiboapi.com) يتم \nاستخدامه في محاكاة أمبيو لدينا.", + "de_DE": "AmiiboAPI (www.amiiboapi.com) wird in unserer Amiibo \nEmulation benutzt.", + "el_GR": "Το AmiiboAPI (www.amiiboapi.com) χρησιμοποιείται\nστην προσομοίωση Amiibo.", + "en_US": "AmiiboAPI (www.amiiboapi.com) is used\nin our Amiibo emulation.", + "es_ES": "Utilizamos AmiiboAPI (www.amiiboapi.com)\nen nuestra emulación de Amiibo.", + "fr_FR": "AmiiboAPI (www.amiiboapi.com) est utilisé\ndans notre émulation Amiibo.", + "he_IL": "ממשק אמיבו (www.amiiboapi.com) משומש בהדמיית האמיבו שלנו.", + "it_IT": "AmiiboAPI (www.amiiboapi.com) è usata\nnella nostra emulazione Amiibo.", + "ja_JP": "AmiiboAPI (www.amiiboapi.com) は\nAmiibo エミュレーションに使用されています.", + "ko_KR": "AmiiboAPI(www.amiiboapi.com)는\nAmiibo 에뮬레이션에 사용됩니다.", + "no_NO": "AmiiboAPI (www.amiiboapi.com) brukes sammen med\ni vår Amiibo-emulsjon.", + "pl_PL": "AmiiboAPI (www.amiiboapi.com) jest używane\nw naszej emulacji Amiibo.", + "pt_BR": "AmiiboAPI (www.amiiboapi.com) é usado\nem nossa emulação de Amiibo.", + "ru_RU": "Amiibo API (www.amiiboapi.com) используется для эмуляции Amiibo.", + "sv_SE": "AmiiboAPI (www.amiiboapi.com) används\ni vår Amiibo-emulation.", + "th_TH": "AmiiboAPI (www.amiiboapi.com) ถูกใช้\nในการจำลอง อะมิโบ ของเรา", + "tr_TR": "Amiibo emülasyonumuzda \nAmiiboAPI (www.amiiboapi.com) kullanılmaktadır.", + "uk_UA": "AmiiboAPI (www.amiiboapi.com) використовується в нашій емуляції Amiibo.", + "zh_CN": "我们的 Amiibo 模拟使用了\nAmiiboAPI (www.amiiboapi.com)。", + "zh_TW": "我們在 Amiibo 模擬中\n使用了 AmiiboAPI (www.amiiboapi.com)。" + } + }, + { + "ID": "AboutGitLabUrlTooltipMessage", + "Translations": { + "ar_SA": "انقر لفتح صفحة ريوجينكس في غيت هاب في متصفحك الافتراضي.", + "de_DE": "Klicke hier, um die Ryujinx GitLab Seite im Standardbrowser zu öffnen.", + "el_GR": "Κάντε κλικ για να ανοίξετε τη σελίδα Ryujinx GitLab στο προεπιλεγμένο πρόγραμμα περιήγησης.", + "en_US": "Click to open the Ryujinx GitLab page in your default browser.", + "es_ES": "Haz clic para abrir el GitLab de Ryujinx en tu navegador predeterminado.", + "fr_FR": "Cliquez pour ouvrir la page GitLab de Ryujinx dans votre navigateur par défaut.", + "he_IL": "לחץ כדי לפתוח את דף הגיטהב של ריוג'ינקס בדפדפן ברירת המחדל שלך.", + "it_IT": "Clicca per aprire la pagina GitLab di Ryujinx nel tuo browser predefinito.", + "ja_JP": "クリックするとデフォルトのブラウザで Ryujinx の GitLab ページを開きます.", + "ko_KR": "클릭하면 기본 브라우저에서 Ryujinx GitLab 페이지가 열립니다.", + "no_NO": "Klikk for å åpne Ryujinx GitLab siden i din standardnettleser.", + "pl_PL": "Kliknij, aby otworzyć stronę GitLab Ryujinx w domyślnej przeglądarce.", + "pt_BR": "Clique para abrir a página do GitLab do Ryujinx no seu navegador padrão.", + "ru_RU": "Нажмите, чтобы открыть страницу Ryujinx на GitLab", + "sv_SE": "Klicka för att öppna Ryujinx GitLab-sida i din webbläsare.", + "th_TH": "คลิกเพื่อเปิดหน้า GitLab ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", + "tr_TR": "Ryujinx'in GitLab sayfasını varsayılan tarayıcınızda açmak için tıklayın.", + "uk_UA": "Натисніть, щоб відкрити сторінку GitLab Ryujinx у браузері.", + "zh_CN": "在浏览器中打开 Ryujinx 的 GitLab 代码库。", + "zh_TW": "在預設瀏覽器中開啟 Ryujinx 的 GitLab 網頁。" + } + }, + { + "ID": "AboutDiscordUrlTooltipMessage", + "Translations": { + "ar_SA": "انقر لفتح دعوة إلى خادم ريوجينكس في ديكسورد في متصفحك الافتراضي.", + "de_DE": "Klicke hier, um eine Einladung zum Ryujinx Discord Server im Standardbrowser zu öffnen.", + "el_GR": "Κάντε κλικ για να ανοίξετε μία πρόσκληση στον διακομιστή Ryujinx Discord στο προεπιλεγμένο πρόγραμμα περιήγησης.", + "en_US": "Click to open an invite to the Ryujinx Discord server in your default browser.", + "es_ES": "Haz clic para recibir una invitación al Discord de Ryujinx en tu navegador predeterminado.", + "fr_FR": "Cliquez pour ouvrir une invitation au serveur Discord de Ryujinx dans votre navigateur par défaut.", + "he_IL": "לחץ כדי לפתוח הזמנה לשרת הדיסקורד של ריוג'ינקס בדפדפן ברירת המחדל שלך.", + "it_IT": "Clicca per aprire un invito al server Discord di Ryujinx nel tuo browser predefinito.", + "ja_JP": "クリックするとデフォルトのブラウザで Ryujinx の Discord サーバを開きます.", + "ko_KR": "클릭하면 기본 브라우저에서 Ryujinx 디스코드 서버 초대장이 열립니다.", + "no_NO": "Klikk for å åpne en invitasjon til Ryujinx Discord-serveren i nettleseren din.", + "pl_PL": "Kliknij, aby otworzyć zaproszenie na serwer Discord Ryujinx w domyślnej przeglądarce.", + "pt_BR": "Clique para abrir um convite ao servidor do Discord do Ryujinx no seu navegador padrão.", + "ru_RU": "Нажмите, чтобы открыть приглашение на сервер Ryujinx в Discord", + "sv_SE": "Klicka för att öppna en inbjudan till Ryujinx Discord-server i din webbläsare.", + "th_TH": "คลิกเพื่อเปิดคำเชิญเข้าสู่เซิร์ฟเวอร์ Discord ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", + "tr_TR": "Varsayılan tarayıcınızda Ryujinx'in Discord'una bir davet açmak için tıklayın.", + "uk_UA": "Натисніть, щоб відкрити запрошення на сервер Discord Ryujinx у браузері.", + "zh_CN": "在浏览器中打开 Ryujinx 的 Discord 邀请链接。", + "zh_TW": "在預設瀏覽器中開啟 Ryujinx 的 Discord 邀請連結。" + } + }, + { + "ID": "AboutRyujinxAboutTitle", + "Translations": { + "ar_SA": "حول:", + "de_DE": "Über:", + "el_GR": "Σχετικά με:", + "en_US": "About:", + "es_ES": "Acerca de:", + "fr_FR": "À propos :", + "he_IL": "אודות:", + "it_IT": "Informazioni:", + "ja_JP": "Ryujinx について:", + "ko_KR": "정보 :", + "no_NO": "Om:", + "pl_PL": "O Aplikacji:", + "pt_BR": "Sobre:", + "ru_RU": "О программе:", + "sv_SE": "Om:", + "th_TH": "เกี่ยวกับ:", + "tr_TR": "Hakkında:", + "uk_UA": "Про програму:", + "zh_CN": "关于:", + "zh_TW": "關於:" + } + }, + { + "ID": "AboutRyujinxAboutContent", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Ryujinx is an emulator for the Nintendo Switch™ 1.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitLab or Discord.", + "es_ES": "", + "fr_FR": "Ryujinx est un émulateur pour la Nintendo Switch™ 1.\nObtenez les dernières nouvelles sur notre Discord.\nLes développeurs souhaitant contribuer peuvent en savoir plus sur notre GitLab ou Discord.", + "he_IL": "", + "it_IT": "Ryujinx è un emulatore della console Nintendo Switch™ 1.\nRimani aggiornato sulle ultime novità nel nostro server Discord.\nGli sviluppatori interessati a contribuire possono trovare maggiori informazioni su Discord o sulla nostra pagina GitLab.", + "ja_JP": "", + "ko_KR": "Ryujinx는 Nintendo Switch™ 1용 에뮬레이터입니다.\n모든 최신 소식을 Discord에서 확인하세요.\n기여에 관심이 있는 개발자는 GitLab 또는 Discord에서 자세한 내용을 확인할 수 있습니다.", + "no_NO": "Ryujinx er en emulator for Nintendo Switch™ 1\nVennligst støtt oss på Patreon.\nFå alle de siste nyhetene på vår Twitter eller Discord.\nUtviklere som er interessert i å bidra kan finne ut mer på GitLab eller Discord.", + "pl_PL": "", + "pt_BR": "Ryujinx é um emulador de Nintendo Switch™ 1.\nReceba todas as últimas notícias em nosso Discord.\nDesenvolvedores interessados em contribuir podem descobrir mais em nosso GitLab ou Discord.", + "ru_RU": "Ryujinx - это эмулятор для Nintendo Switch™ 1.\nПолучайте все последние новости разработки в нашем Discord.\nРазработчики, заинтересованные в участии, могут узнать больше на нашем GitLab или Discord.", + "sv_SE": "Ryujinx är en emulator för Nintendo Switch™ 1.\nFå de senaste nyheterna via vår Discord.\nUtvecklare som är intresserade att bidra kan hitta mer info på vår GitLab eller Discord.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Ryujinx — це емулятор для Nintendo Switch™ 1.\nОстанні новини можна отримати в нашому Discord.\nРозробники, що бажають долучитись до розробки та зробити свій внесок, можуть отримати більше інформації на нашому GitLab або в Discord.", + "zh_CN": "Ryujinx 是一个 Nintendo Switch™ 1 模拟器。\n有兴趣做出贡献的开发者可以在我们的 GitLab 或 Discord 上了解更多信息。\n", + "zh_TW": "Ryujinx 是一款 Nintendo Switch™ 1 模擬器。\n關注我們的 Discord 取得所有最新消息。\n對於有興趣貢獻的開發者,可以在我們的 GitLab 或 Discord 上了解更多資訊。" + } + }, + { + "ID": "AboutRyujinxMaintainersTitle", + "Translations": { + "ar_SA": "تتم صيانته بواسطة:", + "de_DE": "Entwickelt von:", + "el_GR": "Συντηρείται από:", + "en_US": "Maintained By:", + "es_ES": "Mantenido por:", + "fr_FR": "Maintenu par :", + "he_IL": "מתוחזק על ידי:", + "it_IT": "Mantenuto da:", + "ja_JP": "開発者:", + "ko_KR": "유지 관리 :", + "no_NO": "Vedlikeholdt av:", + "pl_PL": "Utrzymywany Przez:", + "pt_BR": "Mantido por:", + "ru_RU": "Разработка:", + "sv_SE": "Underhålls av:", + "th_TH": "ได้รับการดูแลโดย:", + "tr_TR": "Geliştiriciler:", + "uk_UA": "Підтримується:", + "zh_CN": "开发维护人员名单:", + "zh_TW": "維護者:" + } + }, + { + "ID": "AboutRyujinxFormerMaintainersTitle", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Formerly Maintained By:", + "es_ES": "", + "fr_FR": "Anciennement Maintenu par :", + "he_IL": "", + "it_IT": "Mantenuto in precedenza da:", + "ja_JP": "", + "ko_KR": "이전 관리자 :", + "no_NO": "Tidligere vedlikeholdt av:", + "pl_PL": "", + "pt_BR": "Anteriormente mantido por:", + "ru_RU": "Поддержка:", + "sv_SE": "Underhölls tidigare av:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Минулі розробники:", + "zh_CN": "曾经的维护者:", + "zh_TW": "過往的維護者:" + } + }, + { + "ID": "AboutRyujinxMaintainersContentTooltipMessage", + "Translations": { + "ar_SA": "انقر لفتح صفحة المساهمين في متصفحك الافتراضي.", + "de_DE": "Klicke hier, um die Liste der Mitwirkenden im Standardbrowser zu öffnen.", + "el_GR": "Κάντε κλικ για να ανοίξετε τη σελίδα Συνεισφέροντες στο προεπιλεγμένο πρόγραμμα περιήγησης.", + "en_US": "Click to open the Contributors page in your default browser.", + "es_ES": "Haz clic para abrir la página de contribuidores en tu navegador predeterminado.", + "fr_FR": "Cliquez pour ouvrir la page Contributeurs dans votre navigateur par défaut.", + "he_IL": "לחץ כדי לפתוח את דף התורמים בדפדפן ברירת המחדל שלך.", + "it_IT": "Clicca per aprire la pagina dei contributori nel tuo browser predefinito.", + "ja_JP": "クリックするとデフォルトのブラウザで 貢献者のページを開きます.", + "ko_KR": "클릭하면 기본 브라우저에서 기여자 페이지가 열립니다.", + "no_NO": "Klikk for å åpne Bidragsyter-siden i standardleseren din.", + "pl_PL": "Kliknij, aby otworzyć stronę Współtwórcy w domyślnej przeglądarce.", + "pt_BR": "Clique para abrir a página de contribuidores no seu navegador padrão.", + "ru_RU": "Нажмите, чтобы открыть страницу с участниками", + "sv_SE": "Klicka för att öppna sidan över personer som bidragit till projektet i din webbläsare.", + "th_TH": "คลิกเพื่อเปิดหน้าผู้มีส่วนร่วมบนเบราว์เซอร์เริ่มต้นของคุณ", + "tr_TR": "Katkıda bulunanlar sayfasını varsayılan tarayıcınızda açmak için tıklayın.", + "uk_UA": "Натисніть, щоб відкрити сторінку співавторів у вашому браузері за замовчування.", + "zh_CN": "在浏览器中打开贡献者页面", + "zh_TW": "在預設瀏覽器中開啟貢獻者的網頁" + } + }, + { + "ID": "AmiiboSeriesLabel", + "Translations": { + "ar_SA": "مجموعة أميبو", + "de_DE": "Amiibo-Serie", + "el_GR": "Σειρά Amiibo", + "en_US": "Amiibo Series", + "es_ES": "Serie de Amiibo", + "fr_FR": "Séries Amiibo", + "he_IL": "סדרת אמיבו", + "it_IT": "Serie Amiibo", + "ja_JP": "Amiibo シリーズ", + "ko_KR": "Amiibo 시리즈", + "no_NO": "Amibo Serie", + "pl_PL": "Seria Amiibo", + "pt_BR": "Franquia Amiibo", + "ru_RU": "Серия Amiibo", + "sv_SE": "Amiibo-serie", + "th_TH": "", + "tr_TR": "Amiibo Serisi", + "uk_UA": "Серія Amiibo", + "zh_CN": "Amiibo 系列", + "zh_TW": "Amiibo 系列" + } + }, + { + "ID": "AmiiboCharacterLabel", + "Translations": { + "ar_SA": "شخصية", + "de_DE": "Charakter", + "el_GR": "Χαρακτήρας", + "en_US": "Character", + "es_ES": "Personaje", + "fr_FR": "Personnage", + "he_IL": "דמות", + "it_IT": "Personaggio", + "ja_JP": "キャラクタ", + "ko_KR": "캐릭터", + "no_NO": "Karakter", + "pl_PL": "Postać", + "pt_BR": "Personagem", + "ru_RU": "Персонаж", + "sv_SE": "Karaktär", + "th_TH": "ตัวละคร", + "tr_TR": "Karakter", + "uk_UA": "Персонаж", + "zh_CN": "角色", + "zh_TW": "角色" + } + }, + { + "ID": "AmiiboScanButtonLabel", + "Translations": { + "ar_SA": "فحصه", + "de_DE": "Einscannen", + "el_GR": "Σαρώστε το", + "en_US": "Scan It", + "es_ES": "Escanear", + "fr_FR": "Scanner", + "he_IL": "סרוק את זה", + "it_IT": "Scansiona", + "ja_JP": "スキャン", + "ko_KR": "스캔하기", + "no_NO": "Skanne det", + "pl_PL": "Zeskanuj", + "pt_BR": "Escanear", + "ru_RU": "Сканировать", + "sv_SE": "Skanna den", + "th_TH": "สแกนเลย", + "tr_TR": "Tarat", + "uk_UA": "Сканувати", + "zh_CN": "扫描", + "zh_TW": "掃描" + } + }, + { + "ID": "AmiiboOptionsShowAllLabel", + "Translations": { + "ar_SA": "إظهار كل أميبو", + "de_DE": "Zeige alle Amiibos", + "el_GR": "Εμφάνιση όλων των Amiibo", + "en_US": "Show All Amiibo", + "es_ES": "Mostrar todos los Amiibo", + "fr_FR": "Afficher tous les Amiibo", + "he_IL": "הצג את כל האמיבואים", + "it_IT": "Mostra tutti gli amiibo", + "ja_JP": "すべての Amiibo を表示", + "ko_KR": "모든 Amiibo 표시", + "no_NO": "Vis alle Amiibo", + "pl_PL": "Pokaż Wszystkie Amiibo", + "pt_BR": "Exibir Todos os Amiibos", + "ru_RU": "Показать все Amiibo", + "sv_SE": "Visa alla Amiibo", + "th_TH": "แสดง Amiibo ทั้งหมด", + "tr_TR": "Tüm Amiibo'ları Göster", + "uk_UA": "Показати всі Amiibo", + "zh_CN": "显示所有 Amiibo", + "zh_TW": "顯示所有 Amiibo" + } + }, + { + "ID": "AmiiboOptionsUsRandomTagLabel", + "Translations": { + "ar_SA": "هاك: استخدم علامة Uuid عشوائية ", + "de_DE": "Hack: Benutze zufällige Tag-UUID", + "el_GR": "Hack: Χρησιμοποιήστε τυχαίο αναγνωριστικό UUID", + "en_US": "Hack: Use Random tag Uuid", + "es_ES": "Hack: usar etiqueta aleatoria Uuid", + "fr_FR": "Hack : Utiliser un tag Uuid aléatoire", + "he_IL": "האצה: השתמש בתג Uuid אקראי", + "it_IT": "Espediente: Usa un UUID del tag casuale", + "ja_JP": "ハック: ランダムな Uuid を使用", + "ko_KR": "핵 : 무작위 태그 Uuid 사용", + "no_NO": "Hack: Bruk tilfeldig tag-Uuid", + "pl_PL": "Hack: Użyj losowego UUID tagu", + "pt_BR": "Hack: Usar Uuid de tag Aleatório", + "ru_RU": "Хак: Использовать случайный тег Uuid", + "sv_SE": "Hack: Använd slumpmässig tagg för Uuid", + "th_TH": "แฮ็ค: สุ่มแท็ก Uuid", + "tr_TR": "Hack: Rastgele bir Uuid kullan", + "uk_UA": "Хитрість: Використовувати випадковий тег Uuid", + "zh_CN": "修改:使用随机生成的 Amiibo ID", + "zh_TW": "補釘修正:使用隨機標記的 Uuid" + } + }, + { + "ID": "DlcManagerTableHeadingEnabledLabel", + "Translations": { + "ar_SA": "مفعل", + "de_DE": "Aktiviert", + "el_GR": "Ενεργοποιημένο", + "en_US": "Enabled", + "es_ES": "Habilitado", + "fr_FR": "Activé", + "he_IL": "מאופשר", + "it_IT": "Abilitato", + "ja_JP": "有効", + "ko_KR": "활성화", + "no_NO": "Aktivert", + "pl_PL": "Włączone", + "pt_BR": "Habilitado", + "ru_RU": "Включено", + "sv_SE": "Aktiverad", + "th_TH": "เปิดใช้งานแล้ว", + "tr_TR": "Etkin", + "uk_UA": "Увімкнено", + "zh_CN": "已启用", + "zh_TW": "已啟用" + } + }, + { + "ID": "DlcManagerTableHeadingTitleIdLabel", + "Translations": { + "ar_SA": "معرف العنوان", + "de_DE": "Title-ID", + "el_GR": "Αναγνωριστικό τίτλου", + "en_US": "Title ID", + "es_ES": "ID de título", + "fr_FR": "ID du titre", + "he_IL": "מזהה משחק", + "it_IT": "ID Titolo", + "ja_JP": "タイトルID", + "ko_KR": "타이틀 ID", + "no_NO": "Tittel ID", + "pl_PL": "ID Tytułu", + "pt_BR": "ID do Título", + "ru_RU": "ID приложения", + "sv_SE": "Titel-ID", + "th_TH": "ชื่อไอดี", + "tr_TR": "Başlık ID", + "uk_UA": "ID заголовка", + "zh_CN": "游戏 ID", + "zh_TW": "遊戲 ID" + } + }, + { + "ID": "DlcManagerTableHeadingContainerPathLabel", + "Translations": { + "ar_SA": "مسار الحاوية", + "de_DE": "Container-Pfad", + "el_GR": "Τοποθεσία DLC", + "en_US": "Container Path", + "es_ES": "Directorio del contenedor", + "fr_FR": "Chemin du conteneur", + "he_IL": "נתיב מכיל", + "it_IT": "Percorso del contenitore", + "ja_JP": "コンテナパス", + "ko_KR": "컨테이너 경로", + "no_NO": "Beholder bane", + "pl_PL": "Ścieżka Kontenera", + "pt_BR": "Caminho do Contêiner", + "ru_RU": "Путь к контейнеру", + "sv_SE": "Container-sökväg", + "th_TH": "คอนเทนเนอร์เก็บไฟล์", + "tr_TR": "Container Yol", + "uk_UA": "Шлях до контейнеру", + "zh_CN": "容器路径", + "zh_TW": "容器路徑" + } + }, + { + "ID": "DlcManagerTableHeadingFullPathLabel", + "Translations": { + "ar_SA": "المسار كاملا", + "de_DE": "Vollständiger-Pfad", + "el_GR": "Πλήρης τοποθεσία", + "en_US": "Full Path", + "es_ES": "Directorio completo", + "fr_FR": "Chemin complet", + "he_IL": "נתיב מלא", + "it_IT": "Percorso completo", + "ja_JP": "フルパス", + "ko_KR": "전체 경로", + "no_NO": "Fullstendig bane", + "pl_PL": "Pełna Ścieżka", + "pt_BR": "Caminho Completo", + "ru_RU": "Полный путь", + "sv_SE": "Fullständig sökväg", + "th_TH": "ที่เก็บไฟล์แบบเต็ม", + "tr_TR": "Tam Yol", + "uk_UA": "Повний шлях", + "zh_CN": "完整路径", + "zh_TW": "完整路徑" + } + }, + { + "ID": "DlcManagerRemoveAllButton", + "Translations": { + "ar_SA": "حذف الكل", + "de_DE": "Entferne alle", + "el_GR": "Αφαίρεση όλων", + "en_US": "Remove All", + "es_ES": "Quitar todo", + "fr_FR": "Tout supprimer", + "he_IL": "מחק הכל", + "it_IT": "Rimuovi tutti", + "ja_JP": "すべて削除", + "ko_KR": "모두 제거", + "no_NO": "Fjern alle", + "pl_PL": "Usuń Wszystkie", + "pt_BR": "Remover Todos", + "ru_RU": "Удалить все", + "sv_SE": "Ta bort allt", + "th_TH": "ลบทั้งหมด", + "tr_TR": "Tümünü kaldır", + "uk_UA": "Видалити все", + "zh_CN": "全部删除", + "zh_TW": "全部刪除" + } + }, + { + "ID": "DlcManagerEnableAllButton", + "Translations": { + "ar_SA": "تشغيل الكل", + "de_DE": "Alle aktivieren", + "el_GR": "Ενεργοποίηση Όλων", + "en_US": "Enable All", + "es_ES": "Activar todas", + "fr_FR": "Tout activer", + "he_IL": "אפשר הכל", + "it_IT": "Abilita tutto", + "ja_JP": "すべて有効", + "ko_KR": "모두 활성화", + "no_NO": "Aktiver alle", + "pl_PL": "Włącz Wszystkie", + "pt_BR": "Habilitar Todos", + "ru_RU": "Включить все", + "sv_SE": "Aktivera allt", + "th_TH": "เปิดใช้งานทั้งหมด", + "tr_TR": "Tümünü Aktif Et", + "uk_UA": "Увімкнути всі", + "zh_CN": "全部启用", + "zh_TW": "全部啟用" + } + }, + { + "ID": "DlcManagerDisableAllButton", + "Translations": { + "ar_SA": "تعطيل الكل", + "de_DE": "Alle deaktivieren", + "el_GR": "Απενεργοποίηση Όλων", + "en_US": "Disable All", + "es_ES": "Desactivar todos", + "fr_FR": "Tout désactiver", + "he_IL": "השבת הכל", + "it_IT": "Disabilita tutto", + "ja_JP": "すべて無効", + "ko_KR": "모두 비활성화", + "no_NO": "Deaktiver alle", + "pl_PL": "Wyłącz Wszystkie", + "pt_BR": "Desabilitar Todos", + "ru_RU": "Отключить все", + "sv_SE": "Inaktivera allt", + "th_TH": "ปิดใช้งานทั้งหมด", + "tr_TR": "Tümünü Devre Dışı Bırak", + "uk_UA": "Вимкнути всі", + "zh_CN": "全部停用", + "zh_TW": "全部停用" + } + }, + { + "ID": "ModManagerDeleteAllButton", + "Translations": { + "ar_SA": "حذف الكل", + "de_DE": "Alle löschen", + "el_GR": "", + "en_US": "Delete All", + "es_ES": "Eliminar Todo", + "fr_FR": "Tout supprimer", + "he_IL": "מחק הכל", + "it_IT": "Elimina tutto", + "ja_JP": "すべて削除", + "ko_KR": "모두 삭제", + "no_NO": "Slett alt", + "pl_PL": "Usuń wszystko", + "pt_BR": "Apagar Tudo", + "ru_RU": "Удалить все", + "sv_SE": "Ta bort allt", + "th_TH": "ลบทั้งหมด", + "tr_TR": "Hepsini Sil", + "uk_UA": "Видалити все", + "zh_CN": "全部刪除", + "zh_TW": "全部刪除" + } + }, + { + "ID": "MenuBarOptionsChangeLanguage", + "Translations": { + "ar_SA": "تغيير اللغة", + "de_DE": "Sprache ändern", + "el_GR": "Αλλαξε γλώσσα", + "en_US": "Change Language", + "es_ES": "Cambiar idioma", + "fr_FR": "Changer la langue", + "he_IL": "החלף שפה", + "it_IT": "Cambia lingua", + "ja_JP": "言語を変更", + "ko_KR": "언어 변경", + "no_NO": "Endre språk", + "pl_PL": "Zmień język", + "pt_BR": "Mudar Idioma", + "ru_RU": "Сменить язык", + "sv_SE": "Byt språk", + "th_TH": "เปลี่ยนภาษา", + "tr_TR": "Dili Değiştir", + "uk_UA": "Змінити мову", + "zh_CN": "更改界面语言", + "zh_TW": "變更語言" + } + }, + { + "ID": "MenuBarShowFileTypes", + "Translations": { + "ar_SA": "إظهار أنواع الملفات", + "de_DE": "Dateitypen anzeigen", + "el_GR": "Εμφάνιση Τύπων Αρχείων", + "en_US": "Show File Types", + "es_ES": "Mostrar tipos de archivo", + "fr_FR": "Afficher les types de fichiers", + "he_IL": "הצג מזהה סוג קובץ", + "it_IT": "Mostra tipi di file", + "ja_JP": "ファイル形式を表示", + "ko_KR": "파일 형식 표시", + "no_NO": "Vis Filtyper", + "pl_PL": "Pokaż typy plików", + "pt_BR": "Mostrar Tipos de Arquivo", + "ru_RU": "Показывать форматы файлов", + "sv_SE": "Visa filtyper", + "th_TH": "แสดงประเภทของไฟล์", + "tr_TR": "Dosya Uzantılarını Göster", + "uk_UA": "Показати типи файлів", + "zh_CN": "主页显示的文件类型", + "zh_TW": "顯示檔案類型" + } + }, + { + "ID": "CommonSort", + "Translations": { + "ar_SA": "فرز", + "de_DE": "Sortieren", + "el_GR": "Κατάταξη", + "en_US": "Sort", + "es_ES": "Orden", + "fr_FR": "Trier", + "he_IL": "מיין", + "it_IT": "Ordina", + "ja_JP": "並べ替え", + "ko_KR": "정렬", + "no_NO": "Sorter", + "pl_PL": "Sortuj", + "pt_BR": "Ordenar", + "ru_RU": "Сортировка", + "sv_SE": "Sortera", + "th_TH": "เรียงลำดับ", + "tr_TR": "Sırala", + "uk_UA": "Сортувати", + "zh_CN": "排序", + "zh_TW": "排序" + } + }, + { + "ID": "CommonShowNames", + "Translations": { + "ar_SA": "عرض الأسماء", + "de_DE": "Spiel-Namen anzeigen", + "el_GR": "Εμφάνιση ονομάτων", + "en_US": "Show Names", + "es_ES": "Mostrar nombres", + "fr_FR": "Afficher les noms", + "he_IL": "הצג שמות", + "it_IT": "Mostra nomi", + "ja_JP": "名称を表示", + "ko_KR": "이름 표시", + "no_NO": "Vis navn", + "pl_PL": "Pokaż Nazwy", + "pt_BR": "Exibir Nomes", + "ru_RU": "Показывать названия", + "sv_SE": "Visa namn", + "th_TH": "แสดงชื่อ", + "tr_TR": "İsimleri Göster", + "uk_UA": "Показати назви", + "zh_CN": "显示名称", + "zh_TW": "顯示名稱" + } + }, + { + "ID": "CommonFavorite", + "Translations": { + "ar_SA": "المفضلة", + "de_DE": "Favoriten", + "el_GR": "Αγαπημένα", + "en_US": "Favorite", + "es_ES": "Favorito", + "fr_FR": "Favoris", + "he_IL": "מועדף", + "it_IT": "Preferito", + "ja_JP": "お気に入り", + "ko_KR": "즐겨찾기", + "no_NO": "Favoritt", + "pl_PL": "Ulubione", + "pt_BR": "Favorito", + "ru_RU": "Избранное", + "sv_SE": "Favorit", + "th_TH": "สิ่งที่ชื่นชอบ", + "tr_TR": "Favori", + "uk_UA": "Обрані", + "zh_CN": "收藏", + "zh_TW": "我的最愛" + } + }, + { + "ID": "OrderAscending", + "Translations": { + "ar_SA": "تصاعدي", + "de_DE": "Aufsteigend", + "el_GR": "Αύξουσα", + "en_US": "Ascending", + "es_ES": "Ascendente", + "fr_FR": "Croissant", + "he_IL": "סדר עולה", + "it_IT": "Crescente", + "ja_JP": "昇順", + "ko_KR": "오름차순", + "no_NO": "Stigende", + "pl_PL": "Rosnąco", + "pt_BR": "Ascendente", + "ru_RU": "По возрастанию", + "sv_SE": "Stigande", + "th_TH": "จากน้อยไปมาก", + "tr_TR": "Artan", + "uk_UA": "За зростанням", + "zh_CN": "升序", + "zh_TW": "從小到大" + } + }, + { + "ID": "OrderDescending", + "Translations": { + "ar_SA": "تنازلي", + "de_DE": "Absteigend", + "el_GR": "Φθίνουσα", + "en_US": "Descending", + "es_ES": "Descendente", + "fr_FR": "Décroissant", + "he_IL": "סדר יורד", + "it_IT": "Decrescente", + "ja_JP": "降順", + "ko_KR": "내림차순", + "no_NO": "Synkende", + "pl_PL": "Malejąco", + "pt_BR": "Descendente", + "ru_RU": "По убыванию", + "sv_SE": "Fallande", + "th_TH": "จากมากไปน้อย", + "tr_TR": "Azalan", + "uk_UA": "За спаданням", + "zh_CN": "降序", + "zh_TW": "從大到小" + } + }, + { + "ID": "SettingsTabGraphicsFeatures", + "Translations": { + "ar_SA": "الميزات والتحسينات", + "de_DE": "Erweiterungen", + "el_GR": "Χαρακτηριστικά & Βελτιώσεις", + "en_US": "Features & Enhancements", + "es_ES": "Funcionalidades Y Mejoras", + "fr_FR": "Fonctionnalités & Améliorations", + "he_IL": "תכונות ושיפורים", + "it_IT": "Funzionalità e miglioramenti", + "ja_JP": "機能", + "ko_KR": "기능 및 개선 사항", + "no_NO": "Funksjoner & forbedringer", + "pl_PL": "Funkcje i Ulepszenia", + "pt_BR": "Recursos & Melhorias", + "ru_RU": "Функции и улучшения", + "sv_SE": "Funktioner och förbättringar", + "th_TH": "คุณสมบัติ และ การเพิ่มประสิทธิภาพ", + "tr_TR": "Özellikler & İyileştirmeler", + "uk_UA": "Функції та вдосконалення", + "zh_CN": "功能与优化", + "zh_TW": "功能與改進" + } + }, + { + "ID": "ErrorWindowTitle", + "Translations": { + "ar_SA": "نافذة الخطأ", + "de_DE": "Fehler-Fenster", + "el_GR": "Παράθυρο σφάλματος", + "en_US": "Error Window", + "es_ES": "Ventana de error", + "fr_FR": "Fenêtre d'erreur", + "he_IL": "חלון שגיאה", + "it_IT": "Finestra di errore", + "ja_JP": "エラーウインドウ", + "ko_KR": "오류 창", + "no_NO": "Feilvindu", + "pl_PL": "Okno Błędu", + "pt_BR": "Janela de Erro", + "ru_RU": "Окно ошибки", + "sv_SE": "Felfönster", + "th_TH": "หน้าต่างแสดงข้อผิดพลาด", + "tr_TR": "Hata Penceresi", + "uk_UA": "Вікно помилок", + "zh_CN": "错误窗口", + "zh_TW": "錯誤視窗" + } + }, + { + "ID": "ToggleDiscordTooltip", + "Translations": { + "ar_SA": "اختر ما إذا كنت تريد عرض ريوجينكس في نشاط ديسكورد \"يتم تشغيله حاليا\" أم لا", + "de_DE": "Zeige momentanes Spiel auf Discord", + "el_GR": "Ενεργοποιεί ή απενεργοποιεί την Εμπλουτισμένη Παρουσία σας στο Discord", + "en_US": "Choose whether or not to display Ryujinx on your \"currently playing\" Discord activity", + "es_ES": "Elige si muestras Ryujinx o no en tu actividad de Discord cuando lo estés usando", + "fr_FR": "Choisissez d’afficher ou non Ryujinx dans votre activité Discord « en cours de jeu »", + "he_IL": "בחרו להציג את ריוג'ינקס או לא בפעילות הדיסקורד שלכם \"משוחק כרגע\".", + "it_IT": "Scegli se mostrare o meno Ryujinx nella tua attività su Discord", + "ja_JP": "Discord の \"現在プレイ中\" アクティビティに Ryujinx を表示するかどうかを選択します", + "ko_KR": "\"현재 진행 중인\" 디스코드 활동에 Ryujinx를 표시할지 여부를 선택", + "no_NO": "Velg om Ryujinx skal vises på din \"spillende\" Discord aktivitet eller ikke", + "pl_PL": "Wybierz, czy chcesz wyświetlać Ryujinx w swojej \"aktualnie grane\" aktywności Discord", + "pt_BR": "Escolha se deseja mostrar Ryujinx ou não na sua atividade do Discord quando estiver usando-o", + "ru_RU": "Включает или отключает отображение статуса «Играет в игру» в Discord", + "sv_SE": "Välj huruvida Ryujinx ska visas på din \"spelar för tillfället\" Discord-aktivitet", + "th_TH": "เลือกว่าจะแสดง Ryujinx ในกิจกรรม Discord \"ที่กำลังเล่นอยู่\" ของคุณหรือไม่?", + "tr_TR": "Ryujinx'i \"şimdi oynanıyor\" Discord aktivitesinde göstermeyi veya göstermemeyi seçin", + "uk_UA": "Виберіть, чи відображати Ryujinx у вашій «поточній грі» в Discord", + "zh_CN": "选择是否在 Discord 中显示您的游玩状态", + "zh_TW": "啟用或關閉 Discord 動態狀態展示" + } + }, + { + "ID": "AddGameDirBoxTooltip", + "Translations": { + "ar_SA": "أدخل مجلد اللعبة لإضافته إلى القائمة", + "de_DE": "Gibt das Spielverzeichnis an, das der Liste hinzuzufügt wird", + "el_GR": "Εισαγάγετε μία τοποθεσία παιχνιδιών για προσθήκη στη λίστα", + "en_US": "Enter a game directory to add to the list", + "es_ES": "Elige un directorio de juegos para mostrar en la ventana principal", + "fr_FR": "Entrez un répertoire de jeux à ajouter à la liste", + "he_IL": "הזן תקיית משחקים כדי להוסיף לרשימה", + "it_IT": "Inserisci una cartella dei giochi per aggiungerla alla lista", + "ja_JP": "リストに追加するゲームディレクトリを入力します", + "ko_KR": "목록에 추가할 게임 디렉터리를 입력", + "no_NO": "Angi en spillmappe for å legge til i listen", + "pl_PL": "Wprowadź katalog gier aby dodać go do listy", + "pt_BR": "Escreva um diretório de jogo para adicionar à lista", + "ru_RU": "Введите путь к папке с играми для добавления ее в список выше", + "sv_SE": "Ange en spelkatalog att lägga till i listan", + "th_TH": "ป้อนไดเรกทอรี่เกมที่จะทำการเพิ่มลงในรายการ", + "tr_TR": "Listeye eklemek için oyun dizini seçin", + "uk_UA": "Додайте теку з іграми, щоб додати їх до списку", + "zh_CN": "输入要添加的游戏目录", + "zh_TW": "輸入要新增到清單中的遊戲資料夾" + } + }, + { + "ID": "AddGameDirTooltip", + "Translations": { + "ar_SA": "إضافة مجلد اللعبة إلى القائمة", + "de_DE": "Fügt ein neues Spielverzeichnis hinzu", + "el_GR": "Προσθέστε μία τοποθεσία παιχνιδιών στη λίστα", + "en_US": "Add a game directory to the list", + "es_ES": "Agrega un directorio de juegos a la lista", + "fr_FR": "Ajouter un répertoire de jeux à la liste", + "he_IL": "הוסף תקיית משחקים לרשימה", + "it_IT": "Aggiungi una cartella dei giochi alla lista", + "ja_JP": "リストにゲームディレクトリを追加します", + "ko_KR": "목록에 게임 디렉터리 추가", + "no_NO": "Legg til en spillmappe i listen", + "pl_PL": "Dodaj katalog gier do listy", + "pt_BR": "Adicionar um diretório de jogo à lista", + "ru_RU": "Добавить папку с играми в список", + "sv_SE": "Lägg till en spelkatalog till listan", + "th_TH": "เพิ่มไดเรกทอรี่เกมลงในรายการ", + "tr_TR": "Listeye oyun dizini ekle", + "uk_UA": "Додати теку з іграми до списку", + "zh_CN": "添加游戏目录到列表中", + "zh_TW": "新增遊戲資料夾到清單中" + } + }, + { + "ID": "RemoveGameDirTooltip", + "Translations": { + "ar_SA": "إزالة مجلد اللعبة المحدد", + "de_DE": "Entfernt das ausgewähltes Spielverzeichnis", + "el_GR": "Αφαιρέστε την επιλεγμένη τοποθεσία παιχνιδιών", + "en_US": "Remove selected game directory", + "es_ES": "Quita el directorio seleccionado de la lista", + "fr_FR": "Supprimer le répertoire de jeu sélectionné", + "he_IL": "הסר את תקיית המשחקים שנבחרה", + "it_IT": "Rimuovi la cartella dei giochi selezionata", + "ja_JP": "選択したゲームディレクトリを削除します", + "ko_KR": "선택한 게임 디렉터리 제거", + "no_NO": "Fjern valgt spillmappe", + "pl_PL": "Usuń wybrany katalog gier", + "pt_BR": "Remover diretório de jogo selecionado", + "ru_RU": "Удалить выбранную папку игры", + "sv_SE": "Ta bort vald spelkatalog", + "th_TH": "ลบไดเรกทอรี่เกมที่เลือก", + "tr_TR": "Seçili oyun dizinini kaldır", + "uk_UA": "Видалити вибрану теку гри", + "zh_CN": "移除选中的目录", + "zh_TW": "移除選取的遊戲資料夾" + } + }, + { + "ID": "AddAutoloadDirBoxTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Enter an autoload directory to add to the list", + "es_ES": "Elige un directorio de carga automática para agregar a la lista", + "fr_FR": "Saisissez un répertoire d’autochargement à ajouter à la liste", + "he_IL": "", + "it_IT": "Inserisci una cartella di caricamento automatico da aggiungere alla lista", + "ja_JP": "", + "ko_KR": "목록에 추가할 자동 불러오기 디렉터리를 입력", + "no_NO": "Angi en autoload-mappe som skal legges til i listen", + "pl_PL": "", + "pt_BR": "Insira um diretório de carregamento automático para adicionar à lista", + "ru_RU": "Введите папку автозагрузки для добавления в список", + "sv_SE": "Ange en katalog att automatiskt läsa in till listan", + "th_TH": "ป้อนไดเร็กทอรีสำหรับโหลดอัตโนมัติเพื่อเพิ่มลงในรายการ", + "tr_TR": "", + "uk_UA": "Введіть шлях автозавантаження для додавання до списку", + "zh_CN": "输入需要添加到列表中的自动加载目录", + "zh_TW": "輸入要新增到清單中的「自動載入 DLC/遊戲更新資料夾」" + } + }, + { + "ID": "AddAutoloadDirTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Add an autoload directory to the list", + "es_ES": "Agregar un directorio de carga automática a la lista", + "fr_FR": "Ajouter un répertoire d’autochargement à la liste", + "he_IL": "", + "it_IT": "Aggiungi una cartella di caricamento automatico alla lista", + "ja_JP": "", + "ko_KR": "목록에 자동 불러오기 디렉터리 추가", + "no_NO": "Legg til en autoload-mappe i listen", + "pl_PL": "", + "pt_BR": "Adicionar um diretório de carregamento automático à lista", + "ru_RU": "Добавить папку автозагрузки в список", + "sv_SE": "Lägg till en katalog att automatiskt läsa in till listan", + "th_TH": "ป้อนไดเร็กทอรีสำหรับโหลดอัตโนมัติเพื่อเพิ่มลงในรายการ", + "tr_TR": "", + "uk_UA": "Додайте шлях автозавантаження для додавання до списку", + "zh_CN": "添加一个自动加载目录到列表中", + "zh_TW": "新增「自動載入 DLC/遊戲更新資料夾」到清單中" + } + }, + { + "ID": "RemoveAutoloadDirTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Remove selected autoload directory", + "es_ES": "Eliminar el directorio de carga automática seleccionado", + "fr_FR": "Supprimer le répertoire d’autochargement sélectionné", + "he_IL": "", + "it_IT": "Rimuovi la cartella di caricamento automatico selezionata", + "ja_JP": "", + "ko_KR": "선택한 자동 불러오기 디렉터리 제거", + "no_NO": "Fjern valgt autoload-mappe", + "pl_PL": "", + "pt_BR": "Remover o diretório de carregamento automático selecionado", + "ru_RU": "Убрать папку автозагрузки из списка", + "sv_SE": "Ta bort markerad katalog för automatisk inläsning", + "th_TH": "ลบไดเรกทอรีสำหรับโหลดอัตโนมัติที่เลือก", + "tr_TR": "", + "uk_UA": "Видалити вибрану теку автозавантаження", + "zh_CN": "移除被选中的自动加载目录", + "zh_TW": "移除選取的「自動載入 DLC/遊戲更新資料夾」" + } + }, + { + "ID": "CustomThemeCheckTooltip", + "Translations": { + "ar_SA": "استخدم سمة أفالونيا المخصصة لواجهة المستخدم الرسومية لتغيير مظهر قوائم المحاكي", + "de_DE": "Verwende ein eigenes Design für die Emulator-Benutzeroberfläche", + "el_GR": "Ενεργοποίηση ή απενεργοποίηση προσαρμοσμένων θεμάτων στο GUI", + "en_US": "Use a custom Avalonia theme for the GUI to change the appearance of the emulator menus", + "es_ES": "Activa o desactiva los temas personalizados para la interfaz", + "fr_FR": "Utilisez un thème Avalonia personnalisé pour modifier l'apparence des menus de l'émulateur", + "he_IL": "השתמש בעיצוב מותאם אישית של אבלוניה עבור ה-ממשק הגראפי כדי לשנות את המראה של תפריטי האמולטור", + "it_IT": "Utilizza un tema di Avalonia personalizzato per cambiare l'aspetto dei menù dell'emulatore", + "ja_JP": "エミュレータのメニュー外観を変更するためカスタム Avalonia テーマを使用します", + "ko_KR": "GUI용 사용자 정의 Avalonia 테마를 사용하여 에뮬레이터 메뉴의 모양 변경", + "no_NO": "Bruk et egendefinert Avalonia tema for GUI for å endre utseende til emulatormenyene", + "pl_PL": "Użyj niestandardowego motywu Avalonia dla GUI, aby zmienić wygląd menu emulatora", + "pt_BR": "Use um tema Avalonia personalizado para a GUI para alterar a aparência dos menus do emulador", + "ru_RU": "Включить или отключить пользовательские темы", + "sv_SE": "Använd ett anpassat Avalonia-tema för gränssnittet för att ändra utseendet i emulatormenyerna", + "th_TH": "ใช้ธีม Avalonia แบบกำหนดเองสำหรับ GUI เพื่อเปลี่ยนรูปลักษณ์ของเมนูโปรแกรมจำลอง", + "tr_TR": "Emülatör pencerelerinin görünümünü değiştirmek için özel bir Avalonia teması kullan", + "uk_UA": "Використовуйте користувацьку тему Avalonia для графічного інтерфейсу, щоб змінити вигляд меню емулятора", + "zh_CN": "使用自定义的 Avalonia 主题作为模拟器菜单的外观", + "zh_TW": "為圖形使用者介面使用自訂 Avalonia 佈景主題,變更模擬器功能表的外觀" + } + }, + { + "ID": "CustomThemePathTooltip", + "Translations": { + "ar_SA": "مسار سمة واجهة المستخدم المخصصة", + "de_DE": "Gibt den Pfad zum Design für die Emulator-Benutzeroberfläche an", + "el_GR": "Διαδρομή προς το προσαρμοσμένο θέμα GUI", + "en_US": "Path to custom GUI theme", + "es_ES": "Carpeta que contiene los temas personalizados para la interfaz", + "fr_FR": "Chemin vers le thème personnalisé de l'interface utilisateur", + "he_IL": "נתיב לערכת נושא לממשק גראפי מותאם אישית", + "it_IT": "Percorso al tema dell'interfaccia personalizzato", + "ja_JP": "カスタム GUI テーマのパスです", + "ko_KR": "사용자 정의 GUI 테마 경로", + "no_NO": "Bane til egendefinert GUI-tema", + "pl_PL": "Ścieżka do niestandardowego motywu GUI", + "pt_BR": "Diretório do tema customizado", + "ru_RU": "Путь к пользовательской теме интерфейса", + "sv_SE": "Sökväg till anpassat gränssnittstema", + "th_TH": "ไปยังที่เก็บไฟล์ธีม GUI แบบกำหนดเอง", + "tr_TR": "Özel arayüz temasının yolu", + "uk_UA": "Шлях до користувацької теми графічного інтерфейсу", + "zh_CN": "自定义主题的目录", + "zh_TW": "自訂 GUI 佈景主題的路徑" + } + }, + { + "ID": "CustomThemeBrowseTooltip", + "Translations": { + "ar_SA": "تصفح للحصول على سمة واجهة المستخدم المخصصة", + "de_DE": "Ermöglicht die Suche nach einem benutzerdefinierten Design für die Emulator-Benutzeroberfläche", + "el_GR": "Αναζητήστε ένα προσαρμοσμένο θέμα GUI", + "en_US": "Browse for a custom GUI theme", + "es_ES": "Busca un tema personalizado para la interfaz", + "fr_FR": "Parcourir un thème personnalisé pour l’interface graphique", + "he_IL": "חפש עיצוב ממשק גראפי מותאם אישית", + "it_IT": "Scegli un tema dell'interfaccia personalizzato", + "ja_JP": "カスタム GUI テーマを参照します", + "ko_KR": "사용자 정의 GUI 테마 찾아보기", + "no_NO": "Søk etter et egendefinert GUI-tema", + "pl_PL": "Wyszukaj niestandardowy motyw GUI", + "pt_BR": "Navegar até um tema customizado", + "ru_RU": "Просмотр пользовательской темы интерфейса", + "sv_SE": "Bläddra efter ett anpassat gränssnittstema", + "th_TH": "เรียกดูธีม GUI ที่กำหนดเอง", + "tr_TR": "Özel arayüz teması için göz at", + "uk_UA": "Огляд користувацької теми графічного інтерфейсу", + "zh_CN": "查找自定义主题", + "zh_TW": "瀏覽自訂 GUI 佈景主題" + } + }, + { + "ID": "UseGlobalInputTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "If this option is enabled in custom settings, the global input configuration will be used.\n\nIn the global settings: you can enable or disable it as needed; this setting will be inherited by any new custom configurations created.", + "es_ES": "", + "fr_FR": "Si cette option est activée dans les paramètres personnalisés, la configuration d’entrée globale sera utilisée.\n\nDans les paramètres globaux, vous pouvez l’activer ou la désactiver selon vos besoins ; ce réglage sera alors hérité par toutes les nouvelles configurations personnalisées créées", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "사용자 지정 설정에서 이 옵션을 활성화하면 전역 입력 구성이 사용됩니다.\n\n전역 설정에서 필요에 따라 활성화하거나 비활성화할 수 있습니다. 이 설정은 새로 생성된 모든 사용자 지정 구성에 상속됩니다.", + "no_NO": "", + "pl_PL": "", + "pt_BR": "Se esta opção está ativada nas configurações customizadas, as configurações globais de entrada serão usadas.\n\nNas configurações globais: você pode ativar ou desativá-las se necessário; está configuração será herdada por qualquer nova configuração customizada criada.", + "ru_RU": "Если эта опция включена в пользовательских настройках, будет использована глобальная конфигурация ввода.\n\nВ глобальных настройках: переключите эту опцию по своему усмотрению, это будет унаследовано для вновь созданых пользовательских конфигураций", + "sv_SE": "Om det här alternativet är aktiverat i anpassade inställningar kommer den globala inmatningskonfigurationen att användas.\n\nI de globala inställningarna: du kan aktivera eller inaktivera det efter behov; den här inställningen kommer att ärvas av alla nya anpassade konfigurationer som skapas.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "如果在自定义设置中启用了此选项,则将使用全局输入配置。\n\n在全局设置中: 您可以根据需要启用或禁用它;之后创建的任何自定义配置都将继承此设置。", + "zh_TW": "如果在自訂設定啟用了此選項,則將使用全域輸入配置。\n\n在全域設定中:你可以根據需要啟用或停用它;之後建立的任何自訂配置都將繼承此設定。" + } + }, + { + "ID": "DockModeToggleTooltip", + "Translations": { + "ar_SA": "يجعل وضع تركيب بالمنصة النظام الذي تمت محاكاته بمثابة جهاز نينتندو سويتش الذي تم تركيبه بالمنصة. يؤدي هذا إلى تحسين الدقة الرسومية في معظم الألعاب. على العكس من ذلك، سيؤدي تعطيل هذا إلى جعل النظام الذي تمت محاكاته يعمل كجهاز نينتندو سويتش محمول، مما يقلل من جودة الرسومات.\n\nقم بتكوين عناصر تحكم اللاعب 1 إذا كنت تخطط لاستخدام وضع تركيب بالمنصة؛ قم بتكوين عناصر التحكم المحمولة إذا كنت تخطط لاستخدام الوضع المحمول.\n\nاتركه مشغل إذا لم تكن متأكدا.", + "de_DE": "Im gedockten Modus verhält sich das emulierte System wie eine Nintendo Switch im TV Modus. Dies verbessert die grafische Qualität der meisten Spiele. Umgekehrt führt die Deaktivierung dazu, dass sich das emulierte System wie eine Nintendo Switch im Handheld Modus verhält, was die Grafikqualität beeinträchtigt.\n\nKonfiguriere das Eingabegerät für Spieler 1, um im Docked Modus zu spielen; konfiguriere das Controllerprofil via der Handheld Option, wenn geplant wird den Handheld Modus zu nutzen.\n\nIm Zweifelsfall AN lassen.", + "el_GR": "Ενεργοποιήστε ή απενεργοποιήστε τη λειτουργία σύνδεσης", + "en_US": "Docked mode makes the emulated system behave as a docked Nintendo Switch. This improves graphical fidelity in most games. Conversely, disabling this will make the emulated system behave as a handheld Nintendo Switch, reducing graphics quality.\n\nConfigure player 1 controls if planning to use docked mode; configure handheld controls if planning to use handheld mode.\n\nLeave ON if unsure.", + "es_ES": "El modo dock o modo TV hace que la consola emulada se comporte como una Nintendo Switch en su dock. Esto mejora la calidad gráfica en la mayoría de los juegos. Del mismo modo, si lo desactivas, el sistema emulado se comportará como una Nintendo Switch en modo portátil, reduciendo la cálidad de los gráficos.\n\nConfigura los controles de \"Jugador\" 1 si planeas jugar en modo dock/TV; configura los controles de \"Portátil\" si planeas jugar en modo portátil.\n\nActívalo si no sabes qué hacer.", + "fr_FR": "Le mode docké fait que le système émulé se comporte comme une Nintendo Switch en mode dock. Cela améliore la qualité graphique dans la plupart des jeux. À l’inverse, désactiver ce mode fera que le système émulé se comporte comme une Nintendo Switch en mode portable, ce qui réduit la qualité graphique.\n\nConfigurez les contrôles du joueur 1 si vous prévoyez d’utiliser le mode docké ; configurez les contrôles pour le mode portable si vous comptez utiliser ce dernier.\n\nLaissez ACTIVÉ si vous n’êtes pas sûr..", + "he_IL": "מצב עגינה גורם למערכת המדומה להתנהג כ-נינטנדו סוויץ' בתחנת עגינתו. זה משפר את הנאמנות הגרפית ברוב המשחקים.\n לעומת זאת, השבתה של תכונה זו תגרום למערכת המדומה להתנהג כ- נינטנדו סוויץ' נייד, ולהפחית את איכות הגרפיקה.\n\nהגדירו את שלט שחקן 1 אם אתם מתכננים להשתמש במצב עגינה; הגדירו את פקדי כף היד אם אתם מתכננים להשתמש במצב נייד.\n\nמוטב להשאיר דלוק אם אתם לא בטוחים.", + "it_IT": "La modalità TV fa sì che il sistema emulato si comporti come una Nintendo Switch posizionata nella sua base. Ciò migliora la qualità grafica nella maggior parte dei giochi. Al contrario, disabilitandola il sistema emulato si comporterà come una Nintendo Switch in modalità portatile, riducendo la qualità grafica.\n\nConfigura i controlli del giocatore 1 se intendi usare la modalità TV; configura i controlli della modalità portatile se intendi usare quest'ultima.\n\nNel dubbio, lascia l'opzione attiva.", + "ja_JP": "有効にすると,ドッキングされた Nintendo Switch をエミュレートします.多くのゲームではグラフィックス品質が向上します.\n無効にすると,携帯モードの Nintendo Switch をエミュレートします.グラフィックスの品質は低下します.\n\nドッキングモード有効ならプレイヤー1の,無効なら携帯の入力を設定してください.\n\nよくわからない場合はオンのままにしてください.", + "ko_KR": "도킹 모드를 사용하면 에뮬레이트된 시스템이 도킹된 Nintendo Switch처럼 동작합니다. 이 경우, 대부분의 게임에서 그래픽 충실도를 향상시킵니다. 반대로 이 기능을 비활성화하면 에뮬레이트된 시스템이 휴대용 Nintendo Switch처럼 작동하여 그래픽 품질이 저하됩니다.\n\n도킹 모드를 사용할 계획이라면 플레이어 1 컨트롤을 구성하세요. 휴대용 모드를 사용하려는 경우 휴대용 컨트롤을 구성하십시오.\n\n모르면 체크 상태로 두세요.", + "no_NO": "Forankret modus gjør at systemet oppføre seg som en forankret Nintendo Switch. Dette forbedrer grafikkkvaliteten i de fleste spill. Motsatt vil deaktivering av dette gjøre at systemet oppføre seg som en håndholdt Nintendo Switch, noe som reduserer grafikkkvaliteten.\n\nKonfigurer spiller 1 kontroller hvis du planlegger å bruke forankret modus; konfigurer håndholdte kontroller hvis du planlegger å bruke håndholdte modus.\n\nLa PÅ hvis du er usikker.", + "pl_PL": "Tryb Zadokowany sprawia, że emulowany system zachowuje się jak zadokowany Nintendo Switch. Poprawia to jakość grafiki w większości gier. I odwrotnie, wyłączenie tej opcji sprawi, że emulowany system będzie zachowywał się jak przenośny Nintendo Switch, zmniejszając jakość grafiki.\n\nSkonfiguruj sterowanie gracza 1, jeśli planujesz używać trybu Zadokowanego; Skonfiguruj sterowanie przenośne, jeśli planujesz używać trybu przenośnego.\n\nPozostaw WŁĄCZONY, jeśli nie masz pewności.", + "pt_BR": "O modo TV faz o sistema emulado se comportar como um Nintendo Switch na TV, o que melhora a fidelidade gráfica na maioria dos jogos. Por outro lado, desativar essa opção fará o sistema emulado se comportar como um Nintendo Switch portátil, reduzindo a qualidade gráfica.\n\nConfigure os controles do jogador 1 se planeja usar o modo TV; configure os controles de portátil se planeja usar o modo Portátil.\n\nMantenha ativado se estiver em dúvida.", + "ru_RU": "\"Стационарный\" режим запускает эмулятор, как если бы Nintendo Switch находилась в доке, что улучшает графику и разрешение в большинстве игр. И наоборот, при отключении этого режима эмулятор будет запускать игры в \"Портативном\" режиме, снижая качество графики.\n\nНастройте управление для Игрока 1 если планируете использовать эмулятор в \"Стационарном\" режиме; настройте портативное управление если планируете использовать эмулятор в \"Портативном\" режиме.\n\nРекомендуется оставить включенным.", + "sv_SE": "Dockat läge gör att det emulerade systemet beter sig som en dockad Nintendo Switch. Detta förbättrar grafiken i de flesta spel. Inaktiveras detta så kommer det emulerade systemet att bete sig som en handhållen Nintendo Switch, vilket reducerar grafikkvaliteten.\n\nKonfigurera kontrollen för Spelare 1 om du planerar att använda dockat läge; konfigurera handhållna kontroller om du planerar att använda handhållet läge.\n\nLämna PÅ om du är osäker.", + "th_TH": "ด็อกโหมด ทำให้ระบบจำลองการทำงานเสมือน Nintendo ที่กำลังเชื่อมต่ออยู่ด็อก สิ่งนี้จะปรับปรุงความเสถียรภาพของกราฟิกในเกมส่วนใหญ่ ในทางกลับกัน การปิดใช้จะทำให้ระบบจำลองทำงานเหมือนกับ Nintendo Switch แบบพกพา ส่งผลให้คุณภาพกราฟิกลดลง\n\nแนะนำกำหนดค่าควบคุมของผู้เล่น 1 หากวางแผนที่จะใช้ด็อกโหมด กำหนดค่าการควบคุมแบบ แฮนด์เฮลด์ หากวางแผนที่จะใช้โหมดแฮนด์เฮลด์\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", + "tr_TR": "Docked modu emüle edilen sistemin yerleşik Nintendo Switch gibi davranmasını sağlar. Bu çoğu oyunda grafik kalitesini arttırır. Diğer yandan, bu seçeneği devre dışı bırakmak emüle edilen sistemin portatif Ninendo Switch gibi davranmasını sağlayıp grafik kalitesini düşürür.\n\nDocked modu kullanmayı düşünüyorsanız 1. Oyuncu kontrollerini; Handheld modunu kullanmak istiyorsanız portatif kontrollerini konfigüre edin.\n\nEmin değilseniz aktif halde bırakın.", + "uk_UA": "У режимі док-станції емульована система веде себе як приєднаний Nintendo Switch. Це покращує точність графіки в більшості ігор. І навпаки, вимкнення цього призведе до того, що емульована система поводитиметься як портативний комутатор Nintendo, погіршуючи якість графіки.\n\nНалаштуйте елементи керування для гравця 1, якщо плануєте використовувати режим док-станції; налаштуйте ручні елементи керування, якщо плануєте використовувати портативний режим.\n\nЗалиште увімкненим, якщо не впевнені.", + "zh_CN": "启用 Switch 的主机模式(电视模式、底座模式),就是模拟 Switch 连接底座的情况;若禁用主机模式,则使用 Switch 的掌机模式,就是模拟手持 Switch 运行游戏的情况。\n对于绝大多数游戏而言,主机模式会比掌机模式,画质更高,同时性能消耗也更高。\n\n简而言之,想要更好画质则启用主机模式;电脑硬件性能不足则禁用主机模式。\n\n如果使用主机模式,请选择“玩家 1”的手柄设置;如果使用掌机模式,请选择“掌机模式”的手柄设置。\n\n如果不确定,请保持开启状态。", + "zh_TW": "底座模式可使模擬系統表現為底座的 Nintendo Switch。這可以提高大多數遊戲的圖形保真度。反之,停用該模式將使模擬系統表現為手提模式的 Nintendo Switch,從而降低圖形品質。\n\n如果計劃使用底座模式,請配置玩家 1 控制;如果計劃使用手提模式,請配置手提控制。\n\n如果不確定,請保持開啟狀態。" + } + }, + { + "ID": "DirectKeyboardTooltip", + "Translations": { + "ar_SA": "دعم الوصول المباشر للوحة المفاتيح (HID). يوفر وصول الألعاب إلى لوحة المفاتيح الخاصة بك كجهاز لإدخال النص.\n\nيعمل فقط مع الألعاب التي تدعم استخدام لوحة المفاتيح في الأصل على أجهزة سويتش.\n\nاتركه معطلا إذا كنت غير متأكد.", + "de_DE": "Direkter Zugriff auf die Tastatur (HID). Bietet Spielen Zugriff auf Ihre Tastatur als Texteingabegerät.\n\nFunktioniert nur mit Spielen, die die Tastaturnutzung auf Switch-Hardware nativ unterstützen.\n\nAus lassen, wenn unsicher.", + "el_GR": "", + "en_US": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.", + "es_ES": "Soporte de acceso directo al teclado (HID). Proporciona a los juegos acceso a su teclado como dispositivo de entrada de texto.\n\nSolo funciona con juegos que permiten de forma nativa el uso del teclado en el hardware de Switch.\n\nDesactívalo si no sabes qué hacer.", + "fr_FR": "Prise en charge de l’accès direct au clavier (HID). Permet aux jeux d’accéder à votre clavier comme périphérique de saisie de texte.\n\nFonctionne uniquement avec les jeux qui supportent nativement l’utilisation du clavier sur la console Switch.\n\nLaissez DÉSACTIVÉ si vous n'êtes pas sûr.", + "he_IL": "", + "it_IT": "Supporto per l'accesso diretto alla tastiera (HID). Fornisce ai giochi l'accesso alla tastiera come dispositivo di inserimento del testo.\n\nFunziona solo con i giochi che supportano nativamente l'utilizzo della tastiera su hardware Switch.\n\nNel dubbio, lascia l'opzione disattivata.", + "ja_JP": "直接キーボード アクセス (HID) のサポートです. テキスト入力デバイスとしてキーボードへのゲームアクセスを提供します.\n\nSwitchハードウェアでキーボードの使用をネイティブにサポートしているゲームでのみ動作します.\n\nわからない場合はオフのままにしてください.", + "ko_KR": "키보드 직접 접속(HID)을 지원합니다. 텍스트 입력 장치로 키보드에 대한 게임 접속을 제공합니다.\n\nSwitch 하드웨어에서 키보드 사용을 기본적으로 지원하는 게임에서만 작동합니다.\n\n모르면 체크 해제 상태로 두세요.", + "no_NO": "Direkte tastaturtilgang (HID) støtte. Gir deg spill-tilgang til tastaturet som en tekstinnlegg-enhet.\n\nfungerer kun med spill som lokalt støtter tastaturbruk på Ninteno SwitchTM maskinvare.\n\nLa være AV hvis du er usikker.", + "pl_PL": "Obsługa bezpośredniego dostępu do klawiatury (HID). Zapewnia dostęp gier do klawiatury jako urządzenia do wprowadzania tekstu.\n\nDziała tylko z grami, które natywnie wspierają użycie klawiatury w urządzeniu Switch hardware.\n\nPozostaw wyłączone w razie braku pewności.", + "pt_BR": "Suporte para acesso direto ao teclado (HID). Permite que os jogos acessem seu teclado como um dispositivo de entrada de texto.\n\nFunciona apenas com jogos que suportam o uso de teclado nativamente no hardware do Switch.\n\nDeixe desativado se estiver em dúvida.", + "ru_RU": "Поддержка прямого ввода с клавиатуры (HID). Предоставляет игре прямой доступ к клавиатуре в качестве устройства ввода текста.\nРаботает только с играми, которые изначально поддерживают использование клавиатуры с Switch.\nРекомендуется оставить выключенным.", + "sv_SE": "Stöd för direkt tangentbordsåtkomst (HID). Ger spel åtkomst till ditt tangentbord som en textinmatningsenhet.\n\nFungerar endast med spel som har inbyggt stöd för tangentbordsanvändning på Switch-hårdvara.\n\nLämna AV om du är osäker.", + "th_TH": "รองรับการเข้าถึงแป้นพิมพ์โดยตรง (HID) ให้เกมเข้าถึงคีย์บอร์ดของคุณเป็นอุปกรณ์ป้อนข้อความ\n\nใช้งานได้กับเกมที่รองรับการใช้งานคีย์บอร์ดบนฮาร์ดแวร์ของ Switch เท่านั้น\n\nหากคุณไม่แน่ใจให้ปิดใช้งานไว้", + "tr_TR": "", + "uk_UA": "Підтримка прямого доступу до клавіатури (HID). Надає іграм доступ до клавіатури для вводу тексту.\n\nПрацює тільки з іграми, які підтримують клавіатуру на обладнанні Switch.\n\nЗалиште вимкненим, якщо не впевнені.", + "zh_CN": "直接键盘访问(HID)支持,游戏可以直接访问键盘作为文本输入设备。\n\n仅适用于在 Switch 硬件上原生支持键盘的游戏。\n\n如果不确定,请保持关闭状态。", + "zh_TW": "支援直接鍵盤存取 (HID)。遊戲可將鍵盤作為文字輸入裝置。\n\n僅適用於在 Switch 硬體上原生支援使用鍵盤的遊戲。\n\n如果不確定,請保持關閉狀態。" + } + }, + { + "ID": "DirectMouseTooltip", + "Translations": { + "ar_SA": "دعم الوصول المباشر للوحة المفاتيح (HID). يوفر وصول الألعاب إلى لوحة المفاتيح الخاصة بك كجهاز لإدخال النص.\n\nيعمل فقط مع الألعاب التي تدعم استخدام لوحة المفاتيح في الأصل على أجهزة سويتش.\n\nاتركه معطلا إذا كنت غير متأكد.", + "de_DE": "Unterstützt den direkten Mauszugriff (HID). Bietet Spielen Zugriff auf Ihre Maus als Zeigegerät.\n\nFunktioniert nur mit Spielen, die nativ die Steuerung mit der Maus auf Switch-Hardware unterstützen (nur sehr wenige).\n\nTouchscreen-Funktionalität ist möglicherweise eingeschränkt, wenn dies aktiviert ist.\n\n Aus lassen, wenn unsicher.", + "el_GR": "", + "en_US": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.", + "es_ES": "Soporte de acceso directo al mouse (HID). Proporciona a los juegos acceso a su mouse como puntero.\n\nSolo funciona con juegos que permiten de forma nativa el uso de controles con mouse en el hardware de switch, lo cual son pocos.\n\nCuando esté activado, la funcionalidad de pantalla táctil puede no funcionar.\n\nDesactívalo si no sabes qué hacer.", + "fr_FR": "Prise en charge de l’accès direct à la souris (HID). Permet aux jeux d’accéder à votre souris comme périphérique de pointage.\n\nNe fonctionne qu’avec les jeux qui supportent nativement les contrôles souris sur la console Switch, ce qui est rare.\n\nLorsque cette option est activée, la fonctionnalité de l’écran tactile peut ne pas fonctionner.\n\nLaissez DÉSACTIVÉ si vous n'êtes pas sûr.", + "he_IL": "", + "it_IT": "Supporto per l'accesso diretto al mouse (HID). Fornisce ai giochi l'accesso al mouse come dispositivo di puntamento.\n\nFunziona solo con i rari giochi che supportano nativamente l'utilizzo del mouse su hardware Switch.\n\nQuando questa opzione è attivata, il touchscreen potrebbe non funzionare.\n\nNel dubbio, lascia l'opzione disattivata.", + "ja_JP": "直接マウスアクセス (HID) のサポートです. ポインティングデバイスとしてマウスへのゲームアクセスを提供します.\n\nSwitchハードウェアでマウスの使用をネイティブにサポートしているゲームでのみ動作します.\n\n有効にしている場合, タッチスクリーン機能は動作しない場合があります.\n\nわからない場合はオフのままにしてください.", + "ko_KR": "마우스 직접 접속(HID)을 지원합니다. 마우스에 대한 게임 접속을 포인팅 장치로 제공합니다.\n\nSwitch 하드웨어에서 마우스 컨트롤을 기본적으로 지원하는 게임에서만 작동하며 거의 없습니다.\n\n활성화하면 터치 스크린 기능이 작동하지 않을 수 있습니다.\n\n모르면 체크 해제 상태로 두세요.", + "no_NO": "Direkte musepeker (HID) støtte. Gir deg spill-tilgang til musepeker.\n\nfungerer kun med spill som lokalt støtter musepekere på Ninteno SwitchTM maskinvare.\n\nNår aktivert, kan det hende touch funksjoner ikke fungerer\n\nLa være AV hvis du er usikker.", + "pl_PL": "Obsługa bezpośredniego dostępu do myszy (HID). Zapewnia dostęp gier do myszy jako urządzenia wskazującego.\n\nDziała tylko z grami, które natywnie obsługują przyciski myszy w urządzeniu Switch, które są nieliczne i daleko między nimi.\n\nPo włączeniu funkcja ekranu dotykowego może nie działać.\n\nPozostaw wyłączone w razie wątpliwości.", + "pt_BR": "Suporte para acesso direto ao mouse (HID). Permite que os jogos acessem seu mouse como um dispositivo de apontamento.\n\nFunciona apenas com jogos que suportam controles de mouse nativamente no hardware do Switch, o que é raro.\n\nQuando ativado, a funcionalidade de tela sensível ao toque pode não funcionar.\n\nDeixe desativado se estiver em dúvida.", + "ru_RU": "Поддержка прямого ввода мыши (HID). Предоставляет игре прямой доступ к мыши в качестве указывающего устройства.\nРаботает только с играми, которые изначально поддерживают использование мыши совместно с железом Switch.\nРекомендуется оставить выключенным.", + "sv_SE": "Stöd för direkt musåtkomst (HID). Ger spel åtkomst till din mus som pekdon.\n\nFungerar endast med spel som har inbyggt stöd för muskontroller på Switch-hårdvara, som är endast ett fåtal.\n\nViss pekskärmsfunktionalitet kanske inte fungerar när aktiverat.\n\nLämna AV om du är osäker.", + "th_TH": "รองรับการเข้าถึงเมาส์โดยตรง (HID) ให้เกมเข้าถึงเมาส์ของคุณเป็นอุปกรณ์ชี้ตำแหน่ง\n\nใช้งานได้เฉพาะกับเกมที่รองรับการควบคุมเมาส์บนฮาร์ดแวร์ของ Switch เท่านั้น ซึ่งมีอยู่ไม่มากนัก\n\nเมื่อเปิดใช้งาน ฟังก์ชั่นหน้าจอสัมผัสอาจไม่ทำงาน\n\nหากคุณไม่แน่ใจให้ปิดใช้งานไว้", + "tr_TR": "", + "uk_UA": "Підтримка прямого доступу до миші (HID). Надає іграм доступ до миші, як пристрій вказування.\n\nПрацює тільки з тими іграми, що підтримують мишу на обладнанні Switch (таких небагато).\n\nФункціонал сенсорного екрану може не працювати, якщо увімкнути цю функцію.\n\nЗалиште вимкненим, якщо не впевнені.", + "zh_CN": "直接鼠标访问(HID)支持,游戏可以直接访问鼠标作为指针输入设备。\n\n只适用于在 Switch 硬件上原生支持鼠标控制的游戏,这种游戏很少。\n\n启用后,触屏功能可能无法正常工作。\n\n如果不确定,请保持关闭状态。", + "zh_TW": "支援滑鼠直接存取 (HID)。遊戲可將滑鼠作為指向裝置使用。\n\n僅適用於在 Switch 硬體上原生支援滑鼠控制的遊戲,這類遊戲很少。\n\n啟用後,觸控螢幕功能可能無法使用。\n\n如果不確定,請保持關閉狀態。" + } + }, + { + "ID": "RegionTooltip", + "Translations": { + "ar_SA": "تغيير منطقة النظام", + "de_DE": "Ändert die Systemregion", + "el_GR": "Αλλαγή Περιοχής Συστήματος", + "en_US": "Change System Region", + "es_ES": "Cambia la región del sistema", + "fr_FR": "Changer la région du système", + "he_IL": "שנה אזור מערכת", + "it_IT": "Cambia regione di sistema", + "ja_JP": "システムの地域を変更します", + "ko_KR": "시스템 지역 변경", + "no_NO": "Endre systemregion", + "pl_PL": "Zmień Region Systemu", + "pt_BR": "Mudar a Região do Sistema", + "ru_RU": "Сменяет регион системы", + "sv_SE": "Ändra systemets region", + "th_TH": "เปลี่ยนภูมิภาคของระบบ", + "tr_TR": "Sistem Bölgesini Değiştir", + "uk_UA": "Змінити регіон системи", + "zh_CN": "更改系统区域", + "zh_TW": "變更系統區域" + } + }, + { + "ID": "LanguageTooltip", + "Translations": { + "ar_SA": "تغيير لغة النظام", + "de_DE": "Ändert die Systemsprache", + "el_GR": "Αλλαγή Γλώσσας Συστήματος", + "en_US": "Change System Language", + "es_ES": "Cambia el idioma del sistema", + "fr_FR": "Changer la langue du système", + "he_IL": "שנה שפת מערכת", + "it_IT": "Cambia lingua di sistema", + "ja_JP": "システムの言語を変更します", + "ko_KR": "시스템 언어 변경", + "no_NO": "Endre systemspråk", + "pl_PL": "Zmień język systemu", + "pt_BR": "Mudar o Idioma do Sistema", + "ru_RU": "Меняет язык системы", + "sv_SE": "Ändra systemets språk", + "th_TH": "เปลี่ยนภาษาของระบบ", + "tr_TR": "Sistem Dilini Değiştir", + "uk_UA": "Змінити мову системи", + "zh_CN": "更改系统语言", + "zh_TW": "變更系統語言" + } + }, + { + "ID": "TimezoneTooltip", + "Translations": { + "ar_SA": "تغيير النطاق الزمني للنظام", + "de_DE": "Ändert die Systemzeitzone", + "el_GR": "Αλλαγή Ζώνης Ώρας Συστήματος", + "en_US": "Change System TimeZone", + "es_ES": "Cambia la zona horaria del sistema", + "fr_FR": "Changer le fuseau horaire du système", + "he_IL": "שנה את אזור הזמן של המערכת", + "it_IT": "Cambia fuso orario di sistema", + "ja_JP": "システムのタイムゾーンを変更します", + "ko_KR": "시스템 시간대 변경", + "no_NO": "Endre systemtidssone", + "pl_PL": "Zmień Strefę Czasową Systemu", + "pt_BR": "Mudar o Fuso-Horário do Sistema", + "ru_RU": "Меняет часовой пояс системы", + "sv_SE": "Ändra systemets tidszon", + "th_TH": "เปลี่ยนโซนเวลาของระบบ", + "tr_TR": "Sistem Saat Dilimini Değiştir", + "uk_UA": "Змінити часовий пояс системи", + "zh_CN": "更改系统时区", + "zh_TW": "變更系統時區" + } + }, + { + "ID": "TimeTooltip", + "Translations": { + "ar_SA": "تغيير وقت النظام", + "de_DE": "Ändert die Systemzeit", + "el_GR": "Αλλαγή Ώρας Συστήματος", + "en_US": "Change System Time", + "es_ES": "Cambia la hora del sistema", + "fr_FR": "Changer l'heure du système", + "he_IL": "שנה זמן מערכת", + "it_IT": "Cambia data e ora di sistema", + "ja_JP": "システムの時刻を変更します", + "ko_KR": "시스템 시간 변경", + "no_NO": "Endre systemtid", + "pl_PL": "Zmień czas systemowy", + "pt_BR": "Mudar a Data e Hora do Sistema", + "ru_RU": "Меняет системное время системы", + "sv_SE": "Ändra systemtid", + "th_TH": "เปลี่ยนเวลาของระบบ", + "tr_TR": "Sistem Saatini Değiştir", + "uk_UA": "Змінити системний час", + "zh_CN": "更改系统时间", + "zh_TW": "變更系統時鐘" + } + }, + { + "ID": "MatchTimeTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Sync System Time to match your PC's current date & time.", + "es_ES": "", + "fr_FR": "Synchroniser l’heure système avec la date et l’heure actuelles de votre PC.", + "he_IL": "", + "it_IT": "Sincronizza data e ora del sistema con quelle del PC.", + "ja_JP": "", + "ko_KR": "시스템 시간을 PC의 현재 날짜 및 시간과 일치하도록 다시 동기화합니다.", + "no_NO": "Resynkroniser systemtiden slik at den samsvarer med PC-ens gjeldende dato og klokkeslett.", + "pl_PL": "", + "pt_BR": "Sincroniza a data e hora do emulador com seu sistema PC", + "ru_RU": "Повторно синхронизирует системное время, чтобы оно соответствовало текущей дате и времени вашего компьютера.", + "sv_SE": "Återsynkronisera systemtiden för att matcha din dators aktuella datum och tid.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Синхронізувати системний час, щоб він відповідав поточній даті та часу вашого ПК.", + "zh_CN": "重新同步系统时间以匹配您电脑的当前日期和时间。", + "zh_TW": "重新同步系統韌體時間至 PC 目前的日期和時間。" + } + }, + { + "ID": "VSyncToggleTooltip", + "Translations": { + "ar_SA": "محاكاة المزامنة العمودية للجهاز. في الأساس محدد الإطار لغالبية الألعاب؛ قد يؤدي تعطيله إلى تشغيل الألعاب بسرعة أعلى أو جعل شاشات التحميل تستغرق وقتا أطول أو تتعطل.\n\nيمكن تبديله داخل اللعبة باستخدام مفتاح التشغيل السريع الذي تفضله (F1 افتراضيا). نوصي بالقيام بذلك إذا كنت تخطط لتعطيله.\n\nاتركه ممكنا إذا لم تكن متأكدا.", + "de_DE": "Vertikale Synchronisierung der emulierten Konsole. Diese Option ist quasi ein Frame-Limiter für die meisten Spiele; die Deaktivierung kann dazu führen, dass Spiele mit höherer Geschwindigkeit laufen oder Ladebildschirme länger benötigen/hängen bleiben.\n\nKann beim Spielen mit einem frei wählbaren Hotkey ein- und ausgeschaltet werden (standardmäßig F1). \n\nIm Zweifelsfall AN lassen.", + "el_GR": "", + "en_US": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.", + "es_ES": "Sincronización vertical de la consola emulada. En práctica un limitador del framerate para la mayoría de los juegos; desactivando puede causar que juegos corran a mayor velocidad o que las pantallas de carga tarden más o queden atascados.\n\nSe puede alternar en juego utilizando una tecla de acceso rápido configurable (F1 by default). Recomendamos hacer esto en caso de querer desactivar sincroniziación vertical.\n\nDesactívalo si no sabes qué hacer.", + "fr_FR": "Synchronisation verticale de la console émulée. Il s'agit essentiellement d'un limiteur de fréquence d'images pour la majorité des jeux ; la désactivation peut entraîner une accélération du jeu ou provoquer des temps de chargement plus longs, voire des blocages..\n\nPeut être activée/désactivée en jeu via un raccourci clavier de votre choix (F1 par défaut). Nous recommandons d’utiliser ce raccourci si vous prévoyez de la désactiver.\n\nLaissez ACTIVÉE si vous n’êtes pas sûr.", + "he_IL": "", + "it_IT": "Sincronizzazione verticale della console emulata. Funziona essenzialmente come un limitatore del framerate per la maggior parte dei giochi; disabilitarla può far girare giochi a velocità più alta, allungare le schermate di caricamento o farle bloccare.\n\nPuò essere attivata mentre giochi con un tasto di scelta rapida (F1 per impostazione predefinita). Ti consigliamo di farlo se hai intenzione di disabilitarla.\n\nNel dubbio, lascia l'opzione attiva.", + "ja_JP": "エミュレートされたゲーム機の垂直同期です. 多くのゲームにおいて, フレームリミッタとして機能します. 無効にすると, ゲームが高速で実行されたり, ロード中に時間がかかったり, 止まったりすることがあります.\n\n設定したホットキー(デフォルトではF1)で, ゲーム内で切り替え可能です. 無効にする場合は, この操作を行うことをおすすめします.\n\nよくわからない場合はオンのままにしてください.", + "ko_KR": "에뮬레이트된 콘솔의 수직 동기화입니다. 기본적으로 대부분의 게임에서 프레임 제한 기능으로, 비활성화하면 게임이 더 빠른 속도로 실행되거나 로딩 화면이 더 오래 걸리거나 멈출 수 있습니다.\n\n게임 내에서 원하는 단축키(기본값은 F1)로 전환할 수 있습니다. 비활성화하려면 이 작업을 수행하는 것이 좋습니다.\n\n모르면 체크 상태로 두세요.", + "no_NO": "Emuler konsollens loddrett synkronisering. på ett vis en bildefrekvens begrensning for de fleste spill; deaktivering kan få spill til å kjøre med høyere hastighet, eller til å laste skjermene tar lengre tid eller sitter fast.\n\nkan byttes inn i spillet med en hurtigtast for preferansen (F1 som standard). Vi anbefaler å gjøre dette hvis du planlegger å deaktivere dette.\n\nLa være PÅ hvis du er usikker.", + "pl_PL": "Synchronizacja pionowa emulowanej konsoli. Zasadniczo ogranicznik klatek dla większości gier; wyłączenie jej może spowodować, że gry będą działać z większą szybkością, ekrany wczytywania wydłużą się lub nawet utkną.\n\nMoże być przełączana w grze za pomocą preferowanego skrótu klawiszowego. Zalecamy to zrobić, jeśli planujesz ją wyłączyć.\n\nW razie wątpliwości pozostaw WŁĄCZONĄ.", + "pt_BR": "V-Sync do console emulado. Funciona essencialmente como um limitador de quadros para a maioria dos jogos; desativá-lo pode fazer com que os jogos rodem em uma velocidade mais alta ou que telas de carregamento demorem mais ou travem.\n\nPode ser alternado durante o jogo com uma tecla de atalho de sua preferência (F1 por padrão). Recomendamos isso caso planeje desativá-lo.\n\nMantenha ligado se estiver em dúvida.", + "ru_RU": "Эмуляция вертикальной синхронизации консоли, которая ограничивает количество кадров в секунду в большинстве игр; отключение может привести к тому, что игры будут запущены с более высокой частотой кадров, но загрузка игры может занять больше времени, либо игра не запустится вообще.\n\nМожно включать и выключать эту настройку непосредственно в игре с помощью горячих клавиш (F1 по умолчанию). Если планируете отключить вертикальную синхронизацию, рекомендуем настроить горячие клавиши.\n\nРекомендуется оставить включенным.", + "sv_SE": "Emulerade konsollens vertikala synk. I grund och botten en begränsare för bitrutor för de flesta spel; inaktivera den kan orsaka att spel kör på en högre hastighet eller gör att skärmar tar längre tid att läsa eller fastnar i dem.\n\nKan växlas inne i spelet med en snabbtangent som du väljer (F1 som standard). Vi rekommenderar att göra detta om du planerar att inaktivera den.\n\nLämna PÅ om du är osäker.", + "th_TH": "Vertical Sync ของคอนโซลจำลอง โดยพื้นฐานแล้วเป็นตัวจำกัดเฟรมสำหรับเกมส่วนใหญ่ การปิดใช้งานอาจทำให้เกมทำงานด้วยความเร็วสูงขึ้น หรือทำให้หน้าจอการโหลดใช้เวลานานขึ้นหรือค้าง\n\nสามารถสลับได้ในเกมด้วยปุ่มลัดตามที่คุณต้องการ (F1 เป็นค่าเริ่มต้น) เราขอแนะนำให้ทำเช่นนี้หากคุณวางแผนที่จะปิดการใช้งาน\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", + "tr_TR": "", + "uk_UA": "Емуляція Вертикальної Синхронізації консолі. По суті, це обмежувач кадрів для більшості ігор; його вимкнення може призвести до того, що ігри працюватимуть на вищій швидкості, екрани завантаження триватимуть довше чи зупинятимуться.\n\nМожна перемикати в грі гарячою клавішею (За умовчанням F1). Якщо ви плануєте вимкнути функцію, рекомендуємо зробити це через гарячу клавішу.\n\nЗалиште увімкненим, якщо не впевнені.", + "zh_CN": "模拟控制台的垂直同步,开启后会降低大部分游戏的帧率。关闭后,可以获得更高的帧率,但也可能导致游戏画面加载耗时更长或卡住。\n\n在游戏中可以使用热键进行切换(默认为 F1 键)。\n\n如果不确定,请保持开启状态。", + "zh_TW": "模擬遊戲機的垂直同步。對大多數遊戲來說,它本質上是一個幀率限制器;停用它可能會導致遊戲以更高的速度執行,或使載入畫面耗時更長或卡住。\n\n可以在遊戲中使用快速鍵進行切換 (預設為 F1)。如果您打算停用,我們建議您這樣做。\n\n如果不確定,請保持開啟狀態。" + } + }, + { + "ID": "PptcToggleTooltip", + "Translations": { + "ar_SA": "يحفظ وظائف JIT المترجمة بحيث لا تحتاج إلى ترجمتها في كل مرة يتم فيها تحميل اللعبة.\n\nيقلل من التقطيع ويسرع بشكل ملحوظ أوقات التشغيل بعد التشغيل الأول للعبة.\n\nاتركه ممكنا إذا لم تكن متأكدا.", + "de_DE": "Speichert übersetzte JIT-Funktionen, sodass jene nicht jedes Mal übersetzt werden müssen, wenn das Spiel geladen wird.\n\nVerringert Stottern und die Zeit beim zweiten und den darauffolgenden Startvorgängen eines Spiels erheblich.\n\nIm Zweifelsfall AN lassen.", + "el_GR": "Ενεργοποιεί ή απενεργοποιεί το PPTC", + "en_US": "Saves translated JIT functions so that they do not need to be translated every time the game loads.\n\nReduces stuttering and significantly speeds up boot times after the first boot of a game.\n\nLeave ON if unsure.", + "es_ES": "Guarda funciones de JIT traducidas para que no sea necesario traducirlas cada vez que el juego carga.\n\nReduce los tirones y acelera significativamente el tiempo de inicio de los juegos después de haberlos ejecutado al menos una vez.\n\nActívalo si no sabes qué hacer.", + "fr_FR": "Sauvegarde les fonctions JIT traduites afin qu’elles n’aient pas besoin d’être retraduites à chaque chargement du jeu.\n\nRéduit les lags et accélère considérablement le temps de chargement après le premier lancement d'un jeu.\n\nLaissez ACTIVÉ si vous n’êtes pas sûr.", + "he_IL": "שומר את פונקציות ה-JIT המתורגמות כך שלא יצטרכו לעבור תרגום שוב כאשר משחק עולה.\n\nמפחית תקיעות ומשפר מהירות עלייה של המערכת אחרי הפתיחה הראשונה של המשחק.\n\nמוטב להשאיר דלוק אם לא בטוחים.", + "it_IT": "Salva le funzioni JIT tradotte in modo che non debbano essere tradotte tutte le volte che si avvia un determinato gioco.\n\nRiduce i fenomeni di stuttering e velocizza sensibilmente gli avvii successivi del gioco.\n\nNel dubbio, lascia l'opzione attiva.", + "ja_JP": "翻訳されたJIT関数をセーブすることで, ゲームをロードするたびに毎回翻訳する処理を不要とします.\n\n一度ゲームを起動すれば,二度目以降の起動時遅延を大きく軽減できます.\n\nよくわからない場合はオンのままにしてください.", + "ko_KR": "번역된 JIT 함수를 저장하여 게임을 불러올 때마다 번역할 필요가 없도록 합니다.\n\n게임을 처음 부팅한 후 끊김 현상을 줄이고 부팅 시간을 크게 단축합니다.\n\n모르면 체크 상태로 두세요.", + "no_NO": "Lagrer oversatte JIT funksjoner så de ikke trenger og bli oversatt hver gang spillet laster.\n\nKan redusere hakkete spilling og gjør at spillet starter opp raskere ved første oppstart.\n\nLa være PÅ om usikker.", + "pl_PL": "Zapisuje przetłumaczone funkcje JIT, dzięki czemu nie muszą być tłumaczone za każdym razem, gdy gra się ładuje.\n\nZmniejsza zacinanie się i znacznie przyspiesza uruchamianie po pierwszym uruchomieniu gry.\n\nJeśli nie masz pewności, pozostaw WŁĄCZONE", + "pt_BR": "Salva funções JIT traduzidas para que elas não precisem ser traduzidas toda vez que o jogo for carregado.\n\nReduz a trepidação e acelera significativamente os tempos de inicialização após a primeira inicialização de um jogo.\n\nDeixe LIGADO se não tiver certeza.", + "ru_RU": "Сохраняет скомпилированные JIT-функции для того, чтобы не преобразовывать их по новой каждый раз при запуске игры.\n\nУменьшает статтеры и значительно ускоряет последующую загрузку игр.\n\nРекомендуется оставить включенным.", + "sv_SE": "Sparar översatta JIT-funktioner så att de inte behöver översättas varje gång som spelet läses in.\n\nMinskar stuttering och snabbare på uppstartstiden väsentligt efter första uppstarten av ett spel.\n\nLämna PÅ om du är osäker.", + "th_TH": "บันทึกฟังก์ชั่น JIT ที่แปลแล้ว ดังนั้นจึงไม่จำเป็นต้องแปลทุกครั้งที่โหลดเกม\n\nลดอาการกระตุกและเร่งความเร็วการบูตได้อย่างมากหลังจากการบูตครั้งแรกของเกม\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", + "tr_TR": "Çevrilen JIT fonksiyonlarını oyun her açıldığında çevrilmek zorunda kalmaması için kaydeder.\n\nTeklemeyi azaltır ve ilk açılıştan sonra oyunların ilk açılış süresini ciddi biçimde hızlandırır.\n\nEmin değilseniz aktif halde bırakın.", + "uk_UA": "Зберігає перекладені функції JIT, щоб їх не потрібно було перекладати кожного разу, коли гра завантажується.\n\nЗменшує заїкання (stuttering) та значно прискорює наступні завантаження гри (після першого завантаження).\n\nЗалиште увімкненим, якщо не впевнені.", + "zh_CN": "缓存已编译的游戏指令,这样每次游戏加载时就无需重新编译。\n\n可以减少卡顿和启动时间,提高游戏响应速度。\n\n如果不确定,请保持开启状态。", + "zh_TW": "儲存已轉譯的 JIT 函數,這樣每次載入遊戲時就無需再轉譯這些函數。\n\n減少遊戲首次啟動後的卡頓現象,並大大加快啟動時間。\n\n如果不確定,請保持開啟狀態。" + } + }, + { + "ID": "LowPowerPptcToggleTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Lädt den PPTC mit einem Drittel der verfügbaren Prozessorkernen", + "el_GR": "", + "en_US": "Load the PPTC using a third of the amount of cores.", + "es_ES": "Cargue el PPTC utilizando un tercio de la cantidad de núcleos.", + "fr_FR": "Charger le PPTC en utilisant un tiers des cœurs disponibles.", + "he_IL": "", + "it_IT": "Carica la cache PPTC usando un terzo dei core del processore.", + "ja_JP": "", + "ko_KR": "코어의 3분의 1을 사용하여 PPTC를 불러옵니다.", + "no_NO": "Last inn PPTC med en tredjedel av antall kjerner.", + "pl_PL": "", + "pt_BR": "Carrega o PPTC usando um terço da quantidade de núcleos.", + "ru_RU": "Загрузить PPTC, используя треть от количества ядер.", + "sv_SE": "Läs in PPTC med en tredjedel av mängden kärnor.", + "th_TH": "โหลด PPTC โดยใช้หนึ่งในสามของจำนวนคอร์", + "tr_TR": "", + "uk_UA": "Завантажувати PPTC використовуючи третину від кількості ядер.", + "zh_CN": "使用三分之一的核心数加载 PPTC.", + "zh_TW": "使用 CPU 核心數量的三分之一載入 PPTC。" + } + }, + { + "ID": "FsIntegrityToggleTooltip", + "Translations": { + "ar_SA": "يتحقق من وجود ملفات تالفة عند تشغيل لعبة ما، وإذا تم اكتشاف ملفات تالفة، فسيتم عرض خطأ تجزئة في السجل.\n\nليس له أي تأثير على الأداء ويهدف إلى المساعدة في استكشاف الأخطاء وإصلاحها.\n\nاتركه مفعلا إذا كنت غير متأكد.", + "de_DE": "Prüft beim Startvorgang auf beschädigte Dateien und zeigt bei beschädigten Dateien einen Hash-Fehler (Hash Error) im Log an.\n\nDiese Einstellung hat keinen Einfluss auf die Leistung und hilft bei der Fehlersuche.\n\nIm Zweifelsfall AN lassen.", + "el_GR": "Ενεργοποιεί τους ελέγχους ακεραιότητας σε αρχεία περιεχομένου παιχνιδιού", + "en_US": "Checks for corrupt files when booting a game, and if corrupt files are detected, displays a hash error in the log.\n\nHas no impact on performance and is meant to help troubleshooting.\n\nLeave ON if unsure.", + "es_ES": "Comprueba si hay archivos corruptos en los juegos que ejecutes al abrirlos, y si detecta archivos corruptos, muestra un error de Hash en los registros.\n\nEsto no tiene impacto alguno en el rendimiento y está pensado para ayudar a resolver problemas.\n\nActívalo si no sabes qué hacer.", + "fr_FR": "Vérifie la présence de fichiers corrompus au démarrage d’un jeu. En cas de fichiers corrompus détectés, un message d’erreur de hachage s’affiche dans le journal.\n\nN’a aucun impact sur les performances et est destiné à faciliter le dépannage.\n\nLaissez ACTIVÉ si vous n’êtes pas sûr.", + "he_IL": "בודק לקבצים שגויים כאשר משחק עולה, ואם מתגלים כאלו, מציג את מזהה השגיאה שלהם לקובץ הלוג.\n\nאין לכך השפעה על הביצועים ונועד לעזור לבדיקה וניפוי שגיאות של האמולטור.\n\nמוטב להשאיר דלוק אם לא בטוחים.", + "it_IT": "Controlla la presenza di file corrotti quando si avvia un gioco. Se vengono rilevati dei file corrotti, verrà mostrato un errore di hash nel log.\n\nQuesta opzione non influisce sulle prestazioni ed è pensata per facilitare la risoluzione dei problemi.\n\nNel dubbio, lascia l'opzione attiva.", + "ja_JP": "ゲーム起動時にファイル破損をチェックし,破損が検出されたらログにハッシュエラーを表示します..\n\nパフォーマンスには影響なく, トラブルシューティングに役立ちます.\n\nよくわからない場合はオンのままにしてください.", + "ko_KR": "게임을 부팅할 때 손상된 파일을 확인하고, 손상된 파일이 감지되면 로그에 해시 오류를 표시합니다.\n\n성능에 영향을 미치지 않으며 문제 해결에 도움이 됩니다.\n\n모르면 체크 상태로 두세요.", + "no_NO": "Sjekker for korrupte filer ved oppstart av et spill, og dersom korrupte filer oppdages, viser en hashfeil i loggen.\n\nhar ingen innvirkning på ytelsen og er ment å hjelpe med feilsøking.\n\nLa være PÅ hvis usikker.", + "pl_PL": "Sprawdza pliki podczas uruchamiania gry i jeśli zostaną wykryte uszkodzone pliki, wyświetla w dzienniku błąd hash.\n\nNie ma wpływu na wydajność i ma pomóc w rozwiązywaniu problemów.\n\nPozostaw WŁĄCZONE, jeśli nie masz pewności.", + "pt_BR": "Verifica se há arquivos corrompidos ao inicializar um jogo e, se forem detectados, exibe um erro de hash no log.\n\nNão tem impacto no desempenho e tem como objetivo ajudar na solução de problemas.\n\nDeixe LIGADO se não tiver certeza.", + "ru_RU": "Проверяет файлы при загрузке игры и если обнаружены поврежденные файлы, выводит сообщение о поврежденном хэше в журнале.\n\nНе влияет на производительность и необходим для помощи в устранении неполадок.\n\nРекомендуется оставить включенным.", + "sv_SE": "Letar efter skadade filer när ett spel startas upp, och om skadade filer hittas, visas ett kontrollsummefel i loggen.\n\nHar ingen påverkan på prestandan och är tänkt att hjälpa felsökningen.\n\nLämna PÅ om du är osäker.", + "th_TH": "ตรวจสอบไฟล์ที่เสียหายเมื่อบูตเกม และหากตรวจพบไฟล์ที่เสียหาย จะแสดงข้อผิดพลาดของแฮชในบันทึก\n\nไม่มีผลกระทบต่อประสิทธิภาพการทำงานและมีไว้เพื่อช่วยในการแก้ไขปัญหา\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", + "tr_TR": "Oyun açarken hatalı dosyaların olup olmadığını kontrol eder, ve hatalı dosya bulursa log dosyasında hash hatası görüntüler.\n\nPerformansa herhangi bir etkisi yoktur ve sorun gidermeye yardımcı olur.\n\nEmin değilseniz aktif halde bırakın.", + "uk_UA": "Перевіряє наявність пошкоджених файлів під час завантаження гри, і якщо виявлено пошкоджені файли, показує помилку хешу в журналі.\n\nНе впливає на продуктивність і призначений для усунення несправностей.\n\nЗалиште увімкненим, якщо не впевнені.", + "zh_CN": "启动游戏时检查游戏文件的完整性,并在日志中记录损坏的文件。\n\n对性能没有影响,用于排查故障。\n\n如果不确定,请保持开启状态。", + "zh_TW": "在啟動遊戲時檢查損壞的檔案,如果檢測到損壞的檔案,則在日誌中顯示雜湊值錯誤。\n\n對效能沒有影響,旨在幫助排除故障。\n\n如果不確定,請保持開啟狀態。" + } + }, + { + "ID": "AudioBackendTooltip", + "Translations": { + "ar_SA": "يغير الواجهة الخلفية المستخدمة لتقديم الصوت.\n\nSDL2 هو الخيار المفضل، بينما يتم استخدام OpenAL وSoundIO كبديلين. زائف لن يكون لها صوت.\n\nاضبط على SDL2 إذا لم تكن متأكدا.", + "de_DE": "Ändert das Backend, das zum Rendern von Audio verwendet wird.\n\nSDL2 ist das bevorzugte Audio-Backend, OpenAL und SoundIO sind als Alternativen vorhanden. Dummy wird keinen Audio-Output haben.\n\nIm Zweifelsfall SDL2 auswählen.", + "el_GR": "Αλλαγή ήχου υποστήριξης", + "en_US": "Changes the backend used to render audio.\n\nSDL2 is the preferred one, while OpenAL and SoundIO are used as fallbacks. Dummy will have no sound.\n\nSet to SDL2 if unsure.", + "es_ES": "Cambia el motor usado para renderizar audio.\n\nSDL2 es el preferido, mientras que OpenAL y SoundIO se usan si hay problemas con este. Dummy no produce audio.\n\nSelecciona SDL2 si no sabes qué hacer.", + "fr_FR": "Change le moteur utilisé pour le rendu audio.\n\nSDL2 est le moteur recommandé, tandis qu’OpenAL et SoundIO sont utilisés en secours. Dummy ne produit aucun son.\n\nLaissez sur SDL2 si vous n'êtes pas sûr.", + "he_IL": "משנה את אחראי השמע.\n\nSDL2 הוא הנבחר, למראת שOpenAL וגם SoundIO משומשים כאפשרויות חלופיות. אפשרות הDummy לא תשמיע קול כלל.\n\nמוטב להשאיר על SDL2 אם לא בטוחים.", + "it_IT": "Cambia il backend usato per riprodurre l'audio.\n\nSDL2 è quello preferito, mentre OpenAL e SoundIO sono usati come ripiego. Dummy non riprodurrà alcun suono.\n\nNel dubbio, imposta l'opzione su SDL2.", + "ja_JP": "音声レンダリングに使用するバックエンドを変更します.\n\nSDL2 が優先され, OpenAL と SoundIO はフォールバックとして使用されます. ダミーは音声出力しません.\n\nよくわからない場合は SDL2 を設定してください.", + "ko_KR": "오디오 렌더링에 사용되는 백엔드를 변경합니다.\n\nSDL2가 선호되는 반면 OpenAL 및 SoundIO는 대체 수단으로 사용됩니다. 더미에는 소리가 나지 않습니다.\n\n모르면 SDL2로 설정하세요.", + "no_NO": "Endrer backend brukt til å gjengi lyd.\n\nSDL2 er foretrukket, mens OpenAL og SoundIO brukes som reserveløsning. Dummy kommer ikke til å ha lyd.\n\nSett til SDL2 hvis usikker.", + "pl_PL": "Zmienia backend używany do renderowania dźwięku.\n\nSDL2 jest preferowany, podczas gdy OpenAL i SoundIO są używane jako rezerwy. Dummy nie będzie odtwarzać dźwięku.\n\nW razie wątpliwości ustaw SDL2.", + "pt_BR": "Altera o módulo usado para renderizar áudio.\n\nSDL2 é o preferido, enquanto OpenAL e SoundIO são usados como fallbacks. Dummy não terá som.\n\nDefina como SDL2 se não tiver certeza.", + "ru_RU": "Изменяет используемый аудио бэкенд для рендера звука.\n\nSDL2 является предпочтительным вариантом, в то время как OpenAL и SoundIO используются в качестве резервных.\n\nРекомендуется использование SDL2.", + "sv_SE": "Ändrar bakänden som används för att rendera ljud.\n\nSDL2 är den föredragna, men OpenAL och SoundIO används för att falla tillbaka på. Dummy har inget ljud.\n\nStäll in till SDL2 om du är osäker.", + "th_TH": "เปลี่ยนแบ็กเอนด์ที่ใช้ในการเรนเดอร์เสียง\n\nแนะนำเป็น SDL2 ในขณะที่ OpenAL และ SoundIO ถูกใช้เป็นทางเลือกสำรอง ดัมมี่จะไม่มีเสียง\n\nตั้งค่าเป็น SDL2 หากคุณไม่แน่ใจ", + "tr_TR": "Ses çıkış motorunu değiştirir.\n\nSDL2 tercih edilen seçenektir, OpenAL ve SoundIO ise alternatif olarak kullanılabilir. Dummy seçeneğinde ses çıkışı olmayacaktır.\n\nEmin değilseniz SDL2 seçeneğine ayarlayın.", + "uk_UA": "Змінює серверну частину, яка використовується для відтворення аудіо.\n\nSDL2 є кращим, тоді як OpenAL і SoundIO використовуються як резервні варіанти. Dummy не матиме звуку.\n\nВстановіть SDL2, якщо не впевнені.", + "zh_CN": "更改音频处理引擎。\n\n推荐选择“SDL2”,另外“OpenAL”和“SoundIO”可以作为备选,选择“无”将没有声音。\n\n如果不确定,请设置为“SDL2”。", + "zh_TW": "變更用於繪製音訊的後端。\n\nSDL2 是首選,而 OpenAL 和 SoundIO 則作為備用。虛設 (Dummy) 將沒有聲音。\n\n如果不確定,請設定為 SDL2。" + } + }, + { + "ID": "MemoryManagerTooltip", + "Translations": { + "ar_SA": "تغيير كيفية تعيين ذاكرة الضيف والوصول إليها. يؤثر بشكل كبير على أداء وحدة المعالجة المركزية التي تمت محاكاتها.\n\nاضبط على المضيف غير محدد إذا لم تكن متأكدا.", + "de_DE": "Ändert wie der Gastspeicher abgebildet wird und wie auf ihn zugegriffen wird. Beinflusst die Leistung der emulierten CPU erheblich.\n\nIm Zweifelsfall Host ungeprüft auswählen.", + "el_GR": "Αλλάξτε τον τρόπο αντιστοίχισης και πρόσβασης στη μνήμη επισκέπτη. Επηρεάζει σε μεγάλο βαθμό την απόδοση της προσομοίωσης της CPU.", + "en_US": "Change how guest memory is mapped and accessed. Greatly affects emulated CPU performance.\n\nSet to HOST UNCHECKED if unsure.", + "es_ES": "Cambia la forma de mapear y acceder a la memoria del guest. Afecta en gran medida al rendimiento de la CPU emulada.\n\nSelecciona \"Host sin verificación\" si no sabes qué hacer.", + "fr_FR": "Modifie la manière dont la mémoire émulée est mappée et accédée. Impacte fortement les performances du processeur émulé.\n\nLaissez sur HÔTE NON VÉRIFIÉ si vous n'êtes pas sûr.", + "he_IL": "שנה איך שזיכרון מארח מיוחד ומונגד. משפיע מאוד על ביצועי המעבד המדומה.\n\nמוטב להשאיר על מארח לא מבוקר אם לא בטוחים.", + "it_IT": "Cambia il modo in cui la memoria guest è mappata e vi si accede. Influisce notevolmente sulle prestazioni della CPU emulata.\n\nNel dubbio, imposta l'opzione su Host Unchecked.", + "ja_JP": "ゲストメモリのマップ/アクセス方式を変更します. エミュレートされるCPUのパフォーマンスに大きな影響を与えます.\n\nよくわからない場合は「ホスト,チェックなし」を設定してください.", + "ko_KR": "게스트 메모리 매핑 및 접속 방법을 변경합니다. 에뮬레이트된 CPU 성능에 큰 영향을 미칩니다.\n\n모르면 호스트 확인 안 함으로 설정합니다.", + "no_NO": "Endre hvordan gjesteminne tilordnes og åpnes. Påvirker emulator CPU-ytelsen veldig mye.\n\nSett til HOST UNCHECKED hvis usikker.", + "pl_PL": "Zmień sposób mapowania i uzyskiwania dostępu do pamięci gości. Znacznie wpływa na wydajność emulowanego procesora.\n\nUstaw na HOST UNCHECKED, jeśli nie masz pewności.", + "pt_BR": "Altera como a memória do convidado é mapeada e acessada. Afeta muito o desempenho da CPU emulada.\n\nDefina como HÓSPEDE SEM VERIFICAÇÃO se não tiver certeza.", + "ru_RU": "Меняет разметку и доступ к гостевой памяти. Значительно влияет на производительность процессора.\n\nРекомендуется оставить «Хост не установлен»", + "sv_SE": "Ändra hur gästminne mappas och ges åtkomst till. Påverkar emulerad CPU-prestanda mycket.\n\nStäll in till \"Värd inte kontrollerad\" om du är osäker.", + "th_TH": "เปลี่ยนวิธีการเข้าถึงหน่วยความจำของผู้เยี่ยมชม ส่งผลอย่างมากต่อประสิทธิภาพการทำงานของ CPU ที่จำลอง\n\nตั้งค่าเป็น ไม่ได้ตรวจสอบโฮสต์ หากคุณไม่แน่ใจ", + "tr_TR": "Guest hafızasının nasıl tahsis edilip erişildiğini değiştirir. Emüle edilen CPU performansını ciddi biçimde etkiler.\n\nEmin değilseniz HOST UNCHECKED seçeneğine ayarlayın.", + "uk_UA": "Змінює спосіб відображення та доступу до гостьової пам’яті. Значно впливає на продуктивність емульованого ЦП.\n\nВстановіть «Неперевірений хост», якщо не впевнені.", + "zh_CN": "更改模拟器内存映射和访问的方式,对模拟器 CPU 的性能影响很大。\n\n如果不确定,请设置为“跳过检查的本机映射”。", + "zh_TW": "變更客體記憶體的映射和存取方式。這會極大地影響模擬 CPU 效能。\n\n如果不確定,請設定為主體略過檢查模式。" + } + }, + { + "ID": "MemoryManagerSoftwareTooltip", + "Translations": { + "ar_SA": "استخدام جدول الصفحات البرمجي لترجمة العناوين. أعلى دقة ولكن أبطأ أداء.", + "de_DE": "Verwendung einer Software-Seitentabelle für die Adressumsetzung. Höchste Genauigkeit, aber langsamste Leistung.", + "el_GR": "Χρησιμοποιήστε έναν πίνακα σελίδων λογισμικού για τη μετάφραση διευθύνσεων. Υψηλότερη ακρίβεια αλλά πιο αργή απόδοση.", + "en_US": "Use a software page table for address translation. Highest accuracy but slowest performance.", + "es_ES": "Usa una tabla de paginación de software para traducir direcciones. Ofrece la precisión más exacta pero el rendimiento más lento.", + "fr_FR": "Utilise une table des pages logicielle pour la traduction des adresses. Offre la plus grande précision mais les performances sont les plus lentes.", + "he_IL": "השתמש בתוכנת ה-page table בכדי להתייחס לתרגומים. דיוק מרבי לקונסולה אך המימוש הכי איטי.", + "it_IT": "Usa una software page table per la traduzione degli indirizzi. Massima precisione ma prestazioni più lente.", + "ja_JP": "アドレス変換にソフトウェアページテーブルを使用します. 非常に正確ですがパフォーマンスが大きく低下します.", + "ko_KR": "주소 번역에 소프트웨어 페이지 테이블을 사용합니다. 정확도는 가장 높지만 가장 느립니다.", + "no_NO": "Bruk en programvareside tabell for adresseoversettelse. Høyeste nøyaktighet, men tregeste ytelse.", + "pl_PL": "Użyj tabeli stron oprogramowania do translacji adresów. Najwyższa celność, ale najwolniejsza wydajność.", + "pt_BR": "Usar uma tabela de página via software para tradução de endereços. Maior precisão, porém performance mais baixa.", + "ru_RU": "Использует таблицу страниц для преобразования адресов. \nСамая высокая точность, но самая низкая производительность.", + "sv_SE": "Använd en programvarubaserad page table för adressöversättning. Högsta noggrannhet men lägsta prestanda.", + "th_TH": "ใช้ตารางหน้าซอฟต์แวร์สำหรับการแปลที่อยู่ ความแม่นยำสูงสุดแต่ประสิทธิภาพช้าที่สุด", + "tr_TR": "Adres çevirisi için bir işlemci sayfası kullanır. En yüksek doğruluğu ve en yavaş performansı sunar.", + "uk_UA": "Використовує програмну таблицю сторінок для перекладу адрес. Найвища точність, але найповільніша продуктивність.", + "zh_CN": "使用软件内存页进行内存地址映射,最准确但是速度最慢。", + "zh_TW": "使用軟體分頁表進行位址轉換。精度最高,但效能最差。" + } + }, + { + "ID": "MemoryManagerHostTooltip", + "Translations": { + "ar_SA": "تعيين الذاكرة مباشرة في مساحة عنوان المضيف. تجميع وتنفيذ JIT أسرع بكثير.", + "de_DE": "Direkte Zuordnung von Speicher im Host-Adressraum. Viel schnellere JIT-Kompilierung und Ausführung.", + "el_GR": "Απευθείας αντιστοίχιση της μνήμης στον χώρο διευθύνσεων υπολογιστή υποδοχής. Πολύ πιο γρήγορη μεταγλώττιση και εκτέλεση JIT.", + "en_US": "Directly map memory in the host address space. Much faster JIT compilation and execution.", + "es_ES": "Mapea la memoria directamente en la dirección de espacio del host. Compilación y ejecución JIT mucho más rápida.", + "fr_FR": "Mappe directement la mémoire dans l’espace d’adressage de l’hôte. Compilation JIT et exécution beaucoup plus rapides.", + "he_IL": "ממפה זיכרון ישירות לכתובת המארח. מהיר בהרבה ביכולות קימפול ה-JIT והריצה.", + "it_IT": "Mappa direttamente la memoria nello spazio degli indirizzi dell'host. Compilazione ed esecuzione JIT molto più veloce.", + "ja_JP": "ホストのアドレス空間にメモリを直接マップします.JITのコンパイルと実行速度が大きく向上します.", + "ko_KR": "호스트 주소 공간에 메모리를 직접 매핑합니다. JIT 컴파일 및 실행 속도가 훨씬 빨라집니다.", + "no_NO": "Direkte kartminne i vertens adresseområde. Mye raskere JIT kompilering og utførelse.", + "pl_PL": "Bezpośrednio mapuj pamięć w przestrzeni adresowej hosta. Znacznie szybsza kompilacja i wykonanie JIT.", + "pt_BR": "Mapeia memória no espaço de endereço hóspede diretamente. Compilação e execução do JIT muito mais rápida.", + "ru_RU": "Прямая разметка памяти в адресном пространстве хоста. \nЗначительно более быстрые запуск и компиляция JIT.", + "sv_SE": "Direkt mappning av minne i host address space. Mycket snabbare JIT-kompilering och körning.", + "th_TH": "แมปหน่วยความจำในพื้นที่ที่อยู่โฮสต์โดยตรง การคอมไพล์และดำเนินการของ JIT เร็วขึ้นมาก", + "tr_TR": "Hafızayı doğrudan host adres aralığında tahsis eder. Çok daha hızlı JIT derleme ve işletimi sunar.", + "uk_UA": "Пряме відображення пам'яті в адресному просторі хосту. Набагато швидша компіляція та виконання JIT.", + "zh_CN": "直接映射内存页到电脑内存,使得即时编译和执行的效率更高。", + "zh_TW": "直接映射主體位址空間中的記憶體。更快的 JIT 編譯和執行速度。" + } + }, + { + "ID": "MemoryManagerUnsafeTooltip", + "Translations": { + "ar_SA": "تعيين الذاكرة مباشرة، ولكن لا تخفي العنوان داخل مساحة عنوان الضيف قبل الوصول. أسرع، ولكن على حساب السلامة. يمكن لتطبيق الضيف الوصول إلى الذاكرة من أي مكان في ريوجينكس، لذا قم بتشغيل البرامج التي تثق بها فقط مع هذا الوضع.", + "de_DE": "Direkte Zuordnung des Speichers, aber keine Maskierung der Adresse innerhalb des Gastadressraums vor dem Zugriff. Schneller, aber auf Kosten der Sicherheit. Die Gastanwendung kann von überall in Ryujinx auf den Speicher zugreifen, daher sollte in diesem Modus nur Programme ausgeführt werden denen vertraut wird.", + "el_GR": "Απευθείας χαρτογράφηση της μνήμης, αλλά μην καλύπτετε τη διεύθυνση εντός του χώρου διευθύνσεων επισκέπτη πριν από την πρόσβαση. Πιο γρήγορα, αλλά με κόστος ασφάλειας. Η εφαρμογή μπορεί να έχει πρόσβαση στη μνήμη από οπουδήποτε στο Ryujinx, επομένως εκτελείτε μόνο προγράμματα που εμπιστεύεστε με αυτήν τη λειτουργία.", + "en_US": "Directly map memory, but do not mask the address within the guest address space before access. Faster, but at the cost of safety. The guest application can access memory from anywhere in Ryujinx, so only run programs you trust with this mode.", + "es_ES": "Mapea la memoria directamente, pero no enmascara la dirección dentro del espacio de dirección del guest antes del acceso. El modo más rápido, pero a costa de seguridad. La aplicación guest puede acceder a la memoria desde cualquier parte en Ryujinx, así que ejecuta solo programas en los que confíes cuando uses este modo.", + "fr_FR": "Mappe directement la mémoire, mais sans masquer l’adresse dans l’espace d’adressage invité avant l’accès. Plus rapide, mais au détriment de la sécurité. L’application invitée peut accéder à n’importe quelle zone mémoire de Ryujinx ; n’utilisez ce mode qu’avec des programmes de confiance.", + "he_IL": "ממפה זיכרון ישירות, אך לא ממסך את הכתובת בתוך כתובת המארח לפני הגישה. מהיר, אך במחיר של הגנה. יישום המארח בעל גישה לזיכרון מכל מקום בריוג'ינקס, לכן הריצו איתו רק קבצים שאתם סומכים עליהם.", + "it_IT": "Mappa direttamente la memoria, ma non maschera l'indirizzo all'interno dello spazio degli indirizzi guest prima dell'accesso. Più veloce, ma a costo della sicurezza. L'applicazione guest può accedere alla memoria da qualsiasi punto di Ryujinx, quindi esegui solo programmi di cui ti fidi con questa modalità.", + "ja_JP": "メモリを直接マップしますが, アクセス前にゲストのアドレス空間内のアドレスをマスクしません. より高速になりますが, 安全性が犠牲になります. ゲストアプリケーションは Ryujinx のどこからでもメモリにアクセスできるので,このモードでは信頼できるプログラムだけを実行するようにしてください.", + "ko_KR": "메모리를 직접 매핑하되 접속하기 전에 게스트 주소 공간 내의 주소를 마스킹하지 않습니다. 더 빠르지만 안전성이 희생됩니다. 게스트 애플리케이션은 Ryujinx의 어느 곳에서나 메모리에 접속할 수 있으므로 이 모드에서는 신뢰할 수 있는 프로그램만 실행하세요.", + "no_NO": "Direkte kartminne, men ikke masker adressen i gjesteadressen før du har tilgang. raskere, men på bekostning av sikkerhet. gjeste-programmet kan få tilgang til minne fra hvor som helst i Ryujinx, så bare kjøre programmer du stoler på med denne modusen.", + "pl_PL": "Bezpośrednio mapuj pamięć, ale nie maskuj adresu w przestrzeni adresowej gościa przed uzyskaniem dostępu. Szybciej, ale kosztem bezpieczeństwa. Aplikacja gościa może uzyskać dostęp do pamięci z dowolnego miejsca w Ryujinx, więc w tym trybie uruchamiaj tylko programy, którym ufasz.", + "pt_BR": "Mapeia memória diretamente, mas sem limitar o acesso ao espaço de endereçamento do sistema convidado. Mais rápido, porém menos seguro. O aplicativo convidado pode acessar memória de qualquer parte do Ryujinx, então apenas rode programas em que você confia nesse modo.", + "ru_RU": "Производит прямую разметку памяти, но не маскирует адрес в гостевом адресном пространстве перед получением доступа. \nБыстро, но небезопасно. Гостевое приложение может получить доступ к памяти из Ryujinx, поэтому в этом режиме рекомендуется запускать только те программы, которым вы доверяете.", + "sv_SE": "Direkt mappning av minne, men maskera inte adressen inom guest address space innan åtkomst. Snabbare men kostar säkerhet. Gästapplikationen kan komma åt minne från överallt i Ryujinx, så kör endast program som du litar på i detta läge.", + "th_TH": "แมปหน่วยความจำโดยตรง แต่อย่าตั้งค่าที่อยู่ของผู้เยี่ยมชมก่อนที่จะเข้าถึง เร็วกว่า แต่ต้องแลกกับความปลอดภัย แอปพลิเคชั่นของผู้เยี่ยมชมสามารถเข้าถึงหน่วยความจำได้จากทุกที่ใน Ryujinx แนะนำให้รันเฉพาะโปรแกรมที่คุณเชื่อถือในโหมดนี้", + "tr_TR": "Hafızayı doğrudan tahsis eder, ancak host aralığına erişimden önce adresi maskelemez. Daha iyi performansa karşılık emniyetten ödün verir. Misafir uygulama Ryujinx içerisinden istediği hafızaya erişebilir, bu sebeple bu seçenek ile sadece güvendiğiniz uygulamaları çalıştırın.", + "uk_UA": "Пряме відображення пам’яті, але не маскує адресу в гостьовому адресному просторі перед доступом. Швидше, але ціною безпеки. Гостьова програма може отримати доступ до пам’яті з будь-якого місця в Ryujinx, тому запускайте в цьому режимі лише програми, яким ви довіряєте.", + "zh_CN": "直接映射内存页到电脑内存,并且不检查内存溢出,使得效率更高,但牺牲了安全。\n游戏程序可以访问模拟器内存的任意地址,所以不安全。\n建议此模式下只运行您信任的游戏程序。", + "zh_TW": "直接映射記憶體,但在存取前不封鎖客體位址空間內的位址。速度更快,但相對不安全。訪客應用程式可以從 Ryujinx 中的任何地方存取記憶體,因此只能使用該模式執行您信任的程式。" + } + }, + { + "ID": "UseHypervisorTooltip", + "Translations": { + "ar_SA": "استخدم هايبرڤايزور بدلا من JIT. يعمل على تحسين الأداء بشكل كبير عند توفره، ولكنه قد يكون غير مستقر في حالته الحالية.", + "de_DE": "Verwende Hypervisor anstelle von JIT. Verbessert die Leistung stark, falls vorhanden, kann jedoch in seinem aktuellen Zustand instabil sein.", + "el_GR": "Χρησιμοποιήστε Hypervisor αντί για JIT. Βελτιώνει σημαντικά την απόδοση όταν διατίθεται, αλλά μπορεί να είναι ασταθής στην τρέχουσα κατάστασή του.", + "en_US": "Use Hypervisor instead of JIT. Greatly improves performance when available, but can be unstable in its current state.", + "es_ES": "Usar Hypervisor en lugar de JIT. Mejora enormemente el rendimiento cuando está disponible, pero puede ser inestable en su estado actual.", + "fr_FR": "Utiliser l'Hyperviseur au lieu du JIT. Améliore considérablement les performances lorsque disponible, mais peut être instable dans son état actuel.", + "he_IL": "השתמש ב- Hypervisor במקום JIT. משפר מאוד ביצועים כשניתן, אבל יכול להיות לא יציב במצבו הנוכחי.", + "it_IT": "Usa Hypervisor invece di JIT. Migliora notevolmente le prestazioni quando disponibile, ma può essere instabile nel suo stato attuale.", + "ja_JP": "JIT の代わりにハイパーバイザーを使用します. 利用可能な場合, パフォーマンスが大幅に向上しますが, 現在の状態では不安定になる可能性があります.", + "ko_KR": "JIT 대신 Hypervisor를 사용하세요. 사용 가능한 경우 성능이 크게 향상되지만 현재 상태에서는 불안정할 수 있습니다.", + "no_NO": "Bruk Hypervisor i stedet for JIT. Det øker ytelsen mye hvis det er tilgjengelig, men det kan være ustabilt i den nåværende tilstanden.", + "pl_PL": "Użyj Hiperwizora zamiast JIT. Znacznie poprawia wydajność, gdy jest dostępny, ale może być niestabilny w swoim obecnym stanie ", + "pt_BR": "Usa o Hypervisor em vez de JIT (recompilador dinâmico). Melhora significativamente o desempenho quando disponível, mas pode ser instável no seu estado atual.", + "ru_RU": "Использует Hypervisor вместо JIT. Значительно увеличивает производительность, но может работать нестабильно.", + "sv_SE": "Använd hypervisor istället för JIT. Förbättrar prestandan avsevärt när den finns tillgänglig men kan ge ostabilitet i dess aktuella tillstånd.", + "th_TH": "ใช้ Hypervisor แทน JIT ปรับปรุงประสิทธิภาพอย่างมากเมื่อพร้อมใช้งาน แต่อาจไม่เสถียรในสถานะปัจจุบัน", + "tr_TR": "JIT yerine Hypervisor kullan. Uygun durumlarda performansı büyük oranda arttırır. Ancak şu anki halinde stabil durumda çalışmayabilir.", + "uk_UA": "Використання гіпервізор замість JIT. Значно покращує продуктивність, коли доступний, але може бути нестабільним у поточному стані.", + "zh_CN": "使用 Hypervisor 虚拟机代替即时编译,在可用的情况下能大幅提高性能,但目前可能还不稳定。", + "zh_TW": "使用 Hypervisor 取代 JIT。使用時可大幅提高效能,但在目前狀態下可能不穩定。" + } + }, + { + "ID": "DRamTooltip", + "Translations": { + "ar_SA": "يستخدم تخطيط وضع الذاكرة البديل لتقليد نموذج سويتش المطورين.\n\nيعد هذا مفيدا فقط لحزم النسيج عالية الدقة أو تعديلات دقة 4K. لا يحسن الأداء.\n\nاتركه معطلا إذا لم تكن متأكدا.", + "de_DE": "Erhöht den Arbeitsspeicher des emulierten Systems von 4 GiB auf 6 GiB.\n\nDies ist nur für Texturenpakete mit höherer Auflösung oder Mods mit 4K-Auflösung nützlich. Diese Option verbessert NICHT die Leistung.\n\nIm Zweifelsfall AUS lassen.", + "el_GR": "Επεκτείνει την ποσότητα της μνήμης στο εξομοιούμενο σύστημα από 4 GiB σε 6 GiB", + "en_US": "Utilizes an alternative memory mode with 8GiB of DRAM to mimic a Switch development model.\n\nThis is only useful for higher-resolution texture packs or 4k resolution mods. Does NOT improve performance.\n\nLeave OFF if unsure.", + "es_ES": "Expande la memoria DRAM del sistema emulado de 4GiB a 6GiB.\n\nUtilizar solo con packs de texturas HD o mods de resolución 4K. NO mejora el rendimiento.\n\nDesactívalo si no sabes qué hacer.", + "fr_FR": "Utilise un mode mémoire alternatif avec 4, 6, 8 ou 12GiO de DRAM pour simuler un modèle de développement Switch.\n\nUtile uniquement pour les packs de textures haute résolution ou les mods en 4K.\nN’améliore PAS les performances.\n\nLaissez à 4GiO si vous n’êtes pas sûr.", + "he_IL": "מנצל תצורת מצב-זיכרון חלופית לחכות את מכשיר הפיתוח של הסוויץ'.\n\nזה שימושי להחלפת חבילות מרקמים באיכותיים יותר או כאלו ברזולוציית 4k. לא משפר ביצועים.\n\nמוטב להשאיר כבוי אם לא בטוחים.", + "it_IT": "Utilizza un layout di memoria alternativo per imitare un'unità di sviluppo di Switch.\n\nQuesta opzione è utile soltanto per i pacchetti di texture ad alta risoluzione o per le mod che aumentano la risoluzione a 4K. NON migliora le prestazioni.\n\nNel dubbio, lascia l'opzione disattivata.", + "ja_JP": "エミュレートされたシステムのメモリ容量を 4GiB から 6GiB に増加します.\n\n高解像度のテクスチャパックや 4K解像度の mod を使用する場合に有用です. パフォーマンスを改善するものではありません.\n\nよくわからない場合はオフのままにしてください.", + "ko_KR": "Switch 개발 모델을 모방하기 위해 8GB DRAM이 포함된 대체 메모리 모드를 활용합니다.\n\n이는 고해상도 텍스처 팩 또는 4K 해상도 모드에만 유용합니다. 성능을 개선하지 않습니다.\n\n모르면 체크 해제 상태로 두세요.", + "no_NO": "Bruker en alternativ minnemodus med 8GiB i DRAM for og etterligne Switch utvikler modeller.\n\nDette er bare nyttig for teksturpakker eller 4k oppløsningsmoduler. Forbedrer IKKE ytelsen.\n\nLa AV hvis usikker.", + "pl_PL": "Wykorzystuje alternatywny układ MemoryMode, aby naśladować model rozwojowy Switcha.\n\nJest to przydatne tylko w przypadku pakietów tekstur o wyższej rozdzielczości lub modów w rozdzielczości 4k. NIE poprawia wydajności.\n\nW razie wątpliwości pozostaw WYŁĄCZONE.", + "pt_BR": "Utiliza um modo de memória alternativo com 6, 8 ou 12 GB de DRAM para imitar um modelo de desenvolvimento do Switch.\n\nIsso só é útil para pacotes de textura de alta resolução ou mods de resolução 4k. NÃO melhora o desempenho.\n\nDeixe em 4 GB se não tiver certeza.", + "ru_RU": "Использует альтернативный макет MemoryMode для имитации использования Nintendo Switch в режиме разработчика.\n\nПолезно только для пакетов текстур с высоким разрешением или модов добавляющих разрешение 4К. Не улучшает производительность.\n\nРекомендуется оставить выключенным.", + "sv_SE": "Använder ett alternativt minnesläge med 8GiB av DRAM för att efterlikna en utvecklingsmodell av Switch.\n\nDetta är endast användbart för texturpaket med högre upplösning eller moddar för 4k-upplösning. Det förbättrar INTE prestandan.\n\nLämna AV om du är osäker.", + "th_TH": "ใช้รูปแบบ MemoryMode ทางเลือกเพื่อเลียนแบบโมเดลการพัฒนาสวิตช์\n\nสิ่งนี้มีประโยชน์สำหรับแพ็กพื้นผิวที่มีความละเอียดสูงกว่าหรือม็อดที่มีความละเอียด 4k เท่านั้น\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ", + "tr_TR": "Emüle edilen sistem hafızasını 4GiB'dan 6GiB'a yükseltir.\n\nBu seçenek yalnızca yüksek çözünürlük doku paketleri veya 4k çözünürlük modları için kullanılır. Performansı artırMAZ!\n\nEmin değilseniz devre dışı bırakın.", + "uk_UA": "Використовує альтернативний макет MemoryMode для імітації моделі розробки Switch.\n\nЦе корисно лише для пакетів текстур з вищою роздільною здатністю або модифікацій із роздільною здатністю 4K. НЕ покращує продуктивність.\n\nЗалиште вимкненим, якщо не впевнені.", + "zh_CN": "模拟 Switch 开发机的内存布局。\n\n不会提高性能,某些高清纹理包或 4k 分辨率 MOD 可能需要使用此选项。\n\n如果不确定,请保持关闭状态。", + "zh_TW": "利用另一種 MemoryMode 配置來模仿 Switch 開發模式。\n\n這僅對高解析度紋理套件或 4K 解析度模組有用。不會提高效能。\n\n如果不確定,請設定為 4GiB。" + } + }, + { + "ID": "IgnoreMissingServicesTooltip", + "Translations": { + "ar_SA": "يتجاهل خدمات نظام هوريزون غير المنفذة. قد يساعد هذا في تجاوز الأعطال عند تشغيل ألعاب معينة.\n\nاتركه معطلا إذا كنت غير متأكد.", + "de_DE": "Durch diese Option werden nicht implementierte Dienste der Switch-Firmware ignoriert. Dies kann dabei helfen, Abstürze beim Starten bestimmter Spiele zu umgehen.\n\nIm Zweifelsfall AUS lassen.", + "el_GR": "Ενεργοποίηση ή απενεργοποίηση της αγνοώησης για υπηρεσίες που λείπουν", + "en_US": "Ignores unimplemented Horizon OS services. This may help in bypassing crashes when booting certain games.\n\nLeave OFF if unsure.", + "es_ES": "Hack para ignorar servicios no implementados del Horizon OS. Esto puede ayudar a sobrepasar crasheos cuando inicies ciertos juegos.\n\nDesactívalo si no sabes qué hacer.", + "fr_FR": "Ignore les services Horizon OS non implémentés. Cela peut aider à éviter les plantages au démarrage de certains jeux.\n\nLaissez DÉSACTIVÉ si vous n’êtes pas sûr.", + "he_IL": "מתעלם מפעולות שלא קיבלו מימוש במערכת ההפעלה Horizon OS. זה עלול לעזור לעקוף קריסות של היישום במשחקים מסויימים.\n\nמוטב להשאיר כבוי אם לא בטוחים.", + "it_IT": "Ignora i servizi non implementati del sistema operativo Horizon. Può aiutare ad aggirare gli arresti anomali che si verificano avviando alcuni giochi.\n\nNel dubbio, lascia l'opzione disattivata.", + "ja_JP": "未実装の Horizon OS サービスを無視します. 特定のゲームにおいて起動時のクラッシュを回避できる場合があります.\n\nよくわからない場合はオフのままにしてください.", + "ko_KR": "구현되지 않은 Horizon OS 서비스는 무시됩니다. 특정 게임을 부팅할 때, 발생하는 충돌을 우회하는 데 도움이 될 수 있습니다.\n\n모르면 체크 해제 상태로 두세요.", + "no_NO": "Ignorerer ikke implementerte Horisont OS-tjenester. Dette kan hjelpe med å omgå krasj ved oppstart av enkelte spill.\n\nLa AV hvis du er usikker.", + "pl_PL": "Ignoruje niezaimplementowane usługi Horizon OS. Może to pomóc w ominięciu awarii podczas uruchamiania niektórych gier.\n\nW razie wątpliwości pozostaw WYŁĄCZONE.", + "pt_BR": "Ignora serviços não implementados do Horizon OS. Isso pode ajudar a contornar travamentos ao inicializar certos jogos.\n\nDeixe OFF se não tiver certeza.", + "ru_RU": "Игнорирует нереализованные сервисы Horizon в новых прошивках. Эта настройка поможет избежать вылеты при запуске определенных игр.\n\nРекомендуется оставить выключенным.", + "sv_SE": "Ignorerar Horizon OS-tjänster som inte har implementerats. Detta kan avhjälpa krascher när vissa spel startar upp.\n\nLämna AV om du är osäker.", + "th_TH": "ละเว้นบริการ Horizon OS ที่ยังไม่ได้ใช้งาน วิธีนี้อาจช่วยในการหลีกเลี่ยงข้อผิดพลาดเมื่อบูตเกมบางเกม\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ", + "tr_TR": "Henüz programlanmamış Horizon işletim sistemi servislerini görmezden gelir. Bu seçenek belirli oyunların açılırken çökmesinin önüne geçmeye yardımcı olabilir.\n\nEmin değilseniz devre dışı bırakın.", + "uk_UA": "Ігнорує нереалізовані служби Horizon OS. Це може допомогти в обході збоїв під час завантаження певних ігор.\n\nЗалиште вимкненим якщо не впевнені.", + "zh_CN": "开启后,游戏会忽略未实现的系统服务,从而继续运行。\n少部分新发布的游戏由于使用了新的未知系统服务,可能需要此选项来避免闪退。\n模拟器更新完善系统服务之后,则无需开启此选项。\n\n如果不确定,请保持关闭状态。", + "zh_TW": "忽略未實現的 Horizon OS 服務。這可能有助於在啟動某些遊戲時避免崩潰。\n\n如果不確定,請保持關閉狀態。" + } + }, + { + "ID": "IgnoreControllerAppletTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "The Controller Applet dialog will not appear if the gamepad is disconnected while an application is running.\n\nLeave OFF if unsure.", + "es_ES": "", + "fr_FR": "La fenêtre de l’applet manette ne s’affichera pas si la manette est déconnectée pendant l’exécution d’une application\n\nLaissez DÉSACTIVÉ si vous n’êtes pas sûr.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "앱이 실행 중일 때, 게임패드의 연결이 끊어지면 컨트롤러 애플릿 대화 상자가 나타나지 않습니다.\n\n모르시면 체크 해제 상태로 두십시오.", + "no_NO": "Håndkontroller-appleten vises ikke hvis gamepaden kobles fra mens et program kjører.", + "pl_PL": "", + "pt_BR": "A caixa de diálogo do Applet do controlador não aparecerá se o controle for desconectado enquanto um aplicativo estiver em execução.\n\nDeixe a opção DESLIGADO se não tiver certeza.", + "ru_RU": "Диалоговое окно апплета контроллера не будет отображаться, если геймпад отключен во время работы приложения.\n\nОставьте выключенным, если не уверены.", + "sv_SE": "Handkontroller-appleten kommer inte att visas om gamepaden är frånkopplad under tiden en applikation körs.\n\nLämna AV om du är osäker.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Діалогове вікно Аплету Контролера не з'явиться, якщо геймпад було відключено під час роботи програми.\n\nЗалиште вимкненим якщо не впевнені.", + "zh_CN": "在应用程序运行时如果游戏手柄断开连接则不会显示控制器小程序对话框。\n\n如果不确定,请保持关闭状态。", + "zh_TW": "在模擬應用程式時如果遊戲手柄中斷連線則不會顯示控制器小程式。\n\n如果不確定,請保持關閉狀態。" + } + }, + { + "ID": "SkipUserProfilesTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Diese Option überspringt den Dialog 'Benutzerprofile verwalten' während des Spiels und verwendet ein voreingestelltes Profil.\n\nDie Profilumschaltung finden Sie unter 'Einstellungen' - 'Benutzerprofile verwalten'. Wählen Sie das gewünschte Profil aus, bevor Sie das Spiel laden.", + "el_GR": "Αυτή η επιλογή παρακάμπτει το παράθυρο διαλόγου 'Διαχειριστής Προφίλ Χρήστη' κατά τη διάρκεια του παιχνιδιού, χρησιμοποιώντας ένα προεπιλεγμένο προφίλ.\n\nΗ εναλλαγή προφίλ βρίσκεται στις 'Ρυθμίσεις' - 'Διαχειριστής Προφίλ Χρήστη'. Επιλέξτε το επιθυμητό προφίλ πριν φορτώσετε το παιχνίδι.", + "en_US": "This option skips the 'Manage User Profiles' dialog during gameplay, using a pre-selected profile.\n\nProfile switching is found in 'Settings' - 'Manager User Profiles'. Select the desired profile before loading the game.", + "es_ES": "Esta opción omite el diálogo de 'Gestionar perfiles de usuario' durante el juego, utilizando un perfil preseleccionado.\n\nEl cambio de perfil se encuentra en 'Configuración' - 'Gestionar perfiles de usuario'. Seleccione el perfil deseado antes de cargar el juego.", + "fr_FR": "Cette option permet d'éviter le dialogue du 'Gérer les profils d'utilisateurs' pendant le jeu, en utilisant un profil pré-sélectionné.\n\nLa sélection du profil se trouve dans 'Paramètres' - 'Gérer les profils d'utilisateurs'. Sélectionnez le profil souhaité avant de lancer le jeu.", + "he_IL": "", + "it_IT": "Questa opzione salta la finestra di dialogo 'Gestisci i profili utente' durante il gioco, utilizzando un profilo pre-selezionato.\n\nIl cambio del profilo si trova in 'Impostazioni' - 'Gestisci i profili utente'. Seleziona il profilo desiderato prima di caricare il gioco.", + "ja_JP": "このオプションは、ゲームプレイ中に「ユーザプロファイルを管理」ダイアログをスキップし、事前に選択されたプロファイルを使用します。\n\nプロファイルの切り替えは、「設定」-「ユーザプロファイルを管理」で見つけることができます。ゲームのロード前に目的のプロファイルをを選択してください。", + "ko_KR": "이 옵션은 게임 플레이 중 '사용자 프로필 관리' 대화 상자를 건너뛰고, 미리 선택된 프로필을 사용합니다.\n\n프로필 전환은 '설정' - '사용자 프로필 관리'에서 찾을 수 있습니다. 게임 로드 전에 원하는 프로필을 선택하세요.", + "no_NO": "Dette alternativet hopper over dialogen 'Administrere Brukerprofiler' under spilling, og bruker en forhåndsvalgt profil.\n\nProfilbytte finnes i 'Innstillinger' - 'Administrer Brukerprofiler'. Velg ønsket profil før du laster spillet.", + "pl_PL": "Ta opcja pomija okno dialogowe 'Zarządzaj profilami użytkowników' podczas gry, używając wcześniej wybrany profil.\n\nPrzełączanie profili można znaleźć w 'Ustawienia' - 'Zarządzaj Profilami Użytkowników'. Wybierz żądany profil przed załadowaniem gry.", + "pt_BR": "Esta opção ignora a caixa de diálogo 'Gerenciar Perfis de Usuário' durante o jogo, usando um perfil pré-selecionado.\n\nO gerenciamento de perfis pode ser encontrado em 'Configurações' - 'Gerenciar Perfis de Usuários'. Selecione o perfil desejado antes de carregar o jogo.", + "ru_RU": "Эта опция пропускает диалоговое окно 'Менеджер учётных записей' во время игры, используя предварительно выбранный профиль.\n\nПереключение профилей можно найти в 'Параметры' - 'Менеджер учётных записей'. Выберите желаемый профиль перед загрузкой игры.", + "sv_SE": "Det här alternativet hoppar över dialogrutan 'Hantera användarprofiler' under spelet och använder en förvald profil.\n\nProfilväxling finns i 'Inställningar' - 'Hantera användarprofiler'. Välj önskad profil innan du laddar spelet.", + "th_TH": "ตัวเลือกนี้จะข้ามหน้าต่าง 'จัดการโปรไฟล์ผู้ใช้งาน' ระหว่างเล่นเกม โดยใช้โปรไฟล์ที่เลือกไว้ล่วงหน้า\n\nการสลับโปรไฟล์สามารถพบได้ใน 'ตั้งค่า' - 'จัดการโปรไฟล์ผู้ใช้งาน' เลือกโปรไฟล์ที่คุณต้องการก่อนโหลดเกม", + "tr_TR": "Bu seçenek, oyun sırasında 'Kullanıcı Profillerini Yönet' iletişim kutusunu atlar ve önceden seçilmiş bir profil kullanır.\n\nProfil değiştirme 'Seçenekler' - 'Kullanıcı Profillerini Yönet' bölümünde bulunur. Oyunu yüklemeden önce istediğiniz profili seçin.", + "uk_UA": "Ця опція пропускає діалогове вікно 'Керувати профілями користувачів' під час гри, використовуючи попередньо вибраний профіль.\n\nПеремикання профілів можна знайти в 'Налаштування' - 'Керувати профілями користувачів'. Виберіть потрібний профіль перед завантаженням гри.", + "zh_CN": "此选项将跳过在游戏过程中出现的 “管理用户账户” 对话框,使用预选的账户。\n\n可以在“设置” - “管理用户账户”中找到账户切换。 在加载游戏之前选择所需的账户。", + "zh_TW": "這個選項跳過遊戲過程中的「管理使用者設定檔」對話框,使用預先選取的設定。\n\n可以在「設定」-「管理使用者設定檔」中找到設定檔切換。 在載入遊戲前選擇您需要的設定檔。" + } + }, + { + "ID": "GraphicsBackendThreadingTooltip", + "Translations": { + "ar_SA": "ينفذ أوامر الواجهة الخلفية للرسومات على مسار ثاني.\n\nيعمل على تسريع عملية تجميع المظللات وتقليل التقطيع وتحسين الأداء على برامج تشغيل وحدة الرسوميات دون دعم المسارات المتعددة الخاصة بهم. أداء أفضل قليلا على برامج التشغيل ذات المسارات المتعددة.\n\nاضبط على تلقائي إذا لم تكن متأكدا.", + "de_DE": "Führt Grafik-Backend Befehle auf einem zweiten Thread aus.\n\nDies beschleunigt die Shader-Kompilierung, reduziert Stottern und verbessert die Leistung auf GPU-Treibern ohne eigene Multithreading-Unterstützung. Geringfügig bessere Leistung bei Treibern mit Multithreading.\n\nIm Zweifelsfall auf AUTO stellen.", + "el_GR": "Ενεργοποίηση Πολυνηματικής Επεξεργασίας Γραφικών", + "en_US": "Executes graphics backend commands on a second thread.\n\nSpeeds up shader compilation, reduces stuttering, and improves performance on GPU drivers without multithreading support of their own. Slightly better performance on drivers with multithreading.\n\nSet to AUTO if unsure.", + "es_ES": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio procesamiento con múltiples hilos. Rendimiento ligeramente superior en controladores gráficos que soporten múltiples hilos.\n\nSelecciona \"Auto\" si no sabes qué hacer.", + "fr_FR": "Exécute des commandes du backend graphiques sur un second thread.\n\nAccélère la compilation des shaders, réduit les crashs et les lags, améliore les performances sur les pilotes GPU sans support natif du multithreading. Offre une légère amélioration des performances sur les pilotes multithreadés.\n\nRéglez sur AUTO si vous n’êtes pas sûr.", + "he_IL": "מריץ פקודות גראפיקה בתהליך שני נפרד.\n\nמאיץ עיבוד הצללות, מפחית תקיעות ומשפר ביצועים של דרייבר כרטיסי מסך אשר לא תומכים בהרצה רב-תהליכית.\n\nמוטב להשאיר על אוטומטי אם לא בטוחים.", + "it_IT": "Esegue i comandi del backend grafico su un secondo thread.\n\nVelocizza la compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver grafici senza il supporto integrato al multithreading. Migliora leggermente le prestazioni sui driver che supportano il multithreading.\n\nNel dubbio, imposta l'opzione su Automatico.", + "ja_JP": "グラフィックスバックエンドのコマンドを別スレッドで実行します.\n\nシェーダのコンパイルを高速化し, 遅延を軽減し, マルチスレッド非対応の GPU ドライバにおいてパフォーマンスを改善します. マルチスレッド対応のドライバでも若干パフォーマンス改善が見られます.\n\nよくわからない場合は自動に設定してください.", + "ko_KR": "2번째 스레드에서 그래픽 후단부 명령을 실행합니다.\n\n셰이더 컴파일 속도를 높이고, 끊김 현상을 줄이며, 자체 다중 스레딩 지원 없이 GPU 드라이버의 성능을 향상시킵니다. 다중 스레딩이 있는 드라이버에서 성능이 좀 더 좋습니다.\n\n모르면 자동으로 설정합니다.", + "no_NO": "Utfører grafikkbackend kommandoer på en annen tråd.\n\nØker hastigheten for shaderkomprimering, reduserer hakking og forbedrer ytelsen til GPU-drivere uten å spre støtten fra sine egne. Litt bedre ytelse på drivere med flertråd.\n\nSett for å AUTO hvis usikker.", + "pl_PL": "Wykonuje polecenia backend'u graficznego w drugim wątku.\n\nPrzyspiesza kompilację shaderów, zmniejsza zacinanie się i poprawia wydajność sterowników GPU bez własnej obsługi wielowątkowości. Nieco lepsza wydajność w sterownikach z wielowątkowością.\n\nUstaw na AUTO, jeśli nie masz pewności.", + "pt_BR": "Executa comandos do renderizador gráfico em um segundo thread.\n\nAcelera a compilação de shader, reduz a gagueira e melhora o desempenho em drivers de GPU sem suporte multithreading próprio. Desempenho ligeiramente melhor em drivers com multithreading.\n\nDefina como AUTO se não tiver certeza.", + "ru_RU": "Выполняет команды графического бэкенда на втором потоке.\n\nУскоряет компиляцию шейдеров, уменьшает статтеры и повышает производительность на драйверах видеоадаптера без поддержки многопоточности. Производительность на драйверах с многопоточностью немного выше.\n\nРекомендуется оставить Автоматически.", + "sv_SE": "Kör kommandon för grafikbakände i en andra tråd.\n\nSnabbar upp shader compilation, minskar stuttering och förbättrar prestandan på GPU-drivrutiner utan stöd för egen multithreading. Något bättre prestanda på drivrutiner med multithreading.\n\nStäll in till AUTO om du är osäker.", + "th_TH": "ดำเนินการคำสั่งแบ็กเอนด์กราฟิกบนเธรดที่สอง\n\nเร่งความเร็วการคอมไพล์ ลดการกระตุก และปรับปรุงประสิทธิภาพการทำงานของไดรเวอร์ GPU โดยไม่ต้องรองรับมัลติเธรดในตัว ประสิทธิภาพที่ดีขึ้นเล็กน้อยสำหรับไดรเวอร์ที่มีมัลติเธรด\n\nตั้งเป็น อัตโนมัติ หากคุณไม่แน่ใจ", + "tr_TR": "Grafik arka uç komutlarını ikinci bir iş parçacığında işletir.\n\nKendi multithreading desteği olmayan sürücülerde shader derlemeyi hızlandırıp performansı artırır. Multithreading desteği olan sürücülerde çok az daha iyi performans sağlar.\n\nEmin değilseniz Otomatik seçeneğine ayarlayın.", + "uk_UA": "Виконує команди графічного сервера в другому потоці.\n\nПрискорює компіляцію шейдерів, зменшує затримки та покращує продуктивність драйверів GPU без власної підтримки багатопоточності. Трохи краща продуктивність на драйверах з багатопотоковістю.\nВстановіть значення «Авто» якщо не впевнені", + "zh_CN": "在第二个线程上执行图形引擎指令。\n\n可以加速着色器编译,减少卡顿,提高 GPU 的性能。\n\n如果不确定,请设置为“自动”。", + "zh_TW": "在第二個執行緒上執行圖形後端指令。\n\n在本身不支援多執行緒的 GPU 驅動程式上,可加快著色器編譯、減少卡頓並提高效能。在支援多執行緒的驅動程式上效能略有提升。\n\n如果不確定,請設定為自動。" + } + }, + { + "ID": "GalThreadingTooltip", + "Translations": { + "ar_SA": "ينفذ أوامر الواجهة الخلفية للرسومات على مسار ثاني.\n\nيعمل على تسريع عملية تجميع المظللات وتقليل التقطيع وتحسين الأداء على برامج تشغيل وحدة الرسوميات دون دعم المسارات المتعددة الخاصة بهم. أداء أفضل قليلا على برامج التشغيل ذات المسارات المتعددة.\n\nاضبط على تلقائي إذا لم تكن متأكدا.", + "de_DE": "Führt Grafik-Backend Befehle auf einem zweiten Thread aus.\n\nDies Beschleunigt die Shader-Kompilierung, reduziert Stottern und verbessert die Leistung auf GPU-Treibern ohne eigene Multithreading-Unterstützung. Geringfügig bessere Leistung bei Treibern mit Multithreading.\n\nIm Zweifelsfall auf auf AUTO stellen.", + "el_GR": "Εκτελεί εντολές γραφικών σε ένα δεύτερο νήμα. Επιτρέπει την πολυνηματική μεταγλώττιση Shader σε χρόνο εκτέλεσης, μειώνει το τρεμόπαιγμα και βελτιώνει την απόδοση των προγραμμάτων οδήγησης χωρίς τη δική τους υποστήριξη πολλαπλών νημάτων. Ποικίλες κορυφαίες επιδόσεις σε προγράμματα οδήγησης με multithreading. Μπορεί να χρειαστεί επανεκκίνηση του Ryujinx για να απενεργοποιήσετε σωστά την ενσωματωμένη λειτουργία πολλαπλών νημάτων του προγράμματος οδήγησης ή ίσως χρειαστεί να το κάνετε χειροκίνητα για να έχετε την καλύτερη απόδοση.", + "en_US": "Executes graphics backend commands on a second thread.\n\nSpeeds up shader compilation, reduces stuttering, and improves performance on GPU drivers without multithreading support of their own. Slightly better performance on drivers with multithreading.\n\nSet to AUTO if unsure.", + "es_ES": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio procesamiento con múltiples hilos. Rendimiento ligeramente superior en controladores gráficos que soporten múltiples hilos.\n\nSelecciona \"Auto\" si no sabes qué hacer.", + "fr_FR": "Exécute des commandes du backend graphiques sur un second thread.\n\nAccélère la compilation des shaders, réduit les crashs et les lags, améliore les performances sur les pilotes GPU sans support natif du multithreading. Offre une légère amélioration des performances sur les pilotes multithreadés.\n\nRéglez sur AUTO si vous n’êtes pas sûr.", + "he_IL": "מריץ פקודות גראפיקה בתהליך שני נפרד.\n\nמאיץ עיבוד הצללות, מפחית תקיעות ומשפר ביצועים של דרייבר כרטיסי מסך אשר לא תומכים בהרצה רב-תהליכית.\n\nמוטב להשאיר על אוטומטי אם לא בטוחים.", + "it_IT": "Esegue i comandi del backend grafico su un secondo thread.\n\nVelocizza la compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver grafici senza il supporto integrato al multithreading. Migliora leggermente le prestazioni sui driver che supportano il multithreading.\n\nNel dubbio, imposta l'opzione su Automatico.", + "ja_JP": "グラフィックスバックエンドのコマンドを別スレッドで実行します.\n\nシェーダのコンパイルを高速化し, 遅延を軽減し, マルチスレッド非対応の GPU ドライバにおいてパフォーマンスを改善します. マルチスレッド対応のドライバでも若干パフォーマンス改善が見られます.\n\nよくわからない場合は自動に設定してください.", + "ko_KR": "2번째 스레드에서 그래픽 후단부 명령을 실행합니다.\n\n셰이더 컴파일 속도를 높이고 끊김 현상을 줄이며 자체 다중 스레딩 지원 없이 GPU 드라이버의 성능을 향상시킵니다. 다중 스레딩이 있는 드라이버에서 성능이 좀 더 좋습니다.\n\n모르면 자동으로 설정합니다.", + "no_NO": "Utfører grafikkbackend kommandoer på en annen tråd.\n\nØker hastigheten for shaderkomprimering, reduserer hakking og forbedrer ytelsen til GPU-drivere uten flertråd støtte. Litt bedre ytelse på drivere med flertråd.\n\nSett for å AUTO hvis usikker.", + "pl_PL": "Wykonuje polecenia backend'u graficznego w drugim wątku.\n\nPrzyspiesza kompilację shaderów, zmniejsza zacinanie się i poprawia wydajność sterowników GPU bez własnej obsługi wielowątkowości. Nieco lepsza wydajność w sterownikach z wielowątkowością.\n\nUstaw na AUTO, jeśli nie masz pewności.", + "pt_BR": "Executa comandos do renderizador gráfico em um segundo thread.\n\nAcelera a compilação de shader, reduz a gagueira e melhora o desempenho em drivers de GPU sem suporte multithreading próprio. Desempenho ligeiramente melhor em drivers com multithreading.\n\nDefina como AUTO se não tiver certeza.", + "ru_RU": "Выполняет команды графического бэкенда на втором потоке.\n\nУскоряет компиляцию шейдеров, уменьшает статтеры и повышает производительность на драйверах видеоадаптера без поддержки многопоточности. Производительность на драйверах с многопоточностью немного выше.\n\nРекомендуется оставить Автоматически.", + "sv_SE": "Kör kommandon för grafikbakände i en andra tråd.\n\nSnabbar upp shader compilation, minskar stuttering och förbättrar prestandan på GPU-drivrutiner utan stöd för egen multithreading. Något bättre prestanda på drivrutiner med multithreading.\n\nStäll in till AUTO om du är osäker.", + "th_TH": "ดำเนินการคำสั่งแบ็กเอนด์กราฟิกบนเธรดที่สอง\n\nเร่งความเร็วการคอมไพล์เชเดอร์ ลดการกระตุก และปรับปรุงประสิทธิภาพการทำงานของไดรเวอร์ GPU โดยไม่ต้องรองรับมัลติเธรดในตัว ประสิทธิภาพที่ดีขึ้นเล็กน้อยสำหรับไดรเวอร์ที่มีมัลติเธรด\n\nตั้งเป็น อัตโนมัติ หากคุณไม่แน่ใจ", + "tr_TR": "Grafik arka uç komutlarını ikinci bir iş parçacığında işletir.\n\nKendi multithreading desteği olmayan sürücülerde shader derlemeyi hızlandırıp performansı artırır. Multithreading desteği olan sürücülerde çok az daha iyi performans sağlar.\n\nEmin değilseniz Otomatik seçeneğine ayarlayın.", + "uk_UA": "Виконує команди графічного сервера в другому потоці.\n\nПрискорює компіляцію шейдерів, зменшує затримки та покращує продуктивність драйверів GPU без власної підтримки багатопоточності. Трохи краща продуктивність на драйверах з багатопотоковістю.\n\nВстановіть значення «Авто» якщо не впевнені.", + "zh_CN": "在第二个线程上执行图形引擎指令。\n\n可以加速着色器编译,减少卡顿,提高 GPU 的性能。\n\n如果不确定,请设置为“自动”。", + "zh_TW": "在第二個執行緒上執行圖形後端指令。\n\n在本身不支援多執行緒的 GPU 驅動程式上,可加快著色器編譯、減少卡頓並提高效能。在支援多執行緒的驅動程式上效能略有提升。\n\n如果不確定,請設定為自動。" + } + }, + { + "ID": "ShaderCacheToggleTooltip", + "Translations": { + "ar_SA": "يحفظ ذاكرة المظللات المؤقتة على القرص مما يقلل من التقطيع في عمليات التشغيل اللاحقة.\n\nاتركه مفعلا إذا لم تكن متأكدا.", + "de_DE": "Speichert einen persistenten Shader Cache, der das Stottern bei nachfolgenden Durchläufen reduziert.\n\nIm Zweifelsfall AN lassen.", + "el_GR": "Ενεργοποιεί ή απενεργοποιεί την Προσωρινή Μνήμη Shader", + "en_US": "Saves a disk shader cache which reduces stuttering in subsequent runs.\n\nLeave ON if unsure.", + "es_ES": "Guarda una caché de sombreadores en disco, la cual reduce los tirones a medida que vas jugando.\n\nActívalo si no sabes qué hacer.", + "fr_FR": "Sauvegarde un cache de shaders sur disque, ce qui réduit les saccades lors des exécutions suivantes.\n\nLaissez ACTIVÉ si vous n'êtes pas sûr.", + "he_IL": "שומר זכרון מטמון של הצללות, דבר שמפחית תקיעות בריצות מסוימות.\n\nמוטב להשאיר דלוק אם לא בטוחים.", + "it_IT": "Salva una cache degli shader su disco che riduce i fenomeni di stuttering nelle esecuzioni successive.\n\nNel dubbio, lascia l'opzione attiva.", + "ja_JP": "ディスクシェーダーキャッシュをセーブし,次回以降の実行時遅延を軽減します.\n\nよくわからない場合はオンのままにしてください.", + "ko_KR": "후속 실행 시 끊김 현상을 줄이는 디스크 셰이더 캐시를 저장합니다.\n\n모르면 체크 상태로 두세요.", + "no_NO": "Lagrer en disk shader cache som reduserer hakking jo flere ganger du spiller.\n\nLa være PÅ om usikker.", + "pl_PL": "Zapisuje pamięć podręczną shaderów na dysku, co zmniejsza zacinanie się w kolejnych uruchomieniach.\n\nPozostaw WŁĄCZONE, jeśli nie masz pewności.", + "pt_BR": "Salva um cache de shader no disco que reduz a trepidação em execuções subsequentes.\n\nDeixe LIGADO se não tiver certeza.", + "ru_RU": "Сохраняет кэш шейдеров на диске, для уменьшения статтеров при последующих запусках.\n\nРекомендуется оставить включенным.", + "sv_SE": "Sparar en disk shader cache som minskar stuttering i efterföljande körningar.\n\nLämna PÅ om du är osäker.", + "th_TH": "บันทึกแคชแสงเงาของดิสก์ซึ่งช่วยลดการกระตุกในการรันครั้งต่อๆ ไป\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", + "tr_TR": "Sonraki çalışmalarda takılmaları engelleyen bir gölgelendirici disk önbelleğine kaydeder.", + "uk_UA": "Зберігає кеш дискового шейдера, що зменшує затримки під час наступних запусків.\n\nЗалиште увімкненим якщо не впевнені.", + "zh_CN": "模拟器将已编译的着色器保存到硬盘,可以减少游戏再次渲染相同图形导致的卡顿。\n\n如果不确定,请保持开启状态。", + "zh_TW": "儲存磁碟著色器快取,減少後續執行時的卡頓。\n\n如果不確定,請保持開啟狀態。" + } + }, + { + "ID": "ResolutionScaleTooltip", + "Translations": { + "ar_SA": "يضاعف دقة عرض اللعبة.\n\nقد لا تعمل بعض الألعاب مع هذا وتبدو منقطة حتى عند زيادة الدقة؛ بالنسبة لهذه الألعاب، قد تحتاج إلى العثور على تعديلات تزيل تنعيم الحواف أو تزيد من دقة العرض الداخلي. لاستخدام الأخير، من المحتمل أن ترغب في تحديد أصلي.\n\nيمكن تغيير هذا الخيار أثناء تشغيل اللعبة بالنقر فوق \"تطبيق\" أدناه؛ يمكنك ببساطة تحريك نافذة الإعدادات جانبًا والتجربة حتى تجد المظهر المفضل للعبة.\n\nضع في اعتبارك أن 4x مبالغة في أي إعداد تقريبًا.", + "de_DE": "Multipliziert die Rendering-Auflösung des Spiels.\n\nEinige wenige Spiele funktionieren damit nicht und sehen auch bei höherer Auflösung pixelig aus; für diese Spiele müssen Sie möglicherweise Mods finden, die Anti-Aliasing entfernen oder die interne Rendering-Auflösung erhöhen. Für die Verwendung von Letzterem sollten Sie Native wählen.\n\nSie können diese Option ändern, während ein Spiel läuft, indem Sie unten auf \"Übernehmen\" klicken; Sie können das Einstellungsfenster einfach zur Seite schieben und experimentieren, bis Sie Ihr bevorzugtes Aussehen für ein Spiel gefunden haben.\n\nDenken Sie daran, dass 4x für praktisch jedes Setup Overkill ist.", + "el_GR": "", + "en_US": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.", + "es_ES": "Multiplica la resolución de rendereo del juego.\n\nAlgunos juegos podrían no funcionar con esto y verse pixelado al aumentar la resolución; en esos casos, quizás sería necesario buscar mods que de anti-aliasing o que aumenten la resolución interna. Para usar este último, probablemente necesitarás seleccionar Nativa.\n\nEsta opción puede ser modificada mientras que un juego este corriendo haciendo click en \"Aplicar\" más abajo; simplemente puedes mover la ventana de configuración a un lado y experimentar hasta que encuentres tu estilo preferido para un juego.\n\nTener en cuenta que 4x es excesivo para prácticamente cualquier configuración.", + "fr_FR": "Multiplie la résolution de rendu du jeu.\n\nQuelques jeux peuvent ne pas fonctionner avec cette fonctionnalité et apparaître pixelisés même lorsque la résolution est augmentée ; pour ces jeux, vous devrez peut-être trouver des mods qui suppriment l'anti-aliasing ou qui augmentent leur résolution de rendu interne. Pour utiliser cette dernière option, vous voudrez probablement sélectionner \"Natif\".\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres sur le côté et expérimenter jusqu'à ce que vous trouviez l'apparence souhaitée pour un jeu.\n\nGardez à l'esprit que 4x est excessif pour pratiquement n'importe quelle configuration.", + "he_IL": "", + "it_IT": "Moltiplica la risoluzione di rendering del gioco.\n\nAlcuni giochi potrebbero non funzionare con questa opzione e sembrare pixelati anche quando la risoluzione è aumentata; per quei giochi, potrebbe essere necessario trovare mod che rimuovono l'anti-aliasing o che aumentano la risoluzione di rendering interna. Per quest'ultimo caso, probabilmente dovrai selezionare Nativo (1x).\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito.\n\nTieni presente che \"4x\" è eccessivo per praticamente qualsiasi configurazione.", + "ja_JP": "ゲームのレンダリング解像度倍率を設定します.\n\n解像度を上げてもピクセルのように見えるゲームもあります. そのようなゲームでは, アンチエイリアスを削除するか, 内部レンダリング解像度を上げる mod を見つける必要があるかもしれません. その場合, ようなゲームでは、ネイティブを選択してください.\n\nこのオプションはゲーム実行中に下の「適用」をクリックすることで変更できます. 設定ウィンドウを脇に移動して, ゲームが好みの表示になるよう試してみてください.\n\nどのような設定でも, \"4x\" はやり過ぎであることを覚えておいてください.", + "ko_KR": "게임의 렌더링 해상도를 배가시킵니다.\n\n일부 게임에서는 이 기능이 작동하지 않고 해상도가 높아져도 픽셀화되어 보일 수 있습니다. 해당 게임의 경우 앤티 앨리어싱을 제거하거나 내부 렌더링 해상도를 높이는 모드를 찾아야 할 수 있습니다. 후자를 사용하려면 기본을 선택하는 것이 좋습니다.\n\n이 옵션은 아래의 \"적용\"을 클릭하여 게임이 실행되는 동안 변경할 수 있습니다. 설정 창을 옆으로 옮기고 원하는 게임 모양을 찾을 때까지 실험해 보세요.\n\n4배는 거의 모든 설정에서 과하다는 점을 명심하세요.", + "no_NO": "Dobler spillets gjengivelse.\n\nNoen få spill fungerer kanskje ikke med dette aktivert og kan se veldig pikselert ut selv når gjengivelsen er økt; for de spillene, så kan det hende du må bruke modifikasjoner som fjerner anti-aliasing eller som øker den interne gjengivelsen. For og bruke sistnenvte, så vil du helst bruke \"Native\".\n\nHa til tanke at 4x er unødig for virituelt alle maskiner.", + "pl_PL": "", + "pt_BR": "Multiplica a resolução de renderização do jogo.\n\nAlguns jogos podem não funcionar bem com essa opção e apresentar uma aparência pixelada, mesmo com o aumento da resolução; para esses jogos, talvez seja necessário encontrar mods que removam o anti-aliasing ou aumentem a resolução de renderização interna. Ao usar a segunda opção, provavelmente desejará selecionar Nativa.\n\nEssa opção pode ser alterada enquanto um jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nLembre-se de que 4x é exagerado para praticamente qualquer configuração.", + "ru_RU": "Увеличивает разрешение рендера игры.\n\nНекоторые игры могут не работать с этой настройкой и выглядеть смазано даже когда разрешение увеличено. Для таких игр может потребоваться установка модов, которые убирают сглаживание или увеличивают разрешение рендеринга. \nДля использования последнего, вам нужно будет выбрать опцию «Нативное».\n\nЭта опция может быть изменена во время игры по нажатию кнопки «Применить» ниже. Вы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nИмейте в виду, что «4x» является излишеством.", + "sv_SE": "Multiplicerar spelets renderingsupplösning.\n\nNågra spel kanske inte fungerar med detta och ser pixelerade ut även när upplösningen ökas; för dessa spel så kan du behöva hitta moddar som tar bort anti-aliasing eller som ökar deras interna renderingsupplösning. För att använda det senare, kommer du sannolikt vilja välja Inbyggd.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nTänk på att 4x är overkill för praktiskt taget alla maskiner.", + "th_TH": "คูณความละเอียดการเรนเดอร์ของเกม\n\nเกมบางเกมอาจไม่สามารถใช้งานได้และดูเป็นพิกเซลแม้ว่าความละเอียดจะเพิ่มขึ้นก็ตาม สำหรับเกมเหล่านั้น คุณอาจต้องค้นหาม็อดที่ลบรอยหยักของภาพหรือเพิ่มความละเอียดในการเรนเดอร์ภายใน หากต้องการใช้อย่างหลัง คุณอาจต้องเลือก Native\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำมาใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nโปรดทราบว่า 4x นั้นเกินความจำเป็นสำหรับการตั้งค่าแทบทุกประเภท", + "tr_TR": "", + "uk_UA": "Множить роздільну здатність гри.\n\nДеякі ігри можуть не працювати з цією функцією, і виглядатимуть піксельними; для цих ігор треба знайти модифікації, що зупиняють згладжування або підвищують роздільну здатність. Для останніх модифікацій, вибирайте \"Native\".\n\nЦей параметр можна міняти коли гра запущена кліком на \"Застосувати\"; ви можете перемістити вікно налаштувань і поекспериментувати з видом гри.\n\nМайте на увазі, що 4x це занадто для будь-якого комп'ютера.", + "zh_CN": "将游戏的渲染分辨率乘以一个倍数。\n\n有些游戏可能不适用这项设置,而且即使提高了分辨率仍然看起来像素化;对于这些游戏,您可能需要找到移除抗锯齿或提高内部渲染分辨率的 MOD。当使用这些 MOD 时,建议设置为“原生”。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n请记住,对于几乎所有人而言,4倍分辨率都是过度的。", + "zh_TW": "使用倍數提升遊戲的繪製解析度。\n\n少數遊戲可能無法使用此功能,即使提高解析度也會顯得像素化;對於這些遊戲,您可能需要找到去除反鋸齒或提高內部繪製解析度的模組。對於後者,您可能需要選擇原生。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n請記住,4 倍幾乎對任何設定都是過度的。" + } + }, + { + "ID": "ResolutionScaleEntryTooltip", + "Translations": { + "ar_SA": "مقياس دقة النقطة العائمة، مثل 1.5. من المرجح أن تتسبب المقاييس غير المتكاملة في حدوث مشكلات أو تعطل.", + "de_DE": "Fließkomma Auflösungsskalierung, wie 1,5.\n Bei nicht ganzzahligen Werten ist die Wahrscheinlichkeit größer, dass Probleme entstehen, die auch zum Absturz führen können.", + "el_GR": "Κλίμακα ανάλυσης κινητής υποδιαστολής, όπως 1,5. Οι μη αναπόσπαστες τιμές είναι πιθανό να προκαλέσουν προβλήματα ή σφάλματα.", + "en_US": "Floating point resolution scale, such as 1.5. Non-integral scales are more likely to cause issues or crash.", + "es_ES": "Escalado de resolución de coma flotante, como por ejemplo 1,5. Los valores no íntegros pueden causar errores gráficos o crashes.", + "fr_FR": "Échelle de résolution à virgule, telle que : 1.5. Les échelles non intégrales sont plus susceptibles de causer des problèmes ou des crashs.", + "he_IL": "שיפור רזולוציית נקודה צפה, כגון 1.5. הוא שיפור לא אינטגרלי הנוטה לגרום יותר בעיות או להקריס.", + "it_IT": "Scala della risoluzione in virgola mobile, come 1,5. I valori non interi hanno maggiori probabilità di causare problemi o arresti anomali.", + "ja_JP": "1.5 のような整数でない倍率を指定すると,問題が発生したりクラッシュしたりする場合があります.", + "ko_KR": "부동 소수점 해상도 스케일(예: 1.5)입니다. 적분이 아닌 스케일은 문제나 충돌을 일으킬 가능성이 높습니다.", + "no_NO": "Det er mer sannsynlig at flytende punktoppløsning skalaer som 1.5. Ikke-integrerte skalaer forårsaker problemer eller krasj.", + "pl_PL": "Skala rozdzielczości zmiennoprzecinkowej, np. 1,5. Skale niecałkowite częściej powodują problemy lub awarie.", + "pt_BR": "Escala de resolução de ponto flutuante, como 1.5. Valores não inteiros tem probabilidade maior de causar problemas ou quebras.", + "ru_RU": "Масштабирование разрешения с плавающей запятой, например 1,5. Неинтегральное масштабирование с большой вероятностью вызовет сбои в работе.", + "sv_SE": "Skala för floating point resolution, såsom 1.5. Icke-heltalsskalor är mer benägna att orsaka problem eller krasch.", + "th_TH": "สเกลความละเอียดจุดทศนิยม เช่น 1.5 ไม่ใช่จำนวนเต็มของสเกล มีแนวโน้มที่จะก่อให้เกิดปัญหาหรือความผิดพลาดได้", + "tr_TR": "Küsüratlı çözünürlük ölçeği, 1.5 gibi. Küsüratlı ölçekler hata oluşturmaya ve çökmeye daha yatkındır.", + "uk_UA": "Масштаб роздільної здатності з плаваючою комою, наприклад 1,5. Не інтегральні масштаби, швидше за все, спричинять проблеми або збій.", + "zh_CN": "建议设置为整数倍,带小数的分辨率缩放倍数(例如1.5),非整数倍的缩放容易导致问题或闪退。", + "zh_TW": "浮點解析度刻度,如 1.5。非整數刻度更容易出現問題或崩潰。" + } + }, + { + "ID": "AnisotropyTooltip", + "Translations": { + "ar_SA": "مستوى تصفية. اضبط على تلقائي لاستخدام القيمة التي تطلبها اللعبة.", + "de_DE": "Stufe der Anisotropen Filterung. Auf Auto setzen, um den vom Spiel geforderten Wert zu verwenden.", + "el_GR": "", + "en_US": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.", + "es_ES": "Nivel de filtrado anisotrópico. Setear en Auto para utilizar el valor solicitado por el juego.", + "fr_FR": "Niveau de filtrage anisotrope. Réglez sur Auto pour utiliser la valeur demandée par le jeu.", + "he_IL": "", + "it_IT": "Livello del filtro anisotropico. Imposta su Automatico per usare il valore richiesto dal gioco.", + "ja_JP": "異方性フィルタリングのレベルです. ゲームが要求する値を使用する場合は「自動」を設定してください.", + "ko_KR": "이방성 필터링 수준입니다. 게임에서 요청한 값을 사용하려면 자동으로 설정하세요.", + "no_NO": "Nivå av Anisotropisk filtrering. Sett til Auto for å bruke verdien som kreves av spillet.", + "pl_PL": "", + "pt_BR": "Nível de Filtragem Anisotrópica. Defina como Automático para usar o valor solicitado pelo jogo.", + "ru_RU": "Уровень анизотропной фильтрации. \n\nУстановите значение Автоматически, чтобы использовать значение по умолчанию игры.", + "sv_SE": "Nivå av anisotropisk filtrering. Ställ in till Automatiskt för att använda det värde som begärts av spelet.", + "th_TH": "ระดับของ Anisotropic ตั้งค่าเป็นอัตโนมัติเพื่อใช้ค่าพื้นฐานของเกม", + "tr_TR": "", + "uk_UA": "Рівень анізотропної фільтрації. Встановіть «Авто», щоб використовувати значення яке вимагає гра.", + "zh_CN": "各向异性过滤等级,可以提高倾斜视角纹理的清晰度。\n当设置为“自动”时,使用游戏自身设定的等级。", + "zh_TW": "各向異性過濾等級。設定為自動可使用遊戲要求的值。" + } + }, + { + "ID": "AspectRatioTooltip", + "Translations": { + "ar_SA": "يتم تطبيق نسبة العرض إلى الارتفاع على نافذة العارض.\n\nقم بتغيير هذا فقط إذا كنت تستخدم تعديل نسبة العرض إلى الارتفاع للعبتك، وإلا سيتم تمديد الرسومات.\n\nاتركه16:9 إذا لم تكن متأكدا.", + "de_DE": "Seitenverhältnis, das auf das Renderer-Fenster angewendet wird.\n\nÄndern Sie dies nur, wenn Sie einen Seitenverhältnis-Mod für Ihr Spiel verwenden, da sonst die Grafik gestreckt wird.\n\nLassen Sie es auf 16:9, wenn Sie unsicher sind.", + "el_GR": "", + "en_US": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.", + "es_ES": "Relación de aspecto aplicada a la ventana del renderizador.\n\nSolamente modificar esto si estás utilizando un mod de relación de aspecto para su juego, en cualquier otro caso los gráficos se estirarán.\n\nDejar en 16:9 si no sabe que hacer.", + "fr_FR": "Format\u00A0d'affichage appliqué à la fenêtre du moteur de rendu.\n\nChangez cela uniquement si vous utilisez un mod changeant le format\u00A0d'affichage pour votre jeu, sinon les graphismes seront étirés.\n\nLaissez sur 16:9 si vous n'êtes pas sûr.", + "he_IL": "", + "it_IT": "Proporzioni dello schermo applicate alla finestra di renderizzazione.\n\nCambialo solo se stai usando una mod di proporzioni per il tuo gioco, altrimenti la grafica verrà allungata.\n\nLasciare il 16:9 se incerto.", + "ja_JP": "レンダリングウインドウに適用するアスペクト比です.\n\nゲームにアスペクト比を変更する mod を使用している場合のみ変更してください.\n\nわからない場合は16:9のままにしておいてください.\n", + "ko_KR": "렌더러 창에 적용되는 종횡비입니다.\n\n게임에 종횡비 모드를 사용하는 경우에만 이 설정을 변경하세요. 그렇지 않으면 그래픽이 늘어납니다.\n\n모르면 16:9로 두세요.", + "no_NO": "Sideforhold angitt til gjengitt vindu.\n\nBare bytt dette om du bruker en modifikasjon som forandrer Sideforholdet på spillet ditt, ellers vil grafikken bli strukket.\n\nLa være på 16:9 om usikker.", + "pl_PL": "", + "pt_BR": "Proporção de Tela aplicada à janela do renderizador.\n\nAltere isso apenas se estiver usando um mod de proporção para o seu jogo; caso contrário, os gráficos ficarão esticados.\n\nMantenha em 16:9 se estiver em dúvida.", + "ru_RU": "Соотношение сторон окна рендерера.\n\nИзмените эту настройку только если вы используете мод для соотношения сторон, иначе изображение будет растянуто.\n\nРекомендуется настройка 16:9.", + "sv_SE": "Bildförhållande att appliceras på renderarfönstret.\n\nÄndra endast detta om du använder en modd för bildförhållande till ditt spel, annars kommer grafiken att sträckas ut.\n\nLämna den till 16:9 om du är osäker.", + "th_TH": "อัตราส่วนภาพที่ใช้กับหน้าต่างตัวแสดงภาพ\n\nเปลี่ยนสิ่งนี้หากคุณใช้ตัวดัดแปลงอัตราส่วนกว้างยาวสำหรับเกมของคุณ ไม่เช่นนั้นกราฟิกจะถูกยืดออก\n\nทิ้งไว้ที่ 16:9 หากไม่แน่ใจ", + "tr_TR": "", + "uk_UA": "Співвідношення сторін застосовано до вікна рендера.\n\nМіняйте тільки, якщо використовуєте модифікацію співвідношення сторін для гри, інакше зображення буде розтягнутим.\n\nЗалиште на \"16:9\", якщо не впевнені.", + "zh_CN": "游戏渲染窗口的宽高比。\n\n只有当游戏使用了修改宽高比的 MOD 时才需要修改这个设置,否则图像会被拉伸。\n\n如果不确定,请保持为“16:9”。", + "zh_TW": "套用於繪製器視窗的長寬比。\n\n只有在遊戲中使用長寬比模組時才可變更,否則圖形會被拉伸。\n\n如果不確定,請保持 16:9 狀態。" + } + }, + { + "ID": "ShaderDumpPathTooltip", + "Translations": { + "ar_SA": "مسار تفريغ المظللات", + "de_DE": "Grafik-Shader-Dump-Pfad", + "el_GR": "Τοποθεσία Εναπόθεσης Προσωρινής Μνήμης Shaders", + "en_US": "Graphics Shaders Dump Path", + "es_ES": "Directorio en el cual se volcarán los sombreadores de los gráficos", + "fr_FR": "Chemin de sauvegarde des shaders graphiques", + "he_IL": "נתיב השלכת הצללות גראפיות", + "it_IT": "Percorso di dump degli shader", + "ja_JP": "グラフィックス シェーダー ダンプのパスです", + "ko_KR": "그래픽 셰이더 덤프 경로", + "no_NO": "Grafikk Shader Dump bane", + "pl_PL": "Ścieżka Zrzutu Shaderów Grafiki", + "pt_BR": "Diretório de Despejo de Shaders", + "ru_RU": "Путь с дампами графических шейдеров", + "sv_SE": "Sökväg för Graphics Shaders Dump", + "th_TH": "ที่เก็บ ดัมพ์ไฟล์เชเดอร์", + "tr_TR": "Grafik Shader Döküm Yolu", + "uk_UA": "Шлях до дампу графічних шейдерів", + "zh_CN": "转储图形着色器的路径", + "zh_TW": "圖形著色器傾印路徑" + } + }, + { + "ID": "FileLogTooltip", + "Translations": { + "ar_SA": "حفظ تسجيل وحدة التحكم إلى ملف سجل على القرص. لا يؤثر على الأداء.", + "de_DE": "Speichert die Konsolenausgabe in einer Log-Datei auf der Festplatte. Hat keinen Einfluss auf die Leistung.", + "el_GR": "Ενεργοποιεί ή απενεργοποιεί την καταγραφή σε ένα αρχείο στο δίσκο", + "en_US": "Saves console logging to a log file on disk. Does not affect performance.", + "es_ES": "Guarda los registros de la consola en archivos en disco. No afectan al rendimiento.", + "fr_FR": "Enregistre les journaux de la console dans un fichier sur le disque. N’affecte pas les performances.", + "he_IL": "שומר את רישומי שורת הפקודות לזיכרון, לא משפיע על ביצועי היישום.", + "it_IT": "Salva il log della console in un file su disco. Non influisce sulle prestazioni.", + "ja_JP": "コンソール出力されるログをディスク上のログファイルにセーブします. パフォーマンスには影響を与えません.", + "ko_KR": "디스크의 로그 파일에 콘솔 기록을 저장합니다. 성능에 영향을 주지 않습니다.", + "no_NO": "Lagrer konsoll-logging til en loggfil på harddisken. Påvirker ikke ytelsen.", + "pl_PL": "Zapisuje logowanie konsoli w pliku dziennika na dysku. Nie wpływa na wydajność.", + "pt_BR": "Salva o log do console em um arquivo de log no disco. Não afeta o desempenho.", + "ru_RU": "Включает ведение журнала в файл на диске. Не влияет на производительность.", + "sv_SE": "Sparar konsolloggning till en loggfil på disk. Påverkar inte prestandan.", + "th_TH": "บันทึกประวัติคอนโซลลงในไฟล์บันทึก จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", + "tr_TR": "Konsol loglarını diskte bir log dosyasına kaydeder. Performansı etkilemez.", + "uk_UA": "Зберігає консольне ведення журналу у файл на диску. Не впливає на продуктивність.", + "zh_CN": "将控制台日志保存到硬盘文件,不影响性能。", + "zh_TW": "將控制台日誌儲存到磁碟上的日誌檔案中。不會影響效能。" + } + }, + { + "ID": "StubLogTooltip", + "Translations": { + "ar_SA": "طباعة رسائل سجل stub في وحدة التحكم. لا يؤثر على الأداء.", + "de_DE": "Ausgabe von Stub-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.", + "el_GR": "Ενεργοποιεί την εκτύπωση μηνυμάτων καταγραφής ατελειών", + "en_US": "Prints stub log messages in the console. Does not affect performance.", + "es_ES": "Escribe mensajes de Stub en la consola. No afectan al rendimiento.", + "fr_FR": "Affiche dans la console les journaux stub. N’affecte pas les performances.", + "he_IL": "מדפיס רישומים כושלים לשורת הפקודות. לא משפיע על ביצועי היישום.", + "it_IT": "Stampa i messaggi di log relativi alle stub nella console. Non influisce sulle prestazioni.", + "ja_JP": "stub ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", + "ko_KR": "콘솔에 조각 기록 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", + "no_NO": "Skriver ut log meldinger i konsollen. Påvirker ikke ytelsen.", + "pl_PL": "Wyświetla w konsoli skrótowe komunikaty dziennika. Nie wpływa na wydajność.", + "pt_BR": "Imprime mensagens de log stub no console. Não afeta o desempenho.", + "ru_RU": "Включает ведение журнала-заглушки. Не влияет на производительность.", + "sv_SE": "Skriver ut stubbloggmeddelanden i konsollen. Påverkar inte prestandan.", + "th_TH": "พิมพ์ข้อความประวัติในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", + "tr_TR": "Stub log mesajlarını konsola yazdırır. Performansı etkilemez.", + "uk_UA": "Відображає повідомлення журналу-заглушки (tub log) в консолі. Не впливає на продуктивність.", + "zh_CN": "在控制台中显示存根日志,不影响性能。", + "zh_TW": "在控制台中輸出日誌訊息。不會影響效能。" + } + }, + { + "ID": "InfoLogTooltip", + "Translations": { + "ar_SA": "طباعة رسائل سجل المعلومات في وحدة التحكم. لا يؤثر على الأداء.", + "de_DE": "Ausgabe von Info-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.", + "el_GR": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής πληροφοριών", + "en_US": "Prints info log messages in the console. Does not affect performance.", + "es_ES": "Escribe mensajes de Info en la consola. No afectan al rendimiento.", + "fr_FR": "Affiche dans la console les journaux info. N’affecte pas les performances.", + "he_IL": "מדפיק רישומי מידע לשורת הפקודות. לא משפיע על ביצועי היישום.", + "it_IT": "Stampa i messaggi di log informativi nella console. Non influisce sulle prestazioni.", + "ja_JP": "info ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", + "ko_KR": "콘솔에 정보 기록 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", + "no_NO": "Skriver ut info loggmeldinger i konsollen. Påvirker ikke ytelse.", + "pl_PL": "Wyświetla komunikaty dziennika informacyjnego w konsoli. Nie wpływa na wydajność.", + "pt_BR": "Imprime mensagens de log de informações no console. Não afeta o desempenho.", + "ru_RU": "Включает вывод сообщений информационного журнала в консоль. Не влияет на производительность.", + "sv_SE": "Skriver ut informationsloggmeddelanden i konsollen. Påverkar inte prestandan.", + "th_TH": "พิมพ์ข้อความบันทึกข้อมูลในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", + "tr_TR": "Bilgi log mesajlarını konsola yazdırır. Performansı etkilemez.", + "uk_UA": "Виводить повідомлення журналу інформації (info log) в консоль. Не впливає на продуктивність.", + "zh_CN": "在控制台中显示信息日志,不影响性能。", + "zh_TW": "在控制台中輸出資訊日誌訊息。不會影響效能。" + } + }, + { + "ID": "WarnLogTooltip", + "Translations": { + "ar_SA": "طباعة رسائل سجل التحذير في وحدة التحكم. لا يؤثر على الأداء.", + "de_DE": "Ausgabe von Warn-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.", + "el_GR": "Ενεργοποιεί την εκτύπωση μηνυμάτων καταγραφής προειδοποιήσεων", + "en_US": "Prints warning log messages in the console. Does not affect performance.", + "es_ES": "Escribe mensajes de Advertencia en la consola. No afectan al rendimiento.", + "fr_FR": "Affiche dans la console les journaux d’avertissement. N’affecte pas les performances.", + "he_IL": "מדפיק רישומי הערות לשורת הפקודות. לא משפיע על ביצועי היישום.", + "it_IT": "Stampa i messaggi di log relativi agli avvisi nella console. Non influisce sulle prestazioni.", + "ja_JP": "warning ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", + "ko_KR": "콘솔에 경고 기록 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", + "no_NO": "Skriver ut varselloggmeldinger i konsollen. påvirker ikke ytelsen.", + "pl_PL": "Wyświetla komunikaty dziennika ostrzeżeń w konsoli. Nie wpływa na wydajność.", + "pt_BR": "Imprime mensagens de log de aviso no console. Não afeta o desempenho.", + "ru_RU": "Включает вывод сообщений журнала предупреждений в консоль. Не влияет на производительность.", + "sv_SE": "Skriver ut varningsloggmeddelanden i konsollen. Påverkar inte prestandan.", + "th_TH": "พิมพ์ข้อความประวัติการเตือนในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", + "tr_TR": "Uyarı log mesajlarını konsola yazdırır. Performansı etkilemez.", + "uk_UA": "Додає повідомлення журналу попереджень (warning log) до консолі. Не впливає на продуктивність.", + "zh_CN": "在控制台中显示警告日志,不影响性能。", + "zh_TW": "在控制台中輸出警告日誌訊息。不會影響效能。" + } + }, + { + "ID": "ErrorLogTooltip", + "Translations": { + "ar_SA": "طباعة رسائل سجل الأخطاء في وحدة التحكم. لا يؤثر على الأداء.", + "de_DE": "Ausgabe von Fehler-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.", + "el_GR": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής σφαλμάτων", + "en_US": "Prints error log messages in the console. Does not affect performance.", + "es_ES": "Escribe mensajes de Error en la consola. No afectan al rendimiento.", + "fr_FR": "Affiche dans la console les journaux d’erreur. N’affecte pas les performances.", + "he_IL": "מדפיס רישומי שגיאות לשורת הפקודות. לא משפיע על ביצועי היישום.", + "it_IT": "Stampa i messaggi di log relativi agli errori nella console. Non influisce sulle prestazioni.", + "ja_JP": "error ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", + "ko_KR": "콘솔에 오류 기록 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", + "no_NO": "Skriver ut feilloggmeldinger i konsollen. Påvirker ikke ytelse.", + "pl_PL": "Wyświetla w konsoli komunikaty dziennika błędów. Nie wpływa na wydajność.", + "pt_BR": "Imprime mensagens de log de erro no console. Não afeta o desempenho.", + "ru_RU": "Включает вывод сообщений журнала ошибок. Не влияет на производительность.", + "sv_SE": "Skriver ut felloggmeddelanden i konsollen. Påverkar inte prestandan.", + "th_TH": "พิมพ์ข้อความบันทึกข้อผิดพลาดในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", + "tr_TR": "Hata log mesajlarını konsola yazdırır. Performansı etkilemez.", + "uk_UA": "Додає повідомлення журналу помилок (error log) до консолі. Не впливає на продуктивність.", + "zh_CN": "在控制台中显示错误日志,不影响性能。", + "zh_TW": "在控制台中輸出錯誤日誌訊息。不會影響效能。" + } + }, + { + "ID": "TraceLogTooltip", + "Translations": { + "ar_SA": "طباعة رسائل سجل التتبع في وحدة التحكم. لا يؤثر على الأداء.", + "de_DE": "Ausgabe von Trace-Log in der Konsole. Hat keinen Einfluss auf die Leistung.", + "el_GR": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής ιχνών", + "en_US": "Prints trace log messages in the console. Does not affect performance.", + "es_ES": "Escribe mensajes de Rastro en la consola. No afectan al rendimiento.", + "fr_FR": "Affiche dans la console les journaux de trace. N’affecte pas les performances.", + "he_IL": "מדפיק רישומי זיכרון לשורת הפקודות. לא משפיע על ביצועי היישום.", + "it_IT": "Stampa i messaggi di log relativi al trace nella console. Non influisce sulle prestazioni.", + "ja_JP": "trace ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", + "ko_KR": "콘솔에 추적 기록 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", + "no_NO": "Skriver ut sporbare loggmeldinger i konsollen. påvirker ikke ytelsen.", + "pl_PL": "Wyświetla komunikaty dziennika śledzenia w konsoli. Nie wpływa na wydajność.", + "pt_BR": "Imprime mensagens de log de rastreamento no console. Não afeta o desempenho.", + "ru_RU": "Выводит сообщения журнала трассировки в консоли. Не влияет на производительность.", + "sv_SE": "Skriver ut spårloggmeddelanden i konsollen. Påverkar inte prestandan.", + "th_TH": "พิมพ์ข้อความประวัติการติดตามในคอนโซล ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", + "tr_TR": "Trace log mesajlarını konsola yazdırır. Performansı etkilemez.", + "uk_UA": "Додає повідомлення журналу трасування (trace log) до консолі. Не впливає на продуктивність.", + "zh_CN": "在控制台中显示跟踪日志。", + "zh_TW": "在控制台中輸出追蹤日誌訊息。不會影響效能。" + } + }, + { + "ID": "GuestLogTooltip", + "Translations": { + "ar_SA": "طباعة رسائل سجل الضيف في وحدة التحكم. لا يؤثر على الأداء.", + "de_DE": "Ausgabe von Gast-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.", + "el_GR": "Ενεργοποιεί την εκτύπωση μηνυμάτων καταγραφής επισκεπτών", + "en_US": "Prints guest log messages in the console. Does not affect performance.", + "es_ES": "Escribe mensajes de Guest en la consola. No afectan al rendimiento.", + "fr_FR": "Affiche dans la console les journaux du système invité. N’affecte pas les performances.", + "he_IL": "מדפיס רישומי אורח לשורת הפקודות. לא משפיע על ביצועי היישום.", + "it_IT": "Stampa i messaggi di log del guest nella console. Non influisce sulle prestazioni.", + "ja_JP": "guest ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", + "ko_KR": "콘솔에 게스트 로그 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", + "no_NO": "Skriver ut gjesteloggmeldinger i konsollen. påvirker ikke ytelsen.", + "pl_PL": "Wyświetla komunikaty dziennika gości w konsoli. Nie wpływa na wydajność.", + "pt_BR": "Imprime mensagens de log do convidado no console. Não afeta o desempenho.", + "ru_RU": "Включает вывод сообщений гостевого журнала. Не влияет на производительность.", + "sv_SE": "Skriver ut gästloggmeddelanden i konsollen. Påverkar inte prestandan.", + "th_TH": "พิมพ์ข้อความประวัติของผู้เยี่ยมชมในคอนโซล ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", + "tr_TR": "Guest log mesajlarını konsola yazdırır. Performansı etkilemez.", + "uk_UA": "Додає повідомлення журналу гостей (guest log) до консолі. Не впливає на продуктивність.", + "zh_CN": "在控制台中显示访客日志,不影响性能。", + "zh_TW": "在控制台中輸出客體日誌訊息。不會影響效能。" + } + }, + { + "ID": "FileAccessLogTooltip", + "Translations": { + "ar_SA": "طباعة رسائل سجل الوصول إلى الملفات في وحدة التحكم.", + "de_DE": "Ausgabe von FS-Zugriff-Logs in der Konsole.", + "el_GR": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής πρόσβασης", + "en_US": "Prints file access log messages in the console.", + "es_ES": "Activa mensajes de acceso a archivo en la consola", + "fr_FR": "Affiche dans la console les journaux d’accès aux fichiers.", + "he_IL": "מדפיס גישות לקבצי רישום לשורת הפקודות.", + "it_IT": "Stampa i messaggi di log relativi all'accesso ai file nella console.", + "ja_JP": "ファイルアクセスログメッセージをコンソールに出力します.", + "ko_KR": "콘솔에 파일 접속 기록 메시지를 출력합니다.", + "no_NO": "Skriver ut filtilgang til loggmeldinger i konsollen.", + "pl_PL": "Wyświetla w konsoli komunikaty dziennika dostępu do plików.", + "pt_BR": "Imprime mensagens de log de acesso a arquivos no console.", + "ru_RU": "Включает вывод сообщений журнала доступа к файлам.", + "sv_SE": "Skriver ut loggmeddelanden för filåtkomst i konsollen.", + "th_TH": "พิมพ์ข้อความบันทึกการเข้าถึงไฟล์ในคอนโซล", + "tr_TR": "Dosya sistemi erişim log mesajlarını konsola yazdırır.", + "uk_UA": "Виводить повідомлення журналу доступу (access log) до файлів в консоль.", + "zh_CN": "在控制台中显示文件访问日志。", + "zh_TW": "在控制台中輸出檔案存取日誌訊息。" + } + }, + { + "ID": "FSAccessLogModeTooltip", + "Translations": { + "ar_SA": "تمكين إخراج سجل الوصول إلى نظام الملفات إلى وحدة التحكم. الأوضاع الممكنة هي 0-3", + "de_DE": "Aktiviert die Ausgabe des FS-Zugriff-Logs in der Konsole. Mögliche Modi sind 0-3", + "el_GR": "Ενεργοποιεί την έξοδο καταγραφής πρόσβασης FS στην κονσόλα. Οι πιθανοί τρόποι λειτουργίας είναι 0-3", + "en_US": "Enables FS access log output to the console. Possible modes are 0-3", + "es_ES": "Activa registros FS Access en la consola. Los modos posibles son entre 0 y 3", + "fr_FR": "Active l’affichage des journaux d’accès FS dans la console. Les modes possibles sont de 0 à 3.", + "he_IL": "מאפשר גישה לרישומי FS ליציאת שורת הפקודות. האפשרויות הינן 0-3.", + "it_IT": "Attiva l'output dei log di accesso FS nella console. Le modalità possibili vanno da 0 a 3", + "ja_JP": "コンソールへのファイルシステムアクセスログ出力を有効にします.0-3 のモードが有効です", + "ko_KR": "콘솔에 파일 시스템 접속 기록 출력을 활성화합니다. 가능한 모드는 0-3", + "no_NO": "Aktiverer FS tilgang loggutgang til konsollen. Mulige moduser er 0-3", + "pl_PL": "Włącza wyjście dziennika dostępu FS do konsoli. Możliwe tryby to 0-3", + "pt_BR": "Habilita a saída do log de acesso FS para o console. Os modos possíveis são 0-3", + "ru_RU": "Включает вывод журнала доступа к файловой системе. Возможные режимы: 0-3", + "sv_SE": "Aktiverar loggutdata för filsystemsåtkomst i konsollen. Möjliga lägen är 0-3", + "th_TH": "เปิดใช้งาน เอาต์พุตประวัติการเข้าถึง FS ไปยังคอนโซล โหมดที่เป็นไปได้คือ 0-3", + "tr_TR": "Konsola FS erişim loglarının yazılmasını etkinleştirir. Kullanılabilir modlar 0-3'tür", + "uk_UA": "Увімкнути виведення журналу доступу (access log) до файлової системи в консоль. Можливі режими: 0-3", + "zh_CN": "在控制台中显示文件系统访问日志,可选模式为 0-3。", + "zh_TW": "啟用檔案系統存取日誌輸出到控制台中。可能的模式為 0 到 3" + } + }, + { + "ID": "DeveloperOptionTooltip", + "Translations": { + "ar_SA": "استخدمه بعناية", + "de_DE": "Mit Vorsicht verwenden", + "el_GR": "Χρησιμοποιήστε με προσοχή", + "en_US": "Use with care", + "es_ES": "Usar con cuidado", + "fr_FR": "À utiliser avec précaution", + "he_IL": "השתמש בזהירות", + "it_IT": "Usa con cautela", + "ja_JP": "使用上の注意", + "ko_KR": "주의해서 사용", + "no_NO": "Bruk med forsiktighet", + "pl_PL": "Używaj ostrożnie", + "pt_BR": "Use com cuidado", + "ru_RU": "Используйте с осторожностью", + "sv_SE": "Använd med försiktighet", + "th_TH": "โปรดใช้ด้วยความระมัดระวัง", + "tr_TR": "Dikkatli kullanın", + "uk_UA": "Використовувати обережно", + "zh_CN": "请谨慎使用", + "zh_TW": "謹慎使用" + } + }, + { + "ID": "AvaloniaLogTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Prints Avalonia (UI) log messages in the console.", + "es_ES": "", + "fr_FR": "Affiche les journaux Avalonia (UI) dans la console.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "콘솔에 Avalonia(UI) 로그 메시지를 출력합니다.", + "no_NO": "Skriver ut Avalonia (UI)-loggmeldinger i konsollen.", + "pl_PL": "", + "pt_BR": "Imprime mensagens de log do Avalonia (UI) no console.", + "ru_RU": "Выводит сообщения журнала Avalonia (интерфейс) в консоли.", + "sv_SE": "Skriver ut loggmeddelanden från Avalonia (användargränssnittet) i konsollen.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Виводити повідомлення журналу Avalonia (UI) в консоль", + "zh_CN": "在控制台显示 Avalonia (UI) 的日志信息", + "zh_TW": "在控制台中輸出 Avalonia (UI) 日誌訊息。" + } + }, + { + "ID": "OpenGlLogLevel", + "Translations": { + "ar_SA": "يتطلب تمكين مستويات السجل المناسبة", + "de_DE": "Erfordert die Aktivierung der entsprechenden Log-Level", + "el_GR": "Απαιτεί τα κατάλληλα επίπεδα καταγραφής ενεργοποιημένα", + "en_US": "Requires appropriate log levels enabled", + "es_ES": "Requiere activar los niveles de registro apropiados", + "fr_FR": "Nécessite l'activation des niveaux de journalisation appropriés", + "he_IL": "דורש הפעלת רמות רישום מתאימות", + "it_IT": "Richiede che i livelli di log appropriati siano abilitati", + "ja_JP": "適切なログレベルを有効にする必要があります", + "ko_KR": "적절한 기록 수준이 활성화되어 있어야 함", + "no_NO": "Krever riktige loggnivåer aktivert", + "pl_PL": "Wymaga włączonych odpowiednich poziomów logów", + "pt_BR": "Requer níveis de log apropriados habilitados", + "ru_RU": "Требует включения соответствующих уровней ведения журнала", + "sv_SE": "Kräver att lämpliga loggnivåer aktiveras", + "th_TH": "จำเป็นต้องเปิดใช้งานระดับบันทึกที่เหมาะสม", + "tr_TR": "Uygun log seviyesinin aktif olmasını gerektirir", + "uk_UA": "Потрібно увімкнути відповідні рівні журналу (log)", + "zh_CN": "需要启用适当的日志级别", + "zh_TW": "需要啟用適當的日誌等級" + } + }, + { + "ID": "DebugLogTooltip", + "Translations": { + "ar_SA": "طباعة رسائل سجل التصحيح في وحدة التحكم.\n\nاستخدم هذا فقط إذا طلب منك أحد الموظفين تحديدًا ذلك، لأنه سيجعل من الصعب قراءة السجلات وسيؤدي إلى تدهور أداء المحاكي.", + "de_DE": "Ausgabe von Debug-Logs in der Konsole.\n\nVerwende diese Option nur auf ausdrückliche Anweisung von Ryujinx Entwicklern, da sie das Lesen der Protokolle erschwert und die Leistung des Emulators verschlechtert.", + "el_GR": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής εντοπισμού σφαλμάτων", + "en_US": "Prints debug log messages in the console.\n\nOnly use this if specifically instructed by a staff member, as it will make logs difficult to read and worsen emulator performance.", + "es_ES": "Escribe mensajes de debug en la consola\n\nActiva esto solo si un miembro del equipo te lo pide expresamente, pues hará que el registro sea difícil de leer y empeorará el rendimiento del emulador.", + "fr_FR": "Affiche dans la console les journaux de débogage.\n\nN’utilisez cette option que si un membre du personnel vous l’a expressément demandé, car cela rendra les journaux difficiles à lire et dégradera les performances de l’émulateur.", + "he_IL": "מדפיס הודעות יומן ניפוי באגים בשורת הפקודות.", + "it_IT": "Stampa i messaggi di log per il debug nella console.\n\nUsa questa opzione solo se specificatamente richiesto da un membro del team, dal momento che rende i log difficili da leggere e riduce le prestazioni dell'emulatore.", + "ja_JP": "デバッグログメッセージをコンソールに出力します.\n\nログが読みづらくなり,エミュレータのパフォーマンスが低下するため,開発者から特別な指示がある場合のみ使用してください.", + "ko_KR": "콘솔에 디버그 기록 메시지를 출력합니다.\n\n담당자가 특별히 요청한 경우에만 이 기능을 사용하십시오. 로그를 읽기 어렵게 만들고 에뮬레이터 성능을 저하시킬 수 있기 때문입니다.", + "no_NO": "Skriver ut loggmeldinger i konsollen.\n\nBruk bare dette hvis et medlem har gitt spesifikke instruksjoner, siden det vil gjøre loggene vanskelig å lese og forverre emulatorytelse.", + "pl_PL": "Wyświetla komunikaty dziennika debugowania w konsoli.\n\nUżywaj tego tylko na wyraźne polecenie członka załogi, ponieważ utrudni to odczytanie dzienników i pogorszy wydajność emulatora.", + "pt_BR": "Imprime mensagens de log de depuração no console.\n\nUse isso somente se for especificamente instruído por um membro da equipe, pois isso tornará os logs difíceis de ler e piorará o desempenho do emulador.", + "ru_RU": "Выводит журнал сообщений отладки в консоли.\n\nИспользуйте только в случае просьбы разработчика, так как включение этой функции затруднит чтение журналов и ухудшит работу эмулятора.", + "sv_SE": "Skriver ut felsökningsloggmeddelanden i konsolen.\n\nAnvänd endast detta om det är specifikt instruerat av en medarbetare, eftersom det kommer att göra loggar svåra att läsa och försämra emulatorprestanda.", + "th_TH": "พิมพ์ข้อความประวัติการแก้ไขข้อบกพร่องในคอนโซล\n\nใช้สิ่งนี้เฉพาะเมื่อได้รับคำแนะนำจากผู้ดูแลเท่านั้น เนื่องจากจะทำให้บันทึกอ่านยากและทำให้ประสิทธิภาพของโปรแกรมจำลองแย่ลง", + "tr_TR": "Debug log mesajlarını konsola yazdırır.\n\nBu seçeneği yalnızca geliştirici üyemiz belirtirse aktifleştirin, çünkü bu seçenek log dosyasını okumayı zorlaştırır ve emülatörün performansını düşürür.", + "uk_UA": "Виводить повідомлення журналу налагодження в консолі.\n\nВикористовуйте лише за спеціальною вказівкою розробника, оскільки увімкнення цього параметру ускладнить читання журналів (logs) і погіршить роботу емулятора.", + "zh_CN": "在控制台中显示调试日志。\n\n仅在特别需要时使用此功能,因为它会导致日志信息难以阅读,并降低模拟器性能。", + "zh_TW": "在控制台中輸出偵錯日誌訊息。\n\n只有在人員特別指示的情況下才能使用,因為這會導致日誌難以閱讀,並降低模擬器效能。" + } + }, + { + "ID": "LoadApplicationFileTooltip", + "Translations": { + "ar_SA": "افتح مستكشف الملفات لاختيار ملف متوافق مع سويتش لتحميله", + "de_DE": "Öffnet die Dateiauswahl um Datei zu laden, welche mit der Switch kompatibel ist", + "el_GR": "Ανοίξτε έναν επιλογέα αρχείων για να επιλέξετε ένα αρχείο συμβατό με το Switch για φόρτωση", + "en_US": "Open a file explorer to choose a Switch compatible file to load", + "es_ES": "Abre el explorador de archivos para elegir un archivo compatible con Switch para cargar", + "fr_FR": "Ouvre un explorateur de fichiers pour choisir un fichier compatible Switch à charger.", + "he_IL": "פתח סייר קבצים כדי לבחור קובץ תואם סוויץ' לטעינה", + "it_IT": "Apri un selettore file per scegliere un file compatibile con Switch da caricare", + "ja_JP": "ロードする Switch 互換のファイルを選択するためファイルエクスプローラを開きます", + "ko_KR": "파일 탐색기를 열어 불러올 Switch 호환 파일을 선택", + "no_NO": "Åpne filutforsker for å velge en Switch kompatibel fil å laste", + "pl_PL": "Otwórz eksplorator plików, aby wybrać plik kompatybilny z Switch do wczytania", + "pt_BR": "Abre um explorador de arquivos para escolher um arquivo compatível com o Switch para carregar", + "ru_RU": "Открывает файловый менеджер для выбора файла, совместимого с Nintendo Switch.", + "sv_SE": "Öppna en filutforskare för att välja en Switch-kompatibel fil att läsa in", + "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกไฟล์ที่เข้ากันได้กับ Switch ที่จะโหลด", + "tr_TR": "Switch ile uyumlu bir dosya yüklemek için dosya tarayıcısını açar", + "uk_UA": "Відкриває Файловий провідник, щоб обрати для завантаження сумісний зі Switch файл", + "zh_CN": "选择 Switch 游戏文件并加载", + "zh_TW": "開啟檔案總管,選擇與 Switch 相容的檔案來載入" + } + }, + { + "ID": "LoadApplicationFolderTooltip", + "Translations": { + "ar_SA": "افتح مستكشف الملفات لاختيار تطبيق متوافق مع سويتش للتحميل", + "de_DE": "Öffnet die Dateiauswahl um ein Spiel zu laden, welches mit der Switch kompatibel ist", + "el_GR": "Ανοίξτε έναν επιλογέα αρχείων για να επιλέξετε μία μη συσκευασμένη εφαρμογή, συμβατή με το Switch για φόρτωση", + "en_US": "Open a file explorer to choose a Switch compatible, unpacked application to load", + "es_ES": "Abre el explorador de archivos para elegir un archivo desempaquetado y compatible con Switch para cargar", + "fr_FR": "Ouvre un explorateur de fichiers pour choisir une application dépaquetée compatible Switch à charger.", + "he_IL": "פתח סייר קבצים כדי לבחור יישום תואם סוויץ', לא ארוז לטעינה.", + "it_IT": "Apri un selettore file per scegliere un'applicazione estratta compatibile con Switch da caricare", + "ja_JP": "ロードする Switch 互換の展開済みアプリケーションを選択するためファイルエクスプローラを開きます", + "ko_KR": "Switch와 호환되는 압축 해제된 앱을 선택하여 불러오려면 파일 탐색기를 엽니다.", + "no_NO": "Åpne en filutforsker for å velge en Switch kompatibel, upakket applikasjon for å laste", + "pl_PL": "Otwórz eksplorator plików, aby wybrać zgodną z Switch, rozpakowaną aplikację do załadowania", + "pt_BR": "Abre um explorador de arquivos para escolher um aplicativo descompactado compatível com o Switch para carregar", + "ru_RU": "Открывает файловый менеджер для выбора распакованного приложения, совместимого с Nintendo Switch.", + "sv_SE": "Öppna en filutforskare för att välja en Switch-kompatibel, uppackad applikation att läsa in", + "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกไฟล์ที่เข้ากันได้กับ Switch ที่จะโหลด", + "tr_TR": "Switch ile uyumlu ayrıştırılmamış bir uygulama yüklemek için dosya tarayıcısını açar", + "uk_UA": "Відкриває Файловий провідник, щоб обрати сумісну зі Switch розпаковану програму для завантаження", + "zh_CN": "选择解包后的 Switch 游戏目录并加载", + "zh_TW": "開啟檔案總管,選擇與 Switch 相容且未封裝的應用程式來載入" + } + }, + { + "ID": "LoadDlcFromFolderTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Open a file explorer to choose one or more folders to bulk load DLC from", + "es_ES": "Abrir un explorador de archivos para seleccionar una o más carpetas para cargar DLC de forma masiva", + "fr_FR": "Ouvre un explorateur de fichiers pour choisir un ou plusieurs dossiers afin de charger en masse des DLC", + "he_IL": "", + "it_IT": "Apri un selettore file per scegliere una o più cartelle dalle quali caricare DLC in blocco", + "ja_JP": "", + "ko_KR": "파일 탐색기를 열어 DLC를 일괄 불러오기할 폴더를 하나 이상 선택", + "no_NO": "Åpne en filutforsker for å velge en eller flere mapper å laste inn DLC fra", + "pl_PL": "", + "pt_BR": "Abre um explorador de arquivos para escolher uma ou mais pastas para carregar DLC em massa", + "ru_RU": "Открывает проводник, для выбора одной или нескольких папок для массовой загрузки DLC", + "sv_SE": "Öppna en filutforskare för att välja en eller flera mappar att läsa in alla DLC från", + "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกหนึ่งโฟลเดอร์ขึ้นไปเพื่อโหลด DLC จำนวนมาก", + "tr_TR": "", + "uk_UA": "Відкриває Файловий провідник для обрання однієї або декількох тек для масового завантаження DLC", + "zh_CN": "打开文件资源管理器以选择一个或多个文件夹来批量加载 DLC。", + "zh_TW": "開啟檔案總管,選擇一個或多個資料夾來大量載入 DLC" + } + }, + { + "ID": "LoadTitleUpdatesFromFolderTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Open a file explorer to choose one or more folders to bulk load title updates from", + "es_ES": "Abrir un explorador de archivos para seleccionar una o más carpetas para cargar actualizaciones de título de forma masiva", + "fr_FR": "Ouvre un explorateur de fichiers pour choisir un ou plusieurs dossiers afin de charger en masse des mises à jour de titre.", + "he_IL": "", + "it_IT": "Apri un selettore file per scegliere una o più cartelle dalle quali caricare aggiornamenti in blocco", + "ja_JP": "", + "ko_KR": "파일 탐색기를 열어 하나 이상의 폴더를 선택하여 대량으로 타이틀 업데이트 불러오기", + "no_NO": "Åpne en filutforsker for å velge en eller flere mapper som du vil laste inn titteloppdateringer fra", + "pl_PL": "", + "pt_BR": "Abre um explorador de arquivos para escolher uma ou mais pastas para carregar em massa as atualizações de títulos", + "ru_RU": "Открывает проводник, чтобы выбрать одну или несколько папок для массовой загрузки обновлений приложений", + "sv_SE": "Öppna en filutforskare för att välja en eller flera mappar att läsa in alla titeluppdateringar från", + "th_TH": "เปิดตัวสำรวจไฟล์เพื่อเลือกหนึ่งโฟลเดอร์ขึ้นไปเพื่อโหลดไฟล์อัปเดตจำนวนมาก", + "tr_TR": "", + "uk_UA": "Відкриває Файловий Провідник для обрання однієї або декількох тек для масового завантаження оновлень", + "zh_CN": "打开文件资源管理器以选择一个或多个文件夹来批量加载游戏更新。", + "zh_TW": "開啟檔案總管,選擇一個或多個資料夾來大量載入遊戲更新" + } + }, + { + "ID": "OpenRyujinxFolderTooltip", + "Translations": { + "ar_SA": "فتح مجلد نظام ملفات ريوجينكس", + "de_DE": "Öffnet den Ordner, der das Ryujinx Dateisystem enthält", + "el_GR": "Ανοίξτε το φάκελο συστήματος αρχείων Ryujinx", + "en_US": "Open Ryujinx filesystem folder", + "es_ES": "Abre la carpeta de sistema de Ryujinx", + "fr_FR": "Ouvrir le dossier du système de fichiers Ryujinx", + "he_IL": "פתח את תיקיית מערכת הקבצים ריוג'ינקס", + "it_IT": "Apri la cartella del filesystem di Ryujinx", + "ja_JP": "Ryujinx ファイルシステムフォルダを開きます", + "ko_KR": "Ryujinx 파일 시스템 폴더 열기", + "no_NO": "Åpne Ryujinx filsystem-mappen", + "pl_PL": "Otwórz folder systemu plików Ryujinx", + "pt_BR": "Abre a pasta do sistema de arquivos Ryujinx", + "ru_RU": "Открывает папку с файлами Ryujinx", + "sv_SE": "Öppna Ryujinx-filsystemsmappen", + "th_TH": "เปิดโฟลเดอร์ระบบไฟล์ Ryujinx", + "tr_TR": "Ryujinx dosya sistem klasörünü açar", + "uk_UA": "Відкриває теку з файлами Ryujinx", + "zh_CN": "打开 Ryujinx 模拟器系统目录", + "zh_TW": "開啟 Ryujinx 檔案系統資料夾" + } + }, + { + "ID": "OpenScreenshotFolderTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Open Ryujinx screenshots folder", + "es_ES": "", + "fr_FR": "Ouvrir le dossier des captures d’écran Ryujinx", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "Ryujinx 스크린샷 폴더 열기", + "no_NO": "Åpne Ryujinx skjermbildemappen", + "pl_PL": "", + "pt_BR": "Abre a pasta de capturas de tela do Ryujinx", + "ru_RU": "Открывает папку скриншотов Ryujinx", + "sv_SE": "Öppna Ryujinx skärmbildsmapp", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Відкрити теку куди зберігаються скріншоти Ryujinx", + "zh_CN": "打开 Ryujinx 截图文件夹", + "zh_TW": "開啟 Ryujinx 螢幕擷取畫面資料夾" + } + }, + { + "ID": "OpenRyujinxLogsTooltip", + "Translations": { + "ar_SA": "يفتح المجلد الذي تتم كتابة السجلات إليه", + "de_DE": "Öffnet den Ordner, in welchem die Logs gespeichert werden", + "el_GR": "Ανοίξτε το φάκελο στον οποίο διατηρούνται τα αρχεία καταγραφής", + "en_US": "Opens the folder where logs are written to", + "es_ES": "Abre la carpeta en la que se guardan los registros", + "fr_FR": "Ouvre le dossier où les journaux sont enregistrés", + "he_IL": "פותח את התיקיה שאליה נכתבים רישומים", + "it_IT": "Apre la cartella dove vengono salvati i log", + "ja_JP": "ログが格納されるフォルダを開きます", + "ko_KR": "로그가 기록되는 폴더 열기", + "no_NO": "Åpner mappen hvor logger er lagret", + "pl_PL": "Otwiera folder, w którym zapisywane są logi", + "pt_BR": "Abre a pasta onde os logs são gravados", + "ru_RU": "Открывает папку, в которую записываются логи", + "sv_SE": "Öppnar mappen där loggarna har skrivits till", + "th_TH": "เปิดโฟลเดอร์ ที่เก็บไฟล์ประวัติ", + "tr_TR": "Log dosyalarının bulunduğu klasörü açar", + "uk_UA": "Відкриває теку, куди зберігаються журнали (logs)", + "zh_CN": "打开日志存放的目录", + "zh_TW": "開啟日誌被寫入的資料夾" + } + }, + { + "ID": "ExitTooltip", + "Translations": { + "ar_SA": "الخروج من ريوجينكس", + "de_DE": "Beendet Ryujinx", + "el_GR": "Έξοδος από το Ryujinx", + "en_US": "Exit Ryujinx", + "es_ES": "Cierra Ryujinx", + "fr_FR": "Quitter Ryujinx", + "he_IL": "צא מריוג'ינקס", + "it_IT": "Esci da Ryujinx", + "ja_JP": "Ryujinx を終了します", + "ko_KR": "Ryujinx 종료", + "no_NO": "Avslutt Ryujinx", + "pl_PL": "Wyjdź z Ryujinx", + "pt_BR": "Sair do Ryujinx", + "ru_RU": "Выйти из Ryujinx", + "sv_SE": "Avsluta Ryujinx", + "th_TH": "ออกจากโปรแกรม Ryujinx", + "tr_TR": "Ryujinx'ten çıkış yapmayı sağlar", + "uk_UA": "Закриває Ryujinx", + "zh_CN": "退出 Ryujinx 模拟器", + "zh_TW": "結束 Ryujinx" + } + }, + { + "ID": "OpenSettingsTooltip", + "Translations": { + "ar_SA": "فتح نافذة الإعدادات", + "de_DE": "Öffnet das Einstellungsfenster", + "el_GR": "Ανοίξτε το παράθυρο Ρυθμίσεων", + "en_US": "Open settings window", + "es_ES": "Abre la ventana de configuración", + "fr_FR": "Ouvrir la fenêtre des paramètres", + "he_IL": "פתח את חלון ההגדרות", + "it_IT": "Apri la finestra delle impostazioni", + "ja_JP": "設定ウインドウを開きます", + "ko_KR": "설정 창 열기", + "no_NO": "Åpne innstillinger-vinduet", + "pl_PL": "Otwórz okno ustawień", + "pt_BR": "Abrir janela de configurações", + "ru_RU": "Открывает окно параметров", + "sv_SE": "Öppna inställningar", + "th_TH": "เปิดหน้าต่างการตั้งค่า", + "tr_TR": "Seçenekler penceresini açar", + "uk_UA": "Відкриває вікно налаштувань", + "zh_CN": "打开设置窗口", + "zh_TW": "開啟設定視窗" + } + }, + { + "ID": "OpenProfileManagerTooltip", + "Translations": { + "ar_SA": "فتح نافذة إدارة الملفات الشخصية للمستخدمين", + "de_DE": "Öffnet das Profilverwaltungsfenster", + "el_GR": "Ανοίξτε το παράθυρο Διαχείρισης Προφίλ Χρήστη", + "en_US": "Open User Profiles Manager window", + "es_ES": "Abre la ventana para gestionar los perfiles de usuario", + "fr_FR": "Ouvrir la fenêtre du gestionnaire de profils d'utilisateurs", + "he_IL": "פתח את חלון מנהל פרופילי המשתמש", + "it_IT": "Apri la finestra di gestione dei profili utente", + "ja_JP": "ユーザプロファイル管理ウインドウを開きます", + "ko_KR": "사용자 프로필 관리자 창 열기", + "no_NO": "Åpne vindu for brukerprofiler", + "pl_PL": "Otwórz okno Menedżera Profili Użytkownika", + "pt_BR": "Abrir Janela de Gerenciamento de Perfis", + "ru_RU": "Открыть менеджер учётных записей", + "sv_SE": "Öppna hanterare för användarprofiler", + "th_TH": "เปิดหน้าต่างตัวจัดการโปรไฟล์ผู้ใช้", + "tr_TR": "Kullanıcı profil yöneticisi penceresini açar", + "uk_UA": "Відкриває вікно диспетчера профілів користувачів", + "zh_CN": "打开用户账户管理窗口", + "zh_TW": "開啟使用者設定檔管理員視窗" + } + }, + { + "ID": "StopEmulationTooltip", + "Translations": { + "ar_SA": "إيقاف محاكاة اللعبة الحالية والعودة إلى اختيار اللعبة", + "de_DE": "Beendet die Emulation des derzeitigen Spiels und kehrt zu der Spielauswahl zurück", + "el_GR": "Σταματήστε την εξομοίωση του τρέχοντος παιχνιδιού και επιστρέψτε στην επιλογή παιχνιδιού", + "en_US": "Stop emulation of the current game and return to game selection", + "es_ES": "Detiene la emulación del juego actual y regresa a la selección de juegos", + "fr_FR": "Arrêter l'émulation du jeu en cours et revenir à la sélection des jeux", + "he_IL": "הפסק את הדמייה של המשחק הנוכחי וחזור למסך בחירת המשחק", + "it_IT": "Ferma l'emulazione del gioco attuale e torna alla selezione dei giochi", + "ja_JP": "ゲームのエミュレーションを中止してゲーム選択画面に戻ります", + "ko_KR": "현재 게임의 에뮬레이션을 중지하고 게임 선택으로 돌아가기", + "no_NO": "Stopp emuleringen av dette spillet og gå tilbake til spill valg", + "pl_PL": "Zatrzymaj emulację bieżącej gry i wróć do wyboru gier", + "pt_BR": "Parar emulação do jogo atual e voltar a seleção de jogos", + "ru_RU": "Остановка эмуляции текущей игры с последующим возвратом к списку игр", + "sv_SE": "Stoppa emulering av aktuellt spel och återgå till spelväljaren", + "th_TH": "หยุดการจำลองของเกมที่เปิดอยู่ในปัจจุบันและกลับไปยังการเลือกเกม", + "tr_TR": "Oynanmakta olan oyunun emülasyonunu durdurup oyun seçimine geri döndürür", + "uk_UA": "Зупиняє емуляцію поточної гри та повертається до вибору гри", + "zh_CN": "停止运行当前游戏,并回到主界面", + "zh_TW": "停止模擬目前遊戲,返回遊戲選擇介面" + } + }, + { + "ID": "CheckUpdatesTooltip", + "Translations": { + "ar_SA": "التحقق من وجود تحديثات لريوجينكس", + "de_DE": "Sucht nach Updates für Ryujinx", + "el_GR": "Ελέγξτε για ενημερώσεις του Ryujinx", + "en_US": "Check for updates to Ryujinx", + "es_ES": "Busca actualizaciones para Ryujinx", + "fr_FR": "Vérifier les mises à jour de Ryujinx", + "he_IL": "בדוק אם קיימים עדכונים לריוג'ינקס", + "it_IT": "Controlla la presenza di aggiornamenti di Ryujinx", + "ja_JP": "Ryujinx のアップデートを確認します", + "ko_KR": "Ryujinx 업데이트 확인", + "no_NO": "Se etter oppdateringer til Ryujinx", + "pl_PL": "Sprawdź aktualizacje Ryujinx", + "pt_BR": "Verificar por atualizações para o Ryujinx", + "ru_RU": "Проверяет наличие обновлений Ryujinx", + "sv_SE": "Leta efter uppdateringar för Ryujinx", + "th_TH": "ตรวจสอบอัปเดตของ Ryujinx", + "tr_TR": "Ryujinx güncellemelerini denetlemeyi sağlar", + "uk_UA": "Перевіряє наявність оновлень для Ryujinx", + "zh_CN": "检查 Ryujinx 新版本", + "zh_TW": "檢查 Ryujinx 的更新" + } + }, + { + "ID": "OpenAboutTooltip", + "Translations": { + "ar_SA": "فتح حول النافذة", + "de_DE": "Öffnet das 'Über Ryujinx'-Fenster", + "el_GR": "Ανοίξτε το Παράθυρο Σχετικά", + "en_US": "Open About Window", + "es_ES": "Abre la ventana \"Acerca de\"", + "fr_FR": "Ouvrir la fenêtre À Propos", + "he_IL": "פתח את חלון אודות היישום", + "it_IT": "Apri la finestra delle informazioni", + "ja_JP": "Ryujinx についてのウインドウを開きます", + "ko_KR": "정보 창 열기", + "no_NO": "Åpne Om Vindu", + "pl_PL": "Otwórz Okno Informacje", + "pt_BR": "Abrir Janela Sobre", + "ru_RU": "Открывает окно «О программе»", + "sv_SE": "Öppna Om-fönstret", + "th_TH": "เปิดหน้าต่าง เกี่ยวกับ", + "tr_TR": "Hakkında penceresini açar", + "uk_UA": "Відкриває вікно «Про застосунок»", + "zh_CN": "打开关于窗口", + "zh_TW": "開啟關於視窗" + } + }, + { + "ID": "GridSize", + "Translations": { + "ar_SA": "حجم الشبكة", + "de_DE": "Rastergröße", + "el_GR": "Μέγεθος Πλέγματος", + "en_US": "Grid Size", + "es_ES": "Tamaño de cuadrícula", + "fr_FR": "Taille de la grille", + "he_IL": "גודל רשת", + "it_IT": "Dimensione griglia", + "ja_JP": "グリッドサイズ", + "ko_KR": "그리드 크기", + "no_NO": "Rutenett størrelse", + "pl_PL": "Wielkość siatki", + "pt_BR": "Tamanho da Grade", + "ru_RU": "Размер сетки", + "sv_SE": "Rutnätsstorlek", + "th_TH": "ขนาดตาราง", + "tr_TR": "Öge Boyutu", + "uk_UA": "Розмір сітки", + "zh_CN": "网格尺寸", + "zh_TW": "網格尺寸" + } + }, + { + "ID": "GridSizeTooltip", + "Translations": { + "ar_SA": "تغيير حجم عناصر الشبكة", + "de_DE": "Ändert die Größe der Rasterelemente", + "el_GR": "Αλλαγή μεγέθους στοιχείων πλέγματος", + "en_US": "Change the size of grid items", + "es_ES": "Cambia el tamaño de los objetos en la cuadrícula", + "fr_FR": "Modifier la taille des éléments de la grille", + "he_IL": "שנה את גודל המוצרים על הרשת.", + "it_IT": "Cambia la dimensione dei riquadri della griglia", + "ja_JP": "グリッドサイズを変更します", + "ko_KR": "그리드 항목의 크기 변경", + "no_NO": "Endre størrelsen på rutenettet elementer", + "pl_PL": "Zmień rozmiar elementów siatki", + "pt_BR": "Mudar tamanho dos items da grade", + "ru_RU": "Меняет размер сетки элементов", + "sv_SE": "Ändra objektstorleken för rutnätet", + "th_TH": "เปลี่ยนขนาด ของตาราง", + "tr_TR": "Grid ögelerinin boyutunu değiştirmeyi sağlar", + "uk_UA": "Змінити розмір елементів сітки", + "zh_CN": "调整网格项目的大小", + "zh_TW": "調整網格的大小" + } + }, + { + "ID": "SettingsTabSystemSystemLanguageBrazilianPortuguese", + "Translations": { + "ar_SA": "البرتغالية البرازيلية", + "de_DE": "Brasilianisches Portugiesisch", + "el_GR": "Πορτογαλικά Βραζιλίας", + "en_US": "Brazilian Portuguese", + "es_ES": "Portugués brasileño", + "fr_FR": "Portugais Brésilien", + "he_IL": "פורטוגלית ברזילאית", + "it_IT": "Portoghese brasiliano", + "ja_JP": "ポルトガル語(ブラジル)", + "ko_KR": "브라질 포르투갈어", + "no_NO": "Brasiliansk portugisisk", + "pl_PL": "Brazylijski Portugalski", + "pt_BR": "Português do Brasil", + "ru_RU": "Португальский язык (Бразилия)", + "sv_SE": "Portugisiska (braziliansk)", + "th_TH": "บราซิล โปรตุเกส", + "tr_TR": "Brezilya Portekizcesi", + "uk_UA": "Португальська (Бразилія)", + "zh_CN": "巴西葡萄牙语", + "zh_TW": "巴西葡萄牙文" + } + }, + { + "ID": "AboutRyujinxContributorsButtonHeader", + "Translations": { + "ar_SA": "رؤية جميع المساهمين", + "de_DE": "Alle Mitwirkenden anzeigen", + "el_GR": "Δείτε Όλους τους Συντελεστές", + "en_US": "See All Contributors", + "es_ES": "Ver todos los contribuidores", + "fr_FR": "Voir tous les contributeurs", + "he_IL": "צפה בכל התורמים", + "it_IT": "Mostra tutti i contributori", + "ja_JP": "すべての貢献者を確認", + "ko_KR": "모든 기여자 보기", + "no_NO": "Se alle bidragsytere", + "pl_PL": "Zobacz Wszystkich Współtwórców", + "pt_BR": "Ver Todos os Contribuidores", + "ru_RU": "Посмотреть всех участников", + "sv_SE": "Visa alla som bidragit", + "th_TH": "ดูผู้มีส่วนร่วมทั้งหมด", + "tr_TR": "Tüm katkıda bulunanları gör", + "uk_UA": "Переглянути всіх співавторів", + "zh_CN": "查看所有贡献者", + "zh_TW": "查看所有貢獻者" + } + }, + { + "ID": "SettingsTabSystemAudioVolume", + "Translations": { + "ar_SA": "مستوى الصوت:", + "de_DE": "Lautstärke: ", + "el_GR": "Ενταση Ήχου: ", + "en_US": "Volume: ", + "es_ES": "Volumen: ", + "fr_FR": "Volume :", + "he_IL": "עוצמת קול: ", + "it_IT": "", + "ja_JP": "音量: ", + "ko_KR": "음량 : ", + "no_NO": "Lydnivå: ", + "pl_PL": "Głośność: ", + "pt_BR": "Volume:", + "ru_RU": "Громкость: ", + "sv_SE": "Volym: ", + "th_TH": "ระดับเสียง: ", + "tr_TR": "Ses Seviyesi: ", + "uk_UA": "Гучність: ", + "zh_CN": "音量:", + "zh_TW": "音量:" + } + }, + { + "ID": "AudioVolumeTooltip", + "Translations": { + "ar_SA": "تغيير مستوى الصوت", + "de_DE": "Ändert die Lautstärke", + "el_GR": "Αλλαγή Έντασης Ήχου", + "en_US": "Change Audio Volume", + "es_ES": "Ajusta el nivel de volumen", + "fr_FR": "Modifier le volume audio", + "he_IL": "שנה עוצמת קול", + "it_IT": "Cambia volume audio", + "ja_JP": "音量を変更します", + "ko_KR": "음량 변경", + "no_NO": "Endre lydenivå", + "pl_PL": "Zmień Głośność Dźwięku", + "pt_BR": "Mudar Volume do Áudio", + "ru_RU": "Изменяет громкость звука", + "sv_SE": "Ändra ljudvolym", + "th_TH": "ปรับระดับเสียง", + "tr_TR": "Ses seviyesini değiştirir", + "uk_UA": "Регулювання гучності", + "zh_CN": "调节音量", + "zh_TW": "調節音量" + } + }, + { + "ID": "SettingsTabSystemEnableInternetAccess", + "Translations": { + "ar_SA": "الوصول إلى إنترنت كضيف/وضع LAN", + "de_DE": "Gast-Internet-Zugang/LAN Modus", + "el_GR": "Ενεργοποίηση πρόσβασης επισκέπτη στο Διαδίκτυο", + "en_US": "Guest Internet Access/LAN Mode", + "es_ES": "Conectar guest a Internet/Modo LAN", + "fr_FR": "Accès Internet Invité/Mode LAN", + "he_IL": "אפשר גישה לאינטרנט בתור אורח/חיבור לאן", + "it_IT": "Attiva l'accesso a Internet da parte del guest/Modalità LAN", + "ja_JP": "ゲストインターネットアクセス / LAN モード", + "ko_KR": "게스트 인터넷 접속/LAN 모드", + "no_NO": "Internett-tilgang for gjeste/LAN-modus", + "pl_PL": "Dostęp do Internetu Gościa/Tryb LAN", + "pt_BR": "Acesso à Internet para Convidados/Modo LAN", + "ru_RU": "Гостевой доступ в интернет/сетевой режим", + "sv_SE": "Gäståtkomst för Internet/LAN-läge", + "th_TH": "การเข้าถึงอินเทอร์เน็ตของผู้เยี่ยมชม/โหมด LAN", + "tr_TR": "Guest Internet Erişimi/LAN Modu", + "uk_UA": "Гостьовий доступ до Інтернету/режим LAN", + "zh_CN": "启用网络连接(局域网)", + "zh_TW": "訪客網際網路存取/區域網路模式" + } + }, + { + "ID": "EnableInternetAccessTooltip", + "Translations": { + "ar_SA": "للسماح للتطبيق الذي تمت محاكاته بالاتصال بالإنترنت.\n\nيمكن للألعاب التي تحتوي على وضع LAN الاتصال ببعضها البعض عند تمكين ذلك وتوصيل الأنظمة بنفس نقطة الوصول. وهذا يشمل الأجهزة الحقيقية أيضا.\n\nلا يسمح بالاتصال بخوادم نينتندو. قد يتسبب في حدوث عطل في بعض الألعاب التي تحاول الاتصال بالإنترنت.\n\nاتركه معطلا إذا لم تكن متأكدا.", + "de_DE": "Erlaubt es der emulierten Anwendung sich mit dem Internet zu verbinden.\n\nSpiele die den LAN-Modus unterstützen, ermöglichen es Ryujinx sich sowohl mit anderen Ryujinx-Systemen, als auch mit offiziellen Nintendo Switch Konsolen zu verbinden. Allerdings nur, wenn diese Option aktiviert ist und die Systeme mit demselben lokalen Netzwerk verbunden sind.\n\nDies erlaubt KEINE Verbindung zu Nintendo-Servern. Kann bei bestimmten Spielen die versuchen sich mit dem Internet zu verbinden zum Absturz führen.\n\nIm Zweifelsfall AUS lassen", + "el_GR": "Επιτρέπει την πρόσβαση επισκέπτη στο Διαδίκτυο. Εάν ενεργοποιηθεί, η εξομοιωμένη κονσόλα Switch θα συμπεριφέρεται σαν να είναι συνδεδεμένη στο Διαδίκτυο. Λάβετε υπόψη ότι σε ορισμένες περιπτώσεις, οι εφαρμογές ενδέχεται να εξακολουθούν να έχουν πρόσβαση στο Διαδίκτυο, ακόμη και όταν αυτή η επιλογή είναι απενεργοποιημένη", + "en_US": "Allows the emulated application to connect to the Internet.\n\nGames with a LAN mode can connect to each other when this is enabled and the systems are connected to the same access point. This includes real consoles as well.\n\nDoes NOT allow connecting to Nintendo servers. May cause crashing in certain games that try to connect to the Internet.\n\nLeave OFF if unsure.", + "es_ES": "Permite a la aplicación emulada conectarse a Internet.\n\nLos juegos que tengan modo LAN podrán conectarse entre sí habilitando esta opción y estando conectados al mismo módem. Asimismo, esto permite conexiones con consolas reales.\n\nNO permite conectar con los servidores de Nintendo Online. Puede causar que ciertos juegos crasheen al intentar conectarse a sus servidores.\n\nDesactívalo si no estás seguro.", + "fr_FR": "Permet à l'application émulée de se connecter à Internet.\n\nLes jeux avec un mode LAN peuvent se connecter les uns aux autres lorsque cette option est cochée et que les systèmes sont connectés au même point d'accès. Cela inclut également les vrais consoles.\n\nCette option n'autorise PAS la connexion aux serveurs Nintendo. Elle peut faire planter certains jeux qui essaient de se connecter à l'Internet.\n\nLaissez DÉSACTIVÉ si vous n'êtes pas sûr.", + "he_IL": "מאפשר ליישומים באמולצייה להתחבר לאינטרנט.\n\nמשחקים עם חיבור לאן יכולים להתחבר אחד לשני כשאופצייה זו מופעלת והמערכות מתחברות לאותה נקודת גישה. כמו כן זה כולל שורות פקודות אמיתיות גם.\n\nאופצייה זו לא מאפשרת חיבור לשרתי נינטנדו. כשהאופצייה דלוקה היא עלולה לגרום לקריסת היישום במשחקים מסויימים שמנסים להתחבר לאינטרנט.\n\nמוטב להשאיר כבוי אם לא בטוחים.", + "it_IT": "Consente all'applicazione emulata di connettersi a Internet.\n\nI giochi che dispongono di una modalità LAN possono connettersi tra di loro quando questa opzione è abilitata e sono connessi alla stessa rete, comprese le console reali.\n\nQuesta opzione NON consente la connessione ai server di Nintendo. Potrebbe causare arresti anomali in alcuni giochi che provano a connettersi a Internet.\n\nNel dubbio, lascia l'opzione disattivata.", + "ja_JP": "エミュレートしたアプリケーションをインターネットに接続できるようにします.\n\nLAN モードを持つゲーム同士は,この機能を有効にして同じアクセスポイントに接続すると接続できます. 実機も含まれます.\n\n任天堂のサーバーには接続できません. インターネットに接続しようとすると,特定のゲームでクラッシュすることがあります.\n\nよくわからない場合はオフのままにしてください.", + "ko_KR": "에뮬레이트된 앱을 인터넷에 연결할 수 있습니다.\n\nLAN 모드가 있는 게임은 이 기능이 활성화되고 시스템이 동일한 접속 포인트에 연결되어 있을 때 서로 연결할 수 있습니다. 이는 실제 콘솔도 포함됩니다.\n\nNintendo 서버 연결을 허용하지 않습니다. 인터넷에 연결을 시도하는 특정 게임에서 충돌이 발생할 수 있습니다.\n\n모르면 체크 해제 상태로 두세요.", + "no_NO": "Tillater emulert applikasjon å koble til Internett.\n\nSpill med en LAN-modus kan koble til hverandre når dette er aktivert og systemene er koblet til det samme tilgangspunktet. Dette inkluderer ekte konsoller også.\n\ntillater IKKE tilkobling til Nintendo servere. Kan forårsake krasjing i enkelte spill som prøver å koble til Internett.\n\nLa stå AV hvis du er usikker.", + "pl_PL": "Pozwala emulowanej aplikacji na łączenie się z Internetem.\n\nGry w trybie LAN mogą łączyć się ze sobą, gdy ta opcja jest włączona, a systemy są połączone z tym samym punktem dostępu. Dotyczy to również prawdziwych konsol.\n\nNie pozwala na łączenie się z serwerami Nintendo. Może powodować awarie niektórych gier, które próbują połączyć się z Internetem.\n\nPozostaw WYŁĄCZONE, jeśli nie masz pewności.", + "pt_BR": "Permite que o aplicativo emulado se conecte à Internet.\n\nJogos com modo LAN podem se conectar uns aos outros quando isso está habilitado e os sistemas estão conectados ao mesmo ponto de acesso. Isso inclui consoles reais também.\n\nNÃO permite a conexão com servidores Nintendo. Pode causar travamentos em certos jogos que tentam se conectar à Internet.\n\nDeixe DESLIGADO se não tiver certeza.", + "ru_RU": "Позволяет эмулированному приложению подключаться к Интернету.\n\nПри включении этой функции игры с возможностью сетевой игры могут подключаться друг к другу, если все эмуляторы (или реальные консоли) подключены к одной и той же точке доступа.\n\nНЕ разрешает подключение к серверам Nintendo. Может вызвать сбой в некоторых играх, которые пытаются подключиться к Интернету.\n\nРекомендутеся оставить выключенным.", + "sv_SE": "Tillåter det emulerade programmet att ansluta till internet.\n\nSpel med ett LAN-läge kan ansluta till varandra när detta är aktiverat och systemen är anslutna till samma åtkomstpunkt. Detta inkluderar riktiga konsoler också.\n\nTillåter INTE anslutning till Nintendo-servrar. Kan orsaka kraschar i vissa spel som försöker ansluta till internet.\n\nLämna AV om du är osäker.", + "th_TH": "อนุญาตให้แอปพลิเคชันจำลองเชื่อมต่ออินเทอร์เน็ต\n\nเกมที่มีโหมด LAN สามารถเชื่อมต่อระหว่างกันได้เมื่อเปิดใช้งานและระบบเชื่อมต่อกับจุดเชื่อมต่อเดียวกัน รวมถึงคอนโซลจริงด้วย\n\nไม่อนุญาตให้มีการเชื่อมต่อกับเซิร์ฟเวอร์ Nintendo อาจทำให้เกิดการหยุดทำงานในบางเกมที่พยายามเชื่อมต่ออินเทอร์เน็ต\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ", + "tr_TR": "Emüle edilen uygulamanın internete bağlanmasını sağlar.\n\nLAN modu bulunan oyunlar bu seçenek ile birbirine bağlanabilir ve sistemler aynı access point'e bağlanır. Bu gerçek konsolları da kapsar.\n\nNintendo sunucularına bağlanmayı sağlaMAZ. Internete bağlanmaya çalışan baz oyunların çökmesine sebep olabilr.\n\nEmin değilseniz devre dışı bırakın.", + "uk_UA": "Дозволяє емульованому застосунку підключатися до Інтернету.\n\nІгри з режимом локальної мережі (LAN) можуть підключатися одна до одної за умови, якщо опція увімкнена і системи підключені до однієї точки доступу (це також працює і зі справжніми консолями).\n\nНЕ дозволяє підключатися до серверів Nintendo. Може призвести до збою в деяких іграх, які намагаються підключитися до Інтернету.\n\nЗалиште вимкненим, якщо не впевнені.", + "zh_CN": "允许模拟的游戏程序访问网络。\n\n当多个模拟器或实体 Switch 连接到同一个网络时,带有局域网模式的游戏便可以相互通信。\n\n即使开启此选项也无法访问 Nintendo 服务器,有可能导致某些尝试联网的游戏闪退。\n\n如果不确定,请保持关闭状态。", + "zh_TW": "允許模擬應用程式連線網際網路。\n\n當啟用此功能且系統連線到同一接入點時,具有區域網路模式的遊戲可相互連線。這也包括真正的遊戲機。\n\n不允許連接 Nintendo 伺服器。可能會導致某些嘗試連線網際網路的遊戲崩潰。\n\n如果不確定,請保持關閉狀態。" + } + }, + { + "ID": "GameListContextMenuManageCheatToolTip", + "Translations": { + "ar_SA": "إدارة الغش", + "de_DE": "Öffnet den Cheat-Manager", + "el_GR": "Διαχείριση Κόλπων", + "en_US": "Manage Cheats", + "es_ES": "Activa o desactiva los cheats", + "fr_FR": "Gérer les cheats", + "he_IL": "נהל צ'יטים", + "it_IT": "Gestisci trucchi", + "ja_JP": "チートを管理します", + "ko_KR": "치트 관리", + "no_NO": "Administrer juksemoduser", + "pl_PL": "Zarządzaj Kodami", + "pt_BR": "Gerenciar Trapaças", + "ru_RU": "Открывает окно управления читами", + "sv_SE": "Hantera fusk", + "th_TH": "ฟังก์ชั่นจัดการสูตรโกง", + "tr_TR": "Hileleri yönetmeyi sağlar", + "uk_UA": "Відкриває меню керування чит-кодами (cheats)", + "zh_CN": "管理当前游戏的金手指", + "zh_TW": "管理密技" + } + }, + { + "ID": "GameListContextMenuManageCheat", + "Translations": { + "ar_SA": "إدارة الغش", + "de_DE": "Cheats verwalten", + "el_GR": "Διαχείριση Κόλπων", + "en_US": "Manage Cheats", + "es_ES": "Administrar cheats", + "fr_FR": "Gérer les cheats", + "he_IL": "נהל צ'יטים", + "it_IT": "Gestisci trucchi", + "ja_JP": "チートを管理", + "ko_KR": "치트 관리", + "no_NO": "Administrer juksemoduser", + "pl_PL": "Zarządzaj Kodami", + "pt_BR": "Gerenciar Trapaças", + "ru_RU": "Управление читами", + "sv_SE": "Hantera fusk", + "th_TH": "ฟังก์ชั่นจัดการสูตรโกง", + "tr_TR": "Hileleri Yönet", + "uk_UA": "Керування читами", + "zh_CN": "管理金手指", + "zh_TW": "管理密技" + } + }, + { + "ID": "GameListContextMenuManageModToolTip", + "Translations": { + "ar_SA": "إدارة التعديلات", + "de_DE": "Mods verwalten", + "el_GR": "", + "en_US": "Manage Mods", + "es_ES": "Gestionar Mods", + "fr_FR": "Gérer les mods", + "he_IL": "נהל מודים", + "it_IT": "Gestisci mod", + "ja_JP": "Modを管理します", + "ko_KR": "모드 관리", + "no_NO": "Administrer modifikasjoner", + "pl_PL": "Zarządzaj modyfikacjami", + "pt_BR": "Gerenciar Mods", + "ru_RU": "Открывает окно управления модами", + "sv_SE": "Hantera moddar", + "th_TH": "ฟังก์ชั่นจัดการม็อด", + "tr_TR": "Modları Yönet", + "uk_UA": "Відкриває меню керування модифікаціями (mods)", + "zh_CN": "管理当前游戏的 MOD", + "zh_TW": "管理模組" + } + }, + { + "ID": "GameListContextMenuManageMod", + "Translations": { + "ar_SA": "إدارة التعديلات", + "de_DE": "Mods verwalten", + "el_GR": "", + "en_US": "Manage Mods", + "es_ES": "Gestionar Mods", + "fr_FR": "Gérer les mods", + "he_IL": "נהל מודים", + "it_IT": "Gestisci mod", + "ja_JP": "", + "ko_KR": "모드 관리", + "no_NO": "Administrer modifikasjoner", + "pl_PL": "Zarządzaj modyfikacjami", + "pt_BR": "Gerenciar Mods", + "ru_RU": "Управление модами", + "sv_SE": "Hantera moddar", + "th_TH": "ฟังก์ชั่นจัดการม็อด", + "tr_TR": "Modları Yönet", + "uk_UA": "Керування модами", + "zh_CN": "管理 MOD", + "zh_TW": "管理模組" + } + }, + { + "ID": "ControllerSettingsStickRange", + "Translations": { + "ar_SA": "نطاق:", + "de_DE": "Bereich:", + "el_GR": "Εύρος:", + "en_US": "Range:", + "es_ES": "Alcance:", + "fr_FR": "Intervalle :", + "he_IL": "טווח:", + "it_IT": "Raggio:", + "ja_JP": "範囲:", + "ko_KR": "범위 :", + "no_NO": "Omfang:", + "pl_PL": "Zasięg:", + "pt_BR": "Intervalo:", + "ru_RU": "Диапазон:", + "sv_SE": "Omfång:", + "th_TH": "ขอบเขต:", + "tr_TR": "Menzil:", + "uk_UA": "Діапазон:", + "zh_CN": "范围:", + "zh_TW": "範圍:" + } + }, + { + "ID": "DialogStopEmulationTitle", + "Translations": { + "ar_SA": "{0} - إيقاف المحاكاة", + "de_DE": "{0} - Beende Emulation", + "el_GR": "{0} - Διακοπή εξομοίωσης", + "en_US": "{0} - Stop Emulation", + "es_ES": "{0} - Detener emulación", + "fr_FR": "{0} - Arrêt de l'émulation", + "he_IL": "{0} - עצור אמולציה", + "it_IT": "{0} - Ferma emulazione", + "ja_JP": "{0} - エミュレーションを中止", + "ko_KR": "{0} - 에뮬레이션 중지", + "no_NO": "{0} - Stopp emulasjon", + "pl_PL": "{0} - Zatrzymaj Emulację", + "pt_BR": "{0} - Parar emulação", + "ru_RU": "{0} - Остановка эмуляции", + "sv_SE": "{0} - Stoppa emulering", + "th_TH": "{0} - หยุดการจำลอง", + "tr_TR": "{0} - Emülasyonu Durdur", + "uk_UA": "{0} - Зупинити емуляцію", + "zh_CN": "{0} - 停止模拟", + "zh_TW": "{0} - 停止模擬" + } + }, + { + "ID": "DialogStopEmulationMessage", + "Translations": { + "ar_SA": "هل أنت متأكد أنك تريد إيقاف المحاكاة؟", + "de_DE": "Emulation wirklich beenden?", + "el_GR": "Είστε βέβαιοι ότι θέλετε να σταματήσετε την εξομοίωση;", + "en_US": "Are you sure you want to stop emulation?", + "es_ES": "¿Seguro que quieres detener la emulación actual?", + "fr_FR": "Êtes-vous sûr de vouloir arrêter l'émulation ?", + "he_IL": "האם אתם בטוחים שאתם רוצים לסגור את האמולצייה?", + "it_IT": "Sei sicuro di voler fermare l'emulazione?", + "ja_JP": "エミュレーションを中止してよろしいですか?", + "ko_KR": "에뮬레이션을 중지하시겠습니까?", + "no_NO": "Er du sikker på at du vil stoppe emulasjonen?", + "pl_PL": "Czy na pewno chcesz zatrzymać emulację?", + "pt_BR": "Tem certeza que deseja parar a emulação?", + "ru_RU": "Вы уверены, что хотите остановить эмуляцию?", + "sv_SE": "Är du säker på att du vill stoppa emuleringen?", + "th_TH": "คุณแน่ใจหรือไม่ว่าต้องการหยุดการจำลองหรือไม่?", + "tr_TR": "Emülasyonu durdurmak istediğinizden emin misiniz?", + "uk_UA": "Ви впевнені, що хочете зупинити емуляцію?", + "zh_CN": "确定要停止模拟?", + "zh_TW": "您確定要停止模擬嗎?" + } + }, + { + "ID": "SettingsTabCpu", + "Translations": { + "ar_SA": "المعالج", + "de_DE": "", + "el_GR": "Επεξεργαστής", + "en_US": "CPU", + "es_ES": "", + "fr_FR": "Processeur", + "he_IL": "מעבד", + "it_IT": "", + "ja_JP": "", + "ko_KR": "중앙처리장치", + "no_NO": "Prosessor", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Процессор", + "sv_SE": "Processor", + "th_TH": "ซีพียู", + "tr_TR": "İşlemci", + "uk_UA": "Процесор", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabAudio", + "Translations": { + "ar_SA": "الصوت", + "de_DE": "", + "el_GR": "Ήχος", + "en_US": "Audio", + "es_ES": "Sonido", + "fr_FR": "", + "he_IL": "שמע", + "it_IT": "", + "ja_JP": "音声", + "ko_KR": "음향", + "no_NO": "Lyd", + "pl_PL": "Dżwięk", + "pt_BR": "Áudio", + "ru_RU": "Аудио", + "sv_SE": "Ljud", + "th_TH": "เสียง", + "tr_TR": "Ses", + "uk_UA": "Аудіо", + "zh_CN": "音频", + "zh_TW": "音訊" + } + }, + { + "ID": "SettingsTabNetwork", + "Translations": { + "ar_SA": "الشبكة", + "de_DE": "Netzwerk", + "el_GR": "Δίκτυο", + "en_US": "Network", + "es_ES": "Red", + "fr_FR": "Réseau", + "he_IL": "רשת", + "it_IT": "Rete", + "ja_JP": "ネットワーク", + "ko_KR": "네트워크", + "no_NO": "Nettverk", + "pl_PL": "Sieć", + "pt_BR": "Rede", + "ru_RU": "Сеть", + "sv_SE": "Nätverk", + "th_TH": "เครือข่าย", + "tr_TR": "Ağ", + "uk_UA": "Мережа", + "zh_CN": "网络", + "zh_TW": "網路" + } + }, + { + "ID": "SettingsTabNetworkConnection", + "Translations": { + "ar_SA": "اتصال الشبكة", + "de_DE": "Netwerkverbindung", + "el_GR": "Σύνδεση δικτύου", + "en_US": "Network Connection", + "es_ES": "Conexión de red", + "fr_FR": "Connexion réseau", + "he_IL": "חיבור רשת", + "it_IT": "Connessione di rete", + "ja_JP": "ネットワーク接続", + "ko_KR": "네트워크 연결", + "no_NO": "Nettverk tilkobling", + "pl_PL": "Połączenie Sieciowe", + "pt_BR": "Conexão de Rede", + "ru_RU": "Подключение к сети", + "sv_SE": "Nätverksanslutning", + "th_TH": "การเชื่อมต่อเครือข่าย", + "tr_TR": "Ağ Bağlantısı", + "uk_UA": "Підключення до мережі", + "zh_CN": "网络连接", + "zh_TW": "網路連線" + } + }, + { + "ID": "SettingsTabCpuCache", + "Translations": { + "ar_SA": "ذاكرة المعالج المؤقت", + "de_DE": "CPU-Cache", + "el_GR": "Προσωρινή Μνήμη CPU", + "en_US": "CPU Cache", + "es_ES": "Caché de CPU", + "fr_FR": "Cache Processeur", + "he_IL": "מטמון מעבד", + "it_IT": "Cache CPU", + "ja_JP": "CPU キャッシュ", + "ko_KR": "CPU 캐시", + "no_NO": "CPU-buffer", + "pl_PL": "Cache CPU", + "pt_BR": "Cache da CPU", + "ru_RU": "Кэш процессора", + "sv_SE": "CPU-cache", + "th_TH": "แคชซีพียู", + "tr_TR": "İşlemci Belleği", + "uk_UA": "Кеш процесора (CPU Cache)", + "zh_CN": "CPU 缓存", + "zh_TW": "CPU 快取" + } + }, + { + "ID": "SettingsTabCpuMemory", + "Translations": { + "ar_SA": "وضع المعالج", + "de_DE": "CPU-Speicher", + "el_GR": "Μνήμη CPU", + "en_US": "CPU Mode", + "es_ES": "Memoria de CPU", + "fr_FR": "Mémoire Processeur", + "he_IL": "מצב מעבד", + "it_IT": "Modalità CPU", + "ja_JP": "CPU メモリ", + "ko_KR": "CPU 모드", + "no_NO": "Prosessor modus", + "pl_PL": "Pamięć CPU", + "pt_BR": "Modo da CPU", + "ru_RU": "Режим работы процессора", + "sv_SE": "CPU-läge", + "th_TH": "โหมดซีพียู", + "tr_TR": "CPU Hafızası", + "uk_UA": "Режим процесора (CPU Mode)", + "zh_CN": "CPU 模式", + "zh_TW": "CPU 模式" + } + }, + { + "ID": "UpdaterDisabledWarningTitle", + "Translations": { + "ar_SA": "المحدث معطل!", + "de_DE": "Updater deaktiviert!", + "el_GR": "Ο Διαχειριστής Ενημερώσεων Είναι Απενεργοποιημένος!", + "en_US": "Updater Disabled!", + "es_ES": "¡Actualizador deshabilitado!", + "fr_FR": "Mises à jour désactivées !", + "he_IL": "מעדכן מושבת!", + "it_IT": "Updater disabilitato!", + "ja_JP": "アップデータは無効です!", + "ko_KR": "업데이터가 비활성화되었습니다!", + "no_NO": "Oppdatering Deaktivert!", + "pl_PL": "Aktualizator Wyłączony!", + "pt_BR": "Atualizador Desabilitado!", + "ru_RU": "Средство обновления отключено", + "sv_SE": "Uppdateringar inaktiverade!", + "th_TH": "ปิดใช้งานการอัปเดตแล้ว!", + "tr_TR": "Güncelleyici Devre Dışı!", + "uk_UA": "Оновлення вимкнено!", + "zh_CN": "已禁用更新!", + "zh_TW": "更新已停用!" + } + }, + { + "ID": "FpsStatusBarText", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0} FPS ({1}ms)", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "{0}FPS({1}밀리초)", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "{0} bilder/s ({1}ms)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "{0} FPS ({1}毫秒)", + "zh_TW": "{0} FPS ({1}毫秒)" + } + }, + { + "ID": "FpsTurboStatusBarText", + "Translations": { + "ar_SA": "{0} FPS ({1}ms), التوربو %{2}", + "de_DE": "", + "el_GR": "", + "en_US": "{0} FPS ({1}ms), Turbo ({2}%)", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "{0}FPS({1}밀리초), ({2}%) 터보", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "{0} bilder/s ({1}ms), Turbo ({2}%)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "{0} FPS ({1}ms), Турбо ({2}%)", + "zh_CN": "{0} FPS ({1}ms), 涡轮 ({2}%)", + "zh_TW": "{0} FPS ({1}ms), 加速 ({2}%)" + } + }, + { + "ID": "UpdaterBackgroundStatusBarButtonText", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Update Available!", + "es_ES": "", + "fr_FR": "Mise à jour disponible !", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "업데이트 가능!", + "no_NO": "Oppdatering tilgjengelig!", + "pl_PL": "", + "pt_BR": "Atualização Disponível!", + "ru_RU": "Доступно обновление!", + "sv_SE": "Uppdatering finns tillgänglig!", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Доступне оновлення!", + "zh_CN": "有可用的更新!", + "zh_TW": "有可用的更新!" + } + }, + { + "ID": "ControllerSettingsRotate90", + "Translations": { + "ar_SA": "تدوير 90 درجة في اتجاه عقارب الساعة", + "de_DE": "Um 90° rotieren", + "el_GR": "Περιστροφή 90° Δεξιόστροφα", + "en_US": "Rotate 90° Clockwise", + "es_ES": "Rotar 90° en el sentido de las agujas del reloj", + "fr_FR": "Faire pivoter de 90° à droite", + "he_IL": "סובב 90° עם בכיוון השעון", + "it_IT": "Ruota in senso orario di 90°", + "ja_JP": "時計回りに 90° 回転", + "ko_KR": "시계 방향으로 90° 회전", + "no_NO": "Roter 90° med klokken", + "pl_PL": "Obróć o 90° w Prawo", + "pt_BR": "Rodar 90° Sentido Horário", + "ru_RU": "Повернуть на 90° по часовой стрелке", + "sv_SE": "Rotera 90° medurs", + "th_TH": "หมุน 90 องศา ตามเข็มนาฬิกา", + "tr_TR": "Saat yönünde 90° Döndür", + "uk_UA": "Повернути на 90° за годинниковою стрілкою", + "zh_CN": "顺时针旋转 90°", + "zh_TW": "順時針旋轉 90°" + } + }, + { + "ID": "IconSize", + "Translations": { + "ar_SA": "حجم الأيقونة", + "de_DE": "Cover Größe", + "el_GR": "Μέγεθος Εικονιδίου", + "en_US": "Icon Size", + "es_ES": "Tamaño de iconos", + "fr_FR": "Taille d'icône", + "he_IL": "גודל הסמל", + "it_IT": "Dimensioni icone", + "ja_JP": "アイコンサイズ", + "ko_KR": "아이콘 크기", + "no_NO": "Ikon størrelse", + "pl_PL": "Rozmiar ikon", + "pt_BR": "Tamanho do Ícone", + "ru_RU": "Размер обложек", + "sv_SE": "Ikonstorlek", + "th_TH": "ขนาดไอคอน", + "tr_TR": "Ikon Boyutu", + "uk_UA": "Розмір обкладинки", + "zh_CN": "图标尺寸", + "zh_TW": "圖示大小" + } + }, + { + "ID": "IconSizeTooltip", + "Translations": { + "ar_SA": "تغيير حجم أيقونات اللعبة", + "de_DE": "Ändert die Größe der Spiel-Cover", + "el_GR": "Αλλάξτε μέγεθος εικονιδίων των παιχνιδιών", + "en_US": "Change the size of game icons", + "es_ES": "Cambia el tamaño de los iconos de juegos", + "fr_FR": "Changer la taille des icônes de jeu", + "he_IL": "שנה את גודל הסמלים של משחקים", + "it_IT": "Cambia le dimensioni delle icone dei giochi", + "ja_JP": "ゲームアイコンのサイズを変更します", + "ko_KR": "게임 아이콘 크기 변경", + "no_NO": "Endre størrelsen på spillikonene", + "pl_PL": "Zmień rozmiar ikon gry", + "pt_BR": "Muda o tamanho do ícone do jogo", + "ru_RU": "Меняет размер обложек", + "sv_SE": "Ändra storleken för spelikonerna", + "th_TH": "เปลี่ยนขนาดของไอคอนเกม", + "tr_TR": "Oyun ikonlarının boyutunu değiştirmeyi sağlar", + "uk_UA": "Змінити розмір обкладинок (значків) ігор", + "zh_CN": "更改游戏图标的显示尺寸", + "zh_TW": "變更遊戲圖示的大小" + } + }, + { + "ID": "MenuBarOptionsShowConsole", + "Translations": { + "ar_SA": "عرض وحدة التحكم", + "de_DE": "Zeige Konsole", + "el_GR": "Εμφάνιση Κονσόλας", + "en_US": "Show Console", + "es_ES": "Mostrar consola", + "fr_FR": "Afficher la console", + "he_IL": "הצג שורת פקודות", + "it_IT": "Mostra console", + "ja_JP": "コンソールを表示", + "ko_KR": "콘솔 표시", + "no_NO": "Vis konsoll", + "pl_PL": "Pokaż Konsolę", + "pt_BR": "Exibir Console", + "ru_RU": "Показать консоль", + "sv_SE": "Visa konsoll", + "th_TH": "แสดง คอนโซล", + "tr_TR": "Konsol'u Göster", + "uk_UA": "Показати консоль", + "zh_CN": "显示控制台", + "zh_TW": "顯示控制台" + } + }, + { + "ID": "ShaderCachePurgeError", + "Translations": { + "ar_SA": "حدث خطأ أثناء تنظيف ذاكرة المظللات المؤقتة في {0}: {1}", + "de_DE": "Es ist ein Fehler beim löschen des Shader Caches aufgetreten bei {0}: {1}", + "el_GR": "Σφάλμα κατά την εκκαθάριση του shader cache στο {0}: {1}", + "en_US": "Error purging shader cache at {0}: {1}", + "es_ES": "Error al eliminar la caché de sombreadores en {0}: {1}", + "fr_FR": "Erreur lors de la purge du cache des shaders à {0} : {1}", + "he_IL": "שגיאה בניקוי מטמון ההצללות ב-{0}: {1}", + "it_IT": "Errore nell'eliminazione della cache degli shader a {0}: {1}", + "ja_JP": "シェーダーキャッシュの破棄エラー {0}: {1}", + "ko_KR": "{0}에서 셰이더 캐시를 삭제하는 중 오류 발생 : {1}", + "no_NO": "Feil under tømming av shader cache ved {0}: {1}", + "pl_PL": "Błąd podczas czyszczenia cache shaderów w {0}: {1}", + "pt_BR": "Erro ao limpar o cache do shader em {0}: {1}", + "ru_RU": "Ошибка очистки кэша шейдеров в {0}: {1}", + "sv_SE": "Fel vid tömning av shader cache i {0}: {1}", + "th_TH": "เกิดข้อผิดพลาดในการล้างแคชแสงเงา {0}: {1}", + "tr_TR": "Belirtilen shader cache temizlenirken hata {0}: {1}", + "uk_UA": "Помилка очищення кешу шейдера {0}: {1}", + "zh_CN": "清除 {0} 的着色器缓存文件时出错:{1}", + "zh_TW": "在 {0} 清除著色器快取時出錯: {1}" + } + }, + { + "ID": "UserErrorNoKeys", + "Translations": { + "ar_SA": "المفاتيح غير موجودة", + "de_DE": "Keys nicht gefunden", + "el_GR": "Τα κλειδιά δεν βρέθηκαν", + "en_US": "Keys not found", + "es_ES": "No se encontraron keys", + "fr_FR": "Clés non trouvées", + "he_IL": "המפתחות לא נמצאו", + "it_IT": "Chiavi non trovate", + "ja_JP": "Keys がありません", + "ko_KR": "키를 찾을 수 없음", + "no_NO": "Finner ikke nøkler", + "pl_PL": "Nie znaleziono kluczy", + "pt_BR": "Chaves não encontradas", + "ru_RU": "Ключи не найдены", + "sv_SE": "Nycklarna hittades inte", + "th_TH": "ไม่พบ คีย์", + "tr_TR": "Keys bulunamadı", + "uk_UA": "Ключі не знайдено", + "zh_CN": "找不到密钥Keys", + "zh_TW": "找不到金鑰" + } + }, + { + "ID": "UserErrorNoFirmware", + "Translations": { + "ar_SA": "لم يتم العثور على البرنامج الثابت", + "de_DE": "Firmware nicht gefunden", + "el_GR": "Το firmware δε βρέθηκε", + "en_US": "Firmware not found", + "es_ES": "No se encontró firmware", + "fr_FR": "Firmware introuvable", + "he_IL": "קושחה לא נמצאה", + "it_IT": "Firmware non trovato", + "ja_JP": "ファームウェアがありません", + "ko_KR": "펌웨어를 찾을 수 없음", + "no_NO": "Fastvare ikke funnet", + "pl_PL": "Nie znaleziono firmware'u", + "pt_BR": "Firmware não encontrado", + "ru_RU": "Прошивка не найдена", + "sv_SE": "Firmware hittades inte", + "th_TH": "ไม่พบ เฟิร์มแวร์", + "tr_TR": "Firmware bulunamadı", + "uk_UA": "Прошивка не знайдена", + "zh_CN": "未安装系统固件", + "zh_TW": "找不到韌體" + } + }, + { + "ID": "UserErrorFirmwareParsingFailed", + "Translations": { + "ar_SA": "خطأ في تحليل البرنامج الثابت", + "de_DE": "Firmware-Analysierung-Fehler", + "el_GR": "Σφάλμα ανάλυσης firmware", + "en_US": "Firmware parsing error", + "es_ES": "Error al analizar el firmware", + "fr_FR": "Erreur d'analyse du firmware", + "he_IL": "שגיאת ניתוח קושחה", + "it_IT": "Errore di analisi del firmware", + "ja_JP": "ファームウェアのパーズエラー", + "ko_KR": "펌웨어 구문 분석 오류", + "no_NO": "Fastvare analysefeil", + "pl_PL": "Błąd parsowania firmware'u", + "pt_BR": "Erro de análise de firmware", + "ru_RU": "Ошибка извлечения прошивки", + "sv_SE": "Tolkningsfel i firmware", + "th_TH": "เกิดข้อผิดพลาดในการวิเคราะห์เฟิร์มแวร์", + "tr_TR": "Firmware çözümleme hatası", + "uk_UA": "Помилка аналізу прошивки", + "zh_CN": "固件文件解析出错", + "zh_TW": "韌體解析錯誤" + } + }, + { + "ID": "UserErrorApplicationNotFound", + "Translations": { + "ar_SA": "التطبيق غير موجود", + "de_DE": "Anwendung nicht gefunden", + "el_GR": "Η εφαρμογή δε βρέθηκε", + "en_US": "Application not found", + "es_ES": "No se encontró la aplicación", + "fr_FR": "Application introuvable", + "he_IL": "יישום לא נמצא", + "it_IT": "Applicazione non trovata", + "ja_JP": "アプリケーションがありません", + "ko_KR": "앱을 찾을 수 없음", + "no_NO": "Applikasjon ikke funnet", + "pl_PL": "Aplikacja nie znaleziona", + "pt_BR": "Aplicativo não encontrado", + "ru_RU": "Приложение не найдено", + "sv_SE": "Applikationen hittades inte", + "th_TH": "ไม่พบ แอปพลิเคชัน", + "tr_TR": "Uygulama bulunamadı", + "uk_UA": "Застосунок не знайдено", + "zh_CN": "找不到游戏程序", + "zh_TW": "找不到應用程式" + } + }, + { + "ID": "UserErrorUnknown", + "Translations": { + "ar_SA": "خطأ غير معروف", + "de_DE": "Unbekannter Fehler", + "el_GR": "Άγνωστο σφάλμα", + "en_US": "Unknown error", + "es_ES": "Error desconocido", + "fr_FR": "Erreur inconnue", + "he_IL": "שגיאה לא ידועה", + "it_IT": "Errore sconosciuto", + "ja_JP": "不明なエラー", + "ko_KR": "알 수 없는 오류", + "no_NO": "Ukjent feil", + "pl_PL": "Nieznany błąd", + "pt_BR": "Erro desconhecido", + "ru_RU": "Неизвестная ошибка", + "sv_SE": "Okänt fel", + "th_TH": "ข้อผิดพลาดที่ไม่รู้จัก", + "tr_TR": "Bilinmeyen hata", + "uk_UA": "Невідома помилка", + "zh_CN": "未知错误", + "zh_TW": "未知錯誤" + } + }, + { + "ID": "UserErrorUndefined", + "Translations": { + "ar_SA": "خطأ غير محدد", + "de_DE": "Undefinierter Fehler", + "el_GR": "Αόριστο σφάλμα", + "en_US": "Undefined error", + "es_ES": "Error indefinido", + "fr_FR": "Erreur non définie", + "he_IL": "שגיאה לא מוגדרת", + "it_IT": "Errore non definito", + "ja_JP": "未定義エラー", + "ko_KR": "정의되지 않은 오류", + "no_NO": "Udefinert feil", + "pl_PL": "Niezdefiniowany błąd", + "pt_BR": "Erro indefinido", + "ru_RU": "Неопределенная ошибка", + "sv_SE": "Odefinierat fel", + "th_TH": "ข้อผิดพลาดที่ไม่ได้ระบุ", + "tr_TR": "Tanımlanmayan hata", + "uk_UA": "Невизначена помилка", + "zh_CN": "未定义错误", + "zh_TW": "未定義錯誤" + } + }, + { + "ID": "UserErrorNoKeysDescription", + "Translations": { + "ar_SA": "لم يتمكن ريوجينكس من العثور على ملف 'prod.keys' الخاص بك", + "de_DE": "Ryujinx konnte deine 'prod.keys' Datei nicht finden", + "el_GR": "Το Ryujinx δεν κατάφερε να εντοπίσει το αρχείο 'prod.keys'", + "en_US": "Ryujinx was unable to find your 'prod.keys' file", + "es_ES": "Ryujinx no pudo encontrar tus 'prod.keys'.", + "fr_FR": "Ryujinx n'a pas pu trouver votre fichier 'prod.keys'", + "he_IL": "ריוג'ינקס לא הצליח למצוא את קובץ ה-'prod.keys' שלך", + "it_IT": "Ryujinx non è riuscito a trovare il file 'prod.keys'", + "ja_JP": "'prod.keys' が見つかりませんでした", + "ko_KR": "Ryujinx가 'prod.keys' 파일을 찾지 못함", + "no_NO": "Ryujinx kunne ikke finne 'prod.keys' filen din", + "pl_PL": "Ryujinx nie mógł znaleźć twojego pliku 'prod.keys'", + "pt_BR": "Ryujinx não conseguiu encontrar o seu arquivo 'prod.keys'", + "ru_RU": "Ryujinx не удалось найти ваш 'prod.keys' файл", + "sv_SE": "Ryujinx kunde inte hitta din 'prod.keys'-fil", + "th_TH": "Ryujinx ไม่พบไฟล์ 'prod.keys' ในเครื่องของคุณ", + "tr_TR": "Ryujinx 'prod.keys' dosyasını bulamadı", + "uk_UA": "Ryujinx не вдалося знайти ваш файл «prod.keys».", + "zh_CN": "Ryujinx 模拟器找不到“prod.keys”密钥文件", + "zh_TW": "Ryujinx 無法找到您的「prod.keys」檔案" + } + }, + { + "ID": "UserErrorNoFirmwareDescription", + "Translations": { + "ar_SA": "لم يتمكن ريوجينكس من العثور على أية برامج ثابتة مثبتة", + "de_DE": "Ryujinx konnte keine installierte Firmware finden!", + "el_GR": "Το Ryujinx δεν κατάφερε να εντοπίσει κανένα εγκατεστημένο firmware", + "en_US": "Ryujinx was unable to find any firmwares installed", + "es_ES": "Ryujinx no pudo encontrar un firmware instalado.", + "fr_FR": "Ryujinx n'a pas trouvé de firmware installé", + "he_IL": "ריוג'ינקס לא הצליחה למצוא קושחה מותקנת", + "it_IT": "Ryujinx non è riuscito a trovare alcun firmware installato", + "ja_JP": "インストールされたファームウェアが見つかりませんでした", + "ko_KR": "설치된 펌웨어를 찾을 수 없음", + "no_NO": "Ryujinx kunne ikke finne noen fastvare installert", + "pl_PL": "Ryujinx nie mógł znaleźć żadnego zainstalowanego firmware'u", + "pt_BR": "Ryujinx não conseguiu encontrar nenhum Firmware instalado", + "ru_RU": "Ryujinx не удалось найти ни одной установленной прошивки", + "sv_SE": "Ryujinx kunde inte hitta några installerade firmwares", + "th_TH": "Ryujinx ไม่พบ เฟิร์มแวร์ที่ติดตั้งไว้ในเครื่องของคุณ", + "tr_TR": "Ryujinx yüklü herhangi firmware bulamadı", + "uk_UA": "Ryujinx не вдалося знайти встановлену прошивку", + "zh_CN": "Ryujinx 模拟器未安装 Switch 系统固件", + "zh_TW": "Ryujinx 無法找到已安裝的任何韌體" + } + }, + { + "ID": "UserErrorFirmwareParsingFailedDescription", + "Translations": { + "ar_SA": "لم يتمكن ريوجينكس من تحليل البرامج الثابتة المتوفرة. يحدث هذا عادة بسبب المفاتيح القديمة.", + "de_DE": "Ryujinx konnte die zu verfügung gestellte Firmware nicht analysieren. Ein möglicher Grund dafür sind veraltete keys.", + "el_GR": "Το Ryujinx δεν κατάφερε να αναλύσει το συγκεκριμένο firmware. Αυτό συνήθως οφείλετε σε ξεπερασμένα/παλιά κλειδιά.", + "en_US": "Ryujinx was unable to parse the provided firmware. This is usually caused by outdated keys.", + "es_ES": "Ryujinx no pudo analizar el firmware. Normalmente esto ocurre debido a keys desfasadas.", + "fr_FR": "Ryujinx n'a pas pu analyser le firmware fourni. Cela est généralement dû à des clés obsolètes.", + "he_IL": "ריוג'ינקס לא הצליחה לנתח את הקושחה שסופקה. זה נגרם בדרך כלל על ידי מפתחות לא עדכניים.", + "it_IT": "Ryujinx non è riuscito ad analizzare il firmware. Questo di solito è causato da chiavi non aggiornate.", + "ja_JP": "ファームウェアをパーズできませんでした.通常,古いキーが原因です.", + "ko_KR": "Ryujinx가 제공된 펌웨어를 구문 분석하지 못했습니다. 이는 일반적으로 오래된 키로 인해 발생합니다.", + "no_NO": "Ryujinx klarte ikke å analysere levert fastvare. Dette er vanligvis forårsaket av utdaterte nøkler.", + "pl_PL": "Ryujinx nie był w stanie zparsować dostarczonego firmware'u. Jest to zwykle spowodowane nieaktualnymi kluczami.", + "pt_BR": "Ryujinx não conseguiu ler o Firmware fornecido. Geralmente isso é causado por chaves desatualizadas.", + "ru_RU": "Ryujinx не удалось распаковать выбранную прошивку. Обычно это вызвано устаревшими ключами.", + "sv_SE": "Ryujinx kunde inte tolka angiven firmware. Detta sker oftast med utdaterade nycklar.", + "th_TH": "Ryujinx ไม่สามารถวิเคราะห์เฟิร์มแวร์ที่ให้มาได้ ซึ่งมักมีสาเหตุมาจากคีย์ที่เก่าจนเกินไป", + "tr_TR": "Ryujinx temin edilen firmware'i çözümleyemedi. Bu durum genellikle güncel olmayan keys'den kaynaklanır.", + "uk_UA": "Ryujinx не вдалося проаналізувати прошивку. Зазвичай це спричинено застарілими ключами.", + "zh_CN": "Ryujinx 模拟器无法解密当前固件,一般是由于使用了旧版的密钥导致的。", + "zh_TW": "Ryujinx 無法解析所提供的韌體。這通常是由於金鑰過時造成的。" + } + }, + { + "ID": "UserErrorApplicationNotFoundDescription", + "Translations": { + "ar_SA": "تعذر على ريوجينكس العثور على تطبيق صالح في المسار المحدد.", + "de_DE": "Ryujinx konnte keine valide Anwendung an dem gegeben Pfad finden.", + "el_GR": "Το Ryujinx δεν κατάφερε να εντοπίσει έγκυρη εφαρμογή στη συγκεκριμένη διαδρομή.", + "en_US": "Ryujinx couldn't find a valid application at the given path.", + "es_ES": "Ryujinx no pudo encontrar una aplicación válida en ese camino.", + "fr_FR": "Ryujinx n'a pas pu trouver une application valide dans le chemin indiqué.", + "he_IL": "ריוג'ינקס לא מצאה יישום תקין בנתיב הנתון", + "it_IT": "Ryujinx non è riuscito a trovare un'applicazione valida nel percorso specificato.", + "ja_JP": "指定されたパスに有効なアプリケーションがありませんでした.", + "ko_KR": "Ryujinx가 해당 경로에서 유효한 앱을 찾을 수 없습니다.", + "no_NO": "Ryujinx kunne ikke finne en gyldig applikasjon på den gitte banen.", + "pl_PL": "Ryujinx nie mógł znaleźć prawidłowej aplikacji na podanej ścieżce.", + "pt_BR": "Ryujinx não conseguiu encontrar um aplicativo válido no caminho fornecido.", + "ru_RU": "Ryujinx не удалось найти валидное приложение по указанному пути.", + "sv_SE": "Ryujinx kunde inte hitta en giltig applikation i angiven sökväg.", + "th_TH": "Ryujinx ไม่พบแอปพลิเคชันที่ถูกต้องในที่เก็บไฟล์ที่กำหนด", + "tr_TR": "Ryujinx belirtilen yolda geçerli bir uygulama bulamadı.", + "uk_UA": "Ryujinx не вдалося знайти дійсний застосунок (гру) за вказаним шляхом", + "zh_CN": "Ryujinx 模拟器在所选路径中找不到有效的游戏程序。", + "zh_TW": "Ryujinx 無法在指定路徑下找到有效的應用程式。" + } + }, + { + "ID": "UserErrorUnknownDescription", + "Translations": { + "ar_SA": "حدث خطأ غير معروف!", + "de_DE": "Ein unbekannter Fehler ist aufgetreten!", + "el_GR": "Παρουσιάστηκε άγνωστο σφάλμα.", + "en_US": "An unknown error occured!", + "es_ES": "¡Ocurrió un error desconocido!", + "fr_FR": "Une erreur inconnue est survenue !", + "he_IL": "קרתה שגיאה לא ידועה!", + "it_IT": "Si è verificato un errore sconosciuto!", + "ja_JP": "不明なエラーが発生しました!", + "ko_KR": "알 수 없는 오류가 발생했습니다!", + "no_NO": "En ukjent feil oppstod!", + "pl_PL": "Wystąpił nieznany błąd!", + "pt_BR": "Ocorreu um erro desconhecido!", + "ru_RU": "Произошла неизвестная ошибка", + "sv_SE": "Ett okänt fel inträffade!", + "th_TH": "เกิดข้อผิดพลาดที่ไม่รู้จัก!", + "tr_TR": "Bilinmeyen bir hata oluştu!", + "uk_UA": "Сталася невідома помилка!", + "zh_CN": "出现未知错误!", + "zh_TW": "發生未知錯誤!" + } + }, + { + "ID": "UserErrorUndefinedDescription", + "Translations": { + "ar_SA": "حدث خطأ غير محدد! لا ينبغي أن يحدث هذا، يرجى الاتصال بمطور!", + "de_DE": "Ein undefinierter Fehler ist aufgetreten! Dies sollte nicht passieren. Bitte kontaktiere einen Entwickler!", + "el_GR": "Παρουσιάστηκε ένα άγνωστο σφάλμα! Αυτό δεν πρέπει να συμβεί, παρακαλώ επικοινωνήστε με έναν προγραμματιστή!", + "en_US": "An undefined error occured! This shouldn't happen, please contact a dev!", + "es_ES": "¡Ocurrió un error indefinido! Esto no debería pasar, por favor, ¡contacta con un desarrollador!", + "fr_FR": "Une erreur inconnue est survenue ! Cela ne devrait pas se produire, merci de contacter un développeur !", + "he_IL": "קרתה שגיאה לא מוגדרת! זה לא אמור לקרות, אנא צרו קשר עם מפתח!", + "it_IT": "Si è verificato un errore sconosciuto! Ciò non dovrebbe accadere, contatta uno sviluppatore!", + "ja_JP": "未定義のエラーが発生しました! 発生すべきものではないので,開発者にご連絡ください!", + "ko_KR": "정의되지 않은 오류가 발생했습니다! 이런 일이 발생하면 안 되니 개발자에게 문의하세요!", + "no_NO": "En udefinert feil oppstod! Dette burde ikke skje, vennligst kontakt en utvikler!", + "pl_PL": "Wystąpił niezdefiniowany błąd! To nie powinno się zdarzyć, skontaktuj się z deweloperem!", + "pt_BR": "Um erro indefinido occoreu! Isso não deveria acontecer, por favor contate um desenvolvedor!", + "ru_RU": "Произошла неизвестная ошибка. Этого не должно происходить, пожалуйста, свяжитесь с разработчиками.", + "sv_SE": "Ett odefinierat fel inträffade! Detta ska inte hända. Kontakta en utvecklare!", + "th_TH": "เกิดข้อผิดพลาดที่ไม่สามารถระบุได้! สิ่งนี้ไม่ควรเกิดขึ้น โปรดติดต่อผู้พัฒนา!", + "tr_TR": "Tanımlanmayan bir hata oluştu! Bu durum ile karşılaşılmamalıydı, lütfen bir geliştirici ile iletişime geçin!", + "uk_UA": "Виникла невизначена помилка! Це не повинно було статися. Будь ласка, зверніться до розробника!", + "zh_CN": "出现未定义错误!此类错误不应出现,请联系开发者!", + "zh_TW": "發生未定義錯誤! 這種情況不應該發生,請聯絡開發人員!" + } + }, + { + "ID": "OpenSetupGuideMessage", + "Translations": { + "ar_SA": "فتح دليل الإعداد", + "de_DE": "Öffne den 'Setup Guide'", + "el_GR": "Ανοίξτε τον Οδηγό Εγκατάστασης.", + "en_US": "Open the Setup Guide", + "es_ES": "Abrir la guía de instalación", + "fr_FR": "Ouvrir le guide d'installation", + "he_IL": "פתח מדריך התקנה", + "it_IT": "Apri la guida all'installazione", + "ja_JP": "セットアップガイドを開く", + "ko_KR": "설정 가이드 열기", + "no_NO": "Åpne oppsettsveiledningen", + "pl_PL": "Otwórz Podręcznik Konfiguracji", + "pt_BR": "Abrir o Guia de Configuração", + "ru_RU": "Открыть руководство по установке", + "sv_SE": "Öppna konfigurationsguiden", + "th_TH": "เปิดคู่มือการตั้งค่า", + "tr_TR": "Kurulum Kılavuzunu Aç", + "uk_UA": "Відкрити посібник із налаштування", + "zh_CN": "打开安装指南", + "zh_TW": "開啟設定指南" + } + }, + { + "ID": "NoUpdate", + "Translations": { + "ar_SA": "لا يوجد تحديث", + "de_DE": "Kein Update", + "el_GR": "Καμία Eνημέρωση", + "en_US": "No Update", + "es_ES": "No actualizado", + "fr_FR": "Aucune mise à jour", + "he_IL": "אין עדכון", + "it_IT": "Nessun aggiornamento", + "ja_JP": "アップデートなし", + "ko_KR": "업데이트 없음", + "no_NO": "Ingen oppdatering", + "pl_PL": "Brak Aktualizacji", + "pt_BR": "Sem Atualizações", + "ru_RU": "Без обновлений", + "sv_SE": "Ingen uppdatering", + "th_TH": "ไม่มีการอัปเดต", + "tr_TR": "Güncelleme Yok", + "uk_UA": "НБез оновлень", + "zh_CN": "无更新(默认版本)", + "zh_TW": "沒有更新" + } + }, + { + "ID": "TitleUpdateVersionLabel", + "Translations": { + "ar_SA": "الإصدار: {0}", + "de_DE": "", + "el_GR": "", + "en_US": "Version {0}", + "es_ES": "Versión {0}", + "fr_FR": "", + "he_IL": "גרסה: {0}", + "it_IT": "Versione {0}", + "ja_JP": "バージョン {0}", + "ko_KR": "버전 {0}", + "no_NO": "Versjon {0}", + "pl_PL": "Wersja {0}", + "pt_BR": "Versão {0}", + "ru_RU": "Версия {0}", + "sv_SE": "", + "th_TH": "เวอร์ชั่น {0}", + "tr_TR": "Sürüm {0}", + "uk_UA": "Версія {0}", + "zh_CN": "游戏更新的版本 {0}", + "zh_TW": "版本 {0}" + } + }, + { + "ID": "TitleBundledUpdateVersionLabel", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Bundled: Version {0}", + "es_ES": "Incorporado: Versión {0}", + "fr_FR": "Inclus : Version {0}", + "he_IL": "", + "it_IT": "Incluso: Versione {0}", + "ja_JP": "", + "ko_KR": "번들 : 버전 {0}", + "no_NO": "Pakket: Versjon {0}", + "pl_PL": "", + "pt_BR": "Empacotado: Versão {0}", + "ru_RU": "Баднл: Версия {0}", + "sv_SE": "Bundlad: Version {0}", + "th_TH": "Bundled: เวอร์ชั่น {0}", + "tr_TR": "", + "uk_UA": "Комплектні: Версія {0}", + "zh_CN": "捆绑:版本 {0}", + "zh_TW": "附帶: 版本 {0}" + } + }, + { + "ID": "TitleBundledDlcLabel", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Bundled:", + "es_ES": "Incorporado:", + "fr_FR": "Inclus :", + "he_IL": "", + "it_IT": "Incluso:", + "ja_JP": "", + "ko_KR": "번들 :", + "no_NO": "Pakket:", + "pl_PL": "", + "pt_BR": "Empacotado:", + "ru_RU": "Бандл:", + "sv_SE": "Bundlad:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Комплектні:", + "zh_CN": "捆绑:", + "zh_TW": "附帶:" + } + }, + { + "ID": "TitleXCIStatusPartialLabel", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Partial", + "es_ES": "Parcial", + "fr_FR": "Partiel", + "he_IL": "", + "it_IT": "Parziale", + "ja_JP": "", + "ko_KR": "일부", + "no_NO": "Delvis", + "pl_PL": "", + "pt_BR": "Parcial", + "ru_RU": "Частично", + "sv_SE": "Delvis", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Часткові", + "zh_CN": "分区", + "zh_TW": "部分" + } + }, + { + "ID": "TitleXCIStatusTrimmableLabel", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Untrimmed", + "es_ES": "Sin recortar", + "fr_FR": "Non réduit", + "he_IL": "", + "it_IT": "Dim. originale", + "ja_JP": "", + "ko_KR": "트리밍되지 않음", + "no_NO": "Ikke trimmet", + "pl_PL": "", + "pt_BR": "Não Reduzido", + "ru_RU": "Не обрезан", + "sv_SE": "Orörd", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Необрізані", + "zh_CN": "没有瘦身的", + "zh_TW": "未修剪" + } + }, + { + "ID": "TitleXCIStatusUntrimmableLabel", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Trimmed", + "es_ES": "Recortado", + "fr_FR": "Réduit", + "he_IL": "", + "it_IT": "Dim. ridotta", + "ja_JP": "", + "ko_KR": "트리밍됨", + "no_NO": "Trimmet", + "pl_PL": "", + "pt_BR": "Reduzido", + "ru_RU": "Обрезан", + "sv_SE": "Optimerad", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Обрізані", + "zh_CN": "经过瘦身的", + "zh_TW": "已修剪" + } + }, + { + "ID": "TitleXCIStatusFailedLabel", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "(Failed)", + "es_ES": "(Fallido)", + "fr_FR": "(Échoué)", + "he_IL": "", + "it_IT": "(Fallito)", + "ja_JP": "", + "ko_KR": "(실패)", + "no_NO": "(Mislyktes)", + "pl_PL": "", + "pt_BR": "Falhou", + "ru_RU": "(Ошибка)", + "sv_SE": "(misslyckades)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "(Невдача)", + "zh_CN": "(失败)", + "zh_TW": "(失敗)" + } + }, + { + "ID": "TitleXCICanSaveLabel", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Save {0:n0} Mb", + "es_ES": "Ahorra {0:n0} Mb", + "fr_FR": "Économiser {0:n0} Mo", + "he_IL": "", + "it_IT": "Risparmia {0:n0} MB", + "ja_JP": "", + "ko_KR": "{0:n0} Mb 저장", + "no_NO": "Spare {0:n0} Mb", + "pl_PL": "", + "pt_BR": "Salvar {0:n0} Mb", + "ru_RU": "Сохранить {0:n0} Мб", + "sv_SE": "Spara {0:n0} Mb", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Зберегти {0:n0} Мб", + "zh_CN": "能节约 {0:n0} Mb", + "zh_TW": "可節省 {0:n0} Mb" + } + }, + { + "ID": "TitleXCISavingLabel", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Saved {0:n0} Mb", + "es_ES": "{0:n0} Mb ahorrado(s)", + "fr_FR": "Économisé {0:n0} Mo", + "he_IL": "", + "it_IT": "Risparmiati {0:n0} MB", + "ja_JP": "", + "ko_KR": "{0:n0}Mb 저장됨", + "no_NO": "Spart {0:n0} Mb", + "pl_PL": "", + "pt_BR": "Salvo {0:n0} Mb", + "ru_RU": "Сохранено {0:n0} Мб", + "sv_SE": "Sparade {0:n0} Mb", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Збережено {0:n0} Мб", + "zh_CN": "节约了 {0:n0} Mb", + "zh_TW": "已節省 {0:n0} Mb" + } + }, + { + "ID": "RyujinxInfo", + "Translations": { + "ar_SA": "{0} - معلومات", + "de_DE": "", + "el_GR": "{0} - Πληροφορίες", + "en_US": "{0} - Info", + "es_ES": "", + "fr_FR": "", + "he_IL": "{0} - מידע", + "it_IT": "{0} - Informazioni", + "ja_JP": "{0} - 情報", + "ko_KR": "{0} - 정보", + "no_NO": "{0} - Informasjon", + "pl_PL": "", + "pt_BR": "{0} - Informação", + "ru_RU": "{0} - Информация", + "sv_SE": "{0} - Information", + "th_TH": "{0} – ข้อมูล", + "tr_TR": "{0} - Bilgi", + "uk_UA": "{0} - Інформація", + "zh_CN": "{0} - 信息", + "zh_TW": "{0} - 資訊" + } + }, + { + "ID": "RyujinxConfirm", + "Translations": { + "ar_SA": "{0} - تأكيد", + "de_DE": "{0} - Bestätigung", + "el_GR": "{0} - Επιβεβαίωση", + "en_US": "{0} - Confirmation", + "es_ES": "{0} - Confirmación", + "fr_FR": "", + "he_IL": "{0} - אישור", + "it_IT": "{0} - Conferma", + "ja_JP": "{0} - 確認", + "ko_KR": "{0} - 확인", + "no_NO": "{0} - Bekreftelse", + "pl_PL": "{0} - Potwierdzenie", + "pt_BR": "{0} - Confirmação", + "ru_RU": "{0} - Подтверждение", + "sv_SE": "{0} - Bekräfta", + "th_TH": "{0} - ยืนยัน", + "tr_TR": "{0} - Doğrulama", + "uk_UA": "{0} - Підтвердження", + "zh_CN": "{0} - 确认", + "zh_TW": "{0} - 確認" + } + }, + { + "ID": "FileDialogAllTypes", + "Translations": { + "ar_SA": "كل الأنواع", + "de_DE": "Alle Typen", + "el_GR": "Όλοι οι τύποι", + "en_US": "All types", + "es_ES": "Todos los tipos", + "fr_FR": "Tous les types", + "he_IL": "כל הסוגים", + "it_IT": "Tutti i tipi", + "ja_JP": "すべての種別", + "ko_KR": "모든 형식", + "no_NO": "Alle typer", + "pl_PL": "Wszystkie typy", + "pt_BR": "Todos os tipos", + "ru_RU": "Все типы", + "sv_SE": "Alla typer", + "th_TH": "ทุกประเภท", + "tr_TR": "Tüm türler", + "uk_UA": "Всі типи", + "zh_CN": "全部类型", + "zh_TW": "全部類型" + } + }, + { + "ID": "Never", + "Translations": { + "ar_SA": "مطلقا", + "de_DE": "Niemals", + "el_GR": "Ποτέ", + "en_US": "Never", + "es_ES": "Nunca", + "fr_FR": "Jamais", + "he_IL": "אף פעם", + "it_IT": "Mai", + "ja_JP": "決して", + "ko_KR": "절대 안 함", + "no_NO": "Aldri", + "pl_PL": "Nigdy", + "pt_BR": "Nunca", + "ru_RU": "Никогда", + "sv_SE": "Aldrig", + "th_TH": "ไม่ต้อง", + "tr_TR": "Hiçbir Zaman", + "uk_UA": "Ніколи", + "zh_CN": "从不", + "zh_TW": "從不" + } + }, + { + "ID": "SwkbdMinCharacters", + "Translations": { + "ar_SA": "يجب أن يبلغ طوله {0} حرفا على الأقل", + "de_DE": "Muss mindestens {0} Zeichen lang sein", + "el_GR": "Πρέπει να έχει μήκος τουλάχιστον {0} χαρακτήρες", + "en_US": "Must be at least {0} characters long", + "es_ES": "Debe tener al menos {0} caracteres", + "fr_FR": "Doit comporter au moins {0} caractères", + "he_IL": "לפחות {0} תווים", + "it_IT": "Non può avere meno di {0} caratteri", + "ja_JP": "最低 {0} 文字必要です", + "ko_KR": "{0}자 이상이어야 함", + "no_NO": "Må være minimum {0} tegn lang", + "pl_PL": "Musi mieć co najmniej {0} znaków", + "pt_BR": "Deve ter pelo menos {0} caracteres", + "ru_RU": "Должно быть не менее {0} символов.", + "sv_SE": "Får endast vara minst {0} tecken långt", + "th_TH": "ต้องมีความยาวของตัวอักษรอย่างน้อย {0} ตัว", + "tr_TR": "En az {0} karakter uzunluğunda olmalı", + "uk_UA": "Мінімальна кількість символів: {0}", + "zh_CN": "不少于 {0} 个字符", + "zh_TW": "長度必須至少為 {0} 個字元" + } + }, + { + "ID": "SwkbdMinRangeCharacters", + "Translations": { + "ar_SA": "يجب أن يتكون من {0}-{1} حرفا", + "de_DE": "Muss {0}-{1} Zeichen lang sein", + "el_GR": "Πρέπει να έχει μήκος {0}-{1} χαρακτήρες", + "en_US": "Must be {0}-{1} characters long", + "es_ES": "Debe tener {0}-{1} caracteres", + "fr_FR": "Doit comporter entre {0} et {1} caractères", + "he_IL": "באורך {0}-{1} תווים", + "it_IT": "Può avere da {0} a {1} caratteri", + "ja_JP": "{0}-{1} 文字にしてください", + "ko_KR": "{0}-{1}자 길이여야 함", + "no_NO": "Må være {0}-{1} tegn", + "pl_PL": "Musi mieć długość od {0}-{1} znaków", + "pt_BR": "Deve ter entre {0}-{1} caracteres", + "ru_RU": "Должно быть {0}-{1} символов", + "sv_SE": "Får endast vara {0}-{1} tecken långt", + "th_TH": "ต้องมีความยาวของตัวอักษร {0}-{1} ตัว", + "tr_TR": "{0}-{1} karakter uzunluğunda olmalı", + "uk_UA": "Має бути {0}-{1} символів", + "zh_CN": "必须为 {0}-{1} 个字符", + "zh_TW": "長度必須為 {0} 到 {1} 個字元" + } + }, + { + "ID": "CabinetTitle", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Cabinet Dialog", + "es_ES": "Diálogo Gabinete", + "fr_FR": "Dialogue de Cabinet", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "캐비닛 대화 상자", + "no_NO": "Dialogboks for kabinett", + "pl_PL": "", + "pt_BR": "Diálogo do Gabinete", + "ru_RU": "Сообщение кабинета", + "sv_SE": "Cabinet-dialog", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Сповіщення Cabinet", + "zh_CN": "档案对话框", + "zh_TW": "Cabinet 對話方塊" + } + }, + { + "ID": "CabinetDialog", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Enter your Amiibo's new name", + "es_ES": "Ingresa el nuevo nombre de tu Amiibo", + "fr_FR": "Entrer le nouveau nom de votre Amiibo", + "he_IL": "", + "it_IT": "Inserisci il nuovo nome del tuo Amiibo", + "ja_JP": "", + "ko_KR": "Amiibo의 새 이름 입력하기", + "no_NO": "Skriv inn Amiiboens nye navn", + "pl_PL": "", + "pt_BR": "Digite o novo nome do seu Amiibo", + "ru_RU": "Введите новое имя вашего Amiibo", + "sv_SE": "Ange nya namnet för din Amiibo", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вкажіть Ваше нове ім'я Amiibo", + "zh_CN": "输入你的 Amiibo 的新名字", + "zh_TW": "輸入 Amiibo 的新名稱" + } + }, + { + "ID": "CabinetScanDialog", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Please scan your Amiibo now.", + "es_ES": "Escanea tu Amiibo ahora.", + "fr_FR": "Veuillez scannez votre Amiibo.", + "he_IL": "", + "it_IT": "Scansiona ora il tuo Amiibo.", + "ja_JP": "", + "ko_KR": "지금 Amiibo를 스캔하세요.", + "no_NO": "Vennligst skann Amiiboene dine nå.", + "pl_PL": "", + "pt_BR": "Por favor, escaneie seu Amiibo agora.", + "ru_RU": "Пожалуйста, отсканируйте свой Amiibo.", + "sv_SE": "Skanna din Amiibo nu.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Будь ласка, проскануйте Ваш Amiibo.", + "zh_CN": "请现在扫描你的 Amiibo", + "zh_TW": "請掃描你的 Amiibo。" + } + }, + { + "ID": "SoftwareKeyboard", + "Translations": { + "ar_SA": "لوحة المفاتيح البرمجية", + "de_DE": "Software-Tastatur", + "el_GR": "Εικονικό Πληκτρολόγιο", + "en_US": "Software Keyboard", + "es_ES": "Teclado de software", + "fr_FR": "Clavier logiciel", + "he_IL": "מקלדת וירטואלית", + "it_IT": "Tastiera software", + "ja_JP": "ソフトウェアキーボード", + "ko_KR": "소프트웨어 키보드", + "no_NO": "Programvare Tastatur", + "pl_PL": "Klawiatura Oprogramowania", + "pt_BR": "Teclado por Software", + "ru_RU": "Программная клавиатура", + "sv_SE": "Programvarutangentbord", + "th_TH": "ซอฟต์แวร์คีย์บอร์ด", + "tr_TR": "Yazılım Klavyesi", + "uk_UA": "Програмна клавіатура", + "zh_CN": "软键盘", + "zh_TW": "軟體鍵盤" + } + }, + { + "ID": "SoftwareKeyboardModeNumeric", + "Translations": { + "ar_SA": "يجب أن يكون 0-9 أو '.' فقط", + "de_DE": "Darf nur 0-9 oder \".\" sein", + "el_GR": "Πρέπει να είναι 0-9 ή '.' μόνο", + "en_US": "Must be 0-9 or '.' only", + "es_ES": "Debe ser sólo 0-9 o '.'", + "fr_FR": "Doit être 0-9 ou '.' uniquement", + "he_IL": "חייב להיות בין 0-9 או '.' בלבד", + "it_IT": "Può contenere solo numeri o '.'", + "ja_JP": "0-9 または '.' のみでなければなりません", + "ko_KR": "0-9 또는 '.'만 가능", + "no_NO": "Må kun være 0-9 eller '.'", + "pl_PL": "Może składać się jedynie z 0-9 lub '.'", + "pt_BR": "Deve ser somente 0-9 ou '.'", + "ru_RU": "Должно быть в диапазоне 0-9 или '.'", + "sv_SE": "Får endast vara 0-9 eller '.'", + "th_TH": "ต้องเป็น 0-9 หรือ '.' เท่านั้น", + "tr_TR": "Sadece 0-9 veya '.' olabilir", + "uk_UA": "Повинно бути лише 0-9 або “.”", + "zh_CN": "只能输入 0-9 或 \".\"", + "zh_TW": "必須是 0 到 9 或「.」" + } + }, + { + "ID": "SoftwareKeyboardModeAlphabet", + "Translations": { + "ar_SA": "يجب أن تكون الأحرف غير CJK فقط", + "de_DE": "Keine CJK-Zeichen", + "el_GR": "Πρέπει να μην είναι μόνο χαρακτήρες CJK", + "en_US": "Must be non CJK-characters only", + "es_ES": "Solo deben ser caracteres no CJK", + "fr_FR": "Doit être uniquement des caractères non CJK", + "he_IL": "מחויב להיות ללא אותיות CJK", + "it_IT": "Può contenere solo caratteri non CJK", + "ja_JP": "CJK文字以外のみ", + "ko_KR": "CJK 문자가 아닌 문자만 가능", + "no_NO": "Må kun være uten CJK-tegn", + "pl_PL": "Nie może zawierać znaków CJK", + "pt_BR": "Apenas devem ser caracteres não CJK.", + "ru_RU": "Не должно быть CJK-символов", + "sv_SE": "Får endast vara icke-CJK-tecken", + "th_TH": "ต้องเป็นตัวอักษรที่ไม่ใช่ประเภท CJK เท่านั้น", + "tr_TR": "Sadece CJK-characters olmayan karakterler olabilir", + "uk_UA": "Повинно бути лише не CJK-символи", + "zh_CN": "仅支持非中文字符", + "zh_TW": "必須是「非中日韓字元」 (non CJK)" + } + }, + { + "ID": "SoftwareKeyboardModeASCII", + "Translations": { + "ar_SA": "يجب أن يكون نص ASCII فقط", + "de_DE": "Nur ASCII-Text", + "el_GR": "Πρέπει να είναι μόνο κείμενο ASCII", + "en_US": "Must be ASCII text only", + "es_ES": "Solo deben ser texto ASCII", + "fr_FR": "Doit être uniquement du texte ASCII", + "he_IL": "מחויב להיות טקסט אסקיי", + "it_IT": "Può contenere solo testo ASCII", + "ja_JP": "ASCII文字列のみ", + "ko_KR": "ASCII 텍스트만 가능", + "no_NO": "Må være kun ASCII-tekst", + "pl_PL": "Musi zawierać tylko tekst ASCII", + "pt_BR": "Deve ser apenas texto ASCII", + "ru_RU": "Текст должен быть только в ASCII кодировке", + "sv_SE": "Får endast vara ASCII-text", + "th_TH": "ต้องเป็นตัวอักษร ASCII เท่านั้น", + "tr_TR": "Sadece ASCII karakterler olabilir", + "uk_UA": "Повинно бути лише ASCII текст", + "zh_CN": "仅支持 ASCII 字符", + "zh_TW": "必須是 ASCII 文字" + } + }, + { + "ID": "ControllerAppletControllers", + "Translations": { + "ar_SA": "وحدات التحكم المدعومة:", + "de_DE": "Unterstützte Controller:", + "el_GR": "", + "en_US": "Supported Controllers:", + "es_ES": "Controladores Compatibles:", + "fr_FR": "Contrôleurs pris en charge :", + "he_IL": "בקרים נתמכים:", + "it_IT": "Controller supportati:", + "ja_JP": "サポートされているコントローラ:", + "ko_KR": "지원되는 컨트롤러 :", + "no_NO": "Støttede kontrollere:", + "pl_PL": "Obsługiwane Kontrolery:", + "pt_BR": "Controladores Suportados:", + "ru_RU": "Поддерживаемые геймпады:", + "sv_SE": "Handkontroller som stöds:", + "th_TH": "คอนโทรลเลอร์ที่รองรับ:", + "tr_TR": "Desteklenen Kumandalar:", + "uk_UA": "Підтримувані контролери:", + "zh_CN": "支持的手柄:", + "zh_TW": "支援的控制器:" + } + }, + { + "ID": "ControllerAppletPlayers", + "Translations": { + "ar_SA": "اللاعبين:", + "de_DE": "Spieler:", + "el_GR": "", + "en_US": "Players:", + "es_ES": "Jugadores:", + "fr_FR": "Joueurs :", + "he_IL": "שחקנים:", + "it_IT": "Giocatori:", + "ja_JP": "プレイヤー:", + "ko_KR": "플레이어 :", + "no_NO": "Spillere:", + "pl_PL": "Gracze:", + "pt_BR": "Jogadores:", + "ru_RU": "Игроки:", + "sv_SE": "Spelare:", + "th_TH": "ผู้เล่น:", + "tr_TR": "Oyuncular:", + "uk_UA": "Гравці:", + "zh_CN": "玩家:", + "zh_TW": "玩家:" + } + }, + { + "ID": "ControllerAppletDescription", + "Translations": { + "ar_SA": "الإعدادات الحالية غير صالحة. افتح الإعدادات وأعد تكوين المدخلات الخاصة بك.", + "de_DE": "Ihre aktuelle Konfiguration ist ungültig. Öffnen Sie die Einstellungen und konfigurieren Sie Ihre Eingaben neu.", + "el_GR": "", + "en_US": "Your current configuration is invalid. Open settings and reconfigure your inputs.", + "es_ES": "Tu configuración actual no es válida. Abre la configuración y vuelve a configurar tus entradas", + "fr_FR": "Votre configuration actuelle n'est pas valide. Ouvrez les paramètres et reconfigurez vos contrôles.", + "he_IL": "התצורה הנוכחית אינה תקינה. פתח הגדרות והגדר מחדש את הקלטים שלך.", + "it_IT": "La configurazione corrente non è valida. Aprire le impostazioni e riconfigurare gli input.", + "ja_JP": "現在の設定は無効です. 設定を開いて入力を再設定してください.", + "ko_KR": "현재 구성이 유효하지 않습니다. 설정을 열고 입력을 다시 구성하십시오.", + "no_NO": "Din nåværende konfigurasjon er ugyldig. Åpne innstillinger og konfigurer inndata.", + "pl_PL": "Twoja aktualna konfiguracja jest nieprawidłowa. Otwórz ustawienia i skonfiguruj swoje wejścia.", + "pt_BR": "Sua configuração atual é inválida. Abra as configurações e reconfigure suas entradas.", + "ru_RU": "Текущая конфигурация некорректна. Откройте параметры и перенастройте управление.", + "sv_SE": "Din aktuella konfiguration är ogiltig. Öppna inställningarna och konfigurera om din inmatning.", + "th_TH": "การกำหนดค่าปัจจุบันของคุณไม่ถูกต้อง กรุณาเปิดการตั้งค่าและกำหนดค่าอินพุตของคุณใหม่", + "tr_TR": "Halihazırdaki konfigürasyonunuz geçersiz. Ayarları açın ve girişlerinizi yeniden konfigüre edin.", + "uk_UA": "Поточна конфігурація невірна. Відкрийте налаштування та переналаштуйте Ваші дані.", + "zh_CN": "您当前的输入配置无效。打开设置并重新设置您的输入选项。", + "zh_TW": "您目前的配置無效。開啟設定並重新配置輸入。" + } + }, + { + "ID": "ControllerAppletDocked", + "Translations": { + "ar_SA": "تم ضبط وضع تركيب بالمنصة. يجب تعطيل التحكم المحمول.", + "de_DE": "Andockmodus gesetzt. Handheld-Steuerung sollte deaktiviert worden sein.", + "el_GR": "", + "en_US": "Docked mode set. Handheld control should be disabled.", + "es_ES": "Modo acoplado activado. El modo portátil debería estar desactivado.", + "fr_FR": "Mode station d'accueil défini. Le mode contrôle portable doit être désactivé.", + "he_IL": "מצב עגינה מוגדר. כדאי ששליטה ניידת תהיה מושבתת.", + "it_IT": "Modalità TV attivata. Gli input della modalità portatile dovrebbero essere disabilitati.", + "ja_JP": "ドッキングモードが設定されています. 携帯コントロールは無効にする必要があります.", + "ko_KR": "도킹 모드가 설정되었습니다. 휴대용 제어 기능을 비활성화해야 합니다.", + "no_NO": "Docked modus. Håndholdt kontroll skal være deaktivert.", + "pl_PL": "Ustawiony tryb zadokowany. Sterowanie przenośne powinno być wyłączone.", + "pt_BR": "Modo TV definido. O controle portátil deve ser desabilitado.", + "ru_RU": "Используется стационарный режим. Управление в портативном режиме должно быть отключено.", + "sv_SE": "Dockat läge angivet. Handhållna kontroller bör inaktiveras.", + "th_TH": "ตั้งค่าด็อกโหมด ควรปิดใช้งานการควบคุมแบบแฮนด์เฮลด์", + "tr_TR": "Docked mod ayarlandı. Portatif denetim devre dışı bırakılmalı.", + "uk_UA": "Встановлений режим в док-станції. Вимкніть портативні контролери.", + "zh_CN": "已经设置为主机模式,应禁用掌机手柄操控。", + "zh_TW": "已設定底座模式。手提控制應該停用。" + } + }, + { + "ID": "UpdaterRenaming", + "Translations": { + "ar_SA": "إعادة تسمية الملفات القديمة...", + "de_DE": "Alte Dateien umbenennen...", + "el_GR": "Μετονομασία Παλαιών Αρχείων...", + "en_US": "Renaming Old Files...", + "es_ES": "Renombrando archivos viejos...", + "fr_FR": "Renommage des anciens fichiers...", + "he_IL": "משנה שמות של קבצים ישנים...", + "it_IT": "Ridenominazione dei vecchi file...", + "ja_JP": "古いファイルをリネーム中...", + "ko_KR": "오래된 파일 이름 바꾸기...", + "no_NO": "Omdøper gamle filer...", + "pl_PL": "Zmienianie Nazw Starych Plików...", + "pt_BR": "Renomeando arquivos antigos...", + "ru_RU": "Переименование старых файлов...", + "sv_SE": "Byter namn på gamla filer...", + "th_TH": "กำลังเปลี่ยนชื่อไฟล์เก่า...", + "tr_TR": "Eski dosyalar yeniden adlandırılıyor...", + "uk_UA": "Перейменування старих файлів...", + "zh_CN": "正在重命名旧文件...", + "zh_TW": "正在重新命名舊檔案..." + } + }, + { + "ID": "UpdaterRenameFailed", + "Translations": { + "ar_SA": "المحدث غير قادر على إعادة تسمية الملف: {0}", + "de_DE": "Der Updater konnte die folgende Datei nicht umbenennen: {0}", + "el_GR": "Δεν ήταν δυνατή η μετονομασία του αρχείου: {0}", + "en_US": "Updater was unable to rename file: {0}", + "es_ES": "El actualizador no pudo renombrar el archivo: {0}", + "fr_FR": "Impossible de renommer le fichier : {0}", + "he_IL": "המעדכן לא הצליח לשנות את שם הקובץ: {0}", + "it_IT": "Non è stato possibile rinominare il file: {0}", + "ja_JP": "ファイルをリネームできませんでした: {0}", + "ko_KR": "업데이터가 파일 이름을 바꿀 수 없음 : {0}", + "no_NO": "Oppdateringen kunne ikke gi filen nytt navn: {0}", + "pl_PL": "Aktualizator nie mógł zmienić nazwy pliku: {0}", + "pt_BR": "O atualizador não conseguiu renomear o arquivo: {0}", + "ru_RU": "Программе обновления не удалось переименовать файл: {0}", + "sv_SE": "Uppdateraren kunde inte byta namn på filen: {0}", + "th_TH": "โปรแกรมอัปเดตไม่สามารถเปลี่ยนชื่อไฟล์ได้: {0}", + "tr_TR": "Güncelleyici belirtilen dosyayı yeniden adlandıramadı: {0}", + "uk_UA": "Програмі оновлення не вдалося перейменувати файл: {0}", + "zh_CN": "更新过程中无法重命名文件:{0}", + "zh_TW": "更新程式無法重新命名檔案: {0}" + } + }, + { + "ID": "UpdaterAddingFiles", + "Translations": { + "ar_SA": "إضافة ملفات جديدة...", + "de_DE": "Neue Dateien hinzufügen...", + "el_GR": "Προσθήκη Νέων Αρχείων...", + "en_US": "Adding New Files...", + "es_ES": "Añadiendo nuevos archivos...", + "fr_FR": "Ajout des nouveaux fichiers...", + "he_IL": "מוסיף קבצים חדשים...", + "it_IT": "Aggiunta dei nuovi file...", + "ja_JP": "新規ファイルを追加中...", + "ko_KR": "새 파일 추가...", + "no_NO": "Legger til nye filer...", + "pl_PL": "Dodawanie Nowych Plików...", + "pt_BR": "Adicionando Novos Arquivos...", + "ru_RU": "Добавление новых файлов...", + "sv_SE": "Lägger till nya filer...", + "th_TH": "กำลังเพิ่มไฟล์ใหม่...", + "tr_TR": "Yeni Dosyalar Ekleniyor...", + "uk_UA": "Додавання нових файлів...", + "zh_CN": "安装更新中...", + "zh_TW": "正在加入新檔案..." + } + }, + { + "ID": "UpdaterExtracting", + "Translations": { + "ar_SA": "استخراج التحديث...", + "de_DE": "Update extrahieren...", + "el_GR": "Εξαγωγή Ενημέρωσης...", + "en_US": "Extracting Update...", + "es_ES": "Extrayendo actualización...", + "fr_FR": "Extraction de la mise à jour…", + "he_IL": "מחלץ עדכון...", + "it_IT": "Estrazione dell'aggiornamento...", + "ja_JP": "アップデートを展開中...", + "ko_KR": "업데이트 추출...", + "no_NO": "Pakker ut oppdatering...", + "pl_PL": "Wypakowywanie Aktualizacji...", + "pt_BR": "Extraíndo Atualização...", + "ru_RU": "Извлечение обновления...", + "sv_SE": "Extraherar uppdatering...", + "th_TH": "กำลังแยกการอัปเดต...", + "tr_TR": "Güncelleme Ayrıştırılıyor...", + "uk_UA": "Видобування оновлення...", + "zh_CN": "正在提取更新...", + "zh_TW": "正在提取更新..." + } + }, + { + "ID": "UpdaterDownloading", + "Translations": { + "ar_SA": "تحميل التحديث...", + "de_DE": "Update herunterladen...", + "el_GR": "Λήψη Ενημέρωσης...", + "en_US": "Downloading Update...", + "es_ES": "Descargando actualización...", + "fr_FR": "Téléchargement de la mise à jour...", + "he_IL": "מוריד עדכון...", + "it_IT": "Download dell'aggiornamento...", + "ja_JP": "アップデートをダウンロード中...", + "ko_KR": "업데이트 내려받는 중...", + "no_NO": "Laster ned oppdatering...", + "pl_PL": "Pobieranie Aktualizacji...", + "pt_BR": "Baixando Atualização...", + "ru_RU": "Загрузка обновления...", + "sv_SE": "Hämtar uppdatering...", + "th_TH": "กำลังดาวน์โหลดอัปเดต...", + "tr_TR": "Güncelleme İndiriliyor...", + "uk_UA": "Завантаження оновлення...", + "zh_CN": "下载更新中...", + "zh_TW": "正在下載更新..." + } + }, + { + "ID": "Docked", + "Translations": { + "ar_SA": "تركيب بالمنصة", + "de_DE": "", + "el_GR": "Προσκολλημένο", + "en_US": "Docked", + "es_ES": "Dock/TV", + "fr_FR": "Mode Docké", + "he_IL": "בתחנת עגינה", + "it_IT": "TV", + "ja_JP": "ドッキング", + "ko_KR": "도킹", + "no_NO": "Forankret", + "pl_PL": "Zadokowany", + "pt_BR": "Dock/TV", + "ru_RU": "Стационарный режим", + "sv_SE": "Dockad", + "th_TH": "ด็อก", + "tr_TR": "", + "uk_UA": "Док-станція", + "zh_CN": "主机模式", + "zh_TW": "底座模式" + } + }, + { + "ID": "Handheld", + "Translations": { + "ar_SA": "محمول", + "de_DE": "", + "el_GR": "Χειροκίνητο", + "en_US": "Handheld", + "es_ES": "Portátil", + "fr_FR": "Mode Portable", + "he_IL": "נייד", + "it_IT": "Portatile", + "ja_JP": "携帯", + "ko_KR": "휴대", + "no_NO": "Håndholdt", + "pl_PL": "Przenośny", + "pt_BR": "Portátil", + "ru_RU": "Портативный режим", + "sv_SE": "Handhållen", + "th_TH": "แฮนด์เฮลด์", + "tr_TR": "El tipi", + "uk_UA": "Портативний", + "zh_CN": "掌机模式", + "zh_TW": "手提模式" + } + }, + { + "ID": "ConnectionError", + "Translations": { + "ar_SA": "خطأ في الاتصال", + "de_DE": "Verbindungsfehler.", + "el_GR": "Σφάλμα Σύνδεσης.", + "en_US": "Connection Error.", + "es_ES": "Error de conexión.", + "fr_FR": "Erreur de connexion.", + "he_IL": "שגיאת חיבור", + "it_IT": "Errore di connessione.", + "ja_JP": "接続エラー.", + "ko_KR": "연결 오류가 발생했습니다.", + "no_NO": "Tilkoblingsfeil", + "pl_PL": "Błąd Połączenia.", + "pt_BR": "Erro de Conexão.", + "ru_RU": "Ошибка соединения", + "sv_SE": "Anslutningsfel.", + "th_TH": "การเชื่อมต่อล้มเหลว", + "tr_TR": "Bağlantı Hatası.", + "uk_UA": "Помилка з'єднання.", + "zh_CN": "连接错误。", + "zh_TW": "連線錯誤。" + } + }, + { + "ID": "AboutPageDeveloperListMore", + "Translations": { + "ar_SA": "{0} والمزيد...", + "de_DE": "{0} und mehr...", + "el_GR": "{0} και περισσότερα...", + "en_US": "{0} and more...", + "es_ES": "{0} y más...", + "fr_FR": "{0} et plus...", + "he_IL": "{0} ועוד...", + "it_IT": "{0} e altri ancora...", + "ja_JP": "{0}, その他大勢...", + "ko_KR": "{0} 외...", + "no_NO": "{0} og mer...", + "pl_PL": "{0} i więcej...", + "pt_BR": "{0} e mais...", + "ru_RU": "{0} и другие...", + "sv_SE": "{0} och fler...", + "th_TH": "{0} และอื่นๆ ...", + "tr_TR": "{0} ve daha fazla...", + "uk_UA": "{0} та інші...", + "zh_CN": "{0} 等开发者...", + "zh_TW": "{0} 等人..." + } + }, + { + "ID": "ApiError", + "Translations": { + "ar_SA": "خطأ في API.", + "de_DE": "API Fehler.", + "el_GR": "Σφάλμα API.", + "en_US": "API Error.", + "es_ES": "Error de API.", + "fr_FR": "Erreur API.", + "he_IL": "שגיאת ממשק.", + "it_IT": "Errore dell'API.", + "ja_JP": "API エラー.", + "ko_KR": "API 오류.", + "no_NO": "API feil.", + "pl_PL": "Błąd API.", + "pt_BR": "Erro de API.", + "ru_RU": "Ошибка API.", + "sv_SE": "API-fel.", + "th_TH": "ข้อผิดพลาดของ API", + "tr_TR": "API Hatası.", + "uk_UA": "Помилка API.", + "zh_CN": "API 错误。", + "zh_TW": "API 錯誤。" + } + }, + { + "ID": "LoadingHeading", + "Translations": { + "ar_SA": "جاري تحميل {0}", + "de_DE": "{0} wird gestartet", + "el_GR": "Φόρτωση {0}", + "en_US": "Loading {0}", + "es_ES": "Cargando {0}", + "fr_FR": "Chargement {0}", + "he_IL": "טוען {0}", + "it_IT": "Caricamento di {0}", + "ja_JP": "ロード中: {0}", + "ko_KR": "{0} 불러오는 중", + "no_NO": "Laster {0}", + "pl_PL": "Wczytywanie {0}", + "pt_BR": "Carregando {0}", + "ru_RU": "Загрузка {0}", + "sv_SE": "Läser in {0}", + "th_TH": "กำลังโหลด {0}", + "tr_TR": "{0} Yükleniyor", + "uk_UA": "Завантаження {0}", + "zh_CN": "正在启动 {0}", + "zh_TW": "正在載入 {0}" + } + }, + { + "ID": "CompilingPPTC", + "Translations": { + "ar_SA": "تجميع الـ‫(PPTC)", + "de_DE": "PPTC wird kompiliert", + "el_GR": "Μεταγλώττιση του PPTC", + "en_US": "Compiling PPTC", + "es_ES": "Compilando PPTC", + "fr_FR": "Compilation PPTC", + "he_IL": "קימפול PPTC", + "it_IT": "Compilazione PPTC", + "ja_JP": "PPTC をコンパイル中", + "ko_KR": "PPTC 컴파일", + "no_NO": "Sammensetter PPTC", + "pl_PL": "Kompilowanie PPTC", + "pt_BR": "Compilando PPTC", + "ru_RU": "Компиляция PPTC", + "sv_SE": "Kompilerar PPTC", + "th_TH": "กำลังคอมไพล์ PPTC", + "tr_TR": "PPTC Derleniyor", + "uk_UA": "Компіляція PPTC", + "zh_CN": "编译 PPTC 缓存中", + "zh_TW": "正在編譯 PPTC" + } + }, + { + "ID": "CompilingShaders", + "Translations": { + "ar_SA": "تجميع المظللات", + "de_DE": "Shader werden kompiliert", + "el_GR": "Σύνταξη των Shaders", + "en_US": "Compiling Shaders", + "es_ES": "Compilando sombreadores", + "fr_FR": "Compilation des shaders", + "he_IL": "קימפול הצללות", + "it_IT": "Compilazione degli shader", + "ja_JP": "シェーダーをコンパイル中", + "ko_KR": "셰이더 컴파일", + "no_NO": "Samler Shaders", + "pl_PL": "Kompilowanie Shaderów", + "pt_BR": "Compilando Shaders", + "ru_RU": "Компиляция шейдеров", + "sv_SE": "Kompilerar shaders", + "th_TH": "กำลังคอมไพล์ พื้นผิวและแสงเงา", + "tr_TR": "Shaderlar Derleniyor", + "uk_UA": "Компіляція шейдерів", + "zh_CN": "编译着色器中", + "zh_TW": "正在編譯著色器" + } + }, + { + "ID": "AllKeyboards", + "Translations": { + "ar_SA": "كل لوحات المفاتيح", + "de_DE": "Alle Tastaturen", + "el_GR": "Όλα τα πληκτρολόγια", + "en_US": "All keyboards", + "es_ES": "Todos los teclados", + "fr_FR": "Tous les claviers", + "he_IL": "כל המקלדות", + "it_IT": "Tutte le tastiere", + "ja_JP": "すべてのキーボード", + "ko_KR": "모든 키보드", + "no_NO": "Alle tastaturer", + "pl_PL": "Wszystkie klawiatury", + "pt_BR": "Todos os Teclados", + "ru_RU": "Все клавиатуры", + "sv_SE": "Alla tangentbord", + "th_TH": "คีย์บอร์ดทั้งหมด", + "tr_TR": "Tüm Klavyeler", + "uk_UA": "Усі клавіатури", + "zh_CN": "所有键盘", + "zh_TW": "所有鍵盤" + } + }, + { + "ID": "OpenFileDialogTitle", + "Translations": { + "ar_SA": "حدد ملف مدعوم لفتحه", + "de_DE": "Wähle eine unterstützte Datei", + "el_GR": "Επιλέξτε ένα υποστηριζόμενο αρχείο για άνοιγμα", + "en_US": "Select a supported file to open", + "es_ES": "Selecciona un archivo soportado para cargar", + "fr_FR": "Sélectionnez un fichier compatible à ouvrir", + "he_IL": "בחר קובץ נתמך לפתיחה", + "it_IT": "Seleziona un file supportato da aprire", + "ja_JP": "開くファイルを選択", + "ko_KR": "지원되는 파일을 선택하여 열기", + "no_NO": "Velg en støttet fil for å åpne", + "pl_PL": "Wybierz obsługiwany plik do otwarcia", + "pt_BR": "Selecione um arquivo suportado para abrir", + "ru_RU": "Выберите совместимый файл для открытия", + "sv_SE": "Välj en fil som stöds att öppna", + "th_TH": "เลือกไฟล์ที่สนับสนุนเพื่อเปิด", + "tr_TR": "Açmak için desteklenen bir dosya seçin", + "uk_UA": "Виберіть підтримуваний файл для відкриття", + "zh_CN": "选择支持的游戏文件并加载", + "zh_TW": "選取支援的檔案格式" + } + }, + { + "ID": "OpenFolderDialogTitle", + "Translations": { + "ar_SA": "حدد مجلدا يحتوي على لعبة غير مضغوطة", + "de_DE": "Wähle einen Ordner mit einem entpackten Spiel", + "el_GR": "Επιλέξτε ένα φάκελο με ένα αποσυμπιεσμένο παιχνίδι", + "en_US": "Select a folder with an unpacked game", + "es_ES": "Selecciona una carpeta con un juego desempaquetado", + "fr_FR": "Sélectionnez un dossier avec un jeu décompressé", + "he_IL": "בחר תיקיה עם משחק לא ארוז", + "it_IT": "Seleziona una cartella con un gioco estratto", + "ja_JP": "展開されたゲームフォルダを選択", + "ko_KR": "압축 해제된 게임이 있는 폴더를 선택", + "no_NO": "Velg en mappe med et pakket ut spill", + "pl_PL": "Wybierz folder z rozpakowaną grą", + "pt_BR": "Selecione uma pasta com um jogo descompactado", + "ru_RU": "Выберите папку с распакованной игрой", + "sv_SE": "Välj en mapp med ett uppackat spel", + "th_TH": "เลือกโฟลเดอร์ที่มีเกมที่แตกไฟล์แล้ว", + "tr_TR": "Ayrıştırılmamış oyun içeren bir klasör seçin", + "uk_UA": "Виберіть теку з розпакованою грою", + "zh_CN": "选择包含解包游戏的目录并加载", + "zh_TW": "選取未封裝遊戲的資料夾" + } + }, + { + "ID": "AllSupportedFormats", + "Translations": { + "ar_SA": "كل التنسيقات المدعومة", + "de_DE": "Alle unterstützten Formate", + "el_GR": "Όλες Οι Υποστηριζόμενες Μορφές", + "en_US": "All Supported Formats", + "es_ES": "Todos los formatos soportados", + "fr_FR": "Tous les formats supportés", + "he_IL": "כל הפורמטים הנתמכים", + "it_IT": "Tutti i formati supportati", + "ja_JP": "すべての対応フォーマット", + "ko_KR": "지원되는 모든 형식", + "no_NO": "Alle støttede formater", + "pl_PL": "Wszystkie Obsługiwane Formaty", + "pt_BR": "Todos os Formatos Suportados", + "ru_RU": "Все поддерживаемые форматы", + "sv_SE": "Alla format som stöds", + "th_TH": "รูปแบบที่รองรับทั้งหมด", + "tr_TR": "Tüm Desteklenen Formatlar", + "uk_UA": "Усі підтримувані формати", + "zh_CN": "所有支持的格式", + "zh_TW": "所有支援的格式" + } + }, + { + "ID": "RyujinxUpdater", + "Translations": { + "ar_SA": "محدث {0}", + "de_DE": "", + "el_GR": "{0} Ενημερωτής", + "en_US": "{0} Updater", + "es_ES": "Actualizador de {0}", + "fr_FR": "Mise à jour de {0}", + "he_IL": "מעדכן {0}", + "it_IT": "Aggiornamento di {0}", + "ja_JP": "{0} アップデータ", + "ko_KR": "{0} 업데이터", + "no_NO": "{0} Oppgradering", + "pl_PL": "Aktualizator {0}", + "pt_BR": "Atualizador do {0}", + "ru_RU": "{0} Обновление", + "sv_SE": "Uppdaterare för {0}", + "th_TH": "ตัวอัปเดต {0}", + "tr_TR": "{0} Güncelleyicisi", + "uk_UA": "Програма оновлення {0}", + "zh_CN": "{0} 更新", + "zh_TW": "{0} 更新程式" + } + }, + { + "ID": "RyujinxRebooter", + "Translations": { + "ar_SA": "إعادة تشغيل {0}", + "de_DE": "Neustart von {0}", + "el_GR": "Επανεκκίνηση {0}", + "en_US": "{0} Reboot", + "es_ES": "Reinicio de {0}", + "fr_FR": "Redémarrage de {0}", + "he_IL": "אתחול {0}", + "it_IT": "Riavvio di {0}", + "ja_JP": "{0} 再起動", + "ko_KR": "{0} 재부팅", + "no_NO": "Omstart av {0}", + "pl_PL": "Ponowne uruchomienie {0}", + "pt_BR": "Reinício de {0}", + "ru_RU": "{0} Перезагрузка", + "sv_SE": "Ominläsning av {0}", + "th_TH": "เริ่มต้นใหม่ {0}", + "tr_TR": "{0} Yeniden Başlatma", + "uk_UA": "Перезавантаження {0}", + "zh_CN": "{0} 重启", + "zh_TW": "{0} 重新啟動" + } + }, + { + "ID": "SettingsTabHotkeys", + "Translations": { + "ar_SA": "مفاتيح الاختصار في لوحة المفاتيح", + "de_DE": "Tastatur-Hotkeys", + "el_GR": "Συντομεύσεις Πληκτρολογίου", + "en_US": "Keyboard Hotkeys", + "es_ES": "Atajos de teclado", + "fr_FR": "Raccourcis clavier", + "he_IL": "מקשי קיצור במקלדת", + "it_IT": "Tasti di scelta rapida", + "ja_JP": "キーボード ホットキー", + "ko_KR": "키보드 단축키", + "no_NO": "Hurtigtaster for tastatur", + "pl_PL": "Skróty Klawiszowe Klawiatury", + "pt_BR": "Atalhos do Teclado", + "ru_RU": "Горячие клавиши", + "sv_SE": "Snabbtangenter", + "th_TH": "ปุ่มลัดของคีย์บอร์ด", + "tr_TR": "Klavye Kısayolları", + "uk_UA": "Гарячі клавіші", + "zh_CN": "快捷键", + "zh_TW": "鍵盤快速鍵" + } + }, + { + "ID": "SettingsTabHotkeysHotkeys", + "Translations": { + "ar_SA": "مفاتيح الاختصار في لوحة المفاتيح", + "de_DE": "Tastatur-Hotkeys", + "el_GR": "Συντομεύσεις Πληκτρολογίου", + "en_US": "Keyboard Hotkeys", + "es_ES": "Atajos de teclado", + "fr_FR": "Raccourcis clavier", + "he_IL": "מקשי קיצור במקלדת", + "it_IT": "Tasti di scelta rapida", + "ja_JP": "キーボード ホットキー", + "ko_KR": "키보드 단축키", + "no_NO": "Hurtigtaster for tastatur", + "pl_PL": "Skróty Klawiszowe Klawiatury", + "pt_BR": "Atalhos do Teclado", + "ru_RU": "Горячие клавиши", + "sv_SE": "Snabbtangenter", + "th_TH": "ปุ่มลัดของคีย์บอร์ด", + "tr_TR": "Klavye Kısayolları", + "uk_UA": "Гарячі клавіші клавіатури", + "zh_CN": "键盘快捷键", + "zh_TW": "鍵盤快捷鍵" + } + }, + { + "ID": "SettingsTabHotkeysScreenshotHotkey", + "Translations": { + "ar_SA": "لقطة الشاشة:", + "de_DE": "", + "el_GR": "Στιγμιότυπο Οθόνης:", + "en_US": "Screenshot:", + "es_ES": "Captura de pantalla:", + "fr_FR": "Capture d'écran :", + "he_IL": "צילום מסך:", + "it_IT": "Cattura uno screenshot:", + "ja_JP": "スクリーンショット:", + "ko_KR": "스크린샷 :", + "no_NO": "Skjermbilde", + "pl_PL": "Zrzut Ekranu:", + "pt_BR": "Captura de Tela:", + "ru_RU": "Скриншот:", + "sv_SE": "Skärmbild:", + "th_TH": "ภาพหน้าจอ:", + "tr_TR": "Ekran Görüntüsü Al:", + "uk_UA": "Знімок екрана:", + "zh_CN": "保存截屏:", + "zh_TW": "擷取畫面:" + } + }, + { + "ID": "SettingsTabHotkeysShowUiHotkey", + "Translations": { + "ar_SA": "عرض واجهة المستخدم:", + "de_DE": "Zeige UI:", + "el_GR": "Εμφάνιση Διεπαφής Χρήστη:", + "en_US": "Show UI:", + "es_ES": "Mostrar interfaz:", + "fr_FR": "Afficher UI :", + "he_IL": "הצג ממשק משתמש:", + "it_IT": "Mostra l'interfaccia:", + "ja_JP": "UI表示:", + "ko_KR": "UI 표시 :", + "no_NO": "Vis UI:", + "pl_PL": "Pokaż UI:", + "pt_BR": "Exibir UI:", + "ru_RU": "Показать интерфейс:", + "sv_SE": "Visa gränssnitt:", + "th_TH": "แสดง UI:", + "tr_TR": "Arayüzü Göster:", + "uk_UA": "Показати інтерфейс:", + "zh_CN": "隐藏菜单栏和状态栏:", + "zh_TW": "顯示 UI:" + } + }, + { + "ID": "SettingsTabHotkeysPauseHotkey", + "Translations": { + "ar_SA": "إيقاف مؤقت:", + "de_DE": "Pausieren:", + "el_GR": "Παύση:", + "en_US": "Pause:", + "es_ES": "Pausar:", + "fr_FR": "Suspendre :", + "he_IL": "הפסק:", + "it_IT": "Metti in pausa:", + "ja_JP": "一時停止:", + "ko_KR": "중지 :", + "no_NO": "Stans midlertidig:", + "pl_PL": "Pauza:", + "pt_BR": "Pausar:", + "ru_RU": "Пауза эмуляции:", + "sv_SE": "Paus:", + "th_TH": "หยุดชั่วคราว:", + "tr_TR": "Durdur:", + "uk_UA": "Пауза:", + "zh_CN": "暂停:", + "zh_TW": "暫停:" + } + }, + { + "ID": "SettingsTabHotkeysToggleMuteHotkey", + "Translations": { + "ar_SA": "كتم:", + "de_DE": "Stummschalten:", + "el_GR": "Σίγαση:", + "en_US": "Mute:", + "es_ES": "Silenciar:", + "fr_FR": "Couper le son :", + "he_IL": "השתק:", + "it_IT": "Disattiva l'audio:", + "ja_JP": "ミュート:", + "ko_KR": "음소거 :", + "no_NO": "Demp:", + "pl_PL": "Wycisz:", + "pt_BR": "Mudo:", + "ru_RU": "Выключить звук:", + "sv_SE": "Tyst:", + "th_TH": "ปิดเสียง:", + "tr_TR": "Sustur:", + "uk_UA": "Вимкнути звук:", + "zh_CN": "静音:", + "zh_TW": "靜音:" + } + }, + { + "ID": "ControllerMotionTitle", + "Translations": { + "ar_SA": "إعدادات التحكم بالحركة", + "de_DE": "Bewegungssteuerung - Einstellungen", + "el_GR": "Ρυθμίσεις Ελέγχου Κίνησης", + "en_US": "Motion Control Settings", + "es_ES": "Opciones de controles de movimiento", + "fr_FR": "Paramètres du contrôle de mouvement", + "he_IL": "הגדרות שליטת תנועות ג'ירוסקופ", + "it_IT": "Impostazioni dei sensori di movimento", + "ja_JP": "モーションコントロール設定", + "ko_KR": "모션 컨트롤 설정", + "no_NO": "Innstillinger for bevegelses kontroll", + "pl_PL": "Ustawienia Sterowania Ruchowego", + "pt_BR": "Configurações do Controle de Movimento", + "ru_RU": "Настройки управления движением", + "sv_SE": "Inställningar för rörelsekontroller", + "th_TH": "ตั้งค่าควบคุมการเคลื่อนไหว", + "tr_TR": "Hareket Kontrol Seçenekleri", + "uk_UA": "Налаштування керування рухом", + "zh_CN": "体感设置", + "zh_TW": "體感控制設定" + } + }, + { + "ID": "ControllerRumbleTitle", + "Translations": { + "ar_SA": "إعدادات الهزاز", + "de_DE": "Vibration - Einstellungen", + "el_GR": "Ρυθμίσεις Δόνησης", + "en_US": "Rumble Settings", + "es_ES": "Opciones de vibración", + "fr_FR": "Paramètres de vibration", + "he_IL": "הגדרות רטט", + "it_IT": "Impostazioni di vibrazione", + "ja_JP": "振動設定", + "ko_KR": "진동 설정", + "no_NO": "Innstillinger for Vibrasjon", + "pl_PL": "Ustawienia Wibracji", + "pt_BR": "Configurações de Vibração", + "ru_RU": "Настройки вибрации", + "sv_SE": "Inställningar för vibration", + "th_TH": "ตั้งค่าการสั่นไหว", + "tr_TR": "Titreşim Seçenekleri", + "uk_UA": "Налаштування вібрації", + "zh_CN": "震动设置", + "zh_TW": "震動設定" + } + }, + { + "ID": "ControllerLedTitle", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "LED Settings", + "es_ES": "", + "fr_FR": "Paramètres LED", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "LED 설정", + "no_NO": "LED-innstillinger", + "pl_PL": "", + "pt_BR": "Configurações de LED", + "ru_RU": "Настройки LED-подсветки", + "sv_SE": "LED-inställningar", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Налаштування LED", + "zh_CN": "LED 设置", + "zh_TW": "LED 設定" + } + }, + { + "ID": "SettingsSelectThemeFileDialogTitle", + "Translations": { + "ar_SA": "حدد ملف السمة", + "de_DE": "Wähle ein Design für die Emulator-Benutzeroberfläche", + "el_GR": "Επιλογή Αρχείου Θέματος", + "en_US": "Select Theme File", + "es_ES": "Selecciona un archivo de tema", + "fr_FR": "Sélectionnez un fichier de thème", + "he_IL": "בחרו קובץ ערכת נושא", + "it_IT": "Seleziona file del tema", + "ja_JP": "テーマファイルを選択", + "ko_KR": "테마 파일 선택", + "no_NO": "Velg tema fil", + "pl_PL": "Wybierz Plik Motywu", + "pt_BR": "Selecionar Arquivo de Tema", + "ru_RU": "Выбрать файл темы", + "sv_SE": "Välj temafil", + "th_TH": "เลือกธีมไฟล์", + "tr_TR": "Tema Dosyası Seç", + "uk_UA": "Виберіть файл теми", + "zh_CN": "选择主题文件", + "zh_TW": "選取佈景主題檔案" + } + }, + { + "ID": "SettingsXamlThemeFile", + "Translations": { + "ar_SA": "ملف سمة Xaml", + "de_DE": "Xaml Design-Datei", + "el_GR": "Αρχείο Θέματος Xaml", + "en_US": "Xaml Theme File", + "es_ES": "Archivo de tema Xaml", + "fr_FR": "Fichier thème Xaml", + "he_IL": "קובץ ערכת נושא Xaml", + "it_IT": "File del tema XAML", + "ja_JP": "Xaml テーマファイル", + "ko_KR": "Xaml 테마 파일", + "no_NO": "Xaml tema-fil", + "pl_PL": "Plik Motywu Xaml", + "pt_BR": "Arquivo de Tema Xaml", + "ru_RU": "Файл темы Xaml", + "sv_SE": "Xaml-temafil", + "th_TH": "ไฟล์ธีมรูปแบบ XAML", + "tr_TR": "Xaml Tema Dosyası", + "uk_UA": "Файл теми Xaml", + "zh_CN": "Xaml 主题文件", + "zh_TW": "Xaml 佈景主題檔案" + } + }, + { + "ID": "AvatarWindowTitle", + "Translations": { + "ar_SA": "إدارة الحسابات - الصورة الرمزية", + "de_DE": "Profile verwalten - Avatar", + "el_GR": "Διαχείριση Λογαριασμών - Avatar", + "en_US": "Manage Accounts - Avatar", + "es_ES": "Administrar cuentas - Avatar", + "fr_FR": "Gérer les Comptes - Avatar", + "he_IL": "ניהול חשבונות - אוואטר", + "it_IT": "Gestisci account - Avatar", + "ja_JP": "アカウント - アバター管理", + "ko_KR": "계정 관리 - 아바타", + "no_NO": "Administrer kontoer - Profilbilde", + "pl_PL": "Zarządzaj Kontami — Avatar", + "pt_BR": "Gerenciar Contas - Avatar", + "ru_RU": "Управление аккаунтами - Аватар", + "sv_SE": "Hantera konton - Avatar", + "th_TH": "จัดการบัญชี - อวาต้า", + "tr_TR": "Hesapları Yönet - Avatar", + "uk_UA": "Керування обліковими записами - Аватар", + "zh_CN": "管理账户 - 头像", + "zh_TW": "管理帳戶 - 大頭貼" + } + }, + { + "ID": "Amiibo", + "Translations": { + "ar_SA": "أميبو", + "de_DE": "", + "el_GR": "", + "en_US": "Amiibo", + "es_ES": "", + "fr_FR": "", + "he_IL": "אמיבו", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Амибо", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "Unknown", + "Translations": { + "ar_SA": "غير معروف", + "de_DE": "Unbekannt", + "el_GR": "Άγνωστο", + "en_US": "Unknown", + "es_ES": "Desconocido", + "fr_FR": "Inconnu", + "he_IL": "לא ידוע", + "it_IT": "Sconosciuto", + "ja_JP": "不明", + "ko_KR": "알 수 없음", + "no_NO": "Ukjent", + "pl_PL": "Nieznane", + "pt_BR": "Desconhecido", + "ru_RU": "Неизвестно", + "sv_SE": "Okänt", + "th_TH": "ไม่รู้จัก", + "tr_TR": "Bilinmeyen", + "uk_UA": "Невідомо", + "zh_CN": "未知", + "zh_TW": "未知" + } + }, + { + "ID": "Usage", + "Translations": { + "ar_SA": "الاستخدام", + "de_DE": "Nutzung", + "el_GR": "Χρήση", + "en_US": "Usage", + "es_ES": "Uso", + "fr_FR": "Utilisation", + "he_IL": "שימוש", + "it_IT": "Utilizzo", + "ja_JP": "使用法", + "ko_KR": "사용법", + "no_NO": "Forbruk", + "pl_PL": "Użycie", + "pt_BR": "Uso", + "ru_RU": "Применение", + "sv_SE": "Användning", + "th_TH": "การใช้งาน", + "tr_TR": "Kullanım", + "uk_UA": "Використання", + "zh_CN": "用法", + "zh_TW": "用途" + } + }, + { + "ID": "Writable", + "Translations": { + "ar_SA": "قابل للكتابة", + "de_DE": "Beschreibbar", + "el_GR": "Εγγράψιμο", + "en_US": "Writable", + "es_ES": "Escribible", + "fr_FR": "Ecriture possible", + "he_IL": "ניתן לכתיבה", + "it_IT": "Scrivibile", + "ja_JP": "書き込み可能", + "ko_KR": "쓰기 가능", + "no_NO": "Skrivbart", + "pl_PL": "Zapisywalne", + "pt_BR": "Gravável", + "ru_RU": "Доступно для записи", + "sv_SE": "Skrivbar", + "th_TH": "สามารถเขียนทับได้", + "tr_TR": "Yazılabilir", + "uk_UA": "Можливість запису", + "zh_CN": "可写入", + "zh_TW": "可寫入" + } + }, + { + "ID": "SelectDlcDialogTitle", + "Translations": { + "ar_SA": "حدد ملفات المحتوي الإضافي", + "de_DE": "DLC-Dateien auswählen", + "el_GR": "Επιλογή αρχείων DLC", + "en_US": "Select DLC files", + "es_ES": "Selecciona archivo(s) de DLC", + "fr_FR": "Sélectionnez les fichiers DLC", + "he_IL": "בחרו קבצי הרחבות משחק", + "it_IT": "Seleziona file dei DLC", + "ja_JP": "DLC ファイルを選択", + "ko_KR": "DLC 파일 선택", + "no_NO": "Velg DLC-filer", + "pl_PL": "Wybierz pliki DLC", + "pt_BR": "Selecionar Arquivos de DLC", + "ru_RU": "Выберите файлы DLC", + "sv_SE": "Välj DLC-filer", + "th_TH": "เลือกไฟล์ DLC", + "tr_TR": "DLC dosyalarını seç", + "uk_UA": "Виберіть файли DLC", + "zh_CN": "选择 DLC 文件", + "zh_TW": "選取 DLC 檔案" + } + }, + { + "ID": "SelectUpdateDialogTitle", + "Translations": { + "ar_SA": "حدد ملفات التحديث", + "de_DE": "Update-Datei auswählen", + "el_GR": "Επιλογή αρχείων ενημέρωσης", + "en_US": "Select update files", + "es_ES": "Selecciona archivo(s) de actualización", + "fr_FR": "Sélectionnez les fichiers de mise à jour", + "he_IL": "בחרו קבצי עדכון", + "it_IT": "Seleziona file di aggiornamento", + "ja_JP": "アップデートファイルを選択", + "ko_KR": "업데이트 파일 선택", + "no_NO": "Velg oppdateringsfiler", + "pl_PL": "Wybierz pliki aktualizacji", + "pt_BR": "Selecionar arquivos de atualização", + "ru_RU": "Выберите файлы обновлений", + "sv_SE": "Välj uppdateringsfiler", + "th_TH": "เลือกไฟล์อัพเดต", + "tr_TR": "Güncelleme dosyalarını seç", + "uk_UA": "Виберіть файли оновлення", + "zh_CN": "选择更新文件", + "zh_TW": "選取更新檔" + } + }, + { + "ID": "SelectModDialogTitle", + "Translations": { + "ar_SA": "حدد مجلد التعديل", + "de_DE": "Mod-Ordner auswählen", + "el_GR": "", + "en_US": "Select mod directory", + "es_ES": "Seleccionar un directorio de Mods", + "fr_FR": "Sélectionnez le répertoire du mod", + "he_IL": "בחר תיקיית מודים", + "it_IT": "Seleziona cartella delle mod", + "ja_JP": "modディレクトリを選択", + "ko_KR": "모드 디렉터리 선택", + "no_NO": "Velg modifikasjons mappe", + "pl_PL": "Wybierz katalog modów", + "pt_BR": "Selecione o diretório do mod", + "ru_RU": "Выбрать папку с модами", + "sv_SE": "Välj moddkatalog", + "th_TH": "เลือกไดเรกทอรี Mods", + "tr_TR": "Mod Dizinini Seç", + "uk_UA": "Виберіть теку з модами", + "zh_CN": "选择 MOD 目录", + "zh_TW": "選取模組資料夾" + } + }, + { + "ID": "TrimXCIFileDialogTitle", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Check and Trim XCI File", + "es_ES": "Verificar y recortar archivo XCI", + "fr_FR": "Vérifier et Réduire le fichier XCI", + "he_IL": "", + "it_IT": "Controlla e riduci la dimensione del file XCI", + "ja_JP": "", + "ko_KR": "XCI 파일 확인 및 정리", + "no_NO": "Kontroller og trim XCI-filen", + "pl_PL": "", + "pt_BR": "Verifique e Reduza o Arquivo XCI", + "ru_RU": "Проверить и обрезать XCI файл", + "sv_SE": "Kontrollera och optimera XCI-filer", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Перевірити та Обрізати XCI файл", + "zh_CN": "检查并瘦身 XCI 文件", + "zh_TW": "檢查及修剪 XCI 檔案" + } + }, + { + "ID": "TrimXCIFileDialogPrimaryText", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "This function will first check the empty space and then trim the XCI File to save disk space.", + "es_ES": "Esta función verificará el espacio vacío y después recortará el archivo XCI para ahorrar espacio en disco", + "fr_FR": "Cette fonction vérifie d’abord l’espace libre, puis réduit le fichier XCI pour économiser de l’espace disque.", + "he_IL": "", + "it_IT": "Questa funzionalità controllerà prima lo spazio libero e poi ridurrà la dimensione del file XCI per risparmiare spazio su disco.", + "ja_JP": "", + "ko_KR": "이 기능은 먼저 충분한 공간을 확보한 다음 XCI 파일을 트리밍하여 디스크 공간을 절약합니다.", + "no_NO": "Denne funksjonen kontrollerer først hvor mye plass som er ledig, og trimmer deretter XCI-filen for å spare diskplass.", + "pl_PL": "", + "pt_BR": "Esta função primeiro verificará o espaço vazio e depois reduzirá o arquivo XCI para economizar espaço em disco.", + "ru_RU": "Эта функция сначала проверит наличие пустого пространства, а затем обрежет файл XCI, чтобы сэкономить место на диске.", + "sv_SE": "Denna funktion kommer först att kontrollera ledigt utrymme och sedan optimera XCI-filen för att spara diskutrymme.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Ця функція спочатку перевірить наявність порожнього місця, після чого обріже файл XCI для економії місця на диску.", + "zh_CN": "这个功能将会先检查 XCI 文件,再对其执行瘦身操作以节约磁盘空间。", + "zh_TW": "此功能首先檢查 XCI 檔案是否有可修剪的字元,然後修剪檔案以節省儲存空間。" + } + }, + { + "ID": "TrimXCIFileDialogSecondaryText", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", + "es_ES": "Tamaño de archivo actual: {0:n} MB\nTamaño de datos de juego: {1:n} MB\nAhorro de espacio en disco: {2:n} MB", + "fr_FR": "Taille actuelle du fichier: {0:n} MB\nTaille des données du jeu: {1:n} MB\nEspace disque économisé: {2:n} MB", + "he_IL": "", + "it_IT": "Dimensione attuale del file: {0:n} MB\nDimensione dei dati del gioco: {1:n} MB\nRisparmio spazio su disco: {2:n} MB", + "ja_JP": "", + "ko_KR": "현재 파일 크기 : {0:n}MB\n게임 데이터 크기 : {1:n}MB\n디스크 공간 절약 : {2:n}MB", + "no_NO": "Nåværende filstørrelse: 0:n MB\nSpilldatastørrelse: {1:n} MB\nDiskplassbesparelse: {2:n} MB", + "pl_PL": "", + "pt_BR": "Tamanho atual do arquivo: {0:n} MB\nTamanho dos dados do jogo: {1:n} MB\nEconomia de espaço em disco: {2:n} MB", + "ru_RU": "Размер текущего файла: {0:n} Мб\nРазмер игровых данных: {1:n} MB\nЭкономия дискового пространства: {2:n} Мб", + "sv_SE": "Aktuell filstorlek: {0:n} MB\nStorlek för speldata: {1:n} MB\nSparat diskutrymme: {2:n} MB", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Поточний розмір файла: {0:n} MB\nРозмір файлів гри: {1:n} MB\nЕкономія місця: {2:n} MB", + "zh_CN": "当前文件大小: {0:n} MB\n游戏数据大小: {1:n} MB\n节约的磁盘空间: {2:n} MB", + "zh_TW": "現在的檔案大小: {0:n} MB\n遊戲資料大小: {1:n} MB\n節省的儲存空間: {2:n} MB" + } + }, + { + "ID": "TrimXCIFileNoTrimNecessary", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "XCI File does not need to be trimmed. Check logs for further details", + "es_ES": "El archivo XCI no necesita ser recortado. Verifica los logs para más detalles.", + "fr_FR": "Le fichier XCI n’a pas besoin d’être réduit. Référez-vous aux journaux pour plus de détails.", + "he_IL": "", + "it_IT": "Non è necessario ridurre la dimensione del file XCI. Controlla i log per ulteriori dettagli", + "ja_JP": "", + "ko_KR": "XCI 파일은 트리밍할 필요가 없습니다. 자세한 내용은 로그를 확인", + "no_NO": "XCI-filen trenger ikke å trimmes. Sjekk loggene for mer informasjon", + "pl_PL": "", + "pt_BR": "O arquivo XCI não precisa ser reduzido. Verifique os logs para mais detalhes", + "ru_RU": "Файл XCI не нуждается в обрезке. Проверьте логи для получения более подробной информации", + "sv_SE": "XCI-filen behöver inte optimeras. Kontrollera loggen för mer information", + "th_TH": "", + "tr_TR": "", + "uk_UA": "XCI файл не потребує обрізання. Перевірте журнали (logs) для отримання додаткової інформації", + "zh_CN": "XCI 文件不需要被瘦身。查看日志以获得更多细节。", + "zh_TW": "XCI 檔案不需要修剪。檢查日誌以取得更多資訊" + } + }, + { + "ID": "TrimXCIFileNoUntrimPossible", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "XCI File cannot be untrimmed. Check logs for further details", + "es_ES": "El recorte del archivo XCI no puede ser deshecho. Verifica los registros para más detalles.", + "fr_FR": "Fichier XCI ne peut pas être dé-réduit. Référez-vous aux journaux pour plus de détails", + "he_IL": "", + "it_IT": "Il file XCI non può essere riportato alla sua dimensione originale. Controlla i log per ulteriori dettagli", + "ja_JP": "", + "ko_KR": "XCI 파일은 트리밍을 해제할 수 없습니다. 자세한 내용은 로그를 확인", + "no_NO": "XCI-filen kan ikke trimmes. Sjekk loggene for mer informasjon", + "pl_PL": "", + "pt_BR": "O arquivo XCI reduzido não pode ser desfeito. Verifique os logs para mais detalhes", + "ru_RU": "XCI файл не может быть обрезан. Проверьте логи для получения более подробной информации", + "sv_SE": "XCI-filen kan inte avoptimeras. Kontrollera loggen för mer information", + "th_TH": "", + "tr_TR": "", + "uk_UA": "XCI файл не може бути обрізаний. Перевірте журнали (logs) для отримання додаткової інформації", + "zh_CN": "XCI 文件不能被瘦身。查看日志以获得更多细节。", + "zh_TW": "XCI 檔案不能被修剪。檢查日誌以取得更多資訊" + } + }, + { + "ID": "TrimXCIFileReadOnlyFileCannotFix", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "XCI File is Read Only and could not be made writable. Check logs for further details", + "es_ES": "El archivo XCI es de solo Lectura y no se le puede escribir. Lee el registro para más información.", + "fr_FR": "Fichier XCI est en Lecture Seule et n'a pas pu être rendu accessible en écriture. Référez-vous aux journaux pour plus de détails", + "he_IL": "", + "it_IT": "Il file XCI è in sola lettura e non può essere reso accessibile in scrittura. Controlla i log per ulteriori dettagli", + "ja_JP": "", + "ko_KR": "XCI 파일은 읽기 전용이므로 쓰기 가능하게 만들 수 없습니다. 자세한 내용은 로그를 확인", + "no_NO": "XCI-filen er skrivebeskyttet og kunne ikke gjøres skrivbar. Sjekk loggene for mer informasjon", + "pl_PL": "", + "pt_BR": "O arquivo XCI é somente leitura e não pôde ser tornado gravável. Verifique os logs para mais detalhes", + "ru_RU": "Файл XCI доступен только для чтения и его невозможно сделать доступным для записи. Проверьте логи для получения более подробной информации", + "sv_SE": "XCI-filen är skrivskyddad och kunde inte göras skrivbar. Kontrollera loggen för mer information", + "th_TH": "", + "tr_TR": "", + "uk_UA": "XCI файл \"Тільки для Читання\" і не може бути прочитаним. Перевірте журнали (logs) для отримання додаткової інформації", + "zh_CN": "XCI 文件是只读的,且不可以被标记为可读取的。查看日志以获得更多细节。", + "zh_TW": "XCI 檔案是唯讀,並且無法改成可寫入。檢查日誌以取得更多資訊" + } + }, + { + "ID": "TrimXCIFileFileSizeChanged", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", + "es_ES": "El archivo XCI ha cambiado de tamaño desde que fue escaneado. Verifica que no se esté escribiendo al archivo y vuelve a intentarlo.", + "fr_FR": "La taille du fichier XCI a changé depuis son analyse. Veuillez vérifier que le fichier n’est pas en cours d’écriture, puis réessayez.", + "he_IL": "", + "it_IT": "La dimensione del file XCI è cambiata da quando è stato scansionato. Controlla che il file non stia venendo scritto da qualche altro programma e poi riprova.", + "ja_JP": "", + "ko_KR": "XCI 파일이 스캔된 후 크기가 변경되었습니다. 파일이 쓰여지고 있지 않은지 확인하고 다시 시도하세요.", + "no_NO": "XCI File har endret størrelse siden den ble skannet. Kontroller at det ikke skrives til filen, og prøv på nytt.", + "pl_PL": "", + "pt_BR": "O arquivo XCI mudou de tamanho desde que foi escaneado. Verifique se o arquivo não está sendo gravado e tente novamente.", + "ru_RU": "Файл XCI изменился в размере после сканирования. Проверьте, не производится ли запись в этот файл, и повторите попытку.", + "sv_SE": "XCI-filen har ändrats i storlek sedan den lästes av. Kontrollera att filen inte skrivs till och försök igen.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Розмір файлу XCI змінився з моменту сканування. Перевірте, чи не записується файл, та спробуйте знову", + "zh_CN": "XCI 文件在扫描后大小发生了变化。请检查文件是否未被写入,然后重试。", + "zh_TW": "XCI 檔案大小比較上次的掃瞄已經改變。請檢查檔案是否未被寫入,然後再嘗試。" + } + }, + { + "ID": "TrimXCIFileFreeSpaceCheckFailed", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "XCI File has data in the free space area, it is not safe to trim", + "es_ES": "El archivo XCI tiene datos en el área de espacio libre, no es seguro recortar.", + "fr_FR": "Fichier XCI a des données dans la zone d'espace libre, ce n'est pas sûr de réduire", + "he_IL": "", + "it_IT": "Il file XCI contiene dei dati nello spazio libero, non è sicuro ridurne la dimensione", + "ja_JP": "", + "ko_KR": "XCI 파일에 여유 공간 영역에 데이터가 있으므로 트리밍하는 것이 안전하지 않음", + "no_NO": "XCI-filen har data i ledig plass, og det er ikke trygt å trimme den", + "pl_PL": "", + "pt_BR": "O arquivo XCI tem dados na área de espaço livre, não é seguro reduzi-lo", + "ru_RU": "XCI файл содержит данные в пустой зоне, обрезать его небезопасно", + "sv_SE": "XCI-filen har data i det lediga utrymmet. Den är inte säker att optimera", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Файл XCI містить дані в зоні вільного простору, тому обрізка небезпечна", + "zh_CN": "XCI 文件的空闲区域内有数据,不能安全瘦身。", + "zh_TW": "XCI 檔案有數據儲存於可節省儲存空間的區域,所以試圖修剪並不安全" + } + }, + { + "ID": "TrimXCIFileInvalidXCIFile", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "XCI File contains invalid data. Check logs for further details", + "es_ES": "El archivo XCI contiene datos inválidos. Lee el registro para más información.", + "fr_FR": "Fichier XCI contient des données invalides. Regarder les journaux pour plus de détails", + "he_IL": "", + "it_IT": "Il file XCI contiene dei dati non validi. Controlla i log per ulteriori dettagli", + "ja_JP": "", + "ko_KR": "XCI 파일에 유효하지 않은 데이터가 포함되어 있습니다. 자세한 내용은 로그를 확인", + "no_NO": "XCI-filen inneholder ugyldige data. Sjekk loggene for ytterligere detaljer", + "pl_PL": "", + "pt_BR": "O arquivo XCI contém dados inválidos. Verifique os logs para obter mais detalhes", + "ru_RU": "Файл XCI содержит недопустимые данные. Проверьте логи для получения дополнительной информации", + "sv_SE": "XCI-filen innehåller ogiltig data. Kontrollera loggen för mer information", + "th_TH": "", + "tr_TR": "", + "uk_UA": "XCI Файл містить недійсні дані. Перевірте журнали (logs) для отримання додаткової інформації", + "zh_CN": "XCI 文件含有无效数据。查看日志以获得更多细节。", + "zh_TW": "XCI 檔案帶有無效的數據。檢查日誌以取得更多資訊" + } + }, + { + "ID": "TrimXCIFileFileIOWriteError", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "XCI File could not be opened for writing. Check logs for further details", + "es_ES": "El archivo XCI no se puede abrir para escribirlo. Lee el registro para más información.", + "fr_FR": "Fichier XCI n'a pas pu été ouvert pour écriture. Regarder les journaux pour plus de détails", + "he_IL": "", + "it_IT": "Il file XCI non può essere aperto in scrittura. Controlla i log per ulteriori dettagli", + "ja_JP": "", + "ko_KR": "XCI 파일을 쓰기 위해 열 수 없습니다. 자세한 내용은 로그를 확인", + "no_NO": "XCI-filen kunne ikke åpnes for skriving. Sjekk loggene for ytterligere detaljer", + "pl_PL": "", + "pt_BR": "O arquivo XCI não pôde ser aberto para gravação. Verifique os logs para mais detalhes", + "ru_RU": "XCI файл не удалось открыть для записи. Проверьте логи для получения дополнительной информации", + "sv_SE": "XCI-filen kunde inte öppnas för skrivning. Kontrollera loggen för mer information", + "th_TH": "", + "tr_TR": "", + "uk_UA": "XCI Файл файл не вдалося відкрити для запису. Перевірте журнали для додаткової інформації", + "zh_CN": "XCI 文件不能被读写。查看日志以获得更多细节。", + "zh_TW": "XCI 檔案不能被寫入。檢查日誌以取得更多資訊" + } + }, + { + "ID": "TrimXCIFileFailedPrimaryText", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Trimming of the XCI file failed", + "es_ES": "El recorte del archivo XCI falló", + "fr_FR": "Réduction du fichier XCI a échoué", + "he_IL": "", + "it_IT": "Riduzione della dimensione del file XCI fallita", + "ja_JP": "", + "ko_KR": "XCI 파일 트리밍에 실패", + "no_NO": "Trimming av XCI-filen mislyktes", + "pl_PL": "", + "pt_BR": "A redução do arquivo XCI falhou", + "ru_RU": "Обрезка файла XCI не удалась", + "sv_SE": "Optimering av XCI-filen misslyckades", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Не вдалося обрізати файл XCI", + "zh_CN": "XCI 文件瘦身失败", + "zh_TW": "修剪 XCI 檔案失敗" + } + }, + { + "ID": "TrimXCIFileCancelled", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "The operation was cancelled", + "es_ES": "La operación fue cancelada", + "fr_FR": "L'opération a été annulée", + "he_IL": "", + "it_IT": "L'operazione è stata annullata", + "ja_JP": "", + "ko_KR": "작업이 취소됨", + "no_NO": "Operasjonen ble avlyst", + "pl_PL": "", + "pt_BR": "A operação foi cancelada", + "ru_RU": "Операция была отменена", + "sv_SE": "Åtgärden avbröts", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Операція перервана", + "zh_CN": "操作已取消", + "zh_TW": "修剪已取消" + } + }, + { + "ID": "TrimXCIFileFileUndertermined", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "No operation was performed", + "es_ES": "No se realizó ninguna operación", + "fr_FR": "Aucune opération a été faite", + "he_IL": "", + "it_IT": "Non è stata effettuata alcuna operazione", + "ja_JP": "", + "ko_KR": "작업이 수행되지 않음", + "no_NO": "Ingen operasjon ble utført", + "pl_PL": "", + "pt_BR": "Nenhuma operação foi realizada", + "ru_RU": "Операция не была проведена", + "sv_SE": "Ingen åtgärd genomfördes", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Операція не проводилася", + "zh_CN": "未执行操作", + "zh_TW": "沒有修剪" + } + }, + { + "ID": "UserProfileWindowTitle", + "Translations": { + "ar_SA": "مدير الملفات الشخصية للمستخدمين", + "de_DE": "Benutzerprofile verwalten", + "el_GR": "Διαχειριστής Προφίλ Χρήστη", + "en_US": "User Profiles Manager", + "es_ES": "Administrar perfiles de usuario", + "fr_FR": "Gestionnaire de profils utilisateur", + "he_IL": "ניהול פרופילי משתמש", + "it_IT": "Gestione profili utente", + "ja_JP": "ユーザプロファイルを管理", + "ko_KR": "사용자 프로필 관리자", + "no_NO": "Bruker Profiler Behandler", + "pl_PL": "Menedżer Profili Użytkowników", + "pt_BR": "Gerenciador de Perfis de Usuário", + "ru_RU": "Менеджер учётных записей", + "sv_SE": "Hanterare för användarprofiler", + "th_TH": "จัดการโปรไฟล์ผู้ใช้", + "tr_TR": "Kullanıcı Profillerini Yönet", + "uk_UA": "Менеджер профілів користувачів", + "zh_CN": "管理用户账户", + "zh_TW": "使用者設定檔管理員" + } + }, + { + "ID": "CheatWindowTitle", + "Translations": { + "ar_SA": "مدير الغش", + "de_DE": "Spiel-Cheats verwalten", + "el_GR": "Διαχειριστής των Cheats", + "en_US": "Cheats Manager", + "es_ES": "Administrar cheats", + "fr_FR": "Gestionnaire de cheats", + "he_IL": "נהל צ'יטים למשחק", + "it_IT": "Gestione trucchi", + "ja_JP": "チート管理", + "ko_KR": "치트 관리자", + "no_NO": "Juksing behandler", + "pl_PL": "Menedżer Kodów", + "pt_BR": "Gerenciador de Trapaças", + "ru_RU": "Менеджер читов", + "sv_SE": "Fuskhanterare", + "th_TH": "จัดการสูตรโกง", + "tr_TR": "Oyun Hilelerini Yönet", + "uk_UA": "Менеджер читів", + "zh_CN": "金手指管理器", + "zh_TW": "密技管理員" + } + }, + { + "ID": "DlcWindowTitle", + "Translations": { + "ar_SA": "إدارة المحتوى القابل للتنزيل لـ {0} ({1})", + "de_DE": "Spiel-DLC verwalten", + "el_GR": "Downloadable Content Manager", + "en_US": "Manage Downloadable Content for {0} ({1})", + "es_ES": "Administrar contenido descargable", + "fr_FR": "Gérer le contenu téléchargeable pour {0} ({1})", + "he_IL": "נהל הרחבות משחק עבור {0} ({1})", + "it_IT": "Gestisci DLC per {0} ({1})", + "ja_JP": "DLC 管理", + "ko_KR": "{0} ({1})의 내려받기 가능한 콘텐츠 관리", + "no_NO": "Behandle nedlastbart innhold for {0} ({1})", + "pl_PL": "Menedżer Zawartości do Pobrania", + "pt_BR": "Gerenciar conteúdo para download para {0} ({1})", + "ru_RU": "Управление DLC для {0} ({1})", + "sv_SE": "Hantera hämtningsbart innehåll för {0} ({1})", + "th_TH": "จัดการ DLC ที่ดาวน์โหลดได้สำหรับ {0} ({1})", + "tr_TR": "Oyun DLC'lerini Yönet", + "uk_UA": "Менеджер вмісту для завантаження", + "zh_CN": "管理 {0} ({1}) 的 DLC", + "zh_TW": "管理 {0} 的可下載內容 ({1})" + } + }, + { + "ID": "ModWindowTitle", + "Translations": { + "ar_SA": "إدارة التعديلات لـ {0} ({1})", + "de_DE": "", + "el_GR": "", + "en_US": "Manage Mods for {0} ({1})", + "es_ES": "Administrar Mods para {0} ({1})", + "fr_FR": "Gérer les mods pour {0} ({1})", + "he_IL": "", + "it_IT": "Gestisci mod per {0} ({1})", + "ja_JP": "", + "ko_KR": "{0}({1})의 모드 관리", + "no_NO": "Administrere Modifikasjoner for {0} ({1})", + "pl_PL": "Zarządzaj modami dla {0} ({1})", + "pt_BR": "Gerenciar Mods para {0} ({1})", + "ru_RU": "Управление модами для {0} ({1})", + "sv_SE": "Hantera moddar för {0} ({1})", + "th_TH": "จัดการม็อดที่ดาวน์โหลดได้สำหรับ {0} ({1})", + "tr_TR": "", + "uk_UA": "Керувати модами для {0} ({1})", + "zh_CN": "管理 {0} ({1}) 的 MOD", + "zh_TW": "管理 {0} 的模組 ({1})" + } + }, + { + "ID": "UpdateWindowTitle", + "Translations": { + "ar_SA": "مدير تحديث العنوان", + "de_DE": "Spiel-Updates verwalten", + "el_GR": "Διαχειριστής Ενημερώσεων Τίτλου", + "en_US": "Title Update Manager", + "es_ES": "Administrar actualizaciones", + "fr_FR": "Gestionnaire de mises à jour", + "he_IL": "נהל עדכוני משחקים", + "it_IT": "Gestione aggiornamenti", + "ja_JP": "アップデート管理", + "ko_KR": "타이틀 업데이트 관리자", + "no_NO": "Tittel oppdatering behandler", + "pl_PL": "Menedżer Aktualizacji Tytułu", + "pt_BR": "Gerenciador de Atualização de Título", + "ru_RU": "Менеджер обновлений игр", + "sv_SE": "Hanterare för speluppdateringar", + "th_TH": "จัดการอัปเดตหัวข้อ", + "tr_TR": "Oyun Güncellemelerini Yönet", + "uk_UA": "Менеджер оновлення назв", + "zh_CN": "游戏更新管理器", + "zh_TW": "遊戲更新管理員" + } + }, + { + "ID": "XCITrimmerWindowTitle", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "XCI File Trimmer", + "es_ES": "Recortador de archivos XCI", + "fr_FR": "Réducteur de fichiers XCI", + "he_IL": "", + "it_IT": "Riduci dimensioni dei file XCI", + "ja_JP": "", + "ko_KR": "XCI 파일 트리머", + "no_NO": "", + "pl_PL": "", + "pt_BR": "Redutor de Arquivo XCI", + "ru_RU": "Уменьшение размера XCI файлов", + "sv_SE": "Optimera XCI-filer", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Обрізка XCI Файлів", + "zh_CN": "XCI 文件瘦身器", + "zh_TW": "XCI 檔案修剪器" + } + }, + { + "ID": "XCITrimmerTitleStatusCount", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0} of {1} Title(s) Selected", + "es_ES": "{0} de {1} Título(s) seleccionado(s)", + "fr_FR": "{0} sur {1} Fichier(s) Sélectionnés", + "he_IL": "", + "it_IT": "{0} di {1} titoli selezionati", + "ja_JP": "", + "ko_KR": "{1}개 타이틀 중 {0}개 선택됨", + "no_NO": "{0} av {1} Valgte tittel(er)", + "pl_PL": "", + "pt_BR": "{0} de {1} Título(s) Selecionado(s)", + "ru_RU": "{0} из {1} файла(ов) выбрано", + "sv_SE": "{0} av {1} spel markerade", + "th_TH": "", + "tr_TR": "", + "uk_UA": "{0} з {1} тайтл(ів) обрано", + "zh_CN": "在 {1} 中选中了 {0} 个游戏 ", + "zh_TW": "已選擇 {1} 之 {0} 的遊戲" + } + }, + { + "ID": "XCITrimmerTitleStatusCountWithFilter", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0} of {1} Title(s) Selected ({2} displayed)", + "es_ES": "{0} de {1} Título(s) seleccionado(s) ({2} mostrado(s))", + "fr_FR": "{0} sur {1} Fichier(s) Sélectionnés ({2} affiché(s)", + "he_IL": "", + "it_IT": "{0} di {1} titoli selezionati ({2} visualizzati)", + "ja_JP": "", + "ko_KR": "{1}개 타이틀 중 {0}개 선택됨({2}개 표시됨)", + "no_NO": "{0} av {1} Tittel(er) valgt ({2} vises)", + "pl_PL": "", + "pt_BR": "{0} de {1} Título(s) Selecionado(s) ({2} exibidos)", + "ru_RU": "{0} из {1} файла(ов) выбрано ({2} показано)", + "sv_SE": "{0} av {1} spel markerade ({2} visade)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "{0} з {1} тайтл(ів) обрано ({2} відображається)", + "zh_CN": "在 {1} 中选中了 {0} 个游戏 (显示了 {2} 个)", + "zh_TW": "已選擇 {1} 之 {0} 的遊戲 (已顯示 {2} 個)" + } + }, + { + "ID": "XCITrimmerTitleStatusTrimming", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Trimming {0} Title(s)...", + "es_ES": "Recortando {0} Título(s)...", + "fr_FR": "Réduction de {0} Fichier(s)...", + "he_IL": "", + "it_IT": "Riduzione delle dimensioni di {0} titolo/i...", + "ja_JP": "", + "ko_KR": "{0}개의 타이틀을 트리밍 중...", + "no_NO": "Trimming av {0} tittel(er)...", + "pl_PL": "", + "pt_BR": "Reduzindo {0} Título(s)...", + "ru_RU": "Обрезка {0} файла(ов)...", + "sv_SE": "Optimerar {0} spel...", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Обрізка {0} тайтл(ів)...", + "zh_CN": "{0} 个游戏瘦身中。。。", + "zh_TW": "正在修剪 {0} 個遊戲..." + } + }, + { + "ID": "XCITrimmerTitleStatusUntrimming", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Untrimming {0} Title(s)...", + "es_ES": "Deshaciendo recorte de {0} Título(s)...", + "fr_FR": "Dé-Réduction de {0} Fichier(s)...", + "he_IL": "", + "it_IT": "Ripristino alle dimensioni originali di {0} titolo/i...", + "ja_JP": "", + "ko_KR": "{0}개의 타이틀을 트리밍 해제 중...", + "no_NO": "Untrimming {0} Tittel(er)...", + "pl_PL": "", + "pt_BR": "Desfazendo redução {0} Título(s)...", + "ru_RU": "Отмена обрезки {0} файла(ов)...", + "sv_SE": "Avoptimerar {0} spel...", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Необрізаних {0} тайтл(ів)...", + "zh_CN": "正在精简 {0} 个游戏", + "zh_TW": "正在反修剪 {0} 個遊戲..." + } + }, + { + "ID": "XCITrimmerTitleStatusFailed", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Failed", + "es_ES": "Fallido", + "fr_FR": "Échoué", + "he_IL": "", + "it_IT": "Fallito", + "ja_JP": "", + "ko_KR": "실패", + "no_NO": "Mislyktes", + "pl_PL": "", + "pt_BR": "Falhou", + "ru_RU": "Ошибка", + "sv_SE": "Misslyckades", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Невдача", + "zh_CN": "失败", + "zh_TW": "失敗" + } + }, + { + "ID": "XCITrimmerPotentialSavings", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Potential Savings", + "es_ES": "Ahorro potencial", + "fr_FR": "Économies Potentielles", + "he_IL": "", + "it_IT": "Risparmio potenziale", + "ja_JP": "", + "ko_KR": "잠재적 비용 절감", + "no_NO": "Potensielle besparelser", + "pl_PL": "", + "pt_BR": "Economia Potencial", + "ru_RU": "Потенциально освобождено места", + "sv_SE": "Möjlig besparning", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Потенційна економія", + "zh_CN": "潜在的储存空间节省", + "zh_TW": "潛在節省的儲存空間" + } + }, + { + "ID": "XCITrimmerActualSavings", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Actual Savings", + "es_ES": "Ahorro real", + "fr_FR": "Économies Réelles", + "he_IL": "", + "it_IT": "Risparmio effettivo", + "ja_JP": "", + "ko_KR": "실제 비용 절감", + "no_NO": "Faktiske besparelser", + "pl_PL": "", + "pt_BR": "Economia Real", + "ru_RU": "Реально освобождено места", + "sv_SE": "Faktisk besparning", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Зекономлено", + "zh_CN": "实际的储存空间节省", + "zh_TW": "實際節省的儲存空間" + } + }, + { + "ID": "XCITrimmerSavingsMb", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0:n0} Mb", + "es_ES": "", + "fr_FR": "{0:n0} Mo", + "he_IL": "", + "it_IT": "{0:n0} MB", + "ja_JP": "", + "ko_KR": "{0:n0}MB", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "{0:n0} Мб", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "{0:n0} Мб", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "XCITrimmerSelectDisplayed", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Select Shown", + "es_ES": "Seleccionar mostrado(s)", + "fr_FR": "Sélectionner Affiché", + "he_IL": "", + "it_IT": "Seleziona visualizzati", + "ja_JP": "", + "ko_KR": "표시됨 선택", + "no_NO": "Velg vist", + "pl_PL": "", + "pt_BR": "Marcar Todos", + "ru_RU": "Выбрать то что показано", + "sv_SE": "Markera visade", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вибрати показані", + "zh_CN": "选定显示的", + "zh_TW": "選擇已顯示" + } + }, + { + "ID": "XCITrimmerDeselectDisplayed", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Deselect Shown", + "es_ES": "Deseleccionar mostrado(s)", + "fr_FR": "Désélectionner Affiché", + "he_IL": "", + "it_IT": "Deseleziona visualizzati", + "ja_JP": "", + "ko_KR": "표시됨 선택 취소", + "no_NO": "Opphev valg av Vist", + "pl_PL": "", + "pt_BR": "Desmarcar Todos", + "ru_RU": "Отменить выбор показанного", + "sv_SE": "Avmarkera visade", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Скасувати вибір показаного", + "zh_CN": "反选显示的", + "zh_TW": "取消選擇已顯示" + } + }, + { + "ID": "XCITrimmerSortName", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Title", + "es_ES": "Título", + "fr_FR": "Titre", + "he_IL": "", + "it_IT": "Titolo", + "ja_JP": "", + "ko_KR": "타이틀", + "no_NO": "Tittel", + "pl_PL": "", + "pt_BR": "Título", + "ru_RU": "Приложение", + "sv_SE": "Titel", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Назва", + "zh_CN": "标题", + "zh_TW": "名稱" + } + }, + { + "ID": "XCITrimmerSortSaved", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Space Savings", + "es_ES": "Ahorro de espacio", + "fr_FR": "Économies de disque dur", + "he_IL": "", + "it_IT": "Spazio risparmiato", + "ja_JP": "", + "ko_KR": "공간 절약s", + "no_NO": "Plassbesparelser", + "pl_PL": "", + "pt_BR": "Economia de Espaço", + "ru_RU": "Сохранение места на диске", + "sv_SE": "Utrymmesbesparning", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Економія місця", + "zh_CN": "节省空间", + "zh_TW": "節省的儲存空間" + } + }, + { + "ID": "XCITrimmerTrim", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Trim", + "es_ES": "Recortar", + "fr_FR": "Réduire", + "he_IL": "", + "it_IT": "Riduci dimensioni", + "ja_JP": "", + "ko_KR": "트림", + "no_NO": "", + "pl_PL": "", + "pt_BR": "Reduzir XCI", + "ru_RU": "Обрезать", + "sv_SE": "Optimera", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Обрізка", + "zh_CN": "瘦身", + "zh_TW": "修剪" + } + }, + { + "ID": "XCITrimmerUntrim", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Untrim", + "es_ES": "Deshacer recorte", + "fr_FR": "Dé-Réduire", + "he_IL": "", + "it_IT": "Riporta alle dimensioni originali", + "ja_JP": "", + "ko_KR": "언트림", + "no_NO": "Utrim", + "pl_PL": "", + "pt_BR": "Desfazer Redução", + "ru_RU": "Отмена обрезки", + "sv_SE": "Avoptimera", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Зшивання", + "zh_CN": "取消精简", + "zh_TW": "反修剪" + } + }, + { + "ID": "UpdateWindowUpdateAddedMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0} new update(s) added", + "es_ES": "{0} nueva(s) actualización(es) agregada(s)", + "fr_FR": "{0} nouvelle(s) mise(s) à jour ajoutée(s)", + "he_IL": "", + "it_IT": "{0} nuovo/i aggiornamento/i aggiunto/i", + "ja_JP": "", + "ko_KR": "{0}개의 새 업데이트가 추가됨", + "no_NO": "{0} ny(e) oppdatering(er) lagt til", + "pl_PL": "", + "pt_BR": "{0} nova(s) atualização(ões) adicionada(s)", + "ru_RU": "Добавлено {0} новых обновлений", + "sv_SE": "{0} nya uppdatering(ar) lades till", + "th_TH": "{0} อัพเดตที่เพิ่มมาใหม่", + "tr_TR": "", + "uk_UA": "{0} нових оновлень додано", + "zh_CN": "{0} 个更新被添加", + "zh_TW": "已加入 {0} 個遊戲更新" + } + }, + { + "ID": "UpdateWindowBundledContentNotice", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Bundled updates cannot be removed, only disabled.", + "es_ES": "Las actualizaciones agrupadas no pueden ser eliminadas, solamente deshabilitadas.", + "fr_FR": "Les mises à jour incluses avec le jeu ne peuvent pas être supprimées mais peuvent être désactivées.", + "he_IL": "", + "it_IT": "Gli aggiornamenti inclusi non possono essere rimossi, ma solo disabilitati.", + "ja_JP": "", + "ko_KR": "번들 업데이트는 제거할 수 없으며, 비활성화만 가능합니다.", + "no_NO": "Medfølgende oppdateringer kan ikke fjernes, bare deaktiveres.", + "pl_PL": "", + "pt_BR": "Atualizações incorporadas não podem ser removidas, apenas desativadas.", + "ru_RU": "Обновления бандлов не могут быть удалены, только отключены.", + "sv_SE": "Bundlade uppdateringar kan inte tas bort, endast inaktiveras.", + "th_TH": "แพ็คที่อัพเดตมาไม่สามารถลบทิ้งได้ สามารถปิดใช้งานได้เท่านั้น", + "tr_TR": "", + "uk_UA": "Вбудовані оновлення не можуть бути видалені, лише вимкнені.", + "zh_CN": "游戏整合的更新无法移除,可尝试禁用。", + "zh_TW": "附帶的遊戲更新只能被停用而無法被刪除。" + } + }, + { + "ID": "CheatWindowHeading", + "Translations": { + "ar_SA": "الغش متوفر لـ {0} [{1}]", + "de_DE": "Cheats verfügbar für {0} [{1}]", + "el_GR": "Διαθέσιμα Cheats για {0} [{1}]", + "en_US": "Cheats Available for {0} [{1}]", + "es_ES": "Cheats disponibles para {0} [{1}]", + "fr_FR": "Cheats disponibles pour {0} [{1}]", + "he_IL": "צ'יטים זמינים עבור {0} [{1}]", + "it_IT": "Trucchi disponibili per {0} [{1}]", + "ja_JP": "利用可能なチート {0} [{1}]", + "ko_KR": "{0} [{1}]에 사용 가능한 치트", + "no_NO": "Juks tilgjengelig for {0} [{1}]", + "pl_PL": "Kody Dostępne dla {0} [{1}]", + "pt_BR": "Trapaças disponíveis para {0} [{1}]", + "ru_RU": "Доступные читы для {0} [{1}]", + "sv_SE": "Fusk tillgängliga för {0} [{1}]", + "th_TH": "สูตรโกงมีให้สำหรับ {0} [{1}]", + "tr_TR": "{0} için Hile mevcut [{1}]", + "uk_UA": "Чит-коди доступні для {0} [{1}]", + "zh_CN": "适用于 {0} [{1}] 的金手指", + "zh_TW": "可用於 {0} [{1}] 的密技" + } + }, + { + "ID": "BuildId", + "Translations": { + "ar_SA": "معرف البناء:", + "de_DE": "", + "el_GR": "", + "en_US": "BuildId:", + "es_ES": "Id de compilación:", + "fr_FR": "BuildId :", + "he_IL": "מזהה בניה:", + "it_IT": "ID Build", + "ja_JP": "ビルドID:", + "ko_KR": "빌드ID:", + "no_NO": "VersjonsId:", + "pl_PL": "Identyfikator wersji:", + "pt_BR": "ID da Build:", + "ru_RU": "ID версии:", + "sv_SE": "Bygg-id:", + "th_TH": "รหัสการสร้าง:", + "tr_TR": "", + "uk_UA": "ID збірки:", + "zh_CN": "游戏版本 ID:", + "zh_TW": "組建識別碼:" + } + }, + { + "ID": "DlcWindowBundledContentNotice", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Bundled DLC cannot be removed, only disabled.", + "es_ES": "", + "fr_FR": "Le DLC inclus ne peut pas être supprimé, seulement désactivé.", + "he_IL": "", + "it_IT": "I DLC inclusi non possono essere rimossi, ma solo disabilitati.", + "ja_JP": "", + "ko_KR": "번들 DLC는 제거할 수 없으며 비활성화만 가능합니다.", + "no_NO": "Medfølgende DLC kan ikke fjernes, bare deaktiveres.", + "pl_PL": "", + "pt_BR": "DLCs incorporadas não podem ser removidas, apenas desativadas.", + "ru_RU": "DLC бандлов не могут быть удалены, только отключены.", + "sv_SE": "Bundlade DLC kan inte tas bort, endast inaktiveras.", + "th_TH": "แพ็ค DLC ไม่สามารถลบทิ้งได้ สามารถปิดใช้งานได้เท่านั้น", + "tr_TR": "", + "uk_UA": "Комплектні DLC (бандли) не можуть бути видаленими, лише вимкненими.", + "zh_CN": "游戏整合的 DLC 无法移除,可尝试禁用。", + "zh_TW": "附帶的 DLC 只能被停用而無法被刪除。" + } + }, + { + "ID": "DlcWindowHeading", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0} DLC(s) available", + "es_ES": "", + "fr_FR": "{0} DLC(s) disponibles", + "he_IL": "{0} הרחבות משחק", + "it_IT": "{0} DLC disponibile/i", + "ja_JP": "", + "ko_KR": "{0} DLC 사용 가능", + "no_NO": "{0} Nedlastbare innhold(er)", + "pl_PL": "", + "pt_BR": "{0} DLC(s) disponíveis", + "ru_RU": "{0} доступных DLC", + "sv_SE": "{0} DLC(er) tillgängliga", + "th_TH": "", + "tr_TR": "", + "uk_UA": "{0} DLC доступно", + "zh_CN": "{0} 个 DLC", + "zh_TW": "{0} 個可下載內容" + } + }, + { + "ID": "DlcWindowDlcAddedMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0} new downloadable content(s) added", + "es_ES": "Se agregaron {0} nuevo(s) contenido(s) descargable(s)", + "fr_FR": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)", + "he_IL": "", + "it_IT": "{0} nuovo/i DLC aggiunto/i", + "ja_JP": "", + "ko_KR": "{0}개의 새로운 내려받기 가능한 콘텐츠가 추가됨", + "no_NO": "{0} nytt nedlastbart innhold lagt til", + "pl_PL": "", + "pt_BR": "{0} novo(s) conteúdo(s) para download adicionado(s)", + "ru_RU": "Добавлено {0} новых DLC", + "sv_SE": "{0} nya hämtningsbara innehåll lades till", + "th_TH": "{0} DLC ใหม่ที่เพิ่มเข้ามา", + "tr_TR": "", + "uk_UA": "{0} нового завантажувального вмісту додано", + "zh_CN": "{0} 个 DLC 被添加", + "zh_TW": "已加入 {0} 個 DLC" + } + }, + { + "ID": "AutoloadDlcAddedMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0} new downloadable content(s) added", + "es_ES": "Se agregaron {0} nuevo(s) contenido(s) descargable(s)", + "fr_FR": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)", + "he_IL": "", + "it_IT": "{0} nuovo/i DLC aggiunto/i", + "ja_JP": "", + "ko_KR": "{0}개의 새로운 내려받기 가능한 콘텐츠가 추가됨", + "no_NO": "{0} nytt nedlastbart innhold lagt til", + "pl_PL": "", + "pt_BR": "{0} novo(s) conteúdo(s) para download adicionado(s)", + "ru_RU": "Добавлено {0} новых DLC", + "sv_SE": "{0} nya hämtningsbara innehåll lades till", + "th_TH": "{0} ใหม่ที่เพิ่มเข้ามา", + "tr_TR": "", + "uk_UA": "{0} нового завантажувального вмісту додано", + "zh_CN": "{0} 个 DLC 被添加", + "zh_TW": "已加入 {0} 個 DLC" + } + }, + { + "ID": "AutoloadDlcRemovedMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0} missing downloadable content(s) removed", + "es_ES": "Se eliminaron {0} contenido(s) descargable(s) faltantes", + "fr_FR": "{0} contenu(s) téléchargeable(s) manquant(s) supprimé(s)", + "he_IL": "", + "it_IT": "{0} DLC mancante/i rimosso/i", + "ja_JP": "", + "ko_KR": "{0}개의 내려받기 가능한 콘텐츠가 제거됨", + "no_NO": "{0} manglende nedlastbart innhold fjernet", + "pl_PL": "", + "pt_BR": "{0} conteúdo(s) para download ausente(s) removido(s)", + "ru_RU": "{0} отсутствующих DLC удалено", + "sv_SE": "{0} saknade hämtningsbara innehåll togs bort", + "th_TH": "", + "tr_TR": "", + "uk_UA": "{0} відсутнього завантажувального вмісту видалено", + "zh_CN": "{0} 个失效的 DLC 已移除", + "zh_TW": "已刪除 {0} 個遺失的 DLC" + } + }, + { + "ID": "AutoloadUpdateAddedMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0} new update(s) added", + "es_ES": "Se agregaron {0} nueva(s) actualización(es)", + "fr_FR": "{0} nouvelle(s) mise(s) à jour ajoutée(s)", + "he_IL": "", + "it_IT": "{0} nuovo/i aggiornamento/i aggiunto/i", + "ja_JP": "", + "ko_KR": "{0}개의 새 업데이트가 추가됨", + "no_NO": "{0} ny(e) oppdatering(er) lagt til", + "pl_PL": "", + "pt_BR": "{0} nova(s) atualização(ões) adicionada(s)", + "ru_RU": "{0} новых обновлений добавлено", + "sv_SE": "{0} nya uppdatering(ar) lades till", + "th_TH": "{0} อัพเดตใหม่ที่เพิ่มเข้ามา", + "tr_TR": "", + "uk_UA": "{0} нових оновлень додано", + "zh_CN": "{0} 个游戏更新被添加", + "zh_TW": "已加入 {0} 個遊戲更新" + } + }, + { + "ID": "AutoloadUpdateRemovedMessage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "{0} missing update(s) removed", + "es_ES": "Se eliminaron {0} actualización(es) faltantes", + "fr_FR": "{0} mises à jour manquantes supprimées", + "he_IL": "", + "it_IT": "{0} aggiornamento/i mancante/i rimosso/i", + "ja_JP": "", + "ko_KR": "누락된 업데이트 {0}개 삭제", + "no_NO": "{0} manglende oppdatering(er) fjernet", + "pl_PL": "", + "pt_BR": "{0} atualização(ões) ausente(s) removida(s)", + "ru_RU": "{0} отсутствующих обновлений удалено", + "sv_SE": "{0} saknade uppdatering(ar) togs bort", + "th_TH": "", + "tr_TR": "", + "uk_UA": "{0} відсутніх оновлень видалено", + "zh_CN": "{0} 个失效的游戏更新已移除", + "zh_TW": "已刪除 {0} 個遺失的遊戲更新" + } + }, + { + "ID": "ModWindowHeading", + "Translations": { + "ar_SA": "{0} تعديل", + "de_DE": "", + "el_GR": "", + "en_US": "{0} Mod(s)", + "es_ES": "", + "fr_FR": "", + "he_IL": "{0} מוד(ים)", + "it_IT": "{0} mod", + "ja_JP": "", + "ko_KR": "{0} 모드", + "no_NO": "{0} Modifikasjoner(s)", + "pl_PL": "{0} Mod(y/ów)", + "pt_BR": "", + "ru_RU": "Моды для {0} ", + "sv_SE": "{0} modd(ar)", + "th_TH": "{0} ม็อด", + "tr_TR": "{0} Mod(lar)", + "uk_UA": "{0} мод(ів)", + "zh_CN": "{0} Mod", + "zh_TW": "{0} 模組" + } + }, + { + "ID": "UserProfilesEditProfile", + "Translations": { + "ar_SA": "تعديل المحدد", + "de_DE": "Profil bearbeiten", + "el_GR": "Επεξεργασία Επιλεγμένων", + "en_US": "Edit Selected", + "es_ES": "Editar selección", + "fr_FR": "Éditer la sélection", + "he_IL": "ערוך נבחר/ים", + "it_IT": "Modifica selezionati", + "ja_JP": "編集", + "ko_KR": "선택 항목 편집", + "no_NO": "Rediger Valgte", + "pl_PL": "Edytuj Zaznaczone", + "pt_BR": "Editar selecionado", + "ru_RU": "Изменить выбранные", + "sv_SE": "Redigera markerade", + "th_TH": "แก้ไขที่เลือกแล้ว", + "tr_TR": "Seçiliyi Düzenle", + "uk_UA": "Редагувати вибране", + "zh_CN": "编辑所选", + "zh_TW": "編輯所選" + } + }, + { + "ID": "Continue", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Continue", + "es_ES": "Continuar", + "fr_FR": "Continuer", + "he_IL": "", + "it_IT": "Continua", + "ja_JP": "", + "ko_KR": "계속", + "no_NO": "Fortsett", + "pl_PL": "", + "pt_BR": "Continuar", + "ru_RU": "Продолжить", + "sv_SE": "Fortsätt", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Продовжити", + "zh_CN": "继续", + "zh_TW": "繼續" + } + }, + { + "ID": "Cancel", + "Translations": { + "ar_SA": "إلغاء", + "de_DE": "Abbrechen", + "el_GR": "Ακύρωση", + "en_US": "Cancel", + "es_ES": "Cancelar", + "fr_FR": "Annuler", + "he_IL": "בטל", + "it_IT": "Annulla", + "ja_JP": "キャンセル", + "ko_KR": "취소", + "no_NO": "Avbryt", + "pl_PL": "Anuluj", + "pt_BR": "Cancelar", + "ru_RU": "Отмена", + "sv_SE": "Avbryt", + "th_TH": "ยกเลิก", + "tr_TR": "İptal", + "uk_UA": "Скасувати", + "zh_CN": "取消", + "zh_TW": "取消" + } + }, + { + "ID": "Save", + "Translations": { + "ar_SA": "حفظ", + "de_DE": "Speichern", + "el_GR": "Αποθήκευση", + "en_US": "Save", + "es_ES": "Guardar", + "fr_FR": "Enregistrer", + "he_IL": "שמור", + "it_IT": "Salva", + "ja_JP": "セーブ", + "ko_KR": "저장", + "no_NO": "Lagre", + "pl_PL": "Zapisz", + "pt_BR": "Salvar", + "ru_RU": "Сохранить", + "sv_SE": "Spara", + "th_TH": "บันทึก", + "tr_TR": "Kaydet", + "uk_UA": "Зберегти", + "zh_CN": "保存", + "zh_TW": "儲存" + } + }, + { + "ID": "Discard", + "Translations": { + "ar_SA": "تجاهل", + "de_DE": "Verwerfen", + "el_GR": "Απόρριψη", + "en_US": "Discard", + "es_ES": "Descartar", + "fr_FR": "Abandonner", + "he_IL": "השלך", + "it_IT": "Scarta", + "ja_JP": "破棄", + "ko_KR": "폐기", + "no_NO": "Forkast", + "pl_PL": "Odrzuć", + "pt_BR": "Descartar", + "ru_RU": "Отменить", + "sv_SE": "Förkasta", + "th_TH": "ละทิ้ง", + "tr_TR": "Iskarta", + "uk_UA": "Скасувати", + "zh_CN": "放弃", + "zh_TW": "放棄變更" + } + }, + { + "ID": "Paused", + "Translations": { + "ar_SA": "متوقف مؤقتا", + "de_DE": "Pausiert", + "el_GR": "Σε παύση", + "en_US": "Paused", + "es_ES": "Pausado", + "fr_FR": "Suspendu", + "he_IL": "מושהה", + "it_IT": "In pausa", + "ja_JP": "一時停止中", + "ko_KR": "일시 중지됨", + "no_NO": "Satt på pause", + "pl_PL": "Wstrzymano", + "pt_BR": "Pausado", + "ru_RU": "Приостановлено", + "sv_SE": "Pausad", + "th_TH": "หยุดชั่วคราว", + "tr_TR": "Durduruldu", + "uk_UA": "Призупинено", + "zh_CN": "已暂停", + "zh_TW": "暫停" + } + }, + { + "ID": "UserProfilesSetProfileImage", + "Translations": { + "ar_SA": "تعيين صورة الملف الشخصي", + "de_DE": "Profilbild einrichten", + "el_GR": "Ορισμός Εικόνας Προφίλ", + "en_US": "Set Profile Image", + "es_ES": "Elegir Imagen de Perfil ", + "fr_FR": "Définir l'image de profil", + "he_IL": "הגדר תמונת פרופיל", + "it_IT": "Imposta immagine profilo", + "ja_JP": "プロファイル画像を設定", + "ko_KR": "프로필 이미지 설정", + "no_NO": "Angi profilbilde", + "pl_PL": "Ustaw Obraz Profilu", + "pt_BR": "Definir Imagem de Perfil", + "ru_RU": "Установить аватар", + "sv_SE": "Välj profilbild", + "th_TH": "ตั้งค่ารูปโปรไฟล์", + "tr_TR": "Profil Resmi Ayarla", + "uk_UA": "Встановити зображення профілю", + "zh_CN": "选择头像", + "zh_TW": "設定設定檔圖像" + } + }, + { + "ID": "UserProfileEmptyNameError", + "Translations": { + "ar_SA": "الاسم مطلوب", + "de_DE": "Name ist erforderlich", + "el_GR": "Απαιτείται όνομα", + "en_US": "Name is required", + "es_ES": "El nombre es obligatorio", + "fr_FR": "Le nom est requis", + "he_IL": "נדרש שם", + "it_IT": "Il nome è obbligatorio", + "ja_JP": "名称が必要です", + "ko_KR": "이름 필수 입력", + "no_NO": "Navn er påkrevd", + "pl_PL": "Nazwa jest wymagana", + "pt_BR": "Nome é obrigatório", + "ru_RU": "Необходимо ввести никнейм", + "sv_SE": "Namn krävs", + "th_TH": "จำเป็นต้องระบุชื่อ", + "tr_TR": "İsim gerekli", + "uk_UA": "Імʼя обовʼязкове", + "zh_CN": "必须输入名称", + "zh_TW": "名稱為必填" + } + }, + { + "ID": "UserProfileNoImageError", + "Translations": { + "ar_SA": "يجب تعيين صورة الملف الشخصي", + "de_DE": "Bitte ein Profilbild auswählen", + "el_GR": "Η εικόνα προφίλ πρέπει να οριστεί", + "en_US": "Profile image must be set", + "es_ES": "Debe establecerse la imagen de perfil", + "fr_FR": "L'image du profil doit être définie", + "he_IL": "נדרשת תמונת פרופיל", + "it_IT": "Dev'essere impostata un'immagine profilo", + "ja_JP": "プロファイル画像が必要です", + "ko_KR": "프로필 이미지를 설정해야 함", + "no_NO": "Profilbilde må være angitt", + "pl_PL": "Należy ustawić obraz profilowy", + "pt_BR": "A Imagem de Perfil Deve ser Definida", + "ru_RU": "Необходимо установить аватар", + "sv_SE": "Profilbild måste anges", + "th_TH": "จำเป็นต้องตั้งค่ารูปโปรไฟล์", + "tr_TR": "Profil resmi ayarlanmalıdır", + "uk_UA": "Зображення профілю обовʼязкове", + "zh_CN": "必须设置头像", + "zh_TW": "必須設定設定檔圖像" + } + }, + { + "ID": "GameUpdateWindowHeading", + "Translations": { + "ar_SA": "إدارة التحديثات لـ {0} ({1})", + "de_DE": "Update verfügbar für {0} [{1}]", + "el_GR": "{0} Update(s) available for {1} ({2})", + "en_US": "Manage Updates for {0} ({1})", + "es_ES": "Actualizaciones disponibles para {0} [{1}]", + "fr_FR": "Gérer les mises à jour pour {0} ({1})", + "he_IL": "נהל עדכונים עבור {0} ({1})", + "it_IT": "Gestisci aggiornamenti per {0} ({1})", + "ja_JP": "利用可能なアップデート {0} [{1}]", + "ko_KR": "{0} ({1})에 대한 업데이트 관리", + "no_NO": "Administrer oppdateringer for {0} ({1})", + "pl_PL": "{0} Aktualizacje dostępne dla {1} ({2})", + "pt_BR": "{0} atualizações disponíveis para {1} ({2})", + "ru_RU": "Доступные обновления для {0} ({1})", + "sv_SE": "Hantera uppdateringar för {0} ({1})", + "th_TH": "จัดการอัพเดตสำหรับ {0} ({1})", + "tr_TR": "{0} için güncellemeler mevcut [{1}]", + "uk_UA": "Доступні оновлення для {0} ({1})", + "zh_CN": "管理 {0} ({1}) 的更新", + "zh_TW": "管理 {0} 的更新 ({1})" + } + }, + { + "ID": "SettingsTabHotkeysResScaleUpHotkey", + "Translations": { + "ar_SA": "زيادة الدقة:", + "de_DE": "Auflösung erhöhen:", + "el_GR": "Αύξηση της ανάλυσης:", + "en_US": "Increase resolution:", + "es_ES": "Aumentar la resolución:", + "fr_FR": "Augmenter la résolution :", + "he_IL": "שפר רזולוציה:", + "it_IT": "Aumenta la risoluzione:", + "ja_JP": "解像度を上げる:", + "ko_KR": "해상도 증가 :", + "no_NO": "Øke oppløsning:", + "pl_PL": "Zwiększ Rozdzielczość:", + "pt_BR": "Aumentar a Resolução:", + "ru_RU": "Увеличить разрешение:", + "sv_SE": "Öka upplösning:", + "th_TH": "เพิ่มความละเอียด:", + "tr_TR": "Çözünürlüğü artır:", + "uk_UA": "Збільшити роздільну здатність:", + "zh_CN": "提高分辨率:", + "zh_TW": "提高解析度:" + } + }, + { + "ID": "SettingsTabHotkeysResScaleDownHotkey", + "Translations": { + "ar_SA": "خفض الدقة:", + "de_DE": "Auflösung verringern:", + "el_GR": "Μείωση της ανάλυσης:", + "en_US": "Decrease resolution:", + "es_ES": "Disminuir la resolución:", + "fr_FR": "Diminuer la résolution :", + "he_IL": "הפחת רזולוציה:", + "it_IT": "Riduci la risoluzione:", + "ja_JP": "解像度を下げる:", + "ko_KR": "해상도 감소 :", + "no_NO": "Reduser oppløsning:", + "pl_PL": "Zmniejsz Rozdzielczość:", + "pt_BR": "Reduzir a Resolução:", + "ru_RU": "Уменьшить разрешение:", + "sv_SE": "Sänk upplösning:", + "th_TH": "ลดความละเอียด:", + "tr_TR": "Çözünürlüğü azalt:", + "uk_UA": "Зменшити роздільну здатність:", + "zh_CN": "降低分辨率:", + "zh_TW": "降低解析度:" + } + }, + { + "ID": "UserProfilesName", + "Translations": { + "ar_SA": "الاسم:", + "de_DE": "", + "el_GR": "Όνομα:", + "en_US": "Name:", + "es_ES": "Nombre:", + "fr_FR": "Nom :", + "he_IL": "שם:", + "it_IT": "Nome:", + "ja_JP": "名称:", + "ko_KR": "이름 :", + "no_NO": "Navn:", + "pl_PL": "Nazwa:", + "pt_BR": "Nome:", + "ru_RU": "Никнейм:", + "sv_SE": "Namn:", + "th_TH": "ชื่อ:", + "tr_TR": "İsim:", + "uk_UA": "Імʼя", + "zh_CN": "名称:", + "zh_TW": "名稱:" + } + }, + { + "ID": "UserProfilesUserId", + "Translations": { + "ar_SA": "معرف المستخدم:", + "de_DE": "Benutzer-ID:", + "el_GR": "User Id:", + "en_US": "User ID:", + "es_ES": "Id de Usuario:", + "fr_FR": "Identifiant utilisateur : ", + "he_IL": "מזהה משתמש:", + "it_IT": "ID utente:", + "ja_JP": "ユーザID:", + "ko_KR": "사용자 ID :", + "no_NO": "Bruker ID:", + "pl_PL": "ID Użytkownika:", + "pt_BR": "ID de Usuário:", + "ru_RU": "ID пользователя:", + "sv_SE": "Användar-id:", + "th_TH": "รหัสผู้ใช้:", + "tr_TR": "Kullanıcı Adı:", + "uk_UA": "ID користувача:", + "zh_CN": "用户 ID:", + "zh_TW": "使用者 ID:" + } + }, + { + "ID": "SettingsTabGraphicsBackend", + "Translations": { + "ar_SA": "خلفية الرسومات", + "de_DE": "Grafik-Backend:", + "el_GR": "Σύστημα Υποστήριξης Γραφικών", + "en_US": "Graphics Backend", + "es_ES": "Fondo de gráficos", + "fr_FR": "API de Rendu", + "he_IL": "אחראי גראפיקה", + "it_IT": "Backend grafico", + "ja_JP": "グラフィックスバックエンド", + "ko_KR": "그래픽 후단부", + "no_NO": "Grafikk Backend", + "pl_PL": "Backend Graficzny", + "pt_BR": "Renderizador Gráfico", + "ru_RU": "Графический бэкенд", + "sv_SE": "Grafikbakände", + "th_TH": "กราฟิกเบื้องหลัง", + "tr_TR": "Grafik Arka Ucu", + "uk_UA": "Графічний API", + "zh_CN": "图形渲染引擎:", + "zh_TW": "圖形後端" + } + }, + { + "ID": "SettingsTabGraphicsBackendTooltip", + "Translations": { + "ar_SA": "حدد الواجهة الخلفية للرسومات التي سيتم استخدامها في المحاكي.\n\nيعد برنامج فولكان أفضل بشكل عام لجميع بطاقات الرسومات الحديثة، طالما أن برامج التشغيل الخاصة بها محدثة. يتميز فولكان أيضا بتجميع مظللات أسرع (أقل تقطيعا) على جميع بائعي وحدات معالجة الرسومات.\n\nقد يحقق أوبن جي أل نتائج أفضل على وحدات معالجة الرسومات إنفيديا القديمة، أو على وحدات معالجة الرسومات إي إم دي القديمة على لينكس، أو على وحدات معالجة الرسومات ذات ذاكرة الوصول العشوائي للفيديوالأقل، على الرغم من أن تعثرات تجميع المظللات ستكون أكبر.\n\nاضبط على فولكان إذا لم تكن متأكدا. اضبط على أوبن جي أل إذا كانت وحدة معالجة الرسومات الخاصة بك لا تدعم فولكان حتى مع أحدث برامج تشغيل الرسومات.", + "de_DE": "Wählen Sie das Grafik-Backend, das im Emulator verwendet werden soll.\n\nVulkan ist insgesamt besser für alle modernen Grafikkarten geeignet, sofern deren Treiber auf dem neuesten Stand sind. Vulkan bietet auch eine schnellere Shader-Kompilierung (weniger Stottern) auf allen GPU-Anbietern.\n\nOpenGL kann auf alten Nvidia-GPUs, alten AMD-GPUs unter Linux oder auf GPUs mit geringerem VRAM bessere Ergebnisse erzielen, obwohl die Shader-Kompilierung stärker stottert.\n\nSetzen Sie auf Vulkan, wenn Sie unsicher sind. Stellen Sie OpenGL ein, wenn Ihr Grafikprozessor selbst mit den neuesten Grafiktreibern Vulkan nicht unterstützt.", + "el_GR": "", + "en_US": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.", + "es_ES": "Seleccione el backend gráfico que utilizará el emulador.\n\nVulkan, en general, es mejor para todas las tarjetas gráficas modernas, mientras que sus controladores estén actualizados. Vulkan también cuenta con complicación más rápida de sombreadores (menos tirones) en todos los proveredores de GPU.\n\nOpenGL puede lograr mejores resultados en GPU Nvidia antiguas, GPU AMD antiguas en Linux o en GPUs con menor VRAM, aunque tirones de compilación de sombreadores serán mayores.\n\nSetear en Vulkan si no sabe que hacer. Setear en OpenGL si su GPU no tiene soporte para Vulkan aún con los últimos controladores gráficos.", + "fr_FR": "Sélectionnez le moteur graphique à utiliser dans l’émulateur.\n\nVulkan est généralement préférable pour toutes les cartes graphiques modernes, à condition que leurs pilotes soient à jour. Vulkan offre également une compilation des shaders plus rapide (moins de saccades) chez tous les fabricants de GPU.\n\nOpenGL peut donner de meilleurs résultats sur d’anciennes cartes Nvidia, sur de vieux GPU AMD sous Linux, ou sur des GPU avec moins de mémoire vidéo, mais la compilation des shaders provoquera davantage de saccade\n\nChoisissez Vulkan si vous n’êtes pas sûr. Optez pour OpenGL si votre GPU ne prend pas en charge Vulkan, même avec les derniers pilotes graphiques.", + "he_IL": "", + "it_IT": "Seleziona il backend grafico che verrà utilizzato nell'emulatore.\n\nVulkan è nel complesso migliore per tutte le schede grafiche moderne, a condizione che i relativi driver siano aggiornati. Vulkan dispone anche di una compilazione degli shader più veloce (con minore stuttering) su tutte le marche di GPU.\n\nOpenGL può ottenere risultati migliori su vecchie GPU Nvidia, su vecchie GPU AMD su Linux, o su GPU con poca VRAM, anche se lo stuttering dovuto alla compilazione degli shader sarà maggiore.\n\nNel dubbio, scegli Vulkan. Seleziona OpenGL se la GPU non supporta Vulkan nemmeno con i driver grafici più recenti.", + "ja_JP": "エミュレーションに使用するグラフィックスバックエンドを選択します.\n\nVulkanは, 最近のグラフィックカードでドライバが最新であれば, 全体的に優れています. すべてのGPUベンダーで, シェーダーコンパイルがより高速で, スタッタリングが少ないのが特徴です.\n\n古いNvidia GPU, Linuxでの古いAMD GPU, VRAMの少ないGPUなどでは, OpenGLの方が良い結果が得られるかもしれません. ですが, シェーダーコンパイルのスタッターは大きくなります.\n\n不明な場合はVulkanに設定してください。最新のグラフィックドライバでもVulkanをサポートしていないGPUの場合は, OpenGLに設定してください.", + "ko_KR": "에뮬레이터에서 사용할 그래픽 후단부를 선택합니다.\n\nVulkan은 드라이버가 최신 상태인 한 모든 최신 그래픽 카드에 전반적으로 더 좋습니다. Vulkan은 또한 모든 GPU 공급업체에서 더 빠른 셰이더 컴파일(덜 끊김)을 제공합니다.\n\nOpenGL은 오래된 Nvidia GPU, Linux의 오래된 AMD GPU 또는 VRAM이 낮은 GPU에서 더 나은 결과를 얻을 수 있지만 셰이더 컴파일 끊김이 더 큽니다.\n\n모르면 Vulkan으로 설정합니다. 최신 그래픽 드라이버를 사용해도 GPU가 Vulkan을 지원하지 않는 경우 OpenGL로 설정하세요..", + "no_NO": "Velg grafikkbackend som skal brukes i emulatoren.\n\nVulkan er generelt bedre for alle moderne grafikkort, så lenge driverne er oppdatert. Vulkan har også en raskere sammenstilling av Shader (mindre hakkete) på alle GPU-leverandører.\n\nOpenGL kan oppnå bedre resultater for eldre Nvidia GPU-er, på eldre AMD GPU-er på Linux, eller på GPU-er med lavere VRAM, selv om skyggekompileringsutløser vil være større.\n\nSett til Vulkan hvis du er usikker. Sett til OpenGL hvis ikke GPU-en støtter Vulkan selv med de nyeste grafikkdriverne.", + "pl_PL": "", + "pt_BR": "Selecione o renderizador gráfico que será usado no emulador.\n\nO Vulkan é melhor no geral para todas as placas de vídeo modernas, desde que seus drivers estejam atualizados. O Vulkan também apresenta compilação de shader mais rápida (menos travamentos) em todos os fornecedores de GPU.\n\nO OpenGL pode obter melhores resultados em GPUs Nvidia antigas, em GPUs AMD antigas no Linux ou em GPUs com VRAM menor, embora os travamentos de compilação de shader sejam maiores.\n\nDefina como Vulkan se não tiver certeza. Defina como OpenGL se sua GPU não suportar Vulkan, mesmo com os drivers gráficos mais recentes.", + "ru_RU": "Выбирает бэкенд, который будет использован в эмуляторе.\n\nVulkan является лучшим выбором для всех современных графических карт с актуальными драйверами. В Vulkan также включена более быстрая компиляция шейдеров (меньше статтеров) для всех видеоадаптеров.\n\nПри использовании OpenGL можно достичь лучших результатов на старых видеоадаптерах Nvidia и AMD в Linux или на видеоадаптерах с небольшим количеством видеопамяти, хотя статтеров при компиляции шейдеров будет больше.\n\nРекомендуется использовать Vulkan. Используйте OpenGL, если ваш видеоадаптер не поддерживает Vulkan даже с актуальными драйверами.", + "sv_SE": "Väljer den grafikbakände som ska användas i emulatorn.\n\nVulkan är oftast bättre för alla moderna grafikkort, så länge som deras drivrutiner är uppdaterade. Vulkan har också funktioner för snabbare shader compilation (mindre stuttering) för alla GPU-tillverkare.\n\nOpenGL kan nå bättre resultat på gamla Nvidia GPU:er, på äldre AMD GPU:er på Linux, eller på GPU:er med lägre VRAM, även om shader compilation stuttering kommer att vara större.\n\nStäll in till Vulkan om du är osäker. Ställ in till OpenGL om du GPU inte har stöd för Vulkan även med de senaste grafikdrivrutinerna.", + "th_TH": "เลือกกราฟิกเบื้องหลังที่จะใช้ในโปรแกรมจำลอง\n\nโดยรวมแล้ว Vulkan นั้นดีกว่าสำหรับการ์ดจอรุ่นใหม่ทั้งหมด ตราบใดที่ไดรเวอร์ยังอัพเดทอยู่เสมอ Vulkan ยังมีคุณสมบัติการคอมไพล์เชเดอร์ที่เร็วขึ้น(และลดอาการกระตุก) สำหรับ GPU อื่นๆทุกอัน\n\nOpenGL อาจได้รับผลลัพธ์ที่ดีกว่าบน Nvidia GPU รุ่นเก่า, AMD GPU รุ่นเก่าบน Linux หรือบน GPU ที่มี VRAM น้อย แม้ว่าการคอมไพล์เชเดอร์ จะทำให้อาการกระตุกมากขึ้นก็ตาม\n\nตั้งค่าเป็น Vulkan หากไม่แน่ใจ ตั้งค่าเป็น OpenGL หาก GPU ของคุณไม่รองรับ Vulkan แม้จะมีไดรเวอร์กราฟิกล่าสุดก็ตาม", + "tr_TR": "", + "uk_UA": "Оберіть графічний API (Graphics Backend), який буде використовуватись емулятором.\n\n\"Vulkan\" є найкращим вибором для всіх сучасних графічних процесорів (GPU) за умови наявності актуальних драйверів. Vulkan також забезпечує швидшу компіляцію шейдерів, що зменшує кількість фризів (т.зв. \"заїкань\" зображення), незалежно від виробника GPU.\n\n\"OpenGL\" може дати кращі результати на старих відеокартах Nvidia, старих відеокартах AMD на Linux або на відеокартах з меншою кількістю VRAM, але \"заїкання\" через компіляцію шейдерів будуть частіші.\n\nЯкщо не впевнені, встановіть на \"Vulkan\". Встановіть на \"OpenGL\", якщо ваша відеокарта не підтримує Vulkan навіть на останніх драйверах.", + "zh_CN": "选择模拟器中使用的图像渲染引擎。\n\n安装了最新显卡驱动程序的所有现代显卡基本都支持 Vulkan,Vulkan 能够提供更快的着色器编译(较少的卡顿)。\n\n在旧版 Nvidia 显卡上、Linux 上的旧版 AMD 显卡,或者显存较低的显卡上,OpenGL 可能会取得更好的效果,但着色器编译更慢(更多的卡顿)。\n\n如果不确定,请设置为“Vulkan”。如果您的 GPU 已安装了最新显卡驱动程序也不支持 Vulkan,那请设置为“OpenGL”。", + "zh_TW": "選擇模擬器將使用的圖形後端。\n\n只要驅動程式是最新的,Vulkan 對所有現代顯示卡來說都更好用。Vulkan 還能在所有 GPU 廠商上實現更快的著色器編譯 (減少卡頓)。\n\nOpenGL 在舊式 Nvidia GPU、Linux 上的舊式 AMD GPU 或 VRAM 較低的 GPU 上可能會取得更好的效果,不過著色器編譯的卡頓會更嚴重。\n\n如果不確定,請設定為 Vulkan。如果您的 GPU 使用最新的圖形驅動程式也不支援 Vulkan,請設定為 OpenGL。" + } + }, + { + "ID": "SettingsTabGraphicsBackendAuto", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Auto", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "Automatico", + "ja_JP": "", + "ko_KR": "자동", + "no_NO": "", + "pl_PL": "", + "pt_BR": "Automático", + "ru_RU": "Авто", + "sv_SE": "Automatiskt", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Автоматично", + "zh_CN": "自动", + "zh_TW": "自動" + } + }, + { + "ID": "SettingsTabGraphicsBackendAutoTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Uses Vulkan.\nOn an ARM Mac, and when playing a game that runs well under it, uses the Metal backend.", + "es_ES": "", + "fr_FR": "Utilise Vulkan.\nSur un Mac ARM, et lorsqu’un jeu fonctionne bien avec, utilise le moteur Metal.", + "he_IL": "", + "it_IT": "Utilizza Vulkan.\nSu un Mac con processore ARM, utilizza il backend Metal nei giochi che funzionano bene con quest'ultimo.", + "ja_JP": "", + "ko_KR": "Vulkan을 사용합니다.\nARM 맥에서 해당 플랫폼에서 잘 실행되는 게임을 플레이하는 경우 Metal 후단부를 사용합니다.", + "no_NO": "Bruker Vulkan \nPå en ARM Mac, og når du spiller et spill som kjører bra under den, bruker du Metal-backend.", + "pl_PL": "", + "pt_BR": "Usa Vulkan.\nEm um Mac ARM, e ao jogar um jogo que roda bem nele, usa o renderizador Metal.", + "ru_RU": "Использует Vulkan.\nНа Mac с ARM процессорами используется Metal, если игра с ним совместима и хорошо работает.", + "sv_SE": "Använder Vulkan.\nPå en ARM Mac och vid spel som körs bra på den så används Metal-bakänden.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Використовує Vulkan.\nНа Mac з процесором ARM використовується графічний API Metal, якщо гра під нього оптимізована.", + "zh_CN": "使用 Vulkan。\n在 ARM Mac 上,当玩在其下运行良好的游戏时,使用 Metal 后端。", + "zh_TW": "使用Vulkan。\n在 ARM Mac 上,如果遊戲執行性能良好時,則將使用 Metal 後端。" + } + }, + { + "ID": "SettingsEnableTextureRecompression", + "Translations": { + "ar_SA": "تمكين إعادة ضغط التكستر", + "de_DE": "Textur-Rekompression", + "el_GR": "Ενεργοποίηση Επανασυμπίεσης Των Texture", + "en_US": "Enable Texture Recompression", + "es_ES": "Activar recompresión de texturas", + "fr_FR": "Activer la recompression des textures", + "he_IL": "אפשר דחיסה מחדש של המרקם", + "it_IT": "Attiva la ricompressione delle texture", + "ja_JP": "テクスチャの再圧縮を有効にする", + "ko_KR": "텍스처 재압축 활성화", + "no_NO": "Aktiver teksturkomprimering", + "pl_PL": "Włącz Rekompresję Tekstur", + "pt_BR": "Habilitar Recompressão de Texturas", + "ru_RU": "Пережимать текстуры", + "sv_SE": "Aktivera Texture Recompression", + "th_TH": "เปิดใช้งาน การบีบอัดพื้นผิวอีกครั้ง", + "tr_TR": "Yeniden Doku Sıkıştırılmasını Aktif Et", + "uk_UA": "Увімкнути рекомпресію текстури", + "zh_CN": "启用纹理压缩", + "zh_TW": "啟用材質重新壓縮" + } + }, + { + "ID": "SettingsEnableTextureRecompressionTooltip", + "Translations": { + "ar_SA": "يضغط تكستر ASTC من أجل تقليل استخدام ذاكرة الوصول العشوائي للفيديو.\n\nتتضمن الألعاب التي تستخدم تنسيق النسيج هذا Astral Chain وBayonetta 3 وFire Emblem Engage وMetroid Prime Remastered وSuper Mario Bros. Wonder وThe Legend of Zelda: Tears of the Kingdom.\n\nمن المحتمل أن تتعطل بطاقات الرسومات التي تحتوي على 4 جيجا بايت من ذاكرة الوصول العشوائي للفيديو أو أقل في مرحلة ما أثناء تشغيل هذه الألعاب.\n\nقم بالتمكين فقط في حالة نفاد ذاكرة الوصول العشوائي للفيديو في الألعاب المذكورة أعلاه. اتركه معطلا إذا لم تكن متأكدا.", + "de_DE": "Komprimiert ASTC-Texturen, um die VRAM-Nutzung zu reduzieren.\n\nZu den Spielen, die dieses Texturformat verwenden, gehören Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder und The Legend of Zelda: Tears of the Kingdom.\n\nGrafikkarten mit 4GiB VRAM oder weniger werden beim Ausführen dieser Spiele wahrscheinlich irgendwann abstürzen.\n\nAktivieren Sie diese Option nur, wenn Ihnen bei den oben genannten Spielen der VRAM ausgeht. Lassen Sie es aus, wenn Sie unsicher sind.", + "el_GR": "", + "en_US": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.", + "es_ES": "Comprimir texturas ASTC para reducir uso de VRAM.\n\nJuegos que utilizan este formato de textura incluyen Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder y The Legend of Zelda: Tears of the Kingdom.\n\nTarjetas gráficas con 4GiB de VRAM o menos probalemente se caeran en algún momento mientras que estén corriendo estos juegos.\n\nActivar solo si está quedan sin VRAM en los juegos antes mencionados. Desactívalo si no sabes qué hacer.", + "fr_FR": "Compresse les textures ASTC pour réduire l’utilisation de la VRAM.\n\nLes jeux utilisant ce format de texture incluent Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder et The Legend of Zelda: Tears of the Kingdom.\n\nLes cartes graphiques avec 4GiO de VRAM ou moins risquent de planter à un moment donné en jouant à ces jeux.\n\nActivez cette option uniquement si vous manquez de VRAM sur ces jeux. Laissez DÉSACTIVÉ si vous n'êtes pas sûr.", + "he_IL": "", + "it_IT": "Comprime le texture ASTC per ridurre l'utilizzo di VRAM.\n\nI giochi che utilizzano questo formato di texture includono Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder e The Legend of Zelda: Tears of the Kingdom.\n\nLe schede grafiche con 4GiB o meno di VRAM probabilmente si bloccheranno ad un certo punto durante l'esecuzione di questi giochi.\n\nAttiva questa opzione solo se sei a corto di VRAM nei giochi sopra menzionati. Nel dubbio, lascia l'opzione disattivata.", + "ja_JP": "VRAM使用量を減らすためにASTCテクスチャを圧縮します.\n\nこのテクスチャフォーマットを使用するゲームには, Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder, The Legend of Zelda: Tears of the Kingdomが含まれます.\n\nVRAMが4GB以下のグラフィックカードでは, これらのゲームを実行中にクラッシュする可能性があります.\n\n前述のゲームでVRAMが不足している場合のみ有効にしてください. 不明な場合はオフにしてください.", + "ko_KR": "VRAM 사용량을 줄이기 위해 ASTC 텍스처를 압축합니다.\n\n이 텍스처 형식을 사용하는 게임에는 애스트럴 체인, 베요네타 3, 파이어 엠블렘 인게이지, 메트로이드 프라임 리마스터, 슈퍼 마리오브라더스 원더, 젤다의 전설 티어스 오브 더 킹덤이 있습니다.\n\n4GiB VRAM 이하의 그래픽 카드는 이러한 게임을 실행하는 동안 어느 시점에서 충돌할 가능성이 있습니다.\n\n위에서 언급한 게임에서 VRAM이 부족한 경우에만 활성화합니다. 모르면 체크 해제 상태로 두세요.", + "no_NO": "Kompresser ASTC-teksturer for å redusere VRAM-bruk.\n\nSpill som bruker dette teksturformatet, inkluderer Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGrafikkkort med 4GiB VRAM eller mindre, vil sannsynligvis krasje på et tidspunkt når spillene kjører.\n\nAktiver bare hvis du går tom for VRAM på nevnte spill. La AV om du er usikker.", + "pl_PL": "", + "pt_BR": "Compacta texturas ASTC para reduzir o uso de VRAM.\n\nJogos que usam esse formato de textura incluem Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder e The Legend of Zelda: Tears of the Kingdom.\n\nPlacas gráficas com 4GB VRAM ou menos provavelmente travarão em algum momento durante a execução desses jogos.\n\nHabilite somente se estiver ficando sem VRAM nos jogos mencionados acima. Deixe DESLIGADO se não tiver certeza.", + "ru_RU": "Сжатие ASTC текстур для уменьшения использования VRAM. \n\nИгры, использующие этот формат текстур: Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder и The Legend of Zelda: Tears of the Kingdom. \nНа видеоадаптерах с 4GiB видеопамяти или менее возможны вылеты при запуске этих игр. \n\nВключите, только если у вас заканчивается видеопамять в вышеупомянутых играх. \n\nРекомендуется оставить выключенным.", + "sv_SE": "Komprimerar ASTC-texturer för att minska VRAM-användning.\n\nSpel som använder detta texturformat inkluderar Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder och The Legend of Zelda: Tears of the Kingdom.\n\nGrafikkort med 4GiB VRAM eller mindre kommer sannolikt krascha någon gång när du kör dessa spel.\n\nAktivera endast om du har slut på VRAM på ovan nämnda spel. Lämna AV om du är osäker.", + "th_TH": "บีบอัดพื้นผิว ASTC เพื่อลดการใช้งาน VRAM\n\nเกมที่ใช้รูปแบบพื้นผิวนี้ ได้แก่ Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder และ The Legend of Zelda: Tears of the Kingdom\n\nการ์ดจอที่มี 4GiB VRAM หรือน้อยกว่ามีแนวโน้มที่จะพังในบางจุดขณะเล่นเกมเหล่านี้\n\nเปิดใช้งานเฉพาะในกรณีที่ VRAM ของคุณใกล้หมดในเกมที่กล่าวมาข้างต้น ปล่อยให้ปิดหากไม่แน่ใจ", + "tr_TR": "", + "uk_UA": "Стискає текстури ASTC, щоб зменшити використання VRAM.\n\nЦим форматом текстур користуються такі ігри, як: Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder та The Legend of Zelda: Tears of the Kingdom.\n\nІснує висока ймовірність збоїв при запуску цих ігор на відеокартах з 4ГБ VRAM або менше.\n\nВмикайте тільки якщо у вас закінчується VRAM на зазначених іграх. Залиште на \"Вимкнути\", якщо не впевнені.", + "zh_CN": "压缩 ASTC 纹理以减少 VRAM (显存)的占用。\n\n使用此纹理格式的游戏包括:异界锁链(Astral Chain),蓓优妮塔3(Bayonetta 3),火焰纹章Engage(Fire Emblem Engage),密特罗德 究极(Metroid Prime Remased),超级马力欧兄弟 惊奇(Super Mario Bros. Wonder)以及塞尔达传说 王国之泪(The Legend of Zelda: Tears of the Kingdom)。\n\n显存小于4GB的显卡在运行这些游戏时可能会偶发闪退。\n\n只有当您在上述游戏中的显存不足时才需要启用此选项。\n\n如果不确定,请保持关闭状态。", + "zh_TW": "壓縮 ASTC 紋理,以減少 VRAM 占用。\n\n使用這種紋理格式的遊戲包括 Astral Chain、Bayonetta 3、Fire Emblem Engage、Metroid Prime Remastered、Super Mario Bros. Wonder 和 The Legend of Zelda: Tears of the Kingdom。\n\n使用 4GB 或更低 VRAM 的顯示卡在執行這些遊戲時可能會崩潰。\n\n只有在上述遊戲的 VRAM 即將耗盡時才啟用。如果不確定,請保持關閉狀態。" + } + }, + { + "ID": "SettingsTabGraphicsPreferredGpu", + "Translations": { + "ar_SA": "وحدة معالجة الرسوميات المفضلة", + "de_DE": "Bevorzugte GPU:", + "el_GR": "Προτιμώμενη GPU", + "en_US": "Preferred GPU", + "es_ES": "GPU preferida", + "fr_FR": "GPU préféré", + "he_IL": "כרטיס גראפי מועדף", + "it_IT": "GPU preferita", + "ja_JP": "優先使用するGPU", + "ko_KR": "기본 GPU", + "no_NO": "Foretrukket GPU", + "pl_PL": "Preferowane GPU", + "pt_BR": "GPU Preferida", + "ru_RU": "Предпочтительный видеоадаптер", + "sv_SE": "Föredragen GPU", + "th_TH": "GPU ที่ต้องการ", + "tr_TR": "Kullanılan GPU", + "uk_UA": "Бажаний GPU", + "zh_CN": "首选 GPU:", + "zh_TW": "優先選取的 GPU" + } + }, + { + "ID": "SettingsTabGraphicsPreferredGpuTooltip", + "Translations": { + "ar_SA": "حدد بطاقة الرسومات التي سيتم استخدامها مع الواجهة الخلفية لرسومات فولكان.\n\nلا يؤثر على وحدة معالجة الرسومات التي سيستخدمها أوبن جي أل.\n\nاضبط على وحدة معالجة الرسومات التي تم وضع علامة عليها كـ \"dGPU\" إذا لم تكن متأكدًا. إذا لم يكن هناك واحد، اتركه.", + "de_DE": "Wähle die Grafikkarte aus, die mit dem Vulkan Grafik-Backend verwendet werden soll.\n\nDies hat keinen Einfluss auf die GPU die OpenGL verwendet.\n\nIm Zweifelsfall die als \"dGPU\" gekennzeichnete GPU auswählen. Diese Einstellung unberührt lassen, wenn keine zur Auswahl steht.", + "el_GR": "Επιλέξτε την κάρτα γραφικών η οποία θα χρησιμοποιηθεί από το Vulkan.\n\nΔεν επηρεάζει το OpenGL.\n\nΔιαλέξτε την GPU που διαθέτει την υπόδειξη \"dGPU\" αν δεν είστε βέβαιοι. Αν δεν υπάρχει κάποιαν, το πειράξετε", + "en_US": "Select the graphics card that will be used with the Vulkan graphics backend.\n\nDoes not affect the GPU that OpenGL will use.\n\nSet to the GPU flagged as \"dGPU\" if unsure. If there isn't one, leave untouched.", + "es_ES": "Selecciona la tarjeta gráfica que se utilizará con los back-end de gráficos Vulkan.\n\nNo afecta la GPU que utilizará OpenGL.\n\nFije a la GPU marcada como \"dGUP\" ante dudas. Si no hay una, no haga modificaciones.", + "fr_FR": "Sélectionnez la carte graphique qui sera utilisée avec le moteur graphique Vulkan.\n\nCela n’affecte pas le GPU utilisé par OpenGL.\n\nChoisissez le GPU identifié comme « dGPU » si vous n’êtes pas sûr. S’il n’y en a pas, laissez tel quel.", + "he_IL": "בחר את הכרטיס הגראפי שישומש עם הגראפיקה של וולקאן.\n\nדבר זה לא משפיע על הכרטיס הגראפי שישומש עם OpenGL.\n\nמוטב לבחור את ה-GPU המסומן כ-\"dGPU\" אם אינכם בטוחים, אם זו לא אופצייה, אל תשנו דבר.", + "it_IT": "Seleziona la scheda grafica che verrà usata con il backend grafico Vulkan.\n\nL'opzione non modifica la GPU usata da OpenGL.\n\nNel dubbio, seleziona la GPU contrassegnata come \"dGPU\". Se non ce n'è una, lascia intatta questa opzione.", + "ja_JP": "Vulkanグラフィックスバックエンドで使用されるグラフィックスカードを選択します.\n\nOpenGLが使用するGPUには影響しません.\n\n不明な場合は, \"dGPU\" としてフラグが立っているGPUに設定します. ない場合はそのままにします.", + "ko_KR": "Vulkan 그래픽 후단부와 함께 사용할 그래픽 카드를 선택하세요.\n\nOpenGL에서 사용할 GPU에는 영향을 미치지 않습니다.\n\n모르면 \"dGPU\"로 플래그가 지정된 GPU로 설정하세요. 없으면 그대로 두세요.", + "no_NO": "Velg grafikkkortet som skal brukes sammen med Vulkan grafikkbackenden\n\nPåvirker ikke GPU-er som OpenGL skal bruke.\n\nSett til GPU-merket som \"dGPU\" hvis usikker. Hvis det ikke det er en, la være uberørt.", + "pl_PL": "Wybierz kartę graficzną, która będzie używana z backendem graficznym Vulkan.\n\nNie wpływa na GPU używane przez OpenGL.\n\nW razie wątpliwości ustaw flagę GPU jako \"dGPU\". Jeśli żadnej nie ma, pozostaw nietknięte.", + "pt_BR": "Selecione a placa de vídeo que será usada com o renderizador gráfico Vulkan.\n\nNão afeta a GPU que OpenGL usará.\n\nSelecione \"dGPU\" em caso de dúvida. Se não houver nenhuma, não mexa.", + "ru_RU": "Выберает видеоадаптер, который будет использоваться графическим бэкендом Vulkan.\n\nЭта настройка не влияет на видеоадаптер, который будет использоваться с OpenGL.\n\nЕсли вы не уверены что нужно выбрать, используйте графический процессор, помеченный как «dGPU». Если его нет, оставьте выбор по умолчанию.", + "sv_SE": "Välj grafikkortet som ska användas med Vulkan-grafikbakänden.\n\nPåverkar inte GPU:n som OpenGL använder.\n\nStäll in till den GPU som flaggats som \"dGPU\" om osäker. Om det inte finns någon, lämna orörd.", + "th_TH": "เลือกการ์ดจอที่จะใช้กับแบ็กเอนด์กราฟิก Vulkan\n\nไม่ส่งผลต่อ GPU ที่ OpenGL จะใช้\n\nตั้งค่าเป็น GPU ที่ถูกตั้งค่าสถานะเป็น \"dGPU\" ถ้าหากคุณไม่แน่ใจ ,หากไม่มีก็ปล่อยทิ้งไว้โดยไม่ต้องแตะต้องมัน", + "tr_TR": "Vulkan Grafik Arka Ucu ile kullanılacak Ekran Kartını Seçin.\n\nOpenGL'nin kullanacağı GPU'yu etkilemez.\n\n Emin değilseniz \"dGPU\" olarak işaretlenmiş GPU'ya ayarlayın. Eğer yoksa, dokunmadan bırakın.\n", + "uk_UA": "Виберіть відеоадаптер (GPU), який використовуватиметься з графічним API Vulkan.\n\nНалаштування не впливає на відеоадаптер, що використовуватиме API OpenGL.\n\nОберіть «dGPU», якщо не впевнені. Якщо такого пункту немає, то залиште налаштування за замовчуванням.", + "zh_CN": "选择 Vulkan 图形引擎使用的 GPU。\n\n此选项不会影响 OpenGL 使用的 GPU。\n\n如果不确定,建议选择\"独立显卡(dGPU)\"。如果没有独立显卡,则无需改动此选项。", + "zh_TW": "選擇將與 Vulkan 圖形後端一起使用的顯示卡。\n\n不會影響 OpenGL 將使用的 GPU。\n\n如果不確定,請設定為標記為「dGPU」的 GPU。如果沒有,則保持原狀。" + } + }, + { + "ID": "SettingsAppRequiredRestartMessage", + "Translations": { + "ar_SA": "مطلوب إعادة تشغيل ريوجينكس", + "de_DE": "Ein Neustart von Ryujinx ist erforderlich", + "el_GR": "Απαιτείται Επανεκκίνηση Του Ryujinx", + "en_US": "Ryujinx Restart Required", + "es_ES": "Reinicio de Ryujinx requerido.", + "fr_FR": "Redémarrage de Ryujinx requis", + "he_IL": "ריוג'ינקס דורש אתחול מחדש", + "it_IT": "È richiesto un riavvio di Ryujinx", + "ja_JP": "Ryujinx の再起動が必要です", + "ko_KR": "Ryujinx 다시 시작 필요", + "no_NO": "Ryujinx Omstart nødvendig", + "pl_PL": "Wymagane Zrestartowanie Ryujinx", + "pt_BR": "Reinicialização do Ryujinx Necessária", + "ru_RU": "Требуется перезапуск Ryujinx", + "sv_SE": "Omstart av Ryujinx krävs", + "th_TH": "จำเป็นต้องรีสตาร์ท Ryujinx", + "tr_TR": "Ryujinx'i Yeniden Başlatma Gerekli", + "uk_UA": "Необхідно перезапустити Ryujinx", + "zh_CN": "Ryujinx 模拟器需要重启", + "zh_TW": "需要重新啟動 Ryujinx" + } + }, + { + "ID": "SettingsGpuBackendRestartMessage", + "Translations": { + "ar_SA": "تم تعديل إعدادات الواجهة الخلفية للرسومات أو وحدة معالجة الرسومات. سيتطلب هذا إعادة التشغيل ليتم تطبيقه", + "de_DE": "Das Grafik-Backend oder die Grafikkarteneinstellungen wurden geändert. Ein Neustart ist erforderlich um diese Einstellungen anzuwenden.", + "el_GR": "Οι ρυθμίσεις GPU έχουν αλλαχτεί. Θα χρειαστεί επανεκκίνηση του Ryujinx για να τεθούν σε ισχύ.", + "en_US": "Graphics Backend or GPU settings have been modified. This will require a restart to be applied", + "es_ES": "La configuración de la GPU o del back-end de los gráficos fue modificada. Es necesario reiniciar para que se aplique.", + "fr_FR": "Les paramètres de l'interface graphique ou du GPU ont été modifiés. Cela nécessitera un redémarrage pour être appliqué", + "he_IL": "הגדרות אחראי גרפיקה או כרטיס גראפי שונו. זה ידרוש הפעלה מחדש כדי להחיל שינויים", + "it_IT": "Le impostazioni del backend grafico o della GPU sono state modificate. È necessario un riavvio per applicare le modifiche", + "ja_JP": "グラフィックスバックエンドまたはGPUの設定が変更されました. 変更を適用するには再起動する必要があります", + "ko_KR": "그래픽 후단부 또는 GPU 설정이 수정되었습니다. 이를 적용하려면 다시 시작이 필요", + "no_NO": "Grafikk Backend eller GPU-innstillinger er endret. Dette krever en omstart for å aktiveres", + "pl_PL": "Zmieniono ustawienia Backendu Graficznego lub GPU. Będzie to wymagało ponownego uruchomienia", + "pt_BR": "Configurações do renderizador gráfico ou da GPU foram alteradas. Uma reinicialização é necessária para que as mudanças tenham efeito.", + "ru_RU": "Графический бэкенд или настройки графического процессора были изменены. Требуется перезапуск для вступления в силу изменений.", + "sv_SE": "Grafikbakänden eller GPU-inställningar har ändrats. Detta kräver en omstart", + "th_TH": "การตั้งค่ากราฟิกเบื้องหลังหรือ GPU ได้รับการแก้ไขแล้ว สิ่งนี้จะต้องมีการรีสตาร์ทจึงจะสามารถใช้งานได้", + "tr_TR": "Grafik Motoru ya da GPU ayarları değiştirildi. Bu işlemin uygulanması için yeniden başlatma gerekli.", + "uk_UA": "Налаштування графічного сервера або GPU було змінено. Для цього знадобиться перезапуск", + "zh_CN": "您修改了图形引擎或 GPU 设置,需要重启模拟器才能生效", + "zh_TW": "圖形後端或 GPU 設定已修改。這需要重新啟動才能套用。" + } + }, + { + "ID": "SettingsGpuBackendRestartSubMessage", + "Translations": { + "ar_SA": "\n\nهل تريد إعادة التشغيل الآن؟", + "de_DE": "Ryujinx jetzt neu starten?", + "el_GR": "Θέλετε να κάνετε επανεκκίνηση τώρα;", + "en_US": "Do you want to restart now?", + "es_ES": "¿Quieres reiniciar ahora?", + "fr_FR": "\n\nVoulez-vous redémarrer maintenant ?", + "he_IL": "האם ברצונך להפעיל מחדש כעט?", + "it_IT": "Vuoi riavviare ora?", + "ja_JP": "今すぐ再起動しますか?", + "ko_KR": "지금 다시 시작하시겠습니까?", + "no_NO": "Vil du starte på nytt nå?", + "pl_PL": "Czy chcesz zrestartować teraz?", + "pt_BR": "Deseja reiniciar agora?", + "ru_RU": "Перезапустить сейчас?", + "sv_SE": "Vill du starta om nu?", + "th_TH": "คุณต้องการรีสตาร์ทตอนนี้หรือไม่?", + "tr_TR": "Şimdi yeniden başlatmak istiyor musunuz?", + "uk_UA": "Бажаєте перезапустити зараз?", + "zh_CN": "是否要立即重启模拟器?", + "zh_TW": "您現在要重新啟動嗎?" + } + }, + { + "ID": "RyujinxUpdaterMessage", + "Translations": { + "ar_SA": "هل تريد تحديث ريوجينكس إلى أحدث إصدار؟", + "de_DE": "Möchtest du Ryujinx auf die neueste Version aktualisieren?", + "el_GR": "Θέλετε να ενημερώσετε το Ryujinx στην πιο πρόσφατη έκδοση:", + "en_US": "Do you want to update Ryujinx to the latest version?", + "es_ES": "¿Quieres actualizar Ryujinx a la última versión?", + "fr_FR": "Voulez-vous mettre à jour Ryujinx vers la dernière version ?", + "he_IL": "האם ברצונך לעדכן את ריוג'ינקס לגרסא האחרונה?", + "it_IT": "Vuoi aggiornare Ryujinx all'ultima versione?", + "ja_JP": "Ryujinx を最新版にアップデートしますか?", + "ko_KR": "Ryujinx를 최신 버전으로 업데이트하시겠습니까?", + "no_NO": "Ønsker du å oppdatere Ryujinx til den nyeste versjonen?", + "pl_PL": "Czy chcesz zaktualizować Ryujinx do najnowszej wersji?", + "pt_BR": "Você quer atualizar o Ryujinx para a última versão?", + "ru_RU": "Обновить Ryujinx до последней версии?", + "sv_SE": "Vill du uppdatera Ryujinx till senaste versionen?", + "th_TH": "คุณต้องการอัพเดต Ryujinx เป็นเวอร์ชั่นล่าสุดหรือไม่?", + "tr_TR": "Ryujinx'i en son sürüme güncellemek ister misiniz?", + "uk_UA": "Бажаєте оновити Ryujinx до останньої версії?", + "zh_CN": "是否更新 Ryujinx 到最新的版本?", + "zh_TW": "您想將 Ryujinx 升級到最新版本嗎?" + } + }, + { + "ID": "SettingsTabHotkeysVolumeUpHotkey", + "Translations": { + "ar_SA": "زيادة مستوى الصوت:", + "de_DE": "Lautstärke erhöhen:", + "el_GR": "Αύξηση Έντασης:", + "en_US": "Increase Volume:", + "es_ES": "Aumentar volumen:", + "fr_FR": "Augmenter le volume :", + "he_IL": "הגבר את עוצמת הקול:", + "it_IT": "Alza il volume:", + "ja_JP": "音量を上げる:", + "ko_KR": "음량 증가 :", + "no_NO": "Øk Volum:", + "pl_PL": "Zwiększ Głośność:", + "pt_BR": "Aumentar Volume:", + "ru_RU": "Увеличить громкость:", + "sv_SE": "Öka volym:", + "th_TH": "เพิ่มระดับเสียง:", + "tr_TR": "Sesi Arttır:", + "uk_UA": "Збільшити гучність:", + "zh_CN": "音量加:", + "zh_TW": "提高音量:" + } + }, + { + "ID": "SettingsTabHotkeysVolumeDownHotkey", + "Translations": { + "ar_SA": "خفض مستوى الصوت:", + "de_DE": "Lautstärke verringern:", + "el_GR": "Μείωση Έντασης:", + "en_US": "Decrease Volume:", + "es_ES": "Disminuir volumen:", + "fr_FR": "Diminuer le volume :", + "he_IL": "הנמך את עוצמת הקול:", + "it_IT": "Abbassa il volume:", + "ja_JP": "音量を下げる:", + "ko_KR": "음량 감소 :", + "no_NO": "Reduser Volum:", + "pl_PL": "Zmniejsz Głośność:", + "pt_BR": "Diminuir Volume:", + "ru_RU": "Уменьшить громкость:", + "sv_SE": "Sänk volym:", + "th_TH": "ลดระดับเสียง:", + "tr_TR": "Sesi Azalt:", + "uk_UA": "Зменшити гучність:", + "zh_CN": "音量减:", + "zh_TW": "降低音量:" + } + }, + { + "ID": "SettingsEnableMacroHLE", + "Translations": { + "ar_SA": "تمكين Maro HLE", + "de_DE": "HLE Makros aktivieren", + "el_GR": "Ενεργοποίηση του Macro HLE", + "en_US": "Enable Macro HLE", + "es_ES": "Activar Macros HLE", + "fr_FR": "Activer les macros HLE", + "he_IL": "", + "it_IT": "Attiva HLE macro", + "ja_JP": "マクロの高レベルエミュレーション (HLE) を有効にする", + "ko_KR": "매크로 HLE 활성화", + "no_NO": "Aktiver Makro HLE", + "pl_PL": "Włącz Macro HLE", + "pt_BR": "Habilitar Macro HLE", + "ru_RU": "Использовать макрос высокоуровневой эмуляции видеоадаптера", + "sv_SE": "Aktivera Macro HLE", + "th_TH": "เปิดใช้งาน มาโคร HLE", + "tr_TR": "Macro HLE'yi Aktifleştir", + "uk_UA": "Увімкнути макрос HLE", + "zh_CN": "启用 HLE 宏加速", + "zh_TW": "啟用 Macro HLE" + } + }, + { + "ID": "SettingsEnableMacroHLETooltip", + "Translations": { + "ar_SA": "محاكاة عالية المستوى لكود مايكرو وحدة معالجة الرسوميات.\n\nيعمل على تحسين الأداء، ولكنه قد يسبب خللا رسوميا في بعض الألعاب.\n\nاتركه مفعلا إذا لم تكن متأكدا.", + "de_DE": "High-Level-Emulation von GPU-Makrocode.\n\nVerbessert die Leistung, kann aber in einigen Spielen zu Grafikfehlern führen.\n\nBei Unsicherheit AKTIVIEREN.", + "el_GR": "Προσομοίωση του κώδικα GPU Macro .\n\nΒελτιώνει την απόδοση, αλλά μπορεί να προκαλέσει γραφικά προβλήματα σε μερικά παιχνίδια.\n\nΑφήστε ΕΝΕΡΓΟ αν δεν είστε σίγουροι.", + "en_US": "High-level emulation of GPU Macro code.\n\nImproves performance, but may cause graphical glitches in some games.\n\nLeave ON if unsure.", + "es_ES": "Emulación alto-nivel del código de Macros de GPU\n\nIncrementa el rendimiento, pero puede causar errores gráficos en algunos juegos.\n\nDeja esta opción activada si no estás seguro.", + "fr_FR": "Émulation de haut niveau du code de Macro GPU.\n\nAméliore les performances, mais peut causer des artefacts graphiques dans certains jeux.\n\nLaissez ACTIVÉ si vous n'êtes pas sûr.", + "he_IL": "אמולצייה ברמה גבוהה של כרטיס גראפי עם קוד מקרו.\n\nמשפר את ביצועי היישום אך עלול לגרום לגליצ'ים חזותיים במשחקים מסויימים.\n\nמוטב להשאיר דלוק אם אינך בטוח.", + "it_IT": "Emulazione di alto livello del codice macro della GPU.\n\nMigliora le prestazioni, ma può causare anomalie grafiche in alcuni giochi.\n\nNel dubbio, lascia l'opzione attiva.", + "ja_JP": "GPU マクロコードの高レベルエミュレーションです.\n\nパフォーマンスを向上させますが, 一部のゲームでグラフィックに不具合が発生する可能性があります.\n\nよくわからない場合はオンのままにしてください.", + "ko_KR": "GPU 매크로 코드의 고수준 에뮬레이션입니다.\n\n성능은 향상되지만 일부 게임에서 그래픽 오류가 발생할 수 있습니다.\n\n모르면 체크 상태로 두세요.", + "no_NO": "High-level emulering av GPU makrokode.\n\nForbedrer ytelse, men kan forårsake grafiske glitches i noen spill.\n\nForlat PÅ hvis usikker.", + "pl_PL": "Wysokopoziomowa emulacja kodu GPU Macro.\n\nPoprawia wydajność, ale może powodować błędy graficzne w niektórych grach.\n\nW razie wątpliwości pozostaw WŁĄCZONE.", + "pt_BR": "Habilita emulação de alto nível de códigos Macro da GPU.\n\nMelhora a performance, mas pode causar problemas gráficos em alguns jogos.\n\nEm caso de dúvida, deixe ATIVADO.", + "ru_RU": "Высокоуровневая эмуляция макрокода видеоадаптера.\n\nПовышает производительность, но может вызывать графические артефакты в некоторых играх.\n\nРекомендуется оставить включенным.", + "sv_SE": "Högnivåemulering av GPU Macro-kod.\n\nFörbättrar prestandan men kan orsaka grafiska glitches i vissa spel.\n\nLämna PÅ om du är osäker.", + "th_TH": "การจำลองระดับสูงของโค้ดมาโคร GPU\n\nปรับปรุงประสิทธิภาพ แต่อาจทำให้เกิดข้อผิดพลาดด้านกราฟิกในบางเกม\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", + "tr_TR": "GPU Macro kodunun yüksek seviye emülasyonu.\n\nPerformansı arttırır, ama bazı oyunlarda grafik hatalarına yol açabilir.\n\nEmin değilseniz AÇIK bırakın.", + "uk_UA": "Високорівнева емуляція коду макросу GPU.\n\nПокращує продуктивність, але може викликати графічні збої в деяких іграх.\n\nЗалиште увімкненим, якщо не впевнені.", + "zh_CN": "GPU 宏指令的高级模拟。\n\n提高性能表现,但一些游戏可能会出现图形错误。\n\n如果不确定,请保持开启状态。", + "zh_TW": "GPU 巨集程式碼的進階模擬。\n\n可提高效能,但在某些遊戲中可能會導致圖形閃爍。\n\n如果不確定,請保持開啟狀態。" + } + }, + { + "ID": "SettingsEnableColorSpacePassthrough", + "Translations": { + "ar_SA": "عبور مساحة اللون", + "de_DE": "Farbraum Passthrough", + "el_GR": "Διέλευση Χρωματικού Χώρου", + "en_US": "Color Space Passthrough", + "es_ES": "Paso de espacio de color", + "fr_FR": "Traversée de l'espace colorimétrique", + "he_IL": "שקיפות מרחב צבע", + "it_IT": "Passthrough dello spazio dei colori", + "ja_JP": "色空間をパススルー", + "ko_KR": "색 공간 통과", + "no_NO": "Fargeromsgjennomgang", + "pl_PL": "Przekazywanie przestrzeni kolorów", + "pt_BR": "Passagem do Espaço de Cores", + "ru_RU": "Пропускать цветовое пространство", + "sv_SE": "Genomströmning av färgrymd", + "th_TH": "ทะลุผ่านพื้นที่สี", + "tr_TR": "Renk Alanı Geçişi", + "uk_UA": "Наскрізний колірний простір", + "zh_CN": "色彩空间直通", + "zh_TW": "色彩空間直通" + } + }, + { + "ID": "SettingsEnableColorSpacePassthroughTooltip", + "Translations": { + "ar_SA": "يوجه واجهة فولكان الخلفية لتمرير معلومات الألوان دون تحديد مساحة اللون. بالنسبة للمستخدمين الذين لديهم شاشات ذات نطاق واسع، قد يؤدي ذلك إلى الحصول على ألوان أكثر حيوية، على حساب صحة الألوان.", + "de_DE": "Weist das Vulkan-Backend an, Farbinformationen ohne Angabe eines Farbraums weiterzuleiten. Für Benutzer mit Wide-Gamut-Displays kann dies zu lebendigeren Farben führen, allerdings auf Kosten der Farbkorrektheit.", + "el_GR": "Σκηνοθετεί το σύστημα υποστήριξης του Vulkan για να περάσει από πληροφορίες χρώματος χωρίς να καθορίσει έναν χρωματικό χώρο. Για χρήστες με ευρείες οθόνες γκάμας, αυτό μπορεί να οδηγήσει σε πιο ζωηρά χρώματα, με κόστος την ορθότητα του χρώματος.", + "en_US": "Directs the Vulkan backend to pass through color information without specifying a color space. For users with wide gamut displays, this may result in more vibrant colors, at the cost of color correctness.", + "es_ES": "Dirige el backend de Vulkan a pasar a través de la información del color sin especificar un espacio de color. Para los usuarios con pantallas de gran gama, esto puede resultar en colores más vibrantes, a costa de la corrección del color.", + "fr_FR": "Dirige l'interface graphique Vulkan pour qu'il transmette les informations de couleur sans spécifier d'espace colorimétrique. Pour les utilisateurs possédant des écrans Wide Color Gamut, cela peut entraîner des couleurs plus vives, au détriment de l'exactitude des couleurs.", + "he_IL": "מנחה את המנוע Vulkan להעביר שקיפות בצבעים מבלי לציין מרחב צבע. עבור משתמשים עם מסכים רחבים, הדבר עשוי לגרום לצבעים מרהיבים יותר, בחוסר דיוק בצבעים האמתיים.", + "it_IT": "Indica al backend Vulkan di passare le informazioni sul colore senza specificare uno spazio dei colori. Per gli utenti con schermi ad ampia gamma, ciò può rendere i colori più vivaci, sacrificando la correttezza del colore.", + "ja_JP": "Vulkan バックエンドに対して, 色空間を指定せずに色情報を渡します. 高色域ディスプレイを使用する場合, 正確ではないですがより鮮やかな色になる可能性があります.", + "ko_KR": "Vulkan 후단부가 색 공간을 지정하지 않고 색상 정보를 전달하도록 지시합니다. 넓은 색역 화면 표시 장치를 사용하는 사용자의 경우 색상 정확성을 희생하고 더 생생한 색상이 나올 수 있습니다.", + "no_NO": "Dirigerer Vulkan backenden til å gå gjennom farge informasjonen uten og spesifisere en fargeromsgjennomgang. For brukere med en bred spillvisning kan dette resultere i mer vibrerende farger og få riktig farge.", + "pl_PL": "Nakazuje API Vulkan przekazywać informacje o kolorze bez określania przestrzeni kolorów. Dla użytkowników z wyświetlaczami o szerokim zakresie kolorów może to skutkować bardziej żywymi kolorami, kosztem ich poprawności.", + "pt_BR": "Direciona o renderizador Vulkan para passar informações de cores sem especificar um espaço de cores. Para usuários com telas de ampla gama, isso pode resultar em cores mais vibrantes, ao custo da correção de cores.", + "ru_RU": "Направляет бэкенд Vulkan на передачу информации о цвете без указания цветового пространства. Для пользователей с экранами с расширенной гаммой данная настройка приводит к получению более ярких цветов за счет снижения корректности цветопередачи.", + "sv_SE": "Dirigerar Vulkan-bakänden att skicka genom färginformation utan att ange en färgrymd. För användare med breda gamut-skärmar kan detta resultera i mer levande färger på bekostnad av färgkorrekthet.", + "th_TH": "สั่งให้แบ็กเอนด์ Vulkan ส่งผ่านข้อมูลสีโดยไม่ต้องระบุค่าของสี สำหรับผู้ใช้ที่มีการแสดงกระจายตัวของสี อาจส่งผลให้สีสดใสมากขึ้น โดยต้องแลกกับความถูกต้องของสี", + "tr_TR": "Vulkan Backend'ini renk alanı belirtmeden renk bilgisinden geçmeye yönlendirir. Geniş gam ekranlı kullanıcılar için bu, renk doğruluğu pahasına daha canlı renklerle sonuçlanabilir.", + "uk_UA": "Дозволяє серверу Vulkan передавати інформацію про колір без вказівки колірного простору. Для користувачів з екранами з широкою гамою це може призвести до більш яскравих кольорів, але шляхом втрати коректності передачі кольору.", + "zh_CN": "使 Vulkan 图形引擎直接传输原始色彩信息。对于广色域 (例如 DCI-P3) 显示器的用户来说,可以产生更鲜艳的颜色,代价是损失部分色彩准确度。", + "zh_TW": "指示 Vulkan 後端在不指定色彩空間的情況下傳遞色彩資訊。對於使用廣色域顯示器的使用者來說,這可能會帶來更鮮艷的色彩,但代價是犧牲色彩的正確性。" + } + }, + { + "ID": "VolumeShort", + "Translations": { + "ar_SA": "مستوى", + "de_DE": "", + "el_GR": "Έντ.", + "en_US": "Vol", + "es_ES": "Volumen", + "fr_FR": "", + "he_IL": "שמע", + "it_IT": "", + "ja_JP": "音量", + "ko_KR": "음량", + "no_NO": "", + "pl_PL": "Głoś", + "pt_BR": "Volume", + "ru_RU": "Громкость", + "sv_SE": "Volym", + "th_TH": "ระดับเสียง", + "tr_TR": "Ses", + "uk_UA": "Гуч.", + "zh_CN": "音量", + "zh_TW": "音量" + } + }, + { + "ID": "UserProfilesManageSaves", + "Translations": { + "ar_SA": "إدارة الحفظ", + "de_DE": "Speicherstände verwalten", + "el_GR": "Διαχείριση Των Save", + "en_US": "Manage Saves", + "es_ES": "Administrar mis partidas guardadas", + "fr_FR": "Gérer les sauvegardes", + "he_IL": "נהל שמורים", + "it_IT": "Gestisci i salvataggi", + "ja_JP": "セーブデータの管理", + "ko_KR": "저장 관리", + "no_NO": "Administrer lagring", + "pl_PL": "Zarządzaj Zapisami", + "pt_BR": "Gerenciar Jogos Salvos", + "ru_RU": "Управление сохранениями", + "sv_SE": "Hantera sparade spel", + "th_TH": "จัดการบันทึก", + "tr_TR": "Kayıtları Yönet", + "uk_UA": "Керувати збереженнями", + "zh_CN": "管理存档", + "zh_TW": "管理存檔" + } + }, + { + "ID": "DeleteUserSave", + "Translations": { + "ar_SA": "هل تريد حذف حفظ المستخدم لهذه اللعبة؟", + "de_DE": "Möchtest du den Spielerstand für dieses Spiel löschen?", + "el_GR": "Επιθυμείτε να διαγράψετε το save χρήστη για το συγκεκριμένο παιχνίδι;", + "en_US": "Do you want to delete user save for this game?", + "es_ES": "¿Quieres borrar los datos de usuario de este juego?", + "fr_FR": "Voulez-vous supprimer la sauvegarde de l'utilisateur pour ce jeu ?", + "he_IL": "האם ברצונך למחוק את תקיית השמור למשחק זה?", + "it_IT": "Vuoi eliminare il salvataggio utente per questo gioco?", + "ja_JP": "このゲームのユーザセーブデータを削除しますか?", + "ko_KR": "이 게임의 사용자 저장을 삭제하시겠습니까?", + "no_NO": "Vil du slette bruker data for dette spillet?", + "pl_PL": "Czy chcesz usunąć zapis użytkownika dla tej gry?", + "pt_BR": "Deseja apagar o jogo salvo do usuário para este jogo?", + "ru_RU": "Удалить сохранения для этой игры?", + "sv_SE": "Vill du ta bort användarsparade spel för detta spel?", + "th_TH": "คุณต้องการลบบันทึกผู้ใช้สำหรับเกมนี้หรือไม่?", + "tr_TR": "Bu oyun için kullanıcı kaydını silmek istiyor musunuz?", + "uk_UA": "Ви хочете видалити збереження користувача для цієї гри?", + "zh_CN": "确定删除此游戏的用户存档吗?", + "zh_TW": "您想刪除此遊戲的使用者存檔嗎?" + } + }, + { + "ID": "IrreversibleActionNote", + "Translations": { + "ar_SA": "هذا الإجراء لا يمكن التراجع عنه.", + "de_DE": "Diese Option kann nicht rückgängig gemacht werden.", + "el_GR": "Αυτή η ενέργεια είναι μη αναστρέψιμη.", + "en_US": "This action is not reversible.", + "es_ES": "Esta acción no es reversible.", + "fr_FR": "Cette action n'est pas réversible.", + "he_IL": "הפעולה הזו בלתי הפיכה.", + "it_IT": "Questa azione non è reversibile.", + "ja_JP": "この操作は元に戻せません.", + "ko_KR": "이 작업은 되돌릴 수 없습니다.", + "no_NO": "Denne handlingen er ikke reverserbar.", + "pl_PL": "Ta czynność nie jest odwracalna.", + "pt_BR": "Esta ação não é reversível.", + "ru_RU": "Данное действие является необратимым.", + "sv_SE": "Denna åtgärd går inte att ångra.", + "th_TH": "การดำเนินการนี้ไม่สามารถย้อนกลับได้", + "tr_TR": "Bu eylem geri alınamaz.", + "uk_UA": "Цю дію не можна скасувати.", + "zh_CN": "删除后不可恢复。", + "zh_TW": "此動作將無法復原。" + } + }, + { + "ID": "SaveManagerHeading", + "Translations": { + "ar_SA": "إدارة الحفظ لـ {0} ({1})", + "de_DE": "Spielstände für {0} verwalten", + "el_GR": "Manage Saves for {0}", + "en_US": "Manage Saves for {0} ({1})", + "es_ES": "Administrar partidas guardadas para {0}", + "fr_FR": "Gérer les sauvegardes pour {0} ({1})", + "he_IL": "נהל שמורי משחק עבור {0} ({1})", + "it_IT": "Gestisci salvataggi per {0} ({1})", + "ja_JP": "{0} のセーブデータを管理", + "ko_KR": "{0} ({1})에 대한 저장 관리", + "no_NO": "Administrer lagring for {0} ({1})", + "pl_PL": "Zarządzaj Zapisami dla {0}", + "pt_BR": "Gerenciar Jogos Salvos para {0}", + "ru_RU": "Редактирование сохранений для {0} ({1})", + "sv_SE": "Hantera sparade spel för {0} ({1})", + "th_TH": "จัดการบันทึกสำหรับ {0} ({1})", + "tr_TR": "{0} için Kayıt Dosyalarını Yönet", + "uk_UA": "Керувати збереженнями для {0}", + "zh_CN": "管理 {0} ({1}) 的存档", + "zh_TW": "管理 {0} 的存檔 ({1})" + } + }, + { + "ID": "SaveManagerTitle", + "Translations": { + "ar_SA": "مدير الحفظ", + "de_DE": "Speicherdaten Manager", + "el_GR": "Διαχειριστής Save", + "en_US": "Save Manager", + "es_ES": "Administrador de datos de guardado.", + "fr_FR": "Gestionnaire de sauvegarde", + "he_IL": "מנהל שמירות", + "it_IT": "Gestione salvataggi", + "ja_JP": "セーブデータマネージャ", + "ko_KR": "관리자 저장", + "no_NO": "Lagre behandler", + "pl_PL": "Menedżer Zapisów", + "pt_BR": "Gerenciador de Jogos Salvos", + "ru_RU": "Менеджер сохранений", + "sv_SE": "Sparhanterare", + "th_TH": "จัดการบันทึก", + "tr_TR": "Kayıt Yöneticisi", + "uk_UA": "Менеджер збереження", + "zh_CN": "存档管理器", + "zh_TW": "存檔管理員" + } + }, + { + "ID": "Name", + "Translations": { + "ar_SA": "الاسم", + "de_DE": "", + "el_GR": "Όνομα", + "en_US": "Name", + "es_ES": "Nombre", + "fr_FR": "Nom\u00A0", + "he_IL": "שם", + "it_IT": "Nome", + "ja_JP": "名称", + "ko_KR": "이름", + "no_NO": "Navn", + "pl_PL": "Nazwa", + "pt_BR": "Nome", + "ru_RU": "Название", + "sv_SE": "Namn", + "th_TH": "ชื่อ", + "tr_TR": "İsim", + "uk_UA": "Назва", + "zh_CN": "名称", + "zh_TW": "名稱" + } + }, + { + "ID": "Size", + "Translations": { + "ar_SA": "الحجم", + "de_DE": "Größe", + "el_GR": "Μέγεθος", + "en_US": "Size", + "es_ES": "Tamaño", + "fr_FR": "Taille", + "he_IL": "גודל", + "it_IT": "Dimensione", + "ja_JP": "サイズ", + "ko_KR": "크기", + "no_NO": "Størrelse", + "pl_PL": "Rozmiar", + "pt_BR": "Tamanho", + "ru_RU": "Размер", + "sv_SE": "Storlek", + "th_TH": "ขนาด", + "tr_TR": "Boyut", + "uk_UA": "Розмір", + "zh_CN": "大小", + "zh_TW": "大小" + } + }, + { + "ID": "Search", + "Translations": { + "ar_SA": "بحث", + "de_DE": "Suche", + "el_GR": "Αναζήτηση", + "en_US": "Search", + "es_ES": "Buscar", + "fr_FR": "Rechercher", + "he_IL": "חפש", + "it_IT": "Cerca", + "ja_JP": "検索", + "ko_KR": "찾기", + "no_NO": "Søk", + "pl_PL": "Wyszukaj", + "pt_BR": "Buscar", + "ru_RU": "Поиск", + "sv_SE": "Sök", + "th_TH": "ค้นหา", + "tr_TR": "Ara", + "uk_UA": "Пошук", + "zh_CN": "搜索", + "zh_TW": "搜尋" + } + }, + { + "ID": "UserProfilesRecoverLostAccounts", + "Translations": { + "ar_SA": "استعادة الحسابات المفقودة", + "de_DE": "Konto wiederherstellen", + "el_GR": "Ανάκτηση Χαμένων Λογαριασμών", + "en_US": "Recover Lost Accounts", + "es_ES": "Recuperar cuentas perdidas", + "fr_FR": "Récupérer les profils perdus", + "he_IL": "שחזר חשבון שאבד", + "it_IT": "Recupera account persi", + "ja_JP": "アカウントの復旧", + "ko_KR": "잃어버린 계정 복구", + "no_NO": "Gjenopprett tapte kontoer", + "pl_PL": "Odzyskaj Utracone Konta", + "pt_BR": "Recuperar Contas Perdidas", + "ru_RU": "Восстановить учётные записи", + "sv_SE": "Återskapa förlorade konton", + "th_TH": "กู้คืนบัญชีที่สูญหาย", + "tr_TR": "Kayıp Hesapları Kurtar", + "uk_UA": "Відновлення профілів", + "zh_CN": "恢复丢失的账户", + "zh_TW": "復原遺失的帳戶" + } + }, + { + "ID": "Recover", + "Translations": { + "ar_SA": "استعادة", + "de_DE": "Wiederherstellen", + "el_GR": "Ανάκτηση", + "en_US": "Recover", + "es_ES": "Recuperar", + "fr_FR": "Récupérer", + "he_IL": "שחזר", + "it_IT": "Recupera", + "ja_JP": "復旧", + "ko_KR": "복구", + "no_NO": "Gjenopprett", + "pl_PL": "Odzyskaj", + "pt_BR": "Recuperar", + "ru_RU": "Восстановление", + "sv_SE": "Återskapa", + "th_TH": "กู้คืน", + "tr_TR": "Kurtar", + "uk_UA": "Відновити", + "zh_CN": "恢复", + "zh_TW": "復原" + } + }, + { + "ID": "UserProfilesRecoverHeading", + "Translations": { + "ar_SA": "تم العثور على حفظ للحسابات التالية", + "de_DE": "Speicherstände wurden für die folgenden Konten gefunden", + "el_GR": "Βρέθηκαν save για τους ακόλουθους λογαριασμούς", + "en_US": "Saves were found for the following accounts", + "es_ES": "Datos de guardado fueron encontrados para las siguientes cuentas", + "fr_FR": "Des sauvegardes ont été trouvées pour les profils suivants", + "he_IL": "שמורים נמצאו לחשבונות הבאים", + "it_IT": "Sono stati trovati dei salvataggi per i seguenti account", + "ja_JP": "以下のアカウントのセーブデータが見つかりました", + "ko_KR": "다음 계정에 대한 저장 발견", + "no_NO": "Lagring ble funnet for følgende kontoer", + "pl_PL": "Znaleziono zapisy dla następujących kont", + "pt_BR": "Jogos salvos foram encontrados para as seguintes contas", + "ru_RU": "Были найдены сохранения для следующих аккаунтов", + "sv_SE": "Sparade spel hittades för följande konton", + "th_TH": "พบบันทึกสำหรับบัญชีดังต่อไปนี้", + "tr_TR": "Aşağıdaki hesaplar için kayıtlar bulundu", + "uk_UA": "Знайдено збереження для наступних облікових записів", + "zh_CN": "找到了这些用户的存档数据", + "zh_TW": "發現下列帳戶有一些存檔" + } + }, + { + "ID": "UserProfilesRecoverEmptyList", + "Translations": { + "ar_SA": "لا توجد ملفات شخصية لاستردادها", + "de_DE": "Keine Profile zum Wiederherstellen", + "el_GR": "Δεν υπάρχουν προφίλ για ανάκτηση", + "en_US": "No profiles to recover", + "es_ES": "No hay perfiles a recuperar", + "fr_FR": "Aucun profil à restaurer", + "he_IL": "אין פרופילים לשחזור", + "it_IT": "Nessun profilo da recuperare", + "ja_JP": "復元するプロファイルはありません", + "ko_KR": "복구할 프로필 없음", + "no_NO": "Ingen profiler å gjenopprette", + "pl_PL": "Brak profili do odzyskania", + "pt_BR": "Nenhum perfil para recuperar", + "ru_RU": "Нет учётных записей для восстановления", + "sv_SE": "Inga profiler att återskapa", + "th_TH": "ไม่มีโปรไฟล์ที่สามารถกู้คืนได้", + "tr_TR": "Kurtarılacak profil bulunamadı", + "uk_UA": "Немає профілів для відновлення", + "zh_CN": "没有可以恢复的用户数据", + "zh_TW": "無設定檔可復原" + } + }, + { + "ID": "GraphicsAATooltip", + "Translations": { + "ar_SA": "يتم تطبيق تنعيم الحواف على عرض اللعبة.\n\nسوف يقوم FXAA بتعتيم معظم الصورة، بينما سيحاول SMAA العثور على حواف خشنة وتنعيمها.\n\nلا ينصح باستخدامه مع فلتر FSR لتكبير.\n\nيمكن تغيير هذا الخيار أثناء تشغيل اللعبة بالنقر فوق \"تطبيق\" أدناه؛ يمكنك ببساطة تحريك نافذة الإعدادات جانبا والتجربة حتى تجد المظهر المفضل للعبة.\n\nاتركه على لا شيء إذا لم تكن متأكدا.", + "de_DE": "Wendet Anti-Aliasing auf das Rendering des Spiels an.\n\nFXAA verwischt den größten Teil des Bildes, während SMAA versucht, gezackte Kanten zu finden und sie zu glätten.\n\nEs wird nicht empfohlen, diese Option in Verbindung mit dem FSR-Skalierungsfilter zu verwenden.\n\nDiese Option kann geändert werden, während ein Spiel läuft, indem Sie unten auf \"Anwenden\" klicken; Sie können das Einstellungsfenster einfach zur Seite schieben und experimentieren, bis Sie Ihr bevorzugtes Aussehen für ein Spiel gefunden haben.\n\nLassen Sie die Option auf NONE, wenn Sie unsicher sind.", + "el_GR": "", + "en_US": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.", + "es_ES": "Aplica antia-aliasing al rendereo del juego.\n\nFXAA desenfocará la mayor parte del la iamgen, mientras que SMAA intentará encontrar bordes irregulares y suavizarlos.\n\nNo se recomienda usar en conjunto con filtro de escala FSR.\n\nEsta opción puede ser modificada mientras que esté corriendo el juego haciendo click en \"Aplicar\" más abajo; simplemente puedes mover la ventana de configuración a un lado y experimentar hasta que encuentres tu estilo preferido para un juego.\n\nDejar en NADA si no está seguro.", + "fr_FR": "Applique l’anticrénelage au rendu du jeu.\n\nFXAA floute la plupart de l’image, tandis que SMAA tente de détecter les contours irréguliers pour les lisser.\n\nIl n’est pas recommandé d’utiliser cette option avec le filtre de mise à l’échelle FSR.\n\nCette option peut être modifiée pendant que le jeu tourne en cliquant sur « Appliquer » ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres pour tester jusqu’à trouver l’apparence qui vous convient.\n\nLaissez sur AUCUN si vous n’êtes pas sûr.", + "he_IL": "", + "it_IT": "Applica l'anti-aliasing al rendering del gioco.\n\nFXAA rende la maggior parte dell'immagine sfocata, mentre SMAA tenta di rilevare e smussare i bordi frastagliati.\n\nSi consiglia di non usarlo in combinazione con il filtro di scaling FSR.\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nNel dubbio, lascia su Nessuno.", + "ja_JP": "ゲームレンダリングにアンチエイリアスを適用します.\n\nFXAAは画像の大部分をぼかし, SMAAはギザギザのエッジを見つけて滑らかにします.\n\nFSRスケーリングフィルタとの併用は推奨しません.\n\nこのオプションは, ゲーム実行中に下の「適用」をクリックして変更できます. 設定ウィンドウを脇に移動し, ゲームが好みの表示になるように試してみてください.\n\n不明な場合は「なし」のままにしておいてください.", + "ko_KR": "게임 렌더에 앤티 앨리어싱을 적용합니다.\n\nFXAA는 이미지 대부분을 흐리게 처리하지만 SMAA는 들쭉날쭉한 가장자리를 찾아 부드럽게 처리합니다.\n\nFSR 스케일링 필터와 함께 사용하지 않는 것이 좋습니다.\n\n이 옵션은 아래의 \"적용\"을 클릭하여 게임을 실행하는 동안 변경할 수 있습니다. 설정 창을 옆으로 옮겨 원하는 게임의 모습을 찾을 때까지 실험해 볼 수 있습니다.\n\n모르면 없음으로 두세요.", + "no_NO": "Aktiverer anti-aliasing til spill render.\n\nFXAA vil gjøre det meste av bildet, mens SMAA vil forsøke å finne berørte kanter og glatte dem ut.\n\nAnbefales ikke til bruk i forbindelse med FSR-skaleringsfilteret.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nForlat på NONE hvis usikker.", + "pl_PL": "", + "pt_BR": "Aplica anti-aliasing à renderização do jogo.\n\nFXAA borrará a maior parte da imagem, enquanto SMAA tentará identificar e suavizar bordas serrilhadas.\n\nNão é recomendado usar em conjunto com o filtro de escala FSR.\n\nEssa opção pode ser alterada enquanto o jogo está em execução clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nDeixe em NENHUM se estiver em dúvida.", + "ru_RU": "Применимое сглаживание для рендера.\n\nFXAA размывает большую часть изображения, SMAA попытается найти «зазубренные» края и сгладить их.\n\nНе рекомендуется использовать вместе с масштабирующим фильтром FSR.\n\nЭта опция может быть изменена во время игры по нажатию «Применить» ниже; \nВы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не найдёте подходящую настройку игры.\n\nРекомендуется использовать «Нет».", + "sv_SE": "Tillämpar anti-aliasing på spelrenderaren.\n\nFXAA kommer att sudda det mesta av bilden, medan SMAA kommer att försöka hitta taggiga kanter och släta ut dem.\n\nRekommenderas inte att använda tillsammans med skalfiltret FSR.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. Du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som INGEN om du är osäker.", + "th_TH": "ใช้การลดรอยหยักกับการเรนเดอร์เกม\n\nFXAA จะเบลอภาพส่วนใหญ่ ในขณะที่ SMAA จะพยายามค้นหารอยหยักและปรับให้เรียบ\n\nไม่แนะนำให้ใช้ร่วมกับตัวกรองสเกล FSR\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nปล่อยไว้ที่ NONE หากไม่แน่ใจ", + "tr_TR": "", + "uk_UA": "Вмикає згладжування (Anti-aliasing).\n\nFXAA розмиє зображення, тоді як SMAA намагається згладжувати нерівні краї зображення. FXAA (продуктивність) вимагатиме менше обчислювальних ресурсів, аніж SMAA (якість).\n\nНе рекомендується використовувати разом з фільтром масштабування FSR.\n\nЦю опцію можна міняти під час гри натисканням \"Застосувати\" в цьому вікні; щоб знайти найкращий варіант, просто відсуньте вікно налаштувань і поекспериментуйте.\n\nЗалиште \"Немає\", якщо не впевнені.", + "zh_CN": "抗锯齿是一种图形处理技术,用于减少图像边缘的锯齿状现象,使图像更加平滑。\n\nFXAA(快速近似抗锯齿)是一种性能开销相对较小的抗锯齿方法,但可能会使得整体图像看起来有些模糊。\n\nSMAA(增强型子像素抗锯齿)则更加精细,它会尝试找到锯齿边缘并平滑它们,相比 FXAA 有更好的图像质量,但性能开销可能会稍大一些。\n\n如果开启了 FSR(FidelityFX Super Resolution,超级分辨率锐画技术)来提高性能或图像质量,不建议再启用抗锯齿,因为它们会产生不必要的图形处理开销,或者相互之间效果不协调。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“无”。", + "zh_TW": "對遊戲繪製進行反鋸齒處理。\n\nFXAA 會模糊大部分圖像,而 SMAA 則會嘗試找出鋸齒邊緣並將其平滑化。\n\n不建議與 FSR 縮放濾鏡一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請選擇無狀態。" + } + }, + { + "ID": "GraphicsAALabel", + "Translations": { + "ar_SA": "تنعيم الحواف:", + "de_DE": "Antialiasing:", + "el_GR": "Anti-Aliasing", + "en_US": "Anti-Aliasing:", + "es_ES": "Suavizado de bordes:", + "fr_FR": "Anticrénelage :", + "he_IL": "החלקת-עקומות:", + "it_IT": "Anti-aliasing:", + "ja_JP": "アンチエイリアス:", + "ko_KR": "앤티 앨리어싱 :", + "no_NO": "Kantutjevning:", + "pl_PL": "Antyaliasing:", + "pt_BR": "Anti-Serrilhado:", + "ru_RU": "Сглаживание:", + "sv_SE": "Antialiasing:", + "th_TH": "ลดการฉีกขาดของภาพ:", + "tr_TR": "Kenar Yumuşatma:", + "uk_UA": "Згладжування:", + "zh_CN": "抗锯齿:", + "zh_TW": "反鋸齒:" + } + }, + { + "ID": "GraphicsScalingFilterLabel", + "Translations": { + "ar_SA": "فلتر التكبير:", + "de_DE": "Skalierungsfilter:", + "el_GR": "Φίλτρο Κλιμάκωσης:", + "en_US": "Scaling Filter:", + "es_ES": "Filtro de escalado:", + "fr_FR": "Filtre de mise à l'échelle :", + "he_IL": "מסנן מידת איכות:", + "it_IT": "Filtro di scaling:", + "ja_JP": "スケーリングフィルタ:", + "ko_KR": "크기 조정 필터 :", + "no_NO": "Skaleringsfilter:", + "pl_PL": "Filtr skalowania:", + "pt_BR": "Filtro de Escala:", + "ru_RU": "Интерполяция:", + "sv_SE": "Skalningsfilter:", + "th_TH": "ปรับขนาดตัวกรอง:", + "tr_TR": "Ölçekleme Filtresi:", + "uk_UA": "Фільтр масштабування:", + "zh_CN": "缩放过滤:", + "zh_TW": "縮放過濾器:" + } + }, + { + "ID": "GraphicsScalingFilterTooltip", + "Translations": { + "ar_SA": "اختر فلتر التكبير الذي سيتم تطبيقه عند استخدام مقياس الدقة.\n\nيعمل Bilinear بشكل جيد مع الألعاب ثلاثية الأبعاد وهو خيار افتراضي آمن.\n\nيوصى باستخدام Nearest لألعاب البكسل الفنية.\n\nFSR 1.0 هو مجرد مرشح توضيحي، ولا ينصح باستخدامه مع FXAA أو SMAA.\n\nيمكن تغيير هذا الخيار أثناء تشغيل اللعبة بالنقر فوق \"تطبيق\" أدناه؛ يمكنك ببساطة تحريك نافذة الإعدادات جانبا والتجربة حتى تجد المظهر المفضل للعبة.\n\nاتركه على Bilinear إذا لم تكن متأكدا.", + "de_DE": "Wählen Sie den Skalierungsfilter, der bei der Auflösungsskalierung angewendet werden soll.\n\nBilinear eignet sich gut für 3D-Spiele und ist eine sichere Standardoption.\n\nNearest wird für Pixel-Art-Spiele empfohlen.\n\nFSR 1.0 ist lediglich ein Schärfungsfilter und wird nicht für die Verwendung mit FXAA oder SMAA empfohlen.\n\nDiese Option kann geändert werden, während ein Spiel läuft, indem Sie unten auf \"Anwenden\" klicken; Sie können das Einstellungsfenster einfach zur Seite schieben und experimentieren, bis Sie Ihr bevorzugtes Aussehen für ein Spiel gefunden haben.\n\nBleiben Sie auf BILINEAR, wenn Sie unsicher sind.", + "el_GR": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", + "en_US": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nArea scaling is recommended when downscaling resolutions that are larger than the output window. It can be used to achieve a supersampled anti-aliasing effect when downscaling by more than 2x.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", + "es_ES": "Elija el filtro de escala que se aplicará al utilizar la escala de resolución.\n\nBilinear funciona bien para juegos 3D y es una opción predeterminada segura.\n\nSe recomienda el bilinear para juegos de pixel art.\n\nFSR 1.0 es simplemente un filtro de afilado, no se recomienda su uso con FXAA o SMAA.\n\nEsta opción se puede cambiar mientras se ejecuta un juego haciendo clic en \"Aplicar\" a continuación; simplemente puedes mover la ventana de configuración a un lado y experimentar hasta que encuentres tu estilo preferido para un juego.\n\nDéjelo en BILINEAR si no está seguro.", + "fr_FR": "Choisissez le filtre de mise à l'échelle qui sera appliqué lors de l'utilisation de la mise à l'échelle de la résolution.\n\nLe filtre bilinéaire fonctionne bien pour les jeux en 3D et constitue une option par défaut sûre.\n\nLe filtre le plus proche est recommandé pour les jeux de pixel art.\n\nFSR 1.0 est simplement un filtre de netteté, non recommandé pour une utilisation avec FXAA ou SMAA.\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres de côté et expérimenter jusqu'à ce que vous trouviez l'aspect souhaité pour un jeu.\n\nLaissez sur BILINÉAIRE si vous n'êtes pas sûr.", + "he_IL": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", + "it_IT": "Scegli il filtro di scaling che verrà applicato quando si utilizza lo scaling della risoluzione.\n\nBilineare funziona bene per i giochi 3D ed è un'opzione predefinita affidabile.\n\nNearest è consigliato per i giochi in pixel art.\n\nFSR 1.0 è solo un filtro di nitidezza, sconsigliato per l'uso con FXAA o SMAA.\n\nLo scaling ad area è consigliato quando si riducono delle risoluzioni che sono più grandi della finestra di output. Può essere usato per ottenere un effetto di anti-aliasing supercampionato quando si riduce di più di 2x.\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nNel dubbio, lascia su Bilineare.", + "ja_JP": "解像度変更時に適用されるスケーリングフィルタを選択します.\n\nBilinearは3Dゲームに適しており, 安全なデフォルトオプションです.\n\nピクセルアートゲームにはNearestを推奨します.\n\nFSR 1.0は単なるシャープニングフィルタであり, FXAAやSMAAとの併用は推奨されません.\n\nこのオプションは, ゲーム実行中に下の「適用」をクリックすることで変更できます. 設定ウィンドウを脇に移動し, ゲームが好みの表示になるように試してみてください.\n\n不明な場合はBilinearのままにしておいてください.", + "ko_KR": "해상도 스케일을 사용할 때 적용될 스케일링 필터를 선택합니다.\n\n쌍선형은 3D 게임에 적합하며 안전한 기본 옵션입니다.\n\nNearest는 픽셀 아트 게임에 권장됩니다.\n\nFSR 1.0은 단순히 선명도 필터일 뿐이며 FXAA 또는 SMAA와 함께 사용하는 것은 권장되지 않습니다.\n\nArea 스케일링은 출력 창보다 큰 해상도를 다운스케일링할 때 권장됩니다. 2배 이상 다운스케일링할 때 슈퍼샘플링된 앤티앨리어싱 효과를 얻는 데 사용할 수 있습니다.\n\n이 옵션은 아래의 \"적용\"을 클릭하여 게임을 실행하는 동안 변경할 수 있습니다. 설정 창을 옆으로 옮겨 원하는 게임 모양을 찾을 때까지 실험하면 됩니다.\n\n모르면 쌍선형을 그대로 두세요.", + "no_NO": "Velg det skaleringsfilteret som skal brukes når du bruker oppløsningsskalaen.\n\nBilinear fungerer godt for 3D-spill og er et trygt standardalternativ.\n\nNærmeste anbefales for pixel kunst-spill.\n\nFSR 1.0 er bare et skarpere filter, ikke anbefalt for bruk med FXAA eller SMAA.\n\nOmrådeskalering anbefales når nedskalering er større enn utgangsvinduet. Den kan brukes til å oppnå en superprøvetaket anti-aliasingseffekt når en nedskalerer med mer enn 2x.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nLa være på BILINEAR hvis usikker.", + "pl_PL": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", + "pt_BR": "Escolha o filtro de escala que será aplicado ao usar a escala de resolução.\n\nBilinear funciona bem para jogos 3D e é uma opção padrão segura.\n\nNearest é recomendado para jogos em pixel art.\n\nFSR 1.0 é apenas um filtro de nitidez, não recomendado para uso com FXAA ou SMAA.\n\nEssa opção pode ser alterada enquanto o jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nMantenha em BILINEAR se estiver em dúvida.", + "ru_RU": "Фильтрация текстур, которая будет применяться при масштабировании.\n\nБилинейная хорошо работает для 3D-игр и является настройкой по умолчанию.\n\nСтупенчатая рекомендуется для пиксельных игр.\n\nFSR это фильтр резкости, который не рекомендуется использовать с FXAA или SMAA.\n\nЗональная рекомендуется в случае использования разрешения больше разрешения окна. Можно использовать для достижения эффекта суперсемплига (SSAA) при даунскейле более чем в 2 раза.\n\nЭта опция может быть изменена во время игры по нажатию кнопки «Применить» ниже; \nВы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nРекомендуется использовать «Билинейная».", + "sv_SE": "Välj det skalfilter som ska tillämpas vid användning av upplösningsskala.\n\nBilinjär fungerar bra för 3D-spel och är ett säkert standardalternativ.\n\nNärmast rekommenderas för pixel art-spel.\n\nFSR 1.0 är bara ett skarpningsfilter, rekommenderas inte för FXAA eller SMAA.\n\nOmrådesskalning rekommenderas vid nedskalning av upplösning som är större än utdatafönstret. Det kan användas för att uppnå en supersamplad anti-alias-effekt vid nedskalning med mer än 2x.\n\nDetta alternativ kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som BILINJÄR om du är osäker.", + "th_TH": "เลือกตัวกรองสเกลที่จะใช้เมื่อใช้สเกลความละเอียด\n\nBilinear ทำงานได้ดีกับเกม 3D และเป็นตัวเลือกเริ่มต้นที่ปลอดภัย\n\nแนะนำให้ใช้เกมภาพพิกเซลที่ใกล้เคียงที่สุด\n\nFSR 1.0 เป็นเพียงตัวกรองความคมชัด ไม่แนะนำให้ใช้กับ FXAA หรือ SMAA\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม", + "tr_TR": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", + "uk_UA": "Оберіть фільтр масштабування, який буде використовуватися при збільшенні роздільної здатності.\n\n\"Білінійний (Bilinear)\" добре виглядає в 3D іграх та є хорошим варіантом за замовчуванням.\n\n\"Найближчий (Nearest)\" рекомендується для піксельних ігор.\n\n\"FSR 1.0\" - фільтр різкості. Не варто використовувати разом з FXAA або SMAA.\n\nЦю опцію можна міняти під час гри натисканням \"Застосувати\" в цьому вікні; щоб знайти найкращий варіант, просто відсуньте вікно налаштувань і поекспериментуйте.\n\nЗалиште \"Білінійний\", якщо не впевнені.", + "zh_CN": "选择在分辨率缩放时将使用的缩放过滤器。\n\nBilinear(双线性过滤)对于3D游戏效果较好,是一个安全的默认选项。\n\nNearest(最近邻过滤)推荐用于像素艺术游戏。\n\nFSR(超级分辨率锐画)只是一个锐化过滤器,不推荐与 FXAA 或 SMAA 抗锯齿一起使用。\n\nArea(局部过滤),当渲染分辨率大于窗口实际分辨率,推荐该选项。该选项在渲染比例大于2.0的情况下,可以实现超采样的效果。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“Bilinear(双线性过滤)”。", + "zh_TW": "選擇使用解析度縮放時套用的縮放過濾器。\n\n雙線性 (Bilinear) 濾鏡適用於 3D 遊戲,是一個安全的預設選項。\n\n建議像素美術遊戲使用近鄰性 (Nearest) 濾鏡。\n\nFSR 1.0 只是一個銳化濾鏡,不建議與 FXAA 或 SMAA 一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請保持雙線性 (Bilinear) 狀態。" + } + }, + { + "ID": "GraphicsScalingFilterBilinear", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Bilinear", + "es_ES": "", + "fr_FR": "Bilinéaire", + "he_IL": "", + "it_IT": "Bilineare", + "ja_JP": "", + "ko_KR": "쌍선형", + "no_NO": "", + "pl_PL": "Dwuliniowe", + "pt_BR": "", + "ru_RU": "Билинейная", + "sv_SE": "Bilinjär", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Білінійний (Bilinear)", + "zh_CN": "Bilinear(双线性过滤)", + "zh_TW": "雙線性 (Bilinear)" + } + }, + { + "ID": "GraphicsScalingFilterNearest", + "Translations": { + "ar_SA": "", + "de_DE": "Nächstes", + "el_GR": "", + "en_US": "Nearest", + "es_ES": "Cercano", + "fr_FR": "Plus proche", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "근린", + "no_NO": "Nærmeste", + "pl_PL": "Najbliższe", + "pt_BR": "Mais Próximo", + "ru_RU": "Ступенчатая", + "sv_SE": "Närmaste", + "th_TH": "ใกล้สุด", + "tr_TR": "", + "uk_UA": "Найближчий (Nearest)", + "zh_CN": "Nearest(邻近过滤)", + "zh_TW": "近鄰性 (Nearest)" + } + }, + { + "ID": "GraphicsScalingFilterFsr", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "FSR", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "FSR(超级分辨率锐画技术)", + "zh_TW": "" + } + }, + { + "ID": "GraphicsScalingFilterArea", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Area", + "es_ES": "", + "fr_FR": "Zone", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "영역", + "no_NO": "Område", + "pl_PL": "", + "pt_BR": "Área", + "ru_RU": "Зональная", + "sv_SE": "Yta", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Зональна", + "zh_CN": "Area(区域过滤)", + "zh_TW": "區域" + } + }, + { + "ID": "GraphicsScalingFilterLevelLabel", + "Translations": { + "ar_SA": "المستوى", + "de_DE": "Stufe", + "el_GR": "Επίπεδο", + "en_US": "Level", + "es_ES": "Nivel", + "fr_FR": "Niveau ", + "he_IL": "רמה", + "it_IT": "Livello", + "ja_JP": "レベル", + "ko_KR": "레벨", + "no_NO": "Nivå", + "pl_PL": "Poziom", + "pt_BR": "Nível", + "ru_RU": "Уровень", + "sv_SE": "Nivå", + "th_TH": "ระดับ", + "tr_TR": "Seviye", + "uk_UA": "Рівень", + "zh_CN": "等级", + "zh_TW": "日誌等級" + } + }, + { + "ID": "GraphicsScalingFilterLevelTooltip", + "Translations": { + "ar_SA": "اضبط مستوى وضوح FSR 1.0. الأعلى هو أكثر وضوحا.", + "de_DE": "FSR 1.0 Schärfelevel festlegen. Höher ist schärfer.", + "el_GR": "", + "en_US": "Set FSR 1.0 sharpening level. Higher is sharper.", + "es_ES": "Ajuste el nivel de nitidez FSR 1.0. Mayor es más nítido.", + "fr_FR": "Définir le niveau de netteté FSR 1.0. Plus la valeur est élevée, plus l'image est nette.", + "he_IL": "", + "it_IT": "Imposta il livello di nitidezza di FSR 1.0. Valori più alti comportano una maggiore nitidezza.", + "ja_JP": "FSR 1.0のシャープ化レベルを設定します. 高い値ほどシャープになります.", + "ko_KR": "FSR 1.0 선명도 레벨을 설정합니다. 높을수록 더 선명합니다.", + "no_NO": "Definer FSR 1,0 skarpere nivå. Høyere er skarpere.", + "pl_PL": "Ustaw poziom ostrzeżenia FSR 1.0. Wyższy jest ostrzejszy.", + "pt_BR": "Defina o nível de nitidez do FSR 1.0. Quanto maior, mais nítido.", + "ru_RU": "Выбор режима работы FSR 1.0. Выше — четче.", + "sv_SE": "Ställ in nivå för FSR 1.0 sharpening. Högre är skarpare.", + "th_TH": "ตั้งค่าระดับความคมชัด FSR 1.0 ยิ่งสูงกว่าจะยิ่งคมชัดกว่า", + "tr_TR": "", + "uk_UA": "Встановити рівень різкості FSR 1.0. Чим вище значення - тим різкіша картинка.", + "zh_CN": "设置 FSR 1.0 的锐化等级,数值越高,图像越锐利。", + "zh_TW": "設定 FSR 1.0 銳化等級。越高越清晰。" + } + }, + { + "ID": "SmaaLow", + "Translations": { + "ar_SA": "SMAA منخفض", + "de_DE": "SMAA Niedrig", + "el_GR": "Χαμηλό SMAA", + "en_US": "SMAA Low", + "es_ES": "SMAA Bajo", + "fr_FR": "SMAA Faible", + "he_IL": "SMAA נמוך", + "it_IT": "SMAA Basso", + "ja_JP": "", + "ko_KR": "SMAA 낮음", + "no_NO": "SMAA lav", + "pl_PL": "SMAA Niskie", + "pt_BR": "SMAA Baixo", + "ru_RU": "SMAA Низкое", + "sv_SE": "SMAA låg", + "th_TH": "SMAA ต่ำ", + "tr_TR": "Düşük SMAA", + "uk_UA": "SMAA Низький", + "zh_CN": "SMAA 低质量", + "zh_TW": "低階 SMAA" + } + }, + { + "ID": "SmaaMedium", + "Translations": { + "ar_SA": "SMAA متوسط", + "de_DE": "SMAA Mittel", + "el_GR": " Μεσαίο SMAA", + "en_US": "SMAA Medium", + "es_ES": "SMAA Medio", + "fr_FR": "SMAA Moyenne", + "he_IL": "SMAA בינוני", + "it_IT": "SMAA Medio", + "ja_JP": "", + "ko_KR": "SMAA 중간", + "no_NO": "SMAA Middels", + "pl_PL": "SMAA Średnie", + "pt_BR": "SMAA Médio", + "ru_RU": "SMAA Среднее", + "sv_SE": "SMAA medium", + "th_TH": "SMAA ปานกลาง", + "tr_TR": "Orta SMAA", + "uk_UA": "SMAA Середній", + "zh_CN": "SMAA 中质量", + "zh_TW": "中階 SMAA" + } + }, + { + "ID": "SmaaHigh", + "Translations": { + "ar_SA": "SMAA عالي", + "de_DE": "SMAA Hoch", + "el_GR": "Υψηλό SMAA", + "en_US": "SMAA High", + "es_ES": "SMAA Alto", + "fr_FR": "SMAA Élevée", + "he_IL": "SMAA גבוהה", + "it_IT": "SMAA Alto", + "ja_JP": "", + "ko_KR": "SMAA 높음", + "no_NO": "SMAA høy", + "pl_PL": "SMAA Wysokie", + "pt_BR": "SMAA Alto", + "ru_RU": "SMAA Высокое", + "sv_SE": "SMAA hög", + "th_TH": "SMAA สูง", + "tr_TR": "Yüksek SMAA", + "uk_UA": "SMAA Високий", + "zh_CN": "SMAA 高质量", + "zh_TW": "高階 SMAA" + } + }, + { + "ID": "SmaaUltra", + "Translations": { + "ar_SA": "SMAA فائق", + "de_DE": "", + "el_GR": "Oύλτρα SMAA", + "en_US": "SMAA Ultra", + "es_ES": "", + "fr_FR": "", + "he_IL": "SMAA אולטרה", + "it_IT": "", + "ja_JP": "", + "ko_KR": "SMAA 울트라", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "SMAA Ультра", + "sv_SE": "SMAA ultra", + "th_TH": "SMAA สูงมาก", + "tr_TR": "En Yüksek SMAA", + "uk_UA": "SMAA Ультра", + "zh_CN": "SMAA 超高质量", + "zh_TW": "超高階 SMAA" + } + }, + { + "ID": "UserEditorTitle", + "Translations": { + "ar_SA": "تعديل المستخدم", + "de_DE": "Nutzer bearbeiten", + "el_GR": "Επεξεργασία Χρήστη", + "en_US": "Edit User", + "es_ES": "Editar usuario", + "fr_FR": "Modifier Utilisateur", + "he_IL": "ערוך משתמש", + "it_IT": "Modifica utente", + "ja_JP": "ユーザを編集", + "ko_KR": "사용자 편집", + "no_NO": "Rediger bruker", + "pl_PL": "Edytuj użytkownika", + "pt_BR": "Editar Usuário", + "ru_RU": "Редактирование пользователя", + "sv_SE": "Redigera användare", + "th_TH": "แก้ไขผู้ใช้", + "tr_TR": "Kullanıcıyı Düzenle", + "uk_UA": "Редагувати користувача", + "zh_CN": "编辑用户", + "zh_TW": "編輯使用者" + } + }, + { + "ID": "UserEditorTitleCreate", + "Translations": { + "ar_SA": "إنشاء مستخدم", + "de_DE": "Nutzer erstellen", + "el_GR": "Δημιουργία Χρήστη", + "en_US": "Create User", + "es_ES": "Crear Usuario", + "fr_FR": "Créer Utilisateur", + "he_IL": "צור משתמש", + "it_IT": "Crea utente", + "ja_JP": "ユーザを作成", + "ko_KR": "사용자 만들기", + "no_NO": "Opprett bruker", + "pl_PL": "Utwórz użytkownika", + "pt_BR": "Criar usuário", + "ru_RU": "Создание пользователя", + "sv_SE": "Skapa användare", + "th_TH": "สร้างผู้ใช้", + "tr_TR": "Kullanıcı Oluştur", + "uk_UA": "Створити користувача", + "zh_CN": "创建用户", + "zh_TW": "建立使用者" + } + }, + { + "ID": "SettingsTabNetworkInterface", + "Translations": { + "ar_SA": "واجهة الشبكة:", + "de_DE": "Netzwerkschnittstelle:", + "el_GR": "Διεπαφή Δικτύου", + "en_US": "Network Interface:", + "es_ES": "Interfaz de Red", + "fr_FR": "Interface Réseau :", + "he_IL": "ממשק רשת", + "it_IT": "Interfaccia di rete:", + "ja_JP": "ネットワークインタフェース:", + "ko_KR": "네트워크 인터페이스 :", + "no_NO": "Nettverksgrensesnitt", + "pl_PL": "Interfejs sieci:", + "pt_BR": "Interface de Rede:", + "ru_RU": "Сетевой интерфейс:", + "sv_SE": "Nätverksgränssnitt:", + "th_TH": "เชื่อมต่อเครือข่าย:", + "tr_TR": "Ağ Bağlantısı:", + "uk_UA": "Мережевий інтерфейс:", + "zh_CN": "网络接口:", + "zh_TW": "網路介面:" + } + }, + { + "ID": "NetworkInterfaceTooltip", + "Translations": { + "ar_SA": "واجهة الشبكة مستخدمة لميزات LAN/LDN.\n\nبالاشتراك مع VPN أو XLink Kai ولعبة تدعم LAN، يمكن استخدامها لتزييف اتصال الشبكة نفسها عبر الإنترنت.\n\nاتركه على الافتراضي إذا لم تكن متأكدا.", + "de_DE": "Die für LAN/LDN-Funktionen verwendete Netzwerkschnittstelle.\n\nIn Verbindung mit einem VPN oder XLink Kai und einem Spiel mit LAN-Unterstützung kann eine Verbindung mit demselben Netzwerk über das Internet vorgetäuscht werden.\n\nIm Zweifelsfall auf DEFAULT belassen.", + "el_GR": "", + "en_US": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.", + "es_ES": "Interfaz de red usada para características LAN/LDN.\n\njunto con una VPN o XLink Kai y un juego con soporte LAN, puede usarse para suplantar una conexión de la misma red a través de Internet.\n\nDeje en DEFAULT si no está seguro.", + "fr_FR": "L'interface réseau utilisée pour les fonctionnalités LAN/LDN.\n\nEn conjonction avec un VPN ou XLink Kai et un jeu prenant en charge le LAN, peut être utilisée pour simuler une connexion sur le même réseau via Internet.\n\nLaissez sur DÉFAUT si vous n'êtes pas sûr.", + "he_IL": "", + "it_IT": "L'interfaccia di rete utilizzata per le funzionalità LAN/LDN.\n\nIn combinazione con una VPN o XLink Kai e un gioco che supporta la modalità LAN, questa opzione può essere usata per simulare la connessione alla stessa rete attraverso Internet.\n\nNel dubbio, lascia l'opzione su Predefinito.", + "ja_JP": "LAN/LDN機能に使用されるネットワークインタフェースです.\n\nVPNやXLink Kai、LAN対応のゲームと併用することで, インターネット上の同一ネットワーク接続になりすますことができます.\n\n不明な場合はデフォルトのままにしてください.", + "ko_KR": "LAN/LDN 기능에 사용되는 네트워크 인터페이스입니다.\n\nVPN이나 ​​XLink Kai와 LAN 지원 게임과 함께 사용하면 인터넷을 통한 동일 네트워크 연결을 스푸핑하는 데 사용할 수 있습니다.\n\n모르면 기본값으로 두세요.", + "no_NO": "Nettverksgrensesnittets grensesnitt brukt for LAN/LDN funksjoner.\n\ni konjuksjon med en VPN eller XLink Kai og ett spill med LAN støtte, kan bli brukt til og spoofe ett \"samme-nettverk\" tilkobling over nettet.\n\nLa være på DEFAULT om usikker.", + "pl_PL": "Interfejs sieciowy używany dla funkcji LAN/LDN.\n\nw połączeniu z VPN lub XLink Kai i grą z obsługą sieci LAN, może być użyty do spoofowania połączenia z tą samą siecią przez Internet.\n\nZostaw DOMYŚLNE, jeśli nie ma pewności.", + "pt_BR": "A interface de rede usada para recursos de LAN/LDN.\n\nEm conjunto com uma VPN ou XLink Kai e um jogo com suporte a LAN, pode ser usada para simular uma conexão na mesma rede pela Internet.\n\nMantenha em PADRÃO se estiver em dúvida.", + "ru_RU": "Сетевой интерфейс, используемый для функций LAN/LDN.\n\nМожет использоваться для игры через интернет в сочетании с VPN или XLink Kai и игрой с поддержкой LAN.\n\nРекомендуется использовать «По умолчанию».", + "sv_SE": "Nätverksgränssnittet som används för LAN/LDN-funktioner.\n\nTillsammans med en VPN eller XLink Kai och ett spel med LAN-stöd så kan detta användas för att spoofa en same-network-anslutning över internet.\n\nLämna som STANDARD om du är osäker.", + "th_TH": "อินเทอร์เฟซเครือข่ายที่ใช้สำหรับคุณสมบัติ LAN/LDN\n\nเมื่อใช้ร่วมกับ VPN หรือ XLink Kai และเกมที่รองรับ LAN สามารถใช้เพื่อปลอมการเชื่อมต่อเครือข่ายเดียวกันผ่านทางอินเทอร์เน็ต\n\nปล่อยให้เป็น ค่าเริ่มต้น หากคุณไม่แน่ใจ", + "tr_TR": "", + "uk_UA": "Мережевий інтерфейс, що використовується для LAN/LDN.\n\nРазом з VPN або XLink Kai, і грою що підтримує LAN, може імітувати з'єднання в однаковій мережі через Інтернет.", + "zh_CN": "用于局域网(LAN)/本地网络发现(LDN)功能的网络接口。\n\n结合 VPN 或 XLink Kai 以及支持局域网功能的游戏,可以在互联网上伪造为同一网络连接。\n\n如果不确定,请保持为“默认”。", + "zh_TW": "用於 LAN/LDN 功能的網路介面。\n\n與 VPN 或 XLink Kai 以及支援區域網路的遊戲配合使用,可用於在網路上偽造同網際網路連線。\n\n如果不確定,請保持預設狀態。" + } + }, + { + "ID": "NetworkInterfaceDefault", + "Translations": { + "ar_SA": "افتراضي", + "de_DE": "Standard", + "el_GR": "Προεπιλογή", + "en_US": "Default", + "es_ES": "Predeterminado", + "fr_FR": "Défaut", + "he_IL": "ברירת המחדל", + "it_IT": "Predefinito", + "ja_JP": "デフォルト", + "ko_KR": "기본값", + "no_NO": "Standard", + "pl_PL": "Domyślny", + "pt_BR": "Padrão", + "ru_RU": "По умолчанию", + "sv_SE": "Standard", + "th_TH": "ค่าเริ่มต้น", + "tr_TR": "Varsayılan", + "uk_UA": "Стандартний", + "zh_CN": "默认", + "zh_TW": "預設" + } + }, + { + "ID": "PackagingShaders", + "Translations": { + "ar_SA": "تعبئة المظللات", + "de_DE": "Verpackt Shader", + "el_GR": "Shaders Συσκευασίας", + "en_US": "Packaging Shaders", + "es_ES": "Empaquetando sombreadores", + "fr_FR": "Empaquetage des Shaders", + "he_IL": "אורז הצללות", + "it_IT": "Salvataggio degli shader", + "ja_JP": "シェーダーを構築中", + "ko_KR": "패키징 셰이더", + "no_NO": "Pakker Shaders", + "pl_PL": "Pakuje Shadery ", + "pt_BR": "Empacotamento de Shaders", + "ru_RU": "Упаковка шейдеров", + "sv_SE": "Paketering av Shaders", + "th_TH": "รวม Shaders เข้าด้วยกัน", + "tr_TR": "Gölgeler Paketleniyor", + "uk_UA": "Пакування шейдерів", + "zh_CN": "整合着色器中", + "zh_TW": "封裝著色器" + } + }, + { + "ID": "AboutChangelogButton", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "View Changelog", + "es_ES": "", + "fr_FR": "Voir Changelog", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "변경 로그 보기", + "no_NO": "", + "pl_PL": "", + "pt_BR": "Ver Registro", + "ru_RU": "", + "sv_SE": "Visa ändringslogg", + "th_TH": "ด", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "查看更新日志", + "zh_TW": "檢視更新日誌" + } + }, + { + "ID": "AboutChangelogButtonTooltipMessage", + "Translations": { + "ar_SA": "انقر لفتح سجل التغيير لهذا الإصدار في متصفحك الافتراضي.", + "de_DE": "Klicke hier, um das Changelog für diese Version in Ihrem Standardbrowser zu öffnen.", + "el_GR": "Κάντε κλικ για να ανοίξετε το αρχείο αλλαγών για αυτήν την έκδοση στο προεπιλεγμένο πρόγραμμα περιήγησης σας.", + "en_US": "Click to open the changelog for this version in your default browser.", + "es_ES": "Haga clic para abrir el registro de cambios para esta versión en su navegador predeterminado.", + "fr_FR": "Cliquez pour ouvrir le changelog de cette version dans votre navigateur par défaut.", + "he_IL": "לחץ כדי לפתוח את יומן השינויים עבור גרסה זו בדפדפן ברירת המחדל שלך.", + "it_IT": "Clicca per aprire il changelog di questa versione nel tuo browser predefinito.", + "ja_JP": "クリックして, このバージョンの更新履歴をデフォルトのブラウザで開きます.", + "ko_KR": "기본 브라우저에서 이 버전의 변경 내역을 열람하려면 클릭하세요.", + "no_NO": "Klikk for å åpne endringsloggen for denne versjonen i din nettleser.", + "pl_PL": "Kliknij, aby otworzyć listę zmian dla tej wersji w domyślnej przeglądarce.", + "pt_BR": "Clique para abrir o relatório de alterações para esta versão no seu navegador padrão.", + "ru_RU": "Нажмите, чтобы открыть список изменений для этой версии", + "sv_SE": "Klicka för att öppna ändringsloggen för denna version i din standardwebbläsare.", + "th_TH": "คลิกเพื่อเปิดประวัติการเปลี่ยนแปลงสำหรับเวอร์ชั่นนี้ บนเบราว์เซอร์เริ่มต้นของคุณ", + "tr_TR": "Kullandığınız versiyon için olan değişiklikleri varsayılan tarayıcınızda görmek için tıklayın", + "uk_UA": "Натисніть, щоб відкрити список змін для цієї версії.", + "zh_CN": "点击这里在浏览器中打开此版本的更新日志。", + "zh_TW": "在預設瀏覽器中開啟此版本的更新日誌。" + } + }, + { + "ID": "SettingsTabNetworkMultiplayer", + "Translations": { + "ar_SA": "لعب جماعي", + "de_DE": "Mehrspieler", + "el_GR": "Πολλαπλοί παίκτες", + "en_US": "Multiplayer", + "es_ES": "Multijugador", + "fr_FR": "Multijoueur", + "he_IL": "רב משתתפים", + "it_IT": "Multigiocatore", + "ja_JP": "マルチプレイヤー", + "ko_KR": "멀티플레이어", + "no_NO": "Flerspiller", + "pl_PL": "Gra Wieloosobowa", + "pt_BR": "Multijogador", + "ru_RU": "Мультиплеер", + "sv_SE": "Flerspelare", + "th_TH": "ผู้เล่นหลายคน", + "tr_TR": "Çok Oyunculu", + "uk_UA": "Мережева гра", + "zh_CN": "多人联机游玩", + "zh_TW": "多人遊戲" + } + }, + { + "ID": "MultiplayerMode", + "Translations": { + "ar_SA": "الوضع:", + "de_DE": "Modus:", + "el_GR": "Λειτουργία:", + "en_US": "Mode:", + "es_ES": "Modo:", + "fr_FR": "Mode :", + "he_IL": "מצב:", + "it_IT": "Modalità:", + "ja_JP": "モード:", + "ko_KR": "모드 :", + "no_NO": "Modus:", + "pl_PL": "Tryb:", + "pt_BR": "Modo:", + "ru_RU": "Режим:", + "sv_SE": "Läge:", + "th_TH": "โหมด:", + "tr_TR": "Mod:", + "uk_UA": "Режим:", + "zh_CN": "联机模式:", + "zh_TW": "模式:" + } + }, + { + "ID": "MultiplayerModeTooltip", + "Translations": { + "ar_SA": "تغيير وضع LDN متعدد اللاعبين.\n\nسوف يقوم LdnMitm بتعديل وظيفة اللعب المحلية/اللاسلكية المحلية في الألعاب لتعمل كما لو كانت شبكة LAN، مما يسمح باتصالات الشبكة المحلية نفسها مع محاكيات ريوجينكس الأخرى وأجهزة نينتندو سويتش المخترقة التي تم تثبيت وحدة ldn_mitm عليها.\n\nيتطلب وضع اللاعبين المتعددين أن يكون جميع اللاعبين على نفس إصدار اللعبة (على سبيل المثال، يتعذر على الإصدار 13.0.1 من سوبر سماش برذرز ألتميت الاتصال بالإصدار 13.0.0).\n\nاتركه معطلا إذا لم تكن متأكدا.", + "de_DE": "Ändert den LDN-Mehrspielermodus.\n\nLdnMitm ändert die lokale drahtlose/lokale Spielfunktionalität in Spielen so, dass sie wie ein LAN funktioniert und lokale, netzwerkgleiche Verbindungen mit anderen Ryujinx-Instanzen und gehackten Nintendo Switch-Konsolen ermöglicht, auf denen das ldn_mitm-Modul installiert ist.\n\nMultiplayer erfordert, dass alle Spieler die gleiche Spielversion verwenden (d.h. Super Smash Bros. Ultimate v13.0.1 kann sich nicht mit v13.0.0 verbinden).\n\nIm Zweifelsfall auf DISABLED lassen.", + "el_GR": "", + "en_US": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.", + "es_ES": "Cambiar modo LDN multijugador.\n\nLdnMitm modificará la funcionalidad local de juego inalámbrico para funcionar como si fuera LAN, permitiendo locales conexiones de la misma red con otras instancias de Ryujinx y consolas hackeadas de Nintendo Switch que tienen instalado el módulo ldn_mitm.\n\nMultijugador requiere que todos los jugadores estén en la misma versión del juego (por ejemplo, Super Smash Bros. Ultimate v13.0.1 no se puede conectar a v13.0.0).\n\nDejar DESACTIVADO si no está seguro.", + "fr_FR": "Changer le mode multijoueur LDN.\n\nLdnMitm modifiera la fonctionnalité de jeu sans fil local/jeu local dans les jeux pour fonctionner comme s'il s'agissait d'un LAN, permettant des connexions locales sur le même réseau avec d'autres instances de Ryujinx et des consoles Nintendo Switch piratées ayant le module ldn_mitm installé.\n\nLe multijoueur nécessite que tous les joueurs soient sur la même version du jeu (par exemple, Super Smash Bros. Ultimate v13.0.1 ne peut pas se connecter à v13.0.0).\n\nLaissez DÉSACTIVÉ si vous n'êtes pas sûr.", + "he_IL": "", + "it_IT": "Cambia la modalità multigiocatore LDN.\n\nLdnMitm modificherà la funzionalità locale wireless/local play nei giochi per funzionare come se fosse in modalità LAN, consentendo connessioni locali sulla stessa rete con altre istanze di Ryujinx e console Nintendo Switch modificate che hanno il modulo ldn_mitm installato.\n\nLa modalità multigiocatore richiede che tutti i giocatori usino la stessa versione del gioco (es. Super Smash Bros. Ultimate v13.0.1 non può connettersi con la v13.0.0).\n\nNel dubbio, lascia l'opzione su Disabilitato.", + "ja_JP": "LDNマルチプレイヤーモードを変更します.\n\nldn_mitmモジュールがインストールされた, 他のRyujinxインスタンスや,ハックされたNintendo Switchコンソールとのローカル/同一ネットワーク接続を可能にします.\n\nマルチプレイでは, すべてのプレイヤーが同じゲームバージョンである必要があります(例:Super Smash Bros. Ultimate v13.0.1はv13.0.0に接続できません).\n\n不明な場合は「無効」のままにしてください.", + "ko_KR": "LDN 멀티플레이어 모드를 변경합니다.\n\nLdnMitm은 게임의 로컬 무선/로컬 플레이 기능을 LAN처럼 작동하도록 수정하여 다른 Ryujinx 인스턴스나 ldn_mitm 모듈이 설치된 해킹된 Nintendo Switch 콘솔과 로컬, 동일 네트워크 연결이 가능합니다.\n\n멀티플레이어는 모든 플레이어가 동일한 게임 버전을 사용해야 합니다(예: Super Smash Bros. Ultimate v13.0.1은 v13.0.0에 연결할 수 없음).\n\n모르면 비활성화 상태로 두세요.", + "no_NO": "Endre LDN flerspillermodus.\n\nLdnMitm vil endre lokal trådløst/lokal spillfunksjonalitet i spill som skal fungere som om den var LAN, noe som tillater lokal, samme nettverk forbindelser med andre Ryujinx instanser og hacket Nintendo Switch konsoller som har installert ldn_mitm-modulen.\n\nFlerspiller krever at alle spillerne er på samme versjon (dvs. Super Smash Bros. Ultimat v13.0.1 kan ikke koble til v13.0.0).\n\nForlat DEAKTIVERT hvis usikker.", + "pl_PL": "", + "pt_BR": "Alterar o modo multiplayer LDN.\n\nLdnMitm modificará a funcionalidade de jogo sem fio/local nos jogos para funcionar como se fosse LAN, permitindo conexões locais, na mesma rede, com outras instâncias do Ryujinx e consoles Nintendo Switch hackeados que possuem o módulo ldn_mitm instalado.\n\nO multiplayer exige que todos os jogadores estejam na mesma versão do jogo (ex.: Super Smash Bros. Ultimate v13.0.1 não consegue se conectar à v13.0.0).\n\nDeixe DESATIVADO se estiver em dúvida.", + "ru_RU": "Меняет многопользовательский режим LDN.\n\nLdnMitm модифицирует функциональность локальной беспроводной/игры на одном устройстве в играх, позволяя играть с другими пользователями Ryujinx или взломанными консолями Nintendo Switch с установленным модулем ldn_mitm, находящимися в одной локальной сети друг с другом.\n\nМногопользовательская игра требует наличия у всех игроков одной и той же версии игры (т.е. Super Smash Bros. Ultimate v13.0.1 не может подключиться к v13.0.0).\n\nРекомендуется оставить выключенным.", + "sv_SE": "Ändra LDN-flerspelarläge\n\nLdnMitm kommer att ändra lokal funktionalitet för trådlös/lokalt spel att fungera som om det vore ett LAN, vilket ger stöd för anslutningar med local och same-network med andra Ryujinx-instanser och hackade Nintendo Switch-konsoller som har modulen ldn_mitm installerad.\n\nFlerspelare kräver att alla spelare har samma spelversion (t.ex. Super Smash Bros. Ultimate v13.0.1 kan inte ansluta till v13.0.0).\n\nLämna INAKTIVERAD om du är osäker.", + "th_TH": "เปลี่ยนโหมดผู้เล่นหลายคนของ LDN\n\nLdnMitm จะปรับเปลี่ยนฟังก์ชันการเล่นแบบไร้สาย/ภายใน จะให้เกมทำงานเหมือนกับว่าเป็น LAN ช่วยให้สามารถเชื่อมต่อภายในเครือข่ายเดียวกันกับอินสแตนซ์ Ryujinx อื่น ๆ และคอนโซล Nintendo Switch ที่ถูกแฮ็กซึ่งมีโมดูล ldn_mitm ติดตั้งอยู่\n\nผู้เล่นหลายคนต้องการให้ผู้เล่นทุกคนอยู่ในเกมเวอร์ชันเดียวกัน (เช่น Super Smash Bros. Ultimate v13.0.1 ไม่สามารถเชื่อมต่อกับ v13.0.0)\n\nปล่อยให้ปิดการใช้งานหากไม่แน่ใจ", + "tr_TR": "", + "uk_UA": "Змінити LDN мультиплеєру.\n\nLdnMitm змінить функціонал бездротової/локальної гри в іграх, щоб вони працювали так, ніби це LAN, що дозволяє локальні підключення в тій самій мережі з іншими екземплярами Ryujinx та хакнутими консолями Nintendo Switch, які мають встановлений модуль ldn_mitm.\n\nМультиплеєр вимагає, щоб усі гравці були на одній і тій же версії гри (наприклад Super Smash Bros. Ultimate v13.0.1 не зможе під'єднатися до v13.0.0).\n\nЗалиште на \"Вимкнено\", якщо не впевнені, ", + "zh_CN": "修改 LDN 多人联机游玩模式。\n\nldn_mitm 联机插件将修改游戏中的本地无线和本地游玩功能,使其表现得像局域网一样,允许和其他安装了 ldn_mitm 插件的 Ryujinx 模拟器和破解的任天堂 Switch 主机在同一网络下进行本地连接,实现多人联机游玩。\n\n多人联机游玩要求所有玩家必须运行相同的游戏版本(例如,游戏版本 v13.0.1 无法与 v13.0.0 联机)。\n\n如果不确定,请保持为“禁用”。", + "zh_TW": "變更 LDN 多人遊戲模式。\n\nLdnMitm 將修改遊戲中的本機無線/本機遊戲功能,使其如同區域網路一樣執行,允許與其他安裝了 ldn_mitm 模組的 Ryujinx 實例和已破解的 Nintendo Switch 遊戲機進行本機同網路連線。\n\n多人遊戲要求所有玩家使用相同的遊戲版本 (例如,Super Smash Bros. Ultimate v13.0.1 無法連接 v13.0.0)。\n\n如果不確定,請保持 Disabled (停用) 狀態。" + } + }, + { + "ID": "MultiplayerModeDisabled", + "Translations": { + "ar_SA": "معطل", + "de_DE": "Deaktiviert", + "el_GR": "", + "en_US": "Disabled", + "es_ES": "Deshabilitado", + "fr_FR": "Désactivé", + "he_IL": "", + "it_IT": "Disabilitato", + "ja_JP": "無効", + "ko_KR": "비활성화", + "no_NO": "Deaktivert", + "pl_PL": "Wyłączone", + "pt_BR": "Desativado", + "ru_RU": "Отключено", + "sv_SE": "Inaktiverad", + "th_TH": "ปิดใช้งาน", + "tr_TR": "Devre Dışı", + "uk_UA": "Вимкнено", + "zh_CN": "禁用", + "zh_TW": "已停用" + } + }, + { + "ID": "MultiplayerModeLdnMitm", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "ldn_mitm", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "MultiplayerModeLdnRyu", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "RyuLDN", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "MultiplayerDisableP2P", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Disable P2P Network Hosting (may increase latency)", + "es_ES": "Desactivar El Hosteo De Red P2P (puede aumentar latencia)", + "fr_FR": "Désactiver PàP Hébergement de Réseau (pourrait augmenter la latence)", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "P2P 네트워크 호스팅 비활성화(대기 시간이 늘어날 수 있음)", + "no_NO": "Deaktiver P2P-nettverkshosting (kan øke ventetiden)", + "pl_PL": "", + "pt_BR": "Desabilitar hospedagem de rede P2P (pode aumentar a latência)", + "ru_RU": "Отключить хостинг P2P-сетей (может увеличить задержку)", + "sv_SE": "Inaktivera P2P-nätverkshosting (kan öka latens)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вимкнути хостинг P2P мережі (може збільшити затримку)", + "zh_CN": "禁用 P2P 网络连接 (也许会增加延迟)", + "zh_TW": "停用對等網路代管 (P2P Network Hosting) (可能增加網路延遲)" + } + }, + { + "ID": "MultiplayerDisableP2PTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", + "es_ES": "Desactivar el hosteo de red P2P, pares se conectarán a través del servidor maestro en lugar de conectarse directamente contigo.", + "fr_FR": "Désactiver PàP hébergement de réseau, les postes vont proxy avec le serveur principal au lieu de se connecter directement à vous.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "P2P 네트워크 호스팅을 비활성화하면 피어가 직접 연결하지 않고 마스터 서버를 통해 프록시합니다.", + "no_NO": "Deaktiver P2P-nettverkshosting, så vil andre brukere gå via hovedserveren i stedet for å koble seg direkte til deg.", + "pl_PL": "", + "pt_BR": "Desabilite a hospedagem de rede P2P, os pares farão proxy através do servidor mestre em vez de se conectarem a você diretamente.", + "ru_RU": "Отключая хостинг P2P-сетей, пользователи будут проксироваться через главный сервер, а не подключаться к вам напрямую.", + "sv_SE": "Inaktivera P2P-nätverkshosting, motparter kommer skickas genom masterservern isället för att ansluta direkt till dig.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вимкнути хостинг P2P мережі, піри будуть підключатися через майстер-сервер замість прямого з'єднання з вами.", + "zh_CN": "禁用 P2P 网络连接,对方将通过主服务器进行连接,而不是直接连接到您。", + "zh_TW": "停用對等網路代管 (P2P Network Hosting), 用戶群會經過代理伺服器而非直接連線至你的主機。" + } + }, + { + "ID": "LdnPassphrase", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Network Passphrase:", + "es_ES": "Frase de contraseña de la Red:", + "fr_FR": "Mot de passe Réseau :", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "네트워크 암호 문구 :", + "no_NO": "Nettverkspassord:", + "pl_PL": "", + "pt_BR": "Senha de Rede:", + "ru_RU": "Cетевой пароль:", + "sv_SE": "Lösenfras för nätverk:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Мережевий пароль:", + "zh_CN": "网络密码:", + "zh_TW": "網路密碼片語 (passphrase):" + } + }, + { + "ID": "LdnPassphraseTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "You will only be able to see hosted games with the same passphrase as you.", + "es_ES": "Solo podrás ver los juegos hosteados con la misma frase de contraseña que tú.", + "fr_FR": "Vous pourez seulement voir les jeux hébergé avec le même mot de passe que vous.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "귀하는 귀하와 동일한 암호를 사용하는 호스팅 게임만 볼 수 있습니다.", + "no_NO": "Du vil bare kunne se spill som er arrangert med samme passordfrase som deg.", + "pl_PL": "", + "pt_BR": "Você só poderá ver jogos hospedados com a mesma senha que você.", + "ru_RU": "Вы сможете видеть только те игры, в которых используется тот же пароль, что и у вас.", + "sv_SE": "Du kommer endast kunna se hostade spel med samma lösenfras som du.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.", + "zh_CN": "您只能看到与您使用相同密码的游戏房间。", + "zh_TW": "你只會看到與你的密碼片語 (passphrase) 相同的遊戲房間。" + } + }, + { + "ID": "LdnPassphraseInputTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", + "es_ES": "Ingresar una frase de contraseña en formato Ryujinx-<8 caracteres hexadecimales>. Solamente podrás ver juegos hosteados con la misma frase de contraseña que tú.", + "fr_FR": "Entrer un mot de passe dans le format Ryujinx-<8 hex chars>. Vous pourez seulement voir les jeux hébergé avec le même mot de passe que vous.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "Ryujinx-<8 hex chars> 형식으로 암호를 입력하세요. 귀하는 귀하와 동일한 암호를 사용하는 호스팅 게임만 볼 수 있습니다.", + "no_NO": "Skriv inn en passordfrase i formatet Ryujinx-<8 heks tegn>. Du vil bare kunne se spill som er arrangert med samme passordfrase som deg.", + "pl_PL": "", + "pt_BR": "Insira uma frase-senha no formato Ryujinx-<8 hex chars>. Você só poderá ver jogos hospedados com a mesma frase-senha que você.", + "ru_RU": "Введите пароль в формате Ryujinx-<8 шестнадцатеричных символов>. Вы сможете видеть только те игры, в которых используется тот же пароль, что и у вас.", + "sv_SE": "Ange en lösenfras i formatet Ryujinx-<8 hextecken>. Du kommer endast kunna se hostade spel med samma lösenfras som du.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Введіть пароль у форматі Ryujinx-<8 символів>. Ви зможете бачити лише ті ігри, які мають такий самий пароль, як і у вас.", + "zh_CN": "以 Ryujinx-<8个十六进制字符> 的格式输入密码。您只能看到与您使用相同密码的游戏房间。", + "zh_TW": "以「Ryujinx-<8 個十六進制數字>」的格式輸入密碼片語 (passphrase)。你只會看到與你的密碼片語 (passphrase) 相同的遊戲房間。" + } + }, + { + "ID": "LdnPassphraseInputPublic", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "(public)", + "es_ES": "(público)", + "fr_FR": "(publique)", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "(일반)", + "no_NO": "(offentlig)", + "pl_PL": "", + "pt_BR": "(público)", + "ru_RU": "(публичный)", + "sv_SE": "(publik)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "(публічний)", + "zh_CN": "(公开的)", + "zh_TW": "(公開模式)" + } + }, + { + "ID": "GenLdnPass", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Generate Random", + "es_ES": "Generar aleatorio", + "fr_FR": "Générer Aléatoire", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "무작위 생성", + "no_NO": "Generer tilfeldig", + "pl_PL": "", + "pt_BR": "Gerar Aleatório", + "ru_RU": "Сгенерировать рандомно", + "sv_SE": "Generera slumpmässigt", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Згенерувати випадкову", + "zh_CN": "随机生成", + "zh_TW": "隨機產生" + } + }, + { + "ID": "GenLdnPassTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Generates a new passphrase, which can be shared with other players.", + "es_ES": "Genera una nueva frase de contraseña, que puede ser compartida con otros jugadores.", + "fr_FR": "Génére un nouveau mot de passe, qui peut être partagé avec les autres.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "다른 플레이어와 공유할 수 있는 새로운 암호 문구를 생성합니다.", + "no_NO": "Genererer en ny passordfrase, som kan deles med andre spillere.", + "pl_PL": "", + "pt_BR": "Gera uma nova senha, que pode ser compartilhada com outros jogadores.", + "ru_RU": "Генерирует новый пароль, который можно передать другим игрокам.", + "sv_SE": "Genererar en ny lösenfras som kan delas med andra spelare.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Генерує новий пароль, яким можна поділитися з іншими гравцями.", + "zh_CN": "生成一个新的密码,可以与其他玩家共享。", + "zh_TW": "產生一組新的密碼片語 (passphrase), 以供分享給其他玩家。" + } + }, + { + "ID": "ClearLdnPass", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Clear", + "es_ES": "Borrar", + "fr_FR": "Supprimer", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "지우기", + "no_NO": "Slett", + "pl_PL": "", + "pt_BR": "Limpar", + "ru_RU": "Очистить", + "sv_SE": "Töm", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Очистити", + "zh_CN": "清除", + "zh_TW": "清除" + } + }, + { + "ID": "ClearLdnPassTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Clears the current passphrase, returning to the public network.", + "es_ES": "Borra la frase de contraseña actual, regresando a la red pública.", + "fr_FR": "Supprime le mot de passe actuel, ce qui vous remet sur le réseau public.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "현재 암호를 지우고 공용 네트워크로 돌아갑니다.", + "no_NO": "Sletter den gjeldende passordfrasen og går tilbake til det offentlige nettverket.", + "pl_PL": "", + "pt_BR": "Limpa a senha atual, retornando à rede pública.", + "ru_RU": "Очищает текущий пароль, возвращаясь в публичную сеть.", + "sv_SE": "Tömmer aktuell lösenfras och återgår till det publika nätverket.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Очищає поточну пароль, повертаючись до публічної мережі.", + "zh_CN": "清除当前密码,返回公共网络。", + "zh_TW": "清除現有的密碼片語 (passphrase), 藉此公開網路連線。" + } + }, + { + "ID": "InvalidLdnPassphrase", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"", + "es_ES": "Frase de Contraseña Inválida! Debe ser en formato \"Ryujinx-<8 caracteres hexadecimales>\"", + "fr_FR": "Mot de passe invalide! Il doit être dans le format \"Ryujinx-<8 hex chars>\"", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "유효하지 않은 암호입니다! \"Ryujinx-<8 hex chars>\" 형식이어야 합니다.", + "no_NO": "Ugyldig passordfrase! Må være i formatet \"Ryujinx-<8 hex tegn>\"", + "pl_PL": "", + "pt_BR": "Frase-senha inválida! Deve estar no formato \"Ryujinx-<8 hex chars>\"", + "ru_RU": "Неверный пароль! Пароль должен быть в формате «Ryujinx-<8 шестнадцатеричных символов>»", + "sv_SE": "Ogiltig lösenfras! Måste vara i formatet \"Ryujinx-<8 hextecken>\"", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Невірний пароль! Має бути в форматі \"Ryujinx-<8 символів>\"", + "zh_CN": "无效密码!密码的格式必须是\"Ryujinx-<8个十六进制字符>\"", + "zh_TW": "無效的密碼片語 (passphrase)! 密碼片語必須是以「Ryujinx-<8 個十六進制數字>」的格式輸入" + } + }, + { + "ID": "SettingsTabSystemVSyncMode", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "VSync:", + "es_ES": "", + "fr_FR": "VSync :", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "수직 동기화 :", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Вертикальная синхронизация:", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Вертикальна синхронізація (VSync):", + "zh_CN": "垂直同步(VSync)", + "zh_TW": "垂直同步:" + } + }, + { + "ID": "SettingsTabSystemEnableCustomVSyncInterval", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Enable custom refresh rate (Experimental)", + "es_ES": "", + "fr_FR": "Activer le taux de rafraîchissement customisé (Expérimental)", + "he_IL": "", + "it_IT": "Attiva la frequenza di aggiornamento personalizzata (sperimentale)", + "ja_JP": "", + "ko_KR": "사용자 정의 주사율 활성화(실험적)", + "no_NO": "Aktiver egendefinert oppdateringsfrekvens (eksperimentell)", + "pl_PL": "", + "pt_BR": "Habilitar taxa de atualização personalizada (Experimental)", + "ru_RU": "Включить пользовательскую частоту кадров (Экспериментально)", + "sv_SE": "Aktivera anpassad uppdateringsfrekvens (experimentell)", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Увімкнути користувацьку частоту оновлення (Експериментально)", + "zh_CN": "启动自定义刷新率(实验性功能)", + "zh_TW": "啟用自訂的重新整理頻率 (實驗性功能)" + } + }, + { + "ID": "SettingsTabSystemVSyncModeSwitch", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Switch", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "스위치", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "Консоль", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabSystemVSyncModeUnbounded", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Unbounded", + "es_ES": "", + "fr_FR": "Sans Limite", + "he_IL": "", + "it_IT": "Nessun limite", + "ja_JP": "", + "ko_KR": "무제한", + "no_NO": "Ubegrenset", + "pl_PL": "", + "pt_BR": "Ilimitado", + "ru_RU": "Без ограничений", + "sv_SE": "Obunden", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Необмежена", + "zh_CN": "无限制", + "zh_TW": "沒有限制" + } + }, + { + "ID": "SettingsTabSystemVSyncModeCustom", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Custom Refresh Rate", + "es_ES": "", + "fr_FR": "Taux de Rafraîchissement Customisé", + "he_IL": "", + "it_IT": "Frequenza di aggiornamento personalizzata", + "ja_JP": "", + "ko_KR": "사용자 정의 주사율", + "no_NO": "Egendefinert oppdateringsfrekvens", + "pl_PL": "", + "pt_BR": "Taxa de Atualização Personalizada", + "ru_RU": "Пользовательская частота кадров", + "sv_SE": "Anpassad uppdateringsfrekvens", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Користувацька", + "zh_CN": "自定义刷新率", + "zh_TW": "自訂的重新整理頻率" + } + }, + { + "ID": "SettingsTabSystemVSyncModeTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Emulierte vertikale Synchronisation. \"Switch\" emuliert die 60Hz-Bildwiederholfrequenz der Switch. \"Unbounded\" ist eine unbegrenzte Bildwiederholfrequenz.", + "el_GR": "", + "en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate.", + "es_ES": "", + "fr_FR": "VSync émulé. 'Switch' émule le taux de rafraîchissement de la Switch (60Hz). 'Sans Limite' est un taux de rafraîchissement qui n'est pas limité.", + "he_IL": "", + "it_IT": "Sincronizzazione verticale emulata. \"Switch\" emula la frequenza di aggiornamento di Nintendo Switch (60Hz). \"Nessun limite\" non impone alcun limite alla frequenza di aggiornamento.", + "ja_JP": "", + "ko_KR": "에뮬레이트된 수직 동기화. '스위치'는 스위치의 60Hz 주사율을 에뮬레이트합니다. '무한'은 무제한 주사율입니다.", + "no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens.", + "pl_PL": "", + "pt_BR": "Sincronização vertical emulada. 'Switch' emula a taxa de atualização de 60 Hz do Switch. 'Ilimitada' é uma taxa de atualização sem limite.", + "ru_RU": "Эмулированная вертикальная синхронизация. «Консоль» эмулирует частоту обновления консоли, равную 60 Гц. «Без ограничений» — неограниченная частота кадров.", + "sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Емульована вертикальна синхронізація кадрів. \"Switch\" емулює частоту оновлення консолі Nintendo Switch (60 Гц). \"Необмежена\" — частота оновлення не матиме обмежень.", + "zh_CN": "模拟垂直同步。“Switch”模拟了 Switch 的 60Hz 刷新率。“无限制”没有刷新率限制。", + "zh_TW": "模擬垂直同步。「Switch」 模擬 Nintendo Switch 的 60Hz 重新整理頻率。「沒有限制」是沒有限制的重新整理頻率。" + } + }, + { + "ID": "SettingsTabSystemVSyncModeTooltipCustom", + "Translations": { + "ar_SA": "", + "de_DE": "Emulierte vertikale Synchronisation. \"Switch\" emuliert die 60Hz-Bildwiederholfrequenz der Switch. „Unbounded“ ist eine unbegrenzte Bildwiederholfrequenz. „Benutzerdefinierte Bildwiederholfrequenz“ emuliert die angegebene benutzerdefinierte Bildwiederholfrequenz.", + "el_GR": "", + "en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate. 'Custom Refresh Rate' emulates the specified custom refresh rate.", + "es_ES": "", + "fr_FR": "VSync émulé. 'Switch' émule le taux de rafraîchissement de la Switch (60Hz). 'Sans Limite' est un taux de rafraîchissement qui n'est pas limité. 'Taux de Rafraîchissement Customisé' émule le taux de rafraîchissement spécifié.", + "he_IL": "", + "it_IT": "Sincronizzazione verticale emulata. \"Switch\" emula la frequenza di aggiornamento di Nintendo Switch (60Hz). \"Nessun limite\" non impone alcun limite alla frequenza di aggiornamento. \"Frequenza di aggiornamento personalizzata\" emula la frequenza di aggiornamento specificata.", + "ja_JP": "", + "ko_KR": "에뮬레이트된 수직 동기화. '스위치'는 스위치의 60Hz 주사율을 에뮬레이트합니다. '무한'은 무제한 주사율입니다. '사용자 지정'은 지정된 사용자 지정 주사율을 에뮬레이트합니다.", + "no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens. «Egendefinert» emulerer den angitte egendefinerte oppdateringsfrekvensen.", + "pl_PL": "", + "pt_BR": "Sincronização Vertical Emulada. 'Switch' emula a taxa de atualização de 60 Hz do Switch. 'Ilimitada' é uma taxa de atualização sem limite. 'Taxa de atualização personalizada' emula a taxa de atualização personalizada especificada.", + "ru_RU": "Эмулированная вертикальная синхронизация. «Консоль» эмулирует частоту обновления консоли, равную 60 Гц. «Без ограничений» — неограниченная частота кадров. «Пользовательска частота кадров» эмулирует выбранную пользователем частоту кадров.", + "sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens. 'Anpassad uppdateringsfrekvens' emulerar den angivna anpassade uppdateringsfrekvensen.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Емульована вертикальна синхронізація кадрів. \"Switch\" емулює частоту оновлення консолі Nintendo Switch (60 Гц). \"Необмежена\" — частота оновлення не матиме обмежень. \"Користувацька\" емулює вказану користувачем частоту оновлення.", + "zh_CN": "模拟垂直同步。“Switch”模拟了 Switch 的 60Hz 刷新率。“无限制”没有刷新率限制。“自定义刷新率”模拟指定的自定义刷新率。", + "zh_TW": "模擬垂直同步。「Switch」 模擬 Nintendo Switch 的 60Hz 重新整理頻率。「沒有限制」是沒有限制的重新整理頻率。「自訂的重新整理頻率」模擬所自訂的重新整理頻率。" + } + }, + { + "ID": "SettingsTabSystemEnableCustomVSyncIntervalTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Ermöglicht es dem Benutzer, eine emulierte Bildwiederholfrequenz festzulegen. In einigen Titeln kann dies die Geschwindigkeit der Spiel-Logik erhöhen oder verringern. In anderen Titeln kann dies dazu führen, dass die FPS auf ein Vielfaches der Bildwiederholfrequenz begrenzt werden oder zu unvorhersehbarem Verhalten führen. Dies ist eine experimentelle Funktion, ohne Garantien dafür, wie sich das Gameplay auswirkt. \n\nLassen Sie diese Option deaktiviert, wenn Sie sich nicht sicher sind.", + "el_GR": "", + "en_US": "Allows the user to specify an emulated refresh rate. In some titles, this may speed up or slow down the rate of gameplay logic. In other titles, it may allow for capping FPS at some multiple of the refresh rate, or lead to unpredictable behavior. This is an experimental feature, with no guarantees for how gameplay will be affected. \n\nLeave OFF if unsure.", + "es_ES": "", + "fr_FR": "Permet à l'utilisateur de spécifier un taux de rafraîchissement émulé. Dans certains jeux, ceci pourrait accélérer ou ralentir le taux de logique du gameplay. Dans d'autre titres, cela permettrait limiter le FPS à un multiple du taux de rafraîchissement, ou conduire à un comportement imprévisible. Ceci est une fonctionnalité expérimentale, avec aucune garanties pour comment le gameplay sera affecté. \n\nLaisser désactiver en cas de doute.", + "he_IL": "", + "it_IT": "Consente all'utente di specificare una frequenza di aggiornamento emulata. In alcuni titoli potrebbe aumentare o diminuire la velocità del gameplay, mentre in altri potrebbe consentire di limitare il framerate a un multiplo della frequenza di aggiornamento, o causare comportamenti imprevedibili. Questa funzionalità è sperimentale, e non ci sono certezze sul modo in cui influenzerà il gameplay.\n\nNel dubbio, lascia l'opzione disattivata.", + "ja_JP": "", + "ko_KR": "사용자가 에뮬레이트된 화면 주사율을 지정할 수 있습니다. 일부 타이틀에서는 게임플레이 로직 속도가 빨라지거나 느려질 수 있습니다. 다른 타이틀에서는 주사율의 배수로 FPS를 제한하거나 예측할 수 없는 동작으로 이어질 수 있습니다. 이는 실험적 기능으로 게임 플레이에 어떤 영향을 미칠지 보장할 수 없습니다. \n\n모르면 체크 해제 상태로 두세요.", + "no_NO": "Gjør det mulig for brukeren å angi en emulert oppdateringsfrekvens. I noen titler kan dette øke eller senke hastigheten på spillogikken. I andre titler kan det gjøre det mulig å begrense FPS til et multiplum av oppdateringsfrekvensen, eller føre til uforutsigbar oppførsel. Dette er en eksperimentell funksjon, og det gis ingen garantier for hvordan spillingen påvirkes. \n\nLa AV stå hvis du er usikker.", + "pl_PL": "", + "pt_BR": "Permite que o usuário especifique uma taxa de atualização emulada. Em alguns títulos, isso pode acelerar ou desacelerar a taxa de lógica do jogo. Em outros títulos, pode permitir limitar o FPS em algum múltiplo da taxa de atualização ou levar a um comportamento imprevisível. Este é um recurso experimental, sem garantias de como o jogo será afetado. \n\nDeixe OFF se não tiver certeza.", + "ru_RU": "Позволяет пользователю указать эмулируемую частоту кадров. В некоторых играх это может ускорить или замедлить скорость логики игрового процесса. В других играх это может позволить ограничить FPS на уровне, кратном частоте обновления, или привести к непредсказуемому поведению. Это экспериментальная функция, и нет никаких гарантий того, как она повлияет на игровой процесс. \n\nОставьте выключенным, если не уверены.", + "sv_SE": "Låter användaren ange en emulerad uppdateringsfrekvens. För vissa spel så kan detta snabba upp eller ner frekvensen för spellogiken. I andra spel så kan detta tillåta att bildfrekvensen kapas för delar av uppdateringsfrekvensen eller leda till oväntat beteende. Detta är en experimentell funktion utan några garantier för hur spelet påverkas. \n\nLämna AV om du är osäker.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Дозволяє користувачу вказати емульовану частоту оновлення. У деяких іграх це може прискорити або сповільнити логіку гри. Натомість в інших іграх ця функція може дозволити обмежити FPS на певні кратні частоти оновлення або призвести до непередбачуваної поведінки. Це експериментальна функція, без гарантій того, як вона вплине на ігровий процес. \n\nЗалиште ВИМКНЕНИМ, якщо не впевнені.", + "zh_CN": "允许用户指定模拟刷新率。在某些游戏中,这可能会加快或减慢游戏逻辑的速度。在其他游戏中,它可能允许将 FPS 限制在刷新率的某个倍数,或者导致不可预测的行为。这是一个实验性功能,无法保证游戏会受到怎样的影响。\n\n如果不确定,请关闭。", + "zh_TW": "容許使用者自訂模擬的重新整理頻率。你可能會在某些遊戲裡感受到加快或減慢的遊戲速度;其他遊戲裡則可能會容許限制最高的 FPS 至重新整理頻率的倍數,或引起未知遊戲行為。這是實驗性功能,且沒有保證遊戲會穩定執行。\n\n如果不確定,請保持關閉狀態。" + } + }, + { + "ID": "SettingsTabSystemCustomVSyncIntervalValueTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Der Zielwert für die benutzerdefinierte Bildwiederholfrequenz.", + "el_GR": "", + "en_US": "The custom refresh rate target value.", + "es_ES": "", + "fr_FR": "La valeur cible du taux de rafraîchissement customisé.", + "he_IL": "", + "it_IT": "Il valore desiderato della frequenza di aggiornamento personalizzata.", + "ja_JP": "", + "ko_KR": "사용자 정의 주사율 목표 값입니다.", + "no_NO": "Den egendefinerte målverdien for oppdateringsfrekvens.", + "pl_PL": "", + "pt_BR": "O valor de meta da taxa de atualização personalizada.", + "ru_RU": "Заданное значение частоты кадров", + "sv_SE": "Målvärde för anpassad uppdateringsfrekvens.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Цільове значення користувацької частоти оновлення.", + "zh_CN": "目标自定义刷新率值。", + "zh_TW": "自訂的重新整理頻率數值。" + } + }, + { + "ID": "SettingsTabSystemCustomVSyncIntervalSliderTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Die benutzerdefinierte Bildwiederholfrequenz als Prozentsatz der normalen Switch-Bildwiederholfrequenz.", + "el_GR": "", + "en_US": "The custom refresh rate, as a percentage of the normal Switch refresh rate.", + "es_ES": "", + "fr_FR": "Le taux de rafraîchissement customisé, comme un pourcentage du taux de rafraîchissement normal de la Switch.", + "he_IL": "", + "it_IT": "La frequenza di aggiornamento personalizzata, espressa in percentuale della normale frequenza di aggiornamento di Switch.", + "ja_JP": "", + "ko_KR": "일반 스위치 주사율의 백분율로 나타낸 사용자 지정 주사율입니다.", + "no_NO": "Den egendefinerte oppdateringsfrekvensen, i prosent av den normale oppdateringsfrekvensen for Switch-konsollen.", + "pl_PL": "", + "pt_BR": "A taxa de atualização personalizada, como uma porcentagem da taxa de atualização normal do Switch.", + "ru_RU": "Пользовательская частота кадров в процентах от обычной частоты обновления на консоли.", + "sv_SE": "Anpassad uppdateringsfrekvens, som en procentdel av den normala uppdateringsfrekvensen för Switch.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Користувацька частота оновлення, як відсоток від стандартної частоти оновлення Switch.", + "zh_CN": "自定义刷新率,占正常SWitch刷新率的百分比值。", + "zh_TW": "以 Nintendo Switch 重新整理頻率的百分比自訂重新整理頻率。" + } + }, + { + "ID": "SettingsTabSystemCustomVSyncIntervalPercentage", + "Translations": { + "ar_SA": "", + "de_DE": "Benutzerdefinierte Bildwiederholfrequenz %:", + "el_GR": "", + "en_US": "Custom Refresh Rate %:", + "es_ES": "", + "fr_FR": "% du taux de rafraîchissement personnalisé :", + "he_IL": "", + "it_IT": "Frequenza di aggiornamento personalizzata (%):", + "ja_JP": "", + "ko_KR": "사용자 정의 주사율 % :", + "no_NO": "Egendefinert oppdateringsfrekvens %:", + "pl_PL": "", + "pt_BR": "Taxa de Atualização Personalizada %:", + "ru_RU": "Пользовательская частота кадров %:", + "sv_SE": "Anpassad uppdateringsfrekvens %:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Користувацька частота оновлення %:", + "zh_CN": "自定义刷新率值 %:", + "zh_TW": "自訂重新整理頻率 %:" + } + }, + { + "ID": "SettingsTabSystemCustomVSyncIntervalValue", + "Translations": { + "ar_SA": "", + "de_DE": "Wert für benutzerdefinierte Bildwiederholfrequenz:", + "el_GR": "", + "en_US": "Custom Refresh Rate Value:", + "es_ES": "", + "fr_FR": "Valeur du Taux de Rafraîchissement Customisé :", + "he_IL": "", + "it_IT": "Valore della frequenza di aggiornamento personalizzata:", + "ja_JP": "", + "ko_KR": "사용자 정의 주사율 값 :", + "no_NO": "Egendefinert verdi for oppdateringsfrekvens:", + "pl_PL": "", + "pt_BR": "Valor da Taxa de Atualização Personalizada:", + "ru_RU": "Значение пользовательской частоты кадров:", + "sv_SE": "Värde för anpassad uppdateringsfrekvens:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Значення користувацької частоти оновлення:", + "zh_CN": "自定义刷新率值:", + "zh_TW": "自訂重新整理頻率數值:" + } + }, + { + "ID": "SettingsTabSystemCustomVSyncInterval", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Interval", + "es_ES": "", + "fr_FR": "Intervalle", + "he_IL": "", + "it_IT": "Intervallo", + "ja_JP": "", + "ko_KR": "간격", + "no_NO": "Intervall", + "pl_PL": "", + "pt_BR": "Intervalo", + "ru_RU": "Интервал", + "sv_SE": "Intervall", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Інтервал", + "zh_CN": "间隔", + "zh_TW": "間隔" + } + }, + { + "ID": "SettingsTabHotkeysToggleVSyncModeHotkey", + "Translations": { + "ar_SA": "", + "de_DE": "VSync-Modus umschalten:", + "el_GR": "", + "en_US": "Toggle VSync mode:", + "es_ES": "", + "fr_FR": "Basculer le mode VSync :", + "he_IL": "", + "it_IT": "Cambia modalità VSync:", + "ja_JP": "", + "ko_KR": "수직 동기화 모드 전환 :", + "no_NO": "Veksle mellom VSync-modus:", + "pl_PL": "", + "pt_BR": "Alternar Modo VSync:", + "ru_RU": "Выбрать режим вертикальной синхронизации:", + "sv_SE": "Växla VSync-läge:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Перемкнути VSync режим:", + "zh_CN": "设置 VSync 模式:", + "zh_TW": "切換 VSync 模式:" + } + }, + { + "ID": "SettingsTabHotkeysIncrementCustomVSyncIntervalHotkey", + "Translations": { + "ar_SA": "", + "de_DE": "Benutzerdefinierte Bildwiederholfrequenz erhöhen:", + "el_GR": "", + "en_US": "Raise custom refresh rate", + "es_ES": "", + "fr_FR": "Augmenter le taux de rafraîchissement customisé :", + "he_IL": "", + "it_IT": "Aumenta la frequenza di aggiornamento personalizzata:", + "ja_JP": "", + "ko_KR": "사용자 정의 주사율 증가", + "no_NO": "Øk den egendefinerte oppdateringsfrekvensen", + "pl_PL": "", + "pt_BR": "Aumentar Taxa de Atualização:", + "ru_RU": "Повышение пользовательской частоты кадров", + "sv_SE": "Höj anpassad uppdateringsfrekvens", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Підвищити користувацьку частоту оновлення", + "zh_CN": "提高自定义刷新率:", + "zh_TW": "提高自訂的重新整理頻率" + } + }, + { + "ID": "SettingsTabHotkeysDecrementCustomVSyncIntervalHotkey", + "Translations": { + "ar_SA": "", + "de_DE": "Benutzerdefinierte Bildwiederholfrequenz senken:", + "el_GR": "", + "en_US": "Lower custom refresh rate:", + "es_ES": "", + "fr_FR": "Baisser le taux de rafraîchissement customisé :", + "he_IL": "", + "it_IT": "Riduci la frequenza di aggiornamento personalizzata:", + "ja_JP": "", + "ko_KR": "사용자 정의 주사율 감소", + "no_NO": "Lavere tilpasset oppdateringsfrekvens", + "pl_PL": "", + "pt_BR": "Reduzir Taxa de Atualização:", + "ru_RU": "Понижение пользовательской частоты кадров", + "sv_SE": "Sänk anpassad uppdateringsfrekvens", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Понизити користувацьку частоту оновлення", + "zh_CN": "降低自定义刷新率:", + "zh_TW": "降低自訂的重新整理頻率" + } + }, + { + "ID": "SettingsTabHotkeysTurboMode", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Turbo mode:", + "es_ES": "", + "fr_FR": "Mode Turbo :", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "터보 모드 :", + "no_NO": "", + "pl_PL": "", + "pt_BR": "Modo Turbo:", + "ru_RU": "", + "sv_SE": "Turboläge:", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Турборежим:", + "zh_CN": "涡轮模式: ", + "zh_TW": "加速模式:" + } + }, + { + "ID": "SettingsTabHotkeysTurboModeToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "The Turbo mode hotkey.\nConfigure the behavior of Turbo mode in Ryujinx CPU settings.\n\nLeave Unbound if unsure.", + "es_ES": "", + "fr_FR": "Le raccourci clavier Mode Turbo.\nConfigurez le comportement du Mode Turbo dans les paramètres de CPU de Ryujinx.\n\nLaisser Non Attribuée si incertain.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "터보 모드 단축키입니다.\nRyujinx CPU 설정에서 터보 모드의 동작을 구성합니다.\n\n모르면 바인딩 해제 상태로 두세요.", + "no_NO": "Hurtigtasten for turbo-modus.\nKonfigurer oppførselen til turbo-modus i Ryujinx CPU-innstillinger.\n\nLa være ubundet hvis du er usikker.", + "pl_PL": "", + "pt_BR": "Tecla de atalho do Modo Turbo.\nConfigure o comportamento do Modo Turbo nas configurações de CPU do Ryujinx.\n\nDeixe Não Atribuído se não tiver certeza.", + "ru_RU": "", + "sv_SE": "Snabbtangenten för turboläge.\nKonfigurera beteendet för turboläge i Ryujinx CPU-inställningar.\n\nLämna Obunden om du är osäker.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Гаряча клавіша Турборежиму.\nКонфігурацію поведінки турборежиму можна знайти в пункті меню \"Процесор\" в налаштуваннях Ryujinx.\n\nЗалиште неприв'язаною, якщо не впевнені.", + "zh_CN": "涡轮模式热键。\n可以在 Ryujinx CPU 设置中配置涡轮模式的行为。\n\n如果不确定请保留为未绑定。", + "zh_TW": "加速模式快捷鍵。\n可以在 Ryujinx CPU 設定中設定加速模式的倍數。\n\n如果不確定,請保持為「未分配」。" + } + }, + { + "ID": "SettingsTabHotkeysOnlyWhilePressed", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Only while pressed", + "es_ES": "", + "fr_FR": "Uniquement en appuyant", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "누르고 있는 동안만", + "no_NO": "Bare mens du trykker på", + "pl_PL": "", + "pt_BR": "Somente enquanto pressionado.", + "ru_RU": "", + "sv_SE": "Endast när du trycker ner", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Лише під час натискання", + "zh_CN": "仅在按下时", + "zh_TW": "只在按下時" + } + }, + { + "ID": "CompatibilityListLastUpdated", + "Translations": { + "ar_SA": "", + "de_DE": "Zuletzt aktualisiert: {0}", + "el_GR": "", + "en_US": "Last updated: {0}", + "es_ES": "", + "fr_FR": "Dernière mise à jour : {0}", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "최종 업데이트 : {0}", + "no_NO": "Sist oppdatert: {0}", + "pl_PL": "", + "pt_BR": "Última atualização: {0}", + "ru_RU": "Последнее обновление: {0}", + "sv_SE": "Senast uppdaterad: {0}", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Останнє оновлення: {0}", + "zh_CN": "最后更新于: {0}", + "zh_TW": "上次更新時間: {0}" + } + }, + { + "ID": "CompatibilityListTitle", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Compatibility List - {0} entries", + "es_ES": "", + "fr_FR": "Liste de Compatibilité – {0} entrées", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "호환성 목록 - {0}개 항목", + "no_NO": "Kompatibilitetsliste - {0} oppføringer", + "pl_PL": "", + "pt_BR": "Lista de Compatibilidade - {0} registros", + "ru_RU": "Список совместимости — записей: {0}", + "sv_SE": "Kompatibilitetslista - {0} poster", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Список сумісності — {0} ігор", + "zh_CN": "兼容性列表 - {0} 条", + "zh_TW": "相容性列表 - {0} 則紀錄" + } + }, + { + "ID": "CompatibilityListWarning", + "Translations": { + "ar_SA": "", + "de_DE": "Diese Kompatibilitätsliste könnte veraltete Einträge enthalten. Teste dennoch Spiele im \"Ingame\"-Status.", + "el_GR": "", + "en_US": "This compatibility list might contain out of date entries.\nDo not be opposed to testing games in the \"Ingame\" status.", + "es_ES": "", + "fr_FR": "Cette liste de compatibilité peut contenir des entrées obsolètes.N’hésitez pas à tester les jeux dont le statut est « En cours ».", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "이 호환성 목록에는 오래된 항목이 포함되어 있을 수 있습니다.\n\"게임 내\" 상태에서 게임을 테스트하는 것을 반대하지 마십시오.", + "no_NO": "Denne kompatibilitetslisten kan inneholde oppføringer som er tomme for data.\nVær ikke imot å teste spill i statusen «Ingame».", + "pl_PL": "", + "pt_BR": "Esta lista de compatibilidade pode estar desatualizada.\nNão se oponha a testar os jogos", + "ru_RU": "В списке совместимости могут содержаться устаревшие записи.\nНе стестняйтесь тестировать игр в статусе «Запускается»", + "sv_SE": "Denna kompatibilitetslista kan innehålla utdaterade poster.\nTesta gärna spelen som listas med \"Spelproblem\"-status.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Цей список сумісності може містити застарілі дані.\nНе відмовляйтеся від тестування ігор що мають статус \"Запускаються\".", + "zh_CN": "此兼容性列表可能包含过时的条目。\n不要只测试 \"进入游戏\" 状态的游戏。", + "zh_TW": "這個相容性列表可能含有已過時的紀錄。\n敬請繼續測試「大致可遊玩 (Ingame)」狀態的遊戲並回報以更新紀錄。" + } + }, + { + "ID": "CompatibilityListSearchBoxWatermark", + "Translations": { + "ar_SA": "", + "de_DE": "Kompatibilitätseinträge durchsuchen...", + "el_GR": "", + "en_US": "Search compatibility entries...", + "es_ES": "", + "fr_FR": "Rechercher des entrées de compatibilité...", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "호환성 항목 검색...", + "no_NO": "Søk i kompatibilitetsoppføringer...", + "pl_PL": "", + "pt_BR": "Pesquisa de compatibilidade", + "ru_RU": "Поиск записей о совместимости...", + "sv_SE": "Sök i kompatibilitetsposter...", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Перевірити сумісність гри...", + "zh_CN": "正在搜索兼容性条目...", + "zh_TW": "搜尋相容性列表紀錄..." + } + }, + { + "ID": "CompatibilityListSearchBoxWatermarkWithCount", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Search {0} compatibility entries...", + "es_ES": "", + "fr_FR": "Rechercher parmi {0} entrées de compatibilité...", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "어카이브 {0} 호환성 항목...", + "no_NO": "Søk i {0} kompatibilitetsoppføringer...", + "pl_PL": "", + "pt_BR": "Procurando {0} registros de compatibilidade...", + "ru_RU": "Поиск среди {0} записей о совместимости...", + "sv_SE": "Sök i {0} kompatibilitetsposter...", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Шукати серед {0} перевірених ігор...", + "zh_CN": "搜索 {0} 兼容性条目...", + "zh_TW": "從相容性列表的 {0} 則紀錄中搜尋..." + } + }, + { + "ID": "CompatibilityListOpen", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Open Compatibility List", + "es_ES": "", + "fr_FR": "Ouvrir la liste de compatibilité", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "호환성 목록 열기", + "no_NO": "Åpne kompatibilitetslisten", + "pl_PL": "", + "pt_BR": "Lista de Compatibilidade", + "ru_RU": "Открыть список совместимости", + "sv_SE": "Öppna kompatibilitetslistan", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Відкрити Список Сумісності", + "zh_CN": "打开兼容性列表", + "zh_TW": "開啟相容性列表" + } + }, + { + "ID": "CompatibilityListGamesAndApplications", + "Translations": { + "ar_SA": "", + "de_DE": "Spiele & Anwendungen", + "el_GR": "Παιχνίδια και Εφαρμογές", + "en_US": "Games & Applications", + "es_ES": "Juegos y Aplicaciones", + "fr_FR": "Jeux et Applications", + "he_IL": "משחקים ואפליקציות", + "it_IT": "Giochi e Applicazioni", + "ja_JP": "ゲームとアプリケーション", + "ko_KR": "게임 및 애플리케이션", + "no_NO": "Spill og Applikasjoner", + "pl_PL": "Gry i Aplikacje", + "pt_BR": "Jogos e Aplicativos", + "ru_RU": "Игры и Приложения", + "sv_SE": "Spel och applikationer", + "th_TH": "", + "tr_TR": "Oyunlar ve Uygulamalar", + "uk_UA": "Ігри та Додатки", + "zh_CN": "游戏和应用程序", + "zh_TW": "遊戲與應用程式" + } + }, + { + "ID": "CompatibilityListStatus", + "Translations": { + "ar_SA": "الحالة", + "de_DE": "", + "el_GR": "Κατάσταση", + "en_US": "Status", + "es_ES": "Estado", + "fr_FR": "Statut", + "he_IL": "מצב", + "it_IT": "Stato", + "ja_JP": "状況", + "ko_KR": "상태", + "no_NO": "", + "pl_PL": "Stan", + "pt_BR": "Estado", + "ru_RU": "Статус", + "sv_SE": "", + "th_TH": "สถานะ", + "tr_TR": "Durum", + "uk_UA": "Статус", + "zh_CN": "状态", + "zh_TW": "狀態" + } + }, + { + "ID": "CompatibilityListDescription", + "Translations": { + "ar_SA": "", + "de_DE": "Probleme und Merkmale", + "el_GR": "Προβλήματα και Χαρακτηριστικά", + "en_US": "Issues & Features", + "es_ES": "Problemas y Características", + "fr_FR": "Problèmes et Caractéristiques", + "he_IL": "", + "it_IT": "Problemi e Caratteristiche", + "ja_JP": "問題点と特徴", + "ko_KR": "문제점 및 특징", + "no_NO": "Problemer og Egenskaper", + "pl_PL": "Problemy i Cechy", + "pt_BR": "Problemas e Características", + "ru_RU": "Проблемы и Особенности", + "sv_SE": "Problem och egenskaper", + "th_TH": "", + "tr_TR": "Sorunlar ve Özellikler", + "uk_UA": "Проблеми та Особливості", + "zh_CN": "问题和特性", + "zh_TW": "問題與特性" + } + }, + { + "ID": "CompatibilityListInfo", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "Πληροφορίες", + "en_US": "Info", + "es_ES": "Información", + "fr_FR": "", + "he_IL": "מידע", + "it_IT": "", + "ja_JP": "情報", + "ko_KR": "정보", + "no_NO": "", + "pl_PL": "Informacja", + "pt_BR": "", + "ru_RU": "Инфо", + "sv_SE": "", + "th_TH": "", + "tr_TR": "Bilgi", + "uk_UA": "Інфо", + "zh_CN": "信息", + "zh_TW": "資訊" + } + }, + { + "ID": "CompatibilityListOnlyShowOwnedGames", + "Translations": { + "ar_SA": "", + "de_DE": "Nur eigene Spiele anzeigen", + "el_GR": "", + "en_US": "Only show owned games", + "es_ES": "", + "fr_FR": "Afficher uniquement les jeux possédés", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "보유 게임만 표시", + "no_NO": "Vis bare eide spill", + "pl_PL": "", + "pt_BR": "Mostrar apenas jogos disponíveis", + "ru_RU": "Показывать только свои игры", + "sv_SE": "Visa endast ägda spel", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Показувати лише ігри в наявності", + "zh_CN": "仅显示拥有的游戏", + "zh_TW": "只顯示已擁有的遊戲" + } + }, + { + "ID": "CompatibilityListPlayable", + "Translations": { + "ar_SA": "", + "de_DE": "Spielbar", + "el_GR": "", + "en_US": "Playable", + "es_ES": "", + "fr_FR": "Jouable", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "원활", + "no_NO": "Spillbar", + "pl_PL": "", + "pt_BR": "Jogável", + "ru_RU": "Играбельно", + "sv_SE": "Spelbart", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Справна", + "zh_CN": "可游玩", + "zh_TW": "可暢順遊玩" + } + }, + { + "ID": "CompatibilityListIngame", + "Translations": { + "ar_SA": "", + "de_DE": "Im Spiel", + "el_GR": "", + "en_US": "Ingame", + "es_ES": "", + "fr_FR": "En Jeu", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "가능", + "no_NO": "", + "pl_PL": "", + "pt_BR": "No jogo", + "ru_RU": "Запускается", + "sv_SE": "Spelproblem", + "th_TH": "", + "tr_TR": "", + "uk_UA": "З недоліками", + "zh_CN": "进入游戏", + "zh_TW": "大致可遊玩" + } + }, + { + "ID": "CompatibilityListMenus", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Menus", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "메뉴", + "no_NO": "Menyer", + "pl_PL": "", + "pt_BR": "Menu", + "ru_RU": "Меню", + "sv_SE": "Menyer", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Меню", + "zh_CN": "菜单", + "zh_TW": "只開啟至遊戲開始功能表" + } + }, + { + "ID": "CompatibilityListBoots", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Boots", + "es_ES": "", + "fr_FR": "Démarre", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "부팅", + "no_NO": "Starter", + "pl_PL": "", + "pt_BR": "Inicializa", + "ru_RU": "Стартует", + "sv_SE": "Startar", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Запускається", + "zh_CN": "启动", + "zh_TW": "只能啟動" + } + }, + { + "ID": "CompatibilityListNothing", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Nothing", + "es_ES": "", + "fr_FR": "Rien", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "불가", + "no_NO": "Ingenting", + "pl_PL": "", + "pt_BR": "Nada", + "ru_RU": "Ничего", + "sv_SE": "Ingenting", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Не працює", + "zh_CN": "什么都没有", + "zh_TW": "無法啟動" + } + }, + { + "ID": "CompatibilityListPlayableTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Boots and plays without any crashes or GPU bugs of any kind, and at a speed fast enough to reasonably enjoy on an average PC.", + "es_ES": "", + "fr_FR": "Démarre et fonctionne sans aucun plantage ni bug graphique, à une vitesse suffisante pour être apprécié raisonnablement sur un PC moyen.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "어떠한 충돌이나 GPU 버그 없이 부팅 및 플레이가 가능하며, 일반 PC에서 충분히 즐길 수 있을 만큼 쾌적한 속도입니다.", + "no_NO": "Starter opp og spiller uten krasj eller GPU-feil av noe slag, og med en hastighet som er rask nok til å ha rimelig glede av på en gjennomsnittlig PC.", + "pl_PL": "", + "pt_BR": "Inicializa e roda sem travamentos ou bugs de GPU de qualquer tipo, e em uma velocidade rápida o suficiente para ser aproveitado em um PC comum.", + "ru_RU": "Запускается и работает без любого рода сбоев или графисечких ошибок и на скорости, достаточной для работы на обычном ПК.", + "sv_SE": "Startar upp och spelas utan några krascher eller GPU-fel av några slag och med en hastighet som är snabb nog för bra upplevelse på en genomsnittlig PC.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Запускається та оптимально працює (без збоїв або графічних багів) на середньостатистичному комп'ютері.", + "zh_CN": "启动和游戏时不会出现任何崩溃或任何类型的 GPU bug 且速度足够快可以在一般 PC 上尽情游玩。", + "zh_TW": "啟動和遊玩時不會出現任何崩潰或任何類型的 GPU bug 且速度足夠快可以在一般 PC 上盡情遊玩。" + } + }, + { + "ID": "CompatibilityListIngameTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Boots and goes in-game but suffers from one or more of the following: crashes, deadlocks, GPU bugs, distractingly bad audio, or is simply too slow. Game still might able to be played all the way through, but not as the game is intended to play.", + "es_ES": "", + "fr_FR": "Démarre et lance le jeu, mais souffre d’un ou plusieurs des problèmes suivants : plantages, blocages, bugs graphiques, audio très désagréable, ou performances trop lentes. Le jeu peut encore être jouable jusqu’au bout, mais pas dans les conditions prévues.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "부팅하고 게임에 진입하지만 충돌, 교착, GPU 버그, 오디오에 문제가 있거나 버벅임 중 하나 이상으로 인해 문제가 발생합니다. 게임은 어쨌든 진행할 수 있습니다.", + "no_NO": "Starter og går i gang i spillet, men lider av ett eller flere av følgende: krasjer, fastlåser, GPU-feil, distraherende dårlig lyd eller er rett og slett for tregt. Spillet kan fortsatt spilles helt til ende, men ikke slik det er ment å spilles.", + "pl_PL": "", + "pt_BR": "Inicializa e entra no jogo, mas sofre de um ou mais dos seguintes: travamentos, deadlocks, bugs de GPU, áudio ruim que distrai ou é simplesmente muito lento. O jogo ainda pode ser jogado até o fim, mas não da forma como foi criado para ser jogado.", + "ru_RU": "Запускается и работает, но возникает одна или несколько из следующих проблем: сбои, взаимоблокировки, ошибки GPU, отвлекающие звуки или просто слишком медленная работа. Возможно, игру всё же удастся пройти до конца, но не так, как она задумана.", + "sv_SE": "Startar och går in i spelet men lider av ett eller flera av följande: kraschar, deadlocks, GPU-buggar, distraherande dåligt ljud eller är helt enkelt för långsamt. Spelet kan fortfarande spelas hela vägen igenom, men inte så som spelet är avsett att spelas.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Запускається, але в грі на вас чекатимуть одна або декілька наступних проблем: збої, зависання, графічні баги, спотворений звук або ж гра загалом працюватиме надто повільно. Можливо, її все ще можна пройти, але досвід буде не найкращим.", + "zh_CN": "可以成功启动并进入游戏但可能会遇到以下一种或多种问题: 崩溃、卡死、GPU bug、令人无法接受的音频,或者只是太慢。仍然可以继续进行游戏,但是可能无法达到预期。", + "zh_TW": "能啟動並進入遊戲,但可能會遇到下列狀況:崩潰、卡死、GPU bug、令人無法接受的聲音、或遊戲過慢。遊戲或可繼續進行,但是可能無法達到預期效果。" + } + }, + { + "ID": "CompatibilityListMenusTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Boots and goes past the title screen but does not make it into main gameplay.", + "es_ES": "", + "fr_FR": "Démarre et dépasse l’écran titre, mais n’atteint pas le gameplay principal.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "부팅하고 타이틀 화면이 나오지만 메인 게임 플레이로 진입할 수 없습니다.", + "no_NO": "Starter opp og går forbi tittelskjermen, men kommer ikke inn i hovedspillet.", + "pl_PL": "", + "pt_BR": "Inicializa e passa da tela de título, mas não entra no jogo principal.", + "ru_RU": "Загружается титульный экран и можно перейти дальше, но сама игра не работает.", + "sv_SE": "Startar upp och går förbi titelskärmen men tar sig inte in i huvudspelet.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Запускається та проходить початковий екран, але пограти не вийде.", + "zh_CN": "可以启动并通过标题画面但是无法进入到主要的游戏流程。", + "zh_TW": "能啟動並通過標題畫面,但是無法進入主要的遊戲畫面。" + } + }, + { + "ID": "CompatibilityListBootsTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Startet, kommt aber nicht über den Titelbildschirm hinaus.", + "el_GR": "", + "en_US": "Boots but does not make it past the title screen.", + "es_ES": "", + "fr_FR": "Démarre mais ne dépasse pas l’écran titre.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "부팅되지만 타이틀 화면을 통과하지 못합니다.", + "no_NO": "Starter, men kommer ikke lenger enn til tittelskjermen.", + "pl_PL": "", + "pt_BR": "Inizializa, mas não passa da tela de título.", + "ru_RU": "Загружается, но не проходит дальше титульного экрана.", + "sv_SE": "Startar upp men tar sig inte förbi titelskärmen.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Запускається, але не відображає навіть початкового екрану.", + "zh_CN": "可以启动但是无法通过标题画面。", + "zh_TW": "能啟動,但是無法通過標題畫面。" + } + }, + { + "ID": "CompatibilityListNothingTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Startet nicht oder zeigt keine Anzeichen von Aktivität.", + "el_GR": "", + "en_US": "Does not boot or shows no signs of activity.", + "es_ES": "", + "fr_FR": "Ne démarre pas et ne montre aucun signe d’activité.", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "부팅되지 않거나 동작하지 않습니다.", + "no_NO": "Starter ikke opp eller viser ingen tegn til aktivitet.", + "pl_PL": "", + "pt_BR": "Não inicializa ou não mostra sinais de atividade.", + "ru_RU": "Не запускается или не подаёт признаков жизни.", + "sv_SE": "Startar inte upp eller visar någon form av aktivitet.", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Взагалі не запускається.", + "zh_CN": "无法启动或显示无任何动静。", + "zh_TW": "無法啟動" + } + }, + { + "ID": "GameSpecificConfigurationHeader", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Custom Config", + "es_ES": "", + "fr_FR": "Configuration personnalisée", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "사용자 정의 설정", + "no_NO": "Tilpasset konfigurasjon", + "pl_PL": "", + "pt_BR": "Configurações Customizadas", + "ru_RU": "Индивидуальные параметры", + "sv_SE": "Anpassad konfiguration", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Власна конфігурація", + "zh_CN": "自定义配置", + "zh_TW": "遊戲獨立自訂 (game-specific) 設定" + } + }, + { + "ID": "GameSpecificConfigurationGlobal", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "(Global)", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "(글로벌)", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "(Глобальный)", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "(Глобальні)", + "zh_CN": "(全局)", + "zh_TW": "(全域)" + } + }, + { + "ID": "ExtractAocListHeader", + "Translations": { + "ar_SA": "", + "de_DE": "Wähle ein DLC zum Extrahieren aus", + "el_GR": "", + "en_US": "Select a DLC to Extract", + "es_ES": "", + "fr_FR": "Choisissez un DLC à extraire", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "추출할 DLC 선택", + "no_NO": "Velg en DLC og hente ut", + "pl_PL": "", + "pt_BR": "Selecione um DLC para Extrair", + "ru_RU": "Выберите DLC для извлечения", + "sv_SE": "Välj en DLC att extrahera", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Оберіть DLC які бажаєте вилучити", + "zh_CN": "选择一个要解压的 DLC", + "zh_TW": "選擇要提取的 DLC" + } + }, + { + "ID": "GameInfoRpcImage", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Rich Presence Image", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "리치 프레즌스 이미지", + "no_NO": "Rikt nærværsbilde", + "pl_PL": "", + "pt_BR": "Imagem da Presença do Discord", + "ru_RU": "Изображение для статуса активности", + "sv_SE": "Bild för Rich Presence", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Зображення картки активності Discord", + "zh_CN": "Rich Presence 图像", + "zh_TW": "Rich Presence 圖像" + } + }, + { + "ID": "GameInfoRpcDynamic", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Dynamic Rich Presence", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "다이내믹 리치 프레즌스", + "no_NO": "Dynamisk og rik tilstedeværelse", + "pl_PL": "", + "pt_BR": "Presença Dinâmica do Discord", + "ru_RU": "Динамический статус активности", + "sv_SE": "Dynamisk Rich Presence", + "th_TH": "", + "tr_TR": "", + "uk_UA": "Динамічна картка активності Discord", + "zh_CN": "动态 Rich Presence", + "zh_TW": "動態 Rich Presence" + } + } + ] +} diff --git a/distribution/linux/appimage/build-appimage.sh b/distribution/linux/appimage/build-appimage.sh index 5c32d78a8..a9de4866b 100755 --- a/distribution/linux/appimage/build-appimage.sh +++ b/distribution/linux/appimage/build-appimage.sh @@ -6,14 +6,14 @@ cd "$ROOTDIR" BUILDDIR=${BUILDDIR:-publish} OUTDIR=${OUTDIR:-publish_appimage} -UFLAG=${UFLAG:-"gh-releases-zsync|GreemDev|ryujinx|latest|*-x64.AppImage.zsync"} +UFLAG=${UFLAG:-"gh-releases-zsync|Ryubing|ryujinx|latest|*-x64.AppImage.zsync"} rm -rf AppDir mkdir -p AppDir/usr/bin cp distribution/linux/Ryujinx.desktop AppDir/Ryujinx.desktop cp distribution/linux/appimage/AppRun AppDir/AppRun -cp src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png AppDir/Ryujinx.svg +cp distribution/misc/Logo.svg AppDir/Ryujinx.svg cp -r "$BUILDDIR"/* AppDir/usr/bin/ diff --git a/distribution/macos/Ryujinx.icns b/distribution/macos/Ryujinx.icns index 1bb88a5d7..fd5cd7f7e 100644 Binary files a/distribution/macos/Ryujinx.icns and b/distribution/macos/Ryujinx.icns differ diff --git a/distribution/macos/bundle_fix_up.py b/distribution/macos/bundle_fix_up.py index a8e3ac760..1c0f67bbf 100644 --- a/distribution/macos/bundle_fix_up.py +++ b/distribution/macos/bundle_fix_up.py @@ -19,7 +19,7 @@ if platform.system() == "Darwin": else: OTOOL = shutil.which("llvm-otool") if OTOOL is None: - for llvm_ver in [15, 14, 13]: + for llvm_ver in [17, 16, 15, 14, 13]: otool_path = shutil.which(f"llvm-otool-{llvm_ver}") if otool_path is not None: OTOOL = otool_path @@ -562,26 +562,29 @@ search_path = [ for path in content_directory.rglob("**/*.dylib"): - current_search_path = [path.parent] - current_search_path.extend(search_path) + if not path.name.startswith("._"): + current_search_path = [path.parent] + current_search_path.extend(search_path) - fixup_dylib( - path, - get_path_related_to_target_exec(content_directory, path), - current_search_path, - content_directory, - ) + print(f"Fixing path '{path}' using search path of '{current_search_path}' for context of '{content_directory}'.") + fixup_dylib( + path, + get_path_related_to_target_exec(content_directory, path), + current_search_path, + content_directory, + ) for path in content_directory.rglob("**/*.so"): - current_search_path = [path.parent] - current_search_path.extend(search_path) + if not path.name.startswith("._"): + current_search_path = [path.parent] + current_search_path.extend(search_path) - fixup_dylib( - path, - get_path_related_to_target_exec(content_directory, path), - current_search_path, - content_directory, - ) + fixup_dylib( + path, + get_path_related_to_target_exec(content_directory, path), + current_search_path, + content_directory, + ) with open(executable_path, "rb") as input: diff --git a/distribution/macos/construct_universal_dylib.py b/distribution/macos/construct_universal_dylib.py index b6c3770c6..5d9321860 100644 --- a/distribution/macos/construct_universal_dylib.py +++ b/distribution/macos/construct_universal_dylib.py @@ -26,7 +26,7 @@ else: LIPO = shutil.which("llvm-lipo") if LIPO is None: - for llvm_ver in [15, 14, 13]: + for llvm_ver in [17, 16, 15, 14, 13]: lipo_path = shutil.which(f"llvm-lipo-{llvm_ver}") if lipo_path is not None: LIPO = lipo_path diff --git a/distribution/macos/create_app_bundle.sh b/distribution/macos/create_app_bundle.sh index e4397da84..0b4ab8e04 100755 --- a/distribution/macos/create_app_bundle.sh +++ b/distribution/macos/create_app_bundle.sh @@ -30,21 +30,32 @@ cp -r "$PUBLISH_DIRECTORY/THIRDPARTY.md" "$APP_BUNDLE_DIRECTORY/Contents/Resourc echo -n "APPL????" > "$APP_BUNDLE_DIRECTORY/Contents/PkgInfo" # Fixup libraries and executable +echo "Running bundle fix up python script" python3 bundle_fix_up.py "$APP_BUNDLE_DIRECTORY" MacOS/Ryujinx # Now sign it +echo "Starting signing process" if ! [ -x "$(command -v codesign)" ]; then if ! [ -x "$(command -v rcodesign)" ]; then - echo "Cannot find rcodesign on your system, please install rcodesign." + echo "Cannot find rcodesign on your system, please install rcodesign and ensure it is in your search path." exit 1 fi - # cargo install apple-codesign - echo "Usign rcodesign for ad-hoc signing" + echo "Using rcodesign for ad-hoc signing" + + echo "Resigning all frameworks dylib files as ad-hoc" + find "$APP_BUNDLE_DIRECTORY/Contents/Frameworks" -type f -name "*.dylib" -exec rcodesign sign {} \; + + echo "Signing app bundle as ad-hoc" rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$APP_BUNDLE_DIRECTORY" else - echo "Usign codesign for ad-hoc signing" + echo "Using codesign for ad-hoc signing" + + echo "Resigning all frameworks dylib files as ad-hoc" + find "$APP_BUNDLE_DIRECTORY/Contents/Frameworks" -type f -name "*.dylib" -exec codesign --force --sign - {} \; + + echo "Signing app bundle as ad-hoc" codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f -s - "$APP_BUNDLE_DIRECTORY" fi diff --git a/distribution/macos/create_macos_build_ava.sh b/distribution/macos/create_macos_build_ava.sh index b19fa4863..028486f51 100755 --- a/distribution/macos/create_macos_build_ava.sh +++ b/distribution/macos/create_macos_build_ava.sh @@ -20,6 +20,18 @@ SOURCE_REVISION_ID=$6 CONFIGURATION=$7 CANARY=$8 +if [[ "$(uname)" == "Darwin" ]]; then + echo "Clearing xattr on all dot undercsore files" + find "$BASE_DIR" -type f -name "._*" -exec sh -c ' + for f; do + dir=$(dirname "$f") + base=$(basename "$f") + orig="$dir/${base#._}" + [ -f "$orig" ] && xattr -c "$orig" || true + done + ' sh {} + +fi + if [ "$CANARY" == "1" ]; then RELEASE_TAR_FILE_NAME=ryujinx-canary-$VERSION-macos_universal.app.tar elif [ "$VERSION" == "1.1.0" ]; then @@ -67,11 +79,11 @@ python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_APP_ if ! [ -x "$(command -v lipo)" ]; then - if ! [ -x "$(command -v llvm-lipo-14)" ]; + if ! [ -x "$(command -v llvm-lipo-17)" ]; then LIPO=llvm-lipo else - LIPO=llvm-lipo-14 + LIPO=llvm-lipo-17 fi else LIPO=lipo diff --git a/distribution/macos/create_macos_build_headless.sh b/distribution/macos/create_macos_build_headless.sh index 01951d878..6052b202c 100755 --- a/distribution/macos/create_macos_build_headless.sh +++ b/distribution/macos/create_macos_build_headless.sh @@ -20,6 +20,18 @@ SOURCE_REVISION_ID=$6 CONFIGURATION=$7 CANARY=$8 +if [[ "$(uname)" == "Darwin" ]]; then + echo "Clearing xattr on all dot undercsore files" + find "$BASE_DIR" -type f -name "._*" -exec sh -c ' + for f; do + dir=$(dirname "$f") + base=$(basename "$f") + orig="$dir/${base#._}" + [ -f "$orig" ] && xattr -c "$orig" || true + done + ' sh {} + +fi + if [ "$CANARY" == "1" ]; then RELEASE_TAR_FILE_NAME=nogui-ryujinx-canary-$VERSION-macos_universal.tar elif [ "$VERSION" == "1.1.0" ]; then @@ -62,11 +74,11 @@ python3 "$BASE_DIR/distribution/macos/construct_universal_dylib.py" "$ARM64_OUTP if ! [ -x "$(command -v lipo)" ]; then - if ! [ -x "$(command -v llvm-lipo-14)" ]; + if ! [ -x "$(command -v llvm-lipo-17)" ]; then LIPO=llvm-lipo else - LIPO=llvm-lipo-14 + LIPO=llvm-lipo-17 fi else LIPO=lipo diff --git a/distribution/macos/shortcut-template.plist b/distribution/macos/shortcut-template.plist index 27a9e46a9..c6368a08f 100644 --- a/distribution/macos/shortcut-template.plist +++ b/distribution/macos/shortcut-template.plist @@ -19,7 +19,7 @@ CSResourcesFileMapped NSHumanReadableCopyright - Copyright © 2018 - 2023 Ryujinx Team and Contributors. + Copyright © 2018 - 2025 Ryujinx Team and Contributors. LSApplicationCategoryType public.app-category.games LSMinimumSystemVersion diff --git a/distribution/misc/Logo.svg b/distribution/misc/Logo.svg index d3327f2ef..00bba42f0 100644 --- a/distribution/misc/Logo.svg +++ b/distribution/misc/Logo.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/docs/compatibility.csv b/docs/compatibility.csv new file mode 100644 index 000000000..6499c8a7a --- /dev/null +++ b/docs/compatibility.csv @@ -0,0 +1,3451 @@ +"title_id","game_name","labels","status","last_updated" +010099F00EF3E000,"-KLAUS-",nvdec,playable,2020-06-27 13:27:30 +0100BA9014A02000,".hack//G.U. Last Recode",deadlock,boots,2022-03-12 19:15:47 +010098800C4B0000,"'n Verlore Verstand",slow,ingame,2020-12-10 18:00:28 +01009A500E3DA000,"'n Verlore Verstand - Demo",,playable,2021-02-09 00:13:32 +0100A5D01174C000,"/Connection Haunted ",slow,playable,2020-12-10 18:57:14 +01001E500F7FC000,"#Funtime",,playable,2020-12-10 16:54:35 +01000E50134A4000,"#Halloween, Super Puzzles Dream",nvdec,playable,2020-12-10 20:43:58 +01004D100C510000,"#KILLALLZOMBIES",slow,playable,2020-12-16 01:50:25 +0100325012C12000,"#NoLimitFantasy, Super Puzzles Dream",nvdec,playable,2020-12-12 17:21:32 +01005D400E5C8000,"#RaceDieRun",,playable,2020-07-04 20:23:16 +01003DB011AE8000,"#womenUp, Super Puzzles Dream",,playable,2020-12-12 16:57:25 +0100D87012A14000,"#womenUp, Super Puzzles Dream Demo",nvdec,playable,2021-02-09 00:03:31 +01000320000CC000,"1-2-Switch™",services,playable,2022-02-18 14:44:03 +01004D1007926000,"10 Second Run RETURNS",gpu,ingame,2022-07-17 13:06:18 +0100DC000A472000,"10 Second Run RETURNS Demo",gpu,ingame,2021-02-09 00:17:18 +0100D82015774000,"112 Operator",nvdec,playable,2022-11-13 22:42:50 +010051E012302000,"112th Seed",,playable,2020-10-03 10:32:38 +01007F600D1B8000,"12 is Better Than 6",,playable,2021-02-22 16:10:12 +0100B1A010014000,"12 Labours of Hercules II: The Cretan Bull",cpu;32-bit;crash,nothing,2022-12-07 13:43:10 +0100A840047C2000,"12 orbits",,playable,2020-05-28 16:13:26 +01003FC01670C000,"13 Sentinels: Aegis Rim",slow,ingame,2024-06-10 20:33:38 +0100C54015002000,"13 Sentinels: Aegis Rim Demo",demo,playable,2022-04-13 14:15:48 +01007E600EEE6000,"140",,playable,2020-08-05 20:01:33 +0100B94013D28000,"16-Bit Soccer Demo",,playable,2021-02-09 00:23:07 +01005CA0099AA000,"1917 - The Alien Invasion DX",,playable,2021-01-08 22:11:16 +0100829010F4A000,"1971 Project Helios",,playable,2021-04-14 13:50:19 +0100D1000B18C000,"1979 Revolution: Black Friday",nvdec,playable,2021-02-21 21:03:43 +01007BB00FC8A000,"198X",,playable,2020-08-07 13:24:38 +010075601150A000,"1993 Shenandoah",,playable,2020-10-24 13:55:42 +0100148012550000,"1993 Shenandoah Demo",,playable,2021-02-09 00:43:43 +010096500EA94000,"2048 Battles",,playable,2020-12-12 14:21:25 +010024C0067C4000,"2064: Read Only Memories INTEGRAL",deadlock,menus,2020-05-28 16:53:58 +0100749009844000,"20XX",gpu,ingame,2023-08-14 09:41:44 +01007550131EE000,"2URVIVE",,playable,2022-11-17 13:49:37 +0100E20012886000,"2weistein – The Curse of the Red Dragon",nvdec;UE4,playable,2022-11-18 14:47:07 +0100DAC013D0A000,"30 in 1 game collection vol. 2",online-broken,playable,2022-10-15 17:22:27 +010056D00E234000,"30-in-1 Game Collection",online-broken,playable,2022-10-15 17:47:09 +0100FB5010D2E000,"3000th Duel",,playable,2022-09-21 17:12:08 +01003670066DE000,"36 Fragments of Midnight",,playable,2020-05-28 15:12:59 +0100AF400C4CE000,"39 Days to Mars",,playable,2021-02-21 22:12:46 +010010C013F2A000,"3D Arcade Fishing",,playable,2022-10-25 21:50:51 +01006DA00707C000,"3D MiniGolf",,playable,2021-01-06 09:22:11 +01006890126E4000,"4x4 Dirt Track",,playable,2020-12-12 21:41:42 +010010100FF14000,"60 Parsecs!",,playable,2022-09-17 11:01:17 +0100969005E98000,"60 Seconds!",services,ingame,2021-11-30 01:04:14 +0100ECF008474000,"6180 the moon",,playable,2020-05-28 15:39:24 +0100EFE00E964000,"64.0",,playable,2020-12-12 21:31:58 +0100DA900B67A000,"7 Billion Humans",32-bit,playable,2020-12-17 21:04:58 +01004B200DF76000,"7th Sector",nvdec,playable,2020-08-10 14:22:14 +0100E9F00B882000,"8-BIT ADV STEINS;GATE",audio,ingame,2020-01-12 15:05:06 +0100B0700E944000,"80 DAYS",,playable,2020-06-22 21:43:01 +01006B1011B9E000,"80's OVERDRIVE",,playable,2020-10-16 14:33:32 +010006A0042F0000,"88 Heroes - 98 Heroes Edition",,playable,2020-05-28 14:13:02 +010005E00E2BC000,"9 Monkeys of Shaolin",UE4;gpu;slow,ingame,2020-11-17 11:58:43 +0100C5F012E3E000,"9 Monkeys of Shaolin Demo",UE4;gpu;nvdec,ingame,2021-02-09 01:03:30 +01000360107BC000,"911 Operator Deluxe Edition",,playable,2020-07-14 13:57:44 +0100B2C00682E000,"99Vidas - Definitive Edition",online,playable,2020-10-29 13:00:40 +010023500C2F0000,"99Vidas Demo",,playable,2021-02-09 12:51:31 +0100DB00117BA000,"9th Dawn III",,playable,2020-12-12 22:27:27 +010096A00CC80000,"A Ch'ti Bundle",nvdec,playable,2022-10-04 12:48:44 +010021D00D53E000,"A Dark Room",gpu,ingame,2020-12-14 16:14:28 +010026B006802000,"A Duel Hand Disaster: Trackher",nvdec;online-working,playable,2022-09-04 14:24:55 +0100582012B90000,"A Duel Hand Disaster: Trackher DEMO",crash;demo;nvdec,ingame,2021-03-24 18:45:27 +01006CE0134E6000,"A Frog Game",,playable,2020-12-14 16:09:53 +010056E00853A000,"A Hat in Time",,playable,2024-06-25 19:52:44 +01009E1011EC4000,"A HERO AND A GARDEN",,playable,2022-12-05 16:37:47 +01005EF00CFDA000,"A Knight's Quest",UE4,playable,2022-09-12 20:44:20 +01008DD006C52000,"A Magical High School Girl",,playable,2022-07-19 14:40:50 +01004890117B2000,"A Short Hike",,playable,2020-10-15 00:19:58 +0100F0901006C000,"A Sound Plan",crash,boots,2020-12-14 16:46:21 +01007DD011C4A000,"A Summer with the Shiba Inu",,playable,2021-06-10 20:51:16 +0100A3E010E56000,"A-Train: All Aboard! Tourism",nvdec,playable,2021-04-06 17:48:19 +010097A00CC0A000,"Aaero: Complete Edition",nvdec,playable,2022-07-19 14:49:55 +0100EFC010398000,"Aborigenus",,playable,2020-08-05 19:47:24 +0100A5B010A66000,"Absolute Drift",,playable,2020-12-10 14:02:44 +0100C1300BBC6000,"ABZÛ",UE4,playable,2022-07-19 15:02:52 +01003C400871E000,"ACA NEOGEO 2020 SUPER BASEBALL",online,playable,2021-04-12 13:23:51 +0100FC000AFC6000,"ACA NEOGEO 3 COUNT BOUT",online,playable,2021-04-12 13:16:42 +0100AC40038F4000,"ACA NEOGEO AERO FIGHTERS 2",online,playable,2021-04-08 15:44:09 +0100B91008780000,"ACA NEOGEO AERO FIGHTERS 3",online,playable,2021-04-12 13:11:17 +0100B4800AFBA000,"ACA NEOGEO AGGRESSORS OF DARK KOMBAT",online,playable,2021-04-01 22:48:01 +01003FE00A2F6000,"ACA NEOGEO BASEBALL STARS PROFESSIONAL",online,playable,2021-04-01 21:23:05 +0100DFC003398000,"ACA NEOGEO BLAZING STAR",crash;services,menus,2020-05-26 17:29:02 +0100D2400AFB0000,"ACA NEOGEO CROSSED SWORDS",online,playable,2021-04-01 20:42:59 +0100EE6002B48000,"ACA NEOGEO FATAL FURY",online,playable,2021-04-01 20:36:23 +0100EEA00AFB2000,"ACA NEOGEO FOOTBALL FRENZY",,playable,2021-03-29 20:12:12 +0100CB2001DB8000,"ACA NEOGEO GAROU: MARK OF THE WOLVES",online,playable,2021-04-01 20:31:10 +01005D700A2F8000,"ACA NEOGEO GHOST PILOTS",online,playable,2021-04-01 20:26:45 +01000D10038E6000,"ACA NEOGEO LAST RESORT",online,playable,2021-04-01 19:51:22 +0100A2900AFA4000,"ACA NEOGEO LEAGUE BOWLING",crash;services,menus,2020-05-26 17:11:04 +0100A050038F2000,"ACA NEOGEO MAGICAL DROP II",crash;services,menus,2020-05-26 16:48:24 +01007920038F6000,"ACA NEOGEO MAGICIAN LORD",online,playable,2021-04-01 19:33:26 +0100EBE002B3E000,"ACA NEOGEO METAL SLUG",,playable,2021-02-21 13:56:48 +010086300486E000,"ACA NEOGEO METAL SLUG 2",online,playable,2021-04-01 19:25:52 +0100BA8001DC6000,"ACA NEOGEO METAL SLUG 3",crash;services,menus,2020-05-26 16:32:45 +01009CE00AFAE000,"ACA NEOGEO METAL SLUG 4",online,playable,2021-04-01 18:12:18 +01008FD004DB6000,"ACA NEOGEO METAL SLUG X",crash;services,menus,2020-05-26 14:07:20 +010038F00AFA0000,"ACA NEOGEO Money Puzzle Exchanger",online,playable,2021-04-01 17:59:56 +01002E70032E8000,"ACA NEOGEO NEO TURF MASTERS",,playable,2021-02-21 15:12:01 +010052A00A306000,"ACA NEOGEO NINJA COMBAT",,playable,2021-03-29 21:17:28 +01007E800AFB6000,"ACA NEOGEO NINJA COMMANDO",online,playable,2021-04-01 17:28:18 +01003A5001DBA000,"ACA NEOGEO OVER TOP",,playable,2021-02-21 13:16:25 +010088500878C000,"ACA NEOGEO REAL BOUT FATAL FURY SPECIAL",online,playable,2021-04-01 17:18:27 +01005C9002B42000,"ACA NEOGEO SAMURAI SHODOWN",online,playable,2021-04-01 17:11:35 +010047F001DBC000,"ACA NEOGEO SAMURAI SHODOWN IV",online,playable,2021-04-12 12:58:54 +010049F00AFE8000,"ACA NEOGEO SAMURAI SHODOWN V SPECIAL",online,playable,2021-04-10 18:07:13 +01009B300872A000,"ACA NEOGEO SENGOKU 2",online,playable,2021-04-10 17:36:44 +01008D000877C000,"ACA NEOGEO SENGOKU 3",online,playable,2021-04-10 16:11:53 +01008A9001DC2000,"ACA NEOGEO SHOCK TROOPERS",crash;services,menus,2020-05-26 15:29:34 +01007D1004DBA000,"ACA NEOGEO SPIN MASTER",online,playable,2021-04-10 15:50:19 +010055A00A300000,"ACA NEOGEO SUPER SIDEKICKS 2",online,playable,2021-04-10 16:05:58 +0100A4D00A308000,"ACA NEOGEO SUPER SIDEKICKS 3 : THE NEXT GLORY",online,playable,2021-04-10 15:39:22 +0100EB2001DCC000,"ACA NEOGEO THE KING OF FIGHTERS '94",crash;services,menus,2020-05-26 15:03:44 +01009DC001DB6000,"ACA NEOGEO THE KING OF FIGHTERS '95",,playable,2021-03-29 20:27:35 +01006F0004FB4000,"ACA NEOGEO THE KING OF FIGHTERS '96",online,playable,2021-04-10 14:49:10 +0100170008728000,"ACA NEOGEO THE KING OF FIGHTERS '97",online,playable,2021-04-10 14:43:27 +0100B42001DB4000,"ACA NEOGEO THE KING OF FIGHTERS '98",crash;services,menus,2020-05-26 14:54:20 +0100583001DCA000,"ACA NEOGEO THE KING OF FIGHTERS '99",online,playable,2021-04-10 14:36:56 +0100B97002B44000,"ACA NEOGEO THE KING OF FIGHTERS 2000",online,playable,2021-04-10 15:24:35 +010048200AFC2000,"ACA NEOGEO THE KING OF FIGHTERS 2001",online,playable,2021-04-10 15:16:23 +0100CFD00AFDE000,"ACA NEOGEO THE KING OF FIGHTERS 2002",online,playable,2021-04-10 15:01:55 +0100EF100AFE6000,"ACA NEOGEO THE KING OF FIGHTERS 2003",online,playable,2021-04-10 14:54:31 +0100699008792000,"ACA NEOGEO THE LAST BLADE 2",online,playable,2021-04-10 14:31:54 +0100F7F00AFA2000,"ACA NEOGEO THE SUPER SPY",online,playable,2021-04-10 14:26:33 +0100CEF001DC0000,"ACA NEOGEO WAKU WAKU 7",online,playable,2021-04-10 14:20:52 +01009D4001DC4000,"ACA NEOGEO WORLD HEROES PERFECT",crash;services,menus,2020-05-26 14:14:36 +01002E700AFC4000,"ACA NEOGEO ZUPAPA!",online,playable,2021-03-25 20:07:33 +0100A9900CB5C000,"Access Denied",,playable,2022-07-19 15:25:10 +01007C50132C8000,"Ace Angler: Fishing Spirits",crash,menus,2023-03-03 03:21:39 +010005501E68C000,"Ace Attorney Investigations Collection",,playable,2024-09-19 16:38:05 +010033401E68E000,"Ace Attorney Investigations Collection DEMO",,playable,2024-09-07 06:16:42 +010039301B7E0000,"Ace Combat 7 - Skies Unknown Deluxe Edition",gpu;UE4,ingame,2024-09-27 14:31:43 +0100FF1004D56000,"Ace of Seafood",,playable,2022-07-19 15:32:25 +0100B28003440000,"Aces of the Luftwaffe - Squadron",nvdec;slow,playable,2020-05-27 12:29:42 +010054300D822000,"Aces of the Luftwaffe - Squadron Demo",nvdec,playable,2021-02-09 13:12:28 +010079B00B3F4000,"Achtung! Cthulhu Tactics",,playable,2020-12-14 18:40:27 +0100DBC0081A4000,"ACORN Tactics",,playable,2021-02-22 12:57:40 +010043C010AEA000,"Across the Grooves",,playable,2020-06-27 12:29:51 +010039A010DA0000,"Active Neurons - Puzzle game",,playable,2021-01-27 21:31:21 +01000D1011EF0000,"Active Neurons 2",,playable,2022-10-07 16:21:42 +010031C0122B0000,"Active Neurons 2 Demo",,playable,2021-02-09 13:40:21 +0100EE1013E12000,"Active Neurons 3 - Wonders Of The World",,playable,2021-03-24 12:20:20 +0100CD40104DE000,"Actual Sunlight",gpu,ingame,2020-12-14 17:18:41 +0100C0C0040E4000,"Adam's Venture™: Origins",,playable,2021-03-04 18:43:57 +010029700EB76000,"Adrenaline Rush - Miami Drive",,playable,2020-12-12 22:49:50 +0100300012F2A000,"Advance Wars™ 1+2: Re-Boot Camp",,playable,2024-01-30 18:19:44 +010014B0130F2000,"Adventure Llama",,playable,2020-12-14 19:32:24 +0100C990102A0000,"Adventure Pinball Bundle",slow,playable,2020-12-14 20:31:53 +0100C4E004406000,"Adventure Time: Pirates of the Enchiridion",nvdec,playable,2022-07-21 21:49:01 +010021F00C1C0000,"Adventures of Bertram Fiddle Episode 2: A Bleaker Predicklement",nvdec,playable,2021-02-22 14:56:37 +010072601233C000,"Adventures of Chris",,playable,2020-12-12 23:00:02 +0100A0A0136E8000,"Adventures of Chris Demo",,playable,2021-02-09 13:49:21 +01002B5012004000,"Adventures of Pip",nvdec,playable,2020-12-12 22:11:55 +01008C901266E000,"ADVERSE",UE4,playable,2021-04-26 14:32:51 +01008E6006502000,"Aegis Defenders",,playable,2021-02-22 13:29:33 +010064500AF72000,"Aegis Defenders demo",,playable,2021-02-09 14:04:17 +010001C011354000,"Aeolis Tournament",online,playable,2020-12-12 22:02:14 +01006710122CE000,"Aeolis Tournament Demo",nvdec,playable,2021-02-09 14:22:30 +0100A0400DDE0000,"AER Memories of Old",nvdec,playable,2021-03-05 18:43:43 +0100E9B013D4A000,"Aerial_Knight's Never Yield",,playable,2022-10-25 22:05:00 +0100087012810000,"Aery - Broken Memories",,playable,2022-10-04 13:11:52 +01000A8015390000,"Aery - Calm Mind",,playable,2022-11-14 14:26:58 +0100875011D0C000,"Aery - Little Bird Adventure",,playable,2021-03-07 15:25:51 +010018E012914000,"Aery - Sky Castle",,playable,2022-10-21 17:58:49 +0100DF8014056000,"Aery – A Journey Beyond Time",,playable,2021-04-05 15:52:25 +01006C40086EA000,"AeternoBlade",nvdec,playable,2020-12-14 20:06:48 +0100B1C00949A000,"AeternoBlade Demo",nvdec,playable,2021-02-09 14:39:26 +01009D100EA28000,"AeternoBlade II",online-broken;UE4;vulkan-backend-bug,playable,2022-09-12 21:11:18 +0100B1C00949A000,"AeternoBlade II Demo Version",gpu;nvdec,ingame,2021-02-09 15:10:19 +01001B400D334000,"AFL Evolution 2",slow;online-broken;UE4,playable,2022-12-07 12:45:56 +0100DB100BBCE000,"Afterparty",,playable,2022-09-22 12:23:19 +010087C011C4E000,"Agatha Christie - The ABC Murders",,playable,2020-10-27 17:08:23 +010093600A60C000,"Agatha Knife",,playable,2020-05-28 12:37:58 +010005400A45E000,"Agent A: A puzzle in disguise",,playable,2020-11-16 22:53:27 +01008E8012C02000,"Agent A: A puzzle in disguise (Demo)",,playable,2021-02-09 18:30:41 +0100E4700E040000,"Ages of Mages: The last keeper",vulkan-backend-bug,playable,2022-10-04 11:44:05 +010004D00A9C0000,"Aggelos",gpu,ingame,2023-02-19 13:24:23 +010072600D21C000,"Agony",UE4;crash,boots,2020-07-10 16:21:18 +010089B00D09C000,"AI: THE SOMNIUM FILES",nvdec,playable,2022-09-04 14:45:06 +0100C1700FB34000,"AI: THE SOMNIUM FILES Demo",nvdec,playable,2021-02-10 12:52:33 +01006E8011C1E000,"Ailment",,playable,2020-12-12 22:30:41 +0100C7600C7D6000,"Air Conflicts: Pacific Carriers",,playable,2021-01-04 10:52:50 +010005A00A4F4000,"Air Hockey",,playable,2020-05-28 16:44:37 +0100C9E00F54C000,"Air Missions: HIND",,playable,2020-12-13 10:16:45 +0100E95011FDC000,"Aircraft Evolution",nvdec,playable,2021-06-14 13:30:18 +010010A00DB72000,"Airfield Mania Demo",services;demo,boots,2022-04-10 03:43:02 +01003DD00BFEE000,"Airheart - Tales of broken Wings",,playable,2021-02-26 15:20:27 +01007F100DE52000,"Akane",nvdec,playable,2022-07-21 00:12:18 +01009A800F0C8000,"Akash: Path of the Five",gpu;nvdec,ingame,2020-12-14 22:33:12 +010053100B0EA000,"Akihabara - Feel the Rhythm Remixed",,playable,2021-02-22 14:39:35 +0100D4C00EE0C000,"Akuarium",slow,playable,2020-12-12 23:43:36 +010026E00FEBE000,"Akuto: Showdown",,playable,2020-08-04 19:43:27 +0100F5400AB6C000,"Alchemic Jousts",gpu,ingame,2022-12-08 15:06:28 +010001E00F75A000,"Alchemist's Castle",,playable,2020-12-12 23:54:08 +01004510110C4000,"Alder's Blood Prologue",crash,ingame,2021-02-09 19:03:03 +0100D740110C0000,"Alder's Blood: Definitive Edition",,playable,2020-08-28 15:15:23 +01000E000EEF8000,"Aldred Knight",services,playable,2021-11-30 01:49:17 +010025D01221A000,"Alex Kidd in Miracle World DX",,playable,2022-11-14 15:01:34 +0100A2E00D0E0000,"Alien Cruise",,playable,2020-08-12 13:56:05 +0100C1500DBDE000,"Alien Escape",,playable,2020-06-03 23:43:18 +010075D00E8BA000,"Alien: Isolation",nvdec;vulkan-backend-bug,playable,2022-09-17 11:48:41 +0100CBD012FB6000,"All Walls Must Fall",UE4,playable,2022-10-15 19:16:30 +0100C1F00A9B8000,"All-Star Fruit Racing",nvdec;UE4,playable,2022-07-21 00:35:37 +0100AC501122A000,"Alluris",gpu;UE4,ingame,2023-08-02 23:13:50 +010063000C3CE000,"Almightree: The Last Dreamer",slow,playable,2020-12-15 13:59:03 +010083E010AE8000,"Along the Edge",,playable,2020-11-18 15:00:07 +010083E013188000,"Alpaca Ball: Allstars",nvdec,playable,2020-12-11 12:26:29 +01000A800B998000,"ALPHA",,playable,2020-12-13 12:17:45 +010053B0123DC000,"Alphaset by POWGI",,playable,2020-12-15 15:15:15 +01003E700FD66000,"Alt-Frequencies",,playable,2020-12-15 19:01:33 +01004DB00935A000,"Alteric",,playable,2020-11-08 13:53:22 +0100C3D00D1D4000,"Alternate Jake Hunter: DAEDALUS The Awakening of Golden Jazz",,playable,2020-08-31 14:17:42 +0100A8A00D27E000,"Alternate Jake Hunter: DAEDALUS The Awakening of Golden Jazz Trial version",,playable,2021-02-10 13:33:59 +010045201487C000,"Aluna: Sentinel of the Shards",nvdec,playable,2022-10-25 22:17:03 +01004C200B0B4000,"Alwa's Awakening",,playable,2020-10-13 11:52:01 +01001B7012214000,"Alwa's Legacy",,playable,2020-12-13 13:00:57 +010002B00C534000,"American Fugitive",nvdec,playable,2021-01-04 20:45:11 +010089D00A3FA000,"American Ninja Warrior: Challenge",nvdec,playable,2021-06-09 13:11:17 +01003CC00D0BE000,"Amnesia: Collection",,playable,2022-10-04 13:36:15 +010041D00DEB2000,"Amoeba Battle - Microscopic RTS Action",,playable,2021-05-06 13:33:41 +010046500C8D2000,"Among the Sleep - Enhanced Edition",nvdec,playable,2021-06-03 15:06:25 +0100B0C013912000,"Among Us",online;ldn-broken,menus,2021-09-22 15:20:17 +010050900E1C6000,"Anarcute",,playable,2021-02-22 13:17:59 +01009EE0111CC000,"Ancestors Legacy",nvdec;UE4,playable,2022-10-01 12:25:36 +010021700BC56000,"Ancient Rush 2",UE4;crash,menus,2020-07-14 14:58:47 +0100AE000AEBC000,"Angels of Death",nvdec,playable,2021-02-22 14:17:15 +010001E00A5F6000,"AngerForce: Reloaded for Nintendo Switch",,playable,2022-07-21 10:37:17 +0100F3500D05E000,"Angry Bunnies: Colossal Carrot Crusade",online-broken,playable,2022-09-04 14:53:26 +010084500C7DC000,"Angry Video Game Nerd I & II Deluxe",crash,ingame,2020-12-12 23:59:54 +0100706005B6A000,"Anima: Gate of Memories",nvdec,playable,2021-06-16 18:13:18 +010033F00B3FA000,"Anima: Gate of Memories - Arcane Edition",nvdec,playable,2021-01-26 16:55:51 +01007A400B3F8000,"Anima: Gate of Memories - The Nameless Chronicles",,playable,2021-06-14 14:33:06 +0100F38011CFE000,"Animal Crossing: New Horizons Island Transfer Tool",services;Needs Update;Incomplete,ingame,2022-12-07 13:51:19 +01006F8002326000,"Animal Crossing™: New Horizons",gpu;crash;nvdec;online-broken;ldn-works;mac-bug,ingame,2024-09-23 13:31:49 +010019500E642000,"Animal Fight Club",gpu,ingame,2020-12-13 13:13:33 +01002F4011A8E000,"Animal Fun for Toddlers and Kids",services,boots,2020-12-15 16:45:29 +010035500CA0E000,"Animal Hunter Z",,playable,2020-12-13 12:50:35 +010033C0121DC000,"Animal Pairs - Matching & Concentration Game for Toddlers & Kids",services,boots,2021-11-29 23:43:14 +010065B009B3A000,"Animal Rivals: Nintendo Switch Edition",,playable,2021-02-22 14:02:42 +0100EFE009424000,"Animal Super Squad",UE4,playable,2021-04-23 20:50:50 +0100A16010966000,"Animal Up!",,playable,2020-12-13 15:39:02 +010020D01AD24000,"ANIMAL WELL",,playable,2024-05-22 18:01:49 +0100451012492000,"Animals for Toddlers",services,boots,2020-12-15 17:27:27 +010098600CF06000,"Animated Jigsaws Collection",nvdec,playable,2020-12-15 15:58:34 +0100A1900B5B8000,"Animated Jigsaws: Beautiful Japanese Scenery Demo",nvdec,playable,2021-02-10 13:49:56 +010062500EB84000,"Anime Studio Story",,playable,2020-12-15 18:14:05 +01002B300EB86000,"Anime Studio Story Demo",,playable,2021-02-10 14:50:39 +010097600C322000,"ANIMUS",,playable,2020-12-13 15:11:47 +0100E5A00FD38000,"ANIMUS: Harbinger",,playable,2022-09-13 22:09:20 +010055500CCD2000,"Ankh Guardian - Treasure of the Demon's Temple",,playable,2020-12-13 15:55:49 +01009E600D78C000,"Anode",,playable,2020-12-15 17:18:58 +0100CB9018F5A000,"Another Code™: Recollection",gpu;crash,ingame,2024-09-06 05:58:52 +01001A900D312000,"Another Sight",UE4;gpu;nvdec,ingame,2020-12-03 16:49:59 +01003C300AAAE000,"Another World",slow,playable,2022-07-21 10:42:38 +01000FD00DF78000,"AnShi",nvdec;UE4,playable,2022-10-21 19:37:01 +010054C00D842000,"Anthill",services;nvdec,menus,2021-11-18 09:25:25 +0100596011E20000,"Anti Hero Bundle",nvdec,playable,2022-10-21 20:10:30 +0100016007154000,"Antiquia Lost",,playable,2020-05-28 11:57:32 +0100FE1011400000,"AntVentor",nvdec,playable,2020-12-15 20:09:27 +0100FA100620C000,"Ao no Kanata no Four Rhythm",,playable,2022-07-21 10:50:42 +010047000E9AA000,"AO Tennis 2",online-broken,playable,2022-09-17 12:05:07 +0100990011866000,"Aokana - Four Rhythms Across the Blue",,playable,2022-10-04 13:50:26 +01005B100C268000,"Ape Out",,playable,2022-09-26 19:04:47 +010054500E6D4000,"Ape Out DEMO",,playable,2021-02-10 14:33:06 +010051C003A08000,"Aperion Cyberstorm",,playable,2020-12-14 00:40:16 +01008CA00D71C000,"Aperion Cyberstorm [DEMO]",,playable,2021-02-10 15:53:21 +01008FC00C5BC000,"Apocalipsis Wormwood Edition",deadlock,menus,2020-05-27 12:56:37 +010045D009EFC000,"Apocryph: an old-school shooter",gpu,ingame,2020-12-13 23:24:10 +010020D01B890000,"Apollo Justice: Ace Attorney Trilogy",,playable,2024-06-21 21:54:27 +01005F20116A0000,"Apparition",nvdec;slow,ingame,2020-12-13 23:57:04 +0100AC10085CE000,"AQUA KITTY UDX",online,playable,2021-04-12 15:34:11 +0100FE0010886000,"Aqua Lungers",crash,ingame,2020-12-14 11:25:57 +0100D0D00516A000,"Aqua Moto Racing Utopia",,playable,2021-02-21 21:21:00 +010071800BA74000,"Aragami: Shadow Edition",nvdec,playable,2021-02-21 20:33:23 +0100C7D00E6A0000,"Arc of Alchemist",nvdec,playable,2022-10-07 19:15:54 +0100BE80097FA000,"Arcade Archives 10-Yard Fight",online,playable,2021-03-25 21:26:41 +01005DD00BE08000,"Arcade Archives ALPHA MISSION",online,playable,2021-04-15 09:20:43 +010083800DC70000,"Arcade Archives ALPINE SKI",online,playable,2021-04-15 09:28:46 +0100A5700AF32000,"Arcade Archives ARGUS",online,playable,2021-04-16 06:51:25 +010014F001DE2000,"Arcade Archives Armed F",online,playable,2021-04-16 07:00:17 +0100BEC00C7A2000,"Arcade Archives ATHENA",online,playable,2021-04-16 07:10:12 +0100426001DE4000,"Arcade Archives Atomic Robo-Kid",online,playable,2021-04-16 07:20:29 +0100192009824000,"Arcade Archives BOMB JACK",online,playable,2021-04-16 09:48:26 +010007A00980C000,"Arcade Archives City CONNECTION",online,playable,2021-03-25 22:16:15 +0100EDC00E35A000,"Arcade Archives CLU CLU LAND",online,playable,2021-04-16 10:00:42 +0100BB1001DD6000,"Arcade Archives CRAZY CLIMBER",online,playable,2021-03-25 22:24:15 +0100E9E00B052000,"Arcade Archives DONKEY KONG",Needs Update;crash;services,menus,2021-03-24 18:18:43 +0100F25001DD0000,"Arcade Archives DOUBLE DRAGON",online,playable,2021-03-25 22:44:34 +01009E3001DDE000,"Arcade Archives DOUBLE DRAGON II The Revenge",online,playable,2021-04-12 16:05:29 +0100496006EC8000,"Arcade Archives FRONT LINE",online,playable,2021-05-05 14:10:49 +01009A4008A30000,"Arcade Archives HEROIC EPISODE",online,playable,2021-03-25 23:01:26 +01007D200D3FC000,"Arcade Archives ICE CLIMBER",online,playable,2021-05-05 14:18:34 +010049400C7A8000,"Arcade Archives IKARI WARRIORS",online,playable,2021-05-05 14:24:46 +01000DB00980A000,"Arcade Archives Ikki",online,playable,2021-03-25 23:11:28 +010008300C978000,"Arcade Archives IMAGE FIGHT",online,playable,2021-05-05 14:31:21 +010010B008A36000,"Arcade Archives Kid Niki Radical Ninja",audio;online,ingame,2022-07-21 11:02:04 +0100E7C001DE0000,"Arcade Archives Kid's Horehore Daisakusen",online,playable,2021-04-12 16:21:29 +0100F380105A4000,"Arcade Archives LIFE FORCE",,playable,2020-09-04 13:26:25 +0100755004608000,"Arcade Archives Mario Bros.",online,playable,2021-03-26 11:31:32 +01000BE001DD8000,"Arcade Archives MOON CRESTA",online,playable,2021-05-05 14:39:29 +01003000097FE000,"Arcade Archives MOON PATROL",online,playable,2021-03-26 11:42:04 +01003EF00D3B4000,"Arcade Archives NINJA GAIDEN",audio;online,ingame,2021-04-12 16:27:53 +01002F300D2C6000,"Arcade Archives Ninja Spirit",online,playable,2021-05-05 14:45:31 +0100369001DDC000,"Arcade Archives Ninja-Kid",online,playable,2021-03-26 20:55:07 +01004A200BB48000,"Arcade Archives OMEGA FIGHTER",crash;services,menus,2020-08-18 20:50:54 +01007F8010C66000,"Arcade Archives PLUS ALPHA",audio,ingame,2020-07-04 20:47:55 +0100A6E00D3F8000,"Arcade Archives POOYAN",online,playable,2021-05-05 17:58:19 +01000D200C7A4000,"Arcade Archives PSYCHO SOLDIER",online,playable,2021-05-05 18:02:19 +01001530097F8000,"Arcade Archives PUNCH-OUT!!",online,playable,2021-03-25 22:10:55 +010081E001DD2000,"Arcade Archives Renegade",online,playable,2022-07-21 11:45:40 +0100FBA00E35C000,"Arcade Archives ROAD FIGHTER",online,playable,2021-05-05 18:09:17 +010060000BF7C000,"Arcade Archives ROUTE 16",online,playable,2021-05-05 18:40:41 +0100C2D00981E000,"Arcade Archives RYGAR",online,playable,2021-04-15 08:48:30 +01007A4009834000,"Arcade Archives Shusse Ozumo",online,playable,2021-05-05 17:52:25 +010008F00B054000,"Arcade Archives Sky Skipper",online,playable,2021-04-15 08:58:09 +01008C900982E000,"Arcade Archives Solomon's Key",online,playable,2021-04-19 16:27:18 +010069F008A38000,"Arcade Archives STAR FORCE",online,playable,2021-04-15 08:39:09 +0100422001DDA000,"Arcade Archives TERRA CRESTA",crash;services,menus,2020-08-18 20:20:55 +0100348001DE6000,"Arcade Archives TERRA FORCE",online,playable,2021-04-16 20:03:27 +0100DFD016B7A000,"Arcade Archives TETRIS® THE GRAND MASTER",,playable,2024-06-23 01:50:29 +0100DC000983A000,"Arcade Archives THE NINJA WARRIORS",online;slow,ingame,2021-04-16 19:54:56 +0100AF300D2E8000,"Arcade Archives TIME PILOT",online,playable,2021-04-16 19:22:31 +010029D006ED8000,"Arcade Archives Traverse USA",online,playable,2021-04-15 08:11:06 +010042200BE0C000,"Arcade Archives URBAN CHAMPION",online,playable,2021-04-16 10:20:03 +01004EC00E634000,"Arcade Archives VS. GRADIUS",online,playable,2021-04-12 14:53:58 +010021D00812A000,"Arcade Archives VS. SUPER MARIO BROS.",online,playable,2021-04-08 14:48:11 +01001B000D8B6000,"Arcade Archives WILD WESTERN",online,playable,2021-04-16 10:11:36 +010050000D6C4000,"Arcade Classics Anniversary Collection",,playable,2021-06-03 13:55:10 +01005A8010C7E000,"ARCADE FUZZ",,playable,2020-08-15 12:37:36 +010077000F620000,"Arcade Spirits",,playable,2020-06-21 11:45:03 +0100E680149DC000,"Arcaea",,playable,2023-03-16 19:31:21 +01003C2010C78000,"Archaica: The Path Of Light",crash,nothing,2020-10-16 13:22:26 +01004DA012976000,"Area 86",,playable,2020-12-16 16:45:52 +01008d8006a6a000,"Arena of Valor",crash,boots,2025-02-03 22:19:34 +0100691013C46000,"ARIA CHRONICLE",,playable,2022-11-16 13:50:55 +0100D4A00B284000,"ARK: Survival Evolved",gpu;nvdec;online-broken;UE4;ldn-untested,ingame,2024-04-16 00:53:56 +0100C56012C96000,"Arkanoid vs. Space Invaders",services,ingame,2021-01-21 12:50:30 +010069A010606000,"Arkham Horror: Mother's Embrace",nvdec,playable,2021-04-19 15:40:55 +0100C5B0113A0000,"Armed 7 DX",,playable,2020-12-14 11:49:56 +010070A00A5F4000,"Armello",nvdec,playable,2021-01-07 11:43:26 +0100A5400AC86000,"ARMS Demo",,playable,2021-02-10 16:30:13 +01009B500007C000,"ARMS™",ldn-works;LAN,playable,2024-08-28 07:49:24 +0100184011B32000,"Arrest of a stone Buddha",crash,nothing,2022-12-07 16:55:00 +01007AB012102000,"Arrog",,playable,2020-12-16 17:20:50 +01008EC006BE2000,"Art of Balance",gpu;ldn-works,ingame,2022-07-21 17:13:57 +010062F00CAE2000,"Art of Balance DEMO",gpu;slow,ingame,2021-02-10 17:17:12 +01006AA013086000,"Art Sqool",nvdec,playable,2022-10-16 20:42:37 +0100CDD00DA70000,"Artifact Adventure Gaiden DX",,playable,2020-12-16 17:49:25 +0100C2500CAB6000,"Ary and the Secret of Seasons",,playable,2022-10-07 20:45:09 +0100C9F00AAEE000,"ASCENDANCE",,playable,2021-01-05 10:54:40 +0100D5800DECA000,"Asemblance",UE4;gpu,ingame,2020-12-16 18:01:23 +0100E4C00DE30000,"Ash of Gods: Redemption",deadlock,nothing,2020-08-10 18:08:32 +010027B00E40E000,"Ashen",nvdec;online-broken;UE4,playable,2022-09-17 12:19:14 +01007B000C834000,"Asphalt Legends Unite",services;crash;online-broken,menus,2022-12-07 13:28:29 +01007F600B134000,"Assassin's Creed® III: Remastered",nvdec,boots,2024-06-25 20:12:11 +010044700DEB0000,"Assassin’s Creed®: The Rebel Collection",gpu,ingame,2024-05-19 07:58:56 +0100DF200B24C000,"Assault Android Cactus+",,playable,2021-06-03 13:23:55 +0100BF8012A30000,"Assault ChaingunS KM",crash;gpu,ingame,2020-12-14 12:48:34 +0100C5E00E540000,"Assault on Metaltron Demo",,playable,2021-02-10 19:48:06 +010057A00C1F6000,"Astebreed",,playable,2022-07-21 17:33:54 +010081500EA1E000,"Asterix & Obelix XXL 3 - The Crystal Menhir",gpu;nvdec;regression,ingame,2022-11-28 14:19:23 +0100F46011B50000,"Asterix & Obelix XXL: Romastered",gpu;nvdec;opengl,ingame,2023-08-16 21:22:06 +01007300020FA000,"ASTRAL CHAIN",,playable,2024-07-17 18:02:19 +0100E5F00643C000,"Astro Bears Party",,playable,2020-05-28 11:21:58 +0100F0400351C000,"Astro Duel Deluxe",32-bit,playable,2021-06-03 11:21:48 +0100B80010C48000,"Astrologaster",cpu;32-bit;crash,nothing,2023-06-28 15:39:31 +0100DF401249C000,"AstroWings: Space War",,playable,2020-12-14 13:10:44 +010099801870E000,"Atari 50: The Anniversary Celebration",slow,playable,2022-11-14 19:42:10 +010088600C66E000,"Atelier Arland series Deluxe Pack",nvdec,playable,2021-04-08 15:33:15 +0100D9D00EE8C000,"Atelier Ayesha: The Alchemist of Dusk DX",crash;nvdec;Needs Update,menus,2021-11-24 07:29:54 +0100E5600EE8E000,"Atelier Escha & Logy: Alchemists of the Dusk Sky DX",nvdec,playable,2022-11-20 16:01:41 +010023201421E000,"Atelier Firis: The Alchemist and the Mysterious Journey DX",gpu;nvdec,ingame,2022-10-25 22:46:19 +0100B1400CD50000,"Atelier Lulua ~The Scion of Arland~",nvdec,playable,2020-12-16 14:29:19 +010009900947A000,"Atelier Lydie & Suelle ~The Alchemists and the Mysterious Paintings~",nvdec,playable,2021-06-03 18:37:01 +01001A5014220000,"Atelier Lydie & Suelle: The Alchemists and the Mysterious Paintings DX",,playable,2022-10-25 23:06:20 +0100ADD00C6FA000,"Atelier Meruru ~The Apprentice of Arland~ DX",nvdec,playable,2020-06-12 00:50:48 +01002D700B906000,"Atelier Rorona Arland no Renkinjutsushi DX (JP)",nvdec,playable,2022-12-02 17:26:54 +01009A9012022000,"Atelier Ryza 2: Lost Legends & the Secret Fairy",,playable,2022-10-16 21:06:06 +0100D1900EC80000,"Atelier Ryza: Ever Darkness & the Secret Hideout",,playable,2023-10-15 16:36:50 +010005C00EE90000,"Atelier Shallie: Alchemists of the Dusk Sea DX",nvdec,playable,2020-11-25 20:54:12 +010082A01538E000,"Atelier Sophie 2: The Alchemist of the Mysterious Dream",crash,ingame,2022-12-01 04:34:03 +01009BC00C6F6000,"Atelier Totori ~The Adventurer of Arland~ DX",nvdec,playable,2020-06-12 01:04:56 +0100B9400FA38000,"ATOM RPG",nvdec,playable,2022-10-22 10:11:48 +01005FE00EC4E000,"Atomic Heist",,playable,2022-10-16 21:24:32 +0100AD30095A4000,"Atomicrops",,playable,2022-08-06 10:05:07 +01000D1006CEC000,"ATOMIK: RunGunJumpGun",,playable,2020-12-14 13:19:24 +0100FB500631E000,"ATOMINE",gpu;nvdec;slow,playable,2020-12-14 18:56:50 +010039600E7AC000,"Attack of the Toy Tanks",slow,ingame,2020-12-14 12:59:12 +010034500641A000,"Attack on Titan 2",,playable,2021-01-04 11:40:01 +01000F600B01E000,"ATV Drift & Tricks",UE4;online,playable,2021-04-08 17:29:17 +0100AA800DA42000,"Automachef",,playable,2020-12-16 19:51:25 +01006B700EA6A000,"Automachef Demo",,playable,2021-02-10 20:35:37 +0100B280106A0000,"Aviary Attorney: Definitive Edition",,playable,2020-08-09 20:32:12 +010064600F982000,"AVICII Invector",,playable,2020-10-25 12:12:56 +0100E100128BA000,"AVICII Invector Demo",,playable,2021-02-10 21:04:58 +01008FB011248000,"AvoCuddle",,playable,2020-09-02 14:50:13 +0100085012D64000,"Awakening of Cthulhu",UE4,playable,2021-04-26 13:03:07 +01002F1005F3C000,"Away: Journey To The Unexpected",nvdec;vulkan-backend-bug,playable,2022-11-06 15:31:04 +0100B8C00CFCE000,"Awesome Pea",,playable,2020-10-11 12:39:23 +010023800D3F2000,"Awesome Pea (Demo)",,playable,2021-02-10 21:48:21 +0100B7D01147E000,"Awesome Pea 2",,playable,2022-10-01 12:34:19 +0100D2011E28000,"Awesome Pea 2 (Demo)",crash,nothing,2021-02-10 22:08:27 +0100DA3011174000,"AXES",,playable,2021-04-08 13:01:58 +0100052004384000,"Axiom Verge",,playable,2020-10-20 01:07:18 +010075400DEC6000,"Ayakashi Koi Gikyoku《Trial version》",,playable,2021-02-10 22:22:11 +01006AF012FC8000,"Azur Lane: Crosswave",UE4;nvdec,playable,2021-04-05 15:15:25 +0100C7D00DE24000,"Azuran Tales: TRIALS",,playable,2020-08-12 15:23:07 +01006FB00990E000,"Azure Reflections",nvdec;online,playable,2021-04-08 13:18:25 +01004E90149AA000,"Azure Striker GUNVOLT 3",,playable,2022-08-10 13:46:49 +0100192003FA4000,"Azure Striker GUNVOLT: STRIKER PACK",32-bit,playable,2024-02-10 23:51:21 +010031D012BA4000,"Azurebreak Heroes",,playable,2020-12-16 21:26:17 +01009B901145C000,"B.ARK",nvdec,playable,2022-11-17 13:35:02 +01002CD00A51C000,"Baba Is You",,playable,2022-07-17 05:36:54 +0100F4100AF16000,"Back to Bed",nvdec,playable,2020-12-16 20:52:04 +0100FEA014316000,"Backworlds",,playable,2022-10-25 23:20:34 +0100EAF00E32E000,"Bacon Man: An Adventure",crash;nvdec,menus,2021-11-20 02:36:21 +01000CB00D094000,"Bad Dream: Coma",deadlock,boots,2023-08-03 00:54:18 +0100B3B00D81C000,"Bad Dream: Fever",,playable,2021-06-04 18:33:12 +0100E98006F22000,"Bad North",,playable,2022-07-17 13:44:25 +010075000D092000,"Bad North Demo",,playable,2021-02-10 22:48:38 +01004C70086EC000,"BAFL - Brakes Are For Losers",,playable,2021-01-13 08:32:51 +010076B011EC8000,"Baila Latino",,playable,2021-04-14 16:40:24 +0100730011BDC000,"Bakugan: Champions of Vestroia",,playable,2020-11-06 19:07:39 +01008260138C4000,"Bakumatsu Renka SHINSENGUMI",,playable,2022-10-25 23:37:31 +0100438012EC8000,"BALAN WONDERWORLD",nvdec;UE4,playable,2022-10-22 13:08:43 +0100E48013A34000,"Balan Wonderworld Demo",gpu;services;UE4;demo,ingame,2023-02-16 20:05:07 +0100CD801CE5E000,"Balatro",,ingame,2024-04-21 02:01:53 +010010A00DA48000,"Baldur's Gate and Baldur's Gate II: Enhanced Editions",32-bit,playable,2022-09-12 23:52:15 +0100fd1014726000,"Baldur's Gate: Dark Alliance",ldn-untested,ingame,2025-02-03 22:21:00 +0100BC400FB64000,"Balthazar's Dream",,playable,2022-09-13 00:13:22 +01008D30128E0000,"Bamerang",,playable,2022-10-26 00:29:39 +010013C010C5C000,"Banner of the Maid",,playable,2021-06-14 15:23:37 +0100388008758000,"Banner Saga 2",crash,boots,2021-01-13 08:56:09 +010071E00875A000,"Banner Saga 3",slow,boots,2021-01-11 16:53:57 +0100CE800B94A000,"Banner Saga Trilogy",slow,playable,2024-03-06 11:25:20 +0100425009FB2000,"Baobabs Mausoleum Ep.1: Ovnifagos Don't Eat Flamingos",,playable,2020-07-15 05:06:29 +010079300E976000,"Baobabs Mausoleum Ep.2: 1313 Barnabas Dead End Drive",,playable,2020-12-17 11:22:50 +01006D300FFA6000,"Baobabs Mausoleum Ep.3: Un Pato en Muertoburgo",nvdec,playable,2020-12-17 11:43:10 +0100D3000AEC2000,"Baobabs Mausoleum: DEMO",,playable,2021-02-10 22:59:25 +01003350102E2000,"Barbarous: Tavern of Emyr",,playable,2022-10-16 21:50:24 +0100F7E01308C000,"Barbearian",Needs Update;gpu,ingame,2021-06-28 16:27:50 +010039C0106C6000,"Baron: Fur Is Gonna Fly",crash,boots,2022-02-06 02:05:43 +0100FB000EB96000,"Barry Bradford's Putt Panic Party",nvdec,playable,2020-06-17 01:08:34 +01004860080A0000,"Baseball Riot",,playable,2021-06-04 18:07:27 +010038600B27E000,"Bastion",,playable,2022-02-15 14:15:24 +01005F3012748000,"Batbarian: Testament of the Primordials",,playable,2020-12-17 12:00:59 +0100C07018CA6000,"Baten Kaitos I & II HD Remaster (Europe/USA)",services;Needs Update,boots,2023-10-01 00:44:32 +0100F28018CA4000,"Baten Kaitos I & II HD Remaster (Japan)",services;Needs Update,boots,2023-10-24 23:11:54 +0100011005D92000,"Batman - The Telltale Series",nvdec;slow,playable,2021-01-11 18:19:35 +01003F00163CE000,"Batman: Arkham City",,playable,2024-09-11 00:30:19 +0100ACD0163D0000,"Batman: Arkham Knight",gpu;mac-bug,ingame,2024-06-25 20:24:42 +0100E6300AA3A000,"Batman: The Enemy Within",crash,nothing,2020-10-16 05:49:27 +0100747011890000,"Battle Axe",,playable,2022-10-26 00:38:01 +0100551001D88000,"Battle Chasers: Nightwar",nvdec;slow,playable,2021-01-12 12:27:34 +0100CC2001C6C000,"Battle Chef Brigade Deluxe",,playable,2021-01-11 14:16:28 +0100DBB00CAEE000,"Battle Chef Brigade Demo",,playable,2021-02-10 23:15:07 +0100A3B011EDE000,"Battle Hunters",gpu,ingame,2022-11-12 09:19:17 +010035E00C1AE000,"Battle of Kings",slow,playable,2020-12-17 12:45:23 +0100D2800EB40000,"Battle Planet - Judgement Day",,playable,2020-12-17 14:06:20 +0100C4D0093EA000,"Battle Princess Madelyn",,playable,2021-01-11 13:47:23 +0100A7500DF64000,"Battle Princess Madelyn Royal Edition",,playable,2022-09-26 19:14:49 +010099B00E898000,"Battle Supremacy - Evolution",gpu;nvdec,boots,2022-02-17 09:02:50 +0100DEB00D5A8000,"Battle Worlds: Kronos",nvdec,playable,2021-06-04 17:48:02 +0100650010DD4000,"Battleground",crash,ingame,2021-09-06 11:53:23 +010044E00D97C000,"BATTLESLOTHS",,playable,2020-10-03 08:32:22 +010059C00E39C000,"Battlestar Galactica Deadlock",nvdec,playable,2020-06-27 17:35:44 +01006D800A988000,"Battlezone Gold Edition",gpu;ldn-untested;online,boots,2021-06-04 18:36:05 +010048300D5C2000,"BATTLLOON",,playable,2020-12-17 15:48:23 +0100194010422000,"bayala - the game",,playable,2022-10-04 14:09:25 +0100CF5010FEC000,"Bayonetta Origins: Cereza and the Lost Demon™",gpu,ingame,2024-02-27 01:39:49 +010002801A3FA000,"Bayonetta Origins: Cereza and the Lost Demon™ Demo",gpu;demo,ingame,2024-02-17 06:06:28 +010076F0049A2000,"Bayonetta™",audout,playable,2022-11-20 15:51:59 +01007960049A0000,"Bayonetta™ 2",nvdec;ldn-works;LAN,playable,2022-11-26 03:46:09 +01004A4010FEA000,"Bayonetta™ 3",gpu;crash;nvdec;vulkan-backend-bug;opengl-backend-bug;amd-vendor-bug;ASTC,ingame,2024-09-28 14:34:33 +01002FA00DE72000,"BDSM: Big Drunk Satanic Massacre",,playable,2021-03-04 21:28:22 +01003A1010E3C000,"BE-A Walker",slow,ingame,2020-09-02 15:00:31 +010095C00406C000,"Beach Buggy Racing",online,playable,2021-04-13 23:16:50 +010020700DE04000,"Bear With Me: The Lost Robots",nvdec,playable,2021-02-27 14:20:10 +010024200E97E800,"Bear With Me: The Lost Robots Demo",nvdec,playable,2021-02-12 22:38:12 +0100C0E014A4E000,"Bear's Restaurant",,playable,2024-08-11 21:26:59 +010045F00BF64000,"BEAST Darling! ~Kemomimi Danshi to Himitsu no Ryou~",crash,menus,2020-10-04 06:12:08 +01009C300BB4C000,"Beat Cop",,playable,2021-01-06 19:26:48 +01002D20129FC000,"Beat Me!",online-broken,playable,2022-10-16 21:59:26 +01006B0014590000,"BEAUTIFUL DESOLATION",gpu;nvdec,ingame,2022-10-26 10:34:38 +01009E700DB2E000,"Bee Simulator",UE4;crash,boots,2020-07-15 12:13:13 +010018F007786000,"BeeFense BeeMastered",,playable,2022-11-17 15:38:12 +0100558010B26000,"Behold the Kickmen",,playable,2020-06-27 12:49:45 +0100D1300C1EA000,"Beholder: Complete Edition",,playable,2020-10-16 12:48:58 +01006E1004404000,"Ben 10",nvdec,playable,2021-02-26 14:08:35 +01009CD00E3AA000,"Ben 10: Power Trip!",nvdec,playable,2022-10-09 10:52:12 +010074500BBC4000,"Bendy and the Ink Machine",,playable,2023-05-06 20:35:39 +010068600AD16000,"Beyblade Burst Battle Zero",services;crash;Needs Update,menus,2022-11-20 15:48:32 +010056500CAD8000,"Beyond Enemy Lines: Covert Operations",UE4,playable,2022-10-01 13:11:50 +0100B8F00DACA000,"Beyond Enemy Lines: Essentials",nvdec;UE4,playable,2022-09-26 19:48:16 +0100BF400AF38000,"Bibi & Tina – Adventures with Horses",nvdec;slow,playable,2021-01-13 08:58:09 +010062400E69C000,"Bibi & Tina at the horse farm",,playable,2021-04-06 16:31:39 +01005FF00AF36000,"Bibi Blocksberg – Big Broom Race 3",,playable,2021-01-11 19:07:16 +010062B00A874000,"Big Buck Hunter Arcade",nvdec,playable,2021-01-12 20:31:39 +010088100C35E000,"Big Crown: Showdown",nvdec;online;ldn-untested,menus,2022-07-17 18:25:32 +0100A42011B28000,"Big Dipper",,playable,2021-06-14 15:08:19 +010077E00F30E000,"Big Pharma",,playable,2020-07-14 15:27:30 +010007401287E000,"BIG-Bobby-Car - The Big Race",slow,playable,2020-12-10 14:25:06 +010057700FF7C000,"Billion Road",,playable,2022-11-19 15:57:43 +010087D008D64000,"BINGO for Nintendo Switch",,playable,2020-07-23 16:17:36 +01004BA017CD6000,"Biomutant",crash,ingame,2024-05-16 15:46:36 +01002620102C6000,"BioShock 2 Remastered",services,nothing,2022-10-29 14:39:22 +0100D560102C8000,"BioShock Infinite: The Complete Edition",services-horizon;crash,nothing,2024-08-11 21:35:01 +0100AD10102B2000,"BioShock Remastered",services-horizon;crash;Needs Update,boots,2024-06-06 01:08:52 +010053B0117F8000,"Biped",nvdec,playable,2022-10-01 13:32:58 +01001B700B278000,"Bird Game +",online,playable,2022-07-17 18:41:57 +0100B6B012FF4000,"Birds and Blocks Demo",services;demo,boots,2022-04-10 04:53:03 +0100E62012D3C000,"BIT.TRIP RUNNER",,playable,2022-10-17 14:23:24 +01000AD012D3A000,"BIT.TRIP VOID",,playable,2022-10-17 14:31:23 +0100A0800EA9C000,"Bite the Bullet",,playable,2020-10-14 23:10:11 +010026E0141C8000,"Bitmaster",,playable,2022-12-13 14:05:51 +010061D00FD26000,"Biz Builder Delux",slow,playable,2020-12-15 21:36:25 +0100DD1014AB8000,"Black Book",nvdec,playable,2022-12-13 16:38:53 +010049000B69E000,"Black Future '88",nvdec,playable,2022-09-13 11:24:37 +01004BE00A682000,"Black Hole Demo",,playable,2021-02-12 23:02:17 +0100C3200E7E6000,"Black Legend",gpu;UE4;vulkan-backend-bug;opengl-backend-bug,ingame,2022-10-22 12:54:48 +010043A012A32000,"Blackjack Hands",,playable,2020-11-30 14:04:51 +0100A0A00E660000,"Blackmoor 2",online-broken,playable,2022-09-26 20:26:34 +010032000EA2C000,"Blacksad: Under the Skin",,playable,2022-09-13 11:38:04 +01006B400C178000,"Blacksea Odyssey",nvdec,playable,2022-10-16 22:14:34 +010068E013450000,"Blacksmith of the Sand Kingdom",,playable,2022-10-16 22:37:44 +0100C4400CB7C000,"BLADE ARCUS Rebellion From Shining",,playable,2022-07-17 18:52:28 +0100EA1018A2E000,"Blade Assault",audio,nothing,2024-04-29 14:32:50 +01009CC00E224000,"Blade II - The Return Of Evil",audio;crash;UE4,ingame,2021-11-14 02:49:59 +01005950022EC000,"Blade Strangers",nvdec,playable,2022-07-17 19:02:43 +0100DF0011A6A000,"Bladed Fury",,playable,2022-10-26 11:36:26 +0100CFA00CC74000,"Blades of Time",deadlock;online,boots,2022-07-17 19:19:58 +01003d700dd8a000,"Blades",,boots,2025-02-03 22:22:00 +01006CC01182C000,"Blair Witch",nvdec;UE4,playable,2022-10-01 14:06:16 +010039501405E000,"Blanc",gpu;slow,ingame,2023-02-22 14:00:13 +0100698009C6E000,"Blasphemous",nvdec,playable,2021-03-01 12:15:31 +0100302010338000,"Blasphemous Demo",,playable,2021-02-12 23:49:56 +0100225000FEE000,"Blaster Master Zero",32-bit,playable,2021-03-05 13:22:33 +01005AA00D676000,"Blaster Master Zero 2",,playable,2021-04-08 15:22:59 +010025B002E92000,"Blaster Master Zero Demo",,playable,2021-02-12 23:59:06 +0100E53013E1C000,"Blastoid Breakout",,playable,2021-01-25 23:28:02 +0100EE800C93E000,"BLAZBLUE CENTRALFICTION Special Edition",nvdec,playable,2020-12-15 23:50:04 +0100B61008208000,"BLAZBLUE CROSS TAG BATTLE",nvdec;online,playable,2021-01-05 20:29:37 +010021A00DE54000,"Blazing Beaks",,playable,2020-06-04 20:37:06 +0100C2700C252000,"Blazing Chrome",,playable,2020-11-16 04:56:54 +010091700EA2A000,"Bleep Bloop DEMO",nvdec,playable,2021-02-13 00:20:53 +010089D011310000,"Blind Men",audout,playable,2021-02-20 14:15:38 +0100743013D56000,"Blizzard® Arcade Collection",nvdec,playable,2022-08-03 19:37:26 +0100F3500A20C000,"BlobCat",,playable,2021-04-23 17:09:30 +0100E1C00DB6C000,"Block-a-Pix Deluxe Demo",,playable,2021-02-13 00:37:39 +0100C6A01AD56000,"Bloo Kid",,playable,2024-05-01 17:18:04 +010055900FADA000,"Bloo Kid 2",,playable,2024-05-01 17:16:57 +0100EE5011DB6000,"Blood and Guts Bundle",,playable,2020-06-27 12:57:35 +01007E700D17E000,"Blood Waves",gpu,ingame,2022-07-18 13:04:46 +0100E060102AA000,"Blood will be Spilled",nvdec,playable,2020-12-17 03:02:03 +01004B800AF5A000,"Bloodstained: Curse of the Moon",,playable,2020-09-04 10:42:17 +01004680124E6000,"Bloodstained: Curse of the Moon 2",,playable,2020-09-04 10:56:27 +010025A00DF2A000,"Bloodstained: Ritual of the Night",nvdec;UE4,playable,2022-07-18 14:27:35 +0100E510143EC000,"Bloody Bunny, The Game",nvdec;UE4,playable,2022-10-22 13:18:55 +0100B8400A1C6000,"Bloons TD 5",Needs Update;audio;gpu;services,boots,2021-04-18 23:02:46 +01000EB01023E000,"Blossom Tales Demo",,playable,2021-02-13 14:22:53 +0100C1000706C000,"Blossom Tales: The Sleeping King",,playable,2022-07-18 16:43:07 +010073B010F6E000,"Blue Fire",UE4,playable,2022-10-22 14:46:11 +0100721013510000,"Body of Evidence",,playable,2021-04-25 22:22:11 +0100AD1010CCE000,"Bohemian Killing",vulkan-backend-bug,playable,2022-09-26 22:41:37 +010093700ECEC000,"Boku to Nurse no Kenshuu Nisshi",,playable,2022-11-21 20:38:34 +01001D900D9AC000,"Bokujou Monogatari Saikai no Mineraru Taun (Story of Seasons: Friends of Mineral Town)",slow;crash;Needs Update,ingame,2022-04-24 22:46:04 +0100317014B7C000,"Bomb Rush Cyberfunk",,playable,2023-09-28 19:51:57 +01007900080B6000,"Bomber Crew",,playable,2021-06-03 14:21:28 +0100A1F012948000,"Bomber Fox",nvdec,playable,2021-04-19 17:58:13 +010087300445A000,"Bombslinger",services,menus,2022-07-19 12:53:15 +01007A200F452000,"Book of Demons",,playable,2022-09-29 12:03:43 +010054500F564000,"Bookbound Brigade",,playable,2020-10-09 14:30:29 +01002E6013ED8000,"Boom Blaster",,playable,2021-03-24 10:55:56 +010081A00EE62000,"Boomerang Fu",,playable,2024-07-28 01:12:41 +010069F0135C4000,"Boomerang Fu Demo Version",demo,playable,2021-02-13 14:38:13 +01009970122E4000,"Borderlands 3 Ultimate Edition",gpu,ingame,2024-07-15 04:38:14 +010064800F66A000,"Borderlands: Game of the Year Edition",slow;online-broken;ldn-untested,ingame,2023-07-23 21:10:36 +010096F00FF22000,"Borderlands: The Handsome Collection",,playable,2022-04-22 18:35:07 +010007400FF24000,"Borderlands: The Pre-Sequel",nvdec,playable,2021-06-09 20:17:10 +01008E500AFF6000,"Boreal Blade",gpu;ldn-untested;online,ingame,2021-06-11 15:37:14 +010092C013FB8000,"BORIS THE ROCKET",,playable,2022-10-26 13:23:09 +010076F00EBE4000,"BOSSGARD",online-broken,playable,2022-10-04 14:21:13 +010069B00EAC8000,"Bot Vice Demo",crash;demo,ingame,2021-02-13 14:52:42 +010081100FE08000,"Bouncy Bob 2",,playable,2020-07-14 16:51:53 +0100E1200DC1A000,"Bounty Battle",nvdec,playable,2022-10-04 14:40:51 +0100B4700C57E000,"Bow to Blood: Last Captain Standing",slow,playable,2020-10-23 10:51:21 +010040800BA8A000,"Box Align",crash;services,nothing,2020-04-03 17:26:56 +010018300D006000,"BOXBOY! + BOXGIRL!™",,playable,2020-11-08 01:11:54 +0100B7200E02E000,"BOXBOY! + BOXGIRL!™ Demo",demo,playable,2021-02-13 14:59:08 +0100CA400B6D0000,"BQM -BlockQuest Maker-",online,playable,2020-07-31 20:56:50 +0100E87017D0E000,"Bramble: The Mountain King",services-horizon,playable,2024-03-06 09:32:17 +01000F5003068000,"Brave Dungeon + Dark Witch Story:COMBAT",,playable,2021-01-12 21:06:34 +01006DC010326000,"BRAVELY DEFAULT™ II",gpu;crash;Needs Update;UE4,ingame,2024-04-26 06:11:26 +0100B6801137E000,"Bravely Default™ II Demo",gpu;crash;UE4;demo,ingame,2022-09-27 05:39:47 +010081501371E000,"BraveMatch",UE4,playable,2022-10-26 13:32:15 +0100F60017D4E000,"Bravery and Greed",gpu;deadlock,boots,2022-12-04 02:23:47 +0100A42004718000,"BRAWL",nvdec;slow,playable,2020-06-04 14:23:18 +010068F00F444000,"Brawl Chess",nvdec,playable,2022-10-26 13:59:17 +0100C6800B934000,"Brawlhalla",online;opengl,playable,2021-06-03 18:26:09 +010060200A4BE000,"Brawlout",ldn-untested;online,playable,2021-06-04 17:35:35 +0100C1B00E1CA000,"Brawlout Demo",demo,playable,2021-02-13 22:46:53 +010022C016DC8000,"Breakout: Recharged",slow,ingame,2022-11-06 15:32:57 +010048A021C40000,"Breakout Beyond",,playable,2025-04-26 19:11:35 +01000AA013A5E000,"Breathedge",UE4;nvdec,playable,2021-05-06 15:44:28 +01003D50100F4000,"Breathing Fear",,playable,2020-07-14 15:12:29 +010026800BB06000,"Brick Breaker",nvdec;online,playable,2020-12-15 18:26:23 +01002AD0126AE000,"Bridge Constructor: The Walking Dead",gpu;slow,ingame,2020-12-11 17:31:32 +01000B1010D8E000,"Bridge! 3",,playable,2020-10-08 20:47:24 +010011000EA7A000,"BRIGANDINE The Legend of Runersia",,playable,2021-06-20 06:52:25 +0100703011258000,"BRIGANDINE The Legend of Runersia Demo",,playable,2021-02-14 14:44:10 +01000BF00BE40000,"Bring Them Home",UE4,playable,2021-04-12 14:14:43 +010060A00B53C000,"Broforce",ldn-untested;online,playable,2021-05-28 12:23:38 +0100EDD0068A6000,"Broken Age",,playable,2021-06-04 17:40:32 +0100A5800F6AC000,"Broken Lines",,playable,2020-10-16 00:01:37 +01001E60085E6000,"Broken Sword 5 - the Serpent's Curse",,playable,2021-06-04 17:28:59 +0100F19011226000,"Brotherhood United Demo",demo,playable,2021-02-14 21:10:57 +01000D500D08A000,"Brothers: A Tale of Two Sons",nvdec;UE4,playable,2022-07-19 14:02:22 +0100B2700E90E000,"Brunch Club",,playable,2020-06-24 13:54:07 +010010900F7B4000,"Bubble Bobble 4 Friends: The Baron is Back!",nvdec,playable,2021-06-04 15:27:55 +0100DBE00C554000,"Bubsy: Paws on Fire!",slow,ingame,2023-08-24 02:44:51 +0100089010A92000,"Bucket Knight",crash,ingame,2020-09-04 13:11:24 +0100F1B010A90000,"Bucket Knight demo",demo,playable,2021-02-14 21:23:09 +01000D200AC0C000,"Bud Spencer & Terence Hill - Slaps And Beans",,playable,2022-07-17 12:37:00 +010051A00E99E000,"Bug Fables: The Everlasting Sapling",,playable,2020-06-09 11:27:00 +01003DD00D658000,"Bulletstorm: Duke of Switch Edition",nvdec,playable,2022-03-03 08:30:24 +01006BB00E8FA000,"BurgerTime Party!",slow,playable,2020-11-21 14:11:53 +01005780106E8000,"BurgerTime Party! Demo",demo,playable,2021-02-14 21:34:16 +010078C00DB40000,"Buried Stars",,playable,2020-09-07 14:11:58 +0100DBF01000A000,"Burnout™ Paradise Remastered",nvdec;online,playable,2021-06-13 02:54:46 +010066F00C76A000,"Bury me, my Love",,playable,2020-11-07 12:47:37 +010030D012FF6000,"Bus Driver Simulator",,playable,2022-10-17 13:55:27 +0100A9101418C000,"BUSTAFELLOWS",nvdec,playable,2020-10-17 20:04:41 +0100177005C8A000,"BUTCHER",,playable,2021-01-11 18:50:17 +01008c2019598000,"Bluey: The Videogame",,playable,2025-02-11 04:38:00 +01000B900D8B0000,"Cadence of Hyrule: Crypt of the NecroDancer Featuring The Legend of Zelda",slow;nvdec,playable,2024-04-01 22:43:40 +010065700EE06000,"Cadence of Hyrule: Crypt of the NecroDancer Featuring The Legend of Zelda Demo",demo;gpu;nvdec,ingame,2021-02-14 21:48:15 +01005C00117A8000,"Café Enchanté",,playable,2020-11-13 14:54:25 +010060400D21C000,"Cafeteria Nipponica Demo",demo,playable,2021-02-14 22:11:35 +0100699012F82000,"Cake Bash Demo",crash;demo,ingame,2021-02-14 22:21:15 +01004FD00D66A000,"Caladrius Blaze",deadlock;nvdec,nothing,2022-12-07 16:44:37 +01004B500AB88000,"Calculation Castle : Greco's Ghostly Challenge Addition",32-bit,playable,2020-11-01 23:40:11 +010045500B212000,"Calculation Castle : Greco's Ghostly Challenge Division",32-bit,playable,2020-11-01 23:54:55 +0100ECE00B210000,"Calculation Castle : Greco's Ghostly Challenge Multiplication",32-bit,playable,2020-11-02 00:04:33 +0100A6500B176000,"Calculation Castle : Greco's Ghostly Challenge Subtraction",32-bit,playable,2020-11-01 23:47:42 +010004701504A000,"Calculator",,playable,2021-06-11 13:27:20 +010013A00E750000,"Calico",,playable,2022-10-17 14:44:28 +010046000EE40000,"Call of Cthulhu",nvdec;UE4,playable,2022-12-18 03:08:30 +0100B4700BFC6000,"Call of Juarez: Gunslinger",gpu;nvdec,ingame,2022-09-17 16:49:46 +0100593008BDC000,"Can't Drive This",,playable,2022-10-22 14:55:17 +0100E4600B166000,"Candle: The Power of the Flame",nvdec,playable,2020-05-26 12:10:20 +01001E0013208000,"Capcom Arcade Stadium",,playable,2021-03-17 05:45:14 +010094E00B52E000,"Capcom Beat 'Em Up Bundle",,playable,2020-03-23 18:31:24 +0100F6400A77E000,"CAPCOM BELT ACTION COLLECTION",online;ldn-untested,playable,2022-07-21 20:51:23 +01009BF0072D4000,"Captain Toad™: Treasure Tracker",32-bit,playable,2024-04-25 00:50:16 +01002C400B6B6000,"Captain Toad™: Treasure Tracker Demo",32-bit;demo,playable,2021-02-14 22:36:09 +0100EAE010560000,"Captain Tsubasa: Rise of New Champions",online-broken;vulkan-backend-bug,playable,2022-10-09 11:20:50 +01002320137CC000,"CAPTAIN TSUBASA: RISE OF NEW CHAMPIONS DEMO VERSION",slow,playable,2021-02-14 22:45:35 +010048800D95C000,"Car Mechanic Manager",,playable,2020-07-23 18:50:17 +01007BD00AE70000,"Car Quest",deadlock,menus,2021-11-18 08:59:18 +0100DA70115E6000,"Caretaker",,playable,2022-10-04 14:52:24 +0100DD6014870000,"Cargo Crew Driver",,playable,2021-04-19 12:54:22 +010088C0092FE000,"Carnival Games®",nvdec,playable,2022-07-21 21:01:22 +01005F5011AC4000,"Carnivores: Dinosaur Hunt",,playable,2022-12-14 18:46:06 +0100B1600E9AE000,"CARRION",crash,nothing,2020-08-13 17:15:12 +01008D1001512000,"Cars 3: Driven to Win",gpu,ingame,2022-07-21 21:21:05 +0100810012A1A000,"Carto",,playable,2022-09-04 15:37:06 +0100085003A2A000,"Cartoon Network Battle Crashers",,playable,2022-07-21 21:55:40 +0100C4C0132F8000,"CASE 2: Animatronics Survival",nvdec;UE4;vulkan-backend-bug,playable,2022-10-09 11:45:03 +010066F01A0E0000,"Cassette Beasts",,playable,2024-07-22 20:38:43 +010001300D14A000,"Castle Crashers Remastered",gpu,boots,2024-08-10 09:21:20 +0100F6D01060E000,"Castle Crashers Remastered Demo",gpu;demo,boots,2022-04-10 10:57:10 +01003C100445C000,"Castle of Heart",nvdec,playable,2022-07-21 23:10:45 +0100F5500FA0E000,"Castle of no Escape 2",,playable,2022-09-13 13:51:42 +0100DA2011F18000,"Castle Pals",,playable,2021-03-04 21:00:33 +010097C00AB66000,"CastleStorm",nvdec,playable,2022-07-21 22:49:14 +010007400EB64000,"CastleStorm II",UE4;crash;nvdec,boots,2020-10-25 11:22:44 +01001A800D6BC000,"Castlevania Anniversary Collection",audio,playable,2020-05-23 11:40:29 +010076000C86E000,"Cat Girl Without Salad: Amuse-Bouche",,playable,2022-09-03 13:01:47 +0100A2F006FBE000,"Cat Quest",,playable,2020-04-02 23:09:32 +01008BE00E968000,"Cat Quest II",,playable,2020-07-06 23:52:09 +0100E86010220000,"Cat Quest II Demo",demo,playable,2021-02-15 14:11:57 +0100BAE0077E4000,"Catherine Full Body for Nintendo Switch (JP)",Needs Update;gpu,ingame,2021-02-21 18:06:11 +0100BF00112C0000,"Catherine: Full Body",nvdec,playable,2023-04-02 11:00:37 +010004400B28A000,"Cattails",,playable,2021-06-03 14:36:57 +0100B7D0022EE000,"Cave Story+",,playable,2020-05-22 09:57:25 +01001A100C0E8000,"Caveblazers",slow,ingame,2021-06-09 17:57:28 +01006DB004566000,"Caveman Warriors",,playable,2020-05-22 11:44:20 +010078700B2CC000,"Caveman Warriors Demo",demo,playable,2021-02-15 14:44:08 +01002B30028F6000,"Celeste",,playable,2020-06-17 10:14:40 +01006B000A666000,"Cendrillon palikA",gpu;nvdec,ingame,2022-07-21 22:52:24 +01007600115CE000,"CHAOS CODE -NEW SIGN OF CATASTROPHE-",crash;nvdec,boots,2022-04-04 12:24:21 +0100957016B90000,"CHAOS;HEAD NOAH",,playable,2022-06-02 22:57:19 +0100F52013A66000,"Charge Kid",gpu;audout,boots,2024-02-11 01:17:47 +0100DE200C350000,"Chasm",,playable,2020-10-23 11:03:43 +010034301A556000,"Chasm: The Rift",gpu,ingame,2024-04-29 19:02:48 +0100A5900472E000,"Chess Ultra",UE4,playable,2023-08-30 23:06:31 +0100E3C00A118000,"Chicken Assassin: Reloaded",,playable,2021-02-20 13:29:01 +0100713010E7A000,"Chicken Police – Paint it RED!",nvdec,playable,2020-12-10 15:10:11 +0100F6C00A016000,"Chicken Range",,playable,2021-04-23 12:14:23 +01002E500E3EE000,"Chicken Rider",,playable,2020-05-22 11:31:17 +0100CAC011C3A000,"Chickens Madness DEMO",UE4;demo;gpu;nvdec,ingame,2021-02-15 15:02:10 +01007D000AD8A000,"Child of Light® Ultimate Edition",nvdec,playable,2020-12-16 10:23:10 +01002DE00C250000,"Children of Morta",gpu;nvdec,ingame,2022-09-13 17:48:47 +0100C1A00AC3E000,"Children of Zodiarcs",,playable,2020-10-04 14:23:33 +010046F012A04000,"Chinese Parents",,playable,2021-04-08 12:56:41 +01005A001489A000,"Chiptune Arrange Sound(DoDonPachi Resurrection)",32-bit;crash,ingame,2024-01-25 14:37:32 +01006A30124CA000,"Chocobo GP",gpu;crash,ingame,2022-06-04 14:52:18 +0100BF600BF26000,"Chocobo's Mystery Dungeon EVERY BUDDY!",slow,playable,2020-05-26 13:53:13 +01000BA0132EA000,"Choices That Matter: And The Sun Went Out",,playable,2020-12-17 15:44:08 +0100A1200CA3C000,"Chou no Doku Hana no Kusari: Taishou Irokoi Ibun",gpu;nvdec,ingame,2020-09-28 17:58:04 +010039A008E76000,"ChromaGun",,playable,2020-05-26 12:56:42 +010006800E13A000,"Chronos: Before the Ashes",UE4;gpu;nvdec,ingame,2020-12-11 22:16:35 +010039700BA7E000,"Circle of Sumo",,playable,2020-05-22 12:45:21 +01008FA00D686000,"Circuits",,playable,2022-09-19 11:52:50 +0100D8800B87C000,"Cities: Skylines - Nintendo Switch™ Edition",,playable,2020-12-16 10:34:57 +0100E4200D84E000,"Citizens of Space",gpu,boots,2023-10-22 06:45:44 +0100D9C012900000,"Citizens Unite!: Earth x Space",gpu,ingame,2023-10-22 06:44:19 +01005E501284E000,"City Bus Driving Simulator",,playable,2021-06-15 21:25:59 +0100A3A00CC7E000,"CLANNAD",,playable,2021-06-03 17:01:02 +01007B501372C000,"CLANNAD Side Stories",,playable,2022-10-26 15:03:04 +01005ED0107F4000,"Clash Force",,playable,2022-10-01 23:45:48 +010009300AA6C000,"Claybook",slow;nvdec;online;UE4,playable,2022-07-22 11:11:34 +010058900F52E000,"Clea",crash,ingame,2020-12-15 16:22:56 +010045E0142A4000,"Clea 2",,playable,2021-04-18 14:25:18 +01008C100C572000,"Clock Zero ~Shuuen no Ichibyou~ Devote",nvdec,playable,2022-12-04 22:19:14 +0100DF9013AD4000,"Clocker",,playable,2021-04-05 15:05:13 +0100B7200DAC6000,"Close to the Sun",crash;nvdec;UE4,boots,2021-11-04 09:19:41 +010047700D540000,"Clubhouse Games™: 51 Worldwide Classics",ldn-works,playable,2024-05-21 16:12:57 +0100C1401CEDC000,"Clue",crash;online,menus,2020-11-10 09:23:48 +010085A00821A000,"ClusterPuck 99",,playable,2021-01-06 00:28:12 +010096900A4D2000,"Clustertruck",slow,ingame,2021-02-19 21:07:09 +01005790110F0000,"Cobra Kai: The Karate Kid Saga Continues",,playable,2021-06-17 15:59:13 +01002E700C366000,"COCOON",gpu,ingame,2024-03-06 11:33:08 +010034E005C9C000,"Code of Princess EX",nvdec;online,playable,2021-06-03 10:50:13 +010086100CDCA000,"CODE SHIFTER",,playable,2020-08-09 15:20:55 +010002400F408000,"Code: Realize ~Future Blessings~",nvdec,playable,2023-03-31 16:57:47 +0100CF800C810000,"Coffee Crisis",,playable,2021-02-20 12:34:52 +010066200E1E6000,"Coffee Talk",,playable,2020-08-10 09:48:44 +0100178009648000,"Coffin Dodgers",,playable,2021-02-20 14:57:41 +010035B01706E000,"Cold Silence",cpu;crash,nothing,2024-07-11 17:06:14 +010083E00F40E000,"Collar X Malice",nvdec,playable,2022-10-02 11:51:56 +0100E3B00F412000,"Collar X Malice -Unlimited-",nvdec,playable,2022-10-04 15:30:40 +01002A600D7FC000,"Collection of Mana",,playable,2020-10-19 19:29:45 +0100B77012266000,"COLLECTION of SaGa FINAL FANTASY LEGEND",,playable,2020-12-30 19:11:16 +010030800BC36000,"Collidalot",nvdec,playable,2022-09-13 14:09:27 +0100CA100C0BA000,"Color Zen",,playable,2020-05-22 10:56:17 +010039B011312000,"Colorgrid",,playable,2020-10-04 01:50:52 +0100A7000BD28000,"Coloring Book",,playable,2022-07-22 11:17:05 +010020500BD86000,"Colors Live",gpu;services;crash,boots,2023-02-26 02:51:07 +0100E2F0128B4000,"Colossus Down",,playable,2021-02-04 20:49:50 +0100C4D00D16A000,"Commander Keen in Keen Dreams",gpu,ingame,2022-08-04 20:34:20 +0100E400129EC000,"Commander Keen in Keen Dreams: Definitive Edition",,playable,2021-05-11 19:33:54 +010065A01158E000,"Commandos 2 - HD Remaster",gpu;nvdec,ingame,2022-08-10 21:52:27 +010015801308E000,"Conarium",UE4;nvdec,playable,2021-04-26 17:57:53 +0100971011224000,"Concept Destruction",,playable,2022-09-29 12:28:56 +010043700C9B0000,"Conduct TOGETHER!",nvdec,playable,2021-02-20 12:59:00 +01007EF00399C000,"Conga Master Party!",,playable,2020-05-22 13:22:24 +0100A5600FAC0000,"Construction Simulator 3 - Console Edition",,playable,2023-02-06 09:31:23 +0100A330022C2000,"Constructor Plus",,playable,2020-05-26 12:37:40 +0100DCA00DA7E000,"Contra Anniversary Collection",,playable,2022-07-22 11:30:12 +0100F2600D710000,"CONTRA: ROGUE CORPS",crash;nvdec;regression,menus,2021-01-07 13:23:35 +0100B8200ECA6000,"CONTRA: ROGUE CORPS Demo",gpu,ingame,2022-09-04 16:46:52 +01007D701298A000,"Contraptions",,playable,2021-02-08 18:40:50 +0100041013360000,"Control Ultimate Edition - Cloud Version",Needs Update;crash;services,nothing,2021-04-18 22:34:06 +010058800E90A000,"Convoy: A Tactical Roguelike",,playable,2020-10-15 14:43:50 +0100B82010B6C000,"Cook, Serve, Delicious! 3?!",,playable,2022-10-09 12:09:34 +010060700EFBA000,"Cooking Mama: Cookstar",crash;loader-allocator,menus,2021-11-20 03:19:35 +01001E400FD58000,"Cooking Simulator",,playable,2021-04-18 13:25:23 +0100DF9010206000,"Cooking Tycoons - 3 in 1 Bundle",,playable,2020-11-16 22:44:26 +01005350126E0000,"Cooking Tycoons 2 - 3 in 1 Bundle",,playable,2020-11-16 22:19:33 +0100C5A0115C4000,"CopperBell",,playable,2020-10-04 15:54:36 +010016400B1FE000,"Corpse Party: Blood Drive",nvdec,playable,2021-03-01 12:44:23 +0100CCB01B1A0000,"COSMIC FANTASY COLLECTION",,ingame,2024-05-21 17:56:37 +010067C00A776000,"Cosmic Star Heroine",,playable,2021-02-20 14:30:47 +01003DD00F94A000,"COTTOn Reboot! [ コットン リブート! ]",,playable,2022-05-24 16:29:24 +010077001526E000,"Cotton/Guardian Saturn Tribute Games",gpu,boots,2022-11-27 21:00:51 +01000E301107A000,"Couch Co-Op Bundle Vol. 2",nvdec,playable,2022-10-02 12:04:21 +0100C1E012A42000,"Country Tales",,playable,2021-06-17 16:45:39 +01003370136EA000,"Cozy Grove",gpu,ingame,2023-07-30 22:22:19 +010073401175E000,"Crash Bandicoot™ 4: It’s About Time",nvdec;UE4,playable,2024-03-17 07:13:45 +0100D1B006744000,"Crash Bandicoot™ N. Sane Trilogy",,playable,2024-02-11 11:38:14 +010007900FCE2000,"Crash Drive 2",online,playable,2020-12-17 02:45:46 +010046600BD0E000,"Crash Dummy",nvdec,playable,2020-05-23 11:12:43 +0100BF200CD74000,"Crashbots",,playable,2022-07-22 13:50:52 +010027100BD16000,"Crashlands",,playable,2021-05-27 20:30:06 +0100F9F00C696000,"Crash™ Team Racing Nitro-Fueled",gpu;nvdec;online-broken,ingame,2023-06-25 02:40:17 +0100BF7006BCA000,"Crawl",,playable,2020-05-22 10:16:05 +0100C66007E96000,"Crayola Scoot",nvdec,playable,2022-07-22 14:01:55 +01005BA00F486000,"Crayon Shin-chan Ora to Hakase no Natsuyasumi Owaranai Nanokakan no Tabi",,playable,2021-07-21 10:41:33 +0100D470106DC000,"CRAYON SHINCHAN The Storm Called FLAMING KASUKABE RUNNER!!",services,menus,2020-03-20 14:00:57 +01006BC00C27A000,"Crazy Strike Bowling EX",UE4;gpu;nvdec,ingame,2020-08-07 18:15:59 +0100F9900D8C8000,"Crazy Zen Mini Golf",,playable,2020-08-05 14:00:00 +0100B0E010CF8000,"Creaks",,playable,2020-08-15 12:20:52 +01007C600D778000,"Creature in the Well",UE4;gpu,ingame,2020-11-16 12:52:40 +0100A19011EEE000,"Creepy Tale",,playable,2020-12-15 21:58:03 +01005C2013B00000,"Cresteaju",gpu,ingame,2021-03-24 10:46:06 +010022D00D4F0000,"Cricket 19",gpu,ingame,2021-06-14 14:56:07 +0100387017100000,"Cricket 22 The Official Game Of The Ashes",crash,boots,2023-10-18 08:01:57 +01005640080B0000,"Crimsonland",,playable,2021-05-27 20:50:54 +0100B0400EBC4000,"Cris Tales",crash,ingame,2021-07-29 15:10:53 +01004BC0166CC000,"CRISIS CORE –FINAL FANTASY VII– REUNION",,playable,2022-12-19 15:53:59 +01004F800C4DA000,"Croc's World",,playable,2020-05-22 11:21:09 +01009DB00DE12000,"Croc's World 2",,playable,2020-12-16 20:01:40 +010025200FC54000,"Croc's World 3",,playable,2020-12-30 18:53:26 +01000F0007D92000,"Croixleur Sigma",online,playable,2022-07-22 14:26:54 +01003D90058FC000,"CrossCode",,playable,2024-02-17 10:23:19 +0100B1E00AA56000,"Crossing Souls",nvdec,playable,2021-02-20 15:42:54 +0100059012BAE000,"Crown Trick",,playable,2021-06-16 19:36:29 +0100B41013C82000,"Cruis'n Blast",gpu,ingame,2023-07-30 10:33:47 +01000CC01C108000,"Crymachina Trial Edition ( Demo ) [ クライマキナ ]",demo,playable,2023-08-06 05:33:21 +0100CEA007D08000,"Crypt of the NecroDancer: Nintendo Switch Edition",nvdec,playable,2022-11-01 09:52:06 +0100582010AE0000,"Crysis 2 Remastered",deadlock,menus,2023-09-21 10:46:17 +0100CD3010AE2000,"Crysis 3 Remastered",deadlock,menus,2023-09-10 16:03:50 +0100E66010ADE000,"Crysis Remastered",nvdec,menus,2024-08-13 05:23:24 +0100972008234000,"Crystal Crisis",nvdec,playable,2021-02-20 13:52:44 +01006FA012FE0000,"Cthulhu Saves Christmas",,playable,2020-12-14 00:58:55 +010001600D1E8000,"Cube Creator X",crash,menus,2021-11-25 08:53:28 +010082E00F1CE000,"Cubers: Arena",nvdec;UE4,playable,2022-10-04 16:05:40 +010040D011D04000,"Cubicity",,playable,2021-06-14 14:19:51 +0100A5C00D162000,"Cuphead",,playable,2022-02-01 22:45:55 +0100F7E00DFC8000,"Cupid Parasite",gpu,ingame,2023-08-21 05:52:36 +010054501075C000,"Curious Cases",,playable,2020-08-10 09:30:48 +0100D4A0118EA000,"Curse of the Dead Gods",,playable,2022-08-30 12:25:38 +0100CE5014026000,"Curved Space",,playable,2023-01-14 22:03:50 +0100C1300DE74000,"Cyber Protocol",nvdec,playable,2020-09-28 14:47:40 +0100C1F0141AA000,"Cyber Shadow",,playable,2022-07-17 05:37:41 +01006B9013672000,"Cybxus Hearts",gpu;slow,ingame,2022-01-15 05:00:49 +010063100B2C2000,"Cytus α",nvdec,playable,2021-02-20 13:40:46 +0100B6400CA56000,"DAEMON X MACHINA™",UE4;audout;ldn-untested;nvdec,playable,2021-06-09 19:22:29 +010061300DF48000,"Dairoku: Ayakashimori",Needs Update;loader-allocator,nothing,2021-11-30 05:09:38 +0100BD2009A1C000,"Damsel",,playable,2022-09-06 11:54:39 +0100BFC002B4E000,"Dandara: Trials of Fear Edition",,playable,2020-05-26 12:42:33 +0100DFB00D808000,"Dandy Dungeon - Legend of Brave Yamada -",,playable,2021-01-06 09:48:47 +01003ED0099B0000,"Danger Mouse: The Danger Games",crash;online,boots,2022-07-22 15:49:45 +0100EFA013E7C000,"Danger Scavenger",nvdec,playable,2021-04-17 15:53:04 +0100417007F78000,"Danmaku Unlimited 3",,playable,2020-11-15 00:48:35 +01000330105BE000,"Darius Cozmic Collection",,playable,2021-02-19 20:59:06 +010059C00BED4000,"Darius Cozmic Collection Special Edition",,playable,2022-07-22 16:26:50 +010015800F93C000,"Dariusburst - Another Chronicle EX+",online,playable,2021-04-05 14:21:43 +01003D301357A000,"Dark Arcana: The Carnival",gpu;slow,ingame,2022-02-19 08:52:28 +010083A00BF6C000,"Dark Devotion",nvdec,playable,2022-08-09 09:41:18 +0100BFF00D5AE000,"Dark Quest 2",,playable,2020-11-16 21:34:52 +01004AB00A260000,"DARK SOULS™: REMASTERED",gpu;nvdec;online-broken,ingame,2024-04-09 19:47:58 +01001FA0034E2000,"Dark Witch Music Episode: Rudymical",,playable,2020-05-22 09:44:44 +01008F1008DA6000,"Darkest Dungeon",nvdec,playable,2022-07-22 18:49:18 +0100F2300D4BA000,"Darksiders Genesis",nvdec;online-broken;UE4;ldn-broken,playable,2022-09-21 18:06:25 +010071800BA98000,"Darksiders II Deathinitive Edition",gpu;nvdec;online-broken,ingame,2024-06-26 00:37:25 +0100E1400BA96000,"Darksiders Warmastered Edition",nvdec,playable,2023-03-02 18:08:09 +010033500B7B6000,"Darkwood",,playable,2021-01-08 21:24:06 +0100440012FFA000,"DARQ Complete Edition",audout,playable,2021-04-07 15:26:21 +0100BA500B660000,"Darts Up",,playable,2021-04-14 17:22:22 +0100F0B0081DA000,"Dawn of the Breakers",online-broken;vulkan-backend-bug,menus,2022-12-08 14:40:03 +0100FCF00F6CC000,"Day and Night",,playable,2020-12-17 12:30:51 +0100D0A009310000,"de Blob",nvdec,playable,2021-01-06 17:34:46 +010034E00A114000,"de Blob 2",nvdec,playable,2021-01-06 13:00:16 +01008E900471E000,"De Mambo",,playable,2021-04-10 12:39:40 +01004C400CF96000,"Dead by Daylight",nvdec;online-broken;UE4,boots,2022-09-13 14:32:13 +0100646009FBE000,"Dead Cells",,playable,2021-09-22 22:18:49 +01004C500BD40000,"Dead End Job",nvdec,playable,2022-09-19 12:48:44 +01009CC00C97C000,"DEAD OR ALIVE Xtreme 3 Scarlet",,playable,2022-07-23 17:05:06 +0100A5000F7AA000,"DEAD OR SCHOOL",nvdec,playable,2022-09-06 12:04:09 +0100A24011F52000,"Dead Z Meat",UE4;services,ingame,2021-04-14 16:50:16 +010095A011A14000,"Deadly Days",,playable,2020-11-27 13:38:55 +0100BAC011928000,"Deadly Premonition 2: A Blessing In Disguise",,playable,2021-06-15 14:12:36 +0100EBE00F22E000,"Deadly Premonition Origins",32-bit;nvdec,playable,2024-03-25 12:47:46 +010015600D814000,"Dear Magi - Mahou Shounen Gakka -",,playable,2020-11-22 16:45:16 +01000D60126B6000,"Death and Taxes",,playable,2020-12-15 20:27:49 +010012B011AB2000,"Death Come True",nvdec,playable,2021-06-10 22:30:49 +0100F3B00CF32000,"Death Coming",crash,nothing,2022-02-06 07:43:03 +0100AEC013DDA000,"Death end re;Quest",,playable,2023-07-09 12:19:54 +0100423009358000,"Death Road to Canada",gpu;audio;32-bit;crash,nothing,2023-06-28 15:39:26 +010085900337E000,"Death Squared",,playable,2020-12-04 13:00:15 +0100A51013550000,"Death Tales",,playable,2020-12-17 10:55:52 +0100492011A8A000,"Death's Hangover",gpu,boots,2023-08-01 22:38:06 +01009120119B4000,"Deathsmiles I・II",,playable,2024-04-08 19:29:00 +010034F00BFC8000,"Debris Infinity",nvdec;online,playable,2021-05-28 12:14:39 +010027700FD2E000,"Decay of Logos",nvdec,playable,2022-09-13 14:42:13 +01002CC0062B8000,"DEEMO",,playable,2022-07-24 11:34:33 +01008B10132A2000,"DEEMO -Reborn-",nvdec;online-broken,playable,2022-10-17 15:18:11 +010026800FA88000,"Deep Diving Adventures",,playable,2022-09-22 16:43:37 +0100FAF009562000,"Deep Ones",services,nothing,2020-04-03 02:54:19 +0100C3E00D68E000,"Deep Sky Derelicts: Definitive Edition",,playable,2022-09-27 11:21:08 +01000A700F956000,"Deep Space Rush",,playable,2020-07-07 23:30:33 +0100961011BE6000,"DeepOne",services-horizon;Needs Update,nothing,2024-01-18 15:01:05 +01008BB00F824000,"Defenders of Ekron: Definitive Edition",,playable,2021-06-11 16:31:03 +0100CDE0136E6000,"Defentron",,playable,2022-10-17 15:47:56 +010039300BDB2000,"Defunct",,playable,2021-01-08 21:33:46 +010067900B9C4000,"Degrees of Separation",,playable,2021-01-10 13:40:04 +010071C00CBA4000,"Dei Gratia no Rashinban",crash,nothing,2021-07-13 02:25:32 +010092E00E7F4000,"Deleveled",slow,playable,2020-12-15 21:02:29 +010023800D64A000,"DELTARUNE Chapter 1&2",,playable,2023-01-22 04:47:44 +010038B01D2CA000,"Dementium: The Ward",crash,boots,2024-09-02 08:28:14 +0100AB600ACB4000,"Demetrios - The BIG Cynical Adventure",,playable,2021-06-04 12:01:01 +010099D00D1A4000,"Demolish & Build 2018",,playable,2021-06-13 15:27:26 +010084600F51C000,"Demon Pit",nvdec,playable,2022-09-19 13:35:15 +0100309016E7A000,"Demon Slayer -Kimetsu no Yaiba- The Hinokami Chronicles",UE4,playable,2024-08-08 04:51:49 +0100A2B00BD88000,"Demon's Crystals",crash;regression,nothing,2022-12-07 16:33:17 +0100E29013818000,"Demon's Rise - Lords of Chaos",,playable,2021-04-06 16:20:06 +0100C3501094E000,"Demon's Rise - War for the Deep",,playable,2020-07-29 12:26:27 +0100161011458000,"Demon's Tier+",,playable,2021-06-09 17:25:36 +0100BE800E6D8000,"DEMON'S TILT",,playable,2022-09-19 13:22:46 +010000401313A000,"Demong Hunter",,playable,2020-12-12 15:27:08 +0100BC501355A000,"Densha de go!! Hashirou Yamanote Sen",nvdec;UE4,playable,2023-11-09 07:47:58 +0100C9100FAE2000,"Depixtion",,playable,2020-10-10 18:52:37 +01000BF00B6BC000,"Deployment",slow;online-broken,playable,2022-10-17 16:23:59 +010023600C704000,"Deponia",nvdec,playable,2021-01-26 17:17:19 +0100ED700469A000,"Deru - The Art of Cooperation",,playable,2021-01-07 16:59:59 +0100D4600D0E4000,"Descenders",gpu,ingame,2020-12-10 15:22:36 +0100D870102BC000,"Desire remaster ver.",crash,boots,2021-01-17 02:34:37 +010069500DD86000,"Destiny Connect: Tick-Tock Travelers",UE4;gpu;nvdec,ingame,2020-12-16 12:20:36 +01008BB011ED6000,"Destrobots",,playable,2021-03-06 14:37:05 +01009E701356A000,"Destroy All Humans!",gpu;nvdec;UE4,ingame,2023-01-14 22:23:53 +010030600E65A000,"Detective Dolittle",,playable,2021-03-02 14:03:59 +01009C0009842000,"Detective Gallo",nvdec,playable,2022-07-24 11:51:04 +01002D400B0F6000,"Detective Jinguji Saburo Prism of Eyes",,playable,2020-10-02 21:54:41 +010007500F27C000,"Detective Pikachu™ Returns",,playable,2023-10-07 10:24:59 +010031B00CF66000,"Devil Engine",,playable,2021-06-04 11:54:30 +01002F000E8F2000,"Devil Kingdom",,playable,2023-01-31 08:58:44 +0100E8000D5B8000,"Devil May Cry",nvdec,playable,2021-01-04 19:43:08 +01007CF00D5BA000,"Devil May Cry 2",nvdec,playable,2023-01-24 23:03:20 +01007B600D5BC000,"Devil May Cry 3 Special Edition",nvdec,playable,2024-07-08 12:33:23 +01003C900EFF6000,"Devil Slayer Raksasi",,playable,2022-10-26 19:42:32 +01009EA00A320000,"Devious Dungeon",,playable,2021-03-04 13:03:06 +01003F601025E000,"Dex",nvdec,playable,2020-08-12 16:48:12 +010044000CBCA000,"Dexteritrip",,playable,2021-01-06 12:51:12 +0100AFC00E06A000,"Dezatopia",online,playable,2021-06-15 21:06:11 +01001B300B9BE000,"Diablo III: Eternal Collection",online-broken;ldn-works,playable,2023-08-21 23:48:03 +0100726014352000,"Diablo® II: Resurrected™",gpu;nvdec,ingame,2023-08-18 18:42:47 +0100F73011456000,"Diabolic",,playable,2021-06-11 14:45:08 +010027400BD24000,"DIABOLIK LOVERS CHAOS LINEAGE",gpu;Needs Update,ingame,2023-06-08 02:20:44 +0100BBF011394000,"Dicey Dungeons",gpu;audio;slow,ingame,2023-08-02 20:30:12 +0100D98005E8C000,"Die for Valhalla!",,playable,2021-01-06 16:09:14 +0100BB900B5B4000,"Dies irae Amantes amentes For Nintendo Switch",32-bit;crash,nothing,2022-02-16 07:09:05 +0100A5A00DBB0000,"Dig Dog",gpu,ingame,2021-06-02 17:17:51 +01004DE011076000,"Digerati Indie Darling Bundle Vol. 3",,playable,2022-10-02 13:01:57 +010035D0121EC000,"Digerati Presents: The Dungeon Crawl Vol. 1",slow,ingame,2021-04-18 14:04:55 +010014E00DB56000,"Digimon Story Cyber Sleuth: Complete Edition",nvdec;opengl,playable,2022-09-13 15:02:37 +0100F00014254000,"Digimon World: Next Order",,playable,2023-05-09 20:41:06 +0100B6D00DA6E000,"Ding Dong XL",,playable,2020-07-14 16:13:19 +01002E4011924000,"Dininho Adventures",,playable,2020-10-03 17:25:51 +010027E0158A6000,"Dininho Space Adventure",,playable,2023-01-14 22:43:04 +0100A8A013DA4000,"Dirt Bike Insanity",,playable,2021-01-31 13:27:38 +01004CB01378A000,"Dirt Trackin Sprint Cars",nvdec;online-broken,playable,2022-10-17 16:34:56 +0100918014B02000,"Disagaea 6: Defiance of Destiny Demo",demo,playable,2022-10-26 20:02:04 +010020700E2A2000,"Disaster Report 4: Summer Memories",nvdec;UE4,playable,2022-09-27 19:41:31 +0100510004D2C000,"Disc Jam",UE4;ldn-untested;nvdec;online,playable,2021-04-08 16:40:35 +0100C81004780000,"Disco Dodgeball - REMIX",online,playable,2020-09-28 23:24:49 +01004B100AF18000,"Disgaea 1 Complete",,playable,2023-01-30 21:45:23 +0100A9800E9B4000,"Disgaea 4 Complete+",gpu;slow,playable,2020-02-18 10:54:28 +010068C00F324000,"Disgaea 4 Complete+ Demo",nvdec,playable,2022-09-13 15:21:59 +01005700031AE000,"Disgaea 5 Complete",nvdec,playable,2021-03-04 15:32:54 +0100ABC013136000,"Disgaea 6: Defiance of Destiny",deadlock,ingame,2023-04-15 00:50:32 +0100307011D80000,"Disgaea 6: Defiance of Destiny [ FG ] [ 魔界戦記ディスガイア6 ]",,playable,2021-06-08 13:20:33 +01005EE013888000,"Disgaea 6: Defiance of Destiny Demo [ 魔界戦記ディスガイア6 ]",gpu;demo,ingame,2022-12-06 15:27:59 +01000B70122A2000,"Disjunction",gpu;vulkan-backend-bug;opengl-backend-bug,ingame,2024-04-28 23:55:24 +0100A2F00EEFC000,"Disney Classic Games Collection",online-broken,playable,2022-09-13 15:44:17 +0100DA201EBF8000,"Disney Epic Mickey: Rebrushed",crash,ingame,2024-09-26 22:11:51 +0100F0401435E000,"Disney Speedstorm",services,boots,2023-11-27 02:15:32 +010012800EBAE000,"Disney TSUM TSUM FESTIVAL",crash,menus,2020-07-14 14:05:28 +01009740120FE000,"DISTRAINT 2",,playable,2020-09-03 16:08:12 +010075B004DD2000,"DISTRAINT: Deluxe Edition",,playable,2020-06-15 23:42:24 +010027400CDC6000,"Divinity: Original Sin 2 - Definitive Edition",services;crash;online-broken;regression,ingame,2025-02-03 22:12:30 +01001770115C8000,"Dodo Peak",nvdec;UE4,playable,2022-10-04 16:13:05 +010077B0100DA000,"Dogurai",,playable,2020-10-04 02:40:16 +010048100D51A000,"Dokapon Up! Mugen no Roulette",gpu;Needs Update,menus,2022-12-08 19:39:10 +01005EE00BC78000,"Dokuro (ドクロ)",nvdec,playable,2020-12-17 14:47:09 +010007200AC0E000,"Don't Die, Mr Robot!",nvdec,playable,2022-09-02 18:34:38 +0100E470067A8000,"Don't Knock Twice",,playable,2024-05-08 22:37:58 +0100C4D00B608000,"Don't Sink",gpu,ingame,2021-02-26 15:41:11 +0100751007ADA000,"Don't Starve: Nintendo Switch Edition",nvdec,playable,2022-02-05 20:43:34 +010088B010DD2000,"Dongo Adventure",,playable,2022-10-04 16:22:26 +0100C1F0051B6000,"Donkey Kong Country™: Tropical Freeze",,playable,2024-08-05 16:46:10 +01009D901BC56000,"Donkey Kong Country™: Returns HD",gpu,ingame,2025-02-16 13:44:12 +0100F2C00F060000,"Doodle Derby",,boots,2020-12-04 22:51:48 +0100416004C00000,"DOOM",gpu;slow;nvdec;online-broken,ingame,2024-09-23 15:40:07 +010018900DD00000,"DOOM (1993)",nvdec;online-broken,menus,2022-09-06 13:32:19 +01008CB01E52E000,"DOOM + DOOM II",opengl;ldn-untested;LAN,playable,2024-09-12 07:06:01 +010029D00E740000,"DOOM 3",crash,menus,2024-08-03 05:25:47 +01005D700E742000,"DOOM 64",nvdec;vulkan,playable,2020-10-13 23:47:28 +0100D4F00DD02000,"DOOM II (Classic)",nvdec;online,playable,2021-06-03 20:10:01 +0100B1A00D8CE000,"DOOM® Eternal",gpu;slow;nvdec;online-broken,ingame,2024-08-28 15:57:17 +01005ED00CD70000,"Door Kickers: Action Squad",online-broken;ldn-broken,playable,2022-09-13 16:28:53 +010073700E412000,"DORAEMON STORY OF SEASONS",nvdec,playable,2020-07-13 20:28:11 +0100F7300BD8E000,"Double Cross",,playable,2021-01-07 15:34:22 +0100B1500E9F2000,"Double Dragon & Kunio-kun: Retro Brawler Bundle",,playable,2020-09-01 12:48:46 +01001AD00E49A000,"DOUBLE DRAGON Ⅲ: The Sacred Stones",online,playable,2021-06-11 15:41:44 +01005B10132B2000,"Double Dragon Neon",gpu;audio;32-bit,ingame,2022-09-20 18:00:20 +01000F400C1A4000,"Double Kick Heroes",gpu,ingame,2020-10-03 14:33:59 +0100A5D00C7C0000,"Double Pug Switch",nvdec,playable,2022-10-10 10:59:35 +0100FC000EE10000,"Double Switch - 25th Anniversary Edition",nvdec,playable,2022-09-19 13:41:50 +0100B6600FE06000,"Down to Hell",gpu;nvdec,ingame,2022-09-19 14:01:26 +010093D00C726000,"Downwell",,playable,2021-04-25 20:05:24 +0100ED000D390000,"Dr Kawashima's Brain Training",services,ingame,2023-06-04 00:06:46 +01001B80099F6000,"Dracula's Legacy",nvdec,playable,2020-12-10 13:24:25 +0100566009238000,"DragoDino",gpu;nvdec,ingame,2020-08-03 20:49:16 +0100DBC00BD5A000,"Dragon Audit",crash,ingame,2021-05-16 14:24:46 +0100A250097F0000,"DRAGON BALL FighterZ",UE4;ldn-broken;nvdec;online,playable,2021-06-11 16:19:04 +010078D000F88000,"DRAGON BALL XENOVERSE 2 for Nintendo Switch",gpu;nvdec;online;ldn-untested,ingame,2022-07-24 12:31:01 +010051C0134F8000,"DRAGON BALL Z: KAKAROT + A NEW POWER AWAKENS SET",vulkan-backend-bug,playable,2024-08-28 00:03:50 +010099B00A2DC000,"Dragon Blaze for Nintendo Switch",32-bit,playable,2020-10-14 11:11:28 +010089700150E000,"Dragon Marked for Death: Advanced Attackers",ldn-untested;audout,playable,2022-03-10 06:44:34 +0100EFC00EFB2000,"DRAGON QUEST",gpu,boots,2021-11-09 03:31:32 +010008900705C000,"Dragon Quest Builders™",gpu;nvdec,ingame,2023-08-14 09:54:36 +010042000A986000,"DRAGON QUEST BUILDERS™ 2",,playable,2024-04-19 16:36:38 +0100CD3000BDC000,"Dragon Quest Heroes I + II (JP)",nvdec,playable,2021-04-08 14:27:16 +010062200EFB4000,"DRAGON QUEST II: Luminaries of the Legendary Line",,playable,2022-09-13 16:44:11 +01003E601E324000,"DRAGON QUEST III HD-2D Remake",vulkan-backend-bug;UE4;audout;mac-bug,ingame,2025-01-07 04:10:27 +010015600EFB6000,"DRAGON QUEST III: The Seeds of Salvation",gpu,boots,2021-11-09 03:38:34 +0100A77018EA0000,"DRAGON QUEST MONSTERS: The Dark Prince",,playable,2023-12-29 16:10:05 +0100217014266000,"Dragon Quest Treasures",gpu;UE4,ingame,2023-05-09 11:16:52 +0100E2E0152E4000,"Dragon Quest X Awakening Five Races Offline",nvdec;UE4,playable,2024-08-20 10:04:24 +01006C300E9F0000,"DRAGON QUEST® XI S: Echoes of an Elusive Age – Definitive Edition",UE4,playable,2021-11-27 12:27:11 +010032C00AC58000,"Dragon's Dogma: Dark Arisen",,playable,2022-07-24 12:58:33 +010027100C544000,"Dragon's Lair Trilogy",nvdec,playable,2021-01-13 22:12:07 +0100DA0006F50000,"DragonFangZ - The Rose & Dungeon of Time",,playable,2020-09-28 21:35:18 +0100F7800A434000,"Drawful 2",,ingame,2022-07-24 13:50:21 +0100B7E0102E4000,"Drawngeon: Dungeons of Ink and Paper",gpu,ingame,2022-09-19 15:41:25 +01008B20129F2000,"Dream",,playable,2020-12-15 19:55:07 +01000AA0093DC000,"Dream Alone",nvdec,playable,2021-01-27 19:41:50 +010034D00F330000,"DreamBall",UE4;crash;gpu,ingame,2020-08-05 14:45:25 +010058B00F3C0000,"Dreaming Canvas",UE4;gpu,ingame,2021-06-13 22:50:07 +0100D24013466000,"DREAMO",UE4,playable,2022-10-17 18:25:28 +0100ED200B6FC000,"DreamWorks Dragons Dawn of New Riders",nvdec,playable,2021-01-27 20:05:26 +0100236011B4C000,"DreamWorks Spirit Lucky’s Big Adventure",,playable,2022-10-27 13:30:52 +010058C00A916000,"Drone Fight",,playable,2022-07-24 14:31:56 +010052000A574000,"Drowning",,playable,2022-07-25 14:28:26 +0100652012F58000,"Drums",,playable,2020-12-17 17:21:51 +01005BC012C66000,"Duck Life Adventure",,playable,2022-10-10 11:27:03 +01007EF00CB88000,"Duke Nukem 3D: 20th Anniversary World Tour",32-bit;ldn-untested,playable,2022-08-19 22:22:40 +010068D0141F2000,"Dull Grey",,playable,2022-10-27 13:40:38 +0100926013600000,"Dungeon Nightmares 1 + 2 Collection",,playable,2022-10-17 18:54:22 +010034300F0E2000,"Dungeon of the Endless",nvdec,playable,2021-05-27 19:16:26 +0100E79009A94000,"Dungeon Stars",,playable,2021-01-18 14:28:37 +0100BE801360E000,"Dungeons & Bombs",,playable,2021-04-06 12:46:22 +0100EC30140B6000,"Dunk Lords",,playable,2024-06-26 00:07:26 +010011C00E636000,"Dusk Diver",crash;UE4,boots,2021-11-06 09:01:30 +0100B6E00A420000,"Dust: An Elysian Tail",,playable,2022-07-25 15:28:12 +0100D7E012F2E000,"Dustoff Z",,playable,2020-12-04 23:22:29 +01008C8012920000,"Dying Light: Definitive Edition",services-horizon,boots,2024-03-11 10:43:32 +01007DD00DFDE000,"Dyna Bomb",,playable,2020-06-07 13:26:55 +0100E9A00CB30000,"DYNASTY WARRIORS 8: Xtreme Legends Definitive Edition",nvdec,playable,2024-06-26 00:16:30 +010008900BC5A000,"DYSMANTLE",gpu,ingame,2024-07-15 16:24:12 +010054E01D878000,"EA SPORTS FC 25",crash,ingame,2024-09-25 21:07:50 +0100BDB01A0E6000,"EA SPORTS FC™ 24",,boots,2023-10-04 18:32:59 +01001C8016B4E000,"EA SPORTS FIFA 23 Nintendo Switch™ Legacy Edition",gpu;crash,ingame,2024-06-10 23:33:05 +01005DE00D05C000,"EA SPORTS™ FIFA 20 Nintendo Switch™ Legacy Edition",gpu;nvdec;online-broken;ldn-untested,ingame,2022-09-13 17:57:20 +010037400C7DA000,"Eagle Island Twist",,playable,2021-04-10 13:15:42 +0100B9E012992000,"Earth Defense Force World Brothers ( ま~るい地球が四角くなった!? デジボク地球防衛軍 )",UE4,playable,2022-12-07 12:59:16 +0100298014030000,"Earth Defense Force: World Brothers",UE4,playable,2022-10-27 14:13:31 +01009B7006C88000,"EARTH WARS",,playable,2021-06-05 11:18:33 +0100DFC00E472000,"Earthfall: Alien Horde",nvdec;UE4;ldn-untested,playable,2022-09-13 17:32:37 +01006E50042EA000,"EARTHLOCK",,playable,2021-06-05 11:51:02 +0100A2E00BB0C000,"EarthNight",,playable,2022-09-19 21:02:20 +0100DCE00B756000,"Earthworms",,playable,2022-07-25 16:28:55 +0100E3500BD84000,"Earthworms Demo",,playable,2021-01-05 16:57:11 +0100ECF01800C000,"Easy Come Easy Golf",online-broken;regression,playable,2024-04-04 16:15:00 +0100A9B009678000,"EAT BEAT DEADSPIKE-san",audio;Needs Update,playable,2022-12-02 19:25:29 +0100BCA016636000,"eBaseball Powerful Pro Yakyuu 2022",gpu;services-horizon;crash,nothing,2024-05-26 23:07:19 +01001F20100B8000,"Eclipse: Edge of Light",,playable,2020-08-11 23:06:29 +0100E0A0110F4000,"eCrossminton",,playable,2020-07-11 18:24:27 +0100ABE00DB4E000,"Edna & Harvey: Harvey's New Eyes",nvdec,playable,2021-01-26 14:36:08 +01004F000B716000,"Edna & Harvey: The Breakout – Anniversary Edition",crash;nvdec,ingame,2022-08-01 16:59:56 +01002550129F0000,"Effie",,playable,2022-10-27 14:36:39 +0100CC0010A46000,"Ego Protocol: Remastered",nvdec,playable,2020-12-16 20:16:35 +01004CC00B352000,"Eiga Sumikko Gurashi Tobidasu Ehon to Himitsu no Ko Game de Asobo Ehon no Sekai",,playable,2020-11-12 00:11:50 +01003AD013BD2000,"Eight Dragons",nvdec,playable,2022-10-27 14:47:28 +010020A01209C000,"El Hijo - A Wild West Tale",nvdec,playable,2021-04-19 17:44:08 +0100B5B00EF38000,"Elden: Path of the Forgotten",,playable,2020-12-15 00:33:19 +010068F012880000,"Eldrador® Creatures",slow,playable,2020-12-12 12:35:35 +010008E010012000,"ELEA: Paradigm Shift",UE4;crash,nothing,2020-10-04 19:07:43 +0100A6700AF10000,"Element",,playable,2022-07-25 17:17:16 +0100128003A24000,"Elliot Quest",,playable,2022-07-25 17:46:14 +010041A00FEC6000,"Ember",nvdec,playable,2022-09-19 21:16:11 +010071B012940000,"Embracelet",,playable,2020-12-04 23:45:00 +010017B0102A8000,"Emma: Lost in Memories",nvdec,playable,2021-01-28 16:19:10 +010068300E08E000,"Enchanted in the Moonlight - Kiryu, Chikage & Yukinojo -",gpu;nvdec,ingame,2022-11-20 16:18:45 +01007A4008486000,"Enchanting Mahjong Match",gpu,ingame,2020-04-17 22:01:31 +0100EF901E552000,"ENDER MAGNOLIA: Bloom in the Mist",deadlock,boots,2025-01-22 17:59:00 +01004F3011F92000,"Endless Fables: Dark Moor",gpu;nvdec,ingame,2021-03-07 15:31:03 +010067B017588000,"Endless Ocean™ Luminous",services-horizon;crash,ingame,2024-05-30 02:05:57 +0100B8700BD14000,"Energy Cycle Edge",services,ingame,2021-11-30 05:02:31 +0100A8E0090B0000,"Energy Invasion",,playable,2021-01-14 21:32:26 +0100C6200A0AA000,"Enigmatis 2: The Mists of Ravenwood",crash;regression,boots,2021-06-06 15:15:30 +01009D60076F6000,"Enter the Gungeon",,playable,2022-07-25 20:28:33 +0100262009626000,"Epic Loon",nvdec,playable,2022-07-25 22:06:13 +01000FA0149B6000,"EQI",nvdec;UE4,playable,2022-10-27 16:42:32 +0100E95010058000,"EQQO",UE4;nvdec,playable,2021-06-13 23:10:51 +01000E8010A98000,"Escape First",,playable,2020-10-20 22:46:53 +010021201296A000,"Escape First 2",,playable,2021-03-24 11:59:41 +0100FEF00F0AA000,"Escape from Chernobyl",crash,boots,2022-09-19 21:36:58 +010023E013244000,"Escape from Life Inc",,playable,2021-04-19 17:34:09 +010092901203A000,"Escape From Tethys",,playable,2020-10-14 22:38:25 +0100B0F011A84000,"Escape Game Fort Boyard",,playable,2020-07-12 12:45:43 +0100F9600E746000,"ESP Ra.De. Psi",audio;slow,ingame,2024-03-07 15:05:08 +010073000FE18000,"Esports powerful pro yakyuu 2020",gpu;crash;Needs More Attention,ingame,2024-04-29 05:34:14 +01004F9012FD8000,"Estranged: The Departure",nvdec;UE4,playable,2022-10-24 10:37:58 +0100CB900B498000,"Eternum Ex",,playable,2021-01-13 20:28:32 +010092501EB2C000,"Europa (Demo)",gpu;crash;UE4,ingame,2024-04-23 10:47:12 +01007BE0160D6000,"EVE ghost enemies",gpu,ingame,2023-01-14 03:13:30 +010095E01581C000,"even if TEMPEST",gpu,ingame,2023-06-22 23:50:25 +010072C010002000,"Event Horizon: Space Defense",,playable,2020-07-31 20:31:24 +0100DCF0093EC000,"Everspace™ - Stellar Edition",UE4,playable,2022-08-14 01:16:24 +01006F900BF8E000,"Everybody 1-2-Switch!™",services;deadlock,nothing,2023-07-01 05:52:55 +010080600B53E000,"Evil Defenders",nvdec,playable,2020-09-28 17:11:00 +01006A800FA22000,"Evolution Board Game",online,playable,2021-01-20 22:37:56 +0100F2D00C7DE000,"Exception",online-broken,playable,2022-09-20 12:47:10 +0100DD30110CC000,"Exit the Gungeon",,playable,2022-09-22 17:04:43 +0100A82013976000,"Exodemon",,playable,2022-10-27 20:17:52 +0100FA800A1F4000,"EXORDER",nvdec,playable,2021-04-15 14:17:20 +01009B7010B42000,"Explosive Jake",crash,boots,2021-11-03 07:48:32 +0100EFE00A3C2000,"Eyes: The Horror Game",,playable,2021-01-20 21:59:46 +0100E3D0103CE000,"Fable of Fairy Stones",,playable,2021-05-05 21:04:54 +01004200189F4000,"Factorio",deadlock,boots,2024-06-11 19:26:16 +010073F0189B6000,"Fae Farm",,playable,2024-08-25 15:12:12 +010069100DB08000,"Faeria",nvdec;online-broken,menus,2022-10-04 16:44:41 +01008A6009758000,"Fairune Collection",,playable,2021-06-06 15:29:56 +0100F6D00B8F2000,"Fairy Fencer F™: Advent Dark Force",32-bit;crash;nvdec,ingame,2023-04-16 03:53:48 +0100CF900FA3E000,"FAIRY TAIL",nvdec,playable,2022-10-04 23:00:32 +01005A600BE60000,"Fall of Light: Darkest Edition",slow;nvdec,ingame,2024-07-24 04:19:26 +0100AA801258C000,"Fallen Legion Revenants",crash,menus,2021-11-25 08:53:20 +0100D670126F6000,"Famicom Detective Club™: The Girl Who Stands Behind",nvdec,playable,2022-10-27 20:41:40 +010033F0126F4000,"Famicom Detective Club™: The Missing Heir",nvdec,playable,2022-10-27 20:56:23 +010060200FC44000,"Family Feud®",online-broken,playable,2022-10-10 11:42:21 +0100034012606000,"Family Mysteries: Poisonous Promises",audio;crash,menus,2021-11-26 12:35:06 +010017C012726000,"Fantasy Friends",,playable,2022-10-17 19:42:39 +0100767008502000,"FANTASY HERO ~unsigned legacy~",,playable,2022-07-26 12:28:52 +0100755017EE0000,"FANTASY LIFE i: The Girl Who Steals Time",gpu;crash;vulkan-backend-bug,ingame,2025-06-08 20:41:00 +0100944003820000,"Fantasy Strike",online,playable,2021-02-27 01:59:18 +01000E2012F6E000,"Fantasy Tavern Sextet -Vol.1 New World Days-",gpu;crash;Needs Update,ingame,2022-12-05 16:48:00 +01005C10136CA000,"Fantasy Tavern Sextet -Vol.2 Adventurer's Days-",gpu;slow;crash,ingame,2021-11-06 02:57:29 +010022700E7D6000,"FAR: Lone Sails",,playable,2022-09-06 16:33:05 +0100C9E00FD62000,"Farabel",,playable,2020-08-03 17:47:28 +0100ECD00C806000,"Farm Expert 2019 for Nintendo Switch",,playable,2020-07-09 21:42:57 +01000E400ED98000,"Farm Mystery",nvdec,playable,2022-09-06 16:46:47 +010086B00BB50000,"Farm Together",,playable,2021-01-19 20:01:19 +0100EB600E914000,"Farming Simulator 20",nvdec,playable,2021-06-13 10:52:44 +0100D04004176000,"Farming Simulator Nintendo Switch Edition",nvdec,playable,2021-01-19 14:46:44 +0100E99019B3A000,"Fashion Dreamer",,playable,2023-11-12 06:42:52 +01009510001CA000,"FAST RMX",slow;crash;ldn-partial,ingame,2024-06-22 20:48:58 +0100BEB015604000,"FATAL FRAME: Maiden of Black Water",,playable,2023-07-05 16:01:40 +0100DAE019110000,"FATAL FRAME: Mask of the Lunar Eclipse",Incomplete,playable,2024-04-11 06:01:30 +010051400B17A000,"Fate/EXTELLA LINK",ldn-untested;nvdec,playable,2021-01-27 00:45:50 +010053E002EA2000,"Fate/EXTELLA: The Umbral Star",gpu;nvdec;online-broken;vulkan-backend-bug;opengl-backend-bug,ingame,2023-04-24 23:37:55 +0100F6200B7D4000,"fault - milestone one",nvdec,playable,2021-03-24 10:41:49 +01005AC0068F6000,"Fear Effect Sedna",nvdec,playable,2021-01-19 13:10:33 +0100F5501CE12000,"Fearmonium",crash,boots,2024-03-06 11:26:11 +0100E4300CB3E000,"Feather",,playable,2021-06-03 14:11:27 +010003B00D3A2000,"Felix The Reaper",nvdec,playable,2020-10-20 23:43:03 +0100AA3009738000,"Feudal Alloy",,playable,2021-01-14 08:48:14 +01008D900B984000,"FEZ",gpu,ingame,2021-04-18 17:10:16 +01007510040E8000,"FIA European Truck Racing Championship",nvdec,playable,2022-09-06 17:51:59 +0100F7B002340000,"FIFA 18",gpu;online-broken;ldn-untested,ingame,2022-07-26 12:43:59 +0100FFA0093E8000,"FIFA 19",gpu;nvdec;online-broken;ldn-untested,ingame,2022-07-26 13:07:07 +01000A001171A000,"FIFA 21 Nintendo Switch™ Legacy Edition",gpu;online-broken,ingame,2023-12-11 22:10:19 +0100216014472000,"FIFA 22 Nintendo Switch™ Legacy Edition",gpu,ingame,2024-03-02 14:13:48 +01006980127F0000,"Fight Crab",online-broken;ldn-untested,playable,2022-10-05 10:24:04 +010047E010B3E000,"Fight of Animals",online,playable,2020-10-15 15:08:28 +0100C7D00E730000,"Fight'N Rage",,playable,2020-06-16 23:35:19 +0100D02014048000,"FIGHTING EX LAYER ANOTHER DASH",online-broken;UE4,playable,2024-04-07 10:22:33 +0100118009C68000,"Figment",nvdec,playable,2021-01-27 19:36:05 +010095600AA36000,"Fill-a-Pix: Phil's Epic Adventure",,playable,2020-12-22 13:48:22 +0100C3A00BB76000,"Fimbul",nvdec,playable,2022-07-26 13:31:47 +0100C8200E942000,"Fin and the Ancient Mystery",nvdec,playable,2020-12-17 16:40:39 +01000EA014150000,"FINAL FANTASY",,playable,2025-02-16 21:27:30 +01006B7014156000,"FINAL FANTASY II",crash,nothing,2024-04-13 19:18:04 +01006F000B056000,"FINAL FANTASY IX",audout;nvdec,playable,2021-06-05 11:35:00 +0100AA201415C000,"FINAL FANTASY V",,playable,2023-04-26 01:11:55 +0100A5B00BDC6000,"FINAL FANTASY VII",,playable,2022-12-09 17:03:30 +01008B900DC0A000,"FINAL FANTASY VIII Remastered",nvdec,playable,2023-02-15 10:57:48 +0100BC300CB48000,"FINAL FANTASY X/X-2 HD Remaster",gpu,ingame,2022-08-16 20:29:26 +0100EB100AB42000,"FINAL FANTASY XII THE ZODIAC AGE",opengl;vulkan-backend-bug,playable,2024-08-11 07:01:54 +010068F00AA78000,"FINAL FANTASY XV POCKET EDITION HD",,playable,2021-01-05 17:52:08 +0100CE4010AAC000,"FINAL FANTASY® CRYSTAL CHRONICLES™ Remastered Edition",,playable,2023-04-02 23:39:12 +01001BA00AE4E000,"Final Light, The Prison",,playable,2020-07-31 21:48:44 +0100FF100FB68000,"Finding Teddy 2 : Definitive Edition",gpu,ingame,2024-04-19 16:51:33 +0100F4E013AAE000,"Fire & Water",,playable,2020-12-15 15:43:20 +0100F15003E64000,"Fire Emblem Warriors",nvdec,playable,2023-05-10 01:53:10 +010071F0143EA000,"Fire Emblem Warriors: Three Hopes",gpu;nvdec,ingame,2024-05-01 07:07:42 +0100A6301214E000,"Fire Emblem™ Engage",amd-vendor-bug;mac-bug,playable,2024-09-01 23:37:26 +0100A12011CC8000,"Fire Emblem™: Shadow Dragon & the Blade of Light",,playable,2022-10-17 19:49:14 +010055D009F78000,"Fire Emblem™: Three Houses",online-broken,playable,2024-09-14 23:53:50 +010025C014798000,"Fire: Ungh’s Quest",nvdec,playable,2022-10-27 21:41:26 +0100434003C58000,"Firefighters – The Simulation",,playable,2021-02-19 13:32:05 +0100BB1009E50000,"Firefighters: Airport Fire Department",,playable,2021-02-15 19:17:00 +0100AC300919A000,"Firewatch",,playable,2021-06-03 10:56:38 +0100BA9012B36000,"Firework",,playable,2020-12-04 20:20:09 +0100DEB00ACE2000,"Fishing Star World Tour",,playable,2022-09-13 19:08:51 +010069800D292000,"Fishing Universe Simulator",,playable,2021-04-15 14:00:43 +0100807008868000,"Fit Boxing",,playable,2022-07-26 19:24:55 +0100E7300AAD4000,"Fitness Boxing",,playable,2021-04-14 20:33:33 +0100073011382000,"Fitness Boxing 2: Rhythm & Exercise",crash,ingame,2021-04-14 20:40:48 +0100C7E0134BE000,"Five Dates",nvdec,playable,2020-12-11 15:17:11 +0100B6200D8D2000,"Five Nights at Freddy's",,playable,2022-09-13 19:26:36 +01004EB00E43A000,"Five Nights at Freddy's 2",,playable,2023-02-08 15:48:24 +010056100E43C000,"Five Nights at Freddy's 3",,playable,2022-09-13 20:58:07 +010083800E43E000,"Five Nights at Freddy's 4",,playable,2023-08-19 07:28:03 +0100F7901118C000,"Five Nights at Freddy's: Help Wanted",UE4,playable,2022-09-29 12:40:09 +01009060193C4000,"Five Nights at Freddy's: Security Breach",gpu;crash;mac-bug,ingame,2023-04-23 22:33:28 +01003B200E440000,"Five Nights at Freddy's: Sister Location",,playable,2023-10-06 09:00:58 +010038200E088000,"Flan",crash;regression,ingame,2021-11-17 07:39:28 +01000A0004C50000,"FLASHBACK™",nvdec,playable,2020-05-14 13:57:29 +0100C53004C52000,"Flat Heroes",gpu,ingame,2022-07-26 19:37:37 +0100B54012798000,"Flatland: Prologue",,playable,2020-12-11 20:41:12 +0100307004B4C000,"Flinthook",online,playable,2021-03-25 20:42:29 +010095A004040000,"Flip Wars",services;ldn-untested,ingame,2022-05-02 15:39:18 +01009FB002B2E000,"Flipping Death",,playable,2021-02-17 16:12:30 +0100D1700ACFC000,"Flood of Light",,playable,2020-05-15 14:15:25 +0100DF9005E7A000,"Floor Kids",nvdec,playable,2024-08-18 19:38:49 +010040700E8FC000,"Florence",,playable,2020-09-05 01:22:30 +0100F5D00CD58000,"Flowlines VS",,playable,2020-12-17 17:01:53 +010039C00E2CE000,"Flux8",nvdec,playable,2020-06-19 20:55:11 +0100EDA00BBBE000,"Fly O'Clock",,playable,2020-05-17 13:39:52 +0100FC300F4A4000,"Fly Punch Boom!",online,playable,2020-06-21 12:06:11 +0100419013A8A000,"Flying Hero X",crash,menus,2021-11-17 07:46:58 +010056000BA1C000,"Fobia",,playable,2020-12-14 21:05:23 +0100F3900D0F0000,"Food Truck Tycoon",,playable,2022-10-17 20:15:55 +01007CF013152000,"Football Manager 2021 Touch",gpu,ingame,2022-10-17 20:08:23 +0100EDC01990E000,"Football Manager 2023 Touch",gpu,ingame,2023-08-01 03:40:53 +010097F0099B4000,"Football Manager Touch 2018",,playable,2022-07-26 20:17:56 +010069400B6BE000,"For The King",nvdec,playable,2021-02-15 18:51:44 +01001D200BCC4000,"Forager",crash,menus,2021-11-24 07:10:17 +0100AE001256E000,"FORECLOSED",crash;Needs More Attention;nvdec,ingame,2022-12-06 14:41:12 +010044B00E70A000,"Foregone",deadlock,ingame,2020-12-17 15:26:53 +010059E00B93C000,"Forgotton Anne",nvdec,playable,2021-02-15 18:28:07 +01008EA00405C000,"forma.8",nvdec,playable,2020-11-15 01:04:32 +010025400AECE000,"Fortnite",services-horizon,nothing,2024-04-06 18:23:25 +0100AAE01E39C000,"Fortress Challenge - Fort Boyard",nvdec;slow,playable,2020-05-15 13:22:53 +0100CA500756C000,"Fossil Hunters",nvdec,playable,2022-07-27 11:37:20 +01008A100A028000,"FOX n FORESTS",,playable,2021-02-16 14:27:49 +0100D2501001A000,"FoxyLand",,playable,2020-07-29 20:55:20 +01000AC010024000,"FoxyLand 2",,playable,2020-08-06 14:41:30 +01004200099F2000,"Fractured Minds",,playable,2022-09-13 21:21:40 +0100F1A00A5DC000,"FRAMED Collection",nvdec,playable,2022-07-27 11:48:15 +0100AC40108D8000,"Fred3ric",,playable,2021-04-15 13:30:31 +01000490067AE000,"Frederic 2: Evil Strikes Back",,playable,2020-07-23 16:44:37 +01005B1006988000,"Frederic: Resurrection of Music",nvdec,playable,2020-07-23 16:59:53 +010082B00EE50000,"Freedom Finger",nvdec,playable,2021-06-09 19:31:30 +0100EB800B614000,"Freedom Planet",,playable,2020-05-14 12:23:06 +010003F00BD48000,"Friday the 13th: Killer Puzzle",,playable,2021-01-28 01:33:38 +010092A00C4B6000,"Friday the 13th: The Game Ultimate Slasher Edition",nvdec;online-broken;UE4,playable,2022-09-06 17:33:27 +0100F200178F4000,"FRONT MISSION 1st: Remake",,playable,2023-06-09 07:44:24 +0100861012474000,"Frontline Zed",,playable,2020-10-03 12:55:59 +0100B5300B49A000,"Frost",,playable,2022-07-27 12:00:36 +010038A007AA4000,"FruitFall Crush",,playable,2020-10-20 11:33:33 +01008D800AE4A000,"FullBlast",,playable,2020-05-19 10:34:13 +010002F00CC20000,"FUN! FUN! Animal Park",,playable,2021-04-14 17:08:52 +0100A8F00B3D0000,"FunBox Party",,playable,2020-05-15 12:07:02 +0100E7B00BF24000,"Funghi Explosion",,playable,2020-11-23 14:17:41 +01008E10130F8000,"Funimation",gpu,boots,2021-04-08 13:08:17 +0100EA501033C000,"Funny Bunny Adventures",,playable,2020-08-05 13:46:56 +01000EC00AF98000,"Furi",,playable,2022-07-27 12:21:20 +0100A6B00D4EC000,"Furwind",,playable,2021-02-19 19:44:08 +0100ECE00C0C4000,"Fury Unleashed",crash;services,ingame,2020-10-18 11:52:40 +010070000ED9E000,"Fury Unleashed Demo",,playable,2020-10-08 20:09:21 +0100E1F013674000,"FUSER™",nvdec;UE4;slow;gpu,ingame,2025-02-12 16:03:00 +0100A7A015E4C000,"Fushigi no Gensokyo Lotus Labyrinth",Needs Update;audio;gpu;nvdec,ingame,2021-01-20 15:30:02 +01003C300B274000,"Futari de! Nyanko Daisensou",,playable,2024-01-05 22:26:52 +010055801134E000,"FUZE Player",online-broken;vulkan-backend-bug,ingame,2022-10-18 12:23:53 +0100EAD007E98000,"FUZE4 Nintendo Switch",vulkan-backend-bug,playable,2022-09-06 19:25:01 +010067600F1A0000,"FuzzBall",crash,nothing,2021-03-29 20:13:21 +0100275011e54000,"G-MODE Archives 06 The strongest ever Julia Miyamoto",,playable,2020-10-15 13:06:26 +0100EB10108EA000,"G.I. Joe: Operation Blackout",UE4;crash,boots,2020-11-21 12:37:44 +010048600B14E000,"Gal Metal",,playable,2022-07-27 20:57:48 +010024700901A000,"Gal*Gun 2",nvdec;UE4,playable,2022-07-27 12:45:37 +0100047013378000,"Gal*Gun Returns [ ぎゃる☆がん りたーんず ]",nvdec,playable,2022-10-17 23:50:46 +0100C9800A454000,"GALAK-Z: Variant S",online-broken,boots,2022-07-29 11:59:12 +0100C62011050000,"Game Boy™ – Nintendo Switch Online",,playable,2023-03-21 12:43:48 +010012F017576000,"Game Boy™ Advance – Nintendo Switch Online",,playable,2023-02-16 20:38:15 +0100FA5010788000,"Game Builder Garage™",,ingame,2024-04-20 21:46:22 +0100AF700BCD2000,"Game Dev Story",,playable,2020-05-20 00:00:38 +01006BD00F8C0000,"Game Doraemon Nobita no Shin Kyoryu",gpu,ingame,2023-02-27 02:03:28 +01000FA00A4E4000,"Garage",,playable,2020-05-19 20:59:53 +010061E00E8BE000,"Garfield Kart Furious Racing",ldn-works;loader-allocator,playable,2022-09-13 21:40:25 +0100EA001069E000,"Gates Of Hell",slow,playable,2020-10-22 12:44:26 +010025500C098000,"Gato Roboto",,playable,2023-01-20 15:04:11 +010065E003FD8000,"Gear.Club Unlimited",,playable,2021-06-08 13:03:19 +010072900AFF0000,"Gear.Club Unlimited 2",nvdec;online-broken,playable,2022-07-29 12:52:16 +01000F000D9F0000,"Geki Yaba Runner Anniversary Edition",,playable,2021-02-19 18:59:07 +010052A00942A000,"Gekido Kintaro's Revenge",,playable,2020-10-27 12:44:05 +01009D000AF3A000,"Gelly Break Deluxe",UE4,playable,2021-03-03 16:04:02 +01001A4008192000,"Gem Smashers",nvdec,playable,2021-06-08 13:40:51 +010014901144C000,"Genetic Disaster",,playable,2020-06-19 21:41:12 +0100D7E0110B2000,"Genkai Tokki Moero Crystal H- 極限凸起 萌情水晶 H - 한계돌파 모에로크리스탈 H",32-bit,playable,2022-06-06 00:42:09 +010000300C79C000,"GensokyoDefenders",online-broken;UE4,playable,2022-07-29 13:48:12 +0100AC600EB4C000,"Gensou Rougoku no Kaleidscope",crash,menus,2021-11-24 08:45:07 +01007FC012FD4000,"Georifters",UE4;crash;nvdec,menus,2020-12-04 22:30:50 +010058F010296000,"GERRRMS",,playable,2020-08-15 11:32:52 +01006F30129F8000,"Get 10 quest",,playable,2020-08-03 12:48:39 +0100B5B00E77C000,"Get Over Here",,playable,2022-10-28 11:53:52 +0100EEB005ACC000,"Ghost 1.0",,playable,2021-02-19 20:48:47 +010063200C588000,"Ghost Blade HD",online-broken,playable,2022-09-13 21:51:21 +010057500E744000,"Ghost Grab 3000",,playable,2020-07-11 18:09:52 +010094C00E180000,"Ghost Parade",,playable,2020-07-14 00:43:54 +01004B301108C000,"Ghost Sweeper",,playable,2022-10-10 12:45:36 +010029B018432000,"Ghost Trick: Phantom Detective",,playable,2023-08-23 14:50:12 +010008A00F632000,"Ghostbusters: The Video Game Remastered",nvdec,playable,2021-09-17 07:26:57 +010090F012916000,"Ghostrunner",UE4;crash;gpu;nvdec,ingame,2020-12-17 13:01:59 +0100D6200F2BA000,"Ghosts 'n Goblins Resurrection",,playable,2023-05-09 12:40:41 +01003830092B8000,"Giana Sisters: Twisted Dreams - Owltimate Edition",,playable,2022-07-29 14:06:12 +0100D95012C0A000,"Gibbous - A Cthulhu Adventure",nvdec,playable,2022-10-10 12:57:17 +010045F00BFC2000,"GIGA WRECKER ALT.",,playable,2022-07-29 14:13:54 +01002C400E526000,"Gigantosaurus The Game",UE4,playable,2022-09-27 21:20:00 +0100C50007070000,"Ginger: Beyond the Crystal",,playable,2021-02-17 16:27:00 +01006BA013990000,"Girabox",,playable,2020-12-12 13:55:05 +01007E90116CE000,"Giraffe and Annika",UE4;crash,ingame,2020-12-04 22:41:57 +01006DD00CC96000,"Girls und Panzer Dream Tank Match DX",ldn-untested,playable,2022-09-12 16:07:11 +01005CB009E20000,"Glaive: Brick Breaker",,playable,2020-05-20 12:15:59 +0100B6F01227C000,"Glitch's Trip",,playable,2020-12-17 16:00:57 +0100EB501130E000,"Glyph",,playable,2021-02-08 19:56:51 +0100EB8011B0C000,"Gnome More War",,playable,2020-12-17 16:33:07 +010008D00CCEC000,"Gnomes Garden 2",,playable,2021-02-19 20:08:13 +010036C00D0D6000,"Gnomes Garden: Lost King",deadlock,menus,2021-11-18 11:14:03 +01008EF013A7C000,"Gnosia",,playable,2021-04-05 17:20:30 +01000C800FADC000,"Go All Out!",online-broken,playable,2022-09-21 19:16:34 +010055A0161F4000,"Go Rally",gpu,ingame,2023-08-16 21:18:23 +0100C1800A9B6000,"Go Vacation™",nvdec;ldn-works,playable,2024-05-13 19:28:53 +0100E6300F854000,"Go! Fish Go!",,playable,2020-07-27 13:52:28 +010032600C8CE000,"Goat Simulator: The GOATY",32-bit,playable,2022-07-29 21:02:33 +01001C700873E000,"GOD EATER 3",gpu;nvdec,ingame,2022-07-29 21:33:21 +0100F3D00B032000,"GOD WARS The Complete Legend",nvdec,playable,2020-05-19 14:37:50 +0100CFA0111C8000,"Gods Will Fall",,playable,2021-02-08 16:49:59 +0100D82009024000,"Goetia",,playable,2020-05-19 12:55:39 +01004D501113C000,"Going Under",deadlock;nvdec,ingame,2020-12-11 22:29:46 +0100126006EF0000,"GOKEN",,playable,2020-08-05 20:22:38 +010013800F0A4000,"Golazo!",,playable,2022-09-13 21:58:37 +01003C000D84C000,"Golem Gates",crash;nvdec;online-broken;UE4,ingame,2022-07-30 11:35:11 +0100779004172000,"Golf Story",,playable,2020-05-14 14:56:17 +01006FB00EBE0000,"Golf With Your Friends",online-broken,playable,2022-09-29 12:55:11 +0100EEC00AA6E000,"Gone Home",,playable,2022-08-01 11:14:20 +01007C2002B3C000,"GoNNER",,playable,2020-05-19 12:05:02 +0100B0500FE4E000,"Good Job!™",,playable,2021-03-02 13:15:55 +01003AD0123A2000,"Good Night, Knight",crash,nothing,2023-07-30 23:38:13 +0100F610122F6000,"Good Pizza, Great Pizza",,playable,2020-12-04 22:59:18 +010014C0100C6000,"Goosebumps Dead of Night",gpu;nvdec,ingame,2020-12-10 20:02:16 +0100B8000B190000,"Goosebumps The Game",,playable,2020-05-19 11:56:52 +0100F2A005C98000,"Gorogoa",,playable,2022-08-01 11:55:08 +01000C7003FE8000,"GORSD",,playable,2020-12-04 22:15:21 +0100E8D007E16000,"Gotcha Racing 2nd",,playable,2020-07-23 17:14:04 +01001010121DE000,"Gothic Murder: Adventure That Changes Destiny",deadlock;crash,ingame,2022-09-30 23:16:53 +01003FF009E60000,"Grab the Bottle",,playable,2020-07-14 17:06:41 +01004D10020F2000,"Graceful Explosion Machine",,playable,2020-05-19 20:36:55 +010038D00EC88000,"Grand Brix Shooter",slow,playable,2020-06-24 13:23:54 +010038100D436000,"Grand Guilds",UE4;nvdec,playable,2021-04-26 12:49:05 +0100BE600D07A000,"Grand Prix Story",,playable,2022-08-01 12:42:23 +05B1D2ABD3D30000,"Grand Theft Auto 3",services;crash;homebrew,nothing,2023-05-01 22:01:58 +0100E0600BBC8000,"GRANDIA HD Collection",crash,boots,2024-08-19 04:29:48 +010028200E132000,"Grass Cutter - Mutated Lawns",slow,ingame,2020-05-19 18:27:42 +010074E0099FA000,"Grave Danger",,playable,2020-05-18 17:41:28 +010054A013E0C000,"GraviFire",,playable,2021-04-05 17:13:32 +01002C2011828000,"Gravity Rider Zero",gpu;vulkan-backend-bug,ingame,2022-09-29 13:56:13 +0100BD800DFA6000,"Greedroid",,playable,2020-12-14 11:14:32 +010068D00AE68000,"GREEN",,playable,2022-08-01 12:54:15 +0100CBB0070EE000,"Green Game: TimeSwapper",nvdec,playable,2021-02-19 18:51:55 +0100DFE00F002000,"GREEN The Life Algorithm",,playable,2022-09-27 21:37:13 +0100DA7013792000,"Grey Skies: A War of the Worlds Story",UE4,playable,2022-10-24 11:13:59 +010031200981C000,"Grid Mania",,playable,2020-05-19 14:11:05 +0100197008B52000,"GRIDD: Retroenhanced",,playable,2020-05-20 11:32:40 +0100DC800A602000,"GRID™ Autosport",nvdec;online-broken;ldn-untested,playable,2023-03-02 20:14:45 +0100B7900B024000,"Grim Fandango Remastered",nvdec,playable,2022-08-01 13:55:58 +010078E012D80000,"Grim Legends 2: Song of the Dark Swan",nvdec,playable,2022-10-18 12:58:45 +010009F011F90000,"Grim Legends: The Forsaken Bride",nvdec,playable,2022-10-18 13:14:06 +01001E200F2F8000,"Grimshade",,playable,2022-10-02 12:44:20 +0100538012496000,"Grindstone",,playable,2023-02-08 15:54:06 +0100459009A2A000,"GRIP",nvdec;online-broken;UE4,playable,2022-08-01 15:00:22 +0100E1700C31C000,"GRIS",nvdec,playable,2021-06-03 13:33:44 +01009D7011B02000,"GRISAIA PHANTOM TRIGGER 01&02",nvdec,playable,2022-12-04 21:16:06 +01005250123B8000,"GRISAIA PHANTOM TRIGGER 03",audout,playable,2021-01-31 12:30:47 +0100D970123BA000,"GRISAIA PHANTOM TRIGGER 04",audout,playable,2021-01-31 12:40:37 +01002330123BC000,"GRISAIA PHANTOM TRIGGER 05",audout;nvdec,playable,2021-01-31 12:49:59 +0100CAF013AE6000,"GRISAIA PHANTOM TRIGGER 5.5",audout;nvdec,playable,2021-01-31 12:59:44 +010091300FFA0000,"Grizzland",gpu,ingame,2024-07-11 16:28:34 +0100EB500D92E000,"GROOVE COASTER WAI WAI PARTY!!!!",nvdec;ldn-broken,playable,2021-11-06 14:54:27 +01007E100456C000,"Guacamelee! 2",,playable,2020-05-15 14:56:59 +0100BAE00B470000,"Guacamelee! Super Turbo Championship Edition",,playable,2020-05-13 23:44:18 +010089900C9FA000,"Guess the Character",,playable,2020-05-20 13:14:19 +01005DC00D80C000,"Guess the word",,playable,2020-07-26 21:34:25 +01006F80082E4000,"GUILTY GEAR XX ACCENT CORE PLUS R",nvdec,playable,2021-01-13 09:28:33 +01003C6008940000,"GUNBIRD for Nintendo Switch",32-bit,playable,2021-06-04 19:16:01 +0100BCB00AE98000,"GUNBIRD2 for Nintendo Switch",,playable,2020-10-10 14:41:16 +01003FF010312000,"Gunka o haita neko",gpu;nvdec,ingame,2020-08-25 12:37:56 +010061000D318000,"Gunman Clive HD Collection",,playable,2020-10-09 12:17:35 +01006D4003BCE000,"Guns, Gore and Cannoli 2",online,playable,2021-01-06 18:43:59 +01008C800E654000,"Gunvolt Chronicles Luminous Avenger iX - Retail Version",,playable,2020-06-16 22:47:07 +0100763015C2E000,"Gunvolt Chronicles: Luminous Avenger iX 2",crash;Needs Update,nothing,2022-04-29 15:34:34 +01002C8018554000,"Gurimugurimoa OnceMore Demo",,playable,2022-07-29 22:07:31 +0100AC601DCA8000,"GYLT",crash,ingame,2024-03-18 20:16:51 +0100c3c012718000,"Grand Theft Auto: III – The Definitive Edition",gpu;UE4,ingame,2022-10-31 20:13:52 +0100182014022000,"Grand Theft Auto: Vice City – The Definitive Edition",gpu;UE4,ingame,2022-10-31 20:13:52 +010065a014024000,"Grand Theft Auto: San Andreas – The Definitive Edition",gpu;UE4,ingame,2022-10-31 20:13:52 +0100822012D76000,"HAAK",gpu,ingame,2023-02-19 14:31:05 +01007E100EFA8000,"Habroxia",,playable,2020-06-16 23:04:42 +0100535012974000,"Hades",vulkan,playable,2022-10-05 10:45:21 +0100618010D76000,"Hakoniwa Explorer Plus",slow,ingame,2021-02-19 16:56:19 +0100E0D00C336000,"Halloween Pinball",,playable,2021-01-12 16:00:46 +01006FF014152000,"Hamidashi Creative",gpu,ingame,2021-12-19 15:30:51 +01003B9007E86000,"Hammerwatch",online-broken;ldn-broken,playable,2022-08-01 16:28:46 +01003620068EA000,"Hand of Fate 2",,playable,2022-08-01 15:44:16 +0100973011358000,"Hang The Kings",,playable,2020-07-28 22:56:59 +010066C018E50000,"Happy Animals Mini Golf",gpu,ingame,2022-12-04 19:24:28 +0100ECE00D13E000,"Hard West",regression,nothing,2022-02-09 07:45:56 +0100D55011D60000,"Hardcore Maze Cube",,playable,2020-12-04 20:01:24 +01002F0011DD4000,"HARDCORE MECHA",slow,playable,2020-11-01 15:06:33 +01000C90117FA000,"HardCube",,playable,2021-05-05 18:33:03 +0100BB600C096000,"Hardway Party",,playable,2020-07-26 12:35:07 +0100D0500AD30000,"Harvest Life",,playable,2022-08-01 16:51:45 +010016B010FDE000,"Harvest Moon®: One World",,playable,2023-05-26 09:17:19 +0100A280187BC000,"Harvestella",UE4;vulkan-backend-bug;mac-bug,playable,2024-02-13 07:04:11 +0100E29001298000,"Has-Been Heroes",,playable,2021-01-13 13:31:48 +01001CC00FA1A000,"Hatsune Miku: Project DIVA Mega Mix",audio;online-broken,playable,2024-01-07 23:12:57 +01009E6014F18000,"Haunted Dawn: The Zombie Apocalypse",,playable,2022-10-28 12:31:51 +010023F008204000,"Haunted Dungeons:Hyakki Castle",,playable,2020-08-12 14:21:48 +0100E2600DBAA000,"Haven",,playable,2021-03-24 11:52:41 +0100EA900FB2C000,"Hayfever",loader-allocator,playable,2022-09-22 17:35:41 +0100EFE00E1DC000,"Headliner: NoviNews",online,playable,2021-03-01 11:36:00 +0100A8200C372000,"Headsnatchers",UE4;crash,menus,2020-07-14 13:29:14 +010067400EA5C000,"Headspun",,playable,2020-07-31 19:46:47 +0100D12008EE4000,"Heart&Slash",,playable,2021-01-13 20:56:32 +010059100D928000,"Heaven Dust",,playable,2020-05-17 14:02:41 +0100FD901000C000,"Heaven's Vault",crash,ingame,2021-02-08 18:22:01 +0100B9C012B66000,"Helheim Hassle",,playable,2020-10-14 11:38:36 +0100E4300C278000,"Hell is Other Demons",,playable,2021-01-13 13:23:02 +01000938017E5C00,"Hell Pie0",nvdec;UE4,playable,2022-11-03 16:48:46 +0100A4600E27A000,"Hell Warders",online,playable,2021-02-27 02:31:03 +010044500CF8E000,"Hellblade: Senua's Sacrifice",gpu;UE4;vulkan-backend-bug;opengl-backend-bug,ingame,2022-08-01 19:36:50 +010087D0084A8000,"Hello Kitty Kruisers With Sanrio Friends",nvdec,playable,2021-06-04 19:08:46 +0100FAA00B168000,"Hello Neighbor",UE4,playable,2022-08-01 21:32:23 +010092B00C4F0000,"Hello Neighbor Hide and Seek",UE4;gpu;slow,ingame,2020-10-24 10:59:57 +010024600C794000,"Hellpoint",,menus,2021-11-26 13:24:20 +0100BEA00E63A000,"Hero Express",nvdec,playable,2020-08-06 13:23:43 +010077D01094C000,"Hero-U: Rogue to Redemption",nvdec,playable,2021-03-24 11:40:01 +0100D2B00BC54000,"Heroes of Hammerwatch - Ultimate Edition",,playable,2022-08-01 18:30:21 +01001B70080F0000,"HEROINE ANTHEM ZERO episode 1",vulkan-backend-bug,playable,2022-08-01 22:02:36 +010057300B0DC000,"Heroki",gpu,ingame,2023-07-30 19:30:01 +0100C2700E338000,"Heroland",,playable,2020-08-05 15:35:39 +01007AC00E012000,"HexaGravity",,playable,2021-05-28 13:47:48 +01004E800F03C000,"Hidden",slow,ingame,2022-10-05 10:56:53 +0100F6A00A684000,"Higurashi no Naku Koro ni Hō",audio,ingame,2021-09-18 14:40:28 +0100F8D0129F4000,"Himehibi 1 gakki - Princess Days",crash,nothing,2021-11-03 08:34:19 +0100F3D008436000,"Hiragana Pixel Party",,playable,2021-01-14 08:36:50 +01004990132AC000,"HITMAN 3 - Cloud Version",Needs Update;crash;services,nothing,2021-04-18 22:35:07 +010083A018262000,"Hitman: Blood Money — Reprisal",deadlock,ingame,2024-09-28 16:28:50 +01004B100A5CC000,"Hob: The Definitive Edition",,playable,2021-01-13 09:39:19 +0100F7300ED2C000,"Hoggy2",,playable,2022-10-10 13:53:35 +0100F7E00C70E000,"Hogwarts Legacy",UE4;slow,ingame,2024-09-03 19:53:58 +0100633007D48000,"Hollow Knight",nvdec,playable,2023-01-16 15:44:56 +0100F2100061E800,"Hollow0",UE4;gpu,ingame,2021-03-03 23:42:56 +0100342009E16000,"Holy Potatoes! What The Hell?!",,playable,2020-07-03 10:48:56 +010071B00C904000,"HoPiKo",,playable,2021-01-13 20:12:38 +010087800EE5A000,"Hopping girl KOHANE Jumping Kingdom: Princess of the Black Rabbit",crash,boots,2023-02-19 00:51:21 +010086D011EB8000,"Horace",,playable,2022-10-10 14:03:50 +0100001019F6E000,"Horizon Chase 2",deadlock;slow;crash;UE4,ingame,2024-08-19 04:24:06 +01009EA00B714000,"Horizon Chase Turbo",,playable,2021-02-19 19:40:56 +0100E4200FA82000,"Horror Pinball Bundle",crash,menus,2022-09-13 22:15:34 +0100017007980000,"Hotel Transylvania 3 Monsters Overboard",nvdec,playable,2021-01-27 18:55:31 +0100D0E00E51E000,"Hotline Miami Collection",nvdec,playable,2022-09-09 16:41:19 +0100BDE008218000,"Hotshot Racing",gpu;nvdec;online-broken;ldn-untested;vulkan-backend-bug,ingame,2024-02-04 21:31:17 +0100CAE00EB02000,"House Flipper",,playable,2021-06-16 18:28:32 +0100F6800910A000,"Hover",online-broken,playable,2022-09-20 12:54:46 +0100A66003384000,"Hulu",online-broken,boots,2022-12-09 10:05:00 +0100701001D92000,"Human Resource Machine",32-bit,playable,2020-12-17 21:47:09 +01000CA004DCA000,"Human: Fall Flat",,playable,2021-01-13 18:36:05 +0100E1A00AF40000,"Hungry Shark® World",,playable,2021-01-13 18:26:08 +0100EBA004726000,"Huntdown",,playable,2021-04-05 16:59:54 +010068000CAC0000,"Hunter's Legacy: Purrfect Edition",,playable,2022-08-02 10:33:31 +0100C460040EA000,"Hunting Simulator",UE4,playable,2022-08-02 10:54:08 +010061F010C3A000,"Hunting Simulator 2",UE4,playable,2022-10-10 14:25:51 +0100B3300B4AA000,"Hyper Jam",UE4;crash,boots,2020-12-15 22:52:11 +01003B200B372000,"Hyper Light Drifter - Special Edition",vulkan-backend-bug,playable,2023-01-13 15:44:48 +01006C500A29C000,"HyperBrawl Tournament",crash;services,boots,2020-12-04 23:03:27 +0100A8B00F0B4000,"HYPERCHARGE Unboxed",nvdec;online-broken;UE4;ldn-untested,playable,2022-09-27 21:52:39 +010061400ED90000,"HyperParasite",nvdec;UE4,playable,2022-09-27 22:05:44 +0100959010466000,"Hypnospace Outlaw",nvdec,ingame,2023-08-02 22:46:49 +01002B00111A2000,"Hyrule Warriors: Age of Calamity",gpu;deadlock;slow;crash;nvdec;amd-vendor-bug,ingame,2024-02-28 00:47:00 +0100A2C01320E000,"Hyrule Warriors: Age of Calamity - Demo Version",slow,playable,2022-10-10 17:37:41 +0100AE00096EA000,"Hyrule Warriors: Definitive Edition",services-horizon;nvdec,ingame,2024-06-16 10:34:05 +0100849000BDA000,"I Am Setsuna",,playable,2021-11-28 11:06:11 +01001860140B0000,"I Saw Black Clouds",nvdec,playable,2021-04-19 17:22:16 +0100429006A06000,"I, Zombie",,playable,2021-01-13 14:53:44 +01004E5007E92000,"Ice Age Scrat's Nutty Adventure!",nvdec,playable,2022-09-13 22:22:29 +010053700A25A000,"Ice Cream Surfer",,playable,2020-07-29 12:04:07 +0100954014718000,"Ice Station Z",crash,menus,2021-11-21 20:02:15 +0100BE9007E7E000,"ICEY",,playable,2021-01-14 16:16:04 +0100BC60099FE000,"Iconoclasts",,playable,2021-08-30 21:11:04 +01001E700EB28000,"Idle Champions of the Forgotten Realms",online,boots,2020-12-17 18:24:57 +01002EC014BCA000,"IdolDays",gpu;crash,ingame,2021-12-19 15:31:28 +01006550129C6000,"If Found...",,playable,2020-12-11 13:43:14 +01001AC00ED72000,"If My Heart Had Wings",,playable,2022-09-29 14:54:57 +01009F20086A0000,"Ikaruga",,playable,2023-04-06 15:00:02 +010040900AF46000,"Ikenfell",,playable,2021-06-16 17:18:44 +01007BC00E55A000,"Immortal Planet",,playable,2022-09-20 13:40:43 +010079501025C000,"Immortal Realms: Vampire Wars",nvdec,playable,2021-06-17 17:41:46 +01000F400435A000,"Immortal Redneck",nvdec,playable,2021-01-27 18:36:28 +01004A600EC0A000,"Immortals Fenyx Rising™",gpu;crash,menus,2023-02-24 16:19:55 +0100737003190000,"IMPLOSION",nvdec,playable,2021-12-12 03:52:13 +0100A760129A0000,"In rays of the Light",,playable,2021-04-07 15:18:07 +0100A2101107C000,"Indie Puzzle Bundle Vol 1",,playable,2022-09-27 22:23:21 +010002A00CD68000,"Indiecalypse",nvdec,playable,2020-06-11 20:19:09 +01001D3003FDE000,"Indivisible",nvdec,playable,2022-09-29 15:20:57 +01002BD00F626000,"Inertial Drift",online-broken,playable,2022-10-11 12:22:19 +0100D4300A4CA000,"Infernium",UE4;regression,nothing,2021-01-13 16:36:07 +010039C001296000,"Infinite Minigolf",online,playable,2020-09-29 12:26:25 +01001CB00EFD6000,"Infliction: Extended Cut",nvdec;UE4,playable,2022-10-02 13:15:55 +0100F1401161E000,"INMOST",,playable,2022-10-05 11:27:40 +0100F200049C8000,"InnerSpace",,playable,2021-01-13 19:36:14 +0100D2D009028000,"INSIDE",,playable,2021-12-25 20:24:56 +0100EC7012D34000,"Inside Grass: A little adventure",,playable,2020-10-15 15:26:27 +010099700D750000,"Instant Sports",,playable,2022-09-09 12:59:40 +010099A011A46000,"Instant Sports Summer Games",gpu,menus,2020-09-02 13:39:28 +010031B0145B8000,"INSTANT SPORTS TENNIS",,playable,2022-10-28 16:42:17 +010041501005E000,"Interrogation: You will be deceived",,playable,2022-10-05 11:40:10 +01000F700DECE000,"Into the Dead 2",nvdec,playable,2022-09-14 12:36:14 +01001D0003B96000,"INVERSUS Deluxe",online-broken,playable,2022-08-02 14:35:36 +0100C5B00FADE000,"Invisible Fist",,playable,2020-08-08 13:25:52 +010031B00C48C000,"Invisible, Inc. Nintendo Switch Edition",crash,nothing,2021-01-29 16:28:13 +01005F400E644000,"Invisigun Reloaded",gpu;online,ingame,2021-06-10 12:13:24 +010041C00D086000,"Ion Fury",vulkan-backend-bug,ingame,2022-08-07 08:27:51 +010095C016C14000,"Iridium",,playable,2022-08-05 23:19:53 +0100AD300B786000,"Iris School of Wizardry -Vinculum Hearts-",,playable,2022-12-05 13:11:15 +0100945012168000,"Iris.Fall",nvdec,playable,2022-10-18 13:40:22 +01005270118D6000,"Iron Wings",slow,ingame,2022-08-07 08:32:57 +01004DB003E6A000,"IRONCAST",,playable,2021-01-13 13:54:29 +0100E5700CD56000,"Irony Curtain: From Matryoshka with Love",,playable,2021-06-04 20:12:37 +010063E0104BE000,"Is It Wrong to Try to Pick Up Girls in a Dungeon? Familia Myth Infinite Combate",,playable,2020-08-31 13:52:21 +0100F06013710000,"ISLAND",,playable,2021-05-06 15:11:47 +010077900440A000,"Island Flight Simulator",,playable,2021-06-04 19:42:46 +0100A2600FCA0000,"Island Saver",nvdec,playable,2020-10-23 22:07:02 +010065200D192000,"Isoland",,playable,2020-07-26 13:48:16 +0100F5600D194000,"Isoland 2 - Ashes of Time",,playable,2020-07-26 14:29:05 +010001F0145A8000,"Isolomus",services,boots,2021-11-03 07:48:21 +010068700C70A000,"ITTA",,playable,2021-06-07 03:15:52 +01004070022F0000,"Ittle Dew 2+",,playable,2020-11-17 11:44:32 +0100DEB00F12A000,"IxSHE Tell",nvdec,playable,2022-12-02 18:00:42 +0100D8E00C874000,"izneo",online-broken,menus,2022-08-06 15:56:23 +0100CD5008D9E000,"James Pond Codename Robocod",,playable,2021-01-13 09:48:45 +01005F4010AF0000,"Japanese Rail Sim: Journey to Kyoto",nvdec,playable,2020-07-29 17:14:21 +010002D00EDD0000,"JDM Racing",,playable,2020-08-03 17:02:37 +0100C2700AEB8000,"Jenny LeClue - Detectivu",crash,nothing,2020-12-15 21:07:07 +01006E400AE2A000,"Jeopardy!®",audout;nvdec;online,playable,2021-02-22 13:53:46 +0100E4900D266000,"Jet Kave Adventure",nvdec,playable,2022-09-09 14:50:39 +0100F3500C70C000,"Jet Lancer",gpu,ingame,2021-02-15 18:15:47 +0100A5A00AF26000,"Jettomero: Hero of the Universe",,playable,2022-08-02 14:46:43 +01008330134DA000,"Jiffy",gpu;opengl,ingame,2024-02-03 23:11:24 +01001F5006DF6000,"Jim is Moving Out!",deadlock,ingame,2020-06-03 22:05:19 +0100F4D00D8BE000,"Jinrui no Ninasama he",crash,ingame,2023-03-07 02:04:17 +010038D011F08000,"Jisei: The First Case HD",audio,playable,2022-10-05 11:43:33 +01007CE00C960000,"Job the Leprechaun",,playable,2020-06-05 12:10:06 +01007090104EC000,"John Wick Hex",,playable,2022-08-07 08:29:12 +01006E4003832000,"Johnny Turbo's Arcade: Bad Dudes",,playable,2020-12-10 12:30:56 +010069B002CDE000,"Johnny Turbo's Arcade: Gate Of Doom",,playable,2022-07-29 12:17:50 +010080D002CC6000,"Johnny Turbo's Arcade: Two Crude Dudes",,playable,2022-08-02 20:29:50 +0100D230069CC000,"Johnny Turbo's Arcade: Wizard Fire",,playable,2022-08-02 20:39:15 +01008120128C2000,"JoJos Bizarre Adventure All-Star Battle R",,playable,2022-12-03 10:45:10 +01008B60117EC000,"Journey to the Savage Planet",nvdec;UE4;ldn-untested,playable,2022-10-02 18:48:12 +0100C7600F654000,"Juicy Realm",,playable,2023-02-21 19:16:20 +0100B4D00C76E000,"JUMANJI: The Video Game",UE4;crash,boots,2020-07-12 13:52:25 +0100183010F12000,"JUMP FORCE - Deluxe Edition",nvdec;online-broken;UE4,playable,2023-10-01 15:56:05 +01003D601014A000,"Jump King",,playable,2020-06-09 10:12:39 +0100B9C012706000,"Jump Rope Challenge",services;crash;Needs Update,boots,2023-02-27 01:24:28 +0100D87009954000,"Jumping Joe & Friends",,playable,2021-01-13 17:09:42 +010069800D2B4000,"JUNK PLANET",,playable,2020-11-09 12:38:33 +0100CE100A826000,"Jurassic Pinball",,playable,2021-06-04 19:02:37 +010050A011344000,"Jurassic World Evolution: Complete Edition",cpu;crash,menus,2023-08-04 18:06:54 +0100BCE000598000,"Just Dance 2017®",online,playable,2021-03-05 09:46:01 +0100BEE017FC0000,"Just Dance 2023",,nothing,2023-06-05 16:44:54 +010075600AE96000,"Just Dance® 2019",gpu;online,ingame,2021-02-27 17:21:27 +0100DDB00DB38000,"Just Dance® 2020",,playable,2022-01-24 13:31:57 +0100EA6014BB8000,"Just Dance® 2022",gpu;services;crash;Needs Update,ingame,2022-10-28 11:01:53 +0100AC600CF0A000,"Just Die Already",UE4,playable,2022-12-13 13:37:50 +01002C301033E000,"Just Glide",,playable,2020-08-07 17:38:10 +0100830008426000,"Just Shapes & Beats",ldn-untested;nvdec,playable,2021-02-09 12:18:36 +010035A0044E8000,"JYDGE",,playable,2022-08-02 21:20:13 +0100D58012FC2000,"Kagamihara/Justice",crash,nothing,2021-06-21 16:41:29 +0100D5F00EC52000,"Kairobotica",,playable,2021-05-06 12:17:56 +0100BDC00A664000,"KAMEN RIDER CLIMAX SCRAMBLE",nvdec;ldn-untested,playable,2024-07-03 08:51:11 +0100A9801180E000,"KAMEN RIDER memory of heroez / Premium Sound Edition",,playable,2022-12-06 03:14:26 +010085300314E000,"KAMIKO",,playable,2020-05-13 12:48:57 +010042C011736000,"Kangokuto Mary Skelter Finale",audio;crash,ingame,2021-01-09 22:39:28 +01007FD00DB20000,"Katakoi Contrast - collection of branch -",nvdec,playable,2022-12-09 09:41:26 +0100D7000C2C6000,"Katamari Damacy REROLL",,playable,2022-08-02 21:35:05 +0100F9800EDFA000,"KATANA KAMI: A Way of the Samurai Story",slow,playable,2022-04-09 10:40:16 +010029600D56A000,"Katana ZERO",,playable,2022-08-26 08:09:09 +010038B00F142000,"Kaze and the Wild Masks",,playable,2021-04-19 17:11:03 +0100D7C01115E000,"Keen: One Girl Army",,playable,2020-12-14 23:19:52 +01008D400A584000,"Keep Talking and Nobody Explodes",,playable,2021-02-15 18:05:21 +01004B100BDA2000,"KEMONO FRIENDS PICROSS",,playable,2023-02-08 15:54:34 +0100A8200B15C000,"Kentucky Robo Chicken",,playable,2020-05-12 20:54:17 +0100327005C94000,"Kentucky Route Zero: TV Edition",,playable,2024-04-09 23:22:46 +0100DA200A09A000,"Kero Blaster",,playable,2020-05-12 20:42:52 +0100F680116A2000,"Kholat",UE4;nvdec,playable,2021-06-17 11:52:48 +0100C0A004C2C000,"Kid Tripp",crash,nothing,2020-10-15 07:41:23 +0100FB400D832000,"KILL la KILL -IF",,playable,2020-06-09 14:47:08 +010011B00910C000,"Kill The Bad Guy",,playable,2020-05-12 22:16:10 +0100F2900B3E2000,"Killer Queen Black",ldn-untested;online,playable,2021-04-08 12:46:18 +010014A00C5E0000,"Kin'iro no Corda Octave",,playable,2020-09-22 13:23:12 +010089000F0E8000,"Kine",UE4,playable,2022-09-14 14:28:37 +0100E6B00FFBA000,"King Lucas",,playable,2022-09-21 19:43:23 +0100B1300783E000,"King Oddball",,playable,2020-05-13 13:47:57 +01008D80148C8000,"King of Seas",nvdec;UE4,playable,2022-10-28 18:29:41 +0100515014A94000,"King of Seas Demo",nvdec;UE4,playable,2022-10-28 18:09:31 +01005D2011EA8000,"KINGDOM HEARTS Melody of Memory",crash;nvdec,ingame,2021-03-03 17:34:12 +0100A280121F6000,"Kingdom Rush",32-bit;crash;Needs More Attention,nothing,2022-10-05 12:34:00 +01005EF003FF2000,"Kingdom Two Crowns",,playable,2020-05-16 19:36:21 +0100BD9004AB6000,"Kingdom: New Lands",,playable,2022-08-02 21:48:50 +0100EF50132BE000,"Kingdoms of Amalur: Re-Reckoning",,playable,2023-08-10 13:05:08 +010091201605A000,"Kirby and the Forgotten Land (Demo version)",demo,playable,2022-08-21 21:03:01 +0100227010460000,"Kirby Fighters™ 2",ldn-works;online,playable,2021-06-17 13:06:39 +0100A8E016236000,"Kirby’s Dream Buffet™",crash;online-broken;Needs Update;ldn-works,ingame,2024-03-03 17:04:44 +010091D01A57E000,"Kirby’s Return to Dream Land Deluxe - Demo",demo,playable,2023-02-18 17:21:55 +01006B601380E000,"Kirby’s Return to Dream Land™ Deluxe",,playable,2024-05-16 19:58:04 +01004D300C5AE000,"Kirby™ and the Forgotten Land",gpu,ingame,2024-03-11 17:11:21 +01007E3006DDA000,"Kirby™ Star Allies",nvdec,playable,2023-11-15 17:06:19 +0100F3A00F4CA000,"Kissed by the Baddest Bidder",gpu;nvdec,ingame,2022-12-04 20:57:11 +01000C900A136000,"Kitten Squad",nvdec,playable,2022-08-03 12:01:59 +010079D00C8AE000,"Klondike Solitaire",,playable,2020-12-13 16:17:27 +0100A6800DE70000,"Knight Squad",,playable,2020-08-09 16:54:51 +010024B00E1D6000,"Knight Squad 2",nvdec;online-broken,playable,2022-10-28 18:38:09 +0100D51006AAC000,"Knight Terrors",,playable,2020-05-13 13:09:22 +01005F8010D98000,"Knightin'+",,playable,2020-08-31 18:18:21 +010004400B22A000,"Knights of Pen & Paper 2 Deluxiest Edition",,playable,2020-05-13 14:07:00 +0100D3F008746000,"Knights of Pen and Paper +1 Deluxier Edition",,playable,2020-05-11 21:46:32 +010001A00A1F6000,"Knock-Knock",nvdec,playable,2021-02-01 20:03:19 +01009EF00DDB4000,"Knockout City™",services;online-broken,boots,2022-12-09 09:48:58 +0100C57019BA2000,"Koa and the Five Pirates of Mara",gpu,ingame,2024-07-11 16:14:44 +01001E500401C000,"Koi DX",,playable,2020-05-11 21:37:51 +010052300F612000,"Koi no Hanasaku Hyakkaen",32-bit;gpu;nvdec,ingame,2020-10-03 14:17:10 +01005D200C9AA000,"Koloro",,playable,2022-08-03 12:34:02 +0100464009294000,"Kona",,playable,2022-08-03 12:48:19 +010016C011AAA000,"Kono Subarashii Sekai ni Shukufuku o Kono Yokubo no Isho ni Choai o",,playable,2023-04-26 09:51:08 +010088500D5EE000,"KORAL",UE4;crash;gpu,menus,2020-11-16 12:41:26 +0100EC8004762000,"KORG Gadget for Nintendo Switch",,playable,2020-05-13 13:57:24 +010046600CCA4000,"Kotodama: The 7 Mysteries of Fujisawa",audout,playable,2021-02-01 20:28:37 +010022801242C000,"KukkoroDays",crash,menus,2021-11-25 08:52:56 +010035A00DF62000,"KUNAI",nvdec,playable,2022-09-20 13:48:34 +010060400ADD2000,"Kunio-Kun: The World Classics Collection",online,playable,2021-01-29 20:21:46 +010037500F282000,"KUUKIYOMI 2: Consider It More! - New Era",crash;Needs Update,nothing,2021-11-02 09:34:40 +0100894011F62000,"Kwaidan ~Azuma manor story~",,playable,2022-10-05 12:50:44 +0100830004FB6000,"L.A. Noire",,playable,2022-08-03 16:49:35 +0100732009CAE000,"L.F.O. -Lost Future Omega-",UE4;deadlock,boots,2020-10-16 12:16:44 +0100F2B0123AE000,"L.O.L. Surprise! Remix: We Rule The World",,playable,2022-10-11 22:48:03 +010026000F662800,"LA-MULANA",gpu,ingame,2022-08-12 01:06:21 +0100E5D00F4AE000,"LA-MULANA 1 & 2",,playable,2022-09-22 17:56:36 +010038000F644000,"LA-MULANA 2",,playable,2022-09-03 13:45:57 +010058500B3E0000,"Labyrinth of Refrain: Coven of Dusk",,playable,2021-02-15 17:38:48 +010022D0089AE000,"Labyrinth of the Witch",,playable,2020-11-01 14:42:37 +0100BAB00E8C0000,"Langrisser I & II",,playable,2021-02-19 15:46:10 +0100E7200B272000,"Lanota",,playable,2019-09-04 01:58:14 +01005E000D3D8000,"Lapis x Labyrinth",,playable,2021-02-01 18:58:08 +0100AFE00E882000,"Laraan",,playable,2020-12-16 12:45:48 +0100DA700879C000,"Last Day of June",nvdec,playable,2021-06-08 11:35:32 +01009E100BDD6000,"LASTFIGHT",,playable,2022-09-20 13:54:55 +0100055007B86000,"Late Shift",nvdec,playable,2021-02-01 18:43:58 +01004EB00DACE000,"Later Daters Part One",,playable,2020-07-29 16:35:45 +01001730144DA000,"Layers of Fear 2",nvdec;UE4,playable,2022-10-28 18:49:52 +0100BF5006A7C000,"Layers of Fear: Legacy",nvdec,playable,2021-02-15 16:30:41 +0100CE500D226000,"Layton's Mystery Journey: Katrielle and the Millionaires' Conspiracy - Deluxe Edition",nvdec;opengl,playable,2022-09-14 15:01:57 +0100FDB00AA80000,"Layton's Mystery Journey: Katrielle and the Millionaires' Conspiracy DX+0",gpu;nvdec;opengl,ingame,2022-09-14 15:15:55 +01009C100390E000,"League of Evil",online,playable,2021-06-08 11:23:27 +01002E900CD6E000,"Left-Right : The Mansion",,playable,2020-05-13 13:02:12 +010079901C898000,"Legacy of Kain™ Soul Reaver 1&2 Remastered",,playable,2025-01-07 05:50:01 +01002DB007A96000,"Legend of Kay Anniversary",nvdec,playable,2021-01-29 18:38:29 +0100ECC00EF3C000,"Legend of the Skyfish",,playable,2020-06-24 13:04:22 +01007E900DFB6000,"Legend of the Tetrarchs",deadlock,ingame,2020-07-10 07:54:03 +0100A73006E74000,"Legendary Eleven",,playable,2021-06-08 12:09:03 +0100A7700B46C000,"Legendary Fishing",online,playable,2021-04-14 15:08:46 +0100739018020000,"LEGO® 2K Drive",gpu;ldn-works,ingame,2024-04-09 02:05:12 +010085500130a000,"LEGO® CITY Undercover",nvdec,playable,2024-09-30 08:44:27 +010070D009FEC000,"LEGO® DC Super-Villains",,playable,2021-05-27 18:10:37 +010052A00B5D2000,"LEGO® Harry Potter™ Collection",crash,ingame,2024-01-31 10:28:07 +010073C01AF34000,"LEGO® Horizon Adventures™",vulkan-backend-bug;opengl-backend-bug;UE4,ingame,2025-01-07 04:24:56 +01001C100E772000,"LEGO® Jurassic World",,playable,2021-05-27 17:00:20 +0100D3A00409E000,"LEGO® Marvel Super Heroes 2",crash,nothing,2023-03-02 17:12:33 +01006F600FFC8000,"LEGO® Marvel™ Super Heroes",,playable,2024-09-10 19:02:19 +01007FC00206E000,"LEGO® NINJAGO® Movie Video Game",crash,nothing,2022-08-22 19:12:53 +010042D00D900000,"LEGO® Star Wars™: The Skywalker Saga",gpu;slow,ingame,2024-04-13 20:08:46 +0100A01006E00000,"LEGO® The Incredibles",crash,nothing,2022-08-03 18:36:59 +0100838002AEA000,"LEGO® Worlds",crash;slow,ingame,2020-07-17 13:35:39 +0100E7500BF84000,"LEGRAND LEGACY: Tale of the Fatebounds",nvdec,playable,2020-07-26 12:27:36 +0100A8E00CAA0000,"Leisure Suit Larry - Wet Dreams Don't Dry",,playable,2022-08-03 19:51:44 +010031A0135CA000,"Leisure Suit Larry - Wet Dreams Dry Twice",,playable,2022-10-28 19:00:57 +01003AB00983C000,"Lethal League Blaze",online,playable,2021-01-29 20:13:31 +01008C300648E000,"Letter Quest Remastered",,playable,2020-05-11 21:30:34 +0100CE301678E800,"Letters - a written adventure",gpu,ingame,2023-02-21 20:12:38 +01009A200BE42000,"Levelhead",online,ingame,2020-10-18 11:44:51 +0100C960041DC000,"Levels+ : Addictive Puzzle Game",,playable,2020-05-12 13:51:39 +0100C8000F146000,"Liberated",gpu;nvdec,ingame,2024-07-04 04:58:24 +01003A90133A6000,"Liberated: Enhanced Edition",gpu;nvdec,ingame,2024-07-04 04:48:48 +01004360045C8000,"Lichtspeer: Double Speer Edition",,playable,2020-05-12 16:43:09 +010041F0128AE000,"Liege Dragon",,playable,2022-10-12 10:27:03 +010006300AFFE000,"Life Goes On",,playable,2021-01-29 19:01:20 +0100FD101186C000,"Life is Strange 2",UE4,playable,2024-07-04 05:05:58 +0100DC301186A000,"Life is Strange Remastered",UE4,playable,2022-10-03 16:54:44 +010008501186E000,"Life is Strange: Before the Storm Remastered",,playable,2023-09-28 17:15:44 +0100500012AB4000,"Life is Strange: True Colors™",gpu;UE4,ingame,2024-04-08 16:11:52 +01003AB012F00000,"Life of Boris: Super Slav",,ingame,2020-12-17 11:40:05 +0100B3A0135D6000,"Life of Fly",,playable,2021-01-25 23:41:07 +010069A01506E000,"Life of Fly 2",slow,playable,2022-10-28 19:26:52 +01005B6008132000,"Lifeless Planet: Premiere Edition",,playable,2022-08-03 21:25:13 +010030A006F6E000,"Light Fall",nvdec,playable,2021-01-18 14:55:36 +010087700D07C000,"Light Tracer",nvdec,playable,2021-05-05 19:15:43 +01009C8009026000,"LIMBO",cpu;32-bit,boots,2023-06-28 15:39:19 +0100EDE012B58000,"Linelight",,playable,2020-12-17 12:18:07 +0100FAD00E65E000,"Lines X",,playable,2020-05-11 15:28:30 +010032F01096C000,"Lines XL",,playable,2020-08-31 17:48:23 +0100943010310000,"Little Busters! Converted Edition",nvdec,playable,2022-09-29 15:34:56 +0100A3F009142000,"Little Dragons Café",,playable,2020-05-12 00:00:52 +010079A00D9E8000,"Little Friends: Dogs & Cats",,playable,2020-11-12 12:45:51 +0100B18001D8E000,"Little Inferno",32-bit;gpu;nvdec,ingame,2020-12-17 21:43:56 +0100E7000E826000,"Little Misfortune",nvdec,playable,2021-02-23 20:39:44 +0100FE0014200000,"Little Mouse's Encyclopedia",,playable,2022-10-28 19:38:58 +01002FC00412C000,"Little Nightmares Complete Edition",nvdec;UE4,playable,2022-08-03 21:45:35 +010097100EDD6000,"Little Nightmares II",UE4,playable,2023-02-10 18:24:44 +010093A0135D6000,"Little Nightmares II DEMO",UE4;demo;vulkan-backend-bug,playable,2024-05-16 18:47:20 +0100535014D76000,"Little Noah: Scion of Paradise",opengl-backend-bug,playable,2022-09-14 04:17:13 +0100E6D00E81C000,"Little Racer",,playable,2022-10-18 16:41:13 +0100DD700D95E000,"Little Shopping",,playable,2020-10-03 16:34:35 +01000FB00AA90000,"Little Town Hero",,playable,2020-10-15 23:28:48 +01000690085BE000,"Little Triangle",,playable,2020-06-17 14:46:26 +0100CF801776C000,"LIVE A LIVE",UE4;amd-vendor-bug,playable,2023-02-05 15:12:07 +0100BA000FC9C000,"LocO-SportS",,playable,2022-09-20 14:09:30 +010016C009374000,"Lode Runner Legacy",,playable,2021-01-10 14:10:28 +0100D2C013288000,"Lofi Ping Pong",crash,ingame,2020-12-15 20:09:22 +0100B6D016EE6000,"Lone Ruin",crash;nvdec,ingame,2023-01-17 06:41:19 +0100A0C00E0DE000,"Lonely Mountains: Downhill",online-broken,playable,2024-07-04 05:08:11 +010062A0178A8000,"LOOPERS",gpu;slow;crash,ingame,2022-06-17 19:21:45 +010064200F7D8000,"Lost Horizon",,playable,2020-09-01 13:41:22 +01005ED010642000,"Lost Horizon 2",nvdec,playable,2020-06-16 12:02:12 +01005FE01291A000,"Lost in Random™",gpu,ingame,2022-12-18 07:09:28 +0100133014510000,"Lost Lands 2: The Four Horsemen",nvdec,playable,2022-10-24 16:41:00 +0100156014C6A000,"Lost Lands 3: The Golden Curse",nvdec,playable,2022-10-24 16:30:00 +0100BDD010AC8000,"Lost Lands: Dark Overlord",,playable,2022-10-03 11:52:58 +010054600AC74000,"LOST ORBIT: Terminal Velocity",,playable,2021-06-14 12:21:12 +010046600B76A000,"Lost Phone Stories",services,ingame,2020-04-05 23:17:33 +01008AD013A86800,"Lost Ruins",gpu,ingame,2023-02-19 14:09:00 +010077B0038B2000,"LOST SPHEAR",,playable,2021-01-10 06:01:21 +0100018013124000,"Lost Words: Beyond the Page",,playable,2022-10-24 17:03:21 +0100D36011AD4000,"Love Letter from Thief X",gpu;nvdec,ingame,2023-11-14 03:55:31 +0100F0300B7BE000,"Ludomania",crash;services,nothing,2020-04-03 00:33:47 +010048701995E000,"Luigi's Mansion™ 2 HD",ldn-broken;amd-vendor-bug,ingame,2024-09-05 23:47:27 +0100DCA0064A6000,"Luigi’s Mansion™ 3",gpu;slow;Needs Update;ldn-works,ingame,2024-09-27 22:17:36 +010052B00B194000,"Lumini",,playable,2020-08-09 20:45:09 +0100FF00042EE000,"Lumo",nvdec,playable,2022-02-11 18:20:30 +0100F3100EB44000,"Lust for Darkness",nvdec,playable,2020-07-26 12:09:15 +0100F0B00F68E000,"Lust for Darkness: Dawn Edition",nvdec,playable,2021-06-16 13:47:46 +0100EC2011A80000,"Luxar",,playable,2021-03-04 21:11:57 +0100F2400D434000,"MachiKnights -Blood bagos-",nvdec;UE4,playable,2022-09-14 15:08:04 +010024A009428000,"Mad Carnage",,playable,2021-01-10 13:00:07 +01005E7013476000,"Mad Father",,playable,2020-11-12 13:22:10 +010061E00EB1E000,"Mad Games Tycoon",,playable,2022-09-20 14:23:14 +01004A200E722000,"Magazine Mogul",loader-allocator,playable,2022-10-03 12:05:34 +01008E500BF62000,"MagiCat",,playable,2020-12-11 15:22:07 +010032C011356000,"Magicolors",,playable,2020-08-12 18:39:11 +01008C300B624000,"Mahjong Solitaire Refresh",crash,boots,2022-12-09 12:02:55 +010099A0145E8000,"Mahluk dark demon",,playable,2021-04-15 13:14:24 +01001C100D80E000,"Mainlining",,playable,2020-06-05 01:02:00 +0100D9900F220000,"Maitetsu:Pure Station",,playable,2022-09-20 15:12:49 +0100A78017BD6000,"Makai Senki Disgaea 7",,playable,2023-10-05 00:22:18 +01005A700CC3C000,"Mana Spark",,playable,2020-12-10 13:41:01 +010093D00CB22000,"Maneater",nvdec;UE4,playable,2024-05-21 16:11:57 +0100361009B1A000,"Manifold Garden",,playable,2020-10-13 20:27:13 +0100C9A00952A000,"Manticore - Galaxy on Fire",crash;nvdec,boots,2024-02-04 04:37:24 +0100E98002F6E000,"Mantis Burn Racing",online-broken;ldn-broken,playable,2024-09-02 02:13:04 +01008E800D1FE000,"Marble Power Blast",,playable,2021-06-04 16:00:02 +01001B2012D5E000,"Märchen Forest",,playable,2021-02-04 21:33:34 +0100DA7017C9E000,"Marco & The Galaxy Dragon Demo",gpu;demo,ingame,2023-06-03 13:05:33 +01006D0017F7A000,"Mario & Luigi: Brothership",crash;slow;UE4;mac-bug,ingame,2025-01-07 04:00:00 +010002C00C270000,"MARIO & SONIC AT THE OLYMPIC GAMES TOKYO 2020",crash;online-broken;ldn-works,ingame,2024-08-23 16:12:55 +0100317013770000,"MARIO + RABBIDS SPARKS OF HOPE",gpu;Needs Update,ingame,2024-06-20 19:56:19 +010067300059A000,"Mario + Rabbids® Kingdom Battle",slow;opengl-backend-bug,playable,2024-05-06 10:16:54 +0100C9C00E25C000,"Mario Golf™: Super Rush",gpu,ingame,2024-08-18 21:31:48 +0100ED100BA3A000,"Mario Kart Live: Home Circuit™",services;crash;Needs More Attention,nothing,2022-12-07 22:36:52 +0100152000022000,"Mario Kart™ 8 Deluxe",32-bit;ldn-works;LAN;amd-vendor-bug,playable,2024-09-19 11:55:17 +01006FE013472000,"Mario Party™ Superstars",gpu;ldn-works;mac-bug,ingame,2024-05-16 11:23:34 +010019401051C000,"Mario Strikers™: Battle League",crash;nvdec,boots,2024-05-07 06:23:56 +0100BDE00862A000,"Mario Tennis™ Aces",gpu;nvdec;ldn-works;LAN,ingame,2024-09-28 15:54:40 +0100B99019412000,"Mario vs. Donkey Kong™",,playable,2024-05-04 21:22:39 +0100D9E01DBB0000,"Mario vs. Donkey Kong™ Demo",,playable,2024-02-18 10:40:06 +01009A700A538000,"Mark of the Ninja: Remastered",,playable,2022-08-04 15:48:30 +010044600FDF0000,"Marooners",nvdec;online-broken,playable,2022-10-18 21:35:26 +010060700AC50000,"MARVEL ULTIMATE ALLIANCE 3: The Black Order",nvdec;ldn-untested,playable,2024-02-14 19:51:51 +01003DE00C95E000,"Mary Skelter 2",crash;regression,ingame,2023-09-12 07:37:28 +0100113008262000,"Masquerada: Songs and Shadows",,playable,2022-09-20 15:18:54 +01004800197F0000,"Master Detective Archives: Rain Code",gpu,ingame,2024-04-19 20:11:09 +0100CC7009196000,"Masters of Anima",nvdec,playable,2022-08-04 16:00:09 +01004B100A1C4000,"MathLand",,playable,2020-09-01 15:40:06 +0100A8C011F26000,"Max and the book of chaos",,playable,2020-09-02 12:24:43 +01001C9007614000,"Max: The Curse of Brotherhood",nvdec,playable,2022-08-04 16:33:04 +0100E8B012FBC000,"Maze",,playable,2020-12-17 16:13:58 +0100EEF00CBC0000,"MEANDERS",UE4;gpu,ingame,2021-06-11 19:19:33 +0100EC000CE24000,"Mech Rage",,playable,2020-11-18 12:30:16 +0100C4F005EB4000,"Mecho Tales",,playable,2022-08-04 17:03:19 +0100E4600D31A000,"Mechstermination Force",,playable,2024-07-04 05:39:15 +01007580124C0000,"Medarot Classics Plus Kabuto Ver",,playable,2020-11-21 11:31:18 +0100228012682000,"Medarot Classics Plus Kuwagata Ver",,playable,2020-11-21 11:30:40 +0100BBC00CB9A000,"Mega Mall Story",slow,playable,2022-08-04 17:10:58 +0100B0C0086B0000,"Mega Man 11",,playable,2021-04-26 12:07:53 +010038E016264000,"Mega Man Battle Network Legacy Collection Vol. 1",,playable,2023-04-25 03:55:57 +0100734016266000,"Mega Man Battle Network Legacy Collection Vol. 2",,playable,2023-08-03 18:04:32 +01002D4007AE0000,"Mega Man Legacy Collection",gpu,ingame,2021-06-03 18:17:17 +0100842008EC4000,"Mega Man Legacy Collection 2",,playable,2021-01-06 08:47:59 +01005C60086BE000,"Mega Man X Legacy Collection",audio;crash;services,menus,2020-12-04 04:30:17 +010025C00D410000,"Mega Man Zero/ZX Legacy Collection",,playable,2021-06-14 16:17:32 +0100FC700F942000,"Megabyte Punch",,playable,2020-10-16 14:07:18 +010006F011220000,"Megadimension Neptunia VII",32-bit;nvdec,playable,2020-12-17 20:56:03 +010082B00E8B8000,"Megaquarium",,playable,2022-09-14 16:50:00 +010005A00B312000,"Megaton Rainfall",gpu;opengl,boots,2022-08-04 18:29:43 +0100EA100DF92000,"Meiji Katsugeki Haikara Ryuuseigumi - Seibai Shimaseu, Yonaoshi Kagyou",32-bit;nvdec,playable,2022-12-05 13:19:12 +0100B360068B2000,"Mekorama",gpu,boots,2021-06-17 16:37:21 +010012301932A000,"Melatonin",,playable,2025-02-16 04:08:17 +01000FA010340000,"Melbits World",nvdec;online,menus,2021-11-26 13:51:22 +0100F68019636000,"Melon Journey",,playable,2023-04-23 21:20:01 +010079C012896000,"Memories Off -Innocent Fille- for Dearest",,playable,2020-08-04 07:31:22 +010062F011E7C000,"Memory Lane",UE4,playable,2022-10-05 14:31:03 +0100EBE00D5B0000,"Meow Motors",UE4;gpu,ingame,2020-12-18 00:24:01 +0100273008FBC000,"Mercenaries Saga Chronicles",,playable,2021-01-10 12:48:19 +010094500C216000,"Mercenaries Wings: The False Phoenix",crash;services,nothing,2020-05-08 22:42:12 +0100F900046C4000,"Mercenary Kings: Reloaded Edition",online,playable,2020-10-16 13:05:58 +0100E5000D3CA000,"Merchants of Kaidan",,playable,2021-04-15 11:44:28 +01009A500D4A8000,"METAGAL",,playable,2020-06-05 00:05:48 +010047F01AA10000,"METAL GEAR SOLID 3: Snake Eater - Master Collection Version",services-horizon,menus,2024-07-24 06:34:06 +0100E8F00F6BE000,"METAL MAX Xeno Reborn",,playable,2022-12-05 15:33:53 +01002DE00E5D0000,"Metaloid: Origin",,playable,2020-06-04 20:26:35 +010055200E87E000,"Metamorphosis",UE4;audout;gpu;nvdec,ingame,2021-06-16 16:18:11 +0100D4900E82C000,"Metro 2033 Redux",gpu,ingame,2022-11-09 10:53:13 +0100F0400E850000,"Metro: Last Light Redux",slow;nvdec;vulkan-backend-bug,ingame,2023-11-01 11:53:52 +010012101468C000,"Metroid Prime™ Remastered",gpu;Needs Update;vulkan-backend-bug;opengl-backend-bug,ingame,2024-05-07 22:48:15 +010093801237C000,"Metroid™ Dread",,playable,2023-11-13 04:02:36 +0100A1200F20C000,"Midnight Evil",,playable,2022-10-18 22:55:19 +0100C1E0135E0000,"Mighty Fight Federation",online,playable,2021-04-06 18:39:56 +0100AD701344C000,"Mighty Goose",nvdec,playable,2022-10-28 20:25:38 +01000E2003FA0000,"MIGHTY GUNVOLT BURST",,playable,2020-10-19 16:05:49 +010060D00AE36000,"Mighty Switch Force! Collection",,playable,2022-10-28 20:40:32 +01003DA010E8A000,"Miitopia™",gpu;services-horizon,ingame,2024-09-06 10:39:13 +01007DA0140E8000,"Miitopia™ Demo",services;crash;demo,menus,2023-02-24 11:50:58 +01004B7009F00000,"Miles & Kilo",,playable,2020-10-22 11:39:49 +0100976008FBE000,"Millie",,playable,2021-01-26 20:47:19 +0100F5700C9A8000,"MIND: Path to Thalamus",UE4,playable,2021-06-16 17:37:25 +0100D71004694000,"Minecraft",crash;ldn-broken,ingame,2024-09-29 12:08:59 +01006C100EC08000,"Minecraft Dungeons",nvdec;online-broken;UE4,playable,2024-06-26 22:10:43 +01007C6012CC8000,"Minecraft Legends",gpu;crash,ingame,2024-03-04 00:32:24 +01006BD001E06000,"Minecraft: Nintendo Switch Edition",ldn-broken,playable,2023-10-15 01:47:08 +01003EF007ABA000,"Minecraft: Story Mode - Season Two",online-broken,playable,2023-03-04 00:30:50 +010059C002AC2000,"Minecraft: Story Mode - The Complete Adventure",crash;online-broken,boots,2022-08-04 18:56:58 +0100B7500F756000,"Minefield",,playable,2022-10-05 15:03:29 +01003560119A6000,"Mini Motor Racing X",,playable,2021-04-13 17:54:49 +0100FB700DE1A000,"Mini Trains",,playable,2020-07-29 23:06:20 +010039200EC66000,"Miniature - The Story Puzzle",UE4,playable,2022-09-14 17:18:50 +010069200EB80000,"Ministry of Broadcast",,playable,2022-08-10 00:31:16 +0100C3F000BD8000,"Minna de Wai Wai! Spelunker",crash,nothing,2021-11-03 07:17:11 +0100FAE010864000,"Minoria",,playable,2022-08-06 18:50:50 +01005AB015994000,"Miss Kobayashi's Dragonmaid Burst Forth!! Choro-gon☆Breath",gpu,playable,2022-03-28 02:22:24 +0100CFA0138C8000,"Missile Dancer",,playable,2021-01-31 12:22:03 +0100E3601495C000,"Missing Features: 2D",,playable,2022-10-28 20:52:54 +010059200CC40000,"Mist Hunter",,playable,2021-06-16 13:58:58 +0100F65011E52000,"Mittelborg: City of Mages",,playable,2020-08-12 19:58:06 +0100876015D74000,"MLB® The Show™ 22",gpu;slow,ingame,2023-04-25 06:28:43 +0100A9F01776A000,"MLB® The Show™ 22 Tech Test",services;crash;Needs Update;demo,nothing,2022-12-09 10:28:34 +0100913019170000,"MLB® The Show™ 23",gpu,ingame,2024-07-26 00:56:50 +0100E2E01C32E000,"MLB® The Show™ 24",services-horizon,nothing,2024-03-31 04:54:11 +010011300F74C000,"MO:Astray",crash,ingame,2020-12-11 21:45:44 +010020400BDD2000,"Moai VI: Unexpected Guests",slow,playable,2020-10-27 16:40:20 +0100D8700B712000,"Modern Combat Blackout",crash,nothing,2021-03-29 19:47:15 +010004900D772000,"Modern Tales: Age of Invention",slow,playable,2022-10-12 11:20:19 +0100B8500D570000,"Moero Chronicle™ Hyper",32-bit,playable,2022-08-11 07:21:56 +01004EB0119AC000,"Moero Crystal H",32-bit;nvdec;vulkan-backend-bug,playable,2023-07-05 12:04:22 +0100B46017500000,"MOFUMOFUSENSEN",gpu,menus,2024-09-21 21:51:08 +01004A400C320000,"Momodora: Reverie Under the Moonlight",deadlock,nothing,2022-02-06 03:47:43 +01002CC00BC4C000,"Momonga Pinball Adventures",,playable,2022-09-20 16:00:40 +010093100DA04000,"Momotaro Dentetsu Showa, Heisei, Reiwa mo Teiban!",gpu,ingame,2023-09-22 10:21:46 +0100FBD00ED24000,"MONKEY BARRELS",,playable,2022-09-14 17:28:52 +01004C500B8E0000,"Monkey King: Master of the Clouds",,playable,2020-09-28 22:35:48 +01003030161DC000,"Monomals",gpu,ingame,2024-08-06 22:02:51 +0100F3A00FB78000,"Mononoke Slashdown",crash,menus,2022-05-04 20:55:47 +01007430037F6000,"MONOPOLY® for Nintendo Switch™",nvdec;online-broken,playable,2024-02-06 23:13:01 +01005FF013DC2000,"MONOPOLY® Madness",,playable,2022-01-29 21:13:52 +0100E2D0128E6000,"Monster Blast",gpu,ingame,2023-09-02 20:02:32 +01006F7001D10000,"Monster Boy and the Cursed Kingdom",nvdec,playable,2022-08-04 20:06:32 +01005FC01000E000,"Monster Bugs Eat People",,playable,2020-07-26 02:05:34 +0100742007266000,"Monster Energy Supercross - The Official Videogame",nvdec;UE4,playable,2022-08-04 20:25:00 +0100F8100B982000,"Monster Energy Supercross - The Official Videogame 2",nvdec;UE4;ldn-untested,playable,2022-08-04 21:21:24 +010097800EA20000,"Monster Energy Supercross - The Official Videogame 3",UE4;audout;nvdec;online,playable,2021-06-14 12:37:54 +0100E9900ED74000,"Monster Farm",32-bit;nvdec,playable,2021-05-05 19:29:13 +0100770008DD8000,"Monster Hunter Generations Ultimate™",32-bit;online-broken;ldn-works,playable,2024-03-18 14:35:36 +0100B04011742000,"Monster Hunter Rise",gpu;slow;crash;nvdec;online-broken;Needs Update;ldn-works,ingame,2024-08-24 11:04:59 +010093A01305C000,"Monster Hunter Rise Demo",online-broken;ldn-works;demo,playable,2022-10-18 23:04:17 +0100E21011446000,"Monster Hunter Stories 2: Wings of Ruin",services,ingame,2022-07-10 19:27:30 +010042501329E000,"MONSTER HUNTER STORIES 2: WINGS OF RUIN Trial Version",demo,playable,2022-11-13 22:20:26 +0100C51003B46000,"Monster Hunter XX Demo",32-bit;cpu,nothing,2020-03-22 10:12:28 +0100C3800049C000,"Monster Hunter XX Nintendo Switch Ver ( Double Cross )",,playable,2024-07-21 14:08:09 +010088400366E000,"Monster Jam Crush It!",UE4;nvdec;online,playable,2021-04-08 19:29:27 +010095C00F354000,"Monster Jam Steel Titans",crash;nvdec;UE4,menus,2021-11-14 09:45:38 +010051B0131F0000,"Monster Jam Steel Titans 2",nvdec;UE4,playable,2022-10-24 17:17:59 +01004DE00DD44000,"Monster Puzzle",,playable,2020-09-28 22:23:10 +0100A0F00DA68000,"Monster Sanctuary",crash,ingame,2021-04-04 05:06:41 +0100D30010C42000,"Monster Truck Championship",slow;nvdec;online-broken;UE4,playable,2022-10-18 23:16:51 +01004E10142FE000,"Monster wo taoshite tsuyoi ken ya yoroi wo te ni shinasai. Shinde mo akiramezu ni tsuyoku nari nasai. Yuushatai ga maoh wo taosu sono hi wo shinzite imasu. - モンスターを倒して強い剣や鎧を手にしなさい。死んでも諦めずに強くなりなさい。勇者隊が魔王を倒すその日を信じています。",crash,ingame,2021-07-23 10:56:44 +010039F00EF70000,"Monstrum",,playable,2021-01-31 11:07:26 +0100C2E00B494000,"Moonfall Ultimate",nvdec,playable,2021-01-17 14:01:25 +0100E3D014ABC000,"Moorhuhn Jump and Run 'Traps and Treasures'",,playable,2024-03-08 15:10:02 +010045C00F274000,"Moorhuhn Kart 2",online-broken,playable,2022-10-28 21:10:35 +010040E00F642000,"Morbid: The Seven Acolytes",,playable,2022-08-09 17:21:58 +01004230123E0000,"More Dark",,playable,2020-12-15 16:01:06 +01005DA003E6E000,"Morphies Law",UE4;crash;ldn-untested;nvdec;online,menus,2020-11-22 17:05:29 +0100776003F0C000,"Morphite",,playable,2021-01-05 19:40:55 +0100F2200C984000,"Mortal Kombat 11",slow;nvdec;online-broken;ldn-broken,ingame,2024-06-19 02:22:17 +01006560184E6000,"Mortal Kombat™ 1",gpu,ingame,2024-09-04 15:45:47 +010032800D740000,"Mosaic",,playable,2020-08-11 13:07:35 +01002ED00B01C000,"Moto Racer 4",UE4;nvdec;online,playable,2021-04-08 19:09:11 +01003F200D0F2000,"Moto Rush GT",,playable,2022-08-05 11:23:55 +0100361007268000,"MotoGP™18",nvdec;UE4;ldn-untested,playable,2022-08-05 11:41:45 +01004B800D0E8000,"MotoGP™19",nvdec;online-broken;UE4,playable,2022-08-05 11:54:14 +01001FA00FBBC000,"MotoGP™20",ldn-untested,playable,2022-09-29 17:58:01 +01000F5013820000,"MotoGP™21",gpu;nvdec;online-broken;UE4;ldn-untested,ingame,2022-10-28 21:35:08 +010040401D564000,"MotoGP™24",gpu,ingame,2024-05-10 23:41:00 +01002A900D6D6000,"Motorsport Manager for Nintendo Switch™",nvdec,playable,2022-08-05 12:48:14 +01009DB00D6E0000,"Mountain Rescue Simulator",,playable,2022-09-20 16:36:48 +0100C4C00E73E000,"Moving Out",nvdec,playable,2021-06-07 21:17:24 +0100D3300F110000,"Mr Blaster",,playable,2022-09-14 17:56:24 +0100DCA011262000,"Mr. DRILLER DrillLand",nvdec,playable,2020-07-24 13:56:48 +010031F002B66000,"Mr. Shifty",slow,playable,2020-05-08 15:28:16 +01005EF00B4BC000,"Ms. Splosion Man",online,playable,2020-05-09 20:45:43 +010087C009246000,"Muddledash",services,ingame,2020-05-08 16:46:14 +01009D200952E000,"MudRunner - American Wilds",gpu;ldn-untested;vulkan-backend-bug;opengl-backend-bug,ingame,2022-08-16 11:40:52 +010073E008E6E000,"Mugsters",,playable,2021-01-28 17:57:17 +0100A8400471A000,"MUJO",,playable,2020-05-08 16:31:04 +0100211005E94000,"Mulaka",,playable,2021-01-28 18:07:20 +01008e2013fb4000,"Multi Quiz",ldn-untested,ingame,2025-02-03 22:26:00 +010038B00B9AE000,"Mummy Pinball",,playable,2022-08-05 16:08:11 +01008E200C5C2000,"Muse Dash",,playable,2020-06-06 14:41:29 +010035901046C000,"Mushroom Quest",,playable,2020-05-17 13:07:08 +0100700006EF6000,"Mushroom Wars 2",nvdec,playable,2020-09-28 15:26:08 +010046400F310000,"Music Racer",,playable,2020-08-10 08:51:23 +0100153006300000,"Musou Orochi 2 Ultimate",crash;nvdec,boots,2021-04-09 19:39:16 +0100F6000EAA8000,"Must Dash Amigos",,playable,2022-09-20 16:45:56 +01007B6006092000,"MUSYNX",,playable,2020-05-08 14:24:43 +0100C3E00ACAA000,"Mutant Football League: Dynasty Edition",online-broken,playable,2022-08-05 17:01:51 +01004BE004A86000,"Mutant Mudds Collection",,playable,2022-08-05 17:11:38 +0100E6B00DEA4000,"Mutant Year Zero: Road to Eden - Deluxe Edition",nvdec;UE4,playable,2022-09-10 13:31:10 +0100161009E5C000,"MX Nitro: Unleashed",,playable,2022-09-27 22:34:33 +0100218011E7E000,"MX vs ATV All Out",nvdec;UE4;vulkan-backend-bug,playable,2022-10-25 19:51:46 +0100D940063A0000,"MXGP3 - The Official Motocross Videogame",UE4;gpu;nvdec,ingame,2020-12-16 14:00:20 +01002C6012334000,"My Aunt is a Witch",,playable,2022-10-19 09:21:17 +0100F6F0118B8000,"My Butler",,playable,2020-06-27 13:46:23 +010031200B94C000,"My Friend Pedro",nvdec,playable,2021-05-28 11:19:17 +01000D700BE88000,"My Girlfriend is a Mermaid!?",nvdec,playable,2020-05-08 13:32:55 +010039000B68E000,"MY HERO ONE'S JUSTICE",UE4;crash;gpu;online,menus,2020-12-10 13:11:04 +01007E700DBF6000,"MY HERO ONE'S JUSTICE 2",UE4;gpu;nvdec,ingame,2020-12-18 14:08:47 +0100E4701373E000,"My Hidden Things",,playable,2021-04-15 11:26:06 +0100872012B34000,"My Little Dog Adventure",gpu,ingame,2020-12-10 17:47:37 +01008C600395A000,"My Little Riding Champion",slow,playable,2020-05-08 17:00:53 +010086B00C784000,"My Lovely Daughter: ReBorn",,playable,2022-11-24 17:25:32 +0100E7700C284000,"My Memory of Us",,playable,2022-08-20 11:03:14 +010028F00ABAE000,"My Riding Stables - Life with Horses",,playable,2022-08-05 21:39:07 +010042A00FBF0000,"My Riding Stables 2: A New Adventure",,playable,2021-05-16 14:14:59 +0100E25008E68000,"My Time at Portia",,playable,2021-05-28 12:42:55 +0100158011A08000,"My Universe - Cooking Star Restaurant",,playable,2022-10-19 10:00:44 +0100F71011A0A000,"My Universe - Fashion Boutique",nvdec,playable,2022-10-12 14:54:19 +0100CD5011A02000,"My Universe - PET CLINIC CATS & DOGS",crash;nvdec,boots,2022-02-06 02:05:53 +01006C301199C000,"My Universe - School Teacher",nvdec,playable,2021-01-21 16:02:52 +01000D5005974000,"N++ (NPLUSPLUS)",,playable,2022-08-05 21:54:58 +0100A6F00AC70000,"NAIRI: Tower of Shirin",nvdec,playable,2020-08-09 19:49:12 +010002F001220000,"NAMCO MUSEUM",ldn-untested,playable,2024-08-13 07:52:21 +0100DAA00AEE6000,"NAMCO MUSEUM™ ARCADE PAC™",,playable,2021-06-07 21:44:50 +010039F010E14000,"NAMCOT COLLECTION",audio,playable,2020-06-25 13:35:22 +010072B00BDDE000,"Narcos: Rise of the Cartels",UE4;crash;nvdec,boots,2021-03-22 13:18:47 +01006BB00800A000,"NARUTO SHIPPUDEN: Ultimate Ninja STORM 3 Full Burst",nvdec,playable,2024-06-16 14:58:05 +010084D00CF5E000,"NARUTO SHIPPUDEN™: Ultimate Ninja® STORM 4 ROAD TO BORUTO",,playable,2024-06-29 13:04:22 +0100D2D0190A4000,"NARUTO X BORUTO Ultimate Ninja STORM CONNECTIONS",services-horizon,nothing,2024-07-25 05:16:48 +0100715007354000,"NARUTO: Ultimate Ninja STORM",nvdec,playable,2022-08-06 14:10:31 +0100545016D5E000,"NASCAR Rivals",crash;Incomplete,ingame,2023-04-21 01:17:47 +0100103011894000,"Naught",UE4,playable,2021-04-26 13:31:45 +01001AE00C1B2000,"NBA 2K Playgrounds 2",nvdec;online-broken;UE4;vulkan-backend-bug,playable,2022-08-06 14:40:38 +0100760002048000,"NBA 2K18",gpu;ldn-untested,ingame,2022-08-06 14:17:51 +01001FF00B544000,"NBA 2K19",crash;ldn-untested;services,nothing,2021-04-16 13:07:21 +0100E24011D1E000,"NBA 2K21",gpu,boots,2022-10-05 15:31:51 +0100ACA017E4E800,"NBA 2K23",,boots,2023-10-10 23:07:14 +010006501A8D8000,"NBA 2K24 Kobe Bryant Edition",cpu;gpu,boots,2024-08-11 18:23:08 +010002900294A000,"NBA Playgrounds",nvdec;online-broken;UE4,playable,2022-08-06 17:06:59 +0100F5A008126000,"NBA Playgrounds - Enhanced Edition",nvdec;online-broken;UE4,playable,2022-08-06 16:13:44 +0100BBC00E4F8000,"Need a packet?",,playable,2020-08-12 16:09:01 +010029B0118E8000,"Need for Speed™ Hot Pursuit Remastered",online-broken,playable,2024-03-20 21:58:02 +010023500B0BA000,"Nefarious",,playable,2020-12-17 03:20:33 +01008390136FC000,"Negative: The Way of Shinobi",nvdec,playable,2021-03-24 11:29:41 +010065F00F55A000,"Neighbours back From Hell",nvdec,playable,2022-10-12 15:36:48 +0100B4900AD3E000,"NEKOPARA Vol.1",nvdec,playable,2022-08-06 18:25:54 +010012900C782000,"NEKOPARA Vol.2",,playable,2020-12-16 11:04:47 +010045000E418000,"NEKOPARA Vol.3",,playable,2022-10-03 12:49:04 +010049F013656000,"NEKOPARA Vol.4",crash,ingame,2021-01-17 01:47:18 +01006ED00BC76000,"Nelke & the Legendary Alchemists ~Ateliers of the New World~",,playable,2021-01-28 19:39:42 +01005F000B784000,"Nelly Cootalot: The Fowl Fleet",,playable,2020-06-11 20:55:42 +01001AB0141A8000,"Neo : The World Ends with You (DEMO)- 新すばらしきこのせかい (体験版)",crash,ingame,2021-07-18 07:29:18 +0100EBB00D2F4000,"Neo Cab",,playable,2021-04-24 00:27:58 +010040000DB98000,"Neo Cab Demo",crash,boots,2020-06-16 00:14:00 +010006D0128B4000,"NEOGEO POCKET COLOR SELECTION Vol.1",,playable,2023-07-08 20:55:36 +0100BAB01113A000,"Neon Abyss",,playable,2022-10-05 15:59:44 +010075E0047F8000,"Neon Chrome",,playable,2022-08-06 18:38:34 +010032000EAC6000,"Neon Drive",,playable,2022-09-10 13:45:48 +0100B9201406A000,"Neon White",crash,ingame,2023-02-02 22:25:06 +0100743008694000,"Neonwall",nvdec,playable,2022-08-06 18:49:52 +01001A201331E000,"Neoverse Trinity Edition",,playable,2022-10-19 10:28:03 +01000B2011352000,"Nerdook Bundle Vol. 1",gpu;slow,ingame,2020-10-07 14:27:10 +01008B0010160000,"Nerved",UE4,playable,2022-09-20 17:14:03 +0100BA0004F38000,"NeuroVoider",,playable,2020-06-04 18:20:05 +0100C20012A54000,"Nevaeh",gpu;nvdec,ingame,2021-06-16 17:29:03 +010039801093A000,"Never Breakup",,playable,2022-10-05 16:12:12 +0100F79012600000,"Neverending Nightmares",crash;gpu,boots,2021-04-24 01:43:35 +0100A9600EDF8000,"Neverlast",slow,ingame,2020-07-13 23:55:19 +010013700DA4A000,"Neverwinter Nights: Enhanced Edition",gpu;nvdec,menus,2024-09-30 02:59:19 +01004C200100E000,"New Frontier Days ~Founding Pioneers~",,playable,2020-12-10 12:45:07 +0100F4300BF2C000,"New Pokémon Snap™",,playable,2023-01-15 23:26:57 +010017700B6C2000,"New Super Lucky's Tale",,playable,2024-03-11 14:14:10 +0100EA80032EA000,"New Super Mario Bros.™ U Deluxe",32-bit,playable,2023-10-08 02:06:37 +0100B9500E886000,"Newt One",,playable,2020-10-17 21:21:48 +01005A5011A44000,"Nexomon: Extinction",,playable,2020-11-30 15:02:22 +0100B69012EC6000,"Nexoria: Dungeon Rogue Heroes",gpu,ingame,2021-10-04 18:41:29 +0100271004570000,"Next Up Hero",online,playable,2021-01-04 22:39:36 +0100E5600D446000,"Ni no Kuni: Wrath of the White Witch",32-bit;nvdec,boots,2024-07-12 04:52:59 +0100EDD00D530000,"Nice Slice",nvdec,playable,2020-06-17 15:13:27 +01000EC010BF4000,"Niche - a genetics survival game",nvdec,playable,2020-11-27 14:01:11 +010010701AFB2000,"Nickelodeon All-Star Brawl 2",,playable,2024-06-03 14:15:01 +0100D6200933C000,"Nickelodeon Kart Racers",,playable,2021-01-07 12:16:49 +010058800F860000,"Nicky - The Home Alone Golf Ball",,playable,2020-08-08 13:45:39 +0100A95012668000,"Nicole",audout,playable,2022-10-05 16:41:44 +0100B8E016F76000,"NieR:Automata The End of YoRHa Edition",slow;crash,ingame,2024-05-17 01:06:34 +0100F3A0095A6000,"Night Call",nvdec,playable,2022-10-03 12:57:00 +0100921006A04000,"Night in the Woods",,playable,2022-12-03 20:17:54 +0100D8500A692000,"Night Trap - 25th Anniversary Edition",nvdec,playable,2022-08-08 13:16:14 +01005F4009112000,"Nightmare Boy: The New Horizons of Reigns of Dreams, a Metroidvania journey with little rusty nightmares, the empire of knight final boss",,playable,2021-01-05 15:52:29 +01006E700B702000,"Nightmares from the Deep 2: The Siren`s Call",nvdec,playable,2022-10-19 10:58:53 +0100628004BCE000,"Nights of Azure 2: Bride of the New Moon",crash;nvdec;regression,menus,2022-11-24 16:00:39 +010042300C4F6000,"Nightshade/百花百狼",nvdec,playable,2020-05-10 19:43:31 +0100AA0008736000,"Nihilumbra",,playable,2020-05-10 16:00:12 +01009FA01FF6C000,"Nikoderiko: The Magical World",gpu,ingame,2025-04-26 19:13:31 +0100D03003F0E000,"Nine Parchments",ldn-untested,playable,2022-08-07 12:32:08 +0100E2F014F46000,"NINJA GAIDEN Σ",nvdec,playable,2022-11-13 16:27:02 +0100696014F4A000,"NINJA GAIDEN Σ2",nvdec,playable,2024-07-31 21:53:48 +01002AF014F4C000,"NINJA GAIDEN: Master Collection",nvdec,playable,2023-08-11 08:25:31 +010088E003A76000,"Ninja Shodown",,playable,2020-05-11 12:31:21 +010081D00A480000,"Ninja Striker!",,playable,2020-12-08 19:33:29 +0100CCD0073EA000,"Ninjala",online-broken;UE4,boots,2024-07-03 20:04:49 +010003C00B868000,"Ninjin: Clash of Carrots",online-broken,playable,2024-07-10 05:12:26 +0100746010E4C000,"NinNinDays",,playable,2022-11-20 15:17:29 +0100C9A00ECE6000,"Nintendo 64™ – Nintendo Switch Online",gpu;vulkan,ingame,2024-04-23 20:21:07 +0100e0601c632000,"Nintendo 64™ – Nintendo Switch Online: MATURE 17+",,ingame,2025-02-03 22:27:00 +0100D870045B6000,"Nintendo Entertainment System™ - Nintendo Switch Online",online,playable,2022-07-01 15:45:06 +0100C4B0034B2000,"Nintendo Labo Toy-Con 01 Variety Kit",gpu,ingame,2022-08-07 12:56:07 +01001E9003502000,"Nintendo Labo Toy-Con 03 Vehicle Kit",services;crash,menus,2022-08-03 17:20:11 +0100165003504000,"Nintendo Labo Toy-Con 04 VR Kit",services;crash,boots,2023-01-17 22:30:24 +01009AB0034E0000,"Nintendo Labo™ Toy-Con 02: Robot Kit",gpu,ingame,2022-08-07 13:03:19 +0100D2F00D5C0000,"Nintendo Switch™ Sports",deadlock,boots,2024-09-10 14:20:24 +01000EE017182000,"Nintendo Switch™ Sports Online Play Test",gpu,ingame,2022-03-16 07:44:12 +010037200C72A000,"Nippon Marathon",nvdec,playable,2021-01-28 20:32:46 +010020901088A000,"Nirvana Pilot Yume",,playable,2022-10-29 11:49:49 +01009B400ACBA000,"No Heroes Here",online,playable,2020-05-10 02:41:57 +0100853015E86000,"No Man's Sky",gpu,ingame,2024-07-25 05:18:17 +0100F0400F202000,"No More Heroes",32-bit,playable,2022-09-13 07:44:27 +010071400F204000,"No More Heroes 2: Desperate Struggle",32-bit;nvdec,playable,2022-11-19 01:38:13 +01007C600EB42000,"No More Heroes 3",gpu;UE4,ingame,2024-03-11 17:06:19 +01009F3011004000,"No Straight Roads",nvdec,playable,2022-10-05 17:01:38 +0100F7D00A1BC000,"NO THING",,playable,2021-01-04 19:06:01 +0100542012884000,"Nongunz: Doppelganger Edition",,playable,2022-10-29 12:00:39 +010016E011EFA000,"Norman's Great Illusion",,playable,2020-12-15 19:28:24 +01001A500AD6A000,"Norn9 ~Norn + Nonette~ LOFN",nvdec;vulkan-backend-bug,playable,2022-12-09 09:29:16 +01004840086FE000,"NORTH",nvdec,playable,2021-01-05 16:17:44 +0100A9E00D97A000,"Northgard",crash,menus,2022-02-06 02:05:35 +01008AE019614000,"nOS new Operating System",,playable,2023-03-22 16:49:08 +0100CB800B07E000,"NOT A HERO: SUPER SNAZZY EDITION",,playable,2021-01-28 19:31:24 +01004D500D9BE000,"Not Not - A Brain Buster",,playable,2020-05-10 02:05:26 +0100DAF00D0E2000,"Not Tonight: Take Back Control Edition",nvdec,playable,2022-10-19 11:48:47 +0100343013248000,"Nubarron: The adventure of an unlucky gnome",,playable,2020-12-17 16:45:17 +01005140089F6000,"Nuclien",,playable,2020-05-10 05:32:55 +010002700C34C000,"Numbala",,playable,2020-05-11 12:01:07 +010020500C8C8000,"Number Place 10000",gpu,menus,2021-11-24 09:14:23 +010003701002C000,"Nurse Love Syndrome",,playable,2022-10-13 10:05:22 +,"nx-hbmenu",Needs Update;homebrew,boots,2024-04-06 22:05:32 +,"nxquake2",services;crash;homebrew,nothing,2022-08-04 23:14:04 +010049F00EC30000,"Nyan Cat: Lost in Space",online,playable,2021-06-12 13:22:03 +01002E6014FC4000,"O---O",,playable,2022-10-29 12:12:14 +010074600CC7A000,"OBAKEIDORO!",nvdec;online,playable,2020-10-16 16:57:34 +01002A000C478000,"Observer",UE4;gpu;nvdec,ingame,2021-03-03 20:19:45 +01007D7001D0E000,"Oceanhorn - Monster of Uncharted Seas",,playable,2021-01-05 13:55:22 +01006CB010840000,"Oceanhorn 2: Knights of the Lost Realm",,playable,2021-05-21 18:26:10 +010096B00A08E000,"Octocopter: Double or Squids",,playable,2021-01-06 01:30:16 +0100CAB006F54000,"Octodad: Dadliest Catch",crash,boots,2021-04-23 15:26:12 +0100A3501946E000,"OCTOPATH TRAVELER II",gpu;amd-vendor-bug,ingame,2024-09-22 11:39:20 +010057D006492000,"Octopath Traveler™",UE4;crash;gpu,ingame,2020-08-31 02:34:36 +010084300C816000,"Odallus: The Dark Call",,playable,2022-08-08 12:37:58 +0100BB500EE3C000,"Oddworld: Munch's Oddysee",gpu;nvdec,ingame,2021-06-17 12:11:50 +01005E700ABB8000,"Oddworld: New 'n' Tasty",nvdec,playable,2021-06-17 17:51:32 +0100D210177C6000,"ODDWORLD: SOULSTORM",services-horizon;crash,boots,2024-08-18 13:13:26 +01002EA00ABBA000,"Oddworld: Stranger's Wrath",crash;nvdec;loader-allocator,menus,2021-11-23 09:23:21 +010029F00C876000,"Odium to the Core",gpu,ingame,2021-01-08 14:03:52 +01006F5013202000,"Off And On Again",,playable,2022-10-29 19:46:26 +01003CD00E8BC000,"Offroad Racing - Buggy X ATV X Moto",online-broken;UE4,playable,2022-09-14 18:53:22 +01003B900AE12000,"Oh My Godheads: Party Edition",,playable,2021-04-15 11:04:11 +0100F45006A00000,"Oh...Sir! The Hollywood Roast",,ingame,2020-12-06 00:42:30 +010030B00B2F6000,"OK K.O.! Let’s Play Heroes",nvdec,playable,2021-01-11 18:41:02 +0100276009872000,"OKAMI HD",nvdec,playable,2024-04-05 06:24:58 +01006AB00BD82000,"OkunoKA",online-broken,playable,2022-08-08 14:41:51 +0100CE2007A86000,"Old Man's Journey",nvdec,playable,2021-01-28 19:16:52 +0100C3D00923A000,"Old School Musical",,playable,2020-12-10 12:51:12 +010099000BA48000,"Old School Racer 2",,playable,2020-10-19 12:11:26 +0100E0200B980000,"OlliOlli: Switch Stance",gpu,boots,2024-04-25 08:36:37 +0100F9D00C186000,"Olympia Soiree",,playable,2022-12-04 21:07:12 +0100A8B00E14A000,"Olympic Games Tokyo 2020 – The Official Video Game™",ldn-untested;nvdec;online,playable,2021-01-06 01:20:24 +01001D600E51A000,"Omega Labyrinth Life",,playable,2021-02-23 21:03:03 +01005DE00CA34000,"Omega Vampire",nvdec,playable,2020-10-17 19:15:35 +0100CDC00C40A000,"Omensight: Definitive Edition",UE4;crash;nvdec,ingame,2020-07-26 01:45:14 +01006DB00D970000,"OMG Zombies!",32-bit,playable,2021-04-12 18:04:45 +010014E017B14000,"OMORI",,playable,2023-01-07 20:21:02 +0100A5F011800000,"Once Upon A Coma",nvdec,playable,2020-08-01 12:09:39 +0100BD3006A02000,"One More Dungeon",,playable,2021-01-06 09:10:58 +010076600FD64000,"One Person Story",,playable,2020-07-14 11:51:02 +0100774009CF6000,"ONE PIECE Pirate Warriors 3 Deluxe Edition",nvdec,playable,2020-05-10 06:23:52 +01008FE00E2F6000,"ONE PIECE: PIRATE WARRIORS 4",online-broken;ldn-untested,playable,2022-09-27 22:55:46 +0100574002AF4000,"ONE PIECE: Unlimited World Red Deluxe Edition",,playable,2020-05-10 22:26:32 +0100EEA00E3EA000,"One-Way Ticket",UE4,playable,2020-06-20 17:20:49 +0100463013246000,"Oneiros",,playable,2022-10-13 10:17:22 +010057C00D374000,"Oniken",,playable,2022-09-10 14:22:38 +010037900C814000,"Oniken: Unstoppable Edition",,playable,2022-08-08 14:52:06 +0100416008A12000,"Onimusha: Warlords",nvdec,playable,2020-07-31 13:08:39 +0100CF4011B2A000,"OniNaki",nvdec,playable,2021-02-27 21:52:42 +010074000BE8E000,"oOo: Ascension",,playable,2021-01-25 14:13:34 +0100D5400BD90000,"Operación Triunfo 2017",services;nvdec,ingame,2022-08-08 15:06:42 +01006CF00CFA4000,"Operencia: The Stolen Sun",UE4;nvdec,playable,2021-06-08 13:51:07 +01004A200BE82000,"OPUS Collection",,playable,2021-01-25 15:24:04 +010049C0075F0000,"OPUS: The Day We Found Earth",nvdec,playable,2021-01-21 18:29:31 +0100F9A012892000,"Ord.",,playable,2020-12-14 11:59:06 +010061D00DB74000,"Ori and the Blind Forest: Definitive Edition",nvdec;online-broken,playable,2022-09-14 19:58:13 +010005800F46E000,"Ori and the Blind Forest: Definitive Edition Demo",,playable,2022-09-10 14:40:12 +01008DD013200000,"Ori and the Will of the Wisps",gpu,ingame,2025-01-11 06:09:54 +01006C70102EA000,"Orn: The Tiny Forest Sprite",UE4;gpu,ingame,2020-08-07 14:25:30 +0100E5900F49A000,"Othercide",nvdec,playable,2022-10-05 19:04:38 +01006AA00EE44000,"Otokomizu",,playable,2020-07-13 21:00:44 +01006AF013A9E000,"Otti: The House Keeper",,playable,2021-01-31 12:11:24 +01000320060AC000,"OTTTD: Over The Top Tower Defense",slow,ingame,2020-10-10 19:31:07 +010097F010FE6000,"Our Two Bedroom Story",gpu;nvdec,ingame,2023-10-10 17:41:20 +0100D5D00C6BE000,"Our World Is Ended.",nvdec,playable,2021-01-19 22:46:57 +01005A700A166000,"OUT OF THE BOX",,playable,2021-01-28 01:34:27 +0100D9F013102000,"Outbreak Lost Hope",crash,boots,2021-04-26 18:01:23 +01006EE013100000,"Outbreak The Nightmare Chronicles",,playable,2022-10-13 10:41:57 +0100A0D013464000,"Outbreak: Endless Nightmares",,playable,2022-10-29 12:35:49 +0100C850130FE000,"Outbreak: Epidemic",,playable,2022-10-13 10:27:31 +0100B450130FC000,"Outbreak: The New Nightmare",,playable,2022-10-19 15:42:07 +0100B8900EFA6000,"Outbuddies DX",gpu,ingame,2022-08-04 22:39:24 +0100DE70085E8000,"Outlast 2",crash;nvdec,ingame,2022-01-22 22:28:05 +01008D4007A1E000,"Outlast: Bundle of Terror",nvdec;loader-allocator;vulkan-backend-bug,playable,2024-01-27 04:44:26 +01009B900401E000,"Overcooked Special Edition",,playable,2022-08-08 20:48:52 +01006FD0080B2000,"Overcooked! 2",ldn-untested,playable,2022-08-08 16:48:10 +0100F28011892000,"Overcooked! All You Can Eat",ldn-untested;online,playable,2021-04-15 10:33:52 +0100D7F00EC64000,"Overlanders",nvdec;UE4,playable,2022-09-14 20:15:06 +01008EA00E816000,"OVERPASS™",online-broken;UE4;ldn-untested,playable,2022-10-17 15:29:47 +0100647012F62000,"Override 2: Super Mech League",online-broken;UE4,playable,2022-10-19 15:56:04 +01008A700F7EE000,"Override: Mech City Brawl - Super Charged Mega Edition",nvdec;online-broken;UE4,playable,2022-09-20 17:33:32 +0100F8600E21E000,"Overwatch® 2",deadlock,boots,2022-09-14 20:22:22 +01005F000CC18000,"OVERWHELM",,playable,2021-01-21 18:37:18 +0100BC2004FF4000,"Owlboy",,playable,2020-10-19 14:24:45 +0100AD9012510000,"PAC-MAN™ 99",gpu;online-broken,ingame,2024-04-23 00:48:25 +010024C001224000,"PAC-MAN™ CHAMPIONSHIP EDITION 2 PLUS",,playable,2021-01-19 22:06:18 +011123900AEE0000,"Paladins",online,menus,2021-01-21 19:21:37 +0100F0D004CAE000,"PAN-PAN A tiny big adventure",audout,playable,2021-01-25 14:42:00 +010083700B730000,"Pang Adventures",,playable,2021-04-10 12:16:59 +010006E00DFAE000,"Pantsu Hunter: Back to the 90s",,playable,2021-02-19 15:12:27 +0100C6A00E94A000,"Panzer Dragoon: Remake",,playable,2020-10-04 04:03:55 +01004AE0108E0000,"Panzer Paladin",,playable,2021-05-05 18:26:00 +010004500DE50000,"Paper Dolls Original",UE4;crash,boots,2020-07-13 20:26:21 +0100A3900C3E2000,"Paper Mario™: The Origami King",audio;Needs Update,playable,2024-08-09 18:27:40 +0100ECD018EBE000,"Paper Mario™: The Thousand-Year Door",gpu;intel-vendor-bug;slow,ingame,2025-01-07 04:27:35 +01006AD00B82C000,"Paperbound Brawlers",,playable,2021-01-25 14:32:15 +0100DC70174E0000,"Paradigm Paradox",vulkan-backend-bug,playable,2022-12-03 22:28:13 +01007FB010DC8000,"Paradise Killer",UE4,playable,2022-10-05 19:33:05 +010063400B2EC000,"Paranautical Activity",,playable,2021-01-25 13:49:19 +01006B5012B32000,"Part Time UFO™",crash,ingame,2023-03-03 03:13:05 +01007FC00A040000,"Party Arcade",online-broken;UE4;ldn-untested,playable,2022-08-09 12:32:53 +0100B8E00359E000,"Party Golf",nvdec,playable,2022-08-09 12:38:30 +010022801217E000,"Party Hard 2",nvdec,playable,2022-10-05 20:31:48 +010027D00F63C000,"Party Treats",,playable,2020-07-02 00:05:00 +01001E500EA16000,"Path of Sin: Greed",crash,menus,2021-11-24 08:00:00 +010031F006E76000,"Pato Box",,playable,2021-01-25 15:17:52 +01001F201121E000,"PAW Patrol Mighty Pups Save Adventure Bay",,playable,2022-10-13 12:17:55 +0100360016800000,"PAW Patrol: Grand Prix",gpu,ingame,2024-05-03 16:16:11 +0100CEC003A4A000,"PAW Patrol: On a Roll!",nvdec,playable,2021-01-28 21:14:49 +01000C4015030000,"Pawapoke R",services-horizon,nothing,2024-05-14 14:28:32 +0100A56006CEE000,"Pawarumi",online-broken,playable,2022-09-10 15:19:33 +0100274004052000,"PAYDAY 2",nvdec;online-broken;ldn-untested,playable,2022-08-09 12:56:39 +010085700ABC8000,"PBA Pro Bowling",nvdec;online-broken;UE4,playable,2022-09-14 23:00:49 +0100F95013772000,"PBA Pro Bowling 2021",online-broken;UE4,playable,2022-10-19 16:46:40 +010072800CBE8000,"PC Building Simulator",,playable,2020-06-12 00:31:58 +010002100CDCC000,"Peaky Blinders: Mastermind",,playable,2022-10-19 16:56:35 +010028A0048A6000,"Peasant Knight",,playable,2020-12-22 09:30:50 +0100C510049E0000,"Penny-Punching Princess",,playable,2022-08-09 13:37:05 +0100CA901AA9C000,"Penny’s Big Breakaway",amd-vendor-bug,playable,2024-05-27 07:58:51 +0100563005B70000,"Perception",UE4;crash;nvdec,menus,2020-12-18 11:49:23 +010011700D1B2000,"Perchang",,playable,2021-01-25 14:19:52 +010089F00A3B4000,"Perfect Angle",,playable,2021-01-21 18:48:45 +01005CD012DC0000,"Perky Little Things",crash;vulkan,boots,2024-08-04 07:22:46 +01005EB013FBA000,"Persephone",,playable,2021-03-23 22:39:19 +0100A0300FC3E000,"Perseverance",,playable,2020-07-13 18:48:27 +010062B01525C000,"Persona 4 Golden",,playable,2024-08-07 17:48:07 +01005CA01580E000,"Persona 5 Royal",gpu,ingame,2024-08-17 21:45:15 +010087701B092000,"Persona 5 Tactica",,playable,2024-04-01 22:21:03 +0100E4F010D92000,"Persona 5: Scramble",deadlock,boots,2020-10-04 03:22:29 +0100801011C3E000,"Persona® 5 Strikers",nvdec;mac-bug,playable,2023-09-26 09:36:01 +010044400EEAE000,"Petoons Party",nvdec,playable,2021-03-02 21:07:58 +010053401147C000,"PGA TOUR 2K21",deadlock;nvdec,ingame,2022-10-05 21:53:50 +0100DDD00C0EA000,"Phantaruk",,playable,2021-06-11 18:09:54 +0100063005C86000,"Phantom Breaker: Battle Grounds Overdrive",audio;nvdec,playable,2024-02-29 14:20:35 +010096F00E5B0000,"Phantom Doctrine",UE4,playable,2022-09-15 10:51:50 +0100C31005A50000,"Phantom Trigger",,playable,2022-08-09 14:27:30 +0100CB000A142000,"Phoenix Wright: Ace Attorney Trilogy",,playable,2023-09-15 22:03:12 +0100DA400F624000,"PHOGS!",online,playable,2021-01-18 15:18:37 +0100BF1003B9A000,"Physical Contact: 2048",slow,playable,2021-01-25 15:18:32 +01008110036FE000,"Physical Contact: SPEED",,playable,2022-08-09 14:40:46 +010077300A86C000,"PIANISTA",online-broken,playable,2022-08-09 14:52:56 +010012100E8DC000,"PICROSS LORD OF THE NAZARICK",,playable,2023-02-08 15:54:56 +0100C9600A88E000,"PICROSS S2",,playable,2020-10-15 12:01:40 +010079200D330000,"PICROSS S3",,playable,2020-10-15 11:55:27 +0100C250115DC000,"PICROSS S4",,playable,2020-10-15 12:33:46 +0100AC30133EC000,"PICROSS S5",,playable,2022-10-17 18:51:42 +010025901432A000,"PICROSS S6",,playable,2022-10-29 17:52:19 +01009B2016104000,"PICROSS S7",,playable,2022-02-16 12:51:25 +010043B00E1CE000,"PictoQuest",,playable,2021-02-27 15:03:16 +0100D06003056000,"Piczle Lines DX",UE4;crash;nvdec,menus,2020-11-16 04:21:31 +010017600B532000,"Piczle Lines DX 500 More Puzzles!",UE4,playable,2020-12-15 23:42:51 +01000FD00D5CC000,"Pig Eat Ball",services,ingame,2021-11-30 01:57:45 +01001CB0106F8000,"Pikmin 3 Deluxe Demo",32-bit;crash;demo;gpu,ingame,2021-06-16 18:38:07 +0100E0B019974000,"Pikmin 4 Demo",gpu;nvdec;UE4;demo;amd-vendor-bug,ingame,2023-09-22 21:41:08 +0100AA80194B0000,"Pikmin™ 1",audio,ingame,2024-05-28 18:56:11 +0100D680194B2000,"Pikmin™ 1+2",gpu,ingame,2023-07-31 08:53:41 +0100F4C009322000,"Pikmin™ 3 Deluxe",gpu;32-bit;nvdec;Needs Update,ingame,2024-09-03 00:28:26 +0100B7C00933A000,"Pikmin™ 4",gpu;crash;UE4,ingame,2024-08-26 03:39:08 +0100D6200E130000,"Pillars of Eternity: Complete Edition",,playable,2021-02-27 00:24:21 +01007A500B0B2000,"Pilot Sports",,playable,2021-01-20 15:04:17 +0100DA70186D4000,"Pinball FX",,playable,2024-05-03 17:09:11 +0100DB7003828000,"Pinball FX3",online-broken,playable,2022-11-11 23:49:07 +01002BA00D662000,"Pine",slow,ingame,2020-07-29 16:57:39 +010041100B148000,"Pinstripe",,playable,2020-11-26 10:40:40 +01002B20174EE000,"Piofiore: Episodio 1926",,playable,2022-11-23 18:36:05 +01009240117A2000,"Piofiore: Fated Memories",nvdec,playable,2020-11-30 14:27:50 +0100EA2013BCC000,"Pixel Game Maker Series Puzzle Pedestrians",,playable,2022-10-24 20:15:50 +0100859013CE6000,"Pixel Game Maker Series Werewolf Princess Kaguya",crash;services,nothing,2021-03-26 00:23:07 +010060A00F5E8000,"Pixel Gladiator",,playable,2020-07-08 02:41:26 +010000E00E612000,"Pixel Puzzle Makeout League",,playable,2022-10-13 12:34:00 +0100382011002000,"PixelJunk Eden 2",crash,ingame,2020-12-17 11:55:52 +0100E4D00A690000,"PixelJunk™ Monsters 2",,playable,2021-06-07 03:40:01 +01004A900C352000,"Pizza Titan Ultra",nvdec,playable,2021-01-20 15:58:42 +05000FD261232000,"Pizza Tower",crash,ingame,2024-09-16 00:21:56 +0100FF8005EB2000,"Plague Road",,playable,2022-08-09 15:27:14 +010030B00C316000,"Planescape: Torment and Icewind Dale: Enhanced Editions",cpu;32-bit;crash;Needs Update,boots,2022-09-10 03:58:26 +010003C0099EE000,"PLANET ALPHA",UE4;gpu,ingame,2020-12-16 14:42:20 +01007EA019CFC000,"Planet Cube: Edge",,playable,2023-03-22 17:10:12 +0100F0A01F112000,"planetarian: The Reverie of a Little Planet & Snow Globe",,playable,2020-10-17 20:26:20 +010087000428E000,"Plantera Deluxe",,playable,2022-08-09 15:36:28 +0100C56010FD8000,"Plants vs. Zombies: Battle for Neighborville™ Complete Edition",gpu;audio;crash,boots,2024-09-02 12:58:14 +0100E5B011F48000,"PLOID SAGA",,playable,2021-04-19 16:58:45 +01009440095FE000,"Pode",nvdec,playable,2021-01-25 12:58:35 +010086F0064CE000,"Poi: Explorer Edition",nvdec,playable,2021-01-21 19:32:00 +0100EB6012FD2000,"Poison Control",,playable,2021-05-16 14:01:54 +010072400E04A000,"Pokémon Café ReMix",,playable,2021-08-17 20:00:04 +01003D200BAA2000,"Pokémon Mystery Dungeon™: Rescue Team DX",mac-bug,playable,2024-01-21 00:16:32 +01008DB008C2C000,"Pokémon Shield + Pokémon Shield Expansion Pass",deadlock;crash;online-broken;ldn-works;LAN,ingame,2024-08-12 07:20:22 +0100ABF008968000,"Pokémon Sword + Pokémon Sword Expansion Pass",deadlock;crash;online-broken;ldn-works;LAN,ingame,2024-08-26 15:40:37 +01009AD008C4C000,"Pokémon: Let's Go, Pikachu! demo",slow;demo,playable,2023-11-26 11:23:20 +0100000011D90000,"Pokémon™ Brilliant Diamond",gpu;ldn-works,ingame,2024-08-28 13:26:35 +010015F008C54000,"Pokémon™ HOME",Needs Update;crash;services,menus,2020-12-06 06:01:51 +01001F5010DFA000,"Pokémon™ Legends: Arceus",gpu;Needs Update;ldn-works,ingame,2024-09-19 10:02:02 +01005D100807A000,"Pokémon™ Quest",,playable,2022-02-22 16:12:32 +0100A3D008C5C000,"Pokémon™ Scarlet",gpu;nvdec;ldn-works;amd-vendor-bug,ingame,2023-12-14 13:18:29 +01008F6008C5E000,"Pokémon™ Violet",gpu;nvdec;ldn-works;amd-vendor-bug;mac-bug,ingame,2024-07-30 02:51:48 +0100187003A36000,"Pokémon™: Let’s Go, Eevee!",crash;nvdec;online-broken;ldn-broken,ingame,2024-06-01 15:03:04 +010003F003A34000,"Pokémon™: Let’s Go, Pikachu!",crash;nvdec;online-broken;ldn-broken,ingame,2024-03-15 07:55:41 +0100B3F000BE2000,"Pokkén Tournament™ DX",nvdec;ldn-works;opengl-backend-bug;LAN;amd-vendor-bug;intel-vendor-bug,playable,2024-07-18 23:11:08 +010030D005AE6000,"Pokkén Tournament™ DX Demo",demo;opengl-backend-bug,playable,2022-08-10 12:03:19 +0100A3500B4EC000,"Polandball: Can Into Space",,playable,2020-06-25 15:13:26 +0100EAB00605C000,"Poly Bridge",services,playable,2020-06-08 23:32:41 +010017600B180000,"Polygod",slow;regression,ingame,2022-08-10 14:38:14 +010074B00ED32000,"Polyroll",gpu,boots,2021-07-01 16:16:50 +010096B01179A000,"Ponpu",,playable,2020-12-16 19:09:34 +01005C5011086000,"Pooplers",,playable,2020-11-02 11:52:10 +01007EF013CA0000,"Port Royale 4",crash;nvdec,menus,2022-10-30 14:34:06 +01007BB017812000,"Portal",,playable,2024-06-12 03:48:29 +0100ABD01785C000,"Portal 2",gpu,ingame,2023-02-20 22:44:15 +010050D00FE0C000,"Portal Dogs",,playable,2020-09-04 12:55:46 +0100437004170000,"Portal Knights",ldn-untested;online,playable,2021-05-27 19:29:04 +01005FC010EB2000,"Potata: Fairy Flower",nvdec,playable,2020-06-17 09:51:34 +01000A4014596000,"Potion Party",,playable,2021-05-06 14:26:54 +0100E1E00CF1A000,"Power Rangers: Battle for the Grid",,playable,2020-06-21 16:52:42 +0100D1C01C194000,"Powerful Pro Baseball 2024-2025",gpu,ingame,2024-08-25 06:40:48 +01008E100E416000,"PowerSlave Exhumed",gpu,ingame,2023-07-31 23:19:10 +010054F01266C000,"Prehistoric Dude",gpu,ingame,2020-10-12 12:38:48 +0100DB200D3E4000,"Pretty Princess Magical Coordinate",,playable,2020-10-15 11:43:41 +01007F00128CC000,"Pretty Princess Party",,playable,2022-10-19 17:23:58 +010009300D278000,"Preventive Strike",nvdec,playable,2022-10-06 10:55:51 +0100210019428000,"Prince of Persia The Lost Crown",crash,ingame,2024-06-08 21:31:58 +01007A3009184000,"Princess Peach™: Showtime!",UE4,playable,2024-09-21 13:39:45 +010024701DC2E000,"Princess Peach™: Showtime! Demo",UE4;demo,playable,2024-03-10 17:46:45 +01001FA01451C000,"Prinny Presents NIS Classics Volume 1: Phantom Brave: The Hermuda Triangle Remastered / Soul Nomad & the World Eaters",crash;Needs Update,boots,2023-02-02 07:23:09 +01008FA01187A000,"Prinny® 2: Dawn of Operation Panties, Dood!",32-bit,playable,2022-10-13 12:42:58 +01007A0011878000,"Prinny®: Can I Really Be the Hero?",32-bit;nvdec,playable,2023-10-22 09:25:25 +010007F00879E000,"PriPara: All Idol Perfect Stage",,playable,2022-11-22 16:35:52 +010029200AB1C000,"Prison Architect: Nintendo Switch™ Edition",,playable,2021-04-10 12:27:58 +0100C1801B914000,"Prison City",gpu,ingame,2024-03-01 08:19:33 +0100F4800F872000,"Prison Princess",,playable,2022-11-20 15:00:25 +0100A9800A1B6000,"Professional Construction – The Simulation",slow,playable,2022-08-10 15:15:45 +010077B00BDD8000,"Professional Farmer: Nintendo Switch™ Edition",slow,playable,2020-12-16 13:38:19 +010018300C83A000,"Professor Lupo and his Horrible Pets",,playable,2020-06-12 00:08:45 +0100D1F0132F6000,"Professor Lupo: Ocean",,playable,2021-04-14 16:33:33 +0100BBD00976C000,"Project Highrise: Architect's Edition",,playable,2022-08-10 17:19:12 +0100ACE00DAB6000,"Project Nimbus: Complete Edition",nvdec;UE4;vulkan-backend-bug,playable,2022-08-10 17:35:43 +01002980140F6000,"Project TRIANGLE STRATEGY™ Debut Demo",UE4;demo,playable,2022-10-24 21:40:27 +0100BDB01150E000,"Project Warlock",,playable,2020-06-16 10:50:41 +01009F100BC52000,"Psikyo Collection Vol 1",32-bit,playable,2020-10-11 13:18:47 +0100A2300DB78000,"Psikyo Collection Vol. 3",,ingame,2021-06-07 02:46:23 +01009D400C4A8000,"Psikyo Collection Vol.2",32-bit,playable,2021-06-07 03:22:07 +01007A200F2E2000,"Psikyo Shooting Stars Alpha",32-bit,playable,2021-04-13 12:03:43 +0100D7400F2E4000,"Psikyo Shooting Stars Bravo",32-bit,playable,2021-06-14 12:09:07 +0100EC100A790000,"PSYVARIAR DELTA",nvdec,playable,2021-01-20 13:01:46 +0100AE700F184000,"Puchitto kurasutā",Need-Update;crash;services,menus,2020-07-04 16:44:28 +0100D61010526000,"Pulstario",,playable,2022-10-06 11:02:01 +01009AE00B788000,"Pumped BMX Pro",nvdec;online-broken,playable,2022-09-20 17:40:50 +01006C10131F6000,"Pumpkin Jack",nvdec;UE4,playable,2022-10-13 12:52:32 +010016400F07E000,"Push the Crate",nvdec;UE4,playable,2022-09-15 13:28:41 +0100B60010432000,"Push the Crate 2",UE4;gpu;nvdec,ingame,2021-06-10 14:20:01 +0100F1200F6D8000,"Pushy and Pully in Blockland",,playable,2020-07-04 11:44:41 +0100AAE00CAB4000,"Puyo Puyo Champions",online,playable,2020-06-19 11:35:08 +010038E011940000,"Puyo Puyo™ Tetris® 2",ldn-untested,playable,2023-09-26 11:35:25 +0100C5700ECE0000,"Puzzle & Dragons GOLD",slow,playable,2020-05-13 15:09:34 +010079E01A1E0000,"Puzzle Bobble Everybubble!",audio;ldn-works,playable,2023-06-10 03:53:40 +010043100F0EA000,"Puzzle Book",,playable,2020-09-28 13:26:01 +0100476004A9E000,"Puzzle Box Maker",nvdec;online-broken,playable,2022-08-10 18:00:52 +0100A4E017372000,"Pyramid Quest",gpu,ingame,2023-08-16 21:14:52 +0100F1100E606000,"Q-YO Blaster",gpu,ingame,2020-06-07 22:36:53 +010023600AA34000,"Q.U.B.E. 2",UE4,playable,2021-03-03 21:38:57 +0100A8D003BAE000,"Qbics Paint",gpu;services,ingame,2021-06-07 10:54:09 +0100BA5012E54000,"QUAKE",gpu;crash,menus,2022-08-08 12:40:34 +010048F0195E8000,"Quake II",,playable,2023-08-15 03:42:14 +,"QuakespasmNX",crash;homebrew,nothing,2022-07-23 19:28:07 +010045101288A000,"Quantum Replica",nvdec;UE4,playable,2022-10-30 21:17:22 +0100F1400BA88000,"Quarantine Circular",,playable,2021-01-20 15:24:15 +0100DCF00F13A000,"Queen's Quest 4: Sacred Truce",nvdec,playable,2022-10-13 12:59:21 +0100492012378000,"Quell",gpu,ingame,2021-06-11 15:59:53 +01001DE005012000,"Quest of Dungeons",,playable,2021-06-07 10:29:22 +010067D011E68000,"QuietMansion2",,playable,2020-09-03 14:59:35 +0100AF100EE76000,"Quiplash 2 InterLASHional: The Say Anything Party Game!",online-working,playable,2022-10-19 17:43:45 +0100E5400BE64000,"R-Type Dimensions EX",,playable,2020-10-09 12:04:43 +0100F930136B6000,"R-Type® Final 2",slow;nvdec;UE4,ingame,2022-10-30 21:46:29 +01007B0014300000,"R-Type® Final 2 Demo",slow;nvdec;UE4;demo,ingame,2022-10-24 21:57:42 +0100B5A004302000,"R.B.I. Baseball 17",online-working,playable,2022-08-11 11:55:47 +01005CC007616000,"R.B.I. Baseball 18",nvdec;online-working,playable,2022-08-11 11:27:52 +0100FCB00BF40000,"R.B.I. Baseball 19",nvdec;online-working,playable,2022-08-11 11:43:52 +010061400E7D4000,"R.B.I. Baseball 20",,playable,2021-06-15 21:16:29 +0100B4A0115CA000,"R.B.I. Baseball 21",online-working,playable,2022-10-24 22:31:45 +01005BF00E4DE000,"Rabi-Ribi",,playable,2022-08-06 17:02:44 +010075D00DD04000,"Race with Ryan",UE4;gpu;nvdec;slow,ingame,2020-11-16 04:35:33 +0100B8100C54A000,"Rack N Ruin",,playable,2020-09-04 15:20:26 +010024400C516000,"RAD",gpu;crash;UE4,menus,2021-11-29 02:01:56 +010000600CD54000,"Rad Rodgers Radical Edition",nvdec;online-broken,playable,2022-08-10 19:57:23 +0100DA400E07E000,"Radiation City",crash,ingame,2022-09-30 11:15:04 +01009E40095EE000,"Radiation Island",opengl;vulkan-backend-bug,ingame,2022-08-11 10:51:04 +0100C8B00D2BE000,"Radical Rabbit Stew",,playable,2020-08-03 12:02:56 +0100BAD013B6E000,"Radio Commander",nvdec,playable,2021-03-24 11:20:46 +01008FA00ACEC000,"RADIOHAMMER STATION",audout,playable,2021-02-26 20:20:06 +01003D00099EC000,"Raging Justice",,playable,2021-06-03 14:06:50 +01005CD013116000,"Raiden IV x Mikado Remix [ 雷電Ⅳ×MIKADO remix ]",,playable,2022-07-29 15:50:13 +01002B000D97E000,"Raiden V: Director's Cut",deadlock;nvdec,boots,2024-07-12 07:31:46 +01002EE00DC02000,"Railway Empire - Nintendo Switch™ Edition",nvdec,playable,2022-10-03 13:53:50 +01003C700D0DE000,"Rain City",,playable,2020-10-08 16:59:03 +0100BDD014232000,"Rain on Your Parade",,playable,2021-05-06 19:32:04 +010047600BF72000,"Rain World",,playable,2023-05-10 23:34:08 +01009D9010B9E000,"Rainbows, toilets & unicorns",nvdec,playable,2020-10-03 18:08:18 +010010B00DDA2000,"Raji: An Ancient Epic",UE4;gpu;nvdec,ingame,2020-12-16 10:05:25 +010042A00A9CC000,"Rapala Fishing Pro Series",nvdec,playable,2020-12-16 13:26:53 +0100E73010754000,"Rascal Fight",,playable,2020-10-08 13:23:30 +010003F00C5C0000,"Rawr-Off",crash;nvdec,menus,2020-07-02 00:14:44 +01005FF002E2A000,"Rayman® Legends Definitive Edition",nvdec;ldn-works,playable,2023-05-27 18:33:07 +0100F03011616000,"Re:Turn - One Way Trip",,playable,2022-08-29 22:42:53 +01000B20117B8000,"Re:ZERO -Starting Life in Another World- The Prophecy of the Throne",gpu;crash;nvdec;vulkan,boots,2023-03-07 21:27:24 +0100A8A00E462000,"Real Drift Racing",,playable,2020-07-25 14:31:31 +010048600CC16000,"Real Heroes: Firefighter",,playable,2022-09-20 18:18:44 +0100E64010BAA000,"realMyst: Masterpiece Edition",nvdec,playable,2020-11-30 15:25:42 +01000F300F082000,"Reaper: Tale of a Pale Swordsman",,playable,2020-12-12 15:12:23 +0100D9B00E22C000,"Rebel Cops",,playable,2022-09-11 10:02:53 +0100CAA01084A000,"Rebel Galaxy Outlaw",nvdec,playable,2022-12-01 07:44:56 +0100EF0015A9A000,"Record of Lodoss War-Deedlit in Wonder Labyrinth-",deadlock;Needs Update;Incomplete,ingame,2022-01-19 10:00:59 +0100CF600FF7A000,"Red Bow",services,ingame,2021-11-29 03:51:34 +0100351013A06000,"Red Colony",,playable,2021-01-25 20:44:41 +01007820196A6000,"Red Dead Redemption",amd-vendor-bug,playable,2024-09-13 13:26:13 +0100069010592000,"Red Death",,playable,2020-08-30 13:07:37 +010075000C608000,"Red Faction Guerrilla Re-Mars-tered",ldn-untested;nvdec;online,playable,2021-06-07 03:02:13 +01002290070E4000,"Red Game Without a Great Name",,playable,2021-01-19 21:42:35 +010045400D73E000,"Red Siren: Space Defense",UE4,playable,2021-04-25 21:21:29 +0100D8A00E880000,"Red Wings: Aces of the Sky",,playable,2020-06-12 01:19:53 +01000D100DCF8000,"Redeemer: Enhanced Edition",nvdec;UE4;vulkan-backend-bug,playable,2022-09-11 10:20:24 +0100326010B98000,"Redout: Space Assault",UE4,playable,2022-10-19 23:04:35 +010007C00E558000,"Reel Fishing: Road Trip Adventure",,playable,2021-03-02 16:06:43 +010045D01273A000,"Reflection of Mine",audio,playable,2020-12-17 15:06:37 +01003AA00F5C4000,"Refreshing Sideways Puzzle Ghost Hammer",,playable,2020-10-18 12:08:54 +01007A800D520000,"Refunct",UE4,playable,2020-12-15 22:46:21 +0100FDF0083A6000,"Regalia: Of Men and Monarchs - Royal Edition",,playable,2022-08-11 12:24:01 +01005FD00F15A000,"Regions of Ruin",,playable,2020-08-05 11:38:58 +0100B5800C0E4000,"Reine des Fleurs",cpu;crash,boots,2020-09-27 18:50:39 +0100F1900B144000,"REKT! High Octane Stunts",online,playable,2020-09-28 12:33:56 +01002AD013C52000,"Relicta",nvdec;UE4,playable,2022-10-31 12:48:33 +010095900B436000,"RemiLore",,playable,2021-06-03 18:58:15 +0100FBD00F5F6000,"Remothered: Broken Porcelain",UE4;gpu;nvdec,ingame,2021-06-17 15:13:11 +01001F100E8AE000,"Remothered: Tormented Fathers",nvdec;UE4,playable,2022-10-19 23:26:50 +01008EE00B22C000,"Rento Fortune",ldn-untested;online,playable,2021-01-19 19:52:21 +01007CC0130C6000,"Renzo Racer",,playable,2021-03-23 22:28:05 +01003C400AD42000,"Rescue Tale",,playable,2022-09-20 18:40:18 +010099A00BC1E000,"resident evil 4",nvdec,playable,2022-11-16 21:16:04 +010018100CD46000,"Resident Evil 5",nvdec,playable,2024-02-18 17:15:29 +01002A000CD48000,"Resident Evil 6",nvdec,playable,2022-09-15 14:31:47 +0100643002136000,"Resident Evil Revelations",nvdec;ldn-untested,playable,2022-08-11 12:44:19 +010095300212A000,"Resident Evil Revelations 2",online-broken;ldn-untested,playable,2022-08-11 12:57:50 +0100E7F00FFB8000,"Resolutiion",crash,boots,2021-04-25 21:57:56 +0100FF201568E000,"Restless Night",crash,nothing,2022-02-09 10:54:49 +0100069000078000,"Retail Interactive Display Menu (DevQuestMenu)",services;crash,nothing,2022-08-11 13:19:41 +010086E00BCB2000,"Retimed",,playable,2022-08-11 13:32:39 +0100F17004156000,"Retro City Rampage DX",,playable,2021-01-05 17:04:17 +01000ED014A2C000,"Retro Machina",online-broken,playable,2022-10-31 13:38:58 +010032E00E6E2000,"Return of the Obra Dinn",,playable,2022-09-15 19:56:45 +010027400F708000,"Revenge of Justice",nvdec,playable,2022-11-20 15:43:23 +0100E2E00EA42000,"Reventure",,playable,2022-09-15 20:07:06 +010071D00F156000,"REZ PLZ",,playable,2020-10-24 13:26:12 +0100729012D18000,"Rhythm Fighter",crash,nothing,2021-02-16 18:51:30 +010081D0100F0000,"Rhythm of the Gods",UE4;crash,nothing,2020-10-03 17:39:59 +01009D5009234000,"RICO",nvdec;online-broken,playable,2022-08-11 20:16:40 +01002C700C326000,"Riddled Corpses EX",,playable,2021-06-06 16:02:44 +0100AC600D898000,"Rift Keeper",,playable,2022-09-20 19:48:20 +0100A62002042000,"RiME",UE4;crash;gpu,boots,2020-07-20 15:52:38 +01006AC00EE6E000,"Rimelands: Hammer of Thor",,playable,2022-10-13 13:32:56 +01002FF008C24000,"RingFit Adventure",crash;services,nothing,2021-04-14 19:00:01 +010088E00B816000,"RIOT - Civil Unrest",,playable,2022-08-11 20:27:56 +01002A6006AA4000,"Riptide GP: Renegade",online,playable,2021-04-13 23:33:02 +010065B00B0EC000,"Rise and Shine",,playable,2020-12-12 15:56:43 +0100E9C010EA8000,"Rise of Insanity",,playable,2020-08-30 15:42:14 +01006BA00E652000,"Rise: Race The Future",,playable,2021-02-27 13:29:06 +010020C012F48000,"Rising Hell",,playable,2022-10-31 13:54:02 +010076D00E4BA000,"Risk of Rain 2",online-broken,playable,2024-03-04 17:01:05 +0100E8300A67A000,"RISK® Global Domination",nvdec;online-broken,playable,2022-08-01 18:53:28 +010042500FABA000,"Ritual: Crown of Horns",,playable,2021-01-26 16:01:47 +0100BD300F0EC000,"Ritual: Sorcerer Angel",,playable,2021-03-02 13:51:19 +0100A7D008392000,"Rival Megagun",nvdec;online,playable,2021-01-19 14:01:46 +010069C00401A000,"RIVE: Ultimate Edition",,playable,2021-03-24 18:45:55 +01004E700DFE6000,"River City Girls",nvdec,playable,2020-06-10 23:44:09 +01002E80168F4000,"River City Girls 2",,playable,2022-12-07 00:46:27 +0100B2100767C000,"River City Melee Mach!!",online-broken,playable,2022-09-20 20:51:57 +01008AC0115C6000,"RMX Real Motocross",,playable,2020-10-08 21:06:15 +010053000B986000,"Road Redemption",online-broken,playable,2022-08-12 11:26:20 +010002F009A7A000,"Road to Ballhalla",UE4,playable,2021-06-07 02:22:36 +0100735010F58000,"Road To Guangdong",slow,playable,2020-10-12 12:15:32 +010068200C5BE000,"Roarr! Jurassic Edition",,playable,2022-10-19 23:57:45 +0100618004096000,"Robonauts",nvdec,playable,2022-08-12 11:33:23 +010039A0117C0000,"ROBOTICS;NOTES DaSH",,playable,2020-11-16 23:09:54 +01002A900EE8A000,"ROBOTICS;NOTES ELITE",,playable,2020-11-26 10:28:20 +010044A010BB8000,"Robozarro",,playable,2020-09-03 13:33:40 +01000CC012D74000,"Rock 'N Racing Bundle Grand Prix & Rally",,playable,2021-01-06 20:23:57 +0100A1B00DB36000,"Rock of Ages 3: Make & Break",UE4,playable,2022-10-06 12:18:29 +0100513005AF4000,"Rock'N Racing Off Road DX",,playable,2021-01-10 15:27:15 +01005EE0036EC000,"Rocket League®",gpu;online-broken;ldn-untested,ingame,2024-02-08 19:51:36 +0100E88009A34000,"Rocket Wars",,playable,2020-07-24 14:27:39 +0100EC7009348000,"Rogue Aces",gpu;services;nvdec,ingame,2021-11-30 02:18:30 +01009FA010848000,"Rogue Heroes: Ruins of Tasos",online,playable,2021-04-01 15:41:25 +010056500AD50000,"Rogue Legacy",,playable,2020-08-10 19:17:28 +0100F3B010F56000,"Rogue Robots",,playable,2020-06-16 12:16:11 +01001CC00416C000,"Rogue Trooper Redux",nvdec;online-broken,playable,2022-08-12 11:53:01 +0100C7300C0EC000,"RogueCube",,playable,2021-06-16 12:16:42 +0100B7200FC96000,"Roll'd",,playable,2020-07-04 20:24:01 +01004900113F8000,"RollerCoaster Tycoon 3 Complete Edition",32-bit,playable,2022-10-17 14:18:01 +0100E3900B598000,"RollerCoaster Tycoon Adventures",nvdec,playable,2021-01-05 18:14:18 +010076200CA16000,"Rolling Gunner",,playable,2021-05-26 12:54:18 +0100579011B40000,"Rolling Sky 2",,playable,2022-11-03 10:21:12 +010050400BD38000,"Roman Rumble in Las Vegum - Asterix & Obelix XXL 2",deadlock;nvdec,ingame,2022-07-21 17:54:14 +01001F600829A000,"Romancing SaGa 2",,playable,2022-08-12 12:02:24 +0100D0400D27A000,"Romancing SaGa 3",audio;gpu,ingame,2020-06-27 20:26:18 +010088100DD42000,"Roof Rage",crash;regression,boots,2023-11-12 03:47:18 +0100F3000FA58000,"Roombo: First Blood",nvdec,playable,2020-08-05 12:11:37 +0100936011556000,"Root Double -Before Crime * After Days- Xtend Edition",crash,nothing,2022-02-05 02:03:49 +010030A00DA3A000,"Root Letter: Last Answer",vulkan-backend-bug,playable,2022-09-17 10:25:57 +0100AFE00DDAC000,"Royal Roads",,playable,2020-11-17 12:54:38 +0100E2C00B414000,"RPG Maker MV",nvdec,playable,2021-01-05 20:12:01 +01005CD015986000,"rRootage Reloaded",,playable,2022-08-05 23:20:18 +,"RSDKv5u",homebrew,ingame,2024-04-01 16:25:34 +010009B00D33C000,"Rugby Challenge 4",slow;online-broken;UE4,playable,2022-10-06 12:45:53 +01006EC00F2CC000,"RUINER",UE4,playable,2022-10-03 14:11:33 +010074F00DE4A000,"Run the Fan",,playable,2021-02-27 13:36:28 +0100ADF00700E000,"Runbow",online,playable,2021-01-08 22:47:44 +0100D37009B8A000,"Runbow Deluxe Edition",online-broken,playable,2022-08-12 12:20:25 +010081C0191D8000,"Rune Factory 3 Special",,playable,2023-10-15 08:32:49 +010051D00E3A4000,"Rune Factory 4 Special",32-bit;crash;nvdec,ingame,2023-05-06 08:49:17 +010014D01216E000,"Rune Factory 5 (JP)",gpu,ingame,2021-06-01 12:00:36 +010071E0145F8000,"Rustler",,playable,2025-02-10 20:17:12 +0100E21013908000,"RWBY: Grimm Eclipse - Definitive Edition",online-broken,playable,2022-11-03 10:44:01 +010012C0060F0000,"RXN -Raijin-",nvdec,playable,2021-01-10 16:05:43 +0100B8B012ECA000,"S.N.I.P.E.R. - Hunter Scope",,playable,2021-04-19 15:58:09 +010007700CFA2000,"Saboteur II: Avenging Angel",Needs Update;cpu;crash,nothing,2021-01-26 14:47:37 +0100D94012FE8000,"Saboteur SiO",slow,ingame,2020-12-17 16:59:49 +0100A5200C2E0000,"Safety First!",,playable,2021-01-06 09:05:23 +0100A51013530000,"SaGa Frontier Remastered",nvdec,playable,2022-11-03 13:54:56 +010003A00D0B4000,"SaGa SCARLET GRACE: AMBITIONS™",,playable,2022-10-06 13:20:31 +01008D100D43E000,"Saints Row IV®: Re-Elected™",ldn-untested;LAN;deadlock,ingame,2025-02-02 16:57:53 +0100DE600BEEE000,"SAINTS ROW®: THE THIRD™ - THE FULL PACKAGE",slow;LAN,playable,2023-08-24 02:40:58 +01007F000EB36000,"Sakai and...",nvdec,playable,2022-12-15 13:53:19 +0100B1400E8FE000,"Sakuna: Of Rice and Ruin",,playable,2023-07-24 13:47:13 +0100BBF0122B4000,"Sally Face",,playable,2022-06-06 18:41:24 +0100D250083B4000,"Salt and Sanctuary",,playable,2020-10-22 11:52:19 +0100CD301354E000,"Sam & Max Save the World",,playable,2020-12-12 13:11:51 +010014000C63C000,"Samsara: Deluxe Edition",,playable,2021-01-11 15:14:12 +0100ADF0096F2000,"Samurai Aces for Nintendo Switch",32-bit,playable,2020-11-24 20:26:55 +01006C600E46E000,"Samurai Jack: Battle Through Time",nvdec;UE4,playable,2022-10-06 13:33:59 +01002DF00F76C000,"SAMURAI SHODOWN",UE4;crash;nvdec,menus,2020-09-06 02:17:00 +0100F6800F48E000,"SAMURAI SHODOWN NEOGEO COLLECTION",nvdec,playable,2021-06-14 17:12:56 +0100B6501A360000,"Samurai Warrior",,playable,2023-02-27 18:42:38 +01000EA00B23C000,"Sangoku Rensenki ~Otome no Heihou!~",gpu;nvdec,ingame,2020-10-17 19:13:14 +0100A4700BC98000,"Satsujin Tantei Jack the Ripper",,playable,2021-06-21 16:32:54 +0100F0000869C000,"Saturday Morning RPG",nvdec,playable,2022-08-12 12:41:50 +01006EE00380C000,"Sausage Sports Club",gpu,ingame,2021-01-10 05:37:17 +0100C8300FA90000,"Save Koch",,playable,2022-09-26 17:06:56 +0100D6E008700000,"Save the Ninja Clan",,playable,2021-01-11 13:56:37 +010091000F72C000,"Save Your Nuts",nvdec;online-broken;UE4,playable,2022-09-27 23:12:02 +0100AA00128BA000,"Saviors of Sapphire Wings / Stranger of Sword City Revisited",crash,menus,2022-10-24 23:00:46 +01001C3012912000,"Say No! More",,playable,2021-05-06 13:43:34 +010010A00A95E000,"Sayonara Wild Hearts",,playable,2023-10-23 03:20:01 +0100ACB004006000,"Schlag den Star",slow;nvdec,playable,2022-08-12 14:28:22 +0100394011C30000,"Scott Pilgrim vs. The World™: The Game – Complete Edition",services-horizon;crash,nothing,2024-07-12 08:13:03 +0100E7100B198000,"Scribblenauts Mega Pack",nvdec,playable,2020-12-17 22:56:14 +01001E40041BE000,"Scribblenauts Showdown",gpu;nvdec,ingame,2020-12-17 23:05:53 +0100829018568000,"SD GUNDAM BATTLE ALLIANCE Demo",audio;crash;demo,ingame,2022-08-01 23:01:20 +010055700CEA8000,"SD GUNDAM G GENERATION CROSS RAYS",nvdec,playable,2022-09-15 20:58:44 +010022900D3EC00,"SD GUNDAM G GENERATION CROSS RAYS PREMIUM G SOUND EDITION",nvdec,playable,2022-09-15 20:45:57 +0100E4A00D066000,"Sea King",UE4;nvdec,playable,2021-06-04 15:49:22 +0100AFE012BA2000,"Sea of Solitude: The Director's Cut",gpu,ingame,2024-07-12 18:29:29 +01008C0016544000,"Sea of Stars",,playable,2024-03-15 20:27:12 +010036F0182C4000,"Sea of Stars Demo",demo,playable,2023-02-12 15:33:56 +0100C2400D68C000,"SeaBed",,playable,2020-05-17 13:25:37 +010077100CA6E000,"Season Match Bundle",,playable,2020-10-27 16:15:22 +010028F010644000,"Secret Files 3",nvdec,playable,2020-10-24 15:32:39 +010075D0101FA000,"Seek Hearts",,playable,2022-11-22 15:06:26 +0100394010844000,"Seers Isle",,playable,2020-11-17 12:28:50 +0100A8900AF04000,"SEGA AGES Alex Kidd in Miracle World",online,playable,2021-05-05 16:35:47 +01001E600AF08000,"SEGA AGES Gain Ground",online,playable,2021-05-05 16:16:27 +0100D4D00AC62000,"SEGA AGES Out Run",,playable,2021-01-11 13:13:59 +01005A300C9F6000,"SEGA AGES Phantasy Star",,playable,2021-01-11 12:49:48 +01005F600CB0E000,"SEGA AGES Puyo Puyo",online,playable,2021-05-05 16:09:28 +010051F00AC5E000,"SEGA AGES Sonic The Hedgehog",slow,playable,2023-03-05 20:16:31 +01000D200C614000,"SEGA AGES Sonic The Hedgehog 2",,playable,2022-09-21 20:26:35 +0100C3E00B700000,"SEGA AGES Space Harrier",,playable,2021-01-11 12:57:40 +010054400D2E6000,"SEGA AGES Virtua Racing",online-broken,playable,2023-01-29 17:08:39 +01001E700AC60000,"SEGA AGES Wonder Boy: Monster Land",online,playable,2021-05-05 16:28:25 +0100B3C014BDA000,"SEGA Genesis™ – Nintendo Switch Online",crash;regression,ingame,2025-02-03 22:13:30 +0100F7300B24E000,"SEGA Mega Drive Classics",online,playable,2021-01-05 11:08:00 +01009840046BC000,"Semispheres",,playable,2021-01-06 23:08:31 +0100D1800D902000,"SENRAN KAGURA Peach Ball",,playable,2021-06-03 15:12:10 +0100E0C00ADAC000,"SENRAN KAGURA Reflexions",,playable,2020-03-23 19:15:23 +01009E500D29C000,"Sentinels of Freedom",,playable,2021-06-14 16:42:19 +0100A5D012DAC000,"SENTRY",,playable,2020-12-13 12:00:24 +010059700D4A0000,"Sephirothic Stories",services,menus,2021-11-25 08:52:17 +010007D00D43A000,"Serious Sam Collection",vulkan-backend-bug,boots,2022-10-13 13:53:34 +0100B2C00E4DA000,"Served!",nvdec,playable,2022-09-28 12:46:00 +010018400C24E000,"Seven Knights -Time Wanderer-",vulkan-backend-bug,playable,2022-10-13 22:08:54 +0100D6F016676000,"Seven Pirates H",,playable,2024-06-03 14:54:12 +0100157004512000,"Severed",,playable,2020-12-15 21:48:48 +0100D5500DA94000,"Shadow Blade: Reload",nvdec,playable,2021-06-11 18:40:43 +0100BE501382A000,"Shadow Gangs",cpu;gpu;crash;regression,ingame,2024-04-29 00:07:26 +0100C3A013840000,"Shadow Man Remastered",gpu,ingame,2024-05-20 06:01:39 +010073400B696000,"Shadowgate",,playable,2021-04-24 07:32:57 +0100371013B3E000,"Shadowrun Returns",gpu;Needs Update,ingame,2022-10-04 21:32:31 +01008310154C4000,"Shadowrun: Dragonfall - Director's Cut",gpu;Needs Update,ingame,2022-10-04 20:52:18 +0100C610154CA000,"Shadowrun: Hong Kong - Extended Edition",gpu;Needs Update,ingame,2022-10-04 20:53:09 +010000000EEF0000,"Shadows 2: Perfidia",,playable,2020-08-07 12:43:46 +0100AD700CBBE000,"Shadows of Adam",,playable,2021-01-11 13:35:58 +01002A800C064000,"Shadowverse Champions Battle",,playable,2022-10-02 22:59:29 +01003B90136DA000,"Shadowverse: Champion's Battle",crash,nothing,2023-03-06 00:31:50 +0100820013612000,"Shady Part of Me",,playable,2022-10-20 11:31:55 +0100B10002904000,"Shakedown: Hawaii",,playable,2021-01-07 09:44:36 +01008DA012EC0000,"Shakes on a Plane",crash,menus,2021-11-25 08:52:25 +0100B4900E008000,"Shalnor Legends: Sacred Lands",,playable,2021-06-11 14:57:11 +010006C00CC10000,"Shanky: The Vegan`s Nightmare",,playable,2021-01-26 15:03:55 +0100430013120000,"Shantae",,playable,2021-05-21 04:53:26 +0100EFD00A4FA000,"Shantae and the Pirate's Curse",,playable,2024-04-29 17:21:57 +0100EB901040A000,"Shantae and the Seven Sirens",nvdec,playable,2020-06-19 12:23:40 +01006A200936C000,"Shantae: Half- Genie Hero Ultimate Edition",,playable,2020-06-04 20:14:20 +0100ADA012370000,"Shantae: Risky's Revenge - Director's Cut",,playable,2022-10-06 20:47:39 +01003AB01062C000,"Shaolin vs Wutang",deadlock,nothing,2021-03-29 20:38:54 +0100B250009B9600,"Shape Of The World0",UE4,playable,2021-03-05 16:42:28 +01004F50085F2000,"She Remembered Caterpillars",,playable,2022-08-12 17:45:14 +01000320110C2000,"She Sees Red - Interactive Movie",nvdec,playable,2022-09-30 11:30:15 +01009EB004CB0000,"Shelter Generations",,playable,2021-06-04 16:52:39 +010020F014DBE000,"Sherlock Holmes: The Devil’s Daughter",gpu,ingame,2022-07-11 00:07:26 +0100B1000AC3A000,"Shift Happens",,playable,2021-01-05 21:24:18 +01000E8009E1C000,"Shift Quantum",UE4;crash,ingame,2020-11-06 21:54:08 +01000750084B2000,"Shiftlings - Enhanced Edition",nvdec,playable,2021-03-04 13:49:54 +01003B0012DC2000,"Shin Megami Tensei III Nocturne HD Remaster",,playable,2022-11-03 22:53:27 +010045800ED1E000,"Shin Megami Tensei III NOCTURNE HD REMASTER",gpu;Needs Update,ingame,2022-11-03 19:57:01 +010063B012DC6000,"Shin Megami Tensei V",UE4,playable,2024-02-21 06:30:07 +010069C01AB82000,"Shin Megami Tensei V: Vengeance",gpu;vulkan-backend-bug,ingame,2024-07-14 11:28:24 +01009050133B4000,"Shing! (サムライフォース:斬!)",nvdec,playable,2022-10-22 00:48:54 +01009A5009A9E000,"Shining Resonance Refrain",nvdec,playable,2022-08-12 18:03:01 +01004EE0104F6000,"Shinsekai Into the Depths™",,playable,2022-09-28 14:07:51 +0100C2F00A568000,"Shio",,playable,2021-02-22 16:25:09 +0100B2E00F13E000,"Shipped",,playable,2020-11-21 14:22:32 +01000E800FCB4000,"Ships",,playable,2021-06-11 16:14:37 +01007430122D0000,"Shiren the Wanderer: The Tower of Fortune and the Dice of Fate",nvdec,playable,2022-10-20 11:44:36 +010027300A660000,"Shiritsu Berubara Gakuen ~Versailles no Bara Re*imagination~",cpu;crash,boots,2020-09-27 19:01:25 +01000244016BAE00,"Shiro0",gpu,ingame,2024-01-13 08:54:39 +0100CCE00DDB6000,"Shoot 1UP DX",,playable,2020-12-13 12:32:47 +01001180021FA000,"Shovel Knight: Specter of Torment",,playable,2020-05-30 08:34:17 +010057D0021E8000,"Shovel Knight: Treasure Trove",,playable,2021-02-14 18:24:39 +01003DD00BF0E000,"Shred! 2 - ft Sam Pilgrim",,playable,2020-05-30 14:34:09 +01001DE0076A4000,"Shu",nvdec,playable,2020-05-30 09:08:59 +0100A7900B936000,"Shut Eye",,playable,2020-07-23 18:08:35 +010044500C182000,"Sid Meier’s Civilization VI",ldn-untested,playable,2024-04-08 16:03:40 +01007FC00B674000,"Sigi - A Fart for Melusina",,playable,2021-02-22 16:46:58 +0100F1400B0D6000,"Silence",nvdec,playable,2021-06-03 14:46:17 +0100A32010618000,"Silent World",,playable,2020-08-28 13:45:13 +010045500DFE2000,"Silk",nvdec,playable,2021-06-10 15:34:37 +010016D00A964000,"SilverStarChess",,playable,2021-05-06 15:25:57 +0100E8C019B36000,"Simona's Requiem",gpu,ingame,2023-02-21 18:29:19 +01006FE010438000,"Sin Slayers",,playable,2022-10-20 11:53:52 +01002820036A8000,"Sine Mora EX",gpu;online-broken,ingame,2022-08-12 19:36:18 +0100F10012002000,"Singled Out",online,playable,2020-08-03 13:06:18 +0100B8800F858000,"Sinless",nvdec,playable,2020-08-09 20:18:55 +0100B16009C10000,"SINNER: Sacrifice for Redemption",nvdec;UE4;vulkan-backend-bug,playable,2022-08-12 20:37:33 +0100E9201410E000,"Sir Lovelot",,playable,2021-04-05 16:21:46 +0100134011E32000,"Skate City",,playable,2022-11-04 11:37:39 +0100B2F008BD8000,"Skee-Ball",,playable,2020-11-16 04:44:07 +01001A900F862000,"Skelattack",,playable,2021-06-09 15:26:26 +01008E700F952000,"Skelittle: A Giant Party!",,playable,2021-06-09 19:08:34 +01006C000DC8A000,"Skelly Selest",,playable,2020-05-30 15:38:18 +0100D67006F14000,"Skies of Fury DX",,playable,2020-05-30 16:40:54 +010046B00DE62000,"Skullgirls 2nd Encore",,playable,2022-09-15 21:21:25 +0100D1100BF9C000,"Skulls of the Shogun: Bone-A-Fide Edition",,playable,2020-08-31 18:58:12 +0100D7B011654000,"Skully",nvdec;UE4,playable,2022-10-06 13:52:59 +010083100B5CA000,"Sky Force Anniversary",online-broken,playable,2022-08-12 20:50:07 +01006FE005B6E000,"Sky Force Reloaded",,playable,2021-01-04 20:06:57 +010003F00CC98000,"Sky Gamblers - Afterburner",gpu;vulkan-backend-bug;opengl-backend-bug,ingame,2022-08-12 21:04:55 +010093D00AC38000,"Sky Gamblers: Storm Raiders",gpu;audio;32-bit,ingame,2022-08-12 21:13:36 +010068200E96E000,"Sky Gamblers: Storm Raiders 2",gpu,ingame,2022-09-13 12:24:04 +01004F0010A02000,"Sky Racket",,playable,2020-09-07 12:22:24 +0100DDB004F30000,"Sky Ride",,playable,2021-02-22 16:53:07 +0100C5700434C000,"Sky Rogue",,playable,2020-05-30 08:26:28 +0100C52011460000,"Sky: Children of the Light",cpu;online-broken,nothing,2023-02-23 10:57:10 +010041C01014E000,"Skybolt Zack",,playable,2021-04-12 18:28:00 +0100A0A00D1AA000,"SKYHILL",,playable,2021-03-05 15:19:11 +0100CCC0002E6000,"Skylanders Imaginators",crash;services,boots,2020-05-30 18:49:18 +010021A00ABEE000,"SKYPEACE",,playable,2020-05-29 14:14:30 +0100EA400BF44000,"SkyScrappers",,playable,2020-05-28 22:11:25 +0100F3C00C400000,"SkyTime",slow,ingame,2020-05-30 09:24:51 +01003AD00DEAE000,"SlabWell: The Quest For Kaktun's Alpaca",,playable,2021-02-22 17:02:51 +0100224004004000,"Slain: Back from Hell",,playable,2022-08-12 23:36:19 +010026300BA4A000,"Slay the Spire",,playable,2023-01-20 15:09:26 +0100501006494000,"Slayaway Camp: Butcher's Cut",opengl-backend-bug,playable,2022-08-12 23:44:05 +01004E900EDDA000,"Slayin 2",gpu,ingame,2024-04-19 16:15:26 +01004AC0081DC000,"Sleep Tight",gpu;UE4,ingame,2022-08-13 00:17:32 +0100F4500AA4E000,"Slice, Dice & Rice",online,playable,2021-02-22 17:44:23 +010010D011E1C000,"Slide Stars",crash,menus,2021-11-25 08:53:43 +0100112003B8A000,"Slime-san",,playable,2020-05-30 16:15:12 +01002AA00C974000,"SMASHING THE BATTLE",,playable,2021-06-11 15:53:57 +0100C9100B06A000,"SmileBASIC 4",gpu,menus,2021-07-29 17:35:59 +0100207007EB2000,"Smoke And Sacrifice",,playable,2022-08-14 12:38:27 +01009790186FE000,"SMURFS KART",,playable,2023-10-18 00:55:00 +0100F2800D46E000,"Snack World The Dungeon Crawl Gold",gpu;slow;nvdec;audout,ingame,2022-05-01 21:12:44 +0100C0F0020E8000,"Snake Pass",nvdec;UE4,playable,2022-01-03 04:31:52 +010075A00BA14000,"Sniper Elite 3 Ultimate Edition",ldn-untested,playable,2024-04-18 07:47:49 +010007B010FCC000,"Sniper Elite 4",gpu;vulkan-backend-bug;opengl-backend-bug,ingame,2024-06-18 17:53:15 +0100BB000A3AA000,"Sniper Elite V2 Remastered",slow;nvdec;online-broken;ldn-untested,ingame,2022-08-14 13:23:13 +01008E20047DC000,"Snipperclips Plus: Cut It Out, Together!",,playable,2023-02-14 20:20:13 +0100704000B3A000,"Snipperclips™ – Cut it out, together!",,playable,2022-12-05 12:44:55 +01004AB00AEF8000,"SNK 40th ANNIVERSARY COLLECTION",,playable,2022-08-14 13:33:15 +010027F00AD6C000,"SNK HEROINES Tag Team Frenzy",nvdec;online-broken;ldn-untested,playable,2022-08-14 14:19:25 +01008DA00CBBA000,"Snooker 19",nvdec;online-broken;UE4,playable,2022-09-11 17:43:22 +010045300516E000,"Snow Moto Racing Freedom",gpu;vulkan-backend-bug,ingame,2022-08-15 16:05:14 +0100BE200C34A000,"Snowboarding The Next Phase",nvdec,playable,2021-02-23 12:56:58 +0100FBD013AB6000,"SnowRunner",services;crash,boots,2023-10-07 00:01:16 +010017B012AFC000,"Soccer Club Life: Playing Manager",gpu,ingame,2022-10-25 11:59:22 +0100B5000E05C000,"Soccer Pinball",UE4;gpu,ingame,2021-06-15 20:56:51 +010011A00A9A8000,"Soccer Slammers",,playable,2020-05-30 07:48:14 +010095C00F9DE000,"Soccer, Tactics & Glory",gpu,ingame,2022-09-26 17:15:58 +0100590009C38000,"SOL DIVIDE -SWORD OF DARKNESS- for Nintendo Switch",32-bit,playable,2021-06-09 14:13:03 +0100A290048B0000,"Soldam: Drop, Connect, Erase",,playable,2020-05-30 09:18:54 +010008600D1AC000,"Solo: Islands of the Heart",gpu;nvdec,ingame,2022-09-11 17:54:43 +01009EE00E91E000,"Some Distant Memory",,playable,2022-09-15 21:48:19 +01004F401BEBE000,"Song of Nunu: A League of Legends Story",,ingame,2024-07-12 18:53:44 +0100E5400BF94000,"Songbird Symphony",,playable,2021-02-27 02:44:04 +010031D00A604000,"Songbringer",,playable,2020-06-22 10:42:02 +,"Sonic 1 (2013)",crash;homebrew,ingame,2024-04-06 18:31:20 +,"Sonic 2 (2013)",crash;homebrew,ingame,2024-04-01 16:25:30 +,"Sonic A.I.R",homebrew,ingame,2024-04-01 16:25:32 +,"Sonic CD",crash;homebrew,ingame,2024-04-01 16:25:31 +010040E0116B8000,"Sonic Colors: Ultimate",,playable,2022-11-12 21:24:26 +01001270012B6000,"SONIC FORCES™",,playable,2024-07-28 13:11:21 +01004AD014BF0000,"Sonic Frontiers",gpu;deadlock;amd-vendor-bug;intel-vendor-bug,ingame,2024-09-05 09:18:53 +01009AA000FAA000,"Sonic Mania",,playable,2020-06-08 17:30:57 +01009FB016286000,"Sonic Origins",crash,ingame,2024-06-02 07:20:15 +01008F701C074000,"SONIC SUPERSTARS",gpu;nvdec,ingame,2023-10-28 17:48:07 +010088801C150000,"Sonic Superstars Digital Art Book with Mini Digital Soundtrack",,playable,2024-08-20 13:26:56 +01005EA01C0FC000,"SONIC X SHADOW GENERATIONS",crash,ingame,2025-01-07 04:20:45 +010064F00C212000,"Soul Axiom Rebooted",nvdec;slow,ingame,2020-09-04 12:41:01 +0100F2100F0B2000,"Soul Searching",,playable,2020-07-09 18:39:07 +01008F2005154000,"South Park™: The Fractured but Whole™ - Standard Edition",slow;online-broken;vulkan-backend-bug;gpu,ingame,2025-01-21 17:35:10 +0100B9F00C162000,"Space Blaze",,playable,2020-08-30 16:18:05 +010005500E81E000,"Space Cows",UE4;crash,menus,2020-06-15 11:33:20 +0100707011722000,"Space Elite Force",,playable,2020-11-27 15:21:05 +010047B010260000,"Space Pioneer",,playable,2022-10-20 12:24:37 +010010A009830000,"Space Ribbon",,playable,2022-08-15 17:17:10 +,"SpaceCadetPinball",homebrew,ingame,2024-04-18 19:30:04 +0100D9B0041CE000,"Spacecats with Lasers",,playable,2022-08-15 17:22:44 +010034800FB60000,"Spaceland",,playable,2020-11-01 14:31:56 +010028D0045CE000,"Sparkle 2",,playable,2020-10-19 11:51:39 +01000DC007E90000,"Sparkle Unleashed",,playable,2021-06-03 14:52:15 +0100E4F00AE14000,"Sparkle ZERO",gpu;slow,ingame,2020-03-23 18:19:18 +01007ED00C032000,"Sparklite",,playable,2022-08-06 11:35:41 +0100E6A009A26000,"Spartan",UE4;nvdec,playable,2021-03-05 15:53:19 +010020500E7A6000,"Speaking Simulator",,playable,2020-10-08 13:00:39 +01008B000A5AE000,"Spectrum",,playable,2022-08-16 11:15:59 +0100F18010BA0000,"Speed 3: Grand Prix",UE4,playable,2022-10-20 12:32:31 +010040F00AA9A000,"Speed Brawl",slow,playable,2020-09-18 22:08:16 +01000540139F6000,"Speed Limit",gpu,ingame,2022-09-02 18:37:40 +010061F013A0E000,"Speed Truck Racing",,playable,2022-10-20 12:57:04 +0100E74007EAC000,"Spellspire",,playable,2022-08-16 11:21:21 +010021F004270000,"Spelunker Party!",services,boots,2022-08-16 11:25:49 +0100710013ABA000,"Spelunky",,playable,2021-11-20 17:45:03 +0100BD500BA94000,"Sphinx and the Cursed Mummy",gpu;32-bit;opengl,ingame,2024-05-20 06:00:51 +010092A0102AE000,"Spider Solitaire",,playable,2020-12-16 16:19:30 +010076D0122A8000,"Spinch",,playable,2024-07-12 19:02:10 +01001E40136FE000,"Spinny's Journey",crash,ingame,2021-11-30 03:39:44 +010023E008702000,"Spiral Splatter",,playable,2020-06-04 14:03:57 +0100D1B00B6FA000,"Spirit Hunter: Death Mark",,playable,2020-12-13 10:56:25 +0100FAE00E19A000,"Spirit Hunter: NG",32-bit,playable,2020-12-17 20:38:47 +01005E101122E000,"Spirit of the North",UE4,playable,2022-09-30 11:40:47 +01000AC00F5EC000,"Spirit Roots",nvdec,playable,2020-07-10 13:33:32 +0100BD400DC52000,"Spiritfarer",gpu,ingame,2022-10-06 16:31:38 +01009D60080B4000,"SpiritSphere DX",,playable,2021-07-03 23:37:49 +010042700E3FC000,"Spitlings",online-broken,playable,2022-10-06 16:42:39 +01003BC0000A0000,"Splatoon™ 2",ldn-works;LAN,playable,2024-07-12 19:11:15 +0100C2500FC20000,"Splatoon™ 3",ldn-works;opengl-backend-bug;LAN;amd-vendor-bug,playable,2024-08-04 23:49:11 +0100BA0018500000,"Splatoon™ 3: Splatfest World Premiere",gpu;online-broken;demo,ingame,2022-09-19 03:17:12 +010062800D39C000,"SpongeBob SquarePants: Battle for Bikini Bottom - Rehydrated",online-broken;UE4;ldn-broken;vulkan-backend-bug,playable,2023-08-01 19:29:34 +01009FB0172F4000,"SpongeBob SquarePants: The Cosmic Shake",gpu;UE4,ingame,2024-03-04 16:35:00 +010097C01336A000,"Spooky Chase",,playable,2022-11-04 12:17:44 +0100C6100D75E000,"Spooky Ghosts Dot Com",,playable,2021-06-15 15:16:11 +0100DE9005170000,"Sports Party",nvdec,playable,2021-03-05 13:40:42 +0100E04009BD4000,"Spot The Difference",,playable,2022-08-16 11:49:52 +010052100D1B4000,"Spot The Differences: Party!",,playable,2022-08-16 11:55:26 +01000E6015350000,"Spy Alarm",services,ingame,2022-12-09 10:12:51 +01005D701264A000,"SpyHack",,playable,2021-04-15 10:53:51 +010077B00E046000,"Spyro™ Reignited Trilogy",nvdec;UE4,playable,2022-09-11 18:38:33 +0100085012A0E000,"Squeakers",,playable,2020-12-13 12:13:05 +0100E1D01EB2E000,"Squeakross: Home Squeak Home",,playable,2025-06-16 02:02:00 +010009300D31C000,"Squidgies Takeover",,playable,2020-07-20 22:28:08 +0100FCD0102EC000,"Squidlit",,playable,2020-08-06 12:38:32 +0100EBF00E702000,"STAR OCEAN First Departure R",nvdec,playable,2021-07-05 19:29:16 +010065301A2E0000,"STAR OCEAN THE SECOND STORY R",crash,ingame,2024-06-01 02:39:59 +010060D00F658000,"Star Renegades",nvdec,playable,2020-12-11 12:19:23 +0100D7000AE6A000,"Star Story: The Horizon Escape",,playable,2020-08-11 22:31:38 +01009DF015776000,"Star Trek Prodigy: Supernova",nvdec;UE4;opengl-backend-bug,playable,2022-10-14 10:18:50 +0100BD100FFBE000,"STAR WARS™ Episode I Racer",slow;nvdec,playable,2022-10-03 16:08:36 +0100BB500EACA000,"STAR WARS™ Jedi Knight II: Jedi Outcast™",gpu,ingame,2022-09-15 22:51:00 +01008CA00FAE8000,"STAR WARS™ Jedi Knight: Jedi Academy",gpu,boots,2021-06-16 12:35:30 +01006DA00DEAC000,"Star Wars™ Pinball",online-broken,playable,2022-09-11 18:53:31 +0100FA10115F8000,"STAR WARS™ Republic Commando™",gpu;32-bit,ingame,2023-10-31 15:57:17 +010040701B948000,"STAR WARS™: Battlefront Classic Collection",gpu;vulkan,ingame,2024-07-12 19:24:21 +0100854015868000,"STAR WARS™: Knights of the Old Republic™",gpu;deadlock,boots,2024-02-12 10:13:51 +0100153014544000,"STAR WARS™: The Force Unleashed™",,playable,2024-05-01 17:41:28 +01005EB00EA10000,"Star-Crossed Myth - The Department of Wishes -",gpu,ingame,2021-06-04 19:34:36 +0100E6B0115FC000,"Star99",online,menus,2021-11-26 14:18:51 +01002100137BA000,"Stardash",,playable,2021-01-21 16:31:19 +0100E65002BB8000,"Stardew Valley",online-broken;ldn-untested,playable,2024-02-14 03:11:19 +01002CC003FE6000,"Starlink: Battle for Atlas™ Digital Edition",services-horizon;crash;Needs Update,nothing,2024-05-05 17:25:11 +010098E010FDA000,"Starlit Adventures Golden Stars",,playable,2020-11-21 12:14:43 +01001BB00AC26000,"STARSHIP AVENGER Operation: Take Back Earth",,playable,2021-01-12 15:52:55 +010000700A572000,"State of Anarchy: Master of Mayhem",nvdec,playable,2021-01-12 19:00:05 +0100844004CB6000,"State of Mind",UE4;crash,boots,2020-06-22 22:17:50 +0100616009082000,"STAY",crash;services,boots,2021-04-23 14:24:52 +0100B61009C60000,"STAY COOL, KOBAYASHI-SAN!: A RIVER CITY RANSOM STORY",,playable,2021-01-26 17:37:28 +01008010118CC000,"Steam Prison",nvdec,playable,2021-04-01 15:34:11 +0100AE100DAFA000,"Steam Tactics",,playable,2022-10-06 16:53:45 +01004DD00C87A000,"Steamburg",,playable,2021-01-13 08:42:01 +01009320084A4000,"SteamWorld Dig",,playable,2024-08-19 12:12:23 +0100CA9002322000,"SteamWorld Dig 2",,playable,2022-12-21 19:25:42 +0100F6D00D83E000,"SteamWorld Quest: Hand of Gilgamech",nvdec,playable,2020-11-09 13:10:04 +01001C6014772000,"Steel Assault",,playable,2022-12-06 14:48:30 +010042800B880000,"STEINS;GATE ELITE",,playable,2020-08-04 07:33:32 +0100CB400E9BC000,"STEINS;GATE: My Darling's Embrace",nvdec,playable,2022-11-20 16:48:34 +01002DE01043E000,"Stela",UE4,playable,2021-06-15 13:28:34 +01005A700C954000,"Stellar Interface",,playable,2022-10-20 13:44:33 +0100BC800EDA2000,"STELLATUM",gpu,playable,2021-03-07 16:30:23 +0100775004794000,"Steredenn: Binary Stars",,playable,2021-01-13 09:19:42 +0100AE0006474000,"Stern Pinball Arcade",,playable,2022-08-16 14:24:41 +0100E24006FA8000,"Stikbold! A Dodgeball Adventure DELUXE",,playable,2021-01-11 20:12:54 +010077B014518000,"Stitchy in Tooki Trouble",,playable,2021-05-06 16:25:53 +010070D00F640000,"STONE",UE4,playable,2022-09-30 11:53:32 +010074400F6A8000,"Stories Untold",nvdec,playable,2022-12-22 01:08:46 +010040D00BCF4000,"Storm Boy",,playable,2022-10-20 14:15:06 +0100B2300B932000,"Storm In A Teacup",gpu,ingame,2021-11-06 02:03:19 +0100D5D00DAF2000,"Story of a Gladiator",,playable,2020-07-29 15:08:18 +010017301007E000,"STORY OF SEASONS Pioneers of Olive [ 牧場物語 オリーブタウンと希望の大地 ]",,playable,2021-03-18 11:42:19 +0100ED400EEC2000,"STORY OF SEASONS: Friends of Mineral Town",,playable,2022-10-03 16:40:31 +010078D00E8F4000,"Stranded Sails - Explorers of the Cursed Islands",slow;nvdec;UE4,playable,2022-09-16 11:58:38 +01000A6013F86000,"Strange Field Football",,playable,2022-11-04 12:25:57 +0100DD600DD48000,"Stranger Things 3: The Game",,playable,2021-01-11 17:44:09 +0100D7E011C64000,"Strawberry Vinegar",nvdec,playable,2022-12-05 16:25:40 +010075101EF84000,"Stray",crash,ingame,2025-01-07 04:03:00 +0100024008310000,"Street Fighter 30th Anniversary Collection",online-broken;ldn-partial,playable,2022-08-20 16:50:47 +010012400D202000,"Street Outlaws: The List",nvdec,playable,2021-06-11 12:15:32 +0100888011CB2000,"Street Power Soccer",UE4;crash,boots,2020-11-21 12:28:57 +0100EC9010258000,"Streets of Rage 4",nvdec;online,playable,2020-07-07 21:21:22 +0100BDE012928000,"Strife: Veteran Edition",gpu,ingame,2022-01-15 05:10:42 +010039100DACC000,"Strike Force - War on Terror",crash;Needs Update,menus,2021-11-24 08:08:20 +010038A00E6C6000,"Strike Force Kitty",nvdec,playable,2020-07-29 16:22:15 +010072500D52E000,"Strike Suit Zero: Director's Cut",crash,boots,2021-04-23 17:15:14 +0100FF5005B76000,"STRIKERS1945 for Nintendo Switch",32-bit,playable,2021-06-03 19:35:04 +0100720008ED2000,"STRIKERS1945 Ⅱ for Nintendo Switch",32-bit,playable,2021-06-03 19:43:00 +0100681011B56000,"Struggling",,playable,2020-10-15 20:37:03 +0100AF000B4AE000,"Stunt Kite Party",nvdec,playable,2021-01-25 17:16:56 +0100C5500E7AE000,"STURMWIND EX",audio;32-bit,playable,2022-09-16 12:01:39 +01001C1009892000,"Subarashiki Kono Sekai -Final Remix-",services;slow,ingame,2020-02-10 16:21:51 +010001400E474000,"Subdivision Infinity DX",UE4;crash,boots,2021-03-03 14:26:46 +0100E6400BCE8000,"Sublevel Zero Redux",,playable,2022-09-16 12:30:03 +0100EDA00D866000,"Submerged",nvdec;UE4;vulkan-backend-bug,playable,2022-08-16 15:17:01 +0100429011144000,"Subnautica",vulkan-backend-bug,playable,2022-11-04 13:07:29 +010014C011146000,"Subnautica: Below Zero",,playable,2022-12-23 14:15:13 +0100BF9012AC6000,"Suguru Nature",crash,ingame,2021-07-29 11:36:27 +01005CD00A2A2000,"Suicide Guy",,playable,2021-01-26 13:13:54 +0100DE000C2E4000,"Suicide Guy: Sleepin' Deeply",Needs More Attention,ingame,2022-09-20 23:45:25 +01003D50126A4000,"Sumire",,playable,2022-11-12 13:40:43 +0100A130109B2000,"Summer in Mara",nvdec,playable,2021-03-06 14:10:38 +01004E500DB9E000,"Summer Sweetheart",nvdec,playable,2022-09-16 12:51:46 +0100BFE014476000,"Sunblaze",,playable,2022-11-12 13:59:23 +01002D3007962000,"Sundered: Eldritch Edition",gpu,ingame,2021-06-07 11:46:00 +0100F7000464A000,"Super Beat Sports™",ldn-untested,playable,2022-08-16 16:05:50 +010051A00D716000,"Super Blood Hockey",,playable,2020-12-11 20:01:41 +01007AD00013E000,"Super Bomberman R",nvdec;online-broken;ldn-works,playable,2022-08-16 19:19:14 +0100B87017D94000,"SUPER BOMBERMAN R 2",deadlock,boots,2023-09-29 13:19:51 +0100D9B00DB5E000,"Super Cane Magic ZERO",,playable,2022-09-12 15:33:46 +010065F004E5E000,"Super Chariot",,playable,2021-06-03 13:19:01 +0100E5E00C464000,"SUPER DRAGON BALL HEROES WORLD MISSION",nvdec;online-broken,playable,2022-08-17 12:56:30 +010023100B19A000,"Super Dungeon Tactics",,playable,2022-10-06 17:40:40 +010056800B534000,"Super Inefficient Golf",UE4,playable,2022-08-17 15:53:45 +010015700D5DC000,"Super Jumpy Ball",,playable,2020-07-04 18:40:36 +0100196009998000,"Super Kickers League Ultimate",,playable,2021-01-26 13:36:48 +01003FB00C5A8000,"Super Kirby Clash™",ldn-works,playable,2024-07-30 18:21:55 +010000D00F81A000,"Super Korotama",,playable,2021-06-06 19:06:22 +01003E300FCAE000,"Super Loop Drive",nvdec;UE4,playable,2022-09-22 10:58:05 +054507E0B7552000,"Super Mario 64",homebrew,ingame,2024-03-20 16:57:27 +0100277011F1A000,"Super Mario Bros.™ 35",online-broken,menus,2022-08-07 16:27:25 +010015100B514000,"Super Mario Bros.™ Wonder",amd-vendor-bug,playable,2024-09-06 13:21:21 +01009B90006DC000,"Super Mario Maker™ 2",online-broken;ldn-broken,playable,2024-08-25 11:05:19 +0100000000010000,"Super Mario Odyssey™",nvdec;intel-vendor-bug;mac-bug,playable,2024-08-25 01:32:34 +010036B0034E4000,"Super Mario Party™",gpu;Needs Update;ldn-works,ingame,2024-06-21 05:10:16 +0100965017338000,"Super Mario Party Jamboree",mac-bug;gpu,ingame,2025-02-17 02:09:20 +0100BC0018138000,"Super Mario RPG™",gpu;audio;nvdec,ingame,2024-06-19 17:43:42 +,"Super Mario World",homebrew,boots,2024-06-13 01:40:31 +010049900F546000,"Super Mario™ 3D All-Stars",services-horizon;slow;vulkan;amd-vendor-bug,ingame,2024-05-07 02:38:16 +010028600EBDA000,"Super Mario™ 3D World + Bowser’s Fury",ldn-works,playable,2024-07-31 10:45:37 +01004F8006A78000,"Super Meat Boy",services,playable,2020-04-02 23:10:07 +01009C200D60E000,"Super Meat Boy Forever",gpu,boots,2021-04-26 14:25:39 +0100BDD00EC5C000,"Super Mega Space Blaster Special Turbo",online,playable,2020-08-06 12:13:25 +010031F019294000,"Super Monkey Ball Banana Rumble",,playable,2024-06-28 10:39:18 +0100B2A00E1E0000,"Super Monkey Ball: Banana Blitz HD",online-broken,playable,2022-09-16 13:16:25 +01006D000D2A0000,"Super Mutant Alien Assault",,playable,2020-06-07 23:32:45 +01004D600AC14000,"Super Neptunia RPG",nvdec,playable,2022-08-17 16:38:52 +01008D300C50C000,"Super Nintendo Entertainment System™ - Nintendo Switch Online",,playable,2021-01-05 00:29:48 +0100284007D6C000,"Super One More Jump",,playable,2022-08-17 16:47:47 +01001F90122B2000,"Super Punch Patrol",,playable,2024-07-12 19:49:02 +0100331005E8E000,"Super Putty Squad",gpu;32-bit,ingame,2024-04-29 15:51:54 +01006C900CC60000,"SUPER ROBOT WARS T",online,playable,2021-03-25 11:00:40 +0100CA400E300000,"SUPER ROBOT WARS V",online,playable,2020-06-23 12:56:37 +010026800E304000,"SUPER ROBOT WARS X",online,playable,2020-08-05 19:18:51 +01004CF00A60E000,"Super Saurio Fly",nvdec,playable,2020-08-06 13:12:14 +010039700D200000,"Super Skelemania",,playable,2020-06-07 22:59:50 +01006A800016E000,"Super Smash Bros.™ Ultimate",gpu;crash;nvdec;ldn-works;intel-vendor-bug,ingame,2024-09-14 23:05:21 +0100D61012270000,"Super Soccer Blast",gpu,ingame,2022-02-16 08:39:12 +0100A9300A4AE000,"Super Sportmatchen",,playable,2022-08-19 12:34:40 +0100FB400F54E000,"Super Street: Racer",UE4,playable,2022-09-16 13:43:14 +010000500DB50000,"Super Tennis Blast",,playable,2022-08-19 16:20:48 +0100C6800D770000,"Super Toy Cars 2",gpu;regression,ingame,2021-03-02 20:15:15 +010035B00B3F0000,"Super Volley Blast",,playable,2022-08-19 18:14:40 +0100FF60051E2000,"Superbeat: Xonic EX",crash;nvdec,ingame,2022-08-19 18:54:40 +0100630010252000,"SuperEpic: The Entertainment War",,playable,2022-10-13 23:02:48 +01001A500E8B4000,"SUPERHOT",,playable,2021-05-05 19:51:30 +010075701153A000,"Superliminal",,playable,2020-09-03 13:20:50 +0100C01012654000,"Supermarket Shriek",,playable,2022-10-13 23:19:20 +0100A6E01201C000,"Supraland",nvdec;UE4;opengl-backend-bug,playable,2022-10-14 09:49:11 +010029A00AEB0000,"Survive! MR.CUBE",,playable,2022-10-20 14:44:47 +01005AB01119C000,"SUSHI REVERSI",,playable,2021-06-11 19:26:58 +0100DDD0085A4000,"Sushi Striker™: The Way of Sushido",nvdec,playable,2020-06-26 20:49:11 +0100D6D00EC2C000,"Sweet Witches",nvdec,playable,2022-10-20 14:56:37 +010049D00C8B0000,"Swimsanity!",online,menus,2021-11-26 14:27:16 +01005DF00DC26000,"SWORD ART ONLINE: FATAL BULLET Complete Edition",UE4;gpu;online,ingame,2021-06-09 16:58:50 +01001B600D1D6000,"SWORD ART ONLINE: Hollow Realization Deluxe Edition",nvdec,playable,2022-08-19 19:19:15 +01000D70049BE000,"Sword of the Guardian",,playable,2020-07-16 12:24:39 +0100E4701355C000,"Sword of the Necromancer",crash,ingame,2022-12-10 01:28:39 +01004BB00421E000,"Syberia 1 & 2",,playable,2021-12-24 12:06:25 +010028C003FD6000,"Syberia 2",gpu,ingame,2022-08-24 12:43:03 +0100CBE004E6C000,"Syberia 3",nvdec,playable,2021-01-25 16:15:12 +010007300C482000,"Sydney Hunter and the Curse of the Mayan",,playable,2020-06-15 12:15:57 +0100D8400DAF0000,"SYNAPTIC DRIVE",online,playable,2020-09-07 13:44:05 +01009E700F448000,"Synergia",,playable,2021-04-06 17:58:04 +01009BF00E7D2000,"SYNTHETIK: Ultimate",gpu;crash,ingame,2022-08-30 03:19:25 +010015B00BB00000,"Table Top Racing: World Tour - Nitro Edition",,playable,2020-04-05 23:21:30 +01000F20083A8000,"Tactical Mind",,playable,2021-01-25 18:05:00 +0100BD700F5F0000,"Tactical Mind 2",,playable,2020-07-01 23:11:07 +0100E12013C1A000,"Tactics Ogre: Reborn",vulkan-backend-bug,playable,2024-04-09 06:21:35 +01007C7006AEE000,"Tactics V: Obsidian Brigade",,playable,2021-02-28 15:09:42 +01002C000B552000,"Taiko no Tatsujin: Drum 'n' Fun!",online-broken;ldn-broken,playable,2023-05-20 15:10:12 +0100BCA0135A0000,"Taiko no Tatsujin: Rhythm Festival",,playable,2023-11-13 13:16:34 +0100DD6012644000,"Taiko no Tatsujin: Rhythmic Adventure Pack",,playable,2020-12-03 07:28:26 +0100346017304000,"Taiko Risshiden V DX",crash,nothing,2022-06-06 16:25:31 +010040A00EA26000,"Taimumari: Complete Edition",,playable,2022-12-06 13:34:49 +0100F0C011A68000,"Tales from the Borderlands",nvdec,playable,2022-10-25 18:44:14 +0100408007078000,"Tales of the Tiny Planet",,playable,2021-01-25 15:47:41 +01002C0008E52000,"Tales of Vesperia™: Definitive Edition",,playable,2024-09-28 03:20:47 +010012800EE3E000,"Tamashii",,playable,2021-06-10 15:26:20 +010008A0128C4000,"Tamiku",gpu,ingame,2021-06-15 20:06:55 +010048F007ADE000,"Tangledeep",crash,boots,2021-01-05 04:08:41 +01007DB010D2C000,"TaniNani",crash;kernel,nothing,2021-04-08 03:06:44 +0100E06012BB4000,"Tank Mechanic Simulator",,playable,2020-12-11 15:10:45 +01007A601318C000,"Tanuki Justice",opengl,playable,2023-02-21 18:28:10 +01004DF007564000,"Tanzia",,playable,2021-06-07 11:10:25 +01002D4011208000,"Task Force Kampas",,playable,2020-11-30 14:44:15 +0100B76011DAA000,"Taxi Chaos",slow;online-broken;UE4,playable,2022-10-25 19:13:00 +0100F43011E5A000,"Tcheco in the Castle of Lucio",,playable,2020-06-27 13:35:43 +010092B0091D0000,"Team Sonic Racing",online-broken;ldn-works,playable,2024-02-05 15:05:27 +0100FE701475A000,"Teenage Mutant Ninja Turtles: Shredder's Revenge",deadlock;crash,boots,2024-09-28 09:31:39 +01005CF01E784000,"Teenage Mutant Ninja Turtles: Splintered Fate",,playable,2024-08-03 13:50:42 +0100FDB0154E4000,"Teenage Mutant Ninja Turtles: The Cowabunga Collection",,playable,2024-01-22 19:39:04 +010021100DF22000,"Telling Lies",,playable,2020-10-23 21:14:51 +0100C8B012DEA000,"Temtem",online-broken,menus,2022-12-17 17:36:11 +0100B2600A398000,"TENGAI for Nintendo Switch",32-bit,playable,2020-11-25 19:52:26 +0100D7A005DFC000,"Tennis",,playable,2020-06-01 20:50:36 +01002970080AA000,"Tennis in the Face",,playable,2022-08-22 14:10:54 +0100092006814000,"Tennis World Tour",online-broken,playable,2022-08-22 14:27:10 +0100950012F66000,"Tennis World Tour 2",online-broken,playable,2022-10-14 10:43:16 +0100E46006708000,"Terraria",online-broken,playable,2022-09-12 16:14:57 +010070C00FB56000,"TERROR SQUID",online-broken,playable,2023-10-30 22:29:29 +010043700EB68000,"TERRORHYTHM (TRRT)",,playable,2021-02-27 13:18:14 +0100FBC007EAE000,"Tesla vs Lovecraft",,playable,2023-11-21 06:19:36 +01005C8005F34000,"Teslagrad",,playable,2021-02-23 14:41:02 +01006F701507A000,"Tested on Humans: Escape Room",,playable,2022-11-12 14:42:52 +0100671016432000,"TETRA for Nintendo Switch™ International Edition",,playable,2020-06-26 20:49:55 +01004E500A15C000,"TETRA's Escape",,playable,2020-06-03 18:21:14 +010040600C5CE000,"Tetris 99 Retail Bundle",gpu;online-broken;ldn-untested,ingame,2024-05-02 16:36:41 +0100EC000D39A000,"Tetsumo Party",,playable,2020-06-09 22:39:55 +01008ED0087A4000,"The Adventure Pals",,playable,2022-08-22 14:48:52 +0100137010152000,"The Adventures of 00 Dilly®",,playable,2020-12-30 19:32:29 +01003B400A00A000,"The Adventures of Bertram Fiddle: Episode 1: A Dreadly Business",nvdec,playable,2022-09-17 11:07:56 +010035C00A4BC000,"The Adventures of Elena Temple",,playable,2020-06-03 23:15:35 +010045A00E038000,"The Alliance Alive HD Remastered",nvdec,playable,2021-03-07 15:43:45 +010079A0112BE000,"The Almost Gone",,playable,2020-07-05 12:33:07 +0100CD500DDAE000,"The Bard's Tale ARPG: Remastered and Resnarkled",gpu;nvdec;online-working,ingame,2024-07-18 12:52:01 +01001E50141BC000,"The Battle Cats Unite!",deadlock,ingame,2021-12-14 21:38:34 +010089600E66A000,"The Big Journey",,playable,2022-09-16 14:03:08 +010021C000B6A000,"The Binding of Isaac: Afterbirth+",,playable,2021-04-26 14:11:56 +0100A5A00B2AA000,"The Bluecoats North & South",nvdec,playable,2020-12-10 21:22:29 +010062500BFC0000,"The Book of Unwritten Tales 2",,playable,2021-06-09 14:42:53 +01002A2004530000,"The Bridge",,playable,2020-06-03 13:53:26 +01008D700AB14000,"The Bug Butcher",,playable,2020-06-03 12:02:04 +01001B40086E2000,"The Bunker",nvdec,playable,2022-09-16 14:24:05 +010069100B7F0000,"The Caligula Effect: Overdose",UE4;gpu,ingame,2021-01-04 11:07:50 +010066800E9F8000,"The Childs Sight",,playable,2021-06-11 19:04:56 +0100B7C01169C000,"The Coma 2: Vicious Sisters",gpu,ingame,2020-06-20 12:51:51 +010033100691A000,"The Coma: Recut",,playable,2020-06-03 15:11:23 +01004170113D4000,"The Complex",nvdec,playable,2022-09-28 14:35:41 +01000F20102AC000,"The Copper Canyon Dixie Dash",UE4,playable,2022-09-29 11:42:29 +01000850037C0000,"The Count Lucanor",nvdec,playable,2022-08-22 15:26:37 +0100EBA01548E000,"The Cruel King and the Great Hero",gpu;services,ingame,2022-12-02 07:02:08 +010051800E922000,"The Dark Crystal: Age of Resistance Tactics",,playable,2020-08-11 13:43:41 +01003DE00918E000,"The Darkside Detective",,playable,2020-06-03 22:16:18 +01000A10041EA000,"The Elder Scrolls V: Skyrim",gpu;crash,ingame,2024-07-14 03:21:31 +01004A9006B84000,"The End Is Nigh",,playable,2020-06-01 11:26:45 +0100CA100489C000,"The Escapists 2",nvdec,playable,2020-09-24 12:31:31 +01001B700BA7C000,"The Escapists: Complete Edition",,playable,2021-02-24 17:50:31 +0100C2E0129A6000,"The Executioner",nvdec,playable,2021-01-23 00:31:28 +01006050114D4000,"The Experiment: Escape Room",gpu,ingame,2022-09-30 13:20:35 +0100B5900DFB2000,"The Eyes of Ara",,playable,2022-09-16 14:44:06 +01002DD00AF9E000,"The Fall",gpu,ingame,2020-05-31 23:31:16 +01003E5002320000,"The Fall Part 2: Unbound",,playable,2021-11-06 02:18:08 +0100CDC00789E000,"The Final Station",nvdec,playable,2022-08-22 15:54:39 +010098800A1E4000,"The First Tree",,playable,2021-02-24 15:51:05 +0100C38004DCC000,"The Flame In The Flood: Complete Edition",gpu;nvdec;UE4,ingame,2022-08-22 16:23:49 +010007700D4AC000,"The Forbidden Arts",,playable,2021-01-26 16:26:24 +010030700CBBC000,"The friends of Ringo Ishikawa",,playable,2022-08-22 16:33:17 +0100b620139d8000,"The Game of Life 2",ldn-untested,ingame,2025-02-03 22:30:00 +01006350148DA000,"The Gardener and the Wild Vines",gpu,ingame,2024-04-29 16:32:10 +0100B13007A6A000,"The Gardens Between",,playable,2021-01-29 16:16:53 +010036E00FB20000,"The Great Ace Attorney Chronicles",,playable,2023-06-22 21:26:29 +010007B012514000,"The Great Perhaps",,playable,2020-09-02 15:57:04 +01003B300E4AA000,"THE GRISAIA TRILOGY",,playable,2021-01-31 15:53:59 +01001950137D8000,"The Hong Kong Massacre",crash,ingame,2021-01-21 12:06:56 +01004AD00E094000,"The House of Da Vinci",,playable,2021-01-05 14:17:19 +01005A80113D2000,"The House of Da Vinci 2",,playable,2020-10-23 20:47:17 +010088401495E000,"The House of the Dead: Remake",,playable,2025-01-11 00:36:01 +0100E24004510000,"The Hunt - Championship Edition",32-bit,menus,2022-07-21 20:21:25 +01008940086E0000,"The Infectious Madness of Doctor Dekker",nvdec,playable,2022-08-22 16:45:01 +0100B0B00B318000,"The Inner World",nvdec,playable,2020-06-03 21:22:29 +0100A9D00B31A000,"The Inner World - The Last Wind Monk",nvdec,playable,2020-11-16 13:09:40 +0100AE5003EE6000,"The Jackbox Party Pack",online-working,playable,2023-05-28 09:28:40 +010015D003EE4000,"The Jackbox Party Pack 2",online-working,playable,2022-08-22 18:23:40 +0100CC80013D6000,"The Jackbox Party Pack 3",slow;online-working,playable,2022-08-22 18:41:06 +0100E1F003EE8000,"The Jackbox Party Pack 4",online-working,playable,2022-08-22 18:56:34 +01006fe0096ac000,"The Jackbox Party Pack 5",slow;online-working,ingame,2025-02-14 05:32:00 +01005a400db52000,"The Jackbox Party Pack 6",slow;online-working,ingame,2025-02-14 05:26:00 +010052C00B184000,"The Journey Down: Chapter One",nvdec,playable,2021-02-24 13:32:41 +01006BC00B188000,"The Journey Down: Chapter Three",nvdec,playable,2021-02-24 13:45:27 +01009AB00B186000,"The Journey Down: Chapter Two",nvdec,playable,2021-02-24 13:32:13 +010020500BD98000,"The King's Bird",,playable,2022-08-22 19:07:46 +010031B00DB34000,"the Knight & the Dragon",gpu,ingame,2023-08-14 10:31:43 +01007AF012E16000,"The Language Of Love",Needs Update;crash,nothing,2020-12-03 17:54:00 +010079C017F5E000,"The Lara Croft Collection",services-horizon;deadlock,nothing,2024-07-12 22:45:51 +0100449011506000,"The Last Campfire",,playable,2022-10-20 16:44:19 +0100AAD011592000,"The Last Dead End",gpu;UE4,ingame,2022-10-20 16:59:44 +0100AC800D022000,"THE LAST REMNANT Remastered",nvdec;UE4,playable,2023-02-09 17:24:44 +0100B1900F0B6000,"The Legend of Dark Witch",,playable,2020-07-12 15:18:33 +01001920156C2000,"The Legend of Heroes: Trails from Zero",gpu;mac-bug,ingame,2024-09-14 21:41:41 +01005420101DA000,"The Legend of Heroes: Trails of Cold Steel III",,playable,2020-12-16 10:59:18 +01009B101044C000,"The Legend of Heroes: Trails of Cold Steel III Demo",demo;nvdec,playable,2021-04-23 01:07:32 +0100D3C010DE8000,"The Legend of Heroes: Trails of Cold Steel IV",nvdec,playable,2021-04-23 14:01:05 +01005E5013862000,"THE LEGEND OF HEROES: ZERO NO KISEKI KAI [英雄傳說 零之軌跡:改]",crash,nothing,2021-09-30 14:41:07 +01009C901ACEE000,"The Legend of Nayuta: Boundless Trails",,ingame,2025-06-12 15:47 +01008CF01BAAC000,"The Legend of Zelda Echoes of Wisdom",nvdec;ASTC;intel-vendor-bug,playable,2024-10-01 14:11:01 +0100509005AF2000,"The Legend of Zelda: Breath of the Wild Demo",demo,ingame,2022-12-24 05:02:58 +01007EF00011E000,"The Legend of Zelda™: Breath of the Wild",gpu;amd-vendor-bug;mac-bug,ingame,2024-09-23 19:35:46 +01006BB00C6F0000,"The Legend of Zelda™: Link’s Awakening",gpu;nvdec;mac-bug,ingame,2023-08-09 17:37:40 +01002DA013484000,"The Legend of Zelda™: Skyward Sword HD",gpu,ingame,2024-06-14 16:48:29 +0100F2C0115B6000,"The Legend of Zelda™: Tears of the Kingdom",gpu;amd-vendor-bug;intel-vendor-bug;mac-bug,ingame,2024-08-24 12:38:30 +0100A4400BE74000,"The LEGO Movie 2 Videogame",,playable,2023-03-01 11:23:37 +010064B00B95C000,"The Liar Princess and the Blind Prince",audio;slow,playable,2020-06-08 21:23:28 +0100735004898000,"The Lion's Song",,playable,2021-06-09 15:07:16 +0100A5000D590000,"The Little Acre",nvdec,playable,2021-03-02 20:22:27 +01007A700A87C000,"The Long Dark",,playable,2021-02-21 14:19:52 +010052B003A38000,"The Long Reach",nvdec,playable,2021-02-24 14:09:48 +01003C3013300000,"The Long Return",slow,playable,2020-12-10 21:05:10 +0100CE1004E72000,"The Longest Five Minutes",gpu,boots,2023-02-19 18:33:11 +0100F3D0122C2000,"The Longing",gpu,ingame,2022-11-12 15:00:58 +010085A00C5E8000,"The Lord of the Rings: Adventure Card Game - Definitive Edition",online-broken,menus,2022-09-16 15:19:32 +01008A000A404000,"The Lost Child",nvdec,playable,2021-02-23 15:44:20 +0100BAB00A116000,"The Low Road",,playable,2021-02-26 13:23:22 +01005F3006AFE000,"The Mahjong",Needs Update;crash;services,nothing,2021-04-01 22:06:22 +0100DC300AC78000,"The Messenger",,playable,2020-03-22 13:51:37 +0100DEC00B2BC000,"The Midnight Sanctuary",nvdec;UE4;vulkan-backend-bug,playable,2022-10-03 17:17:32 +0100F1B00B456000,"The MISSING: J.J. Macfield and the Island of Memories",,playable,2022-08-22 19:36:18 +010033300AC1A000,"The Mooseman",,playable,2021-02-24 12:58:57 +01005E9016BDE000,"The movie The Quintessential Bride -Five Memories Spent with You-",,playable,2023-12-14 14:43:43 +0100496004194000,"The Mummy Demastered",,playable,2021-02-23 13:11:27 +01004C500AAF6000,"The Mystery of the Hudson Case",,playable,2020-06-01 11:03:36 +01000CF0084BC000,"The Next Penelope",,playable,2021-01-29 16:26:11 +01001FB00E386000,"THE NINJA SAVIORS Return of the Warriors",online,playable,2021-03-25 23:48:07 +0100B080184BC000,"The Oregon Trail",gpu,ingame,2022-11-25 16:11:49 +0100B0101265C000,"The Otterman Empire",UE4;gpu,ingame,2021-06-17 12:27:15 +01000BC01801A000,"The Outbound Ghost",,nothing,2024-03-02 17:10:58 +0100626011656000,"The Outer Worlds",gpu;nvdec;UE4;vulkan-backend-bug;opengl-backend-bug,ingame,2022-10-03 17:55:32 +01005C500D690000,"The Park",UE4;crash;gpu,ingame,2020-12-18 12:50:07 +010050101127C000,"The Persistence",nvdec,playable,2021-06-06 19:15:40 +0100CD300880E000,"The Pinball Arcade",online-broken,playable,2022-08-22 19:49:46 +01006BD018B54000,"The Plucky Squire",crash,ingame,2024-09-27 22:32:33 +0100E6A00B960000,"The Princess Guide",,playable,2021-02-24 14:23:34 +010058A00BF1C000,"The Raven Remastered",nvdec,playable,2022-08-22 20:02:47 +0100EB100D17C000,"The Red Strings Club",,playable,2020-06-01 10:51:18 +010079400BEE0000,"The Room",,playable,2021-04-14 18:57:05 +010033100EE12000,"The Ryuo's Work is Never Done!",,playable,2022-03-29 00:35:37 +01002BA00C7CE000,"The Savior's Gang",gpu;nvdec;UE4,ingame,2022-09-21 12:37:48 +0100F3200E7CA000,"The Settlers®: New Allies",deadlock,nothing,2023-10-25 00:18:05 +0100F89003BC8000,"The Sexy Brutale",,playable,2021-01-06 17:48:28 +01001FF00BEE8000,"The Shapeshifting Detective",nvdec,playable,2021-01-10 13:10:49 +010028D00BA1A000,"The Sinking City",nvdec;UE4,playable,2022-09-12 16:41:55 +010041C00A68C000,"The Spectrum Retreat",,playable,2022-10-03 18:52:40 +010029300E5C4000,"The Stanley Parable: Ultra Deluxe",gpu,ingame,2024-07-12 23:18:26 +010007F00AF56000,"The Station",,playable,2022-09-28 18:15:27 +0100858010DC4000,"the StoryTale",,playable,2022-09-03 13:00:25 +0100AA400A238000,"The Stretchers™",nvdec;UE4,playable,2022-09-16 15:40:58 +0100E3100450E000,"The Strike - Championship Edition",gpu;32-bit,boots,2022-12-09 15:58:16 +0100EF200DA60000,"The Survivalists",,playable,2020-10-27 15:51:13 +010040D00B7CE000,"The Swindle",nvdec,playable,2022-08-22 20:53:52 +010037D00D568000,"The Swords of Ditto: Mormo's Curse",slow,ingame,2020-12-06 00:13:12 +01009B300D76A000,"The Tiny Bang Story",,playable,2021-03-05 15:39:05 +0100C3300D8C4000,"The Touryst",crash,ingame,2023-08-22 01:32:38 +010047300EBA6000,"The Tower of Beatrice",,playable,2022-09-12 16:51:42 +010058000A576000,"The Town of Light: Deluxe Edition",gpu,playable,2022-09-21 12:51:34 +0100B0E0086F6000,"The Trail: Frontier Challenge",slow,playable,2022-08-23 15:10:51 +0100EA100F516000,"The Turing Test",nvdec,playable,2022-09-21 13:24:07 +010064E00ECBC000,"The Unicorn Princess",,playable,2022-09-16 16:20:56 +0100BCF00E970000,"The Vanishing of Ethan Carter",UE4,playable,2021-06-09 17:14:47 +0100D0500B0A6000,"The VideoKid",nvdec,playable,2021-01-06 09:28:24 +01008CF00BA38000,"The Voice",services,menus,2020-07-28 20:48:49 +010056E00B4F4000,"The Walking Dead: A New Frontier",,playable,2022-09-21 13:40:48 +010099100B6AC000,"The Walking Dead: Season Two",,playable,2020-08-09 12:57:06 +010029200B6AA000,"The Walking Dead: The Complete First Season",,playable,2021-06-04 13:10:56 +010060F00AA70000,"The Walking Dead: The Final Season - Season Pass",online-broken,playable,2022-08-23 17:22:32 +010095F010568000,"The Wanderer: Frankenstein's Creature",,playable,2020-07-11 12:49:51 +01008B200FC6C000,"The Wardrobe: Even Better Edition",,playable,2022-09-16 19:14:55 +01003D100E9C6000,"The Witcher 3: Wild Hunt",nvdec;vulkan-backend-bug;amd-vendor-bug,playable,2024-02-22 12:21:51 +0100B1300FF08000,"The Wonderful 101: Remastered",slow;nvdec,playable,2022-09-30 13:49:28 +0100C1500B82E000,"The World Ends with You®: Final Remix",ldn-untested,playable,2022-07-09 01:11:21 +0100E6200D56E000,"The World Next Door",,playable,2022-09-21 14:15:23 +010075900CD1C000,"Thea: The Awakening",,playable,2021-01-18 15:08:47 +010081B01777C000,"THEATRHYTHM FINAL BAR LINE",Incomplete,ingame,2024-08-05 14:24:55 +01001C2010D08000,"They Bleed Pixels",gpu,ingame,2024-08-09 05:52:18 +0100768010970000,"They Came From the Sky",,playable,2020-06-12 16:38:19 +0100CE700F62A000,"Thief of Thieves: Season One",crash;loader-allocator,nothing,2021-11-03 07:16:30 +0100CE400E34E000,"Thief Simulator",,playable,2023-04-22 04:39:11 +01009BD003B36000,"Thimbleweed Park",,playable,2022-08-24 11:15:31 +0100F2300A5DA000,"Think of the Children",deadlock,menus,2021-11-23 09:04:45 +0100066004D68000,"This Is the Police",,playable,2022-08-24 11:37:05 +01004C100A04C000,"This is the Police 2",,playable,2022-08-24 11:49:17 +0100C7C00F77C000,"This Strange Realm Of Mine",,playable,2020-08-28 12:07:24 +0100A8700BC2A000,"This War of Mine: Complete Edition",gpu;32-bit;nvdec,ingame,2022-08-24 12:00:44 +0100AC500EEE8000,"THOTH",,playable,2020-08-05 18:35:28 +0100E910103B4000,"Thronebreaker: The Witcher Tales",nvdec,playable,2021-06-03 16:40:15 +01006F6002840000,"Thumper",gpu,ingame,2024-08-12 02:41:07 +01000AC011588000,"Thy Sword",crash,ingame,2022-09-30 16:43:14 +0100E9000C42C000,"Tick Tock: A Tale for Two",,menus,2020-07-14 14:49:38 +0100B6D00C2DE000,"Tied Together",nvdec,playable,2021-04-10 14:03:46 +010074500699A000,"Timber Tennis: Versus",online,playable,2020-10-03 17:07:15 +01004C500B698000,"Time Carnage",,playable,2021-06-16 17:57:28 +0100F770045CA000,"Time Recoil",,playable,2022-08-24 12:44:03 +0100DD300CF3A000,"Timespinner",gpu,ingame,2022-08-09 09:39:11 +0100393013A10000,"Timothy and the Mysterious Forest",gpu;slow,ingame,2021-06-02 00:42:11 +0100F7C010AF6000,"Tin & Kuna",,playable,2020-11-17 12:16:12 +0100DF900FC52000,"Tiny Gladiators",,playable,2020-12-14 00:09:43 +010061A00AE64000,"Tiny Hands Adventure",,playable,2022-08-24 16:07:48 +010074800741A000,"TINY METAL",UE4;gpu;nvdec,ingame,2021-03-05 17:11:57 +01005D0011A40000,"Tiny Racer",,playable,2022-10-07 11:13:03 +010002401AE94000,"Tiny Thor",gpu,ingame,2024-07-26 08:37:35 +0100A73016576000,"Tinykin",gpu,ingame,2023-06-18 12:12:24 +0100FE801185E000,"Titan Glory",,boots,2022-10-07 11:36:40 +0100605008268000,"Titan Quest",nvdec;online-broken,playable,2022-08-19 21:54:15 +01009C400E93E000,"Titans Pinball",slow,playable,2020-06-09 16:53:52 +010019500DB1E000,"Tlicolity Eyes - twinkle showtime -",gpu,boots,2021-05-29 19:43:44 +010036700F83E000,"To the Moon",,playable,2021-03-20 15:33:38 +010014900865A000,"Toast Time: Smash Up!",crash;services,menus,2020-04-03 12:26:59 +0100A4A00B2E8000,"Toby: The Secret Mine",nvdec,playable,2021-01-06 09:22:33 +0100B5200BB7C000,"ToeJam & Earl: Back in the Groove!",,playable,2021-01-06 22:56:58 +0100B5E011920000,"TOHU",slow,playable,2021-02-08 15:40:44 +0100F3400A432000,"Toki",nvdec,playable,2021-01-06 19:59:23 +01003E500F962000,"Tokyo Dark – Remembrance –",nvdec,playable,2021-06-10 20:09:49 +0100A9400C9C2000,"Tokyo Mirage Sessions™ #FE Encore",32-bit;nvdec,playable,2022-07-07 09:41:07 +0100E2E00CB14000,"Tokyo School Life",,playable,2022-09-16 20:25:54 +010024601BB16000,"Tomb Raider I-III Remastered Starring Lara Croft",gpu;opengl,ingame,2024-09-27 12:32:04 +0100D7F01E49C000,"Tomba! Special Edition",services-horizon,nothing,2024-09-15 21:59:54 +0100D400100F8000,"Tonight We Riot",,playable,2021-02-26 15:55:09 +0100CC00102B4000,"Tony Hawk's™ Pro Skater™ 1 + 2",gpu;Needs Update,ingame,2024-09-24 08:18:14 +010093F00E818000,"Tools Up!",crash,ingame,2020-07-21 12:58:17 +01009EA00E2B8000,"Toon War",,playable,2021-06-11 16:41:53 +010090400D366000,"Torchlight II",,playable,2020-07-27 14:18:37 +010075400DDB8000,"Torchlight III",nvdec;online-broken;UE4,playable,2022-10-14 22:20:17 +01007AF011732000,"TORICKY-S",deadlock,menus,2021-11-25 08:53:36 +0100BEB010F2A000,"Torn Tales: Rebound Edition",,playable,2020-11-01 14:11:59 +0100A64010D48000,"Total Arcade Racing",,playable,2022-11-12 15:12:48 +0100512010728000,"Totally Reliable Delivery Service",online-broken,playable,2024-09-27 19:32:22 +01004E900B082000,"Touhou Genso Wanderer Reloaded",gpu;nvdec,ingame,2022-08-25 11:57:36 +010010F004022000,"Touhou Kobuto V: Burst Battle",,playable,2021-01-11 15:28:58 +0100E9D00D6C2000,"TOUHOU Spell Bubble",,playable,2020-10-18 11:43:43 +0100F7B00595C000,"Tower Of Babel",,playable,2021-01-06 17:05:15 +010094600DC86000,"Tower Of Time",gpu;nvdec,ingame,2020-07-03 11:11:12 +0100A1C00359C000,"TowerFall",,playable,2020-05-16 18:58:07 +0100F6200F77E000,"Towertale",,playable,2020-10-15 13:56:58 +010049E00BA34000,"Townsmen - A Kingdom Rebuilt",nvdec,playable,2022-10-14 22:48:59 +01009FF00A160000,"Toy Stunt Bike: Tiptop's Trials",UE4,playable,2021-04-10 13:56:34 +0100192010F5A000,"Tracks - Toybox Edition",UE4;crash,nothing,2021-02-08 15:19:18 +0100BCA00843A000,"Trailblazers",,playable,2021-03-02 20:40:49 +010009F004E66000,"Transcripted",,playable,2022-08-25 12:13:11 +01005E500E528000,"TRANSFORMERS: BATTLEGROUNDS",online,playable,2021-06-17 18:08:19 +0100BE500BEA2000,"Transistor",,playable,2020-10-22 11:28:02 +0100A8D010BFA000,"Travel Mosaics 2: Roman Holiday",,playable,2021-05-26 12:33:16 +0100102010BFC000,"Travel Mosaics 3: Tokyo Animated",,playable,2021-05-26 12:06:27 +010096D010BFE000,"Travel Mosaics 4: Adventures In Rio",,playable,2021-05-26 11:54:58 +01004C4010C00000,"Travel Mosaics 5: Waltzing Vienna",,playable,2021-05-26 11:49:35 +0100D520119D6000,"Travel Mosaics 6: Christmas Around the World",,playable,2021-05-26 00:52:47 +01000BD0119DE000,"Travel Mosaics 7: Fantastic Berlin",,playable,2021-05-22 18:37:34 +01007DB00A226000,"Travel Mosaics: A Paris Tour",,playable,2021-05-26 12:42:26 +010011600C946000,"Travis Strikes Again: No More Heroes",nvdec;UE4,playable,2022-08-25 12:36:38 +01006EB004B0E000,"Treadnauts",,playable,2021-01-10 14:57:41 +0100D7800E9E0000,"Trials of Mana",UE4,playable,2022-09-30 21:50:37 +0100E1D00FBDE000,"Trials of Mana Demo",nvdec;UE4;demo;vulkan-backend-bug,playable,2022-09-26 18:00:02 +01003E800A102000,"Trials Rising Standard Edition",,playable,2024-02-11 01:36:39 +0100CC80140F8000,"TRIANGLE STRATEGY™",gpu;Needs Update;UE4;vulkan-backend-bug,ingame,2024-09-25 20:48:37 +010064E00A932000,"Trine 2: Complete Story",nvdec,playable,2021-06-03 11:45:20 +0100DEC00A934000,"Trine 3: The Artifacts of Power",ldn-untested;online,playable,2021-06-03 12:01:24 +010055E00CA68000,"Trine 4: The Nightmare Prince",gpu,nothing,2025-01-07 05:47:46 +0100D9000A930000,"Trine Enchanted Edition",ldn-untested;nvdec,playable,2021-06-03 11:28:15 +01002D7010A54000,"Trinity Trigger",crash,ingame,2023-03-03 03:09:09 +010020700a5e0000,"TRIVIAL PURSUIT Live!",ldn-untested,ingame,2025-02-03 22:35:00 +0100868013FFC000,"TRIVIAL PURSUIT Live! 2",,boots,2022-12-19 00:04:33 +0100F78002040000,"Troll and I™",gpu;nvdec,ingame,2021-06-04 16:58:50 +0100145011008000,"Trollhunters: Defenders of Arcadia",gpu;nvdec,ingame,2020-11-30 13:27:09 +0100FBE0113CC000,"Tropico 6 - Nintendo Switch™ Edition",nvdec;UE4,playable,2022-10-14 23:21:03 +0100D06018DCA000,"Trouble Witches Final! Episode 01: Daughters of Amalgam",,playable,2024-04-08 15:08:11 +0100B5B0113CE000,"Troubleshooter",UE4;crash,nothing,2020-10-04 13:46:50 +010089600FB72000,"Trover Saves The Universe",UE4;crash,nothing,2020-10-03 10:25:27 +0100E6300D448000,"Trüberbrook",,playable,2021-06-04 17:08:00 +0100F2100AA5C000,"Truck and Logistics Simulator",,playable,2021-06-11 13:29:08 +0100CB50107BA000,"Truck Driver",online-broken,playable,2022-10-20 17:42:33 +0100E75004766000,"True Fear: Forsaken Souls - Part 1",nvdec,playable,2020-12-15 21:39:52 +010099900CAB2000,"TT Isle of Man",nvdec,playable,2020-06-22 12:25:13 +010000400F582000,"TT Isle of Man Ride on the Edge 2",gpu;nvdec;online-broken,ingame,2022-09-30 22:13:05 +0100752011628000,"TTV2",,playable,2020-11-27 13:21:36 +0100AFE00452E000,"Tumblestone",,playable,2021-01-07 17:49:20 +010085500D5F6000,"Turok",gpu,ingame,2021-06-04 13:16:24 +0100CDC00D8D6000,"Turok 2: Seeds of Evil",gpu;vulkan,ingame,2022-09-12 17:50:05 +010004B0130C8000,"Turrican Flashback",audout,playable,2021-08-30 10:07:56 +0100B1F0090F2000,"TurtlePop: Journey to Freedom",,playable,2020-06-12 17:45:39 +0100047009742000,"Twin Robots: Ultimate Edition",nvdec,playable,2022-08-25 14:24:03 +010031200E044000,"Two Point Hospital™",crash;nvdec,ingame,2022-09-22 11:22:23 +010038400C2FE000,"TY the Tasmanian Tiger™ HD",32-bit;crash;nvdec,menus,2020-12-17 21:15:00 +010073A00C4B2000,"Tyd wag vir Niemand",,playable,2021-03-02 13:39:53 +0100D5B00D6DA000,"Type:Rider",,playable,2021-01-06 13:12:55 +010040D01222C000,"UBERMOSH: SANTICIDE",,playable,2020-11-27 15:05:01 +0100992010BF8000,"Ubongo",,playable,2021-02-04 21:15:01 +010079000B56C000,"UglyDolls: An Imperfect Adventure",nvdec;UE4,playable,2022-08-25 14:42:16 +010048901295C000,"Ultimate Fishing Simulator",,playable,2021-06-16 18:38:23 +01009D000FAE0000,"Ultimate Racing 2D",,playable,2020-08-05 17:27:09 +010045200A1C2000,"Ultimate Runner",,playable,2022-08-29 12:52:40 +01006B601117E000,"Ultimate Ski Jumping 2020",online,playable,2021-03-02 20:54:11 +01002D4012222000,"Ultra Hat Dimension",services;audio,menus,2021-11-18 09:05:20 +01009C000415A000,"Ultra Hyperball",,playable,2021-01-06 10:09:55 +01007330027EE000,"Ultra Street Fighter® II: The Final Challengers",ldn-untested,playable,2021-11-25 07:54:58 +01006A300BA2C000,"Umineko no Naku Koro ni Saku - うみねこのなく頃に咲 ~猫箱と夢想の交響曲~",audout,playable,2023-05-04 17:25:23 +0100592005164000,"UNBOX: Newbie's Adventure",UE4,playable,2022-08-29 13:12:56 +01002D900C5E4000,"Uncanny Valley",nvdec,playable,2021-06-04 13:28:45 +010076F011F54000,"Undead & Beyond",nvdec,playable,2022-10-04 09:11:18 +01008F3013E4E000,"Under Leaves",,playable,2021-05-22 18:13:58 +010080B00AD66000,"Undertale",,playable,2022-08-31 17:31:46 +01008F80049C6000,"Unepic",,playable,2024-01-15 17:03:00 +01007820096FC000,"UnExplored",,playable,2021-01-06 10:02:16 +01007D1013512000,"Unhatched",,playable,2020-12-11 12:11:09 +010069401ADB8000,"Unicorn Overlord",,playable,2024-09-27 14:04:32 +0100B1400D92A000,"Unit 4",,playable,2020-12-16 18:54:13 +010045200D3A4000,"Unknown Fate",slow,ingame,2020-10-15 12:27:42 +0100AB2010B4C000,"Unlock The King",,playable,2020-09-01 13:58:27 +0100A3E011CB0000,"Unlock the King 2",,playable,2021-06-15 20:43:55 +01005AA00372A000,"UNO® for Nintendo Switch",nvdec;ldn-untested,playable,2022-07-28 14:49:47 +0100b6e012ebe000,"UNO",ldn-untested,ingame,2025-02-03 22:40:00 +0100E5D00CC0C000,"Unravel Two",nvdec,playable,2024-05-23 15:45:05 +010001300CC4A000,"Unruly Heroes",,playable,2021-01-07 18:09:31 +0100B410138C0000,"Unspottable",,playable,2022-10-25 19:28:49 +010082400BCC6000,"Untitled Goose Game",,playable,2020-09-26 13:18:06 +0100E49013190000,"Unto The End",gpu,ingame,2022-10-21 11:13:29 +0100B110109F8000,"Urban Flow",services,playable,2020-07-05 12:51:47 +010054F014016000,"Urban Street Fighting",,playable,2021-02-20 19:16:36 +01001B10068EC000,"Urban Trial Playground",UE4;nvdec;online,playable,2021-03-25 20:56:51 +0100A2500EB92000,"Urban Trial Tricky",nvdec;UE4,playable,2022-12-06 13:07:56 +01007C0003AEC000,"Use Your Words",nvdec;online-broken,menus,2022-08-29 17:22:10 +0100D4300EBF8000,"Uta no Prince-sama Amazing Aria & Sweet Serenade LOVE",crash;Needs More Attention;Needs Update,nothing,2022-02-09 08:57:44 +010024200E00A000,"Uta no☆Prince-sama♪ Repeat Love",nvdec,playable,2022-12-09 09:21:51 +010029B00CC3E000,"UTOPIA 9 - A Volatile Vacation",nvdec,playable,2020-12-16 17:06:42 +010064400B138000,"V-Rally 4",gpu;nvdec,ingame,2021-06-07 19:37:31 +0100A6700D66E000,"VA-11 HALL-A",,playable,2021-02-26 15:05:34 +01009E2003FE2000,"Vaccine",nvdec,playable,2021-01-06 01:02:07 +010089700F30C000,"Valfaris",,playable,2022-09-16 21:37:24 +0100CAF00B744000,"Valkyria Chronicles",32-bit;crash;nvdec,ingame,2022-11-23 20:03:32 +01005C600AC68000,"Valkyria Chronicles 4",audout;nvdec,playable,2021-06-03 18:12:25 +0100FBD00B91E000,"Valkyria Chronicles 4 Demo",slow;demo,ingame,2022-08-29 20:39:07 +0100E0E00B108000,"Valley",nvdec,playable,2022-09-28 19:27:58 +010089A0197E4000,"Vampire Survivors",,ingame,2024-06-17 09:57:38 +010020C00FFB6000,"Vampire: The Masquerade - Coteries of New York",,playable,2020-10-04 14:55:22 +01000BD00CE64000,"VAMPYR",nvdec;UE4,playable,2022-09-16 22:15:51 +01007C500D650000,"Vandals",,playable,2021-01-27 21:45:46 +010030F00CA1E000,"Vaporum",nvdec,playable,2021-05-28 14:25:33 +010045C0109F2000,"VARIABLE BARRICADE NS",nvdec,playable,2022-02-26 15:50:13 +0100FE200AF48000,"VASARA Collection",nvdec,playable,2021-02-28 15:26:10 +0100AD300E4FA000,"Vasilis",,playable,2020-09-01 15:05:35 +01009CD003A0A000,"Vegas Party",,playable,2021-04-14 19:21:41 +010098400E39E000,"Vektor Wars",online-broken;vulkan-backend-bug,playable,2022-10-04 09:23:46 +01003A8018E60000,"Vengeful Guardian: Moonrider",deadlock,boots,2024-03-17 23:35:37 +010095B00DBC8000,"Venture Kid",crash;gpu,ingame,2021-04-18 16:33:17 +0100C850134A0000,"Vera Blanc: Full Moon",audio,playable,2020-12-17 12:09:30 +0100379013A62000,"Very Very Valet",nvdec,playable,2022-11-12 15:25:51 +01006C8014DDA000,"Very Very Valet Demo",crash;Needs Update;demo,boots,2022-11-12 15:26:13 +010057B00712C000,"Vesta",nvdec,playable,2022-08-29 21:03:39 +0100E81007A06000,"Victor Vran Overkill Edition",gpu;deadlock;nvdec;opengl,ingame,2022-08-30 11:46:56 +01005880063AA000,"Violett",nvdec,playable,2021-01-28 13:09:36 +010037900CB1C000,"Viviette",,playable,2021-06-11 15:33:40 +0100D010113A8000,"Void Bastards",,playable,2022-10-15 00:04:19 +0100FF7010E7E000,"void tRrLM(); //Void Terrarium",gpu;Needs Update;regression,ingame,2023-02-10 01:13:25 +010078D0175EE000,"void* tRrLM2(); //Void Terrarium 2",,playable,2023-12-21 11:00:41 +0100B1A0066DC000,"Volgarr the Viking",,playable,2020-12-18 15:25:50 +0100A7900E79C000,"Volta-X",online-broken,playable,2022-10-07 12:20:51 +01004D8007368000,"Vostok Inc.",,playable,2021-01-27 17:43:59 +0100B1E0100A4000,"Voxel Galaxy",,playable,2022-09-28 22:45:02 +0100AFA011068000,"Voxel Pirates",,playable,2022-09-28 22:55:02 +0100BFB00D1F4000,"Voxel Sword",,playable,2022-08-30 14:57:27 +01004E90028A2000,"Vroom in the night sky",Needs Update;vulkan-backend-bug,playable,2023-02-20 02:32:29 +0100C7C00AE6C000,"VSR: Void Space Racing",,playable,2021-01-27 14:08:59 +0100B130119D0000,"Waifu Uncovered",crash,ingame,2023-02-27 01:17:46 +0100E29010A4A000,"Wanba Warriors",,playable,2020-10-04 17:56:22 +010078800825E000,"Wanderjahr TryAgainOrWalkAway",,playable,2020-12-16 09:46:04 +0100B27010436000,"Wanderlust Travel Stories",,playable,2021-04-07 16:09:12 +0100F8A00853C000,"Wandersong",nvdec,playable,2021-06-04 15:33:34 +0100D67013910000,"Wanna Survive",,playable,2022-11-12 21:15:43 +010056901285A000,"War Dogs: Red's Return",,playable,2022-11-13 15:29:01 +01004FA01391A000,"War Of Stealth - assassin",,playable,2021-05-22 17:34:38 +010035A00D4E6000,"War Party",nvdec,playable,2021-01-27 18:26:32 +010049500DE56000,"War Tech Fighters",nvdec,playable,2022-09-16 22:29:31 +010084D00A134000,"War Theatre",gpu,ingame,2021-06-07 19:42:45 +0100B6B013B8A000,"War Truck Simulator",,playable,2021-01-31 11:22:54 +0100563011B4A000,"War-Torn Dreams",crash,nothing,2020-10-21 11:36:16 +010054900F51A000,"WARBORN",,playable,2020-06-25 12:36:47 +01000F0002BB6000,"Wargroove",online-broken,playable,2022-08-31 10:30:45 +0100C6000EEA8000,"Warhammer 40,000: Mechanicus",nvdec,playable,2021-06-13 10:46:38 +0100E5600D7B2000,"WARHAMMER 40,000: SPACE WOLF",online-broken,playable,2022-09-20 21:11:20 +010031201307A000,"Warhammer Age of Sigmar: Storm Ground",nvdec;online-broken;UE4,playable,2022-11-13 15:46:14 +01002FF00F460000,"Warhammer Quest 2: The End Times",,playable,2020-08-04 15:28:03 +0100563010E0C000,"WarioWare™: Get It Together!",gpu;opengl-backend-bug,ingame,2024-04-23 01:04:56 +010045B018EC2000,"WarioWare™: Move It!",,playable,2023-11-14 00:23:51 +0100E0400E320000,"Warlocks 2: God Slayers",,playable,2020-12-16 17:36:50 +0100DB300A026000,"Warp Shift",nvdec,playable,2020-12-15 14:48:48 +010032700EAC4000,"WarriOrb",UE4,playable,2021-06-17 15:45:14 +0100E8500AD58000,"WARRIORS OROCHI 4 ULTIMATE",nvdec;online-broken,playable,2024-08-07 01:50:37 +0100CD900FB24000,"WARTILE",UE4;crash;gpu,menus,2020-12-11 21:56:10 +010039A00BC64000,"Wasteland 2: Director's Cut",nvdec,playable,2021-01-27 13:34:11 +0100B79011F06000,"Water Balloon Mania",,playable,2020-10-23 20:20:59 +0100BA200C378000,"Way of the Passive Fist",gpu,ingame,2021-02-26 21:07:06 +0100560010E3E000,"We should talk.",crash,nothing,2020-08-03 12:32:36 +010096000EEBA000,"Welcome to Hanwell",UE4;crash,boots,2020-08-03 11:54:57 +0100D7F010B94000,"Welcome to Primrose Lake",,playable,2022-10-21 11:30:57 +010035600EC94000,"Wenjia",,playable,2020-06-08 11:38:30 +010031B00A4E8000,"West of Loathing",,playable,2021-01-28 12:35:19 +010038900DFE0000,"What Remains of Edith Finch",slow;UE4,playable,2022-08-31 19:57:59 +010033600ADE6000,"Wheel of Fortune®",crash;Needs More Attention;nvdec,boots,2023-11-12 20:29:24 +0100DFC00405E000,"Wheels of Aurelia",,playable,2021-01-27 21:59:25 +010027D011C9C000,"Where Angels Cry",gpu;nvdec,ingame,2022-09-30 22:24:47 +0100FDB0092B4000,"Where Are My Friends?",,playable,2022-09-21 14:39:26 +01000C000C966000,"Where the Bees Make Honey",,playable,2020-07-15 12:40:49 +010017500E7E0000,"Whipseey and the Lost Atlas",,playable,2020-06-23 20:24:14 +010015A00AF1E000,"Whispering Willows",nvdec,playable,2022-09-30 22:33:05 +010027F0128EA000,"Who Wants to Be a Millionaire?",crash,nothing,2020-12-11 20:22:42 +0100C7800CA06000,"Widget Satchel",,playable,2022-09-16 22:41:07 +0100CFC00A1D8000,"Wild Guns™ Reloaded",,playable,2021-01-28 12:29:05 +010071F00D65A000,"Wilmot's Warehouse",audio;gpu,ingame,2021-06-02 17:24:32 +010048800B638000,"Windjammers",online,playable,2020-10-13 11:24:25 +010059900BA3C000,"Windscape",,playable,2022-10-21 11:49:42 +0100D6800CEAC000,"Windstorm: An Unexpected Arrival",UE4,playable,2021-06-07 19:33:19 +01005A100B314000,"Windstorm: Start of a Great Friendship",UE4;gpu;nvdec,ingame,2020-12-22 13:17:48 +010035B012F28000,"Wing of Darkness",UE4,playable,2022-11-13 16:03:51 +0100A4A015FF0000,"Winter Games 2023",deadlock,menus,2023-11-07 20:47:36 +010012A017F18800,"Witch On The Holy Night",,playable,2023-03-06 23:28:11 +0100454012E32000,"Witch Spring 3 Re:Fine -The Story of the Marionette Witch Eirudy-",crash,ingame,2021-08-08 11:56:18 +01002FC00C6D0000,"Witch Thief",,playable,2021-01-27 18:16:07 +010061501904E000,"Witch's Garden",gpu;crash;vulkan-backend-bug;opengl-backend-bug,ingame,2023-01-11 02:11:24 +0100BD4011FFE000,"Witcheye",,playable,2020-12-14 22:56:08 +0100522007AAA000,"Wizard of Legend",,playable,2021-06-07 12:20:46 +010081900F9E2000,"Wizards of Brandel",,nothing,2020-10-14 15:52:33 +0100C7600E77E000,"Wizards: Wand of Epicosity",,playable,2022-10-07 12:32:06 +01009040091E0000,"Wolfenstein II®: The New Colossus™",gpu,ingame,2024-04-05 05:39:46 +01003BD00CAAE000,"Wolfenstein: Youngblood",online-broken,boots,2024-07-12 23:49:20 +010037A00F5E2000,"Wonder Blade",,playable,2020-12-11 17:55:31 +0100B49016FF0000,"Wonder Boy Anniversary Collection",deadlock,nothing,2023-04-20 16:01:48 +0100EB2012E36000,"Wonder Boy Asha in Monster World",crash,nothing,2021-11-03 08:45:06 +0100A6300150C000,"Wonder Boy: The Dragon's Trap",,playable,2021-06-25 04:53:21 +0100F5D00C812000,"Wondershot",,playable,2022-08-31 21:05:31 +0100E0300EB04000,"Woodle Tree 2: Deluxe",gpu;slow,ingame,2020-06-04 18:44:00 +0100288012966000,"Woodsalt",,playable,2021-04-06 17:01:48 +010083E011BC8000,"Wordify",,playable,2020-10-03 09:01:07 +01009D500A194000,"World Conqueror X",,playable,2020-12-22 16:10:29 +010072000BD32000,"WORLD OF FINAL FANTASY MAXIMA",,playable,2020-06-07 13:57:23 +010009E001D90000,"World of Goo",gpu;32-bit;crash;regression,boots,2024-04-12 05:52:14 +010061F01DB7C800,"World of Goo 2",,boots,2024-08-08 22:52:49 +01001E300B038000,"World Soccer Pinball",,playable,2021-01-06 00:37:02 +010048900CF64000,"Worldend Syndrome",,playable,2021-01-03 14:16:32 +01008E9007064000,"WorldNeverland - Elnea Kingdom",,playable,2021-01-28 17:44:23 +010000301025A000,"Worlds of Magic: Planar Conquest",,playable,2021-06-12 12:51:28 +01009CD012CC0000,"Worm Jazz",gpu;services;UE4;regression,ingame,2021-11-10 10:33:04 +01001AE005166000,"Worms W.M.D",gpu;crash;nvdec;ldn-untested,boots,2023-09-16 21:42:59 +010037500C4DE000,"Worse Than Death",,playable,2021-06-11 16:05:40 +01006F100EB16000,"Woven",nvdec,playable,2021-06-02 13:41:08 +010087800DCEA000,"WRC 8 FIA World Rally Championship",nvdec,playable,2022-09-16 23:03:36 +01001A0011798000,"WRC 9 The Official Game",gpu;slow;nvdec,ingame,2022-10-25 19:47:39 +0100DC0012E48000,"Wreckfest",,playable,2023-02-12 16:13:00 +0100C5D00EDB8000,"Wreckin' Ball Adventure",UE4,playable,2022-09-12 18:56:28 +010033700418A000,"Wulverblade",nvdec,playable,2021-01-27 22:29:05 +01001C400482C000,"Wunderling DX",audio;crash,ingame,2022-09-10 13:20:12 +01003B401148E000,"Wurroom",,playable,2020-10-07 22:46:21 +010081700EDF4000,"WWE 2K Battlegrounds",nvdec;online-broken;UE4,playable,2022-10-07 12:44:40 +010009800203E000,"WWE 2K18",nvdec;online-broken,ingame,2025-01-17 11:36:56 +0100DF100B97C000,"X-Morph: Defense",,playable,2020-06-22 11:05:31 +0100D0B00FB74000,"XCOM® 2 Collection",gpu;crash,ingame,2022-10-04 09:38:30 +0100CC9015360000,"XEL",gpu,ingame,2022-10-03 10:19:39 +0100C9F009F7A000,"Xenoblade Chronicles 2: Torna ~ The Golden Country",slow;nvdec,playable,2023-01-28 16:47:28 +0100E95004038000,"Xenoblade Chronicles™ 2",deadlock;amd-vendor-bug,ingame,2024-03-28 14:31:41 +010074F013262000,"Xenoblade Chronicles™ 3",gpu;crash;nvdec;vulkan-backend-bug;amd-vendor-bug,ingame,2024-08-06 19:56:44 +0100FF500E34A000,"Xenoblade Chronicles™ Definitive Edition",nvdec,playable,2024-05-04 20:12:41 +0100453019aa8000,"Xenoblade Chronicles: X Definitive Edition",,ingame,2025-03-20 06:51:00 +010028600BA16000,"Xenon Racer",nvdec;UE4,playable,2022-08-31 22:05:30 +010064200C324000,"Xenon Valkyrie+",,playable,2021-06-07 20:25:53 +0100928005BD2000,"Xenoraid",,playable,2022-09-03 13:01:10 +01005B5009364000,"Xeodrifter",,playable,2022-09-03 13:18:39 +010048501F73E000,"X-Out: Resurfaced",,playable,2025-03-15 18:25:20 +01006FB00DB02000,"Yaga",nvdec,playable,2022-09-16 23:17:17 +010076B0101A0000,"YesterMorrow",crash,ingame,2020-12-17 17:15:25 +010085500B29A000,"Yet Another Zombie Defense HD",,playable,2021-01-06 00:18:39 +0100725019978000,"YGGDRA UNION ~WE'LL NEVER FIGHT ALONE~",,playable,2020-04-03 02:20:47 +0100634008266000,"YIIK: A Postmodern RPG",,playable,2021-01-28 13:38:37 +0100C0000CEEA000,"Yo kai watch 1 for Nintendo Switch",gpu;opengl,ingame,2024-05-28 11:11:49 +010086C00AF7C000,"Yo-Kai Watch 4++",,playable,2024-06-18 20:21:44 +010002D00632E000,"Yoku's Island Express",nvdec,playable,2022-09-03 13:59:02 +0100F47016F26000,"Yomawari 3",,playable,2022-05-10 08:26:51 +010012F00B6F2000,"Yomawari: The Long Night Collection",,playable,2022-09-03 14:36:59 +0100CC600ABB2000,"Yonder: The Cloud Catcher Chronicles (Retail Only)",,playable,2021-01-28 14:06:25 +0100534009ff2000,"Yonder: The Cloud Catcher Chronicles",,playable,2025-02-03 22:19:13 +0100BE50042F6000,"Yono and the Celestial Elephants",,playable,2021-01-28 18:23:58 +0100F110029C8000,"Yooka-Laylee",,playable,2021-01-28 14:21:45 +010022F00DA66000,"Yooka-Laylee and the Impossible Lair",,playable,2021-03-05 17:32:21 +01006000040C2000,"Yoshi’s Crafted World™",gpu;audout,ingame,2021-08-30 13:25:51 +0100AE800C9C6000,"Yoshi’s Crafted World™ Demo",gpu,boots,2020-12-16 14:57:40 +0100BBA00B23E000,"Yoshiwara Higanbana Kuon no Chigiri",nvdec,playable,2020-10-17 19:14:46 +01003A400C3DA800,"YouTube",,playable,2024-06-08 05:24:10 +00100A7700CCAA40,"Youtubers Life00",nvdec,playable,2022-09-03 14:56:19 +0100E390124D8000,"Ys IX: Monstrum Nox",,playable,2022-06-12 04:14:42 +0100F90010882000,"Ys Origin",nvdec,playable,2024-04-17 05:07:33 +01007F200B0C0000,"Ys VIII: Lacrimosa of DANA",nvdec,playable,2023-08-05 09:26:41 +010022400BE5A000,"Yu-Gi-Oh! Legacy of the Duelist : Link Evolution",,playable,2024-09-27 21:48:43 +01002D60188DE000,"Yu-Gi-Oh! Rush Duel: Dawn of the Battle Royale!! Let's Go! Go Rush!!",crash,ingame,2023-03-17 01:54:01 +010037D00DBDC000,"YU-NO: A girl who chants love at the bound of this world.",nvdec,playable,2021-01-26 17:03:52 +0100B56011502000,"Yumeutsutsu Re:After",,playable,2022-11-20 16:09:06 +0100DE200C0DA000,"Yunohana Spring! - Mellow Times -",audio;crash,menus,2020-09-27 19:27:40 +0100307011C44000,"Yuppie Psycho: Executive Edition",crash,ingame,2020-12-11 10:37:06 +0100FC900963E000,"Yuri",,playable,2021-06-11 13:08:50 +010092400A678000,"Zaccaria Pinball",online-broken,playable,2022-09-03 15:44:28 +0100E7900C4C0000,"Zarvot",,playable,2021-01-28 13:51:36 +01005F200F7C2000,"Zen Chess Collection",,playable,2020-07-01 22:28:27 +01008DD0114AE000,"Zenge",,playable,2020-10-22 13:23:57 +0100057011E50000,"Zengeon",services-horizon;crash,boots,2024-04-29 15:43:07 +0100AAC00E692000,"Zenith",,playable,2022-09-17 09:57:02 +0100A6A00894C000,"ZERO GUNNER 2- for Nintendo Switch",,playable,2021-01-04 20:17:14 +01004B001058C000,"Zero Strain",services;UE4,menus,2021-11-10 07:48:32 +010021300F69E000,"Zettai kaikyu gakuen",gpu;nvdec,ingame,2020-08-25 15:15:54 +0100D7B013DD0000,"Ziggy the Chaser",,playable,2021-02-04 20:34:27 +010086700EF16000,"ZikSquare",gpu,ingame,2021-11-06 02:02:48 +010069C0123D8000,"Zoids Wild Blast Unleashed",nvdec,playable,2022-10-15 11:26:59 +0100C7300EEE4000,"Zombie Army Trilogy",ldn-untested;online,playable,2020-12-16 12:02:28 +01006CF00DA8C000,"Zombie Driver Immortal Edition",nvdec,playable,2020-12-14 23:15:10 +0100CFE003A64000,"ZOMBIE GOLD RUSH",online,playable,2020-09-24 12:56:08 +01001740116EC000,"Zombie's Cool",,playable,2020-12-17 12:41:26 +01000E5800D32C00,"Zombieland: Double Tap - Road Trip0",,playable,2022-09-17 10:08:45 +0100CD300A1BA000,"Zombillie",,playable,2020-07-23 17:42:23 +01001EE00A6B0000,"Zotrix: Solar Division",,playable,2021-06-07 20:34:05 +0100B9B00C6A4000,"この世の果てで恋を唄う少女YU-NO",audio,ingame,2021-01-22 07:00:16 +0100E8600C504000,"スーパーファミコン Nintendo Switch Online",slow,ingame,2020-03-14 05:48:38 +01000BB01CB8A000,"トラブル・マギア ~訳アリ少女は未来を勝ち取るために異国の魔法学校へ留学します~(Trouble Magia ~Wakeari Shoujo wa Mirai o Kachitoru Tame ni Ikoku no Mahou Gakkou e Ryuugaku Shimasu~)",,nothing,2024-09-28 07:03:14 +010065500B218000,"メモリーズオフ - Innocent Fille",,playable,2022-12-02 17:36:48 +010032400E700000,"二ノ国 白き聖灰の女王",services;32-bit,menus,2023-04-16 17:11:06 +0100F3100DA46000,"初音ミク Project DIVA MEGA39's",audio;loader-allocator,playable,2022-07-29 11:45:52 +010047F012BE2000,"密室のサクリファイス/ABYSS OF THE SACRIFICE",nvdec,playable,2022-10-21 13:56:28 +0100BF401AF9C000,"御伽活劇 豆狸のバケル ~オラクル祭太郎の祭難!!~ (Otogi Katsugeki Mameda no Bakeru Oracle Saitarou no Sainan!!)",slow,playable,2023-12-31 14:37:17 +0100AFA01750C000,"死神と少女/Shinigami to Shoujo",gpu;Incomplete,ingame,2024-03-22 01:06:45 +01001BA01EBFC000,"燃えよ! 乙女道士 ~華遊恋語~ (Moeyo! Otome Doushi Kayu Koigatari)",services-horizon,nothing,2024-09-28 12:22:55 +0100936018EB4000,"牧場物語 Welcome!ワンダフルライフ",crash,ingame,2023-04-25 19:43:52 +0100F4401940A000,"超探偵事件簿 レインコード (Master Detective Archives: Rain Code)",crash,ingame,2024-02-12 20:58:31 +010064801A01C000,"超次元ゲイム ネプテューヌ GameMaker R:Evolution",crash,nothing,2023-10-30 22:37:40 +0100F3400332C000,"ゼノブレイド2",deadlock;amd-vendor-bug,ingame,2024-03-28 14:31:41 diff --git a/docs/shell.png b/docs/shell.png index f1eda13e8..9f2d4c257 100644 Binary files a/docs/shell.png and b/docs/shell.png differ diff --git a/docs/workflow/pr-guide.md b/docs/workflow/pr-guide.md index 50f44d87f..5616b0a0b 100644 --- a/docs/workflow/pr-guide.md +++ b/docs/workflow/pr-guide.md @@ -18,13 +18,13 @@ To merge pull requests, you must have write permissions in the repository. ## Pull Request Ownership -Every pull request will have automatically have labels and reviewers assigned. The label not only indicates the code segment which the change touches but also the area reviewers to be assigned. +Every pull request will automatically have labels and reviewers assigned. The label not only indicates the code segment which the change touches but also the area reviewers to be assigned. If during the code review process a merge conflict occurs, the PR author is responsible for its resolution. Help will be provided if necessary although GitHub makes this easier by allowing simple conflict resolution using the [conflict-editor](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-on-github). ## Pull Request Builds -When submitting a PR to the `GreemDev/Ryujinx` repository, various builds will run validating many areas to ensure we keep developer productivity and product quality high. These various workflows can be tracked in the [Actions](https://github.com/GreemDev/Ryujinx/actions) tab of the repository. If the job continues to completion, the build artifacts will be uploaded and posted as a comment in the PR discussion. +When submitting a PR to the `Ryubing/Ryujinx` repository, various builds will run validating many areas to ensure we keep developer productivity and product quality high. These various workflows can be tracked in the [Actions](https://github.com/Ryubing/Ryujinx/actions) tab of the repository. If the job continues to completion, the build artifacts will be uploaded and posted as a comment in the PR discussion. ## Review Turnaround Times @@ -42,7 +42,7 @@ Anyone with write access can merge a pull request manually when the following co * The PR has been approved by two reviewers and any other objections are addressed. * You can request follow up reviews from the original reviewers if they requested changes. -* The PR successfully builds and passes all tests in the Continuous Integration (CI) system. In case of failures, refer to the [Actions](https://github.com/GreemDev/Ryujinx/actions) tab of your PR. +* The PR successfully builds and passes all tests in the Continuous Integration (CI) system. In case of failures, refer to the [Actions](https://github.com/Ryubing/Ryujinx/actions) tab of your PR. Typically, PRs are merged as one commit (squash merges). It creates a simpler history than a Merge Commit. "Special circumstances" are rare, and typically mean that there are a series of cleanly separated changes that will be too hard to understand if squashed together, or for some reason we want to preserve the ability to dissect them. diff --git a/global.json b/global.json index 391ba3c2a..cdbb589ed 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.100", + "version": "9.0.100", "rollForward": "latestFeature" } } diff --git a/nuget.config b/nuget.config index 80f5bd7fc..26f795ba1 100644 --- a/nuget.config +++ b/nuget.config @@ -1,7 +1,25 @@  + - - - - + + + + + + + + + + + + + + + + + + + diff --git a/src/ARMeilleure/ARMeilleure.csproj b/src/ARMeilleure/ARMeilleure.csproj index 4b67fdb3b..c3a82d4cd 100644 --- a/src/ARMeilleure/ARMeilleure.csproj +++ b/src/ARMeilleure/ARMeilleure.csproj @@ -1,13 +1,12 @@ - net8.0 true $(DefaultItemExcludes);._* + true - diff --git a/src/ARMeilleure/CodeGen/Arm64/Arm64Optimizer.cs b/src/ARMeilleure/CodeGen/Arm64/Arm64Optimizer.cs index 00ffd1958..112193f46 100644 --- a/src/ARMeilleure/CodeGen/Arm64/Arm64Optimizer.cs +++ b/src/ARMeilleure/CodeGen/Arm64/Arm64Optimizer.cs @@ -13,13 +13,13 @@ namespace ARMeilleure.CodeGen.Arm64 public static void RunPass(ControlFlowGraph cfg) { - var constants = new Dictionary(); + Dictionary constants = new(); Operand GetConstantCopy(BasicBlock block, Operation operation, Operand source) { // If the constant has many uses, we also force a new constant mov to be added, in order // to avoid overflow of the counts field (that is limited to 16 bits). - if (!constants.TryGetValue(source.Value, out var constant) || constant.UsesCount > MaxConstantUses) + if (!constants.TryGetValue(source.Value, out Operand constant) || constant.UsesCount > MaxConstantUses) { constant = Local(source.Type); @@ -254,7 +254,7 @@ namespace ARMeilleure.CodeGen.Arm64 private static bool IsMemoryLoadOrStore(Instruction inst) { - return inst == Instruction.Load || inst == Instruction.Store; + return inst is Instruction.Load or Instruction.Store; } private static bool ConstTooLong(Operand constOp, OperandType accessType) diff --git a/src/ARMeilleure/CodeGen/Arm64/Assembler.cs b/src/ARMeilleure/CodeGen/Arm64/Assembler.cs index 41684faf2..0d493426b 100644 --- a/src/ARMeilleure/CodeGen/Arm64/Assembler.cs +++ b/src/ARMeilleure/CodeGen/Arm64/Assembler.cs @@ -123,7 +123,7 @@ namespace ARMeilleure.CodeGen.Arm64 public void Cset(Operand rd, ArmCondition condition) { - var zr = Factory.Register(ZrRegister, RegisterType.Integer, rd.Type); + Operand zr = Factory.Register(ZrRegister, RegisterType.Integer, rd.Type); Csinc(rd, zr, zr, (ArmCondition)((int)condition ^ 1)); } @@ -774,6 +774,7 @@ namespace ARMeilleure.CodeGen.Arm64 instI |= 1 << 22; // sh flag imm >>= 12; } + WriteInstructionAuto(instI | (EncodeUImm12(imm, 0) << 10), rd, rn); } else diff --git a/src/ARMeilleure/CodeGen/Arm64/CodeGenCommon.cs b/src/ARMeilleure/CodeGen/Arm64/CodeGenCommon.cs index 1f0148d5e..af5f1a8c7 100644 --- a/src/ARMeilleure/CodeGen/Arm64/CodeGenCommon.cs +++ b/src/ARMeilleure/CodeGen/Arm64/CodeGenCommon.cs @@ -52,7 +52,7 @@ namespace ARMeilleure.CodeGen.Arm64 // Any value AND all ones will be equal itself, so it's effectively a no-op. // Any value OR all ones will be equal all ones, so one can just use MOV. // Any value XOR all ones will be equal its inverse, so one can just use MVN. - if (value == 0 || value == ulong.MaxValue) + if (value is 0 or ulong.MaxValue) { immN = 0; immS = 0; diff --git a/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs b/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs index 89b1e9e6b..e4d9f46fa 100644 --- a/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs +++ b/src/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs @@ -1,6 +1,7 @@ using ARMeilleure.CodeGen.Linking; using ARMeilleure.CodeGen.RegisterAllocators; using ARMeilleure.IntermediateRepresentation; +using Microsoft.IO; using Ryujinx.Common.Memory; using System; using System.Collections.Generic; @@ -14,7 +15,7 @@ namespace ARMeilleure.CodeGen.Arm64 private const int CbnzInstLength = 4; private const int LdrLitInstLength = 4; - private readonly Stream _stream; + private readonly RecyclableMemoryStream _stream; public int StreamOffset => (int)_stream.Length; @@ -42,7 +43,7 @@ namespace ARMeilleure.CodeGen.Arm64 { Offset = offset; Symbol = symbol; - LdrOffsets = new List<(Operand, int)>(); + LdrOffsets = []; } } @@ -91,7 +92,7 @@ namespace ARMeilleure.CodeGen.Arm64 long target = _stream.Position; - if (_pendingBranches.TryGetValue(block, out var list)) + if (_pendingBranches.TryGetValue(block, out List<(ArmCondition Condition, long BranchPos)> list)) { foreach ((ArmCondition condition, long branchPos) in list) { @@ -119,7 +120,7 @@ namespace ARMeilleure.CodeGen.Arm64 } else { - if (!_pendingBranches.TryGetValue(target, out var list)) + if (!_pendingBranches.TryGetValue(target, out List<(ArmCondition Condition, long BranchPos)> list)) { list = new List<(ArmCondition, long)>(); _pendingBranches.Add(target, list); @@ -266,7 +267,7 @@ namespace ARMeilleure.CodeGen.Arm64 } else { - relocInfo = new RelocInfo(Array.Empty()); + relocInfo = new RelocInfo([]); } return (code, relocInfo); diff --git a/src/ARMeilleure/CodeGen/Arm64/CodeGenerator.cs b/src/ARMeilleure/CodeGen/Arm64/CodeGenerator.cs index 2df86671a..fbf4c1eb4 100644 --- a/src/ARMeilleure/CodeGen/Arm64/CodeGenerator.cs +++ b/src/ARMeilleure/CodeGen/Arm64/CodeGenerator.cs @@ -189,8 +189,8 @@ namespace ARMeilleure.CodeGen.Arm64 // The only blocks which can have 0 successors are exit blocks. Operation last = block.Operations.Last; - Debug.Assert(last.Instruction == Instruction.Tailcall || - last.Instruction == Instruction.Return); + Debug.Assert(last.Instruction is Instruction.Tailcall or + Instruction.Return); } else { @@ -322,7 +322,7 @@ namespace ARMeilleure.CodeGen.Arm64 Debug.Assert(comp.Kind == OperandKind.Constant); - var cond = ((Comparison)comp.AsInt32()).ToArmCondition(); + ArmCondition cond = ((Comparison)comp.AsInt32()).ToArmCondition(); GenerateCompareCommon(context, operation); @@ -354,7 +354,7 @@ namespace ARMeilleure.CodeGen.Arm64 Debug.Assert(dest.Type == OperandType.I32); Debug.Assert(comp.Kind == OperandKind.Constant); - var cond = ((Comparison)comp.AsInt32()).ToArmCondition(); + ArmCondition cond = ((Comparison)comp.AsInt32()).ToArmCondition(); GenerateCompareCommon(context, operation); @@ -464,7 +464,7 @@ namespace ARMeilleure.CodeGen.Arm64 Operand dest = operation.Destination; Operand source = operation.GetSource(0); - Debug.Assert(dest.Type == OperandType.FP32 || dest.Type == OperandType.FP64); + Debug.Assert(dest.Type is OperandType.FP32 or OperandType.FP64); Debug.Assert(dest.Type != source.Type); Debug.Assert(source.Type != OperandType.V128); @@ -483,7 +483,7 @@ namespace ARMeilleure.CodeGen.Arm64 Operand dest = operation.Destination; Operand source = operation.GetSource(0); - Debug.Assert(dest.Type == OperandType.FP32 || dest.Type == OperandType.FP64); + Debug.Assert(dest.Type is OperandType.FP32 or OperandType.FP64); Debug.Assert(dest.Type != source.Type); Debug.Assert(source.Type.IsInteger()); @@ -1079,7 +1079,7 @@ namespace ARMeilleure.CodeGen.Arm64 private static UnwindInfo WritePrologue(CodeGenContext context) { - List pushEntries = new(); + List pushEntries = []; Operand rsp = Register(SpRegister); @@ -1463,7 +1463,7 @@ namespace ARMeilleure.CodeGen.Arm64 private static bool IsLoadOrStore(Operation operation) { - return operation.Instruction == Instruction.Load || operation.Instruction == Instruction.Store; + return operation.Instruction is Instruction.Load or Instruction.Store; } private static OperandType GetMemOpValueType(Operation operation) @@ -1499,6 +1499,7 @@ namespace ARMeilleure.CodeGen.Arm64 return false; } } + if (memOp.Index != default) { return false; @@ -1553,7 +1554,7 @@ namespace ARMeilleure.CodeGen.Arm64 private static void EnsureSameReg(Operand op1, Operand op2) { - Debug.Assert(op1.Kind == OperandKind.Register || op1.Kind == OperandKind.Memory); + Debug.Assert(op1.Kind is OperandKind.Register or OperandKind.Memory); Debug.Assert(op1.Kind == op2.Kind); Debug.Assert(op1.Value == op2.Value); } diff --git a/src/ARMeilleure/CodeGen/Arm64/CodeGeneratorIntrinsic.cs b/src/ARMeilleure/CodeGen/Arm64/CodeGeneratorIntrinsic.cs index b87370557..390dc5b2e 100644 --- a/src/ARMeilleure/CodeGen/Arm64/CodeGeneratorIntrinsic.cs +++ b/src/ARMeilleure/CodeGen/Arm64/CodeGeneratorIntrinsic.cs @@ -509,7 +509,6 @@ namespace ARMeilleure.CodeGen.Arm64 context.Assembler.WriteInstruction(instruction, rd, rn); } - } private static void GenerateScalarTernary( diff --git a/src/ARMeilleure/CodeGen/Arm64/HardwareCapabilities.cs b/src/ARMeilleure/CodeGen/Arm64/HardwareCapabilities.cs index 639e4476b..fa9e7fe2e 100644 --- a/src/ARMeilleure/CodeGen/Arm64/HardwareCapabilities.cs +++ b/src/ARMeilleure/CodeGen/Arm64/HardwareCapabilities.cs @@ -137,11 +137,12 @@ namespace ARMeilleure.CodeGen.Arm64 { return val != 0; } + return false; } - private static readonly string[] _sysctlNames = new string[] - { + private static readonly string[] _sysctlNames = + [ "hw.optional.floatingpoint", "hw.optional.AdvSIMD", "hw.optional.arm.FEAT_FP16", @@ -150,8 +151,8 @@ namespace ARMeilleure.CodeGen.Arm64 "hw.optional.arm.FEAT_LSE", "hw.optional.armv8_crc32", "hw.optional.arm.FEAT_SHA1", - "hw.optional.arm.FEAT_SHA256", - }; + "hw.optional.arm.FEAT_SHA256" + ]; [Flags] public enum MacOsFeatureFlags diff --git a/src/ARMeilleure/CodeGen/Arm64/PreAllocator.cs b/src/ARMeilleure/CodeGen/Arm64/PreAllocator.cs index f66bb66e6..76a231d6c 100644 --- a/src/ARMeilleure/CodeGen/Arm64/PreAllocator.cs +++ b/src/ARMeilleure/CodeGen/Arm64/PreAllocator.cs @@ -261,10 +261,10 @@ namespace ARMeilleure.CodeGen.Arm64 Operand dest = operation.Destination; - List sources = new() - { - operation.GetSource(0), - }; + List sources = + [ + operation.GetSource(0) + ]; int argsCount = operation.SourcesCount - 1; @@ -365,10 +365,10 @@ namespace ARMeilleure.CodeGen.Arm64 Operation node, Operation operation) { - List sources = new() - { - operation.GetSource(0), - }; + List sources = + [ + operation.GetSource(0) + ]; int argsCount = operation.SourcesCount - 1; @@ -468,8 +468,8 @@ namespace ARMeilleure.CodeGen.Arm64 // Update the sources and destinations with split 64-bit halfs of the whole 128-bit values. // We also need a additional registers that will be used to store temporary information. - operation.SetDestinations(new[] { actualLow, actualHigh, Local(OperandType.I64), Local(OperandType.I64) }); - operation.SetSources(new[] { address, expectedLow, expectedHigh, desiredLow, desiredHigh }); + operation.SetDestinations([actualLow, actualHigh, Local(OperandType.I64), Local(OperandType.I64)]); + operation.SetSources([address, expectedLow, expectedHigh, desiredLow, desiredHigh]); // Add some dummy uses of the input operands, as the CAS operation will be a loop, // so they can't be used as destination operand. @@ -486,7 +486,7 @@ namespace ARMeilleure.CodeGen.Arm64 else { // We need a additional register where the store result will be written to. - node.SetDestinations(new[] { node.Destination, Local(OperandType.I32) }); + node.SetDestinations([node.Destination, Local(OperandType.I32)]); // Add some dummy uses of the input operands, as the CAS operation will be a loop, // so they can't be used as destination operand. @@ -736,19 +736,19 @@ namespace ARMeilleure.CodeGen.Arm64 { IntrinsicInfo info = IntrinsicTable.GetInfo(intrinsic & ~(Intrinsic.Arm64VTypeMask | Intrinsic.Arm64VSizeMask)); - return info.Type == IntrinsicType.ScalarBinaryRd || - info.Type == IntrinsicType.ScalarTernaryFPRdByElem || - info.Type == IntrinsicType.ScalarTernaryShlRd || - info.Type == IntrinsicType.ScalarTernaryShrRd || - info.Type == IntrinsicType.Vector128BinaryRd || - info.Type == IntrinsicType.VectorBinaryRd || - info.Type == IntrinsicType.VectorInsertByElem || - info.Type == IntrinsicType.VectorTernaryRd || - info.Type == IntrinsicType.VectorTernaryRdBitwise || - info.Type == IntrinsicType.VectorTernaryFPRdByElem || - info.Type == IntrinsicType.VectorTernaryRdByElem || - info.Type == IntrinsicType.VectorTernaryShlRd || - info.Type == IntrinsicType.VectorTernaryShrRd; + return info.Type is IntrinsicType.ScalarBinaryRd or + IntrinsicType.ScalarTernaryFPRdByElem or + IntrinsicType.ScalarTernaryShlRd or + IntrinsicType.ScalarTernaryShrRd or + IntrinsicType.Vector128BinaryRd or + IntrinsicType.VectorBinaryRd or + IntrinsicType.VectorInsertByElem or + IntrinsicType.VectorTernaryRd or + IntrinsicType.VectorTernaryRdBitwise or + IntrinsicType.VectorTernaryFPRdByElem or + IntrinsicType.VectorTernaryRdByElem or + IntrinsicType.VectorTernaryShlRd or + IntrinsicType.VectorTernaryShrRd; } private static bool HasConstSrc1(Operation node, ulong value) @@ -847,9 +847,9 @@ namespace ARMeilleure.CodeGen.Arm64 Debug.Assert(comp.Kind == OperandKind.Constant); - var compType = (Comparison)comp.AsInt32(); + Comparison compType = (Comparison)comp.AsInt32(); - return compType == Comparison.Equal || compType == Comparison.NotEqual; + return compType is Comparison.Equal or Comparison.NotEqual; } } @@ -871,9 +871,9 @@ namespace ARMeilleure.CodeGen.Arm64 IntrinsicInfo info = IntrinsicTable.GetInfo(intrinsic & ~(Intrinsic.Arm64VTypeMask | Intrinsic.Arm64VSizeMask)); // Those have integer inputs that don't support consts. - return info.Type != IntrinsicType.ScalarFPConvGpr && - info.Type != IntrinsicType.ScalarFPConvFixedGpr && - info.Type != IntrinsicType.SetRegister; + return info.Type is not IntrinsicType.ScalarFPConvGpr and + not IntrinsicType.ScalarFPConvFixedGpr and + not IntrinsicType.SetRegister; } return false; diff --git a/src/ARMeilleure/CodeGen/CompiledFunction.cs b/src/ARMeilleure/CodeGen/CompiledFunction.cs index 8ea7ff532..7014f715a 100644 --- a/src/ARMeilleure/CodeGen/CompiledFunction.cs +++ b/src/ARMeilleure/CodeGen/CompiledFunction.cs @@ -1,7 +1,6 @@ using ARMeilleure.CodeGen.Linking; using ARMeilleure.CodeGen.Unwinding; using ARMeilleure.Translation.Cache; -using System; using System.Runtime.InteropServices; namespace ARMeilleure.CodeGen diff --git a/src/ARMeilleure/CodeGen/Linking/RelocInfo.cs b/src/ARMeilleure/CodeGen/Linking/RelocInfo.cs index 01ff0347b..fb8b449a7 100644 --- a/src/ARMeilleure/CodeGen/Linking/RelocInfo.cs +++ b/src/ARMeilleure/CodeGen/Linking/RelocInfo.cs @@ -10,7 +10,7 @@ namespace ARMeilleure.CodeGen.Linking /// /// Gets an empty . /// - public static RelocInfo Empty { get; } = new RelocInfo(null); + public static RelocInfo Empty { get; } = new(null); private readonly RelocEntry[] _entries; diff --git a/src/ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs b/src/ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs index be3dff58c..c7aa1ee5f 100644 --- a/src/ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs +++ b/src/ARMeilleure/CodeGen/Optimizations/ConstantFolding.cs @@ -37,6 +37,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => x + y); } + break; case Instruction.BitwiseAnd: @@ -48,6 +49,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => x & y); } + break; case Instruction.BitwiseExclusiveOr: @@ -59,6 +61,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => x ^ y); } + break; case Instruction.BitwiseNot: @@ -70,6 +73,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateUnaryI64(operation, (x) => ~x); } + break; case Instruction.BitwiseOr: @@ -81,6 +85,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => x | y); } + break; case Instruction.ConvertI64ToI32: @@ -88,6 +93,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateUnaryI32(operation, (x) => x); } + break; case Instruction.Compare: @@ -129,6 +135,7 @@ namespace ARMeilleure.CodeGen.Optimizations break; } } + break; case Instruction.Copy: @@ -140,6 +147,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateUnaryI64(operation, (x) => x); } + break; case Instruction.Divide: @@ -151,6 +159,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => y != 0 ? x / y : 0); } + break; case Instruction.DivideUI: @@ -162,6 +171,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => y != 0 ? (long)((ulong)x / (ulong)y) : 0); } + break; case Instruction.Multiply: @@ -173,6 +183,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => x * y); } + break; case Instruction.Negate: @@ -184,6 +195,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateUnaryI64(operation, (x) => -x); } + break; case Instruction.ShiftLeft: @@ -195,6 +207,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => x << (int)y); } + break; case Instruction.ShiftRightSI: @@ -206,6 +219,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => x >> (int)y); } + break; case Instruction.ShiftRightUI: @@ -217,6 +231,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => (long)((ulong)x >> (int)y)); } + break; case Instruction.SignExtend16: @@ -228,6 +243,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateUnaryI64(operation, (x) => (short)x); } + break; case Instruction.SignExtend32: @@ -239,6 +255,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateUnaryI64(operation, (x) => (int)x); } + break; case Instruction.SignExtend8: @@ -250,6 +267,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateUnaryI64(operation, (x) => (sbyte)x); } + break; case Instruction.ZeroExtend16: @@ -261,6 +279,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateUnaryI64(operation, (x) => (ushort)x); } + break; case Instruction.ZeroExtend32: @@ -272,6 +291,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateUnaryI64(operation, (x) => (uint)x); } + break; case Instruction.ZeroExtend8: @@ -283,6 +303,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateUnaryI64(operation, (x) => (byte)x); } + break; case Instruction.Subtract: @@ -294,6 +315,7 @@ namespace ARMeilleure.CodeGen.Optimizations { EvaluateBinaryI64(operation, (x, y) => x - y); } + break; } } diff --git a/src/ARMeilleure/CodeGen/Optimizations/Optimizer.cs b/src/ARMeilleure/CodeGen/Optimizations/Optimizer.cs index 1afc3a782..cbc6ab784 100644 --- a/src/ARMeilleure/CodeGen/Optimizations/Optimizer.cs +++ b/src/ARMeilleure/CodeGen/Optimizations/Optimizer.cs @@ -227,11 +227,11 @@ namespace ARMeilleure.CodeGen.Optimizations private static bool HasSideEffects(Operation node) { - return node.Instruction == Instruction.Call - || node.Instruction == Instruction.Tailcall - || node.Instruction == Instruction.CompareAndSwap - || node.Instruction == Instruction.CompareAndSwap16 - || node.Instruction == Instruction.CompareAndSwap8; + return node.Instruction is Instruction.Call + or Instruction.Tailcall + or Instruction.CompareAndSwap + or Instruction.CompareAndSwap16 + or Instruction.CompareAndSwap8; } private static bool IsPropagableCompare(Operation operation) diff --git a/src/ARMeilleure/CodeGen/RegisterAllocators/CopyResolver.cs b/src/ARMeilleure/CodeGen/RegisterAllocators/CopyResolver.cs index af10330ba..8b135afab 100644 --- a/src/ARMeilleure/CodeGen/RegisterAllocators/CopyResolver.cs +++ b/src/ARMeilleure/CodeGen/RegisterAllocators/CopyResolver.cs @@ -31,7 +31,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators public ParallelCopy() { - _copies = new List(); + _copies = []; } public void AddCopy(Register dest, Register source, OperandType type) @@ -218,7 +218,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators public Operation[] Sequence() { - List sequence = new(); + List sequence = []; if (_spillQueue != null) { diff --git a/src/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs b/src/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs index 16feeb914..92fedf7bf 100644 --- a/src/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs +++ b/src/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs @@ -115,7 +115,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators { NumberLocals(cfg, regMasks.RegistersCount); - var context = new AllocationContext(stackAlloc, regMasks, _intervals.Count); + AllocationContext context = new(stackAlloc, regMasks, _intervals.Count); BuildIntervals(cfg, context); @@ -799,8 +799,8 @@ namespace ARMeilleure.CodeGen.RegisterAllocators private void NumberLocals(ControlFlowGraph cfg, int registersCount) { - _operationNodes = new List<(IntrusiveList, Operation)>(); - _intervals = new List(); + _operationNodes = []; + _intervals = []; for (int index = 0; index < registersCount; index++) { @@ -839,7 +839,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators { dest.NumberLocal(_intervals.Count); - LiveInterval interval = new LiveInterval(dest); + LiveInterval interval = new(dest); _intervals.Add(interval); SetVisited(dest); @@ -847,7 +847,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators // If this is a copy (or copy-like operation), set the copy source interval as well. // This is used for register preferencing later on, which allows the copy to be eliminated // in some cases. - if (node.Instruction == Instruction.Copy || node.Instruction == Instruction.ZeroExtend32) + if (node.Instruction is Instruction.Copy or Instruction.ZeroExtend32) { Operand source = node.GetSource(0); @@ -980,7 +980,7 @@ namespace ARMeilleure.CodeGen.RegisterAllocators _blockLiveIn = blkLiveIn; - _blockEdges = new HashSet(); + _blockEdges = []; // Compute lifetime intervals. int operationPos = _operationsCount; @@ -1120,8 +1120,8 @@ namespace ARMeilleure.CodeGen.RegisterAllocators private static bool IsLocalOrRegister(OperandKind kind) { - return kind == OperandKind.LocalVariable || - kind == OperandKind.Register; + return kind is OperandKind.LocalVariable or + OperandKind.Register; } } } diff --git a/src/ARMeilleure/CodeGen/RegisterAllocators/LiveIntervalList.cs b/src/ARMeilleure/CodeGen/RegisterAllocators/LiveIntervalList.cs index 84b892f42..b31d8fa78 100644 --- a/src/ARMeilleure/CodeGen/RegisterAllocators/LiveIntervalList.cs +++ b/src/ARMeilleure/CodeGen/RegisterAllocators/LiveIntervalList.cs @@ -15,12 +15,12 @@ namespace ARMeilleure.CodeGen.RegisterAllocators { if (_count + 1 > _capacity) { - var oldSpan = Span; + Span oldSpan = Span; _capacity = Math.Max(4, _capacity * 2); _items = Allocators.References.Allocate((uint)_capacity); - var newSpan = Span; + Span newSpan = Span; oldSpan.CopyTo(newSpan); } diff --git a/src/ARMeilleure/CodeGen/RegisterAllocators/UseList.cs b/src/ARMeilleure/CodeGen/RegisterAllocators/UseList.cs index 806002f83..c78201785 100644 --- a/src/ARMeilleure/CodeGen/RegisterAllocators/UseList.cs +++ b/src/ARMeilleure/CodeGen/RegisterAllocators/UseList.cs @@ -16,12 +16,12 @@ namespace ARMeilleure.CodeGen.RegisterAllocators { if (Count + 1 > _capacity) { - var oldSpan = Span; + Span oldSpan = Span; _capacity = Math.Max(4, _capacity * 2); _items = Allocators.Default.Allocate((uint)_capacity); - var newSpan = Span; + Span newSpan = Span; oldSpan.CopyTo(newSpan); } diff --git a/src/ARMeilleure/CodeGen/X86/Assembler.cs b/src/ARMeilleure/CodeGen/X86/Assembler.cs index 96f4de049..c27ee43cb 100644 --- a/src/ARMeilleure/CodeGen/X86/Assembler.cs +++ b/src/ARMeilleure/CodeGen/X86/Assembler.cs @@ -1,5 +1,6 @@ using ARMeilleure.CodeGen.Linking; using ARMeilleure.IntermediateRepresentation; +using Microsoft.IO; using Ryujinx.Common.Memory; using System; using System.Collections.Generic; @@ -74,9 +75,9 @@ namespace ARMeilleure.CodeGen.X86 { _stream = stream; _labels = new Dictionary(); - _jumps = new List(); + _jumps = []; - _relocs = relocatable ? new List() : null; + _relocs = relocatable ? [] : null; } public void MarkLabel(Operand label) @@ -1324,8 +1325,8 @@ namespace ARMeilleure.CodeGen.X86 public (byte[], RelocInfo) GetCode() { - var jumps = CollectionsMarshal.AsSpan(_jumps); - var relocs = CollectionsMarshal.AsSpan(_relocs); + Span jumps = CollectionsMarshal.AsSpan(_jumps); + Span relocs = CollectionsMarshal.AsSpan(_relocs); // Write jump relative offsets. bool modified; @@ -1410,15 +1411,15 @@ namespace ARMeilleure.CodeGen.X86 // Write the code, ignoring the dummy bytes after jumps, into a new stream. _stream.Seek(0, SeekOrigin.Begin); - using var codeStream = MemoryStreamManager.Shared.GetStream(); - var assembler = new Assembler(codeStream, HasRelocs); + using RecyclableMemoryStream codeStream = MemoryStreamManager.Shared.GetStream(); + Assembler assembler = new(codeStream, HasRelocs); bool hasRelocs = HasRelocs; int relocIndex = 0; int relocOffset = 0; - var relocEntries = hasRelocs + RelocEntry[] relocEntries = hasRelocs ? new RelocEntry[relocs.Length] - : Array.Empty(); + : []; for (int i = 0; i < jumps.Length; i++) { @@ -1469,15 +1470,15 @@ namespace ARMeilleure.CodeGen.X86 _stream.CopyTo(codeStream); - var code = codeStream.ToArray(); - var relocInfo = new RelocInfo(relocEntries); + byte[] code = codeStream.ToArray(); + RelocInfo relocInfo = new(relocEntries); return (code, relocInfo); } private static bool Is64Bits(OperandType type) { - return type == OperandType.I64 || type == OperandType.FP64; + return type is OperandType.I64 or OperandType.FP64; } private static bool IsImm8(ulong immediate, OperandType type) diff --git a/src/ARMeilleure/CodeGen/X86/AssemblerTable.cs b/src/ARMeilleure/CodeGen/X86/AssemblerTable.cs index 8910e8891..4b226803b 100644 --- a/src/ARMeilleure/CodeGen/X86/AssemblerTable.cs +++ b/src/ARMeilleure/CodeGen/X86/AssemblerTable.cs @@ -13,7 +13,6 @@ namespace ARMeilleure.CodeGen.X86 private const int BadOp = 0; [Flags] - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] private enum InstructionFlags { None = 0, diff --git a/src/ARMeilleure/CodeGen/X86/CodeGenContext.cs b/src/ARMeilleure/CodeGen/X86/CodeGenContext.cs index d4d4c2058..afae3211f 100644 --- a/src/ARMeilleure/CodeGen/X86/CodeGenContext.cs +++ b/src/ARMeilleure/CodeGen/X86/CodeGenContext.cs @@ -1,5 +1,6 @@ using ARMeilleure.CodeGen.RegisterAllocators; using ARMeilleure.IntermediateRepresentation; +using Microsoft.IO; using Ryujinx.Common.Memory; using System.IO; using System.Numerics; @@ -8,7 +9,7 @@ namespace ARMeilleure.CodeGen.X86 { class CodeGenContext { - private readonly Stream _stream; + private readonly RecyclableMemoryStream _stream; private readonly Operand[] _blockLabels; public int StreamOffset => (int)_stream.Length; diff --git a/src/ARMeilleure/CodeGen/X86/CodeGenerator.cs b/src/ARMeilleure/CodeGen/X86/CodeGenerator.cs index 9e94a077f..86acea4a8 100644 --- a/src/ARMeilleure/CodeGen/X86/CodeGenerator.cs +++ b/src/ARMeilleure/CodeGen/X86/CodeGenerator.cs @@ -175,8 +175,8 @@ namespace ARMeilleure.CodeGen.X86 // The only blocks which can have 0 successors are exit blocks. Operation last = block.Operations.Last; - Debug.Assert(last.Instruction == Instruction.Tailcall || - last.Instruction == Instruction.Return); + Debug.Assert(last.Instruction is Instruction.Tailcall or + Instruction.Return); } else { @@ -478,7 +478,7 @@ namespace ARMeilleure.CodeGen.X86 Debug.Assert(HardwareCapabilities.SupportsVexEncoding); Debug.Assert(dest.Kind == OperandKind.Register && src1.Kind == OperandKind.Register && src2.Kind == OperandKind.Register); - Debug.Assert(src3.Kind == OperandKind.Register || src3.Kind == OperandKind.Memory); + Debug.Assert(src3.Kind is OperandKind.Register or OperandKind.Memory); EnsureSameType(dest, src1, src2, src3); Debug.Assert(dest.Type == OperandType.V128); @@ -623,7 +623,7 @@ namespace ARMeilleure.CodeGen.X86 Debug.Assert(comp.Kind == OperandKind.Constant); - var cond = ((Comparison)comp.AsInt32()).ToX86Condition(); + X86Condition cond = ((Comparison)comp.AsInt32()).ToX86Condition(); GenerateCompareCommon(context, operation); @@ -661,7 +661,7 @@ namespace ARMeilleure.CodeGen.X86 Debug.Assert(dest.Type == OperandType.I32); Debug.Assert(comp.Kind == OperandKind.Constant); - var cond = ((Comparison)comp.AsInt32()).ToX86Condition(); + X86Condition cond = ((Comparison)comp.AsInt32()).ToX86Condition(); GenerateCompareCommon(context, operation); @@ -788,7 +788,7 @@ namespace ARMeilleure.CodeGen.X86 Operand dest = operation.Destination; Operand source = operation.GetSource(0); - Debug.Assert(dest.Type == OperandType.FP32 || dest.Type == OperandType.FP64); + Debug.Assert(dest.Type is OperandType.FP32 or OperandType.FP64); if (dest.Type == OperandType.FP32) { @@ -1723,7 +1723,7 @@ namespace ARMeilleure.CodeGen.X86 return; } - Debug.Assert(op1.Kind == OperandKind.Register || op1.Kind == OperandKind.Memory); + Debug.Assert(op1.Kind is OperandKind.Register or OperandKind.Memory); Debug.Assert(op1.Kind == op2.Kind); Debug.Assert(op1.Value == op2.Value); } @@ -1748,7 +1748,7 @@ namespace ARMeilleure.CodeGen.X86 private static UnwindInfo WritePrologue(CodeGenContext context) { - List pushEntries = new(); + List pushEntries = []; Operand rsp = Register(X86Register.Rsp); diff --git a/src/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs b/src/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs index 4f6f1e87b..02c0b79f2 100644 --- a/src/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs +++ b/src/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs @@ -40,12 +40,12 @@ namespace ARMeilleure.CodeGen.X86 return 0; } - ReadOnlySpan asmGetXcr0 = new byte[] - { + ReadOnlySpan asmGetXcr0 = + [ 0x31, 0xc9, // xor ecx, ecx 0xf, 0x01, 0xd0, // xgetbv - 0xc3, // ret - }; + 0xc3 // ret + ]; using MemoryBlock memGetXcr0 = new((ulong)asmGetXcr0.Length); @@ -53,7 +53,7 @@ namespace ARMeilleure.CodeGen.X86 memGetXcr0.Reprotect(0, (ulong)asmGetXcr0.Length, MemoryPermission.ReadAndExecute); - var fGetXcr0 = Marshal.GetDelegateForFunctionPointer(memGetXcr0.Pointer); + GetXcr0 fGetXcr0 = Marshal.GetDelegateForFunctionPointer(memGetXcr0.Pointer); return fGetXcr0(); } diff --git a/src/ARMeilleure/CodeGen/X86/PreAllocator.cs b/src/ARMeilleure/CodeGen/X86/PreAllocator.cs index 590c35c7b..6b93efdfb 100644 --- a/src/ARMeilleure/CodeGen/X86/PreAllocator.cs +++ b/src/ARMeilleure/CodeGen/X86/PreAllocator.cs @@ -66,6 +66,7 @@ namespace ARMeilleure.CodeGen.X86 { PreAllocatorSystemV.InsertCallCopies(block.Operations, node); } + break; case Instruction.ConvertToFPUI: @@ -81,6 +82,7 @@ namespace ARMeilleure.CodeGen.X86 { nextNode = PreAllocatorSystemV.InsertLoadArgumentCopy(cctx, ref buffer, block.Operations, preservedArgs, node); } + break; case Instruction.Negate: @@ -88,6 +90,7 @@ namespace ARMeilleure.CodeGen.X86 { GenerateNegate(block.Operations, node); } + break; case Instruction.Return: @@ -99,6 +102,7 @@ namespace ARMeilleure.CodeGen.X86 { PreAllocatorSystemV.InsertReturnCopy(block.Operations, node); } + break; case Instruction.Tailcall: @@ -110,6 +114,7 @@ namespace ARMeilleure.CodeGen.X86 { PreAllocatorSystemV.InsertTailcallCopies(block.Operations, node); } + break; case Instruction.VectorInsert8: @@ -117,6 +122,7 @@ namespace ARMeilleure.CodeGen.X86 { GenerateVectorInsert8(block.Operations, node); } + break; case Instruction.Extended: @@ -124,14 +130,15 @@ namespace ARMeilleure.CodeGen.X86 { int stackOffset = stackAlloc.Allocate(OperandType.I32); - node.SetSources(new Operand[] { Const(stackOffset), node.GetSource(0) }); + node.SetSources([Const(stackOffset), node.GetSource(0)]); } else if (node.Intrinsic == Intrinsic.X86Stmxcsr) { int stackOffset = stackAlloc.Allocate(OperandType.I32); - node.SetSources(new Operand[] { Const(stackOffset) }); + node.SetSources([Const(stackOffset)]); } + break; } } @@ -253,8 +260,8 @@ namespace ARMeilleure.CodeGen.X86 node = nodes.AddAfter(node, Operation(Instruction.VectorCreateScalar, dest, rax)); nodes.AddAfter(node, Operation(Instruction.VectorInsert, dest, dest, rdx, Const(1))); - operation.SetDestinations(new Operand[] { rdx, rax }); - operation.SetSources(new Operand[] { operation.GetSource(0), rdx, rax, rcx, rbx }); + operation.SetDestinations([rdx, rax]); + operation.SetSources([operation.GetSource(0), rdx, rax, rcx, rbx]); } else { @@ -274,7 +281,7 @@ namespace ARMeilleure.CodeGen.X86 nodes.AddBefore(node, Operation(Instruction.Copy, temp, newValue)); - node.SetSources(new Operand[] { node.GetSource(0), rax, temp }); + node.SetSources([node.GetSource(0), rax, temp]); nodes.AddAfter(node, Operation(Instruction.Copy, dest, rax)); @@ -303,7 +310,7 @@ namespace ARMeilleure.CodeGen.X86 nodes.AddAfter(node, Operation(Instruction.Copy, dest, rax)); - node.SetSources(new Operand[] { rdx, rax, node.GetSource(1) }); + node.SetSources([rdx, rax, node.GetSource(1)]); node.Destination = rax; } @@ -312,9 +319,9 @@ namespace ARMeilleure.CodeGen.X86 case Instruction.Extended: { - bool isBlend = node.Intrinsic == Intrinsic.X86Blendvpd || - node.Intrinsic == Intrinsic.X86Blendvps || - node.Intrinsic == Intrinsic.X86Pblendvb; + bool isBlend = node.Intrinsic is Intrinsic.X86Blendvpd or + Intrinsic.X86Blendvps or + Intrinsic.X86Pblendvb; // BLENDVPD, BLENDVPS, PBLENDVB last operand is always implied to be XMM0 when VEX is not supported. // SHA256RNDS2 always has an implied XMM0 as a last operand. @@ -348,7 +355,7 @@ namespace ARMeilleure.CodeGen.X86 nodes.AddAfter(node, Operation(Instruction.Copy, dest, rdx)); - node.SetDestinations(new Operand[] { rdx, rax }); + node.SetDestinations([rdx, rax]); break; } @@ -513,8 +520,8 @@ namespace ARMeilleure.CodeGen.X86 Operand dest = node.Destination; Operand source = node.GetSource(0); - Debug.Assert(dest.Type == OperandType.FP32 || - dest.Type == OperandType.FP64, $"Invalid destination type \"{dest.Type}\"."); + Debug.Assert(dest.Type is OperandType.FP32 or + OperandType.FP64, $"Invalid destination type \"{dest.Type}\"."); Operation currentNode = node; @@ -759,9 +766,9 @@ namespace ARMeilleure.CodeGen.X86 Debug.Assert(comp.Kind == OperandKind.Constant); - var compType = (Comparison)comp.AsInt32(); + Comparison compType = (Comparison)comp.AsInt32(); - return compType == Comparison.Equal || compType == Comparison.NotEqual; + return compType is Comparison.Equal or Comparison.NotEqual; } } diff --git a/src/ARMeilleure/CodeGen/X86/PreAllocatorSystemV.cs b/src/ARMeilleure/CodeGen/X86/PreAllocatorSystemV.cs index e754cb09b..cff1c7240 100644 --- a/src/ARMeilleure/CodeGen/X86/PreAllocatorSystemV.cs +++ b/src/ARMeilleure/CodeGen/X86/PreAllocatorSystemV.cs @@ -14,10 +14,10 @@ namespace ARMeilleure.CodeGen.X86 { Operand dest = node.Destination; - List sources = new() - { - node.GetSource(0), - }; + List sources = + [ + node.GetSource(0) + ]; int argsCount = node.SourcesCount - 1; @@ -117,10 +117,10 @@ namespace ARMeilleure.CodeGen.X86 public static void InsertTailcallCopies(IntrusiveList nodes, Operation node) { - List sources = new() - { - node.GetSource(0), - }; + List sources = + [ + node.GetSource(0) + ]; int argsCount = node.SourcesCount - 1; diff --git a/src/ARMeilleure/CodeGen/X86/PreAllocatorWindows.cs b/src/ARMeilleure/CodeGen/X86/PreAllocatorWindows.cs index 10a2bd129..52f72ac69 100644 --- a/src/ARMeilleure/CodeGen/X86/PreAllocatorWindows.cs +++ b/src/ARMeilleure/CodeGen/X86/PreAllocatorWindows.cs @@ -321,7 +321,7 @@ namespace ARMeilleure.CodeGen.X86 nodes.AddBefore(node, retCopyOp); } - node.SetSources(Array.Empty()); + node.SetSources([]); } } } diff --git a/src/ARMeilleure/CodeGen/X86/X86Optimizer.cs b/src/ARMeilleure/CodeGen/X86/X86Optimizer.cs index 690ca5043..49dc1c8a4 100644 --- a/src/ARMeilleure/CodeGen/X86/X86Optimizer.cs +++ b/src/ARMeilleure/CodeGen/X86/X86Optimizer.cs @@ -13,13 +13,13 @@ namespace ARMeilleure.CodeGen.X86 public static void RunPass(ControlFlowGraph cfg) { - var constants = new Dictionary(); + Dictionary constants = new(); Operand GetConstantCopy(BasicBlock block, Operation operation, Operand source) { // If the constant has many uses, we also force a new constant mov to be added, in order // to avoid overflow of the counts field (that is limited to 16 bits). - if (!constants.TryGetValue(source.Value, out var constant) || constant.UsesCount > MaxConstantUses) + if (!constants.TryGetValue(source.Value, out Operand constant) || constant.UsesCount > MaxConstantUses) { constant = Local(source.Type); @@ -248,12 +248,12 @@ namespace ARMeilleure.CodeGen.X86 private static bool IsMemoryLoadOrStore(Instruction inst) { - return inst == Instruction.Load || - inst == Instruction.Load16 || - inst == Instruction.Load8 || - inst == Instruction.Store || - inst == Instruction.Store16 || - inst == Instruction.Store8; + return inst is Instruction.Load or + Instruction.Load16 or + Instruction.Load8 or + Instruction.Store or + Instruction.Store16 or + Instruction.Store8; } } } diff --git a/src/ARMeilleure/CodeGen/X86/X86Register.cs b/src/ARMeilleure/CodeGen/X86/X86Register.cs index 0a6563663..bcce4f974 100644 --- a/src/ARMeilleure/CodeGen/X86/X86Register.cs +++ b/src/ARMeilleure/CodeGen/X86/X86Register.cs @@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis; namespace ARMeilleure.CodeGen.X86 { - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum X86Register { Invalid = -1, diff --git a/src/ARMeilleure/Common/AddressTablePresets.cs b/src/ARMeilleure/Common/AddressTablePresets.cs index 977e84a36..fd786fc7e 100644 --- a/src/ARMeilleure/Common/AddressTablePresets.cs +++ b/src/ARMeilleure/Common/AddressTablePresets.cs @@ -3,52 +3,46 @@ namespace ARMeilleure.Common public static class AddressTablePresets { private static readonly AddressTableLevel[] _levels64Bit = - new AddressTableLevel[] - { - new(31, 17), + [ + new(31, 17), new(23, 8), new(15, 8), new( 7, 8), - new( 2, 5), - }; + new( 2, 5) + ]; private static readonly AddressTableLevel[] _levels32Bit = - new AddressTableLevel[] - { - new(31, 17), + [ + new(31, 17), new(23, 8), new(15, 8), new( 7, 8), - new( 1, 6), - }; + new( 1, 6) + ]; private static readonly AddressTableLevel[] _levels64BitSparseTiny = - new AddressTableLevel[] - { - new( 11, 28), - new( 2, 9), - }; + [ + new( 11, 28), + new( 2, 9) + ]; private static readonly AddressTableLevel[] _levels32BitSparseTiny = - new AddressTableLevel[] - { - new( 10, 22), - new( 1, 9), - }; + [ + new( 10, 22), + new( 1, 9) + ]; private static readonly AddressTableLevel[] _levels64BitSparseGiant = - new AddressTableLevel[] - { - new( 38, 1), - new( 2, 36), - }; + [ + new( 38, 1), + new( 2, 36) + ]; private static readonly AddressTableLevel[] _levels32BitSparseGiant = - new AddressTableLevel[] - { - new( 31, 1), - new( 1, 30), - }; + [ + new( 31, 1), + new( 1, 30) + ]; //high power will run worse on DDR3 systems and some DDR4 systems due to the higher ram utilization //low power will never run worse than non-sparse, but for most systems it won't be necessary diff --git a/src/ARMeilleure/Common/BitMap.cs b/src/ARMeilleure/Common/BitMap.cs index 94d47ea59..52e192699 100644 --- a/src/ARMeilleure/Common/BitMap.cs +++ b/src/ARMeilleure/Common/BitMap.cs @@ -129,13 +129,13 @@ namespace ARMeilleure.Common if (count > _count) { - var oldMask = _masks; - var oldSpan = new Span(_masks, _count); + long* oldMask = _masks; + Span oldSpan = new(_masks, _count); _masks = _allocator.Allocate((uint)count); _count = count; - var newSpan = new Span(_masks, _count); + Span newSpan = new(_masks, _count); oldSpan.CopyTo(newSpan); newSpan[oldSpan.Length..].Clear(); diff --git a/src/ARMeilleure/Common/BitUtils.cs b/src/ARMeilleure/Common/BitUtils.cs index e7697ff31..7e2ed7f60 100644 --- a/src/ARMeilleure/Common/BitUtils.cs +++ b/src/ARMeilleure/Common/BitUtils.cs @@ -5,7 +5,7 @@ namespace ARMeilleure.Common { static class BitUtils { - private static ReadOnlySpan HbsNibbleLut => new sbyte[] { -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3 }; + private static ReadOnlySpan HbsNibbleLut => [-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3]; public static long FillWithOnes(int bits) { diff --git a/src/ARMeilleure/Common/EntryTable.cs b/src/ARMeilleure/Common/EntryTable.cs index e49a0989e..7b8c1e134 100644 --- a/src/ARMeilleure/Common/EntryTable.cs +++ b/src/ARMeilleure/Common/EntryTable.cs @@ -63,7 +63,7 @@ namespace ARMeilleure.Common } int index = _freeHint++; - var page = GetPage(index); + Span page = GetPage(index); _allocated.Set(index); @@ -111,7 +111,7 @@ namespace ARMeilleure.Common throw new ArgumentException("Entry at the specified index was not allocated", nameof(index)); } - var page = GetPage(index); + Span page = GetPage(index); return ref GetValue(page, index); } @@ -136,7 +136,7 @@ namespace ARMeilleure.Common /// Page for the specified private unsafe Span GetPage(int index) { - var pageIndex = (int)((uint)(index & ~(_pageCapacity - 1)) >> _pageLogCapacity); + int pageIndex = (int)((uint)(index & ~(_pageCapacity - 1)) >> _pageLogCapacity); if (!_pages.TryGetValue(pageIndex, out nint page)) { @@ -168,7 +168,7 @@ namespace ARMeilleure.Common { _allocated.Dispose(); - foreach (var page in _pages.Values) + foreach (IntPtr page in _pages.Values) { NativeAllocator.Instance.Free((void*)page); } diff --git a/src/ARMeilleure/Decoders/Block.cs b/src/ARMeilleure/Decoders/Block.cs index bb88170da..3ece552ec 100644 --- a/src/ARMeilleure/Decoders/Block.cs +++ b/src/ARMeilleure/Decoders/Block.cs @@ -17,7 +17,7 @@ namespace ARMeilleure.Decoders public Block() { - OpCodes = new List(); + OpCodes = []; } public Block(ulong address) : this() diff --git a/src/ARMeilleure/Decoders/Decoder.cs b/src/ARMeilleure/Decoders/Decoder.cs index 66d286928..29c939f5d 100644 --- a/src/ARMeilleure/Decoders/Decoder.cs +++ b/src/ARMeilleure/Decoders/Decoder.cs @@ -20,7 +20,7 @@ namespace ARMeilleure.Decoders public static Block[] Decode(IMemoryManager memory, ulong address, ExecutionMode mode, bool highCq, DecoderMode dMode) { - List blocks = new(); + List blocks = []; Queue workQueue = new(); @@ -254,8 +254,8 @@ namespace ARMeilleure.Decoders } // Compare and branch instructions are always conditional. - if (opCode.Instruction.Name == InstName.Cbz || - opCode.Instruction.Name == InstName.Cbnz) + if (opCode.Instruction.Name is InstName.Cbz or + InstName.Cbnz) { return false; } @@ -274,9 +274,10 @@ namespace ARMeilleure.Decoders { if (opCode is OpCodeT32) { - return opCode.Instruction.Name != InstName.Tst && opCode.Instruction.Name != InstName.Teq && - opCode.Instruction.Name != InstName.Cmp && opCode.Instruction.Name != InstName.Cmn; + return opCode.Instruction.Name is not InstName.Tst and not InstName.Teq and + not InstName.Cmp and not InstName.Cmn; } + return true; } @@ -284,7 +285,7 @@ namespace ARMeilleure.Decoders // register (Rt == 15 or (mask & (1 << 15)) != 0), and cases where there is // a write back to PC (wback == true && Rn == 15), however the later may // be "undefined" depending on the CPU, so compilers should not produce that. - if (opCode is IOpCode32Mem || opCode is IOpCode32MemMult) + if (opCode is IOpCode32Mem or IOpCode32MemMult) { int rt, rn; @@ -326,15 +327,15 @@ namespace ARMeilleure.Decoders } // Explicit branch instructions. - return opCode is IOpCode32BImm || - opCode is IOpCode32BReg; + return opCode is IOpCode32BImm or + IOpCode32BReg; } private static bool IsCall(OpCode opCode) { - return opCode.Instruction.Name == InstName.Bl || - opCode.Instruction.Name == InstName.Blr || - opCode.Instruction.Name == InstName.Blx; + return opCode.Instruction.Name is InstName.Bl or + InstName.Blr or + InstName.Blx; } private static bool IsException(OpCode opCode) @@ -344,9 +345,9 @@ namespace ARMeilleure.Decoders private static bool IsTrap(OpCode opCode) { - return opCode.Instruction.Name == InstName.Brk || - opCode.Instruction.Name == InstName.Trap || - opCode.Instruction.Name == InstName.Und; + return opCode.Instruction.Name is InstName.Brk or + InstName.Trap or + InstName.Und; } public static OpCode DecodeOpCode(IMemoryManager memory, ulong address, ExecutionMode mode) diff --git a/src/ARMeilleure/Decoders/DecoderHelper.cs b/src/ARMeilleure/Decoders/DecoderHelper.cs index 35e573955..b0026ac91 100644 --- a/src/ARMeilleure/Decoders/DecoderHelper.cs +++ b/src/ARMeilleure/Decoders/DecoderHelper.cs @@ -1,4 +1,5 @@ using ARMeilleure.Common; +using System; namespace ARMeilleure.Decoders { @@ -149,7 +150,7 @@ namespace ARMeilleure.Decoders return (((long)opCode << 45) >> 48) & ~3; } - public static bool VectorArgumentsInvalid(bool q, params int[] args) + public static bool VectorArgumentsInvalid(bool q, params ReadOnlySpan args) { if (q) { @@ -161,6 +162,7 @@ namespace ARMeilleure.Decoders } } } + return false; } } diff --git a/src/ARMeilleure/Decoders/OpCode32SimdDupElem.cs b/src/ARMeilleure/Decoders/OpCode32SimdDupElem.cs index b6cdff088..fbb14056d 100644 --- a/src/ARMeilleure/Decoders/OpCode32SimdDupElem.cs +++ b/src/ARMeilleure/Decoders/OpCode32SimdDupElem.cs @@ -9,7 +9,7 @@ namespace ARMeilleure.Decoders public OpCode32SimdDupElem(InstDescriptor inst, ulong address, int opCode, bool isThumb) : base(inst, address, opCode, isThumb) { - var opc = (opCode >> 16) & 0xf; + int opc = (opCode >> 16) & 0xf; if ((opc & 0b1) == 1) { diff --git a/src/ARMeilleure/Decoders/OpCode32SimdDupGP.cs b/src/ARMeilleure/Decoders/OpCode32SimdDupGP.cs index 57adea5e6..9f2d6b60b 100644 --- a/src/ARMeilleure/Decoders/OpCode32SimdDupGP.cs +++ b/src/ARMeilleure/Decoders/OpCode32SimdDupGP.cs @@ -20,6 +20,7 @@ namespace ARMeilleure.Decoders Instruction = InstDescriptor.Undefined; return; } + Q = ((opCode >> 21) & 0x1) != 0; RegisterSize = Q ? RegisterSize.Simd128 : RegisterSize.Simd64; diff --git a/src/ARMeilleure/Decoders/OpCode32SimdMemPair.cs b/src/ARMeilleure/Decoders/OpCode32SimdMemPair.cs index 6a18211c6..0c4b912e7 100644 --- a/src/ARMeilleure/Decoders/OpCode32SimdMemPair.cs +++ b/src/ARMeilleure/Decoders/OpCode32SimdMemPair.cs @@ -5,12 +5,12 @@ namespace ARMeilleure.Decoders class OpCode32SimdMemPair : OpCode32, IOpCode32Simd { private static readonly int[] _regsMap = - { + [ 1, 1, 4, 2, 1, 1, 3, 1, 1, 1, 2, 1, - 1, 1, 1, 1, - }; + 1, 1, 1, 1 + ]; public int Vd { get; } public int Rn { get; } @@ -40,7 +40,7 @@ namespace ARMeilleure.Decoders Rn = (opCode >> 16) & 0xf; WBack = Rm != RegisterAlias.Aarch32Pc; - RegisterIndex = Rm != RegisterAlias.Aarch32Pc && Rm != RegisterAlias.Aarch32Sp; + RegisterIndex = Rm is not RegisterAlias.Aarch32Pc and not RegisterAlias.Aarch32Sp; Regs = _regsMap[(opCode >> 8) & 0xf]; diff --git a/src/ARMeilleure/Decoders/OpCode32SimdMemSingle.cs b/src/ARMeilleure/Decoders/OpCode32SimdMemSingle.cs index 5df45000f..203d78ffe 100644 --- a/src/ARMeilleure/Decoders/OpCode32SimdMemSingle.cs +++ b/src/ARMeilleure/Decoders/OpCode32SimdMemSingle.cs @@ -45,7 +45,7 @@ namespace ARMeilleure.Decoders Rn = (opCode >> 16) & 0xf; WBack = Rm != RegisterAlias.Aarch32Pc; - RegisterIndex = Rm != RegisterAlias.Aarch32Pc && Rm != RegisterAlias.Aarch32Sp; + RegisterIndex = Rm is not RegisterAlias.Aarch32Pc and not RegisterAlias.Aarch32Sp; } } } diff --git a/src/ARMeilleure/Decoders/OpCode32SimdMovGpElem.cs b/src/ARMeilleure/Decoders/OpCode32SimdMovGpElem.cs index f6fce7d99..3b9431da4 100644 --- a/src/ARMeilleure/Decoders/OpCode32SimdMovGpElem.cs +++ b/src/ARMeilleure/Decoders/OpCode32SimdMovGpElem.cs @@ -21,7 +21,7 @@ namespace ARMeilleure.Decoders Op = (opCode >> 20) & 0x1; U = ((opCode >> 23) & 1) != 0; - var opc = (((opCode >> 23) & 1) << 4) | (((opCode >> 21) & 0x3) << 2) | ((opCode >> 5) & 0x3); + int opc = (((opCode >> 23) & 1) << 4) | (((opCode >> 21) & 0x3) << 2) | ((opCode >> 5) & 0x3); if ((opc & 0b01000) == 0b01000) { diff --git a/src/ARMeilleure/Decoders/OpCodeAluImm.cs b/src/ARMeilleure/Decoders/OpCodeAluImm.cs index 0d2f7202f..41a12e474 100644 --- a/src/ARMeilleure/Decoders/OpCodeAluImm.cs +++ b/src/ARMeilleure/Decoders/OpCodeAluImm.cs @@ -20,7 +20,7 @@ namespace ARMeilleure.Decoders } else if (DataOp == DataOp.Logical) { - var bm = DecoderHelper.DecodeBitMask(opCode, true); + DecoderHelper.BitMask bm = DecoderHelper.DecodeBitMask(opCode, true); if (bm.IsUndefined) { diff --git a/src/ARMeilleure/Decoders/OpCodeBfm.cs b/src/ARMeilleure/Decoders/OpCodeBfm.cs index d51efade2..969c782f8 100644 --- a/src/ARMeilleure/Decoders/OpCodeBfm.cs +++ b/src/ARMeilleure/Decoders/OpCodeBfm.cs @@ -11,7 +11,7 @@ namespace ARMeilleure.Decoders public OpCodeBfm(InstDescriptor inst, ulong address, int opCode) : base(inst, address, opCode) { - var bm = DecoderHelper.DecodeBitMask(opCode, false); + DecoderHelper.BitMask bm = DecoderHelper.DecodeBitMask(opCode, false); if (bm.IsUndefined) { diff --git a/src/ARMeilleure/Decoders/OpCodeMemImm.cs b/src/ARMeilleure/Decoders/OpCodeMemImm.cs index 4d5eeb1ed..8c55116fe 100644 --- a/src/ARMeilleure/Decoders/OpCodeMemImm.cs +++ b/src/ARMeilleure/Decoders/OpCodeMemImm.cs @@ -28,8 +28,8 @@ namespace ARMeilleure.Decoders MemOp type = WBack ? (MemOp)((opCode >> 10) & 3) : MemOp.Unsigned; PostIdx = type == MemOp.PostIndexed; - Unscaled = type == MemOp.Unscaled || - type == MemOp.Unprivileged; + Unscaled = type is MemOp.Unscaled or + MemOp.Unprivileged; // Unscaled and Unprivileged doesn't write back, // but they do use the 9-bits Signed Immediate. diff --git a/src/ARMeilleure/Decoders/OpCodeT16IfThen.cs b/src/ARMeilleure/Decoders/OpCodeT16IfThen.cs index ea435a79b..2aa22a431 100644 --- a/src/ARMeilleure/Decoders/OpCodeT16IfThen.cs +++ b/src/ARMeilleure/Decoders/OpCodeT16IfThen.cs @@ -12,7 +12,7 @@ namespace ARMeilleure.Decoders public OpCodeT16IfThen(InstDescriptor inst, ulong address, int opCode) : base(inst, address, opCode) { - List conds = new(); + List conds = []; int cond = (opCode >> 4) & 0xf; int mask = opCode & 0xf; diff --git a/src/ARMeilleure/Decoders/OpCodeTable.cs b/src/ARMeilleure/Decoders/OpCodeTable.cs index 20d567fe5..d0cf9aec1 100644 --- a/src/ARMeilleure/Decoders/OpCodeTable.cs +++ b/src/ARMeilleure/Decoders/OpCodeTable.cs @@ -29,9 +29,9 @@ namespace ARMeilleure.Decoders } } - private static readonly List _allInstA32 = new(); - private static readonly List _allInstT32 = new(); - private static readonly List _allInstA64 = new(); + private static readonly List _allInstA32 = []; + private static readonly List _allInstT32 = []; + private static readonly List _allInstA64 = []; private static readonly InstInfo[][] _instA32FastLookup = new InstInfo[FastLookupSize][]; private static readonly InstInfo[][] _instT32FastLookup = new InstInfo[FastLookupSize][]; @@ -1330,7 +1330,7 @@ namespace ARMeilleure.Decoders for (int index = 0; index < temp.Length; index++) { - temp[index] = new List(); + temp[index] = []; } foreach (InstInfo inst in allInsts) @@ -1381,6 +1381,7 @@ namespace ARMeilleure.Decoders { thumbEncoding = $"1110{thumbEncoding.AsSpan(4)}"; } + SetT32(thumbEncoding, name, emitter, makeOpT32); } @@ -1409,6 +1410,7 @@ namespace ARMeilleure.Decoders { throw new ArgumentException("Invalid ASIMD instruction encoding"); } + SetT32(thumbEncoding, name, emitter, makeOpT32); } diff --git a/src/ARMeilleure/Decoders/Optimizations/TailCallRemover.cs b/src/ARMeilleure/Decoders/Optimizations/TailCallRemover.cs index 9d988f0c9..15ab3e6b8 100644 --- a/src/ARMeilleure/Decoders/Optimizations/TailCallRemover.cs +++ b/src/ARMeilleure/Decoders/Optimizations/TailCallRemover.cs @@ -69,7 +69,7 @@ namespace ARMeilleure.Decoders.Optimizations } } - var newBlocks = new List(blocks.Count); + List newBlocks = new(blocks.Count); // Finally, rebuild decoded block list, ignoring blocks outside the contiguous range. for (int i = 0; i < blocks.Count; i++) diff --git a/src/ARMeilleure/Diagnostics/IRDumper.cs b/src/ARMeilleure/Diagnostics/IRDumper.cs index 16833d085..c0397021c 100644 --- a/src/ARMeilleure/Diagnostics/IRDumper.cs +++ b/src/ARMeilleure/Diagnostics/IRDumper.cs @@ -9,7 +9,7 @@ namespace ARMeilleure.Diagnostics { class IRDumper { - private const string Indentation = " "; + private const char Indentation = ' '; private int _indentLevel; @@ -30,14 +30,11 @@ namespace ARMeilleure.Diagnostics private void Indent() { - _builder.EnsureCapacity(_builder.Capacity + _indentLevel * Indentation.Length); + if (_indentLevel == 0) + return; - for (int index = 0; index < _indentLevel; index++) - { -#pragma warning disable CA1834 // Use StringBuilder.Append(char) for single character strings - _builder.Append(Indentation); -#pragma warning restore CA1834 - } + _builder.EnsureCapacity(_builder.Capacity + _indentLevel); + _builder.Append(Indentation, _indentLevel); } private void IncreaseIndentation() @@ -141,7 +138,7 @@ namespace ARMeilleure.Diagnostics break; case OperandKind.Memory: - var memOp = operand.GetMemory(); + MemoryOperand memOp = operand.GetMemory(); _builder.Append('['); @@ -235,8 +232,8 @@ namespace ARMeilleure.Diagnostics { _builder.Append('.').Append(operation.Intrinsic); } - else if (operation.Instruction == Instruction.BranchIf || - operation.Instruction == Instruction.Compare) + else if (operation.Instruction is Instruction.BranchIf or + Instruction.Compare) { comparison = true; } @@ -262,6 +259,7 @@ namespace ARMeilleure.Diagnostics DumpOperand(source); } } + break; } @@ -285,7 +283,7 @@ namespace ARMeilleure.Diagnostics public static string GetDump(ControlFlowGraph cfg) { - var dumper = new IRDumper(1); + IRDumper dumper = new(1); for (BasicBlock block = cfg.Blocks.First; block != null; block = block.ListNext) { diff --git a/src/ARMeilleure/Diagnostics/Symbols.cs b/src/ARMeilleure/Diagnostics/Symbols.cs index be74d2b5b..c2ff06e6c 100644 --- a/src/ARMeilleure/Diagnostics/Symbols.cs +++ b/src/ARMeilleure/Diagnostics/Symbols.cs @@ -29,7 +29,7 @@ namespace ARMeilleure.Diagnostics static Symbols() { _symbols = new ConcurrentDictionary(); - _rangedSymbols = new List(); + _rangedSymbols = []; } public static string Get(ulong address) diff --git a/src/ARMeilleure/Instructions/CryptoHelper.cs b/src/ARMeilleure/Instructions/CryptoHelper.cs index ba68cebb3..046a9bb6d 100644 --- a/src/ARMeilleure/Instructions/CryptoHelper.cs +++ b/src/ARMeilleure/Instructions/CryptoHelper.cs @@ -9,8 +9,8 @@ namespace ARMeilleure.Instructions { #region "LookUp Tables" #pragma warning disable IDE1006 // Naming rule violation - private static ReadOnlySpan _sBox => new byte[] - { + private static ReadOnlySpan _sBox => + [ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, @@ -26,11 +26,11 @@ namespace ARMeilleure.Instructions 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16, - }; + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 + ]; - private static ReadOnlySpan _invSBox => new byte[] - { + private static ReadOnlySpan _invSBox => + [ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, @@ -46,11 +46,11 @@ namespace ARMeilleure.Instructions 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d, - }; + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d + ]; - private static ReadOnlySpan _gfMul02 => new byte[] - { + private static ReadOnlySpan _gfMul02 => + [ 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, @@ -66,11 +66,11 @@ namespace ARMeilleure.Instructions 0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85, 0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, 0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5, - 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5, - }; + 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5 + ]; - private static ReadOnlySpan _gfMul03 => new byte[] - { + private static ReadOnlySpan _gfMul03 => + [ 0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11, 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, @@ -86,11 +86,11 @@ namespace ARMeilleure.Instructions 0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a, 0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a, 0x3b, 0x38, 0x3d, 0x3e, 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a, - 0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a, - }; + 0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a + ]; - private static ReadOnlySpan _gfMul09 => new byte[] - { + private static ReadOnlySpan _gfMul09 => + [ 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, @@ -106,11 +106,11 @@ namespace ARMeilleure.Instructions 0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, 0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, 0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, - 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46, - }; + 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46 + ]; - private static ReadOnlySpan _gfMul0B => new byte[] - { + private static ReadOnlySpan _gfMul0B => + [ 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, 0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, @@ -126,11 +126,11 @@ namespace ARMeilleure.Instructions 0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, 0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, - 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3, - }; + 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3 + ]; - private static ReadOnlySpan _gfMul0D => new byte[] - { + private static ReadOnlySpan _gfMul0D => + [ 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, 0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, @@ -146,11 +146,11 @@ namespace ARMeilleure.Instructions 0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, 0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, - 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97, - }; + 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97 + ]; - private static ReadOnlySpan _gfMul0E => new byte[] - { + private static ReadOnlySpan _gfMul0E => + [ 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, 0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, @@ -166,18 +166,18 @@ namespace ARMeilleure.Instructions 0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, 0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, 0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, - 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d, - }; + 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d + ]; - private static ReadOnlySpan _srPerm => new byte[] - { - 0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3, - }; + private static ReadOnlySpan _srPerm => + [ + 0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3 + ]; - private static ReadOnlySpan _isrPerm => new byte[] - { - 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11, - }; + private static ReadOnlySpan _isrPerm => + [ + 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11 + ]; #pragma warning restore IDE1006 #endregion diff --git a/src/ARMeilleure/Instructions/InstEmitAlu32.cs b/src/ARMeilleure/Instructions/InstEmitAlu32.cs index 8eabe093e..d7514040c 100644 --- a/src/ARMeilleure/Instructions/InstEmitAlu32.cs +++ b/src/ARMeilleure/Instructions/InstEmitAlu32.cs @@ -415,7 +415,7 @@ namespace ARMeilleure.Instructions { IOpCode32AluBf op = (IOpCode32AluBf)context.CurrOp; - var msb = op.Lsb + op.Msb; // For this instruction, the msb is actually a width. + int msb = op.Lsb + op.Msb; // For this instruction, the msb is actually a width. Operand n = GetIntA32(context, op.Rn); Operand res = context.ShiftRightSI(context.ShiftLeft(n, Const(31 - msb)), Const(31 - op.Msb)); @@ -547,7 +547,7 @@ namespace ARMeilleure.Instructions { IOpCode32AluBf op = (IOpCode32AluBf)context.CurrOp; - var msb = op.Lsb + op.Msb; // For this instruction, the msb is actually a width. + int msb = op.Lsb + op.Msb; // For this instruction, the msb is actually a width. Operand n = GetIntA32(context, op.Rn); Operand res = context.ShiftRightUI(context.ShiftLeft(n, Const(31 - msb)), Const(31 - op.Msb)); @@ -899,6 +899,7 @@ namespace ARMeilleure.Instructions { n = context.ShiftLeft(n, Const(shift)); } + break; case ShiftType.Asr: if (shift == 32) @@ -909,6 +910,7 @@ namespace ARMeilleure.Instructions { n = context.ShiftRightSI(n, Const(shift)); } + break; } diff --git a/src/ARMeilleure/Instructions/InstEmitAluHelper.cs b/src/ARMeilleure/Instructions/InstEmitAluHelper.cs index 4d4a31f7b..fe1c66d3c 100644 --- a/src/ARMeilleure/Instructions/InstEmitAluHelper.cs +++ b/src/ARMeilleure/Instructions/InstEmitAluHelper.cs @@ -266,7 +266,7 @@ namespace ARMeilleure.Instructions } } - private static Exception InvalidOpCodeType(OpCode opCode) + private static InvalidOperationException InvalidOpCodeType(OpCode opCode) { return new InvalidOperationException($"Invalid OpCode type \"{opCode?.GetType().Name ?? "null"}\"."); } @@ -318,6 +318,7 @@ namespace ARMeilleure.Instructions { m = GetRrxC(context, m, setCarry); } + break; } } diff --git a/src/ARMeilleure/Instructions/InstEmitFlowHelper.cs b/src/ARMeilleure/Instructions/InstEmitFlowHelper.cs index a602ea49e..f67668da4 100644 --- a/src/ARMeilleure/Instructions/InstEmitFlowHelper.cs +++ b/src/ARMeilleure/Instructions/InstEmitFlowHelper.cs @@ -1,4 +1,5 @@ using ARMeilleure.CodeGen.Linking; +using ARMeilleure.Common; using ARMeilleure.Decoders; using ARMeilleure.IntermediateRepresentation; using ARMeilleure.State; @@ -193,7 +194,7 @@ namespace ARMeilleure.Instructions Operand hostAddress; - var table = context.FunctionTable; + IAddressTable table = context.FunctionTable; // If address is mapped onto the function table, we can skip the table walk. Otherwise we fallback // onto the dispatch stub. @@ -218,7 +219,7 @@ namespace ARMeilleure.Instructions for (int i = 0; i < table.Levels.Length; i++) { - var level = table.Levels[i]; + AddressTableLevel level = table.Levels[i]; int clearBits = 64 - (level.Index + level.Length); Operand index = context.ShiftLeft( diff --git a/src/ARMeilleure/Instructions/InstEmitHashHelper.cs b/src/ARMeilleure/Instructions/InstEmitHashHelper.cs index 9b1ad8721..19a607dfc 100644 --- a/src/ARMeilleure/Instructions/InstEmitHashHelper.cs +++ b/src/ARMeilleure/Instructions/InstEmitHashHelper.cs @@ -17,7 +17,7 @@ namespace ARMeilleure.Instructions public static Operand EmitCrc32(ArmEmitterContext context, Operand crc, Operand value, int size, bool castagnoli) { Debug.Assert(crc.Type.IsInteger() && value.Type.IsInteger()); - Debug.Assert(size >= 0 && size < 4); + Debug.Assert(size is >= 0 and < 4); Debug.Assert((size < 3) || (value.Type == OperandType.I64)); if (castagnoli && Optimizations.UseSse42) diff --git a/src/ARMeilleure/Instructions/InstEmitHelper.cs b/src/ARMeilleure/Instructions/InstEmitHelper.cs index 7a515f94f..a633e39ee 100644 --- a/src/ARMeilleure/Instructions/InstEmitHelper.cs +++ b/src/ARMeilleure/Instructions/InstEmitHelper.cs @@ -90,6 +90,7 @@ namespace ARMeilleure.Instructions { value = context.ConvertI64ToI32(value); } + Operand reg = Register(GetRegisterAlias(context.Mode, regIndex), RegisterType.Integer, OperandType.I32); context.Copy(reg, value); diff --git a/src/ARMeilleure/Instructions/InstEmitMemoryEx.cs b/src/ARMeilleure/Instructions/InstEmitMemoryEx.cs index 8c95b33c5..e4283e5a3 100644 --- a/src/ARMeilleure/Instructions/InstEmitMemoryEx.cs +++ b/src/ARMeilleure/Instructions/InstEmitMemoryEx.cs @@ -140,7 +140,7 @@ namespace ARMeilleure.Instructions if (pair) { - Debug.Assert(op.Size == 2 || op.Size == 3, "Invalid size for pairwise store."); + Debug.Assert(op.Size is 2 or 3, "Invalid size for pairwise store."); Operand t2 = GetIntOrZR(context, op.Rt2); diff --git a/src/ARMeilleure/Instructions/InstEmitMemoryEx32.cs b/src/ARMeilleure/Instructions/InstEmitMemoryEx32.cs index 150218827..ea9e33f26 100644 --- a/src/ARMeilleure/Instructions/InstEmitMemoryEx32.cs +++ b/src/ARMeilleure/Instructions/InstEmitMemoryEx32.cs @@ -143,8 +143,8 @@ namespace ARMeilleure.Instructions Operand address = context.Copy(GetIntA32(context, op.Rn)); - var exclusive = (accType & AccessType.Exclusive) != 0; - var ordered = (accType & AccessType.Ordered) != 0; + bool exclusive = (accType & AccessType.Exclusive) != 0; + bool ordered = (accType & AccessType.Ordered) != 0; if ((accType & AccessType.Load) != 0) { diff --git a/src/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs b/src/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs index 7fca5b853..fd2562b14 100644 --- a/src/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs +++ b/src/ARMeilleure/Instructions/InstEmitMemoryExHelper.cs @@ -42,6 +42,7 @@ namespace ARMeilleure.Instructions { context.Store(exValuePtr, Const(0UL)); } + if (size < 4) { context.Store(context.Add(exValuePtr, Const(exValuePtr.Type, 8L)), Const(0UL)); diff --git a/src/ARMeilleure/Instructions/InstEmitMemoryHelper.cs b/src/ARMeilleure/Instructions/InstEmitMemoryHelper.cs index ace6fe1ce..bb7e997b2 100644 --- a/src/ARMeilleure/Instructions/InstEmitMemoryHelper.cs +++ b/src/ARMeilleure/Instructions/InstEmitMemoryHelper.cs @@ -59,7 +59,7 @@ namespace ARMeilleure.Instructions { Operand value = GetInt(context, rt); - if (ext == Extension.Sx32 || ext == Extension.Sx64) + if (ext is Extension.Sx32 or Extension.Sx64) { OperandType destType = ext == Extension.Sx64 ? OperandType.I64 : OperandType.I32; @@ -123,9 +123,9 @@ namespace ARMeilleure.Instructions private static bool IsSimd(ArmEmitterContext context) { - return context.CurrOp is IOpCodeSimd && - !(context.CurrOp is OpCodeSimdMemMs || - context.CurrOp is OpCodeSimdMemSs); + return context.CurrOp is IOpCodeSimd and + not (OpCodeSimdMemMs or + OpCodeSimdMemSs); } public static Operand EmitReadInt(ArmEmitterContext context, Operand address, int size) @@ -717,7 +717,7 @@ namespace ARMeilleure.Instructions }; } - private static Exception InvalidOpCodeType(OpCode opCode) + private static InvalidOperationException InvalidOpCodeType(OpCode opCode) { return new InvalidOperationException($"Invalid OpCode type \"{opCode?.GetType().Name ?? "null"}\"."); } @@ -768,6 +768,7 @@ namespace ARMeilleure.Instructions { m = InstEmitAluHelper.GetRrxC(context, m, setCarry); } + break; } } diff --git a/src/ARMeilleure/Instructions/InstEmitMul.cs b/src/ARMeilleure/Instructions/InstEmitMul.cs index 89dc09938..cb48deb03 100644 --- a/src/ARMeilleure/Instructions/InstEmitMul.cs +++ b/src/ARMeilleure/Instructions/InstEmitMul.cs @@ -33,7 +33,6 @@ namespace ARMeilleure.Instructions public static void Umsubl(ArmEmitterContext context) => EmitMull(context, MullFlags.Subtract); [Flags] - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] private enum MullFlags { Subtract = 0, diff --git a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs index 13d9fac68..cee7a4ed8 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic.cs @@ -406,7 +406,7 @@ namespace ARMeilleure.Instructions { Operand res = EmitSoftFloatCall(context, nameof(SoftFloat32.FPSub), op1, op2); - return EmitUnaryMathCall(context, nameof(Math.Abs), res); + return EmitUnaryMathCall(context, nameof(MathHelper.Abs), res); }); } } @@ -451,7 +451,7 @@ namespace ARMeilleure.Instructions { Operand res = EmitSoftFloatCall(context, nameof(SoftFloat32.FPSub), op1, op2); - return EmitUnaryMathCall(context, nameof(Math.Abs), res); + return EmitUnaryMathCall(context, nameof(MathHelper.Abs), res); }); } } @@ -483,7 +483,7 @@ namespace ARMeilleure.Instructions { EmitScalarUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Abs), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1); }); } } @@ -522,7 +522,7 @@ namespace ARMeilleure.Instructions { EmitVectorUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Abs), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1); }); } } @@ -2246,7 +2246,7 @@ namespace ARMeilleure.Instructions { EmitScalarUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Floor), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1); }); } } @@ -2265,7 +2265,7 @@ namespace ARMeilleure.Instructions { EmitVectorUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Floor), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1); }); } } @@ -2322,7 +2322,7 @@ namespace ARMeilleure.Instructions { EmitScalarUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Ceiling), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1); }); } } @@ -2341,7 +2341,7 @@ namespace ARMeilleure.Instructions { EmitVectorUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Ceiling), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1); }); } } @@ -2390,7 +2390,7 @@ namespace ARMeilleure.Instructions { EmitScalarUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Truncate), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1); }); } } @@ -2409,7 +2409,7 @@ namespace ARMeilleure.Instructions { EmitVectorUnaryOpF(context, (op1) => { - return EmitUnaryMathCall(context, nameof(Math.Truncate), op1); + return EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1); }); } } @@ -5266,7 +5266,7 @@ namespace ARMeilleure.Instructions private static Operand EmitSse2Sll_128(ArmEmitterContext context, Operand op, int shift) { // The upper part of op is assumed to be zero. - Debug.Assert(shift >= 0 && shift < 64); + Debug.Assert(shift is >= 0 and < 64); if (shift == 0) { diff --git a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs index c807fc858..bcd6ce09e 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdArithmetic32.cs @@ -43,7 +43,7 @@ namespace ARMeilleure.Instructions } else { - EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Abs), op1)); + EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1)); } } @@ -66,7 +66,7 @@ namespace ARMeilleure.Instructions } else { - EmitVectorUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Abs), op1)); + EmitVectorUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Abs), op1)); } } else @@ -231,10 +231,12 @@ namespace ARMeilleure.Instructions { result |= (long)((i >= end || i < start) ? 0x80 : b++) << (i * 8); } + for (int i = 8; i < 16; i++) { result2 |= (long)((i >= end || i < start) ? 0x80 : b++) << ((i - 8) * 8); } + return (result2, result); } @@ -261,6 +263,7 @@ namespace ARMeilleure.Instructions nMaskHigh = nMaskLow + 0x0808080808080808L; mMaskHigh = mMaskLow + 0x0808080808080808L; } + nMask = X86GetElements(context, nMaskHigh, nMaskLow); mMask = X86GetElements(context, mMaskHigh, mMaskLow); Operand nPart = context.AddIntrinsic(Intrinsic.X86Pshufb, n, nMask); @@ -285,6 +288,7 @@ namespace ARMeilleure.Instructions { extract = EmitVectorExtractZx32(context, op.Qn, op.In + byteOff, op.Size); } + byteOff++; res = EmitVectorInsert(context, res, extract, op.Id + index, op.Size); @@ -1304,6 +1308,7 @@ namespace ARMeilleure.Instructions case 2: return context.AddIntrinsic(Intrinsic.X86Shufps, op1, op1, Const(1 | (0 << 2) | (3 << 4) | (2 << 6))); } + break; case 2: // Rev32 @@ -1316,6 +1321,7 @@ namespace ARMeilleure.Instructions mask = X86GetElements(context, 0x0d0c0f0e_09080b0aL, 0x05040706_01000302L); return context.AddIntrinsic(Intrinsic.X86Pshufb, op1, mask); } + break; case 1: // Rev16 @@ -1341,6 +1347,7 @@ namespace ARMeilleure.Instructions case 3: return context.ByteSwap(op1); } + break; case 1: switch (op.Size) @@ -1355,6 +1362,7 @@ namespace ARMeilleure.Instructions context.BitwiseOr(context.ShiftRightUI(context.BitwiseAnd(op1, Const(0x0000ffff00000000ul)), Const(16)), context.ShiftLeft(context.BitwiseAnd(op1, Const(0x00000000ffff0000ul)), Const(16)))); } + break; case 2: // Swap upper and lower halves. diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs b/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs index aab677869..8fcb06286 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdCmp.cs @@ -726,8 +726,8 @@ namespace ARMeilleure.Instructions if (absolute) { - ne = EmitUnaryMathCall(context, nameof(Math.Abs), ne); - me = EmitUnaryMathCall(context, nameof(Math.Abs), me); + ne = EmitUnaryMathCall(context, nameof(MathHelper.Abs), ne); + me = EmitUnaryMathCall(context, nameof(MathHelper.Abs), me); } Operand e = EmitSoftFloatCall(context, name, ne, me); diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCmp32.cs b/src/ARMeilleure/Instructions/InstEmitSimdCmp32.cs index 1d68bce6b..6ec2b58f9 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdCmp32.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdCmp32.cs @@ -229,7 +229,7 @@ namespace ARMeilleure.Instructions private static Operand ZerosOrOnes(ArmEmitterContext context, Operand fromBool, OperandType baseType) { - var ones = (baseType == OperandType.I64) ? Const(-1L) : Const(-1); + Operand ones = (baseType == OperandType.I64) ? Const(-1L) : Const(-1); return context.ConditionalSelect(fromBool, ones, Const(baseType, 0L)); } diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs b/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs index 3363a7c77..cf427eeae 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdCvt.cs @@ -333,7 +333,7 @@ namespace ARMeilleure.Instructions } else { - EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1)); + EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1)); } } @@ -349,7 +349,7 @@ namespace ARMeilleure.Instructions } else { - EmitFcvt(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1), signed: true, scalar: false); + EmitFcvt(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1), signed: true, scalar: false); } } @@ -365,7 +365,7 @@ namespace ARMeilleure.Instructions } else { - EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Floor), op1)); + EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), op1)); } } @@ -538,7 +538,7 @@ namespace ARMeilleure.Instructions } else { - EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Ceiling), op1)); + EmitFcvt_s_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1)); } } @@ -554,7 +554,7 @@ namespace ARMeilleure.Instructions } else { - EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Ceiling), op1)); + EmitFcvt_u_Gp(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op1)); } } @@ -1119,7 +1119,7 @@ namespace ARMeilleure.Instructions private static Operand EmitFPConvert(ArmEmitterContext context, Operand value, int size, bool signed) { - Debug.Assert(value.Type == OperandType.I32 || value.Type == OperandType.I64); + Debug.Assert(value.Type is OperandType.I32 or OperandType.I64); Debug.Assert((uint)size < 2); OperandType type = size == 0 ? OperandType.FP32 : OperandType.FP64; @@ -1136,7 +1136,7 @@ namespace ARMeilleure.Instructions private static Operand EmitScalarFcvts(ArmEmitterContext context, Operand value, int fBits) { - Debug.Assert(value.Type == OperandType.FP32 || value.Type == OperandType.FP64); + Debug.Assert(value.Type is OperandType.FP32 or OperandType.FP64); value = EmitF2iFBitsMul(context, value, fBits); @@ -1160,7 +1160,7 @@ namespace ARMeilleure.Instructions private static Operand EmitScalarFcvtu(ArmEmitterContext context, Operand value, int fBits) { - Debug.Assert(value.Type == OperandType.FP32 || value.Type == OperandType.FP64); + Debug.Assert(value.Type is OperandType.FP32 or OperandType.FP64); value = EmitF2iFBitsMul(context, value, fBits); @@ -1184,7 +1184,7 @@ namespace ARMeilleure.Instructions private static Operand EmitF2iFBitsMul(ArmEmitterContext context, Operand value, int fBits) { - Debug.Assert(value.Type == OperandType.FP32 || value.Type == OperandType.FP64); + Debug.Assert(value.Type is OperandType.FP32 or OperandType.FP64); if (fBits == 0) { @@ -1203,7 +1203,7 @@ namespace ARMeilleure.Instructions private static Operand EmitI2fFBitsMul(ArmEmitterContext context, Operand value, int fBits) { - Debug.Assert(value.Type == OperandType.FP32 || value.Type == OperandType.FP64); + Debug.Assert(value.Type is OperandType.FP32 or OperandType.FP64); if (fBits == 0) { diff --git a/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs b/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs index 8eef6b14d..f93552977 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdCvt32.cs @@ -118,15 +118,15 @@ namespace ARMeilleure.Instructions { OpCode32SimdCvtFFixed op = (OpCode32SimdCvtFFixed)context.CurrOp; - var toFixed = op.Opc == 1; + bool toFixed = op.Opc == 1; int fracBits = op.Fbits; - var unsigned = op.U; + bool unsigned = op.U; if (toFixed) // F32 to S32 or U32 (fixed) { EmitVectorUnaryOpF32(context, (op1) => { - var scaledValue = context.Multiply(op1, ConstF(MathF.Pow(2f, fracBits))); + Operand scaledValue = context.Multiply(op1, ConstF(MathF.Pow(2f, fracBits))); MethodInfo info = unsigned ? typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU32)) : typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS32)); return context.Call(info, scaledValue); @@ -136,7 +136,7 @@ namespace ARMeilleure.Instructions { EmitVectorUnaryOpI32(context, (op1) => { - var floatValue = unsigned ? context.ConvertToFPUI(OperandType.FP32, op1) : context.ConvertToFP(OperandType.FP32, op1); + Operand floatValue = unsigned ? context.ConvertToFPUI(OperandType.FP32, op1) : context.ConvertToFP(OperandType.FP32, op1); return context.Multiply(floatValue, ConstF(1f / MathF.Pow(2f, fracBits))); }, !unsigned); @@ -245,8 +245,8 @@ namespace ARMeilleure.Instructions string name = nameof(Math.Round); MethodInfo info = (op.Size & 1) == 0 - ? typeof(MathF).GetMethod(name, new Type[] { typeof(float), typeof(MidpointRounding) }) - : typeof(Math).GetMethod(name, new Type[] { typeof(double), typeof(MidpointRounding) }); + ? typeof(MathF).GetMethod(name, [typeof(float), typeof(MidpointRounding)]) + : typeof(Math).GetMethod(name, [typeof(double), typeof(MidpointRounding)]); return context.Call(info, n, Const((int)roundMode)); } @@ -357,10 +357,10 @@ namespace ARMeilleure.Instructions toConvert = EmitRoundMathCall(context, MidpointRounding.ToEven, toConvert); break; case 0b10: // Towards positive infinity - toConvert = EmitUnaryMathCall(context, nameof(Math.Ceiling), toConvert); + toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), toConvert); break; case 0b11: // Towards negative infinity - toConvert = EmitUnaryMathCall(context, nameof(Math.Floor), toConvert); + toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Floor), toConvert); break; } @@ -385,6 +385,7 @@ namespace ARMeilleure.Instructions { res = context.AddIntrinsic(Intrinsic.X86Cvtsd2ss, context.VectorZero(), res); } + res = context.AddIntrinsic(Intrinsic.X86Vcvtps2ph, res, Const(X86GetRoundControl(FPRoundingMode.ToNearest))); res = context.VectorExtract16(res, 0); InsertScalar16(context, op.Vd, op.T, res); @@ -397,6 +398,7 @@ namespace ARMeilleure.Instructions { res = context.AddIntrinsic(Intrinsic.X86Cvtss2sd, context.VectorZero(), res); } + res = context.VectorExtract(op.Size == 1 ? OperandType.I64 : OperandType.I32, res, 0); InsertScalar(context, op.Vd, res); } @@ -494,10 +496,10 @@ namespace ARMeilleure.Instructions toConvert = EmitRoundMathCall(context, MidpointRounding.ToEven, toConvert); break; case 0b10: // Towards positive infinity - toConvert = EmitUnaryMathCall(context, nameof(Math.Ceiling), toConvert); + toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), toConvert); break; case 0b11: // Towards negative infinity - toConvert = EmitUnaryMathCall(context, nameof(Math.Floor), toConvert); + toConvert = EmitUnaryMathCall(context, nameof(MathHelper.Floor), toConvert); break; } @@ -534,7 +536,7 @@ namespace ARMeilleure.Instructions } else { - EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(Math.Floor), m)); + EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(MathHelper.Floor), m)); } } @@ -574,7 +576,7 @@ namespace ARMeilleure.Instructions } else { - EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(Math.Ceiling), m)); + EmitVectorUnaryOpF32(context, (m) => EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), m)); } } @@ -613,7 +615,7 @@ namespace ARMeilleure.Instructions } else { - EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(Math.Truncate), op1)); + EmitScalarUnaryOpF32(context, (op1) => EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op1)); } } @@ -635,7 +637,7 @@ namespace ARMeilleure.Instructions private static Operand EmitFPConvert(ArmEmitterContext context, Operand value, OperandType type, bool signed) { - Debug.Assert(value.Type == OperandType.I32 || value.Type == OperandType.I64); + Debug.Assert(value.Type is OperandType.I32 or OperandType.I64); if (signed) { diff --git a/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs b/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs index abd0d9acc..11d0c93b4 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdHelper.cs @@ -18,19 +18,19 @@ namespace ARMeilleure.Instructions static class InstEmitSimdHelper { #region "Masks" - public static readonly long[] EvenMasks = new long[] - { + public static readonly long[] EvenMasks = + [ 14L << 56 | 12L << 48 | 10L << 40 | 08L << 32 | 06L << 24 | 04L << 16 | 02L << 8 | 00L << 0, // B 13L << 56 | 12L << 48 | 09L << 40 | 08L << 32 | 05L << 24 | 04L << 16 | 01L << 8 | 00L << 0, // H - 11L << 56 | 10L << 48 | 09L << 40 | 08L << 32 | 03L << 24 | 02L << 16 | 01L << 8 | 00L << 0, // S - }; + 11L << 56 | 10L << 48 | 09L << 40 | 08L << 32 | 03L << 24 | 02L << 16 | 01L << 8 | 00L << 0 // S + ]; - public static readonly long[] OddMasks = new long[] - { + public static readonly long[] OddMasks = + [ 15L << 56 | 13L << 48 | 11L << 40 | 09L << 32 | 07L << 24 | 05L << 16 | 03L << 8 | 01L << 0, // B 15L << 56 | 14L << 48 | 11L << 40 | 10L << 32 | 07L << 24 | 06L << 16 | 03L << 8 | 02L << 0, // H - 15L << 56 | 14L << 48 | 13L << 40 | 12L << 32 | 07L << 24 | 06L << 16 | 05L << 8 | 04L << 0, // S - }; + 15L << 56 | 14L << 48 | 13L << 40 | 12L << 32 | 07L << 24 | 06L << 16 | 05L << 8 | 04L << 0 // S + ]; public const long ZeroMask = 128L << 56 | 128L << 48 | 128L << 40 | 128L << 32 | 128L << 24 | 128L << 16 | 128L << 8 | 128L << 0; @@ -44,118 +44,118 @@ namespace ARMeilleure.Instructions #endregion #region "X86 SSE Intrinsics" - public static readonly Intrinsic[] X86PaddInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PaddInstruction = + [ Intrinsic.X86Paddb, Intrinsic.X86Paddw, Intrinsic.X86Paddd, - Intrinsic.X86Paddq, - }; + Intrinsic.X86Paddq + ]; - public static readonly Intrinsic[] X86PcmpeqInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PcmpeqInstruction = + [ Intrinsic.X86Pcmpeqb, Intrinsic.X86Pcmpeqw, Intrinsic.X86Pcmpeqd, - Intrinsic.X86Pcmpeqq, - }; + Intrinsic.X86Pcmpeqq + ]; - public static readonly Intrinsic[] X86PcmpgtInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PcmpgtInstruction = + [ Intrinsic.X86Pcmpgtb, Intrinsic.X86Pcmpgtw, Intrinsic.X86Pcmpgtd, - Intrinsic.X86Pcmpgtq, - }; + Intrinsic.X86Pcmpgtq + ]; - public static readonly Intrinsic[] X86PmaxsInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PmaxsInstruction = + [ Intrinsic.X86Pmaxsb, Intrinsic.X86Pmaxsw, - Intrinsic.X86Pmaxsd, - }; + Intrinsic.X86Pmaxsd + ]; - public static readonly Intrinsic[] X86PmaxuInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PmaxuInstruction = + [ Intrinsic.X86Pmaxub, Intrinsic.X86Pmaxuw, - Intrinsic.X86Pmaxud, - }; + Intrinsic.X86Pmaxud + ]; - public static readonly Intrinsic[] X86PminsInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PminsInstruction = + [ Intrinsic.X86Pminsb, Intrinsic.X86Pminsw, - Intrinsic.X86Pminsd, - }; + Intrinsic.X86Pminsd + ]; - public static readonly Intrinsic[] X86PminuInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PminuInstruction = + [ Intrinsic.X86Pminub, Intrinsic.X86Pminuw, - Intrinsic.X86Pminud, - }; + Intrinsic.X86Pminud + ]; - public static readonly Intrinsic[] X86PmovsxInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PmovsxInstruction = + [ Intrinsic.X86Pmovsxbw, Intrinsic.X86Pmovsxwd, - Intrinsic.X86Pmovsxdq, - }; + Intrinsic.X86Pmovsxdq + ]; - public static readonly Intrinsic[] X86PmovzxInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PmovzxInstruction = + [ Intrinsic.X86Pmovzxbw, Intrinsic.X86Pmovzxwd, - Intrinsic.X86Pmovzxdq, - }; + Intrinsic.X86Pmovzxdq + ]; - public static readonly Intrinsic[] X86PsllInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PsllInstruction = + [ 0, Intrinsic.X86Psllw, Intrinsic.X86Pslld, - Intrinsic.X86Psllq, - }; + Intrinsic.X86Psllq + ]; - public static readonly Intrinsic[] X86PsraInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PsraInstruction = + [ 0, Intrinsic.X86Psraw, - Intrinsic.X86Psrad, - }; + Intrinsic.X86Psrad + ]; - public static readonly Intrinsic[] X86PsrlInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PsrlInstruction = + [ 0, Intrinsic.X86Psrlw, Intrinsic.X86Psrld, - Intrinsic.X86Psrlq, - }; + Intrinsic.X86Psrlq + ]; - public static readonly Intrinsic[] X86PsubInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PsubInstruction = + [ Intrinsic.X86Psubb, Intrinsic.X86Psubw, Intrinsic.X86Psubd, - Intrinsic.X86Psubq, - }; + Intrinsic.X86Psubq + ]; - public static readonly Intrinsic[] X86PunpckhInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PunpckhInstruction = + [ Intrinsic.X86Punpckhbw, Intrinsic.X86Punpckhwd, Intrinsic.X86Punpckhdq, - Intrinsic.X86Punpckhqdq, - }; + Intrinsic.X86Punpckhqdq + ]; - public static readonly Intrinsic[] X86PunpcklInstruction = new Intrinsic[] - { + public static readonly Intrinsic[] X86PunpcklInstruction = + [ Intrinsic.X86Punpcklbw, Intrinsic.X86Punpcklwd, Intrinsic.X86Punpckldq, - Intrinsic.X86Punpcklqdq, - }; + Intrinsic.X86Punpcklqdq + ]; #endregion public static void EnterArmFpMode(EmitterContext context, Func getFpFlag) @@ -363,7 +363,7 @@ namespace ARMeilleure.Instructions public static Operand EmitCountSetBits8(ArmEmitterContext context, Operand op) // "size" is 8 (SIMD&FP Inst.). { - Debug.Assert(op.Type == OperandType.I32 || op.Type == OperandType.I64); + Debug.Assert(op.Type is OperandType.I32 or OperandType.I64); Operand op0 = context.Subtract(op, context.BitwiseAnd(context.ShiftRightUI(op, Const(1)), Const(op.Type, 0x55L))); @@ -460,8 +460,8 @@ namespace ARMeilleure.Instructions IOpCodeSimd op = (IOpCodeSimd)context.CurrOp; MethodInfo info = (op.Size & 1) == 0 - ? typeof(MathF).GetMethod(name, new Type[] { typeof(float) }) - : typeof(Math).GetMethod(name, new Type[] { typeof(double) }); + ? typeof(MathHelperF).GetMethod(name, [typeof(float)]) + : typeof(MathHelper).GetMethod(name, [typeof(double)]); return context.Call(info, n); } @@ -470,11 +470,11 @@ namespace ARMeilleure.Instructions { IOpCodeSimd op = (IOpCodeSimd)context.CurrOp; - string name = nameof(Math.Round); + string name = nameof(MathHelper.Round); MethodInfo info = (op.Size & 1) == 0 - ? typeof(MathF).GetMethod(name, new Type[] { typeof(float), typeof(MidpointRounding) }) - : typeof(Math).GetMethod(name, new Type[] { typeof(double), typeof(MidpointRounding) }); + ? typeof(MathHelperF).GetMethod(name, [typeof(float), typeof(int)]) + : typeof(MathHelper).GetMethod(name, [typeof(double), typeof(int)]); return context.Call(info, n, Const((int)roundMode)); } @@ -489,7 +489,7 @@ namespace ARMeilleure.Instructions public static Operand EmitRoundByRMode(ArmEmitterContext context, Operand op) { - Debug.Assert(op.Type == OperandType.FP32 || op.Type == OperandType.FP64); + Debug.Assert(op.Type is OperandType.FP32 or OperandType.FP64); Operand lbl1 = Label(); Operand lbl2 = Label(); @@ -510,16 +510,16 @@ namespace ARMeilleure.Instructions context.MarkLabel(lbl1); context.BranchIf(lbl2, rMode, rP, Comparison.NotEqual); - context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Ceiling), op)); + context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Ceiling), op)); context.Branch(lblEnd); context.MarkLabel(lbl2); context.BranchIf(lbl3, rMode, rM, Comparison.NotEqual); - context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Floor), op)); + context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Floor), op)); context.Branch(lblEnd); context.MarkLabel(lbl3); - context.Copy(res, EmitUnaryMathCall(context, nameof(Math.Truncate), op)); + context.Copy(res, EmitUnaryMathCall(context, nameof(MathHelper.Truncate), op)); context.Branch(lblEnd); context.MarkLabel(lblEnd); @@ -1676,7 +1676,7 @@ namespace ARMeilleure.Instructions int eSize = 8 << size; Debug.Assert(op.Type == OperandType.I64); - Debug.Assert(eSize == 8 || eSize == 16 || eSize == 32 || eSize == 64); + Debug.Assert(eSize is 8 or 16 or 32 or 64); Operand lbl1 = Label(); Operand lblEnd = Label(); @@ -1709,7 +1709,7 @@ namespace ARMeilleure.Instructions int eSize = 8 << size; Debug.Assert(op.Type == OperandType.I64); - Debug.Assert(eSize == 8 || eSize == 16 || eSize == 32 || eSize == 64); + Debug.Assert(eSize is 8 or 16 or 32 or 64); Operand lblEnd = Label(); @@ -1735,7 +1735,7 @@ namespace ARMeilleure.Instructions int eSizeDst = 8 << sizeDst; Debug.Assert(op.Type == OperandType.I64); - Debug.Assert(eSizeDst == 8 || eSizeDst == 16 || eSizeDst == 32); + Debug.Assert(eSizeDst is 8 or 16 or 32); Operand lbl1 = Label(); Operand lblEnd = Label(); @@ -1768,7 +1768,7 @@ namespace ARMeilleure.Instructions int eSizeDst = 8 << sizeDst; Debug.Assert(op.Type == OperandType.I64); - Debug.Assert(eSizeDst == 8 || eSizeDst == 16 || eSizeDst == 32); + Debug.Assert(eSizeDst is 8 or 16 or 32); Operand lblEnd = Label(); diff --git a/src/ARMeilleure/Instructions/InstEmitSimdHelper32.cs b/src/ARMeilleure/Instructions/InstEmitSimdHelper32.cs index 2f021a1a1..c053fe27b 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdHelper32.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdHelper32.cs @@ -31,7 +31,7 @@ namespace ARMeilleure.Instructions { Debug.Assert(type != OperandType.V128); - if (type == OperandType.FP64 || type == OperandType.I64) + if (type is OperandType.FP64 or OperandType.I64) { // From dreg. return context.VectorExtract(type, GetVecA32(reg >> 1), reg & 1); @@ -48,7 +48,7 @@ namespace ARMeilleure.Instructions Debug.Assert(value.Type != OperandType.V128); Operand vec, insert; - if (value.Type == OperandType.FP64 || value.Type == OperandType.I64) + if (value.Type is OperandType.FP64 or OperandType.I64) { // From dreg. vec = GetVecA32(reg >> 1); @@ -71,7 +71,7 @@ namespace ARMeilleure.Instructions public static void InsertScalar16(ArmEmitterContext context, int reg, bool top, Operand value) { - Debug.Assert(value.Type == OperandType.FP32 || value.Type == OperandType.I32); + Debug.Assert(value.Type is OperandType.FP32 or OperandType.I32); Operand vec, insert; vec = GetVecA32(reg >> 2); @@ -880,6 +880,7 @@ namespace ARMeilleure.Instructions { res = EmitMoveDoubleWordToSide(context, res, side, op.Vd); } + res = EmitDoubleWordInsert(context, d, res, op.Vd); } diff --git a/src/ARMeilleure/Instructions/InstEmitSimdHelper32Arm64.cs b/src/ARMeilleure/Instructions/InstEmitSimdHelper32Arm64.cs index 568c07122..a1ca417b4 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdHelper32Arm64.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdHelper32Arm64.cs @@ -146,6 +146,7 @@ namespace ARMeilleure.Instructions { res = EmitMoveDoubleWordToSide(context, res, side, op.Vd); } + res = EmitDoubleWordInsert(context, d, res, op.Vd); } diff --git a/src/ARMeilleure/Instructions/InstEmitSimdLogical32.cs b/src/ARMeilleure/Instructions/InstEmitSimdLogical32.cs index 26d093447..1b0ef341b 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdLogical32.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdLogical32.cs @@ -268,6 +268,7 @@ namespace ARMeilleure.Instructions { m = context.BitwiseNot(m); } + return context.BitwiseExclusiveOr( context.BitwiseAnd(m, context.BitwiseExclusiveOr(d, n)), d); diff --git a/src/ARMeilleure/Instructions/InstEmitSimdMemory32.cs b/src/ARMeilleure/Instructions/InstEmitSimdMemory32.cs index 35c6dd328..4d39b5fde 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdMemory32.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdMemory32.cs @@ -87,7 +87,7 @@ namespace ARMeilleure.Instructions { if (op.Replicate) { - var regs = (count > 1) ? 1 : op.Increment; + int regs = (count > 1) ? 1 : op.Increment; for (int reg = 0; reg < regs; reg++) { int dreg = reg + d; @@ -110,6 +110,7 @@ namespace ARMeilleure.Instructions EmitStoreSimd(context, address, d >> 1, index, op.Size); } } + offset += eBytes; d += op.Increment; } diff --git a/src/ARMeilleure/Instructions/InstEmitSimdMove.cs b/src/ARMeilleure/Instructions/InstEmitSimdMove.cs index 85c98fe3a..8b243d498 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdMove.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdMove.cs @@ -12,17 +12,17 @@ namespace ARMeilleure.Instructions static partial class InstEmit { #region "Masks" - private static readonly long[] _masksE0_Uzp = new long[] - { + private static readonly long[] _masksE0_Uzp = + [ 13L << 56 | 09L << 48 | 05L << 40 | 01L << 32 | 12L << 24 | 08L << 16 | 04L << 8 | 00L << 0, - 11L << 56 | 10L << 48 | 03L << 40 | 02L << 32 | 09L << 24 | 08L << 16 | 01L << 8 | 00L << 0, - }; + 11L << 56 | 10L << 48 | 03L << 40 | 02L << 32 | 09L << 24 | 08L << 16 | 01L << 8 | 00L << 0 + ]; - private static readonly long[] _masksE1_Uzp = new long[] - { + private static readonly long[] _masksE1_Uzp = + [ 15L << 56 | 11L << 48 | 07L << 40 | 03L << 32 | 14L << 24 | 10L << 16 | 06L << 8 | 02L << 0, - 15L << 56 | 14L << 48 | 07L << 40 | 06L << 32 | 13L << 24 | 12L << 16 | 05L << 8 | 04L << 0, - }; + 15L << 56 | 14L << 48 | 07L << 40 | 06L << 32 | 13L << 24 | 12L << 16 | 05L << 8 | 04L << 0 + ]; #endregion public static void Dup_Gp(ArmEmitterContext context) @@ -601,7 +601,7 @@ namespace ARMeilleure.Instructions { Operand d = GetVec(op.Rd); - List args = new(); + List args = []; if (!isTbl) { diff --git a/src/ARMeilleure/Instructions/InstEmitSimdMove32.cs b/src/ARMeilleure/Instructions/InstEmitSimdMove32.cs index fb2641f66..3e869bcff 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdMove32.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdMove32.cs @@ -13,17 +13,17 @@ namespace ARMeilleure.Instructions { #region "Masks" // Same as InstEmitSimdMove, as the instructions do the same thing. - private static readonly long[] _masksE0_Uzp = new long[] - { + private static readonly long[] _masksE0_Uzp = + [ 13L << 56 | 09L << 48 | 05L << 40 | 01L << 32 | 12L << 24 | 08L << 16 | 04L << 8 | 00L << 0, - 11L << 56 | 10L << 48 | 03L << 40 | 02L << 32 | 09L << 24 | 08L << 16 | 01L << 8 | 00L << 0, - }; + 11L << 56 | 10L << 48 | 03L << 40 | 02L << 32 | 09L << 24 | 08L << 16 | 01L << 8 | 00L << 0 + ]; - private static readonly long[] _masksE1_Uzp = new long[] - { + private static readonly long[] _masksE1_Uzp = + [ 15L << 56 | 11L << 48 | 07L << 40 | 03L << 32 | 14L << 24 | 10L << 16 | 06L << 8 | 02L << 0, - 15L << 56 | 14L << 48 | 07L << 40 | 06L << 32 | 13L << 24 | 12L << 16 | 05L << 8 | 04L << 0, - }; + 15L << 56 | 14L << 48 | 07L << 40 | 06L << 32 | 13L << 24 | 12L << 16 | 05L << 8 | 04L << 0 + ]; #endregion public static void Vmov_I(ArmEmitterContext context) diff --git a/src/ARMeilleure/Instructions/InstEmitSimdShift.cs b/src/ARMeilleure/Instructions/InstEmitSimdShift.cs index 94e912579..3469434c0 100644 --- a/src/ARMeilleure/Instructions/InstEmitSimdShift.cs +++ b/src/ARMeilleure/Instructions/InstEmitSimdShift.cs @@ -17,10 +17,10 @@ namespace ARMeilleure.Instructions static partial class InstEmit { #region "Masks" - private static readonly long[] _masks_SliSri = new long[] // Replication masks. - { - 0x0101010101010101L, 0x0001000100010001L, 0x0000000100000001L, 0x0000000000000001L, - }; + private static readonly long[] _masks_SliSri = + [ + 0x0101010101010101L, 0x0001000100010001L, 0x0000000100000001L, 0x0000000000000001L + ]; #endregion public static void Rshrn_V(ArmEmitterContext context) @@ -1634,7 +1634,7 @@ namespace ARMeilleure.Instructions int eSize = 8 << size; Debug.Assert(op.Type == OperandType.I64); - Debug.Assert(eSize == 8 || eSize == 16 || eSize == 32 || eSize == 64); + Debug.Assert(eSize is 8 or 16 or 32 or 64); Operand res = context.AllocateLocal(OperandType.I64); @@ -1657,7 +1657,7 @@ namespace ARMeilleure.Instructions int eSize = 8 << size; Debug.Assert(op.Type == OperandType.I64); - Debug.Assert(eSize == 8 || eSize == 16 || eSize == 32 || eSize == 64); + Debug.Assert(eSize is 8 or 16 or 32 or 64); Operand lblEnd = Label(); @@ -1732,7 +1732,7 @@ namespace ARMeilleure.Instructions Debug.Assert(op.Type == OperandType.I64); Debug.Assert(shiftLsB.Type == OperandType.I32); - Debug.Assert(eSize == 8 || eSize == 16 || eSize == 32 || eSize == 64); + Debug.Assert(eSize is 8 or 16 or 32 or 64); Operand lbl1 = Label(); Operand lblEnd = Label(); @@ -1769,7 +1769,7 @@ namespace ARMeilleure.Instructions Debug.Assert(op.Type == OperandType.I64); Debug.Assert(shiftLsB.Type == OperandType.I32); - Debug.Assert(eSize == 8 || eSize == 16 || eSize == 32 || eSize == 64); + Debug.Assert(eSize is 8 or 16 or 32 or 64); Operand lbl1 = Label(); Operand lbl2 = Label(); @@ -1813,6 +1813,7 @@ namespace ARMeilleure.Instructions ? EmitSignedSrcSatQ(context, shl, size, signedDst: true) : EmitUnsignedSrcSatQ(context, shl, size, signedDst: false)); } + context.Branch(lblEnd); context.MarkLabel(lblEnd); @@ -1850,6 +1851,7 @@ namespace ARMeilleure.Instructions { context.Copy(res, sar); } + context.Branch(lblEnd); context.MarkLabel(lblEnd); @@ -1906,6 +1908,7 @@ namespace ARMeilleure.Instructions Operand right = context.BitwiseOr(shr, context.ShiftRightUI(oneShl63UL, context.Subtract(shift, one))); context.Copy(res, context.ConditionalSelect(isEqual, oneUL, right)); } + context.Branch(lblEnd); context.MarkLabel(lblEnd); diff --git a/src/ARMeilleure/Instructions/MathHelper.cs b/src/ARMeilleure/Instructions/MathHelper.cs new file mode 100644 index 000000000..a11ce9d2e --- /dev/null +++ b/src/ARMeilleure/Instructions/MathHelper.cs @@ -0,0 +1,71 @@ +using System; +using System.Runtime.InteropServices; + +namespace ARMeilleure.Instructions +{ + static class MathHelper + { + [UnmanagedCallersOnly] + public static double Abs(double value) + { + return Math.Abs(value); + } + + [UnmanagedCallersOnly] + public static double Ceiling(double value) + { + return Math.Ceiling(value); + } + + [UnmanagedCallersOnly] + public static double Floor(double value) + { + return Math.Floor(value); + } + + [UnmanagedCallersOnly] + public static double Round(double value, int mode) + { + return Math.Round(value, (MidpointRounding)mode); + } + + [UnmanagedCallersOnly] + public static double Truncate(double value) + { + return Math.Truncate(value); + } + } + + static class MathHelperF + { + [UnmanagedCallersOnly] + public static float Abs(float value) + { + return MathF.Abs(value); + } + + [UnmanagedCallersOnly] + public static float Ceiling(float value) + { + return MathF.Ceiling(value); + } + + [UnmanagedCallersOnly] + public static float Floor(float value) + { + return MathF.Floor(value); + } + + [UnmanagedCallersOnly] + public static float Round(float value, int mode) + { + return MathF.Round(value, (MidpointRounding)mode); + } + + [UnmanagedCallersOnly] + public static float Truncate(float value) + { + return MathF.Truncate(value); + } + } +} diff --git a/src/ARMeilleure/Instructions/NativeInterface.cs b/src/ARMeilleure/Instructions/NativeInterface.cs index 0cd3754f7..b4922629b 100644 --- a/src/ARMeilleure/Instructions/NativeInterface.cs +++ b/src/ARMeilleure/Instructions/NativeInterface.cs @@ -2,6 +2,7 @@ using ARMeilleure.Memory; using ARMeilleure.State; using ARMeilleure.Translation; using System; +using System.Runtime.InteropServices; namespace ARMeilleure.Instructions { @@ -34,6 +35,7 @@ namespace ARMeilleure.Instructions Context = null; } + [UnmanagedCallersOnly] public static void Break(ulong address, int imm) { Statistics.PauseTimer(); @@ -43,6 +45,7 @@ namespace ARMeilleure.Instructions Statistics.ResumeTimer(); } + [UnmanagedCallersOnly] public static void SupervisorCall(ulong address, int imm) { Statistics.PauseTimer(); @@ -52,6 +55,7 @@ namespace ARMeilleure.Instructions Statistics.ResumeTimer(); } + [UnmanagedCallersOnly] public static void Undefined(ulong address, int opCode) { Statistics.PauseTimer(); @@ -62,26 +66,31 @@ namespace ARMeilleure.Instructions } #region "System registers" + [UnmanagedCallersOnly] public static ulong GetCtrEl0() { - return GetContext().CtrEl0; + return ExecutionContext.CtrEl0; } + [UnmanagedCallersOnly] public static ulong GetDczidEl0() { - return GetContext().DczidEl0; + return ExecutionContext.DczidEl0; } + [UnmanagedCallersOnly] public static ulong GetCntfrqEl0() { return GetContext().CntfrqEl0; } + [UnmanagedCallersOnly] public static ulong GetCntpctEl0() { return GetContext().CntpctEl0; } + [UnmanagedCallersOnly] public static ulong GetCntvctEl0() { return GetContext().CntvctEl0; @@ -89,26 +98,31 @@ namespace ARMeilleure.Instructions #endregion #region "Read" + [UnmanagedCallersOnly] public static byte ReadByte(ulong address) { return GetMemoryManager().ReadGuest(address); } + [UnmanagedCallersOnly] public static ushort ReadUInt16(ulong address) { return GetMemoryManager().ReadGuest(address); } + [UnmanagedCallersOnly] public static uint ReadUInt32(ulong address) { return GetMemoryManager().ReadGuest(address); } + [UnmanagedCallersOnly] public static ulong ReadUInt64(ulong address) { return GetMemoryManager().ReadGuest(address); } + [UnmanagedCallersOnly] public static V128 ReadVector128(ulong address) { return GetMemoryManager().ReadGuest(address); @@ -116,47 +130,56 @@ namespace ARMeilleure.Instructions #endregion #region "Write" + [UnmanagedCallersOnly] public static void WriteByte(ulong address, byte value) { GetMemoryManager().WriteGuest(address, value); } + [UnmanagedCallersOnly] public static void WriteUInt16(ulong address, ushort value) { GetMemoryManager().WriteGuest(address, value); } + [UnmanagedCallersOnly] public static void WriteUInt32(ulong address, uint value) { GetMemoryManager().WriteGuest(address, value); } + [UnmanagedCallersOnly] public static void WriteUInt64(ulong address, ulong value) { GetMemoryManager().WriteGuest(address, value); } + [UnmanagedCallersOnly] public static void WriteVector128(ulong address, V128 value) { GetMemoryManager().WriteGuest(address, value); } #endregion + [UnmanagedCallersOnly] public static void EnqueueForRejit(ulong address) { Context.Translator.EnqueueForRejit(address, GetContext().ExecutionMode); } - public static void SignalMemoryTracking(ulong address, ulong size, bool write) + [UnmanagedCallersOnly] + public static void SignalMemoryTracking(ulong address, ulong size, byte write) { - GetMemoryManager().SignalMemoryTracking(address, size, write); + GetMemoryManager().SignalMemoryTracking(address, size, write == 1); } + [UnmanagedCallersOnly] public static void ThrowInvalidMemoryAccess(ulong address) { throw new InvalidAccessException(address); } + [UnmanagedCallersOnly] public static ulong GetFunctionAddress(ulong address) { TranslatedFunction function = Context.Translator.GetOrTranslate(address, GetContext().ExecutionMode); @@ -164,12 +187,14 @@ namespace ARMeilleure.Instructions return (ulong)function.FuncPointer.ToInt64(); } + [UnmanagedCallersOnly] public static void InvalidateCacheLine(ulong address) { Context.Translator.InvalidateJitCacheRegion(address, InstEmit.DczSizeInBytes); } - public static bool CheckSynchronization() + [UnmanagedCallersOnly] + public static byte CheckSynchronization() { Statistics.PauseTimer(); @@ -179,7 +204,7 @@ namespace ARMeilleure.Instructions Statistics.ResumeTimer(); - return context.Running; + return (byte)(context.Running ? 1 : 0); } public static ExecutionContext GetContext() diff --git a/src/ARMeilleure/Instructions/SoftFallback.cs b/src/ARMeilleure/Instructions/SoftFallback.cs index c4fe677bf..c227156e5 100644 --- a/src/ARMeilleure/Instructions/SoftFallback.cs +++ b/src/ARMeilleure/Instructions/SoftFallback.cs @@ -1,11 +1,13 @@ using ARMeilleure.State; using System; +using System.Runtime.InteropServices; namespace ARMeilleure.Instructions { static class SoftFallback { #region "ShrImm64" + [UnmanagedCallersOnly] public static long SignedShrImm64(long value, long roundConst, int shift) { if (roundConst == 0L) @@ -48,6 +50,7 @@ namespace ARMeilleure.Instructions } } + [UnmanagedCallersOnly] public static ulong UnsignedShrImm64(ulong value, long roundConst, int shift) { if (roundConst == 0L) @@ -92,6 +95,7 @@ namespace ARMeilleure.Instructions #endregion #region "Saturation" + [UnmanagedCallersOnly] public static int SatF32ToS32(float value) { if (float.IsNaN(value)) @@ -103,6 +107,7 @@ namespace ARMeilleure.Instructions value <= int.MinValue ? int.MinValue : (int)value; } + [UnmanagedCallersOnly] public static long SatF32ToS64(float value) { if (float.IsNaN(value)) @@ -114,6 +119,7 @@ namespace ARMeilleure.Instructions value <= long.MinValue ? long.MinValue : (long)value; } + [UnmanagedCallersOnly] public static uint SatF32ToU32(float value) { if (float.IsNaN(value)) @@ -125,6 +131,7 @@ namespace ARMeilleure.Instructions value <= uint.MinValue ? uint.MinValue : (uint)value; } + [UnmanagedCallersOnly] public static ulong SatF32ToU64(float value) { if (float.IsNaN(value)) @@ -136,6 +143,7 @@ namespace ARMeilleure.Instructions value <= ulong.MinValue ? ulong.MinValue : (ulong)value; } + [UnmanagedCallersOnly] public static int SatF64ToS32(double value) { if (double.IsNaN(value)) @@ -147,6 +155,7 @@ namespace ARMeilleure.Instructions value <= int.MinValue ? int.MinValue : (int)value; } + [UnmanagedCallersOnly] public static long SatF64ToS64(double value) { if (double.IsNaN(value)) @@ -158,6 +167,7 @@ namespace ARMeilleure.Instructions value <= long.MinValue ? long.MinValue : (long)value; } + [UnmanagedCallersOnly] public static uint SatF64ToU32(double value) { if (double.IsNaN(value)) @@ -169,6 +179,7 @@ namespace ARMeilleure.Instructions value <= uint.MinValue ? uint.MinValue : (uint)value; } + [UnmanagedCallersOnly] public static ulong SatF64ToU64(double value) { if (double.IsNaN(value)) @@ -182,6 +193,7 @@ namespace ARMeilleure.Instructions #endregion #region "Count" + [UnmanagedCallersOnly] public static ulong CountLeadingSigns(ulong value, int size) // size is 8, 16, 32 or 64 (SIMD&FP or Base Inst.). { value ^= value >> 1; @@ -199,8 +211,9 @@ namespace ARMeilleure.Instructions return (ulong)(size - 1); } - private static ReadOnlySpan ClzNibbleTbl => new byte[] { 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; + private static ReadOnlySpan ClzNibbleTbl => [4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]; + [UnmanagedCallersOnly] public static ulong CountLeadingZeros(ulong value, int size) // size is 8, 16, 32 or 64 (SIMD&FP or Base Inst.). { if (value == 0ul) @@ -224,47 +237,55 @@ namespace ARMeilleure.Instructions #endregion #region "Table" + [UnmanagedCallersOnly] public static V128 Tbl1(V128 vector, int bytes, V128 tb0) { return TblOrTbx(default, vector, bytes, tb0); } + [UnmanagedCallersOnly] public static V128 Tbl2(V128 vector, int bytes, V128 tb0, V128 tb1) { return TblOrTbx(default, vector, bytes, tb0, tb1); } + [UnmanagedCallersOnly] public static V128 Tbl3(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2) { return TblOrTbx(default, vector, bytes, tb0, tb1, tb2); } + [UnmanagedCallersOnly] public static V128 Tbl4(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3) { return TblOrTbx(default, vector, bytes, tb0, tb1, tb2, tb3); } + [UnmanagedCallersOnly] public static V128 Tbx1(V128 dest, V128 vector, int bytes, V128 tb0) { return TblOrTbx(dest, vector, bytes, tb0); } + [UnmanagedCallersOnly] public static V128 Tbx2(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1) { return TblOrTbx(dest, vector, bytes, tb0, tb1); } + [UnmanagedCallersOnly] public static V128 Tbx3(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2) { return TblOrTbx(dest, vector, bytes, tb0, tb1, tb2); } + [UnmanagedCallersOnly] public static V128 Tbx4(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3) { return TblOrTbx(dest, vector, bytes, tb0, tb1, tb2, tb3); } - private static V128 TblOrTbx(V128 dest, V128 vector, int bytes, params V128[] tb) + private static V128 TblOrTbx(V128 dest, V128 vector, int bytes, params ReadOnlySpan tb) { byte[] res = new byte[16]; @@ -300,14 +321,22 @@ namespace ARMeilleure.Instructions private const uint Crc32RevPoly = 0xedb88320; private const uint Crc32cRevPoly = 0x82f63b78; + [UnmanagedCallersOnly] public static uint Crc32b(uint crc, byte value) => Crc32(crc, Crc32RevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32h(uint crc, ushort value) => Crc32h(crc, Crc32RevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32w(uint crc, uint value) => Crc32w(crc, Crc32RevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32x(uint crc, ulong value) => Crc32x(crc, Crc32RevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32cb(uint crc, byte value) => Crc32(crc, Crc32cRevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32ch(uint crc, ushort value) => Crc32h(crc, Crc32cRevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32cw(uint crc, uint value) => Crc32w(crc, Crc32cRevPoly, value); + [UnmanagedCallersOnly] public static uint Crc32cx(uint crc, ulong value) => Crc32x(crc, Crc32cRevPoly, value); private static uint Crc32h(uint crc, uint poly, ushort val) @@ -358,21 +387,25 @@ namespace ARMeilleure.Instructions #endregion #region "Aes" + [UnmanagedCallersOnly] public static V128 Decrypt(V128 value, V128 roundKey) { return CryptoHelper.AesInvSubBytes(CryptoHelper.AesInvShiftRows(value ^ roundKey)); } + [UnmanagedCallersOnly] public static V128 Encrypt(V128 value, V128 roundKey) { return CryptoHelper.AesSubBytes(CryptoHelper.AesShiftRows(value ^ roundKey)); } + [UnmanagedCallersOnly] public static V128 InverseMixColumns(V128 value) { return CryptoHelper.AesInvMixColumns(value); } + [UnmanagedCallersOnly] public static V128 MixColumns(V128 value) { return CryptoHelper.AesMixColumns(value); @@ -380,6 +413,7 @@ namespace ARMeilleure.Instructions #endregion #region "Sha1" + [UnmanagedCallersOnly] public static V128 HashChoose(V128 hash_abcd, uint hash_e, V128 wk) { for (int e = 0; e <= 3; e++) @@ -400,11 +434,13 @@ namespace ARMeilleure.Instructions return hash_abcd; } + [UnmanagedCallersOnly] public static uint FixedRotate(uint hash_e) { return hash_e.Rol(30); } + [UnmanagedCallersOnly] public static V128 HashMajority(V128 hash_abcd, uint hash_e, V128 wk) { for (int e = 0; e <= 3; e++) @@ -425,6 +461,7 @@ namespace ARMeilleure.Instructions return hash_abcd; } + [UnmanagedCallersOnly] public static V128 HashParity(V128 hash_abcd, uint hash_e, V128 wk) { for (int e = 0; e <= 3; e++) @@ -445,6 +482,7 @@ namespace ARMeilleure.Instructions return hash_abcd; } + [UnmanagedCallersOnly] public static V128 Sha1SchedulePart1(V128 w0_3, V128 w4_7, V128 w8_11) { ulong t2 = w4_7.Extract(0); @@ -455,6 +493,7 @@ namespace ARMeilleure.Instructions return result ^ (w0_3 ^ w8_11); } + [UnmanagedCallersOnly] public static V128 Sha1SchedulePart2(V128 tw0_3, V128 w12_15) { V128 t = tw0_3 ^ (w12_15 >> 32); @@ -499,16 +538,19 @@ namespace ARMeilleure.Instructions #endregion #region "Sha256" + [UnmanagedCallersOnly] public static V128 HashLower(V128 hash_abcd, V128 hash_efgh, V128 wk) { return Sha256Hash(hash_abcd, hash_efgh, wk, part1: true); } + [UnmanagedCallersOnly] public static V128 HashUpper(V128 hash_abcd, V128 hash_efgh, V128 wk) { return Sha256Hash(hash_abcd, hash_efgh, wk, part1: false); } + [UnmanagedCallersOnly] public static V128 Sha256SchedulePart1(V128 w0_3, V128 w4_7) { V128 result = new(); @@ -527,6 +569,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static V128 Sha256SchedulePart2(V128 w0_3, V128 w8_11, V128 w12_15) { V128 result = new(); @@ -628,6 +671,7 @@ namespace ARMeilleure.Instructions } #endregion + [UnmanagedCallersOnly] public static V128 PolynomialMult64_128(ulong op1, ulong op2) { V128 result = V128.Zero; diff --git a/src/ARMeilleure/Instructions/SoftFloat.cs b/src/ARMeilleure/Instructions/SoftFloat.cs index a67349e6e..ccc45cc64 100644 --- a/src/ARMeilleure/Instructions/SoftFloat.cs +++ b/src/ARMeilleure/Instructions/SoftFloat.cs @@ -1,6 +1,7 @@ using ARMeilleure.State; using System; using System.Diagnostics; +using System.Runtime.InteropServices; namespace ARMeilleure.Instructions { @@ -23,7 +24,7 @@ namespace ARMeilleure.Instructions { uint src = (uint)idx + 256u; - Debug.Assert(256u <= src && src < 512u); + Debug.Assert(src is >= 256u and < 512u); src = (src << 1) + 1u; @@ -31,7 +32,7 @@ namespace ARMeilleure.Instructions uint dst = (aux + 1u) >> 1; - Debug.Assert(256u <= dst && dst < 512u); + Debug.Assert(dst is >= 256u and < 512u); tbl[idx] = (byte)(dst - 256u); } @@ -47,7 +48,7 @@ namespace ARMeilleure.Instructions { uint src = (uint)idx + 128u; - Debug.Assert(128u <= src && src < 512u); + Debug.Assert(src is >= 128u and < 512u); if (src < 256u) { @@ -68,7 +69,7 @@ namespace ARMeilleure.Instructions uint dst = (aux + 1u) >> 1; - Debug.Assert(256u <= dst && dst < 512u); + Debug.Assert(dst is >= 256u and < 512u); tbl[idx] = (byte)(dst - 256u); } @@ -312,6 +313,7 @@ namespace ARMeilleure.Instructions static class SoftFloat16_32 { + [UnmanagedCallersOnly] public static float FPConvert(ushort valueBits) { ExecutionContext context = NativeInterface.GetContext(); @@ -320,7 +322,7 @@ namespace ARMeilleure.Instructions float result; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { if ((context.Fpcr & FPCR.Dn) != 0) { @@ -487,6 +489,7 @@ namespace ARMeilleure.Instructions static class SoftFloat16_64 { + [UnmanagedCallersOnly] public static double FPConvert(ushort valueBits) { ExecutionContext context = NativeInterface.GetContext(); @@ -495,7 +498,7 @@ namespace ARMeilleure.Instructions double result; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { if ((context.Fpcr & FPCR.Dn) != 0) { @@ -662,6 +665,7 @@ namespace ARMeilleure.Instructions static class SoftFloat32_16 { + [UnmanagedCallersOnly] public static ushort FPConvert(float value) { ExecutionContext context = NativeInterface.GetContext(); @@ -672,7 +676,7 @@ namespace ARMeilleure.Instructions ushort resultBits; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { if (altHp) { @@ -781,12 +785,19 @@ namespace ARMeilleure.Instructions static class SoftFloat32 { + [UnmanagedCallersOnly] public static float FPAdd(float value1, float value2) { - return FPAddFpscr(value1, value2, false); + return FPAddFpscrImpl(value1, value2, false); } - public static float FPAddFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPAddFpscr(float value1, float value2, byte standardFpscr) + { + return FPAddFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPAddFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -837,7 +848,8 @@ namespace ARMeilleure.Instructions return result; } - public static int FPCompare(float value1, float value2, bool signalNaNs) + [UnmanagedCallersOnly] + public static int FPCompare(float value1, float value2, byte signalNaNs) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = context.Fpcr; @@ -851,7 +863,7 @@ namespace ARMeilleure.Instructions { result = 0b0011; - if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs) + if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs == 1) { SoftFloat.FPProcessException(FPException.InvalidOp, context, fpcr); } @@ -875,12 +887,13 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPCompareEQ(float value1, float value2) { - return FPCompareEQFpscr(value1, value2, false); + return FPCompareEQFpscrImpl(value1, value2, false); } - public static float FPCompareEQFpscr(float value1, float value2, bool standardFpscr) + private static float FPCompareEQFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -907,12 +920,25 @@ namespace ARMeilleure.Instructions return result; } - public static float FPCompareGE(float value1, float value2) + [UnmanagedCallersOnly] + public static float FPCompareEQFpscr(float value1, float value2, byte standardFpscr) { - return FPCompareGEFpscr(value1, value2, false); + return FPCompareEQFpscrImpl(value1, value2, standardFpscr == 1); } - public static float FPCompareGEFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPCompareGE(float value1, float value2) + { + return FPCompareGEFpscrImpl(value1, value2, false); + } + + [UnmanagedCallersOnly] + public static float FPCompareGEFpscr(float value1, float value2, byte standardFpscr) + { + return FPCompareGEFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPCompareGEFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -936,12 +962,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPCompareGT(float value1, float value2) { - return FPCompareGTFpscr(value1, value2, false); + return FPCompareGTFpscrImpl(value1, value2, false); } - public static float FPCompareGTFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPCompareGTFpscr(float value1, float value2, byte standardFpscr) + { + return FPCompareGTFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPCompareGTFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -965,26 +998,31 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPCompareLE(float value1, float value2) { - return FPCompareGE(value2, value1); + return FPCompareGEFpscrImpl(value2, value1, false); } + [UnmanagedCallersOnly] public static float FPCompareLT(float value1, float value2) { - return FPCompareGT(value2, value1); + return FPCompareGTFpscrImpl(value2, value1, false); } - public static float FPCompareLEFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPCompareLEFpscr(float value1, float value2, byte standardFpscr) { - return FPCompareGEFpscr(value2, value1, standardFpscr); + return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1); } - public static float FPCompareLTFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPCompareLTFpscr(float value1, float value2, byte standardFpscr) { - return FPCompareGTFpscr(value2, value1, standardFpscr); + return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1); } + [UnmanagedCallersOnly] public static float FPDiv(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1037,12 +1075,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPMax(float value1, float value2) { - return FPMaxFpscr(value1, value2, false); + return FPMaxFpscrImpl(value1, value2, false); } - public static float FPMaxFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMaxFpscr(float value1, float value2, byte standardFpscr) + { + return FPMaxFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPMaxFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1103,12 +1148,13 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPMaxNum(float value1, float value2) { - return FPMaxNumFpscr(value1, value2, false); + return FPMaxNumFpscrImpl(value1, value2, false); } - public static float FPMaxNumFpscr(float value1, float value2, bool standardFpscr) + private static float FPMaxNumFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1125,15 +1171,28 @@ namespace ARMeilleure.Instructions value2 = FPInfinity(true); } - return FPMaxFpscr(value1, value2, standardFpscr); + return FPMaxFpscrImpl(value1, value2, standardFpscr); } + [UnmanagedCallersOnly] + public static float FPMaxNumFpscr(float value1, float value2, byte standardFpscr) + { + return FPMaxNumFpscrImpl(value1, value2, standardFpscr == 1); + } + + [UnmanagedCallersOnly] public static float FPMin(float value1, float value2) { - return FPMinFpscr(value1, value2, false); + return FPMinFpscrImpl(value1, value2, false); } - public static float FPMinFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMinFpscr(float value1, float value2, byte standardFpscr) + { + return FPMinFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPMinFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1194,12 +1253,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPMinNum(float value1, float value2) { - return FPMinNumFpscr(value1, value2, false); + return FPMinNumFpscrImpl(value1, value2, false); } - public static float FPMinNumFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMinNumFpscr(float value1, float value2, byte standardFpscr) + { + return FPMinNumFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPMinNumFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1216,15 +1282,22 @@ namespace ARMeilleure.Instructions value2 = FPInfinity(false); } - return FPMinFpscr(value1, value2, standardFpscr); + return FPMinFpscrImpl(value1, value2, standardFpscr); } + [UnmanagedCallersOnly] public static float FPMul(float value1, float value2) { - return FPMulFpscr(value1, value2, false); + return FPMulFpscrImpl(value1, value2, false); } - public static float FPMulFpscr(float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMulFpscr(float value1, float value2, byte standardFpscr) + { + return FPMulFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static float FPMulFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1271,12 +1344,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPMulAdd(float valueA, float value1, float value2) { - return FPMulAddFpscr(valueA, value1, value2, false); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } - public static float FPMulAddFpscr(float valueA, float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMulAddFpscr(float valueA, float value1, float value2, byte standardFpscr) + { + return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1); + } + + private static float FPMulAddFpscrImpl(float valueA, float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1342,20 +1422,23 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPMulSub(float valueA, float value1, float value2) { value1 = value1.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } - public static float FPMulSubFpscr(float valueA, float value1, float value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPMulSubFpscr(float valueA, float value1, float value2, byte standardFpscr) { value1 = value1.FPNeg(); - return FPMulAddFpscr(valueA, value1, value2, standardFpscr); + return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1); } + [UnmanagedCallersOnly] public static float FPMulX(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1401,27 +1484,36 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPNegMulAdd(float valueA, float value1, float value2) { valueA = valueA.FPNeg(); value1 = value1.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } + [UnmanagedCallersOnly] public static float FPNegMulSub(float valueA, float value1, float value2) { valueA = valueA.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } + [UnmanagedCallersOnly] public static float FPRecipEstimate(float value) { - return FPRecipEstimateFpscr(value, false); + return FPRecipEstimateFpscrImpl(value, false); } - public static float FPRecipEstimateFpscr(float value, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPRecipEstimateFpscr(float value, byte standardFpscr) + { + return FPRecipEstimateFpscrImpl(value, standardFpscr == 1); + } + + private static float FPRecipEstimateFpscrImpl(float value, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1430,7 +1522,7 @@ namespace ARMeilleure.Instructions float result; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { result = FPProcessNaN(type, op, context, fpcr); } @@ -1446,7 +1538,7 @@ namespace ARMeilleure.Instructions } else if (MathF.Abs(value) < MathF.Pow(2f, -128)) { - var overflowToInf = fpcr.GetRoundingMode() switch + bool overflowToInf = fpcr.GetRoundingMode() switch { FPRoundingMode.ToNearest => true, FPRoundingMode.TowardsPlusInfinity => !sign, @@ -1508,6 +1600,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPRecipStep(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1533,15 +1626,16 @@ namespace ARMeilleure.Instructions } else { - product = FPMulFpscr(value1, value2, true); + product = FPMulFpscrImpl(value1, value2, true); } - result = FPSubFpscr(FPTwo(false), product, true); + result = FPSubFpscrImpl(FPTwo(false), product, true); } return result; } + [UnmanagedCallersOnly] public static float FPRecipStepFused(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1585,6 +1679,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPRecpX(float value) { ExecutionContext context = NativeInterface.GetContext(); @@ -1594,7 +1689,7 @@ namespace ARMeilleure.Instructions float result; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { result = FPProcessNaN(type, op, context, fpcr); } @@ -1610,12 +1705,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPRSqrtEstimate(float value) { - return FPRSqrtEstimateFpscr(value, false); + return FPRSqrtEstimateFpscrImpl(value, false); } - public static float FPRSqrtEstimateFpscr(float value, bool standardFpscr) + [UnmanagedCallersOnly] + public static float FPRSqrtEstimateFpscr(float value, byte standardFpscr) + { + return FPRSqrtEstimateFpscrImpl(value, standardFpscr == 1); + } + + private static float FPRSqrtEstimateFpscrImpl(float value, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -1624,7 +1726,7 @@ namespace ARMeilleure.Instructions float result; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { result = FPProcessNaN(type, op, context, fpcr); } @@ -1729,6 +1831,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPRSqrtStep(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1754,7 +1857,7 @@ namespace ARMeilleure.Instructions } else { - product = FPMulFpscr(value1, value2, true); + product = FPMulFpscrImpl(value1, value2, true); } result = FPHalvedSub(FPThree(false), product, context, fpcr); @@ -1763,6 +1866,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPRSqrtStepFused(float value1, float value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -1806,6 +1910,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPSqrt(float value) { ExecutionContext context = NativeInterface.GetContext(); @@ -1815,7 +1920,7 @@ namespace ARMeilleure.Instructions float result; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { result = FPProcessNaN(type, op, context, fpcr); } @@ -1848,12 +1953,13 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static float FPSub(float value1, float value2) { - return FPSubFpscr(value1, value2, false); + return FPSubFpscrImpl(value1, value2, false); } - public static float FPSubFpscr(float value1, float value2, bool standardFpscr) + private static float FPSubFpscrImpl(float value1, float value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2094,6 +2200,7 @@ namespace ARMeilleure.Instructions static class SoftFloat64_16 { + [UnmanagedCallersOnly] public static ushort FPConvert(double value) { ExecutionContext context = NativeInterface.GetContext(); @@ -2104,7 +2211,7 @@ namespace ARMeilleure.Instructions ushort resultBits; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { if (altHp) { @@ -2213,12 +2320,19 @@ namespace ARMeilleure.Instructions static class SoftFloat64 { + [UnmanagedCallersOnly] public static double FPAdd(double value1, double value2) { - return FPAddFpscr(value1, value2, false); + return FPAddFpscrImpl(value1, value2, false); } - public static double FPAddFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPAddFpscr(double value1, double value2, byte standardFpscr) + { + return FPAddFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPAddFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2269,7 +2383,8 @@ namespace ARMeilleure.Instructions return result; } - public static int FPCompare(double value1, double value2, bool signalNaNs) + [UnmanagedCallersOnly] + public static int FPCompare(double value1, double value2, byte signalNaNs) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = context.Fpcr; @@ -2283,7 +2398,7 @@ namespace ARMeilleure.Instructions { result = 0b0011; - if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs) + if (type1 == FPType.SNaN || type2 == FPType.SNaN || signalNaNs == 1) { SoftFloat.FPProcessException(FPException.InvalidOp, context, fpcr); } @@ -2307,12 +2422,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPCompareEQ(double value1, double value2) { - return FPCompareEQFpscr(value1, value2, false); + return FPCompareEQFpscrImpl(value1, value2, false); } - public static double FPCompareEQFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPCompareEQFpscr(double value1, double value2, byte standardFpscr) + { + return FPCompareEQFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPCompareEQFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2339,12 +2461,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPCompareGE(double value1, double value2) { - return FPCompareGEFpscr(value1, value2, false); + return FPCompareGEFpscrImpl(value1, value2, false); } - public static double FPCompareGEFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPCompareGEFpscr(double value1, double value2, byte standardFpscr) + { + return FPCompareGEFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPCompareGEFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2368,12 +2497,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPCompareGT(double value1, double value2) { - return FPCompareGTFpscr(value1, value2, false); + return FPCompareGTFpscrImpl(value1, value2, false); } - public static double FPCompareGTFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPCompareGTFpscr(double value1, double value2, byte standardFpscr) + { + return FPCompareGTFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPCompareGTFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2397,26 +2533,31 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPCompareLE(double value1, double value2) { - return FPCompareGE(value2, value1); + return FPCompareGEFpscrImpl(value2, value1, false); } + [UnmanagedCallersOnly] public static double FPCompareLT(double value1, double value2) { - return FPCompareGT(value2, value1); + return FPCompareGTFpscrImpl(value2, value1, false); } - public static double FPCompareLEFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPCompareLEFpscr(double value1, double value2, byte standardFpscr) { - return FPCompareGEFpscr(value2, value1, standardFpscr); + return FPCompareGEFpscrImpl(value2, value1, standardFpscr == 1); } - public static double FPCompareLTFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPCompareLTFpscr(double value1, double value2, byte standardFpscr) { - return FPCompareGTFpscr(value2, value1, standardFpscr); + return FPCompareGTFpscrImpl(value2, value1, standardFpscr == 1); } + [UnmanagedCallersOnly] public static double FPDiv(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -2469,12 +2610,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPMax(double value1, double value2) { - return FPMaxFpscr(value1, value2, false); + return FPMaxFpscrImpl(value1, value2, false); } - public static double FPMaxFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMaxFpscr(double value1, double value2, byte standardFpscr) + { + return FPMaxFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPMaxFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2535,12 +2683,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPMaxNum(double value1, double value2) { - return FPMaxNumFpscr(value1, value2, false); + return FPMaxNumFpscrImpl(value1, value2, false); } - public static double FPMaxNumFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMaxNumFpscr(double value1, double value2, byte standardFpscr) + { + return FPMaxNumFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPMaxNumFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2557,15 +2712,22 @@ namespace ARMeilleure.Instructions value2 = FPInfinity(true); } - return FPMaxFpscr(value1, value2, standardFpscr); + return FPMaxFpscrImpl(value1, value2, standardFpscr); } + [UnmanagedCallersOnly] public static double FPMin(double value1, double value2) { - return FPMinFpscr(value1, value2, false); + return FPMinFpscrImpl(value1, value2, false); } - public static double FPMinFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMinFpscr(double value1, double value2, byte standardFpscr) + { + return FPMinFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPMinFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2626,12 +2788,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPMinNum(double value1, double value2) { - return FPMinNumFpscr(value1, value2, false); + return FPMinNumFpscrImpl(value1, value2, false); } - public static double FPMinNumFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMinNumFpscr(double value1, double value2, byte standardFpscr) + { + return FPMinNumFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPMinNumFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2648,15 +2817,22 @@ namespace ARMeilleure.Instructions value2 = FPInfinity(false); } - return FPMinFpscr(value1, value2, standardFpscr); + return FPMinFpscrImpl(value1, value2, standardFpscr); } + [UnmanagedCallersOnly] public static double FPMul(double value1, double value2) { - return FPMulFpscr(value1, value2, false); + return FPMulFpscrImpl(value1, value2, false); } - public static double FPMulFpscr(double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMulFpscr(double value1, double value2, byte standardFpscr) + { + return FPMulFpscrImpl(value1, value2, standardFpscr == 1); + } + + private static double FPMulFpscrImpl(double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2703,12 +2879,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPMulAdd(double valueA, double value1, double value2) { - return FPMulAddFpscr(valueA, value1, value2, false); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } - public static double FPMulAddFpscr(double valueA, double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMulAddFpscr(double valueA, double value1, double value2, byte standardFpscr) + { + return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1); + } + + private static double FPMulAddFpscrImpl(double valueA, double value1, double value2, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2774,20 +2957,23 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPMulSub(double valueA, double value1, double value2) { value1 = value1.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } - public static double FPMulSubFpscr(double valueA, double value1, double value2, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPMulSubFpscr(double valueA, double value1, double value2, byte standardFpscr) { value1 = value1.FPNeg(); - return FPMulAddFpscr(valueA, value1, value2, standardFpscr); + return FPMulAddFpscrImpl(valueA, value1, value2, standardFpscr == 1); } + [UnmanagedCallersOnly] public static double FPMulX(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -2833,27 +3019,36 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPNegMulAdd(double valueA, double value1, double value2) { valueA = valueA.FPNeg(); value1 = value1.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } + [UnmanagedCallersOnly] public static double FPNegMulSub(double valueA, double value1, double value2) { valueA = valueA.FPNeg(); - return FPMulAdd(valueA, value1, value2); + return FPMulAddFpscrImpl(valueA, value1, value2, false); } + [UnmanagedCallersOnly] public static double FPRecipEstimate(double value) { - return FPRecipEstimateFpscr(value, false); + return FPRecipEstimateFpscrImpl(value, false); } - public static double FPRecipEstimateFpscr(double value, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPRecipEstimateFpscr(double value, byte standardFpscr) + { + return FPRecipEstimateFpscrImpl(value, standardFpscr == 1); + } + + private static double FPRecipEstimateFpscrImpl(double value, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -2862,7 +3057,7 @@ namespace ARMeilleure.Instructions double result; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { result = FPProcessNaN(type, op, context, fpcr); } @@ -2878,7 +3073,7 @@ namespace ARMeilleure.Instructions } else if (Math.Abs(value) < Math.Pow(2d, -1024)) { - var overflowToInf = fpcr.GetRoundingMode() switch + bool overflowToInf = fpcr.GetRoundingMode() switch { FPRoundingMode.ToNearest => true, FPRoundingMode.TowardsPlusInfinity => !sign, @@ -2940,6 +3135,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRecipStep(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -2965,7 +3161,7 @@ namespace ARMeilleure.Instructions } else { - product = FPMulFpscr(value1, value2, true); + product = FPMulFpscrImpl(value1, value2, true); } result = FPSubFpscr(FPTwo(false), product, true); @@ -2974,6 +3170,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRecipStepFused(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -3017,6 +3214,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRecpX(double value) { ExecutionContext context = NativeInterface.GetContext(); @@ -3026,7 +3224,7 @@ namespace ARMeilleure.Instructions double result; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { result = FPProcessNaN(type, op, context, fpcr); } @@ -3042,12 +3240,19 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRSqrtEstimate(double value) { - return FPRSqrtEstimateFpscr(value, false); + return FPRSqrtEstimateFpscrImpl(value, false); } - public static double FPRSqrtEstimateFpscr(double value, bool standardFpscr) + [UnmanagedCallersOnly] + public static double FPRSqrtEstimateFpscr(double value, byte standardFpscr) + { + return FPRSqrtEstimateFpscrImpl(value, standardFpscr == 1); + } + + private static double FPRSqrtEstimateFpscrImpl(double value, bool standardFpscr) { ExecutionContext context = NativeInterface.GetContext(); FPCR fpcr = standardFpscr ? context.StandardFpcrValue : context.Fpcr; @@ -3056,7 +3261,7 @@ namespace ARMeilleure.Instructions double result; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { result = FPProcessNaN(type, op, context, fpcr); } @@ -3161,6 +3366,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRSqrtStep(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -3186,7 +3392,7 @@ namespace ARMeilleure.Instructions } else { - product = FPMulFpscr(value1, value2, true); + product = FPMulFpscrImpl(value1, value2, true); } result = FPHalvedSub(FPThree(false), product, context, fpcr); @@ -3195,6 +3401,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPRSqrtStepFused(double value1, double value2) { ExecutionContext context = NativeInterface.GetContext(); @@ -3238,6 +3445,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPSqrt(double value) { ExecutionContext context = NativeInterface.GetContext(); @@ -3247,7 +3455,7 @@ namespace ARMeilleure.Instructions double result; - if (type == FPType.SNaN || type == FPType.QNaN) + if (type is FPType.SNaN or FPType.QNaN) { result = FPProcessNaN(type, op, context, fpcr); } @@ -3280,6 +3488,7 @@ namespace ARMeilleure.Instructions return result; } + [UnmanagedCallersOnly] public static double FPSub(double value1, double value2) { return FPSubFpscr(value1, value2, false); diff --git a/src/ARMeilleure/IntermediateRepresentation/BasicBlock.cs b/src/ARMeilleure/IntermediateRepresentation/BasicBlock.cs index 810461d7c..c0548f4cb 100644 --- a/src/ARMeilleure/IntermediateRepresentation/BasicBlock.cs +++ b/src/ARMeilleure/IntermediateRepresentation/BasicBlock.cs @@ -27,7 +27,7 @@ namespace ARMeilleure.IntermediateRepresentation { get { - _domFrontiers ??= new HashSet(); + _domFrontiers ??= []; return _domFrontiers; } @@ -38,7 +38,7 @@ namespace ARMeilleure.IntermediateRepresentation public BasicBlock(int index) { Operations = new IntrusiveList(); - Predecessors = new List(); + Predecessors = []; Index = index; } diff --git a/src/ARMeilleure/IntermediateRepresentation/Intrinsic.cs b/src/ARMeilleure/IntermediateRepresentation/Intrinsic.cs index b9cab6674..9d87c13b3 100644 --- a/src/ARMeilleure/IntermediateRepresentation/Intrinsic.cs +++ b/src/ARMeilleure/IntermediateRepresentation/Intrinsic.cs @@ -4,7 +4,6 @@ using System.Diagnostics.CodeAnalysis; namespace ARMeilleure.IntermediateRepresentation { [Flags] - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum Intrinsic : ushort { // X86 (SSE and AVX) diff --git a/src/ARMeilleure/IntermediateRepresentation/MemoryOperand.cs b/src/ARMeilleure/IntermediateRepresentation/MemoryOperand.cs index 45695396f..d22c89a75 100644 --- a/src/ARMeilleure/IntermediateRepresentation/MemoryOperand.cs +++ b/src/ARMeilleure/IntermediateRepresentation/MemoryOperand.cs @@ -1,4 +1,3 @@ -using System; using System.Diagnostics; using System.Runtime.CompilerServices; diff --git a/src/ARMeilleure/IntermediateRepresentation/Operand.cs b/src/ARMeilleure/IntermediateRepresentation/Operand.cs index 89aefacb1..2b3545004 100644 --- a/src/ARMeilleure/IntermediateRepresentation/Operand.cs +++ b/src/ARMeilleure/IntermediateRepresentation/Operand.cs @@ -304,7 +304,7 @@ namespace ARMeilleure.IntermediateRepresentation ushort newCount = checked((ushort)(count + 1)); ushort newCapacity = (ushort)Math.Min(capacity * 2, ushort.MaxValue); - var oldSpan = new Span(data, count); + Span oldSpan = new(data, count); capacity = newCapacity; data = Allocators.References.Allocate(capacity); @@ -338,7 +338,7 @@ namespace ARMeilleure.IntermediateRepresentation throw new OverflowException(); } - var oldSpan = new Span(data, (int)count); + Span oldSpan = new(data, (int)count); capacity = newCapacity; data = Allocators.References.Allocate(capacity); @@ -352,7 +352,7 @@ namespace ARMeilleure.IntermediateRepresentation private static void Remove(in T item, ref T* data, ref ushort count) where T : unmanaged { - var span = new Span(data, count); + Span span = new(data, count); for (int i = 0; i < span.Length; i++) { @@ -372,7 +372,7 @@ namespace ARMeilleure.IntermediateRepresentation private static void Remove(in T item, ref T* data, ref uint count) where T : unmanaged { - var span = new Span(data, (int)count); + Span span = new(data, (int)count); for (int i = 0; i < span.Length; i++) { @@ -446,7 +446,7 @@ namespace ARMeilleure.IntermediateRepresentation Data* data = null; // If constant or register, then try to look up in the intern table before allocating. - if (kind == OperandKind.Constant || kind == OperandKind.Register) + if (kind is OperandKind.Constant or OperandKind.Register) { uint hash = (uint)HashCode.Combine(kind, type, value); diff --git a/src/ARMeilleure/IntermediateRepresentation/OperandType.cs b/src/ARMeilleure/IntermediateRepresentation/OperandType.cs index 67ebdcde4..fec22eed6 100644 --- a/src/ARMeilleure/IntermediateRepresentation/OperandType.cs +++ b/src/ARMeilleure/IntermediateRepresentation/OperandType.cs @@ -16,8 +16,8 @@ namespace ARMeilleure.IntermediateRepresentation { public static bool IsInteger(this OperandType type) { - return type == OperandType.I32 || - type == OperandType.I64; + return type is OperandType.I32 or + OperandType.I64; } public static RegisterType ToRegisterType(this OperandType type) diff --git a/src/ARMeilleure/IntermediateRepresentation/Operation.cs b/src/ARMeilleure/IntermediateRepresentation/Operation.cs index b0dc173af..4bc3a2e09 100644 --- a/src/ARMeilleure/IntermediateRepresentation/Operation.cs +++ b/src/ARMeilleure/IntermediateRepresentation/Operation.cs @@ -337,7 +337,7 @@ namespace ARMeilleure.IntermediateRepresentation return result; } - public static Operation Operation(Intrinsic intrin, Operand dest, params Operand[] srcs) + public static Operation Operation(Intrinsic intrin, Operand dest, params ReadOnlySpan srcs) { Operation result = Make(Instruction.Extended, 0, srcs.Length); diff --git a/src/ARMeilleure/Memory/MemoryManagerType.cs b/src/ARMeilleure/Memory/MemoryManagerType.cs index bc8ae2635..cad7c3558 100644 --- a/src/ARMeilleure/Memory/MemoryManagerType.cs +++ b/src/ARMeilleure/Memory/MemoryManagerType.cs @@ -47,12 +47,12 @@ namespace ARMeilleure.Memory { public static bool IsHostMapped(this MemoryManagerType type) { - return type == MemoryManagerType.HostMapped || type == MemoryManagerType.HostMappedUnsafe; + return type is MemoryManagerType.HostMapped or MemoryManagerType.HostMappedUnsafe; } public static bool IsHostTracked(this MemoryManagerType type) { - return type == MemoryManagerType.HostTracked || type == MemoryManagerType.HostTrackedUnsafe; + return type is MemoryManagerType.HostTracked or MemoryManagerType.HostTrackedUnsafe; } public static bool IsHostMappedOrTracked(this MemoryManagerType type) diff --git a/src/ARMeilleure/Memory/ReservedRegion.cs b/src/ARMeilleure/Memory/ReservedRegion.cs index a3ebd610d..dfe17c933 100644 --- a/src/ARMeilleure/Memory/ReservedRegion.cs +++ b/src/ARMeilleure/Memory/ReservedRegion.cs @@ -7,6 +7,7 @@ namespace ARMeilleure.Memory public const int DefaultGranularity = 65536; // Mapping granularity in Windows. public IJitMemoryBlock Block { get; } + public IJitMemoryAllocator Allocator { get; } public nint Pointer => Block.Pointer; @@ -21,6 +22,7 @@ namespace ARMeilleure.Memory granularity = DefaultGranularity; } + Allocator = allocator; Block = allocator.Reserve(maxSize); _maxSize = maxSize; _sizeGranularity = granularity; diff --git a/src/ARMeilleure/Native/JitSupportDarwin.cs b/src/ARMeilleure/Native/JitSupportDarwin.cs index 39df3878f..9383b9a08 100644 --- a/src/ARMeilleure/Native/JitSupportDarwin.cs +++ b/src/ARMeilleure/Native/JitSupportDarwin.cs @@ -1,4 +1,3 @@ -using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; diff --git a/src/ARMeilleure/Signal/NativeSignalHandlerGenerator.cs b/src/ARMeilleure/Signal/NativeSignalHandlerGenerator.cs index 35747d7a4..0b90252bc 100644 --- a/src/ARMeilleure/Signal/NativeSignalHandlerGenerator.cs +++ b/src/ARMeilleure/Signal/NativeSignalHandlerGenerator.cs @@ -198,7 +198,7 @@ namespace ARMeilleure.Signal ControlFlowGraph cfg = context.GetControlFlowGraph(); - OperandType[] argTypes = new OperandType[] { OperandType.I32, OperandType.I64, OperandType.I64 }; + OperandType[] argTypes = [OperandType.I32, OperandType.I64, OperandType.I64]; return Compiler.Compile(cfg, argTypes, OperandType.None, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Code; } @@ -252,7 +252,7 @@ namespace ARMeilleure.Signal ControlFlowGraph cfg = context.GetControlFlowGraph(); - OperandType[] argTypes = new OperandType[] { OperandType.I64 }; + OperandType[] argTypes = [OperandType.I64]; return Compiler.Compile(cfg, argTypes, OperandType.I32, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Code; } diff --git a/src/ARMeilleure/Signal/TestMethods.cs b/src/ARMeilleure/Signal/TestMethods.cs index 9d11ab183..684157860 100644 --- a/src/ARMeilleure/Signal/TestMethods.cs +++ b/src/ARMeilleure/Signal/TestMethods.cs @@ -1,6 +1,5 @@ using ARMeilleure.IntermediateRepresentation; using ARMeilleure.Translation; -using System; using System.Runtime.InteropServices; using static ARMeilleure.IntermediateRepresentation.Operand.Factory; @@ -22,7 +21,7 @@ namespace ARMeilleure.Signal { EmitterContext context = new(); - var result = WindowsPartialUnmapHandler.EmitRetryFromAccessViolation(context); + Operand result = WindowsPartialUnmapHandler.EmitRetryFromAccessViolation(context); context.Return(result); @@ -30,7 +29,7 @@ namespace ARMeilleure.Signal ControlFlowGraph cfg = context.GetControlFlowGraph(); - OperandType[] argTypes = new OperandType[] { OperandType.I64 }; + OperandType[] argTypes = [OperandType.I64]; return Compiler.Compile(cfg, argTypes, OperandType.I32, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map(); } @@ -39,7 +38,7 @@ namespace ARMeilleure.Signal { EmitterContext context = new(); - var result = WindowsPartialUnmapHandler.EmitThreadLocalMapIntGetOrReserve(context, structPtr, context.LoadArgument(OperandType.I32, 0), context.LoadArgument(OperandType.I32, 1)); + Operand result = WindowsPartialUnmapHandler.EmitThreadLocalMapIntGetOrReserve(context, structPtr, context.LoadArgument(OperandType.I32, 0), context.LoadArgument(OperandType.I32, 1)); context.Return(result); @@ -47,7 +46,7 @@ namespace ARMeilleure.Signal ControlFlowGraph cfg = context.GetControlFlowGraph(); - OperandType[] argTypes = new OperandType[] { OperandType.I64 }; + OperandType[] argTypes = [OperandType.I64]; return Compiler.Compile(cfg, argTypes, OperandType.I32, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map(); } @@ -76,7 +75,7 @@ namespace ARMeilleure.Signal ControlFlowGraph cfg = context.GetControlFlowGraph(); - OperandType[] argTypes = new OperandType[] { OperandType.I64 }; + OperandType[] argTypes = [OperandType.I64]; return Compiler.Compile(cfg, argTypes, OperandType.None, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map(); } diff --git a/src/ARMeilleure/Signal/WindowsPartialUnmapHandler.cs b/src/ARMeilleure/Signal/WindowsPartialUnmapHandler.cs index 7aa3e4788..0df2f41cd 100644 --- a/src/ARMeilleure/Signal/WindowsPartialUnmapHandler.cs +++ b/src/ARMeilleure/Signal/WindowsPartialUnmapHandler.cs @@ -1,7 +1,6 @@ using ARMeilleure.IntermediateRepresentation; using ARMeilleure.Translation; using Ryujinx.Common.Memory.PartialUnmaps; -using System; using System.Runtime.InteropServices; using static ARMeilleure.IntermediateRepresentation.Operand.Factory; diff --git a/src/ARMeilleure/State/ExecutionContext.cs b/src/ARMeilleure/State/ExecutionContext.cs index 314b06b13..223e59d79 100644 --- a/src/ARMeilleure/State/ExecutionContext.cs +++ b/src/ARMeilleure/State/ExecutionContext.cs @@ -1,5 +1,4 @@ using ARMeilleure.Memory; -using System; namespace ARMeilleure.State { @@ -17,10 +16,8 @@ namespace ARMeilleure.State public ulong Pc => _nativeContext.GetPc(); -#pragma warning disable CA1822 // Mark member as static - public uint CtrEl0 => 0x8444c004; - public uint DczidEl0 => 0x00000004; -#pragma warning restore CA1822 + public static uint CtrEl0 => 0x8444c004; + public static uint DczidEl0 => 0x00000004; public ulong CntfrqEl0 => _counter.Frequency; public ulong CntpctEl0 => _counter.Counter; diff --git a/src/ARMeilleure/State/NativeContext.cs b/src/ARMeilleure/State/NativeContext.cs index 140b6f7a7..c90e522a9 100644 --- a/src/ARMeilleure/State/NativeContext.cs +++ b/src/ARMeilleure/State/NativeContext.cs @@ -111,6 +111,7 @@ namespace ARMeilleure.State { value |= GetStorage().Flags[flag] != 0 ? 1u << flag : 0u; } + return value; } @@ -155,6 +156,7 @@ namespace ARMeilleure.State value |= GetStorage().FpFlags[flag] != 0 ? bit : 0u; } } + return value; } diff --git a/src/ARMeilleure/Translation/ArmEmitterContext.cs b/src/ARMeilleure/Translation/ArmEmitterContext.cs index 82f12bb02..196120e92 100644 --- a/src/ARMeilleure/Translation/ArmEmitterContext.cs +++ b/src/ARMeilleure/Translation/ArmEmitterContext.cs @@ -6,7 +6,6 @@ using ARMeilleure.Instructions; using ARMeilleure.IntermediateRepresentation; using ARMeilleure.Memory; using ARMeilleure.State; -using System; using System.Collections.Generic; using System.Reflection; using static ARMeilleure.IntermediateRepresentation.Operand.Factory; @@ -55,7 +54,7 @@ namespace ARMeilleure.Translation public Aarch32Mode Mode { get; } private int _ifThenBlockStateIndex = 0; - private Condition[] _ifThenBlockState = Array.Empty(); + private Condition[] _ifThenBlockState = []; public bool IsInIfThenBlock => _ifThenBlockStateIndex < _ifThenBlockState.Length; public Condition CurrentIfThenBlockCond => _ifThenBlockState[_ifThenBlockStateIndex]; diff --git a/src/ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs b/src/ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs index f36bf7a3d..9c5ca29df 100644 --- a/src/ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs +++ b/src/ARMeilleure/Translation/Cache/CacheMemoryAllocator.cs @@ -23,7 +23,7 @@ namespace ARMeilleure.Translation.Cache } } - private readonly List _blocks = new(); + private readonly List _blocks = []; public CacheMemoryAllocator(int capacity) { diff --git a/src/ARMeilleure/Translation/Cache/JitCache.cs b/src/ARMeilleure/Translation/Cache/JitCache.cs index cf13cd6cb..7931fb360 100644 --- a/src/ARMeilleure/Translation/Cache/JitCache.cs +++ b/src/ARMeilleure/Translation/Cache/JitCache.cs @@ -2,12 +2,15 @@ using ARMeilleure.CodeGen; using ARMeilleure.CodeGen.Unwinding; using ARMeilleure.Memory; using ARMeilleure.Native; +using Humanizer; +using Ryujinx.Common.Logging; using Ryujinx.Memory; using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.Versioning; +using System.Threading; namespace ARMeilleure.Translation.Cache { @@ -17,51 +20,68 @@ namespace ARMeilleure.Translation.Cache private static readonly int _pageMask = _pageSize - 1; private const int CodeAlignment = 4; // Bytes. - private const int CacheSize = 2047 * 1024 * 1024; + private const int CacheSize = 256 * 1024 * 1024; - private static ReservedRegion _jitRegion; private static JitCacheInvalidation _jitCacheInvalidator; - private static CacheMemoryAllocator _cacheAllocator; + private static readonly List _cacheAllocators = []; - private static readonly List _cacheEntries = new(); + private static readonly List _cacheEntries = []; - private static readonly object _lock = new(); + private static readonly Lock _lock = new(); private static bool _initialized; + private static readonly List _jitRegions = []; + private static int _activeRegionIndex = 0; + [SupportedOSPlatform("windows")] [LibraryImport("kernel32.dll", SetLastError = true)] public static partial nint FlushInstructionCache(nint hProcess, nint lpAddress, nuint dwSize); public static void Initialize(IJitMemoryAllocator allocator) { - if (_initialized) - { - return; - } - lock (_lock) { if (_initialized) { - return; + if (OperatingSystem.IsWindows()) + { + JitUnwindWindows.RemoveFunctionTableHandler( + _jitRegions[0].Pointer); + } + + for (int i = 0; i < _jitRegions.Count; i++) + { + _jitRegions[i].Dispose(); + } + + _jitRegions.Clear(); + _cacheAllocators.Clear(); + } + else + { + _initialized = true; } - _jitRegion = new ReservedRegion(allocator, CacheSize); + _activeRegionIndex = 0; + + ReservedRegion firstRegion = new(allocator, CacheSize); + _jitRegions.Add(firstRegion); + + CacheMemoryAllocator firstCacheAllocator = new(CacheSize); + _cacheAllocators.Add(firstCacheAllocator); if (!OperatingSystem.IsWindows() && !OperatingSystem.IsMacOS()) { _jitCacheInvalidator = new JitCacheInvalidation(allocator); } - _cacheAllocator = new CacheMemoryAllocator(CacheSize); - if (OperatingSystem.IsWindows()) { - JitUnwindWindows.InstallFunctionTableHandler(_jitRegion.Pointer, CacheSize, _jitRegion.Pointer + Allocate(_pageSize)); + JitUnwindWindows.InstallFunctionTableHandler( + firstRegion.Pointer, CacheSize, firstRegion.Pointer + Allocate(_pageSize) + ); } - - _initialized = true; } } @@ -74,8 +94,8 @@ namespace ARMeilleure.Translation.Cache Debug.Assert(_initialized); int funcOffset = Allocate(code.Length); - - nint funcPtr = _jitRegion.Pointer + funcOffset; + ReservedRegion targetRegion = _jitRegions[_activeRegionIndex]; + nint funcPtr = targetRegion.Pointer + funcOffset; if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64) { @@ -89,9 +109,9 @@ namespace ARMeilleure.Translation.Cache } else { - ReprotectAsWritable(funcOffset, code.Length); + ReprotectAsWritable(targetRegion, funcOffset, code.Length); Marshal.Copy(code, 0, funcPtr, code.Length); - ReprotectAsExecutable(funcOffset, code.Length); + ReprotectAsExecutable(targetRegion, funcOffset, code.Length); if (OperatingSystem.IsWindows() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64) { @@ -115,50 +135,74 @@ namespace ARMeilleure.Translation.Cache { Debug.Assert(_initialized); - int funcOffset = (int)(pointer.ToInt64() - _jitRegion.Pointer.ToInt64()); - - if (TryFind(funcOffset, out CacheEntry entry, out int entryIndex) && entry.Offset == funcOffset) + foreach (ReservedRegion region in _jitRegions) { - _cacheAllocator.Free(funcOffset, AlignCodeSize(entry.Size)); - _cacheEntries.RemoveAt(entryIndex); + if (pointer.ToInt64() < region.Pointer.ToInt64() || + pointer.ToInt64() >= (region.Pointer + CacheSize).ToInt64()) + { + continue; + } + + int funcOffset = (int)(pointer.ToInt64() - region.Pointer.ToInt64()); + + if (TryFind(funcOffset, out CacheEntry entry, out int entryIndex) && entry.Offset == funcOffset) + { + _cacheAllocators[_activeRegionIndex].Free(funcOffset, AlignCodeSize(entry.Size)); + _cacheEntries.RemoveAt(entryIndex); + } + + return; } } } - private static void ReprotectAsWritable(int offset, int size) + private static void ReprotectAsWritable(ReservedRegion region, int offset, int size) { int endOffs = offset + size; - int regionStart = offset & ~_pageMask; int regionEnd = (endOffs + _pageMask) & ~_pageMask; - _jitRegion.Block.MapAsRwx((ulong)regionStart, (ulong)(regionEnd - regionStart)); + region.Block.MapAsRwx((ulong)regionStart, (ulong)(regionEnd - regionStart)); } - private static void ReprotectAsExecutable(int offset, int size) + private static void ReprotectAsExecutable(ReservedRegion region, int offset, int size) { int endOffs = offset + size; - int regionStart = offset & ~_pageMask; int regionEnd = (endOffs + _pageMask) & ~_pageMask; - _jitRegion.Block.MapAsRx((ulong)regionStart, (ulong)(regionEnd - regionStart)); + region.Block.MapAsRx((ulong)regionStart, (ulong)(regionEnd - regionStart)); } private static int Allocate(int codeSize) { codeSize = AlignCodeSize(codeSize); - int allocOffset = _cacheAllocator.Allocate(codeSize); + int allocOffset = _cacheAllocators[_activeRegionIndex].Allocate(codeSize); - if (allocOffset < 0) + if (allocOffset >= 0) { - throw new OutOfMemoryException("JIT Cache exhausted."); + _jitRegions[_activeRegionIndex].ExpandIfNeeded((ulong)allocOffset + (ulong)codeSize); + return allocOffset; } - _jitRegion.ExpandIfNeeded((ulong)allocOffset + (ulong)codeSize); + int exhaustedRegion = _activeRegionIndex; + ReservedRegion newRegion = new(_jitRegions[0].Allocator, CacheSize); + _jitRegions.Add(newRegion); + _activeRegionIndex = _jitRegions.Count - 1; - return allocOffset; + Logger.Warning?.Print(LogClass.Cpu, $"JIT Cache Region {exhaustedRegion} exhausted, creating new Cache Region {_activeRegionIndex} ({((long)(_activeRegionIndex + 1) * CacheSize).Bytes()} Total Allocation)."); + + _cacheAllocators.Add(new CacheMemoryAllocator(CacheSize)); + + int allocOffsetNew = _cacheAllocators[_activeRegionIndex].Allocate(codeSize); + if (allocOffsetNew < 0) + { + throw new OutOfMemoryException("Failed to allocate in new Cache Region!"); + } + + newRegion.ExpandIfNeeded((ulong)allocOffsetNew + (ulong)codeSize); + return allocOffsetNew; } private static int AlignCodeSize(int codeSize) @@ -184,18 +228,21 @@ namespace ARMeilleure.Translation.Cache { lock (_lock) { - int index = _cacheEntries.BinarySearch(new CacheEntry(offset, 0, default)); - - if (index < 0) + foreach (ReservedRegion _ in _jitRegions) { - index = ~index - 1; - } + int index = _cacheEntries.BinarySearch(new CacheEntry(offset, 0, default)); - if (index >= 0) - { - entry = _cacheEntries[index]; - entryIndex = index; - return true; + if (index < 0) + { + index = ~index - 1; + } + + if (index >= 0) + { + entry = _cacheEntries[index]; + entryIndex = index; + return true; + } } } diff --git a/src/ARMeilleure/Translation/Cache/JitCacheInvalidation.cs b/src/ARMeilleure/Translation/Cache/JitCacheInvalidation.cs index 6f9c22b4a..02e27b941 100644 --- a/src/ARMeilleure/Translation/Cache/JitCacheInvalidation.cs +++ b/src/ARMeilleure/Translation/Cache/JitCacheInvalidation.cs @@ -1,13 +1,12 @@ using ARMeilleure.Memory; -using System; using System.Runtime.InteropServices; namespace ARMeilleure.Translation.Cache { class JitCacheInvalidation { - private static readonly int[] _invalidationCode = new int[] - { + private static readonly int[] _invalidationCode = + [ unchecked((int)0xd53b0022), // mrs x2, ctr_el0 unchecked((int)0xd3504c44), // ubfx x4, x2, #16, #4 unchecked((int)0x52800083), // mov w3, #0x4 @@ -35,8 +34,8 @@ namespace ARMeilleure.Translation.Cache unchecked((int)0x54ffffa8), // b.hi 54 unchecked((int)0xd5033b9f), // dsb ish unchecked((int)0xd5033fdf), // isb - unchecked((int)0xd65f03c0), // ret - }; + unchecked((int)0xd65f03c0) // ret + ]; private delegate void InvalidateCache(ulong start, ulong end); diff --git a/src/ARMeilleure/Translation/Cache/JitUnwindWindows.cs b/src/ARMeilleure/Translation/Cache/JitUnwindWindows.cs index 642794188..15a1051fa 100644 --- a/src/ARMeilleure/Translation/Cache/JitUnwindWindows.cs +++ b/src/ARMeilleure/Translation/Cache/JitUnwindWindows.cs @@ -52,6 +52,11 @@ namespace ARMeilleure.Translation.Cache nint context, [MarshalAs(UnmanagedType.LPWStr)] string outOfProcessCallbackDll); + [LibraryImport("kernel32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static unsafe partial bool RtlDeleteFunctionTable( + ulong tableIdentifier); + private static GetRuntimeFunctionCallback _getRuntimeFunctionCallback; private static int _sizeOfRuntimeFunction; @@ -91,6 +96,23 @@ namespace ARMeilleure.Translation.Cache } } + public static void RemoveFunctionTableHandler(nint codeCachePointer) + { + ulong codeCachePtr = (ulong)codeCachePointer.ToInt64(); + + bool result; + + unsafe + { + result = RtlDeleteFunctionTable(codeCachePtr | 3); + } + + if (!result) + { + throw new InvalidOperationException("Failure removing function table callback."); + } + } + private static unsafe RuntimeFunction* FunctionTableHandler(ulong controlPc, nint context) { int offset = (int)((long)controlPc - context.ToInt64()); @@ -100,13 +122,13 @@ namespace ARMeilleure.Translation.Cache return null; // Not found. } - var unwindInfo = funcEntry.UnwindInfo; + CodeGen.Unwinding.UnwindInfo unwindInfo = funcEntry.UnwindInfo; int codeIndex = 0; for (int index = unwindInfo.PushEntries.Length - 1; index >= 0; index--) { - var entry = unwindInfo.PushEntries[index]; + UnwindPushEntry entry = unwindInfo.PushEntries[index]; switch (entry.PseudoOp) { diff --git a/src/ARMeilleure/Translation/ControlFlowGraph.cs b/src/ARMeilleure/Translation/ControlFlowGraph.cs index 45b092ec5..b1255e810 100644 --- a/src/ARMeilleure/Translation/ControlFlowGraph.cs +++ b/src/ARMeilleure/Translation/ControlFlowGraph.cs @@ -47,8 +47,8 @@ namespace ARMeilleure.Translation { RemoveUnreachableBlocks(Blocks); - var visited = new HashSet(); - var blockStack = new Stack(); + HashSet visited = []; + Stack blockStack = new(); Array.Resize(ref _postOrderBlocks, Blocks.Count); Array.Resize(ref _postOrderMap, Blocks.Count); @@ -88,8 +88,8 @@ namespace ARMeilleure.Translation private void RemoveUnreachableBlocks(IntrusiveList blocks) { - var visited = new HashSet(); - var workQueue = new Queue(); + HashSet visited = []; + Queue workQueue = new(); visited.Add(Entry); workQueue.Enqueue(Entry); diff --git a/src/ARMeilleure/Translation/DelegateInfo.cs b/src/ARMeilleure/Translation/DelegateInfo.cs index d3b535de1..c27dbd6b4 100644 --- a/src/ARMeilleure/Translation/DelegateInfo.cs +++ b/src/ARMeilleure/Translation/DelegateInfo.cs @@ -1,18 +1,10 @@ -using System; - namespace ARMeilleure.Translation { class DelegateInfo { -#pragma warning disable IDE0052 // Remove unread private member - private readonly Delegate _dlg; // Ensure that this delegate will not be garbage collected. -#pragma warning restore IDE0052 - - public nint FuncPtr { get; } - - public DelegateInfo(Delegate dlg, nint funcPtr) + public nint FuncPtr { get; private set; } + public DelegateInfo(nint funcPtr) { - _dlg = dlg; FuncPtr = funcPtr; } } diff --git a/src/ARMeilleure/Translation/Delegates.cs b/src/ARMeilleure/Translation/Delegates.cs index d8c1cfd58..f44e8dc54 100644 --- a/src/ARMeilleure/Translation/Delegates.cs +++ b/src/ARMeilleure/Translation/Delegates.cs @@ -1,9 +1,7 @@ using ARMeilleure.Instructions; -using ARMeilleure.State; using System; using System.Collections.Generic; using System.Reflection; -using System.Runtime.InteropServices; namespace ARMeilleure.Translation { @@ -35,20 +33,6 @@ namespace ARMeilleure.Translation return _delegates.Values[index].FuncPtr; // O(1). } - public static nint GetDelegateFuncPtr(MethodInfo info) - { - ArgumentNullException.ThrowIfNull(info); - - string key = GetKey(info); - - if (!_delegates.TryGetValue(key, out DelegateInfo dlgInfo)) // O(log(n)). - { - throw new KeyNotFoundException($"({nameof(key)} = {key})"); - } - - return dlgInfo.FuncPtr; - } - public static int GetDelegateIndex(MethodInfo info) { ArgumentNullException.ThrowIfNull(info); @@ -65,11 +49,11 @@ namespace ARMeilleure.Translation return index; } - private static void SetDelegateInfo(Delegate dlg, nint funcPtr) + private static void SetDelegateInfo(MethodInfo method) { - string key = GetKey(dlg.Method); + string key = GetKey(method); - _delegates.Add(key, new DelegateInfo(dlg, funcPtr)); // ArgumentException (key). + _delegates.Add(key, new DelegateInfo(method.MethodHandle.GetFunctionPointer())); // ArgumentException (key). } private static string GetKey(MethodInfo info) @@ -83,528 +67,179 @@ namespace ARMeilleure.Translation { _delegates = new SortedList(); - var dlgMathAbs = new MathAbs(Math.Abs); - var dlgMathCeiling = new MathCeiling(Math.Ceiling); - var dlgMathFloor = new MathFloor(Math.Floor); - var dlgMathRound = new MathRound(Math.Round); - var dlgMathTruncate = new MathTruncate(Math.Truncate); + SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Abs))); + SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Ceiling))); + SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Floor))); + SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Round))); + SetDelegateInfo(typeof(MathHelper).GetMethod(nameof(MathHelper.Truncate))); - var dlgMathFAbs = new MathFAbs(MathF.Abs); - var dlgMathFCeiling = new MathFCeiling(MathF.Ceiling); - var dlgMathFFloor = new MathFFloor(MathF.Floor); - var dlgMathFRound = new MathFRound(MathF.Round); - var dlgMathFTruncate = new MathFTruncate(MathF.Truncate); + SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Abs))); + SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Ceiling))); + SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Floor))); + SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Round))); + SetDelegateInfo(typeof(MathHelperF).GetMethod(nameof(MathHelperF.Truncate))); - var dlgNativeInterfaceBreak = new NativeInterfaceBreak(NativeInterface.Break); - var dlgNativeInterfaceCheckSynchronization = new NativeInterfaceCheckSynchronization(NativeInterface.CheckSynchronization); - var dlgNativeInterfaceEnqueueForRejit = new NativeInterfaceEnqueueForRejit(NativeInterface.EnqueueForRejit); - var dlgNativeInterfaceGetCntfrqEl0 = new NativeInterfaceGetCntfrqEl0(NativeInterface.GetCntfrqEl0); - var dlgNativeInterfaceGetCntpctEl0 = new NativeInterfaceGetCntpctEl0(NativeInterface.GetCntpctEl0); - var dlgNativeInterfaceGetCntvctEl0 = new NativeInterfaceGetCntvctEl0(NativeInterface.GetCntvctEl0); - var dlgNativeInterfaceGetCtrEl0 = new NativeInterfaceGetCtrEl0(NativeInterface.GetCtrEl0); - var dlgNativeInterfaceGetDczidEl0 = new NativeInterfaceGetDczidEl0(NativeInterface.GetDczidEl0); - var dlgNativeInterfaceGetFunctionAddress = new NativeInterfaceGetFunctionAddress(NativeInterface.GetFunctionAddress); - var dlgNativeInterfaceInvalidateCacheLine = new NativeInterfaceInvalidateCacheLine(NativeInterface.InvalidateCacheLine); - var dlgNativeInterfaceReadByte = new NativeInterfaceReadByte(NativeInterface.ReadByte); - var dlgNativeInterfaceReadUInt16 = new NativeInterfaceReadUInt16(NativeInterface.ReadUInt16); - var dlgNativeInterfaceReadUInt32 = new NativeInterfaceReadUInt32(NativeInterface.ReadUInt32); - var dlgNativeInterfaceReadUInt64 = new NativeInterfaceReadUInt64(NativeInterface.ReadUInt64); - var dlgNativeInterfaceReadVector128 = new NativeInterfaceReadVector128(NativeInterface.ReadVector128); - var dlgNativeInterfaceSignalMemoryTracking = new NativeInterfaceSignalMemoryTracking(NativeInterface.SignalMemoryTracking); - var dlgNativeInterfaceSupervisorCall = new NativeInterfaceSupervisorCall(NativeInterface.SupervisorCall); - var dlgNativeInterfaceThrowInvalidMemoryAccess = new NativeInterfaceThrowInvalidMemoryAccess(NativeInterface.ThrowInvalidMemoryAccess); - var dlgNativeInterfaceUndefined = new NativeInterfaceUndefined(NativeInterface.Undefined); - var dlgNativeInterfaceWriteByte = new NativeInterfaceWriteByte(NativeInterface.WriteByte); - var dlgNativeInterfaceWriteUInt16 = new NativeInterfaceWriteUInt16(NativeInterface.WriteUInt16); - var dlgNativeInterfaceWriteUInt32 = new NativeInterfaceWriteUInt32(NativeInterface.WriteUInt32); - var dlgNativeInterfaceWriteUInt64 = new NativeInterfaceWriteUInt64(NativeInterface.WriteUInt64); - var dlgNativeInterfaceWriteVector128 = new NativeInterfaceWriteVector128(NativeInterface.WriteVector128); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.Break))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.CheckSynchronization))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.EnqueueForRejit))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntfrqEl0))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntpctEl0))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCntvctEl0))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetCtrEl0))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetDczidEl0))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetFunctionAddress))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.InvalidateCacheLine))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadByte))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt16))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt32))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadUInt64))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ReadVector128))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SignalMemoryTracking))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.SupervisorCall))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.ThrowInvalidMemoryAccess))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.Undefined))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteByte))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt16))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt32))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteUInt64))); + SetDelegateInfo(typeof(NativeInterface).GetMethod(nameof(NativeInterface.WriteVector128))); - var dlgSoftFallbackCountLeadingSigns = new SoftFallbackCountLeadingSigns(SoftFallback.CountLeadingSigns); - var dlgSoftFallbackCountLeadingZeros = new SoftFallbackCountLeadingZeros(SoftFallback.CountLeadingZeros); - var dlgSoftFallbackCrc32b = new SoftFallbackCrc32b(SoftFallback.Crc32b); - var dlgSoftFallbackCrc32cb = new SoftFallbackCrc32cb(SoftFallback.Crc32cb); - var dlgSoftFallbackCrc32ch = new SoftFallbackCrc32ch(SoftFallback.Crc32ch); - var dlgSoftFallbackCrc32cw = new SoftFallbackCrc32cw(SoftFallback.Crc32cw); - var dlgSoftFallbackCrc32cx = new SoftFallbackCrc32cx(SoftFallback.Crc32cx); - var dlgSoftFallbackCrc32h = new SoftFallbackCrc32h(SoftFallback.Crc32h); - var dlgSoftFallbackCrc32w = new SoftFallbackCrc32w(SoftFallback.Crc32w); - var dlgSoftFallbackCrc32x = new SoftFallbackCrc32x(SoftFallback.Crc32x); - var dlgSoftFallbackDecrypt = new SoftFallbackDecrypt(SoftFallback.Decrypt); - var dlgSoftFallbackEncrypt = new SoftFallbackEncrypt(SoftFallback.Encrypt); - var dlgSoftFallbackFixedRotate = new SoftFallbackFixedRotate(SoftFallback.FixedRotate); - var dlgSoftFallbackHashChoose = new SoftFallbackHashChoose(SoftFallback.HashChoose); - var dlgSoftFallbackHashLower = new SoftFallbackHashLower(SoftFallback.HashLower); - var dlgSoftFallbackHashMajority = new SoftFallbackHashMajority(SoftFallback.HashMajority); - var dlgSoftFallbackHashParity = new SoftFallbackHashParity(SoftFallback.HashParity); - var dlgSoftFallbackHashUpper = new SoftFallbackHashUpper(SoftFallback.HashUpper); - var dlgSoftFallbackInverseMixColumns = new SoftFallbackInverseMixColumns(SoftFallback.InverseMixColumns); - var dlgSoftFallbackMixColumns = new SoftFallbackMixColumns(SoftFallback.MixColumns); - var dlgSoftFallbackPolynomialMult64_128 = new SoftFallbackPolynomialMult64_128(SoftFallback.PolynomialMult64_128); - var dlgSoftFallbackSatF32ToS32 = new SoftFallbackSatF32ToS32(SoftFallback.SatF32ToS32); - var dlgSoftFallbackSatF32ToS64 = new SoftFallbackSatF32ToS64(SoftFallback.SatF32ToS64); - var dlgSoftFallbackSatF32ToU32 = new SoftFallbackSatF32ToU32(SoftFallback.SatF32ToU32); - var dlgSoftFallbackSatF32ToU64 = new SoftFallbackSatF32ToU64(SoftFallback.SatF32ToU64); - var dlgSoftFallbackSatF64ToS32 = new SoftFallbackSatF64ToS32(SoftFallback.SatF64ToS32); - var dlgSoftFallbackSatF64ToS64 = new SoftFallbackSatF64ToS64(SoftFallback.SatF64ToS64); - var dlgSoftFallbackSatF64ToU32 = new SoftFallbackSatF64ToU32(SoftFallback.SatF64ToU32); - var dlgSoftFallbackSatF64ToU64 = new SoftFallbackSatF64ToU64(SoftFallback.SatF64ToU64); - var dlgSoftFallbackSha1SchedulePart1 = new SoftFallbackSha1SchedulePart1(SoftFallback.Sha1SchedulePart1); - var dlgSoftFallbackSha1SchedulePart2 = new SoftFallbackSha1SchedulePart2(SoftFallback.Sha1SchedulePart2); - var dlgSoftFallbackSha256SchedulePart1 = new SoftFallbackSha256SchedulePart1(SoftFallback.Sha256SchedulePart1); - var dlgSoftFallbackSha256SchedulePart2 = new SoftFallbackSha256SchedulePart2(SoftFallback.Sha256SchedulePart2); - var dlgSoftFallbackSignedShrImm64 = new SoftFallbackSignedShrImm64(SoftFallback.SignedShrImm64); - var dlgSoftFallbackTbl1 = new SoftFallbackTbl1(SoftFallback.Tbl1); - var dlgSoftFallbackTbl2 = new SoftFallbackTbl2(SoftFallback.Tbl2); - var dlgSoftFallbackTbl3 = new SoftFallbackTbl3(SoftFallback.Tbl3); - var dlgSoftFallbackTbl4 = new SoftFallbackTbl4(SoftFallback.Tbl4); - var dlgSoftFallbackTbx1 = new SoftFallbackTbx1(SoftFallback.Tbx1); - var dlgSoftFallbackTbx2 = new SoftFallbackTbx2(SoftFallback.Tbx2); - var dlgSoftFallbackTbx3 = new SoftFallbackTbx3(SoftFallback.Tbx3); - var dlgSoftFallbackTbx4 = new SoftFallbackTbx4(SoftFallback.Tbx4); - var dlgSoftFallbackUnsignedShrImm64 = new SoftFallbackUnsignedShrImm64(SoftFallback.UnsignedShrImm64); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingSigns))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.CountLeadingZeros))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32b))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cb))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32ch))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cw))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32cx))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32h))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32w))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Crc32x))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Decrypt))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Encrypt))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.FixedRotate))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashChoose))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashLower))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashMajority))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashParity))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.HashUpper))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.InverseMixColumns))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.MixColumns))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.PolynomialMult64_128))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS32))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToS64))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU32))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF32ToU64))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS32))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToS64))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU32))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SatF64ToU64))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart1))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha1SchedulePart2))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart1))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Sha256SchedulePart2))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.SignedShrImm64))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl1))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl2))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl3))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbl4))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx1))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx2))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx3))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.Tbx4))); + SetDelegateInfo(typeof(SoftFallback).GetMethod(nameof(SoftFallback.UnsignedShrImm64))); - var dlgSoftFloat16_32FPConvert = new SoftFloat16_32FPConvert(SoftFloat16_32.FPConvert); - var dlgSoftFloat16_64FPConvert = new SoftFloat16_64FPConvert(SoftFloat16_64.FPConvert); + SetDelegateInfo(typeof(SoftFloat16_32).GetMethod(nameof(SoftFloat16_32.FPConvert))); + SetDelegateInfo(typeof(SoftFloat16_64).GetMethod(nameof(SoftFloat16_64.FPConvert))); - var dlgSoftFloat32FPAdd = new SoftFloat32FPAdd(SoftFloat32.FPAdd); - var dlgSoftFloat32FPAddFpscr = new SoftFloat32FPAddFpscr(SoftFloat32.FPAddFpscr); // A32 only. - var dlgSoftFloat32FPCompare = new SoftFloat32FPCompare(SoftFloat32.FPCompare); - var dlgSoftFloat32FPCompareEQ = new SoftFloat32FPCompareEQ(SoftFloat32.FPCompareEQ); - var dlgSoftFloat32FPCompareEQFpscr = new SoftFloat32FPCompareEQFpscr(SoftFloat32.FPCompareEQFpscr); // A32 only. - var dlgSoftFloat32FPCompareGE = new SoftFloat32FPCompareGE(SoftFloat32.FPCompareGE); - var dlgSoftFloat32FPCompareGEFpscr = new SoftFloat32FPCompareGEFpscr(SoftFloat32.FPCompareGEFpscr); // A32 only. - var dlgSoftFloat32FPCompareGT = new SoftFloat32FPCompareGT(SoftFloat32.FPCompareGT); - var dlgSoftFloat32FPCompareGTFpscr = new SoftFloat32FPCompareGTFpscr(SoftFloat32.FPCompareGTFpscr); // A32 only. - var dlgSoftFloat32FPCompareLE = new SoftFloat32FPCompareLE(SoftFloat32.FPCompareLE); - var dlgSoftFloat32FPCompareLEFpscr = new SoftFloat32FPCompareLEFpscr(SoftFloat32.FPCompareLEFpscr); // A32 only. - var dlgSoftFloat32FPCompareLT = new SoftFloat32FPCompareLT(SoftFloat32.FPCompareLT); - var dlgSoftFloat32FPCompareLTFpscr = new SoftFloat32FPCompareLTFpscr(SoftFloat32.FPCompareLTFpscr); // A32 only. - var dlgSoftFloat32FPDiv = new SoftFloat32FPDiv(SoftFloat32.FPDiv); - var dlgSoftFloat32FPMax = new SoftFloat32FPMax(SoftFloat32.FPMax); - var dlgSoftFloat32FPMaxFpscr = new SoftFloat32FPMaxFpscr(SoftFloat32.FPMaxFpscr); // A32 only. - var dlgSoftFloat32FPMaxNum = new SoftFloat32FPMaxNum(SoftFloat32.FPMaxNum); - var dlgSoftFloat32FPMaxNumFpscr = new SoftFloat32FPMaxNumFpscr(SoftFloat32.FPMaxNumFpscr); // A32 only. - var dlgSoftFloat32FPMin = new SoftFloat32FPMin(SoftFloat32.FPMin); - var dlgSoftFloat32FPMinFpscr = new SoftFloat32FPMinFpscr(SoftFloat32.FPMinFpscr); // A32 only. - var dlgSoftFloat32FPMinNum = new SoftFloat32FPMinNum(SoftFloat32.FPMinNum); - var dlgSoftFloat32FPMinNumFpscr = new SoftFloat32FPMinNumFpscr(SoftFloat32.FPMinNumFpscr); // A32 only. - var dlgSoftFloat32FPMul = new SoftFloat32FPMul(SoftFloat32.FPMul); - var dlgSoftFloat32FPMulFpscr = new SoftFloat32FPMulFpscr(SoftFloat32.FPMulFpscr); // A32 only. - var dlgSoftFloat32FPMulAdd = new SoftFloat32FPMulAdd(SoftFloat32.FPMulAdd); - var dlgSoftFloat32FPMulAddFpscr = new SoftFloat32FPMulAddFpscr(SoftFloat32.FPMulAddFpscr); // A32 only. - var dlgSoftFloat32FPMulSub = new SoftFloat32FPMulSub(SoftFloat32.FPMulSub); - var dlgSoftFloat32FPMulSubFpscr = new SoftFloat32FPMulSubFpscr(SoftFloat32.FPMulSubFpscr); // A32 only. - var dlgSoftFloat32FPMulX = new SoftFloat32FPMulX(SoftFloat32.FPMulX); - var dlgSoftFloat32FPNegMulAdd = new SoftFloat32FPNegMulAdd(SoftFloat32.FPNegMulAdd); - var dlgSoftFloat32FPNegMulSub = new SoftFloat32FPNegMulSub(SoftFloat32.FPNegMulSub); - var dlgSoftFloat32FPRecipEstimate = new SoftFloat32FPRecipEstimate(SoftFloat32.FPRecipEstimate); - var dlgSoftFloat32FPRecipEstimateFpscr = new SoftFloat32FPRecipEstimateFpscr(SoftFloat32.FPRecipEstimateFpscr); // A32 only. - var dlgSoftFloat32FPRecipStep = new SoftFloat32FPRecipStep(SoftFloat32.FPRecipStep); // A32 only. - var dlgSoftFloat32FPRecipStepFused = new SoftFloat32FPRecipStepFused(SoftFloat32.FPRecipStepFused); - var dlgSoftFloat32FPRecpX = new SoftFloat32FPRecpX(SoftFloat32.FPRecpX); - var dlgSoftFloat32FPRSqrtEstimate = new SoftFloat32FPRSqrtEstimate(SoftFloat32.FPRSqrtEstimate); - var dlgSoftFloat32FPRSqrtEstimateFpscr = new SoftFloat32FPRSqrtEstimateFpscr(SoftFloat32.FPRSqrtEstimateFpscr); // A32 only. - var dlgSoftFloat32FPRSqrtStep = new SoftFloat32FPRSqrtStep(SoftFloat32.FPRSqrtStep); // A32 only. - var dlgSoftFloat32FPRSqrtStepFused = new SoftFloat32FPRSqrtStepFused(SoftFloat32.FPRSqrtStepFused); - var dlgSoftFloat32FPSqrt = new SoftFloat32FPSqrt(SoftFloat32.FPSqrt); - var dlgSoftFloat32FPSub = new SoftFloat32FPSub(SoftFloat32.FPSub); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPAdd))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPAddFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompare))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareEQ))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareEQFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGE))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGEFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGT))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareGTFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLE))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLEFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLT))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPCompareLTFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPDiv))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMax))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxNum))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMaxNumFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMin))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinNum))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMinNumFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMul))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulAdd))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulAddFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulSub))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulSubFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPMulX))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPNegMulAdd))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPNegMulSub))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipEstimate))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipEstimateFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipStep))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecipStepFused))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRecpX))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtEstimate))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtEstimateFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtStep))); // A32 only. + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPRSqrtStepFused))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPSqrt))); + SetDelegateInfo(typeof(SoftFloat32).GetMethod(nameof(SoftFloat32.FPSub))); - var dlgSoftFloat32_16FPConvert = new SoftFloat32_16FPConvert(SoftFloat32_16.FPConvert); + SetDelegateInfo(typeof(SoftFloat32_16).GetMethod(nameof(SoftFloat32_16.FPConvert))); - var dlgSoftFloat64FPAdd = new SoftFloat64FPAdd(SoftFloat64.FPAdd); - var dlgSoftFloat64FPAddFpscr = new SoftFloat64FPAddFpscr(SoftFloat64.FPAddFpscr); // A32 only. - var dlgSoftFloat64FPCompare = new SoftFloat64FPCompare(SoftFloat64.FPCompare); - var dlgSoftFloat64FPCompareEQ = new SoftFloat64FPCompareEQ(SoftFloat64.FPCompareEQ); - var dlgSoftFloat64FPCompareEQFpscr = new SoftFloat64FPCompareEQFpscr(SoftFloat64.FPCompareEQFpscr); // A32 only. - var dlgSoftFloat64FPCompareGE = new SoftFloat64FPCompareGE(SoftFloat64.FPCompareGE); - var dlgSoftFloat64FPCompareGEFpscr = new SoftFloat64FPCompareGEFpscr(SoftFloat64.FPCompareGEFpscr); // A32 only. - var dlgSoftFloat64FPCompareGT = new SoftFloat64FPCompareGT(SoftFloat64.FPCompareGT); - var dlgSoftFloat64FPCompareGTFpscr = new SoftFloat64FPCompareGTFpscr(SoftFloat64.FPCompareGTFpscr); // A32 only. - var dlgSoftFloat64FPCompareLE = new SoftFloat64FPCompareLE(SoftFloat64.FPCompareLE); - var dlgSoftFloat64FPCompareLEFpscr = new SoftFloat64FPCompareLEFpscr(SoftFloat64.FPCompareLEFpscr); // A32 only. - var dlgSoftFloat64FPCompareLT = new SoftFloat64FPCompareLT(SoftFloat64.FPCompareLT); - var dlgSoftFloat64FPCompareLTFpscr = new SoftFloat64FPCompareLTFpscr(SoftFloat64.FPCompareLTFpscr); // A32 only. - var dlgSoftFloat64FPDiv = new SoftFloat64FPDiv(SoftFloat64.FPDiv); - var dlgSoftFloat64FPMax = new SoftFloat64FPMax(SoftFloat64.FPMax); - var dlgSoftFloat64FPMaxFpscr = new SoftFloat64FPMaxFpscr(SoftFloat64.FPMaxFpscr); // A32 only. - var dlgSoftFloat64FPMaxNum = new SoftFloat64FPMaxNum(SoftFloat64.FPMaxNum); - var dlgSoftFloat64FPMaxNumFpscr = new SoftFloat64FPMaxNumFpscr(SoftFloat64.FPMaxNumFpscr); // A32 only. - var dlgSoftFloat64FPMin = new SoftFloat64FPMin(SoftFloat64.FPMin); - var dlgSoftFloat64FPMinFpscr = new SoftFloat64FPMinFpscr(SoftFloat64.FPMinFpscr); // A32 only. - var dlgSoftFloat64FPMinNum = new SoftFloat64FPMinNum(SoftFloat64.FPMinNum); - var dlgSoftFloat64FPMinNumFpscr = new SoftFloat64FPMinNumFpscr(SoftFloat64.FPMinNumFpscr); // A32 only. - var dlgSoftFloat64FPMul = new SoftFloat64FPMul(SoftFloat64.FPMul); - var dlgSoftFloat64FPMulFpscr = new SoftFloat64FPMulFpscr(SoftFloat64.FPMulFpscr); // A32 only. - var dlgSoftFloat64FPMulAdd = new SoftFloat64FPMulAdd(SoftFloat64.FPMulAdd); - var dlgSoftFloat64FPMulAddFpscr = new SoftFloat64FPMulAddFpscr(SoftFloat64.FPMulAddFpscr); // A32 only. - var dlgSoftFloat64FPMulSub = new SoftFloat64FPMulSub(SoftFloat64.FPMulSub); - var dlgSoftFloat64FPMulSubFpscr = new SoftFloat64FPMulSubFpscr(SoftFloat64.FPMulSubFpscr); // A32 only. - var dlgSoftFloat64FPMulX = new SoftFloat64FPMulX(SoftFloat64.FPMulX); - var dlgSoftFloat64FPNegMulAdd = new SoftFloat64FPNegMulAdd(SoftFloat64.FPNegMulAdd); - var dlgSoftFloat64FPNegMulSub = new SoftFloat64FPNegMulSub(SoftFloat64.FPNegMulSub); - var dlgSoftFloat64FPRecipEstimate = new SoftFloat64FPRecipEstimate(SoftFloat64.FPRecipEstimate); - var dlgSoftFloat64FPRecipEstimateFpscr = new SoftFloat64FPRecipEstimateFpscr(SoftFloat64.FPRecipEstimateFpscr); // A32 only. - var dlgSoftFloat64FPRecipStep = new SoftFloat64FPRecipStep(SoftFloat64.FPRecipStep); // A32 only. - var dlgSoftFloat64FPRecipStepFused = new SoftFloat64FPRecipStepFused(SoftFloat64.FPRecipStepFused); - var dlgSoftFloat64FPRecpX = new SoftFloat64FPRecpX(SoftFloat64.FPRecpX); - var dlgSoftFloat64FPRSqrtEstimate = new SoftFloat64FPRSqrtEstimate(SoftFloat64.FPRSqrtEstimate); - var dlgSoftFloat64FPRSqrtEstimateFpscr = new SoftFloat64FPRSqrtEstimateFpscr(SoftFloat64.FPRSqrtEstimateFpscr); // A32 only. - var dlgSoftFloat64FPRSqrtStep = new SoftFloat64FPRSqrtStep(SoftFloat64.FPRSqrtStep); // A32 only. - var dlgSoftFloat64FPRSqrtStepFused = new SoftFloat64FPRSqrtStepFused(SoftFloat64.FPRSqrtStepFused); - var dlgSoftFloat64FPSqrt = new SoftFloat64FPSqrt(SoftFloat64.FPSqrt); - var dlgSoftFloat64FPSub = new SoftFloat64FPSub(SoftFloat64.FPSub); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPAdd))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPAddFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompare))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareEQ))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareEQFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGE))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGEFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGT))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareGTFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLE))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLEFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLT))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPCompareLTFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPDiv))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMax))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxNum))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMaxNumFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMin))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinNum))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMinNumFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMul))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulAdd))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulAddFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulSub))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulSubFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPMulX))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPNegMulAdd))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPNegMulSub))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipEstimate))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipEstimateFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipStep))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecipStepFused))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRecpX))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtEstimate))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtEstimateFpscr))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtStep))); // A32 only. + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPRSqrtStepFused))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPSqrt))); + SetDelegateInfo(typeof(SoftFloat64).GetMethod(nameof(SoftFloat64.FPSub))); - var dlgSoftFloat64_16FPConvert = new SoftFloat64_16FPConvert(SoftFloat64_16.FPConvert); - - SetDelegateInfo(dlgMathAbs, Marshal.GetFunctionPointerForDelegate(dlgMathAbs)); - SetDelegateInfo(dlgMathCeiling, Marshal.GetFunctionPointerForDelegate(dlgMathCeiling)); - SetDelegateInfo(dlgMathFloor, Marshal.GetFunctionPointerForDelegate(dlgMathFloor)); - SetDelegateInfo(dlgMathRound, Marshal.GetFunctionPointerForDelegate(dlgMathRound)); - SetDelegateInfo(dlgMathTruncate, Marshal.GetFunctionPointerForDelegate(dlgMathTruncate)); - - SetDelegateInfo(dlgMathFAbs, Marshal.GetFunctionPointerForDelegate(dlgMathFAbs)); - SetDelegateInfo(dlgMathFCeiling, Marshal.GetFunctionPointerForDelegate(dlgMathFCeiling)); - SetDelegateInfo(dlgMathFFloor, Marshal.GetFunctionPointerForDelegate(dlgMathFFloor)); - SetDelegateInfo(dlgMathFRound, Marshal.GetFunctionPointerForDelegate(dlgMathFRound)); - SetDelegateInfo(dlgMathFTruncate, Marshal.GetFunctionPointerForDelegate(dlgMathFTruncate)); - - SetDelegateInfo(dlgNativeInterfaceBreak, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceBreak)); - SetDelegateInfo(dlgNativeInterfaceCheckSynchronization, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceCheckSynchronization)); - SetDelegateInfo(dlgNativeInterfaceEnqueueForRejit, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceEnqueueForRejit)); - SetDelegateInfo(dlgNativeInterfaceGetCntfrqEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntfrqEl0)); - SetDelegateInfo(dlgNativeInterfaceGetCntpctEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntpctEl0)); - SetDelegateInfo(dlgNativeInterfaceGetCntvctEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCntvctEl0)); - SetDelegateInfo(dlgNativeInterfaceGetCtrEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetCtrEl0)); - SetDelegateInfo(dlgNativeInterfaceGetDczidEl0, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetDczidEl0)); - SetDelegateInfo(dlgNativeInterfaceGetFunctionAddress, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceGetFunctionAddress)); - SetDelegateInfo(dlgNativeInterfaceInvalidateCacheLine, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceInvalidateCacheLine)); - SetDelegateInfo(dlgNativeInterfaceReadByte, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadByte)); - SetDelegateInfo(dlgNativeInterfaceReadUInt16, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt16)); - SetDelegateInfo(dlgNativeInterfaceReadUInt32, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt32)); - SetDelegateInfo(dlgNativeInterfaceReadUInt64, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadUInt64)); - SetDelegateInfo(dlgNativeInterfaceReadVector128, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceReadVector128)); - SetDelegateInfo(dlgNativeInterfaceSignalMemoryTracking, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceSignalMemoryTracking)); - SetDelegateInfo(dlgNativeInterfaceSupervisorCall, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceSupervisorCall)); - SetDelegateInfo(dlgNativeInterfaceThrowInvalidMemoryAccess, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceThrowInvalidMemoryAccess)); - SetDelegateInfo(dlgNativeInterfaceUndefined, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceUndefined)); - SetDelegateInfo(dlgNativeInterfaceWriteByte, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteByte)); - SetDelegateInfo(dlgNativeInterfaceWriteUInt16, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt16)); - SetDelegateInfo(dlgNativeInterfaceWriteUInt32, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt32)); - SetDelegateInfo(dlgNativeInterfaceWriteUInt64, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteUInt64)); - SetDelegateInfo(dlgNativeInterfaceWriteVector128, Marshal.GetFunctionPointerForDelegate(dlgNativeInterfaceWriteVector128)); - - SetDelegateInfo(dlgSoftFallbackCountLeadingSigns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCountLeadingSigns)); - SetDelegateInfo(dlgSoftFallbackCountLeadingZeros, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCountLeadingZeros)); - SetDelegateInfo(dlgSoftFallbackCrc32b, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32b)); - SetDelegateInfo(dlgSoftFallbackCrc32cb, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cb)); - SetDelegateInfo(dlgSoftFallbackCrc32ch, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32ch)); - SetDelegateInfo(dlgSoftFallbackCrc32cw, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cw)); - SetDelegateInfo(dlgSoftFallbackCrc32cx, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32cx)); - SetDelegateInfo(dlgSoftFallbackCrc32h, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32h)); - SetDelegateInfo(dlgSoftFallbackCrc32w, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32w)); - SetDelegateInfo(dlgSoftFallbackCrc32x, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackCrc32x)); - SetDelegateInfo(dlgSoftFallbackDecrypt, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackDecrypt)); - SetDelegateInfo(dlgSoftFallbackEncrypt, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackEncrypt)); - SetDelegateInfo(dlgSoftFallbackFixedRotate, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackFixedRotate)); - SetDelegateInfo(dlgSoftFallbackHashChoose, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashChoose)); - SetDelegateInfo(dlgSoftFallbackHashLower, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashLower)); - SetDelegateInfo(dlgSoftFallbackHashMajority, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashMajority)); - SetDelegateInfo(dlgSoftFallbackHashParity, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashParity)); - SetDelegateInfo(dlgSoftFallbackHashUpper, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackHashUpper)); - SetDelegateInfo(dlgSoftFallbackInverseMixColumns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackInverseMixColumns)); - SetDelegateInfo(dlgSoftFallbackMixColumns, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackMixColumns)); - SetDelegateInfo(dlgSoftFallbackPolynomialMult64_128, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackPolynomialMult64_128)); - SetDelegateInfo(dlgSoftFallbackSatF32ToS32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToS32)); - SetDelegateInfo(dlgSoftFallbackSatF32ToS64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToS64)); - SetDelegateInfo(dlgSoftFallbackSatF32ToU32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToU32)); - SetDelegateInfo(dlgSoftFallbackSatF32ToU64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF32ToU64)); - SetDelegateInfo(dlgSoftFallbackSatF64ToS32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToS32)); - SetDelegateInfo(dlgSoftFallbackSatF64ToS64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToS64)); - SetDelegateInfo(dlgSoftFallbackSatF64ToU32, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToU32)); - SetDelegateInfo(dlgSoftFallbackSatF64ToU64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSatF64ToU64)); - SetDelegateInfo(dlgSoftFallbackSha1SchedulePart1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha1SchedulePart1)); - SetDelegateInfo(dlgSoftFallbackSha1SchedulePart2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha1SchedulePart2)); - SetDelegateInfo(dlgSoftFallbackSha256SchedulePart1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha256SchedulePart1)); - SetDelegateInfo(dlgSoftFallbackSha256SchedulePart2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSha256SchedulePart2)); - SetDelegateInfo(dlgSoftFallbackSignedShrImm64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackSignedShrImm64)); - SetDelegateInfo(dlgSoftFallbackTbl1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl1)); - SetDelegateInfo(dlgSoftFallbackTbl2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl2)); - SetDelegateInfo(dlgSoftFallbackTbl3, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl3)); - SetDelegateInfo(dlgSoftFallbackTbl4, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbl4)); - SetDelegateInfo(dlgSoftFallbackTbx1, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx1)); - SetDelegateInfo(dlgSoftFallbackTbx2, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx2)); - SetDelegateInfo(dlgSoftFallbackTbx3, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx3)); - SetDelegateInfo(dlgSoftFallbackTbx4, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackTbx4)); - SetDelegateInfo(dlgSoftFallbackUnsignedShrImm64, Marshal.GetFunctionPointerForDelegate(dlgSoftFallbackUnsignedShrImm64)); - - SetDelegateInfo(dlgSoftFloat16_32FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat16_32FPConvert)); - SetDelegateInfo(dlgSoftFloat16_64FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat16_64FPConvert)); - - SetDelegateInfo(dlgSoftFloat32FPAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPAdd)); - SetDelegateInfo(dlgSoftFloat32FPAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPAddFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPCompare, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompare)); - SetDelegateInfo(dlgSoftFloat32FPCompareEQ, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareEQ)); - SetDelegateInfo(dlgSoftFloat32FPCompareEQFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareEQFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPCompareGE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGE)); - SetDelegateInfo(dlgSoftFloat32FPCompareGEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGEFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPCompareGT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGT)); - SetDelegateInfo(dlgSoftFloat32FPCompareGTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareGTFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPCompareLE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLE)); - SetDelegateInfo(dlgSoftFloat32FPCompareLEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLEFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPCompareLT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLT)); - SetDelegateInfo(dlgSoftFloat32FPCompareLTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPCompareLTFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPDiv, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPDiv)); - SetDelegateInfo(dlgSoftFloat32FPMax, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMax)); - SetDelegateInfo(dlgSoftFloat32FPMaxFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMaxNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxNum)); - SetDelegateInfo(dlgSoftFloat32FPMaxNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMaxNumFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMin, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMin)); - SetDelegateInfo(dlgSoftFloat32FPMinFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMinNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinNum)); - SetDelegateInfo(dlgSoftFloat32FPMinNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMinNumFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMul, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMul)); - SetDelegateInfo(dlgSoftFloat32FPMulFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulAdd)); - SetDelegateInfo(dlgSoftFloat32FPMulAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulAddFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulSub)); - SetDelegateInfo(dlgSoftFloat32FPMulSubFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulSubFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPMulX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPMulX)); - SetDelegateInfo(dlgSoftFloat32FPNegMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPNegMulAdd)); - SetDelegateInfo(dlgSoftFloat32FPNegMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPNegMulSub)); - SetDelegateInfo(dlgSoftFloat32FPRecipEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipEstimate)); - SetDelegateInfo(dlgSoftFloat32FPRecipEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipEstimateFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPRecipStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipStep)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPRecipStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecipStepFused)); - SetDelegateInfo(dlgSoftFloat32FPRecpX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRecpX)); - SetDelegateInfo(dlgSoftFloat32FPRSqrtEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtEstimate)); - SetDelegateInfo(dlgSoftFloat32FPRSqrtEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtEstimateFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPRSqrtStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtStep)); // A32 only. - SetDelegateInfo(dlgSoftFloat32FPRSqrtStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPRSqrtStepFused)); - SetDelegateInfo(dlgSoftFloat32FPSqrt, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPSqrt)); - SetDelegateInfo(dlgSoftFloat32FPSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32FPSub)); - - SetDelegateInfo(dlgSoftFloat32_16FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat32_16FPConvert)); - - SetDelegateInfo(dlgSoftFloat64FPAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPAdd)); - SetDelegateInfo(dlgSoftFloat64FPAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPAddFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPCompare, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompare)); - SetDelegateInfo(dlgSoftFloat64FPCompareEQ, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareEQ)); - SetDelegateInfo(dlgSoftFloat64FPCompareEQFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareEQFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPCompareGE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGE)); - SetDelegateInfo(dlgSoftFloat64FPCompareGEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGEFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPCompareGT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGT)); - SetDelegateInfo(dlgSoftFloat64FPCompareGTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareGTFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPCompareLE, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLE)); - SetDelegateInfo(dlgSoftFloat64FPCompareLEFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLEFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPCompareLT, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLT)); - SetDelegateInfo(dlgSoftFloat64FPCompareLTFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPCompareLTFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPDiv, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPDiv)); - SetDelegateInfo(dlgSoftFloat64FPMax, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMax)); - SetDelegateInfo(dlgSoftFloat64FPMaxFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMaxNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxNum)); - SetDelegateInfo(dlgSoftFloat64FPMaxNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMaxNumFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMin, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMin)); - SetDelegateInfo(dlgSoftFloat64FPMinFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMinNum, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinNum)); - SetDelegateInfo(dlgSoftFloat64FPMinNumFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMinNumFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMul, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMul)); - SetDelegateInfo(dlgSoftFloat64FPMulFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulAdd)); - SetDelegateInfo(dlgSoftFloat64FPMulAddFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulAddFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulSub)); - SetDelegateInfo(dlgSoftFloat64FPMulSubFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulSubFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPMulX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPMulX)); - SetDelegateInfo(dlgSoftFloat64FPNegMulAdd, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPNegMulAdd)); - SetDelegateInfo(dlgSoftFloat64FPNegMulSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPNegMulSub)); - SetDelegateInfo(dlgSoftFloat64FPRecipEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipEstimate)); - SetDelegateInfo(dlgSoftFloat64FPRecipEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipEstimateFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPRecipStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipStep)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPRecipStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecipStepFused)); - SetDelegateInfo(dlgSoftFloat64FPRecpX, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRecpX)); - SetDelegateInfo(dlgSoftFloat64FPRSqrtEstimate, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtEstimate)); - SetDelegateInfo(dlgSoftFloat64FPRSqrtEstimateFpscr, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtEstimateFpscr)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPRSqrtStep, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtStep)); // A32 only. - SetDelegateInfo(dlgSoftFloat64FPRSqrtStepFused, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPRSqrtStepFused)); - SetDelegateInfo(dlgSoftFloat64FPSqrt, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPSqrt)); - SetDelegateInfo(dlgSoftFloat64FPSub, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64FPSub)); - - SetDelegateInfo(dlgSoftFloat64_16FPConvert, Marshal.GetFunctionPointerForDelegate(dlgSoftFloat64_16FPConvert)); + SetDelegateInfo(typeof(SoftFloat64_16).GetMethod(nameof(SoftFloat64_16.FPConvert))); } - - private delegate double MathAbs(double value); - private delegate double MathCeiling(double a); - private delegate double MathFloor(double d); - private delegate double MathRound(double value, MidpointRounding mode); - private delegate double MathTruncate(double d); - - private delegate float MathFAbs(float x); - private delegate float MathFCeiling(float x); - private delegate float MathFFloor(float x); - private delegate float MathFRound(float x, MidpointRounding mode); - private delegate float MathFTruncate(float x); - - private delegate void NativeInterfaceBreak(ulong address, int imm); - private delegate bool NativeInterfaceCheckSynchronization(); - private delegate void NativeInterfaceEnqueueForRejit(ulong address); - private delegate ulong NativeInterfaceGetCntfrqEl0(); - private delegate ulong NativeInterfaceGetCntpctEl0(); - private delegate ulong NativeInterfaceGetCntvctEl0(); - private delegate ulong NativeInterfaceGetCtrEl0(); - private delegate ulong NativeInterfaceGetDczidEl0(); - private delegate ulong NativeInterfaceGetFunctionAddress(ulong address); - private delegate void NativeInterfaceInvalidateCacheLine(ulong address); - private delegate byte NativeInterfaceReadByte(ulong address); - private delegate ushort NativeInterfaceReadUInt16(ulong address); - private delegate uint NativeInterfaceReadUInt32(ulong address); - private delegate ulong NativeInterfaceReadUInt64(ulong address); - private delegate V128 NativeInterfaceReadVector128(ulong address); - private delegate void NativeInterfaceSignalMemoryTracking(ulong address, ulong size, bool write); - private delegate void NativeInterfaceSupervisorCall(ulong address, int imm); - private delegate void NativeInterfaceThrowInvalidMemoryAccess(ulong address); - private delegate void NativeInterfaceUndefined(ulong address, int opCode); - private delegate void NativeInterfaceWriteByte(ulong address, byte value); - private delegate void NativeInterfaceWriteUInt16(ulong address, ushort value); - private delegate void NativeInterfaceWriteUInt32(ulong address, uint value); - private delegate void NativeInterfaceWriteUInt64(ulong address, ulong value); - private delegate void NativeInterfaceWriteVector128(ulong address, V128 value); - - private delegate ulong SoftFallbackCountLeadingSigns(ulong value, int size); - private delegate ulong SoftFallbackCountLeadingZeros(ulong value, int size); - private delegate uint SoftFallbackCrc32b(uint crc, byte value); - private delegate uint SoftFallbackCrc32cb(uint crc, byte value); - private delegate uint SoftFallbackCrc32ch(uint crc, ushort value); - private delegate uint SoftFallbackCrc32cw(uint crc, uint value); - private delegate uint SoftFallbackCrc32cx(uint crc, ulong value); - private delegate uint SoftFallbackCrc32h(uint crc, ushort value); - private delegate uint SoftFallbackCrc32w(uint crc, uint value); - private delegate uint SoftFallbackCrc32x(uint crc, ulong value); - private delegate V128 SoftFallbackDecrypt(V128 value, V128 roundKey); - private delegate V128 SoftFallbackEncrypt(V128 value, V128 roundKey); - private delegate uint SoftFallbackFixedRotate(uint hash_e); - private delegate V128 SoftFallbackHashChoose(V128 hash_abcd, uint hash_e, V128 wk); - private delegate V128 SoftFallbackHashLower(V128 hash_abcd, V128 hash_efgh, V128 wk); - private delegate V128 SoftFallbackHashMajority(V128 hash_abcd, uint hash_e, V128 wk); - private delegate V128 SoftFallbackHashParity(V128 hash_abcd, uint hash_e, V128 wk); - private delegate V128 SoftFallbackHashUpper(V128 hash_abcd, V128 hash_efgh, V128 wk); - private delegate V128 SoftFallbackInverseMixColumns(V128 value); - private delegate V128 SoftFallbackMixColumns(V128 value); - private delegate V128 SoftFallbackPolynomialMult64_128(ulong op1, ulong op2); - private delegate int SoftFallbackSatF32ToS32(float value); - private delegate long SoftFallbackSatF32ToS64(float value); - private delegate uint SoftFallbackSatF32ToU32(float value); - private delegate ulong SoftFallbackSatF32ToU64(float value); - private delegate int SoftFallbackSatF64ToS32(double value); - private delegate long SoftFallbackSatF64ToS64(double value); - private delegate uint SoftFallbackSatF64ToU32(double value); - private delegate ulong SoftFallbackSatF64ToU64(double value); - private delegate V128 SoftFallbackSha1SchedulePart1(V128 w0_3, V128 w4_7, V128 w8_11); - private delegate V128 SoftFallbackSha1SchedulePart2(V128 tw0_3, V128 w12_15); - private delegate V128 SoftFallbackSha256SchedulePart1(V128 w0_3, V128 w4_7); - private delegate V128 SoftFallbackSha256SchedulePart2(V128 w0_3, V128 w8_11, V128 w12_15); - private delegate long SoftFallbackSignedShrImm64(long value, long roundConst, int shift); - private delegate V128 SoftFallbackTbl1(V128 vector, int bytes, V128 tb0); - private delegate V128 SoftFallbackTbl2(V128 vector, int bytes, V128 tb0, V128 tb1); - private delegate V128 SoftFallbackTbl3(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2); - private delegate V128 SoftFallbackTbl4(V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3); - private delegate V128 SoftFallbackTbx1(V128 dest, V128 vector, int bytes, V128 tb0); - private delegate V128 SoftFallbackTbx2(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1); - private delegate V128 SoftFallbackTbx3(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2); - private delegate V128 SoftFallbackTbx4(V128 dest, V128 vector, int bytes, V128 tb0, V128 tb1, V128 tb2, V128 tb3); - private delegate ulong SoftFallbackUnsignedShrImm64(ulong value, long roundConst, int shift); - - private delegate float SoftFloat16_32FPConvert(ushort valueBits); - - private delegate double SoftFloat16_64FPConvert(ushort valueBits); - - private delegate float SoftFloat32FPAdd(float value1, float value2); - private delegate float SoftFloat32FPAddFpscr(float value1, float value2, bool standardFpscr); - private delegate int SoftFloat32FPCompare(float value1, float value2, bool signalNaNs); - private delegate float SoftFloat32FPCompareEQ(float value1, float value2); - private delegate float SoftFloat32FPCompareEQFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPCompareGE(float value1, float value2); - private delegate float SoftFloat32FPCompareGEFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPCompareGT(float value1, float value2); - private delegate float SoftFloat32FPCompareGTFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPCompareLE(float value1, float value2); - private delegate float SoftFloat32FPCompareLEFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPCompareLT(float value1, float value2); - private delegate float SoftFloat32FPCompareLTFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPDiv(float value1, float value2); - private delegate float SoftFloat32FPMax(float value1, float value2); - private delegate float SoftFloat32FPMaxFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMaxNum(float value1, float value2); - private delegate float SoftFloat32FPMaxNumFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMin(float value1, float value2); - private delegate float SoftFloat32FPMinFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMinNum(float value1, float value2); - private delegate float SoftFloat32FPMinNumFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMul(float value1, float value2); - private delegate float SoftFloat32FPMulFpscr(float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMulAdd(float valueA, float value1, float value2); - private delegate float SoftFloat32FPMulAddFpscr(float valueA, float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMulSub(float valueA, float value1, float value2); - private delegate float SoftFloat32FPMulSubFpscr(float valueA, float value1, float value2, bool standardFpscr); - private delegate float SoftFloat32FPMulX(float value1, float value2); - private delegate float SoftFloat32FPNegMulAdd(float valueA, float value1, float value2); - private delegate float SoftFloat32FPNegMulSub(float valueA, float value1, float value2); - private delegate float SoftFloat32FPRecipEstimate(float value); - private delegate float SoftFloat32FPRecipEstimateFpscr(float value, bool standardFpscr); - private delegate float SoftFloat32FPRecipStep(float value1, float value2); - private delegate float SoftFloat32FPRecipStepFused(float value1, float value2); - private delegate float SoftFloat32FPRecpX(float value); - private delegate float SoftFloat32FPRSqrtEstimate(float value); - private delegate float SoftFloat32FPRSqrtEstimateFpscr(float value, bool standardFpscr); - private delegate float SoftFloat32FPRSqrtStep(float value1, float value2); - private delegate float SoftFloat32FPRSqrtStepFused(float value1, float value2); - private delegate float SoftFloat32FPSqrt(float value); - private delegate float SoftFloat32FPSub(float value1, float value2); - - private delegate ushort SoftFloat32_16FPConvert(float value); - - private delegate double SoftFloat64FPAdd(double value1, double value2); - private delegate double SoftFloat64FPAddFpscr(double value1, double value2, bool standardFpscr); - private delegate int SoftFloat64FPCompare(double value1, double value2, bool signalNaNs); - private delegate double SoftFloat64FPCompareEQ(double value1, double value2); - private delegate double SoftFloat64FPCompareEQFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPCompareGE(double value1, double value2); - private delegate double SoftFloat64FPCompareGEFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPCompareGT(double value1, double value2); - private delegate double SoftFloat64FPCompareGTFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPCompareLE(double value1, double value2); - private delegate double SoftFloat64FPCompareLEFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPCompareLT(double value1, double value2); - private delegate double SoftFloat64FPCompareLTFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPDiv(double value1, double value2); - private delegate double SoftFloat64FPMax(double value1, double value2); - private delegate double SoftFloat64FPMaxFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMaxNum(double value1, double value2); - private delegate double SoftFloat64FPMaxNumFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMin(double value1, double value2); - private delegate double SoftFloat64FPMinFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMinNum(double value1, double value2); - private delegate double SoftFloat64FPMinNumFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMul(double value1, double value2); - private delegate double SoftFloat64FPMulFpscr(double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMulAdd(double valueA, double value1, double value2); - private delegate double SoftFloat64FPMulAddFpscr(double valueA, double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMulSub(double valueA, double value1, double value2); - private delegate double SoftFloat64FPMulSubFpscr(double valueA, double value1, double value2, bool standardFpscr); - private delegate double SoftFloat64FPMulX(double value1, double value2); - private delegate double SoftFloat64FPNegMulAdd(double valueA, double value1, double value2); - private delegate double SoftFloat64FPNegMulSub(double valueA, double value1, double value2); - private delegate double SoftFloat64FPRecipEstimate(double value); - private delegate double SoftFloat64FPRecipEstimateFpscr(double value, bool standardFpscr); - private delegate double SoftFloat64FPRecipStep(double value1, double value2); - private delegate double SoftFloat64FPRecipStepFused(double value1, double value2); - private delegate double SoftFloat64FPRecpX(double value); - private delegate double SoftFloat64FPRSqrtEstimate(double value); - private delegate double SoftFloat64FPRSqrtEstimateFpscr(double value, bool standardFpscr); - private delegate double SoftFloat64FPRSqrtStep(double value1, double value2); - private delegate double SoftFloat64FPRSqrtStepFused(double value1, double value2); - private delegate double SoftFloat64FPSqrt(double value); - private delegate double SoftFloat64FPSub(double value1, double value2); - - private delegate ushort SoftFloat64_16FPConvert(double value); } } diff --git a/src/ARMeilleure/Translation/DispatcherFunction.cs b/src/ARMeilleure/Translation/DispatcherFunction.cs index f8b9dc31e..db5e27344 100644 --- a/src/ARMeilleure/Translation/DispatcherFunction.cs +++ b/src/ARMeilleure/Translation/DispatcherFunction.cs @@ -1,5 +1,3 @@ -using System; - namespace ARMeilleure.Translation { delegate void DispatcherFunction(nint nativeContext, ulong startAddress); diff --git a/src/ARMeilleure/Translation/Dominance.cs b/src/ARMeilleure/Translation/Dominance.cs index b62714fdf..e2185bd85 100644 --- a/src/ARMeilleure/Translation/Dominance.cs +++ b/src/ARMeilleure/Translation/Dominance.cs @@ -77,7 +77,7 @@ namespace ARMeilleure.Translation { continue; } - + for (int pBlkIndex = 0; pBlkIndex < block.Predecessors.Count; pBlkIndex++) { BasicBlock current = block.Predecessors[pBlkIndex]; diff --git a/src/ARMeilleure/Translation/EmitterContext.cs b/src/ARMeilleure/Translation/EmitterContext.cs index e2d860f82..3d800e16f 100644 --- a/src/ARMeilleure/Translation/EmitterContext.cs +++ b/src/ARMeilleure/Translation/EmitterContext.cs @@ -97,7 +97,7 @@ namespace ARMeilleure.Translation public virtual Operand Call(MethodInfo info, params Operand[] callArgs) { - nint funcPtr = Delegates.GetDelegateFuncPtr(info); + nint funcPtr = info.MethodHandle.GetFunctionPointer(); OperandType returnType = GetOperandType(info.ReturnType); @@ -559,27 +559,27 @@ namespace ARMeilleure.Translation return dest; } - public Operand AddIntrinsic(Intrinsic intrin, params Operand[] args) + public Operand AddIntrinsic(Intrinsic intrin, params ReadOnlySpan args) { return Add(intrin, Local(OperandType.V128), args); } - public Operand AddIntrinsicInt(Intrinsic intrin, params Operand[] args) + public Operand AddIntrinsicInt(Intrinsic intrin, params ReadOnlySpan args) { return Add(intrin, Local(OperandType.I32), args); } - public Operand AddIntrinsicLong(Intrinsic intrin, params Operand[] args) + public Operand AddIntrinsicLong(Intrinsic intrin, params ReadOnlySpan args) { return Add(intrin, Local(OperandType.I64), args); } - public void AddIntrinsicNoRet(Intrinsic intrin, params Operand[] args) + public void AddIntrinsicNoRet(Intrinsic intrin, params ReadOnlySpan args) { Add(intrin, default, args); } - private Operand Add(Intrinsic intrin, Operand dest, params Operand[] sources) + private Operand Add(Intrinsic intrin, Operand dest, params ReadOnlySpan sources) { NewNextBlockIfNeeded(); diff --git a/src/ARMeilleure/Translation/GuestFunction.cs b/src/ARMeilleure/Translation/GuestFunction.cs index 5c7c733f9..b02d260df 100644 --- a/src/ARMeilleure/Translation/GuestFunction.cs +++ b/src/ARMeilleure/Translation/GuestFunction.cs @@ -1,5 +1,3 @@ -using System; - namespace ARMeilleure.Translation { delegate ulong GuestFunction(nint nativeContextPtr); diff --git a/src/ARMeilleure/Translation/IntervalTree.cs b/src/ARMeilleure/Translation/IntervalTree.cs index a5f9b5d5e..f4abe3bd5 100644 --- a/src/ARMeilleure/Translation/IntervalTree.cs +++ b/src/ARMeilleure/Translation/IntervalTree.cs @@ -108,7 +108,7 @@ namespace ARMeilleure.Translation /// A list of all values sorted by Key Order public List AsList() { - List list = new(); + List list = []; AddToList(_root, list); @@ -124,7 +124,7 @@ namespace ARMeilleure.Translation /// /// The node to search for values within /// The list to add values to - private void AddToList(IntervalTreeNode node, List list) + private static void AddToList(IntervalTreeNode node, List list) { if (node == null) { @@ -165,6 +165,7 @@ namespace ARMeilleure.Translation return node; } } + return null; } @@ -175,7 +176,7 @@ namespace ARMeilleure.Translation /// End of the range /// Overlaps array to place results in /// Overlaps count to update - private void GetKeys(IntervalTreeNode node, TK start, TK end, ref TK[] overlaps, ref int overlapCount) + private static void GetKeys(IntervalTreeNode node, TK start, TK end, ref TK[] overlaps, ref int overlapCount) { if (node == null || start.CompareTo(node.Max) >= 0) { @@ -311,6 +312,7 @@ namespace ARMeilleure.Translation return false; } } + IntervalTreeNode newNode = new(start, end, value, parent); if (newNode.Parent == null) { @@ -422,12 +424,14 @@ namespace ARMeilleure.Translation { return Maximum(node.Left); } + IntervalTreeNode parent = node.Parent; while (parent != null && node == parent.Left) { node = parent; parent = parent.Parent; } + return parent; } @@ -452,6 +456,7 @@ namespace ARMeilleure.Translation RotateLeft(ParentOf(ptr)); sibling = RightOf(ParentOf(ptr)); } + if (ColorOf(LeftOf(sibling)) == Black && ColorOf(RightOf(sibling)) == Black) { SetColor(sibling, Red); @@ -466,6 +471,7 @@ namespace ARMeilleure.Translation RotateRight(sibling); sibling = RightOf(ParentOf(ptr)); } + SetColor(sibling, ColorOf(ParentOf(ptr))); SetColor(ParentOf(ptr), Black); SetColor(RightOf(sibling), Black); @@ -484,6 +490,7 @@ namespace ARMeilleure.Translation RotateRight(ParentOf(ptr)); sibling = LeftOf(ParentOf(ptr)); } + if (ColorOf(RightOf(sibling)) == Black && ColorOf(LeftOf(sibling)) == Black) { SetColor(sibling, Red); @@ -498,6 +505,7 @@ namespace ARMeilleure.Translation RotateLeft(sibling); sibling = LeftOf(ParentOf(ptr)); } + SetColor(sibling, ColorOf(ParentOf(ptr))); SetColor(ParentOf(ptr), Black); SetColor(LeftOf(sibling), Black); @@ -506,6 +514,7 @@ namespace ARMeilleure.Translation } } } + SetColor(ptr, Black); } @@ -532,6 +541,7 @@ namespace ARMeilleure.Translation balanceNode = ParentOf(balanceNode); RotateLeft(balanceNode); } + SetColor(ParentOf(balanceNode), Black); SetColor(ParentOf(ParentOf(balanceNode)), Red); RotateRight(ParentOf(ParentOf(balanceNode))); @@ -555,12 +565,14 @@ namespace ARMeilleure.Translation balanceNode = ParentOf(balanceNode); RotateRight(balanceNode); } + SetColor(ParentOf(balanceNode), Black); SetColor(ParentOf(ParentOf(balanceNode)), Red); RotateLeft(ParentOf(ParentOf(balanceNode))); } } } + SetColor(_root, Black); } @@ -574,6 +586,7 @@ namespace ARMeilleure.Translation { node.Right.Parent = node; } + IntervalTreeNode nodeParent = ParentOf(node); right.Parent = nodeParent; if (nodeParent == null) @@ -588,6 +601,7 @@ namespace ARMeilleure.Translation { nodeParent.Right = right; } + right.Left = node; node.Parent = right; @@ -605,6 +619,7 @@ namespace ARMeilleure.Translation { node.Left.Parent = node; } + IntervalTreeNode nodeParent = ParentOf(node); left.Parent = nodeParent; if (nodeParent == null) @@ -619,6 +634,7 @@ namespace ARMeilleure.Translation { nodeParent.Left = left; } + left.Right = node; node.Parent = left; diff --git a/src/ARMeilleure/Translation/PTC/Ptc.cs b/src/ARMeilleure/Translation/PTC/Ptc.cs index 841e5fefa..f36d4256d 100644 --- a/src/ARMeilleure/Translation/PTC/Ptc.cs +++ b/src/ARMeilleure/Translation/PTC/Ptc.cs @@ -3,12 +3,15 @@ using ARMeilleure.CodeGen.Linking; using ARMeilleure.CodeGen.Unwinding; using ARMeilleure.Common; using ARMeilleure.Memory; +using ARMeilleure.State; +using Humanizer; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Memory; using System; using System.Buffers.Binary; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -30,7 +33,7 @@ namespace ARMeilleure.Translation.PTC private const string OuterHeaderMagicString = "PTCohd\0\0"; private const string InnerHeaderMagicString = "PTCihd\0\0"; - private const uint InternalVersion = 6997; //! To be incremented manually for each change to the ARMeilleure project. + private const uint InternalVersion = 7008; //! To be incremented manually for each change to the ARMeilleure project. private const string ActualDir = "0"; private const string BackupDir = "1"; @@ -59,7 +62,7 @@ namespace ARMeilleure.Translation.PTC private readonly ManualResetEvent _waitEvent; - private readonly object _lock; + private readonly Lock _lock = new(); private bool _disposed; @@ -89,8 +92,6 @@ namespace ARMeilleure.Translation.PTC _waitEvent = new ManualResetEvent(true); - _lock = new object(); - _disposed = false; TitleIdText = TitleIdTextDefault; @@ -155,7 +156,7 @@ namespace ARMeilleure.Translation.PTC private void InitializeCarriers() { _infosStream = MemoryStreamManager.Shared.GetStream(); - _codesList = new List(); + _codesList = []; _relocsStream = MemoryStreamManager.Shared.GetStream(); _unwindInfosStream = MemoryStreamManager.Shared.GetStream(); } @@ -185,6 +186,36 @@ namespace ARMeilleure.Translation.PTC InitializeCarriers(); } + private bool ContainsBlacklistedFunctions() + { + List blacklist = Profiler.GetBlacklistedFunctions(); + bool containsBlacklistedFunctions = false; + _infosStream.Seek(0L, SeekOrigin.Begin); + bool foundBadFunction = false; + + for (int index = 0; index < _infosStream.Length / Unsafe.SizeOf(); index++) + { + InfoEntry infoEntry = DeserializeStructure(_infosStream); + foreach (ulong address in blacklist) + { + if (infoEntry.Address == address) + { + containsBlacklistedFunctions = true; + Logger.Warning?.Print(LogClass.Ptc, "PPTC cache invalidated: Found blacklisted functions in PPTC cache"); + foundBadFunction = true; + break; + } + } + + if (foundBadFunction) + { + break; + } + } + + return containsBlacklistedFunctions; + } + private void PreLoad() { string fileNameActual = $"{CachePathActual}.cache"; @@ -533,8 +564,9 @@ namespace ARMeilleure.Translation.PTC public void LoadTranslations(Translator translator) { - if (AreCarriersEmpty()) + if (AreCarriersEmpty() || ContainsBlacklistedFunctions()) { + ResetCarriersIfNeeded(); return; } @@ -564,7 +596,7 @@ namespace ARMeilleure.Translation.PTC bool isEntryChanged = infoEntry.Hash != ComputeHash(translator.Memory, infoEntry.Address, infoEntry.GuestSize); - if (isEntryChanged || (!infoEntry.HighCq && Profiler.ProfiledFuncs.TryGetValue(infoEntry.Address, out var value) && value.HighCq)) + if (isEntryChanged || (!infoEntry.HighCq && Profiler.ProfiledFuncs.TryGetValue(infoEntry.Address, out PtcProfiler.FuncProfile value) && value.HighCq)) { infoEntry.Stubbed = true; infoEntry.CodeLength = 0; @@ -751,8 +783,8 @@ namespace ARMeilleure.Translation.PTC UnwindInfo unwindInfo, bool highCq) { - var cFunc = new CompiledFunction(code, unwindInfo, RelocInfo.Empty); - var gFunc = cFunc.MapWithPointer(out nint gFuncPointer); + CompiledFunction cFunc = new(code, unwindInfo, RelocInfo.Empty); + GuestFunction gFunc = cFunc.MapWithPointer(out nint gFuncPointer); return new TranslatedFunction(gFunc, gFuncPointer, callCounter, guestSize, highCq); } @@ -766,7 +798,7 @@ namespace ARMeilleure.Translation.PTC private void StubCode(int index) { - _codesList[index] = Array.Empty(); + _codesList[index] = []; } private void StubReloc(int relocEntriesCount) @@ -789,7 +821,7 @@ namespace ARMeilleure.Translation.PTC public void MakeAndSaveTranslations(Translator translator) { - var profiledFuncsToTranslate = Profiler.GetProfiledFuncsToTranslate(translator.Functions); + ConcurrentQueue<(ulong address, PtcProfiler.FuncProfile funcProfile)> profiledFuncsToTranslate = Profiler.GetProfiledFuncsToTranslate(translator.Functions); _translateCount = 0; _translateTotalCount = profiledFuncsToTranslate.Count; @@ -803,8 +835,6 @@ namespace ARMeilleure.Translation.PTC return; } - - int degreeOfParallelism = Environment.ProcessorCount; if (Optimizations.LowPower) @@ -833,13 +863,21 @@ namespace ARMeilleure.Translation.PTC void TranslateFuncs() { - while (profiledFuncsToTranslate.TryDequeue(out var item)) + while (profiledFuncsToTranslate.TryDequeue(out (ulong address, PtcProfiler.FuncProfile funcProfile) item)) { ulong address = item.address; + ExecutionMode executionMode = item.funcProfile.Mode; + bool highCq = item.funcProfile.HighCq; Debug.Assert(Profiler.IsAddressInStaticCodeRange(address)); - TranslatedFunction func = translator.Translate(address, item.funcProfile.Mode, item.funcProfile.HighCq); + TranslatedFunction func = translator.Translate(address, executionMode, highCq, pptcTranslation: true); + + if (func == null) + { + Profiler.UpdateEntry(address, executionMode, true, true); + continue; + } bool isAddressUnique = translator.Functions.TryAdd(address, func.GuestSize, func); @@ -856,23 +894,23 @@ namespace ARMeilleure.Translation.PTC } } - List threads = Enumerable.Range(0, degreeOfParallelism) - .Select(idx => + .Select(idx => new Thread(TranslateFuncs) { - IsBackground = true, - Name = "Ptc.TranslateThread." + idx + IsBackground = true, + Name = "Ptc.TranslateThread." + idx } ).ToList(); Stopwatch sw = Stopwatch.StartNew(); - foreach (var thread in threads) + foreach (Thread thread in threads) { thread.Start(); } - foreach (var thread in threads) + + foreach (Thread thread in threads) { thread.Join(); } @@ -886,7 +924,10 @@ namespace ARMeilleure.Translation.PTC PtcStateChanged?.Invoke(PtcLoadingState.Loaded, _translateCount, _translateTotalCount); - Logger.Info?.Print(LogClass.Ptc, $"{_translateCount} of {_translateTotalCount} functions translated | Thread count: {degreeOfParallelism} in {sw.Elapsed.TotalSeconds} s"); + Logger.Info?.Print(LogClass.Ptc, + $"{_translateCount} of {_translateTotalCount} functions translated in {sw.Elapsed.TotalSeconds} seconds " + + $"| {"function".ToQuantity(_translateTotalCount - _translateCount)} blacklisted " + + $"| Thread count: {degreeOfParallelism}"); Thread preSaveThread = new(PreSave) { @@ -946,7 +987,7 @@ namespace ARMeilleure.Translation.PTC WriteCode(code.AsSpan()); // WriteReloc. - using var relocInfoWriter = new BinaryWriter(_relocsStream, EncodingCache.UTF8NoBOM, true); + using BinaryWriter relocInfoWriter = new(_relocsStream, EncodingCache.UTF8NoBOM, true); foreach (RelocEntry entry in relocInfo.Entries) { @@ -956,7 +997,7 @@ namespace ARMeilleure.Translation.PTC } // WriteUnwindInfo. - using var unwindInfoWriter = new BinaryWriter(_unwindInfosStream, EncodingCache.UTF8NoBOM, true); + using BinaryWriter unwindInfoWriter = new(_unwindInfosStream, EncodingCache.UTF8NoBOM, true); unwindInfoWriter.Write(unwindInfo.PushEntries.Length); @@ -1121,8 +1162,8 @@ namespace ARMeilleure.Translation.PTC public void Close() { - if (State == PtcState.Enabled || - State == PtcState.Continuing) + if (State is PtcState.Enabled or + PtcState.Continuing) { State = PtcState.Closing; } diff --git a/src/ARMeilleure/Translation/PTC/PtcFormatter.cs b/src/ARMeilleure/Translation/PTC/PtcFormatter.cs index 60953dcd9..92b3248c6 100644 --- a/src/ARMeilleure/Translation/PTC/PtcFormatter.cs +++ b/src/ARMeilleure/Translation/PTC/PtcFormatter.cs @@ -50,7 +50,7 @@ namespace ARMeilleure.Translation.PTC [MethodImpl(MethodImplOptions.AggressiveInlining)] public static List DeserializeList(Stream stream) where T : struct { - List list = new(); + List list = []; int count = DeserializeStructure(stream); diff --git a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs index 8e95c5e4b..c7e399433 100644 --- a/src/ARMeilleure/Translation/PTC/PtcProfiler.cs +++ b/src/ARMeilleure/Translation/PTC/PtcProfiler.cs @@ -1,4 +1,6 @@ using ARMeilleure.State; +using Humanizer; +using Microsoft.IO; using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.Common.Memory; @@ -23,11 +25,13 @@ namespace ARMeilleure.Translation.PTC { private const string OuterHeaderMagicString = "Pohd\0\0\0\0"; - private const uint InternalVersion = 5518; //! Not to be incremented manually for each change to the ARMeilleure project. + private const uint InternalVersion = 7007; //! Not to be incremented manually for each change to the ARMeilleure project. - private static readonly uint[] _migrateInternalVersions = { + private static readonly uint[] _migrateInternalVersions = + [ 1866, - }; + 5518, + ]; private const int SaveInterval = 30; // Seconds. @@ -41,7 +45,7 @@ namespace ARMeilleure.Translation.PTC private readonly ManualResetEvent _waitEvent; - private readonly object _lock; + private readonly Lock _lock = new(); private bool _disposed; @@ -58,15 +62,13 @@ namespace ARMeilleure.Translation.PTC { _ptc = ptc; - _timer = new Timer(SaveInterval * 1000d); - _timer.Elapsed += PreSave; + _timer = new Timer(SaveInterval.Seconds()); + _timer.Elapsed += TimerElapsed; _outerHeaderMagic = BinaryPrimitives.ReadUInt64LittleEndian(EncodingCache.UTF8NoBOM.GetBytes(OuterHeaderMagicString).AsSpan()); _waitEvent = new ManualResetEvent(true); - _lock = new object(); - _disposed = false; ProfiledFuncs = new Dictionary(); @@ -74,20 +76,33 @@ namespace ARMeilleure.Translation.PTC Enabled = false; } - public void AddEntry(ulong address, ExecutionMode mode, bool highCq) + private void TimerElapsed(object _, ElapsedEventArgs __) + => new Thread(PreSave) { Name = "Ptc.DiskWriter" }.Start(); + + public void AddEntry(ulong address, ExecutionMode mode, bool highCq, bool blacklist = false) { if (IsAddressInStaticCodeRange(address)) { Debug.Assert(!highCq); - lock (_lock) + if (blacklist) { - ProfiledFuncs.TryAdd(address, new FuncProfile(mode, highCq: false)); + lock (_lock) + { + ProfiledFuncs[address] = new FuncProfile(mode, highCq: false, true); + } + } + else + { + lock (_lock) + { + ProfiledFuncs.TryAdd(address, new FuncProfile(mode, highCq: false, false)); + } } } } - public void UpdateEntry(ulong address, ExecutionMode mode, bool highCq) + public void UpdateEntry(ulong address, ExecutionMode mode, bool highCq, bool? blacklist = null) { if (IsAddressInStaticCodeRange(address)) { @@ -97,7 +112,7 @@ namespace ARMeilleure.Translation.PTC { Debug.Assert(ProfiledFuncs.ContainsKey(address)); - ProfiledFuncs[address] = new FuncProfile(mode, highCq: true); + ProfiledFuncs[address] = new FuncProfile(mode, highCq: true, blacklist ?? ProfiledFuncs[address].Blacklist); } } } @@ -109,11 +124,11 @@ namespace ARMeilleure.Translation.PTC public ConcurrentQueue<(ulong address, FuncProfile funcProfile)> GetProfiledFuncsToTranslate(TranslatorCache funcs) { - var profiledFuncsToTranslate = new ConcurrentQueue<(ulong address, FuncProfile funcProfile)>(); + ConcurrentQueue<(ulong address, FuncProfile funcProfile)> profiledFuncsToTranslate = new(); - foreach (var profiledFunc in ProfiledFuncs) + foreach (KeyValuePair profiledFunc in ProfiledFuncs) { - if (!funcs.ContainsKey(profiledFunc.Key)) + if (!funcs.ContainsKey(profiledFunc.Key) && !profiledFunc.Value.Blacklist) { profiledFuncsToTranslate.Enqueue((profiledFunc.Key, profiledFunc.Value)); } @@ -128,6 +143,22 @@ namespace ARMeilleure.Translation.PTC ProfiledFuncs.TrimExcess(); } + public List GetBlacklistedFunctions() + { + List funcs = []; + + foreach ((ulong ptr, FuncProfile funcProfile) in ProfiledFuncs) + { + if (!funcProfile.Blacklist) + continue; + + if (!funcs.Contains(ptr)) + funcs.Add(ptr); + } + + return funcs; + } + public void PreLoad() { _lastHash = default; @@ -189,7 +220,7 @@ namespace ARMeilleure.Translation.PTC return false; } - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); Debug.Assert(stream.Seek(0L, SeekOrigin.Begin) == 0L && stream.Length == 0L); try @@ -218,13 +249,18 @@ namespace ARMeilleure.Translation.PTC return false; } + Func migrateEntryFunc = null; + switch (outerHeader.InfoFileVersion) { case InternalVersion: ProfiledFuncs = Deserialize(stream); break; case 1866: - ProfiledFuncs = Deserialize(stream, (address, profile) => (address + 0x500000UL, profile)); + migrateEntryFunc = (address, profile) => (address + 0x500000UL, profile); + goto case 5518; + case 5518: + ProfiledFuncs = DeserializeAddBlacklist(stream, migrateEntryFunc); break; default: Logger.Error?.Print(LogClass.Ptc, $"No migration path for {nameof(outerHeader.InfoFileVersion)} '{outerHeader.InfoFileVersion}'. Discarding cache."); @@ -254,6 +290,16 @@ namespace ARMeilleure.Translation.PTC return DeserializeDictionary(stream, DeserializeStructure); } + private static Dictionary DeserializeAddBlacklist(Stream stream, Func migrateEntryFunc = null) + { + if (migrateEntryFunc != null) + { + return DeserializeAndUpdateDictionary(stream, stream => { return new FuncProfile(DeserializeStructure(stream)); }, migrateEntryFunc); + } + + return DeserializeDictionary(stream, stream => { return new FuncProfile(DeserializeStructure(stream)); }); + } + private static ReadOnlySpan GetReadOnlySpan(MemoryStream memoryStream) { return new(memoryStream.GetBuffer(), (int)memoryStream.Position, (int)memoryStream.Length - (int)memoryStream.Position); @@ -264,7 +310,7 @@ namespace ARMeilleure.Translation.PTC compressedStream.SetLength(0L); } - private void PreSave(object source, ElapsedEventArgs e) + private void PreSave() { _waitEvent.Reset(); @@ -385,13 +431,35 @@ namespace ARMeilleure.Translation.PTC } } - [StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 5*/)] + [StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 6*/)] public struct FuncProfile { public ExecutionMode Mode; public bool HighCq; + public bool Blacklist; - public FuncProfile(ExecutionMode mode, bool highCq) + public FuncProfile(ExecutionMode mode, bool highCq, bool blacklist) + { + Mode = mode; + HighCq = highCq; + Blacklist = blacklist; + } + + public FuncProfile(FuncProfilePreBlacklist fp) + { + Mode = fp.Mode; + HighCq = fp.HighCq; + Blacklist = false; + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 5*/)] + public struct FuncProfilePreBlacklist + { + public ExecutionMode Mode; + public bool HighCq; + + public FuncProfilePreBlacklist(ExecutionMode mode, bool highCq) { Mode = mode; HighCq = highCq; @@ -400,8 +468,8 @@ namespace ARMeilleure.Translation.PTC public void Start() { - if (_ptc.State == PtcState.Enabled || - _ptc.State == PtcState.Continuing) + if (_ptc.State is PtcState.Enabled or + PtcState.Continuing) { Enabled = true; @@ -430,7 +498,7 @@ namespace ARMeilleure.Translation.PTC { _disposed = true; - _timer.Elapsed -= PreSave; + _timer.Elapsed -= TimerElapsed; _timer.Dispose(); Wait(); diff --git a/src/ARMeilleure/Translation/RegisterUsage.cs b/src/ARMeilleure/Translation/RegisterUsage.cs index 472b0f67b..03d4a96e7 100644 --- a/src/ARMeilleure/Translation/RegisterUsage.cs +++ b/src/ARMeilleure/Translation/RegisterUsage.cs @@ -95,7 +95,7 @@ namespace ARMeilleure.Translation // This is required because we have a implicit context load at the start of the function, // but if there is a jump to the start of the function, the context load would trash the modified values. // Here we insert a new entry block that will jump to the existing entry block. - BasicBlock newEntry = new BasicBlock(cfg.Blocks.Count); + BasicBlock newEntry = new(cfg.Blocks.Count); cfg.UpdateEntry(newEntry); } diff --git a/src/ARMeilleure/Translation/SsaConstruction.cs b/src/ARMeilleure/Translation/SsaConstruction.cs index cddcfcd4f..e63cdc775 100644 --- a/src/ARMeilleure/Translation/SsaConstruction.cs +++ b/src/ARMeilleure/Translation/SsaConstruction.cs @@ -44,10 +44,10 @@ namespace ARMeilleure.Translation public static void Construct(ControlFlowGraph cfg) { - var globalDefs = new DefMap[cfg.Blocks.Count]; - var localDefs = new Operand[cfg.LocalsCount + RegisterConsts.TotalCount]; + DefMap[] globalDefs = new DefMap[cfg.Blocks.Count]; + Operand[] localDefs = new Operand[cfg.LocalsCount + RegisterConsts.TotalCount]; - var dfPhiBlocks = new Queue(); + Queue dfPhiBlocks = new(); for (BasicBlock block = cfg.Blocks.First; block != null; block = block.ListNext) { diff --git a/src/ARMeilleure/Translation/TranslatedFunction.cs b/src/ARMeilleure/Translation/TranslatedFunction.cs index 3d7ae9ffe..181cc5578 100644 --- a/src/ARMeilleure/Translation/TranslatedFunction.cs +++ b/src/ARMeilleure/Translation/TranslatedFunction.cs @@ -1,5 +1,4 @@ using ARMeilleure.Common; -using System; namespace ARMeilleure.Translation { diff --git a/src/ARMeilleure/Translation/Translator.cs b/src/ARMeilleure/Translation/Translator.cs index 162368782..d8528cfd6 100644 --- a/src/ARMeilleure/Translation/Translator.cs +++ b/src/ARMeilleure/Translation/Translator.cs @@ -5,7 +5,6 @@ using ARMeilleure.Diagnostics; using ARMeilleure.Instructions; using ARMeilleure.IntermediateRepresentation; using ARMeilleure.Memory; -using ARMeilleure.Signal; using ARMeilleure.State; using ARMeilleure.Translation.Cache; using ARMeilleure.Translation.PTC; @@ -220,9 +219,9 @@ namespace ARMeilleure.Translation } } - internal TranslatedFunction Translate(ulong address, ExecutionMode mode, bool highCq, bool singleStep = false) + internal TranslatedFunction Translate(ulong address, ExecutionMode mode, bool highCq, bool singleStep = false, bool pptcTranslation = false) { - var context = new ArmEmitterContext( + ArmEmitterContext context = new( Memory, CountTable, FunctionTable, @@ -247,7 +246,12 @@ namespace ARMeilleure.Translation context.Branch(context.GetLabel(address)); } - ControlFlowGraph cfg = EmitAndGetCFG(context, blocks, out Range funcRange, out Counter counter); + ControlFlowGraph cfg = EmitAndGetCFG(context, blocks, out Range funcRange, out Counter counter, pptcTranslation); + + if (cfg == null) + { + return null; + } ulong funcSize = funcRange.End - funcRange.Start; @@ -259,10 +263,10 @@ namespace ARMeilleure.Translation Logger.EndPass(PassName.RegisterUsage); - var retType = OperandType.I64; - var argTypes = new OperandType[] { OperandType.I64 }; + OperandType retType = OperandType.I64; + OperandType[] argTypes = [OperandType.I64]; - var options = highCq ? CompilerOptions.HighCq : CompilerOptions.None; + CompilerOptions options = highCq ? CompilerOptions.HighCq : CompilerOptions.None; if (context.HasPtc && !singleStep) { @@ -322,7 +326,8 @@ namespace ARMeilleure.Translation ArmEmitterContext context, Block[] blocks, out Range range, - out Counter counter) + out Counter counter, + bool pptcTranslation) { counter = null; @@ -407,6 +412,14 @@ namespace ARMeilleure.Translation if (opCode.Instruction.Emitter != null) { opCode.Instruction.Emitter(context); + // if we're pre-compiling PPTC functions, and we hit an Undefined instruction as the first + // instruction in the block, mark the function as blacklisted + // this way, we don't pre-compile Exlaunch hooks, which allows ExeFS mods to run with PPTC + if (pptcTranslation && opCode.Instruction.Name == InstName.Und && blkIndex == 0) + { + range = new Range(rangeStart, rangeEnd); + return null; + } } else { @@ -478,7 +491,7 @@ namespace ARMeilleure.Translation public void InvalidateJitCacheRegion(ulong address, ulong size) { - ulong[] overlapAddresses = Array.Empty(); + ulong[] overlapAddresses = []; int overlapsCount = Functions.GetOverlaps(address, size, ref overlapAddresses); @@ -521,7 +534,7 @@ namespace ARMeilleure.Translation List functions = Functions.AsList(); - foreach (var func in functions) + foreach (TranslatedFunction func in functions) { JitCache.Unmap(func.FuncPointer); @@ -530,7 +543,7 @@ namespace ARMeilleure.Translation Functions.Clear(); - while (_oldFuncs.TryDequeue(out var kv)) + while (_oldFuncs.TryDequeue(out KeyValuePair kv)) { JitCache.Unmap(kv.Value.FuncPointer); @@ -551,7 +564,7 @@ namespace ARMeilleure.Translation { while (Queue.Count > 0 && Queue.TryDequeue(out RejitRequest request)) { - if (Functions.TryGetValue(request.Address, out var func) && func.CallCounter != null) + if (Functions.TryGetValue(request.Address, out TranslatedFunction func) && func.CallCounter != null) { Volatile.Write(ref func.CallCounter.Value, 0); } diff --git a/src/ARMeilleure/Translation/TranslatorQueue.cs b/src/ARMeilleure/Translation/TranslatorQueue.cs index 831522bc1..ba261eaa5 100644 --- a/src/ARMeilleure/Translation/TranslatorQueue.cs +++ b/src/ARMeilleure/Translation/TranslatorQueue.cs @@ -36,7 +36,7 @@ namespace ARMeilleure.Translation Sync = new object(); _requests = new Stack(); - _requestAddresses = new HashSet(); + _requestAddresses = []; } /// diff --git a/src/ARMeilleure/Translation/TranslatorStubs.cs b/src/ARMeilleure/Translation/TranslatorStubs.cs index bd9aed8d4..458a42434 100644 --- a/src/ARMeilleure/Translation/TranslatorStubs.cs +++ b/src/ARMeilleure/Translation/TranslatorStubs.cs @@ -4,7 +4,6 @@ using ARMeilleure.IntermediateRepresentation; using ARMeilleure.State; using ARMeilleure.Translation.Cache; using System; -using System.Reflection; using System.Runtime.InteropServices; using static ARMeilleure.IntermediateRepresentation.Operand.Factory; @@ -142,7 +141,7 @@ namespace ARMeilleure.Translation /// Generated private nint GenerateDispatchStub() { - var context = new EmitterContext(); + EmitterContext context = new(); Operand lblFallback = Label(); Operand lblEnd = Label(); @@ -161,7 +160,7 @@ namespace ARMeilleure.Translation for (int i = 0; i < _functionTable.Levels.Length; i++) { - ref var level = ref _functionTable.Levels[i]; + ref AddressTableLevel level = ref _functionTable.Levels[i]; // level.Mask is not used directly because it is more often bigger than 32-bits, so it will not // be encoded as an immediate on x86's bitwise and operation. @@ -185,11 +184,11 @@ namespace ARMeilleure.Translation hostAddress = context.Call(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetFunctionAddress)), guestAddress); context.Tailcall(hostAddress, nativeContext); - var cfg = context.GetControlFlowGraph(); - var retType = OperandType.I64; - var argTypes = new[] { OperandType.I64 }; + ControlFlowGraph cfg = context.GetControlFlowGraph(); + OperandType retType = OperandType.I64; + OperandType[] argTypes = [OperandType.I64]; - var func = Compiler.Compile(cfg, argTypes, retType, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map(); + GuestFunction func = Compiler.Compile(cfg, argTypes, retType, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map(); return Marshal.GetFunctionPointerForDelegate(func); } @@ -200,7 +199,7 @@ namespace ARMeilleure.Translation /// Generated private nint GenerateSlowDispatchStub() { - var context = new EmitterContext(); + EmitterContext context = new(); // Load the target guest address from the native context. Operand nativeContext = context.LoadArgument(OperandType.I64, 0); @@ -210,11 +209,11 @@ namespace ARMeilleure.Translation Operand hostAddress = context.Call(typeof(NativeInterface).GetMethod(nameof(NativeInterface.GetFunctionAddress)), guestAddress); context.Tailcall(hostAddress, nativeContext); - var cfg = context.GetControlFlowGraph(); - var retType = OperandType.I64; - var argTypes = new[] { OperandType.I64 }; + ControlFlowGraph cfg = context.GetControlFlowGraph(); + OperandType retType = OperandType.I64; + OperandType[] argTypes = [OperandType.I64]; - var func = Compiler.Compile(cfg, argTypes, retType, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map(); + GuestFunction func = Compiler.Compile(cfg, argTypes, retType, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map(); return Marshal.GetFunctionPointerForDelegate(func); } @@ -251,7 +250,7 @@ namespace ARMeilleure.Translation /// function private DispatcherFunction GenerateDispatchLoop() { - var context = new EmitterContext(); + EmitterContext context = new(); Operand beginLbl = Label(); Operand endLbl = Label(); @@ -279,9 +278,9 @@ namespace ARMeilleure.Translation context.Return(); - var cfg = context.GetControlFlowGraph(); - var retType = OperandType.None; - var argTypes = new[] { OperandType.I64, OperandType.I64 }; + ControlFlowGraph cfg = context.GetControlFlowGraph(); + OperandType retType = OperandType.None; + OperandType[] argTypes = [OperandType.I64, OperandType.I64]; return Compiler.Compile(cfg, argTypes, retType, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map(); } @@ -292,7 +291,7 @@ namespace ARMeilleure.Translation /// function private WrapperFunction GenerateContextWrapper() { - var context = new EmitterContext(); + EmitterContext context = new(); Operand nativeContext = context.LoadArgument(OperandType.I64, 0); Operand guestMethod = context.LoadArgument(OperandType.I64, 1); @@ -303,9 +302,9 @@ namespace ARMeilleure.Translation context.Return(returnValue); - var cfg = context.GetControlFlowGraph(); - var retType = OperandType.I64; - var argTypes = new[] { OperandType.I64, OperandType.I64 }; + ControlFlowGraph cfg = context.GetControlFlowGraph(); + OperandType retType = OperandType.I64; + OperandType[] argTypes = [OperandType.I64, OperandType.I64]; return Compiler.Compile(cfg, argTypes, retType, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map(); } diff --git a/src/ARMeilleure/Translation/TranslatorTestMethods.cs b/src/ARMeilleure/Translation/TranslatorTestMethods.cs index 186780daa..5f15cf550 100644 --- a/src/ARMeilleure/Translation/TranslatorTestMethods.cs +++ b/src/ARMeilleure/Translation/TranslatorTestMethods.cs @@ -139,7 +139,7 @@ namespace ARMeilleure.Translation ControlFlowGraph cfg = context.GetControlFlowGraph(); - OperandType[] argTypes = new OperandType[] { OperandType.I64 }; + OperandType[] argTypes = [OperandType.I64]; return Compiler.Compile(cfg, argTypes, OperandType.I32, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map(); } diff --git a/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs b/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs index 25f91f8e9..8be6197f6 100644 --- a/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceDriver.cs @@ -178,7 +178,7 @@ namespace Ryujinx.Audio.Backends.OpenAL public bool SupportsChannelCount(uint channelCount) { - return channelCount == 1 || channelCount == 2 || channelCount == 6; + return channelCount is 1 or 2 or 6; } public bool SupportsDirection(Direction direction) diff --git a/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceSession.cs b/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceSession.cs index 3b9129130..7292450a6 100644 --- a/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceSession.cs +++ b/src/Ryujinx.Audio.Backends.OpenAL/OpenALHardwareDeviceSession.cs @@ -5,6 +5,7 @@ using Ryujinx.Memory; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Threading; namespace Ryujinx.Audio.Backends.OpenAL { @@ -18,7 +19,7 @@ namespace Ryujinx.Audio.Backends.OpenAL private ulong _playedSampleCount; private float _volume; - private readonly object _lock = new(); + private readonly Lock _lock = new(); public OpenALHardwareDeviceSession(OpenALHardwareDeviceDriver driver, IVirtualMemoryManager memoryManager, SampleFormat requestedSampleFormat, uint requestedSampleRate, uint requestedChannelCount) : base(memoryManager, requestedSampleFormat, requestedSampleRate, requestedChannelCount) { diff --git a/src/Ryujinx.Audio.Backends.OpenAL/Ryujinx.Audio.Backends.OpenAL.csproj b/src/Ryujinx.Audio.Backends.OpenAL/Ryujinx.Audio.Backends.OpenAL.csproj index bdf46d688..4ef3aebec 100644 --- a/src/Ryujinx.Audio.Backends.OpenAL/Ryujinx.Audio.Backends.OpenAL.csproj +++ b/src/Ryujinx.Audio.Backends.OpenAL/Ryujinx.Audio.Backends.OpenAL.csproj @@ -1,7 +1,6 @@ - net8.0 $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Audio.Backends.SDL2/Ryujinx.Audio.Backends.SDL2.csproj b/src/Ryujinx.Audio.Backends.SDL2/Ryujinx.Audio.Backends.SDL2.csproj index 940e47308..d0d45122e 100644 --- a/src/Ryujinx.Audio.Backends.SDL2/Ryujinx.Audio.Backends.SDL2.csproj +++ b/src/Ryujinx.Audio.Backends.SDL2/Ryujinx.Audio.Backends.SDL2.csproj @@ -1,7 +1,6 @@ - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs index acd1582ec..d5381209e 100644 --- a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceDriver.cs @@ -24,10 +24,8 @@ namespace Ryujinx.Audio.Backends.SDL2 // TODO: Add this to SDL2-CS // NOTE: We use a DllImport here because of marshaling issue for spec. -#pragma warning disable SYSLIB1054 [DllImport("SDL2")] private static extern int SDL_GetDefaultAudioInfo(nint name, out SDL_AudioSpec spec, int isCapture); -#pragma warning restore SYSLIB1054 public SDL2HardwareDeviceDriver() { @@ -37,7 +35,7 @@ namespace Ryujinx.Audio.Backends.SDL2 SDL2Driver.Instance.Initialize(); - int res = SDL_GetDefaultAudioInfo(nint.Zero, out var spec, 0); + int res = SDL_GetDefaultAudioInfo(nint.Zero, out SDL_AudioSpec spec, 0); if (res != 0) { diff --git a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs index 51cd43c55..9170b73c7 100644 --- a/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs +++ b/src/Ryujinx.Audio.Backends.SDL2/SDL2HardwareDeviceSession.cs @@ -4,7 +4,6 @@ using Ryujinx.Common.Logging; using Ryujinx.Common.Memory; using Ryujinx.Memory; using System; -using System.Buffers; using System.Collections.Concurrent; using System.Threading; diff --git a/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIo.cs b/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIo.cs index 9decd79fc..6a12e8c0c 100644 --- a/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIo.cs +++ b/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIo.cs @@ -1,5 +1,4 @@ using Ryujinx.Common.Memory; -using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; diff --git a/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoDeviceContext.cs b/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoDeviceContext.cs index efea52b35..7c782bd76 100644 --- a/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoDeviceContext.cs +++ b/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoDeviceContext.cs @@ -1,4 +1,3 @@ -using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using static Ryujinx.Audio.Backends.SoundIo.Native.SoundIo; diff --git a/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoOutStreamContext.cs b/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoOutStreamContext.cs index b1823a074..072e49d8c 100644 --- a/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoOutStreamContext.cs +++ b/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIoOutStreamContext.cs @@ -38,7 +38,7 @@ namespace Ryujinx.Audio.Backends.SoundIo.Native get => Marshal.PtrToStringAnsi(GetOutContext().Name); set { - var context = GetOutContext(); + SoundIoOutStream context = GetOutContext(); if (_nameStored != nint.Zero && context.Name == _nameStored) { @@ -129,8 +129,8 @@ namespace Ryujinx.Audio.Backends.SoundIo.Native unsafe { - var frameCountPtr = &nativeFrameCount; - var arenasPtr = &arenas; + int* frameCountPtr = &nativeFrameCount; + IntPtr* arenasPtr = &arenas; CheckError(soundio_outstream_begin_write(_context, (nint)arenasPtr, (nint)frameCountPtr)); frameCount = *frameCountPtr; diff --git a/src/Ryujinx.Audio.Backends.SoundIo/Ryujinx.Audio.Backends.SoundIo.csproj b/src/Ryujinx.Audio.Backends.SoundIo/Ryujinx.Audio.Backends.SoundIo.csproj index 671a6ad5e..911401338 100644 --- a/src/Ryujinx.Audio.Backends.SoundIo/Ryujinx.Audio.Backends.SoundIo.csproj +++ b/src/Ryujinx.Audio.Backends.SoundIo/Ryujinx.Audio.Backends.SoundIo.csproj @@ -1,9 +1,8 @@ - net8.0 true - win-x64;osx-x64;linux-x64 + win-x64;osx-x64;linux-x64;win-arm64;osx-arm64;linux-arm64 $(DefaultItemExcludes);._* @@ -12,15 +11,15 @@ - + PreserveNewest libsoundio.dll - + PreserveNewest libsoundio.dylib - + PreserveNewest libsoundio.so diff --git a/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs b/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs index e9cc6a8e1..1540cd0e3 100644 --- a/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs +++ b/src/Ryujinx.Audio.Backends.SoundIo/SoundIoHardwareDeviceSession.cs @@ -4,7 +4,6 @@ using Ryujinx.Audio.Common; using Ryujinx.Common.Memory; using Ryujinx.Memory; using System; -using System.Buffers; using System.Collections.Concurrent; using System.Runtime.CompilerServices; using System.Threading; diff --git a/src/Ryujinx.Audio/AudioManager.cs b/src/Ryujinx.Audio/AudioManager.cs index 370d3d098..8c2c0ef6b 100644 --- a/src/Ryujinx.Audio/AudioManager.cs +++ b/src/Ryujinx.Audio/AudioManager.cs @@ -11,7 +11,7 @@ namespace Ryujinx.Audio /// /// Lock used to control the waiters registration. /// - private readonly object _lock = new(); + private readonly Lock _lock = new(); /// /// Events signaled when the driver played audio buffers. diff --git a/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs b/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs index 7aefe8865..a06ab21a7 100644 --- a/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs +++ b/src/Ryujinx.Audio/Backends/Common/DynamicRingBuffer.cs @@ -1,7 +1,7 @@ using Ryujinx.Common; using Ryujinx.Common.Memory; using System; -using System.Buffers; +using System.Threading; namespace Ryujinx.Audio.Backends.Common { @@ -12,7 +12,7 @@ namespace Ryujinx.Audio.Backends.Common { private const int RingBufferAlignment = 2048; - private readonly object _lock = new(); + private readonly Lock _lock = new(); private MemoryOwner _bufferOwner; private Memory _buffer; diff --git a/src/Ryujinx.Audio/Backends/CompatLayer/CompatLayerHardwareDeviceDriver.cs b/src/Ryujinx.Audio/Backends/CompatLayer/CompatLayerHardwareDeviceDriver.cs index a2c2cdcd0..8bc2a6016 100644 --- a/src/Ryujinx.Audio/Backends/CompatLayer/CompatLayerHardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio/Backends/CompatLayer/CompatLayerHardwareDeviceDriver.cs @@ -162,7 +162,7 @@ namespace Ryujinx.Audio.Backends.CompatLayer public bool SupportsChannelCount(uint channelCount) { - return channelCount == 1 || channelCount == 2 || channelCount == 6; + return channelCount is 1 or 2 or 6; } public bool SupportsSampleFormat(SampleFormat sampleFormat) @@ -184,7 +184,7 @@ namespace Ryujinx.Audio.Backends.CompatLayer public bool SupportsDirection(Direction direction) { - return direction == Direction.Input || direction == Direction.Output; + return direction is Direction.Input or Direction.Output; } } } diff --git a/src/Ryujinx.Audio/Backends/CompatLayer/Downmixing.cs b/src/Ryujinx.Audio/Backends/CompatLayer/Downmixing.cs index 7a5ea0deb..32a85cd76 100644 --- a/src/Ryujinx.Audio/Backends/CompatLayer/Downmixing.cs +++ b/src/Ryujinx.Audio/Backends/CompatLayer/Downmixing.cs @@ -31,19 +31,19 @@ namespace Ryujinx.Audio.Backends.CompatLayer private const int Minus6dBInQ15 = (int)(0.501f * RawQ15One); private const int Minus12dBInQ15 = (int)(0.251f * RawQ15One); - private static readonly long[] _defaultSurroundToStereoCoefficients = new long[4] - { + private static readonly long[] _defaultSurroundToStereoCoefficients = + [ RawQ15One, Minus3dBInQ15, Minus12dBInQ15, - Minus3dBInQ15, - }; + Minus3dBInQ15 + ]; - private static readonly long[] _defaultStereoToMonoCoefficients = new long[2] - { + private static readonly long[] _defaultStereoToMonoCoefficients = + [ Minus6dBInQ15, - Minus6dBInQ15, - }; + Minus6dBInQ15 + ]; private const int SurroundChannelCount = 6; private const int StereoChannelCount = 2; diff --git a/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs b/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs index 3a3c1d1b1..2cd15c092 100644 --- a/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs +++ b/src/Ryujinx.Audio/Backends/Dummy/DummyHardwareDeviceDriver.cs @@ -9,20 +9,12 @@ namespace Ryujinx.Audio.Backends.Dummy { public class DummyHardwareDeviceDriver : IHardwareDeviceDriver { - private readonly ManualResetEvent _updateRequiredEvent; - private readonly ManualResetEvent _pauseEvent; + private readonly ManualResetEvent _updateRequiredEvent = new(false); + private readonly ManualResetEvent _pauseEvent = new(true); public static bool IsSupported => true; - public float Volume { get; set; } - - public DummyHardwareDeviceDriver() - { - _updateRequiredEvent = new ManualResetEvent(false); - _pauseEvent = new ManualResetEvent(true); - - Volume = 1f; - } + public float Volume { get; set; } = 1f; public IHardwareDeviceSession OpenDeviceSession(Direction direction, IVirtualMemoryManager memoryManager, SampleFormat sampleFormat, uint sampleRate, uint channelCount) { @@ -60,7 +52,7 @@ namespace Ryujinx.Audio.Backends.Dummy Dispose(true); } - protected virtual void Dispose(bool disposing) + private void Dispose(bool disposing) { if (disposing) { @@ -81,12 +73,12 @@ namespace Ryujinx.Audio.Backends.Dummy public bool SupportsDirection(Direction direction) { - return direction == Direction.Output || direction == Direction.Input; + return direction is Direction.Output or Direction.Input; } public bool SupportsChannelCount(uint channelCount) { - return channelCount == 1 || channelCount == 2 || channelCount == 6; + return channelCount is 1 or 2 or 6; } } } diff --git a/src/Ryujinx.Audio/Common/AudioDeviceSession.cs b/src/Ryujinx.Audio/Common/AudioDeviceSession.cs index a0e04c80d..6ba001e80 100644 --- a/src/Ryujinx.Audio/Common/AudioDeviceSession.cs +++ b/src/Ryujinx.Audio/Common/AudioDeviceSession.cs @@ -109,7 +109,7 @@ namespace Ryujinx.Audio.Common /// The state of the session public AudioDeviceState GetState() { - Debug.Assert(_state == AudioDeviceState.Started || _state == AudioDeviceState.Stopped); + Debug.Assert(_state is AudioDeviceState.Started or AudioDeviceState.Stopped); return _state; } diff --git a/src/Ryujinx.Audio/Constants.cs b/src/Ryujinx.Audio/Constants.cs index eb5b39013..a2d2c7156 100644 --- a/src/Ryujinx.Audio/Constants.cs +++ b/src/Ryujinx.Audio/Constants.cs @@ -164,12 +164,12 @@ namespace Ryujinx.Audio /// /// The default coefficients used for standard 5.1 surround to stereo downmixing. /// - public static readonly float[] DefaultSurroundToStereoCoefficients = new float[4] - { + public static readonly float[] DefaultSurroundToStereoCoefficients = + [ 1.0f, 0.707f, 0.251f, - 0.707f, - }; + 0.707f + ]; } } diff --git a/src/Ryujinx.Audio/Input/AudioInputManager.cs b/src/Ryujinx.Audio/Input/AudioInputManager.cs index d56997e9c..3869867e0 100644 --- a/src/Ryujinx.Audio/Input/AudioInputManager.cs +++ b/src/Ryujinx.Audio/Input/AudioInputManager.cs @@ -14,12 +14,12 @@ namespace Ryujinx.Audio.Input /// public class AudioInputManager : IDisposable { - private readonly object _lock = new(); + private readonly Lock _lock = new(); /// /// Lock used for session allocation. /// - private readonly object _sessionLock = new(); + private readonly Lock _sessionLock = new(); /// /// The session ids allocation table. @@ -166,14 +166,14 @@ namespace Ryujinx.Audio.Input /// /// If true, filter disconnected devices /// The list of all audio inputs name - public string[] ListAudioIns(bool filtered) + public static string[] ListAudioIns(bool filtered) { if (filtered) { // TODO: Detect if the driver supports audio input } - return new[] { Constants.DefaultDeviceInputName }; + return [Constants.DefaultDeviceInputName]; } /// diff --git a/src/Ryujinx.Audio/Input/AudioInputSystem.cs b/src/Ryujinx.Audio/Input/AudioInputSystem.cs index 34623b34f..d1d4b0381 100644 --- a/src/Ryujinx.Audio/Input/AudioInputSystem.cs +++ b/src/Ryujinx.Audio/Input/AudioInputSystem.cs @@ -48,7 +48,7 @@ namespace Ryujinx.Audio.Input /// /// The lock of the parent. /// - private readonly object _parentLock; + private readonly Lock _parentLock; /// /// The dispose state. @@ -62,7 +62,7 @@ namespace Ryujinx.Audio.Input /// The lock of the manager /// The hardware device session /// The buffer release event of the audio input - public AudioInputSystem(AudioInputManager manager, object parentLock, IHardwareDeviceSession deviceSession, IWritableEvent bufferEvent) + public AudioInputSystem(AudioInputManager manager, Lock parentLock, IHardwareDeviceSession deviceSession, IWritableEvent bufferEvent) { _manager = manager; _parentLock = parentLock; @@ -91,12 +91,12 @@ namespace Ryujinx.Audio.Input return ResultCode.DeviceNotFound; } - if (configuration.SampleRate != 0 && configuration.SampleRate != Constants.TargetSampleRate) + if (configuration.SampleRate is not 0 and not Constants.TargetSampleRate) { return ResultCode.UnsupportedSampleRate; } - if (configuration.ChannelCount != 0 && configuration.ChannelCount != 1 && configuration.ChannelCount != 2 && configuration.ChannelCount != 6) + if (configuration.ChannelCount is not 0 and not 1 and not 2 and not 6) { return ResultCode.UnsupportedChannelConfiguration; } diff --git a/src/Ryujinx.Audio/Integration/IHardwareDevice.cs b/src/Ryujinx.Audio/Integration/IHardwareDevice.cs index f9ade9dbc..42d543f55 100644 --- a/src/Ryujinx.Audio/Integration/IHardwareDevice.cs +++ b/src/Ryujinx.Audio/Integration/IHardwareDevice.cs @@ -47,7 +47,7 @@ namespace Ryujinx.Audio.Integration { uint channelCount = GetChannelCount(); - Debug.Assert(channelCount > 0 && channelCount <= Constants.ChannelCountMax); + Debug.Assert(channelCount is > 0 and <= Constants.ChannelCountMax); return channelCount != Constants.ChannelCountMax; } diff --git a/src/Ryujinx.Audio/Output/AudioOutputManager.cs b/src/Ryujinx.Audio/Output/AudioOutputManager.cs index 308cd1564..4e2971743 100644 --- a/src/Ryujinx.Audio/Output/AudioOutputManager.cs +++ b/src/Ryujinx.Audio/Output/AudioOutputManager.cs @@ -14,12 +14,12 @@ namespace Ryujinx.Audio.Output /// public class AudioOutputManager : IDisposable { - private readonly object _lock = new(); + private readonly Lock _lock = new(); /// /// Lock used for session allocation. /// - private readonly object _sessionLock = new(); + private readonly Lock _sessionLock = new(); /// /// The session ids allocation table. @@ -165,9 +165,9 @@ namespace Ryujinx.Audio.Output /// Get the list of all audio outputs name. /// /// The list of all audio outputs name - public string[] ListAudioOuts() + public static string[] ListAudioOuts() { - return new[] { Constants.DefaultDeviceOutputName }; + return [Constants.DefaultDeviceOutputName]; } /// diff --git a/src/Ryujinx.Audio/Output/AudioOutputSystem.cs b/src/Ryujinx.Audio/Output/AudioOutputSystem.cs index f9b9bdcf1..3cf6e0722 100644 --- a/src/Ryujinx.Audio/Output/AudioOutputSystem.cs +++ b/src/Ryujinx.Audio/Output/AudioOutputSystem.cs @@ -48,7 +48,7 @@ namespace Ryujinx.Audio.Output /// /// THe lock of the parent. /// - private readonly object _parentLock; + private readonly Lock _parentLock; /// /// The dispose state. @@ -62,7 +62,7 @@ namespace Ryujinx.Audio.Output /// The lock of the manager /// The hardware device session /// The buffer release event of the audio output - public AudioOutputSystem(AudioOutputManager manager, object parentLock, IHardwareDeviceSession deviceSession, IWritableEvent bufferEvent) + public AudioOutputSystem(AudioOutputManager manager, Lock parentLock, IHardwareDeviceSession deviceSession, IWritableEvent bufferEvent) { _manager = manager; _parentLock = parentLock; @@ -91,12 +91,12 @@ namespace Ryujinx.Audio.Output return ResultCode.DeviceNotFound; } - if (configuration.SampleRate != 0 && configuration.SampleRate != Constants.TargetSampleRate) + if (configuration.SampleRate is not 0 and not Constants.TargetSampleRate) { return ResultCode.UnsupportedSampleRate; } - if (configuration.ChannelCount != 0 && configuration.ChannelCount != 1 && configuration.ChannelCount != 2 && configuration.ChannelCount != 6) + if (configuration.ChannelCount is not 0 and not 1 and not 2 and not 6) { return ResultCode.UnsupportedChannelConfiguration; } diff --git a/src/Ryujinx.Audio/Renderer/Device/VirtualDevice.cs b/src/Ryujinx.Audio/Renderer/Device/VirtualDevice.cs index 91956fda6..f5ba9a271 100644 --- a/src/Ryujinx.Audio/Renderer/Device/VirtualDevice.cs +++ b/src/Ryujinx.Audio/Renderer/Device/VirtualDevice.cs @@ -10,14 +10,14 @@ namespace Ryujinx.Audio.Renderer.Device /// /// All the defined virtual devices. /// - public static readonly VirtualDevice[] Devices = new VirtualDevice[5] - { + public static readonly VirtualDevice[] Devices = + [ new("AudioStereoJackOutput", 2, true), new("AudioBuiltInSpeakerOutput", 2, false), new("AudioTvOutput", 6, false), new("AudioUsbDeviceOutput", 2, true), - new("AudioExternalOutput", 6, true), - }; + new("AudioExternalOutput", 6, true) + ]; /// /// The name of the . @@ -58,7 +58,7 @@ namespace Ryujinx.Audio.Renderer.Device /// The new master volume. public void UpdateMasterVolume(float volume) { - Debug.Assert(volume >= 0.0f && volume <= 1.0f); + Debug.Assert(volume is >= 0.0f and <= 1.0f); MasterVolume = volume; } diff --git a/src/Ryujinx.Audio/Renderer/Device/VirtualDeviceSessionRegistry.cs b/src/Ryujinx.Audio/Renderer/Device/VirtualDeviceSessionRegistry.cs index 4ad70619e..5c42ed991 100644 --- a/src/Ryujinx.Audio/Renderer/Device/VirtualDeviceSessionRegistry.cs +++ b/src/Ryujinx.Audio/Renderer/Device/VirtualDeviceSessionRegistry.cs @@ -17,9 +17,7 @@ namespace Ryujinx.Audio.Renderer.Device /// The default . /// /// This is used when the USB device is the default one on older revision. -#pragma warning disable CA1822 // Mark member as static - public VirtualDevice DefaultDevice => VirtualDevice.Devices[0]; -#pragma warning restore CA1822 + public static VirtualDevice DefaultDevice => VirtualDevice.Devices[0]; /// /// The current active . diff --git a/src/Ryujinx.Audio/Renderer/Dsp/AdpcmHelper.cs b/src/Ryujinx.Audio/Renderer/Dsp/AdpcmHelper.cs index 8b497fe2a..1a5802a37 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/AdpcmHelper.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/AdpcmHelper.cs @@ -81,14 +81,14 @@ namespace Ryujinx.Audio.Renderer.Dsp [MethodImpl(MethodImplOptions.AggressiveInlining)] private static short GetCoefficientAtIndex(ReadOnlySpan coefficients, int index) { - if ((uint)index >= (uint)coefficients.Length) + if ((uint)index < (uint)coefficients.Length) { - Logger.Error?.Print(LogClass.AudioRenderer, $"Out of bound read for coefficient at index {index}"); - - return 0; + return coefficients[index]; } - return coefficients[index]; + Logger.Error?.Print(LogClass.AudioRenderer, $"Out of bound read for coefficient at index {index}"); + + return 0; } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandList.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandList.cs index ba19330b6..185d169f0 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandList.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/CommandList.cs @@ -46,7 +46,7 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command SampleRate = sampleRate; BufferCount = mixBufferCount + voiceChannelCountMax; Buffers = mixBuffer; - Commands = new List(); + Commands = []; MemoryManager = memoryManager; _buffersEntryCount = Buffers.Length; diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/DelayCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/DelayCommand.cs index 21cf69504..ecd3c3c93 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/Command/DelayCommand.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/DelayCommand.cs @@ -129,7 +129,6 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command delayFeedbackCrossGain, 0.0f, delayFeedbackBaseGain, delayFeedbackCrossGain, 0.0f, delayFeedbackCrossGain, delayFeedbackCrossGain, delayFeedbackBaseGain); - for (int i = 0; i < sampleCount; i++) { Vector4 channelInput = new() diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/Reverb3dCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/Reverb3dCommand.cs index 58023ac9d..5a65c650d 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/Command/Reverb3dCommand.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/Reverb3dCommand.cs @@ -9,21 +9,29 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command { public class Reverb3dCommand : ICommand { - private static readonly int[] _outputEarlyIndicesTableMono = new int[20] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - private static readonly int[] _targetEarlyDelayLineIndicesTableMono = new int[20] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; - private static readonly int[] _targetOutputFeedbackIndicesTableMono = new int[1] { 0 }; + private static readonly int[] _outputEarlyIndicesTableMono = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ]; + private static readonly int[] _targetEarlyDelayLineIndicesTableMono = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + ]; + private static readonly int[] _targetOutputFeedbackIndicesTableMono = [0]; - private static readonly int[] _outputEarlyIndicesTableStereo = new int[20] { 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 }; - private static readonly int[] _targetEarlyDelayLineIndicesTableStereo = new int[20] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; - private static readonly int[] _targetOutputFeedbackIndicesTableStereo = new int[2] { 0, 1 }; + private static readonly int[] _outputEarlyIndicesTableStereo = [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 + ]; + private static readonly int[] _targetEarlyDelayLineIndicesTableStereo = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + ]; + private static readonly int[] _targetOutputFeedbackIndicesTableStereo = [0, 1]; - private static readonly int[] _outputEarlyIndicesTableQuadraphonic = new int[20] { 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 3, 3, 3 }; - private static readonly int[] _targetEarlyDelayLineIndicesTableQuadraphonic = new int[20] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; - private static readonly int[] _targetOutputFeedbackIndicesTableQuadraphonic = new int[4] { 0, 1, 2, 3 }; + private static readonly int[] _outputEarlyIndicesTableQuadraphonic = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 3, 3, 3 + ]; + private static readonly int[] _targetEarlyDelayLineIndicesTableQuadraphonic = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + ]; + private static readonly int[] _targetOutputFeedbackIndicesTableQuadraphonic = [0, 1, 2, 3]; - private static readonly int[] _outputEarlyIndicesTableSurround = new int[40] { 4, 5, 0, 5, 0, 5, 1, 5, 1, 5, 1, 5, 1, 5, 2, 5, 2, 5, 2, 5, 1, 5, 1, 5, 1, 5, 0, 5, 0, 5, 0, 5, 0, 5, 3, 5, 3, 5, 3, 5 }; - private static readonly int[] _targetEarlyDelayLineIndicesTableSurround = new int[40] { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19 }; - private static readonly int[] _targetOutputFeedbackIndicesTableSurround = new int[6] { 0, 1, 2, 3, -1, 3 }; + private static readonly int[] _outputEarlyIndicesTableSurround = [4, 5, 0, 5, 0, 5, 1, 5, 1, 5, 1, 5, 1, 5, 2, 5, 2, 5, 2, 5, 1, 5, 1, 5, 1, 5, 0, 5, 0, 5, 0, 5, 0, 5, 3, 5, 3, 5, 3, 5 + ]; + private static readonly int[] _targetEarlyDelayLineIndicesTableSurround = [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19 + ]; + private static readonly int[] _targetOutputFeedbackIndicesTableSurround = [0, 1, 2, 3, -1, 3]; public bool Enabled { get; set; } diff --git a/src/Ryujinx.Audio/Renderer/Dsp/Command/ReverbCommand.cs b/src/Ryujinx.Audio/Renderer/Dsp/Command/ReverbCommand.cs index 204570cec..c3d746994 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/Command/ReverbCommand.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/Command/ReverbCommand.cs @@ -9,25 +9,27 @@ namespace Ryujinx.Audio.Renderer.Dsp.Command { public class ReverbCommand : ICommand { - private static readonly int[] _outputEarlyIndicesTableMono = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - private static readonly int[] _targetEarlyDelayLineIndicesTableMono = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - private static readonly int[] _outputIndicesTableMono = new int[4] { 0, 0, 0, 0 }; - private static readonly int[] _targetOutputFeedbackIndicesTableMono = new int[4] { 0, 1, 2, 3 }; + private static readonly int[] _outputEarlyIndicesTableMono = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + private static readonly int[] _targetEarlyDelayLineIndicesTableMono = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + private static readonly int[] _outputIndicesTableMono = [0, 0, 0, 0]; + private static readonly int[] _targetOutputFeedbackIndicesTableMono = [0, 1, 2, 3]; - private static readonly int[] _outputEarlyIndicesTableStereo = new int[10] { 0, 0, 1, 1, 0, 1, 0, 0, 1, 1 }; - private static readonly int[] _targetEarlyDelayLineIndicesTableStereo = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - private static readonly int[] _outputIndicesTableStereo = new int[4] { 0, 0, 1, 1 }; - private static readonly int[] _targetOutputFeedbackIndicesTableStereo = new int[4] { 2, 0, 3, 1 }; + private static readonly int[] _outputEarlyIndicesTableStereo = [0, 0, 1, 1, 0, 1, 0, 0, 1, 1]; + private static readonly int[] _targetEarlyDelayLineIndicesTableStereo = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + private static readonly int[] _outputIndicesTableStereo = [0, 0, 1, 1]; + private static readonly int[] _targetOutputFeedbackIndicesTableStereo = [2, 0, 3, 1]; - private static readonly int[] _outputEarlyIndicesTableQuadraphonic = new int[10] { 0, 0, 1, 1, 0, 1, 2, 2, 3, 3 }; - private static readonly int[] _targetEarlyDelayLineIndicesTableQuadraphonic = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - private static readonly int[] _outputIndicesTableQuadraphonic = new int[4] { 0, 1, 2, 3 }; - private static readonly int[] _targetOutputFeedbackIndicesTableQuadraphonic = new int[4] { 0, 1, 2, 3 }; + private static readonly int[] _outputEarlyIndicesTableQuadraphonic = [0, 0, 1, 1, 0, 1, 2, 2, 3, 3]; + private static readonly int[] _targetEarlyDelayLineIndicesTableQuadraphonic = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + private static readonly int[] _outputIndicesTableQuadraphonic = [0, 1, 2, 3]; + private static readonly int[] _targetOutputFeedbackIndicesTableQuadraphonic = [0, 1, 2, 3]; - private static readonly int[] _outputEarlyIndicesTableSurround = new int[20] { 0, 5, 0, 5, 1, 5, 1, 5, 4, 5, 4, 5, 2, 5, 2, 5, 3, 5, 3, 5 }; - private static readonly int[] _targetEarlyDelayLineIndicesTableSurround = new int[20] { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9 }; - private static readonly int[] _outputIndicesTableSurround = new int[Constants.ChannelCountMax] { 0, 1, 2, 3, 4, 5 }; - private static readonly int[] _targetOutputFeedbackIndicesTableSurround = new int[Constants.ChannelCountMax] { 0, 1, 2, 3, -1, 3 }; + private static readonly int[] _outputEarlyIndicesTableSurround = [0, 5, 0, 5, 1, 5, 1, 5, 4, 5, 4, 5, 2, 5, 2, 5, 3, 5, 3, 5 + ]; + private static readonly int[] _targetEarlyDelayLineIndicesTableSurround = [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9 + ]; + private static readonly int[] _outputIndicesTableSurround = [0, 1, 2, 3, 4, 5]; + private static readonly int[] _targetOutputFeedbackIndicesTableSurround = [0, 1, 2, 3, -1, 3]; public bool Enabled { get; set; } diff --git a/src/Ryujinx.Audio/Renderer/Dsp/ResamplerHelper.cs b/src/Ryujinx.Audio/Renderer/Dsp/ResamplerHelper.cs index e44e9f41e..16048d7ff 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/ResamplerHelper.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/ResamplerHelper.cs @@ -10,7 +10,8 @@ namespace Ryujinx.Audio.Renderer.Dsp public static class ResamplerHelper { #region "Default Quality Lookup Tables" - private static readonly short[] _normalCurveLut0 = { + private static readonly short[] _normalCurveLut0 = + [ 6600, 19426, 6722, 3, 6479, 19424, 6845, 9, 6359, 19419, 6968, 15, 6239, 19412, 7093, 22, 6121, 19403, 7219, 28, 6004, 19391, 7345, 34, 5888, 19377, 7472, 41, 5773, 19361, 7600, 48, 5659, 19342, 7728, 55, 5546, 19321, 7857, 62, 5434, 19298, 7987, 69, 5323, 19273, 8118, 77, @@ -42,10 +43,11 @@ namespace Ryujinx.Audio.Renderer.Dsp 109, 8646, 19148, 4890, 101, 8513, 19183, 4997, 92, 8381, 19215, 5104, 84, 8249, 19245, 5213, 77, 8118, 19273, 5323, 69, 7987, 19298, 5434, 62, 7857, 19321, 5546, 55, 7728, 19342, 5659, 48, 7600, 19361, 5773, 41, 7472, 19377, 5888, 34, 7345, 19391, 6004, 28, 7219, 19403, 6121, - 22, 7093, 19412, 6239, 15, 6968, 19419, 6359, 9, 6845, 19424, 6479, 3, 6722, 19426, 6600, - }; + 22, 7093, 19412, 6239, 15, 6968, 19419, 6359, 9, 6845, 19424, 6479, 3, 6722, 19426, 6600 + ]; - private static readonly short[] _normalCurveLut1 = { + private static readonly short[] _normalCurveLut1 = + [ -68, 32639, 69, -5, -200, 32630, 212, -15, -328, 32613, 359, -26, -450, 32586, 512, -36, -568, 32551, 669, -47, -680, 32507, 832, -58, -788, 32454, 1000, -69, -891, 32393, 1174, -80, -990, 32323, 1352, -92, -1084, 32244, 1536, -103, -1173, 32157, 1724, -115, -1258, 32061, 1919, -128, @@ -77,10 +79,11 @@ namespace Ryujinx.Audio.Renderer.Dsp -180, 2747, 31593, -1554, -167, 2532, 31723, -1486, -153, 2322, 31844, -1414, -140, 2118, 31956, -1338, -128, 1919, 32061, -1258, -115, 1724, 32157, -1173, -103, 1536, 32244, -1084, -92, 1352, 32323, -990, -80, 1174, 32393, -891, -69, 1000, 32454, -788, -58, 832, 32507, -680, -47, 669, 32551, -568, - -36, 512, 32586, -450, -26, 359, 32613, -328, -15, 212, 32630, -200, -5, 69, 32639, -68, - }; + -36, 512, 32586, -450, -26, 359, 32613, -328, -15, 212, 32630, -200, -5, 69, 32639, -68 + ]; - private static readonly short[] _normalCurveLut2 = { + private static readonly short[] _normalCurveLut2 = + [ 3195, 26287, 3329, -32, 3064, 26281, 3467, -34, 2936, 26270, 3608, -38, 2811, 26253, 3751, -42, 2688, 26230, 3897, -46, 2568, 26202, 4046, -50, 2451, 26169, 4199, -54, 2338, 26130, 4354, -58, 2227, 26085, 4512, -63, 2120, 26035, 4673, -67, 2015, 25980, 4837, -72, 1912, 25919, 5004, -76, @@ -112,12 +115,13 @@ namespace Ryujinx.Audio.Renderer.Dsp -98, 5701, 25621, 1531, -92, 5522, 25704, 1622, -87, 5347, 25780, 1716, -81, 5174, 25852, 1813, -76, 5004, 25919, 1912, -72, 4837, 25980, 2015, -67, 4673, 26035, 2120, -63, 4512, 26085, 2227, -58, 4354, 26130, 2338, -54, 4199, 26169, 2451, -50, 4046, 26202, 2568, -46, 3897, 26230, 2688, - -42, 3751, 26253, 2811, -38, 3608, 26270, 2936, -34, 3467, 26281, 3064, -32, 3329, 26287, 3195, - }; + -42, 3751, 26253, 2811, -38, 3608, 26270, 2936, -34, 3467, 26281, 3064, -32, 3329, 26287, 3195 + ]; #endregion #region "High Quality Lookup Tables" - private static readonly short[] _highCurveLut0 = { + private static readonly short[] _highCurveLut0 = + [ -582, -23, 8740, 16386, 8833, 8, -590, 0, -573, -54, 8647, 16385, 8925, 40, -598, -1, -565, -84, 8555, 16383, 9018, 72, -606, -1, -557, -113, 8462, 16379, 9110, 105, -614, -2, -549, -142, 8370, 16375, 9203, 139, -622, -2, -541, -170, 8277, 16369, 9295, 173, -630, -3, @@ -181,10 +185,11 @@ namespace Ryujinx.Audio.Renderer.Dsp -5, -646, 244, 9480, 16354, 8093, -225, -525, -4, -638, 208, 9387, 16362, 8185, -198, -533, -3, -630, 173, 9295, 16369, 8277, -170, -541, -2, -622, 139, 9203, 16375, 8370, -142, -549, -2, -614, 105, 9110, 16379, 8462, -113, -557, -1, -606, 72, 9018, 16383, 8555, -84, -565, - -1, -598, 40, 8925, 16385, 8647, -54, -573, 0, -590, 8, 8833, 16386, 8740, -23, -582, - }; + -1, -598, 40, 8925, 16385, 8647, -54, -573, 0, -590, 8, 8833, 16386, 8740, -23, -582 + ]; - private static readonly short[] _highCurveLut1 = { + private static readonly short[] _highCurveLut1 = + [ -12, 47, -134, 32767, 81, -16, 2, 0, -26, 108, -345, 32760, 301, -79, 17, -1, -40, 168, -552, 32745, 526, -144, 32, -2, -53, 226, -753, 32723, 755, -210, 47, -3, -66, 284, -950, 32694, 989, -277, 63, -5, -78, 340, -1143, 32658, 1226, -346, 79, -6, @@ -248,10 +253,11 @@ namespace Ryujinx.Audio.Renderer.Dsp -9, 113, -486, 1715, 32564, -1514, 447, -101, -8, 96, -415, 1469, 32615, -1331, 394, -90, -6, 79, -346, 1226, 32658, -1143, 340, -78, -5, 63, -277, 989, 32694, -950, 284, -66, -3, 47, -210, 755, 32723, -753, 226, -53, -2, 32, -144, 526, 32745, -552, 168, -40, - -1, 17, -79, 301, 32760, -345, 108, -26, 0, 2, -16, 81, 32767, -134, 47, -12, - }; + -1, 17, -79, 301, 32760, -345, 108, -26, 0, 2, -16, 81, 32767, -134, 47, -12 + ]; - private static readonly short[] _highCurveLut2 = { + private static readonly short[] _highCurveLut2 = + [ 418, -2538, 6118, 24615, 6298, -2563, 417, 0, 420, -2512, 5939, 24611, 6479, -2588, 415, 1, 421, -2485, 5761, 24605, 6662, -2612, 412, 2, 422, -2458, 5585, 24595, 6846, -2635, 409, 3, 423, -2430, 5410, 24582, 7030, -2658, 406, 4, 423, -2402, 5236, 24565, 7216, -2680, 403, 5, @@ -315,8 +321,8 @@ namespace Ryujinx.Audio.Renderer.Dsp 7, 395, -2721, 7591, 24523, 4893, -2343, 423, 6, 399, -2701, 7403, 24546, 5064, -2373, 423, 5, 403, -2680, 7216, 24565, 5236, -2402, 423, 4, 406, -2658, 7030, 24582, 5410, -2430, 423, 3, 409, -2635, 6846, 24595, 5585, -2458, 422, 2, 412, -2612, 6662, 24605, 5761, -2485, 421, - 1, 415, -2588, 6479, 24611, 5939, -2512, 420, 0, 417, -2563, 6298, 24615, 6118, -2538, 418, - }; + 1, 415, -2588, 6479, 24611, 5939, -2512, 420, 0, 417, -2563, 6298, 24615, 6118, -2538, 418 + ]; #endregion private static readonly float[] _normalCurveLut0F; diff --git a/src/Ryujinx.Audio/Renderer/Dsp/State/DelayState.cs b/src/Ryujinx.Audio/Renderer/Dsp/State/DelayState.cs index 17ad2a40d..1dfc2d28b 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/State/DelayState.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/State/DelayState.cs @@ -40,7 +40,7 @@ namespace Ryujinx.Audio.Renderer.Dsp.State DelayFeedbackBaseGain = (1.0f - channelSpread) * FeedbackGain; - if (parameter.ChannelCount == 4 || parameter.ChannelCount == 6) + if (parameter.ChannelCount is 4 or 6) { DelayFeedbackCrossGain = channelSpread * 0.5f * FeedbackGain; } diff --git a/src/Ryujinx.Audio/Renderer/Dsp/State/Reverb3dState.cs b/src/Ryujinx.Audio/Renderer/Dsp/State/Reverb3dState.cs index e83e0d5fc..c7e9b8984 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/State/Reverb3dState.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/State/Reverb3dState.cs @@ -6,12 +6,14 @@ namespace Ryujinx.Audio.Renderer.Dsp.State { public struct Reverb3dState { - private readonly float[] _fdnDelayMinTimes = new float[4] { 5.0f, 6.0f, 13.0f, 14.0f }; - private readonly float[] _fdnDelayMaxTimes = new float[4] { 45.704f, 82.782f, 149.94f, 271.58f }; - private readonly float[] _decayDelayMaxTimes1 = new float[4] { 17.0f, 13.0f, 9.0f, 7.0f }; - private readonly float[] _decayDelayMaxTimes2 = new float[4] { 19.0f, 11.0f, 10.0f, 6.0f }; - private readonly float[] _earlyDelayTimes = new float[20] { 0.017136f, 0.059154f, 0.16173f, 0.39019f, 0.42526f, 0.45541f, 0.68974f, 0.74591f, 0.83384f, 0.8595f, 0.0f, 0.075024f, 0.16879f, 0.2999f, 0.33744f, 0.3719f, 0.59901f, 0.71674f, 0.81786f, 0.85166f }; - public readonly float[] EarlyGain = new float[20] { 0.67096f, 0.61027f, 1.0f, 0.35680f, 0.68361f, 0.65978f, 0.51939f, 0.24712f, 0.45945f, 0.45021f, 0.64196f, 0.54879f, 0.92925f, 0.38270f, 0.72867f, 0.69794f, 0.5464f, 0.24563f, 0.45214f, 0.44042f }; + private readonly float[] _fdnDelayMinTimes = [5.0f, 6.0f, 13.0f, 14.0f]; + private readonly float[] _fdnDelayMaxTimes = [45.704f, 82.782f, 149.94f, 271.58f]; + private readonly float[] _decayDelayMaxTimes1 = [17.0f, 13.0f, 9.0f, 7.0f]; + private readonly float[] _decayDelayMaxTimes2 = [19.0f, 11.0f, 10.0f, 6.0f]; + private readonly float[] _earlyDelayTimes = [0.017136f, 0.059154f, 0.16173f, 0.39019f, 0.42526f, 0.45541f, 0.68974f, 0.74591f, 0.83384f, 0.8595f, 0.0f, 0.075024f, 0.16879f, 0.2999f, 0.33744f, 0.3719f, 0.59901f, 0.71674f, 0.81786f, 0.85166f + ]; + public readonly float[] EarlyGain = [0.67096f, 0.61027f, 1.0f, 0.35680f, 0.68361f, 0.65978f, 0.51939f, 0.24712f, 0.45945f, 0.45021f, 0.64196f, 0.54879f, 0.92925f, 0.38270f, 0.72867f, 0.69794f, 0.5464f, 0.24563f, 0.45214f, 0.44042f + ]; public IDelayLine[] FdnDelayLines { get; } public DecayDelay[] DecayDelays1 { get; } diff --git a/src/Ryujinx.Audio/Renderer/Dsp/State/ReverbState.cs b/src/Ryujinx.Audio/Renderer/Dsp/State/ReverbState.cs index f1927b718..db935a325 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/State/ReverbState.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/State/ReverbState.cs @@ -7,8 +7,8 @@ namespace Ryujinx.Audio.Renderer.Dsp.State { public struct ReverbState { - private static readonly float[] _fdnDelayTimes = new float[20] - { + private static readonly float[] _fdnDelayTimes = + [ // Room 53.953247f, 79.192566f, 116.238770f, 130.615295f, // Hall @@ -18,11 +18,11 @@ namespace Ryujinx.Audio.Renderer.Dsp.State // Cathedral 47.03f, 71f, 103f, 170f, // Max delay (Hall is the one with the highest values so identical to Hall) - 53.953247f, 79.192566f, 116.238770f, 170.615295f, - }; + 53.953247f, 79.192566f, 116.238770f, 170.615295f + ]; - private static readonly float[] _decayDelayTimes = new float[20] - { + private static readonly float[] _decayDelayTimes = + [ // Room 7f, 9f, 13f, 17f, // Hall @@ -32,11 +32,11 @@ namespace Ryujinx.Audio.Renderer.Dsp.State // Cathedral 7f, 7f, 13f, 9f, // Max delay (Hall is the one with the highest values so identical to Hall) - 7f, 9f, 13f, 17f, - }; + 7f, 9f, 13f, 17f + ]; - private static readonly float[] _earlyDelayTimes = new float[50] - { + private static readonly float[] _earlyDelayTimes = + [ // Room 0.0f, 3.5f, 2.8f, 3.9f, 2.7f, 13.4f, 7.9f, 8.4f, 9.9f, 12.0f, // Chamber @@ -46,11 +46,11 @@ namespace Ryujinx.Audio.Renderer.Dsp.State // Cathedral 33.1f, 43.3f, 22.8f, 37.9f, 14.9f, 35.3f, 17.9f, 34.2f, 0.0f, 43.3f, // Disabled - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - }; + 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f + ]; - private static readonly float[] _earlyGainBase = new float[50] - { + private static readonly float[] _earlyGainBase = + [ // Room 0.70f, 0.68f, 0.70f, 0.68f, 0.70f, 0.68f, 0.70f, 0.68f, 0.68f, 0.68f, // Chamber @@ -60,11 +60,11 @@ namespace Ryujinx.Audio.Renderer.Dsp.State // Cathedral 0.93f, 0.92f, 0.87f, 0.86f, 0.94f, 0.81f, 0.80f, 0.77f, 0.76f, 0.65f, // Disabled - 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, - }; + 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f + ]; - private static readonly float[] _preDelayTimes = new float[5] - { + private static readonly float[] _preDelayTimes = + [ // Room 12.5f, // Chamber @@ -74,8 +74,8 @@ namespace Ryujinx.Audio.Renderer.Dsp.State // Cathedral 50.0f, // Disabled - 0.0f, - }; + 0.0f + ]; public DelayLine[] FdnDelayLines { get; } public DecayDelay[] DecayDelays { get; } diff --git a/src/Ryujinx.Audio/Renderer/Dsp/UpsamplerHelper.cs b/src/Ryujinx.Audio/Renderer/Dsp/UpsamplerHelper.cs index 5732cdb21..8d833b712 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/UpsamplerHelper.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/UpsamplerHelper.cs @@ -27,6 +27,7 @@ namespace Ryujinx.Audio.Renderer.Dsp { return 1.0f; } + return (MathF.Sin(MathF.PI * x) / (MathF.PI * x)); } @@ -141,6 +142,7 @@ namespace Ryujinx.Audio.Renderer.Dsp state.Phase = (state.Phase + 1) % 6; } + break; case 3.0f: for (int i = 0; i < outputSampleCount; i++) @@ -161,6 +163,7 @@ namespace Ryujinx.Audio.Renderer.Dsp state.Phase = (state.Phase + 1) % 3; } + break; case 1.5f: // Upsample by 3 then decimate by 2. @@ -183,6 +186,7 @@ namespace Ryujinx.Audio.Renderer.Dsp state.Phase = (state.Phase + 1) % 3; } + break; default: throw new ArgumentOutOfRangeException(nameof(state), state.Scale, null); diff --git a/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion1.cs b/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion1.cs index 46686e3b4..73fea4c36 100644 --- a/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion1.cs +++ b/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion1.cs @@ -91,7 +91,7 @@ namespace Ryujinx.Audio.Renderer.Parameter /// Returns true if the channel count is valid. public static bool IsChannelCountValid(int channelCount) { - return channelCount == 1 || channelCount == 2 || channelCount == 4 || channelCount == 6; + return channelCount is 1 or 2 or 4 or 6; } } } diff --git a/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion2.cs b/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion2.cs index 3854c7148..779bc8fb7 100644 --- a/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion2.cs +++ b/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion2.cs @@ -91,7 +91,7 @@ namespace Ryujinx.Audio.Renderer.Parameter /// Returns true if the channel count is valid. public static bool IsChannelCountValid(int channelCount) { - return channelCount == 1 || channelCount == 2 || channelCount == 4 || channelCount == 6; + return channelCount is 1 or 2 or 4 or 6; } } } diff --git a/src/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs b/src/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs index 246889c48..ee2f23479 100644 --- a/src/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs +++ b/src/Ryujinx.Audio/Renderer/Server/AudioRenderSystem.cs @@ -26,7 +26,7 @@ namespace Ryujinx.Audio.Renderer.Server { public class AudioRenderSystem : IDisposable { - private readonly object _lock = new(); + private readonly Lock _lock = new(); private AudioRendererRenderingDevice _renderingDevice; private AudioRendererExecutionMode _executionMode; @@ -436,7 +436,7 @@ namespace Ryujinx.Audio.Renderer.Server return result; } - PoolMapper poolMapper = new PoolMapper(_processHandle, _memoryPools, _behaviourContext.IsMemoryPoolForceMappingEnabled()); + PoolMapper poolMapper = new(_processHandle, _memoryPools, _behaviourContext.IsMemoryPoolForceMappingEnabled()); result = stateUpdater.UpdateVoices(_voiceContext, poolMapper); @@ -532,13 +532,13 @@ namespace Ryujinx.Audio.Renderer.Server CommandType commandType = command.CommandType; - if (commandType == CommandType.AdpcmDataSourceVersion1 || - commandType == CommandType.AdpcmDataSourceVersion2 || - commandType == CommandType.PcmInt16DataSourceVersion1 || - commandType == CommandType.PcmInt16DataSourceVersion2 || - commandType == CommandType.PcmFloatDataSourceVersion1 || - commandType == CommandType.PcmFloatDataSourceVersion2 || - commandType == CommandType.Performance) + if (commandType is CommandType.AdpcmDataSourceVersion1 or + CommandType.AdpcmDataSourceVersion2 or + CommandType.PcmInt16DataSourceVersion1 or + CommandType.PcmInt16DataSourceVersion2 or + CommandType.PcmFloatDataSourceVersion1 or + CommandType.PcmFloatDataSourceVersion2 or + CommandType.Performance) { break; } diff --git a/src/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs b/src/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs index e334a89f6..6d7db059f 100644 --- a/src/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs +++ b/src/Ryujinx.Audio/Renderer/Server/AudioRendererManager.cs @@ -19,12 +19,12 @@ namespace Ryujinx.Audio.Renderer.Server /// /// Lock used for session allocation. /// - private readonly object _sessionLock = new(); + private readonly Lock _sessionLock = new(); /// /// Lock used to control the running state. /// - private readonly object _audioProcessorLock = new(); + private readonly Lock _audioProcessorLock = new(); /// /// The session ids allocation table. diff --git a/src/Ryujinx.Audio/Renderer/Server/CommandBuffer.cs b/src/Ryujinx.Audio/Renderer/Server/CommandBuffer.cs index 4c353b37e..d65897e45 100644 --- a/src/Ryujinx.Audio/Renderer/Server/CommandBuffer.cs +++ b/src/Ryujinx.Audio/Renderer/Server/CommandBuffer.cs @@ -467,7 +467,6 @@ namespace Ryujinx.Audio.Renderer.Server } } - /// /// Generate a new . /// diff --git a/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion2.cs b/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion2.cs index ef1326924..1e9b6c53e 100644 --- a/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion2.cs +++ b/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion2.cs @@ -20,7 +20,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(PerformanceCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -32,7 +32,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(ClearMixBufferCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); float costPerBuffer = 668.8f; float baseCost = 193.2f; @@ -48,7 +48,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(BiquadFilterCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -62,7 +62,7 @@ namespace Ryujinx.Audio.Renderer.Server { const float CostPerSample = 7.245f; - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); int volumeCount = 0; @@ -79,7 +79,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(MixRampCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -91,7 +91,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(DepopPrepareCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -103,7 +103,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(VolumeRampCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -115,7 +115,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(PcmInt16DataSourceCommandVersion1 command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); float costPerSample = 1195.5f; float baseCost = 7797.0f; @@ -131,7 +131,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(AdpcmDataSourceCommandVersion1 command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); float costPerSample = 3564.1f; float baseCost = 6225.5f; @@ -147,7 +147,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(DepopForMixBuffersCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -159,7 +159,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(CopyMixBufferCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -171,7 +171,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(MixCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -183,7 +183,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(DelayCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -234,7 +234,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(ReverbCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -285,7 +285,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(Reverb3dCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -335,7 +335,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(AuxiliaryBufferCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -357,7 +357,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(VolumeCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -369,7 +369,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(CircularBufferSinkCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); float costPerBuffer = 1726.0f; float baseCost = 1369.7f; @@ -385,7 +385,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(DownMixSurroundToStereoCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -397,7 +397,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(UpsampleCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); if (_sampleCount == 160) { @@ -409,8 +409,8 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(DeviceSinkCommand command) { - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); - Debug.Assert(command.InputCount == 2 || command.InputCount == 6); + Debug.Assert(_sampleCount is 160 or 240); + Debug.Assert(command.InputCount is 2 or 6); if (command.InputCount == 2) { @@ -433,7 +433,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(PcmFloatDataSourceCommandVersion1 command) { // NOTE: This was added between REV7 and REV8 and for some reasons the estimator v2 was changed... - Debug.Assert(_sampleCount == 160 || _sampleCount == 240); + Debug.Assert(_sampleCount is 160 or 240); float costPerSample = 3490.9f; float baseCost = 10091.0f; diff --git a/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion3.cs b/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion3.cs index 31a5347b4..85e016019 100644 --- a/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion3.cs +++ b/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion3.cs @@ -23,7 +23,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(PerformanceCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -35,7 +35,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(ClearMixBufferCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); float costPerBuffer = 440.68f; float baseCost = 0; @@ -50,7 +50,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(BiquadFilterCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -64,7 +64,7 @@ namespace Ryujinx.Audio.Renderer.Server { float costPerSample = 6.4434f; - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -86,7 +86,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(MixRampCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -103,7 +103,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(VolumeRampCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -115,7 +115,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(PcmInt16DataSourceCommandVersion1 command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); float costPerSample = 710.143f; float baseCost = 7853.286f; @@ -131,7 +131,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(AdpcmDataSourceCommandVersion1 command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); float costPerSample = 3564.1f; float baseCost = 9736.702f; @@ -147,7 +147,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(DepopForMixBuffersCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -159,7 +159,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(CopyMixBufferCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -171,7 +171,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(MixCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -183,7 +183,7 @@ namespace Ryujinx.Audio.Renderer.Server public virtual uint Estimate(DelayCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -233,7 +233,7 @@ namespace Ryujinx.Audio.Renderer.Server public virtual uint Estimate(ReverbCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -283,7 +283,7 @@ namespace Ryujinx.Audio.Renderer.Server public virtual uint Estimate(Reverb3dCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -333,7 +333,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(AuxiliaryBufferCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -355,7 +355,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(VolumeCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -367,7 +367,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(CircularBufferSinkCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); float costPerBuffer = 770.26f; float baseCost = 0f; @@ -382,7 +382,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(DownMixSurroundToStereoCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -394,7 +394,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(UpsampleCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -406,8 +406,8 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(DeviceSinkCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); - Debug.Assert(command.InputCount == 2 || command.InputCount == 6); + Debug.Assert(SampleCount is 160 or 240); + Debug.Assert(command.InputCount is 2 or 6); if (command.InputCount == 2) { @@ -429,7 +429,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(PcmFloatDataSourceCommandVersion1 command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); float costPerSample = 3490.9f; float baseCost = 10090.9f; @@ -445,7 +445,7 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(DataSourceVersion2Command command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); (float baseCost, float costPerSample) = GetCostByFormat(SampleCount, command.SampleFormat, command.SrcQuality); @@ -454,7 +454,7 @@ namespace Ryujinx.Audio.Renderer.Server private static (float, float) GetCostByFormat(uint sampleCount, SampleFormat format, SampleRateConversionQuality quality) { - Debug.Assert(sampleCount == 160 || sampleCount == 240); + Debug.Assert(sampleCount is 160 or 240); switch (format) { @@ -546,7 +546,7 @@ namespace Ryujinx.Audio.Renderer.Server private uint EstimateLimiterCommandCommon(LimiterParameter parameter, bool enabled) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -596,14 +596,14 @@ namespace Ryujinx.Audio.Renderer.Server public uint Estimate(LimiterCommandVersion1 command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); return EstimateLimiterCommandCommon(command.Parameter, command.IsEffectEnabled); } public uint Estimate(LimiterCommandVersion2 command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (!command.Parameter.StatisticsEnabled || !command.IsEffectEnabled) { diff --git a/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion4.cs b/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion4.cs index fb357120d..3cb04e385 100644 --- a/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion4.cs +++ b/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion4.cs @@ -12,7 +12,7 @@ namespace Ryujinx.Audio.Renderer.Server public override uint Estimate(MultiTapBiquadFilterCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -24,7 +24,7 @@ namespace Ryujinx.Audio.Renderer.Server public override uint Estimate(CaptureBufferCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { diff --git a/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion5.cs b/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion5.cs index bc9ba073d..fe6103f2b 100644 --- a/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion5.cs +++ b/src/Ryujinx.Audio/Renderer/Server/CommandProcessingTimeEstimatorVersion5.cs @@ -13,7 +13,7 @@ namespace Ryujinx.Audio.Renderer.Server public override uint Estimate(DelayCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -63,7 +63,7 @@ namespace Ryujinx.Audio.Renderer.Server public override uint Estimate(ReverbCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -113,7 +113,7 @@ namespace Ryujinx.Audio.Renderer.Server public override uint Estimate(Reverb3dCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -163,7 +163,7 @@ namespace Ryujinx.Audio.Renderer.Server public override uint Estimate(CompressorCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (SampleCount == 160) { @@ -241,7 +241,7 @@ namespace Ryujinx.Audio.Renderer.Server public override uint Estimate(BiquadFilterAndMixCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (command.HasVolumeRamp) { @@ -265,7 +265,7 @@ namespace Ryujinx.Audio.Renderer.Server public override uint Estimate(MultiTapBiquadFilterAndMixCommand command) { - Debug.Assert(SampleCount == 160 || SampleCount == 240); + Debug.Assert(SampleCount is 160 or 240); if (command.HasVolumeRamp) { diff --git a/src/Ryujinx.Audio/Renderer/Server/MemoryPool/MemoryPoolState.cs b/src/Ryujinx.Audio/Renderer/Server/MemoryPool/MemoryPoolState.cs index d0133622a..50153af37 100644 --- a/src/Ryujinx.Audio/Renderer/Server/MemoryPool/MemoryPoolState.cs +++ b/src/Ryujinx.Audio/Renderer/Server/MemoryPool/MemoryPoolState.cs @@ -1,4 +1,3 @@ -using System; using System.Runtime.InteropServices; using CpuAddress = System.UInt64; using DspAddress = System.UInt64; diff --git a/src/Ryujinx.Audio/Renderer/Server/MemoryPool/PoolMapper.cs b/src/Ryujinx.Audio/Renderer/Server/MemoryPool/PoolMapper.cs index f67d0c124..535e2fd79 100644 --- a/src/Ryujinx.Audio/Renderer/Server/MemoryPool/PoolMapper.cs +++ b/src/Ryujinx.Audio/Renderer/Server/MemoryPool/PoolMapper.cs @@ -257,7 +257,7 @@ namespace Ryujinx.Audio.Renderer.Server.MemoryPool const uint PageSize = 0x1000; - if (inputState != MemoryPoolUserState.RequestAttach && inputState != MemoryPoolUserState.RequestDetach) + if (inputState is not MemoryPoolUserState.RequestAttach and not MemoryPoolUserState.RequestDetach) { return UpdateResult.Success; } diff --git a/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterDestinationVersion1.cs b/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterDestinationVersion1.cs index ce8f33685..5b5242f0d 100644 --- a/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterDestinationVersion1.cs +++ b/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterDestinationVersion1.cs @@ -153,7 +153,7 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter /// The volume for the given destination. public float GetMixVolume(int destinationIndex) { - Debug.Assert(destinationIndex >= 0 && destinationIndex < Constants.MixBufferCountMax); + Debug.Assert(destinationIndex is >= 0 and < Constants.MixBufferCountMax); return MixBufferVolume[destinationIndex]; } @@ -165,7 +165,7 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter /// The volume for the given destination. public float GetMixVolumePrev(int destinationIndex) { - Debug.Assert(destinationIndex >= 0 && destinationIndex < Constants.MixBufferCountMax); + Debug.Assert(destinationIndex is >= 0 and < Constants.MixBufferCountMax); return PreviousMixBufferVolume[destinationIndex]; } diff --git a/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterDestinationVersion2.cs b/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterDestinationVersion2.cs index 5f96ef3aa..1a4a38e44 100644 --- a/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterDestinationVersion2.cs +++ b/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterDestinationVersion2.cs @@ -160,7 +160,7 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter /// The volume for the given destination. public float GetMixVolume(int destinationIndex) { - Debug.Assert(destinationIndex >= 0 && destinationIndex < Constants.MixBufferCountMax); + Debug.Assert(destinationIndex is >= 0 and < Constants.MixBufferCountMax); return MixBufferVolume[destinationIndex]; } @@ -172,7 +172,7 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter /// The volume for the given destination. public float GetMixVolumePrev(int destinationIndex) { - Debug.Assert(destinationIndex >= 0 && destinationIndex < Constants.MixBufferCountMax); + Debug.Assert(destinationIndex is >= 0 and < Constants.MixBufferCountMax); return PreviousMixBufferVolume[destinationIndex]; } diff --git a/src/Ryujinx.Audio/Renderer/Server/StateUpdater.cs b/src/Ryujinx.Audio/Renderer/Server/StateUpdater.cs index f8d87f2d1..9c4d1243a 100644 --- a/src/Ryujinx.Audio/Renderer/Server/StateUpdater.cs +++ b/src/Ryujinx.Audio/Renderer/Server/StateUpdater.cs @@ -86,9 +86,9 @@ namespace Ryujinx.Audio.Renderer.Server PoolMapper.UpdateResult updateResult = mapper.Update(ref memoryPool, in parameter, ref outStatus); - if (updateResult != PoolMapper.UpdateResult.Success && - updateResult != PoolMapper.UpdateResult.MapError && - updateResult != PoolMapper.UpdateResult.UnmapError) + if (updateResult is not PoolMapper.UpdateResult.Success and + not PoolMapper.UpdateResult.MapError and + not PoolMapper.UpdateResult.UnmapError) { if (updateResult != PoolMapper.UpdateResult.InvalidParameter) { diff --git a/src/Ryujinx.Audio/Renderer/Server/Upsampler/UpsamplerManager.cs b/src/Ryujinx.Audio/Renderer/Server/Upsampler/UpsamplerManager.cs index dbc2c9b3f..8b3f39439 100644 --- a/src/Ryujinx.Audio/Renderer/Server/Upsampler/UpsamplerManager.cs +++ b/src/Ryujinx.Audio/Renderer/Server/Upsampler/UpsamplerManager.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using System.Threading; namespace Ryujinx.Audio.Renderer.Server.Upsampler { @@ -16,7 +17,7 @@ namespace Ryujinx.Audio.Renderer.Server.Upsampler /// /// Global lock of the object. /// - private readonly object _lock = new(); + private readonly Lock _lock = new(); /// /// The upsamplers instances. diff --git a/src/Ryujinx.Audio/Renderer/Server/Voice/WaveBuffer.cs b/src/Ryujinx.Audio/Renderer/Server/Voice/WaveBuffer.cs index a9946ba44..1c76e7280 100644 --- a/src/Ryujinx.Audio/Renderer/Server/Voice/WaveBuffer.cs +++ b/src/Ryujinx.Audio/Renderer/Server/Voice/WaveBuffer.cs @@ -20,7 +20,6 @@ namespace Ryujinx.Audio.Renderer.Server.Voice /// Only used by . public AddressInfo ContextAddressInfo; - /// /// First sample to play of the wavebuffer. /// diff --git a/src/Ryujinx.Audio/Renderer/Utils/FileHardwareDevice.cs b/src/Ryujinx.Audio/Renderer/Utils/FileHardwareDevice.cs index bc2313ccf..008a067f1 100644 --- a/src/Ryujinx.Audio/Renderer/Utils/FileHardwareDevice.cs +++ b/src/Ryujinx.Audio/Renderer/Utils/FileHardwareDevice.cs @@ -27,7 +27,7 @@ namespace Ryujinx.Audio.Renderer.Utils private void UpdateHeader() { - var writer = new BinaryWriter(_stream); + BinaryWriter writer = new(_stream); long currentPos = writer.Seek(0, SeekOrigin.Current); diff --git a/src/Ryujinx.Audio/Ryujinx.Audio.csproj b/src/Ryujinx.Audio/Ryujinx.Audio.csproj index 8901bbf59..92e0fe93f 100644 --- a/src/Ryujinx.Audio/Ryujinx.Audio.csproj +++ b/src/Ryujinx.Audio/Ryujinx.Audio.csproj @@ -1,7 +1,6 @@  - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.BuildValidationTasks/IValidationTask.cs b/src/Ryujinx.BuildValidationTasks/IValidationTask.cs new file mode 100644 index 000000000..682d79a0a --- /dev/null +++ b/src/Ryujinx.BuildValidationTasks/IValidationTask.cs @@ -0,0 +1,7 @@ +namespace Ryujinx.BuildValidationTasks +{ + public interface IValidationTask + { + public bool Execute(string projectPath, bool isGitRunner); + } +} diff --git a/src/Ryujinx.BuildValidationTasks/LocalesValidationTask.cs b/src/Ryujinx.BuildValidationTasks/LocalesValidationTask.cs new file mode 100644 index 000000000..17f9be5a0 --- /dev/null +++ b/src/Ryujinx.BuildValidationTasks/LocalesValidationTask.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Encodings.Web; +using System.Text.Json; + +namespace Ryujinx.BuildValidationTasks +{ + public class LocalesValidationTask : IValidationTask + { + static readonly JsonSerializerOptions _jsonOptions = new() + { + WriteIndented = true, + NewLine = "\n", + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + + public LocalesValidationTask() { } + + public bool Execute(string projectPath, bool isGitRunner) + { + Console.WriteLine("Running Locale Validation Task..."); + + string path = projectPath + "assets/locales.json"; + string data; + + using (StreamReader sr = new(path)) + { + data = sr.ReadToEnd(); + } + + LocalesJson json; + + if (isGitRunner && data.Contains("\r\n")) + throw new FormatException("locales.json is using CRLF line endings! It should be using LF line endings, build locally to fix..."); + + try + { + json = JsonSerializer.Deserialize(data); + + } + catch (JsonException e) + { + throw new JsonException(e.Message); //shorter and easier stacktrace + } + + bool encounteredIssue = false; + + for (int i = 0; i < json.Locales.Count; i++) + { + LocalesEntry locale = json.Locales[i]; + + foreach (string langCode in json.Languages.Where(lang => !locale.Translations.ContainsKey(lang))) + { + encounteredIssue = true; + + if (!isGitRunner) + { + locale.Translations.Add(langCode, string.Empty); + Console.WriteLine($"Added '{langCode}' to Locale '{locale.ID}'"); + } + else + { + Console.WriteLine($"Missing '{langCode}' in Locale '{locale.ID}'!"); + } + } + + foreach (string langCode in json.Languages.Where(lang => locale.Translations.ContainsKey(lang) && lang != "en_US" && locale.Translations[lang] == locale.Translations["en_US"])) + { + encounteredIssue = true; + + if (!isGitRunner) + { + locale.Translations[langCode] = string.Empty; + Console.WriteLine($"Lanugage '{langCode}' is a duplicate of en_US in Locale '{locale.ID}'! Resetting it..."); + } + else + { + Console.WriteLine($"Lanugage '{langCode}' is a duplicate of en_US in Locale '{locale.ID}'!"); + } + } + + locale.Translations = locale.Translations.OrderBy(pair => pair.Key).ToDictionary(pair => pair.Key, pair => pair.Value); + json.Locales[i] = locale; + } + + if (isGitRunner && encounteredIssue) + throw new JsonException("1 or more locales are invalid!"); + + string jsonString = JsonSerializer.Serialize(json, _jsonOptions); + + using (StreamWriter sw = new(path)) + { + sw.Write(jsonString); + } + + Console.WriteLine("Finished Locale Validation Task!"); + + return true; + } + + struct LocalesJson + { + public List Languages { get; set; } + public List Locales { get; set; } + } + + struct LocalesEntry + { + public string ID { get; set; } + public Dictionary Translations { get; set; } + } + } +} diff --git a/src/Ryujinx.BuildValidationTasks/Program.cs b/src/Ryujinx.BuildValidationTasks/Program.cs new file mode 100644 index 000000000..ed1cee490 --- /dev/null +++ b/src/Ryujinx.BuildValidationTasks/Program.cs @@ -0,0 +1,37 @@ +using System; +using System.IO; +using System.Linq; + +namespace Ryujinx.BuildValidationTasks +{ + public class Program + { + static void Main(string[] args) + { + // Display the number of command line arguments. + if (args.Length == 0) + throw new ArgumentException("Error: too few arguments!"); + + string path = args[0]; + + if (string.IsNullOrEmpty(path)) + throw new ArgumentException("Error: path is null or empty!"); + + if (!Path.Exists(path)) + throw new FileLoadException($"path {{{path}}} does not exist!"); + + path = Path.GetFullPath(path); + + if (!Directory.GetDirectories(path).Contains($"{path}src")) + throw new FileLoadException($"path {{{path}}} is not a valid ryujinx project!"); + + bool isGitRunner = path.Contains("runner") || path.Contains("D:\\a\\Ryujinx\\Ryujinx"); + if (isGitRunner) + Console.WriteLine("Is Git Runner!"); + + // Run tasks + // Pass extra info needed in the task constructors + new LocalesValidationTask().Execute(path, isGitRunner); + } + } +} diff --git a/src/Ryujinx.BuildValidationTasks/Ryujinx.BuildValidationTasks.csproj b/src/Ryujinx.BuildValidationTasks/Ryujinx.BuildValidationTasks.csproj new file mode 100644 index 000000000..c9fea9313 --- /dev/null +++ b/src/Ryujinx.BuildValidationTasks/Ryujinx.BuildValidationTasks.csproj @@ -0,0 +1,17 @@ + + + + Exe + + + + + + + + + \ No newline at end of file diff --git a/src/Ryujinx.Common/AsyncWorkQueue.cs b/src/Ryujinx.Common/AsyncWorkQueue.cs index abb5867b0..e3f91c891 100644 --- a/src/Ryujinx.Common/AsyncWorkQueue.cs +++ b/src/Ryujinx.Common/AsyncWorkQueue.cs @@ -34,7 +34,7 @@ namespace Ryujinx.Common { try { - foreach (var item in _queue.GetConsumingEnumerable(_cts.Token)) + foreach (T item in _queue.GetConsumingEnumerable(_cts.Token)) { _workerAction(item); } diff --git a/src/Ryujinx.Common/Collections/IntervalTree.cs b/src/Ryujinx.Common/Collections/IntervalTree.cs index f804bca91..27503c5b7 100644 --- a/src/Ryujinx.Common/Collections/IntervalTree.cs +++ b/src/Ryujinx.Common/Collections/IntervalTree.cs @@ -106,7 +106,7 @@ namespace Ryujinx.Common.Collections /// A list of all RangeNodes sorted by Key Order public List> AsList() { - List> list = new(); + List> list = []; AddToList(Root, list); @@ -122,7 +122,7 @@ namespace Ryujinx.Common.Collections /// /// The node to search for RangeNodes within /// The list to add RangeNodes to - private void AddToList(IntervalTreeNode node, List> list) + private static void AddToList(IntervalTreeNode node, List> list) { if (node == null) { @@ -163,6 +163,7 @@ namespace Ryujinx.Common.Collections return node; } } + return null; } @@ -173,7 +174,7 @@ namespace Ryujinx.Common.Collections /// End of the range /// Overlaps array to place results in /// Overlaps count to update - private void GetValues(IntervalTreeNode node, TKey start, TKey end, ref TValue[] overlaps, ref int overlapCount) + private static void GetValues(IntervalTreeNode node, TKey start, TKey end, ref TValue[] overlaps, ref int overlapCount) { if (node == null || start.CompareTo(node.Max) >= 0) { @@ -313,6 +314,7 @@ namespace Ryujinx.Common.Collections return node; } } + IntervalTreeNode newNode = new(start, end, value, parent); if (newNode.Parent == null) { diff --git a/src/Ryujinx.Common/Collections/IntrusiveRedBlackTree.cs b/src/Ryujinx.Common/Collections/IntrusiveRedBlackTree.cs index 9e56f707b..423cd22c8 100644 --- a/src/Ryujinx.Common/Collections/IntrusiveRedBlackTree.cs +++ b/src/Ryujinx.Common/Collections/IntrusiveRedBlackTree.cs @@ -64,6 +64,7 @@ namespace Ryujinx.Common.Collections return node; } } + return null; } @@ -112,6 +113,7 @@ namespace Ryujinx.Common.Collections return node; } } + newNode.Parent = parent; if (parent == null) { @@ -125,6 +127,7 @@ namespace Ryujinx.Common.Collections { parent.Right = newNode; } + Count++; return newNode; } @@ -274,6 +277,7 @@ namespace Ryujinx.Common.Collections return node; } } + return null; } } diff --git a/src/Ryujinx.Common/Collections/IntrusiveRedBlackTreeImpl.cs b/src/Ryujinx.Common/Collections/IntrusiveRedBlackTreeImpl.cs index 49f97223a..abd3723fe 100644 --- a/src/Ryujinx.Common/Collections/IntrusiveRedBlackTreeImpl.cs +++ b/src/Ryujinx.Common/Collections/IntrusiveRedBlackTreeImpl.cs @@ -39,12 +39,14 @@ namespace Ryujinx.Common.Collections { return Minimum(node.Right); } + T parent = node.Parent; while (parent != null && node == parent.Right) { node = parent; parent = parent.Parent; } + return parent; } @@ -59,12 +61,14 @@ namespace Ryujinx.Common.Collections { return Maximum(node.Left); } + T parent = node.Parent; while (parent != null && node == parent.Left) { node = parent; parent = parent.Parent; } + return parent; } @@ -120,6 +124,7 @@ namespace Ryujinx.Common.Collections RotateLeft(ParentOf(ptr)); sibling = RightOf(ParentOf(ptr)); } + if (ColorOf(LeftOf(sibling)) == Black && ColorOf(RightOf(sibling)) == Black) { SetColor(sibling, Red); @@ -134,6 +139,7 @@ namespace Ryujinx.Common.Collections RotateRight(sibling); sibling = RightOf(ParentOf(ptr)); } + SetColor(sibling, ColorOf(ParentOf(ptr))); SetColor(ParentOf(ptr), Black); SetColor(RightOf(sibling), Black); @@ -152,6 +158,7 @@ namespace Ryujinx.Common.Collections RotateRight(ParentOf(ptr)); sibling = LeftOf(ParentOf(ptr)); } + if (ColorOf(RightOf(sibling)) == Black && ColorOf(LeftOf(sibling)) == Black) { SetColor(sibling, Red); @@ -166,6 +173,7 @@ namespace Ryujinx.Common.Collections RotateLeft(sibling); sibling = LeftOf(ParentOf(ptr)); } + SetColor(sibling, ColorOf(ParentOf(ptr))); SetColor(ParentOf(ptr), Black); SetColor(LeftOf(sibling), Black); @@ -174,6 +182,7 @@ namespace Ryujinx.Common.Collections } } } + SetColor(ptr, Black); } @@ -200,6 +209,7 @@ namespace Ryujinx.Common.Collections balanceNode = ParentOf(balanceNode); RotateLeft(balanceNode); } + SetColor(ParentOf(balanceNode), Black); SetColor(ParentOf(ParentOf(balanceNode)), Red); RotateRight(ParentOf(ParentOf(balanceNode))); @@ -223,12 +233,14 @@ namespace Ryujinx.Common.Collections balanceNode = ParentOf(balanceNode); RotateRight(balanceNode); } + SetColor(ParentOf(balanceNode), Black); SetColor(ParentOf(ParentOf(balanceNode)), Red); RotateLeft(ParentOf(ParentOf(balanceNode))); } } } + SetColor(Root, Black); } @@ -242,6 +254,7 @@ namespace Ryujinx.Common.Collections { node.Right.Parent = node; } + T nodeParent = ParentOf(node); right.Parent = nodeParent; if (nodeParent == null) @@ -256,6 +269,7 @@ namespace Ryujinx.Common.Collections { nodeParent.Right = right; } + right.Left = node; node.Parent = right; } @@ -271,6 +285,7 @@ namespace Ryujinx.Common.Collections { node.Left.Parent = node; } + T nodeParent = ParentOf(node); left.Parent = nodeParent; if (nodeParent == null) @@ -285,6 +300,7 @@ namespace Ryujinx.Common.Collections { nodeParent.Left = left; } + left.Right = node; node.Parent = left; } diff --git a/src/Ryujinx.Common/Collections/TreeDictionary.cs b/src/Ryujinx.Common/Collections/TreeDictionary.cs index 5379d353c..af104d268 100644 --- a/src/Ryujinx.Common/Collections/TreeDictionary.cs +++ b/src/Ryujinx.Common/Collections/TreeDictionary.cs @@ -78,6 +78,7 @@ namespace Ryujinx.Common.Collections { return node.Key; } + return default; } @@ -94,6 +95,7 @@ namespace Ryujinx.Common.Collections { return node.Key; } + return default; } @@ -111,6 +113,7 @@ namespace Ryujinx.Common.Collections return successor != null ? successor.Key : default; } + return default; } @@ -128,6 +131,7 @@ namespace Ryujinx.Common.Collections return predecessor != null ? predecessor.Key : default; } + return default; } @@ -139,7 +143,7 @@ namespace Ryujinx.Common.Collections /// List to add the tree pairs into public List> AsLevelOrderList() { - List> list = new(); + List> list = []; Queue> nodes = new(); @@ -147,6 +151,7 @@ namespace Ryujinx.Common.Collections { nodes.Enqueue(this.Root); } + while (nodes.TryDequeue(out Node node)) { list.Add(new KeyValuePair(node.Key, node.Value)); @@ -154,11 +159,13 @@ namespace Ryujinx.Common.Collections { nodes.Enqueue(node.Left); } + if (node.Right != null) { nodes.Enqueue(node.Right); } } + return list; } @@ -168,7 +175,7 @@ namespace Ryujinx.Common.Collections /// A list of all KeyValuePairs sorted by Key Order public List> AsList() { - List> list = new(); + List> list = []; AddToList(Root, list); @@ -184,7 +191,7 @@ namespace Ryujinx.Common.Collections /// /// The node to search for nodes within /// The list to add node to - private void AddToList(Node node, List> list) + private static void AddToList(Node node, List> list) { if (node == null) { @@ -225,6 +232,7 @@ namespace Ryujinx.Common.Collections return node; } } + return null; } @@ -274,6 +282,7 @@ namespace Ryujinx.Common.Collections return node; } } + Node newNode = new(key, value, parent); if (newNode.Parent == null) { @@ -287,6 +296,7 @@ namespace Ryujinx.Common.Collections { parent.Right = newNode; } + Count++; return newNode; } @@ -392,6 +402,7 @@ namespace Ryujinx.Common.Collections ptr = parent; parent = parent.Parent; } + return parent; } } @@ -400,6 +411,7 @@ namespace Ryujinx.Common.Collections return tmp; } } + return null; } @@ -444,6 +456,7 @@ namespace Ryujinx.Common.Collections ptr = parent; parent = parent.Parent; } + return parent; } } @@ -452,6 +465,7 @@ namespace Ryujinx.Common.Collections return tmp; } } + return null; } @@ -502,6 +516,7 @@ namespace Ryujinx.Common.Collections { return node.Key.Equals(item.Key) && node.Value.Equals(item.Value); } + return false; } @@ -588,6 +603,7 @@ namespace Ryujinx.Common.Collections { queue.Enqueue(node.Left); } + if (null != node.Right) { queue.Enqueue(node.Right); diff --git a/src/Ryujinx.Common/Configuration/AppDataManager.cs b/src/Ryujinx.Common/Configuration/AppDataManager.cs index ca8e389ba..cb26be2d5 100644 --- a/src/Ryujinx.Common/Configuration/AppDataManager.cs +++ b/src/Ryujinx.Common/Configuration/AppDataManager.cs @@ -280,6 +280,7 @@ namespace Ryujinx.Common.Configuration { Logger.Error?.Print(LogClass.Application, $"Unable to resolve the symlink for Ryujinx application data: {symlinkException}. Follow the symlink at {correctApplicationDataDirectoryPath} and move your data back to the Application Support folder."); } + return; } @@ -304,6 +305,7 @@ namespace Ryujinx.Common.Configuration { Logger.Error?.Print(LogClass.Application, $"Unable to resolve the symlink for Ryujinx application data: {symlinkException}. Follow the symlink at {correctApplicationDataDirectoryPath} and move your data back to the Application Support folder."); } + return; } diff --git a/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs b/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs index bae6e35de..f3a9e1646 100644 --- a/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs +++ b/src/Ryujinx.Common/Configuration/AspectRatioExtensions.cs @@ -36,6 +36,8 @@ namespace Ryujinx.Common.Configuration }; } + + public static float ToFloatY(this AspectRatio aspectRatio) { return aspectRatio switch diff --git a/src/Ryujinx.Common/Configuration/DirtyHack.cs b/src/Ryujinx.Common/Configuration/DirtyHack.cs new file mode 100644 index 000000000..ae3416a27 --- /dev/null +++ b/src/Ryujinx.Common/Configuration/DirtyHack.cs @@ -0,0 +1,62 @@ +using Gommon; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Ryujinx.Common.Configuration +{ + [Flags] + public enum DirtyHack : byte + { + Xc2MenuSoftlockFix = 1, + // ShaderTranslationDelay = 2 + NifmServiceDisableIsAnyInternetRequestAccepted = 3 + } + + public readonly struct EnabledDirtyHack(DirtyHack hack, int value) + { + public DirtyHack Hack => hack; + public int Value => value; + + + + public ulong Pack() => Raw.PackBitFields(PackedFormat); + + public static EnabledDirtyHack Unpack(ulong packedHack) + { + uint[] unpackedFields = packedHack.UnpackBitFields(PackedFormat); + // ReSharper disable once PatternAlwaysMatches + if (unpackedFields is not [uint hack, uint value]) + throw new Exception("The unpack operation on the integer resulted in an invalid unpacked result."); + + return new EnabledDirtyHack((DirtyHack)hack, (int)value); + } + + private uint[] Raw => [(uint)Hack, (uint)Value.CoerceAtLeast(0)]; + + public static readonly byte[] PackedFormat = [8, 32]; + } + + public class DirtyHacks : Dictionary + { + public DirtyHacks(IEnumerable hacks) + => hacks.ForEach(edh => Add(edh.Hack, edh.Value)); + + public DirtyHacks(ulong[] packedHacks) : this(packedHacks.Select(EnabledDirtyHack.Unpack)) { } + + public ulong[] PackEntries() + => Entries.Select(it => it.Pack()).ToArray(); + + public EnabledDirtyHack[] Entries + => this + .Select(it => new EnabledDirtyHack(it.Key, it.Value)) + .ToArray(); + + public static implicit operator DirtyHacks(EnabledDirtyHack[] hacks) => new(hacks); + public static implicit operator DirtyHacks(ulong[] packedHacks) => new(packedHacks); + + public new int this[DirtyHack hack] => TryGetValue(hack, out int value) ? value : -1; + + public bool IsEnabled(DirtyHack hack) => ContainsKey(hack); + } +} diff --git a/src/Ryujinx.Common/Configuration/Hid/Controller/GenericControllerInputConfig.cs b/src/Ryujinx.Common/Configuration/Hid/Controller/GenericControllerInputConfig.cs index e6fe74d53..c99da6f4a 100644 --- a/src/Ryujinx.Common/Configuration/Hid/Controller/GenericControllerInputConfig.cs +++ b/src/Ryujinx.Common/Configuration/Hid/Controller/GenericControllerInputConfig.cs @@ -78,5 +78,10 @@ namespace Ryujinx.Common.Configuration.Hid.Controller /// Controller Rumble Settings /// public RumbleConfigController Rumble { get; set; } + + /// + /// Controller LED Settings + /// + public LedConfigController Led { get; set; } } } diff --git a/src/Ryujinx.Common/Configuration/Hid/Controller/JoyconConfigControllerStick.cs b/src/Ryujinx.Common/Configuration/Hid/Controller/JoyconConfigControllerStick.cs index 608681551..70af4071d 100644 --- a/src/Ryujinx.Common/Configuration/Hid/Controller/JoyconConfigControllerStick.cs +++ b/src/Ryujinx.Common/Configuration/Hid/Controller/JoyconConfigControllerStick.cs @@ -1,6 +1,8 @@ namespace Ryujinx.Common.Configuration.Hid.Controller { - public class JoyconConfigControllerStick where TButton : unmanaged where TStick : unmanaged + public class JoyconConfigControllerStick + where TButton : unmanaged + where TStick : unmanaged { public TStick Joystick { get; set; } public bool InvertStickX { get; set; } diff --git a/src/Ryujinx.Common/Configuration/Hid/Controller/LedConfigController.cs b/src/Ryujinx.Common/Configuration/Hid/Controller/LedConfigController.cs new file mode 100644 index 000000000..5edeff0ac --- /dev/null +++ b/src/Ryujinx.Common/Configuration/Hid/Controller/LedConfigController.cs @@ -0,0 +1,25 @@ +namespace Ryujinx.Common.Configuration.Hid.Controller +{ + public class LedConfigController + { + /// + /// Enable LED color changing by the emulator + /// + public bool EnableLed { get; set; } + + /// + /// Ignores the color and disables the LED entirely. + /// + public bool TurnOffLed { get; set; } + + /// + /// Ignores the color and uses the rainbow color functionality for the LED. + /// + public bool UseRainbow { get; set; } + + /// + /// Packed RGB int of the color + /// + public uint LedColor { get; set; } + } +} diff --git a/src/Ryujinx.Common/Configuration/Hid/InputConfig.cs b/src/Ryujinx.Common/Configuration/Hid/InputConfig.cs index a93b721ad..ccf9ead16 100644 --- a/src/Ryujinx.Common/Configuration/Hid/InputConfig.cs +++ b/src/Ryujinx.Common/Configuration/Hid/InputConfig.cs @@ -21,6 +21,11 @@ namespace Ryujinx.Common.Configuration.Hid /// public string Id { get; set; } + /// + /// Controller name + /// + public string Name { get; set; } + /// /// Controller's Type /// diff --git a/src/Ryujinx.Common/Configuration/Hid/KeyboardHotkeys.cs b/src/Ryujinx.Common/Configuration/Hid/KeyboardHotkeys.cs index 6b8152b9d..efdb422e7 100644 --- a/src/Ryujinx.Common/Configuration/Hid/KeyboardHotkeys.cs +++ b/src/Ryujinx.Common/Configuration/Hid/KeyboardHotkeys.cs @@ -13,5 +13,7 @@ namespace Ryujinx.Common.Configuration.Hid public Key VolumeDown { get; set; } public Key CustomVSyncIntervalIncrement { get; set; } public Key CustomVSyncIntervalDecrement { get; set; } + public Key TurboMode { get; set; } + public bool TurboModeWhileHeld { get; set; } } } diff --git a/src/Ryujinx.Common/Configuration/ModMetadata.cs b/src/Ryujinx.Common/Configuration/ModMetadata.cs index 174320d0a..6bc9482ad 100644 --- a/src/Ryujinx.Common/Configuration/ModMetadata.cs +++ b/src/Ryujinx.Common/Configuration/ModMetadata.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Common.Configuration public ModMetadata() { - Mods = new List(); + Mods = []; } } } diff --git a/src/Ryujinx.Common/Configuration/ScalingFilter.cs b/src/Ryujinx.Common/Configuration/ScalingFilter.cs index 1c6a74b3a..474685d49 100644 --- a/src/Ryujinx.Common/Configuration/ScalingFilter.cs +++ b/src/Ryujinx.Common/Configuration/ScalingFilter.cs @@ -9,5 +9,6 @@ namespace Ryujinx.Common.Configuration Bilinear, Nearest, Fsr, + Area, } } diff --git a/src/Ryujinx.Common/Configuration/VSyncMode.cs b/src/Ryujinx.Common/Configuration/VSyncMode.cs index ca93b5e1c..21505bf2a 100644 --- a/src/Ryujinx.Common/Configuration/VSyncMode.cs +++ b/src/Ryujinx.Common/Configuration/VSyncMode.cs @@ -6,4 +6,16 @@ namespace Ryujinx.Common.Configuration Unbounded, Custom } + + public static class VSyncModeExtensions + { + public static VSyncMode Next(this VSyncMode vsync, bool customEnabled = false) => + vsync switch + { + VSyncMode.Switch => customEnabled ? VSyncMode.Custom : VSyncMode.Unbounded, + VSyncMode.Unbounded => VSyncMode.Switch, + VSyncMode.Custom => VSyncMode.Unbounded, + _ => VSyncMode.Switch + }; + } } diff --git a/src/Ryujinx.Common/Extensions/SequenceReaderExtensions.cs b/src/Ryujinx.Common/Extensions/SequenceReaderExtensions.cs index 79b5d743b..c4b33ab0d 100644 --- a/src/Ryujinx.Common/Extensions/SequenceReaderExtensions.cs +++ b/src/Ryujinx.Common/Extensions/SequenceReaderExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Buffers; using System.Diagnostics; +using System.IO; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -16,15 +17,15 @@ namespace Ryujinx.Common.Extensions /// The path and name of the file to create and dump to public static void DumpToFile(this ref SequenceReader reader, string fileFullName) { - var initialConsumed = reader.Consumed; + long initialConsumed = reader.Consumed; reader.Rewind(initialConsumed); - using (var fileStream = System.IO.File.Create(fileFullName, 4096, System.IO.FileOptions.None)) + using (FileStream fileStream = System.IO.File.Create(fileFullName, 4096, System.IO.FileOptions.None)) { while (reader.End == false) { - var span = reader.CurrentSpan; + ReadOnlySpan span = reader.CurrentSpan; fileStream.Write(span); reader.Advance(span.Length); } @@ -163,7 +164,7 @@ namespace Ryujinx.Common.Extensions // Not enough data in the current segment, try to peek for the data we need. T buffer = default; - Span tempSpan = new Span(&buffer, sizeof(T)); + Span tempSpan = new(&buffer, sizeof(T)); if (!reader.TryCopyTo(tempSpan)) { diff --git a/src/Ryujinx.Common/Extensions/StreamExtensions.cs b/src/Ryujinx.Common/Extensions/StreamExtensions.cs index 4b02781c9..59ff44edc 100644 --- a/src/Ryujinx.Common/Extensions/StreamExtensions.cs +++ b/src/Ryujinx.Common/Extensions/StreamExtensions.cs @@ -8,10 +8,10 @@ namespace Ryujinx.Common public static class StreamExtensions { /// - /// Writes a to this stream. + /// Writes an int span to this stream. /// /// This default implementation converts each buffer value to a stack-allocated - /// byte array, then writes it to the Stream using . + /// byte array, then writes it to the Stream using . /// /// The stream to be written to /// The buffer of values to be written diff --git a/src/Ryujinx.Common/GraphicsDriver/NVAPI/NvapiUnicodeString.cs b/src/Ryujinx.Common/GraphicsDriver/NVAPI/NvapiUnicodeString.cs index f3e0ffd02..5b0992dce 100644 --- a/src/Ryujinx.Common/GraphicsDriver/NVAPI/NvapiUnicodeString.cs +++ b/src/Ryujinx.Common/GraphicsDriver/NVAPI/NvapiUnicodeString.cs @@ -22,7 +22,7 @@ namespace Ryujinx.Common.GraphicsDriver.NVAPI int index = text.IndexOf('\0'); if (index > -1) { - text = text.Remove(index); + text = text[..index]; } return text; diff --git a/src/Ryujinx.Common/Hash128.cs b/src/Ryujinx.Common/Hash128.cs index baee3e7d2..e95a15caa 100644 --- a/src/Ryujinx.Common/Hash128.cs +++ b/src/Ryujinx.Common/Hash128.cs @@ -528,7 +528,7 @@ namespace Ryujinx.Common private static Hash128 Xxh3Len1To3128b(ReadOnlySpan input, ReadOnlySpan secret, ulong seed) { - Debug.Assert(1 <= input.Length && input.Length <= 3); + Debug.Assert(input.Length is >= 1 and <= 3); byte c1 = input[0]; byte c2 = input[input.Length >> 1]; @@ -550,7 +550,7 @@ namespace Ryujinx.Common private static Hash128 Xxh3Len4To8128b(ReadOnlySpan input, ReadOnlySpan secret, ulong seed) { - Debug.Assert(4 <= input.Length && input.Length <= 8); + Debug.Assert(input.Length is >= 4 and <= 8); seed ^= BinaryPrimitives.ReverseEndianness((uint)seed) << 32; @@ -575,7 +575,7 @@ namespace Ryujinx.Common private static Hash128 Xxh3Len9To16128b(ReadOnlySpan input, ReadOnlySpan secret, ulong seed) { - Debug.Assert(9 <= input.Length && input.Length <= 16); + Debug.Assert(input.Length is >= 9 and <= 16); ulong bitFlipL = (BinaryPrimitives.ReadUInt64LittleEndian(secret[32..]) ^ BinaryPrimitives.ReadUInt64LittleEndian(secret[40..])) - seed; ulong bitFlipH = (BinaryPrimitives.ReadUInt64LittleEndian(secret[48..]) ^ BinaryPrimitives.ReadUInt64LittleEndian(secret[56..])) + seed; @@ -647,7 +647,7 @@ namespace Ryujinx.Common private static Hash128 Xxh3Len17To128128b(ReadOnlySpan input, ReadOnlySpan secret, ulong seed) { Debug.Assert(secret.Length >= SecretSizeMin); - Debug.Assert(16 < input.Length && input.Length <= 128); + Debug.Assert(input.Length is > 16 and <= 128); Hash128 acc = new() { @@ -663,10 +663,13 @@ namespace Ryujinx.Common { acc = Xxh128Mix32b(acc, input[48..], input[^64..], secret[96..], seed); } + acc = Xxh128Mix32b(acc, input[32..], input[^48..], secret[64..], seed); } + acc = Xxh128Mix32b(acc, input[16..], input[^32..], secret[32..], seed); } + acc = Xxh128Mix32b(acc, input, input[^16..], secret, seed); Hash128 h128 = new() @@ -683,7 +686,7 @@ namespace Ryujinx.Common private static Hash128 Xxh3Len129To240128b(ReadOnlySpan input, ReadOnlySpan secret, ulong seed) { Debug.Assert(secret.Length >= SecretSizeMin); - Debug.Assert(128 < input.Length && input.Length <= 240); + Debug.Assert(input.Length is > 128 and <= 240); Hash128 acc = new(); diff --git a/src/Ryujinx.UI.Common/Helper/ConsoleHelper.cs b/src/Ryujinx.Common/Helpers/ConsoleHelper.cs similarity index 77% rename from src/Ryujinx.UI.Common/Helper/ConsoleHelper.cs rename to src/Ryujinx.Common/Helpers/ConsoleHelper.cs index 623952b37..2b3c11b1e 100644 --- a/src/Ryujinx.UI.Common/Helper/ConsoleHelper.cs +++ b/src/Ryujinx.Common/Helpers/ConsoleHelper.cs @@ -3,10 +3,28 @@ using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Common.Helper { public static partial class ConsoleHelper { + [SupportedOSPlatform("windows")] + [LibraryImport("kernel32")] + private static partial nint GetConsoleWindow(); + + [SupportedOSPlatform("windows")] + [LibraryImport("user32")] + [return: MarshalAs(UnmanagedType.Bool)] + private static partial bool ShowWindow(nint hWnd, int nCmdShow); + + [SupportedOSPlatform("windows")] + [LibraryImport("user32")] + private static partial nint GetForegroundWindow(); + + [SupportedOSPlatform("windows")] + [LibraryImport("user32")] + [return: MarshalAs(UnmanagedType.Bool)] + private static partial bool SetForegroundWindow(nint hWnd); + public static bool SetConsoleWindowStateSupported => OperatingSystem.IsWindows(); public static void SetConsoleWindowState(bool show) @@ -35,16 +53,11 @@ namespace Ryujinx.UI.Common.Helper return; } + SetForegroundWindow(hWnd); + + hWnd = GetForegroundWindow(); + ShowWindow(hWnd, show ? SW_SHOW : SW_HIDE); } - - [SupportedOSPlatform("windows")] - [LibraryImport("kernel32")] - private static partial nint GetConsoleWindow(); - - [SupportedOSPlatform("windows")] - [LibraryImport("user32")] - [return: MarshalAs(UnmanagedType.Bool)] - private static partial bool ShowWindow(nint hWnd, int nCmdShow); } } diff --git a/src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs b/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs similarity index 91% rename from src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs rename to src/Ryujinx.Common/Helpers/FileAssociationHelper.cs index 9333a1b76..b61dd8ee2 100644 --- a/src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs +++ b/src/Ryujinx.Common/Helpers/FileAssociationHelper.cs @@ -1,5 +1,4 @@ using Microsoft.Win32; -using Ryujinx.Common; using Ryujinx.Common.Logging; using System; using System.Diagnostics; @@ -8,7 +7,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Runtime.Versioning; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Common.Helper { public static partial class FileAssociationHelper { @@ -23,8 +22,8 @@ namespace Ryujinx.UI.Common.Helper [LibraryImport("shell32.dll", SetLastError = true)] public static partial void SHChangeNotify(uint wEventId, uint uFlags, nint dwItem1, nint dwItem2); - public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows()) && !ReleaseInformation.IsFlatHubBuild; - + public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows()); + public static bool AreMimeTypesRegistered { get @@ -93,21 +92,21 @@ namespace Ryujinx.UI.Common.Helper [SupportedOSPlatform("windows")] private static bool AreMimeTypesRegisteredWindows() { - return _fileExtensions.Aggregate(false, + return _fileExtensions.Aggregate(false, (current, ext) => current | CheckRegistering(ext) ); - + static bool CheckRegistering(string ext) { RegistryKey key = Registry.CurrentUser.OpenSubKey(@$"Software\Classes\{ext}"); - var openCmd = key?.OpenSubKey(@"shell\open\command"); - + RegistryKey openCmd = key?.OpenSubKey(@"shell\open\command"); + if (openCmd is null) { return false; } - + string keyValue = (string)openCmd.GetValue(string.Empty); return keyValue is not null && (keyValue.Contains("Ryujinx") || keyValue.Contains(AppDomain.CurrentDomain.FriendlyName)); @@ -117,7 +116,7 @@ namespace Ryujinx.UI.Common.Helper [SupportedOSPlatform("windows")] private static bool InstallWindowsMimeTypes(bool uninstall = false) { - bool registered = _fileExtensions.Aggregate(false, + bool registered = _fileExtensions.Aggregate(false, (current, ext) => current | RegisterExtension(ext, uninstall) ); @@ -125,25 +124,26 @@ namespace Ryujinx.UI.Common.Helper SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, nint.Zero, nint.Zero); return registered; - + static bool RegisterExtension(string ext, bool uninstall = false) { string keyString = @$"Software\Classes\{ext}"; if (uninstall) { - // If the types don't already exist, there's nothing to do and we can call this operation successful. + // If the types don't already exist, there's nothing to do, and we can call this operation successful. if (!AreMimeTypesRegisteredWindows()) { return true; } + Logger.Debug?.Print(LogClass.Application, $"Removing type association {ext}"); Registry.CurrentUser.DeleteSubKeyTree(keyString); Logger.Debug?.Print(LogClass.Application, $"Removed type association {ext}"); } else { - using var key = Registry.CurrentUser.CreateSubKey(keyString); + using RegistryKey key = Registry.CurrentUser.CreateSubKey(keyString); if (key is null) { @@ -151,7 +151,7 @@ namespace Ryujinx.UI.Common.Helper } Logger.Debug?.Print(LogClass.Application, $"Adding type association {ext}"); - using var openCmd = key.CreateSubKey(@"shell\open\command"); + using RegistryKey openCmd = key.CreateSubKey(@"shell\open\command"); openCmd.SetValue(string.Empty, $"\"{Environment.ProcessPath}\" \"%1\""); Logger.Debug?.Print(LogClass.Application, $"Added type association {ext}"); diff --git a/src/Ryujinx.UI.Common/Helper/LinuxHelper.cs b/src/Ryujinx.Common/Helpers/LinuxHelper.cs similarity index 91% rename from src/Ryujinx.UI.Common/Helper/LinuxHelper.cs rename to src/Ryujinx.Common/Helpers/LinuxHelper.cs index b57793791..e342b2151 100644 --- a/src/Ryujinx.UI.Common/Helper/LinuxHelper.cs +++ b/src/Ryujinx.Common/Helpers/LinuxHelper.cs @@ -3,7 +3,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.Versioning; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Common.Helper { [SupportedOSPlatform("linux")] public static class LinuxHelper @@ -24,7 +24,7 @@ namespace Ryujinx.UI.Common.Helper return null; } - foreach (var searchPath in pathVar.Split(":", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) + foreach (string searchPath in pathVar.Split(":", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) { string binaryPath = Path.Combine(searchPath, binary); diff --git a/src/Ryujinx.UI.Common/Helper/ObjectiveC.cs b/src/Ryujinx.Common/Helpers/ObjectiveC.cs similarity index 99% rename from src/Ryujinx.UI.Common/Helper/ObjectiveC.cs rename to src/Ryujinx.Common/Helpers/ObjectiveC.cs index f8f972098..4c2481f6e 100644 --- a/src/Ryujinx.UI.Common/Helper/ObjectiveC.cs +++ b/src/Ryujinx.Common/Helpers/ObjectiveC.cs @@ -1,8 +1,7 @@ -using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Common.Helper { [SupportedOSPlatform("macos")] public static partial class ObjectiveC diff --git a/src/Ryujinx.UI.Common/Helper/OpenHelper.cs b/src/Ryujinx.Common/Helpers/OpenHelper.cs similarity index 92% rename from src/Ryujinx.UI.Common/Helper/OpenHelper.cs rename to src/Ryujinx.Common/Helpers/OpenHelper.cs index 8b0e1f1fd..402e6bcc1 100644 --- a/src/Ryujinx.UI.Common/Helper/OpenHelper.cs +++ b/src/Ryujinx.Common/Helpers/OpenHelper.cs @@ -1,10 +1,11 @@ +using Gommon; using Ryujinx.Common.Logging; using System; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; -namespace Ryujinx.UI.Common.Helper +namespace Ryujinx.Common.Helper { public static partial class OpenHelper { @@ -34,6 +35,8 @@ namespace Ryujinx.UI.Common.Helper } } + public static void OpenFolder(FilePath path) => OpenFolder(path.Path); + public static void LocateFile(string path) { if (File.Exists(path)) @@ -57,7 +60,7 @@ namespace Ryujinx.UI.Common.Helper { ObjectiveC.NSString nsStringPath = new(path); ObjectiveC.Object nsUrl = new("NSURL"); - var urlPtr = nsUrl.GetFromMessage("fileURLWithPath:", nsStringPath); + ObjectiveC.Object urlPtr = nsUrl.GetFromMessage("fileURLWithPath:", nsStringPath); ObjectiveC.Object nsArray = new("NSArray"); ObjectiveC.Object urlArray = nsArray.GetFromMessage("arrayWithObject:", urlPtr); @@ -96,7 +99,7 @@ namespace Ryujinx.UI.Common.Helper { ObjectiveC.NSString nsStringPath = new(url); ObjectiveC.Object nsUrl = new("NSURL"); - var urlPtr = nsUrl.GetFromMessage("URLWithString:", nsStringPath); + ObjectiveC.Object urlPtr = nsUrl.GetFromMessage("URLWithString:", nsStringPath); ObjectiveC.Object nsWorkspace = new("NSWorkspace"); ObjectiveC.Object sharedWorkspace = nsWorkspace.GetFromMessage("sharedWorkspace"); diff --git a/src/Ryujinx.Common/Helpers/Patterns.cs b/src/Ryujinx.Common/Helpers/Patterns.cs new file mode 100644 index 000000000..56b555f48 --- /dev/null +++ b/src/Ryujinx.Common/Helpers/Patterns.cs @@ -0,0 +1,122 @@ +using System.Text.RegularExpressions; + +namespace Ryujinx.Common.Helper +{ + public static partial class Patterns + { + #region Accessors + + public static readonly Regex Numeric = NumericRegex(); + + public static readonly Regex AmdGcn = AmdGcnRegex(); + public static readonly Regex AmdRdna3 = AmdRdna3Regex(); + public static readonly Regex NvidiaConsumerClass = NvidiaConsumerClassRegex(); + + public static readonly Regex DomainLp1Ns = DomainLp1NsRegex(); + public static readonly Regex DomainLp1Lp1Npln = DomainLp1Lp1NplnRegex(); + public static readonly Regex DomainLp1Znc = DomainLp1ZncRegex(); + public static readonly Regex DomainSbApi = DomainSbApiRegex(); + public static readonly Regex DomainSbAccounts = DomainSbAccountsRegex(); + public static readonly Regex DomainAccounts = DomainAccountsRegex(); + + public static readonly Regex Module = ModuleRegex(); + public static readonly Regex FsSdk = FsSdkRegex(); + public static readonly Regex SdkMw = SdkMwRegex(); + + // ReSharper disable once InconsistentNaming + public static readonly Regex CJK = CJKRegex(); + + public static readonly Regex LdnPassphrase = LdnPassphraseRegex(); + + public static readonly Regex CleanText = CleanTextRegex(); + + #endregion + + #region Generated pattern stubs + + #region Numeric validation + + [GeneratedRegex("[0-9]|.")] + internal static partial Regex NumericRegex(); + + #endregion + + #region GPU names + + [GeneratedRegex( + "Radeon (((HD|R(5|7|9|X)) )?((M?[2-6]\\d{2}(\\D|$))|([7-8]\\d{3}(\\D|$))|Fury|Nano))|(Pro Duo)")] + internal static partial Regex AmdGcnRegex(); + + [GeneratedRegex("Radeon ([7-8](\\d{2}\\d?)[MS]|PRO [VW]7(\\d{2}\\d?)|RX 7\\d{3}([MS]?| XTX?| GRE)?)")] + public static partial Regex AmdRdna3Regex(); + + [GeneratedRegex("NVIDIA GeForce (R|G)?TX? (\\d{3}\\d?)M?")] + internal static partial Regex NvidiaConsumerClassRegex(); + + #endregion + + #region DNS blocking + + public static readonly Regex[] BlockedHosts = + [ + DomainLp1Ns, + DomainLp1Lp1Npln, + DomainLp1Znc, + DomainSbApi, + DomainSbAccounts, + DomainAccounts + ]; + + const RegexOptions DnsRegexOpts = + RegexOptions.CultureInvariant | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture; + + [GeneratedRegex(@"^(.*)\-lp1\.(n|s)\.n\.srv\.nintendo\.net$", DnsRegexOpts)] + internal static partial Regex DomainLp1NsRegex(); + + [GeneratedRegex(@"^(.*)\-lp1\.lp1\.t\.npln\.srv\.nintendo\.net$", DnsRegexOpts)] + internal static partial Regex DomainLp1Lp1NplnRegex(); + + [GeneratedRegex(@"^(.*)\-lp1\.(znc|p)\.srv\.nintendo\.net$", DnsRegexOpts)] + internal static partial Regex DomainLp1ZncRegex(); + + [GeneratedRegex(@"^(.*)\-sb\-api\.accounts\.nintendo\.com$", DnsRegexOpts)] + internal static partial Regex DomainSbApiRegex(); + + [GeneratedRegex(@"^(.*)\-sb\.accounts\.nintendo\.com$", DnsRegexOpts)] + internal static partial Regex DomainSbAccountsRegex(); + + [GeneratedRegex(@"^accounts\.nintendo\.com$", DnsRegexOpts)] + internal static partial Regex DomainAccountsRegex(); + + #endregion + + #region Executable information + + [GeneratedRegex(@"[a-z]:[\\/][ -~]{5,}\.nss", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)] + internal static partial Regex ModuleRegex(); + + [GeneratedRegex(@"sdk_version: ([0-9.]*)")] + internal static partial Regex FsSdkRegex(); + + [GeneratedRegex(@"SDK MW[ -~]*")] + internal static partial Regex SdkMwRegex(); + + #endregion + + #region CJK + + [GeneratedRegex( + "\\p{IsHangulJamo}|\\p{IsCJKRadicalsSupplement}|\\p{IsCJKSymbolsandPunctuation}|\\p{IsEnclosedCJKLettersandMonths}|\\p{IsCJKCompatibility}|\\p{IsCJKUnifiedIdeographsExtensionA}|\\p{IsCJKUnifiedIdeographs}|\\p{IsHangulSyllables}|\\p{IsCJKCompatibilityForms}")] + private static partial Regex CJKRegex(); + + #endregion + + [GeneratedRegex("Ryujinx-[0-9a-f]{8}")] + private static partial Regex LdnPassphraseRegex(); + + [GeneratedRegex(@"[^\u0000\u0009\u000A\u000D\u0020-\uFFFF]..")] + private static partial Regex CleanTextRegex(); + + #endregion + } +} diff --git a/src/Ryujinx.Common/Helpers/RefEvent.cs b/src/Ryujinx.Common/Helpers/RefEvent.cs new file mode 100644 index 000000000..5487135ce --- /dev/null +++ b/src/Ryujinx.Common/Helpers/RefEvent.cs @@ -0,0 +1,58 @@ +using Gommon; +using System.Collections.Generic; +using System.Threading; + +namespace Ryujinx.Common.Helper +{ + public class RefEvent + { + public delegate void Handler(ref T arg); + + private readonly Lock _subLock = new(); + private readonly List _subscriptions = []; + + public bool HasSubscribers + { + get + { + lock (_subLock) + return _subscriptions.Count != 0; + } + } + + public IReadOnlyList Subscriptions + { + get + { + lock (_subLock) + return _subscriptions; + } + } + + public void Add(Handler subscriber) + { + Guard.Require(subscriber, nameof(subscriber)); + lock (_subLock) + _subscriptions.Add(subscriber); + } + + public void Remove(Handler subscriber) + { + Guard.Require(subscriber, nameof(subscriber)); + lock (_subLock) + _subscriptions.Remove(subscriber); + } + + public void Clear() + { + lock (_subLock) + _subscriptions.Clear(); + } + + public void Call(ref T arg) + { + foreach (Handler subscription in Subscriptions) + subscription(ref arg); + } + } +} diff --git a/src/Ryujinx.Common/Helpers/RunningPlatform.cs b/src/Ryujinx.Common/Helpers/RunningPlatform.cs new file mode 100644 index 000000000..8bc7f65aa --- /dev/null +++ b/src/Ryujinx.Common/Helpers/RunningPlatform.cs @@ -0,0 +1,46 @@ +using System; +using System.Runtime.InteropServices; +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable InconsistentNaming + +namespace Ryujinx.Common.Helper +{ + public enum OperatingSystemType + { + MacOS, + Linux, + Windows + } + + public static class RunningPlatform + { + public static readonly OperatingSystemType CurrentOS + = IsMacOS + ? OperatingSystemType.MacOS + : IsWindows + ? OperatingSystemType.Windows + : IsLinux + ? OperatingSystemType.Linux + : throw new PlatformNotSupportedException(); + + public static Architecture Architecture => RuntimeInformation.OSArchitecture; + public static Architecture CurrentProcessArchitecture => RuntimeInformation.ProcessArchitecture; + + public static bool IsMacOS => OperatingSystem.IsMacOS(); + public static bool IsWindows => OperatingSystem.IsWindows(); + public static bool IsLinux => OperatingSystem.IsLinux(); + + public static bool IsArm => Architecture is Architecture.Arm64; + + public static bool IsX64 => Architecture is Architecture.X64; + + public static bool IsIntelMac => IsMacOS && IsX64; + public static bool IsArmMac => IsMacOS && IsArm; + + public static bool IsX64Windows => IsWindows && IsX64; + public static bool IsArmWindows => IsWindows && IsArm; + + public static bool IsX64Linux => IsLinux && IsX64; + public static bool IsArmLinux => IsLinux && IsArmMac; + } +} diff --git a/src/Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs b/src/Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs index b1cc0eae3..a7b4da40f 100644 --- a/src/Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs +++ b/src/Ryujinx.Common/Logging/Formatters/DynamicObjectFormatter.cs @@ -41,7 +41,7 @@ namespace Ryujinx.Common.Logging.Formatters sb.Append('{'); - foreach (var prop in props) + foreach (PropertyInfo prop in props) { sb.Append(prop.Name); sb.Append(": "); @@ -52,7 +52,7 @@ namespace Ryujinx.Common.Logging.Formatters if (array is not null) { - foreach (var item in array) + foreach (object? item in array) { sb.Append(item); sb.Append(", "); diff --git a/src/Ryujinx.Common/Logging/Logger.cs b/src/Ryujinx.Common/Logging/Logger.cs index 26d343969..e6f68599a 100644 --- a/src/Ryujinx.Common/Logging/Logger.cs +++ b/src/Ryujinx.Common/Logging/Logger.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Runtime.CompilerServices; using System.Threading; @@ -131,7 +132,7 @@ namespace Ryujinx.Common.Logging _enabledClasses[index] = true; } - _logTargets = new List(); + _logTargets = []; _time = Stopwatch.StartNew(); @@ -158,20 +159,15 @@ namespace Ryujinx.Common.Logging } private static ILogTarget GetTarget(string targetName) - { - foreach (var target in _logTargets) - { - if (target.Name.Equals(targetName)) - { - return target; - } - } - - return null; - } + => _logTargets.FirstOrDefault(target => target.Name.Equals(targetName)); public static void AddTarget(ILogTarget target) { + if (_logTargets.Any(t => t.Name == target.Name)) + { + return; + } + _logTargets.Add(target); Updated += target.Log; @@ -197,7 +193,7 @@ namespace Ryujinx.Common.Logging _stdErrAdapter.Dispose(); - foreach (var target in _logTargets) + foreach (ILogTarget target in _logTargets) { target.Dispose(); } @@ -207,9 +203,9 @@ namespace Ryujinx.Common.Logging public static IReadOnlyCollection GetEnabledLevels() { - var logs = new[] { Debug, Info, Warning, Error, Guest, AccessLog, Stub, Trace }; + Log?[] logs = [Debug, Info, Warning, Error, Guest, AccessLog, Stub, Trace]; List levels = new(logs.Length); - foreach (var log in logs) + foreach (Log? log in logs) { if (log.HasValue) levels.Add(log.Value.Level); diff --git a/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs b/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs index a9dbe646a..1fcfea4da 100644 --- a/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs +++ b/src/Ryujinx.Common/Logging/Targets/AsyncLogTargetWrapper.cs @@ -27,11 +27,7 @@ namespace Ryujinx.Common.Logging.Targets private readonly int _overflowTimeout; - string ILogTarget.Name { get => _target.Name; } - - public AsyncLogTargetWrapper(ILogTarget target) - : this(target, -1) - { } + string ILogTarget.Name => _target.Name; public AsyncLogTargetWrapper(ILogTarget target, int queueLimit = -1, AsyncLogTargetOverflowAction overflowAction = AsyncLogTargetOverflowAction.Block) { diff --git a/src/Ryujinx.Common/Logging/Targets/ConsoleLogTarget.cs b/src/Ryujinx.Common/Logging/Targets/ConsoleLogTarget.cs index 42ba00cd5..391cc5131 100644 --- a/src/Ryujinx.Common/Logging/Targets/ConsoleLogTarget.cs +++ b/src/Ryujinx.Common/Logging/Targets/ConsoleLogTarget.cs @@ -5,7 +5,7 @@ namespace Ryujinx.Common.Logging.Targets { public class ConsoleLogTarget : ILogTarget { - private readonly ILogFormatter _formatter; + private readonly DefaultLogFormatter _formatter; private readonly string _name; diff --git a/src/Ryujinx.Common/Logging/Targets/FileLogTarget.cs b/src/Ryujinx.Common/Logging/Targets/FileLogTarget.cs index 94e9359c8..181bd489a 100644 --- a/src/Ryujinx.Common/Logging/Targets/FileLogTarget.cs +++ b/src/Ryujinx.Common/Logging/Targets/FileLogTarget.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Common.Logging.Targets public class FileLogTarget : ILogTarget { private readonly StreamWriter _logWriter; - private readonly ILogFormatter _formatter; + private readonly DefaultLogFormatter _formatter; private readonly string _name; string ILogTarget.Name { get => _name; } diff --git a/src/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs b/src/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs index c5bf23cdb..88b324a36 100644 --- a/src/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs +++ b/src/Ryujinx.Common/Logging/Targets/JsonLogTarget.cs @@ -26,7 +26,7 @@ namespace Ryujinx.Common.Logging.Targets public void Log(object sender, LogEventArgs e) { - var logEventArgsJson = LogEventArgsJson.FromLogEventArgs(e); + LogEventArgsJson logEventArgsJson = LogEventArgsJson.FromLogEventArgs(e); JsonHelper.SerializeToStream(_stream, logEventArgsJson, LogEventJsonSerializerContext.Default.LogEventArgsJson); } diff --git a/src/Ryujinx.Common/PreciseSleep/NanosleepEvent.cs b/src/Ryujinx.Common/PreciseSleep/NanosleepEvent.cs index f54fb09c1..962bc2a51 100644 --- a/src/Ryujinx.Common/PreciseSleep/NanosleepEvent.cs +++ b/src/Ryujinx.Common/PreciseSleep/NanosleepEvent.cs @@ -54,6 +54,7 @@ namespace Ryujinx.Common.PreciseSleep // Too many threads on the pool. return false; } + _waitEvent.WaitOne(1); _pool.IgnoreSignal(); diff --git a/src/Ryujinx.Common/PreciseSleep/NanosleepPool.cs b/src/Ryujinx.Common/PreciseSleep/NanosleepPool.cs index c0973dcb3..3569dd968 100644 --- a/src/Ryujinx.Common/PreciseSleep/NanosleepPool.cs +++ b/src/Ryujinx.Common/PreciseSleep/NanosleepPool.cs @@ -124,9 +124,9 @@ namespace Ryujinx.Common.PreciseSleep } } - private readonly object _lock = new(); - private readonly List _threads = new(); - private readonly List _active = new(); + private readonly Lock _lock = new(); + private readonly List _threads = []; + private readonly List _active = []; private readonly Stack _free = new(); private readonly AutoResetEvent _signalTarget; diff --git a/src/Ryujinx.Common/PreciseSleep/WindowsGranularTimer.cs b/src/Ryujinx.Common/PreciseSleep/WindowsGranularTimer.cs index 3bf092704..143c9c8d3 100644 --- a/src/Ryujinx.Common/PreciseSleep/WindowsGranularTimer.cs +++ b/src/Ryujinx.Common/PreciseSleep/WindowsGranularTimer.cs @@ -50,8 +50,8 @@ namespace Ryujinx.Common.SystemInterop private long _lastTicks = PerformanceCounter.ElapsedTicks; private long _lastId; - private readonly object _lock = new(); - private readonly List _waitingObjects = new(); + private readonly Lock _lock = new(); + private readonly List _waitingObjects = []; private WindowsGranularTimer() { diff --git a/src/Ryujinx.Common/ReactiveObject.cs b/src/Ryujinx.Common/ReactiveObject.cs index 8df1e20fe..0e807eb7a 100644 --- a/src/Ryujinx.Common/ReactiveObject.cs +++ b/src/Ryujinx.Common/ReactiveObject.cs @@ -42,8 +42,8 @@ namespace Ryujinx.Common } } } - - public void LogChangesToValue(string valueName, LogClass logClass = LogClass.Configuration) + + public void LogChangesToValue(string valueName, LogClass logClass = LogClass.Configuration) => Event += (_, e) => ReactiveObjectHelper.LogValueChange(logClass, e, valueName); public static implicit operator T(ReactiveObject obj) => obj.Value; @@ -53,11 +53,14 @@ namespace Ryujinx.Common { public static void LogValueChange(LogClass logClass, ReactiveEventArgs eventArgs, string valueName) { + if (eventArgs.AreValuesEqual) + return; + string message = string.Create(CultureInfo.InvariantCulture, $"{valueName} set to: {eventArgs.NewValue}"); Logger.Info?.Print(logClass, message); } - + public static void Toggle(this ReactiveObject rBoolean) => rBoolean.Value = !rBoolean.Value; } @@ -65,5 +68,22 @@ namespace Ryujinx.Common { public T OldValue { get; } = oldValue; public T NewValue { get; } = newValue; + + public bool AreValuesEqual + { + get + { + if (OldValue == null && NewValue == null) + return true; + + if (OldValue == null && NewValue != null) + return false; + + if (OldValue != null && NewValue == null) + return false; + + return OldValue!.Equals(NewValue); + } + } } } diff --git a/src/Ryujinx.Common/ReleaseInformation.cs b/src/Ryujinx.Common/ReleaseInformation.cs index 011d9848a..a5beb1009 100644 --- a/src/Ryujinx.Common/ReleaseInformation.cs +++ b/src/Ryujinx.Common/ReleaseInformation.cs @@ -1,48 +1,42 @@ +using Ryujinx.Common.Utilities; using System; +using System.Net.Http; +using System.Net.Http.Json; using System.Reflection; +using System.Text.Json.Serialization; +using System.Threading.Tasks; namespace Ryujinx.Common { // DO NOT EDIT, filled by CI public static class ReleaseInformation { - private const string FlatHubChannel = "flathub"; private const string CanaryChannel = "canary"; private const string ReleaseChannel = "release"; private const string BuildVersion = "%%RYUJINX_BUILD_VERSION%%"; - public const string BuildGitHash = "%%RYUJINX_BUILD_GIT_HASH%%"; + private const string BuildGitHash = "%%RYUJINX_BUILD_GIT_HASH%%"; private const string ReleaseChannelName = "%%RYUJINX_TARGET_RELEASE_CHANNEL_NAME%%"; private const string ConfigFileName = "%%RYUJINX_CONFIG_FILE_NAME%%"; - public const string ReleaseChannelOwner = "%%RYUJINX_TARGET_RELEASE_CHANNEL_OWNER%%"; - public const string ReleaseChannelSourceRepo = "%%RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO%%"; - public const string ReleaseChannelRepo = "%%RYUJINX_TARGET_RELEASE_CHANNEL_REPO%%"; - public static string ConfigName => !ConfigFileName.StartsWith("%%") ? ConfigFileName : "Config.json"; public static bool IsValid => !BuildGitHash.StartsWith("%%") && !ReleaseChannelName.StartsWith("%%") && - !ReleaseChannelOwner.StartsWith("%%") && - !ReleaseChannelSourceRepo.StartsWith("%%") && - !ReleaseChannelRepo.StartsWith("%%") && !ConfigFileName.StartsWith("%%"); - public static bool IsFlatHubBuild => IsValid && ReleaseChannelOwner.Equals(FlatHubChannel); - public static bool IsCanaryBuild => IsValid && ReleaseChannelName.Equals(CanaryChannel); - + public static bool IsReleaseBuild => IsValid && ReleaseChannelName.Equals(ReleaseChannel); public static string Version => IsValid ? BuildVersion : Assembly.GetEntryAssembly()!.GetCustomAttribute()?.InformationalVersion; public static string GetChangelogUrl(Version currentVersion, Version newVersion) => - IsCanaryBuild - ? $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelSourceRepo}/compare/Canary-{currentVersion}...Canary-{newVersion}" - : $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelSourceRepo}/releases/tag/{newVersion}"; - - public static string GetChangelogForVersion(Version version) => - $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelRepo}/releases/tag/{version}"; + IsCanaryBuild + ? $"https://git.ryujinx.app/ryubing/ryujinx/-/compare/Canary-{currentVersion}...Canary-{newVersion}" + : $"https://git.ryujinx.app/ryubing/ryujinx/-/releases/{newVersion}"; } + + } diff --git a/src/Ryujinx.Common/Ryujinx.Common.csproj b/src/Ryujinx.Common/Ryujinx.Common.csproj index 85d4b58bd..e31d2f3bc 100644 --- a/src/Ryujinx.Common/Ryujinx.Common.csproj +++ b/src/Ryujinx.Common/Ryujinx.Common.csproj @@ -1,10 +1,10 @@ - net8.0 true $(DefineConstants);$(ExtraDefineConstants) $(DefaultItemExcludes);._* + true diff --git a/src/Ryujinx.Common/RyujinxException.cs b/src/Ryujinx.Common/RyujinxException.cs new file mode 100644 index 000000000..590072a5d --- /dev/null +++ b/src/Ryujinx.Common/RyujinxException.cs @@ -0,0 +1,10 @@ +using System; + +namespace Ryujinx.Common +{ + public class RyujinxException : Exception + { + public RyujinxException(string message) : base(message) + { } + } +} diff --git a/src/Ryujinx.Common/SharedConstants.cs b/src/Ryujinx.Common/SharedConstants.cs new file mode 100644 index 000000000..fe7814c67 --- /dev/null +++ b/src/Ryujinx.Common/SharedConstants.cs @@ -0,0 +1,9 @@ +namespace Ryujinx.Common +{ + public static class SharedConstants + { + public const string DefaultLanPlayHost = "ryuldn.vudjun.com"; + public const short LanPlayPort = 30456; + public const string DefaultLanPlayWebHost = "ryuldnweb.vudjun.com"; + } +} diff --git a/src/Ryujinx.Common/SystemInterop/ForceDpiAware.cs b/src/Ryujinx.Common/SystemInterop/ForceDpiAware.cs index 330638171..a89dcd1ad 100644 --- a/src/Ryujinx.Common/SystemInterop/ForceDpiAware.cs +++ b/src/Ryujinx.Common/SystemInterop/ForceDpiAware.cs @@ -57,7 +57,7 @@ namespace Ryujinx.Common.SystemInterop { string xdgSessionType = Environment.GetEnvironmentVariable("XDG_SESSION_TYPE")?.ToLower(); - if (xdgSessionType == null || xdgSessionType == "x11") + if (xdgSessionType is null or "x11") { nint display = XOpenDisplay(null); string dpiString = Marshal.PtrToStringAnsi(XGetDefault(display, "Xft", "dpi")); @@ -65,6 +65,7 @@ namespace Ryujinx.Common.SystemInterop { userDpiScale = XDisplayWidth(display, 0) * 25.4 / XDisplayWidthMM(display, 0); } + _ = XCloseDisplay(display); } else if (xdgSessionType == "wayland") diff --git a/src/Ryujinx.Common/SystemInterop/StdErrAdapter.cs b/src/Ryujinx.Common/SystemInterop/StdErrAdapter.cs index a04c404d8..4936cd874 100644 --- a/src/Ryujinx.Common/SystemInterop/StdErrAdapter.cs +++ b/src/Ryujinx.Common/SystemInterop/StdErrAdapter.cs @@ -12,8 +12,8 @@ namespace Ryujinx.Common.SystemInterop public partial class StdErrAdapter : IDisposable { private bool _disposable; - private Stream _pipeReader; - private Stream _pipeWriter; + private FileStream _pipeReader; + private FileStream _pipeWriter; private CancellationTokenSource _cancellationTokenSource; private Task _worker; @@ -46,7 +46,7 @@ namespace Ryujinx.Common.SystemInterop [SupportedOSPlatform("macos")] private async Task EventWorkerAsync(CancellationToken cancellationToken) { - using TextReader reader = new StreamReader(_pipeReader, leaveOpen: true); + using StreamReader reader = new(_pipeReader, leaveOpen: true); string line; while (cancellationToken.IsCancellationRequested == false && (line = await reader.ReadLineAsync(cancellationToken)) != null) { @@ -92,13 +92,12 @@ namespace Ryujinx.Common.SystemInterop [SupportedOSPlatform("linux")] [SupportedOSPlatform("macos")] - private static Stream CreateFileDescriptorStream(int fd) + private static FileStream CreateFileDescriptorStream(int fd) { return new FileStream( new SafeFileHandle(fd, ownsHandle: true), FileAccess.ReadWrite ); } - } } diff --git a/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs b/src/Ryujinx.Common/TitleIDs.cs similarity index 59% rename from src/Ryujinx.UI.Common/DiscordIntegrationModule.cs rename to src/Ryujinx.Common/TitleIDs.cs index 338d28531..d753caa33 100644 --- a/src/Ryujinx.UI.Common/DiscordIntegrationModule.cs +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -1,217 +1,130 @@ -using DiscordRPC; -using Humanizer; -using Humanizer.Localisation; -using Ryujinx.Common; -using Ryujinx.HLE.Loaders.Processes; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Configuration; +using Gommon; using System.Linq; -using System.Text; -namespace Ryujinx.UI.Common +namespace Ryujinx.Common { - public static class DiscordIntegrationModule + public static class TitleIDs { - public static Timestamps StartedAt { get; set; } + public static ReactiveObject> CurrentApplication { get; } = new(); - private static string VersionString - => (ReleaseInformation.IsCanaryBuild ? "Canary " : string.Empty) + $"v{ReleaseInformation.Version}"; + public static string GetDiscordGameAsset(string titleId) + => DiscordGameAssetKeys.Contains(titleId) ? titleId : "game"; - private static readonly string _description = - ReleaseInformation.IsValid - ? $"{VersionString} {ReleaseInformation.ReleaseChannelOwner}/{ReleaseInformation.ReleaseChannelSourceRepo}@{ReleaseInformation.BuildGitHash}" - : "dev build"; - - private const string ApplicationId = "1293250299716173864"; - - private const int ApplicationByteLimit = 128; - private const string Ellipsis = "…"; - - private static DiscordRpcClient _discordClient; - private static RichPresence _discordPresenceMain; - - public static void Initialize() - { - _discordPresenceMain = new RichPresence - { - Assets = new Assets - { - LargeImageKey = "ryujinx", - LargeImageText = TruncateToByteLength(_description) - }, - Details = "Main Menu", - State = "Idling", - Timestamps = StartedAt - }; - - ConfigurationState.Instance.EnableDiscordIntegration.Event += Update; - } - - private static void Update(object sender, ReactiveEventArgs evnt) - { - if (evnt.OldValue != evnt.NewValue) - { - // If the integration was active, disable it and unload everything - if (evnt.OldValue) - { - _discordClient?.Dispose(); - - _discordClient = null; - } - - // If we need to activate it and the client isn't active, initialize it - if (evnt.NewValue && _discordClient == null) - { - _discordClient = new DiscordRpcClient(ApplicationId); - - _discordClient.Initialize(); - _discordClient.SetPresence(_discordPresenceMain); - } - } - } - - public static void SwitchToPlayingState(ApplicationMetadata appMeta, ProcessResult procRes) - { - _discordClient?.SetPresence(new RichPresence - { - Assets = new Assets - { - LargeImageKey = _discordGameAssetKeys.Contains(procRes.ProgramIdText) ? procRes.ProgramIdText : "game", - LargeImageText = TruncateToByteLength($"{appMeta.Title} (v{procRes.DisplayVersion})"), - SmallImageKey = "ryujinx", - SmallImageText = TruncateToByteLength(_description) - }, - Details = TruncateToByteLength($"Playing {appMeta.Title}"), - State = appMeta.LastPlayed.HasValue && appMeta.TimePlayed.TotalSeconds > 5 - ? $"Total play time: {appMeta.TimePlayed.Humanize(2, false, maxUnit: TimeUnit.Hour)}" - : "Never played", - Timestamps = Timestamps.Now - }); - } - - public static void SwitchToMainState() => _discordClient?.SetPresence(_discordPresenceMain); - - private static string TruncateToByteLength(string input) - { - if (Encoding.UTF8.GetByteCount(input) <= ApplicationByteLimit) - { - return input; - } - - // Find the length to trim the string to guarantee we have space for the trailing ellipsis. - int trimLimit = ApplicationByteLimit - Encoding.UTF8.GetByteCount(Ellipsis); - - // Make sure the string is long enough to perform the basic trim. - // Amount of bytes != Length of the string - if (input.Length > trimLimit) - { - // Basic trim to best case scenario of 1 byte characters. - input = input[..trimLimit]; - } - - while (Encoding.UTF8.GetByteCount(input) > trimLimit) - { - // Remove one character from the end of the string at a time. - input = input[..^1]; - } - - return input.TrimEnd() + Ellipsis; - } - - public static void Exit() - { - _discordClient?.Dispose(); - } - - private static readonly string[] _discordGameAssetKeys = + public static readonly string[] DiscordGameAssetKeys = [ - "010055d009f78000", // Fire Emblem: Three Houses - "0100a12011cc8000", // Fire Emblem: Shadow Dragon + //All games are in Alphabetical order by Game name. + + //Dragon Quest Franchise + "010008900705c000", // Dragon Quest Builders + "010042000a986000", // Dragon Quest Builders 2 + + //Fire Emblem Franchise "0100a6301214e000", // Fire Emblem Engage + "0100a12011cc8000", // Fire Emblem: Shadow Dragon + "010055d009f78000", // Fire Emblem: Three Houses "0100f15003e64000", // Fire Emblem Warriors "010071f0143ea000", // Fire Emblem Warriors: Three Hopes - - "01007e3006dda000", // Kirby Star Allies + + //Kirby Franchise "01004d300c5ae000", // Kirby and the Forgotten Land - "01006b601380e000", // Kirby's Return to Dream Land Deluxe - "01003fb00c5a8000", // Super Kirby Clash - "0100227010460000", // Kirby Fighters 2 "0100a8e016236000", // Kirby's Dream Buffet - + "0100227010460000", // Kirby Fighters 2 + "01006b601380e000", // Kirby's Return to Dream Land Deluxe + "01007e3006dda000", // Kirby Star Allies + "01003fb00c5a8000", // Super Kirby Clash + + + //The Zelda Franchise + "01000b900d8b0000", // Cadence of Hyrule + "0100ae00096ea000", // Hyrule Warriors: Definitive Edition + "01002b00111a2000", // Hyrule Warriors: Age of Calamity "01007ef00011e000", // The Legend of Zelda: Breath of the Wild "01006bb00c6f0000", // The Legend of Zelda: Link's Awakening "01002da013484000", // The Legend of Zelda: Skyward Sword HD "0100f2c0115b6000", // The Legend of Zelda: Tears of the Kingdom "01008cf01baac000", // The Legend of Zelda: Echoes of Wisdom - "01000b900d8b0000", // Cadence of Hyrule - "0100ae00096ea000", // Hyrule Warriors: Definitive Edition - "01002b00111a2000", // Hyrule Warriors: Age of Calamity + + //Luigi Franchise "010048701995e000", // Luigi's Mansion 2 HD "0100dca0064a6000", // Luigi's Mansion 3 + //Metroid Franchise "010093801237c000", // Metroid Dread "010012101468c000", // Metroid Prime Remastered - "0100000000010000", // SUPER MARIO ODYSSEY - "0100ea80032ea000", // Super Mario Bros. U Deluxe - "01009b90006dc000", // Super Mario Maker 2 - "010049900f546000", // Super Mario 3D All-Stars - "010049900F546001", // ^ 64 - "010049900F546002", // ^ Sunshine - "010049900F546003", // ^ Galaxy - "010028600ebda000", // Super Mario 3D World + Bowser's Fury - "010015100b514000", // Super Mario Bros. Wonder - "0100152000022000", // Mario Kart 8 Deluxe - "010036b0034e4000", // Super Mario Party - "01006fe013472000", // Mario Party Superstars - "0100965017338000", // Super Mario Party Jamboree + //Monster Hunter Franchise + "0100770008dd8000", // Monster Hunter Generations Ultimate + "0100b04011742000", // Monster Hunter Rise + + //Mario Franchise + "010021d00812a000", // Arcade Archives VS. SUPER MARIO BROS. "01006d0017f7a000", // Mario & Luigi: Brothership + "010003000e146000", // Mario & Sonic at the Olympic Games Tokyo 2020 "010067300059a000", // Mario + Rabbids: Kingdom Battle "0100317013770000", // Mario + Rabbids: Sparks of Hope + "0100c9c00e25c000", // Mario Golf: Super Rush + "0100152000022000", // Mario Kart 8 Deluxe + "01006fe013472000", // Mario Party Superstars + "010019401051c000", // Mario Strikers: Battle League + "0100bde00862a000", // Mario Tennis Aces + "0100b99019412000", // Mario vs. Donkey Kong + "010049900f546000", // Super Mario 3D All-Stars + "010028600ebda000", // Super Mario 3D World + Bowser's Fury + "010049900F546001", // Super Mario 64 + "0100ea80032ea000", // Super Mario Bros. U Deluxe + "010015100b514000", // Super Mario Bros. Wonder + "010049900F546003", // Super Mario Galaxy + "01009b90006dc000", // Super Mario Maker 2 + "0100000000010000", // SUPER MARIO ODYSSEY + "010036b0034e4000", // Super Mario Party + "0100965017338000", // Super Mario Party Jamboree + "0100bc0018138000", // Super Mario RPG + "010049900F546002", // Super Mario Sunshine "0100a3900c3e2000", // Paper Mario: The Origami King "0100ecd018ebe000", // Paper Mario: The Thousand-Year Door - "0100bc0018138000", // Super Mario RPG - "0100bde00862a000", // Mario Tennis Aces - "0100c9c00e25c000", // Mario Golf: Super Rush - "010019401051c000", // Mario Strikers: Battle League - "010003000e146000", // Mario & Sonic at the Olympic Games Tokyo 2020 - "0100b99019412000", // Mario vs. Donkey Kong + //Pikmin Franchise "0100aa80194b0000", // Pikmin 1 "0100d680194b2000", // Pikmin 2 "0100f4c009322000", // Pikmin 3 Deluxe "0100b7c00933a000", // Pikmin 4 - "010003f003a34000", // Pokémon: Let's Go Pikachu! - "0100187003a36000", // Pokémon: Let's Go Eevee! - "0100abf008968000", // Pokémon Sword - "01008db008c2c000", // Pokémon Shield + //The Pokémon Franchise + "0100f4300bf2c000", // New Pokémon Snap "0100000011d90000", // Pokémon Brilliant Diamond - "010018e011d92000", // Pokémon Shining Pearl "01001f5010dfa000", // Pokémon Legends: Arceus + "01003d200baa2000", // Pokémon Mystery Dungeon - Rescue Team DX "0100a3d008c5c000", // Pokémon Scarlet + "01008db008c2c000", // Pokémon Shield + "010018e011d92000", // Pokémon Shining Pearl + "0100abf008968000", // Pokémon Sword "01008f6008c5e000", // Pokémon Violet "0100b3f000be2000", // Pokkén Tournament DX - "0100f4300bf2c000", // New Pokémon Snap + "0100187003a36000", // Pokémon: Let's Go Eevee! + "010003f003a34000", // Pokémon: Let's Go Pikachu! - "01003bc0000a0000", // Splatoon 2 (US) + //Splatoon Franchise "0100f8f0000a2000", // Splatoon 2 (EU) "01003c700009c000", // Splatoon 2 (JP) + "01003bc0000a0000", // Splatoon 2 (US) "0100c2500fc20000", // Splatoon 3 "0100ba0018500000", // Splatoon 3: Splatfest World Premiere - "010040600c5ce000", // Tetris 99 - "0100277011f1a000", // Super Mario Bros. 35 - "0100ad9012510000", // PAC-MAN 99 - "0100ccf019c8c000", // F-ZERO 99 - "0100d870045b6000", // NES - Nintendo Switch Online - "01008d300c50c000", // SNES - Nintendo Switch Online - "0100c9a00ece6000", // N64 - Nintendo Switch Online - "0100e0601c632000", // N64 - Nintendo Switch Online 18+ + //NSO Membership games "0100c62011050000", // GB - Nintendo Switch Online "010012f017576000", // GBA - Nintendo Switch Online + "0100c9a00ece6000", // N64 - Nintendo Switch Online + "0100e0601c632000", // N64 - Nintendo Switch Online 18+ + "0100d870045b6000", // NES - Nintendo Switch Online + "0100b3c014bda000", // SEGA Genesis - Nintendo Switch Online + "01008d300c50c000", // SNES - Nintendo Switch Online + "0100ccf019c8c000", // F-ZERO 99 + "0100ad9012510000", // PAC-MAN 99 + "010040600c5ce000", // Tetris 99 + "0100277011f1a000", // Super Mario Bros. 35 + //Misc Nintendo 1st party games "01000320000cc000", // 1-2 Switch "0100300012f2a000", // Advance Wars 1+2: Re-Boot Camp "01006f8002326000", // Animal Crossing: New Horizons @@ -220,53 +133,81 @@ namespace Ryujinx.UI.Common "0100c1f0051b6000", // Donkey Kong Country: Tropical Freeze "0100ed000d390000", // Dr. Kawashima's Brain Training "010067b017588000", // Endless Ocean Luminous - "0100d2f00d5c0000", // Nintendo Switch Sports "01006b5012b32000", // Part Time UFO "0100704000B3A000", // Snipperclips "01006a800016e000", // Super Smash Bros. Ultimate "0100a9400c9c2000", // Tokyo Mirage Sessions #FE Encore + //Bayonetta Franchise "010076f0049a2000", // Bayonetta "01007960049a0000", // Bayonetta 2 "01004a4010fea000", // Bayonetta 3 "0100cf5010fec000", // Bayonetta Origins: Cereza and the Lost Demon + //Persona Franchise "0100dcd01525a000", // Persona 3 Portable - "010062b01525c000", // Persona 4 Golden "010075a016a3a000", // Persona 4 Arena Ultimax + "010062b01525c000", // Persona 4 Golden "01005ca01580e000", // Persona 5 Royal "0100801011c3e000", // Persona 5 Strikers "010087701b092000", // Persona 5 Tactica - "01009aa000faa000", // Sonic Mania + //Sonic Franchise "01004ad014bf0000", // Sonic Frontiers + "01009aa000faa000", // Sonic Mania "01005ea01c0fc000", // SONIC X SHADOW GENERATIONS "01005ea01c0fc001", // ^ + //Xenoblade Franchise + "0100ff500e34a000", // Xenoblade Chronicles - Definitive Edition + "0100e95004038000", // Xenoblade Chronicles 2 + "010074f013262000", // Xenoblade Chronicles 3 + "0100453019aa8000", // Xenoblade Chronicles: X Definitive Edition + + //Misc Games "010056e00853a000", // A Hat in Time + "0100fd1014726000", // Baldurs Gate: Dark Alliance + "01008c2019598000", // Bluey: The Video Game + "010096f00ff22000", // Borderlands 2: Game of the Year Edition + "010007400ff24000", // Borderlands: The Pre-Sequel Ultimate Edition + "0100c6800b934000", // Brawlhalla "0100dbf01000a000", // Burnout Paradise Remastered "0100744001588000", // Cars 3: Driven to Win "0100b41013c82000", // Cruis'n Blast + "010085900337e000", // Death Squared "01001b300b9be000", // Diablo III: Eternal Collection + "010027400cdc6000", // Divinity Original 2 - Definitive Edition "01008c8012920000", // Dying Light Platinum Edition + "01001cc01b2d4000", // Goat Simulator 3 + "01003620068ea000", // Hand of Fate 2 + "0100f7e00c70e000", // Hogwarts Legacy + "010085500130a000", // Lego City: Undercover "010073c01af34000", // LEGO Horizon Adventures - "0100770008dd8000", // Monster Hunter Generations Ultimate - "0100b04011742000", // Monster Hunter Rise + "0100d71004694000", // Minecraft + "01007430037f6000", // Monopoly "0100853015e86000", // No Man's Sky "01007bb017812000", // Portal "0100abd01785c000", // Portal 2 "01008e200c5c2000", // Muse Dash "01007820196a6000", // Red Dead Redemption + "0100e8300a67a000", // Risk "01002f7013224000", // Rune Factory 5 "01008d100d43e000", // Saints Row IV "0100de600beee000", // Saints Row: The Third - The Full Package "01001180021fa000", // Shovel Knight: Specter of Torment + "0100e1D01eb2e000", // Squeakross: Home Squeak Home + "0100e65002bb8000", // Stardew Valley "0100d7a01b7a2000", // Star Wars: Bounty Hunter "0100800015926000", // Suika Game + "01007ad00013e000", // Super Bomberman R "0100e46006708000", // Terraria + "0100605008268000", // Titan Quest "01000a10041ea000", // The Elder Scrolls V: Skyrim "010057a01e4d4000", // TSUKIHIME -A piece of blue glass moon- "010080b00ad66000", // Undertale + "010069401adb8000", // Unicorn Overlord + "01005c600ac68000", // Valkyria Chronicles 4 + "0100534009ff2000", // Yonder - The cloud catcher chronicles ]; } } diff --git a/src/Ryujinx.UI.Common/UserError.cs b/src/Ryujinx.Common/UI/UserError.cs similarity index 96% rename from src/Ryujinx.UI.Common/UserError.cs rename to src/Ryujinx.Common/UI/UserError.cs index 706971efa..cdcc42eac 100644 --- a/src/Ryujinx.UI.Common/UserError.cs +++ b/src/Ryujinx.Common/UI/UserError.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common +namespace Ryujinx.Common.UI { /// /// Represent a common error that could be reported to the user by the emulator. diff --git a/src/Ryujinx.Common/Utilities/BitUtils.cs b/src/Ryujinx.Common/Utilities/BitUtils.cs index b9dae2e53..c99a8635d 100644 --- a/src/Ryujinx.Common/Utilities/BitUtils.cs +++ b/src/Ryujinx.Common/Utilities/BitUtils.cs @@ -40,5 +40,37 @@ namespace Ryujinx.Common return (value >> 32) | (value << 32); } + + // Never actually written bit packing logic before, so I looked it up. + // This code is from https://gist.github.com/Alan-FGR/04938e93e2bffdf5802ceb218a37c195 + + public static ulong PackBitFields(this uint[] values, byte[] bitFields) + { + ulong retVal = values[0]; //we set the first value right away + for (int f = 1; f < values.Length; f++) + { + retVal <<= bitFields[f]; // we shift the previous value + retVal += values[f];// and add our current value + } + + return retVal; + } + + public static uint[] UnpackBitFields(this ulong packed, byte[] bitFields) + { + int fields = bitFields.Length - 1; // number of fields to unpack + uint[] retArr = new uint[fields + 1]; // init return array + int curPos = 0; // current field bit position (start) + int lastEnd; // position where last field ended + for (int f = fields; f >= 0; f--) // loop from last + { + lastEnd = curPos; // we store where the last value ended + curPos += bitFields[f]; // we get where the current value starts + int leftShift = 64 - curPos; // we figure how much left shift we gotta apply for the other numbers to overflow into oblivion + retArr[f] = (uint)((packed << leftShift) >> leftShift + lastEnd); // we do magic + } + + return retArr; + } } } diff --git a/src/Ryujinx.Common/Utilities/EmbeddedResources.cs b/src/Ryujinx.Common/Utilities/EmbeddedResources.cs index 7530c012a..45bb7d537 100644 --- a/src/Ryujinx.Common/Utilities/EmbeddedResources.cs +++ b/src/Ryujinx.Common/Utilities/EmbeddedResources.cs @@ -19,21 +19,21 @@ namespace Ryujinx.Common public static byte[] Read(string filename) { - var (assembly, path) = ResolveManifestPath(filename); + (Assembly assembly, string path) = ResolveManifestPath(filename); return Read(assembly, path); } public static Task ReadAsync(string filename) { - var (assembly, path) = ResolveManifestPath(filename); + (Assembly assembly, string path) = ResolveManifestPath(filename); return ReadAsync(assembly, path); } public static byte[] Read(Assembly assembly, string filename) { - using var stream = GetStream(assembly, filename); + using Stream stream = GetStream(assembly, filename); if (stream == null) { return null; @@ -44,14 +44,14 @@ namespace Ryujinx.Common public static MemoryOwner ReadFileToRentedMemory(string filename) { - var (assembly, path) = ResolveManifestPath(filename); + (Assembly assembly, string path) = ResolveManifestPath(filename); return ReadFileToRentedMemory(assembly, path); } public static MemoryOwner ReadFileToRentedMemory(Assembly assembly, string filename) { - using var stream = GetStream(assembly, filename); + using Stream stream = GetStream(assembly, filename); return stream is null ? null @@ -60,7 +60,7 @@ namespace Ryujinx.Common public async static Task ReadAsync(Assembly assembly, string filename) { - using var stream = GetStream(assembly, filename); + using Stream stream = GetStream(assembly, filename); if (stream == null) { return null; @@ -71,55 +71,55 @@ namespace Ryujinx.Common public static string ReadAllText(string filename) { - var (assembly, path) = ResolveManifestPath(filename); + (Assembly assembly, string path) = ResolveManifestPath(filename); return ReadAllText(assembly, path); } public static Task ReadAllTextAsync(string filename) { - var (assembly, path) = ResolveManifestPath(filename); + (Assembly assembly, string path) = ResolveManifestPath(filename); return ReadAllTextAsync(assembly, path); } public static string ReadAllText(Assembly assembly, string filename) { - using var stream = GetStream(assembly, filename); + using Stream stream = GetStream(assembly, filename); if (stream == null) { return null; } - using var reader = new StreamReader(stream); + using StreamReader reader = new(stream); return reader.ReadToEnd(); } public async static Task ReadAllTextAsync(Assembly assembly, string filename) { - using var stream = GetStream(assembly, filename); + using Stream stream = GetStream(assembly, filename); if (stream == null) { return null; } - using var reader = new StreamReader(stream); + using StreamReader reader = new(stream); return await reader.ReadToEndAsync(); } public static Stream GetStream(string filename) { - var (assembly, path) = ResolveManifestPath(filename); + (Assembly assembly, string path) = ResolveManifestPath(filename); return GetStream(assembly, path); } public static Stream GetStream(Assembly assembly, string filename) { - var @namespace = assembly.GetName().Name; - var manifestUri = @namespace + "." + filename.Replace('/', '.'); + string @namespace = assembly.GetName().Name; + string manifestUri = @namespace + "." + filename.Replace('/', '.'); - var stream = assembly.GetManifestResourceStream(manifestUri); + Stream stream = assembly.GetManifestResourceStream(manifestUri); return stream; } @@ -133,11 +133,11 @@ namespace Ryujinx.Common private static (Assembly, string) ResolveManifestPath(string filename) { - var segments = filename.Split('/', 2, StringSplitOptions.RemoveEmptyEntries); + string[] segments = filename.Split('/', 2, StringSplitOptions.RemoveEmptyEntries); if (segments.Length >= 2) { - foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { if (assembly.GetName().Name == segments[0]) { diff --git a/src/Ryujinx.Common/Utilities/FileSystemUtils.cs b/src/Ryujinx.Common/Utilities/FileSystemUtils.cs index a57fa8a78..6ec92044e 100644 --- a/src/Ryujinx.Common/Utilities/FileSystemUtils.cs +++ b/src/Ryujinx.Common/Utilities/FileSystemUtils.cs @@ -9,7 +9,7 @@ namespace Ryujinx.Common.Utilities public static void CopyDirectory(string sourceDir, string destinationDir, bool recursive) { // Get information about the source directory - var dir = new DirectoryInfo(sourceDir); + DirectoryInfo dir = new(sourceDir); // Check if the source directory exists if (!dir.Exists) @@ -49,7 +49,7 @@ namespace Ryujinx.Common.Utilities public static string SanitizeFileName(string fileName) { - var reservedChars = new HashSet(Path.GetInvalidFileNameChars()); + HashSet reservedChars = [.. Path.GetInvalidFileNameChars()]; return string.Concat(fileName.Select(c => reservedChars.Contains(c) ? '_' : c)); } } diff --git a/src/Ryujinx.Common/Utilities/JsonHelper.cs b/src/Ryujinx.Common/Utilities/JsonHelper.cs index 276dd5f8c..2493f3ec4 100644 --- a/src/Ryujinx.Common/Utilities/JsonHelper.cs +++ b/src/Ryujinx.Common/Utilities/JsonHelper.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Text; using System.Text.Json; @@ -27,9 +28,14 @@ namespace Ryujinx.Common.Utilities ReadCommentHandling = JsonCommentHandling.Skip }; - public static string Serialize(T value, JsonTypeInfo typeInfo) => JsonSerializer.Serialize(value, typeInfo); + public static string Serialize(T value, JsonTypeInfo typeInfo) + => JsonSerializer.Serialize(value, typeInfo); - public static T Deserialize(string value, JsonTypeInfo typeInfo) => JsonSerializer.Deserialize(value, typeInfo); + public static T Deserialize(string value, JsonTypeInfo typeInfo) + => JsonSerializer.Deserialize(value, typeInfo); + + public static T Deserialize(ReadOnlySpan utf8Value, JsonTypeInfo typeInfo) + => JsonSerializer.Deserialize(utf8Value, typeInfo); public static void SerializeToFile(string filePath, T value, JsonTypeInfo typeInfo) { diff --git a/src/Ryujinx.Common/Utilities/MessagePackObjectFormatter.cs b/src/Ryujinx.Common/Utilities/MessagePackObjectFormatter.cs index 426cd46b7..fa04ee347 100644 --- a/src/Ryujinx.Common/Utilities/MessagePackObjectFormatter.cs +++ b/src/Ryujinx.Common/Utilities/MessagePackObjectFormatter.cs @@ -1,5 +1,6 @@ using MsgPack; using System; +using System.Collections.Generic; using System.Text; namespace Ryujinx.Common.Utilities @@ -18,7 +19,7 @@ namespace Ryujinx.Common.Utilities public static string Format(MessagePackObject obj) { - var builder = new IndentedStringBuilder(); + IndentedStringBuilder builder = new(); FormatMsgPackObj(obj, builder); @@ -41,7 +42,7 @@ namespace Ryujinx.Common.Utilities } else { - var literal = obj.ToObject(); + object literal = obj.ToObject(); if (literal is String) { @@ -88,7 +89,7 @@ namespace Ryujinx.Common.Utilities { builder.Append("[ "); - foreach (var b in arr) + foreach (byte b in arr) { builder.Append("0x"); builder.Append(ToHexChar(b >> 4)); @@ -111,7 +112,7 @@ namespace Ryujinx.Common.Utilities builder.Append("0x"); } - foreach (var b in arr) + foreach (byte b in arr) { builder.Append(ToHexChar(b >> 4)); builder.Append(ToHexChar(b & 0xF)); @@ -122,7 +123,7 @@ namespace Ryujinx.Common.Utilities private static void FormatMsgPackMap(MessagePackObject obj, IndentedStringBuilder builder) { - var map = obj.AsDictionary(); + MessagePackObjectDictionary map = obj.AsDictionary(); builder.Append('{'); @@ -130,7 +131,7 @@ namespace Ryujinx.Common.Utilities builder.IncreaseIndent() .AppendLine(); - foreach (var item in map) + foreach (KeyValuePair item in map) { FormatMsgPackObj(item.Key, builder); @@ -154,11 +155,11 @@ namespace Ryujinx.Common.Utilities private static void FormatMsgPackArray(MessagePackObject obj, IndentedStringBuilder builder) { - var arr = obj.AsList(); + IList arr = obj.AsList(); builder.Append("[ "); - foreach (var item in arr) + foreach (MessagePackObject item in arr) { FormatMsgPackObj(item, builder); diff --git a/src/Ryujinx.Common/Utilities/Rainbow.cs b/src/Ryujinx.Common/Utilities/Rainbow.cs new file mode 100644 index 000000000..93129bf10 --- /dev/null +++ b/src/Ryujinx.Common/Utilities/Rainbow.cs @@ -0,0 +1,131 @@ +using Gommon; +using Ryujinx.Common.Helper; +using System; +using System.Drawing; +using System.Threading; +using System.Threading.Tasks; + +namespace Ryujinx.Common.Utilities +{ + public static class Rainbow + { + public static bool CyclingEnabled { get; set; } + + public static void Enable() + { + if (!CyclingEnabled) + { + CyclingEnabled = true; + Executor.ExecuteBackgroundAsync(async () => + { + while (CyclingEnabled) + { + await Task.Delay(20); + Tick(); + } + }); + } + } + + public static void Disable() + { + CyclingEnabled = false; + } + + + public static float Speed { get; set; } = 1; + + private static readonly Lock _lock = new(); + + private static Color _color = Color.Blue; + + public static ref Color Color + { + get + { + lock (_lock) + { + return ref _color; + } + } + } + + public static void Tick() + { + lock (_lock) + { + _color = HsbToRgb((_color.GetHue() + Speed) / 360); + + _updatedHandler.Call(ref _color); + } + } + + public static void Reset() + { + _updatedHandler.Clear(); + + lock (_lock) + _color = Color.Blue; + } + + public static event RefEvent.Handler Updated + { + add => _updatedHandler.Add(value); + remove => _updatedHandler.Remove(value); + } + + private static readonly RefEvent _updatedHandler = new(); + + private static Color HsbToRgb(float hue, float saturation = 1, float brightness = 1) + { + int r = 0, g = 0, b = 0; + if (saturation == 0) + { + r = g = b = (int)(brightness * 255.0f + 0.5f); + } + else + { + float h = (hue - (float)Math.Floor(hue)) * 6.0f; + float f = h - (float)Math.Floor(h); + float p = brightness * (1.0f - saturation); + float q = brightness * (1.0f - saturation * f); + float t = brightness * (1.0f - (saturation * (1.0f - f))); + switch ((int)h) + { + case 0: + r = (int)(brightness * 255.0f + 0.5f); + g = (int)(t * 255.0f + 0.5f); + b = (int)(p * 255.0f + 0.5f); + break; + case 1: + r = (int)(q * 255.0f + 0.5f); + g = (int)(brightness * 255.0f + 0.5f); + b = (int)(p * 255.0f + 0.5f); + break; + case 2: + r = (int)(p * 255.0f + 0.5f); + g = (int)(brightness * 255.0f + 0.5f); + b = (int)(t * 255.0f + 0.5f); + break; + case 3: + r = (int)(p * 255.0f + 0.5f); + g = (int)(q * 255.0f + 0.5f); + b = (int)(brightness * 255.0f + 0.5f); + break; + case 4: + r = (int)(t * 255.0f + 0.5f); + g = (int)(p * 255.0f + 0.5f); + b = (int)(brightness * 255.0f + 0.5f); + break; + case 5: + r = (int)(brightness * 255.0f + 0.5f); + g = (int)(p * 255.0f + 0.5f); + b = (int)(q * 255.0f + 0.5f); + break; + } + } + + return Color.FromArgb(Convert.ToByte(255), Convert.ToByte(r), Convert.ToByte(g), Convert.ToByte(b)); + } + } +} diff --git a/src/Ryujinx.Common/Utilities/StreamUtils.cs b/src/Ryujinx.Common/Utilities/StreamUtils.cs index aeb6e0d52..e5246dfe7 100644 --- a/src/Ryujinx.Common/Utilities/StreamUtils.cs +++ b/src/Ryujinx.Common/Utilities/StreamUtils.cs @@ -1,5 +1,6 @@ using Microsoft.IO; using Ryujinx.Common.Memory; +using System; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -27,7 +28,7 @@ namespace Ryujinx.Common.Utilities MemoryOwner ownedMemory = MemoryOwner.Rent(checked((int)bytesExpected)); - var destSpan = ownedMemory.Span; + Span destSpan = ownedMemory.Span; int totalBytesRead = 0; @@ -58,7 +59,7 @@ namespace Ryujinx.Common.Utilities public static async Task StreamToBytesAsync(Stream input, CancellationToken cancellationToken = default) { - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); await input.CopyToAsync(stream, cancellationToken); diff --git a/src/Ryujinx.Common/Utilities/TypedStringEnumConverter.cs b/src/Ryujinx.Common/Utilities/TypedStringEnumConverter.cs index 9d3944c15..d7eb3d556 100644 --- a/src/Ryujinx.Common/Utilities/TypedStringEnumConverter.cs +++ b/src/Ryujinx.Common/Utilities/TypedStringEnumConverter.cs @@ -18,7 +18,7 @@ namespace Ryujinx.Common.Utilities { public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - var enumValue = reader.GetString(); + string? enumValue = reader.GetString(); if (Enum.TryParse(enumValue, out TEnum value)) { diff --git a/src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs b/src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs index 050e78d1e..90738798a 100644 --- a/src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs +++ b/src/Ryujinx.Common/Utilities/XCIFileTrimmer.cs @@ -46,7 +46,7 @@ namespace Ryujinx.Common.Utilities { if (Path.GetExtension(filename).Equals(".XCI", StringComparison.InvariantCultureIgnoreCase)) { - var trimmer = new XCIFileTrimmer(filename, log); + XCIFileTrimmer trimmer = new(filename, log); return trimmer.CanBeTrimmed; } @@ -57,7 +57,7 @@ namespace Ryujinx.Common.Utilities { if (Path.GetExtension(filename).Equals(".XCI", StringComparison.InvariantCultureIgnoreCase)) { - var trimmer = new XCIFileTrimmer(filename, log); + XCIFileTrimmer trimmer = new(filename, log); return trimmer.CanBeUntrimmed; } @@ -183,7 +183,6 @@ namespace Ryujinx.Common.Utilities { CloseReaders(); } - } else { @@ -201,11 +200,11 @@ namespace Ryujinx.Common.Utilities { long maxReads = readSizeB / XCIFileTrimmer.BufferSize; long read = 0; - var buffer = new byte[BufferSize]; + byte[] buffer = new byte[BufferSize]; while (true) { - if (cancelToken.HasValue && cancelToken.Value.IsCancellationRequested) + if (cancelToken.HasValue && cancelToken.Value.IsCancellationRequested) { return false; } @@ -257,7 +256,7 @@ namespace Ryujinx.Common.Utilities { return OperationOutcome.Cancelled; } - else + else { return OperationOutcome.FreeSpaceCheckFailed; } @@ -267,7 +266,7 @@ namespace Ryujinx.Common.Utilities try { - var info = new FileInfo(Filename); + FileInfo info = new(Filename); if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { try @@ -288,13 +287,13 @@ namespace Ryujinx.Common.Utilities return OperationOutcome.FileSizeChanged; } - var outfileStream = new FileStream(_filename, FileMode.Open, FileAccess.Write, FileShare.Write); + FileStream outfileStream = new(_filename, FileMode.Open, FileAccess.Write, FileShare.Write); try { #if !XCI_TRIMMER_READ_ONLY_MODE - outfileStream.SetLength(TrimmedFileSizeB); + outfileStream.SetLength(TrimmedFileSizeB); #endif return OperationOutcome.Successful; } @@ -327,7 +326,7 @@ namespace Ryujinx.Common.Utilities { Log?.Write(LogType.Info, "Untrimming..."); - var info = new FileInfo(Filename); + FileInfo info = new(Filename); if ((info.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { try @@ -348,7 +347,7 @@ namespace Ryujinx.Common.Utilities return OperationOutcome.FileSizeChanged; } - var outfileStream = new FileStream(_filename, FileMode.Append, FileAccess.Write, FileShare.Write); + FileStream outfileStream = new(_filename, FileMode.Append, FileAccess.Write, FileShare.Write); long bytesToWriteB = UntrimmedFileSizeB - FileSizeB; try @@ -367,7 +366,7 @@ namespace Ryujinx.Common.Utilities { return OperationOutcome.Cancelled; } - else + else { return OperationOutcome.Successful; } @@ -393,7 +392,7 @@ namespace Ryujinx.Common.Utilities try { - var buffer = new byte[BufferSize]; + byte[] buffer = new byte[BufferSize]; Array.Fill(buffer, XCIFileTrimmer.PaddingByte); while (bytesLeftToWriteB > 0) @@ -404,9 +403,9 @@ namespace Ryujinx.Common.Utilities } long bytesToWrite = Math.Min(XCIFileTrimmer.BufferSize, bytesLeftToWriteB); - + #if !XCI_TRIMMER_READ_ONLY_MODE - outfileStream.Write(buffer, 0, (int)bytesToWrite); + outfileStream.Write(buffer, 0, (int)bytesToWrite); #endif bytesLeftToWriteB -= bytesToWrite; @@ -511,6 +510,7 @@ namespace Ryujinx.Common.Utilities Log?.Write(LogType.Error, $"The source file doesn't look like an XCI file as the Cartridge Size is incorrect (0x{cartSizeId:X2})"); return false; } + _cartSizeB = cartSizeNGB * XCIFileTrimmer.CartSizeMBinFormattedGB * XCIFileTrimmer.BytesInAMegabyte; // Read data size diff --git a/src/Ryujinx.Cpu/AddressTable.cs b/src/Ryujinx.Cpu/AddressTable.cs index 038a2009c..91a65e899 100644 --- a/src/Ryujinx.Cpu/AddressTable.cs +++ b/src/Ryujinx.Cpu/AddressTable.cs @@ -49,9 +49,9 @@ namespace ARMeilleure.Common public TableSparseBlock(ulong size, Action ensureMapped, PageInitDelegate pageInit) { - var block = new SparseMemoryBlock(size, pageInit, null); + SparseMemoryBlock block = new(size, pageInit, null); - _trackingEvent = (ulong address, ulong size, bool write) => + _trackingEvent = (address, size, write) => { ulong pointer = (ulong)block.Block.Pointer + address; ensureMapped((IntPtr)pointer); @@ -146,7 +146,7 @@ namespace ARMeilleure.Common Levels = levels; Mask = 0; - foreach (var level in Levels) + foreach (AddressTableLevel level in Levels) { Mask |= level.Mask; } @@ -164,7 +164,7 @@ namespace ARMeilleure.Common _fillBottomLevel = new SparseMemoryBlock(bottomLevelSize, null, _sparseFill); _fillBottomLevelPtr = (TEntry*)_fillBottomLevel.Block.Pointer; - _sparseReserved = new List(); + _sparseReserved = []; _sparseLock = new ReaderWriterLockSlim(); _sparseBlockSize = bottomLevelSize; @@ -181,7 +181,7 @@ namespace ARMeilleure.Common public static AddressTable CreateForArm(bool for64Bits, MemoryManagerType type) { // Assume software memory means that we don't want to use any signal handlers. - bool sparse = type != MemoryManagerType.SoftwareMmu && type != MemoryManagerType.SoftwarePageTable; + bool sparse = type is not MemoryManagerType.SoftwareMmu and not MemoryManagerType.SoftwarePageTable; return new AddressTable(AddressTablePresets.GetArmPreset(for64Bits, sparse), sparse); } @@ -363,7 +363,7 @@ namespace ARMeilleure.Common /// The new sparse block that was added private TableSparseBlock ReserveNewSparseBlock() { - var block = new TableSparseBlock(_sparseBlockSize, EnsureMapped, InitLeafPage); + TableSparseBlock block = new(_sparseBlockSize, EnsureMapped, InitLeafPage); _sparseReserved.Add(block); _sparseReservedOffset = 0; @@ -381,7 +381,7 @@ namespace ARMeilleure.Common /// Allocated block private IntPtr Allocate(int length, T fill, bool leaf) where T : unmanaged { - var size = sizeof(T) * length; + int size = sizeof(T) * length; AddressTablePage page; @@ -413,10 +413,10 @@ namespace ARMeilleure.Common } else { - var address = (IntPtr)NativeAllocator.Instance.Allocate((uint)size); + IntPtr address = (IntPtr)NativeAllocator.Instance.Allocate((uint)size); page = new AddressTablePage(false, address); - var span = new Span((void*)page.Address, length); + Span span = new((void*)page.Address, length); span.Fill(fill); } @@ -445,7 +445,7 @@ namespace ARMeilleure.Common { if (!_disposed) { - foreach (var page in _pages) + foreach (AddressTablePage page in _pages) { if (!page.IsSparse) { diff --git a/src/Ryujinx.Cpu/AppleHv/HvAddressSpace.cs b/src/Ryujinx.Cpu/AppleHv/HvAddressSpace.cs index eb7c0ef08..662e50793 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvAddressSpace.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvAddressSpace.cs @@ -29,7 +29,7 @@ namespace Ryujinx.Cpu.AppleHv public HvAddressSpace(MemoryBlock backingMemory, ulong asSize) { - (_asBase, var ipaAllocator) = HvVm.CreateAddressSpace(backingMemory); + (_asBase, HvIpaAllocator ipaAllocator) = HvVm.CreateAddressSpace(backingMemory); _backingSize = backingMemory.Size; _userRange = new HvAddressSpaceRange(ipaAllocator); diff --git a/src/Ryujinx.Cpu/AppleHv/HvAddressSpaceRange.cs b/src/Ryujinx.Cpu/AppleHv/HvAddressSpaceRange.cs index 7754431fa..c8edc6c6f 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvAddressSpaceRange.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvAddressSpaceRange.cs @@ -359,7 +359,7 @@ namespace Ryujinx.Cpu.AppleHv private static void ValidateEntriesCount(int count) { - Debug.Assert(count >= 0 && count <= LevelCount, $"Entries count {count} is invalid."); + Debug.Assert(count is >= 0 and <= LevelCount, $"Entries count {count} is invalid."); } public void Dispose() diff --git a/src/Ryujinx.Cpu/AppleHv/HvExecutionContext.cs b/src/Ryujinx.Cpu/AppleHv/HvExecutionContext.cs index fc2b76d15..53cea5385 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvExecutionContext.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvExecutionContext.cs @@ -159,7 +159,7 @@ namespace Ryujinx.Cpu.AppleHv address = SynchronousException(memoryManager, ref vcpu); HvApi.hv_vcpu_set_reg(vcpu.Handle, HvReg.PC, address).ThrowOnError(); } - else if (reason == HvExitReason.Canceled || reason == HvExitReason.VTimerActivated) + else if (reason is HvExitReason.Canceled or HvExitReason.VTimerActivated) { if (GetAndClearInterruptRequested()) { diff --git a/src/Ryujinx.Cpu/AppleHv/HvExecutionContextVcpu.cs b/src/Ryujinx.Cpu/AppleHv/HvExecutionContextVcpu.cs index 9d459d062..1949cabdf 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvExecutionContextVcpu.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvExecutionContextVcpu.cs @@ -1,6 +1,5 @@ using ARMeilleure.State; using Ryujinx.Memory; -using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; diff --git a/src/Ryujinx.Cpu/AppleHv/HvMemoryBlockAllocator.cs b/src/Ryujinx.Cpu/AppleHv/HvMemoryBlockAllocator.cs index 86936c592..779579e6a 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvMemoryBlockAllocator.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvMemoryBlockAllocator.cs @@ -45,7 +45,7 @@ namespace Ryujinx.Cpu.AppleHv public HvMemoryBlockAllocation Allocate(ulong size, ulong alignment) { - var allocation = Allocate(size, alignment, CreateBlock); + Allocation allocation = Allocate(size, alignment, CreateBlock); return new HvMemoryBlockAllocation(this, allocation.Block, allocation.Offset, allocation.Size); } diff --git a/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs b/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs index bb56a4344..decb0e4e3 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs @@ -5,7 +5,6 @@ using Ryujinx.Memory.Tracking; using System; using System.Buffers; using System.Collections.Generic; -using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.Versioning; @@ -230,25 +229,20 @@ namespace Ryujinx.Cpu.AppleHv { if (size == 0) { - return Enumerable.Empty(); + yield break; } - var guestRegions = GetPhysicalRegionsImpl(va, size); + IEnumerable guestRegions = GetPhysicalRegionsImpl(va, size); if (guestRegions == null) { - return null; + yield break; } - var regions = new HostMemoryRange[guestRegions.Count]; - - for (int i = 0; i < regions.Length; i++) + foreach (MemoryRange guestRegion in guestRegions) { - var guestRegion = guestRegions[i]; nint pointer = _backingMemory.GetPointer(guestRegion.Address, guestRegion.Size); - regions[i] = new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size); + yield return new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size); } - - return regions; } /// @@ -256,23 +250,24 @@ namespace Ryujinx.Cpu.AppleHv { if (size == 0) { - return Enumerable.Empty(); + yield break; } - return GetPhysicalRegionsImpl(va, size); + foreach (MemoryRange physicalRegion in GetPhysicalRegionsImpl(va, size)) + { + yield return physicalRegion; + } } - private List GetPhysicalRegionsImpl(ulong va, ulong size) + private IEnumerable GetPhysicalRegionsImpl(ulong va, ulong size) { if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size)) { - return null; + yield break; } int pages = GetPagesCount(va, (uint)size, out va); - var regions = new List(); - ulong regionStart = GetPhysicalAddressInternal(va); ulong regionSize = PageSize; @@ -280,14 +275,14 @@ namespace Ryujinx.Cpu.AppleHv { if (!ValidateAddress(va + PageSize)) { - return null; + yield break; } ulong newPa = GetPhysicalAddressInternal(va + PageSize); if (GetPhysicalAddressInternal(va) + PageSize != newPa) { - regions.Add(new MemoryRange(regionStart, regionSize)); + yield return new MemoryRange(regionStart, regionSize); regionStart = newPa; regionSize = 0; } @@ -296,9 +291,7 @@ namespace Ryujinx.Cpu.AppleHv regionSize += PageSize; } - regions.Add(new MemoryRange(regionStart, regionSize)); - - return regions; + yield return new MemoryRange(regionStart, regionSize); } /// diff --git a/src/Ryujinx.Cpu/AppleHv/HvVcpu.cs b/src/Ryujinx.Cpu/AppleHv/HvVcpu.cs index ee91c478b..c4eec31a6 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvVcpu.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvVcpu.cs @@ -41,7 +41,7 @@ namespace Ryujinx.Cpu.AppleHv { // Calculate our time delta in ticks based on the current clock frequency. - int result = TimeApi.mach_timebase_info(out var timeBaseInfo); + int result = TimeApi.mach_timebase_info(out MachTimebaseInfo timeBaseInfo); Debug.Assert(result == 0); diff --git a/src/Ryujinx.Cpu/AppleHv/HvVm.cs b/src/Ryujinx.Cpu/AppleHv/HvVm.cs index a12bbea9b..6ad44621b 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvVm.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvVm.cs @@ -1,6 +1,6 @@ using Ryujinx.Memory; -using System; using System.Runtime.Versioning; +using System.Threading; namespace Ryujinx.Cpu.AppleHv { @@ -12,7 +12,7 @@ namespace Ryujinx.Cpu.AppleHv private static int _addressSpaces; private static HvIpaAllocator _ipaAllocator; - private static readonly object _lock = new(); + private static readonly Lock _lock = new(); public static (ulong, HvIpaAllocator) CreateAddressSpace(MemoryBlock block) { @@ -38,7 +38,7 @@ namespace Ryujinx.Cpu.AppleHv baseAddress = ipaAllocator.Allocate(block.Size, AsIpaAlignment); } - var rwx = HvMemoryFlags.Read | HvMemoryFlags.Write | HvMemoryFlags.Exec; + HvMemoryFlags rwx = HvMemoryFlags.Read | HvMemoryFlags.Write | HvMemoryFlags.Exec; HvApi.hv_vm_map((ulong)block.Pointer, baseAddress, block.Size, rwx).ThrowOnError(); diff --git a/src/Ryujinx.Cpu/ITickSource.cs b/src/Ryujinx.Cpu/ITickSource.cs index e65e99e26..3eba8b524 100644 --- a/src/Ryujinx.Cpu/ITickSource.cs +++ b/src/Ryujinx.Cpu/ITickSource.cs @@ -8,11 +8,18 @@ namespace Ryujinx.Cpu /// public interface ITickSource : ICounter { + public const long RealityTickScalar = 100; + /// /// Time elapsed since the counter was created. /// TimeSpan ElapsedTime { get; } + /// + /// Clock tick scalar, in percent points (100 = 1.0). + /// + long TickScalar { get; set; } + /// /// Time elapsed since the counter was created, in seconds. /// diff --git a/src/Ryujinx.Cpu/Jit/HostTracked/AddressIntrusiveRedBlackTree.cs b/src/Ryujinx.Cpu/Jit/HostTracked/AddressIntrusiveRedBlackTree.cs index 0e2443303..d3a24c8bf 100644 --- a/src/Ryujinx.Cpu/Jit/HostTracked/AddressIntrusiveRedBlackTree.cs +++ b/src/Ryujinx.Cpu/Jit/HostTracked/AddressIntrusiveRedBlackTree.cs @@ -29,6 +29,7 @@ namespace Ryujinx.Cpu.Jit.HostTracked return node; } } + return null; } } diff --git a/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartition.cs b/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartition.cs index f9743a0a1..9ee2d58e6 100644 --- a/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartition.cs +++ b/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartition.cs @@ -127,7 +127,7 @@ namespace Ryujinx.Cpu.Jit.HostTracked Debug.Assert(leftSize > 0); Debug.Assert(rightSize > 0); - (var leftAllocation, PrivateAllocation) = PrivateAllocation.Split(leftSize); + (PrivateMemoryAllocation leftAllocation, PrivateAllocation) = PrivateAllocation.Split(leftSize); PrivateMapping left = new(Address, leftSize, leftAllocation); diff --git a/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitionAllocator.cs b/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitionAllocator.cs index a49e0179d..c22fbd5df 100644 --- a/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitionAllocator.cs +++ b/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitionAllocator.cs @@ -115,6 +115,9 @@ namespace Ryujinx.Cpu.Jit.HostTracked } private readonly AddressIntrusiveRedBlackTree _mappingTree; + + // type is not Lock due to the unique usage of this mechanism, + // an arbitrary object is used as the lock passed in by constructor. private readonly object _lock; public Block(MemoryTracking tracking, Func readPtCallback, MemoryBlock memory, ulong size, object locker) : base(memory, size) @@ -174,6 +177,9 @@ namespace Ryujinx.Cpu.Jit.HostTracked private readonly MemoryTracking _tracking; private readonly Func _readPtCallback; + + // type is not Lock due to the unique usage of this mechanism, + // an arbitrary object is used as the lock passed in by constructor. private readonly object _lock; public AddressSpacePartitionAllocator( diff --git a/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitioned.cs b/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitioned.cs index e3cb75f64..1cfb37258 100644 --- a/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitioned.cs +++ b/src/Ryujinx.Cpu/Jit/HostTracked/AddressSpacePartitioned.cs @@ -21,7 +21,7 @@ namespace Ryujinx.Cpu.Jit.HostTracked public AddressSpacePartitioned(MemoryTracking tracking, MemoryBlock backingMemory, NativePageTable nativePageTable, bool useProtectionMirrors) { _backingMemory = backingMemory; - _partitions = new(); + _partitions = []; _asAllocator = new(tracking, nativePageTable.Read, _partitions); _updatePtCallback = nativePageTable.Update; _useProtectionMirrors = useProtectionMirrors; diff --git a/src/Ryujinx.Cpu/Jit/JitCpuContext.cs b/src/Ryujinx.Cpu/Jit/JitCpuContext.cs index 0793f382d..a29def8e8 100644 --- a/src/Ryujinx.Cpu/Jit/JitCpuContext.cs +++ b/src/Ryujinx.Cpu/Jit/JitCpuContext.cs @@ -2,7 +2,6 @@ using ARMeilleure.Common; using ARMeilleure.Memory; using ARMeilleure.Translation; using Ryujinx.Cpu.Signal; -using Ryujinx.Memory; namespace Ryujinx.Cpu.Jit { diff --git a/src/Ryujinx.Cpu/Jit/MemoryManager.cs b/src/Ryujinx.Cpu/Jit/MemoryManager.cs index 049e508d0..9e5d29cca 100644 --- a/src/Ryujinx.Cpu/Jit/MemoryManager.cs +++ b/src/Ryujinx.Cpu/Jit/MemoryManager.cs @@ -5,7 +5,6 @@ using Ryujinx.Memory.Tracking; using System; using System.Buffers; using System.Collections.Generic; -using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading; @@ -250,25 +249,20 @@ namespace Ryujinx.Cpu.Jit { if (size == 0) { - return Enumerable.Empty(); + yield break; } - var guestRegions = GetPhysicalRegionsImpl(va, size); + IEnumerable guestRegions = GetPhysicalRegionsImpl(va, size); if (guestRegions == null) { - return null; + yield break; } - var regions = new HostMemoryRange[guestRegions.Count]; - - for (int i = 0; i < regions.Length; i++) + foreach (MemoryRange guestRegion in guestRegions) { - var guestRegion = guestRegions[i]; nint pointer = _backingMemory.GetPointer(guestRegion.Address, guestRegion.Size); - regions[i] = new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size); + yield return new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size); } - - return regions; } /// @@ -276,23 +270,24 @@ namespace Ryujinx.Cpu.Jit { if (size == 0) { - return Enumerable.Empty(); + yield break; } - return GetPhysicalRegionsImpl(va, size); + foreach (MemoryRange physicalRegion in GetPhysicalRegionsImpl(va, size)) + { + yield return physicalRegion; + } } - private List GetPhysicalRegionsImpl(ulong va, ulong size) + private IEnumerable GetPhysicalRegionsImpl(ulong va, ulong size) { if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size)) { - return null; + yield break; } int pages = GetPagesCount(va, (uint)size, out va); - var regions = new List(); - ulong regionStart = GetPhysicalAddressInternal(va); ulong regionSize = PageSize; @@ -300,14 +295,14 @@ namespace Ryujinx.Cpu.Jit { if (!ValidateAddress(va + PageSize)) { - return null; + yield break; } ulong newPa = GetPhysicalAddressInternal(va + PageSize); if (GetPhysicalAddressInternal(va) + PageSize != newPa) { - regions.Add(new MemoryRange(regionStart, regionSize)); + yield return new MemoryRange(regionStart, regionSize); regionStart = newPa; regionSize = 0; } @@ -316,9 +311,7 @@ namespace Ryujinx.Cpu.Jit regionSize += PageSize; } - regions.Add(new MemoryRange(regionStart, regionSize)); - - return regions; + yield return new MemoryRange(regionStart, regionSize); } /// diff --git a/src/Ryujinx.Cpu/Jit/MemoryManagerHostMapped.cs b/src/Ryujinx.Cpu/Jit/MemoryManagerHostMapped.cs index 0fe8b344f..e27a2e173 100644 --- a/src/Ryujinx.Cpu/Jit/MemoryManagerHostMapped.cs +++ b/src/Ryujinx.Cpu/Jit/MemoryManagerHostMapped.cs @@ -340,7 +340,7 @@ namespace Ryujinx.Cpu.Jit { int pages = GetPagesCount(va, (uint)size, out va); - var regions = new List(); + List regions = []; ulong regionStart = GetPhysicalAddressChecked(va); ulong regionSize = PageSize; diff --git a/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs b/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs index 4dab212a7..9ae4ca5a9 100644 --- a/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs +++ b/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs @@ -8,7 +8,6 @@ using Ryujinx.Memory.Tracking; using System; using System.Buffers; using System.Collections.Generic; -using System.Linq; using System.Runtime.CompilerServices; namespace Ryujinx.Cpu.Jit @@ -240,7 +239,7 @@ namespace Ryujinx.Cpu.Jit if (TryGetVirtualContiguous(va, data.Length, out MemoryBlock memoryBlock, out ulong offset)) { - var target = memoryBlock.GetSpan(offset, data.Length); + Span target = memoryBlock.GetSpan(offset, data.Length); bool changed = !data.SequenceEqual(target); @@ -443,7 +442,7 @@ namespace Ryujinx.Cpu.Jit return null; } - var regions = new List(); + List regions = []; ulong endVa = va + size; try @@ -475,17 +474,15 @@ namespace Ryujinx.Cpu.Jit return GetPhysicalRegionsImpl(va, size); } - private List GetPhysicalRegionsImpl(ulong va, ulong size) + private IEnumerable GetPhysicalRegionsImpl(ulong va, ulong size) { if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size)) { - return null; + yield break; } int pages = GetPagesCount(va, (uint)size, out va); - var regions = new List(); - ulong regionStart = GetPhysicalAddressInternal(va); ulong regionSize = PageSize; @@ -493,14 +490,14 @@ namespace Ryujinx.Cpu.Jit { if (!ValidateAddress(va + PageSize)) { - return null; + yield break; } ulong newPa = GetPhysicalAddressInternal(va + PageSize); if (GetPhysicalAddressInternal(va) + PageSize != newPa) { - regions.Add(new MemoryRange(regionStart, regionSize)); + yield return new MemoryRange(regionStart, regionSize); regionStart = newPa; regionSize = 0; } @@ -509,9 +506,7 @@ namespace Ryujinx.Cpu.Jit regionSize += PageSize; } - regions.Add(new MemoryRange(regionStart, regionSize)); - - return regions; + yield return new MemoryRange(regionStart, regionSize); } /// diff --git a/src/Ryujinx.Cpu/LightningJit/AarchCompiler.cs b/src/Ryujinx.Cpu/LightningJit/AarchCompiler.cs index 89e1499c0..68dff624c 100644 --- a/src/Ryujinx.Cpu/LightningJit/AarchCompiler.cs +++ b/src/Ryujinx.Cpu/LightningJit/AarchCompiler.cs @@ -3,7 +3,6 @@ using ARMeilleure.Memory; using Ryujinx.Cpu.LightningJit.Arm32; using Ryujinx.Cpu.LightningJit.Arm64; using Ryujinx.Cpu.LightningJit.State; -using System; using System.Runtime.InteropServices; namespace Ryujinx.Cpu.LightningJit diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/CodeGenContext.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/CodeGenContext.cs index f55e2bb99..d0490a8a6 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/CodeGenContext.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/CodeGenContext.cs @@ -36,7 +36,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 RegisterAllocator = registerAllocator; MemoryManagerType = mmType; _itConditions = new ArmCondition[4]; - _pendingBranches = new(); + _pendingBranches = []; IsThumb = isThumb; } diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs index 8a2b389ad..1add34f89 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Decoder.cs @@ -10,8 +10,8 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 { public static MultiBlock DecodeMulti(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address, bool isThumb) { - List blocks = new(); - List branchTargets = new(); + List blocks = []; + List branchTargets = []; while (true) { @@ -202,7 +202,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 { ulong startAddress = address; - List insts = new(); + List insts = []; uint encoding; InstMeta meta; diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/InstName.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/InstName.cs index 2ee67aa0a..809fbf25e 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/InstName.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/InstName.cs @@ -531,7 +531,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 { public static bool IsCall(this InstName name) { - return name == InstName.BlI || name == InstName.BlxR; + return name is InstName.BlI or InstName.BlxR; } public static bool IsSystem(this InstName name) diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableA32.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableA32.cs index 2168c0b9f..5a6a3c194 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableA32.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableA32.cs @@ -9,494 +9,494 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 static InstTableA32() { - InstEncoding[] condConstraints = new InstEncoding[] - { - new(0xF0000000, 0xF0000000), - }; + InstEncoding[] condConstraints = + [ + new(0xF0000000, 0xF0000000) + ]; - InstEncoding[] condRnsRnConstraints = new InstEncoding[] - { + InstEncoding[] condRnsRnConstraints = + [ new(0xF0000000, 0xF0000000), new(0x000F0000, 0x001F0000), - new(0x000D0000, 0x000F0000), - }; + new(0x000D0000, 0x000F0000) + ]; - InstEncoding[] condRnConstraints = new InstEncoding[] - { + InstEncoding[] condRnConstraints = + [ new(0xF0000000, 0xF0000000), - new(0x000D0000, 0x000F0000), - }; + new(0x000D0000, 0x000F0000) + ]; - InstEncoding[] vdVmConstraints = new InstEncoding[] - { + InstEncoding[] vdVmConstraints = + [ new(0x00001000, 0x00001000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] condRnConstraints2 = new InstEncoding[] - { + InstEncoding[] condRnConstraints2 = + [ new(0xF0000000, 0xF0000000), - new(0x0000000F, 0x0000000F), - }; + new(0x0000000F, 0x0000000F) + ]; - InstEncoding[] optionConstraints = new InstEncoding[] - { - new(0x00000000, 0x0000000F), - }; + InstEncoding[] optionConstraints = + [ + new(0x00000000, 0x0000000F) + ]; - InstEncoding[] condPuwPwPuwPuwConstraints = new InstEncoding[] - { + InstEncoding[] condPuwPwPuwPuwConstraints = + [ new(0xF0000000, 0xF0000000), new(0x00000000, 0x01A00000), new(0x01000000, 0x01200000), new(0x00200000, 0x01A00000), - new(0x01A00000, 0x01A00000), - }; + new(0x01A00000, 0x01A00000) + ]; - InstEncoding[] condRnPuwConstraints = new InstEncoding[] - { + InstEncoding[] condRnPuwConstraints = + [ new(0xF0000000, 0xF0000000), new(0x000F0000, 0x000F0000), - new(0x00000000, 0x01A00000), - }; + new(0x00000000, 0x01A00000) + ]; - InstEncoding[] condPuwConstraints = new InstEncoding[] - { + InstEncoding[] condPuwConstraints = + [ new(0xF0000000, 0xF0000000), - new(0x00000000, 0x01A00000), - }; + new(0x00000000, 0x01A00000) + ]; - InstEncoding[] condRnPwConstraints = new InstEncoding[] - { + InstEncoding[] condRnPwConstraints = + [ new(0xF0000000, 0xF0000000), new(0x000F0000, 0x000F0000), - new(0x00200000, 0x01200000), - }; + new(0x00200000, 0x01200000) + ]; - InstEncoding[] condPwConstraints = new InstEncoding[] - { + InstEncoding[] condPwConstraints = + [ new(0xF0000000, 0xF0000000), - new(0x00200000, 0x01200000), - }; + new(0x00200000, 0x01200000) + ]; - InstEncoding[] condRnConstraints3 = new InstEncoding[] - { + InstEncoding[] condRnConstraints3 = + [ new(0xF0000000, 0xF0000000), - new(0x000F0000, 0x000F0000), - }; + new(0x000F0000, 0x000F0000) + ]; - InstEncoding[] condMaskrConstraints = new InstEncoding[] - { + InstEncoding[] condMaskrConstraints = + [ new(0xF0000000, 0xF0000000), - new(0x00000000, 0x004F0000), - }; + new(0x00000000, 0x004F0000) + ]; - InstEncoding[] rnConstraints = new InstEncoding[] - { - new(0x000F0000, 0x000F0000), - }; + InstEncoding[] rnConstraints = + [ + new(0x000F0000, 0x000F0000) + ]; - InstEncoding[] vdVnVmConstraints = new InstEncoding[] - { + InstEncoding[] vdVnVmConstraints = + [ new(0x00001000, 0x00001000), new(0x00010000, 0x00010000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] condRaConstraints = new InstEncoding[] - { + InstEncoding[] condRaConstraints = + [ new(0xF0000000, 0xF0000000), - new(0x0000F000, 0x0000F000), - }; + new(0x0000F000, 0x0000F000) + ]; - InstEncoding[] sizeQvdQvnQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeQvdQvnQvmConstraints = + [ new(0x00300000, 0x00300000), new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] sizeVdConstraints = new InstEncoding[] - { + InstEncoding[] sizeVdConstraints = + [ new(0x00300000, 0x00300000), - new(0x00001000, 0x00001000), - }; + new(0x00001000, 0x00001000) + ]; - InstEncoding[] qvdQvnQvmConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvnQvmConstraints = + [ new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] sizeQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeQvdQvmConstraints = + [ new(0x000C0000, 0x000C0000), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] sizeVnVmConstraints = new InstEncoding[] - { + InstEncoding[] sizeVnVmConstraints = + [ new(0x00300000, 0x00300000), new(0x00010000, 0x00010000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] sizeVdOpvnConstraints = new InstEncoding[] - { + InstEncoding[] sizeVdOpvnConstraints = + [ new(0x00300000, 0x00300000), new(0x00001000, 0x00001000), - new(0x00010100, 0x00010100), - }; + new(0x00010100, 0x00010100) + ]; - InstEncoding[] cmodeCmodeQvdConstraints = new InstEncoding[] - { + InstEncoding[] cmodeCmodeQvdConstraints = + [ new(0x00000000, 0x00000100), new(0x00000C00, 0x00000C00), - new(0x00001040, 0x00001040), - }; + new(0x00001040, 0x00001040) + ]; - InstEncoding[] qvdQvnQvmOpConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvnQvmOpConstraints = + [ new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), new(0x00000041, 0x00000041), - new(0x00000000, 0x00300000), - }; + new(0x00000000, 0x00300000) + ]; - InstEncoding[] qvdQvnQvmSizeConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvnQvmSizeConstraints = + [ new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), new(0x00000041, 0x00000041), - new(0x00300000, 0x00300000), - }; + new(0x00300000, 0x00300000) + ]; - InstEncoding[] qvdQvnConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvnConstraints = + [ new(0x00001040, 0x00001040), - new(0x00010040, 0x00010040), - }; + new(0x00010040, 0x00010040) + ]; - InstEncoding[] qvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvmConstraints = + [ new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] sizeConstraints = new InstEncoding[] - { - new(0x00000000, 0x00000300), - }; + InstEncoding[] sizeConstraints = + [ + new(0x00000000, 0x00000300) + ]; - InstEncoding[] vmConstraints = new InstEncoding[] - { - new(0x00000001, 0x00000001), - }; + InstEncoding[] vmConstraints = + [ + new(0x00000001, 0x00000001) + ]; - InstEncoding[] opvdOpvmConstraints = new InstEncoding[] - { + InstEncoding[] opvdOpvmConstraints = + [ new(0x00001100, 0x00001100), - new(0x00000001, 0x00000101), - }; + new(0x00000001, 0x00000101) + ]; - InstEncoding[] imm6Opimm6Imm6QvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] imm6Opimm6Imm6QvdQvmConstraints = + [ new(0x00000000, 0x00380000), new(0x00200000, 0x00300200), new(0x00000000, 0x00200000), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] condQvdEbConstraints = new InstEncoding[] - { + InstEncoding[] condQvdEbConstraints = + [ new(0xF0000000, 0xF0000000), new(0x00210000, 0x00210000), - new(0x00400020, 0x00400020), - }; + new(0x00400020, 0x00400020) + ]; - InstEncoding[] imm4QvdConstraints = new InstEncoding[] - { + InstEncoding[] imm4QvdConstraints = + [ new(0x00000000, 0x00070000), - new(0x00001040, 0x00001040), - }; + new(0x00001040, 0x00001040) + ]; - InstEncoding[] qvdQvnQvmQimm4Constraints = new InstEncoding[] - { + InstEncoding[] qvdQvnQvmQimm4Constraints = + [ new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), new(0x00000041, 0x00000041), - new(0x00000800, 0x00000840), - }; + new(0x00000800, 0x00000840) + ]; - InstEncoding[] qvdConstraints = new InstEncoding[] - { - new(0x00001040, 0x00001040), - }; + InstEncoding[] qvdConstraints = + [ + new(0x00001040, 0x00001040) + ]; - InstEncoding[] vdVnConstraints = new InstEncoding[] - { + InstEncoding[] vdVnConstraints = + [ new(0x00001000, 0x00001000), - new(0x00010000, 0x00010000), - }; + new(0x00010000, 0x00010000) + ]; - InstEncoding[] sizeConstraints2 = new InstEncoding[] - { - new(0x00000C00, 0x00000C00), - }; + InstEncoding[] sizeConstraints2 = + [ + new(0x00000C00, 0x00000C00) + ]; - InstEncoding[] sizeIndexAlignIndexAlignConstraints = new InstEncoding[] - { + InstEncoding[] sizeIndexAlignIndexAlignConstraints = + [ new(0x00000C00, 0x00000C00), new(0x00000010, 0x00000030), - new(0x00000020, 0x00000030), - }; + new(0x00000020, 0x00000030) + ]; - InstEncoding[] sizeSizeaConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeaConstraints = + [ new(0x000000C0, 0x000000C0), - new(0x00000010, 0x000000D0), - }; + new(0x00000010, 0x000000D0) + ]; - InstEncoding[] alignConstraints = new InstEncoding[] - { - new(0x00000020, 0x00000020), - }; + InstEncoding[] alignConstraints = + [ + new(0x00000020, 0x00000020) + ]; - InstEncoding[] alignConstraints2 = new InstEncoding[] - { + InstEncoding[] alignConstraints2 = + [ + new(0x00000030, 0x00000030) + ]; + + InstEncoding[] sizeConstraints3 = + [ + new(0x000000C0, 0x000000C0) + ]; + + InstEncoding[] alignSizeConstraints = + [ new(0x00000030, 0x00000030), - }; + new(0x000000C0, 0x000000C0) + ]; - InstEncoding[] sizeConstraints3 = new InstEncoding[] - { + InstEncoding[] sizeAConstraints = + [ new(0x000000C0, 0x000000C0), - }; + new(0x00000010, 0x00000010) + ]; - InstEncoding[] alignSizeConstraints = new InstEncoding[] - { - new(0x00000030, 0x00000030), + InstEncoding[] sizeAlignConstraints = + [ new(0x000000C0, 0x000000C0), - }; + new(0x00000020, 0x00000020) + ]; - InstEncoding[] sizeAConstraints = new InstEncoding[] - { - new(0x000000C0, 0x000000C0), - new(0x00000010, 0x00000010), - }; - - InstEncoding[] sizeAlignConstraints = new InstEncoding[] - { - new(0x000000C0, 0x000000C0), - new(0x00000020, 0x00000020), - }; - - InstEncoding[] sizeIndexAlignConstraints = new InstEncoding[] - { + InstEncoding[] sizeIndexAlignConstraints = + [ new(0x00000C00, 0x00000C00), - new(0x00000030, 0x00000030), - }; + new(0x00000030, 0x00000030) + ]; - InstEncoding[] sizeaConstraints = new InstEncoding[] - { - new(0x000000C0, 0x000000D0), - }; + InstEncoding[] sizeaConstraints = + [ + new(0x000000C0, 0x000000D0) + ]; - InstEncoding[] sizeSizeVdConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeVdConstraints = + [ new(0x00300000, 0x00300000), new(0x00000000, 0x00300000), - new(0x00001000, 0x00001000), - }; + new(0x00001000, 0x00001000) + ]; - InstEncoding[] sizeQvdQvnConstraints = new InstEncoding[] - { + InstEncoding[] sizeQvdQvnConstraints = + [ new(0x00300000, 0x00300000), new(0x01001000, 0x01001000), - new(0x01010000, 0x01010000), - }; + new(0x01010000, 0x01010000) + ]; - InstEncoding[] imm3hImm3hImm3hImm3hImm3hVdConstraints = new InstEncoding[] - { + InstEncoding[] imm3hImm3hImm3hImm3hImm3hVdConstraints = + [ new(0x00000000, 0x00380000), new(0x00180000, 0x00380000), new(0x00280000, 0x00380000), new(0x00300000, 0x00380000), new(0x00380000, 0x00380000), - new(0x00001000, 0x00001000), - }; + new(0x00001000, 0x00001000) + ]; - InstEncoding[] sizeVmConstraints = new InstEncoding[] - { + InstEncoding[] sizeVmConstraints = + [ new(0x000C0000, 0x000C0000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] condOpc1opc2Constraints = new InstEncoding[] - { + InstEncoding[] condOpc1opc2Constraints = + [ new(0xF0000000, 0xF0000000), - new(0x00000040, 0x00400060), - }; + new(0x00000040, 0x00400060) + ]; - InstEncoding[] condUopc1opc2Uopc1opc2Constraints = new InstEncoding[] - { + InstEncoding[] condUopc1opc2Uopc1opc2Constraints = + [ new(0xF0000000, 0xF0000000), new(0x00800000, 0x00C00060), - new(0x00000040, 0x00400060), - }; + new(0x00000040, 0x00400060) + ]; - InstEncoding[] sizeOpuOpsizeVdConstraints = new InstEncoding[] - { + InstEncoding[] sizeOpuOpsizeVdConstraints = + [ new(0x00300000, 0x00300000), new(0x01000200, 0x01000200), new(0x00100200, 0x00300200), - new(0x00001000, 0x00001000), - }; + new(0x00001000, 0x00001000) + ]; - InstEncoding[] sizeOpsizeOpsizeQvdQvnQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeOpsizeOpsizeQvdQvnQvmConstraints = + [ new(0x00300000, 0x00300000), new(0x01100000, 0x01300000), new(0x01200000, 0x01300000), new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] cmodeQvdConstraints = new InstEncoding[] - { + InstEncoding[] cmodeQvdConstraints = + [ new(0x00000E00, 0x00000E00), - new(0x00001040, 0x00001040), - }; + new(0x00001040, 0x00001040) + ]; - InstEncoding[] qConstraints = new InstEncoding[] - { - new(0x00000040, 0x00000040), - }; + InstEncoding[] qConstraints = + [ + new(0x00000040, 0x00000040) + ]; - InstEncoding[] sizeQConstraints = new InstEncoding[] - { + InstEncoding[] sizeQConstraints = + [ new(0x00300000, 0x00300000), - new(0x00000040, 0x00000040), - }; + new(0x00000040, 0x00000040) + ]; - InstEncoding[] sizeConstraints4 = new InstEncoding[] - { - new(0x00300000, 0x00300000), - }; + InstEncoding[] sizeConstraints4 = + [ + new(0x00300000, 0x00300000) + ]; - InstEncoding[] qvdQvnQvmSizeSizeConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvnQvmSizeSizeConstraints = + [ new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), new(0x00000041, 0x00000041), new(0x00000000, 0x00300000), - new(0x00300000, 0x00300000), - }; + new(0x00300000, 0x00300000) + ]; - InstEncoding[] sizeSizeQvdQvnConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeQvdQvnConstraints = + [ new(0x00300000, 0x00300000), new(0x00000000, 0x00300000), new(0x01001000, 0x01001000), - new(0x01010000, 0x01010000), - }; + new(0x01010000, 0x01010000) + ]; - InstEncoding[] opSizeVmConstraints = new InstEncoding[] - { + InstEncoding[] opSizeVmConstraints = + [ new(0x00000000, 0x000000C0), new(0x000C0000, 0x000C0000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] qvdQvmQvnConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvmQvnConstraints = + [ new(0x00001040, 0x00001040), new(0x00000041, 0x00000041), - new(0x00010040, 0x00010040), - }; + new(0x00010040, 0x00010040) + ]; - InstEncoding[] imm6UopVmConstraints = new InstEncoding[] - { + InstEncoding[] imm6UopVmConstraints = + [ new(0x00000000, 0x00380000), new(0x00000000, 0x01000100), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] imm6lUopQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] imm6lUopQvdQvmConstraints = + [ new(0x00000000, 0x00380080), new(0x00000000, 0x01000100), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] qvdQvmSizeSizeConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvmSizeSizeConstraints = + [ new(0x00001040, 0x00001040), new(0x00000041, 0x00000041), new(0x00000000, 0x000C0000), - new(0x000C0000, 0x000C0000), - }; + new(0x000C0000, 0x000C0000) + ]; - InstEncoding[] sizeSizeSizeQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeSizeQvdQvmConstraints = + [ new(0x00040000, 0x000C0000), new(0x00080000, 0x000C0000), new(0x000C0000, 0x000C0000), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] sizeSizeQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeQvdQvmConstraints = + [ new(0x00080000, 0x000C0000), new(0x000C0000, 0x000C0000), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] imm6lQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] imm6lQvdQvmConstraints = + [ new(0x00000000, 0x00380080), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] imm6VmConstraints = new InstEncoding[] - { + InstEncoding[] imm6VmConstraints = + [ new(0x00000000, 0x00380000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] imm6VdImm6Imm6Imm6Constraints = new InstEncoding[] - { + InstEncoding[] imm6VdImm6Imm6Imm6Constraints = + [ new(0x00000000, 0x00380000), new(0x00001000, 0x00001000), new(0x00080000, 0x003F0000), new(0x00100000, 0x003F0000), - new(0x00200000, 0x003F0000), - }; + new(0x00200000, 0x003F0000) + ]; - InstEncoding[] sizeVdConstraints2 = new InstEncoding[] - { + InstEncoding[] sizeVdConstraints2 = + [ new(0x000C0000, 0x000C0000), - new(0x00001000, 0x00001000), - }; + new(0x00001000, 0x00001000) + ]; - InstEncoding[] sizeQsizeQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeQsizeQvdQvmConstraints = + [ new(0x000C0000, 0x000C0000), new(0x00080000, 0x000C0040), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - List insts = new() - { + List insts = + [ new(0x02A00000, 0x0FE00000, condConstraints, InstName.AdcI, T.AdcIA1, IsaVersion.v80, InstFlags.CondRd), new(0x00A00000, 0x0FE00010, condConstraints, InstName.AdcR, T.AdcRA1, IsaVersion.v80, InstFlags.CondRd), new(0x00A00010, 0x0FE00090, condConstraints, InstName.AdcRr, T.AdcRrA1, IsaVersion.v80, InstFlags.CondRd), @@ -1176,7 +1176,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 new(0x0320F002, 0x0FFFFFFF, condConstraints, InstName.Wfe, T.WfeA1, IsaVersion.v80, InstFlags.Cond), new(0x0320F003, 0x0FFFFFFF, condConstraints, InstName.Wfi, T.WfiA1, IsaVersion.v80, InstFlags.Cond), new(0x0320F001, 0x0FFFFFFF, condConstraints, InstName.Yield, T.YieldA1, IsaVersion.v80, InstFlags.Cond), - }; + ]; _table = new(insts); } diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableT16.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableT16.cs index 7ff5f6c90..f660cdcec 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableT16.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableT16.cs @@ -9,48 +9,49 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 static InstTableT16() { - InstEncoding[] rmRdndnConstraints = new InstEncoding[] - { + InstEncoding[] rmRdndnConstraints = + [ new(0x00680000, 0x00780000), - new(0x00850000, 0x00870000), - }; + new(0x00850000, 0x00870000) + ]; - InstEncoding[] rmConstraints = new InstEncoding[] - { - new(0x00680000, 0x00780000), - }; + InstEncoding[] rmConstraints = + [ + new(0x00680000, 0x00780000) + ]; - InstEncoding[] condCondConstraints = new InstEncoding[] - { + InstEncoding[] condCondConstraints = + [ new(0x0E000000, 0x0F000000), - new(0x0F000000, 0x0F000000), - }; + new(0x0F000000, 0x0F000000) + ]; - InstEncoding[] maskConstraints = new InstEncoding[] - { - new(0x00000000, 0x000F0000), - }; + InstEncoding[] maskConstraints = + [ + new(0x00000000, 0x000F0000) + ]; - InstEncoding[] opConstraints = new InstEncoding[] - { - new(0x18000000, 0x18000000), - }; + InstEncoding[] opConstraints = + [ + new(0x18000000, 0x18000000) + ]; - InstEncoding[] opOpOpOpConstraints = new InstEncoding[] - { + InstEncoding[] opOpOpOpConstraints = + [ new(0x00000000, 0x03C00000), new(0x00400000, 0x03C00000), new(0x01400000, 0x03C00000), - new(0x01800000, 0x03C00000), - }; + new(0x01800000, 0x03C00000) + ]; - List insts = new() - { + List insts = + [ new(0x41400000, 0xFFC00000, InstName.AdcR, T.AdcRT1, IsaVersion.v80, InstFlags.Rdn), new(0x1C000000, 0xFE000000, InstName.AddI, T.AddIT1, IsaVersion.v80, InstFlags.Rd), new(0x30000000, 0xF8000000, InstName.AddI, T.AddIT2, IsaVersion.v80, InstFlags.Rdn), new(0x18000000, 0xFE000000, InstName.AddR, T.AddRT1, IsaVersion.v80, InstFlags.Rd), - new(0x44000000, 0xFF000000, rmRdndnConstraints, InstName.AddR, T.AddRT2, IsaVersion.v80, InstFlags.RdnDn), + new(0x44000000, 0xFF000000, rmRdndnConstraints, InstName.AddR, T.AddRT2, IsaVersion.v80, + InstFlags.RdnDn), new(0xA8000000, 0xF8000000, InstName.AddSpI, T.AddSpIT1, IsaVersion.v80, InstFlags.RdRd16), new(0xB0000000, 0xFF800000, InstName.AddSpI, T.AddSpIT2, IsaVersion.v80, InstFlags.None), new(0x44680000, 0xFF780000, InstName.AddSpR, T.AddSpRT1, IsaVersion.v80, InstFlags.None), @@ -86,7 +87,8 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 new(0x20000000, 0xF8000000, InstName.MovI, T.MovIT1, IsaVersion.v80, InstFlags.RdRd16), new(0x46000000, 0xFF000000, InstName.MovR, T.MovRT1, IsaVersion.v80, InstFlags.Rd), new(0x00000000, 0xE0000000, opConstraints, InstName.MovR, T.MovRT2, IsaVersion.v80, InstFlags.Rd), - new(0x40000000, 0xFE000000, opOpOpOpConstraints, InstName.MovRr, T.MovRrT1, IsaVersion.v80, InstFlags.None), + new(0x40000000, 0xFE000000, opOpOpOpConstraints, InstName.MovRr, T.MovRrT1, IsaVersion.v80, + InstFlags.None), new(0x43400000, 0xFFC00000, InstName.Mul, T.MulT1, IsaVersion.v80, InstFlags.None), new(0x43C00000, 0xFFC00000, InstName.MvnR, T.MvnRT1, IsaVersion.v80, InstFlags.Rd), new(0xBF000000, 0xFFFF0000, InstName.Nop, T.NopT1, IsaVersion.v80, InstFlags.None), @@ -99,7 +101,8 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 new(0x42400000, 0xFFC00000, InstName.RsbI, T.RsbIT1, IsaVersion.v80, InstFlags.Rd), new(0x41800000, 0xFFC00000, InstName.SbcR, T.SbcRT1, IsaVersion.v80, InstFlags.Rdn), new(0xB6500000, 0xFFF70000, InstName.Setend, T.SetendT1, IsaVersion.v80, InstFlags.None), - new(0xB6100000, 0xFFF70000, InstName.Setpan, T.SetpanT1, IsaVersion.v81, IsaFeature.FeatPan, InstFlags.None), + new(0xB6100000, 0xFFF70000, InstName.Setpan, T.SetpanT1, IsaVersion.v81, IsaFeature.FeatPan, + InstFlags.None), new(0xBF400000, 0xFFFF0000, InstName.Sev, T.SevT1, IsaVersion.v80, InstFlags.None), new(0xBF500000, 0xFFFF0000, InstName.Sevl, T.SevlT1, IsaVersion.v80, InstFlags.None), new(0xC0000000, 0xF8000000, InstName.Stm, T.StmT1, IsaVersion.v80, InstFlags.RlistRead), @@ -123,8 +126,8 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 new(0xB2800000, 0xFFC00000, InstName.Uxth, T.UxthT1, IsaVersion.v80, InstFlags.Rd), new(0xBF200000, 0xFFFF0000, InstName.Wfe, T.WfeT1, IsaVersion.v80, InstFlags.None), new(0xBF300000, 0xFFFF0000, InstName.Wfi, T.WfiT1, IsaVersion.v80, InstFlags.None), - new(0xBF100000, 0xFFFF0000, InstName.Yield, T.YieldT1, IsaVersion.v80, InstFlags.None), - }; + new(0xBF100000, 0xFFFF0000, InstName.Yield, T.YieldT1, IsaVersion.v80, InstFlags.None) + ]; _table = new(insts); } diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableT32.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableT32.cs index 4a11effdb..0a0774845 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableT32.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/InstTableT32.cs @@ -9,525 +9,525 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 static InstTableT32() { - InstEncoding[] rnRdsConstraints = new InstEncoding[] - { + InstEncoding[] rnRdsConstraints = + [ new(0x000D0000, 0x000F0000), - new(0x00100F00, 0x00100F00), - }; + new(0x00100F00, 0x00100F00) + ]; - InstEncoding[] rnRnConstraints = new InstEncoding[] - { + InstEncoding[] rnRnConstraints = + [ new(0x000D0000, 0x000F0000), - new(0x000F0000, 0x000F0000), - }; + new(0x000F0000, 0x000F0000) + ]; - InstEncoding[] rdsConstraints = new InstEncoding[] - { - new(0x00100F00, 0x00100F00), - }; + InstEncoding[] rdsConstraints = + [ + new(0x00100F00, 0x00100F00) + ]; - InstEncoding[] vdVmConstraints = new InstEncoding[] - { + InstEncoding[] vdVmConstraints = + [ new(0x00001000, 0x00001000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] condCondCondConstraints = new InstEncoding[] - { + InstEncoding[] condCondCondConstraints = + [ new(0x03800000, 0x03C00000), new(0x03C00000, 0x03C00000), - new(0x03800000, 0x03800000), - }; + new(0x03800000, 0x03800000) + ]; - InstEncoding[] rnConstraints = new InstEncoding[] - { - new(0x000F0000, 0x000F0000), - }; + InstEncoding[] rnConstraints = + [ + new(0x000F0000, 0x000F0000) + ]; - InstEncoding[] hConstraints = new InstEncoding[] - { - new(0x00000001, 0x00000001), - }; + InstEncoding[] hConstraints = + [ + new(0x00000001, 0x00000001) + ]; - InstEncoding[] imodmConstraints = new InstEncoding[] - { - new(0x00000000, 0x00000700), - }; + InstEncoding[] imodmConstraints = + [ + new(0x00000000, 0x00000700) + ]; - InstEncoding[] optionConstraints = new InstEncoding[] - { - new(0x00000000, 0x0000000F), - }; + InstEncoding[] optionConstraints = + [ + new(0x00000000, 0x0000000F) + ]; - InstEncoding[] puwPwPuwPuwConstraints = new InstEncoding[] - { + InstEncoding[] puwPwPuwPuwConstraints = + [ new(0x00000000, 0x01A00000), new(0x01000000, 0x01200000), new(0x00200000, 0x01A00000), - new(0x01A00000, 0x01A00000), - }; + new(0x01A00000, 0x01A00000) + ]; - InstEncoding[] rnPuwConstraints = new InstEncoding[] - { + InstEncoding[] rnPuwConstraints = + [ new(0x000F0000, 0x000F0000), - new(0x00000000, 0x01A00000), - }; + new(0x00000000, 0x01A00000) + ]; - InstEncoding[] puwConstraints = new InstEncoding[] - { - new(0x00000000, 0x01A00000), - }; + InstEncoding[] puwConstraints = + [ + new(0x00000000, 0x01A00000) + ]; - InstEncoding[] rnRtConstraints = new InstEncoding[] - { + InstEncoding[] rnRtConstraints = + [ new(0x000F0000, 0x000F0000), - new(0x0000F000, 0x0000F000), - }; + new(0x0000F000, 0x0000F000) + ]; - InstEncoding[] rnRtpuwPuwPwConstraints = new InstEncoding[] - { + InstEncoding[] rnRtpuwPuwPwConstraints = + [ new(0x000F0000, 0x000F0000), new(0x0000F400, 0x0000F700), new(0x00000600, 0x00000700), - new(0x00000000, 0x00000500), - }; + new(0x00000000, 0x00000500) + ]; - InstEncoding[] rtConstraints = new InstEncoding[] - { - new(0x0000F000, 0x0000F000), - }; + InstEncoding[] rtConstraints = + [ + new(0x0000F000, 0x0000F000) + ]; - InstEncoding[] rnPwConstraints = new InstEncoding[] - { + InstEncoding[] rnPwConstraints = + [ new(0x000F0000, 0x000F0000), - new(0x00000000, 0x01200000), - }; + new(0x00000000, 0x01200000) + ]; - InstEncoding[] pwConstraints = new InstEncoding[] - { - new(0x00000000, 0x01200000), - }; + InstEncoding[] pwConstraints = + [ + new(0x00000000, 0x01200000) + ]; - InstEncoding[] rnPuwPwConstraints = new InstEncoding[] - { + InstEncoding[] rnPuwPwConstraints = + [ new(0x000F0000, 0x000F0000), new(0x00000600, 0x00000700), - new(0x00000000, 0x00000500), - }; + new(0x00000000, 0x00000500) + ]; - InstEncoding[] raConstraints = new InstEncoding[] - { - new(0x0000F000, 0x0000F000), - }; + InstEncoding[] raConstraints = + [ + new(0x0000F000, 0x0000F000) + ]; - InstEncoding[] sTConstraints = new InstEncoding[] - { + InstEncoding[] sTConstraints = + [ new(0x00100000, 0x00100000), - new(0x00000010, 0x00000010), - }; + new(0x00000010, 0x00000010) + ]; - InstEncoding[] vdVnVmConstraints = new InstEncoding[] - { + InstEncoding[] vdVnVmConstraints = + [ new(0x00001000, 0x00001000), new(0x00010000, 0x00010000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] shimm2imm3Constraints = new InstEncoding[] - { - new(0x00200000, 0x002070C0), - }; + InstEncoding[] shimm2imm3Constraints = + [ + new(0x00200000, 0x002070C0) + ]; - InstEncoding[] rnimm8Constraints = new InstEncoding[] - { - new(0x000E0000, 0x000F00FF), - }; + InstEncoding[] rnimm8Constraints = + [ + new(0x000E0000, 0x000F00FF) + ]; - InstEncoding[] sizeQvdQvnQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeQvdQvnQvmConstraints = + [ new(0x00300000, 0x00300000), new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] sizeVdConstraints = new InstEncoding[] - { + InstEncoding[] sizeVdConstraints = + [ new(0x00300000, 0x00300000), - new(0x00001000, 0x00001000), - }; + new(0x00001000, 0x00001000) + ]; - InstEncoding[] qvdQvnQvmConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvnQvmConstraints = + [ new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] sizeQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeQvdQvmConstraints = + [ new(0x000C0000, 0x000C0000), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] sizeVnVmConstraints = new InstEncoding[] - { + InstEncoding[] sizeVnVmConstraints = + [ new(0x00300000, 0x00300000), new(0x00010000, 0x00010000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] sizeVdOpvnConstraints = new InstEncoding[] - { + InstEncoding[] sizeVdOpvnConstraints = + [ new(0x00300000, 0x00300000), new(0x00001000, 0x00001000), - new(0x00010100, 0x00010100), - }; + new(0x00010100, 0x00010100) + ]; - InstEncoding[] cmodeCmodeQvdConstraints = new InstEncoding[] - { + InstEncoding[] cmodeCmodeQvdConstraints = + [ new(0x00000000, 0x00000100), new(0x00000C00, 0x00000C00), - new(0x00001040, 0x00001040), - }; + new(0x00001040, 0x00001040) + ]; - InstEncoding[] qvdQvnQvmOpConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvnQvmOpConstraints = + [ new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), new(0x00000041, 0x00000041), - new(0x00000000, 0x00300000), - }; + new(0x00000000, 0x00300000) + ]; - InstEncoding[] qvdQvnQvmSizeConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvnQvmSizeConstraints = + [ new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), new(0x00000041, 0x00000041), - new(0x00300000, 0x00300000), - }; + new(0x00300000, 0x00300000) + ]; - InstEncoding[] qvdQvnConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvnConstraints = + [ new(0x00001040, 0x00001040), - new(0x00010040, 0x00010040), - }; + new(0x00010040, 0x00010040) + ]; - InstEncoding[] qvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvmConstraints = + [ new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] sizeConstraints = new InstEncoding[] - { - new(0x00000000, 0x00000300), - }; + InstEncoding[] sizeConstraints = + [ + new(0x00000000, 0x00000300) + ]; - InstEncoding[] vmConstraints = new InstEncoding[] - { - new(0x00000001, 0x00000001), - }; + InstEncoding[] vmConstraints = + [ + new(0x00000001, 0x00000001) + ]; - InstEncoding[] opvdOpvmConstraints = new InstEncoding[] - { + InstEncoding[] opvdOpvmConstraints = + [ new(0x00001100, 0x00001100), - new(0x00000001, 0x00000101), - }; + new(0x00000001, 0x00000101) + ]; - InstEncoding[] imm6Opimm6Imm6QvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] imm6Opimm6Imm6QvdQvmConstraints = + [ new(0x00000000, 0x00380000), new(0x00200000, 0x00300200), new(0x00000000, 0x00200000), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] qvdEbConstraints = new InstEncoding[] - { + InstEncoding[] qvdEbConstraints = + [ new(0x00210000, 0x00210000), - new(0x00400020, 0x00400020), - }; + new(0x00400020, 0x00400020) + ]; - InstEncoding[] imm4QvdConstraints = new InstEncoding[] - { + InstEncoding[] imm4QvdConstraints = + [ new(0x00000000, 0x00070000), - new(0x00001040, 0x00001040), - }; + new(0x00001040, 0x00001040) + ]; - InstEncoding[] qvdQvnQvmQimm4Constraints = new InstEncoding[] - { + InstEncoding[] qvdQvnQvmQimm4Constraints = + [ new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), new(0x00000041, 0x00000041), - new(0x00000800, 0x00000840), - }; + new(0x00000800, 0x00000840) + ]; - InstEncoding[] qvdConstraints = new InstEncoding[] - { - new(0x00001040, 0x00001040), - }; + InstEncoding[] qvdConstraints = + [ + new(0x00001040, 0x00001040) + ]; - InstEncoding[] vdVnConstraints = new InstEncoding[] - { + InstEncoding[] vdVnConstraints = + [ new(0x00001000, 0x00001000), - new(0x00010000, 0x00010000), - }; + new(0x00010000, 0x00010000) + ]; - InstEncoding[] sizeConstraints2 = new InstEncoding[] - { - new(0x00000C00, 0x00000C00), - }; + InstEncoding[] sizeConstraints2 = + [ + new(0x00000C00, 0x00000C00) + ]; - InstEncoding[] sizeIndexAlignIndexAlignConstraints = new InstEncoding[] - { + InstEncoding[] sizeIndexAlignIndexAlignConstraints = + [ new(0x00000C00, 0x00000C00), new(0x00000010, 0x00000030), - new(0x00000020, 0x00000030), - }; + new(0x00000020, 0x00000030) + ]; - InstEncoding[] sizeSizeaConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeaConstraints = + [ new(0x000000C0, 0x000000C0), - new(0x00000010, 0x000000D0), - }; + new(0x00000010, 0x000000D0) + ]; - InstEncoding[] alignConstraints = new InstEncoding[] - { - new(0x00000020, 0x00000020), - }; + InstEncoding[] alignConstraints = + [ + new(0x00000020, 0x00000020) + ]; - InstEncoding[] alignConstraints2 = new InstEncoding[] - { + InstEncoding[] alignConstraints2 = + [ + new(0x00000030, 0x00000030) + ]; + + InstEncoding[] sizeConstraints3 = + [ + new(0x000000C0, 0x000000C0) + ]; + + InstEncoding[] alignSizeConstraints = + [ new(0x00000030, 0x00000030), - }; + new(0x000000C0, 0x000000C0) + ]; - InstEncoding[] sizeConstraints3 = new InstEncoding[] - { + InstEncoding[] sizeAConstraints = + [ new(0x000000C0, 0x000000C0), - }; + new(0x00000010, 0x00000010) + ]; - InstEncoding[] alignSizeConstraints = new InstEncoding[] - { - new(0x00000030, 0x00000030), + InstEncoding[] sizeAlignConstraints = + [ new(0x000000C0, 0x000000C0), - }; + new(0x00000020, 0x00000020) + ]; - InstEncoding[] sizeAConstraints = new InstEncoding[] - { - new(0x000000C0, 0x000000C0), - new(0x00000010, 0x00000010), - }; - - InstEncoding[] sizeAlignConstraints = new InstEncoding[] - { - new(0x000000C0, 0x000000C0), - new(0x00000020, 0x00000020), - }; - - InstEncoding[] sizeIndexAlignConstraints = new InstEncoding[] - { + InstEncoding[] sizeIndexAlignConstraints = + [ new(0x00000C00, 0x00000C00), - new(0x00000030, 0x00000030), - }; + new(0x00000030, 0x00000030) + ]; - InstEncoding[] sizeaConstraints = new InstEncoding[] - { - new(0x000000C0, 0x000000D0), - }; + InstEncoding[] sizeaConstraints = + [ + new(0x000000C0, 0x000000D0) + ]; - InstEncoding[] sizeSizeVdConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeVdConstraints = + [ new(0x00300000, 0x00300000), new(0x00000000, 0x00300000), - new(0x00001000, 0x00001000), - }; + new(0x00001000, 0x00001000) + ]; - InstEncoding[] sizeQvdQvnConstraints = new InstEncoding[] - { + InstEncoding[] sizeQvdQvnConstraints = + [ new(0x00300000, 0x00300000), new(0x10001000, 0x10001000), - new(0x10010000, 0x10010000), - }; + new(0x10010000, 0x10010000) + ]; - InstEncoding[] imm3hImm3hImm3hImm3hImm3hVdConstraints = new InstEncoding[] - { + InstEncoding[] imm3hImm3hImm3hImm3hImm3hVdConstraints = + [ new(0x00000000, 0x00380000), new(0x00180000, 0x00380000), new(0x00280000, 0x00380000), new(0x00300000, 0x00380000), new(0x00380000, 0x00380000), - new(0x00001000, 0x00001000), - }; + new(0x00001000, 0x00001000) + ]; - InstEncoding[] sizeVmConstraints = new InstEncoding[] - { + InstEncoding[] sizeVmConstraints = + [ new(0x000C0000, 0x000C0000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] opc1opc2Constraints = new InstEncoding[] - { - new(0x00000040, 0x00400060), - }; + InstEncoding[] opc1opc2Constraints = + [ + new(0x00000040, 0x00400060) + ]; - InstEncoding[] uopc1opc2Uopc1opc2Constraints = new InstEncoding[] - { + InstEncoding[] uopc1opc2Uopc1opc2Constraints = + [ new(0x00800000, 0x00C00060), - new(0x00000040, 0x00400060), - }; + new(0x00000040, 0x00400060) + ]; - InstEncoding[] sizeOpuOpsizeVdConstraints = new InstEncoding[] - { + InstEncoding[] sizeOpuOpsizeVdConstraints = + [ new(0x00300000, 0x00300000), new(0x10000200, 0x10000200), new(0x00100200, 0x00300200), - new(0x00001000, 0x00001000), - }; + new(0x00001000, 0x00001000) + ]; - InstEncoding[] sizeOpsizeOpsizeQvdQvnQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeOpsizeOpsizeQvdQvnQvmConstraints = + [ new(0x00300000, 0x00300000), new(0x10100000, 0x10300000), new(0x10200000, 0x10300000), new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] cmodeQvdConstraints = new InstEncoding[] - { + InstEncoding[] cmodeQvdConstraints = + [ new(0x00000E00, 0x00000E00), - new(0x00001040, 0x00001040), - }; + new(0x00001040, 0x00001040) + ]; - InstEncoding[] qConstraints = new InstEncoding[] - { - new(0x00000040, 0x00000040), - }; + InstEncoding[] qConstraints = + [ + new(0x00000040, 0x00000040) + ]; - InstEncoding[] sizeQConstraints = new InstEncoding[] - { + InstEncoding[] sizeQConstraints = + [ new(0x00300000, 0x00300000), - new(0x00000040, 0x00000040), - }; + new(0x00000040, 0x00000040) + ]; - InstEncoding[] sizeConstraints4 = new InstEncoding[] - { - new(0x00300000, 0x00300000), - }; + InstEncoding[] sizeConstraints4 = + [ + new(0x00300000, 0x00300000) + ]; - InstEncoding[] qvdQvnQvmSizeSizeConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvnQvmSizeSizeConstraints = + [ new(0x00001040, 0x00001040), new(0x00010040, 0x00010040), new(0x00000041, 0x00000041), new(0x00000000, 0x00300000), - new(0x00300000, 0x00300000), - }; + new(0x00300000, 0x00300000) + ]; - InstEncoding[] sizeSizeQvdQvnConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeQvdQvnConstraints = + [ new(0x00300000, 0x00300000), new(0x00000000, 0x00300000), new(0x10001000, 0x10001000), - new(0x10010000, 0x10010000), - }; + new(0x10010000, 0x10010000) + ]; - InstEncoding[] opSizeVmConstraints = new InstEncoding[] - { + InstEncoding[] opSizeVmConstraints = + [ new(0x00000000, 0x000000C0), new(0x000C0000, 0x000C0000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] qvdQvmQvnConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvmQvnConstraints = + [ new(0x00001040, 0x00001040), new(0x00000041, 0x00000041), - new(0x00010040, 0x00010040), - }; + new(0x00010040, 0x00010040) + ]; - InstEncoding[] imm6UopVmConstraints = new InstEncoding[] - { + InstEncoding[] imm6UopVmConstraints = + [ new(0x00000000, 0x00380000), new(0x00000000, 0x10000100), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] imm6lUopQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] imm6lUopQvdQvmConstraints = + [ new(0x00000000, 0x00380080), new(0x00000000, 0x10000100), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] qvdQvmSizeSizeConstraints = new InstEncoding[] - { + InstEncoding[] qvdQvmSizeSizeConstraints = + [ new(0x00001040, 0x00001040), new(0x00000041, 0x00000041), new(0x00000000, 0x000C0000), - new(0x000C0000, 0x000C0000), - }; + new(0x000C0000, 0x000C0000) + ]; - InstEncoding[] sizeSizeSizeQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeSizeQvdQvmConstraints = + [ new(0x00040000, 0x000C0000), new(0x00080000, 0x000C0000), new(0x000C0000, 0x000C0000), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] sizeSizeQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeQvdQvmConstraints = + [ new(0x00080000, 0x000C0000), new(0x000C0000, 0x000C0000), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] imm6lQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] imm6lQvdQvmConstraints = + [ new(0x00000000, 0x00380080), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - InstEncoding[] imm6VmConstraints = new InstEncoding[] - { + InstEncoding[] imm6VmConstraints = + [ new(0x00000000, 0x00380000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] imm6VdImm6Imm6Imm6Constraints = new InstEncoding[] - { + InstEncoding[] imm6VdImm6Imm6Imm6Constraints = + [ new(0x00000000, 0x00380000), new(0x00001000, 0x00001000), new(0x00080000, 0x003F0000), new(0x00100000, 0x003F0000), - new(0x00200000, 0x003F0000), - }; + new(0x00200000, 0x003F0000) + ]; - InstEncoding[] sizeVdConstraints2 = new InstEncoding[] - { + InstEncoding[] sizeVdConstraints2 = + [ new(0x000C0000, 0x000C0000), - new(0x00001000, 0x00001000), - }; + new(0x00001000, 0x00001000) + ]; - InstEncoding[] sizeQsizeQvdQvmConstraints = new InstEncoding[] - { + InstEncoding[] sizeQsizeQvdQvmConstraints = + [ new(0x000C0000, 0x000C0000), new(0x00080000, 0x000C0040), new(0x00001040, 0x00001040), - new(0x00000041, 0x00000041), - }; + new(0x00000041, 0x00000041) + ]; - List insts = new() - { + List insts = + [ new(0xF1400000, 0xFBE08000, InstName.AdcI, T.AdcIT1, IsaVersion.v80, InstFlags.Rd), new(0xEB400000, 0xFFE08000, InstName.AdcR, T.AdcRT2, IsaVersion.v80, InstFlags.Rd), new(0xF1000000, 0xFBE08000, rnRdsConstraints, InstName.AddI, T.AddIT3, IsaVersion.v80, InstFlags.Rd), @@ -1190,7 +1190,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32 new(0xF3AF8002, 0xFFFFFFFF, InstName.Wfe, T.WfeT2, IsaVersion.v80, InstFlags.None), new(0xF3AF8003, 0xFFFFFFFF, InstName.Wfi, T.WfiT2, IsaVersion.v80, InstFlags.None), new(0xF3AF8001, 0xFFFFFFFF, InstName.Yield, T.YieldT2, IsaVersion.v80, InstFlags.None), - }; + ]; _table = new(insts); } diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs index 0d56f28c9..643d1e20d 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/Compiler.cs @@ -2,7 +2,6 @@ using ARMeilleure.Common; using ARMeilleure.Memory; using Ryujinx.Cpu.LightningJit.CodeGen; using Ryujinx.Cpu.LightningJit.CodeGen.Arm64; -using System; using System.Collections.Generic; using System.Diagnostics; using System.Numerics; @@ -494,7 +493,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 { delta = targetIndex - branchIndex; - if (delta >= -Encodable26BitsOffsetLimit && delta < Encodable26BitsOffsetLimit) + if (delta is >= (-Encodable26BitsOffsetLimit) and < Encodable26BitsOffsetLimit) { writer.WriteInstructionAt(branchIndex, encoding | (uint)(delta & 0x3ffffff)); @@ -560,7 +559,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 } } - Debug.Assert(name == InstName.B || name == InstName.Cbnz, $"Unknown branch instruction \"{name}\"."); + Debug.Assert(name is InstName.B or InstName.Cbnz, $"Unknown branch instruction \"{name}\"."); } private static void RewriteCallInstructionWithTarget(in Context context, uint targetAddress, uint nextAddress, int branchIndex) @@ -746,6 +745,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 InstEmitSystem.WriteUdf(context.Writer, context.RegisterAllocator, context.TailMerger, context.GetReservedStackOffset(), pc, imm); break; } + context.LoadFromContext(); break; case BranchType.ReadCntpct: diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitAlu.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitAlu.cs index c0762819e..30479137c 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitAlu.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitAlu.cs @@ -736,6 +736,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 { m = GetRrxC(context, dest, m, carryOut); } + break; } } diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitFlow.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitFlow.cs index 48bdbb573..8190bd7ea 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitFlow.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitFlow.cs @@ -142,7 +142,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 int tempRegister; int tempGuestAddress = -1; - bool inlineLookup = guestAddress.Kind != OperandKind.Constant && + bool inlineLookup = guestAddress.Kind != OperandKind.Constant && funcTable is { Sparse: true }; if (guestAddress.Kind == OperandKind.Constant) @@ -205,7 +205,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 for (int i = 0; i < funcTable.Levels.Length; i++) { - var level = funcTable.Levels[i]; + AddressTableLevel level = funcTable.Levels[i]; asm.Ubfx(indexReg, guestAddress, level.Index, level.Length); asm.Lsl(indexReg, indexReg, Const(3)); diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonCommon.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonCommon.cs index dce6556e4..eb5b56364 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonCommon.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonCommon.cs @@ -118,7 +118,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 public static void EmitScalarUnaryF(CodeGenContext context, uint rd, uint rm, uint size, Action action) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; @@ -133,7 +133,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 public static void EmitScalarUnaryF(CodeGenContext context, uint rd, uint rm, uint size, Action action, Action actionHalf) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; @@ -161,7 +161,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 uint sf, Action action) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; @@ -182,7 +182,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 uint sf, Action action) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; @@ -197,7 +197,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 public static void EmitScalarUnaryFixedF(CodeGenContext context, uint rd, uint rm, uint fbits, uint size, bool is16Bit, Action action) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; @@ -214,7 +214,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 public static void EmitScalarBinaryF(CodeGenContext context, uint rd, uint rn, uint rm, uint size, Action action) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; @@ -252,7 +252,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 public static void EmitScalarTernaryRdF(CodeGenContext context, uint rd, uint rn, uint rm, uint size, Action action) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; @@ -276,7 +276,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 uint size, Action action) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; @@ -300,7 +300,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 bool negD, bool negProduct) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; @@ -918,7 +918,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 Action action, Action actionHalf) { - Debug.Assert(sz == 0 || sz == 1); + Debug.Assert(sz is 0 or 1); if (q == 0) { @@ -962,7 +962,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 Action action, Action actionHalf) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); Debug.Assert(size != 3 || q == 1); if (q == 0) @@ -1007,7 +1007,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 uint q, Action action) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); Debug.Assert(size != 3 || q == 1); (uint immb, uint immh) = GetImmbImmh(fbits, size); @@ -1040,7 +1040,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 Action action, Action actionHalf) { - Debug.Assert(sz == 0 || sz == 1); + Debug.Assert(sz is 0 or 1); if (q == 0) { @@ -1100,7 +1100,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 Action action, Action actionHalf) { - Debug.Assert(sz == 0 || sz == 1); + Debug.Assert(sz is 0 or 1); if (q == 0) { @@ -1148,7 +1148,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 uint q, bool negProduct) { - Debug.Assert(sz == 0 || sz == 1); + Debug.Assert(sz is 0 or 1); if (q == 0) { diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonMemory.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonMemory.cs index e77dc0a29..18017351a 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonMemory.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonMemory.cs @@ -467,7 +467,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 private static void EmitMemory1234InstructionCore(CodeGenContext context, uint rn, uint rm, int bytes, Action callback) { bool wBack = rm != RegisterUtils.PcRegister; - bool registerIndex = rm != RegisterUtils.PcRegister && rm != RegisterUtils.SpRegister; + bool registerIndex = rm is not RegisterUtils.PcRegister and not RegisterUtils.SpRegister; Operand rnOperand = InstEmitCommon.GetInputGpr(context, rn); diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonMove.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonMove.cs index 08a0673aa..f22cb5839 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonMove.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitNeonMove.cs @@ -252,7 +252,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 } else { - Debug.Assert(opc1 == 0 || opc1 == 1); + Debug.Assert(opc1 is 0 or 1); Debug.Assert(opc2 == 0); index = opc1 & 1u; @@ -307,7 +307,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 } else { - Debug.Assert(opc1 == 0 || opc1 == 1); + Debug.Assert(opc1 is 0 or 1); Debug.Assert(opc2 == 0); Debug.Assert(!u); diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitSystem.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitSystem.cs index 4d97a2264..10a3298e7 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitSystem.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitSystem.cs @@ -60,6 +60,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 return; } } + break; } } @@ -109,6 +110,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 break; } } + break; } @@ -142,6 +144,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 context.Arm64Assembler.B(0); return; } + break; } @@ -478,7 +481,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 bool skipContext, int spillBaseOffset, int? resultRegister, - params ulong[] callArgs) + params ReadOnlySpan callArgs) { uint resultMask = 0u; diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpCompare.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpCompare.cs index f5f306099..66873818e 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpCompare.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpCompare.cs @@ -1,5 +1,4 @@ using Ryujinx.Cpu.LightningJit.CodeGen; -using System; using System.Diagnostics; namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 @@ -28,7 +27,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 private static void EmitVcmpVcmpe(CodeGenContext context, uint cond, uint rd, uint rm, uint size, bool zero, bool e) { - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; uint ftype = size ^ 2u; diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpConvert.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpConvert.cs index 8e4886950..aef833256 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpConvert.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpConvert.cs @@ -231,7 +231,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 { bool unsigned = (op & 1) == 0; - Debug.Assert(size == 1 || size == 2 || size == 3); + Debug.Assert(size is 1 or 2 or 3); bool singleRegs = size != 3; diff --git a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpMove.cs b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpMove.cs index 5c1eefacf..2be82ff2a 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpMove.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm32/Target/Arm64/InstEmitVfpMove.cs @@ -1,5 +1,3 @@ -using Ryujinx.Cpu.LightningJit.CodeGen; - namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 { static class InstEmitVfpMove diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/Block.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/Block.cs index 188630a1c..405126357 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm64/Block.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm64/Block.cs @@ -25,8 +25,8 @@ namespace Ryujinx.Cpu.LightningJit.Arm64 { Debug.Assert((int)((endAddress - address) / 4) == instructions.Count); - _predecessors = new(); - _successors = new(); + _predecessors = []; + _successors = []; Address = address; EndAddress = endAddress; Instructions = instructions; diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/InstName.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/InstName.cs index 3391a2c14..af3b872a5 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm64/InstName.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm64/InstName.cs @@ -1044,7 +1044,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64 { public static bool IsCall(this InstName name) { - return name == InstName.Bl || name == InstName.Blr; + return name is InstName.Bl or InstName.Blr; } public static bool IsControlFlowOrException(this InstName name) diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/MultiBlock.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/MultiBlock.cs index 8ac65059a..42fd24ec9 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm64/MultiBlock.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm64/MultiBlock.cs @@ -36,8 +36,8 @@ namespace Ryujinx.Cpu.LightningJit.Arm64 { Console.WriteLine($"bb {block.Index}"); - List predList = new(); - List succList = new(); + List predList = []; + List succList = []; for (int index = 0; index < block.PredecessorsCount; index++) { diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/SysUtils.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/SysUtils.cs index 69689a391..a61f35280 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm64/SysUtils.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm64/SysUtils.cs @@ -1,5 +1,3 @@ -using System.Diagnostics; - namespace Ryujinx.Cpu.LightningJit.Arm64 { static class SysUtils diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs index 4a3c507df..e45d74f9b 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Compiler.cs @@ -3,7 +3,6 @@ using ARMeilleure.Memory; using Ryujinx.Cpu.LightningJit.CodeGen; using Ryujinx.Cpu.LightningJit.CodeGen.Arm64; using Ryujinx.Cpu.LightningJit.Graph; -using System; using System.Collections.Generic; using System.Diagnostics; using System.Numerics; @@ -309,7 +308,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 MultiBlock multiBlock = Decoder.DecodeMulti(cpuPreset, memoryManager, address); Dictionary targets = new(); - List pendingBranches = new(); + List pendingBranches = []; uint gprUseMask = multiBlock.GlobalUseMask.GprMask; uint fpSimdUseMask = multiBlock.GlobalUseMask.FpSimdMask; @@ -546,6 +545,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 context.GetReservedStackOffset(), isTail: true); } + break; case InstName.Ret: @@ -566,6 +566,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 context.TailMerger.AddUnconditionalReturn(writer, asm); } + break; case InstName.BCond: @@ -575,7 +576,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 case InstName.Tbz: uint branchMask; - if (name == InstName.Tbnz || name == InstName.Tbz) + if (name is InstName.Tbnz or InstName.Tbz) { originalOffset = ImmUtils.ExtractSImm14Times4(encoding); branchMask = 0x3fff; @@ -632,7 +633,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 { delta = targetIndex - branchIndex; - if (delta >= -Encodable26BitsOffsetLimit && delta < Encodable26BitsOffsetLimit) + if (delta is >= (-Encodable26BitsOffsetLimit) and < Encodable26BitsOffsetLimit) { writer.WriteInstructionAt(branchIndex, (encoding & ~0x3ffffffu) | (uint)(delta & 0x3ffffff)); break; @@ -653,7 +654,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 case InstName.Tbz: uint branchMask; - if (name == InstName.Tbnz || name == InstName.Tbz) + if (name is InstName.Tbnz or InstName.Tbz) { originalOffset = ImmUtils.ExtractSImm14Times4(encoding); branchMask = 0x3fff; @@ -710,6 +711,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 writer.WriteInstructionAt(movedBranchIndex, (encoding & ~(branchMask << 5)) | (uint)((delta & branchMask) << 5)); WriteTailCallConstant(context, ref asm, blockIndex, targetAddress); } + break; default: diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Decoder.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Decoder.cs index d5e1eb19c..ad221c7aa 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Decoder.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/Decoder.cs @@ -15,8 +15,8 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 public static MultiBlock DecodeMulti(CpuPreset cpuPreset, IMemoryManager memoryManager, ulong address) { - List blocks = new(); - List branchTargets = new(); + List blocks = []; + List branchTargets = []; RegisterMask useMask = RegisterMask.Zero; @@ -72,7 +72,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 case InstName.Cbz: case InstName.Tbnz: case InstName.Tbz: - if (name == InstName.Tbnz || name == InstName.Tbz) + if (name is InstName.Tbnz or InstName.Tbz) { originalOffset = ImmUtils.ExtractSImm14Times4(encoding); } @@ -238,7 +238,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 { ulong startAddress = address; - List insts = new(); + List insts = []; uint gprUseMask = useMask.GprMask; uint fpSimdUseMask = useMask.FpSimdMask; @@ -369,7 +369,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 case InstName.Cbz: case InstName.Tbnz: case InstName.Tbz: - int imm = name == InstName.Tbnz || name == InstName.Tbz + int imm = name is InstName.Tbnz or InstName.Tbz ? ImmUtils.ExtractSImm14Times4(encoding) : ImmUtils.ExtractSImm19Times4(encoding); diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstEmitSystem.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstEmitSystem.cs index f534e8b6e..1bd69bc4b 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstEmitSystem.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstEmitSystem.cs @@ -230,7 +230,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 case InstName.Bl: case InstName.Blr: case InstName.Br: - if (name == InstName.BUncond || name == InstName.Bl) + if (name is InstName.BUncond or InstName.Bl) { int imm = ImmUtils.ExtractSImm26Times4(encoding); @@ -283,6 +283,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 isTail); } } + break; default: @@ -307,7 +308,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 int tempRegister; int tempGuestAddress = -1; - bool inlineLookup = guestAddress.Kind != OperandKind.Constant && + bool inlineLookup = guestAddress.Kind != OperandKind.Constant && funcTable is { Sparse: true }; if (guestAddress.Kind == OperandKind.Constant) @@ -370,7 +371,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 for (int i = 0; i < funcTable.Levels.Length; i++) { - var level = funcTable.Levels[i]; + AddressTableLevel level = funcTable.Levels[i]; asm.Ubfx(indexReg, guestAddress, level.Index, level.Length); asm.Lsl(indexReg, indexReg, Const(3)); @@ -417,7 +418,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 nint funcPtr, int spillBaseOffset, int? resultRegister, - params ulong[] callArgs) + params ReadOnlySpan callArgs) { uint resultMask = 0u; diff --git a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstTable.cs b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstTable.cs index 88718afb1..984545800 100644 --- a/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstTable.cs +++ b/src/Ryujinx.Cpu/LightningJit/Arm64/Target/Arm64/InstTable.cs @@ -94,37 +94,37 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 static InstTable() { - InstEncoding[] qsizeConstraints = new InstEncoding[] - { - new(0x00C00000, 0x40C00000), - }; + InstEncoding[] qsizeConstraints = + [ + new(0x00C00000, 0x40C00000) + ]; - InstEncoding[] sizeConstraints = new InstEncoding[] - { - new(0x00C00000, 0x00C00000), - }; + InstEncoding[] sizeConstraints = + [ + new(0x00C00000, 0x00C00000) + ]; - InstEncoding[] opuOpuOpuConstraints = new InstEncoding[] - { + InstEncoding[] opuOpuOpuConstraints = + [ new(0x00001400, 0x00001C00), new(0x00001800, 0x00001C00), - new(0x00001C00, 0x00001C00), - }; + new(0x00001C00, 0x00001C00) + ]; - InstEncoding[] shiftSfimm6Constraints = new InstEncoding[] - { + InstEncoding[] shiftSfimm6Constraints = + [ new(0x00C00000, 0x00C00000), - new(0x00008000, 0x80008000), - }; + new(0x00008000, 0x80008000) + ]; - InstEncoding[] qsizeSizeConstraints = new InstEncoding[] - { + InstEncoding[] qsizeSizeConstraints = + [ new(0x00800000, 0x40C00000), - new(0x00C00000, 0x00C00000), - }; + new(0x00C00000, 0x00C00000) + ]; - InstEncoding[] nimmsNimmsNimmsNimmsNimmsNimmsNimmsNimmsSfnConstraints = new InstEncoding[] - { + InstEncoding[] nimmsNimmsNimmsNimmsNimmsNimmsNimmsNimmsSfnConstraints = + [ new(0x0040FC00, 0x0040FC00), new(0x00007C00, 0x0040FC00), new(0x0000BC00, 0x0040FC00), @@ -133,326 +133,326 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 new(0x0000F400, 0x0040FC00), new(0x0000F800, 0x0040FC00), new(0x0000FC00, 0x0040FC00), - new(0x00400000, 0x80400000), - }; + new(0x00400000, 0x80400000) + ]; - InstEncoding[] sfimm6Constraints = new InstEncoding[] - { - new(0x00008000, 0x80008000), - }; + InstEncoding[] sfimm6Constraints = + [ + new(0x00008000, 0x80008000) + ]; - InstEncoding[] sfnSfnSfimmr5Sfimms5Constraints = new InstEncoding[] - { + InstEncoding[] sfnSfnSfimmr5Sfimms5Constraints = + [ new(0x80000000, 0x80400000), new(0x00400000, 0x80400000), new(0x00200000, 0x80200000), - new(0x00008000, 0x80008000), - }; + new(0x00008000, 0x80008000) + ]; - InstEncoding[] cmodeopqConstraints = new InstEncoding[] - { - new(0x2000F000, 0x6000F000), - }; + InstEncoding[] cmodeopqConstraints = + [ + new(0x2000F000, 0x6000F000) + ]; - InstEncoding[] rsRtConstraints = new InstEncoding[] - { + InstEncoding[] rsRtConstraints = + [ new(0x00010000, 0x00010000), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] sfszSfszSfszSfszConstraints = new InstEncoding[] - { + InstEncoding[] sfszSfszSfszSfszConstraints = + [ new(0x80000000, 0x80000C00), new(0x80000400, 0x80000C00), new(0x80000800, 0x80000C00), - new(0x00000C00, 0x80000C00), - }; + new(0x00000C00, 0x80000C00) + ]; - InstEncoding[] imm5Constraints = new InstEncoding[] - { + InstEncoding[] imm5Constraints = + [ + new(0x00000000, 0x000F0000) + ]; + + InstEncoding[] imm5Imm5qConstraints = + [ new(0x00000000, 0x000F0000), - }; + new(0x00080000, 0x400F0000) + ]; - InstEncoding[] imm5Imm5qConstraints = new InstEncoding[] - { - new(0x00000000, 0x000F0000), - new(0x00080000, 0x400F0000), - }; - - InstEncoding[] nsfNsfSfimmsConstraints = new InstEncoding[] - { + InstEncoding[] nsfNsfSfimmsConstraints = + [ new(0x00400000, 0x80400000), new(0x80000000, 0x80400000), - new(0x00008000, 0x80008000), - }; + new(0x00008000, 0x80008000) + ]; - InstEncoding[] qimm4Constraints = new InstEncoding[] - { - new(0x00004000, 0x40004000), - }; + InstEncoding[] qimm4Constraints = + [ + new(0x00004000, 0x40004000) + ]; - InstEncoding[] qszConstraints = new InstEncoding[] - { - new(0x00400000, 0x40400000), - }; + InstEncoding[] qszConstraints = + [ + new(0x00400000, 0x40400000) + ]; - InstEncoding[] euacEuacEuacConstraints = new InstEncoding[] - { + InstEncoding[] euacEuacEuacConstraints = + [ new(0x00000800, 0x20800800), new(0x00800000, 0x20800800), - new(0x00800800, 0x20800800), - }; + new(0x00800800, 0x20800800) + ]; - InstEncoding[] qszEuacEuacEuacConstraints = new InstEncoding[] - { + InstEncoding[] qszEuacEuacEuacConstraints = + [ new(0x00400000, 0x40400000), new(0x00000800, 0x20800800), new(0x00800000, 0x20800800), - new(0x00800800, 0x20800800), - }; + new(0x00800800, 0x20800800) + ]; - InstEncoding[] szConstraints = new InstEncoding[] - { - new(0x00400000, 0x00400000), - }; + InstEncoding[] szConstraints = + [ + new(0x00400000, 0x00400000) + ]; - InstEncoding[] sizeQsizeConstraints = new InstEncoding[] - { + InstEncoding[] sizeQsizeConstraints = + [ new(0x00000000, 0x00C00000), - new(0x00C00000, 0x40C00000), - }; + new(0x00C00000, 0x40C00000) + ]; - InstEncoding[] sizeSizeSizelSizeqSizehqConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeSizelSizeqSizehqConstraints = + [ new(0x00000000, 0x00C00000), new(0x00C00000, 0x00C00000), new(0x00A00000, 0x00E00000), new(0x00800000, 0x40C00000), - new(0x00400800, 0x40C00800), - }; + new(0x00400800, 0x40C00800) + ]; - InstEncoding[] szConstraints2 = new InstEncoding[] - { - new(0x00000000, 0x00400000), - }; + InstEncoding[] szConstraints2 = + [ + new(0x00000000, 0x00400000) + ]; - InstEncoding[] immhConstraints = new InstEncoding[] - { + InstEncoding[] immhConstraints = + [ + new(0x00000000, 0x00780000) + ]; + + InstEncoding[] immhQimmhConstraints = + [ new(0x00000000, 0x00780000), - }; + new(0x00400000, 0x40400000) + ]; - InstEncoding[] immhQimmhConstraints = new InstEncoding[] - { - new(0x00000000, 0x00780000), - new(0x00400000, 0x40400000), - }; + InstEncoding[] sfscaleConstraints = + [ + new(0x00000000, 0x80008000) + ]; - InstEncoding[] sfscaleConstraints = new InstEncoding[] - { - new(0x00000000, 0x80008000), - }; - - InstEncoding[] ftypeopcFtypeopcFtypeopcFtypeopcFtypeOpcConstraints = new InstEncoding[] - { + InstEncoding[] ftypeopcFtypeopcFtypeopcFtypeopcFtypeOpcConstraints = + [ new(0x00000000, 0x00C18000), new(0x00408000, 0x00C18000), new(0x00810000, 0x00C18000), new(0x00C18000, 0x00C18000), new(0x00800000, 0x00C00000), - new(0x00010000, 0x00018000), - }; + new(0x00010000, 0x00018000) + ]; - InstEncoding[] szlConstraints = new InstEncoding[] - { + InstEncoding[] szlConstraints = + [ + new(0x00600000, 0x00600000) + ]; + + InstEncoding[] szlQszConstraints = + [ new(0x00600000, 0x00600000), - }; + new(0x00400000, 0x40400000) + ]; - InstEncoding[] szlQszConstraints = new InstEncoding[] - { - new(0x00600000, 0x00600000), - new(0x00400000, 0x40400000), - }; + InstEncoding[] qConstraints = + [ + new(0x00000000, 0x40000000) + ]; - InstEncoding[] qConstraints = new InstEncoding[] - { - new(0x00000000, 0x40000000), - }; - - InstEncoding[] sfftypermodeSfftypermodeConstraints = new InstEncoding[] - { + InstEncoding[] sfftypermodeSfftypermodeConstraints = + [ new(0x00400000, 0x80C80000), - new(0x80000000, 0x80C80000), - }; + new(0x80000000, 0x80C80000) + ]; - InstEncoding[] uo1o2Constraints = new InstEncoding[] - { - new(0x20800000, 0x20801000), - }; + InstEncoding[] uo1o2Constraints = + [ + new(0x20800000, 0x20801000) + ]; - InstEncoding[] qszUo1o2Constraints = new InstEncoding[] - { + InstEncoding[] qszUo1o2Constraints = + [ new(0x00400000, 0x40400000), - new(0x20800000, 0x20801000), - }; + new(0x20800000, 0x20801000) + ]; - InstEncoding[] sConstraints = new InstEncoding[] - { - new(0x00001000, 0x00001000), - }; + InstEncoding[] sConstraints = + [ + new(0x00001000, 0x00001000) + ]; - InstEncoding[] opcodesizeOpcodesizeOpcodesizesOpcodesizeConstraints = new InstEncoding[] - { + InstEncoding[] opcodesizeOpcodesizeOpcodesizesOpcodesizeConstraints = + [ new(0x00004400, 0x0000C400), new(0x00008800, 0x0000C800), new(0x00009400, 0x0000D400), - new(0x0000C000, 0x0000C000), - }; + new(0x0000C000, 0x0000C000) + ]; - InstEncoding[] qsizeConstraints2 = new InstEncoding[] - { - new(0x00000C00, 0x40000C00), - }; + InstEncoding[] qsizeConstraints2 = + [ + new(0x00000C00, 0x40000C00) + ]; - InstEncoding[] rtRtConstraints = new InstEncoding[] - { + InstEncoding[] rtRtConstraints = + [ new(0x00000018, 0x00000018), - new(0x00000001, 0x00000001), - }; + new(0x00000001, 0x00000001) + ]; - InstEncoding[] opc1sizeOpc1sizeOpc1sizeConstraints = new InstEncoding[] - { + InstEncoding[] opc1sizeOpc1sizeOpc1sizeConstraints = + [ new(0x40800000, 0xC0800000), new(0x80800000, 0xC0800000), - new(0xC0800000, 0xC0800000), - }; + new(0xC0800000, 0xC0800000) + ]; - InstEncoding[] rtRt2Constraints = new InstEncoding[] - { + InstEncoding[] rtRt2Constraints = + [ new(0x0000001F, 0x0000001F), - new(0x001F0000, 0x001F0000), - }; + new(0x001F0000, 0x001F0000) + ]; - InstEncoding[] opcConstraints = new InstEncoding[] - { - new(0xC0000000, 0xC0000000), - }; + InstEncoding[] opcConstraints = + [ + new(0xC0000000, 0xC0000000) + ]; - InstEncoding[] opcConstraints2 = new InstEncoding[] - { - new(0x40000000, 0x40000000), - }; + InstEncoding[] opcConstraints2 = + [ + new(0x40000000, 0x40000000) + ]; - InstEncoding[] opclOpcConstraints = new InstEncoding[] - { + InstEncoding[] opclOpcConstraints = + [ new(0x40000000, 0x40400000), - new(0xC0000000, 0xC0000000), - }; + new(0xC0000000, 0xC0000000) + ]; - InstEncoding[] optionConstraints = new InstEncoding[] - { - new(0x00000000, 0x00004000), - }; + InstEncoding[] optionConstraints = + [ + new(0x00000000, 0x00004000) + ]; - InstEncoding[] opc1sizeOpc1sizeOpc1sizeOptionConstraints = new InstEncoding[] - { + InstEncoding[] opc1sizeOpc1sizeOpc1sizeOptionConstraints = + [ new(0x40800000, 0xC0800000), new(0x80800000, 0xC0800000), new(0xC0800000, 0xC0800000), - new(0x00000000, 0x00004000), - }; + new(0x00000000, 0x00004000) + ]; - InstEncoding[] sizeSizeConstraints = new InstEncoding[] - { + InstEncoding[] sizeSizeConstraints = + [ new(0x00000000, 0x00C00000), - new(0x00C00000, 0x00C00000), - }; + new(0x00C00000, 0x00C00000) + ]; - InstEncoding[] sfhwConstraints = new InstEncoding[] - { - new(0x00400000, 0x80400000), - }; + InstEncoding[] sfhwConstraints = + [ + new(0x00400000, 0x80400000) + ]; - InstEncoding[] rtConstraints = new InstEncoding[] - { - new(0x00000001, 0x00000001), - }; + InstEncoding[] rtConstraints = + [ + new(0x00000001, 0x00000001) + ]; - InstEncoding[] usizeUsizeUsizeSizeConstraints = new InstEncoding[] - { + InstEncoding[] usizeUsizeUsizeSizeConstraints = + [ new(0x20400000, 0x20C00000), new(0x20800000, 0x20C00000), new(0x20C00000, 0x20C00000), - new(0x00C00000, 0x00C00000), - }; + new(0x00C00000, 0x00C00000) + ]; - InstEncoding[] sizeSizeConstraints2 = new InstEncoding[] - { + InstEncoding[] sizeSizeConstraints2 = + [ + new(0x00400000, 0x00C00000), + new(0x00800000, 0x00C00000) + ]; + + InstEncoding[] rtConstraints2 = + [ + new(0x00000018, 0x00000018) + ]; + + InstEncoding[] sfopcConstraints = + [ + new(0x00000400, 0x80000400) + ]; + + InstEncoding[] sizeSizeSizeConstraints = + [ new(0x00400000, 0x00C00000), new(0x00800000, 0x00C00000), - }; + new(0x00C00000, 0x00C00000) + ]; - InstEncoding[] rtConstraints2 = new InstEncoding[] - { - new(0x00000018, 0x00000018), - }; - - InstEncoding[] sfopcConstraints = new InstEncoding[] - { - new(0x00000400, 0x80000400), - }; - - InstEncoding[] sizeSizeSizeConstraints = new InstEncoding[] - { - new(0x00400000, 0x00C00000), + InstEncoding[] sizeSizeConstraints3 = + [ new(0x00800000, 0x00C00000), - new(0x00C00000, 0x00C00000), - }; + new(0x00C00000, 0x00C00000) + ]; - InstEncoding[] sizeSizeConstraints3 = new InstEncoding[] - { - new(0x00800000, 0x00C00000), - new(0x00C00000, 0x00C00000), - }; + InstEncoding[] sfConstraints = + [ + new(0x00000000, 0x80000000) + ]; - InstEncoding[] sfConstraints = new InstEncoding[] - { - new(0x00000000, 0x80000000), - }; - - InstEncoding[] immhImmhConstraints = new InstEncoding[] - { + InstEncoding[] immhImmhConstraints = + [ new(0x00000000, 0x00780000), - new(0x00400000, 0x00400000), - }; + new(0x00400000, 0x00400000) + ]; - InstEncoding[] sizeSizeConstraints4 = new InstEncoding[] - { + InstEncoding[] sizeSizeConstraints4 = + [ new(0x00C00000, 0x00C00000), - new(0x00000000, 0x00C00000), - }; + new(0x00000000, 0x00C00000) + ]; - InstEncoding[] ssizeSsizeSsizeConstraints = new InstEncoding[] - { + InstEncoding[] ssizeSsizeSsizeConstraints = + [ new(0x00000000, 0x00C00800), new(0x00400000, 0x00C00800), - new(0x00800000, 0x00C00800), - }; + new(0x00800000, 0x00C00800) + ]; - InstEncoding[] immhOpuConstraints = new InstEncoding[] - { + InstEncoding[] immhOpuConstraints = + [ new(0x00000000, 0x00780000), - new(0x00000000, 0x20001000), - }; + new(0x00000000, 0x20001000) + ]; - InstEncoding[] immhQimmhOpuConstraints = new InstEncoding[] - { + InstEncoding[] immhQimmhOpuConstraints = + [ new(0x00000000, 0x00780000), new(0x00400000, 0x40400000), - new(0x00000000, 0x20001000), - }; + new(0x00000000, 0x20001000) + ]; - List insts = new() - { + List insts = + [ new(0x5AC02000, 0x7FFFFC00, InstName.Abs, IsaVersion.v89, InstFlags.RdRn), new(0x5EE0B800, 0xFFFFFC00, InstName.AbsAdvsimdS, IsaVersion.v80, InstFlags.RdRnFpSimd), new(0x0E20B800, 0xBF3FFC00, qsizeConstraints, InstName.AbsAdvsimdV, IsaVersion.v80, InstFlags.RdRnFpSimd), @@ -1587,7 +1587,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64 new(0xD503203F, 0xFFFFFFFF, InstName.Yield, IsaVersion.v80, InstFlags.None), new(0x0E003800, 0xBF20FC00, qsizeConstraints, InstName.Zip1Advsimd, IsaVersion.v80, InstFlags.RdRnRmFpSimd), new(0x0E007800, 0xBF20FC00, qsizeConstraints, InstName.Zip2Advsimd, IsaVersion.v80, InstFlags.RdRnRmFpSimd), - }; + ]; _table = new(insts); } diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/CacheMemoryAllocator.cs b/src/Ryujinx.Cpu/LightningJit/Cache/CacheMemoryAllocator.cs index 8ba3a6dcd..05c889922 100644 --- a/src/Ryujinx.Cpu/LightningJit/Cache/CacheMemoryAllocator.cs +++ b/src/Ryujinx.Cpu/LightningJit/Cache/CacheMemoryAllocator.cs @@ -24,7 +24,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache } } - private readonly List _blocks = new(); + private readonly List _blocks = []; public CacheMemoryAllocator(int capacity) { diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/JitCache.cs b/src/Ryujinx.Cpu/LightningJit/Cache/JitCache.cs index ac1274bf6..4ab54ecb7 100644 --- a/src/Ryujinx.Cpu/LightningJit/Cache/JitCache.cs +++ b/src/Ryujinx.Cpu/LightningJit/Cache/JitCache.cs @@ -1,10 +1,13 @@ using ARMeilleure.Memory; +using Humanizer; +using Ryujinx.Common.Logging; using Ryujinx.Memory; using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.Versioning; +using System.Threading; namespace Ryujinx.Cpu.LightningJit.Cache { @@ -14,17 +17,18 @@ namespace Ryujinx.Cpu.LightningJit.Cache private static readonly int _pageMask = _pageSize - 1; private const int CodeAlignment = 4; // Bytes. - private const int CacheSize = 2047 * 1024 * 1024; + private const int CacheSize = 256 * 1024 * 1024; - private static ReservedRegion _jitRegion; private static JitCacheInvalidation _jitCacheInvalidator; private static CacheMemoryAllocator _cacheAllocator; - private static readonly List _cacheEntries = new(); + private static readonly List _cacheEntries = []; - private static readonly object _lock = new(); + private static readonly Lock _lock = new(); private static bool _initialized; + private static readonly List _jitRegions = []; + private static int _activeRegionIndex = 0; [SupportedOSPlatform("windows")] [LibraryImport("kernel32.dll", SetLastError = true)] @@ -44,7 +48,9 @@ namespace Ryujinx.Cpu.LightningJit.Cache return; } - _jitRegion = new ReservedRegion(allocator, CacheSize); + ReservedRegion firstRegion = new(allocator, CacheSize); + _jitRegions.Add(firstRegion); + _activeRegionIndex = 0; if (!OperatingSystem.IsWindows() && !OperatingSystem.IsMacOS()) { @@ -64,8 +70,8 @@ namespace Ryujinx.Cpu.LightningJit.Cache Debug.Assert(_initialized); int funcOffset = Allocate(code.Length); - - nint funcPtr = _jitRegion.Pointer + funcOffset; + ReservedRegion targetRegion = _jitRegions[_activeRegionIndex]; + nint funcPtr = targetRegion.Pointer + funcOffset; if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64) { @@ -79,18 +85,11 @@ namespace Ryujinx.Cpu.LightningJit.Cache } else { - ReprotectAsWritable(funcOffset, code.Length); - code.CopyTo(new Span((void*)funcPtr, code.Length)); - ReprotectAsExecutable(funcOffset, code.Length); + ReprotectAsWritable(targetRegion, funcOffset, code.Length); + Marshal.Copy(code.ToArray(), 0, funcPtr, code.Length); + ReprotectAsExecutable(targetRegion, funcOffset, code.Length); - if (OperatingSystem.IsWindows() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64) - { - FlushInstructionCache(Process.GetCurrentProcess().Handle, funcPtr, (nuint)code.Length); - } - else - { - _jitCacheInvalidator?.Invalidate(funcPtr, (ulong)code.Length); - } + _jitCacheInvalidator?.Invalidate(funcPtr, (ulong)code.Length); } Add(funcOffset, code.Length); @@ -105,50 +104,80 @@ namespace Ryujinx.Cpu.LightningJit.Cache { Debug.Assert(_initialized); - int funcOffset = (int)(pointer.ToInt64() - _jitRegion.Pointer.ToInt64()); - - if (TryFind(funcOffset, out CacheEntry entry, out int entryIndex) && entry.Offset == funcOffset) + foreach (ReservedRegion region in _jitRegions) { - _cacheAllocator.Free(funcOffset, AlignCodeSize(entry.Size)); - _cacheEntries.RemoveAt(entryIndex); + if (pointer.ToInt64() < region.Pointer.ToInt64() || + pointer.ToInt64() >= (region.Pointer + CacheSize).ToInt64()) + { + continue; + } + + int funcOffset = (int)(pointer.ToInt64() - region.Pointer.ToInt64()); + + if (TryFind(funcOffset, out CacheEntry entry, out int entryIndex) && entry.Offset == funcOffset) + { + _cacheAllocator.Free(funcOffset, AlignCodeSize(entry.Size)); + _cacheEntries.RemoveAt(entryIndex); + } + + return; } } } - private static void ReprotectAsWritable(int offset, int size) + private static void ReprotectAsWritable(ReservedRegion region, int offset, int size) { int endOffs = offset + size; - int regionStart = offset & ~_pageMask; int regionEnd = (endOffs + _pageMask) & ~_pageMask; - _jitRegion.Block.MapAsRwx((ulong)regionStart, (ulong)(regionEnd - regionStart)); + region.Block.MapAsRwx((ulong)regionStart, (ulong)(regionEnd - regionStart)); } - private static void ReprotectAsExecutable(int offset, int size) + private static void ReprotectAsExecutable(ReservedRegion region, int offset, int size) { int endOffs = offset + size; - int regionStart = offset & ~_pageMask; int regionEnd = (endOffs + _pageMask) & ~_pageMask; - _jitRegion.Block.MapAsRx((ulong)regionStart, (ulong)(regionEnd - regionStart)); + region.Block.MapAsRx((ulong)regionStart, (ulong)(regionEnd - regionStart)); } private static int Allocate(int codeSize) { codeSize = AlignCodeSize(codeSize); - int allocOffset = _cacheAllocator.Allocate(codeSize); - - if (allocOffset < 0) + for (int i = _activeRegionIndex; i < _jitRegions.Count; i++) { - throw new OutOfMemoryException("JIT Cache exhausted."); + int allocOffset = _cacheAllocator.Allocate(codeSize); + + if (allocOffset >= 0) + { + _jitRegions[i].ExpandIfNeeded((ulong)allocOffset + (ulong)codeSize); + _activeRegionIndex = i; + return allocOffset; + } } - _jitRegion.ExpandIfNeeded((ulong)allocOffset + (ulong)codeSize); + int exhaustedRegion = _activeRegionIndex; + ReservedRegion newRegion = new(_jitRegions[0].Allocator, CacheSize); + _jitRegions.Add(newRegion); + _activeRegionIndex = _jitRegions.Count - 1; - return allocOffset; + int newRegionNumber = _activeRegionIndex; + + Logger.Warning?.Print(LogClass.Cpu, $"JIT Cache Region {exhaustedRegion} exhausted, creating new Cache Region {newRegionNumber} ({((long)(newRegionNumber + 1) * CacheSize).Bytes()} Total Allocation)."); + + _cacheAllocator = new CacheMemoryAllocator(CacheSize); + + int allocOffsetNew = _cacheAllocator.Allocate(codeSize); + if (allocOffsetNew < 0) + { + throw new OutOfMemoryException("Failed to allocate in new Cache Region!"); + } + + newRegion.ExpandIfNeeded((ulong)allocOffsetNew + (ulong)codeSize); + return allocOffsetNew; } private static int AlignCodeSize(int codeSize) diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/JitCacheInvalidation.cs b/src/Ryujinx.Cpu/LightningJit/Cache/JitCacheInvalidation.cs index d0a5e4ac8..ae71aa1d3 100644 --- a/src/Ryujinx.Cpu/LightningJit/Cache/JitCacheInvalidation.cs +++ b/src/Ryujinx.Cpu/LightningJit/Cache/JitCacheInvalidation.cs @@ -1,13 +1,12 @@ using ARMeilleure.Memory; -using System; using System.Runtime.InteropServices; namespace Ryujinx.Cpu.LightningJit.Cache { class JitCacheInvalidation { - private static readonly int[] _invalidationCode = new int[] - { + private static readonly int[] _invalidationCode = + [ unchecked((int)0xd53b0022), // mrs x2, ctr_el0 unchecked((int)0xd3504c44), // ubfx x4, x2, #16, #4 unchecked((int)0x52800083), // mov w3, #0x4 @@ -35,8 +34,8 @@ namespace Ryujinx.Cpu.LightningJit.Cache unchecked((int)0x54ffffa8), // b.hi 54 unchecked((int)0xd5033b9f), // dsb ish unchecked((int)0xd5033fdf), // isb - unchecked((int)0xd65f03c0), // ret - }; + unchecked((int)0xd65f03c0) // ret + ]; private delegate void InvalidateCache(ulong start, ulong end); diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/JitSupportDarwin.cs b/src/Ryujinx.Cpu/LightningJit/Cache/JitSupportDarwin.cs index ed02a9c28..e0de1e7e0 100644 --- a/src/Ryujinx.Cpu/LightningJit/Cache/JitSupportDarwin.cs +++ b/src/Ryujinx.Cpu/LightningJit/Cache/JitSupportDarwin.cs @@ -1,4 +1,3 @@ -using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs b/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs index 3cf279ae3..65d297c28 100644 --- a/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs +++ b/src/Ryujinx.Cpu/LightningJit/Cache/NoWxCache.cs @@ -4,6 +4,7 @@ using Ryujinx.Memory; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Threading; namespace Ryujinx.Cpu.LightningJit.Cache { @@ -11,7 +12,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache { private const int CodeAlignment = 4; // Bytes. private const int SharedCacheSize = 2047 * 1024 * 1024; - private const int LocalCacheSize = 128 * 1024 * 1024; + private const int LocalCacheSize = 256 * 1024 * 1024; // How many calls to the same function we allow until we pad the shared cache to force the function to become available there // and allow the guest to take the fast path. @@ -104,7 +105,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache private readonly MemoryCache _sharedCache; private readonly MemoryCache _localCache; private readonly PageAlignedRangeList _pendingMap; - private readonly object _lock; + private readonly Lock _lock = new(); class ThreadLocalCacheEntry { @@ -137,7 +138,6 @@ namespace Ryujinx.Cpu.LightningJit.Cache _sharedCache = new(allocator, SharedCacheSize); _localCache = new(allocator, LocalCacheSize); _pendingMap = new(_sharedCache.ReprotectAsRx, RegisterFunction); - _lock = new(); } public unsafe nint Map(nint framePointer, ReadOnlySpan code, ulong guestAddress, ulong guestSize) @@ -190,7 +190,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache private bool TryGetThreadLocalFunction(ulong guestAddress, out nint funcPtr) { - if ((_threadLocalCache ??= new()).TryGetValue(guestAddress, out var entry)) + if ((_threadLocalCache ??= new()).TryGetValue(guestAddress, out ThreadLocalCacheEntry entry)) { if (entry.IncrementUseCount() >= MinCallsForPad) { @@ -231,7 +231,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache _sharedCache.Pointer, SharedCacheSize); - List<(ulong, ThreadLocalCacheEntry)> toDelete = new(); + List<(ulong, ThreadLocalCacheEntry)> toDelete = []; foreach ((ulong address, ThreadLocalCacheEntry entry) in _threadLocalCache) { diff --git a/src/Ryujinx.Cpu/LightningJit/Cache/PageAlignedRangeList.cs b/src/Ryujinx.Cpu/LightningJit/Cache/PageAlignedRangeList.cs index b6b386714..dd53dcbf7 100644 --- a/src/Ryujinx.Cpu/LightningJit/Cache/PageAlignedRangeList.cs +++ b/src/Ryujinx.Cpu/LightningJit/Cache/PageAlignedRangeList.cs @@ -35,8 +35,8 @@ namespace Ryujinx.Cpu.LightningJit.Cache { _alignedRangeAction = alignedRangeAction; _alignedFunctionAction = alignedFunctionAction; - _pendingFunctions = new(); - _ranges = new(); + _pendingFunctions = []; + _ranges = []; } public bool Has(ulong address) diff --git a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/Assembler.cs b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/Assembler.cs index 28539707f..3eeda20bf 100644 --- a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/Assembler.cs +++ b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/Assembler.cs @@ -26,7 +26,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 public Assembler(CodeWriter writer) { _code = writer.GetList(); - _labels = new List(); + _labels = []; } public readonly Operand CreateLabel() @@ -41,7 +41,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 { int targetIndex = _code.Count; - var state = _labels[label.AsInt32()]; + LabelState state = _labels[label.AsInt32()]; state.TargetIndex = targetIndex; state.HasTarget = true; @@ -68,7 +68,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 { int branchIndex = _code.Count; - var state = _labels[label.AsInt32()]; + LabelState state = _labels[label.AsInt32()]; state.BranchIndex = branchIndex; state.HasBranch = true; @@ -94,7 +94,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 { int branchIndex = _code.Count; - var state = _labels[label.AsInt32()]; + LabelState state = _labels[label.AsInt32()]; state.BranchIndex = branchIndex; state.HasBranch = true; @@ -113,7 +113,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 { int branchIndex = _code.Count; - var state = _labels[label.AsInt32()]; + LabelState state = _labels[label.AsInt32()]; state.BranchIndex = branchIndex; state.HasBranch = true; @@ -342,7 +342,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 public readonly void Cset(Operand rd, ArmCondition condition) { - var zr = new Operand(ZrRegister, RegisterType.Integer, rd.Type); + Operand zr = new(ZrRegister, RegisterType.Integer, rd.Type); Csinc(rd, zr, zr, (ArmCondition)((int)condition ^ 1)); } @@ -857,7 +857,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 public readonly void PrfmI(Operand rn, int imm, uint type, uint target, uint policy) { - Operand rt = new Operand((int)EncodeTypeTargetPolicy(type, target, policy), RegisterType.Integer, OperandType.I32); + Operand rt = new((int)EncodeTypeTargetPolicy(type, target, policy), RegisterType.Integer, OperandType.I32); WriteInstruction(0xf9800000u | (EncodeUImm12(imm, 3) << 10), rt, rn); } @@ -868,7 +868,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 public readonly void Prfum(Operand rn, int imm, uint type, uint target, uint policy) { - Operand rt = new Operand((int)EncodeTypeTargetPolicy(type, target, policy), RegisterType.Integer, OperandType.I32); + Operand rt = new((int)EncodeTypeTargetPolicy(type, target, policy), RegisterType.Integer, OperandType.I32); WriteInstruction(0xf8800000u | (EncodeSImm9(imm) << 12), rt, rn); } @@ -4360,6 +4360,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 instI |= 1 << 22; // sh flag imm >>= 12; } + WriteInstructionAuto(instI | (EncodeUImm12(imm, 0) << 10), rd, rn); } else diff --git a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/CodeGenCommon.cs b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/CodeGenCommon.cs index db6a71593..f1aca983f 100644 --- a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/CodeGenCommon.cs +++ b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/CodeGenCommon.cs @@ -28,7 +28,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 // Any value AND all ones will be equal itself, so it's effectively a no-op. // Any value OR all ones will be equal all ones, so one can just use MOV. // Any value XOR all ones will be equal its inverse, so one can just use MVN. - if (value == 0 || value == ulong.MaxValue) + if (value is 0 or ulong.MaxValue) { immN = 0; immS = 0; diff --git a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs index 3ce7c4f9c..491132408 100644 --- a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs +++ b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Runtime.InteropServices; @@ -8,8 +7,6 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 { public IEnumerable GetCallStack(nint framePointer, nint codeRegionStart, int codeRegionSize, nint codeRegion2Start, int codeRegion2Size) { - List functionPointers = new(); - while (true) { nint functionPointer = Marshal.ReadIntPtr(framePointer, nint.Size); @@ -20,11 +17,9 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 break; } - functionPointers.Add((ulong)functionPointer - 4); + yield return (ulong)functionPointer - 4; framePointer = Marshal.ReadIntPtr(framePointer); } - - return functionPointers; } } } diff --git a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/TailMerger.cs b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/TailMerger.cs index e042af126..18204977e 100644 --- a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/TailMerger.cs +++ b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/TailMerger.cs @@ -16,7 +16,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 public TailMerger() { - _branchPointers = new(); + _branchPointers = []; } public void AddConditionalReturn(CodeWriter writer, in Assembler asm, ArmCondition returnCondition) diff --git a/src/Ryujinx.Cpu/LightningJit/CodeGen/OperandType.cs b/src/Ryujinx.Cpu/LightningJit/CodeGen/OperandType.cs index 6191f791b..cd36c6781 100644 --- a/src/Ryujinx.Cpu/LightningJit/CodeGen/OperandType.cs +++ b/src/Ryujinx.Cpu/LightningJit/CodeGen/OperandType.cs @@ -16,7 +16,7 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen { public static bool IsInteger(this OperandType type) { - return type == OperandType.I32 || type == OperandType.I64; + return type is OperandType.I32 or OperandType.I64; } public static int GetSizeInBytes(this OperandType type) diff --git a/src/Ryujinx.Cpu/LightningJit/CodeWriter.cs b/src/Ryujinx.Cpu/LightningJit/CodeWriter.cs index ac4b22ff1..b2927908a 100644 --- a/src/Ryujinx.Cpu/LightningJit/CodeWriter.cs +++ b/src/Ryujinx.Cpu/LightningJit/CodeWriter.cs @@ -12,7 +12,7 @@ namespace Ryujinx.Cpu.LightningJit public CodeWriter() { - _instructions = new(); + _instructions = []; } public void WriteInstruction(uint instruction) diff --git a/src/Ryujinx.Cpu/LightningJit/IStackWalker.cs b/src/Ryujinx.Cpu/LightningJit/IStackWalker.cs index 375c09d26..f5bbc65d3 100644 --- a/src/Ryujinx.Cpu/LightningJit/IStackWalker.cs +++ b/src/Ryujinx.Cpu/LightningJit/IStackWalker.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; namespace Ryujinx.Cpu.LightningJit diff --git a/src/Ryujinx.Cpu/LightningJit/Table/InstTableLevel.cs b/src/Ryujinx.Cpu/LightningJit/Table/InstTableLevel.cs index 6567efeef..cdad9a9fe 100644 --- a/src/Ryujinx.Cpu/LightningJit/Table/InstTableLevel.cs +++ b/src/Ryujinx.Cpu/LightningJit/Table/InstTableLevel.cs @@ -34,7 +34,7 @@ namespace Ryujinx.Cpu.LightningJit.Table { int splitIndex = (int)((insts[index].Encoding >> _shift) & _mask); - (splitList[splitIndex] ??= new()).Add(insts[index]); + (splitList[splitIndex] ??= []).Add(insts[index]); } for (int index = 0; index < count; index++) diff --git a/src/Ryujinx.Cpu/LightningJit/TranslatedFunction.cs b/src/Ryujinx.Cpu/LightningJit/TranslatedFunction.cs index df0f52b8c..70cdd0bfe 100644 --- a/src/Ryujinx.Cpu/LightningJit/TranslatedFunction.cs +++ b/src/Ryujinx.Cpu/LightningJit/TranslatedFunction.cs @@ -1,5 +1,3 @@ -using System; - namespace Ryujinx.Cpu.LightningJit { class TranslatedFunction diff --git a/src/Ryujinx.Cpu/LightningJit/Translator.cs b/src/Ryujinx.Cpu/LightningJit/Translator.cs index 4c4011f11..f3ae0a9c5 100644 --- a/src/Ryujinx.Cpu/LightningJit/Translator.cs +++ b/src/Ryujinx.Cpu/LightningJit/Translator.cs @@ -5,7 +5,6 @@ using Ryujinx.Cpu.LightningJit.Cache; using Ryujinx.Cpu.LightningJit.CodeGen.Arm64; using Ryujinx.Cpu.LightningJit.State; using Ryujinx.Cpu.Signal; -using Ryujinx.Memory; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -55,7 +54,7 @@ namespace Ryujinx.Cpu.LightningJit } } - private static IStackWalker CreateStackWalker() + private static StackWalker CreateStackWalker() { if (RuntimeInformation.ProcessArchitecture == Architecture.Arm64) { @@ -134,7 +133,7 @@ namespace Ryujinx.Cpu.LightningJit public void InvalidateJitCacheRegion(ulong address, ulong size) { - ulong[] overlapAddresses = Array.Empty(); + ulong[] overlapAddresses = []; int overlapsCount = Functions.GetOverlaps(address, size, ref overlapAddresses); @@ -163,14 +162,14 @@ namespace Ryujinx.Cpu.LightningJit { List functions = Functions.AsList(); - foreach (var func in functions) + foreach (TranslatedFunction func in functions) { JitCache.Unmap(func.FuncPointer); } Functions.Clear(); - while (_oldFuncs.TryDequeue(out var kv)) + while (_oldFuncs.TryDequeue(out KeyValuePair kv)) { JitCache.Unmap(kv.Value.FuncPointer); } diff --git a/src/Ryujinx.Cpu/LightningJit/TranslatorStubs.cs b/src/Ryujinx.Cpu/LightningJit/TranslatorStubs.cs index c5231e506..d0eec7eff 100644 --- a/src/Ryujinx.Cpu/LightningJit/TranslatorStubs.cs +++ b/src/Ryujinx.Cpu/LightningJit/TranslatorStubs.cs @@ -140,7 +140,7 @@ namespace Ryujinx.Cpu.LightningJit /// Generated private nint GenerateDispatchStub() { - List branchToFallbackOffsets = new(); + List branchToFallbackOffsets = []; CodeWriter writer = new(); @@ -174,7 +174,7 @@ namespace Ryujinx.Cpu.LightningJit for (int i = 0; i < _functionTable.Levels.Length; i++) { - ref var level = ref _functionTable.Levels[i]; + ref AddressTableLevel level = ref _functionTable.Levels[i]; asm.Mov(mask, level.Mask >> level.Index); asm.And(index, mask, guestAddress, ArmShiftType.Lsr, level.Index); diff --git a/src/Ryujinx.Cpu/PrivateMemoryAllocator.cs b/src/Ryujinx.Cpu/PrivateMemoryAllocator.cs index 8db74f1e9..83e9c01fe 100644 --- a/src/Ryujinx.Cpu/PrivateMemoryAllocator.cs +++ b/src/Ryujinx.Cpu/PrivateMemoryAllocator.cs @@ -38,17 +38,17 @@ namespace Ryujinx.Cpu { Memory = memory; Size = size; - _freeRanges = new List - { - new Range(0, size), - }; + _freeRanges = + [ + new(0, size) + ]; } public ulong Allocate(ulong size, ulong alignment) { for (int i = 0; i < _freeRanges.Count; i++) { - var range = _freeRanges[i]; + Range range = _freeRanges[i]; ulong alignedOffset = BitUtils.AlignUp(range.Offset, alignment); ulong sizeDelta = alignedOffset - range.Offset; @@ -84,7 +84,7 @@ namespace Ryujinx.Cpu private void InsertFreeRange(ulong offset, ulong size) { - var range = new Range(offset, size); + Range range = new(offset, size); int index = _freeRanges.BinarySearch(range); if (index < 0) { @@ -97,7 +97,7 @@ namespace Ryujinx.Cpu private void InsertFreeRangeComingled(ulong offset, ulong size) { ulong endOffset = offset + size; - var range = new Range(offset, size); + Range range = new(offset, size); int index = _freeRanges.BinarySearch(range); if (index < 0) { @@ -149,7 +149,7 @@ namespace Ryujinx.Cpu public PrivateMemoryAllocation Allocate(ulong size, ulong alignment) { - var allocation = Allocate(size, alignment, CreateBlock); + Allocation allocation = Allocate(size, alignment, CreateBlock); return new PrivateMemoryAllocation(this, allocation.Block, allocation.Offset, allocation.Size); } @@ -185,7 +185,7 @@ namespace Ryujinx.Cpu public PrivateMemoryAllocatorImpl(ulong blockAlignment, MemoryAllocationFlags allocationFlags) { - _blocks = new List(); + _blocks = []; _blockAlignment = blockAlignment; _allocationFlags = allocationFlags; } @@ -200,7 +200,7 @@ namespace Ryujinx.Cpu for (int i = 0; i < _blocks.Count; i++) { - var block = _blocks[i]; + T block = _blocks[i]; if (block.Size >= size) { @@ -214,8 +214,8 @@ namespace Ryujinx.Cpu ulong blockAlignedSize = BitUtils.AlignUp(size, _blockAlignment); - var memory = new MemoryBlock(blockAlignedSize, _allocationFlags); - var newBlock = createBlock(memory, blockAlignedSize); + MemoryBlock memory = new(blockAlignedSize, _allocationFlags); + T newBlock = createBlock(memory, blockAlignedSize); InsertBlock(newBlock); diff --git a/src/Ryujinx.Cpu/Ryujinx.Cpu.csproj b/src/Ryujinx.Cpu/Ryujinx.Cpu.csproj index 0a55a7dea..e58a2ce97 100644 --- a/src/Ryujinx.Cpu/Ryujinx.Cpu.csproj +++ b/src/Ryujinx.Cpu/Ryujinx.Cpu.csproj @@ -1,7 +1,6 @@  - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs b/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs index 2985f1c21..299adfbbd 100644 --- a/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs +++ b/src/Ryujinx.Cpu/Signal/NativeSignalHandler.cs @@ -5,6 +5,7 @@ using System; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Threading; namespace Ryujinx.Cpu.Signal { @@ -59,7 +60,7 @@ namespace Ryujinx.Cpu.Signal private static MemoryBlock _codeBlock; - private static readonly object _lock = new(); + private static readonly Lock _lock = new(); private static bool _initialized; static NativeSignalHandler() @@ -97,7 +98,7 @@ namespace Ryujinx.Cpu.Signal _signalHandlerPtr = customSignalHandlerFactory(UnixSignalHandlerRegistration.GetSegfaultExceptionHandler().sa_handler, _signalHandlerPtr); } - var old = UnixSignalHandlerRegistration.RegisterExceptionHandler(_signalHandlerPtr); + UnixSignalHandlerRegistration.SigAction old = UnixSignalHandlerRegistration.RegisterExceptionHandler(_signalHandlerPtr); config.UnixOldSigaction = (nuint)(ulong)old.sa_handler; config.UnixOldSigaction3Arg = old.sa_flags & 4; diff --git a/src/Ryujinx.Cpu/Signal/WindowsSignalHandlerRegistration.cs b/src/Ryujinx.Cpu/Signal/WindowsSignalHandlerRegistration.cs index 7ac15b816..8afaeef0f 100644 --- a/src/Ryujinx.Cpu/Signal/WindowsSignalHandlerRegistration.cs +++ b/src/Ryujinx.Cpu/Signal/WindowsSignalHandlerRegistration.cs @@ -1,4 +1,3 @@ -using System; using System.Runtime.InteropServices; namespace Ryujinx.Cpu.Signal diff --git a/src/Ryujinx.Cpu/TickSource.cs b/src/Ryujinx.Cpu/TickSource.cs index eee83fc62..3aa616a8d 100644 --- a/src/Ryujinx.Cpu/TickSource.cs +++ b/src/Ryujinx.Cpu/TickSource.cs @@ -15,11 +15,33 @@ namespace Ryujinx.Cpu /// public ulong Counter => (ulong)(ElapsedSeconds * Frequency); - /// - public TimeSpan ElapsedTime => _tickCounter.Elapsed; + + public long TickScalar { get; set; } + + private static long _acumElapsedTicks; + + private static long _lastElapsedTicks; + + private long ElapsedTicks + { + get + { + long elapsedTicks = _tickCounter.ElapsedTicks; + + _acumElapsedTicks += (elapsedTicks - _lastElapsedTicks) * TickScalar / 100; + + _lastElapsedTicks = elapsedTicks; + + return _acumElapsedTicks; + } + } /// - public double ElapsedSeconds => _tickCounter.ElapsedTicks * _hostTickFreq; + + public TimeSpan ElapsedTime => Stopwatch.GetElapsedTime(0, ElapsedTicks); + + /// + public double ElapsedSeconds => ElapsedTicks * _hostTickFreq; public TickSource(ulong frequency) { diff --git a/src/Ryujinx.Graphics.Device/DeviceState.cs b/src/Ryujinx.Graphics.Device/DeviceState.cs index 0dd4f5904..11d8e3ac2 100644 --- a/src/Ryujinx.Graphics.Device/DeviceState.cs +++ b/src/Ryujinx.Graphics.Device/DeviceState.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -32,15 +33,15 @@ namespace Ryujinx.Graphics.Device _debugLogCallback = debugLogCallback; } - var fields = typeof(TState).GetFields(); + FieldInfo[] fields = typeof(TState).GetFields(); int offset = 0; for (int fieldIndex = 0; fieldIndex < fields.Length; fieldIndex++) { - var field = fields[fieldIndex]; + FieldInfo field = fields[fieldIndex]; - var currentFieldOffset = (int)Marshal.OffsetOf(field.Name); - var nextFieldOffset = fieldIndex + 1 == fields.Length ? Unsafe.SizeOf() : (int)Marshal.OffsetOf(fields[fieldIndex + 1].Name); + int currentFieldOffset = (int)Marshal.OffsetOf(field.Name); + int nextFieldOffset = fieldIndex + 1 == fields.Length ? Unsafe.SizeOf() : (int)Marshal.OffsetOf(fields[fieldIndex + 1].Name); int sizeOfField = nextFieldOffset - currentFieldOffset; @@ -48,7 +49,7 @@ namespace Ryujinx.Graphics.Device { int index = (offset + i) / RegisterSize; - if (callbacks != null && callbacks.TryGetValue(field.Name, out var cb)) + if (callbacks != null && callbacks.TryGetValue(field.Name, out RwCallback cb)) { if (cb.Read != null) { @@ -81,7 +82,7 @@ namespace Ryujinx.Graphics.Device { uint alignedOffset = index * RegisterSize; - var readCallback = Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_readCallbacks), (nint)index); + Func readCallback = Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_readCallbacks), (nint)index); if (readCallback != null) { return readCallback(); @@ -119,7 +120,7 @@ namespace Ryujinx.Graphics.Device uint alignedOffset = index * RegisterSize; DebugWrite(alignedOffset, data); - ref var storage = ref GetRefIntAlignedUncheck(index); + ref int storage = ref GetRefIntAlignedUncheck(index); changed = storage != data; storage = data; diff --git a/src/Ryujinx.Graphics.Device/ISynchronizationManager.cs b/src/Ryujinx.Graphics.Device/ISynchronizationManager.cs index 2a8d1d9b7..5c2b6a2e3 100644 --- a/src/Ryujinx.Graphics.Device/ISynchronizationManager.cs +++ b/src/Ryujinx.Graphics.Device/ISynchronizationManager.cs @@ -1,6 +1,4 @@ -using Ryujinx.Common.Logging; using System; -using System.Threading; namespace Ryujinx.Graphics.Device { diff --git a/src/Ryujinx.Graphics.Device/Ryujinx.Graphics.Device.csproj b/src/Ryujinx.Graphics.Device/Ryujinx.Graphics.Device.csproj index 58f54de7d..cbe276355 100644 --- a/src/Ryujinx.Graphics.Device/Ryujinx.Graphics.Device.csproj +++ b/src/Ryujinx.Graphics.Device/Ryujinx.Graphics.Device.csproj @@ -1,7 +1,6 @@  - net8.0 $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.GAL/AntiAliasing.cs b/src/Ryujinx.Graphics.GAL/AntiAliasing.cs deleted file mode 100644 index 04b529764..000000000 --- a/src/Ryujinx.Graphics.GAL/AntiAliasing.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Ryujinx.Graphics.GAL -{ - public enum AntiAliasing - { - None, - Fxaa, - SmaaLow, - SmaaMedium, - SmaaHigh, - SmaaUltra, - } -} diff --git a/src/Ryujinx.Graphics.GAL/IRenderer.cs b/src/Ryujinx.Graphics.GAL/IRenderer.cs index c2fdcbe4b..cc51ed67b 100644 --- a/src/Ryujinx.Graphics.GAL/IRenderer.cs +++ b/src/Ryujinx.Graphics.GAL/IRenderer.cs @@ -1,4 +1,6 @@ using Ryujinx.Common.Configuration; +using Ryujinx.Common.Logging; +using Ryujinx.Graphics.GAL.Multithreading; using System; using System.Threading; @@ -10,6 +12,20 @@ namespace Ryujinx.Graphics.GAL bool PreferThreading { get; } + public IRenderer TryMakeThreaded(BackendThreading backendThreading = BackendThreading.Auto) + { + if (backendThreading is BackendThreading.On || + (backendThreading is BackendThreading.Auto && PreferThreading)) + { + Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({backendThreading}): True"); + return new ThreadedRenderer(this); + } + + Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({backendThreading}): False"); + + return this; + } + IPipeline Pipeline { get; } IWindow Window { get; } diff --git a/src/Ryujinx.Graphics.GAL/IWindow.cs b/src/Ryujinx.Graphics.GAL/IWindow.cs index 12686cb28..48144f0b0 100644 --- a/src/Ryujinx.Graphics.GAL/IWindow.cs +++ b/src/Ryujinx.Graphics.GAL/IWindow.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Configuration; using System; namespace Ryujinx.Graphics.GAL diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/BufferMap.cs b/src/Ryujinx.Graphics.GAL/Multithreading/BufferMap.cs index e8eec123a..5e273d420 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/BufferMap.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/BufferMap.cs @@ -16,7 +16,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading private ulong _bufferHandle = 0; private readonly Dictionary _bufferMap = new(); - private readonly HashSet _inFlight = new(); + private readonly HashSet _inFlight = []; private readonly AutoResetEvent _inFlightChanged = new(false); internal BufferHandle CreateBufferHandle() @@ -77,7 +77,6 @@ namespace Ryujinx.Graphics.GAL.Multithreading { // Blocks until the handle is available. - lock (_bufferMap) { if (_bufferMap.TryGetValue(handle, out BufferHandle result)) diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ProgramQueue.cs b/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ProgramQueue.cs index cda3518c7..902527b5b 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ProgramQueue.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/Resources/ProgramQueue.cs @@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Resources _renderer = renderer; _toCompile = new Queue(); - _inProgress = new List(); + _inProgress = []; } public void Add(IProgramRequest request) diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/SyncMap.cs b/src/Ryujinx.Graphics.GAL/Multithreading/SyncMap.cs index ecdff4922..d777abdb9 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/SyncMap.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/SyncMap.cs @@ -6,7 +6,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading { class SyncMap : IDisposable { - private readonly HashSet _inFlight = new(); + private readonly HashSet _inFlight = []; private readonly AutoResetEvent _inFlightChanged = new(false); internal void CreateSyncHandle(ulong id) diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs index deec36648..c999ad789 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs @@ -359,7 +359,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading public bool TryHostConditionalRendering(ICounterEvent value, ulong compare, bool isEqual) { - var evt = value as ThreadedCounterEvent; + ThreadedCounterEvent evt = value as ThreadedCounterEvent; if (evt != null) { if (compare == 0 && evt.Type == CounterType.SamplesPassed && evt.ClearCounter) diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedRenderer.cs b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedRenderer.cs index 0bd3dc592..74a345ffa 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedRenderer.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedRenderer.cs @@ -58,7 +58,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading public uint ProgramCount { get; set; } = 0; private Action _interruptAction; - private readonly object _interruptLock = new(); + private readonly Lock _interruptLock = new(); public event EventHandler ScreenCaptured; @@ -294,7 +294,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading public IImageArray CreateImageArray(int size, bool isBuffer) { - var imageArray = new ThreadedImageArray(this); + ThreadedImageArray imageArray = new(this); New().Set(Ref(imageArray), size, isBuffer); QueueCommand(); @@ -303,7 +303,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading public IProgram CreateProgram(ShaderSource[] shaders, ShaderInfo info) { - var program = new ThreadedProgram(this); + ThreadedProgram program = new(this); SourceProgramRequest request = new(program, shaders, info); @@ -319,7 +319,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading public ISampler CreateSampler(SamplerCreateInfo info) { - var sampler = new ThreadedSampler(this); + ThreadedSampler sampler = new(this); New().Set(Ref(sampler), info); QueueCommand(); @@ -337,7 +337,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading { if (IsGpuThread()) { - var texture = new ThreadedTexture(this, info); + ThreadedTexture texture = new(this, info); New().Set(Ref(texture), info); QueueCommand(); @@ -345,7 +345,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading } else { - var texture = new ThreadedTexture(this, info) + ThreadedTexture texture = new(this, info) { Base = _baseRenderer.CreateTexture(info), }; @@ -355,7 +355,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading } public ITextureArray CreateTextureArray(int size, bool isBuffer) { - var textureArray = new ThreadedTextureArray(this); + ThreadedTextureArray textureArray = new(this); New().Set(Ref(textureArray), size, isBuffer); QueueCommand(); @@ -414,7 +414,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading public IProgram LoadProgramBinary(byte[] programBinary, bool hasFragmentShader, ShaderInfo info) { - var program = new ThreadedProgram(this); + ThreadedProgram program = new(this); BinaryProgramRequest request = new(program, programBinary, hasFragmentShader, info); Programs.Add(request); diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs index 102fdb1bb..7a4836982 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedWindow.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Configuration; using Ryujinx.Graphics.GAL.Multithreading.Commands.Window; using Ryujinx.Graphics.GAL.Multithreading.Model; using Ryujinx.Graphics.GAL.Multithreading.Resources; diff --git a/src/Ryujinx.Graphics.GAL/ResourceLayout.cs b/src/Ryujinx.Graphics.GAL/ResourceLayout.cs index b7464ee12..c91eed3d2 100644 --- a/src/Ryujinx.Graphics.GAL/ResourceLayout.cs +++ b/src/Ryujinx.Graphics.GAL/ResourceLayout.cs @@ -126,7 +126,7 @@ namespace Ryujinx.Graphics.GAL if (Descriptors != null) { - foreach (var descriptor in Descriptors) + foreach (ResourceDescriptor descriptor in Descriptors) { hasher.Add(descriptor); } diff --git a/src/Ryujinx.Graphics.GAL/Ryujinx.Graphics.GAL.csproj b/src/Ryujinx.Graphics.GAL/Ryujinx.Graphics.GAL.csproj index a230296c1..b94a4ec90 100644 --- a/src/Ryujinx.Graphics.GAL/Ryujinx.Graphics.GAL.csproj +++ b/src/Ryujinx.Graphics.GAL/Ryujinx.Graphics.GAL.csproj @@ -1,7 +1,6 @@  - net8.0 $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.GAL/Target.cs b/src/Ryujinx.Graphics.GAL/Target.cs index 73497546e..1c184981d 100644 --- a/src/Ryujinx.Graphics.GAL/Target.cs +++ b/src/Ryujinx.Graphics.GAL/Target.cs @@ -18,17 +18,17 @@ namespace Ryujinx.Graphics.GAL { public static bool IsMultisample(this Target target) { - return target == Target.Texture2DMultisample || target == Target.Texture2DMultisampleArray; + return target is Target.Texture2DMultisample or Target.Texture2DMultisampleArray; } public static bool HasDepthOrLayers(this Target target) { - return target == Target.Texture3D || - target == Target.Texture1DArray || - target == Target.Texture2DArray || - target == Target.Texture2DMultisampleArray || - target == Target.Cubemap || - target == Target.CubemapArray; + return target is Target.Texture3D or + Target.Texture1DArray or + Target.Texture2DArray or + Target.Texture2DMultisampleArray or + Target.Cubemap or + Target.CubemapArray; } } } diff --git a/src/Ryujinx.Graphics.GAL/TextureCreateInfo.cs b/src/Ryujinx.Graphics.GAL/TextureCreateInfo.cs index 79c84db01..27a2ac896 100644 --- a/src/Ryujinx.Graphics.GAL/TextureCreateInfo.cs +++ b/src/Ryujinx.Graphics.GAL/TextureCreateInfo.cs @@ -98,9 +98,9 @@ namespace Ryujinx.Graphics.GAL public int GetLayers() { - if (Target == Target.Texture2DArray || - Target == Target.Texture2DMultisampleArray || - Target == Target.CubemapArray) + if (Target is Target.Texture2DArray or + Target.Texture2DMultisampleArray or + Target.CubemapArray) { return Depth; } diff --git a/src/Ryujinx.Graphics.GAL/UpscaleType.cs b/src/Ryujinx.Graphics.GAL/UpscaleType.cs deleted file mode 100644 index e2482faef..000000000 --- a/src/Ryujinx.Graphics.GAL/UpscaleType.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Ryujinx.Graphics.GAL -{ - public enum ScalingFilter - { - Bilinear, - Nearest, - Fsr, - Area, - } -} diff --git a/src/Ryujinx.Graphics.GAL/VSyncMode.cs b/src/Ryujinx.Graphics.GAL/VSyncMode.cs deleted file mode 100644 index c5794b8f7..000000000 --- a/src/Ryujinx.Graphics.GAL/VSyncMode.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Ryujinx.Graphics.GAL -{ - public enum VSyncMode - { - Switch, - Unbounded, - Custom - } -} diff --git a/src/Ryujinx.Graphics.GAL/ViewportSwizzle.cs b/src/Ryujinx.Graphics.GAL/ViewportSwizzle.cs index 9352c8162..69de93ad5 100644 --- a/src/Ryujinx.Graphics.GAL/ViewportSwizzle.cs +++ b/src/Ryujinx.Graphics.GAL/ViewportSwizzle.cs @@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.Graphics.GAL { - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] public enum ViewportSwizzle { PositiveX = 0, diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs b/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs index cd8144724..0784fdca8 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs @@ -2,6 +2,7 @@ using Ryujinx.Graphics.Device; using Ryujinx.Graphics.Gpu.Engine.InlineToMemory; using Ryujinx.Graphics.Gpu.Engine.Threed; using Ryujinx.Graphics.Gpu.Engine.Types; +using Ryujinx.Graphics.Gpu.Memory; using Ryujinx.Graphics.Gpu.Shader; using Ryujinx.Graphics.Shader; using System; @@ -90,7 +91,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Compute /// Method call argument private void SendSignalingPcasB(int argument) { - var memoryManager = _channel.MemoryManager; + MemoryManager memoryManager = _channel.MemoryManager; // Since we're going to change the state, make sure any pending instanced draws are done. _3dEngine.PerformDeferredDraws(); @@ -100,7 +101,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Compute uint qmdAddress = _state.State.SendPcasA; - var qmd = _channel.MemoryManager.Read((ulong)qmdAddress << 8); + ComputeQmd qmd = _channel.MemoryManager.Read((ulong)qmdAddress << 8); ulong shaderGpuVa = ((ulong)_state.State.SetProgramRegionAAddressUpper << 32) | _state.State.SetProgramRegionB; diff --git a/src/Ryujinx.Graphics.Gpu/Engine/DeviceStateWithShadow.cs b/src/Ryujinx.Graphics.Gpu/Engine/DeviceStateWithShadow.cs index a2e5b1164..aacaf2f4b 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/DeviceStateWithShadow.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/DeviceStateWithShadow.cs @@ -80,13 +80,13 @@ namespace Ryujinx.Graphics.Gpu.Engine [MethodImpl(MethodImplOptions.AggressiveInlining)] public void WriteWithRedundancyCheck(int offset, int value, out bool changed) { - var shadowRamControl = _state.State.SetMmeShadowRamControlMode; + SetMmeShadowRamControlMode shadowRamControl = _state.State.SetMmeShadowRamControlMode; if (shadowRamControl == SetMmeShadowRamControlMode.MethodPassthrough || offset < 0x200) { _state.WriteWithRedundancyCheck(offset, value, out changed); } - else if (shadowRamControl == SetMmeShadowRamControlMode.MethodTrack || - shadowRamControl == SetMmeShadowRamControlMode.MethodTrackWithFilter) + else if (shadowRamControl is SetMmeShadowRamControlMode.MethodTrack or + SetMmeShadowRamControlMode.MethodTrackWithFilter) { _shadowState.Write(offset, value); _state.WriteWithRedundancyCheck(offset, value, out changed); diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs b/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs index cdeae0040..19b90c59a 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs @@ -190,7 +190,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma /// The LaunchDma call argument private void DmaCopy(int argument) { - var memoryManager = _channel.MemoryManager; + MemoryManager memoryManager = _channel.MemoryManager; CopyFlags copyFlags = (CopyFlags)argument; @@ -225,8 +225,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma int srcBpp = remap ? srcComponents * componentSize : 1; int dstBpp = remap ? dstComponents * componentSize : 1; - var dst = Unsafe.As(ref _state.State.SetDstBlockSize); - var src = Unsafe.As(ref _state.State.SetSrcBlockSize); + DmaTexture dst = Unsafe.As(ref _state.State.SetDstBlockSize); + DmaTexture src = Unsafe.As(ref _state.State.SetSrcBlockSize); int srcRegionX = 0, srcRegionY = 0, dstRegionX = 0, dstRegionY = 0; @@ -245,7 +245,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma int srcStride = (int)_state.State.PitchIn; int dstStride = (int)_state.State.PitchOut; - var srcCalculator = new OffsetCalculator( + OffsetCalculator srcCalculator = new( src.Width, src.Height, srcStride, @@ -254,7 +254,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma src.MemoryLayout.UnpackGobBlocksInZ(), srcBpp); - var dstCalculator = new OffsetCalculator( + OffsetCalculator dstCalculator = new( dst.Width, dst.Height, dstStride, @@ -293,7 +293,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma if (completeSource && completeDest && !srcLinear && isIdentityRemap) { - var source = memoryManager.Physical.TextureCache.FindTexture( + Image.Texture source = memoryManager.Physical.TextureCache.FindTexture( memoryManager, srcGpuVa, srcBpp, @@ -309,7 +309,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma { source.SynchronizeMemory(); - var target = memoryManager.Physical.TextureCache.FindOrCreateTexture( + Image.Texture target = memoryManager.Physical.TextureCache.FindOrCreateTexture( memoryManager, source.Info.FormatInfo, dstGpuVa, @@ -339,7 +339,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma if (completeSource && completeDest && !(dstLinear && !srcLinear) && isIdentityRemap) { - var target = memoryManager.Physical.TextureCache.FindTexture( + Image.Texture target = memoryManager.Physical.TextureCache.FindTexture( memoryManager, dstGpuVa, dstBpp, diff --git a/src/Ryujinx.Graphics.Gpu/Engine/GPFifo/GPFifoProcessor.cs b/src/Ryujinx.Graphics.Gpu/Engine/GPFifo/GPFifoProcessor.cs index 984a9cff8..c0f8ccf76 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/GPFifo/GPFifoProcessor.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/GPFifo/GPFifoProcessor.cs @@ -159,7 +159,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.GPFifo int availableCount = commandBuffer.Length - offset; int consumeCount = Math.Min(_state.MethodCount, availableCount); - var data = commandBuffer.Slice(offset, consumeCount); + ReadOnlySpan data = commandBuffer.Slice(offset, consumeCount); if (_state.SubChannel == 0) { diff --git a/src/Ryujinx.Graphics.Gpu/Engine/InlineToMemory/InlineToMemoryClass.cs b/src/Ryujinx.Graphics.Gpu/Engine/InlineToMemory/InlineToMemoryClass.cs index 78099f74a..37d7457fc 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/InlineToMemory/InlineToMemoryClass.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/InlineToMemory/InlineToMemoryClass.cs @@ -1,6 +1,7 @@ using Ryujinx.Common; using Ryujinx.Common.Memory; using Ryujinx.Graphics.Device; +using Ryujinx.Graphics.Gpu.Memory; using Ryujinx.Graphics.Texture; using System; using System.Collections.Generic; @@ -168,9 +169,9 @@ namespace Ryujinx.Graphics.Gpu.Engine.InlineToMemory /// private void FinishTransfer() { - var memoryManager = _channel.MemoryManager; + MemoryManager memoryManager = _channel.MemoryManager; - var data = MemoryMarshal.Cast(_buffer)[.._size]; + Span data = MemoryMarshal.Cast(_buffer)[.._size]; if (_isLinear && _lineCount == 1) { @@ -184,7 +185,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.InlineToMemory // Right now the copy code at the bottom assumes that it is used on both which might be incorrect. if (!_isLinear) { - var target = memoryManager.Physical.TextureCache.FindTexture( + Image.Texture target = memoryManager.Physical.TextureCache.FindTexture( memoryManager, _dstGpuVa, 1, @@ -199,7 +200,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.InlineToMemory if (target != null) { target.SynchronizeMemory(); - var dataCopy = MemoryOwner.RentCopy(data); + MemoryOwner dataCopy = MemoryOwner.RentCopy(data); target.SetData(dataCopy, 0, 0, new GAL.Rectangle(_dstX, _dstY, _lineLengthIn / target.Info.FormatInfo.BytesPerPixel, _lineCount)); target.SignalModified(); @@ -207,7 +208,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.InlineToMemory } } - var dstCalculator = new OffsetCalculator( + OffsetCalculator dstCalculator = new( _dstWidth, _dstHeight, _dstStride, diff --git a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLE.cs b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLE.cs index 475d1ee4e..f62a4c01a 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLE.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLE.cs @@ -285,12 +285,12 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME /// First argument of the call private void DrawArraysInstanced(IDeviceState state, int arg0) { - var topology = (PrimitiveTopology)arg0; + PrimitiveTopology topology = (PrimitiveTopology)arg0; - var count = FetchParam(); - var instanceCount = FetchParam(); - var firstVertex = FetchParam(); - var firstInstance = FetchParam(); + FifoWord count = FetchParam(); + FifoWord instanceCount = FetchParam(); + FifoWord firstVertex = FetchParam(); + FifoWord firstInstance = FetchParam(); if (ShouldSkipDraw(state, instanceCount.Word)) { @@ -314,13 +314,13 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME /// First argument of the call private void DrawElements(IDeviceState state, int arg0) { - var topology = (PrimitiveTopology)arg0; + PrimitiveTopology topology = (PrimitiveTopology)arg0; - var indexAddressHigh = FetchParam(); - var indexAddressLow = FetchParam(); - var indexType = FetchParam(); - var firstIndex = 0; - var indexCount = FetchParam(); + FifoWord indexAddressHigh = FetchParam(); + FifoWord indexAddressLow = FetchParam(); + FifoWord indexType = FetchParam(); + int firstIndex = 0; + FifoWord indexCount = FetchParam(); _processor.ThreedClass.UpdateIndexBuffer( (uint)indexAddressHigh.Word, @@ -344,13 +344,13 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME /// First argument of the call private void DrawElementsInstanced(IDeviceState state, int arg0) { - var topology = (PrimitiveTopology)arg0; + PrimitiveTopology topology = (PrimitiveTopology)arg0; - var count = FetchParam(); - var instanceCount = FetchParam(); - var firstIndex = FetchParam(); - var firstVertex = FetchParam(); - var firstInstance = FetchParam(); + FifoWord count = FetchParam(); + FifoWord instanceCount = FetchParam(); + FifoWord firstIndex = FetchParam(); + FifoWord firstVertex = FetchParam(); + FifoWord firstInstance = FetchParam(); if (ShouldSkipDraw(state, instanceCount.Word)) { @@ -374,17 +374,17 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME /// First argument of the call private void DrawElementsIndirect(IDeviceState state, int arg0) { - var topology = (PrimitiveTopology)arg0; + PrimitiveTopology topology = (PrimitiveTopology)arg0; - var count = FetchParam(); - var instanceCount = FetchParam(); - var firstIndex = FetchParam(); - var firstVertex = FetchParam(); - var firstInstance = FetchParam(); + FifoWord count = FetchParam(); + FifoWord instanceCount = FetchParam(); + FifoWord firstIndex = FetchParam(); + FifoWord firstVertex = FetchParam(); + FifoWord firstInstance = FetchParam(); ulong indirectBufferGpuVa = count.GpuVa; - var bufferCache = _processor.MemoryManager.Physical.BufferCache; + BufferCache bufferCache = _processor.MemoryManager.Physical.BufferCache; bool useBuffer = bufferCache.CheckModified(_processor.MemoryManager, indirectBufferGpuVa, IndirectIndexedDataEntrySize, out ulong indirectBufferAddress); @@ -432,7 +432,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME int startDraw = arg0; int endDraw = arg1; - var topology = (PrimitiveTopology)arg2; + PrimitiveTopology topology = (PrimitiveTopology)arg2; int paddingWords = arg3; int stride = paddingWords * 4 + 0x14; @@ -468,12 +468,12 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME for (int i = 0; i < maxDrawCount; i++) { - var count = FetchParam(); + FifoWord count = FetchParam(); #pragma warning disable IDE0059 // Remove unnecessary value assignment - var instanceCount = FetchParam(); - var firstIndex = FetchParam(); - var firstVertex = FetchParam(); - var firstInstance = FetchParam(); + FifoWord instanceCount = FetchParam(); + FifoWord firstIndex = FetchParam(); + FifoWord firstVertex = FetchParam(); + FifoWord firstInstance = FetchParam(); #pragma warning restore IDE0059 if (i == 0) @@ -492,7 +492,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME } } - var bufferCache = _processor.MemoryManager.Physical.BufferCache; + BufferCache bufferCache = _processor.MemoryManager.Physical.BufferCache; ulong indirectBufferSize = (ulong)maxDrawCount * (ulong)stride; @@ -526,7 +526,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME /// The call argument, or a 0 value with null address if the FIFO is empty private FifoWord FetchParam() { - if (!Fifo.TryDequeue(out var value)) + if (!Fifo.TryDequeue(out FifoWord value)) { Logger.Warning?.Print(LogClass.Gpu, "Macro attempted to fetch an inexistent argument."); diff --git a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLETable.cs b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLETable.cs index e3080228e..de88fe2e5 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLETable.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLETable.cs @@ -44,8 +44,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME } } - private static readonly TableEntry[] _table = new TableEntry[] - { + private static readonly TableEntry[] _table = + [ new(MacroHLEFunctionName.BindShaderProgram, new Hash128(0x5d5efb912369f60b, 0x69131ed5019f08ef), 0x68), new(MacroHLEFunctionName.ClearColor, new Hash128(0xA9FB28D1DC43645A, 0xB177E5D2EAE67FB0), 0x28), new(MacroHLEFunctionName.ClearDepthStencil, new Hash128(0x1B96CB77D4879F4F, 0x8557032FE0C965FB), 0x24), @@ -59,7 +59,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME new(MacroHLEFunctionName.UpdateUniformBufferState, new Hash128(0x8EE66706049CB0B0, 0x51C1CF906EC86F7C), 0x20), new(MacroHLEFunctionName.UpdateUniformBufferStateCbu, new Hash128(0xA4592676A3E581A0, 0xA39E77FE19FE04AC), 0x18), new(MacroHLEFunctionName.UpdateUniformBufferStateCbuV2, new Hash128(0x392FA750489983D4, 0x35BACE455155D2C3), 0x18) - }; + ]; /// /// Checks if the host supports all features required by the HLE macro. @@ -90,13 +90,13 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME /// True if there is a implementation available and supported, false otherwise public static bool TryGetMacroHLEFunction(ReadOnlySpan code, Capabilities caps, out MacroHLEFunctionName name) { - var mc = MemoryMarshal.Cast(code); + ReadOnlySpan mc = MemoryMarshal.Cast(code); for (int i = 0; i < _table.Length; i++) { - ref var entry = ref _table[i]; + ref TableEntry entry = ref _table[i]; - var hash = Hash128.ComputeHash(mc[..entry.Length]); + Hash128 hash = Hash128.ComputeHash(mc[..entry.Length]); if (hash == entry.Hash) { if (IsMacroHLESupported(caps, entry.Name)) diff --git a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroInterpreter.cs b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroInterpreter.cs index dd60688d6..707265184 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroInterpreter.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroInterpreter.cs @@ -369,7 +369,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME /// The call argument, or 0 if the FIFO is empty private int FetchParam() { - if (!Fifo.TryDequeue(out var value)) + if (!Fifo.TryDequeue(out FifoWord value)) { Logger.Warning?.Print(LogClass.Gpu, "Macro attempted to fetch an inexistent argument."); diff --git a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitCompiler.cs b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitCompiler.cs index d5229970f..cd711f1b3 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitCompiler.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitCompiler.cs @@ -22,7 +22,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME /// public MacroJitCompiler() { - _meth = new DynamicMethod("Macro", typeof(void), new Type[] { typeof(MacroJitContext), typeof(IDeviceState), typeof(int) }); + _meth = new DynamicMethod("Macro", typeof(void), [typeof(MacroJitContext), typeof(IDeviceState), typeof(int) + ]); _ilGen = _meth.GetILGenerator(); _gprs = new LocalBuilder[8]; @@ -289,6 +290,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME _ilGen.Emit(OpCodes.Shl); break; } + break; case AluOperation.ReadImmediate: diff --git a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitContext.cs b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitContext.cs index 01bff8e89..174af9739 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitContext.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/MME/MacroJitContext.cs @@ -20,7 +20,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME /// The call argument, or 0 if the FIFO is empty public int FetchParam() { - if (!Fifo.TryDequeue(out var value)) + if (!Fifo.TryDequeue(out FifoWord value)) { Logger.Warning?.Print(LogClass.Gpu, "Macro attempted to fetch an inexistent argument."); diff --git a/src/Ryujinx.Graphics.Gpu/Engine/SetMmeShadowRamControlMode.cs b/src/Ryujinx.Graphics.Gpu/Engine/SetMmeShadowRamControlMode.cs index b9a5c74a3..c07cb1044 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/SetMmeShadowRamControlMode.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/SetMmeShadowRamControlMode.cs @@ -15,7 +15,7 @@ namespace Ryujinx.Graphics.Gpu.Engine { public static bool IsTrack(this SetMmeShadowRamControlMode mode) { - return mode == SetMmeShadowRamControlMode.MethodTrack || mode == SetMmeShadowRamControlMode.MethodTrackWithFilter; + return mode is SetMmeShadowRamControlMode.MethodTrack or SetMmeShadowRamControlMode.MethodTrackWithFilter; } public static bool IsPassthrough(this SetMmeShadowRamControlMode mode) diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendFunctions.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendFunctions.cs index 13e5d2a86..d8d23bf43 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendFunctions.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendFunctions.cs @@ -8,209 +8,209 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.Blender { static class AdvancedBlendFunctions { - public static readonly AdvancedBlendUcode[] Table = new AdvancedBlendUcode[] - { - new AdvancedBlendUcode(AdvancedBlendOp.PlusClamped, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedPlusClampedPremul), - new AdvancedBlendUcode(AdvancedBlendOp.PlusClampedAlpha, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedPlusClampedAlphaPremul), - new AdvancedBlendUcode(AdvancedBlendOp.PlusDarker, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedPlusDarkerPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedMultiplyPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedScreenPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedOverlayPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedDarkenPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedLightenPremul), - new AdvancedBlendUcode(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedColorDodgePremul), - new AdvancedBlendUcode(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedColorBurnPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHardLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedSoftLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedDifferencePremul), - new AdvancedBlendUcode(AdvancedBlendOp.Minus, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedMinusPremul), - new AdvancedBlendUcode(AdvancedBlendOp.MinusClamped, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedMinusClampedPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedExclusionPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Contrast, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedContrastPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedInvertPremul), - new AdvancedBlendUcode(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedInvertRGBPremul), - new AdvancedBlendUcode(AdvancedBlendOp.InvertOvg, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedInvertOvgPremul), - new AdvancedBlendUcode(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedLinearDodgePremul), - new AdvancedBlendUcode(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedLinearBurnPremul), - new AdvancedBlendUcode(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedVividLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedLinearLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedPinLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHardMixPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Red, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedRedPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Green, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedGreenPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Blue, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedBluePremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHslHuePremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHslSaturationPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHslColorPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHslLuminosityPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Src, AdvancedBlendOverlap.Disjoint, true, GenDisjointSrcPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Dst, AdvancedBlendOverlap.Disjoint, true, GenDisjointDstPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Disjoint, true, GenDisjointSrcOverPremul), - new AdvancedBlendUcode(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Disjoint, true, GenDisjointDstOverPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Disjoint, true, GenDisjointSrcInPremul), - new AdvancedBlendUcode(AdvancedBlendOp.DstIn, AdvancedBlendOverlap.Disjoint, true, GenDisjointDstInPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Disjoint, true, GenDisjointSrcOutPremul), - new AdvancedBlendUcode(AdvancedBlendOp.DstOut, AdvancedBlendOverlap.Disjoint, true, GenDisjointDstOutPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Disjoint, true, GenDisjointSrcAtopPremul), - new AdvancedBlendUcode(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Disjoint, true, GenDisjointDstAtopPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Disjoint, true, GenDisjointXorPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Plus, AdvancedBlendOverlap.Disjoint, true, GenDisjointPlusPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Disjoint, true, GenDisjointMultiplyPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Disjoint, true, GenDisjointScreenPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Disjoint, true, GenDisjointOverlayPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Disjoint, true, GenDisjointDarkenPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Disjoint, true, GenDisjointLightenPremul), - new AdvancedBlendUcode(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Disjoint, true, GenDisjointColorDodgePremul), - new AdvancedBlendUcode(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Disjoint, true, GenDisjointColorBurnPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Disjoint, true, GenDisjointHardLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Disjoint, true, GenDisjointSoftLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Disjoint, true, GenDisjointDifferencePremul), - new AdvancedBlendUcode(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Disjoint, true, GenDisjointExclusionPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Disjoint, true, GenDisjointInvertPremul), - new AdvancedBlendUcode(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Disjoint, true, GenDisjointInvertRGBPremul), - new AdvancedBlendUcode(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Disjoint, true, GenDisjointLinearDodgePremul), - new AdvancedBlendUcode(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Disjoint, true, GenDisjointLinearBurnPremul), - new AdvancedBlendUcode(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Disjoint, true, GenDisjointVividLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Disjoint, true, GenDisjointLinearLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Disjoint, true, GenDisjointPinLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Disjoint, true, GenDisjointHardMixPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Disjoint, true, GenDisjointHslHuePremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Disjoint, true, GenDisjointHslSaturationPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Disjoint, true, GenDisjointHslColorPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Disjoint, true, GenDisjointHslLuminosityPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Src, AdvancedBlendOverlap.Conjoint, true, GenConjointSrcPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Dst, AdvancedBlendOverlap.Conjoint, true, GenConjointDstPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Conjoint, true, GenConjointSrcOverPremul), - new AdvancedBlendUcode(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Conjoint, true, GenConjointDstOverPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Conjoint, true, GenConjointSrcInPremul), - new AdvancedBlendUcode(AdvancedBlendOp.DstIn, AdvancedBlendOverlap.Conjoint, true, GenConjointDstInPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Conjoint, true, GenConjointSrcOutPremul), - new AdvancedBlendUcode(AdvancedBlendOp.DstOut, AdvancedBlendOverlap.Conjoint, true, GenConjointDstOutPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Conjoint, true, GenConjointSrcAtopPremul), - new AdvancedBlendUcode(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Conjoint, true, GenConjointDstAtopPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Conjoint, true, GenConjointXorPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Conjoint, true, GenConjointMultiplyPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Conjoint, true, GenConjointScreenPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Conjoint, true, GenConjointOverlayPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Conjoint, true, GenConjointDarkenPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Conjoint, true, GenConjointLightenPremul), - new AdvancedBlendUcode(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Conjoint, true, GenConjointColorDodgePremul), - new AdvancedBlendUcode(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Conjoint, true, GenConjointColorBurnPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Conjoint, true, GenConjointHardLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Conjoint, true, GenConjointSoftLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Conjoint, true, GenConjointDifferencePremul), - new AdvancedBlendUcode(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Conjoint, true, GenConjointExclusionPremul), - new AdvancedBlendUcode(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Conjoint, true, GenConjointInvertPremul), - new AdvancedBlendUcode(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Conjoint, true, GenConjointInvertRGBPremul), - new AdvancedBlendUcode(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Conjoint, true, GenConjointLinearDodgePremul), - new AdvancedBlendUcode(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Conjoint, true, GenConjointLinearBurnPremul), - new AdvancedBlendUcode(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Conjoint, true, GenConjointVividLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Conjoint, true, GenConjointLinearLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Conjoint, true, GenConjointPinLightPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Conjoint, true, GenConjointHardMixPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Conjoint, true, GenConjointHslHuePremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Conjoint, true, GenConjointHslSaturationPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Conjoint, true, GenConjointHslColorPremul), - new AdvancedBlendUcode(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Conjoint, true, GenConjointHslLuminosityPremul), - new AdvancedBlendUcode(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedDstOver), - new AdvancedBlendUcode(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedSrcIn), - new AdvancedBlendUcode(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedSrcOut), - new AdvancedBlendUcode(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedSrcAtop), - new AdvancedBlendUcode(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedDstAtop), - new AdvancedBlendUcode(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedXor), - new AdvancedBlendUcode(AdvancedBlendOp.PlusClamped, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedPlusClamped), - new AdvancedBlendUcode(AdvancedBlendOp.PlusClampedAlpha, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedPlusClampedAlpha), - new AdvancedBlendUcode(AdvancedBlendOp.PlusDarker, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedPlusDarker), - new AdvancedBlendUcode(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedMultiply), - new AdvancedBlendUcode(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedScreen), - new AdvancedBlendUcode(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedOverlay), - new AdvancedBlendUcode(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedDarken), - new AdvancedBlendUcode(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedLighten), - new AdvancedBlendUcode(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedColorDodge), - new AdvancedBlendUcode(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedColorBurn), - new AdvancedBlendUcode(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHardLight), - new AdvancedBlendUcode(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedSoftLight), - new AdvancedBlendUcode(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedDifference), - new AdvancedBlendUcode(AdvancedBlendOp.Minus, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedMinus), - new AdvancedBlendUcode(AdvancedBlendOp.MinusClamped, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedMinusClamped), - new AdvancedBlendUcode(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedExclusion), - new AdvancedBlendUcode(AdvancedBlendOp.Contrast, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedContrast), - new AdvancedBlendUcode(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedInvertRGB), - new AdvancedBlendUcode(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedLinearDodge), - new AdvancedBlendUcode(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedLinearBurn), - new AdvancedBlendUcode(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedVividLight), - new AdvancedBlendUcode(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedLinearLight), - new AdvancedBlendUcode(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedPinLight), - new AdvancedBlendUcode(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHardMix), - new AdvancedBlendUcode(AdvancedBlendOp.Red, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedRed), - new AdvancedBlendUcode(AdvancedBlendOp.Green, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedGreen), - new AdvancedBlendUcode(AdvancedBlendOp.Blue, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedBlue), - new AdvancedBlendUcode(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHslHue), - new AdvancedBlendUcode(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHslSaturation), - new AdvancedBlendUcode(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHslColor), - new AdvancedBlendUcode(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHslLuminosity), - new AdvancedBlendUcode(AdvancedBlendOp.Src, AdvancedBlendOverlap.Disjoint, false, GenDisjointSrc), - new AdvancedBlendUcode(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Disjoint, false, GenDisjointSrcOver), - new AdvancedBlendUcode(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Disjoint, false, GenDisjointDstOver), - new AdvancedBlendUcode(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Disjoint, false, GenDisjointSrcIn), - new AdvancedBlendUcode(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Disjoint, false, GenDisjointSrcOut), - new AdvancedBlendUcode(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Disjoint, false, GenDisjointSrcAtop), - new AdvancedBlendUcode(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Disjoint, false, GenDisjointDstAtop), - new AdvancedBlendUcode(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Disjoint, false, GenDisjointXor), - new AdvancedBlendUcode(AdvancedBlendOp.Plus, AdvancedBlendOverlap.Disjoint, false, GenDisjointPlus), - new AdvancedBlendUcode(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Disjoint, false, GenDisjointMultiply), - new AdvancedBlendUcode(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Disjoint, false, GenDisjointScreen), - new AdvancedBlendUcode(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Disjoint, false, GenDisjointOverlay), - new AdvancedBlendUcode(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Disjoint, false, GenDisjointDarken), - new AdvancedBlendUcode(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Disjoint, false, GenDisjointLighten), - new AdvancedBlendUcode(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Disjoint, false, GenDisjointColorDodge), - new AdvancedBlendUcode(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Disjoint, false, GenDisjointColorBurn), - new AdvancedBlendUcode(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Disjoint, false, GenDisjointHardLight), - new AdvancedBlendUcode(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Disjoint, false, GenDisjointSoftLight), - new AdvancedBlendUcode(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Disjoint, false, GenDisjointDifference), - new AdvancedBlendUcode(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Disjoint, false, GenDisjointExclusion), - new AdvancedBlendUcode(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Disjoint, false, GenDisjointInvertRGB), - new AdvancedBlendUcode(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Disjoint, false, GenDisjointLinearDodge), - new AdvancedBlendUcode(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Disjoint, false, GenDisjointLinearBurn), - new AdvancedBlendUcode(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Disjoint, false, GenDisjointVividLight), - new AdvancedBlendUcode(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Disjoint, false, GenDisjointLinearLight), - new AdvancedBlendUcode(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Disjoint, false, GenDisjointPinLight), - new AdvancedBlendUcode(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Disjoint, false, GenDisjointHardMix), - new AdvancedBlendUcode(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Disjoint, false, GenDisjointHslHue), - new AdvancedBlendUcode(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Disjoint, false, GenDisjointHslSaturation), - new AdvancedBlendUcode(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Disjoint, false, GenDisjointHslColor), - new AdvancedBlendUcode(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Disjoint, false, GenDisjointHslLuminosity), - new AdvancedBlendUcode(AdvancedBlendOp.Src, AdvancedBlendOverlap.Conjoint, false, GenConjointSrc), - new AdvancedBlendUcode(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Conjoint, false, GenConjointSrcOver), - new AdvancedBlendUcode(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Conjoint, false, GenConjointDstOver), - new AdvancedBlendUcode(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Conjoint, false, GenConjointSrcIn), - new AdvancedBlendUcode(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Conjoint, false, GenConjointSrcOut), - new AdvancedBlendUcode(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Conjoint, false, GenConjointSrcAtop), - new AdvancedBlendUcode(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Conjoint, false, GenConjointDstAtop), - new AdvancedBlendUcode(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Conjoint, false, GenConjointXor), - new AdvancedBlendUcode(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Conjoint, false, GenConjointMultiply), - new AdvancedBlendUcode(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Conjoint, false, GenConjointScreen), - new AdvancedBlendUcode(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Conjoint, false, GenConjointOverlay), - new AdvancedBlendUcode(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Conjoint, false, GenConjointDarken), - new AdvancedBlendUcode(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Conjoint, false, GenConjointLighten), - new AdvancedBlendUcode(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Conjoint, false, GenConjointColorDodge), - new AdvancedBlendUcode(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Conjoint, false, GenConjointColorBurn), - new AdvancedBlendUcode(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Conjoint, false, GenConjointHardLight), - new AdvancedBlendUcode(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Conjoint, false, GenConjointSoftLight), - new AdvancedBlendUcode(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Conjoint, false, GenConjointDifference), - new AdvancedBlendUcode(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Conjoint, false, GenConjointExclusion), - new AdvancedBlendUcode(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Conjoint, false, GenConjointInvertRGB), - new AdvancedBlendUcode(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Conjoint, false, GenConjointLinearDodge), - new AdvancedBlendUcode(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Conjoint, false, GenConjointLinearBurn), - new AdvancedBlendUcode(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Conjoint, false, GenConjointVividLight), - new AdvancedBlendUcode(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Conjoint, false, GenConjointLinearLight), - new AdvancedBlendUcode(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Conjoint, false, GenConjointPinLight), - new AdvancedBlendUcode(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Conjoint, false, GenConjointHardMix), - new AdvancedBlendUcode(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Conjoint, false, GenConjointHslHue), - new AdvancedBlendUcode(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Conjoint, false, GenConjointHslSaturation), - new AdvancedBlendUcode(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Conjoint, false, GenConjointHslColor), - new AdvancedBlendUcode(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Conjoint, false, GenConjointHslLuminosity), - }; + public static readonly AdvancedBlendUcode[] Table = + [ + new(AdvancedBlendOp.PlusClamped, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedPlusClampedPremul), + new(AdvancedBlendOp.PlusClampedAlpha, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedPlusClampedAlphaPremul), + new(AdvancedBlendOp.PlusDarker, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedPlusDarkerPremul), + new(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedMultiplyPremul), + new(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedScreenPremul), + new(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedOverlayPremul), + new(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedDarkenPremul), + new(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedLightenPremul), + new(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedColorDodgePremul), + new(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedColorBurnPremul), + new(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHardLightPremul), + new(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedSoftLightPremul), + new(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedDifferencePremul), + new(AdvancedBlendOp.Minus, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedMinusPremul), + new(AdvancedBlendOp.MinusClamped, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedMinusClampedPremul), + new(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedExclusionPremul), + new(AdvancedBlendOp.Contrast, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedContrastPremul), + new(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedInvertPremul), + new(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedInvertRGBPremul), + new(AdvancedBlendOp.InvertOvg, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedInvertOvgPremul), + new(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedLinearDodgePremul), + new(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedLinearBurnPremul), + new(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedVividLightPremul), + new(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedLinearLightPremul), + new(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedPinLightPremul), + new(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHardMixPremul), + new(AdvancedBlendOp.Red, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedRedPremul), + new(AdvancedBlendOp.Green, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedGreenPremul), + new(AdvancedBlendOp.Blue, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedBluePremul), + new(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHslHuePremul), + new(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHslSaturationPremul), + new(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHslColorPremul), + new(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Uncorrelated, true, GenUncorrelatedHslLuminosityPremul), + new(AdvancedBlendOp.Src, AdvancedBlendOverlap.Disjoint, true, GenDisjointSrcPremul), + new(AdvancedBlendOp.Dst, AdvancedBlendOverlap.Disjoint, true, GenDisjointDstPremul), + new(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Disjoint, true, GenDisjointSrcOverPremul), + new(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Disjoint, true, GenDisjointDstOverPremul), + new(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Disjoint, true, GenDisjointSrcInPremul), + new(AdvancedBlendOp.DstIn, AdvancedBlendOverlap.Disjoint, true, GenDisjointDstInPremul), + new(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Disjoint, true, GenDisjointSrcOutPremul), + new(AdvancedBlendOp.DstOut, AdvancedBlendOverlap.Disjoint, true, GenDisjointDstOutPremul), + new(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Disjoint, true, GenDisjointSrcAtopPremul), + new(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Disjoint, true, GenDisjointDstAtopPremul), + new(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Disjoint, true, GenDisjointXorPremul), + new(AdvancedBlendOp.Plus, AdvancedBlendOverlap.Disjoint, true, GenDisjointPlusPremul), + new(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Disjoint, true, GenDisjointMultiplyPremul), + new(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Disjoint, true, GenDisjointScreenPremul), + new(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Disjoint, true, GenDisjointOverlayPremul), + new(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Disjoint, true, GenDisjointDarkenPremul), + new(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Disjoint, true, GenDisjointLightenPremul), + new(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Disjoint, true, GenDisjointColorDodgePremul), + new(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Disjoint, true, GenDisjointColorBurnPremul), + new(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Disjoint, true, GenDisjointHardLightPremul), + new(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Disjoint, true, GenDisjointSoftLightPremul), + new(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Disjoint, true, GenDisjointDifferencePremul), + new(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Disjoint, true, GenDisjointExclusionPremul), + new(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Disjoint, true, GenDisjointInvertPremul), + new(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Disjoint, true, GenDisjointInvertRGBPremul), + new(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Disjoint, true, GenDisjointLinearDodgePremul), + new(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Disjoint, true, GenDisjointLinearBurnPremul), + new(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Disjoint, true, GenDisjointVividLightPremul), + new(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Disjoint, true, GenDisjointLinearLightPremul), + new(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Disjoint, true, GenDisjointPinLightPremul), + new(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Disjoint, true, GenDisjointHardMixPremul), + new(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Disjoint, true, GenDisjointHslHuePremul), + new(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Disjoint, true, GenDisjointHslSaturationPremul), + new(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Disjoint, true, GenDisjointHslColorPremul), + new(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Disjoint, true, GenDisjointHslLuminosityPremul), + new(AdvancedBlendOp.Src, AdvancedBlendOverlap.Conjoint, true, GenConjointSrcPremul), + new(AdvancedBlendOp.Dst, AdvancedBlendOverlap.Conjoint, true, GenConjointDstPremul), + new(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Conjoint, true, GenConjointSrcOverPremul), + new(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Conjoint, true, GenConjointDstOverPremul), + new(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Conjoint, true, GenConjointSrcInPremul), + new(AdvancedBlendOp.DstIn, AdvancedBlendOverlap.Conjoint, true, GenConjointDstInPremul), + new(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Conjoint, true, GenConjointSrcOutPremul), + new(AdvancedBlendOp.DstOut, AdvancedBlendOverlap.Conjoint, true, GenConjointDstOutPremul), + new(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Conjoint, true, GenConjointSrcAtopPremul), + new(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Conjoint, true, GenConjointDstAtopPremul), + new(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Conjoint, true, GenConjointXorPremul), + new(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Conjoint, true, GenConjointMultiplyPremul), + new(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Conjoint, true, GenConjointScreenPremul), + new(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Conjoint, true, GenConjointOverlayPremul), + new(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Conjoint, true, GenConjointDarkenPremul), + new(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Conjoint, true, GenConjointLightenPremul), + new(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Conjoint, true, GenConjointColorDodgePremul), + new(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Conjoint, true, GenConjointColorBurnPremul), + new(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Conjoint, true, GenConjointHardLightPremul), + new(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Conjoint, true, GenConjointSoftLightPremul), + new(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Conjoint, true, GenConjointDifferencePremul), + new(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Conjoint, true, GenConjointExclusionPremul), + new(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Conjoint, true, GenConjointInvertPremul), + new(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Conjoint, true, GenConjointInvertRGBPremul), + new(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Conjoint, true, GenConjointLinearDodgePremul), + new(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Conjoint, true, GenConjointLinearBurnPremul), + new(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Conjoint, true, GenConjointVividLightPremul), + new(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Conjoint, true, GenConjointLinearLightPremul), + new(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Conjoint, true, GenConjointPinLightPremul), + new(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Conjoint, true, GenConjointHardMixPremul), + new(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Conjoint, true, GenConjointHslHuePremul), + new(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Conjoint, true, GenConjointHslSaturationPremul), + new(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Conjoint, true, GenConjointHslColorPremul), + new(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Conjoint, true, GenConjointHslLuminosityPremul), + new(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedDstOver), + new(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedSrcIn), + new(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedSrcOut), + new(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedSrcAtop), + new(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedDstAtop), + new(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedXor), + new(AdvancedBlendOp.PlusClamped, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedPlusClamped), + new(AdvancedBlendOp.PlusClampedAlpha, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedPlusClampedAlpha), + new(AdvancedBlendOp.PlusDarker, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedPlusDarker), + new(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedMultiply), + new(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedScreen), + new(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedOverlay), + new(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedDarken), + new(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedLighten), + new(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedColorDodge), + new(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedColorBurn), + new(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHardLight), + new(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedSoftLight), + new(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedDifference), + new(AdvancedBlendOp.Minus, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedMinus), + new(AdvancedBlendOp.MinusClamped, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedMinusClamped), + new(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedExclusion), + new(AdvancedBlendOp.Contrast, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedContrast), + new(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedInvertRGB), + new(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedLinearDodge), + new(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedLinearBurn), + new(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedVividLight), + new(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedLinearLight), + new(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedPinLight), + new(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHardMix), + new(AdvancedBlendOp.Red, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedRed), + new(AdvancedBlendOp.Green, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedGreen), + new(AdvancedBlendOp.Blue, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedBlue), + new(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHslHue), + new(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHslSaturation), + new(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHslColor), + new(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Uncorrelated, false, GenUncorrelatedHslLuminosity), + new(AdvancedBlendOp.Src, AdvancedBlendOverlap.Disjoint, false, GenDisjointSrc), + new(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Disjoint, false, GenDisjointSrcOver), + new(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Disjoint, false, GenDisjointDstOver), + new(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Disjoint, false, GenDisjointSrcIn), + new(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Disjoint, false, GenDisjointSrcOut), + new(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Disjoint, false, GenDisjointSrcAtop), + new(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Disjoint, false, GenDisjointDstAtop), + new(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Disjoint, false, GenDisjointXor), + new(AdvancedBlendOp.Plus, AdvancedBlendOverlap.Disjoint, false, GenDisjointPlus), + new(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Disjoint, false, GenDisjointMultiply), + new(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Disjoint, false, GenDisjointScreen), + new(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Disjoint, false, GenDisjointOverlay), + new(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Disjoint, false, GenDisjointDarken), + new(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Disjoint, false, GenDisjointLighten), + new(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Disjoint, false, GenDisjointColorDodge), + new(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Disjoint, false, GenDisjointColorBurn), + new(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Disjoint, false, GenDisjointHardLight), + new(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Disjoint, false, GenDisjointSoftLight), + new(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Disjoint, false, GenDisjointDifference), + new(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Disjoint, false, GenDisjointExclusion), + new(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Disjoint, false, GenDisjointInvertRGB), + new(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Disjoint, false, GenDisjointLinearDodge), + new(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Disjoint, false, GenDisjointLinearBurn), + new(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Disjoint, false, GenDisjointVividLight), + new(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Disjoint, false, GenDisjointLinearLight), + new(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Disjoint, false, GenDisjointPinLight), + new(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Disjoint, false, GenDisjointHardMix), + new(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Disjoint, false, GenDisjointHslHue), + new(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Disjoint, false, GenDisjointHslSaturation), + new(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Disjoint, false, GenDisjointHslColor), + new(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Disjoint, false, GenDisjointHslLuminosity), + new(AdvancedBlendOp.Src, AdvancedBlendOverlap.Conjoint, false, GenConjointSrc), + new(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Conjoint, false, GenConjointSrcOver), + new(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Conjoint, false, GenConjointDstOver), + new(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Conjoint, false, GenConjointSrcIn), + new(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Conjoint, false, GenConjointSrcOut), + new(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Conjoint, false, GenConjointSrcAtop), + new(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Conjoint, false, GenConjointDstAtop), + new(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Conjoint, false, GenConjointXor), + new(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Conjoint, false, GenConjointMultiply), + new(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Conjoint, false, GenConjointScreen), + new(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Conjoint, false, GenConjointOverlay), + new(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Conjoint, false, GenConjointDarken), + new(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Conjoint, false, GenConjointLighten), + new(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Conjoint, false, GenConjointColorDodge), + new(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Conjoint, false, GenConjointColorBurn), + new(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Conjoint, false, GenConjointHardLight), + new(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Conjoint, false, GenConjointSoftLight), + new(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Conjoint, false, GenConjointDifference), + new(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Conjoint, false, GenConjointExclusion), + new(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Conjoint, false, GenConjointInvertRGB), + new(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Conjoint, false, GenConjointLinearDodge), + new(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Conjoint, false, GenConjointLinearBurn), + new(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Conjoint, false, GenConjointVividLight), + new(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Conjoint, false, GenConjointLinearLight), + new(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Conjoint, false, GenConjointPinLight), + new(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Conjoint, false, GenConjointHardMix), + new(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Conjoint, false, GenConjointHslHue), + new(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Conjoint, false, GenConjointHslSaturation), + new(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Conjoint, false, GenConjointHslColor), + new(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Conjoint, false, GenConjointHslLuminosity) + ]; public static string GenTable() { @@ -221,7 +221,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.Blender sb.AppendLine($"private static Dictionary _entries = new()"); sb.AppendLine("{"); - foreach (var entry in Table) + foreach (AdvancedBlendUcode entry in Table) { Hash128 hash = Hash128.ComputeHash(MemoryMarshal.Cast(entry.Code)); diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendManager.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendManager.cs index ce3d2c236..18428eda9 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendManager.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendManager.cs @@ -66,7 +66,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.Blender descriptor = default; - if (!AdvancedBlendPreGenTable.Entries.TryGetValue(hash, out var entry)) + if (!AdvancedBlendPreGenTable.Entries.TryGetValue(hash, out AdvancedBlendEntry entry)) { return false; } diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendPreGenTable.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendPreGenTable.cs index b6cd9def9..5d420a140 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendPreGenTable.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendPreGenTable.cs @@ -1,6 +1,5 @@ using Ryujinx.Common; using Ryujinx.Graphics.GAL; -using System; using System.Collections.Generic; namespace Ryujinx.Graphics.Gpu.Engine.Threed.Blender @@ -68,206 +67,268 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.Blender /// public static readonly IReadOnlyDictionary Entries = new Dictionary() { - { new Hash128(0x19ECF57B83DE31F7, 0x5BAE759246F264C0), new AdvancedBlendEntry(AdvancedBlendOp.PlusClamped, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xDE1B14A356A1A9ED, 0x59D803593C607C1D), new AdvancedBlendEntry(AdvancedBlendOp.PlusClampedAlpha, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x1A3C3A6D32DEC368, 0xBCAE519EC6AAA045), new AdvancedBlendEntry(AdvancedBlendOp.PlusDarker, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x6FD380261A63B240, 0x17C3B335DBB9E3DB), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x1D39164823D3A2D1, 0xC45350959CE1C8FB), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x18DF09FF53B129FE, 0xC02EDA33C36019F6), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Uncorrelated, true, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x5973E583271EBF06, 0x711497D75D1272E0), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x4759E0E5DA54D5E8, 0x1FDD57C0C38AFA1F), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x337684D43CCE97FA, 0x0139E30CC529E1C9), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xDA59E85D8428992D, 0x1D3D7C64C9EF0132), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x9455B949298CE805, 0xE73D3301518BE98A), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Uncorrelated, true, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xBDD3B4DEDBE336AA, 0xBFA4DCD50D535DEE), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Uncorrelated, true, new[] { new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x22D4E970A028649A, 0x4F3FCB055FCED965), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xA346A91311D72114, 0x151A27A3FB0A1904), new AdvancedBlendEntry(AdvancedBlendOp.Minus, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.ReverseSubtractGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x8A307241061FACD6, 0xA39D1826440B8EE7), new AdvancedBlendEntry(AdvancedBlendOp.MinusClamped, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xB3BE569485EFFFE0, 0x0BA4E269B3CFB165), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x36FCA3277DC11822, 0x2BC0F6CAC2029672), new AdvancedBlendEntry(AdvancedBlendOp.Contrast, AdvancedBlendOverlap.Uncorrelated, true, new[] { new RgbFloat(2f, 2f, 2f), new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x4A6226AF2DE9BD7F, 0xEB890D7DA716F73A), new AdvancedBlendEntry(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0xF364CAA94E160FEB, 0xBF364512C72A3797), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x6BF791AB4AC19C87, 0x6FA17A994EA0FCDE), new AdvancedBlendEntry(AdvancedBlendOp.InvertOvg, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x053C75A0AE0BB222, 0x03C791FEEB59754C), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x25762AB40B6CBDE9, 0x595E9A968AC4F01C), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xC2D05E2DBE16955D, 0xB8659C7A3FCFA7CE), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Uncorrelated, true, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x223F220B8F74CBFB, 0xD3DD19D7C39209A5), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Uncorrelated, true, new[] { new RgbFloat(2f, 2f, 2f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xD0DAE57A9F1FE78A, 0x353796BCFB8CE30B), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x601C8CBEC07FF8FF, 0xB8E22882360E8695), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x3A55B7B78C76A7A8, 0x206F503B2D9FFEAA), new AdvancedBlendEntry(AdvancedBlendOp.Red, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x80BC65C7831388E5, 0xC652457B2C766AEC), new AdvancedBlendEntry(AdvancedBlendOp.Green, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x3D3A912E5833EE13, 0x307895951349EE33), new AdvancedBlendEntry(AdvancedBlendOp.Blue, AdvancedBlendOverlap.Uncorrelated, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x289105BE92E81803, 0xFD8F1F03D15C53B4), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Uncorrelated, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x007AE3BD140764EB, 0x0EE05A0D2E80BBAE), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Uncorrelated, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x77F7EE0DB3FDDB96, 0xDEA47C881306DB3E), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Uncorrelated, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x66F4E9A7D73CA157, 0x1486058A177DB11C), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Uncorrelated, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x593E9F331612D618, 0x9D217BEFA4EB919A), new AdvancedBlendEntry(AdvancedBlendOp.Src, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, - { new Hash128(0x0A5194C5E6891106, 0xDD8EC6586106557C), new AdvancedBlendEntry(AdvancedBlendOp.Dst, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x8D77173D5E06E916, 0x06AB190E7D10F4D4), new AdvancedBlendEntry(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x655B4EBC148981DA, 0x455999EF2B9BD28A), new AdvancedBlendEntry(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x98F5437D5F518929, 0xBFF4A6E83183DB63), new AdvancedBlendEntry(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x6ADDEFE3B9CEF2FD, 0xB6F6272AFECB1AAB), new AdvancedBlendEntry(AdvancedBlendOp.DstIn, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x80953F0953BF05B1, 0xD59ABFAA34F8196F), new AdvancedBlendEntry(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xA401D9AA2A39C121, 0xFC0C8005C22AD7E3), new AdvancedBlendEntry(AdvancedBlendOp.DstOut, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x06274FB7CA9CDD22, 0x6CE8188B1A9AB6EF), new AdvancedBlendEntry(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x0B079BE7F7F70817, 0xB72E7736CA51E321), new AdvancedBlendEntry(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, - { new Hash128(0x66215C99403CEDDE, 0x900B733D62204C48), new AdvancedBlendEntry(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x12DEF2AD900CAD6C, 0x58CF5CC3004910DF), new AdvancedBlendEntry(AdvancedBlendOp.Plus, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x272BA3A49F64DAE4, 0xAC70B96C00A99EAF), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x206C34AAA7D3F545, 0xDA4B30CACAA483A0), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x3D93494920D257BE, 0xDCC573BE1F5F4449), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Disjoint, true, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x0D7417D80191107B, 0xEAF40547827E005F), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xEC1B03E8C883F9C9, 0x2D3CA044C58C01B4), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x58A19A0135D68B31, 0x82F35B97AED068E5), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x20489F9AB36CC0E3, 0x20499874219E35EE), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xBB176935E5EE05BF, 0x95B26D4D30EA7A14), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Disjoint, true, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x5FF9393C908ACFED, 0x068B0BD875773ABF), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Disjoint, true, new[] { new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x03181F8711C9802C, 0x6B02C7C6B224FE7B), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x2EE2209021F6B977, 0xF3AFA1491B8B89FC), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xD8BA4DD2EDE4DC9E, 0x01006114977CF715), new AdvancedBlendEntry(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0xD156B99835A2D8ED, 0x2D0BEE9E135EA7A7), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x20CE8C898ED4BE27, 0x1514900B6F5E8F66), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xCDE5F743820BA2D9, 0x917845FE2ECB083D), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xEB03DF4A0C1D14CD, 0xBAE2E831C6E8FFE4), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Disjoint, true, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x1DC9E49AABC779AC, 0x4053A1441EB713D3), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Disjoint, true, new[] { new RgbFloat(2f, 2f, 2f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xFBDEF776248F7B3E, 0xE05EEFD65AC47CB7), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x415A1A48E03AA6E7, 0x046D7EE33CA46B9A), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Disjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x59A6901EC9BB2041, 0x2F3E19CE5EEC3EBE), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Disjoint, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x044B2B6E105221DA, 0x3089BBC033F994AF), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Disjoint, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x374A5A24AA8E6CC5, 0x29930FAA6215FA2B), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Disjoint, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x30CD0F7AF0CF26F9, 0x06CCA6744DE7DCF5), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Disjoint, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x1A6C9A1F6FE494A5, 0xA0CFAF77617E54DD), new AdvancedBlendEntry(AdvancedBlendOp.Src, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, - { new Hash128(0x081AF6DAAB1C8717, 0xBFEDCE59AE3DC9AC), new AdvancedBlendEntry(AdvancedBlendOp.Dst, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x3518E44573AB68BA, 0xC96EE71AF9F8F546), new AdvancedBlendEntry(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xF89E81FE8D73C96F, 0x4583A04577A0F21C), new AdvancedBlendEntry(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xDF4026421CB61119, 0x14115A1F5139AFC7), new AdvancedBlendEntry(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MinimumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x91A20262C3E3A695, 0x0B3A102BFCDC6B1C), new AdvancedBlendEntry(AdvancedBlendOp.DstIn, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MinimumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x44F4C7CCFEB9EBFA, 0xF68394E6D56E5C2F), new AdvancedBlendEntry(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xB89F17C7021E9760, 0x430357EE0F7188EF), new AdvancedBlendEntry(AdvancedBlendOp.DstOut, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xDA2D20EA4242B8A0, 0x0D1EC05B72E3838F), new AdvancedBlendEntry(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x855DFEE1208D11B9, 0x77C6E3DDCFE30B85), new AdvancedBlendEntry(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, - { new Hash128(0x9B3808439683FD58, 0x123DCBE4705AB25E), new AdvancedBlendEntry(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xA42CF045C248A00A, 0x0C6C63C24EA0B0C1), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x320A83B6D00C8059, 0x796EDAB3EB7314BC), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x45253AC9ABFFC613, 0x8F92EA70195FB573), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Conjoint, true, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x1A5D263B588274B6, 0x167D305F6C794179), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x709C1A837FE966AC, 0x75D8CE49E8A78EDB), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x8265C26F85E4145F, 0x932E6CCBF37CB600), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x3F252B3FEF983F27, 0x9370D7EEFEFA1A9E), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x66A334A4AEA41078, 0xCB52254E1E395231), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Conjoint, true, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xFDD05C53B25F0035, 0xB7E3ECEE166C222F), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Conjoint, true, new[] { new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x25D932A77FFED81A, 0xA50D797B0FCA94E8), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x4A953B6F5F7D341C, 0xDC05CFB50DDB5DC1), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x838CB660C4F41F6D, 0x9E7D958697543495), new AdvancedBlendEntry(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x4DF6EC1348A8F797, 0xA128E0CD69DB5A64), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x178CDFAB9A015295, 0x2BF40EA72E596D57), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x338FC99050E56AFD, 0x2AF41CF82BE602BF), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x62E02ED60D1E978E, 0xBF726B3E68C11E4D), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Conjoint, true, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xFBAF92DD4C101502, 0x7AF2EDA6596B819D), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Conjoint, true, new[] { new RgbFloat(2f, 2f, 2f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x0EF1241F65D4B50A, 0xE8D85DFA6AEDDB84), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x77FE024B5C9D4A18, 0xF19D48A932F6860F), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Conjoint, true, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x9C88CBFA2E09D857, 0x0A0361704CBEEE1D), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Conjoint, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x5B94127FA190E640, 0x8D1FEFF837A91268), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Conjoint, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xB9C9105B7E063DDB, 0xF6A70E1D511B96FD), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Conjoint, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xF0751AAE332B3ED1, 0xC40146F5C83C2533), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Conjoint, true, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x579EB12F595F75AD, 0x151BF0504703B81B), new AdvancedBlendEntry(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xF9CA152C03AC8C62, 0x1581336205E5CF47), new AdvancedBlendEntry(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.DstAlphaGl, BlendFactor.ZeroGl)) }, - { new Hash128(0x98ACD8BB5E195D0F, 0x91F937672BE899F0), new AdvancedBlendEntry(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneMinusDstAlphaGl, BlendFactor.ZeroGl)) }, - { new Hash128(0xBF97F10FC301F44C, 0x75721789F0D48548), new AdvancedBlendEntry(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x1B982263B8B08A10, 0x3350C76E2E1B27DF), new AdvancedBlendEntry(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, - { new Hash128(0xFF20AC79F64EDED8, 0xAF9025B2D97B9273), new AdvancedBlendEntry(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneMinusDstAlphaGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x9FFD986600FB112F, 0x384FDDF4E060139A), new AdvancedBlendEntry(AdvancedBlendOp.PlusClamped, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x0425E40B5B8B3B52, 0x5880CBED7CAB631C), new AdvancedBlendEntry(AdvancedBlendOp.PlusClampedAlpha, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x16DAC8593F28623A, 0x233DBC82325B8AED), new AdvancedBlendEntry(AdvancedBlendOp.PlusDarker, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xB37E5F234B9F0948, 0xD5F957A2ECD98FD6), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xCA0FDADD1D20DBE3, 0x1A5C15CCBF1AC538), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x1C48304D73A9DF3A, 0x891DB93FA36E3450), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Uncorrelated, false, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x53200F2279B7FA39, 0x051C2462EBF6789C), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xB88BFB80714DCD5C, 0xEBD6938D744E6A41), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xE33DC2A25FC1A976, 0x08B3DBB1F3027D45), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xCE97E71615370316, 0xE131AE49D3A4D62B), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xE059FD265149B256, 0x94AF817AC348F61F), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Uncorrelated, false, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x16D31333D477E231, 0x9A98AAC84F72CC62), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Uncorrelated, false, new[] { new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x47FC3B0776366D3C, 0xE96D9BD83B277874), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x7230401E3FEA1F3B, 0xF0D15F05D3D1E309), new AdvancedBlendEntry(AdvancedBlendOp.Minus, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.ReverseSubtractGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x188212F9303742F5, 0x100C51CB96E03591), new AdvancedBlendEntry(AdvancedBlendOp.MinusClamped, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x52B755D296B44DC5, 0x4003B87275625973), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xD873ED973ADF7EAD, 0x73E68B57D92034E7), new AdvancedBlendEntry(AdvancedBlendOp.Contrast, AdvancedBlendOverlap.Uncorrelated, false, new[] { new RgbFloat(2f, 2f, 2f), new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x471F9FA34B945ACB, 0x10524D1410B3C402), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x99F569454EA0EF32, 0x6FC70A8B3A07DC8B), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x5AD55F950067AC7E, 0x4BA60A4FBABDD0AC), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x03FF2C858C9C4C5B, 0xE95AE7F561FB60E9), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Uncorrelated, false, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x6DC0E510C7BCF9D2, 0xAE805D7CECDCB5C1), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Uncorrelated, false, new[] { new RgbFloat(2f, 2f, 2f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x44832332CED5C054, 0x2F8D5536C085B30A), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x4AB4D387618AC51F, 0x495B46E0555F4B32), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x99282B49405A01A8, 0xD6FA93F864F24A8E), new AdvancedBlendEntry(AdvancedBlendOp.Red, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x37B30C1064FBD23E, 0x5D068366F42317C2), new AdvancedBlendEntry(AdvancedBlendOp.Green, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x760FAE9D59E04BC2, 0xA40AD483EA01435E), new AdvancedBlendEntry(AdvancedBlendOp.Blue, AdvancedBlendOverlap.Uncorrelated, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0xE786950FD9D1C6EF, 0xF9FDD5AF6451D239), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Uncorrelated, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x052458BB4788B0CA, 0x8AC58FDCA1F45EF5), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Uncorrelated, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x6AFC3837D1D31920, 0xB9D49C2FE49642C6), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Uncorrelated, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0xAFC2911949317E01, 0xD5B63636F5CB3422), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Uncorrelated, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, - { new Hash128(0x13B46DF507CC2C53, 0x86DE26517E6BF0A7), new AdvancedBlendEntry(AdvancedBlendOp.Src, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, - { new Hash128(0x5C372442474BE410, 0x79ECD3C0C496EF2E), new AdvancedBlendEntry(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x74AAB45DBF5336E9, 0x01BFC4E181DAD442), new AdvancedBlendEntry(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x43239E282A36C85C, 0x36FB65560E46AD0F), new AdvancedBlendEntry(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x1A3BA8A7583B8F7A, 0xE64E41D548033180), new AdvancedBlendEntry(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x32BBB9859E9B565D, 0x3D5CE94FE55F18B5), new AdvancedBlendEntry(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0xD947A0766AE3C0FC, 0x391E5D53E86F4ED6), new AdvancedBlendEntry(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, - { new Hash128(0xBD9A7C08BDFD8CE6, 0x905407634901355E), new AdvancedBlendEntry(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x8395475BCB0D7A8C, 0x48AF5DD501D44A70), new AdvancedBlendEntry(AdvancedBlendOp.Plus, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x80AAC23FEBD4A3E5, 0xEA8C70F0B4DE52DE), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x2F3AD1B0F1B3FD09, 0xC0EBC784BFAB8EA3), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x52B54032F2F70BFF, 0xC941D6FDED674765), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Disjoint, false, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xCA7B86F72EC6A99B, 0x55868A131AFE359E), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x377919B60BD133CA, 0x0FD611627664EF40), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x9D4A0C5EE1153887, 0x7B869EBA218C589B), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x311F2A858545D123, 0xB4D09C802480AD62), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xCF78AA6A83AFA689, 0x9DC48B0C2182A3E1), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Disjoint, false, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xC3018CD6F1CF62D1, 0x016E32DD9087B1BB), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Disjoint, false, new[] { new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x9CB62CE0E956EE29, 0x0FB67F503E60B3AD), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x3589A13C16EF3BFA, 0x15B29BFC91F3BDFB), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x3502CA5FB7529917, 0xFA51BFD0D1688071), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x62ADC25AD6D0A923, 0x76CB6D238276D3A3), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x09FDEB1116A9D52C, 0x85BB8627CD5C2733), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x0709FED1B65E18EB, 0x5BC3AA4D99EC19CF), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Disjoint, false, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xB18D28AE5DE4C723, 0xE820AA2B75C9C02E), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Disjoint, false, new[] { new RgbFloat(2f, 2f, 2f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x6743C51621497480, 0x4B164E40858834AE), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x63D1E181E34A2944, 0x1AE292C9D9F12819), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Disjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x079523298250BFF6, 0xC0C793510603CDB5), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Disjoint, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x4C9D0A973C805EA6, 0xD1FF59AD5156B93C), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Disjoint, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x1E914678F3057BCD, 0xD503AE389C12D229), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Disjoint, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0x9FDBADE5556C5311, 0x03F0CBC798FC5C94), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Disjoint, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xE39451534635403C, 0x606CC1CA1F452388), new AdvancedBlendEntry(AdvancedBlendOp.Src, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, - { new Hash128(0x1D39F0F0A1008AA6, 0xBFDF2B97E6C3F125), new AdvancedBlendEntry(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xDB81BED30D5BDBEA, 0xAF0B2856EB93AD2C), new AdvancedBlendEntry(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x83F69CCF1D0A79B6, 0x70D31332797430AC), new AdvancedBlendEntry(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MinimumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x7B87F807AB7A8F5C, 0x1241A2A01FB31771), new AdvancedBlendEntry(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xF557172E20D5272D, 0xC1961F8C7A5D2820), new AdvancedBlendEntry(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0xA8476B3944DBBC9B, 0x84A2F6AF97B15FDF), new AdvancedBlendEntry(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, - { new Hash128(0x3259602B55414DA3, 0x72AACCC00B5A9D10), new AdvancedBlendEntry(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, - { new Hash128(0xC0CB8C10F36EDCD6, 0x8C2D088AD8191E1C), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x81806C451C6255EF, 0x5AA8AC9A08941A15), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xE55A6537F4568198, 0xCA8735390B799B19), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Conjoint, false, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x5C044BA14536DDA3, 0xBCE0123ED7D510EC), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x6788346C405BE130, 0x372A4BB199C01F9F), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x510EDC2A34E2856B, 0xE1727A407E294254), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x4B7BE01BD398C7A8, 0x5BFF79BC00672C18), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x213B43845540CFEC, 0xDA857411CF1CCFCE), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Conjoint, false, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x765AFA6732E783F1, 0x8F1CABF1BC78A014), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Conjoint, false, new[] { new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xA4A5DE1CC06F6CB1, 0xA0634A0011001709), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x81F32BD8816EA796, 0x697EE86683165170), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xB870C209EAA5F092, 0xAF5FD923909CAA1F), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, - { new Hash128(0x3649A9F5C936FB83, 0xDD7C834897AA182A), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xD72A2B1097A5995C, 0x3D41B2763A913654), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x551E212B9F6C454A, 0xB0DFA05BEB3C37FA), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Conjoint, false, new[] { new RgbFloat(0.5f, 0.5f, 0.5f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x681B5A313B7416BF, 0xCB1CBAEEB4D81500), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Conjoint, false, new[] { new RgbFloat(2f, 2f, 2f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x9343A18BD4B16777, 0xEDB4AC1C8972C3A4), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xC960BF6D8519DE28, 0x78D8557FD405D119), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Conjoint, false, Array.Empty(), new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x65A7B01FDC73A46C, 0x297E096ED5CC4D8A), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Conjoint, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0xD9C99BA4A6CDC13B, 0x3CFF0ACEDC2EE150), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Conjoint, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x6BC00DA6EB922BD1, 0x5FD4C11F2A685234), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Conjoint, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, - { new Hash128(0x8652300E32D93050, 0x9460E7B449132371), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Conjoint, false, new[] { new RgbFloat(0.3f, 0.59f, 0.11f) }, new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x19ECF57B83DE31F7, 0x5BAE759246F264C0), new AdvancedBlendEntry(AdvancedBlendOp.PlusClamped, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xDE1B14A356A1A9ED, 0x59D803593C607C1D), new AdvancedBlendEntry(AdvancedBlendOp.PlusClampedAlpha, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x1A3C3A6D32DEC368, 0xBCAE519EC6AAA045), new AdvancedBlendEntry(AdvancedBlendOp.PlusDarker, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x6FD380261A63B240, 0x17C3B335DBB9E3DB), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x1D39164823D3A2D1, 0xC45350959CE1C8FB), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x18DF09FF53B129FE, 0xC02EDA33C36019F6), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Uncorrelated, true, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x5973E583271EBF06, 0x711497D75D1272E0), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x4759E0E5DA54D5E8, 0x1FDD57C0C38AFA1F), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x337684D43CCE97FA, 0x0139E30CC529E1C9), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xDA59E85D8428992D, 0x1D3D7C64C9EF0132), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x9455B949298CE805, 0xE73D3301518BE98A), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Uncorrelated, true, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xBDD3B4DEDBE336AA, 0xBFA4DCD50D535DEE), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Uncorrelated, true, + [new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) + ], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x22D4E970A028649A, 0x4F3FCB055FCED965), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xA346A91311D72114, 0x151A27A3FB0A1904), new AdvancedBlendEntry(AdvancedBlendOp.Minus, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.ReverseSubtractGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x8A307241061FACD6, 0xA39D1826440B8EE7), new AdvancedBlendEntry(AdvancedBlendOp.MinusClamped, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xB3BE569485EFFFE0, 0x0BA4E269B3CFB165), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x36FCA3277DC11822, 0x2BC0F6CAC2029672), new AdvancedBlendEntry(AdvancedBlendOp.Contrast, AdvancedBlendOverlap.Uncorrelated, true, + [new RgbFloat(2f, 2f, 2f), new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x4A6226AF2DE9BD7F, 0xEB890D7DA716F73A), new AdvancedBlendEntry(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0xF364CAA94E160FEB, 0xBF364512C72A3797), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x6BF791AB4AC19C87, 0x6FA17A994EA0FCDE), new AdvancedBlendEntry(AdvancedBlendOp.InvertOvg, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x053C75A0AE0BB222, 0x03C791FEEB59754C), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x25762AB40B6CBDE9, 0x595E9A968AC4F01C), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xC2D05E2DBE16955D, 0xB8659C7A3FCFA7CE), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Uncorrelated, true, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x223F220B8F74CBFB, 0xD3DD19D7C39209A5), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Uncorrelated, true, + [new RgbFloat(2f, 2f, 2f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xD0DAE57A9F1FE78A, 0x353796BCFB8CE30B), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x601C8CBEC07FF8FF, 0xB8E22882360E8695), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x3A55B7B78C76A7A8, 0x206F503B2D9FFEAA), new AdvancedBlendEntry(AdvancedBlendOp.Red, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x80BC65C7831388E5, 0xC652457B2C766AEC), new AdvancedBlendEntry(AdvancedBlendOp.Green, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x3D3A912E5833EE13, 0x307895951349EE33), new AdvancedBlendEntry(AdvancedBlendOp.Blue, AdvancedBlendOverlap.Uncorrelated, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x289105BE92E81803, 0xFD8F1F03D15C53B4), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Uncorrelated, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x007AE3BD140764EB, 0x0EE05A0D2E80BBAE), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Uncorrelated, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x77F7EE0DB3FDDB96, 0xDEA47C881306DB3E), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Uncorrelated, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x66F4E9A7D73CA157, 0x1486058A177DB11C), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Uncorrelated, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x593E9F331612D618, 0x9D217BEFA4EB919A), new AdvancedBlendEntry(AdvancedBlendOp.Src, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, + { new Hash128(0x0A5194C5E6891106, 0xDD8EC6586106557C), new AdvancedBlendEntry(AdvancedBlendOp.Dst, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x8D77173D5E06E916, 0x06AB190E7D10F4D4), new AdvancedBlendEntry(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x655B4EBC148981DA, 0x455999EF2B9BD28A), new AdvancedBlendEntry(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x98F5437D5F518929, 0xBFF4A6E83183DB63), new AdvancedBlendEntry(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x6ADDEFE3B9CEF2FD, 0xB6F6272AFECB1AAB), new AdvancedBlendEntry(AdvancedBlendOp.DstIn, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x80953F0953BF05B1, 0xD59ABFAA34F8196F), new AdvancedBlendEntry(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xA401D9AA2A39C121, 0xFC0C8005C22AD7E3), new AdvancedBlendEntry(AdvancedBlendOp.DstOut, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x06274FB7CA9CDD22, 0x6CE8188B1A9AB6EF), new AdvancedBlendEntry(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x0B079BE7F7F70817, 0xB72E7736CA51E321), new AdvancedBlendEntry(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, + { new Hash128(0x66215C99403CEDDE, 0x900B733D62204C48), new AdvancedBlendEntry(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x12DEF2AD900CAD6C, 0x58CF5CC3004910DF), new AdvancedBlendEntry(AdvancedBlendOp.Plus, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x272BA3A49F64DAE4, 0xAC70B96C00A99EAF), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x206C34AAA7D3F545, 0xDA4B30CACAA483A0), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x3D93494920D257BE, 0xDCC573BE1F5F4449), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Disjoint, true, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x0D7417D80191107B, 0xEAF40547827E005F), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xEC1B03E8C883F9C9, 0x2D3CA044C58C01B4), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x58A19A0135D68B31, 0x82F35B97AED068E5), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x20489F9AB36CC0E3, 0x20499874219E35EE), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xBB176935E5EE05BF, 0x95B26D4D30EA7A14), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Disjoint, true, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x5FF9393C908ACFED, 0x068B0BD875773ABF), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Disjoint, true, + [new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) + ], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x03181F8711C9802C, 0x6B02C7C6B224FE7B), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x2EE2209021F6B977, 0xF3AFA1491B8B89FC), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xD8BA4DD2EDE4DC9E, 0x01006114977CF715), new AdvancedBlendEntry(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0xD156B99835A2D8ED, 0x2D0BEE9E135EA7A7), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x20CE8C898ED4BE27, 0x1514900B6F5E8F66), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xCDE5F743820BA2D9, 0x917845FE2ECB083D), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xEB03DF4A0C1D14CD, 0xBAE2E831C6E8FFE4), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Disjoint, true, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x1DC9E49AABC779AC, 0x4053A1441EB713D3), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Disjoint, true, + [new RgbFloat(2f, 2f, 2f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xFBDEF776248F7B3E, 0xE05EEFD65AC47CB7), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x415A1A48E03AA6E7, 0x046D7EE33CA46B9A), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Disjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x59A6901EC9BB2041, 0x2F3E19CE5EEC3EBE), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Disjoint, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x044B2B6E105221DA, 0x3089BBC033F994AF), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Disjoint, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x374A5A24AA8E6CC5, 0x29930FAA6215FA2B), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Disjoint, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x30CD0F7AF0CF26F9, 0x06CCA6744DE7DCF5), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Disjoint, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x1A6C9A1F6FE494A5, 0xA0CFAF77617E54DD), new AdvancedBlendEntry(AdvancedBlendOp.Src, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, + { new Hash128(0x081AF6DAAB1C8717, 0xBFEDCE59AE3DC9AC), new AdvancedBlendEntry(AdvancedBlendOp.Dst, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x3518E44573AB68BA, 0xC96EE71AF9F8F546), new AdvancedBlendEntry(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xF89E81FE8D73C96F, 0x4583A04577A0F21C), new AdvancedBlendEntry(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xDF4026421CB61119, 0x14115A1F5139AFC7), new AdvancedBlendEntry(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MinimumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x91A20262C3E3A695, 0x0B3A102BFCDC6B1C), new AdvancedBlendEntry(AdvancedBlendOp.DstIn, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MinimumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x44F4C7CCFEB9EBFA, 0xF68394E6D56E5C2F), new AdvancedBlendEntry(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xB89F17C7021E9760, 0x430357EE0F7188EF), new AdvancedBlendEntry(AdvancedBlendOp.DstOut, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xDA2D20EA4242B8A0, 0x0D1EC05B72E3838F), new AdvancedBlendEntry(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x855DFEE1208D11B9, 0x77C6E3DDCFE30B85), new AdvancedBlendEntry(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, + { new Hash128(0x9B3808439683FD58, 0x123DCBE4705AB25E), new AdvancedBlendEntry(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xA42CF045C248A00A, 0x0C6C63C24EA0B0C1), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x320A83B6D00C8059, 0x796EDAB3EB7314BC), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x45253AC9ABFFC613, 0x8F92EA70195FB573), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Conjoint, true, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x1A5D263B588274B6, 0x167D305F6C794179), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x709C1A837FE966AC, 0x75D8CE49E8A78EDB), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x8265C26F85E4145F, 0x932E6CCBF37CB600), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x3F252B3FEF983F27, 0x9370D7EEFEFA1A9E), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x66A334A4AEA41078, 0xCB52254E1E395231), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Conjoint, true, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xFDD05C53B25F0035, 0xB7E3ECEE166C222F), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Conjoint, true, + [new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) + ], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x25D932A77FFED81A, 0xA50D797B0FCA94E8), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x4A953B6F5F7D341C, 0xDC05CFB50DDB5DC1), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x838CB660C4F41F6D, 0x9E7D958697543495), new AdvancedBlendEntry(AdvancedBlendOp.Invert, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x4DF6EC1348A8F797, 0xA128E0CD69DB5A64), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x178CDFAB9A015295, 0x2BF40EA72E596D57), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x338FC99050E56AFD, 0x2AF41CF82BE602BF), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x62E02ED60D1E978E, 0xBF726B3E68C11E4D), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Conjoint, true, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xFBAF92DD4C101502, 0x7AF2EDA6596B819D), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Conjoint, true, + [new RgbFloat(2f, 2f, 2f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x0EF1241F65D4B50A, 0xE8D85DFA6AEDDB84), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x77FE024B5C9D4A18, 0xF19D48A932F6860F), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Conjoint, true, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x9C88CBFA2E09D857, 0x0A0361704CBEEE1D), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Conjoint, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x5B94127FA190E640, 0x8D1FEFF837A91268), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Conjoint, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xB9C9105B7E063DDB, 0xF6A70E1D511B96FD), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Conjoint, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xF0751AAE332B3ED1, 0xC40146F5C83C2533), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Conjoint, true, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x579EB12F595F75AD, 0x151BF0504703B81B), new AdvancedBlendEntry(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xF9CA152C03AC8C62, 0x1581336205E5CF47), new AdvancedBlendEntry(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.DstAlphaGl, BlendFactor.ZeroGl)) }, + { new Hash128(0x98ACD8BB5E195D0F, 0x91F937672BE899F0), new AdvancedBlendEntry(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneMinusDstAlphaGl, BlendFactor.ZeroGl)) }, + { new Hash128(0xBF97F10FC301F44C, 0x75721789F0D48548), new AdvancedBlendEntry(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x1B982263B8B08A10, 0x3350C76E2E1B27DF), new AdvancedBlendEntry(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, + { new Hash128(0xFF20AC79F64EDED8, 0xAF9025B2D97B9273), new AdvancedBlendEntry(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneMinusDstAlphaGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x9FFD986600FB112F, 0x384FDDF4E060139A), new AdvancedBlendEntry(AdvancedBlendOp.PlusClamped, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x0425E40B5B8B3B52, 0x5880CBED7CAB631C), new AdvancedBlendEntry(AdvancedBlendOp.PlusClampedAlpha, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x16DAC8593F28623A, 0x233DBC82325B8AED), new AdvancedBlendEntry(AdvancedBlendOp.PlusDarker, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xB37E5F234B9F0948, 0xD5F957A2ECD98FD6), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xCA0FDADD1D20DBE3, 0x1A5C15CCBF1AC538), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x1C48304D73A9DF3A, 0x891DB93FA36E3450), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Uncorrelated, false, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x53200F2279B7FA39, 0x051C2462EBF6789C), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xB88BFB80714DCD5C, 0xEBD6938D744E6A41), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xE33DC2A25FC1A976, 0x08B3DBB1F3027D45), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xCE97E71615370316, 0xE131AE49D3A4D62B), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xE059FD265149B256, 0x94AF817AC348F61F), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Uncorrelated, false, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x16D31333D477E231, 0x9A98AAC84F72CC62), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Uncorrelated, false, + [new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) + ], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x47FC3B0776366D3C, 0xE96D9BD83B277874), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x7230401E3FEA1F3B, 0xF0D15F05D3D1E309), new AdvancedBlendEntry(AdvancedBlendOp.Minus, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.ReverseSubtractGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x188212F9303742F5, 0x100C51CB96E03591), new AdvancedBlendEntry(AdvancedBlendOp.MinusClamped, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x52B755D296B44DC5, 0x4003B87275625973), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xD873ED973ADF7EAD, 0x73E68B57D92034E7), new AdvancedBlendEntry(AdvancedBlendOp.Contrast, AdvancedBlendOverlap.Uncorrelated, false, + [new RgbFloat(2f, 2f, 2f), new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x471F9FA34B945ACB, 0x10524D1410B3C402), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x99F569454EA0EF32, 0x6FC70A8B3A07DC8B), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x5AD55F950067AC7E, 0x4BA60A4FBABDD0AC), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x03FF2C858C9C4C5B, 0xE95AE7F561FB60E9), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Uncorrelated, false, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x6DC0E510C7BCF9D2, 0xAE805D7CECDCB5C1), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Uncorrelated, false, + [new RgbFloat(2f, 2f, 2f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x44832332CED5C054, 0x2F8D5536C085B30A), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x4AB4D387618AC51F, 0x495B46E0555F4B32), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x99282B49405A01A8, 0xD6FA93F864F24A8E), new AdvancedBlendEntry(AdvancedBlendOp.Red, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x37B30C1064FBD23E, 0x5D068366F42317C2), new AdvancedBlendEntry(AdvancedBlendOp.Green, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x760FAE9D59E04BC2, 0xA40AD483EA01435E), new AdvancedBlendEntry(AdvancedBlendOp.Blue, AdvancedBlendOverlap.Uncorrelated, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0xE786950FD9D1C6EF, 0xF9FDD5AF6451D239), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Uncorrelated, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x052458BB4788B0CA, 0x8AC58FDCA1F45EF5), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Uncorrelated, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x6AFC3837D1D31920, 0xB9D49C2FE49642C6), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Uncorrelated, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0xAFC2911949317E01, 0xD5B63636F5CB3422), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Uncorrelated, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneMinusSrcAlphaGl)) }, + { new Hash128(0x13B46DF507CC2C53, 0x86DE26517E6BF0A7), new AdvancedBlendEntry(AdvancedBlendOp.Src, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, + { new Hash128(0x5C372442474BE410, 0x79ECD3C0C496EF2E), new AdvancedBlendEntry(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x74AAB45DBF5336E9, 0x01BFC4E181DAD442), new AdvancedBlendEntry(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x43239E282A36C85C, 0x36FB65560E46AD0F), new AdvancedBlendEntry(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x1A3BA8A7583B8F7A, 0xE64E41D548033180), new AdvancedBlendEntry(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x32BBB9859E9B565D, 0x3D5CE94FE55F18B5), new AdvancedBlendEntry(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0xD947A0766AE3C0FC, 0x391E5D53E86F4ED6), new AdvancedBlendEntry(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, + { new Hash128(0xBD9A7C08BDFD8CE6, 0x905407634901355E), new AdvancedBlendEntry(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x8395475BCB0D7A8C, 0x48AF5DD501D44A70), new AdvancedBlendEntry(AdvancedBlendOp.Plus, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x80AAC23FEBD4A3E5, 0xEA8C70F0B4DE52DE), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x2F3AD1B0F1B3FD09, 0xC0EBC784BFAB8EA3), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x52B54032F2F70BFF, 0xC941D6FDED674765), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Disjoint, false, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xCA7B86F72EC6A99B, 0x55868A131AFE359E), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x377919B60BD133CA, 0x0FD611627664EF40), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x9D4A0C5EE1153887, 0x7B869EBA218C589B), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x311F2A858545D123, 0xB4D09C802480AD62), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xCF78AA6A83AFA689, 0x9DC48B0C2182A3E1), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Disjoint, false, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xC3018CD6F1CF62D1, 0x016E32DD9087B1BB), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Disjoint, false, + [new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) + ], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x9CB62CE0E956EE29, 0x0FB67F503E60B3AD), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x3589A13C16EF3BFA, 0x15B29BFC91F3BDFB), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x3502CA5FB7529917, 0xFA51BFD0D1688071), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x62ADC25AD6D0A923, 0x76CB6D238276D3A3), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x09FDEB1116A9D52C, 0x85BB8627CD5C2733), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x0709FED1B65E18EB, 0x5BC3AA4D99EC19CF), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Disjoint, false, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xB18D28AE5DE4C723, 0xE820AA2B75C9C02E), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Disjoint, false, + [new RgbFloat(2f, 2f, 2f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x6743C51621497480, 0x4B164E40858834AE), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x63D1E181E34A2944, 0x1AE292C9D9F12819), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Disjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x079523298250BFF6, 0xC0C793510603CDB5), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Disjoint, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x4C9D0A973C805EA6, 0xD1FF59AD5156B93C), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Disjoint, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x1E914678F3057BCD, 0xD503AE389C12D229), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Disjoint, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0x9FDBADE5556C5311, 0x03F0CBC798FC5C94), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Disjoint, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xE39451534635403C, 0x606CC1CA1F452388), new AdvancedBlendEntry(AdvancedBlendOp.Src, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, + { new Hash128(0x1D39F0F0A1008AA6, 0xBFDF2B97E6C3F125), new AdvancedBlendEntry(AdvancedBlendOp.SrcOver, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xDB81BED30D5BDBEA, 0xAF0B2856EB93AD2C), new AdvancedBlendEntry(AdvancedBlendOp.DstOver, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x83F69CCF1D0A79B6, 0x70D31332797430AC), new AdvancedBlendEntry(AdvancedBlendOp.SrcIn, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MinimumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x7B87F807AB7A8F5C, 0x1241A2A01FB31771), new AdvancedBlendEntry(AdvancedBlendOp.SrcOut, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xF557172E20D5272D, 0xC1961F8C7A5D2820), new AdvancedBlendEntry(AdvancedBlendOp.SrcAtop, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0xA8476B3944DBBC9B, 0x84A2F6AF97B15FDF), new AdvancedBlendEntry(AdvancedBlendOp.DstAtop, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.OneGl, BlendFactor.ZeroGl)) }, + { new Hash128(0x3259602B55414DA3, 0x72AACCC00B5A9D10), new AdvancedBlendEntry(AdvancedBlendOp.Xor, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, 0, 0, 0)) }, + { new Hash128(0xC0CB8C10F36EDCD6, 0x8C2D088AD8191E1C), new AdvancedBlendEntry(AdvancedBlendOp.Multiply, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x81806C451C6255EF, 0x5AA8AC9A08941A15), new AdvancedBlendEntry(AdvancedBlendOp.Screen, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xE55A6537F4568198, 0xCA8735390B799B19), new AdvancedBlendEntry(AdvancedBlendOp.Overlay, AdvancedBlendOverlap.Conjoint, false, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x5C044BA14536DDA3, 0xBCE0123ED7D510EC), new AdvancedBlendEntry(AdvancedBlendOp.Darken, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x6788346C405BE130, 0x372A4BB199C01F9F), new AdvancedBlendEntry(AdvancedBlendOp.Lighten, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x510EDC2A34E2856B, 0xE1727A407E294254), new AdvancedBlendEntry(AdvancedBlendOp.ColorDodge, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x4B7BE01BD398C7A8, 0x5BFF79BC00672C18), new AdvancedBlendEntry(AdvancedBlendOp.ColorBurn, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x213B43845540CFEC, 0xDA857411CF1CCFCE), new AdvancedBlendEntry(AdvancedBlendOp.HardLight, AdvancedBlendOverlap.Conjoint, false, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x765AFA6732E783F1, 0x8F1CABF1BC78A014), new AdvancedBlendEntry(AdvancedBlendOp.SoftLight, AdvancedBlendOverlap.Conjoint, false, + [new RgbFloat(0.2605f, 0.2605f, 0.2605f), new RgbFloat(-0.7817f, -0.7817f, -0.7817f), new RgbFloat(0.3022f, 0.3022f, 0.3022f), new RgbFloat(0.2192f, 0.2192f, 0.2192f), new RgbFloat(0.25f, 0.25f, 0.25f), new RgbFloat(16f, 16f, 16f), new RgbFloat(12f, 12f, 12f), new RgbFloat(3f, 3f, 3f) + ], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xA4A5DE1CC06F6CB1, 0xA0634A0011001709), new AdvancedBlendEntry(AdvancedBlendOp.Difference, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x81F32BD8816EA796, 0x697EE86683165170), new AdvancedBlendEntry(AdvancedBlendOp.Exclusion, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xB870C209EAA5F092, 0xAF5FD923909CAA1F), new AdvancedBlendEntry(AdvancedBlendOp.InvertRGB, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.AddGl, BlendFactor.ZeroGl, BlendFactor.OneGl)) }, + { new Hash128(0x3649A9F5C936FB83, 0xDD7C834897AA182A), new AdvancedBlendEntry(AdvancedBlendOp.LinearDodge, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xD72A2B1097A5995C, 0x3D41B2763A913654), new AdvancedBlendEntry(AdvancedBlendOp.LinearBurn, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x551E212B9F6C454A, 0xB0DFA05BEB3C37FA), new AdvancedBlendEntry(AdvancedBlendOp.VividLight, AdvancedBlendOverlap.Conjoint, false, + [new RgbFloat(0.5f, 0.5f, 0.5f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x681B5A313B7416BF, 0xCB1CBAEEB4D81500), new AdvancedBlendEntry(AdvancedBlendOp.LinearLight, AdvancedBlendOverlap.Conjoint, false, + [new RgbFloat(2f, 2f, 2f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x9343A18BD4B16777, 0xEDB4AC1C8972C3A4), new AdvancedBlendEntry(AdvancedBlendOp.PinLight, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xC960BF6D8519DE28, 0x78D8557FD405D119), new AdvancedBlendEntry(AdvancedBlendOp.HardMix, AdvancedBlendOverlap.Conjoint, false, [], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x65A7B01FDC73A46C, 0x297E096ED5CC4D8A), new AdvancedBlendEntry(AdvancedBlendOp.HslHue, AdvancedBlendOverlap.Conjoint, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0xD9C99BA4A6CDC13B, 0x3CFF0ACEDC2EE150), new AdvancedBlendEntry(AdvancedBlendOp.HslSaturation, AdvancedBlendOverlap.Conjoint, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x6BC00DA6EB922BD1, 0x5FD4C11F2A685234), new AdvancedBlendEntry(AdvancedBlendOp.HslColor, AdvancedBlendOverlap.Conjoint, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, + { new Hash128(0x8652300E32D93050, 0x9460E7B449132371), new AdvancedBlendEntry(AdvancedBlendOp.HslLuminosity, AdvancedBlendOverlap.Conjoint, false, + [new RgbFloat(0.3f, 0.59f, 0.11f)], new FixedFunctionAlpha(BlendUcodeEnable.EnableRGB, BlendOp.MaximumGl, BlendFactor.OneGl, BlendFactor.OneGl)) }, }; } } diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/UcodeAssembler.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/UcodeAssembler.cs index 8e0209062..138a83440 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/UcodeAssembler.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/UcodeAssembler.cs @@ -274,7 +274,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.Blender private void Assemble(CC cc, Instruction inst, Dest dest, OpAC srcA, OpBD srcB, OpAC srcC, OpBD srcD) { - (_code ??= new List()).Add(new UcodeOp(cc, inst, _constantIndex, dest, srcA, srcB, srcC, srcD).Word); + (_code ??= []).Add(new UcodeOp(cc, inst, _constantIndex, dest, srcA, srcB, srcC, srcD).Word); } public void SetConstant(int index, float r, float g, float b) diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeContext.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeContext.cs index 6de50fb2e..ed9da4a5c 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeContext.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeContext.cs @@ -67,7 +67,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw { if (disposing) { - foreach (var texture in _cache.Values) + foreach (ITexture texture in _cache.Values) { texture.Release(); } @@ -285,6 +285,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw { data[index] = index; } + break; case PrimitiveTopology.LineLoop: data[^1] = 0; @@ -294,6 +295,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw data[index] = index >> 1; data[index + 1] = (index >> 1) + 1; } + break; case PrimitiveTopology.LineStrip: for (int index = 0; index < ((data.Length - 1) & ~1); index += 2) @@ -301,6 +303,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw data[index] = index >> 1; data[index + 1] = (index >> 1) + 1; } + break; case PrimitiveTopology.TriangleStrip: int tsTrianglesCount = data.Length / 3; @@ -330,6 +333,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw data[baseIndex + 2] = tsOutIndex++; } } + break; case PrimitiveTopology.TriangleFan: case PrimitiveTopology.Polygon: @@ -342,6 +346,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw data[index + 1] = tfOutIndex; data[index + 2] = ++tfOutIndex; } + break; case PrimitiveTopology.Quads: int qQuadsCount = data.Length / 6; @@ -358,6 +363,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw data[index + 4] = qIndex + 2; data[index + 5] = qIndex + 3; } + break; case PrimitiveTopology.QuadStrip: int qsQuadsCount = data.Length / 6; @@ -384,6 +390,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw data[index + 4] = qIndex + 2; data[index + 5] = qIndex + 3; } + break; case PrimitiveTopology.LineStripAdjacency: for (int index = 0; index < ((data.Length - 3) & ~3); index += 4) @@ -395,6 +402,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw data[index + 2] = lIndex + 2; data[index + 3] = lIndex + 3; } + break; case PrimitiveTopology.TriangleStripAdjacency: int tsaTrianglesCount = data.Length / 6; @@ -433,6 +441,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw data[baseIndex + 5] = tsaOutIndex++; } } + break; } @@ -620,7 +629,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw DestroyIfNotNull(ref _geometryIndexDataBuffer.Handle); DestroyIfNotNull(ref _sequentialIndexBuffer); - foreach (var indexBuffer in _topologyRemapBuffers.Values) + foreach (IndexBuffer indexBuffer in _topologyRemapBuffers.Values) { _context.Renderer.DeleteBuffer(indexBuffer.Handle); } diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeState.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeState.cs index 73682866b..a66ea7dbe 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeState.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ComputeDraw/VtgAsComputeState.cs @@ -127,7 +127,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw for (int index = 0; index < Constants.TotalVertexAttribs; index++) { - var vertexAttrib = _state.State.VertexAttribState[index]; + VertexAttribState vertexAttrib = _state.State.VertexAttribState[index]; if (!FormatTable.TryGetSingleComponentAttribFormat(vertexAttrib.UnpackFormat(), out Format format, out int componentsCount)) { @@ -154,7 +154,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw int bufferIndex = vertexAttrib.UnpackBufferIndex(); GpuVa endAddress = _state.State.VertexBufferEndAddress[bufferIndex]; - var vertexBuffer = _state.State.VertexBufferState[bufferIndex]; + VertexBufferState vertexBuffer = _state.State.VertexBufferState[bufferIndex]; bool instanced = _state.State.VertexBufferInstanced[bufferIndex]; ulong address = vertexBuffer.Address.Pack(); @@ -170,8 +170,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw int vbStride = vertexBuffer.UnpackStride(); ulong vbSize = GetVertexBufferSize(address, endAddress.Pack(), vbStride, _indexed, instanced, _firstVertex, _count); - ulong oldVbSize = vbSize; - ulong attributeOffset = (ulong)vertexAttrib.UnpackOffset(); int componentSize = format.GetScalarSize(); @@ -200,11 +198,11 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw int vertexInfoBinding = _vertexAsCompute.Reservations.VertexInfoConstantBufferBinding; BufferRange vertexInfoRange = new(_vacContext.VertexInfoBufferUpdater.Handle, 0, VertexInfoBuffer.RequiredSize); - _context.Renderer.Pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(vertexInfoBinding, vertexInfoRange) }); + _context.Renderer.Pipeline.SetUniformBuffers([new BufferAssignment(vertexInfoBinding, vertexInfoRange)]); int vertexDataBinding = _vertexAsCompute.Reservations.VertexOutputStorageBufferBinding; BufferRange vertexDataRange = _vacContext.GetVertexDataBufferRange(_vertexDataOffset, _vertexDataSize, write: true); - _context.Renderer.Pipeline.SetStorageBuffers(stackalloc[] { new BufferAssignment(vertexDataBinding, vertexDataRange) }); + _context.Renderer.Pipeline.SetStorageBuffers([new BufferAssignment(vertexDataBinding, vertexDataRange)]); _vacContext.VertexInfoBufferUpdater.Commit(); @@ -232,7 +230,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw int vertexInfoBinding = _vertexAsCompute.Reservations.VertexInfoConstantBufferBinding; BufferRange vertexInfoRange = new(_vacContext.VertexInfoBufferUpdater.Handle, 0, VertexInfoBuffer.RequiredSize); - _context.Renderer.Pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(vertexInfoBinding, vertexInfoRange) }); + _context.Renderer.Pipeline.SetUniformBuffers([new BufferAssignment(vertexInfoBinding, vertexInfoRange)]); int vertexDataBinding = _vertexAsCompute.Reservations.VertexOutputStorageBufferBinding; @@ -250,12 +248,11 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw BufferRange vertexBuffer = _vacContext.GetGeometryVertexDataBufferRange(_geometryVertexDataOffset, _geometryVertexDataSize, write: true); BufferRange indexBuffer = _vacContext.GetGeometryIndexDataBufferRange(_geometryIndexDataOffset, _geometryIndexDataSize, write: true); - _context.Renderer.Pipeline.SetStorageBuffers(stackalloc[] - { + _context.Renderer.Pipeline.SetStorageBuffers([ new BufferAssignment(vertexDataBinding, vertexDataRange), new BufferAssignment(geometryVbBinding, vertexBuffer), - new BufferAssignment(geometryIbBinding, indexBuffer), - }); + new BufferAssignment(geometryIbBinding, indexBuffer) + ]); _context.Renderer.Pipeline.DispatchCompute( BitUtils.DivRoundUp(primitivesCount, ComputeLocalSize), @@ -299,7 +296,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw _context.Renderer.Pipeline.SetProgram(_vertexPassthroughProgram); _context.Renderer.Pipeline.SetIndexBuffer(indexBuffer, IndexType.UInt); - _context.Renderer.Pipeline.SetStorageBuffers(stackalloc[] { new BufferAssignment(vertexDataBinding, vertexBuffer) }); + _context.Renderer.Pipeline.SetStorageBuffers([new BufferAssignment(vertexDataBinding, vertexBuffer)]); _context.Renderer.Pipeline.SetPrimitiveRestart(true, -1); _context.Renderer.Pipeline.SetPrimitiveTopology(GetGeometryOutputTopology(_geometryAsCompute.Info.GeometryVerticesPerPrimitive)); @@ -314,7 +311,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw BufferRange vertexDataRange = _vacContext.GetVertexDataBufferRange(_vertexDataOffset, _vertexDataSize, write: false); _context.Renderer.Pipeline.SetProgram(_vertexPassthroughProgram); - _context.Renderer.Pipeline.SetStorageBuffers(stackalloc[] { new BufferAssignment(vertexDataBinding, vertexDataRange) }); + _context.Renderer.Pipeline.SetStorageBuffers([new BufferAssignment(vertexDataBinding, vertexDataRange)]); _context.Renderer.Pipeline.Draw(_count, _instanceCount, 0, 0); } } @@ -369,7 +366,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw /// Size of the buffer in bytes private readonly void SetBufferTexture(ResourceReservations reservations, int index, Format format, ulong address, ulong size) { - var memoryManager = _channel.MemoryManager; + MemoryManager memoryManager = _channel.MemoryManager; BufferRange range = memoryManager.Physical.BufferCache.GetBufferRange(memoryManager.GetPhysicalRegions(address, size), BufferStage.VertexBuffer); @@ -410,7 +407,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw indexOffset <<= shift; size <<= shift; - var memoryManager = _channel.MemoryManager; + MemoryManager memoryManager = _channel.MemoryManager; ulong misalign = address & ((ulong)_context.Capabilities.TextureBufferOffsetAlignment - 1); BufferRange range = memoryManager.Physical.BufferCache.GetBufferRange( @@ -478,7 +475,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed.ComputeDraw private readonly ulong GetVertexBufferSize(ulong vbAddress, ulong vbEndAddress, int vbStride, bool indexed, bool instanced, int firstVertex, int vertexCount) { IndexType indexType = _state.State.IndexBufferState.Type; - bool indexTypeSmall = indexType == IndexType.UByte || indexType == IndexType.UShort; + bool indexTypeSmall = indexType is IndexType.UByte or IndexType.UShort; ulong vbSize = vbEndAddress - vbAddress + 1; ulong size; diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ConstantBufferUpdater.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ConstantBufferUpdater.cs index 2095fcd7a..6fc49fc8d 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ConstantBufferUpdater.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ConstantBufferUpdater.cs @@ -1,3 +1,4 @@ +using Ryujinx.Graphics.Gpu.Memory; using System; using System.Runtime.InteropServices; @@ -92,7 +93,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed if (enable) { - var uniformBuffer = _state.State.UniformBufferState; + UniformBufferState uniformBuffer = _state.State.UniformBufferState; ulong address = uniformBuffer.Address.Pack(); @@ -111,7 +112,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed { if (_ubFollowUpAddress != 0) { - var memoryManager = _channel.MemoryManager; + MemoryManager memoryManager = _channel.MemoryManager; Span data = MemoryMarshal.Cast(_ubData.AsSpan(0, (int)(_ubByteCount / 4))); @@ -131,7 +132,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// New uniform buffer data word public void Update(int argument) { - var uniformBuffer = _state.State.UniformBufferState; + UniformBufferState uniformBuffer = _state.State.UniformBufferState; ulong address = uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset; @@ -157,7 +158,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// Data to be written to the uniform buffer public void Update(ReadOnlySpan data) { - var uniformBuffer = _state.State.UniformBufferState; + UniformBufferState uniformBuffer = _state.State.UniformBufferState; ulong address = uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset; diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/DrawManager.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/DrawManager.cs index 56ef64c6e..e3b981f40 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/DrawManager.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/DrawManager.cs @@ -471,7 +471,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed int textureId = _state.State.DrawTextureTextureId; int samplerId = _state.State.DrawTextureSamplerId; - (var texture, var sampler) = _channel.TextureManager.GetGraphicsTextureAndSampler(textureId, samplerId); + (Image.Texture texture, Sampler sampler) = _channel.TextureManager.GetGraphicsTextureAndSampler(textureId, samplerId); srcX0 *= texture.ScaleFactor; srcY0 *= texture.ScaleFactor; @@ -684,8 +684,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed if (hasCount) { - var indirectBuffer = memory.BufferCache.GetBufferRange(indirectBufferRange, BufferStage.Indirect); - var parameterBuffer = memory.BufferCache.GetBufferRange(parameterBufferRange, BufferStage.Indirect); + BufferRange indirectBuffer = memory.BufferCache.GetBufferRange(indirectBufferRange, BufferStage.Indirect); + BufferRange parameterBuffer = memory.BufferCache.GetBufferRange(parameterBufferRange, BufferStage.Indirect); if (indexed) { @@ -698,7 +698,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed } else { - var indirectBuffer = memory.BufferCache.GetBufferRange(indirectBufferRange, BufferStage.Indirect); + BufferRange indirectBuffer = memory.BufferCache.GetBufferRange(indirectBufferRange, BufferStage.Indirect); if (indexed) { @@ -820,7 +820,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed // If there is a mismatch on the host clip region and the one explicitly defined by the guest // on the screen scissor state, then we need to force only one texture to be bound to avoid // host clipping. - var screenScissorState = _state.State.ScreenScissorState; + ScreenScissorState screenScissorState = _state.State.ScreenScissorState; bool clearAffectedByStencilMask = (_state.State.ClearFlags & 1) != 0; bool clearAffectedByScissor = (_state.State.ClearFlags & 0x100) != 0; @@ -833,7 +833,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed if (fullClear && clearAffectedByScissor && _state.State.ScissorState[0].Enable) { - ref var scissorState = ref _state.State.ScissorState[0]; + ref ScissorState scissorState = ref _state.State.ScissorState[0]; fullClear = scissorState.X1 == screenScissorState.X && scissorState.Y1 == screenScissorState.Y && @@ -894,7 +894,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed if (clearAffectedByScissor && _state.State.ScissorState[0].Enable) { - ref var scissorState = ref _state.State.ScissorState[0]; + ref ScissorState scissorState = ref _state.State.ScissorState[0]; scissorX = Math.Max(scissorX, scissorState.X1); scissorY = Math.Max(scissorY, scissorState.Y1); @@ -911,10 +911,10 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed scissorH = (int)MathF.Ceiling(scissorH * scale); } - Span> scissors = stackalloc Rectangle[] - { - new Rectangle(scissorX, scissorY, scissorW, scissorH), - }; + Span> scissors = + [ + new(scissorX, scissorY, scissorW, scissorH) + ]; _context.Renderer.Pipeline.SetScissors(scissors); } @@ -923,7 +923,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed if (componentMask != 0) { - var clearColor = _state.State.ClearColors; + ClearColors clearColor = _state.State.ClearColors; ColorF color = new(clearColor.Red, clearColor.Green, clearColor.Blue, clearColor.Alpha); diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/IndirectDrawType.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/IndirectDrawType.cs index 331b1976b..402e3ff80 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/IndirectDrawType.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/IndirectDrawType.cs @@ -5,7 +5,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// /// Indirect draw type, which can be indexed or non-indexed, with or without a draw count. /// - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum IndirectDrawType { /// diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/SpecializationStateUpdater.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/SpecializationStateUpdater.cs index dbd4efc8f..c76adbca6 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/SpecializationStateUpdater.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/SpecializationStateUpdater.cs @@ -253,9 +253,9 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed { value |= AttributeType.Packed; - if (type == VertexAttribType.Snorm || - type == VertexAttribType.Sint || - type == VertexAttribType.Sscaled) + if (type is VertexAttribType.Snorm or + VertexAttribType.Sint or + VertexAttribType.Sscaled) { value |= AttributeType.PackedRgb10A2Signed; } @@ -288,7 +288,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed { int rtIndex = rtControl.UnpackPermutationIndex(index); - var colorState = state[rtIndex]; + RtColorState colorState = state[rtIndex]; if (index < count && StateUpdater.IsRtEnabled(colorState)) { diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdateTracker.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdateTracker.cs index ea9fc9e31..9383d3a3f 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdateTracker.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdateTracker.cs @@ -1,9 +1,9 @@ -using Ryujinx.Graphics.Device; using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Numerics; +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -58,13 +58,13 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed _registerToGroupMapping = new byte[BlockSize]; _callbacks = new Action[entries.Length]; - var fieldToDelegate = new Dictionary(); + Dictionary fieldToDelegate = new(); for (int entryIndex = 0; entryIndex < entries.Length; entryIndex++) { - var entry = entries[entryIndex]; + StateUpdateCallbackEntry entry = entries[entryIndex]; - foreach (var fieldName in entry.FieldNames) + foreach (string fieldName in entry.FieldNames) { fieldToDelegate.Add(fieldName, entryIndex); } @@ -72,15 +72,15 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed _callbacks[entryIndex] = entry.Callback; } - var fields = typeof(TState).GetFields(); + FieldInfo[] fields = typeof(TState).GetFields(); int offset = 0; for (int fieldIndex = 0; fieldIndex < fields.Length; fieldIndex++) { - var field = fields[fieldIndex]; + FieldInfo field = fields[fieldIndex]; - var currentFieldOffset = (int)Marshal.OffsetOf(field.Name); - var nextFieldOffset = fieldIndex + 1 == fields.Length ? Unsafe.SizeOf() : (int)Marshal.OffsetOf(fields[fieldIndex + 1].Name); + int currentFieldOffset = (int)Marshal.OffsetOf(field.Name); + int nextFieldOffset = fieldIndex + 1 == fields.Length ? Unsafe.SizeOf() : (int)Marshal.OffsetOf(fields[fieldIndex + 1].Name); int sizeOfField = nextFieldOffset - currentFieldOffset; diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs index 1dc77b52d..e6af3fb5e 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs @@ -3,6 +3,7 @@ using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu.Engine.Threed.Blender; using Ryujinx.Graphics.Gpu.Engine.Types; using Ryujinx.Graphics.Gpu.Image; +using Ryujinx.Graphics.Gpu.Memory; using Ryujinx.Graphics.Gpu.Shader; using Ryujinx.Graphics.Shader; using Ryujinx.Graphics.Texture; @@ -90,8 +91,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed // The vertex buffer state may be forced dirty when a indexed draw starts, the "VertexBufferStateIndex" // constant must be updated if modified. // The order of the other state updates doesn't matter. - _updateTracker = new StateUpdateTracker(new[] - { + _updateTracker = new StateUpdateTracker([ new StateUpdateCallbackEntry(UpdateVertexBufferState, nameof(ThreedClassState.VertexBufferDrawState), nameof(ThreedClassState.VertexBufferInstanced), @@ -206,8 +206,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed nameof(ThreedClassState.RtDepthStencilState), nameof(ThreedClassState.RtControl), nameof(ThreedClassState.RtDepthStencilSize), - nameof(ThreedClassState.RtDepthStencilEnable)), - }); + nameof(ThreedClassState.RtDepthStencilEnable)) + ]); } /// @@ -463,8 +463,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// If this is not -1, it indicates that only the given indexed target will be used. public void UpdateRenderTargetState(RenderTargetUpdateFlags updateFlags, int singleUse = -1) { - var memoryManager = _channel.MemoryManager; - var rtControl = _state.State.RtControl; + MemoryManager memoryManager = _channel.MemoryManager; + RtControl rtControl = _state.State.RtControl; bool useControl = updateFlags.HasFlag(RenderTargetUpdateFlags.UseControl); bool layered = updateFlags.HasFlag(RenderTargetUpdateFlags.Layered); @@ -473,12 +473,12 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed int count = useControl ? rtControl.UnpackCount() : Constants.TotalRenderTargets; - var msaaMode = _state.State.RtMsaaMode; + TextureMsaaMode msaaMode = _state.State.RtMsaaMode; int samplesInX = msaaMode.SamplesInX(); int samplesInY = msaaMode.SamplesInY(); - var scissor = _state.State.ScreenScissorState; + ScreenScissorState scissor = _state.State.ScreenScissorState; Size sizeHint = new((scissor.X + scissor.Width) * samplesInX, (scissor.Y + scissor.Height) * samplesInY, 1); int clipRegionWidth = int.MaxValue; @@ -491,7 +491,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed { int rtIndex = useControl ? rtControl.UnpackPermutationIndex(index) : index; - var colorState = _state.State.RtColorState[rtIndex]; + RtColorState colorState = _state.State.RtColorState[rtIndex]; if (index >= count || !IsRtEnabled(colorState) || (singleColor && index != singleUse)) { @@ -541,8 +541,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed if (dsEnable && updateFlags.HasFlag(RenderTargetUpdateFlags.UpdateDepthStencil)) { - var dsState = _state.State.RtDepthStencilState; - var dsSize = _state.State.RtDepthStencilSize; + RtDepthStencilState dsState = _state.State.RtDepthStencilState; + Size3D dsSize = _state.State.RtDepthStencilSize; depthStencil = memoryManager.Physical.TextureCache.FindOrCreateTexture( memoryManager, @@ -643,7 +643,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed if (_state.State.YControl.HasFlag(YControl.NegateY)) { - ref var screenScissor = ref _state.State.ScreenScissorState; + ref ScreenScissorState screenScissor = ref _state.State.ScreenScissorState; y = screenScissor.Height - height - y; if (y < 0) @@ -721,8 +721,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateViewportTransform() { - var yControl = _state.State.YControl; - var face = _state.State.FaceState; + YControl yControl = _state.State.YControl; + FaceState face = _state.State.FaceState; bool disableTransform = _state.State.ViewportTransformEnable == 0; bool yNegate = yControl.HasFlag(YControl.NegateY); @@ -736,17 +736,17 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed { if (disableTransform) { - ref var scissor = ref _state.State.ScreenScissorState; + ref ScreenScissorState scissor = ref _state.State.ScreenScissorState; float rScale = _channel.TextureManager.RenderTargetScale; - var scissorRect = new Rectangle(0, 0, (scissor.X + scissor.Width) * rScale, (scissor.Y + scissor.Height) * rScale); + Rectangle scissorRect = new(0, 0, (scissor.X + scissor.Width) * rScale, (scissor.Y + scissor.Height) * rScale); viewports[index] = new Viewport(scissorRect, ViewportSwizzle.PositiveX, ViewportSwizzle.PositiveY, ViewportSwizzle.PositiveZ, ViewportSwizzle.PositiveW, 0, 1); continue; } - ref var transform = ref _state.State.ViewportTransform[index]; - ref var extents = ref _state.State.ViewportExtents[index]; + ref ViewportTransform transform = ref _state.State.ViewportTransform[index]; + ref ViewportExtents extents = ref _state.State.ViewportExtents[index]; float scaleX = MathF.Abs(transform.ScaleX); float scaleY = transform.ScaleY; @@ -841,7 +841,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateDepthBiasState() { - var depthBias = _state.State.DepthBiasState; + DepthBiasState depthBias = _state.State.DepthBiasState; float factor = _state.State.DepthBiasFactor; float units = _state.State.DepthBiasUnits; @@ -862,9 +862,9 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateStencilTestState() { - var backMasks = _state.State.StencilBackMasks; - var test = _state.State.StencilTestState; - var backTest = _state.State.StencilBackTestState; + StencilBackMasks backMasks = _state.State.StencilBackMasks; + StencilTestState test = _state.State.StencilTestState; + StencilBackTestState backTest = _state.State.StencilBackTestState; CompareOp backFunc; StencilOp backSFail; @@ -934,10 +934,10 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateSamplerPoolState() { - var texturePool = _state.State.TexturePoolState; - var samplerPool = _state.State.SamplerPoolState; + PoolState texturePool = _state.State.TexturePoolState; + PoolState samplerPool = _state.State.SamplerPoolState; - var samplerIndex = _state.State.SamplerIndex; + SamplerIndex samplerIndex = _state.State.SamplerIndex; int maximumId = samplerIndex == SamplerIndex.ViaHeaderIndex ? texturePool.MaximumId @@ -951,7 +951,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateTexturePoolState() { - var texturePool = _state.State.TexturePoolState; + PoolState texturePool = _state.State.TexturePoolState; _channel.TextureManager.SetGraphicsTexturePool(texturePool.Address.Pack(), texturePool.MaximumId); _channel.TextureManager.SetGraphicsTextureBufferIndex((int)_state.State.TextureBufferIndex); @@ -971,7 +971,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed for (int index = 0; index < Constants.TotalVertexAttribs; index++) { - var vertexAttrib = _state.State.VertexAttribState[index]; + VertexAttribState vertexAttrib = _state.State.VertexAttribState[index]; int bufferIndex = vertexAttrib.UnpackBufferIndex(); @@ -1065,7 +1065,14 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateIndexBufferState() { - var indexBuffer = _state.State.IndexBufferState; + IndexBufferState? indexBufferNullable = _state?.State.IndexBufferState; + + if (!indexBufferNullable.HasValue) + { + return; + } + + IndexBufferState indexBuffer = indexBufferNullable.Value; if (_drawState.IndexCount == 0) { @@ -1097,7 +1104,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed private void UpdateVertexBufferState() { IndexType indexType = _state.State.IndexBufferState.Type; - bool indexTypeSmall = indexType == IndexType.UByte || indexType == IndexType.UShort; + bool indexTypeSmall = indexType is IndexType.UByte or IndexType.UShort; _drawState.IsAnyVbInstanced = false; @@ -1109,7 +1116,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed for (int index = 0; index < Constants.TotalVertexBuffers; index++) { - var vertexBuffer = _state.State.VertexBufferState[index]; + VertexBufferState vertexBuffer = _state.State.VertexBufferState[index]; if (!vertexBuffer.UnpackEnable()) { @@ -1193,8 +1200,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateFaceState() { - var yControl = _state.State.YControl; - var face = _state.State.FaceState; + YControl yControl = _state.State.YControl; + FaceState face = _state.State.FaceState; _pipeline.CullEnable = face.CullEnable; _pipeline.CullMode = face.CullFace; @@ -1233,7 +1240,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed for (int index = 0; index < Constants.TotalRenderTargets; index++) { - var colorMask = _state.State.RtColorMask[rtColorMaskShared ? 0 : index]; + RtColorMask colorMask = _state.State.RtColorMask[rtColorMaskShared ? 0 : index]; uint componentMask; @@ -1256,7 +1263,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed { if (_state.State.BlendUcodeEnable != BlendUcodeEnable.Disabled) { - if (_context.Capabilities.SupportsBlendEquationAdvanced && _blendManager.TryGetAdvancedBlend(out var blendDescriptor)) + if (_context.Capabilities.SupportsBlendEquationAdvanced && _blendManager.TryGetAdvancedBlend(out AdvancedBlendDescriptor blendDescriptor)) { // Try to HLE it using advanced blend on the host if we can. _context.Renderer.Pipeline.SetBlendState(blendDescriptor); @@ -1278,9 +1285,9 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed for (int index = 0; index < Constants.TotalRenderTargets; index++) { bool enable = _state.State.BlendEnable[index]; - var blend = _state.State.BlendState[index]; + BlendState blend = _state.State.BlendState[index]; - var descriptor = new BlendDescriptor( + BlendDescriptor descriptor = new( enable, blendConstant, blend.ColorOp, @@ -1306,9 +1313,9 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed else { bool enable = _state.State.BlendEnable[0]; - var blend = _state.State.BlendStateCommon; + BlendStateCommon blend = _state.State.BlendStateCommon; - var descriptor = new BlendDescriptor( + BlendDescriptor descriptor = new( enable, blendConstant, blend.ColorOp, @@ -1409,7 +1416,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateShaderState() { - var shaderCache = _channel.MemoryManager.Physical.ShaderCache; + ShaderCache shaderCache = _channel.MemoryManager.Physical.ShaderCache; _vtgWritesRtLayer = false; @@ -1420,7 +1427,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed for (int index = 0; index < 6; index++) { - var shader = _state.State.ShaderState[index]; + ShaderState shader = _state.State.ShaderState[index]; if (!shader.UnpackEnable() && index != 1) { continue; @@ -1525,7 +1532,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateSupportBufferViewportSize() { - ref var transform = ref _state.State.ViewportTransform[0]; + ref ViewportTransform transform = ref _state.State.ViewportTransform[0]; float scaleX = MathF.Abs(transform.ScaleX); float scaleY = transform.ScaleY; @@ -1564,8 +1571,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// Current depth mode private DepthMode GetDepthMode() { - ref var transform = ref _state.State.ViewportTransform[0]; - ref var extents = ref _state.State.ViewportExtents[0]; + ref ViewportTransform transform = ref _state.State.ViewportTransform[0]; + ref ViewportExtents extents = ref _state.State.ViewportExtents[0]; DepthMode depthMode; diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ThreedClass.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ThreedClass.cs index ab1d27a1c..a96979cb2 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/ThreedClass.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/ThreedClass.cs @@ -82,8 +82,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed _i2mClass = new InlineToMemoryClass(context, channel, initializeState: false); - var spec = new SpecializationStateUpdater(context); - var drawState = new DrawState(); + SpecializationStateUpdater spec = new(context); + DrawState drawState = new(); _drawManager = new DrawManager(context, channel, _state, drawState, spec); _blendManager = new AdvancedBlendManager(_state); @@ -253,8 +253,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed } else { - ref var lhsVec = ref Unsafe.As>(ref lhs); - ref var rhsVec = ref Unsafe.As>(ref rhs); + ref Vector128 lhsVec = ref Unsafe.As>(ref lhs); + ref Vector128 rhsVec = ref Unsafe.As>(ref rhs); return Vector128.EqualsAll(lhsVec, rhsVec) && Vector128.EqualsAll(Unsafe.Add(ref lhsVec, 1), Unsafe.Add(ref rhsVec, 1)); @@ -267,8 +267,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// Blend enable public void UpdateBlendEnable(ref Array8 enable) { - var shadow = ShadowMode; - ref var state = ref _state.State.BlendEnable; + SetMmeShadowRamControlMode shadow = ShadowMode; + ref Array8 state = ref _state.State.BlendEnable; if (shadow.IsReplay()) { @@ -294,8 +294,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// Color masks public void UpdateColorMasks(ref Array8 masks) { - var shadow = ShadowMode; - ref var state = ref _state.State.RtColorMask; + SetMmeShadowRamControlMode shadow = ShadowMode; + ref Array8 state = ref _state.State.RtColorMask; if (shadow.IsReplay()) { @@ -323,12 +323,12 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// Type of the binding public void UpdateIndexBuffer(uint addrHigh, uint addrLow, IndexType type) { - var shadow = ShadowMode; - ref var state = ref _state.State.IndexBufferState; + SetMmeShadowRamControlMode shadow = ShadowMode; + ref IndexBufferState state = ref _state.State.IndexBufferState; if (shadow.IsReplay()) { - ref var shadowState = ref _state.ShadowState.IndexBufferState; + ref IndexBufferState shadowState = ref _state.ShadowState.IndexBufferState; addrHigh = shadowState.Address.High; addrLow = shadowState.Address.Low; type = shadowState.Type; @@ -345,7 +345,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed if (shadow.IsTrack()) { - ref var shadowState = ref _state.ShadowState.IndexBufferState; + ref IndexBufferState shadowState = ref _state.ShadowState.IndexBufferState; shadowState.Address.High = addrHigh; shadowState.Address.Low = addrLow; shadowState.Type = type; @@ -360,12 +360,12 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// Low part of the address public void UpdateUniformBufferState(int size, uint addrHigh, uint addrLow) { - var shadow = ShadowMode; - ref var state = ref _state.State.UniformBufferState; + SetMmeShadowRamControlMode shadow = ShadowMode; + ref UniformBufferState state = ref _state.State.UniformBufferState; if (shadow.IsReplay()) { - ref var shadowState = ref _state.ShadowState.UniformBufferState; + ref UniformBufferState shadowState = ref _state.ShadowState.UniformBufferState; size = shadowState.Size; addrHigh = shadowState.Address.High; addrLow = shadowState.Address.Low; @@ -377,7 +377,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed if (shadow.IsTrack()) { - ref var shadowState = ref _state.ShadowState.UniformBufferState; + ref UniformBufferState shadowState = ref _state.ShadowState.UniformBufferState; shadowState.Size = size; shadowState.Address.High = addrHigh; shadowState.Address.Low = addrLow; @@ -391,8 +391,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// Offset to update with public void SetShaderOffset(int index, uint offset) { - var shadow = ShadowMode; - ref var shaderState = ref _state.State.ShaderState[index]; + SetMmeShadowRamControlMode shadow = ShadowMode; + ref ShaderState shaderState = ref _state.State.ShaderState[index]; if (shadow.IsReplay()) { @@ -418,8 +418,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// Uniform buffer state public void UpdateUniformBufferState(UniformBufferState ubState) { - var shadow = ShadowMode; - ref var state = ref _state.State.UniformBufferState; + SetMmeShadowRamControlMode shadow = ShadowMode; + ref UniformBufferState state = ref _state.State.UniformBufferState; if (shadow.IsReplay()) { diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Twod/TwodClass.cs b/src/Ryujinx.Graphics.Gpu/Engine/Twod/TwodClass.cs index 0dd9481df..5ab58d7d1 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Twod/TwodClass.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Twod/TwodClass.cs @@ -3,6 +3,7 @@ using Ryujinx.Graphics.Device; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu.Engine.Types; using Ryujinx.Graphics.Gpu.Image; +using Ryujinx.Graphics.Gpu.Memory; using Ryujinx.Graphics.Texture; using Ryujinx.Memory; using System; @@ -123,7 +124,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Twod /// Bytes per pixel private void UnscaledFullCopy(TwodTexture src, TwodTexture dst, int w, int h, int bpp) { - var srcCalculator = new OffsetCalculator( + OffsetCalculator srcCalculator = new( w, h, src.Stride, @@ -134,7 +135,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Twod (int _, int srcSize) = srcCalculator.GetRectangleRange(0, 0, w, h); - var memoryManager = _channel.MemoryManager; + MemoryManager memoryManager = _channel.MemoryManager; ulong srcGpuVa = src.Address.Pack(); ulong dstGpuVa = dst.Address.Pack(); @@ -228,10 +229,10 @@ namespace Ryujinx.Graphics.Gpu.Engine.Twod /// Method call argument private void PixelsFromMemorySrcY0Int(int argument) { - var memoryManager = _channel.MemoryManager; + MemoryManager memoryManager = _channel.MemoryManager; - var dstCopyTexture = Unsafe.As(ref _state.State.SetDstFormat); - var srcCopyTexture = Unsafe.As(ref _state.State.SetSrcFormat); + TwodTexture dstCopyTexture = Unsafe.As(ref _state.State.SetDstFormat); + TwodTexture srcCopyTexture = Unsafe.As(ref _state.State.SetSrcFormat); long srcX = ((long)_state.State.SetPixelsFromMemorySrcX0Int << 32) | (long)(ulong)_state.State.SetPixelsFromMemorySrcX0Frac; long srcY = ((long)_state.State.PixelsFromMemorySrcY0Int << 32) | (long)(ulong)_state.State.SetPixelsFromMemorySrcY0Frac; @@ -268,10 +269,10 @@ namespace Ryujinx.Graphics.Gpu.Engine.Twod // The source and destination textures should at least be as big as the region being requested. // The hints will only resize within alignment constraints, so out of bound copies won't resize in most cases. - var srcHint = new Size(srcX2, srcY2, 1); - var dstHint = new Size(dstX2, dstY2, 1); + Size srcHint = new(srcX2, srcY2, 1); + Size dstHint = new(dstX2, dstY2, 1); - var srcCopyTextureFormat = srcCopyTexture.Format.Convert(); + FormatInfo srcCopyTextureFormat = srcCopyTexture.Format.Convert(); int srcWidthAligned = srcCopyTexture.Stride / srcCopyTextureFormat.BytesPerPixel; @@ -304,7 +305,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Twod // are the same, as we can't blit between different depth formats. bool srcDepthAlias = srcCopyTexture.Format == dstCopyTexture.Format; - var srcTexture = memoryManager.Physical.TextureCache.FindOrCreateTexture( + Image.Texture srcTexture = memoryManager.Physical.TextureCache.FindOrCreateTexture( memoryManager, srcCopyTexture, offset, @@ -341,7 +342,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Twod dstCopyTextureFormat = dstCopyTexture.Format.Convert(); } - var dstTexture = memoryManager.Physical.TextureCache.FindOrCreateTexture( + Image.Texture dstTexture = memoryManager.Physical.TextureCache.FindOrCreateTexture( memoryManager, dstCopyTexture, 0, diff --git a/src/Ryujinx.Graphics.Gpu/GpuChannel.cs b/src/Ryujinx.Graphics.Gpu/GpuChannel.cs index 33618a15b..047cbcca6 100644 --- a/src/Ryujinx.Graphics.Gpu/GpuChannel.cs +++ b/src/Ryujinx.Graphics.Gpu/GpuChannel.cs @@ -57,7 +57,7 @@ namespace Ryujinx.Graphics.Gpu /// The new memory manager to be bound public void BindMemory(MemoryManager memoryManager) { - var oldMemoryManager = Interlocked.Exchange(ref _memoryManager, memoryManager ?? throw new ArgumentNullException(nameof(memoryManager))); + MemoryManager oldMemoryManager = Interlocked.Exchange(ref _memoryManager, memoryManager ?? throw new ArgumentNullException(nameof(memoryManager))); memoryManager.Physical.IncrementReferenceCount(); @@ -85,7 +85,7 @@ namespace Ryujinx.Graphics.Gpu { TextureManager.ReloadPools(); - var memoryManager = Volatile.Read(ref _memoryManager); + MemoryManager memoryManager = Volatile.Read(ref _memoryManager); memoryManager?.Physical.BufferCache.QueuePrune(); } @@ -138,7 +138,7 @@ namespace Ryujinx.Graphics.Gpu _processor.Dispose(); TextureManager.Dispose(); - var oldMemoryManager = Interlocked.Exchange(ref _memoryManager, null); + MemoryManager oldMemoryManager = Interlocked.Exchange(ref _memoryManager, null); if (oldMemoryManager != null) { oldMemoryManager.Physical.BufferCache.NotifyBuffersModified -= BufferManager.Rebind; diff --git a/src/Ryujinx.Graphics.Gpu/GpuContext.cs b/src/Ryujinx.Graphics.Gpu/GpuContext.cs index fb529e914..d0b8277da 100644 --- a/src/Ryujinx.Graphics.Gpu/GpuContext.cs +++ b/src/Ryujinx.Graphics.Gpu/GpuContext.cs @@ -1,4 +1,5 @@ using Ryujinx.Common; +using Ryujinx.Common.Configuration; using Ryujinx.Graphics.Device; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu.Engine.GPFifo; @@ -91,6 +92,13 @@ namespace Ryujinx.Graphics.Gpu /// internal SupportBufferUpdater SupportBufferUpdater { get; } + /// + /// Enabled dirty hacks. + /// Used for workarounds to emulator bugs we can't fix/don't know how to fix yet. + /// + internal DirtyHacks DirtyHacks { get; } + + /// /// Host hardware capabilities. /// @@ -113,7 +121,7 @@ namespace Ryujinx.Graphics.Gpu /// Creates a new instance of the GPU emulation context. /// /// Host renderer - public GpuContext(IRenderer renderer) + public GpuContext(IRenderer renderer, DirtyHacks hacks) { Renderer = renderer; @@ -126,9 +134,9 @@ namespace Ryujinx.Graphics.Gpu HostInitalized = new ManualResetEvent(false); _gpuReadyEvent = new ManualResetEvent(false); - SyncActions = new List(); - SyncpointActions = new List(); - BufferMigrations = new List(); + SyncActions = []; + SyncpointActions = []; + BufferMigrations = []; DeferredActions = new Queue(); @@ -136,6 +144,8 @@ namespace Ryujinx.Graphics.Gpu SupportBufferUpdater = new SupportBufferUpdater(renderer); + DirtyHacks = hacks; + _firstTimestamp = ConvertNanosecondsToTicks((ulong)PerformanceCounter.ElapsedNanoseconds); } @@ -157,7 +167,7 @@ namespace Ryujinx.Graphics.Gpu /// Thrown when is invalid public MemoryManager CreateMemoryManager(ulong pid, ulong cpuMemorySize) { - if (!PhysicalMemoryRegistry.TryGetValue(pid, out var physicalMemory)) + if (!PhysicalMemoryRegistry.TryGetValue(pid, out PhysicalMemory physicalMemory)) { throw new ArgumentException("The PID is invalid or the process was not registered", nameof(pid)); } @@ -173,7 +183,7 @@ namespace Ryujinx.Graphics.Gpu /// Thrown when is invalid public DeviceMemoryManager CreateDeviceMemoryManager(ulong pid) { - if (!PhysicalMemoryRegistry.TryGetValue(pid, out var physicalMemory)) + if (!PhysicalMemoryRegistry.TryGetValue(pid, out PhysicalMemory physicalMemory)) { throw new ArgumentException("The PID is invalid or the process was not registered", nameof(pid)); } @@ -189,7 +199,7 @@ namespace Ryujinx.Graphics.Gpu /// Thrown if was already registered public void RegisterProcess(ulong pid, Cpu.IVirtualMemoryManagerTracked cpuMemory) { - var physicalMemory = new PhysicalMemory(this, cpuMemory); + PhysicalMemory physicalMemory = new(this, cpuMemory); if (!PhysicalMemoryRegistry.TryAdd(pid, physicalMemory)) { throw new ArgumentException("The PID was already registered", nameof(pid)); @@ -204,7 +214,7 @@ namespace Ryujinx.Graphics.Gpu /// ID of the process public void UnregisterProcess(ulong pid) { - if (PhysicalMemoryRegistry.TryRemove(pid, out var physicalMemory)) + if (PhysicalMemoryRegistry.TryRemove(pid, out PhysicalMemory physicalMemory)) { physicalMemory.ShaderCache.ShaderCacheStateChanged -= ShaderCacheStateUpdate; physicalMemory.Dispose(); @@ -279,7 +289,7 @@ namespace Ryujinx.Graphics.Gpu { HostInitalized.WaitOne(); - foreach (var physicalMemory in PhysicalMemoryRegistry.Values) + foreach (PhysicalMemory physicalMemory in PhysicalMemoryRegistry.Values) { physicalMemory.ShaderCache.Initialize(cancellationToken); } @@ -319,7 +329,7 @@ namespace Ryujinx.Graphics.Gpu /// public void ProcessShaderCacheQueue() { - foreach (var physicalMemory in PhysicalMemoryRegistry.Values) + foreach (PhysicalMemory physicalMemory in PhysicalMemoryRegistry.Values) { physicalMemory.ShaderCache.ProcessShaderCacheQueue(); } @@ -394,12 +404,12 @@ namespace Ryujinx.Graphics.Gpu if (force || _pendingSync || (syncpoint && SyncpointActions.Count > 0)) { - foreach (var action in SyncActions) + foreach (ISyncActionHandler action in SyncActions) { action.SyncPreAction(syncpoint); } - foreach (var action in SyncpointActions) + foreach (ISyncActionHandler action in SyncpointActions) { action.SyncPreAction(syncpoint); } @@ -440,7 +450,7 @@ namespace Ryujinx.Graphics.Gpu _gpuReadyEvent.Dispose(); // Has to be disposed before processing deferred actions, as it will produce some. - foreach (var physicalMemory in PhysicalMemoryRegistry.Values) + foreach (PhysicalMemory physicalMemory in PhysicalMemoryRegistry.Values) { physicalMemory.Dispose(); } diff --git a/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs b/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs index fbb7399ca..715a4d92b 100644 --- a/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs +++ b/src/Ryujinx.Graphics.Gpu/GraphicsConfig.cs @@ -1,6 +1,5 @@ namespace Ryujinx.Graphics.Gpu { -#pragma warning disable CA2211 // Non-constant fields should not be visible /// /// General GPU and graphics configuration. /// @@ -9,25 +8,25 @@ namespace Ryujinx.Graphics.Gpu /// /// Resolution scale. /// - public static float ResScale = 1f; + public static float ResScale { get; set; } = 1f; /// /// Max Anisotropy. Values range from 0 - 16. Set to -1 to let the game decide. /// - public static float MaxAnisotropy = -1; + public static float MaxAnisotropy { get; set; } = -1; /// /// Base directory used to write shader code dumps. /// Set to null to disable code dumping. /// - public static string ShadersDumpPath; + public static string ShadersDumpPath { get; set; } /// /// Fast GPU time calculates the internal GPU time ticks as if the GPU was capable of /// processing commands almost instantly, instead of using the host timer. /// This can avoid lower resolution on some games when GPU performance is poor. /// - public static bool FastGpuTime = true; + public static bool FastGpuTime { get; set; } = true; /// /// Enables or disables fast 2d engine texture copies entirely on CPU when possible. @@ -35,43 +34,42 @@ namespace Ryujinx.Graphics.Gpu /// as textures will not need to be created for the copy, and the data does not need to be /// flushed from GPU. /// - public static bool Fast2DCopy = true; + public static bool Fast2DCopy { get; set; } = true; /// /// Enables or disables the Just-in-Time compiler for GPU Macro code. /// - public static bool EnableMacroJit = true; + public static bool EnableMacroJit { get; set; } = true; /// /// Enables or disables high-level emulation of common GPU Macro code. /// - public static bool EnableMacroHLE = true; + public static bool EnableMacroHLE { get; set; } = true; /// /// Title id of the current running game. /// Used by the shader cache. /// - public static string TitleId; + public static string TitleId { get; set; } /// /// Enables or disables the shader cache. /// - public static bool EnableShaderCache; + public static bool EnableShaderCache { get; set; } /// /// Enables or disables shader SPIR-V compilation. /// - public static bool EnableSpirvCompilationOnVulkan = true; + public static bool EnableSpirvCompilationOnVulkan { get; set; } = true; /// /// Enables or disables recompression of compressed textures that are not natively supported by the host. /// - public static bool EnableTextureRecompression = false; + public static bool EnableTextureRecompression { get; set; } = false; /// /// Enables or disables color space passthrough, if available. /// - public static bool EnableColorSpacePassthrough = false; + public static bool EnableColorSpacePassthrough { get; set; } = false; } -#pragma warning restore CA2211 } diff --git a/src/Ryujinx.Graphics.Gpu/Image/AutoDeleteCache.cs b/src/Ryujinx.Graphics.Gpu/Image/AutoDeleteCache.cs index 74967b190..99b34112f 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/AutoDeleteCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/AutoDeleteCache.cs @@ -56,7 +56,6 @@ namespace Ryujinx.Graphics.Gpu.Image private const ulong TextureSizeCapacity8GiB = 6 * GiB; private const ulong TextureSizeCapacity12GiB = 12 * GiB; - private const float MemoryScaleFactor = 0.50f; private ulong _maxCacheMemoryUsage = DefaultTextureSizeCapacity; @@ -80,7 +79,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// The amount of physical CPU Memory Avaiable on the device. public void Initialize(GpuContext context, ulong cpuMemorySize) { - var cpuMemorySizeGiB = cpuMemorySize / GiB; + ulong cpuMemorySizeGiB = cpuMemorySize / GiB; if (cpuMemorySizeGiB < 6 || context.Capabilities.MaximumGpuMemory == 0) { @@ -100,7 +99,7 @@ namespace Ryujinx.Graphics.Gpu.Image MaxTextureSizeCapacity = TextureSizeCapacity12GiB; } - var cacheMemory = (ulong)(context.Capabilities.MaximumGpuMemory * MemoryScaleFactor); + ulong cacheMemory = (ulong)(context.Capabilities.MaximumGpuMemory * MemoryScaleFactor); _maxCacheMemoryUsage = Math.Clamp(cacheMemory, MinTextureSizeCapacity, MaxTextureSizeCapacity); @@ -112,10 +111,10 @@ namespace Ryujinx.Graphics.Gpu.Image /// public AutoDeleteCache() { - _textures = new LinkedList(); + _textures = []; - _shortCacheBuilder = new HashSet(); - _shortCache = new HashSet(); + _shortCacheBuilder = []; + _shortCache = []; _shortCacheLookup = new Dictionary(); } @@ -232,7 +231,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// The texture if found, null otherwise public Texture FindShortCache(in TextureDescriptor descriptor) { - if (_shortCacheLookup.Count > 0 && _shortCacheLookup.TryGetValue(descriptor, out var entry)) + if (_shortCacheLookup.Count > 0 && _shortCacheLookup.TryGetValue(descriptor, out ShortTextureCacheEntry entry)) { if (entry.InvalidatedSequence == entry.Texture.InvalidatedSequence) { @@ -277,7 +276,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// Last used texture descriptor public void AddShortCache(Texture texture, ref TextureDescriptor descriptor) { - var entry = new ShortTextureCacheEntry(descriptor, texture); + ShortTextureCacheEntry entry = new(descriptor, texture); _shortCacheBuilder.Add(entry); _shortCacheLookup.Add(entry.Descriptor, entry); @@ -296,7 +295,7 @@ namespace Ryujinx.Graphics.Gpu.Image { if (texture.ShortCacheEntry != null) { - var entry = new ShortTextureCacheEntry(texture); + ShortTextureCacheEntry entry = new(texture); _shortCacheBuilder.Add(entry); @@ -314,7 +313,7 @@ namespace Ryujinx.Graphics.Gpu.Image { HashSet toRemove = _shortCache; - foreach (var entry in toRemove) + foreach (ShortTextureCacheEntry entry in toRemove) { entry.Texture.DecrementReferenceCount(); diff --git a/src/Ryujinx.Graphics.Gpu/Image/FormatTable.cs b/src/Ryujinx.Graphics.Gpu/Image/FormatTable.cs index da9e5c3a9..ee217714c 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/FormatTable.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/FormatTable.cs @@ -10,7 +10,6 @@ namespace Ryujinx.Graphics.Gpu.Image static class FormatTable { #pragma warning disable IDE0055 // Disable formatting - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] private enum TextureFormat : uint { // Formats @@ -249,7 +248,6 @@ namespace Ryujinx.Graphics.Gpu.Image A5B5G5R1Unorm = A5B5G5R1 | RUnorm | GUnorm | BUnorm | AUnorm, // 0x24913 } - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] private enum VertexAttributeFormat : uint { // Width @@ -704,7 +702,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// True if the format is valid, false otherwise public static bool TryGetSingleComponentAttribFormat(uint encoded, out Format format, out int componentsCount) { - bool result = _singleComponentAttribFormats.TryGetValue((VertexAttributeFormat)encoded, out var tuple); + bool result = _singleComponentAttribFormats.TryGetValue((VertexAttributeFormat)encoded, out (Format, int) tuple); format = tuple.Item1; componentsCount = tuple.Item2; diff --git a/src/Ryujinx.Graphics.Gpu/Image/Pool.cs b/src/Ryujinx.Graphics.Gpu/Image/Pool.cs index e12fedc74..3cc65a92b 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/Pool.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/Pool.cs @@ -248,6 +248,7 @@ namespace Ryujinx.Graphics.Gpu.Image Items = null; } + _memoryTracking.Dispose(); } } diff --git a/src/Ryujinx.Graphics.Gpu/Image/PoolCache.cs b/src/Ryujinx.Graphics.Gpu/Image/PoolCache.cs index 50872ab63..b9aa37fed 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/PoolCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/PoolCache.cs @@ -45,7 +45,7 @@ namespace Ryujinx.Graphics.Gpu.Image public PoolCache(GpuContext context) { _context = context; - _pools = new LinkedList(); + _pools = []; } /// diff --git a/src/Ryujinx.Graphics.Gpu/Image/SamplerDescriptor.cs b/src/Ryujinx.Graphics.Gpu/Image/SamplerDescriptor.cs index 836a3260c..cd97d68dd 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/SamplerDescriptor.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/SamplerDescriptor.cs @@ -10,8 +10,8 @@ namespace Ryujinx.Graphics.Gpu.Image /// struct SamplerDescriptor { - private static readonly float[] _f5ToF32ConversionLut = new float[] - { + private static readonly float[] _f5ToF32ConversionLut = + [ 0.0f, 0.055555556f, 0.1f, @@ -43,13 +43,13 @@ namespace Ryujinx.Graphics.Gpu.Image 0.45833334f, 0.46153846f, 0.4642857f, - 0.46666667f, - }; + 0.46666667f + ]; - private static readonly float[] _maxAnisotropyLut = new float[] - { - 1, 2, 4, 6, 8, 10, 12, 16, - }; + private static readonly float[] _maxAnisotropyLut = + [ + 1, 2, 4, 6, 8, 10, 12, 16 + ]; private const float Frac8ToF32 = 1.0f / 256.0f; @@ -175,6 +175,7 @@ namespace Ryujinx.Graphics.Gpu.Image case SamplerMinFilter.Linear: return MinFilter.Linear; } + break; case SamplerMipFilter.Nearest: @@ -185,6 +186,7 @@ namespace Ryujinx.Graphics.Gpu.Image case SamplerMinFilter.Linear: return MinFilter.LinearMipmapNearest; } + break; case SamplerMipFilter.Linear: @@ -195,6 +197,7 @@ namespace Ryujinx.Graphics.Gpu.Image case SamplerMinFilter.Linear: return MinFilter.LinearMipmapLinear; } + break; } diff --git a/src/Ryujinx.Graphics.Gpu/Image/Texture.cs b/src/Ryujinx.Graphics.Gpu/Image/Texture.cs index 7ee2e5cf0..9540df548 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/Texture.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/Texture.cs @@ -260,8 +260,8 @@ namespace Ryujinx.Graphics.Gpu.Image _viewStorage = this; - _views = new List(); - _poolOwners = new List(); + _views = []; + _poolOwners = []; } /// @@ -536,7 +536,7 @@ namespace Ryujinx.Graphics.Gpu.Image // All views must be recreated against the new storage. - foreach (var view in _views) + foreach (Texture view in _views) { Logger.Debug?.Print(LogClass.Gpu, $" Recreating view {Info.Width}x{Info.Height} {Info.FormatInfo.Format}."); view.ScaleFactor = scale; @@ -553,7 +553,7 @@ namespace Ryujinx.Graphics.Gpu.Image { ScaleMode = newScaleMode; - foreach (var view in _views) + foreach (Texture view in _views) { view.ScaleMode = newScaleMode; } @@ -899,7 +899,7 @@ namespace Ryujinx.Graphics.Gpu.Image { using (result) { - var converted = PixelConverter.ConvertR4G4ToR4G4B4A4(result.Span, width); + MemoryOwner converted = PixelConverter.ConvertR4G4ToR4G4B4A4(result.Span, width); if (_context.Capabilities.SupportsR4G4B4A4Format) { @@ -1355,7 +1355,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// True if anisotropic filtering can be forced, false otherwise private bool CanTextureForceAnisotropy() { - if (!(Target == Target.Texture2D || Target == Target.Texture2DArray)) + if (Target is not (Target.Texture2D or Target.Texture2DArray)) { return false; } @@ -1379,16 +1379,16 @@ namespace Ryujinx.Graphics.Gpu.Image { case Target.Texture1D: case Target.Texture1DArray: - return target == Target.Texture1D || target == Target.Texture1DArray; + return target is Target.Texture1D or Target.Texture1DArray; case Target.Texture2D: case Target.Texture2DArray: - return target == Target.Texture2D || target == Target.Texture2DArray; + return target is Target.Texture2D or Target.Texture2DArray; case Target.Cubemap: case Target.CubemapArray: - return target == Target.Cubemap || target == Target.CubemapArray; + return target is Target.Cubemap or Target.CubemapArray; case Target.Texture2DMultisample: case Target.Texture2DMultisampleArray: - return target == Target.Texture2DMultisample || target == Target.Texture2DMultisampleArray; + return target is Target.Texture2DMultisample or Target.Texture2DMultisampleArray; case Target.Texture3D: return target == Target.Texture3D; default: @@ -1650,7 +1650,7 @@ namespace Ryujinx.Graphics.Gpu.Image { lock (_poolOwners) { - foreach (var owner in _poolOwners) + foreach (TexturePoolOwner owner in _poolOwners) { owner.Pool.ForceRemove(this, owner.ID, deferred); } @@ -1680,7 +1680,7 @@ namespace Ryujinx.Graphics.Gpu.Image { ulong address = 0; - foreach (var owner in _poolOwners) + foreach (TexturePoolOwner owner in _poolOwners) { if (address == 0 || address == owner.GpuAddress) { diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs index 72bac75e5..fc3b64c03 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs @@ -4,7 +4,6 @@ using Ryujinx.Graphics.Gpu.Memory; using Ryujinx.Graphics.Shader; using System; using System.Collections.Generic; -using System.Linq; using System.Runtime.InteropServices; namespace Ryujinx.Graphics.Gpu.Image @@ -549,7 +548,7 @@ namespace Ryujinx.Graphics.Gpu.Image _channel = channel; _cacheFromBuffer = new Dictionary(); _cacheFromPool = new Dictionary(); - _lruCache = new LinkedList(); + _lruCache = []; } /// @@ -992,7 +991,7 @@ namespace Ryujinx.Graphics.Gpu.Image bool isImage, out bool isNew) { - CacheEntryFromPoolKey key = new CacheEntryFromPoolKey(isImage, bindingInfo, texturePool, samplerPool); + CacheEntryFromPoolKey key = new(isImage, bindingInfo, texturePool, samplerPool); isNew = !_cacheFromPool.TryGetValue(key, out CacheEntry entry); @@ -1035,7 +1034,7 @@ namespace Ryujinx.Graphics.Gpu.Image ref BufferBounds textureBufferBounds, out bool isNew) { - CacheEntryFromBufferKey key = new CacheEntryFromBufferKey( + CacheEntryFromBufferKey key = new( isImage, bindingInfo, texturePool, @@ -1116,7 +1115,7 @@ namespace Ryujinx.Graphics.Gpu.Image { if (key.MatchesPool(pool)) { - (keysToRemove ??= new()).Add(key); + (keysToRemove ??= []).Add(key); if (key.IsImage) { diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs index f96ddfb1b..35f099c67 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs @@ -103,11 +103,11 @@ namespace Ryujinx.Graphics.Gpu.Image for (int stage = 0; stage < stages; stage++) { - _textureBindings[stage] = Array.Empty(); - _imageBindings[stage] = Array.Empty(); + _textureBindings[stage] = []; + _imageBindings[stage] = []; } - _textureCounts = Array.Empty(); + _textureCounts = []; } /// @@ -784,8 +784,8 @@ namespace Ryujinx.Graphics.Gpu.Image samplerHandle = samplerWordOffset; } - if (handleType == TextureHandleType.SeparateSamplerId || - handleType == TextureHandleType.SeparateConstantSamplerHandle) + if (handleType is TextureHandleType.SeparateSamplerId or + TextureHandleType.SeparateConstantSamplerHandle) { samplerHandle <<= 20; } diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs index 2cfd9af5b..f3df8b072 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/TextureCache.cs @@ -8,6 +8,7 @@ using Ryujinx.Graphics.Texture; using Ryujinx.Memory.Range; using System; using System.Collections.Generic; +using System.Linq; using System.Threading; namespace Ryujinx.Graphics.Gpu.Image @@ -57,15 +58,15 @@ namespace Ryujinx.Graphics.Gpu.Image _context = context; _physicalMemory = physicalMemory; - _textures = new MultiRangeList(); - _partiallyMappedTextures = new HashSet(); + _textures = []; + _partiallyMappedTextures = []; _texturesLock = new ReaderWriterLockSlim(); _textureOverlaps = new Texture[OverlapsBufferInitialCapacity]; _overlapInfo = new OverlapInfo[OverlapsBufferInitialCapacity]; - _cache = new AutoDeleteCache(); + _cache = []; } /// @@ -127,7 +128,7 @@ namespace Ryujinx.Graphics.Gpu.Image // Any texture that has been unmapped at any point or is partially unmapped // should update their pool references after the remap completes. - foreach (var texture in _partiallyMappedTextures) + foreach (Texture texture in _partiallyMappedTextures) { texture.UpdatePoolMappings(); } @@ -252,7 +253,7 @@ namespace Ryujinx.Graphics.Gpu.Image for (int i = 0; i < overlapCount; i++) { - var other = _textureOverlaps[i]; + Texture other = _textureOverlaps[i]; if (texture != other && (texture.IsViewCompatible(other.Info, other.Range, true, other.LayerSize, _context.Capabilities, out _, out _) != TextureViewCompatibility.Incompatible || @@ -485,7 +486,7 @@ namespace Ryujinx.Graphics.Gpu.Image int layerSize = !isLinear ? colorState.LayerSize * 4 : 0; - var flags = TextureSearchFlags.WithUpscale; + TextureSearchFlags flags = TextureSearchFlags.WithUpscale; if (discard) { @@ -559,7 +560,7 @@ namespace Ryujinx.Graphics.Gpu.Image target, formatInfo); - var flags = TextureSearchFlags.WithUpscale; + TextureSearchFlags flags = TextureSearchFlags.WithUpscale; if (discard) { @@ -891,7 +892,7 @@ namespace Ryujinx.Graphics.Gpu.Image // otherwise we only need the data that is copied from the existing texture, without loading the CPU data. bool updateNewTexture = texture.Width > overlap.Width || texture.Height > overlap.Height; - texture.InitializeGroup(true, true, new List()); + texture.InitializeGroup(true, true, []); texture.InitializeData(false, updateNewTexture); overlap.SynchronizeMemory(); @@ -946,7 +947,7 @@ namespace Ryujinx.Graphics.Gpu.Image bool hasLayerViews = false; bool hasMipViews = false; - var incompatibleOverlaps = new List(); + List incompatibleOverlaps = []; for (int index = 0; index < overlapsCount; index++) { @@ -998,7 +999,7 @@ namespace Ryujinx.Graphics.Gpu.Image { bool dataOverlaps = texture.DataOverlaps(overlap, compatibility); - if (!overlap.IsView && dataOverlaps && !incompatibleOverlaps.Exists(incompatible => incompatible.Group == overlap.Group)) + if (!overlap.IsView && dataOverlaps && !incompatibleOverlaps.Any(incompatible => incompatible.Group == overlap.Group)) { incompatibleOverlaps.Add(new TextureIncompatibleOverlap(overlap.Group, compatibility)); } diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureCompatibility.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureCompatibility.cs index 8bed6363b..f2cbca832 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/TextureCompatibility.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/TextureCompatibility.cs @@ -207,8 +207,8 @@ namespace Ryujinx.Graphics.Gpu.Image return false; // Flushing this format is not supported, as it may have been converted to another host format. } - if (info.Target == Target.Texture2DMultisample || - info.Target == Target.Texture2DMultisampleArray) + if (info.Target is Target.Texture2DMultisample or + Target.Texture2DMultisampleArray) { return false; // Flushing multisample textures is not supported, the host does not allow getting their data. } @@ -758,43 +758,45 @@ namespace Ryujinx.Graphics.Gpu.Image { case Target.Texture1D: case Target.Texture1DArray: - result = rhs.Target == Target.Texture1D || - rhs.Target == Target.Texture1DArray; + result = rhs.Target is Target.Texture1D or + Target.Texture1DArray; break; case Target.Texture2D: - result = rhs.Target == Target.Texture2D || - rhs.Target == Target.Texture2DArray; + result = rhs.Target is Target.Texture2D or + Target.Texture2DArray; break; case Target.Texture2DArray: - result = rhs.Target == Target.Texture2D || - rhs.Target == Target.Texture2DArray; + result = rhs.Target is Target.Texture2D or + Target.Texture2DArray; - if (rhs.Target == Target.Cubemap || rhs.Target == Target.CubemapArray) + if (rhs.Target is Target.Cubemap or Target.CubemapArray) { return caps.SupportsCubemapView ? TextureViewCompatibility.Full : TextureViewCompatibility.CopyOnly; } + break; case Target.Cubemap: case Target.CubemapArray: - result = rhs.Target == Target.Cubemap || - rhs.Target == Target.CubemapArray; + result = rhs.Target is Target.Cubemap or + Target.CubemapArray; - if (rhs.Target == Target.Texture2D || rhs.Target == Target.Texture2DArray) + if (rhs.Target is Target.Texture2D or Target.Texture2DArray) { return caps.SupportsCubemapView ? TextureViewCompatibility.Full : TextureViewCompatibility.CopyOnly; } + break; case Target.Texture2DMultisample: case Target.Texture2DMultisampleArray: - if (rhs.Target == Target.Texture2D || rhs.Target == Target.Texture2DArray) + if (rhs.Target is Target.Texture2D or Target.Texture2DArray) { return TextureViewCompatibility.CopyOnly; } - result = rhs.Target == Target.Texture2DMultisample || - rhs.Target == Target.Texture2DMultisampleArray; + result = rhs.Target is Target.Texture2DMultisample or + Target.Texture2DMultisampleArray; break; case Target.Texture3D: diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs index 526fc0c24..7f38df129 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs @@ -7,6 +7,7 @@ using Ryujinx.Memory.Range; using Ryujinx.Memory.Tracking; using System; using System.Collections.Generic; +using System.Linq; using System.Runtime.CompilerServices; namespace Ryujinx.Graphics.Gpu.Image @@ -217,7 +218,6 @@ namespace Ryujinx.Graphics.Gpu.Image } } - /// /// Flushes incompatible overlaps if the storage format requires it, and they have been modified. /// This allows unsupported host formats to accept data written to format aliased textures. @@ -230,7 +230,7 @@ namespace Ryujinx.Graphics.Gpu.Image { bool flushed = false; - foreach (var overlap in _incompatibleOverlaps) + foreach (TextureIncompatibleOverlap overlap in _incompatibleOverlaps) { flushed |= overlap.Group.Storage.FlushModified(true); } @@ -402,7 +402,7 @@ namespace Ryujinx.Graphics.Gpu.Image { if (_loadNeeded[baseHandle + i]) { - var info = GetHandleInformation(baseHandle + i); + (int BaseLayer, int BaseLevel, int Levels, int Layers, int Index) info = GetHandleInformation(baseHandle + i); // Ensure the data for this handle is loaded in the span. if (spanEndIndex <= i - 1) @@ -425,7 +425,7 @@ namespace Ryujinx.Graphics.Gpu.Image } } - var endInfo = spanEndIndex == i ? info : GetHandleInformation(baseHandle + spanEndIndex); + (int BaseLayer, int BaseLevel, int Levels, int Layers, int Index) endInfo = spanEndIndex == i ? info : GetHandleInformation(baseHandle + spanEndIndex); spanBase = _allOffsets[info.Index]; int spanLast = _allOffsets[endInfo.Index + endInfo.Layers * endInfo.Levels - 1]; @@ -478,7 +478,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// True if flushes should be tracked, false otherwise private bool ShouldFlushTriggerTracking() { - foreach (var overlap in _incompatibleOverlaps) + foreach (TextureIncompatibleOverlap overlap in _incompatibleOverlaps) { if (overlap.Group._flushIncompatibleOverlaps) { @@ -636,7 +636,7 @@ namespace Ryujinx.Graphics.Gpu.Image bool canImport = Storage.Info.IsLinear && Storage.Info.Stride >= Storage.Info.Width * Storage.Info.FormatInfo.BytesPerPixel; - var hostPointer = canImport ? _physicalMemory.GetHostPointer(Storage.Range) : 0; + IntPtr hostPointer = canImport ? _physicalMemory.GetHostPointer(Storage.Range) : 0; if (hostPointer != 0 && _context.Renderer.PrepareHostMapping(hostPointer, Storage.Size)) { @@ -1018,7 +1018,7 @@ namespace Ryujinx.Graphics.Gpu.Image int endOffset = _allOffsets[viewEnd] + _sliceSizes[lastLevel]; int size = endOffset - offset; - var result = new List(); + List result = []; for (int i = 0; i < TextureRange.Count; i++) { @@ -1052,7 +1052,7 @@ namespace Ryujinx.Graphics.Gpu.Image offset = _allOffsets[viewStart]; ulong maxSize = Storage.Size - (ulong)offset; - var groupHandle = new TextureGroupHandle( + TextureGroupHandle groupHandle = new( this, offset, Math.Min(maxSize, (ulong)size), @@ -1132,7 +1132,6 @@ namespace Ryujinx.Graphics.Gpu.Image SignalAllDirty(); } - /// /// Removes a view from the group, removing it from all overlap lists. /// @@ -1159,17 +1158,17 @@ namespace Ryujinx.Graphics.Gpu.Image /// The offset of the old handles in relation to the new ones private void InheritHandles(TextureGroupHandle[] oldHandles, TextureGroupHandle[] handles, int relativeOffset) { - foreach (var group in handles) + foreach (TextureGroupHandle group in handles) { - foreach (var handle in group.Handles) + foreach (RegionHandle handle in group.Handles) { bool dirty = false; - foreach (var oldGroup in oldHandles) + foreach (TextureGroupHandle oldGroup in oldHandles) { if (group.OverlapsWith(oldGroup.Offset + relativeOffset, oldGroup.Size)) { - foreach (var oldHandle in oldGroup.Handles) + foreach (RegionHandle oldHandle in oldGroup.Handles) { if (handle.OverlapsWith(oldHandle.Address, oldHandle.Size)) { @@ -1193,7 +1192,7 @@ namespace Ryujinx.Graphics.Gpu.Image } } - foreach (var oldGroup in oldHandles) + foreach (TextureGroupHandle oldGroup in oldHandles) { oldGroup.Modified = false; } @@ -1253,7 +1252,7 @@ namespace Ryujinx.Graphics.Gpu.Image continue; } - foreach (var oldGroup in _handles) + foreach (TextureGroupHandle oldGroup in _handles) { if (!groupHandle.OverlapsWith(oldGroup.Offset, oldGroup.Size)) { @@ -1264,7 +1263,7 @@ namespace Ryujinx.Graphics.Gpu.Image { bool hasMatch = false; - foreach (var oldHandle in oldGroup.Handles) + foreach (RegionHandle oldHandle in oldGroup.Handles) { if (oldHandle.RangeEquals(handle)) { @@ -1291,9 +1290,9 @@ namespace Ryujinx.Graphics.Gpu.Image InheritHandles(_handles, handles, 0); - foreach (var oldGroup in _handles) + foreach (TextureGroupHandle oldGroup in _handles) { - foreach (var oldHandle in oldGroup.Handles) + foreach (RegionHandle oldHandle in oldGroup.Handles) { oldHandle.Dispose(); } @@ -1314,17 +1313,17 @@ namespace Ryujinx.Graphics.Gpu.Image if (_isBuffer) { - handles = Array.Empty(); + handles = []; } else if (!(_hasMipViews || _hasLayerViews)) { // Single dirty region. - var cpuRegionHandles = new RegionHandle[TextureRange.Count]; + RegionHandle[] cpuRegionHandles = new RegionHandle[TextureRange.Count]; int count = 0; for (int i = 0; i < TextureRange.Count; i++) { - var currentRange = TextureRange.GetSubRange(i); + MemoryRange currentRange = TextureRange.GetSubRange(i); if (currentRange.Address != MemoryManager.PteUnmapped) { cpuRegionHandles[count++] = GenerateHandle(currentRange.Address, currentRange.Size); @@ -1336,9 +1335,9 @@ namespace Ryujinx.Graphics.Gpu.Image Array.Resize(ref cpuRegionHandles, count); } - var groupHandle = new TextureGroupHandle(this, 0, Storage.Size, _views, 0, 0, 0, _allOffsets.Length, cpuRegionHandles); + TextureGroupHandle groupHandle = new(this, 0, Storage.Size, _views, 0, 0, 0, _allOffsets.Length, cpuRegionHandles); - handles = new TextureGroupHandle[] { groupHandle }; + handles = [groupHandle]; } else { @@ -1354,7 +1353,7 @@ namespace Ryujinx.Graphics.Gpu.Image if (_is3D) { - var handlesList = new List(); + List handlesList = []; for (int i = 0; i < levelHandles; i++) { @@ -1437,8 +1436,8 @@ namespace Ryujinx.Graphics.Gpu.Image // Get the location of each texture within its storage, so we can find the handles to apply the dependency to. // This can consist of multiple disjoint regions, for example if this is a mip slice of an array texture. - var targetRange = new List<(int BaseHandle, int RegionCount)>(); - var otherRange = new List<(int BaseHandle, int RegionCount)>(); + List<(int BaseHandle, int RegionCount)> targetRange = []; + List<(int BaseHandle, int RegionCount)> otherRange = []; EvaluateRelevantHandles(firstLayer, firstLevel, other.Info.GetSlices(), other.Info.Levels, (baseHandle, regionCount, split) => targetRange.Add((baseHandle, regionCount))); otherGroup.EvaluateRelevantHandles(other, (baseHandle, regionCount, split) => otherRange.Add((baseHandle, regionCount))); @@ -1555,7 +1554,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// True if the overlap should register copy dependencies public void RegisterIncompatibleOverlap(TextureIncompatibleOverlap other, bool copy) { - if (!_incompatibleOverlaps.Exists(overlap => overlap.Group == other.Group)) + if (!_incompatibleOverlaps.Any(overlap => overlap.Group == other.Group)) { if (copy && other.Compatibility == TextureViewCompatibility.LayoutIncompatible) { @@ -1701,3 +1700,4 @@ namespace Ryujinx.Graphics.Gpu.Image } } } + diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs index 860922d59..fe22b9e63 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/TextureGroupHandle.cs @@ -134,8 +134,8 @@ namespace Ryujinx.Graphics.Gpu.Image Offset = offset; Size = (int)size; - Overlaps = new List(); - Dependencies = new List(); + Overlaps = []; + Dependencies = []; BaseSlice = baseSlice; SliceCount = sliceCount; diff --git a/src/Ryujinx.Graphics.Gpu/Image/TextureInfo.cs b/src/Ryujinx.Graphics.Gpu/Image/TextureInfo.cs index 94d2e0bfc..cb2ccf54d 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/TextureInfo.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/TextureInfo.cs @@ -216,7 +216,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// The number of texture layers public static int GetLayers(Target target, int depthOrLayers) { - if (target == Target.Texture2DArray || target == Target.Texture2DMultisampleArray) + if (target is Target.Texture2DArray or Target.Texture2DMultisampleArray) { return depthOrLayers; } @@ -241,7 +241,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// The number of texture slices public int GetSlices() { - if (Target == Target.Texture3D || Target == Target.Texture2DArray || Target == Target.Texture2DMultisampleArray) + if (Target is Target.Texture3D or Target.Texture2DArray or Target.Texture2DMultisampleArray) { return DepthOrLayers; } diff --git a/src/Ryujinx.Graphics.Gpu/Image/TexturePool.cs b/src/Ryujinx.Graphics.Gpu/Image/TexturePool.cs index be7cb0b89..fd1609c23 100644 --- a/src/Ryujinx.Graphics.Gpu/Image/TexturePool.cs +++ b/src/Ryujinx.Graphics.Gpu/Image/TexturePool.cs @@ -97,7 +97,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// public TextureAliasList() { - _aliases = new List(); + _aliases = []; } /// @@ -118,7 +118,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// Texture with the requested format, or null if not found public Texture Find(Format format) { - foreach (var alias in _aliases) + foreach (Alias alias in _aliases) { if (alias.Format == format) { @@ -134,7 +134,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// public void Destroy() { - foreach (var entry in _aliases) + foreach (Alias entry in _aliases) { entry.Texture.DecrementReferenceCount(); } @@ -361,7 +361,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// If true, queue the dereference to happen on the render thread, otherwise dereference immediately public void ForceRemove(Texture texture, int id, bool deferred) { - var previous = Interlocked.Exchange(ref Items[id], null); + Texture previous = Interlocked.Exchange(ref Items[id], null); if (deferred) { @@ -454,6 +454,7 @@ namespace Ryujinx.Graphics.Gpu.Image // If this is null, a request was already queued to decrement reference. texture.DecrementReferenceCount(this, request.ID); } + continue; } } @@ -544,7 +545,7 @@ namespace Ryujinx.Graphics.Gpu.Image int width = target == Target.TextureBuffer ? descriptor.UnpackBufferTextureWidth() : descriptor.UnpackWidth(); int height = descriptor.UnpackHeight(); - if (target == Target.Texture2DMultisample || target == Target.Texture2DMultisampleArray) + if (target is Target.Texture2DMultisample or Target.Texture2DMultisampleArray) { // This is divided back before the backend texture is created. width *= samplesInX; @@ -699,8 +700,8 @@ namespace Ryujinx.Graphics.Gpu.Image { int maxSize = width; - if (target != Target.Texture1D && - target != Target.Texture1DArray) + if (target is not Target.Texture1D and + not Target.Texture1DArray) { maxSize = Math.Max(maxSize, height); } @@ -721,7 +722,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// The format of the texture /// The texture swizzle components /// The depth-stencil mode - private static DepthStencilMode GetDepthStencilMode(Format format, params SwizzleComponent[] components) + private static DepthStencilMode GetDepthStencilMode(Format format, params ReadOnlySpan components) { // R = Depth, G = Stencil. // On 24-bits depth formats, this is inverted (Stencil is R etc). @@ -761,8 +762,8 @@ namespace Ryujinx.Graphics.Gpu.Image /// True if the swizzle component is equal to the red or green, false otherwise private static bool IsRG(SwizzleComponent component) { - return component == SwizzleComponent.Red || - component == SwizzleComponent.Green; + return component is SwizzleComponent.Red or + SwizzleComponent.Green; } /// diff --git a/src/Ryujinx.Graphics.Gpu/Memory/Buffer.cs b/src/Ryujinx.Graphics.Gpu/Memory/Buffer.cs index e060e0b4f..a2448d76f 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/Buffer.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/Buffer.cs @@ -705,7 +705,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { BufferHandle handle = Handle; - return (ulong address, ulong size, ulong _) => + return (address, size, _) => { FlushImpl(handle, address, size); }; @@ -735,7 +735,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { _context.Renderer.BackgroundContextAction(() => { - var ranges = _modifiedRanges; + BufferModifiedRangeList ranges = _modifiedRanges; if (ranges != null) { @@ -799,7 +799,7 @@ namespace Ryujinx.Graphics.Gpu.Memory try { - (_virtualDependencies ??= new()).Add(virtualBuffer); + (_virtualDependencies ??= []).Add(virtualBuffer); } finally { @@ -850,7 +850,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { if (_virtualDependencies != null) { - foreach (var virtualBuffer in _virtualDependencies) + foreach (MultiRangeBuffer virtualBuffer in _virtualDependencies) { CopyToDependantVirtualBuffer(virtualBuffer, address, size); } @@ -875,7 +875,7 @@ namespace Ryujinx.Graphics.Gpu.Memory [MethodImpl(MethodImplOptions.NoInlining)] private void CopyFromDependantVirtualBuffersImpl() { - foreach (var virtualBuffer in _virtualDependencies.OrderBy(x => x.ModificationSequenceNumber)) + foreach (MultiRangeBuffer virtualBuffer in _virtualDependencies.OrderBy(x => x.ModificationSequenceNumber)) { virtualBuffer.ConsumeModifiedRegion(this, (mAddress, mSize) => { @@ -914,7 +914,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { byte[] storage = dataSpan.ToArray(); - foreach (var virtualBuffer in _virtualDependencies.OrderBy(x => x.ModificationSequenceNumber)) + foreach (MultiRangeBuffer virtualBuffer in _virtualDependencies.OrderBy(x => x.ModificationSequenceNumber)) { virtualBuffer.ConsumeModifiedRegion(address, size, (mAddress, mSize) => { diff --git a/src/Ryujinx.Graphics.Gpu/Memory/BufferBackingState.cs b/src/Ryujinx.Graphics.Gpu/Memory/BufferBackingState.cs index 3f65131e6..a9b1f50e2 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/BufferBackingState.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/BufferBackingState.cs @@ -63,7 +63,7 @@ namespace Ryujinx.Graphics.Gpu.Memory // Backend managed is always auto, unified memory is always host. _desiredType = BufferBackingType.HostMemory; - _canSwap = _systemMemoryType != SystemMemoryType.BackendManaged && _systemMemoryType != SystemMemoryType.UnifiedMemory; + _canSwap = _systemMemoryType is not SystemMemoryType.BackendManaged and not SystemMemoryType.UnifiedMemory; if (_canSwap) { @@ -81,7 +81,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { // Storage buffer bindings may require special treatment. - var rawStage = stage & BufferStage.StageMask; + BufferStage rawStage = stage & BufferStage.StageMask; if (rawStage == BufferStage.Fragment) { @@ -225,7 +225,7 @@ namespace Ryujinx.Graphics.Gpu.Memory // Storage write. _writeCount++; - var rawStage = stage & BufferStage.StageMask; + BufferStage rawStage = stage & BufferStage.StageMask; if (rawStage == BufferStage.Fragment) { diff --git a/src/Ryujinx.Graphics.Gpu/Memory/BufferCache.cs b/src/Ryujinx.Graphics.Gpu/Memory/BufferCache.cs index 66d2cdb62..d02efcb29 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/BufferCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/BufferCache.cs @@ -61,8 +61,8 @@ namespace Ryujinx.Graphics.Gpu.Memory _context = context; _physicalMemory = physicalMemory; - _buffers = new RangeList(); - _multiRangeBuffers = new MultiRangeList(); + _buffers = []; + _multiRangeBuffers = []; _bufferOverlaps = new Buffer[OverlapsBufferInitialCapacity]; @@ -395,7 +395,7 @@ namespace Ryujinx.Graphics.Gpu.Memory ulong dstOffset = 0; - HashSet physicalBuffers = new(); + HashSet physicalBuffers = []; for (int i = 0; i < virtualBuffer.Range.Count; i++) { @@ -412,7 +412,7 @@ namespace Ryujinx.Graphics.Gpu.Memory dstOffset += subRange.Size; } - foreach (var buffer in physicalBuffers) + foreach (Buffer buffer in physicalBuffers) { buffer.CopyToDependantVirtualBuffer(virtualBuffer); } @@ -663,7 +663,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// Total of overlaps private void CreateBufferAligned(ulong address, ulong size, BufferStage stage, bool sparseCompatible, Buffer[] overlaps, int overlapsCount) { - Buffer newBuffer = new Buffer(_context, _physicalMemory, address, size, stage, sparseCompatible, overlaps.Take(overlapsCount)); + Buffer newBuffer = new(_context, _physicalMemory, address, size, stage, sparseCompatible, overlaps.Take(overlapsCount)); lock (_buffers) { @@ -1037,11 +1037,11 @@ namespace Ryujinx.Graphics.Gpu.Memory /// List used to track entries to delete private static void Prune(Dictionary dictionary, ref List toDelete) { - foreach (var entry in dictionary) + foreach (KeyValuePair entry in dictionary) { if (entry.Value.UnmappedSequence != entry.Value.Buffer.UnmappedSequence) { - (toDelete ??= new()).Add(entry.Key); + (toDelete ??= []).Add(entry.Key); } } diff --git a/src/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs b/src/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs index 409867e09..cb99b455b 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/BufferManager.cs @@ -141,9 +141,9 @@ namespace Ryujinx.Graphics.Gpu.Memory _gpUniformBuffers[index] = new BuffersPerStage(Constants.TotalGpUniformBuffers); } - _bufferTextures = new List(); - _bufferTextureArrays = new List>(); - _bufferImageArrays = new List>(); + _bufferTextures = []; + _bufferTextureArrays = []; + _bufferImageArrays = []; _ranges = new BufferAssignment[Constants.TotalGpUniformBuffers * Constants.ShaderStages]; } @@ -478,7 +478,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// public void CommitComputeBindings() { - var bufferCache = _channel.MemoryManager.Physical.BufferCache; + BufferCache bufferCache = _channel.MemoryManager.Physical.BufferCache; BindBuffers(bufferCache, _cpStorageBuffers, isStorage: true); BindBuffers(bufferCache, _cpUniformBuffers, isStorage: false); @@ -499,10 +499,10 @@ namespace Ryujinx.Graphics.Gpu.Memory { if (_bufferTextures.Count > 0) { - foreach (var binding in _bufferTextures) + foreach (BufferTextureBinding binding in _bufferTextures) { - var isStore = binding.BindingInfo.Flags.HasFlag(TextureUsageFlags.ImageStore); - var range = bufferCache.GetBufferRange(binding.Range, BufferStageUtils.TextureBuffer(binding.Stage, binding.BindingInfo.Flags), isStore); + bool isStore = binding.BindingInfo.Flags.HasFlag(TextureUsageFlags.ImageStore); + BufferRange range = bufferCache.GetBufferRange(binding.Range, BufferStageUtils.TextureBuffer(binding.Stage, binding.BindingInfo.Flags), isStore); binding.Texture.SetStorage(range); // The texture must be rebound to use the new storage if it was updated. @@ -524,19 +524,19 @@ namespace Ryujinx.Graphics.Gpu.Memory { ITexture[] textureArray = new ITexture[1]; - foreach (var binding in _bufferTextureArrays) + foreach (BufferTextureArrayBinding binding in _bufferTextureArrays) { - var range = bufferCache.GetBufferRange(binding.Range, BufferStage.None); + BufferRange range = bufferCache.GetBufferRange(binding.Range, BufferStage.None); binding.Texture.SetStorage(range); textureArray[0] = binding.Texture; binding.Array.SetTextures(binding.Index, textureArray); } - foreach (var binding in _bufferImageArrays) + foreach (BufferTextureArrayBinding binding in _bufferImageArrays) { - var isStore = binding.BindingInfo.Flags.HasFlag(TextureUsageFlags.ImageStore); - var range = bufferCache.GetBufferRange(binding.Range, BufferStage.None, isStore); + bool isStore = binding.BindingInfo.Flags.HasFlag(TextureUsageFlags.ImageStore); + BufferRange range = bufferCache.GetBufferRange(binding.Range, BufferStage.None, isStore); binding.Texture.SetStorage(range); textureArray[0] = binding.Texture; @@ -555,7 +555,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// True if the index buffer is in use public void CommitGraphicsBindings(bool indexed) { - var bufferCache = _channel.MemoryManager.Physical.BufferCache; + BufferCache bufferCache = _channel.MemoryManager.Physical.BufferCache; if (indexed) { @@ -750,19 +750,19 @@ namespace Ryujinx.Graphics.Gpu.Memory for (ShaderStage stage = ShaderStage.Vertex; stage <= ShaderStage.Fragment; stage++) { - ref var buffers = ref bindings[(int)stage - 1]; + ref BuffersPerStage buffers = ref bindings[(int)stage - 1]; BufferStage bufferStage = BufferStageUtils.FromShaderStage(stage); for (int index = 0; index < buffers.Count; index++) { - ref var bindingInfo = ref buffers.Bindings[index]; + ref BufferDescriptor bindingInfo = ref buffers.Bindings[index]; BufferBounds bounds = buffers.Buffers[bindingInfo.Slot]; if (!bounds.IsUnmapped) { - var isWrite = bounds.Flags.HasFlag(BufferUsageFlags.Write); - var range = isStorage + bool isWrite = bounds.Flags.HasFlag(BufferUsageFlags.Write); + BufferRange range = isStorage ? bufferCache.GetBufferRangeAligned(bounds.Range, bufferStage | BufferStageUtils.FromUsage(bounds.Flags), isWrite) : bufferCache.GetBufferRange(bounds.Range, bufferStage); @@ -792,14 +792,14 @@ namespace Ryujinx.Graphics.Gpu.Memory for (int index = 0; index < buffers.Count; index++) { - ref var bindingInfo = ref buffers.Bindings[index]; + ref BufferDescriptor bindingInfo = ref buffers.Bindings[index]; BufferBounds bounds = buffers.Buffers[bindingInfo.Slot]; if (!bounds.IsUnmapped) { - var isWrite = bounds.Flags.HasFlag(BufferUsageFlags.Write); - var range = isStorage + bool isWrite = bounds.Flags.HasFlag(BufferUsageFlags.Write); + BufferRange range = isStorage ? bufferCache.GetBufferRangeAligned(bounds.Range, BufferStageUtils.ComputeStorage(bounds.Flags), isWrite) : bufferCache.GetBufferRange(bounds.Range, BufferStage.Compute); @@ -841,11 +841,11 @@ namespace Ryujinx.Graphics.Gpu.Memory { for (ShaderStage stage = ShaderStage.Vertex; stage <= ShaderStage.Fragment; stage++) { - ref var buffers = ref bindings[(int)stage - 1]; + ref BuffersPerStage buffers = ref bindings[(int)stage - 1]; for (int index = 0; index < buffers.Count; index++) { - ref var binding = ref buffers.Bindings[index]; + ref BufferDescriptor binding = ref buffers.Bindings[index]; BufferBounds bounds = buffers.Buffers[binding.Slot]; diff --git a/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs b/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs index d330de638..bccbdfd31 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs @@ -2,6 +2,7 @@ using Ryujinx.Common.Pools; using Ryujinx.Memory.Range; using System; using System.Linq; +using System.Threading; namespace Ryujinx.Graphics.Gpu.Memory { @@ -76,7 +77,7 @@ namespace Ryujinx.Graphics.Gpu.Memory private BufferMigration _source; private BufferModifiedRangeList _migrationTarget; - private readonly object _lock = new(); + private readonly Lock _lock = new(); /// /// Whether the modified range list has any entries or not. @@ -116,7 +117,7 @@ namespace Ryujinx.Graphics.Gpu.Memory lock (_lock) { // Slices a given region using the modified regions in the list. Calls the action for the new slices. - ref var overlaps = ref ThreadStaticArray.Get(); + ref BufferModifiedRange[] overlaps = ref ThreadStaticArray.Get(); int count = FindOverlapsNonOverlapping(address, size, ref overlaps); @@ -155,7 +156,7 @@ namespace Ryujinx.Graphics.Gpu.Memory lock (_lock) { // We may overlap with some existing modified regions. They must be cut into by the new entry. - ref var overlaps = ref ThreadStaticArray.Get(); + ref BufferModifiedRange[] overlaps = ref ThreadStaticArray.Get(); int count = FindOverlapsNonOverlapping(address, size, ref overlaps); @@ -209,7 +210,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { int count = 0; - ref var overlaps = ref ThreadStaticArray.Get(); + ref BufferModifiedRange[] overlaps = ref ThreadStaticArray.Get(); // Range list must be consistent for this operation. lock (_lock) @@ -238,7 +239,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { int count = 0; - ref var overlaps = ref ThreadStaticArray.Get(); + ref BufferModifiedRange[] overlaps = ref ThreadStaticArray.Get(); // Range list must be consistent for this operation. lock (_lock) @@ -354,7 +355,7 @@ namespace Ryujinx.Graphics.Gpu.Memory int rangeCount = 0; - ref var overlaps = ref ThreadStaticArray.Get(); + ref BufferModifiedRange[] overlaps = ref ThreadStaticArray.Get(); // Range list must be consistent for this operation lock (_lock) @@ -430,13 +431,13 @@ namespace Ryujinx.Graphics.Gpu.Memory BufferMigration oldMigration = ranges._source; - BufferMigrationSpan span = new BufferMigrationSpan(ranges._parent, ranges._flushAction, oldMigration); + BufferMigrationSpan span = new(ranges._parent, ranges._flushAction, oldMigration); ranges._parent.IncrementReferenceCount(); if (_source == null) { - // Create a new migration. - _source = new BufferMigration(new BufferMigrationSpan[] { span }, this, _context.SyncNumber); + // Create a new migration. + _source = new BufferMigration([span], this, _context.SyncNumber); _context.RegisterBufferMigration(_source); } @@ -475,7 +476,7 @@ namespace Ryujinx.Graphics.Gpu.Memory lock (_lock) { BufferMigrationSpan span = new(_parent, _parent.GetSnapshotDisposeAction(), _parent.GetSnapshotFlushAction(), _source); - BufferMigration migration = new(new BufferMigrationSpan[] { span }, this, _context.SyncNumber); + BufferMigration migration = new([span], this, _context.SyncNumber); // Migration target is used to redirect flush actions to the latest range list, // so we don't need to set it here. (this range list is still the latest) diff --git a/src/Ryujinx.Graphics.Gpu/Memory/BufferStage.cs b/src/Ryujinx.Graphics.Gpu/Memory/BufferStage.cs index d56abda28..8a9f37658 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/BufferStage.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/BufferStage.cs @@ -29,10 +29,7 @@ namespace Ryujinx.Graphics.Gpu.Memory StorageRead = 0x40, StorageWrite = 0x80, - -#pragma warning disable CA1069 // Enums values should not be duplicated StorageAtomic = 0xc0 -#pragma warning restore CA1069 // Enums values should not be duplicated } /// diff --git a/src/Ryujinx.Graphics.Gpu/Memory/BufferUpdater.cs b/src/Ryujinx.Graphics.Gpu/Memory/BufferUpdater.cs index 02090c04f..f7fc65a4e 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/BufferUpdater.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/BufferUpdater.cs @@ -73,10 +73,10 @@ namespace Ryujinx.Graphics.Gpu.Memory if (binding >= 0) { - var range = new BufferRange(_handle, 0, data.Length); - _renderer.Pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(0, range) }); + BufferRange range = new(_handle, 0, data.Length); + _renderer.Pipeline.SetUniformBuffers([new BufferAssignment(0, range)]); } - }; + } _renderer.SetBufferData(_handle, _startOffset, data[_startOffset.._endOffset]); diff --git a/src/Ryujinx.Graphics.Gpu/Memory/CounterCache.cs b/src/Ryujinx.Graphics.Gpu/Memory/CounterCache.cs index 24966df41..2d67c2c28 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/CounterCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/CounterCache.cs @@ -27,7 +27,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// public CounterCache() { - _items = new List(); + _items = []; } /// diff --git a/src/Ryujinx.Graphics.Gpu/Memory/GpuRegionHandle.cs b/src/Ryujinx.Graphics.Gpu/Memory/GpuRegionHandle.cs index bdb7cf2c2..77eb7c4a4 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/GpuRegionHandle.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/GpuRegionHandle.cs @@ -14,7 +14,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { get { - foreach (var regionHandle in _cpuRegionHandles) + foreach (RegionHandle regionHandle in _cpuRegionHandles) { if (regionHandle.Dirty) { @@ -44,7 +44,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// public void Dispose() { - foreach (var regionHandle in _cpuRegionHandles) + foreach (RegionHandle regionHandle in _cpuRegionHandles) { regionHandle.Dispose(); } @@ -57,7 +57,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// Action to call on read or write public void RegisterAction(RegionSignal action) { - foreach (var regionHandle in _cpuRegionHandles) + foreach (RegionHandle regionHandle in _cpuRegionHandles) { regionHandle.RegisterAction(action); } @@ -70,7 +70,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// Action to call on read or write public void RegisterPreciseAction(PreciseRegionSignal action) { - foreach (var regionHandle in _cpuRegionHandles) + foreach (RegionHandle regionHandle in _cpuRegionHandles) { regionHandle.RegisterPreciseAction(action); } @@ -81,7 +81,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// public void Reprotect(bool asDirty = false) { - foreach (var regionHandle in _cpuRegionHandles) + foreach (RegionHandle regionHandle in _cpuRegionHandles) { regionHandle.Reprotect(asDirty); } @@ -92,7 +92,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// public void ForceDirty() { - foreach (var regionHandle in _cpuRegionHandles) + foreach (RegionHandle regionHandle in _cpuRegionHandles) { regionHandle.ForceDirty(); } diff --git a/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs b/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs index 59e618c02..6efb7f334 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs @@ -1,5 +1,4 @@ using Ryujinx.Common.Memory; -using Ryujinx.Graphics.Gpu.Image; using Ryujinx.Memory; using Ryujinx.Memory.Range; using System; @@ -458,7 +457,7 @@ namespace Ryujinx.Graphics.Gpu.Memory int pages = (int)((endVaRounded - va) / PageSize); - var regions = new List(); + List regions = []; for (int page = 0; page < pages - 1; page++) { diff --git a/src/Ryujinx.Graphics.Gpu/Memory/MultiRangeBuffer.cs b/src/Ryujinx.Graphics.Gpu/Memory/MultiRangeBuffer.cs index d92b0836e..7252b5404 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/MultiRangeBuffer.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/MultiRangeBuffer.cs @@ -128,7 +128,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// Size of the range in bytes public void AddPhysicalDependency(Buffer buffer, ulong rangeAddress, ulong dstOffset, ulong rangeSize) { - (_dependencies ??= new()).Add(new(buffer, rangeAddress - buffer.Address, dstOffset, rangeSize)); + (_dependencies ??= []).Add(new(buffer, rangeAddress - buffer.Address, dstOffset, rangeSize)); buffer.AddVirtualDependency(this); } @@ -149,7 +149,7 @@ namespace Ryujinx.Graphics.Gpu.Memory if (_dependencies != null) { - foreach (var dependency in _dependencies) + foreach (PhysicalDependency dependency in _dependencies) { if (dependency.PhysicalBuffer == buffer && dependency.VirtualOffset >= minimumVirtOffset) { @@ -231,7 +231,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { if (_dependencies != null) { - foreach (var dependency in _dependencies) + foreach (PhysicalDependency dependency in _dependencies) { dependency.PhysicalBuffer.RemoveVirtualDependency(this); } diff --git a/src/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs b/src/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs index b22cc01b8..0b1424b8a 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs @@ -7,7 +7,6 @@ using Ryujinx.Memory; using Ryujinx.Memory.Range; using Ryujinx.Memory.Tracking; using System; -using System.Buffers; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; @@ -102,10 +101,10 @@ namespace Ryujinx.Graphics.Gpu.Memory { if (range.Count == 1) { - var singleRange = range.GetSubRange(0); + MemoryRange singleRange = range.GetSubRange(0); if (singleRange.Address != MemoryManager.PteUnmapped) { - var regions = _cpuMemory.GetHostRegions(singleRange.Address, singleRange.Size); + IEnumerable regions = _cpuMemory.GetHostRegions(singleRange.Address, singleRange.Size); if (regions != null && regions.Count() == 1) { @@ -139,7 +138,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { if (range.Count == 1) { - var singleRange = range.GetSubRange(0); + MemoryRange singleRange = range.GetSubRange(0); if (singleRange.Address != MemoryManager.PteUnmapped) { return _cpuMemory.GetSpan(singleRange.Address, (int)singleRange.Size, tracked); @@ -152,12 +151,13 @@ namespace Ryujinx.Graphics.Gpu.Memory for (int i = 0; i < range.Count; i++) { - var currentRange = range.GetSubRange(i); + MemoryRange currentRange = range.GetSubRange(i); int size = (int)currentRange.Size; if (currentRange.Address != MemoryManager.PteUnmapped) { _cpuMemory.GetSpan(currentRange.Address, size, tracked).CopyTo(data.Slice(offset, size)); } + offset += size; } @@ -199,12 +199,13 @@ namespace Ryujinx.Graphics.Gpu.Memory int offset = 0; for (int i = 0; i < range.Count; i++) { - var currentRange = range.GetSubRange(i); + MemoryRange currentRange = range.GetSubRange(i); int size = (int)currentRange.Size; if (currentRange.Address != MemoryManager.PteUnmapped) { GetSpan(currentRange.Address, size).CopyTo(memorySpan.Slice(offset, size)); } + offset += size; } @@ -322,7 +323,7 @@ namespace Ryujinx.Graphics.Gpu.Memory { if (range.Count == 1) { - var singleRange = range.GetSubRange(0); + MemoryRange singleRange = range.GetSubRange(0); if (singleRange.Address != MemoryManager.PteUnmapped) { writeCallback(singleRange.Address, data); @@ -334,12 +335,13 @@ namespace Ryujinx.Graphics.Gpu.Memory for (int i = 0; i < range.Count; i++) { - var currentRange = range.GetSubRange(i); + MemoryRange currentRange = range.GetSubRange(i); int size = (int)currentRange.Size; if (currentRange.Address != MemoryManager.PteUnmapped) { writeCallback(currentRange.Address, data.Slice(offset, size)); } + offset += size; } } @@ -382,12 +384,12 @@ namespace Ryujinx.Graphics.Gpu.Memory /// The memory tracking handle public GpuRegionHandle BeginTracking(MultiRange range, ResourceKind kind) { - var cpuRegionHandles = new RegionHandle[range.Count]; + RegionHandle[] cpuRegionHandles = new RegionHandle[range.Count]; int count = 0; for (int i = 0; i < range.Count; i++) { - var currentRange = range.GetSubRange(i); + MemoryRange currentRange = range.GetSubRange(i); if (currentRange.Address != MemoryManager.PteUnmapped) { cpuRegionHandles[count++] = _cpuMemory.BeginTracking(currentRange.Address, currentRange.Size, (int)kind); diff --git a/src/Ryujinx.Graphics.Gpu/Memory/PteKind.cs b/src/Ryujinx.Graphics.Gpu/Memory/PteKind.cs index 1585328f0..bdaddc1ee 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/PteKind.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/PteKind.cs @@ -262,7 +262,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// True if pitch, false otherwise public static bool IsPitch(this PteKind kind) { - return kind == PteKind.Pitch || kind == PteKind.PitchNoSwizzle; + return kind is PteKind.Pitch or PteKind.PitchNoSwizzle; } } } diff --git a/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs b/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs index fc444f49c..b6ece6f83 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/SupportBufferUpdater.cs @@ -1,6 +1,5 @@ using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Shader; -using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -19,7 +18,7 @@ namespace Ryujinx.Graphics.Gpu.Memory /// Renderer that the support buffer will be used with public SupportBufferUpdater(IRenderer renderer) : base(renderer) { - var defaultScale = new Vector4 { X = 1f, Y = 0f, Z = 0f, W = 0f }; + Vector4 defaultScale = new() { X = 1f, Y = 0f, Z = 0f, W = 0f }; _data.RenderScale.AsSpan().Fill(defaultScale); DirtyRenderScale(0, SupportBuffer.RenderScaleMaxCount); } diff --git a/src/Ryujinx.Graphics.Gpu/Memory/UnmapEventArgs.cs b/src/Ryujinx.Graphics.Gpu/Memory/UnmapEventArgs.cs index 83fb1fcee..3e2782da6 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/UnmapEventArgs.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/UnmapEventArgs.cs @@ -17,7 +17,7 @@ namespace Ryujinx.Graphics.Gpu.Memory public void AddRemapAction(Action action) { - RemapActions ??= new List(); + RemapActions ??= []; RemapActions.Add(action); } } diff --git a/src/Ryujinx.Graphics.Gpu/Memory/VirtualRangeCache.cs b/src/Ryujinx.Graphics.Gpu/Memory/VirtualRangeCache.cs index 964507a21..ac25b3e5d 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/VirtualRangeCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/VirtualRangeCache.cs @@ -74,7 +74,7 @@ namespace Ryujinx.Graphics.Gpu.Memory public VirtualRangeCache(MemoryManager memoryManager) { _memoryManager = memoryManager; - _virtualRanges = new RangeList(); + _virtualRanges = []; _virtualRangeOverlaps = new VirtualRange[BufferCache.OverlapsBufferInitialCapacity]; _deferredUnmaps = new ConcurrentQueue(); } diff --git a/src/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj b/src/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj index 8c740fadc..4cd9c1d5c 100644 --- a/src/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj +++ b/src/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj @@ -1,7 +1,6 @@  - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs b/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs index 018c5fdc0..4683a5d0c 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs @@ -2,7 +2,6 @@ using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu.Engine; using Ryujinx.Graphics.Gpu.Image; using Ryujinx.Graphics.Shader; -using System; using System.Linq; namespace Ryujinx.Graphics.Gpu.Shader @@ -48,10 +47,10 @@ namespace Ryujinx.Graphics.Gpu.Shader if (stage == null) { - TextureBindings[i] = Array.Empty(); - ImageBindings[i] = Array.Empty(); - ConstantBufferBindings[i] = Array.Empty(); - StorageBufferBindings[i] = Array.Empty(); + TextureBindings[i] = []; + ImageBindings[i] = []; + ConstantBufferBindings[i] = []; + StorageBufferBindings[i] = []; continue; } @@ -60,7 +59,7 @@ namespace Ryujinx.Graphics.Gpu.Shader { Target target = descriptor.Type != SamplerType.None ? ShaderTexture.GetTarget(descriptor.Type) : default; - var result = new TextureBindingInfo( + TextureBindingInfo result = new( target, descriptor.Set, descriptor.Binding, @@ -88,7 +87,7 @@ namespace Ryujinx.Graphics.Gpu.Shader Target target = ShaderTexture.GetTarget(descriptor.Type); FormatInfo formatInfo = ShaderTexture.GetFormatInfo(descriptor.Format); - var result = new TextureBindingInfo( + TextureBindingInfo result = new( target, formatInfo, descriptor.Set, diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ComputeShaderCacheHashTable.cs b/src/Ryujinx.Graphics.Gpu/Shader/ComputeShaderCacheHashTable.cs index 0119a6a33..5c8d5d5df 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ComputeShaderCacheHashTable.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ComputeShaderCacheHashTable.cs @@ -17,7 +17,7 @@ namespace Ryujinx.Graphics.Gpu.Shader public ComputeShaderCacheHashTable() { _cache = new PartitionedHashTable(); - _shaderPrograms = new List(); + _shaderPrograms = []; } /// @@ -26,7 +26,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Program to be added public void Add(CachedShaderProgram program) { - var specList = _cache.GetOrAdd(program.Shaders[0].Code, new ShaderSpecializationList()); + ShaderSpecializationList specList = _cache.GetOrAdd(program.Shaders[0].Code, []); specList.Add(program); _shaderPrograms.Add(program); } @@ -51,7 +51,7 @@ namespace Ryujinx.Graphics.Gpu.Shader { program = null; ShaderCodeAccessor codeAccessor = new(channel.MemoryManager, gpuVa); - bool hasSpecList = _cache.TryFindItem(codeAccessor, out var specList, out cachedGuestCode); + bool hasSpecList = _cache.TryFindItem(codeAccessor, out ShaderSpecializationList specList, out cachedGuestCode); return hasSpecList && specList.TryFindForCompute(channel, poolState, computeState, out program); } @@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Programs added to the table public IEnumerable GetPrograms() { - foreach (var program in _shaderPrograms) + foreach (CachedShaderProgram program in _shaderPrograms) { yield return program; } diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BackgroundDiskCacheWriter.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BackgroundDiskCacheWriter.cs index e0f17ba9c..0e89a20a1 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BackgroundDiskCacheWriter.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BackgroundDiskCacheWriter.cs @@ -108,6 +108,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache { Logger.Error?.Print(LogClass.Gpu, $"Error writing shader to disk cache. {ioException.Message}"); } + break; } } diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs index 3837092c9..76975c13b 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs @@ -203,6 +203,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache { offset += stream.Read(data[offset..]); } + stream.Dispose(); break; case CompressionAlgorithm.Brotli: @@ -211,6 +212,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache { offset += stream.Read(data[offset..]); } + stream.Dispose(); break; } diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs index 22af88d31..1e2f9146f 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs @@ -180,8 +180,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// public void ClearCache() { - using var tocFileStream = DiskCacheCommon.OpenFile(_basePath, TocFileName, writable: true); - using var dataFileStream = DiskCacheCommon.OpenFile(_basePath, DataFileName, writable: true); + using FileStream tocFileStream = DiskCacheCommon.OpenFile(_basePath, TocFileName, writable: true); + using FileStream dataFileStream = DiskCacheCommon.OpenFile(_basePath, DataFileName, writable: true); tocFileStream.SetLength(0); dataFileStream.SetLength(0); @@ -258,8 +258,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// Index of the shader on the cache public int AddShader(ReadOnlySpan data, ReadOnlySpan cb1Data) { - using var tocFileStream = DiskCacheCommon.OpenFile(_basePath, TocFileName, writable: true); - using var dataFileStream = DiskCacheCommon.OpenFile(_basePath, DataFileName, writable: true); + using FileStream tocFileStream = DiskCacheCommon.OpenFile(_basePath, TocFileName, writable: true); + using FileStream dataFileStream = DiskCacheCommon.OpenFile(_basePath, DataFileName, writable: true); TocHeader header = new(); @@ -267,9 +267,9 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache uint hash = CalcHash(data, cb1Data); - if (_toc.TryGetValue(hash, out var list)) + if (_toc.TryGetValue(hash, out List list)) { - foreach (var entry in list) + foreach (TocMemoryEntry entry in list) { if (data.Length != entry.CodeSize || cb1Data.Length != entry.Cb1DataSize) { @@ -379,8 +379,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// Code and constant buffer data hash /// Entry index private int WriteNewEntry( - Stream tocFileStream, - Stream dataFileStream, + FileStream tocFileStream, + FileStream dataFileStream, ref TocHeader header, ReadOnlySpan data, ReadOnlySpan cb1Data, @@ -427,9 +427,9 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// Index of the data on the cache private void AddTocMemoryEntry(uint dataOffset, uint codeSize, uint cb1DataSize, uint hash, int index) { - if (!_toc.TryGetValue(hash, out var list)) + if (!_toc.TryGetValue(hash, out List list)) { - _toc.Add(hash, list = new List()); + _toc.Add(hash, list = []); } list.Add(new TocMemoryEntry(dataOffset, codeSize, cb1DataSize, index)); diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs index c36fc0ada..6444b18e3 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs @@ -301,11 +301,11 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache try { - using var tocFileStream = DiskCacheCommon.OpenFile(_basePath, SharedTocFileName, writable: false); - using var dataFileStream = DiskCacheCommon.OpenFile(_basePath, SharedDataFileName, writable: false); + using FileStream tocFileStream = DiskCacheCommon.OpenFile(_basePath, SharedTocFileName, writable: false); + using FileStream dataFileStream = DiskCacheCommon.OpenFile(_basePath, SharedDataFileName, writable: false); - using var guestTocFileStream = _guestStorage.OpenTocFileStream(); - using var guestDataFileStream = _guestStorage.OpenDataFileStream(); + using Stream guestTocFileStream = _guestStorage.OpenTocFileStream(); + using Stream guestDataFileStream = _guestStorage.OpenDataFileStream(); BinarySerializer tocReader = new(tocFileStream); BinarySerializer dataReader = new(dataFileStream); @@ -541,11 +541,11 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// A collection of disk cache output streams public DiskCacheOutputStreams GetOutputStreams(GpuContext context) { - var tocFileStream = DiskCacheCommon.OpenFile(_basePath, SharedTocFileName, writable: true); - var dataFileStream = DiskCacheCommon.OpenFile(_basePath, SharedDataFileName, writable: true); + FileStream tocFileStream = DiskCacheCommon.OpenFile(_basePath, SharedTocFileName, writable: true); + FileStream dataFileStream = DiskCacheCommon.OpenFile(_basePath, SharedDataFileName, writable: true); - var hostTocFileStream = DiskCacheCommon.OpenFile(_basePath, GetHostTocFileName(context), writable: true); - var hostDataFileStream = DiskCacheCommon.OpenFile(_basePath, GetHostDataFileName(context), writable: true); + FileStream hostTocFileStream = DiskCacheCommon.OpenFile(_basePath, GetHostTocFileName(context), writable: true); + FileStream hostDataFileStream = DiskCacheCommon.OpenFile(_basePath, GetHostDataFileName(context), writable: true); return new DiskCacheOutputStreams(tocFileStream, dataFileStream, hostTocFileStream, hostDataFileStream); } @@ -563,7 +563,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache for (int index = 0; index < program.Shaders.Length; index++) { - var shader = program.Shaders[index]; + CachedShaderStage shader = program.Shaders[index]; if (shader == null || (shader.Info != null && shader.Info.Stage == ShaderStage.Compute)) { continue; @@ -572,8 +572,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache stagesBitMask |= 1u << index; } - var tocFileStream = streams != null ? streams.TocFileStream : DiskCacheCommon.OpenFile(_basePath, SharedTocFileName, writable: true); - var dataFileStream = streams != null ? streams.DataFileStream : DiskCacheCommon.OpenFile(_basePath, SharedDataFileName, writable: true); + FileStream tocFileStream = streams != null ? streams.TocFileStream : DiskCacheCommon.OpenFile(_basePath, SharedTocFileName, writable: true); + FileStream dataFileStream = streams != null ? streams.DataFileStream : DiskCacheCommon.OpenFile(_basePath, SharedDataFileName, writable: true); ulong timestamp = (ulong)DateTime.UtcNow.Subtract(DateTime.UnixEpoch).TotalSeconds; @@ -604,7 +604,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache for (int index = 0; index < program.Shaders.Length; index++) { - var shader = program.Shaders[index]; + CachedShaderStage shader = program.Shaders[index]; if (shader == null) { continue; @@ -646,8 +646,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// GPU context public void ClearSharedCache() { - using var tocFileStream = DiskCacheCommon.OpenFile(_basePath, SharedTocFileName, writable: true); - using var dataFileStream = DiskCacheCommon.OpenFile(_basePath, SharedDataFileName, writable: true); + using FileStream tocFileStream = DiskCacheCommon.OpenFile(_basePath, SharedTocFileName, writable: true); + using FileStream dataFileStream = DiskCacheCommon.OpenFile(_basePath, SharedDataFileName, writable: true); tocFileStream.SetLength(0); dataFileStream.SetLength(0); @@ -659,8 +659,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// GPU context public void ClearHostCache(GpuContext context) { - using var tocFileStream = DiskCacheCommon.OpenFile(_basePath, GetHostTocFileName(context), writable: true); - using var dataFileStream = DiskCacheCommon.OpenFile(_basePath, GetHostDataFileName(context), writable: true); + using FileStream tocFileStream = DiskCacheCommon.OpenFile(_basePath, GetHostTocFileName(context), writable: true); + using FileStream dataFileStream = DiskCacheCommon.OpenFile(_basePath, GetHostDataFileName(context), writable: true); tocFileStream.SetLength(0); dataFileStream.SetLength(0); @@ -681,8 +681,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache DiskCacheOutputStreams streams, ulong timestamp) { - var tocFileStream = streams != null ? streams.HostTocFileStream : DiskCacheCommon.OpenFile(_basePath, GetHostTocFileName(context), writable: true); - var dataFileStream = streams != null ? streams.HostDataFileStream : DiskCacheCommon.OpenFile(_basePath, GetHostDataFileName(context), writable: true); + FileStream tocFileStream = streams != null ? streams.HostTocFileStream : DiskCacheCommon.OpenFile(_basePath, GetHostTocFileName(context), writable: true); + FileStream dataFileStream = streams != null ? streams.HostDataFileStream : DiskCacheCommon.OpenFile(_basePath, GetHostDataFileName(context), writable: true); if (tocFileStream.Length == 0) { @@ -737,7 +737,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// Magic value to be written /// Shader codegen version, only valid for the host file /// File creation timestamp - private static void CreateToc(Stream tocFileStream, ref TocHeader header, uint magic, uint codegenVersion, ulong timestamp) + private static void CreateToc(FileStream tocFileStream, ref TocHeader header, uint magic, uint codegenVersion, ulong timestamp) { BinarySerializer writer = new(tocFileStream); @@ -844,25 +844,25 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache for (int index = 0; index < info.CBuffers.Count; index++) { - var entry = info.CBuffers[index]; + BufferDescriptor entry = info.CBuffers[index]; dataWriter.WriteWithMagicAndSize(ref entry, BufdMagic); } for (int index = 0; index < info.SBuffers.Count; index++) { - var entry = info.SBuffers[index]; + BufferDescriptor entry = info.SBuffers[index]; dataWriter.WriteWithMagicAndSize(ref entry, BufdMagic); } for (int index = 0; index < info.Textures.Count; index++) { - var entry = info.Textures[index]; + TextureDescriptor entry = info.Textures[index]; dataWriter.WriteWithMagicAndSize(ref entry, TexdMagic); } for (int index = 0; index < info.Images.Count; index++) { - var entry = info.Images[index]; + TextureDescriptor entry = info.Images[index]; dataWriter.WriteWithMagicAndSize(ref entry, TexdMagic); } } diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs index 20f96462e..a0d3e8c15 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs @@ -302,10 +302,10 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache Logger.Info?.Print(LogClass.Gpu, $"Rebuilding {_programList.Count} shaders..."); - using var streams = _hostStorage.GetOutputStreams(_context); + using DiskCacheOutputStreams streams = _hostStorage.GetOutputStreams(_context); int packagedShaders = 0; - foreach (var kv in _programList) + foreach (KeyValuePair kv in _programList) { if (!Active) { @@ -648,7 +648,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache } CachedShaderStage[] shaders = new CachedShaderStage[guestShaders.Length]; - List translatedStages = new(); + List translatedStages = []; TranslatorContext previousStage = null; @@ -720,9 +720,9 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache ShaderProgram program = translatorContext.Translate(); - CachedShaderStage[] shaders = new[] { new CachedShaderStage(program.Info, shader.Code, shader.Cb1Data) }; + CachedShaderStage[] shaders = [new(program.Info, shader.Code, shader.Cb1Data)]; - _compilationQueue.Enqueue(new ProgramCompilation(new[] { program }, shaders, newSpecState, programIndex, isCompute: true)); + _compilationQueue.Enqueue(new ProgramCompilation([program], shaders, newSpecState, programIndex, isCompute: true)); } /// diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ShaderBinarySerializer.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ShaderBinarySerializer.cs index a18b5780e..f30973a09 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ShaderBinarySerializer.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ShaderBinarySerializer.cs @@ -1,3 +1,4 @@ +using Microsoft.IO; using Ryujinx.Common; using Ryujinx.Common.Memory; using Ryujinx.Graphics.GAL; @@ -12,7 +13,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache { public static byte[] Pack(ShaderSource[] sources) { - using MemoryStream output = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream output = MemoryStreamManager.Shared.GetStream(); output.Write(sources.Length); @@ -31,7 +32,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache using MemoryStream input = new(code); using BinaryReader reader = new(input); - List output = new(); + List output = []; int count = reader.ReadInt32(); diff --git a/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs b/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs index 1be75f242..393584bd4 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs @@ -4,6 +4,7 @@ using Ryujinx.Graphics.Shader; using Ryujinx.Graphics.Shader.Translation; using System; using System.Runtime.InteropServices; +using TextureDescriptor = Ryujinx.Graphics.Gpu.Image.TextureDescriptor; namespace Ryujinx.Graphics.Gpu.Shader { @@ -177,7 +178,7 @@ namespace Ryujinx.Graphics.Gpu.Shader public TextureFormat QueryTextureFormat(int handle, int cbufSlot) { _state.SpecializationState?.RecordTextureFormat(_stageIndex, handle, cbufSlot); - var descriptor = GetTextureDescriptor(handle, cbufSlot); + TextureDescriptor descriptor = GetTextureDescriptor(handle, cbufSlot); return ConvertToTextureFormat(descriptor.UnpackFormat(), descriptor.UnpackSrgb()); } diff --git a/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs b/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs index 765bef7d4..694b67ab9 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelGraphicsState.cs @@ -133,7 +133,7 @@ namespace Ryujinx.Graphics.Gpu.Shader }; } - bool isQuad = Topology == PrimitiveTopology.Quads || Topology == PrimitiveTopology.QuadStrip; + bool isQuad = Topology is PrimitiveTopology.Quads or PrimitiveTopology.QuadStrip; bool halvePrimitiveId = !hostSupportsQuads && !hasGeometryShader && isQuad; return new GpuGraphicsState( diff --git a/src/Ryujinx.Graphics.Gpu/Shader/HashTable/PartitionHashTable.cs b/src/Ryujinx.Graphics.Gpu/Shader/HashTable/PartitionHashTable.cs index 3971526e5..894621c22 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/HashTable/PartitionHashTable.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/HashTable/PartitionHashTable.cs @@ -122,7 +122,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.HashTable /// public PartitionHashTable() { - _buckets = Array.Empty(); + _buckets = []; } /// @@ -234,7 +234,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.HashTable } else { - (bucket.MoreEntries ??= new List()).Add(entry); + (bucket.MoreEntries ??= []).Add(entry); } } diff --git a/src/Ryujinx.Graphics.Gpu/Shader/HashTable/PartitionedHashTable.cs b/src/Ryujinx.Graphics.Gpu/Shader/HashTable/PartitionedHashTable.cs index b4c18058c..b8d782554 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/HashTable/PartitionedHashTable.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/HashTable/PartitionedHashTable.cs @@ -104,7 +104,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.HashTable /// public PartitionedHashTable() { - _sizeTable = new List(); + _sizeTable = []; } /// diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index 4fc66c4c0..2ab413848 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -117,7 +117,7 @@ namespace Ryujinx.Graphics.Gpu.Shader private static string GetDiskCachePath() { return GraphicsConfig.EnableShaderCache && GraphicsConfig.TitleId != null - ? Path.Combine(AppDataManager.GamesDirPath, GraphicsConfig.TitleId, "cache", "shader") + ? Path.Combine(AppDataManager.GamesDirPath, GraphicsConfig.TitleId.ToLower(), "cache", "shader") : null; } diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCacheHashTable.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCacheHashTable.cs index e65a1dec9..0b981ff58 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCacheHashTable.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCacheHashTable.cs @@ -156,7 +156,7 @@ namespace Ryujinx.Graphics.Gpu.Shader { IdTable idTable = new(); - foreach (var shader in program.Shaders) + foreach (CachedShaderStage shader in program.Shaders) { if (shader == null) { @@ -192,7 +192,7 @@ namespace Ryujinx.Graphics.Gpu.Shader if (!_shaderPrograms.TryGetValue(idTable, out ShaderSpecializationList specList)) { - specList = new ShaderSpecializationList(); + specList = []; _shaderPrograms.Add(idTable, specList); } @@ -221,7 +221,7 @@ namespace Ryujinx.Graphics.Gpu.Shader out CachedShaderProgram program, out CachedGraphicsGuestCode guestCode) { - var memoryManager = channel.MemoryManager; + MemoryManager memoryManager = channel.MemoryManager; IdTable idTable = new(); guestCode = new CachedGraphicsGuestCode(); @@ -270,9 +270,9 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Programs added to the table public IEnumerable GetPrograms() { - foreach (var specList in _shaderPrograms.Values) + foreach (ShaderSpecializationList specList in _shaderPrograms.Values) { - foreach (var program in specList) + foreach (CachedShaderProgram program in specList) { yield return program; } diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs index 49823562f..c74c612a5 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs @@ -60,8 +60,8 @@ namespace Ryujinx.Graphics.Gpu.Shader for (int index = 0; index < totalSets; index++) { - _resourceDescriptors[index] = new(); - _resourceUsages[index] = new(); + _resourceDescriptors[index] = []; + _resourceUsages[index] = []; } AddDescriptor(SupportBufferStages, ResourceType.UniformBuffer, uniformSetIndex, 0, 1); @@ -280,7 +280,7 @@ namespace Ryujinx.Graphics.Gpu.Shader for (int index = oldLength; index <= setIndex; index++) { - _resourceDescriptors[index] = new(); + _resourceDescriptors[index] = []; } } @@ -301,7 +301,7 @@ namespace Ryujinx.Graphics.Gpu.Shader for (int index = oldLength; index <= setIndex; index++) { - _resourceUsages[index] = new(); + _resourceUsages[index] = []; } } @@ -350,8 +350,8 @@ namespace Ryujinx.Graphics.Gpu.Shader { int totalSets = _resourceDescriptors.Length; - var descriptors = new ResourceDescriptorCollection[totalSets]; - var usages = new ResourceUsageCollection[totalSets]; + ResourceDescriptorCollection[] descriptors = new ResourceDescriptorCollection[totalSets]; + ResourceUsageCollection[] usages = new ResourceUsageCollection[totalSets]; for (int index = 0; index < totalSets; index++) { diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationList.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationList.cs index 3c2f0b9be..8549af715 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationList.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationList.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// class ShaderSpecializationList : IEnumerable { - private readonly List _entries = new(); + private readonly List _entries = []; /// /// Adds a program to the list. @@ -33,7 +33,7 @@ namespace Ryujinx.Graphics.Gpu.Shader ref GpuChannelGraphicsState graphicsState, out CachedShaderProgram program) { - foreach (var entry in _entries) + foreach (CachedShaderProgram entry in _entries) { bool vertexAsCompute = entry.VertexAsCompute != null; bool usesDrawParameters = entry.Shaders[1]?.Info.UsesDrawParameters ?? false; @@ -65,7 +65,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// True if a compatible program is found, false otherwise public bool TryFindForCompute(GpuChannel channel, GpuChannelPoolState poolState, GpuChannelComputeState computeState, out CachedShaderProgram program) { - foreach (var entry in _entries) + foreach (CachedShaderProgram entry in _entries) { if (entry.SpecializationState.MatchesCompute(channel, ref poolState, computeState, true)) { diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs index 1230c0580..4bb4392e1 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs @@ -6,10 +6,12 @@ using Ryujinx.Graphics.Gpu.Shader.DiskCache; using Ryujinx.Graphics.Shader; using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using TextureDescriptor = Ryujinx.Graphics.Shader.TextureDescriptor; namespace Ryujinx.Graphics.Gpu.Shader { @@ -214,23 +216,23 @@ namespace Ryujinx.Graphics.Gpu.Shader CachedShaderStage stage = stages[i]; if (stage?.Info != null) { - var textures = stage.Info.Textures; - var images = stage.Info.Images; + ReadOnlyCollection textures = stage.Info.Textures; + ReadOnlyCollection images = stage.Info.Images; - var texBindings = new Box[textures.Count]; - var imageBindings = new Box[images.Count]; + Box[] texBindings = new Box[textures.Count]; + Box[] imageBindings = new Box[images.Count]; int stageIndex = Math.Max(i - 1, 0); // Don't count VertexA for looking up spec state. No-Op for compute. for (int j = 0; j < textures.Count; j++) { - var texture = textures[j]; + TextureDescriptor texture = textures[j]; texBindings[j] = GetTextureSpecState(stageIndex, texture.HandleIndex, texture.CbufSlot); } for (int j = 0; j < images.Count; j++) { - var image = images[j]; + TextureDescriptor image = images[j]; imageBindings[j] = GetTextureSpecState(stageIndex, image.HandleIndex, image.CbufSlot); } @@ -753,7 +755,7 @@ namespace Ryujinx.Graphics.Gpu.Shader ReadOnlySpan cachedTextureBuffer = Span.Empty; ReadOnlySpan cachedSamplerBuffer = Span.Empty; - foreach (var kv in _allTextures) + foreach (KeyValuePair> kv in _allTextures) { TextureKey textureKey = kv.Key; @@ -1009,10 +1011,10 @@ namespace Ryujinx.Graphics.Gpu.Shader ushort count = (ushort)_textureSpecialization.Count; dataWriter.Write(ref count); - foreach (var kv in _textureSpecialization) + foreach (KeyValuePair> kv in _textureSpecialization) { - var textureKey = kv.Key; - var textureState = kv.Value; + TextureKey textureKey = kv.Key; + Box textureState = kv.Value; dataWriter.WriteWithMagicAndSize(ref textureKey, TexkMagic); dataWriter.WriteWithMagicAndSize(ref textureState.Value, TexsMagic); @@ -1023,10 +1025,10 @@ namespace Ryujinx.Graphics.Gpu.Shader count = (ushort)_textureArrayFromBufferSpecialization.Count; dataWriter.Write(ref count); - foreach (var kv in _textureArrayFromBufferSpecialization) + foreach (KeyValuePair kv in _textureArrayFromBufferSpecialization) { - var textureKey = kv.Key; - var length = kv.Value; + TextureKey textureKey = kv.Key; + int length = kv.Value; dataWriter.WriteWithMagicAndSize(ref textureKey, TexkMagic); dataWriter.Write(ref length); @@ -1038,10 +1040,10 @@ namespace Ryujinx.Graphics.Gpu.Shader count = (ushort)_textureArrayFromPoolSpecialization.Count; dataWriter.Write(ref count); - foreach (var kv in _textureArrayFromPoolSpecialization) + foreach (KeyValuePair kv in _textureArrayFromPoolSpecialization) { - var textureKey = kv.Key; - var length = kv.Value; + bool textureKey = kv.Key; + int length = kv.Value; dataWriter.WriteWithMagicAndSize(ref textureKey, TexkMagic); dataWriter.Write(ref length); diff --git a/src/Ryujinx.Graphics.Gpu/Synchronization/SynchronizationManager.cs b/src/Ryujinx.Graphics.Gpu/Synchronization/SynchronizationManager.cs index 1042a4db8..d51b0ef60 100644 --- a/src/Ryujinx.Graphics.Gpu/Synchronization/SynchronizationManager.cs +++ b/src/Ryujinx.Graphics.Gpu/Synchronization/SynchronizationManager.cs @@ -87,7 +87,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization } using ManualResetEvent waitEvent = new(false); - var info = _syncpoints[id].RegisterCallback(threshold, (x) => waitEvent.Set()); + SyncpointWaiterHandle info = _syncpoints[id].RegisterCallback(threshold, _ => waitEvent.Set()); if (info == null) { @@ -96,7 +96,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization bool signaled = waitEvent.WaitOne(timeout); - if (!signaled && info != null) + if (!signaled) { Logger.Error?.Print(LogClass.Gpu, $"Wait on syncpoint {id} for threshold {threshold} took more than {timeout.TotalMilliseconds}ms, resuming execution..."); diff --git a/src/Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs b/src/Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs index a1626c853..b2e0abf21 100644 --- a/src/Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs +++ b/src/Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs @@ -24,7 +24,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization public Syncpoint(uint id) { Id = id; - _waiters = new List(); + _waiters = []; } /// @@ -92,7 +92,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization } else { - expiredList ??= new List(); + expiredList ??= []; expiredList.Add(item); } diff --git a/src/Ryujinx.Graphics.Gpu/Window.cs b/src/Ryujinx.Graphics.Gpu/Window.cs index 59cd4c8a6..5c3463f2a 100644 --- a/src/Ryujinx.Graphics.Gpu/Window.cs +++ b/src/Ryujinx.Graphics.Gpu/Window.cs @@ -1,5 +1,6 @@ using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu.Image; +using Ryujinx.Graphics.Gpu.Memory; using Ryujinx.Graphics.Texture; using Ryujinx.Memory.Range; using System; @@ -137,7 +138,7 @@ namespace Ryujinx.Graphics.Gpu Action releaseCallback, object userObj) { - if (!_context.PhysicalMemoryRegistry.TryGetValue(pid, out var physicalMemory)) + if (!_context.PhysicalMemoryRegistry.TryGetValue(pid, out PhysicalMemory physicalMemory)) { return false; } diff --git a/src/Ryujinx.Graphics.Host1x/Devices.cs b/src/Ryujinx.Graphics.Host1x/Devices.cs index 9de2b81a9..984a5abd6 100644 --- a/src/Ryujinx.Graphics.Host1x/Devices.cs +++ b/src/Ryujinx.Graphics.Host1x/Devices.cs @@ -20,7 +20,7 @@ namespace Ryujinx.Graphics.Host1x public void Dispose() { - foreach (var device in _devices.Values) + foreach (IDeviceState device in _devices.Values) { if (device is ThiDevice thi) { diff --git a/src/Ryujinx.Graphics.Host1x/Host1xDevice.cs b/src/Ryujinx.Graphics.Host1x/Host1xDevice.cs index 2db74ce5e..bf9b14f89 100644 --- a/src/Ryujinx.Graphics.Host1x/Host1xDevice.cs +++ b/src/Ryujinx.Graphics.Host1x/Host1xDevice.cs @@ -46,7 +46,7 @@ namespace Ryujinx.Graphics.Host1x public void RegisterDevice(ClassId classId, IDeviceState device) { - var thi = new ThiDevice(classId, device ?? throw new ArgumentNullException(nameof(device)), _syncptIncrMgr); + ThiDevice thi = new(classId, device ?? throw new ArgumentNullException(nameof(device)), _syncptIncrMgr); _devices.RegisterDevice(classId, thi); } diff --git a/src/Ryujinx.Graphics.Host1x/Ryujinx.Graphics.Host1x.csproj b/src/Ryujinx.Graphics.Host1x/Ryujinx.Graphics.Host1x.csproj index 92077e26a..3000d41de 100644 --- a/src/Ryujinx.Graphics.Host1x/Ryujinx.Graphics.Host1x.csproj +++ b/src/Ryujinx.Graphics.Host1x/Ryujinx.Graphics.Host1x.csproj @@ -1,7 +1,6 @@ - net8.0 $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.Host1x/SyncptIncrManager.cs b/src/Ryujinx.Graphics.Host1x/SyncptIncrManager.cs index a5ee1198c..ee8a4a739 100644 --- a/src/Ryujinx.Graphics.Host1x/SyncptIncrManager.cs +++ b/src/Ryujinx.Graphics.Host1x/SyncptIncrManager.cs @@ -23,7 +23,7 @@ namespace Ryujinx.Graphics.Host1x } } - private readonly List _incrs = new(); + private readonly List _incrs = []; private uint _currentId; diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs new file mode 100644 index 000000000..f8fe7d2e7 --- /dev/null +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/CAMetalLayerExtensions.cs @@ -0,0 +1,22 @@ +using SharpMetal; +using SharpMetal.Foundation; +using SharpMetal.ObjectiveCCore; +using SharpMetal.QuartzCore; +using System.Runtime.Versioning; +// ReSharper disable InconsistentNaming + +namespace Ryujinx.Graphics.Metal.SharpMetalExtensions +{ + [SupportedOSPlatform("macOS")] + public static class CAMetalLayerExtensions + { + private static readonly Selector sel_developerHUDProperties = "developerHUDProperties"; + private static readonly Selector sel_setDeveloperHUDProperties = "setDeveloperHUDProperties:"; + + public static NSDictionary GetDeveloperHudProperties(this CAMetalLayer metalLayer) + => new(ObjectiveCRuntime.IntPtr_objc_msgSend(metalLayer.NativePtr, sel_developerHUDProperties)); + + public static void SetDeveloperHudProperties(this CAMetalLayer metalLayer, NSDictionary dictionary) + => ObjectiveCRuntime.objc_msgSend(metalLayer.NativePtr, sel_setDeveloperHUDProperties, dictionary); + } +} diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs new file mode 100644 index 000000000..dc2495d07 --- /dev/null +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/NSHelper.cs @@ -0,0 +1,32 @@ +using SharpMetal.Foundation; +using SharpMetal.ObjectiveCCore; +using System.Runtime.Versioning; +// ReSharper disable InconsistentNaming + +namespace Ryujinx.Graphics.Metal.SharpMetalExtensions +{ + [SupportedOSPlatform("macOS")] + public static class NSHelper + { + private static readonly Selector sel_getCStringMaxLengthEncoding = "getCString:maxLength:encoding:"; + private static readonly Selector sel_stringWithUTF8String = "stringWithUTF8String:"; + + public static unsafe string ToDotNetString(this NSString source) + { + char[] sourceBuffer = new char[source.Length]; + fixed (char* pSourceBuffer = sourceBuffer) + { + ObjectiveC.bool_objc_msgSend(source, + sel_getCStringMaxLengthEncoding, + pSourceBuffer, + source.MaximumLengthOfBytes(NSStringEncoding.UTF16) + 1, + (ulong)NSStringEncoding.UTF16); + } + + return new string(sourceBuffer); + } + + public static NSString ToNSString(this string source) + => new(ObjectiveC.IntPtr_objc_msgSend(new ObjectiveCClass(nameof(NSString)), sel_stringWithUTF8String, source)); + } +} diff --git a/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj new file mode 100644 index 000000000..1e75b4d26 --- /dev/null +++ b/src/Ryujinx.Graphics.Metal.SharpMetalExtensions/Ryujinx.Graphics.Metal.SharpMetalExtensions.csproj @@ -0,0 +1,11 @@ + + + enable + enable + true + + + + + + diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/H264/SpsAndPpsReconstruction.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/H264/SpsAndPpsReconstruction.cs index 6d012f89a..5e9e2869e 100644 --- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/H264/SpsAndPpsReconstruction.cs +++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/H264/SpsAndPpsReconstruction.cs @@ -118,8 +118,8 @@ namespace Ryujinx.Graphics.Nvdec.FFmpeg.H264 } // ZigZag LUTs from libavcodec. - private static ReadOnlySpan ZigZagDirect => new byte[] - { + private static ReadOnlySpan ZigZagDirect => + [ 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, @@ -127,16 +127,16 @@ namespace Ryujinx.Graphics.Nvdec.FFmpeg.H264 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - }; + 53, 60, 61, 54, 47, 55, 62, 63 + ]; - private static ReadOnlySpan ZigZagScan => new byte[] - { + private static ReadOnlySpan ZigZagScan => + [ 0 + 0 * 4, 1 + 0 * 4, 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 2 + 0 * 4, 3 + 0 * 4, 2 + 1 * 4, 1 + 2 * 4, 0 + 3 * 4, 1 + 3 * 4, 2 + 2 * 4, - 3 + 1 * 4, 3 + 2 * 4, 2 + 3 * 4, 3 + 3 * 4, - }; + 3 + 1 * 4, 3 + 2 * 4, 2 + 3 * 4, 3 + 3 * 4 + ]; private static void WriteScalingList(ref H264BitStreamWriter writer, IArray list) { diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec.cs index b5ef710b1..098622b2a 100644 --- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec.cs +++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec.cs @@ -1,5 +1,3 @@ -using System; - namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native { struct AVCodec diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec501.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec501.cs index d745e9f04..256ccd0a8 100644 --- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec501.cs +++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodec501.cs @@ -1,5 +1,3 @@ -using System; - namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native { struct AVCodec501 diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodecContext.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodecContext.cs index 1de0a13e4..96c1a0f67 100644 --- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodecContext.cs +++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVCodecContext.cs @@ -1,5 +1,4 @@ using Ryujinx.Common.Memory; -using System; namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native { diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVFrame.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVFrame.cs index 97c30c718..46b1e06a7 100644 --- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVFrame.cs +++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/AVFrame.cs @@ -1,5 +1,4 @@ using Ryujinx.Common.Memory; -using System; namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native { diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodec.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodec.cs index 95926298c..09bcc9c31 100644 --- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodec.cs +++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodec.cs @@ -1,5 +1,3 @@ -using System; - namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native { struct FFCodec where T : struct diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodecLegacy.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodecLegacy.cs index 873d2518a..ee0db4730 100644 --- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodecLegacy.cs +++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFCodecLegacy.cs @@ -1,5 +1,3 @@ -using System; - namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native { struct FFCodecLegacy where T : struct diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs index 7b0c2a8ad..f78bad75d 100644 --- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs +++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs @@ -12,8 +12,8 @@ namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native private static readonly Dictionary _librariesWhitelist = new() { - { AvCodecLibraryName, (58, 59) }, - { AvUtilLibraryName, (56, 57) }, + { AvCodecLibraryName, (59, 60) }, + { AvUtilLibraryName, (57, 58) }, }; private static string FormatLibraryNameForCurrentOs(string libraryName, int version) @@ -36,12 +36,11 @@ namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native } } - private static bool TryLoadWhitelistedLibrary(string libraryName, Assembly assembly, DllImportSearchPath? searchPath, out nint handle) { handle = nint.Zero; - if (_librariesWhitelist.TryGetValue(libraryName, out var value)) + if (_librariesWhitelist.TryGetValue(libraryName, out (int, int) value)) { (int minVersion, int maxVersion) = value; diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Ryujinx.Graphics.Nvdec.FFmpeg.csproj b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Ryujinx.Graphics.Nvdec.FFmpeg.csproj index 7659c4b25..9e250d171 100644 --- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Ryujinx.Graphics.Nvdec.FFmpeg.csproj +++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Ryujinx.Graphics.Nvdec.FFmpeg.csproj @@ -1,7 +1,6 @@  - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Surface.cs b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Surface.cs index c13cfe1aa..023b470f2 100644 --- a/src/Ryujinx.Graphics.Nvdec.FFmpeg/Surface.cs +++ b/src/Ryujinx.Graphics.Nvdec.FFmpeg/Surface.cs @@ -1,6 +1,5 @@ using Ryujinx.Graphics.Nvdec.FFmpeg.Native; using Ryujinx.Graphics.Video; -using System; namespace Ryujinx.Graphics.Nvdec.FFmpeg { diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/BitDepth.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/BitDepth.cs index a43c83580..fdf0aff9c 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/BitDepth.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/BitDepth.cs @@ -2,8 +2,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { internal enum BitDepth { - Bits8 = 8, /**< 8 bits */ - Bits10 = 10, /**< 10 bits */ - Bits12 = 12, /**< 12 bits */ + Bits8 = 8, // < 8 bits + Bits10 = 10, // < 10 bits + Bits12 = 12, // < 12 bits } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/CodecErr.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/CodecErr.cs index 3bd149df4..331e0c13f 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/CodecErr.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/CodecErr.cs @@ -2,55 +2,74 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { internal enum CodecErr { - /*!\brief Operation completed without error */ - CodecOk, + /// + /// Operation completed without error + /// + Ok, - /*!\brief Unspecified error */ - CodecError, + /// + /// Unspecified error + /// + Error, - /*!\brief Memory operation failed */ - CodecMemError, + /// + /// Memory operation failed + /// + MemError, - /*!\brief ABI version mismatch */ - CodecAbiMismatch, + /// + /// ABI version mismatch + /// + AbiMismatch, - /*!\brief Algorithm does not have required capability */ - CodecIncapable, + /// + /// Algorithm does not have required capability + /// + Incapable, - /*!\brief The given bitstream is not supported. - * - * The bitstream was unable to be parsed at the highest level. The decoder - * is unable to proceed. This error \ref SHOULD be treated as fatal to the - * stream. */ - CodecUnsupBitstream, + /// + /// The given bitstream is not supported. + /// + /// + /// The bitstream was unable to be parsed at the highest level.
+ /// The decoder is unable to proceed.
+ /// This error SHOULD be treated as fatal to the stream. + ///
+ UnsupBitstream, - /*!\brief Encoded bitstream uses an unsupported feature - * - * The decoder does not implement a feature required by the encoder. This - * return code should only be used for features that prevent future - * pictures from being properly decoded. This error \ref MAY be treated as - * fatal to the stream or \ref MAY be treated as fatal to the current GOP. - */ - CodecUnsupFeature, + /// + /// Encoded bitstream uses an unsupported feature + /// + /// + /// The decoder does not implement a feature required by the encoder.
+ /// This return code should only be used for features that prevent future + /// pictures from being properly decoded.
+ ///
+ /// This error MAY be treated as fatal to the stream or MAY be treated as fatal to the current GOP. + ///
+ UnsupFeature, - /*!\brief The coded data for this stream is corrupt or incomplete - * - * There was a problem decoding the current frame. This return code - * should only be used for failures that prevent future pictures from - * being properly decoded. This error \ref MAY be treated as fatal to the - * stream or \ref MAY be treated as fatal to the current GOP. If decoding - * is continued for the current GOP, artifacts may be present. - */ - CodecCorruptFrame, + /// + /// The coded data for this stream is corrupt or incomplete. + /// + /// + /// There was a problem decoding the current frame.
+ /// This return code should only be used + /// for failures that prevent future pictures from being properly decoded.
+ ///
+ /// This error MAY be treated as fatal to the stream or MAY be treated as fatal to the current GOP.
+ /// If decoding is continued for the current GOP, artifacts may be present. + ///
+ CorruptFrame, - /*!\brief An application-supplied parameter is not valid. - * - */ - CodecInvalidParam, + /// + /// An application-supplied parameter is not valid. + /// + InvalidParam, - /*!\brief An iterator reached the end of list. - * - */ - CodecListEnd, + /// + /// An iterator reached the end of list. + /// + ListEnd } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Common/BitUtils.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Common/BitUtils.cs index 807f1293e..82a2aa47f 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Common/BitUtils.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Common/BitUtils.cs @@ -10,7 +10,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Common [MethodImpl(MethodImplOptions.AggressiveInlining)] public static byte ClipPixel(int val) { - return (byte)((val > 255) ? 255 : (val < 0) ? 0 : val); + return (byte)(val > 255 ? 255 : val < 0 ? 0 : val); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Common/MemoryAllocator.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Common/MemoryAllocator.cs index 18ed172f8..c98052094 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Common/MemoryAllocator.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Common/MemoryAllocator.cs @@ -51,6 +51,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Common { Marshal.FreeHGlobal(item.Pointer); } + item.Pointer = ptr; item.Length = lengthInBytes; break; @@ -58,7 +59,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Common } } - return new ArrayPtr(ptr, length); + ArrayPtr allocation = new(ptr, length); + + allocation.AsSpan().Clear(); + + return allocation; } public unsafe void Free(ArrayPtr arr) where T : unmanaged diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Constants.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Constants.cs index 17efb203b..69a34239d 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Constants.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Constants.cs @@ -1,8 +1,10 @@ +using Ryujinx.Graphics.Nvdec.Vp9.Types; + namespace Ryujinx.Graphics.Nvdec.Vp9 { internal static class Constants { - public const int Vp9InterpExtend = 4; + public const int InterpExtend = 4; public const int MaxMbPlane = 3; @@ -25,6 +27,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 /* Segment Feature Masks */ public const int MaxMvRefCandidates = 2; + public const int IntraInterContexts = 4; public const int CompInterContexts = 5; public const int RefContexts = 5; @@ -32,12 +35,26 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 public const int EightTapSmooth = 1; public const int EightTapSharp = 2; public const int SwitchableFilters = 3; /* Number of switchable filters */ + public const int Bilinear = 3; - public const int Switchable = 4; /* should be the last one */ + + // The codec can operate in four possible inter prediction filter mode: + // 8-tap, 8-tap-smooth, 8-tap-sharp, and switching between the three. + public const int SwitchableFilterContexts = SwitchableFilters + 1; + public const int Switchable = 4; /* Should be the last one */ // Frame public const int RefsPerFrame = 3; + public const int RefFramesLog2 = 3; + public const int RefFrames = 1 << RefFramesLog2; + + // 1 scratch frame for the new frame, 3 for scaled references on the encoder. + public const int FrameBuffers = RefFrames + 4; + + public const int FrameContextsLog2 = 2; + public const int FrameContexts = 1 << FrameContextsLog2; + public const int NumPingPongBuffers = 2; public const int Class0Bits = 1; /* bits at integer precision for class 0 */ @@ -48,9 +65,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 public const int MvLow = -(1 << MvInUseBits); // Coefficient token alphabet - public const int ZeroToken = 0; // 0 Extra Bits 0+0 - public const int OneToken = 1; // 1 Extra Bits 0+1 - public const int TwoToken = 2; // 2 Extra Bits 0+1 + public const int ZeroToken = 0; // 0 Extra Bits 0+0 + public const int OneToken = 1; // 1 Extra Bits 0+1 + public const int TwoToken = 2; // 2 Extra Bits 0+1 public const int PivotNode = 2; @@ -65,5 +82,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 public const int SegmentAbsData = 1; public const int MaxSegments = 8; + + public const int PartitionTypes = (int)PartitionType.PartitionTypes; + + public const int PartitionPlOffset = 4; // Number of probability models per block size + public const int PartitionContexts = 4 * PartitionPlOffset; + + public const int PlaneTypes = (int)PlaneType.PlaneTypes; + + public const int IntraModes = (int)PredictionMode.TmPred + 1; + + public const int InterModes = 1 + (int)PredictionMode.NewMv - (int)PredictionMode.NearestMv; + + public const int SkipContexts = 3; + public const int InterModeContexts = 7; } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/DSubExp.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/DSubExp.cs new file mode 100644 index 000000000..b25f04ad0 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/DSubExp.cs @@ -0,0 +1,47 @@ +using System.Diagnostics; + +namespace Ryujinx.Graphics.Nvdec.Vp9 +{ + internal static class DSubExp + { + public static int InvRecenterNonneg(int v, int m) + { + if (v > 2 * m) + { + return v; + } + + return (v & 1) != 0 ? m - ((v + 1) >> 1) : m + (v >> 1); + } + + private static readonly byte[] _invMapTable = + [ + 7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176, 189, 202, 215, 228, 241, 254, 1, 2, 3, 4, + 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 253 + ]; + + public static int InvRemapProb(int v, int m) + { + Debug.Assert(v < _invMapTable.Length / sizeof(byte)); + + v = _invMapTable[v]; + m--; + if (m << 1 <= Prob.MaxProb) + { + return 1 + InvRecenterNonneg(v, m); + } + + return Prob.MaxProb - InvRecenterNonneg(v, Prob.MaxProb - 1 - m); + } + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/DecodeFrame.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/DecodeFrame.cs index 5f03e1afc..541f29e96 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/DecodeFrame.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/DecodeFrame.cs @@ -12,14 +12,96 @@ using System.Threading.Tasks; namespace Ryujinx.Graphics.Nvdec.Vp9 { - static class DecodeFrame + internal static class DecodeFrame { private static bool ReadIsValid(ArrayPtr start, int len) { return len != 0 && len <= start.Length; } - private static void InverseTransformBlockInter(ref MacroBlockD xd, int plane, TxSize txSize, Span dst, int stride, int eob) + private static void ReadTxModeProbs(ref Vp9EntropyProbs txProbs, ref Reader r) + { + for (int i = 0; i < EntropyMode.TxSizeContexts; ++i) + { + for (int j = 0; j < (int)TxSize.TxSizes - 3; ++j) + { + r.DiffUpdateProb(ref txProbs.Tx8x8Prob[i][j]); + } + } + + for (int i = 0; i < EntropyMode.TxSizeContexts; ++i) + { + for (int j = 0; j < (int)TxSize.TxSizes - 2; ++j) + { + r.DiffUpdateProb(ref txProbs.Tx16x16Prob[i][j]); + } + } + + for (int i = 0; i < EntropyMode.TxSizeContexts; ++i) + { + for (int j = 0; j < (int)TxSize.TxSizes - 1; ++j) + { + r.DiffUpdateProb(ref txProbs.Tx32x32Prob[i][j]); + } + } + } + + private static void ReadSwitchableInterpProbs(ref Vp9EntropyProbs fc, ref Reader r) + { + for (int j = 0; j < Constants.SwitchableFilterContexts; ++j) + { + for (int i = 0; i < Constants.SwitchableFilters - 1; ++i) + { + r.DiffUpdateProb(ref fc.SwitchableInterpProb[j][i]); + } + } + } + + private static void ReadInterModeProbs(ref Vp9EntropyProbs fc, ref Reader r) + { + for (int i = 0; i < Constants.InterModeContexts; ++i) + { + for (int j = 0; j < Constants.InterModes - 1; ++j) + { + r.DiffUpdateProb(ref fc.InterModeProb[i][j]); + } + } + } + + private static void ReadMvProbs(ref Vp9EntropyProbs ctx, bool allowHp, ref Reader r) + { + r.UpdateMvProbs(ctx.Joints.AsSpan(), EntropyMv.Joints - 1); + + for (int i = 0; i < 2; ++i) + { + r.UpdateMvProbs(MemoryMarshal.CreateSpan(ref ctx.Sign[i], 1), 1); + r.UpdateMvProbs(ctx.Classes[i].AsSpan(), EntropyMv.Classes - 1); + r.UpdateMvProbs(ctx.Class0[i].AsSpan(), EntropyMv.Class0Size - 1); + r.UpdateMvProbs(ctx.Bits[i].AsSpan(), EntropyMv.OffsetBits); + } + + for (int i = 0; i < 2; ++i) + { + for (int j = 0; j < EntropyMv.Class0Size; ++j) + { + r.UpdateMvProbs(ctx.Class0Fp[i][j].AsSpan(), EntropyMv.FpSize - 1); + } + + r.UpdateMvProbs(ctx.Fp[i].AsSpan(), 3); + } + + if (allowHp) + { + for (int i = 0; i < 2; ++i) + { + r.UpdateMvProbs(MemoryMarshal.CreateSpan(ref ctx.Class0Hp[i], 1), 1); + r.UpdateMvProbs(MemoryMarshal.CreateSpan(ref ctx.Hp[i], 1), 1); + } + } + } + + private static void InverseTransformBlockInter(ref MacroBlockD xd, int plane, TxSize txSize, Span dst, + int stride, int eob) { ref MacroBlockDPlane pd = ref xd.Plane[plane]; ArrayPtr dqcoeff = pd.DqCoeff; @@ -29,23 +111,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 Span dst16 = MemoryMarshal.Cast(dst); if (xd.Lossless) { - Idct.HighbdIwht4x4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); + Idct.HighbdIwht4X4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); } else { switch (txSize) { - case TxSize.Tx4x4: - Idct.HighbdIdct4x4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); + case TxSize.Tx4X4: + Idct.HighbdIdct4X4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); break; - case TxSize.Tx8x8: - Idct.HighbdIdct8x8Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); + case TxSize.Tx8X8: + Idct.HighbdIdct8X8Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); break; - case TxSize.Tx16x16: - Idct.HighbdIdct16x16Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); + case TxSize.Tx16X16: + Idct.HighbdIdct16X16Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); break; - case TxSize.Tx32x32: - Idct.HighbdIdct32x32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); + case TxSize.Tx32X32: + Idct.HighbdIdct32X32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); break; default: Debug.Assert(false, "Invalid transform size"); @@ -57,23 +139,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { if (xd.Lossless) { - Idct.Iwht4x4Add(dqcoeff.AsSpan(), dst, stride, eob); + Idct.Iwht4X4Add(dqcoeff.AsSpan(), dst, stride, eob); } else { switch (txSize) { - case TxSize.Tx4x4: - Idct.Idct4x4Add(dqcoeff.AsSpan(), dst, stride, eob); + case TxSize.Tx4X4: + Idct.Idct4X4Add(dqcoeff.AsSpan(), dst, stride, eob); break; - case TxSize.Tx8x8: - Idct.Idct8x8Add(dqcoeff.AsSpan(), dst, stride, eob); + case TxSize.Tx8X8: + Idct.Idct8X8Add(dqcoeff.AsSpan(), dst, stride, eob); break; - case TxSize.Tx16x16: - Idct.Idct16x16Add(dqcoeff.AsSpan(), dst, stride, eob); + case TxSize.Tx16X16: + Idct.Idct16X16Add(dqcoeff.AsSpan(), dst, stride, eob); break; - case TxSize.Tx32x32: - Idct.Idct32x32Add(dqcoeff.AsSpan(), dst, stride, eob); + case TxSize.Tx32X32: + Idct.Idct32X32Add(dqcoeff.AsSpan(), dst, stride, eob); break; default: Debug.Assert(false, "Invalid transform size"); @@ -88,11 +170,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } else { - if (txSize <= TxSize.Tx16x16 && eob <= 10) + if (txSize <= TxSize.Tx16X16 && eob <= 10) { dqcoeff.AsSpan()[..(4 * (4 << (int)txSize))].Clear(); } - else if (txSize == TxSize.Tx32x32 && eob <= 34) + else if (txSize == TxSize.Tx32X32 && eob <= 34) { dqcoeff.AsSpan()[..256].Clear(); } @@ -120,23 +202,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 Span dst16 = MemoryMarshal.Cast(dst); if (xd.Lossless) { - Idct.HighbdIwht4x4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); + Idct.HighbdIwht4X4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); } else { switch (txSize) { - case TxSize.Tx4x4: - Idct.HighbdIht4x4Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); + case TxSize.Tx4X4: + Idct.HighbdIht4X4Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); break; - case TxSize.Tx8x8: - Idct.HighbdIht8x8Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); + case TxSize.Tx8X8: + Idct.HighbdIht8X8Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); break; - case TxSize.Tx16x16: - Idct.HighbdIht16x16Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); + case TxSize.Tx16X16: + Idct.HighbdIht16X16Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); break; - case TxSize.Tx32x32: - Idct.HighbdIdct32x32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); + case TxSize.Tx32X32: + Idct.HighbdIdct32X32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); break; default: Debug.Assert(false, "Invalid transform size"); @@ -148,23 +230,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { if (xd.Lossless) { - Idct.Iwht4x4Add(dqcoeff.AsSpan(), dst, stride, eob); + Idct.Iwht4X4Add(dqcoeff.AsSpan(), dst, stride, eob); } else { switch (txSize) { - case TxSize.Tx4x4: - Idct.Iht4x4Add(txType, dqcoeff.AsSpan(), dst, stride, eob); + case TxSize.Tx4X4: + Idct.Iht4X4Add(txType, dqcoeff.AsSpan(), dst, stride, eob); break; - case TxSize.Tx8x8: - Idct.Iht8x8Add(txType, dqcoeff.AsSpan(), dst, stride, eob); + case TxSize.Tx8X8: + Idct.Iht8X8Add(txType, dqcoeff.AsSpan(), dst, stride, eob); break; - case TxSize.Tx16x16: - Idct.Iht16x16Add(txType, dqcoeff.AsSpan(), dst, stride, eob); + case TxSize.Tx16X16: + Idct.Iht16X16Add(txType, dqcoeff.AsSpan(), dst, stride, eob); break; - case TxSize.Tx32x32: - Idct.Idct32x32Add(dqcoeff.AsSpan(), dst, stride, eob); + case TxSize.Tx32X32: + Idct.Idct32X32Add(dqcoeff.AsSpan(), dst, stride, eob); break; default: Debug.Assert(false, "Invalid transform size"); @@ -179,11 +261,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } else { - if (txType == TxType.DctDct && txSize <= TxSize.Tx16x16 && eob <= 10) + if (txType == TxType.DctDct && txSize <= TxSize.Tx16X16 && eob <= 10) { dqcoeff.AsSpan()[..(4 * (4 << (int)txSize))].Clear(); } - else if (txSize == TxSize.Tx32x32 && eob <= 34) + else if (txSize == TxSize.Tx32X32 && eob <= 34) { dqcoeff.AsSpan()[..256].Clear(); } @@ -204,12 +286,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { ref MacroBlockD xd = ref twd.Xd; ref MacroBlockDPlane pd = ref xd.Plane[plane]; - PredictionMode mode = (plane == 0) ? mi.Mode : mi.UvMode; - int dstOffset = 4 * row * pd.Dst.Stride + 4 * col; + PredictionMode mode = plane == 0 ? mi.Mode : mi.UvMode; + int dstOffset = (4 * row * pd.Dst.Stride) + (4 * col); byte* dst = &pd.Dst.Buf.ToPointer()[dstOffset]; Span dstSpan = pd.Dst.Buf.AsSpan()[dstOffset..]; - if (mi.SbType < BlockSize.Block8x8) + if (mi.SbType < BlockSize.Block8X8) { if (plane == 0) { @@ -217,15 +299,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } - ReconIntra.PredictIntraBlock(ref xd, pd.N4Wl, txSize, mode, dst, pd.Dst.Stride, dst, pd.Dst.Stride, col, row, plane); + ReconIntra.PredictIntraBlock(ref xd, pd.N4Wl, txSize, mode, dst, pd.Dst.Stride, dst, pd.Dst.Stride, col, + row, plane); if (mi.Skip == 0) { TxType txType = - (plane != 0 || xd.Lossless) ? TxType.DctDct : ReconIntra.IntraModeToTxTypeLookup[(int)mode]; - var sc = (plane != 0 || xd.Lossless) - ? Luts.Vp9DefaultScanOrders[(int)txSize] - : Luts.Vp9ScanOrders[(int)txSize][(int)txType]; + plane != 0 || xd.Lossless ? TxType.DctDct : ReconIntra.IntraModeToTxTypeLookup[(int)mode]; + Luts.ScanOrder sc = plane != 0 || xd.Lossless + ? Luts.DefaultScanOrders[(int)txSize] + : Luts.ScanOrders[(int)txSize][(int)txType]; int eob = Detokenize.DecodeBlockTokens(ref twd, plane, sc, col, row, txSize, mi.SegmentId); if (eob > 0) { @@ -244,14 +327,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { ref MacroBlockD xd = ref twd.Xd; ref MacroBlockDPlane pd = ref xd.Plane[plane]; - var sc = Luts.Vp9DefaultScanOrders[(int)txSize]; + Luts.ScanOrder sc = Luts.DefaultScanOrders[(int)txSize]; int eob = Detokenize.DecodeBlockTokens(ref twd, plane, sc, col, row, txSize, mi.SegmentId); - Span dst = pd.Dst.Buf.AsSpan()[(4 * row * pd.Dst.Stride + 4 * col)..]; + Span dst = pd.Dst.Buf.AsSpan()[((4 * row * pd.Dst.Stride) + (4 * col))..]; if (eob > 0) { InverseTransformBlockInter(ref xd, plane, txSize, dst, pd.Dst.Stride, eob); } + return eob; } @@ -268,7 +352,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int h) { // Get a pointer to the start of the real data for this row. - byte* refRow = src - x - y * srcStride; + byte* refRow = src - x - (y * srcStride); if (y >= h) { @@ -340,7 +424,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { // Get a pointer to the start of the real data for this row. ushort* src = (ushort*)src8; - ushort* refRow = src - x - y * srcStride; + ushort* refRow = src - x - (y * srcStride); if (y >= h) { @@ -483,9 +567,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int refr) { ref MacroBlockDPlane pd = ref xd.Plane[plane]; - byte* dst = dstBuf.Buf.ToPointer() + dstBuf.Stride * y + x; + byte* dst = dstBuf.Buf.ToPointer() + (dstBuf.Stride * y) + x; Mv32 scaledMv; - int xs, ys, x0, y0, x0_16, y0_16, frameWidth, frameHeight, bufStride, subpelX, subpelY; + int xs, ys, x0, y0, x016, y016, frameWidth, frameHeight, bufStride, subpelX, subpelY; byte* refFrame; byte* bufPtr; @@ -507,16 +591,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { Mv mvQ4 = ReconInter.ClampMvToUmvBorderSb(ref xd, ref mv, bw, bh, pd.SubsamplingX, pd.SubsamplingY); // Co-ordinate of containing block to pixel precision. - int xStart = (-xd.MbToLeftEdge >> (3 + pd.SubsamplingX)); - int yStart = (-xd.MbToTopEdge >> (3 + pd.SubsamplingY)); + int xStart = -xd.MbToLeftEdge >> (3 + pd.SubsamplingX); + int yStart = -xd.MbToTopEdge >> (3 + pd.SubsamplingY); // Co-ordinate of the block to 1/16th pixel precision. - x0_16 = (xStart + x) << Filter.SubpelBits; - y0_16 = (yStart + y) << Filter.SubpelBits; + x016 = (xStart + x) << Filter.SubpelBits; + y016 = (yStart + y) << Filter.SubpelBits; // Co-ordinate of current block in reference frame // to 1/16th pixel precision. - x0_16 = sf.ScaleValueX(x0_16); - y0_16 = sf.ScaleValueY(y0_16); + x016 = sf.ScaleValueX(x016); + y016 = sf.ScaleValueY(y016); // Map the top left corner of the block into the reference frame. x0 = sf.ScaleValueX(xStart + x); @@ -535,13 +619,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 y0 = (-xd.MbToTopEdge >> (3 + pd.SubsamplingY)) + y; // Co-ordinate of the block to 1/16th pixel precision. - x0_16 = x0 << Filter.SubpelBits; - y0_16 = y0 << Filter.SubpelBits; + x016 = x0 << Filter.SubpelBits; + y016 = y0 << Filter.SubpelBits; scaledMv.Row = mv.Row * (1 << (1 - pd.SubsamplingY)); scaledMv.Col = mv.Col * (1 << (1 - pd.SubsamplingX)); xs = ys = 16; } + subpelX = scaledMv.Col & Filter.SubpelMask; subpelY = scaledMv.Row & Filter.SubpelMask; @@ -549,34 +634,35 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // reference frame. x0 += scaledMv.Col >> Filter.SubpelBits; y0 += scaledMv.Row >> Filter.SubpelBits; - x0_16 += scaledMv.Col; - y0_16 += scaledMv.Row; + x016 += scaledMv.Col; + y016 += scaledMv.Row; // Get reference block pointer. - bufPtr = refFrame + y0 * preBuf.Stride + x0; + bufPtr = refFrame + (y0 * preBuf.Stride) + x0; bufStride = preBuf.Stride; // Do border extension if there is motion or the // width/height is not a multiple of 8 pixels. - if (isScaled || scaledMv.Col != 0 || scaledMv.Row != 0 || (frameWidth & 0x7) != 0 || (frameHeight & 0x7) != 0) + if (isScaled || scaledMv.Col != 0 || scaledMv.Row != 0 || (frameWidth & 0x7) != 0 || + (frameHeight & 0x7) != 0) { - int y1 = ((y0_16 + (h - 1) * ys) >> Filter.SubpelBits) + 1; + int y1 = ((y016 + ((h - 1) * ys)) >> Filter.SubpelBits) + 1; // Get reference block bottom right horizontal coordinate. - int x1 = ((x0_16 + (w - 1) * xs) >> Filter.SubpelBits) + 1; + int x1 = ((x016 + ((w - 1) * xs)) >> Filter.SubpelBits) + 1; int xPad = 0, yPad = 0; - if (subpelX != 0 || (sf.XStepQ4 != Filter.SubpelShifts)) + if (subpelX != 0 || sf.XStepQ4 != Filter.SubpelShifts) { - x0 -= Constants.Vp9InterpExtend - 1; - x1 += Constants.Vp9InterpExtend; + x0 -= Constants.InterpExtend - 1; + x1 += Constants.InterpExtend; xPad = 1; } - if (subpelY != 0 || (sf.YStepQ4 != Filter.SubpelShifts)) + if (subpelY != 0 || sf.YStepQ4 != Filter.SubpelShifts) { - y0 -= Constants.Vp9InterpExtend - 1; - y1 += Constants.Vp9InterpExtend; + y0 -= Constants.InterpExtend - 1; + y1 += Constants.InterpExtend; yPad = 1; } @@ -585,10 +671,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 y0 < 0 || y0 > frameHeight - 1 || y1 < 0 || y1 > frameHeight - 1) { // Extend the border. - byte* bufPtr1 = refFrame + y0 * bufStride + x0; + byte* bufPtr1 = refFrame + (y0 * bufStride) + x0; int bW = x1 - x0 + 1; int bH = y1 - y0 + 1; - int borderOffset = yPad * 3 * bW + xPad * 3; + int borderOffset = (yPad * 3 * bW) + (xPad * 3); ExtendAndPredict( bufPtr1, @@ -612,7 +698,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 refr, xs, ys); - return; } } @@ -660,7 +745,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int miX = miCol * Constants.MiSize; int miY = miRow * Constants.MiSize; ref ModeInfo mi = ref xd.Mi[0].Value; - Array8[] kernel = Luts.Vp9FilterKernels[mi.InterpFilter]; + Array8[] kernel = Luts.FilterKernels[mi.InterpFilter]; BlockSize sbType = mi.SbType; int isCompound = mi.HasSecondRef() ? 1 : 0; int refr; @@ -675,28 +760,30 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (!sf.IsValidScale()) { - xd.ErrorInfo.Value.InternalError(CodecErr.CodecUnsupBitstream, "Reference frame has invalid dimensions"); + xd.ErrorInfo.Value.InternalError(CodecErr.UnsupBitstream, + "Reference frame has invalid dimensions"); } isScaled = sf.IsScaled(); - ReconInter.SetupPrePlanes(ref xd, refr, ref refFrameBuf, miRow, miCol, isScaled ? new Ptr(ref sf) : Ptr.Null); + ReconInter.SetupPrePlanes(ref xd, refr, ref refFrameBuf, miRow, miCol, + isScaled ? new Ptr(ref sf) : Ptr.Null); xd.BlockRefs[refr] = new Ptr(ref refBuf); - if (sbType < BlockSize.Block8x8) + if (sbType < BlockSize.Block8X8) { for (plane = 0; plane < Constants.MaxMbPlane; ++plane) { ref MacroBlockDPlane pd = ref xd.Plane[plane]; ref Buf2D dstBuf = ref pd.Dst; - int num4x4W = pd.N4W; - int num4x4H = pd.N4H; - int n4Wx4 = 4 * num4x4W; - int n4Hx4 = 4 * num4x4H; + int num4X4W = pd.N4W; + int num4X4H = pd.N4H; + int n4Wx4 = 4 * num4X4W; + int n4Hx4 = 4 * num4X4H; ref Buf2D preBuf = ref pd.Pre[refr]; - int i = 0, x, y; - for (y = 0; y < num4x4H; ++y) + int i = 0; + for (int y = 0; y < num4X4H; ++y) { - for (x = 0; x < num4x4W; ++x) + for (int x = 0; x < num4X4W; ++x) { Mv mv = ReconInter.AverageSplitMvs(ref pd, ref mi, refr, i++); DecBuildInterPredictors( @@ -729,10 +816,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { ref MacroBlockDPlane pd = ref xd.Plane[plane]; ref Buf2D dstBuf = ref pd.Dst; - int num4x4W = pd.N4W; - int num4x4H = pd.N4H; - int n4Wx4 = 4 * num4x4W; - int n4Hx4 = 4 * num4x4H; + int num4X4W = pd.N4W; + int num4X4H = pd.N4H; + int n4Wx4 = 4 * num4X4W; + int n4Hx4 = 4 * num4X4H; ref Buf2D preBuf = ref pd.Pre[refr]; DecBuildInterPredictors( ref xd, @@ -758,21 +845,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } - private static unsafe void DecResetSkipContext(ref MacroBlockD xd) - { - int i; - for (i = 0; i < Constants.MaxMbPlane; i++) - { - ref MacroBlockDPlane pd = ref xd.Plane[i]; - MemoryUtil.Fill(pd.AboveContext.ToPointer(), (sbyte)0, pd.N4W); - MemoryUtil.Fill(pd.LeftContext.ToPointer(), (sbyte)0, pd.N4H); - } - } - private static void SetPlaneN4(ref MacroBlockD xd, int bw, int bh, int bwl, int bhl) { - int i; - for (i = 0; i < Constants.MaxMbPlane; i++) + for (int i = 0; i < Constants.MaxMbPlane; i++) { xd.Plane[i].N4W = (ushort)((bw << 1) >> xd.Plane[i].SubsamplingX); xd.Plane[i].N4H = (ushort)((bh << 1) >> xd.Plane[i].SubsamplingY); @@ -794,18 +869,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int bwl, int bhl) { - int offset = miRow * cm.MiStride + miCol; - int x, y; + int offset = (miRow * cm.MiStride) + miCol; + ref TileInfo tile = ref xd.Tile; xd.Mi = cm.MiGridVisible.Slice(offset); xd.Mi[0] = new Ptr(ref cm.Mi[offset]); xd.Mi[0].Value.SbType = bsize; - for (y = 0; y < yMis; ++y) + for (int y = 0; y < yMis; ++y) { - for (x = y == 0 ? 1 : 0; x < xMis; ++x) + for (int x = y == 0 ? 1 : 0; x < xMis; ++x) { - xd.Mi[y * cm.MiStride + x] = xd.Mi[0]; + xd.Mi[(y * cm.MiStride) + x] = xd.Mi[0]; } } @@ -818,7 +893,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 xd.SetMiRowCol(ref tile, miRow, bh, miCol, bw, cm.MiRows, cm.MiCols); ReconInter.SetupDstPlanes(ref xd.Plane, ref xd.CurBuf, miRow, miCol); - return ref xd.Mi[0].Value; } @@ -831,7 +905,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int bwl, int bhl) { - bool less8x8 = bsize < BlockSize.Block8x8; + bool less8X8 = bsize < BlockSize.Block8X8; int bw = 1 << (bwl - 1); int bh = 1 << (bhl - 1); int xMis = Math.Min(bw, cm.MiCols - miCol); @@ -841,12 +915,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ref ModeInfo mi = ref SetOffsets(ref cm, ref xd, bsize, miRow, miCol, bw, bh, xMis, yMis, bwl, bhl); - if (bsize >= BlockSize.Block8x8 && (cm.SubsamplingX != 0 || cm.SubsamplingY != 0)) + if (bsize >= BlockSize.Block8X8 && (cm.SubsamplingX != 0 || cm.SubsamplingY != 0)) { BlockSize uvSubsize = Luts.SsSizeLookup[(int)bsize][cm.SubsamplingX][cm.SubsamplingY]; if (uvSubsize == BlockSize.BlockInvalid) { - xd.ErrorInfo.Value.InternalError(CodecErr.CodecCorruptFrame, "Invalid block size."); + xd.ErrorInfo.Value.InternalError(CodecErr.CorruptFrame, "Invalid block size."); } } @@ -854,7 +928,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (mi.Skip != 0) { - DecResetSkipContext(ref xd); + xd.DecResetSkipContext(); } if (!mi.IsInterBlock()) @@ -864,12 +938,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { ref MacroBlockDPlane pd = ref xd.Plane[plane]; TxSize txSize = plane != 0 ? mi.GetUvTxSize(ref pd) : mi.TxSize; - int num4x4W = pd.N4W; - int num4x4H = pd.N4H; + int num4X4W = pd.N4W; + int num4X4H = pd.N4H; int step = 1 << (int)txSize; int row, col; - int maxBlocksWide = num4x4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX)); - int maxBlocksHigh = num4x4H + (xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY)); + int maxBlocksWide = + num4X4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX)); + int maxBlocksHigh = + num4X4H + (xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY)); xd.MaxBlocksWide = (uint)(xd.MbToRightEdge >= 0 ? 0 : maxBlocksWide); xd.MaxBlocksHigh = (uint)(xd.MbToBottomEdge >= 0 ? 0 : maxBlocksHigh); @@ -898,12 +974,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { ref MacroBlockDPlane pd = ref xd.Plane[plane]; TxSize txSize = plane != 0 ? mi.GetUvTxSize(ref pd) : mi.TxSize; - int num4x4W = pd.N4W; - int num4x4H = pd.N4H; + int num4X4W = pd.N4W; + int num4X4H = pd.N4H; int step = 1 << (int)txSize; int row, col; - int maxBlocksWide = num4x4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX)); - int maxBlocksHigh = num4x4H + (xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY)); + int maxBlocksWide = + num4X4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX)); + int maxBlocksHigh = num4X4H + + (xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY)); xd.MaxBlocksWide = (uint)(xd.MbToRightEdge >= 0 ? 0 : maxBlocksWide); xd.MaxBlocksHigh = (uint)(xd.MbToBottomEdge >= 0 ? 0 : maxBlocksHigh); @@ -917,7 +995,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } - if (!less8x8 && eobtotal == 0) + if (!less8X8 && eobtotal == 0) { mi.Skip = 1; // Skip loopfilter } @@ -932,15 +1010,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } - private static int DecPartitionPlaneContext(ref TileWorkerData twd, int miRow, int miCol, int bsl) - { - ref sbyte aboveCtx = ref twd.Xd.AboveSegContext[miCol]; - ref sbyte leftCtx = ref twd.Xd.LeftSegContext[miRow & Constants.MiMask]; - int above = (aboveCtx >> bsl) & 1, left = (leftCtx >> bsl) & 1; - - return (left * 2 + above) + bsl * Constants.PartitionPloffset; - } - private static void DecUpdatePartitionContext( ref TileWorkerData twd, int miRow, @@ -949,7 +1018,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int bw) { Span aboveCtx = twd.Xd.AboveSegContext.Slice(miCol).AsSpan(); - Span leftCtx = MemoryMarshal.CreateSpan(ref twd.Xd.LeftSegContext[miRow & Constants.MiMask], 8 - (miRow & Constants.MiMask)); + Span leftCtx = MemoryMarshal.CreateSpan(ref twd.Xd.LeftSegContext[miRow & Constants.MiMask], + 8 - (miRow & Constants.MiMask)); // Update the partition context at the end notes. Set partition bits // of block sizes larger than the current one to be one, and partition @@ -966,14 +1036,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int hasCols, int bsl) { - int ctx = DecPartitionPlaneContext(ref twd, miRow, miCol, bsl); + int ctx = twd.DecPartitionPlaneContext(miRow, miCol, bsl); ReadOnlySpan probs = MemoryMarshal.CreateReadOnlySpan(ref twd.Xd.PartitionProbs[ctx][0], 3); PartitionType p; ref Reader r = ref twd.BitReader; if (hasRows != 0 && hasCols != 0) { - p = (PartitionType)r.ReadTree(Luts.Vp9PartitionTree, probs); + p = (PartitionType)r.ReadTree(Luts.PartitionTree, probs); } else if (hasRows == 0 && hasCols != 0) { @@ -1002,15 +1072,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int miRow, int miCol, BlockSize bsize, - int n4x4L2) + int n4X4L2) { - int n8x8L2 = n4x4L2 - 1; - int num8x8Wh = 1 << n8x8L2; - int hbs = num8x8Wh >> 1; + int n8X8L2 = n4X4L2 - 1; + int num8X8Wh = 1 << n8X8L2; + int hbs = num8X8Wh >> 1; PartitionType partition; BlockSize subsize; - bool hasRows = (miRow + hbs) < cm.MiRows; - bool hasCols = (miCol + hbs) < cm.MiCols; + bool hasRows = miRow + hbs < cm.MiRows; + bool hasCols = miCol + hbs < cm.MiCols; ref MacroBlockD xd = ref twd.Xd; if (miRow >= cm.MiRows || miCol >= cm.MiCols) @@ -1018,7 +1088,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 return; } - partition = ReadPartition(ref twd, miRow, miCol, hasRows ? 1 : 0, hasCols ? 1 : 0, n8x8L2); + partition = ReadPartition(ref twd, miRow, miCol, hasRows ? 1 : 0, hasCols ? 1 : 0, n8X8L2); subsize = Luts.SubsizeLookup[(int)partition][(int)bsize]; if (hbs == 0) { @@ -1032,29 +1102,29 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 switch (partition) { case PartitionType.PartitionNone: - DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4x4L2, n4x4L2); + DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4X4L2, n4X4L2); break; case PartitionType.PartitionHorz: - DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4x4L2, n8x8L2); + DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4X4L2, n8X8L2); if (hasRows) { - DecodeBlock(ref twd, ref cm, miRow + hbs, miCol, subsize, n4x4L2, n8x8L2); + DecodeBlock(ref twd, ref cm, miRow + hbs, miCol, subsize, n4X4L2, n8X8L2); } break; case PartitionType.PartitionVert: - DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n8x8L2, n4x4L2); + DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n8X8L2, n4X4L2); if (hasCols) { - DecodeBlock(ref twd, ref cm, miRow, miCol + hbs, subsize, n8x8L2, n4x4L2); + DecodeBlock(ref twd, ref cm, miRow, miCol + hbs, subsize, n8X8L2, n4X4L2); } break; case PartitionType.PartitionSplit: - DecodePartition(ref twd, ref cm, miRow, miCol, subsize, n8x8L2); - DecodePartition(ref twd, ref cm, miRow, miCol + hbs, subsize, n8x8L2); - DecodePartition(ref twd, ref cm, miRow + hbs, miCol, subsize, n8x8L2); - DecodePartition(ref twd, ref cm, miRow + hbs, miCol + hbs, subsize, n8x8L2); + DecodePartition(ref twd, ref cm, miRow, miCol, subsize, n8X8L2); + DecodePartition(ref twd, ref cm, miRow, miCol + hbs, subsize, n8X8L2); + DecodePartition(ref twd, ref cm, miRow + hbs, miCol, subsize, n8X8L2); + DecodePartition(ref twd, ref cm, miRow + hbs, miCol + hbs, subsize, n8X8L2); break; default: Debug.Assert(false, "Invalid partition type"); @@ -1063,9 +1133,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } // Update partition context - if (bsize >= BlockSize.Block8x8 && (bsize == BlockSize.Block8x8 || partition != PartitionType.PartitionSplit)) + if (bsize >= BlockSize.Block8X8 && + (bsize == BlockSize.Block8X8 || partition != PartitionType.PartitionSplit)) { - DecUpdatePartitionContext(ref twd, miRow, miCol, subsize, num8x8Wh); + DecUpdatePartitionContext(ref twd, miRow, miCol, subsize, num8X8Wh); } } @@ -1079,15 +1150,256 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // partition can't be fully read then throw an error. if (!ReadIsValid(data, readSize)) { - errorInfo.InternalError(CodecErr.CodecCorruptFrame, "Truncated packet or corrupt tile length"); + errorInfo.InternalError(CodecErr.CorruptFrame, "Truncated packet or corrupt tile length"); } if (r.Init(data, readSize)) { - errorInfo.InternalError(CodecErr.CodecMemError, "Failed to allocate bool decoder 1"); + errorInfo.InternalError(CodecErr.MemError, "Failed to allocate bool decoder 1"); } } + private static void ReadCoefProbsCommon(ref Array2>>>> coefProbs, + ref Reader r, int txSize) + { + if (r.ReadBit() != 0) + { + for (int i = 0; i < Constants.PlaneTypes; ++i) + { + for (int j = 0; j < Entropy.RefTypes; ++j) + { + for (int k = 0; k < Entropy.CoefBands; ++k) + { + for (int l = 0; l < Entropy.BAND_COEFF_CONTEXTS(k); ++l) + { + for (int m = 0; m < Entropy.UnconstrainedNodes; ++m) + { + r.DiffUpdateProb(ref coefProbs[i][j][k][l][m]); + } + } + } + } + } + } + } + + private static void ReadCoefProbs(ref Vp9EntropyProbs fc, TxMode txMode, ref Reader r) + { + int maxTxSize = (int)Luts.TxModeToBiggestTxSize[(int)txMode]; + for (int txSize = (int)TxSize.Tx4X4; txSize <= maxTxSize; ++txSize) + { + ReadCoefProbsCommon(ref fc.CoefProbs[txSize], ref r, txSize); + } + } + + private static void SetupLoopfilter(ref Types.LoopFilter lf, ref ReadBitBuffer rb) + { + lf.FilterLevel = rb.ReadLiteral(6); + lf.SharpnessLevel = rb.ReadLiteral(3); + + // Read in loop filter deltas applied at the MB level based on mode or ref + // frame. + lf.ModeRefDeltaUpdate = false; + + lf.ModeRefDeltaEnabled = rb.ReadBit() != 0; + if (lf.ModeRefDeltaEnabled) + { + lf.ModeRefDeltaUpdate = rb.ReadBit() != 0; + if (lf.ModeRefDeltaUpdate) + { + for (int i = 0; i < LoopFilter.MaxRefLfDeltas; i++) + { + if (rb.ReadBit() != 0) + { + lf.RefDeltas[i] = (sbyte)rb.ReadSignedLiteral(6); + } + } + + for (int i = 0; i < LoopFilter.MaxModeLfDeltas; i++) + { + if (rb.ReadBit() != 0) + { + lf.ModeDeltas[i] = (sbyte)rb.ReadSignedLiteral(6); + } + } + } + } + } + + private static void SetupQuantization(ref Vp9Common cm, ref MacroBlockD xd, ref ReadBitBuffer rb) + { + cm.BaseQindex = rb.ReadLiteral(QuantCommon.QindexBits); + cm.YDcDeltaQ = rb.ReadDeltaQ(); + cm.UvDcDeltaQ = rb.ReadDeltaQ(); + cm.UvAcDeltaQ = rb.ReadDeltaQ(); + cm.DequantBitDepth = cm.BitDepth; + xd.Lossless = cm.BaseQindex == 0 && cm.YDcDeltaQ == 0 && cm.UvDcDeltaQ == 0 && cm.UvAcDeltaQ == 0; + + xd.Bd = (int)cm.BitDepth; + } + + private static readonly byte[] _literalToFilter = + [ + Constants.EightTapSmooth, Constants.EightTap, Constants.EightTapSharp, Constants.Bilinear + ]; + + private static byte ReadInterpFilter(ref ReadBitBuffer rb) + { + return rb.ReadBit() != 0 + ? (byte)Constants.Switchable + : _literalToFilter[rb.ReadLiteral(2)]; + } + + private static void SetupRenderSize(ref Vp9Common cm, ref ReadBitBuffer rb) + { + cm.RenderWidth = cm.Width; + cm.RenderHeight = cm.Height; + if (rb.ReadBit() != 0) + { + rb.ReadFrameSize(out cm.RenderWidth, out cm.RenderHeight); + } + } + + private static void SetupFrameSize(MemoryAllocator allocator, ref Vp9Common cm, ref ReadBitBuffer rb) + { + ref BufferPool pool = ref cm.BufferPool.Value; + rb.ReadFrameSize(out int width, out int height); + cm.ResizeContextBuffers(allocator, width, height); + SetupRenderSize(ref cm, ref rb); + + if (cm.GetFrameNewBuffer().ReallocFrameBuffer( + allocator, + cm.Width, + cm.Height, + cm.SubsamplingX, + cm.SubsamplingY, + cm.UseHighBitDepth, + Surface.DecBorderInPixels, + cm.ByteAlignment, + new Ptr(ref pool.FrameBufs[cm.NewFbIdx].RawFrameBuffer), + FrameBuffers.GetFrameBuffer, + pool.CbPriv) != 0) + { + cm.Error.InternalError(CodecErr.MemError, "Failed to allocate frame buffer"); + } + + pool.FrameBufs[cm.NewFbIdx].Released = 0; + pool.FrameBufs[cm.NewFbIdx].Buf.SubsamplingX = cm.SubsamplingX; + pool.FrameBufs[cm.NewFbIdx].Buf.SubsamplingY = cm.SubsamplingY; + pool.FrameBufs[cm.NewFbIdx].Buf.BitDepth = (uint)cm.BitDepth; + pool.FrameBufs[cm.NewFbIdx].Buf.ColorSpace = cm.ColorSpace; + pool.FrameBufs[cm.NewFbIdx].Buf.ColorRange = cm.ColorRange; + pool.FrameBufs[cm.NewFbIdx].Buf.RenderWidth = cm.RenderWidth; + pool.FrameBufs[cm.NewFbIdx].Buf.RenderHeight = cm.RenderHeight; + } + + private static bool ValidRefFrameImgFmt( + BitDepth refBitDepth, + int refXss, int refYss, + BitDepth thisBitDepth, + int thisXss, + int thisYss) + { + return refBitDepth == thisBitDepth && refXss == thisXss && refYss == thisYss; + } + + private static void SetupFrameSizeWithRefs(MemoryAllocator allocator, ref Vp9Common cm, + ref ReadBitBuffer rb) + { + int width = 0, height = 0; + bool found = false; + + bool hasValidRefFrame = false; + ref BufferPool pool = ref cm.BufferPool.Value; + for (int i = 0; i < Constants.RefsPerFrame; ++i) + { + if (rb.ReadBit() != 0) + { + if (cm.FrameRefs[i].Idx != RefBuffer.InvalidIdx) + { + ref Surface buf = ref cm.FrameRefs[i].Buf; + width = buf.YCropWidth; + height = buf.YCropHeight; + found = true; + break; + } + + cm.Error.InternalError(CodecErr.CorruptFrame, "Failed to decode frame size"); + } + } + + if (!found) + { + rb.ReadFrameSize(out width, out height); + } + + if (width <= 0 || height <= 0) + { + cm.Error.InternalError(CodecErr.CorruptFrame, "Invalid frame size"); + } + + // Check to make sure at least one of frames that this frame references + // has valid dimensions. + for (int i = 0; i < Constants.RefsPerFrame; ++i) + { + ref RefBuffer refFrame = ref cm.FrameRefs[i]; + hasValidRefFrame |= + refFrame.Idx != RefBuffer.InvalidIdx && + ScaleFactors.ValidRefFrameSize(refFrame.Buf.YCropWidth, refFrame.Buf.YCropHeight, width, + height); + } + + if (!hasValidRefFrame) + { + cm.Error.InternalError(CodecErr.CorruptFrame, "Referenced frame has invalid size"); + } + + for (int i = 0; i < Constants.RefsPerFrame; ++i) + { + ref RefBuffer refFrame = ref cm.FrameRefs[i]; + if (refFrame.Idx == RefBuffer.InvalidIdx || + !ValidRefFrameImgFmt( + (BitDepth)refFrame.Buf.BitDepth, + refFrame.Buf.SubsamplingX, + refFrame.Buf.SubsamplingY, + cm.BitDepth, + cm.SubsamplingX, + cm.SubsamplingY)) + { + cm.Error.InternalError(CodecErr.CorruptFrame, + "Referenced frame has incompatible color format"); + } + } + + cm.ResizeContextBuffers(allocator, width, height); + SetupRenderSize(ref cm, ref rb); + + if (cm.GetFrameNewBuffer().ReallocFrameBuffer( + allocator, + cm.Width, + cm.Height, + cm.SubsamplingX, + cm.SubsamplingY, + cm.UseHighBitDepth, + Surface.DecBorderInPixels, + cm.ByteAlignment, + new Ptr(ref pool.FrameBufs[cm.NewFbIdx].RawFrameBuffer), + FrameBuffers.GetFrameBuffer, + pool.CbPriv) != 0) + { + cm.Error.InternalError(CodecErr.MemError, "Failed to allocate frame buffer"); + } + + pool.FrameBufs[cm.NewFbIdx].Released = 0; + pool.FrameBufs[cm.NewFbIdx].Buf.SubsamplingX = cm.SubsamplingX; + pool.FrameBufs[cm.NewFbIdx].Buf.SubsamplingY = cm.SubsamplingY; + pool.FrameBufs[cm.NewFbIdx].Buf.BitDepth = (uint)cm.BitDepth; + pool.FrameBufs[cm.NewFbIdx].Buf.ColorSpace = cm.ColorSpace; + pool.FrameBufs[cm.NewFbIdx].Buf.ColorRange = cm.ColorRange; + pool.FrameBufs[cm.NewFbIdx].Buf.RenderWidth = cm.RenderWidth; + pool.FrameBufs[cm.NewFbIdx].Buf.RenderHeight = cm.RenderHeight; + } + // Reads the next tile returning its size and adjusting '*data' accordingly // based on 'isLast'. private static void GetTileBuffer( @@ -1102,7 +1414,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { if (!ReadIsValid(data, 4)) { - errorInfo.InternalError(CodecErr.CodecCorruptFrame, "Truncated packet or corrupt tile length"); + errorInfo.InternalError(CodecErr.CorruptFrame, "Truncated packet or corrupt tile length"); } size = BinaryPrimitives.ReadInt32BigEndian(data.AsSpan()); @@ -1110,7 +1422,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (size > data.Length) { - errorInfo.InternalError(CodecErr.CodecCorruptFrame, "Truncated packet or corrupt tile size"); + errorInfo.InternalError(CodecErr.CorruptFrame, "Truncated packet or corrupt tile size"); } } else @@ -1124,11 +1436,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 data = data.Slice(size); } - private static void GetTileBuffers(ref Vp9Common cm, ArrayPtr data, int tileCols, ref Array64 tileBuffers) + private static void GetTileBuffers(ref Vp9Common cm, ArrayPtr data, int tileCols, + ref Array64 tileBuffers) { - int c; - - for (c = 0; c < tileCols; ++c) + for (int c = 0; c < tileCols; ++c) { bool isLast = c == tileCols - 1; ref TileBuffer buf = ref tileBuffers[c]; @@ -1144,13 +1455,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int tileRows, ref Array4> tileBuffers) { - int r, c; - - for (r = 0; r < tileRows; ++r) + for (int r = 0; r < tileRows; ++r) { - for (c = 0; c < tileCols; ++c) + for (int c = 0; c < tileCols; ++c) { - bool isLast = (r == tileRows - 1) && (c == tileCols - 1); + bool isLast = r == tileRows - 1 && c == tileCols - 1; ref TileBuffer buf = ref tileBuffers[r][c]; GetTileBuffer(isLast, ref cm.Error, ref data, ref buf); } @@ -1167,7 +1476,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int miRow, miCol; Debug.Assert(tileRows <= 4); - Debug.Assert(tileCols <= (1 << 6)); + Debug.Assert(tileCols <= 1 << 6); // Note: this memset assumes above_context[0], [1] and [2] // are allocated as part of the same buffer. @@ -1183,7 +1492,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 for (tileCol = 0; tileCol < tileCols; ++tileCol) { ref TileBuffer buf = ref tileBuffers[tileRow][tileCol]; - ref TileWorkerData tileData = ref cm.TileWorkerData[tileCols * tileRow + tileCol]; + ref TileWorkerData tileData = ref cm.TileWorkerData[(tileCols * tileRow) + tileCol]; tileData.Xd = cm.Mb; tileData.Xd.Corrupted = false; tileData.Xd.Counts = cm.Counts; @@ -1203,28 +1512,30 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 for (tileCol = 0; tileCol < tileCols; ++tileCol) { int col = tileCol; - ref TileWorkerData tileData = ref cm.TileWorkerData[tileCols * tileRow + col]; + ref TileWorkerData tileData = ref cm.TileWorkerData[(tileCols * tileRow) + col]; tile.SetCol(ref cm, col); tileData.Xd.LeftContext = new Array3>(); tileData.Xd.LeftSegContext = new Array8(); for (miCol = tile.MiColStart; miCol < tile.MiColEnd; miCol += Constants.MiBlockSize) { - DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64x64, 4); + DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64X64, 4); } + cm.Mb.Corrupted |= tileData.Xd.Corrupted; if (cm.Mb.Corrupted) { - cm.Error.InternalError(CodecErr.CodecCorruptFrame, "Failed to decode tile data"); + cm.Error.InternalError(CodecErr.CorruptFrame, "Failed to decode tile data"); } } } } // Get last tile data. - return cm.TileWorkerData[tileCols * tileRows - 1].BitReader.FindEnd(); + return cm.TileWorkerData[(tileCols * tileRows) - 1].BitReader.FindEnd(); } - private static bool DecodeTileCol(ref TileWorkerData tileData, ref Vp9Common cm, ref Array64 tileBuffers) + private static bool DecodeTileCol(ref TileWorkerData tileData, ref Vp9Common cm, + ref Array64 tileBuffers) { ref TileInfo tile = ref tileData.Xd.Tile; int finalCol = (1 << cm.Log2TileCols) - 1; @@ -1251,7 +1562,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 tileData.Xd.LeftSegContext = new Array8(); for (int miCol = tile.MiColStart; miCol < tile.MiColEnd; miCol += Constants.MiBlockSize) { - DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64x64, 4); + DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64X64, 4); } } @@ -1262,7 +1573,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } while (!tileData.Xd.Corrupted && ++n <= tileData.BufEnd); tileData.DataEnd = bitReaderEnd; - return !tileData.Xd.Corrupted; } @@ -1276,9 +1586,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int numWorkers = Math.Min(maxThreads, tileCols); int n; - Debug.Assert(tileCols <= (1 << 6)); + Debug.Assert(tileCols <= 1 << 6); Debug.Assert(tileRows == 1); + LoopFilter.ResetLfm(ref cm); + cm.AboveContext.AsSpan().Clear(); cm.AboveSegContext.AsSpan().Clear(); @@ -1327,7 +1639,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 for (n = 0; n < numWorkers; ++n) { - int count = baseVal + (remain + n) / numWorkers; + int count = baseVal + ((remain + n) / numWorkers); ref TileWorkerData tileData = ref cm.TileWorkerData[n + totalTiles]; tileData.BufStart = bufStart; @@ -1364,7 +1676,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } Debug.Assert(!bitReaderEnd.IsNull || cm.Mb.Corrupted); - return bitReaderEnd; } @@ -1383,5 +1694,481 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 a[i] += c[i]; } } + + private static void ErrorHandler(Ptr data) + { + ref Vp9Common cm = ref data.Value; + cm.Error.InternalError(CodecErr.CorruptFrame, "Truncated packet"); + } + + private static void FlushAllFbOnKey(ref Vp9Common cm) + { + if (cm.FrameType == FrameType.KeyFrame && cm.CurrentVideoFrame > 0) + { + ref Array12 frameBufs = ref cm.BufferPool.Value.FrameBufs; + ref BufferPool pool = ref cm.BufferPool.Value; + + for (int i = 0; i < Constants.FrameBuffers; ++i) + { + if (i == cm.NewFbIdx) + { + continue; + } + + frameBufs[i].RefCount = 0; + if (frameBufs[i].Released == 0) + { + FrameBuffers.ReleaseFrameBuffer(pool.CbPriv, ref frameBufs[i].RawFrameBuffer); + frameBufs[i].Released = 1; + } + } + } + } + + private const int SyncCode0 = 0x49; + private const int SyncCode1 = 0x83; + private const int SyncCode2 = 0x42; + + private const int FrameMarker = 0x2; + + private static bool ReadSyncCode(ref ReadBitBuffer rb) + { + int readSyncCode0 = rb.ReadLiteral(8); + int readSyncCode1 = rb.ReadLiteral(8); + int readSyncCode2 = rb.ReadLiteral(8); + + return readSyncCode0 == SyncCode0 && + readSyncCode1 == SyncCode1 && + readSyncCode2 == SyncCode2; + } + + private static void RefCntFb(ref Array12 bufs, ref int idx, int newIdx) + { + int refIndex = idx; + + if (refIndex >= 0 && bufs[refIndex].RefCount > 0) + { + bufs[refIndex].RefCount--; + } + + idx = newIdx; + + bufs[newIdx].RefCount++; + } + + private static ulong ReadUncompressedHeader(MemoryAllocator allocator, ref Vp9Decoder pbi, + ref ReadBitBuffer rb) + { + ref Vp9Common cm = ref pbi.Common; + ref BufferPool pool = ref cm.BufferPool.Value; + ref Array12 frameBufs = ref pool.FrameBufs; + int mask, refIndex = 0; + ulong sz; + + cm.LastFrameType = cm.FrameType; + cm.LastIntraOnly = cm.IntraOnly; + + if (rb.ReadLiteral(2) != FrameMarker) + { + cm.Error.InternalError(CodecErr.UnsupBitstream, "Invalid frame marker"); + } + + cm.Profile = rb.ReadProfile(); + if (cm.Profile >= BitstreamProfile.MaxProfiles) + { + cm.Error.InternalError(CodecErr.UnsupBitstream, "Unsupported bitstream profile"); + } + + cm.ShowExistingFrame = rb.ReadBit(); + if (cm.ShowExistingFrame != 0) + { + // Show an existing frame directly. + int frameToShow = cm.RefFrameMap[rb.ReadLiteral(3)]; + if (frameToShow < 0 || frameBufs[frameToShow].RefCount < 1) + { + cm.Error.InternalError(CodecErr.UnsupBitstream, + $"Buffer {frameToShow} does not contain a decoded frame"); + } + + RefCntFb(ref frameBufs, ref cm.NewFbIdx, frameToShow); + pbi.RefreshFrameFlags = 0; + cm.Lf.FilterLevel = 0; + cm.ShowFrame = 1; + + return 0; + } + + cm.FrameType = (FrameType)rb.ReadBit(); + cm.ShowFrame = rb.ReadBit(); + cm.ErrorResilientMode = rb.ReadBit(); + + if (cm.FrameType == FrameType.KeyFrame) + { + if (!ReadSyncCode(ref rb)) + { + cm.Error.InternalError(CodecErr.UnsupBitstream, "Invalid frame sync code"); + } + + cm.ReadBitdepthColorspaceSampling(ref rb); + pbi.RefreshFrameFlags = (1 << Constants.RefFrames) - 1; + + for (int i = 0; i < Constants.RefsPerFrame; ++i) + { + cm.FrameRefs[i].Idx = RefBuffer.InvalidIdx; + cm.FrameRefs[i].Buf = default; + } + + SetupFrameSize(allocator, ref cm, ref rb); + if (pbi.NeedResync != 0) + { + cm.RefFrameMap.AsSpan().Fill(-1); + FlushAllFbOnKey(ref cm); + pbi.NeedResync = 0; + } + } + else + { + cm.IntraOnly = (cm.ShowFrame != 0 ? 0 : rb.ReadBit()) != 0; + + cm.ResetFrameContext = cm.ErrorResilientMode != 0 ? 0 : rb.ReadLiteral(2); + + if (cm.IntraOnly) + { + if (!ReadSyncCode(ref rb)) + { + cm.Error.InternalError(CodecErr.UnsupBitstream, "Invalid frame sync code"); + } + + if (cm.Profile > BitstreamProfile.Profile0) + { + cm.ReadBitdepthColorspaceSampling(ref rb); + } + else + { + // NOTE: The intra-only frame header does not include the specification + // of either the color format or color sub-sampling in profile 0. VP9 + // specifies that the default color format should be YUV 4:2:0 in this + // case (normative). + cm.ColorSpace = VpxColorSpace.Bt601; + cm.ColorRange = VpxColorRange.Studio; + cm.SubsamplingY = cm.SubsamplingX = 1; + cm.BitDepth = BitDepth.Bits8; + cm.UseHighBitDepth = false; + } + + pbi.RefreshFrameFlags = rb.ReadLiteral(Constants.RefFrames); + SetupFrameSize(allocator, ref cm, ref rb); + if (pbi.NeedResync != 0) + { + cm.RefFrameMap.AsSpan().Fill(-1); + pbi.NeedResync = 0; + } + } + else if (pbi.NeedResync != 1) + { + /* Skip if need resync */ + pbi.RefreshFrameFlags = rb.ReadLiteral(Constants.RefFrames); + for (int i = 0; i < Constants.RefsPerFrame; ++i) + { + int refr = rb.ReadLiteral(Constants.RefFramesLog2); + int idx = cm.RefFrameMap[refr]; + ref RefBuffer refFrame = ref cm.FrameRefs[i]; + refFrame.Idx = idx; + refFrame.Buf = frameBufs[idx].Buf; + cm.RefFrameSignBias[Constants.LastFrame + i] = (sbyte)rb.ReadBit(); + } + + SetupFrameSizeWithRefs(allocator, ref cm, ref rb); + + cm.AllowHighPrecisionMv = rb.ReadBit() != 0; + cm.InterpFilter = ReadInterpFilter(ref rb); + + for (int i = 0; i < Constants.RefsPerFrame; ++i) + { + ref RefBuffer refBuf = ref cm.FrameRefs[i]; + refBuf.Sf.SetupScaleFactorsForFrame( + refBuf.Buf.YCropWidth, + refBuf.Buf.YCropHeight, + cm.Width, + cm.Height); + } + } + } + + cm.GetFrameNewBuffer().BitDepth = (uint)cm.BitDepth; + cm.GetFrameNewBuffer().ColorSpace = cm.ColorSpace; + cm.GetFrameNewBuffer().ColorRange = cm.ColorRange; + cm.GetFrameNewBuffer().RenderWidth = cm.RenderWidth; + cm.GetFrameNewBuffer().RenderHeight = cm.RenderHeight; + + if (pbi.NeedResync != 0) + { + cm.Error.InternalError(CodecErr.CorruptFrame, + "Keyframe / intra-only frame required to reset decoder state"); + } + + if (cm.ErrorResilientMode == 0) + { + cm.RefreshFrameContext = rb.ReadBit(); + cm.FrameParallelDecodingMode = rb.ReadBit(); + if (cm.FrameParallelDecodingMode == 0) + { + cm.Counts.Value = new Vp9BackwardUpdates(); + } + } + else + { + cm.RefreshFrameContext = 0; + cm.FrameParallelDecodingMode = 1; + } + + // This flag will be overridden by the call to SetupPastIndependence + // below, forcing the use of context 0 for those frame types. + cm.FrameContextIdx = (uint)rb.ReadLiteral(Constants.FrameContextsLog2); + + // Generate next_ref_frame_map. + for (mask = pbi.RefreshFrameFlags; mask != 0; mask >>= 1) + { + if ((mask & 1) != 0) + { + cm.NextRefFrameMap[refIndex] = cm.NewFbIdx; + ++frameBufs[cm.NewFbIdx].RefCount; + } + else + { + cm.NextRefFrameMap[refIndex] = cm.RefFrameMap[refIndex]; + } + + // Current thread holds the reference frame. + if (cm.RefFrameMap[refIndex] >= 0) + { + ++frameBufs[cm.RefFrameMap[refIndex]].RefCount; + } + + ++refIndex; + } + + for (; refIndex < Constants.RefFrames; ++refIndex) + { + cm.NextRefFrameMap[refIndex] = cm.RefFrameMap[refIndex]; + // Current thread holds the reference frame. + if (cm.RefFrameMap[refIndex] >= 0) + { + ++frameBufs[cm.RefFrameMap[refIndex]].RefCount; + } + } + + pbi.HoldRefBuf = 1; + + if (cm.FrameIsIntraOnly() || cm.ErrorResilientMode != 0) + { + EntropyMode.SetupPastIndependence(ref cm); + } + + SetupLoopfilter(ref cm.Lf, ref rb); + SetupQuantization(ref cm, ref cm.Mb, ref rb); + cm.Seg.SetupSegmentation(ref cm.Fc.Value, ref rb); + cm.SetupSegmentationDequant(); + + cm.SetupTileInfo(ref rb); + sz = (ulong)rb.ReadLiteral(16); + + if (sz == 0) + { + cm.Error.InternalError(CodecErr.CorruptFrame, "Invalid header size"); + } + + return sz; + } + + private static bool ReadCompressedHeader(ref Vp9Decoder pbi, ArrayPtr data, ulong partitionSize) + { + ref Vp9Common cm = ref pbi.Common; + ref MacroBlockD xd = ref cm.Mb; + ref Vp9EntropyProbs fc = ref cm.Fc.Value; + Reader r = new(); + + if (r.Init(data, (int)partitionSize)) + { + cm.Error.InternalError(CodecErr.MemError, "Failed to allocate bool decoder 0"); + } + + cm.TxMode = xd.Lossless ? TxMode.Only4X4 : r.ReadTxMode(); + if (cm.TxMode == TxMode.TxModeSelect) + { + ReadTxModeProbs(ref fc, ref r); + } + + ReadCoefProbs(ref fc, cm.TxMode, ref r); + + for (int k = 0; k < Constants.SkipContexts; ++k) + { + r.DiffUpdateProb(ref fc.SkipProb[k]); + } + + if (!cm.FrameIsIntraOnly()) + { + ReadInterModeProbs(ref fc, ref r); + + if (cm.InterpFilter == Constants.Switchable) + { + ReadSwitchableInterpProbs(ref fc, ref r); + } + + for (int i = 0; i < Constants.IntraInterContexts; i++) + { + r.DiffUpdateProb(ref fc.IntraInterProb[i]); + } + + cm.ReferenceMode = cm.ReadFrameReferenceMode(ref r); + if (cm.ReferenceMode != ReferenceMode.Single) + { + cm.SetupCompoundReferenceMode(); + } + + cm.ReadFrameReferenceModeProbs(ref r); + + for (int j = 0; j < EntropyMode.BlockSizeGroups; j++) + { + for (int i = 0; i < Constants.IntraModes - 1; ++i) + { + r.DiffUpdateProb(ref fc.YModeProb[j][i]); + } + } + + for (int j = 0; j < Constants.PartitionContexts; ++j) + { + for (int i = 0; i < Constants.PartitionTypes - 1; ++i) + { + r.DiffUpdateProb(ref fc.PartitionProb[j][i]); + } + } + + ReadMvProbs(ref fc, cm.AllowHighPrecisionMv, ref r); + } + + return r.HasError(); + } + + private static ref ReadBitBuffer InitReadBitBuffer(ref ReadBitBuffer rb, ReadOnlySpan data) + { + rb.BitOffset = 0; + rb.BitBuffer = data; + return ref rb; + } + + public static unsafe void Decode(MemoryAllocator allocator, + ref Vp9Decoder pbi, + ArrayPtr data, + out ArrayPtr pDataEnd, + bool multithreaded = true) + { + ref Vp9Common cm = ref pbi.Common; + ref MacroBlockD xd = ref cm.Mb; + ReadBitBuffer rb = new(); + int contextUpdated = 0; + Span clearData = stackalloc byte[80]; + ulong firstPartitionSize = + ReadUncompressedHeader(allocator, ref pbi, ref InitReadBitBuffer(ref rb, data.AsSpan())); + int tileRows = 1 << cm.Log2TileRows; + int tileCols = 1 << cm.Log2TileCols; + ref Surface newFb = ref cm.GetFrameNewBuffer(); + xd.CurBuf = newFb; + + if (firstPartitionSize == 0) + { + // showing a frame directly + pDataEnd = data.Slice(cm.Profile <= BitstreamProfile.Profile2 ? 1 : 2); + return; + } + + data = data.Slice((int)rb.BytesRead()); + if (!ReadIsValid(data, (int)firstPartitionSize)) + { + cm.Error.InternalError(CodecErr.CorruptFrame, "Truncated packet or corrupt header length"); + } + + cm.UsePrevFrameMvs = + cm.ErrorResilientMode == 0 && + cm.Width == cm.LastWidth && + cm.Height == cm.LastHeight && + !cm.LastIntraOnly && + cm.LastShowFrame != 0 && + cm.LastFrameType != FrameType.KeyFrame; + + xd.SetupBlockPlanes(cm.SubsamplingX, cm.SubsamplingY); + + cm.Fc = new Ptr(ref cm.FrameContexts[(int)cm.FrameContextIdx]); + + xd.Corrupted = false; + newFb.Corrupted = ReadCompressedHeader(ref pbi, data, firstPartitionSize) ? 1 : 0; + if (newFb.Corrupted != 0) + { + cm.Error.InternalError(CodecErr.CorruptFrame, "Decode failed. Frame data header is corrupted."); + } + + if (cm.Lf.FilterLevel != 0 && cm.SkipLoopFilter == 0) + { + LoopFilter.LoopFilterFrameInit(ref cm, cm.Lf.FilterLevel); + } + + int threadCount = multithreaded ? Math.Max(1, Environment.ProcessorCount / 2) : 0; + + if (cm.TileWorkerData.IsNull || tileCols * tileRows != cm.TotalTiles) + { + int numTileWorkers = (tileCols * tileRows) + threadCount; + if (!cm.TileWorkerData.IsNull) + { + allocator.Free(cm.TileWorkerData); + } + + cm.CheckMemError(ref cm.TileWorkerData, allocator.Allocate(numTileWorkers)); + cm.TotalTiles = tileRows * tileCols; + } + + if (multithreaded) + { + pDataEnd = DecodeTilesMt(ref pbi.Common, data.Slice((int)firstPartitionSize), threadCount); + + LoopFilter.LoopFilterFrameMt( + ref cm.Mb.CurBuf, + ref cm, + ref cm.Mb, + cm.Lf.FilterLevel, + false, + false, + threadCount); + } + else + { + pDataEnd = DecodeTiles(ref pbi.Common, data.Slice((int)firstPartitionSize)); + + LoopFilter.LoopFilterFrame(ref cm.Mb.CurBuf, ref cm, ref cm.Mb, cm.Lf.FilterLevel, false, false); + } + + if (!xd.Corrupted) + { + if (cm.ErrorResilientMode == 0 && cm.FrameParallelDecodingMode == 0) + { + cm.AdaptCoefProbs(); + + if (!cm.FrameIsIntraOnly()) + { + cm.AdaptModeProbs(); + cm.AdaptMvProbs(cm.AllowHighPrecisionMv); + } + } + } + else + { + cm.Error.InternalError(CodecErr.CorruptFrame, "Decode failed. Frame data is corrupted."); + } + + // Non frame parallel update frame context here. + if (cm.RefreshFrameContext != 0 && contextUpdated == 0) + { + cm.FrameContexts[(int)cm.FrameContextIdx] = cm.Fc.Value; + } + } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/DecodeMv.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/DecodeMv.cs index 091490bfa..b2c8d494d 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/DecodeMv.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/DecodeMv.cs @@ -10,11 +10,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { internal static class DecodeMv { - private const int MvrefNeighbours = 8; + private const int RefNeighbours = 8; private static PredictionMode ReadIntraMode(ref Reader r, ReadOnlySpan p) { - return (PredictionMode)r.ReadTree(Luts.Vp9IntraModeTree, p); + return (PredictionMode)r.ReadTree(Luts.IntraModeTree, p); } private static PredictionMode ReadIntraModeY(ref Vp9Common cm, ref MacroBlockD xd, ref Reader r, int sizeGroup) @@ -41,7 +41,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 private static PredictionMode ReadInterMode(ref Vp9Common cm, ref MacroBlockD xd, ref Reader r, int ctx) { - int mode = r.ReadTree(Luts.Vp9InterModeTree, cm.Fc.Value.InterModeProb[ctx].AsSpan()); + int mode = r.ReadTree(Luts.InterModeTree, cm.Fc.Value.InterModeProb[ctx].AsSpan()); if (!xd.Counts.IsNull) { ++xd.Counts.Value.InterMode[ctx][mode]; @@ -52,22 +52,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 private static int ReadSegmentId(ref Reader r, ref Array7 segTreeProbs) { - return r.ReadTree(Luts.Vp9SegmentTree, segTreeProbs.AsSpan()); + return r.ReadTree(Luts.SegmentTree, segTreeProbs.AsSpan()); } private static ReadOnlySpan GetTxProbs(ref Vp9EntropyProbs fc, TxSize maxTxSize, int ctx) { switch (maxTxSize) { - case TxSize.Tx8x8: + case TxSize.Tx8X8: return fc.Tx8x8Prob[ctx].AsSpan(); - case TxSize.Tx16x16: + case TxSize.Tx16X16: return fc.Tx16x16Prob[ctx].AsSpan(); - case TxSize.Tx32x32: + case TxSize.Tx32X32: return fc.Tx32x32Prob[ctx].AsSpan(); default: Debug.Assert(false, "Invalid maxTxSize."); - return ReadOnlySpan.Empty; } } @@ -76,15 +75,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { switch (maxTxSize) { - case TxSize.Tx8x8: + case TxSize.Tx8X8: return counts.Tx8x8[ctx].AsSpan(); - case TxSize.Tx16x16: + case TxSize.Tx16X16: return counts.Tx16x16[ctx].AsSpan(); - case TxSize.Tx32x32: + case TxSize.Tx32X32: return counts.Tx32x32[ctx].AsSpan(); default: Debug.Assert(false, "Invalid maxTxSize."); - return Span.Empty; } } @@ -94,10 +92,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int ctx = xd.GetTxSizeContext(); ReadOnlySpan txProbs = GetTxProbs(ref cm.Fc.Value, maxTxSize, ctx); TxSize txSize = (TxSize)r.Read(txProbs[0]); - if (txSize != TxSize.Tx4x4 && maxTxSize >= TxSize.Tx16x16) + if (txSize != TxSize.Tx4X4 && maxTxSize >= TxSize.Tx16X16) { txSize += r.Read(txProbs[1]); - if (txSize != TxSize.Tx8x8 && maxTxSize >= TxSize.Tx32x32) + if (txSize != TxSize.Tx8X8 && maxTxSize >= TxSize.Tx32X32) { txSize += r.Read(txProbs[2]); } @@ -116,7 +114,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 TxMode txMode = cm.TxMode; BlockSize bsize = xd.Mi[0].Value.SbType; TxSize maxTxSize = Luts.MaxTxSizeLookup[(int)bsize]; - if (allowSelect && txMode == TxMode.TxModeSelect && bsize >= BlockSize.Block8x8) + if (allowSelect && txMode == TxMode.TxModeSelect && bsize >= BlockSize.Block8X8) { return ReadSelectedTxSize(ref cm, ref xd, maxTxSize, ref r); } @@ -124,34 +122,32 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 return (TxSize)Math.Min((int)maxTxSize, (int)Luts.TxModeToBiggestTxSize[(int)txMode]); } - private static int DecGetSegmentId(ref Vp9Common cm, ArrayPtr segmentIds, int miOffset, int xMis, int yMis) + private static int DecGetSegmentId(ref Vp9Common cm, ArrayPtr segmentIds, int miOffset, int xMis, + int yMis) { - int x, y, segmentId = int.MaxValue; + int segmentId = int.MaxValue; - for (y = 0; y < yMis; y++) + for (int y = 0; y < yMis; y++) { - for (x = 0; x < xMis; x++) + for (int x = 0; x < xMis; x++) { - segmentId = Math.Min(segmentId, segmentIds[miOffset + y * cm.MiCols + x]); + segmentId = Math.Min(segmentId, segmentIds[miOffset + (y * cm.MiCols) + x]); } } - Debug.Assert(segmentId >= 0 && segmentId < Constants.MaxSegments); - + Debug.Assert(segmentId is >= 0 and < Constants.MaxSegments); return segmentId; } private static void SetSegmentId(ref Vp9Common cm, int miOffset, int xMis, int yMis, int segmentId) { - int x, y; + Debug.Assert(segmentId is >= 0 and < Constants.MaxSegments); - Debug.Assert(segmentId >= 0 && segmentId < Constants.MaxSegments); - - for (y = 0; y < yMis; y++) + for (int y = 0; y < yMis; y++) { - for (x = 0; x < xMis; x++) + for (int x = 0; x < xMis; x++) { - cm.CurrentFrameSegMap[miOffset + y * cm.MiCols + x] = (byte)segmentId; + cm.CurrentFrameSegMap[miOffset + (y * cm.MiCols) + x] = (byte)segmentId; } } } @@ -164,13 +160,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int xMis, int yMis) { - int x, y; - - for (y = 0; y < yMis; y++) + for (int y = 0; y < yMis; y++) { - for (x = 0; x < xMis; x++) + for (int x = 0; x < xMis; x++) { - currentSegmentIds[miOffset + y * cm.MiCols + x] = (byte)(!lastSegmentIds.IsNull ? lastSegmentIds[miOffset + y * cm.MiCols + x] : 0); + currentSegmentIds[miOffset + (y * cm.MiCols) + x] = (byte)(!lastSegmentIds.IsNull + ? lastSegmentIds[miOffset + (y * cm.MiCols) + x] + : 0); } } } @@ -188,13 +184,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (!seg.UpdateMap) { CopySegmentId(ref cm, cm.LastFrameSegMap, cm.CurrentFrameSegMap, miOffset, xMis, yMis); - return 0; } segmentId = ReadSegmentId(ref r, ref cm.Fc.Value.SegTreeProb); SetSegmentId(ref cm, miOffset, xMis, yMis, segmentId); - return segmentId; } @@ -210,7 +204,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ref Segmentation seg = ref cm.Seg; ref ModeInfo mi = ref xd.Mi[0].Value; int predictedSegmentId, segmentId; - int miOffset = miRow * cm.MiCols + miCol; + int miOffset = (miRow * cm.MiCols) + miCol; if (!seg.Enabled) { @@ -224,7 +218,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (!seg.UpdateMap) { CopySegmentId(ref cm, cm.LastFrameSegMap, cm.CurrentFrameSegMap, miOffset, xMis, yMis); - return predictedSegmentId; } @@ -232,20 +225,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { byte predProb = Segmentation.GetPredProbSegId(ref cm.Fc.Value.SegPredProb, ref xd); mi.SegIdPredicted = (sbyte)r.Read(predProb); - segmentId = mi.SegIdPredicted != 0 ? predictedSegmentId : ReadSegmentId(ref r, ref cm.Fc.Value.SegTreeProb); + segmentId = mi.SegIdPredicted != 0 + ? predictedSegmentId + : ReadSegmentId(ref r, ref cm.Fc.Value.SegTreeProb); } else { segmentId = ReadSegmentId(ref r, ref cm.Fc.Value.SegTreeProb); } - SetSegmentId(ref cm, miOffset, xMis, yMis, segmentId); + SetSegmentId(ref cm, miOffset, xMis, yMis, segmentId); return segmentId; } private static int ReadSkip(ref Vp9Common cm, ref MacroBlockD xd, int segmentId, ref Reader r) { - if (cm.Seg.IsSegFeatureActive(segmentId, SegLvlFeatures.SegLvlSkip) != 0) + if (cm.Seg.IsSegFeatureActive(segmentId, SegLvlFeatures.Skip) != 0) { return 1; } @@ -260,12 +255,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 return skip; } - private static int ReadMvComponent(ref Reader r, ref Vp9EntropyProbs fc, int mvcomp, bool usehp) + private static int ReadComponent(ref Reader r, ref Vp9EntropyProbs fc, int mvcomp, bool usehp) { int mag, d, fr, hp; bool sign = r.Read(fc.Sign[mvcomp]) != 0; - MvClassType mvClass = (MvClassType)r.ReadTree(Luts.Vp9MvClassTree, fc.Classes[mvcomp].AsSpan()); - bool class0 = mvClass == MvClassType.MvClass0; + MvClassType mvClass = (MvClassType)r.ReadTree(Luts.MvClassTree, fc.Classes[mvcomp].AsSpan()); + bool class0 = mvClass == MvClassType.Class0; // Integer part if (class0) @@ -275,11 +270,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } else { - int i; int n = (int)mvClass + Constants.Class0Bits - 1; // Number of bits d = 0; - for (i = 0; i < n; ++i) + for (int i = 0; i < n; ++i) { d |= r.Read(fc.Bits[mvcomp][i]) << i; } @@ -288,40 +282,39 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } // Fractional part - fr = r.ReadTree(Luts.Vp9MvFPTree, class0 ? fc.Class0Fp[mvcomp][d].AsSpan() : fc.Fp[mvcomp].AsSpan()); + fr = r.ReadTree(Luts.MvFpTree, class0 ? fc.Class0Fp[mvcomp][d].AsSpan() : fc.Fp[mvcomp].AsSpan()); // High precision part (if hp is not used, the default value of the hp is 1) hp = usehp ? r.Read(class0 ? fc.Class0Hp[mvcomp] : fc.Hp[mvcomp]) : 1; // Result mag += ((d << 3) | (fr << 1) | hp) + 1; - return sign ? -mag : mag; } - private static void ReadMv( + private static void Read( ref Reader r, ref Mv mv, ref Mv refr, ref Vp9EntropyProbs fc, Ptr counts, - bool allowHP) + bool allowHp) { - MvJointType jointType = (MvJointType)r.ReadTree(Luts.Vp9MvJointTree, fc.Joints.AsSpan()); - bool useHP = allowHP && refr.UseMvHp(); + MvJointType jointType = (MvJointType)r.ReadTree(Luts.MvJointTree, fc.Joints.AsSpan()); + bool useHp = allowHp && refr.UseHp(); Mv diff = new(); - if (Mv.MvJointVertical(jointType)) + if (Mv.JointVertical(jointType)) { - diff.Row = (short)ReadMvComponent(ref r, ref fc, 0, useHP); + diff.Row = (short)ReadComponent(ref r, ref fc, 0, useHp); } - if (Mv.MvJointHorizontal(jointType)) + if (Mv.JointHorizontal(jointType)) { - diff.Col = (short)ReadMvComponent(ref r, ref fc, 1, useHP); + diff.Col = (short)ReadComponent(ref r, ref fc, 1, useHp); } - diff.IncMv(counts); + diff.Inc(counts); mv.Row = (short)(refr.Row + diff.Row); mv.Col = (short)(refr.Col + diff.Col); @@ -329,7 +322,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 private static ReferenceMode ReadBlockReferenceMode(ref Vp9Common cm, ref MacroBlockD xd, ref Reader r) { - if (cm.ReferenceMode == ReferenceMode.ReferenceModeSelect) + if (cm.ReferenceMode == ReferenceMode.Select) { int ctx = PredCommon.GetReferenceModeContext(ref cm, ref xd); ReferenceMode mode = (ReferenceMode)r.Read(cm.Fc.Value.CompInterProb[ctx]); @@ -354,15 +347,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { ref Vp9EntropyProbs fc = ref cm.Fc.Value; - if (cm.Seg.IsSegFeatureActive(segmentId, SegLvlFeatures.SegLvlRefFrame) != 0) + if (cm.Seg.IsSegFeatureActive(segmentId, SegLvlFeatures.RefFrame) != 0) { - refFrame[0] = (sbyte)cm.Seg.GetSegData(segmentId, SegLvlFeatures.SegLvlRefFrame); + refFrame[0] = (sbyte)cm.Seg.GetSegData(segmentId, SegLvlFeatures.RefFrame); refFrame[1] = Constants.None; } else { ReferenceMode mode = ReadBlockReferenceMode(ref cm, ref xd, ref r); - if (mode == ReferenceMode.CompoundReference) + if (mode == ReferenceMode.Compound) { int idx = cm.RefFrameSignBias[cm.CompFixedRef]; int ctx = PredCommon.GetPredContextCompRefP(ref cm, ref xd); @@ -375,7 +368,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 refFrame[idx] = cm.CompFixedRef; refFrame[idx == 0 ? 1 : 0] = cm.CompVarRef[bit]; } - else if (mode == ReferenceMode.SingleReference) + else if (mode == ReferenceMode.Single) { int ctx0 = PredCommon.GetPredContextSingleRefP1(ref xd); int bit0 = r.Read(fc.SingleRefProb[ctx0][0]); @@ -412,7 +405,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 private static byte ReadSwitchableInterpFilter(ref Vp9Common cm, ref MacroBlockD xd, ref Reader r) { int ctx = xd.GetPredContextSwitchableInterp(); - byte type = (byte)r.ReadTree(Luts.Vp9SwitchableInterpTree, cm.Fc.Value.SwitchableInterpProb[ctx].AsSpan()); + byte type = (byte)r.ReadTree(Luts.SwitchableInterpTree, cm.Fc.Value.SwitchableInterpProb[ctx].AsSpan()); if (!xd.Counts.IsNull) { ++xd.Counts.Value.SwitchableInterp[ctx][type]; @@ -424,23 +417,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 private static void ReadIntraBlockModeInfo(ref Vp9Common cm, ref MacroBlockD xd, ref ModeInfo mi, ref Reader r) { BlockSize bsize = mi.SbType; - int i; switch (bsize) { - case BlockSize.Block4x4: - for (i = 0; i < 4; ++i) + case BlockSize.Block4X4: + for (int i = 0; i < 4; ++i) { mi.Bmi[i].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); } mi.Mode = mi.Bmi[3].Mode; break; - case BlockSize.Block4x8: + case BlockSize.Block4X8: mi.Bmi[0].Mode = mi.Bmi[2].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[1].Mode = mi.Bmi[3].Mode = mi.Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); break; - case BlockSize.Block8x4: + case BlockSize.Block8X4: mi.Bmi[0].Mode = mi.Bmi[1].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[2].Mode = mi.Bmi[3].Mode = mi.Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); break; @@ -459,27 +451,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 mi.RefFrame[1] = Constants.None; } - private static bool IsMvValid(ref Mv mv) - { - return mv.Row > Constants.MvLow && - mv.Row < Constants.MvUpp && - mv.Col > Constants.MvLow && - mv.Col < Constants.MvUpp; - } - - private static void CopyMvPair(ref Array2 dst, ref Array2 src) + private static void CopyPair(ref Array2 dst, ref Array2 src) { dst[0] = src[0]; dst[1] = src[1]; } - private static void ZeroMvPair(ref Array2 dst) + private static void ZeroPair(ref Array2 dst) { dst[0] = new Mv(); dst[1] = new Mv(); } - private static bool AssignMv( + private static bool Assign( ref Vp9Common cm, ref MacroBlockD xd, PredictionMode mode, @@ -487,45 +471,46 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ref Array2 refMv, ref Array2 nearNearestMv, int isCompound, - bool allowHP, + bool allowHp, ref Reader r) { - int i; bool ret = true; switch (mode) { case PredictionMode.NewMv: { - for (i = 0; i < 1 + isCompound; ++i) + for (int i = 0; i < 1 + isCompound; ++i) { - ReadMv(ref r, ref mv[i], ref refMv[i], ref cm.Fc.Value, xd.Counts, allowHP); - ret = ret && IsMvValid(ref mv[i]); + Read(ref r, ref mv[i], ref refMv[i], ref cm.Fc.Value, xd.Counts, allowHp); + ret = ret && mv[i].IsValid(); } + break; } case PredictionMode.NearMv: case PredictionMode.NearestMv: { - CopyMvPair(ref mv, ref nearNearestMv); + CopyPair(ref mv, ref nearNearestMv); break; } case PredictionMode.ZeroMv: { - ZeroMvPair(ref mv); + ZeroPair(ref mv); break; } default: return false; } + return ret; } private static bool ReadIsInterBlock(ref Vp9Common cm, ref MacroBlockD xd, int segmentId, ref Reader r) { - if (cm.Seg.IsSegFeatureActive(segmentId, SegLvlFeatures.SegLvlRefFrame) != 0) + if (cm.Seg.IsSegFeatureActive(segmentId, SegLvlFeatures.RefFrame) != 0) { - return cm.Seg.GetSegData(segmentId, SegLvlFeatures.SegLvlRefFrame) != Constants.IntraFrame; + return cm.Seg.GetSegData(segmentId, SegLvlFeatures.RefFrame) != Constants.IntraFrame; } int ctx = xd.GetIntraInterContext(); @@ -538,33 +523,30 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 return isInter; } - private static void DecFindBestRefMvs(bool allowHP, Span mvlist, ref Mv bestMv, int refmvCount) + private static void DecFindBestRefs(bool allowHp, Span mvlist, ref Mv bestMv, int refmvCount) { - int i; - // Make sure all the candidates are properly clamped etc - for (i = 0; i < refmvCount; ++i) + for (int i = 0; i < refmvCount; ++i) { - mvlist[i].LowerMvPrecision(allowHP); + mvlist[i].LowerPrecision(allowHp); bestMv = mvlist[i]; } } - private static bool AddMvRefListEb(Mv mv, ref int refMvCount, Span mvRefList, bool earlyBreak) + private static bool AddRefListEb(Mv mv, ref int refCount, Span mvRefList, bool earlyBreak) { - if (refMvCount != 0) + if (refCount != 0) { if (Unsafe.As(ref mv) != Unsafe.As(ref mvRefList[0])) { - mvRefList[refMvCount] = mv; - refMvCount++; - + mvRefList[refCount] = mv; + refCount++; return true; } } else { - mvRefList[refMvCount++] = mv; + mvRefList[refCount++] = mv; if (earlyBreak) { return true; @@ -574,19 +556,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 return false; } - // Performs mv sign inversion if indicated by the reference frame combination. - private static Mv ScaleMv(ref ModeInfo mi, int refr, sbyte thisRefFrame, ref Array4 refSignBias) - { - Mv mv = mi.Mv[refr]; - if (refSignBias[mi.RefFrame[refr]] != refSignBias[thisRefFrame]) - { - mv.Row *= -1; - mv.Col *= -1; - } - return mv; - } - - private static bool IsDiffRefFrameAddMvEb( + private static bool IsDiffRefFrameAddEb( ref ModeInfo mbmi, sbyte refFrame, ref Array4 refSignBias, @@ -598,26 +568,30 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { if (mbmi.RefFrame[0] != refFrame) { - if (AddMvRefListEb(ScaleMv(ref mbmi, 0, refFrame, ref refSignBias), ref refmvCount, mvRefList, earlyBreak)) - { - return true; - } - } - if (mbmi.HasSecondRef() && mbmi.RefFrame[1] != refFrame && Unsafe.As(ref mbmi.Mv[1]) != Unsafe.As(ref mbmi.Mv[0])) - { - if (AddMvRefListEb(ScaleMv(ref mbmi, 1, refFrame, ref refSignBias), ref refmvCount, mvRefList, earlyBreak)) + if (AddRefListEb(mbmi.ScaleMv(0, refFrame, ref refSignBias), ref refmvCount, mvRefList, + earlyBreak)) { return true; } } + if (mbmi.HasSecondRef() && mbmi.RefFrame[1] != refFrame && + Unsafe.As(ref mbmi.Mv[1]) != Unsafe.As(ref mbmi.Mv[0])) + { + if (AddRefListEb(mbmi.ScaleMv(1, refFrame, ref refSignBias), ref refmvCount, mvRefList, + earlyBreak)) + { + return true; + } + } } + return false; } // This function searches the neighborhood of a given MB/SB // to try and find candidate reference vectors. - private static int DecFindMvRefs( + private static int DecFindRefs( ref Vp9Common cm, ref MacroBlockD xd, PredictionMode mode, @@ -632,7 +606,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ref Array4 refSignBias = ref cm.RefFrameSignBias; int i, refmvCount = 0; bool differentRefFound = false; - Ptr prevFrameMvs = cm.UsePrevFrameMvs ? new Ptr(ref cm.PrevFrameMvs[miRow * cm.MiCols + miCol]) : Ptr.Null; + Ptr prevFrameMvs = cm.UsePrevFrameMvs + ? new Ptr(ref cm.PrevFrameMvs[(miRow * cm.MiCols) + miCol]) + : Ptr.Null; ref TileInfo tile = ref xd.Tile; // If mode is nearestmv or newmv (uses nearestmv as a reference) then stop // searching after the first mv is found. @@ -651,19 +627,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ref Position mvRef = ref mvRefSearch[i]; if (tile.IsInside(miCol, miRow, cm.MiRows, ref mvRef)) { - ref ModeInfo candidateMi = ref xd.Mi[mvRef.Col + mvRef.Row * xd.MiStride].Value; + ref ModeInfo candidateMi = ref xd.Mi[mvRef.Col + (mvRef.Row * xd.MiStride)].Value; differentRefFound = true; if (candidateMi.RefFrame[0] == refFrame) { - if (AddMvRefListEb(candidateMi.GetSubBlockMv(0, mvRef.Col, block), ref refmvCount, mvRefList, earlyBreak)) + if (AddRefListEb(candidateMi.GetSubBlockMv(0, mvRef.Col, block), ref refmvCount, + mvRefList, earlyBreak)) { goto Done; } } else if (candidateMi.RefFrame[1] == refFrame) { - if (AddMvRefListEb(candidateMi.GetSubBlockMv(1, mvRef.Col, block), ref refmvCount, mvRefList, earlyBreak)) + if (AddRefListEb(candidateMi.GetSubBlockMv(1, mvRef.Col, block), ref refmvCount, + mvRefList, earlyBreak)) { goto Done; } @@ -675,24 +653,24 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // Check the rest of the neighbors in much the same way // as before except we don't need to keep track of sub blocks or // mode counts. - for (; i < MvrefNeighbours; ++i) + for (; i < RefNeighbours; ++i) { ref Position mvRef = ref mvRefSearch[i]; if (tile.IsInside(miCol, miRow, cm.MiRows, ref mvRef)) { - ref ModeInfo candidate = ref xd.Mi[mvRef.Col + mvRef.Row * xd.MiStride].Value; + ref ModeInfo candidate = ref xd.Mi[mvRef.Col + (mvRef.Row * xd.MiStride)].Value; differentRefFound = true; if (candidate.RefFrame[0] == refFrame) { - if (AddMvRefListEb(candidate.Mv[0], ref refmvCount, mvRefList, earlyBreak)) + if (AddRefListEb(candidate.Mv[0], ref refmvCount, mvRefList, earlyBreak)) { goto Done; } } else if (candidate.RefFrame[1] == refFrame) { - if (AddMvRefListEb(candidate.Mv[1], ref refmvCount, mvRefList, earlyBreak)) + if (AddRefListEb(candidate.Mv[1], ref refmvCount, mvRefList, earlyBreak)) { goto Done; } @@ -705,14 +683,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { if (prevFrameMvs.Value.RefFrame[0] == refFrame) { - if (AddMvRefListEb(prevFrameMvs.Value.Mv[0], ref refmvCount, mvRefList, earlyBreak)) + if (AddRefListEb(prevFrameMvs.Value.Mv[0], ref refmvCount, mvRefList, earlyBreak)) { goto Done; } } else if (prevFrameMvs.Value.RefFrame[1] == refFrame) { - if (AddMvRefListEb(prevFrameMvs.Value.Mv[1], ref refmvCount, mvRefList, earlyBreak)) + if (AddRefListEb(prevFrameMvs.Value.Mv[1], ref refmvCount, mvRefList, earlyBreak)) { goto Done; } @@ -724,15 +702,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // different reference frames. if (differentRefFound) { - for (i = 0; i < MvrefNeighbours; ++i) + for (i = 0; i < RefNeighbours; ++i) { ref Position mvRef = ref mvRefSearch[i]; if (tile.IsInside(miCol, miRow, cm.MiRows, ref mvRef)) { - ref ModeInfo candidate = ref xd.Mi[mvRef.Col + mvRef.Row * xd.MiStride].Value; + ref ModeInfo candidate = ref xd.Mi[mvRef.Col + (mvRef.Row * xd.MiStride)].Value; // If the candidate is Intra we don't want to consider its mv. - if (IsDiffRefFrameAddMvEb(ref candidate, refFrame, ref refSignBias, ref refmvCount, mvRefList, earlyBreak)) + if (IsDiffRefFrameAddEb(ref candidate, refFrame, ref refSignBias, ref refmvCount, mvRefList, + earlyBreak)) { goto Done; } @@ -751,7 +730,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 mv.Row *= -1; mv.Col *= -1; } - if (AddMvRefListEb(mv, ref refmvCount, mvRefList, earlyBreak)) + + if (AddRefListEb(mv, ref refmvCount, mvRefList, earlyBreak)) { goto Done; } @@ -759,7 +739,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (prevFrameMvs.Value.RefFrame[1] > Constants.IntraFrame && prevFrameMvs.Value.RefFrame[1] != refFrame && - Unsafe.As(ref prevFrameMvs.Value.Mv[1]) != Unsafe.As(ref prevFrameMvs.Value.Mv[0])) + Unsafe.As(ref prevFrameMvs.Value.Mv[1]) != + Unsafe.As(ref prevFrameMvs.Value.Mv[0])) { Mv mv = prevFrameMvs.Value.Mv[1]; if (refSignBias[prevFrameMvs.Value.RefFrame[1]] != refSignBias[refFrame]) @@ -767,7 +748,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 mv.Row *= -1; mv.Col *= -1; } - if (AddMvRefListEb(mv, ref refmvCount, mvRefList, earlyBreak)) + + if (AddRefListEb(mv, ref refmvCount, mvRefList, earlyBreak)) { goto Done; } @@ -788,13 +770,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // Clamp vectors for (i = 0; i < refmvCount; ++i) { - mvRefList[i].ClampMvRef(ref xd); + mvRefList[i].ClampRef(ref xd); } return refmvCount; } - private static void AppendSub8x8MvsForIdx( + private static void AppendSub8X8ForIdx( ref Vp9Common cm, ref MacroBlockD xd, Span mvRefSearch, @@ -803,46 +785,47 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int refr, int miRow, int miCol, - ref Mv bestSub8x8) + ref Mv bestSub8X8) { Span mvList = stackalloc Mv[Constants.MaxMvRefCandidates]; ref ModeInfo mi = ref xd.Mi[0].Value; ref Array4 bmi = ref mi.Bmi; - int n; int refmvCount; Debug.Assert(Constants.MaxMvRefCandidates == 2); - refmvCount = DecFindMvRefs(ref cm, ref xd, bMode, mi.RefFrame[refr], mvRefSearch, mvList, miRow, miCol, block, 1); + refmvCount = DecFindRefs(ref cm, ref xd, bMode, mi.RefFrame[refr], mvRefSearch, mvList, miRow, miCol, + block, 1); switch (block) { case 0: - bestSub8x8 = mvList[refmvCount - 1]; + bestSub8X8 = mvList[refmvCount - 1]; break; case 1: case 2: if (bMode == PredictionMode.NearestMv) { - bestSub8x8 = bmi[0].Mv[refr]; + bestSub8X8 = bmi[0].Mv[refr]; } else { - bestSub8x8 = new Mv(); - for (n = 0; n < refmvCount; ++n) + bestSub8X8 = new Mv(); + for (int n = 0; n < refmvCount; ++n) { if (Unsafe.As(ref bmi[0].Mv[refr]) != Unsafe.As(ref mvList[n])) { - bestSub8x8 = mvList[n]; + bestSub8X8 = mvList[n]; break; } } } + break; case 3: if (bMode == PredictionMode.NearestMv) { - bestSub8x8 = bmi[2].Mv[refr]; + bestSub8X8 = bmi[2].Mv[refr]; } else { @@ -851,16 +834,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 candidates[1] = bmi[0].Mv[refr]; candidates[2] = mvList[0]; candidates[3] = mvList[1]; - bestSub8x8 = new Mv(); - for (n = 0; n < 2 + Constants.MaxMvRefCandidates; ++n) + bestSub8X8 = new Mv(); + for (int n = 0; n < 2 + Constants.MaxMvRefCandidates; ++n) { if (Unsafe.As(ref bmi[2].Mv[refr]) != Unsafe.As(ref candidates[n])) { - bestSub8x8 = candidates[n]; + bestSub8X8 = candidates[n]; break; } } } + break; default: Debug.Assert(false, "Invalid block index."); @@ -868,19 +852,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } - private static byte GetModeContext(ref Vp9Common cm, ref MacroBlockD xd, Span mvRefSearch, int miRow, int miCol) + private static byte GetModeContext(ref Vp9Common cm, ref MacroBlockD xd, Span mvRefSearch, int miRow, + int miCol) { - int i; int contextCounter = 0; ref TileInfo tile = ref xd.Tile; // Get mode count from nearest 2 blocks - for (i = 0; i < 2; ++i) + for (int i = 0; i < 2; ++i) { ref Position mvRef = ref mvRefSearch[i]; if (tile.IsInside(miCol, miRow, cm.MiRows, ref mvRef)) { - ref ModeInfo candidate = ref xd.Mi[mvRef.Col + mvRef.Row * xd.MiStride].Value; + ref ModeInfo candidate = ref xd.Mi[mvRef.Col + (mvRef.Row * xd.MiStride)].Value; // Keep counts for entropy encoding. contextCounter += Luts.Mode2Counter[(int)candidate.Mode]; } @@ -898,7 +882,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ref Reader r) { BlockSize bsize = mi.SbType; - bool allowHP = cm.AllowHighPrecisionMv; + bool allowHp = cm.AllowHighPrecisionMv; Array2 bestRefMvs = new(); int refr, isCompound; byte interModeCtx; @@ -908,19 +892,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 isCompound = mi.HasSecondRef() ? 1 : 0; interModeCtx = GetModeContext(ref cm, ref xd, mvRefSearch, miRow, miCol); - if (cm.Seg.IsSegFeatureActive(mi.SegmentId, SegLvlFeatures.SegLvlSkip) != 0) + if (cm.Seg.IsSegFeatureActive(mi.SegmentId, SegLvlFeatures.Skip) != 0) { mi.Mode = PredictionMode.ZeroMv; - if (bsize < BlockSize.Block8x8) + if (bsize < BlockSize.Block8X8) { - xd.ErrorInfo.Value.InternalError(CodecErr.CodecUnsupBitstream, "Invalid usage of segement feature on small blocks"); - + xd.ErrorInfo.Value.InternalError(CodecErr.UnsupBitstream, + "Invalid usage of segement feature on small blocks"); return; } } else { - if (bsize >= BlockSize.Block8x8) + if (bsize >= BlockSize.Block8X8) { mi.Mode = ReadInterMode(ref cm, ref xd, ref r, interModeCtx); } @@ -942,42 +926,47 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 sbyte frame = mi.RefFrame[refr]; int refmvCount; - refmvCount = DecFindMvRefs(ref cm, ref xd, mi.Mode, frame, mvRefSearch, tmpMvs, miRow, miCol, -1, 0); + refmvCount = DecFindRefs(ref cm, ref xd, mi.Mode, frame, mvRefSearch, tmpMvs, miRow, miCol, + -1, 0); - DecFindBestRefMvs(allowHP, tmpMvs, ref bestRefMvs[refr], refmvCount); + DecFindBestRefs(allowHp, tmpMvs, ref bestRefMvs[refr], refmvCount); } } } - mi.InterpFilter = (cm.InterpFilter == Constants.Switchable) ? ReadSwitchableInterpFilter(ref cm, ref xd, ref r) : cm.InterpFilter; + mi.InterpFilter = cm.InterpFilter == Constants.Switchable + ? ReadSwitchableInterpFilter(ref cm, ref xd, ref r) + : cm.InterpFilter; - if (bsize < BlockSize.Block8x8) + if (bsize < BlockSize.Block8X8) { int num4X4W = 1 << xd.BmodeBlocksWl; int num4X4H = 1 << xd.BmodeBlocksHl; int idx, idy; PredictionMode bMode = 0; - Array2 bestSub8x8 = new(); + Array2 bestSub8X8 = new(); const uint InvalidMv = 0x80008000; // Initialize the 2nd element as even though it won't be used meaningfully // if isCompound is false. - Unsafe.As(ref bestSub8x8[1]) = InvalidMv; + Unsafe.As(ref bestSub8X8[1]) = InvalidMv; for (idy = 0; idy < 2; idy += num4X4H) { for (idx = 0; idx < 2; idx += num4X4W) { - int j = idy * 2 + idx; + int j = (idy * 2) + idx; bMode = ReadInterMode(ref cm, ref xd, ref r, interModeCtx); - if (bMode == PredictionMode.NearestMv || bMode == PredictionMode.NearMv) + if (bMode is PredictionMode.NearestMv or PredictionMode.NearMv) { for (refr = 0; refr < 1 + isCompound; ++refr) { - AppendSub8x8MvsForIdx(ref cm, ref xd, mvRefSearch, bMode, j, refr, miRow, miCol, ref bestSub8x8[refr]); + AppendSub8X8ForIdx(ref cm, ref xd, mvRefSearch, bMode, j, refr, miRow, miCol, + ref bestSub8X8[refr]); } } - if (!AssignMv(ref cm, ref xd, bMode, ref mi.Bmi[j].Mv, ref bestRefMvs, ref bestSub8x8, isCompound, allowHP, ref r)) + if (!Assign(ref cm, ref xd, bMode, ref mi.Bmi[j].Mv, ref bestRefMvs, ref bestSub8X8, + isCompound, allowHp, ref r)) { xd.Corrupted |= true; break; @@ -997,11 +986,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 mi.Mode = bMode; - CopyMvPair(ref mi.Mv, ref mi.Bmi[3].Mv); + CopyPair(ref mi.Mv, ref mi.Bmi[3].Mv); } else { - xd.Corrupted |= !AssignMv(ref cm, ref xd, mi.Mode, ref mi.Mv, ref bestRefMvs, ref bestRefMvs, isCompound, allowHP, ref r); + xd.Corrupted |= !Assign(ref cm, ref xd, mi.Mode, ref mi.Mv, ref bestRefMvs, ref bestRefMvs, + isCompound, allowHp, ref r); } } @@ -1034,7 +1024,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 private static PredictionMode LeftBlockMode(Ptr curMi, Ptr leftMi, int b) { - if (b == 0 || b == 2) + if (b is 0 or 2) { if (leftMi.IsNull || leftMi.Value.IsInterBlock()) { @@ -1044,14 +1034,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 return leftMi.Value.GetYMode(b + 1); } - Debug.Assert(b == 1 || b == 3); - + Debug.Assert(b is 1 or 3); return curMi.Value.Bmi[b - 1].Mode; } private static PredictionMode AboveBlockMode(Ptr curMi, Ptr aboveMi, int b) { - if (b == 0 || b == 1) + if (b is 0 or 1) { if (aboveMi.IsNull || aboveMi.Value.IsInterBlock()) { @@ -1061,8 +1050,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 return aboveMi.Value.GetYMode(b + 2); } - Debug.Assert(b == 2 || b == 3); - + Debug.Assert(b is 2 or 3); return curMi.Value.Bmi[b - 2].Mode; } @@ -1075,7 +1063,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { PredictionMode above = AboveBlockMode(mi, aboveMi, block); PredictionMode left = LeftBlockMode(mi, leftMi, block); - return fc.KfYModeProb[(int)above][(int)left].AsSpan(); } @@ -1092,8 +1079,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 Ptr aboveMi = xd.AboveMi; Ptr leftMi = xd.LeftMi; BlockSize bsize = mi.Value.SbType; - int i; - int miOffset = miRow * cm.MiCols + miCol; + + int miOffset = (miRow * cm.MiCols) + miCol; mi.Value.SegmentId = (sbyte)ReadIntraSegmentId(ref cm, miOffset, xMis, yMis, ref r); mi.Value.Skip = (sbyte)ReadSkip(ref cm, ref xd, mi.Value.SegmentId, ref r); @@ -1103,8 +1090,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 switch (bsize) { - case BlockSize.Block4x4: - for (i = 0; i < 4; ++i) + case BlockSize.Block4X4: + for (int i = 0; i < 4; ++i) { mi.Value.Bmi[i].Mode = ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, i)); @@ -1112,13 +1099,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 mi.Value.Mode = mi.Value.Bmi[3].Mode; break; - case BlockSize.Block4x8: + case BlockSize.Block4X8: mi.Value.Bmi[0].Mode = mi.Value.Bmi[2].Mode = ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 0)); mi.Value.Bmi[1].Mode = mi.Value.Bmi[3].Mode = mi.Value.Mode = ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 1)); break; - case BlockSize.Block8x4: + case BlockSize.Block8X4: mi.Value.Bmi[0].Mode = mi.Value.Bmi[1].Mode = ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 0)); mi.Value.Bmi[2].Mode = mi.Value.Bmi[3].Mode = mi.Value.Mode = @@ -1149,8 +1136,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ref Reader r = ref twd.BitReader; ref MacroBlockD xd = ref twd.Xd; ref ModeInfo mi = ref xd.Mi[0].Value; - ArrayPtr frameMvs = cm.CurFrameMvs.Slice(miRow * cm.MiCols + miCol); - int w, h; + ArrayPtr frameMvs = cm.CurFrameMvs.Slice((miRow * cm.MiCols) + miCol); if (cm.FrameIsIntraOnly()) { @@ -1160,14 +1146,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { ReadInterFrameModeInfo(ref cm, ref xd, miRow, miCol, ref r, xMis, yMis); - for (h = 0; h < yMis; ++h) + for (int h = 0; h < yMis; ++h) { - for (w = 0; w < xMis; ++w) + for (int w = 0; w < xMis; ++w) { ref MvRef mv = ref frameMvs[w]; CopyRefFramePair(ref mv.RefFrame, ref mi.RefFrame); - CopyMvPair(ref mv.Mv, ref mi.Mv); + CopyPair(ref mv.Mv, ref mi.Mv); } + frameMvs = frameMvs.Slice(cm.MiCols); } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Decoder.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Decoder.cs index 57057d5f9..f788d57f4 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Decoder.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Decoder.cs @@ -12,15 +12,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 private readonly MemoryAllocator _allocator = new(); - public ISurface CreateSurface(int width, int height) => new Surface(width, height); - - private static ReadOnlySpan LiteralToFilter => new byte[] + public ISurface CreateSurface(int width, int height) { - Constants.EightTapSmooth, - Constants.EightTap, - Constants.EightTapSharp, - Constants.Bilinear, - }; + return new Surface(width, height); + } + + private static ReadOnlySpan LiteralToFilter => + [ + Constants.EightTapSmooth, Constants.EightTap, Constants.EightTapSharp, Constants.Bilinear + ]; public unsafe bool Decode( ref Vp9PictureInfo pictureInfo, @@ -47,30 +47,35 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 YDcDeltaQ = pictureInfo.YDcDeltaQ, UvAcDeltaQ = pictureInfo.UvAcDeltaQ, UvDcDeltaQ = pictureInfo.UvDcDeltaQ, + + TxMode = (TxMode)pictureInfo.TransformMode, + + AllowHighPrecisionMv = pictureInfo.AllowHighPrecisionMv, + + InterpFilter = (byte)pictureInfo.InterpFilter, + + ReferenceMode = (ReferenceMode)pictureInfo.ReferenceMode, + + CompFixedRef = pictureInfo.CompFixedRef, + CompVarRef = pictureInfo.CompVarRef, + + BitDepth = BitDepth.Bits8, + + Log2TileCols = pictureInfo.Log2TileCols, + Log2TileRows = pictureInfo.Log2TileRows, + + Fc = new Ptr(ref pictureInfo.Entropy), + Counts = new Ptr(ref pictureInfo.BackwardUpdateCounts) }; cm.Mb.Lossless = pictureInfo.Lossless; cm.Mb.Bd = 8; - cm.TxMode = (TxMode)pictureInfo.TransformMode; - - cm.AllowHighPrecisionMv = pictureInfo.AllowHighPrecisionMv; - - cm.InterpFilter = (byte)pictureInfo.InterpFilter; - if (cm.InterpFilter != Constants.Switchable) { cm.InterpFilter = LiteralToFilter[cm.InterpFilter]; } - cm.ReferenceMode = (ReferenceMode)pictureInfo.ReferenceMode; - - cm.CompFixedRef = pictureInfo.CompFixedRef; - cm.CompVarRef = pictureInfo.CompVarRef; - - cm.Log2TileCols = pictureInfo.Log2TileCols; - cm.Log2TileRows = pictureInfo.Log2TileRows; - cm.Seg.Enabled = pictureInfo.SegmentEnabled; cm.Seg.UpdateMap = pictureInfo.SegmentMapUpdate; cm.Seg.TemporalUpdate = pictureInfo.SegmentMapTemporalUpdate; @@ -78,13 +83,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 cm.Seg.FeatureMask = pictureInfo.SegmentFeatureEnable; cm.Seg.FeatureData = pictureInfo.SegmentFeatureData; + cm.Lf.FilterLevel = pictureInfo.LoopFilterLevel; + cm.Lf.SharpnessLevel = pictureInfo.LoopFilterSharpnessLevel; cm.Lf.ModeRefDeltaEnabled = pictureInfo.ModeRefDeltaEnabled; cm.Lf.RefDeltas = pictureInfo.RefDeltas; cm.Lf.ModeDeltas = pictureInfo.ModeDeltas; - cm.Fc = new Ptr(ref pictureInfo.Entropy); - cm.Counts = new Ptr(ref pictureInfo.BackwardUpdateCounts); - cm.FrameRefs[0].Buf = (Surface)pictureInfo.LastReference; cm.FrameRefs[1].Buf = (Surface)pictureInfo.GoldenReference; cm.FrameRefs[2].Buf = (Surface)pictureInfo.AltReference; @@ -105,7 +109,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 cm.SetupSegmentationDequant(); cm.SetupScaleFactors(); - SetMvs(ref cm, mvsIn); + cm.SetMvs(mvsIn); + + if (cm.Lf.FilterLevel != 0 && cm.SkipLoopFilter == 0) + { + LoopFilter.LoopFilterFrameInit(ref cm, cm.Lf.FilterLevel); + } fixed (byte* dataPtr = bitstream) { @@ -114,10 +123,27 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (maxThreads > 1 && tileRows == 1 && tileCols > 1) { DecodeFrame.DecodeTilesMt(ref cm, new ArrayPtr(dataPtr, bitstream.Length), maxThreads); + + LoopFilter.LoopFilterFrameMt( + ref cm.Mb.CurBuf, + ref cm, + ref cm.Mb, + cm.Lf.FilterLevel, + false, + false, + maxThreads); } else { DecodeFrame.DecodeTiles(ref cm, new ArrayPtr(dataPtr, bitstream.Length)); + + LoopFilter.LoopFilterFrame( + ref cm.Mb.CurBuf, + ref cm, + ref cm.Mb, + cm.Lf.FilterLevel, + false, + false); } } catch (InternalErrorException) @@ -126,7 +152,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } - GetMvs(ref cm, mvsOut); + cm.GetMvs(mvsOut); cm.FreeTileWorkerData(_allocator); cm.FreeContextBuffers(_allocator); @@ -134,48 +160,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 return true; } - private static void SetMvs(ref Vp9Common cm, ReadOnlySpan mvs) + public void Dispose() { - if (mvs.Length > cm.PrevFrameMvs.Length) - { - throw new ArgumentException($"Size mismatch, expected: {cm.PrevFrameMvs.Length}, but got: {mvs.Length}."); - } - - for (int i = 0; i < mvs.Length; i++) - { - ref var mv = ref cm.PrevFrameMvs[i]; - - mv.Mv[0].Row = mvs[i].Mvs[0].Row; - mv.Mv[0].Col = mvs[i].Mvs[0].Col; - mv.Mv[1].Row = mvs[i].Mvs[1].Row; - mv.Mv[1].Col = mvs[i].Mvs[1].Col; - - mv.RefFrame[0] = (sbyte)mvs[i].RefFrames[0]; - mv.RefFrame[1] = (sbyte)mvs[i].RefFrames[1]; - } + _allocator.Dispose(); } - - private static void GetMvs(ref Vp9Common cm, Span mvs) - { - if (mvs.Length > cm.CurFrameMvs.Length) - { - throw new ArgumentException($"Size mismatch, expected: {cm.CurFrameMvs.Length}, but got: {mvs.Length}."); - } - - for (int i = 0; i < mvs.Length; i++) - { - ref var mv = ref cm.CurFrameMvs[i]; - - mvs[i].Mvs[0].Row = mv.Mv[0].Row; - mvs[i].Mvs[0].Col = mv.Mv[0].Col; - mvs[i].Mvs[1].Row = mv.Mv[1].Row; - mvs[i].Mvs[1].Col = mv.Mv[1].Col; - - mvs[i].RefFrames[0] = mv.RefFrame[0]; - mvs[i].RefFrames[1] = mv.RefFrame[1]; - } - } - - public void Dispose() => _allocator.Dispose(); } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Detokenize.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Detokenize.cs index c255f7486..530eec441 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Detokenize.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Detokenize.cs @@ -19,24 +19,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { const int MaxNeighbors = 2; - return (1 + tokenCache[neighbors[MaxNeighbors * c + 0]] + tokenCache[neighbors[MaxNeighbors * c + 1]]) >> 1; - } - - private static int ReadCoeff( - ref Reader r, - ReadOnlySpan probs, - int n, - ref ulong value, - ref int count, - ref uint range) - { - int i, val = 0; - for (i = 0; i < n; ++i) - { - val = (val << 1) | r.ReadBool(probs[i], ref value, ref count, ref range); - } - - return val; + return (1 + tokenCache[neighbors[(MaxNeighbors * c) + 0]] + + tokenCache[neighbors[(MaxNeighbors * c) + 1]]) >> 1; } private static int DecodeCoefs( @@ -58,13 +42,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ref Array6>> coefProbs = ref fc.CoefProbs[(int)txSize][(int)type][refr]; Span tokenCache = stackalloc byte[32 * 32]; ReadOnlySpan bandTranslate = Luts.GetBandTranslate(txSize); - int dqShift = (txSize == TxSize.Tx32x32) ? 1 : 0; + int dqShift = txSize == TxSize.Tx32X32 ? 1 : 0; int v; short dqv = dq[0]; - ReadOnlySpan cat6Prob = (xd.Bd == 12) - ? Luts.Vp9Cat6ProbHigh12 - : (xd.Bd == 10) ? Luts.Vp9Cat6ProbHigh12[2..] : Luts.Vp9Cat6Prob; - int cat6Bits = (xd.Bd == 12) ? 18 : (xd.Bd == 10) ? 16 : 14; + ReadOnlySpan cat6Prob = xd.Bd == 12 + ? Luts.Cat6ProbHigh12 + : xd.Bd == 10 + ? Luts.Cat6ProbHigh12[2..] + : Luts.Cat6Prob; + int cat6Bits = xd.Bd == 12 ? 18 : xd.Bd == 10 ? 16 : 14; // Keep value, range, and count as locals. The compiler produces better // results with the locals than using r directly. ulong value = r.Value; @@ -107,9 +93,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 r.Value = value; r.Range = range; r.Count = count; - return c; // Zero tokens at the end (no eob token) } + ctx = GetCoefContext(nb, tokenCache, c); band = bandTranslate[0]; bandTranslate = bandTranslate[1..]; @@ -118,7 +104,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (r.ReadBool(prob[OneContextNode], ref value, ref count, ref range) != 0) { - ReadOnlySpan p = Luts.Vp9Pareto8Full[prob[Constants.PivotNode] - 1]; + ReadOnlySpan p = Luts.Pareto8Full[prob[Constants.PivotNode] - 1]; if (!xd.Counts.IsNull) { ++counts.Coef[(int)txSize][(int)type][refr][band][ctx][Constants.TwoToken]; @@ -133,20 +119,24 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { if (r.ReadBool(p[7], ref value, ref count, ref range) != 0) { - val = Constants.Cat6MinVal + ReadCoeff(ref r, cat6Prob, cat6Bits, ref value, ref count, ref range); + val = Constants.Cat6MinVal + r.ReadCoeff(cat6Prob, cat6Bits, ref value, + ref count, ref range); } else { - val = Constants.Cat5MinVal + ReadCoeff(ref r, Luts.Vp9Cat5Prob, 5, ref value, ref count, ref range); + val = Constants.Cat5MinVal + r.ReadCoeff(Luts.Cat5Prob, 5, ref value, + ref count, ref range); } } else if (r.ReadBool(p[6], ref value, ref count, ref range) != 0) { - val = Constants.Cat4MinVal + ReadCoeff(ref r, Luts.Vp9Cat4Prob, 4, ref value, ref count, ref range); + val = Constants.Cat4MinVal + r.ReadCoeff(Luts.Cat4Prob, 4, ref value, ref count, + ref range); } else { - val = Constants.Cat3MinVal + ReadCoeff(ref r, Luts.Vp9Cat3Prob, 3, ref value, ref count, ref range); + val = Constants.Cat3MinVal + r.ReadCoeff(Luts.Cat3Prob, 3, ref value, ref count, + ref range); } } else @@ -154,13 +144,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 tokenCache[scan[c]] = 4; if (r.ReadBool(p[4], ref value, ref count, ref range) != 0) { - val = Constants.Cat2MinVal + ReadCoeff(ref r, Luts.Vp9Cat2Prob, 2, ref value, ref count, ref range); + val = Constants.Cat2MinVal + r.ReadCoeff(Luts.Cat2Prob, 2, ref value, ref count, + ref range); } else { - val = Constants.Cat1MinVal + ReadCoeff(ref r, Luts.Vp9Cat1Prob, 1, ref value, ref count, ref range); + val = Constants.Cat1MinVal + r.ReadCoeff(Luts.Cat1Prob, 1, ref value, ref count, + ref range); } } + // Val may use 18-bits v = (int)(((long)val * dqv) >> dqShift); } @@ -188,7 +181,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 tokenCache[scan[c]] = 1; v = dqv >> dqShift; } - dqcoeff[scan[c]] = (int)HighbdCheckRange(r.ReadBool(128, ref value, ref count, ref range) != 0 ? -v : v, xd.Bd); + + dqcoeff[scan[c]] = (int)HighbdCheckRange(r.ReadBool(128, ref value, ref count, ref range) != 0 ? -v : v, + xd.Bd); ++c; ctx = GetCoefContext(nb, tokenCache, c); dqv = dq[1]; @@ -197,11 +192,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 r.Value = value; r.Range = range; r.Count = count; - return c; } - private static void GetCtxShift(ref MacroBlockD xd, ref int ctxShiftA, ref int ctxShiftL, int x, int y, uint txSizeInBlocks) + private static void GetCtxShift(ref MacroBlockD xd, ref int ctxShiftA, ref int ctxShiftL, int x, int y, + uint txSizeInBlocks) { if (xd.MaxBlocksWide != 0) { @@ -210,6 +205,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ctxShiftA = (int)(txSizeInBlocks - (xd.MaxBlocksWide - x)) * 8; } } + if (xd.MaxBlocksHigh != 0) { if (txSizeInBlocks + y > xd.MaxBlocksHigh) @@ -246,7 +242,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 switch (txSize) { - case TxSize.Tx4x4: + case TxSize.Tx4X4: ctx = a[0] != 0 ? 1 : 0; ctx += l[0] != 0 ? 1 : 0; eob = DecodeCoefs( @@ -261,8 +257,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ref r); a[0] = l[0] = (sbyte)(eob > 0 ? 1 : 0); break; - case TxSize.Tx8x8: - GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx8x8); + case TxSize.Tx8X8: + GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx8X8); ctx = MemoryMarshal.Cast(a)[0] != 0 ? 1 : 0; ctx += MemoryMarshal.Cast(l)[0] != 0 ? 1 : 0; eob = DecodeCoefs( @@ -278,8 +274,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 MemoryMarshal.Cast(a)[0] = (ushort)((eob > 0 ? 0x0101 : 0) >> ctxShiftA); MemoryMarshal.Cast(l)[0] = (ushort)((eob > 0 ? 0x0101 : 0) >> ctxShiftL); break; - case TxSize.Tx16x16: - GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx16x16); + case TxSize.Tx16X16: + GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx16X16); ctx = MemoryMarshal.Cast(a)[0] != 0 ? 1 : 0; ctx += MemoryMarshal.Cast(l)[0] != 0 ? 1 : 0; eob = DecodeCoefs( @@ -295,8 +291,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 MemoryMarshal.Cast(a)[0] = (uint)((eob > 0 ? 0x01010101 : 0) >> ctxShiftA); MemoryMarshal.Cast(l)[0] = (uint)((eob > 0 ? 0x01010101 : 0) >> ctxShiftL); break; - case TxSize.Tx32x32: - GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx32x32); + case TxSize.Tx32X32: + GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx32X32); // NOTE: Casting to ulong here is safe because the default memory // alignment is at least 8 bytes and the Tx32x32 is aligned on 8 byte // boundaries. diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Convolve.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Convolve.cs index 9e279dd21..839a9c400 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Convolve.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Convolve.cs @@ -75,17 +75,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Vector128 zero = Vector128.Zero; Vector128 const64 = Vector128.Create(64); - ulong x, y; - src -= SubpelTaps / 2 - 1; + src -= (SubpelTaps / 2) - 1; fixed (Array8* xFilter = xFilters) { - Vector128 vfilter = Sse2.LoadVector128((short*)xFilter + (uint)(x0Q4 & SubpelMask) * 8); + Vector128 vfilter = Sse2.LoadVector128((short*)xFilter + ((uint)(x0Q4 & SubpelMask) * 8)); - for (y = 0; y < (uint)h; ++y) + for (ulong y = 0; y < (uint)h; ++y) { ulong srcOffset = (uint)x0Q4 >> SubpelBits; - for (x = 0; x < (uint)w; x += 4) + for (ulong x = 0; x < (uint)w; x += 4) { Vector128 vsrc0 = Sse41.ConvertToVector128Int16(&src[srcOffset + x]); Vector128 vsrc1 = Sse41.ConvertToVector128Int16(&src[srcOffset + x + 1]); @@ -94,8 +93,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Vector128 sum0123 = MultiplyAddAdjacent(vsrc0, vsrc1, vsrc2, vsrc3, vfilter, zero); - Sse.StoreScalar((float*)&dst[x], PackUnsignedSaturate(RoundShift(sum0123, const64), zero).AsSingle()); + Sse.StoreScalar((float*)&dst[x], + PackUnsignedSaturate(RoundShift(sum0123, const64), zero).AsSingle()); } + src += srcStride; dst += dstStride; } @@ -117,22 +118,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp if (Sse41.IsSupported && UseIntrinsics && xStepQ4 == 1 << SubpelBits) { ConvolveHorizSse41(src, srcStride, dst, dstStride, xFilters, x0Q4, w, h); - return; } - int x, y; - src -= SubpelTaps / 2 - 1; + src -= (SubpelTaps / 2) - 1; - for (y = 0; y < h; ++y) + for (int y = 0; y < h; ++y) { int xQ4 = x0Q4; - for (x = 0; x < w; ++x) + for (int x = 0; x < w; ++x) { byte* srcX = &src[xQ4 >> SubpelBits]; ref Array8 xFilter = ref xFilters[xQ4 & SubpelMask]; - int k, sum = 0; - for (k = 0; k < SubpelTaps; ++k) + int sum = 0; + for (int k = 0; k < SubpelTaps; ++k) { sum += srcX[k] * xFilter[k]; } @@ -140,6 +139,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp dst[x] = BitUtils.ClipPixel(BitUtils.RoundPowerOfTwo(sum, FilterBits)); xQ4 += xStepQ4; } + src += srcStride; dst += dstStride; } @@ -156,25 +156,26 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp int w, int h) { - int x, y; - src -= SubpelTaps / 2 - 1; + src -= (SubpelTaps / 2) - 1; - for (y = 0; y < h; ++y) + for (int y = 0; y < h; ++y) { int xQ4 = x0Q4; - for (x = 0; x < w; ++x) + for (int x = 0; x < w; ++x) { byte* srcX = &src[xQ4 >> SubpelBits]; ref Array8 xFilter = ref xFilters[xQ4 & SubpelMask]; - int k, sum = 0; - for (k = 0; k < SubpelTaps; ++k) + int sum = 0; + for (int k = 0; k < SubpelTaps; ++k) { sum += srcX[k] * xFilter[k]; } - dst[x] = (byte)BitUtils.RoundPowerOfTwo(dst[x] + BitUtils.ClipPixel(BitUtils.RoundPowerOfTwo(sum, FilterBits)), 1); + dst[x] = (byte)BitUtils.RoundPowerOfTwo( + dst[x] + BitUtils.ClipPixel(BitUtils.RoundPowerOfTwo(sum, FilterBits)), 1); xQ4 += xStepQ4; } + src += srcStride; dst += dstStride; } @@ -203,18 +204,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp srcStride * 6, srcStride * 7); - ulong x, y; - src -= srcStride * (SubpelTaps / 2 - 1); + src -= srcStride * ((SubpelTaps / 2) - 1); fixed (Array8* yFilter = yFilters) { - Vector128 vfilter = Sse2.LoadVector128((short*)yFilter + (uint)(y0Q4 & SubpelMask) * 8); + Vector128 vfilter = Sse2.LoadVector128((short*)yFilter + ((uint)(y0Q4 & SubpelMask) * 8)); ulong srcBaseY = (uint)y0Q4 >> SubpelBits; - for (y = 0; y < (uint)h; ++y) + for (ulong y = 0; y < (uint)h; ++y) { ulong srcOffset = (srcBaseY + y) * (uint)srcStride; - for (x = 0; x < (uint)w; x += 4) + for (ulong x = 0; x < (uint)w; x += 4) { Vector256 vsrc = Avx2.GatherVector256((uint*)&src[srcOffset + x], indices, 1).AsInt32(); @@ -240,8 +240,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Vector128 sum0123 = MultiplyAddAdjacent(vsrc0, vsrc1, vsrc2, vsrc3, vfilter, zero); - Sse.StoreScalar((float*)&dst[x], PackUnsignedSaturate(RoundShift(sum0123, const64), zero).AsSingle()); + Sse.StoreScalar((float*)&dst[x], + PackUnsignedSaturate(RoundShift(sum0123, const64), zero).AsSingle()); } + dst += dstStride; } } @@ -262,22 +264,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp if (Avx2.IsSupported && UseIntrinsics && yStepQ4 == 1 << SubpelBits) { ConvolveVertAvx2(src, srcStride, dst, dstStride, yFilters, y0Q4, w, h); - return; } - int x, y; - src -= srcStride * (SubpelTaps / 2 - 1); + src -= srcStride * ((SubpelTaps / 2) - 1); - for (x = 0; x < w; ++x) + for (int x = 0; x < w; ++x) { int yQ4 = y0Q4; - for (y = 0; y < h; ++y) + for (int y = 0; y < h; ++y) { byte* srcY = &src[(yQ4 >> SubpelBits) * srcStride]; ref Array8 yFilter = ref yFilters[yQ4 & SubpelMask]; - int k, sum = 0; - for (k = 0; k < SubpelTaps; ++k) + int sum = 0; + for (int k = 0; k < SubpelTaps; ++k) { sum += srcY[k * srcStride] * yFilter[k]; } @@ -285,6 +285,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp dst[y * dstStride] = BitUtils.ClipPixel(BitUtils.RoundPowerOfTwo(sum, FilterBits)); yQ4 += yStepQ4; } + ++src; ++dst; } @@ -301,18 +302,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp int w, int h) { - int x, y; - src -= srcStride * (SubpelTaps / 2 - 1); + src -= srcStride * ((SubpelTaps / 2) - 1); - for (x = 0; x < w; ++x) + for (int x = 0; x < w; ++x) { int yQ4 = y0Q4; - for (y = 0; y < h; ++y) + for (int y = 0; y < h; ++y) { byte* srcY = &src[(yQ4 >> SubpelBits) * srcStride]; ref Array8 yFilter = ref yFilters[yQ4 & SubpelMask]; - int k, sum = 0; - for (k = 0; k < SubpelTaps; ++k) + int sum = 0; + for (int k = 0; k < SubpelTaps; ++k) { sum += srcY[k * srcStride] * yFilter[k]; } @@ -321,6 +321,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp dst[y * dstStride] + BitUtils.ClipPixel(BitUtils.RoundPowerOfTwo(sum, FilterBits)), 1); yQ4 += yStepQ4; } + ++src; ++dst; } @@ -420,15 +421,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // ==> yStepQ4 = 64. Since w and h are at most 16, the temp buffer is still // big enough. byte* temp = stackalloc byte[64 * 135]; - int intermediateHeight = (((h - 1) * yStepQ4 + y0Q4) >> SubpelBits) + SubpelTaps; + int intermediateHeight = ((((h - 1) * yStepQ4) + y0Q4) >> SubpelBits) + SubpelTaps; Debug.Assert(w <= 64); Debug.Assert(h <= 64); Debug.Assert(yStepQ4 <= 32 || (yStepQ4 <= 64 && h <= 32)); Debug.Assert(xStepQ4 <= 64); - ConvolveHoriz(src - srcStride * (SubpelTaps / 2 - 1), srcStride, temp, 64, filter, x0Q4, xStepQ4, w, intermediateHeight); - ConvolveVert(temp + 64 * (SubpelTaps / 2 - 1), 64, dst, dstStride, filter, y0Q4, yStepQ4, w, h); + ConvolveHoriz(src - (srcStride * ((SubpelTaps / 2) - 1)), srcStride, temp, 64, filter, x0Q4, xStepQ4, w, + intermediateHeight); + ConvolveVert(temp + (64 * ((SubpelTaps / 2) - 1)), 64, dst, dstStride, filter, y0Q4, yStepQ4, w, h); } public static unsafe void Convolve8Avg( @@ -489,11 +491,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp int w, int h) { - int x, y; - - for (y = 0; y < h; ++y) + for (int y = 0; y < h; ++y) { - for (x = 0; x < w; ++x) + for (int x = 0; x < w; ++x) { dst[x] = (byte)BitUtils.RoundPowerOfTwo(dst[x] + src[x], 1); } @@ -611,18 +611,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp int h, int bd) { - int x, y; - src -= SubpelTaps / 2 - 1; + src -= (SubpelTaps / 2) - 1; - for (y = 0; y < h; ++y) + for (int y = 0; y < h; ++y) { int xQ4 = x0Q4; - for (x = 0; x < w; ++x) + for (int x = 0; x < w; ++x) { ushort* srcX = &src[xQ4 >> SubpelBits]; ref Array8 xFilter = ref xFilters[xQ4 & SubpelMask]; - int k, sum = 0; - for (k = 0; k < SubpelTaps; ++k) + int sum = 0; + for (int k = 0; k < SubpelTaps; ++k) { sum += srcX[k] * xFilter[k]; } @@ -630,6 +629,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp dst[x] = BitUtils.ClipPixelHighbd(BitUtils.RoundPowerOfTwo(sum, FilterBits), bd); xQ4 += xStepQ4; } + src += srcStride; dst += dstStride; } @@ -647,25 +647,26 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp int h, int bd) { - int x, y; - src -= SubpelTaps / 2 - 1; + src -= (SubpelTaps / 2) - 1; - for (y = 0; y < h; ++y) + for (int y = 0; y < h; ++y) { int xQ4 = x0Q4; - for (x = 0; x < w; ++x) + for (int x = 0; x < w; ++x) { ushort* srcX = &src[xQ4 >> SubpelBits]; ref Array8 xFilter = ref xFilters[xQ4 & SubpelMask]; - int k, sum = 0; - for (k = 0; k < SubpelTaps; ++k) + int sum = 0; + for (int k = 0; k < SubpelTaps; ++k) { sum += srcX[k] * xFilter[k]; } - dst[x] = (ushort)BitUtils.RoundPowerOfTwo(dst[x] + BitUtils.ClipPixelHighbd(BitUtils.RoundPowerOfTwo(sum, FilterBits), bd), 1); + dst[x] = (ushort)BitUtils.RoundPowerOfTwo( + dst[x] + BitUtils.ClipPixelHighbd(BitUtils.RoundPowerOfTwo(sum, FilterBits), bd), 1); xQ4 += xStepQ4; } + src += srcStride; dst += dstStride; } @@ -683,18 +684,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp int h, int bd) { - int x, y; - src -= srcStride * (SubpelTaps / 2 - 1); + src -= srcStride * ((SubpelTaps / 2) - 1); - for (x = 0; x < w; ++x) + for (int x = 0; x < w; ++x) { int yQ4 = y0Q4; - for (y = 0; y < h; ++y) + for (int y = 0; y < h; ++y) { ushort* srcY = &src[(yQ4 >> SubpelBits) * srcStride]; ref Array8 yFilter = ref yFilters[yQ4 & SubpelMask]; - int k, sum = 0; - for (k = 0; k < SubpelTaps; ++k) + int sum = 0; + for (int k = 0; k < SubpelTaps; ++k) { sum += srcY[k * srcStride] * yFilter[k]; } @@ -702,6 +702,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp dst[y * dstStride] = BitUtils.ClipPixelHighbd(BitUtils.RoundPowerOfTwo(sum, FilterBits), bd); yQ4 += yStepQ4; } + ++src; ++dst; } @@ -719,26 +720,27 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp int h, int bd) { - int x, y; - src -= srcStride * (SubpelTaps / 2 - 1); + src -= srcStride * ((SubpelTaps / 2) - 1); - for (x = 0; x < w; ++x) + for (int x = 0; x < w; ++x) { int yQ4 = y0Q4; - for (y = 0; y < h; ++y) + for (int y = 0; y < h; ++y) { ushort* srcY = &src[(yQ4 >> SubpelBits) * srcStride]; ref Array8 yFilter = ref yFilters[yQ4 & SubpelMask]; - int k, sum = 0; - for (k = 0; k < SubpelTaps; ++k) + int sum = 0; + for (int k = 0; k < SubpelTaps; ++k) { sum += srcY[k * srcStride] * yFilter[k]; } dst[y * dstStride] = (ushort)BitUtils.RoundPowerOfTwo( - dst[y * dstStride] + BitUtils.ClipPixelHighbd(BitUtils.RoundPowerOfTwo(sum, FilterBits), bd), 1); + dst[y * dstStride] + BitUtils.ClipPixelHighbd(BitUtils.RoundPowerOfTwo(sum, FilterBits), bd), + 1); yQ4 += yStepQ4; } + ++src; ++dst; } @@ -771,15 +773,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // --Require an additional SubpelTaps rows for the 8-tap filter tails. // --((64 - 1) * 32 + 15) >> 4 + 8 = 135. ushort* temp = stackalloc ushort[64 * 135]; - int intermediateHeight = (((h - 1) * yStepQ4 + y0Q4) >> SubpelBits) + SubpelTaps; + int intermediateHeight = ((((h - 1) * yStepQ4) + y0Q4) >> SubpelBits) + SubpelTaps; Debug.Assert(w <= 64); Debug.Assert(h <= 64); Debug.Assert(yStepQ4 <= 32); Debug.Assert(xStepQ4 <= 32); - HighbdConvolveHoriz(src - srcStride * (SubpelTaps / 2 - 1), srcStride, temp, 64, filter, x0Q4, xStepQ4, w, intermediateHeight, bd); - HighbdConvolveVert(temp + 64 * (SubpelTaps / 2 - 1), 64, dst, dstStride, filter, y0Q4, yStepQ4, w, h, bd); + HighbdConvolveHoriz(src - (srcStride * ((SubpelTaps / 2) - 1)), srcStride, temp, 64, filter, x0Q4, xStepQ4, + w, intermediateHeight, bd); + HighbdConvolveVert(temp + (64 * ((SubpelTaps / 2) - 1)), 64, dst, dstStride, filter, y0Q4, yStepQ4, w, h, + bd); } public static unsafe void HighbdConvolve8Horiz( @@ -928,11 +932,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp int h, int bd) { - int x, y; - - for (y = 0; y < h; ++y) + for (int y = 0; y < h; ++y) { - for (x = 0; x < w; ++x) + for (int x = 0; x < w; ++x) { dst[x] = (ushort)BitUtils.RoundPowerOfTwo(dst[x] + src[x], 1); } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/IntraPred.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/IntraPred.cs index 8a570ed59..926cc88e3 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/IntraPred.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/IntraPred.cs @@ -6,22 +6,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { private static unsafe ref byte Dst(byte* dst, int stride, int x, int y) { - return ref dst[x + y * stride]; + return ref dst[x + (y * stride)]; } private static unsafe ref ushort Dst(ushort* dst, int stride, int x, int y) { - return ref dst[x + y * stride]; + return ref dst[x + (y * stride)]; } private static byte Avg3(byte a, byte b, byte c) { - return (byte)((a + 2 * b + c + 2) >> 2); + return (byte)((a + (2 * b) + c + 2) >> 2); } private static ushort Avg3(ushort a, ushort b, ushort c) { - return (ushort)((a + 2 * b + c + 2) >> 2); + return (ushort)((a + (2 * b) + c + 2) >> 2); } private static byte Avg2(byte a, byte b) @@ -34,26 +34,25 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp return (ushort)((a + b + 1) >> 1); } - public static unsafe void D207Predictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D207Predictor8X8(byte* dst, int stride, byte* above, byte* left) { D207Predictor(dst, stride, 8, above, left); } - public static unsafe void D207Predictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D207Predictor16X16(byte* dst, int stride, byte* above, byte* left) { D207Predictor(dst, stride, 16, above, left); } - public static unsafe void D207Predictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D207Predictor32X32(byte* dst, int stride, byte* above, byte* left) { D207Predictor(dst, stride, 32, above, left); } private static unsafe void D207Predictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int r, c; // First column - for (r = 0; r < bs - 1; ++r) + for (int r = 0; r < bs - 1; ++r) { dst[r * stride] = Avg2(left[r], left[r + 1]); } @@ -62,7 +61,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp dst++; // Second column - for (r = 0; r < bs - 2; ++r) + for (int r = 0; r < bs - 2; ++r) { dst[r * stride] = Avg3(left[r], left[r + 1], left[r + 2]); } @@ -72,64 +71,63 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp dst++; // Rest of last row - for (c = 0; c < bs - 2; ++c) + for (int c = 0; c < bs - 2; ++c) { - dst[(bs - 1) * stride + c] = left[bs - 1]; + dst[((bs - 1) * stride) + c] = left[bs - 1]; } - for (r = bs - 2; r >= 0; --r) + for (int r = bs - 2; r >= 0; --r) { - for (c = 0; c < bs - 2; ++c) + for (int c = 0; c < bs - 2; ++c) { - dst[r * stride + c] = dst[(r + 1) * stride + c - 2]; + dst[(r * stride) + c] = dst[((r + 1) * stride) + c - 2]; } } } - public static unsafe void D63Predictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D63Predictor8X8(byte* dst, int stride, byte* above, byte* left) { D63Predictor(dst, stride, 8, above, left); } - public static unsafe void D63Predictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D63Predictor16X16(byte* dst, int stride, byte* above, byte* left) { D63Predictor(dst, stride, 16, above, left); } - public static unsafe void D63Predictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D63Predictor32X32(byte* dst, int stride, byte* above, byte* left) { D63Predictor(dst, stride, 32, above, left); } private static unsafe void D63Predictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int r, c; - int size; - for (c = 0; c < bs; ++c) + for (int c = 0; c < bs; ++c) { dst[c] = Avg2(above[c], above[c + 1]); dst[stride + c] = Avg3(above[c], above[c + 1], above[c + 2]); } - for (r = 2, size = bs - 2; r < bs; r += 2, --size) + + for (int r = 2, size = bs - 2; r < bs; r += 2, --size) { - MemoryUtil.Copy(dst + (r + 0) * stride, dst + (r >> 1), size); - MemoryUtil.Fill(dst + (r + 0) * stride + size, above[bs - 1], bs - size); - MemoryUtil.Copy(dst + (r + 1) * stride, dst + stride + (r >> 1), size); - MemoryUtil.Fill(dst + (r + 1) * stride + size, above[bs - 1], bs - size); + MemoryUtil.Copy(dst + ((r + 0) * stride), dst + (r >> 1), size); + MemoryUtil.Fill(dst + ((r + 0) * stride) + size, above[bs - 1], bs - size); + MemoryUtil.Copy(dst + ((r + 1) * stride), dst + stride + (r >> 1), size); + MemoryUtil.Fill(dst + ((r + 1) * stride) + size, above[bs - 1], bs - size); } } - public static unsafe void D45Predictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D45Predictor8X8(byte* dst, int stride, byte* above, byte* left) { D45Predictor(dst, stride, 8, above, left); } - public static unsafe void D45Predictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D45Predictor16X16(byte* dst, int stride, byte* above, byte* left) { D45Predictor(dst, stride, 16, above, left); } - public static unsafe void D45Predictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D45Predictor32X32(byte* dst, int stride, byte* above, byte* left) { D45Predictor(dst, stride, 32, above, left); } @@ -138,15 +136,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { byte aboveRight = above[bs - 1]; byte* dstRow0 = dst; - int x, size; - for (x = 0; x < bs - 1; ++x) + for (int x = 0; x < bs - 1; ++x) { dst[x] = Avg3(above[x], above[x + 1], above[x + 2]); } + dst[bs - 1] = aboveRight; dst += stride; - for (x = 1, size = bs - 2; x < bs; ++x, --size) + for (int x = 1, size = bs - 2; x < bs; ++x, --size) { MemoryUtil.Copy(dst, dstRow0 + x, size); MemoryUtil.Fill(dst + size, aboveRight, x + 1); @@ -154,27 +152,25 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } } - public static unsafe void D117Predictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D117Predictor8X8(byte* dst, int stride, byte* above, byte* left) { D117Predictor(dst, stride, 8, above, left); } - public static unsafe void D117Predictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D117Predictor16X16(byte* dst, int stride, byte* above, byte* left) { D117Predictor(dst, stride, 16, above, left); } - public static unsafe void D117Predictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D117Predictor32X32(byte* dst, int stride, byte* above, byte* left) { D117Predictor(dst, stride, 32, above, left); } private static unsafe void D117Predictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int r, c; - // First row - for (c = 0; c < bs; c++) + for (int c = 0; c < bs; c++) { dst[c] = Avg2(above[c - 1], above[c]); } @@ -183,7 +179,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // Second row dst[0] = Avg3(left[0], above[-1], above[0]); - for (c = 1; c < bs; c++) + for (int c = 1; c < bs; c++) { dst[c] = Avg3(above[c - 2], above[c - 1], above[c]); } @@ -192,83 +188,82 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // The rest of first col dst[0] = Avg3(above[-1], left[0], left[1]); - for (r = 3; r < bs; ++r) + for (int r = 3; r < bs; ++r) { dst[(r - 2) * stride] = Avg3(left[r - 3], left[r - 2], left[r - 1]); } // The rest of the block - for (r = 2; r < bs; ++r) + for (int r = 2; r < bs; ++r) { - for (c = 1; c < bs; c++) + for (int c = 1; c < bs; c++) { - dst[c] = dst[-2 * stride + c - 1]; + dst[c] = dst[(-2 * stride) + c - 1]; } dst += stride; } } - public static unsafe void D135Predictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D135Predictor8X8(byte* dst, int stride, byte* above, byte* left) { D135Predictor(dst, stride, 8, above, left); } - public static unsafe void D135Predictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D135Predictor16X16(byte* dst, int stride, byte* above, byte* left) { D135Predictor(dst, stride, 16, above, left); } - public static unsafe void D135Predictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D135Predictor32X32(byte* dst, int stride, byte* above, byte* left) { D135Predictor(dst, stride, 32, above, left); } private static unsafe void D135Predictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int i; byte* border = stackalloc byte[32 + 32 - 1]; // outer border from bottom-left to top-right // Dst(dst, stride, bs, bs - 2)[0], i.e., border starting at bottom-left - for (i = 0; i < bs - 2; ++i) + for (int i = 0; i < bs - 2; ++i) { border[i] = Avg3(left[bs - 3 - i], left[bs - 2 - i], left[bs - 1 - i]); } + border[bs - 2] = Avg3(above[-1], left[0], left[1]); border[bs - 1] = Avg3(left[0], above[-1], above[0]); border[bs - 0] = Avg3(above[-1], above[0], above[1]); // dst[0][2, size), i.e., remaining top border ascending - for (i = 0; i < bs - 2; ++i) + for (int i = 0; i < bs - 2; ++i) { border[bs + 1 + i] = Avg3(above[i], above[i + 1], above[i + 2]); } - for (i = 0; i < bs; ++i) + for (int i = 0; i < bs; ++i) { - MemoryUtil.Copy(dst + i * stride, border + bs - 1 - i, bs); + MemoryUtil.Copy(dst + (i * stride), border + bs - 1 - i, bs); } } - public static unsafe void D153Predictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D153Predictor8X8(byte* dst, int stride, byte* above, byte* left) { D153Predictor(dst, stride, 8, above, left); } - public static unsafe void D153Predictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D153Predictor16X16(byte* dst, int stride, byte* above, byte* left) { D153Predictor(dst, stride, 16, above, left); } - public static unsafe void D153Predictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D153Predictor32X32(byte* dst, int stride, byte* above, byte* left) { D153Predictor(dst, stride, 32, above, left); } private static unsafe void D153Predictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int r, c; dst[0] = Avg2(above[-1], left[0]); - for (r = 1; r < bs; r++) + for (int r = 1; r < bs; r++) { dst[r * stride] = Avg2(left[r - 1], left[r]); } @@ -277,23 +272,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp dst[0] = Avg3(left[0], above[-1], above[0]); dst[stride] = Avg3(above[-1], left[0], left[1]); - for (r = 2; r < bs; r++) + for (int r = 2; r < bs; r++) { dst[r * stride] = Avg3(left[r - 2], left[r - 1], left[r]); } dst++; - for (c = 0; c < bs - 2; c++) + for (int c = 0; c < bs - 2; c++) { dst[c] = Avg3(above[c - 1], above[c], above[c + 1]); } dst += stride; - for (r = 1; r < bs; ++r) + for (int r = 1; r < bs; ++r) { - for (c = 0; c < bs - 2; c++) + for (int c = 0; c < bs - 2; c++) { dst[c] = dst[-stride + c - 2]; } @@ -302,96 +297,91 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } } - public static unsafe void VPredictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void VPredictor4X4(byte* dst, int stride, byte* above, byte* left) { VPredictor(dst, stride, 4, above, left); } - public static unsafe void VPredictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void VPredictor8X8(byte* dst, int stride, byte* above, byte* left) { VPredictor(dst, stride, 8, above, left); } - public static unsafe void VPredictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void VPredictor16X16(byte* dst, int stride, byte* above, byte* left) { VPredictor(dst, stride, 16, above, left); } - public static unsafe void VPredictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void VPredictor32X32(byte* dst, int stride, byte* above, byte* left) { VPredictor(dst, stride, 32, above, left); } private static unsafe void VPredictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int r; - - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Copy(dst, above, bs); dst += stride; } } - public static unsafe void HPredictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void HPredictor4X4(byte* dst, int stride, byte* above, byte* left) { HPredictor(dst, stride, 4, above, left); } - public static unsafe void HPredictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void HPredictor8X8(byte* dst, int stride, byte* above, byte* left) { HPredictor(dst, stride, 8, above, left); } - public static unsafe void HPredictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void HPredictor16X16(byte* dst, int stride, byte* above, byte* left) { HPredictor(dst, stride, 16, above, left); } - public static unsafe void HPredictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void HPredictor32X32(byte* dst, int stride, byte* above, byte* left) { HPredictor(dst, stride, 32, above, left); } private static unsafe void HPredictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int r; - - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Fill(dst, left[r], bs); dst += stride; } } - public static unsafe void TMPredictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void TmPredictor4X4(byte* dst, int stride, byte* above, byte* left) { - TMPredictor(dst, stride, 4, above, left); + TmPredictor(dst, stride, 4, above, left); } - public static unsafe void TMPredictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void TmPredictor8X8(byte* dst, int stride, byte* above, byte* left) { - TMPredictor(dst, stride, 8, above, left); + TmPredictor(dst, stride, 8, above, left); } - public static unsafe void TMPredictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void TmPredictor16X16(byte* dst, int stride, byte* above, byte* left) { - TMPredictor(dst, stride, 16, above, left); + TmPredictor(dst, stride, 16, above, left); } - public static unsafe void TMPredictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void TmPredictor32X32(byte* dst, int stride, byte* above, byte* left) { - TMPredictor(dst, stride, 32, above, left); + TmPredictor(dst, stride, 32, above, left); } - private static unsafe void TMPredictor(byte* dst, int stride, int bs, byte* above, byte* left) + private static unsafe void TmPredictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int r, c; int yTopLeft = above[-1]; - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { - for (c = 0; c < bs; c++) + for (int c = 0; c < bs; c++) { dst[c] = BitUtils.ClipPixel(left[r] + above[c] - yTopLeft); } @@ -400,201 +390,200 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } } - public static unsafe void Dc128Predictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void Dc128Predictor4X4(byte* dst, int stride, byte* above, byte* left) { Dc128Predictor(dst, stride, 4, above, left); } - public static unsafe void Dc128Predictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void Dc128Predictor8X8(byte* dst, int stride, byte* above, byte* left) { Dc128Predictor(dst, stride, 8, above, left); } - public static unsafe void Dc128Predictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void Dc128Predictor16X16(byte* dst, int stride, byte* above, byte* left) { Dc128Predictor(dst, stride, 16, above, left); } - public static unsafe void Dc128Predictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void Dc128Predictor32X32(byte* dst, int stride, byte* above, byte* left) { Dc128Predictor(dst, stride, 32, above, left); } private static unsafe void Dc128Predictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int r; - - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Fill(dst, (byte)128, bs); dst += stride; } } - public static unsafe void DcLeftPredictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcLeftPredictor4X4(byte* dst, int stride, byte* above, byte* left) { DcLeftPredictor(dst, stride, 4, above, left); } - public static unsafe void DcLeftPredictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcLeftPredictor8X8(byte* dst, int stride, byte* above, byte* left) { DcLeftPredictor(dst, stride, 8, above, left); } - public static unsafe void DcLeftPredictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcLeftPredictor16X16(byte* dst, int stride, byte* above, byte* left) { DcLeftPredictor(dst, stride, 16, above, left); } - public static unsafe void DcLeftPredictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcLeftPredictor32X32(byte* dst, int stride, byte* above, byte* left) { DcLeftPredictor(dst, stride, 32, above, left); } private static unsafe void DcLeftPredictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int i, r, expectedDc, sum = 0; + int sum = 0; - for (i = 0; i < bs; i++) + for (int i = 0; i < bs; i++) { sum += left[i]; } - expectedDc = (sum + (bs >> 1)) / bs; + int expectedDc = (sum + (bs >> 1)) / bs; - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Fill(dst, (byte)expectedDc, bs); dst += stride; } } - public static unsafe void DcTopPredictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcTopPredictor4X4(byte* dst, int stride, byte* above, byte* left) { DcTopPredictor(dst, stride, 4, above, left); } - public static unsafe void DcTopPredictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcTopPredictor8X8(byte* dst, int stride, byte* above, byte* left) { DcTopPredictor(dst, stride, 8, above, left); } - public static unsafe void DcTopPredictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcTopPredictor16X16(byte* dst, int stride, byte* above, byte* left) { DcTopPredictor(dst, stride, 16, above, left); } - public static unsafe void DcTopPredictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcTopPredictor32X32(byte* dst, int stride, byte* above, byte* left) { DcTopPredictor(dst, stride, 32, above, left); } private static unsafe void DcTopPredictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int i, r, expectedDc, sum = 0; + int sum = 0; - for (i = 0; i < bs; i++) + for (int i = 0; i < bs; i++) { sum += above[i]; } - expectedDc = (sum + (bs >> 1)) / bs; + int expectedDc = (sum + (bs >> 1)) / bs; - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Fill(dst, (byte)expectedDc, bs); dst += stride; } } - public static unsafe void DcPredictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcPredictor4X4(byte* dst, int stride, byte* above, byte* left) { DcPredictor(dst, stride, 4, above, left); } - public static unsafe void DcPredictor8x8(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcPredictor8X8(byte* dst, int stride, byte* above, byte* left) { DcPredictor(dst, stride, 8, above, left); } - public static unsafe void DcPredictor16x16(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcPredictor16X16(byte* dst, int stride, byte* above, byte* left) { DcPredictor(dst, stride, 16, above, left); } - public static unsafe void DcPredictor32x32(byte* dst, int stride, byte* above, byte* left) + public static unsafe void DcPredictor32X32(byte* dst, int stride, byte* above, byte* left) { DcPredictor(dst, stride, 32, above, left); } private static unsafe void DcPredictor(byte* dst, int stride, int bs, byte* above, byte* left) { - int i, r, expectedDc, sum = 0; + int sum = 0; int count = 2 * bs; - for (i = 0; i < bs; i++) + for (int i = 0; i < bs; i++) { sum += above[i]; sum += left[i]; } - expectedDc = (sum + (count >> 1)) / count; + int expectedDc = (sum + (count >> 1)) / count; - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Fill(dst, (byte)expectedDc, bs); dst += stride; } } - public static unsafe void HePredictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void HePredictor4X4(byte* dst, int stride, byte* above, byte* left) { byte h = above[-1]; - byte I = left[0]; + byte i = left[0]; byte j = left[1]; byte k = left[2]; byte l = left[3]; - MemoryUtil.Fill(dst + stride * 0, Avg3(h, I, j), 4); - MemoryUtil.Fill(dst + stride * 1, Avg3(I, j, k), 4); - MemoryUtil.Fill(dst + stride * 2, Avg3(j, k, l), 4); - MemoryUtil.Fill(dst + stride * 3, Avg3(k, l, l), 4); + MemoryUtil.Fill(dst + (stride * 0), Avg3(h, i, j), 4); + MemoryUtil.Fill(dst + (stride * 1), Avg3(i, j, k), 4); + MemoryUtil.Fill(dst + (stride * 2), Avg3(j, k, l), 4); + MemoryUtil.Fill(dst + (stride * 3), Avg3(k, l, l), 4); } - public static unsafe void VePredictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void VePredictor4X4(byte* dst, int stride, byte* above, byte* left) { byte h = above[-1]; - byte I = above[0]; + byte i = above[0]; byte j = above[1]; byte k = above[2]; byte l = above[3]; byte m = above[4]; - dst[0] = Avg3(h, I, j); - dst[1] = Avg3(I, j, k); + dst[0] = Avg3(h, i, j); + dst[1] = Avg3(i, j, k); dst[2] = Avg3(j, k, l); dst[3] = Avg3(k, l, m); - MemoryUtil.Copy(dst + stride * 1, dst, 4); - MemoryUtil.Copy(dst + stride * 2, dst, 4); - MemoryUtil.Copy(dst + stride * 3, dst, 4); + MemoryUtil.Copy(dst + (stride * 1), dst, 4); + MemoryUtil.Copy(dst + (stride * 2), dst, 4); + MemoryUtil.Copy(dst + (stride * 3), dst, 4); } - public static unsafe void D207Predictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D207Predictor4X4(byte* dst, int stride, byte* above, byte* left) { - byte I = left[0]; + byte i = left[0]; byte j = left[1]; byte k = left[2]; byte l = left[3]; - Dst(dst, stride, 0, 0) = Avg2(I, j); + Dst(dst, stride, 0, 0) = Avg2(i, j); Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k); Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l); - Dst(dst, stride, 1, 0) = Avg3(I, j, k); + Dst(dst, stride, 1, 0) = Avg3(i, j, k); Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l); Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l); - Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) = Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l; + Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) = + Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l; } - public static unsafe void D63Predictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D63Predictor4X4(byte* dst, int stride, byte* above, byte* left) { byte a = above[0]; byte b = above[1]; @@ -616,7 +605,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8 } - public static unsafe void D63ePredictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D63EPredictor4X4(byte* dst, int stride, byte* above, byte* left) { byte a = above[0]; byte b = above[1]; @@ -639,7 +628,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Dst(dst, stride, 3, 3) = Avg3(f, g, h); } - public static unsafe void D45Predictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D45Predictor4X4(byte* dst, int stride, byte* above, byte* left) { byte a = above[0]; byte b = above[1]; @@ -652,13 +641,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Dst(dst, stride, 0, 0) = Avg3(a, b, c); Dst(dst, stride, 1, 0) = Dst(dst, stride, 0, 1) = Avg3(b, c, d); Dst(dst, stride, 2, 0) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 2) = Avg3(c, d, e); - Dst(dst, stride, 3, 0) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 3) = Avg3(d, e, f); + Dst(dst, stride, 3, 0) = + Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 3) = Avg3(d, e, f); Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 3) = Avg3(e, f, g); Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 3) = Avg3(f, g, h); Dst(dst, stride, 3, 3) = h; // differs from vp8 } - public static unsafe void D45ePredictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D45EPredictor4X4(byte* dst, int stride, byte* above, byte* left) { byte a = above[0]; byte b = above[1]; @@ -671,15 +661,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Dst(dst, stride, 0, 0) = Avg3(a, b, c); Dst(dst, stride, 1, 0) = Dst(dst, stride, 0, 1) = Avg3(b, c, d); Dst(dst, stride, 2, 0) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 2) = Avg3(c, d, e); - Dst(dst, stride, 3, 0) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 3) = Avg3(d, e, f); + Dst(dst, stride, 3, 0) = + Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 3) = Avg3(d, e, f); Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 3) = Avg3(e, f, g); Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 3) = Avg3(f, g, h); Dst(dst, stride, 3, 3) = Avg3(g, h, h); } - public static unsafe void D117Predictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D117Predictor4X4(byte* dst, int stride, byte* above, byte* left) { - byte I = left[0]; + byte i = left[0]; byte j = left[1]; byte k = left[2]; byte x = above[-1]; @@ -692,17 +683,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c); Dst(dst, stride, 3, 0) = Avg2(c, d); - Dst(dst, stride, 0, 3) = Avg3(k, j, I); - Dst(dst, stride, 0, 2) = Avg3(j, I, x); - Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(I, x, a); + Dst(dst, stride, 0, 3) = Avg3(k, j, i); + Dst(dst, stride, 0, 2) = Avg3(j, i, x); + Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(i, x, a); Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b); Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c); Dst(dst, stride, 3, 1) = Avg3(b, c, d); } - public static unsafe void D135Predictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D135Predictor4X4(byte* dst, int stride, byte* above, byte* left) { - byte I = left[0]; + byte i = left[0]; byte j = left[1]; byte k = left[2]; byte l = left[3]; @@ -712,17 +703,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp byte c = above[2]; byte d = above[3]; Dst(dst, stride, 0, 3) = Avg3(j, k, l); - Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(I, j, k); - Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, I, j); - Dst(dst, stride, 3, 3) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, I); + Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(i, j, k); + Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, i, j); + Dst(dst, stride, 3, 3) = + Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, i); Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x); Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a); Dst(dst, stride, 3, 0) = Avg3(d, c, b); } - public static unsafe void D153Predictor4x4(byte* dst, int stride, byte* above, byte* left) + public static unsafe void D153Predictor4X4(byte* dst, int stride, byte* above, byte* left) { - byte I = left[0]; + byte i = left[0]; byte j = left[1]; byte k = left[2]; byte l = left[3]; @@ -730,131 +722,133 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp byte a = above[0]; byte b = above[1]; byte c = above[2]; - Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(I, x); - Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, I); + Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(i, x); + Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, i); Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j); Dst(dst, stride, 0, 3) = Avg2(l, k); Dst(dst, stride, 3, 0) = Avg3(a, b, c); Dst(dst, stride, 2, 0) = Avg3(x, a, b); - Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(I, x, a); - Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, I, x); - Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, I); + Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(i, x, a); + Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, i, x); + Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, i); Dst(dst, stride, 1, 3) = Avg3(l, k, j); } - public static unsafe void HighbdD207Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD207Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD207Predictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdD207Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD207Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD207Predictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdD207Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD207Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD207Predictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdD207Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdD207Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int r, c; - // First column. - for (r = 0; r < bs - 1; ++r) + for (int r = 0; r < bs - 1; ++r) { dst[r * stride] = Avg2(left[r], left[r + 1]); } + dst[(bs - 1) * stride] = left[bs - 1]; dst++; // Second column. - for (r = 0; r < bs - 2; ++r) + for (int r = 0; r < bs - 2; ++r) { dst[r * stride] = Avg3(left[r], left[r + 1], left[r + 2]); } + dst[(bs - 2) * stride] = Avg3(left[bs - 2], left[bs - 1], left[bs - 1]); dst[(bs - 1) * stride] = left[bs - 1]; dst++; // Rest of last row. - for (c = 0; c < bs - 2; ++c) + for (int c = 0; c < bs - 2; ++c) { - dst[(bs - 1) * stride + c] = left[bs - 1]; + dst[((bs - 1) * stride) + c] = left[bs - 1]; } - for (r = bs - 2; r >= 0; --r) + for (int r = bs - 2; r >= 0; --r) { - for (c = 0; c < bs - 2; ++c) + for (int c = 0; c < bs - 2; ++c) { - dst[r * stride + c] = dst[(r + 1) * stride + c - 2]; + dst[(r * stride) + c] = dst[((r + 1) * stride) + c - 2]; } } } - public static unsafe void HighbdD63Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD63Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD63Predictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdD63Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD63Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD63Predictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdD63Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD63Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD63Predictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdD63Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdD63Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int r, c; - int size; - for (c = 0; c < bs; ++c) + for (int c = 0; c < bs; ++c) { dst[c] = Avg2(above[c], above[c + 1]); dst[stride + c] = Avg3(above[c], above[c + 1], above[c + 2]); } - for (r = 2, size = bs - 2; r < bs; r += 2, --size) + + for (int r = 2, size = bs - 2; r < bs; r += 2, --size) { - MemoryUtil.Copy(dst + (r + 0) * stride, dst + (r >> 1), size); - MemoryUtil.Fill(dst + (r + 0) * stride + size, above[bs - 1], bs - size); - MemoryUtil.Copy(dst + (r + 1) * stride, dst + stride + (r >> 1), size); - MemoryUtil.Fill(dst + (r + 1) * stride + size, above[bs - 1], bs - size); + MemoryUtil.Copy(dst + ((r + 0) * stride), dst + (r >> 1), size); + MemoryUtil.Fill(dst + ((r + 0) * stride) + size, above[bs - 1], bs - size); + MemoryUtil.Copy(dst + ((r + 1) * stride), dst + stride + (r >> 1), size); + MemoryUtil.Fill(dst + ((r + 1) * stride) + size, above[bs - 1], bs - size); } } - public static unsafe void HighbdD45Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD45Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD45Predictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdD45Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD45Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD45Predictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdD45Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD45Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD45Predictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdD45Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdD45Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { ushort aboveRight = above[bs - 1]; ushort* dstRow0 = dst; - int x, size; - for (x = 0; x < bs - 1; ++x) + for (int x = 0; x < bs - 1; ++x) { dst[x] = Avg3(above[x], above[x + 1], above[x + 2]); } + dst[bs - 1] = aboveRight; dst += stride; - for (x = 1, size = bs - 2; x < bs; ++x, --size) + for (int x = 1, size = bs - 2; x < bs; ++x, --size) { MemoryUtil.Copy(dst, dstRow0 + x, size); MemoryUtil.Fill(dst + size, aboveRight, x + 1); @@ -862,27 +856,26 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } } - public static unsafe void HighbdD117Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD117Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD117Predictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdD117Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD117Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD117Predictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdD117Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD117Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD117Predictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdD117Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdD117Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int r, c; - // First row - for (c = 0; c < bs; c++) + for (int c = 0; c < bs; c++) { dst[c] = Avg2(above[c - 1], above[c]); } @@ -891,7 +884,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // Second row dst[0] = Avg3(left[0], above[-1], above[0]); - for (c = 1; c < bs; c++) + for (int c = 1; c < bs; c++) { dst[c] = Avg3(above[c - 2], above[c - 1], above[c]); } @@ -900,83 +893,84 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // The rest of first col dst[0] = Avg3(above[-1], left[0], left[1]); - for (r = 3; r < bs; ++r) + for (int r = 3; r < bs; ++r) { dst[(r - 2) * stride] = Avg3(left[r - 3], left[r - 2], left[r - 1]); } // The rest of the block - for (r = 2; r < bs; ++r) + for (int r = 2; r < bs; ++r) { - for (c = 1; c < bs; c++) + for (int c = 1; c < bs; c++) { - dst[c] = dst[-2 * stride + c - 1]; + dst[c] = dst[(-2 * stride) + c - 1]; } dst += stride; } } - public static unsafe void HighbdD135Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD135Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD135Predictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdD135Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD135Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD135Predictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdD135Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD135Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD135Predictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdD135Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdD135Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int i; ushort* border = stackalloc ushort[32 + 32 - 1]; // Outer border from bottom-left to top-right // Dst(dst, stride, bs, bs - 2)[0], i.e., border starting at bottom-left - for (i = 0; i < bs - 2; ++i) + for (int i = 0; i < bs - 2; ++i) { border[i] = Avg3(left[bs - 3 - i], left[bs - 2 - i], left[bs - 1 - i]); } + border[bs - 2] = Avg3(above[-1], left[0], left[1]); border[bs - 1] = Avg3(left[0], above[-1], above[0]); border[bs - 0] = Avg3(above[-1], above[0], above[1]); // dst[0][2, size), i.e., remaining top border ascending - for (i = 0; i < bs - 2; ++i) + for (int i = 0; i < bs - 2; ++i) { border[bs + 1 + i] = Avg3(above[i], above[i + 1], above[i + 2]); } - for (i = 0; i < bs; ++i) + for (int i = 0; i < bs; ++i) { - MemoryUtil.Copy(dst + i * stride, border + bs - 1 - i, bs); + MemoryUtil.Copy(dst + (i * stride), border + bs - 1 - i, bs); } } - public static unsafe void HighbdD153Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD153Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD153Predictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdD153Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD153Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD153Predictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdD153Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD153Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdD153Predictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdD153Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdD153Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int r, c; dst[0] = Avg2(above[-1], left[0]); - for (r = 1; r < bs; r++) + for (int r = 1; r < bs; r++) { dst[r * stride] = Avg2(left[r - 1], left[r]); } @@ -985,23 +979,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp dst[0] = Avg3(left[0], above[-1], above[0]); dst[stride] = Avg3(above[-1], left[0], left[1]); - for (r = 2; r < bs; r++) + for (int r = 2; r < bs; r++) { dst[r * stride] = Avg3(left[r - 2], left[r - 1], left[r]); } dst++; - for (c = 0; c < bs - 2; c++) + for (int c = 0; c < bs - 2; c++) { dst[c] = Avg3(above[c - 1], above[c], above[c + 1]); } dst += stride; - for (r = 1; r < bs; ++r) + for (int r = 1; r < bs; ++r) { - for (c = 0; c < bs - 2; c++) + for (int c = 0; c < bs - 2; c++) { dst[c] = dst[-stride + c - 2]; } @@ -1010,94 +1004,94 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } } - public static unsafe void HighbdVPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdVPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdVPredictor(dst, stride, 4, above, left, bd); } - public static unsafe void HighbdVPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdVPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdVPredictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdVPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdVPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdVPredictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdVPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdVPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdVPredictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdVPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdVPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int r; - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Copy(dst, above, bs); dst += stride; } } - public static unsafe void HighbdHPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdHPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdHPredictor(dst, stride, 4, above, left, bd); } - public static unsafe void HighbdHPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdHPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdHPredictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdHPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdHPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdHPredictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdHPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdHPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdHPredictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdHPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdHPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int r; - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Fill(dst, left[r], bs); dst += stride; } } - public static unsafe void HighbdTMPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdTmPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { - HighbdTMPredictor(dst, stride, 4, above, left, bd); + HighbdTmPredictor(dst, stride, 4, above, left, bd); } - public static unsafe void HighbdTMPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdTmPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { - HighbdTMPredictor(dst, stride, 8, above, left, bd); + HighbdTmPredictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdTMPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdTmPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) { - HighbdTMPredictor(dst, stride, 16, above, left, bd); + HighbdTmPredictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdTMPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdTmPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) { - HighbdTMPredictor(dst, stride, 32, above, left, bd); + HighbdTmPredictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdTMPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdTmPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int r, c; int yTopLeft = above[-1]; - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { - for (c = 0; c < bs; c++) + for (int c = 0; c < bs; c++) { dst[c] = BitUtils.ClipPixelHighbd(left[r] + above[c] - yTopLeft, bd); } @@ -1106,169 +1100,178 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } } - public static unsafe void HighbdDc128Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDc128Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdDc128Predictor(dst, stride, 4, above, left, bd); } - public static unsafe void HighbdDc128Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDc128Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdDc128Predictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdDc128Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDc128Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, + int bd) { HighbdDc128Predictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdDc128Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDc128Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, + int bd) { HighbdDc128Predictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdDc128Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdDc128Predictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int r; - - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Fill(dst, (ushort)(128 << (bd - 8)), bs); dst += stride; } } - public static unsafe void HighbdDcLeftPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcLeftPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdDcLeftPredictor(dst, stride, 4, above, left, bd); } - public static unsafe void HighbdDcLeftPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcLeftPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdDcLeftPredictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdDcLeftPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcLeftPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, + int bd) { HighbdDcLeftPredictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdDcLeftPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcLeftPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, + int bd) { HighbdDcLeftPredictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdDcLeftPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdDcLeftPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int i, r, expectedDc, sum = 0; + int sum = 0; - for (i = 0; i < bs; i++) + for (int i = 0; i < bs; i++) { sum += left[i]; } - expectedDc = (sum + (bs >> 1)) / bs; + int expectedDc = (sum + (bs >> 1)) / bs; - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Fill(dst, (ushort)expectedDc, bs); dst += stride; } } - public static unsafe void HighbdDcTopPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcTopPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdDcTopPredictor(dst, stride, 4, above, left, bd); } - public static unsafe void HighbdDcTopPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcTopPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdDcTopPredictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdDcTopPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcTopPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, + int bd) { HighbdDcTopPredictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdDcTopPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcTopPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, + int bd) { HighbdDcTopPredictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdDcTopPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdDcTopPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int i, r, expectedDc, sum = 0; + int sum = 0; - for (i = 0; i < bs; i++) + for (int i = 0; i < bs; i++) { sum += above[i]; } - expectedDc = (sum + (bs >> 1)) / bs; + int expectedDc = (sum + (bs >> 1)) / bs; - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Fill(dst, (ushort)expectedDc, bs); dst += stride; } } - public static unsafe void HighbdDcPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdDcPredictor(dst, stride, 4, above, left, bd); } - public static unsafe void HighbdDcPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdDcPredictor(dst, stride, 8, above, left, bd); } - public static unsafe void HighbdDcPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdDcPredictor(dst, stride, 16, above, left, bd); } - public static unsafe void HighbdDcPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdDcPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) { HighbdDcPredictor(dst, stride, 32, above, left, bd); } - private static unsafe void HighbdDcPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, int bd) + private static unsafe void HighbdDcPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, + int bd) { - int i, r, expectedDc, sum = 0; + int sum = 0; int count = 2 * bs; - for (i = 0; i < bs; i++) + for (int i = 0; i < bs; i++) { sum += above[i]; sum += left[i]; } - expectedDc = (sum + (count >> 1)) / count; + int expectedDc = (sum + (count >> 1)) / count; - for (r = 0; r < bs; r++) + for (int r = 0; r < bs; r++) { MemoryUtil.Fill(dst, (ushort)expectedDc, bs); dst += stride; } } - public static unsafe void HighbdD207Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD207Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { - ushort I = left[0]; + ushort i = left[0]; ushort j = left[1]; ushort k = left[2]; ushort l = left[3]; - Dst(dst, stride, 0, 0) = Avg2(I, j); + Dst(dst, stride, 0, 0) = Avg2(i, j); Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k); Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l); - Dst(dst, stride, 1, 0) = Avg3(I, j, k); + Dst(dst, stride, 1, 0) = Avg3(i, j, k); Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l); Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l); - Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) = Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l; + Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) = + Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l; } - public static unsafe void HighbdD63Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD63Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { ushort a = above[0]; ushort b = above[1]; @@ -1290,7 +1293,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8 } - public static unsafe void HighbdD45Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD45Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { ushort a = above[0]; ushort b = above[1]; @@ -1303,15 +1306,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Dst(dst, stride, 0, 0) = Avg3(a, b, c); Dst(dst, stride, 1, 0) = Dst(dst, stride, 0, 1) = Avg3(b, c, d); Dst(dst, stride, 2, 0) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 2) = Avg3(c, d, e); - Dst(dst, stride, 3, 0) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 3) = Avg3(d, e, f); + Dst(dst, stride, 3, 0) = + Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 3) = Avg3(d, e, f); Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 3) = Avg3(e, f, g); Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 3) = Avg3(f, g, h); Dst(dst, stride, 3, 3) = h; // Differs from vp8 } - public static unsafe void HighbdD117Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD117Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { - ushort I = left[0]; + ushort i = left[0]; ushort j = left[1]; ushort k = left[2]; ushort x = above[-1]; @@ -1324,17 +1328,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c); Dst(dst, stride, 3, 0) = Avg2(c, d); - Dst(dst, stride, 0, 3) = Avg3(k, j, I); - Dst(dst, stride, 0, 2) = Avg3(j, I, x); - Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(I, x, a); + Dst(dst, stride, 0, 3) = Avg3(k, j, i); + Dst(dst, stride, 0, 2) = Avg3(j, i, x); + Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(i, x, a); Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b); Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c); Dst(dst, stride, 3, 1) = Avg3(b, c, d); } - public static unsafe void HighbdD135Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD135Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { - ushort I = left[0]; + ushort i = left[0]; ushort j = left[1]; ushort k = left[2]; ushort l = left[3]; @@ -1344,17 +1348,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp ushort c = above[2]; ushort d = above[3]; Dst(dst, stride, 0, 3) = Avg3(j, k, l); - Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(I, j, k); - Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, I, j); - Dst(dst, stride, 3, 3) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, I); + Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(i, j, k); + Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, i, j); + Dst(dst, stride, 3, 3) = + Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, i); Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x); Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a); Dst(dst, stride, 3, 0) = Avg3(d, c, b); } - public static unsafe void HighbdD153Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) + public static unsafe void HighbdD153Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) { - ushort I = left[0]; + ushort i = left[0]; ushort j = left[1]; ushort k = left[2]; ushort l = left[3]; @@ -1363,16 +1368,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp ushort b = above[1]; ushort c = above[2]; - Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(I, x); - Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, I); + Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(i, x); + Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, i); Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j); Dst(dst, stride, 0, 3) = Avg2(l, k); Dst(dst, stride, 3, 0) = Avg3(a, b, c); Dst(dst, stride, 2, 0) = Avg3(x, a, b); - Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(I, x, a); - Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, I, x); - Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, I); + Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(i, x, a); + Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, i, x); + Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, i); Dst(dst, stride, 1, 3) = Avg3(l, k, j); } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/InvTxfm.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/InvTxfm.cs index c4f45bfda..7a1601395 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/InvTxfm.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/InvTxfm.cs @@ -10,13 +10,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { // 12 signal input bits + 7 2D forward transform amplify bits + 5 1D inverse // transform amplify bits + 1 bit for contingency in rounding and quantizing - private const int HighbdValidTxfmMagnitudeRange = (1 << 25); + private const int HighbdValidTxfmMagnitudeRange = 1 << 25; [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int DetectInvalidHighbdInput(ReadOnlySpan input, int size) { - int i; - for (i = 0; i < size; ++i) + for (int i = 0; i < size; ++i) { if (Math.Abs(input[i]) >= HighbdValidTxfmMagnitudeRange) { @@ -35,7 +34,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // of this range for invalid/corrupt VP9 streams. Debug.Assert(short.MinValue <= input); Debug.Assert(input <= short.MaxValue); - return input; } @@ -71,7 +69,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp public static byte ClipPixelAdd(byte dest, long trans) { trans = WrapLow(trans); - return BitUtils.ClipPixel(dest + (int)trans); } @@ -79,7 +76,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp public static ushort HighbdClipPixelAdd(ushort dest, long trans, int bd) { trans = HighbdWrapLow(trans, bd); - return BitUtils.ClipPixelHighbd(dest + (int)trans, bd); } @@ -87,22 +83,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp private static long DctConstRoundShift(long input) { long rv = BitUtils.RoundPowerOfTwo(input, DctConstBits); - return rv; } [SkipLocalsInit] - public static void Iwht4x416Add(ReadOnlySpan input, Span dest, int stride) + public static void Iwht4X416Add(ReadOnlySpan input, Span dest, int stride) { /* 4-point reversible, orthonormal inverse Walsh-Hadamard in 3.5 adds, 0.5 shifts per pixel. */ - int i; + Span output = stackalloc int[16]; long a1, b1, c1, d1, e1; ReadOnlySpan ip = input; Span op = output; - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { a1 = ip[0] >> UnitQuantShift; c1 = ip[1] >> UnitQuantShift; @@ -124,7 +119,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } Span ip2 = output; - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { a1 = ip2[4 * 0]; c1 = ip2[4 * 1]; @@ -148,9 +143,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void Iwht4x41Add(ReadOnlySpan input, Span dest, int stride) + public static void Iwht4X41Add(ReadOnlySpan input, Span dest, int stride) { - int i; long a1, e1; Span tmp = stackalloc int[4]; ReadOnlySpan ip = input; @@ -163,7 +157,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp op[1] = op[2] = op[3] = WrapLow(e1); Span ip2 = tmp; - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { e1 = ip2[0] >> 1; a1 = ip2[0] - e1; @@ -187,24 +181,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp if ((x0 | x1 | x2 | x3) == 0) { output[..4].Clear(); - return; } // 32-bit result is enough for the following multiplications. - s0 = SinPi1_9 * x0; - s1 = SinPi2_9 * x0; - s2 = SinPi3_9 * x1; - s3 = SinPi4_9 * x2; - s4 = SinPi1_9 * x2; - s5 = SinPi2_9 * x3; - s6 = SinPi4_9 * x3; + s0 = SinPi19 * x0; + s1 = SinPi29 * x0; + s2 = SinPi39 * x1; + s3 = SinPi49 * x2; + s4 = SinPi19 * x2; + s5 = SinPi29 * x3; + s6 = SinPi49 * x3; s7 = WrapLow(x0 - x2 + x3); s0 = s0 + s3 + s5; s1 = s1 - s4 - s6; s3 = s2; - s2 = SinPi3_9 * s7; + s2 = SinPi39 * s7; // 1-D transform scaling factor is sqrt(2). // The overall dynamic range is 14b (input) + 14b (multiplication scaling) @@ -223,12 +216,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp long temp1, temp2; // stage 1 - temp1 = ((short)input[0] + (short)input[2]) * CosPi16_64; - temp2 = ((short)input[0] - (short)input[2]) * CosPi16_64; + temp1 = ((short)input[0] + (short)input[2]) * CosPi1664; + temp2 = ((short)input[0] - (short)input[2]) * CosPi1664; step[0] = (short)WrapLow(DctConstRoundShift(temp1)); step[1] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (short)input[1] * CosPi24_64 - (short)input[3] * CosPi8_64; - temp2 = (short)input[1] * CosPi8_64 + (short)input[3] * CosPi24_64; + temp1 = ((short)input[1] * CosPi2464) - ((short)input[3] * CosPi864); + temp2 = ((short)input[1] * CosPi864) + ((short)input[3] * CosPi2464); step[2] = (short)WrapLow(DctConstRoundShift(temp1)); step[3] = (short)WrapLow(DctConstRoundShift(temp2)); @@ -240,16 +233,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void Idct4x416Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct4X416Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; Span output = stackalloc int[4 * 4]; Span outptr = output; Span tempIn = stackalloc int[4]; Span tempOut = stackalloc int[4]; // Rows - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { Idct4(input, outptr); input = input[4..]; @@ -257,31 +249,31 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Columns - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { - for (j = 0; j < 4; ++j) + for (int j = 0; j < 4; ++j) { - tempIn[j] = output[j * 4 + i]; + tempIn[j] = output[(j * 4) + i]; } Idct4(tempIn, tempOut); - for (j = 0; j < 4; ++j) + for (int j = 0; j < 4; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 4)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 4)); } } } - public static void Idct4x41Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct4X41Add(ReadOnlySpan input, Span dest, int stride) { - int i; long a1; - int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi16_64)); + int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); - output = WrapLow(DctConstRoundShift(output * CosPi16_64)); + output = WrapLow(DctConstRoundShift(output * CosPi1664)); a1 = BitUtils.RoundPowerOfTwo(output, 4); - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { dest[0] = ClipPixelAdd(dest[0], a1); dest[1] = ClipPixelAdd(dest[1], a1); @@ -306,19 +298,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp if ((x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7) == 0) { output[..8].Clear(); - return; } // stage 1 - s0 = (int)(CosPi2_64 * x0 + CosPi30_64 * x1); - s1 = (int)(CosPi30_64 * x0 - CosPi2_64 * x1); - s2 = (int)(CosPi10_64 * x2 + CosPi22_64 * x3); - s3 = (int)(CosPi22_64 * x2 - CosPi10_64 * x3); - s4 = (int)(CosPi18_64 * x4 + CosPi14_64 * x5); - s5 = (int)(CosPi14_64 * x4 - CosPi18_64 * x5); - s6 = (int)(CosPi26_64 * x6 + CosPi6_64 * x7); - s7 = (int)(CosPi6_64 * x6 - CosPi26_64 * x7); + s0 = (int)((CosPi264 * x0) + (CosPi3064 * x1)); + s1 = (int)((CosPi3064 * x0) - (CosPi264 * x1)); + s2 = (int)((CosPi1064 * x2) + (CosPi2264 * x3)); + s3 = (int)((CosPi2264 * x2) - (CosPi1064 * x3)); + s4 = (int)((CosPi1864 * x4) + (CosPi1464 * x5)); + s5 = (int)((CosPi1464 * x4) - (CosPi1864 * x5)); + s6 = (int)((CosPi2664 * x6) + (CosPi664 * x7)); + s7 = (int)((CosPi664 * x6) - (CosPi2664 * x7)); x0 = WrapLow(DctConstRoundShift(s0 + s4)); x1 = WrapLow(DctConstRoundShift(s1 + s5)); @@ -334,10 +325,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp s1 = (int)x1; s2 = (int)x2; s3 = (int)x3; - s4 = (int)(CosPi8_64 * x4 + CosPi24_64 * x5); - s5 = (int)(CosPi24_64 * x4 - CosPi8_64 * x5); - s6 = (int)(-CosPi24_64 * x6 + CosPi8_64 * x7); - s7 = (int)(CosPi8_64 * x6 + CosPi24_64 * x7); + s4 = (int)((CosPi864 * x4) + (CosPi2464 * x5)); + s5 = (int)((CosPi2464 * x4) - (CosPi864 * x5)); + s6 = (int)((-CosPi2464 * x6) + (CosPi864 * x7)); + s7 = (int)((CosPi864 * x6) + (CosPi2464 * x7)); x0 = WrapLow(s0 + s2); x1 = WrapLow(s1 + s3); @@ -349,10 +340,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp x7 = WrapLow(DctConstRoundShift(s5 - s7)); // stage 3 - s2 = (int)(CosPi16_64 * (x2 + x3)); - s3 = (int)(CosPi16_64 * (x2 - x3)); - s6 = (int)(CosPi16_64 * (x6 + x7)); - s7 = (int)(CosPi16_64 * (x6 - x7)); + s2 = (int)(CosPi1664 * (x2 + x3)); + s3 = (int)(CosPi1664 * (x2 - x3)); + s6 = (int)(CosPi1664 * (x6 + x7)); + s7 = (int)(CosPi1664 * (x6 - x7)); x2 = WrapLow(DctConstRoundShift(s2)); x3 = WrapLow(DctConstRoundShift(s3)); @@ -381,22 +372,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = (short)input[4]; step1[1] = (short)input[2]; step1[3] = (short)input[6]; - temp1 = (short)input[1] * CosPi28_64 - (short)input[7] * CosPi4_64; - temp2 = (short)input[1] * CosPi4_64 + (short)input[7] * CosPi28_64; + temp1 = ((short)input[1] * CosPi2864) - ((short)input[7] * CosPi464); + temp2 = ((short)input[1] * CosPi464) + ((short)input[7] * CosPi2864); step1[4] = (short)WrapLow(DctConstRoundShift(temp1)); step1[7] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (short)input[5] * CosPi12_64 - (short)input[3] * CosPi20_64; - temp2 = (short)input[5] * CosPi20_64 + (short)input[3] * CosPi12_64; + temp1 = ((short)input[5] * CosPi1264) - ((short)input[3] * CosPi2064); + temp2 = ((short)input[5] * CosPi2064) + ((short)input[3] * CosPi1264); step1[5] = (short)WrapLow(DctConstRoundShift(temp1)); step1[6] = (short)WrapLow(DctConstRoundShift(temp2)); // stage 2 - temp1 = (step1[0] + step1[2]) * CosPi16_64; - temp2 = (step1[0] - step1[2]) * CosPi16_64; + temp1 = (step1[0] + step1[2]) * CosPi1664; + temp2 = (step1[0] - step1[2]) * CosPi1664; step2[0] = (short)WrapLow(DctConstRoundShift(temp1)); step2[1] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step1[1] * CosPi24_64 - step1[3] * CosPi8_64; - temp2 = step1[1] * CosPi8_64 + step1[3] * CosPi24_64; + temp1 = (step1[1] * CosPi2464) - (step1[3] * CosPi864); + temp2 = (step1[1] * CosPi864) + (step1[3] * CosPi2464); step2[2] = (short)WrapLow(DctConstRoundShift(temp1)); step2[3] = (short)WrapLow(DctConstRoundShift(temp2)); step2[4] = (short)WrapLow(step1[4] + step1[5]); @@ -410,8 +401,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = (short)WrapLow(step2[1] - step2[2]); step1[3] = (short)WrapLow(step2[0] - step2[3]); step1[4] = step2[4]; - temp1 = (step2[6] - step2[5]) * CosPi16_64; - temp2 = (step2[5] + step2[6]) * CosPi16_64; + temp1 = (step2[6] - step2[5]) * CosPi1664; + temp2 = (step2[5] + step2[6]) * CosPi1664; step1[5] = (short)WrapLow(DctConstRoundShift(temp1)); step1[6] = (short)WrapLow(DctConstRoundShift(temp2)); step1[7] = step2[7]; @@ -428,16 +419,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void Idct8x864Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct8X864Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; Span output = stackalloc int[8 * 8]; Span outptr = output; Span tempIn = stackalloc int[8]; Span tempOut = stackalloc int[8]; // First transform rows - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { Idct8(input, outptr); input = input[8..]; @@ -445,26 +435,25 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Then transform columns - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - tempIn[j] = output[j * 8 + i]; + tempIn[j] = output[(j * 8) + i]; } Idct8(tempIn, tempOut); - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], - BitUtils.RoundPowerOfTwo(tempOut[j], 5)); + dest[(j * stride) + i] = ClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 5)); } } } [SkipLocalsInit] - public static void Idct8x812Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct8X812Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; Span output = stackalloc int[8 * 8]; Span outptr = output; Span tempIn = stackalloc int[8]; @@ -474,7 +463,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // First transform rows // Only first 4 row has non-zero coefs - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { Idct8(input, outptr); input = input[8..]; @@ -482,32 +471,32 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Then transform columns - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - tempIn[j] = output[j * 8 + i]; + tempIn[j] = output[(j * 8) + i]; } Idct8(tempIn, tempOut); - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 5)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 5)); } } } - public static void Idct8x81Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct8X81Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; long a1; - int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi16_64)); + int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); - output = WrapLow(DctConstRoundShift(output * CosPi16_64)); + output = WrapLow(DctConstRoundShift(output * CosPi1664)); a1 = BitUtils.RoundPowerOfTwo(output, 5); - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { dest[i] = ClipPixelAdd(dest[i], a1); } @@ -540,27 +529,26 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp if ((x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15) == 0) { output[..16].Clear(); - return; } // stage 1 - s0 = x0 * CosPi1_64 + x1 * CosPi31_64; - s1 = x0 * CosPi31_64 - x1 * CosPi1_64; - s2 = x2 * CosPi5_64 + x3 * CosPi27_64; - s3 = x2 * CosPi27_64 - x3 * CosPi5_64; - s4 = x4 * CosPi9_64 + x5 * CosPi23_64; - s5 = x4 * CosPi23_64 - x5 * CosPi9_64; - s6 = x6 * CosPi13_64 + x7 * CosPi19_64; - s7 = x6 * CosPi19_64 - x7 * CosPi13_64; - s8 = x8 * CosPi17_64 + x9 * CosPi15_64; - s9 = x8 * CosPi15_64 - x9 * CosPi17_64; - s10 = x10 * CosPi21_64 + x11 * CosPi11_64; - s11 = x10 * CosPi11_64 - x11 * CosPi21_64; - s12 = x12 * CosPi25_64 + x13 * CosPi7_64; - s13 = x12 * CosPi7_64 - x13 * CosPi25_64; - s14 = x14 * CosPi29_64 + x15 * CosPi3_64; - s15 = x14 * CosPi3_64 - x15 * CosPi29_64; + s0 = (x0 * CosPi164) + (x1 * CosPi3164); + s1 = (x0 * CosPi3164) - (x1 * CosPi164); + s2 = (x2 * CosPi564) + (x3 * CosPi2764); + s3 = (x2 * CosPi2764) - (x3 * CosPi564); + s4 = (x4 * CosPi964) + (x5 * CosPi2364); + s5 = (x4 * CosPi2364) - (x5 * CosPi964); + s6 = (x6 * CosPi1364) + (x7 * CosPi1964); + s7 = (x6 * CosPi1964) - (x7 * CosPi1364); + s8 = (x8 * CosPi1764) + (x9 * CosPi1564); + s9 = (x8 * CosPi1564) - (x9 * CosPi1764); + s10 = (x10 * CosPi2164) + (x11 * CosPi1164); + s11 = (x10 * CosPi1164) - (x11 * CosPi2164); + s12 = (x12 * CosPi2564) + (x13 * CosPi764); + s13 = (x12 * CosPi764) - (x13 * CosPi2564); + s14 = (x14 * CosPi2964) + (x15 * CosPi364); + s15 = (x14 * CosPi364) - (x15 * CosPi2964); x0 = WrapLow(DctConstRoundShift(s0 + s8)); x1 = WrapLow(DctConstRoundShift(s1 + s9)); @@ -588,14 +576,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp s5 = x5; s6 = x6; s7 = x7; - s8 = x8 * CosPi4_64 + x9 * CosPi28_64; - s9 = x8 * CosPi28_64 - x9 * CosPi4_64; - s10 = x10 * CosPi20_64 + x11 * CosPi12_64; - s11 = x10 * CosPi12_64 - x11 * CosPi20_64; - s12 = -x12 * CosPi28_64 + x13 * CosPi4_64; - s13 = x12 * CosPi4_64 + x13 * CosPi28_64; - s14 = -x14 * CosPi12_64 + x15 * CosPi20_64; - s15 = x14 * CosPi20_64 + x15 * CosPi12_64; + s8 = (x8 * CosPi464) + (x9 * CosPi2864); + s9 = (x8 * CosPi2864) - (x9 * CosPi464); + s10 = (x10 * CosPi2064) + (x11 * CosPi1264); + s11 = (x10 * CosPi1264) - (x11 * CosPi2064); + s12 = (-x12 * CosPi2864) + (x13 * CosPi464); + s13 = (x12 * CosPi464) + (x13 * CosPi2864); + s14 = (-x14 * CosPi1264) + (x15 * CosPi2064); + s15 = (x14 * CosPi2064) + (x15 * CosPi1264); x0 = WrapLow(s0 + s4); x1 = WrapLow(s1 + s5); @@ -619,18 +607,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp s1 = x1; s2 = x2; s3 = x3; - s4 = x4 * CosPi8_64 + x5 * CosPi24_64; - s5 = x4 * CosPi24_64 - x5 * CosPi8_64; - s6 = -x6 * CosPi24_64 + x7 * CosPi8_64; - s7 = x6 * CosPi8_64 + x7 * CosPi24_64; + s4 = (x4 * CosPi864) + (x5 * CosPi2464); + s5 = (x4 * CosPi2464) - (x5 * CosPi864); + s6 = (-x6 * CosPi2464) + (x7 * CosPi864); + s7 = (x6 * CosPi864) + (x7 * CosPi2464); s8 = x8; s9 = x9; s10 = x10; s11 = x11; - s12 = x12 * CosPi8_64 + x13 * CosPi24_64; - s13 = x12 * CosPi24_64 - x13 * CosPi8_64; - s14 = -x14 * CosPi24_64 + x15 * CosPi8_64; - s15 = x14 * CosPi8_64 + x15 * CosPi24_64; + s12 = (x12 * CosPi864) + (x13 * CosPi2464); + s13 = (x12 * CosPi2464) - (x13 * CosPi864); + s14 = (-x14 * CosPi2464) + (x15 * CosPi864); + s15 = (x14 * CosPi864) + (x15 * CosPi2464); x0 = WrapLow(s0 + s2); x1 = WrapLow(s1 + s3); @@ -650,14 +638,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp x15 = WrapLow(DctConstRoundShift(s13 - s15)); // stage 4 - s2 = (-CosPi16_64) * (x2 + x3); - s3 = CosPi16_64 * (x2 - x3); - s6 = CosPi16_64 * (x6 + x7); - s7 = CosPi16_64 * (-x6 + x7); - s10 = CosPi16_64 * (x10 + x11); - s11 = CosPi16_64 * (-x10 + x11); - s14 = (-CosPi16_64) * (x14 + x15); - s15 = CosPi16_64 * (x14 - x15); + s2 = -CosPi1664 * (x2 + x3); + s3 = CosPi1664 * (x2 - x3); + s6 = CosPi1664 * (x6 + x7); + s7 = CosPi1664 * (-x6 + x7); + s10 = CosPi1664 * (x10 + x11); + s11 = CosPi1664 * (-x10 + x11); + s14 = -CosPi1664 * (x14 + x15); + s15 = CosPi1664 * (x14 - x15); x2 = WrapLow(DctConstRoundShift(s2)); x3 = WrapLow(DctConstRoundShift(s3)); @@ -721,23 +709,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[6] = step1[6]; step2[7] = step1[7]; - temp1 = step1[8] * CosPi30_64 - step1[15] * CosPi2_64; - temp2 = step1[8] * CosPi2_64 + step1[15] * CosPi30_64; + temp1 = (step1[8] * CosPi3064) - (step1[15] * CosPi264); + temp2 = (step1[8] * CosPi264) + (step1[15] * CosPi3064); step2[8] = (short)WrapLow(DctConstRoundShift(temp1)); step2[15] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step1[9] * CosPi14_64 - step1[14] * CosPi18_64; - temp2 = step1[9] * CosPi18_64 + step1[14] * CosPi14_64; + temp1 = (step1[9] * CosPi1464) - (step1[14] * CosPi1864); + temp2 = (step1[9] * CosPi1864) + (step1[14] * CosPi1464); step2[9] = (short)WrapLow(DctConstRoundShift(temp1)); step2[14] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step1[10] * CosPi22_64 - step1[13] * CosPi10_64; - temp2 = step1[10] * CosPi10_64 + step1[13] * CosPi22_64; + temp1 = (step1[10] * CosPi2264) - (step1[13] * CosPi1064); + temp2 = (step1[10] * CosPi1064) + (step1[13] * CosPi2264); step2[10] = (short)WrapLow(DctConstRoundShift(temp1)); step2[13] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step1[11] * CosPi6_64 - step1[12] * CosPi26_64; - temp2 = step1[11] * CosPi26_64 + step1[12] * CosPi6_64; + temp1 = (step1[11] * CosPi664) - (step1[12] * CosPi2664); + temp2 = (step1[11] * CosPi2664) + (step1[12] * CosPi664); step2[11] = (short)WrapLow(DctConstRoundShift(temp1)); step2[12] = (short)WrapLow(DctConstRoundShift(temp2)); @@ -747,12 +735,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = step2[2]; step1[3] = step2[3]; - temp1 = step2[4] * CosPi28_64 - step2[7] * CosPi4_64; - temp2 = step2[4] * CosPi4_64 + step2[7] * CosPi28_64; + temp1 = (step2[4] * CosPi2864) - (step2[7] * CosPi464); + temp2 = (step2[4] * CosPi464) + (step2[7] * CosPi2864); step1[4] = (short)WrapLow(DctConstRoundShift(temp1)); step1[7] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step2[5] * CosPi12_64 - step2[6] * CosPi20_64; - temp2 = step2[5] * CosPi20_64 + step2[6] * CosPi12_64; + temp1 = (step2[5] * CosPi1264) - (step2[6] * CosPi2064); + temp2 = (step2[5] * CosPi2064) + (step2[6] * CosPi1264); step1[5] = (short)WrapLow(DctConstRoundShift(temp1)); step1[6] = (short)WrapLow(DctConstRoundShift(temp2)); @@ -766,12 +754,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[15] = (short)WrapLow(step2[14] + step2[15]); // stage 4 - temp1 = (step1[0] + step1[1]) * CosPi16_64; - temp2 = (step1[0] - step1[1]) * CosPi16_64; + temp1 = (step1[0] + step1[1]) * CosPi1664; + temp2 = (step1[0] - step1[1]) * CosPi1664; step2[0] = (short)WrapLow(DctConstRoundShift(temp1)); step2[1] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step1[2] * CosPi24_64 - step1[3] * CosPi8_64; - temp2 = step1[2] * CosPi8_64 + step1[3] * CosPi24_64; + temp1 = (step1[2] * CosPi2464) - (step1[3] * CosPi864); + temp2 = (step1[2] * CosPi864) + (step1[3] * CosPi2464); step2[2] = (short)WrapLow(DctConstRoundShift(temp1)); step2[3] = (short)WrapLow(DctConstRoundShift(temp2)); step2[4] = (short)WrapLow(step1[4] + step1[5]); @@ -781,12 +769,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[8] = step1[8]; step2[15] = step1[15]; - temp1 = -step1[9] * CosPi8_64 + step1[14] * CosPi24_64; - temp2 = step1[9] * CosPi24_64 + step1[14] * CosPi8_64; + temp1 = (-step1[9] * CosPi864) + (step1[14] * CosPi2464); + temp2 = (step1[9] * CosPi2464) + (step1[14] * CosPi864); step2[9] = (short)WrapLow(DctConstRoundShift(temp1)); step2[14] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = -step1[10] * CosPi24_64 - step1[13] * CosPi8_64; - temp2 = -step1[10] * CosPi8_64 + step1[13] * CosPi24_64; + temp1 = (-step1[10] * CosPi2464) - (step1[13] * CosPi864); + temp2 = (-step1[10] * CosPi864) + (step1[13] * CosPi2464); step2[10] = (short)WrapLow(DctConstRoundShift(temp1)); step2[13] = (short)WrapLow(DctConstRoundShift(temp2)); step2[11] = step1[11]; @@ -798,8 +786,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = (short)WrapLow(step2[1] - step2[2]); step1[3] = (short)WrapLow(step2[0] - step2[3]); step1[4] = step2[4]; - temp1 = (step2[6] - step2[5]) * CosPi16_64; - temp2 = (step2[5] + step2[6]) * CosPi16_64; + temp1 = (step2[6] - step2[5]) * CosPi1664; + temp2 = (step2[5] + step2[6]) * CosPi1664; step1[5] = (short)WrapLow(DctConstRoundShift(temp1)); step1[6] = (short)WrapLow(DctConstRoundShift(temp2)); step1[7] = step2[7]; @@ -824,12 +812,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[7] = (short)WrapLow(step1[0] - step1[7]); step2[8] = step1[8]; step2[9] = step1[9]; - temp1 = (-step1[10] + step1[13]) * CosPi16_64; - temp2 = (step1[10] + step1[13]) * CosPi16_64; + temp1 = (-step1[10] + step1[13]) * CosPi1664; + temp2 = (step1[10] + step1[13]) * CosPi1664; step2[10] = (short)WrapLow(DctConstRoundShift(temp1)); step2[13] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (-step1[11] + step1[12]) * CosPi16_64; - temp2 = (step1[11] + step1[12]) * CosPi16_64; + temp1 = (-step1[11] + step1[12]) * CosPi1664; + temp2 = (step1[11] + step1[12]) * CosPi1664; step2[11] = (short)WrapLow(DctConstRoundShift(temp1)); step2[12] = (short)WrapLow(DctConstRoundShift(temp2)); step2[14] = step1[14]; @@ -855,16 +843,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void Idct16x16256Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct16X16256Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; Span output = stackalloc int[16 * 16]; Span outptr = output; Span tempIn = stackalloc int[16]; Span tempOut = stackalloc int[16]; // First transform rows - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { Idct16(input, outptr); input = input[16..]; @@ -872,25 +859,25 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Then transform columns - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - tempIn[j] = output[j * 16 + i]; + tempIn[j] = output[(j * 16) + i]; } Idct16(tempIn, tempOut); - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); } } } [SkipLocalsInit] - public static void Idct16x1638Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct16X1638Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; Span output = stackalloc int[16 * 16]; Span outptr = output; Span tempIn = stackalloc int[16]; @@ -900,7 +887,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // First transform rows. Since all non-zero dct coefficients are in // upper-left 8x8 area, we only need to calculate first 8 rows here. - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { Idct16(input, outptr); input = input[16..]; @@ -908,25 +895,25 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Then transform columns - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - tempIn[j] = output[j * 16 + i]; + tempIn[j] = output[(j * 16) + i]; } Idct16(tempIn, tempOut); - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); } } } [SkipLocalsInit] - public static void Idct16x1610Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct16X1610Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; Span output = stackalloc int[16 * 16]; Span outptr = output; Span tempIn = stackalloc int[16]; @@ -936,7 +923,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // First transform rows. Since all non-zero dct coefficients are in // upper-left 4x4 area, we only need to calculate first 4 rows here. - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { Idct16(input, outptr); input = input[16..]; @@ -944,32 +931,32 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Then transform columns - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - tempIn[j] = output[j * 16 + i]; + tempIn[j] = output[(j * 16) + i]; } Idct16(tempIn, tempOut); - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); } } } - public static void Idct16x161Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct16X161Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; long a1; - int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi16_64)); + int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); - output = WrapLow(DctConstRoundShift(output * CosPi16_64)); + output = WrapLow(DctConstRoundShift(output * CosPi1664)); a1 = BitUtils.RoundPowerOfTwo(output, 6); - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { dest[i] = ClipPixelAdd(dest[i], a1); } @@ -1003,43 +990,43 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[14] = (short)input[14]; step1[15] = (short)input[30]; - temp1 = (short)input[1] * CosPi31_64 - (short)input[31] * CosPi1_64; - temp2 = (short)input[1] * CosPi1_64 + (short)input[31] * CosPi31_64; + temp1 = ((short)input[1] * CosPi3164) - ((short)input[31] * CosPi164); + temp2 = ((short)input[1] * CosPi164) + ((short)input[31] * CosPi3164); step1[16] = (short)WrapLow(DctConstRoundShift(temp1)); step1[31] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (short)input[17] * CosPi15_64 - (short)input[15] * CosPi17_64; - temp2 = (short)input[17] * CosPi17_64 + (short)input[15] * CosPi15_64; + temp1 = ((short)input[17] * CosPi1564) - ((short)input[15] * CosPi1764); + temp2 = ((short)input[17] * CosPi1764) + ((short)input[15] * CosPi1564); step1[17] = (short)WrapLow(DctConstRoundShift(temp1)); step1[30] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (short)input[9] * CosPi23_64 - (short)input[23] * CosPi9_64; - temp2 = (short)input[9] * CosPi9_64 + (short)input[23] * CosPi23_64; + temp1 = ((short)input[9] * CosPi2364) - ((short)input[23] * CosPi964); + temp2 = ((short)input[9] * CosPi964) + ((short)input[23] * CosPi2364); step1[18] = (short)WrapLow(DctConstRoundShift(temp1)); step1[29] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (short)input[25] * CosPi7_64 - (short)input[7] * CosPi25_64; - temp2 = (short)input[25] * CosPi25_64 + (short)input[7] * CosPi7_64; + temp1 = ((short)input[25] * CosPi764) - ((short)input[7] * CosPi2564); + temp2 = ((short)input[25] * CosPi2564) + ((short)input[7] * CosPi764); step1[19] = (short)WrapLow(DctConstRoundShift(temp1)); step1[28] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (short)input[5] * CosPi27_64 - (short)input[27] * CosPi5_64; - temp2 = (short)input[5] * CosPi5_64 + (short)input[27] * CosPi27_64; + temp1 = ((short)input[5] * CosPi2764) - ((short)input[27] * CosPi564); + temp2 = ((short)input[5] * CosPi564) + ((short)input[27] * CosPi2764); step1[20] = (short)WrapLow(DctConstRoundShift(temp1)); step1[27] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (short)input[21] * CosPi11_64 - (short)input[11] * CosPi21_64; - temp2 = (short)input[21] * CosPi21_64 + (short)input[11] * CosPi11_64; + temp1 = ((short)input[21] * CosPi1164) - ((short)input[11] * CosPi2164); + temp2 = ((short)input[21] * CosPi2164) + ((short)input[11] * CosPi1164); step1[21] = (short)WrapLow(DctConstRoundShift(temp1)); step1[26] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (short)input[13] * CosPi19_64 - (short)input[19] * CosPi13_64; - temp2 = (short)input[13] * CosPi13_64 + (short)input[19] * CosPi19_64; + temp1 = ((short)input[13] * CosPi1964) - ((short)input[19] * CosPi1364); + temp2 = ((short)input[13] * CosPi1364) + ((short)input[19] * CosPi1964); step1[22] = (short)WrapLow(DctConstRoundShift(temp1)); step1[25] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (short)input[29] * CosPi3_64 - (short)input[3] * CosPi29_64; - temp2 = (short)input[29] * CosPi29_64 + (short)input[3] * CosPi3_64; + temp1 = ((short)input[29] * CosPi364) - ((short)input[3] * CosPi2964); + temp2 = ((short)input[29] * CosPi2964) + ((short)input[3] * CosPi364); step1[23] = (short)WrapLow(DctConstRoundShift(temp1)); step1[24] = (short)WrapLow(DctConstRoundShift(temp2)); @@ -1053,23 +1040,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[6] = step1[6]; step2[7] = step1[7]; - temp1 = step1[8] * CosPi30_64 - step1[15] * CosPi2_64; - temp2 = step1[8] * CosPi2_64 + step1[15] * CosPi30_64; + temp1 = (step1[8] * CosPi3064) - (step1[15] * CosPi264); + temp2 = (step1[8] * CosPi264) + (step1[15] * CosPi3064); step2[8] = (short)WrapLow(DctConstRoundShift(temp1)); step2[15] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step1[9] * CosPi14_64 - step1[14] * CosPi18_64; - temp2 = step1[9] * CosPi18_64 + step1[14] * CosPi14_64; + temp1 = (step1[9] * CosPi1464) - (step1[14] * CosPi1864); + temp2 = (step1[9] * CosPi1864) + (step1[14] * CosPi1464); step2[9] = (short)WrapLow(DctConstRoundShift(temp1)); step2[14] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step1[10] * CosPi22_64 - step1[13] * CosPi10_64; - temp2 = step1[10] * CosPi10_64 + step1[13] * CosPi22_64; + temp1 = (step1[10] * CosPi2264) - (step1[13] * CosPi1064); + temp2 = (step1[10] * CosPi1064) + (step1[13] * CosPi2264); step2[10] = (short)WrapLow(DctConstRoundShift(temp1)); step2[13] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step1[11] * CosPi6_64 - step1[12] * CosPi26_64; - temp2 = step1[11] * CosPi26_64 + step1[12] * CosPi6_64; + temp1 = (step1[11] * CosPi664) - (step1[12] * CosPi2664); + temp2 = (step1[11] * CosPi2664) + (step1[12] * CosPi664); step2[11] = (short)WrapLow(DctConstRoundShift(temp1)); step2[12] = (short)WrapLow(DctConstRoundShift(temp2)); @@ -1096,12 +1083,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = step2[2]; step1[3] = step2[3]; - temp1 = step2[4] * CosPi28_64 - step2[7] * CosPi4_64; - temp2 = step2[4] * CosPi4_64 + step2[7] * CosPi28_64; + temp1 = (step2[4] * CosPi2864) - (step2[7] * CosPi464); + temp2 = (step2[4] * CosPi464) + (step2[7] * CosPi2864); step1[4] = (short)WrapLow(DctConstRoundShift(temp1)); step1[7] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step2[5] * CosPi12_64 - step2[6] * CosPi20_64; - temp2 = step2[5] * CosPi20_64 + step2[6] * CosPi12_64; + temp1 = (step2[5] * CosPi1264) - (step2[6] * CosPi2064); + temp2 = (step2[5] * CosPi2064) + (step2[6] * CosPi1264); step1[5] = (short)WrapLow(DctConstRoundShift(temp1)); step1[6] = (short)WrapLow(DctConstRoundShift(temp2)); @@ -1116,22 +1103,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[16] = step2[16]; step1[31] = step2[31]; - temp1 = -step2[17] * CosPi4_64 + step2[30] * CosPi28_64; - temp2 = step2[17] * CosPi28_64 + step2[30] * CosPi4_64; + temp1 = (-step2[17] * CosPi464) + (step2[30] * CosPi2864); + temp2 = (step2[17] * CosPi2864) + (step2[30] * CosPi464); step1[17] = (short)WrapLow(DctConstRoundShift(temp1)); step1[30] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = -step2[18] * CosPi28_64 - step2[29] * CosPi4_64; - temp2 = -step2[18] * CosPi4_64 + step2[29] * CosPi28_64; + temp1 = (-step2[18] * CosPi2864) - (step2[29] * CosPi464); + temp2 = (-step2[18] * CosPi464) + (step2[29] * CosPi2864); step1[18] = (short)WrapLow(DctConstRoundShift(temp1)); step1[29] = (short)WrapLow(DctConstRoundShift(temp2)); step1[19] = step2[19]; step1[20] = step2[20]; - temp1 = -step2[21] * CosPi20_64 + step2[26] * CosPi12_64; - temp2 = step2[21] * CosPi12_64 + step2[26] * CosPi20_64; + temp1 = (-step2[21] * CosPi2064) + (step2[26] * CosPi1264); + temp2 = (step2[21] * CosPi1264) + (step2[26] * CosPi2064); step1[21] = (short)WrapLow(DctConstRoundShift(temp1)); step1[26] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = -step2[22] * CosPi12_64 - step2[25] * CosPi20_64; - temp2 = -step2[22] * CosPi20_64 + step2[25] * CosPi12_64; + temp1 = (-step2[22] * CosPi1264) - (step2[25] * CosPi2064); + temp2 = (-step2[22] * CosPi2064) + (step2[25] * CosPi1264); step1[22] = (short)WrapLow(DctConstRoundShift(temp1)); step1[25] = (short)WrapLow(DctConstRoundShift(temp2)); step1[23] = step2[23]; @@ -1140,12 +1127,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[28] = step2[28]; // stage 4 - temp1 = (step1[0] + step1[1]) * CosPi16_64; - temp2 = (step1[0] - step1[1]) * CosPi16_64; + temp1 = (step1[0] + step1[1]) * CosPi1664; + temp2 = (step1[0] - step1[1]) * CosPi1664; step2[0] = (short)WrapLow(DctConstRoundShift(temp1)); step2[1] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = step1[2] * CosPi24_64 - step1[3] * CosPi8_64; - temp2 = step1[2] * CosPi8_64 + step1[3] * CosPi24_64; + temp1 = (step1[2] * CosPi2464) - (step1[3] * CosPi864); + temp2 = (step1[2] * CosPi864) + (step1[3] * CosPi2464); step2[2] = (short)WrapLow(DctConstRoundShift(temp1)); step2[3] = (short)WrapLow(DctConstRoundShift(temp2)); step2[4] = (short)WrapLow(step1[4] + step1[5]); @@ -1155,12 +1142,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[8] = step1[8]; step2[15] = step1[15]; - temp1 = -step1[9] * CosPi8_64 + step1[14] * CosPi24_64; - temp2 = step1[9] * CosPi24_64 + step1[14] * CosPi8_64; + temp1 = (-step1[9] * CosPi864) + (step1[14] * CosPi2464); + temp2 = (step1[9] * CosPi2464) + (step1[14] * CosPi864); step2[9] = (short)WrapLow(DctConstRoundShift(temp1)); step2[14] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = -step1[10] * CosPi24_64 - step1[13] * CosPi8_64; - temp2 = -step1[10] * CosPi8_64 + step1[13] * CosPi24_64; + temp1 = (-step1[10] * CosPi2464) - (step1[13] * CosPi864); + temp2 = (-step1[10] * CosPi864) + (step1[13] * CosPi2464); step2[10] = (short)WrapLow(DctConstRoundShift(temp1)); step2[13] = (short)WrapLow(DctConstRoundShift(temp2)); step2[11] = step1[11]; @@ -1190,8 +1177,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = (short)WrapLow(step2[1] - step2[2]); step1[3] = (short)WrapLow(step2[0] - step2[3]); step1[4] = step2[4]; - temp1 = (step2[6] - step2[5]) * CosPi16_64; - temp2 = (step2[5] + step2[6]) * CosPi16_64; + temp1 = (step2[6] - step2[5]) * CosPi1664; + temp2 = (step2[5] + step2[6]) * CosPi1664; step1[5] = (short)WrapLow(DctConstRoundShift(temp1)); step1[6] = (short)WrapLow(DctConstRoundShift(temp2)); step1[7] = step2[7]; @@ -1207,20 +1194,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[16] = step2[16]; step1[17] = step2[17]; - temp1 = -step2[18] * CosPi8_64 + step2[29] * CosPi24_64; - temp2 = step2[18] * CosPi24_64 + step2[29] * CosPi8_64; + temp1 = (-step2[18] * CosPi864) + (step2[29] * CosPi2464); + temp2 = (step2[18] * CosPi2464) + (step2[29] * CosPi864); step1[18] = (short)WrapLow(DctConstRoundShift(temp1)); step1[29] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = -step2[19] * CosPi8_64 + step2[28] * CosPi24_64; - temp2 = step2[19] * CosPi24_64 + step2[28] * CosPi8_64; + temp1 = (-step2[19] * CosPi864) + (step2[28] * CosPi2464); + temp2 = (step2[19] * CosPi2464) + (step2[28] * CosPi864); step1[19] = (short)WrapLow(DctConstRoundShift(temp1)); step1[28] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = -step2[20] * CosPi24_64 - step2[27] * CosPi8_64; - temp2 = -step2[20] * CosPi8_64 + step2[27] * CosPi24_64; + temp1 = (-step2[20] * CosPi2464) - (step2[27] * CosPi864); + temp2 = (-step2[20] * CosPi864) + (step2[27] * CosPi2464); step1[20] = (short)WrapLow(DctConstRoundShift(temp1)); step1[27] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = -step2[21] * CosPi24_64 - step2[26] * CosPi8_64; - temp2 = -step2[21] * CosPi8_64 + step2[26] * CosPi24_64; + temp1 = (-step2[21] * CosPi2464) - (step2[26] * CosPi864); + temp2 = (-step2[21] * CosPi864) + (step2[26] * CosPi2464); step1[21] = (short)WrapLow(DctConstRoundShift(temp1)); step1[26] = (short)WrapLow(DctConstRoundShift(temp2)); step1[22] = step2[22]; @@ -1241,12 +1228,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[7] = (short)WrapLow(step1[0] - step1[7]); step2[8] = step1[8]; step2[9] = step1[9]; - temp1 = (-step1[10] + step1[13]) * CosPi16_64; - temp2 = (step1[10] + step1[13]) * CosPi16_64; + temp1 = (-step1[10] + step1[13]) * CosPi1664; + temp2 = (step1[10] + step1[13]) * CosPi1664; step2[10] = (short)WrapLow(DctConstRoundShift(temp1)); step2[13] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (-step1[11] + step1[12]) * CosPi16_64; - temp2 = (step1[11] + step1[12]) * CosPi16_64; + temp1 = (-step1[11] + step1[12]) * CosPi1664; + temp2 = (step1[11] + step1[12]) * CosPi1664; step2[11] = (short)WrapLow(DctConstRoundShift(temp1)); step2[12] = (short)WrapLow(DctConstRoundShift(temp2)); step2[14] = step1[14]; @@ -1292,20 +1279,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[17] = step2[17]; step1[18] = step2[18]; step1[19] = step2[19]; - temp1 = (-step2[20] + step2[27]) * CosPi16_64; - temp2 = (step2[20] + step2[27]) * CosPi16_64; + temp1 = (-step2[20] + step2[27]) * CosPi1664; + temp2 = (step2[20] + step2[27]) * CosPi1664; step1[20] = (short)WrapLow(DctConstRoundShift(temp1)); step1[27] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (-step2[21] + step2[26]) * CosPi16_64; - temp2 = (step2[21] + step2[26]) * CosPi16_64; + temp1 = (-step2[21] + step2[26]) * CosPi1664; + temp2 = (step2[21] + step2[26]) * CosPi1664; step1[21] = (short)WrapLow(DctConstRoundShift(temp1)); step1[26] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (-step2[22] + step2[25]) * CosPi16_64; - temp2 = (step2[22] + step2[25]) * CosPi16_64; + temp1 = (-step2[22] + step2[25]) * CosPi1664; + temp2 = (step2[22] + step2[25]) * CosPi1664; step1[22] = (short)WrapLow(DctConstRoundShift(temp1)); step1[25] = (short)WrapLow(DctConstRoundShift(temp2)); - temp1 = (-step2[23] + step2[24]) * CosPi16_64; - temp2 = (step2[23] + step2[24]) * CosPi16_64; + temp1 = (-step2[23] + step2[24]) * CosPi1664; + temp2 = (step2[23] + step2[24]) * CosPi1664; step1[23] = (short)WrapLow(DctConstRoundShift(temp1)); step1[24] = (short)WrapLow(DctConstRoundShift(temp2)); step1[28] = step2[28]; @@ -1349,19 +1336,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void Idct32x321024Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct32X321024Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; Span output = stackalloc int[32 * 32]; Span outptr = output; Span tempIn = stackalloc int[32]; Span tempOut = stackalloc int[32]; // Rows - for (i = 0; i < 32; ++i) + for (int i = 0; i < 32; ++i) { short zeroCoeff = 0; - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { zeroCoeff |= (short)input[j]; } @@ -1380,25 +1366,25 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Columns - for (i = 0; i < 32; ++i) + for (int i = 0; i < 32; ++i) { - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - tempIn[j] = output[j * 32 + i]; + tempIn[j] = output[(j * 32) + i]; } Idct32(tempIn, tempOut); - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); } } } [SkipLocalsInit] - public static void Idct32x32135Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct32X32135Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; Span output = stackalloc int[32 * 32]; Span outptr = output; Span tempIn = stackalloc int[32]; @@ -1408,7 +1394,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // Rows // Only upper-left 16x16 has non-zero coeff - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { Idct32(input, outptr); input = input[32..]; @@ -1416,25 +1402,25 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Columns - for (i = 0; i < 32; ++i) + for (int i = 0; i < 32; ++i) { - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - tempIn[j] = output[j * 32 + i]; + tempIn[j] = output[(j * 32) + i]; } Idct32(tempIn, tempOut); - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); } } } [SkipLocalsInit] - public static void Idct32x3234Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct32X3234Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; Span output = stackalloc int[32 * 32]; Span outptr = output; Span tempIn = stackalloc int[32]; @@ -1444,7 +1430,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // Rows // Only upper-left 8x8 has non-zero coeff - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { Idct32(input, outptr); input = input[32..]; @@ -1452,33 +1438,33 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Columns - for (i = 0; i < 32; ++i) + for (int i = 0; i < 32; ++i) { - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - tempIn[j] = output[j * 32 + i]; + tempIn[j] = output[(j * 32) + i]; } Idct32(tempIn, tempOut); - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); } } } - public static void Idct32x321Add(ReadOnlySpan input, Span dest, int stride) + public static void Idct32X321Add(ReadOnlySpan input, Span dest, int stride) { - int i, j; long a1; - int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi16_64)); + int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); - output = WrapLow(DctConstRoundShift(output * CosPi16_64)); + output = WrapLow(DctConstRoundShift(output * CosPi1664)); a1 = BitUtils.RoundPowerOfTwo(output, 6); - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - for (i = 0; i < 32; ++i) + for (int i = 0; i < 32; ++i) { dest[i] = ClipPixelAdd(dest[i], a1); } @@ -1488,17 +1474,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void HighbdIwht4x416Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIwht4X416Add(ReadOnlySpan input, Span dest, int stride, int bd) { /* 4-point reversible, orthonormal inverse Walsh-Hadamard in 3.5 adds, 0.5 shifts per pixel. */ - int i; + Span output = stackalloc int[16]; long a1, b1, c1, d1, e1; ReadOnlySpan ip = input; Span op = output; - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { a1 = ip[0] >> UnitQuantShift; c1 = ip[1] >> UnitQuantShift; @@ -1520,7 +1506,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } ReadOnlySpan ip2 = output; - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { a1 = ip2[4 * 0]; c1 = ip2[4 * 1]; @@ -1544,9 +1530,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void HighbdIwht4x41Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIwht4X41Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i; long a1, e1; Span tmp = stackalloc int[4]; ReadOnlySpan ip = input; @@ -1559,7 +1544,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp op[1] = op[2] = op[3] = HighbdWrapLow(e1, bd); ReadOnlySpan ip2 = tmp; - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { e1 = ip2[0] >> 1; a1 = ip2[0] - e1; @@ -1584,30 +1569,28 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { Debug.Assert(false, "invalid highbd txfm input"); output[..4].Clear(); - return; } if ((x0 | x1 | x2 | x3) == 0) { output[..4].Clear(); - return; } - s0 = (long)SinPi1_9 * x0; - s1 = (long)SinPi2_9 * x0; - s2 = (long)SinPi3_9 * x1; - s3 = (long)SinPi4_9 * x2; - s4 = (long)SinPi1_9 * x2; - s5 = (long)SinPi2_9 * x3; - s6 = (long)SinPi4_9 * x3; + s0 = (long)SinPi19 * x0; + s1 = (long)SinPi29 * x0; + s2 = (long)SinPi39 * x1; + s3 = (long)SinPi49 * x2; + s4 = (long)SinPi19 * x2; + s5 = (long)SinPi29 * x3; + s6 = (long)SinPi49 * x3; s7 = HighbdWrapLow(x0 - x2 + x3, bd); s0 = s0 + s3 + s5; s1 = s1 - s4 - s6; s3 = s2; - s2 = SinPi3_9 * s7; + s2 = SinPi39 * s7; // 1-D transform scaling factor is sqrt(2). // The overall dynamic range is 14b (input) + 14b (multiplication scaling) @@ -1629,17 +1612,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { Debug.Assert(false, "invalid highbd txfm input"); output[..4].Clear(); - return; } // stage 1 - temp1 = (input[0] + input[2]) * (long)CosPi16_64; - temp2 = (input[0] - input[2]) * (long)CosPi16_64; + temp1 = (input[0] + input[2]) * (long)CosPi1664; + temp2 = (input[0] - input[2]) * (long)CosPi1664; step[0] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step[1] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = input[1] * (long)CosPi24_64 - input[3] * (long)CosPi8_64; - temp2 = input[1] * (long)CosPi8_64 + input[3] * (long)CosPi24_64; + temp1 = (input[1] * (long)CosPi2464) - (input[3] * (long)CosPi864); + temp2 = (input[1] * (long)CosPi864) + (input[3] * (long)CosPi2464); step[2] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step[3] = HighbdWrapLow(DctConstRoundShift(temp2), bd); @@ -1651,16 +1633,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void HighbdIdct4x416Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct4X416Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; Span output = stackalloc int[4 * 4]; Span outptr = output; Span tempIn = stackalloc int[4]; Span tempOut = stackalloc int[4]; // Rows - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { HighbdIdct4(input, outptr, bd); input = input[4..]; @@ -1668,31 +1649,31 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Columns - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { - for (j = 0; j < 4; ++j) + for (int j = 0; j < 4; ++j) { - tempIn[j] = output[j * 4 + i]; + tempIn[j] = output[(j * 4) + i]; } HighbdIdct4(tempIn, tempOut, bd); - for (j = 0; j < 4; ++j) + for (int j = 0; j < 4; ++j) { - dest[j * stride + i] = HighbdClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 4), bd); + dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 4), bd); } } } - public static void HighbdIdct4x41Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct4X41Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i; long a1; - int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi16_64), bd); + int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); - output = HighbdWrapLow(DctConstRoundShift(output * (long)CosPi16_64), bd); + output = HighbdWrapLow(DctConstRoundShift(output * (long)CosPi1664), bd); a1 = BitUtils.RoundPowerOfTwo(output, 4); - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { dest[0] = HighbdClipPixelAdd(dest[0], a1, bd); dest[1] = HighbdClipPixelAdd(dest[1], a1, bd); @@ -1718,26 +1699,24 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { Debug.Assert(false, "invalid highbd txfm input"); output[..8].Clear(); - return; } if ((x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7) == 0) { output[..8].Clear(); - return; } // stage 1 - s0 = (long)CosPi2_64 * x0 + (long)CosPi30_64 * x1; - s1 = (long)CosPi30_64 * x0 - (long)CosPi2_64 * x1; - s2 = (long)CosPi10_64 * x2 + (long)CosPi22_64 * x3; - s3 = (long)CosPi22_64 * x2 - (long)CosPi10_64 * x3; - s4 = (long)CosPi18_64 * x4 + (long)CosPi14_64 * x5; - s5 = (long)CosPi14_64 * x4 - (long)CosPi18_64 * x5; - s6 = (long)CosPi26_64 * x6 + (long)CosPi6_64 * x7; - s7 = (long)CosPi6_64 * x6 - (long)CosPi26_64 * x7; + s0 = ((long)CosPi264 * x0) + ((long)CosPi3064 * x1); + s1 = ((long)CosPi3064 * x0) - ((long)CosPi264 * x1); + s2 = ((long)CosPi1064 * x2) + ((long)CosPi2264 * x3); + s3 = ((long)CosPi2264 * x2) - ((long)CosPi1064 * x3); + s4 = ((long)CosPi1864 * x4) + ((long)CosPi1464 * x5); + s5 = ((long)CosPi1464 * x4) - ((long)CosPi1864 * x5); + s6 = ((long)CosPi2664 * x6) + ((long)CosPi664 * x7); + s7 = ((long)CosPi664 * x6) - ((long)CosPi2664 * x7); x0 = HighbdWrapLow(DctConstRoundShift(s0 + s4), bd); x1 = HighbdWrapLow(DctConstRoundShift(s1 + s5), bd); @@ -1753,10 +1732,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp s1 = x1; s2 = x2; s3 = x3; - s4 = (long)CosPi8_64 * x4 + (long)CosPi24_64 * x5; - s5 = (long)CosPi24_64 * x4 - (long)CosPi8_64 * x5; - s6 = (long)(-CosPi24_64) * x6 + (long)CosPi8_64 * x7; - s7 = (long)CosPi8_64 * x6 + (long)CosPi24_64 * x7; + s4 = ((long)CosPi864 * x4) + ((long)CosPi2464 * x5); + s5 = ((long)CosPi2464 * x4) - ((long)CosPi864 * x5); + s6 = ((long)-CosPi2464 * x6) + ((long)CosPi864 * x7); + s7 = ((long)CosPi864 * x6) + ((long)CosPi2464 * x7); x0 = HighbdWrapLow(s0 + s2, bd); x1 = HighbdWrapLow(s1 + s3, bd); @@ -1768,10 +1747,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp x7 = HighbdWrapLow(DctConstRoundShift(s5 - s7), bd); // stage 3 - s2 = (long)CosPi16_64 * (x2 + x3); - s3 = (long)CosPi16_64 * (x2 - x3); - s6 = (long)CosPi16_64 * (x6 + x7); - s7 = (long)CosPi16_64 * (x6 - x7); + s2 = (long)CosPi1664 * (x2 + x3); + s3 = (long)CosPi1664 * (x2 - x3); + s6 = (long)CosPi1664 * (x6 + x7); + s7 = (long)CosPi1664 * (x6 - x7); x2 = HighbdWrapLow(DctConstRoundShift(s2), bd); x3 = HighbdWrapLow(DctConstRoundShift(s3), bd); @@ -1799,7 +1778,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { Debug.Assert(false, "invalid highbd txfm input"); output[..8].Clear(); - return; } @@ -1808,12 +1786,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = input[4]; step1[1] = input[2]; step1[3] = input[6]; - temp1 = input[1] * (long)CosPi28_64 - input[7] * (long)CosPi4_64; - temp2 = input[1] * (long)CosPi4_64 + input[7] * (long)CosPi28_64; + temp1 = (input[1] * (long)CosPi2864) - (input[7] * (long)CosPi464); + temp2 = (input[1] * (long)CosPi464) + (input[7] * (long)CosPi2864); step1[4] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[7] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = input[5] * (long)CosPi12_64 - input[3] * (long)CosPi20_64; - temp2 = input[5] * (long)CosPi20_64 + input[3] * (long)CosPi12_64; + temp1 = (input[5] * (long)CosPi1264) - (input[3] * (long)CosPi2064); + temp2 = (input[5] * (long)CosPi2064) + (input[3] * (long)CosPi1264); step1[5] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[6] = HighbdWrapLow(DctConstRoundShift(temp2), bd); @@ -1828,8 +1806,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // stage 3 - odd half step1[4] = step2[4]; - temp1 = (step2[6] - step2[5]) * (long)CosPi16_64; - temp2 = (step2[5] + step2[6]) * (long)CosPi16_64; + temp1 = (step2[6] - step2[5]) * (long)CosPi1664; + temp2 = (step2[5] + step2[6]) * (long)CosPi1664; step1[5] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[6] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step1[7] = step2[7]; @@ -1846,16 +1824,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void HighbdIdct8x864Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct8X864Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; Span output = stackalloc int[8 * 8]; Span outptr = output; Span tempIn = stackalloc int[8]; Span tempOut = stackalloc int[8]; // First transform rows - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { HighbdIdct8(input, outptr, bd); input = input[8..]; @@ -1863,25 +1840,25 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Then transform columns - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - tempIn[j] = output[j * 8 + i]; + tempIn[j] = output[(j * 8) + i]; } HighbdIdct8(tempIn, tempOut, bd); - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - dest[j * stride + i] = HighbdClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 5), bd); + dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 5), bd); } } } [SkipLocalsInit] - public static void HighbdIdct8x812Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct8X812Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; Span output = stackalloc int[8 * 8]; Span outptr = output; Span tempIn = stackalloc int[8]; @@ -1891,7 +1868,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // First transform rows // Only first 4 row has non-zero coefs - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { HighbdIdct8(input, outptr, bd); input = input[8..]; @@ -1899,32 +1876,32 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Then transform columns - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - tempIn[j] = output[j * 8 + i]; + tempIn[j] = output[(j * 8) + i]; } HighbdIdct8(tempIn, tempOut, bd); - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - dest[j * stride + i] = HighbdClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 5), bd); + dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 5), bd); } } } - public static void Vpx_Highbdidct8x8_1_add_c(ReadOnlySpan input, Span dest, int stride, int bd) + public static void VpxHighbdidct8X81AddC(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; long a1; - int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi16_64), bd); + int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); - output = HighbdWrapLow(DctConstRoundShift(output * (long)CosPi16_64), bd); + output = HighbdWrapLow(DctConstRoundShift(output * (long)CosPi1664), bd); a1 = BitUtils.RoundPowerOfTwo(output, 5); - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { dest[i] = HighbdClipPixelAdd(dest[i], a1, bd); } @@ -1953,39 +1930,36 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp int x13 = input[12]; int x14 = input[1]; int x15 = input[14]; - if (DetectInvalidHighbdInput(input, 16) != 0) { Debug.Assert(false, "invalid highbd txfm input"); output[..16].Clear(); - return; } if ((x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15) == 0) { output[..16].Clear(); - return; } // stage 1 - s0 = x0 * (long)CosPi1_64 + x1 * (long)CosPi31_64; - s1 = x0 * (long)CosPi31_64 - x1 * (long)CosPi1_64; - s2 = x2 * (long)CosPi5_64 + x3 * (long)CosPi27_64; - s3 = x2 * (long)CosPi27_64 - x3 * (long)CosPi5_64; - s4 = x4 * (long)CosPi9_64 + x5 * (long)CosPi23_64; - s5 = x4 * (long)CosPi23_64 - x5 * (long)CosPi9_64; - s6 = x6 * (long)CosPi13_64 + x7 * (long)CosPi19_64; - s7 = x6 * (long)CosPi19_64 - x7 * (long)CosPi13_64; - s8 = x8 * (long)CosPi17_64 + x9 * (long)CosPi15_64; - s9 = x8 * (long)CosPi15_64 - x9 * (long)CosPi17_64; - s10 = x10 * (long)CosPi21_64 + x11 * (long)CosPi11_64; - s11 = x10 * (long)CosPi11_64 - x11 * (long)CosPi21_64; - s12 = x12 * (long)CosPi25_64 + x13 * (long)CosPi7_64; - s13 = x12 * (long)CosPi7_64 - x13 * (long)CosPi25_64; - s14 = x14 * (long)CosPi29_64 + x15 * (long)CosPi3_64; - s15 = x14 * (long)CosPi3_64 - x15 * (long)CosPi29_64; + s0 = (x0 * (long)CosPi164) + (x1 * (long)CosPi3164); + s1 = (x0 * (long)CosPi3164) - (x1 * (long)CosPi164); + s2 = (x2 * (long)CosPi564) + (x3 * (long)CosPi2764); + s3 = (x2 * (long)CosPi2764) - (x3 * (long)CosPi564); + s4 = (x4 * (long)CosPi964) + (x5 * (long)CosPi2364); + s5 = (x4 * (long)CosPi2364) - (x5 * (long)CosPi964); + s6 = (x6 * (long)CosPi1364) + (x7 * (long)CosPi1964); + s7 = (x6 * (long)CosPi1964) - (x7 * (long)CosPi1364); + s8 = (x8 * (long)CosPi1764) + (x9 * (long)CosPi1564); + s9 = (x8 * (long)CosPi1564) - (x9 * (long)CosPi1764); + s10 = (x10 * (long)CosPi2164) + (x11 * (long)CosPi1164); + s11 = (x10 * (long)CosPi1164) - (x11 * (long)CosPi2164); + s12 = (x12 * (long)CosPi2564) + (x13 * (long)CosPi764); + s13 = (x12 * (long)CosPi764) - (x13 * (long)CosPi2564); + s14 = (x14 * (long)CosPi2964) + (x15 * (long)CosPi364); + s15 = (x14 * (long)CosPi364) - (x15 * (long)CosPi2964); x0 = HighbdWrapLow(DctConstRoundShift(s0 + s8), bd); x1 = HighbdWrapLow(DctConstRoundShift(s1 + s9), bd); @@ -2013,14 +1987,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp s5 = x5; s6 = x6; s7 = x7; - s8 = x8 * (long)CosPi4_64 + x9 * (long)CosPi28_64; - s9 = x8 * (long)CosPi28_64 - x9 * (long)CosPi4_64; - s10 = x10 * (long)CosPi20_64 + x11 * (long)CosPi12_64; - s11 = x10 * (long)CosPi12_64 - x11 * (long)CosPi20_64; - s12 = -x12 * (long)CosPi28_64 + x13 * (long)CosPi4_64; - s13 = x12 * (long)CosPi4_64 + x13 * (long)CosPi28_64; - s14 = -x14 * (long)CosPi12_64 + x15 * (long)CosPi20_64; - s15 = x14 * (long)CosPi20_64 + x15 * (long)CosPi12_64; + s8 = (x8 * (long)CosPi464) + (x9 * (long)CosPi2864); + s9 = (x8 * (long)CosPi2864) - (x9 * (long)CosPi464); + s10 = (x10 * (long)CosPi2064) + (x11 * (long)CosPi1264); + s11 = (x10 * (long)CosPi1264) - (x11 * (long)CosPi2064); + s12 = (-x12 * (long)CosPi2864) + (x13 * (long)CosPi464); + s13 = (x12 * (long)CosPi464) + (x13 * (long)CosPi2864); + s14 = (-x14 * (long)CosPi1264) + (x15 * (long)CosPi2064); + s15 = (x14 * (long)CosPi2064) + (x15 * (long)CosPi1264); x0 = HighbdWrapLow(s0 + s4, bd); x1 = HighbdWrapLow(s1 + s5, bd); @@ -2044,18 +2018,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp s1 = x1; s2 = x2; s3 = x3; - s4 = x4 * (long)CosPi8_64 + x5 * (long)CosPi24_64; - s5 = x4 * (long)CosPi24_64 - x5 * (long)CosPi8_64; - s6 = -x6 * (long)CosPi24_64 + x7 * (long)CosPi8_64; - s7 = x6 * (long)CosPi8_64 + x7 * (long)CosPi24_64; + s4 = (x4 * (long)CosPi864) + (x5 * (long)CosPi2464); + s5 = (x4 * (long)CosPi2464) - (x5 * (long)CosPi864); + s6 = (-x6 * (long)CosPi2464) + (x7 * (long)CosPi864); + s7 = (x6 * (long)CosPi864) + (x7 * (long)CosPi2464); s8 = x8; s9 = x9; s10 = x10; s11 = x11; - s12 = x12 * (long)CosPi8_64 + x13 * (long)CosPi24_64; - s13 = x12 * (long)CosPi24_64 - x13 * (long)CosPi8_64; - s14 = -x14 * (long)CosPi24_64 + x15 * (long)CosPi8_64; - s15 = x14 * (long)CosPi8_64 + x15 * (long)CosPi24_64; + s12 = (x12 * (long)CosPi864) + (x13 * (long)CosPi2464); + s13 = (x12 * (long)CosPi2464) - (x13 * (long)CosPi864); + s14 = (-x14 * (long)CosPi2464) + (x15 * (long)CosPi864); + s15 = (x14 * (long)CosPi864) + (x15 * (long)CosPi2464); x0 = HighbdWrapLow(s0 + s2, bd); x1 = HighbdWrapLow(s1 + s3, bd); @@ -2075,14 +2049,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp x15 = HighbdWrapLow(DctConstRoundShift(s13 - s15), bd); // stage 4 - s2 = (long)(-CosPi16_64) * (x2 + x3); - s3 = (long)CosPi16_64 * (x2 - x3); - s6 = (long)CosPi16_64 * (x6 + x7); - s7 = (long)CosPi16_64 * (-x6 + x7); - s10 = (long)CosPi16_64 * (x10 + x11); - s11 = (long)CosPi16_64 * (-x10 + x11); - s14 = (long)(-CosPi16_64) * (x14 + x15); - s15 = (long)CosPi16_64 * (x14 - x15); + s2 = (long)-CosPi1664 * (x2 + x3); + s3 = (long)CosPi1664 * (x2 - x3); + s6 = (long)CosPi1664 * (x6 + x7); + s7 = (long)CosPi1664 * (-x6 + x7); + s10 = (long)CosPi1664 * (x10 + x11); + s11 = (long)CosPi1664 * (-x10 + x11); + s14 = (long)-CosPi1664 * (x14 + x15); + s15 = (long)CosPi1664 * (x14 - x15); x2 = HighbdWrapLow(DctConstRoundShift(s2), bd); x3 = HighbdWrapLow(DctConstRoundShift(s3), bd); @@ -2122,7 +2096,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { Debug.Assert(false, "invalid highbd txfm input"); output[..16].Clear(); - return; } @@ -2154,23 +2127,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[6] = step1[6]; step2[7] = step1[7]; - temp1 = step1[8] * (long)CosPi30_64 - step1[15] * (long)CosPi2_64; - temp2 = step1[8] * (long)CosPi2_64 + step1[15] * (long)CosPi30_64; + temp1 = (step1[8] * (long)CosPi3064) - (step1[15] * (long)CosPi264); + temp2 = (step1[8] * (long)CosPi264) + (step1[15] * (long)CosPi3064); step2[8] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[15] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = step1[9] * (long)CosPi14_64 - step1[14] * (long)CosPi18_64; - temp2 = step1[9] * (long)CosPi18_64 + step1[14] * (long)CosPi14_64; + temp1 = (step1[9] * (long)CosPi1464) - (step1[14] * (long)CosPi1864); + temp2 = (step1[9] * (long)CosPi1864) + (step1[14] * (long)CosPi1464); step2[9] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[14] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = step1[10] * (long)CosPi22_64 - step1[13] * (long)CosPi10_64; - temp2 = step1[10] * (long)CosPi10_64 + step1[13] * (long)CosPi22_64; + temp1 = (step1[10] * (long)CosPi2264) - (step1[13] * (long)CosPi1064); + temp2 = (step1[10] * (long)CosPi1064) + (step1[13] * (long)CosPi2264); step2[10] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[13] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = step1[11] * (long)CosPi6_64 - step1[12] * (long)CosPi26_64; - temp2 = step1[11] * (long)CosPi26_64 + step1[12] * (long)CosPi6_64; + temp1 = (step1[11] * (long)CosPi664) - (step1[12] * (long)CosPi2664); + temp2 = (step1[11] * (long)CosPi2664) + (step1[12] * (long)CosPi664); step2[11] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[12] = HighbdWrapLow(DctConstRoundShift(temp2), bd); @@ -2180,12 +2153,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = step2[2]; step1[3] = step2[3]; - temp1 = step2[4] * (long)CosPi28_64 - step2[7] * (long)CosPi4_64; - temp2 = step2[4] * (long)CosPi4_64 + step2[7] * (long)CosPi28_64; + temp1 = (step2[4] * (long)CosPi2864) - (step2[7] * (long)CosPi464); + temp2 = (step2[4] * (long)CosPi464) + (step2[7] * (long)CosPi2864); step1[4] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[7] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = step2[5] * (long)CosPi12_64 - step2[6] * (long)CosPi20_64; - temp2 = step2[5] * (long)CosPi20_64 + step2[6] * (long)CosPi12_64; + temp1 = (step2[5] * (long)CosPi1264) - (step2[6] * (long)CosPi2064); + temp2 = (step2[5] * (long)CosPi2064) + (step2[6] * (long)CosPi1264); step1[5] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[6] = HighbdWrapLow(DctConstRoundShift(temp2), bd); @@ -2199,12 +2172,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[15] = HighbdWrapLow(step2[14] + step2[15], bd); // stage 4 - temp1 = (step1[0] + step1[1]) * (long)CosPi16_64; - temp2 = (step1[0] - step1[1]) * (long)CosPi16_64; + temp1 = (step1[0] + step1[1]) * (long)CosPi1664; + temp2 = (step1[0] - step1[1]) * (long)CosPi1664; step2[0] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[1] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = step1[2] * (long)CosPi24_64 - step1[3] * (long)CosPi8_64; - temp2 = step1[2] * (long)CosPi8_64 + step1[3] * (long)CosPi24_64; + temp1 = (step1[2] * (long)CosPi2464) - (step1[3] * (long)CosPi864); + temp2 = (step1[2] * (long)CosPi864) + (step1[3] * (long)CosPi2464); step2[2] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[3] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step2[4] = HighbdWrapLow(step1[4] + step1[5], bd); @@ -2214,12 +2187,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[8] = step1[8]; step2[15] = step1[15]; - temp1 = -step1[9] * (long)CosPi8_64 + step1[14] * (long)CosPi24_64; - temp2 = step1[9] * (long)CosPi24_64 + step1[14] * (long)CosPi8_64; + temp1 = (-step1[9] * (long)CosPi864) + (step1[14] * (long)CosPi2464); + temp2 = (step1[9] * (long)CosPi2464) + (step1[14] * (long)CosPi864); step2[9] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[14] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = -step1[10] * (long)CosPi24_64 - step1[13] * (long)CosPi8_64; - temp2 = -step1[10] * (long)CosPi8_64 + step1[13] * (long)CosPi24_64; + temp1 = (-step1[10] * (long)CosPi2464) - (step1[13] * (long)CosPi864); + temp2 = (-step1[10] * (long)CosPi864) + (step1[13] * (long)CosPi2464); step2[10] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[13] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step2[11] = step1[11]; @@ -2231,8 +2204,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = HighbdWrapLow(step2[1] - step2[2], bd); step1[3] = HighbdWrapLow(step2[0] - step2[3], bd); step1[4] = step2[4]; - temp1 = (step2[6] - step2[5]) * (long)CosPi16_64; - temp2 = (step2[5] + step2[6]) * (long)CosPi16_64; + temp1 = (step2[6] - step2[5]) * (long)CosPi1664; + temp2 = (step2[5] + step2[6]) * (long)CosPi1664; step1[5] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[6] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step1[7] = step2[7]; @@ -2257,12 +2230,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[7] = HighbdWrapLow(step1[0] - step1[7], bd); step2[8] = step1[8]; step2[9] = step1[9]; - temp1 = (-step1[10] + step1[13]) * (long)CosPi16_64; - temp2 = (step1[10] + step1[13]) * (long)CosPi16_64; + temp1 = (-step1[10] + step1[13]) * (long)CosPi1664; + temp2 = (step1[10] + step1[13]) * (long)CosPi1664; step2[10] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[13] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = (-step1[11] + step1[12]) * (long)CosPi16_64; - temp2 = (step1[11] + step1[12]) * (long)CosPi16_64; + temp1 = (-step1[11] + step1[12]) * (long)CosPi1664; + temp2 = (step1[11] + step1[12]) * (long)CosPi1664; step2[11] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[12] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step2[14] = step1[14]; @@ -2288,16 +2261,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void HighbdIdct16x16256Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct16X16256Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; Span output = stackalloc int[16 * 16]; Span outptr = output; Span tempIn = stackalloc int[16]; Span tempOut = stackalloc int[16]; // First transform rows - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { HighbdIdct16(input, outptr, bd); input = input[16..]; @@ -2305,25 +2277,25 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Then transform columns - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - tempIn[j] = output[j * 16 + i]; + tempIn[j] = output[(j * 16) + i]; } HighbdIdct16(tempIn, tempOut, bd); - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - dest[j * stride + i] = HighbdClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); + dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); } } } [SkipLocalsInit] - public static void HighbdIdct16x1638Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct16X1638Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; Span output = stackalloc int[16 * 16]; Span outptr = output; Span tempIn = stackalloc int[16]; @@ -2333,7 +2305,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // First transform rows. Since all non-zero dct coefficients are in // upper-left 8x8 area, we only need to calculate first 8 rows here. - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { HighbdIdct16(input, outptr, bd); input = input[16..]; @@ -2341,16 +2313,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Then transform columns - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { Span destT = dest; - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - tempIn[j] = output[j * 16 + i]; + tempIn[j] = output[(j * 16) + i]; } HighbdIdct16(tempIn, tempOut, bd); - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { destT[i] = HighbdClipPixelAdd(destT[i], BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); destT = destT[stride..]; @@ -2359,9 +2331,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void HighbdIdct16x1610Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct16X1610Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; Span output = stackalloc int[16 * 16]; Span outptr = output; Span tempIn = stackalloc int[16]; @@ -2371,7 +2342,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // First transform rows. Since all non-zero dct coefficients are in // upper-left 4x4 area, we only need to calculate first 4 rows here. - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { HighbdIdct16(input, outptr, bd); input = input[16..]; @@ -2379,32 +2350,32 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Then transform columns - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - tempIn[j] = output[j * 16 + i]; + tempIn[j] = output[(j * 16) + i]; } HighbdIdct16(tempIn, tempOut, bd); - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - dest[j * stride + i] = HighbdClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); + dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); } } } - public static void HighbdIdct16x161Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct16X161Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; long a1; - int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi16_64), bd); + int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); - output = HighbdWrapLow(DctConstRoundShift(output * (long)CosPi16_64), bd); + output = HighbdWrapLow(DctConstRoundShift(output * (long)CosPi1664), bd); a1 = BitUtils.RoundPowerOfTwo(output, 6); - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { dest[i] = HighbdClipPixelAdd(dest[i], a1, bd); } @@ -2424,7 +2395,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { Debug.Assert(false, "invalid highbd txfm input"); output[..32].Clear(); - return; } @@ -2446,43 +2416,43 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[14] = input[14]; step1[15] = input[30]; - temp1 = input[1] * (long)CosPi31_64 - input[31] * (long)CosPi1_64; - temp2 = input[1] * (long)CosPi1_64 + input[31] * (long)CosPi31_64; + temp1 = (input[1] * (long)CosPi3164) - (input[31] * (long)CosPi164); + temp2 = (input[1] * (long)CosPi164) + (input[31] * (long)CosPi3164); step1[16] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[31] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = input[17] * (long)CosPi15_64 - input[15] * (long)CosPi17_64; - temp2 = input[17] * (long)CosPi17_64 + input[15] * (long)CosPi15_64; + temp1 = (input[17] * (long)CosPi1564) - (input[15] * (long)CosPi1764); + temp2 = (input[17] * (long)CosPi1764) + (input[15] * (long)CosPi1564); step1[17] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[30] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = input[9] * (long)CosPi23_64 - input[23] * (long)CosPi9_64; - temp2 = input[9] * (long)CosPi9_64 + input[23] * (long)CosPi23_64; + temp1 = (input[9] * (long)CosPi2364) - (input[23] * (long)CosPi964); + temp2 = (input[9] * (long)CosPi964) + (input[23] * (long)CosPi2364); step1[18] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[29] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = input[25] * (long)CosPi7_64 - input[7] * (long)CosPi25_64; - temp2 = input[25] * (long)CosPi25_64 + input[7] * (long)CosPi7_64; + temp1 = (input[25] * (long)CosPi764) - (input[7] * (long)CosPi2564); + temp2 = (input[25] * (long)CosPi2564) + (input[7] * (long)CosPi764); step1[19] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[28] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = input[5] * (long)CosPi27_64 - input[27] * (long)CosPi5_64; - temp2 = input[5] * (long)CosPi5_64 + input[27] * (long)CosPi27_64; + temp1 = (input[5] * (long)CosPi2764) - (input[27] * (long)CosPi564); + temp2 = (input[5] * (long)CosPi564) + (input[27] * (long)CosPi2764); step1[20] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[27] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = input[21] * (long)CosPi11_64 - input[11] * (long)CosPi21_64; - temp2 = input[21] * (long)CosPi21_64 + input[11] * (long)CosPi11_64; + temp1 = (input[21] * (long)CosPi1164) - (input[11] * (long)CosPi2164); + temp2 = (input[21] * (long)CosPi2164) + (input[11] * (long)CosPi1164); step1[21] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[26] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = input[13] * (long)CosPi19_64 - input[19] * (long)CosPi13_64; - temp2 = input[13] * (long)CosPi13_64 + input[19] * (long)CosPi19_64; + temp1 = (input[13] * (long)CosPi1964) - (input[19] * (long)CosPi1364); + temp2 = (input[13] * (long)CosPi1364) + (input[19] * (long)CosPi1964); step1[22] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[25] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = input[29] * (long)CosPi3_64 - input[3] * (long)CosPi29_64; - temp2 = input[29] * (long)CosPi29_64 + input[3] * (long)CosPi3_64; + temp1 = (input[29] * (long)CosPi364) - (input[3] * (long)CosPi2964); + temp2 = (input[29] * (long)CosPi2964) + (input[3] * (long)CosPi364); step1[23] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[24] = HighbdWrapLow(DctConstRoundShift(temp2), bd); @@ -2496,23 +2466,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[6] = step1[6]; step2[7] = step1[7]; - temp1 = step1[8] * (long)CosPi30_64 - step1[15] * (long)CosPi2_64; - temp2 = step1[8] * (long)CosPi2_64 + step1[15] * (long)CosPi30_64; + temp1 = (step1[8] * (long)CosPi3064) - (step1[15] * (long)CosPi264); + temp2 = (step1[8] * (long)CosPi264) + (step1[15] * (long)CosPi3064); step2[8] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[15] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = step1[9] * (long)CosPi14_64 - step1[14] * (long)CosPi18_64; - temp2 = step1[9] * (long)CosPi18_64 + step1[14] * (long)CosPi14_64; + temp1 = (step1[9] * (long)CosPi1464) - (step1[14] * (long)CosPi1864); + temp2 = (step1[9] * (long)CosPi1864) + (step1[14] * (long)CosPi1464); step2[9] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[14] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = step1[10] * (long)CosPi22_64 - step1[13] * (long)CosPi10_64; - temp2 = step1[10] * (long)CosPi10_64 + step1[13] * (long)CosPi22_64; + temp1 = (step1[10] * (long)CosPi2264) - (step1[13] * (long)CosPi1064); + temp2 = (step1[10] * (long)CosPi1064) + (step1[13] * (long)CosPi2264); step2[10] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[13] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = step1[11] * (long)CosPi6_64 - step1[12] * (long)CosPi26_64; - temp2 = step1[11] * (long)CosPi26_64 + step1[12] * (long)CosPi6_64; + temp1 = (step1[11] * (long)CosPi664) - (step1[12] * (long)CosPi2664); + temp2 = (step1[11] * (long)CosPi2664) + (step1[12] * (long)CosPi664); step2[11] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[12] = HighbdWrapLow(DctConstRoundShift(temp2), bd); @@ -2539,12 +2509,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = step2[2]; step1[3] = step2[3]; - temp1 = step2[4] * (long)CosPi28_64 - step2[7] * (long)CosPi4_64; - temp2 = step2[4] * (long)CosPi4_64 + step2[7] * (long)CosPi28_64; + temp1 = (step2[4] * (long)CosPi2864) - (step2[7] * (long)CosPi464); + temp2 = (step2[4] * (long)CosPi464) + (step2[7] * (long)CosPi2864); step1[4] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[7] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = step2[5] * (long)CosPi12_64 - step2[6] * (long)CosPi20_64; - temp2 = step2[5] * (long)CosPi20_64 + step2[6] * (long)CosPi12_64; + temp1 = (step2[5] * (long)CosPi1264) - (step2[6] * (long)CosPi2064); + temp2 = (step2[5] * (long)CosPi2064) + (step2[6] * (long)CosPi1264); step1[5] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[6] = HighbdWrapLow(DctConstRoundShift(temp2), bd); @@ -2559,22 +2529,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[16] = step2[16]; step1[31] = step2[31]; - temp1 = -step2[17] * (long)CosPi4_64 + step2[30] * (long)CosPi28_64; - temp2 = step2[17] * (long)CosPi28_64 + step2[30] * (long)CosPi4_64; + temp1 = (-step2[17] * (long)CosPi464) + (step2[30] * (long)CosPi2864); + temp2 = (step2[17] * (long)CosPi2864) + (step2[30] * (long)CosPi464); step1[17] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[30] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = -step2[18] * (long)CosPi28_64 - step2[29] * (long)CosPi4_64; - temp2 = -step2[18] * (long)CosPi4_64 + step2[29] * (long)CosPi28_64; + temp1 = (-step2[18] * (long)CosPi2864) - (step2[29] * (long)CosPi464); + temp2 = (-step2[18] * (long)CosPi464) + (step2[29] * (long)CosPi2864); step1[18] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[29] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step1[19] = step2[19]; step1[20] = step2[20]; - temp1 = -step2[21] * (long)CosPi20_64 + step2[26] * (long)CosPi12_64; - temp2 = step2[21] * (long)CosPi12_64 + step2[26] * (long)CosPi20_64; + temp1 = (-step2[21] * (long)CosPi2064) + (step2[26] * (long)CosPi1264); + temp2 = (step2[21] * (long)CosPi1264) + (step2[26] * (long)CosPi2064); step1[21] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[26] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = -step2[22] * (long)CosPi12_64 - step2[25] * (long)CosPi20_64; - temp2 = -step2[22] * (long)CosPi20_64 + step2[25] * (long)CosPi12_64; + temp1 = (-step2[22] * (long)CosPi1264) - (step2[25] * (long)CosPi2064); + temp2 = (-step2[22] * (long)CosPi2064) + (step2[25] * (long)CosPi1264); step1[22] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[25] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step1[23] = step2[23]; @@ -2583,12 +2553,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[28] = step2[28]; // stage 4 - temp1 = (step1[0] + step1[1]) * (long)CosPi16_64; - temp2 = (step1[0] - step1[1]) * (long)CosPi16_64; + temp1 = (step1[0] + step1[1]) * (long)CosPi1664; + temp2 = (step1[0] - step1[1]) * (long)CosPi1664; step2[0] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[1] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = step1[2] * (long)CosPi24_64 - step1[3] * (long)CosPi8_64; - temp2 = step1[2] * (long)CosPi8_64 + step1[3] * (long)CosPi24_64; + temp1 = (step1[2] * (long)CosPi2464) - (step1[3] * (long)CosPi864); + temp2 = (step1[2] * (long)CosPi864) + (step1[3] * (long)CosPi2464); step2[2] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[3] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step2[4] = HighbdWrapLow(step1[4] + step1[5], bd); @@ -2598,12 +2568,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[8] = step1[8]; step2[15] = step1[15]; - temp1 = -step1[9] * (long)CosPi8_64 + step1[14] * (long)CosPi24_64; - temp2 = step1[9] * (long)CosPi24_64 + step1[14] * (long)CosPi8_64; + temp1 = (-step1[9] * (long)CosPi864) + (step1[14] * (long)CosPi2464); + temp2 = (step1[9] * (long)CosPi2464) + (step1[14] * (long)CosPi864); step2[9] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[14] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = -step1[10] * (long)CosPi24_64 - step1[13] * (long)CosPi8_64; - temp2 = -step1[10] * (long)CosPi8_64 + step1[13] * (long)CosPi24_64; + temp1 = (-step1[10] * (long)CosPi2464) - (step1[13] * (long)CosPi864); + temp2 = (-step1[10] * (long)CosPi864) + (step1[13] * (long)CosPi2464); step2[10] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[13] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step2[11] = step1[11]; @@ -2633,8 +2603,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[2] = HighbdWrapLow(step2[1] - step2[2], bd); step1[3] = HighbdWrapLow(step2[0] - step2[3], bd); step1[4] = step2[4]; - temp1 = (step2[6] - step2[5]) * (long)CosPi16_64; - temp2 = (step2[5] + step2[6]) * (long)CosPi16_64; + temp1 = (step2[6] - step2[5]) * (long)CosPi1664; + temp2 = (step2[5] + step2[6]) * (long)CosPi1664; step1[5] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[6] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step1[7] = step2[7]; @@ -2650,20 +2620,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[16] = step2[16]; step1[17] = step2[17]; - temp1 = -step2[18] * (long)CosPi8_64 + step2[29] * (long)CosPi24_64; - temp2 = step2[18] * (long)CosPi24_64 + step2[29] * (long)CosPi8_64; + temp1 = (-step2[18] * (long)CosPi864) + (step2[29] * (long)CosPi2464); + temp2 = (step2[18] * (long)CosPi2464) + (step2[29] * (long)CosPi864); step1[18] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[29] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = -step2[19] * (long)CosPi8_64 + step2[28] * (long)CosPi24_64; - temp2 = step2[19] * (long)CosPi24_64 + step2[28] * (long)CosPi8_64; + temp1 = (-step2[19] * (long)CosPi864) + (step2[28] * (long)CosPi2464); + temp2 = (step2[19] * (long)CosPi2464) + (step2[28] * (long)CosPi864); step1[19] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[28] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = -step2[20] * (long)CosPi24_64 - step2[27] * (long)CosPi8_64; - temp2 = -step2[20] * (long)CosPi8_64 + step2[27] * (long)CosPi24_64; + temp1 = (-step2[20] * (long)CosPi2464) - (step2[27] * (long)CosPi864); + temp2 = (-step2[20] * (long)CosPi864) + (step2[27] * (long)CosPi2464); step1[20] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[27] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = -step2[21] * (long)CosPi24_64 - step2[26] * (long)CosPi8_64; - temp2 = -step2[21] * (long)CosPi8_64 + step2[26] * (long)CosPi24_64; + temp1 = (-step2[21] * (long)CosPi2464) - (step2[26] * (long)CosPi864); + temp2 = (-step2[21] * (long)CosPi864) + (step2[26] * (long)CosPi2464); step1[21] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[26] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step1[22] = step2[22]; @@ -2684,12 +2654,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step2[7] = HighbdWrapLow(step1[0] - step1[7], bd); step2[8] = step1[8]; step2[9] = step1[9]; - temp1 = (-step1[10] + step1[13]) * (long)CosPi16_64; - temp2 = (step1[10] + step1[13]) * (long)CosPi16_64; + temp1 = (-step1[10] + step1[13]) * (long)CosPi1664; + temp2 = (step1[10] + step1[13]) * (long)CosPi1664; step2[10] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[13] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = (-step1[11] + step1[12]) * (long)CosPi16_64; - temp2 = (step1[11] + step1[12]) * (long)CosPi16_64; + temp1 = (-step1[11] + step1[12]) * (long)CosPi1664; + temp2 = (step1[11] + step1[12]) * (long)CosPi1664; step2[11] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step2[12] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step2[14] = step1[14]; @@ -2735,20 +2705,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp step1[17] = step2[17]; step1[18] = step2[18]; step1[19] = step2[19]; - temp1 = (-step2[20] + step2[27]) * (long)CosPi16_64; - temp2 = (step2[20] + step2[27]) * (long)CosPi16_64; + temp1 = (-step2[20] + step2[27]) * (long)CosPi1664; + temp2 = (step2[20] + step2[27]) * (long)CosPi1664; step1[20] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[27] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = (-step2[21] + step2[26]) * (long)CosPi16_64; - temp2 = (step2[21] + step2[26]) * (long)CosPi16_64; + temp1 = (-step2[21] + step2[26]) * (long)CosPi1664; + temp2 = (step2[21] + step2[26]) * (long)CosPi1664; step1[21] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[26] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = (-step2[22] + step2[25]) * (long)CosPi16_64; - temp2 = (step2[22] + step2[25]) * (long)CosPi16_64; + temp1 = (-step2[22] + step2[25]) * (long)CosPi1664; + temp2 = (step2[22] + step2[25]) * (long)CosPi1664; step1[22] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[25] = HighbdWrapLow(DctConstRoundShift(temp2), bd); - temp1 = (-step2[23] + step2[24]) * (long)CosPi16_64; - temp2 = (step2[23] + step2[24]) * (long)CosPi16_64; + temp1 = (-step2[23] + step2[24]) * (long)CosPi1664; + temp2 = (step2[23] + step2[24]) * (long)CosPi1664; step1[23] = HighbdWrapLow(DctConstRoundShift(temp1), bd); step1[24] = HighbdWrapLow(DctConstRoundShift(temp2), bd); step1[28] = step2[28]; @@ -2792,19 +2762,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void HighbdIdct32x321024Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct32X321024Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; Span output = stackalloc int[32 * 32]; Span outptr = output; Span tempIn = stackalloc int[32]; Span tempOut = stackalloc int[32]; // Rows - for (i = 0; i < 32; ++i) + for (int i = 0; i < 32; ++i) { int zeroCoeff = 0; - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { zeroCoeff |= input[j]; } @@ -2823,25 +2792,25 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Columns - for (i = 0; i < 32; ++i) + for (int i = 0; i < 32; ++i) { - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - tempIn[j] = output[j * 32 + i]; + tempIn[j] = output[(j * 32) + i]; } HighbdIdct32(tempIn, tempOut, bd); - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - dest[j * stride + i] = HighbdClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); + dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); } } } [SkipLocalsInit] - public static void HighbdIdct32x32135Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct32X32135Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; Span output = stackalloc int[32 * 32]; Span outptr = output; Span tempIn = stackalloc int[32]; @@ -2851,7 +2820,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // Rows // Only upper-left 16x16 has non-zero coeff - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { HighbdIdct32(input, outptr, bd); input = input[32..]; @@ -2859,16 +2828,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Columns - for (i = 0; i < 32; ++i) + for (int i = 0; i < 32; ++i) { Span destT = dest; - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - tempIn[j] = output[j * 32 + i]; + tempIn[j] = output[(j * 32) + i]; } HighbdIdct32(tempIn, tempOut, bd); - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { destT[i] = HighbdClipPixelAdd(destT[i], BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); destT = destT[stride..]; @@ -2877,9 +2846,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } [SkipLocalsInit] - public static void HighbdIdct32x3234Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct32X3234Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; Span output = stackalloc int[32 * 32]; Span outptr = output; Span tempIn = stackalloc int[32]; @@ -2889,7 +2857,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // Rows // Only upper-left 8x8 has non-zero coeff - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { HighbdIdct32(input, outptr, bd); input = input[32..]; @@ -2897,33 +2865,33 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp } // Columns - for (i = 0; i < 32; ++i) + for (int i = 0; i < 32; ++i) { - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - tempIn[j] = output[j * 32 + i]; + tempIn[j] = output[(j * 32) + i]; } HighbdIdct32(tempIn, tempOut, bd); - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - dest[j * stride + i] = HighbdClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); + dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); } } } - public static void HighbdIdct32x321Add(ReadOnlySpan input, Span dest, int stride, int bd) + public static void HighbdIdct32X321Add(ReadOnlySpan input, Span dest, int stride, int bd) { - int i, j; int a1; - int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi16_64), bd); + int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); - output = HighbdWrapLow(DctConstRoundShift(output * (long)CosPi16_64), bd); + output = HighbdWrapLow(DctConstRoundShift(output * (long)CosPi1664), bd); a1 = BitUtils.RoundPowerOfTwo(output, 6); - for (j = 0; j < 32; ++j) + for (int j = 0; j < 32; ++j) { - for (i = 0; i < 32; ++i) + for (int i = 0; i < 32; ++i) { dest[i] = HighbdClipPixelAdd(dest[i], a1, bd); } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/LoopFilterAuto.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/LoopFilterAuto.cs new file mode 100644 index 000000000..ee33acc5f --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/LoopFilterAuto.cs @@ -0,0 +1,229 @@ +using Ryujinx.Common.Memory; +using System; +using System.Runtime.Intrinsics.X86; + +namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp +{ + internal class LoopFilterAuto + { + public static void LpfHorizontal4( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfHorizontal4(s, pitch, blimit, limit, thresh); + } + else + { + LoopFilterScalar.LpfHorizontal4(s, pitch, blimit[0], limit[0], thresh[0]); + } + } + + public static void LpfHorizontal4Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit0, + ReadOnlySpan limit0, + ReadOnlySpan thresh0, + ReadOnlySpan blimit1, + ReadOnlySpan limit1, + ReadOnlySpan thresh1) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfHorizontal4Dual(s, pitch, blimit0, limit0, thresh0, blimit1, limit1, thresh1); + } + else + { + LoopFilterScalar.LpfHorizontal4Dual(s, pitch, blimit0[0], limit0[0], thresh0[0], blimit1[0], limit1[0], + thresh1[0]); + } + } + + public static void LpfHorizontal8( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfHorizontal8(s, pitch, blimit, limit, thresh); + } + else + { + LoopFilterScalar.LpfHorizontal8(s, pitch, blimit[0], limit[0], thresh[0]); + } + } + + public static void LpfHorizontal8Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit0, + ReadOnlySpan limit0, + ReadOnlySpan thresh0, + ReadOnlySpan blimit1, + ReadOnlySpan limit1, + ReadOnlySpan thresh1) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfHorizontal8Dual(s, pitch, blimit0, limit0, thresh0, blimit1, limit1, thresh1); + } + else + { + LoopFilterScalar.LpfHorizontal8Dual(s, pitch, blimit0[0], limit0[0], thresh0[0], blimit1[0], limit1[0], + thresh1[0]); + } + } + + public static void LpfHorizontal16( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfHorizontal16(s, pitch, blimit, limit, thresh); + } + else + { + LoopFilterScalar.LpfHorizontal16(s, pitch, blimit[0], limit[0], thresh[0]); + } + } + + public static void LpfHorizontal16Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfHorizontal16Dual(s, pitch, blimit, limit, thresh); + } + else + { + LoopFilterScalar.LpfHorizontal16Dual(s, pitch, blimit[0], limit[0], thresh[0]); + } + } + + public static void LpfVertical4( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfVertical4(s, pitch, blimit, limit, thresh); + } + else + { + LoopFilterScalar.LpfVertical4(s, pitch, blimit[0], limit[0], thresh[0]); + } + } + + public static void LpfVertical4Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit0, + ReadOnlySpan limit0, + ReadOnlySpan thresh0, + ReadOnlySpan blimit1, + ReadOnlySpan limit1, + ReadOnlySpan thresh1) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfVertical4Dual(s, pitch, blimit0, limit0, thresh0, blimit1, limit1, thresh1); + } + else + { + LoopFilterScalar.LpfVertical4Dual(s, pitch, blimit0[0], limit0[0], thresh0[0], blimit1[0], limit1[0], + thresh1[0]); + } + } + + public static void LpfVertical8( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfVertical8(s, pitch, blimit, limit, thresh); + } + else + { + LoopFilterScalar.LpfVertical8(s, pitch, blimit[0], limit[0], thresh[0]); + } + } + + public static void LpfVertical8Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit0, + ReadOnlySpan limit0, + ReadOnlySpan thresh0, + ReadOnlySpan blimit1, + ReadOnlySpan limit1, + ReadOnlySpan thresh1) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfVertical8Dual(s, pitch, blimit0, limit0, thresh0, blimit1, limit1, thresh1); + } + else + { + LoopFilterScalar.LpfVertical8Dual(s, pitch, blimit0[0], limit0[0], thresh0[0], blimit1[0], limit1[0], + thresh1[0]); + } + } + + public static void LpfVertical16( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfVertical16(s, pitch, blimit, limit, thresh); + } + else + { + LoopFilterScalar.LpfVertical16(s, pitch, blimit[0], limit[0], thresh[0]); + } + } + + public static void LpfVertical16Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + if (Sse2.IsSupported) + { + LoopFilterSse2.LpfVertical16Dual(s, pitch, blimit, limit, thresh); + } + else + { + LoopFilterScalar.LpfVertical16Dual(s, pitch, blimit[0], limit[0], thresh[0]); + } + } + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/LoopFilterScalar.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/LoopFilterScalar.cs new file mode 100644 index 000000000..dcb779442 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/LoopFilterScalar.cs @@ -0,0 +1,1093 @@ +using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Nvdec.Vp9.Common; +using System; + +namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp +{ + internal static class LoopFilterScalar + { + private static sbyte ClampSbyte(int t) + { + return (sbyte)Math.Clamp(t, -128, 127); + } + + private static short ClampSbyteHigh(int t, int bd) + { + return bd switch + { + 10 => (short)Math.Clamp(t, -128 * 4, (128 * 4) - 1), + 12 => (short)Math.Clamp(t, -128 * 16, (128 * 16) - 1), + _ => (short)Math.Clamp(t, -128, 128 - 1) + }; + } + + // Should we apply any filter at all: 11111111 yes, 00000000 no + private static sbyte FilterMask( + byte limit, + byte blimit, + byte p3, + byte p2, + byte p1, + byte p0, + byte q0, + byte q1, + byte q2, + byte q3) + { + int mask = 0; + mask |= Math.Abs(p3 - p2) > limit ? -1 : 0; + mask |= Math.Abs(p2 - p1) > limit ? -1 : 0; + mask |= Math.Abs(p1 - p0) > limit ? -1 : 0; + mask |= Math.Abs(q1 - q0) > limit ? -1 : 0; + mask |= Math.Abs(q2 - q1) > limit ? -1 : 0; + mask |= Math.Abs(q3 - q2) > limit ? -1 : 0; + mask |= (Math.Abs(p0 - q0) * 2) + (Math.Abs(p1 - q1) / 2) > blimit ? -1 : 0; + return (sbyte)~mask; + } + + private static sbyte FlatMask4( + byte thresh, + byte p3, + byte p2, + byte p1, + byte p0, + byte q0, + byte q1, + byte q2, + byte q3) + { + int mask = 0; + mask |= Math.Abs(p1 - p0) > thresh ? -1 : 0; + mask |= Math.Abs(q1 - q0) > thresh ? -1 : 0; + mask |= Math.Abs(p2 - p0) > thresh ? -1 : 0; + mask |= Math.Abs(q2 - q0) > thresh ? -1 : 0; + mask |= Math.Abs(p3 - p0) > thresh ? -1 : 0; + mask |= Math.Abs(q3 - q0) > thresh ? -1 : 0; + return (sbyte)~mask; + } + + private static sbyte FlatMask5( + byte thresh, + byte p4, + byte p3, + byte p2, + byte p1, + byte p0, + byte q0, + byte q1, + byte q2, + byte q3, + byte q4) + { + int mask = ~FlatMask4(thresh, p3, p2, p1, p0, q0, q1, q2, q3); + mask |= Math.Abs(p4 - p0) > thresh ? -1 : 0; + mask |= Math.Abs(q4 - q0) > thresh ? -1 : 0; + return (sbyte)~mask; + } + + // Is there high edge variance internal edge: 11111111 yes, 00000000 no + private static sbyte HevMask( + byte thresh, + byte p1, + byte p0, + byte q0, + byte q1) + { + int hev = 0; + hev |= Math.Abs(p1 - p0) > thresh ? -1 : 0; + hev |= Math.Abs(q1 - q0) > thresh ? -1 : 0; + return (sbyte)hev; + } + + private static void Filter4( + sbyte mask, + byte thresh, + ref byte op1, + ref byte op0, + ref byte oq0, + ref byte oq1) + { + sbyte filter1, filter2; + + sbyte ps1 = (sbyte)(op1 ^ 0x80); + sbyte ps0 = (sbyte)(op0 ^ 0x80); + sbyte qs0 = (sbyte)(oq0 ^ 0x80); + sbyte qs1 = (sbyte)(oq1 ^ 0x80); + sbyte hev = HevMask(thresh, op1, op0, oq0, oq1); + + // add outer taps if we have high edge variance + sbyte filter = (sbyte)(ClampSbyte(ps1 - qs1) & hev); + + // inner taps + filter = (sbyte)(ClampSbyte(filter + (3 * (qs0 - ps0))) & mask); + + // save bottom 3 bits so that we round one side +4 and the other +3 + // if it equals 4 we'll set it to adjust by -1 to account for the fact + // we'd round it by 3 the other way + filter1 = (sbyte)(ClampSbyte(filter + 4) >> 3); + filter2 = (sbyte)(ClampSbyte(filter + 3) >> 3); + + oq0 = (byte)(ClampSbyte(qs0 - filter1) ^ 0x80); + op0 = (byte)(ClampSbyte(ps0 + filter2) ^ 0x80); + + // outer tap adjustments + filter = (sbyte)(BitUtils.RoundPowerOfTwo(filter1, 1) & ~hev); + + oq1 = (byte)(ClampSbyte(qs1 - filter) ^ 0x80); + op1 = (byte)(ClampSbyte(ps1 + filter) ^ 0x80); + } + + public static void LpfHorizontal4( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh) + { + // loop filter designed to work using chars so that we can make maximum use + // of 8 bit simd instructions. + for (int i = 0; i < 8; ++i) + { + byte p3 = s[-4 * pitch], p2 = s[-3 * pitch], p1 = s[-2 * pitch], p0 = s[-pitch]; + byte q0 = s[0 * pitch], q1 = s[1 * pitch], q2 = s[2 * pitch], q3 = s[3 * pitch]; + sbyte mask = FilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3); + Filter4(mask, thresh, ref s[-2 * pitch], ref s[-1 * pitch], ref s[0], ref s[1 * pitch]); + s = s.Slice(1); + } + } + + public static void LpfHorizontal4Dual( + ArrayPtr s, + int pitch, + byte blimit0, + byte limit0, + byte thresh0, + byte blimit1, + byte limit1, + byte thresh1) + { + LpfHorizontal4(s, pitch, blimit0, limit0, thresh0); + LpfHorizontal4(s.Slice(8), pitch, blimit1, limit1, thresh1); + } + + public static void LpfVertical4( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh) + { + // loop filter designed to work using chars so that we can make maximum use + // of 8 bit simd instructions. + for (int i = 0; i < 8; ++i) + { + byte p3 = s[-4], p2 = s[-3], p1 = s[-2], p0 = s[-1]; + byte q0 = s[0], q1 = s[1], q2 = s[2], q3 = s[3]; + sbyte mask = FilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3); + Filter4(mask, thresh, ref s[-2], ref s[-1], ref s[0], ref s[1]); + s = s.Slice(pitch); + } + } + + public static void LpfVertical4Dual( + ArrayPtr s, + int pitch, + byte blimit0, + byte limit0, + byte thresh0, + byte blimit1, + byte limit1, + byte thresh1) + { + LpfVertical4(s, pitch, blimit0, limit0, thresh0); + LpfVertical4(s.Slice(8 * pitch), pitch, blimit1, limit1, thresh1); + } + + private static void Filter8( + sbyte mask, + byte thresh, + bool flat, + ref byte op3, + ref byte op2, + ref byte op1, + ref byte op0, + ref byte oq0, + ref byte oq1, + ref byte oq2, + ref byte oq3) + { + if (flat && mask != 0) + { + byte p3 = op3, p2 = op2, p1 = op1, p0 = op0; + byte q0 = oq0, q1 = oq1, q2 = oq2, q3 = oq3; + + // 7-tap filter [1, 1, 1, 2, 1, 1, 1] + op2 = (byte)BitUtils.RoundPowerOfTwo(p3 + p3 + p3 + (2 * p2) + p1 + p0 + q0, 3); + op1 = (byte)BitUtils.RoundPowerOfTwo(p3 + p3 + p2 + (2 * p1) + p0 + q0 + q1, 3); + op0 = (byte)BitUtils.RoundPowerOfTwo(p3 + p2 + p1 + (2 * p0) + q0 + q1 + q2, 3); + oq0 = (byte)BitUtils.RoundPowerOfTwo(p2 + p1 + p0 + (2 * q0) + q1 + q2 + q3, 3); + oq1 = (byte)BitUtils.RoundPowerOfTwo(p1 + p0 + q0 + (2 * q1) + q2 + q3 + q3, 3); + oq2 = (byte)BitUtils.RoundPowerOfTwo(p0 + q0 + q1 + (2 * q2) + q3 + q3 + q3, 3); + } + else + { + Filter4(mask, thresh, ref op1, ref op0, ref oq0, ref oq1); + } + } + + public static void LpfHorizontal8( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh) + { + // loop filter designed to work using chars so that we can make maximum use + // of 8 bit simd instructions. + for (int i = 0; i < 8; ++i) + { + byte p3 = s[-4 * pitch], p2 = s[-3 * pitch], p1 = s[-2 * pitch], p0 = s[-pitch]; + byte q0 = s[0 * pitch], q1 = s[1 * pitch], q2 = s[2 * pitch], q3 = s[3 * pitch]; + + sbyte mask = FilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3); + sbyte flat = FlatMask4(1, p3, p2, p1, p0, q0, q1, q2, q3); + Filter8( + mask, + thresh, + flat != 0, + ref s[-4 * pitch], + ref s[-3 * pitch], + ref s[-2 * pitch], + ref s[-1 * pitch], + ref s[0], + ref s[1 * pitch], + ref s[2 * pitch], + ref s[3 * pitch]); + s = s.Slice(1); + } + } + + public static void LpfHorizontal8Dual( + ArrayPtr s, + int pitch, + byte blimit0, + byte limit0, + byte thresh0, + byte blimit1, + byte limit1, + byte thresh1) + { + LpfHorizontal8(s, pitch, blimit0, limit0, thresh0); + LpfHorizontal8(s.Slice(8), pitch, blimit1, limit1, thresh1); + } + + public static void LpfVertical8( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh) + { + for (int i = 0; i < 8; ++i) + { + byte p3 = s[-4], p2 = s[-3], p1 = s[-2], p0 = s[-1]; + byte q0 = s[0], q1 = s[1], q2 = s[2], q3 = s[3]; + sbyte mask = FilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3); + sbyte flat = FlatMask4(1, p3, p2, p1, p0, q0, q1, q2, q3); + Filter8( + mask, + thresh, + flat != 0, + ref s[-4], + ref s[-3], + ref s[-2], + ref s[-1], + ref s[0], + ref s[1], + ref s[2], + ref s[3]); + s = s.Slice(pitch); + } + } + + public static void LpfVertical8Dual( + ArrayPtr s, + int pitch, + byte blimit0, + byte limit0, + byte thresh0, + byte blimit1, + byte limit1, + byte thresh1) + { + LpfVertical8(s, pitch, blimit0, limit0, thresh0); + LpfVertical8(s.Slice(8 * pitch), pitch, blimit1, limit1, thresh1); + } + + private static void Filter16( + sbyte mask, + byte thresh, + bool flat, + bool flat2, + ref byte op7, + ref byte op6, + ref byte op5, + ref byte op4, + ref byte op3, + ref byte op2, + ref byte op1, + ref byte op0, + ref byte oq0, + ref byte oq1, + ref byte oq2, + ref byte oq3, + ref byte oq4, + ref byte oq5, + ref byte oq6, + ref byte oq7) + { + if (flat2 && flat && mask != 0) + { + byte p7 = op7, p6 = op6, p5 = op5, p4 = op4, p3 = op3, p2 = op2, p1 = op1, p0 = op0; + byte q0 = oq0, q1 = oq1, q2 = oq2, q3 = oq3, q4 = oq4, q5 = oq5, q6 = oq6, q7 = oq7; + + // 15-tap filter [1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1] + op6 = (byte)BitUtils.RoundPowerOfTwo( + (p7 * 7) + (p6 * 2) + p5 + p4 + p3 + p2 + p1 + p0 + q0, 4); + op5 = (byte)BitUtils.RoundPowerOfTwo( + (p7 * 6) + p6 + (p5 * 2) + p4 + p3 + p2 + p1 + p0 + q0 + q1, 4); + op4 = (byte)BitUtils.RoundPowerOfTwo( + (p7 * 5) + p6 + p5 + (p4 * 2) + p3 + p2 + p1 + p0 + q0 + q1 + q2, 4); + op3 = (byte)BitUtils.RoundPowerOfTwo( + (p7 * 4) + p6 + p5 + p4 + (p3 * 2) + p2 + p1 + p0 + q0 + q1 + q2 + q3, 4); + op2 = (byte)BitUtils.RoundPowerOfTwo( + (p7 * 3) + p6 + p5 + p4 + p3 + (p2 * 2) + p1 + p0 + q0 + q1 + q2 + q3 + q4, 4); + op1 = (byte)BitUtils.RoundPowerOfTwo( + (p7 * 2) + p6 + p5 + p4 + p3 + p2 + (p1 * 2) + p0 + q0 + q1 + q2 + q3 + q4 + q5, 4); + op0 = (byte)BitUtils.RoundPowerOfTwo( + p7 + p6 + p5 + p4 + p3 + p2 + p1 + (p0 * 2) + q0 + q1 + q2 + q3 + q4 + q5 + q6, 4); + oq0 = (byte)BitUtils.RoundPowerOfTwo( + p6 + p5 + p4 + p3 + p2 + p1 + p0 + (q0 * 2) + q1 + q2 + q3 + q4 + q5 + q6 + q7, 4); + oq1 = (byte)BitUtils.RoundPowerOfTwo( + p5 + p4 + p3 + p2 + p1 + p0 + q0 + (q1 * 2) + q2 + q3 + q4 + q5 + q6 + (q7 * 2), 4); + oq2 = (byte)BitUtils.RoundPowerOfTwo( + p4 + p3 + p2 + p1 + p0 + q0 + q1 + (q2 * 2) + q3 + q4 + q5 + q6 + (q7 * 3), 4); + oq3 = (byte)BitUtils.RoundPowerOfTwo( + p3 + p2 + p1 + p0 + q0 + q1 + q2 + (q3 * 2) + q4 + q5 + q6 + (q7 * 4), 4); + oq4 = (byte)BitUtils.RoundPowerOfTwo( + p2 + p1 + p0 + q0 + q1 + q2 + q3 + (q4 * 2) + q5 + q6 + (q7 * 5), 4); + oq5 = (byte)BitUtils.RoundPowerOfTwo( + p1 + p0 + q0 + q1 + q2 + q3 + q4 + (q5 * 2) + q6 + (q7 * 6), 4); + oq6 = (byte)BitUtils.RoundPowerOfTwo( + p0 + q0 + q1 + q2 + q3 + q4 + q5 + (q6 * 2) + (q7 * 7), 4); + } + else + { + Filter8(mask, thresh, flat, ref op3, ref op2, ref op1, ref op0, ref oq0, ref oq1, ref oq2, ref oq3); + } + } + + private static void MbLpfHorizontalEdgeW( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int count) + { + // loop filter designed to work using chars so that we can make maximum use + // of 8 bit simd instructions. + for (int i = 0; i < 8 * count; ++i) + { + byte p3 = s[-4 * pitch], p2 = s[-3 * pitch], p1 = s[-2 * pitch], p0 = s[-pitch]; + byte q0 = s[0 * pitch], q1 = s[1 * pitch], q2 = s[2 * pitch], q3 = s[3 * pitch]; + sbyte mask = FilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3); + sbyte flat = FlatMask4(1, p3, p2, p1, p0, q0, q1, q2, q3); + sbyte flat2 = FlatMask5( + 1, + s[-8 * pitch], + s[-7 * pitch], + s[-6 * pitch], + s[-5 * pitch], + p0, + q0, + s[4 * pitch], + s[5 * pitch], + s[6 * pitch], + s[7 * pitch]); + + Filter16( + mask, + thresh, + flat != 0, + flat2 != 0, + ref s[-8 * pitch], + ref s[-7 * pitch], + ref s[-6 * pitch], + ref s[-5 * pitch], + ref s[-4 * pitch], + ref s[-3 * pitch], + ref s[-2 * pitch], + ref s[-1 * pitch], + ref s[0], + ref s[1 * pitch], + ref s[2 * pitch], + ref s[3 * pitch], + ref s[4 * pitch], + ref s[5 * pitch], + ref s[6 * pitch], + ref s[7 * pitch]); + s = s.Slice(1); + } + } + + public static void LpfHorizontal16( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh) + { + MbLpfHorizontalEdgeW(s, pitch, blimit, limit, thresh, 1); + } + + public static void LpfHorizontal16Dual( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh) + { + MbLpfHorizontalEdgeW(s, pitch, blimit, limit, thresh, 2); + } + + private static void MbLpfVerticalEdgeW( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int count) + { + for (int i = 0; i < count; ++i) + { + byte p3 = s[-4], p2 = s[-3], p1 = s[-2], p0 = s[-1]; + byte q0 = s[0], q1 = s[1], q2 = s[2], q3 = s[3]; + sbyte mask = FilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3); + sbyte flat = FlatMask4(1, p3, p2, p1, p0, q0, q1, q2, q3); + sbyte flat2 = FlatMask5(1, s[-8], s[-7], s[-6], s[-5], p0, q0, s[4], s[5], s[6], s[7]); + + Filter16( + mask, + thresh, + flat != 0, + flat2 != 0, + ref s[-8], + ref s[-7], + ref s[-6], + ref s[-5], + ref s[-4], + ref s[-3], + ref s[-2], + ref s[-1], + ref s[0], + ref s[1], + ref s[2], + ref s[3], + ref s[4], + ref s[5], + ref s[6], + ref s[7]); + s = s.Slice(pitch); + } + } + + public static void LpfVertical16( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh) + { + MbLpfVerticalEdgeW(s, pitch, blimit, limit, thresh, 8); + } + + public static void LpfVertical16Dual( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh) + { + MbLpfVerticalEdgeW(s, pitch, blimit, limit, thresh, 16); + } + + // Should we apply any filter at all: 11111111 yes, 00000000 no ? + private static sbyte HighBdFilterMask( + byte limit, + byte blimit, + ushort p3, + ushort p2, + ushort p1, + ushort p0, + ushort q0, + ushort q1, + ushort q2, + ushort q3, + int bd) + { + int mask = 0; + short limit16 = (short)(limit << (bd - 8)); + short blimit16 = (short)(blimit << (bd - 8)); + mask |= Math.Abs(p3 - p2) > limit16 ? -1 : 0; + mask |= Math.Abs(p2 - p1) > limit16 ? -1 : 0; + mask |= Math.Abs(p1 - p0) > limit16 ? -1 : 0; + mask |= Math.Abs(q1 - q0) > limit16 ? -1 : 0; + mask |= Math.Abs(q2 - q1) > limit16 ? -1 : 0; + mask |= Math.Abs(q3 - q2) > limit16 ? -1 : 0; + mask |= (Math.Abs(p0 - q0) * 2) + (Math.Abs(p1 - q1) / 2) > blimit16 ? -1 : 0; + return (sbyte)~mask; + } + + private static sbyte HighBdFlatMask4( + byte thresh, + ushort p3, + ushort p2, + ushort p1, + ushort p0, + ushort q0, + ushort q1, + ushort q2, + ushort q3, + int bd) + { + int mask = 0; + short thresh16 = (short)(thresh << (bd - 8)); + mask |= Math.Abs(p1 - p0) > thresh16 ? -1 : 0; + mask |= Math.Abs(q1 - q0) > thresh16 ? -1 : 0; + mask |= Math.Abs(p2 - p0) > thresh16 ? -1 : 0; + mask |= Math.Abs(q2 - q0) > thresh16 ? -1 : 0; + mask |= Math.Abs(p3 - p0) > thresh16 ? -1 : 0; + mask |= Math.Abs(q3 - q0) > thresh16 ? -1 : 0; + return (sbyte)~mask; + } + + private static sbyte HighBdFlatMask5( + byte thresh, + ushort p4, + ushort p3, + ushort p2, + ushort p1, + ushort p0, + ushort q0, + ushort q1, + ushort q2, + ushort q3, + ushort q4, + int bd) + { + int mask = ~HighBdFlatMask4(thresh, p3, p2, p1, p0, q0, q1, q2, q3, bd); + short thresh16 = (short)(thresh << (bd - 8)); + mask |= Math.Abs(p4 - p0) > thresh16 ? -1 : 0; + mask |= Math.Abs(q4 - q0) > thresh16 ? -1 : 0; + return (sbyte)~mask; + } + + // Is there high edge variance internal edge: + // 11111111_11111111 yes, 00000000_00000000 no ? + private static short HighBdHevMask( + byte thresh, + ushort p1, + ushort p0, + ushort q0, + ushort q1, + int bd) + { + int hev = 0; + short thresh16 = (short)(thresh << (bd - 8)); + hev |= Math.Abs(p1 - p0) > thresh16 ? -1 : 0; + hev |= Math.Abs(q1 - q0) > thresh16 ? -1 : 0; + return (short)hev; + } + + private static void HighBdFilter4( + sbyte mask, + byte thresh, + ref ushort op1, + ref ushort op0, + ref ushort oq0, + ref ushort oq1, + int bd) + { + short filter1, filter2; + // ^0x80 equivalent to subtracting 0x80 from the values to turn them + // into -128 to +127 instead of 0 to 255. + int shift = bd - 8; + short ps1 = (short)((short)op1 - (0x80 << shift)); + short ps0 = (short)((short)op0 - (0x80 << shift)); + short qs0 = (short)((short)oq0 - (0x80 << shift)); + short qs1 = (short)((short)oq1 - (0x80 << shift)); + short hev = HighBdHevMask(thresh, op1, op0, oq0, oq1, bd); + + // Add outer taps if we have high edge variance. + short filter = (short)(ClampSbyteHigh(ps1 - qs1, bd) & hev); + + // Inner taps. + filter = (short)(ClampSbyteHigh(filter + (3 * (qs0 - ps0)), bd) & mask); + + // Save bottom 3 bits so that we round one side +4 and the other +3 + // if it equals 4 we'll set it to adjust by -1 to account for the fact + // we'd round it by 3 the other way. + filter1 = (short)(ClampSbyteHigh(filter + 4, bd) >> 3); + filter2 = (short)(ClampSbyteHigh(filter + 3, bd) >> 3); + + oq0 = (ushort)(ClampSbyteHigh(qs0 - filter1, bd) + (0x80 << shift)); + op0 = (ushort)(ClampSbyteHigh(ps0 + filter2, bd) + (0x80 << shift)); + + // Outer tap adjustments. + filter = (short)(BitUtils.RoundPowerOfTwo(filter1, 1) & ~hev); + + oq1 = (ushort)(ClampSbyteHigh(qs1 - filter, bd) + (0x80 << shift)); + op1 = (ushort)(ClampSbyteHigh(ps1 + filter, bd) + (0x80 << shift)); + } + + public static void HighBdLpfHorizontal4( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int bd) + { + // loop filter designed to work using chars so that we can make maximum use + // of 8 bit simd instructions. + for (int i = 0; i < 8; ++i) + { + ushort p3 = s[-4 * pitch]; + ushort p2 = s[-3 * pitch]; + ushort p1 = s[-2 * pitch]; + ushort p0 = s[-pitch]; + ushort q0 = s[0 * pitch]; + ushort q1 = s[1 * pitch]; + ushort q2 = s[2 * pitch]; + ushort q3 = s[3 * pitch]; + sbyte mask = HighBdFilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3, bd); + HighBdFilter4(mask, thresh, ref s[-2 * pitch], ref s[-1 * pitch], ref s[0], ref s[1 * pitch], bd); + s = s.Slice(1); + } + } + + public static void HighBdLpfHorizontal4Dual( + ArrayPtr s, + int pitch, + byte blimit0, + byte limit0, + byte thresh0, + byte blimit1, + byte limit1, + byte thresh1, + int bd) + { + HighBdLpfHorizontal4(s, pitch, blimit0, limit0, thresh0, bd); + HighBdLpfHorizontal4(s.Slice(8), pitch, blimit1, limit1, thresh1, bd); + } + + public static void HighBdLpfVertical4( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int bd) + { + // loop filter designed to work using chars so that we can make maximum use + // of 8 bit simd instructions. + for (int i = 0; i < 8; ++i) + { + ushort p3 = s[-4], p2 = s[-3], p1 = s[-2], p0 = s[-1]; + ushort q0 = s[0], q1 = s[1], q2 = s[2], q3 = s[3]; + sbyte mask = HighBdFilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3, bd); + HighBdFilter4(mask, thresh, ref s[-2], ref s[-1], ref s[0], ref s[1], bd); + s = s.Slice(pitch); + } + } + + public static void HighBdLpfVertical4Dual( + ArrayPtr s, + int pitch, + byte blimit0, + byte limit0, + byte thresh0, + byte blimit1, + byte limit1, + byte thresh1, + int bd) + { + HighBdLpfVertical4(s, pitch, blimit0, limit0, thresh0, bd); + HighBdLpfVertical4(s.Slice(8 * pitch), pitch, blimit1, limit1, thresh1, bd); + } + + private static void HighBdFilter8( + sbyte mask, + byte thresh, + bool flat, + ref ushort op3, + ref ushort op2, + ref ushort op1, + ref ushort op0, + ref ushort oq0, + ref ushort oq1, + ref ushort oq2, + ref ushort oq3, + int bd) + { + if (flat && mask != 0) + { + ushort p3 = op3, p2 = op2, p1 = op1, p0 = op0; + ushort q0 = oq0, q1 = oq1, q2 = oq2, q3 = oq3; + + // 7-tap filter [1, 1, 1, 2, 1, 1, 1] + op2 = (ushort)BitUtils.RoundPowerOfTwo(p3 + p3 + p3 + (2 * p2) + p1 + p0 + q0, 3); + op1 = (ushort)BitUtils.RoundPowerOfTwo(p3 + p3 + p2 + (2 * p1) + p0 + q0 + q1, 3); + op0 = (ushort)BitUtils.RoundPowerOfTwo(p3 + p2 + p1 + (2 * p0) + q0 + q1 + q2, 3); + oq0 = (ushort)BitUtils.RoundPowerOfTwo(p2 + p1 + p0 + (2 * q0) + q1 + q2 + q3, 3); + oq1 = (ushort)BitUtils.RoundPowerOfTwo(p1 + p0 + q0 + (2 * q1) + q2 + q3 + q3, 3); + oq2 = (ushort)BitUtils.RoundPowerOfTwo(p0 + q0 + q1 + (2 * q2) + q3 + q3 + q3, 3); + } + else + { + HighBdFilter4(mask, thresh, ref op1, ref op0, ref oq0, ref oq1, bd); + } + } + + public static void HighBdLpfHorizontal8( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int bd) + { + // loop filter designed to work using chars so that we can make maximum use + // of 8 bit simd instructions. + for (int i = 0; i < 8; ++i) + { + ushort p3 = s[-4 * pitch], p2 = s[-3 * pitch], p1 = s[-2 * pitch], p0 = s[-pitch]; + ushort q0 = s[0 * pitch], q1 = s[1 * pitch], q2 = s[2 * pitch], q3 = s[3 * pitch]; + + sbyte mask = HighBdFilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3, bd); + sbyte flat = HighBdFlatMask4(1, p3, p2, p1, p0, q0, q1, q2, q3, bd); + HighBdFilter8( + mask, + thresh, + flat != 0, + ref s[-4 * pitch], + ref s[-3 * pitch], + ref s[-2 * pitch], + ref s[-1 * pitch], + ref s[0], + ref s[1 * pitch], + ref s[2 * pitch], + ref s[3 * pitch], + bd); + s = s.Slice(1); + } + } + + public static void HighBdLpfHorizontal8Dual( + ArrayPtr s, + int pitch, + byte blimit0, + byte limit0, + byte thresh0, + byte blimit1, + byte limit1, + byte thresh1, + int bd) + { + HighBdLpfHorizontal8(s, pitch, blimit0, limit0, thresh0, bd); + HighBdLpfHorizontal8(s.Slice(8), pitch, blimit1, limit1, thresh1, bd); + } + + public static void HighBdLpfVertical8( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int bd) + { + for (int i = 0; i < 8; ++i) + { + ushort p3 = s[-4], p2 = s[-3], p1 = s[-2], p0 = s[-1]; + ushort q0 = s[0], q1 = s[1], q2 = s[2], q3 = s[3]; + sbyte mask = HighBdFilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3, bd); + sbyte flat = HighBdFlatMask4(1, p3, p2, p1, p0, q0, q1, q2, q3, bd); + HighBdFilter8( + mask, + thresh, + flat != 0, + ref s[-4], + ref s[-3], + ref s[-2], + ref s[-1], + ref s[0], + ref s[1], + ref s[2], + ref s[3], + bd); + s = s.Slice(pitch); + } + } + + public static void HighBdLpfVertical8Dual( + ArrayPtr s, + int pitch, + byte blimit0, + byte limit0, + byte thresh0, + byte blimit1, + byte limit1, + byte thresh1, + int bd) + { + HighBdLpfVertical8(s, pitch, blimit0, limit0, thresh0, bd); + HighBdLpfVertical8(s.Slice(8 * pitch), pitch, blimit1, limit1, thresh1, bd); + } + + private static void HighBdFilter16( + sbyte mask, + byte thresh, + bool flat, + bool flat2, + ref ushort op7, + ref ushort op6, + ref ushort op5, + ref ushort op4, + ref ushort op3, + ref ushort op2, + ref ushort op1, + ref ushort op0, + ref ushort oq0, + ref ushort oq1, + ref ushort oq2, + ref ushort oq3, + ref ushort oq4, + ref ushort oq5, + ref ushort oq6, + ref ushort oq7, + int bd) + { + if (flat2 && flat && mask != 0) + { + ushort p7 = op7; + ushort p6 = op6; + ushort p5 = op5; + ushort p4 = op4; + ushort p3 = op3; + ushort p2 = op2; + ushort p1 = op1; + ushort p0 = op0; + ushort q0 = oq0; + ushort q1 = oq1; + ushort q2 = oq2; + ushort q3 = oq3; + ushort q4 = oq4; + ushort q5 = oq5; + ushort q6 = oq6; + ushort q7 = oq7; + + // 15-tap filter [1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1] + op6 = (ushort)BitUtils.RoundPowerOfTwo( + (p7 * 7) + (p6 * 2) + p5 + p4 + p3 + p2 + p1 + p0 + q0, 4); + op5 = (ushort)BitUtils.RoundPowerOfTwo( + (p7 * 6) + p6 + (p5 * 2) + p4 + p3 + p2 + p1 + p0 + q0 + q1, 4); + op4 = (ushort)BitUtils.RoundPowerOfTwo( + (p7 * 5) + p6 + p5 + (p4 * 2) + p3 + p2 + p1 + p0 + q0 + q1 + q2, 4); + op3 = (ushort)BitUtils.RoundPowerOfTwo( + (p7 * 4) + p6 + p5 + p4 + (p3 * 2) + p2 + p1 + p0 + q0 + q1 + q2 + q3, 4); + op2 = (ushort)BitUtils.RoundPowerOfTwo( + (p7 * 3) + p6 + p5 + p4 + p3 + (p2 * 2) + p1 + p0 + q0 + q1 + q2 + q3 + q4, 4); + op1 = (ushort)BitUtils.RoundPowerOfTwo( + (p7 * 2) + p6 + p5 + p4 + p3 + p2 + (p1 * 2) + p0 + q0 + q1 + q2 + q3 + q4 + q5, 4); + op0 = (ushort)BitUtils.RoundPowerOfTwo( + p7 + p6 + p5 + p4 + p3 + p2 + p1 + (p0 * 2) + q0 + q1 + q2 + q3 + q4 + q5 + q6, 4); + oq0 = (ushort)BitUtils.RoundPowerOfTwo( + p6 + p5 + p4 + p3 + p2 + p1 + p0 + (q0 * 2) + q1 + q2 + q3 + q4 + q5 + q6 + q7, 4); + oq1 = (ushort)BitUtils.RoundPowerOfTwo( + p5 + p4 + p3 + p2 + p1 + p0 + q0 + (q1 * 2) + q2 + q3 + q4 + q5 + q6 + (q7 * 2), 4); + oq2 = (ushort)BitUtils.RoundPowerOfTwo( + p4 + p3 + p2 + p1 + p0 + q0 + q1 + (q2 * 2) + q3 + q4 + q5 + q6 + (q7 * 3), 4); + oq3 = (ushort)BitUtils.RoundPowerOfTwo( + p3 + p2 + p1 + p0 + q0 + q1 + q2 + (q3 * 2) + q4 + q5 + q6 + (q7 * 4), 4); + oq4 = (ushort)BitUtils.RoundPowerOfTwo( + p2 + p1 + p0 + q0 + q1 + q2 + q3 + (q4 * 2) + q5 + q6 + (q7 * 5), 4); + oq5 = (ushort)BitUtils.RoundPowerOfTwo( + p1 + p0 + q0 + q1 + q2 + q3 + q4 + (q5 * 2) + q6 + (q7 * 6), 4); + oq6 = (ushort)BitUtils.RoundPowerOfTwo( + p0 + q0 + q1 + q2 + q3 + q4 + q5 + (q6 * 2) + (q7 * 7), 4); + } + else + { + HighBdFilter8(mask, thresh, flat, ref op3, ref op2, ref op1, ref op0, ref oq0, ref oq1, ref oq2, + ref oq3, bd); + } + } + + private static void HighBdMbLpfHorizontalEdgeW( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int count, + int bd) + { + // loop filter designed to work using chars so that we can make maximum use + // of 8 bit simd instructions. + for (int i = 0; i < 8 * count; ++i) + { + ushort p3 = s[-4 * pitch]; + ushort p2 = s[-3 * pitch]; + ushort p1 = s[-2 * pitch]; + ushort p0 = s[-pitch]; + ushort q0 = s[0 * pitch]; + ushort q1 = s[1 * pitch]; + ushort q2 = s[2 * pitch]; + ushort q3 = s[3 * pitch]; + sbyte mask = HighBdFilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3, bd); + sbyte flat = HighBdFlatMask4(1, p3, p2, p1, p0, q0, q1, q2, q3, bd); + sbyte flat2 = HighBdFlatMask5( + 1, + s[-8 * pitch], + s[-7 * pitch], + s[-6 * pitch], + s[-5 * pitch], + p0, + q0, + s[4 * pitch], + s[5 * pitch], + s[6 * pitch], + s[7 * pitch], + bd); + + HighBdFilter16( + mask, + thresh, + flat != 0, + flat2 != 0, + ref s[-8 * pitch], + ref s[-7 * pitch], + ref s[-6 * pitch], + ref s[-5 * pitch], + ref s[-4 * pitch], + ref s[-3 * pitch], + ref s[-2 * pitch], + ref s[-1 * pitch], + ref s[0], + ref s[1 * pitch], + ref s[2 * pitch], + ref s[3 * pitch], + ref s[4 * pitch], + ref s[5 * pitch], + ref s[6 * pitch], + ref s[7 * pitch], + bd); + s = s.Slice(1); + } + } + + public static void HighBdLpfHorizontal16( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int bd) + { + HighBdMbLpfHorizontalEdgeW(s, pitch, blimit, limit, thresh, 1, bd); + } + + public static void HighBdLpfHorizontal16Dual( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int bd) + { + HighBdMbLpfHorizontalEdgeW(s, pitch, blimit, limit, thresh, 2, bd); + } + + private static void HighBdMbLpfVerticalEdgeW( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int count, + int bd) + { + for (int i = 0; i < count; ++i) + { + ushort p3 = s[-4]; + ushort p2 = s[-3]; + ushort p1 = s[-2]; + ushort p0 = s[-1]; + ushort q0 = s[0]; + ushort q1 = s[1]; + ushort q2 = s[2]; + ushort q3 = s[3]; + sbyte mask = HighBdFilterMask(limit, blimit, p3, p2, p1, p0, q0, q1, q2, q3, bd); + sbyte flat = HighBdFlatMask4(1, p3, p2, p1, p0, q0, q1, q2, q3, bd); + sbyte flat2 = HighBdFlatMask5(1, s[-8], s[-7], s[-6], s[-5], p0, q0, s[4], s[5], s[6], s[7], bd); + + HighBdFilter16( + mask, + thresh, + flat != 0, + flat2 != 0, + ref s[-8], + ref s[-7], + ref s[-6], + ref s[-5], + ref s[-4], + ref s[-3], + ref s[-2], + ref s[-1], + ref s[0], + ref s[1], + ref s[2], + ref s[3], + ref s[4], + ref s[5], + ref s[6], + ref s[7], + bd); + s = s.Slice(pitch); + } + } + + public static void HighBdLpfVertical16( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int bd) + { + HighBdMbLpfVerticalEdgeW(s, pitch, blimit, limit, thresh, 8, bd); + } + + public static void HighBdLpfVertical16Dual( + ArrayPtr s, + int pitch, + byte blimit, + byte limit, + byte thresh, + int bd) + { + HighBdMbLpfVerticalEdgeW(s, pitch, blimit, limit, thresh, 16, bd); + } + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/LoopFilterSse2.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/LoopFilterSse2.cs new file mode 100644 index 000000000..bf522636a --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/LoopFilterSse2.cs @@ -0,0 +1,1836 @@ +using Ryujinx.Common.Memory; +using System; +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.X86; + +namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp +{ + internal static class LoopFilterSse2 + { + private static Vector128 AbsDiff(Vector128 a, Vector128 b) + { + return Sse2.Or(Sse2.SubtractSaturate(a, b), Sse2.SubtractSaturate(b, a)); + } + + private static void FilterHevMask( + Vector128 q1P1, + Vector128 q0P0, + Vector128 p3P2, + Vector128 p2P1, + Vector128 p1P0, + Vector128 q3Q2, + Vector128 q2Q1, + Vector128 q1Q0, + Vector128 limitV, + Vector128 threshV, + out Vector128 hev, + out Vector128 mask) + { + /* (abs(q1 - q0), abs(p1 - p0) */ + Vector128 flat = AbsDiff(q1P1, q0P0); + /* abs(p1 - q1), abs(p0 - q0) */ + Vector128 absP1Q1P0Q0 = AbsDiff(p1P0, q1Q0); + Vector128 absP0Q0, absP1Q1, work; + + /* const uint8_t hev = hev_mask(thresh, *op1, *op0, *oq0, *oq1); */ + hev = Sse2.UnpackLow(Sse2.Max(flat, Sse2.ShiftRightLogical128BitLane(flat, 8)), Vector128.Zero); + hev = Sse2.CompareGreaterThan(hev.AsInt16(), threshV.AsInt16()).AsByte(); + hev = Sse2.PackSignedSaturate(hev.AsInt16(), hev.AsInt16()).AsByte(); + + /* const int8_t mask = filter_mask(*limit, *blimit, p3, p2, p1, p0, q0, q1, q2, q3); */ + absP0Q0 = Sse2.AddSaturate(absP1Q1P0Q0, absP1Q1P0Q0); /* abs(p0 - q0) * 2 */ + absP1Q1 = Sse2.UnpackHigh(absP1Q1P0Q0, absP1Q1P0Q0); /* abs(p1 - q1) */ + absP1Q1 = Sse2.ShiftRightLogical(absP1Q1.AsInt16(), 9).AsByte(); + absP1Q1 = Sse2.PackSignedSaturate(absP1Q1.AsInt16(), absP1Q1.AsInt16()).AsByte(); /* abs(p1 - q1) / 2 */ + /* abs(p0 - q0) * 2 + abs(p1 - q1) / 2 */ + mask = Sse2.AddSaturate(absP0Q0, absP1Q1); + /* abs(p3 - p2), abs(p2 - p1) */ + work = AbsDiff(p3P2, p2P1); + flat = Sse2.Max(work, flat); + /* abs(q3 - q2), abs(q2 - q1) */ + work = AbsDiff(q3Q2, q2Q1); + flat = Sse2.Max(work, flat); + flat = Sse2.Max(flat, Sse2.ShiftRightLogical128BitLane(flat, 8)); + mask = Sse2.UnpackLow(mask.AsInt64(), flat.AsInt64()).AsByte(); + mask = Sse2.SubtractSaturate(mask, limitV); + mask = Sse2.CompareEqual(mask, Vector128.Zero); + mask = Sse2.And(mask, Sse2.ShiftRightLogical128BitLane(mask, 8)); + } + + private static void Filter4( + Vector128 p1P0, + Vector128 q1Q0, + Vector128 hev, + Vector128 mask, + Vector128 ff, + out Vector128 ps1Ps0, + out Vector128 qs1Qs0) + { + Vector128 t3T4 = Vector128.Create( + 4, 4, 4, 4, + 4, 4, 4, 4, + 3, 3, 3, 3, + 3, 3, 3, (byte)3); + Vector128 t80 = Vector128.Create((byte)0x80); + Vector128 filter, filter2Filter1, work; + + ps1Ps0 = Sse2.Xor(p1P0, t80); /* ^ 0x80 */ + qs1Qs0 = Sse2.Xor(q1Q0, t80); + + /* int8_t filter = signed_char_clamp(ps1 - qs1) & hev; */ + work = Sse2.SubtractSaturate(ps1Ps0.AsSByte(), qs1Qs0.AsSByte()).AsByte(); + filter = Sse2.And(Sse2.ShiftRightLogical128BitLane(work, 8), hev); + /* filter = signed_char_clamp(filter + 3 * (qs0 - ps0)) & mask; */ + filter = Sse2.SubtractSaturate(filter.AsSByte(), work.AsSByte()).AsByte(); + filter = Sse2.SubtractSaturate(filter.AsSByte(), work.AsSByte()).AsByte(); + filter = Sse2.SubtractSaturate(filter.AsSByte(), work.AsSByte()).AsByte(); /* + 3 * (qs0 - ps0) */ + filter = Sse2.And(filter, mask); /* & mask */ + filter = Sse2.UnpackLow(filter.AsInt64(), filter.AsInt64()).AsByte(); + + /* filter1 = signed_char_clamp(filter + 4) >> 3; */ + /* filter2 = signed_char_clamp(filter + 3) >> 3; */ + filter2Filter1 = Sse2.AddSaturate(filter.AsSByte(), t3T4.AsSByte()).AsByte(); /* signed_char_clamp */ + filter = Sse2.UnpackHigh(filter2Filter1, filter2Filter1); + filter2Filter1 = Sse2.UnpackLow(filter2Filter1, filter2Filter1); + filter2Filter1 = Sse2.ShiftRightArithmetic(filter2Filter1.AsInt16(), 11).AsByte(); /* >> 3 */ + filter = Sse2.ShiftRightArithmetic(filter.AsInt16(), 11).AsByte(); /* >> 3 */ + filter2Filter1 = Sse2.PackSignedSaturate(filter2Filter1.AsInt16(), filter.AsInt16()).AsByte(); + + /* filter = ROUND_POWER_OF_TWO(filter1, 1) & ~hev; */ + filter = Sse2.SubtractSaturate(filter2Filter1.AsSByte(), ff.AsSByte()).AsByte(); /* + 1 */ + filter = Sse2.UnpackLow(filter, filter); + filter = Sse2.ShiftRightArithmetic(filter.AsInt16(), 9).AsByte(); /* round */ + filter = Sse2.PackSignedSaturate(filter.AsInt16(), filter.AsInt16()).AsByte(); + filter = Sse2.AndNot(hev, filter); + + hev = Sse2.UnpackHigh(filter2Filter1.AsInt64(), filter.AsInt64()).AsByte(); + filter2Filter1 = Sse2.UnpackLow(filter2Filter1.AsInt64(), filter.AsInt64()).AsByte(); + + /* signed_char_clamp(qs1 - filter), signed_char_clamp(qs0 - filter1) */ + qs1Qs0 = Sse2.SubtractSaturate(qs1Qs0.AsSByte(), filter2Filter1.AsSByte()).AsByte(); + /* signed_char_clamp(ps1 + filter), signed_char_clamp(ps0 + filter2) */ + ps1Ps0 = Sse2.AddSaturate(ps1Ps0.AsSByte(), hev.AsSByte()).AsByte(); + qs1Qs0 = Sse2.Xor(qs1Qs0, t80); /* ^ 0x80 */ + ps1Ps0 = Sse2.Xor(ps1Ps0, t80); /* ^ 0x80 */ + } + + public static unsafe void LpfHorizontal4( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + Vector128 zero = Vector128.Zero; + Vector128 limitV, threshV; + + fixed (byte* pBLimit = blimit, pLimit = limit, pThresh = thresh) + { + limitV = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)pBLimit), + Sse2.LoadScalarVector128((long*)pLimit)).AsByte(); + threshV = Sse2.UnpackLow(Sse2.LoadScalarVector128((long*)pThresh).AsByte(), zero); + } + + Vector128 ff = Sse2.CompareEqual(zero, zero); + Vector128 q1P1, q0P0, p3P2, p2P1, p1P0, q3Q2, q2Q1, q1Q0; + + p3P2 = Sse2.UnpackLow(Sse2.LoadScalarVector128((long*)(s.ToPointer() - (3 * pitch))), + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (4 * pitch)))).AsByte(); + q1P1 = Sse2.UnpackLow(Sse2.LoadScalarVector128((long*)(s.ToPointer() - (2 * pitch))), + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (1 * pitch)))).AsByte(); + q0P0 = Sse2.UnpackLow(Sse2.LoadScalarVector128((long*)(s.ToPointer() - (1 * pitch))), + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (0 * pitch)))).AsByte(); + q3Q2 = Sse2.UnpackLow(Sse2.LoadScalarVector128((long*)(s.ToPointer() + (2 * pitch))), + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (3 * pitch)))).AsByte(); + p1P0 = Sse2.UnpackLow(q0P0.AsInt64(), q1P1.AsInt64()).AsByte(); + p2P1 = Sse2.UnpackLow(q1P1.AsInt64(), p3P2.AsInt64()).AsByte(); + q1Q0 = Sse2.UnpackHigh(q0P0.AsInt64(), q1P1.AsInt64()).AsByte(); + q2Q1 = Sse2.UnpackLow(Sse2.ShiftRightLogical128BitLane(q1P1, 8).AsInt64(), q3Q2.AsInt64()).AsByte(); + + FilterHevMask(q1P1, q0P0, p3P2, p2P1, p1P0, q3Q2, q2Q1, q1Q0, limitV, threshV, out Vector128 hev, out Vector128 mask); + Filter4(p1P0, q1Q0, hev, mask, ff, out Vector128 ps1Ps0, out Vector128 qs1Qs0); + + Sse.StoreHigh((float*)(s.ToPointer() - (2 * pitch)), ps1Ps0.AsSingle()); // *op1 + Sse2.StoreScalar((long*)(s.ToPointer() - (1 * pitch)), ps1Ps0.AsInt64()); // *op0 + Sse2.StoreScalar((long*)(s.ToPointer() + (0 * pitch)), qs1Qs0.AsInt64()); // *oq0 + Sse.StoreHigh((float*)(s.ToPointer() + (1 * pitch)), qs1Qs0.AsSingle()); // *oq1 + } + + public static unsafe void LpfVertical4( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + Vector128 zero = Vector128.Zero; + Vector128 limitV, threshV; + + fixed (byte* pBLimit = blimit, pLimit = limit, pThresh = thresh) + { + limitV = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)pBLimit).AsInt64(), + Sse2.LoadScalarVector128((long*)pLimit).AsInt64()).AsByte(); + threshV = Sse2.UnpackLow(Sse2.LoadScalarVector128((long*)pThresh).AsByte(), zero); + } + + Vector128 ff = Sse2.CompareEqual(zero, zero); + Vector128 x0, x1, x2, x3; + Vector128 q1P1, q0P0, p3P2, p2P1, p1P0, q3Q2, q2Q1, q1Q0; + + // 00 10 01 11 02 12 03 13 04 14 05 15 06 16 07 17 + q1Q0 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (0 * pitch) - 4)).AsByte(), + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (1 * pitch) - 4)).AsByte()); + + // 20 30 21 31 22 32 23 33 24 34 25 35 26 36 27 37 + x1 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (2 * pitch) - 4)).AsByte(), + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (3 * pitch) - 4)).AsByte()); + + // 40 50 41 51 42 52 43 53 44 54 45 55 46 56 47 57 + x2 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (4 * pitch) - 4)).AsByte(), + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (5 * pitch) - 4)).AsByte()); + + // 60 70 61 71 62 72 63 73 64 74 65 75 66 76 67 77 + x3 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (6 * pitch) - 4)).AsByte(), + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (7 * pitch) - 4)).AsByte()); + + // Transpose 8x8 + // 00 10 20 30 01 11 21 31 02 12 22 32 03 13 23 33 + p1P0 = Sse2.UnpackLow(q1Q0.AsInt16(), x1.AsInt16()).AsByte(); + // 40 50 60 70 41 51 61 71 42 52 62 72 43 53 63 73 + x0 = Sse2.UnpackLow(x2.AsInt16(), x3.AsInt16()).AsByte(); + // 00 10 20 30 40 50 60 70 01 11 21 31 41 51 61 71 + p3P2 = Sse2.UnpackLow(p1P0.AsInt32(), x0.AsInt32()).AsByte(); + // 02 12 22 32 42 52 62 72 03 13 23 33 43 53 63 73 + p1P0 = Sse2.UnpackHigh(p1P0.AsInt32(), x0.AsInt32()).AsByte(); + p3P2 = Sse2.UnpackHigh(p3P2.AsInt64(), Sse2.ShiftLeftLogical128BitLane(p3P2, 8).AsInt64()) + .AsByte(); // swap lo and high + p1P0 = Sse2.UnpackHigh(p1P0.AsInt64(), Sse2.ShiftLeftLogical128BitLane(p1P0, 8).AsInt64()) + .AsByte(); // swap lo and high + + // 04 14 24 34 05 15 25 35 06 16 26 36 07 17 27 37 + q1Q0 = Sse2.UnpackHigh(q1Q0.AsInt16(), x1.AsInt16()).AsByte(); + // 44 54 64 74 45 55 65 75 46 56 66 76 47 57 67 77 + x2 = Sse2.UnpackHigh(x2.AsInt16(), x3.AsInt16()).AsByte(); + // 06 16 26 36 46 56 66 76 07 17 27 37 47 57 67 77 + q3Q2 = Sse2.UnpackHigh(q1Q0.AsInt32(), x2.AsInt32()).AsByte(); + // 04 14 24 34 44 54 64 74 05 15 25 35 45 55 65 75 + q1Q0 = Sse2.UnpackLow(q1Q0.AsInt32(), x2.AsInt32()).AsByte(); + + q0P0 = Sse2.UnpackLow(p1P0.AsInt64(), q1Q0.AsInt64()).AsByte(); + q1P1 = Sse2.UnpackHigh(p1P0.AsInt64(), q1Q0.AsInt64()).AsByte(); + p1P0 = Sse2.UnpackLow(q0P0.AsInt64(), q1P1.AsInt64()).AsByte(); + p2P1 = Sse2.UnpackLow(q1P1.AsInt64(), p3P2.AsInt64()).AsByte(); + q2Q1 = Sse2.UnpackLow(Sse2.ShiftRightLogical128BitLane(q1P1, 8).AsInt64(), q3Q2.AsInt64()).AsByte(); + + FilterHevMask(q1P1, q0P0, p3P2, p2P1, p1P0, q3Q2, q2Q1, q1Q0, limitV, threshV, out Vector128 hev, out Vector128 mask); + Filter4(p1P0, q1Q0, hev, mask, ff, out Vector128 ps1Ps0, out Vector128 qs1Qs0); + + // Transpose 8x4 to 4x8 + // qs1qs0: 20 21 22 23 24 25 26 27 30 31 32 33 34 34 36 37 + // ps1ps0: 10 11 12 13 14 15 16 17 00 01 02 03 04 05 06 07 + // 00 01 02 03 04 05 06 07 10 11 12 13 14 15 16 17 + ps1Ps0 = Sse2.UnpackHigh(ps1Ps0.AsInt64(), Sse2.ShiftLeftLogical128BitLane(ps1Ps0, 8).AsInt64()).AsByte(); + // 10 30 11 31 12 32 13 33 14 34 15 35 16 36 17 37 + x0 = Sse2.UnpackHigh(ps1Ps0, qs1Qs0); + // 00 20 01 21 02 22 03 23 04 24 05 25 06 26 07 27 + ps1Ps0 = Sse2.UnpackLow(ps1Ps0, qs1Qs0); + // 04 14 24 34 05 15 25 35 06 16 26 36 07 17 27 37 + qs1Qs0 = Sse2.UnpackHigh(ps1Ps0, x0); + // 00 10 20 30 01 11 21 31 02 12 22 32 03 13 23 33 + ps1Ps0 = Sse2.UnpackLow(ps1Ps0, x0); + + *(int*)(s.ToPointer() + (0 * pitch) - 2) = ps1Ps0.AsInt32().GetElement(0); + ps1Ps0 = Sse2.ShiftRightLogical128BitLane(ps1Ps0, 4); + *(int*)(s.ToPointer() + (1 * pitch) - 2) = ps1Ps0.AsInt32().GetElement(0); + ps1Ps0 = Sse2.ShiftRightLogical128BitLane(ps1Ps0, 4); + *(int*)(s.ToPointer() + (2 * pitch) - 2) = ps1Ps0.AsInt32().GetElement(0); + ps1Ps0 = Sse2.ShiftRightLogical128BitLane(ps1Ps0, 4); + *(int*)(s.ToPointer() + (3 * pitch) - 2) = ps1Ps0.AsInt32().GetElement(0); + + *(int*)(s.ToPointer() + (4 * pitch) - 2) = qs1Qs0.AsInt32().GetElement(0); + qs1Qs0 = Sse2.ShiftRightLogical128BitLane(qs1Qs0, 4); + *(int*)(s.ToPointer() + (5 * pitch) - 2) = qs1Qs0.AsInt32().GetElement(0); + qs1Qs0 = Sse2.ShiftRightLogical128BitLane(qs1Qs0, 4); + *(int*)(s.ToPointer() + (6 * pitch) - 2) = qs1Qs0.AsInt32().GetElement(0); + qs1Qs0 = Sse2.ShiftRightLogical128BitLane(qs1Qs0, 4); + *(int*)(s.ToPointer() + (7 * pitch) - 2) = qs1Qs0.AsInt32().GetElement(0); + } + + public static unsafe void LpfHorizontal16( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + Vector128 zero = Vector128.Zero; + Vector128 one = Vector128.Create((byte)1); + Vector128 blimitV, limitV, threshV; + + fixed (byte* pBLimit = blimit, pLimit = limit, pThresh = thresh) + { + blimitV = Sse2.LoadVector128(pBLimit); + limitV = Sse2.LoadVector128(pLimit); + threshV = Sse2.LoadVector128(pThresh); + } + + Vector128 mask, hev, flat, flat2; + Vector128 q7P7, q6P6, q5P5, q4P4, q3P3, q2P2, q1P1, q0P0, p0Q0, p1Q1; + Vector128 absP1P0; + + q4P4 = Sse2.LoadScalarVector128((long*)(s.ToPointer() - (5 * pitch))).AsByte(); + q4P4 = Sse.LoadHigh(q4P4.AsSingle(), (float*)(s.ToPointer() + (4 * pitch))).AsByte(); + q3P3 = Sse2.LoadScalarVector128((long*)(s.ToPointer() - (4 * pitch))).AsByte(); + q3P3 = Sse.LoadHigh(q3P3.AsSingle(), (float*)(s.ToPointer() + (3 * pitch))).AsByte(); + q2P2 = Sse2.LoadScalarVector128((long*)(s.ToPointer() - (3 * pitch))).AsByte(); + q2P2 = Sse.LoadHigh(q2P2.AsSingle(), (float*)(s.ToPointer() + (2 * pitch))).AsByte(); + q1P1 = Sse2.LoadScalarVector128((long*)(s.ToPointer() - (2 * pitch))).AsByte(); + q1P1 = Sse.LoadHigh(q1P1.AsSingle(), (float*)(s.ToPointer() + (1 * pitch))).AsByte(); + p1Q1 = Sse2.Shuffle(q1P1.AsUInt32(), 78).AsByte(); + q0P0 = Sse2.LoadScalarVector128((long*)(s.ToPointer() - (1 * pitch))).AsByte(); + q0P0 = Sse.LoadHigh(q0P0.AsSingle(), (float*)(s.ToPointer() - (0 * pitch))).AsByte(); + p0Q0 = Sse2.Shuffle(q0P0.AsUInt32(), 78).AsByte(); + + { + Vector128 absP1Q1, absP0Q0, absQ1Q0, fe, ff, work; + absP1P0 = AbsDiff(q1P1, q0P0); + absQ1Q0 = Sse2.ShiftRightLogical128BitLane(absP1P0, 8); + fe = Vector128.Create((byte)0xfe); + ff = Sse2.CompareEqual(absP1P0, absP1P0); + absP0Q0 = AbsDiff(q0P0, p0Q0); + absP1Q1 = AbsDiff(q1P1, p1Q1); + flat = Sse2.Max(absP1P0, absQ1Q0); + hev = Sse2.SubtractSaturate(flat, threshV); + hev = Sse2.Xor(Sse2.CompareEqual(hev, zero), ff); + + absP0Q0 = Sse2.AddSaturate(absP0Q0, absP0Q0); + absP1Q1 = Sse2.ShiftRightLogical(Sse2.And(absP1Q1, fe).AsInt16(), 1).AsByte(); + mask = Sse2.SubtractSaturate(Sse2.AddSaturate(absP0Q0, absP1Q1), blimitV); + mask = Sse2.Xor(Sse2.CompareEqual(mask, zero), ff); + // mask |= (abs(p0 - q0) * 2 + abs(p1 - q1) / 2 > blimit) * -1; + mask = Sse2.Max(absP1P0, mask); + // mask |= (abs(p1 - p0) > limit) * -1; + // mask |= (abs(q1 - q0) > limit) * -1; + + work = Sse2.Max(AbsDiff(q2P2, q1P1), AbsDiff(q3P3, q2P2)); + mask = Sse2.Max(work, mask); + mask = Sse2.Max(mask, Sse2.ShiftRightLogical128BitLane(mask, 8)); + mask = Sse2.SubtractSaturate(mask, limitV); + mask = Sse2.CompareEqual(mask, zero); + } + + // lp filter + { + Vector128 t4 = Vector128.Create((byte)4); + Vector128 t3 = Vector128.Create((byte)3); + Vector128 t80 = Vector128.Create((byte)0x80); + Vector128 t1 = Vector128.Create((ushort)0x1); + Vector128 qs1Ps1 = Sse2.Xor(q1P1, t80); + Vector128 qs0Ps0 = Sse2.Xor(q0P0, t80); + Vector128 qs0 = Sse2.Xor(p0Q0, t80); + Vector128 qs1 = Sse2.Xor(p1Q1, t80); + Vector128 filt; + Vector128 workA; + Vector128 filter1, filter2; + Vector128 flat2Q6P6, flat2Q5P5, flat2Q4P4, flat2Q3P3, flat2Q2P2; + Vector128 flat2Q1P1, flat2Q0P0, flatQ2P2, flatQ1P1, flatQ0P0; + + filt = Sse2.And(Sse2.SubtractSaturate(qs1Ps1.AsSByte(), qs1.AsSByte()).AsByte(), hev); + workA = Sse2.SubtractSaturate(qs0.AsSByte(), qs0Ps0.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + // (vpx_filter + 3 * (qs0 - ps0)) & mask + filt = Sse2.And(filt, mask); + + filter1 = Sse2.AddSaturate(filt.AsSByte(), t4.AsSByte()).AsByte(); + filter2 = Sse2.AddSaturate(filt.AsSByte(), t3.AsSByte()).AsByte(); + + filter1 = Sse2.UnpackLow(zero, filter1); + filter1 = Sse2.ShiftRightArithmetic(filter1.AsInt16(), 0xB).AsByte(); + filter2 = Sse2.UnpackLow(zero, filter2); + filter2 = Sse2.ShiftRightArithmetic(filter2.AsInt16(), 0xB).AsByte(); + + // Filter1 >> 3 + filt = Sse2.PackSignedSaturate(filter2.AsInt16(), + Sse2.SubtractSaturate(zero.AsInt16(), filter1.AsInt16())).AsByte(); + qs0Ps0 = Sse2.Xor(Sse2.AddSaturate(qs0Ps0.AsSByte(), filt.AsSByte()).AsByte(), t80); + + // filt >> 1 + filt = Sse2.AddSaturate(filter1.AsInt16(), t1.AsInt16()).AsByte(); + filt = Sse2.ShiftRightArithmetic(filt.AsInt16(), 1).AsByte(); + filt = Sse2.AndNot(Sse2.ShiftRightArithmetic(Sse2.UnpackLow(zero, hev).AsInt16(), 0x8), filt.AsInt16()) + .AsByte(); + filt = Sse2.PackSignedSaturate(filt.AsInt16(), Sse2.SubtractSaturate(zero.AsInt16(), filt.AsInt16())) + .AsByte(); + qs1Ps1 = Sse2.Xor(Sse2.AddSaturate(qs1Ps1.AsSByte(), filt.AsSByte()).AsByte(), t80); + // loopfilter done + + { + Vector128 work; + flat = Sse2.Max(AbsDiff(q2P2, q0P0), AbsDiff(q3P3, q0P0)); + flat = Sse2.Max(absP1P0, flat); + flat = Sse2.Max(flat, Sse2.ShiftRightLogical128BitLane(flat, 8)); + flat = Sse2.SubtractSaturate(flat, one); + flat = Sse2.CompareEqual(flat, zero); + flat = Sse2.And(flat, mask); + + q5P5 = Sse2.LoadScalarVector128((long*)(s.ToPointer() - (6 * pitch))).AsByte(); + q5P5 = Sse.LoadHigh(q5P5.AsSingle(), (float*)(s.ToPointer() + (5 * pitch))).AsByte(); + + q6P6 = Sse2.LoadScalarVector128((long*)(s.ToPointer() - (7 * pitch))).AsByte(); + q6P6 = Sse.LoadHigh(q6P6.AsSingle(), (float*)(s.ToPointer() + (6 * pitch))).AsByte(); + flat2 = Sse2.Max(AbsDiff(q4P4, q0P0), AbsDiff(q5P5, q0P0)); + + q7P7 = Sse2.LoadScalarVector128((long*)(s.ToPointer() - (8 * pitch))).AsByte(); + q7P7 = Sse.LoadHigh(q7P7.AsSingle(), (float*)(s.ToPointer() + (7 * pitch))).AsByte(); + work = Sse2.Max(AbsDiff(q6P6, q0P0), AbsDiff(q7P7, q0P0)); + flat2 = Sse2.Max(work, flat2); + flat2 = Sse2.Max(flat2, Sse2.ShiftRightLogical128BitLane(flat2, 8)); + flat2 = Sse2.SubtractSaturate(flat2, one); + flat2 = Sse2.CompareEqual(flat2, zero); + flat2 = Sse2.And(flat2, flat); // flat2 & flat & mask + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // flat and wide flat calculations + { + Vector128 eight = Vector128.Create((short)8); + Vector128 four = Vector128.Create((short)4); + Vector128 p716, p616, p516, p416, p316, p216, p116, p016; + Vector128 q716, q616, q516, q416, q316, q216, q116, q016; + Vector128 pixelFilterP, pixelFilterQ; + Vector128 pixetFilterP2P1P0, pixetFilterQ2Q1Q0; + Vector128 sumP7, sumQ7, sumP3, sumQ3, resP, resQ; + + p716 = Sse2.UnpackLow(q7P7, zero).AsInt16(); + p616 = Sse2.UnpackLow(q6P6, zero).AsInt16(); + p516 = Sse2.UnpackLow(q5P5, zero).AsInt16(); + p416 = Sse2.UnpackLow(q4P4, zero).AsInt16(); + p316 = Sse2.UnpackLow(q3P3, zero).AsInt16(); + p216 = Sse2.UnpackLow(q2P2, zero).AsInt16(); + p116 = Sse2.UnpackLow(q1P1, zero).AsInt16(); + p016 = Sse2.UnpackLow(q0P0, zero).AsInt16(); + q016 = Sse2.UnpackHigh(q0P0, zero).AsInt16(); + q116 = Sse2.UnpackHigh(q1P1, zero).AsInt16(); + q216 = Sse2.UnpackHigh(q2P2, zero).AsInt16(); + q316 = Sse2.UnpackHigh(q3P3, zero).AsInt16(); + q416 = Sse2.UnpackHigh(q4P4, zero).AsInt16(); + q516 = Sse2.UnpackHigh(q5P5, zero).AsInt16(); + q616 = Sse2.UnpackHigh(q6P6, zero).AsInt16(); + q716 = Sse2.UnpackHigh(q7P7, zero).AsInt16(); + + pixelFilterP = Sse2.Add(Sse2.Add(p616, p516), Sse2.Add(p416, p316)); + pixelFilterQ = Sse2.Add(Sse2.Add(q616, q516), Sse2.Add(q416, q316)); + + pixetFilterP2P1P0 = Sse2.Add(p016, Sse2.Add(p216, p116)); + pixelFilterP = Sse2.Add(pixelFilterP, pixetFilterP2P1P0); + + pixetFilterQ2Q1Q0 = Sse2.Add(q016, Sse2.Add(q216, q116)); + pixelFilterQ = Sse2.Add(pixelFilterQ, pixetFilterQ2Q1Q0); + pixelFilterP = Sse2.Add(eight, Sse2.Add(pixelFilterP, pixelFilterQ)); + pixetFilterP2P1P0 = Sse2.Add(four, Sse2.Add(pixetFilterP2P1P0, pixetFilterQ2Q1Q0)); + resP = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterP, Sse2.Add(p716, p016)), 4); + resQ = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterP, Sse2.Add(q716, q016)), 4); + flat2Q0P0 = Sse2.PackUnsignedSaturate(resP, resQ); + resP = Sse2.ShiftRightLogical(Sse2.Add(pixetFilterP2P1P0, Sse2.Add(p316, p016)), 3); + resQ = Sse2.ShiftRightLogical(Sse2.Add(pixetFilterP2P1P0, Sse2.Add(q316, q016)), 3); + + flatQ0P0 = Sse2.PackUnsignedSaturate(resP, resQ); + + sumP7 = Sse2.Add(p716, p716); + sumQ7 = Sse2.Add(q716, q716); + sumP3 = Sse2.Add(p316, p316); + sumQ3 = Sse2.Add(q316, q316); + + pixelFilterQ = Sse2.Subtract(pixelFilterP, p616); + pixelFilterP = Sse2.Subtract(pixelFilterP, q616); + resP = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterP, Sse2.Add(sumP7, p116)), 4); + resQ = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterQ, Sse2.Add(sumQ7, q116)), 4); + flat2Q1P1 = Sse2.PackUnsignedSaturate(resP, resQ); + + pixetFilterQ2Q1Q0 = Sse2.Subtract(pixetFilterP2P1P0, p216); + pixetFilterP2P1P0 = Sse2.Subtract(pixetFilterP2P1P0, q216); + resP = Sse2.ShiftRightLogical(Sse2.Add(pixetFilterP2P1P0, Sse2.Add(sumP3, p116)), 3); + resQ = Sse2.ShiftRightLogical(Sse2.Add(pixetFilterQ2Q1Q0, Sse2.Add(sumQ3, q116)), 3); + flatQ1P1 = Sse2.PackUnsignedSaturate(resP, resQ); + + sumP7 = Sse2.Add(sumP7, p716); + sumQ7 = Sse2.Add(sumQ7, q716); + sumP3 = Sse2.Add(sumP3, p316); + sumQ3 = Sse2.Add(sumQ3, q316); + + pixelFilterP = Sse2.Subtract(pixelFilterP, q516); + pixelFilterQ = Sse2.Subtract(pixelFilterQ, p516); + resP = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterP, Sse2.Add(sumP7, p216)), 4); + resQ = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterQ, Sse2.Add(sumQ7, q216)), 4); + flat2Q2P2 = Sse2.PackUnsignedSaturate(resP, resQ); + + pixetFilterP2P1P0 = Sse2.Subtract(pixetFilterP2P1P0, q116); + pixetFilterQ2Q1Q0 = Sse2.Subtract(pixetFilterQ2Q1Q0, p116); + + resP = Sse2.ShiftRightLogical(Sse2.Add(pixetFilterP2P1P0, Sse2.Add(sumP3, p216)), 3); + resQ = Sse2.ShiftRightLogical(Sse2.Add(pixetFilterQ2Q1Q0, Sse2.Add(sumQ3, q216)), 3); + flatQ2P2 = Sse2.PackUnsignedSaturate(resP, resQ); + + sumP7 = Sse2.Add(sumP7, p716); + sumQ7 = Sse2.Add(sumQ7, q716); + pixelFilterP = Sse2.Subtract(pixelFilterP, q416); + pixelFilterQ = Sse2.Subtract(pixelFilterQ, p416); + resP = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterP, Sse2.Add(sumP7, p316)), 4); + resQ = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterQ, Sse2.Add(sumQ7, q316)), 4); + flat2Q3P3 = Sse2.PackUnsignedSaturate(resP, resQ); + + sumP7 = Sse2.Add(sumP7, p716); + sumQ7 = Sse2.Add(sumQ7, q716); + pixelFilterP = Sse2.Subtract(pixelFilterP, q316); + pixelFilterQ = Sse2.Subtract(pixelFilterQ, p316); + resP = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterP, Sse2.Add(sumP7, p416)), 4); + resQ = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterQ, Sse2.Add(sumQ7, q416)), 4); + flat2Q4P4 = Sse2.PackUnsignedSaturate(resP, resQ); + + sumP7 = Sse2.Add(sumP7, p716); + sumQ7 = Sse2.Add(sumQ7, q716); + pixelFilterP = Sse2.Subtract(pixelFilterP, q216); + pixelFilterQ = Sse2.Subtract(pixelFilterQ, p216); + resP = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterP, Sse2.Add(sumP7, p516)), 4); + resQ = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterQ, Sse2.Add(sumQ7, q516)), 4); + flat2Q5P5 = Sse2.PackUnsignedSaturate(resP, resQ); + + sumP7 = Sse2.Add(sumP7, p716); + sumQ7 = Sse2.Add(sumQ7, q716); + pixelFilterP = Sse2.Subtract(pixelFilterP, q116); + pixelFilterQ = Sse2.Subtract(pixelFilterQ, p116); + resP = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterP, Sse2.Add(sumP7, p616)), 4); + resQ = Sse2.ShiftRightLogical(Sse2.Add(pixelFilterQ, Sse2.Add(sumQ7, q616)), 4); + flat2Q6P6 = Sse2.PackUnsignedSaturate(resP, resQ); + } + // wide flat + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + flat = Sse2.Shuffle(flat.AsInt32(), 68).AsByte(); + flat2 = Sse2.Shuffle(flat2.AsInt32(), 68).AsByte(); + + q2P2 = Sse2.AndNot(flat, q2P2); + flatQ2P2 = Sse2.And(flat, flatQ2P2); + q2P2 = Sse2.Or(q2P2, flatQ2P2); + + qs1Ps1 = Sse2.AndNot(flat, qs1Ps1); + flatQ1P1 = Sse2.And(flat, flatQ1P1); + q1P1 = Sse2.Or(qs1Ps1, flatQ1P1); + + qs0Ps0 = Sse2.AndNot(flat, qs0Ps0); + flatQ0P0 = Sse2.And(flat, flatQ0P0); + q0P0 = Sse2.Or(qs0Ps0, flatQ0P0); + + q6P6 = Sse2.AndNot(flat2, q6P6); + flat2Q6P6 = Sse2.And(flat2, flat2Q6P6); + q6P6 = Sse2.Or(q6P6, flat2Q6P6); + Sse2.StoreScalar((long*)(s.ToPointer() - (7 * pitch)), q6P6.AsInt64()); + Sse.StoreHigh((float*)(s.ToPointer() + (6 * pitch)), q6P6.AsSingle()); + + q5P5 = Sse2.AndNot(flat2, q5P5); + flat2Q5P5 = Sse2.And(flat2, flat2Q5P5); + q5P5 = Sse2.Or(q5P5, flat2Q5P5); + Sse2.StoreScalar((long*)(s.ToPointer() - (6 * pitch)), q5P5.AsInt64()); + Sse.StoreHigh((float*)(s.ToPointer() + (5 * pitch)), q5P5.AsSingle()); + + q4P4 = Sse2.AndNot(flat2, q4P4); + flat2Q4P4 = Sse2.And(flat2, flat2Q4P4); + q4P4 = Sse2.Or(q4P4, flat2Q4P4); + Sse2.StoreScalar((long*)(s.ToPointer() - (5 * pitch)), q4P4.AsInt64()); + Sse.StoreHigh((float*)(s.ToPointer() + (4 * pitch)), q4P4.AsSingle()); + + q3P3 = Sse2.AndNot(flat2, q3P3); + flat2Q3P3 = Sse2.And(flat2, flat2Q3P3); + q3P3 = Sse2.Or(q3P3, flat2Q3P3); + Sse2.StoreScalar((long*)(s.ToPointer() - (4 * pitch)), q3P3.AsInt64()); + Sse.StoreHigh((float*)(s.ToPointer() + (3 * pitch)), q3P3.AsSingle()); + + q2P2 = Sse2.AndNot(flat2, q2P2); + flat2Q2P2 = Sse2.And(flat2, flat2Q2P2); + q2P2 = Sse2.Or(q2P2, flat2Q2P2); + Sse2.StoreScalar((long*)(s.ToPointer() - (3 * pitch)), q2P2.AsInt64()); + Sse.StoreHigh((float*)(s.ToPointer() + (2 * pitch)), q2P2.AsSingle()); + + q1P1 = Sse2.AndNot(flat2, q1P1); + flat2Q1P1 = Sse2.And(flat2, flat2Q1P1); + q1P1 = Sse2.Or(q1P1, flat2Q1P1); + Sse2.StoreScalar((long*)(s.ToPointer() - (2 * pitch)), q1P1.AsInt64()); + Sse.StoreHigh((float*)(s.ToPointer() + (1 * pitch)), q1P1.AsSingle()); + + q0P0 = Sse2.AndNot(flat2, q0P0); + flat2Q0P0 = Sse2.And(flat2, flat2Q0P0); + q0P0 = Sse2.Or(q0P0, flat2Q0P0); + Sse2.StoreScalar((long*)(s.ToPointer() - (1 * pitch)), q0P0.AsInt64()); + Sse.StoreHigh((float*)(s.ToPointer() - (0 * pitch)), q0P0.AsSingle()); + } + } + + private static Vector128 FilterAdd2Sub2( + Vector128 total, + Vector128 a1, + Vector128 a2, + Vector128 s1, + Vector128 s2) + { + Vector128 x = Sse2.Add(a1, total); + x = Sse2.Add(Sse2.Subtract(x, Sse2.Add(s1, s2)), a2); + return x; + } + + private static Vector128 Filter8Mask( + Vector128 flat, + Vector128 otherFilt, + Vector128 f8Lo, + Vector128 f8Hi) + { + Vector128 f8 = + Sse2.PackUnsignedSaturate(Sse2.ShiftRightLogical(f8Lo, 3), Sse2.ShiftRightLogical(f8Hi, 3)); + Vector128 result = Sse2.And(flat, f8); + return Sse2.Or(Sse2.AndNot(flat, otherFilt), result); + } + + private static Vector128 Filter16Mask( + Vector128 flat, + Vector128 otherFilt, + Vector128 fLo, + Vector128 fHi) + { + Vector128 f = + Sse2.PackUnsignedSaturate(Sse2.ShiftRightLogical(fLo, 4), Sse2.ShiftRightLogical(fHi, 4)); + Vector128 result = Sse2.And(flat, f); + return Sse2.Or(Sse2.AndNot(flat, otherFilt), result); + } + + public static unsafe void LpfHorizontal16Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + Vector128 zero = Vector128.Zero; + Vector128 one = Vector128.Create((byte)1); + Vector128 blimitV, limitV, threshV; + + fixed (byte* pBLimit = blimit, pLimit = limit, pThresh = thresh) + { + blimitV = Sse2.LoadVector128(pBLimit); + limitV = Sse2.LoadVector128(pLimit); + threshV = Sse2.LoadVector128(pThresh); + } + + Vector128 mask, hev, flat, flat2; + Vector128 p7, p6, p5; + Vector128 p4, p3, p2, p1, p0, q0, q1, q2, q3, q4; + Vector128 q5, q6, q7; + + Vector128 op2, op1, op0, oq0, oq1, oq2; + + Vector128 maxAbsP1P0Q1Q0; + + p7 = Sse2.LoadVector128(s.ToPointer() - (8 * pitch)); + p6 = Sse2.LoadVector128(s.ToPointer() - (7 * pitch)); + p5 = Sse2.LoadVector128(s.ToPointer() - (6 * pitch)); + p4 = Sse2.LoadVector128(s.ToPointer() - (5 * pitch)); + p3 = Sse2.LoadVector128(s.ToPointer() - (4 * pitch)); + p2 = Sse2.LoadVector128(s.ToPointer() - (3 * pitch)); + p1 = Sse2.LoadVector128(s.ToPointer() - (2 * pitch)); + p0 = Sse2.LoadVector128(s.ToPointer() - (1 * pitch)); + q0 = Sse2.LoadVector128(s.ToPointer() - (0 * pitch)); + q1 = Sse2.LoadVector128(s.ToPointer() + (1 * pitch)); + q2 = Sse2.LoadVector128(s.ToPointer() + (2 * pitch)); + q3 = Sse2.LoadVector128(s.ToPointer() + (3 * pitch)); + q4 = Sse2.LoadVector128(s.ToPointer() + (4 * pitch)); + q5 = Sse2.LoadVector128(s.ToPointer() + (5 * pitch)); + q6 = Sse2.LoadVector128(s.ToPointer() + (6 * pitch)); + q7 = Sse2.LoadVector128(s.ToPointer() + (7 * pitch)); + + { + Vector128 absP1P0 = AbsDiff(p1, p0); + Vector128 absQ1Q0 = AbsDiff(q1, q0); + Vector128 fe = Vector128.Create((byte)0xfe); + Vector128 ff = Sse2.CompareEqual(zero, zero); + Vector128 absP0Q0 = AbsDiff(p0, q0); + Vector128 absP1Q1 = AbsDiff(p1, q1); + Vector128 work; + maxAbsP1P0Q1Q0 = Sse2.Max(absP1P0, absQ1Q0); + + absP0Q0 = Sse2.AddSaturate(absP0Q0, absP0Q0); + absP1Q1 = Sse2.ShiftRightLogical(Sse2.And(absP1Q1, fe).AsInt16(), 1).AsByte(); + mask = Sse2.SubtractSaturate(Sse2.AddSaturate(absP0Q0, absP1Q1), blimitV); + mask = Sse2.Xor(Sse2.CompareEqual(mask, zero), ff); + // mask |= (abs(p0 - q0) * 2 + abs(p1 - q1) / 2 > blimit) * -1; + mask = Sse2.Max(maxAbsP1P0Q1Q0, mask); + // mask |= (abs(p1 - p0) > limit) * -1; + // mask |= (abs(q1 - q0) > limit) * -1; + work = Sse2.Max(AbsDiff(p2, p1), AbsDiff(p3, p2)); + mask = Sse2.Max(work, mask); + work = Sse2.Max(AbsDiff(q2, q1), AbsDiff(q3, q2)); + mask = Sse2.Max(work, mask); + mask = Sse2.SubtractSaturate(mask, limitV); + mask = Sse2.CompareEqual(mask, zero); + } + + { + Vector128 work; + work = Sse2.Max(AbsDiff(p2, p0), AbsDiff(q2, q0)); + flat = Sse2.Max(work, maxAbsP1P0Q1Q0); + work = Sse2.Max(AbsDiff(p3, p0), AbsDiff(q3, q0)); + flat = Sse2.Max(work, flat); + work = Sse2.Max(AbsDiff(p4, p0), AbsDiff(q4, q0)); + flat = Sse2.SubtractSaturate(flat, one); + flat = Sse2.CompareEqual(flat, zero); + flat = Sse2.And(flat, mask); + flat2 = Sse2.Max(AbsDiff(p5, p0), AbsDiff(q5, q0)); + flat2 = Sse2.Max(work, flat2); + work = Sse2.Max(AbsDiff(p6, p0), AbsDiff(q6, q0)); + flat2 = Sse2.Max(work, flat2); + work = Sse2.Max(AbsDiff(p7, p0), AbsDiff(q7, q0)); + flat2 = Sse2.Max(work, flat2); + flat2 = Sse2.SubtractSaturate(flat2, one); + flat2 = Sse2.CompareEqual(flat2, zero); + flat2 = Sse2.And(flat2, flat); // flat2 & flat & mask + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // filter4 + { + Vector128 t4 = Vector128.Create((byte)4); + Vector128 t3 = Vector128.Create((byte)3); + Vector128 t80 = Vector128.Create((byte)0x80); + Vector128 te0 = Vector128.Create((byte)0xe0); + Vector128 t1F = Vector128.Create((byte)0x1f); + Vector128 t1 = Vector128.Create((byte)0x1); + Vector128 t7F = Vector128.Create((byte)0x7f); + Vector128 ff = Sse2.CompareEqual(t4, t4); + + Vector128 filt; + Vector128 workA; + Vector128 filter1, filter2; + + op1 = Sse2.Xor(p1, t80); + op0 = Sse2.Xor(p0, t80); + oq0 = Sse2.Xor(q0, t80); + oq1 = Sse2.Xor(q1, t80); + + hev = Sse2.SubtractSaturate(maxAbsP1P0Q1Q0, threshV); + hev = Sse2.Xor(Sse2.CompareEqual(hev, zero), ff); + filt = Sse2.And(Sse2.SubtractSaturate(op1.AsSByte(), oq1.AsSByte()).AsByte(), hev); + + workA = Sse2.SubtractSaturate(oq0.AsSByte(), op0.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + // (vpx_filter + 3 * (qs0 - ps0)) & mask + filt = Sse2.And(filt, mask); + filter1 = Sse2.AddSaturate(filt.AsSByte(), t4.AsSByte()).AsByte(); + filter2 = Sse2.AddSaturate(filt.AsSByte(), t3.AsSByte()).AsByte(); + + // Filter1 >> 3 + workA = Sse2.CompareGreaterThan(zero.AsSByte(), filter1.AsSByte()).AsByte(); + filter1 = Sse2.ShiftRightLogical(filter1.AsInt16(), 3).AsByte(); + workA = Sse2.And(workA, te0); + filter1 = Sse2.And(filter1, t1F); + filter1 = Sse2.Or(filter1, workA); + oq0 = Sse2.Xor(Sse2.SubtractSaturate(oq0.AsSByte(), filter1.AsSByte()).AsByte(), t80); + + // Filter2 >> 3 + workA = Sse2.CompareGreaterThan(zero.AsSByte(), filter2.AsSByte()).AsByte(); + filter2 = Sse2.ShiftRightLogical(filter2.AsInt16(), 3).AsByte(); + workA = Sse2.And(workA, te0); + filter2 = Sse2.And(filter2, t1F); + filter2 = Sse2.Or(filter2, workA); + op0 = Sse2.Xor(Sse2.AddSaturate(op0.AsSByte(), filter2.AsSByte()).AsByte(), t80); + + // filt >> 1 + filt = Sse2.AddSaturate(filter1.AsSByte(), t1.AsSByte()).AsByte(); + workA = Sse2.CompareGreaterThan(zero.AsSByte(), filt.AsSByte()).AsByte(); + filt = Sse2.ShiftRightLogical(filt.AsInt16(), 1).AsByte(); + workA = Sse2.And(workA, t80); + filt = Sse2.And(filt, t7F); + filt = Sse2.Or(filt, workA); + filt = Sse2.AndNot(hev, filt); + op1 = Sse2.Xor(Sse2.AddSaturate(op1.AsSByte(), filt.AsSByte()).AsByte(), t80); + oq1 = Sse2.Xor(Sse2.SubtractSaturate(oq1.AsSByte(), filt.AsSByte()).AsByte(), t80); + // loopfilter done + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // filter8 + { + Vector128 four = Vector128.Create((short)4); + Vector128 p3Lo = Sse2.UnpackLow(p3, zero).AsInt16(); + Vector128 p2Lo = Sse2.UnpackLow(p2, zero).AsInt16(); + Vector128 p1Lo = Sse2.UnpackLow(p1, zero).AsInt16(); + Vector128 p0Lo = Sse2.UnpackLow(p0, zero).AsInt16(); + Vector128 q0Lo = Sse2.UnpackLow(q0, zero).AsInt16(); + Vector128 q1Lo = Sse2.UnpackLow(q1, zero).AsInt16(); + Vector128 q2Lo = Sse2.UnpackLow(q2, zero).AsInt16(); + Vector128 q3Lo = Sse2.UnpackLow(q3, zero).AsInt16(); + + Vector128 p3Hi = Sse2.UnpackHigh(p3, zero).AsInt16(); + Vector128 p2Hi = Sse2.UnpackHigh(p2, zero).AsInt16(); + Vector128 p1Hi = Sse2.UnpackHigh(p1, zero).AsInt16(); + Vector128 p0Hi = Sse2.UnpackHigh(p0, zero).AsInt16(); + Vector128 q0Hi = Sse2.UnpackHigh(q0, zero).AsInt16(); + Vector128 q1Hi = Sse2.UnpackHigh(q1, zero).AsInt16(); + Vector128 q2Hi = Sse2.UnpackHigh(q2, zero).AsInt16(); + Vector128 q3Hi = Sse2.UnpackHigh(q3, zero).AsInt16(); + Vector128 f8Lo, f8Hi; + + f8Lo = Sse2.Add(Sse2.Add(p3Lo, four), Sse2.Add(p3Lo, p2Lo)); + f8Lo = Sse2.Add(Sse2.Add(p3Lo, f8Lo), Sse2.Add(p2Lo, p1Lo)); + f8Lo = Sse2.Add(Sse2.Add(p0Lo, q0Lo), f8Lo); + + f8Hi = Sse2.Add(Sse2.Add(p3Hi, four), Sse2.Add(p3Hi, p2Hi)); + f8Hi = Sse2.Add(Sse2.Add(p3Hi, f8Hi), Sse2.Add(p2Hi, p1Hi)); + f8Hi = Sse2.Add(Sse2.Add(p0Hi, q0Hi), f8Hi); + + op2 = Filter8Mask(flat, p2, f8Lo, f8Hi); + + f8Lo = FilterAdd2Sub2(f8Lo, q1Lo, p1Lo, p2Lo, p3Lo); + f8Hi = FilterAdd2Sub2(f8Hi, q1Hi, p1Hi, p2Hi, p3Hi); + op1 = Filter8Mask(flat, op1, f8Lo, f8Hi); + + f8Lo = FilterAdd2Sub2(f8Lo, q2Lo, p0Lo, p1Lo, p3Lo); + f8Hi = FilterAdd2Sub2(f8Hi, q2Hi, p0Hi, p1Hi, p3Hi); + op0 = Filter8Mask(flat, op0, f8Lo, f8Hi); + + f8Lo = FilterAdd2Sub2(f8Lo, q3Lo, q0Lo, p0Lo, p3Lo); + f8Hi = FilterAdd2Sub2(f8Hi, q3Hi, q0Hi, p0Hi, p3Hi); + oq0 = Filter8Mask(flat, oq0, f8Lo, f8Hi); + + f8Lo = FilterAdd2Sub2(f8Lo, q3Lo, q1Lo, q0Lo, p2Lo); + f8Hi = FilterAdd2Sub2(f8Hi, q3Hi, q1Hi, q0Hi, p2Hi); + oq1 = Filter8Mask(flat, oq1, f8Lo, f8Hi); + + f8Lo = FilterAdd2Sub2(f8Lo, q3Lo, q2Lo, q1Lo, p1Lo); + f8Hi = FilterAdd2Sub2(f8Hi, q3Hi, q2Hi, q1Hi, p1Hi); + oq2 = Filter8Mask(flat, q2, f8Lo, f8Hi); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // wide flat calculations + { + Vector128 eight = Vector128.Create((short)8); + Vector128 p7Lo = Sse2.UnpackLow(p7, zero).AsInt16(); + Vector128 p6Lo = Sse2.UnpackLow(p6, zero).AsInt16(); + Vector128 p5Lo = Sse2.UnpackLow(p5, zero).AsInt16(); + Vector128 p4Lo = Sse2.UnpackLow(p4, zero).AsInt16(); + Vector128 p3Lo = Sse2.UnpackLow(p3, zero).AsInt16(); + Vector128 p2Lo = Sse2.UnpackLow(p2, zero).AsInt16(); + Vector128 p1Lo = Sse2.UnpackLow(p1, zero).AsInt16(); + Vector128 p0Lo = Sse2.UnpackLow(p0, zero).AsInt16(); + Vector128 q0Lo = Sse2.UnpackLow(q0, zero).AsInt16(); + Vector128 q1Lo = Sse2.UnpackLow(q1, zero).AsInt16(); + Vector128 q2Lo = Sse2.UnpackLow(q2, zero).AsInt16(); + Vector128 q3Lo = Sse2.UnpackLow(q3, zero).AsInt16(); + Vector128 q4Lo = Sse2.UnpackLow(q4, zero).AsInt16(); + Vector128 q5Lo = Sse2.UnpackLow(q5, zero).AsInt16(); + Vector128 q6Lo = Sse2.UnpackLow(q6, zero).AsInt16(); + Vector128 q7Lo = Sse2.UnpackLow(q7, zero).AsInt16(); + + Vector128 p7Hi = Sse2.UnpackHigh(p7, zero).AsInt16(); + Vector128 p6Hi = Sse2.UnpackHigh(p6, zero).AsInt16(); + Vector128 p5Hi = Sse2.UnpackHigh(p5, zero).AsInt16(); + Vector128 p4Hi = Sse2.UnpackHigh(p4, zero).AsInt16(); + Vector128 p3Hi = Sse2.UnpackHigh(p3, zero).AsInt16(); + Vector128 p2Hi = Sse2.UnpackHigh(p2, zero).AsInt16(); + Vector128 p1Hi = Sse2.UnpackHigh(p1, zero).AsInt16(); + Vector128 p0Hi = Sse2.UnpackHigh(p0, zero).AsInt16(); + Vector128 q0Hi = Sse2.UnpackHigh(q0, zero).AsInt16(); + Vector128 q1Hi = Sse2.UnpackHigh(q1, zero).AsInt16(); + Vector128 q2Hi = Sse2.UnpackHigh(q2, zero).AsInt16(); + Vector128 q3Hi = Sse2.UnpackHigh(q3, zero).AsInt16(); + Vector128 q4Hi = Sse2.UnpackHigh(q4, zero).AsInt16(); + Vector128 q5Hi = Sse2.UnpackHigh(q5, zero).AsInt16(); + Vector128 q6Hi = Sse2.UnpackHigh(q6, zero).AsInt16(); + Vector128 q7Hi = Sse2.UnpackHigh(q7, zero).AsInt16(); + + Vector128 fLo; + Vector128 fHi; + + fLo = Sse2.Subtract(Sse2.ShiftLeftLogical(p7Lo, 3), p7Lo); // p7 * 7 + fLo = Sse2.Add(Sse2.ShiftLeftLogical(p6Lo, 1), Sse2.Add(p4Lo, fLo)); + fLo = Sse2.Add(Sse2.Add(p3Lo, fLo), Sse2.Add(p2Lo, p1Lo)); + fLo = Sse2.Add(Sse2.Add(p0Lo, q0Lo), fLo); + fLo = Sse2.Add(Sse2.Add(p5Lo, eight), fLo); + + fHi = Sse2.Subtract(Sse2.ShiftLeftLogical(p7Hi, 3), p7Hi); // p7 * 7 + fHi = Sse2.Add(Sse2.ShiftLeftLogical(p6Hi, 1), Sse2.Add(p4Hi, fHi)); + fHi = Sse2.Add(Sse2.Add(p3Hi, fHi), Sse2.Add(p2Hi, p1Hi)); + fHi = Sse2.Add(Sse2.Add(p0Hi, q0Hi), fHi); + fHi = Sse2.Add(Sse2.Add(p5Hi, eight), fHi); + + p6 = Filter16Mask(flat2, p6, fLo, fHi); + Sse2.Store(s.ToPointer() - (7 * pitch), p6); + + fLo = FilterAdd2Sub2(fLo, q1Lo, p5Lo, p6Lo, p7Lo); + fHi = FilterAdd2Sub2(fHi, q1Hi, p5Hi, p6Hi, p7Hi); + p5 = Filter16Mask(flat2, p5, fLo, fHi); + Sse2.Store(s.ToPointer() - (6 * pitch), p5); + + fLo = FilterAdd2Sub2(fLo, q2Lo, p4Lo, p5Lo, p7Lo); + fHi = FilterAdd2Sub2(fHi, q2Hi, p4Hi, p5Hi, p7Hi); + p4 = Filter16Mask(flat2, p4, fLo, fHi); + Sse2.Store(s.ToPointer() - (5 * pitch), p4); + + fLo = FilterAdd2Sub2(fLo, q3Lo, p3Lo, p4Lo, p7Lo); + fHi = FilterAdd2Sub2(fHi, q3Hi, p3Hi, p4Hi, p7Hi); + p3 = Filter16Mask(flat2, p3, fLo, fHi); + Sse2.Store(s.ToPointer() - (4 * pitch), p3); + + fLo = FilterAdd2Sub2(fLo, q4Lo, p2Lo, p3Lo, p7Lo); + fHi = FilterAdd2Sub2(fHi, q4Hi, p2Hi, p3Hi, p7Hi); + op2 = Filter16Mask(flat2, op2, fLo, fHi); + Sse2.Store(s.ToPointer() - (3 * pitch), op2); + + fLo = FilterAdd2Sub2(fLo, q5Lo, p1Lo, p2Lo, p7Lo); + fHi = FilterAdd2Sub2(fHi, q5Hi, p1Hi, p2Hi, p7Hi); + op1 = Filter16Mask(flat2, op1, fLo, fHi); + Sse2.Store(s.ToPointer() - (2 * pitch), op1); + + fLo = FilterAdd2Sub2(fLo, q6Lo, p0Lo, p1Lo, p7Lo); + fHi = FilterAdd2Sub2(fHi, q6Hi, p0Hi, p1Hi, p7Hi); + op0 = Filter16Mask(flat2, op0, fLo, fHi); + Sse2.Store(s.ToPointer() - (1 * pitch), op0); + + fLo = FilterAdd2Sub2(fLo, q7Lo, q0Lo, p0Lo, p7Lo); + fHi = FilterAdd2Sub2(fHi, q7Hi, q0Hi, p0Hi, p7Hi); + oq0 = Filter16Mask(flat2, oq0, fLo, fHi); + Sse2.Store(s.ToPointer() - (0 * pitch), oq0); + + fLo = FilterAdd2Sub2(fLo, q7Lo, q1Lo, p6Lo, q0Lo); + fHi = FilterAdd2Sub2(fHi, q7Hi, q1Hi, p6Hi, q0Hi); + oq1 = Filter16Mask(flat2, oq1, fLo, fHi); + Sse2.Store(s.ToPointer() + (1 * pitch), oq1); + + fLo = FilterAdd2Sub2(fLo, q7Lo, q2Lo, p5Lo, q1Lo); + fHi = FilterAdd2Sub2(fHi, q7Hi, q2Hi, p5Hi, q1Hi); + oq2 = Filter16Mask(flat2, oq2, fLo, fHi); + Sse2.Store(s.ToPointer() + (2 * pitch), oq2); + + fLo = FilterAdd2Sub2(fLo, q7Lo, q3Lo, p4Lo, q2Lo); + fHi = FilterAdd2Sub2(fHi, q7Hi, q3Hi, p4Hi, q2Hi); + q3 = Filter16Mask(flat2, q3, fLo, fHi); + Sse2.Store(s.ToPointer() + (3 * pitch), q3); + + fLo = FilterAdd2Sub2(fLo, q7Lo, q4Lo, p3Lo, q3Lo); + fHi = FilterAdd2Sub2(fHi, q7Hi, q4Hi, p3Hi, q3Hi); + q4 = Filter16Mask(flat2, q4, fLo, fHi); + Sse2.Store(s.ToPointer() + (4 * pitch), q4); + + fLo = FilterAdd2Sub2(fLo, q7Lo, q5Lo, p2Lo, q4Lo); + fHi = FilterAdd2Sub2(fHi, q7Hi, q5Hi, p2Hi, q4Hi); + q5 = Filter16Mask(flat2, q5, fLo, fHi); + Sse2.Store(s.ToPointer() + (5 * pitch), q5); + + fLo = FilterAdd2Sub2(fLo, q7Lo, q6Lo, p1Lo, q5Lo); + fHi = FilterAdd2Sub2(fHi, q7Hi, q6Hi, p1Hi, q5Hi); + q6 = Filter16Mask(flat2, q6, fLo, fHi); + Sse2.Store(s.ToPointer() + (6 * pitch), q6); + } + // wide flat + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + } + } + + public static unsafe void LpfHorizontal8( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + Vector128 flatOp2; + Vector128 flatOp1; + Vector128 flatOp0; + Vector128 flatOq2; + Vector128 flatOq1; + Vector128 flatOq0; + Vector128 zero = Vector128.Zero; + Vector128 blimitV, limitV, threshV; + + fixed (byte* pBLimit = blimit, pLimit = limit, pThresh = thresh) + { + blimitV = Sse2.LoadVector128(pBLimit); + limitV = Sse2.LoadVector128(pLimit); + threshV = Sse2.LoadVector128(pThresh); + } + + Vector128 mask, hev, flat; + Vector128 p3, p2, p1, p0, q0, q1, q2, q3; + Vector128 q3P3, q2P2, q1P1, q0P0, p1Q1, p0Q0; + + q3P3 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (4 * pitch))), + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (3 * pitch)))).AsByte(); + q2P2 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (3 * pitch))), + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (2 * pitch)))).AsByte(); + q1P1 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (2 * pitch))), + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (1 * pitch)))).AsByte(); + q0P0 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (1 * pitch))), + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (0 * pitch)))).AsByte(); + p1Q1 = Sse2.Shuffle(q1P1.AsInt32(), 78).AsByte(); + p0Q0 = Sse2.Shuffle(q0P0.AsInt32(), 78).AsByte(); + + { + // filter_mask and hev_mask + Vector128 one = Vector128.Create((byte)1); + Vector128 fe = Vector128.Create((byte)0xfe); + Vector128 ff = Sse2.CompareEqual(fe, fe); + Vector128 absP1Q1, absP0Q0, absQ1Q0, absP1P0, work; + absP1P0 = AbsDiff(q1P1, q0P0); + absQ1Q0 = Sse2.ShiftRightLogical128BitLane(absP1P0, 8); + + absP0Q0 = AbsDiff(q0P0, p0Q0); + absP1Q1 = AbsDiff(q1P1, p1Q1); + flat = Sse2.Max(absP1P0, absQ1Q0); + hev = Sse2.SubtractSaturate(flat, threshV); + hev = Sse2.Xor(Sse2.CompareEqual(hev, zero), ff); + + absP0Q0 = Sse2.AddSaturate(absP0Q0, absP0Q0); + absP1Q1 = Sse2.ShiftRightLogical(Sse2.And(absP1Q1, fe).AsInt16(), 1).AsByte(); + mask = Sse2.SubtractSaturate(Sse2.AddSaturate(absP0Q0, absP1Q1), blimitV); + mask = Sse2.Xor(Sse2.CompareEqual(mask, zero), ff); + // mask |= (abs(p0 - q0) * 2 + abs(p1 - q1) / 2 > blimit) * -1; + mask = Sse2.Max(absP1P0, mask); + // mask |= (abs(p1 - p0) > limit) * -1; + // mask |= (abs(q1 - q0) > limit) * -1; + + work = Sse2.Max(AbsDiff(q2P2, q1P1), AbsDiff(q3P3, q2P2)); + mask = Sse2.Max(work, mask); + mask = Sse2.Max(mask, Sse2.ShiftRightLogical128BitLane(mask, 8)); + mask = Sse2.SubtractSaturate(mask, limitV); + mask = Sse2.CompareEqual(mask, zero); + + // flat_mask4 + + flat = Sse2.Max(AbsDiff(q2P2, q0P0), AbsDiff(q3P3, q0P0)); + flat = Sse2.Max(absP1P0, flat); + flat = Sse2.Max(flat, Sse2.ShiftRightLogical128BitLane(flat, 8)); + flat = Sse2.SubtractSaturate(flat, one); + flat = Sse2.CompareEqual(flat, zero); + flat = Sse2.And(flat, mask); + } + + { + Vector128 four = Vector128.Create((short)4); + { + Vector128 workpA, workpB, workpShft; + p3 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (4 * pitch))).AsByte(), zero); + p2 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (3 * pitch))).AsByte(), zero); + p1 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (2 * pitch))).AsByte(), zero); + p0 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (1 * pitch))).AsByte(), zero); + q0 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() - (0 * pitch))).AsByte(), zero); + q1 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (1 * pitch))).AsByte(), zero); + q2 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (2 * pitch))).AsByte(), zero); + q3 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(s.ToPointer() + (3 * pitch))).AsByte(), zero); + + workpA = Sse2.Add(Sse2.Add(p3.AsInt16(), p3.AsInt16()), Sse2.Add(p2.AsInt16(), p1.AsInt16())); + workpA = Sse2.Add(Sse2.Add(workpA, four), p0.AsInt16()); + workpB = Sse2.Add(Sse2.Add(q0.AsInt16(), p2.AsInt16()), p3.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOp2, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + workpB = Sse2.Add(Sse2.Add(q0.AsInt16(), q1.AsInt16()), p1.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOp1, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + workpA = Sse2.Add(Sse2.Subtract(workpA, p3.AsInt16()), q2.AsInt16()); + workpB = Sse2.Add(Sse2.Subtract(workpB, p1.AsInt16()), p0.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOp0, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + workpA = Sse2.Add(Sse2.Subtract(workpA, p3.AsInt16()), q3.AsInt16()); + workpB = Sse2.Add(Sse2.Subtract(workpB, p0.AsInt16()), q0.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOq0, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + workpA = Sse2.Add(Sse2.Subtract(workpA, p2.AsInt16()), q3.AsInt16()); + workpB = Sse2.Add(Sse2.Subtract(workpB, q0.AsInt16()), q1.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOq1, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + workpA = Sse2.Add(Sse2.Subtract(workpA, p1.AsInt16()), q3.AsInt16()); + workpB = Sse2.Add(Sse2.Subtract(workpB, q1.AsInt16()), q2.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOq2, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + } + } + // lp filter + { + Vector128 t4 = Vector128.Create((byte)4); + Vector128 t3 = Vector128.Create((byte)3); + Vector128 t80 = Vector128.Create((byte)0x80); + Vector128 t1 = Vector128.Create((byte)0x1); + Vector128 ps1 = + Sse2.Xor(Sse2.LoadScalarVector128((long*)(s.ToPointer() - (2 * pitch))).AsByte(), + t80); + Vector128 ps0 = + Sse2.Xor(Sse2.LoadScalarVector128((long*)(s.ToPointer() - (1 * pitch))).AsByte(), + t80); + Vector128 qs0 = + Sse2.Xor(Sse2.LoadScalarVector128((long*)(s.ToPointer() + (0 * pitch))).AsByte(), + t80); + Vector128 qs1 = + Sse2.Xor(Sse2.LoadScalarVector128((long*)(s.ToPointer() + (1 * pitch))).AsByte(), + t80); + Vector128 filt; + Vector128 workA; + Vector128 filter1, filter2; + + filt = Sse2.And(Sse2.SubtractSaturate(ps1.AsSByte(), qs1.AsSByte()).AsByte(), hev); + workA = Sse2.SubtractSaturate(qs0.AsSByte(), ps0.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + // (vpx_filter + 3 * (qs0 - ps0)) & mask + filt = Sse2.And(filt, mask); + + filter1 = Sse2.AddSaturate(filt.AsSByte(), t4.AsSByte()).AsByte(); + filter2 = Sse2.AddSaturate(filt.AsSByte(), t3.AsSByte()).AsByte(); + + // Filter1 >> 3 + filter1 = Sse2.UnpackLow(zero, filter1); + filter1 = Sse2.ShiftRightArithmetic(filter1.AsInt16(), 11).AsByte(); + filter1 = Sse2.PackSignedSaturate(filter1.AsInt16(), filter1.AsInt16()).AsByte(); + + // Filter2 >> 3 + filter2 = Sse2.UnpackLow(zero, filter2); + filter2 = Sse2.ShiftRightArithmetic(filter2.AsInt16(), 11).AsByte(); + filter2 = Sse2.PackSignedSaturate(filter2.AsInt16(), zero.AsInt16()).AsByte(); + + // filt >> 1 + filt = Sse2.AddSaturate(filter1.AsSByte(), t1.AsSByte()).AsByte(); + filt = Sse2.UnpackLow(zero, filt); + filt = Sse2.ShiftRightArithmetic(filt.AsInt16(), 9).AsByte(); + filt = Sse2.PackSignedSaturate(filt.AsInt16(), zero.AsInt16()).AsByte(); + + filt = Sse2.AndNot(hev, filt); + + workA = Sse2.Xor(Sse2.SubtractSaturate(qs0.AsSByte(), filter1.AsSByte()).AsByte(), t80); + q0 = Sse2.LoadScalarVector128((long*)&flatOq0).AsByte(); + workA = Sse2.AndNot(flat, workA); + q0 = Sse2.And(flat, q0); + q0 = Sse2.Or(workA, q0); + + workA = Sse2.Xor(Sse2.SubtractSaturate(qs1.AsSByte(), filt.AsSByte()).AsByte(), t80); + q1 = Sse2.LoadScalarVector128((long*)&flatOq1).AsByte(); + workA = Sse2.AndNot(flat, workA); + q1 = Sse2.And(flat, q1); + q1 = Sse2.Or(workA, q1); + + workA = Sse2.LoadVector128(s.ToPointer() + (2 * pitch)); + q2 = Sse2.LoadScalarVector128((long*)&flatOq2).AsByte(); + workA = Sse2.AndNot(flat, workA); + q2 = Sse2.And(flat, q2); + q2 = Sse2.Or(workA, q2); + + workA = Sse2.Xor(Sse2.AddSaturate(ps0.AsSByte(), filter2.AsSByte()).AsByte(), t80); + p0 = Sse2.LoadScalarVector128((long*)&flatOp0).AsByte(); + workA = Sse2.AndNot(flat, workA); + p0 = Sse2.And(flat, p0); + p0 = Sse2.Or(workA, p0); + + workA = Sse2.Xor(Sse2.AddSaturate(ps1.AsSByte(), filt.AsSByte()).AsByte(), t80); + p1 = Sse2.LoadScalarVector128((long*)&flatOp1).AsByte(); + workA = Sse2.AndNot(flat, workA); + p1 = Sse2.And(flat, p1); + p1 = Sse2.Or(workA, p1); + + workA = Sse2.LoadVector128(s.ToPointer() - (3 * pitch)); + p2 = Sse2.LoadScalarVector128((long*)&flatOp2).AsByte(); + workA = Sse2.AndNot(flat, workA); + p2 = Sse2.And(flat, p2); + p2 = Sse2.Or(workA, p2); + + Sse2.StoreScalar((long*)(s.ToPointer() - (3 * pitch)), p2.AsInt64()); + Sse2.StoreScalar((long*)(s.ToPointer() - (2 * pitch)), p1.AsInt64()); + Sse2.StoreScalar((long*)(s.ToPointer() - (1 * pitch)), p0.AsInt64()); + Sse2.StoreScalar((long*)(s.ToPointer() + (0 * pitch)), q0.AsInt64()); + Sse2.StoreScalar((long*)(s.ToPointer() + (1 * pitch)), q1.AsInt64()); + Sse2.StoreScalar((long*)(s.ToPointer() + (2 * pitch)), q2.AsInt64()); + } + } + + public static unsafe void LpfHorizontal8Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit0, + ReadOnlySpan limit0, + ReadOnlySpan thresh0, + ReadOnlySpan blimit1, + ReadOnlySpan limit1, + ReadOnlySpan thresh1) + { + Vector128 flatOp2; + Vector128 flatOp1; + Vector128 flatOp0; + Vector128 flatOq2; + Vector128 flatOq1; + Vector128 flatOq0; + Vector128 zero = Vector128.Zero; + Vector128 blimit, limit, thresh; + + fixed (byte* pBLimit0 = blimit0, pLimit0 = limit0, pThresh0 = thresh0, + pBLimit1 = blimit1, pLimit1 = limit1, pThresh1 = thresh1) + { + blimit = Sse2.UnpackLow(Sse2.LoadVector128(pBLimit0).AsInt64(), Sse2.LoadVector128(pBLimit1).AsInt64()) + .AsByte(); + limit = Sse2.UnpackLow(Sse2.LoadVector128(pLimit0).AsInt64(), Sse2.LoadVector128(pLimit1).AsInt64()) + .AsByte(); + thresh = Sse2.UnpackLow(Sse2.LoadVector128(pThresh0).AsInt64(), Sse2.LoadVector128(pThresh1).AsInt64()) + .AsByte(); + } + + Vector128 mask, hev, flat; + Vector128 p3, p2, p1, p0, q0, q1, q2, q3; + + p3 = Sse2.LoadVector128(s.ToPointer() - (4 * pitch)); + p2 = Sse2.LoadVector128(s.ToPointer() - (3 * pitch)); + p1 = Sse2.LoadVector128(s.ToPointer() - (2 * pitch)); + p0 = Sse2.LoadVector128(s.ToPointer() - (1 * pitch)); + q0 = Sse2.LoadVector128(s.ToPointer() - (0 * pitch)); + q1 = Sse2.LoadVector128(s.ToPointer() + (1 * pitch)); + q2 = Sse2.LoadVector128(s.ToPointer() + (2 * pitch)); + q3 = Sse2.LoadVector128(s.ToPointer() + (3 * pitch)); + { + Vector128 absP1P0 = Sse2.Or(Sse2.SubtractSaturate(p1, p0), Sse2.SubtractSaturate(p0, p1)); + Vector128 absQ1Q0 = Sse2.Or(Sse2.SubtractSaturate(q1, q0), Sse2.SubtractSaturate(q0, q1)); + Vector128 one = Vector128.Create((byte)1); + Vector128 fe = Vector128.Create((byte)0xfe); + Vector128 ff = Sse2.CompareEqual(absP1P0, absP1P0); + Vector128 absP0Q0 = Sse2.Or(Sse2.SubtractSaturate(p0, q0), Sse2.SubtractSaturate(q0, p0)); + Vector128 absP1Q1 = Sse2.Or(Sse2.SubtractSaturate(p1, q1), Sse2.SubtractSaturate(q1, p1)); + Vector128 work; + + // filter_mask and hev_mask + flat = Sse2.Max(absP1P0, absQ1Q0); + hev = Sse2.SubtractSaturate(flat, thresh); + hev = Sse2.Xor(Sse2.CompareEqual(hev, zero), ff); + + absP0Q0 = Sse2.AddSaturate(absP0Q0, absP0Q0); + absP1Q1 = Sse2.ShiftRightLogical(Sse2.And(absP1Q1, fe).AsInt16(), 1).AsByte(); + mask = Sse2.SubtractSaturate(Sse2.AddSaturate(absP0Q0, absP1Q1), blimit); + mask = Sse2.Xor(Sse2.CompareEqual(mask, zero), ff); + // mask |= (abs(p0 - q0) * 2 + abs(p1 - q1) / 2 > blimit) * -1; + mask = Sse2.Max(flat, mask); + // mask |= (abs(p1 - p0) > limit) * -1; + // mask |= (abs(q1 - q0) > limit) * -1; + work = Sse2.Max( + Sse2.Or(Sse2.SubtractSaturate(p2, p1), Sse2.SubtractSaturate(p1, p2)), + Sse2.Or(Sse2.SubtractSaturate(p3, p2), Sse2.SubtractSaturate(p2, p3))); + mask = Sse2.Max(work, mask); + work = Sse2.Max( + Sse2.Or(Sse2.SubtractSaturate(q2, q1), Sse2.SubtractSaturate(q1, q2)), + Sse2.Or(Sse2.SubtractSaturate(q3, q2), Sse2.SubtractSaturate(q2, q3))); + mask = Sse2.Max(work, mask); + mask = Sse2.SubtractSaturate(mask, limit); + mask = Sse2.CompareEqual(mask, zero); + + // flat_mask4 + work = Sse2.Max( + Sse2.Or(Sse2.SubtractSaturate(p2, p0), Sse2.SubtractSaturate(p0, p2)), + Sse2.Or(Sse2.SubtractSaturate(q2, q0), Sse2.SubtractSaturate(q0, q2))); + flat = Sse2.Max(work, flat); + work = Sse2.Max( + Sse2.Or(Sse2.SubtractSaturate(p3, p0), Sse2.SubtractSaturate(p0, p3)), + Sse2.Or(Sse2.SubtractSaturate(q3, q0), Sse2.SubtractSaturate(q0, q3))); + flat = Sse2.Max(work, flat); + flat = Sse2.SubtractSaturate(flat, one); + flat = Sse2.CompareEqual(flat, zero); + flat = Sse2.And(flat, mask); + } + + { + Vector128 four = Vector128.Create((short)4); + ArrayPtr src = s; + int i = 0; + + do + { + Vector128 workpA, workpB, workpShft; + p3 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(src.ToPointer() - (4 * pitch))).AsByte(), zero); + p2 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(src.ToPointer() - (3 * pitch))).AsByte(), zero); + p1 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(src.ToPointer() - (2 * pitch))).AsByte(), zero); + p0 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(src.ToPointer() - (1 * pitch))).AsByte(), zero); + q0 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(src.ToPointer() - (0 * pitch))).AsByte(), zero); + q1 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(src.ToPointer() + (1 * pitch))).AsByte(), zero); + q2 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(src.ToPointer() + (2 * pitch))).AsByte(), zero); + q3 = Sse2.UnpackLow( + Sse2.LoadScalarVector128((long*)(src.ToPointer() + (3 * pitch))).AsByte(), zero); + + workpA = Sse2.Add(Sse2.Add(p3.AsInt16(), p3.AsInt16()), Sse2.Add(p2.AsInt16(), p1.AsInt16())); + workpA = Sse2.Add(Sse2.Add(workpA, four), p0.AsInt16()); + workpB = Sse2.Add(Sse2.Add(q0.AsInt16(), p2.AsInt16()), p3.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOp2 + i, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + workpB = Sse2.Add(Sse2.Add(q0.AsInt16(), q1.AsInt16()), p1.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOp1 + i, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + workpA = Sse2.Add(Sse2.Subtract(workpA, p3.AsInt16()), q2.AsInt16()); + workpB = Sse2.Add(Sse2.Subtract(workpB, p1.AsInt16()), p0.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOp0 + i, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + workpA = Sse2.Add(Sse2.Subtract(workpA, p3.AsInt16()), q3.AsInt16()); + workpB = Sse2.Add(Sse2.Subtract(workpB, p0.AsInt16()), q0.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOq0 + i, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + workpA = Sse2.Add(Sse2.Subtract(workpA, p2.AsInt16()), q3.AsInt16()); + workpB = Sse2.Add(Sse2.Subtract(workpB, q0.AsInt16()), q1.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOq1 + i, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + workpA = Sse2.Add(Sse2.Subtract(workpA, p1.AsInt16()), q3.AsInt16()); + workpB = Sse2.Add(Sse2.Subtract(workpB, q1.AsInt16()), q2.AsInt16()); + workpShft = Sse2.ShiftRightLogical(Sse2.Add(workpA, workpB), 3); + Sse2.StoreScalar((long*)&flatOq2 + i, Sse2.PackUnsignedSaturate(workpShft, workpShft).AsInt64()); + + src = src.Slice(8); + } while (++i < 2); + } + // lp filter + { + Vector128 t4 = Vector128.Create((byte)4); + Vector128 t3 = Vector128.Create((byte)3); + Vector128 t80 = Vector128.Create((byte)0x80); + Vector128 te0 = Vector128.Create((byte)0xe0); + Vector128 t1F = Vector128.Create((byte)0x1f); + Vector128 t1 = Vector128.Create((byte)0x1); + Vector128 t7F = Vector128.Create((byte)0x7f); + + Vector128 ps1 = Sse2.Xor(Sse2.LoadVector128(s.ToPointer() - (2 * pitch)), t80); + Vector128 ps0 = Sse2.Xor(Sse2.LoadVector128(s.ToPointer() - (1 * pitch)), t80); + Vector128 qs0 = Sse2.Xor(Sse2.LoadVector128(s.ToPointer() + (0 * pitch)), t80); + Vector128 qs1 = Sse2.Xor(Sse2.LoadVector128(s.ToPointer() + (1 * pitch)), t80); + Vector128 filt; + Vector128 workA; + Vector128 filter1, filter2; + + filt = Sse2.And(Sse2.SubtractSaturate(ps1.AsSByte(), qs1.AsSByte()).AsByte(), hev); + workA = Sse2.SubtractSaturate(qs0.AsSByte(), ps0.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + // (vpx_filter + 3 * (qs0 - ps0)) & mask + filt = Sse2.And(filt, mask); + + filter1 = Sse2.AddSaturate(filt.AsSByte(), t4.AsSByte()).AsByte(); + filter2 = Sse2.AddSaturate(filt.AsSByte(), t3.AsSByte()).AsByte(); + + // Filter1 >> 3 + workA = Sse2.CompareGreaterThan(zero.AsSByte(), filter1.AsSByte()).AsByte(); + filter1 = Sse2.ShiftRightLogical(filter1.AsInt16(), 3).AsByte(); + workA = Sse2.And(workA, te0); + filter1 = Sse2.And(filter1, t1F); + filter1 = Sse2.Or(filter1, workA); + + // Filter2 >> 3 + workA = Sse2.CompareGreaterThan(zero.AsSByte(), filter2.AsSByte()).AsByte(); + filter2 = Sse2.ShiftRightLogical(filter2.AsInt16(), 3).AsByte(); + workA = Sse2.And(workA, te0); + filter2 = Sse2.And(filter2, t1F); + filter2 = Sse2.Or(filter2, workA); + + // filt >> 1 + filt = Sse2.AddSaturate(filter1.AsSByte(), t1.AsSByte()).AsByte(); + workA = Sse2.CompareGreaterThan(zero.AsSByte(), filt.AsSByte()).AsByte(); + filt = Sse2.ShiftRightLogical(filt.AsInt16(), 1).AsByte(); + workA = Sse2.And(workA, t80); + filt = Sse2.And(filt, t7F); + filt = Sse2.Or(filt, workA); + + filt = Sse2.AndNot(hev, filt); + + workA = Sse2.Xor(Sse2.SubtractSaturate(qs0.AsSByte(), filter1.AsSByte()).AsByte(), t80); + q0 = Sse2.LoadVector128((byte*)&flatOq0); + workA = Sse2.AndNot(flat, workA); + q0 = Sse2.And(flat, q0); + q0 = Sse2.Or(workA, q0); + + workA = Sse2.Xor(Sse2.SubtractSaturate(qs1.AsSByte(), filt.AsSByte()).AsByte(), t80); + q1 = Sse2.LoadVector128((byte*)&flatOq1); + workA = Sse2.AndNot(flat, workA); + q1 = Sse2.And(flat, q1); + q1 = Sse2.Or(workA, q1); + + workA = Sse2.LoadVector128(s.ToPointer() + (2 * pitch)); + q2 = Sse2.LoadVector128((byte*)&flatOq2); + workA = Sse2.AndNot(flat, workA); + q2 = Sse2.And(flat, q2); + q2 = Sse2.Or(workA, q2); + + workA = Sse2.Xor(Sse2.AddSaturate(ps0.AsSByte(), filter2.AsSByte()).AsByte(), t80); + p0 = Sse2.LoadVector128((byte*)&flatOp0); + workA = Sse2.AndNot(flat, workA); + p0 = Sse2.And(flat, p0); + p0 = Sse2.Or(workA, p0); + + workA = Sse2.Xor(Sse2.AddSaturate(ps1.AsSByte(), filt.AsSByte()).AsByte(), t80); + p1 = Sse2.LoadVector128((byte*)&flatOp1); + workA = Sse2.AndNot(flat, workA); + p1 = Sse2.And(flat, p1); + p1 = Sse2.Or(workA, p1); + + workA = Sse2.LoadVector128(s.ToPointer() - (3 * pitch)); + p2 = Sse2.LoadVector128((byte*)&flatOp2); + workA = Sse2.AndNot(flat, workA); + p2 = Sse2.And(flat, p2); + p2 = Sse2.Or(workA, p2); + + Sse2.Store(s.ToPointer() - (3 * pitch), p2); + Sse2.Store(s.ToPointer() - (2 * pitch), p1); + Sse2.Store(s.ToPointer() - (1 * pitch), p0); + Sse2.Store(s.ToPointer() + (0 * pitch), q0); + Sse2.Store(s.ToPointer() + (1 * pitch), q1); + Sse2.Store(s.ToPointer() + (2 * pitch), q2); + } + } + + public static unsafe void LpfHorizontal4Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit0, + ReadOnlySpan limit0, + ReadOnlySpan thresh0, + ReadOnlySpan blimit1, + ReadOnlySpan limit1, + ReadOnlySpan thresh1) + { + Vector128 blimit, limit, thresh; + + fixed (byte* pBLimit0 = blimit0, pLimit0 = limit0, pThresh0 = thresh0, + pBLimit1 = blimit1, pLimit1 = limit1, pThresh1 = thresh1) + { + blimit = Sse2.UnpackLow(Sse2.LoadVector128(pBLimit0).AsInt64(), Sse2.LoadVector128(pBLimit1).AsInt64()) + .AsByte(); + limit = Sse2.UnpackLow(Sse2.LoadVector128(pLimit0).AsInt64(), Sse2.LoadVector128(pLimit1).AsInt64()) + .AsByte(); + thresh = Sse2.UnpackLow(Sse2.LoadVector128(pThresh0).AsInt64(), Sse2.LoadVector128(pThresh1).AsInt64()) + .AsByte(); + } + + Vector128 zero = Vector128.Zero; + Vector128 p3, p2, p1, p0, q0, q1, q2, q3; + Vector128 mask, hev, flat; + + p3 = Sse2.LoadVector128(s.ToPointer() - (4 * pitch)); + p2 = Sse2.LoadVector128(s.ToPointer() - (3 * pitch)); + p1 = Sse2.LoadVector128(s.ToPointer() - (2 * pitch)); + p0 = Sse2.LoadVector128(s.ToPointer() - (1 * pitch)); + q0 = Sse2.LoadVector128(s.ToPointer() - (0 * pitch)); + q1 = Sse2.LoadVector128(s.ToPointer() + (1 * pitch)); + q2 = Sse2.LoadVector128(s.ToPointer() + (2 * pitch)); + q3 = Sse2.LoadVector128(s.ToPointer() + (3 * pitch)); + + // filter_mask and hev_mask + { + Vector128 absP1P0 = Sse2.Or(Sse2.SubtractSaturate(p1, p0), Sse2.SubtractSaturate(p0, p1)); + Vector128 absQ1Q0 = Sse2.Or(Sse2.SubtractSaturate(q1, q0), Sse2.SubtractSaturate(q0, q1)); + Vector128 fe = Vector128.Create((byte)0xfe); + Vector128 ff = Sse2.CompareEqual(absP1P0, absP1P0); + Vector128 absP0Q0 = Sse2.Or(Sse2.SubtractSaturate(p0, q0), Sse2.SubtractSaturate(q0, p0)); + Vector128 absP1Q1 = Sse2.Or(Sse2.SubtractSaturate(p1, q1), Sse2.SubtractSaturate(q1, p1)); + Vector128 work; + + flat = Sse2.Max(absP1P0, absQ1Q0); + hev = Sse2.SubtractSaturate(flat, thresh); + hev = Sse2.Xor(Sse2.CompareEqual(hev, zero), ff); + + absP0Q0 = Sse2.AddSaturate(absP0Q0, absP0Q0); + absP1Q1 = Sse2.ShiftRightLogical(Sse2.And(absP1Q1, fe).AsInt16(), 1).AsByte(); + mask = Sse2.SubtractSaturate(Sse2.AddSaturate(absP0Q0, absP1Q1), blimit); + mask = Sse2.Xor(Sse2.CompareEqual(mask, zero), ff); + // mask |= (abs(p0 - q0) * 2 + abs(p1 - q1) / 2 > blimit) * -1; + mask = Sse2.Max(flat, mask); + // mask |= (abs(p1 - p0) > limit) * -1; + // mask |= (abs(q1 - q0) > limit) * -1; + work = Sse2.Max( + Sse2.Or(Sse2.SubtractSaturate(p2, p1), Sse2.SubtractSaturate(p1, p2)), + Sse2.Or(Sse2.SubtractSaturate(p3, p2), Sse2.SubtractSaturate(p2, p3))); + mask = Sse2.Max(work, mask); + work = Sse2.Max( + Sse2.Or(Sse2.SubtractSaturate(q2, q1), Sse2.SubtractSaturate(q1, q2)), + Sse2.Or(Sse2.SubtractSaturate(q3, q2), Sse2.SubtractSaturate(q2, q3))); + mask = Sse2.Max(work, mask); + mask = Sse2.SubtractSaturate(mask, limit); + mask = Sse2.CompareEqual(mask, zero); + } + + // filter4 + { + Vector128 t4 = Vector128.Create((byte)4); + Vector128 t3 = Vector128.Create((byte)3); + Vector128 t80 = Vector128.Create((byte)0x80); + Vector128 te0 = Vector128.Create((byte)0xe0); + Vector128 t1F = Vector128.Create((byte)0x1f); + Vector128 t1 = Vector128.Create((byte)0x1); + Vector128 t7F = Vector128.Create((byte)0x7f); + + Vector128 ps1 = Sse2.Xor(Sse2.LoadVector128(s.ToPointer() - (2 * pitch)), t80); + Vector128 ps0 = Sse2.Xor(Sse2.LoadVector128(s.ToPointer() - (1 * pitch)), t80); + Vector128 qs0 = Sse2.Xor(Sse2.LoadVector128(s.ToPointer() + (0 * pitch)), t80); + Vector128 qs1 = Sse2.Xor(Sse2.LoadVector128(s.ToPointer() + (1 * pitch)), t80); + Vector128 filt; + Vector128 workA; + Vector128 filter1, filter2; + + filt = Sse2.And(Sse2.SubtractSaturate(ps1.AsSByte(), qs1.AsSByte()).AsByte(), hev); + workA = Sse2.SubtractSaturate(qs0.AsSByte(), ps0.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + filt = Sse2.AddSaturate(filt.AsSByte(), workA.AsSByte()).AsByte(); + // (vpx_filter + 3 * (qs0 - ps0)) & mask + filt = Sse2.And(filt, mask); + + filter1 = Sse2.AddSaturate(filt.AsSByte(), t4.AsSByte()).AsByte(); + filter2 = Sse2.AddSaturate(filt.AsSByte(), t3.AsSByte()).AsByte(); + + // Filter1 >> 3 + workA = Sse2.CompareGreaterThan(zero.AsSByte(), filter1.AsSByte()).AsByte(); + filter1 = Sse2.ShiftRightLogical(filter1.AsInt16(), 3).AsByte(); + workA = Sse2.And(workA, te0); + filter1 = Sse2.And(filter1, t1F); + filter1 = Sse2.Or(filter1, workA); + + // Filter2 >> 3 + workA = Sse2.CompareGreaterThan(zero.AsSByte(), filter2.AsSByte()).AsByte(); + filter2 = Sse2.ShiftRightLogical(filter2.AsInt16(), 3).AsByte(); + workA = Sse2.And(workA, te0); + filter2 = Sse2.And(filter2, t1F); + filter2 = Sse2.Or(filter2, workA); + + // filt >> 1 + filt = Sse2.AddSaturate(filter1.AsSByte(), t1.AsSByte()).AsByte(); + workA = Sse2.CompareGreaterThan(zero.AsSByte(), filt.AsSByte()).AsByte(); + filt = Sse2.ShiftRightLogical(filt.AsInt16(), 1).AsByte(); + workA = Sse2.And(workA, t80); + filt = Sse2.And(filt, t7F); + filt = Sse2.Or(filt, workA); + + filt = Sse2.AndNot(hev, filt); + + q0 = Sse2.Xor(Sse2.SubtractSaturate(qs0.AsSByte(), filter1.AsSByte()).AsByte(), t80); + q1 = Sse2.Xor(Sse2.SubtractSaturate(qs1.AsSByte(), filt.AsSByte()).AsByte(), t80); + p0 = Sse2.Xor(Sse2.AddSaturate(ps0.AsSByte(), filter2.AsSByte()).AsByte(), t80); + p1 = Sse2.Xor(Sse2.AddSaturate(ps1.AsSByte(), filt.AsSByte()).AsByte(), t80); + + Sse2.Store(s.ToPointer() - (2 * pitch), p1); + Sse2.Store(s.ToPointer() - (1 * pitch), p0); + Sse2.Store(s.ToPointer() + (0 * pitch), q0); + Sse2.Store(s.ToPointer() + (1 * pitch), q1); + } + } + + private static unsafe void Transpose8X16( + ArrayPtr in0, + ArrayPtr in1, + int inP, + ArrayPtr output, + int outP) + { + Vector128 x0, x1, x2, x3, x4, x5, x6, x7; + Vector128 x8, x9, x10, x11, x12, x13, x14, x15; + + // 2-way interleave w/hoisting of unpacks + x0 = Sse2.LoadScalarVector128((long*)in0.ToPointer()).AsByte(); // 1 + x1 = Sse2.LoadScalarVector128((long*)(in0.ToPointer() + inP)).AsByte(); // 3 + x0 = Sse2.UnpackLow(x0, x1); // 1 + + x2 = Sse2.LoadScalarVector128((long*)(in0.ToPointer() + (2 * inP))).AsByte(); // 5 + x3 = Sse2.LoadScalarVector128((long*)(in0.ToPointer() + (3 * inP))).AsByte(); // 7 + x1 = Sse2.UnpackLow(x2, x3); // 2 + + x4 = Sse2.LoadScalarVector128((long*)(in0.ToPointer() + (4 * inP))).AsByte(); // 9 + x5 = Sse2.LoadScalarVector128((long*)(in0.ToPointer() + (5 * inP))).AsByte(); // 11 + x2 = Sse2.UnpackLow(x4, x5); // 3 + + x6 = Sse2.LoadScalarVector128((long*)(in0.ToPointer() + (6 * inP))).AsByte(); // 13 + x7 = Sse2.LoadScalarVector128((long*)(in0.ToPointer() + (7 * inP))).AsByte(); // 15 + x3 = Sse2.UnpackLow(x6, x7); // 4 + x4 = Sse2.UnpackLow(x0.AsInt16(), x1.AsInt16()).AsByte(); // 9 + + x8 = Sse2.LoadScalarVector128((long*)in1.ToPointer()).AsByte(); // 2 + x9 = Sse2.LoadScalarVector128((long*)(in1.ToPointer() + inP)).AsByte(); // 4 + x8 = Sse2.UnpackLow(x8, x9); // 5 + x5 = Sse2.UnpackLow(x2.AsInt16(), x3.AsInt16()).AsByte(); // 10 + + x10 = Sse2.LoadScalarVector128((long*)(in1.ToPointer() + (2 * inP))).AsByte(); // 6 + x11 = Sse2.LoadScalarVector128((long*)(in1.ToPointer() + (3 * inP))).AsByte(); // 8 + x9 = Sse2.UnpackLow(x10, x11); // 6 + + x12 = Sse2.LoadScalarVector128((long*)(in1.ToPointer() + (4 * inP))).AsByte(); // 10 + x13 = Sse2.LoadScalarVector128((long*)(in1.ToPointer() + (5 * inP))).AsByte(); // 12 + x10 = Sse2.UnpackLow(x12, x13); // 7 + x12 = Sse2.UnpackLow(x8.AsInt16(), x9.AsInt16()).AsByte(); // 11 + + x14 = Sse2.LoadScalarVector128((long*)(in1.ToPointer() + (6 * inP))).AsByte(); // 14 + x15 = Sse2.LoadScalarVector128((long*)(in1.ToPointer() + (7 * inP))).AsByte(); // 16 + x11 = Sse2.UnpackLow(x14, x15); // 8 + x13 = Sse2.UnpackLow(x10.AsInt16(), x11.AsInt16()).AsByte(); // 12 + + x6 = Sse2.UnpackLow(x4.AsInt32(), x5.AsInt32()).AsByte(); // 13 + x7 = Sse2.UnpackHigh(x4.AsInt32(), x5.AsInt32()).AsByte(); // 14 + x14 = Sse2.UnpackLow(x12.AsInt32(), x13.AsInt32()).AsByte(); // 15 + x15 = Sse2.UnpackHigh(x12.AsInt32(), x13.AsInt32()).AsByte(); // 16 + + // Store first 4-line result + Sse2.Store(output.ToPointer(), Sse2.UnpackLow(x6.AsInt64(), x14.AsInt64()).AsByte()); + Sse2.Store(output.ToPointer() + outP, Sse2.UnpackHigh(x6.AsInt64(), x14.AsInt64()).AsByte()); + Sse2.Store(output.ToPointer() + (2 * outP), Sse2.UnpackLow(x7.AsInt64(), x15.AsInt64()).AsByte()); + Sse2.Store(output.ToPointer() + (3 * outP), Sse2.UnpackHigh(x7.AsInt64(), x15.AsInt64()).AsByte()); + + x4 = Sse2.UnpackHigh(x0.AsInt16(), x1.AsInt16()).AsByte(); + x5 = Sse2.UnpackHigh(x2.AsInt16(), x3.AsInt16()).AsByte(); + x12 = Sse2.UnpackHigh(x8.AsInt16(), x9.AsInt16()).AsByte(); + x13 = Sse2.UnpackHigh(x10.AsInt16(), x11.AsInt16()).AsByte(); + + x6 = Sse2.UnpackLow(x4.AsInt32(), x5.AsInt32()).AsByte(); + x7 = Sse2.UnpackHigh(x4.AsInt32(), x5.AsInt32()).AsByte(); + x14 = Sse2.UnpackLow(x12.AsInt32(), x13.AsInt32()).AsByte(); + x15 = Sse2.UnpackHigh(x12.AsInt32(), x13.AsInt32()).AsByte(); + + // Store second 4-line result + Sse2.Store(output.ToPointer() + (4 * outP), Sse2.UnpackLow(x6.AsInt64(), x14.AsInt64()).AsByte()); + Sse2.Store(output.ToPointer() + (5 * outP), Sse2.UnpackHigh(x6.AsInt64(), x14.AsInt64()).AsByte()); + Sse2.Store(output.ToPointer() + (6 * outP), Sse2.UnpackLow(x7.AsInt64(), x15.AsInt64()).AsByte()); + Sse2.Store(output.ToPointer() + (7 * outP), Sse2.UnpackHigh(x7.AsInt64(), x15.AsInt64()).AsByte()); + } + + private static unsafe void Transpose( + ReadOnlySpan> src, + int inP, + ReadOnlySpan> dst, + int outP, + int num8X8ToTranspose) + { + int idx8X8 = 0; + Vector128 x0, x1, x2, x3, x4, x5, x6, x7; + + do + { + ArrayPtr input = src[idx8X8]; + ArrayPtr output = dst[idx8X8]; + + x0 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (0 * inP))) + .AsByte(); // 00 01 02 03 04 05 06 07 + x1 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (1 * inP))) + .AsByte(); // 10 11 12 13 14 15 16 17 + // 00 10 01 11 02 12 03 13 04 14 05 15 06 16 07 17 + x0 = Sse2.UnpackLow(x0, x1); + + x2 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (2 * inP))) + .AsByte(); // 20 21 22 23 24 25 26 27 + x3 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (3 * inP))) + .AsByte(); // 30 31 32 33 34 35 36 37 + // 20 30 21 31 22 32 23 33 24 34 25 35 26 36 27 37 + x1 = Sse2.UnpackLow(x2, x3); + + x4 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (4 * inP))) + .AsByte(); // 40 41 42 43 44 45 46 47 + x5 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (5 * inP))) + .AsByte(); // 50 51 52 53 54 55 56 57 + // 40 50 41 51 42 52 43 53 44 54 45 55 46 56 47 57 + x2 = Sse2.UnpackLow(x4, x5); + + x6 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (6 * inP))) + .AsByte(); // 60 61 62 63 64 65 66 67 + x7 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (7 * inP))) + .AsByte(); // 70 71 72 73 74 75 76 77 + // 60 70 61 71 62 72 63 73 64 74 65 75 66 76 67 77 + x3 = Sse2.UnpackLow(x6, x7); + + // 00 10 20 30 01 11 21 31 02 12 22 32 03 13 23 33 + x4 = Sse2.UnpackLow(x0.AsInt16(), x1.AsInt16()).AsByte(); + // 40 50 60 70 41 51 61 71 42 52 62 72 43 53 63 73 + x5 = Sse2.UnpackLow(x2.AsInt16(), x3.AsInt16()).AsByte(); + // 00 10 20 30 40 50 60 70 01 11 21 31 41 51 61 71 + x6 = Sse2.UnpackLow(x4.AsInt32(), x5.AsInt32()).AsByte(); + Sse2.StoreScalar((long*)(output.ToPointer() + (0 * outP)), x6.AsInt64()); // 00 10 20 30 40 50 60 70 + Sse2.StoreHigh((double*)(output.ToPointer() + (1 * outP)), x6.AsDouble()); // 01 11 21 31 41 51 61 71 + // 02 12 22 32 42 52 62 72 03 13 23 33 43 53 63 73 + x7 = Sse2.UnpackHigh(x4.AsInt32(), x5.AsInt32()).AsByte(); + Sse2.StoreScalar((long*)(output.ToPointer() + (2 * outP)), x7.AsInt64()); // 02 12 22 32 42 52 62 72 + Sse2.StoreHigh((double*)(output.ToPointer() + (3 * outP)), x7.AsDouble()); // 03 13 23 33 43 53 63 73 + + // 04 14 24 34 05 15 25 35 06 16 26 36 07 17 27 37 + x4 = Sse2.UnpackHigh(x0.AsInt16(), x1.AsInt16()).AsByte(); + // 44 54 64 74 45 55 65 75 46 56 66 76 47 57 67 77 + x5 = Sse2.UnpackHigh(x2.AsInt16(), x3.AsInt16()).AsByte(); + // 04 14 24 34 44 54 64 74 05 15 25 35 45 55 65 75 + x6 = Sse2.UnpackLow(x4.AsInt32(), x5.AsInt32()).AsByte(); + Sse2.StoreScalar((long*)(output.ToPointer() + (4 * outP)), x6.AsInt64()); // 04 14 24 34 44 54 64 74 + Sse2.StoreHigh((double*)(output.ToPointer() + (5 * outP)), x6.AsDouble()); // 05 15 25 35 45 55 65 75 + // 06 16 26 36 46 56 66 76 07 17 27 37 47 57 67 77 + x7 = Sse2.UnpackHigh(x4.AsInt32(), x5.AsInt32()).AsByte(); + + Sse2.StoreScalar((long*)(output.ToPointer() + (6 * outP)), x7.AsInt64()); // 06 16 26 36 46 56 66 76 + Sse2.StoreHigh((double*)(output.ToPointer() + (7 * outP)), x7.AsDouble()); // 07 17 27 37 47 57 67 77 + } while (++idx8X8 < num8X8ToTranspose); + } + + public static unsafe void LpfVertical4Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit0, + ReadOnlySpan limit0, + ReadOnlySpan thresh0, + ReadOnlySpan blimit1, + ReadOnlySpan limit1, + ReadOnlySpan thresh1) + { + ulong* tDstStorage = stackalloc ulong[16]; + ArrayPtr tDst = new((byte*)tDstStorage, 16 * 8); + Span> src = stackalloc ArrayPtr[2]; + Span> dst = stackalloc ArrayPtr[2]; + + // Transpose 8x16 + Transpose8X16(s.Slice(-4), s.Slice(-4 + (pitch * 8)), pitch, tDst, 16); + + // Loop filtering + LpfHorizontal4Dual(tDst.Slice(4 * 16), 16, blimit0, limit0, thresh0, blimit1, limit1, thresh1); + src[0] = tDst; + src[1] = tDst.Slice(8); + dst[0] = s.Slice(-4); + dst[1] = s.Slice(-4 + (pitch * 8)); + + // Transpose back + Transpose(src, 16, dst, pitch, 2); + } + + public static unsafe void LpfVertical8( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + ulong* tDstStorage = stackalloc ulong[8]; + ArrayPtr tDst = new((byte*)tDstStorage, 8 * 8); + Span> src = stackalloc ArrayPtr[1]; + Span> dst = stackalloc ArrayPtr[1]; + + // Transpose 8x8 + src[0] = s.Slice(-4); + dst[0] = tDst; + + Transpose(src, pitch, dst, 8, 1); + + // Loop filtering + LpfHorizontal8(tDst.Slice(4 * 8), 8, blimit, limit, thresh); + + // Transpose back + Transpose(dst, 8, src, pitch, 1); + } + + public static unsafe void LpfVertical8Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit0, + ReadOnlySpan limit0, + ReadOnlySpan thresh0, + ReadOnlySpan blimit1, + ReadOnlySpan limit1, + ReadOnlySpan thresh1) + { + ulong* tDstStorage = stackalloc ulong[16]; + ArrayPtr tDst = new((byte*)tDstStorage, 16 * 8); + Span> src = stackalloc ArrayPtr[2]; + Span> dst = stackalloc ArrayPtr[2]; + + // Transpose 8x16 + Transpose8X16(s.Slice(-4), s.Slice(-4 + (pitch * 8)), pitch, tDst, 16); + + // Loop filtering + LpfHorizontal8Dual(tDst.Slice(4 * 16), 16, blimit0, limit0, thresh0, blimit1, limit1, thresh1); + + src[0] = tDst; + src[1] = tDst.Slice(8); + + dst[0] = s.Slice(-4); + dst[1] = s.Slice(-4 + (pitch * 8)); + + // Transpose back + Transpose(src, 16, dst, pitch, 2); + } + + public static unsafe void LpfVertical16( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + ulong* tDstStorage = stackalloc ulong[16]; + ArrayPtr tDst = new((byte*)tDstStorage, 16 * 8); + Span> src = stackalloc ArrayPtr[2]; + Span> dst = stackalloc ArrayPtr[2]; + + src[0] = s.Slice(-8); + src[1] = s; + dst[0] = tDst; + dst[1] = tDst.Slice(8 * 8); + + // Transpose 16x8 + Transpose(src, pitch, dst, 8, 2); + + // Loop filtering + LpfHorizontal16(tDst.Slice(8 * 8), 8, blimit, limit, thresh); + + // Transpose back + Transpose(dst, 8, src, pitch, 2); + } + + public static unsafe void LpfVertical16Dual( + ArrayPtr s, + int pitch, + ReadOnlySpan blimit, + ReadOnlySpan limit, + ReadOnlySpan thresh) + { + Vector128* tDstStorage = stackalloc Vector128[16]; + ArrayPtr tDst = new((byte*)tDstStorage, 256); + + // Transpose 16x16 + Transpose8X16(s.Slice(-8), s.Slice(-8 + (8 * pitch)), pitch, tDst, 16); + Transpose8X16(s, s.Slice(8 * pitch), pitch, tDst.Slice(8 * 16), 16); + + // Loop filtering + LpfHorizontal16Dual(tDst.Slice(8 * 16), 16, blimit, limit, thresh); + + // Transpose back + Transpose8X16(tDst, tDst.Slice(8 * 16), 16, s.Slice(-8), pitch); + Transpose8X16(tDst.Slice(8), tDst.Slice(8 + (8 * 16)), 16, s.Slice(-8 + (8 * pitch)), pitch); + } + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Prob.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Prob.cs index 4d75b35df..dc89ecfd4 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Prob.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Prob.cs @@ -12,10 +12,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { Debug.Assert(den != 0); { - int p = (int)(((ulong)num * 256 + (den >> 1)) / den); + int p = (int)((((ulong)num * 256) + (den >> 1)) / den); // (p > 255) ? 255 : (p < 1) ? 1 : p; int clippedProb = p | ((255 - p) >> 23) | (p == 0 ? 1 : 0); - return (byte)clippedProb; } } @@ -23,14 +22,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp /* This function assumes prob1 and prob2 are already within [1,255] range. */ public static byte WeightedProb(int prob1, int prob2, int factor) { - return (byte)BitUtils.RoundPowerOfTwo(prob1 * (256 - factor) + prob2 * factor, 8); + return (byte)BitUtils.RoundPowerOfTwo((prob1 * (256 - factor)) + (prob2 * factor), 8); } // MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT; - private static readonly uint[] _countToUpdateFactor = { - 0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, - 70, 76, 83, 89, 96, 102, 108, 115, 121, 128, - }; + private static readonly uint[] _countToUpdateFactor = + [ + 0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, 70, 76, 83, 89, 96, 102, 108, 115, 121, 128 + ]; private const int ModeMvCountSat = 20; @@ -41,14 +40,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { return preProb; } - else - { - uint count = Math.Min(den, ModeMvCountSat); - uint factor = _countToUpdateFactor[(int)count]; - byte prob = GetProb(ct0, den); - return WeightedProb(preProb, prob, (int)factor); - } + uint count = Math.Min(den, ModeMvCountSat); + uint factor = _countToUpdateFactor[(int)count]; + byte prob = GetProb(ct0, den); + return WeightedProb(preProb, prob, (int)factor); } private static uint TreeMergeProbsImpl( @@ -59,15 +55,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp Span probs) { int l = tree[i]; - uint leftCount = (l <= 0) ? counts[-l] : TreeMergeProbsImpl((uint)l, tree, preProbs, counts, probs); + uint leftCount = l <= 0 ? counts[-l] : TreeMergeProbsImpl((uint)l, tree, preProbs, counts, probs); int r = tree[i + 1]; - uint rightCount = (r <= 0) ? counts[-r] : TreeMergeProbsImpl((uint)r, tree, preProbs, counts, probs); + uint rightCount = r <= 0 ? counts[-r] : TreeMergeProbsImpl((uint)r, tree, preProbs, counts, probs); probs[(int)(i >> 1)] = ModeMvMergeProbs(preProbs[(int)(i >> 1)], leftCount, rightCount); - return leftCount + rightCount; } - public static void TreeMergeProbs(sbyte[] tree, ReadOnlySpan preProbs, ReadOnlySpan counts, Span probs) + public static void TreeMergeProbs(sbyte[] tree, ReadOnlySpan preProbs, ReadOnlySpan counts, + Span probs) { TreeMergeProbsImpl(0, tree, preProbs, counts, probs); } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Reader.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Reader.cs index 60a20b43f..6b570cc60 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Reader.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/Reader.cs @@ -1,4 +1,5 @@ using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Nvdec.Vp9.Types; using System; using System.Buffers.Binary; @@ -6,18 +7,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { internal struct Reader { - private static readonly byte[] _norm = { - 0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; + private static readonly byte[] _norm = + [ + 0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ]; + private const int BdValueSize = sizeof(ulong) * 8; // This is meant to be a large, positive constant that can still be efficiently @@ -36,16 +37,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp { return true; } - else - { - _buffer = new ArrayPtr(ref buffer[0], size); - Value = 0; - Count = -8; - Range = 255; - Fill(); - return ReadBit() != 0; // Marker bit - } + _buffer = new ArrayPtr(ref buffer[0], size); + Value = 0; + Count = -8; + Range = 255; + Fill(); + return ReadBit() != 0; // Marker bit } private void Fill() @@ -114,7 +112,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // // 1 if we have tried to decode bits after the end of stream was encountered. // 0 No error. - return Count > BdValueSize && Count < LotsOfBits; + return Count is > BdValueSize and < LotsOfBits; } public int Read(int prob) @@ -124,7 +122,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp ulong bigsplit; int count; uint range; - uint split = (Range * (uint)prob + (256 - (uint)prob)) >> 8; + uint split = ((Range * (uint)prob) + (256 - (uint)prob)) >> 8; if (Count < 0) { @@ -151,6 +149,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp value <<= shift; count -= shift; } + Value = value; Count = count; Range = range; @@ -188,7 +187,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp public int ReadBool(int prob, ref ulong value, ref int count, ref uint range) { - uint split = (range * (uint)prob + (256 - (uint)prob)) >> 8; + uint split = ((range * (uint)prob) + (256 - (uint)prob)) >> 8; ulong bigsplit = (ulong)split << (BdValueSize - 8); if (count < 0) @@ -210,8 +209,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp value <<= shift; count -= shift; } + return 1; } + range = split; { int shift = _norm[range]; @@ -219,18 +220,94 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp value <<= shift; count -= shift; } + return 0; } public ArrayPtr FindEnd() { // Find the end of the coded buffer - while (Count > 8 && Count < BdValueSize) + while (Count is > 8 and < BdValueSize) { Count -= 8; _buffer = _buffer.Slice(-1); } + return _buffer; } + + private int DecodeUniform() + { + const int L = 8; + const int M = (1 << L) - 191; + int v = ReadLiteral(L - 1); + return v < M ? v : (v << 1) - M + ReadBit(); + } + + public int DecodeTermSubexp() + { + if (ReadBit() == 0) + { + return ReadLiteral(4); + } + + if (ReadBit() == 0) + { + return ReadLiteral(4) + 16; + } + + if (ReadBit() == 0) + { + return ReadLiteral(5) + 32; + } + + return DecodeUniform() + 64; + } + + public TxMode ReadTxMode() + { + TxMode txMode = (TxMode)ReadLiteral(2); + if (txMode == TxMode.Allow32X32) + { + txMode += ReadBit(); + } + + return txMode; + } + + public int ReadCoeff( + ReadOnlySpan probs, + int n, + ref ulong value, + ref int count, + ref uint range) + { + int val = 0; + for (int i = 0; i < n; ++i) + { + val = (val << 1) | ReadBool(probs[i], ref value, ref count, ref range); + } + + return val; + } + + public void DiffUpdateProb(ref byte p) + { + if (Read(Entropy.DiffUpdateProb) != 0) + { + p = (byte)DSubExp.InvRemapProb(DecodeTermSubexp(), p); + } + } + + public void UpdateMvProbs(Span p, int n) + { + for (int i = 0; i < n; ++i) + { + if (Read(EntropyMv.UpdateProb) != 0) + { + p[i] = (byte)((ReadLiteral(7) << 1) | 1); + } + } + } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/TxfmCommon.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/TxfmCommon.cs index 209f19510..175f43704 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/TxfmCommon.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Dsp/TxfmCommon.cs @@ -13,42 +13,42 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp // for (int i = 1; i < 32; ++i) // Console.WriteLine("public const short CosPi{0}_64 = {1};", i, MathF.Round(16384 * MathF.Cos(i * MathF.PI / 64))); // Note: sin(k * Pi / 64) = cos((32 - k) * Pi / 64) - public const short CosPi1_64 = 16364; - public const short CosPi2_64 = 16305; - public const short CosPi3_64 = 16207; - public const short CosPi4_64 = 16069; - public const short CosPi5_64 = 15893; - public const short CosPi6_64 = 15679; - public const short CosPi7_64 = 15426; - public const short CosPi8_64 = 15137; - public const short CosPi9_64 = 14811; - public const short CosPi10_64 = 14449; - public const short CosPi11_64 = 14053; - public const short CosPi12_64 = 13623; - public const short CosPi13_64 = 13160; - public const short CosPi14_64 = 12665; - public const short CosPi15_64 = 12140; - public const short CosPi16_64 = 11585; - public const short CosPi17_64 = 11003; - public const short CosPi18_64 = 10394; - public const short CosPi19_64 = 9760; - public const short CosPi20_64 = 9102; - public const short CosPi21_64 = 8423; - public const short CosPi22_64 = 7723; - public const short CosPi23_64 = 7005; - public const short CosPi24_64 = 6270; - public const short CosPi25_64 = 5520; - public const short CosPi26_64 = 4756; - public const short CosPi27_64 = 3981; - public const short CosPi28_64 = 3196; - public const short CosPi29_64 = 2404; - public const short CosPi30_64 = 1606; - public const short CosPi31_64 = 804; + public const short CosPi164 = 16364; + public const short CosPi264 = 16305; + public const short CosPi364 = 16207; + public const short CosPi464 = 16069; + public const short CosPi564 = 15893; + public const short CosPi664 = 15679; + public const short CosPi764 = 15426; + public const short CosPi864 = 15137; + public const short CosPi964 = 14811; + public const short CosPi1064 = 14449; + public const short CosPi1164 = 14053; + public const short CosPi1264 = 13623; + public const short CosPi1364 = 13160; + public const short CosPi1464 = 12665; + public const short CosPi1564 = 12140; + public const short CosPi1664 = 11585; + public const short CosPi1764 = 11003; + public const short CosPi1864 = 10394; + public const short CosPi1964 = 9760; + public const short CosPi2064 = 9102; + public const short CosPi2164 = 8423; + public const short CosPi2264 = 7723; + public const short CosPi2364 = 7005; + public const short CosPi2464 = 6270; + public const short CosPi2564 = 5520; + public const short CosPi2664 = 4756; + public const short CosPi2764 = 3981; + public const short CosPi2864 = 3196; + public const short CosPi2964 = 2404; + public const short CosPi3064 = 1606; + public const short CosPi3164 = 804; // 16384 * sqrt(2) * sin(kPi / 9) * 2 / 3 - public const short SinPi1_9 = 5283; - public const short SinPi2_9 = 9929; - public const short SinPi3_9 = 13377; - public const short SinPi4_9 = 15212; + public const short SinPi19 = 5283; + public const short SinPi29 = 9929; + public const short SinPi39 = 13377; + public const short SinPi49 = 15212; } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Entropy.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Entropy.cs new file mode 100644 index 000000000..736b78fc6 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Entropy.cs @@ -0,0 +1,623 @@ +using Ryujinx.Graphics.Nvdec.Vp9.Types; +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Ryujinx.Graphics.Nvdec.Vp9 +{ + internal static class Entropy + { + public const int DiffUpdateProb = 252; + + // Coefficient token alphabet + public const int ZeroToken = 0; // 0 Extra Bits 0+0 + public const int OneToken = 1; // 1 Extra Bits 0+1 + public const int TwoToken = 2; // 2 Extra Bits 0+1 + public const int ThreeToken = 3; // 3 Extra Bits 0+1 + public const int FourToken = 4; // 4 Extra Bits 0+1 + public const int Category1Token = 5; // 5-6 Extra Bits 1+1 + public const int Category2Token = 6; // 7-10 Extra Bits 2+1 + public const int Category3Token = 7; // 11-18 Extra Bits 3+1 + public const int Category4Token = 8; // 19-34 Extra Bits 4+1 + public const int Category5Token = 9; // 35-66 Extra Bits 5+1 + public const int Category6Token = 10; // 67+ Extra Bits 14+1 + public const int EobToken = 11; // EOB Extra Bits 0+0 + + public const int EntropyTokens = 12; + + public const int RefTypes = 2; // intra=0, inter=1 + + /* Middle dimension reflects the coefficient position within the transform. */ + public const int CoefBands = 6; + + /* Inside dimension is measure of nearby complexity, that reflects the energy + of nearby coefficients are nonzero. For the first coefficient (DC, unless + block type is 0), we look at the (already encoded) blocks above and to the + left of the current block. The context index is then the number (0,1,or 2) + of these blocks having nonzero coefficients. + After decoding a coefficient, the measure is determined by the size of the + most recently decoded coefficient. + Note that the intuitive meaning of this measure changes as coefficients + are decoded, e.g., prior to the first token, a zero means that my neighbors + are empty while, after the first token, because of the use of end-of-block, + a zero means we just decoded a zero and hence guarantees that a non-zero + coefficient will appear later in this block. However, this shift + in meaning is perfectly OK because our context depends also on the + coefficient band (and since zigzag positions 0, 1, and 2 are in + distinct bands). */ + + public const int CoeffContexts = 6; + + public static int BAND_COEFF_CONTEXTS(int band) + { + return band == 0 ? 3 : CoeffContexts; + } + + public const int UnconstrainedNodes = 3; + + public const int PivotNode = 2; + + public const int Cat1MinVal = 5; + public const int Cat2MinVal = 7; + public const int Cat3MinVal = 11; + public const int Cat4MinVal = 19; + public const int Cat5MinVal = 35; + public const int Cat6MinVal = 67; + + public static readonly byte[] Cat1Prob = [159]; + public static readonly byte[] Cat2Prob = [165, 145]; + public static readonly byte[] Cat3Prob = [173, 148, 140]; + public static readonly byte[] Cat4Prob = [176, 155, 140, 135]; + public static readonly byte[] Cat5Prob = [180, 157, 141, 134, 130]; + + public static readonly byte[] Cat6Prob = + [ + 254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 + ]; + + public static readonly byte[] Cat6ProbHigh12 = + [ + 255, 255, 255, 255, 254, 254, 54, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 + ]; + + public const int EobModelToken = 3; + + private static readonly byte[] _coefbandTrans8X8Plus = + [ + 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + // beyond MAXBAND_INDEX+1 all values are filled as 5 + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 + ]; + + private static readonly byte[] _coefbandTrans4X4 = [0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5]; + + public static readonly byte[][] Pareto8Full = + [ + [3, 86, 128, 6, 86, 23, 88, 29], [6, 86, 128, 11, 87, 42, 91, 52], + [9, 86, 129, 17, 88, 61, 94, 76], [12, 86, 129, 22, 88, 77, 97, 93], + [15, 87, 129, 28, 89, 93, 100, 110], [17, 87, 129, 33, 90, 105, 103, 123], + [20, 88, 130, 38, 91, 118, 106, 136], [23, 88, 130, 43, 91, 128, 108, 146], + [26, 89, 131, 48, 92, 139, 111, 156], [28, 89, 131, 53, 93, 147, 114, 163], + [31, 90, 131, 58, 94, 156, 117, 171], [34, 90, 131, 62, 94, 163, 119, 177], + [37, 90, 132, 66, 95, 171, 122, 184], [39, 90, 132, 70, 96, 177, 124, 189], + [42, 91, 132, 75, 97, 183, 127, 194], [44, 91, 132, 79, 97, 188, 129, 198], + [47, 92, 133, 83, 98, 193, 132, 202], [49, 92, 133, 86, 99, 197, 134, 205], + [52, 93, 133, 90, 100, 201, 137, 208], [54, 93, 133, 94, 100, 204, 139, 211], + [57, 94, 134, 98, 101, 208, 142, 214], [59, 94, 134, 101, 102, 211, 144, 216], + [62, 94, 135, 105, 103, 214, 146, 218], + [64, 94, 135, 108, 103, 216, 148, 220], + [66, 95, 135, 111, 104, 219, 151, 222], + [68, 95, 135, 114, 105, 221, 153, 223], + [71, 96, 136, 117, 106, 224, 155, 225], + [73, 96, 136, 120, 106, 225, 157, 226], + [76, 97, 136, 123, 107, 227, 159, 228], + [78, 97, 136, 126, 108, 229, 160, 229], + [80, 98, 137, 129, 109, 231, 162, 231], + [82, 98, 137, 131, 109, 232, 164, 232], + [84, 98, 138, 134, 110, 234, 166, 233], + [86, 98, 138, 137, 111, 235, 168, 234], + [89, 99, 138, 140, 112, 236, 170, 235], + [91, 99, 138, 142, 112, 237, 171, 235], + [93, 100, 139, 145, 113, 238, 173, 236], + [95, 100, 139, 147, 114, 239, 174, 237], + [97, 101, 140, 149, 115, 240, 176, 238], + [99, 101, 140, 151, 115, 241, 177, 238], + [101, 102, 140, 154, 116, 242, 179, 239], + [103, 102, 140, 156, 117, 242, 180, 239], + [105, 103, 141, 158, 118, 243, 182, 240], + [107, 103, 141, 160, 118, 243, 183, 240], + [109, 104, 141, 162, 119, 244, 185, 241], + [111, 104, 141, 164, 119, 244, 186, 241], + [113, 104, 142, 166, 120, 245, 187, 242], + [114, 104, 142, 168, 121, 245, 188, 242], + [116, 105, 143, 170, 122, 246, 190, 243], + [118, 105, 143, 171, 122, 246, 191, 243], + [120, 106, 143, 173, 123, 247, 192, 244], + [121, 106, 143, 175, 124, 247, 193, 244], + [123, 107, 144, 177, 125, 248, 195, 244], + [125, 107, 144, 178, 125, 248, 196, 244], + [127, 108, 145, 180, 126, 249, 197, 245], + [128, 108, 145, 181, 127, 249, 198, 245], + [130, 109, 145, 183, 128, 249, 199, 245], + [132, 109, 145, 184, 128, 249, 200, 245], + [134, 110, 146, 186, 129, 250, 201, 246], + [135, 110, 146, 187, 130, 250, 202, 246], + [137, 111, 147, 189, 131, 251, 203, 246], + [138, 111, 147, 190, 131, 251, 204, 246], + [140, 112, 147, 192, 132, 251, 205, 247], + [141, 112, 147, 193, 132, 251, 206, 247], + [143, 113, 148, 194, 133, 251, 207, 247], + [144, 113, 148, 195, 134, 251, 207, 247], + [146, 114, 149, 197, 135, 252, 208, 248], + [147, 114, 149, 198, 135, 252, 209, 248], + [149, 115, 149, 199, 136, 252, 210, 248], + [150, 115, 149, 200, 137, 252, 210, 248], + [152, 115, 150, 201, 138, 252, 211, 248], + [153, 115, 150, 202, 138, 252, 212, 248], + [155, 116, 151, 204, 139, 253, 213, 249], + [156, 116, 151, 205, 139, 253, 213, 249], + [158, 117, 151, 206, 140, 253, 214, 249], + [159, 117, 151, 207, 141, 253, 215, 249], + [161, 118, 152, 208, 142, 253, 216, 249], + [162, 118, 152, 209, 142, 253, 216, 249], + [163, 119, 153, 210, 143, 253, 217, 249], + [164, 119, 153, 211, 143, 253, 217, 249], + [166, 120, 153, 212, 144, 254, 218, 250], + [167, 120, 153, 212, 145, 254, 219, 250], + [168, 121, 154, 213, 146, 254, 220, 250], + [169, 121, 154, 214, 146, 254, 220, 250], + [171, 122, 155, 215, 147, 254, 221, 250], + [172, 122, 155, 216, 147, 254, 221, 250], + [173, 123, 155, 217, 148, 254, 222, 250], + [174, 123, 155, 217, 149, 254, 222, 250], + [176, 124, 156, 218, 150, 254, 223, 250], + [177, 124, 156, 219, 150, 254, 223, 250], + [178, 125, 157, 220, 151, 254, 224, 251], + [179, 125, 157, 220, 151, 254, 224, 251], + [180, 126, 157, 221, 152, 254, 225, 251], + [181, 126, 157, 221, 152, 254, 225, 251], + [183, 127, 158, 222, 153, 254, 226, 251], + [184, 127, 158, 223, 154, 254, 226, 251], + [185, 128, 159, 224, 155, 255, 227, 251], + [186, 128, 159, 224, 155, 255, 227, 251], + [187, 129, 160, 225, 156, 255, 228, 251], + [188, 130, 160, 225, 156, 255, 228, 251], + [189, 131, 160, 226, 157, 255, 228, 251], + [190, 131, 160, 226, 158, 255, 228, 251], + [191, 132, 161, 227, 159, 255, 229, 251], + [192, 132, 161, 227, 159, 255, 229, 251], + [193, 133, 162, 228, 160, 255, 230, 252], + [194, 133, 162, 229, 160, 255, 230, 252], + [195, 134, 163, 230, 161, 255, 231, 252], + [196, 134, 163, 230, 161, 255, 231, 252], + [197, 135, 163, 231, 162, 255, 231, 252], + [198, 135, 163, 231, 162, 255, 231, 252], + [199, 136, 164, 232, 163, 255, 232, 252], + [200, 136, 164, 232, 164, 255, 232, 252], + [201, 137, 165, 233, 165, 255, 233, 252], + [201, 137, 165, 233, 165, 255, 233, 252], + [202, 138, 166, 233, 166, 255, 233, 252], + [203, 138, 166, 233, 166, 255, 233, 252], + [204, 139, 166, 234, 167, 255, 234, 252], + [205, 139, 166, 234, 167, 255, 234, 252], + [206, 140, 167, 235, 168, 255, 235, 252], + [206, 140, 167, 235, 168, 255, 235, 252], + [207, 141, 168, 236, 169, 255, 235, 252], + [208, 141, 168, 236, 170, 255, 235, 252], + [209, 142, 169, 237, 171, 255, 236, 252], + [209, 143, 169, 237, 171, 255, 236, 252], + [210, 144, 169, 237, 172, 255, 236, 252], + [211, 144, 169, 237, 172, 255, 236, 252], + [212, 145, 170, 238, 173, 255, 237, 252], + [213, 145, 170, 238, 173, 255, 237, 252], + [214, 146, 171, 239, 174, 255, 237, 253], + [214, 146, 171, 239, 174, 255, 237, 253], + [215, 147, 172, 240, 175, 255, 238, 253], + [215, 147, 172, 240, 175, 255, 238, 253], + [216, 148, 173, 240, 176, 255, 238, 253], + [217, 148, 173, 240, 176, 255, 238, 253], + [218, 149, 173, 241, 177, 255, 239, 253], + [218, 149, 173, 241, 178, 255, 239, 253], + [219, 150, 174, 241, 179, 255, 239, 253], + [219, 151, 174, 241, 179, 255, 239, 253], + [220, 152, 175, 242, 180, 255, 240, 253], + [221, 152, 175, 242, 180, 255, 240, 253], + [222, 153, 176, 242, 181, 255, 240, 253], + [222, 153, 176, 242, 181, 255, 240, 253], + [223, 154, 177, 243, 182, 255, 240, 253], + [223, 154, 177, 243, 182, 255, 240, 253], + [224, 155, 178, 244, 183, 255, 241, 253], + [224, 155, 178, 244, 183, 255, 241, 253], + [225, 156, 178, 244, 184, 255, 241, 253], + [225, 157, 178, 244, 184, 255, 241, 253], + [226, 158, 179, 244, 185, 255, 242, 253], + [227, 158, 179, 244, 185, 255, 242, 253], + [228, 159, 180, 245, 186, 255, 242, 253], + [228, 159, 180, 245, 186, 255, 242, 253], + [229, 160, 181, 245, 187, 255, 242, 253], + [229, 160, 181, 245, 187, 255, 242, 253], + [230, 161, 182, 246, 188, 255, 243, 253], + [230, 162, 182, 246, 188, 255, 243, 253], + [231, 163, 183, 246, 189, 255, 243, 253], + [231, 163, 183, 246, 189, 255, 243, 253], + [232, 164, 184, 247, 190, 255, 243, 253], + [232, 164, 184, 247, 190, 255, 243, 253], + [233, 165, 185, 247, 191, 255, 244, 253], + [233, 165, 185, 247, 191, 255, 244, 253], + [234, 166, 185, 247, 192, 255, 244, 253], + [234, 167, 185, 247, 192, 255, 244, 253], + [235, 168, 186, 248, 193, 255, 244, 253], + [235, 168, 186, 248, 193, 255, 244, 253], + [236, 169, 187, 248, 194, 255, 244, 253], + [236, 169, 187, 248, 194, 255, 244, 253], + [236, 170, 188, 248, 195, 255, 245, 253], + [236, 170, 188, 248, 195, 255, 245, 253], + [237, 171, 189, 249, 196, 255, 245, 254], + [237, 172, 189, 249, 196, 255, 245, 254], + [238, 173, 190, 249, 197, 255, 245, 254], + [238, 173, 190, 249, 197, 255, 245, 254], + [239, 174, 191, 249, 198, 255, 245, 254], + [239, 174, 191, 249, 198, 255, 245, 254], + [240, 175, 192, 249, 199, 255, 246, 254], + [240, 176, 192, 249, 199, 255, 246, 254], + [240, 177, 193, 250, 200, 255, 246, 254], + [240, 177, 193, 250, 200, 255, 246, 254], + [241, 178, 194, 250, 201, 255, 246, 254], + [241, 178, 194, 250, 201, 255, 246, 254], + [242, 179, 195, 250, 202, 255, 246, 254], + [242, 180, 195, 250, 202, 255, 246, 254], + [242, 181, 196, 250, 203, 255, 247, 254], + [242, 181, 196, 250, 203, 255, 247, 254], + [243, 182, 197, 251, 204, 255, 247, 254], + [243, 183, 197, 251, 204, 255, 247, 254], + [244, 184, 198, 251, 205, 255, 247, 254], + [244, 184, 198, 251, 205, 255, 247, 254], + [244, 185, 199, 251, 206, 255, 247, 254], + [244, 185, 199, 251, 206, 255, 247, 254], + [245, 186, 200, 251, 207, 255, 247, 254], + [245, 187, 200, 251, 207, 255, 247, 254], + [246, 188, 201, 252, 207, 255, 248, 254], + [246, 188, 201, 252, 207, 255, 248, 254], + [246, 189, 202, 252, 208, 255, 248, 254], + [246, 190, 202, 252, 208, 255, 248, 254], + [247, 191, 203, 252, 209, 255, 248, 254], + [247, 191, 203, 252, 209, 255, 248, 254], + [247, 192, 204, 252, 210, 255, 248, 254], + [247, 193, 204, 252, 210, 255, 248, 254], + [248, 194, 205, 252, 211, 255, 248, 254], + [248, 194, 205, 252, 211, 255, 248, 254], + [248, 195, 206, 252, 212, 255, 249, 254], + [248, 196, 206, 252, 212, 255, 249, 254], + [249, 197, 207, 253, 213, 255, 249, 254], + [249, 197, 207, 253, 213, 255, 249, 254], + [249, 198, 208, 253, 214, 255, 249, 254], + [249, 199, 209, 253, 214, 255, 249, 254], + [250, 200, 210, 253, 215, 255, 249, 254], + [250, 200, 210, 253, 215, 255, 249, 254], + [250, 201, 211, 253, 215, 255, 249, 254], + [250, 202, 211, 253, 215, 255, 249, 254], + [250, 203, 212, 253, 216, 255, 249, 254], + [250, 203, 212, 253, 216, 255, 249, 254], + [251, 204, 213, 253, 217, 255, 250, 254], + [251, 205, 213, 253, 217, 255, 250, 254], + [251, 206, 214, 254, 218, 255, 250, 254], + [251, 206, 215, 254, 218, 255, 250, 254], + [252, 207, 216, 254, 219, 255, 250, 254], + [252, 208, 216, 254, 219, 255, 250, 254], + [252, 209, 217, 254, 220, 255, 250, 254], + [252, 210, 217, 254, 220, 255, 250, 254], + [252, 211, 218, 254, 221, 255, 250, 254], + [252, 212, 218, 254, 221, 255, 250, 254], + [253, 213, 219, 254, 222, 255, 250, 254], + [253, 213, 220, 254, 222, 255, 250, 254], + [253, 214, 221, 254, 223, 255, 250, 254], + [253, 215, 221, 254, 223, 255, 250, 254], + [253, 216, 222, 254, 224, 255, 251, 254], + [253, 217, 223, 254, 224, 255, 251, 254], + [253, 218, 224, 254, 225, 255, 251, 254], + [253, 219, 224, 254, 225, 255, 251, 254], + [254, 220, 225, 254, 225, 255, 251, 254], + [254, 221, 226, 254, 225, 255, 251, 254], + [254, 222, 227, 255, 226, 255, 251, 254], + [254, 223, 227, 255, 226, 255, 251, 254], + [254, 224, 228, 255, 227, 255, 251, 254], + [254, 225, 229, 255, 227, 255, 251, 254], + [254, 226, 230, 255, 228, 255, 251, 254], + [254, 227, 230, 255, 229, 255, 251, 254], + [255, 228, 231, 255, 230, 255, 251, 254], + [255, 229, 232, 255, 230, 255, 251, 254], + [255, 230, 233, 255, 231, 255, 252, 254], + [255, 231, 234, 255, 231, 255, 252, 254], + [255, 232, 235, 255, 232, 255, 252, 254], + [255, 233, 236, 255, 232, 255, 252, 254], + [255, 235, 237, 255, 233, 255, 252, 254], + [255, 236, 238, 255, 234, 255, 252, 254], + [255, 238, 240, 255, 235, 255, 252, 255], + [255, 239, 241, 255, 235, 255, 252, 254], + [255, 241, 243, 255, 236, 255, 252, 254], + [255, 243, 245, 255, 237, 255, 252, 254], + [255, 246, 247, 255, 239, 255, 253, 255] + ]; + + internal static readonly byte[] DefaultCoefProbs4X4 = + [ + // Y plane + // Intra + // Band 0 + 195, 29, 183, 84, 49, 136, 8, 42, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 31, 107, 169, 35, 99, 159, 17, 82, 140, 8, 66, 114, 2, 44, 76, 1, 19, 32, + // Band 2 + 40, 132, 201, 29, 114, 187, 13, 91, 157, 7, 75, 127, 3, 58, 95, 1, 28, 47, + // Band 3 + 69, 142, 221, 42, 122, 201, 15, 91, 159, 6, 67, 121, 1, 42, 77, 1, 17, 31, + // Band 4 + 102, 148, 228, 67, 117, 204, 17, 82, 154, 6, 59, 114, 2, 39, 75, 1, 15, 29, + // Band 5 + 156, 57, 233, 119, 57, 212, 58, 48, 163, 29, 40, 124, 12, 30, 81, 3, 12, 31, + // Inter + // Band 0 + 191, 107, 226, 124, 117, 204, 25, 99, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 29, 148, 210, 37, 126, 194, 8, 93, 157, 2, 68, 118, 1, 39, 69, 1, 17, 33, + // Band 2 + 41, 151, 213, 27, 123, 193, 3, 82, 144, 1, 58, 105, 1, 32, 60, 1, 13, 26, + // Band 3 + 59, 159, 220, 23, 126, 198, 4, 88, 151, 1, 66, 114, 1, 38, 71, 1, 18, 34, + // Band 4 + 114, 136, 232, 51, 114, 207, 11, 83, 155, 3, 56, 105, 1, 33, 65, 1, 17, 34, + // Band 5 + 149, 65, 234, 121, 57, 215, 61, 49, 166, 28, 36, 114, 12, 25, 76, 3, 16, 42, + // UV plane + // Intra + // Band 0 + 214, 49, 220, 132, 63, 188, 42, 65, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 85, 137, 221, 104, 131, 216, 49, 111, 192, 21, 87, 155, 2, 49, 87, 1, 16, 28, + // Band 2 + 89, 163, 230, 90, 137, 220, 29, 100, 183, 10, 70, 135, 2, 42, 81, 1, 17, 33, + // Band 3 + 108, 167, 237, 55, 133, 222, 15, 97, 179, 4, 72, 135, 1, 45, 85, 1, 19, 38, + // Band 4 + 124, 146, 240, 66, 124, 224, 17, 88, 175, 4, 58, 122, 1, 36, 75, 1, 18, 37, + // Band 5 + 141, 79, 241, 126, 70, 227, 66, 58, 182, 30, 44, 136, 12, 34, 96, 2, 20, 47, + // Inter + // Band 0 + 229, 99, 249, 143, 111, 235, 46, 109, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 82, 158, 236, 94, 146, 224, 25, 117, 191, 9, 87, 149, 3, 56, 99, 1, 33, 57, + // Band 2 + 83, 167, 237, 68, 145, 222, 10, 103, 177, 2, 72, 131, 1, 41, 79, 1, 20, 39, + // Band 3 + 99, 167, 239, 47, 141, 224, 10, 104, 178, 2, 73, 133, 1, 44, 85, 1, 22, 47, + // Band 4 + 127, 145, 243, 71, 129, 228, 17, 93, 177, 3, 61, 124, 1, 41, 84, 1, 21, 52, + // Band 5 + 157, 78, 244, 140, 72, 231, 69, 58, 184, 31, 44, 137, 14, 38, 105, 8, 23, 61 + ]; + + internal static readonly byte[] DefaultCoefProbs8X8 = + [ + // Y plane + // Intra + // Band 0 + 125, 34, 187, 52, 41, 133, 6, 31, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 37, 109, 153, 51, 102, 147, 23, 87, 128, 8, 67, 101, 1, 41, 63, 1, 19, 29, + // Band 2 + 31, 154, 185, 17, 127, 175, 6, 96, 145, 2, 73, 114, 1, 51, 82, 1, 28, 45, + // Band 3 + 23, 163, 200, 10, 131, 185, 2, 93, 148, 1, 67, 111, 1, 41, 69, 1, 14, 24, + // Band 4 + 29, 176, 217, 12, 145, 201, 3, 101, 156, 1, 69, 111, 1, 39, 63, 1, 14, 23, + // Band 5 + 57, 192, 233, 25, 154, 215, 6, 109, 167, 3, 78, 118, 1, 48, 69, 1, 21, 29, + // Inter + // Band 0 + 202, 105, 245, 108, 106, 216, 18, 90, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 33, 172, 219, 64, 149, 206, 14, 117, 177, 5, 90, 141, 2, 61, 95, 1, 37, 57, + // Band 2 + 33, 179, 220, 11, 140, 198, 1, 89, 148, 1, 60, 104, 1, 33, 57, 1, 12, 21, + // Band 3 + 30, 181, 221, 8, 141, 198, 1, 87, 145, 1, 58, 100, 1, 31, 55, 1, 12, 20, + // Band 4 + 32, 186, 224, 7, 142, 198, 1, 86, 143, 1, 58, 100, 1, 31, 55, 1, 12, 22, + // Band 5 + 57, 192, 227, 20, 143, 204, 3, 96, 154, 1, 68, 112, 1, 42, 69, 1, 19, 32, + // UV plane + // Intra + // Band 0 + 212, 35, 215, 113, 47, 169, 29, 48, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 74, 129, 203, 106, 120, 203, 49, 107, 178, 19, 84, 144, 4, 50, 84, 1, 15, 25, + // Band 2 + 71, 172, 217, 44, 141, 209, 15, 102, 173, 6, 76, 133, 2, 51, 89, 1, 24, 42, + // Band 3 + 64, 185, 231, 31, 148, 216, 8, 103, 175, 3, 74, 131, 1, 46, 81, 1, 18, 30, + // Band 4 + 65, 196, 235, 25, 157, 221, 5, 105, 174, 1, 67, 120, 1, 38, 69, 1, 15, 30, + // Band 5 + 65, 204, 238, 30, 156, 224, 7, 107, 177, 2, 70, 124, 1, 42, 73, 1, 18, 34, + // Inter + // Band 0 + 225, 86, 251, 144, 104, 235, 42, 99, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 85, 175, 239, 112, 165, 229, 29, 136, 200, 12, 103, 162, 6, 77, 123, 2, 53, 84, + // Band 2 + 75, 183, 239, 30, 155, 221, 3, 106, 171, 1, 74, 128, 1, 44, 76, 1, 17, 28, + // Band 3 + 73, 185, 240, 27, 159, 222, 2, 107, 172, 1, 75, 127, 1, 42, 73, 1, 17, 29, + // Band 4 + 62, 190, 238, 21, 159, 222, 2, 107, 172, 1, 72, 122, 1, 40, 71, 1, 18, 32, + // Band 5 + 61, 199, 240, 27, 161, 226, 4, 113, 180, 1, 76, 129, 1, 46, 80, 1, 23, 41 + ]; + + internal static readonly byte[] DefaultCoefProbs16X16 = + [ + // Y plane + // Intra + // Band 0 + 7, 27, 153, 5, 30, 95, 1, 16, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 50, 75, 127, 57, 75, 124, 27, 67, 108, 10, 54, 86, 1, 33, 52, 1, 12, 18, + // Band 2 + 43, 125, 151, 26, 108, 148, 7, 83, 122, 2, 59, 89, 1, 38, 60, 1, 17, 27, + // Band 3 + 23, 144, 163, 13, 112, 154, 2, 75, 117, 1, 50, 81, 1, 31, 51, 1, 14, 23, + // Band 4 + 18, 162, 185, 6, 123, 171, 1, 78, 125, 1, 51, 86, 1, 31, 54, 1, 14, 23, + // Band 5 + 15, 199, 227, 3, 150, 204, 1, 91, 146, 1, 55, 95, 1, 30, 53, 1, 11, 20, + // Inter + // Band 0 + 19, 55, 240, 19, 59, 196, 3, 52, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 41, 166, 207, 104, 153, 199, 31, 123, 181, 14, 101, 152, 5, 72, 106, 1, 36, 52, + // Band 2 + 35, 176, 211, 12, 131, 190, 2, 88, 144, 1, 60, 101, 1, 36, 60, 1, 16, 28, + // Band 3 + 28, 183, 213, 8, 134, 191, 1, 86, 142, 1, 56, 96, 1, 30, 53, 1, 12, 20, + // Band 4 + 20, 190, 215, 4, 135, 192, 1, 84, 139, 1, 53, 91, 1, 28, 49, 1, 11, 20, + // Band 5 + 13, 196, 216, 2, 137, 192, 1, 86, 143, 1, 57, 99, 1, 32, 56, 1, 13, 24, + // UV plane + // Intra + // Band 0 + 211, 29, 217, 96, 47, 156, 22, 43, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 78, 120, 193, 111, 116, 186, 46, 102, 164, 15, 80, 128, 2, 49, 76, 1, 18, 28, + // Band 2 + 71, 161, 203, 42, 132, 192, 10, 98, 150, 3, 69, 109, 1, 44, 70, 1, 18, 29, + // Band 3 + 57, 186, 211, 30, 140, 196, 4, 93, 146, 1, 62, 102, 1, 38, 65, 1, 16, 27, + // Band 4 + 47, 199, 217, 14, 145, 196, 1, 88, 142, 1, 57, 98, 1, 36, 62, 1, 15, 26, + // Band 5 + 26, 219, 229, 5, 155, 207, 1, 94, 151, 1, 60, 104, 1, 36, 62, 1, 16, 28, + // Inter + // Band 0 + 233, 29, 248, 146, 47, 220, 43, 52, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 100, 163, 232, 179, 161, 222, 63, 142, 204, 37, 113, 174, 26, 89, 137, 18, 68, 97, + // Band 2 + 85, 181, 230, 32, 146, 209, 7, 100, 164, 3, 71, 121, 1, 45, 77, 1, 18, 30, + // Band 3 + 65, 187, 230, 20, 148, 207, 2, 97, 159, 1, 68, 116, 1, 40, 70, 1, 14, 29, + // Band 4 + 40, 194, 227, 8, 147, 204, 1, 94, 155, 1, 65, 112, 1, 39, 66, 1, 14, 26, + // Band 5 + 16, 208, 228, 3, 151, 207, 1, 98, 160, 1, 67, 117, 1, 41, 74, 1, 17, 31 + ]; + + internal static readonly byte[] DefaultCoefProbs32X32 = + [ + // Y plane + // Intra + // Band 0 + 17, 38, 140, 7, 34, 80, 1, 17, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 37, 75, 128, 41, 76, 128, 26, 66, 116, 12, 52, 94, 2, 32, 55, 1, 10, 16, + // Band 2 + 50, 127, 154, 37, 109, 152, 16, 82, 121, 5, 59, 85, 1, 35, 54, 1, 13, 20, + // Band 3 + 40, 142, 167, 17, 110, 157, 2, 71, 112, 1, 44, 72, 1, 27, 45, 1, 11, 17, + // Band 4 + 30, 175, 188, 9, 124, 169, 1, 74, 116, 1, 48, 78, 1, 30, 49, 1, 11, 18, + // Band 5 + 10, 222, 223, 2, 150, 194, 1, 83, 128, 1, 48, 79, 1, 27, 45, 1, 11, 17, + // Inter + // Band 0 + 36, 41, 235, 29, 36, 193, 10, 27, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 85, 165, 222, 177, 162, 215, 110, 135, 195, 57, 113, 168, 23, 83, 120, 10, 49, 61, + // Band 2 + 85, 190, 223, 36, 139, 200, 5, 90, 146, 1, 60, 103, 1, 38, 65, 1, 18, 30, + // Band 3 + 72, 202, 223, 23, 141, 199, 2, 86, 140, 1, 56, 97, 1, 36, 61, 1, 16, 27, + // Band 4 + 55, 218, 225, 13, 145, 200, 1, 86, 141, 1, 57, 99, 1, 35, 61, 1, 13, 22, + // Band 5 + 15, 235, 212, 1, 132, 184, 1, 84, 139, 1, 57, 97, 1, 34, 56, 1, 14, 23, + // UV plane + // Intra + // Band 0 + 181, 21, 201, 61, 37, 123, 10, 38, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 47, 106, 172, 95, 104, 173, 42, 93, 159, 18, 77, 131, 4, 50, 81, 1, 17, 23, + // Band 2 + 62, 147, 199, 44, 130, 189, 28, 102, 154, 18, 75, 115, 2, 44, 65, 1, 12, 19, + // Band 3 + 55, 153, 210, 24, 130, 194, 3, 93, 146, 1, 61, 97, 1, 31, 50, 1, 10, 16, + // Band 4 + 49, 186, 223, 17, 148, 204, 1, 96, 142, 1, 53, 83, 1, 26, 44, 1, 11, 17, + // Band 5 + 13, 217, 212, 2, 136, 180, 1, 78, 124, 1, 50, 83, 1, 29, 49, 1, 14, 23, + // Inter + // Band 0 + 197, 13, 247, 82, 17, 222, 25, 17, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // Band 1 + 126, 186, 247, 234, 191, 243, 176, 177, 234, 104, 158, 220, 66, 128, 186, 55, 90, 137, + // Band 2 + 111, 197, 242, 46, 158, 219, 9, 104, 171, 2, 65, 125, 1, 44, 80, 1, 17, 91, + // Band 3 + 104, 208, 245, 39, 168, 224, 3, 109, 162, 1, 79, 124, 1, 50, 102, 1, 43, 102, + // Band 4 + 84, 220, 246, 31, 177, 231, 2, 115, 180, 1, 79, 134, 1, 55, 77, 1, 60, 79, + // Band 5 + 43, 243, 240, 8, 180, 217, 1, 115, 166, 1, 84, 121, 1, 51, 67, 1, 16, 6 + ]; + + public static byte[] GetBandTranslate(int txSize) + { + return txSize == (int)TxSize.Tx4X4 ? _coefbandTrans4X4 : _coefbandTrans8X8Plus; + } + + public static void CopyProbs(ref T dest, ReadOnlySpan probs) where T : unmanaged + { + if (Unsafe.SizeOf() != probs.Length) + { + throw new Exception("size mismatch expected: " + probs.Length + " got: " + Unsafe.SizeOf()); + } + + probs.CopyTo(MemoryMarshal.Cast(MemoryMarshal.CreateSpan(ref dest, 1))); + } + + internal const int CoefCountSat = 24; + internal const int CoefMaxUpdateFactor = 112; + internal const int CoefCountSatKey = 24; + internal const int CoefMaxUpdateFactorKey = 112; + internal const int CoefCountSatAfterKey = 24; + internal const int CoefMaxUpdateFactorAfterKey = 128; + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/EntropyMode.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/EntropyMode.cs new file mode 100644 index 000000000..624acbaa5 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/EntropyMode.cs @@ -0,0 +1,390 @@ +using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Nvdec.Vp9.Common; +using Ryujinx.Graphics.Nvdec.Vp9.Types; +using Ryujinx.Graphics.Video; +using System; + +namespace Ryujinx.Graphics.Nvdec.Vp9 +{ + internal class EntropyMode + { + public const int BlockSizeGroups = 4; + + public const int TxSizeContexts = 2; + + public static readonly byte[][][] KfYModeProb = + [ + [ + // above = dc + [137, 30, 42, 148, 151, 207, 70, 52, 91], // left = dc + [92, 45, 102, 136, 116, 180, 74, 90, 100], // left = v + [73, 32, 19, 187, 222, 215, 46, 34, 100], // left = h + [91, 30, 32, 116, 121, 186, 93, 86, 94], // left = d45 + [72, 35, 36, 149, 68, 206, 68, 63, 105], // left = d135 + [73, 31, 28, 138, 57, 124, 55, 122, 151], // left = d117 + [67, 23, 21, 140, 126, 197, 40, 37, 171], // left = d153 + [86, 27, 28, 128, 154, 212, 45, 43, 53], // left = d207 + [74, 32, 27, 107, 86, 160, 63, 134, 102], // left = d63 + [59, 67, 44, 140, 161, 202, 78, 67, 119] // left = tm + ], + [ + // above = v + [63, 36, 126, 146, 123, 158, 60, 90, 96], // left = dc + [43, 46, 168, 134, 107, 128, 69, 142, 92], // left = v + [44, 29, 68, 159, 201, 177, 50, 57, 77], // left = h + [58, 38, 76, 114, 97, 172, 78, 133, 92], // left = d45 + [46, 41, 76, 140, 63, 184, 69, 112, 57], // left = d135 + [38, 32, 85, 140, 46, 112, 54, 151, 133], // left = d117 + [39, 27, 61, 131, 110, 175, 44, 75, 136], // left = d153 + [52, 30, 74, 113, 130, 175, 51, 64, 58], // left = d207 + [47, 35, 80, 100, 74, 143, 64, 163, 74], // left = d63 + [36, 61, 116, 114, 128, 162, 80, 125, 82] // left = tm + ], + [ + // above = h + [82, 26, 26, 171, 208, 204, 44, 32, 105], // left = dc + [55, 44, 68, 166, 179, 192, 57, 57, 108], // left = v + [42, 26, 11, 199, 241, 228, 23, 15, 85], // left = h + [68, 42, 19, 131, 160, 199, 55, 52, 83], // left = d45 + [58, 50, 25, 139, 115, 232, 39, 52, 118], // left = d135 + [50, 35, 33, 153, 104, 162, 64, 59, 131], // left = d117 + [44, 24, 16, 150, 177, 202, 33, 19, 156], // left = d153 + [55, 27, 12, 153, 203, 218, 26, 27, 49], // left = d207 + [53, 49, 21, 110, 116, 168, 59, 80, 76], // left = d63 + [38, 72, 19, 168, 203, 212, 50, 50, 107] // left = tm + ], + [ + // above = d45 + [103, 26, 36, 129, 132, 201, 83, 80, 93], // left = dc + [59, 38, 83, 112, 103, 162, 98, 136, 90], // left = v + [62, 30, 23, 158, 200, 207, 59, 57, 50], // left = h + [67, 30, 29, 84, 86, 191, 102, 91, 59], // left = d45 + [60, 32, 33, 112, 71, 220, 64, 89, 104], // left = d135 + [53, 26, 34, 130, 56, 149, 84, 120, 103], // left = d117 + [53, 21, 23, 133, 109, 210, 56, 77, 172], // left = d153 + [77, 19, 29, 112, 142, 228, 55, 66, 36], // left = d207 + [61, 29, 29, 93, 97, 165, 83, 175, 162], // left = d63 + [47, 47, 43, 114, 137, 181, 100, 99, 95] // left = tm + ], + [ + // above = d135 + [69, 23, 29, 128, 83, 199, 46, 44, 101], // left = dc + [53, 40, 55, 139, 69, 183, 61, 80, 110], // left = v + [40, 29, 19, 161, 180, 207, 43, 24, 91], // left = h + [60, 34, 19, 105, 61, 198, 53, 64, 89], // left = d45 + [52, 31, 22, 158, 40, 209, 58, 62, 89], // left = d135 + [44, 31, 29, 147, 46, 158, 56, 102, 198], // left = d117 + [35, 19, 12, 135, 87, 209, 41, 45, 167], // left = d153 + [55, 25, 21, 118, 95, 215, 38, 39, 66], // left = d207 + [51, 38, 25, 113, 58, 164, 70, 93, 97], // left = d63 + [47, 54, 34, 146, 108, 203, 72, 103, 151] // left = tm + ], + [ + // above = d117 + [64, 19, 37, 156, 66, 138, 49, 95, 133], // left = dc + [46, 27, 80, 150, 55, 124, 55, 121, 135], // left = v + [36, 23, 27, 165, 149, 166, 54, 64, 118], // left = h + [53, 21, 36, 131, 63, 163, 60, 109, 81], // left = d45 + [40, 26, 35, 154, 40, 185, 51, 97, 123], // left = d135 + [35, 19, 34, 179, 19, 97, 48, 129, 124], // left = d117 + [36, 20, 26, 136, 62, 164, 33, 77, 154], // left = d153 + [45, 18, 32, 130, 90, 157, 40, 79, 91], // left = d207 + [45, 26, 28, 129, 45, 129, 49, 147, 123], // left = d63 + [38, 44, 51, 136, 74, 162, 57, 97, 121] // left = tm + ], + [ + // above = d153 + [75, 17, 22, 136, 138, 185, 32, 34, 166], // left = dc + [56, 39, 58, 133, 117, 173, 48, 53, 187], // left = v + [35, 21, 12, 161, 212, 207, 20, 23, 145], // left = h + [56, 29, 19, 117, 109, 181, 55, 68, 112], // left = d45 + [47, 29, 17, 153, 64, 220, 59, 51, 114], // left = d135 + [46, 16, 24, 136, 76, 147, 41, 64, 172], // left = d117 + [34, 17, 11, 108, 152, 187, 13, 15, 209], // left = d153 + [51, 24, 14, 115, 133, 209, 32, 26, 104], // left = d207 + [55, 30, 18, 122, 79, 179, 44, 88, 116], // left = d63 + [37, 49, 25, 129, 168, 164, 41, 54, 148] // left = tm + ], + [ + // above = d207 + [82, 22, 32, 127, 143, 213, 39, 41, 70], // left = dc + [62, 44, 61, 123, 105, 189, 48, 57, 64], // left = v + [47, 25, 17, 175, 222, 220, 24, 30, 86], // left = h + [68, 36, 17, 106, 102, 206, 59, 74, 74], // left = d45 + [57, 39, 23, 151, 68, 216, 55, 63, 58], // left = d135 + [49, 30, 35, 141, 70, 168, 82, 40, 115], // left = d117 + [51, 25, 15, 136, 129, 202, 38, 35, 139], // left = d153 + [68, 26, 16, 111, 141, 215, 29, 28, 28], // left = d207 + [59, 39, 19, 114, 75, 180, 77, 104, 42], // left = d63 + [40, 61, 26, 126, 152, 206, 61, 59, 93] // left = tm + ], + [ + // above = d63 + [78, 23, 39, 111, 117, 170, 74, 124, 94], // left = dc + [48, 34, 86, 101, 92, 146, 78, 179, 134], // left = v + [47, 22, 24, 138, 187, 178, 68, 69, 59], // left = h + [56, 25, 33, 105, 112, 187, 95, 177, 129], // left = d45 + [48, 31, 27, 114, 63, 183, 82, 116, 56], // left = d135 + [43, 28, 37, 121, 63, 123, 61, 192, 169], // left = d117 + [42, 17, 24, 109, 97, 177, 56, 76, 122], // left = d153 + [58, 18, 28, 105, 139, 182, 70, 92, 63], // left = d207 + [46, 23, 32, 74, 86, 150, 67, 183, 88], // left = d63 + [36, 38, 48, 92, 122, 165, 88, 137, 91] // left = tm + ], + [ + // above = tm + [65, 70, 60, 155, 159, 199, 61, 60, 81], // left = dc + [44, 78, 115, 132, 119, 173, 71, 112, 93], // left = v + [39, 38, 21, 184, 227, 206, 42, 32, 64], // left = h + [58, 47, 36, 124, 137, 193, 80, 82, 78], // left = d45 + [49, 50, 35, 144, 95, 205, 63, 78, 59], // left = d135 + [41, 53, 52, 148, 71, 142, 65, 128, 51], // left = d117 + [40, 36, 28, 143, 143, 202, 40, 55, 137], // left = d153 + [52, 34, 29, 129, 183, 227, 42, 35, 43], // left = d207 + [42, 44, 44, 104, 105, 164, 64, 130, 80], // left = d63 + [43, 81, 53, 140, 169, 204, 68, 84, 72] // left = tm + ] + ]; + + public static readonly byte[][] KfUvModeProb = + [ + [144, 11, 54, 157, 195, 130, 46, 58, 108], // y = dc + [118, 15, 123, 148, 131, 101, 44, 93, 131], // y = v + [113, 12, 23, 188, 226, 142, 26, 32, 125], // y = h + [120, 11, 50, 123, 163, 135, 64, 77, 103], // y = d45 + [113, 9, 36, 155, 111, 157, 32, 44, 161], // y = d135 + [116, 9, 55, 176, 76, 96, 37, 61, 149], // y = d117 + [115, 9, 28, 141, 161, 167, 21, 25, 193], // y = d153 + [120, 12, 32, 145, 195, 142, 32, 38, 86], // y = d207 + [116, 12, 64, 120, 140, 125, 49, 115, 121], // y = d63 + [102, 19, 66, 162, 182, 122, 35, 59, 128] // y = tm + ]; + + private static readonly byte[] _defaultIfYProbs = + [ + 65, 32, 18, 144, 162, 194, 41, 51, 98, // block_size < 8x8 + 132, 68, 18, 165, 217, 196, 45, 40, 78, // block_size < 16x16 + 173, 80, 19, 176, 240, 193, 64, 35, 46, // block_size < 32x32 + 221, 135, 38, 194, 248, 121, 96, 85, 29 // block_size >= 32x32 + ]; + + private static readonly byte[] _defaultIfUvProbs = + [ + 120, 7, 76, 176, 208, 126, 28, 54, 103, // y = dc + 48, 12, 154, 155, 139, 90, 34, 117, 119, // y = v + 67, 6, 25, 204, 243, 158, 13, 21, 96, // y = h + 97, 5, 44, 131, 176, 139, 48, 68, 97, // y = d45 + 83, 5, 42, 156, 111, 152, 26, 49, 152, // y = d135 + 80, 5, 58, 178, 74, 83, 33, 62, 145, // y = d117 + 86, 5, 32, 154, 192, 168, 14, 22, 163, // y = d153 + 85, 5, 32, 156, 216, 148, 19, 29, 73, // y = d207 + 77, 7, 64, 116, 132, 122, 37, 126, 120, // y = d63 + 101, 21, 107, 181, 192, 103, 19, 67, 125 // y = tm + ]; + + private static readonly byte[] _defaultPartitionProbs = + [ + // 8x8 . 4x4 + 199, 122, 141, // a/l both not split + 147, 63, 159, // a split, l not split + 148, 133, 118, // l split, a not split + 121, 104, 114, // a/l both split + // 16x16 . 8x8 + 174, 73, 87, // a/l both not split + 92, 41, 83, // a split, l not split + 82, 99, 50, // l split, a not split + 53, 39, 39, // a/l both split + // 32x32 . 16x16 + 177, 58, 59, // a/l both not split + 68, 26, 63, // a split, l not split + 52, 79, 25, // l split, a not split + 17, 14, 12, // a/l both split + // 64x64 . 32x32 + 222, 34, 30, // a/l both not split + 72, 16, 44, // a split, l not split + 58, 32, 12, // l split, a not split + 10, 7, 6 // a/l both split + ]; + + private static readonly byte[] _defaultInterModeProbs = + [ + 2, 173, 34, // 0 = both zero mv + 7, 145, 85, // 1 = one zero mv + one a predicted mv + 7, 166, 63, // 2 = two predicted mvs + 7, 94, 66, // 3 = one predicted/zero and one new mv + 8, 64, 46, // 4 = two new mvs + 17, 81, 31, // 5 = one intra neighbour + x + 25, 29, 30 // 6 = two intra neighbours + ]; + + /* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */ + public static readonly sbyte[] IntraModeTree = + [ + -(int)PredictionMode.DcPred, 2, /* 0 = DC_NODE */ -(int)PredictionMode.TmPred, 4, /* 1 = TM_NODE */ + -(int)PredictionMode.VPred, 6, /* 2 = V_NODE */ 8, 12, /* 3 = COM_NODE */ -(int)PredictionMode.HPred, + 10, /* 4 = H_NODE */ -(int)PredictionMode.D135Pred, -(int)PredictionMode.D117Pred, /* 5 = D135_NODE */ + -(int)PredictionMode.D45Pred, 14, /* 6 = D45_NODE */ -(int)PredictionMode.D63Pred, + 16, /* 7 = D63_NODE */ -(int)PredictionMode.D153Pred, -(int)PredictionMode.D207Pred /* 8 = D153_NODE */ + ]; + + public static readonly sbyte[] InterModeTree = + [ + -((int)PredictionMode.ZeroMv - (int)PredictionMode.NearestMv), 2, + -((int)PredictionMode.NearestMv - (int)PredictionMode.NearestMv), 4, + -((int)PredictionMode.NearMv - (int)PredictionMode.NearestMv), + -((int)PredictionMode.NewMv - (int)PredictionMode.NearestMv) + ]; + + public static readonly sbyte[] PartitionTree = + [ + -(sbyte)PartitionType.PartitionNone, 2, -(sbyte)PartitionType.PartitionHorz, 4, + -(sbyte)PartitionType.PartitionVert, -(sbyte)PartitionType.PartitionSplit + ]; + + public static readonly sbyte[] SwitchableInterpTree = + [ + -Constants.EightTap, 2, -Constants.EightTapSmooth, -Constants.EightTapSharp + ]; + + private static readonly byte[] _defaultIntraInterP = [9, 102, 187, 225]; + private static readonly byte[] _defaultCompInterP = [239, 183, 119, 96, 41]; + private static readonly byte[] _defaultCompRefP = [50, 126, 123, 221, 226]; + private static readonly byte[] _defaultSingleRefP = [33, 16, 77, 74, 142, 142, 172, 170, 238, 247]; + private static readonly byte[] _defaultTxProbs = [3, 136, 37, 5, 52, 13, 20, 152, 15, 101, 100, 66]; + + //static EntropyMode() + //{ + // byte[][] kfPartitionProbs = + // [ + // // 8x8 . 4x4 + // [158, 97, 94], // a/l both not split + // [93, 24, 99], // a split, l not split + // [85, 119, 44], // l split, a not split + // [62, 59, 67], // a/l both split + + // // 16x16 . 8x8 + // [149, 53, 53], // a/l both not split + // [94, 20, 48], // a split, l not split + // [83, 53, 24], // l split, a not split + // [52, 18, 18], // a/l both split + + // // 32x32 . 16x16 + // [150, 40, 39], // a/l both not split + // [78, 12, 26], // a split, l not split + // [67, 33, 11], // l split, a not split + // [24, 7, 5], // a/l both split + + // // 64x64 . 32x32 + // [174, 35, 49], // a/l both not split + // [68, 11, 27], // a split, l not split + // [57, 15, 9], // l split, a not split + // [12, 3, 3] // a/l both split + // ]; + //} + + private static readonly byte[] _defaultSkipProbs = [192, 128, 64]; + + private static readonly byte[] _defaultSwitchableInterpProb = [235, 162, 36, 255, 34, 3, 149, 144]; + + private static void InitModeProbs(ref Vp9EntropyProbs fc) + { + Entropy.CopyProbs(ref fc.UvModeProb, _defaultIfUvProbs); + Entropy.CopyProbs(ref fc.YModeProb, _defaultIfYProbs); + Entropy.CopyProbs(ref fc.SwitchableInterpProb, _defaultSwitchableInterpProb); + Entropy.CopyProbs(ref fc.PartitionProb, _defaultPartitionProbs); + Entropy.CopyProbs(ref fc.IntraInterProb, _defaultIntraInterP); + Entropy.CopyProbs(ref fc.CompInterProb, _defaultCompInterP); + Entropy.CopyProbs(ref fc.CompRefProb, _defaultCompRefP); + Entropy.CopyProbs(ref fc.SingleRefProb, _defaultSingleRefP); + Entropy.CopyProbs(ref fc.Tx32x32Prob, _defaultTxProbs.AsSpan()[..6]); + Entropy.CopyProbs(ref fc.Tx16x16Prob, _defaultTxProbs.AsSpan().Slice(6, 4)); + Entropy.CopyProbs(ref fc.Tx8x8Prob, _defaultTxProbs.AsSpan().Slice(10, 2)); + Entropy.CopyProbs(ref fc.SkipProb, _defaultSkipProbs); + Entropy.CopyProbs(ref fc.InterModeProb, _defaultInterModeProbs); + } + + internal static void TxCountsToBranchCounts32X32(ReadOnlySpan txCount32X32P, + ref Array3> ct32X32P) + { + ct32X32P[0][0] = txCount32X32P[(int)TxSize.Tx4X4]; + ct32X32P[0][1] = txCount32X32P[(int)TxSize.Tx8X8] + txCount32X32P[(int)TxSize.Tx16X16] + + txCount32X32P[(int)TxSize.Tx32X32]; + ct32X32P[1][0] = txCount32X32P[(int)TxSize.Tx8X8]; + ct32X32P[1][1] = txCount32X32P[(int)TxSize.Tx16X16] + txCount32X32P[(int)TxSize.Tx32X32]; + ct32X32P[2][0] = txCount32X32P[(int)TxSize.Tx16X16]; + ct32X32P[2][1] = txCount32X32P[(int)TxSize.Tx32X32]; + } + + internal static void TxCountsToBranchCounts16X16(ReadOnlySpan txCount16X16P, + ref Array2> ct16X16P) + { + ct16X16P[0][0] = txCount16X16P[(int)TxSize.Tx4X4]; + ct16X16P[0][1] = txCount16X16P[(int)TxSize.Tx8X8] + txCount16X16P[(int)TxSize.Tx16X16]; + ct16X16P[1][0] = txCount16X16P[(int)TxSize.Tx8X8]; + ct16X16P[1][1] = txCount16X16P[(int)TxSize.Tx16X16]; + } + + internal static void TxCountsToBranchCounts8X8(ReadOnlySpan txCount8X8P, + ref Array1> ct8X8P) + { + ct8X8P[0][0] = txCount8X8P[(int)TxSize.Tx4X4]; + ct8X8P[0][1] = txCount8X8P[(int)TxSize.Tx8X8]; + } + + public static unsafe void SetupPastIndependence(ref Vp9Common cm) + { + // Reset the segment feature data to the default stats: + // Features disabled, 0, with delta coding (Default state). + ref Types.LoopFilter lf = ref cm.Lf; + + cm.Seg.ClearAllSegFeatures(); + cm.Seg.AbsDelta = Segmentation.SegmentDeltadata; + + if (!cm.LastFrameSegMap.IsNull) + { + MemoryUtil.Fill(cm.LastFrameSegMap.ToPointer(), (byte)0, cm.MiRows * cm.MiCols); + } + + if (!cm.CurrentFrameSegMap.IsNull) + { + MemoryUtil.Fill(cm.CurrentFrameSegMap.ToPointer(), (byte)0, cm.MiRows * cm.MiCols); + } + + // Reset the mode ref deltas for loop filter + lf.LastRefDeltas = new Array4(); + lf.LastModeDeltas = new Array2(); + lf.SetDefaultLfDeltas(); + + // To force update of the sharpness + lf.LastSharpnessLevel = -1; + + cm.DefaultCoefProbs(); + InitModeProbs(ref cm.Fc.Value); + cm.InitMvProbs(); + + if (cm.FrameType == FrameType.KeyFrame || cm.ErrorResilientMode != 0 || cm.ResetFrameContext == 3) + { + // Reset all frame contexts. + for (int i = 0; i < Constants.FrameContexts; ++i) + { + cm.FrameContexts[i] = cm.Fc.Value; + } + } + else if (cm.ResetFrameContext == 2) + { + // Reset only the frame context specified in the frame header. + cm.FrameContexts[(int)cm.FrameContextIdx] = cm.Fc.Value; + } + + // prev_mip will only be allocated in encoder. + if (cm.FrameIsIntraOnly() && !cm.PrevMip.IsNull) + { + cm.PrevMi.Value = new ModeInfo(); + } + + cm.RefFrameSignBias = new Array4(); + + cm.FrameContextIdx = 0; + } + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/EntropyMv.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/EntropyMv.cs new file mode 100644 index 000000000..511460a19 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/EntropyMv.cs @@ -0,0 +1,164 @@ +using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Nvdec.Vp9.Types; +using Ryujinx.Graphics.Video; +using System.Diagnostics; + +namespace Ryujinx.Graphics.Nvdec.Vp9 +{ + internal static class EntropyMv + { + public const int UpdateProb = 252; + + /* Symbols for coding which components are zero jointly */ + public const int Joints = 4; + + public static readonly sbyte[] JointTree = + [ + -(sbyte)MvJointType.Zero, 2, -(sbyte)MvJointType.Hnzvz, 4, + -(sbyte)MvJointType.Hzvnz, -(sbyte)MvJointType.Hnzvnz + ]; + + public static readonly sbyte[] ClassTree = + [ + -(sbyte)MvClassType.Class0, 2, -(sbyte)MvClassType.Class1, 4, 6, 8, -(sbyte)MvClassType.Class2, + -(sbyte)MvClassType.Class3, 10, 12, -(sbyte)MvClassType.Class4, -(sbyte)MvClassType.Class5, + -(sbyte)MvClassType.Class6, 14, 16, 18, -(sbyte)MvClassType.Class7, -(sbyte)MvClassType.Class8, + -(sbyte)MvClassType.Class9, -(sbyte)MvClassType.Class10 + ]; + + public static readonly sbyte[] Class0Tree = [-0, -1]; + + public static readonly sbyte[] FpTree = [-0, 2, -1, 4, -2, -3]; + + private static bool JointVertical(MvJointType type) + { + return type is MvJointType.Hzvnz or MvJointType.Hnzvnz; + } + + private static bool JointHorizontal(MvJointType type) + { + return type is MvJointType.Hnzvz or MvJointType.Hnzvnz; + } + + private static readonly byte[] _logInBase2 = + [ + 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 10 + ]; + + private static int ClassBase(MvClassType c) + { + return c != 0 ? Class0Size << ((int)c + 2) : 0; + } + + private static MvClassType GetClass(int z, Ptr offset) + { + MvClassType c = z >= Class0Size * 4096 + ? MvClassType.Class10 + : (MvClassType)_logInBase2[z >> 3]; + if (!offset.IsNull) + { + offset.Value = z - ClassBase(c); + } + + return c; + } + + private static void IncComponent(int v, ref Vp9BackwardUpdates compCounts, int compIndex, int incr, int usehp) + { + int o = 0; + Debug.Assert(v != 0); /* should not be zero */ + int s = v < 0 ? 1 : 0; + compCounts.Sign[compIndex][s] += (uint)incr; + int z = (s != 0 ? -v : v) - 1 /* magnitude - 1 */; + + int c = (int)GetClass(z, new Ptr(ref o)); + compCounts.Classes[compIndex][c] += (uint)incr; + + int d = o >> 3 /* int mv data */; + int f = (o >> 1) & 3 /* fractional pel mv data */; + int e = o & 1 /* high precision mv data */; + + if (c == (int)MvClassType.Class0) + { + compCounts.Class0[compIndex][d] += (uint)incr; + compCounts.Class0Fp[compIndex][d][f] += (uint)incr; + compCounts.Class0Hp[compIndex][e] += (uint)(usehp * incr); + } + else + { + int b = c + Class0Bits - 1; // number of bits + for (int i = 0; i < b; ++i) + { + compCounts.Bits[compIndex][i][(d >> i) & 1] += (uint)incr; + } + + compCounts.Fp[compIndex][f] += (uint)incr; + compCounts.Hp[compIndex][e] += (uint)(usehp * incr); + } + } + + public static void Inc(ref Mv mv, Ptr counts) + { + if (!counts.IsNull) + { + MvJointType j = mv.GetJoint(); + ++counts.Value.Joints[(int)j]; + + if (JointVertical(j)) + { + IncComponent(mv.Row, ref counts.Value, 0, 1, 1); + } + + if (JointHorizontal(j)) + { + IncComponent(mv.Col, ref counts.Value, 1, 1, 1); + } + } + } + + /* Symbols for coding magnitude class of nonzero components */ + public const int Classes = 11; + + public const int Class0Bits = 1; /* bits at integer precision for class 0 */ + public const int Class0Size = 1 << Class0Bits; + public const int OffsetBits = Classes + Class0Bits - 2; + public const int FpSize = 4; + + public const int MaxBits = Classes + Class0Bits + 2; + public const int Max = (1 << MaxBits) - 1; + public const int Vals = (Max << 1) + 1; + + public const int InUseBits = 14; + public const int Upp = (1 << InUseBits) - 1; + public const int Low = -(1 << InUseBits); + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/FrameBuffers.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/FrameBuffers.cs new file mode 100644 index 000000000..ac28735ec --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/FrameBuffers.cs @@ -0,0 +1,78 @@ +using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Nvdec.Vp9.Common; +using Ryujinx.Graphics.Nvdec.Vp9.Types; + +namespace Ryujinx.Graphics.Nvdec.Vp9 +{ + internal struct InternalFrameBuffer + { + public ArrayPtr Data; + public bool InUse; + } + + internal struct InternalFrameBufferList + { + public ArrayPtr IntFb; + } + + internal static class FrameBuffers + { + public static int GetFrameBuffer(MemoryAllocator allocator, Ptr cbPriv, ulong minSize, + ref VpxCodecFrameBuffer fb) + { + int i; + if (cbPriv.IsNull) + { + return -1; + } + + // Find a free frame buffer. + for (i = 0; i < cbPriv.Value.IntFb.Length; ++i) + { + if (!cbPriv.Value.IntFb[i].InUse) + { + break; + } + } + + if (i == cbPriv.Value.IntFb.Length) + { + return -1; + } + + if ((ulong)cbPriv.Value.IntFb[i].Data.Length < minSize) + { + if (!cbPriv.Value.IntFb[i].Data.IsNull) + { + allocator.Free(cbPriv.Value.IntFb[i].Data); + } + + // The data must be zeroed to fix a valgrind error from the C loop filter + // due to access uninitialized memory in frame border. It could be + // skipped if border were totally removed. + cbPriv.Value.IntFb[i].Data = allocator.Allocate((int)minSize); + if (cbPriv.Value.IntFb[i].Data.IsNull) + { + return -1; + } + } + + fb.Data = cbPriv.Value.IntFb[i].Data; + cbPriv.Value.IntFb[i].InUse = true; + + // Set the frame buffer's private data to point at the internal frame buffer. + fb.Priv = new Ptr(ref cbPriv.Value.IntFb[i]); + return 0; + } + + public static int ReleaseFrameBuffer(Ptr cbPriv, ref VpxCodecFrameBuffer fb) + { + if (!fb.Priv.IsNull) + { + fb.Priv.Value.InUse = false; + } + + return 0; + } + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Idct.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Idct.cs index ebebf0ef9..2796a56e9 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Idct.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Idct.cs @@ -8,11 +8,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 internal static class Idct { private delegate void Transform1D(ReadOnlySpan input, Span output); + private delegate void HighbdTransform1D(ReadOnlySpan input, Span output, int bd); - private struct Transform2D + private readonly struct Transform2D { - public Transform1D Cols, Rows; // Vertical and horizontal + public readonly Transform1D Cols; // Vertical and horizontal + public readonly Transform1D Rows; // Vertical and horizontal public Transform2D(Transform1D cols, Transform1D rows) { @@ -21,9 +23,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } - private struct HighbdTransform2D + private readonly struct HighbdTransform2D { - public HighbdTransform1D Cols, Rows; // Vertical and horizontal + public readonly HighbdTransform1D Cols; // Vertical and horizontal + public readonly HighbdTransform1D Rows; // Vertical and horizontal public HighbdTransform2D(HighbdTransform1D cols, HighbdTransform1D rows) { @@ -32,23 +35,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } - private static readonly Transform2D[] _iht4 = { + private static readonly Transform2D[] _iht4 = + [ new(Idct4, Idct4), // DCT_DCT = 0 new(Iadst4, Idct4), // ADST_DCT = 1 new(Idct4, Iadst4), // DCT_ADST = 2 - new(Iadst4, Iadst4), // ADST_ADST = 3 - }; + new(Iadst4, Iadst4) // ADST_ADST = 3 + ]; - public static void Iht4x416Add(ReadOnlySpan input, Span dest, int stride, int txType) + public static void Iht4X416Add(ReadOnlySpan input, Span dest, int stride, int txType) { - int i, j; Span output = stackalloc int[4 * 4]; Span outptr = output; Span tempIn = stackalloc int[4]; Span tempOut = stackalloc int[4]; // Inverse transform row vectors - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { _iht4[txType].Rows(input, outptr); input = input[4..]; @@ -56,31 +59,32 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } // Inverse transform column vectors - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { - for (j = 0; j < 4; ++j) + for (int j = 0; j < 4; ++j) { - tempIn[j] = output[j * 4 + i]; + tempIn[j] = output[(j * 4) + i]; } _iht4[txType].Cols(tempIn, tempOut); - for (j = 0; j < 4; ++j) + for (int j = 0; j < 4; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 4)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 4)); } } } - private static readonly Transform2D[] _iht8 = { + private static readonly Transform2D[] _iht8 = + [ new(Idct8, Idct8), // DCT_DCT = 0 new(Iadst8, Idct8), // ADST_DCT = 1 new(Idct8, Iadst8), // DCT_ADST = 2 - new(Iadst8, Iadst8), // ADST_ADST = 3 - }; + new(Iadst8, Iadst8) // ADST_ADST = 3 + ]; - public static void Iht8x864Add(ReadOnlySpan input, Span dest, int stride, int txType) + public static void Iht8X864Add(ReadOnlySpan input, Span dest, int stride, int txType) { - int i, j; Span output = stackalloc int[8 * 8]; Span outptr = output; Span tempIn = stackalloc int[8]; @@ -88,7 +92,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 Transform2D ht = _iht8[txType]; // Inverse transform row vectors - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { ht.Rows(input, outptr); input = input[8..]; @@ -96,31 +100,32 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } // Inverse transform column vectors - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - tempIn[j] = output[j * 8 + i]; + tempIn[j] = output[(j * 8) + i]; } ht.Cols(tempIn, tempOut); - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 5)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 5)); } } } - private static readonly Transform2D[] _iht16 = { + private static readonly Transform2D[] _iht16 = + [ new(Idct16, Idct16), // DCT_DCT = 0 new(Iadst16, Idct16), // ADST_DCT = 1 new(Idct16, Iadst16), // DCT_ADST = 2 - new(Iadst16, Iadst16), // ADST_ADST = 3 - }; + new(Iadst16, Iadst16) // ADST_ADST = 3 + ]; - public static void Iht16x16256Add(ReadOnlySpan input, Span dest, int stride, int txType) + public static void Iht16X16256Add(ReadOnlySpan input, Span dest, int stride, int txType) { - int i, j; Span output = stackalloc int[16 * 16]; Span outptr = output; Span tempIn = stackalloc int[16]; @@ -128,7 +133,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 Transform2D ht = _iht16[txType]; // Rows - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { ht.Rows(input, outptr); input = input[16..]; @@ -136,47 +141,48 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } // Columns - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - tempIn[j] = output[j * 16 + i]; + tempIn[j] = output[(j * 16) + i]; } ht.Cols(tempIn, tempOut); - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - dest[j * stride + i] = ClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); + dest[(j * stride) + i] = + ClipPixelAdd(dest[(j * stride) + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6)); } } } // Idct - public static void Idct4x4Add(ReadOnlySpan input, Span dest, int stride, int eob) + public static void Idct4X4Add(ReadOnlySpan input, Span dest, int stride, int eob) { if (eob > 1) { - Idct4x416Add(input, dest, stride); + Idct4X416Add(input, dest, stride); } else { - Idct4x41Add(input, dest, stride); + Idct4X41Add(input, dest, stride); } } - public static void Iwht4x4Add(ReadOnlySpan input, Span dest, int stride, int eob) + public static void Iwht4X4Add(ReadOnlySpan input, Span dest, int stride, int eob) { if (eob > 1) { - Iwht4x416Add(input, dest, stride); + Iwht4X416Add(input, dest, stride); } else { - Iwht4x41Add(input, dest, stride); + Iwht4X41Add(input, dest, stride); } } - public static void Idct8x8Add(ReadOnlySpan input, Span dest, int stride, int eob) + public static void Idct8X8Add(ReadOnlySpan input, Span dest, int stride, int eob) { // If dc is 1, then input[0] is the reconstructed value, do not need // dequantization. Also, when dc is 1, dc is counted in eobs, namely eobs >=1. @@ -186,117 +192,117 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (eob == 1) { // DC only DCT coefficient - Idct8x81Add(input, dest, stride); + Idct8X81Add(input, dest, stride); } else if (eob <= 12) { - Idct8x812Add(input, dest, stride); + Idct8X812Add(input, dest, stride); } else { - Idct8x864Add(input, dest, stride); + Idct8X864Add(input, dest, stride); } } - public static void Idct16x16Add(ReadOnlySpan input, Span dest, int stride, int eob) + public static void Idct16X16Add(ReadOnlySpan input, Span dest, int stride, int eob) { /* The calculation can be simplified if there are not many non-zero dct * coefficients. Use eobs to separate different cases. */ if (eob == 1) /* DC only DCT coefficient. */ { - Idct16x161Add(input, dest, stride); + Idct16X161Add(input, dest, stride); } else if (eob <= 10) { - Idct16x1610Add(input, dest, stride); + Idct16X1610Add(input, dest, stride); } else if (eob <= 38) { - Idct16x1638Add(input, dest, stride); + Idct16X1638Add(input, dest, stride); } else { - Idct16x16256Add(input, dest, stride); + Idct16X16256Add(input, dest, stride); } } - public static void Idct32x32Add(ReadOnlySpan input, Span dest, int stride, int eob) + public static void Idct32X32Add(ReadOnlySpan input, Span dest, int stride, int eob) { if (eob == 1) { - Idct32x321Add(input, dest, stride); + Idct32X321Add(input, dest, stride); } else if (eob <= 34) { // Non-zero coeff only in upper-left 8x8 - Idct32x3234Add(input, dest, stride); + Idct32X3234Add(input, dest, stride); } else if (eob <= 135) { // Non-zero coeff only in upper-left 16x16 - Idct32x32135Add(input, dest, stride); + Idct32X32135Add(input, dest, stride); } else { - Idct32x321024Add(input, dest, stride); + Idct32X321024Add(input, dest, stride); } } // Iht - public static void Iht4x4Add(TxType txType, ReadOnlySpan input, Span dest, int stride, int eob) + public static void Iht4X4Add(TxType txType, ReadOnlySpan input, Span dest, int stride, int eob) { if (txType == TxType.DctDct) { - Idct4x4Add(input, dest, stride, eob); + Idct4X4Add(input, dest, stride, eob); } else { - Iht4x416Add(input, dest, stride, (int)txType); + Iht4X416Add(input, dest, stride, (int)txType); } } - public static void Iht8x8Add(TxType txType, ReadOnlySpan input, Span dest, int stride, int eob) + public static void Iht8X8Add(TxType txType, ReadOnlySpan input, Span dest, int stride, int eob) { if (txType == TxType.DctDct) { - Idct8x8Add(input, dest, stride, eob); + Idct8X8Add(input, dest, stride, eob); } else { - Iht8x864Add(input, dest, stride, (int)txType); + Iht8X864Add(input, dest, stride, (int)txType); } } - public static void Iht16x16Add(TxType txType, ReadOnlySpan input, Span dest, - int stride, int eob) + public static void Iht16X16Add(TxType txType, ReadOnlySpan input, Span dest, + int stride, int eob) { if (txType == TxType.DctDct) { - Idct16x16Add(input, dest, stride, eob); + Idct16X16Add(input, dest, stride, eob); } else { - Iht16x16256Add(input, dest, stride, (int)txType); + Iht16X16256Add(input, dest, stride, (int)txType); } } - private static readonly HighbdTransform2D[] _highbdIht4 = { + private static readonly HighbdTransform2D[] _highbdIht4 = + [ new(HighbdIdct4, HighbdIdct4), // DCT_DCT = 0 new(HighbdIadst4, HighbdIdct4), // ADST_DCT = 1 new(HighbdIdct4, HighbdIadst4), // DCT_ADST = 2 - new(HighbdIadst4, HighbdIadst4), // ADST_ADST = 3 - }; + new(HighbdIadst4, HighbdIadst4) // ADST_ADST = 3 + ]; - public static void HighbdIht4x416Add(ReadOnlySpan input, Span dest, int stride, int txType, int bd) + public static void HighbdIht4X416Add(ReadOnlySpan input, Span dest, int stride, int txType, int bd) { - int i, j; Span output = stackalloc int[4 * 4]; Span outptr = output; Span tempIn = stackalloc int[4]; Span tempOut = stackalloc int[4]; // Inverse transform row vectors. - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { _highbdIht4[txType].Rows(input, outptr, bd); input = input[4..]; @@ -304,31 +310,32 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } // Inverse transform column vectors. - for (i = 0; i < 4; ++i) + for (int i = 0; i < 4; ++i) { - for (j = 0; j < 4; ++j) + for (int j = 0; j < 4; ++j) { - tempIn[j] = output[j * 4 + i]; + tempIn[j] = output[(j * 4) + i]; } _highbdIht4[txType].Cols(tempIn, tempOut, bd); - for (j = 0; j < 4; ++j) + for (int j = 0; j < 4; ++j) { - dest[j * stride + i] = HighbdClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 4), bd); + dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 4), bd); } } } - private static readonly HighbdTransform2D[] _highIht8 = { + private static readonly HighbdTransform2D[] _highIht8 = + [ new(HighbdIdct8, HighbdIdct8), // DCT_DCT = 0 new(HighbdIadst8, HighbdIdct8), // ADST_DCT = 1 new(HighbdIdct8, HighbdIadst8), // DCT_ADST = 2 - new(HighbdIadst8, HighbdIadst8), // ADST_ADST = 3 - }; + new(HighbdIadst8, HighbdIadst8) // ADST_ADST = 3 + ]; - public static void HighbdIht8x864Add(ReadOnlySpan input, Span dest, int stride, int txType, int bd) + public static void HighbdIht8X864Add(ReadOnlySpan input, Span dest, int stride, int txType, int bd) { - int i, j; Span output = stackalloc int[8 * 8]; Span outptr = output; Span tempIn = stackalloc int[8]; @@ -336,7 +343,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 HighbdTransform2D ht = _highIht8[txType]; // Inverse transform row vectors. - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { ht.Rows(input, outptr, bd); input = input[8..]; @@ -344,31 +351,33 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } // Inverse transform column vectors. - for (i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - tempIn[j] = output[j * 8 + i]; + tempIn[j] = output[(j * 8) + i]; } ht.Cols(tempIn, tempOut, bd); - for (j = 0; j < 8; ++j) + for (int j = 0; j < 8; ++j) { - dest[j * stride + i] = HighbdClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 5), bd); + dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 5), bd); } } } - private static readonly HighbdTransform2D[] _highIht16 = { + private static readonly HighbdTransform2D[] _highIht16 = + [ new(HighbdIdct16, HighbdIdct16), // DCT_DCT = 0 new(HighbdIadst16, HighbdIdct16), // ADST_DCT = 1 new(HighbdIdct16, HighbdIadst16), // DCT_ADST = 2 - new(HighbdIadst16, HighbdIadst16), // ADST_ADST = 3 - }; + new(HighbdIadst16, HighbdIadst16) // ADST_ADST = 3 + ]; - public static void HighbdIht16x16256Add(ReadOnlySpan input, Span dest, int stride, int txType, int bd) + public static void HighbdIht16X16256Add(ReadOnlySpan input, Span dest, int stride, int txType, + int bd) { - int i, j; Span output = stackalloc int[16 * 16]; Span outptr = output; Span tempIn = stackalloc int[16]; @@ -376,7 +385,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 HighbdTransform2D ht = _highIht16[txType]; // Rows - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { ht.Rows(input, outptr, bd); input = input[16..]; @@ -384,47 +393,48 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } // Columns - for (i = 0; i < 16; ++i) + for (int i = 0; i < 16; ++i) { - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - tempIn[j] = output[j * 16 + i]; + tempIn[j] = output[(j * 16) + i]; } ht.Cols(tempIn, tempOut, bd); - for (j = 0; j < 16; ++j) + for (int j = 0; j < 16; ++j) { - dest[j * stride + i] = HighbdClipPixelAdd(dest[j * stride + i], BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); + dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], + BitUtils.RoundPowerOfTwo(tempOut[j], 6), bd); } } } // Idct - public static void HighbdIdct4x4Add(ReadOnlySpan input, Span dest, int stride, int eob, int bd) + public static void HighbdIdct4X4Add(ReadOnlySpan input, Span dest, int stride, int eob, int bd) { if (eob > 1) { - HighbdIdct4x416Add(input, dest, stride, bd); + HighbdIdct4X416Add(input, dest, stride, bd); } else { - HighbdIdct4x41Add(input, dest, stride, bd); + HighbdIdct4X41Add(input, dest, stride, bd); } } - public static void HighbdIwht4x4Add(ReadOnlySpan input, Span dest, int stride, int eob, int bd) + public static void HighbdIwht4X4Add(ReadOnlySpan input, Span dest, int stride, int eob, int bd) { if (eob > 1) { - HighbdIwht4x416Add(input, dest, stride, bd); + HighbdIwht4X416Add(input, dest, stride, bd); } else { - HighbdIwht4x41Add(input, dest, stride, bd); + HighbdIwht4X41Add(input, dest, stride, bd); } } - public static void HighbdIdct8x8Add(ReadOnlySpan input, Span dest, int stride, int eob, int bd) + public static void HighbdIdct8X8Add(ReadOnlySpan input, Span dest, int stride, int eob, int bd) { // If dc is 1, then input[0] is the reconstructed value, do not need // dequantization. Also, when dc is 1, dc is counted in eobs, namely eobs >=1. @@ -434,96 +444,99 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // DC only DCT coefficient if (eob == 1) { - Vpx_Highbdidct8x8_1_add_c(input, dest, stride, bd); + VpxHighbdidct8X81AddC(input, dest, stride, bd); } else if (eob <= 12) { - HighbdIdct8x812Add(input, dest, stride, bd); + HighbdIdct8X812Add(input, dest, stride, bd); } else { - HighbdIdct8x864Add(input, dest, stride, bd); + HighbdIdct8X864Add(input, dest, stride, bd); } } - public static void HighbdIdct16x16Add(ReadOnlySpan input, Span dest, int stride, int eob, int bd) + public static void HighbdIdct16X16Add(ReadOnlySpan input, Span dest, int stride, int eob, int bd) { // The calculation can be simplified if there are not many non-zero dct // coefficients. Use eobs to separate different cases. // DC only DCT coefficient. if (eob == 1) { - HighbdIdct16x161Add(input, dest, stride, bd); + HighbdIdct16X161Add(input, dest, stride, bd); } else if (eob <= 10) { - HighbdIdct16x1610Add(input, dest, stride, bd); + HighbdIdct16X1610Add(input, dest, stride, bd); } else if (eob <= 38) { - HighbdIdct16x1638Add(input, dest, stride, bd); + HighbdIdct16X1638Add(input, dest, stride, bd); } else { - HighbdIdct16x16256Add(input, dest, stride, bd); + HighbdIdct16X16256Add(input, dest, stride, bd); } } - public static void HighbdIdct32x32Add(ReadOnlySpan input, Span dest, int stride, int eob, int bd) + public static void HighbdIdct32X32Add(ReadOnlySpan input, Span dest, int stride, int eob, int bd) { // Non-zero coeff only in upper-left 8x8 if (eob == 1) { - HighbdIdct32x321Add(input, dest, stride, bd); + HighbdIdct32X321Add(input, dest, stride, bd); } else if (eob <= 34) { - HighbdIdct32x3234Add(input, dest, stride, bd); + HighbdIdct32X3234Add(input, dest, stride, bd); } else if (eob <= 135) { - HighbdIdct32x32135Add(input, dest, stride, bd); + HighbdIdct32X32135Add(input, dest, stride, bd); } else { - HighbdIdct32x321024Add(input, dest, stride, bd); + HighbdIdct32X321024Add(input, dest, stride, bd); } } // Iht - public static void HighbdIht4x4Add(TxType txType, ReadOnlySpan input, Span dest, int stride, int eob, int bd) + public static void HighbdIht4X4Add(TxType txType, ReadOnlySpan input, Span dest, int stride, + int eob, int bd) { if (txType == TxType.DctDct) { - HighbdIdct4x4Add(input, dest, stride, eob, bd); + HighbdIdct4X4Add(input, dest, stride, eob, bd); } else { - HighbdIht4x416Add(input, dest, stride, (int)txType, bd); + HighbdIht4X416Add(input, dest, stride, (int)txType, bd); } } - public static void HighbdIht8x8Add(TxType txType, ReadOnlySpan input, Span dest, int stride, int eob, int bd) + public static void HighbdIht8X8Add(TxType txType, ReadOnlySpan input, Span dest, int stride, + int eob, int bd) { if (txType == TxType.DctDct) { - HighbdIdct8x8Add(input, dest, stride, eob, bd); + HighbdIdct8X8Add(input, dest, stride, eob, bd); } else { - HighbdIht8x864Add(input, dest, stride, (int)txType, bd); + HighbdIht8X864Add(input, dest, stride, (int)txType, bd); } } - public static void HighbdIht16x16Add(TxType txType, ReadOnlySpan input, Span dest, int stride, int eob, int bd) + public static void HighbdIht16X16Add(TxType txType, ReadOnlySpan input, Span dest, int stride, + int eob, int bd) { if (txType == TxType.DctDct) { - HighbdIdct16x16Add(input, dest, stride, eob, bd); + HighbdIdct16X16Add(input, dest, stride, eob, bd); } else { - HighbdIht16x16256Add(input, dest, stride, (int)txType, bd); + HighbdIht16X16256Add(input, dest, stride, (int)txType, bd); } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/InternalErrorException.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/InternalErrorException.cs index d4ba0d88b..6d74e09f6 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/InternalErrorException.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/InternalErrorException.cs @@ -2,7 +2,7 @@ using System; namespace Ryujinx.Graphics.Nvdec.Vp9 { - class InternalErrorException : Exception + internal class InternalErrorException : Exception { public InternalErrorException(string message) : base(message) { diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/LoopFilter.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/LoopFilter.cs index 9b2564d70..ada7ae400 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/LoopFilter.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/LoopFilter.cs @@ -1,8 +1,12 @@ using Ryujinx.Common.Memory; using Ryujinx.Graphics.Nvdec.Vp9.Common; +using Ryujinx.Graphics.Nvdec.Vp9.Dsp; using Ryujinx.Graphics.Nvdec.Vp9.Types; using System; +using System.Diagnostics; using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; namespace Ryujinx.Graphics.Nvdec.Vp9 { @@ -13,11 +17,119 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 public const int MaxRefLfDeltas = 4; public const int MaxModeLfDeltas = 2; + private struct LfSync + { + private int[] _curSbCol; + private object[] _syncObjects; + private int _syncRange; + + private static int GetSyncRange(int width) + { + // nsync numbers are picked by testing. For example, for 4k + // video, using 4 gives best performance. + if (width < 640) + { + return 1; + } + + if (width <= 1280) + { + return 2; + } + + if (width <= 4096) + { + return 4; + } + + return 8; + } + + public void Initialize(int width, int sbRows) + { + if (_curSbCol == null || _curSbCol.Length != sbRows) + { + _curSbCol = new int[sbRows]; + _syncObjects = new object[sbRows]; + + for (int i = 0; i < sbRows; i++) + { + _syncObjects[i] = new object(); + } + } + + _syncRange = GetSyncRange(width); + _curSbCol.AsSpan().Fill(-1); + } + + public readonly void SyncRead(int r, int c) + { + if (_curSbCol == null) + { + return; + } + + int nsync = _syncRange; + + if (r != 0 && (c & (nsync - 1)) == 0) + { + object syncObject = _syncObjects[r - 1]; + lock (syncObject) + { + while (c > _curSbCol[r - 1] - nsync) + { + Monitor.Wait(syncObject); + } + } + } + } + + public readonly void SyncWrite(int r, int c, int sbCols) + { + if (_curSbCol == null) + { + return; + } + + int nsync = _syncRange; + + int cur; + // Only signal when there are enough filtered SB for next row to run. + bool sig = true; + + if (c < sbCols - 1) + { + cur = c; + + if (c % nsync != 0) + { + sig = false; + } + } + else + { + cur = sbCols + nsync; + } + + if (sig) + { + object syncObject = _syncObjects[r]; + + lock (syncObject) + { + _curSbCol[r] = cur; + + Monitor.Pulse(syncObject); + } + } + } + } + // 64 bit masks for left transform size. Each 1 represents a position where // we should apply a loop filter across the left border of an 8x8 block // boundary. // - // In the case of TX_16X16 -> ( in low order byte first we end up with + // In the case of (int)TxSize.Tx16x16 . ( in low order byte first we end up with // a mask that looks like this // // 10101010 @@ -30,18 +142,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // 10101010 // // A loopfilter should be applied to every other 8x8 horizontally. - private static readonly ulong[] _left64X64TxformMask = { - 0xffffffffffffffffUL, // TX_4X4 - 0xffffffffffffffffUL, // TX_8x8 - 0x5555555555555555UL, // TX_16x16 - 0x1111111111111111UL, // TX_32x32 - }; + private static readonly ulong[] _left64X64TxformMask = + [ + 0xffffffffffffffffUL, // (int)TxSize.Tx4x4 + 0xffffffffffffffffUL, // (int)TxSize.Tx8x8 + 0x5555555555555555UL, // (int)TxSize.Tx16x16 + 0x1111111111111111UL // (int)TxSize.Tx32x32 + ]; // 64 bit masks for above transform size. Each 1 represents a position where // we should apply a loop filter across the top border of an 8x8 block // boundary. // - // In the case of TX_32x32 -> ( in low order byte first we end up with + // In the case of (int)TxSize.Tx32x32 . ( in low order byte first we end up with // a mask that looks like this // // 11111111 @@ -54,18 +167,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // 00000000 // // A loopfilter should be applied to every other 4 the row vertically. - private static readonly ulong[] _above64X64TxformMask = { - 0xffffffffffffffffUL, // TX_4X4 - 0xffffffffffffffffUL, // TX_8x8 - 0x00ff00ff00ff00ffUL, // TX_16x16 - 0x000000ff000000ffUL, // TX_32x32 - }; + private static readonly ulong[] _above64X64TxformMask = + [ + 0xffffffffffffffffUL, // (int)TxSize.Tx4x4 + 0xffffffffffffffffUL, // (int)TxSize.Tx8x8 + 0x00ff00ff00ff00ffUL, // (int)TxSize.Tx16x16 + 0x000000ff000000ffUL // (int)TxSize.Tx32x32 + ]; // 64 bit masks for prediction sizes (left). Each 1 represents a position // where left border of an 8x8 block. These are aligned to the right most // appropriate bit, and then shifted into place. // - // In the case of TX_16x32 -> ( low order byte first ) we end up with + // In the case of TX_16x32 . ( low order byte first ) we end up with // a mask that looks like this : // // 10000000 @@ -76,158 +190,164 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // 00000000 // 00000000 // 00000000 - private static readonly ulong[] _leftPredictionMask = { - 0x0000000000000001UL, // BLOCK_4X4, - 0x0000000000000001UL, // BLOCK_4X8, - 0x0000000000000001UL, // BLOCK_8X4, - 0x0000000000000001UL, // BLOCK_8X8, - 0x0000000000000101UL, // BLOCK_8X16, - 0x0000000000000001UL, // BLOCK_16X8, - 0x0000000000000101UL, // BLOCK_16X16, - 0x0000000001010101UL, // BLOCK_16X32, - 0x0000000000000101UL, // BLOCK_32X16, - 0x0000000001010101UL, // BLOCK_32X32, - 0x0101010101010101UL, // BLOCK_32X64, - 0x0000000001010101UL, // BLOCK_64X32, - 0x0101010101010101UL, // BLOCK_64X64 - }; + private static readonly ulong[] _leftPredictionMask = + [ + 0x0000000000000001UL, // BLOCK_4x4, + 0x0000000000000001UL, // BLOCK_4x8, + 0x0000000000000001UL, // BLOCK_8x4, + 0x0000000000000001UL, // BLOCK_8x8, + 0x0000000000000101UL, // BLOCK_8x16, + 0x0000000000000001UL, // BLOCK_16x8, + 0x0000000000000101UL, // BLOCK_16x16, + 0x0000000001010101UL, // BLOCK_16x32, + 0x0000000000000101UL, // BLOCK_32x16, + 0x0000000001010101UL, // BLOCK_32x32, + 0x0101010101010101UL, // BLOCK_32x64, + 0x0000000001010101UL, // BLOCK_64x32, + 0x0101010101010101UL // BLOCK_64x64 + ]; // 64 bit mask to shift and set for each prediction size. - private static readonly ulong[] _abovePredictionMask = { - 0x0000000000000001UL, // BLOCK_4X4 - 0x0000000000000001UL, // BLOCK_4X8 - 0x0000000000000001UL, // BLOCK_8X4 - 0x0000000000000001UL, // BLOCK_8X8 - 0x0000000000000001UL, // BLOCK_8X16, - 0x0000000000000003UL, // BLOCK_16X8 - 0x0000000000000003UL, // BLOCK_16X16 - 0x0000000000000003UL, // BLOCK_16X32, - 0x000000000000000fUL, // BLOCK_32X16, - 0x000000000000000fUL, // BLOCK_32X32, - 0x000000000000000fUL, // BLOCK_32X64, - 0x00000000000000ffUL, // BLOCK_64X32, - 0x00000000000000ffUL, // BLOCK_64X64 - }; + private static readonly ulong[] _abovePredictionMask = + [ + 0x0000000000000001UL, // BLOCK_4x4 + 0x0000000000000001UL, // BLOCK_4x8 + 0x0000000000000001UL, // BLOCK_8x4 + 0x0000000000000001UL, // BLOCK_8x8 + 0x0000000000000001UL, // BLOCK_8x16, + 0x0000000000000003UL, // BLOCK_16x8 + 0x0000000000000003UL, // BLOCK_16x16 + 0x0000000000000003UL, // BLOCK_16x32, + 0x000000000000000fUL, // BLOCK_32x16, + 0x000000000000000fUL, // BLOCK_32x32, + 0x000000000000000fUL, // BLOCK_32x64, + 0x00000000000000ffUL, // BLOCK_64x32, + 0x00000000000000ffUL // BLOCK_64x64 + ]; // 64 bit mask to shift and set for each prediction size. A bit is set for // each 8x8 block that would be in the left most block of the given block // size in the 64x64 block. - private static readonly ulong[] _sizeMask = { - 0x0000000000000001UL, // BLOCK_4X4 - 0x0000000000000001UL, // BLOCK_4X8 - 0x0000000000000001UL, // BLOCK_8X4 - 0x0000000000000001UL, // BLOCK_8X8 - 0x0000000000000101UL, // BLOCK_8X16, - 0x0000000000000003UL, // BLOCK_16X8 - 0x0000000000000303UL, // BLOCK_16X16 - 0x0000000003030303UL, // BLOCK_16X32, - 0x0000000000000f0fUL, // BLOCK_32X16, - 0x000000000f0f0f0fUL, // BLOCK_32X32, - 0x0f0f0f0f0f0f0f0fUL, // BLOCK_32X64, - 0x00000000ffffffffUL, // BLOCK_64X32, - 0xffffffffffffffffUL, // BLOCK_64X64 - }; + private static readonly ulong[] _sizeMask = + [ + 0x0000000000000001UL, // BLOCK_4x4 + 0x0000000000000001UL, // BLOCK_4x8 + 0x0000000000000001UL, // BLOCK_8x4 + 0x0000000000000001UL, // BLOCK_8x8 + 0x0000000000000101UL, // BLOCK_8x16, + 0x0000000000000003UL, // BLOCK_16x8 + 0x0000000000000303UL, // BLOCK_16x16 + 0x0000000003030303UL, // BLOCK_16x32, + 0x0000000000000f0fUL, // BLOCK_32x16, + 0x000000000f0f0f0fUL, // BLOCK_32x32, + 0x0f0f0f0f0f0f0f0fUL, // BLOCK_32x64, + 0x00000000ffffffffUL, // BLOCK_64x32, + 0xffffffffffffffffUL // BLOCK_64x64 + ]; // These are used for masking the left and above borders. -#pragma warning disable IDE0051 // Remove unused private member private const ulong LeftBorder = 0x1111111111111111UL; private const ulong AboveBorder = 0x000000ff000000ffUL; -#pragma warning restore IDE0051 // 16 bit masks for uv transform sizes. - private static readonly ushort[] _left64X64TxformMaskUv = { - 0xffff, // TX_4X4 - 0xffff, // TX_8x8 - 0x5555, // TX_16x16 - 0x1111, // TX_32x32 - }; + private static readonly ushort[] _left64X64TxformMaskUv = + [ + 0xffff, // (int)TxSize.Tx4x4 + 0xffff, // (int)TxSize.Tx8x8 + 0x5555, // (int)TxSize.Tx16x16 + 0x1111 // (int)TxSize.Tx32x32 + ]; - private static readonly ushort[] _above64X64TxformMaskUv = { - 0xffff, // TX_4X4 - 0xffff, // TX_8x8 - 0x0f0f, // TX_16x16 - 0x000f, // TX_32x32 - }; + private static readonly ushort[] _above64X64TxformMaskUv = + [ + 0xffff, // (int)TxSize.Tx4x4 + 0xffff, // (int)TxSize.Tx8x8 + 0x0f0f, // (int)TxSize.Tx16x16 + 0x000f // (int)TxSize.Tx32x32 + ]; // 16 bit left mask to shift and set for each uv prediction size. - private static readonly ushort[] _leftPredictionMaskUv = { - 0x0001, // BLOCK_4X4, - 0x0001, // BLOCK_4X8, - 0x0001, // BLOCK_8X4, - 0x0001, // BLOCK_8X8, - 0x0001, // BLOCK_8X16, - 0x0001, // BLOCK_16X8, - 0x0001, // BLOCK_16X16, - 0x0011, // BLOCK_16X32, - 0x0001, // BLOCK_32X16, - 0x0011, // BLOCK_32X32, - 0x1111, // BLOCK_32X64 - 0x0011, // BLOCK_64X32, - 0x1111, // BLOCK_64X64 - }; + private static readonly ushort[] _leftPredictionMaskUv = + [ + 0x0001, // BLOCK_4x4, + 0x0001, // BLOCK_4x8, + 0x0001, // BLOCK_8x4, + 0x0001, // BLOCK_8x8, + 0x0001, // BLOCK_8x16, + 0x0001, // BLOCK_16x8, + 0x0001, // BLOCK_16x16, + 0x0011, // BLOCK_16x32, + 0x0001, // BLOCK_32x16, + 0x0011, // BLOCK_32x32, + 0x1111, // BLOCK_32x64 + 0x0011, // BLOCK_64x32, + 0x1111 // BLOCK_64x64 + ]; // 16 bit above mask to shift and set for uv each prediction size. - private static readonly ushort[] _abovePredictionMaskUv = { - 0x0001, // BLOCK_4X4 - 0x0001, // BLOCK_4X8 - 0x0001, // BLOCK_8X4 - 0x0001, // BLOCK_8X8 - 0x0001, // BLOCK_8X16, - 0x0001, // BLOCK_16X8 - 0x0001, // BLOCK_16X16 - 0x0001, // BLOCK_16X32, - 0x0003, // BLOCK_32X16, - 0x0003, // BLOCK_32X32, - 0x0003, // BLOCK_32X64, - 0x000f, // BLOCK_64X32, - 0x000f, // BLOCK_64X64 - }; + private static readonly ushort[] _abovePredictionMaskUv = + [ + 0x0001, // BLOCK_4x4 + 0x0001, // BLOCK_4x8 + 0x0001, // BLOCK_8x4 + 0x0001, // BLOCK_8x8 + 0x0001, // BLOCK_8x16, + 0x0001, // BLOCK_16x8 + 0x0001, // BLOCK_16x16 + 0x0001, // BLOCK_16x32, + 0x0003, // BLOCK_32x16, + 0x0003, // BLOCK_32x32, + 0x0003, // BLOCK_32x64, + 0x000f, // BLOCK_64x32, + 0x000f // BLOCK_64x64 + ]; // 64 bit mask to shift and set for each uv prediction size - private static readonly ushort[] _sizeMaskUv = { - 0x0001, // BLOCK_4X4 - 0x0001, // BLOCK_4X8 - 0x0001, // BLOCK_8X4 - 0x0001, // BLOCK_8X8 - 0x0001, // BLOCK_8X16, - 0x0001, // BLOCK_16X8 - 0x0001, // BLOCK_16X16 - 0x0011, // BLOCK_16X32, - 0x0003, // BLOCK_32X16, - 0x0033, // BLOCK_32X32, - 0x3333, // BLOCK_32X64, - 0x00ff, // BLOCK_64X32, - 0xffff, // BLOCK_64X64 - }; + private static readonly ushort[] _sizeMaskUv = + [ + 0x0001, // BLOCK_4x4 + 0x0001, // BLOCK_4x8 + 0x0001, // BLOCK_8x4 + 0x0001, // BLOCK_8x8 + 0x0001, // BLOCK_8x16, + 0x0001, // BLOCK_16x8 + 0x0001, // BLOCK_16x16 + 0x0011, // BLOCK_16x32, + 0x0003, // BLOCK_32x16, + 0x0033, // BLOCK_32x32, + 0x3333, // BLOCK_32x64, + 0x00ff, // BLOCK_64x32, + 0xffff // BLOCK_64x64 + ]; -#pragma warning disable IDE0051 // Remove unused private member private const ushort LeftBorderUv = 0x1111; private const ushort AboveBorderUv = 0x000f; -#pragma warning restore IDE0051 - private static readonly int[] _modeLfLut = { + private static readonly int[] _modeLfLut = + [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // INTRA_MODES - 1, 1, 0, 1, // INTER_MODES (ZEROMV == 0) - }; + 1, 1, 0, 1 // INTER_MODES (ZEROMV == 0) + ]; private static byte GetFilterLevel(ref LoopFilterInfoN lfiN, ref ModeInfo mi) { return lfiN.Lvl[mi.SegmentId][mi.RefFrame[0]][_modeLfLut[(int)mi.Mode]]; } - private static ref LoopFilterMask GetLfm(ref Types.LoopFilter lf, int miRow, int miCol) + private static Span GetLfm(ref Types.LoopFilter lf, int miRow, int miCol) { - return ref lf.Lfm[(miCol >> 3) + ((miRow >> 3) * lf.LfmStride)]; + return lf.Lfm.AsSpan()[((miCol >> 3) + ((miRow >> 3) * lf.LfmStride))..]; } // 8x8 blocks in a superblock. A "1" represents the first block in a 16x16 // or greater area. - private static readonly byte[][] _firstBlockIn16X16 = { - new byte[] { 1, 0, 1, 0, 1, 0, 1, 0 }, new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, - new byte[] { 1, 0, 1, 0, 1, 0, 1, 0 }, new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, - new byte[] { 1, 0, 1, 0, 1, 0, 1, 0 }, new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, - new byte[] { 1, 0, 1, 0, 1, 0, 1, 0 }, new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, - }; + private static readonly byte[][] _firstBlockIn16X16 = + [ + [1, 0, 1, 0, 1, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 1, 0, 1, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 1, 0, 1, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 1, 0, 1, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0] + ]; // This function sets up the bit masks for a block represented // by miRow, miCol in a 64x64 region. @@ -238,15 +358,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 ref LoopFilterInfoN lfiN = ref cm.LfInfo; int filterLevel = GetFilterLevel(ref lfiN, ref mi); TxSize txSizeUv = Luts.UvTxsizeLookup[(int)blockSize][(int)txSizeY][1][1]; - ref LoopFilterMask lfm = ref GetLfm(ref cm.Lf, miRow, miCol); + ref LoopFilterMask lfm = ref GetLfm(ref cm.Lf, miRow, miCol)[0]; ref ulong leftY = ref lfm.LeftY[(int)txSizeY]; ref ulong aboveY = ref lfm.AboveY[(int)txSizeY]; - ref ulong int4X4Y = ref lfm.Int4x4Y; + ref ulong int4X4Y = ref lfm.Int4X4Y; ref ushort leftUv = ref lfm.LeftUv[(int)txSizeUv]; ref ushort aboveUv = ref lfm.AboveUv[(int)txSizeUv]; - ref ushort int4X4Uv = ref lfm.Int4x4Uv; - int rowInSb = (miRow & 7); - int colInSb = (miCol & 7); + ref ushort int4X4Uv = ref lfm.Int4X4Uv; + int rowInSb = miRow & 7; + int colInSb = miCol & 7; int shiftY = colInSb + (rowInSb << 3); int shiftUv = (colInSb >> 1) + ((rowInSb >> 1) << 2); int buildUv = _firstBlockIn16X16[rowInSb][colInSb]; @@ -257,8 +377,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } int index = shiftY; - int i; - for (i = 0; i < bh; i++) + + for (int i = 0; i < bh; i++) { MemoryMarshal.CreateSpan(ref lfm.LflY[index], 64 - index)[..bw].Fill((byte)filterLevel); index += 8; @@ -307,22 +427,155 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // Try to determine what to do with the internal 4x4 block boundaries. These // differ from the 4x4 boundaries on the outside edge of an 8x8 in that the // internal ones can be skipped and don't depend on the prediction block size. - if (txSizeY == TxSize.Tx4x4) + if (txSizeY == TxSize.Tx4X4) { int4X4Y |= _sizeMask[(int)blockSize] << shiftY; } - if (buildUv != 0 && txSizeUv == TxSize.Tx4x4) + if (buildUv != 0 && txSizeUv == TxSize.Tx4X4) { int4X4Uv |= (ushort)((_sizeMaskUv[(int)blockSize] & 0xffff) << shiftUv); } } + private static void AdjustMask(ref Vp9Common cm, int miRow, int miCol, ref LoopFilterMask lfm) + { + const ulong LeftBorder = 0x1111111111111111UL; + const ulong AboveBorder = 0x000000ff000000ffUL; + const ushort LeftBorderUv = 0x1111; + const ushort AboveBorderUv = 0x000f; + + // The largest loopfilter we have is 16x16 so we use the 16x16 mask + // for 32x32 transforms also. + lfm.LeftY[(int)TxSize.Tx16X16] |= lfm.LeftY[(int)TxSize.Tx32X32]; + lfm.AboveY[(int)TxSize.Tx16X16] |= lfm.AboveY[(int)TxSize.Tx32X32]; + lfm.LeftUv[(int)TxSize.Tx16X16] |= lfm.LeftUv[(int)TxSize.Tx32X32]; + lfm.AboveUv[(int)TxSize.Tx16X16] |= lfm.AboveUv[(int)TxSize.Tx32X32]; + + // We do at least 8 tap filter on every 32x32 even if the transform size + // is 4x4. So if the 4x4 is set on a border pixel add it to the 8x8 and + // remove it from the 4x4. + lfm.LeftY[(int)TxSize.Tx8X8] |= lfm.LeftY[(int)TxSize.Tx4X4] & LeftBorder; + lfm.LeftY[(int)TxSize.Tx4X4] &= ~LeftBorder; + lfm.AboveY[(int)TxSize.Tx8X8] |= lfm.AboveY[(int)TxSize.Tx4X4] & AboveBorder; + lfm.AboveY[(int)TxSize.Tx4X4] &= ~AboveBorder; + lfm.LeftUv[(int)TxSize.Tx8X8] |= (ushort)(lfm.LeftUv[(int)TxSize.Tx4X4] & LeftBorderUv); + lfm.LeftUv[(int)TxSize.Tx4X4] &= unchecked((ushort)~LeftBorderUv); + lfm.AboveUv[(int)TxSize.Tx8X8] |= (ushort)(lfm.AboveUv[(int)TxSize.Tx4X4] & AboveBorderUv); + lfm.AboveUv[(int)TxSize.Tx4X4] &= unchecked((ushort)~AboveBorderUv); + + // We do some special edge handling. + if (miRow + Constants.MiBlockSize > cm.MiRows) + { + int rows = cm.MiRows - miRow; + + // Each pixel inside the border gets a 1, + ulong maskY = (1UL << (rows << 3)) - 1; + ushort maskUv = (ushort)((1 << (((rows + 1) >> 1) << 2)) - 1); + + // Remove values completely outside our border. + for (int i = 0; i < (int)TxSize.Tx32X32; i++) + { + lfm.LeftY[i] &= maskY; + lfm.AboveY[i] &= maskY; + lfm.LeftUv[i] &= maskUv; + lfm.AboveUv[i] &= maskUv; + } + + lfm.Int4X4Y &= maskY; + lfm.Int4X4Uv &= maskUv; + + // We don't apply a wide loop filter on the last uv block row. If set + // apply the shorter one instead. + if (rows == 1) + { + lfm.AboveUv[(int)TxSize.Tx8X8] |= lfm.AboveUv[(int)TxSize.Tx16X16]; + lfm.AboveUv[(int)TxSize.Tx16X16] = 0; + } + + if (rows == 5) + { + lfm.AboveUv[(int)TxSize.Tx8X8] |= (ushort)(lfm.AboveUv[(int)TxSize.Tx16X16] & 0xff00); + lfm.AboveUv[(int)TxSize.Tx16X16] &= (ushort)~(lfm.AboveUv[(int)TxSize.Tx16X16] & 0xff00); + } + } + + if (miCol + Constants.MiBlockSize > cm.MiCols) + { + int columns = cm.MiCols - miCol; + + // Each pixel inside the border gets a 1, the multiply copies the border + // to where we need it. + ulong maskY = ((1UL << columns) - 1) * 0x0101010101010101UL; + ushort maskUv = (ushort)(((1 << ((columns + 1) >> 1)) - 1) * 0x1111); + + // Internal edges are not applied on the last column of the image so + // we mask 1 more for the internal edges + ushort maskUvInt = (ushort)(((1 << (columns >> 1)) - 1) * 0x1111); + + // Remove the bits outside the image edge. + for (int i = 0; i < (int)TxSize.Tx32X32; i++) + { + lfm.LeftY[i] &= maskY; + lfm.AboveY[i] &= maskY; + lfm.LeftUv[i] &= maskUv; + lfm.AboveUv[i] &= maskUv; + } + + lfm.Int4X4Y &= maskY; + lfm.Int4X4Uv &= maskUvInt; + + // We don't apply a wide loop filter on the last uv column. If set + // apply the shorter one instead. + if (columns == 1) + { + lfm.LeftUv[(int)TxSize.Tx8X8] |= lfm.LeftUv[(int)TxSize.Tx16X16]; + lfm.LeftUv[(int)TxSize.Tx16X16] = 0; + } + + if (columns == 5) + { + lfm.LeftUv[(int)TxSize.Tx8X8] |= (ushort)(lfm.LeftUv[(int)TxSize.Tx16X16] & 0xcccc); + lfm.LeftUv[(int)TxSize.Tx16X16] &= (ushort)~(lfm.LeftUv[(int)TxSize.Tx16X16] & 0xcccc); + } + } + + // We don't apply a loop filter on the first column in the image, mask that + // out. + if (miCol == 0) + { + for (int i = 0; i < (int)TxSize.Tx32X32; i++) + { + lfm.LeftY[i] &= 0xfefefefefefefefeUL; + lfm.LeftUv[i] &= 0xeeee; + } + } + + // Assert if we try to apply 2 different loop filters at the same position. + Debug.Assert((lfm.LeftY[(int)TxSize.Tx16X16] & lfm.LeftY[(int)TxSize.Tx8X8]) == 0); + Debug.Assert((lfm.LeftY[(int)TxSize.Tx16X16] & lfm.LeftY[(int)TxSize.Tx4X4]) == 0); + Debug.Assert((lfm.LeftY[(int)TxSize.Tx8X8] & lfm.LeftY[(int)TxSize.Tx4X4]) == 0); + Debug.Assert((lfm.Int4X4Y & lfm.LeftY[(int)TxSize.Tx16X16]) == 0); + Debug.Assert((lfm.LeftUv[(int)TxSize.Tx16X16] & lfm.LeftUv[(int)TxSize.Tx8X8]) == 0); + Debug.Assert((lfm.LeftUv[(int)TxSize.Tx16X16] & lfm.LeftUv[(int)TxSize.Tx4X4]) == 0); + Debug.Assert((lfm.LeftUv[(int)TxSize.Tx8X8] & lfm.LeftUv[(int)TxSize.Tx4X4]) == 0); + Debug.Assert((lfm.Int4X4Uv & lfm.LeftUv[(int)TxSize.Tx16X16]) == 0); + Debug.Assert((lfm.AboveY[(int)TxSize.Tx16X16] & lfm.AboveY[(int)TxSize.Tx8X8]) == 0); + Debug.Assert((lfm.AboveY[(int)TxSize.Tx16X16] & lfm.AboveY[(int)TxSize.Tx4X4]) == 0); + Debug.Assert((lfm.AboveY[(int)TxSize.Tx8X8] & lfm.AboveY[(int)TxSize.Tx4X4]) == 0); + Debug.Assert((lfm.Int4X4Y & lfm.AboveY[(int)TxSize.Tx16X16]) == 0); + Debug.Assert((lfm.AboveUv[(int)TxSize.Tx16X16] & lfm.AboveUv[(int)TxSize.Tx8X8]) == 0); + Debug.Assert((lfm.AboveUv[(int)TxSize.Tx16X16] & lfm.AboveUv[(int)TxSize.Tx4X4]) == 0); + Debug.Assert((lfm.AboveUv[(int)TxSize.Tx8X8] & lfm.AboveUv[(int)TxSize.Tx4X4]) == 0); + Debug.Assert((lfm.Int4X4Uv & lfm.AboveUv[(int)TxSize.Tx16X16]) == 0); + } + public static unsafe void ResetLfm(ref Vp9Common cm) { if (cm.Lf.FilterLevel != 0) { - MemoryUtil.Fill(cm.Lf.Lfm.ToPointer(), new LoopFilterMask(), ((cm.MiRows + (Constants.MiBlockSize - 1)) >> 3) * cm.Lf.LfmStride); + MemoryUtil.Fill(cm.Lf.Lfm.ToPointer(), new LoopFilterMask(), + ((cm.MiRows + (Constants.MiBlockSize - 1)) >> 3) * cm.Lf.LfmStride); } } @@ -338,9 +591,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (sharpnessLvl > 0) { - if (blockInsideLimit > (9 - sharpnessLvl)) + if (blockInsideLimit > 9 - sharpnessLvl) { - blockInsideLimit = (9 - sharpnessLvl); + blockInsideLimit = 9 - sharpnessLvl; } } @@ -350,7 +603,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } lfi.Lfthr[lvl].Lim.AsSpan().Fill((byte)blockInsideLimit); - lfi.Lfthr[lvl].Mblim.AsSpan().Fill((byte)(2 * (lvl + 2) + blockInsideLimit)); + lfi.Lfthr[lvl].Mblim.AsSpan().Fill((byte)((2 * (lvl + 2)) + blockInsideLimit)); } } @@ -375,10 +628,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 for (segId = 0; segId < Constants.MaxSegments; segId++) { int lvlSeg = defaultFiltLvl; - if (seg.IsSegFeatureActive(segId, SegLvlFeatures.SegLvlAltLf) != 0) + if (seg.IsSegFeatureActive(segId, SegLvlFeatures.AltLf) != 0) { - int data = seg.GetSegData(segId, SegLvlFeatures.SegLvlAltLf); - lvlSeg = Math.Clamp(seg.AbsDelta == Constants.SegmentAbsData ? data : defaultFiltLvl + data, 0, MaxLoopFilter); + int data = seg.GetSegData(segId, SegLvlFeatures.AltLf); + lvlSeg = Math.Clamp(seg.AbsDelta == Constants.SegmentAbsData ? data : defaultFiltLvl + data, 0, + MaxLoopFilter); } if (!lf.ModeRefDeltaEnabled) @@ -390,19 +644,1321 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 else { int refr, mode; - int intraLvl = lvlSeg + lf.RefDeltas[Constants.IntraFrame] * scale; + int intraLvl = lvlSeg + (lf.RefDeltas[Constants.IntraFrame] * scale); lfi.Lvl[segId][Constants.IntraFrame][0] = (byte)Math.Clamp(intraLvl, 0, MaxLoopFilter); for (refr = Constants.LastFrame; refr < Constants.MaxRefFrames; ++refr) { for (mode = 0; mode < MaxModeLfDeltas; ++mode) { - int interLvl = lvlSeg + lf.RefDeltas[refr] * scale + lf.ModeDeltas[mode] * scale; + int interLvl = lvlSeg + (lf.RefDeltas[refr] * scale) + (lf.ModeDeltas[mode] * scale); lfi.Lvl[segId][refr][mode] = (byte)Math.Clamp(interLvl, 0, MaxLoopFilter); } } } } } + + private static void FilterSelectivelyVertRow2( + int subsamplingFactor, + ArrayPtr s, + int pitch, + uint mask16X16, + uint mask8X8, + uint mask4X4, + uint mask4X4Int, + ReadOnlySpan lfthr, + ReadOnlySpan lfl) + { + uint dualMaskCutoff = subsamplingFactor != 0 ? 0xffu : 0xffffu; + int lflForward = subsamplingFactor != 0 ? 4 : 8; + uint dualOne = 1u | (1u << lflForward); + Span> ss = stackalloc ArrayPtr[2]; + Span lfis = stackalloc LoopFilterThresh[2]; + ss[0] = s; + + for (uint mask = (mask16X16 | mask8X8 | mask4X4 | mask4X4Int) & dualMaskCutoff; + mask != 0; + mask = (mask & ~dualOne) >> 1) + { + if ((mask & dualOne) != 0) + { + lfis[0] = lfthr[lfl[0]]; + lfis[1] = lfthr[lfl[lflForward]]; + ss[1] = ss[0].Slice(8 * pitch); + + if ((mask16X16 & dualOne) != 0) + { + if ((mask16X16 & dualOne) == dualOne) + { + LoopFilterAuto.LpfVertical16Dual(ss[0], pitch, lfis[0].Mblim.AsSpan(), lfis[0].Lim.AsSpan(), + lfis[0].HevThr.AsSpan()); + } + else + { + ref LoopFilterThresh lfi = ref lfis[(mask16X16 & 1) == 0 ? 1 : 0]; + LoopFilterAuto.LpfVertical16(ss[(mask16X16 & 1) == 0 ? 1 : 0], pitch, lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), lfi.HevThr.AsSpan()); + } + } + + if ((mask8X8 & dualOne) != 0) + { + if ((mask8X8 & dualOne) == dualOne) + { + LoopFilterAuto.LpfVertical8Dual( + ss[0], + pitch, + lfis[0].Mblim.AsSpan(), + lfis[0].Lim.AsSpan(), + lfis[0].HevThr.AsSpan(), + lfis[1].Mblim.AsSpan(), + lfis[1].Lim.AsSpan(), + lfis[1].HevThr.AsSpan()); + } + else + { + ref LoopFilterThresh lfi = ref lfis[(mask8X8 & 1) == 0 ? 1 : 0]; + LoopFilterAuto.LpfVertical8( + ss[(mask8X8 & 1) == 0 ? 1 : 0], + pitch, + lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan()); + } + } + + if ((mask4X4 & dualOne) != 0) + { + if ((mask4X4 & dualOne) == dualOne) + { + LoopFilterAuto.LpfVertical4Dual( + ss[0], + pitch, + lfis[0].Mblim.AsSpan(), + lfis[0].Lim.AsSpan(), + lfis[0].HevThr.AsSpan(), + lfis[1].Mblim.AsSpan(), + lfis[1].Lim.AsSpan(), + lfis[1].HevThr.AsSpan()); + } + else + { + ref LoopFilterThresh lfi = ref lfis[(mask4X4 & 1) == 0 ? 1 : 0]; + LoopFilterAuto.LpfVertical4(ss[(mask4X4 & 1) == 0 ? 1 : 0], pitch, lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), lfi.HevThr.AsSpan()); + } + } + + if ((mask4X4Int & dualOne) != 0) + { + if ((mask4X4Int & dualOne) == dualOne) + { + LoopFilterAuto.LpfVertical4Dual( + ss[0].Slice(4), + pitch, + lfis[0].Mblim.AsSpan(), + lfis[0].Lim.AsSpan(), + lfis[0].HevThr.AsSpan(), + lfis[1].Mblim.AsSpan(), + lfis[1].Lim.AsSpan(), + lfis[1].HevThr.AsSpan()); + } + else + { + ref LoopFilterThresh lfi = ref lfis[(mask4X4Int & 1) == 0 ? 1 : 0]; + LoopFilterAuto.LpfVertical4(ss[(mask4X4Int & 1) == 0 ? 1 : 0].Slice(4), pitch, + lfi.Mblim.AsSpan(), lfi.Lim.AsSpan(), lfi.HevThr.AsSpan()); + } + } + } + + ss[0] = ss[0].Slice(8); + lfl = lfl[1..]; + mask16X16 >>= 1; + mask8X8 >>= 1; + mask4X4 >>= 1; + mask4X4Int >>= 1; + } + } + + private static void HighbdFilterSelectivelyVertRow2( + int subsamplingFactor, + ArrayPtr s, + int pitch, + uint mask16X16, + uint mask8X8, + uint mask4X4, + uint mask4X4Int, + ReadOnlySpan lfthr, + ReadOnlySpan lfl, + int bd) + { + uint dualMaskCutoff = subsamplingFactor != 0 ? 0xffu : 0xffffu; + int lflForward = subsamplingFactor != 0 ? 4 : 8; + uint dualOne = 1u | (1u << lflForward); + Span> ss = stackalloc ArrayPtr[2]; + Span lfis = stackalloc LoopFilterThresh[2]; + ss[0] = s; + + for (uint mask = (mask16X16 | mask8X8 | mask4X4 | mask4X4Int) & dualMaskCutoff; + mask != 0; + mask = (mask & ~dualOne) >> 1) + { + if ((mask & dualOne) != 0) + { + lfis[0] = lfthr[lfl[0]]; + lfis[1] = lfthr[lfl[lflForward]]; + ss[1] = ss[0].Slice(8 * pitch); + + if ((mask16X16 & dualOne) != 0) + { + if ((mask16X16 & dualOne) == dualOne) + { + LoopFilterScalar.HighBdLpfVertical16Dual(ss[0], pitch, lfis[0].Mblim[0], lfis[0].Lim[0], + lfis[0].HevThr[0], bd); + } + else + { + ref LoopFilterThresh lfi = ref lfis[(mask16X16 & 1) == 0 ? 1 : 0]; + LoopFilterScalar.HighBdLpfVertical16(ss[(mask16X16 & 1) == 0 ? 1 : 0], pitch, lfi.Mblim[0], + lfi.Lim[0], lfi.HevThr[0], bd); + } + } + + if ((mask8X8 & dualOne) != 0) + { + if ((mask8X8 & dualOne) == dualOne) + { + LoopFilterScalar.HighBdLpfVertical8Dual( + ss[0], + pitch, + lfis[0].Mblim[0], + lfis[0].Lim[0], + lfis[0].HevThr[0], + lfis[1].Mblim[0], + lfis[1].Lim[0], + lfis[1].HevThr[0], + bd); + } + else + { + ref LoopFilterThresh lfi = ref lfis[(mask8X8 & 1) == 0 ? 1 : 0]; + LoopFilterScalar.HighBdLpfVertical8( + ss[(mask8X8 & 1) == 0 ? 1 : 0], + pitch, + lfi.Mblim[0], + lfi.Lim[0], + lfi.HevThr[0], + bd); + } + } + + if ((mask4X4 & dualOne) != 0) + { + if ((mask4X4 & dualOne) == dualOne) + { + LoopFilterScalar.HighBdLpfVertical4Dual( + ss[0], + pitch, + lfis[0].Mblim[0], + lfis[0].Lim[0], + lfis[0].HevThr[0], + lfis[1].Mblim[0], + lfis[1].Lim[0], + lfis[1].HevThr[0], + bd); + } + else + { + ref LoopFilterThresh lfi = ref lfis[(mask4X4 & 1) == 0 ? 1 : 0]; + LoopFilterScalar.HighBdLpfVertical4(ss[(mask4X4 & 1) == 0 ? 1 : 0], pitch, lfi.Mblim[0], + lfi.Lim[0], lfi.HevThr[0], bd); + } + } + + if ((mask4X4Int & dualOne) != 0) + { + if ((mask4X4Int & dualOne) == dualOne) + { + LoopFilterScalar.HighBdLpfVertical4Dual( + ss[0].Slice(4), + pitch, + lfis[0].Mblim[0], + lfis[0].Lim[0], + lfis[0].HevThr[0], + lfis[1].Mblim[0], + lfis[1].Lim[0], + lfis[1].HevThr[0], + bd); + } + else + { + ref LoopFilterThresh lfi = ref lfis[(mask4X4Int & 1) == 0 ? 1 : 0]; + LoopFilterScalar.HighBdLpfVertical4(ss[(mask4X4Int & 1) == 0 ? 1 : 0].Slice(4), pitch, + lfi.Mblim[0], lfi.Lim[0], lfi.HevThr[0], bd); + } + } + } + + ss[0] = ss[0].Slice(8); + lfl = lfl[1..]; + mask16X16 >>= 1; + mask8X8 >>= 1; + mask4X4 >>= 1; + mask4X4Int >>= 1; + } + } + + private static void FilterSelectivelyHoriz( + ArrayPtr s, + int pitch, + uint mask16X16, + uint mask8X8, + uint mask4X4, + uint mask4X4Int, + ReadOnlySpan lfthr, + ReadOnlySpan lfl) + { + int count; + + for (uint mask = mask16X16 | mask8X8 | mask4X4 | mask4X4Int; mask != 0; mask >>= count) + { + count = 1; + if ((mask & 1) != 0) + { + LoopFilterThresh lfi = lfthr[lfl[0]]; + + if ((mask16X16 & 1) != 0) + { + if ((mask16X16 & 3) == 3) + { + LoopFilterAuto.LpfHorizontal16Dual(s, pitch, lfi.Mblim.AsSpan(), lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan()); + count = 2; + } + else + { + LoopFilterAuto.LpfHorizontal16(s, pitch, lfi.Mblim.AsSpan(), lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan()); + } + } + else if ((mask8X8 & 1) != 0) + { + if ((mask8X8 & 3) == 3) + { + // Next block's thresholds. + LoopFilterThresh lfin = lfthr[lfl[1]]; + + LoopFilterAuto.LpfHorizontal8Dual( + s, + pitch, + lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan(), + lfin.Mblim.AsSpan(), + lfin.Lim.AsSpan(), + lfin.HevThr.AsSpan()); + + if ((mask4X4Int & 3) == 3) + { + LoopFilterAuto.LpfHorizontal4Dual( + s.Slice(4 * pitch), + pitch, + lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan(), + lfin.Mblim.AsSpan(), + lfin.Lim.AsSpan(), + lfin.HevThr.AsSpan()); + } + else if ((mask4X4Int & 1) != 0) + { + LoopFilterAuto.LpfHorizontal4(s.Slice(4 * pitch), pitch, lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), lfi.HevThr.AsSpan()); + } + else if ((mask4X4Int & 2) != 0) + { + LoopFilterAuto.LpfHorizontal4(s.Slice(8 + (4 * pitch)), pitch, lfin.Mblim.AsSpan(), + lfin.Lim.AsSpan(), lfin.HevThr.AsSpan()); + } + + count = 2; + } + else + { + LoopFilterAuto.LpfHorizontal8(s, pitch, lfi.Mblim.AsSpan(), lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan()); + + if ((mask4X4Int & 1) != 0) + { + LoopFilterAuto.LpfHorizontal4(s.Slice(4 * pitch), pitch, lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), lfi.HevThr.AsSpan()); + } + } + } + else if ((mask4X4 & 1) != 0) + { + if ((mask4X4 & 3) == 3) + { + // Next block's thresholds. + LoopFilterThresh lfin = lfthr[lfl[1]]; + + LoopFilterAuto.LpfHorizontal4Dual( + s, + pitch, + lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan(), + lfin.Mblim.AsSpan(), + lfin.Lim.AsSpan(), + lfin.HevThr.AsSpan()); + + if ((mask4X4Int & 3) == 3) + { + LoopFilterAuto.LpfHorizontal4Dual( + s.Slice(4 * pitch), + pitch, + lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan(), + lfin.Mblim.AsSpan(), + lfin.Lim.AsSpan(), + lfin.HevThr.AsSpan()); + } + else if ((mask4X4Int & 1) != 0) + { + LoopFilterAuto.LpfHorizontal4(s.Slice(4 * pitch), pitch, lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), lfi.HevThr.AsSpan()); + } + else if ((mask4X4Int & 2) != 0) + { + LoopFilterAuto.LpfHorizontal4(s.Slice(8 + (4 * pitch)), pitch, lfin.Mblim.AsSpan(), + lfin.Lim.AsSpan(), lfin.HevThr.AsSpan()); + } + + count = 2; + } + else + { + LoopFilterAuto.LpfHorizontal4(s, pitch, lfi.Mblim.AsSpan(), lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan()); + + if ((mask4X4Int & 1) != 0) + { + LoopFilterAuto.LpfHorizontal4(s.Slice(4 * pitch), pitch, lfi.Mblim.AsSpan(), + lfi.Lim.AsSpan(), lfi.HevThr.AsSpan()); + } + } + } + else + { + LoopFilterAuto.LpfHorizontal4(s.Slice(4 * pitch), pitch, lfi.Mblim.AsSpan(), lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan()); + } + } + + s = s.Slice(8 * count); + lfl = lfl[count..]; + mask16X16 >>= count; + mask8X8 >>= count; + mask4X4 >>= count; + mask4X4Int >>= count; + } + } + + private static void HighbdFilterSelectivelyHoriz( + ArrayPtr s, + int pitch, + uint mask16X16, + uint mask8X8, + uint mask4X4, + uint mask4X4Int, + ReadOnlySpan lfthr, + ReadOnlySpan lfl, + int bd) + { + int count; + + for (uint mask = mask16X16 | mask8X8 | mask4X4 | mask4X4Int; mask != 0; mask >>= count) + { + count = 1; + if ((mask & 1) != 0) + { + LoopFilterThresh lfi = lfthr[lfl[0]]; + + if ((mask16X16 & 1) != 0) + { + if ((mask16X16 & 3) == 3) + { + LoopFilterScalar.HighBdLpfHorizontal16Dual(s, pitch, lfi.Mblim[0], lfi.Lim[0], + lfi.HevThr[0], bd); + count = 2; + } + else + { + LoopFilterScalar.HighBdLpfHorizontal16(s, pitch, lfi.Mblim[0], lfi.Lim[0], lfi.HevThr[0], + bd); + } + } + else if ((mask8X8 & 1) != 0) + { + if ((mask8X8 & 3) == 3) + { + // Next block's thresholds. + LoopFilterThresh lfin = lfthr[lfl[1]]; + + LoopFilterScalar.HighBdLpfHorizontal8Dual( + s, + pitch, + lfi.Mblim[0], + lfi.Lim[0], + lfi.HevThr[0], + lfin.Mblim[0], + lfin.Lim[0], + lfin.HevThr[0], + bd); + + if ((mask4X4Int & 3) == 3) + { + LoopFilterScalar.HighBdLpfHorizontal4Dual( + s.Slice(4 * pitch), + pitch, + lfi.Mblim[0], + lfi.Lim[0], + lfi.HevThr[0], + lfin.Mblim[0], + lfin.Lim[0], + lfin.HevThr[0], + bd); + } + else if ((mask4X4Int & 1) != 0) + { + LoopFilterScalar.HighBdLpfHorizontal4(s.Slice(4 * pitch), pitch, lfi.Mblim[0], + lfi.Lim[0], lfi.HevThr[0], bd); + } + else if ((mask4X4Int & 2) != 0) + { + LoopFilterScalar.HighBdLpfHorizontal4(s.Slice(8 + (4 * pitch)), pitch, lfin.Mblim[0], + lfin.Lim[0], lfin.HevThr[0], bd); + } + + count = 2; + } + else + { + LoopFilterScalar.HighBdLpfHorizontal8(s, pitch, lfi.Mblim[0], lfi.Lim[0], lfi.HevThr[0], + bd); + + if ((mask4X4Int & 1) != 0) + { + LoopFilterScalar.HighBdLpfHorizontal4(s.Slice(4 * pitch), pitch, lfi.Mblim[0], + lfi.Lim[0], lfi.HevThr[0], bd); + } + } + } + else if ((mask4X4 & 1) != 0) + { + if ((mask4X4 & 3) == 3) + { + // Next block's thresholds. + LoopFilterThresh lfin = lfthr[lfl[1]]; + + LoopFilterScalar.HighBdLpfHorizontal4Dual( + s, + pitch, + lfi.Mblim[0], + lfi.Lim[0], + lfi.HevThr[0], + lfin.Mblim[0], + lfin.Lim[0], + lfin.HevThr[0], + bd); + + if ((mask4X4Int & 3) == 3) + { + LoopFilterScalar.HighBdLpfHorizontal4Dual( + s.Slice(4 * pitch), + pitch, + lfi.Mblim[0], + lfi.Lim[0], + lfi.HevThr[0], + lfin.Mblim[0], + lfin.Lim[0], + lfin.HevThr[0], + bd); + } + else if ((mask4X4Int & 1) != 0) + { + LoopFilterScalar.HighBdLpfHorizontal4(s.Slice(4 * pitch), pitch, lfi.Mblim[0], + lfi.Lim[0], lfi.HevThr[0], bd); + } + else if ((mask4X4Int & 2) != 0) + { + LoopFilterScalar.HighBdLpfHorizontal4(s.Slice(8 + (4 * pitch)), pitch, lfin.Mblim[0], + lfin.Lim[0], lfin.HevThr[0], bd); + } + + count = 2; + } + else + { + LoopFilterScalar.HighBdLpfHorizontal4(s, pitch, lfi.Mblim[0], lfi.Lim[0], lfi.HevThr[0], + bd); + + if ((mask4X4Int & 1) != 0) + { + LoopFilterScalar.HighBdLpfHorizontal4(s.Slice(4 * pitch), pitch, lfi.Mblim[0], + lfi.Lim[0], lfi.HevThr[0], bd); + } + } + } + else + { + LoopFilterScalar.HighBdLpfHorizontal4(s.Slice(4 * pitch), pitch, lfi.Mblim[0], lfi.Lim[0], + lfi.HevThr[0], bd); + } + } + + s = s.Slice(8 * count); + lfl = lfl[count..]; + mask16X16 >>= count; + mask8X8 >>= count; + mask4X4 >>= count; + mask4X4Int >>= count; + } + } + + private static void FilterSelectivelyVert( + ArrayPtr s, + int pitch, + uint mask16X16, + uint mask8X8, + uint mask4X4, + uint mask4X4Int, + ReadOnlySpan lfthr, + ReadOnlySpan lfl) + { + for (uint mask = mask16X16 | mask8X8 | mask4X4 | mask4X4Int; mask != 0; mask >>= 1) + { + LoopFilterThresh lfi = lfthr[lfl[0]]; + + if ((mask & 1) != 0) + { + if ((mask16X16 & 1) != 0) + { + LoopFilterAuto.LpfVertical16(s, pitch, lfi.Mblim.AsSpan(), lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan()); + } + else if ((mask8X8 & 1) != 0) + { + LoopFilterAuto.LpfVertical8(s, pitch, lfi.Mblim.AsSpan(), lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan()); + } + else if ((mask4X4 & 1) != 0) + { + LoopFilterAuto.LpfVertical4(s, pitch, lfi.Mblim.AsSpan(), lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan()); + } + } + + if ((mask4X4Int & 1) != 0) + { + LoopFilterAuto.LpfVertical4(s.Slice(4), pitch, lfi.Mblim.AsSpan(), lfi.Lim.AsSpan(), + lfi.HevThr.AsSpan()); + } + + s = s.Slice(8); + lfl = lfl[1..]; + mask16X16 >>= 1; + mask8X8 >>= 1; + mask4X4 >>= 1; + mask4X4Int >>= 1; + } + } + + private static void HighbdFilterSelectivelyVert( + ArrayPtr s, + int pitch, + uint mask16X16, + uint mask8X8, + uint mask4X4, + uint mask4X4Int, + ReadOnlySpan lfthr, + ReadOnlySpan lfl, + int bd) + { + for (uint mask = mask16X16 | mask8X8 | mask4X4 | mask4X4Int; mask != 0; mask >>= 1) + { + LoopFilterThresh lfi = lfthr[lfl[0]]; + + if ((mask & 1) != 0) + { + if ((mask16X16 & 1) != 0) + { + LoopFilterScalar.HighBdLpfVertical16(s, pitch, lfi.Mblim[0], lfi.Lim[0], lfi.HevThr[0], bd); + } + else if ((mask8X8 & 1) != 0) + { + LoopFilterScalar.HighBdLpfVertical8(s, pitch, lfi.Mblim[0], lfi.Lim[0], lfi.HevThr[0], bd); + } + else if ((mask4X4 & 1) != 0) + { + LoopFilterScalar.HighBdLpfVertical4(s, pitch, lfi.Mblim[0], lfi.Lim[0], lfi.HevThr[0], bd); + } + } + + if ((mask4X4Int & 1) != 0) + { + LoopFilterScalar.HighBdLpfVertical4(s.Slice(4), pitch, lfi.Mblim[0], lfi.Lim[0], lfi.HevThr[0], bd); + } + + s = s.Slice(8); + lfl = lfl[1..]; + mask16X16 >>= 1; + mask8X8 >>= 1; + mask4X4 >>= 1; + mask4X4Int >>= 1; + } + } + + private static readonly byte[] _num4X4BlocksWideLookup = [1, 1, 2, 2, 2, 4, 4, 4, 8, 8, 8, 16, 16]; + private static readonly byte[] _num4X4BlocksHighLookup = [1, 2, 1, 2, 4, 2, 4, 8, 4, 8, 16, 8, 16]; + private static readonly byte[] _num8X8BlocksWideLookup = [1, 1, 1, 1, 1, 2, 2, 2, 4, 4, 4, 8, 8]; + private static readonly byte[] _num8X8BlocksHighLookup = [1, 1, 1, 1, 2, 1, 2, 4, 2, 4, 8, 4, 8]; + + private static void FilterBlockPlaneNon420( + ref Vp9Common cm, + ref MacroBlockDPlane plane, + ArrayPtr> mi8X8, + int miRow, + int miCol) + { + int ssX = plane.SubsamplingX; + int ssY = plane.SubsamplingY; + int rowStep = 1 << ssY; + int colStep = 1 << ssX; + int rowStepStride = cm.MiStride * rowStep; + ref Buf2D dst = ref plane.Dst; + ArrayPtr dst0 = dst.Buf; + Span mask16X16 = stackalloc int[Constants.MiBlockSize]; + Span mask8X8 = stackalloc int[Constants.MiBlockSize]; + Span mask4X4 = stackalloc int[Constants.MiBlockSize]; + Span mask4X4Int = stackalloc int[Constants.MiBlockSize]; + Span lfl = stackalloc byte[Constants.MiBlockSize * Constants.MiBlockSize]; + + for (int r = 0; r < Constants.MiBlockSize && miRow + r < cm.MiRows; r += rowStep) + { + uint mask16X16C = 0; + uint mask8X8C = 0; + uint mask4X4C = 0; + uint borderMask; + + // Determine the vertical edges that need filtering + for (int c = 0; c < Constants.MiBlockSize && miCol + c < cm.MiCols; c += colStep) + { + ref ModeInfo mi = ref mi8X8[c].Value; + BlockSize sbType = mi.SbType; + bool skipThis = mi.Skip != 0 && mi.IsInterBlock(); + // left edge of current unit is block/partition edge -> no skip + bool blockEdgeLeft = _num4X4BlocksWideLookup[(int)sbType] <= 1 || (c & (_num8X8BlocksWideLookup[(int)sbType] - 1)) == 0; + bool skipThisC = skipThis && !blockEdgeLeft; + // top edge of current unit is block/partition edge -> no skip + bool blockEdgeAbove = _num4X4BlocksHighLookup[(int)sbType] <= 1 || (r & (_num8X8BlocksHighLookup[(int)sbType] - 1)) == 0; + bool skipThisR = skipThis && !blockEdgeAbove; + TxSize txSize = mi.GetUvTxSize(ref plane); + bool skipBorder4X4C = ssX != 0 && miCol + c == cm.MiCols - 1; + bool skipBorder4X4R = ssY != 0 && miRow + r == cm.MiRows - 1; + + // Filter level can vary per MI + if ((lfl[(r << 3) + (c >> ssX)] = GetFilterLevel(ref cm.LfInfo, ref mi)) == 0) + { + continue; + } + + // Build masks based on the transform size of each block + if (txSize == TxSize.Tx32X32) + { + if (!skipThisC && ((c >> ssX) & 3) == 0) + { + if (!skipBorder4X4C) + { + mask16X16C |= 1u << (c >> ssX); + } + else + { + mask8X8C |= 1u << (c >> ssX); + } + } + + if (!skipThisR && ((r >> ssY) & 3) == 0) + { + if (!skipBorder4X4R) + { + mask16X16[r] |= 1 << (c >> ssX); + } + else + { + mask8X8[r] |= 1 << (c >> ssX); + } + } + } + else if (txSize == TxSize.Tx16X16) + { + if (!skipThisC && ((c >> ssX) & 1) == 0) + { + if (!skipBorder4X4C) + { + mask16X16C |= 1u << (c >> ssX); + } + else + { + mask8X8C |= 1u << (c >> ssX); + } + } + + if (!skipThisR && ((r >> ssY) & 1) == 0) + { + if (!skipBorder4X4R) + { + mask16X16[r] |= 1 << (c >> ssX); + } + else + { + mask8X8[r] |= 1 << (c >> ssX); + } + } + } + else + { + // force 8x8 filtering on 32x32 boundaries + if (!skipThisC) + { + if (txSize == TxSize.Tx8X8 || ((c >> ssX) & 3) == 0) + { + mask8X8C |= 1u << (c >> ssX); + } + else + { + mask4X4C |= 1u << (c >> ssX); + } + } + + if (!skipThisR) + { + if (txSize == TxSize.Tx8X8 || ((r >> ssY) & 3) == 0) + { + mask8X8[r] |= 1 << (c >> ssX); + } + else + { + mask4X4[r] |= 1 << (c >> ssX); + } + } + + if (!skipThis && txSize < TxSize.Tx8X8 && !skipBorder4X4C) + { + mask4X4Int[r] |= 1 << (c >> ssX); + } + } + } + + // Disable filtering on the leftmost column + borderMask = ~(miCol == 0 ? 1u : 0u); + + if (cm.UseHighBitDepth) + { + HighbdFilterSelectivelyVert( + ConvertToUshortPtr(dst.Buf), + dst.Stride, + mask16X16C & borderMask, + mask8X8C & borderMask, + mask4X4C & borderMask, + (uint)mask4X4Int[r], + cm.LfInfo.Lfthr.AsSpan(), + lfl[(r << 3)..], + (int)cm.BitDepth); + } + else + { + FilterSelectivelyVert( + dst.Buf, + dst.Stride, + mask16X16C & borderMask, + mask8X8C & borderMask, + mask4X4C & borderMask, + (uint)mask4X4Int[r], + cm.LfInfo.Lfthr.AsSpan(), + lfl[(r << 3)..]); + } + + dst.Buf = dst.Buf.Slice(8 * dst.Stride); + mi8X8 = mi8X8.Slice(rowStepStride); + } + + // Now do horizontal pass + dst.Buf = dst0; + for (int r = 0; r < Constants.MiBlockSize && miRow + r < cm.MiRows; r += rowStep) + { + bool skipBorder4X4R = ssY != 0 && miRow + r == cm.MiRows - 1; + uint mask4X4IntR = skipBorder4X4R ? 0u : (uint)mask4X4Int[r]; + + uint mask16X16R; + uint mask8X8R; + uint mask4X4R; + + if (miRow + r == 0) + { + mask16X16R = 0; + mask8X8R = 0; + mask4X4R = 0; + } + else + { + mask16X16R = (uint)mask16X16[r]; + mask8X8R = (uint)mask8X8[r]; + mask4X4R = (uint)mask4X4[r]; + } + + if (cm.UseHighBitDepth) + { + HighbdFilterSelectivelyHoriz( + ConvertToUshortPtr(dst.Buf), + dst.Stride, + mask16X16R, + mask8X8R, + mask4X4R, + mask4X4IntR, + cm.LfInfo.Lfthr.AsSpan(), + lfl[(r << 3)..], + (int)cm.BitDepth); + } + else + { + FilterSelectivelyHoriz( + dst.Buf, + dst.Stride, + mask16X16R, + mask8X8R, + mask4X4R, + mask4X4IntR, + cm.LfInfo.Lfthr.AsSpan(), + lfl[(r << 3)..]); + } + + dst.Buf = dst.Buf.Slice(8 * dst.Stride); + } + } + + private static void FilterBlockPlaneSs00(ref Vp9Common cm, ref MacroBlockDPlane plane, int miRow, + ref LoopFilterMask lfm) + { + ref Buf2D dst = ref plane.Dst; + ArrayPtr dst0 = dst.Buf; + ulong mask16X16 = lfm.LeftY[(int)TxSize.Tx16X16]; + ulong mask8X8 = lfm.LeftY[(int)TxSize.Tx8X8]; + ulong mask4X4 = lfm.LeftY[(int)TxSize.Tx4X4]; + ulong mask4X4Int = lfm.Int4X4Y; + + Debug.Assert(plane.SubsamplingX == 0 && plane.SubsamplingY == 0); + + // Vertical pass: do 2 rows at one time + for (int r = 0; r < Constants.MiBlockSize && miRow + r < cm.MiRows; r += 2) + { + if (cm.UseHighBitDepth) + { + // Disable filtering on the leftmost column. + HighbdFilterSelectivelyVertRow2( + plane.SubsamplingX, + ConvertToUshortPtr(dst.Buf), + dst.Stride, + (uint)mask16X16, + (uint)mask8X8, + (uint)mask4X4, + (uint)mask4X4Int, + cm.LfInfo.Lfthr.AsSpan(), + lfm.LflY.AsSpan()[(r << 3)..], + (int)cm.BitDepth); + } + else + { + // Disable filtering on the leftmost column. + FilterSelectivelyVertRow2( + plane.SubsamplingX, + dst.Buf, + dst.Stride, + (uint)mask16X16, + (uint)mask8X8, + (uint)mask4X4, + (uint)mask4X4Int, + cm.LfInfo.Lfthr.AsSpan(), + lfm.LflY.AsSpan()[(r << 3)..]); + } + + dst.Buf = dst.Buf.Slice(16 * dst.Stride); + mask16X16 >>= 16; + mask8X8 >>= 16; + mask4X4 >>= 16; + mask4X4Int >>= 16; + } + + // Horizontal pass + dst.Buf = dst0; + mask16X16 = lfm.AboveY[(int)TxSize.Tx16X16]; + mask8X8 = lfm.AboveY[(int)TxSize.Tx8X8]; + mask4X4 = lfm.AboveY[(int)TxSize.Tx4X4]; + mask4X4Int = lfm.Int4X4Y; + + for (int r = 0; r < Constants.MiBlockSize && miRow + r < cm.MiRows; r++) + { + uint mask16X16R; + uint mask8X8R; + uint mask4X4R; + + if (miRow + r == 0) + { + mask16X16R = 0; + mask8X8R = 0; + mask4X4R = 0; + } + else + { + mask16X16R = (uint)mask16X16 & 0xff; + mask8X8R = (uint)mask8X8 & 0xff; + mask4X4R = (uint)mask4X4 & 0xff; + } + + if (cm.UseHighBitDepth) + { + HighbdFilterSelectivelyHoriz( + ConvertToUshortPtr(dst.Buf), + dst.Stride, + mask16X16R, + mask8X8R, + mask4X4R, + (uint)mask4X4Int & 0xff, + cm.LfInfo.Lfthr.AsSpan(), + lfm.LflY.AsSpan()[(r << 3)..], + (int)cm.BitDepth); + } + else + { + FilterSelectivelyHoriz( + dst.Buf, + dst.Stride, + mask16X16R, + mask8X8R, + mask4X4R, + (uint)mask4X4Int & 0xff, + cm.LfInfo.Lfthr.AsSpan(), + lfm.LflY.AsSpan()[(r << 3)..]); + } + + dst.Buf = dst.Buf.Slice(8 * dst.Stride); + mask16X16 >>= 8; + mask8X8 >>= 8; + mask4X4 >>= 8; + mask4X4Int >>= 8; + } + } + + private static void FilterBlockPlaneSs11(ref Vp9Common cm, ref MacroBlockDPlane plane, int miRow, + ref LoopFilterMask lfm) + { + Buf2D dst = plane.Dst; + ArrayPtr dst0 = dst.Buf; + + Span lflUv = stackalloc byte[16]; + + ushort mask16X16 = lfm.LeftUv[(int)TxSize.Tx16X16]; + ushort mask8X8 = lfm.LeftUv[(int)TxSize.Tx8X8]; + ushort mask4X4 = lfm.LeftUv[(int)TxSize.Tx4X4]; + ushort mask4X4Int = lfm.Int4X4Uv; + + Debug.Assert(plane.SubsamplingX == 1 && plane.SubsamplingY == 1); + + // Vertical pass: do 2 rows at one time + for (int r = 0; r < Constants.MiBlockSize && miRow + r < cm.MiRows; r += 4) + { + for (int c = 0; c < Constants.MiBlockSize >> 1; c++) + { + lflUv[(r << 1) + c] = lfm.LflY[(r << 3) + (c << 1)]; + lflUv[((r + 2) << 1) + c] = lfm.LflY[((r + 2) << 3) + (c << 1)]; + } + + if (cm.UseHighBitDepth) + { + // Disable filtering on the leftmost column. + HighbdFilterSelectivelyVertRow2( + plane.SubsamplingX, + ConvertToUshortPtr(dst.Buf), + dst.Stride, + mask16X16, + mask8X8, + mask4X4, + mask4X4Int, + cm.LfInfo.Lfthr.AsSpan(), + lflUv[(r << 1)..], + (int)cm.BitDepth); + } + else + { + // Disable filtering on the leftmost column. + FilterSelectivelyVertRow2( + plane.SubsamplingX, + dst.Buf, + dst.Stride, + mask16X16, + mask8X8, + mask4X4, + mask4X4Int, + cm.LfInfo.Lfthr.AsSpan(), + lflUv[(r << 1)..]); + } + + dst.Buf = dst.Buf.Slice(16 * dst.Stride); + mask16X16 >>= 8; + mask8X8 >>= 8; + mask4X4 >>= 8; + mask4X4Int >>= 8; + } + + // Horizontal pass + dst.Buf = dst0; + mask16X16 = lfm.AboveUv[(int)TxSize.Tx16X16]; + mask8X8 = lfm.AboveUv[(int)TxSize.Tx8X8]; + mask4X4 = lfm.AboveUv[(int)TxSize.Tx4X4]; + mask4X4Int = lfm.Int4X4Uv; + + for (int r = 0; r < Constants.MiBlockSize && miRow + r < cm.MiRows; r += 2) + { + bool skipBorder4X4R = miRow + r == cm.MiRows - 1; + uint mask4X4IntR = skipBorder4X4R ? 0u : (uint)mask4X4Int & 0xf; + uint mask16X16R; + uint mask8X8R; + uint mask4X4R; + + if (miRow + r == 0) + { + mask16X16R = 0; + mask8X8R = 0; + mask4X4R = 0; + } + else + { + mask16X16R = (uint)mask16X16 & 0xf; + mask8X8R = (uint)mask8X8 & 0xf; + mask4X4R = (uint)mask4X4 & 0xf; + } + + if (cm.UseHighBitDepth) + { + HighbdFilterSelectivelyHoriz( + ConvertToUshortPtr(dst.Buf), + dst.Stride, + mask16X16R, + mask8X8R, + mask4X4R, + mask4X4IntR, + cm.LfInfo.Lfthr.AsSpan(), + lflUv[(r << 1)..], + (int)cm.BitDepth); + } + else + { + FilterSelectivelyHoriz( + dst.Buf, + dst.Stride, + mask16X16R, + mask8X8R, + mask4X4R, + mask4X4IntR, + cm.LfInfo.Lfthr.AsSpan(), + lflUv[(r << 1)..]); + } + + dst.Buf = dst.Buf.Slice(8 * dst.Stride); + mask16X16 >>= 4; + mask8X8 >>= 4; + mask4X4 >>= 4; + mask4X4Int >>= 4; + } + } + + private enum LfPath + { + LfPathSlow, + LfPath420, + LfPath444 + } + + private static void LoopFilterRows( + ref Surface frameBuffer, + ref Vp9Common cm, + Array3 planes, + int start, + int stop, + int step, + bool yOnly, + LfSync lfSync) + { + int numPlanes = yOnly ? 1 : Constants.MaxMbPlane; + int sbCols = TileInfo.MiColsAlignedToSb(cm.MiCols) >> Constants.MiBlockSizeLog2; + LfPath path; + int miRow, miCol; + + if (yOnly) + { + path = LfPath.LfPath444; + } + else if (planes[1].SubsamplingY == 1 && planes[1].SubsamplingX == 1) + { + path = LfPath.LfPath420; + } + else if (planes[1].SubsamplingY == 0 && planes[1].SubsamplingX == 0) + { + path = LfPath.LfPath444; + } + else + { + path = LfPath.LfPathSlow; + } + + for (miRow = start; miRow < stop; miRow += step) + { + ArrayPtr> mi = cm.MiGridVisible.Slice(miRow * cm.MiStride); + Span lfm = GetLfm(ref cm.Lf, miRow, 0); + + for (miCol = 0; miCol < cm.MiCols; miCol += Constants.MiBlockSize, lfm = lfm[1..]) + { + int r = miRow >> Constants.MiBlockSizeLog2; + int c = miCol >> Constants.MiBlockSizeLog2; + int plane; + + lfSync.SyncRead(r, c); + + ReconInter.SetupDstPlanes(ref planes, ref frameBuffer, miRow, miCol); + + AdjustMask(ref cm, miRow, miCol, ref lfm[0]); + + FilterBlockPlaneSs00(ref cm, ref planes[0], miRow, ref lfm[0]); + for (plane = 1; plane < numPlanes; ++plane) + { + switch (path) + { + case LfPath.LfPath420: + FilterBlockPlaneSs11(ref cm, ref planes[plane], miRow, ref lfm[0]); + break; + case LfPath.LfPath444: + FilterBlockPlaneSs00(ref cm, ref planes[plane], miRow, ref lfm[0]); + break; + case LfPath.LfPathSlow: + FilterBlockPlaneNon420(ref cm, ref planes[plane], mi.Slice(miCol), miRow, + miCol); + break; + } + } + + lfSync.SyncWrite(r, c, sbCols); + } + } + } + + public static void LoopFilterFrame( + ref Surface frame, + ref Vp9Common cm, + ref MacroBlockD xd, + int frameFilterLevel, + bool yOnly, + bool partialFrame) + { + if (frameFilterLevel == 0) + { + return; + } + + int startMiRow = 0; + int miRowsToFilter = cm.MiRows; + + if (partialFrame && cm.MiRows > 8) + { + startMiRow = cm.MiRows >> 1; + startMiRow &= ~7; + miRowsToFilter = Math.Max(cm.MiRows / 8, 8); + } + + int endMiRow = startMiRow + miRowsToFilter; + + LoopFilterRows(ref frame, ref cm, xd.Plane, startMiRow, endMiRow, Constants.MiBlockSize, yOnly, + default); + } + + private static void LoopFilterRowsMt( + ref Surface frameBuffer, + ref Vp9Common cm, + Array3 planes, + int start, + int stop, + bool yOnly, + int threadCount) + { + int sbRows = TileInfo.MiColsAlignedToSb(cm.MiRows) >> Constants.MiBlockSizeLog2; + int numTileCols = 1 << cm.Log2TileCols; + int numWorkers = Math.Min(threadCount, Math.Min(numTileCols, sbRows)); + + LfSync lfSync = new(); + lfSync.Initialize(cm.Width, sbRows); + + Ptr frameBufferPtr = new(ref frameBuffer); + Ptr cmPtr = new(ref cm); + + Parallel.For(0, numWorkers, n => + { + LoopFilterRows( + ref frameBufferPtr.Value, + ref cmPtr.Value, + planes, + start + (n * Constants.MiBlockSize), + stop, + numWorkers * Constants.MiBlockSize, + yOnly, + lfSync); + }); + } + + public static void LoopFilterFrameMt( + ref Surface frame, + ref Vp9Common cm, + ref MacroBlockD xd, + int frameFilterLevel, + bool yOnly, + bool partialFrame, + int threadCount) + { + if (frameFilterLevel == 0) + { + return; + } + + int startMiRow = 0; + int miRowsToFilter = cm.MiRows; + + if (partialFrame && cm.MiRows > 8) + { + startMiRow = cm.MiRows >> 1; + startMiRow &= ~7; + miRowsToFilter = Math.Max(cm.MiRows / 8, 8); + } + + int endMiRow = startMiRow + miRowsToFilter; + + LoopFilterFrameInit(ref cm, frameFilterLevel); + LoopFilterRowsMt(ref frame, ref cm, xd.Plane, startMiRow, endMiRow, yOnly, threadCount); + } + + private static unsafe ArrayPtr ConvertToUshortPtr(ArrayPtr s) + { + return new ArrayPtr((ushort*)s.ToPointer(), s.Length / 2); + } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Luts.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Luts.cs index 5245b3f32..acd771284 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Luts.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Luts.cs @@ -6,174 +6,182 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { internal static class Luts { - public static ReadOnlySpan SizeGroupLookup => new byte[] { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3 }; + public static ReadOnlySpan SizeGroupLookup => [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3]; - public static readonly BlockSize[][] SubsizeLookup = { - new[] - { // PARTITION_NONE - BlockSize.Block4x4, BlockSize.Block4x8, BlockSize.Block8x4, BlockSize.Block8x8, BlockSize.Block8x16, BlockSize.Block16x8, - BlockSize.Block16x16, BlockSize.Block16x32, BlockSize.Block32x16, BlockSize.Block32x32, BlockSize.Block32x64, - BlockSize.Block64x32, BlockSize.Block64x64, - }, - new[] - { // PARTITION_HORZ - BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block8x4, BlockSize.BlockInvalid, - BlockSize.BlockInvalid, BlockSize.Block16x8, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block32x16, - BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block64x32, - }, - new[] - { // PARTITION_VERT - BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block4x8, BlockSize.BlockInvalid, - BlockSize.BlockInvalid, BlockSize.Block8x16, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block16x32, - BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block32x64, - }, - new[] - { // PARTITION_SPLIT - BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block4x4, BlockSize.BlockInvalid, - BlockSize.BlockInvalid, BlockSize.Block8x8, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block16x16, - BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block32x32, - }, + public static readonly BlockSize[][] SubsizeLookup = new BlockSize[][] + { + [ // PARTITION_NONE + BlockSize.Block4X4, BlockSize.Block4X8, BlockSize.Block8X4, BlockSize.Block8X8, BlockSize.Block8X16, BlockSize.Block16X8, + BlockSize.Block16X16, BlockSize.Block16X32, BlockSize.Block32X16, BlockSize.Block32X32, BlockSize.Block32X64, + BlockSize.Block64X32, BlockSize.Block64X64 + ], + [ // PARTITION_HORZ + BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block8X4, BlockSize.BlockInvalid, + BlockSize.BlockInvalid, BlockSize.Block16X8, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block32X16, + BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block64X32 + ], + [ // PARTITION_VERT + BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block4X8, BlockSize.BlockInvalid, + BlockSize.BlockInvalid, BlockSize.Block8X16, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block16X32, + BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block32X64 + ], + [ // PARTITION_SPLIT + BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block4X4, BlockSize.BlockInvalid, + BlockSize.BlockInvalid, BlockSize.Block8X8, BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block16X16, + BlockSize.BlockInvalid, BlockSize.BlockInvalid, BlockSize.Block32X32 + ] }; - public static readonly TxSize[] MaxTxSizeLookup = { - TxSize.Tx4x4, TxSize.Tx4x4, TxSize.Tx4x4, TxSize.Tx8x8, TxSize.Tx8x8, TxSize.Tx8x8, TxSize.Tx16x16, - TxSize.Tx16x16, TxSize.Tx16x16, TxSize.Tx32x32, TxSize.Tx32x32, TxSize.Tx32x32, TxSize.Tx32x32, - }; + public static readonly TxSize[] MaxTxSizeLookup = + [ + TxSize.Tx4X4, TxSize.Tx4X4, TxSize.Tx4X4, TxSize.Tx8X8, TxSize.Tx8X8, TxSize.Tx8X8, TxSize.Tx16X16, + TxSize.Tx16X16, TxSize.Tx16X16, TxSize.Tx32X32, TxSize.Tx32X32, TxSize.Tx32X32, TxSize.Tx32X32 + ]; - public static readonly TxSize[] TxModeToBiggestTxSize = { - TxSize.Tx4x4, // ONLY_4X4 - TxSize.Tx8x8, // ALLOW_8X8 - TxSize.Tx16x16, // ALLOW_16X16 - TxSize.Tx32x32, // ALLOW_32X32 - TxSize.Tx32x32, // TX_MODE_SELECT - }; + public static readonly TxSize[] TxModeToBiggestTxSize = + [ + TxSize.Tx4X4, // ONLY_4X4 + TxSize.Tx8X8, // ALLOW_8X8 + TxSize.Tx16X16, // ALLOW_16X16 + TxSize.Tx32X32, // ALLOW_32X32 + TxSize.Tx32X32 // TX_MODE_SELECT + ]; - public static readonly BlockSize[][][] SsSizeLookup = { + public static readonly BlockSize[][][] SsSizeLookup = + [ // ss_x == 0 ss_x == 0 ss_x == 1 ss_x == 1 // ss_y == 0 ss_y == 1 ss_y == 0 ss_y == 1 - new[] { new[] { BlockSize.Block4x4, BlockSize.BlockInvalid }, new[] { BlockSize.BlockInvalid, BlockSize.BlockInvalid } }, - new[] { new[] { BlockSize.Block4x8, BlockSize.Block4x4 }, new[] { BlockSize.BlockInvalid, BlockSize.BlockInvalid } }, - new[] { new[] { BlockSize.Block8x4, BlockSize.BlockInvalid }, new[] { BlockSize.Block4x4, BlockSize.BlockInvalid } }, - new[] { new[] { BlockSize.Block8x8, BlockSize.Block8x4 }, new[] { BlockSize.Block4x8, BlockSize.Block4x4 } }, - new[] { new[] { BlockSize.Block8x16, BlockSize.Block8x8 }, new[] { BlockSize.BlockInvalid, BlockSize.Block4x8 } }, - new[] { new[] { BlockSize.Block16x8, BlockSize.BlockInvalid }, new[] { BlockSize.Block8x8, BlockSize.Block8x4 } }, - new[] { new[] { BlockSize.Block16x16, BlockSize.Block16x8 }, new[] { BlockSize.Block8x16, BlockSize.Block8x8 } }, - new[] { new[] { BlockSize.Block16x32, BlockSize.Block16x16 }, new[] { BlockSize.BlockInvalid, BlockSize.Block8x16 } }, - new[] { new[] { BlockSize.Block32x16, BlockSize.BlockInvalid }, new[] { BlockSize.Block16x16, BlockSize.Block16x8 } }, - new[] { new[] { BlockSize.Block32x32, BlockSize.Block32x16 }, new[] { BlockSize.Block16x32, BlockSize.Block16x16 } }, - new[] { new[] { BlockSize.Block32x64, BlockSize.Block32x32 }, new[] { BlockSize.BlockInvalid, BlockSize.Block16x32 } }, - new[] { new[] { BlockSize.Block64x32, BlockSize.BlockInvalid }, new[] { BlockSize.Block32x32, BlockSize.Block32x16 } }, - new[] { new[] { BlockSize.Block64x64, BlockSize.Block64x32 }, new[] { BlockSize.Block32x64, BlockSize.Block32x32 } }, - }; + new BlockSize[][] { [BlockSize.Block4X4, BlockSize.BlockInvalid], [BlockSize.BlockInvalid, BlockSize.BlockInvalid + ] + }, + new BlockSize[][] { [BlockSize.Block4X8, BlockSize.Block4X4], [BlockSize.BlockInvalid, BlockSize.BlockInvalid + ] + }, + new BlockSize[][] { [BlockSize.Block8X4, BlockSize.BlockInvalid], [BlockSize.Block4X4, BlockSize.BlockInvalid + ] + }, + new BlockSize[][] { [BlockSize.Block8X8, BlockSize.Block8X4], [BlockSize.Block4X8, BlockSize.Block4X4] }, + new BlockSize[][] { [BlockSize.Block8X16, BlockSize.Block8X8], [BlockSize.BlockInvalid, BlockSize.Block4X8] + }, + new BlockSize[][] { [BlockSize.Block16X8, BlockSize.BlockInvalid], [BlockSize.Block8X8, BlockSize.Block8X4] + }, + new BlockSize[][] { [BlockSize.Block16X16, BlockSize.Block16X8], [BlockSize.Block8X16, BlockSize.Block8X8] }, + new BlockSize[][] { [BlockSize.Block16X32, BlockSize.Block16X16], [BlockSize.BlockInvalid, BlockSize.Block8X16 + ] + }, + new BlockSize[][] { [BlockSize.Block32X16, BlockSize.BlockInvalid], [BlockSize.Block16X16, BlockSize.Block16X8 + ] + }, + new BlockSize[][] { [BlockSize.Block32X32, BlockSize.Block32X16], [BlockSize.Block16X32, BlockSize.Block16X16 + ] + }, + new BlockSize[][] { [BlockSize.Block32X64, BlockSize.Block32X32], [BlockSize.BlockInvalid, BlockSize.Block16X32 + ] + }, + new BlockSize[][] { [BlockSize.Block64X32, BlockSize.BlockInvalid], [BlockSize.Block32X32, BlockSize.Block32X16 + ] + }, + new BlockSize[][] { [BlockSize.Block64X64, BlockSize.Block64X32], [BlockSize.Block32X64, BlockSize.Block32X32 + ] + } + ]; - public static readonly TxSize[][][][] UvTxsizeLookup = { - // ss_x == 0 ss_x == 0 ss_x == 1 ss_x == 1 + public static readonly TxSize[][][][] UvTxsizeLookup = + [ + // ss_x == 0 ss_x == 0 ss_x == 1 ss_x == 1 // ss_y == 0 ss_y == 1 ss_y == 0 ss_y == 1 - new[] - { - // BLOCK_4X4 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - }, - new[] - { - // BLOCK_4X8 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - }, - new[] - { - // BLOCK_8X4 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - }, - new[] - { - // BLOCK_8X8 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - }, - new[] - { - // BLOCK_8X16 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - }, - new[] - { - // BLOCK_16X8 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx8x8, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx4x4 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - }, - new[] - { - // BLOCK_16X16 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx16x16, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx16x16, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - }, - new[] - { - // BLOCK_16X32 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - }, - new[] - { - // BLOCK_32X16 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx16x16, TxSize.Tx8x8 }, new[] { TxSize.Tx16x16, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx16x16, TxSize.Tx8x8 }, new[] { TxSize.Tx16x16, TxSize.Tx8x8 } }, - }, - new[] - { - // BLOCK_32X32 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, - new[] { new[] { TxSize.Tx32x32, TxSize.Tx16x16 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, - }, - new[] - { - // BLOCK_32X64 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, - new[] { new[] { TxSize.Tx32x32, TxSize.Tx32x32 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, - }, - new[] - { - // BLOCK_64X32 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, - new[] { new[] { TxSize.Tx32x32, TxSize.Tx16x16 }, new[] { TxSize.Tx32x32, TxSize.Tx16x16 } }, - }, - new[] - { - // BLOCK_64X64 - new[] { new[] { TxSize.Tx4x4, TxSize.Tx4x4 }, new[] { TxSize.Tx4x4, TxSize.Tx4x4 } }, - new[] { new[] { TxSize.Tx8x8, TxSize.Tx8x8 }, new[] { TxSize.Tx8x8, TxSize.Tx8x8 } }, - new[] { new[] { TxSize.Tx16x16, TxSize.Tx16x16 }, new[] { TxSize.Tx16x16, TxSize.Tx16x16 } }, - new[] { new[] { TxSize.Tx32x32, TxSize.Tx32x32 }, new[] { TxSize.Tx32x32, TxSize.Tx32x32 } }, - }, - }; + [ + // BLOCK_4X4 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] } + ], + [ + // BLOCK_4x8 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] } + ], + [ + // BLOCK_8x4 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] } + ], + [ + // BLOCK_8X8 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] } + ], + [ + // BLOCK_8x16 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx8X8], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx8X8], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx8X8], [TxSize.Tx4X4, TxSize.Tx4X4] } + ], + [ + // BLOCK_16x8 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx4X4], [TxSize.Tx8X8, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx4X4], [TxSize.Tx8X8, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx4X4], [TxSize.Tx8X8, TxSize.Tx8X8] } + ], + [ + // BLOCK_16X16 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx8X8], [TxSize.Tx8X8, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx16X16, TxSize.Tx8X8], [TxSize.Tx8X8, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx16X16, TxSize.Tx8X8], [TxSize.Tx8X8, TxSize.Tx8X8] } + ], + [ + // BLOCK_16x32 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx8X8], [TxSize.Tx8X8, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx16X16, TxSize.Tx16X16], [TxSize.Tx8X8, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx16X16, TxSize.Tx16X16], [TxSize.Tx8X8, TxSize.Tx8X8] } + ], + [ + // BLOCK_32x16 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx8X8], [TxSize.Tx8X8, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx16X16, TxSize.Tx8X8], [TxSize.Tx16X16, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx16X16, TxSize.Tx8X8], [TxSize.Tx16X16, TxSize.Tx8X8] } + ], + [ + // BLOCK_32X32 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx8X8], [TxSize.Tx8X8, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx16X16, TxSize.Tx16X16], [TxSize.Tx16X16, TxSize.Tx16X16] }, + new TxSize[][] { [TxSize.Tx32X32, TxSize.Tx16X16], [TxSize.Tx16X16, TxSize.Tx16X16] } + ], + [ + // BLOCK_32x64 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx8X8], [TxSize.Tx8X8, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx16X16, TxSize.Tx16X16], [TxSize.Tx16X16, TxSize.Tx16X16] }, + new TxSize[][] { [TxSize.Tx32X32, TxSize.Tx32X32], [TxSize.Tx16X16, TxSize.Tx16X16] } + ], + [ + // BLOCK_64x32 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx8X8], [TxSize.Tx8X8, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx16X16, TxSize.Tx16X16], [TxSize.Tx16X16, TxSize.Tx16X16] }, + new TxSize[][] { [TxSize.Tx32X32, TxSize.Tx16X16], [TxSize.Tx32X32, TxSize.Tx16X16] } + ], + [ + // BLOCK_64x64 + new TxSize[][] { [TxSize.Tx4X4, TxSize.Tx4X4], [TxSize.Tx4X4, TxSize.Tx4X4] }, + new TxSize[][] { [TxSize.Tx8X8, TxSize.Tx8X8], [TxSize.Tx8X8, TxSize.Tx8X8] }, + new TxSize[][] { [TxSize.Tx16X16, TxSize.Tx16X16], [TxSize.Tx16X16, TxSize.Tx16X16] }, + new TxSize[][] { [TxSize.Tx32X32, TxSize.Tx32X32], [TxSize.Tx32X32, TxSize.Tx32X32] } + ] + ]; public struct PartitionContextPair { @@ -190,25 +198,27 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // Generates 4 bit field in which each bit set to 1 represents // a blocksize partition 1111 means we split 64x64, 32x32, 16x16 // and 8x8. 1000 means we just split the 64x64 to 32x32 - public static readonly PartitionContextPair[] PartitionContextLookup = { - new(15, 15), // 4X4 - {0b1111, 0b1111} - new(15, 14), // 4X8 - {0b1111, 0b1110} - new(14, 15), // 8X4 - {0b1110, 0b1111} - new(14, 14), // 8X8 - {0b1110, 0b1110} - new(14, 12), // 8X16 - {0b1110, 0b1100} - new(12, 14), // 16X8 - {0b1100, 0b1110} - new(12, 12), // 16X16 - {0b1100, 0b1100} - new(12, 8), // 16X32 - {0b1100, 0b1000} - new(8, 12), // 32X16 - {0b1000, 0b1100} - new(8, 8), // 32X32 - {0b1000, 0b1000} - new(8, 0), // 32X64 - {0b1000, 0b0000} - new(0, 8), // 64X32 - {0b0000, 0b1000} - new(0, 0), // 64X64 - {0b0000, 0b0000} - }; + public static readonly PartitionContextPair[] PartitionContextLookup = + [ + new(15, 15), // 4X4 - {0b1111, 0b1111} + new(15, 14), // 4x8 - {0b1111, 0b1110} + new(14, 15), // 8x4 - {0b1110, 0b1111} + new(14, 14), // 8X8 - {0b1110, 0b1110} + new(14, 12), // 8x16 - {0b1110, 0b1100} + new(12, 14), // 16x8 - {0b1100, 0b1110} + new(12, 12), // 16X16 - {0b1100, 0b1100} + new(12, 8), // 16x32 - {0b1100, 0b1000} + new(8, 12), // 32x16 - {0b1000, 0b1100} + new(8, 8), // 32X32 - {0b1000, 0b1000} + new(8, 0), // 32x64 - {0b1000, 0b0000} + new(0, 8), // 64x32 - {0b0000, 0b1000} + new(0, 0) // 64x64 - {0b0000, 0b0000} + ]; // Filter - private static readonly Array8[] _bilinearFilters = { + private static readonly Array8[] _bilinearFilters = + [ NewArray8Short(0, 0, 0, 128, 0, 0, 0, 0), NewArray8Short(0, 0, 0, 120, 8, 0, 0, 0), NewArray8Short(0, 0, 0, 112, 16, 0, 0, 0), NewArray8Short(0, 0, 0, 104, 24, 0, 0, 0), NewArray8Short(0, 0, 0, 96, 32, 0, 0, 0), NewArray8Short(0, 0, 0, 88, 40, 0, 0, 0), @@ -216,11 +226,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 NewArray8Short(0, 0, 0, 64, 64, 0, 0, 0), NewArray8Short(0, 0, 0, 56, 72, 0, 0, 0), NewArray8Short(0, 0, 0, 48, 80, 0, 0, 0), NewArray8Short(0, 0, 0, 40, 88, 0, 0, 0), NewArray8Short(0, 0, 0, 32, 96, 0, 0, 0), NewArray8Short(0, 0, 0, 24, 104, 0, 0, 0), - NewArray8Short(0, 0, 0, 16, 112, 0, 0, 0), NewArray8Short(0, 0, 0, 8, 120, 0, 0, 0), - }; + NewArray8Short(0, 0, 0, 16, 112, 0, 0, 0), NewArray8Short(0, 0, 0, 8, 120, 0, 0, 0) + ]; // Lagrangian interpolation filter - private static readonly Array8[] _subPelFilters8 = { + private static readonly Array8[] _subPelFilters8 = + [ NewArray8Short(0, 0, 0, 128, 0, 0, 0, 0), NewArray8Short(0, 1, -5, 126, 8, -3, 1, 0), NewArray8Short(-1, 3, -10, 122, 18, -6, 2, 0), NewArray8Short(-1, 4, -13, 118, 27, -9, 3, -1), NewArray8Short(-1, 4, -16, 112, 37, -11, 4, -1), NewArray8Short(-1, 5, -18, 105, 48, -14, 4, -1), @@ -228,11 +239,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 NewArray8Short(-1, 6, -19, 78, 78, -19, 6, -1), NewArray8Short(-1, 5, -18, 68, 88, -19, 6, -1), NewArray8Short(-1, 5, -16, 58, 97, -19, 5, -1), NewArray8Short(-1, 4, -14, 48, 105, -18, 5, -1), NewArray8Short(-1, 4, -11, 37, 112, -16, 4, -1), NewArray8Short(-1, 3, -9, 27, 118, -13, 4, -1), - NewArray8Short(0, 2, -6, 18, 122, -10, 3, -1), NewArray8Short(0, 1, -3, 8, 126, -5, 1, 0), - }; + NewArray8Short(0, 2, -6, 18, 122, -10, 3, -1), NewArray8Short(0, 1, -3, 8, 126, -5, 1, 0) + ]; // DCT based filter - private static readonly Array8[] _subPelFilters8S = { + private static readonly Array8[] _subPelFilters8S = + [ NewArray8Short(0, 0, 0, 128, 0, 0, 0, 0), NewArray8Short(-1, 3, -7, 127, 8, -3, 1, 0), NewArray8Short(-2, 5, -13, 125, 17, -6, 3, -1), NewArray8Short(-3, 7, -17, 121, 27, -10, 5, -2), NewArray8Short(-4, 9, -20, 115, 37, -13, 6, -2), NewArray8Short(-4, 10, -23, 108, 48, -16, 8, -3), @@ -240,11 +252,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 NewArray8Short(-4, 11, -23, 80, 80, -23, 11, -4), NewArray8Short(-4, 10, -21, 70, 90, -24, 11, -4), NewArray8Short(-3, 9, -19, 59, 100, -24, 10, -4), NewArray8Short(-3, 8, -16, 48, 108, -23, 10, -4), NewArray8Short(-2, 6, -13, 37, 115, -20, 9, -4), NewArray8Short(-2, 5, -10, 27, 121, -17, 7, -3), - NewArray8Short(-1, 3, -6, 17, 125, -13, 5, -2), NewArray8Short(0, 1, -3, 8, 127, -7, 3, -1), - }; + NewArray8Short(-1, 3, -6, 17, 125, -13, 5, -2), NewArray8Short(0, 1, -3, 8, 127, -7, 3, -1) + ]; // freqmultiplier = 0.5 - private static readonly Array8[] _subPelFilters8Lp = { + private static readonly Array8[] _subPelFilters8Lp = + [ NewArray8Short(0, 0, 0, 128, 0, 0, 0, 0), NewArray8Short(-3, -1, 32, 64, 38, 1, -3, 0), NewArray8Short(-2, -2, 29, 63, 41, 2, -3, 0), NewArray8Short(-2, -2, 26, 63, 43, 4, -4, 0), NewArray8Short(-2, -3, 24, 62, 46, 5, -4, 0), NewArray8Short(-2, -3, 21, 60, 49, 7, -4, 0), @@ -252,65 +265,74 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 NewArray8Short(-1, -4, 14, 55, 55, 14, -4, -1), NewArray8Short(-1, -4, 12, 53, 57, 16, -4, -1), NewArray8Short(0, -4, 9, 51, 59, 18, -4, -1), NewArray8Short(0, -4, 7, 49, 60, 21, -3, -2), NewArray8Short(0, -4, 5, 46, 62, 24, -3, -2), NewArray8Short(0, -4, 4, 43, 63, 26, -2, -2), - NewArray8Short(0, -3, 2, 41, 63, 29, -2, -2), NewArray8Short(0, -3, 1, 38, 64, 32, -1, -3), - }; + NewArray8Short(0, -3, 2, 41, 63, 29, -2, -2), NewArray8Short(0, -3, 1, 38, 64, 32, -1, -3) + ]; private static Array8 NewArray8Short(short e0, short e1, short e2, short e3, short e4, short e5, short e6, short e7) { - Array8 output = new(); - - output[0] = e0; - output[1] = e1; - output[2] = e2; - output[3] = e3; - output[4] = e4; - output[5] = e5; - output[6] = e6; - output[7] = e7; + Array8 output = new() + { + [0] = e0, + [1] = e1, + [2] = e2, + [3] = e3, + [4] = e4, + [5] = e5, + [6] = e6, + [7] = e7 + }; return output; } - public static readonly Array8[][] Vp9FilterKernels = { - _subPelFilters8, _subPelFilters8Lp, _subPelFilters8S, _bilinearFilters, - }; + public static readonly Array8[][] FilterKernels = + [ + _subPelFilters8, _subPelFilters8Lp, _subPelFilters8S, _bilinearFilters + ]; // Scan - private static readonly short[] _defaultScan4X4 = { - 0, 4, 1, 5, 8, 2, 12, 9, 3, 6, 13, 10, 7, 14, 11, 15, - }; + private static readonly short[] _defaultScan4X4 = + [ + 0, 4, 1, 5, 8, 2, 12, 9, 3, 6, 13, 10, 7, 14, 11, 15 + ]; - private static readonly short[] _colScan4X4 = { - 0, 4, 8, 1, 12, 5, 9, 2, 13, 6, 10, 3, 7, 14, 11, 15, - }; + private static readonly short[] _colScan4X4 = + [ + 0, 4, 8, 1, 12, 5, 9, 2, 13, 6, 10, 3, 7, 14, 11, 15 + ]; - private static readonly short[] _rowScan4X4 = { - 0, 1, 4, 2, 5, 3, 6, 8, 9, 7, 12, 10, 13, 11, 14, 15, - }; + private static readonly short[] _rowScan4X4 = + [ + 0, 1, 4, 2, 5, 3, 6, 8, 9, 7, 12, 10, 13, 11, 14, 15 + ]; - private static readonly short[] _defaultScan8X8 = { + private static readonly short[] _defaultScan8X8 = + [ 0, 8, 1, 16, 9, 2, 17, 24, 10, 3, 18, 25, 32, 11, 4, 26, 33, 19, 40, 12, 34, 27, 5, 41, 20, 48, 13, 35, 42, 28, 21, 6, 49, 56, 36, 43, 29, 7, 14, 50, 57, 44, 22, 37, 15, 51, 58, 30, - 45, 23, 52, 59, 38, 31, 60, 53, 46, 39, 61, 54, 47, 62, 55, 63, - }; + 45, 23, 52, 59, 38, 31, 60, 53, 46, 39, 61, 54, 47, 62, 55, 63 + ]; - private static readonly short[] _colScan8X8 = { + private static readonly short[] _colScan8X8 = + [ 0, 8, 16, 1, 24, 9, 32, 17, 2, 40, 25, 10, 33, 18, 48, 3, 26, 41, 11, 56, 19, 34, 4, 49, 27, 42, 12, 35, 20, 57, 50, 28, 5, 43, 13, 36, 58, 51, 21, 44, 6, 29, 59, 37, 14, 52, 22, 7, - 45, 60, 30, 15, 38, 53, 23, 46, 31, 61, 39, 54, 47, 62, 55, 63, - }; + 45, 60, 30, 15, 38, 53, 23, 46, 31, 61, 39, 54, 47, 62, 55, 63 + ]; - private static readonly short[] _rowScan8X8 = { + private static readonly short[] _rowScan8X8 = + [ 0, 1, 2, 8, 9, 3, 16, 10, 4, 17, 11, 24, 5, 18, 25, 12, 19, 26, 32, 6, 13, 20, 33, 27, 7, 34, 40, 21, 28, 41, 14, 35, 48, 42, 29, 36, 49, 22, 43, 15, 56, 37, 50, 44, 30, 57, 23, 51, - 58, 45, 38, 52, 31, 59, 53, 46, 60, 39, 61, 47, 54, 55, 62, 63, - }; + 58, 45, 38, 52, 31, 59, 53, 46, 60, 39, 61, 47, 54, 55, 62, 63 + ]; - private static readonly short[] _defaultScan16X16 = { + private static readonly short[] _defaultScan16X16 = + [ 0, 16, 1, 32, 17, 2, 48, 33, 18, 3, 64, 34, 49, 19, 65, 80, 50, 4, 35, 66, 20, 81, 96, 51, 5, 36, 82, 97, 67, 112, 21, 52, 98, 37, 83, 113, 6, 68, 128, 53, 22, 99, 114, 84, 7, @@ -328,10 +350,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 172, 110, 247, 157, 79, 218, 203, 126, 233, 188, 248, 95, 173, 142, 219, 111, 249, 234, 158, 127, 189, 204, 250, 235, 143, 174, 220, 205, 159, 251, 190, 221, 175, 236, 237, 191, 206, 252, 222, 253, 207, 238, 223, 254, 239, - 255, - }; + 255 + ]; - private static readonly short[] _colScan16X16 = { + private static readonly short[] _colScan16X16 = + [ 0, 16, 32, 48, 1, 64, 17, 80, 33, 96, 49, 2, 65, 112, 18, 81, 34, 128, 50, 97, 3, 66, 144, 19, 113, 35, 82, 160, 98, 51, 129, 4, 67, 176, 20, 114, 145, 83, 36, 99, 130, 52, 192, 5, 161, @@ -349,10 +372,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 78, 203, 31, 141, 234, 94, 47, 188, 63, 157, 110, 250, 219, 79, 126, 204, 173, 142, 95, 189, 111, 235, 158, 220, 251, 127, 174, 143, 205, 236, 159, 190, 221, 252, 175, 206, 237, 191, 253, 222, 238, 207, 254, 223, 239, - 255, - }; + 255 + ]; - private static readonly short[] _rowScan16X16 = { + private static readonly short[] _rowScan16X16 = + [ 0, 1, 2, 16, 3, 17, 4, 18, 32, 5, 33, 19, 6, 34, 48, 20, 49, 7, 35, 21, 50, 64, 8, 36, 65, 22, 51, 37, 80, 9, 66, 52, 23, 38, 81, 67, 10, 53, 24, 82, 68, 96, 39, 11, 54, @@ -370,10 +394,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 217, 231, 95, 246, 232, 126, 203, 247, 233, 173, 218, 142, 111, 158, 188, 248, 127, 234, 219, 249, 189, 204, 143, 174, 159, 250, 235, 205, 220, 175, 190, 251, 221, 191, 206, 236, 207, 237, 252, 222, 253, 223, 238, 239, 254, - 255, - }; + 255 + ]; - private static readonly short[] _defaultScan32X32 = { + private static readonly short[] _defaultScan32X32 = + [ 0, 32, 1, 64, 33, 2, 96, 65, 34, 128, 3, 97, 66, 160, 129, 35, 98, 4, 67, 130, 161, 192, 36, 99, 224, 5, 162, 193, 68, 131, 37, 100, 225, 194, 256, 163, 69, 132, 6, @@ -452,57 +477,64 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 767, 920, 796, 952, 921, 828, 797, 984, 953, 922, 860, 829, 798, 1016, 985, 954, 923, 892, 861, 830, 799, 1017, 986, 955, 893, 862, 831, 1018, 987, 894, 863, 1019, 895, 924, 956, 925, 988, 957, 926, - 1020, 989, 958, 927, 1021, 990, 959, 1022, 991, 1023, - }; + 1020, 989, 958, 927, 1021, 990, 959, 1022, 991, 1023 + ]; // Neighborhood 2-tuples for various scans and blocksizes, // in {top, left} order for each position in corresponding scan order. - private static readonly short[] _defaultScan4X4Neighbors = { + private static readonly short[] _defaultScan4X4Neighbors = + [ 0, 0, 0, 0, 0, 0, 1, 4, 4, 4, 1, 1, 8, 8, 5, 8, 2, - 2, 2, 5, 9, 12, 6, 9, 3, 6, 10, 13, 7, 10, 11, 14, 0, 0, - }; + 2, 2, 5, 9, 12, 6, 9, 3, 6, 10, 13, 7, 10, 11, 14, 0, 0 + ]; - private static readonly short[] _colScan4X4Neighbors = { + private static readonly short[] _colScan4X4Neighbors = + [ 0, 0, 0, 0, 4, 4, 0, 0, 8, 8, 1, 1, 5, 5, 1, 1, 9, - 9, 2, 2, 6, 6, 2, 2, 3, 3, 10, 10, 7, 7, 11, 11, 0, 0, - }; + 9, 2, 2, 6, 6, 2, 2, 3, 3, 10, 10, 7, 7, 11, 11, 0, 0 + ]; - private static readonly short[] _rowScan4X4Neighbors = { + private static readonly short[] _rowScan4X4Neighbors = + [ 0, 0, 0, 0, 0, 0, 1, 1, 4, 4, 2, 2, 5, 5, 4, 4, 8, - 8, 6, 6, 8, 8, 9, 9, 12, 12, 10, 10, 13, 13, 14, 14, 0, 0, - }; + 8, 6, 6, 8, 8, 9, 9, 12, 12, 10, 10, 13, 13, 14, 14, 0, 0 + ]; - private static readonly short[] _colScan8X8Neighbors = { + private static readonly short[] _colScan8X8Neighbors = + [ 0, 0, 0, 0, 8, 8, 0, 0, 16, 16, 1, 1, 24, 24, 9, 9, 1, 1, 32, 32, 17, 17, 2, 2, 25, 25, 10, 10, 40, 40, 2, 2, 18, 18, 33, 33, 3, 3, 48, 48, 11, 11, 26, 26, 3, 3, 41, 41, 19, 19, 34, 34, 4, 4, 27, 27, 12, 12, 49, 49, 42, 42, 20, 20, 4, 4, 35, 35, 5, 5, 28, 28, 50, 50, 43, 43, 13, 13, 36, 36, 5, 5, 21, 21, 51, 51, 29, 29, 6, 6, 44, 44, 14, 14, 6, 6, 37, 37, 52, 52, 22, 22, 7, 7, 30, 30, 45, 45, 15, 15, 38, 38, 23, 23, - 53, 53, 31, 31, 46, 46, 39, 39, 54, 54, 47, 47, 55, 55, 0, 0, - }; + 53, 53, 31, 31, 46, 46, 39, 39, 54, 54, 47, 47, 55, 55, 0, 0 + ]; - private static readonly short[] _rowScan8X8Neighbors = { + private static readonly short[] _rowScan8X8Neighbors = + [ 0, 0, 0, 0, 1, 1, 0, 0, 8, 8, 2, 2, 8, 8, 9, 9, 3, 3, 16, 16, 10, 10, 16, 16, 4, 4, 17, 17, 24, 24, 11, 11, 18, 18, 25, 25, 24, 24, 5, 5, 12, 12, 19, 19, 32, 32, 26, 26, 6, 6, 33, 33, 32, 32, 20, 20, 27, 27, 40, 40, 13, 13, 34, 34, 40, 40, 41, 41, 28, 28, 35, 35, 48, 48, 21, 21, 42, 42, 14, 14, 48, 48, 36, 36, 49, 49, 43, 43, 29, 29, 56, 56, 22, 22, 50, 50, 57, 57, 44, 44, 37, 37, 51, 51, 30, 30, 58, 58, 52, 52, 45, 45, 59, 59, - 38, 38, 60, 60, 46, 46, 53, 53, 54, 54, 61, 61, 62, 62, 0, 0, - }; + 38, 38, 60, 60, 46, 46, 53, 53, 54, 54, 61, 61, 62, 62, 0, 0 + ]; - private static readonly short[] _defaultScan8X8Neighbors = { + private static readonly short[] _defaultScan8X8Neighbors = + [ 0, 0, 0, 0, 0, 0, 8, 8, 1, 8, 1, 1, 9, 16, 16, 16, 2, 9, 2, 2, 10, 17, 17, 24, 24, 24, 3, 10, 3, 3, 18, 25, 25, 32, 11, 18, 32, 32, 4, 11, 26, 33, 19, 26, 4, 4, 33, 40, 12, 19, 40, 40, 5, 12, 27, 34, 34, 41, 20, 27, 13, 20, 5, 5, 41, 48, 48, 48, 28, 35, 35, 42, 21, 28, 6, 6, 6, 13, 42, 49, 49, 56, 36, 43, 14, 21, 29, 36, 7, 14, 43, 50, 50, 57, 22, 29, 37, 44, 15, 22, 44, 51, 51, 58, 30, 37, 23, 30, 52, 59, 45, 52, 38, 45, - 31, 38, 53, 60, 46, 53, 39, 46, 54, 61, 47, 54, 55, 62, 0, 0, - }; + 31, 38, 53, 60, 46, 53, 39, 46, 54, 61, 47, 54, 55, 62, 0, 0 + ]; - private static readonly short[] _colScan16X16Neighbors = { + private static readonly short[] _colScan16X16Neighbors = + [ 0, 0, 0, 0, 16, 16, 32, 32, 0, 0, 48, 48, 1, 1, 64, 64, 17, 17, 80, 80, 33, 33, 1, 1, 49, 49, 96, 96, 2, 2, 65, 65, 18, 18, 112, 112, 34, 34, 81, 81, 2, 2, 50, 50, 128, @@ -537,10 +569,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 142, 204, 204, 235, 235, 111, 111, 158, 158, 127, 127, 189, 189, 220, 220, 143, 143, 174, 174, 205, 205, 236, 236, 159, 159, 190, 190, 221, 221, 175, 175, 237, 237, 206, 206, 222, 222, 191, 191, 238, 238, 207, 207, 223, 223, - 239, 239, 0, 0, - }; + 239, 239, 0, 0 + ]; - private static readonly short[] _rowScan16X16Neighbors = { + private static readonly short[] _rowScan16X16Neighbors = + [ 0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 16, 16, 3, 3, 17, 17, 16, 16, 4, 4, 32, 32, 18, 18, 5, 5, 33, 33, 32, 32, 19, 19, 48, 48, 6, 6, 34, 34, 20, 20, 49, 49, 48, 48, 7, @@ -575,10 +608,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 142, 173, 173, 158, 158, 249, 249, 234, 234, 204, 204, 219, 219, 174, 174, 189, 189, 250, 250, 220, 220, 190, 190, 205, 205, 235, 235, 206, 206, 236, 236, 251, 251, 221, 221, 252, 252, 222, 222, 237, 237, 238, 238, 253, 253, - 254, 254, 0, 0, - }; + 254, 254, 0, 0 + ]; - private static readonly short[] _defaultScan16X16Neighbors = { + private static readonly short[] _defaultScan16X16Neighbors = + [ 0, 0, 0, 0, 0, 0, 16, 16, 1, 16, 1, 1, 32, 32, 17, 32, 2, 17, 2, 2, 48, 48, 18, 33, 33, 48, 3, 18, 49, 64, 64, 64, 34, 49, 3, 3, 19, 34, 50, 65, 4, 19, 65, 80, 80, @@ -613,10 +647,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 249, 219, 234, 127, 142, 158, 173, 204, 219, 189, 204, 143, 158, 235, 250, 174, 189, 205, 220, 159, 174, 220, 235, 221, 236, 175, 190, 190, 205, 236, 251, 206, 221, 237, 252, 191, 206, 222, 237, 207, 222, 238, 253, 223, 238, - 239, 254, 0, 0, - }; + 239, 254, 0, 0 + ]; - private static readonly short[] _defaultScan32X32Neighbors = { + private static readonly short[] _defaultScan32X32Neighbors = + [ 0, 0, 0, 0, 0, 0, 32, 32, 1, 32, 1, 1, 64, 64, 33, 64, 2, 33, 96, 96, 2, 2, 65, 96, 34, 65, 128, 128, 97, 128, 3, 34, 66, 97, 3, 3, 35, 66, 98, 129, 129, 160, @@ -763,43 +798,50 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 799, 830, 986, 1017, 955, 986, 862, 893, 831, 862, 987, 1018, 863, 894, 892, 923, 924, 955, 893, 924, 956, 987, 925, 956, 894, 925, 988, 1019, 957, 988, 926, 957, 895, 926, 989, 1020, 958, 989, 927, 958, 990, 1021, - 959, 990, 991, 1022, 0, 0, - }; + 959, 990, 991, 1022, 0, 0 + ]; - private static readonly short[] _vp9DefaultIscan4X4 = { - 0, 2, 5, 8, 1, 3, 9, 12, 4, 7, 11, 14, 6, 10, 13, 15, - }; + private static readonly short[] _defaultIscan4X4 = + [ + 0, 2, 5, 8, 1, 3, 9, 12, 4, 7, 11, 14, 6, 10, 13, 15 + ]; - private static readonly short[] _vp9ColIscan4X4 = { - 0, 3, 7, 11, 1, 5, 9, 12, 2, 6, 10, 14, 4, 8, 13, 15, - }; + private static readonly short[] _colIscan4X4 = + [ + 0, 3, 7, 11, 1, 5, 9, 12, 2, 6, 10, 14, 4, 8, 13, 15 + ]; - private static readonly short[] _vp9RowIscan4X4 = { - 0, 1, 3, 5, 2, 4, 6, 9, 7, 8, 11, 13, 10, 12, 14, 15, - }; + private static readonly short[] _rowIscan4X4 = + [ + 0, 1, 3, 5, 2, 4, 6, 9, 7, 8, 11, 13, 10, 12, 14, 15 + ]; - private static readonly short[] _vp9ColIscan8X8 = { + private static readonly short[] _colIscan8X8 = + [ 0, 3, 8, 15, 22, 32, 40, 47, 1, 5, 11, 18, 26, 34, 44, 51, 2, 7, 13, 20, 28, 38, 46, 54, 4, 10, 16, 24, 31, 41, 50, 56, 6, 12, 21, 27, 35, 43, 52, 58, 9, 17, 25, 33, 39, 48, 55, 60, - 14, 23, 30, 37, 45, 53, 59, 62, 19, 29, 36, 42, 49, 57, 61, 63, - }; + 14, 23, 30, 37, 45, 53, 59, 62, 19, 29, 36, 42, 49, 57, 61, 63 + ]; - private static readonly short[] _vp9RowIscan8X8 = { + private static readonly short[] _rowIscan8X8 = + [ 0, 1, 2, 5, 8, 12, 19, 24, 3, 4, 7, 10, 15, 20, 30, 39, 6, 9, 13, 16, 21, 27, 37, 46, 11, 14, 17, 23, 28, 34, 44, 52, 18, 22, 25, 31, 35, 41, 50, 57, 26, 29, 33, 38, 43, 49, 55, 59, - 32, 36, 42, 47, 51, 54, 60, 61, 40, 45, 48, 53, 56, 58, 62, 63, - }; + 32, 36, 42, 47, 51, 54, 60, 61, 40, 45, 48, 53, 56, 58, 62, 63 + ]; - private static readonly short[] _vp9DefaultIscan8X8 = { + private static readonly short[] _defaultIscan8X8 = + [ 0, 2, 5, 9, 14, 22, 31, 37, 1, 4, 8, 13, 19, 26, 38, 44, 3, 6, 10, 17, 24, 30, 42, 49, 7, 11, 15, 21, 29, 36, 47, 53, 12, 16, 20, 27, 34, 43, 52, 57, 18, 23, 28, 35, 41, 48, 56, 60, - 25, 32, 39, 45, 50, 55, 59, 62, 33, 40, 46, 51, 54, 58, 61, 63, - }; + 25, 32, 39, 45, 50, 55, 59, 62, 33, 40, 46, 51, 54, 58, 61, 63 + ]; - private static readonly short[] _vp9ColIscan16X16 = { + private static readonly short[] _colIscan16X16 = + [ 0, 4, 11, 20, 31, 43, 59, 75, 85, 109, 130, 150, 165, 181, 195, 198, 1, 6, 14, 23, 34, 47, 64, 81, 95, 114, 135, 153, 171, 188, 201, 212, 2, 8, 16, 25, 38, 52, 67, 83, 101, 116, 136, 157, 172, 190, 205, 216, @@ -815,10 +857,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 42, 61, 77, 90, 106, 121, 134, 148, 160, 173, 191, 211, 225, 238, 245, 251, 50, 72, 87, 100, 118, 128, 145, 158, 168, 183, 204, 222, 233, 242, 249, 253, 57, 80, 97, 111, 131, 143, 155, 169, 178, 192, 214, 231, 239, 246, 250, 254, - 65, 88, 107, 124, 139, 152, 163, 177, 185, 199, 221, 234, 243, 248, 252, 255, - }; + 65, 88, 107, 124, 139, 152, 163, 177, 185, 199, 221, 234, 243, 248, 252, 255 + ]; - private static readonly short[] _vp9RowIscan16X16 = { + private static readonly short[] _rowIscan16X16 = + [ 0, 1, 2, 4, 6, 9, 12, 17, 22, 29, 36, 43, 54, 64, 76, 86, 3, 5, 7, 11, 15, 19, 25, 32, 38, 48, 59, 68, 84, 99, 115, 130, 8, 10, 13, 18, 23, 27, 33, 42, 51, 60, 72, 88, 103, @@ -836,10 +879,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 156, 166, 172, 180, 189, 199, 200, 210, 220, 228, 238, 242, 249, 251, 152, 163, 171, 183, 186, 193, 201, 211, 214, 218, 227, 236, 245, 247, 252, 253, 158, 173, 187, 194, 198, 209, 213, 217, 225, 229, 235, 241, 248, 250, 254, - 255, - }; + 255 + ]; - private static readonly short[] _vp9DefaultIscan16X16 = { + private static readonly short[] _defaultIscan16X16 = + [ 0, 2, 5, 9, 17, 24, 36, 44, 55, 72, 88, 104, 128, 143, 166, 179, 1, 4, 8, 13, 20, 30, 40, 54, 66, 79, 96, 113, 141, 154, 178, 196, 3, 7, 11, 18, 25, 33, 46, 57, 71, 86, 101, 119, 148, @@ -857,10 +901,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 126, 136, 149, 162, 171, 183, 194, 204, 215, 224, 236, 241, 248, 252, 121, 135, 144, 158, 170, 181, 192, 200, 209, 218, 227, 233, 243, 244, 251, 254, 137, 152, 160, 174, 184, 195, 206, 212, 220, 226, 232, 239, 247, 249, 253, - 255, - }; + 255 + ]; - private static readonly short[] _vp9DefaultIscan32X32 = { + private static readonly short[] _defaultIscan32X32 = + [ 0, 2, 5, 10, 17, 25, 38, 47, 62, 83, 101, 121, 145, 170, 193, 204, 210, 219, 229, 233, 245, 257, 275, 299, 342, 356, 377, 405, 455, 471, 495, 527, 1, 4, 8, 15, 22, 30, 45, @@ -939,8 +984,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 850, 876, 889, 905, 917, 937, 947, 959, 968, 982, 989, 997, 1003, 1011, 1015, 1019, 1022, 496, 528, 552, 568, 618, 646, 667, 681, 724, 748, 766, 778, 814, 834, 849, 859, 888, 904, 916, 924, 946, 958, - 967, 973, 988, 996, 1002, 1006, 1014, 1018, 1021, 1023, - }; + 967, 973, 988, 996, 1002, 1006, 1014, 1018, 1021, 1023 + ]; public class ScanOrder { @@ -956,90 +1001,92 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } - public static readonly ScanOrder[] Vp9DefaultScanOrders = { - new(_defaultScan4X4, _vp9DefaultIscan4X4, _defaultScan4X4Neighbors), - new(_defaultScan8X8, _vp9DefaultIscan8X8, _defaultScan8X8Neighbors), - new(_defaultScan16X16, _vp9DefaultIscan16X16, _defaultScan16X16Neighbors), - new(_defaultScan32X32, _vp9DefaultIscan32X32, _defaultScan32X32Neighbors), - }; + public static readonly ScanOrder[] DefaultScanOrders = + [ + new(_defaultScan4X4, _defaultIscan4X4, _defaultScan4X4Neighbors), + new(_defaultScan8X8, _defaultIscan8X8, _defaultScan8X8Neighbors), + new(_defaultScan16X16, _defaultIscan16X16, _defaultScan16X16Neighbors), + new(_defaultScan32X32, _defaultIscan32X32, _defaultScan32X32Neighbors) + ]; - public static readonly ScanOrder[][] Vp9ScanOrders = { - new ScanOrder[] - { // TX_4X4 - new(_defaultScan4X4, _vp9DefaultIscan4X4, _defaultScan4X4Neighbors), - new(_rowScan4X4, _vp9RowIscan4X4, _rowScan4X4Neighbors), - new(_colScan4X4, _vp9ColIscan4X4, _colScan4X4Neighbors), - new(_defaultScan4X4, _vp9DefaultIscan4X4, _defaultScan4X4Neighbors), - }, - new ScanOrder[] - { // TX_8X8 - new(_defaultScan8X8, _vp9DefaultIscan8X8, _defaultScan8X8Neighbors), - new(_rowScan8X8, _vp9RowIscan8X8, _rowScan8X8Neighbors), - new(_colScan8X8, _vp9ColIscan8X8, _colScan8X8Neighbors), - new(_defaultScan8X8, _vp9DefaultIscan8X8, _defaultScan8X8Neighbors), - }, - new ScanOrder[] - { // TX_16X16 - new(_defaultScan16X16, _vp9DefaultIscan16X16, _defaultScan16X16Neighbors), - new(_rowScan16X16, _vp9RowIscan16X16, _rowScan16X16Neighbors), - new(_colScan16X16, _vp9ColIscan16X16, _colScan16X16Neighbors), - new(_defaultScan16X16, _vp9DefaultIscan16X16, _defaultScan16X16Neighbors), - }, - new ScanOrder[] - { // TX_32X32 - new(_defaultScan32X32, _vp9DefaultIscan32X32, _defaultScan32X32Neighbors), - new(_defaultScan32X32, _vp9DefaultIscan32X32, _defaultScan32X32Neighbors), - new(_defaultScan32X32, _vp9DefaultIscan32X32, _defaultScan32X32Neighbors), - new(_defaultScan32X32, _vp9DefaultIscan32X32, _defaultScan32X32Neighbors), - }, + public static readonly ScanOrder[][] ScanOrders = new ScanOrder[][] + { + [ // TX_4X4 + new ScanOrder(_defaultScan4X4, _defaultIscan4X4, _defaultScan4X4Neighbors), + new ScanOrder(_rowScan4X4, _rowIscan4X4, _rowScan4X4Neighbors), + new ScanOrder(_colScan4X4, _colIscan4X4, _colScan4X4Neighbors), + new ScanOrder(_defaultScan4X4, _defaultIscan4X4, _defaultScan4X4Neighbors) + ], + [ // TX_8X8 + new ScanOrder(_defaultScan8X8, _defaultIscan8X8, _defaultScan8X8Neighbors), + new ScanOrder(_rowScan8X8, _rowIscan8X8, _rowScan8X8Neighbors), + new ScanOrder(_colScan8X8, _colIscan8X8, _colScan8X8Neighbors), + new ScanOrder(_defaultScan8X8, _defaultIscan8X8, _defaultScan8X8Neighbors) + ], + [ // TX_16X16 + new ScanOrder(_defaultScan16X16, _defaultIscan16X16, _defaultScan16X16Neighbors), + new ScanOrder(_rowScan16X16, _rowIscan16X16, _rowScan16X16Neighbors), + new ScanOrder(_colScan16X16, _colIscan16X16, _colScan16X16Neighbors), + new ScanOrder(_defaultScan16X16, _defaultIscan16X16, _defaultScan16X16Neighbors) + ], + [ // TX_32X32 + new ScanOrder(_defaultScan32X32, _defaultIscan32X32, _defaultScan32X32Neighbors), + new ScanOrder(_defaultScan32X32, _defaultIscan32X32, _defaultScan32X32Neighbors), + new ScanOrder(_defaultScan32X32, _defaultIscan32X32, _defaultScan32X32Neighbors), + new ScanOrder(_defaultScan32X32, _defaultIscan32X32, _defaultScan32X32Neighbors) + ] }; // Entropy MV - public static readonly sbyte[] Vp9MvJointTree = { - -(sbyte)MvJointType.MvJointZero, 2, -(sbyte)MvJointType.MvJointHnzvz, 4, -(sbyte)MvJointType.MvJointHzvnz, -(sbyte)MvJointType.MvJointHnzvnz, - }; + public static readonly sbyte[] MvJointTree = + [ + -(sbyte)MvJointType.Zero, 2, -(sbyte)MvJointType.Hnzvz, 4, -(sbyte)MvJointType.Hzvnz, -(sbyte)MvJointType.Hnzvnz + ]; - public static readonly sbyte[] Vp9MvClassTree = { - -(sbyte)MvClassType.MvClass0, + public static readonly sbyte[] MvClassTree = + [ + -(sbyte)MvClassType.Class0, 2, - -(sbyte)MvClassType.MvClass1, + -(sbyte)MvClassType.Class1, 4, 6, 8, - -(sbyte)MvClassType.MvClass2, - -(sbyte)MvClassType.MvClass3, + -(sbyte)MvClassType.Class2, + -(sbyte)MvClassType.Class3, 10, 12, - -(sbyte)MvClassType.MvClass4, - -(sbyte)MvClassType.MvClass5, - -(sbyte)MvClassType.MvClass6, + -(sbyte)MvClassType.Class4, + -(sbyte)MvClassType.Class5, + -(sbyte)MvClassType.Class6, 14, 16, 18, - -(sbyte)MvClassType.MvClass7, - -(sbyte)MvClassType.MvClass8, - -(sbyte)MvClassType.MvClass9, - -(sbyte)MvClassType.MvClass10, - }; + -(sbyte)MvClassType.Class7, + -(sbyte)MvClassType.Class8, + -(sbyte)MvClassType.Class9, + -(sbyte)MvClassType.Class10 + ]; - public static ReadOnlySpan Vp9MvFPTree => new sbyte[] { -0, 2, -1, 4, -2, -3 }; + public static ReadOnlySpan MvFpTree => [-0, 2, -1, 4, -2, -3]; // Entropy - public static ReadOnlySpan Vp9Cat1Prob => new byte[] { 159 }; - public static ReadOnlySpan Vp9Cat2Prob => new byte[] { 165, 145 }; - public static ReadOnlySpan Vp9Cat3Prob => new byte[] { 173, 148, 140 }; - public static ReadOnlySpan Vp9Cat4Prob => new byte[] { 176, 155, 140, 135 }; - public static ReadOnlySpan Vp9Cat5Prob => new byte[] { 180, 157, 141, 134, 130 }; - public static ReadOnlySpan Vp9Cat6Prob => new byte[] { 254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 }; + public static ReadOnlySpan Cat1Prob => [159]; + public static ReadOnlySpan Cat2Prob => [165, 145]; + public static ReadOnlySpan Cat3Prob => [173, 148, 140]; + public static ReadOnlySpan Cat4Prob => [176, 155, 140, 135]; + public static ReadOnlySpan Cat5Prob => [180, 157, 141, 134, 130]; + public static ReadOnlySpan Cat6Prob => [254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 + ]; - public static ReadOnlySpan Vp9Cat6ProbHigh12 => new byte[] - { - 255, 255, 255, 255, 254, 254, 54, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129, - }; + public static ReadOnlySpan Cat6ProbHigh12 => + [ + 255, 255, 255, 255, 254, 254, 54, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 + ]; - private static readonly byte[] _vp9CoefbandTrans8X8Plus = { + private static readonly byte[] _coefbandTrans8X8Plus = + [ 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, // Beyond MAXBAND_INDEX+1 all values are filled as 5 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -1080,308 +1127,228 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - }; + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 + ]; - private static ReadOnlySpan Vp9CoefbandTrans4X4 => new byte[] - { - 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, - }; + private static ReadOnlySpan CoefbandTrans4X4 => + [ + 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5 + ]; public static ReadOnlySpan GetBandTranslate(TxSize txSize) { - return txSize == TxSize.Tx4x4 ? Vp9CoefbandTrans4X4 : _vp9CoefbandTrans8X8Plus; + return txSize == TxSize.Tx4X4 ? CoefbandTrans4X4 : _coefbandTrans8X8Plus; } - public static readonly byte[][] Vp9Pareto8Full = { - new byte[] { 3, 86, 128, 6, 86, 23, 88, 29 }, - new byte[] { 6, 86, 128, 11, 87, 42, 91, 52 }, - new byte[] { 9, 86, 129, 17, 88, 61, 94, 76 }, - new byte[] { 12, 86, 129, 22, 88, 77, 97, 93 }, - new byte[] { 15, 87, 129, 28, 89, 93, 100, 110 }, - new byte[] { 17, 87, 129, 33, 90, 105, 103, 123 }, - new byte[] { 20, 88, 130, 38, 91, 118, 106, 136 }, - new byte[] { 23, 88, 130, 43, 91, 128, 108, 146 }, - new byte[] { 26, 89, 131, 48, 92, 139, 111, 156 }, - new byte[] { 28, 89, 131, 53, 93, 147, 114, 163 }, - new byte[] { 31, 90, 131, 58, 94, 156, 117, 171 }, - new byte[] { 34, 90, 131, 62, 94, 163, 119, 177 }, - new byte[] { 37, 90, 132, 66, 95, 171, 122, 184 }, - new byte[] { 39, 90, 132, 70, 96, 177, 124, 189 }, - new byte[] { 42, 91, 132, 75, 97, 183, 127, 194 }, - new byte[] { 44, 91, 132, 79, 97, 188, 129, 198 }, - new byte[] { 47, 92, 133, 83, 98, 193, 132, 202 }, - new byte[] { 49, 92, 133, 86, 99, 197, 134, 205 }, - new byte[] { 52, 93, 133, 90, 100, 201, 137, 208 }, - new byte[] { 54, 93, 133, 94, 100, 204, 139, 211 }, - new byte[] { 57, 94, 134, 98, 101, 208, 142, 214 }, - new byte[] { 59, 94, 134, 101, 102, 211, 144, 216 }, - new byte[] { 62, 94, 135, 105, 103, 214, 146, 218 }, - new byte[] { 64, 94, 135, 108, 103, 216, 148, 220 }, - new byte[] { 66, 95, 135, 111, 104, 219, 151, 222 }, - new byte[] { 68, 95, 135, 114, 105, 221, 153, 223 }, - new byte[] { 71, 96, 136, 117, 106, 224, 155, 225 }, - new byte[] { 73, 96, 136, 120, 106, 225, 157, 226 }, - new byte[] { 76, 97, 136, 123, 107, 227, 159, 228 }, - new byte[] { 78, 97, 136, 126, 108, 229, 160, 229 }, - new byte[] { 80, 98, 137, 129, 109, 231, 162, 231 }, - new byte[] { 82, 98, 137, 131, 109, 232, 164, 232 }, - new byte[] { 84, 98, 138, 134, 110, 234, 166, 233 }, - new byte[] { 86, 98, 138, 137, 111, 235, 168, 234 }, - new byte[] { 89, 99, 138, 140, 112, 236, 170, 235 }, - new byte[] { 91, 99, 138, 142, 112, 237, 171, 235 }, - new byte[] { 93, 100, 139, 145, 113, 238, 173, 236 }, - new byte[] { 95, 100, 139, 147, 114, 239, 174, 237 }, - new byte[] { 97, 101, 140, 149, 115, 240, 176, 238 }, - new byte[] { 99, 101, 140, 151, 115, 241, 177, 238 }, - new byte[] { 101, 102, 140, 154, 116, 242, 179, 239 }, - new byte[] { 103, 102, 140, 156, 117, 242, 180, 239 }, - new byte[] { 105, 103, 141, 158, 118, 243, 182, 240 }, - new byte[] { 107, 103, 141, 160, 118, 243, 183, 240 }, - new byte[] { 109, 104, 141, 162, 119, 244, 185, 241 }, - new byte[] { 111, 104, 141, 164, 119, 244, 186, 241 }, - new byte[] { 113, 104, 142, 166, 120, 245, 187, 242 }, - new byte[] { 114, 104, 142, 168, 121, 245, 188, 242 }, - new byte[] { 116, 105, 143, 170, 122, 246, 190, 243 }, - new byte[] { 118, 105, 143, 171, 122, 246, 191, 243 }, - new byte[] { 120, 106, 143, 173, 123, 247, 192, 244 }, - new byte[] { 121, 106, 143, 175, 124, 247, 193, 244 }, - new byte[] { 123, 107, 144, 177, 125, 248, 195, 244 }, - new byte[] { 125, 107, 144, 178, 125, 248, 196, 244 }, - new byte[] { 127, 108, 145, 180, 126, 249, 197, 245 }, - new byte[] { 128, 108, 145, 181, 127, 249, 198, 245 }, - new byte[] { 130, 109, 145, 183, 128, 249, 199, 245 }, - new byte[] { 132, 109, 145, 184, 128, 249, 200, 245 }, - new byte[] { 134, 110, 146, 186, 129, 250, 201, 246 }, - new byte[] { 135, 110, 146, 187, 130, 250, 202, 246 }, - new byte[] { 137, 111, 147, 189, 131, 251, 203, 246 }, - new byte[] { 138, 111, 147, 190, 131, 251, 204, 246 }, - new byte[] { 140, 112, 147, 192, 132, 251, 205, 247 }, - new byte[] { 141, 112, 147, 193, 132, 251, 206, 247 }, - new byte[] { 143, 113, 148, 194, 133, 251, 207, 247 }, - new byte[] { 144, 113, 148, 195, 134, 251, 207, 247 }, - new byte[] { 146, 114, 149, 197, 135, 252, 208, 248 }, - new byte[] { 147, 114, 149, 198, 135, 252, 209, 248 }, - new byte[] { 149, 115, 149, 199, 136, 252, 210, 248 }, - new byte[] { 150, 115, 149, 200, 137, 252, 210, 248 }, - new byte[] { 152, 115, 150, 201, 138, 252, 211, 248 }, - new byte[] { 153, 115, 150, 202, 138, 252, 212, 248 }, - new byte[] { 155, 116, 151, 204, 139, 253, 213, 249 }, - new byte[] { 156, 116, 151, 205, 139, 253, 213, 249 }, - new byte[] { 158, 117, 151, 206, 140, 253, 214, 249 }, - new byte[] { 159, 117, 151, 207, 141, 253, 215, 249 }, - new byte[] { 161, 118, 152, 208, 142, 253, 216, 249 }, - new byte[] { 162, 118, 152, 209, 142, 253, 216, 249 }, - new byte[] { 163, 119, 153, 210, 143, 253, 217, 249 }, - new byte[] { 164, 119, 153, 211, 143, 253, 217, 249 }, - new byte[] { 166, 120, 153, 212, 144, 254, 218, 250 }, - new byte[] { 167, 120, 153, 212, 145, 254, 219, 250 }, - new byte[] { 168, 121, 154, 213, 146, 254, 220, 250 }, - new byte[] { 169, 121, 154, 214, 146, 254, 220, 250 }, - new byte[] { 171, 122, 155, 215, 147, 254, 221, 250 }, - new byte[] { 172, 122, 155, 216, 147, 254, 221, 250 }, - new byte[] { 173, 123, 155, 217, 148, 254, 222, 250 }, - new byte[] { 174, 123, 155, 217, 149, 254, 222, 250 }, - new byte[] { 176, 124, 156, 218, 150, 254, 223, 250 }, - new byte[] { 177, 124, 156, 219, 150, 254, 223, 250 }, - new byte[] { 178, 125, 157, 220, 151, 254, 224, 251 }, - new byte[] { 179, 125, 157, 220, 151, 254, 224, 251 }, - new byte[] { 180, 126, 157, 221, 152, 254, 225, 251 }, - new byte[] { 181, 126, 157, 221, 152, 254, 225, 251 }, - new byte[] { 183, 127, 158, 222, 153, 254, 226, 251 }, - new byte[] { 184, 127, 158, 223, 154, 254, 226, 251 }, - new byte[] { 185, 128, 159, 224, 155, 255, 227, 251 }, - new byte[] { 186, 128, 159, 224, 155, 255, 227, 251 }, - new byte[] { 187, 129, 160, 225, 156, 255, 228, 251 }, - new byte[] { 188, 130, 160, 225, 156, 255, 228, 251 }, - new byte[] { 189, 131, 160, 226, 157, 255, 228, 251 }, - new byte[] { 190, 131, 160, 226, 158, 255, 228, 251 }, - new byte[] { 191, 132, 161, 227, 159, 255, 229, 251 }, - new byte[] { 192, 132, 161, 227, 159, 255, 229, 251 }, - new byte[] { 193, 133, 162, 228, 160, 255, 230, 252 }, - new byte[] { 194, 133, 162, 229, 160, 255, 230, 252 }, - new byte[] { 195, 134, 163, 230, 161, 255, 231, 252 }, - new byte[] { 196, 134, 163, 230, 161, 255, 231, 252 }, - new byte[] { 197, 135, 163, 231, 162, 255, 231, 252 }, - new byte[] { 198, 135, 163, 231, 162, 255, 231, 252 }, - new byte[] { 199, 136, 164, 232, 163, 255, 232, 252 }, - new byte[] { 200, 136, 164, 232, 164, 255, 232, 252 }, - new byte[] { 201, 137, 165, 233, 165, 255, 233, 252 }, - new byte[] { 201, 137, 165, 233, 165, 255, 233, 252 }, - new byte[] { 202, 138, 166, 233, 166, 255, 233, 252 }, - new byte[] { 203, 138, 166, 233, 166, 255, 233, 252 }, - new byte[] { 204, 139, 166, 234, 167, 255, 234, 252 }, - new byte[] { 205, 139, 166, 234, 167, 255, 234, 252 }, - new byte[] { 206, 140, 167, 235, 168, 255, 235, 252 }, - new byte[] { 206, 140, 167, 235, 168, 255, 235, 252 }, - new byte[] { 207, 141, 168, 236, 169, 255, 235, 252 }, - new byte[] { 208, 141, 168, 236, 170, 255, 235, 252 }, - new byte[] { 209, 142, 169, 237, 171, 255, 236, 252 }, - new byte[] { 209, 143, 169, 237, 171, 255, 236, 252 }, - new byte[] { 210, 144, 169, 237, 172, 255, 236, 252 }, - new byte[] { 211, 144, 169, 237, 172, 255, 236, 252 }, - new byte[] { 212, 145, 170, 238, 173, 255, 237, 252 }, - new byte[] { 213, 145, 170, 238, 173, 255, 237, 252 }, - new byte[] { 214, 146, 171, 239, 174, 255, 237, 253 }, - new byte[] { 214, 146, 171, 239, 174, 255, 237, 253 }, - new byte[] { 215, 147, 172, 240, 175, 255, 238, 253 }, - new byte[] { 215, 147, 172, 240, 175, 255, 238, 253 }, - new byte[] { 216, 148, 173, 240, 176, 255, 238, 253 }, - new byte[] { 217, 148, 173, 240, 176, 255, 238, 253 }, - new byte[] { 218, 149, 173, 241, 177, 255, 239, 253 }, - new byte[] { 218, 149, 173, 241, 178, 255, 239, 253 }, - new byte[] { 219, 150, 174, 241, 179, 255, 239, 253 }, - new byte[] { 219, 151, 174, 241, 179, 255, 239, 253 }, - new byte[] { 220, 152, 175, 242, 180, 255, 240, 253 }, - new byte[] { 221, 152, 175, 242, 180, 255, 240, 253 }, - new byte[] { 222, 153, 176, 242, 181, 255, 240, 253 }, - new byte[] { 222, 153, 176, 242, 181, 255, 240, 253 }, - new byte[] { 223, 154, 177, 243, 182, 255, 240, 253 }, - new byte[] { 223, 154, 177, 243, 182, 255, 240, 253 }, - new byte[] { 224, 155, 178, 244, 183, 255, 241, 253 }, - new byte[] { 224, 155, 178, 244, 183, 255, 241, 253 }, - new byte[] { 225, 156, 178, 244, 184, 255, 241, 253 }, - new byte[] { 225, 157, 178, 244, 184, 255, 241, 253 }, - new byte[] { 226, 158, 179, 244, 185, 255, 242, 253 }, - new byte[] { 227, 158, 179, 244, 185, 255, 242, 253 }, - new byte[] { 228, 159, 180, 245, 186, 255, 242, 253 }, - new byte[] { 228, 159, 180, 245, 186, 255, 242, 253 }, - new byte[] { 229, 160, 181, 245, 187, 255, 242, 253 }, - new byte[] { 229, 160, 181, 245, 187, 255, 242, 253 }, - new byte[] { 230, 161, 182, 246, 188, 255, 243, 253 }, - new byte[] { 230, 162, 182, 246, 188, 255, 243, 253 }, - new byte[] { 231, 163, 183, 246, 189, 255, 243, 253 }, - new byte[] { 231, 163, 183, 246, 189, 255, 243, 253 }, - new byte[] { 232, 164, 184, 247, 190, 255, 243, 253 }, - new byte[] { 232, 164, 184, 247, 190, 255, 243, 253 }, - new byte[] { 233, 165, 185, 247, 191, 255, 244, 253 }, - new byte[] { 233, 165, 185, 247, 191, 255, 244, 253 }, - new byte[] { 234, 166, 185, 247, 192, 255, 244, 253 }, - new byte[] { 234, 167, 185, 247, 192, 255, 244, 253 }, - new byte[] { 235, 168, 186, 248, 193, 255, 244, 253 }, - new byte[] { 235, 168, 186, 248, 193, 255, 244, 253 }, - new byte[] { 236, 169, 187, 248, 194, 255, 244, 253 }, - new byte[] { 236, 169, 187, 248, 194, 255, 244, 253 }, - new byte[] { 236, 170, 188, 248, 195, 255, 245, 253 }, - new byte[] { 236, 170, 188, 248, 195, 255, 245, 253 }, - new byte[] { 237, 171, 189, 249, 196, 255, 245, 254 }, - new byte[] { 237, 172, 189, 249, 196, 255, 245, 254 }, - new byte[] { 238, 173, 190, 249, 197, 255, 245, 254 }, - new byte[] { 238, 173, 190, 249, 197, 255, 245, 254 }, - new byte[] { 239, 174, 191, 249, 198, 255, 245, 254 }, - new byte[] { 239, 174, 191, 249, 198, 255, 245, 254 }, - new byte[] { 240, 175, 192, 249, 199, 255, 246, 254 }, - new byte[] { 240, 176, 192, 249, 199, 255, 246, 254 }, - new byte[] { 240, 177, 193, 250, 200, 255, 246, 254 }, - new byte[] { 240, 177, 193, 250, 200, 255, 246, 254 }, - new byte[] { 241, 178, 194, 250, 201, 255, 246, 254 }, - new byte[] { 241, 178, 194, 250, 201, 255, 246, 254 }, - new byte[] { 242, 179, 195, 250, 202, 255, 246, 254 }, - new byte[] { 242, 180, 195, 250, 202, 255, 246, 254 }, - new byte[] { 242, 181, 196, 250, 203, 255, 247, 254 }, - new byte[] { 242, 181, 196, 250, 203, 255, 247, 254 }, - new byte[] { 243, 182, 197, 251, 204, 255, 247, 254 }, - new byte[] { 243, 183, 197, 251, 204, 255, 247, 254 }, - new byte[] { 244, 184, 198, 251, 205, 255, 247, 254 }, - new byte[] { 244, 184, 198, 251, 205, 255, 247, 254 }, - new byte[] { 244, 185, 199, 251, 206, 255, 247, 254 }, - new byte[] { 244, 185, 199, 251, 206, 255, 247, 254 }, - new byte[] { 245, 186, 200, 251, 207, 255, 247, 254 }, - new byte[] { 245, 187, 200, 251, 207, 255, 247, 254 }, - new byte[] { 246, 188, 201, 252, 207, 255, 248, 254 }, - new byte[] { 246, 188, 201, 252, 207, 255, 248, 254 }, - new byte[] { 246, 189, 202, 252, 208, 255, 248, 254 }, - new byte[] { 246, 190, 202, 252, 208, 255, 248, 254 }, - new byte[] { 247, 191, 203, 252, 209, 255, 248, 254 }, - new byte[] { 247, 191, 203, 252, 209, 255, 248, 254 }, - new byte[] { 247, 192, 204, 252, 210, 255, 248, 254 }, - new byte[] { 247, 193, 204, 252, 210, 255, 248, 254 }, - new byte[] { 248, 194, 205, 252, 211, 255, 248, 254 }, - new byte[] { 248, 194, 205, 252, 211, 255, 248, 254 }, - new byte[] { 248, 195, 206, 252, 212, 255, 249, 254 }, - new byte[] { 248, 196, 206, 252, 212, 255, 249, 254 }, - new byte[] { 249, 197, 207, 253, 213, 255, 249, 254 }, - new byte[] { 249, 197, 207, 253, 213, 255, 249, 254 }, - new byte[] { 249, 198, 208, 253, 214, 255, 249, 254 }, - new byte[] { 249, 199, 209, 253, 214, 255, 249, 254 }, - new byte[] { 250, 200, 210, 253, 215, 255, 249, 254 }, - new byte[] { 250, 200, 210, 253, 215, 255, 249, 254 }, - new byte[] { 250, 201, 211, 253, 215, 255, 249, 254 }, - new byte[] { 250, 202, 211, 253, 215, 255, 249, 254 }, - new byte[] { 250, 203, 212, 253, 216, 255, 249, 254 }, - new byte[] { 250, 203, 212, 253, 216, 255, 249, 254 }, - new byte[] { 251, 204, 213, 253, 217, 255, 250, 254 }, - new byte[] { 251, 205, 213, 253, 217, 255, 250, 254 }, - new byte[] { 251, 206, 214, 254, 218, 255, 250, 254 }, - new byte[] { 251, 206, 215, 254, 218, 255, 250, 254 }, - new byte[] { 252, 207, 216, 254, 219, 255, 250, 254 }, - new byte[] { 252, 208, 216, 254, 219, 255, 250, 254 }, - new byte[] { 252, 209, 217, 254, 220, 255, 250, 254 }, - new byte[] { 252, 210, 217, 254, 220, 255, 250, 254 }, - new byte[] { 252, 211, 218, 254, 221, 255, 250, 254 }, - new byte[] { 252, 212, 218, 254, 221, 255, 250, 254 }, - new byte[] { 253, 213, 219, 254, 222, 255, 250, 254 }, - new byte[] { 253, 213, 220, 254, 222, 255, 250, 254 }, - new byte[] { 253, 214, 221, 254, 223, 255, 250, 254 }, - new byte[] { 253, 215, 221, 254, 223, 255, 250, 254 }, - new byte[] { 253, 216, 222, 254, 224, 255, 251, 254 }, - new byte[] { 253, 217, 223, 254, 224, 255, 251, 254 }, - new byte[] { 253, 218, 224, 254, 225, 255, 251, 254 }, - new byte[] { 253, 219, 224, 254, 225, 255, 251, 254 }, - new byte[] { 254, 220, 225, 254, 225, 255, 251, 254 }, - new byte[] { 254, 221, 226, 254, 225, 255, 251, 254 }, - new byte[] { 254, 222, 227, 255, 226, 255, 251, 254 }, - new byte[] { 254, 223, 227, 255, 226, 255, 251, 254 }, - new byte[] { 254, 224, 228, 255, 227, 255, 251, 254 }, - new byte[] { 254, 225, 229, 255, 227, 255, 251, 254 }, - new byte[] { 254, 226, 230, 255, 228, 255, 251, 254 }, - new byte[] { 254, 227, 230, 255, 229, 255, 251, 254 }, - new byte[] { 255, 228, 231, 255, 230, 255, 251, 254 }, - new byte[] { 255, 229, 232, 255, 230, 255, 251, 254 }, - new byte[] { 255, 230, 233, 255, 231, 255, 252, 254 }, - new byte[] { 255, 231, 234, 255, 231, 255, 252, 254 }, - new byte[] { 255, 232, 235, 255, 232, 255, 252, 254 }, - new byte[] { 255, 233, 236, 255, 232, 255, 252, 254 }, - new byte[] { 255, 235, 237, 255, 233, 255, 252, 254 }, - new byte[] { 255, 236, 238, 255, 234, 255, 252, 254 }, - new byte[] { 255, 238, 240, 255, 235, 255, 252, 255 }, - new byte[] { 255, 239, 241, 255, 235, 255, 252, 254 }, - new byte[] { 255, 241, 243, 255, 236, 255, 252, 254 }, - new byte[] { 255, 243, 245, 255, 237, 255, 252, 254 }, - new byte[] { 255, 246, 247, 255, 239, 255, 253, 255 }, + public static readonly byte[][] Pareto8Full = new byte[][] + { + [3, 86, 128, 6, 86, 23, 88, 29], [6, 86, 128, 11, 87, 42, 91, 52], [9, 86, 129, 17, 88, 61, 94, 76], [12, 86, 129, 22, 88, 77, 97, 93 + ], + [15, 87, 129, 28, 89, 93, 100, 110], [17, 87, 129, 33, 90, 105, 103, 123], [20, 88, 130, 38, 91, 118, 106, 136 + ], + [23, 88, 130, 43, 91, 128, 108, 146], [26, 89, 131, 48, 92, 139, 111, 156], [28, 89, 131, 53, 93, 147, 114, 163 + ], + [31, 90, 131, 58, 94, 156, 117, 171], [34, 90, 131, 62, 94, 163, 119, 177], [37, 90, 132, 66, 95, 171, 122, 184 + ], + [39, 90, 132, 70, 96, 177, 124, 189], [42, 91, 132, 75, 97, 183, 127, 194], [44, 91, 132, 79, 97, 188, 129, 198 + ], + [47, 92, 133, 83, 98, 193, 132, 202], [49, 92, 133, 86, 99, 197, 134, 205], [52, 93, 133, 90, 100, 201, 137, 208 + ], + [54, 93, 133, 94, 100, 204, 139, 211], [57, 94, 134, 98, 101, 208, 142, 214], [59, 94, 134, 101, 102, 211, 144, 216 + ], + [62, 94, 135, 105, 103, 214, 146, 218], [64, 94, 135, 108, 103, 216, 148, 220], [66, 95, 135, 111, 104, 219, 151, 222 + ], + [68, 95, 135, 114, 105, 221, 153, 223], [71, 96, 136, 117, 106, 224, 155, 225], [73, 96, 136, 120, 106, 225, 157, 226 + ], + [76, 97, 136, 123, 107, 227, 159, 228], [78, 97, 136, 126, 108, 229, 160, 229], [80, 98, 137, 129, 109, 231, 162, 231 + ], + [82, 98, 137, 131, 109, 232, 164, 232], [84, 98, 138, 134, 110, 234, 166, 233], [86, 98, 138, 137, 111, 235, 168, 234 + ], + [89, 99, 138, 140, 112, 236, 170, 235], [91, 99, 138, 142, 112, 237, 171, 235], [93, 100, 139, 145, 113, 238, 173, 236 + ], + [95, 100, 139, 147, 114, 239, 174, 237], [97, 101, 140, 149, 115, 240, 176, 238], [99, 101, 140, 151, 115, 241, 177, 238 + ], + [101, 102, 140, 154, 116, 242, 179, 239], [103, 102, 140, 156, 117, 242, 180, 239], [105, 103, 141, 158, 118, 243, 182, 240 + ], + [107, 103, 141, 160, 118, 243, 183, 240], [109, 104, 141, 162, 119, 244, 185, 241], [111, 104, 141, 164, 119, 244, 186, 241 + ], + [113, 104, 142, 166, 120, 245, 187, 242], [114, 104, 142, 168, 121, 245, 188, 242], [116, 105, 143, 170, 122, 246, 190, 243 + ], + [118, 105, 143, 171, 122, 246, 191, 243], [120, 106, 143, 173, 123, 247, 192, 244], [121, 106, 143, 175, 124, 247, 193, 244 + ], + [123, 107, 144, 177, 125, 248, 195, 244], [125, 107, 144, 178, 125, 248, 196, 244], [127, 108, 145, 180, 126, 249, 197, 245 + ], + [128, 108, 145, 181, 127, 249, 198, 245], [130, 109, 145, 183, 128, 249, 199, 245], [132, 109, 145, 184, 128, 249, 200, 245 + ], + [134, 110, 146, 186, 129, 250, 201, 246], [135, 110, 146, 187, 130, 250, 202, 246], [137, 111, 147, 189, 131, 251, 203, 246 + ], + [138, 111, 147, 190, 131, 251, 204, 246], [140, 112, 147, 192, 132, 251, 205, 247], [141, 112, 147, 193, 132, 251, 206, 247 + ], + [143, 113, 148, 194, 133, 251, 207, 247], [144, 113, 148, 195, 134, 251, 207, 247], [146, 114, 149, 197, 135, 252, 208, 248 + ], + [147, 114, 149, 198, 135, 252, 209, 248], [149, 115, 149, 199, 136, 252, 210, 248], [150, 115, 149, 200, 137, 252, 210, 248 + ], + [152, 115, 150, 201, 138, 252, 211, 248], [153, 115, 150, 202, 138, 252, 212, 248], [155, 116, 151, 204, 139, 253, 213, 249 + ], + [156, 116, 151, 205, 139, 253, 213, 249], [158, 117, 151, 206, 140, 253, 214, 249], [159, 117, 151, 207, 141, 253, 215, 249 + ], + [161, 118, 152, 208, 142, 253, 216, 249], [162, 118, 152, 209, 142, 253, 216, 249], [163, 119, 153, 210, 143, 253, 217, 249 + ], + [164, 119, 153, 211, 143, 253, 217, 249], [166, 120, 153, 212, 144, 254, 218, 250], [167, 120, 153, 212, 145, 254, 219, 250 + ], + [168, 121, 154, 213, 146, 254, 220, 250], [169, 121, 154, 214, 146, 254, 220, 250], [171, 122, 155, 215, 147, 254, 221, 250 + ], + [172, 122, 155, 216, 147, 254, 221, 250], [173, 123, 155, 217, 148, 254, 222, 250], [174, 123, 155, 217, 149, 254, 222, 250 + ], + [176, 124, 156, 218, 150, 254, 223, 250], [177, 124, 156, 219, 150, 254, 223, 250], [178, 125, 157, 220, 151, 254, 224, 251 + ], + [179, 125, 157, 220, 151, 254, 224, 251], [180, 126, 157, 221, 152, 254, 225, 251], [181, 126, 157, 221, 152, 254, 225, 251 + ], + [183, 127, 158, 222, 153, 254, 226, 251], [184, 127, 158, 223, 154, 254, 226, 251], [185, 128, 159, 224, 155, 255, 227, 251 + ], + [186, 128, 159, 224, 155, 255, 227, 251], [187, 129, 160, 225, 156, 255, 228, 251], [188, 130, 160, 225, 156, 255, 228, 251 + ], + [189, 131, 160, 226, 157, 255, 228, 251], [190, 131, 160, 226, 158, 255, 228, 251], [191, 132, 161, 227, 159, 255, 229, 251 + ], + [192, 132, 161, 227, 159, 255, 229, 251], [193, 133, 162, 228, 160, 255, 230, 252], [194, 133, 162, 229, 160, 255, 230, 252 + ], + [195, 134, 163, 230, 161, 255, 231, 252], [196, 134, 163, 230, 161, 255, 231, 252], [197, 135, 163, 231, 162, 255, 231, 252 + ], + [198, 135, 163, 231, 162, 255, 231, 252], [199, 136, 164, 232, 163, 255, 232, 252], [200, 136, 164, 232, 164, 255, 232, 252 + ], + [201, 137, 165, 233, 165, 255, 233, 252], [201, 137, 165, 233, 165, 255, 233, 252], [202, 138, 166, 233, 166, 255, 233, 252 + ], + [203, 138, 166, 233, 166, 255, 233, 252], [204, 139, 166, 234, 167, 255, 234, 252], [205, 139, 166, 234, 167, 255, 234, 252 + ], + [206, 140, 167, 235, 168, 255, 235, 252], [206, 140, 167, 235, 168, 255, 235, 252], [207, 141, 168, 236, 169, 255, 235, 252 + ], + [208, 141, 168, 236, 170, 255, 235, 252], [209, 142, 169, 237, 171, 255, 236, 252], [209, 143, 169, 237, 171, 255, 236, 252 + ], + [210, 144, 169, 237, 172, 255, 236, 252], [211, 144, 169, 237, 172, 255, 236, 252], [212, 145, 170, 238, 173, 255, 237, 252 + ], + [213, 145, 170, 238, 173, 255, 237, 252], [214, 146, 171, 239, 174, 255, 237, 253], [214, 146, 171, 239, 174, 255, 237, 253 + ], + [215, 147, 172, 240, 175, 255, 238, 253], [215, 147, 172, 240, 175, 255, 238, 253], [216, 148, 173, 240, 176, 255, 238, 253 + ], + [217, 148, 173, 240, 176, 255, 238, 253], [218, 149, 173, 241, 177, 255, 239, 253], [218, 149, 173, 241, 178, 255, 239, 253 + ], + [219, 150, 174, 241, 179, 255, 239, 253], [219, 151, 174, 241, 179, 255, 239, 253], [220, 152, 175, 242, 180, 255, 240, 253 + ], + [221, 152, 175, 242, 180, 255, 240, 253], [222, 153, 176, 242, 181, 255, 240, 253], [222, 153, 176, 242, 181, 255, 240, 253 + ], + [223, 154, 177, 243, 182, 255, 240, 253], [223, 154, 177, 243, 182, 255, 240, 253], [224, 155, 178, 244, 183, 255, 241, 253 + ], + [224, 155, 178, 244, 183, 255, 241, 253], [225, 156, 178, 244, 184, 255, 241, 253], [225, 157, 178, 244, 184, 255, 241, 253 + ], + [226, 158, 179, 244, 185, 255, 242, 253], [227, 158, 179, 244, 185, 255, 242, 253], [228, 159, 180, 245, 186, 255, 242, 253 + ], + [228, 159, 180, 245, 186, 255, 242, 253], [229, 160, 181, 245, 187, 255, 242, 253], [229, 160, 181, 245, 187, 255, 242, 253 + ], + [230, 161, 182, 246, 188, 255, 243, 253], [230, 162, 182, 246, 188, 255, 243, 253], [231, 163, 183, 246, 189, 255, 243, 253 + ], + [231, 163, 183, 246, 189, 255, 243, 253], [232, 164, 184, 247, 190, 255, 243, 253], [232, 164, 184, 247, 190, 255, 243, 253 + ], + [233, 165, 185, 247, 191, 255, 244, 253], [233, 165, 185, 247, 191, 255, 244, 253], [234, 166, 185, 247, 192, 255, 244, 253 + ], + [234, 167, 185, 247, 192, 255, 244, 253], [235, 168, 186, 248, 193, 255, 244, 253], [235, 168, 186, 248, 193, 255, 244, 253 + ], + [236, 169, 187, 248, 194, 255, 244, 253], [236, 169, 187, 248, 194, 255, 244, 253], [236, 170, 188, 248, 195, 255, 245, 253 + ], + [236, 170, 188, 248, 195, 255, 245, 253], [237, 171, 189, 249, 196, 255, 245, 254], [237, 172, 189, 249, 196, 255, 245, 254 + ], + [238, 173, 190, 249, 197, 255, 245, 254], [238, 173, 190, 249, 197, 255, 245, 254], [239, 174, 191, 249, 198, 255, 245, 254 + ], + [239, 174, 191, 249, 198, 255, 245, 254], [240, 175, 192, 249, 199, 255, 246, 254], [240, 176, 192, 249, 199, 255, 246, 254 + ], + [240, 177, 193, 250, 200, 255, 246, 254], [240, 177, 193, 250, 200, 255, 246, 254], [241, 178, 194, 250, 201, 255, 246, 254 + ], + [241, 178, 194, 250, 201, 255, 246, 254], [242, 179, 195, 250, 202, 255, 246, 254], [242, 180, 195, 250, 202, 255, 246, 254 + ], + [242, 181, 196, 250, 203, 255, 247, 254], [242, 181, 196, 250, 203, 255, 247, 254], [243, 182, 197, 251, 204, 255, 247, 254 + ], + [243, 183, 197, 251, 204, 255, 247, 254], [244, 184, 198, 251, 205, 255, 247, 254], [244, 184, 198, 251, 205, 255, 247, 254 + ], + [244, 185, 199, 251, 206, 255, 247, 254], [244, 185, 199, 251, 206, 255, 247, 254], [245, 186, 200, 251, 207, 255, 247, 254 + ], + [245, 187, 200, 251, 207, 255, 247, 254], [246, 188, 201, 252, 207, 255, 248, 254], [246, 188, 201, 252, 207, 255, 248, 254 + ], + [246, 189, 202, 252, 208, 255, 248, 254], [246, 190, 202, 252, 208, 255, 248, 254], [247, 191, 203, 252, 209, 255, 248, 254 + ], + [247, 191, 203, 252, 209, 255, 248, 254], [247, 192, 204, 252, 210, 255, 248, 254], [247, 193, 204, 252, 210, 255, 248, 254 + ], + [248, 194, 205, 252, 211, 255, 248, 254], [248, 194, 205, 252, 211, 255, 248, 254], [248, 195, 206, 252, 212, 255, 249, 254 + ], + [248, 196, 206, 252, 212, 255, 249, 254], [249, 197, 207, 253, 213, 255, 249, 254], [249, 197, 207, 253, 213, 255, 249, 254 + ], + [249, 198, 208, 253, 214, 255, 249, 254], [249, 199, 209, 253, 214, 255, 249, 254], [250, 200, 210, 253, 215, 255, 249, 254 + ], + [250, 200, 210, 253, 215, 255, 249, 254], [250, 201, 211, 253, 215, 255, 249, 254], [250, 202, 211, 253, 215, 255, 249, 254 + ], + [250, 203, 212, 253, 216, 255, 249, 254], [250, 203, 212, 253, 216, 255, 249, 254], [251, 204, 213, 253, 217, 255, 250, 254 + ], + [251, 205, 213, 253, 217, 255, 250, 254], [251, 206, 214, 254, 218, 255, 250, 254], [251, 206, 215, 254, 218, 255, 250, 254 + ], + [252, 207, 216, 254, 219, 255, 250, 254], [252, 208, 216, 254, 219, 255, 250, 254], [252, 209, 217, 254, 220, 255, 250, 254 + ], + [252, 210, 217, 254, 220, 255, 250, 254], [252, 211, 218, 254, 221, 255, 250, 254], [252, 212, 218, 254, 221, 255, 250, 254 + ], + [253, 213, 219, 254, 222, 255, 250, 254], [253, 213, 220, 254, 222, 255, 250, 254], [253, 214, 221, 254, 223, 255, 250, 254 + ], + [253, 215, 221, 254, 223, 255, 250, 254], [253, 216, 222, 254, 224, 255, 251, 254], [253, 217, 223, 254, 224, 255, 251, 254 + ], + [253, 218, 224, 254, 225, 255, 251, 254], [253, 219, 224, 254, 225, 255, 251, 254], [254, 220, 225, 254, 225, 255, 251, 254 + ], + [254, 221, 226, 254, 225, 255, 251, 254], [254, 222, 227, 255, 226, 255, 251, 254], [254, 223, 227, 255, 226, 255, 251, 254 + ], + [254, 224, 228, 255, 227, 255, 251, 254], [254, 225, 229, 255, 227, 255, 251, 254], [254, 226, 230, 255, 228, 255, 251, 254 + ], + [254, 227, 230, 255, 229, 255, 251, 254], [255, 228, 231, 255, 230, 255, 251, 254], [255, 229, 232, 255, 230, 255, 251, 254 + ], + [255, 230, 233, 255, 231, 255, 252, 254], [255, 231, 234, 255, 231, 255, 252, 254], [255, 232, 235, 255, 232, 255, 252, 254 + ], + [255, 233, 236, 255, 232, 255, 252, 254], [255, 235, 237, 255, 233, 255, 252, 254], [255, 236, 238, 255, 234, 255, 252, 254 + ], + [255, 238, 240, 255, 235, 255, 252, 255], [255, 239, 241, 255, 235, 255, 252, 254], [255, 241, 243, 255, 236, 255, 252, 254 + ], + [255, 243, 245, 255, 237, 255, 252, 254], [255, 246, 247, 255, 239, 255, 253, 255], }; - // Array indices are identical to previously-existing INTRAMODECONTEXTNODES. - public static readonly sbyte[] Vp9IntraModeTree = { - -(sbyte)PredictionMode.DcPred, 2, // 0 = DC_NODE - -(sbyte)PredictionMode.TmPred, 4, // 1 = TM_NODE - -(sbyte)PredictionMode.VPred, 6, // 2 = V_NODE - 8, 12, // 3 = COM_NODE - -(sbyte)PredictionMode.HPred, 10, // 4 = H_NODE - -(sbyte)PredictionMode.D135Pred, -(sbyte)PredictionMode.D117Pred, // 5 = D135_NODE - -(sbyte)PredictionMode.D45Pred, 14, // 6 = D45_NODE - -(sbyte)PredictionMode.D63Pred, 16, // 7 = D63_NODE - -(sbyte)PredictionMode.D153Pred, -(sbyte)PredictionMode.D207Pred, // 8 = D153_NODE - }; + /* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */ + public static readonly sbyte[] IntraModeTree = + [ + -(sbyte)PredictionMode.DcPred, 2, /* 0 = DC_NODE */ + -(sbyte)PredictionMode.TmPred, 4, /* 1 = TM_NODE */ + -(sbyte)PredictionMode.VPred, 6, /* 2 = V_NODE */ + 8, 12, /* 3 = COM_NODE */ + -(sbyte)PredictionMode.HPred, 10, /* 4 = H_NODE */ + -(sbyte)PredictionMode.D135Pred, -(sbyte)PredictionMode.D117Pred, /* 5 = D135_NODE */ + -(sbyte)PredictionMode.D45Pred, 14, /* 6 = D45_NODE */ + -(sbyte)PredictionMode.D63Pred, 16, /* 7 = D63_NODE */ + -(sbyte)PredictionMode.D153Pred, -(sbyte)PredictionMode.D207Pred /* 8 = D153_NODE */ + ]; - public static readonly sbyte[] Vp9InterModeTree = { + public static readonly sbyte[] InterModeTree = + [ -((sbyte)PredictionMode.ZeroMv - (sbyte)PredictionMode. NearestMv), 2, -((sbyte)PredictionMode.NearestMv - (sbyte)PredictionMode.NearestMv), 4, -((sbyte)PredictionMode.NearMv - (sbyte)PredictionMode.NearestMv), - -((sbyte)PredictionMode.NewMv - (sbyte)PredictionMode.NearestMv), - }; + -((sbyte)PredictionMode.NewMv - (sbyte)PredictionMode.NearestMv) + ]; - public static readonly sbyte[] Vp9PartitionTree = { - -(sbyte)PartitionType.PartitionNone, 2, -(sbyte)PartitionType.PartitionHorz, 4, -(sbyte)PartitionType.PartitionVert, -(sbyte)PartitionType.PartitionSplit, - }; + public static readonly sbyte[] PartitionTree = + [ + -(sbyte)PartitionType.PartitionNone, 2, -(sbyte)PartitionType.PartitionHorz, 4, -(sbyte)PartitionType.PartitionVert, -(sbyte)PartitionType.PartitionSplit + ]; - public static readonly sbyte[] Vp9SwitchableInterpTree = { - -Constants.EightTap, 2, -Constants.EightTapSmooth, -Constants.EightTapSharp, - }; + public static readonly sbyte[] SwitchableInterpTree = + [ + -Constants.EightTap, 2, -Constants.EightTapSmooth, -Constants.EightTapSharp + ]; - public static readonly sbyte[] Vp9SegmentTree = { - 2, 4, 6, 8, 10, 12, 0, -1, -2, -3, -4, -5, -6, -7, - }; + public static readonly sbyte[] SegmentTree = + [ + 2, 4, 6, 8, 10, 12, 0, -1, -2, -3, -4, -5, -6, -7 + ]; // MV Ref @@ -1390,192 +1357,195 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // adding 9 for each intra block, 3 for each zero mv and 1 for each new // motion vector. This single number is then converted into a context // with a single lookup ( CounterToContext ). - public static readonly int[] Mode2Counter = { - 9, // DC_PRED - 9, // V_PRED - 9, // H_PRED - 9, // D45_PRED - 9, // D135_PRED - 9, // D117_PRED - 9, // D153_PRED - 9, // D207_PRED - 9, // D63_PRED - 9, // TM_PRED - 0, // NEARESTMV - 0, // NEARMV - 3, // ZEROMV - 1, // NEWMV - }; + public static readonly int[] Mode2Counter = + [ + 9, // DC_PRED + 9, // V_PRED + 9, // H_PRED + 9, // D45_PRED + 9, // D135_PRED + 9, // D117_PRED + 9, // D153_PRED + 9, // D207_PRED + 9, // D63_PRED + 9, // TM_PRED + 0, // NEARESTMV + 0, // NEARMV + 3, // ZEROMV + 1 // NEWMV + ]; // There are 3^3 different combinations of 3 counts that can be either 0,1 or // 2. However the actual count can never be greater than 2 so the highest // counter we need is 18. 9 is an invalid counter that's never used. - public static readonly MotionVectorContext[] CounterToContext = { - MotionVectorContext.BothPredicted, // 0 - MotionVectorContext.NewPlusNonIntra, // 1 - MotionVectorContext.BothNew, // 2 + public static readonly MotionVectorContext[] CounterToContext = + [ + MotionVectorContext.BothPredicted, // 0 + MotionVectorContext.NewPlusNonIntra, // 1 + MotionVectorContext.BothNew, // 2 MotionVectorContext.ZeroPlusPredicted, // 3 - MotionVectorContext.NewPlusNonIntra, // 4 - MotionVectorContext.InvalidCase, // 5 - MotionVectorContext.BothZero, // 6 - MotionVectorContext.InvalidCase, // 7 - MotionVectorContext.InvalidCase, // 8 + MotionVectorContext.NewPlusNonIntra, // 4 + MotionVectorContext.InvalidCase, // 5 + MotionVectorContext.BothZero, // 6 + MotionVectorContext.InvalidCase, // 7 + MotionVectorContext.InvalidCase, // 8 MotionVectorContext.IntraPlusNonIntra, // 9 MotionVectorContext.IntraPlusNonIntra, // 10 - MotionVectorContext.InvalidCase, // 11 + MotionVectorContext.InvalidCase, // 11 MotionVectorContext.IntraPlusNonIntra, // 12 - MotionVectorContext.InvalidCase, // 13 - MotionVectorContext.InvalidCase, // 14 - MotionVectorContext.InvalidCase, // 15 - MotionVectorContext.InvalidCase, // 16 - MotionVectorContext.InvalidCase, // 17 - MotionVectorContext.BothIntra, // 18 - }; + MotionVectorContext.InvalidCase, // 13 + MotionVectorContext.InvalidCase, // 14 + MotionVectorContext.InvalidCase, // 15 + MotionVectorContext.InvalidCase, // 16 + MotionVectorContext.InvalidCase, // 17 + MotionVectorContext.BothIntra // 18 + ]; - public static readonly Position[][] MvRefBlocks = { + public static readonly Position[][] MvRefBlocks = new Position[][] + { // 4X4 - new Position[] { - new(-1, 0), - new(0, -1), - new(-1, -1), - new(-2, 0), - new(0, -2), - new(-2, -1), - new(-1, -2), - new(-2, -2), - }, - // 4X8 - new Position[] { - new(-1, 0), - new(0, -1), - new(-1, -1), - new(-2, 0), - new(0, -2), - new(-2, -1), - new(-1, -2), - new(-2, -2), - }, - // 8X4 - new Position[] { - new(-1, 0), - new(0, -1), - new(-1, -1), - new(-2, 0), - new(0, -2), - new(-2, -1), - new(-1, -2), - new(-2, -2), - }, + [ + new Position( -1, 0 ), + new Position( 0, -1 ), + new Position( -1, -1 ), + new Position( -2, 0 ), + new Position( 0, -2 ), + new Position( -2, -1 ), + new Position( -1, -2 ), + new Position( -2, -2 ) + ], + // 4x8 + [ + new Position( -1, 0 ), + new Position( 0, -1 ), + new Position( -1, -1 ), + new Position( -2, 0 ), + new Position( 0, -2 ), + new Position( -2, -1 ), + new Position( -1, -2 ), + new Position( -2, -2 ) + ], + // 8x4 + [ + new Position( -1, 0 ), + new Position( 0, -1 ), + new Position( -1, -1 ), + new Position( -2, 0 ), + new Position( 0, -2 ), + new Position( -2, -1 ), + new Position( -1, -2 ), + new Position( -2, -2 ) + ], // 8X8 - new Position[] { - new(-1, 0), - new(0, -1), - new(-1, -1), - new(-2, 0), - new(0, -2), - new(-2, -1), - new(-1, -2), - new(-2, -2), - }, - // 8X16 - new Position[] { - new(0, -1), - new(-1, 0), - new(1, -1), - new(-1, -1), - new(0, -2), - new(-2, 0), - new(-2, -1), - new(-1, -2), - }, - // 16X8 - new Position[] { - new(-1, 0), - new(0, -1), - new(-1, 1), - new(-1, -1), - new(-2, 0), - new(0, -2), - new(-1, -2), - new(-2, -1), - }, + [ + new Position( -1, 0 ), + new Position( 0, -1 ), + new Position( -1, -1 ), + new Position( -2, 0 ), + new Position( 0, -2 ), + new Position( -2, -1 ), + new Position( -1, -2 ), + new Position( -2, -2 ) + ], + // 8x16 + [ + new Position( 0, -1 ), + new Position( -1, 0 ), + new Position( 1, -1 ), + new Position( -1, -1 ), + new Position( 0, -2 ), + new Position( -2, 0 ), + new Position( -2, -1 ), + new Position( -1, -2 ) + ], + // 16x8 + [ + new Position( -1, 0 ), + new Position( 0, -1 ), + new Position( -1, 1 ), + new Position( -1, -1 ), + new Position( -2, 0 ), + new Position( 0, -2 ), + new Position( -1, -2 ), + new Position( -2, -1 ) + ], // 16X16 - new Position[] { - new(-1, 0), - new(0, -1), - new(-1, 1), - new(1, -1), - new(-1, -1), - new(-3, 0), - new(0, -3), - new(-3, -3), - }, - // 16X32 - new Position[] { - new(0, -1), - new(-1, 0), - new(2, -1), - new(-1, -1), - new(-1, 1), - new(0, -3), - new(-3, 0), - new(-3, -3), - }, - // 32X16 - new Position[] { - new(-1, 0), - new(0, -1), - new(-1, 2), - new(-1, -1), - new(1, -1), - new(-3, 0), - new(0, -3), - new(-3, -3), - }, + [ + new Position( -1, 0 ), + new Position( 0, -1 ), + new Position( -1, 1 ), + new Position( 1, -1 ), + new Position( -1, -1 ), + new Position( -3, 0 ), + new Position( 0, -3 ), + new Position( -3, -3 ) + ], + // 16x32 + [ + new Position( 0, -1 ), + new Position( -1, 0 ), + new Position( 2, -1 ), + new Position( -1, -1 ), + new Position( -1, 1 ), + new Position( 0, -3 ), + new Position( -3, 0 ), + new Position( -3, -3 ) + ], + // 32x16 + [ + new Position( -1, 0 ), + new Position( 0, -1 ), + new Position( -1, 2 ), + new Position( -1, -1 ), + new Position( 1, -1 ), + new Position( -3, 0 ), + new Position( 0, -3 ), + new Position( -3, -3 ) + ], // 32X32 - new Position[] { - new(-1, 1), - new(1, -1), - new(-1, 2), - new(2, -1), - new(-1, -1), - new(-3, 0), - new(0, -3), - new(-3, -3), - }, - // 32X64 - new Position[] { - new(0, -1), - new(-1, 0), - new(4, -1), - new(-1, 2), - new(-1, -1), - new(0, -3), - new(-3, 0), - new(2, -1), - }, - // 64X32 - new Position[] { - new(-1, 0), - new(0, -1), - new(-1, 4), - new(2, -1), - new(-1, -1), - new(-3, 0), - new(0, -3), - new(-1, 2), - }, - // 64X64 - new Position[] { - new(-1, 3), - new(3, -1), - new(-1, 4), - new(4, -1), - new(-1, -1), - new(-1, 0), - new(0, -1), - new(-1, 6), - }, + [ + new Position( -1, 1 ), + new Position( 1, -1 ), + new Position( -1, 2 ), + new Position( 2, -1 ), + new Position( -1, -1 ), + new Position( -3, 0 ), + new Position( 0, -3 ), + new Position( -3, -3 ) + ], + // 32x64 + [ + new Position( 0, -1 ), + new Position( -1, 0 ), + new Position( 4, -1 ), + new Position( -1, 2 ), + new Position( -1, -1 ), + new Position( 0, -3 ), + new Position( -3, 0 ), + new Position( 2, -1 ) + ], + // 64x32 + [ + new Position( -1, 0 ), + new Position( 0, -1 ), + new Position( -1, 4 ), + new Position( 2, -1 ), + new Position( -1, -1 ), + new Position( -3, 0 ), + new Position( 0, -3 ), + new Position( -1, 2 ) + ], + // 64x64 + [ + new Position( -1, 3 ), + new Position( 3, -1 ), + new Position( -1, 4 ), + new Position( 4, -1 ), + new Position( -1, -1 ), + new Position( -1, 0 ), + new Position( 0, -1 ), + new Position( -1, 6 ) + ] }; } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/PredCommon.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/PredCommon.cs index 1f391f6eb..cf91eedeb 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/PredCommon.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/PredCommon.cs @@ -13,7 +13,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // left of the entries corresponding to real macroblocks. // The prediction flags in these dummy entries are initialized to 0. if (!xd.AboveMi.IsNull && !xd.LeftMi.IsNull) - { // both edges available + { + // both edges available if (!xd.AboveMi.Value.HasSecondRef() && !xd.LeftMi.Value.HasSecondRef()) { // Neither edge uses comp pred (0/1) @@ -23,12 +24,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 else if (!xd.AboveMi.Value.HasSecondRef()) { // One of two edges uses comp pred (2/3) - ctx = 2 + (xd.AboveMi.Value.RefFrame[0] == cm.CompFixedRef || !xd.AboveMi.Value.IsInterBlock() ? 1 : 0); + ctx = 2 + (xd.AboveMi.Value.RefFrame[0] == cm.CompFixedRef || !xd.AboveMi.Value.IsInterBlock() + ? 1 + : 0); } else if (!xd.LeftMi.Value.HasSecondRef()) { // One of two edges uses comp pred (2/3) - ctx = 2 + (xd.LeftMi.Value.RefFrame[0] == cm.CompFixedRef || !xd.LeftMi.Value.IsInterBlock() ? 1 : 0); + ctx = 2 + + (xd.LeftMi.Value.RefFrame[0] == cm.CompFixedRef || !xd.LeftMi.Value.IsInterBlock() ? 1 : 0); } else // Both edges use comp pred (4) { @@ -36,7 +40,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } else if (!xd.AboveMi.IsNull || !xd.LeftMi.IsNull) - { // One edge available + { + // One edge available ref ModeInfo edgeMi = ref !xd.AboveMi.IsNull ? ref xd.AboveMi.Value : ref xd.LeftMi.Value; if (!edgeMi.HasSecondRef()) @@ -51,11 +56,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } else - { // No edges available (1) + { + // No edges available (1) ctx = 1; } - Debug.Assert(ctx >= 0 && ctx < Constants.CompInterContexts); + Debug.Assert(ctx is >= 0 and < Constants.CompInterContexts); return ctx; } @@ -71,29 +77,33 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int varRefIdx = fixRefIdx == 0 ? 1 : 0; if (!xd.AboveMi.IsNull && !xd.LeftMi.IsNull) - { // Both edges available + { + // Both edges available bool aboveIntra = !xd.AboveMi.Value.IsInterBlock(); bool leftIntra = !xd.LeftMi.Value.IsInterBlock(); if (aboveIntra && leftIntra) - { // Intra/Intra (2) + { + // Intra/Intra (2) predContext = 2; } else if (aboveIntra || leftIntra) - { // Intra/Inter + { + // Intra/Inter ref ModeInfo edgeMi = ref aboveIntra ? ref xd.LeftMi.Value : ref xd.AboveMi.Value; if (!edgeMi.HasSecondRef()) // single pred (1/3) { - predContext = 1 + 2 * (edgeMi.RefFrame[0] != cm.CompVarRef[1] ? 1 : 0); + predContext = 1 + (2 * (edgeMi.RefFrame[0] != cm.CompVarRef[1] ? 1 : 0)); } else // Comp pred (1/3) { - predContext = 1 + 2 * (edgeMi.RefFrame[varRefIdx] != cm.CompVarRef[1] ? 1 : 0); + predContext = 1 + (2 * (edgeMi.RefFrame[varRefIdx] != cm.CompVarRef[1] ? 1 : 0)); } } else - { // Inter/Inter + { + // Inter/Inter bool lSg = !xd.LeftMi.Value.HasSecondRef(); bool aSg = !xd.AboveMi.Value.HasSecondRef(); sbyte vrfa = aSg ? xd.AboveMi.Value.RefFrame[0] : xd.AboveMi.Value.RefFrame[varRefIdx]; @@ -104,7 +114,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 predContext = 0; } else if (lSg && aSg) - { // Single/Single + { + // Single/Single if ((vrfa == cm.CompFixedRef && vrfl == cm.CompVarRef[0]) || (vrfl == cm.CompFixedRef && vrfa == cm.CompVarRef[0])) { @@ -120,7 +131,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } else if (lSg || aSg) - { // Single/Comp + { + // Single/Comp sbyte vrfc = lSg ? vrfa : vrfl; sbyte rfs = aSg ? vrfa : vrfl; if (vrfc == cm.CompVarRef[1] && rfs != cm.CompVarRef[1]) @@ -137,7 +149,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } else if (vrfa == vrfl) - { // Comp/Comp + { + // Comp/Comp predContext = 4; } else @@ -147,7 +160,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } else if (!xd.AboveMi.IsNull || !xd.LeftMi.IsNull) - { // One edge available + { + // One edge available ref ModeInfo edgeMi = ref !xd.AboveMi.IsNull ? ref xd.AboveMi.Value : ref xd.LeftMi.Value; if (!edgeMi.IsInterBlock()) @@ -167,11 +181,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } else - { // No edges available (2) + { + // No edges available (2) predContext = 2; } - Debug.Assert(predContext >= 0 && predContext < Constants.RefContexts); + Debug.Assert(predContext is >= 0 and < Constants.RefContexts); return predContext; } @@ -183,16 +198,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // left of the entries corresponding to real macroblocks. // The prediction flags in these dummy entries are initialized to 0. if (!xd.AboveMi.IsNull && !xd.LeftMi.IsNull) - { // Both edges available + { + // Both edges available bool aboveIntra = !xd.AboveMi.Value.IsInterBlock(); bool leftIntra = !xd.LeftMi.Value.IsInterBlock(); if (aboveIntra && leftIntra) - { // Intra/Intra + { + // Intra/Intra predContext = 2; } else if (aboveIntra || leftIntra) - { // Intra/Inter or Inter/Intra + { + // Intra/Inter or Inter/Intra ref ModeInfo edgeMi = ref aboveIntra ? ref xd.LeftMi.Value : ref xd.AboveMi.Value; if (!edgeMi.HasSecondRef()) { @@ -201,11 +219,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 else { predContext = 1 + (edgeMi.RefFrame[0] == Constants.LastFrame || - edgeMi.RefFrame[1] == Constants.LastFrame ? 1 : 0); + edgeMi.RefFrame[1] == Constants.LastFrame + ? 1 + : 0); } } else - { // Inter/Inter + { + // Inter/Inter bool aboveHasSecond = xd.AboveMi.Value.HasSecondRef(); bool leftHasSecond = xd.LeftMi.Value.HasSecondRef(); sbyte above0 = xd.AboveMi.Value.RefFrame[0]; @@ -216,7 +237,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (aboveHasSecond && leftHasSecond) { predContext = 1 + (above0 == Constants.LastFrame || above1 == Constants.LastFrame || - left0 == Constants.LastFrame || left1 == Constants.LastFrame ? 1 : 0); + left0 == Constants.LastFrame || left1 == Constants.LastFrame + ? 1 + : 0); } else if (aboveHasSecond || leftHasSecond) { @@ -230,24 +253,28 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } else { - predContext = (crf1 == Constants.LastFrame || crf2 == Constants.LastFrame ? 1 : 0); + predContext = crf1 == Constants.LastFrame || crf2 == Constants.LastFrame ? 1 : 0; } } else { - predContext = 2 * (above0 == Constants.LastFrame ? 1 : 0) + 2 * (left0 == Constants.LastFrame ? 1 : 0); + predContext = (2 * (above0 == Constants.LastFrame ? 1 : 0)) + + (2 * (left0 == Constants.LastFrame ? 1 : 0)); } } } else if (!xd.AboveMi.IsNull || !xd.LeftMi.IsNull) - { // One edge available + { + // One edge available ref ModeInfo edgeMi = ref !xd.AboveMi.IsNull ? ref xd.AboveMi.Value : ref xd.LeftMi.Value; if (!edgeMi.IsInterBlock()) - { // Intra + { + // Intra predContext = 2; } else - { // Inter + { + // Inter if (!edgeMi.HasSecondRef()) { predContext = 4 * (edgeMi.RefFrame[0] == Constants.LastFrame ? 1 : 0); @@ -255,16 +282,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 else { predContext = 1 + (edgeMi.RefFrame[0] == Constants.LastFrame || - edgeMi.RefFrame[1] == Constants.LastFrame ? 1 : 0); + edgeMi.RefFrame[1] == Constants.LastFrame + ? 1 + : 0); } } } else - { // No edges available + { + // No edges available predContext = 2; } - Debug.Assert(predContext >= 0 && predContext < Constants.RefContexts); + Debug.Assert(predContext is >= 0 and < Constants.RefContexts); return predContext; } @@ -277,16 +307,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 // left of the entries corresponding to real macroblocks. // The prediction flags in these dummy entries are initialized to 0. if (!xd.AboveMi.IsNull && !xd.LeftMi.IsNull) - { // Both edges available + { + // Both edges available bool aboveIntra = !xd.AboveMi.Value.IsInterBlock(); bool leftIntra = !xd.LeftMi.Value.IsInterBlock(); if (aboveIntra && leftIntra) - { // Intra/Intra + { + // Intra/Intra predContext = 2; } else if (aboveIntra || leftIntra) - { // Intra/Inter or Inter/Intra + { + // Intra/Inter or Inter/Intra ref ModeInfo edgeMi = ref aboveIntra ? ref xd.LeftMi.Value : ref xd.AboveMi.Value; if (!edgeMi.HasSecondRef()) { @@ -301,12 +334,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } else { - predContext = 1 + 2 * (edgeMi.RefFrame[0] == Constants.GoldenFrame || - edgeMi.RefFrame[1] == Constants.GoldenFrame ? 1 : 0); + predContext = 1 + (2 * (edgeMi.RefFrame[0] == Constants.GoldenFrame || + edgeMi.RefFrame[1] == Constants.GoldenFrame + ? 1 + : 0)); } } else - { // Inter/Inter + { + // Inter/Inter bool aboveHasSecond = xd.AboveMi.Value.HasSecondRef(); bool leftHasSecond = xd.LeftMi.Value.HasSecondRef(); sbyte above0 = xd.AboveMi.Value.RefFrame[0]; @@ -319,7 +355,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (above0 == left0 && above1 == left1) { predContext = 3 * (above0 == Constants.GoldenFrame || above1 == Constants.GoldenFrame || - left0 == Constants.GoldenFrame || left1 == Constants.GoldenFrame ? 1 : 0); + left0 == Constants.GoldenFrame || left1 == Constants.GoldenFrame + ? 1 + : 0); } else { @@ -342,7 +380,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } else { - predContext = 1 + 2 * (crf1 == Constants.GoldenFrame || crf2 == Constants.GoldenFrame ? 1 : 0); + predContext = + 1 + (2 * (crf1 == Constants.GoldenFrame || crf2 == Constants.GoldenFrame ? 1 : 0)); } } else @@ -353,18 +392,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } else if (above0 == Constants.LastFrame || left0 == Constants.LastFrame) { - sbyte edge0 = (above0 == Constants.LastFrame) ? left0 : above0; + sbyte edge0 = above0 == Constants.LastFrame ? left0 : above0; predContext = 4 * (edge0 == Constants.GoldenFrame ? 1 : 0); } else { - predContext = 2 * (above0 == Constants.GoldenFrame ? 1 : 0) + 2 * (left0 == Constants.GoldenFrame ? 1 : 0); + predContext = (2 * (above0 == Constants.GoldenFrame ? 1 : 0)) + + (2 * (left0 == Constants.GoldenFrame ? 1 : 0)); } } } } else if (!xd.AboveMi.IsNull || !xd.LeftMi.IsNull) - { // One edge available + { + // One edge available ref ModeInfo edgeMi = ref !xd.AboveMi.IsNull ? ref xd.AboveMi.Value : ref xd.LeftMi.Value; if (!edgeMi.IsInterBlock() || (edgeMi.RefFrame[0] == Constants.LastFrame && !edgeMi.HasSecondRef())) @@ -378,15 +419,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 else { predContext = 3 * (edgeMi.RefFrame[0] == Constants.GoldenFrame || - edgeMi.RefFrame[1] == Constants.GoldenFrame ? 1 : 0); + edgeMi.RefFrame[1] == Constants.GoldenFrame + ? 1 + : 0); } } else - { // No edges available (2) + { + // No edges available (2) predContext = 2; } - Debug.Assert(predContext >= 0 && predContext < Constants.RefContexts); + Debug.Assert(predContext is >= 0 and < Constants.RefContexts); return predContext; } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Prob.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Prob.cs new file mode 100644 index 000000000..6967e63a6 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Prob.cs @@ -0,0 +1,94 @@ +using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Nvdec.Vp9.Common; +using System; +using System.Diagnostics; + +namespace Ryujinx.Graphics.Nvdec.Vp9 +{ + public static class Prob + { + public const int MaxProb = 255; + + private static byte GetProb(uint num, uint den) + { + Debug.Assert(den != 0); + { + int p = (int)((((ulong)num * 256) + (den >> 1)) / den); + // (p > 255) ? 255 : (p < 1) ? 1 : p; + int clippedProb = p | ((255 - p) >> 23) | (p == 0 ? 1 : 0); + return (byte)clippedProb; + } + } + + private static byte GetBinaryProb(uint n0, uint n1) + { + uint den = n0 + n1; + if (den == 0) + { + return 128; + } + + return GetProb(n0, den); + } + + /* This function assumes prob1 and prob2 are already within [1,255] range. */ + public static byte WeightedProb(int prob1, int prob2, int factor) + { + return (byte)BitUtils.RoundPowerOfTwo((prob1 * (256 - factor)) + (prob2 * factor), 8); + } + + public static byte MergeProbs(byte preProb, ref Array2 ct, uint countSat, uint maxUpdateFactor) + { + byte prob = GetBinaryProb(ct[0], ct[1]); + uint count = Math.Min(ct[0] + ct[1], countSat); + uint factor = maxUpdateFactor * count / countSat; + return WeightedProb(preProb, prob, (int)factor); + } + + // MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT; + private static readonly uint[] _countToUpdateFactor = + [ + 0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, 70, 76, 83, 89, 96, 102, 108, 115, 121, 128 + ]; + + private const int ModeMvCountSat = 20; + + public static byte ModeMvMergeProbs(byte preProb, ref Array2 ct) + { + uint den = ct[0] + ct[1]; + if (den == 0) + { + return preProb; + } + + uint count = Math.Min(den, ModeMvCountSat); + uint factor = _countToUpdateFactor[(int)count]; + byte prob = GetProb(ct[0], den); + return WeightedProb(preProb, prob, (int)factor); + } + + private static uint TreeMergeProbsImpl( + uint i, + sbyte[] tree, + ReadOnlySpan preProbs, + ReadOnlySpan counts, + Span probs) + { + int l = tree[i]; + uint leftCount = l <= 0 ? counts[-l] : TreeMergeProbsImpl((uint)l, tree, preProbs, counts, probs); + int r = tree[i + 1]; + uint rightCount = r <= 0 ? counts[-r] : TreeMergeProbsImpl((uint)r, tree, preProbs, counts, probs); + Array2 ct = new(); + ct[0] = leftCount; + ct[1] = rightCount; + probs[(int)(i >> 1)] = ModeMvMergeProbs(preProbs[(int)(i >> 1)], ref ct); + return leftCount + rightCount; + } + + public static void VpxTreeMergeProbs(sbyte[] tree, ReadOnlySpan preProbs, ReadOnlySpan counts, + Span probs) + { + TreeMergeProbsImpl(0, tree, preProbs, counts, probs); + } + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/QuantCommon.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/QuantCommon.cs index 8e8fafdb1..36e4f2704 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/QuantCommon.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/QuantCommon.cs @@ -1,4 +1,3 @@ -using Ryujinx.Graphics.Nvdec.Vp9.Types; using System; using System.Diagnostics; @@ -6,153 +5,113 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { internal static class QuantCommon { - public const int MinQ = 0; public const int MaxQ = 255; + public const int QindexBits = 8; - private static readonly short[] _dcQlookup = { - 4, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, - 19, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, - 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, - 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 53, - 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, - 66, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 74, 75, 76, - 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 85, 85, 87, 88, - 90, 92, 93, 95, 96, 98, 99, 101, 102, 104, 105, 107, 108, 110, - 111, 113, 114, 116, 117, 118, 120, 121, 123, 125, 127, 129, 131, 134, - 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 161, 164, - 166, 169, 172, 174, 177, 180, 182, 185, 187, 190, 192, 195, 199, 202, - 205, 208, 211, 214, 217, 220, 223, 226, 230, 233, 237, 240, 243, 247, - 250, 253, 257, 261, 265, 269, 272, 276, 280, 284, 288, 292, 296, 300, - 304, 309, 313, 317, 322, 326, 330, 335, 340, 344, 349, 354, 359, 364, - 369, 374, 379, 384, 389, 395, 400, 406, 411, 417, 423, 429, 435, 441, - 447, 454, 461, 467, 475, 482, 489, 497, 505, 513, 522, 530, 539, 549, - 559, 569, 579, 590, 602, 614, 626, 640, 654, 668, 684, 700, 717, 736, - 755, 775, 796, 819, 843, 869, 896, 925, 955, 988, 1022, 1058, 1098, 1139, - 1184, 1232, 1282, 1336, - }; + private static readonly short[] _dcQlookup = + [ + 4, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, + 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, + 52, 53, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 70, 71, 72, + 73, 74, 74, 75, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 85, 85, 87, 88, 90, 92, 93, 95, 96, 98, 99, + 101, 102, 104, 105, 107, 108, 110, 111, 113, 114, 116, 117, 118, 120, 121, 123, 125, 127, 129, 131, 134, + 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 161, 164, 166, 169, 172, 174, 177, 180, 182, + 185, 187, 190, 192, 195, 199, 202, 205, 208, 211, 214, 217, 220, 223, 226, 230, 233, 237, 240, 243, 247, + 250, 253, 257, 261, 265, 269, 272, 276, 280, 284, 288, 292, 296, 300, 304, 309, 313, 317, 322, 326, 330, + 335, 340, 344, 349, 354, 359, 364, 369, 374, 379, 384, 389, 395, 400, 406, 411, 417, 423, 429, 435, 441, + 447, 454, 461, 467, 475, 482, 489, 497, 505, 513, 522, 530, 539, 549, 559, 569, 579, 590, 602, 614, 626, + 640, 654, 668, 684, 700, 717, 736, 755, 775, 796, 819, 843, 869, 896, 925, 955, 988, 1022, 1058, 1098, + 1139, 1184, 1232, 1282, 1336 + ]; - private static readonly short[] _dcQlookup10 = { - 4, 9, 10, 13, 15, 17, 20, 22, 25, 28, 31, 34, 37, - 40, 43, 47, 50, 53, 57, 60, 64, 68, 71, 75, 78, 82, - 86, 90, 93, 97, 101, 105, 109, 113, 116, 120, 124, 128, 132, - 136, 140, 143, 147, 151, 155, 159, 163, 166, 170, 174, 178, 182, - 185, 189, 193, 197, 200, 204, 208, 212, 215, 219, 223, 226, 230, - 233, 237, 241, 244, 248, 251, 255, 259, 262, 266, 269, 273, 276, - 280, 283, 287, 290, 293, 297, 300, 304, 307, 310, 314, 317, 321, - 324, 327, 331, 334, 337, 343, 350, 356, 362, 369, 375, 381, 387, - 394, 400, 406, 412, 418, 424, 430, 436, 442, 448, 454, 460, 466, - 472, 478, 484, 490, 499, 507, 516, 525, 533, 542, 550, 559, 567, - 576, 584, 592, 601, 609, 617, 625, 634, 644, 655, 666, 676, 687, - 698, 708, 718, 729, 739, 749, 759, 770, 782, 795, 807, 819, 831, - 844, 856, 868, 880, 891, 906, 920, 933, 947, 961, 975, 988, 1001, - 1015, 1030, 1045, 1061, 1076, 1090, 1105, 1120, 1137, 1153, 1170, 1186, 1202, - 1218, 1236, 1253, 1271, 1288, 1306, 1323, 1342, 1361, 1379, 1398, 1416, 1436, - 1456, 1476, 1496, 1516, 1537, 1559, 1580, 1601, 1624, 1647, 1670, 1692, 1717, - 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929, 1958, 1990, 2021, 2054, 2088, - 2123, 2159, 2197, 2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561, 2616, 2675, - 2737, 2802, 2871, 2944, 3020, 3102, 3188, 3280, 3375, 3478, 3586, 3702, 3823, - 3953, 4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347, - }; + private static readonly short[] _dcQlookup10 = + [ + 4, 9, 10, 13, 15, 17, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 50, 53, 57, 60, 64, 68, 71, 75, 78, 82, + 86, 90, 93, 97, 101, 105, 109, 113, 116, 120, 124, 128, 132, 136, 140, 143, 147, 151, 155, 159, 163, + 166, 170, 174, 178, 182, 185, 189, 193, 197, 200, 204, 208, 212, 215, 219, 223, 226, 230, 233, 237, 241, + 244, 248, 251, 255, 259, 262, 266, 269, 273, 276, 280, 283, 287, 290, 293, 297, 300, 304, 307, 310, 314, + 317, 321, 324, 327, 331, 334, 337, 343, 350, 356, 362, 369, 375, 381, 387, 394, 400, 406, 412, 418, 424, + 430, 436, 442, 448, 454, 460, 466, 472, 478, 484, 490, 499, 507, 516, 525, 533, 542, 550, 559, 567, 576, + 584, 592, 601, 609, 617, 625, 634, 644, 655, 666, 676, 687, 698, 708, 718, 729, 739, 749, 759, 770, 782, + 795, 807, 819, 831, 844, 856, 868, 880, 891, 906, 920, 933, 947, 961, 975, 988, 1001, 1015, 1030, 1045, + 1061, 1076, 1090, 1105, 1120, 1137, 1153, 1170, 1186, 1202, 1218, 1236, 1253, 1271, 1288, 1306, 1323, + 1342, 1361, 1379, 1398, 1416, 1436, 1456, 1476, 1496, 1516, 1537, 1559, 1580, 1601, 1624, 1647, 1670, + 1692, 1717, 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929, 1958, 1990, 2021, 2054, 2088, 2123, 2159, + 2197, 2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561, 2616, 2675, 2737, 2802, 2871, 2944, 3020, 3102, + 3188, 3280, 3375, 3478, 3586, 3702, 3823, 3953, 4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347 + ]; - private static readonly short[] _dcQlookup12 = { - 4, 12, 18, 25, 33, 41, 50, 60, 70, 80, 91, - 103, 115, 127, 140, 153, 166, 180, 194, 208, 222, 237, - 251, 266, 281, 296, 312, 327, 343, 358, 374, 390, 405, - 421, 437, 453, 469, 484, 500, 516, 532, 548, 564, 580, - 596, 611, 627, 643, 659, 674, 690, 706, 721, 737, 752, - 768, 783, 798, 814, 829, 844, 859, 874, 889, 904, 919, - 934, 949, 964, 978, 993, 1008, 1022, 1037, 1051, 1065, 1080, - 1094, 1108, 1122, 1136, 1151, 1165, 1179, 1192, 1206, 1220, 1234, - 1248, 1261, 1275, 1288, 1302, 1315, 1329, 1342, 1368, 1393, 1419, - 1444, 1469, 1494, 1519, 1544, 1569, 1594, 1618, 1643, 1668, 1692, - 1717, 1741, 1765, 1789, 1814, 1838, 1862, 1885, 1909, 1933, 1957, - 1992, 2027, 2061, 2096, 2130, 2165, 2199, 2233, 2267, 2300, 2334, - 2367, 2400, 2434, 2467, 2499, 2532, 2575, 2618, 2661, 2704, 2746, - 2788, 2830, 2872, 2913, 2954, 2995, 3036, 3076, 3127, 3177, 3226, - 3275, 3324, 3373, 3421, 3469, 3517, 3565, 3621, 3677, 3733, 3788, - 3843, 3897, 3951, 4005, 4058, 4119, 4181, 4241, 4301, 4361, 4420, - 4479, 4546, 4612, 4677, 4742, 4807, 4871, 4942, 5013, 5083, 5153, - 5222, 5291, 5367, 5442, 5517, 5591, 5665, 5745, 5825, 5905, 5984, - 6063, 6149, 6234, 6319, 6404, 6495, 6587, 6678, 6769, 6867, 6966, - 7064, 7163, 7269, 7376, 7483, 7599, 7715, 7832, 7958, 8085, 8214, - 8352, 8492, 8635, 8788, 8945, 9104, 9275, 9450, 9639, 9832, 10031, - 10245, 10465, 10702, 10946, 11210, 11482, 11776, 12081, 12409, 12750, 13118, - 13501, 13913, 14343, 14807, 15290, 15812, 16356, 16943, 17575, 18237, 18949, - 19718, 20521, 21387, - }; + private static readonly short[] _dcQlookup12 = + [ + 4, 12, 18, 25, 33, 41, 50, 60, 70, 80, 91, 103, 115, 127, 140, 153, 166, 180, 194, 208, 222, 237, 251, + 266, 281, 296, 312, 327, 343, 358, 374, 390, 405, 421, 437, 453, 469, 484, 500, 516, 532, 548, 564, 580, + 596, 611, 627, 643, 659, 674, 690, 706, 721, 737, 752, 768, 783, 798, 814, 829, 844, 859, 874, 889, 904, + 919, 934, 949, 964, 978, 993, 1008, 1022, 1037, 1051, 1065, 1080, 1094, 1108, 1122, 1136, 1151, 1165, + 1179, 1192, 1206, 1220, 1234, 1248, 1261, 1275, 1288, 1302, 1315, 1329, 1342, 1368, 1393, 1419, 1444, + 1469, 1494, 1519, 1544, 1569, 1594, 1618, 1643, 1668, 1692, 1717, 1741, 1765, 1789, 1814, 1838, 1862, + 1885, 1909, 1933, 1957, 1992, 2027, 2061, 2096, 2130, 2165, 2199, 2233, 2267, 2300, 2334, 2367, 2400, + 2434, 2467, 2499, 2532, 2575, 2618, 2661, 2704, 2746, 2788, 2830, 2872, 2913, 2954, 2995, 3036, 3076, + 3127, 3177, 3226, 3275, 3324, 3373, 3421, 3469, 3517, 3565, 3621, 3677, 3733, 3788, 3843, 3897, 3951, + 4005, 4058, 4119, 4181, 4241, 4301, 4361, 4420, 4479, 4546, 4612, 4677, 4742, 4807, 4871, 4942, 5013, + 5083, 5153, 5222, 5291, 5367, 5442, 5517, 5591, 5665, 5745, 5825, 5905, 5984, 6063, 6149, 6234, 6319, + 6404, 6495, 6587, 6678, 6769, 6867, 6966, 7064, 7163, 7269, 7376, 7483, 7599, 7715, 7832, 7958, 8085, + 8214, 8352, 8492, 8635, 8788, 8945, 9104, 9275, 9450, 9639, 9832, 10031, 10245, 10465, 10702, 10946, + 11210, 11482, 11776, 12081, 12409, 12750, 13118, 13501, 13913, 14343, 14807, 15290, 15812, 16356, 16943, + 17575, 18237, 18949, 19718, 20521, 21387 + ]; - private static readonly short[] _acQlookup = { - 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, - 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, - 146, 148, 150, 152, 155, 158, 161, 164, 167, 170, 173, 176, 179, - 182, 185, 188, 191, 194, 197, 200, 203, 207, 211, 215, 219, 223, - 227, 231, 235, 239, 243, 247, 251, 255, 260, 265, 270, 275, 280, - 285, 290, 295, 300, 305, 311, 317, 323, 329, 335, 341, 347, 353, - 359, 366, 373, 380, 387, 394, 401, 408, 416, 424, 432, 440, 448, - 456, 465, 474, 483, 492, 501, 510, 520, 530, 540, 550, 560, 571, - 582, 593, 604, 615, 627, 639, 651, 663, 676, 689, 702, 715, 729, - 743, 757, 771, 786, 801, 816, 832, 848, 864, 881, 898, 915, 933, - 951, 969, 988, 1007, 1026, 1046, 1066, 1087, 1108, 1129, 1151, 1173, 1196, - 1219, 1243, 1267, 1292, 1317, 1343, 1369, 1396, 1423, 1451, 1479, 1508, 1537, - 1567, 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828, - }; + private static readonly short[] _acQlookup = + [ + 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 104, 106, 108, 110, 112, 114, + 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 155, 158, + 161, 164, 167, 170, 173, 176, 179, 182, 185, 188, 191, 194, 197, 200, 203, 207, 211, 215, 219, 223, 227, + 231, 235, 239, 243, 247, 251, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300, 305, 311, 317, 323, 329, + 335, 341, 347, 353, 359, 366, 373, 380, 387, 394, 401, 408, 416, 424, 432, 440, 448, 456, 465, 474, 483, + 492, 501, 510, 520, 530, 540, 550, 560, 571, 582, 593, 604, 615, 627, 639, 651, 663, 676, 689, 702, 715, + 729, 743, 757, 771, 786, 801, 816, 832, 848, 864, 881, 898, 915, 933, 951, 969, 988, 1007, 1026, 1046, + 1066, 1087, 1108, 1129, 1151, 1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343, 1369, 1396, 1423, 1451, + 1479, 1508, 1537, 1567, 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828 + ]; - private static readonly short[] _acQlookup10 = { - 4, 9, 11, 13, 16, 18, 21, 24, 27, 30, 33, 37, 40, - 44, 48, 51, 55, 59, 63, 67, 71, 75, 79, 83, 88, 92, - 96, 100, 105, 109, 114, 118, 122, 127, 131, 136, 140, 145, 149, - 154, 158, 163, 168, 172, 177, 181, 186, 190, 195, 199, 204, 208, - 213, 217, 222, 226, 231, 235, 240, 244, 249, 253, 258, 262, 267, - 271, 275, 280, 284, 289, 293, 297, 302, 306, 311, 315, 319, 324, - 328, 332, 337, 341, 345, 349, 354, 358, 362, 367, 371, 375, 379, - 384, 388, 392, 396, 401, 409, 417, 425, 433, 441, 449, 458, 466, - 474, 482, 490, 498, 506, 514, 523, 531, 539, 547, 555, 563, 571, - 579, 588, 596, 604, 616, 628, 640, 652, 664, 676, 688, 700, 713, - 725, 737, 749, 761, 773, 785, 797, 809, 825, 841, 857, 873, 889, - 905, 922, 938, 954, 970, 986, 1002, 1018, 1038, 1058, 1078, 1098, 1118, - 1138, 1158, 1178, 1198, 1218, 1242, 1266, 1290, 1314, 1338, 1362, 1386, 1411, - 1435, 1463, 1491, 1519, 1547, 1575, 1603, 1631, 1663, 1695, 1727, 1759, 1791, - 1823, 1859, 1895, 1931, 1967, 2003, 2039, 2079, 2119, 2159, 2199, 2239, 2283, - 2327, 2371, 2415, 2459, 2507, 2555, 2603, 2651, 2703, 2755, 2807, 2859, 2915, - 2971, 3027, 3083, 3143, 3203, 3263, 3327, 3391, 3455, 3523, 3591, 3659, 3731, - 3803, 3876, 3952, 4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604, 4692, 4784, - 4876, 4972, 5068, 5168, 5268, 5372, 5476, 5584, 5692, 5804, 5916, 6032, 6148, - 6268, 6388, 6512, 6640, 6768, 6900, 7036, 7172, 7312, - }; + private static readonly short[] _acQlookup10 = + [ + 4, 9, 11, 13, 16, 18, 21, 24, 27, 30, 33, 37, 40, 44, 48, 51, 55, 59, 63, 67, 71, 75, 79, 83, 88, 92, + 96, 100, 105, 109, 114, 118, 122, 127, 131, 136, 140, 145, 149, 154, 158, 163, 168, 172, 177, 181, 186, + 190, 195, 199, 204, 208, 213, 217, 222, 226, 231, 235, 240, 244, 249, 253, 258, 262, 267, 271, 275, 280, + 284, 289, 293, 297, 302, 306, 311, 315, 319, 324, 328, 332, 337, 341, 345, 349, 354, 358, 362, 367, 371, + 375, 379, 384, 388, 392, 396, 401, 409, 417, 425, 433, 441, 449, 458, 466, 474, 482, 490, 498, 506, 514, + 523, 531, 539, 547, 555, 563, 571, 579, 588, 596, 604, 616, 628, 640, 652, 664, 676, 688, 700, 713, 725, + 737, 749, 761, 773, 785, 797, 809, 825, 841, 857, 873, 889, 905, 922, 938, 954, 970, 986, 1002, 1018, + 1038, 1058, 1078, 1098, 1118, 1138, 1158, 1178, 1198, 1218, 1242, 1266, 1290, 1314, 1338, 1362, 1386, + 1411, 1435, 1463, 1491, 1519, 1547, 1575, 1603, 1631, 1663, 1695, 1727, 1759, 1791, 1823, 1859, 1895, + 1931, 1967, 2003, 2039, 2079, 2119, 2159, 2199, 2239, 2283, 2327, 2371, 2415, 2459, 2507, 2555, 2603, + 2651, 2703, 2755, 2807, 2859, 2915, 2971, 3027, 3083, 3143, 3203, 3263, 3327, 3391, 3455, 3523, 3591, + 3659, 3731, 3803, 3876, 3952, 4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604, 4692, 4784, 4876, 4972, + 5068, 5168, 5268, 5372, 5476, 5584, 5692, 5804, 5916, 6032, 6148, 6268, 6388, 6512, 6640, 6768, 6900, + 7036, 7172, 7312 + ]; - private static readonly short[] _acQlookup12 = { - 4, 13, 19, 27, 35, 44, 54, 64, 75, 87, 99, - 112, 126, 139, 154, 168, 183, 199, 214, 230, 247, 263, - 280, 297, 314, 331, 349, 366, 384, 402, 420, 438, 456, - 475, 493, 511, 530, 548, 567, 586, 604, 623, 642, 660, - 679, 698, 716, 735, 753, 772, 791, 809, 828, 846, 865, - 884, 902, 920, 939, 957, 976, 994, 1012, 1030, 1049, 1067, - 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1246, 1264, - 1282, 1299, 1317, 1335, 1352, 1370, 1387, 1405, 1422, 1440, 1457, - 1474, 1491, 1509, 1526, 1543, 1560, 1577, 1595, 1627, 1660, 1693, - 1725, 1758, 1791, 1824, 1856, 1889, 1922, 1954, 1987, 2020, 2052, - 2085, 2118, 2150, 2183, 2216, 2248, 2281, 2313, 2346, 2378, 2411, - 2459, 2508, 2556, 2605, 2653, 2701, 2750, 2798, 2847, 2895, 2943, - 2992, 3040, 3088, 3137, 3185, 3234, 3298, 3362, 3426, 3491, 3555, - 3619, 3684, 3748, 3812, 3876, 3941, 4005, 4069, 4149, 4230, 4310, - 4390, 4470, 4550, 4631, 4711, 4791, 4871, 4967, 5064, 5160, 5256, - 5352, 5448, 5544, 5641, 5737, 5849, 5961, 6073, 6185, 6297, 6410, - 6522, 6650, 6778, 6906, 7034, 7162, 7290, 7435, 7579, 7723, 7867, - 8011, 8155, 8315, 8475, 8635, 8795, 8956, 9132, 9308, 9484, 9660, - 9836, 10028, 10220, 10412, 10604, 10812, 11020, 11228, 11437, 11661, 11885, - 12109, 12333, 12573, 12813, 13053, 13309, 13565, 13821, 14093, 14365, 14637, - 14925, 15213, 15502, 15806, 16110, 16414, 16734, 17054, 17390, 17726, 18062, - 18414, 18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486, 21902, 22334, - 22766, 23214, 23662, 24126, 24590, 25070, 25551, 26047, 26559, 27071, 27599, - 28143, 28687, 29247, - }; + private static readonly short[] _acQlookup12 = + [ + 4, 13, 19, 27, 35, 44, 54, 64, 75, 87, 99, 112, 126, 139, 154, 168, 183, 199, 214, 230, 247, 263, 280, + 297, 314, 331, 349, 366, 384, 402, 420, 438, 456, 475, 493, 511, 530, 548, 567, 586, 604, 623, 642, 660, + 679, 698, 716, 735, 753, 772, 791, 809, 828, 846, 865, 884, 902, 920, 939, 957, 976, 994, 1012, 1030, + 1049, 1067, 1085, 1103, 1121, 1139, 1157, 1175, 1193, 1211, 1229, 1246, 1264, 1282, 1299, 1317, 1335, + 1352, 1370, 1387, 1405, 1422, 1440, 1457, 1474, 1491, 1509, 1526, 1543, 1560, 1577, 1595, 1627, 1660, + 1693, 1725, 1758, 1791, 1824, 1856, 1889, 1922, 1954, 1987, 2020, 2052, 2085, 2118, 2150, 2183, 2216, + 2248, 2281, 2313, 2346, 2378, 2411, 2459, 2508, 2556, 2605, 2653, 2701, 2750, 2798, 2847, 2895, 2943, + 2992, 3040, 3088, 3137, 3185, 3234, 3298, 3362, 3426, 3491, 3555, 3619, 3684, 3748, 3812, 3876, 3941, + 4005, 4069, 4149, 4230, 4310, 4390, 4470, 4550, 4631, 4711, 4791, 4871, 4967, 5064, 5160, 5256, 5352, + 5448, 5544, 5641, 5737, 5849, 5961, 6073, 6185, 6297, 6410, 6522, 6650, 6778, 6906, 7034, 7162, 7290, + 7435, 7579, 7723, 7867, 8011, 8155, 8315, 8475, 8635, 8795, 8956, 9132, 9308, 9484, 9660, 9836, 10028, + 10220, 10412, 10604, 10812, 11020, 11228, 11437, 11661, 11885, 12109, 12333, 12573, 12813, 13053, 13309, + 13565, 13821, 14093, 14365, 14637, 14925, 15213, 15502, 15806, 16110, 16414, 16734, 17054, 17390, 17726, + 18062, 18414, 18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486, 21902, 22334, 22766, 23214, 23662, + 24126, 24590, 25070, 25551, 26047, 26559, 27071, 27599, 28143, 28687, 29247 + ]; public static short DcQuant(int qindex, int delta, BitDepth bitDepth) { @@ -165,8 +124,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 case BitDepth.Bits12: return _dcQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)]; default: - Debug.Assert(false, "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); - + Debug.Assert(false, "bitDepth should be Bits8, Bits10 or Bits12"); return -1; } } @@ -182,23 +140,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 case BitDepth.Bits12: return _acQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)]; default: - Debug.Assert(false, "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); - + Debug.Assert(false, "bitDepth should be Bits8, Bits10 or Bits12"); return -1; } } - - public static int GetQIndex(ref Segmentation seg, int segmentId, int baseQIndex) - { - if (seg.IsSegFeatureActive(segmentId, SegLvlFeatures.SegLvlAltQ) != 0) - { - int data = seg.GetSegData(segmentId, SegLvlFeatures.SegLvlAltQ); - int segQIndex = seg.AbsDelta == Constants.SegmentAbsData ? data : baseQIndex + data; - - return Math.Clamp(segQIndex, 0, MaxQ); - } - - return baseQIndex; - } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/ReadBitBuffer.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/ReadBitBuffer.cs new file mode 100644 index 000000000..f3e908085 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/ReadBitBuffer.cs @@ -0,0 +1,84 @@ +using Ryujinx.Graphics.Nvdec.Vp9.Common; +using Ryujinx.Graphics.Nvdec.Vp9.Types; +using System; + +namespace Ryujinx.Graphics.Nvdec.Vp9 +{ + public ref struct ReadBitBuffer + { + public ReadOnlySpan BitBuffer; + public ulong BitOffset; + public object ErrorHandlerData; + + public int DecodeUnsignedMax(int max) + { + int data = ReadLiteral(BitUtils.GetUnsignedBits((uint)max)); + return data > max ? max : data; + } + + public readonly ulong BytesRead() + { + return (BitOffset + 7) >> 3; + } + + public int ReadBit() + { + ulong off = BitOffset; + ulong p = off >> 3; + int q = 7 - (int)(off & 0x7); + if (p < (ulong)BitBuffer.Length) + { + int bit = (BitBuffer[(int)p] >> q) & 1; + BitOffset = off + 1; + return bit; + } + + return 0; + } + + public int ReadLiteral(int bits) + { + int value = 0, bit; + for (bit = bits - 1; bit >= 0; bit--) + { + value |= ReadBit() << bit; + } + + return value; + } + + public int ReadSignedLiteral(int bits) + { + int value = ReadLiteral(bits); + return ReadBit() != 0 ? -value : value; + } + + public int ReadInvSignedLiteral(int bits) + { + return ReadSignedLiteral(bits); + } + + public int ReadDeltaQ() + { + return ReadBit() != 0 ? ReadSignedLiteral(4) : 0; + } + + public void ReadFrameSize(out int width, out int height) + { + width = ReadLiteral(16) + 1; + height = ReadLiteral(16) + 1; + } + + public BitstreamProfile ReadProfile() + { + int profile = ReadBit(); + profile |= ReadBit() << 1; + if (profile > 2) + { + profile += ReadBit(); + } + + return (BitstreamProfile)profile; + } + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/ReconInter.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/ReconInter.cs index fdb68291a..e332fd208 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/ReconInter.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/ReconInter.cs @@ -77,65 +77,39 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 bd); } - private static int RoundMvCompQ4(int value) + public static int RoundMvCompQ4(int value) { return (value < 0 ? value - 2 : value + 2) / 4; } - private static Mv MiMvPredQ4(ref ModeInfo mi, int idx) - { - return new Mv - { - Row = (short)RoundMvCompQ4( - mi.Bmi[0].Mv[idx].Row + mi.Bmi[1].Mv[idx].Row + - mi.Bmi[2].Mv[idx].Row + mi.Bmi[3].Mv[idx].Row), - Col = (short)RoundMvCompQ4( - mi.Bmi[0].Mv[idx].Col + mi.Bmi[1].Mv[idx].Col + - mi.Bmi[2].Mv[idx].Col + mi.Bmi[3].Mv[idx].Col), - }; - } - - private static int RoundMvCompQ2(int value) + public static int RoundMvCompQ2(int value) { return (value < 0 ? value - 1 : value + 1) / 2; } - private static Mv MiMvPredQ2(ref ModeInfo mi, int idx, int block0, int block1) - { - return new Mv - { - Row = (short)RoundMvCompQ2( - mi.Bmi[block0].Mv[idx].Row + - mi.Bmi[block1].Mv[idx].Row), - Col = (short)RoundMvCompQ2( - mi.Bmi[block0].Mv[idx].Col + - mi.Bmi[block1].Mv[idx].Col), - }; - } - public static Mv ClampMvToUmvBorderSb(ref MacroBlockD xd, ref Mv srcMv, int bw, int bh, int ssX, int ssY) { // If the MV points so far into the UMV border that no visible pixels // are used for reconstruction, the subpel part of the MV can be // discarded and the MV limited to 16 pixels with equivalent results. - int spelLeft = (Constants.Vp9InterpExtend + bw) << SubpelBits; + int spelLeft = (Constants.InterpExtend + bw) << SubpelBits; int spelRight = spelLeft - SubpelShifts; - int spelTop = (Constants.Vp9InterpExtend + bh) << SubpelBits; + int spelTop = (Constants.InterpExtend + bh) << SubpelBits; int spelBottom = spelTop - SubpelShifts; Mv clampedMv = new() { Row = (short)(srcMv.Row * (1 << (1 - ssY))), - Col = (short)(srcMv.Col * (1 << (1 - ssX))), + Col = (short)(srcMv.Col * (1 << (1 - ssX))) }; Debug.Assert(ssX <= 1); Debug.Assert(ssY <= 1); - clampedMv.ClampMv( - xd.MbToLeftEdge * (1 << (1 - ssX)) - spelLeft, - xd.MbToRightEdge * (1 << (1 - ssX)) + spelRight, - xd.MbToTopEdge * (1 << (1 - ssY)) - spelTop, - xd.MbToBottomEdge * (1 << (1 - ssY)) + spelBottom); + clampedMv.Clamp( + (xd.MbToLeftEdge * (1 << (1 - ssX))) - spelLeft, + (xd.MbToRightEdge * (1 << (1 - ssX))) + spelRight, + (xd.MbToTopEdge * (1 << (1 - ssY))) - spelTop, + (xd.MbToBottomEdge * (1 << (1 - ssY))) + spelBottom); return clampedMv; } @@ -150,18 +124,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 res = mi.Bmi[block].Mv[refr]; break; case 1: - res = MiMvPredQ2(ref mi, refr, block, block + 2); + res = mi.MvPredQ2(refr, block, block + 2); break; case 2: - res = MiMvPredQ2(ref mi, refr, block, block + 1); + res = mi.MvPredQ2(refr, block, block + 1); break; case 3: - res = MiMvPredQ4(ref mi, refr); + res = mi.MvPredQ4(refr); break; default: - Debug.Assert(ssIdx <= 3 && ssIdx >= 0); + Debug.Assert(ssIdx is <= 3 and >= 0); break; } + return res; } @@ -169,8 +144,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { int x = !sf.IsNull ? sf.Value.ScaleValueX(xOffset) : xOffset; int y = !sf.IsNull ? sf.Value.ScaleValueY(yOffset) : yOffset; - - return y * stride + x; + return (y * stride) + x; } private static void SetupPredPlanes( @@ -203,12 +177,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 strides[0] = src.Stride; strides[1] = src.UvStride; strides[2] = src.UvStride; - int i; - for (i = 0; i < Constants.MaxMbPlane; ++i) + for (int i = 0; i < Constants.MaxMbPlane; ++i) { ref MacroBlockDPlane pd = ref planes[i]; - SetupPredPlanes(ref pd.Dst, buffers[i], strides[i], miRow, miCol, Ptr.Null, pd.SubsamplingX, pd.SubsamplingY); + SetupPredPlanes(ref pd.Dst, buffers[i], strides[i], miRow, miCol, Ptr.Null, + pd.SubsamplingX, pd.SubsamplingY); } } @@ -230,12 +204,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 strides[0] = src.Stride; strides[1] = src.UvStride; strides[2] = src.UvStride; - int i; - for (i = 0; i < Constants.MaxMbPlane; ++i) + for (int i = 0; i < Constants.MaxMbPlane; ++i) { ref MacroBlockDPlane pd = ref xd.Plane[i]; - SetupPredPlanes(ref pd.Pre[idx], buffers[i], strides[i], miRow, miCol, sf, pd.SubsamplingX, pd.SubsamplingY); + SetupPredPlanes(ref pd.Pre[idx], buffers[i], strides[i], miRow, miCol, sf, pd.SubsamplingX, + pd.SubsamplingY); } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/ReconIntra.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/ReconIntra.cs index 768c9acf4..e85c501c7 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/ReconIntra.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/ReconIntra.cs @@ -7,7 +7,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { internal static class ReconIntra { - public static readonly TxType[] IntraModeToTxTypeLookup = { + public static readonly TxType[] IntraModeToTxTypeLookup = + [ TxType.DctDct, // DC TxType.AdstDct, // V TxType.DctAdst, // H @@ -17,15 +18,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 TxType.DctAdst, // D153 TxType.DctAdst, // D207 TxType.AdstDct, // D63 - TxType.AdstAdst, // TM - }; + TxType.AdstAdst // TM + ]; private const int NeedLeft = 1 << 1; private const int NeedAbove = 1 << 2; private const int NeedAboveRight = 1 << 3; - private static ReadOnlySpan ExtendModes => new byte[] - { + private static ReadOnlySpan ExtendModes => + [ NeedAbove | NeedLeft, // DC NeedAbove, // V NeedLeft, // H @@ -35,232 +36,104 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 NeedLeft | NeedAbove, // D153 NeedLeft, // D207 NeedAboveRight, // D63 - NeedLeft | NeedAbove, // TM - }; + NeedLeft | NeedAbove // TM + ]; private unsafe delegate void IntraPredFn(byte* dst, int stride, byte* above, byte* left); - private static readonly unsafe IntraPredFn[][] _pred = { - new IntraPredFn[] - { - null, - null, - null, - null, - }, - new IntraPredFn[] - { - VPredictor4x4, - VPredictor8x8, - VPredictor16x16, - VPredictor32x32, - }, - new IntraPredFn[] - { - HPredictor4x4, - HPredictor8x8, - HPredictor16x16, - HPredictor32x32, - }, - new IntraPredFn[] - { - D45Predictor4x4, - D45Predictor8x8, - D45Predictor16x16, - D45Predictor32x32, - }, - new IntraPredFn[] - { - D135Predictor4x4, - D135Predictor8x8, - D135Predictor16x16, - D135Predictor32x32, - }, - new IntraPredFn[] - { - D117Predictor4x4, - D117Predictor8x8, - D117Predictor16x16, - D117Predictor32x32, - }, - new IntraPredFn[] - { - D153Predictor4x4, - D153Predictor8x8, - D153Predictor16x16, - D153Predictor32x32, - }, - new IntraPredFn[] - { - D207Predictor4x4, - D207Predictor8x8, - D207Predictor16x16, - D207Predictor32x32, - }, - new IntraPredFn[] - { - D63Predictor4x4, - D63Predictor8x8, - D63Predictor16x16, - D63Predictor32x32, - }, - new IntraPredFn[] - { - TMPredictor4x4, - TMPredictor8x8, - TMPredictor16x16, - TMPredictor32x32, - }, - }; + private static readonly unsafe IntraPredFn[][] _pred = + [ + [null, null, null, null], + [VPredictor4X4, VPredictor8X8, VPredictor16X16, VPredictor32X32], + [HPredictor4X4, HPredictor8X8, HPredictor16X16, HPredictor32X32], + [D45Predictor4X4, D45Predictor8X8, D45Predictor16X16, D45Predictor32X32], + [D135Predictor4X4, D135Predictor8X8, D135Predictor16X16, D135Predictor32X32], + [D117Predictor4X4, D117Predictor8X8, D117Predictor16X16, D117Predictor32X32], + [D153Predictor4X4, D153Predictor8X8, D153Predictor16X16, D153Predictor32X32], + [D207Predictor4X4, D207Predictor8X8, D207Predictor16X16, D207Predictor32X32], + [D63Predictor4X4, D63Predictor8X8, D63Predictor16X16, D63Predictor32X32], + [TmPredictor4X4, TmPredictor8X8, TmPredictor16X16, TmPredictor32X32] + ]; - private static readonly unsafe IntraPredFn[][][] _dcPred = { - new[] - { - new IntraPredFn[] - { - Dc128Predictor4x4, - Dc128Predictor8x8, - Dc128Predictor16x16, - Dc128Predictor32x32, - }, - new IntraPredFn[] - { - DcTopPredictor4x4, - DcTopPredictor8x8, - DcTopPredictor16x16, - DcTopPredictor32x32, - }, - }, - new[] - { - new IntraPredFn[] - { - DcLeftPredictor4x4, - DcLeftPredictor8x8, - DcLeftPredictor16x16, - DcLeftPredictor32x32, - }, - new IntraPredFn[] - { - DcPredictor4x4, - DcPredictor8x8, - DcPredictor16x16, - DcPredictor32x32, - }, - }, - }; + private static readonly unsafe IntraPredFn[][][] _dcPred = + [ + [ + [ + Dc128Predictor4X4, Dc128Predictor8X8, Dc128Predictor16X16, Dc128Predictor32X32 + ], + [ + DcTopPredictor4X4, DcTopPredictor8X8, DcTopPredictor16X16, DcTopPredictor32X32 + ] + ], + [ + [ + DcLeftPredictor4X4, DcLeftPredictor8X8, DcLeftPredictor16X16, DcLeftPredictor32X32 + ], + [DcPredictor4X4, DcPredictor8X8, DcPredictor16X16, DcPredictor32X32] + ] + ]; private unsafe delegate void IntraHighPredFn(ushort* dst, int stride, ushort* above, ushort* left, int bd); - private static readonly unsafe IntraHighPredFn[][] _predHigh = { - new IntraHighPredFn[] - { - null, - null, - null, - null, - }, - new IntraHighPredFn[] - { - HighbdVPredictor4x4, - HighbdVPredictor8x8, - HighbdVPredictor16x16, - HighbdVPredictor32x32, - }, - new IntraHighPredFn[] - { - HighbdHPredictor4x4, - HighbdHPredictor8x8, - HighbdHPredictor16x16, - HighbdHPredictor32x32, - }, - new IntraHighPredFn[] - { - HighbdD45Predictor4x4, - HighbdD45Predictor8x8, - HighbdD45Predictor16x16, - HighbdD45Predictor32x32, - }, - new IntraHighPredFn[] - { - HighbdD135Predictor4x4, - HighbdD135Predictor8x8, - HighbdD135Predictor16x16, - HighbdD135Predictor32x32, - }, - new IntraHighPredFn[] - { - HighbdD117Predictor4x4, - HighbdD117Predictor8x8, - HighbdD117Predictor16x16, - HighbdD117Predictor32x32, - }, - new IntraHighPredFn[] - { - HighbdD153Predictor4x4, - HighbdD153Predictor8x8, - HighbdD153Predictor16x16, - HighbdD153Predictor32x32, - }, - new IntraHighPredFn[] - { - HighbdD207Predictor4x4, - HighbdD207Predictor8x8, - HighbdD207Predictor16x16, - HighbdD207Predictor32x32, - }, - new IntraHighPredFn[] - { - HighbdD63Predictor4x4, - HighbdD63Predictor8x8, - HighbdD63Predictor16x16, - HighbdD63Predictor32x32, - }, - new IntraHighPredFn[] - { - HighbdTMPredictor4x4, - HighbdTMPredictor8x8, - HighbdTMPredictor16x16, - HighbdTMPredictor32x32, - }, - }; + private static readonly unsafe IntraHighPredFn[][] _predHigh = + [ + [null, null, null, null], + [ + HighbdVPredictor4X4, HighbdVPredictor8X8, HighbdVPredictor16X16, HighbdVPredictor32X32 + ], + [ + HighbdHPredictor4X4, HighbdHPredictor8X8, HighbdHPredictor16X16, HighbdHPredictor32X32 + ], + [ + HighbdD45Predictor4X4, HighbdD45Predictor8X8, HighbdD45Predictor16X16, HighbdD45Predictor32X32 + ], + [ + HighbdD135Predictor4X4, HighbdD135Predictor8X8, HighbdD135Predictor16X16, + HighbdD135Predictor32X32 + ], + [ + HighbdD117Predictor4X4, HighbdD117Predictor8X8, HighbdD117Predictor16X16, + HighbdD117Predictor32X32 + ], + [ + HighbdD153Predictor4X4, HighbdD153Predictor8X8, HighbdD153Predictor16X16, + HighbdD153Predictor32X32 + ], + [ + HighbdD207Predictor4X4, HighbdD207Predictor8X8, HighbdD207Predictor16X16, + HighbdD207Predictor32X32 + ], + [ + HighbdD63Predictor4X4, HighbdD63Predictor8X8, HighbdD63Predictor16X16, HighbdD63Predictor32X32 + ], + [ + HighbdTmPredictor4X4, HighbdTmPredictor8X8, HighbdTmPredictor16X16, HighbdTmPredictor32X32 + ] + ]; - private static readonly unsafe IntraHighPredFn[][][] _dcPredHigh = { - new[] - { - new IntraHighPredFn[] - { - HighbdDc128Predictor4x4, - HighbdDc128Predictor8x8, - HighbdDc128Predictor16x16, - HighbdDc128Predictor32x32, - }, - new IntraHighPredFn[] - { - HighbdDcTopPredictor4x4, - HighbdDcTopPredictor8x8, - HighbdDcTopPredictor16x16, - HighbdDcTopPredictor32x32, - }, - }, - new[] - { - new IntraHighPredFn[] - { - HighbdDcLeftPredictor4x4, - HighbdDcLeftPredictor8x8, - HighbdDcLeftPredictor16x16, - HighbdDcLeftPredictor32x32, - }, - new IntraHighPredFn[] - { - HighbdDcPredictor4x4, - HighbdDcPredictor8x8, - HighbdDcPredictor16x16, - HighbdDcPredictor32x32, - }, - }, - }; + private static readonly unsafe IntraHighPredFn[][][] _dcPredHigh = + [ + [ + [ + HighbdDc128Predictor4X4, HighbdDc128Predictor8X8, HighbdDc128Predictor16X16, + HighbdDc128Predictor32X32 + ], + [ + HighbdDcTopPredictor4X4, HighbdDcTopPredictor8X8, HighbdDcTopPredictor16X16, + HighbdDcTopPredictor32X32 + ] + ], + [ + [ + HighbdDcLeftPredictor4X4, HighbdDcLeftPredictor8X8, HighbdDcLeftPredictor16X16, + HighbdDcLeftPredictor32X32 + ], + [ + HighbdDcPredictor4X4, HighbdDcPredictor8X8, HighbdDcPredictor16X16, + HighbdDcPredictor32X32 + ] + ] + ]; private static unsafe void BuildIntraPredictorsHigh( ref MacroBlockD xd, @@ -327,7 +200,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { for (i = 0; i < bs; ++i) { - leftCol[i] = refr[i * refStride - 1]; + leftCol[i] = refr[(i * refStride) - 1]; } } else @@ -335,12 +208,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int extendBottom = frameHeight - y0; for (i = 0; i < extendBottom; ++i) { - leftCol[i] = refr[i * refStride - 1]; + leftCol[i] = refr[(i * refStride) - 1]; } for (; i < bs; ++i) { - leftCol[i] = refr[(extendBottom - 1) * refStride - 1]; + leftCol[i] = refr[((extendBottom - 1) * refStride) - 1]; } } } @@ -349,7 +222,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 /* faster path if the block does not need extension */ for (i = 0; i < bs; ++i) { - leftCol[i] = refr[i * refStride - 1]; + leftCol[i] = refr[(i * refStride) - 1]; } } } @@ -391,6 +264,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 MemoryUtil.Copy(aboveRow, aboveRef, bs); } } + aboveRow[-1] = leftAvailable != 0 ? aboveRef[-1] : (ushort)(baseVal + 1); } else @@ -409,7 +283,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (xd.MbToRightEdge < 0) { /* slower path if the block needs border extension */ - if (x0 + 2 * bs <= frameWidth) + if (x0 + (2 * bs) <= frameWidth) { if (rightAvailable != 0 && bs == 4) { @@ -427,7 +301,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (rightAvailable != 0 && bs == 4) { MemoryUtil.Copy(aboveRow, aboveRef, r); - MemoryUtil.Fill(aboveRow + r, aboveRow[r - 1], x0 + 2 * bs - frameWidth); + MemoryUtil.Fill(aboveRow + r, aboveRow[r - 1], x0 + (2 * bs) - frameWidth); } else { @@ -439,8 +313,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { int r = frameWidth - x0; MemoryUtil.Copy(aboveRow, aboveRef, r); - MemoryUtil.Fill(aboveRow + r, aboveRow[r - 1], x0 + 2 * bs - frameWidth); + MemoryUtil.Fill(aboveRow + r, aboveRow[r - 1], x0 + (2 * bs) - frameWidth); } + aboveRow[-1] = leftAvailable != 0 ? aboveRef[-1] : (ushort)(baseVal + 1); } else @@ -544,7 +419,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { for (i = 0; i < bs; ++i) { - leftCol[i] = refr[i * refStride - 1]; + leftCol[i] = refr[(i * refStride) - 1]; } } else @@ -552,12 +427,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int extendBottom = frameHeight - y0; for (i = 0; i < extendBottom; ++i) { - leftCol[i] = refr[i * refStride - 1]; + leftCol[i] = refr[(i * refStride) - 1]; } for (; i < bs; ++i) { - leftCol[i] = refr[(extendBottom - 1) * refStride - 1]; + leftCol[i] = refr[((extendBottom - 1) * refStride) - 1]; } } } @@ -566,7 +441,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 /* Faster path if the block does not need extension */ for (i = 0; i < bs; ++i) { - leftCol[i] = refr[i * refStride - 1]; + leftCol[i] = refr[(i * refStride) - 1]; } } } @@ -608,6 +483,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 MemoryUtil.Copy(aboveRow, aboveRef, bs); } } + aboveRow[-1] = leftAvailable != 0 ? aboveRef[-1] : (byte)129; } else @@ -626,7 +502,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (xd.MbToRightEdge < 0) { /* Slower path if the block needs border extension */ - if (x0 + 2 * bs <= frameWidth) + if (x0 + (2 * bs) <= frameWidth) { if (rightAvailable != 0 && bs == 4) { @@ -644,7 +520,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 if (rightAvailable != 0 && bs == 4) { MemoryUtil.Copy(aboveRow, aboveRef, r); - MemoryUtil.Fill(aboveRow + r, aboveRow[r - 1], x0 + 2 * bs - frameWidth); + MemoryUtil.Fill(aboveRow + r, aboveRow[r - 1], x0 + (2 * bs) - frameWidth); } else { @@ -656,7 +532,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 { int r = frameWidth - x0; MemoryUtil.Copy(aboveRow, aboveRef, r); - MemoryUtil.Fill(aboveRow + r, aboveRow[r - 1], x0 + 2 * bs - frameWidth); + MemoryUtil.Fill(aboveRow + r, aboveRow[r - 1], x0 + (2 * bs) - frameWidth); } } else @@ -679,6 +555,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 } } } + aboveRow[-1] = leftAvailable != 0 ? aboveRef[-1] : (byte)129; } else @@ -716,7 +593,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 int txw = 1 << (int)txSize; int haveTop = loff != 0 || !xd.AboveMi.IsNull ? 1 : 0; int haveLeft = aoff != 0 || !xd.LeftMi.IsNull ? 1 : 0; - int haveRight = (aoff + txw) < bw ? 1 : 0; + int haveRight = aoff + txw < bw ? 1 : 0; int x = aoff * 4; int y = loff * 4; @@ -736,9 +613,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 x, y, plane); - return; } + BuildIntraPredictors( ref xd, refr, diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj b/src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj index 7659c4b25..9e250d171 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj @@ -1,7 +1,6 @@  - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/TileWorkerData.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/TileWorkerData.cs index a9a7d566e..526195f87 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/TileWorkerData.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/TileWorkerData.cs @@ -12,9 +12,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9 public int BufEnd; public Reader BitReader; public Vp9BackwardUpdates Counts; + public MacroBlockD Xd; + /* dqcoeff are shared by all the planes. So planes must be decoded serially */ public Array32> Dqcoeff; public InternalErrorInfo ErrorInfo; + + public int DecPartitionPlaneContext(int miRow, int miCol, int bsl) + { + ref sbyte aboveCtx = ref Xd.AboveSegContext[miCol]; + ref sbyte leftCtx = ref Xd.LeftSegContext[miRow & Constants.MiMask]; + int above = (aboveCtx >> bsl) & 1, left = (leftCtx >> bsl) & 1; + + return (left * 2) + above + (bsl * Constants.PartitionPloffset); + } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/BitstreamProfile.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/BitstreamProfile.cs new file mode 100644 index 000000000..e2ced8c95 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/BitstreamProfile.cs @@ -0,0 +1,11 @@ +namespace Ryujinx.Graphics.Nvdec.Vp9.Types +{ + public enum BitstreamProfile + { + Profile0, + Profile1, + Profile2, + Profile3, + MaxProfiles + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/BlockSize.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/BlockSize.cs index c7d4f7cc4..e52b05ec6 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/BlockSize.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/BlockSize.cs @@ -2,20 +2,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { internal enum BlockSize { - Block4x4 = 0, - Block4x8 = 1, - Block8x4 = 2, - Block8x8 = 3, - Block8x16 = 4, - Block16x8 = 5, - Block16x16 = 6, - Block16x32 = 7, - Block32x16 = 8, - Block32x32 = 9, - Block32x64 = 10, - Block64x32 = 11, - Block64x64 = 12, - BlockSizes = 13, - BlockInvalid = BlockSizes, + Block4X4, + Block4X8, + Block8X4, + Block8X8, + Block8X16, + Block16X8, + Block16X16, + Block16X32, + Block32X16, + Block32X32, + Block32X64, + Block64X32, + Block64X64, + BlockSizes, + BlockInvalid = BlockSizes } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/BufferPool.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/BufferPool.cs new file mode 100644 index 000000000..8af54d42a --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/BufferPool.cs @@ -0,0 +1,18 @@ +using Ryujinx.Common.Memory; + +namespace Ryujinx.Graphics.Nvdec.Vp9.Types +{ + internal struct BufferPool + { + // Private data associated with the frame buffer callbacks. + public Ptr CbPriv; + + // vpx_get_frame_buffer_cb_fn_t get_fb_cb; + // vpx_release_frame_buffer_cb_fn_t release_fb_cb; + + public Array12 FrameBufs; + + // Frame buffers allocated internally by the codec. + public InternalFrameBufferList IntFrameBuffers; + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/LoopFilter.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/LoopFilter.cs index d2b295476..2c75b780b 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/LoopFilter.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/LoopFilter.cs @@ -23,5 +23,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public ArrayPtr Lfm; public int LfmStride; + + public void SetDefaultLfDeltas() + { + ModeRefDeltaEnabled = true; + ModeRefDeltaUpdate = true; + + RefDeltas[Constants.IntraFrame] = 1; + RefDeltas[Constants.LastFrame] = 0; + RefDeltas[Constants.GoldenFrame] = -1; + RefDeltas[Constants.AltRefFrame] = -1; + ModeDeltas[0] = 0; + ModeDeltas[1] = 0; + } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/LoopFilterMask.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/LoopFilterMask.cs index 879cbe15b..69a38b926 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/LoopFilterMask.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/LoopFilterMask.cs @@ -15,10 +15,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { public Array4 LeftY; public Array4 AboveY; - public ulong Int4x4Y; + public ulong Int4X4Y; public Array4 LeftUv; public Array4 AboveUv; - public ushort Int4x4Uv; + public ushort Int4X4Uv; public Array64 LflY; } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MacroBlockD.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MacroBlockD.cs index 6305664df..47c218994 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MacroBlockD.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MacroBlockD.cs @@ -1,4 +1,5 @@ using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Nvdec.Vp9.Common; using Ryujinx.Graphics.Video; namespace Ryujinx.Graphics.Nvdec.Vp9.Types @@ -66,7 +67,6 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { int aboveSkip = !AboveMi.IsNull ? AboveMi.Value.Skip : 0; int leftSkip = !LeftMi.IsNull ? LeftMi.Value.Skip : 0; - return aboveSkip + leftSkip; } @@ -83,18 +83,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { return leftType; } - else if (leftType == Constants.SwitchableFilters) + + if (leftType == Constants.SwitchableFilters) { return aboveType; } - else if (aboveType == Constants.SwitchableFilters) + + if (aboveType == Constants.SwitchableFilters) { return leftType; } - else - { - return Constants.SwitchableFilters; - } + + return Constants.SwitchableFilters; } // The mode info data structure has a one element border above and to the @@ -107,17 +107,19 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public readonly int GetIntraInterContext() { if (!AboveMi.IsNull && !LeftMi.IsNull) - { // Both edges available + { + // Both edges available bool aboveIntra = !AboveMi.Value.IsInterBlock(); bool leftIntra = !LeftMi.Value.IsInterBlock(); - - return leftIntra && aboveIntra ? 3 : (leftIntra || aboveIntra ? 1 : 0); + return leftIntra && aboveIntra ? 3 : leftIntra || aboveIntra ? 1 : 0; } if (!AboveMi.IsNull || !LeftMi.IsNull) - { // One edge available + { + // One edge available return 2 * (!(!AboveMi.IsNull ? AboveMi.Value : LeftMi.Value).IsInterBlock() ? 1 : 0); } + return 0; } @@ -128,8 +130,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public readonly int GetTxSizeContext() { int maxTxSize = (int)Luts.MaxTxSizeLookup[(int)Mi[0].Value.SbType]; - int aboveCtx = (!AboveMi.IsNull && AboveMi.Value.Skip == 0) ? (int)AboveMi.Value.TxSize : maxTxSize; - int leftCtx = (!LeftMi.IsNull && LeftMi.Value.Skip == 0) ? (int)LeftMi.Value.TxSize : maxTxSize; + int aboveCtx = !AboveMi.IsNull && AboveMi.Value.Skip == 0 ? (int)AboveMi.Value.TxSize : maxTxSize; + int leftCtx = !LeftMi.IsNull && LeftMi.Value.Skip == 0 ? (int)LeftMi.Value.TxSize : maxTxSize; if (LeftMi.IsNull) { leftCtx = aboveCtx; @@ -140,14 +142,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types aboveCtx = leftCtx; } - return (aboveCtx + leftCtx) > maxTxSize ? 1 : 0; + return aboveCtx + leftCtx > maxTxSize ? 1 : 0; } public void SetupBlockPlanes(int ssX, int ssY) { - int i; - - for (i = 0; i < Constants.MaxMbPlane; i++) + for (int i = 0; i < Constants.MaxMbPlane; i++) { Plane[i].SubsamplingX = i != 0 ? ssX : 0; Plane[i].SubsamplingY = i != 0 ? ssY : 0; @@ -158,25 +158,36 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { int aboveIdx = miCol * 2; int leftIdx = (miRow * 2) & 15; - int i; - for (i = 0; i < Constants.MaxMbPlane; ++i) + + for (int i = 0; i < Constants.MaxMbPlane; ++i) { ref MacroBlockDPlane pd = ref Plane[i]; pd.AboveContext = AboveContext[i].Slice(aboveIdx >> pd.SubsamplingX); - pd.LeftContext = new ArrayPtr(ref LeftContext[i][leftIdx >> pd.SubsamplingY], 16 - (leftIdx >> pd.SubsamplingY)); + pd.LeftContext = new ArrayPtr(ref LeftContext[i][leftIdx >> pd.SubsamplingY], + 16 - (leftIdx >> pd.SubsamplingY)); } } internal void SetMiRowCol(ref TileInfo tile, int miRow, int bh, int miCol, int bw, int miRows, int miCols) { - MbToTopEdge = -((miRow * Constants.MiSize) * 8); - MbToBottomEdge = ((miRows - bh - miRow) * Constants.MiSize) * 8; - MbToLeftEdge = -((miCol * Constants.MiSize) * 8); - MbToRightEdge = ((miCols - bw - miCol) * Constants.MiSize) * 8; + MbToTopEdge = -(miRow * Constants.MiSize * 8); + MbToBottomEdge = (miRows - bh - miRow) * Constants.MiSize * 8; + MbToLeftEdge = -(miCol * Constants.MiSize * 8); + MbToRightEdge = (miCols - bw - miCol) * Constants.MiSize * 8; // Are edges available for intra prediction? - AboveMi = (miRow != 0) ? Mi[-MiStride] : Ptr.Null; - LeftMi = (miCol > tile.MiColStart) ? Mi[-1] : Ptr.Null; + AboveMi = miRow != 0 ? Mi[-MiStride] : Ptr.Null; + LeftMi = miCol > tile.MiColStart ? Mi[-1] : Ptr.Null; + } + + public unsafe void DecResetSkipContext() + { + for (int i = 0; i < Constants.MaxMbPlane; i++) + { + ref MacroBlockDPlane pd = ref Plane[i]; + MemoryUtil.Fill(pd.AboveContext.ToPointer(), (sbyte)0, pd.N4W); + MemoryUtil.Fill(pd.LeftContext.ToPointer(), (sbyte)0, pd.N4H); + } } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MacroBlockDPlane.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MacroBlockDPlane.cs index df21a8d49..ebf044e64 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MacroBlockDPlane.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MacroBlockDPlane.cs @@ -15,6 +15,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types // Number of 4x4s in current block public ushort N4W, N4H; + // Log2 of N4W, N4H public byte N4Wl, N4Hl; } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ModeInfo.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ModeInfo.cs index e97ed424c..9fd961bb9 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ModeInfo.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ModeInfo.cs @@ -29,14 +29,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public PredictionMode GetYMode(int block) { - return SbType < BlockSize.Block8x8 ? Bmi[block].Mode : Mode; + return SbType < BlockSize.Block8X8 ? Bmi[block].Mode : Mode; } public readonly TxSize GetUvTxSize(ref MacroBlockDPlane pd) { - Debug.Assert(SbType < BlockSize.Block8x8 || - Luts.SsSizeLookup[(int)SbType][pd.SubsamplingX][pd.SubsamplingY] != BlockSize.BlockInvalid); - + Debug.Assert(SbType < BlockSize.Block8X8 || + Luts.SsSizeLookup[(int)SbType][pd.SubsamplingX][pd.SubsamplingY] != BlockSize.BlockInvalid); return Luts.UvTxsizeLookup[(int)SbType][(int)TxSize][pd.SubsamplingX][pd.SubsamplingY]; } @@ -50,17 +49,59 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types return RefFrame[1] > Constants.IntraFrame; } - private static readonly int[][] _idxNColumnToSubblock = { - new[] { 1, 2 }, new[] { 1, 3 }, new[] { 3, 2 }, new[] { 3, 3 }, - }; + private static readonly int[][] _idxNColumnToSubblock = + [ + [1, 2], [1, 3], [3, 2], [3, 3] + ]; // This function returns either the appropriate sub block or block's mv // on whether the block_size < 8x8 and we have check_sub_blocks set. public Mv GetSubBlockMv(int whichMv, int searchCol, int blockIdx) { - return blockIdx >= 0 && SbType < BlockSize.Block8x8 + return blockIdx >= 0 && SbType < BlockSize.Block8X8 ? Bmi[_idxNColumnToSubblock[blockIdx][searchCol == 0 ? 1 : 0]].Mv[whichMv] : Mv[whichMv]; } + + public Mv MvPredQ4(int idx) + { + Mv res = new() + { + Row = (short)ReconInter.RoundMvCompQ4( + Bmi[0].Mv[idx].Row + Bmi[1].Mv[idx].Row + + Bmi[2].Mv[idx].Row + Bmi[3].Mv[idx].Row), + Col = (short)ReconInter.RoundMvCompQ4( + Bmi[0].Mv[idx].Col + Bmi[1].Mv[idx].Col + + Bmi[2].Mv[idx].Col + Bmi[3].Mv[idx].Col) + }; + return res; + } + + public Mv MvPredQ2(int idx, int block0, int block1) + { + Mv res = new() + { + Row = (short)ReconInter.RoundMvCompQ2( + Bmi[block0].Mv[idx].Row + + Bmi[block1].Mv[idx].Row), + Col = (short)ReconInter.RoundMvCompQ2( + Bmi[block0].Mv[idx].Col + + Bmi[block1].Mv[idx].Col) + }; + return res; + } + + // Performs mv sign inversion if indicated by the reference frame combination. + public Mv ScaleMv(int refr, sbyte thisRefFrame, ref Array4 refSignBias) + { + Mv mv = Mv[refr]; + if (refSignBias[RefFrame[refr]] != refSignBias[thisRefFrame]) + { + mv.Row *= -1; + mv.Col *= -1; + } + + return mv; + } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs index 9ccb51503..8a70107b3 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Mv.cs @@ -10,98 +10,88 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public short Row; public short Col; - private static ReadOnlySpan LogInBase2 => new byte[] - { - 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, - }; + private static ReadOnlySpan LogInBase2 => + [ + 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 10 + ]; - public readonly bool UseMvHp() + public readonly bool UseHp() { const int KMvRefThresh = 64; // Threshold for use of high-precision 1/8 mv return Math.Abs(Row) < KMvRefThresh && Math.Abs(Col) < KMvRefThresh; } - public static bool MvJointVertical(MvJointType type) + public static bool JointVertical(MvJointType type) { - return type == MvJointType.MvJointHzvnz || type == MvJointType.MvJointHnzvnz; + return type is MvJointType.Hzvnz or MvJointType.Hnzvnz; } - public static bool MvJointHorizontal(MvJointType type) + public static bool JointHorizontal(MvJointType type) { - return type == MvJointType.MvJointHnzvz || type == MvJointType.MvJointHnzvnz; + return type is MvJointType.Hnzvz or MvJointType.Hnzvnz; } - private static int MvClassBase(MvClassType c) + private static int ClassBase(MvClassType c) { return c != 0 ? Constants.Class0Size << ((int)c + 2) : 0; } - private static MvClassType GetMvClass(int z, Ptr offset) + private static MvClassType GetClass(int z, Ptr offset) { - MvClassType c = (z >= Constants.Class0Size * 4096) ? MvClassType.MvClass10 : (MvClassType)LogInBase2[z >> 3]; + MvClassType c = z >= Constants.Class0Size * 4096 ? MvClassType.Class10 : (MvClassType)LogInBase2[z >> 3]; if (!offset.IsNull) { - offset.Value = z - MvClassBase(c); + offset.Value = z - ClassBase(c); } return c; } - private static void IncMvComponent(int v, ref Vp9BackwardUpdates counts, int comp, int incr, int usehp) + private static void IncComponent(int v, ref Vp9BackwardUpdates counts, int comp, int incr, int usehp) { - int s, z, c, o = 0, d, e, f; + int o = 0; Debug.Assert(v != 0); /* Should not be zero */ - s = v < 0 ? 1 : 0; + int s = v < 0 ? 1 : 0; counts.Sign[comp][s] += (uint)incr; - z = (s != 0 ? -v : v) - 1; /* Magnitude - 1 */ + int z = (s != 0 ? -v : v) - 1 /* Magnitude - 1 */; - c = (int)GetMvClass(z, new Ptr(ref o)); + int c = (int)GetClass(z, new Ptr(ref o)); counts.Classes[comp][c] += (uint)incr; - d = (o >> 3); /* Int mv data */ - f = (o >> 1) & 3; /* Fractional pel mv data */ - e = (o & 1); /* High precision mv data */ + int d = o >> 3 /* Int mv data */; + int f = (o >> 1) & 3 /* Fractional pel mv data */; + int e = o & 1 /* High precision mv data */; - if (c == (int)MvClassType.MvClass0) + if (c == (int)MvClassType.Class0) { counts.Class0[comp][d] += (uint)incr; counts.Class0Fp[comp][d][f] += (uint)incr; @@ -109,11 +99,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types } else { - int i; int b = c + Constants.Class0Bits - 1; // Number of bits - for (i = 0; i < b; ++i) + for (int i = 0; i < b; ++i) { - counts.Bits[comp][i][((d >> i) & 1)] += (uint)incr; + counts.Bits[comp][i][(d >> i) & 1] += (uint)incr; } counts.Fp[comp][f] += (uint)incr; @@ -121,56 +110,56 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types } } - private readonly MvJointType GetMvJoint() + public readonly MvJointType GetJoint() { if (Row == 0) { - return Col == 0 ? MvJointType.MvJointZero : MvJointType.MvJointHnzvz; + return Col == 0 ? MvJointType.Zero : MvJointType.Hnzvz; } - return Col == 0 ? MvJointType.MvJointHzvnz : MvJointType.MvJointHnzvnz; + return Col == 0 ? MvJointType.Hzvnz : MvJointType.Hnzvnz; } - internal readonly void IncMv(Ptr counts) + internal readonly void Inc(Ptr counts) { if (!counts.IsNull) { - MvJointType j = GetMvJoint(); + MvJointType j = GetJoint(); ++counts.Value.Joints[(int)j]; - if (MvJointVertical(j)) + if (JointVertical(j)) { - IncMvComponent(Row, ref counts.Value, 0, 1, 1); + IncComponent(Row, ref counts.Value, 0, 1, 1); } - if (MvJointHorizontal(j)) + if (JointHorizontal(j)) { - IncMvComponent(Col, ref counts.Value, 1, 1, 1); + IncComponent(Col, ref counts.Value, 1, 1, 1); } } } - public void ClampMv(int minCol, int maxCol, int minRow, int maxRow) + public void Clamp(int minCol, int maxCol, int minRow, int maxRow) { Col = (short)Math.Clamp(Col, minCol, maxCol); Row = (short)Math.Clamp(Row, minRow, maxRow); } - private const int MvBorder = (16 << 3); // Allow 16 pels in 1/8th pel units + private const int Border = 16 << 3; // Allow 16 pels in 1/8th pel units - public void ClampMvRef(ref MacroBlockD xd) + public void ClampRef(ref MacroBlockD xd) { - ClampMv( - xd.MbToLeftEdge - MvBorder, - xd.MbToRightEdge + MvBorder, - xd.MbToTopEdge - MvBorder, - xd.MbToBottomEdge + MvBorder); + Clamp( + xd.MbToLeftEdge - Border, + xd.MbToRightEdge + Border, + xd.MbToTopEdge - Border, + xd.MbToBottomEdge + Border); } - public void LowerMvPrecision(bool allowHP) + public void LowerPrecision(bool allowHp) { - bool useHP = allowHP && UseMvHp(); - if (!useHP) + bool useHp = allowHp && UseHp(); + if (!useHp) { if ((Row & 1) != 0) { @@ -183,5 +172,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types } } } + + public readonly bool IsValid() + { + return Row is > Constants.MvLow and < Constants.MvUpp && + Col is > Constants.MvLow and < Constants.MvUpp; + } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MvClassType.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MvClassType.cs index 188eee0b0..d933e7117 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MvClassType.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MvClassType.cs @@ -2,16 +2,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { internal enum MvClassType { - MvClass0 = 0, /* (0, 2] integer pel */ - MvClass1 = 1, /* (2, 4] integer pel */ - MvClass2 = 2, /* (4, 8] integer pel */ - MvClass3 = 3, /* (8, 16] integer pel */ - MvClass4 = 4, /* (16, 32] integer pel */ - MvClass5 = 5, /* (32, 64] integer pel */ - MvClass6 = 6, /* (64, 128] integer pel */ - MvClass7 = 7, /* (128, 256] integer pel */ - MvClass8 = 8, /* (256, 512] integer pel */ - MvClass9 = 9, /* (512, 1024] integer pel */ - MvClass10 = 10, /* (1024,2048] integer pel */ + Class0, /* (0, 2] integer pel */ + Class1, /* (2, 4] integer pel */ + Class2, /* (4, 8] integer pel */ + Class3, /* (8, 16] integer pel */ + Class4, /* (16, 32] integer pel */ + Class5, /* (32, 64] integer pel */ + Class6, /* (64, 128] integer pel */ + Class7, /* (128, 256] integer pel */ + Class8, /* (256, 512] integer pel */ + Class9, /* (512, 1024] integer pel */ + Class10 /* (1024,2048] integer pel */ } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MvJointType.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MvJointType.cs index 8cccf90cd..a9dca4644 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MvJointType.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/MvJointType.cs @@ -2,9 +2,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { internal enum MvJointType { - MvJointZero = 0, /* Zero vector */ - MvJointHnzvz = 1, /* Vert zero, hor nonzero */ - MvJointHzvnz = 2, /* Hor zero, vert nonzero */ - MvJointHnzvnz = 3, /* Both components nonzero */ + Zero, /* Zero vector */ + Hnzvz, /* Vert zero, hor nonzero */ + Hzvnz, /* Hor zero, vert nonzero */ + Hnzvnz /* Both components nonzero */ } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/PlaneType.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/PlaneType.cs index 8b01cf3a1..1b50010a2 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/PlaneType.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/PlaneType.cs @@ -2,8 +2,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { internal enum PlaneType { - Y = 0, - Uv = 1, - PlaneTypes, + Y, + Uv, + PlaneTypes } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/PredictionMode.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/PredictionMode.cs index 2d81b547e..2d9750af9 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/PredictionMode.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/PredictionMode.cs @@ -2,20 +2,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { internal enum PredictionMode { - DcPred = 0, // Average of above and left pixels - VPred = 1, // Vertical - HPred = 2, // Horizontal - D45Pred = 3, // Directional 45 deg = round(arctan(1 / 1) * 180 / pi) - D135Pred = 4, // Directional 135 deg = 180 - 45 - D117Pred = 5, // Directional 117 deg = 180 - 63 - D153Pred = 6, // Directional 153 deg = 180 - 27 - D207Pred = 7, // Directional 207 deg = 180 + 27 - D63Pred = 8, // Directional 63 deg = round(arctan(2 / 1) * 180 / pi) - TmPred = 9, // True-motion - NearestMv = 10, - NearMv = 11, - ZeroMv = 12, - NewMv = 13, - MbModeCount = 14, + DcPred, // Average of above and left pixels + VPred, // Vertical + HPred, // Horizontal + D45Pred, // Directional 45 deg = round(arctan(1 / 1) * 180 / pi) + D135Pred, // Directional 135 deg = 180 - 45 + D117Pred, // Directional 117 deg = 180 - 63 + D153Pred, // Directional 153 deg = 180 - 27 + D207Pred, // Directional 207 deg = 180 + 27 + D63Pred, // Directional 63 deg = round(arctan(2 / 1) * 180 / pi) + TmPred, // True-motion + NearestMv, + NearMv, + ZeroMv, + NewMv, + MbModeCount } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/RefBuffer.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/RefBuffer.cs index 0fbb84514..dc4444e6e 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/RefBuffer.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/RefBuffer.cs @@ -2,6 +2,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { internal struct RefBuffer { + public const int InvalidIdx = -1; // Invalid buffer index. + + public int Idx; public Surface Buf; public ScaleFactors Sf; } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/RefCntBuffer.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/RefCntBuffer.cs new file mode 100644 index 000000000..2f654b6f7 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/RefCntBuffer.cs @@ -0,0 +1,12 @@ +namespace Ryujinx.Graphics.Nvdec.Vp9.Types +{ + internal struct RefCntBuffer + { + public int RefCount; + public int MiRows; + public int MiCols; + public byte Released; + public VpxCodecFrameBuffer RawFrameBuffer; + public Surface Buf; + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ReferenceMode.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ReferenceMode.cs index aff3cbb07..aee5fccc9 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ReferenceMode.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ReferenceMode.cs @@ -2,9 +2,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { internal enum ReferenceMode { - SingleReference = 0, - CompoundReference = 1, - ReferenceModeSelect = 2, - ReferenceModes = 3, + Single, + Compound, + Select, + ReferenceModes } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ScaleFactors.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ScaleFactors.cs index 8e2ec4249..e3f73d761 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ScaleFactors.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/ScaleFactors.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types internal struct ScaleFactors { private const int RefScaleShift = 14; - private const int RefNoScale = (1 << RefScaleShift); + private const int RefNoScale = 1 << RefScaleShift; private const int RefInvalidScale = -1; private unsafe delegate void ConvolveFn( @@ -38,240 +38,88 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types int h, int bd); - private static readonly unsafe ConvolveFn[][][] _predictX16Y16 = { - new[] - { - new ConvolveFn[] - { - ConvolveCopy, - ConvolveAvg, - }, - new ConvolveFn[] - { - Convolve8Vert, - Convolve8AvgVert, - }, - }, - new[] - { - new ConvolveFn[] - { - Convolve8Horiz, - Convolve8AvgHoriz, - }, - new ConvolveFn[] - { - Convolve8, - Convolve8Avg, - }, - }, - }; + private static readonly unsafe ConvolveFn[][][] _predictX16Y16 = + [ + [ + [ConvolveCopy, ConvolveAvg], + [Convolve8Vert, Convolve8AvgVert] + ], + [ + [Convolve8Horiz, Convolve8AvgHoriz], + [Convolve8, Convolve8Avg] + ] + ]; - private static readonly unsafe ConvolveFn[][][] _predictX16 = { - new[] - { - new ConvolveFn[] - { - ScaledVert, - ScaledAvgVert, - }, - new ConvolveFn[] - { - ScaledVert, - ScaledAvgVert, - }, - }, - new[] - { - new ConvolveFn[] - { - Scaled2D, - ScaledAvg2D, - }, - new ConvolveFn[] - { - Scaled2D, - ScaledAvg2D, - }, - }, - }; + private static readonly unsafe ConvolveFn[][][] _predictX16 = + [ + [ + [ScaledVert, ScaledAvgVert], [ScaledVert, ScaledAvgVert] + ], + [[Scaled2D, ScaledAvg2D], [Scaled2D, ScaledAvg2D]] + ]; - private static readonly unsafe ConvolveFn[][][] _predictY16 = { - new[] - { - new ConvolveFn[] - { - ScaledHoriz, - ScaledAvgHoriz, - }, - new ConvolveFn[] - { - Scaled2D, - ScaledAvg2D, - }, - }, - new[] - { - new ConvolveFn[] - { - ScaledHoriz, - ScaledAvgHoriz, - }, - new ConvolveFn[] - { - Scaled2D, - ScaledAvg2D, - }, - }, - }; + private static readonly unsafe ConvolveFn[][][] _predictY16 = + [ + [[ScaledHoriz, ScaledAvgHoriz], [Scaled2D, ScaledAvg2D]], + [[ScaledHoriz, ScaledAvgHoriz], [Scaled2D, ScaledAvg2D]] + ]; - private static readonly unsafe ConvolveFn[][][] _predict = { - new[] - { - new ConvolveFn[] - { - Scaled2D, - ScaledAvg2D, - }, - new ConvolveFn[] - { - Scaled2D, - ScaledAvg2D, - }, - }, - new[] - { - new ConvolveFn[] - { - Scaled2D, - ScaledAvg2D, - }, - new ConvolveFn[] - { - Scaled2D, - ScaledAvg2D, - }, - }, - }; + private static readonly unsafe ConvolveFn[][][] _predict = + [ + [[Scaled2D, ScaledAvg2D], [Scaled2D, ScaledAvg2D]], + [[Scaled2D, ScaledAvg2D], [Scaled2D, ScaledAvg2D]] + ]; - private static readonly unsafe HighbdConvolveFn[][][] _highbdPredictX16Y16 = { - new[] - { - new HighbdConvolveFn[] - { - HighbdConvolveCopy, - HighbdConvolveAvg, - }, - new HighbdConvolveFn[] - { - HighbdConvolve8Vert, - HighbdConvolve8AvgVert, - }, - }, - new[] - { - new HighbdConvolveFn[] - { - HighbdConvolve8Horiz, - HighbdConvolve8AvgHoriz, - }, - new HighbdConvolveFn[] - { - HighbdConvolve8, - HighbdConvolve8Avg, - }, - }, - }; + private static readonly unsafe HighbdConvolveFn[][][] _highbdPredictX16Y16 = + [ + [ + [HighbdConvolveCopy, HighbdConvolveAvg], + [HighbdConvolve8Vert, HighbdConvolve8AvgVert] + ], + [ + [HighbdConvolve8Horiz, HighbdConvolve8AvgHoriz], + [HighbdConvolve8, HighbdConvolve8Avg] + ] + ]; - private static readonly unsafe HighbdConvolveFn[][][] _highbdPredictX16 = { - new[] - { - new HighbdConvolveFn[] - { - HighbdConvolve8Vert, - HighbdConvolve8AvgVert, - }, - new HighbdConvolveFn[] - { - HighbdConvolve8Vert, - HighbdConvolve8AvgVert, - }, - }, - new[] - { - new HighbdConvolveFn[] - { - HighbdConvolve8, - HighbdConvolve8Avg, - }, - new HighbdConvolveFn[] - { - HighbdConvolve8, - HighbdConvolve8Avg, - }, - }, - }; + private static readonly unsafe HighbdConvolveFn[][][] _highbdPredictX16 = + [ + [ + [HighbdConvolve8Vert, HighbdConvolve8AvgVert], + [HighbdConvolve8Vert, HighbdConvolve8AvgVert] + ], + [ + [HighbdConvolve8, HighbdConvolve8Avg], + [HighbdConvolve8, HighbdConvolve8Avg] + ] + ]; - private static readonly unsafe HighbdConvolveFn[][][] _highbdPredictY16 = { - new[] - { - new HighbdConvolveFn[] - { - HighbdConvolve8Horiz, - HighbdConvolve8AvgHoriz, - }, - new HighbdConvolveFn[] - { - HighbdConvolve8, - HighbdConvolve8Avg, - }, - }, - new[] - { - new HighbdConvolveFn[] - { - HighbdConvolve8Horiz, - HighbdConvolve8AvgHoriz, - }, - new HighbdConvolveFn[] - { - HighbdConvolve8, - HighbdConvolve8Avg, - }, - }, - }; + private static readonly unsafe HighbdConvolveFn[][][] _highbdPredictY16 = + [ + [ + [HighbdConvolve8Horiz, HighbdConvolve8AvgHoriz], + [HighbdConvolve8, HighbdConvolve8Avg] + ], + [ + [HighbdConvolve8Horiz, HighbdConvolve8AvgHoriz], + [HighbdConvolve8, HighbdConvolve8Avg] + ] + ]; - private static readonly unsafe HighbdConvolveFn[][][] _highbdPredict = { - new[] - { - new HighbdConvolveFn[] - { - HighbdConvolve8, - HighbdConvolve8Avg, - }, - new HighbdConvolveFn[] - { - HighbdConvolve8, - HighbdConvolve8Avg, - }, - }, - new[] - { - new HighbdConvolveFn[] - { - HighbdConvolve8, - HighbdConvolve8Avg, - }, - new HighbdConvolveFn[] - { - HighbdConvolve8, - HighbdConvolve8Avg, - }, - }, - }; + private static readonly unsafe HighbdConvolveFn[][][] _highbdPredict = + [ + [ + [HighbdConvolve8, HighbdConvolve8Avg], + [HighbdConvolve8, HighbdConvolve8Avg] + ], + [ + [HighbdConvolve8, HighbdConvolve8Avg], + [HighbdConvolve8, HighbdConvolve8Avg] + ] + ]; - public int XScaleFP; // Horizontal fixed point scale factor - public int YScaleFP; // Vertical fixed point scale factor + public int XScaleFp; // Horizontal fixed point scale factor + public int YScaleFp; // Vertical fixed point scale factor public int XStepQ4; public int YStepQ4; @@ -307,12 +155,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types if (YStepQ4 == 16) { // No scaling in either direction. - _predictX16Y16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, h); + _predictX16Y16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, + h); } else { // No scaling in x direction. Must always scale in the y direction. - _predictX16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, h); + _predictX16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, + h); } } else @@ -320,7 +170,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types if (YStepQ4 == 16) { // No scaling in the y direction. Must always scale in the x direction. - _predictY16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, h); + _predictY16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, + h); } else { @@ -353,12 +204,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types if (YStepQ4 == 16) { // No scaling in either direction. - _highbdPredictX16Y16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, h, bd); + _highbdPredictX16Y16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, + ys, w, h, bd); } else { // No scaling in x direction. Must always scale in the y direction. - _highbdPredictX16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, h, bd); + _highbdPredictX16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, + w, h, bd); } } else @@ -366,24 +219,26 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types if (YStepQ4 == 16) { // No scaling in the y direction. Must always scale in the x direction. - _highbdPredictY16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, h, bd); + _highbdPredictY16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, + w, h, bd); } else { // Must always scale in both directions. - _highbdPredict[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, h, bd); + _highbdPredict[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, + h, bd); } } } private readonly int ScaledX(int val) { - return (int)((long)val * XScaleFP >> RefScaleShift); + return (int)(((long)val * XScaleFp) >> RefScaleShift); } private readonly int ScaledY(int val) { - return (int)((long)val * YScaleFP >> RefScaleShift); + return (int)(((long)val * YScaleFp) >> RefScaleShift); } private static int GetFixedPointScaleFactor(int otherSize, int thisSize) @@ -399,23 +254,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { int xOffQ4 = ScaledX(x << SubpelBits) & SubpelMask; int yOffQ4 = ScaledY(y << SubpelBits) & SubpelMask; - Mv32 res = new() - { - Row = ScaledY(mv.Row) + yOffQ4, - Col = ScaledX(mv.Col) + xOffQ4, - }; - + Mv32 res = new() { Row = ScaledY(mv.Row) + yOffQ4, Col = ScaledX(mv.Col) + xOffQ4 }; return res; } public readonly bool IsValidScale() { - return XScaleFP != RefInvalidScale && YScaleFP != RefInvalidScale; + return XScaleFp != RefInvalidScale && YScaleFp != RefInvalidScale; } public readonly bool IsScaled() { - return IsValidScale() && (XScaleFP != RefNoScale || YScaleFP != RefNoScale); + return IsValidScale() && (XScaleFp != RefNoScale || YScaleFp != RefNoScale); } public static bool ValidRefFrameSize(int refWidth, int refHeight, int thisWidth, int thisHeight) @@ -430,14 +280,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { if (!ValidRefFrameSize(otherW, otherH, thisW, thisH)) { - XScaleFP = RefInvalidScale; - YScaleFP = RefInvalidScale; - + XScaleFp = RefInvalidScale; + YScaleFp = RefInvalidScale; return; } - XScaleFP = GetFixedPointScaleFactor(otherW, thisW); - YScaleFP = GetFixedPointScaleFactor(otherH, thisH); + XScaleFp = GetFixedPointScaleFactor(otherW, thisW); + YScaleFp = GetFixedPointScaleFactor(otherH, thisH); XStepQ4 = ScaledX(16); YStepQ4 = ScaledY(16); } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/SegLvlFeatures.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/SegLvlFeatures.cs index eb47abdfd..d14cff2c8 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/SegLvlFeatures.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/SegLvlFeatures.cs @@ -2,10 +2,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { internal enum SegLvlFeatures { - SegLvlAltQ = 0, // Use alternate Quantizer .... - SegLvlAltLf = 1, // Use alternate loop filter value... - SegLvlRefFrame = 2, // Optional Segment reference frame - SegLvlSkip = 3, // Optional Segment (0,0) + skip mode - SegLvlMax = 4, // Number of features supported + AltQ, // Use alternate Quantizer .... + AltLf, // Use alternate loop filter value... + RefFrame, // Optional Segment reference frame + Skip, // Optional Segment (0,0) + skip mode + Max // Number of features supported } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Segmentation.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Segmentation.cs index f2415fc09..c34545791 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Segmentation.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Segmentation.cs @@ -1,4 +1,6 @@ using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Video; +using System; using System.Diagnostics; using System.Runtime.InteropServices; @@ -6,8 +8,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { internal struct Segmentation { - private static readonly int[] _segFeatureDataSigned = { 1, 1, 0, 0 }; - private static readonly int[] _segFeatureDataMax = { QuantCommon.MaxQ, Vp9.LoopFilter.MaxLoopFilter, 3, 0 }; + public const int SegmentDeltadata = 0; + public const int SegmentAbsdata = 1; + + public const int MaxSegments = 8; + public const int SegTreeProbs = MaxSegments - 1; + + public const int PredictionProbs = 3; + + private static readonly int[] _segFeatureDataSigned = [1, 1, 0, 0]; + private static readonly int[] _segFeatureDataMax = [QuantCommon.MaxQ, Vp9.LoopFilter.MaxLoopFilter, 3, 0]; public bool Enabled; public bool UpdateMap; @@ -67,5 +77,88 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { return FeatureData[segmentId][(int)featureId]; } + + public int GetQIndex(int segmentId, int baseQIndex) + { + if (IsSegFeatureActive(segmentId, SegLvlFeatures.AltQ) != 0) + { + int data = GetSegData(segmentId, SegLvlFeatures.AltQ); + int segQIndex = AbsDelta == Constants.SegmentAbsData ? data : baseQIndex + data; + return Math.Clamp(segQIndex, 0, QuantCommon.MaxQ); + } + + return baseQIndex; + } + + public void SetupSegmentation(ref Vp9EntropyProbs fc, ref ReadBitBuffer rb) + { + UpdateMap = false; + UpdateData = 0; + + Enabled = rb.ReadBit() != 0; + if (!Enabled) + { + return; + } + + // Segmentation map update + UpdateMap = rb.ReadBit() != 0; + if (UpdateMap) + { + for (int i = 0; i < SegTreeProbs; i++) + { + fc.SegTreeProb[i] = rb.ReadBit() != 0 + ? (byte)rb.ReadLiteral(8) + : (byte)Prob.MaxProb; + } + + TemporalUpdate = rb.ReadBit() != 0; + if (TemporalUpdate) + { + for (int i = 0; i < PredictionProbs; i++) + { + fc.SegPredProb[i] = rb.ReadBit() != 0 + ? (byte)rb.ReadLiteral(8) + : (byte)Prob.MaxProb; + } + } + else + { + for (int i = 0; i < PredictionProbs; i++) + { + fc.SegPredProb[i] = Prob.MaxProb; + } + } + } + + // Segmentation data update + UpdateData = (byte)rb.ReadBit(); + if (UpdateData != 0) + { + AbsDelta = (byte)rb.ReadBit(); + + ClearAllSegFeatures(); + + for (int i = 0; i < Constants.MaxSegments; i++) + { + for (int j = 0; j < (int)SegLvlFeatures.Max; j++) + { + int data = 0; + int featureEnabled = rb.ReadBit(); + if (featureEnabled != 0) + { + EnableSegFeature(i, (SegLvlFeatures)j); + data = rb.DecodeUnsignedMax(FeatureDataMax((SegLvlFeatures)j)); + if (IsSegFeatureSigned((SegLvlFeatures)j) != 0) + { + data = rb.ReadBit() != 0 ? -data : data; + } + } + + SetSegData(i, (SegLvlFeatures)j, data); + } + } + } + } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Surface.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Surface.cs index d9bda185b..42ba0af3d 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Surface.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Surface.cs @@ -1,12 +1,23 @@ using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Nvdec.Vp9.Common; using Ryujinx.Graphics.Video; -using System; +using System.Diagnostics; using System.Runtime.InteropServices; namespace Ryujinx.Graphics.Nvdec.Vp9.Types { + internal delegate int VpxGetFrameBufferCbFnT(MemoryAllocator allocator, Ptr cbPriv, + ulong minSize, ref VpxCodecFrameBuffer fb); + internal struct Surface : ISurface { + public const int Innerborderinpixels = 96; + public const int InterpExtend = 4; + public const int EncBorderInPixels = 160; + public const int DecBorderInPixels = 32; + + public const int Yv12FlagHighbitdepth = 8; + public ArrayPtr YBuffer; public ArrayPtr UBuffer; public ArrayPtr VBuffer; @@ -17,41 +28,60 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public readonly FrameField Field => FrameField.Progressive; - public int Width { get; } - public int Height { get; } - public int AlignedWidth { get; } - public int AlignedHeight { get; } - public int Stride { get; } - public int UvWidth { get; } - public int UvHeight { get; } - public int UvAlignedWidth { get; } - public int UvAlignedHeight { get; } - public int UvStride { get; } + public int Width { get; private set; } + public int Height { get; private set; } + public int AlignedWidth { get; private set; } + public int AlignedHeight { get; private set; } + public int Stride { get; private set; } + public int UvWidth { get; private set; } + public int UvHeight { get; private set; } + public int UvAlignedWidth { get; private set; } + public int UvAlignedHeight { get; private set; } + public int UvStride { get; private set; } + public bool HighBd { get; private set; } - public bool HighBd { get; } + public int FrameSize { get; private set; } + public int Border { get; private set; } + + public readonly int YCropWidth => Width; + public readonly int YCropHeight => Height; + public readonly int UvCropWidth => UvWidth; + public readonly int UvCropHeight => UvHeight; + + public ArrayPtr BufferAlloc; + public int BufferAllocSz; + public int SubsamplingX; + public int SubsamplingY; + public uint BitDepth; + public VpxColorSpace ColorSpace; + public VpxColorRange ColorRange; + public int RenderWidth; + public int RenderHeight; + + public int Corrupted; + public int Flags; private readonly nint _pointer; public Surface(int width, int height) { - HighBd = false; - const int Border = 32; const int SsX = 1; const int SsY = 1; + const bool Highbd = false; int alignedWidth = (width + 7) & ~7; int alignedHeight = (height + 7) & ~7; - int yStride = ((alignedWidth + 2 * Border) + 31) & ~31; - int yplaneSize = (alignedHeight + 2 * Border) * yStride; + int yStride = (alignedWidth + (2 * Border) + 31) & ~31; + int yplaneSize = (alignedHeight + (2 * Border)) * yStride; int uvWidth = alignedWidth >> SsX; int uvHeight = alignedHeight >> SsY; int uvStride = yStride >> SsX; int uvBorderW = Border >> SsX; int uvBorderH = Border >> SsY; - int uvplaneSize = (uvHeight + 2 * uvBorderH) * uvStride; + int uvplaneSize = (uvHeight + (2 * uvBorderH)) * uvStride; - int frameSize = (HighBd ? 2 : 1) * (yplaneSize + 2 * uvplaneSize); + int frameSize = (Highbd ? 2 : 1) * (yplaneSize + (2 * uvplaneSize)); nint pointer = Marshal.AllocHGlobal(frameSize); _pointer = pointer; @@ -66,9 +96,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types UvAlignedHeight = uvHeight; UvStride = uvStride; - ArrayPtr NewPlane(int start, int size, int planeBorder) + ArrayPtr NewPlane(int start, int size, int border) { - return new ArrayPtr(pointer + start + planeBorder, size - planeBorder); + return new ArrayPtr(pointer + start + border, size - border); } YBuffer = NewPlane(0, yplaneSize, (Border * yStride) + Border); @@ -76,6 +106,128 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types VBuffer = NewPlane(yplaneSize + uvplaneSize, uvplaneSize, (uvBorderH * uvStride) + uvBorderW); } + public unsafe int ReallocFrameBuffer( + MemoryAllocator allocator, + int width, + int height, + int ssX, + int ssY, + bool useHighbitdepth, + int border, + int byteAlignment, + Ptr fb, + VpxGetFrameBufferCbFnT cb, + Ptr cbPriv) + { + int alignedWidth = (width + 7) & ~7; + int alignedHeight = (height + 7) & ~7; + int yStride = (alignedWidth + (2 * border) + 31) & ~31; + ulong yplaneSize = + ((ulong)(alignedHeight + (2 * border)) * (ulong)yStride) + (ulong)byteAlignment; + int uvWidth = alignedWidth >> ssX; + int uvHeight = alignedHeight >> ssY; + int uvStride = yStride >> ssX; + int uvBorderW = border >> ssX; + int uvBorderH = border >> ssY; + ulong uvplaneSize = + ((ulong)(uvHeight + (2 * uvBorderH)) * (ulong)uvStride) + (ulong)byteAlignment; + + ulong frameSize = (ulong)(1 + (useHighbitdepth ? 1 : 0)) * (yplaneSize + (2 * uvplaneSize)); + + // frame_size is stored in buffer_alloc_sz, which is an int. If it won't + // fit, fail early. + if (frameSize > int.MaxValue) + { + return -1; + } + + if (cb != null) + { + const int AlignAddrExtraSize = 31; + ulong externalFrameSize = frameSize + AlignAddrExtraSize; + + Debug.Assert(!fb.IsNull); + + // Allocation to hold larger frame, or first allocation. + if (cb(allocator, cbPriv, externalFrameSize, ref fb.Value) < 0) + { + return -1; + } + + if (fb.Value.Data.IsNull || (ulong)fb.Value.Data.Length < externalFrameSize) + { + return -1; + } + + BufferAlloc = fb.Value.Data; + } + else if (frameSize > (ulong)BufferAllocSz) + { + // Allocation to hold larger frame, or first allocation. + allocator.Free(BufferAlloc); + BufferAlloc = ArrayPtr.Null; + + BufferAlloc = allocator.Allocate((int)frameSize); + if (BufferAlloc.IsNull) + { + return -1; + } + + BufferAllocSz = (int)frameSize; + + // This memset is needed for fixing valgrind error from C loop filter + // due to access uninitialized memory in frame border. It could be + // removed if border is totally removed. + MemoryUtil.Fill(BufferAlloc.ToPointer(), (byte)0, BufferAllocSz); + } + + /* Only support allocating buffers that have a border that's a multiple + * of 32. The border restriction is required to get 16-byte alignment of + * the start of the chroma rows without introducing an arbitrary gap + * between planes, which would break the semantics of things like + * vpx_img_set_rect(). */ + if ((border & 0x1f) != 0) + { + return -3; + } + + Width = width; + Height = height; + AlignedWidth = alignedWidth; + AlignedHeight = alignedHeight; + Stride = yStride; + + UvWidth = (width + ssX) >> ssX; + UvHeight = (height + ssY) >> ssY; + UvAlignedWidth = uvWidth; + UvAlignedHeight = uvHeight; + UvStride = uvStride; + + Border = border; + FrameSize = (int)frameSize; + SubsamplingX = ssX; + SubsamplingY = ssY; + + ArrayPtr buf = BufferAlloc; + if (useHighbitdepth) + { + // Store uint16 addresses when using 16bit framebuffers + buf = BufferAlloc; + Flags = Yv12FlagHighbitdepth; + } + else + { + Flags = 0; + } + + YBuffer = buf.Slice((border * yStride) + border); + UBuffer = buf.Slice((int)yplaneSize + (uvBorderH * uvStride) + uvBorderW); + VBuffer = buf.Slice((int)yplaneSize + (int)uvplaneSize + (uvBorderH * uvStride) + uvBorderW); + + Corrupted = 0; /* assume not corrupted by errors */ + return 0; + } + public readonly void Dispose() { Marshal.FreeHGlobal(_pointer); diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TileInfo.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TileInfo.cs index a3eea81a2..a32f55c72 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TileInfo.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TileInfo.cs @@ -56,7 +56,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types private static int GetMinLog2TileCols(int sb64Cols) { int minLog2 = 0; - while ((MaxTileWidthB64 << minLog2) < sb64Cols) + while (MaxTileWidthB64 << minLog2 < sb64Cols) { ++minLog2; } @@ -67,7 +67,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types private static int GetMaxLog2TileCols(int sb64Cols) { int maxLog2 = 1; - while ((sb64Cols >> maxLog2) >= MinTileWidthB64) + while (sb64Cols >> maxLog2 >= MinTileWidthB64) { ++maxLog2; } @@ -75,7 +75,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types return maxLog2 - 1; } - public static void GetTileNBits(int miCols, ref int minLog2TileCols, ref int maxLog2TileCols) + public static void GetTileNBits(int miCols, out int minLog2TileCols, out int maxLog2TileCols) { int sb64Cols = MiColsAlignedToSb(miCols) >> Constants.MiBlockSizeLog2; minLog2TileCols = GetMinLog2TileCols(sb64Cols); diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxMode.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxMode.cs index b3a05ed9a..47dad305c 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxMode.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxMode.cs @@ -2,11 +2,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { public enum TxMode { - Only4X4 = 0, // Only 4x4 transform used - Allow8X8 = 1, // Allow block transform size up to 8x8 - Allow16X16 = 2, // Allow block transform size up to 16x16 - Allow32X32 = 3, // Allow block transform size up to 32x32 - TxModeSelect = 4, // Transform specified for each block - TxModes = 5, + Only4X4, // Only 4x4 transform used + Allow8X8, // Allow block transform size up to 8x8 + Allow16X16, // Allow block transform size up to 16x16 + Allow32X32, // Allow block transform size up to 32x32 + TxModeSelect, // Transform specified for each block + TxModes } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxSize.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxSize.cs index 0342087b8..cfc51317a 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxSize.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxSize.cs @@ -2,10 +2,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { public enum TxSize { - Tx4x4 = 0, // 4x4 transform - Tx8x8 = 1, // 8x8 transform - Tx16x16 = 2, // 16x16 transform - Tx32x32 = 3, // 32x32 transform - TxSizes = 4, + Tx4X4, // 4x4 transform + Tx8X8, // 8x8 transform + Tx16X16, // 16x16 transform + Tx32X32, // 32x32 transform + TxSizes } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxType.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxType.cs index e7b37c925..95ef538f2 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxType.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/TxType.cs @@ -2,10 +2,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { internal enum TxType { - DctDct = 0, // DCT in both horizontal and vertical - AdstDct = 1, // ADST in vertical, DCT in horizontal - DctAdst = 2, // DCT in vertical, ADST in horizontal - AdstAdst = 3, // ADST in both directions - TxTypes = 4, + DctDct, // DCT in both horizontal and vertical + AdstDct, // ADST in vertical, DCT in horizontal + DctAdst, // DCT in vertical, ADST in horizontal + AdstAdst, // ADST in both directions + TxTypes } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Vp9Common.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Vp9Common.cs index 2456e9068..3fc31127a 100644 --- a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Vp9Common.cs +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Vp9Common.cs @@ -1,6 +1,8 @@ using Ryujinx.Common.Memory; using Ryujinx.Graphics.Nvdec.Vp9.Common; +using Ryujinx.Graphics.Nvdec.Vp9.Dsp; using Ryujinx.Graphics.Video; +using System; namespace Ryujinx.Graphics.Nvdec.Vp9.Types { @@ -9,27 +11,62 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public MacroBlockD Mb; public ArrayPtr TileWorkerData; + public int TotalTiles; public InternalErrorInfo Error; + public VpxColorSpace ColorSpace; + public VpxColorRange ColorRange; + public int Width; public int Height; + public int RenderWidth; + public int RenderHeight; + + public int LastWidth; + public int LastHeight; + public int SubsamplingX; public int SubsamplingY; + public bool UseHighBitDepth; + public ArrayPtr PrevFrameMvs; public ArrayPtr CurFrameMvs; + public Ptr FrameToShow; + public Ptr PrevFrame; + + public Ptr CurFrame; + + public Array8 RefFrameMap; /* maps fb_idx to reference slot */ + + // Prepare ref_frame_map for the next frame. + // Only used in frame parallel decode. + public Array8 NextRefFrameMap; + public Array3 FrameRefs; + public int NewFbIdx; + + public int CurShowFrameFbIdx; + + public FrameType LastFrameType; public FrameType FrameType; + public int ShowFrame; + public int LastShowFrame; + public int ShowExistingFrame; + // Flag signaling that the frame is encoded using only Intra modes. public bool IntraOnly; + public bool LastIntraOnly; public bool AllowHighPrecisionMv; + public int ResetFrameContext; + // MBs, MbRows/Cols is in 16-pixel units; MiRows/Cols is in // ModeInfo (8-pixel) units. public int MBs; @@ -49,8 +86,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types /* We allocate a ModeInfo struct for each macroblock, together with an extra row on top and column on the left to simplify prediction. */ + public int MiAllocSize; public ArrayPtr Mip; /* Base of allocated array */ - public ArrayPtr Mi; /* Corresponds to upper left visible macroblock */ + public ArrayPtr Mi; /* Corresponds to upper left visible macroblock */ + + // prev_mip and prev_mi will only be allocated in VP9 encoder. + public Ptr PrevMip; /* MODE_INFO array 'mip' from last decoded frame */ + public Ptr PrevMi; /* 'mi' from last frame (points into prev_mip) */ public ArrayPtr> MiGridBase; public ArrayPtr> MiGridVisible; @@ -70,6 +112,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public LoopFilterInfoN LfInfo; + public int RefreshFrameContext; /* Two state 0 = NO, 1 = YES */ + public Array4 RefFrameSignBias; /* Two state 0, 1 */ public LoopFilter Lf; @@ -81,10 +125,26 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public ReferenceMode ReferenceMode; public Ptr Fc; + public ArrayPtr FrameContexts; // FRAME_CONTEXTS + public uint FrameContextIdx; /* Context to use/update */ public Ptr Counts; + public uint CurrentVideoFrame; + public BitstreamProfile Profile; + + public BitDepth BitDepth; + public BitDepth DequantBitDepth; // bit_depth of current dequantizer + + public int ErrorResilientMode; + public int FrameParallelDecodingMode; + public int Log2TileCols, Log2TileRows; + public int ByteAlignment; + public int SkipLoopFilter; + + public Ptr BufferPool; + public ArrayPtr AboveSegContext; public ArrayPtr AboveContext; @@ -95,8 +155,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public bool CompoundReferenceAllowed() { - int i; - for (i = 1; i < Constants.RefsPerFrame; ++i) + for (int i = 1; i < Constants.RefsPerFrame; ++i) { if (RefFrameSignBias[i + 1] != RefFrameSignBias[1]) { @@ -107,6 +166,47 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types return false; } + public readonly ref Surface GetFrameNewBuffer() + { + return ref BufferPool.Value.FrameBufs[NewFbIdx].Buf; + } + + public readonly int GetFreeFb() + { + ref Array12 frameBufs = ref BufferPool.Value.FrameBufs; + + int i; + + for (i = 0; i < Constants.FrameBuffers; ++i) + { + if (frameBufs[i].RefCount == 0) + { + break; + } + } + + if (i != Constants.FrameBuffers) + { + frameBufs[i].RefCount = 1; + } + else + { + // Reset i to be INVALID_IDX to indicate no free buffer found. + i = RefBuffer.InvalidIdx; + } + + return i; + } + + public void SwapCurrentAndLastSegMap() + { + // Swap indices. + (SegMapIdx, PrevSegMapIdx) = (PrevSegMapIdx, SegMapIdx); + + CurrentFrameSegMap = SegMapArray[SegMapIdx]; + LastFrameSegMap = SegMapArray[PrevSegMapIdx]; + } + private static int CalcMiSize(int len) { // Len is in mi units. @@ -129,7 +229,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public void AllocTileWorkerData(MemoryAllocator allocator, int tileCols, int tileRows, int maxThreads) { - TileWorkerData = allocator.Allocate(tileCols * tileRows + (maxThreads > 1 ? maxThreads : 0)); + TileWorkerData = + allocator.Allocate((tileCols * tileRows) + (maxThreads > 1 ? maxThreads : 0)); } public readonly void FreeTileWorkerData(MemoryAllocator allocator) @@ -139,9 +240,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types private void AllocSegMap(MemoryAllocator allocator, int segMapSize) { - int i; - - for (i = 0; i < Constants.NumPingPongBuffers; ++i) + for (int i = 0; i < Constants.NumPingPongBuffers; ++i) { SegMapArray[i] = allocator.Allocate(segMapSize); } @@ -156,9 +255,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types private void FreeSegMap(MemoryAllocator allocator) { - int i; - - for (i = 0; i < Constants.NumPingPongBuffers; ++i) + for (int i = 0; i < Constants.NumPingPongBuffers; ++i) { allocator.Free(SegMapArray[i]); SegMapArray[i] = ArrayPtr.Null; @@ -194,6 +291,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types Lf.Lfm = ArrayPtr.Null; allocator.Free(CurFrameMvs); CurFrameMvs = ArrayPtr.Null; + if (UsePrevFrameMvs) { allocator.Free(PrevFrameMvs); @@ -209,7 +307,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types Lf.Lfm = allocator.Allocate(((MiRows + (Constants.MiBlockSize - 1)) >> 3) * Lf.LfmStride); } - public void AllocContextBuffers(MemoryAllocator allocator, int width, int height) + public bool AllocContextBuffers(MemoryAllocator allocator, int width, int height) { SetMbMi(width, height); int newMiSize = MiStride * CalcMiSize(MiRows); @@ -239,6 +337,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { PrevFrameMvs = allocator.Allocate(MiRows * MiCols); } + + return false; } private unsafe void DecSetupMi() @@ -266,9 +366,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types internal void InitMacroBlockD(ref MacroBlockD xd, ArrayPtr dqcoeff) { - int i; - - for (i = 0; i < Constants.MaxMbPlane; ++i) + for (int i = 0; i < Constants.MaxMbPlane; ++i) { xd.Plane[i].DqCoeff = dqcoeff; xd.AboveContext[i] = AboveContext.Slice(i * 2 * TileInfo.MiColsAlignedToSb(MiCols)); @@ -281,6 +379,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types { MemoryUtil.Copy(ref xd.Plane[i].SegDequant, ref UvDequant); } + xd.Fc = new Ptr(ref Fc.Value); } @@ -293,29 +392,27 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types public void SetupSegmentationDequant() { - const BitDepth BitDepth = BitDepth.Bits8; // TODO: Configurable // Build y/uv dequant values based on segmentation. if (Seg.Enabled) { - int i; - for (i = 0; i < Constants.MaxSegments; ++i) + for (int i = 0; i < Constants.MaxSegments; ++i) { - int qIndex = QuantCommon.GetQIndex(ref Seg, i, BaseQindex); - YDequant[i][0] = QuantCommon.DcQuant(qIndex, YDcDeltaQ, BitDepth); - YDequant[i][1] = QuantCommon.AcQuant(qIndex, 0, BitDepth); - UvDequant[i][0] = QuantCommon.DcQuant(qIndex, UvDcDeltaQ, BitDepth); - UvDequant[i][1] = QuantCommon.AcQuant(qIndex, UvAcDeltaQ, BitDepth); + int qindex = Seg.GetQIndex(i, BaseQindex); + YDequant[i][0] = QuantCommon.DcQuant(qindex, YDcDeltaQ, BitDepth); + YDequant[i][1] = QuantCommon.AcQuant(qindex, 0, BitDepth); + UvDequant[i][0] = QuantCommon.DcQuant(qindex, UvDcDeltaQ, BitDepth); + UvDequant[i][1] = QuantCommon.AcQuant(qindex, UvAcDeltaQ, BitDepth); } } else { - int qIndex = BaseQindex; + int qindex = BaseQindex; // When segmentation is disabled, only the first value is used. The // remaining are don't cares. - YDequant[0][0] = QuantCommon.DcQuant(qIndex, YDcDeltaQ, BitDepth); - YDequant[0][1] = QuantCommon.AcQuant(qIndex, 0, BitDepth); - UvDequant[0][0] = QuantCommon.DcQuant(qIndex, UvDcDeltaQ, BitDepth); - UvDequant[0][1] = QuantCommon.AcQuant(qIndex, UvAcDeltaQ, BitDepth); + YDequant[0][0] = QuantCommon.DcQuant(qindex, YDcDeltaQ, BitDepth); + YDequant[0][1] = QuantCommon.AcQuant(qindex, 0, BitDepth); + UvDequant[0][0] = QuantCommon.DcQuant(qindex, UvDcDeltaQ, BitDepth); + UvDequant[0][1] = QuantCommon.AcQuant(qindex, UvAcDeltaQ, BitDepth); } } @@ -327,5 +424,574 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types refBuf.Sf.SetupScaleFactorsForFrame(refBuf.Buf.Width, refBuf.Buf.Height, Width, Height); } } + + public void ReadFrameReferenceModeProbs(ref Reader r) + { + ref Vp9EntropyProbs fc = ref Fc.Value; + + if (ReferenceMode == ReferenceMode.Select) + { + for (int i = 0; i < Constants.CompInterContexts; ++i) + { + r.DiffUpdateProb(ref fc.CompInterProb[i]); + } + } + + if (ReferenceMode != ReferenceMode.Compound) + { + for (int i = 0; i < Constants.RefContexts; ++i) + { + r.DiffUpdateProb(ref fc.SingleRefProb[i][0]); + r.DiffUpdateProb(ref fc.SingleRefProb[i][1]); + } + } + + if (ReferenceMode != ReferenceMode.Single) + { + for (int i = 0; i < Constants.RefContexts; ++i) + { + r.DiffUpdateProb(ref fc.CompRefProb[i]); + } + } + } + + public ReferenceMode ReadFrameReferenceMode(ref Reader r) + { + if (CompoundReferenceAllowed()) + { + return r.ReadBit() != 0 + ? r.ReadBit() != 0 ? ReferenceMode.Select : ReferenceMode.Compound + : ReferenceMode.Single; + } + + return ReferenceMode.Single; + } + + public void SetupCompoundReferenceMode() + { + if (RefFrameSignBias[Constants.LastFrame] == RefFrameSignBias[Constants.GoldenFrame]) + { + CompFixedRef = Constants.AltRefFrame; + CompVarRef[0] = Constants.LastFrame; + CompVarRef[1] = Constants.GoldenFrame; + } + else if (RefFrameSignBias[Constants.LastFrame] == RefFrameSignBias[Constants.AltRefFrame]) + { + CompFixedRef = Constants.GoldenFrame; + CompVarRef[0] = Constants.LastFrame; + CompVarRef[1] = Constants.AltRefFrame; + } + else + { + CompFixedRef = Constants.LastFrame; + CompVarRef[0] = Constants.GoldenFrame; + CompVarRef[1] = Constants.AltRefFrame; + } + } + + public readonly void InitMvProbs() + { + Fc.Value.Joints[0] = 32; + Fc.Value.Joints[1] = 64; + Fc.Value.Joints[2] = 96; + + Fc.Value.Sign[0] = 128; + Fc.Value.Classes[0][0] = 224; + Fc.Value.Classes[0][1] = 144; + Fc.Value.Classes[0][2] = 192; + Fc.Value.Classes[0][3] = 168; + Fc.Value.Classes[0][4] = 192; + Fc.Value.Classes[0][5] = 176; + Fc.Value.Classes[0][6] = 192; + Fc.Value.Classes[0][7] = 198; + Fc.Value.Classes[0][8] = 198; + Fc.Value.Classes[0][9] = 245; + Fc.Value.Class0[0][0] = 216; + Fc.Value.Bits[0][0] = 136; + Fc.Value.Bits[0][1] = 140; + Fc.Value.Bits[0][2] = 148; + Fc.Value.Bits[0][3] = 160; + Fc.Value.Bits[0][4] = 176; + Fc.Value.Bits[0][5] = 192; + Fc.Value.Bits[0][6] = 224; + Fc.Value.Bits[0][7] = 234; + Fc.Value.Bits[0][8] = 234; + Fc.Value.Bits[0][9] = 240; + Fc.Value.Class0Fp[0][0][0] = 128; + Fc.Value.Class0Fp[0][0][1] = 128; + Fc.Value.Class0Fp[0][0][2] = 64; + Fc.Value.Class0Fp[0][1][0] = 96; + Fc.Value.Class0Fp[0][1][1] = 112; + Fc.Value.Class0Fp[0][1][2] = 64; + Fc.Value.Fp[0][0] = 64; + Fc.Value.Fp[0][1] = 96; + Fc.Value.Fp[0][2] = 64; + Fc.Value.Class0Hp[0] = 160; + Fc.Value.Hp[0] = 128; + + Fc.Value.Sign[1] = 128; + Fc.Value.Classes[1][0] = 216; + Fc.Value.Classes[1][1] = 128; + Fc.Value.Classes[1][2] = 176; + Fc.Value.Classes[1][3] = 160; + Fc.Value.Classes[1][4] = 176; + Fc.Value.Classes[1][5] = 176; + Fc.Value.Classes[1][6] = 192; + Fc.Value.Classes[1][7] = 198; + Fc.Value.Classes[1][8] = 198; + Fc.Value.Classes[1][9] = 208; + Fc.Value.Class0[1][0] = 208; + Fc.Value.Bits[1][0] = 136; + Fc.Value.Bits[1][1] = 140; + Fc.Value.Bits[1][2] = 148; + Fc.Value.Bits[1][3] = 160; + Fc.Value.Bits[1][4] = 176; + Fc.Value.Bits[1][5] = 192; + Fc.Value.Bits[1][6] = 224; + Fc.Value.Bits[1][7] = 234; + Fc.Value.Bits[1][8] = 234; + Fc.Value.Bits[1][9] = 240; + Fc.Value.Class0Fp[1][0][0] = 128; + Fc.Value.Class0Fp[1][0][1] = 128; + Fc.Value.Class0Fp[1][0][2] = 64; + Fc.Value.Class0Fp[1][1][0] = 96; + Fc.Value.Class0Fp[1][1][1] = 112; + Fc.Value.Class0Fp[1][1][2] = 64; + Fc.Value.Fp[1][0] = 64; + Fc.Value.Fp[1][1] = 96; + Fc.Value.Fp[1][2] = 64; + Fc.Value.Class0Hp[1] = 160; + Fc.Value.Hp[1] = 128; + } + + public void AdaptMvProbs(bool allowHp) + { + ref Vp9EntropyProbs fc = ref Fc.Value; + ref Vp9EntropyProbs preFc = ref FrameContexts[(int)FrameContextIdx]; + ref Vp9BackwardUpdates counts = ref Counts.Value; + + Prob.VpxTreeMergeProbs( + EntropyMv.JointTree, + preFc.Joints.AsSpan(), + counts.Joints.AsSpan(), + fc.Joints.AsSpan()); + + for (int i = 0; i < 2; ++i) + { + fc.Sign[i] = Prob.ModeMvMergeProbs(preFc.Sign[i], ref counts.Sign[i]); + Prob.VpxTreeMergeProbs( + EntropyMv.ClassTree, + preFc.Classes[i].AsSpan(), + counts.Classes[i].AsSpan(), + fc.Classes[i].AsSpan()); + Prob.VpxTreeMergeProbs( + EntropyMv.Class0Tree, + preFc.Class0[i].AsSpan(), + counts.Class0[i].AsSpan(), + fc.Class0[i].AsSpan()); + + for (int j = 0; j < EntropyMv.OffsetBits; ++j) + { + fc.Bits[i][j] = Prob.ModeMvMergeProbs(preFc.Bits[i][j], ref counts.Bits[i][j]); + } + + for (int j = 0; j < EntropyMv.Class0Size; ++j) + { + Prob.VpxTreeMergeProbs( + EntropyMv.FpTree, + preFc.Class0Fp[i][j].AsSpan(), + counts.Class0Fp[i][j].AsSpan(), + fc.Class0Fp[i][j].AsSpan()); + } + + Prob.VpxTreeMergeProbs(EntropyMv.FpTree, preFc.Fp[i].AsSpan(), counts.Fp[i].AsSpan(), + fc.Fp[i].AsSpan()); + + if (allowHp) + { + fc.Class0Hp[i] = Prob.ModeMvMergeProbs(preFc.Class0Hp[i], ref counts.Class0Hp[i]); + fc.Hp[i] = Prob.ModeMvMergeProbs(preFc.Hp[i], ref counts.Hp[i]); + } + } + } + + public void ResizeContextBuffers(MemoryAllocator allocator, int width, int height) + { + if (Width != width || Height != height) + { + int newMiRows = BitUtils.AlignPowerOfTwo(height, Constants.MiSizeLog2) >> Constants.MiSizeLog2; + int newMiCols = BitUtils.AlignPowerOfTwo(width, Constants.MiSizeLog2) >> Constants.MiSizeLog2; + + // Allocations in AllocContextBuffers() depend on individual + // dimensions as well as the overall size. + if (newMiCols > MiCols || newMiRows > MiRows) + { + if (AllocContextBuffers(allocator, width, height)) + { + // The Mi* values have been cleared and any existing context + // buffers have been freed. Clear Width and Height to be + // consistent and to force a realloc next time. + Width = 0; + Height = 0; + Error.InternalError(CodecErr.MemError, "Failed to allocate context buffers"); + } + } + else + { + SetMbMi(width, height); + } + + InitContextBuffers(); + Width = width; + Height = height; + } + + if (CurFrameMvs.IsNull || + MiRows > CurFrame.Value.MiRows || + MiCols > CurFrame.Value.MiCols) + { + ResizeMvBuffer(allocator); + } + } + + public void CheckMemError(ref ArrayPtr lval, ArrayPtr expr) + where T : unmanaged + { + lval = expr; + if (lval.IsNull) + { + Error.InternalError(CodecErr.MemError, "Failed to allocate"); + } + } + + private void ResizeMvBuffer(MemoryAllocator allocator) + { + allocator.Free(CurFrameMvs); + CurFrame.Value.MiRows = MiRows; + CurFrame.Value.MiCols = MiCols; + CheckMemError(ref CurFrameMvs, allocator.Allocate(MiRows * MiCols)); + } + + public void CheckMemError(ref Ptr lval, Ptr expr) where T : unmanaged + { + lval = expr; + if (lval.IsNull) + { + Error.InternalError(CodecErr.MemError, "Failed to allocate"); + } + } + + public void SetupTileInfo(ref ReadBitBuffer rb) + { + TileInfo.GetTileNBits(MiCols, out int minLog2TileCols, out int maxLog2TileCols); + + // columns + int maxOnes = maxLog2TileCols - minLog2TileCols; + Log2TileCols = minLog2TileCols; + while (maxOnes-- != 0 && rb.ReadBit() != 0) + { + Log2TileCols++; + } + + if (Log2TileCols > 6) + { + Error.InternalError(CodecErr.CorruptFrame, "Invalid number of tile columns"); + } + + // rows + Log2TileRows = rb.ReadBit(); + if (Log2TileRows != 0) + { + Log2TileRows += rb.ReadBit(); + } + } + + public void ReadBitdepthColorspaceSampling(ref ReadBitBuffer rb) + { + if (Profile >= BitstreamProfile.Profile2) + { + BitDepth = rb.ReadBit() != 0 ? BitDepth.Bits12 : BitDepth.Bits10; + UseHighBitDepth = true; + } + else + { + BitDepth = BitDepth.Bits8; + UseHighBitDepth = false; + } + + ColorSpace = (VpxColorSpace)rb.ReadLiteral(3); + if (ColorSpace != VpxColorSpace.Srgb) + { + ColorRange = (VpxColorRange)rb.ReadBit(); + if (Profile is BitstreamProfile.Profile1 or BitstreamProfile.Profile3) + { + SubsamplingX = rb.ReadBit(); + SubsamplingY = rb.ReadBit(); + if (SubsamplingX == 1 && SubsamplingY == 1) + { + Error.InternalError(CodecErr.UnsupBitstream, + "4:2:0 color not supported in profile 1 or 3"); + } + + if (rb.ReadBit() != 0) + { + Error.InternalError(CodecErr.UnsupBitstream, "Reserved bit set"); + } + } + else + { + SubsamplingY = SubsamplingX = 1; + } + } + else + { + ColorRange = VpxColorRange.Full; + if (Profile is BitstreamProfile.Profile1 or BitstreamProfile.Profile3) + { + // Note if colorspace is SRGB then 4:4:4 chroma sampling is assumed. + // 4:2:2 or 4:4:0 chroma sampling is not allowed. + SubsamplingY = SubsamplingX = 0; + if (rb.ReadBit() != 0) + { + Error.InternalError(CodecErr.UnsupBitstream, "Reserved bit set"); + } + } + else + { + Error.InternalError(CodecErr.UnsupBitstream, "4:4:4 color not supported in profile 0 or 2"); + } + } + } + + public void AdaptModeProbs() + { + ref Vp9EntropyProbs fc = ref Fc.Value; + ref Vp9EntropyProbs preFc = ref FrameContexts[(int)FrameContextIdx]; + ref Vp9BackwardUpdates counts = ref Counts.Value; + + for (int i = 0; i < Constants.IntraInterContexts; i++) + { + fc.IntraInterProb[i] = Prob.ModeMvMergeProbs(preFc.IntraInterProb[i], ref counts.IntraInter[i]); + } + + for (int i = 0; i < Constants.CompInterContexts; i++) + { + fc.CompInterProb[i] = Prob.ModeMvMergeProbs(preFc.CompInterProb[i], ref counts.CompInter[i]); + } + + for (int i = 0; i < Constants.RefContexts; i++) + { + fc.CompRefProb[i] = Prob.ModeMvMergeProbs(preFc.CompRefProb[i], ref counts.CompRef[i]); + } + + for (int i = 0; i < Constants.RefContexts; i++) + { + for (int j = 0; j < 2; j++) + { + fc.SingleRefProb[i][j] = + Prob.ModeMvMergeProbs(preFc.SingleRefProb[i][j], ref counts.SingleRef[i][j]); + } + } + + for (int i = 0; i < Constants.InterModeContexts; i++) + { + Prob.VpxTreeMergeProbs( + EntropyMode.InterModeTree, + preFc.InterModeProb[i].AsSpan(), + counts.InterMode[i].AsSpan(), + fc.InterModeProb[i].AsSpan()); + } + + for (int i = 0; i < EntropyMode.BlockSizeGroups; i++) + { + Prob.VpxTreeMergeProbs( + EntropyMode.IntraModeTree, + preFc.YModeProb[i].AsSpan(), + counts.YMode[i].AsSpan(), + fc.YModeProb[i].AsSpan()); + } + + for (int i = 0; i < Constants.IntraModes; ++i) + { + Prob.VpxTreeMergeProbs( + EntropyMode.IntraModeTree, + preFc.UvModeProb[i].AsSpan(), + counts.UvMode[i].AsSpan(), + fc.UvModeProb[i].AsSpan()); + } + + for (int i = 0; i < Constants.PartitionContexts; i++) + { + Prob.VpxTreeMergeProbs( + EntropyMode.PartitionTree, + preFc.PartitionProb[i].AsSpan(), + counts.Partition[i].AsSpan(), + fc.PartitionProb[i].AsSpan()); + } + + if (InterpFilter == Constants.Switchable) + { + for (int i = 0; i < Constants.SwitchableFilterContexts; i++) + { + Prob.VpxTreeMergeProbs( + EntropyMode.SwitchableInterpTree, + preFc.SwitchableInterpProb[i].AsSpan(), + counts.SwitchableInterp[i].AsSpan(), + fc.SwitchableInterpProb[i].AsSpan()); + } + } + + if (TxMode == TxMode.TxModeSelect) + { + Array1> branchCt8X8P = new(); + Array2> branchCt16X16P = new(); + Array3> branchCt32X32P = new(); + + for (int i = 0; i < EntropyMode.TxSizeContexts; ++i) + { + EntropyMode.TxCountsToBranchCounts8X8(counts.Tx8x8[i].AsSpan(), ref branchCt8X8P); + for (int j = 0; j < (int)TxSize.TxSizes - 3; ++j) + { + fc.Tx8x8Prob[i][j] = Prob.ModeMvMergeProbs(preFc.Tx8x8Prob[i][j], ref branchCt8X8P[j]); + } + + EntropyMode.TxCountsToBranchCounts16X16(counts.Tx16x16[i].AsSpan(), ref branchCt16X16P); + for (int j = 0; j < (int)TxSize.TxSizes - 2; ++j) + { + fc.Tx16x16Prob[i][j] = + Prob.ModeMvMergeProbs(preFc.Tx16x16Prob[i][j], ref branchCt16X16P[j]); + } + + EntropyMode.TxCountsToBranchCounts32X32(counts.Tx32x32[i].AsSpan(), ref branchCt32X32P); + for (int j = 0; j < (int)TxSize.TxSizes - 1; ++j) + { + fc.Tx32x32Prob[i][j] = + Prob.ModeMvMergeProbs(preFc.Tx32x32Prob[i][j], ref branchCt32X32P[j]); + } + } + } + + for (int i = 0; i < Constants.SkipContexts; ++i) + { + fc.SkipProb[i] = Prob.ModeMvMergeProbs(preFc.SkipProb[i], ref counts.Skip[i]); + } + } + + public void AdaptCoefProbs() + { + byte t; + uint countSat, updateFactor; + + if (FrameIsIntraOnly()) + { + updateFactor = Entropy.CoefMaxUpdateFactorKey; + countSat = Entropy.CoefCountSatKey; + } + else if (LastFrameType == FrameType.KeyFrame) + { + updateFactor = Entropy.CoefMaxUpdateFactorAfterKey; /* adapt quickly */ + countSat = Entropy.CoefCountSatAfterKey; + } + else + { + updateFactor = Entropy.CoefMaxUpdateFactor; + countSat = Entropy.CoefCountSat; + } + + for (t = (int)TxSize.Tx4X4; t <= (int)TxSize.Tx32X32; t++) + { + AdaptCoefProbs(t, countSat, updateFactor); + } + } + + public void SetMvs(ReadOnlySpan mvs) + { + if (mvs.Length > PrevFrameMvs.Length) + { + throw new ArgumentException( + $"Size mismatch, expected: {PrevFrameMvs.Length}, but got: {mvs.Length}."); + } + + for (int i = 0; i < mvs.Length; i++) + { + ref MvRef mv = ref PrevFrameMvs[i]; + + mv.Mv[0].Row = mvs[i].Mvs[0].Row; + mv.Mv[0].Col = mvs[i].Mvs[0].Col; + mv.Mv[1].Row = mvs[i].Mvs[1].Row; + mv.Mv[1].Col = mvs[i].Mvs[1].Col; + + mv.RefFrame[0] = (sbyte)mvs[i].RefFrames[0]; + mv.RefFrame[1] = (sbyte)mvs[i].RefFrames[1]; + } + } + + public void GetMvs(Span mvs) + { + if (mvs.Length > CurFrameMvs.Length) + { + throw new ArgumentException( + $"Size mismatch, expected: {CurFrameMvs.Length}, but got: {mvs.Length}."); + } + + for (int i = 0; i < mvs.Length; i++) + { + ref MvRef mv = ref CurFrameMvs[i]; + + mvs[i].Mvs[0].Row = mv.Mv[0].Row; + mvs[i].Mvs[0].Col = mv.Mv[0].Col; + mvs[i].Mvs[1].Row = mv.Mv[1].Row; + mvs[i].Mvs[1].Col = mv.Mv[1].Col; + + mvs[i].RefFrames[0] = mv.RefFrame[0]; + mvs[i].RefFrames[1] = mv.RefFrame[1]; + } + } + + private void AdaptCoefProbs(byte txSize, uint countSat, uint updateFactor) + { + ref Vp9EntropyProbs preFc = ref FrameContexts[(int)FrameContextIdx]; + ref Array2>>>> probs = ref Fc.Value.CoefProbs[txSize]; + ref Array2>>>> preProbs = ref preFc.CoefProbs[txSize]; + ref Array2>>>> counts = ref Counts.Value.Coef[txSize]; + ref Array2>>> eobCounts = ref Counts.Value.EobBranch[txSize]; + + for (int i = 0; i < Constants.PlaneTypes; ++i) + { + for (int j = 0; j < Entropy.RefTypes; ++j) + { + for (int k = 0; k < Entropy.CoefBands; ++k) + { + for (int l = 0; l < Entropy.BAND_COEFF_CONTEXTS(k); ++l) + { + int n0 = (int)counts[i][j][k][l][Entropy.ZeroToken]; + int n1 = (int)counts[i][j][k][l][Entropy.OneToken]; + int n2 = (int)counts[i][j][k][l][Entropy.TwoToken]; + int neob = (int)counts[i][j][k][l][Entropy.EobModelToken]; + Array3> branchCt = new(); + branchCt[0][0] = (uint)neob; + branchCt[0][1] = (uint)(eobCounts[i][j][k][l] - neob); + branchCt[1][0] = (uint)n0; + branchCt[1][1] = (uint)(n1 + n2); + branchCt[2][0] = (uint)n1; + branchCt[2][1] = (uint)n2; + for (int m = 0; m < Entropy.UnconstrainedNodes; ++m) + { + probs[i][j][k][l][m] = Prob.MergeProbs(preProbs[i][j][k][l][m], ref branchCt[m], + countSat, updateFactor); + } + } + } + } + } + } + + public readonly void DefaultCoefProbs() + { + Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx4X4], Entropy.DefaultCoefProbs4X4); + Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx8X8], Entropy.DefaultCoefProbs8X8); + Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx16X16], Entropy.DefaultCoefProbs16X16); + Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx32X32], Entropy.DefaultCoefProbs32X32); + } } } diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Vp9Decoder.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Vp9Decoder.cs new file mode 100644 index 000000000..4df8ef549 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/Vp9Decoder.cs @@ -0,0 +1,409 @@ +using Ryujinx.Common.Memory; +using Ryujinx.Graphics.Nvdec.Vp9.Common; +using Ryujinx.Graphics.Video; +using System.Diagnostics; + +namespace Ryujinx.Graphics.Nvdec.Vp9.Types +{ + internal struct Vp9Decoder + { + public Vp9Common Common; + + public int ReadyForNewData; + + public int RefreshFrameFlags; + + public int NeedResync; // Wait for key/intra-only frame. + public int HoldRefBuf; // Hold the reference buffer. + + private static void DecreaseRefCount(int idx, ref Array12 frameBufs, ref BufferPool pool) + { + if (idx >= 0 && frameBufs[idx].RefCount > 0) + { + --frameBufs[idx].RefCount; + // A worker may only get a free framebuffer index when calling GetFreeFb. + // But the private buffer is not set up until finish decoding header. + // So any error happens during decoding header, the frame_bufs will not + // have valid priv buffer. + if (frameBufs[idx].Released == 0 && frameBufs[idx].RefCount == 0 && + !frameBufs[idx].RawFrameBuffer.Priv.IsNull) + { + FrameBuffers.ReleaseFrameBuffer(pool.CbPriv, ref frameBufs[idx].RawFrameBuffer); + frameBufs[idx].Released = 1; + } + } + } + + public void Create(MemoryAllocator allocator, ref BufferPool pool) + { + ref Vp9Common cm = ref Common; + + cm.CheckMemError(ref cm.Fc, + new Ptr(ref allocator.Allocate(1)[0])); + cm.CheckMemError(ref cm.FrameContexts, + allocator.Allocate(Constants.FrameContexts)); + + for (int i = 0; i < EntropyMode.KfYModeProb.Length; i++) + { + for (int j = 0; j < EntropyMode.KfYModeProb[i].Length; j++) + { + for (int k = 0; k < EntropyMode.KfYModeProb[i][j].Length; k++) + { + cm.Fc.Value.KfYModeProb[i][j][k] = EntropyMode.KfYModeProb[i][j][k]; + } + } + } + + for (int i = 0; i < EntropyMode.KfUvModeProb.Length; i++) + { + for (int j = 0; j < EntropyMode.KfUvModeProb[i].Length; j++) + { + cm.Fc.Value.KfUvModeProb[i][j] = EntropyMode.KfUvModeProb[i][j]; + } + } + + byte[][] kfPartitionProbs = + [ + // 8x8 . 4x4 + [158, 97, 94], // a/l both not split + [93, 24, 99], // a split, l not split + [85, 119, 44], // l split, a not split + [62, 59, 67], // a/l both split + + // 16x16 . 8x8 + [149, 53, 53], // a/l both not split + [94, 20, 48], // a split, l not split + [83, 53, 24], // l split, a not split + [52, 18, 18], // a/l both split + + // 32x32 . 16x16 + [150, 40, 39], // a/l both not split + [78, 12, 26], // a split, l not split + [67, 33, 11], // l split, a not split + [24, 7, 5], // a/l both split + + // 64x64 . 32x32 + [174, 35, 49], // a/l both not split + [68, 11, 27], // a split, l not split + [57, 15, 9], // l split, a not split + [12, 3, 3] // a/l both split + ]; + + for (int i = 0; i < kfPartitionProbs.Length; i++) + { + for (int j = 0; j < kfPartitionProbs[i].Length; j++) + { + cm.Fc.Value.KfPartitionProb[i][j] = kfPartitionProbs[i][j]; + } + } + + cm.Counts = new Ptr(ref allocator.Allocate(1)[0]); + + NeedResync = 1; + + // Initialize the references to not point to any frame buffers. + for (int i = 0; i < 8; i++) + { + cm.RefFrameMap[i] = -1; + cm.NextRefFrameMap[i] = -1; + } + + cm.CurrentVideoFrame = 0; + ReadyForNewData = 1; + Common.BufferPool = new Ptr(ref pool); + + cm.BitDepth = BitDepth.Bits8; + cm.DequantBitDepth = BitDepth.Bits8; + + // vp9_loop_filter_init(ref cm); + } + + /* If any buffer updating is signaled it should be done here. */ + private void SwapFrameBuffers() + { + int refIndex = 0, mask; + ref Vp9Common cm = ref Common; + ref BufferPool pool = ref cm.BufferPool.Value; + ref Array12 frameBufs = ref cm.BufferPool.Value.FrameBufs; + + for (mask = RefreshFrameFlags; mask != 0; mask >>= 1) + { + int oldIdx = cm.RefFrameMap[refIndex]; + // Current thread releases the holding of reference frame. + DecreaseRefCount(oldIdx, ref frameBufs, ref pool); + + // Release the reference frame in reference map. + if ((mask & 1) != 0) + { + DecreaseRefCount(oldIdx, ref frameBufs, ref pool); + } + + cm.RefFrameMap[refIndex] = cm.NextRefFrameMap[refIndex]; + ++refIndex; + } + + // Current thread releases the holding of reference frame. + for (; refIndex < Constants.RefFrames && cm.ShowExistingFrame == 0; ++refIndex) + { + int oldIdx = cm.RefFrameMap[refIndex]; + DecreaseRefCount(oldIdx, ref frameBufs, ref pool); + cm.RefFrameMap[refIndex] = cm.NextRefFrameMap[refIndex]; + } + + HoldRefBuf = 0; + cm.FrameToShow = new Ptr(ref cm.GetFrameNewBuffer()); + + --frameBufs[cm.NewFbIdx].RefCount; + + // Invalidate these references until the next frame starts. + for (refIndex = 0; refIndex < 3; refIndex++) + { + cm.FrameRefs[refIndex].Idx = RefBuffer.InvalidIdx; + } + } + + public CodecErr ReceiveCompressedData(MemoryAllocator allocator, ulong size, ref ArrayPtr psource) + { + ref Vp9Common cm = ref Common; + ref BufferPool pool = ref cm.BufferPool.Value; + ref Array12 frameBufs = ref cm.BufferPool.Value.FrameBufs; + ArrayPtr source = psource; + CodecErr retcode = 0; + cm.Error.ErrorCode = CodecErr.Ok; + + if (size == 0) + { + // This is used to signal that we are missing frames. + // We do not know if the missing frame(s) was supposed to update + // any of the reference buffers, but we act conservative and + // mark only the last buffer as corrupted. + + if (cm.FrameRefs[0].Idx > 0) + { + cm.FrameRefs[0].Buf.Corrupted = 1; + } + } + + ReadyForNewData = 0; + + // Check if the previous frame was a frame without any references to it. + if (cm.NewFbIdx >= 0 && frameBufs[cm.NewFbIdx].RefCount == 0 && + frameBufs[cm.NewFbIdx].Released == 0) + { + FrameBuffers.ReleaseFrameBuffer(pool.CbPriv, ref frameBufs[cm.NewFbIdx].RawFrameBuffer); + frameBufs[cm.NewFbIdx].Released = 1; + } + + // Find a free frame buffer. Return error if can not find any. + cm.NewFbIdx = cm.GetFreeFb(); + if (cm.NewFbIdx == RefBuffer.InvalidIdx) + { + ReadyForNewData = 1; + cm.Error.InternalError(CodecErr.MemError, "Unable to find free frame buffer"); + + return cm.Error.ErrorCode; + } + + // Assign a MV array to the frame buffer. + cm.CurFrame = new Ptr(ref pool.FrameBufs[cm.NewFbIdx]); + + HoldRefBuf = 0; + + DecodeFrame.Decode(allocator, ref this, new ArrayPtr(ref source[0], (int)size), out psource); + + SwapFrameBuffers(); + + // vpx_clear_system_state(); + + if (cm.ShowExistingFrame == 0) + { + cm.LastShowFrame = cm.ShowFrame; + cm.PrevFrame = cm.CurFrame; + + if (cm.PrevFrameMvs.IsNull || cm.PrevFrameMvs.Length != cm.CurFrameMvs.Length) + { + allocator.Free(cm.PrevFrameMvs); + cm.PrevFrameMvs = allocator.Allocate(cm.CurFrameMvs.Length); + } + + cm.CurFrameMvs.AsSpan().CopyTo(cm.PrevFrameMvs.AsSpan()); + if (cm.Seg.Enabled) + { + cm.SwapCurrentAndLastSegMap(); + } + } + + if (cm.ShowFrame != 0) + { + cm.CurShowFrameFbIdx = cm.NewFbIdx; + } + + // Update progress in frame parallel decode. + cm.LastWidth = cm.Width; + cm.LastHeight = cm.Height; + if (cm.ShowFrame != 0) + { + cm.CurrentVideoFrame++; + } + + return retcode; + } + + public int GetRawFrame(ref Surface sd) + { + ref Vp9Common cm = ref Common; + int ret = -1; + + if (ReadyForNewData == 1) + { + return ret; + } + + ReadyForNewData = 1; + + if (cm.ShowFrame == 0) + { + return ret; + } + + ReadyForNewData = 1; + + sd = cm.FrameToShow.Value; + ret = 0; + + return ret; + } + + public CodecErr Decode(MemoryAllocator allocator, ArrayPtr data) + { + ArrayPtr dataStart = data; + CodecErr res; + Array8 frameSizes = new(); + + res = Decoder.ParseSuperframeIndex(data, (ulong)data.Length, ref frameSizes, out int frameCount); + if (res != CodecErr.Ok) + { + return res; + } + + // Decode in serial mode. + if (frameCount > 0) + { + for (int i = 0; i < frameCount; ++i) + { + ArrayPtr dataStartCopy = dataStart; + uint frameSize = frameSizes[i]; + if (frameSize > (uint)dataStart.Length) + { + return CodecErr.CorruptFrame; + } + + res = ReceiveCompressedData(allocator, frameSize, ref dataStartCopy); + if (res != CodecErr.Ok) + { + return res; + } + + dataStart = dataStart.Slice((int)frameSize); + } + } + else + { + while (dataStart.Length != 0) + { + uint frameSize = (uint)dataStart.Length; + res = ReceiveCompressedData(allocator, frameSize, ref dataStart); + if (res != CodecErr.Ok) + { + return res; + } + + // Account for suboptimal termination by the encoder. + while (dataStart.Length != 0) + { + byte marker = Decoder.ReadMarker(dataStart); + if (marker != 0) + { + break; + } + + dataStart = dataStart.Slice(1); + } + } + } + + return res; + } + } + + internal static class Decoder + { + public static byte ReadMarker(ArrayPtr data) + { + return data[0]; + } + + public static CodecErr ParseSuperframeIndex(ArrayPtr data, ulong dataSz, ref Array8 sizes, out int count) + { + // A chunk ending with a byte matching 0xc0 is an invalid chunk unless + // it is a super frame index. If the last byte of real video compression + // data is 0xc0 the encoder must add a 0 byte. If we have the marker but + // not the associated matching marker byte at the front of the index we have + // an invalid bitstream and need to return an error. + + byte marker; + + Debug.Assert(dataSz != 0); + marker = ReadMarker(data.Slice((int)dataSz - 1)); + count = 0; + + if ((marker & 0xe0) == 0xc0) + { + uint frames = (uint)(marker & 0x7) + 1; + uint mag = (uint)((marker >> 3) & 0x3) + 1; + ulong indexSz = 2 + (mag * frames); + + // This chunk is marked as having a superframe index but doesn't have + // enough data for it, thus it's an invalid superframe index. + if (dataSz < indexSz) + { + return CodecErr.CorruptFrame; + } + + { + byte marker2 = ReadMarker(data.Slice((int)(dataSz - indexSz))); + + // This chunk is marked as having a superframe index but doesn't have + // the matching marker byte at the front of the index therefore it's an + // invalid chunk. + if (marker != marker2) + { + return CodecErr.CorruptFrame; + } + } + + { + // Found a valid superframe index. + ArrayPtr x = data.Slice((int)(dataSz - indexSz + 1)); + + for (int i = 0; i < frames; ++i) + { + uint thisSz = 0; + + for (int j = 0; j < mag; ++j) + { + thisSz |= (uint)x[0] << j * 8; + x = x.Slice(1); + } + + sizes[i] = thisSz; + } + + count = (int)frames; + } + } + + return CodecErr.Ok; + } + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/VpxCodecFrameBuffer.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/VpxCodecFrameBuffer.cs new file mode 100644 index 000000000..6883dfad9 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/VpxCodecFrameBuffer.cs @@ -0,0 +1,10 @@ +using Ryujinx.Common.Memory; + +namespace Ryujinx.Graphics.Nvdec.Vp9.Types +{ + internal struct VpxCodecFrameBuffer + { + public ArrayPtr Data; + public Ptr Priv; + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/VpxColorRange.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/VpxColorRange.cs new file mode 100644 index 000000000..4f32abb94 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/VpxColorRange.cs @@ -0,0 +1,11 @@ +namespace Ryujinx.Graphics.Nvdec.Vp9.Types +{ + internal enum VpxColorRange + { + // Y [16..235], UV [16..240] + Studio, + + // YUV/RGB [0..255] + Full + } +} diff --git a/src/Ryujinx.Graphics.Nvdec.Vp9/Types/VpxColorSpace.cs b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/VpxColorSpace.cs new file mode 100644 index 000000000..fa69c16a5 --- /dev/null +++ b/src/Ryujinx.Graphics.Nvdec.Vp9/Types/VpxColorSpace.cs @@ -0,0 +1,29 @@ +namespace Ryujinx.Graphics.Nvdec.Vp9.Types +{ + internal enum VpxColorSpace + { + // Unknown + Unknown, + + // BT.601 + Bt601, + + // BT.709 + Bt709, + + // SMPTE.170 + Smpte170, + + // SMPTE.240 + Smpte240, + + // BT.2020 + Bt2020, + + // Reserved + Reserved, + + // sRGB + Srgb + } +} diff --git a/src/Ryujinx.Graphics.Nvdec/Image/SurfaceWriter.cs b/src/Ryujinx.Graphics.Nvdec/Image/SurfaceWriter.cs index 043be1f2b..e9927c0f8 100644 --- a/src/Ryujinx.Graphics.Nvdec/Image/SurfaceWriter.cs +++ b/src/Ryujinx.Graphics.Nvdec/Image/SurfaceWriter.cs @@ -2,6 +2,7 @@ using Ryujinx.Common; using Ryujinx.Graphics.Device; using Ryujinx.Graphics.Texture; using Ryujinx.Graphics.Video; +using Ryujinx.Memory; using System; using System.Runtime.Intrinsics; using System.Runtime.Intrinsics.X86; @@ -16,7 +17,7 @@ namespace Ryujinx.Graphics.Nvdec.Image { int lumaSize = GetBlockLinearSize(surface.Width, surface.Height, 1); - using var luma = mm.GetWritableRegion(ExtendOffset(lumaOffset), lumaSize); + using WritableRegion luma = mm.GetWritableRegion(ExtendOffset(lumaOffset), lumaSize); WriteLuma( luma.Memory.Span, @@ -27,7 +28,7 @@ namespace Ryujinx.Graphics.Nvdec.Image int chromaSize = GetBlockLinearSize(surface.UvWidth, surface.UvHeight, 2); - using var chroma = mm.GetWritableRegion(ExtendOffset(chromaOffset), chromaSize); + using WritableRegion chroma = mm.GetWritableRegion(ExtendOffset(chromaOffset), chromaSize); WriteChroma( chroma.Memory.Span, @@ -48,8 +49,8 @@ namespace Ryujinx.Graphics.Nvdec.Image { int lumaSize = GetBlockLinearSize(surface.Width, surface.Height / 2, 1); - using var lumaTop = mm.GetWritableRegion(ExtendOffset(lumaTopOffset), lumaSize); - using var lumaBottom = mm.GetWritableRegion(ExtendOffset(lumaBottomOffset), lumaSize); + using WritableRegion lumaTop = mm.GetWritableRegion(ExtendOffset(lumaTopOffset), lumaSize); + using WritableRegion lumaBottom = mm.GetWritableRegion(ExtendOffset(lumaBottomOffset), lumaSize); WriteLuma( lumaTop.Memory.Span, @@ -67,8 +68,8 @@ namespace Ryujinx.Graphics.Nvdec.Image int chromaSize = GetBlockLinearSize(surface.UvWidth, surface.UvHeight / 2, 2); - using var chromaTop = mm.GetWritableRegion(ExtendOffset(chromaTopOffset), chromaSize); - using var chromaBottom = mm.GetWritableRegion(ExtendOffset(chromaBottomOffset), chromaSize); + using WritableRegion chromaTop = mm.GetWritableRegion(ExtendOffset(chromaTopOffset), chromaSize); + using WritableRegion chromaBottom = mm.GetWritableRegion(ExtendOffset(chromaBottomOffset), chromaSize); WriteChroma( chromaTop.Memory.Span, diff --git a/src/Ryujinx.Graphics.Nvdec/NvdecDevice.cs b/src/Ryujinx.Graphics.Nvdec/NvdecDevice.cs index 29e260d63..7a8fbf9b6 100644 --- a/src/Ryujinx.Graphics.Nvdec/NvdecDevice.cs +++ b/src/Ryujinx.Graphics.Nvdec/NvdecDevice.cs @@ -36,7 +36,7 @@ namespace Ryujinx.Graphics.Nvdec public void DestroyContext(long id) { - if (_contexts.TryRemove(id, out var context)) + if (_contexts.TryRemove(id, out NvdecDecoderContext context)) { context.Dispose(); } @@ -46,7 +46,7 @@ namespace Ryujinx.Graphics.Nvdec public void BindContext(long id) { - if (_contexts.TryGetValue(id, out var context)) + if (_contexts.TryGetValue(id, out NvdecDecoderContext context)) { _currentContext = context; } diff --git a/src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj b/src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj index 7a13b5d1b..d020ae50e 100644 --- a/src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj +++ b/src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj @@ -1,7 +1,6 @@  - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.Nvdec/Types/Vp9/PictureInfo.cs b/src/Ryujinx.Graphics.Nvdec/Types/Vp9/PictureInfo.cs index 24c18b94c..9da64bfab 100644 --- a/src/Ryujinx.Graphics.Nvdec/Types/Vp9/PictureInfo.cs +++ b/src/Ryujinx.Graphics.Nvdec/Types/Vp9/PictureInfo.cs @@ -59,6 +59,8 @@ namespace Ryujinx.Graphics.Nvdec.Types.Vp9 Flags.HasFlag(FrameFlags.LastShowFrame) && !Flags.HasFlag(FrameFlags.LastFrameIsKeyFrame), RefFrameSignBias = RefFrameSignBias, + LoopFilterLevel = FirstLevel, + LoopFilterSharpnessLevel = SharpnessLevel, BaseQIndex = BaseQIndex, YDcDeltaQ = YDcDeltaQ, UvDcDeltaQ = UvDcDeltaQ, diff --git a/src/Ryujinx.Graphics.Nvdec/Vp9Decoder.cs b/src/Ryujinx.Graphics.Nvdec/Vp9Decoder.cs index 5ed508647..6c294adf6 100644 --- a/src/Ryujinx.Graphics.Nvdec/Vp9Decoder.cs +++ b/src/Ryujinx.Graphics.Nvdec/Vp9Decoder.cs @@ -4,6 +4,7 @@ using Ryujinx.Graphics.Nvdec.Image; using Ryujinx.Graphics.Nvdec.Types.Vp9; using Ryujinx.Graphics.Nvdec.Vp9; using Ryujinx.Graphics.Video; +using Ryujinx.Memory; using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -50,7 +51,7 @@ namespace Ryujinx.Graphics.Nvdec int miCols = BitUtils.DivRoundUp(pictureInfo.CurrentFrameSize.Width, 8); int miRows = BitUtils.DivRoundUp(pictureInfo.CurrentFrameSize.Height, 8); - using var mvsRegion = rm.MemoryManager.GetWritableRegion(ExtendOffset(state.Vp9SetColMvWriteBufOffset), miRows * miCols * 16); + using WritableRegion mvsRegion = rm.MemoryManager.GetWritableRegion(ExtendOffset(state.Vp9SetColMvWriteBufOffset), miRows * miCols * 16); Span mvsOut = MemoryMarshal.Cast(mvsRegion.Memory.Span); @@ -80,9 +81,9 @@ namespace Ryujinx.Graphics.Nvdec private static void WriteBackwardUpdates(DeviceMemoryManager mm, uint offset, ref Vp9BackwardUpdates counts) { - using var backwardUpdatesRegion = mm.GetWritableRegion(ExtendOffset(offset), Unsafe.SizeOf()); + using WritableRegion backwardUpdatesRegion = mm.GetWritableRegion(ExtendOffset(offset), Unsafe.SizeOf()); - ref var backwardUpdates = ref MemoryMarshal.Cast(backwardUpdatesRegion.Memory.Span)[0]; + ref BackwardUpdates backwardUpdates = ref MemoryMarshal.Cast(backwardUpdatesRegion.Memory.Span)[0]; backwardUpdates = new BackwardUpdates(ref counts); } diff --git a/src/Ryujinx.Graphics.OpenGL/Debugger.cs b/src/Ryujinx.Graphics.OpenGL/Debugger.cs index c700b3b7c..8a94bcc87 100644 --- a/src/Ryujinx.Graphics.OpenGL/Debugger.cs +++ b/src/Ryujinx.Graphics.OpenGL/Debugger.cs @@ -84,6 +84,7 @@ namespace Ryujinx.Graphics.OpenGL { Logger.Debug?.Print(LogClass.Gpu, $"{type} {severity}: {msg}", "GLDEBUG"); } + break; } } diff --git a/src/Ryujinx.Graphics.OpenGL/Effects/AreaScalingFilter.cs b/src/Ryujinx.Graphics.OpenGL/Effects/AreaScalingFilter.cs index 9b19f2f26..c95463e37 100644 --- a/src/Ryujinx.Graphics.OpenGL/Effects/AreaScalingFilter.cs +++ b/src/Ryujinx.Graphics.OpenGL/Effects/AreaScalingFilter.cs @@ -2,7 +2,6 @@ using OpenTK.Graphics.OpenGL; using Ryujinx.Common; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.OpenGL.Image; -using System; using static Ryujinx.Graphics.OpenGL.Effects.ShaderHelper; namespace Ryujinx.Graphics.OpenGL.Effects @@ -41,7 +40,7 @@ namespace Ryujinx.Graphics.OpenGL.Effects private void Initialize() { - var scalingShader = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/area_scaling.glsl"); + string scalingShader = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/area_scaling.glsl"); _scalingShaderProgram = CompileProgram(scalingShader, ShaderType.ComputeShader); diff --git a/src/Ryujinx.Graphics.OpenGL/Effects/FsrScalingFilter.cs b/src/Ryujinx.Graphics.OpenGL/Effects/FsrScalingFilter.cs index 0522e28e0..0bc9d6f45 100644 --- a/src/Ryujinx.Graphics.OpenGL/Effects/FsrScalingFilter.cs +++ b/src/Ryujinx.Graphics.OpenGL/Effects/FsrScalingFilter.cs @@ -57,10 +57,10 @@ namespace Ryujinx.Graphics.OpenGL.Effects private void Initialize() { - var scalingShader = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/fsr_scaling.glsl"); - var sharpeningShader = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/fsr_sharpening.glsl"); - var fsrA = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/ffx_a.h"); - var fsr1 = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/ffx_fsr1.h"); + string scalingShader = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/fsr_scaling.glsl"); + string sharpeningShader = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/fsr_sharpening.glsl"); + string fsrA = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/ffx_a.h"); + string fsr1 = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/ffx_fsr1.h"); scalingShader = scalingShader.Replace("#include \"ffx_a.h\"", fsrA); scalingShader = scalingShader.Replace("#include \"ffx_fsr1.h\"", fsr1); @@ -97,8 +97,8 @@ namespace Ryujinx.Graphics.OpenGL.Effects if (_intermediaryTexture == null || _intermediaryTexture.Info.Width != width || _intermediaryTexture.Info.Height != height) { _intermediaryTexture?.Dispose(); - var originalInfo = view.Info; - var info = new TextureCreateInfo(width, + TextureCreateInfo originalInfo = view.Info; + TextureCreateInfo info = new(width, height, originalInfo.Depth, originalInfo.Levels, @@ -118,7 +118,7 @@ namespace Ryujinx.Graphics.OpenGL.Effects _intermediaryTexture.CreateDefaultView(); } - var textureView = _intermediaryTexture.CreateView(_intermediaryTexture.Info, 0, 0) as TextureView; + TextureView textureView = _intermediaryTexture.CreateView(_intermediaryTexture.Info, 0, 0) as TextureView; int previousProgram = GL.GetInteger(GetPName.CurrentProgram); int previousUnit = GL.GetInteger(GetPName.ActiveTexture); diff --git a/src/Ryujinx.Graphics.OpenGL/Effects/FxaaPostProcessingEffect.cs b/src/Ryujinx.Graphics.OpenGL/Effects/FxaaPostProcessingEffect.cs index 4e92efe6d..26be5b3ae 100644 --- a/src/Ryujinx.Graphics.OpenGL/Effects/FxaaPostProcessingEffect.cs +++ b/src/Ryujinx.Graphics.OpenGL/Effects/FxaaPostProcessingEffect.cs @@ -47,7 +47,7 @@ namespace Ryujinx.Graphics.OpenGL.Effects _textureStorage.CreateDefaultView(); } - var textureView = _textureStorage.CreateView(view.Info, 0, 0) as TextureView; + TextureView textureView = _textureStorage.CreateView(view.Info, 0, 0) as TextureView; int previousProgram = GL.GetInteger(GetPName.CurrentProgram); int previousUnit = GL.GetInteger(GetPName.ActiveTexture); @@ -57,8 +57,8 @@ namespace Ryujinx.Graphics.OpenGL.Effects GL.BindImageTexture(0, textureView.Handle, 0, false, 0, TextureAccess.ReadWrite, SizedInternalFormat.Rgba8); GL.UseProgram(_shaderProgram); - var dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize); - var dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize); + int dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize); + int dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize); view.Bind(0); GL.Uniform1(_inputUniform, 0); diff --git a/src/Ryujinx.Graphics.OpenGL/Effects/ShaderHelper.cs b/src/Ryujinx.Graphics.OpenGL/Effects/ShaderHelper.cs index 637b2fba8..ad0ccd23b 100644 --- a/src/Ryujinx.Graphics.OpenGL/Effects/ShaderHelper.cs +++ b/src/Ryujinx.Graphics.OpenGL/Effects/ShaderHelper.cs @@ -7,12 +7,12 @@ namespace Ryujinx.Graphics.OpenGL.Effects { public static int CompileProgram(string shaderCode, ShaderType shaderType) { - return CompileProgram(new string[] { shaderCode }, shaderType); + return CompileProgram([shaderCode], shaderType); } public static int CompileProgram(string[] shaders, ShaderType shaderType) { - var shader = GL.CreateShader(shaderType); + int shader = GL.CreateShader(shaderType); GL.ShaderSource(shader, shaders.Length, shaders, (int[])null); GL.CompileShader(shader); @@ -25,7 +25,7 @@ namespace Ryujinx.Graphics.OpenGL.Effects return 0; } - var program = GL.CreateProgram(); + int program = GL.CreateProgram(); GL.AttachShader(program, shader); GL.LinkProgram(program); diff --git a/src/Ryujinx.Graphics.OpenGL/Effects/SmaaPostProcessingEffect.cs b/src/Ryujinx.Graphics.OpenGL/Effects/SmaaPostProcessingEffect.cs index a6c5e4aca..27120a015 100644 --- a/src/Ryujinx.Graphics.OpenGL/Effects/SmaaPostProcessingEffect.cs +++ b/src/Ryujinx.Graphics.OpenGL/Effects/SmaaPostProcessingEffect.cs @@ -1,5 +1,6 @@ using OpenTK.Graphics.OpenGL; using Ryujinx.Common; +using Ryujinx.Common.Memory; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.OpenGL.Image; using System; @@ -43,11 +44,11 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa { _renderer = renderer; - _edgeShaderPrograms = Array.Empty(); - _blendShaderPrograms = Array.Empty(); - _neighbourShaderPrograms = Array.Empty(); + _edgeShaderPrograms = []; + _blendShaderPrograms = []; + _neighbourShaderPrograms = []; - _qualities = new string[] { "SMAA_PRESET_LOW", "SMAA_PRESET_MEDIUM", "SMAA_PRESET_HIGH", "SMAA_PRESET_ULTRA" }; + _qualities = ["SMAA_PRESET_LOW", "SMAA_PRESET_MEDIUM", "SMAA_PRESET_HIGH", "SMAA_PRESET_ULTRA"]; Quality = quality; @@ -78,7 +79,7 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa private unsafe void RecreateShaders(int width, int height) { string baseShader = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/smaa.hlsl"); - var pixelSizeDefine = $"#define SMAA_RT_METRICS float4(1.0 / {width}.0, 1.0 / {height}.0, {width}, {height}) \n"; + string pixelSizeDefine = $"#define SMAA_RT_METRICS float4(1.0 / {width}.0, 1.0 / {height}.0, {width}, {height}) \n"; _edgeShaderPrograms = new int[_qualities.Length]; _blendShaderPrograms = new int[_qualities.Length]; @@ -86,20 +87,20 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa for (int i = 0; i < +_edgeShaderPrograms.Length; i++) { - var presets = $"#version 430 core \n#define {_qualities[i]} 1 \n{pixelSizeDefine}#define SMAA_GLSL_4 1 \nlayout (local_size_x = 16, local_size_y = 16) in;\n{baseShader}"; + string presets = $"#version 430 core \n#define {_qualities[i]} 1 \n{pixelSizeDefine}#define SMAA_GLSL_4 1 \nlayout (local_size_x = 16, local_size_y = 16) in;\n{baseShader}"; - var edgeShaderData = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/smaa_edge.glsl"); - var blendShaderData = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/smaa_blend.glsl"); - var neighbourShaderData = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/smaa_neighbour.glsl"); + string edgeShaderData = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/smaa_edge.glsl"); + string blendShaderData = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/smaa_blend.glsl"); + string neighbourShaderData = EmbeddedResources.ReadAllText("Ryujinx.Graphics.OpenGL/Effects/Shaders/smaa_neighbour.glsl"); - var shaders = new string[] { presets, edgeShaderData }; - var edgeProgram = ShaderHelper.CompileProgram(shaders, ShaderType.ComputeShader); + string[] shaders = [presets, edgeShaderData]; + int edgeProgram = ShaderHelper.CompileProgram(shaders, ShaderType.ComputeShader); shaders[1] = blendShaderData; - var blendProgram = ShaderHelper.CompileProgram(shaders, ShaderType.ComputeShader); + int blendProgram = ShaderHelper.CompileProgram(shaders, ShaderType.ComputeShader); shaders[1] = neighbourShaderData; - var neighbourProgram = ShaderHelper.CompileProgram(shaders, ShaderType.ComputeShader); + int neighbourProgram = ShaderHelper.CompileProgram(shaders, ShaderType.ComputeShader); _edgeShaderPrograms[i] = edgeProgram; _blendShaderPrograms[i] = blendProgram; @@ -116,7 +117,7 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa private void Initialize() { - var areaInfo = new TextureCreateInfo(AreaWidth, + TextureCreateInfo areaInfo = new(AreaWidth, AreaHeight, 1, 1, @@ -132,7 +133,7 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa SwizzleComponent.Blue, SwizzleComponent.Alpha); - var searchInfo = new TextureCreateInfo(SearchWidth, + TextureCreateInfo searchInfo = new(SearchWidth, SearchHeight, 1, 1, @@ -151,11 +152,11 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa _areaTexture = new TextureStorage(_renderer, areaInfo); _searchTexture = new TextureStorage(_renderer, searchInfo); - var areaTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.OpenGL/Effects/Textures/SmaaAreaTexture.bin"); - var searchTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.OpenGL/Effects/Textures/SmaaSearchTexture.bin"); + MemoryOwner areaTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.OpenGL/Effects/Textures/SmaaAreaTexture.bin"); + MemoryOwner searchTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.OpenGL/Effects/Textures/SmaaSearchTexture.bin"); - var areaView = _areaTexture.CreateDefaultView(); - var searchView = _searchTexture.CreateDefaultView(); + ITexture areaView = _areaTexture.CreateDefaultView(); + ITexture searchView = _searchTexture.CreateDefaultView(); areaView.SetData(areaTexture); searchView.SetData(searchTexture); @@ -178,13 +179,13 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa RecreateShaders(view.Width, view.Height); } - var textureView = _outputTexture.CreateView(view.Info, 0, 0) as TextureView; - var edgeOutput = _edgeOutputTexture.DefaultView as TextureView; - var blendOutput = _blendOutputTexture.DefaultView as TextureView; - var areaTexture = _areaTexture.DefaultView as TextureView; - var searchTexture = _searchTexture.DefaultView as TextureView; + TextureView textureView = _outputTexture.CreateView(view.Info, 0, 0) as TextureView; + TextureView edgeOutput = _edgeOutputTexture.DefaultView as TextureView; + TextureView blendOutput = _blendOutputTexture.DefaultView as TextureView; + TextureView areaTexture = _areaTexture.DefaultView as TextureView; + TextureView searchTexture = _searchTexture.DefaultView as TextureView; - var previousFramebuffer = GL.GetInteger(GetPName.FramebufferBinding); + int previousFramebuffer = GL.GetInteger(GetPName.FramebufferBinding); int previousUnit = GL.GetInteger(GetPName.ActiveTexture); GL.ActiveTexture(TextureUnit.Texture0); int previousTextureBinding0 = GL.GetInteger(GetPName.TextureBinding2D); @@ -193,7 +194,7 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa GL.ActiveTexture(TextureUnit.Texture2); int previousTextureBinding2 = GL.GetInteger(GetPName.TextureBinding2D); - var framebuffer = new Framebuffer(); + Framebuffer framebuffer = new(); framebuffer.Bind(); framebuffer.AttachColor(0, edgeOutput); GL.Clear(ClearBufferMask.ColorBufferBit); @@ -206,8 +207,8 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa framebuffer.Dispose(); - var dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize); - var dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize); + int dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize); + int dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize); int previousProgram = GL.GetInteger(GetPName.CurrentProgram); GL.BindImageTexture(0, edgeOutput.Handle, 0, false, 0, TextureAccess.ReadWrite, SizedInternalFormat.Rgba8); diff --git a/src/Ryujinx.Graphics.OpenGL/FormatTable.cs b/src/Ryujinx.Graphics.OpenGL/FormatTable.cs index 4cf4dc760..bca79cb97 100644 --- a/src/Ryujinx.Graphics.OpenGL/FormatTable.cs +++ b/src/Ryujinx.Graphics.OpenGL/FormatTable.cs @@ -228,14 +228,14 @@ namespace Ryujinx.Graphics.OpenGL public static bool IsPackedDepthStencil(Format format) { - return format == Format.D24UnormS8Uint || - format == Format.D32FloatS8Uint || - format == Format.S8UintD24Unorm; + return format is Format.D24UnormS8Uint or + Format.D32FloatS8Uint or + Format.S8UintD24Unorm; } public static bool IsDepthOnly(Format format) { - return format == Format.D16Unorm || format == Format.D32Float || format == Format.X8UintD24Unorm; + return format is Format.D16Unorm or Format.D32Float or Format.X8UintD24Unorm; } } } diff --git a/src/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs b/src/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs index b722bbf04..d7ca560a1 100644 --- a/src/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs +++ b/src/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs @@ -1,4 +1,3 @@ -using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; diff --git a/src/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs b/src/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs index 7072bbd9f..54516c81e 100644 --- a/src/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs +++ b/src/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs @@ -1,4 +1,3 @@ -using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; diff --git a/src/Ryujinx.Graphics.OpenGL/HwCapabilities.cs b/src/Ryujinx.Graphics.OpenGL/HwCapabilities.cs index cf0b0645c..71186807e 100644 --- a/src/Ryujinx.Graphics.OpenGL/HwCapabilities.cs +++ b/src/Ryujinx.Graphics.OpenGL/HwCapabilities.cs @@ -43,13 +43,13 @@ namespace Ryujinx.Graphics.OpenGL private static readonly Lazy _gpuVendor = new(GetGpuVendor); - private static bool IsIntel => _gpuVendor.Value == GpuVendor.IntelWindows || _gpuVendor.Value == GpuVendor.IntelUnix; + private static bool IsIntel => _gpuVendor.Value is GpuVendor.IntelWindows or GpuVendor.IntelUnix; public static GpuVendor Vendor => _gpuVendor.Value; private static readonly Lazy _maxSupportedAnisotropy = new(GL.GetFloat((GetPName)All.MaxTextureMaxAnisotropy)); - public static bool UsePersistentBufferForFlush => _gpuVendor.Value == GpuVendor.AmdWindows || _gpuVendor.Value == GpuVendor.Nvidia; + public static bool UsePersistentBufferForFlush => _gpuVendor.Value is GpuVendor.AmdWindows or GpuVendor.Nvidia; public static bool SupportsAlphaToCoverageDitherControl => _supportsAlphaToCoverageDitherControl.Value; public static bool SupportsAstcCompression => _supportsAstcCompression.Value; @@ -73,7 +73,7 @@ namespace Ryujinx.Graphics.OpenGL public static bool SupportsTextureShadowLod => _supportsTextureShadowLod.Value; public static bool SupportsViewportSwizzle => _supportsViewportSwizzle.Value; - public static bool SupportsMismatchingViewFormat => _gpuVendor.Value != GpuVendor.AmdWindows && _gpuVendor.Value != GpuVendor.IntelWindows; + public static bool SupportsMismatchingViewFormat => _gpuVendor.Value is not GpuVendor.AmdWindows and not GpuVendor.IntelWindows; public static bool SupportsNonConstantTextureOffset => _gpuVendor.Value == GpuVendor.Nvidia; public static bool RequiresSyncFlush => _gpuVendor.Value == GpuVendor.AmdWindows || IsIntel; @@ -117,11 +117,11 @@ namespace Ryujinx.Graphics.OpenGL return renderer.Contains("mesa") ? GpuVendor.IntelUnix : GpuVendor.IntelWindows; } - else if (vendor == "ati technologies inc." || vendor == "advanced micro devices, inc.") + else if (vendor is "ati technologies inc." or "advanced micro devices, inc.") { return GpuVendor.AmdWindows; } - else if (vendor == "amd" || vendor == "x.org") + else if (vendor is "amd" or "x.org") { return GpuVendor.AmdUnix; } diff --git a/src/Ryujinx.Graphics.OpenGL/IOpenGLContext.cs b/src/Ryujinx.Graphics.OpenGL/IOpenGLContext.cs index 525418d74..5443465ea 100644 --- a/src/Ryujinx.Graphics.OpenGL/IOpenGLContext.cs +++ b/src/Ryujinx.Graphics.OpenGL/IOpenGLContext.cs @@ -1,4 +1,3 @@ -using Ryujinx.Graphics.OpenGL.Helper; using System; namespace Ryujinx.Graphics.OpenGL diff --git a/src/Ryujinx.Graphics.OpenGL/Image/FormatConverter.cs b/src/Ryujinx.Graphics.OpenGL/Image/FormatConverter.cs index 490c0c585..64e4fe36d 100644 --- a/src/Ryujinx.Graphics.OpenGL/Image/FormatConverter.cs +++ b/src/Ryujinx.Graphics.OpenGL/Image/FormatConverter.cs @@ -19,7 +19,7 @@ namespace Ryujinx.Graphics.OpenGL.Image if (Avx2.IsSupported) { - var mask = Vector256.Create( + Vector256 mask = Vector256.Create( (byte)3, (byte)0, (byte)1, (byte)2, (byte)7, (byte)4, (byte)5, (byte)6, (byte)11, (byte)8, (byte)9, (byte)10, @@ -35,7 +35,7 @@ namespace Ryujinx.Graphics.OpenGL.Image { for (uint i = 0; i < sizeAligned; i += 32) { - var dataVec = Avx.LoadVector256(pInput + i); + Vector256 dataVec = Avx.LoadVector256(pInput + i); dataVec = Avx2.Shuffle(dataVec, mask); @@ -47,7 +47,7 @@ namespace Ryujinx.Graphics.OpenGL.Image } else if (Ssse3.IsSupported) { - var mask = Vector128.Create( + Vector128 mask = Vector128.Create( (byte)3, (byte)0, (byte)1, (byte)2, (byte)7, (byte)4, (byte)5, (byte)6, (byte)11, (byte)8, (byte)9, (byte)10, @@ -59,7 +59,7 @@ namespace Ryujinx.Graphics.OpenGL.Image { for (uint i = 0; i < sizeAligned; i += 16) { - var dataVec = Sse2.LoadVector128(pInput + i); + Vector128 dataVec = Sse2.LoadVector128(pInput + i); dataVec = Ssse3.Shuffle(dataVec, mask); @@ -70,8 +70,8 @@ namespace Ryujinx.Graphics.OpenGL.Image start = sizeAligned; } - var outSpan = MemoryMarshal.Cast(output); - var dataSpan = MemoryMarshal.Cast(data); + Span outSpan = MemoryMarshal.Cast(output); + ReadOnlySpan dataSpan = MemoryMarshal.Cast(data); for (int i = start / sizeof(uint); i < dataSpan.Length; i++) { outSpan[i] = BitOperations.RotateLeft(dataSpan[i], 8); @@ -88,7 +88,7 @@ namespace Ryujinx.Graphics.OpenGL.Image if (Avx2.IsSupported) { - var mask = Vector256.Create( + Vector256 mask = Vector256.Create( (byte)1, (byte)2, (byte)3, (byte)0, (byte)5, (byte)6, (byte)7, (byte)4, (byte)9, (byte)10, (byte)11, (byte)8, @@ -104,7 +104,7 @@ namespace Ryujinx.Graphics.OpenGL.Image { for (uint i = 0; i < sizeAligned; i += 32) { - var dataVec = Avx.LoadVector256(pInput + i); + Vector256 dataVec = Avx.LoadVector256(pInput + i); dataVec = Avx2.Shuffle(dataVec, mask); @@ -116,7 +116,7 @@ namespace Ryujinx.Graphics.OpenGL.Image } else if (Ssse3.IsSupported) { - var mask = Vector128.Create( + Vector128 mask = Vector128.Create( (byte)1, (byte)2, (byte)3, (byte)0, (byte)5, (byte)6, (byte)7, (byte)4, (byte)9, (byte)10, (byte)11, (byte)8, @@ -128,7 +128,7 @@ namespace Ryujinx.Graphics.OpenGL.Image { for (uint i = 0; i < sizeAligned; i += 16) { - var dataVec = Sse2.LoadVector128(pInput + i); + Vector128 dataVec = Sse2.LoadVector128(pInput + i); dataVec = Ssse3.Shuffle(dataVec, mask); @@ -139,8 +139,8 @@ namespace Ryujinx.Graphics.OpenGL.Image start = sizeAligned; } - var outSpan = MemoryMarshal.Cast(output); - var dataSpan = MemoryMarshal.Cast(data); + Span outSpan = MemoryMarshal.Cast(output); + ReadOnlySpan dataSpan = MemoryMarshal.Cast(data); for (int i = start / sizeof(uint); i < dataSpan.Length; i++) { outSpan[i] = BitOperations.RotateRight(dataSpan[i], 8); diff --git a/src/Ryujinx.Graphics.OpenGL/Image/IntermmediatePool.cs b/src/Ryujinx.Graphics.OpenGL/Image/IntermmediatePool.cs index 64ee73fbe..1bcc13ab4 100644 --- a/src/Ryujinx.Graphics.OpenGL/Image/IntermmediatePool.cs +++ b/src/Ryujinx.Graphics.OpenGL/Image/IntermmediatePool.cs @@ -12,7 +12,7 @@ namespace Ryujinx.Graphics.OpenGL.Image public IntermediatePool(OpenGLRenderer renderer) { _renderer = renderer; - _entries = new List(); + _entries = []; } public TextureView GetOrCreateWithAtLeast( diff --git a/src/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs b/src/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs index 8e728a2bb..231d9c97b 100644 --- a/src/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs +++ b/src/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs @@ -57,7 +57,7 @@ namespace Ryujinx.Graphics.OpenGL.Image /// public void SetData(MemoryOwner data) { - var dataSpan = data.Span; + Span dataSpan = data.Span; Buffer.SetData(_buffer, _bufferOffset, dataSpan[..Math.Min(dataSpan.Length, _bufferSize)]); diff --git a/src/Ryujinx.Graphics.OpenGL/Image/TextureCopy.cs b/src/Ryujinx.Graphics.OpenGL/Image/TextureCopy.cs index e08da7013..3d1e47339 100644 --- a/src/Ryujinx.Graphics.OpenGL/Image/TextureCopy.cs +++ b/src/Ryujinx.Graphics.OpenGL/Image/TextureCopy.cs @@ -290,7 +290,7 @@ namespace Ryujinx.Graphics.OpenGL.Image private static FramebufferAttachment AttachmentForFormat(Format format) { - if (format == Format.D24UnormS8Uint || format == Format.D32FloatS8Uint) + if (format is Format.D24UnormS8Uint or Format.D32FloatS8Uint) { return FramebufferAttachment.DepthStencilAttachment; } diff --git a/src/Ryujinx.Graphics.OpenGL/Image/TextureCopyIncompatible.cs b/src/Ryujinx.Graphics.OpenGL/Image/TextureCopyIncompatible.cs index 082e6ccf8..648ba1bc2 100644 --- a/src/Ryujinx.Graphics.OpenGL/Image/TextureCopyIncompatible.cs +++ b/src/Ryujinx.Graphics.OpenGL/Image/TextureCopyIncompatible.cs @@ -91,8 +91,8 @@ void main() int srcComponentsCount = srcBpp / componentSize; int dstComponentsCount = dstBpp / componentSize; - var srcFormat = GetFormat(componentSize, srcComponentsCount); - var dstFormat = GetFormat(componentSize, dstComponentsCount); + SizedInternalFormat srcFormat = GetFormat(componentSize, srcComponentsCount); + SizedInternalFormat dstFormat = GetFormat(componentSize, dstComponentsCount); GL.UseProgram(srcBpp < dstBpp ? GetWideningShader(componentSize, srcComponentsCount, dstComponentsCount) @@ -190,7 +190,8 @@ void main() { int csHandle = GL.CreateShader(ShaderType.ComputeShader); - string[] formatTable = new[] { "r8ui", "r16ui", "r32ui", "rg8ui", "rg16ui", "rg32ui", "rgba8ui", "rgba16ui", "rgba32ui" }; + string[] formatTable = ["r8ui", "r16ui", "r32ui", "rg8ui", "rg16ui", "rg32ui", "rgba8ui", "rgba16ui", "rgba32ui" + ]; string srcFormat = formatTable[srcIndex]; string dstFormat = formatTable[dstIndex]; diff --git a/src/Ryujinx.Graphics.OpenGL/Image/TextureView.cs b/src/Ryujinx.Graphics.OpenGL/Image/TextureView.cs index a89dd5131..fcd004dd6 100644 --- a/src/Ryujinx.Graphics.OpenGL/Image/TextureView.cs +++ b/src/Ryujinx.Graphics.OpenGL/Image/TextureView.cs @@ -67,13 +67,13 @@ namespace Ryujinx.Graphics.OpenGL.Image GL.BindTexture(target, Handle); - int[] swizzleRgba = new int[] - { + int[] swizzleRgba = + [ (int)Info.SwizzleR.Convert(), (int)Info.SwizzleG.Convert(), (int)Info.SwizzleB.Convert(), - (int)Info.SwizzleA.Convert(), - }; + (int)Info.SwizzleA.Convert() + ]; if (Info.Format == Format.A1B5G5R5Unorm) { @@ -358,7 +358,7 @@ namespace Ryujinx.Graphics.OpenGL.Image PixelFormat pixelFormat = format.PixelFormat; PixelType pixelType = format.PixelType; - if (target == TextureTarget.TextureCubeMap || target == TextureTarget.TextureCubeMapArray) + if (target is TextureTarget.TextureCubeMap or TextureTarget.TextureCubeMapArray) { target = TextureTarget.TextureCubeMapPositiveX + (layer % 6); } @@ -454,7 +454,7 @@ namespace Ryujinx.Graphics.OpenGL.Image { unsafe { - var dataSpan = data.Span; + Span dataSpan = data.Span; fixed (byte* ptr = dataSpan) { ReadFrom((nint)ptr, dataSpan.Length); @@ -568,6 +568,7 @@ namespace Ryujinx.Graphics.OpenGL.Image format.PixelType, data); } + break; case Target.Texture1DArray: @@ -597,6 +598,7 @@ namespace Ryujinx.Graphics.OpenGL.Image format.PixelType, data); } + break; case Target.Texture2D: @@ -626,6 +628,7 @@ namespace Ryujinx.Graphics.OpenGL.Image format.PixelType, data); } + break; case Target.Texture2DArray: @@ -661,6 +664,7 @@ namespace Ryujinx.Graphics.OpenGL.Image format.PixelType, data); } + break; case Target.Cubemap: @@ -690,6 +694,7 @@ namespace Ryujinx.Graphics.OpenGL.Image format.PixelType, data); } + break; } } @@ -756,6 +761,7 @@ namespace Ryujinx.Graphics.OpenGL.Image format.PixelType, data); } + break; case Target.Texture1DArray: @@ -786,6 +792,7 @@ namespace Ryujinx.Graphics.OpenGL.Image format.PixelType, data); } + break; case Target.Texture2DArray: @@ -821,6 +828,7 @@ namespace Ryujinx.Graphics.OpenGL.Image format.PixelType, data); } + break; case Target.Cubemap: @@ -855,6 +863,7 @@ namespace Ryujinx.Graphics.OpenGL.Image data + faceOffset); } } + break; } diff --git a/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs b/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs index 6ead314fd..af1494bbe 100644 --- a/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs +++ b/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs @@ -6,6 +6,7 @@ using Ryujinx.Graphics.OpenGL.Image; using Ryujinx.Graphics.OpenGL.Queries; using Ryujinx.Graphics.Shader.Translation; using System; +using BufferAccess = Ryujinx.Graphics.GAL.BufferAccess; namespace Ryujinx.Graphics.OpenGL { @@ -63,7 +64,7 @@ namespace Ryujinx.Graphics.OpenGL { BufferCount++; - var memType = access & GAL.BufferAccess.MemoryTypeMask; + BufferAccess memType = access & GAL.BufferAccess.MemoryTypeMask; if (memType == GAL.BufferAccess.HostMemory) { diff --git a/src/Ryujinx.Graphics.OpenGL/Pipeline.cs b/src/Ryujinx.Graphics.OpenGL/Pipeline.cs index 096e2e5eb..36db655ad 100644 --- a/src/Ryujinx.Graphics.OpenGL/Pipeline.cs +++ b/src/Ryujinx.Graphics.OpenGL/Pipeline.cs @@ -35,8 +35,8 @@ namespace Ryujinx.Graphics.OpenGL private bool _stencilTestEnable; private bool _cullEnable; - private float[] _viewportArray = Array.Empty(); - private double[] _depthRangeArray = Array.Empty(); + private float[] _viewportArray = []; + private double[] _depthRangeArray = []; private int _boundDrawFramebuffer; private int _boundReadFramebuffer; @@ -111,7 +111,7 @@ namespace Ryujinx.Graphics.OpenGL (componentMask & 4) != 0, (componentMask & 8) != 0); - float[] colors = new float[] { color.Red, color.Green, color.Blue, color.Alpha }; + float[] colors = [color.Red, color.Green, color.Blue, color.Alpha]; if (layer != 0 || layerCount != _framebuffer.GetColorLayerCount(index)) { @@ -1205,7 +1205,7 @@ namespace Ryujinx.Graphics.OpenGL { int vIndex = index * 4; - var region = regions[index]; + Rectangle region = regions[index]; bool enabled = (region.X | region.Y) != 0 || region.Width != 0xffff || region.Height != 0xffff; uint mask = 1u << index; diff --git a/src/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs b/src/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs index a5acd8dce..f39829923 100644 --- a/src/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs +++ b/src/Ryujinx.Graphics.OpenGL/Queries/BufferedQuery.cs @@ -31,6 +31,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries long defaultValue = DefaultValue; GL.BufferStorage(BufferTarget.QueryBuffer, sizeof(long), (nint)(&defaultValue), BufferStorageFlags.MapReadBit | BufferStorageFlags.MapWriteBit | BufferStorageFlags.MapPersistentBit); } + _bufferMap = GL.MapBufferRange(BufferTarget.QueryBuffer, nint.Zero, sizeof(long), BufferAccessMask.MapReadBit | BufferAccessMask.MapWriteBit | BufferAccessMask.MapPersistentBit); } diff --git a/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs b/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs index 345a99ffa..0249440b4 100644 --- a/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs +++ b/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueue.cs @@ -19,7 +19,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries private ulong _accumulatedCounter; private int _waiterCount; - private readonly object _lock = new(); + private readonly Lock _lock = new(); private readonly Queue _queryPool; private readonly AutoResetEvent _queuedEvent = new(false); @@ -42,7 +42,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries _current = new CounterQueueEvent(this, glType, 0); - _consumerThread = new Thread(EventConsumer); + _consumerThread = new Thread(EventConsumer) { Name = "CPU.CounterQueue." + (int)type }; _consumerThread.Start(); } @@ -172,6 +172,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries { return; // If not blocking, then return when we encounter an event that is not ready yet. } + _events.Dequeue(); } } diff --git a/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs b/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs index 32b75c615..889517480 100644 --- a/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs +++ b/src/Ryujinx.Graphics.OpenGL/Queries/CounterQueueEvent.cs @@ -24,7 +24,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries private bool _hostAccessReserved = false; private int _refCount = 1; // Starts with a reference from the counter queue. - private readonly object _lock = new(); + private readonly Lock _lock = new(); private ulong _result = ulong.MaxValue; private double _divisor = 1f; diff --git a/src/Ryujinx.Graphics.OpenGL/Queries/Counters.cs b/src/Ryujinx.Graphics.OpenGL/Queries/Counters.cs index 1530c9d26..436f03756 100644 --- a/src/Ryujinx.Graphics.OpenGL/Queries/Counters.cs +++ b/src/Ryujinx.Graphics.OpenGL/Queries/Counters.cs @@ -35,7 +35,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries public void Update() { - foreach (var queue in _counterQueues) + foreach (CounterQueue queue in _counterQueues) { queue.Flush(false); } @@ -48,7 +48,7 @@ namespace Ryujinx.Graphics.OpenGL.Queries public void Dispose() { - foreach (var queue in _counterQueues) + foreach (CounterQueue queue in _counterQueues) { queue.Dispose(); } diff --git a/src/Ryujinx.Graphics.OpenGL/ResourcePool.cs b/src/Ryujinx.Graphics.OpenGL/ResourcePool.cs index 6385f57b5..ef6571fb9 100644 --- a/src/Ryujinx.Graphics.OpenGL/ResourcePool.cs +++ b/src/Ryujinx.Graphics.OpenGL/ResourcePool.cs @@ -2,6 +2,7 @@ using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.OpenGL.Image; using System; using System.Collections.Generic; +using System.Threading; namespace Ryujinx.Graphics.OpenGL { @@ -19,7 +20,7 @@ namespace Ryujinx.Graphics.OpenGL { private const int DisposedLiveFrames = 2; - private readonly object _lock = new(); + private readonly Lock _lock = new(); private readonly Dictionary> _textures = new(); /// @@ -33,7 +34,7 @@ namespace Ryujinx.Graphics.OpenGL { if (!_textures.TryGetValue(view.Info, out List list)) { - list = new List(); + list = []; _textures.Add(view.Info, list); } @@ -107,6 +108,7 @@ namespace Ryujinx.Graphics.OpenGL texture.View.Dispose(); } } + _textures.Clear(); } } diff --git a/src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj b/src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj index 931e70c03..47cec29e2 100644 --- a/src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj +++ b/src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj @@ -1,7 +1,6 @@ - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.OpenGL/Sync.cs b/src/Ryujinx.Graphics.OpenGL/Sync.cs index e8f7ebc00..a809a22f0 100644 --- a/src/Ryujinx.Graphics.OpenGL/Sync.cs +++ b/src/Ryujinx.Graphics.OpenGL/Sync.cs @@ -17,7 +17,7 @@ namespace Ryujinx.Graphics.OpenGL private ulong _firstHandle = 0; private static ClientWaitSyncFlags SyncFlags => HwCapabilities.RequiresSyncFlush ? ClientWaitSyncFlags.None : ClientWaitSyncFlags.SyncFlushCommandsBit; - private readonly List _handles = new(); + private readonly List _handles = []; public void Create(ulong id) { @@ -27,7 +27,6 @@ namespace Ryujinx.Graphics.OpenGL Handle = GL.FenceSync(SyncCondition.SyncGpuCommandsComplete, WaitSyncFlags.None), }; - if (HwCapabilities.RequiresSyncFlush) { // Force commands to flush up to the syncpoint. diff --git a/src/Ryujinx.Graphics.OpenGL/VertexArray.cs b/src/Ryujinx.Graphics.OpenGL/VertexArray.cs index 2db84421f..2480b6af2 100644 --- a/src/Ryujinx.Graphics.OpenGL/VertexArray.cs +++ b/src/Ryujinx.Graphics.OpenGL/VertexArray.cs @@ -104,8 +104,8 @@ namespace Ryujinx.Graphics.OpenGL int offset = attrib.Offset; int size = fmtInfo.Components; - bool isFloat = fmtInfo.PixelType == PixelType.Float || - fmtInfo.PixelType == PixelType.HalfFloat; + bool isFloat = fmtInfo.PixelType is PixelType.Float or + PixelType.HalfFloat; if (isFloat || fmtInfo.Normalized || fmtInfo.Scaled) { @@ -177,7 +177,7 @@ namespace Ryujinx.Graphics.OpenGL { int vbIndex = BitOperations.TrailingZeroCount(buffersInUse); - ref var vb = ref _vertexBuffers[vbIndex]; + ref VertexBufferDescriptor vb = ref _vertexBuffers[vbIndex]; int requiredSize = vertexCount * vb.Stride; @@ -232,7 +232,7 @@ namespace Ryujinx.Graphics.OpenGL { int vbIndex = BitOperations.TrailingZeroCount(buffersLimited); - ref var vb = ref _vertexBuffers[vbIndex]; + ref VertexBufferDescriptor vb = ref _vertexBuffers[vbIndex]; GL.BindVertexBuffer(vbIndex, vb.Buffer.Handle.ToInt32(), (nint)vb.Buffer.Offset, vb.Stride); diff --git a/src/Ryujinx.Graphics.OpenGL/Window.cs b/src/Ryujinx.Graphics.OpenGL/Window.cs index 1dc8a51f6..bb4df0c06 100644 --- a/src/Ryujinx.Graphics.OpenGL/Window.cs +++ b/src/Ryujinx.Graphics.OpenGL/Window.cs @@ -1,4 +1,5 @@ using OpenTK.Graphics.OpenGL; +using Ryujinx.Common.Configuration; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.OpenGL.Effects; using Ryujinx.Graphics.OpenGL.Effects.Smaa; @@ -75,13 +76,13 @@ namespace Ryujinx.Graphics.OpenGL if (_antiAliasing != null) { - var oldView = viewConverted; + TextureView oldView = viewConverted; viewConverted = _antiAliasing.Run(viewConverted, _width, _height); if (viewConverted.Format.IsBgr()) { - var swappedView = _renderer.TextureCopy.BgraSwap(viewConverted); + TextureView swappedView = _renderer.TextureCopy.BgraSwap(viewConverted); viewConverted?.Dispose(); @@ -329,7 +330,7 @@ namespace Ryujinx.Graphics.OpenGL case AntiAliasing.SmaaMedium: case AntiAliasing.SmaaHigh: case AntiAliasing.SmaaUltra: - var quality = _currentAntiAliasing - AntiAliasing.SmaaLow; + int quality = _currentAntiAliasing - AntiAliasing.SmaaLow; if (_antiAliasing is SmaaPostProcessingEffect smaa) { smaa.Quality = quality; @@ -339,6 +340,7 @@ namespace Ryujinx.Graphics.OpenGL _antiAliasing?.Dispose(); _antiAliasing = new SmaaPostProcessingEffect(_renderer, quality); } + break; } } @@ -370,6 +372,7 @@ namespace Ryujinx.Graphics.OpenGL _scalingFilter?.Dispose(); _scalingFilter = new FsrScalingFilter(_renderer); } + _isLinear = false; _scalingFilter.Level = _scalingFilterLevel; @@ -381,6 +384,7 @@ namespace Ryujinx.Graphics.OpenGL _scalingFilter?.Dispose(); _scalingFilter = new AreaScalingFilter(_renderer); } + _isLinear = false; RecreateUpscalingTexture(); @@ -393,7 +397,7 @@ namespace Ryujinx.Graphics.OpenGL { _upscaledTexture?.Dispose(); - var info = new TextureCreateInfo( + TextureCreateInfo info = new( _width, _height, 1, diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs index eb6c689b8..e0d7cdc4b 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs @@ -149,7 +149,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl if (context.Definitions.TransformFeedbackEnabled && context.Definitions.LastInVertexPipeline) { - var tfOutput = context.Definitions.GetTransformFeedbackOutput(AttributeConsts.PositionX); + TransformFeedbackOutput tfOutput = context.Definitions.GetTransformFeedbackOutput(AttributeConsts.PositionX); if (tfOutput.Valid) { context.AppendLine($"layout (xfb_buffer = {tfOutput.Buffer}, xfb_offset = {tfOutput.Offset}, xfb_stride = {tfOutput.Stride}) out gl_PerVertex"); @@ -338,7 +338,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl private static void DeclareSamplers(CodeGenContext context, IEnumerable definitions) { - foreach (var definition in definitions) + foreach (TextureDefinition definition in definitions) { string arrayDecl = string.Empty; @@ -366,7 +366,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl private static void DeclareImages(CodeGenContext context, IEnumerable definitions) { - foreach (var definition in definitions) + foreach (TextureDefinition definition in definitions) { string arrayDecl = string.Empty; @@ -413,7 +413,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl } else { - foreach (var ioDefinition in inputs.OrderBy(x => x.Location)) + foreach (IoDefinition ioDefinition in inputs.OrderBy(x => x.Location)) { DeclareInputAttribute(context, ioDefinition.Location, ioDefinition.Component); } @@ -427,7 +427,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl private static void DeclareInputAttributesPerPatch(CodeGenContext context, IEnumerable inputs) { - foreach (var ioDefinition in inputs.OrderBy(x => x.Location)) + foreach (IoDefinition ioDefinition in inputs.OrderBy(x => x.Location)) { DeclareInputAttributePerPatch(context, ioDefinition.Location); } @@ -512,16 +512,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl if (context.Definitions.Stage == ShaderStage.Fragment && context.Definitions.DualSourceBlend) { IoDefinition firstOutput = outputs.ElementAtOrDefault(0); - IoDefinition secondOutput = outputs.ElementAtOrDefault(1); - if (firstOutput.Location + 1 == secondOutput.Location) - { - DeclareOutputDualSourceBlendAttribute(context, firstOutput.Location); - outputs = outputs.Skip(2); - } + DeclareOutputDualSourceBlendAttribute(context, firstOutput.Location); + outputs = outputs.Skip(2); } - foreach (var ioDefinition in outputs) + foreach (IoDefinition ioDefinition in outputs) { DeclareOutputAttribute(context, ioDefinition.Location, ioDefinition.Component); } @@ -548,7 +544,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl string xfb = string.Empty; - var tfOutput = context.Definitions.GetTransformFeedbackOutput(location, component); + TransformFeedbackOutput tfOutput = context.Definitions.GetTransformFeedbackOutput(location, component); if (tfOutput.Valid) { xfb = $", xfb_buffer = {tfOutput.Buffer}, xfb_offset = {tfOutput.Offset}, xfb_stride = {tfOutput.Stride}"; @@ -570,7 +566,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl string xfb = string.Empty; - var tfOutput = context.Definitions.GetTransformFeedbackOutput(location, 0); + TransformFeedbackOutput tfOutput = context.Definitions.GetTransformFeedbackOutput(location, 0); if (tfOutput.Valid) { xfb = $", xfb_buffer = {tfOutput.Buffer}, xfb_offset = {tfOutput.Offset}, xfb_stride = {tfOutput.Stride}"; @@ -606,7 +602,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl private static void DeclareOutputAttributesPerPatch(CodeGenContext context, IEnumerable outputs) { - foreach (var ioDefinition in outputs) + foreach (IoDefinition ioDefinition in outputs) { DeclareOutputAttributePerPatch(context, ioDefinition.Location); } @@ -633,9 +629,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl } else { - return stage == ShaderStage.TessellationControl || - stage == ShaderStage.TessellationEvaluation || - stage == ShaderStage.Geometry; + return stage is ShaderStage.TessellationControl or + ShaderStage.TessellationEvaluation or + ShaderStage.Geometry; } } diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs index 9e7f64b0e..939b57aa7 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs @@ -74,7 +74,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions { builder.Append(GenerateLoadOrStore(context, operation, isStore: false)); - AggregateType dstType = operation.Inst == Instruction.AtomicMaxS32 || operation.Inst == Instruction.AtomicMinS32 + AggregateType dstType = operation.Inst is Instruction.AtomicMaxS32 or Instruction.AtomicMinS32 ? AggregateType.S32 : AggregateType.U32; diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenCall.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenCall.cs index d5448856d..9d4ea5348 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenCall.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenCall.cs @@ -14,7 +14,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions Debug.Assert(funcId.Type == OperandType.Constant); - var function = context.GetFunction(funcId.Value); + StructuredFunction function = context.GetFunction(funcId.Value); string[] args = new string[operation.SourcesCount - 1]; diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs index 56507a2a4..32c930557 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs @@ -16,7 +16,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions bool isArray = (texOp.Type & SamplerType.Array) != 0; - var texCallBuilder = new StringBuilder(); + StringBuilder texCallBuilder = new(); if (texOp.Inst == Instruction.ImageAtomic) { @@ -595,6 +595,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions varName = $"gl_out[{expr}].{varName}"; } } + break; default: diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstType.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstType.cs index 56985ae08..43ff12168 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstType.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstType.cs @@ -4,7 +4,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions { [Flags] - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum InstType { OpNullary = Op | 0, diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/IoMap.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/IoMap.cs index caa6ef642..8c45c0b67 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/IoMap.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/IoMap.cs @@ -79,9 +79,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions } else { - return stage == ShaderStage.TessellationControl || - stage == ShaderStage.TessellationEvaluation || - stage == ShaderStage.Geometry; + return stage is ShaderStage.TessellationControl or + ShaderStage.TessellationEvaluation or + ShaderStage.Geometry; } } diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/NumberFormatter.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/NumberFormatter.cs index 28e44c900..b32e28e04 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/NumberFormatter.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/NumberFormatter.cs @@ -83,7 +83,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl public static string FormatInt(int value) { - if (value <= MaxDecimal && value >= -MaxDecimal) + if (value is <= MaxDecimal and >= (-MaxDecimal)) { return value.ToString(CultureInfo.InvariantCulture); } @@ -93,7 +93,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl public static string FormatUint(uint value) { - if (value <= MaxDecimal && value >= 0) + if (value is <= MaxDecimal and >= 0) { return value.ToString(CultureInfo.InvariantCulture) + "u"; } diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs index a350b089c..6c20cb0c8 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs @@ -97,8 +97,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl } IoVariable ioVariable = (IoVariable)varId.Value; - bool isOutput = operation.StorageKind == StorageKind.Output || operation.StorageKind == StorageKind.OutputPerPatch; - bool isPerPatch = operation.StorageKind == StorageKind.InputPerPatch || operation.StorageKind == StorageKind.OutputPerPatch; + bool isOutput = operation.StorageKind is StorageKind.Output or StorageKind.OutputPerPatch; + bool isPerPatch = operation.StorageKind is StorageKind.InputPerPatch or StorageKind.OutputPerPatch; int location = 0; int component = 0; diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs index cc7977f84..4fe214778 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/CodeGenContext.cs @@ -4,7 +4,6 @@ using Ryujinx.Graphics.Shader.Translation; using Spv.Generator; using System; using System.Collections.Generic; -using static Spv.Specification; using Instruction = Spv.Generator.Instruction; namespace Ryujinx.Graphics.Shader.CodeGen.Spirv @@ -50,7 +49,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private class BlockState { private int _entryCount; - private readonly List _labels = new(); + private readonly List _labels = []; public Instruction GetNextLabel(CodeGenContext context) { @@ -127,7 +126,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private BlockState GetBlockStateLazy(AstBlock block) { - if (!_labels.TryGetValue(block, out var blockState)) + if (!_labels.TryGetValue(block, out BlockState blockState)) { blockState = new BlockState(); @@ -139,7 +138,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv public Instruction NewBlock() { - var label = Label(); + Instruction label = Label(); Branch(label); AddLabel(label); return label; @@ -147,7 +146,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv public Instruction[] GetMainInterface() { - var mainInterface = new List(); + List mainInterface = []; mainInterface.AddRange(Inputs.Values); mainInterface.AddRange(Outputs.Values); @@ -196,7 +195,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { if (node is AstOperation operation) { - var opResult = Instructions.Generate(this, operation); + OperationResult opResult = Instructions.Generate(this, operation); return BitcastIfNeeded(type, opResult.Type, opResult.Value); } else if (node is AstOperand operand) @@ -218,7 +217,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { if (node is AstOperation operation) { - var opResult = Instructions.Generate(this, operation); + OperationResult opResult = Instructions.Generate(this, operation); type = opResult.Type; return opResult.Value; } @@ -273,13 +272,13 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv public Instruction GetLocal(AggregateType dstType, AstOperand local) { - var srcType = local.VarType; + AggregateType srcType = local.VarType; return BitcastIfNeeded(dstType, srcType, Load(GetType(srcType), GetLocalPointer(local))); } public Instruction GetArgument(AggregateType dstType, AstOperand funcArg) { - var srcType = funcArg.VarType; + AggregateType srcType = funcArg.VarType; return BitcastIfNeeded(dstType, srcType, Load(GetType(srcType), GetArgumentPointer(funcArg))); } @@ -339,8 +338,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } else if (srcType == AggregateType.Bool) { - var intTrue = Constant(TypeS32(), IrConsts.True); - var intFalse = Constant(TypeS32(), IrConsts.False); + Instruction intTrue = Constant(TypeS32(), IrConsts.True); + Instruction intFalse = Constant(TypeS32(), IrConsts.False); return BitcastIfNeeded(dstType, AggregateType.S32, Select(TypeS32(), value, intTrue, intFalse)); } diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs index 55d35bf0d..c0a597a10 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs @@ -20,10 +20,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static void DeclareParameters(CodeGenContext context, IEnumerable argTypes, int argIndex) { - foreach (var argType in argTypes) + foreach (AggregateType argType in argTypes) { - var argPointerType = context.TypePointer(StorageClass.Function, context.GetType(argType)); - var spvArg = context.FunctionParameter(argPointerType); + SpvInstruction argPointerType = context.TypePointer(StorageClass.Function, context.GetType(argType)); + SpvInstruction spvArg = context.FunctionParameter(argPointerType); context.DeclareArgument(argIndex++, spvArg); } @@ -33,8 +33,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { foreach (AstOperand local in function.Locals) { - var localPointerType = context.TypePointer(StorageClass.Function, context.GetType(local.VarType)); - var spvLocal = context.Variable(localPointerType, StorageClass.Function); + SpvInstruction localPointerType = context.TypePointer(StorageClass.Function, context.GetType(local.VarType)); + SpvInstruction spvLocal = context.Variable(localPointerType, StorageClass.Function); context.AddLocalVariable(spvLocal); context.DeclareLocal(local, spvLocal); @@ -60,8 +60,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { foreach ((int id, MemoryDefinition memory) in memories) { - var pointerType = context.TypePointer(storage, context.GetType(memory.Type, memory.ArrayLength)); - var variable = context.Variable(pointerType, storage); + SpvInstruction pointerType = context.TypePointer(storage, context.GetType(memory.Type, memory.ArrayLength)); + SpvInstruction variable = context.Variable(pointerType, storage); context.AddGlobalVariable(variable); @@ -81,7 +81,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static void DeclareBuffers(CodeGenContext context, IEnumerable buffers, bool isBuffer) { - HashSet decoratedTypes = new(); + HashSet decoratedTypes = []; foreach (BufferDefinition buffer in buffers) { @@ -123,7 +123,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } } - var structType = context.TypeStruct(false, structFieldTypes); + SpvInstruction structType = context.TypeStruct(false, structFieldTypes); if (decoratedTypes.Add(structType)) { @@ -135,8 +135,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } } - var pointerType = context.TypePointer(StorageClass.Uniform, structType); - var variable = context.Variable(pointerType, StorageClass.Uniform); + SpvInstruction pointerType = context.TypePointer(StorageClass.Uniform, structType); + SpvInstruction variable = context.Variable(pointerType, StorageClass.Uniform); context.Name(variable, buffer.Name); context.Decorate(variable, Decoration.DescriptorSet, (LiteralInteger)setIndex); @@ -156,7 +156,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static void DeclareSamplers(CodeGenContext context, IEnumerable samplers) { - foreach (var sampler in samplers) + foreach (TextureDefinition sampler in samplers) { int setIndex = context.TargetApi == TargetApi.Vulkan ? sampler.Set : 0; @@ -165,7 +165,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv if (sampler.Type != SamplerType.None) { - var dim = (sampler.Type & SamplerType.Mask) switch + Dim dim = (sampler.Type & SamplerType.Mask) switch { SamplerType.Texture1D => Dim.Dim1D, SamplerType.Texture2D => Dim.Dim2D, @@ -191,22 +191,22 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv imageType = sampledImageType = context.TypeSampler(); } - var sampledOrSeparateImageType = sampler.Separate ? imageType : sampledImageType; - var sampledImagePointerType = context.TypePointer(StorageClass.UniformConstant, sampledOrSeparateImageType); - var sampledImageArrayPointerType = sampledImagePointerType; + SpvInstruction sampledOrSeparateImageType = sampler.Separate ? imageType : sampledImageType; + SpvInstruction sampledImagePointerType = context.TypePointer(StorageClass.UniformConstant, sampledOrSeparateImageType); + SpvInstruction sampledImageArrayPointerType = sampledImagePointerType; if (sampler.ArrayLength == 0) { - var sampledImageArrayType = context.TypeRuntimeArray(sampledOrSeparateImageType); + SpvInstruction sampledImageArrayType = context.TypeRuntimeArray(sampledOrSeparateImageType); sampledImageArrayPointerType = context.TypePointer(StorageClass.UniformConstant, sampledImageArrayType); } else if (sampler.ArrayLength != 1) { - var sampledImageArrayType = context.TypeArray(sampledOrSeparateImageType, context.Constant(context.TypeU32(), sampler.ArrayLength)); + SpvInstruction sampledImageArrayType = context.TypeArray(sampledOrSeparateImageType, context.Constant(context.TypeU32(), sampler.ArrayLength)); sampledImageArrayPointerType = context.TypePointer(StorageClass.UniformConstant, sampledImageArrayType); } - var sampledImageVariable = context.Variable(sampledImageArrayPointerType, StorageClass.UniformConstant); + SpvInstruction sampledImageVariable = context.Variable(sampledImageArrayPointerType, StorageClass.UniformConstant); context.Samplers.Add(new(sampler.Set, sampler.Binding), new SamplerDeclaration( imageType, @@ -225,13 +225,13 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static void DeclareImages(CodeGenContext context, IEnumerable images) { - foreach (var image in images) + foreach (TextureDefinition image in images) { int setIndex = context.TargetApi == TargetApi.Vulkan ? image.Set : 0; - var dim = GetDim(image.Type); + Dim dim = GetDim(image.Type); - var imageType = context.TypeImage( + SpvInstruction imageType = context.TypeImage( context.GetType(image.Format.GetComponentType()), dim, image.Type.HasFlag(SamplerType.Shadow), @@ -240,21 +240,21 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AccessQualifier.ReadWrite, GetImageFormat(image.Format)); - var imagePointerType = context.TypePointer(StorageClass.UniformConstant, imageType); - var imageArrayPointerType = imagePointerType; + SpvInstruction imagePointerType = context.TypePointer(StorageClass.UniformConstant, imageType); + SpvInstruction imageArrayPointerType = imagePointerType; if (image.ArrayLength == 0) { - var imageArrayType = context.TypeRuntimeArray(imageType); + SpvInstruction imageArrayType = context.TypeRuntimeArray(imageType); imageArrayPointerType = context.TypePointer(StorageClass.UniformConstant, imageArrayType); } else if (image.ArrayLength != 1) { - var imageArrayType = context.TypeArray(imageType, context.Constant(context.TypeU32(), image.ArrayLength)); + SpvInstruction imageArrayType = context.TypeArray(imageType, context.Constant(context.TypeU32(), image.ArrayLength)); imageArrayPointerType = context.TypePointer(StorageClass.UniformConstant, imageArrayType); } - var imageVariable = context.Variable(imageArrayPointerType, StorageClass.UniformConstant); + SpvInstruction imageVariable = context.Variable(imageArrayPointerType, StorageClass.UniformConstant); context.Images.Add(new(image.Set, image.Binding), new ImageDeclaration(imageType, imagePointerType, imageVariable, image.ArrayLength != 1)); @@ -338,7 +338,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv if (context.Definitions.Stage == ShaderStage.Fragment && context.Definitions.DualSourceBlend) { - foreach (var ioDefinition in info.IoDefinitions) + foreach (IoDefinition ioDefinition in info.IoDefinitions) { if (ioDefinition.IoVariable == IoVariable.FragmentOutputColor && ioDefinition.Location < firstLocation) { @@ -347,13 +347,13 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } } - foreach (var ioDefinition in info.IoDefinitions) + foreach (IoDefinition ioDefinition in info.IoDefinitions) { PixelImap iq = PixelImap.Unused; if (context.Definitions.Stage == ShaderStage.Fragment) { - var ioVariable = ioDefinition.IoVariable; + IoVariable ioVariable = ioDefinition.IoVariable; if (ioVariable == IoVariable.UserDefined) { iq = context.Definitions.ImapTypes[ioDefinition.Location].GetFirstUsedType(); @@ -389,11 +389,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { if (context.Definitions.Stage != ShaderStage.Vertex) { - var perVertexInputStructType = CreatePerVertexStructType(context); + SpvInstruction perVertexInputStructType = CreatePerVertexStructType(context); int arraySize = context.Definitions.Stage == ShaderStage.Geometry ? context.Definitions.InputTopology.ToInputVertices() : 32; - var perVertexInputArrayType = context.TypeArray(perVertexInputStructType, context.Constant(context.TypeU32(), arraySize)); - var perVertexInputPointerType = context.TypePointer(StorageClass.Input, perVertexInputArrayType); - var perVertexInputVariable = context.Variable(perVertexInputPointerType, StorageClass.Input); + SpvInstruction perVertexInputArrayType = context.TypeArray(perVertexInputStructType, context.Constant(context.TypeU32(), arraySize)); + SpvInstruction perVertexInputPointerType = context.TypePointer(StorageClass.Input, perVertexInputArrayType); + SpvInstruction perVertexInputVariable = context.Variable(perVertexInputPointerType, StorageClass.Input); context.Name(perVertexInputVariable, "gl_in"); @@ -411,11 +411,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } } - var perVertexOutputStructType = CreatePerVertexStructType(context); + SpvInstruction perVertexOutputStructType = CreatePerVertexStructType(context); void DecorateTfo(IoVariable ioVariable, int fieldIndex) { - if (context.Definitions.TryGetTransformFeedbackOutput(ioVariable, 0, 0, out var transformFeedbackOutput)) + if (context.Definitions.TryGetTransformFeedbackOutput(ioVariable, 0, 0, out TransformFeedbackOutput transformFeedbackOutput)) { context.MemberDecorate(perVertexOutputStructType, fieldIndex, Decoration.XfbBuffer, (LiteralInteger)transformFeedbackOutput.Buffer); context.MemberDecorate(perVertexOutputStructType, fieldIndex, Decoration.XfbStride, (LiteralInteger)transformFeedbackOutput.Stride); @@ -439,8 +439,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv perVertexOutputArrayType = perVertexOutputStructType; } - var perVertexOutputPointerType = context.TypePointer(StorageClass.Output, perVertexOutputArrayType); - var perVertexOutputVariable = context.Variable(perVertexOutputPointerType, StorageClass.Output); + SpvInstruction perVertexOutputPointerType = context.TypePointer(StorageClass.Output, perVertexOutputArrayType); + SpvInstruction perVertexOutputVariable = context.Variable(perVertexOutputPointerType, StorageClass.Output); context.AddGlobalVariable(perVertexOutputVariable); context.Outputs.Add(new IoDefinition(StorageKind.Output, IoVariable.Position), perVertexOutputVariable); @@ -449,12 +449,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static SpvInstruction CreatePerVertexStructType(CodeGenContext context) { - var vec4FloatType = context.TypeVector(context.TypeFP32(), 4); - var floatType = context.TypeFP32(); - var array8FloatType = context.TypeArray(context.TypeFP32(), context.Constant(context.TypeU32(), 8)); - var array1FloatType = context.TypeArray(context.TypeFP32(), context.Constant(context.TypeU32(), 1)); + SpvInstruction vec4FloatType = context.TypeVector(context.TypeFP32(), 4); + SpvInstruction floatType = context.TypeFP32(); + SpvInstruction array8FloatType = context.TypeArray(context.TypeFP32(), context.Constant(context.TypeU32(), 8)); + SpvInstruction array1FloatType = context.TypeArray(context.TypeFP32(), context.Constant(context.TypeU32(), 1)); - var perVertexStructType = context.TypeStruct(true, vec4FloatType, floatType, array8FloatType, array1FloatType); + SpvInstruction perVertexStructType = context.TypeStruct(true, vec4FloatType, floatType, array8FloatType, array1FloatType); context.Name(perVertexStructType, "gl_PerVertex"); @@ -487,7 +487,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv int firstLocation = 0) { IoVariable ioVariable = ioDefinition.IoVariable; - var storageClass = isOutput ? StorageClass.Output : StorageClass.Input; + StorageClass storageClass = isOutput ? StorageClass.Output : StorageClass.Input; bool isBuiltIn; BuiltIn builtIn = default; @@ -532,7 +532,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv }; } - var spvType = context.GetType(varType, IoMap.GetSpirvBuiltInArrayLength(ioVariable)); + SpvInstruction spvType = context.GetType(varType, IoMap.GetSpirvBuiltInArrayLength(ioVariable)); bool builtInPassthrough = false; if (!isPerPatch && IoMap.IsPerVertex(ioVariable, context.Definitions.Stage, isOutput)) @@ -551,8 +551,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv spvType = context.TypeArray(spvType, context.Constant(context.TypeU32(), context.Definitions.ThreadsPerInputPrimitive)); } - var spvPointerType = context.TypePointer(storageClass, spvType); - var spvVar = context.Variable(spvPointerType, storageClass); + SpvInstruction spvPointerType = context.TypePointer(storageClass, spvType); + SpvInstruction spvVar = context.Variable(spvPointerType, storageClass); if (builtInPassthrough) { @@ -641,7 +641,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv ioVariable, ioDefinition.Location, ioDefinition.Component, - out var transformFeedbackOutput)) + out TransformFeedbackOutput transformFeedbackOutput)) { context.Decorate(spvVar, Decoration.XfbBuffer, (LiteralInteger)transformFeedbackOutput.Buffer); context.Decorate(spvVar, Decoration.XfbStride, (LiteralInteger)transformFeedbackOutput.Stride); @@ -650,7 +650,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv context.AddGlobalVariable(spvVar); - var dict = isPerPatch + Dictionary dict = isPerPatch ? (isOutput ? context.OutputsPerPatch : context.InputsPerPatch) : (isOutput ? context.Outputs : context.Inputs); dict.Add(ioDefinition, spvVar); diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs index 6206985d8..27b5c21c0 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs @@ -153,7 +153,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv public static OperationResult Generate(CodeGenContext context, AstOperation operation) { - var handler = _instTable[(int)(operation.Inst & Instruction.Mask)]; + Func handler = _instTable[(int)(operation.Inst & Instruction.Mask)]; if (handler != null) { return handler(context, operation); @@ -226,13 +226,13 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateBallot(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); - var uvec4Type = context.TypeVector(context.TypeU32(), 4); - var execution = context.Constant(context.TypeU32(), Scope.Subgroup); + SpvInstruction uvec4Type = context.TypeVector(context.TypeU32(), 4); + SpvInstruction execution = context.Constant(context.TypeU32(), Scope.Subgroup); - var maskVector = context.GroupNonUniformBallot(uvec4Type, execution, context.Get(AggregateType.Bool, source)); - var mask = context.CompositeExtract(context.TypeU32(), maskVector, (SpvLiteralInteger)operation.Index); + SpvInstruction maskVector = context.GroupNonUniformBallot(uvec4Type, execution, context.Get(AggregateType.Bool, source)); + SpvInstruction mask = context.CompositeExtract(context.TypeU32(), maskVector, (SpvLiteralInteger)operation.Index); return new OperationResult(AggregateType.U32, mask); } @@ -308,21 +308,21 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv Debug.Assert(funcId.Type == OperandType.Constant); - var (function, spvFunc) = context.GetFunction(funcId.Value); + (StructuredFunction function, SpvInstruction spvFunc) = context.GetFunction(funcId.Value); - var args = new SpvInstruction[operation.SourcesCount - 1]; + SpvInstruction[] args = new SpvInstruction[operation.SourcesCount - 1]; for (int i = 0; i < args.Length; i++) { - var operand = operation.GetSource(i + 1); + IAstNode operand = operation.GetSource(i + 1); AstOperand local = (AstOperand)operand; Debug.Assert(local.Type == OperandType.LocalVariable); args[i] = context.GetLocalPointer(local); } - var retType = function.ReturnType; - var result = context.FunctionCall(context.GetType(retType), spvFunc, args); + AggregateType retType = function.ReturnType; + SpvInstruction result = context.FunctionCall(context.GetType(retType), spvFunc, args); return new OperationResult(retType, result); } @@ -398,11 +398,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateConditionalSelect(CodeGenContext context, AstOperation operation) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); - var src3 = operation.GetSource(2); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); + IAstNode src3 = operation.GetSource(2); - var cond = context.Get(AggregateType.Bool, src1); + SpvInstruction cond = context.Get(AggregateType.Bool, src1); if (operation.Inst.HasFlag(Instruction.FP64)) { @@ -420,70 +420,70 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateConvertFP32ToFP64(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.FP64, context.FConvert(context.TypeFP64(), context.GetFP32(source))); } private static OperationResult GenerateConvertFP32ToS32(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.S32, context.ConvertFToS(context.TypeS32(), context.GetFP32(source))); } private static OperationResult GenerateConvertFP32ToU32(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.U32, context.ConvertFToU(context.TypeU32(), context.GetFP32(source))); } private static OperationResult GenerateConvertFP64ToFP32(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.FP32, context.FConvert(context.TypeFP32(), context.GetFP64(source))); } private static OperationResult GenerateConvertFP64ToS32(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.S32, context.ConvertFToS(context.TypeS32(), context.GetFP64(source))); } private static OperationResult GenerateConvertFP64ToU32(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.U32, context.ConvertFToU(context.TypeU32(), context.GetFP64(source))); } private static OperationResult GenerateConvertS32ToFP32(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.FP32, context.ConvertSToF(context.TypeFP32(), context.GetS32(source))); } private static OperationResult GenerateConvertS32ToFP64(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.FP64, context.ConvertSToF(context.TypeFP64(), context.GetS32(source))); } private static OperationResult GenerateConvertU32ToFP32(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.FP32, context.ConvertUToF(context.TypeFP32(), context.GetU32(source))); } private static OperationResult GenerateConvertU32ToFP64(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.FP64, context.ConvertUToF(context.TypeFP64(), context.GetU32(source))); } @@ -555,19 +555,19 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateFindLSB(CodeGenContext context, AstOperation operation) { - var source = context.GetU32(operation.GetSource(0)); + SpvInstruction source = context.GetU32(operation.GetSource(0)); return new OperationResult(AggregateType.U32, context.GlslFindILsb(context.TypeU32(), source)); } private static OperationResult GenerateFindMSBS32(CodeGenContext context, AstOperation operation) { - var source = context.GetS32(operation.GetSource(0)); + SpvInstruction source = context.GetS32(operation.GetSource(0)); return new OperationResult(AggregateType.U32, context.GlslFindSMsb(context.TypeU32(), source)); } private static OperationResult GenerateFindMSBU32(CodeGenContext context, AstOperation operation) { - var source = context.GetU32(operation.GetSource(0)); + SpvInstruction source = context.GetU32(operation.GetSource(0)); return new OperationResult(AggregateType.U32, context.GlslFindUMsb(context.TypeU32(), source)); } @@ -591,7 +591,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { AstTextureOperation texOp = (AstTextureOperation)operation; - var componentType = texOp.Format.GetComponentType(); + AggregateType componentType = texOp.Format.GetComponentType(); bool isArray = (texOp.Type & SamplerType.Array) != 0; @@ -630,7 +630,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv elems[i] = Src(AggregateType.S32); } - var vectorType = context.TypeVector(context.TypeS32(), pCount); + SpvInstruction vectorType = context.TypeVector(context.TypeS32(), pCount); pCoords = context.CompositeConstruct(vectorType, elems); } else @@ -640,11 +640,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv SpvInstruction value = Src(componentType); - var pointer = context.ImageTexelPointer(imagePointerType, image, pCoords, context.Constant(context.TypeU32(), 0)); - var one = context.Constant(context.TypeU32(), 1); - var zero = context.Constant(context.TypeU32(), 0); + SpvInstruction pointer = context.ImageTexelPointer(imagePointerType, image, pCoords, context.Constant(context.TypeU32(), 0)); + SpvInstruction one = context.Constant(context.TypeU32(), 1); + SpvInstruction zero = context.Constant(context.TypeU32(), 0); - var result = (texOp.Flags & TextureFlags.AtomicMask) switch + SpvInstruction result = (texOp.Flags & TextureFlags.AtomicMask) switch { TextureFlags.Add => context.AtomicIAdd(resultType, pointer, one, zero, value), TextureFlags.Minimum => componentType == AggregateType.S32 @@ -670,7 +670,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { AstTextureOperation texOp = (AstTextureOperation)operation; - var componentType = texOp.Format.GetComponentType(); + AggregateType componentType = texOp.Format.GetComponentType(); bool isArray = (texOp.Type & SamplerType.Array) != 0; @@ -708,7 +708,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv elems[i] = Src(AggregateType.S32); } - var vectorType = context.TypeVector(context.TypeS32(), pCount); + SpvInstruction vectorType = context.TypeVector(context.TypeS32(), pCount); pCoords = context.CompositeConstruct(vectorType, elems); } else @@ -716,11 +716,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv pCoords = Src(AggregateType.S32); } - var imageComponentType = context.GetType(componentType); - var swizzledResultType = texOp.GetVectorType(componentType); + SpvInstruction imageComponentType = context.GetType(componentType); + AggregateType swizzledResultType = texOp.GetVectorType(componentType); - var texel = context.ImageRead(context.TypeVector(imageComponentType, 4), image, pCoords, ImageOperandsMask.MaskNone); - var result = GetSwizzledResult(context, texel, swizzledResultType, texOp.Index); + SpvInstruction texel = context.ImageRead(context.TypeVector(imageComponentType, 4), image, pCoords, ImageOperandsMask.MaskNone); + SpvInstruction result = GetSwizzledResult(context, texel, swizzledResultType, texOp.Index); return new OperationResult(componentType, result); } @@ -765,7 +765,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv elems[i] = Src(AggregateType.S32); } - var vectorType = context.TypeVector(context.TypeS32(), pCount); + SpvInstruction vectorType = context.TypeVector(context.TypeS32(), pCount); pCoords = context.CompositeConstruct(vectorType, elems); } else @@ -773,7 +773,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv pCoords = Src(AggregateType.S32); } - var componentType = texOp.Format.GetComponentType(); + AggregateType componentType = texOp.Format.GetComponentType(); const int ComponentsCount = 4; @@ -796,7 +796,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } } - var texel = context.CompositeConstruct(context.TypeVector(context.GetType(componentType), ComponentsCount), cElems); + SpvInstruction texel = context.CompositeConstruct(context.TypeVector(context.GetType(componentType), ComponentsCount), cElems); context.ImageWrite(image, pCoords, texel, ImageOperandsMask.MaskNone); @@ -805,7 +805,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateIsNan(CodeGenContext context, AstOperation operation) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); SpvInstruction result; @@ -853,7 +853,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv elems[i] = Src(AggregateType.FP32); } - var vectorType = context.TypeVector(context.TypeFP32(), pCount); + SpvInstruction vectorType = context.TypeVector(context.TypeFP32(), pCount); pCoords = context.CompositeConstruct(vectorType, elems); } else @@ -861,9 +861,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv pCoords = Src(AggregateType.FP32); } - var resultType = context.TypeVector(context.TypeFP32(), 2); - var packed = context.ImageQueryLod(resultType, image, pCoords); - var result = context.CompositeExtract(context.TypeFP32(), packed, (SpvLiteralInteger)texOp.Index); + SpvInstruction resultType = context.TypeVector(context.TypeFP32(), 2); + SpvInstruction packed = context.ImageQueryLod(resultType, image, pCoords); + SpvInstruction result = context.CompositeExtract(context.TypeFP32(), packed, (SpvLiteralInteger)texOp.Index); return new OperationResult(AggregateType.FP32, result); } @@ -959,11 +959,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateMultiplyHighS32(CodeGenContext context, AstOperation operation) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); - var resultType = context.TypeStruct(false, context.TypeS32(), context.TypeS32()); - var result = context.SMulExtended(resultType, context.GetS32(src1), context.GetS32(src2)); + SpvInstruction resultType = context.TypeStruct(false, context.TypeS32(), context.TypeS32()); + SpvInstruction result = context.SMulExtended(resultType, context.GetS32(src1), context.GetS32(src2)); result = context.CompositeExtract(context.TypeS32(), result, 1); return new OperationResult(AggregateType.S32, result); @@ -971,11 +971,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateMultiplyHighU32(CodeGenContext context, AstOperation operation) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); - var resultType = context.TypeStruct(false, context.TypeU32(), context.TypeU32()); - var result = context.UMulExtended(resultType, context.GetU32(src1), context.GetU32(src2)); + SpvInstruction resultType = context.TypeStruct(false, context.TypeU32(), context.TypeU32()); + SpvInstruction result = context.UMulExtended(resultType, context.GetU32(src1), context.GetU32(src2)); result = context.CompositeExtract(context.TypeU32(), result, 1); return new OperationResult(AggregateType.U32, result); @@ -988,20 +988,20 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GeneratePackDouble2x32(CodeGenContext context, AstOperation operation) { - var value0 = context.GetU32(operation.GetSource(0)); - var value1 = context.GetU32(operation.GetSource(1)); - var vector = context.CompositeConstruct(context.TypeVector(context.TypeU32(), 2), value0, value1); - var result = context.GlslPackDouble2x32(context.TypeFP64(), vector); + SpvInstruction value0 = context.GetU32(operation.GetSource(0)); + SpvInstruction value1 = context.GetU32(operation.GetSource(1)); + SpvInstruction vector = context.CompositeConstruct(context.TypeVector(context.TypeU32(), 2), value0, value1); + SpvInstruction result = context.GlslPackDouble2x32(context.TypeFP64(), vector); return new OperationResult(AggregateType.FP64, result); } private static OperationResult GeneratePackHalf2x16(CodeGenContext context, AstOperation operation) { - var value0 = context.GetFP32(operation.GetSource(0)); - var value1 = context.GetFP32(operation.GetSource(1)); - var vector = context.CompositeConstruct(context.TypeVector(context.TypeFP32(), 2), value0, value1); - var result = context.GlslPackHalf2x16(context.TypeU32(), vector); + SpvInstruction value0 = context.GetFP32(operation.GetSource(0)); + SpvInstruction value1 = context.GetFP32(operation.GetSource(1)); + SpvInstruction vector = context.CompositeConstruct(context.TypeVector(context.TypeFP32(), 2), value0, value1); + SpvInstruction result = context.GlslPackHalf2x16(context.TypeU32(), vector); return new OperationResult(AggregateType.U32, result); } @@ -1049,40 +1049,40 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateShuffle(CodeGenContext context, AstOperation operation) { - var value = context.GetFP32(operation.GetSource(0)); - var index = context.GetU32(operation.GetSource(1)); + SpvInstruction value = context.GetFP32(operation.GetSource(0)); + SpvInstruction index = context.GetU32(operation.GetSource(1)); - var result = context.GroupNonUniformShuffle(context.TypeFP32(), context.Constant(context.TypeU32(), (int)Scope.Subgroup), value, index); + SpvInstruction result = context.GroupNonUniformShuffle(context.TypeFP32(), context.Constant(context.TypeU32(), (int)Scope.Subgroup), value, index); return new OperationResult(AggregateType.FP32, result); } private static OperationResult GenerateShuffleDown(CodeGenContext context, AstOperation operation) { - var value = context.GetFP32(operation.GetSource(0)); - var index = context.GetU32(operation.GetSource(1)); + SpvInstruction value = context.GetFP32(operation.GetSource(0)); + SpvInstruction index = context.GetU32(operation.GetSource(1)); - var result = context.GroupNonUniformShuffleDown(context.TypeFP32(), context.Constant(context.TypeU32(), (int)Scope.Subgroup), value, index); + SpvInstruction result = context.GroupNonUniformShuffleDown(context.TypeFP32(), context.Constant(context.TypeU32(), (int)Scope.Subgroup), value, index); return new OperationResult(AggregateType.FP32, result); } private static OperationResult GenerateShuffleUp(CodeGenContext context, AstOperation operation) { - var value = context.GetFP32(operation.GetSource(0)); - var index = context.GetU32(operation.GetSource(1)); + SpvInstruction value = context.GetFP32(operation.GetSource(0)); + SpvInstruction index = context.GetU32(operation.GetSource(1)); - var result = context.GroupNonUniformShuffleUp(context.TypeFP32(), context.Constant(context.TypeU32(), (int)Scope.Subgroup), value, index); + SpvInstruction result = context.GroupNonUniformShuffleUp(context.TypeFP32(), context.Constant(context.TypeU32(), (int)Scope.Subgroup), value, index); return new OperationResult(AggregateType.FP32, result); } private static OperationResult GenerateShuffleXor(CodeGenContext context, AstOperation operation) { - var value = context.GetFP32(operation.GetSource(0)); - var index = context.GetU32(operation.GetSource(1)); + SpvInstruction value = context.GetFP32(operation.GetSource(0)); + SpvInstruction index = context.GetU32(operation.GetSource(1)); - var result = context.GroupNonUniformShuffleXor(context.TypeFP32(), context.Constant(context.TypeU32(), (int)Scope.Subgroup), value, index); + SpvInstruction result = context.GroupNonUniformShuffleXor(context.TypeFP32(), context.Constant(context.TypeU32(), (int)Scope.Subgroup), value, index); return new OperationResult(AggregateType.FP32, result); } @@ -1109,31 +1109,31 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateSwizzleAdd(CodeGenContext context, AstOperation operation) { - var x = context.Get(AggregateType.FP32, operation.GetSource(0)); - var y = context.Get(AggregateType.FP32, operation.GetSource(1)); - var mask = context.Get(AggregateType.U32, operation.GetSource(2)); + SpvInstruction x = context.Get(AggregateType.FP32, operation.GetSource(0)); + SpvInstruction y = context.Get(AggregateType.FP32, operation.GetSource(1)); + SpvInstruction mask = context.Get(AggregateType.U32, operation.GetSource(2)); - var v4float = context.TypeVector(context.TypeFP32(), 4); - var one = context.Constant(context.TypeFP32(), 1.0f); - var minusOne = context.Constant(context.TypeFP32(), -1.0f); - var zero = context.Constant(context.TypeFP32(), 0.0f); - var xLut = context.ConstantComposite(v4float, one, minusOne, one, zero); - var yLut = context.ConstantComposite(v4float, one, one, minusOne, one); + SpvInstruction v4float = context.TypeVector(context.TypeFP32(), 4); + SpvInstruction one = context.Constant(context.TypeFP32(), 1.0f); + SpvInstruction minusOne = context.Constant(context.TypeFP32(), -1.0f); + SpvInstruction zero = context.Constant(context.TypeFP32(), 0.0f); + SpvInstruction xLut = context.ConstantComposite(v4float, one, minusOne, one, zero); + SpvInstruction yLut = context.ConstantComposite(v4float, one, one, minusOne, one); - var three = context.Constant(context.TypeU32(), 3); + SpvInstruction three = context.Constant(context.TypeU32(), 3); - var threadId = GetScalarInput(context, IoVariable.SubgroupLaneId); - var shift = context.BitwiseAnd(context.TypeU32(), threadId, three); + SpvInstruction threadId = GetScalarInput(context, IoVariable.SubgroupLaneId); + SpvInstruction shift = context.BitwiseAnd(context.TypeU32(), threadId, three); shift = context.ShiftLeftLogical(context.TypeU32(), shift, context.Constant(context.TypeU32(), 1)); - var lutIdx = context.ShiftRightLogical(context.TypeU32(), mask, shift); + SpvInstruction lutIdx = context.ShiftRightLogical(context.TypeU32(), mask, shift); lutIdx = context.BitwiseAnd(context.TypeU32(), lutIdx, three); - var xLutValue = context.VectorExtractDynamic(context.TypeFP32(), xLut, lutIdx); - var yLutValue = context.VectorExtractDynamic(context.TypeFP32(), yLut, lutIdx); + SpvInstruction xLutValue = context.VectorExtractDynamic(context.TypeFP32(), xLut, lutIdx); + SpvInstruction yLutValue = context.VectorExtractDynamic(context.TypeFP32(), yLut, lutIdx); - var xResult = context.FMul(context.TypeFP32(), x, xLutValue); - var yResult = context.FMul(context.TypeFP32(), y, yLutValue); - var result = context.FAdd(context.TypeFP32(), xResult, yResult); + SpvInstruction xResult = context.FMul(context.TypeFP32(), x, xLutValue); + SpvInstruction yResult = context.FMul(context.TypeFP32(), y, yLutValue); + SpvInstruction result = context.FAdd(context.TypeFP32(), xResult, yResult); return new OperationResult(AggregateType.FP32, result); } @@ -1200,7 +1200,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } } - var vectorType = context.TypeVector(intCoords ? context.TypeS32() : context.TypeFP32(), count); + SpvInstruction vectorType = context.TypeVector(intCoords ? context.TypeS32() : context.TypeFP32(), count); return context.CompositeConstruct(vectorType, elems); } else @@ -1222,7 +1222,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv elems[index] = Src(AggregateType.FP32); } - var vectorType = context.TypeVector(context.TypeFP32(), count); + SpvInstruction vectorType = context.TypeVector(context.TypeFP32(), count); return context.CompositeConstruct(vectorType, elems); } else @@ -1242,11 +1242,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv if (hasDerivatives) { - derivatives = new[] - { + derivatives = + [ AssembleDerivativesVector(coordsCount), // dPdx - AssembleDerivativesVector(coordsCount), // dPdy - }; + AssembleDerivativesVector(coordsCount) // dPdy + ]; } SpvInstruction sample = null; @@ -1272,7 +1272,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv elems[index] = Src(AggregateType.S32); } - var vectorType = context.TypeVector(context.TypeS32(), count); + SpvInstruction vectorType = context.TypeVector(context.TypeS32(), count); return context.ConstantComposite(vectorType, elems); } @@ -1286,17 +1286,17 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv if (hasOffset) { - offsets = new[] { AssembleOffsetVector(coordsCount) }; + offsets = [AssembleOffsetVector(coordsCount)]; } else if (hasOffsets) { - offsets = new[] - { + offsets = + [ AssembleOffsetVector(coordsCount), AssembleOffsetVector(coordsCount), AssembleOffsetVector(coordsCount), - AssembleOffsetVector(coordsCount), - }; + AssembleOffsetVector(coordsCount) + ]; } SpvInstruction lodBias = null; @@ -1327,8 +1327,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv compIdx = Src(AggregateType.S32); } - var operandsList = new List(); - var operandsMask = ImageOperandsMask.MaskNone; + List operandsList = []; + ImageOperandsMask operandsMask = ImageOperandsMask.MaskNone; if (hasLodBias) { @@ -1369,14 +1369,14 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv bool colorIsVector = isGather || !isShadow; - var resultType = colorIsVector ? context.TypeVector(context.TypeFP32(), 4) : context.TypeFP32(); + SpvInstruction resultType = colorIsVector ? context.TypeVector(context.TypeFP32(), 4) : context.TypeFP32(); if (intCoords) { image = context.Image(declaration.ImageType, image); } - var operands = operandsList.ToArray(); + SpvInstruction[] operands = operandsList.ToArray(); SpvInstruction result; @@ -1415,7 +1415,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv result = context.ImageSampleImplicitLod(resultType, image, pCoords, operandsMask, operands); } - var swizzledResultType = AggregateType.FP32; + AggregateType swizzledResultType = AggregateType.FP32; if (colorIsVector) { @@ -1460,7 +1460,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } else { - var type = context.SamplersTypes[texOp.GetTextureSetAndBinding()]; + SamplerType type = context.SamplersTypes[texOp.GetTextureSetAndBinding()]; bool hasLod = !type.HasFlag(SamplerType.Multisample) && type != SamplerType.TextureBuffer; int dimensions = (type & SamplerType.Mask) == SamplerType.TextureCube ? 2 : type.GetDimensions(); @@ -1470,13 +1470,13 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv dimensions++; } - var resultType = dimensions == 1 ? context.TypeS32() : context.TypeVector(context.TypeS32(), dimensions); + SpvInstruction resultType = dimensions == 1 ? context.TypeS32() : context.TypeVector(context.TypeS32(), dimensions); SpvInstruction result; if (hasLod) { - var lod = context.GetS32(operation.GetSource(srcIndex)); + SpvInstruction lod = context.GetS32(operation.GetSource(srcIndex)); result = context.ImageQuerySizeLod(resultType, image, lod); } else @@ -1500,27 +1500,27 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateUnpackDouble2x32(CodeGenContext context, AstOperation operation) { - var value = context.GetFP64(operation.GetSource(0)); - var vector = context.GlslUnpackDouble2x32(context.TypeVector(context.TypeU32(), 2), value); - var result = context.CompositeExtract(context.TypeU32(), vector, operation.Index); + SpvInstruction value = context.GetFP64(operation.GetSource(0)); + SpvInstruction vector = context.GlslUnpackDouble2x32(context.TypeVector(context.TypeU32(), 2), value); + SpvInstruction result = context.CompositeExtract(context.TypeU32(), vector, operation.Index); return new OperationResult(AggregateType.U32, result); } private static OperationResult GenerateUnpackHalf2x16(CodeGenContext context, AstOperation operation) { - var value = context.GetU32(operation.GetSource(0)); - var vector = context.GlslUnpackHalf2x16(context.TypeVector(context.TypeFP32(), 2), value); - var result = context.CompositeExtract(context.TypeFP32(), vector, operation.Index); + SpvInstruction value = context.GetU32(operation.GetSource(0)); + SpvInstruction vector = context.GlslUnpackHalf2x16(context.TypeVector(context.TypeFP32(), 2), value); + SpvInstruction result = context.CompositeExtract(context.TypeFP32(), vector, operation.Index); return new OperationResult(AggregateType.FP32, result); } private static OperationResult GenerateVectorExtract(CodeGenContext context, AstOperation operation) { - var vector = context.GetWithType(operation.GetSource(0), out AggregateType vectorType); - var scalarType = vectorType & ~AggregateType.ElementCountMask; - var resultType = context.GetType(scalarType); + SpvInstruction vector = context.GetWithType(operation.GetSource(0), out AggregateType vectorType); + AggregateType scalarType = vectorType & ~AggregateType.ElementCountMask; + SpvInstruction resultType = context.GetType(scalarType); SpvInstruction result; if (operation.GetSource(1) is AstOperand indexOperand && indexOperand.Type == OperandType.Constant) @@ -1529,7 +1529,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } else { - var index = context.Get(AggregateType.S32, operation.GetSource(1)); + SpvInstruction index = context.Get(AggregateType.S32, operation.GetSource(1)); result = context.VectorExtractDynamic(resultType, vector, index); } @@ -1538,22 +1538,22 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static OperationResult GenerateVoteAll(CodeGenContext context, AstOperation operation) { - var execution = context.Constant(context.TypeU32(), Scope.Subgroup); - var result = context.GroupNonUniformAll(context.TypeBool(), execution, context.Get(AggregateType.Bool, operation.GetSource(0))); + SpvInstruction execution = context.Constant(context.TypeU32(), Scope.Subgroup); + SpvInstruction result = context.GroupNonUniformAll(context.TypeBool(), execution, context.Get(AggregateType.Bool, operation.GetSource(0))); return new OperationResult(AggregateType.Bool, result); } private static OperationResult GenerateVoteAllEqual(CodeGenContext context, AstOperation operation) { - var execution = context.Constant(context.TypeU32(), Scope.Subgroup); - var result = context.GroupNonUniformAllEqual(context.TypeBool(), execution, context.Get(AggregateType.Bool, operation.GetSource(0))); + SpvInstruction execution = context.Constant(context.TypeU32(), Scope.Subgroup); + SpvInstruction result = context.GroupNonUniformAllEqual(context.TypeBool(), execution, context.Get(AggregateType.Bool, operation.GetSource(0))); return new OperationResult(AggregateType.Bool, result); } private static OperationResult GenerateVoteAny(CodeGenContext context, AstOperation operation) { - var execution = context.Constant(context.TypeU32(), Scope.Subgroup); - var result = context.GroupNonUniformAny(context.TypeBool(), execution, context.Get(AggregateType.Bool, operation.GetSource(0))); + SpvInstruction execution = context.Constant(context.TypeU32(), Scope.Subgroup); + SpvInstruction result = context.GroupNonUniformAny(context.TypeBool(), execution, context.Get(AggregateType.Bool, operation.GetSource(0))); return new OperationResult(AggregateType.Bool, result); } @@ -1563,8 +1563,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv Func emitF, Func emitI) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); SpvInstruction result; @@ -1589,10 +1589,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AstOperation operation, Func emitU) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); - var result = emitU(context.TypeBool(), context.GetU32(src1), context.GetU32(src2)); + SpvInstruction result = emitU(context.TypeBool(), context.GetU32(src1), context.GetU32(src2)); return new OperationResult(AggregateType.Bool, result); } @@ -1604,10 +1604,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { SpvInstruction elemPointer = GetStoragePointer(context, operation, out AggregateType varType); - var value = context.Get(varType, operation.GetSource(operation.SourcesCount - 1)); + SpvInstruction value = context.Get(varType, operation.GetSource(operation.SourcesCount - 1)); - var one = context.Constant(context.TypeU32(), 1); - var zero = context.Constant(context.TypeU32(), 0); + SpvInstruction one = context.Constant(context.TypeU32(), 1); + SpvInstruction zero = context.Constant(context.TypeU32(), 0); return new OperationResult(varType, emitU(context.GetType(varType), elemPointer, one, zero, value)); } @@ -1616,11 +1616,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { SpvInstruction elemPointer = GetStoragePointer(context, operation, out AggregateType varType); - var value0 = context.Get(varType, operation.GetSource(operation.SourcesCount - 2)); - var value1 = context.Get(varType, operation.GetSource(operation.SourcesCount - 1)); + SpvInstruction value0 = context.Get(varType, operation.GetSource(operation.SourcesCount - 2)); + SpvInstruction value1 = context.Get(varType, operation.GetSource(operation.SourcesCount - 1)); - var one = context.Constant(context.TypeU32(), 1); - var zero = context.Constant(context.TypeU32(), 0); + SpvInstruction one = context.Constant(context.TypeU32(), 1); + SpvInstruction zero = context.Constant(context.TypeU32(), 0); return new OperationResult(varType, context.AtomicCompareExchange(context.GetType(varType), elemPointer, one, zero, zero, value1, value0)); } @@ -1636,7 +1636,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } else { - var result = context.Load(context.GetType(varType), pointer); + SpvInstruction result = context.Load(context.GetType(varType), pointer); return new OperationResult(varType, result); } } @@ -1695,6 +1695,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv varType = context.Properties.SharedMemories[bindingId.Value].Type & AggregateType.ElementTypeMask; baseObj = context.SharedMemories[bindingId.Value]; } + break; case StorageKind.Input: @@ -1754,8 +1755,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv storageClass = isOutput ? StorageClass.Output : StorageClass.Input; - var ioDefinition = new IoDefinition(storageKind, ioVariable, location, component); - var dict = isPerPatch + IoDefinition ioDefinition = new(storageKind, ioVariable, location, component); + Dictionary dict = isPerPatch ? (isOutput ? context.OutputsPerPatch : context.InputsPerPatch) : (isOutput ? context.Outputs : context.Inputs); @@ -1773,7 +1774,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { int fieldIndex = IoMap.GetPerVertexStructFieldIndex(perVertexBuiltIn.Value); - var indexes = new SpvInstruction[inputsCount + 1]; + SpvInstruction[] indexes = new SpvInstruction[inputsCount + 1]; int index = 0; if (IoMap.IsPerVertexArrayBuiltIn(storageKind, context.Definitions.Stage)) @@ -1823,7 +1824,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv pointer = context.AccessChain(context.TypePointer(storageClass, context.GetType(varType)), baseObj, e0, e1, e2); break; default: - var indexes = new SpvInstruction[inputsCount]; + SpvInstruction[] indexes = new SpvInstruction[inputsCount]; int index = 0; for (; index < inputsCount; srcIndex++, index++) @@ -1840,10 +1841,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static SpvInstruction GetScalarInput(CodeGenContext context, IoVariable ioVariable) { - var (_, varType) = IoMap.GetSpirvBuiltIn(ioVariable); + (_, AggregateType varType) = IoMap.GetSpirvBuiltIn(ioVariable); varType &= AggregateType.ElementTypeMask; - var ioDefinition = new IoDefinition(StorageKind.Input, ioVariable); + IoDefinition ioDefinition = new(StorageKind.Input, ioVariable); return context.Load(context.GetType(varType), context.Inputs[ioDefinition]); } @@ -1917,7 +1918,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv Func emitF, Func emitI) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); if (operation.Inst.HasFlag(Instruction.FP64)) { @@ -1938,7 +1939,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AstOperation operation, Func emitB) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.Bool, emitB(context.TypeBool(), context.Get(AggregateType.Bool, source))); } @@ -1947,7 +1948,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AstOperation operation, Func emit) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.FP32, emit(context.TypeFP32(), context.GetFP32(source))); } @@ -1956,7 +1957,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AstOperation operation, Func emitS) { - var source = operation.GetSource(0); + IAstNode source = operation.GetSource(0); return new OperationResult(AggregateType.S32, emitS(context.TypeS32(), context.GetS32(source))); } @@ -1966,12 +1967,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv Func emitF, Func emitI) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); if (operation.Inst.HasFlag(Instruction.FP64)) { - var result = emitF(context.TypeFP64(), context.GetFP64(src1), context.GetFP64(src2)); + SpvInstruction result = emitF(context.TypeFP64(), context.GetFP64(src1), context.GetFP64(src2)); if (!context.HostCapabilities.ReducedPrecision || operation.ForcePrecise) { @@ -1982,7 +1983,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } else if (operation.Inst.HasFlag(Instruction.FP32)) { - var result = emitF(context.TypeFP32(), context.GetFP32(src1), context.GetFP32(src2)); + SpvInstruction result = emitF(context.TypeFP32(), context.GetFP32(src1), context.GetFP32(src2)); if (!context.HostCapabilities.ReducedPrecision || operation.ForcePrecise) { @@ -2002,8 +2003,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AstOperation operation, Func emitB) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); return new OperationResult(AggregateType.Bool, emitB(context.TypeBool(), context.Get(AggregateType.Bool, src1), context.Get(AggregateType.Bool, src2))); } @@ -2013,8 +2014,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AstOperation operation, Func emitS) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); return new OperationResult(AggregateType.S32, emitS(context.TypeS32(), context.GetS32(src1), context.GetS32(src2))); } @@ -2024,8 +2025,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AstOperation operation, Func emitU) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); return new OperationResult(AggregateType.U32, emitU(context.TypeU32(), context.GetU32(src1), context.GetU32(src2))); } @@ -2036,13 +2037,13 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv Func emitF, Func emitI) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); - var src3 = operation.GetSource(2); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); + IAstNode src3 = operation.GetSource(2); if (operation.Inst.HasFlag(Instruction.FP64)) { - var result = emitF(context.TypeFP64(), context.GetFP64(src1), context.GetFP64(src2), context.GetFP64(src3)); + SpvInstruction result = emitF(context.TypeFP64(), context.GetFP64(src1), context.GetFP64(src2), context.GetFP64(src3)); if (!context.HostCapabilities.ReducedPrecision || operation.ForcePrecise) { @@ -2053,7 +2054,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } else if (operation.Inst.HasFlag(Instruction.FP32)) { - var result = emitF(context.TypeFP32(), context.GetFP32(src1), context.GetFP32(src2), context.GetFP32(src3)); + SpvInstruction result = emitF(context.TypeFP32(), context.GetFP32(src1), context.GetFP32(src2), context.GetFP32(src3)); if (!context.HostCapabilities.ReducedPrecision || operation.ForcePrecise) { @@ -2073,9 +2074,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AstOperation operation, Func emitU) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); - var src3 = operation.GetSource(2); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); + IAstNode src3 = operation.GetSource(2); return new OperationResult(AggregateType.U32, emitU( context.TypeU32(), @@ -2089,9 +2090,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AstOperation operation, Func emitS) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); - var src3 = operation.GetSource(2); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); + IAstNode src3 = operation.GetSource(2); return new OperationResult(AggregateType.S32, emitS( context.TypeS32(), @@ -2105,10 +2106,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv AstOperation operation, Func emitS) { - var src1 = operation.GetSource(0); - var src2 = operation.GetSource(1); - var src3 = operation.GetSource(2); - var src4 = operation.GetSource(3); + IAstNode src1 = operation.GetSource(0); + IAstNode src2 = operation.GetSource(1); + IAstNode src3 = operation.GetSource(2); + IAstNode src4 = operation.GetSource(3); return new OperationResult(AggregateType.U32, emitS( context.TypeU32(), diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/IoMap.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/IoMap.cs index 7b4e14ff0..1fd8a731a 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/IoMap.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/IoMap.cs @@ -104,9 +104,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } else { - return stage == ShaderStage.TessellationControl || - stage == ShaderStage.TessellationEvaluation || - stage == ShaderStage.Geometry; + return stage is ShaderStage.TessellationControl or + ShaderStage.TessellationEvaluation or + ShaderStage.Geometry; } } diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs index b259dde28..e1561446b 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/SpirvGenerator.cs @@ -4,6 +4,7 @@ using Ryujinx.Graphics.Shader.StructuredIr; using Ryujinx.Graphics.Shader.Translation; using System; using System.Collections.Generic; +using System.Threading; using static Spv.Specification; namespace Ryujinx.Graphics.Shader.CodeGen.Spirv @@ -19,13 +20,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private const int GeneratorPoolCount = 1; private static readonly ObjectPool _instructionPool; private static readonly ObjectPool _integerPool; - private static readonly object _poolLock; + private static readonly Lock _poolLock = new(); static SpirvGenerator() { _instructionPool = new(() => new SpvInstructionPool(), GeneratorPoolCount); _integerPool = new(() => new SpvLiteralIntegerPool(), GeneratorPoolCount); - _poolLock = new object(); } private const HelperFunctionsMask NeedsInvocationIdMask = HelperFunctionsMask.SwizzleAdd; @@ -89,8 +89,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv context.AddCapability(Capability.GeometryShaderPassthroughNV); } } - else if (parameters.Definitions.Stage == ShaderStage.TessellationControl || - parameters.Definitions.Stage == ShaderStage.TessellationEvaluation) + else if (parameters.Definitions.Stage is ShaderStage.TessellationControl or + ShaderStage.TessellationEvaluation) { context.AddCapability(Capability.Tessellation); } @@ -124,20 +124,20 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv for (int funcIndex = 0; funcIndex < info.Functions.Count; funcIndex++) { - var function = info.Functions[funcIndex]; - var retType = context.GetType(function.ReturnType); + StructuredFunction function = info.Functions[funcIndex]; + SpvInstruction retType = context.GetType(function.ReturnType); - var funcArgs = new SpvInstruction[function.InArguments.Length + function.OutArguments.Length]; + SpvInstruction[] funcArgs = new SpvInstruction[function.InArguments.Length + function.OutArguments.Length]; for (int argIndex = 0; argIndex < funcArgs.Length; argIndex++) { - var argType = context.GetType(function.GetArgumentType(argIndex)); - var argPointerType = context.TypePointer(StorageClass.Function, argType); + SpvInstruction argType = context.GetType(function.GetArgumentType(argIndex)); + SpvInstruction argPointerType = context.TypePointer(StorageClass.Function, argType); funcArgs[argIndex] = argPointerType; } - var funcType = context.TypeFunction(retType, false, funcArgs); - var spvFunc = context.Function(retType, FunctionControlMask.MaskNone, funcType); + SpvInstruction funcType = context.TypeFunction(retType, false, funcArgs); + SpvInstruction spvFunc = context.Function(retType, FunctionControlMask.MaskNone, funcType); context.DeclareFunction(funcIndex, function, spvFunc); } @@ -160,7 +160,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv private static void Generate(CodeGenContext context, StructuredProgramInfo info, int funcIndex) { - var (function, spvFunc) = context.GetFunction(funcIndex); + (StructuredFunction function, SpvInstruction spvFunc) = context.GetFunction(funcIndex); context.CurrentFunction = function; context.AddFunction(spvFunc); @@ -284,9 +284,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } else if (context.Definitions.Stage == ShaderStage.Compute) { - var localSizeX = (SpvLiteralInteger)context.Definitions.ComputeLocalSizeX; - var localSizeY = (SpvLiteralInteger)context.Definitions.ComputeLocalSizeY; - var localSizeZ = (SpvLiteralInteger)context.Definitions.ComputeLocalSizeZ; + SpvLiteralInteger localSizeX = (SpvLiteralInteger)context.Definitions.ComputeLocalSizeX; + SpvLiteralInteger localSizeY = (SpvLiteralInteger)context.Definitions.ComputeLocalSizeY; + SpvLiteralInteger localSizeZ = (SpvLiteralInteger)context.Definitions.ComputeLocalSizeZ; context.AddExecutionMode( spvFunc, @@ -307,7 +307,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { AstBlockVisitor visitor = new(block); - var loopTargets = new Dictionary(); + Dictionary loopTargets = new(); context.LoopTargets = loopTargets; @@ -329,14 +329,14 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv ifFalseBlock = mergeBlock; } - var condition = context.Get(AggregateType.Bool, e.Block.Condition); + SpvInstruction condition = context.Get(AggregateType.Bool, e.Block.Condition); context.SelectionMerge(context.GetNextLabel(mergeBlock), SelectionControlMask.MaskNone); context.BranchConditional(condition, context.GetNextLabel(ifTrueBlock), context.GetNextLabel(ifFalseBlock)); } else if (e.Block.Type == AstBlockType.DoWhile) { - var continueTarget = context.Label(); + SpvInstruction continueTarget = context.Label(); loopTargets.Add(e.Block, (context.NewBlock(), continueTarget)); @@ -357,12 +357,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv // if the condition is true. AstBlock mergeBlock = e.Block.Parent; - var (loopTarget, continueTarget) = loopTargets[e.Block]; + (SpvInstruction loopTarget, SpvInstruction continueTarget) = loopTargets[e.Block]; context.Branch(continueTarget); context.AddLabel(continueTarget); - var condition = context.Get(AggregateType.Bool, e.Block.Condition); + SpvInstruction condition = context.Get(AggregateType.Bool, e.Block.Condition); context.BranchConditional(condition, loopTarget, context.GetNextLabel(mergeBlock)); } @@ -398,16 +398,16 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { if (node is AstAssignment assignment) { - var dest = (AstOperand)assignment.Destination; + AstOperand dest = (AstOperand)assignment.Destination; if (dest.Type == OperandType.LocalVariable) { - var source = context.Get(dest.VarType, assignment.Source); + SpvInstruction source = context.Get(dest.VarType, assignment.Source); context.Store(context.GetLocalPointer(dest), source); } else if (dest.Type == OperandType.Argument) { - var source = context.Get(dest.VarType, assignment.Source); + SpvInstruction source = context.Get(dest.VarType, assignment.Source); context.Store(context.GetArgumentPointer(dest), source); } else diff --git a/src/Ryujinx.Graphics.Shader/Decoders/Block.cs b/src/Ryujinx.Graphics.Shader/Decoders/Block.cs index 1a694898b..9264d15b9 100644 --- a/src/Ryujinx.Graphics.Shader/Decoders/Block.cs +++ b/src/Ryujinx.Graphics.Shader/Decoders/Block.cs @@ -45,11 +45,11 @@ namespace Ryujinx.Graphics.Shader.Decoders { Address = address; - Predecessors = new List(); - Successors = new List(); + Predecessors = []; + Successors = []; - OpCodes = new List(); - PushOpCodes = new List(); + OpCodes = []; + PushOpCodes = []; SyncTargets = new Dictionary(); } diff --git a/src/Ryujinx.Graphics.Shader/Decoders/DecodedFunction.cs b/src/Ryujinx.Graphics.Shader/Decoders/DecodedFunction.cs index 49cd3a30a..ce702b2ab 100644 --- a/src/Ryujinx.Graphics.Shader/Decoders/DecodedFunction.cs +++ b/src/Ryujinx.Graphics.Shader/Decoders/DecodedFunction.cs @@ -17,7 +17,7 @@ namespace Ryujinx.Graphics.Shader.Decoders public DecodedFunction(ulong address) { Address = address; - _callers = new HashSet(); + _callers = []; Type = FunctionType.User; Id = -1; } diff --git a/src/Ryujinx.Graphics.Shader/Decoders/DecodedProgram.cs b/src/Ryujinx.Graphics.Shader/Decoders/DecodedProgram.cs index fdf3eacc3..be5d0a81b 100644 --- a/src/Ryujinx.Graphics.Shader/Decoders/DecodedProgram.cs +++ b/src/Ryujinx.Graphics.Shader/Decoders/DecodedProgram.cs @@ -27,7 +27,7 @@ namespace Ryujinx.Graphics.Shader.Decoders { MainFunction = mainFunction; _functions = functions; - _functionsWithId = new(); + _functionsWithId = []; AttributeUsage = attributeUsage; UsedFeatures = usedFeatures; ClipDistancesWritten = clipDistancesWritten; diff --git a/src/Ryujinx.Graphics.Shader/Decoders/Decoder.cs b/src/Ryujinx.Graphics.Shader/Decoders/Decoder.cs index 1211e561f..ac1f24218 100644 --- a/src/Ryujinx.Graphics.Shader/Decoders/Decoder.cs +++ b/src/Ryujinx.Graphics.Shader/Decoders/Decoder.cs @@ -66,7 +66,7 @@ namespace Ryujinx.Graphics.Shader.Decoders while (functionsQueue.TryDequeue(out DecodedFunction currentFunction)) { - List blocks = new(); + List blocks = []; Queue workQueue = new(); Dictionary visited = new(); @@ -392,7 +392,7 @@ namespace Ryujinx.Graphics.Shader.Decoders if (perPatch) { - if (attr >= AttributeConsts.UserAttributePerPatchBase && attr < AttributeConsts.UserAttributePerPatchEnd) + if (attr is >= AttributeConsts.UserAttributePerPatchBase and < AttributeConsts.UserAttributePerPatchEnd) { int userAttr = attr - AttributeConsts.UserAttributePerPatchBase; int index = userAttr / 16; @@ -407,7 +407,7 @@ namespace Ryujinx.Graphics.Shader.Decoders } } } - else if (attr >= AttributeConsts.UserAttributeBase && attr < AttributeConsts.UserAttributeEnd) + else if (attr is >= AttributeConsts.UserAttributeBase and < AttributeConsts.UserAttributeEnd) { int userAttr = attr - AttributeConsts.UserAttributeBase; int index = userAttr / 16; @@ -436,16 +436,18 @@ namespace Ryujinx.Graphics.Shader.Decoders switch (attr) { case AttributeConsts.Layer: - if (definitions.Stage != ShaderStage.Compute && definitions.Stage != ShaderStage.Fragment) + if (definitions.Stage is not ShaderStage.Compute and not ShaderStage.Fragment) { context.SetUsedFeature(FeatureFlags.RtLayer); } + break; case AttributeConsts.ViewportIndex: if (definitions.Stage != ShaderStage.Fragment) { context.SetUsedFeature(FeatureFlags.ViewportIndex); } + break; case AttributeConsts.ClipDistance0: case AttributeConsts.ClipDistance1: @@ -459,12 +461,14 @@ namespace Ryujinx.Graphics.Shader.Decoders { context.SetClipDistanceWritten((attr - AttributeConsts.ClipDistance0) / 4); } + break; case AttributeConsts.ViewportMask: if (definitions.Stage != ShaderStage.Fragment) { context.SetUsedFeature(FeatureFlags.ViewportMask); } + break; } } @@ -478,12 +482,14 @@ namespace Ryujinx.Graphics.Shader.Decoders { context.SetUsedFeature(FeatureFlags.FragCoordXY); } + break; case AttributeConsts.InstanceId: if (definitions.Stage == ShaderStage.Vertex) { context.SetUsedFeature(FeatureFlags.InstanceId); } + break; } } @@ -520,7 +526,7 @@ namespace Ryujinx.Graphics.Shader.Decoders if (lastOp.Name == InstName.Brx && block.Successors.Count == (hasNext ? 1 : 0)) { - HashSet visited = new(); + HashSet visited = []; InstBrx opBrx = new(lastOp.RawOpCode); ulong baseOffset = lastOp.GetAbsoluteAddress(); @@ -566,41 +572,41 @@ namespace Ryujinx.Graphics.Shader.Decoders // On a successful match, "BaseOffset" is the offset in bytes where the jump offsets are // located on the constant buffer, and "UpperBound" is the total number of offsets for the BRX, minus 1. - HashSet visited = new(); + HashSet visited = []; - var ldcLocation = FindFirstRegWrite(visited, new BlockLocation(block, block.OpCodes.Count - 1), brxReg); + BlockLocation ldcLocation = FindFirstRegWrite(visited, new BlockLocation(block, block.OpCodes.Count - 1), brxReg); if (ldcLocation.Block == null || ldcLocation.Block.OpCodes[ldcLocation.Index].Name != InstName.Ldc) { return (0, 0); } - GetOp(ldcLocation, out var opLdc); + GetOp(ldcLocation, out InstLdc opLdc); if (opLdc.CbufSlot != 1 || opLdc.AddressMode != 0) { return (0, 0); } - var shlLocation = FindFirstRegWrite(visited, ldcLocation, opLdc.SrcA); + BlockLocation shlLocation = FindFirstRegWrite(visited, ldcLocation, opLdc.SrcA); if (shlLocation.Block == null || !shlLocation.IsImmInst(InstName.Shl)) { return (0, 0); } - GetOp(shlLocation, out var opShl); + GetOp(shlLocation, out InstShlI opShl); if (opShl.Imm20 != 2) { return (0, 0); } - var imnmxLocation = FindFirstRegWrite(visited, shlLocation, opShl.SrcA); + BlockLocation imnmxLocation = FindFirstRegWrite(visited, shlLocation, opShl.SrcA); if (imnmxLocation.Block == null || !imnmxLocation.IsImmInst(InstName.Imnmx)) { return (0, 0); } - GetOp(imnmxLocation, out var opImnmx); + GetOp(imnmxLocation, out InstImnmxI opImnmx); if (opImnmx.Signed || opImnmx.SrcPred != RegisterConsts.PredicateTrueIndex || opImnmx.SrcPredInv) { @@ -640,7 +646,7 @@ namespace Ryujinx.Graphics.Shader.Decoders toVisit.Enqueue(location); visited.Add(location.Block); - while (toVisit.TryDequeue(out var currentLocation)) + while (toVisit.TryDequeue(out BlockLocation currentLocation)) { Block block = currentLocation.Block; for (int i = currentLocation.Index - 1; i >= 0; i--) @@ -752,7 +758,7 @@ namespace Ryujinx.Graphics.Shader.Decoders Block target = blocks[pushOp.GetAbsoluteAddress()]; Stack workQueue = new(); - HashSet visited = new(); + HashSet visited = []; Stack<(ulong, MergeType)> branchStack = new(); void Push(PathBlockState pbs) @@ -879,7 +885,7 @@ namespace Ryujinx.Graphics.Shader.Decoders public static bool IsPopBranch(InstName name) { - return name == InstName.Brk || name == InstName.Cont || name == InstName.Sync; + return name is InstName.Brk or InstName.Cont or InstName.Sync; } private static MergeType GetMergeTypeFromPush(InstName name) diff --git a/src/Ryujinx.Graphics.Shader/Instructions/AttributeMap.cs b/src/Ryujinx.Graphics.Shader/Instructions/AttributeMap.cs index 54705acaf..b89502e16 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/AttributeMap.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/AttributeMap.cs @@ -1,6 +1,7 @@ using Ryujinx.Graphics.Shader.IntermediateRepresentation; using Ryujinx.Graphics.Shader.Translation; using System.Collections.Generic; +using System.Collections.ObjectModel; using static Ryujinx.Graphics.Shader.IntermediateRepresentation.OperandHelper; namespace Ryujinx.Graphics.Shader.Instructions @@ -46,8 +47,8 @@ namespace Ryujinx.Graphics.Shader.Instructions } } - private static readonly IReadOnlyDictionary _attributes; - private static readonly IReadOnlyDictionary _attributesPerPatch; + private static readonly ReadOnlyDictionary _attributes; + private static readonly ReadOnlyDictionary _attributesPerPatch; static AttributeMap() { @@ -55,9 +56,9 @@ namespace Ryujinx.Graphics.Shader.Instructions _attributesPerPatch = CreatePerPatchMap(); } - private static IReadOnlyDictionary CreateMap() + private static ReadOnlyDictionary CreateMap() { - var map = new Dictionary(); + Dictionary map = new(); Add(map, 0x060, AggregateType.S32, IoVariable.PrimitiveId, StagesMask.TessellationGeometryFragment, StagesMask.Geometry); Add(map, 0x064, AggregateType.S32, IoVariable.Layer, StagesMask.Fragment, StagesMask.VertexTessellationGeometry); @@ -79,18 +80,18 @@ namespace Ryujinx.Graphics.Shader.Instructions Add(map, 0x3a0, AggregateType.Array | AggregateType.S32, IoVariable.ViewportMask, StagesMask.Fragment, StagesMask.VertexTessellationGeometry); Add(map, 0x3fc, AggregateType.Bool, IoVariable.FrontFacing, StagesMask.Fragment, StagesMask.None); - return map; + return map.AsReadOnly(); } - private static IReadOnlyDictionary CreatePerPatchMap() + private static ReadOnlyDictionary CreatePerPatchMap() { - var map = new Dictionary(); + Dictionary map = new(); Add(map, 0x000, AggregateType.Vector4 | AggregateType.FP32, IoVariable.TessellationLevelOuter, StagesMask.TessellationEvaluation, StagesMask.TessellationControl); Add(map, 0x010, AggregateType.Vector2 | AggregateType.FP32, IoVariable.TessellationLevelInner, StagesMask.TessellationEvaluation, StagesMask.TessellationControl); Add(map, 0x018, AggregateType.Vector4 | AggregateType.FP32, IoVariable.UserDefined, StagesMask.TessellationEvaluation, StagesMask.TessellationControl, 31, 0x200); - return map; + return map.AsReadOnly(); } private static void Add( @@ -326,9 +327,9 @@ namespace Ryujinx.Graphics.Shader.Instructions return false; } - return stage == ShaderStage.TessellationControl || - stage == ShaderStage.TessellationEvaluation || - stage == ShaderStage.Geometry; + return stage is ShaderStage.TessellationControl or + ShaderStage.TessellationEvaluation or + ShaderStage.Geometry; } public static bool HasInvocationId(ShaderStage stage, bool isOutput) diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmit.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmit.cs index 0c2f90b7e..d77621db6 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmit.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmit.cs @@ -331,7 +331,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { context.GetOp(); - context.TranslatorContext.GpuAccessor.Log("Shader instruction Votevtg is not implemented."); + // This instruction is proprietary and will not be implemented. Commenting it out to avoid false reports. + //context.TranslatorContext.GpuAccessor.Log("Shader instruction Votevtg is not implemented."); } public static void Vset(EmitterContext context) diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitAttribute.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitAttribute.cs index c704156bc..2b6647cd2 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitAttribute.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitAttribute.cs @@ -164,7 +164,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { isFixedFunc = TryFixedFuncToUserAttributeIpa(context, op.Imm10, out res); - if (op.Imm10 >= AttributeConsts.UserAttributeBase && op.Imm10 < AttributeConsts.UserAttributeEnd) + if (op.Imm10 is >= AttributeConsts.UserAttributeBase and < AttributeConsts.UserAttributeEnd) { int index = (op.Imm10 - AttributeConsts.UserAttributeBase) >> 4; @@ -173,7 +173,7 @@ namespace Ryujinx.Graphics.Shader.Instructions res = context.FPMultiply(res, context.Load(StorageKind.Input, IoVariable.FragmentCoord, null, Const(3))); } } - else if (op.Imm10 == AttributeConsts.PositionX || op.Imm10 == AttributeConsts.PositionY) + else if (op.Imm10 is AttributeConsts.PositionX or AttributeConsts.PositionY) { // FragCoord X/Y must be divided by the render target scale, if resolution scaling is active, // because the shader code is not expecting scaled values. @@ -261,7 +261,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { if (context.TranslatorContext.Definitions.LastInVertexPipeline) { - context.PrepareForVertexReturn(out var tempXLocal, out var tempYLocal, out var tempZLocal); + context.PrepareForVertexReturn(out Operand tempXLocal, out Operand tempYLocal, out Operand tempZLocal); context.EmitVertex(); @@ -296,19 +296,19 @@ namespace Ryujinx.Graphics.Shader.Instructions private static bool HasPrimitiveVertex(int attr) { - return attr != AttributeConsts.PrimitiveId && - attr != AttributeConsts.TessCoordX && - attr != AttributeConsts.TessCoordY; + return attr is not AttributeConsts.PrimitiveId and + not AttributeConsts.TessCoordX and + not AttributeConsts.TessCoordY; } private static bool CanLoadOutput(int attr) { - return attr != AttributeConsts.TessCoordX && attr != AttributeConsts.TessCoordY; + return attr is not AttributeConsts.TessCoordX and not AttributeConsts.TessCoordY; } private static bool TryFixedFuncToUserAttributeIpa(EmitterContext context, int attr, out Operand selectedAttr) { - if (attr >= AttributeConsts.FrontColorDiffuseR && attr < AttributeConsts.BackColorDiffuseR) + if (attr is >= AttributeConsts.FrontColorDiffuseR and < AttributeConsts.BackColorDiffuseR) { // TODO: If two sided rendering is enabled, then this should return // FrontColor if the fragment is front facing, and back color otherwise. @@ -321,12 +321,12 @@ namespace Ryujinx.Graphics.Shader.Instructions selectedAttr = GenerateIpaLoad(context, FixedFuncToUserAttribute(context.TranslatorContext, attr, isOutput: false)); return true; } - else if (attr >= AttributeConsts.BackColorDiffuseR && attr < AttributeConsts.ClipDistance0) + else if (attr is >= AttributeConsts.BackColorDiffuseR and < AttributeConsts.ClipDistance0) { selectedAttr = ConstF(((attr >> 2) & 3) == 3 ? 1f : 0f); return true; } - else if (attr >= AttributeConsts.TexCoordBase && attr < AttributeConsts.TexCoordEnd) + else if (attr is >= AttributeConsts.TexCoordBase and < AttributeConsts.TexCoordEnd) { selectedAttr = GenerateIpaLoad(context, FixedFuncToUserAttribute(context.TranslatorContext, attr, isOutput: false)); return true; @@ -355,11 +355,11 @@ namespace Ryujinx.Graphics.Shader.Instructions { attr = FixedFuncToUserAttribute(translatorContext, attr, AttributeConsts.FogCoord, fixedStartAttr, isOutput); } - else if (attr >= AttributeConsts.FrontColorDiffuseR && attr < AttributeConsts.ClipDistance0) + else if (attr is >= AttributeConsts.FrontColorDiffuseR and < AttributeConsts.ClipDistance0) { attr = FixedFuncToUserAttribute(translatorContext, attr, AttributeConsts.FrontColorDiffuseR, fixedStartAttr + 1, isOutput); } - else if (attr >= AttributeConsts.TexCoordBase && attr < AttributeConsts.TexCoordEnd) + else if (attr is >= AttributeConsts.TexCoordBase and < AttributeConsts.TexCoordEnd) { attr = FixedFuncToUserAttribute(translatorContext, attr, AttributeConsts.TexCoordBase, fixedStartAttr + 5, isOutput); } diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitBitfield.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitBitfield.cs index 3a8419698..97b08aefd 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitBitfield.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitBitfield.cs @@ -13,8 +13,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstBfeR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitBfe(context, srcA, srcB, op.Dest, op.Brev, op.Signed); } @@ -23,8 +23,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstBfeI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitBfe(context, srcA, srcB, op.Dest, op.Brev, op.Signed); } @@ -33,8 +33,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstBfeC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitBfe(context, srcA, srcB, op.Dest, op.Brev, op.Signed); } @@ -43,9 +43,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstBfiR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitBfi(context, srcA, srcB, srcC, op.Dest); } @@ -54,9 +54,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstBfiI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcC = GetSrcReg(context, op.SrcC); EmitBfi(context, srcA, srcB, srcC, op.Dest); } @@ -65,9 +65,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstBfiC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcC = GetSrcReg(context, op.SrcC); EmitBfi(context, srcA, srcB, srcC, op.Dest); } @@ -76,9 +76,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstBfiRc op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcC); - var srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcC); + Operand srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitBfi(context, srcA, srcB, srcC, op.Dest); } diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitConversion.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitConversion.cs index e7e0fba92..4b917c1eb 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitConversion.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitConversion.cs @@ -14,7 +14,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstF2fR op = context.GetOp(); - var src = UnpackReg(context, op.SrcFmt, op.Sh, op.SrcB); + Operand src = UnpackReg(context, op.SrcFmt, op.Sh, op.SrcB); EmitF2F(context, op.SrcFmt, op.DstFmt, op.RoundMode, src, op.Dest, op.AbsB, op.NegB, op.Sat); } @@ -23,7 +23,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstF2fI op = context.GetOp(); - var src = UnpackImm(context, op.SrcFmt, op.Sh, Imm20ToFloat(op.Imm20)); + Operand src = UnpackImm(context, op.SrcFmt, op.Sh, Imm20ToFloat(op.Imm20)); EmitF2F(context, op.SrcFmt, op.DstFmt, op.RoundMode, src, op.Dest, op.AbsB, op.NegB, op.Sat); } @@ -32,7 +32,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstF2fC op = context.GetOp(); - var src = UnpackCbuf(context, op.SrcFmt, op.Sh, op.CbufSlot, op.CbufOffset); + Operand src = UnpackCbuf(context, op.SrcFmt, op.Sh, op.CbufSlot, op.CbufOffset); EmitF2F(context, op.SrcFmt, op.DstFmt, op.RoundMode, src, op.Dest, op.AbsB, op.NegB, op.Sat); } @@ -41,7 +41,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstF2iR op = context.GetOp(); - var src = UnpackReg(context, op.SrcFmt, op.Sh, op.SrcB); + Operand src = UnpackReg(context, op.SrcFmt, op.Sh, op.SrcB); EmitF2I(context, op.SrcFmt, op.IDstFmt, op.RoundMode, src, op.Dest, op.AbsB, op.NegB); } @@ -50,7 +50,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstF2iI op = context.GetOp(); - var src = UnpackImm(context, op.SrcFmt, op.Sh, Imm20ToFloat(op.Imm20)); + Operand src = UnpackImm(context, op.SrcFmt, op.Sh, Imm20ToFloat(op.Imm20)); EmitF2I(context, op.SrcFmt, op.IDstFmt, op.RoundMode, src, op.Dest, op.AbsB, op.NegB); } @@ -59,7 +59,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstF2iC op = context.GetOp(); - var src = UnpackCbuf(context, op.SrcFmt, op.Sh, op.CbufSlot, op.CbufOffset); + Operand src = UnpackCbuf(context, op.SrcFmt, op.Sh, op.CbufSlot, op.CbufOffset); EmitF2I(context, op.SrcFmt, op.IDstFmt, op.RoundMode, src, op.Dest, op.AbsB, op.NegB); } @@ -68,7 +68,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstI2fR op = context.GetOp(); - var src = GetSrcReg(context, op.SrcB); + Operand src = GetSrcReg(context, op.SrcB); EmitI2F(context, op.ISrcFmt, op.DstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB); } @@ -77,7 +77,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstI2fI op = context.GetOp(); - var src = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand src = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitI2F(context, op.ISrcFmt, op.DstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB); } @@ -86,7 +86,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstI2fC op = context.GetOp(); - var src = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand src = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitI2F(context, op.ISrcFmt, op.DstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB); } @@ -95,7 +95,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstI2iR op = context.GetOp(); - var src = GetSrcReg(context, op.SrcB); + Operand src = GetSrcReg(context, op.SrcB); EmitI2I(context, op.ISrcFmt, op.IDstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB, op.Sat, op.WriteCC); } @@ -104,7 +104,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstI2iI op = context.GetOp(); - var src = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand src = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitI2I(context, op.ISrcFmt, op.IDstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB, op.Sat, op.WriteCC); } @@ -113,7 +113,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstI2iC op = context.GetOp(); - var src = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand src = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitI2I(context, op.ISrcFmt, op.IDstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB, op.Sat, op.WriteCC); } @@ -179,8 +179,8 @@ namespace Ryujinx.Graphics.Shader.Instructions Instruction fpType = srcType.ToInstFPType(); - bool isSignedInt = dstType == IDstFmt.S16 || dstType == IDstFmt.S32 || dstType == IDstFmt.S64; - bool isSmallInt = dstType == IDstFmt.U16 || dstType == IDstFmt.S16; + bool isSignedInt = dstType is IDstFmt.S16 or IDstFmt.S32 or IDstFmt.S64; + bool isSmallInt = dstType is IDstFmt.U16 or IDstFmt.S16; Operand srcB = context.FPAbsNeg(src, absolute, negate, fpType); @@ -242,15 +242,15 @@ namespace Ryujinx.Graphics.Shader.Instructions bool negate) { bool isSignedInt = - srcType == ISrcFmt.S8 || - srcType == ISrcFmt.S16 || - srcType == ISrcFmt.S32 || - srcType == ISrcFmt.S64; + srcType is ISrcFmt.S8 or + ISrcFmt.S16 or + ISrcFmt.S32 or + ISrcFmt.S64; bool isSmallInt = - srcType == ISrcFmt.U16 || - srcType == ISrcFmt.S16 || - srcType == ISrcFmt.U8 || - srcType == ISrcFmt.S8; + srcType is ISrcFmt.U16 or + ISrcFmt.S16 or + ISrcFmt.U8 or + ISrcFmt.S8; // TODO: Handle S/U64. @@ -258,7 +258,7 @@ namespace Ryujinx.Graphics.Shader.Instructions if (isSmallInt) { - int size = srcType == ISrcFmt.U16 || srcType == ISrcFmt.S16 ? 16 : 8; + int size = srcType is ISrcFmt.U16 or ISrcFmt.S16 ? 16 : 8; srcB = isSignedInt ? context.BitfieldExtractS32(srcB, Const((int)byteSelection * 8), Const(size)) @@ -302,22 +302,22 @@ namespace Ryujinx.Graphics.Shader.Instructions } bool srcIsSignedInt = - srcType == ISrcDstFmt.S8 || - srcType == ISrcDstFmt.S16 || - srcType == ISrcDstFmt.S32; + srcType is ISrcDstFmt.S8 or + ISrcDstFmt.S16 or + ISrcDstFmt.S32; bool dstIsSignedInt = - dstType == ISrcDstFmt.S8 || - dstType == ISrcDstFmt.S16 || - dstType == ISrcDstFmt.S32; + dstType is ISrcDstFmt.S8 or + ISrcDstFmt.S16 or + ISrcDstFmt.S32; bool srcIsSmallInt = - srcType == ISrcDstFmt.U16 || - srcType == ISrcDstFmt.S16 || - srcType == ISrcDstFmt.U8 || - srcType == ISrcDstFmt.S8; + srcType is ISrcDstFmt.U16 or + ISrcDstFmt.S16 or + ISrcDstFmt.U8 or + ISrcDstFmt.S8; if (srcIsSmallInt) { - int size = srcType == ISrcDstFmt.U16 || srcType == ISrcDstFmt.S16 ? 16 : 8; + int size = srcType is ISrcDstFmt.U16 or ISrcDstFmt.S16 ? 16 : 8; src = srcIsSignedInt ? context.BitfieldExtractS32(src, Const((int)byteSelection * 8), Const(size)) diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatArithmetic.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatArithmetic.cs index 04dbd20eb..7d974a370 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatArithmetic.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatArithmetic.cs @@ -13,8 +13,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDaddR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcReg(context, op.SrcB, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcReg(context, op.SrcB, isFP64: true); EmitFadd(context, Instruction.FP64, srcA, srcB, op.Dest, op.NegA, op.NegB, op.AbsA, op.AbsB, false, op.WriteCC); } @@ -23,8 +23,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDaddI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); EmitFadd(context, Instruction.FP64, srcA, srcB, op.Dest, op.NegA, op.NegB, op.AbsA, op.AbsB, false, op.WriteCC); } @@ -33,8 +33,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDaddC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); EmitFadd(context, Instruction.FP64, srcA, srcB, op.Dest, op.NegA, op.NegB, op.AbsA, op.AbsB, false, op.WriteCC); } @@ -43,9 +43,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDfmaR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcReg(context, op.SrcB, isFP64: true); - var srcC = GetSrcReg(context, op.SrcC, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcReg(context, op.SrcB, isFP64: true); + Operand srcC = GetSrcReg(context, op.SrcC, isFP64: true); EmitFfma(context, Instruction.FP64, srcA, srcB, srcC, op.Dest, op.NegA, op.NegC, false, op.WriteCC); } @@ -54,9 +54,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDfmaI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); - var srcC = GetSrcReg(context, op.SrcC, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); + Operand srcC = GetSrcReg(context, op.SrcC, isFP64: true); EmitFfma(context, Instruction.FP64, srcA, srcB, srcC, op.Dest, op.NegA, op.NegC, false, op.WriteCC); } @@ -65,9 +65,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDfmaC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); - var srcC = GetSrcReg(context, op.SrcC, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); + Operand srcC = GetSrcReg(context, op.SrcC, isFP64: true); EmitFfma(context, Instruction.FP64, srcA, srcB, srcC, op.Dest, op.NegA, op.NegC, false, op.WriteCC); } @@ -76,9 +76,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDfmaRc op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcReg(context, op.SrcC, isFP64: true); - var srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcReg(context, op.SrcC, isFP64: true); + Operand srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); EmitFfma(context, Instruction.FP64, srcA, srcB, srcC, op.Dest, op.NegA, op.NegC, false, op.WriteCC); } @@ -87,8 +87,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDmulR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcReg(context, op.SrcB, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcReg(context, op.SrcB, isFP64: true); EmitFmul(context, Instruction.FP64, MultiplyScale.NoScale, srcA, srcB, op.Dest, op.NegA, false, op.WriteCC); } @@ -97,8 +97,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDmulI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); EmitFmul(context, Instruction.FP64, MultiplyScale.NoScale, srcA, srcB, op.Dest, op.NegA, false, op.WriteCC); } @@ -107,8 +107,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDmulC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); EmitFmul(context, Instruction.FP64, MultiplyScale.NoScale, srcA, srcB, op.Dest, op.NegA, false, op.WriteCC); } @@ -117,8 +117,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFaddR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitFadd(context, Instruction.FP32, srcA, srcB, op.Dest, op.NegA, op.NegB, op.AbsA, op.AbsB, op.Sat, op.WriteCC); } @@ -127,8 +127,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFaddI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); EmitFadd(context, Instruction.FP32, srcA, srcB, op.Dest, op.NegA, op.NegB, op.AbsA, op.AbsB, op.Sat, op.WriteCC); } @@ -137,8 +137,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFaddC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitFadd(context, Instruction.FP32, srcA, srcB, op.Dest, op.NegA, op.NegB, op.AbsA, op.AbsB, op.Sat, op.WriteCC); } @@ -147,8 +147,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFadd32i op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, op.Imm32); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, op.Imm32); EmitFadd(context, Instruction.FP32, srcA, srcB, op.Dest, op.NegA, op.NegB, op.AbsA, op.AbsB, false, op.WriteCC); } @@ -157,9 +157,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFfmaR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitFfma(context, Instruction.FP32, srcA, srcB, srcC, op.Dest, op.NegA, op.NegC, op.Sat, op.WriteCC); } @@ -168,9 +168,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFfmaI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); + Operand srcC = GetSrcReg(context, op.SrcC); EmitFfma(context, Instruction.FP32, srcA, srcB, srcC, op.Dest, op.NegA, op.NegC, op.Sat, op.WriteCC); } @@ -179,9 +179,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFfmaC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcC = GetSrcReg(context, op.SrcC); EmitFfma(context, Instruction.FP32, srcA, srcB, srcC, op.Dest, op.NegA, op.NegC, op.Sat, op.WriteCC); } @@ -190,9 +190,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFfmaRc op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcC); - var srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcC); + Operand srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitFfma(context, Instruction.FP32, srcA, srcB, srcC, op.Dest, op.NegA, op.NegC, op.Sat, op.WriteCC); } @@ -201,9 +201,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFfma32i op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, op.Imm32); - var srcC = GetSrcReg(context, op.Dest); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, op.Imm32); + Operand srcC = GetSrcReg(context, op.Dest); EmitFfma(context, Instruction.FP32, srcA, srcB, srcC, op.Dest, op.NegA, op.NegC, op.Sat, op.WriteCC); } @@ -212,8 +212,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFmulR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitFmul(context, Instruction.FP32, op.Scale, srcA, srcB, op.Dest, op.NegA, op.Sat, op.WriteCC); } @@ -222,8 +222,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFmulI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); EmitFmul(context, Instruction.FP32, op.Scale, srcA, srcB, op.Dest, op.NegA, op.Sat, op.WriteCC); } @@ -232,8 +232,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFmulC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitFmul(context, Instruction.FP32, op.Scale, srcA, srcB, op.Dest, op.NegA, op.Sat, op.WriteCC); } @@ -242,8 +242,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFmul32i op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, op.Imm32); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, op.Imm32); EmitFmul(context, Instruction.FP32, MultiplyScale.NoScale, srcA, srcB, op.Dest, false, op.Sat, op.WriteCC); } @@ -252,8 +252,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHadd2R op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); - var srcB = GetHalfSrc(context, op.BSwizzle, op.SrcB, op.NegB, op.AbsB); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); + Operand[] srcB = GetHalfSrc(context, op.BSwizzle, op.SrcB, op.NegB, op.AbsB); EmitHadd2Hmul2(context, op.OFmt, srcA, srcB, isAdd: true, op.Dest, op.Sat); } @@ -262,8 +262,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHadd2I op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); - var srcB = GetHalfSrc(context, op.BimmH0, op.BimmH1); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); + Operand[] srcB = GetHalfSrc(context, op.BimmH0, op.BimmH1); EmitHadd2Hmul2(context, op.OFmt, srcA, srcB, isAdd: true, op.Dest, op.Sat); } @@ -272,8 +272,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHadd2C op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); - var srcB = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegB, op.AbsB); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); + Operand[] srcB = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegB, op.AbsB); EmitHadd2Hmul2(context, op.OFmt, srcA, srcB, isAdd: true, op.Dest, op.Sat); } @@ -282,8 +282,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHadd232i op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, false); - var srcB = GetHalfSrc(context, op.Imm); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, false); + Operand[] srcB = GetHalfSrc(context, op.Imm); EmitHadd2Hmul2(context, OFmt.F16, srcA, srcB, isAdd: true, op.Dest, op.Sat); } @@ -292,9 +292,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHfma2R op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); - var srcB = GetHalfSrc(context, op.BSwizzle, op.SrcB, op.NegA, false); - var srcC = GetHalfSrc(context, op.CSwizzle, op.SrcC, op.NegC, false); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); + Operand[] srcB = GetHalfSrc(context, op.BSwizzle, op.SrcB, op.NegA, false); + Operand[] srcC = GetHalfSrc(context, op.CSwizzle, op.SrcC, op.NegC, false); EmitHfma2(context, op.OFmt, srcA, srcB, srcC, op.Dest, op.Sat); } @@ -303,9 +303,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHfma2I op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); - var srcB = GetHalfSrc(context, op.BimmH0, op.BimmH1); - var srcC = GetHalfSrc(context, op.CSwizzle, op.SrcC, op.NegC, false); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); + Operand[] srcB = GetHalfSrc(context, op.BimmH0, op.BimmH1); + Operand[] srcC = GetHalfSrc(context, op.CSwizzle, op.SrcC, op.NegC, false); EmitHfma2(context, op.OFmt, srcA, srcB, srcC, op.Dest, op.Sat); } @@ -314,9 +314,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHfma2C op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); - var srcB = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegA, false); - var srcC = GetHalfSrc(context, op.CSwizzle, op.SrcC, op.NegC, false); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); + Operand[] srcB = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegA, false); + Operand[] srcC = GetHalfSrc(context, op.CSwizzle, op.SrcC, op.NegC, false); EmitHfma2(context, op.OFmt, srcA, srcB, srcC, op.Dest, op.Sat); } @@ -325,9 +325,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHfma2Rc op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); - var srcB = GetHalfSrc(context, op.CSwizzle, op.SrcC, op.NegA, false); - var srcC = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegC, false); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); + Operand[] srcB = GetHalfSrc(context, op.CSwizzle, op.SrcC, op.NegA, false); + Operand[] srcC = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegC, false); EmitHfma2(context, op.OFmt, srcA, srcB, srcC, op.Dest, op.Sat); } @@ -336,9 +336,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHfma232i op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); - var srcB = GetHalfSrc(context, op.Imm); - var srcC = GetHalfSrc(context, HalfSwizzle.F16, op.Dest, op.NegC, false); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); + Operand[] srcB = GetHalfSrc(context, op.Imm); + Operand[] srcC = GetHalfSrc(context, HalfSwizzle.F16, op.Dest, op.NegC, false); EmitHfma2(context, OFmt.F16, srcA, srcB, srcC, op.Dest, saturate: false); } @@ -347,8 +347,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHmul2R op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, op.AbsA); - var srcB = GetHalfSrc(context, op.BSwizzle, op.SrcB, op.NegA, op.AbsB); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, op.AbsA); + Operand[] srcB = GetHalfSrc(context, op.BSwizzle, op.SrcB, op.NegA, op.AbsB); EmitHadd2Hmul2(context, op.OFmt, srcA, srcB, isAdd: false, op.Dest, op.Sat); } @@ -357,8 +357,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHmul2I op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); - var srcB = GetHalfSrc(context, op.BimmH0, op.BimmH1); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); + Operand[] srcB = GetHalfSrc(context, op.BimmH0, op.BimmH1); EmitHadd2Hmul2(context, op.OFmt, srcA, srcB, isAdd: false, op.Dest, op.Sat); } @@ -367,8 +367,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHmul2C op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, op.AbsA); - var srcB = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegA, op.AbsB); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, op.AbsA); + Operand[] srcB = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegA, op.AbsB); EmitHadd2Hmul2(context, op.OFmt, srcA, srcB, isAdd: false, op.Dest, op.Sat); } @@ -377,8 +377,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHmul232i op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); - var srcB = GetHalfSrc(context, op.Imm32); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, false, false); + Operand[] srcB = GetHalfSrc(context, op.Imm32); EmitHadd2Hmul2(context, OFmt.F16, srcA, srcB, isAdd: false, op.Dest, op.Sat); } diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatComparison.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatComparison.cs index 59ad7a5de..e70afd74c 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatComparison.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatComparison.cs @@ -14,8 +14,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDsetR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcReg(context, op.SrcB, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcReg(context, op.SrcB, isFP64: true); EmitFset( context, @@ -39,8 +39,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDsetI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); EmitFset( context, @@ -64,8 +64,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDsetC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); EmitFset( context, @@ -89,8 +89,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDsetpR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcReg(context, op.SrcB, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcReg(context, op.SrcB, isFP64: true); EmitFsetp( context, @@ -114,8 +114,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDsetpI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); EmitFsetp( context, @@ -139,8 +139,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDsetpC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); EmitFsetp( context, @@ -164,9 +164,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFcmpR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitFcmp(context, op.FComp, srcA, srcB, srcC, op.Dest); } @@ -175,9 +175,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFcmpI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); + Operand srcC = GetSrcReg(context, op.SrcC); EmitFcmp(context, op.FComp, srcA, srcB, srcC, op.Dest); } @@ -186,9 +186,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFcmpC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcC = GetSrcReg(context, op.SrcC); EmitFcmp(context, op.FComp, srcA, srcB, srcC, op.Dest); } @@ -197,9 +197,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFcmpRc op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcC); - var srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcC); + Operand srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitFcmp(context, op.FComp, srcA, srcB, srcC, op.Dest); } @@ -208,8 +208,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFsetR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitFset(context, op.FComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.BVal, op.WriteCC); } @@ -218,8 +218,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFsetC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitFset(context, op.FComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.BVal, op.WriteCC); } @@ -228,8 +228,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFsetI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); EmitFset(context, op.FComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.BVal, op.WriteCC); } @@ -238,8 +238,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFsetpR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitFsetp( context, @@ -262,8 +262,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFsetpI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); EmitFsetp( context, @@ -286,8 +286,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFsetpC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitFsetp( context, @@ -310,8 +310,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHset2R op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); - var srcB = GetHalfSrc(context, op.BSwizzle, op.SrcB, op.NegB, op.AbsB); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); + Operand[] srcB = GetHalfSrc(context, op.BSwizzle, op.SrcB, op.NegB, op.AbsB); EmitHset2(context, op.Cmp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.Dest, op.Bval); } @@ -320,8 +320,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHset2I op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); - var srcB = GetHalfSrc(context, op.BimmH0, op.BimmH1); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); + Operand[] srcB = GetHalfSrc(context, op.BimmH0, op.BimmH1); EmitHset2(context, op.Cmp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.Dest, op.Bval); } @@ -330,8 +330,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHset2C op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); - var srcB = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegB, false); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); + Operand[] srcB = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegB, false); EmitHset2(context, op.Cmp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.Dest, op.Bval); } @@ -340,8 +340,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHsetp2R op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); - var srcB = GetHalfSrc(context, op.BSwizzle, op.SrcB, op.NegB, op.AbsB); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); + Operand[] srcB = GetHalfSrc(context, op.BSwizzle, op.SrcB, op.NegB, op.AbsB); EmitHsetp2(context, op.FComp2, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.DestPred, op.DestPredInv, op.HAnd); } @@ -350,8 +350,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHsetp2I op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); - var srcB = GetHalfSrc(context, op.BimmH0, op.BimmH1); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); + Operand[] srcB = GetHalfSrc(context, op.BimmH0, op.BimmH1); EmitHsetp2(context, op.FComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.DestPred, op.DestPredInv, op.HAnd); } @@ -360,8 +360,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstHsetp2C op = context.GetOp(); - var srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); - var srcB = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegB, op.AbsB); + Operand[] srcA = GetHalfSrc(context, op.ASwizzle, op.SrcA, op.NegA, op.AbsA); + Operand[] srcB = GetHalfSrc(context, HalfSwizzle.F32, op.CbufSlot, op.CbufOffset, op.NegB, op.AbsB); EmitHsetp2(context, op.FComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.DestPred, op.DestPredInv, op.HAnd); } @@ -534,7 +534,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { res = Const(IrConsts.False); } - else if (cond == FComp.Nan || cond == FComp.Num) + else if (cond is FComp.Nan or FComp.Num) { res = context.BitwiseOr(context.IsNan(srcA, fpType), context.IsNan(srcB, fpType)); @@ -545,7 +545,7 @@ namespace Ryujinx.Graphics.Shader.Instructions } else { - var inst = (cond & ~FComp.Nan) switch + Instruction inst = (cond & ~FComp.Nan) switch { FComp.Lt => Instruction.CompareLess, FComp.Eq => Instruction.CompareEqual, diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatMinMax.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatMinMax.cs index 5757e4fb0..4a3337bca 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatMinMax.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFloatMinMax.cs @@ -13,9 +13,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDmnmxR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcReg(context, op.SrcB, isFP64: true); - var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcReg(context, op.SrcB, isFP64: true); + Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); EmitFmnmx(context, srcA, srcB, srcPred, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.WriteCC, isFP64: true); } @@ -24,9 +24,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDmnmxI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); - var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20), isFP64: true); + Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); EmitFmnmx(context, srcA, srcB, srcPred, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.WriteCC, isFP64: true); } @@ -35,9 +35,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstDmnmxC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA, isFP64: true); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); - var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); + Operand srcA = GetSrcReg(context, op.SrcA, isFP64: true); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset, isFP64: true); + Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); EmitFmnmx(context, srcA, srcB, srcPred, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.WriteCC, isFP64: true); } @@ -46,9 +46,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFmnmxR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); EmitFmnmx(context, srcA, srcB, srcPred, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.WriteCC); } @@ -57,9 +57,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFmnmxI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); - var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToFloat(op.Imm20)); + Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); EmitFmnmx(context, srcA, srcB, srcPred, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.WriteCC); } @@ -68,9 +68,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstFmnmxC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); EmitFmnmx(context, srcA, srcB, srcPred, op.Dest, op.AbsA, op.AbsB, op.NegA, op.NegB, op.WriteCC); } diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs index 803aaa62d..e86328868 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitFlowControl.cs @@ -39,13 +39,13 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand address = context.IAdd(Register(op.SrcA, RegisterType.Gpr), Const(offset)); - var targets = context.CurrBlock.Successors.Skip(startIndex); + IEnumerable targets = context.CurrBlock.Successors.Skip(startIndex); bool allTargetsSinglePred = true; int total = context.CurrBlock.Successors.Count - startIndex; int count = 0; - foreach (var target in targets.OrderBy(x => x.Address)) + foreach (Block target in targets.OrderBy(x => x.Address)) { if (++count < total && (target.Predecessors.Count > 1 || target.Address <= context.CurrBlock.Address)) { @@ -64,7 +64,7 @@ namespace Ryujinx.Graphics.Shader.Instructions // since it will be too late to insert a label, but this is something that can be improved // in the future if necessary. - var sortedTargets = targets.OrderBy(x => x.Address); + IOrderedEnumerable sortedTargets = targets.OrderBy(x => x.Address); Block currentTarget = null; ulong firstTargetAddress = 0; @@ -93,7 +93,7 @@ namespace Ryujinx.Graphics.Shader.Instructions // Emit the branches sequentially. // This generates slightly worse code, but should work for all cases. - var sortedTargets = targets.OrderByDescending(x => x.Address); + IOrderedEnumerable sortedTargets = targets.OrderByDescending(x => x.Address); ulong lastTargetAddress = ulong.MaxValue; count = 0; @@ -238,7 +238,7 @@ namespace Ryujinx.Graphics.Shader.Instructions private static void EmitPbkPcntSsy(EmitterContext context) { - var consumers = context.CurrBlock.PushOpCodes.First(x => x.Op.Address == context.CurrOp.Address).Consumers; + Dictionary consumers = context.CurrBlock.PushOpCodes.First(x => x.Op.Address == context.CurrOp.Address).Consumers; foreach (KeyValuePair kv in consumers) { @@ -253,7 +253,7 @@ namespace Ryujinx.Graphics.Shader.Instructions private static void EmitBrkContSync(EmitterContext context) { - var targets = context.CurrBlock.SyncTargets; + Dictionary targets = context.CurrBlock.SyncTargets; if (targets.Count == 1) { diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitHelper.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitHelper.cs index 8638fb8f2..d3623ff6f 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitHelper.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitHelper.cs @@ -107,11 +107,11 @@ namespace Ryujinx.Graphics.Shader.Instructions ushort low = (ushort)(immH0 << 6); ushort high = (ushort)(immH1 << 6); - return new Operand[] - { + return + [ ConstF((float)Unsafe.As(ref low)), - ConstF((float)Unsafe.As(ref high)), - }; + ConstF((float)Unsafe.As(ref high)) + ]; } public static Operand[] GetHalfSrc(EmitterContext context, int imm32) @@ -119,11 +119,11 @@ namespace Ryujinx.Graphics.Shader.Instructions ushort low = (ushort)imm32; ushort high = (ushort)(imm32 >> 16); - return new Operand[] - { + return + [ ConstF((float)Unsafe.As(ref low)), - ConstF((float)Unsafe.As(ref high)), - }; + ConstF((float)Unsafe.As(ref high)) + ]; } public static Operand[] FPAbsNeg(EmitterContext context, Operand[] operands, bool abs, bool neg) @@ -140,22 +140,22 @@ namespace Ryujinx.Graphics.Shader.Instructions { return swizzle switch { - HalfSwizzle.F16 => new Operand[] - { - context.UnpackHalf2x16Low (src), - context.UnpackHalf2x16High(src), - }, - HalfSwizzle.F32 => new Operand[] { src, src }, - HalfSwizzle.H0H0 => new Operand[] - { - context.UnpackHalf2x16Low(src), - context.UnpackHalf2x16Low(src), - }, - HalfSwizzle.H1H1 => new Operand[] - { - context.UnpackHalf2x16High(src), - context.UnpackHalf2x16High(src), - }, + HalfSwizzle.F16 => + [ + context.UnpackHalf2x16Low (src), + context.UnpackHalf2x16High(src) + ], + HalfSwizzle.F32 => [src, src], + HalfSwizzle.H0H0 => + [ + context.UnpackHalf2x16Low(src), + context.UnpackHalf2x16Low(src) + ], + HalfSwizzle.H1H1 => + [ + context.UnpackHalf2x16High(src), + context.UnpackHalf2x16High(src) + ], _ => throw new ArgumentException($"Invalid swizzle \"{swizzle}\"."), }; } diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerArithmetic.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerArithmetic.cs index 99922f7a1..2f3988119 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerArithmetic.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerArithmetic.cs @@ -14,8 +14,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIaddR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitIadd(context, srcA, srcB, op.Dest, op.AvgMode, op.X, op.WriteCC); } @@ -24,8 +24,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIaddI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitIadd(context, srcA, srcB, op.Dest, op.AvgMode, op.X, op.WriteCC); } @@ -34,8 +34,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIaddC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitIadd(context, srcA, srcB, op.Dest, op.AvgMode, op.X, op.WriteCC); } @@ -44,8 +44,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIadd32i op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, op.Imm32); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, op.Imm32); EmitIadd(context, srcA, srcB, op.Dest, op.AvgMode, op.X, op.WriteCC); } @@ -54,9 +54,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIadd3R op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitIadd3(context, op.Lrs, srcA, srcB, srcC, op.Apart, op.Bpart, op.Cpart, op.Dest, op.NegA, op.NegB, op.NegC); } @@ -65,9 +65,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIadd3I op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcC = GetSrcReg(context, op.SrcC); EmitIadd3(context, Lrs.None, srcA, srcB, srcC, HalfSelect.B32, HalfSelect.B32, HalfSelect.B32, op.Dest, op.NegA, op.NegB, op.NegC); } @@ -76,9 +76,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIadd3C op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcC = GetSrcReg(context, op.SrcC); EmitIadd3(context, Lrs.None, srcA, srcB, srcC, HalfSelect.B32, HalfSelect.B32, HalfSelect.B32, op.Dest, op.NegA, op.NegB, op.NegC); } @@ -87,9 +87,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImadR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitImad(context, srcA, srcB, srcC, op.Dest, op.AvgMode, op.ASigned, op.BSigned, op.Hilo); } @@ -98,9 +98,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImadI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcC = GetSrcReg(context, op.SrcC); EmitImad(context, srcA, srcB, srcC, op.Dest, op.AvgMode, op.ASigned, op.BSigned, op.Hilo); } @@ -109,9 +109,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImadC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcC = GetSrcReg(context, op.SrcC); EmitImad(context, srcA, srcB, srcC, op.Dest, op.AvgMode, op.ASigned, op.BSigned, op.Hilo); } @@ -120,9 +120,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImadRc op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcC); - var srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcC); + Operand srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitImad(context, srcA, srcB, srcC, op.Dest, op.AvgMode, op.ASigned, op.BSigned, op.Hilo); } @@ -131,9 +131,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImad32i op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, op.Imm32); - var srcC = GetSrcReg(context, op.Dest); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, op.Imm32); + Operand srcC = GetSrcReg(context, op.Dest); EmitImad(context, srcA, srcB, srcC, op.Dest, op.AvgMode, op.ASigned, op.BSigned, op.Hilo); } @@ -142,8 +142,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImulR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitImad(context, srcA, srcB, Const(0), op.Dest, AvgMode.NoNeg, op.ASigned, op.BSigned, op.Hilo); } @@ -152,8 +152,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImulI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitImad(context, srcA, srcB, Const(0), op.Dest, AvgMode.NoNeg, op.ASigned, op.BSigned, op.Hilo); } @@ -162,8 +162,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImulC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitImad(context, srcA, srcB, Const(0), op.Dest, AvgMode.NoNeg, op.ASigned, op.BSigned, op.Hilo); } @@ -172,8 +172,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImul32i op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, op.Imm32); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, op.Imm32); EmitImad(context, srcA, srcB, Const(0), op.Dest, AvgMode.NoNeg, op.ASigned, op.BSigned, op.Hilo); } @@ -182,8 +182,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIscaddR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitIscadd(context, srcA, srcB, op.Dest, op.Imm5, op.AvgMode, op.WriteCC); } @@ -192,8 +192,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIscaddI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitIscadd(context, srcA, srcB, op.Dest, op.Imm5, op.AvgMode, op.WriteCC); } @@ -202,8 +202,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIscaddC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitIscadd(context, srcA, srcB, op.Dest, op.Imm5, op.AvgMode, op.WriteCC); } @@ -212,8 +212,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIscadd32i op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, op.Imm32); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, op.Imm32); EmitIscadd(context, srcA, srcB, op.Dest, op.Imm5, AvgMode.NoNeg, op.WriteCC); } @@ -222,8 +222,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLeaR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitLea(context, srcA, srcB, op.Dest, op.NegA, op.ImmU5); } @@ -232,8 +232,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLeaI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitLea(context, srcA, srcB, op.Dest, op.NegA, op.ImmU5); } @@ -242,8 +242,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLeaC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitLea(context, srcA, srcB, op.Dest, op.NegA, op.ImmU5); } @@ -252,9 +252,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLeaHiR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitLeaHi(context, srcA, srcB, srcC, op.Dest, op.NegA, op.ImmU5); } @@ -263,9 +263,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLeaHiC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcC = GetSrcReg(context, op.SrcC); EmitLeaHi(context, srcA, srcB, srcC, op.Dest, op.NegA, op.ImmU5); } @@ -274,9 +274,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstXmadR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitXmad(context, op.XmadCop, srcA, srcB, srcC, op.Dest, op.ASigned, op.BSigned, op.HiloA, op.HiloB, op.Psl, op.Mrg, op.X, op.WriteCC); } @@ -285,9 +285,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstXmadI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, op.Imm16); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, op.Imm16); + Operand srcC = GetSrcReg(context, op.SrcC); EmitXmad(context, op.XmadCop, srcA, srcB, srcC, op.Dest, op.ASigned, op.BSigned, op.HiloA, false, op.Psl, op.Mrg, op.X, op.WriteCC); } @@ -296,9 +296,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstXmadC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcC = GetSrcReg(context, op.SrcC); EmitXmad(context, op.XmadCop, srcA, srcB, srcC, op.Dest, op.ASigned, op.BSigned, op.HiloA, op.HiloB, op.Psl, op.Mrg, op.X, op.WriteCC); } @@ -307,9 +307,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstXmadRc op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcC); - var srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcC); + Operand srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitXmad(context, op.XmadCop, srcA, srcB, srcC, op.Dest, op.ASigned, op.BSigned, op.HiloA, op.HiloB, false, false, op.X, op.WriteCC); } @@ -578,7 +578,7 @@ namespace Ryujinx.Graphics.Shader.Instructions bool extended, bool writeCC) { - var srcBUnmodified = srcB; + Operand srcBUnmodified = srcB; Operand Extend16To32(Operand src, bool high, bool signed) { diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerComparison.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerComparison.cs index 18d4e3d19..c97e53bfe 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerComparison.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerComparison.cs @@ -14,9 +14,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIcmpR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitIcmp(context, op.IComp, srcA, srcB, srcC, op.Dest, op.Signed); } @@ -25,9 +25,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIcmpI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcC = GetSrcReg(context, op.SrcC); EmitIcmp(context, op.IComp, srcA, srcB, srcC, op.Dest, op.Signed); } @@ -36,9 +36,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIcmpC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcC = GetSrcReg(context, op.SrcC); EmitIcmp(context, op.IComp, srcA, srcB, srcC, op.Dest, op.Signed); } @@ -47,9 +47,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIcmpRc op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcC); - var srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcC); + Operand srcC = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitIcmp(context, op.IComp, srcA, srcB, srcC, op.Dest, op.Signed); } @@ -58,8 +58,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIsetR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitIset(context, op.IComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.Dest, op.BVal, op.Signed, op.X, op.WriteCC); } @@ -68,8 +68,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIsetI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitIset(context, op.IComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.Dest, op.BVal, op.Signed, op.X, op.WriteCC); } @@ -78,8 +78,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIsetC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitIset(context, op.IComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.Dest, op.BVal, op.Signed, op.X, op.WriteCC); } @@ -88,8 +88,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIsetpR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitIsetp(context, op.IComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.DestPred, op.DestPredInv, op.Signed, op.X); } @@ -98,8 +98,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIsetpI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitIsetp(context, op.IComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.DestPred, op.DestPredInv, op.Signed, op.X); } @@ -108,8 +108,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstIsetpC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitIsetp(context, op.IComp, op.Bop, srcA, srcB, op.SrcPred, op.SrcPredInv, op.DestPred, op.DestPredInv, op.Signed, op.X); } @@ -280,7 +280,7 @@ namespace Ryujinx.Graphics.Shader.Instructions } else { - var inst = cond switch + Instruction inst = cond switch { IComp.Lt => Instruction.CompareLessU32, IComp.Eq => Instruction.CompareEqual, diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerLogical.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerLogical.cs index 5993c93dd..2e2d951d2 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerLogical.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerLogical.cs @@ -15,8 +15,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLopR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitLop(context, op.Lop, op.PredicateOp, srcA, srcB, op.Dest, op.DestPred, op.NegA, op.NegB, op.X, op.WriteCC); } @@ -25,8 +25,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLopI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitLop(context, op.LogicOp, op.PredicateOp, srcA, srcB, op.Dest, op.DestPred, op.NegA, op.NegB, op.X, op.WriteCC); } @@ -35,8 +35,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLopC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitLop(context, op.LogicOp, op.PredicateOp, srcA, srcB, op.Dest, op.DestPred, op.NegA, op.NegB, op.X, op.WriteCC); } @@ -45,8 +45,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLop32i op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, op.Imm32); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, op.Imm32); EmitLop(context, op.LogicOp, PredicateOp.F, srcA, srcB, op.Dest, PT, op.NegA, op.NegB, op.X, op.WriteCC); } @@ -55,9 +55,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLop3R op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitLop3(context, op.Imm, op.PredicateOp, srcA, srcB, srcC, op.Dest, op.DestPred, op.X, op.WriteCC); } @@ -66,9 +66,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLop3I op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcC = GetSrcReg(context, op.SrcC); EmitLop3(context, op.Imm, PredicateOp.F, srcA, srcB, srcC, op.Dest, PT, false, op.WriteCC); } @@ -77,9 +77,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstLop3C op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcC = GetSrcReg(context, op.SrcC); EmitLop3(context, op.Imm, PredicateOp.F, srcA, srcB, srcC, op.Dest, PT, false, op.WriteCC); } diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerMinMax.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerMinMax.cs index 739e94413..f34efc6f3 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerMinMax.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitIntegerMinMax.cs @@ -13,9 +13,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImnmxR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); EmitImnmx(context, srcA, srcB, srcPred, op.Dest, op.Signed, op.WriteCC); } @@ -24,9 +24,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImnmxI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); - var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); EmitImnmx(context, srcA, srcB, srcPred, op.Dest, op.Signed, op.WriteCC); } @@ -35,9 +35,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstImnmxC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); - var srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcPred = GetPredicate(context, op.SrcPred, op.SrcPredInv); EmitImnmx(context, srcA, srcB, srcPred, op.Dest, op.Signed, op.WriteCC); } diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs index 3fcb821d3..154ed24fc 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs @@ -73,7 +73,7 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand slot = Const(op.CbufSlot); Operand srcA = GetSrcReg(context, op.SrcA); - if (op.AddressMode == AddressMode.Is || op.AddressMode == AddressMode.Isl) + if (op.AddressMode is AddressMode.Is or AddressMode.Isl) { slot = context.IAdd(slot, context.BitfieldExtractU32(srcA, Const(16), Const(16))); srcA = context.BitwiseAnd(srcA, Const(0xffff)); @@ -213,7 +213,7 @@ namespace Ryujinx.Graphics.Shader.Instructions switch (op) { case AtomOp.Add: - if (type == AtomSize.S32 || type == AtomSize.U32) + if (type is AtomSize.S32 or AtomSize.U32) { res = context.AtomicAdd(storageKind, e0, e1, value); } @@ -221,6 +221,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } + break; case AtomOp.Min: if (type == AtomSize.S32) @@ -235,6 +236,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } + break; case AtomOp.Max: if (type == AtomSize.S32) @@ -249,9 +251,10 @@ namespace Ryujinx.Graphics.Shader.Instructions { context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } + break; case AtomOp.And: - if (type == AtomSize.S32 || type == AtomSize.U32) + if (type is AtomSize.S32 or AtomSize.U32) { res = context.AtomicAnd(storageKind, e0, e1, value); } @@ -259,9 +262,10 @@ namespace Ryujinx.Graphics.Shader.Instructions { context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } + break; case AtomOp.Or: - if (type == AtomSize.S32 || type == AtomSize.U32) + if (type is AtomSize.S32 or AtomSize.U32) { res = context.AtomicOr(storageKind, e0, e1, value); } @@ -269,9 +273,10 @@ namespace Ryujinx.Graphics.Shader.Instructions { context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } + break; case AtomOp.Xor: - if (type == AtomSize.S32 || type == AtomSize.U32) + if (type is AtomSize.S32 or AtomSize.U32) { res = context.AtomicXor(storageKind, e0, e1, value); } @@ -279,9 +284,10 @@ namespace Ryujinx.Graphics.Shader.Instructions { context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } + break; case AtomOp.Exch: - if (type == AtomSize.S32 || type == AtomSize.U32) + if (type is AtomSize.S32 or AtomSize.U32) { res = context.AtomicSwap(storageKind, e0, e1, value); } @@ -289,6 +295,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } + break; default: context.TranslatorContext.GpuAccessor.Log($"Invalid atomic operation: {op}."); diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMove.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMove.cs index 944039d65..df84c38f1 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMove.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMove.cs @@ -92,14 +92,14 @@ namespace Ryujinx.Graphics.Shader.Instructions break; case SReg.InvocationInfo: - if (context.TranslatorContext.Definitions.Stage != ShaderStage.Compute && context.TranslatorContext.Definitions.Stage != ShaderStage.Fragment) + if (context.TranslatorContext.Definitions.Stage is not ShaderStage.Compute and not ShaderStage.Fragment) { // Note: Lowest 8-bits seems to contain some primitive index, // but it seems to be NVIDIA implementation specific as it's only used // to calculate ISBE offsets, so we can just keep it as zero. - if (context.TranslatorContext.Definitions.Stage == ShaderStage.TessellationControl || - context.TranslatorContext.Definitions.Stage == ShaderStage.TessellationEvaluation) + if (context.TranslatorContext.Definitions.Stage is ShaderStage.TessellationControl or + ShaderStage.TessellationEvaluation) { src = context.ShiftLeft(context.Load(StorageKind.Input, IoVariable.PatchVertices), Const(16)); } @@ -112,6 +112,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { src = Const(0); } + break; case SReg.TId: diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitShift.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitShift.cs index ee0dac155..9c7899940 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitShift.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitShift.cs @@ -13,9 +13,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstShfLR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitShf(context, op.MaxShift, srcA, srcB, srcC, op.Dest, op.M, left: true, op.WriteCC); } @@ -24,9 +24,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstShfRR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); + Operand srcC = GetSrcReg(context, op.SrcC); EmitShf(context, op.MaxShift, srcA, srcB, srcC, op.Dest, op.M, left: false, op.WriteCC); } @@ -35,9 +35,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstShfLI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = Const(op.Imm6); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = Const(op.Imm6); + Operand srcC = GetSrcReg(context, op.SrcC); EmitShf(context, op.MaxShift, srcA, srcB, srcC, op.Dest, op.M, left: true, op.WriteCC); } @@ -46,9 +46,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstShfRI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = Const(op.Imm6); - var srcC = GetSrcReg(context, op.SrcC); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = Const(op.Imm6); + Operand srcC = GetSrcReg(context, op.SrcC); EmitShf(context, op.MaxShift, srcA, srcB, srcC, op.Dest, op.M, left: false, op.WriteCC); } @@ -78,8 +78,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstShrR op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcReg(context, op.SrcB); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcReg(context, op.SrcB); EmitShr(context, srcA, srcB, op.Dest, op.M, op.Brev, op.Signed); } @@ -88,8 +88,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstShrI op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcImm(context, Imm20ToSInt(op.Imm20)); EmitShr(context, srcA, srcB, op.Dest, op.M, op.Brev, op.Signed); } @@ -98,8 +98,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstShrC op = context.GetOp(); - var srcA = GetSrcReg(context, op.SrcA); - var srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); + Operand srcA = GetSrcReg(context, op.SrcA); + Operand srcB = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset); EmitShr(context, srcA, srcB, op.Dest, op.M, op.Brev, op.Signed); } @@ -115,7 +115,7 @@ namespace Ryujinx.Graphics.Shader.Instructions bool left, bool writeCC) { - bool isLongShift = maxShift == MaxShift.U64 || maxShift == MaxShift.S64; + bool isLongShift = maxShift is MaxShift.U64 or MaxShift.S64; bool signedShift = maxShift == MaxShift.S64; int maxShiftConst = isLongShift ? 64 : 32; diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs index 383e82c69..e9f930179 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs @@ -221,7 +221,7 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand d = Register(dest, RegisterType.Gpr); - List sourcesList = new(); + List sourcesList = []; if (isBindless) { @@ -258,7 +258,7 @@ namespace Ryujinx.Graphics.Shader.Instructions } // TODO: FP and 64-bit formats. - TextureFormat format = size == SuatomSize.Sd32 || size == SuatomSize.Sd64 + TextureFormat format = size is SuatomSize.Sd32 or SuatomSize.Sd64 ? (isBindless ? TextureFormat.Unknown : ShaderProperties.GetTextureFormatAtomic(context.TranslatorContext.GpuAccessor, imm)) : GetTextureFormat(size); @@ -328,7 +328,7 @@ namespace Ryujinx.Graphics.Shader.Instructions return context.Copy(Register(srcA++, RegisterType.Gpr)); } - List sourcesList = new(); + List sourcesList = []; if (isBindless) { @@ -500,7 +500,7 @@ namespace Ryujinx.Graphics.Shader.Instructions return context.Copy(Register(srcB++, RegisterType.Gpr)); } - List sourcesList = new(); + List sourcesList = []; if (isBindless) { @@ -537,7 +537,7 @@ namespace Ryujinx.Graphics.Shader.Instructions } // TODO: FP and 64-bit formats. - TextureFormat format = size == SuatomSize.Sd32 || size == SuatomSize.Sd64 + TextureFormat format = size is SuatomSize.Sd32 or SuatomSize.Sd64 ? (isBindless ? TextureFormat.Unknown : ShaderProperties.GetTextureFormatAtomic(context.TranslatorContext.GpuAccessor, imm)) : GetTextureFormat(size); @@ -605,7 +605,7 @@ namespace Ryujinx.Graphics.Shader.Instructions return context.Copy(Register(srcB++, RegisterType.Gpr)); } - List sourcesList = new(); + List sourcesList = []; if (isBindless) { diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs index 2076262da..19b22e03b 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitTexture.cs @@ -12,8 +12,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { private static readonly int[][] _maskLut = new int[][] { - new int[] { 0b0001, 0b0010, 0b0100, 0b1000, 0b0011, 0b1001, 0b1010, 0b1100 }, - new int[] { 0b0111, 0b1011, 0b1101, 0b1110, 0b1111, 0b0000, 0b0000, 0b0000 }, + [0b0001, 0b0010, 0b0100, 0b1000, 0b0011, 0b1001, 0b1010, 0b1100], [0b0111, 0b1011, 0b1101, 0b1110, 0b1111, 0b0000, 0b0000, 0b0000 + ], }; public const bool Sample1DAs2D = true; @@ -57,7 +57,7 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstTld op = context.GetOp(); - var lod = op.Lod ? Lod.Ll : Lod.Lz; + Lod lod = op.Lod ? Lod.Ll : Lod.Lz; EmitTex(context, TextureFlags.IntCoords, op.Dim, lod, op.TidB, op.WMask, op.SrcA, op.SrcB, op.Dest, op.Ms, false, op.Toff); } @@ -66,8 +66,8 @@ namespace Ryujinx.Graphics.Shader.Instructions { InstTldB op = context.GetOp(); - var flags = TextureFlags.IntCoords | TextureFlags.Bindless; - var lod = op.Lod ? Lod.Ll : Lod.Lz; + TextureFlags flags = TextureFlags.IntCoords | TextureFlags.Bindless; + Lod lod = op.Lod ? Lod.Ll : Lod.Lz; EmitTex(context, flags, op.Dim, lod, 0, op.WMask, op.SrcA, op.SrcB, op.Dest, op.Ms, false, op.Toff); } @@ -202,7 +202,7 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand arrayIndex = isArray ? Ra() : null; - List sourcesList = new(); + List sourcesList = []; if (isBindless) { @@ -284,7 +284,7 @@ namespace Ryujinx.Graphics.Shader.Instructions flags |= TextureFlags.Offset; } - if (lodMode == Lod.Lb || lodMode == Lod.Lba) + if (lodMode is Lod.Lb or Lod.Lba) { sourcesList.Add(lodValue); @@ -339,7 +339,7 @@ namespace Ryujinx.Graphics.Shader.Instructions return; } - List sourcesList = new(); + List sourcesList = []; Operand Ra() { @@ -376,7 +376,7 @@ namespace Ryujinx.Graphics.Shader.Instructions if (texsType == TexsType.Texs) { - var texsOp = context.GetOp(); + InstTexs texsOp = context.GetOp(); type = ConvertSamplerType(texsOp.Target); @@ -468,7 +468,7 @@ namespace Ryujinx.Graphics.Shader.Instructions } else if (texsType == TexsType.Tlds) { - var tldsOp = context.GetOp(); + InstTlds tldsOp = context.GetOp(); type = ConvertSamplerType(tldsOp.Target); @@ -504,6 +504,7 @@ namespace Ryujinx.Graphics.Shader.Instructions sourcesList.Add(ConstF(0)); } + break; case TldsTarget.Texture1DLodLevel: @@ -562,7 +563,7 @@ namespace Ryujinx.Graphics.Shader.Instructions } else if (texsType == TexsType.Tld4s) { - var tld4sOp = context.GetOp(); + InstTld4s tld4sOp = context.GetOp(); if (!(tld4sOp.Dc || tld4sOp.Aoffi)) { @@ -605,8 +606,8 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand[] sources = sourcesList.ToArray(); - Operand[] rd0 = new Operand[2] { ConstF(0), ConstF(0) }; - Operand[] rd1 = new Operand[2] { ConstF(0), ConstF(0) }; + Operand[] rd0 = [ConstF(0), ConstF(0)]; + Operand[] rd1 = [ConstF(0), ConstF(0)]; int handle = imm; int componentMask = _maskLut[dest2 == RegisterConsts.RegisterZeroIndex ? 0 : 1][writeMask]; @@ -694,14 +695,14 @@ namespace Ryujinx.Graphics.Shader.Instructions } bool isArray = - dimensions == TexDim.Array1d || - dimensions == TexDim.Array2d || - dimensions == TexDim.Array3d || - dimensions == TexDim.ArrayCube; + dimensions is TexDim.Array1d or + TexDim.Array2d or + TexDim.Array3d or + TexDim.ArrayCube; Operand arrayIndex = isArray ? Ra() : null; - List sourcesList = new(); + List sourcesList = []; SamplerType type = ConvertSamplerType(dimensions); TextureFlags flags = TextureFlags.Gather; @@ -736,7 +737,7 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand[] packedOffs = new Operand[2]; - bool hasAnyOffset = offset == TexOffset.Aoffi || offset == TexOffset.Ptp; + bool hasAnyOffset = offset is TexOffset.Aoffi or TexOffset.Ptp; packedOffs[0] = hasAnyOffset ? Rb() : null; packedOffs[1] = offset == TexOffset.Ptp ? Rb() : null; @@ -835,7 +836,7 @@ namespace Ryujinx.Graphics.Shader.Instructions TextureFlags flags = TextureFlags.None; - List sourcesList = new(); + List sourcesList = []; if (isBindless) { @@ -849,10 +850,10 @@ namespace Ryujinx.Graphics.Shader.Instructions int coordsCount = type.GetDimensions(); bool isArray = - dimensions == TexDim.Array1d || - dimensions == TexDim.Array2d || - dimensions == TexDim.Array3d || - dimensions == TexDim.ArrayCube; + dimensions is TexDim.Array1d or + TexDim.Array2d or + TexDim.Array3d or + TexDim.ArrayCube; Operand arrayIndex = isArray ? Ra() : null; @@ -963,7 +964,7 @@ namespace Ryujinx.Graphics.Shader.Instructions TextureFlags flags = TextureFlags.Derivatives; - List sourcesList = new(); + List sourcesList = []; if (isBindless) { @@ -993,10 +994,10 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand packedParams = Ra(); bool isArray = - dimensions == TexDim.Array1d || - dimensions == TexDim.Array2d || - dimensions == TexDim.Array3d || - dimensions == TexDim.ArrayCube; + dimensions is TexDim.Array1d or + TexDim.Array2d or + TexDim.Array3d or + TexDim.ArrayCube; if (isArray) { @@ -1076,7 +1077,7 @@ namespace Ryujinx.Graphics.Shader.Instructions return context.Copy(Register(srcA++, RegisterType.Gpr)); } - List sourcesList = new(); + List sourcesList = []; if (isBindless) { @@ -1143,6 +1144,7 @@ namespace Ryujinx.Graphics.Shader.Instructions context.Copy(d, context.TextureQuerySize(type, flags, setAndBinding, compIndex, sources)); } } + break; case TexQuery.TexHeaderTextureType: @@ -1174,6 +1176,7 @@ namespace Ryujinx.Graphics.Shader.Instructions context.Copy(d, context.TextureQuerySamples(type, flags, setAndBinding, sources)); } } + break; default: diff --git a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/BasicBlock.cs b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/BasicBlock.cs index 637e120e1..d3eae3108 100644 --- a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/BasicBlock.cs +++ b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/BasicBlock.cs @@ -34,11 +34,11 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation public BasicBlock() { - Operations = new LinkedList(); + Operations = []; - Predecessors = new List(); + Predecessors = []; - DominanceFrontiers = new HashSet(); + DominanceFrontiers = []; } public BasicBlock(int index) : this() diff --git a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs index 273a38a5b..f63a8c4be 100644 --- a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs +++ b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs @@ -179,19 +179,19 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation public static bool IsTextureQuery(this Instruction inst) { inst &= Instruction.Mask; - return inst == Instruction.Lod || inst == Instruction.TextureQuerySamples || inst == Instruction.TextureQuerySize; + return inst is Instruction.Lod or Instruction.TextureQuerySamples or Instruction.TextureQuerySize; } public static bool IsImage(this Instruction inst) { inst &= Instruction.Mask; - return inst == Instruction.ImageAtomic || inst == Instruction.ImageLoad || inst == Instruction.ImageStore; + return inst is Instruction.ImageAtomic or Instruction.ImageLoad or Instruction.ImageStore; } public static bool IsImageStore(this Instruction inst) { inst &= Instruction.Mask; - return inst == Instruction.ImageAtomic || inst == Instruction.ImageStore; + return inst is Instruction.ImageAtomic or Instruction.ImageStore; } } } diff --git a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operand.cs b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operand.cs index 6648457f0..19e65951a 100644 --- a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operand.cs +++ b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operand.cs @@ -20,7 +20,7 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation private Operand() { - UseOps = new HashSet(); + UseOps = []; } public Operand(OperandType type) : this() diff --git a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs index 713e8a4fb..dc2f56e7e 100644 --- a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs +++ b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs @@ -27,11 +27,11 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation value.AsgOp = this; } - _dests = new[] { value }; + _dests = [value]; } else { - _dests = Array.Empty(); + _dests = []; } } } @@ -82,7 +82,7 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation } else { - _dests = Array.Empty(); + _dests = []; } } @@ -94,11 +94,11 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation { dest.AsgOp = this; - _dests = new[] { dest }; + _dests = [dest]; } else { - _dests = Array.Empty(); + _dests = []; } } @@ -111,11 +111,11 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation { dest.AsgOp = this; - _dests = new[] { dest }; + _dests = [dest]; } else { - _dests = Array.Empty(); + _dests = []; } } @@ -258,7 +258,7 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation source.UseOps.Add(this); } - _sources = new Operand[] { source }; + _sources = [source]; } public void TurnDoubleIntoFloat() diff --git a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/PhiNode.cs b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/PhiNode.cs index f4c4fef42..a32b2e9ee 100644 --- a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/PhiNode.cs +++ b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/PhiNode.cs @@ -35,9 +35,9 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation public PhiNode(Operand dest) { - _blocks = new HashSet(); + _blocks = []; - _sources = new List(); + _sources = []; dest.AsgOp = this; diff --git a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/StorageKind.cs b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/StorageKind.cs index 669c12816..2b39e85ea 100644 --- a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/StorageKind.cs +++ b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/StorageKind.cs @@ -24,22 +24,22 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation { public static bool IsInputOrOutput(this StorageKind storageKind) { - return storageKind == StorageKind.Input || - storageKind == StorageKind.InputPerPatch || - storageKind == StorageKind.Output || - storageKind == StorageKind.OutputPerPatch; + return storageKind is StorageKind.Input or + StorageKind.InputPerPatch or + StorageKind.Output or + StorageKind.OutputPerPatch; } public static bool IsOutput(this StorageKind storageKind) { - return storageKind == StorageKind.Output || - storageKind == StorageKind.OutputPerPatch; + return storageKind is StorageKind.Output or + StorageKind.OutputPerPatch; } public static bool IsPerPatch(this StorageKind storageKind) { - return storageKind == StorageKind.InputPerPatch || - storageKind == StorageKind.OutputPerPatch; + return storageKind is StorageKind.InputPerPatch or + StorageKind.OutputPerPatch; } } } diff --git a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureFlags.cs b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureFlags.cs index 51ff09cf8..61e6ecf5a 100644 --- a/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureFlags.cs +++ b/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureFlags.cs @@ -4,7 +4,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.Graphics.Shader.IntermediateRepresentation { [Flags] - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum TextureFlags { None = 0, diff --git a/src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj b/src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj index be32641eb..cfb188daf 100644 --- a/src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj +++ b/src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj @@ -1,7 +1,6 @@ - net8.0 $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.Shader/ShaderStage.cs b/src/Ryujinx.Graphics.Shader/ShaderStage.cs index 2522b4fc1..faea5c357 100644 --- a/src/Ryujinx.Graphics.Shader/ShaderStage.cs +++ b/src/Ryujinx.Graphics.Shader/ShaderStage.cs @@ -21,7 +21,7 @@ namespace Ryujinx.Graphics.Shader /// True if the shader stage supports render scale, false otherwise public static bool SupportsRenderScale(this ShaderStage stage) { - return stage == ShaderStage.Vertex || stage == ShaderStage.Fragment || stage == ShaderStage.Compute; + return stage is ShaderStage.Vertex or ShaderStage.Fragment or ShaderStage.Compute; } /// @@ -31,10 +31,10 @@ namespace Ryujinx.Graphics.Shader /// True if the shader stage is vertex, tessellation or geometry, false otherwise public static bool IsVtg(this ShaderStage stage) { - return stage == ShaderStage.Vertex || - stage == ShaderStage.TessellationControl || - stage == ShaderStage.TessellationEvaluation || - stage == ShaderStage.Geometry; + return stage is ShaderStage.Vertex or + ShaderStage.TessellationControl or + ShaderStage.TessellationEvaluation or + ShaderStage.Geometry; } } } diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/AstBlock.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/AstBlock.cs index 826dbff88..97c0f005e 100644 --- a/src/Ryujinx.Graphics.Shader/StructuredIr/AstBlock.cs +++ b/src/Ryujinx.Graphics.Shader/StructuredIr/AstBlock.cs @@ -41,7 +41,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr Type = type; Condition = condition; - _nodes = new LinkedList(); + _nodes = []; } public void Add(IAstNode node) diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/AstOperand.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/AstOperand.cs index b64b96b8d..28aad589f 100644 --- a/src/Ryujinx.Graphics.Shader/StructuredIr/AstOperand.cs +++ b/src/Ryujinx.Graphics.Shader/StructuredIr/AstOperand.cs @@ -17,8 +17,8 @@ namespace Ryujinx.Graphics.Shader.StructuredIr private AstOperand() { - Defs = new HashSet(); - Uses = new HashSet(); + Defs = []; + Uses = []; VarType = AggregateType.S32; } diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/AstOptimizer.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/AstOptimizer.cs index 5d46ab498..3f2e4991f 100644 --- a/src/Ryujinx.Graphics.Shader/StructuredIr/AstOptimizer.cs +++ b/src/Ryujinx.Graphics.Shader/StructuredIr/AstOptimizer.cs @@ -1,5 +1,4 @@ using Ryujinx.Graphics.Shader.IntermediateRepresentation; -using Ryujinx.Graphics.Shader.Translation; using System.Collections.Generic; using System.Linq; diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/GotoElimination.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/GotoElimination.cs index 3ca1266f6..e2e52586a 100644 --- a/src/Ryujinx.Graphics.Shader/StructuredIr/GotoElimination.cs +++ b/src/Ryujinx.Graphics.Shader/StructuredIr/GotoElimination.cs @@ -102,8 +102,8 @@ namespace Ryujinx.Graphics.Shader.StructuredIr return false; } - IAstNode block; - IAstNode other; + AstNode block; + AstNode other; int blockLvl, otherLvl; @@ -429,7 +429,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr { AstBlock block = bottom; - List path = new(); + List path = []; while (block != top) { @@ -441,7 +441,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr return path.ToArray(); } - private static int Level(IAstNode node) + private static int Level(AstNode node) { int level = 0; diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs index 72d0e9896..b2ddf6ab7 100644 --- a/src/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs +++ b/src/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs @@ -150,11 +150,11 @@ namespace Ryujinx.Graphics.Shader.StructuredIr { // TODO: Return correct type depending on source index, // that can improve the decompiler output. - if (inst == Instruction.ImageLoad || - inst == Instruction.ImageStore || - inst == Instruction.ImageAtomic || - inst == Instruction.Lod || - inst == Instruction.TextureSample) + if (inst is Instruction.ImageLoad or + Instruction.ImageStore or + Instruction.ImageAtomic or + Instruction.Lod or + Instruction.TextureSample) { return AggregateType.FP32; } diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs index 53ed6bfcc..f0f22c056 100644 --- a/src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs +++ b/src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs @@ -73,7 +73,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr return TextureFormat.Unknown; } - var format = gpuAccessor.QueryTextureFormat(handle, cbufSlot); + TextureFormat format = gpuAccessor.QueryTextureFormat(handle, cbufSlot); if (format == TextureFormat.Unknown) { @@ -87,7 +87,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr private static bool FormatSupportsAtomic(TextureFormat format) { - return format == TextureFormat.R32Sint || format == TextureFormat.R32Uint; + return format is TextureFormat.R32Sint or TextureFormat.R32Uint; } public static TextureFormat GetTextureFormatAtomic(IGpuAccessor gpuAccessor, int handle, int cbufSlot = -1) @@ -95,7 +95,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr // Atomic image instructions do not support GL_EXT_shader_image_load_formatted, // and must have a type specified. Default to R32Sint if not available. - var format = gpuAccessor.QueryTextureFormat(handle, cbufSlot); + TextureFormat format = gpuAccessor.QueryTextureFormat(handle, cbufSlot); if (!FormatSupportsAtomic(format)) { diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredFunction.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredFunction.cs index aa5e13867..79fba17cd 100644 --- a/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredFunction.cs +++ b/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredFunction.cs @@ -29,7 +29,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr InArguments = inArguments; OutArguments = outArguments; - Locals = new HashSet(); + Locals = []; } public AggregateType GetArgumentType(int index) diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs index 88053658d..63bd820dc 100644 --- a/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs +++ b/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs @@ -83,7 +83,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr Instruction inst = operation.Inst; StorageKind storageKind = operation.StorageKind; - if (inst == Instruction.Load || inst == Instruction.Store) + if (inst is Instruction.Load or Instruction.Store) { if (storageKind.IsInputOrOutput()) { @@ -236,7 +236,8 @@ namespace Ryujinx.Graphics.Shader.StructuredIr dest.VarType = destElemType; - context.AddNode(new AstAssignment(dest, new AstOperation(Instruction.VectorExtract, StorageKind.None, false, new[] { destVec, index }, 2))); + context.AddNode(new AstAssignment(dest, new AstOperation(Instruction.VectorExtract, StorageKind.None, false, + [destVec, index], 2))); } } else if (operation.Dest != null) @@ -343,7 +344,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr private static AggregateType GetVarTypeFromUses(Operand dest) { - HashSet visited = new(); + HashSet visited = []; Queue pending = new(); diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgramContext.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgramContext.cs index 045662a1e..60bdacc02 100644 --- a/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgramContext.cs +++ b/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgramContext.cs @@ -69,7 +69,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr AggregateType[] inArguments, AggregateType[] outArguments) { - _loopTails = new HashSet(); + _loopTails = []; _blockStack = new Stack<(AstBlock, int, int)>(); @@ -77,7 +77,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr _gotoTempAsgs = new Dictionary(); - _gotos = new List(); + _gotos = []; _currBlock = new AstBlock(AstBlockType.Main); @@ -313,13 +313,13 @@ namespace Ryujinx.Graphics.Shader.StructuredIr ResourceManager.SetUsedConstantBufferBinding(binding); - IAstNode[] sources = new IAstNode[] - { + IAstNode[] sources = + [ new AstOperand(OperandType.Constant, binding), new AstOperand(OperandType.Constant, 0), new AstOperand(OperandType.Constant, vecIndex), - new AstOperand(OperandType.Constant, elemIndex), - }; + new AstOperand(OperandType.Constant, elemIndex) + ]; return new AstOperation(Instruction.Load, StorageKind.ConstantBuffer, false, sources, sources.Length); } diff --git a/src/Ryujinx.Graphics.Shader/SupportBuffer.cs b/src/Ryujinx.Graphics.Shader/SupportBuffer.cs index d4d3cbf8f..fb624d624 100644 --- a/src/Ryujinx.Graphics.Shader/SupportBuffer.cs +++ b/src/Ryujinx.Graphics.Shader/SupportBuffer.cs @@ -72,8 +72,7 @@ namespace Ryujinx.Graphics.Shader internal static StructureType GetStructureType() { - return new StructureType(new[] - { + return new StructureType([ new StructureField(AggregateType.U32, "alpha_test"), new StructureField(AggregateType.Array | AggregateType.U32, "is_bgra", FragmentIsBgraCount), new StructureField(AggregateType.Vector4 | AggregateType.FP32, "viewport_inverse"), @@ -81,8 +80,8 @@ namespace Ryujinx.Graphics.Shader new StructureField(AggregateType.S32, "frag_scale_count"), new StructureField(AggregateType.Array | AggregateType.FP32, "render_scale", RenderScaleMaxCount), new StructureField(AggregateType.Vector4 | AggregateType.S32, "tfe_offset"), - new StructureField(AggregateType.S32, "tfe_vertex_count"), - }); + new StructureField(AggregateType.S32, "tfe_vertex_count") + ]); } public Vector4 FragmentAlphaTest; diff --git a/src/Ryujinx.Graphics.Shader/TextureHandle.cs b/src/Ryujinx.Graphics.Shader/TextureHandle.cs index 3aaceac48..d2132172d 100644 --- a/src/Ryujinx.Graphics.Shader/TextureHandle.cs +++ b/src/Ryujinx.Graphics.Shader/TextureHandle.cs @@ -110,8 +110,8 @@ namespace Ryujinx.Graphics.Shader samplerHandle = samplerWordOffset; } - if (handleType == TextureHandleType.SeparateSamplerId || - handleType == TextureHandleType.SeparateConstantSamplerHandle) + if (handleType is TextureHandleType.SeparateSamplerId or + TextureHandleType.SeparateConstantSamplerHandle) { samplerHandle <<= 20; } diff --git a/src/Ryujinx.Graphics.Shader/Translation/AggregateType.cs b/src/Ryujinx.Graphics.Shader/Translation/AggregateType.cs index 108fcb94f..496fbc235 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/AggregateType.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/AggregateType.cs @@ -4,7 +4,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.Graphics.Shader.Translation { [Flags] - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum AggregateType { Invalid, diff --git a/src/Ryujinx.Graphics.Shader/Translation/AttributeUsage.cs b/src/Ryujinx.Graphics.Shader/Translation/AttributeUsage.cs index 9dab9fdf9..5504ef4ed 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/AttributeUsage.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/AttributeUsage.cs @@ -25,8 +25,8 @@ namespace Ryujinx.Graphics.Shader.Translation { _gpuAccessor = gpuAccessor; - UsedInputAttributesPerPatch = new(); - UsedOutputAttributesPerPatch = new(); + UsedInputAttributesPerPatch = []; + UsedOutputAttributesPerPatch = []; } public void SetInputUserAttribute(int index, int component) diff --git a/src/Ryujinx.Graphics.Shader/Translation/ControlFlowGraph.cs b/src/Ryujinx.Graphics.Shader/Translation/ControlFlowGraph.cs index 9b07c28f1..1df45a478 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/ControlFlowGraph.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/ControlFlowGraph.cs @@ -13,7 +13,7 @@ namespace Ryujinx.Graphics.Shader.Translation { Blocks = blocks; - HashSet visited = new(); + HashSet visited = []; Stack blockStack = new(); @@ -52,7 +52,7 @@ namespace Ryujinx.Graphics.Shader.Translation { Dictionary labels = new(); - List blocks = new(); + List blocks = []; BasicBlock currentBlock = null; @@ -110,9 +110,9 @@ namespace Ryujinx.Graphics.Shader.Translation currentBlock.Operations.AddLast(operation); } - needsNewBlock = operation.Inst == Instruction.Branch || - operation.Inst == Instruction.BranchIfTrue || - operation.Inst == Instruction.BranchIfFalse; + needsNewBlock = operation.Inst is Instruction.Branch or + Instruction.BranchIfTrue or + Instruction.BranchIfFalse; if (needsNewBlock) { diff --git a/src/Ryujinx.Graphics.Shader/Translation/EmitterContext.cs b/src/Ryujinx.Graphics.Shader/Translation/EmitterContext.cs index 5e07b39f1..94448626f 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/EmitterContext.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/EmitterContext.cs @@ -1,5 +1,6 @@ using Ryujinx.Graphics.Shader.Decoders; using Ryujinx.Graphics.Shader.IntermediateRepresentation; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Numerics; @@ -53,7 +54,7 @@ namespace Ryujinx.Graphics.Shader.Translation public EmitterContext() { - _operations = new List(); + _operations = []; _labels = new Dictionary(); } @@ -126,8 +127,8 @@ namespace Ryujinx.Graphics.Shader.Translation TextureFlags.IntCoords, ResourceManager.Reservations.GetIndexBufferTextureSetAndBinding(), 1, - new[] { vertexIndexVr }, - new[] { this.IAdd(ibBaseOffset, outputVertexOffset) }); + [vertexIndexVr], + [this.IAdd(ibBaseOffset, outputVertexOffset)]); this.Store(StorageKind.LocalMemory, ResourceManager.LocalVertexIndexVertexRateMemoryId, this.IAdd(firstVertex, vertexIndexVr)); this.Store(StorageKind.LocalMemory, ResourceManager.LocalVertexIndexInstanceRateMemoryId, this.IAdd(firstInstance, outputInstanceOffset)); @@ -147,8 +148,8 @@ namespace Ryujinx.Graphics.Shader.Translation TextureFlags.IntCoords, ResourceManager.Reservations.GetTopologyRemapBufferTextureSetAndBinding(), 1, - new[] { vertexIndex }, - new[] { this.IAdd(baseVertex, Const(index)) }); + [vertexIndex], + [this.IAdd(baseVertex, Const(index))]); this.Store(StorageKind.LocalMemory, ResourceManager.LocalTopologyRemapMemoryId, Const(index), vertexIndex); } @@ -186,7 +187,7 @@ namespace Ryujinx.Graphics.Shader.Translation public (Operand, Operand) Add(Instruction inst, (Operand, Operand) dest, params Operand[] sources) { - Operand[] dests = new[] { dest.Item1, dest.Item2 }; + Operand[] dests = [dest.Item1, dest.Item2]; Operation operation = new(inst, 0, dests, sources); @@ -256,8 +257,8 @@ namespace Ryujinx.Graphics.Shader.Translation for (int tfbIndex = 0; tfbIndex < ResourceReservations.TfeBuffersCount; tfbIndex++) { - var locations = TranslatorContext.GpuAccessor.QueryTransformFeedbackVaryingLocations(tfbIndex); - var stride = TranslatorContext.GpuAccessor.QueryTransformFeedbackStride(tfbIndex); + ReadOnlySpan locations = TranslatorContext.GpuAccessor.QueryTransformFeedbackVaryingLocations(tfbIndex); + int stride = TranslatorContext.GpuAccessor.QueryTransformFeedbackStride(tfbIndex); Operand baseOffset = this.Load(StorageKind.ConstantBuffer, SupportBuffer.Binding, Const((int)SupportBufferField.TfeOffset), Const(tfbIndex)); Operand baseVertex = this.Load(StorageKind.Input, IoVariable.BaseVertex); diff --git a/src/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs b/src/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs index 5bdbb0025..3d19586db 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/EmitterContextInsts.cs @@ -631,7 +631,7 @@ namespace Ryujinx.Graphics.Shader.Translation setAndBinding.SetIndex, setAndBinding.Binding, 0, - new[] { dest }, + [dest], sources)); return dest; @@ -759,7 +759,7 @@ namespace Ryujinx.Graphics.Shader.Translation setAndBinding.SetIndex, setAndBinding.Binding, compIndex, - new[] { dest }, + [dest], sources)); return dest; @@ -959,7 +959,7 @@ namespace Ryujinx.Graphics.Shader.Translation setAndBinding.SetIndex, setAndBinding.Binding, 0, - new[] { dest }, + [dest], sources)); return dest; @@ -983,7 +983,7 @@ namespace Ryujinx.Graphics.Shader.Translation setAndBinding.SetIndex, setAndBinding.Binding, compIndex, - new[] { dest }, + [dest], sources)); return dest; diff --git a/src/Ryujinx.Graphics.Shader/Translation/FunctionMatch.cs b/src/Ryujinx.Graphics.Shader/Translation/FunctionMatch.cs index b792776df..b396de06b 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/FunctionMatch.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/FunctionMatch.cs @@ -132,7 +132,7 @@ namespace Ryujinx.Graphics.Shader.Translation public TreeNode(InstOp op, byte order) { Op = op; - Uses = new List(); + Uses = []; Type = TreeNodeType.Op; Order = order; } @@ -150,7 +150,7 @@ namespace Ryujinx.Graphics.Shader.Translation private static TreeNode[] BuildTree(Block[] blocks) { - List nodes = new(); + List nodes = []; Dictionary labels = new(); @@ -382,7 +382,7 @@ namespace Ryujinx.Graphics.Shader.Translation Type = type; Order = order; IsImm = isImm; - Uses = new List(); + Uses = []; } public PatternTreeNode Use(PatternTreeNodeUse use) @@ -490,8 +490,8 @@ namespace Ryujinx.Graphics.Shader.Translation for (int index = 0; index < pTreeNode.Uses.Count; index++) { - var pUse = pTreeNode.Uses[index]; - var cUse = cTreeNode.Uses[index]; + PatternTreeNodeUse pUse = pTreeNode.Uses[index]; + TreeNodeUse cUse = cTreeNode.Uses[index]; if (pUse.Index <= -2) { @@ -524,11 +524,11 @@ namespace Ryujinx.Graphics.Shader.Translation { public static IPatternTreeNode[] GetFsiGetAddress() { - var affinityValue = S2r(SReg.Affinity).Use(PT).Out; - var orderingTicketValue = S2r(SReg.OrderingTicket).Use(PT).Out; + PatternTreeNodeUse affinityValue = S2r(SReg.Affinity).Use(PT).Out; + PatternTreeNodeUse orderingTicketValue = S2r(SReg.OrderingTicket).Use(PT).Out; - return new IPatternTreeNode[] - { + return + [ Iscadd(cc: true, 2, 0, 404) .Use(PT) .Use(Iscadd(cc: false, 8) @@ -548,17 +548,17 @@ namespace Ryujinx.Graphics.Shader.Translation .Use(PT) .Use(orderingTicketValue).Out), Iadd(x: true, 0, 405).Use(PT).Use(RZ), - Ret().Use(PT), - }; + Ret().Use(PT) + ]; } public static IPatternTreeNode[] GetFsiGetAddressV2() { - var affinityValue = S2r(SReg.Affinity).Use(PT).Out; - var orderingTicketValue = S2r(SReg.OrderingTicket).Use(PT).Out; + PatternTreeNodeUse affinityValue = S2r(SReg.Affinity).Use(PT).Out; + PatternTreeNodeUse orderingTicketValue = S2r(SReg.OrderingTicket).Use(PT).Out; - return new IPatternTreeNode[] - { + return + [ ShrU32W(16) .Use(PT) .Use(orderingTicketValue), @@ -576,17 +576,17 @@ namespace Ryujinx.Graphics.Shader.Translation .Use(PT) .Use(orderingTicketValue).Out).Out), Iadd(x: true, 0, 405).Use(PT).Use(RZ), - Ret().Use(PT), - }; + Ret().Use(PT) + ]; } public static IPatternTreeNode[] GetFsiIsLastWarpThread() { - var threadKillValue = S2r(SReg.ThreadKill).Use(PT).Out; - var laneIdValue = S2r(SReg.LaneId).Use(PT).Out; + PatternTreeNodeUse threadKillValue = S2r(SReg.ThreadKill).Use(PT).Out; + PatternTreeNodeUse laneIdValue = S2r(SReg.LaneId).Use(PT).Out; - return new IPatternTreeNode[] - { + return + [ IsetpU32(IComp.Eq) .Use(PT) .Use(PT) @@ -603,17 +603,17 @@ namespace Ryujinx.Graphics.Shader.Translation .Use(threadKillValue).OutAt(1)) .Use(RZ).Out).OutAt(1)).Out) .Use(laneIdValue), - Ret().Use(PT), - }; + Ret().Use(PT) + ]; } public static IPatternTreeNode[] GetFsiBeginPattern() { - var addressLowValue = CallArg(1); + PatternTreeNodeUse addressLowValue = CallArg(1); static PatternTreeNodeUse HighU16Equals(PatternTreeNodeUse x) { - var expectedValue = CallArg(3); + PatternTreeNodeUse expectedValue = CallArg(3); return IsetpU32(IComp.Eq) .Use(PT) @@ -624,8 +624,8 @@ namespace Ryujinx.Graphics.Shader.Translation PatternTreeNode label; - return new IPatternTreeNode[] - { + return + [ Cal(), Ret().Use(CallArg(0).Inv), Ret() @@ -638,22 +638,22 @@ namespace Ryujinx.Graphics.Shader.Translation .Use(PT) .Use(addressLowValue).Out).Inv) .Use(label.Out), - Ret().Use(PT), - }; + Ret().Use(PT) + ]; } public static IPatternTreeNode[] GetFsiEndPattern() { - var voteResult = Vote(VoteMode.All).Use(PT).Use(PT).OutAt(1); - var popcResult = Popc().Use(PT).Use(voteResult).Out; - var threadKillValue = S2r(SReg.ThreadKill).Use(PT).Out; - var laneIdValue = S2r(SReg.LaneId).Use(PT).Out; + PatternTreeNodeUse voteResult = Vote(VoteMode.All).Use(PT).Use(PT).OutAt(1); + PatternTreeNodeUse popcResult = Popc().Use(PT).Use(voteResult).Out; + PatternTreeNodeUse threadKillValue = S2r(SReg.ThreadKill).Use(PT).Out; + PatternTreeNodeUse laneIdValue = S2r(SReg.LaneId).Use(PT).Out; - var addressLowValue = CallArg(1); - var incrementValue = CallArg(2); + PatternTreeNodeUse addressLowValue = CallArg(1); + PatternTreeNodeUse incrementValue = CallArg(2); - return new IPatternTreeNode[] - { + return + [ Cal(), Ret().Use(CallArg(0).Inv), Membar(Decoders.Membar.Vc).Use(PT), @@ -684,8 +684,8 @@ namespace Ryujinx.Graphics.Shader.Translation .Use(incrementValue) .Use(popcResult) .Use(RZ).Out).Out), - Ret().Use(PT), - }; + Ret().Use(PT) + ]; } private static PatternTreeNode Bfi(int imm) diff --git a/src/Ryujinx.Graphics.Shader/Translation/HelperFunctionManager.cs b/src/Ryujinx.Graphics.Shader/Translation/HelperFunctionManager.cs index ef2f8759d..ec181bb09 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/HelperFunctionManager.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/HelperFunctionManager.cs @@ -470,6 +470,5 @@ namespace Ryujinx.Graphics.Shader.Translation return oldValue; } - } } diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/ConstantFolding.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/ConstantFolding.cs index 3941303b1..345e83c82 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/ConstantFolding.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/ConstantFolding.cs @@ -167,6 +167,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations operation.TurnIntoCopy(Cbuf(cbufSlot, cbufOffset)); } } + break; case Instruction.Maximum: diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/DoubleToFloat.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/DoubleToFloat.cs index aec95a9cc..208ca3935 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/DoubleToFloat.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/DoubleToFloat.cs @@ -28,7 +28,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations { int functionId = hfm.GetOrCreateFunctionId(HelperFunctionName.ConvertDoubleToFloat); - Operand[] callArgs = new Operand[] { Const(functionId), operation.GetSource(0), operation.GetSource(1) }; + Operand[] callArgs = [Const(functionId), operation.GetSource(0), operation.GetSource(1)]; Operand floatValue = operation.Dest; @@ -51,7 +51,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations operation.Dest = null; - Operand[] callArgs = new Operand[] { Const(functionId), operation.GetSource(0), resultLow, resultHigh }; + Operand[] callArgs = [Const(functionId), operation.GetSource(0), resultLow, resultHigh]; LinkedListNode newNode = node.List.AddBefore(node, new Operation(Instruction.Call, 0, (Operand)null, callArgs)); diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/GlobalToStorage.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/GlobalToStorage.cs index 8a730ef74..55628c88b 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/GlobalToStorage.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/GlobalToStorage.cs @@ -77,7 +77,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations public GtsContext(HelperFunctionManager hfm) { - _entries = new List(); + _entries = []; _sharedEntries = new Dictionary>(); _hfm = hfm; } @@ -91,7 +91,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations return functionId; } - public bool TryGetFunctionId(Operation baseOp, bool isMultiTarget, IReadOnlyList targetCbs, out int functionId) + public bool TryGetFunctionId(Operation baseOp, bool isMultiTarget, List targetCbs, out int functionId) { foreach (Entry entry in _entries) { @@ -267,7 +267,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations { Operand value = operation.GetSource(operation.SourcesCount - 1); - var result = FindUniqueBaseAddressCb(gtsContext, block, value, needsOffset: false); + SearchResult result = FindUniqueBaseAddressCb(gtsContext, block, value, needsOffset: false); if (result.Found) { uint targetCb = PackCbSlotAndOffset(result.SbCbSlot, result.SbCbOffset); @@ -281,19 +281,19 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations private static bool IsGlobalMemory(StorageKind storageKind) { - return storageKind == StorageKind.GlobalMemory || - storageKind == StorageKind.GlobalMemoryS8 || - storageKind == StorageKind.GlobalMemoryS16 || - storageKind == StorageKind.GlobalMemoryU8 || - storageKind == StorageKind.GlobalMemoryU16; + return storageKind is StorageKind.GlobalMemory or + StorageKind.GlobalMemoryS8 or + StorageKind.GlobalMemoryS16 or + StorageKind.GlobalMemoryU8 or + StorageKind.GlobalMemoryU16; } private static bool IsSmallInt(StorageKind storageKind) { - return storageKind == StorageKind.GlobalMemoryS8 || - storageKind == StorageKind.GlobalMemoryS16 || - storageKind == StorageKind.GlobalMemoryU8 || - storageKind == StorageKind.GlobalMemoryU16; + return storageKind is StorageKind.GlobalMemoryS8 or + StorageKind.GlobalMemoryS16 or + StorageKind.GlobalMemoryU8 or + StorageKind.GlobalMemoryU16; } private static LinkedListNode ReplaceGlobalMemoryWithStorage( @@ -420,22 +420,22 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations if (operation.Inst == Instruction.AtomicCompareAndSwap) { - sources = new[] - { + sources = + [ Const(binding), Const(0), wordOffset, operation.GetSource(operation.SourcesCount - 2), - operation.GetSource(operation.SourcesCount - 1), - }; + operation.GetSource(operation.SourcesCount - 1) + ]; } else if (isStore) { - sources = new[] { Const(binding), Const(0), wordOffset, operation.GetSource(operation.SourcesCount - 1) }; + sources = [Const(binding), Const(0), wordOffset, operation.GetSource(operation.SourcesCount - 1)]; } else { - sources = new[] { Const(binding), Const(0), wordOffset }; + sources = [Const(binding), Const(0), wordOffset]; } Operation shiftOp = new(Instruction.ShiftRightU32, wordOffset, offset, Const(2)); @@ -507,7 +507,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations SearchResult result, out int functionId) { - List targetCbs = new() { PackCbSlotAndOffset(result.SbCbSlot, result.SbCbOffset) }; + List targetCbs = [PackCbSlotAndOffset(result.SbCbSlot, result.SbCbOffset)]; if (gtsContext.TryGetFunctionId(operation, isMultiTarget: false, targetCbs, out functionId)) { @@ -592,8 +592,8 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations out int functionId) { Queue phis = new(); - HashSet visited = new(); - List targetCbs = new(); + HashSet visited = []; + List targetCbs = []; Operand globalAddress = operation.GetSource(0); @@ -865,6 +865,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations return context.IMaximumS32(memValue, value); }); } + break; case Instruction.AtomicMaxU32: resultValue = context.AtomicMaxU32(StorageKind.StorageBuffer, binding, Const(0), wordOffset, value); @@ -881,6 +882,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations return context.IMinimumS32(memValue, value); }); } + break; case Instruction.AtomicMinU32: resultValue = context.AtomicMinU32(StorageKind.StorageBuffer, binding, Const(0), wordOffset, value); @@ -1018,7 +1020,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations offset = src1; } - var result = GetBaseAddressCbWithOffset(baseAddr, offset, 0); + SearchResult result = GetBaseAddressCbWithOffset(baseAddr, offset, 0); if (result.Found) { return result; @@ -1100,7 +1102,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations { baseOffset = null; - if (operation.Inst == Instruction.Load || operation.Inst == Instruction.Store) + if (operation.Inst is Instruction.Load or Instruction.Store) { if (operation.StorageKind == StorageKind.SharedMemory) { diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs index 1be7c5c52..022532af8 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs @@ -9,6 +9,11 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations { public static void RunPass(TransformContext context) { + for (int blkIndex = 0; blkIndex < context.Blocks.Length; blkIndex++) + { + XmadOptimizer.RunPass(context.Blocks[blkIndex]); + } + RunOptimizationPasses(context.Blocks, context.ResourceManager); // TODO: Some of those are not optimizations and shouldn't be here. @@ -355,7 +360,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations operation.TurnIntoCopy(attrMulLhs); } - private static void RemoveNode(BasicBlock block, LinkedListNode llNode) + public static void RemoveNode(BasicBlock block, LinkedListNode llNode) { // Remove a node from the nodes list, and also remove itself // from all the use lists on the operands that this node uses. diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs index 097c8aa88..282c136e1 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Simplification.cs @@ -25,6 +25,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations { TryEliminateBinaryOpCommutative(operation, 0); } + break; case Instruction.BitwiseOr: diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs index 6ec90fa3c..449886e11 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs @@ -45,7 +45,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations return x == y || x.Type == OperandType.Constant || x.Type == OperandType.ConstantBuffer; } - private static bool AreAllSourcesEqual(INode node, INode otherNode) + private static bool AreAllSourcesEqual(Operation node, Operation otherNode) { if (node.SourcesCount != otherNode.SourcesCount) { @@ -96,7 +96,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations private static bool IsConditionalBranch(Instruction inst) { - return inst == Instruction.BranchIfFalse || inst == Instruction.BranchIfTrue; + return inst is Instruction.BranchIfFalse or Instruction.BranchIfTrue; } private static bool IsSameCondition(Operand currentCondition, Operand queryCondition) diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/XmadOptimizer.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/XmadOptimizer.cs new file mode 100644 index 000000000..91073164d --- /dev/null +++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/XmadOptimizer.cs @@ -0,0 +1,342 @@ +using Ryujinx.Graphics.Shader.IntermediateRepresentation; +using System.Collections.Generic; + +namespace Ryujinx.Graphics.Shader.Translation.Optimizations +{ + static class XmadOptimizer + { + public static void RunPass(BasicBlock block) + { + for (LinkedListNode node = block.Operations.First; node != null; node = node.Next) + { + if (node.Value is not Operation operation) + { + continue; + } + + if (TryMatchXmadPattern(operation, out Operand x, out Operand y, out Operand addend)) + { + LinkedListNode nextNode; + + if (addend != null) + { + Operand temp = OperandHelper.Local(); + + nextNode = block.Operations.AddAfter(node, new Operation(Instruction.Multiply, temp, x, y)); + nextNode = block.Operations.AddAfter(nextNode, new Operation(Instruction.Add, operation.Dest, temp, addend)); + } + else + { + nextNode = block.Operations.AddAfter(node, new Operation(Instruction.Multiply, operation.Dest, x, y)); + } + + Optimizer.RemoveNode(block, node); + node = nextNode; + } + } + } + + private static bool TryMatchXmadPattern(Operation operation, out Operand x, out Operand y, out Operand addend) + { + return TryMatchXmad32x32Pattern(operation, out x, out y, out addend) || + TryMatchXmad32x16Pattern(operation, out x, out y, out addend); + } + + private static bool TryMatchXmad32x32Pattern(Operation operation, out Operand x, out Operand y, out Operand addend) + { + x = null; + y = null; + addend = null; + + if (operation.Inst != Instruction.Add) + { + return false; + } + + Operand src1 = operation.GetSource(0); + Operand src2 = operation.GetSource(1); + + if (src2.AsgOp is not Operation addOp || addOp.Inst != Instruction.Add) + { + return false; + } + + Operand lowTimesLowResult = GetCopySource(addOp.GetSource(0)); + + if (lowTimesLowResult.AsgOp is not Operation lowTimesLowOp) + { + return false; + } + + if (!TryMatchLowTimesLow(lowTimesLowOp, out x, out y, out addend)) + { + return false; + } + + Operand lowTimesHighResult = GetCopySource(GetShifted16Source(addOp.GetSource(1), Instruction.ShiftLeft)); + + if (lowTimesHighResult.AsgOp is not Operation lowTimesHighOp) + { + return false; + } + + if (!TryMatchLowTimesHigh(lowTimesHighOp, x, y)) + { + return false; + } + + if (src1.AsgOp is not Operation highTimesHighOp) + { + return false; + } + + if (!TryMatchHighTimesHigh(highTimesHighOp, x, lowTimesHighResult)) + { + return false; + } + + return true; + } + + private static bool TryMatchXmad32x16Pattern(Operation operation, out Operand x, out Operand y, out Operand addend) + { + x = null; + y = null; + addend = null; + + if (operation.Inst != Instruction.Add) + { + return false; + } + + Operand src1 = operation.GetSource(0); + Operand src2 = operation.GetSource(1); + + Operand lowTimesLowResult = GetCopySource(src2); + + if (lowTimesLowResult.AsgOp is not Operation lowTimesLowOp) + { + return false; + } + + if (!TryMatchLowTimesLow(lowTimesLowOp, out x, out y, out addend)) + { + return false; + } + + Operand highTimesLowResult = src1; + + if (highTimesLowResult.AsgOp is not Operation highTimesLowOp) + { + return false; + } + + if (!TryMatchHighTimesLow(highTimesLowOp, x, y)) + { + return false; + } + + return y.Type == OperandType.Constant && (ushort)y.Value == y.Value; + } + + private static bool TryMatchLowTimesLow(Operation operation, out Operand x, out Operand y, out Operand addend) + { + // x = x & 0xFFFF + // y = y & 0xFFFF + // lowTimesLow = x * y + + x = null; + y = null; + addend = null; + + if (operation.Inst == Instruction.Add) + { + if (operation.GetSource(0).AsgOp is not Operation mulOp) + { + return false; + } + + addend = operation.GetSource(1); + operation = mulOp; + } + + if (operation.Inst != Instruction.Multiply) + { + return false; + } + + Operand src1 = GetMasked16Source(operation.GetSource(0)); + Operand src2 = GetMasked16Source(operation.GetSource(1)); + + if (src1 == null || src2 == null) + { + return false; + } + + x = src1; + y = src2; + + return true; + } + + private static bool TryMatchLowTimesHigh(Operation operation, Operand x, Operand y) + { + // xLow = x & 0xFFFF + // yHigh = y >> 16 + // lowTimesHigh = xLow * yHigh + // result = (lowTimesHigh & 0xFFFF) | (y << 16) + + if (operation.Inst != Instruction.BitwiseOr) + { + return false; + } + + Operand mulResult = GetMasked16Source(operation.GetSource(0)); + + if (mulResult == null) + { + return false; + } + + mulResult = GetCopySource(mulResult); + + if (mulResult.AsgOp is not Operation mulOp || mulOp.Inst != Instruction.Multiply) + { + return false; + } + + if (GetMasked16Source(mulOp.GetSource(0)) != x) + { + return false; + } + + if (GetShifted16Source(mulOp.GetSource(1), Instruction.ShiftRightU32) != y) + { + return false; + } + + if (GetShifted16Source(operation.GetSource(1), Instruction.ShiftLeft) != y) + { + return false; + } + + return true; + } + + private static bool TryMatchHighTimesLow(Operation operation, Operand x, Operand y) + { + // xHigh = x >> 16 + // yLow = y & 0xFFFF + // highTimesLow = xHigh * yLow + // result = highTimesLow << 16 + + if (operation.Inst != Instruction.ShiftLeft || !IsConst(operation.GetSource(1), 16)) + { + return false; + } + + Operand mulResult = operation.GetSource(0); + + if (mulResult.AsgOp is not Operation mulOp || mulOp.Inst != Instruction.Multiply) + { + return false; + } + + if (GetShifted16Source(mulOp.GetSource(0), Instruction.ShiftRightU32) != x) + { + return false; + } + + Operand src2 = GetMasked16Source(mulOp.GetSource(1)); + + if (src2.Type != y.Type || src2.Value != y.Value) + { + return false; + } + + return true; + } + + private static bool TryMatchHighTimesHigh(Operation operation, Operand x, Operand lowTimesHighResult) + { + // xHigh = x >> 16 + // lowTimesHighResultHigh = lowTimesHighResult >> 16 + // highTimesHigh = xHigh * lowTimesHighResultHigh + // result = highTimesHigh << 16 + + if (operation.Inst != Instruction.ShiftLeft || !IsConst(operation.GetSource(1), 16)) + { + return false; + } + + Operand mulResult = operation.GetSource(0); + + if (mulResult.AsgOp is not Operation mulOp || mulOp.Inst != Instruction.Multiply) + { + return false; + } + + if (GetShifted16Source(mulOp.GetSource(0), Instruction.ShiftRightU32) != x) + { + return false; + } + + if (GetCopySource(GetShifted16Source(mulOp.GetSource(1), Instruction.ShiftRightU32)) != lowTimesHighResult) + { + return false; + } + + return true; + } + + private static Operand GetMasked16Source(Operand value) + { + if (value.AsgOp is not Operation maskOp) + { + return null; + } + + if (maskOp.Inst != Instruction.BitwiseAnd || !IsConst(maskOp.GetSource(1), ushort.MaxValue)) + { + return null; + } + + return maskOp.GetSource(0); + } + + private static Operand GetShifted16Source(Operand value, Instruction shiftInst) + { + if (value.AsgOp is not Operation shiftOp) + { + return null; + } + + if (shiftOp.Inst != shiftInst || !IsConst(shiftOp.GetSource(1), 16)) + { + return null; + } + + return shiftOp.GetSource(0); + } + + private static Operand GetCopySource(Operand value) + { + while (value.AsgOp is Operation operation && IsCopy(operation)) + { + value = operation.GetSource(0); + } + + return value; + } + + private static bool IsCopy(Operation operation) + { + return operation.Inst == Instruction.Copy || (operation.Inst == Instruction.Add && IsConst(operation.GetSource(1), 0)); + } + + private static bool IsConst(Operand operand, int value) + { + return operand.Type == OperandType.Constant && operand.Value == value; + } + } +} diff --git a/src/Ryujinx.Graphics.Shader/Translation/RegisterUsage.cs b/src/Ryujinx.Graphics.Shader/Translation/RegisterUsage.cs index 1c724223c..c6bbb4968 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/RegisterUsage.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/RegisterUsage.cs @@ -128,8 +128,8 @@ namespace Ryujinx.Graphics.Shader.Translation public static FunctionRegisterUsage RunPass(ControlFlowGraph cfg) { - List inArguments = new(); - List outArguments = new(); + List inArguments = []; + List outArguments = []; // Compute local register inputs and outputs used inside blocks. RegisterMask[] localInputs = new RegisterMask[cfg.Blocks.Length]; @@ -302,7 +302,7 @@ namespace Ryujinx.Graphics.Shader.Translation Debug.Assert(funcId.Type == OperandType.Constant); - var fru = frus[funcId.Value]; + FunctionRegisterUsage fru = frus[funcId.Value]; Operand[] inRegs = new Operand[fru.InArguments.Length]; diff --git a/src/Ryujinx.Graphics.Shader/Translation/ShaderDefinitions.cs b/src/Ryujinx.Graphics.Shader/Translation/ShaderDefinitions.cs index f831ec940..656ad6c5e 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/ShaderDefinitions.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/ShaderDefinitions.cs @@ -192,7 +192,7 @@ namespace Ryujinx.Graphics.Shader.Translation component = subIndex; } - var transformFeedbackVariable = new TransformFeedbackVariable(ioVariable, location, component); + TransformFeedbackVariable transformFeedbackVariable = new(ioVariable, location, component); _transformFeedbackDefinitions.TryAdd(transformFeedbackVariable, transformFeedbackOutputs[wordOffset]); } } @@ -219,7 +219,7 @@ namespace Ryujinx.Graphics.Shader.Translation return false; } - var transformFeedbackVariable = new TransformFeedbackVariable(ioVariable, location, component); + TransformFeedbackVariable transformFeedbackVariable = new(ioVariable, location, component); return _transformFeedbackDefinitions.TryGetValue(transformFeedbackVariable, out transformFeedbackOutput); } @@ -271,8 +271,8 @@ namespace Ryujinx.Graphics.Shader.Translation for (; count < 4; count++) { - ref var prev = ref _transformFeedbackOutputs[baseIndex + count - 1]; - ref var curr = ref _transformFeedbackOutputs[baseIndex + count]; + ref TransformFeedbackOutput prev = ref _transformFeedbackOutputs[baseIndex + count - 1]; + ref TransformFeedbackOutput curr = ref _transformFeedbackOutputs[baseIndex + count]; int prevOffset = prev.Offset; int currOffset = curr.Offset; diff --git a/src/Ryujinx.Graphics.Shader/Translation/ShaderHeader.cs b/src/Ryujinx.Graphics.Shader/Translation/ShaderHeader.cs index 39f01b1ce..0fcdff691 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/ShaderHeader.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/ShaderHeader.cs @@ -33,10 +33,12 @@ namespace Ryujinx.Graphics.Shader.Translation { return X; } + if (Y != PixelImap.Unused) { return Y; } + if (Z != PixelImap.Unused) { return Z; diff --git a/src/Ryujinx.Graphics.Shader/Translation/Transforms/GeometryToCompute.cs b/src/Ryujinx.Graphics.Shader/Translation/Transforms/GeometryToCompute.cs index 0013cf0eb..573acc942 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Transforms/GeometryToCompute.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Transforms/GeometryToCompute.cs @@ -91,6 +91,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms context.GpuAccessor.Log($"Invalid output \"{(IoVariable)operation.GetSource(0).Value}\"."); } } + break; case Instruction.Store: if (operation.StorageKind == StorageKind.Output) @@ -110,6 +111,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms context.GpuAccessor.Log($"Invalid output \"{(IoVariable)operation.GetSource(0).Value}\"."); } } + break; } diff --git a/src/Ryujinx.Graphics.Shader/Translation/Transforms/SharedAtomicSignedCas.cs b/src/Ryujinx.Graphics.Shader/Translation/Transforms/SharedAtomicSignedCas.cs index 112b3b197..c556e8149 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Transforms/SharedAtomicSignedCas.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Transforms/SharedAtomicSignedCas.cs @@ -46,7 +46,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms int functionId = context.Hfm.GetOrCreateFunctionId(name, memoryId.Value); - Operand[] callArgs = new Operand[] { Const(functionId), byteOffset, value }; + Operand[] callArgs = [Const(functionId), byteOffset, value]; LinkedListNode newNode = node.List.AddBefore(node, new Operation(Instruction.Call, 0, result, callArgs)); diff --git a/src/Ryujinx.Graphics.Shader/Translation/Transforms/SharedStoreSmallIntCas.cs b/src/Ryujinx.Graphics.Shader/Translation/Transforms/SharedStoreSmallIntCas.cs index e58be0a8e..2852a61ad 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Transforms/SharedStoreSmallIntCas.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Transforms/SharedStoreSmallIntCas.cs @@ -45,7 +45,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms int functionId = context.Hfm.GetOrCreateFunctionId(name, memoryId.Value); - Operand[] callArgs = new Operand[] { Const(functionId), byteOffset, value }; + Operand[] callArgs = [Const(functionId), byteOffset, value]; LinkedListNode newNode = node.List.AddBefore(node, new Operation(Instruction.Call, 0, (Operand)null, callArgs)); diff --git a/src/Ryujinx.Graphics.Shader/Translation/Transforms/ShufflePass.cs b/src/Ryujinx.Graphics.Shader/Translation/Transforms/ShufflePass.cs index 839d4f818..9cb361e6c 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Transforms/ShufflePass.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Transforms/ShufflePass.cs @@ -40,7 +40,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms operation.Dest = null; - Operand[] callArgs = new Operand[] { Const(functionId), value, index, mask, valid }; + Operand[] callArgs = [Const(functionId), value, index, mask, valid]; LinkedListNode newNode = node.List.AddBefore(node, new Operation(Instruction.Call, 0, result, callArgs)); diff --git a/src/Ryujinx.Graphics.Shader/Translation/Transforms/TexturePass.cs b/src/Ryujinx.Graphics.Shader/Translation/Transforms/TexturePass.cs index 6ba8cb44a..808692559 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Transforms/TexturePass.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Transforms/TexturePass.cs @@ -71,11 +71,12 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms if (stage == ShaderStage.Fragment) { - callArgs = new Operand[] { Const(functionId), texOp.GetSource(coordsIndex + index), Const(samplerIndex), Const(index) }; + callArgs = [Const(functionId), texOp.GetSource(coordsIndex + index), Const(samplerIndex), Const(index) + ]; } else { - callArgs = new Operand[] { Const(functionId), texOp.GetSource(coordsIndex + index), Const(samplerIndex) }; + callArgs = [Const(functionId), texOp.GetSource(coordsIndex + index), Const(samplerIndex)]; } node.List.AddBefore(node, new Operation(Instruction.Call, 0, scaledCoord, callArgs)); @@ -127,7 +128,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms } } - Operand[] callArgs = new Operand[] { Const(functionId), dest, Const(samplerIndex) }; + Operand[] callArgs = [Const(functionId), dest, Const(samplerIndex)]; node.List.AddAfter(node, new Operation(Instruction.Call, 0, unscaledSize, callArgs)); } @@ -175,7 +176,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms { Operand coordSize = Local(); - Operand[] texSizeSources = new Operand[] { Const(0) }; + Operand[] texSizeSources = [Const(0)]; LinkedListNode textureSizeNode = node.List.AddBefore(node, new TextureOperation( Instruction.TextureQuerySize, @@ -185,7 +186,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms texOp.Set, texOp.Binding, index, - new[] { coordSize }, + [coordSize], texSizeSources)); resourceManager.SetUsageFlagsForTextureQuery(texOp.Binding, texOp.Type); @@ -240,11 +241,11 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms if (isBindless || isIndexed) { - texSizeSources = new Operand[] { texOp.GetSource(0), Const(0) }; + texSizeSources = [texOp.GetSource(0), Const(0)]; } else { - texSizeSources = new Operand[] { Const(0) }; + texSizeSources = [Const(0)]; } node.List.AddBefore(node, new TextureOperation( @@ -255,7 +256,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms texOp.Set, texOp.Binding, index, - new[] { coordSize }, + [coordSize], texSizeSources)); node.List.AddBefore(node, new Operation( @@ -476,7 +477,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms texOp.Set, texOp.Binding, 1 << 3, // W component: i=0, j=0 - new[] { dests[destIndex++] }, + [dests[destIndex++]], newSources); node = node.List.AddBefore(node, newTexOp); @@ -565,11 +566,11 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms if (bindlessHandle != null) { - texSizeSources = new Operand[] { bindlessHandle, Const(0) }; + texSizeSources = [bindlessHandle, Const(0)]; } else { - texSizeSources = new Operand[] { Const(0) }; + texSizeSources = [Const(0)]; } node.List.AddBefore(node, new TextureOperation( @@ -580,7 +581,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms texOp.Set, texOp.Binding, index, - new[] { texSizes[index] }, + [texSizes[index]], texSizeSources)); } @@ -611,7 +612,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms texOp.Set, texOp.Binding, 0, - new[] { lod }, + [lod], lodSources)); } else @@ -627,11 +628,11 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms if (bindlessHandle != null) { - texSizeSources = new Operand[] { bindlessHandle, GenerateF2i(node, lod) }; + texSizeSources = [bindlessHandle, GenerateF2i(node, lod)]; } else { - texSizeSources = new Operand[] { GenerateF2i(node, lod) }; + texSizeSources = [GenerateF2i(node, lod)]; } node.List.AddBefore(node, new TextureOperation( @@ -642,7 +643,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms texOp.Set, texOp.Binding, index, - new[] { texSizes[index] }, + [texSizes[index]], texSizeSources)); } diff --git a/src/Ryujinx.Graphics.Shader/Translation/Transforms/VertexToCompute.cs b/src/Ryujinx.Graphics.Shader/Translation/Transforms/VertexToCompute.cs index ddd2134d2..2f85a33d1 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Transforms/VertexToCompute.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Transforms/VertexToCompute.cs @@ -66,8 +66,8 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms setAndBinding.SetIndex, setAndBinding.Binding, 1 << component, - new[] { temp }, - new[] { vertexElemOffset })); + [temp], + [vertexElemOffset])); if (needsSextNorm) { @@ -89,14 +89,15 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms setAndBinding.SetIndex, setAndBinding.Binding, 1, - new[] { temp }, - new[] { vertexElemOffset })); + [temp], + [vertexElemOffset])); if (component > 0) { newNode = CopyMasked(context.ResourceManager, newNode, location, component, dest, temp); } } + break; case IoVariable.GlobalId: case IoVariable.SubgroupEqMask: @@ -312,21 +313,21 @@ namespace Ryujinx.Graphics.Shader.Translation.Transforms private static LinkedListNode GenerateVertexIdVertexRateLoad(ResourceManager resourceManager, LinkedListNode node, Operand dest) { - Operand[] sources = new Operand[] { Const(resourceManager.LocalVertexIndexVertexRateMemoryId) }; + Operand[] sources = [Const(resourceManager.LocalVertexIndexVertexRateMemoryId)]; return node.List.AddBefore(node, new Operation(Instruction.Load, StorageKind.LocalMemory, dest, sources)); } private static LinkedListNode GenerateVertexIdInstanceRateLoad(ResourceManager resourceManager, LinkedListNode node, Operand dest) { - Operand[] sources = new Operand[] { Const(resourceManager.LocalVertexIndexInstanceRateMemoryId) }; + Operand[] sources = [Const(resourceManager.LocalVertexIndexInstanceRateMemoryId)]; return node.List.AddBefore(node, new Operation(Instruction.Load, StorageKind.LocalMemory, dest, sources)); } private static LinkedListNode GenerateInstanceIdLoad(LinkedListNode node, Operand dest) { - Operand[] sources = new Operand[] { Const((int)IoVariable.GlobalId), Const(1) }; + Operand[] sources = [Const((int)IoVariable.GlobalId), Const(1)]; return node.List.AddBefore(node, new Operation(Instruction.Load, StorageKind.Input, dest, sources)); } diff --git a/src/Ryujinx.Graphics.Shader/Translation/Translator.cs b/src/Ryujinx.Graphics.Shader/Translation/Translator.cs index d1fbca0eb..2a1110632 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Translator.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Translator.cs @@ -110,8 +110,8 @@ namespace Ryujinx.Graphics.Shader.Translation for (int tfbIndex = 0; tfbIndex < 4; tfbIndex++) { - var locations = gpuAccessor.QueryTransformFeedbackVaryingLocations(tfbIndex); - var stride = gpuAccessor.QueryTransformFeedbackStride(tfbIndex); + ReadOnlySpan locations = gpuAccessor.QueryTransformFeedbackVaryingLocations(tfbIndex); + int stride = gpuAccessor.QueryTransformFeedbackStride(tfbIndex); for (int i = 0; i < locations.Length; i++) { @@ -181,13 +181,29 @@ namespace Ryujinx.Graphics.Shader.Translation private static void EmitOutputsInitialization(EmitterContext context, AttributeUsage attributeUsage, IGpuAccessor gpuAccessor, ShaderStage stage) { - // Compute has no output attributes, and fragment is the last stage, so we - // don't need to initialize outputs on those stages. - if (stage == ShaderStage.Compute || stage == ShaderStage.Fragment) + // Compute has no output attributes, so we + // don't need to initialize outputs on that stage. + if (stage == ShaderStage.Compute) { return; } + if (stage == ShaderStage.Fragment) + { + // Fragment is the last stage, so we don't need to + // initialize outputs unless we're using DSB, in which + // we need to make sure the ouput has a valid value. + if (gpuAccessor.QueryGraphicsState().DualSourceBlendEnable) + { + for (int i = 0; i < 4; i++) + { + context.Store(StorageKind.Output, IoVariable.FragmentOutputColor, null, Const(1), Const(i), ConstF(0)); + } + } + + return; + } + if (stage == ShaderStage.Vertex) { InitializeVertexOutputs(context); diff --git a/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs b/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs index a579433f9..dd1325f8a 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs @@ -385,7 +385,7 @@ namespace Ryujinx.Graphics.Shader.Translation { StructureType tfeDataStruct = new(new StructureField[] { - new StructureField(AggregateType.Array | AggregateType.U32, "data", 0) + new(AggregateType.Array | AggregateType.U32, "data", 0) }); for (int i = 0; i < ResourceReservations.TfeBuffersCount; i++) @@ -404,7 +404,7 @@ namespace Ryujinx.Graphics.Shader.Translation StructureType vertexOutputStruct = new(new StructureField[] { - new StructureField(AggregateType.Array | AggregateType.FP32, "data", 0) + new(AggregateType.Array | AggregateType.FP32, "data", 0) }); int vertexOutputSbBinding = resourceManager.Reservations.VertexOutputStorageBufferBinding; @@ -441,7 +441,7 @@ namespace Ryujinx.Graphics.Shader.Translation StructureType geometryIbOutputStruct = new(new StructureField[] { - new StructureField(AggregateType.Array | AggregateType.U32, "data", 0) + new(AggregateType.Array | AggregateType.U32, "data", 0) }); int geometryIbOutputSbBinding = resourceManager.Reservations.GeometryIndexOutputStorageBufferBinding; @@ -501,7 +501,7 @@ namespace Ryujinx.Graphics.Shader.Translation StructureType vertexInputStruct = new(new StructureField[] { - new StructureField(AggregateType.Array | AggregateType.FP32, "data", 0) + new(AggregateType.Array | AggregateType.FP32, "data", 0) }); int vertexDataSbBinding = reservations.VertexOutputStorageBufferBinding; diff --git a/src/Ryujinx.Graphics.Shader/VertexInfoBuffer.cs b/src/Ryujinx.Graphics.Shader/VertexInfoBuffer.cs index 845135f86..000d372dc 100644 --- a/src/Ryujinx.Graphics.Shader/VertexInfoBuffer.cs +++ b/src/Ryujinx.Graphics.Shader/VertexInfoBuffer.cs @@ -42,13 +42,12 @@ namespace Ryujinx.Graphics.Shader internal static StructureType GetStructureType() { - return new StructureType(new[] - { + return new StructureType([ new StructureField(AggregateType.Vector4 | AggregateType.U32, "vertex_counts"), new StructureField(AggregateType.Vector4 | AggregateType.U32, "geometry_counts"), new StructureField(AggregateType.Array | AggregateType.Vector4 | AggregateType.U32, "vertex_strides", ResourceReservations.MaxVertexBufferTextures), - new StructureField(AggregateType.Array | AggregateType.Vector4 | AggregateType.U32, "vertex_offsets", ResourceReservations.MaxVertexBufferTextures), - }); + new StructureField(AggregateType.Array | AggregateType.Vector4 | AggregateType.U32, "vertex_offsets", ResourceReservations.MaxVertexBufferTextures) + ]); } public Vector4 VertexCounts; diff --git a/src/Ryujinx.Graphics.Texture/Astc/AstcDecoder.cs b/src/Ryujinx.Graphics.Texture/Astc/AstcDecoder.cs index 92e39d2e0..1053f6f18 100644 --- a/src/Ryujinx.Graphics.Texture/Astc/AstcDecoder.cs +++ b/src/Ryujinx.Graphics.Texture/Astc/AstcDecoder.cs @@ -480,6 +480,7 @@ namespace Ryujinx.Graphics.Texture.Astc { Debug.Assert(colorEndpointMode[i] < 16); } + Debug.Assert(bitStream.BitsLeft == texelParams.GetPackedBitSize()); // Decode both color data and texel weight data @@ -1032,7 +1033,6 @@ namespace Ryujinx.Graphics.Texture.Astc break; } - case 1: { Span val = ReadUintColorValues(2, colorValues, ref colorValuesPosition); @@ -1295,7 +1295,6 @@ namespace Ryujinx.Graphics.Texture.Astc break; } - case 4: { c = 22; @@ -1389,6 +1388,7 @@ namespace Ryujinx.Graphics.Texture.Astc default: throw new AstcDecoderException("Unsupported quint encoding for color values."); } + break; } } @@ -1574,7 +1574,7 @@ namespace Ryujinx.Graphics.Texture.Astc r |= (modeBits & 0xC) >> 1; } - Debug.Assert(2 <= r && r <= 7); + Debug.Assert(r is >= 2 and <= 7); // Determine width & height switch (layout) @@ -1693,12 +1693,12 @@ namespace Ryujinx.Graphics.Texture.Astc if (h) { - ReadOnlySpan maxWeights = new byte[] { 9, 11, 15, 19, 23, 31 }; + ReadOnlySpan maxWeights = [9, 11, 15, 19, 23, 31]; texelParams.MaxWeight = maxWeights[r - 2]; } else { - ReadOnlySpan maxWeights = new byte[] { 1, 2, 3, 4, 5, 7 }; + ReadOnlySpan maxWeights = [1, 2, 3, 4, 5, 7]; texelParams.MaxWeight = maxWeights[r - 2]; } diff --git a/src/Ryujinx.Graphics.Texture/Astc/Bits.cs b/src/Ryujinx.Graphics.Texture/Astc/Bits.cs index bedc14f78..2cc29acc3 100644 --- a/src/Ryujinx.Graphics.Texture/Astc/Bits.cs +++ b/src/Ryujinx.Graphics.Texture/Astc/Bits.cs @@ -52,6 +52,7 @@ namespace Ryujinx.Graphics.Texture.Astc comp = numberBits - newShift; numberBits = newShift; } + retValue <<= numberBits; retValue |= tempValue >> comp; resLength += numberBits; diff --git a/src/Ryujinx.Graphics.Texture/Astc/IntegerEncoded.cs b/src/Ryujinx.Graphics.Texture/Astc/IntegerEncoded.cs index dc99de2b6..61ab2f571 100644 --- a/src/Ryujinx.Graphics.Texture/Astc/IntegerEncoded.cs +++ b/src/Ryujinx.Graphics.Texture/Astc/IntegerEncoded.cs @@ -52,6 +52,7 @@ namespace Ryujinx.Graphics.Texture.Astc { totalBits += (numberVals * 7 + 2) / 3; } + return totalBits; } @@ -129,7 +130,7 @@ namespace Ryujinx.Graphics.Texture.Astc ref IntegerSequence listIntegerEncoded, int numberBitsPerValue) { - ReadOnlySpan interleavedBits = new byte[] { 3, 2, 2 }; + ReadOnlySpan interleavedBits = [3, 2, 2]; // Implement the algorithm in section C.2.12 Span m = stackalloc int[3]; @@ -213,8 +214,8 @@ namespace Ryujinx.Graphics.Texture.Astc return QuintEncodings.Slice(index * 3, 3); } - private static ReadOnlySpan TritEncodings => new byte[] - { + private static ReadOnlySpan TritEncodings => + [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 2, 1, 0, 0, 0, 1, 0, 2, 0, 0, 0, 2, 0, 0, 0, @@ -300,11 +301,11 @@ namespace Ryujinx.Graphics.Texture.Astc 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 0, 2, 1, 1, 2, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 0, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 1, 2, 2, 2, - }; + 2, 1, 2, 2, 2 + ]; - private static ReadOnlySpan QuintEncodings => new byte[] - { + private static ReadOnlySpan QuintEncodings => + [ 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 0, 4, 0, 4, 4, 0, 4, 4, 4, 0, 1, 0, 1, 1, 0, 2, 1, 0, 3, 1, 0, 4, 1, 0, 1, 4, 0, 4, 4, 1, @@ -330,7 +331,7 @@ namespace Ryujinx.Graphics.Texture.Astc 0, 1, 4, 1, 1, 4, 0, 2, 3, 1, 2, 3, 2, 2, 3, 3, 2, 3, 4, 2, 3, 2, 4, 3, 0, 2, 4, 1, 2, 4, 0, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 4, 3, 3, - 3, 4, 3, 0, 3, 4, 1, 3, 4, - }; + 3, 4, 3, 0, 3, 4, 1, 3, 4 + ]; } } diff --git a/src/Ryujinx.Graphics.Texture/ETC2Decoder.cs b/src/Ryujinx.Graphics.Texture/ETC2Decoder.cs index 49e7154c8..cb3fccb47 100644 --- a/src/Ryujinx.Graphics.Texture/ETC2Decoder.cs +++ b/src/Ryujinx.Graphics.Texture/ETC2Decoder.cs @@ -14,41 +14,41 @@ namespace Ryujinx.Graphics.Texture private const int BlockHeight = 4; private static readonly int[][] _etc1Lut = - { - new int[] { 2, 8, -2, -8 }, - new int[] { 5, 17, -5, -17 }, - new int[] { 9, 29, -9, -29 }, - new int[] { 13, 42, -13, -42 }, - new int[] { 18, 60, -18, -60 }, - new int[] { 24, 80, -24, -80 }, - new int[] { 33, 106, -33, -106 }, - new int[] { 47, 183, -47, -183 }, - }; + [ + [2, 8, -2, -8], + [5, 17, -5, -17], + [9, 29, -9, -29], + [13, 42, -13, -42], + [18, 60, -18, -60], + [24, 80, -24, -80], + [33, 106, -33, -106], + [47, 183, -47, -183] + ]; private static readonly int[] _etc2Lut = - { - 3, 6, 11, 16, 23, 32, 41, 64, - }; + [ + 3, 6, 11, 16, 23, 32, 41, 64 + ]; private static readonly int[][] _etc2AlphaLut = - { - new int[] { -3, -6, -9, -15, 2, 5, 8, 14 }, - new int[] { -3, -7, -10, -13, 2, 6, 9, 12 }, - new int[] { -2, -5, -8, -13, 1, 4, 7, 12 }, - new int[] { -2, -4, -6, -13, 1, 3, 5, 12 }, - new int[] { -3, -6, -8, -12, 2, 5, 7, 11 }, - new int[] { -3, -7, -9, -11, 2, 6, 8, 10 }, - new int[] { -4, -7, -8, -11, 3, 6, 7, 10 }, - new int[] { -3, -5, -8, -11, 2, 4, 7, 10 }, - new int[] { -2, -6, -8, -10, 1, 5, 7, 9 }, - new int[] { -2, -5, -8, -10, 1, 4, 7, 9 }, - new int[] { -2, -4, -8, -10, 1, 3, 7, 9 }, - new int[] { -2, -5, -7, -10, 1, 4, 6, 9 }, - new int[] { -3, -4, -7, -10, 2, 3, 6, 9 }, - new int[] { -1, -2, -3, -10, 0, 1, 2, 9 }, - new int[] { -4, -6, -8, -9, 3, 5, 7, 8 }, - new int[] { -3, -5, -7, -9, 2, 4, 6, 8 }, - }; + [ + [-3, -6, -9, -15, 2, 5, 8, 14], + [-3, -7, -10, -13, 2, 6, 9, 12], + [-2, -5, -8, -13, 1, 4, 7, 12], + [-2, -4, -6, -13, 1, 3, 5, 12], + [-3, -6, -8, -12, 2, 5, 7, 11], + [-3, -7, -9, -11, 2, 6, 8, 10], + [-4, -7, -8, -11, 3, 6, 7, 10], + [-3, -5, -8, -11, 2, 4, 7, 10], + [-2, -6, -8, -10, 1, 5, 7, 9], + [-2, -5, -8, -10, 1, 4, 7, 9], + [-2, -4, -8, -10, 1, 3, 7, 9], + [-2, -5, -7, -10, 1, 4, 6, 9], + [-3, -4, -7, -10, 2, 3, 6, 9], + [-1, -2, -3, -10, 0, 1, 2, 9], + [-4, -6, -8, -9, 3, 5, 7, 8], + [-3, -5, -7, -9, 2, 4, 6, 8] + ]; public static MemoryOwner DecodeRgb(ReadOnlySpan data, int width, int height, int depth, int levels, int layers) { diff --git a/src/Ryujinx.Graphics.Texture/Encoders/BC7Encoder.cs b/src/Ryujinx.Graphics.Texture/Encoders/BC7Encoder.cs index 5fdc9e917..4154ef83d 100644 --- a/src/Ryujinx.Graphics.Texture/Encoders/BC7Encoder.cs +++ b/src/Ryujinx.Graphics.Texture/Encoders/BC7Encoder.cs @@ -57,17 +57,17 @@ namespace Ryujinx.Graphics.Texture.Encoders } } - private static readonly int[] _mostFrequentPartitions = new int[] - { - 0, 13, 2, 1, 15, 14, 10, 23, - }; + private static readonly int[] _mostFrequentPartitions = + [ + 0, 13, 2, 1, 15, 14, 10, 23 + ]; private static Block CompressBlock(ReadOnlySpan data, int x, int y, int width, int height, bool fastMode) { int w = Math.Min(4, width - x); int h = Math.Min(4, height - y); - var dataUint = MemoryMarshal.Cast(data); + ReadOnlySpan dataUint = MemoryMarshal.Cast(data); int baseOffset = y * width + x; @@ -153,7 +153,7 @@ namespace Ryujinx.Graphics.Texture.Encoders int selectedPartition = 0; - if (selectedMode == 1 || selectedMode == 7) + if (selectedMode is 1 or 7) { int partitionSelectionLowestError = int.MaxValue; @@ -180,7 +180,7 @@ namespace Ryujinx.Graphics.Texture.Encoders for (int m = 0; m < 8; m++) { - for (int r = 0; r < (m == 4 || m == 5 ? 4 : 1); r++) + for (int r = 0; r < (m is 4 or 5 ? 4 : 1); r++) { for (int im = 0; im < (m == 4 ? 2 : 1); im++) { diff --git a/src/Ryujinx.Graphics.Texture/LayoutConverter.cs b/src/Ryujinx.Graphics.Texture/LayoutConverter.cs index 5426af205..143c36259 100644 --- a/src/Ryujinx.Graphics.Texture/LayoutConverter.cs +++ b/src/Ryujinx.Graphics.Texture/LayoutConverter.cs @@ -79,6 +79,7 @@ namespace Ryujinx.Graphics.Texture outPtr += outStrideGap; } } + return true; } @@ -229,8 +230,10 @@ namespace Ryujinx.Graphics.Texture } } } + outOffs += stride * h * d * layers; } + return true; } @@ -245,6 +248,7 @@ namespace Ryujinx.Graphics.Texture _ => throw new NotSupportedException($"Unable to convert ${bytesPerPixel} bpp pixel format."), }; } + return outputOwner; } @@ -350,6 +354,7 @@ namespace Ryujinx.Graphics.Texture inPtr += inStrideGap; } } + return true; } @@ -493,8 +498,10 @@ namespace Ryujinx.Graphics.Texture } } } + inOffs += stride * h * d * layers; } + return true; } diff --git a/src/Ryujinx.Graphics.Texture/OffsetCalculator.cs b/src/Ryujinx.Graphics.Texture/OffsetCalculator.cs index e519341e6..10399ff16 100644 --- a/src/Ryujinx.Graphics.Texture/OffsetCalculator.cs +++ b/src/Ryujinx.Graphics.Texture/OffsetCalculator.cs @@ -115,7 +115,6 @@ namespace Ryujinx.Graphics.Texture _stride == other._stride && _bytesPerPixel == other._bytesPerPixel; - return !other._isLinear && _layoutConverter.LayoutMatches(other._layoutConverter); } } diff --git a/src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj b/src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj index 48d10f1d5..2b4445aeb 100644 --- a/src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj +++ b/src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj @@ -1,6 +1,5 @@ - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.Texture/SizeInfo.cs b/src/Ryujinx.Graphics.Texture/SizeInfo.cs index 3bec1203a..f2e40e195 100644 --- a/src/Ryujinx.Graphics.Texture/SizeInfo.cs +++ b/src/Ryujinx.Graphics.Texture/SizeInfo.cs @@ -19,10 +19,10 @@ namespace Ryujinx.Graphics.Texture public SizeInfo(int size) { - _mipOffsets = new int[] { 0 }; - AllOffsets = new int[] { 0 }; - SliceSizes = new int[] { size }; - LevelSizes = new int[] { size }; + _mipOffsets = [0]; + AllOffsets = [0]; + SliceSizes = [size]; + LevelSizes = [size]; _depth = 1; _levels = 1; LayerSize = size; diff --git a/src/Ryujinx.Graphics.Texture/Utils/BC67Tables.cs b/src/Ryujinx.Graphics.Texture/Utils/BC67Tables.cs index 522538559..71777997e 100644 --- a/src/Ryujinx.Graphics.Texture/Utils/BC67Tables.cs +++ b/src/Ryujinx.Graphics.Texture/Utils/BC67Tables.cs @@ -2,90 +2,66 @@ namespace Ryujinx.Graphics.Texture.Utils { static class BC67Tables { - public static readonly BC7ModeInfo[] BC7ModeInfos = new BC7ModeInfo[] - { - new BC7ModeInfo(3, 4, 6, 0, 0, 3, 0, 4, 0), - new BC7ModeInfo(2, 6, 2, 0, 0, 3, 0, 6, 0), - new BC7ModeInfo(3, 6, 0, 0, 0, 2, 0, 5, 0), - new BC7ModeInfo(2, 6, 4, 0, 0, 2, 0, 7, 0), - new BC7ModeInfo(1, 0, 0, 2, 1, 2, 3, 5, 6), - new BC7ModeInfo(1, 0, 0, 2, 0, 2, 2, 7, 8), - new BC7ModeInfo(1, 0, 2, 0, 0, 4, 0, 7, 7), - new BC7ModeInfo(2, 6, 4, 0, 0, 2, 0, 5, 5), - }; + public static readonly BC7ModeInfo[] BC7ModeInfos = + [ + new(3, 4, 6, 0, 0, 3, 0, 4, 0), + new(2, 6, 2, 0, 0, 3, 0, 6, 0), + new(3, 6, 0, 0, 0, 2, 0, 5, 0), + new(2, 6, 4, 0, 0, 2, 0, 7, 0), + new(1, 0, 0, 2, 1, 2, 3, 5, 6), + new(1, 0, 0, 2, 0, 2, 2, 7, 8), + new(1, 0, 2, 0, 0, 4, 0, 7, 7), + new(2, 6, 4, 0, 0, 2, 0, 5, 5) + ]; public static readonly byte[][] Weights = - { - new byte[] { 0, 21, 43, 64 }, - new byte[] { 0, 9, 18, 27, 37, 46, 55, 64 }, - new byte[] { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 }, - }; + [ + [0, 21, 43, 64], + [0, 9, 18, 27, 37, 46, 55, 64], + [0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64] + ]; public static readonly byte[][] InverseWeights = - { - new byte[] { 64, 43, 21, 0 }, - new byte[] { 64, 55, 46, 37, 27, 18, 9, 0 }, - new byte[] { 64, 60, 55, 51, 47, 43, 38, 34, 30, 26, 21, 17, 13, 9, 4, 0 }, - }; + [ + [64, 43, 21, 0], + [64, 55, 46, 37, 27, 18, 9, 0], + [64, 60, 55, 51, 47, 43, 38, 34, 30, 26, 21, 17, 13, 9, 4, 0] + ]; public static readonly byte[][][] FixUpIndices = new byte[3][][] { new byte[64][] { - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, - new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, + [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], + [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], + [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], + [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], + [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], + [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], + [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], + [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], }, new byte[64][] { - new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, - new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, - new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, - new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, - new byte[] { 0, 15, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 2, 0 }, - new byte[] { 0, 2, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 15, 0 }, - new byte[] { 0, 2, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 }, - new byte[] { 0, 8, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 }, - new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 6, 0 }, new byte[] { 0, 8, 0 }, - new byte[] { 0, 2, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, - new byte[] { 0, 2, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 }, - new byte[] { 0, 2, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 6, 0 }, - new byte[] { 0, 6, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 6, 0 }, new byte[] { 0, 8, 0 }, - new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 }, - new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, - new byte[] { 0, 15, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 15, 0 }, + [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], + [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], + [0, 15, 0], [0, 2, 0], [0, 8, 0], [0, 2, 0], [0, 2, 0], [0, 8, 0], [0, 8, 0], [0, 15, 0], + [0, 2, 0], [0, 8, 0], [0, 2, 0], [0, 2, 0], [0, 8, 0], [0, 8, 0], [0, 2, 0], [0, 2, 0], + [0, 15, 0], [0, 15, 0], [0, 6, 0], [0, 8, 0], [0, 2, 0], [0, 8, 0], [0, 15, 0], [0, 15, 0], + [0, 2, 0], [0, 8, 0], [0, 2, 0], [0, 2, 0], [0, 2, 0], [0, 15, 0], [0, 15, 0], [0, 6, 0], + [0, 6, 0], [0, 2, 0], [0, 6, 0], [0, 8, 0], [0, 15, 0], [0, 15, 0], [0, 2, 0], [0, 2, 0], + [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 15, 0], [0, 2, 0], [0, 2, 0], [0, 15, 0], }, new byte[64][] { - new byte[] { 0, 3, 15 }, new byte[] { 0, 3, 8 }, new byte[] { 0, 15, 8 }, new byte[] { 0, 15, 3 }, - new byte[] { 0, 8, 15 }, new byte[] { 0, 3, 15 }, new byte[] { 0, 15, 3 }, new byte[] { 0, 15, 8 }, - new byte[] { 0, 8, 15 }, new byte[] { 0, 8, 15 }, new byte[] { 0, 6, 15 }, new byte[] { 0, 6, 15 }, - new byte[] { 0, 6, 15 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 3, 15 }, new byte[] { 0, 3, 8 }, - new byte[] { 0, 3, 15 }, new byte[] { 0, 3, 8 }, new byte[] { 0, 8, 15 }, new byte[] { 0, 15, 3 }, - new byte[] { 0, 3, 15 }, new byte[] { 0, 3, 8 }, new byte[] { 0, 6, 15 }, new byte[] { 0, 10, 8 }, - new byte[] { 0, 5, 3 }, new byte[] { 0, 8, 15 }, new byte[] { 0, 8, 6 }, new byte[] { 0, 6, 10 }, - new byte[] { 0, 8, 15 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 15, 10 }, new byte[] { 0, 15, 8 }, - new byte[] { 0, 8, 15 }, new byte[] { 0, 15, 3 }, new byte[] { 0, 3, 15 }, new byte[] { 0, 5, 10 }, - new byte[] { 0, 6, 10 }, new byte[] { 0, 10, 8 }, new byte[] { 0, 8, 9 }, new byte[] { 0, 15, 10 }, - new byte[] { 0, 15, 6 }, new byte[] { 0, 3, 15 }, new byte[] { 0, 15, 8 }, new byte[] { 0, 5, 15 }, - new byte[] { 0, 15, 3 }, new byte[] { 0, 15, 6 }, new byte[] { 0, 15, 6 }, new byte[] { 0, 15, 8 }, - new byte[] { 0, 3, 15 }, new byte[] { 0, 15, 3 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 5, 15 }, - new byte[] { 0, 5, 15 }, new byte[] { 0, 8, 15 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 10, 15 }, - new byte[] { 0, 5, 15 }, new byte[] { 0, 10, 15 }, new byte[] { 0, 8, 15 }, new byte[] { 0, 13, 15 }, - new byte[] { 0, 15, 3 }, new byte[] { 0, 12, 15 }, new byte[] { 0, 3, 15 }, new byte[] { 0, 3, 8 }, + [0, 3, 15], [0, 3, 8], [0, 15, 8], [0, 15, 3], [0, 8, 15], [0, 3, 15], [0, 15, 3], [0, 15, 8], + [0, 8, 15], [0, 8, 15], [0, 6, 15], [0, 6, 15], [0, 6, 15], [0, 5, 15], [0, 3, 15], [0, 3, 8], + [0, 3, 15], [0, 3, 8], [0, 8, 15], [0, 15, 3], [0, 3, 15], [0, 3, 8], [0, 6, 15], [0, 10, 8], + [0, 5, 3], [0, 8, 15], [0, 8, 6], [0, 6, 10], [0, 8, 15], [0, 5, 15], [0, 15, 10], [0, 15, 8], + [0, 8, 15], [0, 15, 3], [0, 3, 15], [0, 5, 10], [0, 6, 10], [0, 10, 8], [0, 8, 9], [0, 15, 10], + [0, 15, 6], [0, 3, 15], [0, 15, 8], [0, 5, 15], [0, 15, 3], [0, 15, 6], [0, 15, 6], [0, 15, 8], + [0, 3, 15], [0, 15, 3], [0, 5, 15], [0, 5, 15], [0, 5, 15], [0, 8, 15], [0, 5, 15], [0, 10, 15], + [0, 5, 15], [0, 10, 15], [0, 8, 15], [0, 13, 15], [0, 15, 3], [0, 12, 15], [0, 3, 15], [0, 3, 8], }, }; @@ -93,204 +69,204 @@ namespace Ryujinx.Graphics.Texture.Utils { new byte[64][] { - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 0 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 1 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 2 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 4 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 5 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 6 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 7 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 8 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 9 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 10 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 11 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 12 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 13 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 14 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 15 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 16 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 17 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 18 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 19 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 20 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 21 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 22 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 23 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 24 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 25 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 26 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 27 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 28 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 29 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 30 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 31 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 32 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 33 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 34 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 35 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 36 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 37 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 38 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 39 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 40 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 41 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 42 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 43 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 44 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 45 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 46 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 47 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 48 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 49 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 50 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 51 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 52 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 53 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 54 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 55 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 56 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 57 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 58 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 59 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 60 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 61 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 62 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 63 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 0 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 1 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 2 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 3 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 4 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 5 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 6 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 7 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 8 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 9 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 10 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 11 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 12 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 13 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 14 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 15 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 16 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 17 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 18 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 19 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 20 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 21 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 22 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 23 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 24 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 25 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 26 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 27 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 28 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 29 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 30 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 31 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 32 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 33 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 34 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 35 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 36 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 37 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 38 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 39 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 40 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 41 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 42 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 43 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 44 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 45 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 46 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 47 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 48 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 49 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 50 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 51 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 52 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 53 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 54 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 55 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 56 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 57 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 58 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 59 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 60 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 61 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 62 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], // 63 }, new byte[64][] { - new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, // 0 - new byte[16] { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }, // 1 - new byte[16] { 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 }, // 2 - new byte[16] { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, // 3 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1 }, // 4 - new byte[16] { 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, // 5 - new byte[16] { 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, // 6 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, // 7 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1 }, // 8 - new byte[16] { 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // 9 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, // 10 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1 }, // 11 - new byte[16] { 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // 12 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, // 13 - new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // 14 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 }, // 15 - new byte[16] { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1 }, // 16 - new byte[16] { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, // 17 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0 }, // 18 - new byte[16] { 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, // 19 - new byte[16] { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, // 20 - new byte[16] { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0 }, // 21 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }, // 22 - new byte[16] { 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1 }, // 23 - new byte[16] { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, // 24 - new byte[16] { 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }, // 25 - new byte[16] { 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0 }, // 26 - new byte[16] { 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0 }, // 27 - new byte[16] { 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0 }, // 28 - new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, // 29 - new byte[16] { 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0 }, // 30 - new byte[16] { 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, // 31 - new byte[16] { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }, // 32 - new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 }, // 33 - new byte[16] { 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0 }, // 34 - new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0 }, // 35 - new byte[16] { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 }, // 36 - new byte[16] { 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 }, // 37 - new byte[16] { 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1 }, // 38 - new byte[16] { 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 }, // 39 - new byte[16] { 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0 }, // 40 - new byte[16] { 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 }, // 41 - new byte[16] { 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0 }, // 42 - new byte[16] { 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0 }, // 43 - new byte[16] { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }, // 44 - new byte[16] { 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1 }, // 45 - new byte[16] { 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 }, // 46 - new byte[16] { 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // 47 - new byte[16] { 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // 48 - new byte[16] { 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0 }, // 49 - new byte[16] { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0 }, // 50 - new byte[16] { 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0 }, // 51 - new byte[16] { 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1 }, // 52 - new byte[16] { 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1 }, // 53 - new byte[16] { 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, // 54 - new byte[16] { 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0 }, // 55 - new byte[16] { 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1 }, // 56 - new byte[16] { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1 }, // 57 - new byte[16] { 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 }, // 58 - new byte[16] { 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1 }, // 59 - new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, // 60 - new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, // 61 - new byte[16] { 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 }, // 62 - new byte[16] { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1 }, // 63 + [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], // 0 + [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1], // 1 + [0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1], // 2 + [0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1], // 3 + [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1], // 4 + [0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1], // 5 + [0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1], // 6 + [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1], // 7 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1], // 8 + [0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], // 9 + [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1], // 10 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1], // 11 + [0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], // 12 + [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], // 13 + [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], // 14 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], // 15 + [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1], // 16 + [0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], // 17 + [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0], // 18 + [0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0], // 19 + [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], // 20 + [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0], // 21 + [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0], // 22 + [0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1], // 23 + [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0], // 24 + [0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0], // 25 + [0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0], // 26 + [0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0], // 27 + [0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0], // 28 + [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0], // 29 + [0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0], // 30 + [0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0], // 31 + [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], // 32 + [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1], // 33 + [0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0], // 34 + [0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0], // 35 + [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0], // 36 + [0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0], // 37 + [0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1], // 38 + [0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1], // 39 + [0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0], // 40 + [0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0], // 41 + [0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0], // 42 + [0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0], // 43 + [0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0], // 44 + [0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1], // 45 + [0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1], // 46 + [0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0], // 47 + [0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0], // 48 + [0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0], // 49 + [0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0], // 50 + [0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], // 51 + [0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1], // 52 + [0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1], // 53 + [0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0], // 54 + [0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0], // 55 + [0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1], // 56 + [0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1], // 57 + [0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1], // 58 + [0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1], // 59 + [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], // 60 + [0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0], // 61 + [0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0], // 62 + [0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1], // 63 }, new byte[64][] { - new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 1, 2, 2, 2, 2 }, // 0 - new byte[16] { 0, 0, 0, 1, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1 }, // 1 - new byte[16] { 0, 0, 0, 0, 2, 0, 0, 1, 2, 2, 1, 1, 2, 2, 1, 1 }, // 2 - new byte[16] { 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 1, 1, 0, 1, 1, 1 }, // 3 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2 }, // 4 - new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 2, 2 }, // 5 - new byte[16] { 0, 0, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1 }, // 6 - new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1 }, // 7 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2 }, // 8 - new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2 }, // 9 - new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2 }, // 10 - new byte[16] { 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2 }, // 11 - new byte[16] { 0, 1, 1, 2, 0, 1, 1, 2, 0, 1, 1, 2, 0, 1, 1, 2 }, // 12 - new byte[16] { 0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2 }, // 13 - new byte[16] { 0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2 }, // 14 - new byte[16] { 0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 0, 0, 2, 2, 2, 0 }, // 15 - new byte[16] { 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 2, 2 }, // 16 - new byte[16] { 0, 1, 1, 1, 0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 0, 0 }, // 17 - new byte[16] { 0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2 }, // 18 - new byte[16] { 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1 }, // 19 - new byte[16] { 0, 1, 1, 1, 0, 1, 1, 1, 0, 2, 2, 2, 0, 2, 2, 2 }, // 20 - new byte[16] { 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 1, 2, 2, 2, 1 }, // 21 - new byte[16] { 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2 }, // 22 - new byte[16] { 0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 1, 0, 2, 2, 1, 0 }, // 23 - new byte[16] { 0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0 }, // 24 - new byte[16] { 0, 0, 1, 2, 0, 0, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2 }, // 25 - new byte[16] { 0, 1, 1, 0, 1, 2, 2, 1, 1, 2, 2, 1, 0, 1, 1, 0 }, // 26 - new byte[16] { 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 2, 1, 1, 2, 2, 1 }, // 27 - new byte[16] { 0, 0, 2, 2, 1, 1, 0, 2, 1, 1, 0, 2, 0, 0, 2, 2 }, // 28 - new byte[16] { 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 0, 2, 2, 2, 2, 2 }, // 29 - new byte[16] { 0, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 1 }, // 30 - new byte[16] { 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 1, 1, 2, 2, 2, 1 }, // 31 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 2, 2, 2 }, // 32 - new byte[16] { 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 1, 2, 0, 0, 1, 1 }, // 33 - new byte[16] { 0, 0, 1, 1, 0, 0, 1, 2, 0, 0, 2, 2, 0, 2, 2, 2 }, // 34 - new byte[16] { 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0 }, // 35 - new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0 }, // 36 - new byte[16] { 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 }, // 37 - new byte[16] { 0, 1, 2, 0, 2, 0, 1, 2, 1, 2, 0, 1, 0, 1, 2, 0 }, // 38 - new byte[16] { 0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 0, 0, 1, 1 }, // 39 - new byte[16] { 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1 }, // 40 - new byte[16] { 0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2 }, // 41 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1 }, // 42 - new byte[16] { 0, 0, 2, 2, 1, 1, 2, 2, 0, 0, 2, 2, 1, 1, 2, 2 }, // 43 - new byte[16] { 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 1, 1 }, // 44 - new byte[16] { 0, 2, 2, 0, 1, 2, 2, 1, 0, 2, 2, 0, 1, 2, 2, 1 }, // 45 - new byte[16] { 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 0, 1 }, // 46 - new byte[16] { 0, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1 }, // 47 - new byte[16] { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2 }, // 48 - new byte[16] { 0, 2, 2, 2, 0, 1, 1, 1, 0, 2, 2, 2, 0, 1, 1, 1 }, // 49 - new byte[16] { 0, 0, 0, 2, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 2 }, // 50 - new byte[16] { 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2 }, // 51 - new byte[16] { 0, 2, 2, 2, 0, 1, 1, 1, 0, 1, 1, 1, 0, 2, 2, 2 }, // 52 - new byte[16] { 0, 0, 0, 2, 1, 1, 1, 2, 1, 1, 1, 2, 0, 0, 0, 2 }, // 53 - new byte[16] { 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2 }, // 54 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2 }, // 55 - new byte[16] { 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2 }, // 56 - new byte[16] { 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2 }, // 57 - new byte[16] { 0, 0, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 0, 0, 2, 2 }, // 58 - new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2 }, // 59 - new byte[16] { 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1 }, // 60 - new byte[16] { 0, 2, 2, 2, 1, 2, 2, 2, 0, 2, 2, 2, 1, 2, 2, 2 }, // 61 - new byte[16] { 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, // 62 - new byte[16] { 0, 1, 1, 1, 2, 0, 1, 1, 2, 2, 0, 1, 2, 2, 2, 0 }, // 63 + [0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 1, 2, 2, 2, 2], // 0 + [0, 0, 0, 1, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1], // 1 + [0, 0, 0, 0, 2, 0, 0, 1, 2, 2, 1, 1, 2, 2, 1, 1], // 2 + [0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 1, 1, 0, 1, 1, 1], // 3 + [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2], // 4 + [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 2, 2], // 5 + [0, 0, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1], // 6 + [0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1], // 7 + [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], // 8 + [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2], // 9 + [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2], // 10 + [0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2], // 11 + [0, 1, 1, 2, 0, 1, 1, 2, 0, 1, 1, 2, 0, 1, 1, 2], // 12 + [0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2], // 13 + [0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2], // 14 + [0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 0, 0, 2, 2, 2, 0], // 15 + [0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 2, 2], // 16 + [0, 1, 1, 1, 0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 0, 0], // 17 + [0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2], // 18 + [0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1], // 19 + [0, 1, 1, 1, 0, 1, 1, 1, 0, 2, 2, 2, 0, 2, 2, 2], // 20 + [0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 1, 2, 2, 2, 1], // 21 + [0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2], // 22 + [0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 1, 0, 2, 2, 1, 0], // 23 + [0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0], // 24 + [0, 0, 1, 2, 0, 0, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2], // 25 + [0, 1, 1, 0, 1, 2, 2, 1, 1, 2, 2, 1, 0, 1, 1, 0], // 26 + [0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 2, 1, 1, 2, 2, 1], // 27 + [0, 0, 2, 2, 1, 1, 0, 2, 1, 1, 0, 2, 0, 0, 2, 2], // 28 + [0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 0, 2, 2, 2, 2, 2], // 29 + [0, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 1], // 30 + [0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 1, 1, 2, 2, 2, 1], // 31 + [0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 2, 2, 2], // 32 + [0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 1, 2, 0, 0, 1, 1], // 33 + [0, 0, 1, 1, 0, 0, 1, 2, 0, 0, 2, 2, 0, 2, 2, 2], // 34 + [0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0], // 35 + [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0], // 36 + [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0], // 37 + [0, 1, 2, 0, 2, 0, 1, 2, 1, 2, 0, 1, 0, 1, 2, 0], // 38 + [0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 0, 0, 1, 1], // 39 + [0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1], // 40 + [0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2], // 41 + [0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1], // 42 + [0, 0, 2, 2, 1, 1, 2, 2, 0, 0, 2, 2, 1, 1, 2, 2], // 43 + [0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 1, 1], // 44 + [0, 2, 2, 0, 1, 2, 2, 1, 0, 2, 2, 0, 1, 2, 2, 1], // 45 + [0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 0, 1], // 46 + [0, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1], // 47 + [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2], // 48 + [0, 2, 2, 2, 0, 1, 1, 1, 0, 2, 2, 2, 0, 1, 1, 1], // 49 + [0, 0, 0, 2, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 2], // 50 + [0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2], // 51 + [0, 2, 2, 2, 0, 1, 1, 1, 0, 1, 1, 1, 0, 2, 2, 2], // 52 + [0, 0, 0, 2, 1, 1, 1, 2, 1, 1, 1, 2, 0, 0, 0, 2], // 53 + [0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2], // 54 + [0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2], // 55 + [0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2], // 56 + [0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2], // 57 + [0, 0, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 0, 0, 2, 2], // 58 + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2], // 59 + [0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1], // 60 + [0, 2, 2, 2, 1, 2, 2, 2, 0, 2, 2, 2, 1, 2, 2, 2], // 61 + [0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], // 62 + [0, 1, 1, 1, 2, 0, 1, 1, 2, 2, 0, 1, 2, 2, 2, 0], // 63 }, }; } diff --git a/src/Ryujinx.Graphics.Texture/Utils/BC67Utils.cs b/src/Ryujinx.Graphics.Texture/Utils/BC67Utils.cs index f548684a4..ebf5e6a70 100644 --- a/src/Ryujinx.Graphics.Texture/Utils/BC67Utils.cs +++ b/src/Ryujinx.Graphics.Texture/Utils/BC67Utils.cs @@ -1172,7 +1172,7 @@ namespace Ryujinx.Graphics.Texture.Utils [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RgbaColor32 Interpolate(RgbaColor32 color1, RgbaColor32 color2, int weightIndex, int indexBitCount) { - Debug.Assert(indexBitCount >= 2 && indexBitCount <= 4); + Debug.Assert(indexBitCount is >= 2 and <= 4); int weight = (((weightIndex << 7) / ((1 << indexBitCount) - 1)) + 1) >> 1; @@ -1191,8 +1191,8 @@ namespace Ryujinx.Graphics.Texture.Utils int colorIndexBitCount, int alphaIndexBitCount) { - Debug.Assert(colorIndexBitCount >= 2 && colorIndexBitCount <= 4); - Debug.Assert(alphaIndexBitCount >= 2 && alphaIndexBitCount <= 4); + Debug.Assert(colorIndexBitCount is >= 2 and <= 4); + Debug.Assert(alphaIndexBitCount is >= 2 and <= 4); int colorWeight = BC67Tables.Weights[colorIndexBitCount - 2][colorWeightIndex]; int alphaWeight = BC67Tables.Weights[alphaIndexBitCount - 2][alphaWeightIndex]; diff --git a/src/Ryujinx.Graphics.Vic/Image/SurfaceReader.cs b/src/Ryujinx.Graphics.Vic/Image/SurfaceReader.cs index 83f00f345..2c6ff0511 100644 --- a/src/Ryujinx.Graphics.Vic/Image/SurfaceReader.cs +++ b/src/Ryujinx.Graphics.Vic/Image/SurfaceReader.cs @@ -397,6 +397,7 @@ namespace Ryujinx.Graphics.Vic.Image { Scaler.DeinterlaceBob(buffer.Data, w, stride, isTopField); } + break; default: Logger.Error?.Print(LogClass.Vic, $"Unsupported deinterlace mode \"{config.DeinterlaceMode}\"."); diff --git a/src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj b/src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj index 820e807e6..5505a3aa1 100644 --- a/src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj +++ b/src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj @@ -1,7 +1,6 @@ - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.Vic/Types/FrameFormat.cs b/src/Ryujinx.Graphics.Vic/Types/FrameFormat.cs index b8f821631..d76fcd9e0 100644 --- a/src/Ryujinx.Graphics.Vic/Types/FrameFormat.cs +++ b/src/Ryujinx.Graphics.Vic/Types/FrameFormat.cs @@ -54,8 +54,8 @@ namespace Ryujinx.Graphics.Vic.Types public static bool IsInterlacedBottomFirst(this FrameFormat frameFormat) { - return frameFormat == FrameFormat.InterlacedBottomFieldFirst || - frameFormat == FrameFormat.SubPicInterlacedBottomFieldFirst; + return frameFormat is FrameFormat.InterlacedBottomFieldFirst or + FrameFormat.SubPicInterlacedBottomFieldFirst; } public static bool IsTopField(this FrameFormat frameFormat, bool isLuma) diff --git a/src/Ryujinx.Graphics.Vic/VicDevice.cs b/src/Ryujinx.Graphics.Vic/VicDevice.cs index 2b25a74c8..7cc5dda54 100644 --- a/src/Ryujinx.Graphics.Vic/VicDevice.cs +++ b/src/Ryujinx.Graphics.Vic/VicDevice.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Memory; using Ryujinx.Graphics.Device; using Ryujinx.Graphics.Vic.Image; using Ryujinx.Graphics.Vic.Types; @@ -43,7 +44,7 @@ namespace Ryujinx.Graphics.Vic continue; } - ref var offsets = ref _state.State.SetSurfacexSlotx[i]; + ref Array8 offsets = ref _state.State.SetSurfacexSlotx[i]; using Surface src = SurfaceReader.Read(_rm, ref slot.SlotConfig, ref slot.SlotSurfaceConfig, ref offsets); diff --git a/src/Ryujinx.Graphics.Video/Plane.cs b/src/Ryujinx.Graphics.Video/Plane.cs index 4e4e65b32..338de1644 100644 --- a/src/Ryujinx.Graphics.Video/Plane.cs +++ b/src/Ryujinx.Graphics.Video/Plane.cs @@ -1,5 +1,3 @@ -using System; - namespace Ryujinx.Graphics.Video { public readonly record struct Plane(nint Pointer, int Length); diff --git a/src/Ryujinx.Graphics.Video/Ryujinx.Graphics.Video.csproj b/src/Ryujinx.Graphics.Video/Ryujinx.Graphics.Video.csproj index d85effe32..d64990f82 100644 --- a/src/Ryujinx.Graphics.Video/Ryujinx.Graphics.Video.csproj +++ b/src/Ryujinx.Graphics.Video/Ryujinx.Graphics.Video.csproj @@ -1,7 +1,6 @@ - net8.0 $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.Video/Vp9PictureInfo.cs b/src/Ryujinx.Graphics.Video/Vp9PictureInfo.cs index bcdaf0dfc..b9604181a 100644 --- a/src/Ryujinx.Graphics.Video/Vp9PictureInfo.cs +++ b/src/Ryujinx.Graphics.Video/Vp9PictureInfo.cs @@ -10,6 +10,8 @@ namespace Ryujinx.Graphics.Video public bool IsKeyFrame; public bool IntraOnly; public Array4 RefFrameSignBias; + public int LoopFilterLevel; + public int LoopFilterSharpnessLevel; public int BaseQIndex; public int YDcDeltaQ; public int UvDcDeltaQ; diff --git a/src/Ryujinx.Graphics.Vulkan/Auto.cs b/src/Ryujinx.Graphics.Vulkan/Auto.cs index 606c088e9..7ce309a5d 100644 --- a/src/Ryujinx.Graphics.Vulkan/Auto.cs +++ b/src/Ryujinx.Graphics.Vulkan/Auto.cs @@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Vulkan public T GetMirrorable(CommandBufferScoped cbs, ref int offset, int size, out bool mirrored) { - var mirror = _mirrorable.GetMirrorable(cbs, ref offset, size, out mirrored); + Auto mirror = _mirrorable.GetMirrorable(cbs, ref offset, size, out mirrored); mirror._waitable?.AddBufferUse(cbs.CommandBufferIndex, offset, size, false); return mirror.Get(cbs); } diff --git a/src/Ryujinx.Graphics.Vulkan/BackgroundResources.cs b/src/Ryujinx.Graphics.Vulkan/BackgroundResources.cs index 0290987fd..5260c5d8b 100644 --- a/src/Ryujinx.Graphics.Vulkan/BackgroundResources.cs +++ b/src/Ryujinx.Graphics.Vulkan/BackgroundResources.cs @@ -25,7 +25,7 @@ namespace Ryujinx.Graphics.Vulkan { bool useBackground = _gd.BackgroundQueue.Handle != 0 && _gd.Vendor != Vendor.Amd; Queue queue = useBackground ? _gd.BackgroundQueue : _gd.Queue; - object queueLock = useBackground ? _gd.BackgroundQueueLock : _gd.QueueLock; + Lock queueLock = useBackground ? _gd.BackgroundQueueLock : _gd.QueueLock; lock (queueLock) { @@ -110,7 +110,7 @@ namespace Ryujinx.Graphics.Vulkan { lock (_resources) { - foreach (var resource in _resources.Values) + foreach (BackgroundResource resource in _resources.Values) { resource.Dispose(); } diff --git a/src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs b/src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs index bcfb3dbfe..251f74319 100644 --- a/src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs +++ b/src/Ryujinx.Graphics.Vulkan/BarrierBatch.cs @@ -19,9 +19,9 @@ namespace Ryujinx.Graphics.Vulkan private readonly NativeArray _bufferBarrierBatch = new(MaxBarriersPerCall); private readonly NativeArray _imageBarrierBatch = new(MaxBarriersPerCall); - private readonly List> _memoryBarriers = new(); - private readonly List> _bufferBarriers = new(); - private readonly List> _imageBarriers = new(); + private readonly List> _memoryBarriers = []; + private readonly List> _bufferBarriers = []; + private readonly List> _imageBarriers = []; private int _queuedBarrierCount; private enum IncoherentBarrierType @@ -145,7 +145,7 @@ namespace Ryujinx.Graphics.Vulkan stages |= PipelineStageFlags.DrawIndirectBit; } - MemoryBarrier barrier = new MemoryBarrier() + MemoryBarrier barrier = new() { SType = StructureType.MemoryBarrier, SrcAccessMask = access, @@ -175,7 +175,7 @@ namespace Ryujinx.Graphics.Vulkan { // Feedback loop barrier. - MemoryBarrier barrier = new MemoryBarrier() + MemoryBarrier barrier = new() { SType = StructureType.MemoryBarrier, SrcAccessMask = AccessFlags.ShaderWriteBit, @@ -350,7 +350,7 @@ namespace Ryujinx.Graphics.Vulkan { // Generic pipeline memory barriers will work for desktop GPUs. // They do require a few more access flags on the subpass dependency, though. - foreach (var barrier in _imageBarriers) + foreach (BarrierWithStageFlags barrier in _imageBarriers) { _memoryBarriers.Add(new BarrierWithStageFlags( barrier.Flags, @@ -370,7 +370,7 @@ namespace Ryujinx.Graphics.Vulkan { PipelineStageFlags allFlags = PipelineStageFlags.None; - foreach (var barrier in _memoryBarriers) + foreach (BarrierWithStageFlags barrier in _memoryBarriers) { allFlags |= barrier.Flags.Dest; } diff --git a/src/Ryujinx.Graphics.Vulkan/BitMapStruct.cs b/src/Ryujinx.Graphics.Vulkan/BitMapStruct.cs index 43107427c..3ec2c7f59 100644 --- a/src/Ryujinx.Graphics.Vulkan/BitMapStruct.cs +++ b/src/Ryujinx.Graphics.Vulkan/BitMapStruct.cs @@ -220,11 +220,11 @@ namespace Ryujinx.Graphics.Vulkan public BitMapStruct Union(BitMapStruct other) { - var result = new BitMapStruct(); + BitMapStruct result = new(); - ref var masks = ref _masks; - ref var otherMasks = ref other._masks; - ref var newMasks = ref result._masks; + ref T masks = ref _masks; + ref T otherMasks = ref other._masks; + ref T newMasks = ref result._masks; for (int i = 0; i < masks.Length; i++) { diff --git a/src/Ryujinx.Graphics.Vulkan/BufferHolder.cs b/src/Ryujinx.Graphics.Vulkan/BufferHolder.cs index 6dce6abb5..1e54e8ece 100644 --- a/src/Ryujinx.Graphics.Vulkan/BufferHolder.cs +++ b/src/Ryujinx.Graphics.Vulkan/BufferHolder.cs @@ -113,7 +113,7 @@ namespace Ryujinx.Graphics.Vulkan public unsafe Auto CreateView(VkFormat format, int offset, int size, Action invalidateView) { - var bufferViewCreateInfo = new BufferViewCreateInfo + BufferViewCreateInfo bufferViewCreateInfo = new() { SType = StructureType.BufferViewCreateInfo, Buffer = new VkBuffer(_bufferHandle), @@ -122,7 +122,7 @@ namespace Ryujinx.Graphics.Vulkan Range = (uint)size, }; - _gd.Api.CreateBufferView(_device, in bufferViewCreateInfo, null, out var bufferView).ThrowOnError(); + _gd.Api.CreateBufferView(_device, in bufferViewCreateInfo, null, out BufferView bufferView).ThrowOnError(); return new Auto(new DisposableBufferView(_gd.Api, _device, bufferView), this, _waitable, _buffer); } @@ -183,7 +183,7 @@ namespace Ryujinx.Graphics.Vulkan return false; } - var key = ToMirrorKey(offset, size); + ulong key = ToMirrorKey(offset, size); if (_mirrors.TryGetValue(key, out StagingBufferReserved reserved)) { @@ -205,14 +205,14 @@ namespace Ryujinx.Graphics.Vulkan // Build data for the new mirror. - var baseData = new Span((void*)(_map + offset), size); - var modData = _pendingData.AsSpan(offset, size); + Span baseData = new((void*)(_map + offset), size); + Span modData = _pendingData.AsSpan(offset, size); StagingBufferReserved? newMirror = _gd.BufferManager.StagingBuffer.TryReserveData(cbs, size); if (newMirror != null) { - var mirror = newMirror.Value; + StagingBufferReserved mirror = newMirror.Value; _pendingDataRanges.FillData(baseData, modData, offset, new Span((void*)(mirror.Buffer._map + mirror.Offset), size)); if (_mirrors.Count == 0) @@ -289,7 +289,7 @@ namespace Ryujinx.Graphics.Vulkan if (_pendingData != null) { _mirrors.Clear(); - }; + } } public void ClearMirrors(CommandBufferScoped cbs, int offset, int size) @@ -309,7 +309,7 @@ namespace Ryujinx.Graphics.Vulkan { _gd.PipelineInternal.Rebind(_buffer, offset, size); } - }; + } } public void UseMirrors() @@ -319,13 +319,13 @@ namespace Ryujinx.Graphics.Vulkan private void UploadPendingData(CommandBufferScoped cbs, int offset, int size) { - var ranges = _pendingDataRanges.FindOverlaps(offset, size); + List ranges = _pendingDataRanges.FindOverlaps(offset, size); if (ranges != null) { _pendingDataRanges.Remove(offset, size); - foreach (var range in ranges) + foreach (BufferMirrorRangeList.Range range in ranges) { int rangeOffset = Math.Max(offset, range.Offset); int rangeSize = Math.Min(offset + size, range.End) - rangeOffset; @@ -366,7 +366,7 @@ namespace Ryujinx.Graphics.Vulkan public BufferHandle GetHandle() { - var handle = _bufferHandle; + ulong handle = _bufferHandle; return Unsafe.As(ref handle); } @@ -403,7 +403,7 @@ namespace Ryujinx.Graphics.Vulkan if (_flushFence != null) { - var fence = _flushFence; + FenceHolder fence = _flushFence; Interlocked.Increment(ref _flushWaiting); // Don't wait in the lock. @@ -481,12 +481,12 @@ namespace Ryujinx.Graphics.Vulkan public bool RemoveOverlappingMirrors(int offset, int size) { List toRemove = null; - foreach (var key in _mirrors.Keys) + foreach (ulong key in _mirrors.Keys) { (int keyOffset, int keySize) = FromMirrorKey(key); if (!(offset + size <= keyOffset || offset >= keyOffset + keySize)) { - toRemove ??= new List(); + toRemove ??= []; toRemove.Add(key); } @@ -494,7 +494,7 @@ namespace Ryujinx.Graphics.Vulkan if (toRemove != null) { - foreach (var key in toRemove) + foreach (ulong key in toRemove) { _mirrors.Remove(key); } @@ -606,8 +606,8 @@ namespace Ryujinx.Graphics.Vulkan BufferHolder srcHolder = _gd.BufferManager.Create(_gd, dataSize, baseType: BufferAllocationType.HostMapped); srcHolder.SetDataUnchecked(0, data); - var srcBuffer = srcHolder.GetBuffer(); - var dstBuffer = this.GetBuffer(cbs.Value.CommandBuffer, true); + Auto srcBuffer = srcHolder.GetBuffer(); + Auto dstBuffer = this.GetBuffer(cbs.Value.CommandBuffer, true); Copy(_gd, cbs.Value, srcBuffer, dstBuffer, 0, offset, dataSize); @@ -662,7 +662,7 @@ namespace Ryujinx.Graphics.Vulkan endRenderPass?.Invoke(); - var dstBuffer = GetBuffer(cbs.CommandBuffer, dstOffset, data.Length, true).Get(cbs, dstOffset, data.Length, true).Value; + VkBuffer dstBuffer = GetBuffer(cbs.CommandBuffer, dstOffset, data.Length, true).Get(cbs, dstOffset, data.Length, true).Value; InsertBufferBarrier( _gd, @@ -709,8 +709,8 @@ namespace Ryujinx.Graphics.Vulkan int size, bool registerSrcUsage = true) { - var srcBuffer = registerSrcUsage ? src.Get(cbs, srcOffset, size).Value : src.GetUnsafe().Value; - var dstBuffer = dst.Get(cbs, dstOffset, size, true).Value; + VkBuffer srcBuffer = registerSrcUsage ? src.Get(cbs, srcOffset, size).Value : src.GetUnsafe().Value; + VkBuffer dstBuffer = dst.Get(cbs, dstOffset, size, true).Value; InsertBufferBarrier( gd, @@ -723,7 +723,7 @@ namespace Ryujinx.Graphics.Vulkan dstOffset, size); - var region = new BufferCopy((ulong)srcOffset, (ulong)dstOffset, (ulong)size); + BufferCopy region = new((ulong)srcOffset, (ulong)dstOffset, (ulong)size); gd.Api.CmdCopyBuffer(cbs.CommandBuffer, srcBuffer, dstBuffer, 1, ®ion); @@ -804,9 +804,9 @@ namespace Ryujinx.Graphics.Vulkan return null; } - var key = new I8ToI16CacheKey(_gd); + I8ToI16CacheKey key = new(_gd); - if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder)) + if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out BufferHolder holder)) { holder = _gd.BufferManager.Create(_gd, (size * 2 + 3) & ~3, baseType: BufferAllocationType.DeviceLocal); @@ -828,9 +828,9 @@ namespace Ryujinx.Graphics.Vulkan return null; } - var key = new AlignedVertexBufferCacheKey(_gd, stride, alignment); + AlignedVertexBufferCacheKey key = new(_gd, stride, alignment); - if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder)) + if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out BufferHolder holder)) { int alignedStride = (stride + (alignment - 1)) & -alignment; @@ -854,9 +854,9 @@ namespace Ryujinx.Graphics.Vulkan return null; } - var key = new TopologyConversionCacheKey(_gd, pattern, indexSize); + TopologyConversionCacheKey key = new(_gd, pattern, indexSize); - if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder)) + if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out BufferHolder holder)) { // The destination index size is always I32. diff --git a/src/Ryujinx.Graphics.Vulkan/BufferManager.cs b/src/Ryujinx.Graphics.Vulkan/BufferManager.cs index 7523913ec..5b420e620 100644 --- a/src/Ryujinx.Graphics.Vulkan/BufferManager.cs +++ b/src/Ryujinx.Graphics.Vulkan/BufferManager.cs @@ -96,20 +96,20 @@ namespace Ryujinx.Graphics.Vulkan public unsafe BufferHandle CreateHostImported(VulkanRenderer gd, nint pointer, int size) { - var usage = HostImportedBufferUsageFlags; + BufferUsageFlags usage = HostImportedBufferUsageFlags; if (gd.Capabilities.SupportsIndirectParameters) { usage |= BufferUsageFlags.IndirectBufferBit; } - var externalMemoryBuffer = new ExternalMemoryBufferCreateInfo + ExternalMemoryBufferCreateInfo externalMemoryBuffer = new() { SType = StructureType.ExternalMemoryBufferCreateInfo, HandleTypes = ExternalMemoryHandleTypeFlags.HostAllocationBitExt, }; - var bufferCreateInfo = new BufferCreateInfo + BufferCreateInfo bufferCreateInfo = new() { SType = StructureType.BufferCreateInfo, Size = (ulong)size, @@ -118,13 +118,13 @@ namespace Ryujinx.Graphics.Vulkan PNext = &externalMemoryBuffer, }; - gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out var buffer).ThrowOnError(); + gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out VkBuffer buffer).ThrowOnError(); (Auto allocation, ulong offset) = gd.HostMemoryAllocator.GetExistingAllocation(pointer, (ulong)size); gd.Api.BindBufferMemory(_device, buffer, allocation.GetUnsafe().Memory, allocation.GetUnsafe().Offset + offset); - var holder = new BufferHolder(gd, _device, buffer, allocation, size, BufferAllocationType.HostMapped, BufferAllocationType.HostMapped, (int)offset); + BufferHolder holder = new(gd, _device, buffer, allocation, size, BufferAllocationType.HostMapped, BufferAllocationType.HostMapped, (int)offset); BufferCount++; @@ -135,7 +135,7 @@ namespace Ryujinx.Graphics.Vulkan public unsafe BufferHandle CreateSparse(VulkanRenderer gd, ReadOnlySpan storageBuffers) { - var usage = DefaultBufferUsageFlags; + BufferUsageFlags usage = DefaultBufferUsageFlags; if (gd.Capabilities.SupportsIndirectParameters) { @@ -149,7 +149,7 @@ namespace Ryujinx.Graphics.Vulkan size += (ulong)range.Size; } - var bufferCreateInfo = new BufferCreateInfo() + BufferCreateInfo bufferCreateInfo = new() { SType = StructureType.BufferCreateInfo, Size = size, @@ -158,10 +158,10 @@ namespace Ryujinx.Graphics.Vulkan Flags = BufferCreateFlags.SparseBindingBit | BufferCreateFlags.SparseAliasedBit }; - gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out var buffer).ThrowOnError(); + gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out VkBuffer buffer).ThrowOnError(); - var memoryBinds = new SparseMemoryBind[storageBuffers.Length]; - var storageAllocations = new Auto[storageBuffers.Length]; + SparseMemoryBind[] memoryBinds = new SparseMemoryBind[storageBuffers.Length]; + Auto[] storageAllocations = new Auto[storageBuffers.Length]; int storageAllocationsCount = 0; ulong dstOffset = 0; @@ -170,9 +170,9 @@ namespace Ryujinx.Graphics.Vulkan { BufferRange range = storageBuffers[index]; - if (TryGetBuffer(range.Handle, out var existingHolder)) + if (TryGetBuffer(range.Handle, out BufferHolder existingHolder)) { - (var memory, var offset) = existingHolder.GetDeviceMemoryAndOffset(); + (DeviceMemory memory, ulong offset) = existingHolder.GetDeviceMemoryAndOffset(); memoryBinds[index] = new SparseMemoryBind() { @@ -207,14 +207,14 @@ namespace Ryujinx.Graphics.Vulkan fixed (SparseMemoryBind* pMemoryBinds = memoryBinds) { - SparseBufferMemoryBindInfo bufferBind = new SparseBufferMemoryBindInfo() + SparseBufferMemoryBindInfo bufferBind = new() { Buffer = buffer, BindCount = (uint)memoryBinds.Length, PBinds = pMemoryBinds }; - BindSparseInfo bindSparseInfo = new BindSparseInfo() + BindSparseInfo bindSparseInfo = new() { SType = StructureType.BindSparseInfo, BufferBindCount = 1, @@ -224,7 +224,7 @@ namespace Ryujinx.Graphics.Vulkan gd.Api.QueueBindSparse(gd.Queue, 1, in bindSparseInfo, default).ThrowOnError(); } - var holder = new BufferHolder(gd, _device, buffer, (int)size, storageAllocations); + BufferHolder holder = new(gd, _device, buffer, (int)size, storageAllocations); BufferCount++; @@ -288,14 +288,14 @@ namespace Ryujinx.Graphics.Vulkan public unsafe MemoryRequirements GetHostImportedUsageRequirements(VulkanRenderer gd) { - var usage = HostImportedBufferUsageFlags; + BufferUsageFlags usage = HostImportedBufferUsageFlags; if (gd.Capabilities.SupportsIndirectParameters) { usage |= BufferUsageFlags.IndirectBufferBit; } - var bufferCreateInfo = new BufferCreateInfo + BufferCreateInfo bufferCreateInfo = new() { SType = StructureType.BufferCreateInfo, Size = (ulong)Environment.SystemPageSize, @@ -303,9 +303,9 @@ namespace Ryujinx.Graphics.Vulkan SharingMode = SharingMode.Exclusive, }; - gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out var buffer).ThrowOnError(); + gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out VkBuffer buffer).ThrowOnError(); - gd.Api.GetBufferMemoryRequirements(_device, buffer, out var requirements); + gd.Api.GetBufferMemoryRequirements(_device, buffer, out MemoryRequirements requirements); gd.Api.DestroyBuffer(_device, buffer, null); @@ -320,7 +320,7 @@ namespace Ryujinx.Graphics.Vulkan bool sparseCompatible = false, BufferAllocationType fallbackType = BufferAllocationType.Auto) { - var usage = DefaultBufferUsageFlags; + BufferUsageFlags usage = DefaultBufferUsageFlags; if (forConditionalRendering && gd.Capabilities.SupportsConditionalRendering) { @@ -331,7 +331,7 @@ namespace Ryujinx.Graphics.Vulkan usage |= BufferUsageFlags.IndirectBufferBit; } - var bufferCreateInfo = new BufferCreateInfo + BufferCreateInfo bufferCreateInfo = new() { SType = StructureType.BufferCreateInfo, Size = (ulong)size, @@ -339,8 +339,8 @@ namespace Ryujinx.Graphics.Vulkan SharingMode = SharingMode.Exclusive, }; - gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out var buffer).ThrowOnError(); - gd.Api.GetBufferMemoryRequirements(_device, buffer, out var requirements); + gd.Api.CreateBuffer(_device, in bufferCreateInfo, null, out VkBuffer buffer).ThrowOnError(); + gd.Api.GetBufferMemoryRequirements(_device, buffer, out MemoryRequirements requirements); if (sparseCompatible) { @@ -351,7 +351,7 @@ namespace Ryujinx.Graphics.Vulkan do { - var allocateFlags = type switch + MemoryPropertyFlags allocateFlags = type switch { BufferAllocationType.HostMappedNoCache => DefaultBufferMemoryNoCacheFlags, BufferAllocationType.HostMapped => DefaultBufferMemoryFlags, @@ -402,7 +402,7 @@ namespace Ryujinx.Graphics.Vulkan if (buffer.Handle != 0) { - var holder = new BufferHolder(gd, _device, buffer, allocation, size, baseType, resultType); + BufferHolder holder = new(gd, _device, buffer, allocation, size, baseType, resultType); return holder; } @@ -414,7 +414,7 @@ namespace Ryujinx.Graphics.Vulkan public Auto CreateView(BufferHandle handle, VkFormat format, int offset, int size, Action invalidateView) { - if (TryGetBuffer(handle, out var holder)) + if (TryGetBuffer(handle, out BufferHolder holder)) { return holder.CreateView(format, offset, size, invalidateView); } @@ -424,7 +424,7 @@ namespace Ryujinx.Graphics.Vulkan public Auto GetBuffer(CommandBuffer commandBuffer, BufferHandle handle, bool isWrite, bool isSSBO = false) { - if (TryGetBuffer(handle, out var holder)) + if (TryGetBuffer(handle, out BufferHolder holder)) { return holder.GetBuffer(commandBuffer, isWrite, isSSBO); } @@ -434,7 +434,7 @@ namespace Ryujinx.Graphics.Vulkan public Auto GetBuffer(CommandBuffer commandBuffer, BufferHandle handle, int offset, int size, bool isWrite) { - if (TryGetBuffer(handle, out var holder)) + if (TryGetBuffer(handle, out BufferHolder holder)) { return holder.GetBuffer(commandBuffer, offset, size, isWrite); } @@ -444,7 +444,7 @@ namespace Ryujinx.Graphics.Vulkan public Auto GetBufferI8ToI16(CommandBufferScoped cbs, BufferHandle handle, int offset, int size) { - if (TryGetBuffer(handle, out var holder)) + if (TryGetBuffer(handle, out BufferHolder holder)) { return holder.GetBufferI8ToI16(cbs, offset, size); } @@ -454,7 +454,7 @@ namespace Ryujinx.Graphics.Vulkan public Auto GetAlignedVertexBuffer(CommandBufferScoped cbs, BufferHandle handle, int offset, int size, int stride, int alignment) { - if (TryGetBuffer(handle, out var holder)) + if (TryGetBuffer(handle, out BufferHolder holder)) { return holder.GetAlignedVertexBuffer(cbs, offset, size, stride, alignment); } @@ -464,7 +464,7 @@ namespace Ryujinx.Graphics.Vulkan public Auto GetBufferTopologyConversion(CommandBufferScoped cbs, BufferHandle handle, int offset, int size, IndexBufferPattern pattern, int indexSize) { - if (TryGetBuffer(handle, out var holder)) + if (TryGetBuffer(handle, out BufferHolder holder)) { return holder.GetBufferTopologyConversion(cbs, offset, size, pattern, indexSize); } @@ -486,14 +486,14 @@ namespace Ryujinx.Graphics.Vulkan { BufferHolder drawCountBufferHolder = null; - if (!TryGetBuffer(indexBuffer.Handle, out var indexBufferHolder) || - !TryGetBuffer(indirectBuffer.Handle, out var indirectBufferHolder) || + if (!TryGetBuffer(indexBuffer.Handle, out BufferHolder indexBufferHolder) || + !TryGetBuffer(indirectBuffer.Handle, out BufferHolder indirectBufferHolder) || (hasDrawCount && !TryGetBuffer(drawCountBuffer.Handle, out drawCountBufferHolder))) { return (null, null); } - var indexBufferKey = new TopologyConversionIndirectCacheKey( + TopologyConversionIndirectCacheKey indexBufferKey = new( gd, pattern, indexSize, @@ -505,16 +505,16 @@ namespace Ryujinx.Graphics.Vulkan indexBuffer.Offset, indexBuffer.Size, indexBufferKey, - out var convertedIndexBuffer); + out BufferHolder convertedIndexBuffer); - var indirectBufferKey = new IndirectDataCacheKey(pattern); + IndirectDataCacheKey indirectBufferKey = new(pattern); bool hasConvertedIndirectBuffer = indirectBufferHolder.TryGetCachedConvertedBuffer( indirectBuffer.Offset, indirectBuffer.Size, indirectBufferKey, - out var convertedIndirectBuffer); + out BufferHolder convertedIndirectBuffer); - var drawCountBufferKey = new DrawCountCacheKey(); + DrawCountCacheKey drawCountBufferKey = new(); bool hasCachedDrawCount = true; if (hasDrawCount) @@ -568,7 +568,7 @@ namespace Ryujinx.Graphics.Vulkan // Any modification of the indirect buffer should invalidate the index buffers that are associated with it, // since we used the indirect data to find the range of the index buffer that is used. - var indexBufferDependency = new Dependency( + Dependency indexBufferDependency = new( indexBufferHolder, indexBuffer.Offset, indexBuffer.Size, @@ -590,7 +590,7 @@ namespace Ryujinx.Graphics.Vulkan // If we have a draw count, any modification of the draw count should invalidate all indirect buffers // where we used it to find the range of indirect data that is actually used. - var indirectBufferDependency = new Dependency( + Dependency indirectBufferDependency = new( indirectBufferHolder, indirectBuffer.Offset, indirectBuffer.Size, @@ -609,7 +609,7 @@ namespace Ryujinx.Graphics.Vulkan public Auto GetBuffer(CommandBuffer commandBuffer, BufferHandle handle, bool isWrite, out int size) { - if (TryGetBuffer(handle, out var holder)) + if (TryGetBuffer(handle, out BufferHolder holder)) { size = holder.Size; return holder.GetBuffer(commandBuffer, isWrite); @@ -621,7 +621,7 @@ namespace Ryujinx.Graphics.Vulkan public PinnedSpan GetData(BufferHandle handle, int offset, int size) { - if (TryGetBuffer(handle, out var holder)) + if (TryGetBuffer(handle, out BufferHolder holder)) { return holder.GetData(offset, size); } @@ -636,7 +636,7 @@ namespace Ryujinx.Graphics.Vulkan public void SetData(BufferHandle handle, int offset, ReadOnlySpan data, CommandBufferScoped? cbs, Action endRenderPass) { - if (TryGetBuffer(handle, out var holder)) + if (TryGetBuffer(handle, out BufferHolder holder)) { holder.SetData(offset, data, cbs, endRenderPass); } @@ -644,7 +644,7 @@ namespace Ryujinx.Graphics.Vulkan public void Delete(BufferHandle handle) { - if (TryGetBuffer(handle, out var holder)) + if (TryGetBuffer(handle, out BufferHolder holder)) { holder.Dispose(); _buffers.Remove((int)Unsafe.As(ref handle)); diff --git a/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs b/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs index 5722ca1ac..3cffb08c9 100644 --- a/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs +++ b/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs @@ -38,7 +38,7 @@ namespace Ryujinx.Graphics.Vulkan public readonly bool Remove(int offset, int size) { - var list = _ranges; + List list = _ranges; bool removedAny = false; if (list != null) { @@ -56,7 +56,7 @@ namespace Ryujinx.Graphics.Vulkan int endOffset = offset + size; int startIndex = overlapIndex; - var currentOverlap = list[overlapIndex]; + Range currentOverlap = list[overlapIndex]; // Orphan the start of the overlap. if (currentOverlap.Offset < offset) @@ -102,7 +102,7 @@ namespace Ryujinx.Graphics.Vulkan public void Add(int offset, int size) { - var list = _ranges; + List list = _ranges; if (list != null) { int overlapIndex = BinarySearch(list, offset, size); @@ -118,8 +118,8 @@ namespace Ryujinx.Graphics.Vulkan while (overlapIndex < list.Count && list[overlapIndex].OverlapsWith(offset, size)) { - var currentOverlap = list[overlapIndex]; - var currentOverlapEndOffset = currentOverlap.Offset + currentOverlap.Size; + Range currentOverlap = list[overlapIndex]; + int currentOverlapEndOffset = currentOverlap.Offset + currentOverlap.Size; if (offset > currentOverlap.Offset) { @@ -150,16 +150,13 @@ namespace Ryujinx.Graphics.Vulkan } else { - _ranges = new List - { - new Range(offset, size) - }; + _ranges = [new(offset, size)]; } } public readonly bool OverlapsWith(int offset, int size) { - var list = _ranges; + List list = _ranges; if (list == null) { return false; @@ -170,7 +167,7 @@ namespace Ryujinx.Graphics.Vulkan public readonly List FindOverlaps(int offset, int size) { - var list = _ranges; + List list = _ranges; if (list == null) { return null; @@ -189,7 +186,7 @@ namespace Ryujinx.Graphics.Vulkan do { - (result ??= new List()).Add(list[index++]); + (result ??= []).Add(list[index++]); } while (index < list.Count && list[index].OverlapsWith(offset, size)); } @@ -208,7 +205,7 @@ namespace Ryujinx.Graphics.Vulkan int middle = left + (range >> 1); - var item = list[middle]; + Range item = list[middle]; if (item.OverlapsWith(offset, size)) { @@ -233,7 +230,7 @@ namespace Ryujinx.Graphics.Vulkan int size = baseData.Length; int endOffset = offset + size; - var list = _ranges; + List list = _ranges; if (list == null) { baseData.CopyTo(result); @@ -245,7 +242,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < list.Count; i++) { - var range = list[i]; + Range range = list[i]; int rangeEnd = range.Offset + range.Size; diff --git a/src/Ryujinx.Graphics.Vulkan/BufferState.cs b/src/Ryujinx.Graphics.Vulkan/BufferState.cs index e49df765d..bc7c847f1 100644 --- a/src/Ryujinx.Graphics.Vulkan/BufferState.cs +++ b/src/Ryujinx.Graphics.Vulkan/BufferState.cs @@ -1,4 +1,5 @@ using System; +using Buffer = Silk.NET.Vulkan.Buffer; namespace Ryujinx.Graphics.Vulkan { @@ -23,7 +24,7 @@ namespace Ryujinx.Graphics.Vulkan { if (_buffer != null) { - var buffer = _buffer.Get(cbs, _offset, _size, true).Value; + Buffer buffer = _buffer.Get(cbs, _offset, _size, true).Value; ulong offset = (ulong)_offset; ulong size = (ulong)_size; diff --git a/src/Ryujinx.Graphics.Vulkan/CacheByRange.cs b/src/Ryujinx.Graphics.Vulkan/CacheByRange.cs index 16954d21b..30414b4df 100644 --- a/src/Ryujinx.Graphics.Vulkan/CacheByRange.cs +++ b/src/Ryujinx.Graphics.Vulkan/CacheByRange.cs @@ -249,7 +249,7 @@ namespace Ryujinx.Graphics.Vulkan { if (entry.DependencyList == null) { - entry.DependencyList = new List(); + entry.DependencyList = []; entries[i] = entry; } @@ -340,7 +340,7 @@ namespace Ryujinx.Graphics.Vulkan DestroyEntry(entry); } - (toRemove ??= new List()).Add(range.Key); + (toRemove ??= []).Add(range.Key); } } @@ -362,7 +362,7 @@ namespace Ryujinx.Graphics.Vulkan if (!_ranges.TryGetValue(key, out List value)) { - value = new List(); + value = []; _ranges.Add(key, value); } diff --git a/src/Ryujinx.Graphics.Vulkan/CommandBufferPool.cs b/src/Ryujinx.Graphics.Vulkan/CommandBufferPool.cs index e1fd3fb9d..311cc2397 100644 --- a/src/Ryujinx.Graphics.Vulkan/CommandBufferPool.cs +++ b/src/Ryujinx.Graphics.Vulkan/CommandBufferPool.cs @@ -17,7 +17,7 @@ namespace Ryujinx.Graphics.Vulkan private readonly Vk _api; private readonly Device _device; private readonly Queue _queue; - private readonly object _queueLock; + private readonly Lock _queueLock; private readonly bool _concurrentFenceWaitUnsupported; private readonly CommandPool _pool; private readonly Thread _owner; @@ -37,7 +37,7 @@ namespace Ryujinx.Graphics.Vulkan public void Initialize(Vk api, Device device, CommandPool pool) { - var allocateInfo = new CommandBufferAllocateInfo + CommandBufferAllocateInfo allocateInfo = new() { SType = StructureType.CommandBufferAllocateInfo, CommandBufferCount = 1, @@ -47,8 +47,8 @@ namespace Ryujinx.Graphics.Vulkan api.AllocateCommandBuffers(device, in allocateInfo, out CommandBuffer); - Dependants = new List(); - Waitables = new List(); + Dependants = []; + Waitables = []; } } @@ -63,7 +63,7 @@ namespace Ryujinx.Graphics.Vulkan Vk api, Device device, Queue queue, - object queueLock, + Lock queueLock, uint queueFamilyIndex, bool concurrentFenceWaitUnsupported, bool isLight = false) @@ -75,7 +75,7 @@ namespace Ryujinx.Graphics.Vulkan _concurrentFenceWaitUnsupported = concurrentFenceWaitUnsupported; _owner = Thread.CurrentThread; - var commandPoolCreateInfo = new CommandPoolCreateInfo + CommandPoolCreateInfo commandPoolCreateInfo = new() { SType = StructureType.CommandPoolCreateInfo, QueueFamilyIndex = queueFamilyIndex, @@ -114,7 +114,7 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < _totalCommandBuffers; i++) { - ref var entry = ref _commandBuffers[i]; + ref ReservedCommandBuffer entry = ref _commandBuffers[i]; if (entry.InConsumption) { @@ -130,7 +130,7 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < _totalCommandBuffers; i++) { - ref var entry = ref _commandBuffers[i]; + ref ReservedCommandBuffer entry = ref _commandBuffers[i]; if (entry.InUse) { @@ -142,7 +142,7 @@ namespace Ryujinx.Graphics.Vulkan public void AddWaitable(int cbIndex, MultiFenceHolder waitable) { - ref var entry = ref _commandBuffers[cbIndex]; + ref ReservedCommandBuffer entry = ref _commandBuffers[cbIndex]; if (waitable.AddFence(cbIndex, entry.Fence)) { entry.Waitables.Add(waitable); @@ -155,7 +155,7 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < _totalCommandBuffers; i++) { - ref var entry = ref _commandBuffers[i]; + ref ReservedCommandBuffer entry = ref _commandBuffers[i]; if (entry.InUse && waitable.HasFence(i) && @@ -175,7 +175,7 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < _totalCommandBuffers; i++) { - ref var entry = ref _commandBuffers[i]; + ref ReservedCommandBuffer entry = ref _commandBuffers[i]; if (entry.InUse && entry.Fence == fence) { @@ -205,7 +205,7 @@ namespace Ryujinx.Graphics.Vulkan { int index = _queuedIndexes[_queuedIndexesPtr]; - ref var entry = ref _commandBuffers[index]; + ref ReservedCommandBuffer entry = ref _commandBuffers[index]; if (wait || !entry.InConsumption || entry.Fence.IsSignaled()) { @@ -240,7 +240,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < _totalCommandBuffers; i++) { - ref var entry = ref _commandBuffers[cursor]; + ref ReservedCommandBuffer entry = ref _commandBuffers[cursor]; if (!entry.InUse && !entry.InConsumption) { @@ -248,7 +248,7 @@ namespace Ryujinx.Graphics.Vulkan _inUseCount++; - var commandBufferBeginInfo = new CommandBufferBeginInfo + CommandBufferBeginInfo commandBufferBeginInfo = new() { SType = StructureType.CommandBufferBeginInfo, }; @@ -280,7 +280,7 @@ namespace Ryujinx.Graphics.Vulkan { int cbIndex = cbs.CommandBufferIndex; - ref var entry = ref _commandBuffers[cbIndex]; + ref ReservedCommandBuffer entry = ref _commandBuffers[cbIndex]; Debug.Assert(entry.InUse); Debug.Assert(entry.CommandBuffer.Handle == cbs.CommandBuffer.Handle); @@ -289,7 +289,7 @@ namespace Ryujinx.Graphics.Vulkan entry.SubmissionCount++; _inUseCount--; - var commandBuffer = entry.CommandBuffer; + CommandBuffer commandBuffer = entry.CommandBuffer; _api.EndCommandBuffer(commandBuffer).ThrowOnError(); @@ -324,7 +324,7 @@ namespace Ryujinx.Graphics.Vulkan private void WaitAndDecrementRef(int cbIndex, bool refreshFence = true) { - ref var entry = ref _commandBuffers[cbIndex]; + ref ReservedCommandBuffer entry = ref _commandBuffers[cbIndex]; if (entry.InConsumption) { @@ -332,12 +332,12 @@ namespace Ryujinx.Graphics.Vulkan entry.InConsumption = false; } - foreach (var dependant in entry.Dependants) + foreach (IAuto dependant in entry.Dependants) { dependant.DecrementReferenceCount(cbIndex); } - foreach (var waitable in entry.Waitables) + foreach (MultiFenceHolder waitable in entry.Waitables) { waitable.RemoveFence(cbIndex); waitable.RemoveBufferUses(cbIndex); diff --git a/src/Ryujinx.Graphics.Vulkan/DescriptorSetCollection.cs b/src/Ryujinx.Graphics.Vulkan/DescriptorSetCollection.cs index 40fc01b24..a39a8d9a2 100644 --- a/src/Ryujinx.Graphics.Vulkan/DescriptorSetCollection.cs +++ b/src/Ryujinx.Graphics.Vulkan/DescriptorSetCollection.cs @@ -33,7 +33,7 @@ namespace Ryujinx.Graphics.Vulkan { if (bufferInfo.Buffer.Handle != 0UL) { - var writeDescriptorSet = new WriteDescriptorSet + WriteDescriptorSet writeDescriptorSet = new() { SType = StructureType.WriteDescriptorSet, DstSet = _descriptorSets[setIndex], @@ -56,7 +56,7 @@ namespace Ryujinx.Graphics.Vulkan fixed (DescriptorBufferInfo* pBufferInfo = bufferInfo) { - var writeDescriptorSet = new WriteDescriptorSet + WriteDescriptorSet writeDescriptorSet = new() { SType = StructureType.WriteDescriptorSet, DstSet = _descriptorSets[setIndex], @@ -74,7 +74,7 @@ namespace Ryujinx.Graphics.Vulkan { if (imageInfo.ImageView.Handle != 0UL) { - var writeDescriptorSet = new WriteDescriptorSet + WriteDescriptorSet writeDescriptorSet = new() { SType = StructureType.WriteDescriptorSet, DstSet = _descriptorSets[setIndex], @@ -97,7 +97,7 @@ namespace Ryujinx.Graphics.Vulkan fixed (DescriptorImageInfo* pImageInfo = imageInfo) { - var writeDescriptorSet = new WriteDescriptorSet + WriteDescriptorSet writeDescriptorSet = new() { SType = StructureType.WriteDescriptorSet, DstSet = _descriptorSets[setIndex], @@ -134,7 +134,7 @@ namespace Ryujinx.Graphics.Vulkan count++; } - var writeDescriptorSet = new WriteDescriptorSet + WriteDescriptorSet writeDescriptorSet = new() { SType = StructureType.WriteDescriptorSet, DstSet = _descriptorSets[setIndex], @@ -156,7 +156,7 @@ namespace Ryujinx.Graphics.Vulkan { if (texelBufferView.Handle != 0UL) { - var writeDescriptorSet = new WriteDescriptorSet + WriteDescriptorSet writeDescriptorSet = new() { SType = StructureType.WriteDescriptorSet, DstSet = _descriptorSets[setIndex], @@ -190,7 +190,7 @@ namespace Ryujinx.Graphics.Vulkan count++; } - var writeDescriptorSet = new WriteDescriptorSet + WriteDescriptorSet writeDescriptorSet = new() { SType = StructureType.WriteDescriptorSet, DstSet = _descriptorSets[setIndex], diff --git a/src/Ryujinx.Graphics.Vulkan/DescriptorSetManager.cs b/src/Ryujinx.Graphics.Vulkan/DescriptorSetManager.cs index 97669942c..04a36a3ba 100644 --- a/src/Ryujinx.Graphics.Vulkan/DescriptorSetManager.cs +++ b/src/Ryujinx.Graphics.Vulkan/DescriptorSetManager.cs @@ -24,14 +24,14 @@ namespace Ryujinx.Graphics.Vulkan Api = api; Device = device; - foreach (var poolSize in poolSizes) + foreach (DescriptorPoolSize poolSize in poolSizes) { _freeDescriptors += (int)poolSize.DescriptorCount; } fixed (DescriptorPoolSize* pPoolsSize = poolSizes) { - var descriptorPoolCreateInfo = new DescriptorPoolCreateInfo + DescriptorPoolCreateInfo descriptorPoolCreateInfo = new() { SType = StructureType.DescriptorPoolCreateInfo, Flags = updateAfterBind ? DescriptorPoolCreateFlags.UpdateAfterBindBit : DescriptorPoolCreateFlags.None, @@ -46,7 +46,7 @@ namespace Ryujinx.Graphics.Vulkan public unsafe DescriptorSetCollection AllocateDescriptorSets(ReadOnlySpan layouts, int consumedDescriptors) { - TryAllocateDescriptorSets(layouts, consumedDescriptors, isTry: false, out var dsc); + TryAllocateDescriptorSets(layouts, consumedDescriptors, isTry: false, out DescriptorSetCollection dsc); return dsc; } @@ -69,7 +69,7 @@ namespace Ryujinx.Graphics.Vulkan { fixed (DescriptorSetLayout* pLayouts = layouts) { - var descriptorSetAllocateInfo = new DescriptorSetAllocateInfo + DescriptorSetAllocateInfo descriptorSetAllocateInfo = new() { SType = StructureType.DescriptorSetAllocateInfo, DescriptorPool = _pool, @@ -77,7 +77,7 @@ namespace Ryujinx.Graphics.Vulkan PSetLayouts = pLayouts, }; - var result = Api.AllocateDescriptorSets(Device, &descriptorSetAllocateInfo, pDescriptorSets); + Result result = Api.AllocateDescriptorSets(Device, &descriptorSetAllocateInfo, pDescriptorSets); if (isTry && result == Result.ErrorOutOfPoolMemory) { _totalSets = (int)MaxSets; @@ -182,8 +182,8 @@ namespace Ryujinx.Graphics.Vulkan { // If we fail the first time, just create a new pool and try again. - var pool = GetPool(api, poolSizes, poolIndex, layouts.Length, consumedDescriptors, updateAfterBind); - if (!pool.TryAllocateDescriptorSets(layouts, consumedDescriptors, out var dsc)) + DescriptorPoolHolder pool = GetPool(api, poolSizes, poolIndex, layouts.Length, consumedDescriptors, updateAfterBind); + if (!pool.TryAllocateDescriptorSets(layouts, consumedDescriptors, out DescriptorSetCollection dsc)) { pool = GetPool(api, poolSizes, poolIndex, layouts.Length, consumedDescriptors, updateAfterBind); dsc = pool.AllocateDescriptorSets(layouts, consumedDescriptors); diff --git a/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs b/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs index 117f79bb4..3b70a841a 100644 --- a/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs +++ b/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs @@ -86,7 +86,7 @@ namespace Ryujinx.Graphics.Vulkan Size = (int)structureOffset; - var info = new DescriptorUpdateTemplateCreateInfo() + DescriptorUpdateTemplateCreateInfo info = new() { SType = StructureType.DescriptorUpdateTemplateCreateInfo, DescriptorUpdateEntryCount = (uint)segments.Length, @@ -173,7 +173,7 @@ namespace Ryujinx.Graphics.Vulkan Size = (int)structureOffset; - var info = new DescriptorUpdateTemplateCreateInfo() + DescriptorUpdateTemplateCreateInfo info = new() { SType = StructureType.DescriptorUpdateTemplateCreateInfo, DescriptorUpdateEntryCount = (uint)entry, @@ -194,12 +194,12 @@ namespace Ryujinx.Graphics.Vulkan private static bool IsBufferType(ResourceType type) { - return type == ResourceType.UniformBuffer || type == ResourceType.StorageBuffer; + return type is ResourceType.UniformBuffer or ResourceType.StorageBuffer; } private static bool IsBufferTextureType(ResourceType type) { - return type == ResourceType.BufferTexture || type == ResourceType.BufferImage; + return type is ResourceType.BufferTexture or ResourceType.BufferImage; } public unsafe void Dispose() diff --git a/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs b/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs index 3780dc174..a0a238e38 100644 --- a/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs +++ b/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs @@ -3,10 +3,10 @@ using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Shader; using Silk.NET.Vulkan; using System; -using System.Buffers; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using Buffer = Silk.NET.Vulkan.Buffer; using CompareOp = Ryujinx.Graphics.GAL.CompareOp; using Format = Ryujinx.Graphics.GAL.Format; using SamplerCreateInfo = Ryujinx.Graphics.GAL.SamplerCreateInfo; @@ -141,11 +141,11 @@ namespace Ryujinx.Graphics.Vulkan _bufferTextureRefs = new TextureBuffer[Constants.MaxTextureBindings * 2]; _bufferImageRefs = new TextureBuffer[Constants.MaxImageBindings * 2]; - _textureArrayRefs = Array.Empty>(); - _imageArrayRefs = Array.Empty>(); + _textureArrayRefs = []; + _imageArrayRefs = []; - _textureArrayExtraRefs = Array.Empty>(); - _imageArrayExtraRefs = Array.Empty>(); + _textureArrayExtraRefs = []; + _imageArrayExtraRefs = []; _uniformBuffers = new DescriptorBufferInfo[Constants.MaxUniformBufferBindings]; _storageBuffers = new DescriptorBufferInfo[Constants.MaxStorageBufferBindings]; @@ -156,7 +156,7 @@ namespace Ryujinx.Graphics.Vulkan _uniformSetPd = new int[Constants.MaxUniformBufferBindings]; - var initialImageInfo = new DescriptorImageInfo + DescriptorImageInfo initialImageInfo = new() { ImageLayout = ImageLayout.General, }; @@ -217,7 +217,7 @@ namespace Ryujinx.Graphics.Vulkan if (isMainPipeline) { - FeedbackLoopHazards = new(); + FeedbackLoopHazards = []; } } @@ -235,7 +235,7 @@ namespace Ryujinx.Graphics.Vulkan // Check stage bindings - _uniformMirrored.Union(_uniformSet).SignalSet((int binding, int count) => + _uniformMirrored.Union(_uniformSet).SignalSet((binding, count) => { for (int i = 0; i < count; i++) { @@ -257,7 +257,7 @@ namespace Ryujinx.Graphics.Vulkan } }); - _storageMirrored.Union(_storageSet).SignalSet((int binding, int count) => + _storageMirrored.Union(_storageSet).SignalSet((binding, count) => { for (int i = 0; i < count; i++) { @@ -301,13 +301,13 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < segment.Count; i++) { - ref var texture = ref _textureRefs[segment.Binding + i]; + ref TextureRef texture = ref _textureRefs[segment.Binding + i]; texture.View?.PrepareForUsage(cbs, texture.Stage.ConvertToPipelineStageFlags(), FeedbackLoopHazards); } } else { - ref var arrayRef = ref _textureArrayRefs[segment.Binding]; + ref ArrayRef arrayRef = ref _textureArrayRefs[segment.Binding]; PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags(); arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags); } @@ -322,13 +322,13 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < segment.Count; i++) { - ref var image = ref _imageRefs[segment.Binding + i]; + ref ImageRef image = ref _imageRefs[segment.Binding + i]; image.View?.PrepareForUsage(cbs, image.Stage.ConvertToPipelineStageFlags(), FeedbackLoopHazards); } } else { - ref var arrayRef = ref _imageArrayRefs[segment.Binding]; + ref ArrayRef arrayRef = ref _imageArrayRefs[segment.Binding]; PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags(); arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags); } @@ -337,7 +337,7 @@ namespace Ryujinx.Graphics.Vulkan for (int setIndex = PipelineBase.DescriptorSetLayouts; setIndex < _program.BindingSegments.Length; setIndex++) { - var bindingSegments = _program.BindingSegments[setIndex]; + ResourceBindingSegment[] bindingSegments = _program.BindingSegments[setIndex]; if (bindingSegments.Length == 0) { @@ -348,18 +348,18 @@ namespace Ryujinx.Graphics.Vulkan if (segment.IsArray) { - if (segment.Type == ResourceType.Texture || - segment.Type == ResourceType.Sampler || - segment.Type == ResourceType.TextureAndSampler || - segment.Type == ResourceType.BufferTexture) + if (segment.Type is ResourceType.Texture or + ResourceType.Sampler or + ResourceType.TextureAndSampler or + ResourceType.BufferTexture) { - ref var arrayRef = ref _textureArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts]; + ref ArrayRef arrayRef = ref _textureArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts]; PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags(); arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags); } - else if (segment.Type == ResourceType.Image || segment.Type == ResourceType.BufferImage) + else if (segment.Type is ResourceType.Image or ResourceType.BufferImage) { - ref var arrayRef = ref _imageArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts]; + ref ArrayRef arrayRef = ref _imageArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts]; PipelineStageFlags stageFlags = arrayRef.Stage.ConvertToPipelineStageFlags(); arrayRef.Array?.QueueWriteToReadBarriers(cbs, stageFlags); } @@ -424,8 +424,8 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < buffers.Length; i++) { - var assignment = buffers[i]; - var buffer = assignment.Range; + BufferAssignment assignment = buffers[i]; + BufferRange buffer = assignment.Range; int index = assignment.Binding; Auto vkBuffer = buffer.Handle == BufferHandle.Null @@ -440,7 +440,7 @@ namespace Ryujinx.Graphics.Vulkan Range = (ulong)buffer.Size, }; - var newRef = new BufferRef(vkBuffer, ref buffer); + BufferRef newRef = new(vkBuffer, ref buffer); ref DescriptorBufferInfo currentInfo = ref _storageBuffers[index]; @@ -460,7 +460,7 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < buffers.Length; i++) { - var vkBuffer = buffers[i]; + Auto vkBuffer = buffers[i]; int index = first + i; ref BufferRef currentBufferRef = ref _storageBufferRefs[index]; @@ -633,8 +633,8 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < buffers.Length; i++) { - var assignment = buffers[i]; - var buffer = assignment.Range; + BufferAssignment assignment = buffers[i]; + BufferRange buffer = assignment.Range; int index = assignment.Binding; Auto vkBuffer = buffer.Handle == BufferHandle.Null @@ -678,7 +678,7 @@ namespace Ryujinx.Graphics.Vulkan return; } - var program = _program; + ShaderCollection program = _program; if (_dirty.HasFlag(DirtyFlags.Uniform)) { @@ -760,14 +760,14 @@ namespace Ryujinx.Graphics.Vulkan [MethodImpl(MethodImplOptions.AggressiveInlining)] private void UpdateAndBind(CommandBufferScoped cbs, ShaderCollection program, int setIndex, PipelineBindPoint pbp) { - var bindingSegments = program.BindingSegments[setIndex]; + ResourceBindingSegment[] bindingSegments = program.BindingSegments[setIndex]; if (bindingSegments.Length == 0) { return; } - var dummyBuffer = _dummyBuffer?.GetBuffer(); + Auto dummyBuffer = _dummyBuffer?.GetBuffer(); if (_updateDescriptorCacheCbIndex) { @@ -775,7 +775,7 @@ namespace Ryujinx.Graphics.Vulkan program.UpdateDescriptorCacheCommandBufferIndex(cbs.CommandBufferIndex); } - var dsc = program.GetNewDescriptorSetCollection(setIndex, out var isNew).Get(cbs); + DescriptorSetCollection dsc = program.GetNewDescriptorSetCollection(setIndex, out bool isNew).Get(cbs); if (!program.HasMinimalLayout) { @@ -824,7 +824,7 @@ namespace Ryujinx.Graphics.Vulkan if (_storageSet.Set(index)) { - ref var info = ref _storageBuffers[index]; + ref DescriptorBufferInfo info = ref _storageBuffers[index]; bool mirrored = UpdateBuffer(cbs, ref info, @@ -850,8 +850,8 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < count; i++) { - ref var texture = ref textures[i]; - ref var refs = ref _textureRefs[binding + i]; + ref DescriptorImageInfo texture = ref textures[i]; + ref TextureRef refs = ref _textureRefs[binding + i]; texture.ImageView = refs.ImageView?.Get(cbs).Value ?? default; texture.Sampler = refs.Sampler?.Get(cbs).Value ?? default; @@ -934,7 +934,7 @@ namespace Ryujinx.Graphics.Vulkan } } - var sets = dsc.GetSets(); + DescriptorSet[] sets = dsc.GetSets(); _templateUpdater.Commit(_gd, _device, sets[0]); _gd.Api.CmdBindDescriptorSets(cbs.CommandBuffer, pbp, _program.PipelineLayout, (uint)setIndex, 1, sets, 0, ReadOnlySpan.Empty); @@ -943,7 +943,7 @@ namespace Ryujinx.Graphics.Vulkan private void UpdateAndBindTexturesWithoutTemplate(CommandBufferScoped cbs, ShaderCollection program, PipelineBindPoint pbp) { int setIndex = PipelineBase.TextureSetIndex; - var bindingSegments = program.BindingSegments[setIndex]; + ResourceBindingSegment[] bindingSegments = program.BindingSegments[setIndex]; if (bindingSegments.Length == 0) { @@ -956,7 +956,7 @@ namespace Ryujinx.Graphics.Vulkan program.UpdateDescriptorCacheCommandBufferIndex(cbs.CommandBufferIndex); } - var dsc = program.GetNewDescriptorSetCollection(setIndex, out _).Get(cbs); + DescriptorSetCollection dsc = program.GetNewDescriptorSetCollection(setIndex, out _).Get(cbs); foreach (ResourceBindingSegment segment in bindingSegments) { @@ -971,8 +971,8 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < count; i++) { - ref var texture = ref textures[i]; - ref var refs = ref _textureRefs[binding + i]; + ref DescriptorImageInfo texture = ref textures[i]; + ref TextureRef refs = ref _textureRefs[binding + i]; texture.ImageView = refs.ImageView?.Get(cbs).Value ?? default; texture.Sampler = refs.Sampler?.Get(cbs).Value ?? default; @@ -1015,7 +1015,7 @@ namespace Ryujinx.Graphics.Vulkan } } - var sets = dsc.GetSets(); + DescriptorSet[] sets = dsc.GetSets(); _gd.Api.CmdBindDescriptorSets(cbs.CommandBuffer, pbp, _program.PipelineLayout, (uint)setIndex, 1, sets, 0, ReadOnlySpan.Empty); } @@ -1024,8 +1024,8 @@ namespace Ryujinx.Graphics.Vulkan private void UpdateAndBindUniformBufferPd(CommandBufferScoped cbs) { int sequence = _pdSequence; - var bindingSegments = _program.BindingSegments[PipelineBase.UniformSetIndex]; - var dummyBuffer = _dummyBuffer?.GetBuffer(); + ResourceBindingSegment[] bindingSegments = _program.BindingSegments[PipelineBase.UniformSetIndex]; + Auto dummyBuffer = _dummyBuffer?.GetBuffer(); long updatedBindings = 0; DescriptorSetTemplateWriter writer = _templateUpdater.Begin(32 * Unsafe.SizeOf()); @@ -1072,12 +1072,12 @@ namespace Ryujinx.Graphics.Vulkan private void Initialize(CommandBufferScoped cbs, int setIndex, DescriptorSetCollection dsc) { // We don't support clearing texture descriptors currently. - if (setIndex != PipelineBase.UniformSetIndex && setIndex != PipelineBase.StorageSetIndex) + if (setIndex is not PipelineBase.UniformSetIndex and not PipelineBase.StorageSetIndex) { return; } - var dummyBuffer = _dummyBuffer?.GetBuffer().Get(cbs).Value ?? default; + Buffer dummyBuffer = _dummyBuffer?.GetBuffer().Get(cbs).Value ?? default; foreach (ResourceBindingSegment segment in _program.ClearSegments[setIndex]) { @@ -1089,7 +1089,7 @@ namespace Ryujinx.Graphics.Vulkan { for (int setIndex = PipelineBase.DescriptorSetLayouts; setIndex < program.BindingSegments.Length; setIndex++) { - var bindingSegments = program.BindingSegments[setIndex]; + ResourceBindingSegment[] bindingSegments = program.BindingSegments[setIndex]; if (bindingSegments.Length == 0) { @@ -1102,10 +1102,10 @@ namespace Ryujinx.Graphics.Vulkan { DescriptorSet[] sets = null; - if (segment.Type == ResourceType.Texture || - segment.Type == ResourceType.Sampler || - segment.Type == ResourceType.TextureAndSampler || - segment.Type == ResourceType.BufferTexture) + if (segment.Type is ResourceType.Texture or + ResourceType.Sampler or + ResourceType.TextureAndSampler or + ResourceType.BufferTexture) { sets = _textureArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts].Array.GetDescriptorSets( _device, @@ -1116,7 +1116,7 @@ namespace Ryujinx.Graphics.Vulkan _dummyTexture, _dummySampler); } - else if (segment.Type == ResourceType.Image || segment.Type == ResourceType.BufferImage) + else if (segment.Type is ResourceType.Image or ResourceType.BufferImage) { sets = _imageArrayExtraRefs[setIndex - PipelineBase.DescriptorSetLayouts].Array.GetDescriptorSets( _device, diff --git a/src/Ryujinx.Graphics.Vulkan/Effects/AreaScalingFilter.cs b/src/Ryujinx.Graphics.Vulkan/Effects/AreaScalingFilter.cs index 87b46df80..b8992c652 100644 --- a/src/Ryujinx.Graphics.Vulkan/Effects/AreaScalingFilter.cs +++ b/src/Ryujinx.Graphics.Vulkan/Effects/AreaScalingFilter.cs @@ -41,19 +41,18 @@ namespace Ryujinx.Graphics.Vulkan.Effects _pipeline.Initialize(); - var scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/AreaScaling.spv"); + byte[] scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/AreaScaling.spv"); - var scalingResourceLayout = new ResourceLayoutBuilder() + ResourceLayout scalingResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) .Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1) .Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build(); _sampler = _renderer.CreateSampler(SamplerCreateInfo.Create(MinFilter.Linear, MagFilter.Linear)); - _scalingProgram = _renderer.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(scalingShader, ShaderStage.Compute, TargetLanguage.Spirv), - }, scalingResourceLayout); + _scalingProgram = _renderer.CreateProgramWithMinimalLayout([ + new ShaderSource(scalingShader, ShaderStage.Compute, TargetLanguage.Spirv) + ], scalingResourceLayout); } public void Run( @@ -70,8 +69,8 @@ namespace Ryujinx.Graphics.Vulkan.Effects _pipeline.SetProgram(_scalingProgram); _pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, view, _sampler); - ReadOnlySpan dimensionsBuffer = stackalloc float[] - { + ReadOnlySpan dimensionsBuffer = + [ source.X1, source.X2, source.Y1, @@ -79,18 +78,18 @@ namespace Ryujinx.Graphics.Vulkan.Effects destination.X1, destination.X2, destination.Y1, - destination.Y2, - }; + destination.Y2 + ]; int rangeSize = dimensionsBuffer.Length * sizeof(float); - using var buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize); + using ScopedTemporaryBuffer buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize); buffer.Holder.SetDataUnchecked(buffer.Offset, dimensionsBuffer); int threadGroupWorkRegionDim = 16; int dispatchX = (width + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; int dispatchY = (height + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(2, buffer.Range)]); _pipeline.SetImage(0, destinationTexture); _pipeline.DispatchCompute(dispatchX, dispatchY, 1); _pipeline.ComputeBarrier(); diff --git a/src/Ryujinx.Graphics.Vulkan/Effects/FsrScalingFilter.cs b/src/Ryujinx.Graphics.Vulkan/Effects/FsrScalingFilter.cs index 080dde5e5..64b6c3b37 100644 --- a/src/Ryujinx.Graphics.Vulkan/Effects/FsrScalingFilter.cs +++ b/src/Ryujinx.Graphics.Vulkan/Effects/FsrScalingFilter.cs @@ -53,15 +53,15 @@ namespace Ryujinx.Graphics.Vulkan.Effects _pipeline.Initialize(); - var scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/FsrScaling.spv"); - var sharpeningShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/FsrSharpening.spv"); + byte[] scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/FsrScaling.spv"); + byte[] sharpeningShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/FsrSharpening.spv"); - var scalingResourceLayout = new ResourceLayoutBuilder() + ResourceLayout scalingResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) .Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1) .Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build(); - var sharpeningResourceLayout = new ResourceLayoutBuilder() + ResourceLayout sharpeningResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 3) .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 4) @@ -70,15 +70,13 @@ namespace Ryujinx.Graphics.Vulkan.Effects _sampler = _renderer.CreateSampler(SamplerCreateInfo.Create(MinFilter.Linear, MagFilter.Linear)); - _scalingProgram = _renderer.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(scalingShader, ShaderStage.Compute, TargetLanguage.Spirv), - }, scalingResourceLayout); + _scalingProgram = _renderer.CreateProgramWithMinimalLayout([ + new ShaderSource(scalingShader, ShaderStage.Compute, TargetLanguage.Spirv) + ], scalingResourceLayout); - _sharpeningProgram = _renderer.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(sharpeningShader, ShaderStage.Compute, TargetLanguage.Spirv), - }, sharpeningResourceLayout); + _sharpeningProgram = _renderer.CreateProgramWithMinimalLayout([ + new ShaderSource(sharpeningShader, ShaderStage.Compute, TargetLanguage.Spirv) + ], sharpeningResourceLayout); } public void Run( @@ -96,9 +94,9 @@ namespace Ryujinx.Graphics.Vulkan.Effects || _intermediaryTexture.Info.Height != height || !_intermediaryTexture.Info.Equals(view.Info)) { - var originalInfo = view.Info; + TextureCreateInfo originalInfo = view.Info; - var info = new TextureCreateInfo( + TextureCreateInfo info = new( width, height, originalInfo.Depth, @@ -127,8 +125,8 @@ namespace Ryujinx.Graphics.Vulkan.Effects float scaleX = srcWidth / view.Width; float scaleY = srcHeight / view.Height; - ReadOnlySpan dimensionsBuffer = stackalloc float[] - { + ReadOnlySpan dimensionsBuffer = + [ source.X1, source.X2, source.Y1, @@ -138,22 +136,22 @@ namespace Ryujinx.Graphics.Vulkan.Effects destination.Y1, destination.Y2, scaleX, - scaleY, - }; + scaleY + ]; int rangeSize = dimensionsBuffer.Length * sizeof(float); - using var buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize); + using ScopedTemporaryBuffer buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize); buffer.Holder.SetDataUnchecked(buffer.Offset, dimensionsBuffer); - ReadOnlySpan sharpeningBufferData = stackalloc float[] { 1.5f - (Level * 0.01f * 1.5f) }; - using var sharpeningBuffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, sizeof(float)); + ReadOnlySpan sharpeningBufferData = [1.5f - (Level * 0.01f * 1.5f)]; + using ScopedTemporaryBuffer sharpeningBuffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, sizeof(float)); sharpeningBuffer.Holder.SetDataUnchecked(sharpeningBuffer.Offset, sharpeningBufferData); int threadGroupWorkRegionDim = 16; int dispatchX = (width + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; int dispatchY = (height + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(2, buffer.Range)]); _pipeline.SetImage(ShaderStage.Compute, 0, _intermediaryTexture.GetView(FormatTable.ConvertRgba8SrgbToUnorm(view.Info.Format))); _pipeline.DispatchCompute(dispatchX, dispatchY, 1); _pipeline.ComputeBarrier(); @@ -161,7 +159,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects // Sharpening pass _pipeline.SetProgram(_sharpeningProgram); _pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, _intermediaryTexture, _sampler); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(4, sharpeningBuffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(4, sharpeningBuffer.Range)]); _pipeline.SetImage(0, destinationTexture); _pipeline.DispatchCompute(dispatchX, dispatchY, 1); _pipeline.ComputeBarrier(); diff --git a/src/Ryujinx.Graphics.Vulkan/Effects/FxaaPostProcessingEffect.cs b/src/Ryujinx.Graphics.Vulkan/Effects/FxaaPostProcessingEffect.cs index 26314b7bf..e57018624 100644 --- a/src/Ryujinx.Graphics.Vulkan/Effects/FxaaPostProcessingEffect.cs +++ b/src/Ryujinx.Graphics.Vulkan/Effects/FxaaPostProcessingEffect.cs @@ -37,19 +37,18 @@ namespace Ryujinx.Graphics.Vulkan.Effects { _pipeline.Initialize(); - var shader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/Fxaa.spv"); + byte[] shader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/Fxaa.spv"); - var resourceLayout = new ResourceLayoutBuilder() + ResourceLayout resourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) .Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1) .Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build(); _samplerLinear = _renderer.CreateSampler(SamplerCreateInfo.Create(MinFilter.Linear, MagFilter.Linear)); - _shaderProgram = _renderer.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(shader, ShaderStage.Compute, TargetLanguage.Spirv), - }, resourceLayout); + _shaderProgram = _renderer.CreateProgramWithMinimalLayout([ + new ShaderSource(shader, ShaderStage.Compute, TargetLanguage.Spirv) + ], resourceLayout); } public TextureView Run(TextureView view, CommandBufferScoped cbs, int width, int height) @@ -64,16 +63,16 @@ namespace Ryujinx.Graphics.Vulkan.Effects _pipeline.SetProgram(_shaderProgram); _pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, view, _samplerLinear); - ReadOnlySpan resolutionBuffer = stackalloc float[] { view.Width, view.Height }; + ReadOnlySpan resolutionBuffer = [view.Width, view.Height]; int rangeSize = resolutionBuffer.Length * sizeof(float); - using var buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize); + using ScopedTemporaryBuffer buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize); buffer.Holder.SetDataUnchecked(buffer.Offset, resolutionBuffer); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(2, buffer.Range)]); - var dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize); - var dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize); + int dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize); + int dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize); _pipeline.SetImage(ShaderStage.Compute, 0, _texture.GetView(FormatTable.ConvertRgba8SrgbToUnorm(view.Info.Format))); _pipeline.DispatchCompute(dispatchX, dispatchY, 1); diff --git a/src/Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs b/src/Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs index a8e68f429..968e800cf 100644 --- a/src/Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs +++ b/src/Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs @@ -1,4 +1,5 @@ using Ryujinx.Common; +using Ryujinx.Common.Memory; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Shader; using Ryujinx.Graphics.Shader.Translation; @@ -74,23 +75,23 @@ namespace Ryujinx.Graphics.Vulkan.Effects _pipeline.Initialize(); - var edgeShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaEdge.spv"); - var blendShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaBlend.spv"); - var neighbourShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaNeighbour.spv"); + byte[] edgeShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaEdge.spv"); + byte[] blendShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaBlend.spv"); + byte[] neighbourShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaNeighbour.spv"); - var edgeResourceLayout = new ResourceLayoutBuilder() + ResourceLayout edgeResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) .Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1) .Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build(); - var blendResourceLayout = new ResourceLayoutBuilder() + ResourceLayout blendResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) .Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1) .Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 3) .Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 4) .Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build(); - var neighbourResourceLayout = new ResourceLayoutBuilder() + ResourceLayout neighbourResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) .Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 1) .Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 3) @@ -108,7 +109,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects QualityUltra = Quality == 3 ? 1 : 0, }; - var specInfo = new SpecDescription( + SpecDescription specInfo = new( (0, SpecConstType.Int32), (1, SpecConstType.Int32), (2, SpecConstType.Int32), @@ -116,20 +117,17 @@ namespace Ryujinx.Graphics.Vulkan.Effects (4, SpecConstType.Float32), (5, SpecConstType.Float32)); - _edgeProgram = _renderer.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(edgeShader, ShaderStage.Compute, TargetLanguage.Spirv), - }, edgeResourceLayout, new[] { specInfo }); + _edgeProgram = _renderer.CreateProgramWithMinimalLayout([ + new ShaderSource(edgeShader, ShaderStage.Compute, TargetLanguage.Spirv) + ], edgeResourceLayout, [specInfo]); - _blendProgram = _renderer.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(blendShader, ShaderStage.Compute, TargetLanguage.Spirv), - }, blendResourceLayout, new[] { specInfo }); + _blendProgram = _renderer.CreateProgramWithMinimalLayout([ + new ShaderSource(blendShader, ShaderStage.Compute, TargetLanguage.Spirv) + ], blendResourceLayout, [specInfo]); - _neighbourProgram = _renderer.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(neighbourShader, ShaderStage.Compute, TargetLanguage.Spirv), - }, neighbourResourceLayout, new[] { specInfo }); + _neighbourProgram = _renderer.CreateProgramWithMinimalLayout([ + new ShaderSource(neighbourShader, ShaderStage.Compute, TargetLanguage.Spirv) + ], neighbourResourceLayout, [specInfo]); } public void DeletePipelines() @@ -142,7 +140,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects private void Initialize() { - var areaInfo = new TextureCreateInfo(AreaWidth, + TextureCreateInfo areaInfo = new(AreaWidth, AreaHeight, 1, 1, @@ -158,7 +156,7 @@ namespace Ryujinx.Graphics.Vulkan.Effects SwizzleComponent.Blue, SwizzleComponent.Alpha); - var searchInfo = new TextureCreateInfo(SearchWidth, + TextureCreateInfo searchInfo = new(SearchWidth, SearchHeight, 1, 1, @@ -174,8 +172,8 @@ namespace Ryujinx.Graphics.Vulkan.Effects SwizzleComponent.Blue, SwizzleComponent.Alpha); - var areaTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaAreaTexture.bin"); - var searchTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaSearchTexture.bin"); + MemoryOwner areaTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaAreaTexture.bin"); + MemoryOwner searchTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaSearchTexture.bin"); _areaTexture = _renderer.CreateTexture(areaInfo) as TextureView; _searchTexture = _renderer.CreateTexture(searchInfo) as TextureView; @@ -205,20 +203,20 @@ namespace Ryujinx.Graphics.Vulkan.Effects _renderer.Pipeline.TextureBarrier(); - var dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize); - var dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize); + int dispatchX = BitUtils.DivRoundUp(view.Width, IPostProcessingEffect.LocalGroupSize); + int dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize); // Edge pass _pipeline.SetProgram(_edgeProgram); _pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, view, _samplerLinear); _pipeline.Specialize(_specConstants); - ReadOnlySpan resolutionBuffer = stackalloc float[] { view.Width, view.Height }; + ReadOnlySpan resolutionBuffer = [view.Width, view.Height]; int rangeSize = resolutionBuffer.Length * sizeof(float); - using var buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize); + using ScopedTemporaryBuffer buffer = _renderer.BufferManager.ReserveOrCreate(_renderer, cbs, rangeSize); buffer.Holder.SetDataUnchecked(buffer.Offset, resolutionBuffer); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(2, buffer.Range)]); _pipeline.SetImage(ShaderStage.Compute, 0, _edgeOutputTexture.GetView(FormatTable.ConvertRgba8SrgbToUnorm(view.Info.Format))); _pipeline.DispatchCompute(dispatchX, dispatchY, 1); _pipeline.ComputeBarrier(); diff --git a/src/Ryujinx.Graphics.Vulkan/FenceHelper.cs b/src/Ryujinx.Graphics.Vulkan/FenceHelper.cs index 6649af7f5..9d682bab2 100644 --- a/src/Ryujinx.Graphics.Vulkan/FenceHelper.cs +++ b/src/Ryujinx.Graphics.Vulkan/FenceHelper.cs @@ -24,6 +24,7 @@ namespace Ryujinx.Graphics.Vulkan { // Keep waiting while the fence is not signaled. } + result.ThrowOnError(); } } diff --git a/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs b/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs index 0cdb93f20..63737f355 100644 --- a/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs +++ b/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs @@ -20,7 +20,7 @@ namespace Ryujinx.Graphics.Vulkan _device = device; _concurrentWaitUnsupported = concurrentWaitUnsupported; - var fenceCreateInfo = new FenceCreateInfo + FenceCreateInfo fenceCreateInfo = new() { SType = StructureType.FenceCreateInfo, }; @@ -110,7 +110,7 @@ namespace Ryujinx.Graphics.Vulkan try { - FenceHelper.WaitAllIndefinitely(_api, _device, stackalloc Fence[] { _fence }); + FenceHelper.WaitAllIndefinitely(_api, _device, [_fence]); } finally { @@ -119,7 +119,7 @@ namespace Ryujinx.Graphics.Vulkan } else { - FenceHelper.WaitAllIndefinitely(_api, _device, stackalloc Fence[] { _fence }); + FenceHelper.WaitAllIndefinitely(_api, _device, [_fence]); } } @@ -134,7 +134,7 @@ namespace Ryujinx.Graphics.Vulkan try { - return FenceHelper.AllSignaled(_api, _device, stackalloc Fence[] { _fence }); + return FenceHelper.AllSignaled(_api, _device, [_fence]); } finally { @@ -143,7 +143,7 @@ namespace Ryujinx.Graphics.Vulkan } else { - return FenceHelper.AllSignaled(_api, _device, stackalloc Fence[] { _fence }); + return FenceHelper.AllSignaled(_api, _device, [_fence]); } } diff --git a/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs b/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs index 9ea8cec4b..0657638c9 100644 --- a/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs +++ b/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs @@ -9,7 +9,8 @@ namespace Ryujinx.Graphics.Vulkan { class FormatCapabilities { - private static readonly GAL.Format[] _scaledFormats = { + private static readonly GAL.Format[] _scaledFormats = + [ GAL.Format.R8Uscaled, GAL.Format.R8Sscaled, GAL.Format.R16Uscaled, @@ -27,10 +28,11 @@ namespace Ryujinx.Graphics.Vulkan GAL.Format.R16G16B16A16Uscaled, GAL.Format.R16G16B16A16Sscaled, GAL.Format.R10G10B10A2Uscaled, - GAL.Format.R10G10B10A2Sscaled, - }; + GAL.Format.R10G10B10A2Sscaled + ]; - private static readonly GAL.Format[] _intFormats = { + private static readonly GAL.Format[] _intFormats = + [ GAL.Format.R8Uint, GAL.Format.R8Sint, GAL.Format.R16Uint, @@ -48,8 +50,8 @@ namespace Ryujinx.Graphics.Vulkan GAL.Format.R16G16B16A16Uint, GAL.Format.R16G16B16A16Sint, GAL.Format.R10G10B10A2Uint, - GAL.Format.R10G10B10A2Sint, - }; + GAL.Format.R10G10B10A2Sint + ]; private readonly FormatFeatureFlags[] _bufferTable; private readonly FormatFeatureFlags[] _optimalTable; @@ -62,13 +64,13 @@ namespace Ryujinx.Graphics.Vulkan _api = api; _physicalDevice = physicalDevice; - int totalFormats = Enum.GetNames(typeof(Format)).Length; + int totalFormats = Enum.GetNames().Length; _bufferTable = new FormatFeatureFlags[totalFormats]; _optimalTable = new FormatFeatureFlags[totalFormats]; } - public bool BufferFormatsSupport(FormatFeatureFlags flags, params Format[] formats) + public bool BufferFormatsSupport(FormatFeatureFlags flags, params ReadOnlySpan formats) { foreach (Format format in formats) { @@ -81,7 +83,7 @@ namespace Ryujinx.Graphics.Vulkan return true; } - public bool OptimalFormatsSupport(FormatFeatureFlags flags, params Format[] formats) + public bool OptimalFormatsSupport(FormatFeatureFlags flags, params ReadOnlySpan formats) { foreach (Format format in formats) { @@ -96,11 +98,11 @@ namespace Ryujinx.Graphics.Vulkan public bool BufferFormatSupports(FormatFeatureFlags flags, Format format) { - var formatFeatureFlags = _bufferTable[(int)format]; + FormatFeatureFlags formatFeatureFlags = _bufferTable[(int)format]; if (formatFeatureFlags == 0) { - _api.GetPhysicalDeviceFormatProperties(_physicalDevice, FormatTable.GetFormat(format), out var fp); + _api.GetPhysicalDeviceFormatProperties(_physicalDevice, FormatTable.GetFormat(format), out FormatProperties fp); formatFeatureFlags = fp.BufferFeatures; _bufferTable[(int)format] = formatFeatureFlags; } @@ -129,18 +131,18 @@ namespace Ryujinx.Graphics.Vulkan public bool BufferFormatSupports(FormatFeatureFlags flags, VkFormat format) { - _api.GetPhysicalDeviceFormatProperties(_physicalDevice, format, out var fp); + _api.GetPhysicalDeviceFormatProperties(_physicalDevice, format, out FormatProperties fp); return (fp.BufferFeatures & flags) == flags; } public bool OptimalFormatSupports(FormatFeatureFlags flags, Format format) { - var formatFeatureFlags = _optimalTable[(int)format]; + FormatFeatureFlags formatFeatureFlags = _optimalTable[(int)format]; if (formatFeatureFlags == 0) { - _api.GetPhysicalDeviceFormatProperties(_physicalDevice, FormatTable.GetFormat(format), out var fp); + _api.GetPhysicalDeviceFormatProperties(_physicalDevice, FormatTable.GetFormat(format), out FormatProperties fp); formatFeatureFlags = fp.OptimalTilingFeatures; _optimalTable[(int)format] = formatFeatureFlags; } @@ -148,13 +150,13 @@ namespace Ryujinx.Graphics.Vulkan return (formatFeatureFlags & flags) == flags; } - public VkFormat ConvertToVkFormat(Format srcFormat) + public VkFormat ConvertToVkFormat(Format srcFormat, bool storageFeatureFlagRequired) { - var format = FormatTable.GetFormat(srcFormat); + VkFormat format = FormatTable.GetFormat(srcFormat); - var requiredFeatures = FormatFeatureFlags.SampledImageBit | - FormatFeatureFlags.TransferSrcBit | - FormatFeatureFlags.TransferDstBit; + FormatFeatureFlags requiredFeatures = FormatFeatureFlags.SampledImageBit | + FormatFeatureFlags.TransferSrcBit | + FormatFeatureFlags.TransferDstBit; if (srcFormat.IsDepthOrStencil()) { @@ -165,7 +167,7 @@ namespace Ryujinx.Graphics.Vulkan requiredFeatures |= FormatFeatureFlags.ColorAttachmentBit; } - if (srcFormat.IsImageCompatible()) + if (srcFormat.IsImageCompatible() && storageFeatureFlagRequired) { requiredFeatures |= FormatFeatureFlags.StorageImageBit; } @@ -192,7 +194,7 @@ namespace Ryujinx.Graphics.Vulkan public VkFormat ConvertToVertexVkFormat(Format srcFormat) { - var format = FormatTable.GetFormat(srcFormat); + VkFormat format = FormatTable.GetFormat(srcFormat); if (!BufferFormatSupports(FormatFeatureFlags.VertexBufferBit, srcFormat) || (IsRGB16IntFloat(srcFormat) && VulkanConfiguration.ForceRGB16IntFloatUnsupported)) @@ -220,14 +222,14 @@ namespace Ryujinx.Graphics.Vulkan public static bool IsD24S8(Format format) { - return format == Format.D24UnormS8Uint || format == Format.S8UintD24Unorm || format == Format.X8UintD24Unorm; + return format is Format.D24UnormS8Uint or Format.S8UintD24Unorm or Format.X8UintD24Unorm; } private static bool IsRGB16IntFloat(Format format) { - return format == Format.R16G16B16Float || - format == Format.R16G16B16Sint || - format == Format.R16G16B16Uint; + return format is Format.R16G16B16Float or + Format.R16G16B16Sint or + Format.R16G16B16Uint; } } } diff --git a/src/Ryujinx.Graphics.Vulkan/FormatTable.cs b/src/Ryujinx.Graphics.Vulkan/FormatTable.cs index 98796d9bf..305224cad 100644 --- a/src/Ryujinx.Graphics.Vulkan/FormatTable.cs +++ b/src/Ryujinx.Graphics.Vulkan/FormatTable.cs @@ -12,7 +12,7 @@ namespace Ryujinx.Graphics.Vulkan static FormatTable() { - _table = new VkFormat[Enum.GetNames(typeof(Format)).Length]; + _table = new VkFormat[Enum.GetNames().Length]; _reverseMap = new Dictionary(); #pragma warning disable IDE0055 // Disable formatting diff --git a/src/Ryujinx.Graphics.Vulkan/FramebufferParams.cs b/src/Ryujinx.Graphics.Vulkan/FramebufferParams.cs index 8d80e9d05..a2384c08e 100644 --- a/src/Ryujinx.Graphics.Vulkan/FramebufferParams.cs +++ b/src/Ryujinx.Graphics.Vulkan/FramebufferParams.cs @@ -2,6 +2,7 @@ using Ryujinx.Graphics.GAL; using Silk.NET.Vulkan; using System; using System.Linq; +using Format = Ryujinx.Graphics.GAL.Format; using VkFormat = Silk.NET.Vulkan.Format; namespace Ryujinx.Graphics.Vulkan @@ -33,12 +34,12 @@ namespace Ryujinx.Graphics.Vulkan public FramebufferParams(Device device, TextureView view, uint width, uint height) { - var format = view.Info.Format; + Format format = view.Info.Format; bool isDepthStencil = format.IsDepthOrStencil(); _device = device; - _attachments = new[] { view.GetImageViewForAttachment() }; + _attachments = [view.GetImageViewForAttachment()]; _validColorAttachments = isDepthStencil ? 0u : 1u; _baseAttachment = view; @@ -48,7 +49,7 @@ namespace Ryujinx.Graphics.Vulkan } else { - _colors = new TextureView[] { view }; + _colors = [view]; _colorsCanonical = _colors; } @@ -56,9 +57,9 @@ namespace Ryujinx.Graphics.Vulkan Height = height; Layers = 1; - AttachmentSamples = new[] { (uint)view.Info.Samples }; - AttachmentFormats = new[] { view.VkFormat }; - AttachmentIndices = isDepthStencil ? Array.Empty() : new[] { 0 }; + AttachmentSamples = [(uint)view.Info.Samples]; + AttachmentFormats = [view.VkFormat]; + AttachmentIndices = isDepthStencil ? [] : [0]; AttachmentIntegerFormatMask = format.IsInteger() ? 1u : 0u; LogicOpsAllowed = !format.IsFloatOrSrgb(); @@ -96,7 +97,7 @@ namespace Ryujinx.Graphics.Vulkan { if (IsValidTextureView(color)) { - var texture = (TextureView)color; + TextureView texture = (TextureView)color; _attachments[index] = texture.GetImageViewForAttachment(); _colors[index] = texture; @@ -107,7 +108,7 @@ namespace Ryujinx.Graphics.Vulkan AttachmentFormats[index] = texture.VkFormat; AttachmentIndices[index] = bindIndex; - var format = texture.Info.Format; + Format format = texture.Info.Format; if (format.IsInteger()) { @@ -184,7 +185,7 @@ namespace Ryujinx.Graphics.Vulkan { if (_colors != null && (uint)index < _colors.Length) { - var format = _colors[index].Info.Format; + Format format = _colors[index].Info.Format; if (format.IsSint()) { @@ -239,7 +240,7 @@ namespace Ryujinx.Graphics.Vulkan attachments[i] = _attachments[i].Get(cbs).Value; } - var framebufferCreateInfo = new FramebufferCreateInfo + FramebufferCreateInfo framebufferCreateInfo = new() { SType = StructureType.FramebufferCreateInfo, RenderPass = renderPass.Get(cbs).Value, @@ -250,13 +251,13 @@ namespace Ryujinx.Graphics.Vulkan Layers = Layers, }; - api.CreateFramebuffer(_device, in framebufferCreateInfo, null, out var framebuffer).ThrowOnError(); + api.CreateFramebuffer(_device, in framebufferCreateInfo, null, out Framebuffer framebuffer).ThrowOnError(); return new Auto(new DisposableFramebuffer(api, _device, framebuffer), null, _attachments); } public TextureView[] GetAttachmentViews() { - var result = new TextureView[_attachments.Length]; + TextureView[] result = new TextureView[_attachments.Length]; _colors?.CopyTo(result, 0); @@ -277,7 +278,7 @@ namespace Ryujinx.Graphics.Vulkan { if (_colors != null) { - foreach (var color in _colors) + foreach (TextureView color in _colors) { // If Clear or DontCare were used, this would need to be write bit. color.Storage?.QueueLoadOpBarrier(cbs, false); @@ -293,7 +294,7 @@ namespace Ryujinx.Graphics.Vulkan { if (_colors != null) { - foreach (var color in _colors) + foreach (TextureView color in _colors) { color.Storage?.AddStoreOpUsage(false); } diff --git a/src/Ryujinx.Graphics.Vulkan/HashTableSlim.cs b/src/Ryujinx.Graphics.Vulkan/HashTableSlim.cs index 3796e3c52..c811907e5 100644 --- a/src/Ryujinx.Graphics.Vulkan/HashTableSlim.cs +++ b/src/Ryujinx.Graphics.Vulkan/HashTableSlim.cs @@ -65,7 +65,7 @@ namespace Ryujinx.Graphics.Vulkan public void Add(ref TKey key, TValue value) { - var entry = new Entry + Entry entry = new() { Hash = key.GetHashCode(), Key = key, @@ -75,7 +75,7 @@ namespace Ryujinx.Graphics.Vulkan int hashCode = key.GetHashCode(); int bucketIndex = hashCode & TotalBucketsMask; - ref var bucket = ref _hashTable[bucketIndex]; + ref Bucket bucket = ref _hashTable[bucketIndex]; if (bucket.Entries != null) { int index = bucket.Length; @@ -89,10 +89,10 @@ namespace Ryujinx.Graphics.Vulkan } else { - bucket.Entries = new[] - { - entry, - }; + bucket.Entries = + [ + entry + ]; } bucket.Length++; @@ -102,11 +102,11 @@ namespace Ryujinx.Graphics.Vulkan { int hashCode = key.GetHashCode(); - ref var bucket = ref _hashTable[hashCode & TotalBucketsMask]; - var entries = bucket.AsSpan(); + ref Bucket bucket = ref _hashTable[hashCode & TotalBucketsMask]; + Span entries = bucket.AsSpan(); for (int i = 0; i < entries.Length; i++) { - ref var entry = ref entries[i]; + ref Entry entry = ref entries[i]; if (entry.Hash == hashCode && entry.Key.Equals(ref key)) { @@ -124,10 +124,10 @@ namespace Ryujinx.Graphics.Vulkan { int hashCode = key.GetHashCode(); - var entries = _hashTable[hashCode & TotalBucketsMask].AsSpan(); + Span entries = _hashTable[hashCode & TotalBucketsMask].AsSpan(); for (int i = 0; i < entries.Length; i++) { - ref var entry = ref entries[i]; + ref Entry entry = ref entries[i]; if (entry.Hash == hashCode && entry.Key.Equals(ref key)) { diff --git a/src/Ryujinx.Graphics.Vulkan/HelperShader.cs b/src/Ryujinx.Graphics.Vulkan/HelperShader.cs index b7c42aff0..695046198 100644 --- a/src/Ryujinx.Graphics.Vulkan/HelperShader.cs +++ b/src/Ryujinx.Graphics.Vulkan/HelperShader.cs @@ -6,6 +6,7 @@ using Silk.NET.Vulkan; using System; using System.Collections.Generic; using System.Numerics; +using Buffer = Silk.NET.Vulkan.Buffer; using CompareOp = Ryujinx.Graphics.GAL.CompareOp; using Format = Ryujinx.Graphics.GAL.Format; using PrimitiveTopology = Ryujinx.Graphics.GAL.PrimitiveTopology; @@ -32,29 +33,29 @@ namespace Ryujinx.Graphics.Vulkan private readonly PipelineHelperShader _pipeline; private readonly ISampler _samplerLinear; private readonly ISampler _samplerNearest; - private readonly IProgram _programColorBlit; - private readonly IProgram _programColorBlitMs; - private readonly IProgram _programColorBlitClearAlpha; - private readonly IProgram _programColorClearF; - private readonly IProgram _programColorClearSI; - private readonly IProgram _programColorClearUI; - private readonly IProgram _programDepthStencilClear; - private readonly IProgram _programStrideChange; - private readonly IProgram _programConvertD32S8ToD24S8; - private readonly IProgram _programConvertIndexBuffer; - private readonly IProgram _programConvertIndirectData; - private readonly IProgram _programColorCopyShortening; - private readonly IProgram _programColorCopyToNonMs; - private readonly IProgram _programColorCopyWidening; - private readonly IProgram _programColorDrawToMs; - private readonly IProgram _programDepthBlit; - private readonly IProgram _programDepthBlitMs; - private readonly IProgram _programDepthDrawToMs; - private readonly IProgram _programDepthDrawToNonMs; - private readonly IProgram _programStencilBlit; - private readonly IProgram _programStencilBlitMs; - private readonly IProgram _programStencilDrawToMs; - private readonly IProgram _programStencilDrawToNonMs; + private readonly ShaderCollection _programColorBlit; + private readonly ShaderCollection _programColorBlitMs; + private readonly ShaderCollection _programColorBlitClearAlpha; + private readonly ShaderCollection _programColorClearF; + private readonly ShaderCollection _programColorClearSI; + private readonly ShaderCollection _programColorClearUI; + private readonly ShaderCollection _programDepthStencilClear; + private readonly ShaderCollection _programStrideChange; + private readonly ShaderCollection _programConvertD32S8ToD24S8; + private readonly ShaderCollection _programConvertIndexBuffer; + private readonly ShaderCollection _programConvertIndirectData; + private readonly ShaderCollection _programColorCopyShortening; + private readonly ShaderCollection _programColorCopyToNonMs; + private readonly ShaderCollection _programColorCopyWidening; + private readonly ShaderCollection _programColorDrawToMs; + private readonly ShaderCollection _programDepthBlit; + private readonly ShaderCollection _programDepthBlitMs; + private readonly ShaderCollection _programDepthDrawToMs; + private readonly ShaderCollection _programDepthDrawToNonMs; + private readonly ShaderCollection _programStencilBlit; + private readonly ShaderCollection _programStencilBlitMs; + private readonly ShaderCollection _programStencilDrawToMs; + private readonly ShaderCollection _programStencilDrawToNonMs; public HelperShader(VulkanRenderer gd, Device device) { @@ -64,174 +65,151 @@ namespace Ryujinx.Graphics.Vulkan _samplerLinear = gd.CreateSampler(SamplerCreateInfo.Create(MinFilter.Linear, MagFilter.Linear)); _samplerNearest = gd.CreateSampler(SamplerCreateInfo.Create(MinFilter.Nearest, MagFilter.Nearest)); - var blitResourceLayout = new ResourceLayoutBuilder() + ResourceLayout blitResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Vertex, ResourceType.UniformBuffer, 1) .Add(ResourceStages.Fragment, ResourceType.TextureAndSampler, 0).Build(); - _programColorBlit = gd.CreateProgramWithMinimalLayout(new[] - { + _programColorBlit = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorBlitVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("ColorBlitFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, blitResourceLayout); + new ShaderSource(ReadSpirv("ColorBlitFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], blitResourceLayout); - _programColorBlitMs = gd.CreateProgramWithMinimalLayout(new[] - { + _programColorBlitMs = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorBlitVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("ColorBlitMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, blitResourceLayout); + new ShaderSource(ReadSpirv("ColorBlitMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], blitResourceLayout); - _programColorBlitClearAlpha = gd.CreateProgramWithMinimalLayout(new[] - { + _programColorBlitClearAlpha = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorBlitVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("ColorBlitClearAlphaFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, blitResourceLayout); + new ShaderSource(ReadSpirv("ColorBlitClearAlphaFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], blitResourceLayout); - var colorClearResourceLayout = new ResourceLayoutBuilder().Add(ResourceStages.Vertex, ResourceType.UniformBuffer, 1).Build(); + ResourceLayout colorClearResourceLayout = new ResourceLayoutBuilder().Add(ResourceStages.Vertex, ResourceType.UniformBuffer, 1).Build(); - _programColorClearF = gd.CreateProgramWithMinimalLayout(new[] - { + _programColorClearF = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorClearVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("ColorClearFFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, colorClearResourceLayout); + new ShaderSource(ReadSpirv("ColorClearFFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], colorClearResourceLayout); - _programColorClearSI = gd.CreateProgramWithMinimalLayout(new[] - { + _programColorClearSI = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorClearVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("ColorClearSIFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, colorClearResourceLayout); + new ShaderSource(ReadSpirv("ColorClearSIFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], colorClearResourceLayout); - _programColorClearUI = gd.CreateProgramWithMinimalLayout(new[] - { + _programColorClearUI = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorClearVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("ColorClearUIFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, colorClearResourceLayout); + new ShaderSource(ReadSpirv("ColorClearUIFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], colorClearResourceLayout); - _programDepthStencilClear = gd.CreateProgramWithMinimalLayout(new[] - { + _programDepthStencilClear = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorClearVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("DepthStencilClearFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, colorClearResourceLayout); + new ShaderSource(ReadSpirv("DepthStencilClearFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], colorClearResourceLayout); - var strideChangeResourceLayout = new ResourceLayoutBuilder() + ResourceLayout strideChangeResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 0) .Add(ResourceStages.Compute, ResourceType.StorageBuffer, 1) .Add(ResourceStages.Compute, ResourceType.StorageBuffer, 2, true).Build(); - _programStrideChange = gd.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(ReadSpirv("ChangeBufferStride.spv"), ShaderStage.Compute, TargetLanguage.Spirv), - }, strideChangeResourceLayout); + _programStrideChange = gd.CreateProgramWithMinimalLayout([ + new ShaderSource(ReadSpirv("ChangeBufferStride.spv"), ShaderStage.Compute, TargetLanguage.Spirv) + ], strideChangeResourceLayout); - var colorCopyResourceLayout = new ResourceLayoutBuilder() + ResourceLayout colorCopyResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 0) .Add(ResourceStages.Compute, ResourceType.TextureAndSampler, 0) .Add(ResourceStages.Compute, ResourceType.Image, 0, true).Build(); - _programColorCopyShortening = gd.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(ReadSpirv("ColorCopyShorteningCompute.spv"), ShaderStage.Compute, TargetLanguage.Spirv), - }, colorCopyResourceLayout); + _programColorCopyShortening = gd.CreateProgramWithMinimalLayout([ + new ShaderSource(ReadSpirv("ColorCopyShorteningCompute.spv"), ShaderStage.Compute, TargetLanguage.Spirv) + ], colorCopyResourceLayout); - _programColorCopyToNonMs = gd.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(ReadSpirv("ColorCopyToNonMsCompute.spv"), ShaderStage.Compute, TargetLanguage.Spirv), - }, colorCopyResourceLayout); + _programColorCopyToNonMs = gd.CreateProgramWithMinimalLayout([ + new ShaderSource(ReadSpirv("ColorCopyToNonMsCompute.spv"), ShaderStage.Compute, TargetLanguage.Spirv) + ], colorCopyResourceLayout); - _programColorCopyWidening = gd.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(ReadSpirv("ColorCopyWideningCompute.spv"), ShaderStage.Compute, TargetLanguage.Spirv), - }, colorCopyResourceLayout); + _programColorCopyWidening = gd.CreateProgramWithMinimalLayout([ + new ShaderSource(ReadSpirv("ColorCopyWideningCompute.spv"), ShaderStage.Compute, TargetLanguage.Spirv) + ], colorCopyResourceLayout); - var colorDrawToMsResourceLayout = new ResourceLayoutBuilder() + ResourceLayout colorDrawToMsResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Fragment, ResourceType.UniformBuffer, 0) .Add(ResourceStages.Fragment, ResourceType.TextureAndSampler, 0).Build(); - _programColorDrawToMs = gd.CreateProgramWithMinimalLayout(new[] - { + _programColorDrawToMs = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorDrawToMsVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("ColorDrawToMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, colorDrawToMsResourceLayout); + new ShaderSource(ReadSpirv("ColorDrawToMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], colorDrawToMsResourceLayout); - var convertD32S8ToD24S8ResourceLayout = new ResourceLayoutBuilder() + ResourceLayout convertD32S8ToD24S8ResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 0) .Add(ResourceStages.Compute, ResourceType.StorageBuffer, 1) .Add(ResourceStages.Compute, ResourceType.StorageBuffer, 2, true).Build(); - _programConvertD32S8ToD24S8 = gd.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(ReadSpirv("ConvertD32S8ToD24S8.spv"), ShaderStage.Compute, TargetLanguage.Spirv), - }, convertD32S8ToD24S8ResourceLayout); + _programConvertD32S8ToD24S8 = gd.CreateProgramWithMinimalLayout([ + new ShaderSource(ReadSpirv("ConvertD32S8ToD24S8.spv"), ShaderStage.Compute, TargetLanguage.Spirv) + ], convertD32S8ToD24S8ResourceLayout); - var convertIndexBufferResourceLayout = new ResourceLayoutBuilder() + ResourceLayout convertIndexBufferResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 0) .Add(ResourceStages.Compute, ResourceType.StorageBuffer, 1) .Add(ResourceStages.Compute, ResourceType.StorageBuffer, 2, true).Build(); - _programConvertIndexBuffer = gd.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(ReadSpirv("ConvertIndexBuffer.spv"), ShaderStage.Compute, TargetLanguage.Spirv), - }, convertIndexBufferResourceLayout); + _programConvertIndexBuffer = gd.CreateProgramWithMinimalLayout([ + new ShaderSource(ReadSpirv("ConvertIndexBuffer.spv"), ShaderStage.Compute, TargetLanguage.Spirv) + ], convertIndexBufferResourceLayout); - var convertIndirectDataResourceLayout = new ResourceLayoutBuilder() + ResourceLayout convertIndirectDataResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 0) .Add(ResourceStages.Compute, ResourceType.StorageBuffer, 1) .Add(ResourceStages.Compute, ResourceType.StorageBuffer, 2, true) .Add(ResourceStages.Compute, ResourceType.StorageBuffer, 3).Build(); - _programConvertIndirectData = gd.CreateProgramWithMinimalLayout(new[] - { - new ShaderSource(ReadSpirv("ConvertIndirectData.spv"), ShaderStage.Compute, TargetLanguage.Spirv), - }, convertIndirectDataResourceLayout); + _programConvertIndirectData = gd.CreateProgramWithMinimalLayout([ + new ShaderSource(ReadSpirv("ConvertIndirectData.spv"), ShaderStage.Compute, TargetLanguage.Spirv) + ], convertIndirectDataResourceLayout); - _programDepthBlit = gd.CreateProgramWithMinimalLayout(new[] - { + _programDepthBlit = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorBlitVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("DepthBlitFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, blitResourceLayout); + new ShaderSource(ReadSpirv("DepthBlitFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], blitResourceLayout); - _programDepthBlitMs = gd.CreateProgramWithMinimalLayout(new[] - { + _programDepthBlitMs = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorBlitVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("DepthBlitMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, blitResourceLayout); + new ShaderSource(ReadSpirv("DepthBlitMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], blitResourceLayout); - _programDepthDrawToMs = gd.CreateProgramWithMinimalLayout(new[] - { + _programDepthDrawToMs = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorDrawToMsVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("DepthDrawToMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, colorDrawToMsResourceLayout); + new ShaderSource(ReadSpirv("DepthDrawToMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], colorDrawToMsResourceLayout); - _programDepthDrawToNonMs = gd.CreateProgramWithMinimalLayout(new[] - { + _programDepthDrawToNonMs = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorDrawToMsVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("DepthDrawToNonMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, colorDrawToMsResourceLayout); + new ShaderSource(ReadSpirv("DepthDrawToNonMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], colorDrawToMsResourceLayout); if (gd.Capabilities.SupportsShaderStencilExport) { - _programStencilBlit = gd.CreateProgramWithMinimalLayout(new[] - { + _programStencilBlit = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorBlitVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("StencilBlitFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, blitResourceLayout); + new ShaderSource(ReadSpirv("StencilBlitFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], blitResourceLayout); - _programStencilBlitMs = gd.CreateProgramWithMinimalLayout(new[] - { + _programStencilBlitMs = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorBlitVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("StencilBlitMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, blitResourceLayout); + new ShaderSource(ReadSpirv("StencilBlitMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], blitResourceLayout); - _programStencilDrawToMs = gd.CreateProgramWithMinimalLayout(new[] - { + _programStencilDrawToMs = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorDrawToMsVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("StencilDrawToMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, colorDrawToMsResourceLayout); + new ShaderSource(ReadSpirv("StencilDrawToMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], colorDrawToMsResourceLayout); - _programStencilDrawToNonMs = gd.CreateProgramWithMinimalLayout(new[] - { + _programStencilDrawToNonMs = gd.CreateProgramWithMinimalLayout([ new ShaderSource(ReadSpirv("ColorDrawToMsVertex.spv"), ShaderStage.Vertex, TargetLanguage.Spirv), - new ShaderSource(ReadSpirv("StencilDrawToNonMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv), - }, colorDrawToMsResourceLayout); + new ShaderSource(ReadSpirv("StencilDrawToNonMsFragment.spv"), ShaderStage.Fragment, TargetLanguage.Spirv) + ], colorDrawToMsResourceLayout); } } @@ -254,17 +232,17 @@ namespace Ryujinx.Graphics.Vulkan { gd.FlushAllCommands(); - using var cbs = gd.CommandBufferPool.Rent(); + using CommandBufferScoped cbs = gd.CommandBufferPool.Rent(); for (int l = 0; l < levels; l++) { - var mipSrcRegion = new Extents2D( + Extents2D mipSrcRegion = new( srcRegion.X1 >> l, srcRegion.Y1 >> l, srcRegion.X2 >> l, srcRegion.Y2 >> l); - var mipDstRegion = new Extents2D( + Extents2D mipDstRegion = new( dstRegion.X1 >> l, dstRegion.Y1 >> l, dstRegion.X2 >> l, @@ -272,8 +250,8 @@ namespace Ryujinx.Graphics.Vulkan for (int z = 0; z < layers; z++) { - var srcView = Create2DLayerView(src, z, l); - var dstView = Create2DLayerView(dst, z, l); + TextureView srcView = Create2DLayerView(src, z, l); + TextureView dstView = Create2DLayerView(dst, z, l); if (isDepthOrStencil) { @@ -334,7 +312,7 @@ namespace Ryujinx.Graphics.Vulkan int dstWidth = Math.Max(1, dst.Width >> mipDstLevel); int dstHeight = Math.Max(1, dst.Height >> mipDstLevel); - var extents = new Extents2D( + Extents2D extents = new( 0, 0, Math.Min(srcWidth, dstWidth), @@ -342,8 +320,8 @@ namespace Ryujinx.Graphics.Vulkan for (int z = 0; z < depth; z++) { - var srcView = Create2DLayerView(src, srcLayer + z, mipSrcLevel); - var dstView = Create2DLayerView(dst, dstLayer + z, mipDstLevel); + TextureView srcView = Create2DLayerView(src, srcLayer + z, mipSrcLevel); + TextureView dstView = Create2DLayerView(dst, dstLayer + z, mipDstLevel); BlitColor( gd, @@ -381,7 +359,7 @@ namespace Ryujinx.Graphics.Vulkan const int RegionBufferSize = 16; - var sampler = linearFilter ? _samplerLinear : _samplerNearest; + ISampler sampler = linearFilter ? _samplerLinear : _samplerNearest; _pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Fragment, 0, src, sampler); @@ -402,15 +380,15 @@ namespace Ryujinx.Graphics.Vulkan (region[2], region[3]) = (region[3], region[2]); } - using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, RegionBufferSize); + using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, RegionBufferSize); buffer.Holder.SetDataUnchecked(buffer.Offset, region); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(1, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(1, buffer.Range)]); Span viewports = stackalloc Viewport[1]; - var rect = new Rectangle( + Rectangle rect = new( MathF.Min(dstRegion.X1, dstRegion.X2), MathF.Min(dstRegion.Y1, dstRegion.Y2), MathF.Abs(dstRegion.X2 - dstRegion.X1), @@ -449,8 +427,8 @@ namespace Ryujinx.Graphics.Vulkan int dstHeight = dst.Height; _pipeline.SetRenderTarget(dst, (uint)dstWidth, (uint)dstHeight); - _pipeline.SetRenderTargetColorMasks(new uint[] { 0xf }); - _pipeline.SetScissors(stackalloc Rectangle[] { new Rectangle(0, 0, dstWidth, dstHeight) }); + _pipeline.SetRenderTargetColorMasks([0xf]); + _pipeline.SetScissors([new Rectangle(0, 0, dstWidth, dstHeight)]); if (clearAlpha) { @@ -498,15 +476,15 @@ namespace Ryujinx.Graphics.Vulkan (region[2], region[3]) = (region[3], region[2]); } - using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, RegionBufferSize); + using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, RegionBufferSize); buffer.Holder.SetDataUnchecked(buffer.Offset, region); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(1, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(1, buffer.Range)]); Span viewports = stackalloc Viewport[1]; - var rect = new Rectangle( + Rectangle rect = new( MathF.Min(dstRegion.X1, dstRegion.X2), MathF.Min(dstRegion.Y1, dstRegion.Y2), MathF.Abs(dstRegion.X2 - dstRegion.X1), @@ -525,15 +503,15 @@ namespace Ryujinx.Graphics.Vulkan int dstHeight = dst.Height; _pipeline.SetRenderTarget(dst, (uint)dstWidth, (uint)dstHeight); - _pipeline.SetScissors(stackalloc Rectangle[] { new Rectangle(0, 0, dstWidth, dstHeight) }); + _pipeline.SetScissors([new Rectangle(0, 0, dstWidth, dstHeight)]); _pipeline.SetViewports(viewports); _pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip); - var aspectFlags = src.Info.Format.ConvertAspectFlags(); + ImageAspectFlags aspectFlags = src.Info.Format.ConvertAspectFlags(); if (aspectFlags.HasFlag(ImageAspectFlags.DepthBit)) { - var depthTexture = CreateDepthOrStencilView(src, DepthStencilMode.Depth); + TextureView depthTexture = CreateDepthOrStencilView(src, DepthStencilMode.Depth); BlitDepthStencilDraw(depthTexture, isDepth: true); @@ -545,7 +523,7 @@ namespace Ryujinx.Graphics.Vulkan if (aspectFlags.HasFlag(ImageAspectFlags.StencilBit) && _programStencilBlit != null) { - var stencilTexture = CreateDepthOrStencilView(src, DepthStencilMode.Stencil); + TextureView stencilTexture = CreateDepthOrStencilView(src, DepthStencilMode.Stencil); BlitDepthStencilDraw(stencilTexture, isDepth: false); @@ -648,15 +626,15 @@ namespace Ryujinx.Graphics.Vulkan gd.FlushAllCommands(); - using var cbs = gd.CommandBufferPool.Rent(); + using CommandBufferScoped cbs = gd.CommandBufferPool.Rent(); _pipeline.SetCommandBuffer(cbs); - using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ClearColorBufferSize); + using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ClearColorBufferSize); buffer.Holder.SetDataUnchecked(buffer.Offset, clearColor); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(1, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(1, buffer.Range)]); Span viewports = stackalloc Viewport[1]; @@ -688,7 +666,7 @@ namespace Ryujinx.Graphics.Vulkan _pipeline.SetRenderTarget(dst, (uint)dstWidth, (uint)dstHeight); _pipeline.SetRenderTargetColorMasks(new[] { componentMask }); _pipeline.SetViewports(viewports); - _pipeline.SetScissors(stackalloc Rectangle[] { scissor }); + _pipeline.SetScissors([scissor]); _pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip); _pipeline.Draw(4, 1, 0, 0); _pipeline.Finish(); @@ -710,15 +688,15 @@ namespace Ryujinx.Graphics.Vulkan gd.FlushAllCommands(); - using var cbs = gd.CommandBufferPool.Rent(); + using CommandBufferScoped cbs = gd.CommandBufferPool.Rent(); _pipeline.SetCommandBuffer(cbs); - using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ClearColorBufferSize); + using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ClearColorBufferSize); - buffer.Holder.SetDataUnchecked(buffer.Offset, stackalloc float[] { depthValue }); + buffer.Holder.SetDataUnchecked(buffer.Offset, [depthValue]); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(1, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(1, buffer.Range)]); Span viewports = stackalloc Viewport[1]; @@ -734,7 +712,7 @@ namespace Ryujinx.Graphics.Vulkan _pipeline.SetProgram(_programDepthStencilClear); _pipeline.SetRenderTarget(dst, (uint)dstWidth, (uint)dstHeight); _pipeline.SetViewports(viewports); - _pipeline.SetScissors(stackalloc Rectangle[] { scissor }); + _pipeline.SetScissors([scissor]); _pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip); _pipeline.SetDepthTest(new DepthTestDescriptor(true, depthMask, CompareOp.Always)); _pipeline.SetStencilTest(CreateStencilTestDescriptor(stencilMask != 0, stencilValue, 0xff, stencilMask)); @@ -771,15 +749,15 @@ namespace Ryujinx.Graphics.Vulkan (region[2], region[3]) = (region[3], region[2]); } - var bufferHandle = gd.BufferManager.CreateWithHandle(gd, RegionBufferSize); + BufferHandle bufferHandle = gd.BufferManager.CreateWithHandle(gd, RegionBufferSize); gd.BufferManager.SetData(bufferHandle, 0, region); - pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(1, new BufferRange(bufferHandle, 0, RegionBufferSize)) }); + pipeline.SetUniformBuffers([new BufferAssignment(1, new BufferRange(bufferHandle, 0, RegionBufferSize))]); Span viewports = stackalloc Viewport[1]; - var rect = new Rectangle( + Rectangle rect = new( MathF.Min(dstRegion.X1, dstRegion.X2), MathF.Min(dstRegion.Y1, dstRegion.Y2), MathF.Abs(dstRegion.X2 - dstRegion.X1), @@ -814,14 +792,14 @@ namespace Ryujinx.Graphics.Vulkan int elems = size / stride; int newSize = elems * newStride; - var srcBufferAuto = src.GetBuffer(); - var dstBufferAuto = dst.GetBuffer(); + Auto srcBufferAuto = src.GetBuffer(); + Auto dstBufferAuto = dst.GetBuffer(); - var srcBuffer = srcBufferAuto.Get(cbs, srcOffset, size).Value; - var dstBuffer = dstBufferAuto.Get(cbs, 0, newSize).Value; + Buffer srcBuffer = srcBufferAuto.Get(cbs, srcOffset, size).Value; + Buffer dstBuffer = dstBufferAuto.Get(cbs, 0, newSize).Value; - var access = supportsUint8 ? AccessFlags.ShaderWriteBit : AccessFlags.TransferWriteBit; - var stage = supportsUint8 ? PipelineStageFlags.ComputeShaderBit : PipelineStageFlags.TransferBit; + AccessFlags access = supportsUint8 ? AccessFlags.ShaderWriteBit : AccessFlags.TransferWriteBit; + PipelineStageFlags stage = supportsUint8 ? PipelineStageFlags.ComputeShaderBit : PipelineStageFlags.TransferBit; BufferHolder.InsertBufferBarrier( gd, @@ -845,13 +823,13 @@ namespace Ryujinx.Graphics.Vulkan shaderParams[2] = size; shaderParams[3] = srcOffset; - using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); + using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); buffer.Holder.SetDataUnchecked(buffer.Offset, shaderParams); _pipeline.SetCommandBuffer(cbs); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(0, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(0, buffer.Range)]); Span> sbRanges = new Auto[2]; @@ -869,7 +847,7 @@ namespace Ryujinx.Graphics.Vulkan { gd.Api.CmdFillBuffer(cbs.CommandBuffer, dstBuffer, 0, Vk.WholeSize, 0); - var bufferCopy = new BufferCopy[elems]; + BufferCopy[] bufferCopy = new BufferCopy[elems]; for (ulong i = 0; i < (ulong)elems; i++) { @@ -896,57 +874,42 @@ namespace Ryujinx.Graphics.Vulkan public unsafe void ConvertIndexBuffer(VulkanRenderer gd, CommandBufferScoped cbs, - BufferHolder src, - BufferHolder dst, + BufferHolder srcIndexBuffer, + BufferHolder dstIndexBuffer, IndexBufferPattern pattern, int indexSize, int srcOffset, int indexCount) { // TODO: Support conversion with primitive restart enabled. - // TODO: Convert with a compute shader? + int primitiveCount = pattern.GetPrimitiveCount(indexCount); int convertedCount = pattern.GetConvertedCount(indexCount); int outputIndexSize = 4; + + Buffer dstBuffer = dstIndexBuffer.GetBuffer().Get(cbs, 0, convertedCount * outputIndexSize).Value; - var srcBuffer = src.GetBuffer().Get(cbs, srcOffset, indexCount * indexSize).Value; - var dstBuffer = dst.GetBuffer().Get(cbs, 0, convertedCount * outputIndexSize).Value; + const int ParamsBufferSize = 16 * sizeof(int); - gd.Api.CmdFillBuffer(cbs.CommandBuffer, dstBuffer, 0, Vk.WholeSize, 0); + Span shaderParams = stackalloc int[ParamsBufferSize / sizeof(int)]; - var bufferCopy = new List(); - int outputOffset = 0; + shaderParams[8] = pattern.PrimitiveVertices; + shaderParams[9] = pattern.PrimitiveVerticesOut; + shaderParams[10] = indexSize; + shaderParams[11] = outputIndexSize; + shaderParams[12] = pattern.BaseIndex; + shaderParams[13] = pattern.IndexStride; + shaderParams[14] = srcOffset; + shaderParams[15] = primitiveCount; - // Try to merge copies of adjacent indices to reduce copy count. - int sequenceStart = 0; - int sequenceLength = 0; + pattern.OffsetIndex.CopyTo(shaderParams[..pattern.OffsetIndex.Length]); - foreach (var index in pattern.GetIndexMapping(indexCount)) - { - if (sequenceLength > 0) - { - if (index == sequenceStart + sequenceLength && indexSize == outputIndexSize) - { - sequenceLength++; - continue; - } + using var patternScoped = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); + var patternBuffer = patternScoped.Holder; - // Commit the copy so far. - bufferCopy.Add(new BufferCopy((ulong)(srcOffset + sequenceStart * indexSize), (ulong)outputOffset, (ulong)(indexSize * sequenceLength))); - outputOffset += outputIndexSize * sequenceLength; - } + patternBuffer.SetDataUnchecked(patternScoped.Offset, shaderParams); - sequenceStart = index; - sequenceLength = 1; - } - - if (sequenceLength > 0) - { - // Commit final pending copy. - bufferCopy.Add(new BufferCopy((ulong)(srcOffset + sequenceStart * indexSize), (ulong)outputOffset, (ulong)(indexSize * sequenceLength))); - } - - var bufferCopyArray = bufferCopy.ToArray(); + _pipeline.SetCommandBuffer(cbs); BufferHolder.InsertBufferBarrier( gd, @@ -959,10 +922,11 @@ namespace Ryujinx.Graphics.Vulkan 0, convertedCount * outputIndexSize); - fixed (BufferCopy* pBufferCopy = bufferCopyArray) - { - gd.Api.CmdCopyBuffer(cbs.CommandBuffer, srcBuffer, dstBuffer, (uint)bufferCopyArray.Length, pBufferCopy); - } + _pipeline.SetUniformBuffers([new BufferAssignment(0, new BufferRange(patternScoped.Handle, patternScoped.Offset, ParamsBufferSize))]); + _pipeline.SetStorageBuffers(1, new[] { srcIndexBuffer.GetBuffer(), dstIndexBuffer.GetBuffer() }); + + _pipeline.SetProgram(_programConvertIndexBuffer); + _pipeline.DispatchCompute(BitUtils.DivRoundUp(primitiveCount, 16), 1, 1); BufferHolder.InsertBufferBarrier( gd, @@ -974,6 +938,8 @@ namespace Ryujinx.Graphics.Vulkan PipelineStageFlags.AllCommandsBit, 0, convertedCount * outputIndexSize); + + _pipeline.Finish(gd, cbs); } public void CopyIncompatibleFormats( @@ -999,7 +965,7 @@ namespace Ryujinx.Graphics.Vulkan shaderParams[0] = BitOperations.Log2((uint)ratio); - using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); + using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); buffer.Holder.SetDataUnchecked(buffer.Offset, shaderParams); @@ -1026,17 +992,17 @@ namespace Ryujinx.Graphics.Vulkan // - Maximum component size is 4 (R32). int componentSize = Math.Min(Math.Min(srcBpp, dstBpp), 4); - var srcFormat = GetFormat(componentSize, srcBpp / componentSize); - var dstFormat = GetFormat(componentSize, dstBpp / componentSize); + Format srcFormat = GetFormat(componentSize, srcBpp / componentSize); + Format dstFormat = GetFormat(componentSize, dstBpp / componentSize); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(0, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(0, buffer.Range)]); for (int l = 0; l < levels; l++) { for (int z = 0; z < depth; z++) { - var srcView = Create2DLayerView(src, srcLayer + z, srcLevel + l, srcFormat); - var dstView = Create2DLayerView(dst, dstLayer + z, dstLevel + l); + TextureView srcView = Create2DLayerView(src, srcLayer + z, srcLevel + l, srcFormat); + TextureView dstView = Create2DLayerView(dst, dstLayer + z, dstLevel + l); _pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Compute, 0, srcView, null); _pipeline.SetImage(ShaderStage.Compute, 0, dstView.GetView(dstFormat)); @@ -1083,7 +1049,7 @@ namespace Ryujinx.Graphics.Vulkan int samples = src.Info.Samples; bool isDepthOrStencil = src.Info.Format.IsDepthOrStencil(); - var aspectFlags = src.Info.Format.ConvertAspectFlags(); + ImageAspectFlags aspectFlags = src.Info.Format.ConvertAspectFlags(); // X and Y are the expected texture samples. // Z and W are the actual texture samples used. @@ -1091,7 +1057,7 @@ namespace Ryujinx.Graphics.Vulkan (shaderParams[0], shaderParams[1]) = GetSampleCountXYLog2(samples); (shaderParams[2], shaderParams[3]) = GetSampleCountXYLog2((int)TextureStorage.ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)samples)); - using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); + using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); buffer.Holder.SetDataUnchecked(buffer.Offset, shaderParams); @@ -1110,7 +1076,7 @@ namespace Ryujinx.Graphics.Vulkan 1); _pipeline.SetCommandBuffer(cbs); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(0, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(0, buffer.Range)]); if (isDepthOrStencil) { @@ -1118,7 +1084,7 @@ namespace Ryujinx.Graphics.Vulkan Span viewports = stackalloc Viewport[1]; - var rect = new Rectangle(0, 0, dst.Width, dst.Height); + Rectangle rect = new(0, 0, dst.Width, dst.Height); viewports[0] = new Viewport( rect, @@ -1129,14 +1095,14 @@ namespace Ryujinx.Graphics.Vulkan 0f, 1f); - _pipeline.SetScissors(stackalloc Rectangle[] { new Rectangle(0, 0, dst.Width, dst.Height) }); + _pipeline.SetScissors([new Rectangle(0, 0, dst.Width, dst.Height)]); _pipeline.SetViewports(viewports); _pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip); for (int z = 0; z < depth; z++) { - var srcView = Create2DLayerView(src, srcLayer + z, 0); - var dstView = Create2DLayerView(dst, dstLayer + z, 0); + TextureView srcView = Create2DLayerView(src, srcLayer + z, 0); + TextureView dstView = Create2DLayerView(dst, dstLayer + z, 0); _pipeline.SetRenderTarget(dstView, (uint)dst.Width, (uint)dst.Height); @@ -1155,7 +1121,7 @@ namespace Ryujinx.Graphics.Vulkan } else { - var format = GetFormat(src.Info.BytesPerPixel); + Format format = GetFormat(src.Info.BytesPerPixel); int dispatchX = (dst.Info.Width + 31) / 32; int dispatchY = (dst.Info.Height + 31) / 32; @@ -1164,8 +1130,8 @@ namespace Ryujinx.Graphics.Vulkan for (int z = 0; z < depth; z++) { - var srcView = Create2DLayerView(src, srcLayer + z, 0, format); - var dstView = Create2DLayerView(dst, dstLayer + z, 0); + TextureView srcView = Create2DLayerView(src, srcLayer + z, 0, format); + TextureView dstView = Create2DLayerView(dst, dstLayer + z, 0); _pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Compute, 0, srcView, null); _pipeline.SetImage(ShaderStage.Compute, 0, dstView.GetView(format)); @@ -1209,7 +1175,7 @@ namespace Ryujinx.Graphics.Vulkan int samples = dst.Info.Samples; bool isDepthOrStencil = src.Info.Format.IsDepthOrStencil(); - var aspectFlags = src.Info.Format.ConvertAspectFlags(); + ImageAspectFlags aspectFlags = src.Info.Format.ConvertAspectFlags(); // X and Y are the expected texture samples. // Z and W are the actual texture samples used. @@ -1217,7 +1183,7 @@ namespace Ryujinx.Graphics.Vulkan (shaderParams[0], shaderParams[1]) = GetSampleCountXYLog2(samples); (shaderParams[2], shaderParams[3]) = GetSampleCountXYLog2((int)TextureStorage.ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)samples)); - using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); + using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); buffer.Holder.SetDataUnchecked(buffer.Offset, shaderParams); @@ -1239,7 +1205,7 @@ namespace Ryujinx.Graphics.Vulkan Span viewports = stackalloc Viewport[1]; - var rect = new Rectangle(0, 0, dst.Width, dst.Height); + Rectangle rect = new(0, 0, dst.Width, dst.Height); viewports[0] = new Viewport( rect, @@ -1250,19 +1216,19 @@ namespace Ryujinx.Graphics.Vulkan 0f, 1f); - _pipeline.SetRenderTargetColorMasks(new uint[] { 0xf }); - _pipeline.SetScissors(stackalloc Rectangle[] { new Rectangle(0, 0, dst.Width, dst.Height) }); + _pipeline.SetRenderTargetColorMasks([0xf]); + _pipeline.SetScissors([new Rectangle(0, 0, dst.Width, dst.Height)]); _pipeline.SetViewports(viewports); _pipeline.SetPrimitiveTopology(PrimitiveTopology.TriangleStrip); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(0, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(0, buffer.Range)]); if (isDepthOrStencil) { for (int z = 0; z < depth; z++) { - var srcView = Create2DLayerView(src, srcLayer + z, 0); - var dstView = Create2DLayerView(dst, dstLayer + z, 0); + TextureView srcView = Create2DLayerView(src, srcLayer + z, 0); + TextureView dstView = Create2DLayerView(dst, dstLayer + z, 0); _pipeline.SetRenderTarget(dstView, (uint)dst.Width, (uint)dst.Height); @@ -1283,13 +1249,13 @@ namespace Ryujinx.Graphics.Vulkan { _pipeline.SetProgram(_programColorDrawToMs); - var format = GetFormat(src.Info.BytesPerPixel); - var vkFormat = FormatTable.GetFormat(format); + Format format = GetFormat(src.Info.BytesPerPixel); + VkFormat vkFormat = FormatTable.GetFormat(format); for (int z = 0; z < depth; z++) { - var srcView = Create2DLayerView(src, srcLayer + z, 0, format); - var dstView = Create2DLayerView(dst, dstLayer + z, 0); + TextureView srcView = Create2DLayerView(src, srcLayer + z, 0, format); + TextureView dstView = Create2DLayerView(dst, dstLayer + z, 0); _pipeline.SetTextureAndSamplerIdentitySwizzle(ShaderStage.Fragment, 0, srcView, null); _pipeline.SetRenderTarget(dstView.GetView(format), (uint)dst.Width, (uint)dst.Height); @@ -1329,7 +1295,7 @@ namespace Ryujinx.Graphics.Vulkan { if (aspectFlags.HasFlag(ImageAspectFlags.DepthBit)) { - var depthTexture = CreateDepthOrStencilView(src, DepthStencilMode.Depth); + TextureView depthTexture = CreateDepthOrStencilView(src, DepthStencilMode.Depth); CopyMSAspectDraw(depthTexture, fromMS, isDepth: true); @@ -1341,7 +1307,7 @@ namespace Ryujinx.Graphics.Vulkan if (aspectFlags.HasFlag(ImageAspectFlags.StencilBit) && _programStencilDrawToMs != null) { - var stencilTexture = CreateDepthOrStencilView(src, DepthStencilMode.Stencil); + TextureView stencilTexture = CreateDepthOrStencilView(src, DepthStencilMode.Stencil); CopyMSAspectDraw(stencilTexture, fromMS, isDepth: false); @@ -1421,14 +1387,14 @@ namespace Ryujinx.Graphics.Vulkan return from; } - var target = from.Info.Target switch + Target target = from.Info.Target switch { Target.Texture1DArray => Target.Texture1D, Target.Texture2DMultisampleArray => Target.Texture2DMultisample, _ => Target.Texture2D, }; - var info = new TextureCreateInfo( + TextureCreateInfo info = new( Math.Max(1, from.Info.Width >> level), Math.Max(1, from.Info.Height >> level), 1, @@ -1530,8 +1496,8 @@ namespace Ryujinx.Graphics.Vulkan int convertedCount = pattern.GetConvertedCount(indexCount); int outputIndexSize = 4; - var srcBuffer = srcIndexBuffer.GetBuffer().Get(cbs, srcIndexBufferOffset, indexCount * indexSize).Value; - var dstBuffer = dstIndexBuffer.GetBuffer().Get(cbs, 0, convertedCount * outputIndexSize).Value; + Buffer srcBuffer = srcIndexBuffer.GetBuffer().Get(cbs, srcIndexBufferOffset, indexCount * indexSize).Value; + Buffer dstBuffer = dstIndexBuffer.GetBuffer().Get(cbs, 0, convertedCount * outputIndexSize).Value; const int ParamsBufferSize = 24 * sizeof(int); const int ParamsIndirectDispatchOffset = 16 * sizeof(int); @@ -1558,9 +1524,9 @@ namespace Ryujinx.Graphics.Vulkan pattern.OffsetIndex.CopyTo(shaderParams[..pattern.OffsetIndex.Length]); - using var patternScoped = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); - var patternBuffer = patternScoped.Holder; - var patternBufferAuto = patternBuffer.GetBuffer(); + using ScopedTemporaryBuffer patternScoped = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); + BufferHolder patternBuffer = patternScoped.Holder; + Auto patternBufferAuto = patternBuffer.GetBuffer(); patternBuffer.SetDataUnchecked(patternScoped.Offset, shaderParams); @@ -1577,9 +1543,9 @@ namespace Ryujinx.Graphics.Vulkan srcIndirectBufferOffset, indirectDataSize); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(0, drawCountBufferAligned) }); + _pipeline.SetUniformBuffers([new BufferAssignment(0, drawCountBufferAligned)]); _pipeline.SetStorageBuffers(1, new[] { srcIndirectBuffer.GetBuffer(), dstIndirectBuffer.GetBuffer() }); - _pipeline.SetStorageBuffers(stackalloc[] { new BufferAssignment(3, patternScoped.Range) }); + _pipeline.SetStorageBuffers([new BufferAssignment(3, patternScoped.Range)]); _pipeline.SetProgram(_programConvertIndirectData); _pipeline.DispatchCompute(1, 1, 1); @@ -1606,7 +1572,8 @@ namespace Ryujinx.Graphics.Vulkan 0, convertedCount * outputIndexSize); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(0, new BufferRange(patternScoped.Handle, patternScoped.Offset, ParamsBufferSize)) }); + _pipeline.SetUniformBuffers([new BufferAssignment(0, new BufferRange(patternScoped.Handle, patternScoped.Offset, ParamsBufferSize)) + ]); _pipeline.SetStorageBuffers(1, new[] { srcIndexBuffer.GetBuffer(), dstIndexBuffer.GetBuffer() }); _pipeline.SetProgram(_programConvertIndexBuffer); @@ -1631,13 +1598,13 @@ namespace Ryujinx.Graphics.Vulkan int inSize = pixelCount * 2 * sizeof(int); int outSize = pixelCount * sizeof(int); - var srcBufferAuto = src.GetBuffer(); + Auto srcBufferAuto = src.GetBuffer(); - var srcBuffer = srcBufferAuto.Get(cbs, 0, inSize).Value; - var dstBuffer = dstBufferAuto.Get(cbs, dstOffset, outSize).Value; + Buffer srcBuffer = srcBufferAuto.Get(cbs, 0, inSize).Value; + Buffer dstBuffer = dstBufferAuto.Get(cbs, dstOffset, outSize).Value; - var access = AccessFlags.ShaderWriteBit; - var stage = PipelineStageFlags.ComputeShaderBit; + AccessFlags access = AccessFlags.ShaderWriteBit; + PipelineStageFlags stage = PipelineStageFlags.ComputeShaderBit; BufferHolder.InsertBufferBarrier( gd, @@ -1668,13 +1635,13 @@ namespace Ryujinx.Graphics.Vulkan shaderParams[0] = pixelCount; shaderParams[1] = dstOffset; - using var buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); + using ScopedTemporaryBuffer buffer = gd.BufferManager.ReserveOrCreate(gd, cbs, ParamsBufferSize); buffer.Holder.SetDataUnchecked(buffer.Offset, shaderParams); _pipeline.SetCommandBuffer(cbs); - _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(0, buffer.Range) }); + _pipeline.SetUniformBuffers([new BufferAssignment(0, buffer.Range)]); Span> sbRanges = new Auto[2]; diff --git a/src/Ryujinx.Graphics.Vulkan/HostMemoryAllocator.cs b/src/Ryujinx.Graphics.Vulkan/HostMemoryAllocator.cs index 77c5f95c9..d8f8851b3 100644 --- a/src/Ryujinx.Graphics.Vulkan/HostMemoryAllocator.cs +++ b/src/Ryujinx.Graphics.Vulkan/HostMemoryAllocator.cs @@ -5,6 +5,7 @@ using Silk.NET.Vulkan; using Silk.NET.Vulkan.Extensions.EXT; using System; using System.Collections.Generic; +using System.Threading; namespace Ryujinx.Graphics.Vulkan { @@ -31,7 +32,7 @@ namespace Ryujinx.Graphics.Vulkan private readonly Vk _api; private readonly ExtExternalMemoryHost _hostMemoryApi; private readonly Device _device; - private readonly object _lock = new(); + private readonly Lock _lock = new(); private readonly List _allocations; private readonly IntervalTree _allocationTree; @@ -43,7 +44,7 @@ namespace Ryujinx.Graphics.Vulkan _hostMemoryApi = hostMemoryApi; _device = device; - _allocations = new List(); + _allocations = []; _allocationTree = new IntervalTree(); } @@ -56,7 +57,7 @@ namespace Ryujinx.Graphics.Vulkan lock (_lock) { // Does a compatible allocation exist in the tree? - var allocations = new HostMemoryAllocation[10]; + HostMemoryAllocation[] allocations = new HostMemoryAllocation[10]; ulong start = (ulong)pointer; ulong end = start + size; @@ -107,7 +108,7 @@ namespace Ryujinx.Graphics.Vulkan PHostPointer = (void*)pageAlignedPointer, }; - var memoryAllocateInfo = new MemoryAllocateInfo + MemoryAllocateInfo memoryAllocateInfo = new() { SType = StructureType.MemoryAllocateInfo, AllocationSize = pageAlignedSize, @@ -115,7 +116,7 @@ namespace Ryujinx.Graphics.Vulkan PNext = &importInfo, }; - Result result = _api.AllocateMemory(_device, in memoryAllocateInfo, null, out var deviceMemory); + Result result = _api.AllocateMemory(_device, in memoryAllocateInfo, null, out DeviceMemory deviceMemory); if (result < Result.Success) { @@ -123,9 +124,9 @@ namespace Ryujinx.Graphics.Vulkan return false; } - var allocation = new MemoryAllocation(this, deviceMemory, pageAlignedPointer, 0, pageAlignedSize); - var allocAuto = new Auto(allocation); - var hostAlloc = new HostMemoryAllocation(allocAuto, pageAlignedPointer, pageAlignedSize); + MemoryAllocation allocation = new(this, deviceMemory, pageAlignedPointer, 0, pageAlignedSize); + Auto allocAuto = new(allocation); + HostMemoryAllocation hostAlloc = new(allocAuto, pageAlignedPointer, pageAlignedSize); allocAuto.IncrementReferenceCount(); allocAuto.Dispose(); // Kept alive by ref count only. @@ -144,7 +145,7 @@ namespace Ryujinx.Graphics.Vulkan lock (_lock) { // Does a compatible allocation exist in the tree? - var allocations = new HostMemoryAllocation[10]; + HostMemoryAllocation[] allocations = new HostMemoryAllocation[10]; ulong start = (ulong)pointer; ulong end = start + size; diff --git a/src/Ryujinx.Graphics.Vulkan/IdList.cs b/src/Ryujinx.Graphics.Vulkan/IdList.cs index 598d68584..ced33e39e 100644 --- a/src/Ryujinx.Graphics.Vulkan/IdList.cs +++ b/src/Ryujinx.Graphics.Vulkan/IdList.cs @@ -10,7 +10,7 @@ namespace Ryujinx.Graphics.Vulkan public IdList() { - _list = new List(); + _list = []; _freeMin = 0; } diff --git a/src/Ryujinx.Graphics.Vulkan/ImageArray.cs b/src/Ryujinx.Graphics.Vulkan/ImageArray.cs index 019286d28..47c180696 100644 --- a/src/Ryujinx.Graphics.Vulkan/ImageArray.cs +++ b/src/Ryujinx.Graphics.Vulkan/ImageArray.cs @@ -93,7 +93,7 @@ namespace Ryujinx.Graphics.Vulkan if (storages == null) { - storages = new HashSet(); + storages = []; for (int index = 0; index < _textureRefs.Length; index++) { @@ -128,8 +128,8 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < textures.Length; i++) { - ref var texture = ref textures[i]; - ref var refs = ref _textureRefs[i]; + ref DescriptorImageInfo texture = ref textures[i]; + ref TextureRef refs = ref _textureRefs[i]; if (i > 0 && _textureRefs[i - 1].View == refs.View) { diff --git a/src/Ryujinx.Graphics.Vulkan/IndexBufferPattern.cs b/src/Ryujinx.Graphics.Vulkan/IndexBufferPattern.cs index 7b01dd4ca..9054b2e71 100644 --- a/src/Ryujinx.Graphics.Vulkan/IndexBufferPattern.cs +++ b/src/Ryujinx.Graphics.Vulkan/IndexBufferPattern.cs @@ -47,28 +47,6 @@ namespace Ryujinx.Graphics.Vulkan return primitiveCount * OffsetIndex.Length; } - public IEnumerable GetIndexMapping(int indexCount) - { - int primitiveCount = GetPrimitiveCount(indexCount); - int index = BaseIndex; - - for (int i = 0; i < primitiveCount; i++) - { - if (RepeatStart) - { - // Used for triangle fan - yield return 0; - } - - for (int j = RepeatStart ? 1 : 0; j < OffsetIndex.Length; j++) - { - yield return index + OffsetIndex[j]; - } - - index += IndexStride; - } - } - public BufferHandle GetRepeatingBuffer(int vertexCount, out int indexCount) { int primitiveCount = GetPrimitiveCount(vertexCount); diff --git a/src/Ryujinx.Graphics.Vulkan/IndexBufferState.cs b/src/Ryujinx.Graphics.Vulkan/IndexBufferState.cs index d26fea307..88976e8bb 100644 --- a/src/Ryujinx.Graphics.Vulkan/IndexBufferState.cs +++ b/src/Ryujinx.Graphics.Vulkan/IndexBufferState.cs @@ -115,7 +115,7 @@ namespace Ryujinx.Graphics.Vulkan // Convert the index buffer using the given pattern. int indexSize = GetIndexSize(); - (var indexBufferAuto, var indirectBufferAuto) = gd.BufferManager.GetBufferTopologyConversionIndirect( + (Auto indexBufferAuto, Auto indirectBufferAuto) = gd.BufferManager.GetBufferTopologyConversionIndirect( gd, cbs, new BufferRange(_handle, _offset, _size), diff --git a/src/Ryujinx.Graphics.Vulkan/MemoryAllocator.cs b/src/Ryujinx.Graphics.Vulkan/MemoryAllocator.cs index a28322a25..5d7d291fb 100644 --- a/src/Ryujinx.Graphics.Vulkan/MemoryAllocator.cs +++ b/src/Ryujinx.Graphics.Vulkan/MemoryAllocator.cs @@ -21,7 +21,7 @@ namespace Ryujinx.Graphics.Vulkan _api = api; _physicalDevice = physicalDevice; _device = device; - _blockLists = new List(); + _blockLists = []; _blockAlignment = (int)Math.Min(int.MaxValue, MaxDeviceMemoryUsageEstimate / _physicalDevice.PhysicalDeviceProperties.Limits.MaxMemoryAllocationCount); _lock = new(LockRecursionPolicy.NoRecursion); } @@ -49,7 +49,7 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < _blockLists.Count; i++) { - var bl = _blockLists[i]; + MemoryAllocatorBlockList bl = _blockLists[i]; if (bl.MemoryTypeIndex == memoryTypeIndex && bl.ForBuffer == isBuffer) { return bl.Allocate(size, alignment, map); @@ -65,7 +65,7 @@ namespace Ryujinx.Graphics.Vulkan try { - var newBl = new MemoryAllocatorBlockList(_api, _device, memoryTypeIndex, _blockAlignment, isBuffer); + MemoryAllocatorBlockList newBl = new(_api, _device, memoryTypeIndex, _blockAlignment, isBuffer); _blockLists.Add(newBl); return newBl.Allocate(size, alignment, map); @@ -80,7 +80,7 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < _physicalDevice.PhysicalDeviceMemoryProperties.MemoryTypeCount; i++) { - var type = _physicalDevice.PhysicalDeviceMemoryProperties.MemoryTypes[i]; + MemoryType type = _physicalDevice.PhysicalDeviceMemoryProperties.MemoryTypes[i]; if ((memoryTypeBits & (1 << i)) != 0) { diff --git a/src/Ryujinx.Graphics.Vulkan/MemoryAllocatorBlockList.cs b/src/Ryujinx.Graphics.Vulkan/MemoryAllocatorBlockList.cs index 4a0cb2a74..acd791559 100644 --- a/src/Ryujinx.Graphics.Vulkan/MemoryAllocatorBlockList.cs +++ b/src/Ryujinx.Graphics.Vulkan/MemoryAllocatorBlockList.cs @@ -42,17 +42,17 @@ namespace Ryujinx.Graphics.Vulkan Memory = memory; HostPointer = hostPointer; Size = size; - _freeRanges = new List - { - new Range(0, size), - }; + _freeRanges = + [ + new(0, size) + ]; } public ulong Allocate(ulong size, ulong alignment) { for (int i = 0; i < _freeRanges.Count; i++) { - var range = _freeRanges[i]; + Range range = _freeRanges[i]; ulong alignedOffset = BitUtils.AlignUp(range.Offset, alignment); ulong sizeDelta = alignedOffset - range.Offset; @@ -88,7 +88,7 @@ namespace Ryujinx.Graphics.Vulkan private void InsertFreeRange(ulong offset, ulong size) { - var range = new Range(offset, size); + Range range = new(offset, size); int index = _freeRanges.BinarySearch(range); if (index < 0) { @@ -101,7 +101,7 @@ namespace Ryujinx.Graphics.Vulkan private void InsertFreeRangeComingled(ulong offset, ulong size) { ulong endOffset = offset + size; - var range = new Range(offset, size); + Range range = new(offset, size); int index = _freeRanges.BinarySearch(range); if (index < 0) { @@ -171,7 +171,7 @@ namespace Ryujinx.Graphics.Vulkan public MemoryAllocatorBlockList(Vk api, Device device, int memoryTypeIndex, int blockAlignment, bool forBuffer) { - _blocks = new List(); + _blocks = []; _api = api; _device = device; MemoryTypeIndex = memoryTypeIndex; @@ -194,7 +194,7 @@ namespace Ryujinx.Graphics.Vulkan { for (int i = 0; i < _blocks.Count; i++) { - var block = _blocks[i]; + Block block = _blocks[i]; if (block.Mapped == map && block.Size >= size) { @@ -213,14 +213,14 @@ namespace Ryujinx.Graphics.Vulkan ulong blockAlignedSize = BitUtils.AlignUp(size, (ulong)_blockAlignment); - var memoryAllocateInfo = new MemoryAllocateInfo + MemoryAllocateInfo memoryAllocateInfo = new() { SType = StructureType.MemoryAllocateInfo, AllocationSize = blockAlignedSize, MemoryTypeIndex = (uint)MemoryTypeIndex, }; - _api.AllocateMemory(_device, in memoryAllocateInfo, null, out var deviceMemory).ThrowOnError(); + _api.AllocateMemory(_device, in memoryAllocateInfo, null, out DeviceMemory deviceMemory).ThrowOnError(); nint hostPointer = nint.Zero; @@ -231,7 +231,7 @@ namespace Ryujinx.Graphics.Vulkan hostPointer = (nint)pointer; } - var newBlock = new Block(deviceMemory, hostPointer, blockAlignedSize); + Block newBlock = new(deviceMemory, hostPointer, blockAlignedSize); InsertBlock(newBlock); diff --git a/src/Ryujinx.Graphics.Vulkan/MoltenVK/MVKInitialization.cs b/src/Ryujinx.Graphics.Vulkan/MoltenVK/MVKInitialization.cs index 086c4e1df..c1c59939e 100644 --- a/src/Ryujinx.Graphics.Vulkan/MoltenVK/MVKInitialization.cs +++ b/src/Ryujinx.Graphics.Vulkan/MoltenVK/MVKInitialization.cs @@ -19,7 +19,7 @@ namespace Ryujinx.Graphics.Vulkan.MoltenVK public static void Initialize() { - var configSize = (nint)Marshal.SizeOf(); + IntPtr configSize = (nint)Marshal.SizeOf(); vkGetMoltenVKConfigurationMVK(nint.Zero, out MVKConfiguration config, configSize); @@ -40,7 +40,8 @@ namespace Ryujinx.Graphics.Vulkan.MoltenVK path = path[..^VulkanLib.Length] + "libMoltenVK.dylib"; return [path]; } - return Array.Empty(); + + return []; } public static void InitializeResolver() diff --git a/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs b/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs index b42524712..e9ef39cda 100644 --- a/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs +++ b/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs @@ -229,7 +229,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < _fences.Length; i++) { - var fence = _fences[i]; + FenceHolder fence = _fences[i]; if (fence != null) { @@ -253,7 +253,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < _fences.Length; i++) { - var fence = _fences[i]; + FenceHolder fence = _fences[i]; if (fence != null && _bufferUsageBitmap.OverlapsWith(i, offset, size)) { diff --git a/src/Ryujinx.Graphics.Vulkan/PersistentFlushBuffer.cs b/src/Ryujinx.Graphics.Vulkan/PersistentFlushBuffer.cs index 5e0ed077b..79879e04e 100644 --- a/src/Ryujinx.Graphics.Vulkan/PersistentFlushBuffer.cs +++ b/src/Ryujinx.Graphics.Vulkan/PersistentFlushBuffer.cs @@ -1,5 +1,7 @@ using Ryujinx.Graphics.GAL; +using Silk.NET.Vulkan; using System; +using Buffer = Silk.NET.Vulkan.Buffer; namespace Ryujinx.Graphics.Vulkan { @@ -16,7 +18,7 @@ namespace Ryujinx.Graphics.Vulkan private BufferHolder ResizeIfNeeded(int size) { - var flushStorage = _flushStorage; + BufferHolder flushStorage = _flushStorage; if (flushStorage == null || size > _flushStorage.Size) { @@ -31,13 +33,13 @@ namespace Ryujinx.Graphics.Vulkan public Span GetBufferData(CommandBufferPool cbp, BufferHolder buffer, int offset, int size) { - var flushStorage = ResizeIfNeeded(size); + BufferHolder flushStorage = ResizeIfNeeded(size); Auto srcBuffer; - using (var cbs = cbp.Rent()) + using (CommandBufferScoped cbs = cbp.Rent()) { srcBuffer = buffer.GetBuffer(cbs.CommandBuffer); - var dstBuffer = flushStorage.GetBuffer(cbs.CommandBuffer); + Auto dstBuffer = flushStorage.GetBuffer(cbs.CommandBuffer); if (srcBuffer.TryIncrementReferenceCount()) { @@ -59,12 +61,12 @@ namespace Ryujinx.Graphics.Vulkan { TextureCreateInfo info = view.Info; - var flushStorage = ResizeIfNeeded(size); + BufferHolder flushStorage = ResizeIfNeeded(size); - using (var cbs = cbp.Rent()) + using (CommandBufferScoped cbs = cbp.Rent()) { - var buffer = flushStorage.GetBuffer(cbs.CommandBuffer).Get(cbs).Value; - var image = view.GetImage().Get(cbs).Value; + Buffer buffer = flushStorage.GetBuffer(cbs.CommandBuffer).Get(cbs).Value; + Image image = view.GetImage().Get(cbs).Value; view.CopyFromOrToBuffer(cbs.CommandBuffer, buffer, image, size, true, 0, 0, info.GetLayers(), info.Levels, singleSlice: false); } @@ -75,12 +77,12 @@ namespace Ryujinx.Graphics.Vulkan public Span GetTextureData(CommandBufferPool cbp, TextureView view, int size, int layer, int level) { - var flushStorage = ResizeIfNeeded(size); + BufferHolder flushStorage = ResizeIfNeeded(size); - using (var cbs = cbp.Rent()) + using (CommandBufferScoped cbs = cbp.Rent()) { - var buffer = flushStorage.GetBuffer(cbs.CommandBuffer).Get(cbs).Value; - var image = view.GetImage().Get(cbs).Value; + Buffer buffer = flushStorage.GetBuffer(cbs.CommandBuffer).Get(cbs).Value; + Image image = view.GetImage().Get(cbs).Value; view.CopyFromOrToBuffer(cbs.CommandBuffer, buffer, image, size, true, layer, level, 1, 1, singleSlice: true); } diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs index addad83fd..eac47e60e 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Memory; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Shader; using Silk.NET.Vulkan; @@ -7,8 +8,9 @@ using System.Linq; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using BlendOp = Silk.NET.Vulkan.BlendOp; +using Buffer = Silk.NET.Vulkan.Buffer; using CompareOp = Ryujinx.Graphics.GAL.CompareOp; -using Format = Ryujinx.Graphics.GAL.Format; using FrontFace = Ryujinx.Graphics.GAL.FrontFace; using IndexType = Ryujinx.Graphics.GAL.IndexType; using PolygonMode = Ryujinx.Graphics.GAL.PolygonMode; @@ -102,7 +104,7 @@ namespace Ryujinx.Graphics.Vulkan AutoFlush = new AutoFlushCounter(gd); EndRenderPassDelegate = EndRenderPass; - var pipelineCacheCreateInfo = new PipelineCacheCreateInfo + PipelineCacheCreateInfo pipelineCacheCreateInfo = new() { SType = StructureType.PipelineCacheCreateInfo, }; @@ -117,7 +119,7 @@ namespace Ryujinx.Graphics.Vulkan const int EmptyVbSize = 16; - using var emptyVb = gd.BufferManager.Create(gd, EmptyVbSize); + using BufferHolder emptyVb = gd.BufferManager.Create(gd, EmptyVbSize); emptyVb.SetData(0, new byte[EmptyVbSize]); _vertexBuffers[0] = new VertexBufferState(emptyVb.GetBuffer(), 0, 0, EmptyVbSize); _vertexBuffersDirty = ulong.MaxValue >> (64 - _vertexBuffers.Length); @@ -133,8 +135,8 @@ namespace Ryujinx.Graphics.Vulkan { _descriptorSetUpdater.Initialize(IsMainPipeline); - QuadsToTrisPattern = new IndexBufferPattern(Gd, 4, 6, 0, new[] { 0, 1, 2, 0, 2, 3 }, 4, false); - TriFanToTrisPattern = new IndexBufferPattern(Gd, 3, 3, 2, new[] { int.MinValue, -1, 0 }, 1, true); + QuadsToTrisPattern = new IndexBufferPattern(Gd, 4, 6, 0, [0, 1, 2, 0, 2, 3], 4, false); + TriFanToTrisPattern = new IndexBufferPattern(Gd, 3, 3, 2, [int.MinValue, -1, 0], 1, true); } public unsafe void Barrier() @@ -174,7 +176,7 @@ namespace Ryujinx.Graphics.Vulkan { EndRenderPass(); - var dst = Gd.BufferManager.GetBuffer(CommandBuffer, destination, offset, size, true).Get(Cbs, offset, size, true).Value; + Buffer dst = Gd.BufferManager.GetBuffer(CommandBuffer, destination, offset, size, true).Get(Cbs, offset, size, true).Value; BufferHolder.InsertBufferBarrier( Gd, @@ -217,9 +219,9 @@ namespace Ryujinx.Graphics.Vulkan BeginRenderPass(); - var clearValue = new ClearValue(new ClearColorValue(color.Red, color.Green, color.Blue, color.Alpha)); - var attachment = new ClearAttachment(ImageAspectFlags.ColorBit, (uint)index, clearValue); - var clearRect = FramebufferParams.GetClearRect(ClearScissor, layer, layerCount); + ClearValue clearValue = new(new ClearColorValue(color.Red, color.Green, color.Blue, color.Alpha)); + ClearAttachment attachment = new(ImageAspectFlags.ColorBit, (uint)index, clearValue); + ClearRect clearRect = FramebufferParams.GetClearRect(ClearScissor, layer, layerCount); Gd.Api.CmdClearAttachments(CommandBuffer, 1, &attachment, 1, &clearRect); } @@ -231,8 +233,8 @@ namespace Ryujinx.Graphics.Vulkan return; } - var clearValue = new ClearValue(null, new ClearDepthStencilValue(depthValue, (uint)stencilValue)); - var flags = depthMask ? ImageAspectFlags.DepthBit : 0; + ClearValue clearValue = new(null, new ClearDepthStencilValue(depthValue, (uint)stencilValue)); + ImageAspectFlags flags = depthMask ? ImageAspectFlags.DepthBit : 0; if (stencilMask) { @@ -255,8 +257,8 @@ namespace Ryujinx.Graphics.Vulkan BeginRenderPass(); - var attachment = new ClearAttachment(flags, 0, clearValue); - var clearRect = FramebufferParams.GetClearRect(ClearScissor, layer, layerCount); + ClearAttachment attachment = new(flags, 0, clearValue); + ClearRect clearRect = FramebufferParams.GetClearRect(ClearScissor, layer, layerCount); Gd.Api.CmdClearAttachments(CommandBuffer, 1, &attachment, 1, &clearRect); } @@ -270,8 +272,8 @@ namespace Ryujinx.Graphics.Vulkan { EndRenderPass(); - var src = Gd.BufferManager.GetBuffer(CommandBuffer, source, srcOffset, size, false); - var dst = Gd.BufferManager.GetBuffer(CommandBuffer, destination, dstOffset, size, true); + Auto src = Gd.BufferManager.GetBuffer(CommandBuffer, source, srcOffset, size, false); + Auto dst = Gd.BufferManager.GetBuffer(CommandBuffer, destination, dstOffset, size, true); BufferHolder.Copy(Gd, Cbs, src, dst, srcOffset, dstOffset, size); } @@ -350,7 +352,7 @@ namespace Ryujinx.Graphics.Vulkan }; BufferHandle handle = pattern.GetRepeatingBuffer(vertexCount, out int indexCount); - var buffer = Gd.BufferManager.GetBuffer(CommandBuffer, handle, false); + Auto buffer = Gd.BufferManager.GetBuffer(CommandBuffer, handle, false); Gd.Api.CmdBindIndexBuffer(CommandBuffer, buffer.Get(Cbs, 0, indexCount * sizeof(int)).Value, 0, Silk.NET.Vulkan.IndexType.Uint32); @@ -435,7 +437,7 @@ namespace Ryujinx.Graphics.Vulkan public void DrawIndexedIndirect(BufferRange indirectBuffer) { - var buffer = Gd.BufferManager + Buffer buffer = Gd.BufferManager .GetBuffer(CommandBuffer, indirectBuffer.Handle, indirectBuffer.Offset, indirectBuffer.Size, false) .Get(Cbs, indirectBuffer.Offset, indirectBuffer.Size).Value; @@ -481,11 +483,11 @@ namespace Ryujinx.Graphics.Vulkan public void DrawIndexedIndirectCount(BufferRange indirectBuffer, BufferRange parameterBuffer, int maxDrawCount, int stride) { - var countBuffer = Gd.BufferManager + Buffer countBuffer = Gd.BufferManager .GetBuffer(CommandBuffer, parameterBuffer.Handle, parameterBuffer.Offset, parameterBuffer.Size, false) .Get(Cbs, parameterBuffer.Offset, parameterBuffer.Size).Value; - var buffer = Gd.BufferManager + Buffer buffer = Gd.BufferManager .GetBuffer(CommandBuffer, indirectBuffer.Handle, indirectBuffer.Offset, indirectBuffer.Size, false) .Get(Cbs, indirectBuffer.Offset, indirectBuffer.Size).Value; @@ -575,7 +577,7 @@ namespace Ryujinx.Graphics.Vulkan { // TODO: Support quads and other unsupported topologies. - var buffer = Gd.BufferManager + Buffer buffer = Gd.BufferManager .GetBuffer(CommandBuffer, indirectBuffer.Handle, indirectBuffer.Offset, indirectBuffer.Size, false) .Get(Cbs, indirectBuffer.Offset, indirectBuffer.Size, false).Value; @@ -599,11 +601,11 @@ namespace Ryujinx.Graphics.Vulkan throw new NotSupportedException(); } - var buffer = Gd.BufferManager + Buffer buffer = Gd.BufferManager .GetBuffer(CommandBuffer, indirectBuffer.Handle, indirectBuffer.Offset, indirectBuffer.Size, false) .Get(Cbs, indirectBuffer.Offset, indirectBuffer.Size, false).Value; - var countBuffer = Gd.BufferManager + Buffer countBuffer = Gd.BufferManager .GetBuffer(CommandBuffer, parameterBuffer.Handle, parameterBuffer.Offset, parameterBuffer.Size, false) .Get(Cbs, parameterBuffer.Offset, parameterBuffer.Size, false).Value; @@ -632,13 +634,13 @@ namespace Ryujinx.Graphics.Vulkan { if (texture is TextureView srcTexture) { - var oldCullMode = _newState.CullMode; - var oldStencilTestEnable = _newState.StencilTestEnable; - var oldDepthTestEnable = _newState.DepthTestEnable; - var oldDepthWriteEnable = _newState.DepthWriteEnable; - var oldViewports = DynamicState.Viewports; - var oldViewportsCount = _newState.ViewportsCount; - var oldTopology = _topology; + CullModeFlags oldCullMode = _newState.CullMode; + bool oldStencilTestEnable = _newState.StencilTestEnable; + bool oldDepthTestEnable = _newState.DepthTestEnable; + bool oldDepthWriteEnable = _newState.DepthWriteEnable; + Array16 oldViewports = DynamicState.Viewports; + uint oldViewportsCount = _newState.ViewportsCount; + PrimitiveTopology oldTopology = _topology; _newState.CullMode = CullModeFlags.None; _newState.StencilTestEnable = false; @@ -710,11 +712,11 @@ namespace Ryujinx.Graphics.Vulkan { for (int index = 0; index < Constants.MaxRenderTargets; index++) { - ref var vkBlend = ref _newState.Internal.ColorBlendAttachmentState[index]; + ref PipelineColorBlendAttachmentState vkBlend = ref _newState.Internal.ColorBlendAttachmentState[index]; if (index == 0) { - var blendOp = blend.Op.Convert(); + BlendOp blendOp = blend.Op.Convert(); vkBlend = new PipelineColorBlendAttachmentState( blendEnable: true, @@ -751,7 +753,7 @@ namespace Ryujinx.Graphics.Vulkan public void SetBlendState(int index, BlendDescriptor blend) { - ref var vkBlend = ref _newState.Internal.ColorBlendAttachmentState[index]; + ref PipelineColorBlendAttachmentState vkBlend = ref _newState.Internal.ColorBlendAttachmentState[index]; if (blend.Enable) { @@ -919,7 +921,7 @@ namespace Ryujinx.Graphics.Vulkan { _topology = topology; - var vkTopology = Gd.TopologyRemap(topology).Convert(); + Silk.NET.Vulkan.PrimitiveTopology vkTopology = Gd.TopologyRemap(topology).Convert(); _newState.Topology = vkTopology; @@ -928,8 +930,8 @@ namespace Ryujinx.Graphics.Vulkan public void SetProgram(IProgram program) { - var internalProgram = (ShaderCollection)program; - var stages = internalProgram.GetInfos(); + ShaderCollection internalProgram = (ShaderCollection)program; + PipelineShaderStageCreateInfo[] stages = internalProgram.GetInfos(); _program = internalProgram; @@ -952,7 +954,7 @@ namespace Ryujinx.Graphics.Vulkan public void Specialize(in T data) where T : unmanaged { - var dataSpan = MemoryMarshal.AsBytes(MemoryMarshal.CreateReadOnlySpan(ref Unsafe.AsRef(in data), 1)); + ReadOnlySpan dataSpan = MemoryMarshal.AsBytes(MemoryMarshal.CreateReadOnlySpan(ref Unsafe.AsRef(in data), 1)); if (!dataSpan.SequenceEqual(_newState.SpecializationData.Span)) { @@ -986,8 +988,8 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < count; i++) { - ref var vkBlend = ref _newState.Internal.ColorBlendAttachmentState[i]; - var newMask = (ColorComponentFlags)componentMask[i]; + ref PipelineColorBlendAttachmentState vkBlend = ref _newState.Internal.ColorBlendAttachmentState[i]; + ColorComponentFlags newMask = (ColorComponentFlags)componentMask[i]; // When color write mask is 0, remove all blend state to help the pipeline cache. // Restore it when the mask becomes non-zero. @@ -1054,9 +1056,9 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < count; i++) { - var region = regions[i]; - var offset = new Offset2D(region.X, region.Y); - var extent = new Extent2D((uint)region.Width, (uint)region.Height); + Rectangle region = regions[i]; + Offset2D offset = new(region.X, region.Y); + Extent2D extent = new((uint)region.Width, (uint)region.Height); DynamicState.SetScissor(i, new Rect2D(offset, extent)); } @@ -1129,7 +1131,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < count; i++) { - var range = buffers[i]; + BufferRange range = buffers[i]; _transformFeedbackBuffers[i].Dispose(); @@ -1158,7 +1160,7 @@ namespace Ryujinx.Graphics.Vulkan public void SetVertexAttribs(ReadOnlySpan vertexAttribs) { - var formatCapabilities = Gd.FormatCapabilities; + FormatCapabilities formatCapabilities = Gd.FormatCapabilities; Span newVbScalarSizes = stackalloc int[Constants.MaxVertexBuffers]; @@ -1167,9 +1169,9 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < count; i++) { - var attribute = vertexAttribs[i]; - var rawIndex = attribute.BufferIndex; - var bufferIndex = attribute.IsZero ? 0 : rawIndex + 1; + VertexAttribDescriptor attribute = vertexAttribs[i]; + int rawIndex = attribute.BufferIndex; + int bufferIndex = attribute.IsZero ? 0 : rawIndex + 1; if (!attribute.IsZero) { @@ -1188,7 +1190,7 @@ namespace Ryujinx.Graphics.Vulkan { int dirtyBit = BitOperations.TrailingZeroCount(dirtyVbSizes); - ref var buffer = ref _vertexBuffers[dirtyBit + 1]; + ref VertexBufferState buffer = ref _vertexBuffers[dirtyBit + 1]; if (buffer.AttributeScalarAlignment != newVbScalarSizes[dirtyBit]) { @@ -1216,10 +1218,10 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < count; i++) { - var vertexBuffer = vertexBuffers[i]; + VertexBufferDescriptor vertexBuffer = vertexBuffers[i]; // TODO: Support divisor > 1 - var inputRate = vertexBuffer.Divisor != 0 ? VertexInputRate.Instance : VertexInputRate.Vertex; + VertexInputRate inputRate = vertexBuffer.Divisor != 0 ? VertexInputRate.Instance : VertexInputRate.Vertex; if (vertexBuffer.Buffer.Handle != BufferHandle.Null) { @@ -1253,7 +1255,7 @@ namespace Ryujinx.Graphics.Vulkan } } - ref var buffer = ref _vertexBuffers[binding]; + ref VertexBufferState buffer = ref _vertexBuffers[binding]; int oldScalarAlign = buffer.AttributeScalarAlignment; if (Gd.Capabilities.VertexBufferAlignment < 2 && @@ -1314,7 +1316,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < count; i++) { - var viewport = viewports[i]; + Viewport viewport = viewports[i]; DynamicState.SetViewport(i, new Silk.NET.Vulkan.Viewport( viewport.Region.X, @@ -1410,7 +1412,7 @@ namespace Ryujinx.Graphics.Vulkan continue; } - ref var vkBlend = ref _newState.Internal.ColorBlendAttachmentState[i]; + ref PipelineColorBlendAttachmentState vkBlend = ref _newState.Internal.ColorBlendAttachmentState[i]; for (int j = 0; j < i; j++) { @@ -1419,7 +1421,7 @@ namespace Ryujinx.Graphics.Vulkan if (colors[i] == colors[j]) { // Prefer the binding with no write mask. - ref var vkBlend2 = ref _newState.Internal.ColorBlendAttachmentState[j]; + ref PipelineColorBlendAttachmentState vkBlend2 = ref _newState.Internal.ColorBlendAttachmentState[j]; if (vkBlend.ColorWriteMask == 0) { colors[i] = null; @@ -1457,7 +1459,7 @@ namespace Ryujinx.Graphics.Vulkan protected void UpdatePipelineAttachmentFormats() { - var dstAttachmentFormats = _newState.Internal.AttachmentFormats.AsSpan(); + Span dstAttachmentFormats = _newState.Internal.AttachmentFormats.AsSpan(); FramebufferParams.AttachmentFormats.CopyTo(dstAttachmentFormats); _newState.Internal.AttachmentIntegerFormatMask = FramebufferParams.AttachmentIntegerFormatMask; _newState.Internal.LogicOpsAllowed = FramebufferParams.LogicOpsAllowed; @@ -1474,7 +1476,7 @@ namespace Ryujinx.Graphics.Vulkan protected unsafe void CreateRenderPass() { - var hasFramebuffer = FramebufferParams != null; + bool hasFramebuffer = FramebufferParams != null; EndRenderPass(); @@ -1525,20 +1527,24 @@ namespace Ryujinx.Graphics.Vulkan private bool ChangeFeedbackLoop(FeedbackLoopAspects aspects) { - if (_feedbackLoop != aspects) + // AMD RDNA 3 GPUs only + if (Gd.IsAmdRdna3) { - if (Gd.Capabilities.SupportsDynamicAttachmentFeedbackLoop) + if (_feedbackLoop != aspects) { - DynamicState.SetFeedbackLoop(aspects); - } - else - { - _newState.FeedbackLoopAspects = aspects; - } + if (Gd.Capabilities.SupportsDynamicAttachmentFeedbackLoop) + { + DynamicState.SetFeedbackLoop(aspects); + } + else + { + _newState.FeedbackLoopAspects = aspects; + } - _feedbackLoop = aspects; + _feedbackLoop = aspects; - return true; + return true; + } } return false; @@ -1679,7 +1685,7 @@ namespace Ryujinx.Graphics.Vulkan return false; } - var pipeline = pbp == PipelineBindPoint.Compute + Auto pipeline = pbp == PipelineBindPoint.Compute ? _newState.CreateComputePipeline(Gd, Device, _program, PipelineCache) : _newState.CreateGraphicsPipeline(Gd, Device, _program, PipelineCache, _renderPass.Get(Cbs).Value); @@ -1711,10 +1717,10 @@ namespace Ryujinx.Graphics.Vulkan { FramebufferParams.InsertLoadOpBarriers(Gd, Cbs); - var renderArea = new Rect2D(null, new Extent2D(FramebufferParams.Width, FramebufferParams.Height)); - var clearValue = new ClearValue(); + Rect2D renderArea = new(null, new Extent2D(FramebufferParams.Width, FramebufferParams.Height)); + ClearValue clearValue = new(); - var renderPassBeginInfo = new RenderPassBeginInfo + RenderPassBeginInfo renderPassBeginInfo = new() { SType = StructureType.RenderPassBeginInfo, RenderPass = _renderPass.Get(Cbs).Value, diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineConverter.cs b/src/Ryujinx.Graphics.Vulkan/PipelineConverter.cs index 85069c6b2..372577cac 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineConverter.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineConverter.cs @@ -15,7 +15,7 @@ namespace Ryujinx.Graphics.Vulkan AttachmentDescription[] attachmentDescs = null; - var subpass = new SubpassDescription + SubpassDescription subpass = new() { PipelineBindPoint = PipelineBindPoint.Graphics, }; @@ -29,11 +29,17 @@ namespace Ryujinx.Graphics.Vulkan int colorCount = 0; int maxColorAttachmentIndex = -1; + bool isNotMsOrSupportsStorage = gd.Capabilities.SupportsShaderStorageImageMultisample || + !state.DepthStencilFormat.IsImageCompatible(); + for (int i = 0; i < state.AttachmentEnable.Length; i++) { if (state.AttachmentEnable[i]) { - attachmentFormats[attachmentCount] = gd.FormatCapabilities.ConvertToVkFormat(state.AttachmentFormats[i]); + bool isNotMsOrSupportsStorageAttachments = gd.Capabilities.SupportsShaderStorageImageMultisample || + !state.AttachmentFormats[i].IsImageCompatible(); + + attachmentFormats[attachmentCount] = gd.FormatCapabilities.ConvertToVkFormat(state.AttachmentFormats[i], isNotMsOrSupportsStorageAttachments); attachmentIndices[attachmentCount++] = i; colorCount++; @@ -43,7 +49,7 @@ namespace Ryujinx.Graphics.Vulkan if (state.DepthStencilEnable) { - attachmentFormats[attachmentCount++] = gd.FormatCapabilities.ConvertToVkFormat(state.DepthStencilFormat); + attachmentFormats[attachmentCount++] = gd.FormatCapabilities.ConvertToVkFormat(state.DepthStencilFormat, isNotMsOrSupportsStorage); } if (attachmentCount != 0) @@ -101,11 +107,11 @@ namespace Ryujinx.Graphics.Vulkan } } - var subpassDependency = CreateSubpassDependency(gd); + SubpassDependency subpassDependency = CreateSubpassDependency(gd); fixed (AttachmentDescription* pAttachmentDescs = attachmentDescs) { - var renderPassCreateInfo = new RenderPassCreateInfo + RenderPassCreateInfo renderPassCreateInfo = new() { SType = StructureType.RenderPassCreateInfo, PAttachments = pAttachmentDescs, @@ -116,7 +122,7 @@ namespace Ryujinx.Graphics.Vulkan DependencyCount = 1, }; - gd.Api.CreateRenderPass(device, in renderPassCreateInfo, null, out var renderPass).ThrowOnError(); + gd.Api.CreateRenderPass(device, in renderPassCreateInfo, null, out RenderPass renderPass).ThrowOnError(); return new DisposableRenderPass(gd.Api, device, renderPass); } @@ -124,7 +130,7 @@ namespace Ryujinx.Graphics.Vulkan public static SubpassDependency CreateSubpassDependency(VulkanRenderer gd) { - var (access, stages) = BarrierBatch.GetSubpassAccessSuperset(gd); + (AccessFlags access, PipelineStageFlags stages) = BarrierBatch.GetSubpassAccessSuperset(gd); return new SubpassDependency( 0, @@ -138,7 +144,7 @@ namespace Ryujinx.Graphics.Vulkan public unsafe static SubpassDependency2 CreateSubpassDependency2(VulkanRenderer gd) { - var (access, stages) = BarrierBatch.GetSubpassAccessSuperset(gd); + (AccessFlags access, PipelineStageFlags stages) = BarrierBatch.GetSubpassAccessSuperset(gd); return new SubpassDependency2( StructureType.SubpassDependency2, @@ -219,8 +225,8 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < vaCount; i++) { - var attribute = state.VertexAttribs[i]; - var bufferIndex = attribute.IsZero ? 0 : attribute.BufferIndex + 1; + VertexAttribDescriptor attribute = state.VertexAttribs[i]; + int bufferIndex = attribute.IsZero ? 0 : attribute.BufferIndex + 1; pipeline.Internal.VertexAttributeDescriptions[i] = new VertexInputAttributeDescription( (uint)i, @@ -239,11 +245,11 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < vbCount; i++) { - var vertexBuffer = state.VertexBuffers[i]; + BufferPipelineDescriptor vertexBuffer = state.VertexBuffers[i]; if (vertexBuffer.Enable) { - var inputRate = vertexBuffer.Divisor != 0 ? VertexInputRate.Instance : VertexInputRate.Vertex; + VertexInputRate inputRate = vertexBuffer.Divisor != 0 ? VertexInputRate.Instance : VertexInputRate.Vertex; int alignedStride = vertexBuffer.Stride; @@ -266,7 +272,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < Constants.MaxRenderTargets; i++) { - var blend = state.BlendDescriptors[i]; + BlendDescriptor blend = state.BlendDescriptors[i]; if (blend.Enable && state.ColorWriteMask[i] != 0) { @@ -296,7 +302,10 @@ namespace Ryujinx.Graphics.Vulkan { if (state.AttachmentEnable[i]) { - pipeline.Internal.AttachmentFormats[attachmentCount++] = gd.FormatCapabilities.ConvertToVkFormat(state.AttachmentFormats[i]); + bool isNotMsOrSupportsStorage = gd.Capabilities.SupportsShaderStorageImageMultisample || + !state.AttachmentFormats[i].IsImageCompatible(); + + pipeline.Internal.AttachmentFormats[attachmentCount++] = gd.FormatCapabilities.ConvertToVkFormat(state.AttachmentFormats[i], isNotMsOrSupportsStorage); maxColorAttachmentIndex = i; if (state.AttachmentFormats[i].IsInteger()) @@ -310,7 +319,10 @@ namespace Ryujinx.Graphics.Vulkan if (state.DepthStencilEnable) { - pipeline.Internal.AttachmentFormats[attachmentCount++] = gd.FormatCapabilities.ConvertToVkFormat(state.DepthStencilFormat); + bool isNotMsOrSupportsStorage = !state.DepthStencilFormat.IsImageCompatible() || + gd.Capabilities.SupportsShaderStorageImageMultisample; + + pipeline.Internal.AttachmentFormats[attachmentCount++] = gd.FormatCapabilities.ConvertToVkFormat(state.DepthStencilFormat, isNotMsOrSupportsStorage); } pipeline.ColorBlendAttachmentStateCount = (uint)(maxColorAttachmentIndex + 1); diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs b/src/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs index ad26ff7b3..3ed87206f 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs @@ -1,6 +1,7 @@ using Ryujinx.Common.Memory; using Silk.NET.Vulkan; using Silk.NET.Vulkan.Extensions.EXT; +using System; namespace Ryujinx.Graphics.Vulkan { @@ -27,6 +28,7 @@ namespace Ryujinx.Graphics.Vulkan public uint ViewportsCount; public Array16 Viewports; + [Flags] private enum DirtyFlags { None = 0, diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineFull.cs b/src/Ryujinx.Graphics.Vulkan/PipelineFull.cs index 54d43bdba..b948f8f0b 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineFull.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineFull.cs @@ -22,10 +22,10 @@ namespace Ryujinx.Graphics.Vulkan public PipelineFull(VulkanRenderer gd, Device device) : base(gd, device) { - _activeQueries = new List<(QueryPool, bool)>(); - _pendingQueryCopies = new(); - _backingSwaps = new(); - _activeBufferMirrors = new(); + _activeQueries = []; + _pendingQueryCopies = []; + _backingSwaps = []; + _activeBufferMirrors = []; CommandBuffer = (Cbs = gd.CommandBufferPool.Rent()).CommandBuffer; @@ -34,7 +34,7 @@ namespace Ryujinx.Graphics.Vulkan private void CopyPendingQuery() { - foreach (var query in _pendingQueryCopies) + foreach (BufferedQuery query in _pendingQueryCopies) { query.PoolCopy(Cbs); } @@ -54,7 +54,7 @@ namespace Ryujinx.Graphics.Vulkan // We can't use CmdClearAttachments if not writing all components, // because on Vulkan, the pipeline state does not affect clears. // On proprietary Adreno drivers, CmdClearAttachments appears to execute out of order, so it's better to not use it at all. - var dstTexture = FramebufferParams.GetColorView(index); + TextureView dstTexture = FramebufferParams.GetColorView(index); if (dstTexture == null) { return; @@ -95,7 +95,7 @@ namespace Ryujinx.Graphics.Vulkan // We can't use CmdClearAttachments if not clearing all (mask is all ones, 0xFF) or none (mask is 0) of the stencil bits, // because on Vulkan, the pipeline state does not affect clears. // On proprietary Adreno drivers, CmdClearAttachments appears to execute out of order, so it's better to not use it at all. - var dstTexture = FramebufferParams.GetDepthStencilView(); + TextureView dstTexture = FramebufferParams.GetDepthStencilView(); if (dstTexture == null) { return; @@ -246,7 +246,7 @@ namespace Ryujinx.Graphics.Vulkan AutoFlush.RegisterFlush(DrawCount); EndRenderPass(); - foreach ((var queryPool, _) in _activeQueries) + foreach ((QueryPool queryPool, _) in _activeQueries) { Gd.Api.CmdEndQuery(CommandBuffer, queryPool, 0); } @@ -271,7 +271,7 @@ namespace Ryujinx.Graphics.Vulkan _activeBufferMirrors.Clear(); - foreach ((var queryPool, var isOcclusion) in _activeQueries) + foreach ((QueryPool queryPool, bool isOcclusion) in _activeQueries) { bool isPrecise = Gd.Capabilities.SupportsPreciseOcclusionQueries && isOcclusion; diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs b/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs index dfbf19013..b9074dfdb 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs @@ -1,5 +1,4 @@ using Silk.NET.Vulkan; -using VkFormat = Silk.NET.Vulkan.Format; namespace Ryujinx.Graphics.Vulkan { diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCache.cs b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCache.cs index 5d0cada96..9a9a703b5 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCache.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCache.cs @@ -25,7 +25,7 @@ namespace Ryujinx.Graphics.Vulkan if (SetDescriptors != null) { - foreach (var setDescriptor in SetDescriptors) + foreach (ResourceDescriptorCollection setDescriptor in SetDescriptors) { hasher.Add(setDescriptor); } @@ -81,7 +81,7 @@ namespace Ryujinx.Graphics.Vulkan ReadOnlyCollection setDescriptors, bool usePushDescriptors) { - var key = new PlceKey(setDescriptors, usePushDescriptors); + PlceKey key = new(setDescriptors, usePushDescriptors); return _plces.GetOrAdd(key, newKey => new PipelineLayoutCacheEntry(gd, device, setDescriptors, usePushDescriptors)); } @@ -90,7 +90,7 @@ namespace Ryujinx.Graphics.Vulkan { if (disposing) { - foreach (var plce in _plces.Values) + foreach (PipelineLayoutCacheEntry plce in _plces.Values) { plce.Dispose(); } diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCacheEntry.cs b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCacheEntry.cs index ae296b033..5beca2efb 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCacheEntry.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutCacheEntry.cs @@ -83,7 +83,7 @@ namespace Ryujinx.Graphics.Vulkan for (int j = 0; j < _dsCache[i].Length; j++) { - _dsCache[i][j] = new List>(); + _dsCache[i][j] = []; } } @@ -114,7 +114,7 @@ namespace Ryujinx.Graphics.Vulkan { int count = 0; - foreach (var descriptor in setDescriptors[setIndex].Descriptors) + foreach (ResourceDescriptor descriptor in setDescriptors[setIndex].Descriptors) { count += descriptor.Count; } @@ -148,11 +148,11 @@ namespace Ryujinx.Graphics.Vulkan public Auto GetNewDescriptorSetCollection(int setIndex, out bool isNew) { - var list = _currentDsCache[setIndex]; + List> list = _currentDsCache[setIndex]; int index = _dsCacheCursor[setIndex]++; if (index == list.Count) { - var dsc = _descriptorSetManager.AllocateDescriptorSet( + Auto dsc = _descriptorSetManager.AllocateDescriptorSet( _gd.Api, DescriptorSetLayouts[setIndex], _poolSizes[setIndex], @@ -173,8 +173,8 @@ namespace Ryujinx.Graphics.Vulkan { FreeCompletedManualDescriptorSets(); - var list = _manualDsCache[setIndex] ??= new(); - var span = CollectionsMarshal.AsSpan(list); + List list = _manualDsCache[setIndex] ??= []; + Span span = CollectionsMarshal.AsSpan(list); Queue freeQueue = _freeManualDsCacheEntries[setIndex]; @@ -195,7 +195,7 @@ namespace Ryujinx.Graphics.Vulkan } // Otherwise create a new descriptor set, and add to our pending queue for command buffer consumption tracking. - var dsc = _descriptorSetManager.AllocateDescriptorSet( + Auto dsc = _descriptorSetManager.AllocateDescriptorSet( _gd.Api, DescriptorSetLayouts[setIndex], _poolSizes[setIndex], @@ -214,9 +214,9 @@ namespace Ryujinx.Graphics.Vulkan { FreeCompletedManualDescriptorSets(); - var list = _manualDsCache[setIndex]; - var span = CollectionsMarshal.AsSpan(list); - ref var entry = ref span[cacheIndex]; + List list = _manualDsCache[setIndex]; + Span span = CollectionsMarshal.AsSpan(list); + ref ManualDescriptorSetEntry entry = ref span[cacheIndex]; uint cbMask = 1u << cbs.CommandBufferIndex; @@ -231,15 +231,15 @@ namespace Ryujinx.Graphics.Vulkan private void FreeCompletedManualDescriptorSets() { FenceHolder signalledFence = null; - while (_pendingManualDsConsumptions.TryPeek(out var pds) && (pds.Fence == signalledFence || pds.Fence.IsSignaled())) + while (_pendingManualDsConsumptions.TryPeek(out PendingManualDsConsumption pds) && (pds.Fence == signalledFence || pds.Fence.IsSignaled())) { signalledFence = pds.Fence; // Already checked - don't need to do it again. - var dequeued = _pendingManualDsConsumptions.Dequeue(); + PendingManualDsConsumption dequeued = _pendingManualDsConsumptions.Dequeue(); Debug.Assert(dequeued.Fence == pds.Fence); pds.Fence.Put(); - var span = CollectionsMarshal.AsSpan(_manualDsCache[dequeued.SetIndex]); - ref var entry = ref span[dequeued.CacheIndex]; + Span span = CollectionsMarshal.AsSpan(_manualDsCache[dequeued.SetIndex]); + ref ManualDescriptorSetEntry entry = ref span[dequeued.CacheIndex]; entry.CbRefMask &= ~(1u << dequeued.CommandBufferIndex); if (!entry.InUse && entry.CbRefMask == 0) @@ -252,8 +252,8 @@ namespace Ryujinx.Graphics.Vulkan public void ReleaseManualDescriptorSetCollection(int setIndex, int cacheIndex) { - var list = _manualDsCache[setIndex]; - var span = CollectionsMarshal.AsSpan(list); + List list = _manualDsCache[setIndex]; + Span span = CollectionsMarshal.AsSpan(list); span[cacheIndex].InUse = false; @@ -366,7 +366,7 @@ namespace Ryujinx.Graphics.Vulkan _gd.Api.DestroyDescriptorSetLayout(_device, DescriptorSetLayouts[i], null); } - while (_pendingManualDsConsumptions.TryDequeue(out var pds)) + while (_pendingManualDsConsumptions.TryDequeue(out PendingManualDsConsumption pds)) { pds.Fence.Put(); } diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs index 8d7815616..612a8b25d 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineLayoutFactory.cs @@ -1,7 +1,5 @@ -using Ryujinx.Common.Memory; using Ryujinx.Graphics.GAL; using Silk.NET.Vulkan; -using System; using System.Collections.ObjectModel; namespace Ryujinx.Graphics.Vulkan @@ -83,7 +81,7 @@ namespace Ryujinx.Graphics.Vulkan updateAfterBindFlags[setIndex] = true; } - var descriptorSetLayoutCreateInfo = new DescriptorSetLayoutCreateInfo + DescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo = new() { SType = StructureType.DescriptorSetLayoutCreateInfo, PBindings = pLayoutBindings, @@ -99,7 +97,7 @@ namespace Ryujinx.Graphics.Vulkan fixed (DescriptorSetLayout* pLayouts = layouts) { - var pipelineLayoutCreateInfo = new PipelineLayoutCreateInfo + PipelineLayoutCreateInfo pipelineLayoutCreateInfo = new() { SType = StructureType.PipelineLayoutCreateInfo, PSetLayouts = pLayouts, diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs index a726b9edb..fa815d96c 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs @@ -333,12 +333,12 @@ namespace Ryujinx.Graphics.Vulkan ShaderCollection program, PipelineCache cache) { - if (program.TryGetComputePipeline(ref SpecializationData, out var pipeline)) + if (program.TryGetComputePipeline(ref SpecializationData, out Auto pipeline)) { return pipeline; } - var pipelineCreateInfo = new ComputePipelineCreateInfo + ComputePipelineCreateInfo pipelineCreateInfo = new() { SType = StructureType.ComputePipelineCreateInfo, Stage = Stages[0], @@ -350,7 +350,7 @@ namespace Ryujinx.Graphics.Vulkan bool hasSpec = program.SpecDescriptions != null; - var desc = hasSpec ? program.SpecDescriptions[0] : SpecDescription.Empty; + SpecDescription desc = hasSpec ? program.SpecDescriptions[0] : SpecDescription.Empty; if (hasSpec && SpecializationData.Length < (int)desc.Info.DataSize) { @@ -386,7 +386,7 @@ namespace Ryujinx.Graphics.Vulkan RenderPass renderPass, bool throwOnError = false) { - if (program.TryGetGraphicsPipeline(ref Internal, out var pipeline)) + if (program.TryGetGraphicsPipeline(ref Internal, out Auto pipeline)) { return pipeline; } @@ -405,7 +405,7 @@ namespace Ryujinx.Graphics.Vulkan fixed (VertexInputBindingDescription* pVertexBindingDescriptions = &Internal.VertexBindingDescriptions[0]) fixed (PipelineColorBlendAttachmentState* pColorBlendAttachmentState = &Internal.ColorBlendAttachmentState[0]) { - var vertexInputState = new PipelineVertexInputStateCreateInfo + PipelineVertexInputStateCreateInfo vertexInputState = new() { SType = StructureType.PipelineVertexInputStateCreateInfo, VertexAttributeDescriptionCount = VertexAttributeDescriptionsCount, @@ -433,29 +433,29 @@ namespace Ryujinx.Graphics.Vulkan } else { - topologySupportsRestart = Topology == PrimitiveTopology.LineStrip || - Topology == PrimitiveTopology.TriangleStrip || - Topology == PrimitiveTopology.TriangleFan || - Topology == PrimitiveTopology.LineStripWithAdjacency || - Topology == PrimitiveTopology.TriangleStripWithAdjacency; + topologySupportsRestart = Topology is PrimitiveTopology.LineStrip or + PrimitiveTopology.TriangleStrip or + PrimitiveTopology.TriangleFan or + PrimitiveTopology.LineStripWithAdjacency or + PrimitiveTopology.TriangleStripWithAdjacency; } primitiveRestartEnable &= topologySupportsRestart; - var inputAssemblyState = new PipelineInputAssemblyStateCreateInfo + PipelineInputAssemblyStateCreateInfo inputAssemblyState = new() { SType = StructureType.PipelineInputAssemblyStateCreateInfo, PrimitiveRestartEnable = primitiveRestartEnable, Topology = HasTessellationControlShader ? PrimitiveTopology.PatchList : Topology, }; - var tessellationState = new PipelineTessellationStateCreateInfo + PipelineTessellationStateCreateInfo tessellationState = new() { SType = StructureType.PipelineTessellationStateCreateInfo, PatchControlPoints = PatchControlPoints, }; - var rasterizationState = new PipelineRasterizationStateCreateInfo + PipelineRasterizationStateCreateInfo rasterizationState = new() { SType = StructureType.PipelineRasterizationStateCreateInfo, DepthClampEnable = DepthClampEnable, @@ -467,7 +467,7 @@ namespace Ryujinx.Graphics.Vulkan DepthBiasEnable = DepthBiasEnable, }; - var viewportState = new PipelineViewportStateCreateInfo + PipelineViewportStateCreateInfo viewportState = new() { SType = StructureType.PipelineViewportStateCreateInfo, ViewportCount = ViewportsCount, @@ -476,7 +476,7 @@ namespace Ryujinx.Graphics.Vulkan if (gd.Capabilities.SupportsDepthClipControl) { - var viewportDepthClipControlState = new PipelineViewportDepthClipControlCreateInfoEXT + PipelineViewportDepthClipControlCreateInfoEXT viewportDepthClipControlState = new() { SType = StructureType.PipelineViewportDepthClipControlCreateInfoExt, NegativeOneToOne = DepthMode, @@ -485,7 +485,7 @@ namespace Ryujinx.Graphics.Vulkan viewportState.PNext = &viewportDepthClipControlState; } - var multisampleState = new PipelineMultisampleStateCreateInfo + PipelineMultisampleStateCreateInfo multisampleState = new() { SType = StructureType.PipelineMultisampleStateCreateInfo, SampleShadingEnable = false, @@ -495,19 +495,19 @@ namespace Ryujinx.Graphics.Vulkan AlphaToOneEnable = AlphaToOneEnable, }; - var stencilFront = new StencilOpState( + StencilOpState stencilFront = new( StencilFrontFailOp, StencilFrontPassOp, StencilFrontDepthFailOp, StencilFrontCompareOp); - var stencilBack = new StencilOpState( + StencilOpState stencilBack = new( StencilBackFailOp, StencilBackPassOp, StencilBackDepthFailOp, StencilBackCompareOp); - var depthStencilState = new PipelineDepthStencilStateCreateInfo + PipelineDepthStencilStateCreateInfo depthStencilState = new() { SType = StructureType.PipelineDepthStencilStateCreateInfo, DepthTestEnable = DepthTestEnable, @@ -544,7 +544,7 @@ namespace Ryujinx.Graphics.Vulkan // so we need to force disable them here. bool logicOpEnable = LogicOpEnable && (gd.Vendor == Vendor.Nvidia || Internal.LogicOpsAllowed); - var colorBlendState = new PipelineColorBlendStateCreateInfo + PipelineColorBlendStateCreateInfo colorBlendState = new() { SType = StructureType.PipelineColorBlendStateCreateInfo, LogicOpEnable = logicOpEnable, @@ -595,7 +595,7 @@ namespace Ryujinx.Graphics.Vulkan dynamicStates[dynamicStatesCount++] = DynamicState.AttachmentFeedbackLoopEnableExt; } - var pipelineDynamicStateCreateInfo = new PipelineDynamicStateCreateInfo + PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo = new() { SType = StructureType.PipelineDynamicStateCreateInfo, DynamicStateCount = (uint)dynamicStatesCount, @@ -619,7 +619,7 @@ namespace Ryujinx.Graphics.Vulkan } } - var pipelineCreateInfo = new GraphicsPipelineCreateInfo + GraphicsPipelineCreateInfo pipelineCreateInfo = new() { SType = StructureType.GraphicsPipelineCreateInfo, Flags = flags, @@ -677,12 +677,12 @@ namespace Ryujinx.Graphics.Vulkan for (int index = 0; index < VertexAttributeDescriptionsCount; index++) { - var attribute = Internal.VertexAttributeDescriptions[index]; + VertexInputAttributeDescription attribute = Internal.VertexAttributeDescriptions[index]; int vbIndex = GetVertexBufferIndex(attribute.Binding); if (vbIndex >= 0) { - ref var vb = ref Internal.VertexBindingDescriptions[vbIndex]; + ref VertexInputBindingDescription vb = ref Internal.VertexBindingDescriptions[vbIndex]; Format format = attribute.Format; diff --git a/src/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs b/src/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs index 5d48a6622..4763007f4 100644 --- a/src/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs +++ b/src/Ryujinx.Graphics.Vulkan/Queries/BufferedQuery.cs @@ -4,6 +4,7 @@ using Silk.NET.Vulkan; using System; using System.Runtime.InteropServices; using System.Threading; +using Buffer = Silk.NET.Vulkan.Buffer; namespace Ryujinx.Graphics.Vulkan.Queries { @@ -44,7 +45,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries QueryPipelineStatisticFlags flags = type == CounterType.PrimitivesGenerated ? QueryPipelineStatisticFlags.GeometryShaderPrimitivesBit : 0; - var queryPoolCreateInfo = new QueryPoolCreateInfo + QueryPoolCreateInfo queryPoolCreateInfo = new() { SType = StructureType.QueryPoolCreateInfo, QueryCount = 1, @@ -55,7 +56,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries gd.Api.CreateQueryPool(device, in queryPoolCreateInfo, null, out _queryPool).ThrowOnError(); } - var buffer = gd.BufferManager.Create(gd, sizeof(long), forConditionalRendering: true); + BufferHolder buffer = gd.BufferManager.Create(gd, sizeof(long), forConditionalRendering: true); _bufferMap = buffer.Map(0, sizeof(long)); _defaultValue = result32Bit ? DefaultValueInt : DefaultValue; @@ -104,6 +105,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries bool isOcclusion = _type == CounterType.SamplesPassed; _pipeline.BeginQuery(this, _queryPool, needsReset, isOcclusion, isOcclusion && resetSequence != null); } + _resetSequence = null; } @@ -183,7 +185,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries public void PoolCopy(CommandBufferScoped cbs) { - var buffer = _buffer.GetBuffer(cbs.CommandBuffer, true).Get(cbs, 0, sizeof(long), true).Value; + Buffer buffer = _buffer.GetBuffer(cbs.CommandBuffer, true).Get(cbs, 0, sizeof(long), true).Value; QueryResultFlags flags = QueryResultFlags.ResultWaitBit; @@ -210,6 +212,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries { _api.DestroyQueryPool(_device, _queryPool, null); } + _queryPool = default; } } diff --git a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs index 0d133e50e..84e75bec0 100644 --- a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs +++ b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueue.cs @@ -2,7 +2,6 @@ using Ryujinx.Graphics.GAL; using Silk.NET.Vulkan; using System; using System.Collections.Generic; -using System.Linq; using System.Threading; namespace Ryujinx.Graphics.Vulkan.Queries @@ -24,7 +23,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries private ulong _accumulatedCounter; private int _waiterCount; - private readonly object _lock = new(); + private readonly Lock _lock = new(); private readonly Queue _queryPool; private readonly AutoResetEvent _queuedEvent = new(false); @@ -52,7 +51,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries _current = new CounterQueueEvent(this, type, 0); - _consumerThread = new Thread(EventConsumer); + _consumerThread = new Thread(EventConsumer) { Name = "CPU.CounterQueue." + (int)type }; _consumerThread.Start(); } @@ -199,6 +198,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries { return; // If not blocking, then return when we encounter an event that is not ready yet. } + _events.Dequeue(); } } diff --git a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs index 14d3050bf..0bac3be12 100644 --- a/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs +++ b/src/Ryujinx.Graphics.Vulkan/Queries/CounterQueueEvent.cs @@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries private bool _hostAccessReserved; private int _refCount = 1; // Starts with a reference from the counter queue. - private readonly object _lock = new(); + private readonly Lock _lock = new(); private ulong _result = ulong.MaxValue; private double _divisor = 1f; diff --git a/src/Ryujinx.Graphics.Vulkan/Queries/Counters.cs b/src/Ryujinx.Graphics.Vulkan/Queries/Counters.cs index 518ede5f3..c0e848f03 100644 --- a/src/Ryujinx.Graphics.Vulkan/Queries/Counters.cs +++ b/src/Ryujinx.Graphics.Vulkan/Queries/Counters.cs @@ -13,7 +13,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries { _pipeline = pipeline; - int count = Enum.GetNames(typeof(CounterType)).Length; + int count = Enum.GetNames().Length; _counterQueues = new CounterQueue[count]; @@ -26,7 +26,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries public void ResetCounterPool() { - foreach (var queue in _counterQueues) + foreach (CounterQueue queue in _counterQueues) { queue.ResetCounterPool(); } @@ -49,7 +49,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries public void Update() { - foreach (var queue in _counterQueues) + foreach (CounterQueue queue in _counterQueues) { queue.Flush(false); } @@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries public void Dispose() { - foreach (var queue in _counterQueues) + foreach (CounterQueue queue in _counterQueues) { queue.Dispose(); } diff --git a/src/Ryujinx.Graphics.Vulkan/RenderPassCacheKey.cs b/src/Ryujinx.Graphics.Vulkan/RenderPassCacheKey.cs index 7c57b8feb..c3c3c2c61 100644 --- a/src/Ryujinx.Graphics.Vulkan/RenderPassCacheKey.cs +++ b/src/Ryujinx.Graphics.Vulkan/RenderPassCacheKey.cs @@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Vulkan if (_colors != null) { - foreach (var color in _colors) + foreach (TextureView color in _colors) { hc.Add(color); } diff --git a/src/Ryujinx.Graphics.Vulkan/RenderPassHolder.cs b/src/Ryujinx.Graphics.Vulkan/RenderPassHolder.cs index a364c5716..2c2d381a9 100644 --- a/src/Ryujinx.Graphics.Vulkan/RenderPassHolder.cs +++ b/src/Ryujinx.Graphics.Vulkan/RenderPassHolder.cs @@ -47,14 +47,14 @@ namespace Ryujinx.Graphics.Vulkan AttachmentDescription[] attachmentDescs = null; - var subpass = new SubpassDescription + SubpassDescription subpass = new() { PipelineBindPoint = PipelineBindPoint.Graphics, }; AttachmentReference* attachmentReferences = stackalloc AttachmentReference[MaxAttachments]; - var hasFramebuffer = fb != null; + bool hasFramebuffer = fb != null; if (hasFramebuffer && fb.AttachmentsCount != 0) { @@ -110,11 +110,11 @@ namespace Ryujinx.Graphics.Vulkan } } - var subpassDependency = PipelineConverter.CreateSubpassDependency(gd); + SubpassDependency subpassDependency = PipelineConverter.CreateSubpassDependency(gd); fixed (AttachmentDescription* pAttachmentDescs = attachmentDescs) { - var renderPassCreateInfo = new RenderPassCreateInfo + RenderPassCreateInfo renderPassCreateInfo = new() { SType = StructureType.RenderPassCreateInfo, PAttachments = pAttachmentDescs, @@ -125,7 +125,7 @@ namespace Ryujinx.Graphics.Vulkan DependencyCount = 1, }; - gd.Api.CreateRenderPass(device, in renderPassCreateInfo, null, out var renderPass).ThrowOnError(); + gd.Api.CreateRenderPass(device, in renderPassCreateInfo, null, out RenderPass renderPass).ThrowOnError(); _renderPass = new Auto(new DisposableRenderPass(gd.Api, device, renderPass)); } @@ -134,9 +134,9 @@ namespace Ryujinx.Graphics.Vulkan // Register this render pass with all render target views. - var textures = fb.GetAttachmentViews(); + TextureView[] textures = fb.GetAttachmentViews(); - foreach (var texture in textures) + foreach (TextureView texture in textures) { texture.AddRenderPass(key, this); } @@ -144,12 +144,12 @@ namespace Ryujinx.Graphics.Vulkan _textures = textures; _key = key; - _forcedFences = new List(); + _forcedFences = []; } public Auto GetFramebuffer(VulkanRenderer gd, CommandBufferScoped cbs, FramebufferParams fb) { - var key = new FramebufferCacheKey(fb.Width, fb.Height, fb.Layers); + FramebufferCacheKey key = new(fb.Width, fb.Height, fb.Layers); if (!_framebuffers.TryGetValue(ref key, out Auto result)) { @@ -201,14 +201,14 @@ namespace Ryujinx.Graphics.Vulkan { // Dispose all framebuffers. - foreach (var fb in _framebuffers.Values) + foreach (Auto fb in _framebuffers.Values) { fb.Dispose(); } // Notify all texture views that this render pass has been disposed. - foreach (var texture in _textures) + foreach (TextureView texture in _textures) { texture.RemoveRenderPass(_key); } diff --git a/src/Ryujinx.Graphics.Vulkan/ResourceArray.cs b/src/Ryujinx.Graphics.Vulkan/ResourceArray.cs index f96b4a845..c97676858 100644 --- a/src/Ryujinx.Graphics.Vulkan/ResourceArray.cs +++ b/src/Ryujinx.Graphics.Vulkan/ResourceArray.cs @@ -42,7 +42,7 @@ namespace Ryujinx.Graphics.Vulkan return true; } - var dsc = program.GetNewManualDescriptorSetCollection(cbs, setIndex, out _cachedDscIndex).Get(cbs); + DescriptorSetCollection dsc = program.GetNewManualDescriptorSetCollection(cbs, setIndex, out _cachedDscIndex).Get(cbs); sets = dsc.GetSets(); diff --git a/src/Ryujinx.Graphics.Vulkan/ResourceLayoutBuilder.cs b/src/Ryujinx.Graphics.Vulkan/ResourceLayoutBuilder.cs index 730a0a2f9..57de355e9 100644 --- a/src/Ryujinx.Graphics.Vulkan/ResourceLayoutBuilder.cs +++ b/src/Ryujinx.Graphics.Vulkan/ResourceLayoutBuilder.cs @@ -18,8 +18,8 @@ namespace Ryujinx.Graphics.Vulkan for (int index = 0; index < TotalSets; index++) { - _resourceDescriptors[index] = new(); - _resourceUsages[index] = new(); + _resourceDescriptors[index] = []; + _resourceUsages[index] = []; } } @@ -42,8 +42,8 @@ namespace Ryujinx.Graphics.Vulkan public ResourceLayout Build() { - var descriptors = new ResourceDescriptorCollection[TotalSets]; - var usages = new ResourceUsageCollection[TotalSets]; + ResourceDescriptorCollection[] descriptors = new ResourceDescriptorCollection[TotalSets]; + ResourceUsageCollection[] usages = new ResourceUsageCollection[TotalSets]; for (int index = 0; index < TotalSets; index++) { diff --git a/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj b/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj index b138e309a..5481e57f2 100644 --- a/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj +++ b/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj @@ -1,7 +1,6 @@ - net8.0 $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Graphics.Vulkan/SamplerHolder.cs b/src/Ryujinx.Graphics.Vulkan/SamplerHolder.cs index 7f37ab139..600f0fafc 100644 --- a/src/Ryujinx.Graphics.Vulkan/SamplerHolder.cs +++ b/src/Ryujinx.Graphics.Vulkan/SamplerHolder.cs @@ -20,15 +20,15 @@ namespace Ryujinx.Graphics.Vulkan float minLod = info.MinLod; float maxLod = info.MaxLod; - if (info.MinFilter == MinFilter.Nearest || info.MinFilter == MinFilter.Linear) + if (info.MinFilter is MinFilter.Nearest or MinFilter.Linear) { minLod = 0; maxLod = 0.25f; } - var borderColor = GetConstrainedBorderColor(info.BorderColor, out var cantConstrain); + BorderColor borderColor = GetConstrainedBorderColor(info.BorderColor, out bool cantConstrain); - var samplerCreateInfo = new Silk.NET.Vulkan.SamplerCreateInfo + Silk.NET.Vulkan.SamplerCreateInfo samplerCreateInfo = new() { SType = StructureType.SamplerCreateInfo, MagFilter = info.MagFilter.Convert(), @@ -52,7 +52,7 @@ namespace Ryujinx.Graphics.Vulkan if (cantConstrain && gd.Capabilities.SupportsCustomBorderColor) { - var color = new ClearColorValue( + ClearColorValue color = new( info.BorderColor.Red, info.BorderColor.Green, info.BorderColor.Blue, @@ -68,7 +68,7 @@ namespace Ryujinx.Graphics.Vulkan samplerCreateInfo.BorderColor = BorderColor.FloatCustomExt; } - gd.Api.CreateSampler(device, in samplerCreateInfo, null, out var sampler).ThrowOnError(); + gd.Api.CreateSampler(device, in samplerCreateInfo, null, out Sampler sampler).ThrowOnError(); _sampler = new Auto(new DisposableSampler(gd.Api, device, sampler)); } diff --git a/src/Ryujinx.Graphics.Vulkan/Shader.cs b/src/Ryujinx.Graphics.Vulkan/Shader.cs index f23b78f51..886371032 100644 --- a/src/Ryujinx.Graphics.Vulkan/Shader.cs +++ b/src/Ryujinx.Graphics.Vulkan/Shader.cs @@ -5,7 +5,9 @@ using shaderc; using Silk.NET.Vulkan; using System; using System.Runtime.InteropServices; +using System.Threading; using System.Threading.Tasks; +using Result = shaderc.Result; namespace Ryujinx.Graphics.Vulkan { @@ -13,7 +15,7 @@ namespace Ryujinx.Graphics.Vulkan { // The shaderc.net dependency's Options constructor and dispose are not thread safe. // Take this lock when using them. - private static readonly object _shaderOptionsLock = new(); + private static readonly Lock _shaderOptionsLock = new(); private static readonly nint _ptrMainEntryPointName = Marshal.StringToHGlobalAnsi("main"); @@ -57,7 +59,7 @@ namespace Ryujinx.Graphics.Vulkan fixed (byte* pCode = spirv) { - var shaderModuleCreateInfo = new ShaderModuleCreateInfo + ShaderModuleCreateInfo shaderModuleCreateInfo = new() { SType = StructureType.ShaderModuleCreateInfo, CodeSize = (uint)spirv.Length, @@ -86,7 +88,7 @@ namespace Ryujinx.Graphics.Vulkan options.SetTargetEnvironment(TargetEnvironment.Vulkan, EnvironmentVersion.Vulkan_1_2); Compiler compiler = new(options); - var scr = compiler.Compile(glsl, "Ryu", GetShaderCShaderStage(stage)); + Result scr = compiler.Compile(glsl, "Ryu", GetShaderCShaderStage(stage)); lock (_shaderOptionsLock) { @@ -100,7 +102,7 @@ namespace Ryujinx.Graphics.Vulkan return null; } - var spirvBytes = new Span((void*)scr.CodePointer, (int)scr.CodeLength); + Span spirvBytes = new((void*)scr.CodePointer, (int)scr.CodeLength); byte[] code = new byte[(scr.CodeLength + 3) & ~3]; diff --git a/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs b/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs index 436914330..c7bb1ba59 100644 --- a/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs +++ b/src/Ryujinx.Graphics.Vulkan/ShaderCollection.cs @@ -81,7 +81,7 @@ namespace Ryujinx.Graphics.Vulkan gd.Shaders.Add(this); - var internalShaders = new Shader[shaders.Length]; + Shader[] internalShaders = new Shader[shaders.Length]; _infos = new PipelineShaderStageCreateInfo[shaders.Length]; @@ -93,7 +93,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < shaders.Length; i++) { - var shader = new Shader(gd.Api, device, shaders[i]); + Shader shader = new(gd.Api, device, shaders[i]); stages |= 1u << shader.StageFlags switch { @@ -168,12 +168,12 @@ namespace Ryujinx.Graphics.Vulkan // If binding 3 is immediately used, use an alternate set of reserved bindings. ReadOnlyCollection uniformUsage = layout.SetUsages[0].Usages; bool hasBinding3 = uniformUsage.Any(x => x.Binding == 3); - int[] reserved = isCompute ? Array.Empty() : gd.GetPushDescriptorReservedBindings(hasBinding3); + int[] reserved = isCompute ? [] : gd.GetPushDescriptorReservedBindings(hasBinding3); // Can't use any of the reserved usages. for (int i = 0; i < uniformUsage.Count; i++) { - var binding = uniformUsage[i].Binding; + int binding = uniformUsage[i].Binding; if (reserved.Contains(binding) || binding >= Constants.MaxPushDescriptorBinding || @@ -182,7 +182,7 @@ namespace Ryujinx.Graphics.Vulkan return false; } } - + //Prevent the sum of descriptors from exceeding MaxPushDescriptors int totalDescriptors = 0; foreach (ResourceDescriptor desc in layout.Sets.First().Descriptors) @@ -190,6 +190,7 @@ namespace Ryujinx.Graphics.Vulkan if (!reserved.Contains(desc.Binding)) totalDescriptors += desc.Count; } + if (totalDescriptors > gd.Capabilities.MaxPushDescriptors) return false; @@ -203,7 +204,7 @@ namespace Ryujinx.Graphics.Vulkan // The reserved bindings were selected when determining if push descriptors could be used. int[] reserved = gd.GetPushDescriptorReservedBindings(false); - var result = new ResourceDescriptorCollection[sets.Count]; + ResourceDescriptorCollection[] result = new ResourceDescriptorCollection[sets.Count]; for (int i = 0; i < sets.Count; i++) { @@ -212,7 +213,7 @@ namespace Ryujinx.Graphics.Vulkan // Push descriptors apply here. Remove reserved bindings. ResourceDescriptorCollection original = sets[i]; - var pdUniforms = new ResourceDescriptor[original.Descriptors.Count]; + ResourceDescriptor[] pdUniforms = new ResourceDescriptor[original.Descriptors.Count]; int j = 0; foreach (ResourceDescriptor descriptor in original.Descriptors) @@ -249,7 +250,7 @@ namespace Ryujinx.Graphics.Vulkan for (int setIndex = 0; setIndex < sets.Count; setIndex++) { - List currentSegments = new(); + List currentSegments = []; ResourceDescriptor currentDescriptor = default; int currentCount = 0; @@ -307,7 +308,7 @@ namespace Ryujinx.Graphics.Vulkan for (int setIndex = 0; setIndex < setUsages.Count; setIndex++) { - List currentSegments = new(); + List currentSegments = []; ResourceUsage currentUsage = default; int currentCount = 0; @@ -364,7 +365,7 @@ namespace Ryujinx.Graphics.Vulkan private DescriptorSetTemplate[] BuildTemplates(bool usePushDescriptors) { - var templates = new DescriptorSetTemplate[BindingSegments.Length]; + DescriptorSetTemplate[] templates = new DescriptorSetTemplate[BindingSegments.Length]; for (int setIndex = 0; setIndex < BindingSegments.Length; setIndex++) { @@ -391,7 +392,7 @@ namespace Ryujinx.Graphics.Vulkan return templates; } - private PipelineStageFlags GetPipelineStages(ResourceStages stages) + private static PipelineStageFlags GetPipelineStages(ResourceStages stages) { PipelineStageFlags result = 0; @@ -428,14 +429,14 @@ namespace Ryujinx.Graphics.Vulkan return result; } - private (PipelineStageFlags Buffer, PipelineStageFlags Texture) BuildIncoherentStages(ReadOnlyCollection setUsages) + private static (PipelineStageFlags Buffer, PipelineStageFlags Texture) BuildIncoherentStages(ReadOnlyCollection setUsages) { PipelineStageFlags buffer = PipelineStageFlags.None; PipelineStageFlags texture = PipelineStageFlags.None; - foreach (var set in setUsages) + foreach (ResourceUsageCollection set in setUsages) { - foreach (var range in set.Usages) + foreach (ResourceUsage range in set.Usages) { if (range.Write) { @@ -498,7 +499,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < _shaders.Length; i++) { - var shader = _shaders[i]; + Shader shader = _shaders[i]; if (shader.CompileStatus != ProgramLinkStatus.Success) { @@ -557,12 +558,12 @@ namespace Ryujinx.Graphics.Vulkan // First, we need to create a render pass object compatible with the one that will be used at runtime. // The active attachment formats have been provided by the abstraction layer. - var renderPass = CreateDummyRenderPass(); + DisposableRenderPass renderPass = CreateDummyRenderPass(); PipelineState pipeline = _state.ToVulkanPipelineState(_gd); // Copy the shader stage info to the pipeline. - var stages = pipeline.Stages.AsSpan(); + Span stages = pipeline.Stages.AsSpan(); for (int i = 0; i < _shaders.Length; i++) { diff --git a/src/Ryujinx.Graphics.Vulkan/SpecInfo.cs b/src/Ryujinx.Graphics.Vulkan/SpecInfo.cs index ecb2abfc6..73303685b 100644 --- a/src/Ryujinx.Graphics.Vulkan/SpecInfo.cs +++ b/src/Ryujinx.Graphics.Vulkan/SpecInfo.cs @@ -29,7 +29,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < Map.Length; ++i) { - var typeSize = SizeOf(description[i].Type); + uint typeSize = SizeOf(description[i].Type); Map[i] = new SpecializationMapEntry(description[i].Id, structSize, typeSize); structSize += typeSize; } @@ -89,7 +89,7 @@ namespace Ryujinx.Graphics.Vulkan _data = new byte[data.Length]; data.CopyTo(_data); - var hc = new HashCode(); + HashCode hc = new(); hc.AddBytes(data); _hash = hc.ToHashCode(); } diff --git a/src/Ryujinx.Graphics.Vulkan/StagingBuffer.cs b/src/Ryujinx.Graphics.Vulkan/StagingBuffer.cs index 90a47bb67..6470354cf 100644 --- a/src/Ryujinx.Graphics.Vulkan/StagingBuffer.cs +++ b/src/Ryujinx.Graphics.Vulkan/StagingBuffer.cs @@ -107,8 +107,8 @@ namespace Ryujinx.Graphics.Vulkan private void PushDataImpl(CommandBufferScoped cbs, BufferHolder dst, int dstOffset, ReadOnlySpan data) { - var srcBuffer = _buffer.GetBuffer(); - var dstBuffer = dst.GetBuffer(cbs.CommandBuffer, dstOffset, data.Length, true); + Auto srcBuffer = _buffer.GetBuffer(); + Auto dstBuffer = dst.GetBuffer(cbs.CommandBuffer, dstOffset, data.Length, true); int offset = _freeOffset; int capacity = BufferSize - offset; @@ -242,7 +242,7 @@ namespace Ryujinx.Graphics.Vulkan private bool WaitFreeCompleted(CommandBufferPool cbp) { - if (_pendingCopies.TryPeek(out var pc)) + if (_pendingCopies.TryPeek(out PendingCopy pc)) { if (!pc.Fence.IsSignaled()) { @@ -254,7 +254,7 @@ namespace Ryujinx.Graphics.Vulkan pc.Fence.Wait(); } - var dequeued = _pendingCopies.Dequeue(); + PendingCopy dequeued = _pendingCopies.Dequeue(); Debug.Assert(dequeued.Fence == pc.Fence); _freeSize += pc.Size; pc.Fence.Put(); @@ -266,10 +266,10 @@ namespace Ryujinx.Graphics.Vulkan public void FreeCompleted() { FenceHolder signalledFence = null; - while (_pendingCopies.TryPeek(out var pc) && (pc.Fence == signalledFence || pc.Fence.IsSignaled())) + while (_pendingCopies.TryPeek(out PendingCopy pc) && (pc.Fence == signalledFence || pc.Fence.IsSignaled())) { signalledFence = pc.Fence; // Already checked - don't need to do it again. - var dequeued = _pendingCopies.Dequeue(); + PendingCopy dequeued = _pendingCopies.Dequeue(); Debug.Assert(dequeued.Fence == pc.Fence); _freeSize += pc.Size; pc.Fence.Put(); @@ -282,7 +282,7 @@ namespace Ryujinx.Graphics.Vulkan { _gd.BufferManager.Delete(Handle); - while (_pendingCopies.TryDequeue(out var pc)) + while (_pendingCopies.TryDequeue(out PendingCopy pc)) { pc.Fence.Put(); } diff --git a/src/Ryujinx.Graphics.Vulkan/SyncManager.cs b/src/Ryujinx.Graphics.Vulkan/SyncManager.cs index 35e9ab971..5f6214a4f 100644 --- a/src/Ryujinx.Graphics.Vulkan/SyncManager.cs +++ b/src/Ryujinx.Graphics.Vulkan/SyncManager.cs @@ -33,7 +33,7 @@ namespace Ryujinx.Graphics.Vulkan { _gd = gd; _device = device; - _handles = new List(); + _handles = []; } public void RegisterFlush() diff --git a/src/Ryujinx.Graphics.Vulkan/TextureArray.cs b/src/Ryujinx.Graphics.Vulkan/TextureArray.cs index 99238b1f5..2511f5711 100644 --- a/src/Ryujinx.Graphics.Vulkan/TextureArray.cs +++ b/src/Ryujinx.Graphics.Vulkan/TextureArray.cs @@ -113,7 +113,7 @@ namespace Ryujinx.Graphics.Vulkan if (storages == null) { - storages = new HashSet(); + storages = []; for (int index = 0; index < _textureRefs.Length; index++) { @@ -148,8 +148,8 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < textures.Length; i++) { - ref var texture = ref textures[i]; - ref var refs = ref _textureRefs[i]; + ref DescriptorImageInfo texture = ref textures[i]; + ref TextureRef refs = ref _textureRefs[i]; if (i > 0 && _textureRefs[i - 1].View == refs.View && _textureRefs[i - 1].Sampler == refs.Sampler) { diff --git a/src/Ryujinx.Graphics.Vulkan/TextureBuffer.cs b/src/Ryujinx.Graphics.Vulkan/TextureBuffer.cs index 073eee2ca..8a2cd2102 100644 --- a/src/Ryujinx.Graphics.Vulkan/TextureBuffer.cs +++ b/src/Ryujinx.Graphics.Vulkan/TextureBuffer.cs @@ -2,8 +2,6 @@ using Ryujinx.Common.Memory; using Ryujinx.Graphics.GAL; using Silk.NET.Vulkan; using System; -using System.Collections.Generic; -using Format = Ryujinx.Graphics.GAL.Format; using VkFormat = Silk.NET.Vulkan.Format; namespace Ryujinx.Graphics.Vulkan diff --git a/src/Ryujinx.Graphics.Vulkan/TextureCopy.cs b/src/Ryujinx.Graphics.Vulkan/TextureCopy.cs index 45cddd772..e0de5692c 100644 --- a/src/Ryujinx.Graphics.Vulkan/TextureCopy.cs +++ b/src/Ryujinx.Graphics.Vulkan/TextureCopy.cs @@ -34,8 +34,8 @@ namespace Ryujinx.Graphics.Vulkan return Math.Clamp(value, 0, max); } - var xy1 = new Offset3D(Clamp(extents.X1, width) >> level, Clamp(extents.Y1, height) >> level, 0); - var xy2 = new Offset3D(Clamp(extents.X2, width) >> level, Clamp(extents.Y2, height) >> level, 1); + Offset3D xy1 = new(Clamp(extents.X1, width) >> level, Clamp(extents.Y1, height) >> level, 0); + Offset3D xy2 = new(Clamp(extents.X2, width) >> level, Clamp(extents.Y2, height) >> level, 1); return (xy1, xy2); } @@ -50,10 +50,10 @@ namespace Ryujinx.Graphics.Vulkan dstAspectFlags = dstInfo.Format.ConvertAspectFlags(); } - var srcOffsets = new ImageBlit.SrcOffsetsBuffer(); - var dstOffsets = new ImageBlit.DstOffsetsBuffer(); + ImageBlit.SrcOffsetsBuffer srcOffsets = new(); + ImageBlit.DstOffsetsBuffer dstOffsets = new(); - var filter = linearFilter && !dstInfo.Format.IsDepthOrStencil() ? Filter.Linear : Filter.Nearest; + Filter filter = linearFilter && !dstInfo.Format.IsDepthOrStencil() ? Filter.Linear : Filter.Nearest; TextureView.InsertImageBarrier( api, @@ -74,13 +74,13 @@ namespace Ryujinx.Graphics.Vulkan for (int level = 0; level < levels; level++) { - var srcSl = new ImageSubresourceLayers(srcAspectFlags, copySrcLevel, (uint)srcLayer, (uint)layers); - var dstSl = new ImageSubresourceLayers(dstAspectFlags, copyDstLevel, (uint)dstLayer, (uint)layers); + ImageSubresourceLayers srcSl = new(srcAspectFlags, copySrcLevel, (uint)srcLayer, (uint)layers); + ImageSubresourceLayers dstSl = new(dstAspectFlags, copyDstLevel, (uint)dstLayer, (uint)layers); (srcOffsets.Element0, srcOffsets.Element1) = ExtentsToOffset3D(srcRegion, srcInfo.Width, srcInfo.Height, level); (dstOffsets.Element0, dstOffsets.Element1) = ExtentsToOffset3D(dstRegion, dstInfo.Width, dstInfo.Height, level); - var region = new ImageBlit + ImageBlit region = new() { SrcSubresource = srcSl, SrcOffsets = srcOffsets, @@ -299,13 +299,13 @@ namespace Ryujinx.Graphics.Vulkan break; } - var srcSl = new ImageSubresourceLayers( + ImageSubresourceLayers srcSl = new( srcAspect, (uint)(srcViewLevel + srcLevel + level), (uint)(srcViewLayer + srcLayer), (uint)srcLayers); - var dstSl = new ImageSubresourceLayers( + ImageSubresourceLayers dstSl = new( dstAspect, (uint)(dstViewLevel + dstLevel + level), (uint)(dstViewLayer + dstLayer), @@ -314,17 +314,17 @@ namespace Ryujinx.Graphics.Vulkan int copyWidth = sizeInBlocks ? BitUtils.DivRoundUp(width, blockWidth) : width; int copyHeight = sizeInBlocks ? BitUtils.DivRoundUp(height, blockHeight) : height; - var extent = new Extent3D((uint)copyWidth, (uint)copyHeight, (uint)srcDepth); + Extent3D extent = new((uint)copyWidth, (uint)copyHeight, (uint)srcDepth); if (srcInfo.Samples > 1 && srcInfo.Samples != dstInfo.Samples) { - var region = new ImageResolve(srcSl, new Offset3D(0, 0, srcZ), dstSl, new Offset3D(0, 0, dstZ), extent); + ImageResolve region = new(srcSl, new Offset3D(0, 0, srcZ), dstSl, new Offset3D(0, 0, dstZ), extent); api.CmdResolveImage(commandBuffer, srcImage, ImageLayout.General, dstImage, ImageLayout.General, 1, in region); } else { - var region = new ImageCopy(srcSl, new Offset3D(0, 0, srcZ), dstSl, new Offset3D(0, 0, dstZ), extent); + ImageCopy region = new(srcSl, new Offset3D(0, 0, srcZ), dstSl, new Offset3D(0, 0, dstZ), extent); api.CmdCopyImage(commandBuffer, srcImage, ImageLayout.General, dstImage, ImageLayout.General, 1, in region); } @@ -360,10 +360,10 @@ namespace Ryujinx.Graphics.Vulkan TextureView src, TextureView dst) { - var dsAttachmentReference = new AttachmentReference2(StructureType.AttachmentReference2, null, 0, ImageLayout.General); - var dsResolveAttachmentReference = new AttachmentReference2(StructureType.AttachmentReference2, null, 1, ImageLayout.General); + AttachmentReference2 dsAttachmentReference = new(StructureType.AttachmentReference2, null, 0, ImageLayout.General); + AttachmentReference2 dsResolveAttachmentReference = new(StructureType.AttachmentReference2, null, 1, ImageLayout.General); - var subpassDsResolve = new SubpassDescriptionDepthStencilResolve + SubpassDescriptionDepthStencilResolve subpassDsResolve = new() { SType = StructureType.SubpassDescriptionDepthStencilResolve, PDepthStencilResolveAttachment = &dsResolveAttachmentReference, @@ -371,7 +371,7 @@ namespace Ryujinx.Graphics.Vulkan StencilResolveMode = ResolveModeFlags.SampleZeroBit, }; - var subpass = new SubpassDescription2 + SubpassDescription2 subpass = new() { SType = StructureType.SubpassDescription2, PipelineBindPoint = PipelineBindPoint.Graphics, @@ -407,11 +407,11 @@ namespace Ryujinx.Graphics.Vulkan ImageLayout.General, ImageLayout.General); - var subpassDependency = PipelineConverter.CreateSubpassDependency2(gd); + SubpassDependency2 subpassDependency = PipelineConverter.CreateSubpassDependency2(gd); fixed (AttachmentDescription2* pAttachmentDescs = attachmentDescs) { - var renderPassCreateInfo = new RenderPassCreateInfo2 + RenderPassCreateInfo2 renderPassCreateInfo = new() { SType = StructureType.RenderPassCreateInfo2, PAttachments = pAttachmentDescs, @@ -422,19 +422,19 @@ namespace Ryujinx.Graphics.Vulkan DependencyCount = 1, }; - gd.Api.CreateRenderPass2(device, in renderPassCreateInfo, null, out var renderPass).ThrowOnError(); + gd.Api.CreateRenderPass2(device, in renderPassCreateInfo, null, out RenderPass renderPass).ThrowOnError(); - using var rp = new Auto(new DisposableRenderPass(gd.Api, device, renderPass)); + using Auto rp = new(new DisposableRenderPass(gd.Api, device, renderPass)); ImageView* attachments = stackalloc ImageView[2]; - var srcView = src.GetImageViewForAttachment(); - var dstView = dst.GetImageViewForAttachment(); + Auto srcView = src.GetImageViewForAttachment(); + Auto dstView = dst.GetImageViewForAttachment(); attachments[0] = srcView.Get(cbs).Value; attachments[1] = dstView.Get(cbs).Value; - var framebufferCreateInfo = new FramebufferCreateInfo + FramebufferCreateInfo framebufferCreateInfo = new() { SType = StructureType.FramebufferCreateInfo, RenderPass = rp.Get(cbs).Value, @@ -445,13 +445,13 @@ namespace Ryujinx.Graphics.Vulkan Layers = (uint)src.Layers, }; - gd.Api.CreateFramebuffer(device, in framebufferCreateInfo, null, out var framebuffer).ThrowOnError(); - using var fb = new Auto(new DisposableFramebuffer(gd.Api, device, framebuffer), null, srcView, dstView); + gd.Api.CreateFramebuffer(device, in framebufferCreateInfo, null, out Framebuffer framebuffer).ThrowOnError(); + using Auto fb = new(new DisposableFramebuffer(gd.Api, device, framebuffer), null, srcView, dstView); - var renderArea = new Rect2D(null, new Extent2D((uint)src.Info.Width, (uint)src.Info.Height)); - var clearValue = new ClearValue(); + Rect2D renderArea = new(null, new Extent2D((uint)src.Info.Width, (uint)src.Info.Height)); + ClearValue clearValue = new(); - var renderPassBeginInfo = new RenderPassBeginInfo + RenderPassBeginInfo renderPassBeginInfo = new() { SType = StructureType.RenderPassBeginInfo, RenderPass = rp.Get(cbs).Value, diff --git a/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs b/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs index 10b36a3f9..3dc605891 100644 --- a/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs +++ b/src/Ryujinx.Graphics.Vulkan/TextureStorage.cs @@ -77,26 +77,28 @@ namespace Ryujinx.Graphics.Vulkan _device = device; _info = info; - var format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format); - var levels = (uint)info.Levels; - var layers = (uint)info.GetLayers(); - var depth = (uint)(info.Target == Target.Texture3D ? info.Depth : 1); + bool isMsImageStorageSupported = gd.Capabilities.SupportsShaderStorageImageMultisample || !info.Target.IsMultisample(); + + VkFormat format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format, isMsImageStorageSupported); + uint levels = (uint)info.Levels; + uint layers = (uint)info.GetLayers(); + uint depth = (uint)(info.Target == Target.Texture3D ? info.Depth : 1); VkFormat = format; _depthOrLayers = info.GetDepthOrLayers(); - var type = info.Target.Convert(); + ImageType type = info.Target.Convert(); - var extent = new Extent3D((uint)info.Width, (uint)info.Height, depth); + Extent3D extent = new((uint)info.Width, (uint)info.Height, depth); - var sampleCountFlags = ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)info.Samples); + SampleCountFlags sampleCountFlags = ConvertToSampleCountFlags(gd.Capabilities.SupportedSampleCounts, (uint)info.Samples); - var usage = GetImageUsage(info.Format, info.Target, gd.Capabilities); + ImageUsageFlags usage = GetImageUsage(info.Format, gd.Capabilities, isMsImageStorageSupported, true); - var flags = ImageCreateFlags.CreateMutableFormatBit | ImageCreateFlags.CreateExtendedUsageBit; + ImageCreateFlags flags = ImageCreateFlags.CreateMutableFormatBit | ImageCreateFlags.CreateExtendedUsageBit; // This flag causes mipmapped texture arrays to break on AMD GCN, so for that copy dependencies are forced for aliasing as cube. - bool isCube = info.Target == Target.Cubemap || info.Target == Target.CubemapArray; + bool isCube = info.Target is Target.Cubemap or Target.CubemapArray; bool cubeCompatible = gd.IsAmdGcn ? isCube : (info.Width == info.Height && layers >= 6); if (type == ImageType.Type2D && cubeCompatible) @@ -109,7 +111,7 @@ namespace Ryujinx.Graphics.Vulkan flags |= ImageCreateFlags.Create2DArrayCompatibleBit; } - var imageCreateInfo = new ImageCreateInfo + ImageCreateInfo imageCreateInfo = new() { SType = StructureType.ImageCreateInfo, ImageType = type, @@ -129,8 +131,8 @@ namespace Ryujinx.Graphics.Vulkan if (foreignAllocation == null) { - gd.Api.GetImageMemoryRequirements(device, _image, out var requirements); - var allocation = gd.MemoryAllocator.AllocateDeviceMemory(requirements, DefaultImageMemoryFlags); + gd.Api.GetImageMemoryRequirements(device, _image, out MemoryRequirements requirements); + MemoryAllocation allocation = gd.MemoryAllocator.AllocateDeviceMemory(requirements, DefaultImageMemoryFlags); if (allocation.Memory.Handle == 0UL) { @@ -151,7 +153,7 @@ namespace Ryujinx.Graphics.Vulkan { _foreignAllocationAuto = foreignAllocation; foreignAllocation.IncrementReferenceCount(); - var allocation = foreignAllocation.GetUnsafe(); + MemoryAllocation allocation = foreignAllocation.GetUnsafe(); gd.Api.BindImageMemory(device, _image, allocation.Memory, allocation.Offset).ThrowOnError(); @@ -165,7 +167,7 @@ namespace Ryujinx.Graphics.Vulkan public TextureStorage CreateAliasedColorForDepthStorageUnsafe(Format format) { - var colorFormat = format switch + Format colorFormat = format switch { Format.S8Uint => Format.R8Unorm, Format.D16Unorm => Format.R16Unorm, @@ -180,11 +182,11 @@ namespace Ryujinx.Graphics.Vulkan public TextureStorage CreateAliasedStorageUnsafe(Format format) { - if (_aliasedStorages == null || !_aliasedStorages.TryGetValue(format, out var storage)) + if (_aliasedStorages == null || !_aliasedStorages.TryGetValue(format, out TextureStorage storage)) { _aliasedStorages ??= new Dictionary(); - var info = NewCreateInfoWith(ref _info, format, _info.BytesPerPixel); + TextureCreateInfo info = NewCreateInfoWith(ref _info, format, _info.BytesPerPixel); storage = new TextureStorage(_gd, _device, info, _allocationAuto); @@ -270,11 +272,11 @@ namespace Ryujinx.Graphics.Vulkan } } - var aspectFlags = _info.Format.ConvertAspectFlags(); + ImageAspectFlags aspectFlags = _info.Format.ConvertAspectFlags(); - var subresourceRange = new ImageSubresourceRange(aspectFlags, 0, (uint)_info.Levels, 0, (uint)_info.GetLayers()); + ImageSubresourceRange subresourceRange = new(aspectFlags, 0, (uint)_info.Levels, 0, (uint)_info.GetLayers()); - var barrier = new ImageMemoryBarrier + ImageMemoryBarrier barrier = new() { SType = StructureType.ImageMemoryBarrier, SrcAccessMask = 0, @@ -305,9 +307,9 @@ namespace Ryujinx.Graphics.Vulkan } } - public static ImageUsageFlags GetImageUsage(Format format, Target target, in HardwareCapabilities capabilities) + public static ImageUsageFlags GetImageUsage(Format format, in HardwareCapabilities capabilities, bool isMsImageStorageSupported, bool extendedUsage) { - var usage = DefaultUsageFlags; + ImageUsageFlags usage = DefaultUsageFlags; if (format.IsDepthOrStencil()) { @@ -318,9 +320,7 @@ namespace Ryujinx.Graphics.Vulkan usage |= ImageUsageFlags.ColorAttachmentBit; } - bool supportsMsStorage = capabilities.SupportsShaderStorageImageMultisample; - - if (format.IsImageCompatible() && (supportsMsStorage || !target.IsMultisample())) + if ((format.IsImageCompatible() && isMsImageStorageSupported) || extendedUsage) { usage |= ImageUsageFlags.StorageBit; } @@ -336,7 +336,7 @@ namespace Ryujinx.Graphics.Vulkan public static SampleCountFlags ConvertToSampleCountFlags(SampleCountFlags supportedSampleCounts, uint samples) { - if (samples == 0 || samples > (uint)SampleCountFlags.Count64Bit) + if (samples is 0 or > ((uint)SampleCountFlags.Count64Bit)) { return SampleCountFlags.Count1Bit; } @@ -402,17 +402,17 @@ namespace Ryujinx.Graphics.Vulkan int rowLength = (Info.GetMipStride(level) / Info.BytesPerPixel) * Info.BlockWidth; - var sl = new ImageSubresourceLayers( + ImageSubresourceLayers sl = new( aspectFlags, (uint)(dstLevel + level), (uint)layer, (uint)layers); - var extent = new Extent3D((uint)width, (uint)height, (uint)depth); + Extent3D extent = new((uint)width, (uint)height, (uint)depth); int z = is3D ? dstLayer : 0; - var region = new BufferImageCopy( + BufferImageCopy region = new( (ulong)offset, (uint)BitUtils.AlignUp(rowLength, Info.BlockWidth), (uint)BitUtils.AlignUp(height, Info.BlockHeight), @@ -601,7 +601,7 @@ namespace Ryujinx.Graphics.Vulkan if (_aliasedStorages != null) { - foreach (var storage in _aliasedStorages.Values) + foreach (TextureStorage storage in _aliasedStorages.Values) { storage.Dispose(); } diff --git a/src/Ryujinx.Graphics.Vulkan/TextureView.cs b/src/Ryujinx.Graphics.Vulkan/TextureView.cs index b7b936809..1cbb7c6e1 100644 --- a/src/Ryujinx.Graphics.Vulkan/TextureView.cs +++ b/src/Ryujinx.Graphics.Vulkan/TextureView.cs @@ -61,30 +61,33 @@ namespace Ryujinx.Graphics.Vulkan gd.Textures.Add(this); - var format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format); - var usage = TextureStorage.GetImageUsage(info.Format, info.Target, gd.Capabilities); - var levels = (uint)info.Levels; - var layers = (uint)info.GetLayers(); + bool isMsImageStorageSupported = gd.Capabilities.SupportsShaderStorageImageMultisample || !info.Target.IsMultisample(); + + VkFormat format = _gd.FormatCapabilities.ConvertToVkFormat(info.Format, isMsImageStorageSupported); + ImageUsageFlags usage = TextureStorage.GetImageUsage(info.Format, gd.Capabilities, isMsImageStorageSupported, false); + + uint levels = (uint)info.Levels; + uint layers = (uint)info.GetLayers(); VkFormat = format; - var type = info.Target.ConvertView(); + ImageViewType type = info.Target.ConvertView(); - var swizzleR = info.SwizzleR.Convert(); - var swizzleG = info.SwizzleG.Convert(); - var swizzleB = info.SwizzleB.Convert(); - var swizzleA = info.SwizzleA.Convert(); + ComponentSwizzle swizzleR = info.SwizzleR.Convert(); + ComponentSwizzle swizzleG = info.SwizzleG.Convert(); + ComponentSwizzle swizzleB = info.SwizzleB.Convert(); + ComponentSwizzle swizzleA = info.SwizzleA.Convert(); - if (info.Format == Format.R5G5B5A1Unorm || - info.Format == Format.R5G5B5X1Unorm || - info.Format == Format.R5G6B5Unorm) + if (info.Format is Format.R5G5B5A1Unorm or + Format.R5G5B5X1Unorm or + Format.R5G6B5Unorm) { (swizzleB, swizzleR) = (swizzleR, swizzleB); } else if (VkFormat == VkFormat.R4G4B4A4UnormPack16 || info.Format == Format.A1B5G5R5Unorm) { - var tempB = swizzleB; - var tempA = swizzleA; + ComponentSwizzle tempB = swizzleB; + ComponentSwizzle tempA = swizzleA; swizzleB = swizzleG; swizzleA = swizzleR; @@ -92,23 +95,23 @@ namespace Ryujinx.Graphics.Vulkan swizzleG = tempB; } - var componentMapping = new ComponentMapping(swizzleR, swizzleG, swizzleB, swizzleA); + ComponentMapping componentMapping = new(swizzleR, swizzleG, swizzleB, swizzleA); - var aspectFlags = info.Format.ConvertAspectFlags(info.DepthStencilMode); - var aspectFlagsDepth = info.Format.ConvertAspectFlags(); + ImageAspectFlags aspectFlags = info.Format.ConvertAspectFlags(info.DepthStencilMode); + ImageAspectFlags aspectFlagsDepth = info.Format.ConvertAspectFlags(); - var subresourceRange = new ImageSubresourceRange(aspectFlags, (uint)firstLevel, levels, (uint)firstLayer, layers); - var subresourceRangeDepth = new ImageSubresourceRange(aspectFlagsDepth, (uint)firstLevel, levels, (uint)firstLayer, layers); + ImageSubresourceRange subresourceRange = new(aspectFlags, (uint)firstLevel, levels, (uint)firstLayer, layers); + ImageSubresourceRange subresourceRangeDepth = new(aspectFlagsDepth, (uint)firstLevel, levels, (uint)firstLayer, layers); unsafe Auto CreateImageView(ComponentMapping cm, ImageSubresourceRange sr, ImageViewType viewType, ImageUsageFlags usageFlags) { - var imageViewUsage = new ImageViewUsageCreateInfo + ImageViewUsageCreateInfo imageViewUsage = new() { SType = StructureType.ImageViewUsageCreateInfo, Usage = usageFlags, }; - var imageCreateInfo = new ImageViewCreateInfo + ImageViewCreateInfo imageCreateInfo = new() { SType = StructureType.ImageViewCreateInfo, Image = storage.GetImageForViewCreation(), @@ -119,7 +122,7 @@ namespace Ryujinx.Graphics.Vulkan PNext = &imageViewUsage, }; - gd.Api.CreateImageView(device, in imageCreateInfo, null, out var imageView).ThrowOnError(); + gd.Api.CreateImageView(device, in imageCreateInfo, null, out ImageView imageView).ThrowOnError(); return new Auto(new DisposableImageView(gd.Api, device, imageView), null, storage.GetImage()); } @@ -133,7 +136,7 @@ namespace Ryujinx.Graphics.Vulkan _imageView = CreateImageView(componentMapping, subresourceRange, type, shaderUsage); // Framebuffer attachments and storage images requires a identity component mapping. - var identityComponentMapping = new ComponentMapping( + ComponentMapping identityComponentMapping = new( ComponentSwizzle.R, ComponentSwizzle.G, ComponentSwizzle.B, @@ -207,8 +210,8 @@ namespace Ryujinx.Graphics.Vulkan public void CopyTo(ITexture destination, int firstLayer, int firstLevel) { - var src = this; - var dst = (TextureView)destination; + TextureView src = this; + TextureView dst = (TextureView)destination; if (!Valid || !dst.Valid) { @@ -217,10 +220,10 @@ namespace Ryujinx.Graphics.Vulkan _gd.PipelineInternal.EndRenderPass(); - var cbs = _gd.PipelineInternal.CurrentCommandBuffer; + CommandBufferScoped cbs = _gd.PipelineInternal.CurrentCommandBuffer; - var srcImage = src.GetImage().Get(cbs).Value; - var dstImage = dst.GetImage().Get(cbs).Value; + Image srcImage = src.GetImage().Get(cbs).Value; + Image dstImage = dst.GetImage().Get(cbs).Value; if (!dst.Info.Target.IsMultisample() && Info.Target.IsMultisample()) { @@ -267,8 +270,8 @@ namespace Ryujinx.Graphics.Vulkan public void CopyTo(ITexture destination, int srcLayer, int dstLayer, int srcLevel, int dstLevel) { - var src = this; - var dst = (TextureView)destination; + TextureView src = this; + TextureView dst = (TextureView)destination; if (!Valid || !dst.Valid) { @@ -277,10 +280,10 @@ namespace Ryujinx.Graphics.Vulkan _gd.PipelineInternal.EndRenderPass(); - var cbs = _gd.PipelineInternal.CurrentCommandBuffer; + CommandBufferScoped cbs = _gd.PipelineInternal.CurrentCommandBuffer; - var srcImage = src.GetImage().Get(cbs).Value; - var dstImage = dst.GetImage().Get(cbs).Value; + Image srcImage = src.GetImage().Get(cbs).Value; + Image dstImage = dst.GetImage().Get(cbs).Value; if (!dst.Info.Target.IsMultisample() && Info.Target.IsMultisample()) { @@ -322,21 +325,21 @@ namespace Ryujinx.Graphics.Vulkan public void CopyTo(ITexture destination, Extents2D srcRegion, Extents2D dstRegion, bool linearFilter) { - var dst = (TextureView)destination; + TextureView dst = (TextureView)destination; if (_gd.CommandBufferPool.OwnedByCurrentThread) { _gd.PipelineInternal.EndRenderPass(); - var cbs = _gd.PipelineInternal.CurrentCommandBuffer; + CommandBufferScoped cbs = _gd.PipelineInternal.CurrentCommandBuffer; CopyToImpl(cbs, dst, srcRegion, dstRegion, linearFilter); } else { - var cbp = _gd.BackgroundResources.Get().GetPool(); + CommandBufferPool cbp = _gd.BackgroundResources.Get().GetPool(); - using var cbs = cbp.Rent(); + using CommandBufferScoped cbs = cbp.Rent(); CopyToImpl(cbs, dst, srcRegion, dstRegion, linearFilter); } @@ -344,10 +347,10 @@ namespace Ryujinx.Graphics.Vulkan private void CopyToImpl(CommandBufferScoped cbs, TextureView dst, Extents2D srcRegion, Extents2D dstRegion, bool linearFilter) { - var src = this; + TextureView src = this; - var srcFormat = GetCompatibleGalFormat(src.Info.Format); - var dstFormat = GetCompatibleGalFormat(dst.Info.Format); + Format srcFormat = GetCompatibleGalFormat(src.Info.Format); + Format dstFormat = GetCompatibleGalFormat(dst.Info.Format); bool srcUsesStorageFormat = src.VkFormat == src.Storage.VkFormat; bool dstUsesStorageFormat = dst.VkFormat == dst.Storage.VkFormat; @@ -569,7 +572,7 @@ namespace Ryujinx.Graphics.Vulkan return this; } - if (_selfManagedViews != null && _selfManagedViews.TryGetValue(format, out var view)) + if (_selfManagedViews != null && _selfManagedViews.TryGetValue(format, out TextureView view)) { return view; } @@ -609,12 +612,12 @@ namespace Ryujinx.Graphics.Vulkan public byte[] GetData(int x, int y, int width, int height) { int size = width * height * Info.BytesPerPixel; - using var bufferHolder = _gd.BufferManager.Create(_gd, size); + using BufferHolder bufferHolder = _gd.BufferManager.Create(_gd, size); - using (var cbs = _gd.CommandBufferPool.Rent()) + using (CommandBufferScoped cbs = _gd.CommandBufferPool.Rent()) { - var buffer = bufferHolder.GetBuffer(cbs.CommandBuffer).Get(cbs).Value; - var image = GetImage().Get(cbs).Value; + VkBuffer buffer = bufferHolder.GetBuffer(cbs.CommandBuffer).Get(cbs).Value; + Image image = GetImage().Get(cbs).Value; CopyFromOrToBuffer(cbs.CommandBuffer, buffer, image, size, true, 0, 0, x, y, width, height); } @@ -656,12 +659,12 @@ namespace Ryujinx.Graphics.Vulkan public void CopyTo(BufferRange range, int layer, int level, int stride) { _gd.PipelineInternal.EndRenderPass(); - var cbs = _gd.PipelineInternal.CurrentCommandBuffer; + CommandBufferScoped cbs = _gd.PipelineInternal.CurrentCommandBuffer; int outSize = Info.GetMipSize(level); int hostSize = GetBufferDataLength(outSize); - var image = GetImage().Get(cbs).Value; + Image image = GetImage().Get(cbs).Value; int offset = range.Offset; Auto autoBuffer = _gd.BufferManager.GetBuffer(cbs.CommandBuffer, range.Handle, true); @@ -770,7 +773,7 @@ namespace Ryujinx.Graphics.Vulkan { int bufferDataLength = GetBufferDataLength(data.Length); - using var bufferHolder = _gd.BufferManager.Create(_gd, bufferDataLength); + using BufferHolder bufferHolder = _gd.BufferManager.Create(_gd, bufferDataLength); Auto imageAuto = GetImage(); @@ -778,7 +781,7 @@ namespace Ryujinx.Graphics.Vulkan bool loadInline = Storage.HasCommandBufferDependency(_gd.PipelineInternal.CurrentCommandBuffer); - var cbs = loadInline ? _gd.PipelineInternal.CurrentCommandBuffer : _gd.PipelineInternal.GetPreloadCommandBuffer(); + CommandBufferScoped cbs = loadInline ? _gd.PipelineInternal.CurrentCommandBuffer : _gd.PipelineInternal.GetPreloadCommandBuffer(); if (loadInline) { @@ -787,8 +790,8 @@ namespace Ryujinx.Graphics.Vulkan CopyDataToBuffer(bufferHolder.GetDataStorage(0, bufferDataLength), data); - var buffer = bufferHolder.GetBuffer(cbs.CommandBuffer).Get(cbs).Value; - var image = imageAuto.Get(cbs).Value; + VkBuffer buffer = bufferHolder.GetBuffer(cbs.CommandBuffer).Get(cbs).Value; + Image image = imageAuto.Get(cbs).Value; if (region.HasValue) { @@ -924,24 +927,24 @@ namespace Ryujinx.Graphics.Vulkan int rowLength = ((stride == 0 ? Info.GetMipStride(dstLevel + level) : stride) / Info.BytesPerPixel) * Info.BlockWidth; - var aspectFlags = Info.Format.ConvertAspectFlags(); + ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags(); if (aspectFlags == (ImageAspectFlags.DepthBit | ImageAspectFlags.StencilBit)) { aspectFlags = ImageAspectFlags.DepthBit; } - var sl = new ImageSubresourceLayers( + ImageSubresourceLayers sl = new( aspectFlags, (uint)(FirstLevel + dstLevel + level), (uint)(FirstLayer + layer), (uint)layers); - var extent = new Extent3D((uint)width, (uint)height, (uint)depth); + Extent3D extent = new((uint)width, (uint)height, (uint)depth); int z = is3D ? dstLayer : 0; - var region = new BufferImageCopy( + BufferImageCopy region = new( (ulong)offset, (uint)AlignUpNpot(rowLength, Info.BlockWidth), (uint)AlignUpNpot(height, Info.BlockHeight), @@ -983,16 +986,16 @@ namespace Ryujinx.Graphics.Vulkan int width, int height) { - var aspectFlags = Info.Format.ConvertAspectFlags(); + ImageAspectFlags aspectFlags = Info.Format.ConvertAspectFlags(); if (aspectFlags == (ImageAspectFlags.DepthBit | ImageAspectFlags.StencilBit)) { aspectFlags = ImageAspectFlags.DepthBit; } - var sl = new ImageSubresourceLayers(aspectFlags, (uint)(FirstLevel + dstLevel), (uint)(FirstLayer + dstLayer), 1); + ImageSubresourceLayers sl = new(aspectFlags, (uint)(FirstLevel + dstLevel), (uint)(FirstLayer + dstLayer), 1); - var extent = new Extent3D((uint)width, (uint)height, 1); + Extent3D extent = new((uint)width, (uint)height, 1); int rowLengthAlignment = Info.BlockWidth; @@ -1002,7 +1005,7 @@ namespace Ryujinx.Graphics.Vulkan rowLengthAlignment = 4 / Info.BytesPerPixel; } - var region = new BufferImageCopy( + BufferImageCopy region = new( 0, (uint)AlignUpNpot(width, rowLengthAlignment), (uint)AlignUpNpot(height, Info.BlockHeight), @@ -1070,7 +1073,7 @@ namespace Ryujinx.Graphics.Vulkan CommandBufferScoped cbs, FramebufferParams fb) { - var key = fb.GetRenderPassCacheKey(); + RenderPassCacheKey key = fb.GetRenderPassCacheKey(); if (_renderPasses == null || !_renderPasses.TryGetValue(ref key, out RenderPassHolder rpHolder)) { @@ -1118,9 +1121,9 @@ namespace Ryujinx.Graphics.Vulkan if (_renderPasses != null) { - var renderPasses = _renderPasses.Values.ToArray(); + RenderPassHolder[] renderPasses = _renderPasses.Values.ToArray(); - foreach (var pass in renderPasses) + foreach (RenderPassHolder pass in renderPasses) { pass.Dispose(); } @@ -1128,7 +1131,7 @@ namespace Ryujinx.Graphics.Vulkan if (_selfManagedViews != null) { - foreach (var view in _selfManagedViews.Values) + foreach (TextureView view in _selfManagedViews.Values) { view.Dispose(); } diff --git a/src/Ryujinx.Graphics.Vulkan/Vendor.cs b/src/Ryujinx.Graphics.Vulkan/Vendor.cs index 55ae0cd81..550ba0221 100644 --- a/src/Ryujinx.Graphics.Vulkan/Vendor.cs +++ b/src/Ryujinx.Graphics.Vulkan/Vendor.cs @@ -1,5 +1,4 @@ using Silk.NET.Vulkan; -using System.Text.RegularExpressions; namespace Ryujinx.Graphics.Vulkan { @@ -16,14 +15,8 @@ namespace Ryujinx.Graphics.Vulkan Unknown, } - static partial class VendorUtils + static class VendorUtils { - [GeneratedRegex("Radeon (((HD|R(5|7|9|X)) )?((M?[2-6]\\d{2}(\\D|$))|([7-8]\\d{3}(\\D|$))|Fury|Nano))|(Pro Duo)")] - public static partial Regex AmdGcnRegex(); - - [GeneratedRegex("NVIDIA GeForce (R|G)?TX? (\\d{3}\\d?)M?")] - public static partial Regex NvidiaConsumerClassRegex(); - public static Vendor FromId(uint id) { return id switch @@ -92,7 +85,7 @@ namespace Ryujinx.Graphics.Vulkan DriverId.MesaDozen => "Dozen", DriverId.MesaNvk => "NVK", DriverId.ImaginationOpenSourceMesa => "Imagination (Open)", - DriverId.MesaAgxv => "Honeykrisp", + DriverId.MesaHoneykrisp => "Honeykrisp", _ => id.ToString(), }; } diff --git a/src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs b/src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs index ce1293589..236ab8721 100644 --- a/src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs +++ b/src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs @@ -1,4 +1,5 @@ using Ryujinx.Graphics.GAL; +using Silk.NET.Vulkan; namespace Ryujinx.Graphics.Vulkan { @@ -50,7 +51,7 @@ namespace Ryujinx.Graphics.Vulkan public void BindVertexBuffer(VulkanRenderer gd, CommandBufferScoped cbs, uint binding, ref PipelineState state, VertexBufferUpdater updater) { - var autoBuffer = _buffer; + Auto autoBuffer = _buffer; if (_handle != BufferHandle.Null) { @@ -67,7 +68,7 @@ namespace Ryujinx.Graphics.Vulkan int stride = (_stride + (alignment - 1)) & -alignment; int newSize = (_size / _stride) * stride; - var buffer = autoBuffer.Get(cbs, 0, newSize).Value; + Buffer buffer = autoBuffer.Get(cbs, 0, newSize).Value; updater.BindVertexBuffer(cbs, binding, buffer, 0, (ulong)newSize, (ulong)stride); @@ -94,7 +95,7 @@ namespace Ryujinx.Graphics.Vulkan { int offset = _offset; bool mirrorable = _size <= VertexBufferMaxMirrorable; - var buffer = mirrorable ? autoBuffer.GetMirrorable(cbs, ref offset, _size, out _).Value : autoBuffer.Get(cbs, offset, _size).Value; + Buffer buffer = mirrorable ? autoBuffer.GetMirrorable(cbs, ref offset, _size, out _).Value : autoBuffer.Get(cbs, offset, _size).Value; updater.BindVertexBuffer(cbs, binding, buffer, (ulong)offset, (ulong)_size, (ulong)_stride); } diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanDebugMessenger.cs b/src/Ryujinx.Graphics.Vulkan/VulkanDebugMessenger.cs index 6dfcd8b6e..1a566478e 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanDebugMessenger.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanDebugMessenger.cs @@ -39,7 +39,7 @@ namespace Ryujinx.Graphics.Vulkan if (_debugUtils != null && _logLevel != GraphicsDebugLevel.None) { - var messageType = _logLevel switch + DebugUtilsMessageTypeFlagsEXT messageType = _logLevel switch { GraphicsDebugLevel.Error => DebugUtilsMessageTypeFlagsEXT.ValidationBitExt, GraphicsDebugLevel.Slowdowns => DebugUtilsMessageTypeFlagsEXT.ValidationBitExt | @@ -50,7 +50,7 @@ namespace Ryujinx.Graphics.Vulkan _ => throw new ArgumentException($"Invalid log level \"{_logLevel}\"."), }; - var messageSeverity = _logLevel switch + DebugUtilsMessageSeverityFlagsEXT messageSeverity = _logLevel switch { GraphicsDebugLevel.Error => DebugUtilsMessageSeverityFlagsEXT.ErrorBitExt, GraphicsDebugLevel.Slowdowns => DebugUtilsMessageSeverityFlagsEXT.ErrorBitExt | @@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Vulkan _ => throw new ArgumentException($"Invalid log level \"{_logLevel}\"."), }; - var debugUtilsMessengerCreateInfo = new DebugUtilsMessengerCreateInfoEXT + DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfo = new() { SType = StructureType.DebugUtilsMessengerCreateInfoExt, MessageType = messageType, @@ -95,7 +95,7 @@ namespace Ryujinx.Graphics.Vulkan DebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData) { - var msg = Marshal.PtrToStringAnsi((nint)pCallbackData->PMessage); + string msg = Marshal.PtrToStringAnsi((nint)pCallbackData->PMessage); if (messageSeverity.HasFlag(DebugUtilsMessageSeverityFlagsEXT.ErrorBitExt)) { diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanException.cs b/src/Ryujinx.Graphics.Vulkan/VulkanException.cs index e203a3a21..5d67ab838 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanException.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanException.cs @@ -1,6 +1,5 @@ using Silk.NET.Vulkan; using System; -using System.Runtime.Serialization; namespace Ryujinx.Graphics.Vulkan { diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs b/src/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs index 352f271cc..c4dbf41f6 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs @@ -1,6 +1,7 @@ using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; +using Silk.NET.Core; using Silk.NET.Vulkan; using Silk.NET.Vulkan.Extensions.EXT; using Silk.NET.Vulkan.Extensions.KHR; @@ -20,7 +21,8 @@ namespace Ryujinx.Graphics.Vulkan private const string AppName = "Ryujinx.Graphics.Vulkan"; private const int QueuesCount = 2; - private static readonly string[] _desirableExtensions = { + private static readonly string[] _desirableExtensions = + [ ExtConditionalRendering.ExtensionName, ExtExtendedDynamicState.ExtensionName, ExtTransformFeedback.ExtensionName, @@ -45,19 +47,20 @@ namespace Ryujinx.Graphics.Vulkan "VK_KHR_8bit_storage", "VK_KHR_maintenance2", "VK_EXT_attachment_feedback_loop_layout", - "VK_EXT_attachment_feedback_loop_dynamic_state", - }; + "VK_EXT_attachment_feedback_loop_dynamic_state" + ]; - private static readonly string[] _requiredExtensions = { - KhrSwapchain.ExtensionName, - }; + private static readonly string[] _requiredExtensions = + [ + KhrSwapchain.ExtensionName + ]; internal static VulkanInstance CreateInstance(Vk api, GraphicsDebugLevel logLevel, string[] requiredExtensions) { - var enabledLayers = new List(); + List enabledLayers = []; - var instanceExtensions = VulkanInstance.GetInstanceExtensions(api); - var instanceLayers = VulkanInstance.GetInstanceLayers(api); + IReadOnlySet instanceExtensions = VulkanInstance.GetInstanceExtensions(api); + IReadOnlySet instanceLayers = VulkanInstance.GetInstanceLayers(api); void AddAvailableLayer(string layerName) { @@ -76,16 +79,16 @@ namespace Ryujinx.Graphics.Vulkan AddAvailableLayer("VK_LAYER_KHRONOS_validation"); } - var enabledExtensions = requiredExtensions; + string[] enabledExtensions = requiredExtensions; if (instanceExtensions.Contains("VK_EXT_debug_utils")) { enabledExtensions = enabledExtensions.Append(ExtDebugUtils.ExtensionName).ToArray(); } - var appName = Marshal.StringToHGlobalAnsi(AppName); + IntPtr appName = Marshal.StringToHGlobalAnsi(AppName); - var applicationInfo = new ApplicationInfo + ApplicationInfo applicationInfo = new() { PApplicationName = (byte*)appName, ApplicationVersion = 1, @@ -107,7 +110,7 @@ namespace Ryujinx.Graphics.Vulkan ppEnabledLayers[i] = Marshal.StringToHGlobalAnsi(enabledLayers[i]); } - var instanceCreateInfo = new InstanceCreateInfo + InstanceCreateInfo instanceCreateInfo = new() { SType = StructureType.InstanceCreateInfo, PApplicationInfo = &applicationInfo, @@ -117,7 +120,7 @@ namespace Ryujinx.Graphics.Vulkan EnabledLayerCount = (uint)enabledLayers.Count, }; - Result result = VulkanInstance.Create(api, ref instanceCreateInfo, out var instance); + Result result = VulkanInstance.Create(api, ref instanceCreateInfo, out VulkanInstance instance); Marshal.FreeHGlobal(appName); @@ -138,7 +141,7 @@ namespace Ryujinx.Graphics.Vulkan internal static VulkanPhysicalDevice FindSuitablePhysicalDevice(Vk api, VulkanInstance instance, SurfaceKHR surface, string preferredGpuId) { - instance.EnumeratePhysicalDevices(out var physicalDevices).ThrowOnError(); + instance.EnumeratePhysicalDevices(out VulkanPhysicalDevice[] physicalDevices).ThrowOnError(); // First we try to pick the user preferred GPU. for (int i = 0; i < physicalDevices.Length; i++) @@ -163,9 +166,9 @@ namespace Ryujinx.Graphics.Vulkan internal static DeviceInfo[] GetSuitablePhysicalDevices(Vk api) { - var appName = Marshal.StringToHGlobalAnsi(AppName); + IntPtr appName = Marshal.StringToHGlobalAnsi(AppName); - var applicationInfo = new ApplicationInfo + ApplicationInfo applicationInfo = new() { PApplicationName = (byte*)appName, ApplicationVersion = 1, @@ -174,7 +177,7 @@ namespace Ryujinx.Graphics.Vulkan ApiVersion = _maximumVulkanVersion, }; - var instanceCreateInfo = new InstanceCreateInfo + InstanceCreateInfo instanceCreateInfo = new() { SType = StructureType.InstanceCreateInfo, PApplicationInfo = &applicationInfo, @@ -184,7 +187,7 @@ namespace Ryujinx.Graphics.Vulkan EnabledLayerCount = 0, }; - Result result = VulkanInstance.Create(api, ref instanceCreateInfo, out var rawInstance); + Result result = VulkanInstance.Create(api, ref instanceCreateInfo, out VulkanInstance rawInstance); Marshal.FreeHGlobal(appName); @@ -196,12 +199,12 @@ namespace Ryujinx.Graphics.Vulkan // TODO: Remove this once we relax our initialization codepaths. if (instance.InstanceVersion < _minimalInstanceVulkanVersion) { - return Array.Empty(); + return []; } instance.EnumeratePhysicalDevices(out VulkanPhysicalDevice[] physicalDevices).ThrowOnError(); - List deviceInfos = new(); + List deviceInfos = []; foreach (VulkanPhysicalDevice physicalDevice in physicalDevices) { @@ -245,13 +248,13 @@ namespace Ryujinx.Graphics.Vulkan { const QueueFlags RequiredFlags = QueueFlags.GraphicsBit | QueueFlags.ComputeBit; - var khrSurface = new KhrSurface(api.Context); + KhrSurface khrSurface = new(api.Context); for (uint index = 0; index < physicalDevice.QueueFamilyProperties.Length; index++) { ref QueueFamilyProperties property = ref physicalDevice.QueueFamilyProperties[index]; - khrSurface.GetPhysicalDeviceSurfaceSupport(physicalDevice.PhysicalDevice, index, surface, out var surfaceSupported).ThrowOnError(); + khrSurface.GetPhysicalDeviceSurfaceSupport(physicalDevice.PhysicalDevice, index, surface, out Bool32 surfaceSupported).ThrowOnError(); if (property.QueueFlags.HasFlag(RequiredFlags) && surfaceSupported) { @@ -280,7 +283,7 @@ namespace Ryujinx.Graphics.Vulkan queuePriorities[i] = 1f; } - var queueCreateInfo = new DeviceQueueCreateInfo + DeviceQueueCreateInfo queueCreateInfo = new() { SType = StructureType.DeviceQueueCreateInfo, QueueFamilyIndex = queueFamilyIndex, @@ -391,9 +394,9 @@ namespace Ryujinx.Graphics.Vulkan api.GetPhysicalDeviceFeatures2(physicalDevice.PhysicalDevice, &features2); - var supportedFeatures = features2.Features; + PhysicalDeviceFeatures supportedFeatures = features2.Features; - var features = new PhysicalDeviceFeatures + PhysicalDeviceFeatures features = new() { DepthBiasClamp = supportedFeatures.DepthBiasClamp, DepthClamp = supportedFeatures.DepthClamp, @@ -464,7 +467,7 @@ namespace Ryujinx.Graphics.Vulkan pExtendedFeatures = &featuresRobustness2; } - var featuresExtendedDynamicState = new PhysicalDeviceExtendedDynamicStateFeaturesEXT + PhysicalDeviceExtendedDynamicStateFeaturesEXT featuresExtendedDynamicState = new() { SType = StructureType.PhysicalDeviceExtendedDynamicStateFeaturesExt, PNext = pExtendedFeatures, @@ -473,7 +476,7 @@ namespace Ryujinx.Graphics.Vulkan pExtendedFeatures = &featuresExtendedDynamicState; - var featuresVk11 = new PhysicalDeviceVulkan11Features + PhysicalDeviceVulkan11Features featuresVk11 = new() { SType = StructureType.PhysicalDeviceVulkan11Features, PNext = pExtendedFeatures, @@ -482,7 +485,7 @@ namespace Ryujinx.Graphics.Vulkan pExtendedFeatures = &featuresVk11; - var featuresVk12 = new PhysicalDeviceVulkan12Features + PhysicalDeviceVulkan12Features featuresVk12 = new() { SType = StructureType.PhysicalDeviceVulkan12Features, PNext = pExtendedFeatures, @@ -585,7 +588,7 @@ namespace Ryujinx.Graphics.Vulkan pExtendedFeatures = &featuresDynamicAttachmentFeedbackLoopLayout; } - var enabledExtensions = _requiredExtensions.Union(_desirableExtensions.Intersect(physicalDevice.DeviceExtensions)).ToArray(); + string[] enabledExtensions = _requiredExtensions.Union(_desirableExtensions.Intersect(physicalDevice.DeviceExtensions)).ToArray(); nint* ppEnabledExtensions = stackalloc nint[enabledExtensions.Length]; @@ -594,7 +597,7 @@ namespace Ryujinx.Graphics.Vulkan ppEnabledExtensions[i] = Marshal.StringToHGlobalAnsi(enabledExtensions[i]); } - var deviceCreateInfo = new DeviceCreateInfo + DeviceCreateInfo deviceCreateInfo = new() { SType = StructureType.DeviceCreateInfo, PNext = pExtendedFeatures, @@ -605,7 +608,7 @@ namespace Ryujinx.Graphics.Vulkan PEnabledFeatures = &features, }; - api.CreateDevice(physicalDevice.PhysicalDevice, in deviceCreateInfo, null, out var device).ThrowOnError(); + api.CreateDevice(physicalDevice.PhysicalDevice, in deviceCreateInfo, null, out Device device).ThrowOnError(); for (int i = 0; i < enabledExtensions.Length; i++) { diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanPhysicalDevice.cs b/src/Ryujinx.Graphics.Vulkan/VulkanPhysicalDevice.cs index b3f8fd756..8ede84100 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanPhysicalDevice.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanPhysicalDevice.cs @@ -24,7 +24,7 @@ namespace Ryujinx.Graphics.Vulkan PhysicalDevice = physicalDevice; PhysicalDeviceFeatures = api.GetPhysicalDeviceFeature(PhysicalDevice); - api.GetPhysicalDeviceProperties(PhysicalDevice, out var physicalDeviceProperties); + api.GetPhysicalDeviceProperties(PhysicalDevice, out PhysicalDeviceProperties physicalDeviceProperties); PhysicalDeviceProperties = physicalDeviceProperties; api.GetPhysicalDeviceMemoryProperties(PhysicalDevice, out PhysicalDeviceMemoryProperties); diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index cc2bc36c2..32c22dd2a 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -1,4 +1,6 @@ +using Gommon; using Ryujinx.Common.Configuration; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Shader; @@ -11,6 +13,8 @@ using Silk.NET.Vulkan.Extensions.KHR; using System; using System.Collections.Generic; using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Threading; using Format = Ryujinx.Graphics.GAL.Format; using PrimitiveTopology = Ryujinx.Graphics.GAL.PrimitiveTopology; using SamplerCreateInfo = Ryujinx.Graphics.GAL.SamplerCreateInfo; @@ -45,8 +49,8 @@ namespace Ryujinx.Graphics.Vulkan internal uint QueueFamilyIndex { get; private set; } internal Queue Queue { get; private set; } internal Queue BackgroundQueue { get; private set; } - internal object BackgroundQueueLock { get; private set; } - internal object QueueLock { get; private set; } + internal Lock BackgroundQueueLock { get; private set; } + internal Lock QueueLock { get; private set; } internal MemoryAllocator MemoryAllocator { get; private set; } internal HostMemoryAllocator HostMemoryAllocator { get; private set; } @@ -81,13 +85,14 @@ namespace Ryujinx.Graphics.Vulkan private readonly string _preferredGpuId; private int[] _pdReservedBindings; - private readonly static int[] _pdReservedBindingsNvn = { 3, 18, 21, 36, 30 }; - private readonly static int[] _pdReservedBindingsOgl = { 17, 18, 34, 35, 36 }; + private readonly static int[] _pdReservedBindingsNvn = [3, 18, 21, 36, 30]; + private readonly static int[] _pdReservedBindingsOgl = [17, 18, 34, 35, 36]; internal Vendor Vendor { get; private set; } internal bool IsAmdWindows { get; private set; } internal bool IsIntelWindows { get; private set; } internal bool IsAmdGcn { get; private set; } + internal bool IsAmdRdna3 { get; private set; } internal bool IsNvidiaPreTuring { get; private set; } internal bool IsIntelArc { get; private set; } internal bool IsQualcommProprietary { get; private set; } @@ -120,7 +125,7 @@ namespace Ryujinx.Graphics.Vulkan } public static VulkanRenderer Create( - string preferredGpuId, + string preferredGpuId, Func getSurface, Func getRequiredExtensions ) => new(Vk.GetApi(), getSurface, getRequiredExtensions, preferredGpuId); @@ -161,9 +166,9 @@ namespace Ryujinx.Graphics.Vulkan if (maxQueueCount >= 2) { - Api.GetDeviceQueue(_device, queueFamilyIndex, 1, out var backgroundQueue); + Api.GetDeviceQueue(_device, queueFamilyIndex, 1, out Queue backgroundQueue); BackgroundQueue = backgroundQueue; - BackgroundQueueLock = new object(); + BackgroundQueueLock = new(); } PhysicalDeviceProperties2 properties2 = new() @@ -212,7 +217,7 @@ namespace Ryujinx.Graphics.Vulkan bool supportsPushDescriptors = _physicalDevice.IsDeviceExtensionPresent(KhrPushDescriptor.ExtensionName); - PhysicalDevicePushDescriptorPropertiesKHR propertiesPushDescriptor = new PhysicalDevicePushDescriptorPropertiesKHR() + PhysicalDevicePushDescriptorPropertiesKHR propertiesPushDescriptor = new() { SType = StructureType.PhysicalDevicePushDescriptorPropertiesKhr }; @@ -329,7 +334,7 @@ namespace Ryujinx.Graphics.Vulkan Api.GetPhysicalDeviceProperties2(_physicalDevice.PhysicalDevice, &properties2); Api.GetPhysicalDeviceFeatures2(_physicalDevice.PhysicalDevice, &features2); - var portabilityFlags = PortabilitySubsetFlags.None; + PortabilitySubsetFlags portabilityFlags = PortabilitySubsetFlags.None; uint vertexBufferAlignment = 1; if (usePortability) @@ -346,20 +351,20 @@ namespace Ryujinx.Graphics.Vulkan featuresCustomBorderColor.CustomBorderColors && featuresCustomBorderColor.CustomBorderColorWithoutFormat; - ref var properties = ref properties2.Properties; + ref PhysicalDeviceProperties properties = ref properties2.Properties; - var hasDriverProperties = _physicalDevice.TryGetPhysicalDeviceDriverPropertiesKHR(Api, out var driverProperties); + bool hasDriverProperties = _physicalDevice.TryGetPhysicalDeviceDriverPropertiesKHR(Api, out PhysicalDeviceDriverPropertiesKHR driverProperties); Vendor = VendorUtils.FromId(properties.VendorID); IsAmdWindows = Vendor == Vendor.Amd && OperatingSystem.IsWindows(); IsIntelWindows = Vendor == Vendor.Intel && OperatingSystem.IsWindows(); IsTBDR = - Vendor == Vendor.Apple || - Vendor == Vendor.Qualcomm || - Vendor == Vendor.ARM || - Vendor == Vendor.Broadcom || - Vendor == Vendor.ImgTec; + Vendor is Vendor.Apple or + Vendor.Qualcomm or + Vendor.ARM or + Vendor.Broadcom or + Vendor.ImgTec; GpuVendor = VendorUtils.GetNameFromId(properties.VendorID); GpuDriver = hasDriverProperties && !OperatingSystem.IsMacOS() ? @@ -372,11 +377,15 @@ namespace Ryujinx.Graphics.Vulkan GpuVersion = $"Vulkan v{ParseStandardVulkanVersion(properties.ApiVersion)}, Driver v{ParseDriverVersion(ref properties)}"; - IsAmdGcn = !IsMoltenVk && Vendor == Vendor.Amd && VendorUtils.AmdGcnRegex().IsMatch(GpuRenderer); + IsAmdGcn = !IsMoltenVk && Vendor == Vendor.Amd && Patterns.AmdGcn.IsMatch(GpuRenderer); + + IsAmdRdna3 = Vendor == Vendor.Amd && (Patterns.AmdRdna3.IsMatch(GpuRenderer) + // ROG Ally (X) Device IDs + || properties.DeviceID is 0x15BF or 0x15C8); if (Vendor == Vendor.Nvidia) { - var match = VendorUtils.NvidiaConsumerClassRegex().Match(GpuRenderer); + Match match = Patterns.NvidiaConsumerClass.Match(GpuRenderer); if (match != null && int.TryParse(match.Groups[2].Value, out int gpuNumber)) { @@ -485,7 +494,7 @@ namespace Ryujinx.Graphics.Vulkan _surface = _getSurface(_instance.Instance, Api); _physicalDevice = VulkanInitialization.FindSuitablePhysicalDevice(Api, _instance, _surface, _preferredGpuId); - var queueFamilyIndex = VulkanInitialization.FindSuitableQueueFamily(Api, _physicalDevice, _surface, out uint maxQueueCount); + uint queueFamilyIndex = VulkanInitialization.FindSuitableQueueFamily(Api, _physicalDevice, _surface, out uint maxQueueCount); _device = VulkanInitialization.CreateDevice(Api, _physicalDevice, queueFamilyIndex, maxQueueCount); @@ -494,9 +503,9 @@ namespace Ryujinx.Graphics.Vulkan SwapchainApi = swapchainApi; } - Api.GetDeviceQueue(_device, queueFamilyIndex, 0, out var queue); + Api.GetDeviceQueue(_device, queueFamilyIndex, 0, out Queue queue); Queue = queue; - QueueLock = new object(); + QueueLock = new(); LoadFeatures(maxQueueCount, queueFamilyIndex); @@ -519,7 +528,7 @@ namespace Ryujinx.Graphics.Vulkan } else { - _pdReservedBindings = Array.Empty(); + _pdReservedBindings = []; } } @@ -588,7 +597,7 @@ namespace Ryujinx.Graphics.Vulkan internal TextureView CreateTextureView(TextureCreateInfo info) { // This should be disposed when all views are destroyed. - var storage = CreateTextureStorage(info); + TextureStorage storage = CreateTextureStorage(info); return storage.CreateView(info, 0, 0); } @@ -711,8 +720,8 @@ namespace Ryujinx.Graphics.Vulkan Api.GetPhysicalDeviceFeatures2(_physicalDevice.PhysicalDevice, &features2); - var limits = _physicalDevice.PhysicalDeviceProperties.Limits; - var mainQueueProperties = _physicalDevice.QueueFamilyProperties[QueueFamilyIndex]; + PhysicalDeviceLimits limits = _physicalDevice.PhysicalDeviceProperties.Limits; + QueueFamilyProperties mainQueueProperties = _physicalDevice.QueueFamilyProperties[QueueFamilyIndex]; SystemMemoryType memoryType; @@ -799,7 +808,7 @@ namespace Ryujinx.Graphics.Vulkan for (int i = 0; i < memoryProperties.MemoryHeapCount; i++) { - var heap = memoryProperties.MemoryHeaps[i]; + MemoryHeap heap = memoryProperties.MemoryHeaps[i]; if ((heap.Flags & MemoryHeapFlags.DeviceLocalBit) == MemoryHeapFlags.DeviceLocalBit) { totalMemory += heap.Size; @@ -829,7 +838,7 @@ namespace Ryujinx.Graphics.Vulkan { Logger.Error?.PrintMsg(LogClass.Gpu, $"Error querying Vulkan devices: {ex.Message}"); - return Array.Empty(); + return []; } } @@ -842,7 +851,7 @@ namespace Ryujinx.Graphics.Vulkan catch (Exception) { // If we got an exception here, Vulkan is most likely not supported. - return Array.Empty(); + return []; } } @@ -889,7 +898,12 @@ namespace Ryujinx.Graphics.Vulkan private void PrintGpuInformation() { - Logger.Notice.Print(LogClass.Gpu, $"{GpuVendor} {GpuRenderer} ({GpuVersion})"); + string gpuInfoMessage = $"{GpuRenderer} ({GpuVersion})"; + if (!GpuRenderer.StartsWithIgnoreCase(GpuVendor)) + gpuInfoMessage = gpuInfoMessage.Prepend(GpuVendor); + + Logger.Notice.Print(LogClass.Gpu, gpuInfoMessage); + Logger.Notice.Print(LogClass.Gpu, $"GPU Memory: {GetTotalGPUMemory() / (1024 * 1024)} MiB"); } @@ -1023,17 +1037,17 @@ namespace Ryujinx.Graphics.Vulkan MemoryAllocator.Dispose(); - foreach (var shader in Shaders) + foreach (ShaderCollection shader in Shaders) { shader.Dispose(); } - foreach (var texture in Textures) + foreach (ITexture texture in Textures) { texture.Release(); } - foreach (var sampler in Samplers) + foreach (SamplerHolder sampler in Samplers) { sampler.Dispose(); } diff --git a/src/Ryujinx.Graphics.Vulkan/Window.cs b/src/Ryujinx.Graphics.Vulkan/Window.cs index 3e8d3b375..b67b0dbfa 100644 --- a/src/Ryujinx.Graphics.Vulkan/Window.cs +++ b/src/Ryujinx.Graphics.Vulkan/Window.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Configuration; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Vulkan.Effects; using Silk.NET.Vulkan; @@ -54,7 +55,7 @@ namespace Ryujinx.Graphics.Vulkan private void RecreateSwapchain() { - var oldSwapchain = _swapchain; + SwapchainKHR oldSwapchain = _swapchain; _swapchainIsDirty = false; for (int i = 0; i < _swapchainImageViews.Length; i++) @@ -86,13 +87,13 @@ namespace Ryujinx.Graphics.Vulkan private unsafe void CreateSwapchain() { - _gd.SurfaceApi.GetPhysicalDeviceSurfaceCapabilities(_physicalDevice, _surface, out var capabilities); + _gd.SurfaceApi.GetPhysicalDeviceSurfaceCapabilities(_physicalDevice, _surface, out SurfaceCapabilitiesKHR capabilities); uint surfaceFormatsCount; _gd.SurfaceApi.GetPhysicalDeviceSurfaceFormats(_physicalDevice, _surface, &surfaceFormatsCount, null); - var surfaceFormats = new SurfaceFormatKHR[surfaceFormatsCount]; + SurfaceFormatKHR[] surfaceFormats = new SurfaceFormatKHR[surfaceFormatsCount]; fixed (SurfaceFormatKHR* pSurfaceFormats = surfaceFormats) { @@ -103,7 +104,7 @@ namespace Ryujinx.Graphics.Vulkan _gd.SurfaceApi.GetPhysicalDeviceSurfacePresentModes(_physicalDevice, _surface, &presentModesCount, null); - var presentModes = new PresentModeKHR[presentModesCount]; + PresentModeKHR[] presentModes = new PresentModeKHR[presentModesCount]; fixed (PresentModeKHR* pPresentModes = presentModes) { @@ -116,17 +117,17 @@ namespace Ryujinx.Graphics.Vulkan imageCount = capabilities.MaxImageCount; } - var surfaceFormat = ChooseSwapSurfaceFormat(surfaceFormats, _colorSpacePassthroughEnabled); + SurfaceFormatKHR surfaceFormat = ChooseSwapSurfaceFormat(surfaceFormats, _colorSpacePassthroughEnabled); - var extent = ChooseSwapExtent(capabilities); + Extent2D extent = ChooseSwapExtent(capabilities); _width = (int)extent.Width; _height = (int)extent.Height; _format = surfaceFormat.Format; - var oldSwapchain = _swapchain; + SwapchainKHR oldSwapchain = _swapchain; - var swapchainCreateInfo = new SwapchainCreateInfoKHR + SwapchainCreateInfoKHR swapchainCreateInfo = new() { SType = StructureType.SwapchainCreateInfoKhr, Surface = _surface, @@ -143,7 +144,7 @@ namespace Ryujinx.Graphics.Vulkan Clipped = true, }; - var textureCreateInfo = new TextureCreateInfo( + TextureCreateInfo textureCreateInfo = new( _width, _height, 1, @@ -178,7 +179,7 @@ namespace Ryujinx.Graphics.Vulkan _swapchainImageViews[i] = CreateSwapchainImageView(_swapchainImages[i], surfaceFormat.Format, textureCreateInfo); } - var semaphoreCreateInfo = new SemaphoreCreateInfo + SemaphoreCreateInfo semaphoreCreateInfo = new() { SType = StructureType.SemaphoreCreateInfo, }; @@ -200,17 +201,17 @@ namespace Ryujinx.Graphics.Vulkan private unsafe TextureView CreateSwapchainImageView(Image swapchainImage, VkFormat format, TextureCreateInfo info) { - var componentMapping = new ComponentMapping( + ComponentMapping componentMapping = new( ComponentSwizzle.R, ComponentSwizzle.G, ComponentSwizzle.B, ComponentSwizzle.A); - var aspectFlags = ImageAspectFlags.ColorBit; + ImageAspectFlags aspectFlags = ImageAspectFlags.ColorBit; - var subresourceRange = new ImageSubresourceRange(aspectFlags, 0, 1, 0, 1); + ImageSubresourceRange subresourceRange = new(aspectFlags, 0, 1, 0, 1); - var imageCreateInfo = new ImageViewCreateInfo + ImageViewCreateInfo imageCreateInfo = new() { SType = StructureType.ImageViewCreateInfo, Image = swapchainImage, @@ -220,7 +221,7 @@ namespace Ryujinx.Graphics.Vulkan SubresourceRange = subresourceRange, }; - _gd.Api.CreateImageView(_device, in imageCreateInfo, null, out var imageView).ThrowOnError(); + _gd.Api.CreateImageView(_device, in imageCreateInfo, null, out ImageView imageView).ThrowOnError(); return new TextureView(_gd, _device, new DisposableImageView(_gd.Api, _device, imageView), info, format); } @@ -232,10 +233,10 @@ namespace Ryujinx.Graphics.Vulkan return new SurfaceFormatKHR(VkFormat.B8G8R8A8Unorm, ColorSpaceKHR.PaceSrgbNonlinearKhr); } - var formatToReturn = availableFormats[0]; + SurfaceFormatKHR formatToReturn = availableFormats[0]; if (colorSpacePassthroughEnabled) { - foreach (var format in availableFormats) + foreach (SurfaceFormatKHR format in availableFormats) { if (format.Format == VkFormat.B8G8R8A8Unorm && format.ColorSpace == ColorSpaceKHR.SpacePassThroughExt) { @@ -250,7 +251,7 @@ namespace Ryujinx.Graphics.Vulkan } else { - foreach (var format in availableFormats) + foreach (SurfaceFormatKHR format in availableFormats) { if (format.Format == VkFormat.B8G8R8A8Unorm && format.ColorSpace == ColorSpaceKHR.PaceSrgbNonlinearKhr) { @@ -317,7 +318,7 @@ namespace Ryujinx.Graphics.Vulkan while (true) { - var acquireResult = _gd.SwapchainApi.AcquireNextImage( + Result acquireResult = _gd.SwapchainApi.AcquireNextImage( _device, _swapchain, ulong.MaxValue, @@ -339,11 +340,11 @@ namespace Ryujinx.Graphics.Vulkan } } - var swapchainImage = _swapchainImages[nextImage]; + Image swapchainImage = _swapchainImages[nextImage]; _gd.FlushAllCommands(); - var cbs = _gd.CommandBufferPool.Rent(); + CommandBufferScoped cbs = _gd.CommandBufferPool.Rent(); Transition( cbs.CommandBuffer, @@ -353,7 +354,7 @@ namespace Ryujinx.Graphics.Vulkan ImageLayout.Undefined, ImageLayout.General); - var view = (TextureView)texture; + TextureView view = (TextureView)texture; UpdateEffect(); @@ -393,7 +394,7 @@ namespace Ryujinx.Graphics.Vulkan _gd.CommandBufferPool.Return( cbs, null, - stackalloc[] { PipelineStageFlags.ColorAttachmentOutputBit }, + [PipelineStageFlags.ColorAttachmentOutputBit], null); _gd.FlushAllCommands(); cbs.GetFence().Wait(); @@ -456,17 +457,17 @@ namespace Ryujinx.Graphics.Vulkan _gd.CommandBufferPool.Return( cbs, - stackalloc[] { _imageAvailableSemaphores[semaphoreIndex] }, - stackalloc[] { PipelineStageFlags.ColorAttachmentOutputBit }, - stackalloc[] { _renderFinishedSemaphores[semaphoreIndex] }); + [_imageAvailableSemaphores[semaphoreIndex]], + [PipelineStageFlags.ColorAttachmentOutputBit], + [_renderFinishedSemaphores[semaphoreIndex]]); // TODO: Present queue. - var semaphore = _renderFinishedSemaphores[semaphoreIndex]; - var swapchain = _swapchain; + Semaphore semaphore = _renderFinishedSemaphores[semaphoreIndex]; + SwapchainKHR swapchain = _swapchain; Result result; - var presentInfo = new PresentInfoKHR + PresentInfoKHR presentInfo = new() { SType = StructureType.PresentInfoKhr, WaitSemaphoreCount = 1, @@ -533,7 +534,7 @@ namespace Ryujinx.Graphics.Vulkan case AntiAliasing.SmaaMedium: case AntiAliasing.SmaaHigh: case AntiAliasing.SmaaUltra: - var quality = _currentAntiAliasing - AntiAliasing.SmaaLow; + int quality = _currentAntiAliasing - AntiAliasing.SmaaLow; if (_effect is SmaaPostProcessingEffect smaa) { smaa.Quality = quality; @@ -543,6 +544,7 @@ namespace Ryujinx.Graphics.Vulkan _effect?.Dispose(); _effect = new SmaaPostProcessingEffect(_gd, _device, quality); } + break; } } @@ -574,6 +576,7 @@ namespace Ryujinx.Graphics.Vulkan _scalingFilter?.Dispose(); _scalingFilter = new AreaScalingFilter(_gd, _device); } + break; } } @@ -593,9 +596,9 @@ namespace Ryujinx.Graphics.Vulkan ImageLayout srcLayout, ImageLayout dstLayout) { - var subresourceRange = new ImageSubresourceRange(ImageAspectFlags.ColorBit, 0, 1, 0, 1); + ImageSubresourceRange subresourceRange = new(ImageAspectFlags.ColorBit, 0, 1, 0, 1); - var barrier = new ImageMemoryBarrier + ImageMemoryBarrier barrier = new() { SType = StructureType.ImageMemoryBarrier, SrcAccessMask = srcAccess, diff --git a/src/Ryujinx.Graphics.Vulkan/WindowBase.cs b/src/Ryujinx.Graphics.Vulkan/WindowBase.cs index ca06ec0b8..34ac63a83 100644 --- a/src/Ryujinx.Graphics.Vulkan/WindowBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/WindowBase.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Configuration; using Ryujinx.Graphics.GAL; using System; diff --git a/src/Ryujinx.HLE.Generators/IpcServiceGenerator.cs b/src/Ryujinx.HLE.Generators/IpcServiceGenerator.cs index 5cac4d13a..cdd062826 100644 --- a/src/Ryujinx.HLE.Generators/IpcServiceGenerator.cs +++ b/src/Ryujinx.HLE.Generators/IpcServiceGenerator.cs @@ -10,8 +10,8 @@ namespace Ryujinx.HLE.Generators { public void Execute(GeneratorExecutionContext context) { - var syntaxReceiver = (ServiceSyntaxReceiver)context.SyntaxReceiver; - CodeGenerator generator = new CodeGenerator(); + ServiceSyntaxReceiver syntaxReceiver = (ServiceSyntaxReceiver)context.SyntaxReceiver; + CodeGenerator generator = new(); generator.AppendLine("#nullable enable"); generator.AppendLine("using System;"); @@ -19,14 +19,14 @@ namespace Ryujinx.HLE.Generators generator.EnterScope($"partial class IUserInterface"); generator.EnterScope($"public IpcService? GetServiceInstance(Type type, ServiceCtx context, object? parameter = null)"); - foreach (var className in syntaxReceiver.Types) + foreach (ClassDeclarationSyntax className in syntaxReceiver.Types) { if (className.Modifiers.Any(SyntaxKind.AbstractKeyword) || className.Modifiers.Any(SyntaxKind.PrivateKeyword) || !className.AttributeLists.Any(x => x.Attributes.Any(y => y.ToString().StartsWith("Service")))) continue; - var name = GetFullName(className, context).Replace("global::", string.Empty); + string name = GetFullName(className, context).Replace("global::", string.Empty); if (!name.StartsWith("Ryujinx.HLE.HOS.Services")) continue; - var constructors = className.ChildNodes().Where(x => x.IsKind(SyntaxKind.ConstructorDeclaration)).Select(y => y as ConstructorDeclarationSyntax).ToArray(); + ConstructorDeclarationSyntax[] constructors = className.ChildNodes().Where(x => x.IsKind(SyntaxKind.ConstructorDeclaration)).Select(y => y as ConstructorDeclarationSyntax).ToArray(); if (!constructors.Any(x => x.ParameterList.Parameters.Count >= 1)) continue; @@ -36,10 +36,10 @@ namespace Ryujinx.HLE.Generators generator.EnterScope($"if (type == typeof({GetFullName(className, context)}))"); if (constructors.Any(x => x.ParameterList.Parameters.Count == 2)) { - var type = constructors.Where(x => x.ParameterList.Parameters.Count == 2).FirstOrDefault().ParameterList.Parameters[1].Type; - var model = context.Compilation.GetSemanticModel(type.SyntaxTree); - var typeSymbol = model.GetSymbolInfo(type).Symbol as INamedTypeSymbol; - var fullName = typeSymbol.ToString(); + TypeSyntax type = constructors.Where(x => x.ParameterList.Parameters.Count == 2).FirstOrDefault().ParameterList.Parameters[1].Type; + SemanticModel model = context.Compilation.GetSemanticModel(type.SyntaxTree); + INamedTypeSymbol typeSymbol = model.GetSymbolInfo(type).Symbol as INamedTypeSymbol; + string fullName = typeSymbol.ToString(); generator.EnterScope("if (parameter != null)"); generator.AppendLine($"return new {GetFullName(className, context)}(context, ({fullName})parameter);"); generator.LeaveScope(); @@ -59,13 +59,13 @@ namespace Ryujinx.HLE.Generators generator.LeaveScope(); generator.LeaveScope(); - generator.AppendLine("#nullable disable"); + generator.AppendLine("#nullable disable"); context.AddSource($"IUserInterface.g.cs", generator.ToString()); } private string GetFullName(ClassDeclarationSyntax syntaxNode, GeneratorExecutionContext context) { - var typeSymbol = context.Compilation.GetSemanticModel(syntaxNode.SyntaxTree).GetDeclaredSymbol(syntaxNode); + INamedTypeSymbol typeSymbol = context.Compilation.GetSemanticModel(syntaxNode.SyntaxTree).GetDeclaredSymbol(syntaxNode); return typeSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); } diff --git a/src/Ryujinx.HLE.Generators/ServiceSyntaxReceiver.cs b/src/Ryujinx.HLE.Generators/ServiceSyntaxReceiver.cs index e4269cb9a..7513f5f45 100644 --- a/src/Ryujinx.HLE.Generators/ServiceSyntaxReceiver.cs +++ b/src/Ryujinx.HLE.Generators/ServiceSyntaxReceiver.cs @@ -6,7 +6,7 @@ namespace Ryujinx.HLE.Generators { internal class ServiceSyntaxReceiver : ISyntaxReceiver { - public HashSet Types = new HashSet(); + public HashSet Types = []; public void OnVisitSyntaxNode(SyntaxNode syntaxNode) { diff --git a/src/Ryujinx.HLE/Exceptions/ServiceNotImplementedException.cs b/src/Ryujinx.HLE/Exceptions/ServiceNotImplementedException.cs index 408b5baa4..23068bf72 100644 --- a/src/Ryujinx.HLE/Exceptions/ServiceNotImplementedException.cs +++ b/src/Ryujinx.HLE/Exceptions/ServiceNotImplementedException.cs @@ -3,10 +3,10 @@ using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Services; using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; -using System.Runtime.Serialization; using System.Text; namespace Ryujinx.HLE.Exceptions @@ -53,12 +53,12 @@ namespace Ryujinx.HLE.Exceptions if (callingType != null && callingMethod != null) { // If the type is past 0xF, we are using TIPC - var ipcCommands = Request.Type > IpcMessageType.TipcCloseSession ? Service.TipcCommands : Service.CmifCommands; + IReadOnlyDictionary ipcCommands = Request.Type > IpcMessageType.TipcCloseSession ? Service.TipcCommands : Service.CmifCommands; // Find the handler for the method called - var ipcHandler = ipcCommands.FirstOrDefault(x => x.Value == callingMethod); - var ipcCommandId = ipcHandler.Key; - var ipcMethod = ipcHandler.Value; + KeyValuePair ipcHandler = ipcCommands.FirstOrDefault(x => x.Value == callingMethod); + int ipcCommandId = ipcHandler.Key; + MethodInfo ipcMethod = ipcHandler.Value; if (ipcMethod != null) { @@ -83,7 +83,7 @@ namespace Ryujinx.HLE.Exceptions { sb.AppendLine("\tPtrBuff:"); - foreach (var buff in Request.PtrBuff) + foreach (IpcPtrBuffDesc buff in Request.PtrBuff) { sb.AppendLine($"\t[{buff.Index}] Position: 0x{buff.Position:x16} Size: 0x{buff.Size:x16}"); } @@ -93,7 +93,7 @@ namespace Ryujinx.HLE.Exceptions { sb.AppendLine("\tSendBuff:"); - foreach (var buff in Request.SendBuff) + foreach (IpcBuffDesc buff in Request.SendBuff) { sb.AppendLine($"\tPosition: 0x{buff.Position:x16} Size: 0x{buff.Size:x16} Flags: {buff.Flags}"); } @@ -103,7 +103,7 @@ namespace Ryujinx.HLE.Exceptions { sb.AppendLine("\tReceiveBuff:"); - foreach (var buff in Request.ReceiveBuff) + foreach (IpcBuffDesc buff in Request.ReceiveBuff) { sb.AppendLine($"\tPosition: 0x{buff.Position:x16} Size: 0x{buff.Size:x16} Flags: {buff.Flags}"); } @@ -113,7 +113,7 @@ namespace Ryujinx.HLE.Exceptions { sb.AppendLine("\tExchangeBuff:"); - foreach (var buff in Request.ExchangeBuff) + foreach (IpcBuffDesc buff in Request.ExchangeBuff) { sb.AppendLine($"\tPosition: 0x{buff.Position:x16} Size: 0x{buff.Size:x16} Flags: {buff.Flags}"); } @@ -123,7 +123,7 @@ namespace Ryujinx.HLE.Exceptions { sb.AppendLine("\tRecvListBuff:"); - foreach (var buff in Request.RecvListBuff) + foreach (IpcRecvListBuffDesc buff in Request.RecvListBuff) { sb.AppendLine($"\tPosition: 0x{buff.Position:x16} Size: 0x{buff.Size:x16}"); } @@ -147,8 +147,8 @@ namespace Ryujinx.HLE.Exceptions // Find the IIpcService method that threw this exception while ((frame = trace.GetFrame(i++)) != null) { - var method = frame.GetMethod(); - var declType = method.DeclaringType; + MethodBase method = frame.GetMethod(); + Type declType = method.DeclaringType; if (typeof(IpcService).IsAssignableFrom(declType)) { diff --git a/src/Ryujinx.HLE/FileSystem/ContentManager.cs b/src/Ryujinx.HLE/FileSystem/ContentManager.cs index 51f6058fc..6ce19efee 100644 --- a/src/Ryujinx.HLE/FileSystem/ContentManager.cs +++ b/src/Ryujinx.HLE/FileSystem/ContentManager.cs @@ -22,6 +22,7 @@ using System.IO.Compression; using System.Linq; using System.Text; using System.Text.RegularExpressions; +using System.Threading; using Path = System.IO.Path; namespace Ryujinx.HLE.FileSystem @@ -55,7 +56,7 @@ namespace Ryujinx.HLE.FileSystem private readonly VirtualFileSystem _virtualFileSystem; - private readonly object _lock = new(); + private readonly Lock _lock = new(); public ContentManager(VirtualFileSystem virtualFileSystem) { @@ -106,15 +107,17 @@ namespace Ryujinx.HLE.FileSystem foreach (StorageId storageId in Enum.GetValues()) { - if (!ContentPath.TryGetContentPath(storageId, out var contentPathString)) + if (!ContentPath.TryGetContentPath(storageId, out string contentPathString)) { continue; } - if (!ContentPath.TryGetRealPath(contentPathString, out var contentDirectory)) + + if (!ContentPath.TryGetRealPath(contentPathString, out string contentDirectory)) { continue; } - var registeredDirectory = Path.Combine(contentDirectory, "registered"); + + string registeredDirectory = Path.Combine(contentDirectory, "registered"); Directory.CreateDirectory(registeredDirectory); @@ -169,7 +172,7 @@ namespace Ryujinx.HLE.FileSystem } } - if (_locationEntries.TryGetValue(storageId, out var locationEntriesItem) && locationEntriesItem?.Count == 0) + if (_locationEntries.TryGetValue(storageId, out LinkedList locationEntriesItem) && locationEntriesItem?.Count == 0) { _locationEntries.Remove(storageId); } @@ -199,7 +202,7 @@ namespace Ryujinx.HLE.FileSystem if (!mergedToContainer) { - using var pfs = PartitionFileSystemUtils.OpenApplicationFileSystem(containerPath, _virtualFileSystem); + using IFileSystem pfs = PartitionFileSystemUtils.OpenApplicationFileSystem(containerPath, _virtualFileSystem); } } } @@ -216,17 +219,17 @@ namespace Ryujinx.HLE.FileSystem if (AocData.TryGetValue(aocTitleId, out AocItem aoc)) { - var file = new FileStream(aoc.ContainerPath, FileMode.Open, FileAccess.Read); - using var ncaFile = new UniqueRef(); + FileStream file = new(aoc.ContainerPath, FileMode.Open, FileAccess.Read); + using UniqueRef ncaFile = new(); switch (Path.GetExtension(aoc.ContainerPath)) { case ".xci": - var xci = new Xci(_virtualFileSystem.KeySet, file.AsStorage()).OpenPartition(XciPartitionType.Secure); + XciPartition xci = new Xci(_virtualFileSystem.KeySet, file.AsStorage()).OpenPartition(XciPartitionType.Secure); xci.OpenFile(ref ncaFile.Ref, aoc.NcaPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); break; case ".nsp": - var pfs = new PartitionFileSystem(); + PartitionFileSystem pfs = new(); pfs.Initialize(file.AsStorage()); pfs.OpenFile(ref ncaFile.Ref, aoc.NcaPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); break; @@ -277,7 +280,7 @@ namespace Ryujinx.HLE.FileSystem { if (_contentDictionary.ContainsValue(ncaId)) { - var content = _contentDictionary.FirstOrDefault(x => x.Value == ncaId); + KeyValuePair<(ulong titleId, NcaContentType type), string> content = _contentDictionary.FirstOrDefault(x => x.Value == ncaId); ulong titleId = content.Key.titleId; NcaContentType contentType = content.Key.type; @@ -294,7 +297,7 @@ namespace Ryujinx.HLE.FileSystem { lock (_lock) { - if (_contentDictionary.TryGetValue((titleId, contentType), out var contentDictionaryItem)) + if (_contentDictionary.TryGetValue((titleId, contentType), out string contentDictionaryItem)) { return UInt128Utils.FromHex(contentDictionaryItem); } @@ -396,7 +399,7 @@ namespace Ryujinx.HLE.FileSystem if (locationList != null) { LocationEntry entry = - locationList.ToList().Find(x => x.TitleId == titleId && x.ContentType == contentType); + locationList.ToList().FirstOrDefault(x => x.TitleId == titleId && x.ContentType == contentType); if (entry.ContentPath != null) { @@ -424,13 +427,13 @@ namespace Ryujinx.HLE.FileSystem { LinkedList locationList = _locationEntries[storageId]; - return locationList.ToList().Find(x => x.TitleId == titleId && x.ContentType == contentType); + return locationList.ToList().FirstOrDefault(x => x.TitleId == titleId && x.ContentType == contentType); } public void InstallFirmware(string firmwareSource) { - ContentPath.TryGetContentPath(StorageId.BuiltInSystem, out var contentPathString); - ContentPath.TryGetRealPath(contentPathString, out var contentDirectory); + ContentPath.TryGetContentPath(StorageId.BuiltInSystem, out string contentPathString); + ContentPath.TryGetRealPath(contentPathString, out string contentDirectory); string registeredDirectory = Path.Combine(contentDirectory, "registered"); string temporaryDirectory = Path.Combine(contentDirectory, "temp"); @@ -463,6 +466,7 @@ namespace Ryujinx.HLE.FileSystem { InstallFromZip(archive, temporaryDirectory); } + break; case ".xci": Xci xci = new(_virtualFileSystem.KeySet, file.AsStorage()); @@ -475,11 +479,11 @@ namespace Ryujinx.HLE.FileSystem FinishInstallation(temporaryDirectory, registeredDirectory); } - public void InstallKeys(string keysSource, string installDirectory) + public static void InstallKeys(string keysSource, string installDirectory) { if (Directory.Exists(keysSource)) { - foreach (var filePath in Directory.EnumerateFiles(keysSource, "*.keys")) + foreach (string filePath in Directory.EnumerateFiles(keysSource, "*.keys")) { VerifyKeysFile(filePath); File.Copy(filePath, Path.Combine(installDirectory, Path.GetFileName(filePath)), true); @@ -504,6 +508,7 @@ namespace Ryujinx.HLE.FileSystem { InstallKeysFromZip(archive, installDirectory); } + break; case ".keys": VerifyKeysFile(keysSource); @@ -514,15 +519,16 @@ namespace Ryujinx.HLE.FileSystem } } - private void InstallKeysFromZip(ZipArchive archive, string installDirectory) + private static void InstallKeysFromZip(ZipArchive archive, string installDirectory) { string temporaryDirectory = Path.Combine(installDirectory, "temp"); if (Directory.Exists(temporaryDirectory)) { Directory.Delete(temporaryDirectory, true); } + Directory.CreateDirectory(temporaryDirectory); - foreach (var entry in archive.Entries) + foreach (ZipArchiveEntry entry in archive.Entries) { if (Path.GetExtension(entry.FullName).Equals(".keys", StringComparison.OrdinalIgnoreCase)) { @@ -540,6 +546,7 @@ namespace Ryujinx.HLE.FileSystem } } } + Directory.Delete(temporaryDirectory, true); } @@ -562,11 +569,11 @@ namespace Ryujinx.HLE.FileSystem private void InstallFromPartition(IFileSystem filesystem, string temporaryDirectory) { - foreach (var entry in filesystem.EnumerateEntries("/", "*.nca")) + foreach (DirectoryEntryEx entry in filesystem.EnumerateEntries("/", "*.nca")) { Nca nca = new(_virtualFileSystem.KeySet, OpenPossibleFragmentedFile(filesystem, entry.FullPath, OpenMode.Read).AsStorage()); - SaveNca(nca, entry.Name.Remove(entry.Name.IndexOf('.')), temporaryDirectory); + SaveNca(nca, entry.Name[..entry.Name.IndexOf('.')], temporaryDirectory); } } @@ -586,7 +593,7 @@ namespace Ryujinx.HLE.FileSystem private static void InstallFromZip(ZipArchive archive, string temporaryDirectory) { - foreach (var entry in archive.Entries) + foreach (ZipArchiveEntry entry in archive.Entries) { if (entry.FullName.EndsWith(".nca") || entry.FullName.EndsWith(".nca/00")) { @@ -626,7 +633,7 @@ namespace Ryujinx.HLE.FileSystem private static IFile OpenPossibleFragmentedFile(IFileSystem filesystem, string path, OpenMode mode) { - using var file = new UniqueRef(); + using UniqueRef file = new(); if (filesystem.FileExists($"{path}/00")) { @@ -640,7 +647,7 @@ namespace Ryujinx.HLE.FileSystem return file.Release(); } - private static Stream GetZipStream(ZipArchiveEntry entry) + private static MemoryStream GetZipStream(ZipArchiveEntry entry) { MemoryStream dest = MemoryStreamManager.Shared.GetStream(); @@ -696,7 +703,7 @@ namespace Ryujinx.HLE.FileSystem { SystemVersion systemVersion = null; - foreach (var entry in archive.Entries) + foreach (ZipArchiveEntry entry in archive.Entries) { if (entry.FullName.EndsWith(".nca") || entry.FullName.EndsWith(".nca/00")) { @@ -705,25 +712,24 @@ namespace Ryujinx.HLE.FileSystem Nca nca = new(_virtualFileSystem.KeySet, storage); - if (updateNcas.TryGetValue(nca.Header.TitleId, out var updateNcasItem)) + if (updateNcas.TryGetValue(nca.Header.TitleId, out List<(NcaContentType type, string path)> updateNcasItem)) { updateNcasItem.Add((nca.Header.ContentType, entry.FullName)); } - else + else if (updateNcas.TryAdd(nca.Header.TitleId, new List<(NcaContentType, string)>())) { - updateNcas.Add(nca.Header.TitleId, new List<(NcaContentType, string)>()); updateNcas[nca.Header.TitleId].Add((nca.Header.ContentType, entry.FullName)); } } } - if (updateNcas.TryGetValue(SystemUpdateTitleId, out var ncaEntry)) + if (updateNcas.TryGetValue(SystemUpdateTitleId, out List<(NcaContentType type, string path)> ncaEntry)) { - string metaPath = ncaEntry.Find(x => x.type == NcaContentType.Meta).path; + string metaPath = ncaEntry.FirstOrDefault(x => x.type == NcaContentType.Meta).path; CnmtContentMetaEntry[] metaEntries = null; - var fileEntry = archive.GetEntry(metaPath); + ZipArchiveEntry fileEntry = archive.GetEntry(metaPath); using (Stream ncaStream = GetZipStream(fileEntry)) { @@ -733,11 +739,11 @@ namespace Ryujinx.HLE.FileSystem string cnmtPath = fs.EnumerateEntries("/", "*.cnmt").Single().FullPath; - using var metaFile = new UniqueRef(); + using UniqueRef metaFile = new(); if (fs.OpenFile(ref metaFile.Ref, cnmtPath.ToU8Span(), OpenMode.Read).IsSuccess()) { - var meta = new Cnmt(metaFile.Get.AsStream()); + Cnmt meta = new(metaFile.Get.AsStream()); if (meta.Type == ContentMetaType.SystemUpdate) { @@ -753,16 +759,16 @@ namespace Ryujinx.HLE.FileSystem throw new FileNotFoundException("System update title was not found in the firmware package."); } - if (updateNcas.TryGetValue(SystemVersionTitleId, out var updateNcasItem)) + if (updateNcas.TryGetValue(SystemVersionTitleId, out List<(NcaContentType type, string path)> updateNcasItem)) { - string versionEntry = updateNcasItem.Find(x => x.type != NcaContentType.Meta).path; + string versionEntry = updateNcasItem.FirstOrDefault(x => x.type != NcaContentType.Meta).path; using Stream ncaStream = GetZipStream(archive.GetEntry(versionEntry)); Nca nca = new(_virtualFileSystem.KeySet, ncaStream.AsStorage()); - var romfs = nca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.ErrorOnInvalid); + IFileSystem romfs = nca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.ErrorOnInvalid); - using var systemVersionFile = new UniqueRef(); + using UniqueRef systemVersionFile = new(); if (romfs.OpenFile(ref systemVersionFile.Ref, "/file".ToU8Span(), OpenMode.Read).IsSuccess()) { @@ -774,9 +780,9 @@ namespace Ryujinx.HLE.FileSystem { if (updateNcas.TryGetValue(metaEntry.TitleId, out ncaEntry)) { - metaPath = ncaEntry.Find(x => x.type == NcaContentType.Meta).path; + metaPath = ncaEntry.FirstOrDefault(x => x.type == NcaContentType.Meta).path; - string contentPath = ncaEntry.Find(x => x.type != NcaContentType.Meta).path; + string contentPath = ncaEntry.FirstOrDefault(x => x.type != NcaContentType.Meta).path; // Nintendo in 9.0.0, removed PPC and only kept the meta nca of it. // This is a perfect valid case, so we should just ignore the missing content nca and continue. @@ -798,11 +804,11 @@ namespace Ryujinx.HLE.FileSystem string cnmtPath = fs.EnumerateEntries("/", "*.cnmt").Single().FullPath; - using var metaFile = new UniqueRef(); + using UniqueRef metaFile = new(); if (fs.OpenFile(ref metaFile.Ref, cnmtPath.ToU8Span(), OpenMode.Read).IsSuccess()) { - var meta = new Cnmt(metaFile.Get.AsStream()); + Cnmt meta = new(metaFile.Get.AsStream()); IStorage contentStorage = contentNcaStream.AsStorage(); if (contentStorage.GetSize(out long size).IsSuccess()) @@ -830,9 +836,9 @@ namespace Ryujinx.HLE.FileSystem { StringBuilder extraNcas = new(); - foreach (var entry in updateNcas) + foreach (KeyValuePair> entry in updateNcas) { - foreach (var (type, path) in entry.Value) + foreach ((NcaContentType type, string path) in entry.Value) { extraNcas.AppendLine(path); } @@ -855,7 +861,7 @@ namespace Ryujinx.HLE.FileSystem CnmtContentMetaEntry[] metaEntries = null; - foreach (var entry in filesystem.EnumerateEntries("/", "*.nca")) + foreach (DirectoryEntryEx entry in filesystem.EnumerateEntries("/", "*.nca")) { IStorage ncaStorage = OpenPossibleFragmentedFile(filesystem, entry.FullPath, OpenMode.Read).AsStorage(); @@ -867,11 +873,11 @@ namespace Ryujinx.HLE.FileSystem string cnmtPath = fs.EnumerateEntries("/", "*.cnmt").Single().FullPath; - using var metaFile = new UniqueRef(); + using UniqueRef metaFile = new(); if (fs.OpenFile(ref metaFile.Ref, cnmtPath.ToU8Span(), OpenMode.Read).IsSuccess()) { - var meta = new Cnmt(metaFile.Get.AsStream()); + Cnmt meta = new(metaFile.Get.AsStream()); if (meta.Type == ContentMetaType.SystemUpdate) { @@ -883,9 +889,9 @@ namespace Ryujinx.HLE.FileSystem } else if (nca.Header.TitleId == SystemVersionTitleId && nca.Header.ContentType == NcaContentType.Data) { - var romfs = nca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.ErrorOnInvalid); + IFileSystem romfs = nca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.ErrorOnInvalid); - using var systemVersionFile = new UniqueRef(); + using UniqueRef systemVersionFile = new(); if (romfs.OpenFile(ref systemVersionFile.Ref, "/file".ToU8Span(), OpenMode.Read).IsSuccess()) { @@ -893,13 +899,12 @@ namespace Ryujinx.HLE.FileSystem } } - if (updateNcas.TryGetValue(nca.Header.TitleId, out var updateNcasItem)) + if (updateNcas.TryGetValue(nca.Header.TitleId, out List<(NcaContentType type, string path)> updateNcasItem)) { updateNcasItem.Add((nca.Header.ContentType, entry.FullPath)); } - else + else if (updateNcas.TryAdd(nca.Header.TitleId, new List<(NcaContentType, string)>())) { - updateNcas.Add(nca.Header.TitleId, new List<(NcaContentType, string)>()); updateNcas[nca.Header.TitleId].Add((nca.Header.ContentType, entry.FullPath)); } @@ -913,10 +918,10 @@ namespace Ryujinx.HLE.FileSystem foreach (CnmtContentMetaEntry metaEntry in metaEntries) { - if (updateNcas.TryGetValue(metaEntry.TitleId, out var ncaEntry)) + if (updateNcas.TryGetValue(metaEntry.TitleId, out List<(NcaContentType type, string path)> ncaEntry)) { - string metaNcaPath = ncaEntry.Find(x => x.type == NcaContentType.Meta).path; - string contentPath = ncaEntry.Find(x => x.type != NcaContentType.Meta).path; + string metaNcaPath = ncaEntry.FirstOrDefault(x => x.type == NcaContentType.Meta).path; + string contentPath = ncaEntry.FirstOrDefault(x => x.type != NcaContentType.Meta).path; // Nintendo in 9.0.0, removed PPC and only kept the meta nca of it. // This is a perfect valid case, so we should just ignore the missing content nca and continue. @@ -936,11 +941,11 @@ namespace Ryujinx.HLE.FileSystem string cnmtPath = fs.EnumerateEntries("/", "*.cnmt").Single().FullPath; - using var metaFile = new UniqueRef(); + using UniqueRef metaFile = new(); if (fs.OpenFile(ref metaFile.Ref, cnmtPath.ToU8Span(), OpenMode.Read).IsSuccess()) { - var meta = new Cnmt(metaFile.Get.AsStream()); + Cnmt meta = new(metaFile.Get.AsStream()); if (contentStorage.GetSize(out long size).IsSuccess()) { @@ -967,9 +972,9 @@ namespace Ryujinx.HLE.FileSystem { StringBuilder extraNcas = new(); - foreach (var entry in updateNcas) + foreach (KeyValuePair> entry in updateNcas) { - foreach (var (type, path) in entry.Value) + foreach ((NcaContentType type, string path) in entry.Value) { extraNcas.AppendLine(path); } @@ -988,22 +993,22 @@ namespace Ryujinx.HLE.FileSystem lock (_lock) { - var locationEnties = _locationEntries[StorageId.BuiltInSystem]; + LinkedList locationEnties = _locationEntries[StorageId.BuiltInSystem]; - foreach (var entry in locationEnties) + foreach (LocationEntry entry in locationEnties) { if (entry.ContentType == NcaContentType.Data) { - var path = VirtualFileSystem.SwitchPathToSystemPath(entry.ContentPath); + string path = VirtualFileSystem.SwitchPathToSystemPath(entry.ContentPath); using FileStream fileStream = File.OpenRead(path); Nca nca = new(_virtualFileSystem.KeySet, fileStream.AsStorage()); if (nca.Header.TitleId == SystemVersionTitleId && nca.Header.ContentType == NcaContentType.Data) { - var romfs = nca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.ErrorOnInvalid); + IFileSystem romfs = nca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.ErrorOnInvalid); - using var systemVersionFile = new UniqueRef(); + using UniqueRef systemVersionFile = new(); if (romfs.OpenFile(ref systemVersionFile.Ref, "/file".ToU8Span(), OpenMode.Read).IsSuccess()) { @@ -1017,7 +1022,7 @@ namespace Ryujinx.HLE.FileSystem return null; } - public void VerifyKeysFile(string filePath) + public static void VerifyKeysFile(string filePath) { // Verify the keys file format refers to https://github.com/Thealexbarney/LibHac/blob/master/KEYS.md string genericPattern = @"^[a-z0-9_]+ = [a-z0-9]+$"; @@ -1029,56 +1034,62 @@ namespace Ryujinx.HLE.FileSystem string fileName = Path.GetFileName(filePath); string[] lines = File.ReadAllLines(filePath); - bool verified = false; + bool verified; switch (fileName) { case "prod.keys": - verified = verifyKeys(lines, genericPattern); + verified = VerifyKeys(lines, genericPattern); break; case "title.keys": - verified = verifyKeys(lines, titlePattern); + verified = VerifyKeys(lines, titlePattern); break; case "console.keys": - verified = verifyKeys(lines, genericPattern); + verified = VerifyKeys(lines, genericPattern); break; case "dev.keys": - verified = verifyKeys(lines, genericPattern); + verified = VerifyKeys(lines, genericPattern); break; default: throw new FormatException($"Keys file name \"{fileName}\" not supported. Only \"prod.keys\", \"title.keys\", \"console.keys\", \"dev.keys\" are supported."); } + if (!verified) { throw new FormatException($"Invalid \"{filePath}\" file format."); } - } else + } + else { throw new FileNotFoundException($"Keys file not found at \"{filePath}\"."); } - } - private bool verifyKeys(string[] lines, string regex) - { - foreach (string line in lines) + return; + + static bool VerifyKeys(string[] lines, string regex) { - if (!Regex.IsMatch(line, regex)) + foreach (string line in lines) { - return false; + if (!Regex.IsMatch(line, regex)) + { + return false; + } } + + return true; } - return true; } - public bool AreKeysAlredyPresent(string pathToCheck) + public static bool AreKeysAlredyPresent(string pathToCheck) { - string[] fileNames = { "prod.keys", "title.keys", "console.keys", "dev.keys" }; - foreach (var file in fileNames) + string[] fileNames = ["prod.keys", "title.keys", "console.keys", "dev.keys"]; + foreach (string file in fileNames) { if (File.Exists(Path.Combine(pathToCheck, file))) { - return true; + return true; } } + return false; } } diff --git a/src/Ryujinx.HLE/FileSystem/ContentMetaData.cs b/src/Ryujinx.HLE/FileSystem/ContentMetaData.cs index aebcf7988..a1f29bd13 100644 --- a/src/Ryujinx.HLE/FileSystem/ContentMetaData.cs +++ b/src/Ryujinx.HLE/FileSystem/ContentMetaData.cs @@ -39,14 +39,14 @@ namespace Ryujinx.HLE.FileSystem // TODO: Replace this with a check for IdOffset as soon as LibHac supports it: // && entry.IdOffset == programIndex - foreach (var entry in _cnmt.ContentEntries) + foreach (CnmtContentEntry entry in _cnmt.ContentEntries) { if (entry.Type != type) { continue; } - string ncaId = BitConverter.ToString(entry.NcaId).Replace("-", null).ToLower(); + string ncaId = Convert.ToHexStringLower(entry.NcaId).Replace("-", null); Nca nca = _pfs.GetNca(keySet, $"/{ncaId}.nca"); if (nca.GetProgramIndex() == programIndex) diff --git a/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs b/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs index 64b02a282..e6d76cec9 100644 --- a/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs +++ b/src/Ryujinx.HLE/FileSystem/EncryptedFileSystemCreator.cs @@ -9,16 +9,16 @@ namespace Ryujinx.HLE.FileSystem public class EncryptedFileSystemCreator : IEncryptedFileSystemCreator { public Result Create(ref SharedRef outEncryptedFileSystem, - ref SharedRef baseFileSystem, IEncryptedFileSystemCreator.KeyId idIndex, + ref readonly SharedRef baseFileSystem, IEncryptedFileSystemCreator.KeyId idIndex, in EncryptionSeed encryptionSeed) { - if (idIndex < IEncryptedFileSystemCreator.KeyId.Save || idIndex > IEncryptedFileSystemCreator.KeyId.CustomStorage) + if (idIndex is < IEncryptedFileSystemCreator.KeyId.Save or > IEncryptedFileSystemCreator.KeyId.CustomStorage) { return ResultFs.InvalidArgument.Log(); } // TODO: Reenable when AesXtsFileSystem is fixed. - outEncryptedFileSystem = SharedRef.CreateMove(ref baseFileSystem); + outEncryptedFileSystem = SharedRef.CreateMove(ref baseFileSystem.Ref); return Result.Success; } diff --git a/src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs b/src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs index ef9c493a8..4e0fdf554 100644 --- a/src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs +++ b/src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs @@ -61,7 +61,7 @@ namespace Ryujinx.HLE.FileSystem public void LoadRomFs(ulong pid, string fileName) { - var romfsStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); + FileStream romfsStream = new(fileName, FileMode.Open, FileAccess.Read); _romFsByPid.AddOrUpdate(pid, romfsStream, (pid, oldStream) => { @@ -140,8 +140,8 @@ namespace Ryujinx.HLE.FileSystem return $"{rawPath}:/"; } - var basePath = rawPath.AsSpan(0, firstSeparatorOffset); - var fileName = rawPath.AsSpan(firstSeparatorOffset + 1); + ReadOnlySpan basePath = rawPath.AsSpan(0, firstSeparatorOffset); + ReadOnlySpan fileName = rawPath.AsSpan(firstSeparatorOffset + 1); return $"{basePath}:/{fileName}"; } @@ -194,7 +194,7 @@ namespace Ryujinx.HLE.FileSystem } fsServerClient = horizon.CreatePrivilegedHorizonClient(); - var fsServer = new FileSystemServer(fsServerClient); + FileSystemServer fsServer = new(fsServerClient); RandomDataGenerator randomGenerator = Random.Shared.NextBytes; @@ -208,7 +208,7 @@ namespace Ryujinx.HLE.FileSystem SdCard.SetSdCardInserted(true); - var fsServerConfig = new FileSystemServerConfig + FileSystemServerConfig fsServerConfig = new() { ExternalKeySet = KeySet.ExternalKeySet, FsCreators = fsServerObjects.FsCreators, @@ -270,7 +270,7 @@ namespace Ryujinx.HLE.FileSystem { foreach (DirectoryEntryEx ticketEntry in fs.EnumerateEntries("/", "*.tik")) { - using var ticketFile = new UniqueRef(); + using UniqueRef ticketFile = new(); Result result = fs.OpenFile(ref ticketFile.Ref, ticketEntry.FullPath.ToU8Span(), OpenMode.Read); @@ -286,7 +286,7 @@ namespace Ryujinx.HLE.FileSystem continue; Ticket ticket = new(new MemoryStream(ticketData)); - var titleKey = ticket.GetTitleKey(KeySet); + byte[] titleKey = ticket.GetTitleKey(KeySet); if (titleKey != null) { @@ -334,7 +334,7 @@ namespace Ryujinx.HLE.FileSystem { Span info = stackalloc SaveDataInfo[8]; - using var iterator = new UniqueRef(); + using UniqueRef iterator = new(); Result rc = hos.Fs.OpenSaveDataIterator(ref iterator.Ref, spaceId); if (rc.IsFailure()) @@ -392,13 +392,13 @@ namespace Ryujinx.HLE.FileSystem private static Result CreateSaveDataDirectory(HorizonClient hos, in SaveDataInfo info) { - if (info.SpaceId != SaveDataSpaceId.User && info.SpaceId != SaveDataSpaceId.System) + if (info.SpaceId is not SaveDataSpaceId.User and not SaveDataSpaceId.System) { return Result.Success; } const string MountName = "SaveDir"; - var mountNameU8 = MountName.ToU8Span(); + U8Span mountNameU8 = MountName.ToU8Span(); BisPartitionId partitionId = info.SpaceId switch { @@ -415,7 +415,7 @@ namespace Ryujinx.HLE.FileSystem try { - var path = $"{MountName}:/save/{info.SaveDataId:x16}".ToU8Span(); + U8Span path = $"{MountName}:/save/{info.SaveDataId:x16}".ToU8Span(); rc = hos.Fs.GetEntryType(out _, path); @@ -437,9 +437,9 @@ namespace Ryujinx.HLE.FileSystem { list = null; - var mountName = "system".ToU8Span(); + U8Span mountName = "system".ToU8Span(); DirectoryHandle handle = default; - List localList = new(); + List localList = []; try { @@ -498,7 +498,7 @@ namespace Ryujinx.HLE.FileSystem // Only save data IDs added to SystemExtraDataFixInfo will be fixed. private static Result FixUnindexedSystemSaves(HorizonClient hos, List existingSaveIds) { - foreach (var fixInfo in _systemExtraDataFixInfo) + foreach (ExtraDataFixInfo fixInfo in _systemExtraDataFixInfo) { if (!existingSaveIds.Contains(fixInfo.StaticSaveDataId)) { @@ -665,7 +665,7 @@ namespace Ryujinx.HLE.FileSystem { if (disposing) { - foreach (var stream in _romFsByPid.Values) + foreach (Stream stream in _romFsByPid.Values) { stream.Close(); } diff --git a/src/Ryujinx.HLE/HOS/Applets/AppletManager.cs b/src/Ryujinx.HLE/HOS/Applets/AppletManager.cs index 5895c67bb..5bda957bc 100644 --- a/src/Ryujinx.HLE/HOS/Applets/AppletManager.cs +++ b/src/Ryujinx.HLE/HOS/Applets/AppletManager.cs @@ -4,8 +4,6 @@ using Ryujinx.HLE.HOS.Applets.Cabinet; using Ryujinx.HLE.HOS.Applets.Dummy; using Ryujinx.HLE.HOS.Applets.Error; using Ryujinx.HLE.HOS.Services.Am.AppletAE; -using System; -using System.Collections.Generic; namespace Ryujinx.HLE.HOS.Applets { diff --git a/src/Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs b/src/Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs index c5f13dab3..c8bbfc4b4 100644 --- a/src/Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/Browser/BrowserApplet.cs @@ -1,3 +1,4 @@ +using Microsoft.IO; using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.Common.Memory; @@ -39,10 +40,10 @@ namespace Ryujinx.HLE.HOS.Applets.Browser if ((_commonArguments.AppletVersion >= 0x80000 && _shimKind == ShimKind.Web) || (_commonArguments.AppletVersion >= 0x30000 && _shimKind == ShimKind.Share)) { - List result = new() - { - new BrowserOutput(BrowserOutputType.ExitReason, (uint)WebExitReason.ExitButton), - }; + List result = + [ + new(BrowserOutputType.ExitReason, (uint)WebExitReason.ExitButton) + ]; _normalSession.Push(BuildResponseNew(result)); } @@ -63,7 +64,7 @@ namespace Ryujinx.HLE.HOS.Applets.Browser private static byte[] BuildResponseOld(WebCommonReturnValue result) { - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); using BinaryWriter writer = new(stream); writer.WriteStruct(result); @@ -71,7 +72,7 @@ namespace Ryujinx.HLE.HOS.Applets.Browser } private byte[] BuildResponseNew(List outputArguments) { - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); using BinaryWriter writer = new(stream); writer.WriteStruct(new WebArgHeader { diff --git a/src/Ryujinx.HLE/HOS/Applets/Browser/BrowserArgument.cs b/src/Ryujinx.HLE/HOS/Applets/Browser/BrowserArgument.cs index d2e1d55ca..24a043358 100644 --- a/src/Ryujinx.HLE/HOS/Applets/Browser/BrowserArgument.cs +++ b/src/Ryujinx.HLE/HOS/Applets/Browser/BrowserArgument.cs @@ -64,7 +64,7 @@ namespace Ryujinx.HLE.HOS.Applets.Browser public static (ShimKind, List) ParseArguments(ReadOnlySpan data) { - List browserArguments = new(); + List browserArguments = []; WebArgHeader header = IApplet.ReadStruct(data[..8]); diff --git a/src/Ryujinx.HLE/HOS/Applets/Cabinet/CabinetApplet.cs b/src/Ryujinx.HLE/HOS/Applets/Cabinet/CabinetApplet.cs index 294b8d1f6..d8f665504 100644 --- a/src/Ryujinx.HLE/HOS/Applets/Cabinet/CabinetApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/Cabinet/CabinetApplet.cs @@ -1,8 +1,8 @@ using Ryujinx.Common.Logging; using Ryujinx.Common.Memory; using Ryujinx.HLE.HOS.Services.Am.AppletAE; -using Ryujinx.HLE.HOS.Services.Hid.HidServer; using Ryujinx.HLE.HOS.Services.Hid; +using Ryujinx.HLE.HOS.Services.Hid.HidServer; using Ryujinx.HLE.HOS.Services.Nfc.Nfp; using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager; using System; @@ -75,7 +75,7 @@ namespace Ryujinx.HLE.HOS.Applets.Cabinet return ResultCode.Success; } - private void StartFormatter(ref StartParamForAmiiboSettings startParam) + private static void StartFormatter(ref StartParamForAmiiboSettings startParam) { // Initialize RegisterInfo startParam.RegisterInfo = new RegisterInfo(); @@ -85,7 +85,7 @@ namespace Ryujinx.HLE.HOS.Applets.Cabinet { _system.Device.UIHandler.DisplayCabinetDialog(out string newName); byte[] nameBytes = Encoding.UTF8.GetBytes(newName); - Array41 nickName = new Array41(); + Array41 nickName = new(); nameBytes.CopyTo(nickName.AsSpan()); startParam.RegisterInfo.Nickname = nickName; NfpDevice devicePlayer1 = new() @@ -109,6 +109,7 @@ namespace Ryujinx.HLE.HOS.Applets.Cabinet } } } + VirtualAmiibo.UpdateNickName(amiiboId, newName); } @@ -154,9 +155,9 @@ namespace Ryujinx.HLE.HOS.Applets.Cabinet public unsafe struct ReturnValueForAmiiboSettings { public byte AmiiboSettingsReturnFlag; - private byte Padding1; - private byte Padding2; - private byte Padding3; + private readonly byte Padding1; + private readonly byte Padding2; + private readonly byte Padding3; public DeviceHandle DeviceHandle; public TagInfo TagInfo; public RegisterInfo RegisterInfo; diff --git a/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs b/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs index 3a7b29ab5..6b11f2cdd 100644 --- a/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/Controller/ControllerApplet.cs @@ -1,3 +1,4 @@ +using Microsoft.IO; using Ryujinx.Common.Logging; using Ryujinx.Common.Memory; using Ryujinx.HLE.HOS.Services.Am.AppletAE; @@ -119,7 +120,7 @@ namespace Ryujinx.HLE.HOS.Applets private static byte[] BuildResponse(ControllerSupportResultInfo result) { - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); using BinaryWriter writer = new(stream); writer.Write(MemoryMarshal.AsBytes(MemoryMarshal.CreateReadOnlySpan(ref result, Unsafe.SizeOf()))); @@ -129,7 +130,7 @@ namespace Ryujinx.HLE.HOS.Applets private static byte[] BuildResponse() { - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); using BinaryWriter writer = new(stream); writer.Write((ulong)ResultCode.Success); diff --git a/src/Ryujinx.HLE/HOS/Applets/Dummy/DummyApplet.cs b/src/Ryujinx.HLE/HOS/Applets/Dummy/DummyApplet.cs index 6b16aee7b..6fedff4dc 100644 --- a/src/Ryujinx.HLE/HOS/Applets/Dummy/DummyApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/Dummy/DummyApplet.cs @@ -1,24 +1,23 @@ -using Ryujinx.Common.Logging; +using Microsoft.IO; using Ryujinx.Common.Memory; -using Ryujinx.HLE.HOS.Applets; using Ryujinx.HLE.HOS.Services.Am.AppletAE; using System; using System.IO; -using System.Runtime.InteropServices; + namespace Ryujinx.HLE.HOS.Applets.Dummy { internal class DummyApplet : IApplet { private readonly Horizon _system; private AppletSession _normalSession; - + public event EventHandler AppletStateChanged; - + public DummyApplet(Horizon system) { _system = system; } - + public ResultCode Start(AppletSession normalSession, AppletSession interactiveSession) { _normalSession = normalSession; @@ -27,10 +26,10 @@ namespace Ryujinx.HLE.HOS.Applets.Dummy _system.ReturnFocus(); return ResultCode.Success; } - + private static byte[] BuildResponse() { - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); using BinaryWriter writer = new(stream); writer.Write((ulong)ResultCode.Success); return stream.ToArray(); diff --git a/src/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs b/src/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs index 0e043cc45..4c54b4666 100644 --- a/src/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs @@ -5,6 +5,7 @@ using LibHac.FsSystem; using LibHac.Ncm; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Am.AppletAE; using Ryujinx.HLE.HOS.SystemState; @@ -14,7 +15,6 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; -using System.Text.RegularExpressions; namespace Ryujinx.HLE.HOS.Applets.Error { @@ -30,9 +30,6 @@ namespace Ryujinx.HLE.HOS.Applets.Error public event EventHandler AppletStateChanged; - [GeneratedRegex(@"[^\u0000\u0009\u000A\u000D\u0020-\uFFFF]..")] - private static partial Regex CleanTextRegex(); - public ErrorApplet(Horizon horizon) { _horizon = horizon; @@ -107,7 +104,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error private static string CleanText(string value) { - return CleanTextRegex().Replace(value, string.Empty).Replace("\0", string.Empty); + return Patterns.CleanText.Replace(value, string.Empty).Replace("\0", string.Empty); } private string GetMessageText(uint module, uint description, string key) @@ -122,7 +119,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error if (romfs.FileExists(filePath)) { - using var binaryFile = new UniqueRef(); + using UniqueRef binaryFile = new(); romfs.OpenFile(ref binaryFile.Ref, filePath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); StreamReader reader = new(binaryFile.Get.AsStream(), Encoding.Unicode); @@ -161,13 +158,15 @@ namespace Ryujinx.HLE.HOS.Applets.Error string[] buttons = GetButtonsText(module, description, "DlgBtn"); - bool showDetails = _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Error Code: {module}-{description:0000}", "\n" + message, buttons); + (uint Module, uint Description) errorCodeTuple = (module, uint.Parse(description.ToString("0000"))); + + bool showDetails = _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Error Code: {module}-{description:0000}", "\n" + message, buttons, errorCodeTuple); if (showDetails) { message = GetMessageText(module, description, "FlvMsg"); buttons = GetButtonsText(module, description, "FlvBtn"); - _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Details: {module}-{description:0000}", "\n" + message, buttons); + _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Details: {module}-{description:0000}", "\n" + message, buttons, errorCodeTuple); } } @@ -184,7 +183,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error string messageText = Encoding.ASCII.GetString(messageTextBuffer.TakeWhile(b => !b.Equals(0)).ToArray()); string detailsText = Encoding.ASCII.GetString(detailsTextBuffer.TakeWhile(b => !b.Equals(0)).ToArray()); - List buttons = new(); + List buttons = []; // TODO: Handle the LanguageCode to return the translated "OK" and "Details". diff --git a/src/Ryujinx.HLE/HOS/Applets/PlayerSelect/PlayerSelectApplet.cs b/src/Ryujinx.HLE/HOS/Applets/PlayerSelect/PlayerSelectApplet.cs index 05bddc76f..69bff74a5 100644 --- a/src/Ryujinx.HLE/HOS/Applets/PlayerSelect/PlayerSelectApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/PlayerSelect/PlayerSelectApplet.cs @@ -1,3 +1,4 @@ +using Microsoft.IO; using Ryujinx.Common.Memory; using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Am.AppletAE; @@ -27,8 +28,19 @@ namespace Ryujinx.HLE.HOS.Applets _normalSession = normalSession; _interactiveSession = interactiveSession; - // TODO(jduncanator): Parse PlayerSelectConfig from input data - _normalSession.Push(BuildResponse()); + UserProfile selected = _system.Device.UIHandler.ShowPlayerSelectDialog(); + if (selected == null) + { + _normalSession.Push(BuildResponse()); + } + else if (selected.UserId == new UserId("00000000000000000000000000000080")) + { + _normalSession.Push(BuildGuestResponse()); + } + else + { + _normalSession.Push(BuildResponse(selected)); + } AppletStateChanged?.Invoke(this, null); @@ -37,16 +49,34 @@ namespace Ryujinx.HLE.HOS.Applets return ResultCode.Success; } - private byte[] BuildResponse() + private static byte[] BuildResponse(UserProfile selectedUser) { - UserProfile currentUser = _system.AccountManager.LastOpenedUser; - - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); using BinaryWriter writer = new(stream); writer.Write((ulong)PlayerSelectResult.Success); - currentUser.UserId.Write(writer); + selectedUser.UserId.Write(writer); + + return stream.ToArray(); + } + + private static byte[] BuildGuestResponse() + { + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using BinaryWriter writer = new(stream); + + writer.Write(new byte()); + + return stream.ToArray(); + } + + private static byte[] BuildResponse() + { + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using BinaryWriter writer = new(stream); + + writer.Write((ulong)PlayerSelectResult.Failure); return stream.ToArray(); } diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/CJKCharacterValidation.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/CJKCharacterValidation.cs deleted file mode 100644 index 6134a3cdd..000000000 --- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/CJKCharacterValidation.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Text.RegularExpressions; - -namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard -{ - public static partial class CJKCharacterValidation - { - public static bool IsCJK(char value) - { - Regex regex = CJKRegex(); - - return regex.IsMatch(value.ToString()); - } - - [GeneratedRegex("\\p{IsHangulJamo}|\\p{IsCJKRadicalsSupplement}|\\p{IsCJKSymbolsandPunctuation}|\\p{IsEnclosedCJKLettersandMonths}|\\p{IsCJKCompatibility}|\\p{IsCJKUnifiedIdeographsExtensionA}|\\p{IsCJKUnifiedIdeographs}|\\p{IsHangulSyllables}|\\p{IsCJKCompatibilityForms}")] - private static partial Regex CJKRegex(); - } -} diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/CharacterValidation.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/CharacterValidation.cs new file mode 100644 index 000000000..5ce8204cb --- /dev/null +++ b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/CharacterValidation.cs @@ -0,0 +1,10 @@ +using Ryujinx.Common.Helper; + +namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard +{ + public static class CharacterValidation + { + public static bool IsNumeric(char value) => Patterns.Numeric.IsMatch(value.ToString()); + public static bool IsCJK(char value) => Patterns.CJK.IsMatch(value.ToString()); + } +} diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/NumericCharacterValidation.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/NumericCharacterValidation.cs deleted file mode 100644 index d72b68eae..000000000 --- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/NumericCharacterValidation.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Text.RegularExpressions; - -namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard -{ - public static partial class NumericCharacterValidation - { - public static bool IsNumeric(char value) - { - Regex regex = NumericRegex(); - - return regex.IsMatch(value.ToString()); - } - - [GeneratedRegex("[0-9]|.")] - private static partial Regex NumericRegex(); - } -} diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs index 9ec202357..58871a069 100644 --- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardApplet.cs @@ -14,6 +14,7 @@ using System.IO; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; +using System.Threading; namespace Ryujinx.HLE.HOS.Applets { @@ -62,7 +63,7 @@ namespace Ryujinx.HLE.HOS.Applets private bool _canAcceptController = false; private KeyboardInputMode _inputMode = KeyboardInputMode.ControllerAndKeyboard; - private readonly object _lock = new(); + private readonly Lock _lock = new(); public event EventHandler AppletStateChanged; @@ -80,8 +81,8 @@ namespace Ryujinx.HLE.HOS.Applets _interactiveSession.DataAvailable += OnInteractiveData; - var launchParams = _normalSession.Pop(); - var keyboardConfig = _normalSession.Pop(); + byte[] launchParams = _normalSession.Pop(); + byte[] keyboardConfig = _normalSession.Pop(); _isBackground = keyboardConfig.Length == Unsafe.SizeOf(); @@ -146,19 +147,19 @@ namespace Ryujinx.HLE.HOS.Applets private bool IsKeyboardActive() { - return _backgroundState >= InlineKeyboardState.Appearing && _backgroundState < InlineKeyboardState.Disappearing; + return _backgroundState is >= InlineKeyboardState.Appearing and < InlineKeyboardState.Disappearing; } private bool InputModeControllerEnabled() { - return _inputMode == KeyboardInputMode.ControllerAndKeyboard || - _inputMode == KeyboardInputMode.ControllerOnly; + return _inputMode is KeyboardInputMode.ControllerAndKeyboard or + KeyboardInputMode.ControllerOnly; } private bool InputModeTypingEnabled() { - return _inputMode == KeyboardInputMode.ControllerAndKeyboard || - _inputMode == KeyboardInputMode.KeyboardOnly; + return _inputMode is KeyboardInputMode.ControllerAndKeyboard or + KeyboardInputMode.KeyboardOnly; } private void AdvanceInputMode() @@ -204,7 +205,7 @@ namespace Ryujinx.HLE.HOS.Applets else { // Call the configured GUI handler to get user's input. - var args = new SoftwareKeyboardUIArgs + SoftwareKeyboardUIArgs args = new() { KeyboardMode = _keyboardForegroundConfig.Mode, HeaderText = StripUnicodeControlCodes(_keyboardForegroundConfig.HeaderText), @@ -264,7 +265,7 @@ namespace Ryujinx.HLE.HOS.Applets private void OnInteractiveData(object sender, EventArgs e) { // Obtain the validation status response. - var data = _interactiveSession.Pop(); + byte[] data = _interactiveSession.Pop(); if (_isBackground) { @@ -319,7 +320,7 @@ namespace Ryujinx.HLE.HOS.Applets using MemoryStream stream = new(data); using BinaryReader reader = new(stream); - var request = (InlineKeyboardRequest)reader.ReadUInt32(); + InlineKeyboardRequest request = (InlineKeyboardRequest)reader.ReadUInt32(); long remaining; @@ -364,6 +365,7 @@ namespace Ryujinx.HLE.HOS.Applets } } } + _interactiveSession.Push(InlineResponses.ReleasedUserWordInfo(_backgroundState)); break; case InlineKeyboardRequest.SetCustomizeDic: @@ -377,6 +379,7 @@ namespace Ryujinx.HLE.HOS.Applets { _keyboardBackgroundDic = reader.ReadStruct(); } + break; case InlineKeyboardRequest.SetCustomizedDictionaries: // Read the custom dictionaries data. @@ -389,6 +392,7 @@ namespace Ryujinx.HLE.HOS.Applets { _keyboardBackgroundDictSet = reader.ReadStruct(); } + break; case InlineKeyboardRequest.Calc: // The Calc request is used to communicate configuration changes and commands to the keyboard. @@ -399,14 +403,14 @@ namespace Ryujinx.HLE.HOS.Applets remaining = stream.Length - stream.Position; if (remaining == Marshal.SizeOf()) { - var keyboardCalcData = reader.ReadBytes((int)remaining); - var keyboardCalc = ReadStruct(keyboardCalcData); + byte[] keyboardCalcData = reader.ReadBytes((int)remaining); + SoftwareKeyboardCalc keyboardCalc = ReadStruct(keyboardCalcData); newCalc = keyboardCalc.ToExtended(); } else if (remaining == Marshal.SizeOf() || remaining == SoftwareKeyboardCalcEx.AlternativeSize) { - var keyboardCalcData = reader.ReadBytes((int)remaining); + byte[] keyboardCalcData = reader.ReadBytes((int)remaining); newCalc = ReadStruct(keyboardCalcData); } diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRenderer.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRenderer.cs index 239535ad5..f65d6a018 100644 --- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRenderer.cs +++ b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRenderer.cs @@ -117,8 +117,8 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard _state.OverwriteMode = overwriteMode.GetValueOrDefault(_state.OverwriteMode); _state.TypingEnabled = typingEnabled.GetValueOrDefault(_state.TypingEnabled); - var begin = _state.CursorBegin; - var end = _state.CursorEnd; + int begin = _state.CursorBegin; + int end = _state.CursorEnd; _state.CursorBegin = Math.Min(begin, end); _state.CursorEnd = Math.Max(begin, end); diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs index 67b5f2b1f..5e048e55d 100644 --- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs +++ b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/SoftwareKeyboardRendererBase.cs @@ -5,7 +5,7 @@ using System; using System.Diagnostics; using System.IO; using System.Reflection; -using System.Runtime.InteropServices; +using System.Threading; namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard { @@ -21,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard const string CancelText = "Cancel"; const string ControllerToggleText = "Toggle input"; - private readonly object _bufferLock = new(); + private readonly Lock _bufferLock = new(); private RenderingSurfaceInfo _surfaceInfo = null; private SKImageInfo _imageInfo; @@ -74,10 +74,10 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard _padCancelIcon = LoadResource(typeof(SoftwareKeyboardRendererBase).Assembly, padCancelIconPath, 0, 0); _keyModeIcon = LoadResource(typeof(SoftwareKeyboardRendererBase).Assembly, keyModeIconPath, 0, 0); - var panelColor = ToColor(uiTheme.DefaultBackgroundColor, 255); - var panelTransparentColor = ToColor(uiTheme.DefaultBackgroundColor, 150); - var borderColor = ToColor(uiTheme.DefaultBorderColor); - var selectionBackgroundColor = ToColor(uiTheme.SelectionBackgroundColor); + SKColor panelColor = ToColor(uiTheme.DefaultBackgroundColor, 255); + SKColor panelTransparentColor = ToColor(uiTheme.DefaultBackgroundColor, 150); + SKColor borderColor = ToColor(uiTheme.DefaultBorderColor); + SKColor selectionBackgroundColor = ToColor(uiTheme.SelectionBackgroundColor); _textNormalColor = ToColor(uiTheme.DefaultForegroundColor); _textSelectedColor = ToColor(uiTheme.SelectionForegroundColor); @@ -121,19 +121,20 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard { // Try a list of fonts in case any of them is not available in the system. - string[] availableFonts = { + string[] availableFonts = + [ uiThemeFontFamily, "Liberation Sans", "FreeSans", "DejaVu Sans", - "Lucida Grande", - }; + "Lucida Grande" + ]; foreach (string fontFamily in availableFonts) { try { - using var typeface = SKTypeface.FromFamilyName(fontFamily, SKFontStyle.Normal); + using SKTypeface typeface = SKTypeface.FromFamilyName(fontFamily, SKFontStyle.Normal); _messageFont = new SKFont(typeface, 26); _inputTextFont = new SKFont(typeface, _inputTextFontSize); _labelsTextFont = new SKFont(typeface, 24); @@ -150,10 +151,10 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard private static SKColor ToColor(ThemeColor color, byte? overrideAlpha = null, bool flipRgb = false) { - var a = (byte)(color.A * 255); - var r = (byte)(color.R * 255); - var g = (byte)(color.G * 255); - var b = (byte)(color.B * 255); + byte a = (byte)(color.A * 255); + byte r = (byte)(color.R * 255); + byte g = (byte)(color.G * 255); + byte b = (byte)(color.B * 255); if (flipRgb) { @@ -176,11 +177,11 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard { Debug.Assert(resourceStream != null); - var bitmap = SKBitmap.Decode(resourceStream); + SKBitmap bitmap = SKBitmap.Decode(resourceStream); if (newHeight != 0 && newWidth != 0) { - var resized = bitmap.Resize(new SKImageInfo(newWidth, newHeight), SKFilterQuality.High); + SKBitmap resized = bitmap.Resize(new SKImageInfo(newWidth, newHeight), SKFilterQuality.High); if (resized != null) { bitmap.Dispose(); @@ -197,7 +198,8 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard { return; } - var canvas = _surface.Canvas; + + SKCanvas canvas = _surface.Canvas; canvas.Clear(SKColors.Transparent); canvas.DrawRect(_panelRectangle, _panelBrush); @@ -218,18 +220,18 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard return; } - using var paint = new SKPaint(_messageFont) + using SKPaint paint = new(_messageFont) { Color = _textNormalColor, IsAntialias = true }; - var canvas = _surface.Canvas; - var messageRectangle = MeasureString(MessageText, paint); + SKCanvas canvas = _surface.Canvas; + SKRect messageRectangle = MeasureString(MessageText, paint); float messagePositionX = (_panelRectangle.Width - messageRectangle.Width) / 2 - messageRectangle.Left; float messagePositionY = _messagePositionY - messageRectangle.Top; - var messagePosition = new SKPoint(messagePositionX, messagePositionY); - var messageBoundRectangle = SKRect.Create(messagePositionX, messagePositionY, messageRectangle.Width, messageRectangle.Height); + SKPoint messagePosition = new(messagePositionX, messagePositionY); + SKRect messageBoundRectangle = SKRect.Create(messagePositionX, messagePositionY, messageRectangle.Width, messageRectangle.Height); canvas.DrawRect(messageBoundRectangle, _panelBrush); @@ -335,12 +337,12 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard private void DrawTextBox(SKCanvas canvas, SoftwareKeyboardUIState state) { - using var textPaint = new SKPaint(_labelsTextFont) + using SKPaint textPaint = new(_labelsTextFont) { IsAntialias = true, Color = _textNormalColor }; - var inputTextRectangle = MeasureString(state.InputText, textPaint); + SKRect inputTextRectangle = MeasureString(state.InputText, textPaint); float boxWidth = (int)(Math.Max(300, inputTextRectangle.Width + inputTextRectangle.Left + 8)); float boxHeight = 32; @@ -359,7 +361,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard float inputTextX = (_panelRectangle.Width - inputTextRectangle.Width) / 2 - inputTextRectangle.Left; float inputTextY = boxY + 5; - var inputTextPosition = new SKPoint(inputTextX, inputTextY); + SKPoint inputTextPosition = new(inputTextX, inputTextY); canvas.DrawText(state.InputText, inputTextPosition.X, inputTextPosition.Y + (_labelsTextFont.Metrics.XHeight + _labelsTextFont.Metrics.Descent), textPaint); // Draw the cursor on top of the text and redraw the text with a different color if necessary. @@ -375,7 +377,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard bool cursorVisible = false; - if (state.CursorBegin != state.CursorEnd) + if (state.CursorBegin != state.CursorEnd && state.CursorEnd <= state.InputText.Length) { Debug.Assert(state.InputText.Length > 0); @@ -386,8 +388,8 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard ReadOnlySpan textUntilBegin = state.InputText.AsSpan(0, state.CursorBegin); ReadOnlySpan textUntilEnd = state.InputText.AsSpan(0, state.CursorEnd); - var selectionBeginRectangle = MeasureString(textUntilBegin, textPaint); - var selectionEndRectangle = MeasureString(textUntilEnd, textPaint); + SKRect selectionBeginRectangle = MeasureString(textUntilBegin, textPaint); + SKRect selectionEndRectangle = MeasureString(textUntilEnd, textPaint); cursorVisible = true; cursorPositionXLeft = inputTextX + selectionBeginRectangle.Width + selectionBeginRectangle.Left; @@ -405,7 +407,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard int cursorBegin = Math.Min(state.InputText.Length, state.CursorBegin); ReadOnlySpan textUntilCursor = state.InputText.AsSpan(0, cursorBegin); - var cursorTextRectangle = MeasureString(textUntilCursor, textPaint); + SKRect cursorTextRectangle = MeasureString(textUntilCursor, textPaint); cursorVisible = true; cursorPositionXLeft = inputTextX + cursorTextRectangle.Width + cursorTextRectangle.Left; @@ -451,16 +453,16 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard } else { - var cursorRectangle = SKRect.Create(cursorPositionXLeft, cursorPositionYTop, cursorWidth, cursorHeight); + SKRect cursorRectangle = SKRect.Create(cursorPositionXLeft, cursorPositionYTop, cursorWidth, cursorHeight); canvas.DrawRect(cursorRectangle, cursorPen); canvas.DrawRect(cursorRectangle, cursorBrush); - using var textOverCursor = SKSurface.Create(new SKImageInfo((int)cursorRectangle.Width, (int)cursorRectangle.Height, SKColorType.Rgba8888)); - var textOverCanvas = textOverCursor.Canvas; - var textRelativePosition = new SKPoint(inputTextPosition.X - cursorRectangle.Left, inputTextPosition.Y - cursorRectangle.Top); + using SKSurface textOverCursor = SKSurface.Create(new SKImageInfo((int)cursorRectangle.Width, (int)cursorRectangle.Height, SKColorType.Rgba8888)); + SKCanvas textOverCanvas = textOverCursor.Canvas; + SKPoint textRelativePosition = new(inputTextPosition.X - cursorRectangle.Left, inputTextPosition.Y - cursorRectangle.Top); - using var cursorPaint = new SKPaint(_inputTextFont) + using SKPaint cursorPaint = new(_inputTextFont) { Color = cursorTextColor, IsAntialias = true @@ -468,7 +470,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard textOverCanvas.DrawText(state.InputText, textRelativePosition.X, textRelativePosition.Y + _inputTextFont.Metrics.XHeight + _inputTextFont.Metrics.Descent, cursorPaint); - var cursorPosition = new SKPoint((int)cursorRectangle.Left, (int)cursorRectangle.Top); + SKPoint cursorPosition = new((int)cursorRectangle.Left, (int)cursorRectangle.Top); textOverCursor.Flush(); canvas.DrawSurface(textOverCursor, cursorPosition); } @@ -491,13 +493,13 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard float iconWidth = icon.Width; float iconHeight = icon.Height; - using var paint = new SKPaint(_labelsTextFont) + using SKPaint paint = new(_labelsTextFont) { Color = _textNormalColor, IsAntialias = true }; - var labelRectangle = MeasureString(label, paint); + SKRect labelRectangle = MeasureString(label, paint); float labelPositionX = iconWidth + 8 - labelRectangle.Left; float labelPositionY = 3; @@ -513,13 +515,13 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard iconX += originX; iconY += originY; - var iconPosition = new SKPoint((int)iconX, (int)iconY); - var labelPosition = new SKPoint(labelPositionX + originX, labelPositionY + originY); + SKPoint iconPosition = new((int)iconX, (int)iconY); + SKPoint labelPosition = new(labelPositionX + originX, labelPositionY + originY); - var selectedRectangle = SKRect.Create(originX - 2 * _padPressedPenWidth, originY - 2 * _padPressedPenWidth, + SKRect selectedRectangle = SKRect.Create(originX - 2 * _padPressedPenWidth, originY - 2 * _padPressedPenWidth, fullWidth + 4 * _padPressedPenWidth, fullHeight + 4 * _padPressedPenWidth); - var boundRectangle = SKRect.Create(originX, originY, fullWidth, fullHeight); + SKRect boundRectangle = SKRect.Create(originX, originY, fullWidth, fullHeight); boundRectangle.Inflate(4 * _padPressedPenWidth, 4 * _padPressedPenWidth); canvas.DrawRect(boundRectangle, _panelBrush); @@ -544,12 +546,12 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard private void DrawControllerToggle(SKCanvas canvas, SKPoint point) { - using var paint = new SKPaint(_labelsTextFont) + using SKPaint paint = new(_labelsTextFont) { IsAntialias = true, Color = _textNormalColor }; - var labelRectangle = MeasureString(ControllerToggleText, paint); + SKRect labelRectangle = MeasureString(ControllerToggleText, paint); // Use relative positions so we can center the entire drawing later. @@ -573,8 +575,8 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard keyX += originX; keyY += originY; - var labelPosition = new SKPoint(labelPositionX + originX, labelPositionY + originY); - var overlayPosition = new SKPoint((int)keyX, (int)keyY); + SKPoint labelPosition = new(labelPositionX + originX, labelPositionY + originY); + SKPoint overlayPosition = new((int)keyX, (int)keyY); canvas.DrawBitmap(_keyModeIcon, overlayPosition); canvas.DrawText(ControllerToggleText, labelPosition.X, labelPosition.Y + _labelsTextFont.Metrics.XHeight, paint); @@ -592,7 +594,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard // Convert the pixel format used in the image to the one used in the Switch surface. _surface.Flush(); - var buffer = new byte[_imageInfo.BytesSize]; + byte[] buffer = new byte[_imageInfo.BytesSize]; fixed (byte* bufferPtr = buffer) { if (!_surface.ReadPixels(_imageInfo, (nint)bufferPtr, _imageInfo.RowBytes, 0, 0)) diff --git a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/TimedAction.cs b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/TimedAction.cs index 3eaf64596..7a6ce8f32 100644 --- a/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/TimedAction.cs +++ b/src/Ryujinx.HLE/HOS/Applets/SoftwareKeyboard/TimedAction.cs @@ -27,7 +27,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard private TRef _cancelled = null; private Thread _thread = null; - private readonly object _lock = new(); + private readonly Lock _lock = new(); public bool IsRunning { @@ -79,11 +79,11 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard public void Reset(Action action, int totalMilliseconds, int sleepMilliseconds) { // Create a dedicated cancel token for each task. - var cancelled = new TRef(false); + TRef cancelled = new(false); Reset(new Thread(() => { - var substepData = new SleepSubstepData(sleepMilliseconds); + SleepSubstepData substepData = new(sleepMilliseconds); int totalCount = totalMilliseconds / sleepMilliseconds; int totalRemainder = totalMilliseconds - totalCount * sleepMilliseconds; @@ -126,11 +126,11 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard public void Reset(Action action, int sleepMilliseconds) { // Create a dedicated cancel token for each task. - var cancelled = new TRef(false); + TRef cancelled = new(false); Reset(new Thread(() => { - var substepData = new SleepSubstepData(sleepMilliseconds); + SleepSubstepData substepData = new(sleepMilliseconds); while (!Volatile.Read(ref cancelled.Value)) { @@ -147,7 +147,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard public void Reset(Action action) { // Create a dedicated cancel token for each task. - var cancelled = new TRef(false); + TRef cancelled = new(false); Reset(new Thread(() => { diff --git a/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs b/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs index 14775fb1d..759780c42 100644 --- a/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs +++ b/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs @@ -20,6 +20,7 @@ namespace Ryujinx.HLE.HOS private readonly string _titleIdText; private readonly string _displayVersion; private readonly bool _diskCacheEnabled; + private readonly string _diskCacheSelector; private readonly ulong _codeAddress; private readonly ulong _codeSize; @@ -31,6 +32,7 @@ namespace Ryujinx.HLE.HOS string titleIdText, string displayVersion, bool diskCacheEnabled, + string diskCacheSelector, ulong codeAddress, ulong codeSize) { @@ -39,6 +41,7 @@ namespace Ryujinx.HLE.HOS _titleIdText = titleIdText; _displayVersion = displayVersion; _diskCacheEnabled = diskCacheEnabled; + _diskCacheSelector = diskCacheSelector; _codeAddress = codeAddress; _codeSize = codeSize; } @@ -51,8 +54,8 @@ namespace Ryujinx.HLE.HOS if (OperatingSystem.IsMacOS() && isArm64Host && for64Bit && context.Device.Configuration.UseHypervisor) { - var cpuEngine = new HvEngine(_tickSource); - var memoryManager = new HvMemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler); + HvEngine cpuEngine = new(_tickSource); + HvMemoryManager memoryManager = new(context.Memory, addressSpaceSize, invalidAccessHandler); processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManager, addressSpaceSize, for64Bit); } else @@ -86,7 +89,7 @@ namespace Ryujinx.HLE.HOS switch (mode) { case MemoryManagerMode.SoftwarePageTable: - var memoryManager = new MemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler); + MemoryManager memoryManager = new(context.Memory, addressSpaceSize, invalidAccessHandler); processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManager, addressSpaceSize, for64Bit); break; @@ -94,7 +97,7 @@ namespace Ryujinx.HLE.HOS case MemoryManagerMode.HostMappedUnsafe: if (addressSpace == null) { - var memoryManagerHostTracked = new MemoryManagerHostTracked(context.Memory, addressSpaceSize, mode == MemoryManagerMode.HostMappedUnsafe, invalidAccessHandler); + MemoryManagerHostTracked memoryManagerHostTracked = new(context.Memory, addressSpaceSize, mode == MemoryManagerMode.HostMappedUnsafe, invalidAccessHandler); processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManagerHostTracked, addressSpaceSize, for64Bit); } else @@ -104,9 +107,10 @@ namespace Ryujinx.HLE.HOS Logger.Warning?.Print(LogClass.Emulation, $"Allocated address space (0x{addressSpace.AddressSpaceSize:X}) is smaller than guest application requirements (0x{addressSpaceSize:X})"); } - var memoryManagerHostMapped = new MemoryManagerHostMapped(addressSpace, mode == MemoryManagerMode.HostMappedUnsafe, invalidAccessHandler); + MemoryManagerHostMapped memoryManagerHostMapped = new(addressSpace, mode == MemoryManagerMode.HostMappedUnsafe, invalidAccessHandler); processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManagerHostMapped, addressSpace.AddressSpaceSize, for64Bit); } + break; default: @@ -114,7 +118,7 @@ namespace Ryujinx.HLE.HOS } } - DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize, "default"); //Ready for exefs profiles + DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize, _diskCacheSelector ?? "default"); return processContext; } diff --git a/src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Demangler.cs b/src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Demangler.cs index 2e7b8ee76..5424342fb 100644 --- a/src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Demangler.cs +++ b/src/Ryujinx.HLE/HOS/Diagnostics/Demangler/Demangler.cs @@ -9,10 +9,10 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler class Demangler { private const string Base36 = "0123456789abcdefghijklmnopqrstuvwxyz"; - private readonly List _substitutionList = new(); - private List _templateParamList = new(); + private readonly List _substitutionList = []; + private List _templateParamList = []; - private readonly List _forwardTemplateReferenceList = new(); + private readonly List _forwardTemplateReferenceList = []; public string Mangled { get; private set; } @@ -32,7 +32,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler private bool ConsumeIf(string toConsume) { - var mangledPart = Mangled.AsSpan(_position); + ReadOnlySpan mangledPart = Mangled.AsSpan(_position); if (mangledPart.StartsWith(toConsume.AsSpan())) { @@ -210,7 +210,6 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return true; } - // ::= # non-dependent type name, dependent type name, or dependent typename-specifier // ::= Ts # dependent elaborated type specifier using 'struct' or 'class' // ::= Tu # dependent elaborated type specifier using 'union' @@ -252,7 +251,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler // ::= Do # non-throwing exception-specification (e.g., noexcept, throw()) // ::= DO E # computed (instantiation-dependent) noexcept // ::= Dw + E # dynamic exception specification with instantiation-dependent types - private BaseNode ParseFunctionType() + private FunctionType ParseFunctionType() { Cv cvQualifiers = ParseCvQualifiers(); @@ -274,7 +273,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler } else if (ConsumeIf("Dw")) { - List types = new(); + List types = []; while (!ConsumeIf("E")) { @@ -308,7 +307,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler } Reference referenceQualifier = Reference.None; - List paramsList = new(); + List paramsList = []; while (true) { @@ -347,7 +346,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler // ::= A _ // ::= A [] _ - private BaseNode ParseArrayType() + private ArrayType ParseArrayType() { if (!ConsumeIf("A")) { @@ -570,6 +569,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler default: return null; } + break; case 'F': result = ParseFunctionType(); @@ -582,7 +582,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return null; case 'T': // might just be a class enum type - if (Peek(1) == 's' || Peek(1) == 'u' || Peek(1) == 'e') + if (Peek(1) is 's' or 'u' or 'e') { result = ParseClassEnumType(); break; @@ -604,6 +604,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler result = new NameTypeWithTemplateArguments(result, templateArguments); } + break; case 'P': _position++; @@ -680,6 +681,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler result = new NameTypeWithTemplateArguments(substitution, templateArgument); break; } + return substitution; } else @@ -691,6 +693,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler result = ParseClassEnumType(); break; } + if (result != null) { _substitutionList.Add(result); @@ -723,6 +726,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new SpecialName("guard variable for ", name); } + return null; } @@ -848,10 +852,12 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler { qualifiers |= Cv.Restricted; } + if (ConsumeIf("V")) { qualifiers |= Cv.Volatile; } + if (ConsumeIf("K")) { qualifiers |= Cv.Const; @@ -860,7 +866,6 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return qualifiers; } - // ::= R # & ref-qualifier // ::= O # && ref-qualifier private SimpleReferenceType ParseRefQualifiers() @@ -874,6 +879,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler { result = Reference.LValue; } + return new SimpleReferenceType(result, null); } @@ -945,7 +951,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler } // ::= - private BaseNode ParseSourceName() + private NameType ParseSourceName() { int length = ParsePositiveNumber(); if (Count() < length || length <= 0) @@ -1131,6 +1137,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _position += 2; return new NameType("operator[]"); } + return null; case 'l': switch (Peek(1)) @@ -1244,6 +1251,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _position += 2; return new NameType("operator?"); } + return null; case 'r': switch (Peek(1)) @@ -1269,6 +1277,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _position += 2; return new NameType("operator<=>"); } + return null; case 'v': // TODO: ::= v # vendor extended operator @@ -1311,6 +1320,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler // TODO: ABI Tags // throw new Exception("ABI Tags not implemented"); } + return result; } @@ -1320,7 +1330,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler // ::= D0 # deleting destructor // ::= D1 # complete object destructor // ::= D2 # base object destructor - private BaseNode ParseCtorDtorName(NameParserContext context, BaseNode prev) + private CtorDtorNameType ParseCtorDtorName(NameParserContext context, BaseNode prev) { if (prev.Type == NodeType.SpecialSubstitution && prev is SpecialSubstitution substitution) { @@ -1332,7 +1342,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler bool isInherited = ConsumeIf("I"); char ctorDtorType = Peek(); - if (ctorDtorType != '1' && ctorDtorType != '2' && ctorDtorType != '3') + if (ctorDtorType is not '1' and not '2' and not '3') { return null; } @@ -1355,7 +1365,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler if (ConsumeIf("D")) { char c = Peek(); - if (c != '0' && c != '1' && c != '2') + if (c is not '0' and not '1' and not '2') { return null; } @@ -1377,7 +1387,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler // ::= fp _ # L == 0, second and later parameters // ::= fL p _ # L > 0, first parameter // ::= fL p _ # L > 0, second and later parameters - private BaseNode ParseFunctionParameter() + private FunctionParameter ParseFunctionParameter() { if (ConsumeIf("fp")) { @@ -1422,7 +1432,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler // ::= fR // ::= fl // ::= fr - private BaseNode ParseFoldExpression() + private FoldExpression ParseFoldExpression() { if (!ConsumeIf("f")) { @@ -1430,8 +1440,8 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler } char foldKind = Peek(); - bool hasInitializer = foldKind == 'L' || foldKind == 'R'; - bool isLeftFold = foldKind == 'l' || foldKind == 'L'; + bool hasInitializer = foldKind is 'L' or 'R'; + bool isLeftFold = foldKind is 'l' or 'L'; if (!isLeftFold && !(foldKind == 'r' || foldKind == 'R')) { @@ -1568,10 +1578,9 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new FoldExpression(isLeftFold, operatorName, new PackedTemplateParameterExpansion(expression), initializer); } - // ::= cv # type (expression), conversion with one argument // ::= cv _ * E # type (expr-list), conversion with other than one argument - private BaseNode ParseConversionExpression() + private ConversionExpression ParseConversionExpression() { if (!ConsumeIf("cv")) { @@ -1588,7 +1597,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return null; } - List expressions = new(); + List expressions = []; if (ConsumeIf("_")) { while (!ConsumeIf("E")) @@ -1616,7 +1625,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new ConversionExpression(type, new NodeArray(expressions)); } - private BaseNode ParseBinaryExpression(string name) + private BinaryExpression ParseBinaryExpression(string name) { BaseNode leftPart = ParseExpression(); if (leftPart == null) @@ -1633,7 +1642,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new BinaryExpression(leftPart, name, rightPart); } - private BaseNode ParsePrefixExpression(string name) + private PrefixExpression ParsePrefixExpression(string name) { BaseNode expression = ParseExpression(); if (expression == null) @@ -1644,7 +1653,6 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new PrefixExpression(name, expression); } - // ::= // ::= di # .name = expr // ::= dx # [expr] = expr @@ -1720,7 +1728,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler // ::= [gs] na * _ # new[] (expr-list) type (init) // // ::= pi * E # parenthesized initialization - private BaseNode ParseNewExpression() + private NewExpression ParseNewExpression() { bool isGlobal = ConsumeIf("gs"); bool isArray = Peek(1) == 'a'; @@ -1730,8 +1738,8 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return null; } - List expressions = new(); - List initializers = new(); + List expressions = []; + List initializers = []; while (!ConsumeIf("_")) { @@ -1771,7 +1779,6 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new NewExpression(new NodeArray(expressions), typeNode, new NodeArray(initializers), isGlobal, isArray); } - // ::= // ::= // ::= @@ -1872,6 +1879,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new EnclosedExpression("alignof (", expression, ")"); } + return null; case 'c': switch (Peek(1)) @@ -1899,7 +1907,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return null; } - List names = new(); + List names = []; while (!ConsumeIf("E")) { expression = ParseExpression(); @@ -1910,6 +1918,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler names.Add(expression); } + return new CallExpression(callee, names); case 'm': _position += 2; @@ -1920,6 +1929,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler case 'v': return ParseConversionExpression(); } + return null; case 'd': BaseNode leftNode; @@ -2001,6 +2011,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _position += 2; return ParseBinaryExpression("/="); } + return null; case 'e': switch (Peek(1)) @@ -2015,6 +2026,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _position += 2; return ParseBinaryExpression("=="); } + return null; case 'g': switch (Peek(1)) @@ -2026,6 +2038,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _position += 2; return ParseBinaryExpression(">"); } + return null; case 'i': switch (Peek(1)) @@ -2048,7 +2061,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler case 'l': _position += 2; - List bracedExpressions = new(); + List bracedExpressions = []; while (!ConsumeIf("E")) { expression = ParseBracedExpression(); @@ -2059,8 +2072,10 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler bracedExpressions.Add(expression); } + return new InitListExpression(null, bracedExpressions); } + return null; case 'l': switch (Peek(1)) @@ -2078,6 +2093,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _position += 2; return ParseBinaryExpression("<"); } + return null; case 'm': switch (Peek(1)) @@ -2109,6 +2125,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new PostfixExpression(expression, "--"); } + return null; case 'n': switch (Peek(1)) @@ -2136,6 +2153,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new EnclosedExpression("noexcept (", expression, ")"); } + return null; case 'o': switch (Peek(1)) @@ -2152,6 +2170,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _position += 2; return ParseBinaryExpression("|="); } + return null; case 'p': switch (Peek(1)) @@ -2196,6 +2215,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new MemberExpression(leftNode, "->", rightNode); } + return null; case 'q': if (Peek(1) == 'u') @@ -2221,6 +2241,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new ConditionalExpression(condition, leftNode, rightNode); } + return null; case 'r': switch (Peek(1)) @@ -2253,6 +2274,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _position += 2; return ParseBinaryExpression(">>="); } + return null; case 's': switch (Peek(1)) @@ -2324,10 +2346,11 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new EnclosedExpression("sizeof...(", sizeofParamNode, ")"); } + return null; case 'P': _position += 2; - List arguments = new(); + List arguments = []; while (!ConsumeIf("E")) { BaseNode argument = ParseTemplateArgument(); @@ -2338,8 +2361,10 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler arguments.Add(argument); } + return new EnclosedExpression("sizeof...(", new NodeArray(arguments), ")"); } + return null; case 't': switch (Peek(1)) @@ -2368,7 +2393,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return null; } - List bracedExpressions = new(); + List bracedExpressions = []; while (!ConsumeIf("E")) { expression = ParseBracedExpression(); @@ -2379,6 +2404,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler bracedExpressions.Add(expression); } + return new InitListExpression(typeNode, bracedExpressions); case 'r': _position += 2; @@ -2393,6 +2419,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new ThrowExpression(expression); } + return null; } @@ -2404,7 +2431,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return null; } - private BaseNode ParseIntegerLiteral(string literalName) + private IntegerLiteral ParseIntegerLiteral(string literalName) { string number = ParseNumber(true); if (number == null || number.Length == 0 || !ConsumeIf("E")) @@ -2499,6 +2526,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return encoding; } } + return null; case 'T': return null; @@ -2521,7 +2549,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler // ::= Dt E # decltype of an id-expression or class member access (C++0x) // ::= DT E # decltype of an expression (C++0x) - private BaseNode ParseDecltype() + private EnclosedExpression ParseDecltype() { if (!ConsumeIf("D") || (!ConsumeIf("t") && !ConsumeIf("T"))) { @@ -2579,6 +2607,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _forwardTemplateReferenceList.Add(forwardTemplateReference); return forwardTemplateReference; } + if (index >= _templateParamList.Count) { return null; @@ -2588,7 +2617,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler } // ::= I + E - private BaseNode ParseTemplateArguments(bool hasContext = false) + private TemplateArguments ParseTemplateArguments(bool hasContext = false) { if (!ConsumeIf("I")) { @@ -2600,12 +2629,12 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _templateParamList.Clear(); } - List args = new(); + List args = []; while (!ConsumeIf("E")) { if (hasContext) { - List templateParamListTemp = new(_templateParamList); + List templateParamListTemp = [.. _templateParamList]; BaseNode templateArgument = ParseTemplateArgument(); _templateParamList = templateParamListTemp; if (templateArgument == null) @@ -2618,6 +2647,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler { templateArgument = new PackedTemplateParameter(((NodeArray)templateArgument).Nodes); } + _templateParamList.Add(templateArgument); } else @@ -2631,10 +2661,10 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler args.Add(templateArgument); } } + return new TemplateArguments(args); } - // ::= # type or template // ::= X E # expression // ::= # simple expressions @@ -2659,7 +2689,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler // J * E case 'J': _position++; - List templateArguments = new(); + List templateArguments = []; while (!ConsumeIf("E")) { BaseNode templateArgument = ParseTemplateArgument(); @@ -2670,6 +2700,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler templateArguments.Add(templateArgument); } + return new NodeArray(templateArguments, NodeType.PackedTemplateArgument); // default: @@ -2685,7 +2716,6 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler public bool CtorDtorConversion; } - // ::= [ ] # T:: or T:: // ::= # decltype(p):: // ::= @@ -2713,6 +2743,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler _substitutionList.Add(declType); return declType; } + return ParseSubstitution(); } @@ -2735,12 +2766,13 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new NameTypeWithTemplateArguments(sourceName, templateArguments); } + return sourceName; } // ::= # e.g., ~T or ~decltype(f()) // ::= # e.g., ~A<2*N> - private BaseNode ParseDestructorName() + private DtorName ParseDestructorName() { BaseNode node; if (char.IsDigit(Peek())) @@ -2751,6 +2783,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler { node = ParseUnresolvedType(); } + if (node == null) { return null; @@ -2794,6 +2827,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new NameTypeWithTemplateArguments(operatorName, templateArguments); } + return operatorName; } @@ -2955,6 +2989,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new StdQualifiedName(unresolvedName); } + return ParseUnresolvedName(context); } @@ -2998,6 +3033,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler continue; } + char c = Peek(); // TODO: template args @@ -3098,10 +3134,12 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler { return null; } + result = CreateNameNode(result, unqualifiedName, context); _substitutionList.Add(result); } + if (result == null || _substitutionList.Count == 0) { return null; @@ -3127,6 +3165,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler { Consume(); } + ConsumeIf("_"); } } @@ -3134,7 +3173,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler // ::= Z E [] // ::= Z E s [] // ::= Z Ed [ ] _ - private BaseNode ParseLocalName(NameParserContext context) + private LocalName ParseLocalName(NameParserContext context) { if (!ConsumeIf("Z")) { @@ -3298,7 +3337,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler return new EncodedFunction(name, null, context.Cv, context.Ref, null, returnType); } - List paramsList = new(); + List paramsList = []; // backup because that can be destroyed by parseType CvType cv = context.Cv; @@ -3329,6 +3368,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler { return encoding; } + return null; } else @@ -3338,6 +3378,7 @@ namespace Ryujinx.HLE.HOS.Diagnostics.Demangler { return type; } + return null; } } diff --git a/src/Ryujinx.HLE/HOS/Horizon.cs b/src/Ryujinx.HLE/HOS/Horizon.cs index 64b08e309..5063b4329 100644 --- a/src/Ryujinx.HLE/HOS/Horizon.cs +++ b/src/Ryujinx.HLE/HOS/Horizon.cs @@ -16,6 +16,8 @@ using Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemA using Ryujinx.HLE.HOS.Services.Apm; using Ryujinx.HLE.HOS.Services.Caps; using Ryujinx.HLE.HOS.Services.Mii; +using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; +using Ryujinx.HLE.HOS.Services.Nfc.Nfp; using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager; using Ryujinx.HLE.HOS.Services.Nv; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl; @@ -128,7 +130,7 @@ namespace Ryujinx.HLE.HOS PerformanceState = new PerformanceState(); - NfpDevices = new List(); + NfpDevices = []; // Note: This is not really correct, but with HLE of services, the only memory // region used that is used is Application, so we can use the other ones for anything. @@ -152,11 +154,11 @@ namespace Ryujinx.HLE.HOS timePageList.AddRange(timePa, TimeSize / KPageTableBase.PageSize); appletCaptureBufferPageList.AddRange(appletCaptureBufferPa, AppletCaptureBufferSize / KPageTableBase.PageSize); - var hidStorage = new SharedMemoryStorage(KernelContext, hidPageList); - var fontStorage = new SharedMemoryStorage(KernelContext, fontPageList); - var iirsStorage = new SharedMemoryStorage(KernelContext, iirsPageList); - var timeStorage = new SharedMemoryStorage(KernelContext, timePageList); - var appletCaptureBufferStorage = new SharedMemoryStorage(KernelContext, appletCaptureBufferPageList); + SharedMemoryStorage hidStorage = new(KernelContext, hidPageList); + SharedMemoryStorage fontStorage = new(KernelContext, fontPageList); + SharedMemoryStorage iirsStorage = new(KernelContext, iirsPageList); + SharedMemoryStorage timeStorage = new(KernelContext, timePageList); + SharedMemoryStorage appletCaptureBufferStorage = new(KernelContext, appletCaptureBufferPageList); HidStorage = hidStorage; @@ -263,7 +265,7 @@ namespace Ryujinx.HLE.HOS HorizonFsClient fsClient = new(this); ServiceTable = new ServiceTable(); - var services = ServiceTable.GetServices(new HorizonOptions + IEnumerable services = ServiceTable.GetServices(new HorizonOptions (Device.Configuration.IgnoreMissingServices, LibHacHorizonManager.BcatClient, fsClient, @@ -271,7 +273,7 @@ namespace Ryujinx.HLE.HOS Device.AudioDeviceDriver, TickSource)); - foreach (var service in services) + foreach (ServiceEntry service in services) { const ProcessCreationFlags Flags = ProcessCreationFlags.EnableAslr | @@ -281,14 +283,15 @@ namespace Ryujinx.HLE.HOS ProcessCreationInfo creationInfo = new("Service", 1, 0, 0x8000000, 1, Flags, 0, 0); - uint[] defaultCapabilities = { - 0x030363F7, + uint[] defaultCapabilities = + [ + (((uint)KScheduler.CpuCoresCount - 1) << 24) + (((uint)KScheduler.CpuCoresCount - 1) << 16) + 0x63F7u, 0x1FFFFFCF, 0x207FFFEF, 0x47E0060F, 0x0048BFFF, - 0x01007FFF, - }; + 0x01007FFF + ]; // TODO: // - Pass enough information (capabilities, process creation info, etc) on ServiceEntry for proper initialization. @@ -302,7 +305,7 @@ namespace Ryujinx.HLE.HOS public bool LoadKip(string kipPath) { - using var kipFile = new SharedRef(new LocalStorage(kipPath, FileAccess.Read)); + using SharedRef kipFile = new(new LocalStorage(kipPath, FileAccess.Read)); return ProcessLoaderHelper.LoadKip(KernelContext, new KipExecutable(in kipFile)); } @@ -337,6 +340,12 @@ namespace Ryujinx.HLE.HOS public void ScanAmiibo(int nfpDeviceId, string amiiboId, bool useRandomUuid) { + if (VirtualAmiibo.ApplicationBytes.Length > 0) + { + VirtualAmiibo.ApplicationBytes = []; + VirtualAmiibo.InputBin = string.Empty; + } + if (NfpDevices[nfpDeviceId].State == NfpDeviceState.SearchingForTag) { NfpDevices[nfpDeviceId].State = NfpDeviceState.TagFound; @@ -344,6 +353,23 @@ namespace Ryujinx.HLE.HOS NfpDevices[nfpDeviceId].UseRandomUuid = useRandomUuid; } } + public void ScanAmiiboFromBin(string path) + { + VirtualAmiibo.InputBin = path; + if (VirtualAmiibo.ApplicationBytes.Length > 0) + { + VirtualAmiibo.ApplicationBytes = []; + } + + byte[] encryptedData = File.ReadAllBytes(path); + VirtualAmiiboFile newFile = AmiiboBinReader.ReadBinFile(encryptedData); + if (SearchingForAmiibo(out int nfpDeviceId)) + { + NfpDevices[nfpDeviceId].State = NfpDeviceState.TagFound; + NfpDevices[nfpDeviceId].AmiiboId = newFile.AmiiboId; + NfpDevices[nfpDeviceId].UseRandomUuid = false; + } + } public bool SearchingForAmiibo(out int nfpDeviceId) { @@ -471,6 +497,7 @@ namespace Ryujinx.HLE.HOS TickSource.Resume(); } } + IsPaused = pause; } } diff --git a/src/Ryujinx.HLE/HOS/HorizonFsClient.cs b/src/Ryujinx.HLE/HOS/HorizonFsClient.cs index 3dbafa88b..56bc3bec3 100644 --- a/src/Ryujinx.HLE/HOS/HorizonFsClient.cs +++ b/src/Ryujinx.HLE/HOS/HorizonFsClient.cs @@ -55,8 +55,8 @@ namespace Ryujinx.HLE.HOS Nca nca = new(_system.KeySet, ncaStorage); - using var ncaFileSystem = nca.OpenFileSystem(NcaSectionType.Data, _system.FsIntegrityCheckLevel); - using var ncaFsRef = new UniqueRef(ncaFileSystem); + using IFileSystem ncaFileSystem = nca.OpenFileSystem(NcaSectionType.Data, _system.FsIntegrityCheckLevel); + using UniqueRef ncaFsRef = new(ncaFileSystem); Result result = _fsClient.Register(mountName.ToU8Span(), ref ncaFsRef.Ref).ToHorizonResult(); if (result.IsFailure) @@ -86,7 +86,7 @@ namespace Ryujinx.HLE.HOS public Result OpenFile(out FileHandle handle, string path, OpenMode openMode) { - var result = _fsClient.OpenFile(out var libhacHandle, path.ToU8Span(), (LibHac.Fs.OpenMode)openMode); + LibHac.Result result = _fsClient.OpenFile(out LibHac.Fs.FileHandle libhacHandle, path.ToU8Span(), (LibHac.Fs.OpenMode)openMode); handle = new(libhacHandle); return result.ToHorizonResult(); diff --git a/src/Ryujinx.HLE/HOS/Ipc/IpcHandleDesc.cs b/src/Ryujinx.HLE/HOS/Ipc/IpcHandleDesc.cs index 887fe28e6..0ed5b74a2 100644 --- a/src/Ryujinx.HLE/HOS/Ipc/IpcHandleDesc.cs +++ b/src/Ryujinx.HLE/HOS/Ipc/IpcHandleDesc.cs @@ -24,7 +24,7 @@ namespace Ryujinx.HLE.HOS.Ipc PId = HasPId ? reader.ReadUInt64() : 0; int toCopySize = (word >> 1) & 0xf; - int[] toCopy = toCopySize == 0 ? Array.Empty() : new int[toCopySize]; + int[] toCopy = toCopySize == 0 ? [] : new int[toCopySize]; for (int index = 0; index < toCopy.Length; index++) { @@ -34,7 +34,7 @@ namespace Ryujinx.HLE.HOS.Ipc ToCopy = toCopy; int toMoveSize = (word >> 5) & 0xf; - int[] toMove = toMoveSize == 0 ? Array.Empty() : new int[toMoveSize]; + int[] toMove = toMoveSize == 0 ? [] : new int[toMoveSize]; for (int index = 0; index < toMove.Length; index++) { @@ -59,12 +59,12 @@ namespace Ryujinx.HLE.HOS.Ipc public static IpcHandleDesc MakeCopy(params int[] handles) { - return new IpcHandleDesc(handles, Array.Empty()); + return new IpcHandleDesc(handles, []); } public static IpcHandleDesc MakeMove(params int[] handles) { - return new IpcHandleDesc(Array.Empty(), handles); + return new IpcHandleDesc([], handles); } public RecyclableMemoryStream GetStream() diff --git a/src/Ryujinx.HLE/HOS/Ipc/IpcMessage.cs b/src/Ryujinx.HLE/HOS/Ipc/IpcMessage.cs index feba09fe3..7df2b778f 100644 --- a/src/Ryujinx.HLE/HOS/Ipc/IpcMessage.cs +++ b/src/Ryujinx.HLE/HOS/Ipc/IpcMessage.cs @@ -26,13 +26,13 @@ namespace Ryujinx.HLE.HOS.Ipc public IpcMessage() { - PtrBuff = new List(0); - SendBuff = new List(0); - ReceiveBuff = new List(0); - ExchangeBuff = new List(0); - RecvListBuff = new List(0); + PtrBuff = []; + SendBuff = []; + ReceiveBuff = []; + ExchangeBuff = []; + RecvListBuff = []; - ObjectIds = new List(0); + ObjectIds = []; } public IpcMessage(ReadOnlySpan data, long cmdPtr) @@ -122,7 +122,7 @@ namespace Ryujinx.HLE.HOS.Ipc RecvListBuff.Add(new IpcRecvListBuffDesc(reader.ReadUInt64())); } - ObjectIds = new List(0); + ObjectIds = []; } public RecyclableMemoryStream GetStream(long cmdPtr, ulong recvListAddr) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs b/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs index 3f16f8c24..25c663e9a 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs @@ -14,7 +14,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Common private readonly long[] _current2; private readonly long[] _peak; - private readonly object _lock; + // type is not Lock due to Monitor class usage + private readonly object _lock = new(); private readonly LinkedList _waitingThreads; @@ -27,9 +28,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common _current2 = new long[(int)LimitableResource.Count]; _peak = new long[(int)LimitableResource.Count]; - _lock = new object(); - - _waitingThreads = new LinkedList(); + _waitingThreads = []; } public bool Reserve(LimitableResource resource, ulong amount) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Common/KSynchronizationObject.cs b/src/Ryujinx.HLE/HOS/Kernel/Common/KSynchronizationObject.cs index 7e725e747..50fe01069 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Common/KSynchronizationObject.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Common/KSynchronizationObject.cs @@ -9,7 +9,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common public KSynchronizationObject(KernelContext context) : base(context) { - WaitingThreads = new LinkedList(); + WaitingThreads = []; } public LinkedListNode AddWaitingThread(KThread thread) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs b/src/Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs index 3c5fa067f..c24648c65 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Common/KTimeManager.cs @@ -34,7 +34,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common public KTimeManager(KernelContext context) { _context = context; - _waitingObjects = new List(); + _waitingObjects = []; _keepRunning = true; Thread work = new(WaitAndCheckScheduledObjects) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs b/src/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs index 8021d8da0..53ceb5b91 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs @@ -72,13 +72,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Common servicePool = new MemoryRegion(DramMemoryMap.SlabHeapEnd, servicePoolSize); - return new[] - { + return + [ GetMemoryRegion(applicationPool), GetMemoryRegion(appletPool), GetMemoryRegion(servicePool), - GetMemoryRegion(nvServicesPool), - }; + GetMemoryRegion(nvServicesPool) + ]; } private static KMemoryRegionManager GetMemoryRegion(MemoryRegion region) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerPort.cs b/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerPort.cs index 08efa8d94..d4e0dbfb5 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerPort.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerPort.cs @@ -16,8 +16,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { _parent = parent; - _incomingConnections = new LinkedList(); - _lightIncomingConnections = new LinkedList(); + _incomingConnections = []; + _lightIncomingConnections = []; } public void EnqueueIncomingSession(KServerSession session) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs b/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs index 3b4280855..edc3d819e 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs @@ -10,12 +10,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { class KServerSession : KSynchronizationObject { - private static readonly MemoryState[] _ipcMemoryStates = { + private static readonly MemoryState[] _ipcMemoryStates = + [ MemoryState.IpcBuffer3, MemoryState.IpcBuffer0, MemoryState.IpcBuffer1, - (MemoryState)0xfffce5d4, //This is invalid, shouldn't be accessed. - }; + (MemoryState)0xfffce5d4 //This is invalid, shouldn't be accessed. + ]; private readonly struct Message { @@ -176,7 +177,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { _parent = parent; - _requests = new LinkedList(); + _requests = []; } public Result EnqueueRequest(KSessionRequest request) @@ -980,7 +981,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { return KernelResult.OutOfResource; } - else if (recvListType == 1 || recvListType == 2) + else if (recvListType is 1 or 2) { ulong recvListBaseAddr; ulong recvListEndAddr; diff --git a/src/Ryujinx.HLE/HOS/Kernel/KernelContext.cs b/src/Ryujinx.HLE/HOS/Kernel/KernelContext.cs index 89d788c54..7e2e9cacc 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/KernelContext.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/KernelContext.cs @@ -63,6 +63,7 @@ namespace Ryujinx.HLE.HOS.Kernel TickSource = tickSource; Device = device; Memory = memory; + KScheduler.CpuCoresCount = device.CpuCoresCount; Running = true; diff --git a/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs b/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs index f5ecba752..e05fc8397 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs @@ -37,7 +37,7 @@ namespace Ryujinx.HLE.HOS.Kernel return result; } - process.DefaultCpuCore = 3; + process.DefaultCpuCore = KScheduler.CpuCoresCount - 1; context.Processes.TryAdd(process.Pid, process); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs index c725501b0..967aa6c0f 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs @@ -4,6 +4,7 @@ using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.Horizon.Common; using System; using System.Diagnostics; +using System.Threading; namespace Ryujinx.HLE.HOS.Kernel.Memory { @@ -11,7 +12,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { public KProcess Owner { get; private set; } private readonly KPageList _pageList; - private readonly object _lock; + private readonly Lock _lock = new(); private ulong _address; private bool _isOwnerMapped; private bool _isMapped; @@ -19,7 +20,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory public KCodeMemory(KernelContext context) : base(context) { _pageList = new KPageList(); - _lock = new object(); } public Result Initialize(ulong address, ulong size) @@ -86,7 +86,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return KernelResult.InvalidState; } - Debug.Assert(permission == KMemoryPermission.Read || permission == KMemoryPermission.ReadAndExecute); + Debug.Assert(permission is KMemoryPermission.Read or KMemoryPermission.ReadAndExecute); Result result = Owner.MemoryManager.MapPages(address, _pageList, MemoryState.CodeReadOnly, permission); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs index e56304d9d..a27bb0074 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryManager.cs @@ -16,7 +16,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { for (int i = 0; i < MemoryRegions.Length; i++) { - var region = MemoryRegions[i]; + KMemoryRegionManager region = MemoryRegions[i]; if (address >= region.Address && address < region.EndAddr) { @@ -41,7 +41,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { while (pagesCount != 0) { - var region = GetMemoryRegion(address); + KMemoryRegionManager region = GetMemoryRegion(address); ulong countToProcess = Math.Min(pagesCount, region.GetPageOffsetFromEnd(address)); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryRegionManager.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryRegionManager.cs index 2eff616c4..270c4ff32 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryRegionManager.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryRegionManager.cs @@ -40,7 +40,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory if (result == Result.Success) { - foreach (var node in pageList) + foreach (KPageNode node in pageList) { IncrementPagesReferenceCount(node.Address, node.PagesCount); } diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageBitmap.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageBitmap.cs index 947983d61..a044ba8b3 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageBitmap.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageBitmap.cs @@ -162,7 +162,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory public bool ClearRange(ulong offset, int count) { int depth = HighestDepthIndex; - var bits = _bitStorages[depth]; + ArraySegment bits = _bitStorages[depth]; int bitInd = (int)(offset / UInt64BitSize); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageHeap.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageHeap.cs index ee5d6e2b6..58d79c31f 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageHeap.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageHeap.cs @@ -84,7 +84,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - private static readonly int[] _memoryBlockPageShifts = { 12, 16, 21, 22, 25, 29, 30 }; + private static readonly int[] _memoryBlockPageShifts = [12, 16, 21, 22, 25, 29, 30]; #pragma warning disable IDE0052 // Remove unread private member private readonly ulong _heapAddress; @@ -105,7 +105,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blocksCount = blockShifts.Length; _blocks = new Block[_memoryBlockPageShifts.Length]; - var currBitmapStorage = new ArraySegment(new ulong[CalculateManagementOverheadSize(size, blockShifts)]); + ArraySegment currBitmapStorage = new(new ulong[CalculateManagementOverheadSize(size, blockShifts)]); for (int i = 0; i < blockShifts.Length; i++) { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageList.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageList.cs index 60514824a..8255a38bf 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageList.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageList.cs @@ -10,7 +10,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory public KPageList() { - Nodes = new LinkedList(); + Nodes = []; } public Result AddRange(ulong address, ulong pagesCount) @@ -70,7 +70,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory public void IncrementPagesReferenceCount(KMemoryManager manager) { - foreach (var node in this) + foreach (KPageNode node in this) { manager.IncrementPagesReferenceCount(node.Address, node.PagesCount); } @@ -78,7 +78,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory public void DecrementPagesReferenceCount(KMemoryManager manager) { - foreach (var node in this) + foreach (KPageNode node in this) { manager.DecrementPagesReferenceCount(node.Address, node.PagesCount); } diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs index 4ffa447dd..8985a4244 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs @@ -28,8 +28,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory /// protected override void GetPhysicalRegions(ulong va, ulong size, KPageList pageList) { - var ranges = _cpuMemory.GetPhysicalRegions(va, size); - foreach (var range in ranges) + IEnumerable ranges = _cpuMemory.GetPhysicalRegions(va, size); + foreach (MemoryRange range in ranges) { pageList.AddRange(range.Address + DramMemoryMap.DramBase, range.Size / PageSize); } @@ -143,11 +143,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory bool shouldFillPages, byte fillValue) { - using var scopedPageList = new KScopedPageList(Context.MemoryManager, pageList); + using KScopedPageList scopedPageList = new(Context.MemoryManager, pageList); ulong currentVa = address; - foreach (var pageNode in pageList) + foreach (KPageNode pageNode in pageList) { ulong addr = pageNode.Address - DramMemoryMap.DramBase; ulong size = pageNode.PagesCount * PageSize; @@ -188,16 +188,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - using var scopedPageList = new KScopedPageList(Context.MemoryManager, pageList); + using KScopedPageList scopedPageList = new(Context.MemoryManager, pageList); - foreach (var pageNode in pageList) + foreach (KPageNode pageNode in pageList) { Context.CommitMemory(pageNode.Address - DramMemoryMap.DramBase, pageNode.PagesCount * PageSize); } ulong offset = 0; - foreach (var region in regions) + foreach (HostMemoryRange region in regions) { _cpuMemory.MapForeign(va + offset, region.Address, region.Size); @@ -214,9 +214,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { KPageList pagesToClose = new(); - var regions = _cpuMemory.GetPhysicalRegions(address, pagesCount * PageSize); + IEnumerable regions = _cpuMemory.GetPhysicalRegions(address, pagesCount * PageSize); - foreach (var region in regions) + foreach (MemoryRange region in regions) { ulong pa = region.Address + DramMemoryMap.DramBase; if (DramMemoryMap.IsHeapPhysicalAddress(pa)) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs index bf2bbb97b..ee1b4a7be 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs @@ -13,14 +13,15 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { abstract class KPageTableBase { - private static readonly int[] _mappingUnitSizes = { + private static readonly int[] _mappingUnitSizes = + [ 0x1000, 0x10000, 0x200000, 0x400000, 0x2000000, - 0x40000000, - }; + 0x40000000 + ]; private const ulong RegionAlignment = 0x200000; @@ -252,6 +253,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory AliasRegionExtraSize = addrSpaceEnd / 8; aliasRegion.Size += AliasRegionExtraSize; } + break; default: @@ -617,7 +619,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return result; } - using var _ = new OnScopeExit(() => pageList.DecrementPagesReferenceCount(Context.MemoryManager)); + using OnScopeExit _ = new(() => pageList.DecrementPagesReferenceCount(Context.MemoryManager)); return MapPages(address, pageList, permission, MemoryMapFlags.Private); } @@ -769,7 +771,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory Result result = region.AllocatePages(out KPageList pageList, pagesCount); - using var _ = new OnScopeExit(() => pageList.DecrementPagesReferenceCount(Context.MemoryManager)); + using OnScopeExit _ = new(() => pageList.DecrementPagesReferenceCount(Context.MemoryManager)); void CleanUpForError() { @@ -1341,7 +1343,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory Result result = region.AllocatePages(out KPageList pageList, remainingPages); - using var _ = new OnScopeExit(() => pageList.DecrementPagesReferenceCount(Context.MemoryManager)); + using OnScopeExit _ = new(() => pageList.DecrementPagesReferenceCount(Context.MemoryManager)); void CleanUpForError() { @@ -1867,7 +1869,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong dstLastPagePa = 0; ulong currentVa = va; - using var _ = new OnScopeExit(() => + using OnScopeExit _ = new(() => { if (dstFirstPagePa != 0) { @@ -1928,7 +1930,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory Context.Memory.Fill(GetDramAddressFromPa(dstFirstPagePa), unusedSizeBefore, (byte)_ipcFillValue); ulong copySize = addressRounded <= endAddr ? addressRounded - address : size; - var data = srcPageTable.GetReadOnlySequence(addressTruncated + unusedSizeBefore, (int)copySize); + ReadOnlySequence data = srcPageTable.GetReadOnlySequence(addressTruncated + unusedSizeBefore, (int)copySize); ((IWritableBlock)Context.Memory).Write(GetDramAddressFromPa(dstFirstPagePa + unusedSizeBefore), data); @@ -1994,7 +1996,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory if (send) { ulong copySize = endAddr - endAddrTruncated; - var data = srcPageTable.GetReadOnlySequence(endAddrTruncated, (int)copySize); + ReadOnlySequence data = srcPageTable.GetReadOnlySequence(endAddrTruncated, (int)copySize); ((IWritableBlock)Context.Memory).Write(GetDramAddressFromPa(dstLastPagePa), data); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Memory/KSlabHeap.cs b/src/Ryujinx.HLE/HOS/Kernel/Memory/KSlabHeap.cs index cd8c2e470..bdac2c1ce 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Memory/KSlabHeap.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Memory/KSlabHeap.cs @@ -8,7 +8,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory public KSlabHeap(ulong pa, ulong itemSize, ulong size) { - _items = new LinkedList(); + _items = []; int itemsCount = (int)(size / itemSize); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs index ff3de4a17..c4a9835cc 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs @@ -1,3 +1,4 @@ +using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Diagnostics.Demangler; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Threading; @@ -40,14 +41,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { _owner = owner; - _images = new List(); + _images = []; } public string GetGuestStackTrace(KThread thread) { EnsureLoaded(); - var context = thread.Context; + IExecutionContext context = thread.Context; StringBuilder trace = new(); @@ -109,13 +110,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { EnsureLoaded(); - var context = thread.Context; + IExecutionContext context = thread.Context; StringBuilder sb = new(); string GetReg(int x) { - var v = x == 32 ? context.Pc : context.GetX(x); + ulong v = x == 32 ? context.Pc : context.GetX(x); if (!AnalyzePointer(out PointerInfo info, v, thread)) { return $"0x{v:x16}"; @@ -137,6 +138,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { sb.AppendLine($"\tX[{i:d2}]:\t{GetReg(i)}"); } + sb.AppendLine($"\tFP:\t{GetReg(29)}"); sb.AppendLine($"\tLR:\t{GetReg(30)}"); sb.AppendLine($"\tSP:\t{GetReg(31)}"); @@ -234,6 +236,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { info.SubName = Demangler.Parse(info.SubName); } + info.SubOffset = info.Offset - symbol.Value; } else @@ -251,7 +254,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process info = default; ulong sp = thread.Context.GetX(31); - var memoryInfo = _owner.MemoryManager.QueryMemory(address); + KMemoryInfo memoryInfo = _owner.MemoryManager.QueryMemory(address); MemoryState memoryState = memoryInfo.State; if (!memoryState.HasFlag(MemoryState.Stack)) // Is this pointer within the stack? @@ -413,7 +416,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process ulong strTblAddr = textOffset + strTab; ulong symTblAddr = textOffset + symTab; - List symbols = new(); + List symbols = []; while (symTblAddr < strTblAddr) { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index 422f03c64..478b4e864 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -40,8 +40,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process public ProcessState State { get; private set; } - private readonly object _processLock = new(); - private readonly object _threadingLock = new(); + private readonly Lock _processLock = new(); + private readonly Lock _threadingLock = new(); public KAddressArbiter AddressArbiter { get; private set; } @@ -107,7 +107,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process // TODO: Remove once we no longer need to initialize it externally. HandleTable = new KHandleTable(); - _threads = new LinkedList(); + _threads = []; Debugger = new HleProcessDebugger(this); } @@ -128,7 +128,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process Pid = KernelContext.NewKipId(); - if (Pid == 0 || Pid >= KernelConstants.InitialProcessId) + if (Pid is 0 or >= KernelConstants.InitialProcessId) { throw new InvalidOperationException($"Invalid KIP Id {Pid}."); } @@ -231,7 +231,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process Pid = KernelContext.NewProcessId(); - if (Pid == ulong.MaxValue || Pid < KernelConstants.InitialProcessId) + if (Pid is ulong.MaxValue or < KernelConstants.InitialProcessId) { throw new InvalidOperationException($"Invalid Process Id {Pid}."); } @@ -277,7 +277,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return result; } - result = Capabilities.InitializeForUser(capabilities, MemoryManager); + result = Capabilities.InitializeForUser(capabilities, MemoryManager, IsApplication); if (result != Result.Success) { @@ -309,7 +309,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return KernelResult.InvalidCombination; } - if (requiredKernelVersionMajor != KernelVersionMajor && requiredKernelVersionMajor < 3) + if (requiredKernelVersionMajor is not KernelVersionMajor and < 3) { return KernelResult.InvalidCombination; } @@ -461,7 +461,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Process Result result = Result.Success; - if (_fullTlsPages.TryGetValue(tlsPageAddr, out KTlsPageInfo pageInfo)) { // TLS page was full, free slot and move to free pages tree. @@ -509,7 +508,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return result; } - private void GenerateRandomEntropy() + private static void GenerateRandomEntropy() { // TODO. } @@ -882,10 +881,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { if (State >= ProcessState.Started) { - if (State == ProcessState.Started || - State == ProcessState.Crashed || - State == ProcessState.Attached || - State == ProcessState.DebugSuspended) + if (State is ProcessState.Started or + ProcessState.Crashed or + ProcessState.Attached or + ProcessState.DebugSuspended) { SetState(ProcessState.Exiting); @@ -925,9 +924,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { if (State >= ProcessState.Started) { - if (State == ProcessState.Started || - State == ProcessState.Attached || - State == ProcessState.DebugSuspended) + if (State is ProcessState.Started or + ProcessState.Attached or + ProcessState.DebugSuspended) { SetState(ProcessState.Exiting); @@ -1090,7 +1089,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { KernelContext.CriticalSection.Enter(); - if (State != ProcessState.Exiting && State != ProcessState.Exited) + if (State is not ProcessState.Exiting and not ProcessState.Exited) { if (pause) { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs index ebab67bb8..745d3edd8 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs @@ -35,15 +35,15 @@ namespace Ryujinx.HLE.HOS.Kernel.Process DebuggingFlags &= ~3u; KernelReleaseVersion = KProcess.KernelVersionPacked; - return Parse(capabilities, memoryManager); + return Parse(capabilities, memoryManager, false); } - public Result InitializeForUser(ReadOnlySpan capabilities, KPageTableBase memoryManager) + public Result InitializeForUser(ReadOnlySpan capabilities, KPageTableBase memoryManager, bool isApplication) { - return Parse(capabilities, memoryManager); + return Parse(capabilities, memoryManager, isApplication); } - private Result Parse(ReadOnlySpan capabilities, KPageTableBase memoryManager) + private Result Parse(ReadOnlySpan capabilities, KPageTableBase memoryManager, bool isApplication) { int mask0 = 0; int mask1 = 0; @@ -54,7 +54,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process if (cap.GetCapabilityType() != CapabilityType.MapRange) { - Result result = ParseCapability(cap, ref mask0, ref mask1, memoryManager); + Result result = ParseCapability(cap, ref mask0, ref mask1, memoryManager, isApplication); if (result != Result.Success) { @@ -120,7 +120,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return Result.Success; } - private Result ParseCapability(uint cap, ref int mask0, ref int mask1, KPageTableBase memoryManager) + private Result ParseCapability(uint cap, ref int mask0, ref int mask1, KPageTableBase memoryManager, bool isApplication) { CapabilityType code = cap.GetCapabilityType(); @@ -176,6 +176,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process AllowedCpuCoresMask = GetMaskFromMinMax(lowestCpuCore, highestCpuCore); AllowedThreadPriosMask = GetMaskFromMinMax(lowestThreadPrio, highestThreadPrio); + if (isApplication) + Ryujinx.Common.Logging.Logger.Info?.Print(Ryujinx.Common.Logging.LogClass.Application, $"Application requested cores with index range {lowestCpuCore} to {highestCpuCore}"); + break; } diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessCreationFlags.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessCreationFlags.cs index 1b62a29d4..6ca54355e 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessCreationFlags.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/ProcessCreationFlags.cs @@ -4,7 +4,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.HLE.HOS.Kernel.Process { [Flags] - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum ProcessCreationFlags { Is64Bit = 1 << 0, diff --git a/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs b/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs index 2f487243d..c67220617 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs @@ -105,7 +105,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KProcess process = new(_context); - using var _ = new OnScopeExit(process.DecrementReferenceCount); + using OnScopeExit _ = new(process.DecrementReferenceCount); KResourceLimit resourceLimit; @@ -150,7 +150,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return handleTable.GenerateHandle(process, out handle); } - public Result StartProcess(int handle, int priority, int cpuCore, ulong mainThreadStackSize) + public static Result StartProcess(int handle, int priority, int cpuCore, ulong mainThreadStackSize) { KProcess process = KernelStatic.GetCurrentProcess().HandleTable.GetObject(handle); @@ -1071,7 +1071,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return result; } - public Result QueryMemory(out MemoryInfo info, out ulong pageInfo, ulong address) + public static Result QueryMemory(out MemoryInfo info, out ulong pageInfo, ulong address) { KProcess process = KernelStatic.GetCurrentProcess(); @@ -1199,7 +1199,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidMemState; } - if (permission > KMemoryPermission.ReadAndWrite || permission == KMemoryPermission.Write) + if (permission is > KMemoryPermission.ReadAndWrite or KMemoryPermission.Write) { return KernelResult.InvalidPermission; } @@ -1261,7 +1261,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidMemState; } - if (permission > KMemoryPermission.ReadAndWrite || permission == KMemoryPermission.Write) + if (permission is > KMemoryPermission.ReadAndWrite or KMemoryPermission.Write) { return KernelResult.InvalidPermission; } @@ -1425,7 +1425,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KCodeMemory codeMemory = new(_context); - using var _ = new OnScopeExit(codeMemory.DecrementReferenceCount); + using OnScopeExit _ = new(codeMemory.DecrementReferenceCount); KProcess currentProcess = KernelStatic.GetCurrentProcess(); @@ -1485,7 +1485,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidMemRange; } - if (permission != KMemoryPermission.Read && permission != KMemoryPermission.ReadAndExecute) + if (permission is not KMemoryPermission.Read and not KMemoryPermission.ReadAndExecute) { return KernelResult.InvalidPermission; } @@ -1540,10 +1540,10 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidSize; } - if (permission != KMemoryPermission.None && - permission != KMemoryPermission.Read && - permission != KMemoryPermission.ReadAndWrite && - permission != KMemoryPermission.ReadAndExecute) + if (permission is not KMemoryPermission.None and + not KMemoryPermission.Read and + not KMemoryPermission.ReadAndWrite and + not KMemoryPermission.ReadAndExecute) { return KernelResult.InvalidPermission; } @@ -2009,6 +2009,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { value = process.MemoryManager.GetMmUsedPages() * KPageTableBase.PageSize; } + break; case InfoType.ProgramId: @@ -2040,12 +2041,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { value = 0; } + break; case InfoType.AliasRegionExtraSize: value = process.MemoryManager.AliasRegionExtraSize; break; } + break; } @@ -2093,6 +2096,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall value = (uint)resLimHandle; } + break; } @@ -2134,7 +2138,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall case InfoType.ThreadTickCount: { - if (subId < -1 || subId > 3) + if (subId is < (-1) or > 3) { return KernelResult.InvalidCombination; } @@ -2174,6 +2178,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall value = (ulong)KTimeManager.ConvertHostTicksToTicks(totalTimeRunning); } + break; } @@ -2683,7 +2688,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidCombination; } - if ((uint)preferredCore > 3) + if ((uint)preferredCore > KScheduler.CpuCoresCount - 1) { if ((preferredCore | 2) != -1) { @@ -2854,7 +2859,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KThread currentThread = KernelStatic.GetCurrentThread(); - var syncObjs = new Span(currentThread.WaitSyncObjects)[..handles.Length]; + Span syncObjs = new Span(currentThread.WaitSyncObjects)[..handles.Length]; if (handles.Length != 0) { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs index f6b9a112c..62b57da04 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs @@ -21,8 +21,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { _context = context; - _condVarThreads = new List(); - _arbiterThreads = new List(); + _condVarThreads = []; + _arbiterThreads = []; } public Result ArbitrateLock(int ownerHandle, ulong mutexAddress, int requesterHandle) @@ -200,7 +200,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading WakeThreads(_condVarThreads, count, TryAcquireMutex, x => x.CondVarAddress == address); - if (!_condVarThreads.Exists(x => x.CondVarAddress == address)) + if (!_condVarThreads.Any(x => x.CondVarAddress == address)) { KernelTransfer.KernelToUser(address, 0); } @@ -562,8 +562,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading Action removeCallback, Func predicate) { - var candidates = threads.Where(predicate).OrderBy(x => x.DynamicPriority); - var toSignal = (count > 0 ? candidates.Take(count) : candidates).ToArray(); + IOrderedEnumerable candidates = threads.Where(predicate).OrderBy(x => x.DynamicPriority); + KThread[] toSignal = (count > 0 ? candidates.Take(count) : candidates).ToArray(); foreach (KThread thread in toSignal) { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs index 3d6744882..172f67cca 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KCriticalSection.cs @@ -5,20 +5,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading class KCriticalSection { private readonly KernelContext _context; - private readonly object _lock; private int _recursionCount; - public object Lock => _lock; + // type is not Lock due to Monitor class usage + public object Lock { get; } = new(); public KCriticalSection(KernelContext context) { _context = context; - _lock = new object(); } public void Enter() { - Monitor.Enter(_lock); + Monitor.Enter(Lock); _recursionCount++; } @@ -34,7 +33,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { ulong scheduledCoresMask = KScheduler.SelectThreads(_context); - Monitor.Exit(_lock); + Monitor.Exit(Lock); KThread currentThread = KernelStatic.GetCurrentThread(); bool isCurrentThreadSchedulable = currentThread != null && currentThread.IsSchedulable; @@ -57,7 +56,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } else { - Monitor.Exit(_lock); + Monitor.Exit(Lock); } } } diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KPriorityQueue.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KPriorityQueue.cs index 1608db095..e4b4a370a 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KPriorityQueue.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KPriorityQueue.cs @@ -23,8 +23,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading for (int core = 0; core < KScheduler.CpuCoresCount; core++) { - _suggestedThreadsPerPrioPerCore[prio][core] = new LinkedList(); - _scheduledThreadsPerPrioPerCore[prio][core] = new LinkedList(); + _suggestedThreadsPerPrioPerCore[prio][core] = []; + _scheduledThreadsPerPrioPerCore[prio][core] = []; } } @@ -127,7 +127,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public KThread ScheduledThreadsElementAtOrDefault(int core, int index) { int currentIndex = 0; - foreach (var scheduledThread in ScheduledThreads(core)) + foreach (KThread scheduledThread in ScheduledThreads(core)) { if (currentIndex == index) { @@ -144,7 +144,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public KThread ScheduledThreadsWithDynamicPriorityFirstOrDefault(int core, int dynamicPriority) { - foreach (var scheduledThread in ScheduledThreads(core)) + foreach (KThread scheduledThread in ScheduledThreads(core)) { if (scheduledThread.DynamicPriority == dynamicPriority) { diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs index 8ef77902c..7471702c3 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KScheduler.cs @@ -9,13 +9,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading partial class KScheduler : IDisposable { public const int PrioritiesCount = 64; - public const int CpuCoresCount = 4; + public static int CpuCoresCount; private const int RoundRobinTimeQuantumMs = 10; - private static readonly int[] _preemptionPriorities = { 59, 59, 59, 63 }; - - private static readonly int[] _srcCoresHighestPrioThreads = new int[CpuCoresCount]; + private static int[] _srcCoresHighestPrioThreads; private readonly KernelContext _context; private readonly int _coreId; @@ -47,6 +45,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _coreId = coreId; _currentThread = null; + + _srcCoresHighestPrioThreads ??= new int[CpuCoresCount]; + } + + private static int PreemptionPriorities(int index) + { + return index == CpuCoresCount - 1 ? 63 : 59; } public static ulong SelectThreads(KernelContext context) @@ -437,7 +442,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading for (int core = 0; core < CpuCoresCount; core++) { - RotateScheduledQueue(context, core, _preemptionPriorities[core]); + RotateScheduledQueue(context, core, PreemptionPriorities(core)); } context.CriticalSection.Leave(); diff --git a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs index 835bf5d40..b5a14ad5b 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs @@ -112,7 +112,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading public bool WaitingInArbitration { get; set; } - private readonly object _activityOperationLock = new(); + private readonly Lock _activityOperationLock = new(); public KThread(KernelContext context) : base(context) { @@ -121,8 +121,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading SiblingsPerCore = new LinkedListNode[KScheduler.CpuCoresCount]; - _mutexWaiters = new LinkedList(); - _pinnedWaiters = new LinkedList(); + _mutexWaiters = []; + _pinnedWaiters = []; } public Result Initialize( @@ -181,7 +181,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading is64Bits = true; } - HostThread = new Thread(ThreadStart); + HostThread = new Thread(ThreadStart) { Name = "HLE.KThread" }; Context = owner?.CreateExecutionContext() ?? new ProcessExecutionContext(); @@ -537,7 +537,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading ThreadSchedState lowNibble = SchedFlags & ThreadSchedState.LowMask; - if (lowNibble != ThreadSchedState.Paused && lowNibble != ThreadSchedState.Running) + if (lowNibble is not ThreadSchedState.Paused and not ThreadSchedState.Running) { KernelContext.CriticalSection.Leave(); @@ -1232,7 +1232,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { if (_schedulerWaitEvent == null) { - var schedulerWaitEvent = new ManualResetEvent(false); + ManualResetEvent schedulerWaitEvent = new(false); if (Interlocked.Exchange(ref _schedulerWaitEvent, schedulerWaitEvent) == null) { diff --git a/src/Ryujinx.HLE/HOS/LibHacHorizonManager.cs b/src/Ryujinx.HLE/HOS/LibHacHorizonManager.cs index e8ef15dce..41911183f 100644 --- a/src/Ryujinx.HLE/HOS/LibHacHorizonManager.cs +++ b/src/Ryujinx.HLE/HOS/LibHacHorizonManager.cs @@ -54,7 +54,7 @@ namespace Ryujinx.HLE.HOS public void InitializeFsServer(VirtualFileSystem virtualFileSystem) { - virtualFileSystem.InitializeFsServer(Server, out var fsClient); + virtualFileSystem.InitializeFsServer(Server, out HorizonClient fsClient); FsClient = fsClient; } @@ -100,20 +100,20 @@ namespace Ryujinx.HLE.HOS AccessControlBits.Bits.MoveCacheStorage; // Sdb has save data access control info so we can't store just its access control bits - private static ReadOnlySpan SdbFacData => new byte[] - { + private static ReadOnlySpan SdbFacData => + [ 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - }; + 0x00, 0x00, 0x00, 0x01 + ]; - private static ReadOnlySpan SdbFacDescriptor => new byte[] - { + private static ReadOnlySpan SdbFacDescriptor => + [ 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - }; + 0x01, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 + ]; } } diff --git a/src/Ryujinx.HLE/HOS/ModLoader.cs b/src/Ryujinx.HLE/HOS/ModLoader.cs index 7cbe1afca..4df929f35 100644 --- a/src/Ryujinx.HLE/HOS/ModLoader.cs +++ b/src/Ryujinx.HLE/HOS/ModLoader.cs @@ -3,8 +3,10 @@ using LibHac.Fs; using LibHac.Fs.Fsa; using LibHac.FsSystem; using LibHac.Loader; +using LibHac.Tools.Fs; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.RomFs; +using LibHac.Util; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; @@ -18,6 +20,7 @@ using System.Collections.Specialized; using System.Globalization; using System.IO; using System.Linq; +using System.Security.Cryptography; using LazyFile = Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy.LazyFile; using Path = System.IO.Path; @@ -86,11 +89,11 @@ namespace Ryujinx.HLE.HOS public ModCache() { - RomfsContainers = new List>(); - ExefsContainers = new List>(); - RomfsDirs = new List>(); - ExefsDirs = new List>(); - Cheats = new List(); + RomfsContainers = []; + ExefsContainers = []; + RomfsDirs = []; + ExefsDirs = []; + Cheats = []; } } @@ -105,9 +108,9 @@ namespace Ryujinx.HLE.HOS public PatchCache() { - NsoPatches = new List>(); - NroPatches = new List>(); - KipPatches = new List>(); + NsoPatches = []; + NroPatches = []; + KipPatches = []; Initialized = false; } @@ -143,7 +146,7 @@ namespace Ryujinx.HLE.HOS private static string EnsureBaseDirStructure(string modsBasePath) { - var modsDir = new DirectoryInfo(modsBasePath); + DirectoryInfo modsDir = new(modsBasePath); modsDir.CreateSubdirectory(AmsContentsDir); modsDir.CreateSubdirectory(AmsNsoPatchDir); @@ -161,23 +164,23 @@ namespace Ryujinx.HLE.HOS { System.Text.StringBuilder types = new(); - foreach (var modDir in dir.EnumerateDirectories()) + foreach (DirectoryInfo modDir in dir.EnumerateDirectories()) { types.Clear(); Mod mod = new(string.Empty, null, true); if (StrEquals(RomfsDir, modDir.Name)) { - var modData = modMetadata.Mods.Find(x => modDir.FullName.Contains(x.Path)); - var enabled = modData?.Enabled ?? true; + Mod modData = modMetadata.Mods.FirstOrDefault(x => modDir.Parent.FullName.Equals(x.Path)); + bool enabled = modData?.Enabled ?? true; mods.RomfsDirs.Add(mod = new Mod(dir.Name, modDir, enabled)); types.Append('R'); } else if (StrEquals(ExefsDir, modDir.Name)) { - var modData = modMetadata.Mods.Find(x => modDir.FullName.Contains(x.Path)); - var enabled = modData?.Enabled ?? true; + Mod modData = modMetadata.Mods.FirstOrDefault(x => modDir.Parent.FullName.Equals(x.Path)); + bool enabled = modData?.Enabled ?? true; mods.ExefsDirs.Add(mod = new Mod(dir.Name, modDir, enabled)); types.Append('E'); @@ -200,8 +203,8 @@ namespace Ryujinx.HLE.HOS public static string GetApplicationDir(string modsBasePath, string applicationId) { - var contentsDir = new DirectoryInfo(Path.Combine(modsBasePath, AmsContentsDir)); - var applicationModsPath = FindApplicationDir(contentsDir, applicationId); + DirectoryInfo contentsDir = new(Path.Combine(modsBasePath, AmsContentsDir)); + DirectoryInfo applicationModsPath = FindApplicationDir(contentsDir, applicationId); if (applicationModsPath == null) { @@ -243,7 +246,7 @@ namespace Ryujinx.HLE.HOS return; } - foreach (var modDir in patchDir.EnumerateDirectories()) + foreach (DirectoryInfo modDir in patchDir.EnumerateDirectories()) { patches.Add(new Mod(modDir.Name, modDir, true)); Logger.Info?.Print(LogClass.ModLoader, $"Found {type} patch '{modDir.Name}'"); @@ -272,11 +275,11 @@ namespace Ryujinx.HLE.HOS } } - var fsFile = new FileInfo(Path.Combine(applicationDir.FullName, RomfsContainer)); + FileInfo fsFile = new(Path.Combine(applicationDir.FullName, RomfsContainer)); if (fsFile.Exists) { - var modData = modMetadata.Mods.Find(x => fsFile.FullName.Contains(x.Path)); - var enabled = modData == null || modData.Enabled; + Mod modData = modMetadata.Mods.FirstOrDefault(x => fsFile.FullName.Contains(x.Path)); + bool enabled = modData == null || modData.Enabled; mods.RomfsContainers.Add(new Mod($"<{applicationDir.Name} RomFs>", fsFile, enabled)); } @@ -284,8 +287,8 @@ namespace Ryujinx.HLE.HOS fsFile = new FileInfo(Path.Combine(applicationDir.FullName, ExefsContainer)); if (fsFile.Exists) { - var modData = modMetadata.Mods.Find(x => fsFile.FullName.Contains(x.Path)); - var enabled = modData == null || modData.Enabled; + Mod modData = modMetadata.Mods.FirstOrDefault(x => fsFile.FullName.Contains(x.Path)); + bool enabled = modData == null || modData.Enabled; mods.ExefsContainers.Add(new Mod($"<{applicationDir.Name} ExeFs>", fsFile, enabled)); } @@ -293,7 +296,7 @@ namespace Ryujinx.HLE.HOS AddModsFromDirectory(mods, applicationDir, modMetadata); } - public static void QueryContentsDir(ModCache mods, DirectoryInfo contentsDir, ulong applicationId) + public static void QueryContentsDir(ModCache mods, DirectoryInfo contentsDir, ulong applicationId, ulong[] installedDlcs) { if (!contentsDir.Exists) { @@ -302,12 +305,22 @@ namespace Ryujinx.HLE.HOS Logger.Info?.Print(LogClass.ModLoader, $"Searching mods for {((applicationId & 0x1000) != 0 ? "DLC" : "Application")} {applicationId:X16} in \"{contentsDir.FullName}\""); - var applicationDir = FindApplicationDir(contentsDir, $"{applicationId:x16}"); + DirectoryInfo applicationDir = FindApplicationDir(contentsDir, $"{applicationId:x16}"); if (applicationDir != null) { QueryApplicationDir(mods, applicationDir, applicationId); } + + foreach (ulong installedDlcId in installedDlcs) + { + DirectoryInfo dlcModDir = FindApplicationDir(contentsDir, $"{installedDlcId:x16}"); + + if (dlcModDir != null) + { + QueryApplicationDir(mods, dlcModDir, applicationId); + } + } } private static int QueryCheatsDir(ModCache mods, DirectoryInfo cheatsDir) @@ -356,8 +369,7 @@ namespace Ryujinx.HLE.HOS private static IEnumerable GetCheatsInFile(FileInfo cheatFile) { string cheatName = DefaultCheatName; - List instructions = new(); - List cheats = new(); + List instructions = []; using StreamReader cheatData = cheatFile.OpenText(); while (cheatData.ReadLine() is { } line) @@ -373,18 +385,18 @@ namespace Ryujinx.HLE.HOS Logger.Warning?.Print(LogClass.ModLoader, $"Ignoring cheat '{cheatFile.FullName}' because it is malformed"); - return Array.Empty(); + yield break; } // Add the previous section to the list. if (instructions.Count > 0) { - cheats.Add(new Cheat($"<{cheatName} Cheat>", cheatFile, instructions)); + yield return new Cheat($"<{cheatName} Cheat>", cheatFile, instructions); } // Start a new cheat section. cheatName = line[1..^1]; - instructions = new List(); + instructions = []; } else if (line.Length > 0) { @@ -396,14 +408,12 @@ namespace Ryujinx.HLE.HOS // Add the last section being processed. if (instructions.Count > 0) { - cheats.Add(new Cheat($"<{cheatName} Cheat>", cheatFile, instructions)); + yield return new Cheat($"<{cheatName} Cheat>", cheatFile, instructions); } - - return cheats; } // Assumes searchDirPaths don't overlap - private static void CollectMods(Dictionary modCaches, PatchCache patches, params string[] searchDirPaths) + private static void CollectMods(Dictionary modCaches, PatchCache patches, params ReadOnlySpan searchDirPaths) { static bool IsPatchesDir(string name) => StrEquals(AmsNsoPatchDir, name) || StrEquals(AmsNroPatchDir, name) || @@ -417,7 +427,7 @@ namespace Ryujinx.HLE.HOS { foreach ((ulong applicationId, ModCache cache) in modCaches) { - QueryContentsDir(cache, searchDir, applicationId); + QueryContentsDir(cache, searchDir, applicationId, Array.Empty()); } return true; @@ -432,9 +442,9 @@ namespace Ryujinx.HLE.HOS return false; } - foreach (var path in searchDirPaths) + foreach (string path in searchDirPaths) { - var searchDir = new DirectoryInfo(path); + DirectoryInfo searchDir = new(path); if (!searchDir.Exists) { Logger.Warning?.Print(LogClass.ModLoader, $"Mod Search Dir '{searchDir.FullName}' doesn't exist"); @@ -443,7 +453,7 @@ namespace Ryujinx.HLE.HOS if (!TryQuery(searchDir, patches, modCaches)) { - foreach (var subdir in searchDir.EnumerateDirectories()) + foreach (DirectoryInfo subdir in searchDir.EnumerateDirectories()) { TryQuery(subdir, patches, modCaches); } @@ -453,7 +463,7 @@ namespace Ryujinx.HLE.HOS patches.Initialized = true; } - public void CollectMods(IEnumerable applications, params string[] searchDirPaths) + public void CollectMods(IEnumerable applications, params ReadOnlySpan searchDirPaths) { Clear(); @@ -472,14 +482,14 @@ namespace Ryujinx.HLE.HOS return baseStorage; } - var fileSet = new HashSet(); - var builder = new RomFsBuilder(); + HashSet fileSet = []; + RomFsBuilder builder = new(); int count = 0; Logger.Info?.Print(LogClass.ModLoader, $"Applying RomFS mods for Application {applicationId:X16}"); // Prioritize loose files first - foreach (var mod in mods.RomfsDirs) + foreach (Mod mod in mods.RomfsDirs) { if (!mod.Enabled) { @@ -490,11 +500,12 @@ namespace Ryujinx.HLE.HOS { AddFiles(fs, mod.Name, mod.Path.FullName, fileSet, builder); } + count++; } // Then files inside images - foreach (var mod in mods.RomfsContainers) + foreach (Mod mod in mods.RomfsContainers) { if (!mod.Enabled) { @@ -506,6 +517,7 @@ namespace Ryujinx.HLE.HOS { AddFiles(fs, mod.Name, mod.Path.FullName, fileSet, builder); } + count++; } @@ -519,12 +531,12 @@ namespace Ryujinx.HLE.HOS Logger.Info?.Print(LogClass.ModLoader, $"Replaced {fileSet.Count} file(s) over {count} mod(s). Processing base storage..."); // And finally, the base romfs - var baseRom = new RomFsFileSystem(baseStorage); - foreach (var entry in baseRom.EnumerateEntries() + RomFsFileSystem baseRom = new(baseStorage); + foreach (DirectoryEntryEx entry in baseRom.EnumerateEntries() .Where(f => f.Type == DirectoryEntryType.File && !fileSet.Contains(f.FullPath)) .OrderBy(f => f.FullPath, StringComparer.Ordinal)) { - using var file = new UniqueRef(); + using UniqueRef file = new(); baseRom.OpenFile(ref file.Ref, entry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); builder.AddFile(entry.FullPath, file.Release()); @@ -537,14 +549,14 @@ namespace Ryujinx.HLE.HOS return newStorage; } - private static void AddFiles(IFileSystem fs, string modName, string rootPath, ISet fileSet, RomFsBuilder builder) + private static void AddFiles(IFileSystem fs, string modName, string rootPath, HashSet fileSet, RomFsBuilder builder) { - foreach (var entry in fs.EnumerateEntries() + foreach (DirectoryEntryEx entry in fs.EnumerateEntries() .AsParallel() .Where(f => f.Type == DirectoryEntryType.File) .OrderBy(f => f.FullPath, StringComparer.Ordinal)) { - var file = new LazyFile(entry.FullPath, rootPath, fs); + LazyFile file = new(entry.FullPath, rootPath, fs); if (fileSet.Add(entry.FullPath)) { @@ -571,7 +583,7 @@ namespace Ryujinx.HLE.HOS Logger.Info?.Print(LogClass.ModLoader, "Using replacement ExeFS partition"); - var pfs = new PartitionFileSystem(); + PartitionFileSystem pfs = new(); pfs.Initialize(mods.ExefsContainers[0].Path.OpenRead().AsStorage()).ThrowIfFailure(); exefs = pfs; @@ -583,6 +595,7 @@ namespace Ryujinx.HLE.HOS public BitVector32 Stubs; public BitVector32 Replaces; public MetaLoader Npdm; + public string Hash; public bool Modified => (Stubs.Data | Replaces.Data) != 0; } @@ -593,8 +606,11 @@ namespace Ryujinx.HLE.HOS { Stubs = new BitVector32(), Replaces = new BitVector32(), + Hash = null, }; + string tempHash = string.Empty; + if (!_appMods.TryGetValue(applicationId, out ModCache mods) || mods.ExefsDirs.Count == 0) { return modLoadResult; @@ -605,9 +621,9 @@ namespace Ryujinx.HLE.HOS throw new ArgumentOutOfRangeException(nameof(nsos), nsos.Length, "NSO Count is incorrect"); } - var exeMods = mods.ExefsDirs; + List> exeMods = mods.ExefsDirs; - foreach (var mod in exeMods) + foreach (Mod mod in exeMods) { if (!mod.Enabled) { @@ -616,7 +632,7 @@ namespace Ryujinx.HLE.HOS for (int i = 0; i < ProcessConst.ExeFsPrefixes.Length; ++i) { - var nsoName = ProcessConst.ExeFsPrefixes[i]; + string nsoName = ProcessConst.ExeFsPrefixes[i]; FileInfo nsoFile = new(Path.Combine(mod.Path.FullName, nsoName)); if (nsoFile.Exists) @@ -630,8 +646,11 @@ namespace Ryujinx.HLE.HOS modLoadResult.Replaces[1 << i] = true; - nsos[i] = new NsoExecutable(nsoFile.OpenRead().AsStorage(), nsoName); + using FileStream stream = nsoFile.OpenRead(); + nsos[i] = new NsoExecutable(stream.AsStorage(), nsoName); Logger.Info?.Print(LogClass.ModLoader, $"NSO '{nsoName}' replaced"); + stream.Seek(0, SeekOrigin.Begin); + tempHash += Convert.ToHexStringLower(MD5.HashData(stream)); } modLoadResult.Stubs[1 << i] |= File.Exists(Path.Combine(mod.Path.FullName, nsoName + StubExtension)); @@ -663,12 +682,17 @@ namespace Ryujinx.HLE.HOS } } + if (!string.IsNullOrEmpty(tempHash)) + { + modLoadResult.Hash += Convert.ToHexStringLower(MD5.HashData(tempHash.ToBytes())); + } + return modLoadResult; } internal void ApplyNroPatches(NroExecutable nro) { - var nroPatches = _patches.NroPatches; + List> nroPatches = _patches.NroPatches; if (nroPatches.Count == 0) { @@ -680,7 +704,7 @@ namespace Ryujinx.HLE.HOS ApplyProgramPatches(nroPatches, 0, nro); } - internal bool ApplyNsoPatches(ulong applicationId, params IExecutable[] programs) + internal bool ApplyNsoPatches(ulong applicationId, params ReadOnlySpan programs) { IEnumerable> nsoMods = _patches.NsoPatches; @@ -710,11 +734,11 @@ namespace Ryujinx.HLE.HOS return; } - var cheats = mods.Cheats; - var processExes = tamperInfo.BuildIds.Zip(tamperInfo.CodeAddresses, (k, v) => new { k, v }) + List cheats = mods.Cheats; + Dictionary processExes = tamperInfo.BuildIds.Zip(tamperInfo.CodeAddresses, (k, v) => new { k, v }) .ToDictionary(x => x.k[..Math.Min(Cheat.CheatIdSize, x.k.Length)], x => x.v); - foreach (var cheat in cheats) + foreach (Cheat cheat in cheats) { string cheatId = Path.GetFileNameWithoutExtension(cheat.Path.Name).ToUpper(); @@ -735,7 +759,7 @@ namespace Ryujinx.HLE.HOS internal static void EnableCheats(ulong applicationId, TamperMachine tamperMachine) { - var contentDirectory = FindApplicationDir(new DirectoryInfo(Path.Combine(GetModsBasePath(), AmsContentsDir)), $"{applicationId:x16}"); + DirectoryInfo contentDirectory = FindApplicationDir(new DirectoryInfo(Path.Combine(GetModsBasePath(), AmsContentsDir)), $"{applicationId:x16}"); string enabledCheatsPath = Path.Combine(contentDirectory.FullName, CheatDir, "enabled.txt"); if (File.Exists(enabledCheatsPath)) @@ -744,7 +768,7 @@ namespace Ryujinx.HLE.HOS } } - private static bool ApplyProgramPatches(IEnumerable> mods, int protectedOffset, params IExecutable[] programs) + private static bool ApplyProgramPatches(IEnumerable> mods, int protectedOffset, params ReadOnlySpan programs) { int count = 0; @@ -755,25 +779,31 @@ namespace Ryujinx.HLE.HOS patches[i] = new MemPatch(); } - var buildIds = programs.Select(p => p switch + List buildIds = new(programs.Length); + + foreach (IExecutable p in programs) { - NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()).TrimEnd('0'), - NroExecutable nro => Convert.ToHexString(nro.Header.BuildId).TrimEnd('0'), - _ => string.Empty, - }).ToList(); + string buildId = p switch + { + NsoExecutable nso => Convert.ToHexString(nso.BuildId).TrimEnd('0'), + NroExecutable nro => Convert.ToHexString(nro.Header.BuildId).TrimEnd('0'), + _ => string.Empty, + }; + buildIds.Add(buildId); + } int GetIndex(string buildId) => buildIds.FindIndex(id => id == buildId); // O(n) but list is small // Collect patches - foreach (var mod in mods) + foreach (Mod mod in mods) { if (!mod.Enabled) { continue; } - var patchDir = mod.Path; - foreach (var patchFile in patchDir.EnumerateFiles()) + DirectoryInfo patchDir = mod.Path; + foreach (FileInfo patchFile in patchDir.EnumerateFiles()) { if (StrEquals(".ips", patchFile.Extension)) // IPS|IPS32 { @@ -788,18 +818,18 @@ namespace Ryujinx.HLE.HOS Logger.Info?.Print(LogClass.ModLoader, $"Matching IPS patch '{patchFile.Name}' in '{mod.Name}' bid={buildId}"); - using var fs = patchFile.OpenRead(); - using var reader = new BinaryReader(fs); + using FileStream fs = patchFile.OpenRead(); + using BinaryReader reader = new(fs); - var patcher = new IpsPatcher(reader); + IpsPatcher patcher = new(reader); patcher.AddPatches(patches[index]); } else if (StrEquals(".pchtxt", patchFile.Extension)) // IPSwitch { - using var fs = patchFile.OpenRead(); - using var reader = new StreamReader(fs); + using FileStream fs = patchFile.OpenRead(); + using StreamReader reader = new(fs); - var patcher = new IPSwitchPatcher(reader); + IPSwitchPatcher patcher = new(reader); int index = GetIndex(patcher.BuildId); if (index == -1) diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountManager.cs b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountManager.cs index d2da9e248..7643c109d 100644 --- a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountManager.cs @@ -33,7 +33,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc _horizonClient = horizonClient; _profiles = new ConcurrentDictionary(); - _storedOpenedUsers = Array.Empty(); + _storedOpenedUsers = []; _accountSaveDataManager = new AccountSaveDataManager(_profiles); @@ -56,11 +56,12 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc Logger.Warning?.Print(LogClass.Application, $"The command line specified profile named '{initialProfileName}' was not found"); } } + OpenUser(commandLineUserProfileOverride.IsNull ? _accountSaveDataManager.LastOpened : commandLineUserProfileOverride); } } - public void AddUser(string name, byte[] image, UserId userId = new UserId()) + public void AddUser(string name, byte[] image, UserId userId = new()) { if (userId.IsNull) { @@ -191,10 +192,10 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc private void DeleteSaveData(UserId userId) { - var saveDataFilter = SaveDataFilter.Make(programId: default, saveType: default, + SaveDataFilter saveDataFilter = SaveDataFilter.Make(programId: default, saveType: default, new LibHac.Fs.UserId((ulong)userId.High, (ulong)userId.Low), saveDataId: default, index: default); - using var saveDataIterator = new UniqueRef(); + using UniqueRef saveDataIterator = new(); _horizonClient.Fs.OpenSaveDataIterator(ref saveDataIterator.Ref, SaveDataSpaceId.User, in saveDataFilter).ThrowIfFailure(); diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs index b1ef0761c..87d275ef4 100644 --- a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountSaveDataManager.cs @@ -1,3 +1,4 @@ +using Gommon; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; @@ -6,12 +7,13 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; +using System.Linq; namespace Ryujinx.HLE.HOS.Services.Account.Acc { - class AccountSaveDataManager + public class AccountSaveDataManager { - private readonly string _profilesJsonPath = Path.Join(AppDataManager.BaseDirPath, "system", "Profiles.json"); + private static readonly string _profilesJsonPath = Path.Join(AppDataManager.BaseDirPath, "system", "Profiles.json"); private static readonly ProfilesJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); @@ -27,7 +29,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc { ProfilesJson profilesJson = JsonHelper.DeserializeFromFile(_profilesJsonPath, _serializerContext.ProfilesJson); - foreach (var profile in profilesJson.Profiles) + foreach (UserProfileJson profile in profilesJson.Profiles) { UserProfile addedProfile = new(new UserId(profile.UserId), profile.Name, profile.Image, profile.LastModifiedTimestamp); @@ -49,15 +51,25 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc } } + public static Optional GetLastUsedUser() + { + ProfilesJson profilesJson = JsonHelper.DeserializeFromFile(_profilesJsonPath, _serializerContext.ProfilesJson); + + return profilesJson.Profiles + .FindFirst(profile => profile.UserId == profilesJson.LastOpened) + .Convert(profileJson => new UserProfile(new UserId(profileJson.UserId), profileJson.Name, + profileJson.Image, profileJson.LastModifiedTimestamp)); + } + public void Save(ConcurrentDictionary profiles) { ProfilesJson profilesJson = new() { - Profiles = new List(), + Profiles = [], LastOpened = LastOpened.ToString(), }; - foreach (var profile in profiles) + foreach (KeyValuePair profile in profiles) { profilesJson.Profiles.Add(new UserProfileJson() { diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs index 75bad0e3f..8c86788b1 100644 --- a/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Account/Acc/AccountService/ManagerServer.cs @@ -5,6 +5,7 @@ using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Account.Acc.AsyncContext; using System; using System.Collections.Generic; +using System.Security.Claims; using System.Security.Cryptography; using System.Security.Principal; using System.Text; @@ -38,7 +39,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService RsaSecurityKey secKey = new(parameters); - SigningCredentials credentials = new(secKey, "RS256"); + SigningCredentials credentials = new(secKey, SecurityAlgorithms.RsaSha256); credentials.Key.KeyId = parameters.ToString(); @@ -49,11 +50,11 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService RandomNumberGenerator.Fill(deviceId); byte[] deviceAccountId = new byte[0x10]; - RandomNumberGenerator.Fill(deviceId); + RandomNumberGenerator.Fill(deviceAccountId); - var descriptor = new SecurityTokenDescriptor + SecurityTokenDescriptor descriptor = new() { - Subject = new GenericIdentity(Convert.ToHexString(rawUserId).ToLower()), + Subject = new ClaimsIdentity([new Claim(JwtRegisteredClaimNames.Sub, Convert.ToHexString(rawUserId).ToLower())]), SigningCredentials = credentials, Audience = "ed9e2f05d286f7b8", Issuer = "https://e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com", diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/GuestUserImage.jpg b/src/Ryujinx.HLE/HOS/Services/Account/Acc/GuestUserImage.jpg new file mode 100644 index 000000000..8310994de Binary files /dev/null and b/src/Ryujinx.HLE/HOS/Services/Account/Acc/GuestUserImage.jpg differ diff --git a/src/Ryujinx.HLE/HOS/Services/Account/Acc/Types/UserId.cs b/src/Ryujinx.HLE/HOS/Services/Account/Acc/Types/UserId.cs index c9c78af9a..a6b1a47b6 100644 --- a/src/Ryujinx.HLE/HOS/Services/Account/Acc/Types/UserId.cs +++ b/src/Ryujinx.HLE/HOS/Services/Account/Acc/Types/UserId.cs @@ -51,14 +51,8 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc return High.ToString("x16") + Low.ToString("x16"); } - public Uid ToLibHacUid() - { - return new Uid((ulong)High, (ulong)Low); - } - - public UInt128 ToUInt128() - { - return new UInt128((ulong)High, (ulong)Low); - } + public Uid ToLibHacUid() => new((ulong)High, (ulong)Low); + public LibHac.Fs.UserId ToLibHac() => new((ulong)High, (ulong)Low); + public UInt128 ToUInt128() => new((ulong)High, (ulong)Low); } } diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs index 602fc2c4d..ad776fe6e 100644 --- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs +++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs @@ -214,7 +214,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys _vrModeEnabled = vrModeEnabled; - using var lblApi = new LblApi(); + using LblApi lblApi = new(); if (vrModeEnabled) { diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ILibraryAppletCreator.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ILibraryAppletCreator.cs index 23ba99b04..f1ae81f8d 100644 --- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ILibraryAppletCreator.cs +++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ILibraryAppletCreator.cs @@ -21,6 +21,21 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys return ResultCode.Success; } + [CommandCmif(3)] // 20.0.0+ + // CreateLibraryAppletEx(u32, u32, u64) -> object + public ResultCode CreateLibraryAppletEx(ServiceCtx context) + { + AppletId appletId = (AppletId)context.RequestData.ReadInt32(); + + _ = context.RequestData.ReadInt32(); // libraryAppletMode + + _ = context.RequestData.ReadUInt64(); // threadId + + MakeObject(context, new ILibraryAppletAccessor(appletId, context.Device.System)); + + return ResultCode.Success; + } + [CommandCmif(10)] // CreateStorage(u64) -> object public ResultCode CreateStorage(ServiceCtx context) diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs index 85898f138..8e0f515ba 100644 --- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs +++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs @@ -4,6 +4,7 @@ using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy.Types; using Ryujinx.Horizon.Common; using System; +using System.Threading; namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy { @@ -17,7 +18,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys private KEvent _accumulatedSuspendedTickChangedEvent; private int _accumulatedSuspendedTickChangedEventHandle; - private readonly object _fatalSectionLock = new(); + private readonly Lock _fatalSectionLock = new(); private int _fatalSectionCount; // TODO: Set this when the game goes in suspension (go back to home menu ect), we currently don't support that so we can keep it set to 0. diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/Storage/StorageHelper.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/Storage/StorageHelper.cs index 6c23720ee..d96877362 100644 --- a/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/Storage/StorageHelper.cs +++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletAE/Storage/StorageHelper.cs @@ -1,3 +1,4 @@ +using Microsoft.IO; using Ryujinx.Common.Memory; using Ryujinx.HLE.HOS.Services.Account.Acc; using System.IO; @@ -11,7 +12,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.Storage public static byte[] MakeLaunchParams(UserProfile userProfile) { // Size needs to be at least 0x88 bytes otherwise application errors. - using MemoryStream ms = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream ms = MemoryStreamManager.Shared.GetStream(); BinaryWriter writer = new(ms); ms.SetLength(0x88); diff --git a/src/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs b/src/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs index 12c046f56..8648b0642 100644 --- a/src/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs +++ b/src/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs @@ -659,7 +659,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati if (string.IsNullOrWhiteSpace(filePath)) { - throw new InvalidSystemResourceException("JIT (010000000000003B) system title not found! The JIT will not work, provide the system archive to fix this error. (See https://github.com/GreemDev/Ryujinx#requirements for more information)"); + throw new InvalidSystemResourceException("JIT (010000000000003B) system title not found! The JIT will not work, provide the system archive to fix this error."); } context.Device.LoadNca(filePath); diff --git a/src/Ryujinx.HLE/HOS/Services/Caps/CaptureManager.cs b/src/Ryujinx.HLE/HOS/Services/Caps/CaptureManager.cs index bf0c7e9dc..3caea0f6c 100644 --- a/src/Ryujinx.HLE/HOS/Services/Caps/CaptureManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Caps/CaptureManager.cs @@ -103,7 +103,7 @@ namespace Ryujinx.HLE.HOS.Services.Caps }; // NOTE: The hex hash is a HMAC-SHA256 (first 32 bytes) using a hardcoded secret key over the titleId, we can simulate it by hashing the titleId instead. - string hash = Convert.ToHexString(SHA256.HashData(BitConverter.GetBytes(titleId))).Remove(0x20); + string hash = Convert.ToHexString(SHA256.HashData(BitConverter.GetBytes(titleId)))[..0x20]; string folderPath = Path.Combine(_sdCardPath, "Nintendo", "Album", currentDateTime.Year.ToString("00"), currentDateTime.Month.ToString("00"), currentDateTime.Day.ToString("00")); string filePath = GenerateFilePath(folderPath, applicationAlbumEntry, currentDateTime, hash); @@ -118,10 +118,10 @@ namespace Ryujinx.HLE.HOS.Services.Caps } // NOTE: The saved JPEG file doesn't have the limitation in the extra EXIF data. - using var bitmap = new SKBitmap(new SKImageInfo(1280, 720, SKColorType.Rgba8888)); + using SKBitmap bitmap = new(new SKImageInfo(1280, 720, SKColorType.Rgba8888)); Marshal.Copy(screenshotData, 0, bitmap.GetPixels(), screenshotData.Length); - using var data = bitmap.Encode(SKEncodedImageFormat.Jpeg, 80); - using var file = File.OpenWrite(filePath); + using SKData data = bitmap.Encode(SKEncodedImageFormat.Jpeg, 80); + using FileStream file = File.OpenWrite(filePath); data.SaveTo(file); return ResultCode.Success; diff --git a/src/Ryujinx.HLE/HOS/Services/Caps/IAlbumApplicationService.cs b/src/Ryujinx.HLE/HOS/Services/Caps/IAlbumApplicationService.cs index 5fbba310f..754a44025 100644 --- a/src/Ryujinx.HLE/HOS/Services/Caps/IAlbumApplicationService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Caps/IAlbumApplicationService.cs @@ -50,7 +50,7 @@ namespace Ryujinx.HLE.HOS.Services.Caps MemoryHelper.FillWithZeros(context.Memory, applicationAlbumFileEntryPosition, (int)applicationAlbumFileEntrySize); - if (contentType > ContentType.Unknown || contentType == ContentType.ExtraMovie) + if (contentType is > ContentType.Unknown or ContentType.ExtraMovie) { resultCode = ResultCode.InvalidContentType; } diff --git a/src/Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs b/src/Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs index 0dad46c14..0723b57cc 100644 --- a/src/Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Caps/IScreenShotApplicationService.cs @@ -60,7 +60,6 @@ namespace Ryujinx.HLE.HOS.Services.Caps ulong screenshotDataPosition = context.Request.SendBuff[1].Position; ulong screenshotDataSize = context.Request.SendBuff[1].Size; - // TODO: Parse the application data: At 0x00 it's UserData (Size of 0x400), at 0x404 it's a uint UserDataSize (Always empty for now). _ = context.Memory.GetSpan(applicationDataPosition, (int)applicationDataSize).ToArray(); @@ -89,7 +88,6 @@ namespace Ryujinx.HLE.HOS.Services.Caps ulong screenshotDataPosition = context.Request.SendBuff[1].Position; ulong screenshotDataSize = context.Request.SendBuff[1].Size; - // TODO: Parse the UserIdList. _ = context.Memory.GetSpan(userIdListPosition, (int)userIdListSize).ToArray(); diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs index 20ffb996d..53904369b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs @@ -26,7 +26,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy try { LocalStorage storage = new(pfsPath, FileAccess.Read, FileMode.Open); - var pfs = new PartitionFileSystem(); + PartitionFileSystem pfs = new(); using SharedRef nsp = new(pfs); pfs.Initialize(storage).ThrowIfFailure(); @@ -58,7 +58,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy } LibHac.Fs.Fsa.IFileSystem fileSystem = nca.OpenFileSystem(NcaSectionType.Data, context.Device.System.FsIntegrityCheckLevel); - using var sharedFs = new SharedRef(fileSystem); + using SharedRef sharedFs = new(fileSystem); using SharedRef adapter = FileSystemInterfaceAdapter.CreateShared(ref sharedFs.Ref, true); @@ -99,7 +99,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy string filename = fullPath.Replace(archivePath.FullName, string.Empty).TrimStart('\\'); - using var ncaFile = new UniqueRef(); + using UniqueRef ncaFile = new(); Result result = nsp.OpenFile(ref ncaFile.Ref, filename.ToU8Span(), OpenMode.Read); if (result.IsFailure()) @@ -122,14 +122,14 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { foreach (DirectoryEntryEx ticketEntry in nsp.EnumerateEntries("/", "*.tik")) { - using var ticketFile = new UniqueRef(); + using UniqueRef ticketFile = new(); Result result = nsp.OpenFile(ref ticketFile.Ref, ticketEntry.FullPath.ToU8Span(), OpenMode.Read); if (result.IsSuccess()) { Ticket ticket = new(ticketFile.Get.AsStream()); - var titleKey = ticket.GetTitleKey(keySet); + byte[] titleKey = ticket.GetTitleKey(keySet); if (titleKey != null) { diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs index 70d3a6bd8..0fe7bcdd6 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs @@ -1,6 +1,7 @@ using LibHac; using LibHac.Common; using LibHac.Sf; +using Ryujinx.Memory; namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { @@ -20,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy ulong bufferAddress = context.Request.ReceiveBuff[0].Position; ulong bufferLen = context.Request.ReceiveBuff[0].Size; - using var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); + using WritableRegion region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); Result result = _baseDirectory.Get.Read(out long entriesRead, new OutBuffer(region.Memory.Span)); context.ResponseData.Write(entriesRead); diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs index dcc34a754..0ea57f5a4 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs @@ -3,6 +3,7 @@ using LibHac.Common; using LibHac.Fs; using LibHac.Sf; using Ryujinx.Common; +using Ryujinx.Memory; namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { @@ -28,7 +29,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy long offset = context.RequestData.ReadInt64(); long size = context.RequestData.ReadInt64(); - using var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); + using WritableRegion region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); Result result = _baseFile.Get.Read(out long bytesRead, offset, new OutBuffer(region.Memory.Span), size, readOption); context.ResponseData.Write(bytesRead); diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs index e19d17912..168dfc37a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs @@ -111,7 +111,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy uint mode = context.RequestData.ReadUInt32(); ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); - using var file = new SharedRef(); + using SharedRef file = new(); Result result = _fileSystem.Get.OpenFile(ref file.Ref, in name, mode); @@ -132,9 +132,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy uint mode = context.RequestData.ReadUInt32(); ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); - using var dir = new SharedRef(); + using SharedRef dir = new(); - Result result = _fileSystem.Get.OpenDirectory(ref dir.Ref, name, mode); + Result result = _fileSystem.Get.OpenDirectory(ref dir.Ref, in name, mode); if (result.IsSuccess()) { diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs index 4299a6c74..a485ebe63 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs @@ -1,6 +1,10 @@ using LibHac; using LibHac.Common; using LibHac.Sf; +using Ryujinx.Common; +using Ryujinx.Common.Configuration; +using Ryujinx.Memory; +using System.Threading; namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { @@ -13,6 +17,10 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy _baseStorage = SharedRef.CreateMove(ref baseStorage); } + private const string Xc2JpTitleId = "0100f3400332c000"; + private const string Xc2GlobalTitleId = "0100e95004038000"; + private static bool IsXc2 => TitleIDs.CurrentApplication.Value.OrDefault() is Xc2GlobalTitleId or Xc2JpTitleId; + [CommandCmif(0)] // Read(u64 offset, u64 length) -> buffer buffer public ResultCode Read(ServiceCtx context) @@ -31,9 +39,16 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy size = bufferLen; } - using var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); + using WritableRegion region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); Result result = _baseStorage.Get.Read((long)offset, new OutBuffer(region.Memory.Span), (long)size); + if (context.Device.DirtyHacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix) && IsXc2) + { + // Add a load-bearing sleep to avoid XC2 softlock + // https://web.archive.org/web/20240728045136/https://github.com/Ryujinx/Ryujinx/issues/2357 + Thread.Sleep(2); + } + return (ResultCode)result.Value; } diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs b/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs index 24dd1e9be..08ede2b5b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs @@ -3,6 +3,7 @@ using LibHac.Common; using LibHac.Fs; using LibHac.Fs.Shim; using LibHac.FsSrv.Impl; +using LibHac.FsSrv.Sf; using LibHac.FsSystem; using LibHac.Ncm; using LibHac.Sf; @@ -12,10 +13,12 @@ using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy; +using Ryujinx.Memory; using System; using System.IO; using static Ryujinx.HLE.Utilities.StringUtils; using GameCardHandle = System.UInt32; +using IFile = Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy.IFile; using IFileSystem = LibHac.FsSrv.Sf.IFileSystem; using IStorage = LibHac.FsSrv.Sf.IStorage; @@ -29,7 +32,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public IFileSystemProxy(ServiceCtx context) : base(context.Device.System.FsServer) { - var applicationClient = context.Device.System.LibHacHorizonManager.ApplicationClient; + HorizonClient applicationClient = context.Device.System.LibHacHorizonManager.ApplicationClient; _baseFileSystemProxy = applicationClient.Fs.Impl.GetFileSystemProxyServiceObject(); } @@ -106,8 +109,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs { BisPartitionId bisPartitionId = (BisPartitionId)context.RequestData.ReadInt32(); - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); - using var fileSystem = new SharedRef(); + ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenBisFileSystem(ref fileSystem.Ref, in path, bisPartitionId); if (result.IsFailure()) @@ -125,7 +128,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenBisStorage(ServiceCtx context) { BisPartitionId bisPartitionId = (BisPartitionId)context.RequestData.ReadInt32(); - using var storage = new SharedRef(); + using SharedRef storage = new(); Result result = _baseFileSystemProxy.Get.OpenBisStorage(ref storage.Ref, bisPartitionId); if (result.IsFailure()) @@ -149,7 +152,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenSdCardFileSystem() -> object public ResultCode OpenSdCardFileSystem(ServiceCtx context) { - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenSdCardFileSystem(ref fileSystem.Ref); if (result.IsFailure()) @@ -257,7 +260,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { GameCardHandle handle = context.RequestData.ReadUInt32(); GameCardPartitionRaw partitionId = (GameCardPartitionRaw)context.RequestData.ReadInt32(); - using var storage = new SharedRef(); + using SharedRef storage = new(); Result result = _baseFileSystemProxy.Get.OpenGameCardStorage(ref storage.Ref, handle, partitionId); if (result.IsFailure()) @@ -276,7 +279,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { GameCardHandle handle = context.RequestData.ReadUInt32(); GameCardPartition partitionId = (GameCardPartition)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenGameCardFileSystem(ref fileSystem.Ref, handle, partitionId); if (result.IsFailure()) @@ -357,7 +360,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataFileSystem(ref fileSystem.Ref, spaceId, in attribute); if (result.IsFailure()) @@ -376,7 +379,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataFileSystemBySystemSaveDataId(ref fileSystem.Ref, spaceId, in attribute); if (result.IsFailure()) @@ -395,7 +398,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenReadOnlySaveDataFileSystem(ref fileSystem.Ref, spaceId, in attribute); if (result.IsFailure()) @@ -466,7 +469,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenSaveDataInfoReader() -> object public ResultCode OpenSaveDataInfoReader(ServiceCtx context) { - using var infoReader = new SharedRef(); + using SharedRef infoReader = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataInfoReader(ref infoReader.Ref); if (result.IsFailure()) @@ -484,7 +487,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenSaveDataInfoReaderBySaveDataSpaceId(ServiceCtx context) { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadByte(); - using var infoReader = new SharedRef(); + using SharedRef infoReader = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataInfoReaderBySaveDataSpaceId(ref infoReader.Ref, spaceId); if (result.IsFailure()) @@ -501,7 +504,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenSaveDataInfoReaderOnlyCacheStorage() -> object public ResultCode OpenSaveDataInfoReaderOnlyCacheStorage(ServiceCtx context) { - using var infoReader = new SharedRef(); + using SharedRef infoReader = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataInfoReaderOnlyCacheStorage(ref infoReader.Ref); if (result.IsFailure()) @@ -520,7 +523,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); ulong saveDataId = context.RequestData.ReadUInt64(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataInternalStorageFileSystem(ref fileSystem.Ref, spaceId, saveDataId); if (result.IsFailure()) @@ -567,7 +570,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs ulong bufferAddress = context.Request.ReceiveBuff[0].Position; ulong bufferLen = context.Request.ReceiveBuff[0].Size; - using var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); + using WritableRegion region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); Result result = _baseFileSystemProxy.Get.FindSaveDataWithFilter(out long count, new OutBuffer(region.Memory.Span), spaceId, in filter); if (result.IsFailure()) { @@ -584,7 +587,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataFilter filter = context.RequestData.ReadStruct(); - using var infoReader = new SharedRef(); + using SharedRef infoReader = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataInfoReaderWithFilter(ref infoReader.Ref, spaceId, in filter); if (result.IsFailure()) @@ -661,7 +664,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt32(); SaveDataMetaType metaType = (SaveDataMetaType)context.RequestData.ReadInt32(); SaveDataAttribute attribute = context.RequestData.ReadStruct(); - using var file = new SharedRef(); + using SharedRef file = new(); Result result = _baseFileSystemProxy.Get.OpenSaveDataMetaFile(ref file.Ref, spaceId, in attribute, metaType); if (result.IsFailure()) @@ -699,7 +702,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenImageDirectoryFileSystem(ServiceCtx context) { ImageDirectoryId directoryId = (ImageDirectoryId)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenImageDirectoryFileSystem(ref fileSystem.Ref, directoryId); if (result.IsFailure()) @@ -716,7 +719,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenBaseFileSystem(ServiceCtx context) { BaseFileSystemId fileSystemId = (BaseFileSystemId)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenBaseFileSystem(ref fileSystem.Ref, fileSystemId); if (result.IsFailure()) @@ -733,7 +736,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenContentStorageFileSystem(ServiceCtx context) { ContentStorageId contentStorageId = (ContentStorageId)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenContentStorageFileSystem(ref fileSystem.Ref, contentStorageId); if (result.IsFailure()) @@ -750,24 +753,16 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode OpenCloudBackupWorkStorageFileSystem(ServiceCtx context) { CloudBackupWorkStorageId storageId = (CloudBackupWorkStorageId)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); - Result result = _baseFileSystemProxy.Get.OpenCloudBackupWorkStorageFileSystem(ref fileSystem.Ref, storageId); - if (result.IsFailure()) - { - return (ResultCode)result.Value; - } - - MakeObject(context, new FileSystemProxy.IFileSystem(ref fileSystem.Ref)); - - return ResultCode.Success; + Logger.Stub?.PrintStub(LogClass.ServiceFs, new { storageId }); + throw new NotImplementedException(); // reimplementing behavior from LibHac 0.19.0 } [CommandCmif(130)] public ResultCode OpenCustomStorageFileSystem(ServiceCtx context) { CustomStorageId customStorageId = (CustomStorageId)context.RequestData.ReadInt32(); - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenCustomStorageFileSystem(ref fileSystem.Ref, customStorageId); if (result.IsFailure()) @@ -784,9 +779,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenDataStorageByCurrentProcess() -> object dataStorage public ResultCode OpenDataStorageByCurrentProcess(ServiceCtx context) { - var storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); - using var sharedStorage = new SharedRef(storage); - using var sfStorage = new SharedRef(new StorageInterfaceAdapter(ref sharedStorage.Ref)); + LibHac.Fs.IStorage storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); + using SharedRef sharedStorage = new(storage); + using SharedRef sfStorage = new(new StorageInterfaceAdapter(ref sharedStorage.Ref)); MakeObject(context, new FileSystemProxy.IStorage(ref sfStorage.Ref)); @@ -809,9 +804,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs { Logger.Info?.Print(LogClass.Loader, $"Opened AddOnContent Data TitleID={titleId:X16}"); - var storage = context.Device.FileSystem.ModLoader.ApplyRomFsMods(titleId, aocStorage); - using var sharedStorage = new SharedRef(storage); - using var sfStorage = new SharedRef(new StorageInterfaceAdapter(ref sharedStorage.Ref)); + LibHac.Fs.IStorage storage = context.Device.FileSystem.ModLoader.ApplyRomFsMods(titleId, aocStorage); + using SharedRef sharedStorage = new(storage); + using SharedRef sfStorage = new(new StorageInterfaceAdapter(ref sharedStorage.Ref)); MakeObject(context, new FileSystemProxy.IStorage(ref sfStorage.Ref)); @@ -845,8 +840,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs LibHac.Fs.IStorage ncaStorage = new LocalStorage(ncaPath, FileAccess.Read, FileMode.Open); Nca nca = new(context.Device.System.KeySet, ncaStorage); LibHac.Fs.IStorage romfsStorage = nca.OpenStorage(NcaSectionType.Data, context.Device.System.FsIntegrityCheckLevel); - using var sharedStorage = new SharedRef(romfsStorage); - using var sfStorage = new SharedRef(new StorageInterfaceAdapter(ref sharedStorage.Ref)); + using SharedRef sharedStorage = new(romfsStorage); + using SharedRef sfStorage = new(new StorageInterfaceAdapter(ref sharedStorage.Ref)); MakeObject(context, new FileSystemProxy.IStorage(ref sfStorage.Ref)); } @@ -875,9 +870,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenPatchDataStorageByCurrentProcess() -> object public ResultCode OpenPatchDataStorageByCurrentProcess(ServiceCtx context) { - var storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); - using var sharedStorage = new SharedRef(storage); - using var sfStorage = new SharedRef(new StorageInterfaceAdapter(ref sharedStorage.Ref)); + LibHac.Fs.IStorage storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); + using SharedRef sharedStorage = new(storage); + using SharedRef sfStorage = new(new StorageInterfaceAdapter(ref sharedStorage.Ref)); MakeObject(context, new FileSystemProxy.IStorage(ref sfStorage.Ref)); @@ -895,9 +890,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs throw new NotImplementedException($"Accessing storage from other programs is not supported (program index = {programIndex})."); } - var storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); - using var sharedStorage = new SharedRef(storage); - using var sfStorage = new SharedRef(new StorageInterfaceAdapter(ref sharedStorage.Ref)); + LibHac.Fs.IStorage storage = context.Device.FileSystem.GetRomFs(_pid).AsStorage(true); + using SharedRef sharedStorage = new(storage); + using SharedRef sfStorage = new(new StorageInterfaceAdapter(ref sharedStorage.Ref)); MakeObject(context, new FileSystemProxy.IStorage(ref sfStorage.Ref)); @@ -908,7 +903,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenDataStorageByCurrentProcess() -> object dataStorage public ResultCode OpenDeviceOperator(ServiceCtx context) { - using var deviceOperator = new SharedRef(); + using SharedRef deviceOperator = new(); Result result = _baseFileSystemProxy.Get.OpenDeviceOperator(ref deviceOperator.Ref); if (result.IsFailure()) @@ -1023,9 +1018,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs [CommandCmif(609)] public ResultCode GetRightsIdByPath(ServiceCtx context) { - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); + ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); - Result result = _baseFileSystemProxy.Get.GetRightsIdByPath(out RightsId rightsId, in path); + Result result = _baseFileSystemProxy.Get.GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out _, in path, ContentAttributes.None); if (result.IsFailure()) { return (ResultCode)result.Value; @@ -1039,9 +1034,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs [CommandCmif(610)] public ResultCode GetRightsIdAndKeyGenerationByPath(ServiceCtx context) { - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); + ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); - Result result = _baseFileSystemProxy.Get.GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out byte keyGeneration, in path); + Result result = _baseFileSystemProxy.Get.GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out byte keyGeneration, in path, ContentAttributes.None); if (result.IsFailure()) { return (ResultCode)result.Value; @@ -1236,9 +1231,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs public ResultCode SetBisRootForHost(ServiceCtx context) { BisPartitionId partitionId = (BisPartitionId)context.RequestData.ReadInt32(); - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); + ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); - return (ResultCode)_baseFileSystemProxy.Get.SetBisRootForHost(partitionId, in path).Value; + Logger.Stub?.PrintStub(LogClass.ServiceFs, new { partitionId, path }); + + throw new NotImplementedException(); // reimplementing behavior from LibHac 0.19.0 } [CommandCmif(1001)] @@ -1253,7 +1250,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs [CommandCmif(1002)] public ResultCode SetSaveDataRootPath(ServiceCtx context) { - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); + ref readonly FspPath path = ref FileSystemProxyHelper.GetFspPath(context); return (ResultCode)_baseFileSystemProxy.Get.SetSaveDataRootPath(in path).Value; } @@ -1307,7 +1304,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs [CommandCmif(1008)] public ResultCode OpenRegisteredUpdatePartition(ServiceCtx context) { - using var fileSystem = new SharedRef(); + using SharedRef fileSystem = new(); Result result = _baseFileSystemProxy.Get.OpenRegisteredUpdatePartition(ref fileSystem.Ref); if (result.IsFailure()) @@ -1417,7 +1414,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenMultiCommitManager() -> object public ResultCode OpenMultiCommitManager(ServiceCtx context) { - using var commitManager = new SharedRef(); + using SharedRef commitManager = new(); Result result = _baseFileSystemProxy.Get.OpenMultiCommitManager(ref commitManager.Ref); if (result.IsFailure()) diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/ISaveDataInfoReader.cs b/src/Ryujinx.HLE/HOS/Services/Fs/ISaveDataInfoReader.cs index 7ed6dadc2..b86eb1fa1 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/ISaveDataInfoReader.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/ISaveDataInfoReader.cs @@ -1,6 +1,7 @@ using LibHac; using LibHac.Common; using LibHac.Sf; +using Ryujinx.Memory; namespace Ryujinx.HLE.HOS.Services.Fs { @@ -20,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs ulong bufferAddress = context.Request.ReceiveBuff[0].Position; ulong bufferLen = context.Request.ReceiveBuff[0].Size; - using var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); + using WritableRegion region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); Result result = _baseReader.Get.Read(out long readCount, new OutBuffer(region.Memory.Span)); context.ResponseData.Write(readCount); diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs index 86c6a825f..834bee6f0 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs @@ -123,7 +123,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid return true; } - public void Configure(params ControllerConfig[] configs) + public void Configure(params ReadOnlySpan configs) { _configuredTypes = new ControllerType[MaxControllers]; diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs index 35ac1a16f..e8a56933b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/TouchDevice.cs @@ -8,7 +8,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid { public TouchDevice(Switch device, bool active) : base(device, active) { } - public void Update(params TouchPoint[] points) + public void Update(params ReadOnlySpan points) { ref RingLifo lifo = ref _device.Hid.SharedMemory.TouchScreen; diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/HidUtils.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/HidUtils.cs index 8e2e854fb..d314d0567 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/HidUtils.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/HidServer/HidUtils.cs @@ -42,9 +42,9 @@ namespace Ryujinx.HLE.HOS.Services.Hid.HidServer public static bool IsValidNpadIdType(NpadIdType npadIdType) { - return (npadIdType >= NpadIdType.Player1 && npadIdType <= NpadIdType.Player8) || - npadIdType == NpadIdType.Handheld || - npadIdType == NpadIdType.Unknown; + return npadIdType is >= NpadIdType.Player1 and <= NpadIdType.Player8 or + NpadIdType.Handheld or + NpadIdType.Unknown; } } } diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs b/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs index 556e35ea6..0d2fcaa2a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs @@ -130,7 +130,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } - + [CommandCmif(26)] // ActivateDebugMouse(nn::applet::AppletResourceUserId) public ResultCode ActivateDebugMouse(ServiceCtx context) @@ -703,6 +703,18 @@ namespace Ryujinx.HLE.HOS.Services.Hid return ResultCode.Success; } + [CommandCmif(92)] + // SetGestureOutputRanges(pid, ushort Unknown0) + public ResultCode SetGestureOutputRanges(ServiceCtx context) + { + ulong pid = context.Request.HandleDesc.PId; + ushort unknown0 = context.RequestData.ReadUInt16(); + + Logger.Stub?.PrintStub(LogClass.ServiceHid, new { pid, unknown0 }); + + return ResultCode.Success; + } + [CommandCmif(100)] // SetSupportedNpadStyleSet(pid, nn::applet::AppletResourceUserId, nn::hid::NpadStyleTag) public ResultCode SetSupportedNpadStyleSet(ServiceCtx context) @@ -860,8 +872,8 @@ namespace Ryujinx.HLE.HOS.Services.Hid // Initialize entries to avoid issues with some games. - List emptyGamepadInputs = new(); - List emptySixAxisInputs = new(); + List emptyGamepadInputs = []; + List emptySixAxisInputs = []; for (int player = 0; player < NpadDevices.MaxControllers; player++) { @@ -1149,59 +1161,54 @@ namespace Ryujinx.HLE.HOS.Services.Hid NpadStyleIndex deviceType = (NpadStyleIndex)deviceHandle.DeviceType; NpadIdType npadIdType = (NpadIdType)deviceHandle.PlayerId; - if (deviceType < NpadStyleIndex.System || deviceType >= NpadStyleIndex.FullKey) + if (!HidUtils.IsValidNpadIdType(npadIdType)) { - if (!HidUtils.IsValidNpadIdType(npadIdType)) - { - return ResultCode.InvalidNpadIdType; - } - - if (deviceHandle.Position > 1) - { - return ResultCode.InvalidDeviceIndex; - } - - VibrationDeviceType vibrationDeviceType = VibrationDeviceType.None; - - if (Enum.IsDefined(deviceType)) - { - vibrationDeviceType = VibrationDeviceType.LinearResonantActuator; - } - else if ((uint)deviceType == 8) - { - vibrationDeviceType = VibrationDeviceType.GcErm; - } - - VibrationDevicePosition vibrationDevicePosition = VibrationDevicePosition.None; - - if (vibrationDeviceType == VibrationDeviceType.LinearResonantActuator) - { - if (deviceHandle.Position == 0) - { - vibrationDevicePosition = VibrationDevicePosition.Left; - } - else if (deviceHandle.Position == 1) - { - vibrationDevicePosition = VibrationDevicePosition.Right; - } - else - { - throw new InvalidOperationException($"{nameof(deviceHandle.Position)} contains an invalid value: {deviceHandle.Position}"); - } - } - - VibrationDeviceValue deviceInfo = new() - { - DeviceType = vibrationDeviceType, - Position = vibrationDevicePosition, - }; - - context.ResponseData.WriteStruct(deviceInfo); - - return ResultCode.Success; + return ResultCode.InvalidNpadIdType; } - return ResultCode.InvalidNpadDeviceType; + if (deviceHandle.Position > 1) + { + return ResultCode.InvalidDeviceIndex; + } + + VibrationDeviceType vibrationDeviceType = VibrationDeviceType.None; + + if (Enum.IsDefined(deviceType)) + { + vibrationDeviceType = VibrationDeviceType.LinearResonantActuator; + } + else if ((uint)deviceType == 8) + { + vibrationDeviceType = VibrationDeviceType.GcErm; + } + + VibrationDevicePosition vibrationDevicePosition = VibrationDevicePosition.None; + + if (vibrationDeviceType == VibrationDeviceType.LinearResonantActuator) + { + if (deviceHandle.Position == 0) + { + vibrationDevicePosition = VibrationDevicePosition.Left; + } + else if (deviceHandle.Position == 1) + { + vibrationDevicePosition = VibrationDevicePosition.Right; + } + else + { + throw new InvalidOperationException($"{nameof(deviceHandle.Position)} contains an invalid value: {deviceHandle.Position}"); + } + } + + VibrationDeviceValue deviceInfo = new() + { + DeviceType = vibrationDeviceType, + Position = vibrationDevicePosition, + }; + + context.ResponseData.WriteStruct(deviceInfo); + + return ResultCode.Success; } [CommandCmif(201)] diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/IHidbusServer.cs b/src/Ryujinx.HLE/HOS/Services/Hid/IHidbusServer.cs index d6531cc18..5082bddc2 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/IHidbusServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/IHidbusServer.cs @@ -10,9 +10,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid [CommandCmif(1)] // GetBusHandle(nn::hid::NpadIdType, nn::hidbus::BusType, nn::applet::AppletResourceUserId) -> (bool HasHandle, nn::hidbus::BusHandle) -#pragma warning disable CA1822 // Mark member as static public ResultCode GetBusHandle(ServiceCtx context) -#pragma warning restore CA1822 { NpadIdType npadIdType = (NpadIdType)context.RequestData.ReadInt32(); context.RequestData.BaseStream.Position += 4; // Padding diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs b/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs index a13e77e72..8a30ce066 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs @@ -81,7 +81,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs { IrCameraHandle irCameraHandle = context.RequestData.ReadStruct(); ulong appletResourceUserId = context.RequestData.ReadUInt64(); - var packedMomentProcessorConfig = context.RequestData.ReadStruct(); + PackedMomentProcessorConfig packedMomentProcessorConfig = context.RequestData.ReadStruct(); CheckCameraHandle(irCameraHandle); @@ -96,7 +96,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs { IrCameraHandle irCameraHandle = context.RequestData.ReadStruct(); ulong appletResourceUserId = context.RequestData.ReadUInt64(); - var packedClusteringProcessorConfig = context.RequestData.ReadStruct(); + PackedClusteringProcessorConfig packedClusteringProcessorConfig = context.RequestData.ReadStruct(); CheckCameraHandle(irCameraHandle); @@ -111,7 +111,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs { IrCameraHandle irCameraHandle = context.RequestData.ReadStruct(); ulong appletResourceUserId = context.RequestData.ReadUInt64(); - var packedImageTransferProcessorConfig = context.RequestData.ReadStruct(); + PackedImageTransferProcessorConfig packedImageTransferProcessorConfig = context.RequestData.ReadStruct(); CheckCameraHandle(irCameraHandle); @@ -157,7 +157,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs { IrCameraHandle irCameraHandle = context.RequestData.ReadStruct(); ulong appletResourceUserId = context.RequestData.ReadUInt64(); - var packedTeraPluginProcessorConfig = context.RequestData.ReadStruct(); + PackedTeraPluginProcessorConfig packedTeraPluginProcessorConfig = context.RequestData.ReadStruct(); CheckCameraHandle(irCameraHandle); @@ -172,9 +172,9 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs { NpadIdType npadIdType = (NpadIdType)context.RequestData.ReadUInt32(); - if (npadIdType > NpadIdType.Player8 && - npadIdType != NpadIdType.Unknown && - npadIdType != NpadIdType.Handheld) + if (npadIdType is > NpadIdType.Player8 and + not NpadIdType.Unknown and + not NpadIdType.Handheld) { return ResultCode.NpadIdOutOfRange; } diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/SharedMemory.cs b/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/SharedMemory.cs index 59d8f4489..7f3e564fb 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/SharedMemory.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/Types/SharedMemory/SharedMemory.cs @@ -45,7 +45,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory /// [FieldOffset(0x9A00)] public Array10 Npads; - + /// /// Debug mouse. /// diff --git a/src/Ryujinx.HLE/HOS/Services/IpcService.cs b/src/Ryujinx.HLE/HOS/Services/IpcService.cs index 808f21c0e..4c354ebc6 100644 --- a/src/Ryujinx.HLE/HOS/Services/IpcService.cs +++ b/src/Ryujinx.HLE/HOS/Services/IpcService.cs @@ -1,8 +1,10 @@ +using Gommon; using Ryujinx.Common.Logging; using Ryujinx.HLE.Exceptions; using Ryujinx.HLE.HOS.Ipc; using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; @@ -21,21 +23,42 @@ namespace Ryujinx.HLE.HOS.Services private int _selfId; private bool _isDomain; - public IpcService(ServerBase server = null) + public IpcService(ServerBase server = null, bool registerTipc = false) { - CmifCommands = typeof(IpcService).Assembly.GetTypes() - .Where(type => type == GetType()) - .SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)) - .SelectMany(methodInfo => methodInfo.GetCustomAttributes(typeof(CommandCmifAttribute)) - .Select(command => (((CommandCmifAttribute)command).Id, methodInfo))) + Stopwatch sw = Stopwatch.StartNew(); + + CmifCommands = GetType() + .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public) + .SelectMany(methodInfo => methodInfo.GetCustomAttributes() + .Select(command => (command.Id, methodInfo))) .ToDictionary(command => command.Id, command => command.methodInfo); - TipcCommands = typeof(IpcService).Assembly.GetTypes() - .Where(type => type == GetType()) - .SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)) - .SelectMany(methodInfo => methodInfo.GetCustomAttributes(typeof(CommandTipcAttribute)) - .Select(command => (((CommandTipcAttribute)command).Id, methodInfo))) - .ToDictionary(command => command.Id, command => command.methodInfo); + sw.Stop(); + + Logger.Debug?.Print( + LogClass.Emulation, + $"{CmifCommands.Count} Cmif commands loaded in {sw.ElapsedTicks} ticks ({Stopwatch.Frequency} tps).", + GetType().AsPrettyString() + ); + + if (registerTipc) + { + sw.Start(); + + TipcCommands = GetType() + .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public) + .SelectMany(methodInfo => methodInfo.GetCustomAttributes() + .Select(command => (command.Id, methodInfo))) + .ToDictionary(command => command.Id, command => command.methodInfo); + + sw.Stop(); + + Logger.Debug?.Print( + LogClass.Emulation, + $"{TipcCommands.Count} Tipc commands loaded in {sw.ElapsedTicks} ticks ({Stopwatch.Frequency} tps).", + GetType().AsPrettyString() + ); + } Server = server; @@ -123,14 +146,11 @@ namespace Ryujinx.HLE.HOS.Services { Logger.Trace?.Print(LogClass.KernelIpc, $"{service.GetType().Name}: {processRequest.Name}"); - result = (ResultCode)processRequest.Invoke(service, new object[] { context }); + result = (ResultCode)processRequest.Invoke(service, [context]); } else { - string serviceName; - - - serviceName = (service is not DummyService dummyService) ? service.GetType().FullName : dummyService.ServiceName; + string serviceName = (service is not DummyService dummyService) ? service.GetType().FullName : dummyService.ServiceName; Logger.Warning?.Print(LogClass.KernelIpc, $"Missing service {serviceName}: {commandId} ignored"); } @@ -176,13 +196,12 @@ namespace Ryujinx.HLE.HOS.Services { Logger.Debug?.Print(LogClass.KernelIpc, $"{GetType().Name}: {processRequest.Name}"); - result = (ResultCode)processRequest.Invoke(this, new object[] { context }); + result = (ResultCode)processRequest.Invoke(this, [context]); } else { string serviceName; - serviceName = (this is not DummyService dummyService) ? GetType().FullName : dummyService.ServiceName; Logger.Warning?.Print(LogClass.KernelIpc, $"Missing service {serviceName}: {commandId} ignored"); diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/Lp2p/ISfService.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/Lp2p/ISfService.cs index d48a88978..8f9f0e3e4 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/Lp2p/ISfService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/Lp2p/ISfService.cs @@ -24,6 +24,15 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.Lp2p return ResultCode.Success; } + [CommandCmif(776)] + // DestroyGroup() + public ResultCode DestroyGroup(ServiceCtx context) + { + Logger.Stub?.PrintStub(LogClass.ServiceLdn); + + return ResultCode.Success; + } + [CommandCmif(1536)] // SendToOtherGroup(nn::lp2p::MacAddress, nn::lp2p::GroupId, s16, s16, u32, buffer) public ResultCode SendToOtherGroup(ServiceCtx context) diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/Types/NodeLatestUpdate.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/Types/NodeLatestUpdate.cs index 0461e783e..826a50458 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/Types/NodeLatestUpdate.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/Types/NodeLatestUpdate.cs @@ -1,5 +1,6 @@ using Ryujinx.Common.Memory; using System.Runtime.InteropServices; +using System.Threading; namespace Ryujinx.HLE.HOS.Services.Ldn.Types { @@ -12,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.Types static class NodeLatestUpdateHelper { - private static readonly object _lock = new(); + private static readonly Lock _lock = new(); public static void CalculateLatestUpdate(this Array8 array, Array8 beforeNodes, Array8 afterNodes) { diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/AccessPoint.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/AccessPoint.cs index bd00a3139..d416ef233 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/AccessPoint.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/AccessPoint.cs @@ -84,7 +84,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator NetworkConfig = networkConfig, }; - bool success = _parent.NetworkClient.CreateNetwork(request, _advertiseData ?? Array.Empty()); + bool success = _parent.NetworkClient.CreateNetwork(request, _advertiseData ?? []); return success ? ResultCode.Success : ResultCode.InvalidState; } diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs index 028ab6cfc..4254ba887 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/INetworkClient.cs @@ -17,7 +17,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator NetworkError ConnectPrivate(ConnectPrivateRequest request); ResultCode Reject(DisconnectReason disconnectReason, uint nodeId); NetworkInfo[] Scan(ushort channel, ScanFilter scanFilter); - void SetGameVersion(byte[] versionString); + void SetGameVersion(ReadOnlySpan versionString); void SetStationAcceptPolicy(AcceptPolicy acceptPolicy); void SetAdvertiseData(byte[] data); bool CreateNetwork(CreateAccessPointRequest request, byte[] advertiseData); diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs index 9f65aed4b..62a86ad91 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs @@ -23,9 +23,6 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator { class IUserLocalCommunicationService : IpcService, IDisposable { - public static string DefaultLanPlayHost = "ryuldn.vudjun.com"; - public static short LanPlayPort = 30456; - public INetworkClient NetworkClient { get; private set; } private const int NifmRequestID = 90; @@ -65,7 +62,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator // TODO: Call nn::arp::GetApplicationControlProperty here when implemented. ApplicationControlProperty controlProperty = context.Device.Processes.ActiveApplication.ApplicationControlProperties; - foreach (var localCommunicationId in controlProperty.LocalCommunicationId.ItemsRo) + foreach (ulong localCommunicationId in controlProperty.LocalCommunicationId) { if (localCommunicationId == localCommunicationIdChecked) { @@ -163,7 +160,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator } else { - return Array.Empty(); + return []; } } @@ -178,7 +175,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator // NOTE: Return ResultCode.InvalidArgument if ip_address and subnet_mask are null, doesn't occur in our case. - if (_state == NetworkState.AccessPointCreated || _state == NetworkState.StationConnected) + if (_state is NetworkState.AccessPointCreated or NetworkState.StationConnected) { ProxyConfig config = _state switch { @@ -444,7 +441,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator private ResultCode ScanInternal(IVirtualMemoryManager memory, ushort channel, ScanFilter scanFilter, ulong bufferPosition, ulong bufferSize, out ulong counter) { - ulong networkInfoSize = (ulong)Marshal.SizeOf(typeof(NetworkInfo)); + ulong networkInfoSize = (ulong)Marshal.SizeOf(); ulong maxGames = bufferSize / networkInfoSize; MemoryHelper.FillWithZeros(memory, bufferPosition, (int)bufferSize); @@ -525,7 +522,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator return _nifmResultCode; } - if (_state == NetworkState.AccessPoint || _state == NetworkState.AccessPointCreated) + if (_state is NetworkState.AccessPoint or NetworkState.AccessPointCreated) { DestroyNetworkImpl(DisconnectReason.DestroyedByUser); } @@ -701,12 +698,12 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator return _nifmResultCode; } - if (bufferSize == 0 || bufferSize > LdnConst.AdvertiseDataSizeMax) + if (bufferSize is 0 or > LdnConst.AdvertiseDataSizeMax) { return ResultCode.InvalidArgument; } - if (_state == NetworkState.AccessPoint || _state == NetworkState.AccessPointCreated) + if (_state is NetworkState.AccessPoint or NetworkState.AccessPointCreated) { byte[] advertiseData = new byte[bufferSize]; @@ -736,7 +733,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator return ResultCode.InvalidArgument; } - if (_state == NetworkState.AccessPoint || _state == NetworkState.AccessPointCreated) + if (_state is NetworkState.AccessPoint or NetworkState.AccessPointCreated) { return _accessPoint.SetStationAcceptPolicy(acceptPolicy); } @@ -810,7 +807,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator return _nifmResultCode; } - if (_state == NetworkState.Station || _state == NetworkState.StationConnected) + if (_state is NetworkState.Station or NetworkState.StationConnected) { DisconnectImpl(DisconnectReason.DisconnectedByUser); } @@ -1092,23 +1089,23 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator case MultiplayerMode.LdnRyu: try { - string ldnServer = context.Device.Configuration.MultiplayerLdnServer; - if (string.IsNullOrEmpty(ldnServer)) - { - ldnServer = DefaultLanPlayHost; - } + string ldnServer = context.Device.Configuration.MultiplayerLdnServer + ?? throw new InvalidOperationException("Cannot initialize RyuLDN with a null Multiplayer server."); + if (!IPAddress.TryParse(ldnServer, out IPAddress ipAddress)) { ipAddress = Dns.GetHostEntry(ldnServer).AddressList[0]; } - NetworkClient = new LdnMasterProxyClient(ipAddress.ToString(), LanPlayPort, context.Device.Configuration); + + NetworkClient = new LdnMasterProxyClient(ipAddress.ToString(), SharedConstants.LanPlayPort, context.Device.Configuration); } catch (Exception ex) { - Logger.Error?.Print(LogClass.ServiceLdn, "Could not locate LdnRyu server. Defaulting to stubbed wireless."); + Logger.Error?.Print(LogClass.ServiceLdn, "Could not locate RyuLDN server. Defaulting to stubbed wireless."); Logger.Error?.Print(LogClass.ServiceLdn, ex.Message); NetworkClient = new LdnDisabledClient(); } + break; case MultiplayerMode.LdnMitm: NetworkClient = new LdnMitmClient(context.Device.Configuration); @@ -1119,7 +1116,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator } // TODO: Call nn::arp::GetApplicationLaunchProperty here when implemented. - NetworkClient.SetGameVersion(context.Device.Processes.ActiveApplication.ApplicationControlProperties.DisplayVersion.Items.ToArray()); + NetworkClient.SetGameVersion(context.Device.Processes.ActiveApplication.ApplicationControlProperties.DisplayVersion); resultCode = ResultCode.Success; diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs index 2e8bb8d83..e7a874895 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnDisabledClient.cs @@ -56,12 +56,12 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator public NetworkInfo[] Scan(ushort channel, ScanFilter scanFilter) { Logger.Warning?.PrintMsg(LogClass.ServiceLdn, "Attempted to scan for networks, but Multiplayer is disabled!"); - return Array.Empty(); + return []; } public void SetAdvertiseData(byte[] data) { } - public void SetGameVersion(byte[] versionString) { } + public void SetGameVersion(ReadOnlySpan versionString) { } public void SetStationAcceptPolicy(AcceptPolicy acceptPolicy) { } diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanDiscovery.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanDiscovery.cs index b5f643d23..b34772219 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanDiscovery.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanDiscovery.cs @@ -28,8 +28,8 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm private readonly Ssid _fakeSsid; private ILdnTcpSocket _tcp; private LdnProxyUdpServer _udp, _udp2; - private readonly List _stations = new(); - private readonly object _lock = new(); + private readonly List _stations = []; + private readonly Lock _lock = new(); private readonly AutoResetEvent _apConnected = new(false); @@ -244,7 +244,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm byte[] ip = address.GetAddressBytes(); - var macAddress = new Array6(); + Array6 macAddress = new(); new byte[] { 0x02, 0x00, ip[0], ip[1], ip[2], ip[3] }.CopyTo(macAddress.AsSpan()); return macAddress; @@ -340,10 +340,10 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm if (_protocol.SendBroadcast(_udp, LanPacketType.Scan, DefaultPort) < 0) { - return Array.Empty(); + return []; } - List outNetworkInfo = new(); + List outNetworkInfo = []; foreach (KeyValuePair item in _udp.GetScanResults()) { diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanProtocol.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanProtocol.cs index b60b70d80..a6470d94a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanProtocol.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LanProtocol.cs @@ -59,6 +59,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm { Scan?.Invoke(endPoint, LanPacketType.ScanResponse, SpanHelpers.AsSpan(ref _discovery.NetworkInfo).ToArray()); } + break; case LanPacketType.ScanResponse: // UDP @@ -162,7 +163,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm public int SendBroadcast(ILdnSocket s, LanPacketType type, int port) { - return SendPacket(s, type, Array.Empty(), new IPEndPoint(_discovery.LocalBroadcastAddr, port)); + return SendPacket(s, type, [], new IPEndPoint(_discovery.LocalBroadcastAddr, port)); } public int SendPacket(ILdnSocket s, LanPacketType type, byte[] data, EndPoint endPoint = null) @@ -231,7 +232,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm private int Compress(byte[] input, out byte[] output) { - List outputList = new(); + List outputList = []; int i = 0; int maxCount = 0xFF; @@ -275,7 +276,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm private int Decompress(byte[] input, out byte[] output) { - List outputList = new(); + List outputList = []; int i = 0; while (i < input.Length && outputList.Count < BufferSize) diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs index 40697d122..12a15e491 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs @@ -19,7 +19,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm private readonly LanDiscovery _lanDiscovery; - public LdnMitmClient(HLEConfiguration config) + public LdnMitmClient(HleConfiguration config) { UnicastIPAddressInformation localIpInterface = NetworkHelpers.GetLocalInterface(config.MultiplayerLanInterfaceId).Item2; @@ -85,7 +85,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm _lanDiscovery.SetAdvertiseData(data); } - public void SetGameVersion(byte[] versionString) + public void SetGameVersion(ReadOnlySpan versionString) { // NOTE: This method is not implemented in ldn_mitm Logger.Stub?.PrintMsg(LogClass.ServiceLdn, "LdnMitmClient SetGameVersion"); diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/Proxy/LdnProxyUdpServer.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/Proxy/LdnProxyUdpServer.cs index 0f5875a1d..374871311 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/Proxy/LdnProxyUdpServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/Proxy/LdnProxyUdpServer.cs @@ -18,7 +18,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm.Proxy private byte[] _buffer; private int _bufferEnd; - private readonly object _scanLock = new(); + private readonly Lock _scanLock = new(); private Dictionary _scanResultsLast = new(); private Dictionary _scanResults = new(); @@ -112,7 +112,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm.Proxy lock (_scanLock) { - var newResults = _scanResultsLast; + Dictionary newResults = _scanResultsLast; newResults.Clear(); _scanResultsLast = _scanResults; @@ -138,7 +138,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm.Proxy lock (_scanLock) { - var results = new Dictionary(); + Dictionary results = new(); foreach (KeyValuePair last in _scanResultsLast) { diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs index 4c7814b8e..f93b1c4cc 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs @@ -22,7 +22,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu { public bool NeedsRealId => true; - private static InitializeMessage InitializeMemory = new InitializeMessage(); + private static InitializeMessage InitializeMemory = new(); private const int InactiveTimeout = 6000; private const int FailureTimeout = 4000; @@ -31,16 +31,16 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu private bool _useP2pProxy; private NetworkError _lastError; - private readonly ManualResetEvent _connected = new ManualResetEvent(false); - private readonly ManualResetEvent _error = new ManualResetEvent(false); - private readonly ManualResetEvent _scan = new ManualResetEvent(false); - private readonly ManualResetEvent _reject = new ManualResetEvent(false); - private readonly AutoResetEvent _apConnected = new AutoResetEvent(false); + private readonly ManualResetEvent _connected = new(false); + private readonly ManualResetEvent _error = new(false); + private readonly ManualResetEvent _scan = new(false); + private readonly ManualResetEvent _reject = new(false); + private readonly AutoResetEvent _apConnected = new(false); private readonly RyuLdnProtocol _protocol; private readonly NetworkTimeout _timeout; - private readonly List _availableGames = new List(); + private readonly List _availableGames = []; private DisconnectReason _disconnectReason; private P2pProxyServer _hostedProxy; @@ -51,13 +51,13 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu private string _passphrase; private byte[] _gameVersion = new byte[0x10]; - private readonly HLEConfiguration _config; + private readonly HleConfiguration _config; public event EventHandler NetworkChange; public ProxyConfig Config { get; private set; } - public LdnMasterProxyClient(string address, int port, HLEConfiguration config) : base(address, port) + public LdnMasterProxyClient(string address, int port, HleConfiguration config) : base(address, port) { if (ProxyHelpers.SupportsNoDelay()) { @@ -109,7 +109,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu ConnectAsync(); - int index = WaitHandle.WaitAny(new WaitHandle[] { _connected, _error }, FailureTimeout); + int index = WaitHandle.WaitAny([_connected, _error], FailureTimeout); if (IsConnected) { @@ -121,7 +121,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu private void UpdatePassphraseIfNeeded() { - string passphrase = _config.MultiplayerLdnPassphrase ?? ""; + string passphrase = _config.MultiplayerLdnPassphrase ?? string.Empty; if (passphrase != _passphrase) { _passphrase = passphrase; @@ -179,8 +179,6 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu _error.Set(); } - - private void HandleInitialize(LdnHeader header, InitializeMessage initialize) { InitializeMemory = initialize; @@ -326,7 +324,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu SendAsync(_protocol.Encode(PacketId.Reject, new RejectRequest(disconnectReason, nodeId))); - int index = WaitHandle.WaitAny(new WaitHandle[] { _reject, _error }, InactiveTimeout); + int index = WaitHandle.WaitAny([_reject, _error], InactiveTimeout); if (index == 0) { @@ -346,9 +344,9 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu } } - public void SetGameVersion(byte[] versionString) + public void SetGameVersion(ReadOnlySpan versionString) { - _gameVersion = versionString; + _gameVersion = versionString.ToArray(); if (_gameVersion.Length < 0x10) { @@ -490,7 +488,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu SendAsync(_protocol.Encode(PacketId.CreateAccessPoint, request, advertiseData)); // Send a network change event with dummy data immediately. Necessary to avoid crashes in some games - var networkChangeEvent = new NetworkChangeEventArgs(new NetworkInfo() + NetworkChangeEventArgs networkChangeEvent = new(new NetworkInfo() { Common = new CommonNetworkInfo() { @@ -566,13 +564,13 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu SendAsync(_protocol.Encode(PacketId.Scan, scanFilter)); - index = WaitHandle.WaitAny(new WaitHandle[] { _scan, _error }, ScanTimeout); + index = WaitHandle.WaitAny([_scan, _error], ScanTimeout); } if (index != 0) { // An error occurred or timeout. Write 0 games. - return Array.Empty(); + return []; } return _availableGames.ToArray(); @@ -610,7 +608,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu SendAsync(_protocol.Encode(PacketId.Connect, request)); - var networkChangeEvent = new NetworkChangeEventArgs(new NetworkInfo() + NetworkChangeEventArgs networkChangeEvent = new(new NetworkInfo() { Common = request.NetworkInfo.Common, Ldn = request.NetworkInfo.Ldn diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/NetworkTimeout.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/NetworkTimeout.cs index 5012d5d81..f7a9d77a4 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/NetworkTimeout.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/NetworkTimeout.cs @@ -10,7 +10,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu private readonly Action _timeoutCallback; private CancellationTokenSource _cancel; - private readonly object _lock = new object(); + private readonly Lock _lock = new(); public NetworkTimeout(int idleTimeout, Action timeoutCallback) { diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/EphemeralPortPool.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/EphemeralPortPool.cs index bc3a5edf2..75cc15a98 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/EphemeralPortPool.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/EphemeralPortPool.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading; namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy { @@ -6,9 +7,9 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy { private const ushort EphemeralBase = 49152; - private readonly List _ephemeralPorts = new List(); + private readonly List _ephemeralPorts = []; - private readonly object _lock = new object(); + private readonly Lock _lock = new(); public ushort Get() { diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/LdnProxy.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/LdnProxy.cs index bb390d49a..06d46aadc 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/LdnProxy.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/LdnProxy.cs @@ -13,8 +13,8 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy public EndPoint LocalEndpoint { get; } public IPAddress LocalAddress { get; } - private readonly List _sockets = new List(); - private readonly Dictionary _ephemeralPorts = new Dictionary(); + private readonly List _sockets = []; + private readonly Dictionary _ephemeralPorts = new(); private readonly IProxyClient _parent; private RyuLdnProtocol _protocol; @@ -47,6 +47,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy { Logger.Error?.PrintMsg(LogClass.ServiceLdn, "Tcp proxy networking is untested. Please report this game so that it can be tested."); } + return domain == AddressFamily.InterNetwork && (protocol == ProtocolType.Tcp || protocol == ProtocolType.Udp); } @@ -132,7 +133,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy public void HandleData(LdnHeader header, ProxyDataHeader proxyHeader, byte[] data) { - ProxyDataPacket packet = new ProxyDataPacket() { Header = proxyHeader, Data = data }; + ProxyDataPacket packet = new() { Header = proxyHeader, Data = data }; ForRoutedSockets(proxyHeader.Info, (socket) => { @@ -179,7 +180,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy { // We must ask the other side to initialize a connection, so they can accept a socket for us. - ProxyConnectRequest request = new ProxyConnectRequest + ProxyConnectRequest request = new() { Info = MakeInfo(localEp, remoteEp, type) }; @@ -191,7 +192,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy { // We must tell the other side that we have accepted their request for connection. - ProxyConnectResponse request = new ProxyConnectResponse + ProxyConnectResponse request = new() { Info = MakeInfo(localEp, remoteEp, type) }; @@ -203,7 +204,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy { // We must tell the other side that our connection is dropped. - ProxyDisconnectMessage request = new ProxyDisconnectMessage + ProxyDisconnectMessage request = new() { Info = MakeInfo(localEp, remoteEp, type), DisconnectReason = 0 // TODO @@ -217,7 +218,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy // We send exactly as much as the user wants us to, currently instantly. // TODO: handle over "virtual mtu" (we have a max packet size to worry about anyways). fragment if tcp? throw if udp? - ProxyDataHeader request = new ProxyDataHeader + ProxyDataHeader request = new() { Info = MakeInfo(localEp, remoteEp, type), DataLength = (uint)buffer.Length diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/LdnProxySocket.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/LdnProxySocket.cs index ed7a9c751..4cdb8e8b8 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/LdnProxySocket.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/LdnProxySocket.cs @@ -18,21 +18,21 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy private readonly LdnProxy _proxy; private bool _isListening; - private readonly List _listenSockets = new List(); + private readonly List _listenSockets = []; - private readonly Queue _connectRequests = new Queue(); + private readonly Queue _connectRequests = new(); - private readonly AutoResetEvent _acceptEvent = new AutoResetEvent(false); + private readonly AutoResetEvent _acceptEvent = new(false); private readonly int _acceptTimeout = -1; - private readonly Queue _errors = new Queue(); + private readonly Queue _errors = new(); - private readonly AutoResetEvent _connectEvent = new AutoResetEvent(false); + private readonly AutoResetEvent _connectEvent = new(false); private ProxyConnectResponse _connectResponse; private int _receiveTimeout = -1; - private readonly AutoResetEvent _receiveEvent = new AutoResetEvent(false); - private readonly Queue _receiveQueue = new Queue(); + private readonly AutoResetEvent _receiveEvent = new(false); + private readonly Queue _receiveQueue = new(); // private int _sendTimeout = -1; // Sends are techically instant right now, so not _really_ used. @@ -42,7 +42,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy // private bool _writeShutdown; private bool _closed; - private readonly Dictionary _socketOptions = new Dictionary() + private readonly Dictionary _socketOptions = new() { { SocketOptionName.Broadcast, 0 }, //TODO: honor this value { SocketOptionName.DontLinger, 0 }, @@ -115,7 +115,6 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy return _receiveQueue.Count > 0; } } - } } public bool Writable => Connected || ProtocolType == ProtocolType.Udp; @@ -147,7 +146,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy } } - IPEndPoint localEp = new IPEndPoint(_proxy.LocalAddress, _proxy.GetEphemeralPort(ProtocolType)); + IPEndPoint localEp = new(_proxy.LocalAddress, _proxy.GetEphemeralPort(ProtocolType)); LocalEndPoint = localEp; return localEp; @@ -256,7 +255,8 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy { _proxy.ReturnEphemeralPort(ProtocolType, (ushort)((IPEndPoint)LocalEndPoint).Port); } - var asIPEndpoint = (IPEndPoint)localEP; + + IPEndPoint asIPEndpoint = (IPEndPoint)localEP; if (asIPEndpoint.Port == 0) { asIPEndpoint.Port = (ushort)_proxy.GetEphemeralPort(ProtocolType); diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyClient.cs index 7da1aa998..7392ef62b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyClient.cs @@ -16,9 +16,9 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy private readonly RyuLdnProtocol _protocol; - private readonly ManualResetEvent _connected = new ManualResetEvent(false); - private readonly ManualResetEvent _ready = new ManualResetEvent(false); - private readonly AutoResetEvent _error = new AutoResetEvent(false); + private readonly ManualResetEvent _connected = new(false); + private readonly ManualResetEvent _ready = new(false); + private readonly AutoResetEvent _error = new(false); public P2pProxyClient(string address, int port) : base(address, port) { diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs index fbce5c10c..58830c1ce 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs @@ -29,22 +29,22 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy private const ushort AuthWaitSeconds = 1; - private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); + private readonly ReaderWriterLockSlim _lock = new(LockRecursionPolicy.SupportsRecursion); public ushort PrivatePort { get; } private ushort _publicPort; private bool _disposed; - private readonly CancellationTokenSource _disposedCancellation = new CancellationTokenSource(); + private readonly CancellationTokenSource _disposedCancellation = new(); private NatDevice _natDevice; private Mapping _portMapping; - private readonly List _players = new List(); + private readonly List _players = []; - private readonly List _waitingTokens = new List(); - private readonly AutoResetEvent _tokenEvent = new AutoResetEvent(false); + private readonly List _waitingTokens = []; + private readonly AutoResetEvent _tokenEvent = new(false); private uint _broadcastAddress; @@ -112,8 +112,8 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy public async Task NatPunch() { - NatDiscoverer discoverer = new NatDiscoverer(); - CancellationTokenSource cts = new CancellationTokenSource(1000); + NatDiscoverer discoverer = new(); + CancellationTokenSource cts = new(2500); NatDevice device; @@ -156,7 +156,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy if (_publicPort != 0) { _ = Executor.ExecuteAfterDelayAsync( - PortLeaseRenew.Seconds(), + PortLeaseRenew.Seconds(), _disposedCancellation.Token, RefreshLease); } @@ -300,7 +300,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy session.SetIpv4(waitToken.VirtualIp); - ProxyConfig pconfig = new ProxyConfig + ProxyConfig pconfig = new() { ProxyIp = session.VirtualIpAddress, ProxySubnetMask = 0xFFFF0000 // TODO: Use from server. diff --git a/src/Ryujinx.HLE/HOS/Services/Loader/ResultCode.cs b/src/Ryujinx.HLE/HOS/Services/Loader/ResultCode.cs index 6744563d9..18b267e91 100644 --- a/src/Ryujinx.HLE/HOS/Services/Loader/ResultCode.cs +++ b/src/Ryujinx.HLE/HOS/Services/Loader/ResultCode.cs @@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.HLE.HOS.Services.Loader { - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum ResultCode { ModuleId = 9, diff --git a/src/Ryujinx.HLE/HOS/Services/Mii/Helper.cs b/src/Ryujinx.HLE/HOS/Services/Mii/Helper.cs index f4d288e9c..c1dd76800 100644 --- a/src/Ryujinx.HLE/HOS/Services/Mii/Helper.cs +++ b/src/Ryujinx.HLE/HOS/Services/Mii/Helper.cs @@ -40,11 +40,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii } #pragma warning disable IDE0055 // Disable formatting - public static ReadOnlySpan Ver3FacelineColorTable => new byte[] { 0, 1, 2, 3, 4, 5 }; - public static ReadOnlySpan Ver3HairColorTable => new byte[] { 8, 1, 2, 3, 4, 5, 6, 7 }; - public static ReadOnlySpan Ver3EyeColorTable => new byte[] { 8, 9, 10, 11, 12, 13 }; - public static ReadOnlySpan Ver3MouthColorTable => new byte[] { 19, 20, 21, 22, 23 }; - public static ReadOnlySpan Ver3GlassColorTable => new byte[] { 8, 14, 15, 16, 17, 18, 0 }; + public static ReadOnlySpan Ver3FacelineColorTable => [0, 1, 2, 3, 4, 5]; + public static ReadOnlySpan Ver3HairColorTable => [8, 1, 2, 3, 4, 5, 6, 7]; + public static ReadOnlySpan Ver3EyeColorTable => [8, 9, 10, 11, 12, 13]; + public static ReadOnlySpan Ver3MouthColorTable => [19, 20, 21, 22, 23]; + public static ReadOnlySpan Ver3GlassColorTable => [8, 14, 15, 16, 17, 18, 0]; #pragma warning restore IDE0055 } } diff --git a/src/Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs b/src/Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs index 23a52d908..356d42a85 100644 --- a/src/Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Mii/MiiDatabaseManager.cs @@ -124,7 +124,6 @@ namespace Ryujinx.HLE.HOS.Services.Mii } if (_isTestModeEnabled) -#pragma warning disable CS0162 { result = _horizonClient.Fs.CreateSystemSaveData(saveDataId, 0x10000, 0x10000, SaveDataFlags.KeepAfterResettingSystemSaveDataWithoutUserSaveData); @@ -133,7 +132,6 @@ namespace Ryujinx.HLE.HOS.Services.Mii return result; } } -#pragma warning restore CS0162 else { result = _horizonClient.Fs.CreateSystemSaveData(saveDataId, SystemProgramId.Ns.Value, 0x10000, @@ -155,6 +153,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii { _mountCounter++; } + return result; } diff --git a/src/Ryujinx.HLE/HOS/Services/Mii/Types/CharInfo.cs b/src/Ryujinx.HLE/HOS/Services/Mii/Types/CharInfo.cs index 63f44694f..8da856947 100644 --- a/src/Ryujinx.HLE/HOS/Services/Mii/Types/CharInfo.cs +++ b/src/Ryujinx.HLE/HOS/Services/Mii/Types/CharInfo.cs @@ -76,202 +76,252 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types { return 50; } + if (!Nickname.IsValid()) { return 51; } + if ((byte)FontRegion > 3) { return 23; } + if (FavoriteColor > 11) { return 22; } + if (Gender > Gender.Max) { return 24; } + if ((sbyte)Height < 0) { return 32; } + if ((sbyte)Build < 0) { return 3; } + if (Type > 1) { return 53; } + if (RegionMove > 3) { return 49; } + if (FacelineType > FacelineType.Max) { return 21; } + if (FacelineColor > FacelineColor.Max) { return 18; } + if (FacelineWrinkle > FacelineWrinkle.Max) { return 20; } + if (FacelineMake > FacelineMake.Max) { return 19; } + if (HairType > HairType.Max) { return 31; } + if (HairColor > CommonColor.Max) { return 29; } + if (HairFlip > HairFlip.Max) { return 30; } + if (EyeType > EyeType.Max) { return 8; } + if (EyeColor > CommonColor.Max) { return 5; } + if (EyeScale > 7) { return 7; } + if (EyeAspect > 6) { return 4; } + if (EyeRotate > 7) { return 6; } + if (EyeX > 12) { return 9; } + if (EyeY > 18) { return 10; } + if (EyebrowType > EyebrowType.Max) { return 15; } + if (EyebrowColor > CommonColor.Max) { return 12; } + if (EyebrowScale > 8) { return 14; } + if (EyebrowAspect > 6) { return 11; } + if (EyebrowRotate > 11) { return 13; } + if (EyebrowX > 12) { return 16; } + if (EyebrowY - 3 > 15) { return 17; } + if (NoseType > NoseType.Max) { return 47; } + if (NoseScale > 8) { return 46; } + if (NoseY > 18) { return 48; } + if (MouthType > MouthType.Max) { return 40; } + if (MouthColor > CommonColor.Max) { return 38; } + if (MouthScale > 8) { return 39; } + if (MouthAspect > 6) { return 37; } + if (MouthY > 18) { return 41; } + if (BeardColor > CommonColor.Max) { return 1; } + if (BeardType > BeardType.Max) { return 2; } + if (MustacheType > MustacheType.Max) { return 43; } + if (MustacheScale > 8) { return 42; } + if (MustacheY > 16) { return 44; } + if (GlassType > GlassType.Max) { return 27; } + if (GlassColor > CommonColor.Max) { return 25; } + if (GlassScale > 7) { return 26; } + if (GlassY > 20) { return 28; } + if (MoleType > MoleType.Max) { return 34; } + if (MoleScale > 8) { return 33; } + if (MoleX > 16) { return 35; } + if (MoleY >= 31) { return 36; diff --git a/src/Ryujinx.HLE/HOS/Services/Mii/Types/CoreData.cs b/src/Ryujinx.HLE/HOS/Services/Mii/Types/CoreData.cs index aaeb8aa10..5053cd5ca 100644 --- a/src/Ryujinx.HLE/HOS/Services/Mii/Types/CoreData.cs +++ b/src/Ryujinx.HLE/HOS/Services/Mii/Types/CoreData.cs @@ -440,18 +440,18 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types int indexFor4 = 3 * (int)age + 9 * (int)gender + (int)race; - var facelineTypeInfo = RandomMiiFacelineArray[indexFor4]; - var facelineColorInfo = RandomMiiFacelineColorArray[3 * (int)gender + (int)race]; - var facelineWrinkleInfo = RandomMiiFacelineWrinkleArray[indexFor4]; - var facelineMakeInfo = RandomMiiFacelineMakeArray[indexFor4]; - var hairTypeInfo = RandomMiiHairTypeArray[indexFor4]; - var hairColorInfo = RandomMiiHairColorArray[3 * (int)race + (int)age]; - var eyeTypeInfo = RandomMiiEyeTypeArray[indexFor4]; - var eyeColorInfo = RandomMiiEyeColorArray[(int)race]; - var eyebrowTypeInfo = RandomMiiEyebrowTypeArray[indexFor4]; - var noseTypeInfo = RandomMiiNoseTypeArray[indexFor4]; - var mouthTypeInfo = RandomMiiMouthTypeArray[indexFor4]; - var glassTypeInfo = RandomMiiGlassTypeArray[(int)age]; + RandomMiiData4 facelineTypeInfo = RandomMiiFacelineArray[indexFor4]; + RandomMiiData3 facelineColorInfo = RandomMiiFacelineColorArray[3 * (int)gender + (int)race]; + RandomMiiData4 facelineWrinkleInfo = RandomMiiFacelineWrinkleArray[indexFor4]; + RandomMiiData4 facelineMakeInfo = RandomMiiFacelineMakeArray[indexFor4]; + RandomMiiData4 hairTypeInfo = RandomMiiHairTypeArray[indexFor4]; + RandomMiiData3 hairColorInfo = RandomMiiHairColorArray[3 * (int)race + (int)age]; + RandomMiiData4 eyeTypeInfo = RandomMiiEyeTypeArray[indexFor4]; + RandomMiiData2 eyeColorInfo = RandomMiiEyeColorArray[(int)race]; + RandomMiiData4 eyebrowTypeInfo = RandomMiiEyebrowTypeArray[indexFor4]; + RandomMiiData4 noseTypeInfo = RandomMiiNoseTypeArray[indexFor4]; + RandomMiiData4 mouthTypeInfo = RandomMiiMouthTypeArray[indexFor4]; + RandomMiiData2 glassTypeInfo = RandomMiiGlassTypeArray[(int)age]; // Faceline coreData.FacelineType = (FacelineType)facelineTypeInfo.Values[utilImpl.GetRandom(facelineTypeInfo.ValuesCount)]; @@ -830,8 +830,8 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types } #region "Element Info Array" - private readonly ReadOnlySpan ElementInfoArray => new byte[] - { + private readonly ReadOnlySpan ElementInfoArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -905,8 +905,8 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - }; + 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 + ]; #endregion } } diff --git a/src/Ryujinx.HLE/HOS/Services/Mii/Types/DefaultMii.cs b/src/Ryujinx.HLE/HOS/Services/Mii/Types/DefaultMii.cs index b7a63d16b..5ad7013e4 100644 --- a/src/Ryujinx.HLE/HOS/Services/Mii/Types/DefaultMii.cs +++ b/src/Ryujinx.HLE/HOS/Services/Mii/Types/DefaultMii.cs @@ -73,7 +73,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types // The first 2 Mii in the default table are used as base for Male/Female in editor but not exposed via IPC. public static int TableLength => _fromIndex.Length; - private static readonly int[] _fromIndex = { 2, 3, 4, 5, 6, 7 }; + private static readonly int[] _fromIndex = [2, 3, 4, 5, 6, 7]; public static DefaultMii GetDefaultMii(uint index) { @@ -81,8 +81,8 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types } #region "Raw Table Array" - private static ReadOnlySpan TableRawArray => new byte[] - { + private static ReadOnlySpan TableRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, @@ -190,8 +190,8 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x6f, 0x00, - 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; #endregion } } diff --git a/src/Ryujinx.HLE/HOS/Services/Mii/Types/RandomMiiConstants.cs b/src/Ryujinx.HLE/HOS/Services/Mii/Types/RandomMiiConstants.cs index 092733f7e..e465a80b2 100644 --- a/src/Ryujinx.HLE/HOS/Services/Mii/Types/RandomMiiConstants.cs +++ b/src/Ryujinx.HLE/HOS/Services/Mii/Types/RandomMiiConstants.cs @@ -6,17 +6,19 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types { static class RandomMiiConstants { - public static readonly int[] EyeRotateTable = { + public static readonly int[] EyeRotateTable = + [ 0x03, 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, 0x03, 0x03, 0x04, 0x03, 0x04, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x03, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x03, 0x04, 0x04, - }; + 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x03, 0x04, 0x04 + ]; - public static readonly int[] EyebrowRotateTable = { + public static readonly int[] EyebrowRotateTable = + [ 0x06, 0x06, 0x05, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x06, 0x08, 0x05, 0x05, 0x06, 0x06, - 0x07, 0x07, 0x06, 0x06, 0x05, 0x06, 0x07, 0x05, - }; + 0x07, 0x07, 0x06, 0x06, 0x05, 0x06, 0x07, 0x05 + ]; [Flags] public enum BeardAndMustacheFlag @@ -89,8 +91,8 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types #region "Random Mii Data Arrays" - private static ReadOnlySpan RandomMiiFacelineRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiFacelineRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, @@ -320,11 +322,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiFacelineColorRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiFacelineColorRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, @@ -399,11 +401,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiFacelineWrinkleRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiFacelineWrinkleRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -633,11 +635,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiFacelineMakeRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiFacelineMakeRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -867,11 +869,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiHairTypeRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiHairTypeRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, @@ -1101,11 +1103,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiHairColorRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiHairColorRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1218,11 +1220,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiEyeTypeRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiEyeTypeRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, @@ -1452,11 +1454,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x2e, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiEyeColorRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiEyeColorRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, @@ -1493,11 +1495,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiEyebrowTypeRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiEyebrowTypeRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, @@ -1727,11 +1729,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiNoseTypeRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiNoseTypeRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, @@ -1961,11 +1963,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiMouthTypeRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiMouthTypeRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, @@ -2195,11 +2197,11 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; - private static ReadOnlySpan RandomMiiGlassTypeRawArray => new byte[] - { + private static ReadOnlySpan RandomMiiGlassTypeRawArray => + [ 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2236,8 +2238,8 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ]; #endregion } } diff --git a/src/Ryujinx.HLE/HOS/Services/Mii/Types/Ver3StoreData.cs b/src/Ryujinx.HLE/HOS/Services/Mii/Types/Ver3StoreData.cs index 3930b3312..d3df58215 100644 --- a/src/Ryujinx.HLE/HOS/Services/Mii/Types/Ver3StoreData.cs +++ b/src/Ryujinx.HLE/HOS/Services/Mii/Types/Ver3StoreData.cs @@ -1,5 +1,4 @@ using Ryujinx.Common.Memory; -using Ryujinx.Common.Utilities; using System; using System.Runtime.InteropServices; diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboBinReader.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboBinReader.cs new file mode 100644 index 000000000..0e11493d5 --- /dev/null +++ b/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboBinReader.cs @@ -0,0 +1,362 @@ +using Ryujinx.Common.Configuration; +using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Services.Nfc.Nfp; +using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager; +using System; +using System.IO; + +namespace Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption +{ + public class AmiiboBinReader + { + private static byte CalculateBCC0(byte[] uid) + { + return (byte)(uid[0] ^ uid[1] ^ uid[2] ^ 0x88); + } + + private static byte CalculateBCC1(byte[] uid) + { + return (byte)(uid[3] ^ uid[4] ^ uid[5] ^ uid[6]); + } + + public static VirtualAmiiboFile ReadBinFile(byte[] fileBytes) + { + string keyRetailBinPath = GetKeyRetailBinPath(); + if (string.IsNullOrEmpty(keyRetailBinPath)) + { + return new VirtualAmiiboFile(); + } + + if (fileBytes.Length == 532) + { + int totalPages = 135; + int pageSize = 4; + int totalBytes = totalPages * pageSize; + + // add 8 bytes to the end of the file + byte[] newFileBytes = new byte[totalBytes]; + Array.Copy(fileBytes, newFileBytes, fileBytes.Length); + fileBytes = newFileBytes; + } + + AmiiboDecryptor amiiboDecryptor = new(keyRetailBinPath); + AmiiboDump amiiboDump = amiiboDecryptor.DecryptAmiiboDump(fileBytes); + + byte[] titleId = new byte[8]; + byte[] usedCharacter = new byte[2]; + byte[] variation = new byte[2]; + byte[] amiiboID = new byte[2]; + byte[] setID = new byte[1]; + byte[] initDate = new byte[2]; + byte[] writeDate = new byte[2]; + byte[] writeCounter = new byte[2]; + byte[] appId = new byte[8]; + byte[] settingsBytes = new byte[2]; + byte[] applicationAreas = new byte[216]; + byte[] dataFull = amiiboDump.GetData(); + Logger.Debug?.Print(LogClass.ServiceNfp, $"Data Full Length: {dataFull.Length}"); + byte[] uid = new byte[7]; + Array.Copy(dataFull, 0, uid, 0, 7); + + byte bcc0 = CalculateBCC0(uid); + byte bcc1 = CalculateBCC1(uid); + LogDebugData(uid, bcc0, bcc1); + for (int page = 0; page < 128; page++) // NTAG215 has 128 pages + { + int pageStartIdx = page * 4; // Each page is 4 bytes + byte[] pageData = new byte[4]; + byte[] sourceBytes = dataFull; + Array.Copy(sourceBytes, pageStartIdx, pageData, 0, 4); + // Special handling for specific pages + switch (page) + { + case 0: // Page 0 (UID + BCC0) + Logger.Debug?.Print(LogClass.ServiceNfp, "Page 0: UID and BCC0."); + break; + case 2: // Page 2 (BCC1 + Internal Value) + byte internalValue = pageData[1]; + Logger.Debug?.Print(LogClass.ServiceNfp, $"Page 2: BCC1 + Internal Value 0x{internalValue:X2} (Expected 0x48)."); + break; + case 6: + // Bytes 0 and 1 are init date, bytes 2 and 3 are write date + Array.Copy(pageData, 0, initDate, 0, 2); + Array.Copy(pageData, 2, writeDate, 0, 2); + break; + case 21: + // Bytes 0 and 1 are used character, bytes 2 and 3 are variation + Array.Copy(pageData, 0, usedCharacter, 0, 2); + Array.Copy(pageData, 2, variation, 0, 2); + break; + case 22: + // Bytes 0 and 1 are amiibo ID, byte 2 is set ID, byte 3 is form data + Array.Copy(pageData, 0, amiiboID, 0, 2); + setID[0] = pageData[2]; + break; + case 64: + case 65: + // Extract title ID + int titleIdOffset = (page - 64) * 4; + Array.Copy(pageData, 0, titleId, titleIdOffset, 4); + break; + case 66: + // Bytes 0 and 1 are write counter + Array.Copy(pageData, 0, writeCounter, 0, 2); + break; + // Pages 76 to 127 are application areas + case >= 76 and <= 127: + int appAreaOffset = (page - 76) * 4; + Array.Copy(pageData, 0, applicationAreas, appAreaOffset, 4); + break; + } + } + + string usedCharacterStr = Convert.ToHexString(usedCharacter); + string variationStr = Convert.ToHexString(variation); + string amiiboIDStr = Convert.ToHexString(amiiboID); + string setIDStr = Convert.ToHexString(setID); + string head = usedCharacterStr + variationStr; + string tail = amiiboIDStr + setIDStr + "02"; + string finalID = head + tail; + + ushort settingsValue = BitConverter.ToUInt16(settingsBytes, 0); + ushort initDateValue = BitConverter.ToUInt16(initDate, 0); + ushort writeDateValue = BitConverter.ToUInt16(writeDate, 0); + DateTime initDateTime = DateTimeFromTag(initDateValue); + DateTime writeDateTime = DateTimeFromTag(writeDateValue); + ushort writeCounterValue = BitConverter.ToUInt16(writeCounter, 0); + string nickName = amiiboDump.AmiiboNickname; + LogFinalData(titleId, appId, head, tail, finalID, nickName, initDateTime, writeDateTime, settingsValue, writeCounterValue, applicationAreas); + + VirtualAmiiboFile virtualAmiiboFile = new() + { + FileVersion = 1, + TagUuid = uid, + AmiiboId = finalID, + NickName = nickName, + FirstWriteDate = initDateTime, + LastWriteDate = writeDateTime, + WriteCounter = writeCounterValue, + }; + if (writeCounterValue > 0) + { + VirtualAmiibo.ApplicationBytes = applicationAreas; + } + + VirtualAmiibo.NickName = nickName; + return virtualAmiiboFile; + } + public static bool SaveBinFile(string inputFile, byte[] appData) + { + Logger.Info?.Print(LogClass.ServiceNfp, "Saving bin file."); + byte[] readBytes; + try + { + readBytes = File.ReadAllBytes(inputFile); + } + catch (Exception ex) + { + Logger.Error?.Print(LogClass.ServiceNfp, $"Error reading file: {ex.Message}"); + return false; + } + + string keyRetailBinPath = GetKeyRetailBinPath(); + if (string.IsNullOrEmpty(keyRetailBinPath)) + { + Logger.Error?.Print(LogClass.ServiceNfp, "Key retail path is empty."); + return false; + } + + if (appData.Length != 216) // Ensure application area size is valid + { + Logger.Error?.Print(LogClass.ServiceNfp, "Invalid application data length. Expected 216 bytes."); + return false; + } + + if (readBytes.Length == 532) + { + // add 8 bytes to the end of the file + byte[] newFileBytes = new byte[540]; + Array.Copy(readBytes, newFileBytes, readBytes.Length); + readBytes = newFileBytes; + } + + AmiiboDecryptor amiiboDecryptor = new(keyRetailBinPath); + AmiiboDump amiiboDump = amiiboDecryptor.DecryptAmiiboDump(readBytes); + + byte[] oldData = amiiboDump.GetData(); + if (oldData.Length != 540) // Verify the expected length for NTAG215 tags + { + Logger.Error?.Print(LogClass.ServiceNfp, "Invalid tag data length. Expected 540 bytes."); + return false; + } + + byte[] newData = new byte[oldData.Length]; + Array.Copy(oldData, newData, oldData.Length); + + // Replace application area with appData + int appAreaOffset = 76 * 4; // Starting page (76) times 4 bytes per page + Array.Copy(appData, 0, newData, appAreaOffset, appData.Length); + + AmiiboDump encryptedDump = amiiboDecryptor.EncryptAmiiboDump(newData); + byte[] encryptedData = encryptedDump.GetData(); + + if (encryptedData == null || encryptedData.Length != readBytes.Length) + { + Logger.Error?.Print(LogClass.ServiceNfp, "Failed to encrypt data correctly."); + return false; + } + + inputFile = inputFile.Replace("_modified", string.Empty); + // Save the encrypted data to file or return it for saving externally + string outputFilePath = Path.Combine(Path.GetDirectoryName(inputFile), Path.GetFileNameWithoutExtension(inputFile) + "_modified.bin"); + try + { + File.WriteAllBytes(outputFilePath, encryptedData); + Logger.Info?.Print(LogClass.ServiceNfp, $"Modified Amiibo data saved to {outputFilePath}."); + return true; + } + catch (Exception ex) + { + Logger.Error?.Print(LogClass.ServiceNfp, $"Error saving file: {ex.Message}"); + return false; + } + } + public static bool SaveBinFile(string inputFile, string newNickName) + { + Logger.Info?.Print(LogClass.ServiceNfp, "Saving bin file."); + byte[] readBytes; + try + { + readBytes = File.ReadAllBytes(inputFile); + } + catch (Exception ex) + { + Logger.Error?.Print(LogClass.ServiceNfp, $"Error reading file: {ex.Message}"); + return false; + } + + string keyRetailBinPath = GetKeyRetailBinPath(); + if (string.IsNullOrEmpty(keyRetailBinPath)) + { + Logger.Error?.Print(LogClass.ServiceNfp, "Key retail path is empty."); + return false; + } + + if (readBytes.Length == 532) + { + // add 8 bytes to the end of the file + byte[] newFileBytes = new byte[540]; + Array.Copy(readBytes, newFileBytes, readBytes.Length); + readBytes = newFileBytes; + } + + AmiiboDecryptor amiiboDecryptor = new(keyRetailBinPath); + AmiiboDump amiiboDump = amiiboDecryptor.DecryptAmiiboDump(readBytes); + amiiboDump.AmiiboNickname = newNickName; + byte[] oldData = amiiboDump.GetData(); + if (oldData.Length != 540) // Verify the expected length for NTAG215 tags + { + Logger.Error?.Print(LogClass.ServiceNfp, "Invalid tag data length. Expected 540 bytes."); + return false; + } + + byte[] encryptedData = amiiboDecryptor.EncryptAmiiboDump(oldData).GetData(); + + if (encryptedData == null || encryptedData.Length != readBytes.Length) + { + Logger.Error?.Print(LogClass.ServiceNfp, "Failed to encrypt data correctly."); + return false; + } + + inputFile = inputFile.Replace("_modified", string.Empty); + // Save the encrypted data to file or return it for saving externally + string outputFilePath = Path.Combine(Path.GetDirectoryName(inputFile), Path.GetFileNameWithoutExtension(inputFile) + "_modified.bin"); + try + { + File.WriteAllBytes(outputFilePath, encryptedData); + Logger.Info?.Print(LogClass.ServiceNfp, $"Modified Amiibo data saved to {outputFilePath}."); + return true; + } + catch (Exception ex) + { + Logger.Error?.Print(LogClass.ServiceNfp, $"Error saving file: {ex.Message}"); + return false; + } + } + private static void LogDebugData(byte[] uid, byte bcc0, byte bcc1) + { + Logger.Debug?.Print(LogClass.ServiceNfp, $"UID: {BitConverter.ToString(uid)}"); + Logger.Debug?.Print(LogClass.ServiceNfp, $"BCC0: 0x{bcc0:X2}, BCC1: 0x{bcc1:X2}"); + } + + private static void LogFinalData(byte[] titleId, byte[] appId, string head, string tail, string finalID, string nickName, DateTime initDateTime, DateTime writeDateTime, ushort settingsValue, ushort writeCounterValue, byte[] applicationAreas) + { + Logger.Debug?.Print(LogClass.ServiceNfp, $"Title ID: 0x{Convert.ToHexString(titleId)}"); + Logger.Debug?.Print(LogClass.ServiceNfp, $"Application Program ID: 0x{Convert.ToHexString(appId)}"); + Logger.Debug?.Print(LogClass.ServiceNfp, $"Head: {head}"); + Logger.Debug?.Print(LogClass.ServiceNfp, $"Tail: {tail}"); + Logger.Debug?.Print(LogClass.ServiceNfp, $"Final ID: {finalID}"); + Logger.Debug?.Print(LogClass.ServiceNfp, $"Nickname: {nickName}"); + Logger.Debug?.Print(LogClass.ServiceNfp, $"Init Date: {initDateTime}"); + Logger.Debug?.Print(LogClass.ServiceNfp, $"Write Date: {writeDateTime}"); + Logger.Debug?.Print(LogClass.ServiceNfp, $"Settings: 0x{settingsValue:X4}"); + Logger.Debug?.Print(LogClass.ServiceNfp, $"Write Counter: {writeCounterValue}"); + Logger.Debug?.Print(LogClass.ServiceNfp, "Length of Application Areas: " + applicationAreas.Length); + } + + private static uint CalculateCRC32(byte[] input) + { + uint[] table = new uint[256]; + uint polynomial = 0xEDB88320; + for (uint i = 0; i < table.Length; ++i) + { + uint crc = i; + for (int j = 0; j < 8; ++j) + { + if ((crc & 1) != 0) + crc = (crc >> 1) ^ polynomial; + else + crc >>= 1; + } + + table[i] = crc; + } + + uint result = 0xFFFFFFFF; + foreach (byte b in input) + { + byte index = (byte)((result & 0xFF) ^ b); + result = (result >> 8) ^ table[index]; + } + + return ~result; + } + + private static string GetKeyRetailBinPath() + { + return Path.Combine(AppDataManager.KeysDirPath, "key_retail.bin"); + } + + public static bool HasAmiiboKeyFile => File.Exists(GetKeyRetailBinPath()); + + + public static DateTime DateTimeFromTag(ushort dateTimeTag) + { + try + { + int day = dateTimeTag & 0x1F; + int month = (dateTimeTag >> 5) & 0x0F; + int year = (dateTimeTag >> 9) & 0x7F; + + if (day == 0 || month == 0 || month > 12 || day > DateTime.DaysInMonth(2000 + year, month)) + throw new ArgumentOutOfRangeException(nameof(dateTimeTag), "Invalid date in tag."); + + return new DateTime(2000 + year, month, day); + } + catch + { + return DateTime.Now; + } + } + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboDecryptor.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboDecryptor.cs new file mode 100644 index 000000000..245c37742 --- /dev/null +++ b/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboDecryptor.cs @@ -0,0 +1,43 @@ +using System.IO; + +namespace Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption +{ + public class AmiiboDecryptor + { + public AmiiboMasterKey DataKey { get; private set; } + public AmiiboMasterKey TagKey { get; private set; } + + public AmiiboDecryptor(string keyRetailBinPath) + { + byte[] combinedKeys = File.ReadAllBytes(keyRetailBinPath); + (AmiiboMasterKey DataKey, AmiiboMasterKey TagKey) keys = AmiiboMasterKey.FromCombinedBin(combinedKeys); + DataKey = keys.DataKey; + TagKey = keys.TagKey; + } + + public AmiiboDump DecryptAmiiboDump(byte[] encryptedDumpData) + { + // Initialize AmiiboDump with encrypted data + AmiiboDump amiiboDump = new(encryptedDumpData, DataKey, TagKey, isLocked: true); + + // Unlock (decrypt) the dump + amiiboDump.Unlock(); + + // Optional: Verify HMACs + amiiboDump.VerifyHMACs(); + + return amiiboDump; + } + + public AmiiboDump EncryptAmiiboDump(byte[] decryptedDumpData) + { + // Initialize AmiiboDump with decrypted data + AmiiboDump amiiboDump = new(decryptedDumpData, DataKey, TagKey, isLocked: false); + + // Lock (encrypt) the dump + amiiboDump.Lock(); + + return amiiboDump; + } + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboDump.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboDump.cs new file mode 100644 index 000000000..5f8d0faaa --- /dev/null +++ b/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboDump.cs @@ -0,0 +1,386 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; + +namespace Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption +{ + public class AmiiboDump + { + private readonly AmiiboMasterKey dataMasterKey; + private readonly AmiiboMasterKey tagMasterKey; + + private bool isLocked; + private readonly byte[] data; + private byte[] hmacTagKey; + private byte[] hmacDataKey; + private byte[] aesKey; + private byte[] aesIv; + + public AmiiboDump(byte[] dumpData, AmiiboMasterKey dataKey, AmiiboMasterKey tagKey, bool isLocked = true) + { + if (dumpData.Length < 540) + throw new ArgumentException("Incomplete dump. Amiibo data is at least 540 bytes."); + + this.data = new byte[540]; + Array.Copy(dumpData, this.data, dumpData.Length); + this.dataMasterKey = dataKey; + this.tagMasterKey = tagKey; + this.isLocked = isLocked; + + if (!isLocked) + { + DeriveKeysAndCipher(); + } + } + + private byte[] DeriveKey(AmiiboMasterKey key, bool deriveAes, out byte[] derivedAesKey, out byte[] derivedAesIv) + { + List seed = []; + + // Start with the type string (14 bytes) + seed.AddRange(key.TypeString); + + // Append data based on magic size + int append = 16 - key.MagicSize; + byte[] extract = new byte[16]; + Array.Copy(this.data, 0x011, extract, 0, 2); // Extract two bytes from user data section + for (int i = 2; i < 16; i++) + { + extract[i] = 0x00; + } + + seed.AddRange(extract.Take(append)); + + // Add the magic bytes + seed.AddRange(key.MagicBytes.Take(key.MagicSize)); + + // Extract the UID (UID is 8 bytes) + byte[] uid = new byte[8]; + Array.Copy(this.data, 0x000, uid, 0, 8); + seed.AddRange(uid); + seed.AddRange(uid); + + // Extract some tag data (pages 0x20 - 0x28) + byte[] user = new byte[32]; + Array.Copy(this.data, 0x060, user, 0, 32); + + // XOR it with the key padding (XorPad) + byte[] paddedUser = new byte[32]; + for (int i = 0; i < user.Length; i++) + { + paddedUser[i] = (byte)(user[i] ^ key.XorPad[i]); + } + + seed.AddRange(paddedUser); + + byte[] seedBytes = seed.ToArray(); + if (seedBytes.Length != 78) + { + throw new Exception("Size check for key derived seed failed"); + } + + byte[] hmacKey; + derivedAesKey = null; + derivedAesIv = null; + + if (deriveAes) + { + // Derive AES Key and IV + byte[] dataForAes = new byte[2 + seedBytes.Length]; + dataForAes[0] = 0x00; + dataForAes[1] = 0x00; // Counter (0) + Array.Copy(seedBytes, 0, dataForAes, 2, seedBytes.Length); + + byte[] derivedBytes; + using (HMACSHA256 hmac = new(key.HmacKey)) + { + derivedBytes = hmac.ComputeHash(dataForAes); + } + + derivedAesKey = derivedBytes.Take(16).ToArray(); + derivedAesIv = derivedBytes.Skip(16).Take(16).ToArray(); + + // Derive HMAC Key + byte[] dataForHmacKey = new byte[2 + seedBytes.Length]; + dataForHmacKey[0] = 0x00; + dataForHmacKey[1] = 0x01; // Counter (1) + Array.Copy(seedBytes, 0, dataForHmacKey, 2, seedBytes.Length); + + using (HMACSHA256 hmac = new(key.HmacKey)) + { + derivedBytes = hmac.ComputeHash(dataForHmacKey); + } + + hmacKey = derivedBytes.Take(16).ToArray(); + } + else + { + // Derive HMAC Key only + byte[] dataForHmacKey = new byte[2 + seedBytes.Length]; + dataForHmacKey[0] = 0x00; + dataForHmacKey[1] = 0x01; // Counter (1) + Array.Copy(seedBytes, 0, dataForHmacKey, 2, seedBytes.Length); + + byte[] derivedBytes; + using (HMACSHA256 hmac = new(key.HmacKey)) + { + derivedBytes = hmac.ComputeHash(dataForHmacKey); + } + + hmacKey = derivedBytes.Take(16).ToArray(); + } + + return hmacKey; + } + + private void DeriveKeysAndCipher() + { + // Derive HMAC Tag Key + this.hmacTagKey = DeriveKey(this.tagMasterKey, false, out _, out _); + + // Derive HMAC Data Key and AES Key/IV + this.hmacDataKey = DeriveKey(this.dataMasterKey, true, out aesKey, out aesIv); + } + + private void DecryptData() + { + byte[] encryptedBlock = new byte[0x020 + 0x168]; + Array.Copy(data, 0x014, encryptedBlock, 0, 0x020); // data[0x014:0x034] + Array.Copy(data, 0x0A0, encryptedBlock, 0x020, 0x168); // data[0x0A0:0x208] + + byte[] decryptedBlock = AES_CTR_Transform(encryptedBlock, aesKey, aesIv); + + // Copy decrypted data back + Array.Copy(decryptedBlock, 0, data, 0x014, 0x020); + Array.Copy(decryptedBlock, 0x020, data, 0x0A0, 0x168); + } + + private void EncryptData() + { + byte[] plainBlock = new byte[0x020 + 0x168]; + Array.Copy(data, 0x014, plainBlock, 0, 0x020); // data[0x014:0x034] + Array.Copy(data, 0x0A0, plainBlock, 0x020, 0x168); // data[0x0A0:0x208] + + byte[] encryptedBlock = AES_CTR_Transform(plainBlock, aesKey, aesIv); + + // Copy encrypted data back + Array.Copy(encryptedBlock, 0, data, 0x014, 0x020); + Array.Copy(encryptedBlock, 0x020, data, 0x0A0, 0x168); + } + + private byte[] AES_CTR_Transform(byte[] data, byte[] key, byte[] iv) + { + byte[] output = new byte[data.Length]; + + using (Aes aes = Aes.Create()) + { + aes.Key = key; + aes.Mode = CipherMode.ECB; + aes.Padding = PaddingMode.None; + + int blockSize = aes.BlockSize / 8; // in bytes, should be 16 + byte[] counter = new byte[blockSize]; + Array.Copy(iv, counter, blockSize); + + using ICryptoTransform encryptor = aes.CreateEncryptor(); + byte[] encryptedCounter = new byte[blockSize]; + + for (int i = 0; i < data.Length; i += blockSize) + { + // Encrypt the counter + encryptor.TransformBlock(counter, 0, blockSize, encryptedCounter, 0); + + // Determine the number of bytes to process in this block + int blockLength = Math.Min(blockSize, data.Length - i); + + // XOR the encrypted counter with the plaintext/ciphertext block + for (int j = 0; j < blockLength; j++) + { + output[i + j] = (byte)(data[i + j] ^ encryptedCounter[j]); + } + + // Increment the counter + IncrementCounter(counter); + } + } + + return output; + } + + private void IncrementCounter(byte[] counter) + { + for (int i = counter.Length - 1; i >= 0; i--) + { + if (++counter[i] != 0) + break; + } + } + + private void DeriveHMACs() + { + if (isLocked) + throw new InvalidOperationException("Cannot derive HMACs when data is locked."); + + // Calculate tag HMAC + byte[] tagHmacData = new byte[8 + 44]; + Array.Copy(data, 0x000, tagHmacData, 0, 8); + Array.Copy(data, 0x054, tagHmacData, 8, 44); + + byte[] tagHmac; + using (HMACSHA256 hmac = new(hmacTagKey)) + { + tagHmac = hmac.ComputeHash(tagHmacData); + } + + // Overwrite the stored tag HMAC + Array.Copy(tagHmac, 0, data, 0x034, 32); + + // Prepare data for data HMAC + int len1 = 0x023; // 0x011 to 0x034 (0x034 - 0x011) + int len2 = 0x168; // 0x0A0 to 0x208 (0x208 - 0x0A0) + int len3 = tagHmac.Length; // 32 bytes + int len4 = 0x008; // 0x000 to 0x008 (0x008 - 0x000) + int len5 = 0x02C; // 0x054 to 0x080 (0x080 - 0x054) + int totalLength = len1 + len2 + len3 + len4 + len5; + byte[] dataHmacData = new byte[totalLength]; + + int offset = 0; + Array.Copy(data, 0x011, dataHmacData, offset, len1); + offset += len1; + Array.Copy(data, 0x0A0, dataHmacData, offset, len2); + offset += len2; + Array.Copy(tagHmac, 0, dataHmacData, offset, len3); + offset += len3; + Array.Copy(data, 0x000, dataHmacData, offset, len4); + offset += len4; + Array.Copy(data, 0x054, dataHmacData, offset, len5); + + byte[] dataHmac; + using (HMACSHA256 hmac = new(hmacDataKey)) + { + dataHmac = hmac.ComputeHash(dataHmacData); + } + + // Overwrite the stored data HMAC + Array.Copy(dataHmac, 0, data, 0x080, 32); + } + + public void VerifyHMACs() + { + if (isLocked) + throw new InvalidOperationException("Cannot verify HMACs when data is locked."); + + // Calculate tag HMAC + byte[] tagHmacData = new byte[8 + 44]; + Array.Copy(data, 0x000, tagHmacData, 0, 8); + Array.Copy(data, 0x054, tagHmacData, 8, 44); + + byte[] calculatedTagHmac; + using (HMACSHA256 hmac = new(hmacTagKey)) + { + calculatedTagHmac = hmac.ComputeHash(tagHmacData); + } + + byte[] storedTagHmac = new byte[32]; + Array.Copy(data, 0x034, storedTagHmac, 0, 32); + + if (!calculatedTagHmac.SequenceEqual(storedTagHmac)) + { + throw new Exception("Tag HMAC verification failed."); + } + + // Prepare data for data HMAC + int len1 = 0x023; // 0x011 to 0x034 + int len2 = 0x168; // 0x0A0 to 0x208 + int len3 = calculatedTagHmac.Length; // 32 bytes + int len4 = 0x008; // 0x000 to 0x008 + int len5 = 0x02C; // 0x054 to 0x080 + int totalLength = len1 + len2 + len3 + len4 + len5; + byte[] dataHmacData = new byte[totalLength]; + + int offset = 0; + Array.Copy(data, 0x011, dataHmacData, offset, len1); + offset += len1; + Array.Copy(data, 0x0A0, dataHmacData, offset, len2); + offset += len2; + Array.Copy(calculatedTagHmac, 0, dataHmacData, offset, len3); + offset += len3; + Array.Copy(data, 0x000, dataHmacData, offset, len4); + offset += len4; + Array.Copy(data, 0x054, dataHmacData, offset, len5); + + byte[] calculatedDataHmac; + using (HMACSHA256 hmac = new(hmacDataKey)) + { + calculatedDataHmac = hmac.ComputeHash(dataHmacData); + } + + byte[] storedDataHmac = new byte[32]; + Array.Copy(data, 0x080, storedDataHmac, 0, 32); + + if (!calculatedDataHmac.SequenceEqual(storedDataHmac)) + { + throw new Exception("Data HMAC verification failed."); + } + } + + public void Unlock() + { + if (!isLocked) + throw new InvalidOperationException("Data is already unlocked."); + + // Derive keys and cipher + DeriveKeysAndCipher(); + + // Decrypt the encrypted data + DecryptData(); + + isLocked = false; + } + + public void Lock() + { + if (isLocked) + throw new InvalidOperationException("Data is already locked."); + + // Recalculate HMACs + DeriveHMACs(); + + // Encrypt the data + EncryptData(); + + isLocked = true; + } + + public byte[] GetData() + { + return data; + } + + // Property to get or set Amiibo nickname + public string AmiiboNickname + { + get + { + // data[0x020:0x034], big endian UTF-16 + byte[] nicknameBytes = new byte[0x014]; + Array.Copy(data, 0x020, nicknameBytes, 0, 0x014); + string nickname = System.Text.Encoding.BigEndianUnicode.GetString(nicknameBytes).TrimEnd('\0'); + return nickname; + } + set + { + byte[] nicknameBytes = System.Text.Encoding.BigEndianUnicode.GetBytes(value.PadRight(10, '\0')); + if (nicknameBytes.Length > 20) + throw new ArgumentException("Nickname too long."); + Array.Copy(nicknameBytes, 0, data, 0x020, nicknameBytes.Length); + // Pad remaining bytes with zeros + for (int i = 0x020 + nicknameBytes.Length; i < 0x034; i++) + { + data[i] = 0x00; + } + } + } + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboMasterKey.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboMasterKey.cs new file mode 100644 index 000000000..940dc4c85 --- /dev/null +++ b/src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboMasterKey.cs @@ -0,0 +1,39 @@ +using System; +using System.Linq; + +namespace Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption +{ + public class AmiiboMasterKey + { + public byte[] HmacKey { get; private set; } // 16 bytes + public byte[] TypeString { get; private set; } // 14 bytes + public byte Rfu { get; private set; } // 1 byte + public byte MagicSize { get; private set; } // 1 byte + public byte[] MagicBytes { get; private set; } // 16 bytes + public byte[] XorPad { get; private set; } // 32 bytes + + public AmiiboMasterKey(byte[] data) + { + if (data.Length != 80) + throw new ArgumentException("Master key data must be 80 bytes."); + + HmacKey = data.Take(16).ToArray(); + TypeString = data.Skip(16).Take(14).ToArray(); + Rfu = data[30]; + MagicSize = data[31]; + MagicBytes = data.Skip(32).Take(16).ToArray(); + XorPad = data.Skip(48).Take(32).ToArray(); + } + + public static (AmiiboMasterKey DataKey, AmiiboMasterKey TagKey) FromCombinedBin(byte[] combinedBin) + { + if (combinedBin.Length != 160) + throw new ArgumentException($"Data is {combinedBin.Length} bytes (should be 160)."); + + byte[] dataBin = combinedBin.Take(80).ToArray(); + byte[] tagBin = combinedBin.Skip(80).Take(80).ToArray(); + + return (new AmiiboMasterKey(dataBin), new AmiiboMasterKey(tagBin)); + } + } +} diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs index 20f67a4ef..ca833e33d 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs @@ -78,7 +78,6 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp if (_state == State.Initialized) { _cancelTokenSource?.Cancel(); - // NOTE: All events are destroyed here. context.Device.System.NfpDevices.Clear(); @@ -148,7 +147,6 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp } _cancelTokenSource = new CancellationTokenSource(); - Task.Run(() => { while (true) @@ -229,7 +227,6 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp } // TODO: Found how the MountTarget is handled. - for (int i = 0; i < context.Device.System.NfpDevices.Count; i++) { if (context.Device.System.NfpDevices[i].Handle == (PlayerIndex)deviceHandle) @@ -488,14 +485,12 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp #pragma warning disable IDE0059 // Remove unnecessary value assignment uint deviceHandle = (uint)context.RequestData.ReadUInt64(); #pragma warning restore IDE0059 - if (context.Device.System.NfpDevices.Count == 0) { return ResultCode.DeviceNotFound; } // NOTE: Since we handle amiibo through VirtualAmiibo, we don't have to flush anything in our case. - return ResultCode.Success; } @@ -608,7 +603,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp } else { - if (context.Device.System.NfpDevices[i].State == NfpDeviceState.TagMounted || context.Device.System.NfpDevices[i].State == NfpDeviceState.TagFound) + if (context.Device.System.NfpDevices[i].State is NfpDeviceState.TagMounted or NfpDeviceState.TagFound) { byte[] uuid = VirtualAmiibo.GenerateUuid(context.Device.System.NfpDevices[i].AmiiboId, context.Device.System.NfpDevices[i].UseRandomUuid); @@ -980,7 +975,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp { // TODO: Find the differencies between IUser and ISystem/IDebug. - if (_permissionLevel == NfpPermissionLevel.Debug || _permissionLevel == NfpPermissionLevel.System) + if (_permissionLevel is NfpPermissionLevel.Debug or NfpPermissionLevel.System) { return GetRegisterInfo(context); } diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/VirtualAmiiboFile.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/VirtualAmiiboFile.cs index e1db98e5f..9450e1db5 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/VirtualAmiiboFile.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/Types/VirtualAmiiboFile.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager { - struct VirtualAmiiboFile + public struct VirtualAmiiboFile { public uint FileVersion { get; set; } public byte[] TagUuid { get; set; } @@ -15,7 +15,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager public List ApplicationAreas { get; set; } } - struct VirtualAmiiboApplicationArea + public struct VirtualAmiiboApplicationArea { public uint ApplicationAreaId { get; set; } public byte[] ApplicationArea { get; set; } diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs index 0c685471c..63e7eb211 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs @@ -4,19 +4,21 @@ using Ryujinx.Common.Utilities; using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Services.Mii; using Ryujinx.HLE.HOS.Services.Mii.Types; +using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager; using System; -using System.Collections.Generic; using System.IO; +using System.Linq; namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp { static class VirtualAmiibo { - private static uint _openedApplicationAreaId; - + public static uint OpenedApplicationAreaId; + public static byte[] ApplicationBytes = []; + public static string InputBin = string.Empty; + public static string NickName = string.Empty; private static readonly AmiiboJsonSerializerContext _serializerContext = AmiiboJsonSerializerContext.Default; - public static byte[] GenerateUuid(string amiiboId, bool useRandomUuid) { if (useRandomUuid) @@ -68,6 +70,12 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp { VirtualAmiiboFile amiiboFile = LoadAmiiboFile(amiiboId); string nickname = amiiboFile.NickName ?? "Ryujinx"; + if (NickName != string.Empty) + { + nickname = NickName; + NickName = string.Empty; + } + UtilityImpl utilityImpl = new(tickSource); CharInfo charInfo = new(); @@ -97,16 +105,27 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp { VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId); virtualAmiiboFile.NickName = newNickName; + if (InputBin != string.Empty) + { + AmiiboBinReader.SaveBinFile(InputBin, virtualAmiiboFile.NickName); + return; + } + SaveAmiiboFile(virtualAmiiboFile); } public static bool OpenApplicationArea(string amiiboId, uint applicationAreaId) { VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId); - - if (virtualAmiiboFile.ApplicationAreas.Exists(item => item.ApplicationAreaId == applicationAreaId)) + if (ApplicationBytes.Length > 0) { - _openedApplicationAreaId = applicationAreaId; + OpenedApplicationAreaId = applicationAreaId; + return true; + } + + if (virtualAmiiboFile.ApplicationAreas.Any(item => item.ApplicationAreaId == applicationAreaId)) + { + OpenedApplicationAreaId = applicationAreaId; return true; } @@ -116,24 +135,31 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp public static byte[] GetApplicationArea(string amiiboId) { + if (ApplicationBytes.Length > 0) + { + byte[] bytes = ApplicationBytes; + ApplicationBytes = []; + return bytes; + } + VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId); foreach (VirtualAmiiboApplicationArea applicationArea in virtualAmiiboFile.ApplicationAreas) { - if (applicationArea.ApplicationAreaId == _openedApplicationAreaId) + if (applicationArea.ApplicationAreaId == OpenedApplicationAreaId) { return applicationArea.ApplicationArea; } } - return Array.Empty(); + return []; } public static bool CreateApplicationArea(string amiiboId, uint applicationAreaId, byte[] applicationAreaData) { VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId); - if (virtualAmiiboFile.ApplicationAreas.Exists(item => item.ApplicationAreaId == applicationAreaId)) + if (virtualAmiiboFile.ApplicationAreas.Any(item => item.ApplicationAreaId == applicationAreaId)) { return false; } @@ -151,17 +177,23 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp public static void SetApplicationArea(string amiiboId, byte[] applicationAreaData) { + if (InputBin != string.Empty) + { + AmiiboBinReader.SaveBinFile(InputBin, applicationAreaData); + return; + } + VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId); - if (virtualAmiiboFile.ApplicationAreas.Exists(item => item.ApplicationAreaId == _openedApplicationAreaId)) + if (virtualAmiiboFile.ApplicationAreas.Any(item => item.ApplicationAreaId == OpenedApplicationAreaId)) { for (int i = 0; i < virtualAmiiboFile.ApplicationAreas.Count; i++) { - if (virtualAmiiboFile.ApplicationAreas[i].ApplicationAreaId == _openedApplicationAreaId) + if (virtualAmiiboFile.ApplicationAreas[i].ApplicationAreaId == OpenedApplicationAreaId) { virtualAmiiboFile.ApplicationAreas[i] = new VirtualAmiiboApplicationArea() { - ApplicationAreaId = _openedApplicationAreaId, + ApplicationAreaId = OpenedApplicationAreaId, ApplicationArea = applicationAreaData, }; @@ -190,12 +222,12 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp virtualAmiiboFile = new VirtualAmiiboFile() { FileVersion = 0, - TagUuid = Array.Empty(), + TagUuid = [], AmiiboId = amiiboId, FirstWriteDate = DateTime.Now, LastWriteDate = DateTime.Now, WriteCounter = 0, - ApplicationAreas = new List(), + ApplicationAreas = [], }; SaveAmiiboFile(virtualAmiiboFile); @@ -204,10 +236,22 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp return virtualAmiiboFile; } - private static void SaveAmiiboFile(VirtualAmiiboFile virtualAmiiboFile) + public static void SaveAmiiboFile(VirtualAmiiboFile virtualAmiiboFile) { string filePath = Path.Join(AppDataManager.BaseDirPath, "system", "amiibo", $"{virtualAmiiboFile.AmiiboId}.json"); JsonHelper.SerializeToFile(filePath, virtualAmiiboFile, _serializerContext.VirtualAmiiboFile); } + + public static bool SaveFileExists(VirtualAmiiboFile virtualAmiiboFile) + { + if (InputBin != string.Empty) + { + SaveAmiiboFile(virtualAmiiboFile); + return true; + + } + + return File.Exists(Path.Join(AppDataManager.BaseDirPath, "system", "amiibo", $"{virtualAmiiboFile.AmiiboId}.json")); + } } } diff --git a/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs b/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs index 96e71cd07..d669caba1 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs @@ -13,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm // CreateGeneralServiceOld() -> object public ResultCode CreateGeneralServiceOld(ServiceCtx context) { - MakeObject(context, new IGeneralService()); + MakeObject(context, new IGeneralService(context)); return ResultCode.Success; } @@ -22,7 +22,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm // CreateGeneralService(u64, pid) -> object public ResultCode CreateGeneralService(ServiceCtx context) { - MakeObject(context, new IGeneralService()); + MakeObject(context, new IGeneralService(context)); return ResultCode.Success; } diff --git a/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/GeneralServiceManager.cs b/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/GeneralServiceManager.cs index 16eefc87d..5ad241e0f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/GeneralServiceManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/GeneralService/GeneralServiceManager.cs @@ -5,7 +5,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService { static class GeneralServiceManager { - private static readonly List _generalServices = new(); + private static readonly List _generalServices = []; public static int Count { diff --git a/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs b/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs index a5a822db3..dd4efce6e 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs @@ -1,4 +1,5 @@ using Ryujinx.Common; +using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService; @@ -17,12 +18,12 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService private UnicastIPAddressInformation _targetAddressInfoCache = null; private string _cacheChosenInterface = null; - public IGeneralService() + public IGeneralService(ServiceCtx context) { _generalServiceDetail = new GeneralServiceDetail { ClientId = GeneralServiceManager.Count, - IsAnyInternetRequestAccepted = true, // NOTE: Why not accept any internet request? + IsAnyInternetRequestAccepted = !context.Device.DirtyHacks.IsEnabled(DirtyHack.NifmServiceDisableIsAnyInternetRequestAccepted), // NOTE: Why not accept any internet request? }; NetworkChange.NetworkAddressChanged += LocalInterfaceCacheHandler; diff --git a/src/Ryujinx.HLE/HOS/Services/Ns/Aoc/IAddOnContentManager.cs b/src/Ryujinx.HLE/HOS/Services/Ns/Aoc/IAddOnContentManager.cs index 083a83214..c77358803 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ns/Aoc/IAddOnContentManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ns/Aoc/IAddOnContentManager.cs @@ -15,7 +15,7 @@ namespace Ryujinx.HLE.HOS.Services.Ns.Aoc private ulong _addOnContentBaseId; - private readonly List _mountedAocTitleIds = new(); + private readonly List _mountedAocTitleIds = []; public IAddOnContentManager(ServiceCtx context) { diff --git a/src/Ryujinx.HLE/HOS/Services/Nv/Host1xContext.cs b/src/Ryujinx.HLE/HOS/Services/Nv/Host1xContext.cs index 7c7ebf22d..b8495f643 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nv/Host1xContext.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nv/Host1xContext.cs @@ -18,8 +18,8 @@ namespace Ryujinx.HLE.HOS.Services.Nv MemoryAllocator = new NvMemoryAllocator(); Host1x = new Host1xDevice(gpu.Synchronization); Smmu = gpu.CreateDeviceMemoryManager(pid); - var nvdec = new NvdecDevice(Smmu); - var vic = new VicDevice(Smmu); + NvdecDevice nvdec = new(Smmu); + VicDevice vic = new(Smmu); Host1x.RegisterDevice(ClassId.Nvdec, nvdec); Host1x.RegisterDevice(ClassId.Vic, vic); } diff --git a/src/Ryujinx.HLE/HOS/Services/Nv/INvDrvServices.cs b/src/Ryujinx.HLE/HOS/Services/Nv/INvDrvServices.cs index a0df66d00..fea09ef47 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nv/INvDrvServices.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nv/INvDrvServices.cs @@ -25,11 +25,11 @@ namespace Ryujinx.HLE.HOS.Services.Nv [Service("nvdrv:t")] class INvDrvServices : IpcService { - private static readonly List _deviceFileDebugRegistry = new() - { + private static readonly List _deviceFileDebugRegistry = + [ "/dev/nvhost-dbg-gpu", - "/dev/nvhost-prof-gpu", - }; + "/dev/nvhost-prof-gpu" + ]; private static readonly Dictionary _deviceFileRegistry = new() { @@ -73,9 +73,10 @@ namespace Ryujinx.HLE.HOS.Services.Nv if (_deviceFileRegistry.TryGetValue(path, out Type deviceFileClass)) { - ConstructorInfo constructor = deviceFileClass.GetConstructor(new[] { typeof(ServiceCtx), typeof(IVirtualMemoryManager), typeof(ulong) }); + ConstructorInfo constructor = deviceFileClass.GetConstructor([typeof(ServiceCtx), typeof(IVirtualMemoryManager), typeof(ulong) + ]); - NvDeviceFile deviceFile = (NvDeviceFile)constructor.Invoke(new object[] { context, _clientMemory, _owner }); + NvDeviceFile deviceFile = (NvDeviceFile)constructor.Invoke([context, _clientMemory, _owner]); deviceFile.Path = path; diff --git a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/NvHostAsGpuDeviceFile.cs b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/NvHostAsGpuDeviceFile.cs index 0f5d7547c..9d0104a01 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/NvHostAsGpuDeviceFile.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/NvHostAsGpuDeviceFile.cs @@ -15,7 +15,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu private const uint SmallPageSize = 0x1000; private const uint BigPageSize = 0x10000; - private static readonly uint[] _pageSizes = { SmallPageSize, BigPageSize }; + private static readonly uint[] _pageSizes = [SmallPageSize, BigPageSize]; private const ulong SmallRegionLimit = 0x400000000UL; // 16 GiB private const ulong DefaultUserSize = 1UL << 37; @@ -32,10 +32,11 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu } } - private static readonly VmRegion[] _vmRegions = { - new VmRegion((ulong)BigPageSize << 16, SmallRegionLimit), - new VmRegion(SmallRegionLimit, DefaultUserSize), - }; + private static readonly VmRegion[] _vmRegions = + [ + new((ulong)BigPageSize << 16, SmallRegionLimit), + new(SmallRegionLimit, DefaultUserSize) + ]; private readonly AddressSpaceContext _asContext; private readonly NvMemoryAllocator _memoryAllocator; @@ -104,7 +105,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu private NvInternalResult BindChannel(ref BindChannelArguments arguments) { - var channelDeviceFile = INvDrvServices.DeviceFileIdRegistry.GetData(arguments.Fd); + NvHostChannelDeviceFile channelDeviceFile = INvDrvServices.DeviceFileIdRegistry.GetData(arguments.Fd); if (channelDeviceFile == null) { // TODO: Return invalid Fd error. @@ -336,9 +337,9 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu for (uint i = 0; i < writeEntries; i++) { - ref var region = ref arguments.Regions[(int)i]; + ref VaRegion region = ref arguments.Regions[(int)i]; - var vmRegion = _vmRegions[i]; + VmRegion vmRegion = _vmRegions[i]; uint pageSize = _pageSizes[i]; region.PageSize = pageSize; diff --git a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostChannelDeviceFile.cs b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostChannelDeviceFile.cs index bc70b05cf..a114bd3e0 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostChannelDeviceFile.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostChannelDeviceFile.cs @@ -169,7 +169,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel { NvMapHandle map = NvMapDeviceFile.GetMapFromHandle(Owner, commandBuffer.Mem); - var data = _memory.GetSpan(map.Address + commandBuffer.Offset, commandBuffer.WordsCount * 4); + ReadOnlySpan data = _memory.GetSpan(map.Address + commandBuffer.Offset, commandBuffer.WordsCount * 4); _host1xContext.Host1x.Submit(MemoryMarshal.Cast(data), _contextId); } @@ -400,7 +400,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel private NvInternalResult SetTimeslice(ref uint timeslice) { - if (timeslice < 1000 || timeslice > 50000) + if (timeslice is < 1000 or > 50000) { return NvInternalResult.InvalidInput; } @@ -562,7 +562,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel private static Host1xContext GetHost1XContext(GpuContext gpu, ulong pid) { - return _host1xContextRegistry.GetOrAdd(pid, (ulong key) => new Host1xContext(gpu, key)); + return _host1xContextRegistry.GetOrAdd(pid, key => new Host1xContext(gpu, key)); } public static void Destroy() diff --git a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/NvHostCtrlDeviceFile.cs b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/NvHostCtrlDeviceFile.cs index 471bca73c..6c5dd312f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/NvHostCtrlDeviceFile.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/NvHostCtrlDeviceFile.cs @@ -66,6 +66,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl { configArgument.CopyTo(arguments); } + break; case 0x1c: result = CallIoctlMethod(EventSignal, arguments); @@ -224,7 +225,6 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl return result; } - } private NvInternalResult EventUnregister(ref uint userEventId) @@ -243,9 +243,9 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl return NvInternalResult.Success; } - if (hostEvent.State == NvHostEventState.Available || - hostEvent.State == NvHostEventState.Cancelled || - hostEvent.State == NvHostEventState.Signaled) + if (hostEvent.State is NvHostEventState.Available or + NvHostEventState.Cancelled or + NvHostEventState.Signaled) { _events[userEventId].CloseEvent(Context); _events[userEventId] = null; @@ -392,9 +392,9 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl { lock (hostEvent.Lock) { - if (hostEvent.State == NvHostEventState.Available || - hostEvent.State == NvHostEventState.Signaled || - hostEvent.State == NvHostEventState.Cancelled) + if (hostEvent.State is NvHostEventState.Available or + NvHostEventState.Signaled or + NvHostEventState.Cancelled) { bool timedOut = hostEvent.Wait(_device.Gpu, fence); @@ -456,9 +456,9 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl if (Event != null) { - if (Event.State == NvHostEventState.Available || - Event.State == NvHostEventState.Signaled || - Event.State == NvHostEventState.Cancelled) + if (Event.State is NvHostEventState.Available or + NvHostEventState.Signaled or + NvHostEventState.Cancelled) { eventIndex = index; diff --git a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs index 8f851f37a..48622a224 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs @@ -26,7 +26,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl private NvFence _previousFailingFence; private uint _failingCount; - public readonly object Lock = new(); + public readonly Lock Lock = new(); /// /// Max failing count until waiting on CPU. diff --git a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs index b83c642e5..49637f757 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs @@ -17,7 +17,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl private readonly Switch _device; - private readonly object _syncpointAllocatorLock = new(); + private readonly Lock _syncpointAllocatorLock = new(); public NvHostSyncpt(Switch device) { diff --git a/src/Ryujinx.HLE/HOS/Services/Nv/NvMemoryAllocator.cs b/src/Ryujinx.HLE/HOS/Services/Nv/NvMemoryAllocator.cs index 4e8193302..a5b218b3f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nv/NvMemoryAllocator.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nv/NvMemoryAllocator.cs @@ -23,7 +23,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv private readonly TreeDictionary _tree = new(); private readonly Dictionary> _dictionary = new(); - private readonly LinkedList _list = new(); + private readonly LinkedList _list = []; public NvMemoryAllocator() { @@ -124,6 +124,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv { targetPrevAddress = InvalidAddress; } + node = node.Previous; _tree.Remove(prevAddress); _list.Remove(_dictionary[prevAddress]); @@ -151,6 +152,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv { targetNextAddress = InvalidAddress; } + _tree.Remove(nextAddress); _list.Remove(_dictionary[nextAddress]); _dictionary.Remove(nextAddress); @@ -212,6 +214,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv Logger.Debug?.Print(LogClass.ServiceNv, $"Target address was invalid, set to ceiling of 0x{address:X}; resulted in 0x{targetAddress:X}"); } } + while (address < AddressSpaceSize) { if (targetAddress != InvalidAddress) @@ -278,6 +281,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv } } } + Logger.Debug?.Print(LogClass.ServiceNv, $"No suitable address range found; returning: 0x{InvalidAddress:X}."); freeAddressStartPosition = InvalidAddress; } @@ -303,6 +307,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv return !(gpuVa >= floorAddress && ((gpuVa + size) <= _tree.Get(floorAddress))); } } + return true; } #endregion diff --git a/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs b/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs index 9b026a1c3..c36482e41 100644 --- a/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Pctl/ParentalControlServiceFactory/IParentalControlService.cs @@ -55,7 +55,13 @@ namespace Ryujinx.HLE.HOS.Services.Pctl.ParentalControlServiceFactory _titleId = titleId; // TODO: Call nn::arp::GetApplicationControlProperty here when implemented, if it return ResultCode.Success we assign fields. - _ratingAge = Array.ConvertAll(context.Device.Processes.ActiveApplication.ApplicationControlProperties.RatingAge.ItemsRo.ToArray(), Convert.ToInt32); + _ratingAge = new int[context.Device.Processes.ActiveApplication.ApplicationControlProperties.RatingAge.Length]; + + for (int i = 0; i < _ratingAge.Length; i++) + { + _ratingAge[i] = Convert.ToInt32(context.Device.Processes.ActiveApplication.ApplicationControlProperties.RatingAge[i]); + } + _parentalControlFlag = context.Device.Processes.ActiveApplication.ApplicationControlProperties.ParentalControlFlag; } } @@ -174,7 +180,6 @@ namespace Ryujinx.HLE.HOS.Services.Pctl.ParentalControlServiceFactory #pragma warning disable // Remove unnecessary value assignment bool stereoVisionRestriction = false; -#pragma warning restore IDE0059 if (_stereoVisionRestrictionConfigurable) { diff --git a/src/Ryujinx.HLE/HOS/Services/Pcv/Clkrst/ClkrstManager/IClkrstSession.cs b/src/Ryujinx.HLE/HOS/Services/Pcv/Clkrst/ClkrstManager/IClkrstSession.cs index ddc4e5c7d..5d90fcbe2 100644 --- a/src/Ryujinx.HLE/HOS/Services/Pcv/Clkrst/ClkrstManager/IClkrstSession.cs +++ b/src/Ryujinx.HLE/HOS/Services/Pcv/Clkrst/ClkrstManager/IClkrstSession.cs @@ -12,15 +12,16 @@ namespace Ryujinx.HLE.HOS.Services.Pcv.Clkrst.ClkrstManager #pragma warning restore IDE0052 private uint _clockRate; - private readonly DeviceCode[] _allowedDeviceCodeTable = { + private readonly DeviceCode[] _allowedDeviceCodeTable = + [ DeviceCode.Cpu, DeviceCode.Gpu, DeviceCode.Disp1, DeviceCode.Disp2, DeviceCode.Tsec, DeviceCode.Mselect, DeviceCode.Sor1, DeviceCode.Host1x, DeviceCode.Vic, DeviceCode.Nvenc, DeviceCode.Nvjpg, DeviceCode.Nvdec, DeviceCode.Ape, DeviceCode.AudioDsp, DeviceCode.Emc, DeviceCode.Dsi, DeviceCode.SysBus, DeviceCode.XusbSs, DeviceCode.XusbHost, DeviceCode.XusbDevice, DeviceCode.Gpuaux, DeviceCode.Pcie, DeviceCode.Apbdma, DeviceCode.Sdmmc1, - DeviceCode.Sdmmc2, DeviceCode.Sdmmc4, - }; + DeviceCode.Sdmmc2, DeviceCode.Sdmmc4 + ]; public IClkrstSession(DeviceCode deviceCode, uint unknown) { diff --git a/src/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs b/src/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs index 5b5b3bf84..873782d87 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs @@ -64,7 +64,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro return ResultCode.InvalidSize; } - List hashes = new(); + List hashes = []; for (int i = 0; i < header.HashesCount; i++) { @@ -259,6 +259,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro return baseAddress + size + GuardPagesSize <= memInfo.Address + memInfo.Size; } } + return false; } @@ -313,7 +314,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro return ResultCode.Success; } - private Result SetNroMemoryPermissions(KProcess process, IExecutable relocatableObject, ulong baseAddress) + private Result SetNroMemoryPermissions(KProcess process, NroExecutable relocatableObject, ulong baseAddress) { ulong textStart = baseAddress + relocatableObject.TextOffset; ulong roStart = baseAddress + relocatableObject.RoOffset; diff --git a/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs b/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs index 56d389cd2..b34ff0476 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sdb/Pdm/QueryService/QueryPlayStatisticsManager.cs @@ -33,7 +33,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService PlayLogQueryCapability queryCapability = (PlayLogQueryCapability)context.Device.Processes.ActiveApplication.ApplicationControlProperties.PlayLogQueryCapability; - List titleIds = new(); + List titleIds = []; for (ulong i = 0; i < inputSize / sizeof(ulong); i++) { @@ -45,7 +45,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService // Check if input title ids are in the whitelist. foreach (ulong titleId in titleIds) { - if (!context.Device.Processes.ActiveApplication.ApplicationControlProperties.PlayLogQueryableApplicationId.ItemsRo.Contains(titleId)) + if (!context.Device.Processes.ActiveApplication.ApplicationControlProperties.PlayLogQueryableApplicationId.AsReadOnlySpan().Contains(titleId)) { return (ResultCode)Am.ResultCode.ObjectInvalid; } @@ -55,7 +55,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize); // Return ResultCode.ServiceUnavailable if data is locked by another process. - var filteredApplicationPlayStatistics = _applicationPlayStatistics.AsEnumerable(); + IEnumerable> filteredApplicationPlayStatistics = _applicationPlayStatistics.AsEnumerable(); if (queryCapability == PlayLogQueryCapability.None) { diff --git a/src/Ryujinx.HLE/HOS/Services/Sdb/Pl/SharedFontManager.cs b/src/Ryujinx.HLE/HOS/Services/Sdb/Pl/SharedFontManager.cs index ea3bd84df..f5d3f161d 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sdb/Pl/SharedFontManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sdb/Pl/SharedFontManager.cs @@ -5,6 +5,7 @@ using LibHac.FsSystem; using LibHac.Ncm; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; +using Microsoft.IO; using Ryujinx.Common.Memory; using Ryujinx.HLE.Exceptions; using Ryujinx.HLE.FileSystem; @@ -76,7 +77,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl Nca nca = new(_device.System.KeySet, ncaFileStream); IFileSystem romfs = nca.OpenFileSystem(NcaSectionType.Data, _device.System.FsIntegrityCheckLevel); - using var fontFile = new UniqueRef(); + using UniqueRef fontFile = new(); romfs.OpenFile(ref fontFile.Ref, ("/" + fontFilename).ToU8Span(), OpenMode.Read).ThrowIfFailure(); @@ -105,7 +106,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl titleName = "Unknown"; } - throw new InvalidSystemResourceException($"{titleName} ({fontTitle:x8}) system title not found! This font will not work, provide the system archive to fix this error. (See https://github.com/GreemDev/Ryujinx#requirements for more information)"); + throw new InvalidSystemResourceException($"{titleName} ({fontTitle:x8}) system title not found! This font will not work, provide the system archive to fix this error."); } } else @@ -161,7 +162,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl static uint KXor(uint data) => data ^ FontKey; using BinaryReader reader = new(bfttfStream); - using MemoryStream ttfStream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream ttfStream = MemoryStreamManager.Shared.GetStream(); using BinaryWriter output = new(ttfStream); if (KXor(reader.ReadUInt32()) != BFTTFMagic) diff --git a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs index f67699b90..dcc01bf38 100644 --- a/src/Ryujinx.HLE/HOS/Services/ServerBase.cs +++ b/src/Ryujinx.HLE/HOS/Services/ServerBase.cs @@ -1,3 +1,4 @@ +using Microsoft.IO; using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.Common.Memory; @@ -24,14 +25,14 @@ namespace Ryujinx.HLE.HOS.Services // not large enough. private const int PointerBufferSize = 0x8000; - private readonly static uint[] _defaultCapabilities = { - 0x030363F7, + private static uint[] DefaultCapabilities => [ + (((uint)KScheduler.CpuCoresCount - 1) << 24) + (((uint)KScheduler.CpuCoresCount - 1) << 16) + 0x63F7u, 0x1FFFFFCF, 0x207FFFEF, 0x47E0060F, 0x0048BFFF, 0x01007FFF, - }; + ]; // The amount of time Dispose() will wait to Join() the thread executing the ServerLoop() private static readonly TimeSpan _threadJoinTimeout = TimeSpan.FromSeconds(3); @@ -46,10 +47,10 @@ namespace Ryujinx.HLE.HOS.Services private readonly Dictionary _sessions = new(); private readonly Dictionary> _ports = new(); - private readonly MemoryStream _requestDataStream; + private readonly RecyclableMemoryStream _requestDataStream; private readonly BinaryReader _requestDataReader; - private readonly MemoryStream _responseDataStream; + private readonly RecyclableMemoryStream _responseDataStream; private readonly BinaryWriter _responseDataWriter; private int _isDisposed = 0; @@ -80,7 +81,7 @@ namespace Ryujinx.HLE.HOS.Services ProcessCreationInfo creationInfo = new("Service", 1, 0, 0x8000000, 1, Flags, 0, 0); - KernelStatic.StartInitialProcess(context, creationInfo, _defaultCapabilities, 44, Main); + KernelStatic.StartInitialProcess(context, creationInfo, DefaultCapabilities, 44, Main); } private void AddPort(int serverPortHandle, Func objectFactory) @@ -235,7 +236,7 @@ namespace Ryujinx.HLE.HOS.Services } } - var rc = _context.Syscall.ReplyAndReceive(out int signaledIndex, handles.AsSpan(0, handleCount), replyTargetHandle, -1); + Result rc = _context.Syscall.ReplyAndReceive(out int signaledIndex, handles.AsSpan(0, handleCount), replyTargetHandle, -1); _selfThread.HandlePostSyscall(); @@ -307,7 +308,7 @@ namespace Ryujinx.HLE.HOS.Services { _context.Syscall.CloseHandle(serverSessionHandle); - if (RemoveSessionObj(serverSessionHandle, out var session)) + if (RemoveSessionObj(serverSessionHandle, out IpcService session)) { (session as IDisposable)?.Dispose(); } @@ -352,8 +353,8 @@ namespace Ryujinx.HLE.HOS.Services _requestDataStream.Write(request.RawData); _requestDataStream.Position = 0; - if (request.Type == IpcMessageType.CmifRequest || - request.Type == IpcMessageType.CmifRequestWithContext) + if (request.Type is IpcMessageType.CmifRequest or + IpcMessageType.CmifRequestWithContext) { response.Type = IpcMessageType.CmifResponse; @@ -373,8 +374,8 @@ namespace Ryujinx.HLE.HOS.Services response.RawData = _responseDataStream.ToArray(); } - else if (request.Type == IpcMessageType.CmifControl || - request.Type == IpcMessageType.CmifControlWithContext) + else if (request.Type is IpcMessageType.CmifControl or + IpcMessageType.CmifControlWithContext) { #pragma warning disable IDE0059 // Remove unnecessary value assignment uint magic = (uint)_requestDataReader.ReadUInt64(); @@ -424,7 +425,7 @@ namespace Ryujinx.HLE.HOS.Services throw new NotImplementedException(cmdId.ToString()); } } - else if (request.Type == IpcMessageType.CmifCloseSession || request.Type == IpcMessageType.TipcCloseSession) + else if (request.Type is IpcMessageType.CmifCloseSession or IpcMessageType.TipcCloseSession) { DestroySession(serverSessionHandle); shouldReply = false; @@ -453,7 +454,7 @@ namespace Ryujinx.HLE.HOS.Services response.RawData = _responseDataStream.ToArray(); - using var responseStream = response.GetStreamTipc(); + using RecyclableMemoryStream responseStream = response.GetStreamTipc(); _selfProcess.CpuMemory.Write(_selfThread.TlsAddress, responseStream.GetReadOnlySequence()); } else @@ -463,7 +464,7 @@ namespace Ryujinx.HLE.HOS.Services if (!isTipcCommunication) { - using var responseStream = response.GetStream((long)_selfThread.TlsAddress, recvListAddr | ((ulong)PointerBufferSize << 48)); + using RecyclableMemoryStream responseStream = response.GetStream((long)_selfThread.TlsAddress, recvListAddr | ((ulong)PointerBufferSize << 48)); _selfProcess.CpuMemory.Write(_selfThread.TlsAddress, responseStream.GetReadOnlySequence()); } diff --git a/src/Ryujinx.HLE/HOS/Services/Settings/ISettingsServer.cs b/src/Ryujinx.HLE/HOS/Services/Settings/ISettingsServer.cs index abb9b6d8e..fef994bf8 100644 --- a/src/Ryujinx.HLE/HOS/Services/Settings/ISettingsServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Settings/ISettingsServer.cs @@ -63,7 +63,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings RegionCode regionCode = (RegionCode)context.Device.System.State.DesiredRegionCode; - if (regionCode < RegionCode.Min || regionCode > RegionCode.Max) + if (regionCode is < RegionCode.Min or > RegionCode.Max) { regionCode = RegionCode.USA; } diff --git a/src/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs b/src/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs index 65748be33..cfad2884a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Settings/ISystemSettingsServer.cs @@ -244,6 +244,15 @@ namespace Ryujinx.HLE.HOS.Services.Settings return ResultCode.Success; } + [CommandCmif(68)] + // GetSerialNumber() -> buffer + public ResultCode GetSerialNumber(ServiceCtx context) + { + context.ResponseData.Write(Encoding.ASCII.GetBytes("RYU00000000000")); + + return ResultCode.Success; + } + [CommandCmif(77)] // GetDeviceNickName() -> buffer public ResultCode GetDeviceNickName(ServiceCtx context) @@ -317,7 +326,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings IFileSystem firmwareRomFs = firmwareContent.OpenFileSystem(NcaSectionType.Data, device.System.FsIntegrityCheckLevel); - using var firmwareFile = new UniqueRef(); + using UniqueRef firmwareFile = new(); Result result = firmwareRomFs.OpenFile(ref firmwareFile.Ref, "/file".ToU8Span(), OpenMode.Read); if (result.IsFailure()) diff --git a/src/Ryujinx.HLE/HOS/Services/Settings/KeyCodeMaps.cs b/src/Ryujinx.HLE/HOS/Services/Settings/KeyCodeMaps.cs index 981fc18ea..870d226b5 100644 --- a/src/Ryujinx.HLE/HOS/Services/Settings/KeyCodeMaps.cs +++ b/src/Ryujinx.HLE/HOS/Services/Settings/KeyCodeMaps.cs @@ -3,7 +3,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings static class KeyCodeMaps { public static byte[] Default = - { + [ 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -345,11 +345,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] EnglishUsInternational = - { + [ 0x01, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -691,11 +691,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] EnglishUk = - { + [ 0x01, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1037,11 +1037,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] French = - { + [ 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1383,11 +1383,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] FrenchCa = - { + [ 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1729,11 +1729,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] Spanish = - { + [ 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2075,11 +2075,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] SpanishLatin = - { + [ 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2421,11 +2421,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] German = - { + [ 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2767,11 +2767,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] Italian = - { + [ 0x01, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3113,11 +3113,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] Portuguese = - { + [ 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3459,11 +3459,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] Russian = - { + [ 0x09, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3805,11 +3805,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] Korean = - { + [ 0x11, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -4151,11 +4151,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] ChineseSimplified = - { + [ 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -4497,11 +4497,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; public static byte[] ChineseTraditional = - { + [ 0x61, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -4843,7 +4843,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }; + 0x00, 0x00, 0x00, 0x00 + ]; }; } diff --git a/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs b/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs index 7a90c664e..f19eeebfc 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs @@ -2,7 +2,6 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Kernel; using Ryujinx.HLE.HOS.Kernel.Ipc; -using Ryujinx.HLE.HOS.Services.Apm; using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; @@ -22,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm private bool _isInitialized; - public IUserInterface(KernelContext context, SmRegistry registry) + public IUserInterface(KernelContext context, SmRegistry registry) : base(registerTipc: true) { _commonServer = new ServerBase(context, "CommonServer"); _registry = registry; @@ -94,7 +93,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm { if (_services.TryGetValue(name, out Type type)) { - ServiceAttribute serviceAttribute = (ServiceAttribute)type.GetCustomAttributes(typeof(ServiceAttribute)).First(service => ((ServiceAttribute)service).Name == name); + ServiceAttribute serviceAttribute = type.GetCustomAttributes().First(service => service.Name == name); IpcService service = GetServiceInstance(type, context, serviceAttribute.Parameter); @@ -243,7 +242,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm { byte chr = context.RequestData.ReadByte(); - if (chr >= 0x20 && chr < 0x7f) + if (chr is >= 0x20 and < 0x7f) { nameBuilder.Append((char)chr); } diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/BsdContext.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/BsdContext.cs index 7ecd6835d..d3a88998f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/BsdContext.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/BsdContext.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Numerics; +using System.Threading; namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { @@ -10,13 +11,13 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { private static readonly ConcurrentDictionary _registry = new(); - private readonly object _lock = new(); + private readonly Lock _lock = new(); private readonly List _fds; private BsdContext() { - _fds = new List(); + _fds = []; } public ISocket RetrieveSocket(int socketFd) @@ -46,7 +47,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd public List RetrieveFileDescriptorsFromMask(ReadOnlySpan mask) { - List fds = new(); + List fds = []; for (int i = 0; i < mask.Length; i++) { diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs index 3a40a4ac5..fe37ca4fa 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs @@ -16,11 +16,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd [Service("bsd:u", false)] class IClient : IpcService { - private static readonly List _pollManagers = new() - { + private static readonly List _pollManagers = + [ EventFileDescriptorPollManager.Instance, - ManagedSocketPollManager.Instance, - }; + ManagedSocketPollManager.Instance + ]; private BsdContext _context; private readonly bool _isPrivileged; @@ -34,6 +34,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { if (errorCode != LinuxError.SUCCESS) { + if (errorCode != LinuxError.EWOULDBLOCK) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Operation failed with error {errorCode}."); + } + result = -1; } @@ -66,6 +71,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd BsdSocketType type = (BsdSocketType)context.RequestData.ReadInt32(); ProtocolType protocol = (ProtocolType)context.RequestData.ReadInt32(); + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Creating socket with domain={domain}, type={type}, protocol={protocol}"); + BsdSocketCreationFlags creationFlags = (BsdSocketCreationFlags)((int)type >> (int)BsdSocketCreationFlags.FlagsShift); type &= BsdSocketType.TypeMask; @@ -95,12 +102,21 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd } } - ISocket newBsdSocket = new ManagedSocket(netDomain, (SocketType)type, protocol, context.Device.Configuration.MultiplayerLanInterfaceId) - { - Blocking = !creationFlags.HasFlag(BsdSocketCreationFlags.NonBlocking), - }; - LinuxError errno = LinuxError.SUCCESS; + ManagedSocket newBsdSocket; + + try + { + newBsdSocket = new ManagedSocket(netDomain, (SocketType)type, protocol, context.Device.Configuration.MultiplayerLanInterfaceId) + { + Blocking = !creationFlags.HasFlag(BsdSocketCreationFlags.NonBlocking), + }; + } + catch (SocketException exception) + { + LinuxError errNo = WinSockHelper.ConvertError((WsaError)exception.ErrorCode); + return WriteBsdResult(context, 0, errNo); + } int newSockFd = _context.RegisterFileDescriptor(newBsdSocket); @@ -111,6 +127,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd if (exempt) { + Logger.Info?.Print(LogClass.ServiceBsd, "Disconnecting exempt socket."); newBsdSocket.Disconnect(); } @@ -265,7 +282,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd for (int i = 0; i < eventsByPollManager.Length; i++) { - eventsByPollManager[i] = new List(); + eventsByPollManager[i] = []; foreach (PollEvent evnt in events) { @@ -315,9 +332,9 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd } } - using var readFdsOut = context.Memory.GetWritableRegion(readFdsOutBufferPosition, (int)readFdsOutBufferSize); - using var writeFdsOut = context.Memory.GetWritableRegion(writeFdsOutBufferPosition, (int)writeFdsOutBufferSize); - using var errorFdsOut = context.Memory.GetWritableRegion(errorFdsOutBufferPosition, (int)errorFdsOutBufferSize); + using WritableRegion readFdsOut = context.Memory.GetWritableRegion(readFdsOutBufferPosition, (int)readFdsOutBufferSize); + using WritableRegion writeFdsOut = context.Memory.GetWritableRegion(writeFdsOutBufferPosition, (int)writeFdsOutBufferSize); + using WritableRegion errorFdsOut = context.Memory.GetWritableRegion(errorFdsOutBufferPosition, (int)errorFdsOutBufferSize); _context.BuildMask(readFds, readFdsOut.Memory.Span); _context.BuildMask(writeFds, writeFdsOut.Memory.Span); @@ -361,12 +378,12 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd events[i] = new PollEvent(pollEventData, fileDescriptor); } - List discoveredEvents = new(); + List discoveredEvents = []; List[] eventsByPollManager = new List[_pollManagers.Count]; for (int i = 0; i < eventsByPollManager.Length; i++) { - eventsByPollManager[i] = new List(); + eventsByPollManager[i] = []; foreach (PollEvent evnt in events) { @@ -396,7 +413,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { static bool IsUnexpectedLinuxError(LinuxError error) { - return error != LinuxError.SUCCESS && error != LinuxError.ETIMEDOUT; + return error is not LinuxError.SUCCESS and not LinuxError.ETIMEDOUT; } // Hybrid approach @@ -797,6 +814,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { errno = socket.Listen(backlog); } + else + { + Logger.Warning?.PrintMsg(LogClass.ServiceBsd, $"Invalid socket fd '{socketFd}'."); + } return WriteBsdResult(context, 0, errno); } @@ -856,13 +877,15 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { errno = LinuxError.SUCCESS; + // F_GETFL if (cmd == 0x3) { result = !socket.Blocking ? 0x800 : 0; } - else if (cmd == 0x4 && arg == 0x800) + // F_SETFL + else if (cmd == 0x4) { - socket.Blocking = false; + socket.Blocking = (arg & 0x800) == 0; result = 0; } else @@ -911,7 +934,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { errno = LinuxError.EINVAL; - if (how >= 0 && how <= 2) + if (how is >= 0 and <= 2) { errno = socket.Shutdown((BsdSocketShutdownFlags)how); } @@ -928,7 +951,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd LinuxError errno = LinuxError.EINVAL; - if (how >= 0 && how <= 2) + if (how is >= 0 and <= 2) { errno = _context.ShutdownAllSockets((BsdSocketShutdownFlags)how); } @@ -1035,7 +1058,6 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd return WriteBsdResult(context, newSockFd, errno); } - [CommandCmif(29)] // 7.0.0+ // RecvMMsg(u32 fd, u32 vlen, u32 flags, u32 reserved, nn::socket::TimeVal timeout) -> (i32 ret, u32 bsd_errno, buffer message); public ResultCode RecvMMsg(ServiceCtx context) diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs index 5b9e6811d..05fc91d32 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptor.cs @@ -10,6 +10,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl private ulong _value; private readonly EventFdFlags _flags; + // type is not Lock due to Monitor class usage private readonly object _lock = new(); public bool Blocking { get => !_flags.HasFlag(EventFdFlags.NonBlocking); set => throw new NotSupportedException(); } diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptorPollManager.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptorPollManager.cs index a29554c35..627e9838b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptorPollManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/EventFileDescriptorPollManager.cs @@ -28,7 +28,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl { updatedCount = 0; - List waiters = new(); + List waiters = []; for (int i = 0; i < events.Count; i++) { @@ -45,6 +45,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl isValidEvent = true; } + if (evnt.Data.InputEvents.HasFlag(PollEventTypeMask.Output)) { waiters.Add(socket.WriteEvent); @@ -91,7 +92,6 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl outputEvents |= PollEventTypeMask.Output; } - if (outputEvents != 0) { evnt.Data.OutputEvents = outputEvents; diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs index 981fe0a8f..684e06598 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs @@ -92,18 +92,31 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl { newSocket = new ManagedSocket(Socket.Accept()); + IPEndPoint remoteEndPoint = newSocket.RemoteEndPoint; + bool isPrivateIp = remoteEndPoint.Address.ToString().StartsWith("192.168."); + Logger.Info?.PrintMsg(LogClass.ServiceBsd, + isPrivateIp + ? $"Accepted connection from {ProtocolType}/{remoteEndPoint.Address}:{remoteEndPoint.Port}" + : $"Accepted connection from {ProtocolType}/***:{remoteEndPoint.Port}"); + return LinuxError.SUCCESS; } catch (SocketException exception) { newSocket = null; + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } public LinuxError Bind(IPEndPoint localEndPoint) { + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Socket binding to: {ProtocolType}/{localEndPoint.Port}"); try { Socket.Bind(localEndPoint); @@ -112,6 +125,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -123,6 +141,16 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl public LinuxError Connect(IPEndPoint remoteEndPoint) { + bool isLDNPrivateIP = remoteEndPoint.Address.ToString().StartsWith("192.168."); + if (isLDNPrivateIP) + { + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Connecting to: {ProtocolType}/{remoteEndPoint.Address}:{remoteEndPoint.Port}"); + } + else + { + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Connecting to: {ProtocolType}/***:{remoteEndPoint.Port}"); + } + try { Socket.Connect(remoteEndPoint); @@ -137,6 +165,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } else { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -144,11 +177,13 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl public void Disconnect() { + Logger.Info?.Print(LogClass.ServiceBsd, "Socket disconnecting"); Socket.Disconnect(true); } public void Dispose() { + Logger.Info?.Print(LogClass.ServiceBsd, "Socket closed"); Socket.Close(); Socket.Dispose(); } @@ -159,10 +194,17 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl { Socket.Listen(backlog); + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Socket listening: {ProtocolType}/{(Socket.LocalEndPoint as IPEndPoint).Port}"); + return LinuxError.SUCCESS; } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -182,11 +224,16 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } - bool hasEmittedBlockingWarning = false; + private bool _hasEmittedBlockingWarning; public LinuxError Receive(out int receiveSize, Span buffer, BsdSocketFlags flags) { @@ -202,10 +249,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl shouldBlockAfterOperation = true; } - if (Blocking && !hasEmittedBlockingWarning) + if (Blocking && !_hasEmittedBlockingWarning) { Logger.Warning?.PrintMsg(LogClass.ServiceBsd, "Blocking socket operations are not yet working properly. Expect network errors."); - hasEmittedBlockingWarning = true; + _hasEmittedBlockingWarning = true; } receiveSize = Socket.Receive(buffer, ConvertBsdSocketFlags(flags)); @@ -214,6 +261,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + receiveSize = -1; result = WinSockHelper.ConvertError((WsaError)exception.ErrorCode); @@ -245,10 +297,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl shouldBlockAfterOperation = true; } - if (Blocking && !hasEmittedBlockingWarning) + if (Blocking && !_hasEmittedBlockingWarning) { Logger.Warning?.PrintMsg(LogClass.ServiceBsd, "Blocking socket operations are not yet working properly. Expect network errors."); - hasEmittedBlockingWarning = true; + _hasEmittedBlockingWarning = true; } if (!Socket.IsBound) @@ -265,6 +317,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + receiveSize = -1; result = WinSockHelper.ConvertError((WsaError)exception.ErrorCode); @@ -288,6 +345,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + sendSize = -1; return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); @@ -304,6 +366,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + sendSize = -1; return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); @@ -341,6 +408,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -387,6 +459,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -415,7 +492,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl return true; } - private static IList> ConvertMessagesToBuffer(BsdMMsgHdr message) + private static ArraySegment[] ConvertMessagesToBuffer(BsdMMsgHdr message) { int segmentCount = 0; int index = 0; @@ -519,6 +596,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -557,6 +639,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } + return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs index e870e8aea..a1daa87c0 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocketPollManager.cs @@ -27,9 +27,9 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl public LinuxError Poll(List events, int timeoutMilliseconds, out int updatedCount) { - List readEvents = new(); - List writeEvents = new(); - List errorEvents = new(); + List readEvents = []; + List writeEvents = []; + List errorEvents = []; updatedCount = 0; @@ -123,9 +123,9 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl public LinuxError Select(List events, int timeout, out int updatedCount) { - List readEvents = new(); - List writeEvents = new(); - List errorEvents = new(); + List readEvents = []; + List writeEvents = []; + List errorEvents = []; updatedCount = 0; diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WSAError.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WSAError.cs index cd8e530c7..92a013d19 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WSAError.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WSAError.cs @@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl { - [SuppressMessage("ReSharper", "InconsistentNaming")] enum WsaError { /* diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WinSockHelper.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WinSockHelper.cs index e2ef75f80..018bb8f14 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WinSockHelper.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/WinSockHelper.cs @@ -150,6 +150,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl { BsdSocketOption.SoLinger, SocketOptionName.Linger }, { BsdSocketOption.SoOobInline, SocketOptionName.OutOfBandInline }, { BsdSocketOption.SoReusePort, SocketOptionName.ReuseAddress }, + { BsdSocketOption.SoNoSigpipe, SocketOptionName.DontLinger }, { BsdSocketOption.SoSndBuf, SocketOptionName.SendBuffer }, { BsdSocketOption.SoRcvBuf, SocketOptionName.ReceiveBuffer }, { BsdSocketOption.SoSndLoWat, SocketOptionName.SendLowWater }, @@ -303,7 +304,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl public static bool TryConvertSocketOption(BsdSocketOption option, SocketOptionLevel level, out SocketOptionName name) { - var table = level switch + Dictionary table = level switch { SocketOptionLevel.Socket => _soSocketOptionMap, SocketOptionLevel.IP => _ipSocketOptionMap, @@ -322,7 +323,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl public static LinuxError ValidateSocketOption(BsdSocketOption option, SocketOptionLevel level, bool write) { - var table = level switch + Dictionary table = level switch { SocketOptionLevel.Socket => _validSoSocketOptionMap, SocketOptionLevel.IP => _validIpSocketOptionMap, diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs index 485a7f86b..e6d5f849b 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs @@ -1,3 +1,4 @@ +using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy; using System; using System.Collections.Generic; @@ -12,9 +13,9 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Proxy public static void Select(List readEvents, List writeEvents, List errorEvents, int timeout) { - var readDefault = readEvents.Select(x => (x as DefaultSocket)?.BaseSocket).Where(x => x != null).ToList(); - var writeDefault = writeEvents.Select(x => (x as DefaultSocket)?.BaseSocket).Where(x => x != null).ToList(); - var errorDefault = errorEvents.Select(x => (x as DefaultSocket)?.BaseSocket).Where(x => x != null).ToList(); + List readDefault = readEvents.Select(x => (x as DefaultSocket)?.BaseSocket).Where(x => x != null).ToList(); + List writeDefault = writeEvents.Select(x => (x as DefaultSocket)?.BaseSocket).Where(x => x != null).ToList(); + List errorDefault = errorEvents.Select(x => (x as DefaultSocket)?.BaseSocket).Where(x => x != null).ToList(); if (readDefault.Count != 0 || writeDefault.Count != 0 || errorDefault.Count != 0) { @@ -35,7 +36,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Proxy throw new NotImplementedException(); } }); - }; + } FilterSockets(readEvents, readDefault, (socket) => socket.Readable); FilterSockets(writeEvents, writeDefault, (socket) => socket.Writable); @@ -64,8 +65,17 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Proxy { if (_proxy.Supported(domain, type, protocol)) { + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Socket is using LDN proxy"); return new LdnProxySocket(domain, type, protocol, _proxy); } + else + { + Logger.Warning?.PrintMsg(LogClass.ServiceBsd, $"LDN proxy does not support socket {domain}, {type}, {protocol}"); + } + } + else + { + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Opening socket using host networking stack"); } return new DefaultSocket(domain, type, protocol, lanInterfaceId); diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/BsdSocketOption.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/BsdSocketOption.cs index 5bc3e81f4..c275f3ba5 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/BsdSocketOption.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/BsdSocketOption.cs @@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types { - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum BsdSocketOption { SoDebug = 0x1, diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs index aaeee44d1..1219d1476 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs @@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types { - [SuppressMessage("ReSharper", "InconsistentNaming")] enum LinuxError { SUCCESS = 0, diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Nsd/IManager.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Nsd/IManager.cs index 0c1fa3a9f..9e13a005c 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Nsd/IManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Nsd/IManager.cs @@ -14,10 +14,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd class IManager : IpcService { public static readonly NsdSettings NsdSettings; -#pragma warning disable IDE0052 // Remove unread private member private readonly FqdnResolver _fqdnResolver; -#pragma warning restore IDE0052 - private readonly bool _isInitialized = false; public IManager(ServiceCtx context) diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Nsd/Manager/FqdnResolver.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Nsd/Manager/FqdnResolver.cs index 3ff48b883..2666bfa6d 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Nsd/Manager/FqdnResolver.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Nsd/Manager/FqdnResolver.cs @@ -24,10 +24,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd.Manager public static ResultCode Resolve(string address, out string resolvedAddress) { - if (address == "api.sect.srv.nintendo.net" || - address == "ctest.cdn.nintendo.net" || - address == "ctest.cdn.n.nintendoswitch.cn" || - address == "unknown.dummy.nintendo.net") + if (address is "api.sect.srv.nintendo.net" or + "ctest.cdn.nintendo.net" or + "ctest.cdn.n.nintendoswitch.cn" or + "unknown.dummy.nintendo.net") { resolvedAddress = address; } diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/IResolver.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/IResolver.cs index 5b2de13f0..80bdbec8a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/IResolver.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/IResolver.cs @@ -604,7 +604,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres private static List DeserializeAddrInfos(IVirtualMemoryManager memory, ulong address, ulong size) { - List result = new(); + List result = []; ReadOnlySpan data = memory.GetSpan(address, (int)size); diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/Proxy/DnsBlacklist.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/Proxy/DnsBlacklist.cs index 608ea2f51..507e60573 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/Proxy/DnsBlacklist.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/Proxy/DnsBlacklist.cs @@ -1,36 +1,13 @@ +using Ryujinx.Common.Helper; using System.Text.RegularExpressions; namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres.Proxy { - static partial class DnsBlacklist + static class DnsBlacklist { - const RegexOptions RegexOpts = RegexOptions.CultureInvariant | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture; - - [GeneratedRegex(@"^(.*)\-lp1\.(n|s)\.n\.srv\.nintendo\.net$", RegexOpts)] - private static partial Regex BlockedHost1(); - [GeneratedRegex(@"^(.*)\-lp1\.lp1\.t\.npln\.srv\.nintendo\.net$", RegexOpts)] - private static partial Regex BlockedHost2(); - [GeneratedRegex(@"^(.*)\-lp1\.(znc|p)\.srv\.nintendo\.net$", RegexOpts)] - private static partial Regex BlockedHost3(); - [GeneratedRegex(@"^(.*)\-sb\-api\.accounts\.nintendo\.com$", RegexOpts)] - private static partial Regex BlockedHost4(); - [GeneratedRegex(@"^(.*)\-sb\.accounts\.nintendo\.com$", RegexOpts)] - private static partial Regex BlockedHost5(); - [GeneratedRegex(@"^accounts\.nintendo\.com$", RegexOpts)] - private static partial Regex BlockedHost6(); - - private static readonly Regex[] _blockedHosts = { - BlockedHost1(), - BlockedHost2(), - BlockedHost3(), - BlockedHost4(), - BlockedHost5(), - BlockedHost6(), - }; - public static bool IsHostBlocked(string host) { - foreach (Regex regex in _blockedHosts) + foreach (Regex regex in Patterns.BlockedHosts) { if (regex.IsMatch(host)) { diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/Proxy/DnsMitmResolver.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/Proxy/DnsMitmResolver.cs index d17a999dc..820a4ab48 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/Proxy/DnsMitmResolver.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/Proxy/DnsMitmResolver.cs @@ -44,7 +44,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres.Proxy continue; } - string[] entry = line.Split(new[] { ' ', '\t' }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + string[] entry = line.Split([' ', '\t'], StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); // Hosts file example entry: // 127.0.0.1 localhost loopback @@ -82,7 +82,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres.Proxy public IPHostEntry ResolveAddress(string host) { - foreach (var hostEntry in _mitmHostEntries) + foreach (KeyValuePair hostEntry in _mitmHostEntries) { // Check for AMS hosts file extension: "*" // NOTE: MatchesSimpleExpression also allows "?" as a wildcard @@ -92,9 +92,9 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres.Proxy return new IPHostEntry { - AddressList = new[] { hostEntry.Value }, + AddressList = [hostEntry.Value], HostName = hostEntry.Key, - Aliases = Array.Empty(), + Aliases = [], }; } } diff --git a/src/Ryujinx.HLE/HOS/Services/Spl/IGeneralInterface.cs b/src/Ryujinx.HLE/HOS/Services/Spl/IGeneralInterface.cs index 4a2a910f8..301d415a0 100644 --- a/src/Ryujinx.HLE/HOS/Services/Spl/IGeneralInterface.cs +++ b/src/Ryujinx.HLE/HOS/Services/Spl/IGeneralInterface.cs @@ -51,6 +51,9 @@ namespace Ryujinx.HLE.HOS.Services.Spl context.ResponseData.Write(configValue); + if (result == SmcResult.Success) + return ResultCode.Success; + return (ResultCode)((int)result << 9) | ResultCode.ModuleId; } @@ -81,6 +84,7 @@ namespace Ryujinx.HLE.HOS.Services.Spl { configValue = (ulong)DramId.IcosaSamsung4GiB; } + break; case ConfigItem.SecurityEngineInterruptNumber: return SmcResult.NotImplemented; diff --git a/src/Ryujinx.HLE/HOS/Services/Ssl/BuiltInCertificateManager.cs b/src/Ryujinx.HLE/HOS/Services/Ssl/BuiltInCertificateManager.cs index 49becac55..763ab8d60 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ssl/BuiltInCertificateManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ssl/BuiltInCertificateManager.cs @@ -16,6 +16,7 @@ using System.Collections.Generic; using System.IO; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Threading; namespace Ryujinx.HLE.HOS.Services.Ssl { @@ -43,7 +44,7 @@ namespace Ryujinx.HLE.HOS.Services.Ssl private bool _initialized; private Dictionary _certificates; - private readonly object _lock = new(); + private readonly Lock _lock = new(); private struct CertStoreFileHeader { @@ -128,7 +129,7 @@ namespace Ryujinx.HLE.HOS.Services.Ssl IFileSystem romfs = nca.OpenFileSystem(NcaSectionType.Data, _fsIntegrityCheckLevel); - using var trustedCertsFileRef = new UniqueRef(); + using UniqueRef trustedCertsFileRef = new(); Result result = romfs.OpenFile(ref trustedCertsFileRef.Ref, "/ssl_TrustedCerts.bdf".ToU8Span(), OpenMode.Read); diff --git a/src/Ryujinx.HLE/HOS/Services/Ssl/ISslService.cs b/src/Ryujinx.HLE/HOS/Services/Ssl/ISslService.cs index 5e4a0c53b..8f38f293f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ssl/ISslService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ssl/ISslService.cs @@ -9,6 +9,7 @@ using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS.Services.Ssl { [Service("ssl")] + [Service("ssl:s")] class ISslService : IpcService { // NOTE: The SSL service is used by games to connect it to various official online services, which we do not intend to support. @@ -123,5 +124,48 @@ namespace Ryujinx.HLE.HOS.Services.Ssl return ResultCode.Success; } + + [CommandCmif(100)] + // CreateContextForSystem(u64 pid, nn::ssl::sf::SslVersion, u64) + public ResultCode CreateContextForSystem(ServiceCtx context) + { + ulong pid = context.RequestData.ReadUInt64(); + SslVersion sslVersion = (SslVersion)context.RequestData.ReadUInt32(); + ulong pidPlaceholder = context.RequestData.ReadUInt64(); + + Logger.Stub?.PrintStub(LogClass.ServiceSsl, new { pid, sslVersion, pidPlaceholder }); + + return ResultCode.Success; + } + + [CommandCmif(101)] + // SetThreadCoreMask(u64 mask) + public ResultCode SetThreadCoreMask(ServiceCtx context) + { + ulong mask = context.RequestData.ReadUInt64(); + + Logger.Stub?.PrintStub(LogClass.ServiceSsl, new { mask }); + + return ResultCode.Success; + } + + [CommandCmif(102)] + // GetThreadCoreMask() -> u64 + public ResultCode GetThreadCoreMask(ServiceCtx context) + { + Logger.Stub?.PrintStub(LogClass.ServiceSsl); + + return ResultCode.Success; + } + + [CommandCmif(103)] + // VerifySignature(buffer<0x5> unknownInput1, buffer<0x5> unknownInput2, buffer<0x5> unknownInput3, buffer unknown1) + public ResultCode VerifySignature(ServiceCtx context) + { + // I would log these values like a proper stub, but I genuinely don't know how. + Logger.Stub?.PrintStub(LogClass.ServiceSsl); + + return ResultCode.Success; + } } } diff --git a/src/Ryujinx.HLE/HOS/Services/Ssl/SslService/ISslConnection.cs b/src/Ryujinx.HLE/HOS/Services/Ssl/SslService/ISslConnection.cs index b5c608d3d..623990a58 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ssl/SslService/ISslConnection.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ssl/SslService/ISslConnection.cs @@ -21,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService private SessionCacheMode _sessionCacheMode; private string _hostName; - private ISslConnectionBase _connection; + private SslManagedSocketConnection _connection; private BsdContext _bsdContext; private readonly ulong _processId; @@ -145,7 +145,7 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService ulong bufferAddress = context.Request.ReceiveBuff[0].Position; ulong bufferLen = context.Request.ReceiveBuff[0].Size; - using (var region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true)) + using (WritableRegion region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true)) { Encoding.ASCII.GetBytes(_hostName, region.Memory.Span); } @@ -296,7 +296,6 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService using WritableRegion region = context.Memory.GetWritableRegion(context.Request.ReceiveBuff[0].Position, (int)context.Request.ReceiveBuff[0].Size); - // TODO: Better error management. result = _connection.Peek(out int peekCount, region.Memory); diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueConsumer.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueConsumer.cs index 74afa989d..68560240b 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueConsumer.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueConsumer.cs @@ -336,7 +336,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger public Status SetMaxAcquiredBufferCount(int maxAcquiredBufferCount) { - if (maxAcquiredBufferCount < 0 || maxAcquiredBufferCount > BufferSlotArray.MaxAcquiredBuffers) + if (maxAcquiredBufferCount is < 0 or > BufferSlotArray.MaxAcquiredBuffers) { return Status.BadValue; } diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueCore.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueCore.cs index 5dc02a07e..8399c6d67 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueCore.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueCore.cs @@ -66,7 +66,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger ConsumerListener = null; ConsumerUsageBits = 0; - Queue = new List(); + Queue = []; // TODO: CreateGraphicBufferAlloc? @@ -126,7 +126,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { BufferState state = Slots[slot].BufferState; - if (state == BufferState.Queued || state == BufferState.Dequeued) + if (state is BufferState.Queued or BufferState.Dequeued) { maxBufferCount = slot + 1; } diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueProducer.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueProducer.cs index ae61d0bf7..9afb26c65 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueProducer.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/BufferQueueProducer.cs @@ -636,6 +636,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger status = Status.Success; } + break; } } @@ -758,7 +759,6 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger return Status.BadValue; } - if (maxBufferCount < Core.MaxBufferCountCached) { for (int slot = maxBufferCount; slot < Core.MaxBufferCountCached; slot++) @@ -791,6 +791,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { freeSlot = slot; } + break; default: break; diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/ConsumerBase.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/ConsumerBase.cs index f8ee84842..017365c6f 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/ConsumerBase.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/ConsumerBase.cs @@ -1,5 +1,6 @@ using Ryujinx.HLE.HOS.Services.SurfaceFlinger.Types; using System; +using System.Threading; namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { @@ -23,7 +24,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger protected BufferQueueConsumer Consumer; - protected readonly object Lock = new(); + protected readonly Lock Lock = new(); private readonly IConsumerListener _listener; diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/HOSBinderDriverServer.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/HOSBinderDriverServer.cs index bc7bffcb6..5151930a5 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/HOSBinderDriverServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/HOSBinderDriverServer.cs @@ -2,6 +2,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Kernel.Threading; using System; using System.Collections.Generic; +using System.Threading; namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { @@ -11,7 +12,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger private static int _lastBinderId = 0; - private static readonly object _lock = new(); + private static readonly Lock _lock = new(); public static int RegisterBinderObject(IBinder binder) { diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs index 2ffa961cb..e23e6fa3f 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs @@ -3,7 +3,6 @@ using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.Horizon.Common; using System; -using System.Buffers; namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Status.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Status.cs index 14f80fa90..0c69bf573 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Status.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Status.cs @@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum Status { Success = 0, diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs index 601e85867..8acc4d756 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs @@ -2,6 +2,7 @@ using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.PreciseSleep; +using Ryujinx.Cpu; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvMap; @@ -10,7 +11,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; -using VSyncMode = Ryujinx.Common.Configuration.VSyncMode; namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { @@ -37,7 +37,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger private int _swapInterval; private int _swapIntervalDelay; - private readonly object _lock = new(); + private readonly Lock _lock = new(); public long RenderLayerId { get; private set; } @@ -90,7 +90,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger } else { - _ticksPerFrame = Stopwatch.Frequency / _device.TargetVSyncInterval; + _ticksPerFrame = ((Stopwatch.Frequency / _device.TargetVSyncInterval) * 100) / _device.TickScalar; _targetVSyncInterval = _device.TargetVSyncInterval; } } @@ -189,7 +189,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger return Vi.ResultCode.InvalidValue; } - if (layer.State != LayerState.ManagedClosed && layer.State != LayerState.ManagedOpened) + if (layer.State is not LayerState.ManagedClosed and not LayerState.ManagedOpened) { Logger.Error?.Print(LogClass.SurfaceFlinger, $"Failed to destroy managed layer {layerId} (permission denied)"); @@ -393,7 +393,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger PostFrameBuffer(layer, item); } - else if (acquireStatus != Status.NoBufferAvailaible && acquireStatus != Status.InvalidOperation) + else if (acquireStatus is not Status.NoBufferAvailaible and not Status.InvalidOperation) { throw new InvalidOperationException(); } @@ -421,8 +421,8 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger Format format = ConvertColorFormat(item.GraphicBuffer.Object.Buffer.Surfaces[0].ColorFormat); byte bytesPerPixel = - format == Format.B5G6R5Unorm || - format == Format.R4G4B4A4Unorm ? (byte)2 : (byte)4; + format is Format.B5G6R5Unorm or + Format.R4G4B4A4Unorm ? (byte)2 : (byte)4; int gobBlocksInY = 1 << item.GraphicBuffer.Object.Buffer.Surfaces[0].BlockHeightLog2; diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/AndroidFence.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/AndroidFence.cs index ebc6501ae..42dd4ed26 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/AndroidFence.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/AndroidFence.cs @@ -49,7 +49,6 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger Logger.Error?.Print(LogClass.SurfaceFlinger, "Android fence didn't signal in 3000 ms"); Wait(gpuContext, Timeout.InfiniteTimeSpan); } - } public bool Wait(GpuContext gpuContext, TimeSpan timeout) diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/Color/ColorFormat.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/Color/ColorFormat.cs index 2512393c5..b26fb15d1 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/Color/ColorFormat.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/Types/Color/ColorFormat.cs @@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger { - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum ColorFormat : ulong { #pragma warning disable IDE0055 // Disable formatting diff --git a/src/Ryujinx.HLE/HOS/Services/Time/Clock/SystemClockContextUpdateCallback.cs b/src/Ryujinx.HLE/HOS/Services/Time/Clock/SystemClockContextUpdateCallback.cs index 119096dcf..781f72ead 100644 --- a/src/Ryujinx.HLE/HOS/Services/Time/Clock/SystemClockContextUpdateCallback.cs +++ b/src/Ryujinx.HLE/HOS/Services/Time/Clock/SystemClockContextUpdateCallback.cs @@ -12,7 +12,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock public SystemClockContextUpdateCallback() { - _operationEventList = new List(); + _operationEventList = []; Context = new SystemClockContext(); _hasContext = false; } diff --git a/src/Ryujinx.HLE/HOS/Services/Time/Clock/Types/ClockSnapshot.cs b/src/Ryujinx.HLE/HOS/Services/Time/Clock/Types/ClockSnapshot.cs index 4383fc823..7d918f5e3 100644 --- a/src/Ryujinx.HLE/HOS/Services/Time/Clock/Types/ClockSnapshot.cs +++ b/src/Ryujinx.HLE/HOS/Services/Time/Clock/Types/ClockSnapshot.cs @@ -26,7 +26,6 @@ namespace Ryujinx.HLE.HOS.Services.Time.Clock public byte Type; public ushort Unknown; - [StructLayout(LayoutKind.Sequential, Pack = 1, Size = Size)] private struct LocationNameStorageHolder { diff --git a/src/Ryujinx.HLE/HOS/Services/Time/ResultCode.cs b/src/Ryujinx.HLE/HOS/Services/Time/ResultCode.cs index 74a57f20b..ded2c3175 100644 --- a/src/Ryujinx.HLE/HOS/Services/Time/ResultCode.cs +++ b/src/Ryujinx.HLE/HOS/Services/Time/ResultCode.cs @@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.HLE.HOS.Services.Time { - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] public enum ResultCode { ModuleId = 116, diff --git a/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs b/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs index cdd11b58d..dfacc8170 100644 --- a/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs +++ b/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs @@ -32,11 +32,12 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone private const long AverageSecondsPerYear = 31556952; private const long SecondsPerRepeat = YearsPerRepeat * AverageSecondsPerYear; - private static readonly int[] _yearLengths = { DaysPerNYear, DaysPerLYear }; - private static readonly int[][] _monthsLengths = { - new[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, - new[] { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, - }; + private static readonly int[] _yearLengths = [DaysPerNYear, DaysPerLYear]; + private static readonly int[][] _monthsLengths = + [ + [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + ]; private static ReadOnlySpan TimeZoneDefaultRule => ",M4.1.0,M10.5.0"u8; @@ -221,7 +222,6 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone { seconds = 0; - bool isValid = GetNum(name, ref namePosition, out int num, 0, HoursPerDays * DaysPerWeek - 1); if (!isValid) { @@ -263,6 +263,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone seconds += num; } } + return true; } @@ -485,7 +486,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone return false; } - if (name[namePosition] != '\0' && name[namePosition] != ',' && name[namePosition] != ';') + if (name[namePosition] is not (byte)'\0' and not (byte)',' and not (byte)';') { bool isValid = GetOffset(name.ToArray(), ref namePosition, ref dstOffset); @@ -505,7 +506,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone namePosition = 0; } - if (name[namePosition] == ',' || name[namePosition] == ';') + if (name[namePosition] is (byte)',' or (byte)';') { namePosition++; @@ -743,6 +744,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone { outRules.Chars[charsPosition + i] = destName[i]; } + outRules.Chars[charsPosition + destLen] = 0; } @@ -762,6 +764,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone { value += SecondsPerDay; } + break; case RuleType.DayOfYear: @@ -922,7 +925,6 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone return false; } - if (streamLength < (timeCount * TimeTypeSize + timeCount + typeCount * 6 @@ -1050,7 +1052,6 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone outRules.Ttis[i].IsGMT = p[0] != 0; p = p[1..]; } - } long position = (workBuffer.Length - p.Length); @@ -1553,7 +1554,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone int savedSeconds; - if (calendarTime.Second >= 0 && calendarTime.Second < SecondsPerMinute) + if (calendarTime.Second is >= 0 and < SecondsPerMinute) { savedSeconds = 0; } diff --git a/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneContentManager.cs b/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneContentManager.cs index 222698a7f..764fb5104 100644 --- a/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneContentManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneContentManager.cs @@ -94,13 +94,13 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone Nca nca = new(_virtualFileSystem.KeySet, ncaFileStream); IFileSystem romfs = nca.OpenFileSystem(NcaSectionType.Data, _fsIntegrityCheckLevel); - using var binaryListFile = new UniqueRef(); + using UniqueRef binaryListFile = new(); romfs.OpenFile(ref binaryListFile.Ref, "/binaryList.txt".ToU8Span(), OpenMode.Read).ThrowIfFailure(); StreamReader reader = new(binaryListFile.Get.AsStream()); - List locationNameList = new(); + List locationNameList = []; string locationName; while ((locationName = reader.ReadLine()) != null) @@ -112,7 +112,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone } else { - LocationNameCache = new[] { "UTC" }; + LocationNameCache = ["UTC"]; Logger.Error?.Print(LogClass.ServiceTime, TimeZoneSystemTitleMissingErrorMessage); } @@ -120,15 +120,15 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone public IEnumerable<(int Offset, string Location, string Abbr)> ParseTzOffsets() { - var tzBinaryContentPath = GetTimeZoneBinaryTitleContentPath(); + string tzBinaryContentPath = GetTimeZoneBinaryTitleContentPath(); if (string.IsNullOrEmpty(tzBinaryContentPath)) { - return new[] { (0, "UTC", "UTC") }; + return [(0, "UTC", "UTC")]; } - List<(int Offset, string Location, string Abbr)> outList = new(); - var now = DateTimeOffset.Now.ToUnixTimeSeconds(); + List<(int Offset, string Location, string Abbr)> outList = []; + long now = DateTimeOffset.Now.ToUnixTimeSeconds(); using (IStorage ncaStorage = new LocalStorage(VirtualFileSystem.SwitchPathToSystemPath(tzBinaryContentPath), FileAccess.Read, FileMode.Open)) using (IFileSystem romfs = new Nca(_virtualFileSystem.KeySet, ncaStorage).OpenFileSystem(NcaSectionType.Data, _fsIntegrityCheckLevel)) { @@ -139,7 +139,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone continue; } - using var tzif = new UniqueRef(); + using UniqueRef tzif = new(); if (romfs.OpenFile(ref tzif.Ref, $"/zoneinfo/{locName}".ToU8Span(), OpenMode.Read).IsFailure()) { @@ -152,7 +152,6 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone TimeZone.ParseTimeZoneBinary(ref tzRule, tzif.Get.AsStream()); - TimeTypeInfo ttInfo; if (tzRule.TimeCount > 0) // Find the current transition period { @@ -164,6 +163,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone fin = i; } } + ttInfo = tzRule.Ttis[tzRule.Types[fin]]; } else if (tzRule.TypeCount >= 1) // Otherwise, use the first offset in TTInfo @@ -176,7 +176,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone continue; } - var abbrStart = tzRule.Chars[ttInfo.AbbreviationListIndex..]; + Span abbrStart = tzRule.Chars[ttInfo.AbbreviationListIndex..]; int abbrEnd = abbrStart.IndexOf((byte)0); outList.Add((ttInfo.GmtOffset, locName, Encoding.UTF8.GetString(abbrStart[..abbrEnd]))); @@ -217,7 +217,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone public ResultCode LoadLocationNameList(uint index, out string[] outLocationNameArray, uint maxLength) { - List locationNameList = new(); + List locationNameList = []; for (int i = 0; i < LocationNameCache.Length && i < maxLength; i++) { @@ -231,7 +231,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone // If the location name is too long, error out. if (locationName.Length > 0x24) { - outLocationNameArray = Array.Empty(); + outLocationNameArray = []; return ResultCode.LocationNameTooLong; } @@ -269,7 +269,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone Nca nca = new(_virtualFileSystem.KeySet, ncaFile); IFileSystem romfs = nca.OpenFileSystem(NcaSectionType.Data, _fsIntegrityCheckLevel); - using var timeZoneBinaryFile = new UniqueRef(); + using UniqueRef timeZoneBinaryFile = new(); Result result = romfs.OpenFile(ref timeZoneBinaryFile.Ref, $"/zoneinfo/{locationName}".ToU8Span(), OpenMode.Read); diff --git a/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneManager.cs b/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneManager.cs index 3b57b1805..155733d2e 100644 --- a/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneManager.cs +++ b/src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneManager.cs @@ -2,6 +2,7 @@ using Ryujinx.Common.Memory; using Ryujinx.HLE.HOS.Services.Time.Clock; using System; using System.IO; +using System.Threading; namespace Ryujinx.HLE.HOS.Services.Time.TimeZone { @@ -13,7 +14,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone private UInt128 _timeZoneRuleVersion; private uint _totalLocationNameCount; private SteadyClockTimePoint _timeZoneUpdateTimePoint; - private readonly object _lock = new(); + private readonly Lock _lock = new(); public TimeZoneManager() { diff --git a/src/Ryujinx.HLE/HOS/Services/Vi/RootService/ApplicationDisplayService/IManagerDisplayService.cs b/src/Ryujinx.HLE/HOS/Services/Vi/RootService/ApplicationDisplayService/IManagerDisplayService.cs index 3a08cdd78..0e5d103d1 100644 --- a/src/Ryujinx.HLE/HOS/Services/Vi/RootService/ApplicationDisplayService/IManagerDisplayService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Vi/RootService/ApplicationDisplayService/IManagerDisplayService.cs @@ -4,9 +4,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService.ApplicationDisplayService { class IManagerDisplayService : IpcService { -#pragma warning disable IDE0052 // Remove unread private member private readonly IApplicationDisplayService _applicationDisplayService; -#pragma warning restore IDE0052 public IManagerDisplayService(IApplicationDisplayService applicationDisplayService) { diff --git a/src/Ryujinx.HLE/HOS/Services/Vi/RootService/ApplicationDisplayService/ISystemDisplayService.cs b/src/Ryujinx.HLE/HOS/Services/Vi/RootService/ApplicationDisplayService/ISystemDisplayService.cs index 12ac2cf4a..507290692 100644 --- a/src/Ryujinx.HLE/HOS/Services/Vi/RootService/ApplicationDisplayService/ISystemDisplayService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Vi/RootService/ApplicationDisplayService/ISystemDisplayService.cs @@ -4,9 +4,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService.ApplicationDisplayService { class ISystemDisplayService : IpcService { -#pragma warning disable IDE0052 // Remove unread private member private readonly IApplicationDisplayService _applicationDisplayService; -#pragma warning restore IDE0052 public ISystemDisplayService(IApplicationDisplayService applicationDisplayService) { diff --git a/src/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs b/src/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs index edb441a0a..99c640aa0 100644 --- a/src/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs @@ -34,7 +34,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService public IApplicationDisplayService(ViServiceType serviceType) { _serviceType = serviceType; - _displayInfo = new List(); + _displayInfo = []; _openDisplays = new Dictionary(); void AddDisplayInfo(string name, bool layerLimitEnabled, ulong layerLimitMax, ulong width, ulong height) @@ -148,7 +148,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService { byte chr = context.RequestData.ReadByte(); - if (chr >= 0x20 && chr < 0x7f) + if (chr is >= 0x20 and < 0x7f) { nameBuilder.Append((char)chr); } @@ -346,7 +346,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService return ResultCode.InvalidArguments; } - if (scalingMode != SourceScalingMode.ScaleToWindow && scalingMode != SourceScalingMode.PreserveAspectRatio) + if (scalingMode is not SourceScalingMode.ScaleToWindow and not SourceScalingMode.PreserveAspectRatio) { // Invalid scaling mode specified. return ResultCode.InvalidScalingMode; diff --git a/src/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs b/src/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs index c650fe036..91277232c 100644 --- a/src/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs +++ b/src/Ryujinx.HLE/HOS/SystemState/SystemStateMgr.cs @@ -4,7 +4,8 @@ namespace Ryujinx.HLE.HOS.SystemState { public class SystemStateMgr { - internal static string[] LanguageCodes = { + internal static string[] LanguageCodes = + [ "ja", "en-US", "fr", @@ -22,8 +23,8 @@ namespace Ryujinx.HLE.HOS.SystemState "es-419", "zh-Hans", "zh-Hant", - "pt-BR", - }; + "pt-BR" + ]; internal long DesiredKeyboardLayout { get; private set; } diff --git a/src/Ryujinx.HLE/HOS/Tamper/AtmosphereCompiler.cs b/src/Ryujinx.HLE/HOS/Tamper/AtmosphereCompiler.cs index e25ba7a55..ec41e9bd5 100644 --- a/src/Ryujinx.HLE/HOS/Tamper/AtmosphereCompiler.cs +++ b/src/Ryujinx.HLE/HOS/Tamper/AtmosphereCompiler.cs @@ -26,12 +26,13 @@ namespace Ryujinx.HLE.HOS.Tamper public ITamperProgram Compile(string name, IEnumerable rawInstructions) { - string[] addresses = { + string[] addresses = + [ $" Executable address: 0x{_exeAddress:X16}", $" Heap address : 0x{_heapAddress:X16}", $" Alias address : 0x{_aliasAddress:X16}", - $" Aslr address : 0x{_aslrAddress:X16}", - }; + $" Aslr address : 0x{_aslrAddress:X16}" + ]; Logger.Debug?.Print(LogClass.TamperMachine, $"Compiling Atmosphere cheat {name}...\n{string.Join('\n', addresses)}"); @@ -54,7 +55,7 @@ namespace Ryujinx.HLE.HOS.Tamper return null; } - private ITamperProgram CompileImpl(string name, IEnumerable rawInstructions) + private AtmosphereProgram CompileImpl(string name, IEnumerable rawInstructions) { CompilationContext context = new(_exeAddress, _heapAddress, _aliasAddress, _aslrAddress, _process); context.BlockStack.Push(new OperationBlock(null)); diff --git a/src/Ryujinx.HLE/HOS/Tamper/CodeEmitters/Arithmetic.cs b/src/Ryujinx.HLE/HOS/Tamper/CodeEmitters/Arithmetic.cs index 5b296def0..ce1b91cec 100644 --- a/src/Ryujinx.HLE/HOS/Tamper/CodeEmitters/Arithmetic.cs +++ b/src/Ryujinx.HLE/HOS/Tamper/CodeEmitters/Arithmetic.cs @@ -73,11 +73,11 @@ namespace Ryujinx.HLE.HOS.Tamper.CodeEmitters void Emit(Type operationType, IOperand rhs = null) { - List operandList = new() - { + List operandList = + [ destinationRegister, - leftHandSideRegister, - }; + leftHandSideRegister + ]; if (rhs != null) { diff --git a/src/Ryujinx.HLE/HOS/Tamper/CodeEmitters/EndConditionalBlock.cs b/src/Ryujinx.HLE/HOS/Tamper/CodeEmitters/EndConditionalBlock.cs index fc7edd62b..5eaed6530 100644 --- a/src/Ryujinx.HLE/HOS/Tamper/CodeEmitters/EndConditionalBlock.cs +++ b/src/Ryujinx.HLE/HOS/Tamper/CodeEmitters/EndConditionalBlock.cs @@ -40,7 +40,7 @@ namespace Ryujinx.HLE.HOS.Tamper.CodeEmitters } // Use the conditional begin instruction stored in the stack. - var upperInstruction = context.CurrentBlock.BaseInstruction; + byte[] upperInstruction = context.CurrentBlock.BaseInstruction; CodeType codeType = InstructionHelper.GetCodeType(upperInstruction); // Pop the current block of operations from the stack so control instructions diff --git a/src/Ryujinx.HLE/HOS/Tamper/InstructionHelper.cs b/src/Ryujinx.HLE/HOS/Tamper/InstructionHelper.cs index 759ba5f90..46e4fd9f7 100644 --- a/src/Ryujinx.HLE/HOS/Tamper/InstructionHelper.cs +++ b/src/Ryujinx.HLE/HOS/Tamper/InstructionHelper.cs @@ -96,7 +96,7 @@ namespace Ryujinx.HLE.HOS.Tamper // Instructions are multi-word, with 32bit words. Split the raw instruction // and parse each word into individual nybbles of bits. - var words = rawInstruction.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); + string[] words = rawInstruction.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); byte[] instruction = new byte[WordSize * words.Length]; diff --git a/src/Ryujinx.HLE/HOS/Tamper/OperationBlock.cs b/src/Ryujinx.HLE/HOS/Tamper/OperationBlock.cs index 5a0bccc5d..1e856294a 100644 --- a/src/Ryujinx.HLE/HOS/Tamper/OperationBlock.cs +++ b/src/Ryujinx.HLE/HOS/Tamper/OperationBlock.cs @@ -11,7 +11,7 @@ namespace Ryujinx.HLE.HOS.Tamper public OperationBlock(byte[] baseInstruction) { BaseInstruction = baseInstruction; - Operations = new List(); + Operations = []; } } } diff --git a/src/Ryujinx.HLE/HOS/TamperMachine.cs b/src/Ryujinx.HLE/HOS/TamperMachine.cs index 609221535..9b565b034 100644 --- a/src/Ryujinx.HLE/HOS/TamperMachine.cs +++ b/src/Ryujinx.HLE/HOS/TamperMachine.cs @@ -70,14 +70,14 @@ namespace Ryujinx.HLE.HOS public void EnableCheats(string[] enabledCheats) { - foreach (var program in _programDictionary.Values) + foreach (ITamperProgram program in _programDictionary.Values) { program.IsEnabled = false; } - foreach (var cheat in enabledCheats) + foreach (string cheat in enabledCheats) { - if (_programDictionary.TryGetValue(cheat, out var program)) + if (_programDictionary.TryGetValue(cheat, out ITamperProgram program)) { program.IsEnabled = true; } @@ -86,7 +86,7 @@ namespace Ryujinx.HLE.HOS private static bool IsProcessValid(ITamperedProcess process) { - return process.State != ProcessState.Crashed && process.State != ProcessState.Exiting && process.State != ProcessState.Exited; + return process.State is not ProcessState.Crashed and not ProcessState.Exiting and not ProcessState.Exited; } private void TamperRunner() @@ -173,7 +173,7 @@ namespace Ryujinx.HLE.HOS // Look for the input of the player one or the handheld. foreach (GamepadInput input in gamepadInputs) { - if (input.PlayerId == PlayerIndex.Player1 || input.PlayerId == PlayerIndex.Handheld) + if (input.PlayerId is PlayerIndex.Player1 or PlayerIndex.Handheld) { Volatile.Write(ref _pressedKeys, (long)input.Buttons); diff --git a/src/Ryujinx.HLE/HLEConfiguration.cs b/src/Ryujinx.HLE/HleConfiguration.cs similarity index 82% rename from src/Ryujinx.HLE/HLEConfiguration.cs rename to src/Ryujinx.HLE/HleConfiguration.cs index f75ead588..10c2a1f30 100644 --- a/src/Ryujinx.HLE/HLEConfiguration.cs +++ b/src/Ryujinx.HLE/HleConfiguration.cs @@ -9,62 +9,61 @@ using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.UI; using System; -using VSyncMode = Ryujinx.Common.Configuration.VSyncMode; namespace Ryujinx.HLE { /// /// HLE configuration. /// - public class HLEConfiguration + public class HleConfiguration { /// /// The virtual file system used by the FS service. /// /// This cannot be changed after instantiation. - internal readonly VirtualFileSystem VirtualFileSystem; + internal VirtualFileSystem VirtualFileSystem { get; private set; } /// /// The manager for handling a LibHac Horizon instance. /// /// This cannot be changed after instantiation. - internal readonly LibHacHorizonManager LibHacHorizonManager; + internal LibHacHorizonManager LibHacHorizonManager { get; private set; } /// /// The account manager used by the account service. /// /// This cannot be changed after instantiation. - internal readonly AccountManager AccountManager; + internal AccountManager AccountManager { get; private set; } /// /// The content manager used by the NCM service. /// /// This cannot be changed after instantiation. - internal readonly ContentManager ContentManager; + internal ContentManager ContentManager { get; private set; } /// /// The persistent information between run for multi-application capabilities. /// /// This cannot be changed after instantiation. - public readonly UserChannelPersistence UserChannelPersistence; + public UserChannelPersistence UserChannelPersistence { get; private set; } /// /// The GPU renderer to use for all GPU operations. /// /// This cannot be changed after instantiation. - internal readonly IRenderer GpuRenderer; + internal IRenderer GpuRenderer { get; private set; } /// /// The audio device driver to use for all audio operations. /// /// This cannot be changed after instantiation. - internal readonly IHardwareDeviceDriver AudioDeviceDriver; + internal IHardwareDeviceDriver AudioDeviceDriver { get; private set; } /// /// The handler for various UI related operations needed outside of HLE. /// /// This cannot be changed after instantiation. - internal readonly IHostUIHandler HostUIHandler; + internal IHostUIHandler HostUIHandler { get; private set; } /// /// Control the memory configuration used by the emulation context. @@ -104,6 +103,11 @@ namespace Ryujinx.HLE /// internal readonly bool EnablePtc; + /// + /// Control the arbitrary scalar applied to emulated CPU tick timing. + /// + public long TickScalar { get; set; } + /// /// Control if the guest application should be told that there is a Internet connection available. /// @@ -190,20 +194,19 @@ namespace Ryujinx.HLE /// public Action RefreshInputConfig { internal get; set; } - public HLEConfiguration(VirtualFileSystem virtualFileSystem, - LibHacHorizonManager libHacHorizonManager, - ContentManager contentManager, - AccountManager accountManager, - UserChannelPersistence userChannelPersistence, - IRenderer gpuRenderer, - IHardwareDeviceDriver audioDeviceDriver, - MemoryConfiguration memoryConfiguration, - IHostUIHandler hostUIHandler, + /// + /// The desired hacky workarounds. + /// + /// This cannot be changed after instantiation. + public EnabledDirtyHack[] Hacks { internal get; set; } + + public HleConfiguration(MemoryConfiguration memoryConfiguration, SystemLanguage systemLanguage, RegionCode region, VSyncMode vSyncMode, bool enableDockedMode, bool enablePtc, + long tickScalar, bool enableInternetAccess, IntegrityCheckLevel fsIntegrityCheckLevel, int fsGlobalAccessLogMode, @@ -219,23 +222,17 @@ namespace Ryujinx.HLE bool multiplayerDisableP2p, string multiplayerLdnPassphrase, string multiplayerLdnServer, - int customVSyncInterval) + int customVSyncInterval, + EnabledDirtyHack[] dirtyHacks = null) { - VirtualFileSystem = virtualFileSystem; - LibHacHorizonManager = libHacHorizonManager; - AccountManager = accountManager; - ContentManager = contentManager; - UserChannelPersistence = userChannelPersistence; - GpuRenderer = gpuRenderer; - AudioDeviceDriver = audioDeviceDriver; MemoryConfiguration = memoryConfiguration; - HostUIHandler = hostUIHandler; SystemLanguage = systemLanguage; Region = region; VSyncMode = vSyncMode; CustomVSyncInterval = customVSyncInterval; EnableDockedMode = enableDockedMode; EnablePtc = enablePtc; + TickScalar = tickScalar; EnableInternetAccess = enableInternetAccess; FsIntegrityCheckLevel = fsIntegrityCheckLevel; FsGlobalAccessLogMode = fsGlobalAccessLogMode; @@ -251,6 +248,32 @@ namespace Ryujinx.HLE MultiplayerDisableP2p = multiplayerDisableP2p; MultiplayerLdnPassphrase = multiplayerLdnPassphrase; MultiplayerLdnServer = multiplayerLdnServer; + Hacks = dirtyHacks ?? []; + } + + /// + /// Set the pre-configured services to use for this instance. + /// + public HleConfiguration Configure( + VirtualFileSystem virtualFileSystem, + LibHacHorizonManager libHacHorizonManager, + ContentManager contentManager, + AccountManager accountManager, + UserChannelPersistence userChannelPersistence, + IRenderer gpuRenderer, + IHardwareDeviceDriver audioDeviceDriver, + IHostUIHandler hostUIHandler + ) + { + VirtualFileSystem = virtualFileSystem; + LibHacHorizonManager = libHacHorizonManager; + AccountManager = accountManager; + ContentManager = contentManager; + UserChannelPersistence = userChannelPersistence; + GpuRenderer = gpuRenderer; + AudioDeviceDriver = audioDeviceDriver; + HostUIHandler = hostUIHandler; + return this; } } } diff --git a/src/Ryujinx.HLE/Loaders/Elf/ElfDynamicTag.cs b/src/Ryujinx.HLE/Loaders/Elf/ElfDynamicTag.cs index 6505e17dd..9b6eb014e 100644 --- a/src/Ryujinx.HLE/Loaders/Elf/ElfDynamicTag.cs +++ b/src/Ryujinx.HLE/Loaders/Elf/ElfDynamicTag.cs @@ -2,8 +2,6 @@ using System.Diagnostics.CodeAnalysis; namespace Ryujinx.HLE.Loaders.Elf { - [SuppressMessage("ReSharper", "InconsistentNaming")] - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] enum ElfDynamicTag { DT_NULL = 0, diff --git a/src/Ryujinx.HLE/Loaders/Elf/ElfSymbol.cs b/src/Ryujinx.HLE/Loaders/Elf/ElfSymbol.cs index 1ed61b2cb..e3ade80ba 100644 --- a/src/Ryujinx.HLE/Loaders/Elf/ElfSymbol.cs +++ b/src/Ryujinx.HLE/Loaders/Elf/ElfSymbol.cs @@ -8,8 +8,8 @@ namespace Ryujinx.HLE.Loaders.Elf public ElfSymbolBinding Binding { get; private set; } public ElfSymbolVisibility Visibility { get; private set; } - public readonly bool IsFuncOrObject => Type == ElfSymbolType.SttFunc || Type == ElfSymbolType.SttObject; - public readonly bool IsGlobalOrWeak => Binding == ElfSymbolBinding.StbGlobal || Binding == ElfSymbolBinding.StbWeak; + public readonly bool IsFuncOrObject => Type is ElfSymbolType.SttFunc or ElfSymbolType.SttObject; + public readonly bool IsGlobalOrWeak => Binding is ElfSymbolBinding.StbGlobal or ElfSymbolBinding.StbWeak; public int ShIdx { get; private set; } public ulong Value { get; private set; } diff --git a/src/Ryujinx.HLE/Loaders/Executables/KipExecutable.cs b/src/Ryujinx.HLE/Loaders/Executables/KipExecutable.cs index 83380ff45..293e5f846 100644 --- a/src/Ryujinx.HLE/Loaders/Executables/KipExecutable.cs +++ b/src/Ryujinx.HLE/Loaders/Executables/KipExecutable.cs @@ -76,7 +76,7 @@ namespace Ryujinx.HLE.Loaders.Executables { reader.GetSegmentSize(segmentType, out int uncompressedSize).ThrowIfFailure(); - var span = program.AsSpan((int)offset, uncompressedSize); + Span span = program.AsSpan((int)offset, uncompressedSize); reader.ReadSegment(segmentType, span).ThrowIfFailure(); diff --git a/src/Ryujinx.HLE/Loaders/Executables/NsoExecutable.cs b/src/Ryujinx.HLE/Loaders/Executables/NsoExecutable.cs index 1caedb51e..84f229d8e 100644 --- a/src/Ryujinx.HLE/Loaders/Executables/NsoExecutable.cs +++ b/src/Ryujinx.HLE/Loaders/Executables/NsoExecutable.cs @@ -2,6 +2,7 @@ using LibHac.Common.FixedArrays; using LibHac.Fs; using LibHac.Loader; using LibHac.Tools.FsSystem; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using System; using System.Text; @@ -29,13 +30,6 @@ namespace Ryujinx.HLE.Loaders.Executables public string Name; public Array32 BuildId; - [GeneratedRegex(@"[a-z]:[\\/][ -~]{5,}\.nss", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)] - private static partial Regex ModuleRegex(); - [GeneratedRegex(@"sdk_version: ([0-9.]*)")] - private static partial Regex FsSdkRegex(); - [GeneratedRegex(@"SDK MW[ -~]*")] - private static partial Regex SdkMwRegex(); - public NsoExecutable(IStorage inStorage, string name = null) { NsoReader reader = new(); @@ -65,7 +59,7 @@ namespace Ryujinx.HLE.Loaders.Executables { reader.GetSegmentSize(segmentType, out uint uncompressedSize).ThrowIfFailure(); - var span = Program.AsSpan((int)offset, (int)uncompressedSize); + Span span = Program.AsSpan((int)offset, (int)uncompressedSize); reader.ReadSegment(segmentType, span).ThrowIfFailure(); @@ -90,7 +84,7 @@ namespace Ryujinx.HLE.Loaders.Executables if (string.IsNullOrEmpty(modulePath)) { - Match moduleMatch = ModuleRegex().Match(rawTextBuffer); + Match moduleMatch = Patterns.Module.Match(rawTextBuffer); if (moduleMatch.Success) { modulePath = moduleMatch.Value; @@ -99,13 +93,13 @@ namespace Ryujinx.HLE.Loaders.Executables stringBuilder.AppendLine($" Module: {modulePath}"); - Match fsSdkMatch = FsSdkRegex().Match(rawTextBuffer); + Match fsSdkMatch = Patterns.FsSdk.Match(rawTextBuffer); if (fsSdkMatch.Success) { stringBuilder.AppendLine($" FS SDK Version: {fsSdkMatch.Value.Replace("sdk_version: ", string.Empty)}"); } - MatchCollection sdkMwMatches = SdkMwRegex().Matches(rawTextBuffer); + MatchCollection sdkMwMatches = Patterns.SdkMw.Matches(rawTextBuffer); if (sdkMwMatches.Count != 0) { string libHeader = " SDK Libraries: "; diff --git a/src/Ryujinx.HLE/Loaders/Mods/IPSPatcher.cs b/src/Ryujinx.HLE/Loaders/Mods/IPSPatcher.cs index cf316b565..d457682cf 100644 --- a/src/Ryujinx.HLE/Loaders/Mods/IPSPatcher.cs +++ b/src/Ryujinx.HLE/Loaders/Mods/IPSPatcher.cs @@ -25,7 +25,7 @@ namespace Ryujinx.HLE.Loaders.Mods ReadOnlySpan ips32TailMagic = "EEOF"u8; MemPatch patches = new(); - var header = reader.ReadBytes(ipsHeaderMagic.Length).AsSpan(); + Span header = reader.ReadBytes(ipsHeaderMagic.Length).AsSpan(); if (header.Length != ipsHeaderMagic.Length) { @@ -94,7 +94,7 @@ namespace Ryujinx.HLE.Loaders.Mods } else // Copy mode { - var patch = reader.ReadBytes(patchSize); + byte[] patch = reader.ReadBytes(patchSize); if (patch.Length != patchSize) { diff --git a/src/Ryujinx.HLE/Loaders/Mods/IPSwitchPatcher.cs b/src/Ryujinx.HLE/Loaders/Mods/IPSwitchPatcher.cs index 693e03888..70058fb43 100644 --- a/src/Ryujinx.HLE/Loaders/Mods/IPSwitchPatcher.cs +++ b/src/Ryujinx.HLE/Loaders/Mods/IPSwitchPatcher.cs @@ -94,15 +94,15 @@ namespace Ryujinx.HLE.Loaders.Mods static int ParseHexByte(byte c) { - if (c >= '0' && c <= '9') + if (c is >= (byte)'0' and <= (byte)'9') { return c - '0'; } - else if (c >= 'A' && c <= 'F') + else if (c is >= (byte)'A' and <= (byte)'F') { return c - 'A' + 10; } - else if (c >= 'a' && c <= 'f') + else if (c is >= (byte)'a' and <= (byte)'f') { return c - 'a' + 10; } @@ -200,7 +200,7 @@ namespace Ryujinx.HLE.Loaders.Mods } else if (line.StartsWith("@flag")) { - var tokens = line.Split(' ', 3, StringSplitOptions.RemoveEmptyEntries); + string[] tokens = line.Split(' ', 3, StringSplitOptions.RemoveEmptyEntries); if (tokens.Length < 2) { @@ -234,7 +234,7 @@ namespace Ryujinx.HLE.Loaders.Mods continue; } - var tokens = line.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries); + string[] tokens = line.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries); if (tokens.Length < 2) { @@ -259,12 +259,12 @@ namespace Ryujinx.HLE.Loaders.Mods if (tokens[1][0] == '"') { - var patch = Encoding.ASCII.GetBytes(tokens[1].Trim('"') + "\0"); + byte[] patch = Encoding.ASCII.GetBytes(tokens[1].Trim('"') + "\0"); patches.Add((uint)offset, patch); } else { - var patch = Hex2ByteArrayBE(tokens[1]); + byte[] patch = Hex2ByteArrayBE(tokens[1]); patches.Add((uint)offset, patch); } } diff --git a/src/Ryujinx.HLE/Loaders/Mods/MemPatch.cs b/src/Ryujinx.HLE/Loaders/Mods/MemPatch.cs index 0a1f12b18..d007861e9 100644 --- a/src/Ryujinx.HLE/Loaders/Mods/MemPatch.cs +++ b/src/Ryujinx.HLE/Loaders/Mods/MemPatch.cs @@ -46,7 +46,7 @@ namespace Ryujinx.HLE.Loaders.Mods return; } - foreach (var (patchOffset, patch) in patches._patches) + foreach ((uint patchOffset, byte[] patch) in patches._patches) { _patches[patchOffset] = patch; } @@ -66,21 +66,29 @@ namespace Ryujinx.HLE.Loaders.Mods public int Patch(Span memory, int protectedOffset = 0) { int count = 0; - foreach (var (offset, patch) in _patches.OrderBy(item => item.Key)) + foreach ((uint offset, byte[] patch) in _patches.OrderBy(item => item.Key)) { int patchOffset = (int)offset; int patchSize = patch.Length; - if (patchOffset < protectedOffset || patchOffset > memory.Length) + if (patchOffset < protectedOffset) { - continue; // Add warning? + Logger.Warning?.Print(LogClass.ModLoader, $"Attempted to patch protected memory ({patchOffset:x} is within protected boundary of {protectedOffset:x})."); + continue; + } + + if (patchOffset > memory.Length) + { + Logger.Warning?.Print(LogClass.ModLoader, $"Attempted to patch out of bounds memory (offset {patchOffset} ({patchOffset:x}) exceeds memory buffer length {memory.Length})."); + continue; } patchOffset -= protectedOffset; if (patchOffset + patchSize > memory.Length) { - patchSize = memory.Length - patchOffset; // Add warning? + Logger.Warning?.Print(LogClass.ModLoader, $"Patch offset ({patchOffset:x}) + size ({patchSize}) is greater than the size of the memory buffer ({memory.Length}). Attempting to fix this..."); + patchSize = memory.Length - patchOffset; } Logger.Info?.Print(LogClass.ModLoader, $"Patching address offset {patchOffset:x} <= {BitConverter.ToString(patch).Replace('-', ' ')} len={patchSize}"); diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs index cd215781f..23faca9d1 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/FileSystemExtensions.cs @@ -6,6 +6,7 @@ using LibHac.Ns; using LibHac.Tools.FsSystem; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; +using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.Loaders.Executables; using Ryujinx.Memory; using System; @@ -60,7 +61,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions Logger.Info?.Print(LogClass.Loader, $"Loading {name}..."); - using var nsoFile = new UniqueRef(); + using UniqueRef nsoFile = new(); exeFs.OpenFile(ref nsoFile.Ref, $"/{name}".ToU8Span(), OpenMode.Read).ThrowIfFailure(); @@ -82,13 +83,6 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions // Apply Nsos patches. device.Configuration.VirtualFileSystem.ModLoader.ApplyNsoPatches(programId, nsoExecutables); - // Don't use PTC if ExeFS files have been replaced. - bool enablePtc = device.System.EnablePtc && !modLoadResult.Modified; - if (!enablePtc) - { - Logger.Warning?.Print(LogClass.Ptc, "Detected unsupported ExeFs modifications. PTC disabled."); - } - string programName = string.Empty; if (!isHomebrew && programId > 0x010000000000FFFF) @@ -97,12 +91,18 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions if (string.IsNullOrWhiteSpace(programName)) { - programName = Array.Find(nacpData.Value.Title.ItemsRo.ToArray(), x => x.Name[0] != 0).NameString.ToString(); + foreach (ApplicationControlProperty.ApplicationTitle appTitle in nacpData.Value.Title) + { + if (appTitle.Name[0] != 0) + continue; + + programName = appTitle.NameString.ToString(); + } } } // Initialize GPU. - Graphics.Gpu.GraphicsConfig.TitleId = $"{programId:x16}"; + GraphicsConfig.TitleId = programId.ToString("X16"); device.Gpu.HostInitalized.Set(); if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible)) @@ -115,7 +115,8 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions device.System.KernelContext, metaLoader, nacpData, - enablePtc, + device.System.EnablePtc, + modLoadResult.Hash, true, programName, metaLoader.GetProgramId(), diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/LocalFileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/LocalFileSystemExtensions.cs index e3ae9bf5f..140be91b5 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/LocalFileSystemExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/LocalFileSystemExtensions.cs @@ -12,7 +12,7 @@ namespace Ryujinx.HLE.Loaders.Processes public static ProcessResult Load(this LocalFileSystem exeFs, Switch device, string romFsPath = "") { MetaLoader metaLoader = exeFs.GetNpdm(); - var nacpData = new BlitStruct(1); + BlitStruct nacpData = new(1); ulong programId = metaLoader.GetProgramId(); device.Configuration.VirtualFileSystem.ModLoader.CollectMods([programId]); diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs index 92e71cb5a..f6dab1583 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/MetaLoaderExtensions.cs @@ -12,21 +12,21 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions { public static ulong GetProgramId(this MetaLoader metaLoader) { - metaLoader.GetNpdm(out var npdm).ThrowIfFailure(); + metaLoader.GetNpdm(out LibHac.Loader.Npdm npdm).ThrowIfFailure(); return npdm.Aci.ProgramId.Value; } public static string GetProgramName(this MetaLoader metaLoader) { - metaLoader.GetNpdm(out var npdm).ThrowIfFailure(); + metaLoader.GetNpdm(out LibHac.Loader.Npdm npdm).ThrowIfFailure(); return StringUtils.Utf8ZToString(npdm.Meta.ProgramName); } public static bool IsProgram64Bit(this MetaLoader metaLoader) { - metaLoader.GetNpdm(out var npdm).ThrowIfFailure(); + metaLoader.GetNpdm(out LibHac.Loader.Npdm npdm).ThrowIfFailure(); return (npdm.Meta.Flags & 1) != 0; } @@ -45,7 +45,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions path = ProcessConst.MainNpdmPath; } - using var npdmFile = new UniqueRef(); + using UniqueRef npdmFile = new(); fileSystem.OpenFile(ref npdmFile.Ref, path.ToU8Span(), OpenMode.Read).ThrowIfFailure(); diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/NcaExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/NcaExtensions.cs index 2928ac7fe..be37078f5 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/NcaExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/NcaExtensions.cs @@ -26,7 +26,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions { private static readonly TitleUpdateMetadataJsonSerializerContext _applicationSerializerContext = new(JsonHelper.GetDefaultSerializerOptions()); - public static ProcessResult Load(this Nca nca, Switch device, Nca patchNca, Nca controlNca) + public static ProcessResult Load(this Nca nca, Switch device, Nca patchNca, Nca controlNca, BlitStruct? customNacpData = null) { // Extract RomFs and ExeFs from NCA. IStorage romFs = nca.GetRomFs(device, patchNca); @@ -49,12 +49,16 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions ModLoader.GetSdModsBasePath()); // Load Nacp file. - var nacpData = new BlitStruct(1); + BlitStruct nacpData = new(1); if (controlNca != null) { nacpData = controlNca.GetNacp(device); } + else if (customNacpData != null) // if the Application doesn't provide a nacp file but the Application provides an override, use the provided nacp override + { + nacpData = (BlitStruct)customNacpData; + } /* TODO: Rework this since it's wrong and doesn't work as it takes the DisplayVersion from a "potential" non-existent update. @@ -210,9 +214,9 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions public static BlitStruct GetNacp(this Nca controlNca, Switch device) { - var nacpData = new BlitStruct(1); + BlitStruct nacpData = new(1); - using var controlFile = new UniqueRef(); + using UniqueRef controlFile = new(); Result result = controlNca.OpenFileSystem(NcaSectionType.Data, device.System.FsIntegrityCheckLevel) .OpenFile(ref controlFile.Ref, "/control.nacp".ToU8Span(), OpenMode.Read); @@ -232,7 +236,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions public static Cnmt GetCnmt(this Nca cnmtNca, IntegrityCheckLevel checkLevel, ContentMetaType metaType) { string path = $"/{metaType}_{cnmtNca.Header.TitleId:x16}.cnmt"; - using var cnmtFile = new UniqueRef(); + using UniqueRef cnmtFile = new(); try { diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/PartitionFileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/PartitionFileSystemExtensions.cs index b3590d9bd..798b1f86f 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/PartitionFileSystemExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/PartitionFileSystemExtensions.cs @@ -28,7 +28,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions { fileSystem.ImportTickets(partitionFileSystem); - var programs = new Dictionary(); + Dictionary programs = new(); foreach (DirectoryEntryEx fileEntry in partitionFileSystem.EnumerateEntries("/", "*.cnmt.nca")) { @@ -152,7 +152,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions public static Nca GetNca(this IFileSystem fileSystem, KeySet keySet, string path) { - using var ncaFile = new UniqueRef(); + using UniqueRef ncaFile = new(); fileSystem.OpenFile(ref ncaFile.Ref, path.ToU8Span(), OpenMode.Read).ThrowIfFailure(); diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessConst.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessConst.cs index 778f9ce68..6fc6ece0a 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessConst.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessConst.cs @@ -4,7 +4,7 @@ namespace Ryujinx.HLE.Loaders.Processes { // Binaries from exefs are loaded into mem in this order. Do not change. public static readonly string[] ExeFsPrefixes = - { + [ "rtld", "main", "subsdk0", @@ -17,8 +17,8 @@ namespace Ryujinx.HLE.Loaders.Processes "subsdk7", "subsdk8", "subsdk9", - "sdk", - }; + "sdk" + ]; public const string MainNpdmPath = "/main.npdm"; diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs index a0e7e0fa1..48b5b724c 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs @@ -6,7 +6,10 @@ using LibHac.Ns; using LibHac.Tools.Fs; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; +using Ryujinx.Common; using Ryujinx.Common.Logging; +using Ryujinx.Graphics.Gpu; +using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.Loaders.Executables; using Ryujinx.HLE.Loaders.Processes.Extensions; using System; @@ -24,7 +27,17 @@ namespace Ryujinx.HLE.Loaders.Processes private ulong _latestPid; - public ProcessResult ActiveApplication => _processesByPid[_latestPid]; + public ProcessResult ActiveApplication + { + get + { + if (!_processesByPid.TryGetValue(_latestPid, out ProcessResult value)) + throw new RyujinxException( + $"The HLE Process map did not have a process with ID {_latestPid}. Are you missing firmware?"); + + return value; + } + } public ProcessLoader(Switch device) { @@ -59,6 +72,8 @@ namespace Ryujinx.HLE.Loaders.Processes { _latestPid = processResult.ProcessId; + TitleIDs.CurrentApplication.Value = processResult.ProgramIdText; + return true; } } @@ -86,6 +101,8 @@ namespace Ryujinx.HLE.Loaders.Processes { _latestPid = processResult.ProcessId; + TitleIDs.CurrentApplication.Value = processResult.ProgramIdText; + return true; } } @@ -98,12 +115,12 @@ namespace Ryujinx.HLE.Loaders.Processes return false; } - public bool LoadNca(string path) + public bool LoadNca(string path, BlitStruct? customNacpData = null) { FileStream file = new(path, FileMode.Open, FileAccess.Read); Nca nca = new(_device.Configuration.VirtualFileSystem.KeySet, file.AsStorage(false)); - ProcessResult processResult = nca.Load(_device, null, null); + ProcessResult processResult = nca.Load(_device, null, null, customNacpData); if (processResult.ProcessId != 0 && _processesByPid.TryAdd(processResult.ProcessId, processResult)) { @@ -113,6 +130,8 @@ namespace Ryujinx.HLE.Loaders.Processes if (processResult.ProgramId > 0x01000000000007FF) { _latestPid = processResult.ProcessId; + + TitleIDs.CurrentApplication.Value = processResult.ProgramIdText; } return true; @@ -132,6 +151,8 @@ namespace Ryujinx.HLE.Loaders.Processes { _latestPid = processResult.ProcessId; + TitleIDs.CurrentApplication.Value = processResult.ProgramIdText; + return true; } } @@ -141,7 +162,7 @@ namespace Ryujinx.HLE.Loaders.Processes public bool LoadNxo(string path) { - var nacpData = new BlitStruct(1); + BlitStruct nacpData = new(1); IFileSystem dummyExeFs = null; Stream romfsStream = null; @@ -151,7 +172,7 @@ namespace Ryujinx.HLE.Loaders.Processes // Load executable. IExecutable executable; - if (Path.GetExtension(path).ToLower() == ".nro") + if (Path.GetExtension(path).Equals(".nro", StringComparison.OrdinalIgnoreCase)) { FileStream input = new(path, FileMode.Open); NroExecutable nro = new(input.AsStorage()); @@ -175,22 +196,35 @@ namespace Ryujinx.HLE.Loaders.Processes programName = nacpData.Value.Title[(int)_device.System.State.DesiredTitleLanguage].NameString.ToString(); + if ("Switch Verification" == + nacpData.Value.Title[(int)TitleLanguage.AmericanEnglish].NameString.ToString()) + throw new InvalidOperationException(); + if (string.IsNullOrWhiteSpace(programName)) { - programName = Array.Find(nacpData.Value.Title.ItemsRo.ToArray(), x => x.Name[0] != 0).NameString.ToString(); + foreach (ApplicationControlProperty.ApplicationTitle nacpTitles in nacpData.Value.Title) + { + if (nacpTitles.Name[0] != 0) + continue; + + programName = nacpTitles.NameString.ToString(); + } } if (nacpData.Value.PresenceGroupId != 0) { programId = nacpData.Value.PresenceGroupId; + TitleIDs.CurrentApplication.Value = programId.ToString("X16"); } else if (nacpData.Value.SaveDataOwnerId != 0) { programId = nacpData.Value.SaveDataOwnerId; + TitleIDs.CurrentApplication.Value = programId.ToString("X16"); } else if (nacpData.Value.AddOnContentBaseId != 0) { programId = nacpData.Value.AddOnContentBaseId - 0x1000; + TitleIDs.CurrentApplication.Value = programId.ToString("X16"); } } @@ -204,7 +238,7 @@ namespace Ryujinx.HLE.Loaders.Processes } // Explicitly null TitleId to disable the shader cache. - Graphics.Gpu.GraphicsConfig.TitleId = null; + GraphicsConfig.TitleId = null; _device.Gpu.HostInitalized.Set(); ProcessResult processResult = ProcessLoaderHelper.LoadNsos(_device, @@ -212,6 +246,7 @@ namespace Ryujinx.HLE.Loaders.Processes dummyExeFs.GetNpdm(), nacpData, diskCacheEnabled: false, + diskCacheSelector: null, allowCodeMemoryForJit: true, programName, programId, diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs index 33aee1c4c..5729052e8 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoaderHelper.cs @@ -21,7 +21,6 @@ using Ryujinx.HLE.Loaders.Processes.Extensions; using Ryujinx.Horizon.Common; using Ryujinx.Horizon.Sdk.Arp; using System; -using System.Linq; using System.Runtime.InteropServices; using ApplicationId = LibHac.Ncm.ApplicationId; @@ -180,12 +179,13 @@ namespace Ryujinx.HLE.Loaders.Processes KProcess process = new(context); - var processContextFactory = new ArmProcessContextFactory( + ArmProcessContextFactory processContextFactory = new( context.Device.System.TickSource, context.Device.Gpu, string.Empty, string.Empty, false, + null, codeAddress, codeSize); @@ -226,16 +226,17 @@ namespace Ryujinx.HLE.Loaders.Processes MetaLoader metaLoader, BlitStruct applicationControlProperties, bool diskCacheEnabled, + string diskCacheSelector, bool allowCodeMemoryForJit, string name, ulong programId, byte programIndex, byte[] arguments = null, - params IExecutable[] executables) + params ReadOnlySpan executables) { context.Device.System.ServiceTable.WaitServicesReady(); - LibHac.Result resultCode = metaLoader.GetNpdm(out var npdm); + LibHac.Result resultCode = metaLoader.GetNpdm(out LibHac.Loader.Npdm npdm); if (resultCode.IsFailure()) { @@ -244,19 +245,24 @@ namespace Ryujinx.HLE.Loaders.Processes return ProcessResult.Failed; } - ref readonly var meta = ref npdm.Meta; + ref readonly Meta meta = ref npdm.Meta; ulong argsStart = 0; uint argsSize = 0; ulong codeStart = ((meta.Flags & 1) != 0 ? 0x8000000UL : 0x200000UL) + CodeStartOffset; uint codeSize = 0; - var buildIds = executables.Select(e => (e switch + string[] buildIds = new string[executables.Length]; + + for (int i = 0; i < executables.Length; i++) { - NsoExecutable nso => Convert.ToHexString(nso.BuildId.ItemsRo.ToArray()), - NroExecutable nro => Convert.ToHexString(nro.Header.BuildId), - _ => string.Empty - }).ToUpper()); + buildIds[i] = (executables[i] switch + { + NsoExecutable nso => Convert.ToHexString(nso.BuildId), + NroExecutable nro => Convert.ToHexString(nro.Header.BuildId), + _ => string.Empty + }).ToUpper(); + } ulong[] nsoBase = new ulong[executables.Length]; @@ -368,12 +374,13 @@ namespace Ryujinx.HLE.Loaders.Processes displayVersion = device.System.ContentManager.GetCurrentFirmwareVersion()?.VersionString ?? string.Empty; } - var processContextFactory = new ArmProcessContextFactory( + ArmProcessContextFactory processContextFactory = new( context.Device.System.TickSource, context.Device.Gpu, $"{programId:x16}", displayVersion, diskCacheEnabled, + diskCacheSelector, codeStart, codeSize); diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs index e187b2360..53ccddc68 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs @@ -59,7 +59,13 @@ namespace Ryujinx.HLE.Loaders.Processes if (string.IsNullOrWhiteSpace(Name)) { - Name = Array.Find(ApplicationControlProperties.Title.ItemsRo.ToArray(), x => x.Name[0] != 0).NameString.ToString(); + foreach (ApplicationControlProperty.ApplicationTitle appTitle in ApplicationControlProperties.Title) + { + if (appTitle.Name[0] != 0) + continue; + + Name = appTitle.NameString.ToString(); + } } DisplayVersion = ApplicationControlProperties.DisplayVersionString.ToString(); @@ -84,12 +90,19 @@ namespace Ryujinx.HLE.Loaders.Processes return false; } + bool isFirmware = ProgramId is >= 0x0100000000000819 and <= 0x010000000000081C; + bool isFirmwareApplication = ProgramId <= 0x0100000000007FFF; + + string name = !isFirmware + ? (isFirmwareApplication ? "Firmware Application " : string.Empty) + (!string.IsNullOrWhiteSpace(Name) ? Name : "") + : "Firmware"; + // TODO: LibHac npdm currently doesn't support version field. - string version = ProgramId > 0x0100000000007FFF - ? DisplayVersion + string version = !isFirmware + ? (!string.IsNullOrWhiteSpace(DisplayVersion) ? DisplayVersion : "") : device.System.ContentManager.GetCurrentFirmwareVersion()?.VersionString ?? "?"; - Logger.Info?.Print(LogClass.Loader, $"Application Loaded: {Name} v{version} [{ProgramIdText}] [{(Is64Bit ? "64-bit" : "32-bit")}]"); + Logger.Info?.Print(LogClass.Loader, $"Application Loaded: {name} v{version} [{ProgramIdText}] [{(Is64Bit ? "64-bit" : "32-bit")}]"); return true; } diff --git a/src/Ryujinx.HLE/PerformanceStatistics.cs b/src/Ryujinx.HLE/PerformanceStatistics.cs index 3767a7fb4..84b9eb05b 100644 --- a/src/Ryujinx.HLE/PerformanceStatistics.cs +++ b/src/Ryujinx.HLE/PerformanceStatistics.cs @@ -1,10 +1,13 @@ using Ryujinx.Common; +using System.Threading; using System.Timers; namespace Ryujinx.HLE { public class PerformanceStatistics { + private readonly Switch _device; + private const int FrameTypeGame = 0; private const int PercentTypeFifo = 0; @@ -20,15 +23,17 @@ namespace Ryujinx.HLE private readonly long[] _framesRendered; private readonly double[] _percentTime; - private readonly object[] _frameLock; - private readonly object[] _percentLock; + private readonly Lock[] _frameLock = [new()]; + private readonly Lock[] _percentLock = [new()]; private readonly double _ticksToSeconds; - private readonly Timer _resetTimer; + private readonly System.Timers.Timer _resetTimer; - public PerformanceStatistics() + public PerformanceStatistics(Switch device) { + _device = device; + _frameRate = new double[1]; _accumulatedFrameTime = new double[1]; _previousFrameTime = new double[1]; @@ -41,10 +46,7 @@ namespace Ryujinx.HLE _framesRendered = new long[1]; _percentTime = new double[1]; - _frameLock = new[] { new object() }; - _percentLock = new[] { new object() }; - - _resetTimer = new Timer(750); + _resetTimer = new(750); _resetTimer.Elapsed += ResetTimerElapsed; _resetTimer.AutoReset = true; @@ -163,5 +165,12 @@ namespace Ryujinx.HLE { return 1000 / _frameRate[FrameTypeGame]; } + + public string FormatFifoPercent() + { + double fifoPercent = GetFifoPercent(); + + return $"FIFO: {fifoPercent:00.00}%"; + } } } diff --git a/src/Ryujinx.HLE/Ryujinx.HLE.csproj b/src/Ryujinx.HLE/Ryujinx.HLE.csproj index 83e7b8810..5139d9276 100644 --- a/src/Ryujinx.HLE/Ryujinx.HLE.csproj +++ b/src/Ryujinx.HLE/Ryujinx.HLE.csproj @@ -1,7 +1,6 @@ - net8.0 true $(DefaultItemExcludes);._* @@ -24,7 +23,7 @@ - + @@ -49,6 +48,7 @@ + diff --git a/src/Ryujinx.HLE/StructHelpers.cs b/src/Ryujinx.HLE/StructHelpers.cs new file mode 100644 index 000000000..dc9c6d727 --- /dev/null +++ b/src/Ryujinx.HLE/StructHelpers.cs @@ -0,0 +1,37 @@ +using LibHac.Common; +using LibHac.Ns; +using System; +using System.Text; + +namespace Ryujinx.HLE +{ + public static class StructHelpers + { + public static BlitStruct CreateCustomNacpData(string name, string version) + { + // https://switchbrew.org/wiki/NACP + const int OffsetOfDisplayVersion = 0x3060; + + // https://switchbrew.org/wiki/NACP#ApplicationTitle + const int TotalApplicationTitles = 0x10; + const int SizeOfApplicationTitle = 0x300; + const int OffsetOfApplicationPublisherStrings = 0x200; + + + BlitStruct nacpData = new(1); + + // name and publisher buffer + // repeat once for each locale (the ApplicationControlProperty has 16 locales) + for (int i = 0; i < TotalApplicationTitles; i++) + { + Encoding.ASCII.GetBytes(name).AsSpan().CopyTo(nacpData.ByteSpan[(i * SizeOfApplicationTitle)..]); + "Ryujinx"u8.CopyTo(nacpData.ByteSpan[(i * SizeOfApplicationTitle + OffsetOfApplicationPublisherStrings)..]); + } + + // version buffer + Encoding.ASCII.GetBytes(version).AsSpan().CopyTo(nacpData.ByteSpan[OffsetOfDisplayVersion..]); + + return nacpData; + } + } +} diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs index 466352152..bdcbe82c7 100644 --- a/src/Ryujinx.HLE/Switch.cs +++ b/src/Ryujinx.HLE/Switch.cs @@ -1,6 +1,10 @@ +using LibHac.Common; +using LibHac.Ns; using Ryujinx.Audio.Backends.CompatLayer; using Ryujinx.Audio.Integration; +using Ryujinx.Common; using Ryujinx.Common.Configuration; +using Ryujinx.Cpu; using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; @@ -15,27 +19,41 @@ namespace Ryujinx.HLE { public class Switch : IDisposable { - public HLEConfiguration Configuration { get; } + public static Switch Shared { get; private set; } + + public HleConfiguration Configuration { get; } public IHardwareDeviceDriver AudioDeviceDriver { get; } public MemoryBlock Memory { get; } public GpuContext Gpu { get; } public VirtualFileSystem FileSystem { get; } public HOS.Horizon System { get; } + + public bool TurboMode = false; + + public long TickScalar + { + get => System?.TickSource?.TickScalar ?? ITickSource.RealityTickScalar; + set => System.TickSource.TickScalar = value; + } + public ProcessLoader Processes { get; } public PerformanceStatistics Statistics { get; } public Hid Hid { get; } public TamperMachine TamperMachine { get; } public IHostUIHandler UIHandler { get; } - public VSyncMode VSyncMode { get; set; } = VSyncMode.Switch; - public bool CustomVSyncIntervalEnabled { get; set; } = false; - public int CustomVSyncInterval { get; set; } + public int CpuCoresCount = 4; // Switch has a quad-core Tegra X1 SoC + public VSyncMode VSyncMode { get; set; } + public bool CustomVSyncIntervalEnabled { get; set; } + public int CustomVSyncInterval { get; set; } public long TargetVSyncInterval { get; set; } = 60; public bool IsFrameAvailable => Gpu.Window.IsFrameAvailable; - public Switch(HLEConfiguration configuration) + public DirtyHacks DirtyHacks { get; } + + public Switch(HleConfiguration configuration) { ArgumentNullException.ThrowIfNull(configuration.GpuRenderer); ArgumentNullException.ThrowIfNull(configuration.AudioDeviceDriver); @@ -50,11 +68,12 @@ namespace Ryujinx.HLE : MemoryAllocationFlags.Reserve | MemoryAllocationFlags.Mirrorable; #pragma warning disable IDE0055 // Disable formatting + DirtyHacks = new DirtyHacks(Configuration.Hacks); AudioDeviceDriver = new CompatLayerHardwareDeviceDriver(Configuration.AudioDeviceDriver); Memory = new MemoryBlock(Configuration.MemoryConfiguration.ToDramSize(), memoryAllocationFlags); - Gpu = new GpuContext(Configuration.GpuRenderer); + Gpu = new GpuContext(Configuration.GpuRenderer, DirtyHacks); System = new HOS.Horizon(this); - Statistics = new PerformanceStatistics(); + Statistics = new PerformanceStatistics(this); Hid = new Hid(this, System.HidStorage); Processes = new ProcessLoader(this); TamperMachine = new TamperMachine(); @@ -65,13 +84,17 @@ namespace Ryujinx.HLE VSyncMode = Configuration.VSyncMode; CustomVSyncInterval = Configuration.CustomVSyncInterval; + TickScalar = TurboMode ? Configuration.TickScalar : ITickSource.RealityTickScalar; System.State.DockedMode = Configuration.EnableDockedMode; System.PerformanceState.PerformanceMode = System.State.DockedMode ? PerformanceMode.Boost : PerformanceMode.Default; System.EnablePtc = Configuration.EnablePtc; System.FsIntegrityCheckLevel = Configuration.FsIntegrityCheckLevel; System.GlobalAccessLogMode = Configuration.FsGlobalAccessLogMode; + UpdateVSyncInterval(); #pragma warning restore IDE0055 + + Shared = this; } public void ProcessFrame() @@ -81,16 +104,20 @@ namespace Ryujinx.HLE Gpu.GPFifo.DispatchCalls(); } - public void IncrementCustomVSyncInterval() + public int IncrementCustomVSyncInterval() { CustomVSyncInterval += 1; UpdateVSyncInterval(); + + return CustomVSyncInterval; } - public void DecrementCustomVSyncInterval() + public int DecrementCustomVSyncInterval() { CustomVSyncInterval -= 1; UpdateVSyncInterval(); + + return CustomVSyncInterval; } public void UpdateVSyncInterval() @@ -109,9 +136,15 @@ namespace Ryujinx.HLE } } + public void ToggleTurbo() + { + TurboMode = !TurboMode; + TickScalar = TurboMode ? Configuration.TickScalar : ITickSource.RealityTickScalar; + } + public bool LoadCart(string exeFsDir, string romFsFile = null) => Processes.LoadUnpackedNca(exeFsDir, romFsFile); public bool LoadXci(string xciFile, ulong applicationId = 0) => Processes.LoadXci(xciFile, applicationId); - public bool LoadNca(string ncaFile) => Processes.LoadNca(ncaFile); + public bool LoadNca(string ncaFile, BlitStruct? customNacpData = null) => Processes.LoadNca(ncaFile, customNacpData); public bool LoadNsp(string nspFile, ulong applicationId = 0) => Processes.LoadNsp(nspFile, applicationId); public bool LoadProgram(string fileName) => Processes.LoadNxo(fileName); @@ -140,6 +173,9 @@ namespace Ryujinx.HLE AudioDeviceDriver.Dispose(); FileSystem.Dispose(); Memory.Dispose(); + + TitleIDs.CurrentApplication.Value = null; + Shared = null; } } } diff --git a/src/Ryujinx.HLE/UI/IHostUIHandler.cs b/src/Ryujinx.HLE/UI/IHostUIHandler.cs index 88af83735..b5c5cb168 100644 --- a/src/Ryujinx.HLE/UI/IHostUIHandler.cs +++ b/src/Ryujinx.HLE/UI/IHostUIHandler.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Applets; +using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; namespace Ryujinx.HLE.UI @@ -44,10 +45,12 @@ namespace Ryujinx.HLE.UI /// The value associated to the . void ExecuteProgram(Switch device, ProgramSpecifyKind kind, ulong value); + /// /// Displays a Message Dialog box specific to Error Applet and blocks until it is closed. /// /// False when OK is pressed, True when another button (Details) is pressed. - bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText); + // ReSharper disable once UnusedParameter.Global + bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText, (uint Module, uint Description)? errorCode = null); /// /// Creates a handler to process keyboard inputs into text strings. @@ -59,5 +62,11 @@ namespace Ryujinx.HLE.UI /// Gets fonts and colors used by the host. /// IHostUITheme HostUITheme { get; } + + + /// + /// Displays the player select dialog and returns the selected profile. + /// + UserProfile ShowPlayerSelectDialog(); } } diff --git a/src/Ryujinx.HLE/UI/Input/NpadReader.cs b/src/Ryujinx.HLE/UI/Input/NpadReader.cs index 8276d6160..8b4888a26 100644 --- a/src/Ryujinx.HLE/UI/Input/NpadReader.cs +++ b/src/Ryujinx.HLE/UI/Input/NpadReader.cs @@ -1,5 +1,7 @@ +using Ryujinx.Common.Memory; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Common; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad; +using System; namespace Ryujinx.HLE.UI.Input { @@ -29,7 +31,7 @@ namespace Ryujinx.HLE.UI.Input { NpadButton buttons = 0; - foreach (var state in _lastStates) + foreach (NpadCommonState state in _lastStates) { buttons |= state.Buttons; } @@ -60,7 +62,7 @@ namespace Ryujinx.HLE.UI.Input public void Update(bool supressEvents = false) { - ref var npads = ref _device.Hid.SharedMemory.Npads; + ref Array10 npads = ref _device.Hid.SharedMemory.Npads; // Process each input individually. for (int npadIndex = 0; npadIndex < npads.Length; npadIndex++) @@ -73,10 +75,10 @@ namespace Ryujinx.HLE.UI.Input { const int MaxEntries = 1024; - ref var npadState = ref _device.Hid.SharedMemory.Npads[npadIndex]; - ref var lastEntry = ref _lastStates[npadIndex]; + ref NpadState npadState = ref _device.Hid.SharedMemory.Npads[npadIndex]; + ref NpadCommonState lastEntry = ref _lastStates[npadIndex]; - var fullKeyEntries = GetCommonStateLifo(ref npadState.InternalState).ReadEntries(MaxEntries); + ReadOnlySpan> fullKeyEntries = GetCommonStateLifo(ref npadState.InternalState).ReadEntries(MaxEntries); int firstEntryNum; @@ -94,7 +96,7 @@ namespace Ryujinx.HLE.UI.Input for (; firstEntryNum >= 0; firstEntryNum--) { - var entry = fullKeyEntries[firstEntryNum]; + AtomicStorage entry = fullKeyEntries[firstEntryNum]; // The interval of valid entries should be contiguous. if (entry.SamplingNumber < lastEntry.SamplingNumber) diff --git a/src/Ryujinx.HLE/Utilities/PartitionFileSystemUtils.cs b/src/Ryujinx.HLE/Utilities/PartitionFileSystemUtils.cs index 3c4ce0850..e65fac438 100644 --- a/src/Ryujinx.HLE/Utilities/PartitionFileSystemUtils.cs +++ b/src/Ryujinx.HLE/Utilities/PartitionFileSystemUtils.cs @@ -16,13 +16,13 @@ namespace Ryujinx.HLE.Utilities IFileSystem partitionFileSystem; - if (Path.GetExtension(path).ToLower() == ".xci") + if (Path.GetExtension(path).Equals(".xci", System.StringComparison.OrdinalIgnoreCase)) { partitionFileSystem = new Xci(fileSystem.KeySet, file.AsStorage()).OpenPartition(XciPartitionType.Secure); } else { - var pfsTemp = new PartitionFileSystem(); + PartitionFileSystem pfsTemp = new(); Result initResult = pfsTemp.Initialize(file.AsStorage()); if (throwOnFailure) diff --git a/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj b/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj index 8fbf9be1e..fe535e6d5 100644 --- a/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj +++ b/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj @@ -1,7 +1,6 @@ - net8.0 win-x64;osx-x64;linux-x64 Exe true diff --git a/src/Ryujinx.Headless.SDL2/Ryujinx.bmp b/src/Ryujinx.Headless.SDL2/Ryujinx.bmp deleted file mode 100644 index 1daa7ce94..000000000 Binary files a/src/Ryujinx.Headless.SDL2/Ryujinx.bmp and /dev/null differ diff --git a/src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs b/src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs deleted file mode 100644 index c1dd3805f..000000000 --- a/src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace Ryujinx.Headless.SDL2 -{ - class StatusUpdatedEventArgs( - string vSyncMode, - string dockedMode, - string aspectRatio, - string gameStatus, - string fifoStatus, - string gpuName) - : EventArgs - { - public string VSyncMode = vSyncMode; - public string DockedMode = dockedMode; - public string AspectRatio = aspectRatio; - public string GameStatus = gameStatus; - public string FifoStatus = fifoStatus; - public string GpuName = gpuName; - } -} diff --git a/src/Ryujinx.Horizon.Common/IExternalEvent.cs b/src/Ryujinx.Horizon.Common/IExternalEvent.cs index dedf4c72a..2cb96bf31 100644 --- a/src/Ryujinx.Horizon.Common/IExternalEvent.cs +++ b/src/Ryujinx.Horizon.Common/IExternalEvent.cs @@ -1,5 +1,3 @@ -using System; - namespace Ryujinx.Horizon.Common { public interface IExternalEvent diff --git a/src/Ryujinx.Horizon.Common/Result.cs b/src/Ryujinx.Horizon.Common/Result.cs index 4b120b847..bcbfbecd2 100644 --- a/src/Ryujinx.Horizon.Common/Result.cs +++ b/src/Ryujinx.Horizon.Common/Result.cs @@ -9,7 +9,7 @@ namespace Ryujinx.Horizon.Common private const int ModuleMax = 1 << ModuleBits; private const int DescriptionMax = 1 << DescriptionBits; - public static Result Success { get; } = new Result(0, 0); + public static Result Success { get; } = new(0, 0); public int ErrorCode { get; } diff --git a/src/Ryujinx.Horizon.Common/ResultNames.cs b/src/Ryujinx.Horizon.Common/ResultNames.cs index 25d04b308..15e372c35 100644 --- a/src/Ryujinx.Horizon.Common/ResultNames.cs +++ b/src/Ryujinx.Horizon.Common/ResultNames.cs @@ -1,11 +1,12 @@ using System.Collections.Generic; +using System.Collections.ObjectModel; namespace Ryujinx.Horizon.Common { static class ResultNames { // Reference: https://github.com/Thealexbarney/LibHac/blob/master/build/CodeGen/results.csv - private static readonly IReadOnlyDictionary _names = new Dictionary() + private static readonly ReadOnlyDictionary _names = new Dictionary() { { 0x0, "Success" }, { 0xE01, "OutOfSessions" }, @@ -1691,7 +1692,7 @@ namespace Ryujinx.Horizon.Common { 0x823AC, "InvalidPackage1SectionSize" }, { 0x825AC, "InvalidPackage1MarikoBodySize" }, { 0x827AC, "InvalidPackage1Pk11Size" }, - }; + }.AsReadOnly(); public static bool TryGet(int errorCode, out string name) { diff --git a/src/Ryujinx.Horizon.Common/Ryujinx.Horizon.Common.csproj b/src/Ryujinx.Horizon.Common/Ryujinx.Horizon.Common.csproj index 00e0b1af9..b1caf6780 100644 --- a/src/Ryujinx.Horizon.Common/Ryujinx.Horizon.Common.csproj +++ b/src/Ryujinx.Horizon.Common/Ryujinx.Horizon.Common.csproj @@ -1,7 +1,6 @@ - net8.0 $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Horizon.Generators/Hipc/CommandInterface.cs b/src/Ryujinx.Horizon.Generators/Hipc/CommandInterface.cs index 2dcdfe5a2..8ed9669ba 100644 --- a/src/Ryujinx.Horizon.Generators/Hipc/CommandInterface.cs +++ b/src/Ryujinx.Horizon.Generators/Hipc/CommandInterface.cs @@ -11,7 +11,7 @@ namespace Ryujinx.Horizon.Generators.Hipc public CommandInterface(ClassDeclarationSyntax classDeclarationSyntax) { ClassDeclarationSyntax = classDeclarationSyntax; - CommandImplementations = new List(); + CommandImplementations = []; } } } diff --git a/src/Ryujinx.Horizon.Generators/Hipc/HipcGenerator.cs b/src/Ryujinx.Horizon.Generators/Hipc/HipcGenerator.cs index d1be8298d..2786c45aa 100644 --- a/src/Ryujinx.Horizon.Generators/Hipc/HipcGenerator.cs +++ b/src/Ryujinx.Horizon.Generators/Hipc/HipcGenerator.cs @@ -61,14 +61,14 @@ namespace Ryujinx.Horizon.Generators.Hipc { HipcSyntaxReceiver syntaxReceiver = (HipcSyntaxReceiver)context.SyntaxReceiver; - foreach (var commandInterface in syntaxReceiver.CommandInterfaces) + foreach (CommandInterface commandInterface in syntaxReceiver.CommandInterfaces) { if (!NeedsIServiceObjectImplementation(context.Compilation, commandInterface.ClassDeclarationSyntax)) { continue; } - CodeGenerator generator = new CodeGenerator(); + CodeGenerator generator = new(); string className = commandInterface.ClassDeclarationSyntax.Identifier.ToString(); generator.AppendLine("using Ryujinx.Horizon.Common;"); @@ -86,7 +86,7 @@ namespace Ryujinx.Horizon.Generators.Hipc GenerateMethodTable(generator, context.Compilation, commandInterface); - foreach (var method in commandInterface.CommandImplementations) + foreach (MethodDeclarationSyntax method in commandInterface.CommandImplementations) { generator.AppendLine(); @@ -102,7 +102,7 @@ namespace Ryujinx.Horizon.Generators.Hipc private static string GetNamespaceName(SyntaxNode syntaxNode) { - while (syntaxNode != null && !(syntaxNode is NamespaceDeclarationSyntax)) + while (syntaxNode is not null and not NamespaceDeclarationSyntax) { syntaxNode = syntaxNode.Parent; } @@ -127,9 +127,9 @@ namespace Ryujinx.Horizon.Generators.Hipc { generator.EnterScope($"return FrozenDictionary.ToFrozenDictionary(new []"); - foreach (var method in commandInterface.CommandImplementations) + foreach (MethodDeclarationSyntax method in commandInterface.CommandImplementations) { - foreach (var commandId in GetAttributeArguments(compilation, method, TypeCommandAttribute, 0)) + foreach (string commandId in GetAttributeArguments(compilation, method, TypeCommandAttribute, 0)) { string[] args = new string[method.ParameterList.Parameters.Count]; @@ -141,7 +141,7 @@ namespace Ryujinx.Horizon.Generators.Hipc { int index = 0; - foreach (var parameter in method.ParameterList.Parameters) + foreach (ParameterSyntax parameter in method.ParameterList.Parameters) { string canonicalTypeName = GetCanonicalTypeNameWithGenericArguments(compilation, parameter.Type); CommandArgType argType = GetCommandArgType(compilation, parameter); @@ -162,7 +162,7 @@ namespace Ryujinx.Horizon.Generators.Hipc arg = $"new CommandArg({bufferFlags})"; } } - else if (argType == CommandArgType.InArgument || argType == CommandArgType.OutArgument) + else if (argType is CommandArgType.InArgument or CommandArgType.OutArgument) { string alignment = GetTypeAlignmentExpression(compilation, parameter.Type); @@ -191,7 +191,7 @@ namespace Ryujinx.Horizon.Generators.Hipc { ISymbol symbol = compilation.GetSemanticModel(syntaxNode.SyntaxTree).GetDeclaredSymbol(syntaxNode); - foreach (var attribute in symbol.GetAttributes()) + foreach (AttributeData attribute in symbol.GetAttributes()) { if (attribute.AttributeClass.ToDisplayString() == attributeName && (uint)argIndex < (uint)attribute.ConstructorArguments.Length) { @@ -211,7 +211,7 @@ namespace Ryujinx.Horizon.Generators.Hipc int outObjectsCount = 0; int buffersCount = 0; - foreach (var parameter in method.ParameterList.Parameters) + foreach (ParameterSyntax parameter in method.ParameterList.Parameters) { if (IsObject(compilation, parameter)) { @@ -257,7 +257,7 @@ namespace Ryujinx.Horizon.Generators.Hipc generator.AppendLine(); } - List outParameters = new List(); + List outParameters = []; string[] args = new string[method.ParameterList.Parameters.Count]; @@ -285,7 +285,7 @@ namespace Ryujinx.Horizon.Generators.Hipc int inMoveHandleIndex = 0; int inObjectIndex = 0; - foreach (var parameter in method.ParameterList.Parameters) + foreach (ParameterSyntax parameter in method.ParameterList.Parameters) { string name = parameter.Identifier.Text; string argName = GetPrefixedArgName(name); @@ -353,6 +353,7 @@ namespace Ryujinx.Horizon.Generators.Hipc value = $"CommandSerialization.GetRef<{canonicalTypeName}>(processor.GetBufferRange({index}))"; isNonSpanBuffer = true; } + break; } @@ -470,7 +471,7 @@ namespace Ryujinx.Horizon.Generators.Hipc { if (outObjectsCount != 0) { - generator.AppendLine($"processor.SetOutObjects(ref context, {ResponseVariableName}, {OutObjectsVariableName});"); + generator.AppendLine($"HipcCommandProcessor.SetOutObjects(ref context, {ResponseVariableName}, {OutObjectsVariableName});"); } if (buffersCount != 0) @@ -555,11 +556,11 @@ namespace Ryujinx.Horizon.Generators.Hipc { ISymbol symbol = compilation.GetSemanticModel(syntaxNode.SyntaxTree).GetTypeInfo(syntaxNode).Type; - foreach (var attribute in symbol.GetAttributes()) + foreach (AttributeData attribute in symbol.GetAttributes()) { if (attribute.AttributeClass.ToDisplayString() == attributeName) { - foreach (var kv in attribute.NamedArguments) + foreach (KeyValuePair kv in attribute.NamedArguments) { if (kv.Key == argName) { @@ -764,9 +765,9 @@ namespace Ryujinx.Horizon.Generators.Hipc private static bool HasAttribute(Compilation compilation, ParameterSyntax parameterSyntax, string fullAttributeName) { - foreach (var attributeList in parameterSyntax.AttributeLists) + foreach (AttributeListSyntax attributeList in parameterSyntax.AttributeLists) { - foreach (var attribute in attributeList.Attributes) + foreach (AttributeSyntax attribute in attributeList.Attributes) { if (GetCanonicalTypeName(compilation, attribute) == fullAttributeName) { @@ -781,8 +782,8 @@ namespace Ryujinx.Horizon.Generators.Hipc private static bool NeedsIServiceObjectImplementation(Compilation compilation, ClassDeclarationSyntax classDeclarationSyntax) { ITypeSymbol type = compilation.GetSemanticModel(classDeclarationSyntax.SyntaxTree).GetDeclaredSymbol(classDeclarationSyntax); - var serviceObjectInterface = type.AllInterfaces.FirstOrDefault(x => x.ToDisplayString() == TypeIServiceObject); - var interfaceMember = serviceObjectInterface?.GetMembers().FirstOrDefault(x => x.Name == "GetCommandHandlers"); + INamedTypeSymbol serviceObjectInterface = type.AllInterfaces.FirstOrDefault(x => x.ToDisplayString() == TypeIServiceObject); + ISymbol interfaceMember = serviceObjectInterface?.GetMembers().FirstOrDefault(x => x.Name == "GetCommandHandlers"); // Return true only if the class implements IServiceObject but does not actually implement the method // that the interface defines, since this is the only case we want to handle, if the method already exists diff --git a/src/Ryujinx.Horizon.Generators/Hipc/HipcSyntaxReceiver.cs b/src/Ryujinx.Horizon.Generators/Hipc/HipcSyntaxReceiver.cs index 9b3421076..858b4a2a5 100644 --- a/src/Ryujinx.Horizon.Generators/Hipc/HipcSyntaxReceiver.cs +++ b/src/Ryujinx.Horizon.Generators/Hipc/HipcSyntaxReceiver.cs @@ -12,7 +12,7 @@ namespace Ryujinx.Horizon.Generators.Hipc public HipcSyntaxReceiver() { - CommandInterfaces = new List(); + CommandInterfaces = []; } public void OnVisitSyntaxNode(SyntaxNode syntaxNode) @@ -24,9 +24,9 @@ namespace Ryujinx.Horizon.Generators.Hipc return; } - CommandInterface commandInterface = new CommandInterface(classDeclaration); + CommandInterface commandInterface = new(classDeclaration); - foreach (var memberDeclaration in classDeclaration.Members) + foreach (MemberDeclarationSyntax memberDeclaration in classDeclaration.Members) { if (memberDeclaration is MethodDeclarationSyntax methodDeclaration) { @@ -44,7 +44,7 @@ namespace Ryujinx.Horizon.Generators.Hipc if (methodDeclaration.AttributeLists.Count != 0) { - foreach (var attributeList in methodDeclaration.AttributeLists) + foreach (AttributeListSyntax attributeList in methodDeclaration.AttributeLists) { if (attributeList.Attributes.Any(x => x.Name.ToString().Contains(attributeName))) { diff --git a/src/Ryujinx.Horizon.Kernel.Generators/SyscallGenerator.cs b/src/Ryujinx.Horizon.Kernel.Generators/SyscallGenerator.cs index 7419a839a..2a09001db 100644 --- a/src/Ryujinx.Horizon.Kernel.Generators/SyscallGenerator.cs +++ b/src/Ryujinx.Horizon.Kernel.Generators/SyscallGenerator.cs @@ -34,14 +34,14 @@ namespace Ryujinx.Horizon.Kernel.Generators private const string TypeResult = NamespaceHorizonCommon + "." + TypeResultName; private const string TypeExecutionContext = "IExecutionContext"; - private static readonly string[] _expectedResults = new string[] - { + private static readonly string[] _expectedResults = + [ $"{TypeResultName}.Success", $"{TypeKernelResultName}.TimedOut", $"{TypeKernelResultName}.Cancelled", $"{TypeKernelResultName}.PortRemoteClosed", $"{TypeKernelResultName}.InvalidState", - }; + ]; private readonly struct OutParameter { @@ -128,7 +128,7 @@ namespace Ryujinx.Horizon.Kernel.Generators { SyscallSyntaxReceiver syntaxReceiver = (SyscallSyntaxReceiver)context.SyntaxReceiver; - CodeGenerator generator = new CodeGenerator(); + CodeGenerator generator = new(); generator.AppendLine("using Ryujinx.Common.Logging;"); generator.AppendLine("using Ryujinx.Cpu;"); @@ -145,9 +145,9 @@ namespace Ryujinx.Horizon.Kernel.Generators GenerateResultCheckHelper(generator); generator.AppendLine(); - List syscalls = new List(); + List syscalls = []; - foreach (var method in syntaxReceiver.SvcImplementations) + foreach (MethodDeclarationSyntax method in syntaxReceiver.SvcImplementations) { GenerateMethod32(generator, context.Compilation, method); GenerateMethod64(generator, context.Compilation, method); @@ -200,13 +200,13 @@ namespace Ryujinx.Horizon.Kernel.Generators string[] args = new string[method.ParameterList.Parameters.Count]; int index = 0; - RegisterAllocatorA32 regAlloc = new RegisterAllocatorA32(); + RegisterAllocatorA32 regAlloc = new(); - List outParameters = new List(); - List logInArgs = new List(); - List logOutArgs = new List(); + List outParameters = []; + List logInArgs = []; + List logOutArgs = []; - foreach (var methodParameter in method.ParameterList.Parameters) + foreach (ParameterSyntax methodParameter in method.ParameterList.Parameters) { string name = methodParameter.Identifier.Text; string argName = GetPrefixedArgName(name); @@ -321,11 +321,11 @@ namespace Ryujinx.Horizon.Kernel.Generators int registerIndex = 0; int index = 0; - List outParameters = new List(); - List logInArgs = new List(); - List logOutArgs = new List(); + List outParameters = []; + List logInArgs = []; + List logOutArgs = []; - foreach (var methodParameter in method.ParameterList.Parameters) + foreach (ParameterSyntax methodParameter in method.ParameterList.Parameters) { string name = methodParameter.Identifier.Text; string argName = GetPrefixedArgName(name); @@ -468,7 +468,7 @@ namespace Ryujinx.Horizon.Kernel.Generators generator.EnterScope($"public static void Dispatch{suffix}(Syscall syscall, {TypeExecutionContext} context, int id)"); generator.EnterScope("switch (id)"); - foreach (var syscall in syscalls) + foreach (SyscallIdAndName syscall in syscalls) { generator.AppendLine($"case {syscall.Id}:"); generator.IncreaseIndentation(); @@ -492,12 +492,12 @@ namespace Ryujinx.Horizon.Kernel.Generators private static bool Is32BitInteger(string canonicalTypeName) { - return canonicalTypeName == TypeSystemInt32 || canonicalTypeName == TypeSystemUInt32; + return canonicalTypeName is TypeSystemInt32 or TypeSystemUInt32; } private static bool Is64BitInteger(string canonicalTypeName) { - return canonicalTypeName == TypeSystemInt64 || canonicalTypeName == TypeSystemUInt64; + return canonicalTypeName is TypeSystemInt64 or TypeSystemUInt64; } private static string GenerateCastFromUInt64(string value, string canonicalTargetTypeName, string targetTypeName) diff --git a/src/Ryujinx.Horizon.Kernel.Generators/SyscallSyntaxReceiver.cs b/src/Ryujinx.Horizon.Kernel.Generators/SyscallSyntaxReceiver.cs index 1542fed6a..1351bdfeb 100644 --- a/src/Ryujinx.Horizon.Kernel.Generators/SyscallSyntaxReceiver.cs +++ b/src/Ryujinx.Horizon.Kernel.Generators/SyscallSyntaxReceiver.cs @@ -11,12 +11,12 @@ namespace Ryujinx.Horizon.Kernel.Generators public SyscallSyntaxReceiver() { - SvcImplementations = new List(); + SvcImplementations = []; } public void OnVisitSyntaxNode(SyntaxNode syntaxNode) { - if (!(syntaxNode is ClassDeclarationSyntax classDeclaration) || classDeclaration.AttributeLists.Count == 0) + if (syntaxNode is not ClassDeclarationSyntax classDeclaration || classDeclaration.AttributeLists.Count == 0) { return; } @@ -27,7 +27,7 @@ namespace Ryujinx.Horizon.Kernel.Generators return; } - foreach (var memberDeclaration in classDeclaration.Members) + foreach (MemberDeclarationSyntax memberDeclaration in classDeclaration.Members) { if (memberDeclaration is MethodDeclarationSyntax methodDeclaration) { diff --git a/src/Ryujinx.Horizon/Bcat/Ipc/ServiceCreator.cs b/src/Ryujinx.Horizon/Bcat/Ipc/ServiceCreator.cs index 78114c51f..35967d274 100644 --- a/src/Ryujinx.Horizon/Bcat/Ipc/ServiceCreator.cs +++ b/src/Ryujinx.Horizon/Bcat/Ipc/ServiceCreator.cs @@ -39,9 +39,9 @@ namespace Ryujinx.Horizon.Bcat.Ipc [CmifCommand(1)] public Result CreateDeliveryCacheStorageService(out IDeliveryCacheStorageService service, [ClientProcessId] ulong pid) { - using var libHacService = new SharedRef(); + using SharedRef libHacService = new(); - var resultCode = _libHacService.Get.CreateDeliveryCacheStorageService(ref libHacService.Ref, pid); + LibHac.Result resultCode = _libHacService.Get.CreateDeliveryCacheStorageService(ref libHacService.Ref, pid); if (resultCode.IsSuccess()) { @@ -58,9 +58,9 @@ namespace Ryujinx.Horizon.Bcat.Ipc [CmifCommand(2)] public Result CreateDeliveryCacheStorageServiceWithApplicationId(out IDeliveryCacheStorageService service, ApplicationId applicationId) { - using var libHacService = new SharedRef(); + using SharedRef libHacService = new(); - var resultCode = _libHacService.Get.CreateDeliveryCacheStorageServiceWithApplicationId(ref libHacService.Ref, new LibHac.ApplicationId(applicationId.Id)); + LibHac.Result resultCode = _libHacService.Get.CreateDeliveryCacheStorageServiceWithApplicationId(ref libHacService.Ref, new LibHac.ApplicationId(applicationId.Id)); if (resultCode.IsSuccess()) { diff --git a/src/Ryujinx.Horizon/Bcat/Ipc/ServiceCreator/DeliveryCacheStorageService.cs b/src/Ryujinx.Horizon/Bcat/Ipc/ServiceCreator/DeliveryCacheStorageService.cs index ecbc4bdb7..356156fc1 100644 --- a/src/Ryujinx.Horizon/Bcat/Ipc/ServiceCreator/DeliveryCacheStorageService.cs +++ b/src/Ryujinx.Horizon/Bcat/Ipc/ServiceCreator/DeliveryCacheStorageService.cs @@ -22,9 +22,9 @@ namespace Ryujinx.Horizon.Bcat.Ipc [CmifCommand(0)] public Result CreateFileService(out IDeliveryCacheFileService service) { - using var libHacService = new SharedRef(); + using SharedRef libHacService = new(); - var resultCode = _libHacService.Get.CreateFileService(ref libHacService.Ref); + LibHac.Result resultCode = _libHacService.Get.CreateFileService(ref libHacService.Ref); if (resultCode.IsSuccess()) { @@ -41,9 +41,9 @@ namespace Ryujinx.Horizon.Bcat.Ipc [CmifCommand(1)] public Result CreateDirectoryService(out IDeliveryCacheDirectoryService service) { - using var libHacService = new SharedRef(); + using SharedRef libHacService = new(); - var resultCode = _libHacService.Get.CreateDirectoryService(ref libHacService.Ref); + LibHac.Result resultCode = _libHacService.Get.CreateDirectoryService(ref libHacService.Ref); if (resultCode.IsSuccess()) { diff --git a/src/Ryujinx.Horizon/HeapAllocator.cs b/src/Ryujinx.Horizon/HeapAllocator.cs index fc125387e..522387631 100644 --- a/src/Ryujinx.Horizon/HeapAllocator.cs +++ b/src/Ryujinx.Horizon/HeapAllocator.cs @@ -31,7 +31,7 @@ namespace Ryujinx.Horizon public HeapAllocator() { - _freeRanges = new List(); + _freeRanges = []; _currentHeapSize = 0; } @@ -67,7 +67,7 @@ namespace Ryujinx.Horizon { for (int i = 0; i < _freeRanges.Count; i++) { - var range = _freeRanges[i]; + Range range = _freeRanges[i]; ulong alignedOffset = BitUtils.AlignUp(range.Offset, alignment); ulong sizeDelta = alignedOffset - range.Offset; @@ -103,7 +103,7 @@ namespace Ryujinx.Horizon private void InsertFreeRange(ulong offset, ulong size) { - var range = new Range(offset, size); + Range range = new(offset, size); int index = _freeRanges.BinarySearch(range); if (index < 0) { @@ -116,7 +116,7 @@ namespace Ryujinx.Horizon private void InsertFreeRangeComingled(ulong offset, ulong size) { ulong endOffset = offset + size; - var range = new Range(offset, size); + Range range = new(offset, size); int index = _freeRanges.BinarySearch(range); if (index < 0) { diff --git a/src/Ryujinx.Horizon/HorizonStatic.cs b/src/Ryujinx.Horizon/HorizonStatic.cs index 305d54bd1..b0343a2cd 100644 --- a/src/Ryujinx.Horizon/HorizonStatic.cs +++ b/src/Ryujinx.Horizon/HorizonStatic.cs @@ -1,31 +1,37 @@ using Ryujinx.Horizon.Common; +using Ryujinx.Horizon.Prepo.Types; using Ryujinx.Memory; using System; +using System.Threading; namespace Ryujinx.Horizon { public static class HorizonStatic { - [ThreadStatic] - private static HorizonOptions _options; + internal static void HandlePlayReport(PlayReport report) => + new Thread(() => PlayReport?.Invoke(report)) + { + Name = "HLE.PlayReportEvent", + IsBackground = true, + Priority = ThreadPriority.AboveNormal + }.Start(); - [ThreadStatic] - private static ISyscallApi _syscall; + public static event Action PlayReport; - [ThreadStatic] - private static IVirtualMemoryManager _addressSpace; + [field: ThreadStatic] + public static HorizonOptions Options { get; private set; } - [ThreadStatic] - private static IThreadContext _threadContext; + [field: ThreadStatic] + public static ISyscallApi Syscall { get; private set; } - [ThreadStatic] - private static int _threadHandle; + [field: ThreadStatic] + public static IVirtualMemoryManager AddressSpace { get; private set; } - public static HorizonOptions Options => _options; - public static ISyscallApi Syscall => _syscall; - public static IVirtualMemoryManager AddressSpace => _addressSpace; - public static IThreadContext ThreadContext => _threadContext; - public static int CurrentThreadHandle => _threadHandle; + [field: ThreadStatic] + public static IThreadContext ThreadContext { get; private set; } + + [field: ThreadStatic] + public static int CurrentThreadHandle { get; private set; } public static void Register( HorizonOptions options, @@ -34,11 +40,11 @@ namespace Ryujinx.Horizon IThreadContext threadContext, int threadHandle) { - _options = options; - _syscall = syscallApi; - _addressSpace = addressSpace; - _threadContext = threadContext; - _threadHandle = threadHandle; + Options = options; + Syscall = syscallApi; + AddressSpace = addressSpace; + ThreadContext = threadContext; + CurrentThreadHandle = threadHandle; } } } diff --git a/src/Ryujinx.Horizon/MmNv/Ipc/Request.cs b/src/Ryujinx.Horizon/MmNv/Ipc/Request.cs index c53ca1866..a3b4e0f83 100644 --- a/src/Ryujinx.Horizon/MmNv/Ipc/Request.cs +++ b/src/Ryujinx.Horizon/MmNv/Ipc/Request.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Horizon.MmNv.Ipc { partial class Request : IRequest { - private readonly List _sessionList = new(); + private readonly List _sessionList = []; private uint _uniqueId = 1; diff --git a/src/Ryujinx.Horizon/Prepo/Ipc/PrepoService.cs b/src/Ryujinx.Horizon/Prepo/Ipc/PrepoService.cs index 4ed7dd48e..8336adb18 100644 --- a/src/Ryujinx.Horizon/Prepo/Ipc/PrepoService.cs +++ b/src/Ryujinx.Horizon/Prepo/Ipc/PrepoService.cs @@ -17,12 +17,6 @@ namespace Ryujinx.Horizon.Prepo.Ipc { partial class PrepoService : IPrepoService { - enum PlayReportKind - { - Normal, - System, - } - private readonly ArpApi _arp; private readonly PrepoServicePermissionLevel _permissionLevel; private ulong _systemSessionId; @@ -137,7 +131,7 @@ namespace Ryujinx.Horizon.Prepo.Ipc { enabled = false; - if (_permissionLevel == PrepoServicePermissionLevel.User || _permissionLevel == PrepoServicePermissionLevel.System) + if (_permissionLevel is PrepoServicePermissionLevel.User or PrepoServicePermissionLevel.System) { enabled = _userAgreementCheckEnabled; @@ -154,7 +148,7 @@ namespace Ryujinx.Horizon.Prepo.Ipc [CmifCommand(40101)] // 2.0.0+ public Result SetUserAgreementCheckEnabled(bool enabled) { - if (_permissionLevel == PrepoServicePermissionLevel.User || _permissionLevel == PrepoServicePermissionLevel.System) + if (_permissionLevel is PrepoServicePermissionLevel.User or PrepoServicePermissionLevel.System) { _userAgreementCheckEnabled = enabled; @@ -198,6 +192,13 @@ namespace Ryujinx.Horizon.Prepo.Ipc StringBuilder builder = new(); MessagePackObject deserializedReport = MessagePackSerializer.UnpackMessagePackObject(reportBuffer.ToArray()); + PlayReport playReport = new() + { + Kind = playReportKind, + Room = gameRoom, + ReportData = deserializedReport + }; + builder.AppendLine(); builder.AppendLine("PlayReport log:"); builder.AppendLine($" Kind: {playReportKind}"); @@ -207,10 +208,12 @@ namespace Ryujinx.Horizon.Prepo.Ipc if (pid != 0) { builder.AppendLine($" Pid: {pid}"); + playReport.Pid = pid; } else { builder.AppendLine($" ApplicationId: {applicationId}"); + playReport.AppId = applicationId; } Result result = _arp.GetApplicationInstanceId(out ulong applicationInstanceId, pid); @@ -221,16 +224,21 @@ namespace Ryujinx.Horizon.Prepo.Ipc _arp.GetApplicationLaunchProperty(out ApplicationLaunchProperty applicationLaunchProperty, applicationInstanceId).AbortOnFailure(); + playReport.Version = applicationLaunchProperty.Version; + builder.AppendLine($" ApplicationVersion: {applicationLaunchProperty.Version}"); if (!userId.IsNull) { builder.AppendLine($" UserId: {userId}"); + playReport.UserId = userId; } builder.AppendLine($" Room: {gameRoom}"); builder.AppendLine($" Report: {MessagePackObjectFormatter.Format(deserializedReport)}"); + HorizonStatic.HandlePlayReport(playReport); + Logger.Info?.Print(LogClass.ServicePrepo, builder.ToString()); return Result.Success; diff --git a/src/Ryujinx.Horizon/Prepo/Types/PlayReport.cs b/src/Ryujinx.Horizon/Prepo/Types/PlayReport.cs new file mode 100644 index 000000000..54106eaea --- /dev/null +++ b/src/Ryujinx.Horizon/Prepo/Types/PlayReport.cs @@ -0,0 +1,24 @@ +using MsgPack; +using Ryujinx.Horizon.Sdk.Account; +using Ryujinx.Horizon.Sdk.Ncm; + +namespace Ryujinx.Horizon.Prepo.Types +{ + public struct PlayReport + { + public PlayReportKind Kind { get; init; } + public string Room { get; init; } + public MessagePackObject ReportData { get; init; } + + public ApplicationId? AppId; + public ulong? Pid; + public uint Version; + public Uid? UserId; + } + + public enum PlayReportKind + { + Normal, + System, + } +} diff --git a/src/Ryujinx.Horizon/Ryujinx.Horizon.csproj b/src/Ryujinx.Horizon/Ryujinx.Horizon.csproj index 18c639d67..5ee37b7fa 100644 --- a/src/Ryujinx.Horizon/Ryujinx.Horizon.csproj +++ b/src/Ryujinx.Horizon/Ryujinx.Horizon.csproj @@ -1,7 +1,6 @@ - net8.0 $(DefaultItemExcludes);._* @@ -15,6 +14,6 @@ - + diff --git a/src/Ryujinx.Horizon/Sdk/Arp/ArpApi.cs b/src/Ryujinx.Horizon/Sdk/Arp/ArpApi.cs index b0acc0062..d8a79cbc8 100644 --- a/src/Ryujinx.Horizon/Sdk/Arp/ArpApi.cs +++ b/src/Ryujinx.Horizon/Sdk/Arp/ArpApi.cs @@ -25,7 +25,7 @@ namespace Ryujinx.Horizon.Sdk.Arp { if (_sessionHandle == 0) { - using var smApi = new SmApi(); + using SmApi smApi = new(); smApi.Initialize(); smApi.GetServiceHandle(out _sessionHandle, ServiceName.Encode(ArpRName)).AbortOnFailure(); @@ -100,8 +100,8 @@ namespace Ryujinx.Horizon.Sdk.Arp 1, sendPid: false, data, - stackalloc[] { HipcBufferFlags.Out | HipcBufferFlags.MapAlias | HipcBufferFlags.FixedSize }, - stackalloc[] { new PointerAndSize(bufferAddress, bufferSize) }); + [HipcBufferFlags.Out | HipcBufferFlags.MapAlias | HipcBufferFlags.FixedSize], + [new PointerAndSize(bufferAddress, bufferSize)]); if (result.IsFailure) { diff --git a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioDevice.cs b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioDevice.cs index 2d3aa7ba9..583a04de3 100644 --- a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioDevice.cs +++ b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioDevice.cs @@ -121,7 +121,7 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail if (!_isUsbDeviceSupported && device.IsUsbDevice()) { - device = _registry.DefaultDevice; + device = VirtualDeviceSessionRegistry.DefaultDevice; } if (name.Length > 0) @@ -147,7 +147,7 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail if (!_isUsbDeviceSupported && device.IsUsbDevice()) { - device = _registry.DefaultDevice; + device = VirtualDeviceSessionRegistry.DefaultDevice; } channelCount = (int)device.ChannelCount; diff --git a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioInManager.cs b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioInManager.cs index d5d047201..64394b251 100644 --- a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioInManager.cs +++ b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioInManager.cs @@ -5,6 +5,7 @@ using Ryujinx.Horizon.Common; using Ryujinx.Horizon.Sdk.Applet; using Ryujinx.Horizon.Sdk.Sf; using Ryujinx.Horizon.Sdk.Sf.Hipc; +using Ryujinx.Memory; using System; namespace Ryujinx.Horizon.Sdk.Audio.Detail @@ -21,7 +22,7 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail [CmifCommand(0)] public Result ListAudioIns(out int count, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span names) { - string[] deviceNames = _impl.ListAudioIns(filtered: false); + string[] deviceNames = AudioInputManager.ListAudioIns(filtered: false); count = 0; @@ -49,7 +50,7 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail [Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias)] ReadOnlySpan name, [ClientProcessId] ulong pid) { - var clientMemoryManager = HorizonStatic.Syscall.GetMemoryManagerByProcessHandle(processHandle); + IVirtualMemoryManager clientMemoryManager = HorizonStatic.Syscall.GetMemoryManagerByProcessHandle(processHandle); ResultCode rc = _impl.OpenAudioIn( out string outputDeviceName, @@ -93,7 +94,7 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail [CmifCommand(4)] // 3.0.0+ public Result ListAudioInsAutoFiltered(out int count, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.AutoSelect)] Span names) { - string[] deviceNames = _impl.ListAudioIns(filtered: true); + string[] deviceNames = AudioInputManager.ListAudioIns(filtered: true); count = 0; diff --git a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioOutManager.cs b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioOutManager.cs index 3d129470c..37e51b042 100644 --- a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioOutManager.cs +++ b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioOutManager.cs @@ -5,6 +5,7 @@ using Ryujinx.Horizon.Common; using Ryujinx.Horizon.Sdk.Applet; using Ryujinx.Horizon.Sdk.Sf; using Ryujinx.Horizon.Sdk.Sf.Hipc; +using Ryujinx.Memory; using System; namespace Ryujinx.Horizon.Sdk.Audio.Detail @@ -21,7 +22,7 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail [CmifCommand(0)] public Result ListAudioOuts(out int count, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span names) { - string[] deviceNames = _impl.ListAudioOuts(); + string[] deviceNames = AudioOutputManager.ListAudioOuts(); count = 0; @@ -49,7 +50,7 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail [Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias)] ReadOnlySpan name, [ClientProcessId] ulong pid) { - var clientMemoryManager = HorizonStatic.Syscall.GetMemoryManagerByProcessHandle(processHandle); + IVirtualMemoryManager clientMemoryManager = HorizonStatic.Syscall.GetMemoryManagerByProcessHandle(processHandle); ResultCode rc = _impl.OpenAudioOut( out string outputDeviceName, diff --git a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRenderer.cs b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRenderer.cs index 4d446bba7..84c88d13b 100644 --- a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRenderer.cs +++ b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRenderer.cs @@ -1,7 +1,6 @@ using Ryujinx.Audio; using Ryujinx.Audio.Integration; using Ryujinx.Audio.Renderer.Server; -using Ryujinx.Common.Memory; using Ryujinx.Horizon.Common; using Ryujinx.Horizon.Sdk.Sf; using Ryujinx.Horizon.Sdk.Sf.Hipc; @@ -64,7 +63,7 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail using MemoryHandle outputHandle = output.Pin(); using MemoryHandle performanceOutputHandle = performanceOutput.Pin(); - Result result = new Result((int)_renderSystem.Update(output, performanceOutput, input)); + Result result = new((int)_renderSystem.Update(output, performanceOutput, input)); return result; } diff --git a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRendererManager.cs b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRendererManager.cs index 7138d27ce..40cbecc40 100644 --- a/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRendererManager.cs +++ b/src/Ryujinx.Horizon/Sdk/Audio/Detail/AudioRendererManager.cs @@ -4,6 +4,7 @@ using Ryujinx.Common.Logging; using Ryujinx.Horizon.Common; using Ryujinx.Horizon.Sdk.Applet; using Ryujinx.Horizon.Sdk.Sf; +using Ryujinx.Memory; namespace Ryujinx.Horizon.Sdk.Audio.Detail { @@ -30,11 +31,11 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail AppletResourceUserId appletResourceId, [ClientProcessId] ulong pid) { - var clientMemoryManager = HorizonStatic.Syscall.GetMemoryManagerByProcessHandle(processHandle); + IVirtualMemoryManager clientMemoryManager = HorizonStatic.Syscall.GetMemoryManagerByProcessHandle(processHandle); ulong workBufferAddress = HorizonStatic.Syscall.GetTransferMemoryAddress(workBufferHandle); - Result result = new Result((int)_impl.OpenAudioRenderer( - out var renderSystem, + Result result = new((int)_impl.OpenAudioRenderer( + out AudioRenderSystem renderSystem, clientMemoryManager, ref parameter.Configuration, appletResourceId.Id, @@ -96,10 +97,10 @@ namespace Ryujinx.Horizon.Sdk.Audio.Detail AppletResourceUserId appletResourceId, [ClientProcessId] ulong pid) { - var clientMemoryManager = HorizonStatic.Syscall.GetMemoryManagerByProcessHandle(processHandle); + IVirtualMemoryManager clientMemoryManager = HorizonStatic.Syscall.GetMemoryManagerByProcessHandle(processHandle); - Result result = new Result((int)_impl.OpenAudioRenderer( - out var renderSystem, + Result result = new((int)_impl.OpenAudioRenderer( + out AudioRenderSystem renderSystem, clientMemoryManager, ref parameter.Configuration, appletResourceId.Id, diff --git a/src/Ryujinx.Horizon/Sdk/Codec/Detail/HardwareOpusDecoderManager.cs b/src/Ryujinx.Horizon/Sdk/Codec/Detail/HardwareOpusDecoderManager.cs index acec66e82..9c981b765 100644 --- a/src/Ryujinx.Horizon/Sdk/Codec/Detail/HardwareOpusDecoderManager.cs +++ b/src/Ryujinx.Horizon/Sdk/Codec/Detail/HardwareOpusDecoderManager.cs @@ -2,7 +2,6 @@ using Ryujinx.Common; using Ryujinx.Horizon.Common; using Ryujinx.Horizon.Sdk.Sf; using Ryujinx.Horizon.Sdk.Sf.Hipc; -using System; namespace Ryujinx.Horizon.Sdk.Codec.Detail { @@ -230,7 +229,7 @@ namespace Ryujinx.Horizon.Sdk.Codec.Detail return GetWorkBufferSizeForMultiStreamExImpl(out size, in parameter, fromDsp: true); } - private Result GetWorkBufferSizeExImpl(out int size, in HardwareOpusDecoderParameterInternalEx parameter, bool fromDsp) + private static Result GetWorkBufferSizeExImpl(out int size, in HardwareOpusDecoderParameterInternalEx parameter, bool fromDsp) { size = 0; @@ -254,7 +253,7 @@ namespace Ryujinx.Horizon.Sdk.Codec.Detail return Result.Success; } - private Result GetWorkBufferSizeForMultiStreamExImpl(out int size, in HardwareOpusMultiStreamDecoderParameterInternalEx parameter, bool fromDsp) + private static Result GetWorkBufferSizeForMultiStreamExImpl(out int size, in HardwareOpusMultiStreamDecoderParameterInternalEx parameter, bool fromDsp) { size = 0; @@ -306,7 +305,7 @@ namespace Ryujinx.Horizon.Sdk.Codec.Detail { const int SilkDecoderSize = 0x2160; - if (channelsCount < 1 || channelsCount > 2) + if (channelsCount is < 1 or > 2) { return 0; } @@ -352,12 +351,12 @@ namespace Ryujinx.Horizon.Sdk.Codec.Detail private static bool IsValidChannelCount(int channelsCount) { - return channelsCount > 0 && channelsCount <= 2; + return channelsCount is > 0 and <= 2; } private static bool IsValidMultiChannelCount(int channelsCount) { - return channelsCount > 0 && channelsCount <= 255; + return channelsCount is > 0 and <= 255; } private static bool IsValidSampleRate(int sampleRate) diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/BlockedUserImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/BlockedUserImpl.cs index d5f8a0313..a7ede259f 100644 --- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/BlockedUserImpl.cs +++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/BlockedUserImpl.cs @@ -1,5 +1,3 @@ -using System.Runtime.InteropServices; - namespace Ryujinx.Horizon.Sdk.Friends.Detail { struct BlockedUserImpl diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendCandidateImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendCandidateImpl.cs index 21e99c754..1051343d6 100644 --- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendCandidateImpl.cs +++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendCandidateImpl.cs @@ -1,5 +1,3 @@ -using System.Runtime.InteropServices; - namespace Ryujinx.Horizon.Sdk.Friends.Detail { struct FriendCandidateImpl diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendInvitationForViewerImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendInvitationForViewerImpl.cs index 416ba3655..06134f245 100644 --- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendInvitationForViewerImpl.cs +++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendInvitationForViewerImpl.cs @@ -1,5 +1,3 @@ -using System.Runtime.InteropServices; - namespace Ryujinx.Horizon.Sdk.Friends.Detail { struct FriendInvitationForViewerImpl diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendRequestImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendRequestImpl.cs index ba5671692..108b56008 100644 --- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendRequestImpl.cs +++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/FriendRequestImpl.cs @@ -1,5 +1,3 @@ -using System.Runtime.InteropServices; - namespace Ryujinx.Horizon.Sdk.Friends.Detail { struct FriendRequestImpl diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/NotificationService.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/NotificationService.cs index 534bf63ed..d9ad40c94 100644 --- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/NotificationService.cs +++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/NotificationService.cs @@ -4,6 +4,7 @@ using Ryujinx.Horizon.Sdk.OsTypes; using Ryujinx.Horizon.Sdk.Sf; using System; using System.Collections.Generic; +using System.Threading; namespace Ryujinx.Horizon.Sdk.Friends.Detail.Ipc { @@ -13,7 +14,7 @@ namespace Ryujinx.Horizon.Sdk.Friends.Detail.Ipc private readonly Uid _userId; private readonly FriendsServicePermissionLevel _permissionLevel; - private readonly object _lock = new(); + private readonly Lock _lock = new(); private SystemEventType _notificationEvent; @@ -27,7 +28,7 @@ namespace Ryujinx.Horizon.Sdk.Friends.Detail.Ipc _notificationEventHandler = notificationEventHandler; _userId = userId; _permissionLevel = permissionLevel; - _notifications = new LinkedList(); + _notifications = []; Os.CreateSystemEvent(out _notificationEvent, EventClearMode.AutoClear, interProcess: true).AbortOnFailure(); _hasNewFriendRequest = false; diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/NintendoNetworkIdFriendImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/NintendoNetworkIdFriendImpl.cs index 66d61e4c1..7b7460481 100644 --- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/NintendoNetworkIdFriendImpl.cs +++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/NintendoNetworkIdFriendImpl.cs @@ -1,5 +1,3 @@ -using System.Runtime.InteropServices; - namespace Ryujinx.Horizon.Sdk.Friends.Detail { struct NintendoNetworkIdFriendImpl diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/PlayHistoryImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/PlayHistoryImpl.cs index 9f90f0c8f..37f4d7c2d 100644 --- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/PlayHistoryImpl.cs +++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/PlayHistoryImpl.cs @@ -1,5 +1,3 @@ -using System.Runtime.InteropServices; - namespace Ryujinx.Horizon.Sdk.Friends.Detail { struct PlayHistoryImpl diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/ProfileImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/ProfileImpl.cs index f779d93cf..422f814ce 100644 --- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/ProfileImpl.cs +++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/ProfileImpl.cs @@ -1,5 +1,3 @@ -using System.Runtime.InteropServices; - namespace Ryujinx.Horizon.Sdk.Friends.Detail { struct ProfileImpl diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/SnsAccountFriendImpl.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/SnsAccountFriendImpl.cs index dc6adf03a..f3d0cdce3 100644 --- a/src/Ryujinx.Horizon/Sdk/Friends/Detail/SnsAccountFriendImpl.cs +++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/SnsAccountFriendImpl.cs @@ -1,5 +1,3 @@ -using System.Runtime.InteropServices; - namespace Ryujinx.Horizon.Sdk.Friends.Detail { struct SnsAccountFriendImpl diff --git a/src/Ryujinx.Horizon/Sdk/Friends/FriendInvitationId.cs b/src/Ryujinx.Horizon/Sdk/Friends/FriendInvitationId.cs index 7be19d574..46e734ed2 100644 --- a/src/Ryujinx.Horizon/Sdk/Friends/FriendInvitationId.cs +++ b/src/Ryujinx.Horizon/Sdk/Friends/FriendInvitationId.cs @@ -1,5 +1,3 @@ -using System.Runtime.InteropServices; - namespace Ryujinx.Horizon.Sdk.Friends { struct FriendInvitationId diff --git a/src/Ryujinx.Horizon/Sdk/Lbl/LblApi.cs b/src/Ryujinx.Horizon/Sdk/Lbl/LblApi.cs index a5622d4aa..e55dd75be 100644 --- a/src/Ryujinx.Horizon/Sdk/Lbl/LblApi.cs +++ b/src/Ryujinx.Horizon/Sdk/Lbl/LblApi.cs @@ -12,7 +12,7 @@ namespace Ryujinx.Horizon.Sdk.Lbl public LblApi() { - using var smApi = new SmApi(); + using SmApi smApi = new(); smApi.Initialize(); smApi.GetServiceHandle(out _sessionHandle, ServiceName.Encode(LblName)).AbortOnFailure(); diff --git a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/CompressedArray.cs b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/CompressedArray.cs index fc5cd683d..899ea57f5 100644 --- a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/CompressedArray.cs +++ b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/CompressedArray.cs @@ -35,13 +35,13 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail { get { - var ranges = GetBitfieldRanges(); + ReadOnlySpan ranges = GetBitfieldRanges(); int rangeBlockIndex = index / CompressedEntriesPerBlock; if (rangeBlockIndex < ranges.Length) { - var range = ranges[rangeBlockIndex]; + BitfieldRange range = ranges[rangeBlockIndex]; int bitfieldLength = range.BitfieldLength; int bitfieldOffset = (index % CompressedEntriesPerBlock) * bitfieldLength; diff --git a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ContentsReader.cs b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ContentsReader.cs index 6a0fc4f9e..0f84a2c62 100644 --- a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ContentsReader.cs +++ b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ContentsReader.cs @@ -3,6 +3,7 @@ using Ryujinx.Horizon.Sdk.Fs; using System; using System.IO; using System.IO.Compression; +using System.Threading; namespace Ryujinx.Horizon.Sdk.Ngc.Detail { @@ -22,13 +23,12 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail } private readonly IFsClient _fsClient; - private readonly object _lock; + private readonly Lock _lock = new(); private bool _intialized; private ulong _cacheSize; public ContentsReader(IFsClient fsClient) { - _lock = new(); _fsClient = fsClient; } @@ -47,6 +47,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail { path = $"{MountName}:/ac_{regionIndex}_not_b_nx"; } + break; case AcType.AcB1: if (regionIndex < 0) @@ -57,6 +58,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail { path = $"{MountName}:/ac_{regionIndex}_b1_nx"; } + break; case AcType.AcB2: if (regionIndex < 0) @@ -67,6 +69,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail { path = $"{MountName}:/ac_{regionIndex}_b2_nx"; } + break; case AcType.AcSimilarForm: path = $"{MountName}:/ac_similar_form_nx"; diff --git a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/EmbeddedTries.cs b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/EmbeddedTries.cs index 37ee43fa3..4f987cca8 100644 --- a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/EmbeddedTries.cs +++ b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/EmbeddedTries.cs @@ -4,8 +4,8 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail { static class EmbeddedTries { - public static ReadOnlySpan NotSeparatorTrie => new byte[] - { + public static ReadOnlySpan NotSeparatorTrie => + [ 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, @@ -260,7 +260,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, - 0x0C, 0x0E, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x00, 0x02, 0x04, 0x06, 0x08, - }; + 0x0C, 0x0E, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x00, 0x02, 0x04, 0x06, 0x08 + ]; } } diff --git a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/MatchRangeList.cs b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/MatchRangeList.cs index 91600f981..23e4997db 100644 --- a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/MatchRangeList.cs +++ b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/MatchRangeList.cs @@ -28,7 +28,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail { _capacity = 0; _count = 0; - _ranges = Array.Empty(); + _ranges = []; } public void Add(int startOffset, int endOffset) diff --git a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ProfanityFilterBase.cs b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ProfanityFilterBase.cs index acfdd9041..3046be228 100644 --- a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ProfanityFilterBase.cs +++ b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/ProfanityFilterBase.cs @@ -8,90 +8,89 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail { abstract class ProfanityFilterBase { -#pragma warning disable IDE0230 // Use UTF-8 string literal - private static readonly byte[][] _wordSeparators = { - new byte[] { 0x0D }, - new byte[] { 0x0A }, - new byte[] { 0xC2, 0x85 }, - new byte[] { 0xE2, 0x80, 0xA8 }, - new byte[] { 0xE2, 0x80, 0xA9 }, - new byte[] { 0x09 }, - new byte[] { 0x0B }, - new byte[] { 0x0C }, - new byte[] { 0x20 }, - new byte[] { 0xEF, 0xBD, 0xA1 }, - new byte[] { 0xEF, 0xBD, 0xA4 }, - new byte[] { 0x2E }, - new byte[] { 0x2C }, - new byte[] { 0x5B }, - new byte[] { 0x21 }, - new byte[] { 0x22 }, - new byte[] { 0x23 }, - new byte[] { 0x24 }, - new byte[] { 0x25 }, - new byte[] { 0x26 }, - new byte[] { 0x27 }, - new byte[] { 0x28 }, - new byte[] { 0x29 }, - new byte[] { 0x2A }, - new byte[] { 0x2B }, - new byte[] { 0x2F }, - new byte[] { 0x3A }, - new byte[] { 0x3B }, - new byte[] { 0x3C }, - new byte[] { 0x3D }, - new byte[] { 0x3E }, - new byte[] { 0x3F }, - new byte[] { 0x5C }, - new byte[] { 0x40 }, - new byte[] { 0x5E }, - new byte[] { 0x5F }, - new byte[] { 0x60 }, - new byte[] { 0x7B }, - new byte[] { 0x7C }, - new byte[] { 0x7D }, - new byte[] { 0x7E }, - new byte[] { 0x2D }, - new byte[] { 0x5D }, - new byte[] { 0xE3, 0x80, 0x80 }, - new byte[] { 0xE3, 0x80, 0x82 }, - new byte[] { 0xE3, 0x80, 0x81 }, - new byte[] { 0xEF, 0xBC, 0x8E }, - new byte[] { 0xEF, 0xBC, 0x8C }, - new byte[] { 0xEF, 0xBC, 0xBB }, - new byte[] { 0xEF, 0xBC, 0x81 }, - new byte[] { 0xE2, 0x80, 0x9C }, - new byte[] { 0xE2, 0x80, 0x9D }, - new byte[] { 0xEF, 0xBC, 0x83 }, - new byte[] { 0xEF, 0xBC, 0x84 }, - new byte[] { 0xEF, 0xBC, 0x85 }, - new byte[] { 0xEF, 0xBC, 0x86 }, - new byte[] { 0xE2, 0x80, 0x98 }, - new byte[] { 0xE2, 0x80, 0x99 }, - new byte[] { 0xEF, 0xBC, 0x88 }, - new byte[] { 0xEF, 0xBC, 0x89 }, - new byte[] { 0xEF, 0xBC, 0x8A }, - new byte[] { 0xEF, 0xBC, 0x8B }, - new byte[] { 0xEF, 0xBC, 0x8F }, - new byte[] { 0xEF, 0xBC, 0x9A }, - new byte[] { 0xEF, 0xBC, 0x9B }, - new byte[] { 0xEF, 0xBC, 0x9C }, - new byte[] { 0xEF, 0xBC, 0x9D }, - new byte[] { 0xEF, 0xBC, 0x9E }, - new byte[] { 0xEF, 0xBC, 0x9F }, - new byte[] { 0xEF, 0xBC, 0xA0 }, - new byte[] { 0xEF, 0xBF, 0xA5 }, - new byte[] { 0xEF, 0xBC, 0xBE }, - new byte[] { 0xEF, 0xBC, 0xBF }, - new byte[] { 0xEF, 0xBD, 0x80 }, - new byte[] { 0xEF, 0xBD, 0x9B }, - new byte[] { 0xEF, 0xBD, 0x9C }, - new byte[] { 0xEF, 0xBD, 0x9D }, - new byte[] { 0xEF, 0xBD, 0x9E }, - new byte[] { 0xEF, 0xBC, 0x8D }, - new byte[] { 0xEF, 0xBC, 0xBD }, - }; -#pragma warning restore IDE0230 + private static readonly byte[][] _wordSeparators = + [ + [0x0D], + [0x0A], + [0xC2, 0x85], + [0xE2, 0x80, 0xA8], + [0xE2, 0x80, 0xA9], + [0x09], + [0x0B], + [0x0C], + [0x20], + [0xEF, 0xBD, 0xA1], + [0xEF, 0xBD, 0xA4], + [0x2E], + [0x2C], + [0x5B], + [0x21], + [0x22], + [0x23], + [0x24], + [0x25], + [0x26], + [0x27], + [0x28], + [0x29], + [0x2A], + [0x2B], + [0x2F], + [0x3A], + [0x3B], + [0x3C], + [0x3D], + [0x3E], + [0x3F], + [0x5C], + [0x40], + [0x5E], + [0x5F], + [0x60], + [0x7B], + [0x7C], + [0x7D], + [0x7E], + [0x2D], + [0x5D], + [0xE3, 0x80, 0x80], + [0xE3, 0x80, 0x82], + [0xE3, 0x80, 0x81], + [0xEF, 0xBC, 0x8E], + [0xEF, 0xBC, 0x8C], + [0xEF, 0xBC, 0xBB], + [0xEF, 0xBC, 0x81], + [0xE2, 0x80, 0x9C], + [0xE2, 0x80, 0x9D], + [0xEF, 0xBC, 0x83], + [0xEF, 0xBC, 0x84], + [0xEF, 0xBC, 0x85], + [0xEF, 0xBC, 0x86], + [0xE2, 0x80, 0x98], + [0xE2, 0x80, 0x99], + [0xEF, 0xBC, 0x88], + [0xEF, 0xBC, 0x89], + [0xEF, 0xBC, 0x8A], + [0xEF, 0xBC, 0x8B], + [0xEF, 0xBC, 0x8F], + [0xEF, 0xBC, 0x9A], + [0xEF, 0xBC, 0x9B], + [0xEF, 0xBC, 0x9C], + [0xEF, 0xBC, 0x9D], + [0xEF, 0xBC, 0x9E], + [0xEF, 0xBC, 0x9F], + [0xEF, 0xBC, 0xA0], + [0xEF, 0xBF, 0xA5], + [0xEF, 0xBC, 0xBE], + [0xEF, 0xBC, 0xBF], + [0xEF, 0xBD, 0x80], + [0xEF, 0xBD, 0x9B], + [0xEF, 0xBD, 0x9C], + [0xEF, 0xBD, 0x9D], + [0xEF, 0xBD, 0x9E], + [0xEF, 0xBC, 0x8D], + [0xEF, 0xBC, 0xBD] + ]; private enum SignFilterStep { @@ -114,7 +113,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail { break; } - else if (word[index] == '@' || word[index] == '\uFF20') + else if (word[index] is '@' or '\uFF20') { return true; } @@ -141,6 +140,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail step = SignFilterStep.DetectEmailUserAtSign; matchStart = index; } + break; case SignFilterStep.DetectEmailUserAtSign: bool hasMatch = false; @@ -204,6 +204,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail { index = domainIndex - 1; } + break; } } @@ -231,7 +232,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail text[startOffset] = 0xc1; text[startOffset + 1] = 0xc1; } - else if (maskMode == MaskMode.Overwrite || maskMode == MaskMode.ReplaceByOneCharacter) + else if (maskMode is MaskMode.Overwrite or MaskMode.ReplaceByOneCharacter) { text[startOffset] = 0xc0; text[startOffset + 1] = 0xc0; @@ -311,7 +312,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail } else if ((character & 0x80) != 0) { - if (character >= 0xc2 && character < 0xe0) + if (character is >= 0xc2 and < 0xe0) { characterByteLength = 2; } @@ -620,7 +621,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail if ((character & 0x80) != 0) { - if (character >= 0xc2 && character < 0xe0) + if (character is >= 0xc2 and < 0xe0) { characterByteLength = 2; } @@ -750,7 +751,7 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail if ((character & 0x80) != 0 || character == 0) { - if (character >= 0xc2 && character < 0xe0) + if (character is >= 0xc2 and < 0xe0) { characterByteLength = 2; } diff --git a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/Utf8Text.cs b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/Utf8Text.cs index 34978fdce..458d0a87b 100644 --- a/src/Ryujinx.Horizon/Sdk/Ngc/Detail/Utf8Text.cs +++ b/src/Ryujinx.Horizon/Sdk/Ngc/Detail/Utf8Text.cs @@ -12,8 +12,8 @@ namespace Ryujinx.Horizon.Sdk.Ngc.Detail public Utf8Text() { - _text = Array.Empty(); - _charOffsets = Array.Empty(); + _text = []; + _charOffsets = []; } public Utf8Text(byte[] text) diff --git a/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs b/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs index 12c19168d..7640967c6 100644 --- a/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs +++ b/src/Ryujinx.Horizon/Sdk/Ns/ApplicationControlProperty.cs @@ -1,8 +1,5 @@ using Ryujinx.Common.Memory; -using Ryujinx.Horizon.Sdk.Arp.Detail; using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; using System.Text; namespace Ryujinx.Horizon.Sdk.Ns diff --git a/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/InterProcessEvent.cs b/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/InterProcessEvent.cs index 4da4ee86c..c45239b14 100644 --- a/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/InterProcessEvent.cs +++ b/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/InterProcessEvent.cs @@ -33,6 +33,7 @@ namespace Ryujinx.Horizon.Sdk.OsTypes.Impl { InterProcessEventImpl.Close(ipEvent.ReadableHandle); } + ipEvent.ReadableHandleManaged = false; } @@ -42,6 +43,7 @@ namespace Ryujinx.Horizon.Sdk.OsTypes.Impl { InterProcessEventImpl.Close(ipEvent.WritableHandle); } + ipEvent.WritableHandleManaged = false; } } diff --git a/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs b/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs index 406352003..d723e5322 100644 --- a/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs +++ b/src/Ryujinx.Horizon/Sdk/OsTypes/Impl/MultiWaitImpl.cs @@ -2,6 +2,7 @@ using Ryujinx.Common; using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; +using System.Threading; namespace Ryujinx.Horizon.Sdk.OsTypes.Impl { @@ -13,7 +14,7 @@ namespace Ryujinx.Horizon.Sdk.OsTypes.Impl private readonly List _multiWaits; - private readonly object _lock = new(); + private readonly Lock _lock = new(); private int _waitingThreadHandle; @@ -25,7 +26,7 @@ namespace Ryujinx.Horizon.Sdk.OsTypes.Impl public MultiWaitImpl() { - _multiWaits = new List(); + _multiWaits = []; } public void LinkMultiWaitHolder(MultiWaitHolderBase multiWaitHolder) @@ -123,6 +124,7 @@ namespace Ryujinx.Horizon.Sdk.OsTypes.Impl { return null; } + break; case WaitCancelled: lock (_lock) @@ -132,6 +134,7 @@ namespace Ryujinx.Horizon.Sdk.OsTypes.Impl return _signaledHolder; } } + break; default: lock (_lock) diff --git a/src/Ryujinx.Horizon/Sdk/OsTypes/OsEvent.cs b/src/Ryujinx.Horizon/Sdk/OsTypes/OsEvent.cs index 8efe614f2..0cd147771 100644 --- a/src/Ryujinx.Horizon/Sdk/OsTypes/OsEvent.cs +++ b/src/Ryujinx.Horizon/Sdk/OsTypes/OsEvent.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Threading; namespace Ryujinx.Horizon.Sdk.OsTypes @@ -10,7 +9,7 @@ namespace Ryujinx.Horizon.Sdk.OsTypes { evnt = new EventType { - MultiWaitHolders = new LinkedList(), + MultiWaitHolders = [], Signaled = signaled, InitiallySignaled = signaled, ClearMode = clearMode, diff --git a/src/Ryujinx.Horizon/Sdk/OsTypes/OsSystemEvent.cs b/src/Ryujinx.Horizon/Sdk/OsTypes/OsSystemEvent.cs index 8fac94abe..701db76e0 100644 --- a/src/Ryujinx.Horizon/Sdk/OsTypes/OsSystemEvent.cs +++ b/src/Ryujinx.Horizon/Sdk/OsTypes/OsSystemEvent.cs @@ -31,7 +31,7 @@ namespace Ryujinx.Horizon.Sdk.OsTypes public static void DestroySystemEvent(ref SystemEventType sysEvent) { - var oldState = sysEvent.State; + SystemEventType.InitializationState oldState = sysEvent.State; sysEvent.State = SystemEventType.InitializationState.NotInitialized; switch (oldState) diff --git a/src/Ryujinx.Horizon/Sdk/ServiceUtil.cs b/src/Ryujinx.Horizon/Sdk/ServiceUtil.cs index 5527c1e35..b5bf853b3 100644 --- a/src/Ryujinx.Horizon/Sdk/ServiceUtil.cs +++ b/src/Ryujinx.Horizon/Sdk/ServiceUtil.cs @@ -1,6 +1,7 @@ using Ryujinx.Horizon.Common; using Ryujinx.Horizon.Sdk.Sf.Cmif; using Ryujinx.Horizon.Sdk.Sf.Hipc; +using Ryujinx.Memory; using System; namespace Ryujinx.Horizon.Sdk @@ -12,7 +13,7 @@ namespace Ryujinx.Horizon.Sdk ulong tlsAddress = HorizonStatic.ThreadContext.TlsAddress; int tlsSize = Api.TlsMessageBufferSize; - using (var tlsRegion = HorizonStatic.AddressSpace.GetWritableRegion(tlsAddress, tlsSize)) + using (WritableRegion tlsRegion = HorizonStatic.AddressSpace.GetWritableRegion(tlsAddress, tlsSize)) { CmifRequest request = CmifMessage.CreateRequest(tlsRegion.Memory.Span, new CmifRequestFormat { @@ -48,7 +49,7 @@ namespace Ryujinx.Horizon.Sdk ulong tlsAddress = HorizonStatic.ThreadContext.TlsAddress; int tlsSize = Api.TlsMessageBufferSize; - using (var tlsRegion = HorizonStatic.AddressSpace.GetWritableRegion(tlsAddress, tlsSize)) + using (WritableRegion tlsRegion = HorizonStatic.AddressSpace.GetWritableRegion(tlsAddress, tlsSize)) { CmifRequestFormat format = new() { diff --git a/src/Ryujinx.Horizon/Sdk/Settings/Factory/CountryCode.cs b/src/Ryujinx.Horizon/Sdk/Settings/Factory/CountryCode.cs index daf2ba3b8..33234ed76 100644 --- a/src/Ryujinx.Horizon/Sdk/Settings/Factory/CountryCode.cs +++ b/src/Ryujinx.Horizon/Sdk/Settings/Factory/CountryCode.cs @@ -1,5 +1,3 @@ -using System.Runtime.InteropServices; - namespace Ryujinx.Horizon.Sdk.Settings.Factory { struct CountryCode diff --git a/src/Ryujinx.Horizon/Sdk/Settings/LanguageCode.cs b/src/Ryujinx.Horizon/Sdk/Settings/LanguageCode.cs index dc9712692..384dac755 100644 --- a/src/Ryujinx.Horizon/Sdk/Settings/LanguageCode.cs +++ b/src/Ryujinx.Horizon/Sdk/Settings/LanguageCode.cs @@ -8,8 +8,8 @@ namespace Ryujinx.Horizon.Sdk.Settings [StructLayout(LayoutKind.Sequential, Size = 0x8, Pack = 0x1)] struct LanguageCode { - private static readonly string[] _languageCodes = new string[] - { + private static readonly string[] _languageCodes = + [ "ja", "en-US", "fr", @@ -28,7 +28,7 @@ namespace Ryujinx.Horizon.Sdk.Settings "zh-Hans", "zh-Hant", "pt-BR" - }; + ]; public Array8 Value; diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Cmif/DomainServiceObjectDispatchTable.cs b/src/Ryujinx.Horizon/Sdk/Sf/Cmif/DomainServiceObjectDispatchTable.cs index 58957a701..2e7879f2d 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/Cmif/DomainServiceObjectDispatchTable.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/Cmif/DomainServiceObjectDispatchTable.cs @@ -19,7 +19,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif return SfResult.InvalidHeaderSize; } - var inHeader = MemoryMarshal.Cast(inRawData)[0]; + CmifDomainInHeader inHeader = MemoryMarshal.Cast(inRawData)[0]; ReadOnlySpan inDomainRawData = inRawData[Unsafe.SizeOf()..]; @@ -28,7 +28,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif switch (inHeader.Type) { case CmifDomainRequestType.SendMessage: - var targetObject = domain.GetObject(targetObjectId); + ServiceObjectHolder targetObject = domain.GetObject(targetObjectId); if (targetObject == null) { return SfResult.TargetNotFound; @@ -48,7 +48,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif int[] inObjectIds = new int[inHeader.ObjectsCount]; - var domainProcessor = new DomainServiceObjectProcessor(domain, inObjectIds); + DomainServiceObjectProcessor domainProcessor = new(domain, inObjectIds); if (context.Processor == null) { diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Cmif/DomainServiceObjectProcessor.cs b/src/Ryujinx.Horizon/Sdk/Sf/Cmif/DomainServiceObjectProcessor.cs index f677e0598..f99584610 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/Cmif/DomainServiceObjectProcessor.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/Cmif/DomainServiceObjectProcessor.cs @@ -44,7 +44,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif public override ServerMessageRuntimeMetadata GetRuntimeMetadata() { - var runtimeMetadata = _implProcessor.GetRuntimeMetadata(); + ServerMessageRuntimeMetadata runtimeMetadata = _implProcessor.GetRuntimeMetadata(); return new ServerMessageRuntimeMetadata( (ushort)(runtimeMetadata.InDataSize + runtimeMetadata.InObjectsCount * sizeof(int)), @@ -84,7 +84,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif public override HipcMessageData PrepareForReply(scoped ref ServiceDispatchContext context, out Span outRawData, ServerMessageRuntimeMetadata runtimeMetadata) { - var response = _implProcessor.PrepareForReply(ref context, out outRawData, runtimeMetadata); + HipcMessageData response = _implProcessor.PrepareForReply(ref context, out outRawData, runtimeMetadata); int outHeaderSize = Unsafe.SizeOf(); int implOutDataTotalSize = ImplOutDataTotalSize; diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServerDomainManager.cs b/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServerDomainManager.cs index 7762345af..cdb493a0e 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServerDomainManager.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServerDomainManager.cs @@ -1,6 +1,7 @@ using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; +using System.Threading; namespace Ryujinx.Horizon.Sdk.Sf.Cmif { @@ -26,7 +27,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif public EntryManager(int count) { - _freeList = new LinkedList(); + _freeList = []; _entries = new Entry[count]; for (int i = 0; i < count; i++) @@ -44,7 +45,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif return null; } - var entry = _freeList.First.Value; + Entry entry = _freeList.First.Value; _freeList.RemoveFirst(); return entry; } @@ -86,12 +87,12 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif public Domain(ServerDomainManager manager) { _manager = manager; - _entries = new LinkedList(); + _entries = []; } public override ServiceObjectHolder GetObject(int id) { - var entry = _manager._entryManager.GetEntry(id); + EntryManager.Entry entry = _manager._entryManager.GetEntry(id); if (entry == null) { return null; @@ -115,7 +116,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif public override void RegisterObject(int id, ServiceObjectHolder obj) { - var entry = _manager._entryManager.GetEntry(id); + EntryManager.Entry entry = _manager._entryManager.GetEntry(id); DebugUtil.Assert(entry != null); lock (_manager._entryOwnerLock) @@ -132,7 +133,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif { for (int i = 0; i < outIds.Length; i++) { - var entry = _manager._entryManager.AllocateEntry(); + EntryManager.Entry entry = _manager._entryManager.AllocateEntry(); if (entry == null) { return SfResult.OutOfDomainEntries; @@ -148,7 +149,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif public override ServiceObjectHolder UnregisterObject(int id) { - var entry = _manager._entryManager.GetEntry(id); + EntryManager.Entry entry = _manager._entryManager.GetEntry(id); if (entry == null) { return null; @@ -185,7 +186,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif { for (int i = 0; i < ids.Length; i++) { - var entry = _manager._entryManager.GetEntry(ids[i]); + EntryManager.Entry entry = _manager._entryManager.GetEntry(ids[i]); DebugUtil.Assert(entry != null); DebugUtil.Assert(entry.Owner == null); @@ -196,7 +197,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif public void Dispose() { - foreach (var entry in _entries) + foreach (EntryManager.Entry entry in _entries) { if (entry.Obj.ServiceObject is IDisposable disposableObj) { @@ -209,15 +210,14 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif } private readonly EntryManager _entryManager; - private readonly object _entryOwnerLock; + private readonly Lock _entryOwnerLock = new(); private readonly HashSet _domains; private readonly int _maxDomains; public ServerDomainManager(int entryCount, int maxDomains) { _entryManager = new EntryManager(entryCount); - _entryOwnerLock = new object(); - _domains = new HashSet(); + _domains = []; _maxDomains = maxDomains; } @@ -230,7 +230,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif return null; } - var domain = new Domain(this); + Domain domain = new(this); _domains.Add(domain); return domain; } diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServiceDispatchTableBase.cs b/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServiceDispatchTableBase.cs index 2625a4c3e..df1472560 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServiceDispatchTableBase.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/Cmif/ServiceDispatchTableBase.cs @@ -35,9 +35,9 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif ReadOnlySpan inMessageRawData = inRawData[Unsafe.SizeOf()..]; uint commandId = inHeader.CommandId; - var outHeader = Span.Empty; + Span outHeader = Span.Empty; - if (!entries.TryGetValue((int)commandId, out var commandHandler)) + if (!entries.TryGetValue((int)commandId, out CommandHandler commandHandler)) { if (HorizonStatic.Options.IgnoreMissingServices) { @@ -62,8 +62,8 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif Result commandResult = commandHandler.Invoke(ref outHeader, ref context, inMessageRawData); - if (commandResult.Module == SfResult.ModuleId || - commandResult.Module == HipcResult.ModuleId) + if (commandResult.Module is SfResult.ModuleId or + HipcResult.ModuleId) { Logger.Warning?.Print(LogClass.KernelIpc, $"{commandHandler.MethodName} returned error {commandResult}"); } @@ -87,7 +87,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Cmif private static void PrepareForStubReply(scoped ref ServiceDispatchContext context, out Span outRawData) { - var response = HipcMessage.WriteResponse(context.OutMessageBuffer, 0, 0x20 / sizeof(uint), 0, 0); + HipcMessageData response = HipcMessage.WriteResponse(context.OutMessageBuffer, 0, 0x20 / sizeof(uint), 0, 0); outRawData = MemoryMarshal.Cast(response.DataWords); } } diff --git a/src/Ryujinx.Horizon/Sdk/Sf/CommandHandler.cs b/src/Ryujinx.Horizon/Sdk/Sf/CommandHandler.cs index d0efe0d4b..3dcf4a263 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/CommandHandler.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/CommandHandler.cs @@ -37,7 +37,7 @@ namespace Ryujinx.Horizon.Sdk.Sf context.Processor.SetImplementationProcessor(_processor); } - var runtimeMetadata = context.Processor.GetRuntimeMetadata(); + ServerMessageRuntimeMetadata runtimeMetadata = context.Processor.GetRuntimeMetadata(); Result result = context.Processor.PrepareForProcess(ref context, runtimeMetadata); return result.IsFailure ? result : _invoke(ref context, _processor, runtimeMetadata, inRawData, ref outHeader); diff --git a/src/Ryujinx.Horizon/Sdk/Sf/CommandSerialization.cs b/src/Ryujinx.Horizon/Sdk/Sf/CommandSerialization.cs index 7f5284648..53bbe56f9 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/CommandSerialization.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/CommandSerialization.cs @@ -27,7 +27,7 @@ namespace Ryujinx.Horizon.Sdk.Sf public static ref T GetRef(PointerAndSize bufferRange) where T : unmanaged { - var writableRegion = GetWritableRegion(bufferRange); + WritableRegion writableRegion = GetWritableRegion(bufferRange); return ref MemoryMarshal.Cast(writableRegion.Memory.Span)[0]; } diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/Api.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/Api.cs index 5f3f67061..4c8dacb8f 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/Api.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/Api.cs @@ -35,7 +35,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc handles[0] = sessionHandle; - var tlsSpan = HorizonStatic.AddressSpace.GetSpan(HorizonStatic.ThreadContext.TlsAddress, TlsMessageBufferSize); + ReadOnlySpan tlsSpan = HorizonStatic.AddressSpace.GetSpan(HorizonStatic.ThreadContext.TlsAddress, TlsMessageBufferSize); if (messageBuffer == tlsSpan) { @@ -56,7 +56,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc private static Result ReplyImpl(int sessionHandle, ReadOnlySpan messageBuffer) { - var tlsSpan = HorizonStatic.AddressSpace.GetSpan(HorizonStatic.ThreadContext.TlsAddress, TlsMessageBufferSize); + ReadOnlySpan tlsSpan = HorizonStatic.AddressSpace.GetSpan(HorizonStatic.ThreadContext.TlsAddress, TlsMessageBufferSize); if (messageBuffer == tlsSpan) { diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcManager.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcManager.cs index 4f0bbb014..953f9e755 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcManager.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/HipcManager.cs @@ -20,7 +20,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc { objectId = 0; - var domain = _manager.Domain.AllocateDomainServiceObject(); + DomainServiceObject domain = _manager.Domain.AllocateDomainServiceObject(); if (domain == null) { return HipcResult.OutOfDomains; @@ -66,7 +66,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc return HipcResult.TargetNotDomain; } - var obj = domain.GetObject(objectId); + ServiceObjectHolder obj = domain.GetObject(objectId); if (obj == null) { return HipcResult.DomainObjectNotFound; @@ -100,7 +100,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc { clientHandle = 0; - var clone = _session.ServiceObjectHolder.Clone(); + ServiceObjectHolder clone = _session.ServiceObjectHolder.Clone(); if (clone == null) { return HipcResult.DomainObjectNotFound; diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManager.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManager.cs index e8957b758..df121164f 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManager.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManager.cs @@ -4,6 +4,7 @@ using Ryujinx.Horizon.Sdk.Sm; using System; using System.Collections.Generic; using System.Numerics; +using System.Threading; namespace Ryujinx.Horizon.Sdk.Sf.Hipc { @@ -17,7 +18,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc private readonly ulong _pointerBuffersBaseAddress; private readonly ulong _savedMessagesBaseAddress; - private readonly object _resourceLock; + private readonly Lock _resourceLock = new(); private readonly ulong[] _sessionAllocationBitmap; private readonly HashSet _sessions; private readonly HashSet _servers; @@ -42,10 +43,9 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc } } - _resourceLock = new object(); _sessionAllocationBitmap = new ulong[(maxSessions + 63) / 64]; - _sessions = new HashSet(); - _servers = new HashSet(); + _sessions = []; + _servers = []; } private static PointerAndSize GetObjectBySessionIndex(ServerSession session, ulong baseAddress, ulong size) diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs index 570e3c802..669dc5ee3 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerManagerBase.cs @@ -2,8 +2,10 @@ using Ryujinx.Horizon.Common; using Ryujinx.Horizon.Sdk.OsTypes; using Ryujinx.Horizon.Sdk.Sf.Cmif; using Ryujinx.Horizon.Sdk.Sm; +using Ryujinx.Memory; using System; using System.Linq; +using System.Threading; namespace Ryujinx.Horizon.Sdk.Sf.Hipc { @@ -16,8 +18,8 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc private readonly MultiWait _multiWait; private readonly MultiWait _waitList; - private readonly object _multiWaitSelectionLock; - private readonly object _waitListLock; + private readonly Lock _multiWaitSelectionLock = new(); + private readonly Lock _waitListLock = new(); private readonly Event _requestStopEvent; private readonly Event _notifyEvent; @@ -39,9 +41,6 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc _multiWait = new MultiWait(); _waitList = new MultiWait(); - _multiWaitSelectionLock = new object(); - _waitListLock = new object(); - _requestStopEvent = new Event(EventClearMode.ManualClear); _notifyEvent = new Event(EventClearMode.ManualClear); @@ -259,14 +258,14 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc ServerSession session = (ServerSession)holder; - using var tlsMessage = HorizonStatic.AddressSpace.GetWritableRegion(HorizonStatic.ThreadContext.TlsAddress, Api.TlsMessageBufferSize); + using WritableRegion tlsMessage = HorizonStatic.AddressSpace.GetWritableRegion(HorizonStatic.ThreadContext.TlsAddress, Api.TlsMessageBufferSize); Result result; if (_canDeferInvokeRequest) { // If the request is deferred, we save the message on a temporary buffer to process it later. - using var savedMessage = HorizonStatic.AddressSpace.GetWritableRegion(session.SavedMessage.Address, (int)session.SavedMessage.Size); + using WritableRegion savedMessage = HorizonStatic.AddressSpace.GetWritableRegion(session.SavedMessage.Address, (int)session.SavedMessage.Size); DebugUtil.Assert(tlsMessage.Memory.Length == savedMessage.Memory.Length); diff --git a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs index bd5a48444..ca13e611e 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/Hipc/ServerSessionManager.cs @@ -186,7 +186,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc { CommandType commandType = GetCmifCommandType(inMessage); - using var _ = new ScopedInlineContextChange(GetInlineContext(commandType, inMessage)); + using ScopedInlineContextChange _ = new(GetInlineContext(commandType, inMessage)); return commandType switch { @@ -206,6 +206,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc { return MemoryMarshal.Cast(inMessage)[3]; } + break; } @@ -282,7 +283,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc return HipcResult.InvalidRequestSize; } - var dispatchCtx = new ServiceDispatchContext + ServiceDispatchContext dispatchCtx = new() { ServiceObject = objectHolder.ServiceObject, Manager = this, @@ -312,7 +313,7 @@ namespace Ryujinx.Horizon.Sdk.Sf.Hipc result = Api.Reply(session.SessionHandle, outMessage); - ref var handlesToClose = ref dispatchCtx.HandlesToClose; + ref HandlesToClose handlesToClose = ref dispatchCtx.HandlesToClose; for (int i = 0; i < handlesToClose.Count; i++) { diff --git a/src/Ryujinx.Horizon/Sdk/Sf/HipcCommandProcessor.cs b/src/Ryujinx.Horizon/Sdk/Sf/HipcCommandProcessor.cs index dc34f791a..ec0acbdea 100644 --- a/src/Ryujinx.Horizon/Sdk/Sf/HipcCommandProcessor.cs +++ b/src/Ryujinx.Horizon/Sdk/Sf/HipcCommandProcessor.cs @@ -46,7 +46,7 @@ namespace Ryujinx.Horizon.Sdk.Sf switch (argInfo.Type) { case CommandArgType.Buffer: - var flags = argInfo.BufferFlags; + HipcBufferFlags flags = argInfo.BufferFlags; if (flags.HasFlag(HipcBufferFlags.In)) { @@ -82,6 +82,7 @@ namespace Ryujinx.Horizon.Sdk.Sf _outMapAliasBuffersCount++; } } + break; case CommandArgType.InCopyHandle: _inCopyHandlesCount++; @@ -146,7 +147,7 @@ namespace Ryujinx.Horizon.Sdk.Sf continue; } - var flags = _args[i].BufferFlags; + HipcBufferFlags flags = _args[i].BufferFlags; bool isMapAlias; if (flags.HasFlag(HipcBufferFlags.MapAlias)) @@ -159,7 +160,7 @@ namespace Ryujinx.Horizon.Sdk.Sf } else /* if (flags.HasFlag(HipcBufferFlags.HipcAutoSelect)) */ { - var descriptor = flags.HasFlag(HipcBufferFlags.In) + HipcBufferDescriptor descriptor = flags.HasFlag(HipcBufferFlags.In) ? context.Request.Data.SendBuffers[sendMapAliasIndex] : context.Request.Data.ReceiveBuffers[recvMapAliasIndex]; @@ -170,7 +171,7 @@ namespace Ryujinx.Horizon.Sdk.Sf if (isMapAlias) { - var descriptor = flags.HasFlag(HipcBufferFlags.In) + HipcBufferDescriptor descriptor = flags.HasFlag(HipcBufferFlags.In) ? context.Request.Data.SendBuffers[sendMapAliasIndex++] : context.Request.Data.ReceiveBuffers[recvMapAliasIndex++]; @@ -185,7 +186,7 @@ namespace Ryujinx.Horizon.Sdk.Sf { if (flags.HasFlag(HipcBufferFlags.In)) { - var descriptor = context.Request.Data.SendStatics[sendPointerIndex++]; + HipcStaticDescriptor descriptor = context.Request.Data.SendStatics[sendPointerIndex++]; ulong address = descriptor.Address; ulong size = descriptor.Size; @@ -206,8 +207,8 @@ namespace Ryujinx.Horizon.Sdk.Sf } else { - var data = MemoryMarshal.Cast(context.Request.Data.DataWordsPadded); - var recvPointerSizes = MemoryMarshal.Cast(data[runtimeMetadata.UnfixedOutPointerSizeOffset..]); + Span data = MemoryMarshal.Cast(context.Request.Data.DataWordsPadded); + Span recvPointerSizes = MemoryMarshal.Cast(data[runtimeMetadata.UnfixedOutPointerSizeOffset..]); size = recvPointerSizes[unfixedRecvPointerIndex++]; } @@ -257,13 +258,13 @@ namespace Ryujinx.Horizon.Sdk.Sf continue; } - var flags = _args[i].BufferFlags; + HipcBufferFlags flags = _args[i].BufferFlags; if (!flags.HasFlag(HipcBufferFlags.Out)) { continue; } - var buffer = _bufferRanges[i]; + PointerAndSize buffer = _bufferRanges[i]; if (flags.HasFlag(HipcBufferFlags.Pointer)) { @@ -303,7 +304,7 @@ namespace Ryujinx.Horizon.Sdk.Sf public override Result PrepareForProcess(ref ServiceDispatchContext context, ServerMessageRuntimeMetadata runtimeMetadata) { - ref var meta = ref context.Request.Meta; + ref HipcMetadata meta = ref context.Request.Meta; bool requestValid = true; requestValid &= meta.SendPid == _hasInProcessIdHolder; requestValid &= meta.SendStaticsCount == _inPointerBuffersCount; @@ -346,7 +347,7 @@ namespace Ryujinx.Horizon.Sdk.Sf } int index = inObjectIndex++; - var inObject = inObjects[index]; + ServiceObjectHolder inObject = inObjects[index]; objects[index] = inObject?.ServiceObject; } @@ -362,7 +363,7 @@ namespace Ryujinx.Horizon.Sdk.Sf public override HipcMessageData PrepareForReply(scoped ref ServiceDispatchContext context, out Span outRawData, ServerMessageRuntimeMetadata runtimeMetadata) { int rawDataSize = OutRawDataSize + runtimeMetadata.OutHeadersSize; - var response = HipcMessage.WriteResponse( + HipcMessageData response = HipcMessage.WriteResponse( context.OutMessageBuffer, _outPointerBuffersCount, (BitUtils.AlignUp(rawDataSize, 4) + 0x10) / sizeof(uint), @@ -376,7 +377,7 @@ namespace Ryujinx.Horizon.Sdk.Sf public override void PrepareForErrorReply(scoped ref ServiceDispatchContext context, out Span outRawData, ServerMessageRuntimeMetadata runtimeMetadata) { int rawDataSize = runtimeMetadata.OutHeadersSize; - var response = HipcMessage.WriteResponse( + HipcMessageData response = HipcMessage.WriteResponse( context.OutMessageBuffer, 0, (BitUtils.AlignUp(rawDataSize, 4) + 0x10) / sizeof(uint), @@ -386,9 +387,7 @@ namespace Ryujinx.Horizon.Sdk.Sf outRawData = MemoryMarshal.Cast(response.DataWords); } -#pragma warning disable CA1822 // Mark member as static - public void SetOutObjects(ref ServiceDispatchContext context, HipcMessageData response, Span objects) -#pragma warning restore CA1822 + public static void SetOutObjects(ref ServiceDispatchContext context, HipcMessageData response, Span objects) { if (objects.Length == 0) { diff --git a/src/Ryujinx.Horizon/ServiceTable.cs b/src/Ryujinx.Horizon/ServiceTable.cs index 28c43a716..db24c193d 100644 --- a/src/Ryujinx.Horizon/ServiceTable.cs +++ b/src/Ryujinx.Horizon/ServiceTable.cs @@ -33,7 +33,7 @@ namespace Ryujinx.Horizon public IEnumerable GetServices(HorizonOptions options) { - List entries = new(); + List entries = []; void RegisterService() where T : IService { diff --git a/src/Ryujinx.Horizon/Sm/Impl/ServiceManager.cs b/src/Ryujinx.Horizon/Sm/Impl/ServiceManager.cs index 177cc0d3d..c13b85c4c 100644 --- a/src/Ryujinx.Horizon/Sm/Impl/ServiceManager.cs +++ b/src/Ryujinx.Horizon/Sm/Impl/ServiceManager.cs @@ -120,7 +120,7 @@ namespace Ryujinx.Horizon.Sm.Impl return SmResult.NotRegistered; } - ref var serviceInfo = ref _services[serviceIndex]; + ref ServiceInfo serviceInfo = ref _services[serviceIndex]; if (serviceInfo.OwnerProcessId != processId) { return SmResult.NotAllowed; diff --git a/src/Ryujinx.Horizon/Usb/Ipc/PdManager.cs b/src/Ryujinx.Horizon/Usb/Ipc/PdManager.cs index 1c502919b..120d7b51a 100644 --- a/src/Ryujinx.Horizon/Usb/Ipc/PdManager.cs +++ b/src/Ryujinx.Horizon/Usb/Ipc/PdManager.cs @@ -1,4 +1,3 @@ -using Ryujinx.Horizon.Sdk.Sf.Hipc; using Ryujinx.Horizon.Sdk.Usb; namespace Ryujinx.Horizon.Usb.Ipc diff --git a/src/Ryujinx.Input.SDL2/Ryujinx.Input.SDL2.csproj b/src/Ryujinx.Input.SDL2/Ryujinx.Input.SDL2.csproj index 3d880d5fa..89f5adda1 100644 --- a/src/Ryujinx.Input.SDL2/Ryujinx.Input.SDL2.csproj +++ b/src/Ryujinx.Input.SDL2/Ryujinx.Input.SDL2.csproj @@ -1,7 +1,6 @@  - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs b/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs index af6f4c625..4b868efeb 100644 --- a/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs +++ b/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs @@ -1,14 +1,16 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Controller; using Ryujinx.Common.Logging; +using Ryujinx.Common.Utilities; using System; using System.Collections.Generic; using System.Numerics; +using System.Threading; using static SDL2.SDL; namespace Ryujinx.Input.SDL2 { - class SDL2Gamepad : IGamepad + public class SDL2Gamepad : IGamepad { private bool HasConfiguration => _configuration != null; @@ -19,8 +21,8 @@ namespace Ryujinx.Input.SDL2 private StandardControllerInputConfig _configuration; - private static readonly SDL_GameControllerButton[] _buttonsDriverMapping = new SDL_GameControllerButton[(int)GamepadButtonInputId.Count] - { + private static readonly SDL_GameControllerButton[] _buttonsDriverMapping = + [ // Unbound, ignored. SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_INVALID, @@ -55,19 +57,19 @@ namespace Ryujinx.Input.SDL2 SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_INVALID, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_INVALID, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_INVALID, - SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_INVALID, - }; + SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_INVALID + ]; - private readonly object _userMappingLock = new(); + private readonly Lock _userMappingLock = new(); private readonly List _buttonsUserMapping; - private readonly StickInputId[] _stickUserMapping = new StickInputId[(int)StickInputId.Count] - { + private readonly StickInputId[] _stickUserMapping = + [ StickInputId.Unbound, StickInputId.Left, - StickInputId.Right, - }; + StickInputId.Right + ]; public GamepadFeaturesFlag Features { get; } @@ -100,6 +102,19 @@ namespace Ryujinx.Input.SDL2 } } + public void SetLed(uint packedRgb) + { + if (!Features.HasFlag(GamepadFeaturesFlag.Led)) + return; + + byte red = packedRgb > 0 ? (byte)(packedRgb >> 16) : (byte)0; + byte green = packedRgb > 0 ? (byte)(packedRgb >> 8) : (byte)0; + byte blue = packedRgb > 0 ? (byte)(packedRgb % 256) : (byte)0; + + if (SDL_GameControllerSetLED(_gamepadHandle, red, green, blue) != 0) + Logger.Debug?.Print(LogClass.Hid, "LED setting failed; probably in the middle of disconnecting."); + } + private GamepadFeaturesFlag GetFeaturesFlag() { GamepadFeaturesFlag result = GamepadFeaturesFlag.None; @@ -110,13 +125,16 @@ namespace Ryujinx.Input.SDL2 result |= GamepadFeaturesFlag.Motion; } - int error = SDL_GameControllerRumble(_gamepadHandle, 0, 0, 100); - - if (error == 0) + if (SDL_GameControllerHasRumble(_gamepadHandle) == SDL_bool.SDL_TRUE) { result |= GamepadFeaturesFlag.Rumble; } + if (SDL_GameControllerHasLED(_gamepadHandle) == SDL_bool.SDL_TRUE) + { + result |= GamepadFeaturesFlag.Led; + } + return result; } @@ -138,6 +156,7 @@ namespace Ryujinx.Input.SDL2 public void Dispose() { Dispose(true); + GC.SuppressFinalize(this); } public void SetTriggerThreshold(float triggerThreshold) @@ -213,6 +232,17 @@ namespace Ryujinx.Input.SDL2 { _configuration = (StandardControllerInputConfig)configuration; + if (Features.HasFlag(GamepadFeaturesFlag.Led) && _configuration.Led.EnableLed) + { + if (_configuration.Led.TurnOffLed) + (this as IGamepad).ClearLed(); + else if (_configuration.Led.UseRainbow) + SetLed((uint)Rainbow.Color.ToArgb()); + + if (!_configuration.Led.TurnOffLed && !_configuration.Led.UseRainbow) + SetLed(_configuration.Led.LedColor); + } + _buttonsUserMapping.Clear(); // First update sticks @@ -262,7 +292,6 @@ namespace Ryujinx.Input.SDL2 if (_buttonsUserMapping.Count == 0) return rawState; - // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator foreach (ButtonMappingEntry entry in _buttonsUserMapping) { @@ -308,6 +337,7 @@ namespace Ryujinx.Input.SDL2 else return _configuration.RightJoyconStick; } + return null; } @@ -323,7 +353,7 @@ namespace Ryujinx.Input.SDL2 if (HasConfiguration) { - var joyconStickConfig = GetLogicalJoyStickConfig(inputId); + JoyconConfigControllerStick joyconStickConfig = GetLogicalJoyStickConfig(inputId); if (joyconStickConfig != null) { diff --git a/src/Ryujinx.Input.SDL2/SDL2GamepadDriver.cs b/src/Ryujinx.Input.SDL2/SDL2GamepadDriver.cs index fd34fe219..5b3756fb6 100644 --- a/src/Ryujinx.Input.SDL2/SDL2GamepadDriver.cs +++ b/src/Ryujinx.Input.SDL2/SDL2GamepadDriver.cs @@ -1,6 +1,8 @@ +using Ryujinx.Common.Logging; using Ryujinx.SDL2.Common; using System; using System.Collections.Generic; +using System.Threading; using static SDL2.SDL; namespace Ryujinx.Input.SDL2 @@ -9,7 +11,7 @@ namespace Ryujinx.Input.SDL2 { private readonly Dictionary _gamepadsInstanceIdsMapping; private readonly List _gamepadsIds; - private readonly object _lock = new(); + private readonly Lock _lock = new(); public ReadOnlySpan GamepadsIds { @@ -30,11 +32,12 @@ namespace Ryujinx.Input.SDL2 public SDL2GamepadDriver() { _gamepadsInstanceIdsMapping = new Dictionary(); - _gamepadsIds = new List(); + _gamepadsIds = []; SDL2Driver.Instance.Initialize(); SDL2Driver.Instance.OnJoyStickConnected += HandleJoyStickConnected; SDL2Driver.Instance.OnJoystickDisconnected += HandleJoyStickDisconnected; + SDL2Driver.Instance.OnJoyBatteryUpdated += HandleJoyBatteryUpdated; // Add already connected gamepads int numJoysticks = SDL_NumJoysticks(); @@ -56,16 +59,19 @@ namespace Ryujinx.Input.SDL2 return null; } + // Remove the first 4 char of the guid (CRC part) to make it stable + string guidString = $"0000{guid.ToString()[4..]}"; + string id; lock (_lock) { int guidIndex = 0; - id = guidIndex + "-" + guid; + id = guidIndex + "-" + guidString; while (_gamepadsIds.Contains(id)) { - id = (++guidIndex) + "-" + guid; + id = (++guidIndex) + "-" + guidString; } } @@ -82,19 +88,32 @@ namespace Ryujinx.Input.SDL2 private void HandleJoyStickDisconnected(int joystickInstanceId) { + bool joyConPairDisconnected = false; + if (!_gamepadsInstanceIdsMapping.Remove(joystickInstanceId, out string id)) return; lock (_lock) { _gamepadsIds.Remove(id); + if (!SDL2JoyConPair.IsCombinable(_gamepadsIds)) + { + _gamepadsIds.Remove(SDL2JoyConPair.Id); + joyConPairDisconnected = true; + } } OnGamepadDisconnected?.Invoke(id); + if (joyConPairDisconnected) + { + OnGamepadDisconnected?.Invoke(SDL2JoyConPair.Id); + } } private void HandleJoyStickConnected(int joystickDeviceId, int joystickInstanceId) { + bool joyConPairConnected = false; + if (SDL_IsGameController(joystickDeviceId) == SDL_bool.SDL_TRUE) { if (_gamepadsInstanceIdsMapping.ContainsKey(joystickInstanceId)) @@ -119,13 +138,30 @@ namespace Ryujinx.Input.SDL2 _gamepadsIds.Insert(joystickDeviceId, id); else _gamepadsIds.Add(id); + + if (SDL2JoyConPair.IsCombinable(_gamepadsIds)) + { + _gamepadsIds.Remove(SDL2JoyConPair.Id); + _gamepadsIds.Add(SDL2JoyConPair.Id); + joyConPairConnected = true; + } } OnGamepadConnected?.Invoke(id); + if (joyConPairConnected) + { + OnGamepadConnected?.Invoke(SDL2JoyConPair.Id); + } } } } + private void HandleJoyBatteryUpdated(int joystickDeviceId, SDL_JoystickPowerLevel powerLevel) + { + Logger.Info?.Print(LogClass.Hid, + $"{SDL_GameControllerNameForIndex(joystickDeviceId)} power level: {powerLevel}"); + } + protected virtual void Dispose(bool disposing) { if (disposing) @@ -156,6 +192,14 @@ namespace Ryujinx.Input.SDL2 public IGamepad GetGamepad(string id) { + if (id == SDL2JoyConPair.Id) + { + lock (_lock) + { + return SDL2JoyConPair.GetGamepad(_gamepadsIds); + } + } + int joystickIndex = GetJoystickIndexByGamepadId(id); if (joystickIndex == -1) @@ -170,7 +214,23 @@ namespace Ryujinx.Input.SDL2 return null; } + if (SDL_GameControllerName(gamepadHandle).StartsWith(SDL2JoyCon.Prefix)) + { + return new SDL2JoyCon(gamepadHandle, id); + } + return new SDL2Gamepad(gamepadHandle, id); } + + public IEnumerable GetGamepads() + { + lock (_gamepadsIds) + { + foreach (string gamepadId in _gamepadsIds) + { + yield return GetGamepad(gamepadId); + } + } + } } } diff --git a/src/Ryujinx.Input.SDL2/SDL2JoyCon.cs b/src/Ryujinx.Input.SDL2/SDL2JoyCon.cs new file mode 100644 index 000000000..0c00c1899 --- /dev/null +++ b/src/Ryujinx.Input.SDL2/SDL2JoyCon.cs @@ -0,0 +1,409 @@ +using Ryujinx.Common.Configuration.Hid; +using Ryujinx.Common.Configuration.Hid.Controller; +using Ryujinx.Common.Logging; +using System; +using System.Collections.Generic; +using System.Numerics; +using System.Threading; +using static SDL2.SDL; + +namespace Ryujinx.Input.SDL2 +{ + internal class SDL2JoyCon : IGamepad + { + private bool HasConfiguration => _configuration != null; + + private readonly record struct ButtonMappingEntry(GamepadButtonInputId To, GamepadButtonInputId From) + { + public bool IsValid => To is not GamepadButtonInputId.Unbound && From is not GamepadButtonInputId.Unbound; + } + + private StandardControllerInputConfig _configuration; + + private readonly Dictionary _leftButtonsDriverMapping = new() + { + { GamepadButtonInputId.LeftStick , SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSTICK }, + {GamepadButtonInputId.DpadUp ,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_Y}, + {GamepadButtonInputId.DpadDown ,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A}, + {GamepadButtonInputId.DpadLeft ,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_B}, + {GamepadButtonInputId.DpadRight ,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_X}, + {GamepadButtonInputId.Minus ,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_START}, + {GamepadButtonInputId.LeftShoulder,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_PADDLE2}, + {GamepadButtonInputId.LeftTrigger,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_PADDLE4}, + {GamepadButtonInputId.SingleRightTrigger0,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER}, + {GamepadButtonInputId.SingleLeftTrigger0,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSHOULDER}, + }; + private readonly Dictionary _rightButtonsDriverMapping = new() + { + {GamepadButtonInputId.RightStick,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSTICK}, + {GamepadButtonInputId.A,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_B}, + {GamepadButtonInputId.B,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_Y}, + {GamepadButtonInputId.X,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A}, + {GamepadButtonInputId.Y,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_X}, + {GamepadButtonInputId.Plus,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_START}, + {GamepadButtonInputId.RightShoulder,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_PADDLE1}, + {GamepadButtonInputId.RightTrigger,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_PADDLE3}, + {GamepadButtonInputId.SingleRightTrigger1,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER}, + {GamepadButtonInputId.SingleLeftTrigger1,SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSHOULDER} + }; + + private readonly Dictionary _buttonsDriverMapping; + private readonly Lock _userMappingLock = new(); + + private readonly List _buttonsUserMapping; + + private readonly StickInputId[] _stickUserMapping = new StickInputId[(int)StickInputId.Count] + { + StickInputId.Unbound, StickInputId.Left, StickInputId.Right, + }; + + public GamepadFeaturesFlag Features { get; } + + private nint _gamepadHandle; + + private enum JoyConType + { + Left, Right + } + + public const string Prefix = "Nintendo Switch Joy-Con"; + public const string LeftName = "Nintendo Switch Joy-Con (L)"; + public const string RightName = "Nintendo Switch Joy-Con (R)"; + + private readonly JoyConType _joyConType; + + public SDL2JoyCon(nint gamepadHandle, string driverId) + { + _gamepadHandle = gamepadHandle; + _buttonsUserMapping = new List(10); + + Name = SDL_GameControllerName(_gamepadHandle); + Id = driverId; + Features = GetFeaturesFlag(); + + // Enable motion tracking + if (Features.HasFlag(GamepadFeaturesFlag.Motion)) + { + if (SDL_GameControllerSetSensorEnabled(_gamepadHandle, SDL_SensorType.SDL_SENSOR_ACCEL, + SDL_bool.SDL_TRUE) != 0) + { + Logger.Error?.Print(LogClass.Hid, + $"Could not enable data reporting for SensorType {SDL_SensorType.SDL_SENSOR_ACCEL}."); + } + + if (SDL_GameControllerSetSensorEnabled(_gamepadHandle, SDL_SensorType.SDL_SENSOR_GYRO, + SDL_bool.SDL_TRUE) != 0) + { + Logger.Error?.Print(LogClass.Hid, + $"Could not enable data reporting for SensorType {SDL_SensorType.SDL_SENSOR_GYRO}."); + } + } + + switch (Name) + { + case LeftName: + { + _buttonsDriverMapping = _leftButtonsDriverMapping; + _joyConType = JoyConType.Left; + break; + } + case RightName: + { + _buttonsDriverMapping = _rightButtonsDriverMapping; + _joyConType = JoyConType.Right; + break; + } + } + } + + private GamepadFeaturesFlag GetFeaturesFlag() + { + GamepadFeaturesFlag result = GamepadFeaturesFlag.None; + + if (SDL_GameControllerHasSensor(_gamepadHandle, SDL_SensorType.SDL_SENSOR_ACCEL) == SDL_bool.SDL_TRUE && + SDL_GameControllerHasSensor(_gamepadHandle, SDL_SensorType.SDL_SENSOR_GYRO) == SDL_bool.SDL_TRUE) + { + result |= GamepadFeaturesFlag.Motion; + } + + int error = SDL_GameControllerRumble(_gamepadHandle, 0, 0, 100); + + if (error == 0) + { + result |= GamepadFeaturesFlag.Rumble; + } + + return result; + } + + public string Id { get; } + public string Name { get; } + public bool IsConnected => SDL_GameControllerGetAttached(_gamepadHandle) == SDL_bool.SDL_TRUE; + + protected virtual void Dispose(bool disposing) + { + if (disposing && _gamepadHandle != nint.Zero) + { + SDL_GameControllerClose(_gamepadHandle); + + _gamepadHandle = nint.Zero; + } + } + + public void Dispose() + { + Dispose(true); + } + + public void SetTriggerThreshold(float triggerThreshold) + { + + } + + public void Rumble(float lowFrequency, float highFrequency, uint durationMs) + { + if (!Features.HasFlag(GamepadFeaturesFlag.Rumble)) + return; + + ushort lowFrequencyRaw = (ushort)(lowFrequency * ushort.MaxValue); + ushort highFrequencyRaw = (ushort)(highFrequency * ushort.MaxValue); + + if (durationMs == uint.MaxValue) + { + if (SDL_GameControllerRumble(_gamepadHandle, lowFrequencyRaw, highFrequencyRaw, SDL_HAPTIC_INFINITY) != + 0) + Logger.Error?.Print(LogClass.Hid, "Rumble is not supported on this game controller."); + } + else if (durationMs > SDL_HAPTIC_INFINITY) + { + Logger.Error?.Print(LogClass.Hid, $"Unsupported rumble duration {durationMs}"); + } + else + { + if (SDL_GameControllerRumble(_gamepadHandle, lowFrequencyRaw, highFrequencyRaw, durationMs) != 0) + Logger.Error?.Print(LogClass.Hid, "Rumble is not supported on this game controller."); + } + } + + public Vector3 GetMotionData(MotionInputId inputId) + { + SDL_SensorType sensorType = inputId switch + { + MotionInputId.Accelerometer => SDL_SensorType.SDL_SENSOR_ACCEL, + MotionInputId.Gyroscope => SDL_SensorType.SDL_SENSOR_GYRO, + _ => SDL_SensorType.SDL_SENSOR_INVALID + }; + + if (!Features.HasFlag(GamepadFeaturesFlag.Motion) || sensorType is SDL_SensorType.SDL_SENSOR_INVALID) + return Vector3.Zero; + + const int ElementCount = 3; + + unsafe + { + float* values = stackalloc float[ElementCount]; + + int result = SDL_GameControllerGetSensorData(_gamepadHandle, sensorType, (nint)values, ElementCount); + + if (result != 0) + return Vector3.Zero; + + Vector3 value = _joyConType switch + { + JoyConType.Left => new Vector3(-values[2], values[1], values[0]), + JoyConType.Right => new Vector3(values[2], values[1], -values[0]), + _ => throw new NotSupportedException($"Unsupported JoyCon type: {_joyConType}") + }; + + return inputId switch + { + MotionInputId.Gyroscope => RadToDegree(value), + MotionInputId.Accelerometer => GsToMs2(value), + _ => value + }; + } + } + + private static Vector3 RadToDegree(Vector3 rad) => rad * (180 / MathF.PI); + + private static Vector3 GsToMs2(Vector3 gs) => gs / SDL_STANDARD_GRAVITY; + + public void SetConfiguration(InputConfig configuration) + { + lock (_userMappingLock) + { + _configuration = (StandardControllerInputConfig)configuration; + + _buttonsUserMapping.Clear(); + + // First update sticks + _stickUserMapping[(int)StickInputId.Left] = (StickInputId)_configuration.LeftJoyconStick.Joystick; + _stickUserMapping[(int)StickInputId.Right] = (StickInputId)_configuration.RightJoyconStick.Joystick; + + switch (_joyConType) + { + case JoyConType.Left: + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftStick, (GamepadButtonInputId)_configuration.LeftJoyconStick.StickButton)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadUp, (GamepadButtonInputId)_configuration.LeftJoycon.DpadUp)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadDown, (GamepadButtonInputId)_configuration.LeftJoycon.DpadDown)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadLeft, (GamepadButtonInputId)_configuration.LeftJoycon.DpadLeft)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadRight, (GamepadButtonInputId)_configuration.LeftJoycon.DpadRight)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Minus, (GamepadButtonInputId)_configuration.LeftJoycon.ButtonMinus)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftShoulder, (GamepadButtonInputId)_configuration.LeftJoycon.ButtonL)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftTrigger, (GamepadButtonInputId)_configuration.LeftJoycon.ButtonZl)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleRightTrigger0, (GamepadButtonInputId)_configuration.LeftJoycon.ButtonSr)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleLeftTrigger0, (GamepadButtonInputId)_configuration.LeftJoycon.ButtonSl)); + break; + case JoyConType.Right: + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightStick, (GamepadButtonInputId)_configuration.RightJoyconStick.StickButton)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.A, (GamepadButtonInputId)_configuration.RightJoycon.ButtonA)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.B, (GamepadButtonInputId)_configuration.RightJoycon.ButtonB)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.X, (GamepadButtonInputId)_configuration.RightJoycon.ButtonX)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Y, (GamepadButtonInputId)_configuration.RightJoycon.ButtonY)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Plus, (GamepadButtonInputId)_configuration.RightJoycon.ButtonPlus)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightShoulder, (GamepadButtonInputId)_configuration.RightJoycon.ButtonR)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightTrigger, (GamepadButtonInputId)_configuration.RightJoycon.ButtonZr)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleRightTrigger1, (GamepadButtonInputId)_configuration.RightJoycon.ButtonSr)); + _buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleLeftTrigger1, (GamepadButtonInputId)_configuration.RightJoycon.ButtonSl)); + break; + default: + throw new NotSupportedException($"Unsupported JoyCon type: {_joyConType}"); + } + + SetTriggerThreshold(_configuration.TriggerThreshold); + } + } + + public void SetLed(uint packedRgb) + { + } + + public GamepadStateSnapshot GetStateSnapshot() + { + return IGamepad.GetStateSnapshot(this); + } + + public GamepadStateSnapshot GetMappedStateSnapshot() + { + GamepadStateSnapshot rawState = GetStateSnapshot(); + GamepadStateSnapshot result = default; + + lock (_userMappingLock) + { + if (_buttonsUserMapping.Count == 0) + return rawState; + + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator + foreach (ButtonMappingEntry entry in _buttonsUserMapping) + { + if (!entry.IsValid) + continue; + + // Do not touch state of button already pressed + if (!result.IsPressed(entry.To)) + { + result.SetPressed(entry.To, rawState.IsPressed(entry.From)); + } + } + + (float leftStickX, float leftStickY) = rawState.GetStick(_stickUserMapping[(int)StickInputId.Left]); + (float rightStickX, float rightStickY) = rawState.GetStick(_stickUserMapping[(int)StickInputId.Right]); + + result.SetStick(StickInputId.Left, leftStickX, leftStickY); + result.SetStick(StickInputId.Right, rightStickX, rightStickY); + } + + return result; + } + + private static float ConvertRawStickValue(short value) + { + const float ConvertRate = 1.0f / (short.MaxValue + 0.5f); + + return value * ConvertRate; + } + + private JoyconConfigControllerStick + GetLogicalJoyStickConfig(StickInputId inputId) + { + switch (inputId) + { + case StickInputId.Left: + if (_configuration.RightJoyconStick.Joystick == + Common.Configuration.Hid.Controller.StickInputId.Left) + return _configuration.RightJoyconStick; + else + return _configuration.LeftJoyconStick; + case StickInputId.Right: + if (_configuration.LeftJoyconStick.Joystick == + Common.Configuration.Hid.Controller.StickInputId.Right) + return _configuration.LeftJoyconStick; + else + return _configuration.RightJoyconStick; + } + + return null; + } + + public (float, float) GetStick(StickInputId inputId) + { + if (inputId == StickInputId.Unbound) + return (0.0f, 0.0f); + + if (inputId == StickInputId.Left && _joyConType == JoyConType.Right || inputId == StickInputId.Right && _joyConType == JoyConType.Left) + { + return (0.0f, 0.0f); + } + + (short stickX, short stickY) = GetStickXY(); + + float resultX = ConvertRawStickValue(stickX); + float resultY = -ConvertRawStickValue(stickY); + + if (HasConfiguration) + { + var joyconStickConfig = GetLogicalJoyStickConfig(inputId); + + if (joyconStickConfig != null) + { + if (joyconStickConfig.InvertStickX) + resultX = -resultX; + + if (joyconStickConfig.InvertStickY) + resultY = -resultY; + + if (joyconStickConfig.Rotate90CW) + { + float temp = resultX; + resultX = resultY; + resultY = -temp; + } + } + } + + return inputId switch + { + StickInputId.Left when _joyConType == JoyConType.Left => (resultY, -resultX), + StickInputId.Right when _joyConType == JoyConType.Right => (-resultY, resultX), + _ => (0.0f, 0.0f) + }; + } + + private (short, short) GetStickXY() + { + return ( + SDL_GameControllerGetAxis(_gamepadHandle, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_LEFTX), + SDL_GameControllerGetAxis(_gamepadHandle, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_LEFTY)); + } + + public bool IsPressed(GamepadButtonInputId inputId) + { + if (!_buttonsDriverMapping.TryGetValue(inputId, out var button)) + { + return false; + } + + return SDL_GameControllerGetButton(_gamepadHandle, button) == 1; + } + } +} diff --git a/src/Ryujinx.Input.SDL2/SDL2JoyConPair.cs b/src/Ryujinx.Input.SDL2/SDL2JoyConPair.cs new file mode 100644 index 000000000..a1e13aa45 --- /dev/null +++ b/src/Ryujinx.Input.SDL2/SDL2JoyConPair.cs @@ -0,0 +1,136 @@ +using Ryujinx.Common.Configuration.Hid; +using Ryujinx.Common.Configuration.Hid.Controller; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using static SDL2.SDL; + +namespace Ryujinx.Input.SDL2 +{ + internal class SDL2JoyConPair(IGamepad left, IGamepad right) : IGamepad + { + public GamepadFeaturesFlag Features => (left?.Features ?? GamepadFeaturesFlag.None) | + (right?.Features ?? GamepadFeaturesFlag.None); + + public const string Id = "JoyConPair"; + string IGamepad.Id => Id; + + public string Name => "* Nintendo Switch Joy-Con (L/R)"; + public bool IsConnected => left is { IsConnected: true } && right is { IsConnected: true }; + + public void Dispose() + { + left?.Dispose(); + right?.Dispose(); + } + + public GamepadStateSnapshot GetMappedStateSnapshot() + { + return GetStateSnapshot(); + } + + public Vector3 GetMotionData(MotionInputId inputId) + { + return inputId switch + { + MotionInputId.Accelerometer or + MotionInputId.Gyroscope => left.GetMotionData(inputId), + MotionInputId.SecondAccelerometer => right.GetMotionData(MotionInputId.Accelerometer), + MotionInputId.SecondGyroscope => right.GetMotionData(MotionInputId.Gyroscope), + _ => Vector3.Zero + }; + } + + public GamepadStateSnapshot GetStateSnapshot() + { + return IGamepad.GetStateSnapshot(this); + } + + public (float, float) GetStick(StickInputId inputId) + { + return inputId switch + { + StickInputId.Left => left.GetStick(StickInputId.Left), + StickInputId.Right => right.GetStick(StickInputId.Right), + _ => (0, 0) + }; + } + + public bool IsPressed(GamepadButtonInputId inputId) + { + return left.IsPressed(inputId) || right.IsPressed(inputId); + } + + public void Rumble(float lowFrequency, float highFrequency, uint durationMs) + { + if (lowFrequency != 0) + { + right.Rumble(lowFrequency, lowFrequency, durationMs); + } + + if (highFrequency != 0) + { + left.Rumble(highFrequency, highFrequency, durationMs); + } + + if (lowFrequency == 0 && highFrequency == 0) + { + left.Rumble(0, 0, durationMs); + right.Rumble(0, 0, durationMs); + } + } + + public void SetConfiguration(InputConfig configuration) + { + left.SetConfiguration(configuration); + right.SetConfiguration(configuration); + } + + public void SetLed(uint packedRgb) + { + } + + public void SetTriggerThreshold(float triggerThreshold) + { + left.SetTriggerThreshold(triggerThreshold); + right.SetTriggerThreshold(triggerThreshold); + } + + public static bool IsCombinable(List gamepadsIds) + { + (int leftIndex, int rightIndex) = DetectJoyConPair(gamepadsIds); + return leftIndex >= 0 && rightIndex >= 0; + } + + private static (int leftIndex, int rightIndex) DetectJoyConPair(List gamepadsIds) + { + var gamepadNames = gamepadsIds.Where(gamepadId => gamepadId != Id) + .Select((_, index) => SDL_GameControllerNameForIndex(index)).ToList(); + int leftIndex = gamepadNames.IndexOf(SDL2JoyCon.LeftName); + int rightIndex = gamepadNames.IndexOf(SDL2JoyCon.RightName); + + return (leftIndex, rightIndex); + } + + public static IGamepad GetGamepad(List gamepadsIds) + { + (int leftIndex, int rightIndex) = DetectJoyConPair(gamepadsIds); + if (leftIndex == -1 || rightIndex == -1) + { + return null; + } + + nint leftGamepadHandle = SDL_GameControllerOpen(leftIndex); + nint rightGamepadHandle = SDL_GameControllerOpen(rightIndex); + + if (leftGamepadHandle == nint.Zero || rightGamepadHandle == nint.Zero) + { + return null; + } + + return new SDL2JoyConPair(new SDL2JoyCon(leftGamepadHandle, gamepadsIds[leftIndex]), + new SDL2JoyCon(rightGamepadHandle, gamepadsIds[rightIndex])); + } + } +} diff --git a/src/Ryujinx.Input.SDL2/SDL2Keyboard.cs b/src/Ryujinx.Input.SDL2/SDL2Keyboard.cs index a0dd8ab95..1cbf4d35c 100644 --- a/src/Ryujinx.Input.SDL2/SDL2Keyboard.cs +++ b/src/Ryujinx.Input.SDL2/SDL2Keyboard.cs @@ -1,9 +1,11 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Keyboard; +using Ryujinx.Common.Logging; using System; using System.Collections.Generic; using System.Numerics; using System.Runtime.CompilerServices; +using System.Threading; using static SDL2.SDL; using ConfigKey = Ryujinx.Common.Configuration.Hid.Key; @@ -17,7 +19,7 @@ namespace Ryujinx.Input.SDL2 public bool IsValid => To is not GamepadButtonInputId.Unbound && From is not Key.Unbound; } - private readonly object _userMappingLock = new(); + private readonly Lock _userMappingLock = new(); #pragma warning disable IDE0052 // Remove unread private member private readonly SDL2KeyboardDriver _driver; @@ -25,8 +27,8 @@ namespace Ryujinx.Input.SDL2 private StandardKeyboardInputConfig _configuration; private readonly List _buttonsUserMapping; - private static readonly SDL_Keycode[] _keysDriverMapping = new SDL_Keycode[(int)Key.Count] - { + private static readonly SDL_Keycode[] _keysDriverMapping = + [ // INVALID SDL_Keycode.SDLK_0, // Presented as modifiers, so invalid here. @@ -164,15 +166,15 @@ namespace Ryujinx.Input.SDL2 SDL_Keycode.SDLK_BACKSLASH, // Invalids - SDL_Keycode.SDLK_0, - }; + SDL_Keycode.SDLK_0 + ]; public SDL2Keyboard(SDL2KeyboardDriver driver, string id, string name) { _driver = driver; Id = id; Name = name; - _buttonsUserMapping = new List(); + _buttonsUserMapping = []; } private bool HasConfiguration => _configuration != null; @@ -193,7 +195,7 @@ namespace Ryujinx.Input.SDL2 [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int ToSDL2Scancode(Key key) { - if (key >= Key.Unknown && key <= Key.Menu) + if (key is >= Key.Unknown and <= Key.Menu) { return -1; } @@ -384,6 +386,11 @@ namespace Ryujinx.Input.SDL2 } } + public void SetLed(uint packedRgb) + { + Logger.Info?.Print(LogClass.UI, "SetLed called on an SDL2Keyboard"); + } + public void SetTriggerThreshold(float triggerThreshold) { // No operations diff --git a/src/Ryujinx.Input.SDL2/SDL2Mouse.cs b/src/Ryujinx.Input.SDL2/SDL2Mouse.cs index 37b356b76..eb86fa799 100644 --- a/src/Ryujinx.Input.SDL2/SDL2Mouse.cs +++ b/src/Ryujinx.Input.SDL2/SDL2Mouse.cs @@ -1,4 +1,5 @@ using Ryujinx.Common.Configuration.Hid; +using Ryujinx.Common.Logging; using System; using System.Drawing; using System.Numerics; @@ -76,6 +77,11 @@ namespace Ryujinx.Input.SDL2 throw new NotImplementedException(); } + public void SetLed(uint packedRgb) + { + Logger.Info?.Print(LogClass.UI, "SetLed called on an SDL2Mouse"); + } + public void SetTriggerThreshold(float triggerThreshold) { throw new NotImplementedException(); diff --git a/src/Ryujinx.Input.SDL2/SDL2MouseDriver.cs b/src/Ryujinx.Input.SDL2/SDL2MouseDriver.cs index 768ea8c62..a1f6c1d7b 100644 --- a/src/Ryujinx.Input.SDL2/SDL2MouseDriver.cs +++ b/src/Ryujinx.Input.SDL2/SDL2MouseDriver.cs @@ -1,6 +1,7 @@ using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using System; +using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Numerics; @@ -105,7 +106,7 @@ namespace Ryujinx.Input.SDL2 case SDL_EventType.SDL_MOUSEBUTTONUP: uint rawButton = evnt.button.button; - if (rawButton > 0 && rawButton <= (int)MouseButton.Count) + if (rawButton is > 0 and <= ((int)MouseButton.Count)) { PressedButtons[(int)DriverButtonToMouseButton(rawButton)] = evnt.type == SDL_EventType.SDL_MOUSEBUTTONDOWN; @@ -164,6 +165,8 @@ namespace Ryujinx.Input.SDL2 return new SDL2Mouse(this); } + public IEnumerable GetGamepads() => [GetGamepad("0")]; + public void Dispose() { if (_isDisposed) diff --git a/src/Ryujinx.Input.SDL2/SDLKeyboardDriver.cs b/src/Ryujinx.Input.SDL2/SDLKeyboardDriver.cs index 965f7935a..25c6f4fe6 100644 --- a/src/Ryujinx.Input.SDL2/SDLKeyboardDriver.cs +++ b/src/Ryujinx.Input.SDL2/SDLKeyboardDriver.cs @@ -1,5 +1,6 @@ using Ryujinx.SDL2.Common; using System; +using System.Collections.Generic; namespace Ryujinx.Input.SDL2 { @@ -12,7 +13,7 @@ namespace Ryujinx.Input.SDL2 public string DriverName => "SDL2"; - private static readonly string[] _keyboardIdentifers = new string[1] { "0" }; + private static readonly string[] _keyboardIdentifers = ["0"]; public ReadOnlySpan GamepadsIds => _keyboardIdentifers; @@ -51,5 +52,13 @@ namespace Ryujinx.Input.SDL2 return new SDL2Keyboard(this, _keyboardIdentifers[0], "All keyboards"); } + + public IEnumerable GetGamepads() + { + foreach (string keyboardId in _keyboardIdentifers) + { + yield return GetGamepad(keyboardId); + } + } } } diff --git a/src/Ryujinx.Input/Assigner/GamepadButtonAssigner.cs b/src/Ryujinx.Input/Assigner/GamepadButtonAssigner.cs index 80fed2b82..4c8682da5 100644 --- a/src/Ryujinx.Input/Assigner/GamepadButtonAssigner.cs +++ b/src/Ryujinx.Input/Assigner/GamepadButtonAssigner.cs @@ -144,7 +144,7 @@ namespace Ryujinx.Input.Assigner { StringWriter writer = new(); - foreach (var kvp in _stats) + foreach (KeyValuePair kvp in _stats) { writer.WriteLine($"Button {kvp.Key} -> {kvp.Value}"); } diff --git a/src/Ryujinx.Input/GamepadFeaturesFlag.cs b/src/Ryujinx.Input/GamepadFeaturesFlag.cs index 69ec23686..8d3cda426 100644 --- a/src/Ryujinx.Input/GamepadFeaturesFlag.cs +++ b/src/Ryujinx.Input/GamepadFeaturesFlag.cs @@ -24,5 +24,10 @@ namespace Ryujinx.Input /// Also named sixaxis /// Motion, + + /// + /// The LED on the back of modern PlayStation controllers (DualSense & DualShock 4). + /// + Led, } } diff --git a/src/Ryujinx.Input/GamepadStateSnapshot.cs b/src/Ryujinx.Input/GamepadStateSnapshot.cs index 3de08f574..bf38b7c8a 100644 --- a/src/Ryujinx.Input/GamepadStateSnapshot.cs +++ b/src/Ryujinx.Input/GamepadStateSnapshot.cs @@ -32,7 +32,6 @@ namespace Ryujinx.Input [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool IsPressed(GamepadButtonInputId inputId) => _buttonsState[(int)inputId]; - /// /// Set the state of a given button. /// @@ -49,7 +48,7 @@ namespace Ryujinx.Input [MethodImpl(MethodImplOptions.AggressiveInlining)] public (float, float) GetStick(StickInputId inputId) { - var result = _joysticksState[(int)inputId]; + Array2 result = _joysticksState[(int)inputId]; return (result[0], result[1]); } diff --git a/src/Ryujinx.Input/HLE/NpadController.cs b/src/Ryujinx.Input/HLE/NpadController.cs index 380745283..b3979003e 100644 --- a/src/Ryujinx.Input/HLE/NpadController.cs +++ b/src/Ryujinx.Input/HLE/NpadController.cs @@ -27,7 +27,8 @@ namespace Ryujinx.Input.HLE } } - private static readonly HLEButtonMappingEntry[] _hleButtonMapping = { + private static readonly HLEButtonMappingEntry[] _hleButtonMapping = + [ new(GamepadButtonInputId.A, ControllerKeys.A), new(GamepadButtonInputId.B, ControllerKeys.B), new(GamepadButtonInputId.X, ControllerKeys.X), @@ -48,8 +49,8 @@ namespace Ryujinx.Input.HLE new(GamepadButtonInputId.SingleLeftTrigger0, ControllerKeys.SlLeft), new(GamepadButtonInputId.SingleRightTrigger0, ControllerKeys.SrLeft), new(GamepadButtonInputId.SingleLeftTrigger1, ControllerKeys.SlRight), - new(GamepadButtonInputId.SingleRightTrigger1, ControllerKeys.SrRight), - }; + new(GamepadButtonInputId.SingleRightTrigger1, ControllerKeys.SrRight) + ]; private class HLEKeyboardMappingEntry { @@ -63,7 +64,8 @@ namespace Ryujinx.Input.HLE } } - private static readonly HLEKeyboardMappingEntry[] _keyMapping = { + private static readonly HLEKeyboardMappingEntry[] _keyMapping = + [ new(Key.A, 0x4), new(Key.B, 0x5), new(Key.C, 0x6), @@ -186,10 +188,11 @@ namespace Ryujinx.Input.HLE new(Key.ControlRight, 0xE4), new(Key.ShiftRight, 0xE5), new(Key.AltRight, 0xE6), - new(Key.WinRight, 0xE7), - }; + new(Key.WinRight, 0xE7) + ]; - private static readonly HLEKeyboardMappingEntry[] _keyModifierMapping = { + private static readonly HLEKeyboardMappingEntry[] _keyModifierMapping = + [ new(Key.ControlLeft, 0), new(Key.ShiftLeft, 1), new(Key.AltLeft, 2), @@ -200,8 +203,8 @@ namespace Ryujinx.Input.HLE new(Key.WinRight, 7), new(Key.CapsLock, 8), new(Key.ScrollLock, 9), - new(Key.NumLock, 10), - }; + new(Key.NumLock, 10) + ]; private MotionInput _leftMotionInput; private MotionInput _rightMotionInput; @@ -266,17 +269,19 @@ namespace Ryujinx.Input.HLE if (motionConfig.MotionBackend != MotionInputBackendType.CemuHook) { _leftMotionInput = new MotionInput(); + _rightMotionInput = new MotionInput(); } else { _leftMotionInput = null; + _rightMotionInput = null; } } public void Update() { // _gamepad may be altered by other threads - var gamepad = _gamepad; + IGamepad gamepad = _gamepad; if (gamepad != null && GamepadDriver != null) { @@ -298,7 +303,20 @@ namespace Ryujinx.Input.HLE if (controllerConfig.ControllerType == ConfigControllerType.JoyconPair) { - _rightMotionInput = _leftMotionInput; + if (gamepad.Id == "JoyConPair") + { + Vector3 rightAccelerometer = gamepad.GetMotionData(MotionInputId.SecondAccelerometer); + Vector3 rightGyroscope = gamepad.GetMotionData(MotionInputId.SecondGyroscope); + + rightAccelerometer = new Vector3(rightAccelerometer.X, -rightAccelerometer.Z, rightAccelerometer.Y); + rightGyroscope = new Vector3(rightGyroscope.X, -rightGyroscope.Z, rightGyroscope.Y); + + _rightMotionInput.Update(rightAccelerometer, rightGyroscope, (ulong)PerformanceCounter.ElapsedNanoseconds / 1000, controllerConfig.Motion.Sensitivity, (float)controllerConfig.Motion.GyroDeadzone); + } + else + { + _rightMotionInput = _leftMotionInput; + } } } } @@ -333,6 +351,7 @@ namespace Ryujinx.Input.HLE // Reset states State = default; _leftMotionInput = null; + _rightMotionInput = null; } } @@ -489,7 +508,7 @@ namespace Ryujinx.Input.HLE public static KeyboardInput GetHLEKeyboardInput(IGamepadDriver KeyboardDriver) { - var keyboard = KeyboardDriver.GetGamepad("0") as IKeyboard; + IKeyboard keyboard = KeyboardDriver.GetGamepad("0") as IKeyboard; KeyboardStateSnapshot keyboardState = keyboard.GetKeyboardStateSnapshot(); diff --git a/src/Ryujinx.Input/HLE/NpadManager.cs b/src/Ryujinx.Input/HLE/NpadManager.cs index 1dc87358d..21219d91b 100644 --- a/src/Ryujinx.Input/HLE/NpadManager.cs +++ b/src/Ryujinx.Input/HLE/NpadManager.cs @@ -6,7 +6,9 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Numerics; using System.Runtime.CompilerServices; +using System.Threading; using CemuHookClient = Ryujinx.Input.Motion.CemuHook.Client; using ControllerType = Ryujinx.Common.Configuration.Hid.ControllerType; using PlayerIndex = Ryujinx.HLE.HOS.Services.Hid.PlayerIndex; @@ -18,7 +20,7 @@ namespace Ryujinx.Input.HLE { private readonly CemuHookClient _cemuHookClient; - private readonly object _lock = new(); + private readonly Lock _lock = new(); private bool _blockInputUpdates; @@ -44,7 +46,7 @@ namespace Ryujinx.Input.HLE _keyboardDriver = keyboardDriver; _gamepadDriver = gamepadDriver; _mouseDriver = mouseDriver; - _inputConfig = new List(); + _inputConfig = []; _gamepadDriver.OnGamepadConnected += HandleOnGamepadConnected; _gamepadDriver.OnGamepadDisconnected += HandleOnGamepadDisconnected; @@ -54,8 +56,8 @@ namespace Ryujinx.Input.HLE { lock (_lock) { - List validInputs = new(); - foreach (var inputConfigEntry in _inputConfig) + List validInputs = []; + foreach (InputConfig inputConfigEntry in _inputConfig) { if (_controllers[(int)inputConfigEntry.PlayerIndex] != null) { @@ -122,7 +124,7 @@ namespace Ryujinx.Input.HLE { NpadController[] oldControllers = _controllers.ToArray(); - List validInputs = new(); + List validInputs = []; foreach (InputConfig inputConfigEntry in inputConfig) { @@ -183,6 +185,15 @@ namespace Ryujinx.Input.HLE } } + public bool InputUpdatesBlocked + { + get + { + lock (_lock) + return _blockInputUpdates; + } + } + public void BlockInputUpdates() { lock (_lock) @@ -203,7 +214,7 @@ namespace Ryujinx.Input.HLE { lock (_lock) { - List hleInputStates = new(); + List hleInputStates = []; List hleMotionStates = new(NpadDevices.MaxControllers); KeyboardInput? hleKeyboardInput = null; @@ -233,7 +244,7 @@ namespace Ryujinx.Input.HLE isJoyconPair = inputConfig.ControllerType == ControllerType.JoyconPair; - var altMotionState = isJoyconPair ? controller.GetHLEMotionState(true) : default; + SixAxisInput altMotionState = isJoyconPair ? controller.GetHLEMotionState(true) : default; motionState = (controller.GetHLEMotionState(), altMotionState); } @@ -272,9 +283,9 @@ namespace Ryujinx.Input.HLE if (_enableMouse) { - var mouse = _mouseDriver.GetGamepad("0") as IMouse; + IMouse mouse = _mouseDriver.GetGamepad("0") as IMouse; - var mouseInput = IMouse.GetMouseStateSnapshot(mouse); + MouseStateSnapshot mouseInput = IMouse.GetMouseStateSnapshot(mouse); uint buttons = 0; @@ -303,7 +314,7 @@ namespace Ryujinx.Input.HLE buttons |= 1 << 4; } - var position = IMouse.GetScreenPosition(mouseInput.Position, mouse.ClientSize, aspectRatio); + Vector2 position = IMouse.GetScreenPosition(mouseInput.Position, mouse.ClientSize, aspectRatio); _device.Hid.Mouse.Update((int)position.X, (int)position.Y, buttons, (int)mouseInput.Scroll.X, (int)mouseInput.Scroll.Y, true); } @@ -320,7 +331,7 @@ namespace Ryujinx.Input.HLE { lock (_lock) { - return _inputConfig.Find(x => x.PlayerIndex == (Common.Configuration.Hid.PlayerIndex)index); + return _inputConfig.FirstOrDefault(x => x.PlayerIndex == (Common.Configuration.Hid.PlayerIndex)index); } } diff --git a/src/Ryujinx.Input/HLE/TouchScreenManager.cs b/src/Ryujinx.Input/HLE/TouchScreenManager.cs index c613f9281..28d800d18 100644 --- a/src/Ryujinx.Input/HLE/TouchScreenManager.cs +++ b/src/Ryujinx.Input/HLE/TouchScreenManager.cs @@ -2,6 +2,7 @@ using Ryujinx.HLE; using Ryujinx.HLE.HOS.Services.Hid; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen; using System; +using System.Numerics; namespace Ryujinx.Input.HLE { @@ -29,7 +30,7 @@ namespace Ryujinx.Input.HLE if (_wasClicking && !isClicking) { MouseStateSnapshot snapshot = IMouse.GetMouseStateSnapshot(_mouse); - var touchPosition = IMouse.GetScreenPosition(snapshot.Position, _mouse.ClientSize, aspectRatio); + Vector2 touchPosition = IMouse.GetScreenPosition(snapshot.Position, _mouse.ClientSize, aspectRatio); TouchPoint currentPoint = new() { @@ -58,7 +59,7 @@ namespace Ryujinx.Input.HLE if (aspectRatio > 0) { MouseStateSnapshot snapshot = IMouse.GetMouseStateSnapshot(_mouse); - var touchPosition = IMouse.GetScreenPosition(snapshot.Position, _mouse.ClientSize, aspectRatio); + Vector2 touchPosition = IMouse.GetScreenPosition(snapshot.Position, _mouse.ClientSize, aspectRatio); TouchAttribute attribute = TouchAttribute.None; diff --git a/src/Ryujinx.Input/IGamepad.cs b/src/Ryujinx.Input/IGamepad.cs index 3853f2819..832950660 100644 --- a/src/Ryujinx.Input/IGamepad.cs +++ b/src/Ryujinx.Input/IGamepad.cs @@ -65,6 +65,15 @@ namespace Ryujinx.Input /// The configuration of the gamepad void SetConfiguration(InputConfig configuration); + /// + /// Set the LED on the gamepad to a given color. + /// + /// Does nothing on a controller without LED functionality. + /// The packed RGB integer. + void SetLed(uint packedRgb); + + public void ClearLed() => SetLed(0); + /// /// Starts a rumble effect on the gamepad. /// diff --git a/src/Ryujinx.Input/IGamepadDriver.cs b/src/Ryujinx.Input/IGamepadDriver.cs index 625c3e694..50548c979 100644 --- a/src/Ryujinx.Input/IGamepadDriver.cs +++ b/src/Ryujinx.Input/IGamepadDriver.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace Ryujinx.Input { @@ -34,6 +35,11 @@ namespace Ryujinx.Input /// An instance of associated to the gamepad id given or null if not found IGamepad GetGamepad(string id); + /// + /// Returns an of the connected gamepads. + /// + IEnumerable GetGamepads(); + /// /// Clear the internal state of the driver. /// diff --git a/src/Ryujinx.Input/Motion/CemuHook/Client.cs b/src/Ryujinx.Input/Motion/CemuHook/Client.cs index e19f3d847..21e31a76e 100644 --- a/src/Ryujinx.Input/Motion/CemuHook/Client.cs +++ b/src/Ryujinx.Input/Motion/CemuHook/Client.cs @@ -1,3 +1,4 @@ +using Microsoft.IO; using Ryujinx.Common; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Controller; @@ -48,7 +49,7 @@ namespace Ryujinx.Input.Motion.CemuHook lock (_clients) { - foreach (var client in _clients) + foreach (KeyValuePair client in _clients) { try { @@ -209,7 +210,7 @@ namespace Ryujinx.Input.Motion.CemuHook { client.Client.ReceiveTimeout = timeout; - var result = client?.Receive(ref endPoint); + byte[] result = client?.Receive(ref endPoint); if (result.Length > 0) { @@ -225,7 +226,7 @@ namespace Ryujinx.Input.Motion.CemuHook private void SetRetryTimer(int clientId) { - var elapsedMs = PerformanceCounter.ElapsedMilliseconds; + long elapsedMs = PerformanceCounter.ElapsedMilliseconds; _clientRetryTimer[clientId] = elapsedMs; } @@ -338,9 +339,9 @@ namespace Ryujinx.Input.Motion.CemuHook { int slot = inputData.Shared.Slot; - if (_motionData.TryGetValue(clientId, out var motionDataItem)) + if (_motionData.TryGetValue(clientId, out Dictionary motionDataItem)) { - if (motionDataItem.TryGetValue(slot, out var previousData)) + if (motionDataItem.TryGetValue(slot, out MotionInput previousData)) { previousData.Update(accelerometer, gyroscrope, timestamp, cemuHookConfig.Sensitivity, (float)cemuHookConfig.GyroDeadzone); } @@ -367,6 +368,7 @@ namespace Ryujinx.Input.Motion.CemuHook RemoveClient(clientId); } } + break; } } @@ -380,7 +382,7 @@ namespace Ryujinx.Input.Motion.CemuHook Header header = GenerateHeader(clientId); - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); using BinaryWriter writer = new(stream); writer.WriteStruct(header); @@ -419,7 +421,7 @@ namespace Ryujinx.Input.Motion.CemuHook Header header = GenerateHeader(clientId); - using MemoryStream stream = MemoryStreamManager.Shared.GetStream(); + using RecyclableMemoryStream stream = MemoryStreamManager.Shared.GetStream(); using BinaryWriter writer = new(stream); writer.WriteStruct(header); diff --git a/src/Ryujinx.Input/MotionInputId.cs b/src/Ryujinx.Input/MotionInputId.cs index 8aeb043a9..c3768da96 100644 --- a/src/Ryujinx.Input/MotionInputId.cs +++ b/src/Ryujinx.Input/MotionInputId.cs @@ -21,5 +21,17 @@ namespace Ryujinx.Input /// /// Values are in degrees Gyroscope, + + /// + /// Second accelerometer. + /// + /// Values are in m/s^2 + SecondAccelerometer, + + /// + /// Second gyroscope. + /// + /// Values are in degrees + SecondGyroscope } } diff --git a/src/Ryujinx.Input/Ryujinx.Input.csproj b/src/Ryujinx.Input/Ryujinx.Input.csproj index 0974b707a..6741a2b3e 100644 --- a/src/Ryujinx.Input/Ryujinx.Input.csproj +++ b/src/Ryujinx.Input/Ryujinx.Input.csproj @@ -1,7 +1,6 @@ - net8.0 true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Memory/AddressSpaceManager.cs b/src/Ryujinx.Memory/AddressSpaceManager.cs index 807c5c0f4..f9d514b55 100644 --- a/src/Ryujinx.Memory/AddressSpaceManager.cs +++ b/src/Ryujinx.Memory/AddressSpaceManager.cs @@ -1,7 +1,6 @@ using Ryujinx.Memory.Range; using System; using System.Collections.Generic; -using System.Linq; using System.Runtime.CompilerServices; namespace Ryujinx.Memory @@ -106,10 +105,13 @@ namespace Ryujinx.Memory { if (size == 0) { - return Enumerable.Empty(); + yield break; } - return GetHostRegionsImpl(va, size); + foreach (HostMemoryRange hostRegion in GetHostRegionsImpl(va, size)) + { + yield return hostRegion; + } } /// @@ -117,51 +119,36 @@ namespace Ryujinx.Memory { if (size == 0) { - return Enumerable.Empty(); + yield break; } - var hostRegions = GetHostRegionsImpl(va, size); + IEnumerable hostRegions = GetHostRegionsImpl(va, size); if (hostRegions == null) { - return null; + yield break; } - var regions = new MemoryRange[hostRegions.Count]; - ulong backingStart = (ulong)_backingMemory.Pointer; ulong backingEnd = backingStart + _backingMemory.Size; - int count = 0; - - for (int i = 0; i < regions.Length; i++) + foreach (HostMemoryRange hostRegion in hostRegions) { - var hostRegion = hostRegions[i]; - if (hostRegion.Address >= backingStart && hostRegion.Address < backingEnd) { - regions[count++] = new MemoryRange(hostRegion.Address - backingStart, hostRegion.Size); + yield return new MemoryRange(hostRegion.Address - backingStart, hostRegion.Size); } } - - if (count != regions.Length) - { - return new ArraySegment(regions, 0, count); - } - - return regions; } - private List GetHostRegionsImpl(ulong va, ulong size) + private IEnumerable GetHostRegionsImpl(ulong va, ulong size) { if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size)) { - return null; + yield break; } int pages = GetPagesCount(va, size, out va); - var regions = new List(); - nuint regionStart = GetHostAddress(va); ulong regionSize = PageSize; @@ -169,14 +156,14 @@ namespace Ryujinx.Memory { if (!ValidateAddress(va + PageSize)) { - return null; + yield break; } nuint newHostAddress = GetHostAddress(va + PageSize); if (GetHostAddress(va) + PageSize != newHostAddress) { - regions.Add(new HostMemoryRange(regionStart, regionSize)); + yield return new HostMemoryRange(regionStart, regionSize); regionStart = newHostAddress; regionSize = 0; } @@ -185,9 +172,7 @@ namespace Ryujinx.Memory regionSize += PageSize; } - regions.Add(new HostMemoryRange(regionStart, regionSize)); - - return regions; + yield return new HostMemoryRange(regionStart, regionSize); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -248,8 +233,7 @@ namespace Ryujinx.Memory protected unsafe override Memory GetPhysicalAddressMemory(nuint pa, int size) => new NativeMemoryManager((byte*)pa, size).Memory; - protected override unsafe Span GetPhysicalAddressSpan(nuint pa, int size) - => new Span((void*)pa, size); + protected override unsafe Span GetPhysicalAddressSpan(nuint pa, int size) => new((void*)pa, size); protected override nuint TranslateVirtualAddressChecked(ulong va) => GetHostAddress(va); diff --git a/src/Ryujinx.Memory/BytesReadOnlySequenceSegment.cs b/src/Ryujinx.Memory/BytesReadOnlySequenceSegment.cs index 5fe8d936c..f759b2d98 100644 --- a/src/Ryujinx.Memory/BytesReadOnlySequenceSegment.cs +++ b/src/Ryujinx.Memory/BytesReadOnlySequenceSegment.cs @@ -14,7 +14,7 @@ namespace Ryujinx.Memory public BytesReadOnlySequenceSegment Append(Memory memory) { - var nextSegment = new BytesReadOnlySequenceSegment(memory) + BytesReadOnlySequenceSegment nextSegment = new(memory) { RunningIndex = RunningIndex + Memory.Length }; @@ -34,8 +34,8 @@ namespace Ryujinx.Memory /// True if the segments are contiguous, otherwise false public unsafe bool IsContiguousWith(Memory other, out nuint contiguousStart, out int contiguousSize) { - if (MemoryMarshal.TryGetMemoryManager>(Memory, out var thisMemoryManager) && - MemoryMarshal.TryGetMemoryManager>(other, out var otherMemoryManager) && + if (MemoryMarshal.TryGetMemoryManager>(Memory, out NativeMemoryManager thisMemoryManager) && + MemoryMarshal.TryGetMemoryManager>(other, out NativeMemoryManager otherMemoryManager) && thisMemoryManager.Pointer + thisMemoryManager.Length == otherMemoryManager.Pointer) { contiguousStart = (nuint)thisMemoryManager.Pointer; diff --git a/src/Ryujinx.Memory/IVirtualMemoryManager.cs b/src/Ryujinx.Memory/IVirtualMemoryManager.cs index 102cedc94..1f8ca37aa 100644 --- a/src/Ryujinx.Memory/IVirtualMemoryManager.cs +++ b/src/Ryujinx.Memory/IVirtualMemoryManager.cs @@ -118,7 +118,7 @@ namespace Ryujinx.Memory { int copySize = (int)Math.Min(MaxChunkSize, size - subOffset); - using var writableRegion = GetWritableRegion(va + subOffset, copySize); + using WritableRegion writableRegion = GetWritableRegion(va + subOffset, copySize); writableRegion.Memory.Span.Fill(value); } diff --git a/src/Ryujinx.Memory/MemoryManagementWindows.cs b/src/Ryujinx.Memory/MemoryManagementWindows.cs index 468355dd0..e5a50f866 100644 --- a/src/Ryujinx.Memory/MemoryManagementWindows.cs +++ b/src/Ryujinx.Memory/MemoryManagementWindows.cs @@ -102,7 +102,7 @@ namespace Ryujinx.Memory public static nint CreateSharedMemory(nint size, bool reserve) { - var prot = reserve ? FileMapProtection.SectionReserve : FileMapProtection.SectionCommit; + FileMapProtection prot = reserve ? FileMapProtection.SectionReserve : FileMapProtection.SectionCommit; nint handle = WindowsApi.CreateFileMapping( WindowsApi.InvalidHandleValue, diff --git a/src/Ryujinx.Memory/Range/MultiRange.cs b/src/Ryujinx.Memory/Range/MultiRange.cs index 093e21903..c3bb99f35 100644 --- a/src/Ryujinx.Memory/Range/MultiRange.cs +++ b/src/Ryujinx.Memory/Range/MultiRange.cs @@ -73,7 +73,7 @@ namespace Ryujinx.Memory.Range } else { - var ranges = new List(); + List ranges = []; foreach (MemoryRange range in _ranges) { diff --git a/src/Ryujinx.Memory/Range/MultiRangeList.cs b/src/Ryujinx.Memory/Range/MultiRangeList.cs index c3c6ae797..2204033d9 100644 --- a/src/Ryujinx.Memory/Range/MultiRangeList.cs +++ b/src/Ryujinx.Memory/Range/MultiRangeList.cs @@ -28,7 +28,7 @@ namespace Ryujinx.Memory.Range for (int i = 0; i < range.Count; i++) { - var subrange = range.GetSubRange(i); + MemoryRange subrange = range.GetSubRange(i); if (MemoryRange.IsInvalid(ref subrange)) { @@ -54,7 +54,7 @@ namespace Ryujinx.Memory.Range for (int i = 0; i < range.Count; i++) { - var subrange = range.GetSubRange(i); + MemoryRange subrange = range.GetSubRange(i); if (MemoryRange.IsInvalid(ref subrange)) { @@ -97,7 +97,7 @@ namespace Ryujinx.Memory.Range for (int i = 0; i < range.Count; i++) { - var subrange = range.GetSubRange(i); + MemoryRange subrange = range.GetSubRange(i); if (MemoryRange.IsInvalid(ref subrange)) { @@ -172,8 +172,8 @@ namespace Ryujinx.Memory.Range private List GetList() { - var items = _items.AsList(); - var result = new List(); + List> items = _items.AsList(); + List result = []; foreach (RangeNode item in items) { diff --git a/src/Ryujinx.Memory/Range/NonOverlappingRangeList.cs b/src/Ryujinx.Memory/Range/NonOverlappingRangeList.cs index 511589176..894078aee 100644 --- a/src/Ryujinx.Memory/Range/NonOverlappingRangeList.cs +++ b/src/Ryujinx.Memory/Range/NonOverlappingRangeList.cs @@ -26,7 +26,7 @@ namespace Ryujinx.Memory.Range // For instance, while a virtual mapping could cover 0-2 in physical space, the space 0-1 may have already been reserved... // So we need to return both the split 0-1 and 1-2 ranges. - var results = new T[1]; + T[] results = new T[1]; int count = FindOverlapsNonOverlapping(address, size, ref results); if (count == 0) diff --git a/src/Ryujinx.Memory/Ryujinx.Memory.csproj b/src/Ryujinx.Memory/Ryujinx.Memory.csproj index 17745dd61..9cdeba3f1 100644 --- a/src/Ryujinx.Memory/Ryujinx.Memory.csproj +++ b/src/Ryujinx.Memory/Ryujinx.Memory.csproj @@ -1,9 +1,9 @@  - net8.0 true $(DefaultItemExcludes);._* + true diff --git a/src/Ryujinx.Memory/SparseMemoryBlock.cs b/src/Ryujinx.Memory/SparseMemoryBlock.cs index 523685de1..7e46370d0 100644 --- a/src/Ryujinx.Memory/SparseMemoryBlock.cs +++ b/src/Ryujinx.Memory/SparseMemoryBlock.cs @@ -14,7 +14,7 @@ namespace Ryujinx.Memory private readonly PageInitDelegate _pageInit; - private readonly object _lock = new object(); + private readonly Lock _lock = new(); private readonly ulong _pageSize; private readonly MemoryBlock _reservedBlock; private readonly List _mappedBlocks; @@ -28,7 +28,7 @@ namespace Ryujinx.Memory { _pageSize = MemoryBlock.GetPageSize(); _reservedBlock = new MemoryBlock(size, MemoryAllocationFlags.Reserve | MemoryAllocationFlags.ViewCompatible); - _mappedBlocks = new List(); + _mappedBlocks = []; _pageInit = pageInit; int pages = (int)BitUtils.DivRoundUp(size, _pageSize); diff --git a/src/Ryujinx.Memory/Tracking/IMultiRegionHandle.cs b/src/Ryujinx.Memory/Tracking/IMultiRegionHandle.cs index 62b58344d..c4fd15f7e 100644 --- a/src/Ryujinx.Memory/Tracking/IMultiRegionHandle.cs +++ b/src/Ryujinx.Memory/Tracking/IMultiRegionHandle.cs @@ -23,7 +23,6 @@ namespace Ryujinx.Memory.Tracking /// Action to perform for modified regions void QueryModified(Action modifiedAction); - /// /// Check if part of the region has been modified within a given range, and perform an action for each. /// The range is aligned to the level of granularity of the contained handles. diff --git a/src/Ryujinx.Memory/Tracking/MemoryTracking.cs b/src/Ryujinx.Memory/Tracking/MemoryTracking.cs index 96cb2c5f5..e7791fec3 100644 --- a/src/Ryujinx.Memory/Tracking/MemoryTracking.cs +++ b/src/Ryujinx.Memory/Tracking/MemoryTracking.cs @@ -51,8 +51,8 @@ namespace Ryujinx.Memory.Tracking _invalidAccessHandler = invalidAccessHandler; _singleByteGuestTracking = singleByteGuestTracking; - _virtualRegions = new NonOverlappingRangeList(); - _guestVirtualRegions = new NonOverlappingRangeList(); + _virtualRegions = []; + _guestVirtualRegions = []; } private (ulong address, ulong size) PageAlign(ulong address, ulong size) @@ -76,7 +76,7 @@ namespace Ryujinx.Memory.Tracking lock (TrackingLock) { - ref var overlaps = ref ThreadStaticArray.Get(); + ref VirtualRegion[] overlaps = ref ThreadStaticArray.Get(); for (int type = 0; type < 2; type++) { @@ -114,7 +114,7 @@ namespace Ryujinx.Memory.Tracking lock (TrackingLock) { - ref var overlaps = ref ThreadStaticArray.Get(); + ref VirtualRegion[] overlaps = ref ThreadStaticArray.Get(); for (int type = 0; type < 2; type++) { @@ -165,7 +165,7 @@ namespace Ryujinx.Memory.Tracking /// A list of virtual regions within the given range internal List GetVirtualRegionsForHandle(ulong va, ulong size, bool guest) { - List result = new(); + List result = []; NonOverlappingRangeList regions = guest ? _guestVirtualRegions : _virtualRegions; regions.GetOrAddRegions(result, va, size, (va, size) => new VirtualRegion(this, va, size, guest)); @@ -228,7 +228,7 @@ namespace Ryujinx.Memory.Tracking /// The memory tracking handle public RegionHandle BeginTracking(ulong address, ulong size, int id, RegionFlags flags = RegionFlags.None) { - var (paAddress, paSize) = PageAlign(address, size); + (ulong paAddress, ulong paSize) = PageAlign(address, size); lock (TrackingLock) { @@ -251,7 +251,7 @@ namespace Ryujinx.Memory.Tracking /// The memory tracking handle internal RegionHandle BeginTrackingBitmap(ulong address, ulong size, ConcurrentBitmap bitmap, int bit, int id, RegionFlags flags = RegionFlags.None) { - var (paAddress, paSize) = PageAlign(address, size); + (ulong paAddress, ulong paSize) = PageAlign(address, size); lock (TrackingLock) { @@ -296,7 +296,7 @@ namespace Ryujinx.Memory.Tracking lock (TrackingLock) { - ref var overlaps = ref ThreadStaticArray.Get(); + ref VirtualRegion[] overlaps = ref ThreadStaticArray.Get(); NonOverlappingRangeList regions = guest ? _guestVirtualRegions : _virtualRegions; diff --git a/src/Ryujinx.Memory/Tracking/MultiRegionHandle.cs b/src/Ryujinx.Memory/Tracking/MultiRegionHandle.cs index 6fdca69f5..20d2a07ef 100644 --- a/src/Ryujinx.Memory/Tracking/MultiRegionHandle.cs +++ b/src/Ryujinx.Memory/Tracking/MultiRegionHandle.cs @@ -282,6 +282,7 @@ namespace Ryujinx.Memory.Tracking modifiedAction(rgStart, rgSize); rgSize = 0; } + rgStart = handle.RealAddress; } @@ -320,7 +321,7 @@ namespace Ryujinx.Memory.Tracking if (startHandle == lastHandle) { - var handle = _handles[startHandle]; + RegionHandle handle = _handles[startHandle]; if (_sequenceNumberBitmap.Set(startHandle)) { _uncheckedHandles--; @@ -410,7 +411,7 @@ namespace Ryujinx.Memory.Tracking { GC.SuppressFinalize(this); - foreach (var handle in _handles) + foreach (RegionHandle handle in _handles) { handle.Dispose(); } diff --git a/src/Ryujinx.Memory/Tracking/RegionFlags.cs b/src/Ryujinx.Memory/Tracking/RegionFlags.cs index ceb8e56a6..1eefdfbc0 100644 --- a/src/Ryujinx.Memory/Tracking/RegionFlags.cs +++ b/src/Ryujinx.Memory/Tracking/RegionFlags.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Ryujinx.Memory.Tracking { diff --git a/src/Ryujinx.Memory/Tracking/RegionHandle.cs b/src/Ryujinx.Memory/Tracking/RegionHandle.cs index a94ffa43c..f0edee3fc 100644 --- a/src/Ryujinx.Memory/Tracking/RegionHandle.cs +++ b/src/Ryujinx.Memory/Tracking/RegionHandle.cs @@ -51,7 +51,7 @@ namespace Ryujinx.Memory.Tracking private event Action OnDirty; - private readonly object _preActionLock = new(); + private readonly Lock _preActionLock = new(); private RegionSignal _preAction; // Action to perform before a read or write. This will block the memory access. private PreciseRegionSignal _preciseAction; // Action to perform on a precise read or write. private readonly List _regions; @@ -177,7 +177,7 @@ namespace Ryujinx.Memory.Tracking InitializeRegions(); } - private List GetGuestRegions(MemoryTracking tracking, ulong address, ulong size, RegionFlags flags) + private static List GetGuestRegions(MemoryTracking tracking, ulong address, ulong size, RegionFlags flags) { ulong guestAddress; ulong guestSize; @@ -199,7 +199,7 @@ namespace Ryujinx.Memory.Tracking _allRegions.AddRange(_regions); _allRegions.AddRange(_guestRegions); - foreach (var region in _allRegions) + foreach (VirtualRegion region in _allRegions) { region.Handles.Add(this); } @@ -217,8 +217,8 @@ namespace Ryujinx.Memory.Tracking { // Assumes the tracking lock is held, so nothing else can signal right now. - var oldBitmap = Bitmap; - var oldBit = DirtyBit; + ConcurrentBitmap oldBitmap = Bitmap; + int oldBit = DirtyBit; bitmap.Set(bit, Dirty); @@ -305,6 +305,7 @@ namespace Ryujinx.Memory.Tracking { OnDirty?.Invoke(); } + Parent?.SignalWrite(); } } diff --git a/src/Ryujinx.Memory/Tracking/SmartMultiRegionHandle.cs b/src/Ryujinx.Memory/Tracking/SmartMultiRegionHandle.cs index 57129a182..ccd60e8da 100644 --- a/src/Ryujinx.Memory/Tracking/SmartMultiRegionHandle.cs +++ b/src/Ryujinx.Memory/Tracking/SmartMultiRegionHandle.cs @@ -45,7 +45,7 @@ namespace Ryujinx.Memory.Tracking public void ForceDirty(ulong address, ulong size) { - foreach (var handle in _handles) + foreach (RegionHandle handle in _handles) { if (handle != null && handle.OverlapsWith(address, size)) { @@ -56,7 +56,7 @@ namespace Ryujinx.Memory.Tracking public void RegisterAction(RegionSignal action) { - foreach (var handle in _handles) + foreach (RegionHandle handle in _handles) { if (handle != null) { @@ -67,7 +67,7 @@ namespace Ryujinx.Memory.Tracking public void RegisterPreciseAction(PreciseRegionSignal action) { - foreach (var handle in _handles) + foreach (RegionHandle handle in _handles) { if (handle != null) { @@ -110,6 +110,7 @@ namespace Ryujinx.Memory.Tracking { splitLow.RegisterAction(signal); } + _handles[handleIndex] = splitLow; RegionHandle splitHigh = _tracking.BeginTracking(address + size, handle.Size - size, _id); @@ -118,6 +119,7 @@ namespace Ryujinx.Memory.Tracking { splitHigh.RegisterAction(signal); } + _handles[splitIndex] = splitHigh; } @@ -136,6 +138,7 @@ namespace Ryujinx.Memory.Tracking SplitHandle(i, startHandle); return; // The remainer of this handle should be filled in later on. } + break; } } @@ -201,6 +204,7 @@ namespace Ryujinx.Memory.Tracking modifiedAction(rgStart, rgSize); rgSize = 0; } + rgStart = handle.EndAddress; } @@ -255,6 +259,7 @@ namespace Ryujinx.Memory.Tracking modifiedAction(rgStart, rgSize); rgSize = 0; } + rgStart = handle.EndAddress; } @@ -273,7 +278,7 @@ namespace Ryujinx.Memory.Tracking { GC.SuppressFinalize(this); - foreach (var handle in _handles) + foreach (RegionHandle handle in _handles) { handle?.Dispose(); } diff --git a/src/Ryujinx.Memory/Tracking/VirtualRegion.cs b/src/Ryujinx.Memory/Tracking/VirtualRegion.cs index 35e9c2d9b..b86631db2 100644 --- a/src/Ryujinx.Memory/Tracking/VirtualRegion.cs +++ b/src/Ryujinx.Memory/Tracking/VirtualRegion.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Memory.Tracking /// class VirtualRegion : AbstractRegion { - public List Handles = new(); + public List Handles = []; private readonly MemoryTracking _tracking; private MemoryPermission _lastPermission; @@ -90,7 +90,7 @@ namespace Ryujinx.Memory.Tracking MemoryPermission result = MemoryPermission.ReadAndWrite; - foreach (var handle in Handles) + foreach (RegionHandle handle in Handles) { result &= handle.RequiredPermission; if (result == 0) @@ -98,6 +98,7 @@ namespace Ryujinx.Memory.Tracking return result; } } + return result; } @@ -142,8 +143,8 @@ namespace Ryujinx.Memory.Tracking Size = splitAddress - Address; // The new region inherits all of our parents. - newRegion.Handles = new List(Handles); - foreach (var parent in Handles) + newRegion.Handles = [.. Handles]; + foreach (RegionHandle parent in Handles) { parent.AddChild(newRegion); } diff --git a/src/Ryujinx.Memory/VirtualMemoryManagerBase.cs b/src/Ryujinx.Memory/VirtualMemoryManagerBase.cs index f41072244..9c49286b9 100644 --- a/src/Ryujinx.Memory/VirtualMemoryManagerBase.cs +++ b/src/Ryujinx.Memory/VirtualMemoryManagerBase.cs @@ -234,7 +234,7 @@ namespace Ryujinx.Memory nuint pa = TranslateVirtualAddressChecked(va); - var target = GetPhysicalAddressSpan(pa, data.Length); + Span target = GetPhysicalAddressSpan(pa, data.Length); bool changed = !data.SequenceEqual(target); @@ -400,6 +400,5 @@ namespace Ryujinx.Memory } } } - } } diff --git a/src/Ryujinx.Memory/WindowsShared/PlaceholderManager.cs b/src/Ryujinx.Memory/WindowsShared/PlaceholderManager.cs index 2a294bba9..f1bbf2f41 100644 --- a/src/Ryujinx.Memory/WindowsShared/PlaceholderManager.cs +++ b/src/Ryujinx.Memory/WindowsShared/PlaceholderManager.cs @@ -128,7 +128,7 @@ namespace Ryujinx.Memory.WindowsShared /// Memory block that owns the mapping public void MapView(nint sharedMemory, ulong srcOffset, nint location, nint size, MemoryBlock owner) { - ref var partialUnmapLock = ref GetPartialUnmapState().PartialUnmapLock; + ref NativeReaderWriterLock partialUnmapLock = ref GetPartialUnmapState().PartialUnmapLock; partialUnmapLock.AcquireReaderLock(); try @@ -155,7 +155,7 @@ namespace Ryujinx.Memory.WindowsShared { SplitForMap((ulong)location, (ulong)size, srcOffset); - var ptr = WindowsApi.MapViewOfFile3( + IntPtr ptr = WindowsApi.MapViewOfFile3( sharedMemory, WindowsApi.CurrentProcessHandle, location, @@ -187,7 +187,7 @@ namespace Ryujinx.Memory.WindowsShared { ulong endAddress = address + size; - var overlaps = new RangeNode[InitialOverlapsSize]; + RangeNode[] overlaps = new RangeNode[InitialOverlapsSize]; lock (_mappings) { @@ -196,7 +196,7 @@ namespace Ryujinx.Memory.WindowsShared Debug.Assert(count == 1); Debug.Assert(!IsMapped(overlaps[0].Value)); - var overlap = overlaps[0]; + RangeNode overlap = overlaps[0]; ulong overlapStart = overlap.Start; ulong overlapEnd = overlap.End; @@ -257,7 +257,7 @@ namespace Ryujinx.Memory.WindowsShared /// Memory block that owns the mapping public void UnmapView(nint sharedMemory, nint location, nint size, MemoryBlock owner) { - ref var partialUnmapLock = ref GetPartialUnmapState().PartialUnmapLock; + ref NativeReaderWriterLock partialUnmapLock = ref GetPartialUnmapState().PartialUnmapLock; partialUnmapLock.AcquireReaderLock(); try @@ -289,7 +289,7 @@ namespace Ryujinx.Memory.WindowsShared ulong unmapSize = (ulong)size; ulong endAddress = startAddress + unmapSize; - var overlaps = new RangeNode[InitialOverlapsSize]; + RangeNode[] overlaps = new RangeNode[InitialOverlapsSize]; int count; lock (_mappings) @@ -299,7 +299,7 @@ namespace Ryujinx.Memory.WindowsShared for (int index = 0; index < count; index++) { - var overlap = overlaps[index]; + RangeNode overlap = overlaps[index]; if (IsMapped(overlap.Value)) { @@ -319,8 +319,8 @@ namespace Ryujinx.Memory.WindowsShared // This is necessary because Windows does not support partial view unmaps. // That is, you can only fully unmap a view that was previously mapped, you can't just unmap a chunck of it. - ref var partialUnmapState = ref GetPartialUnmapState(); - ref var partialUnmapLock = ref partialUnmapState.PartialUnmapLock; + ref PartialUnmapState partialUnmapState = ref GetPartialUnmapState(); + ref NativeReaderWriterLock partialUnmapLock = ref partialUnmapState.PartialUnmapLock; partialUnmapLock.UpgradeToWriterLock(); try @@ -400,7 +400,7 @@ namespace Ryujinx.Memory.WindowsShared for (; node != null; node = successor) { successor = node.Successor; - var overlap = node; + RangeNode overlap = node; if (!IsMapped(overlap.Value)) { @@ -456,7 +456,7 @@ namespace Ryujinx.Memory.WindowsShared /// True if the reprotection was successful, false otherwise public bool ReprotectView(nint address, nint size, MemoryPermission permission) { - ref var partialUnmapLock = ref GetPartialUnmapState().PartialUnmapLock; + ref NativeReaderWriterLock partialUnmapLock = ref GetPartialUnmapState().PartialUnmapLock; partialUnmapLock.AcquireReaderLock(); try @@ -494,7 +494,7 @@ namespace Ryujinx.Memory.WindowsShared for (; node != null; node = successorNode) { successorNode = node.Successor; - var overlap = node; + RangeNode overlap = node; ulong mappedAddress = overlap.Start; ulong mappedSize = overlap.End - overlap.Start; @@ -604,7 +604,7 @@ namespace Ryujinx.Memory.WindowsShared for (; node != null; node = successorNode) { successorNode = node.Successor; - var protection = node; + RangeNode protection = node; ulong protAddress = protection.Start; ulong protEndAddress = protection.End; @@ -664,7 +664,7 @@ namespace Ryujinx.Memory.WindowsShared for (; node != null; node = successorNode) { successorNode = node.Successor; - var protection = node; + RangeNode protection = node; ulong protAddress = protection.Start; ulong protEndAddress = protection.End; @@ -698,7 +698,7 @@ namespace Ryujinx.Memory.WindowsShared private void RestoreRangeProtection(ulong address, ulong size) { ulong endAddress = address + size; - var overlaps = new RangeNode[InitialOverlapsSize]; + RangeNode[] overlaps = new RangeNode[InitialOverlapsSize]; int count; lock (_protections) @@ -708,7 +708,7 @@ namespace Ryujinx.Memory.WindowsShared for (int index = 0; index < count; index++) { - var protection = overlaps[index]; + RangeNode protection = overlaps[index]; // If protection is R/W we don't need to reprotect as views are initially mapped as R/W. if (protection.Value == MemoryPermission.ReadAndWrite) diff --git a/src/Ryujinx.Memory/WindowsShared/WindowsApi.cs b/src/Ryujinx.Memory/WindowsShared/WindowsApi.cs index 0d002dada..d146e55a4 100644 --- a/src/Ryujinx.Memory/WindowsShared/WindowsApi.cs +++ b/src/Ryujinx.Memory/WindowsShared/WindowsApi.cs @@ -1,4 +1,3 @@ -using System; using System.Runtime.InteropServices; using System.Runtime.Versioning; diff --git a/src/Ryujinx.SDL2.Common/Ryujinx.SDL2.Common.csproj b/src/Ryujinx.SDL2.Common/Ryujinx.SDL2.Common.csproj index 0811ad850..895d1a9ce 100644 --- a/src/Ryujinx.SDL2.Common/Ryujinx.SDL2.Common.csproj +++ b/src/Ryujinx.SDL2.Common/Ryujinx.SDL2.Common.csproj @@ -1,7 +1,6 @@ - net8.0 $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.SDL2.Common/SDL2Driver.cs b/src/Ryujinx.SDL2.Common/SDL2Driver.cs index 4d8961335..df11966bc 100644 --- a/src/Ryujinx.SDL2.Common/SDL2Driver.cs +++ b/src/Ryujinx.SDL2.Common/SDL2Driver.cs @@ -31,12 +31,16 @@ namespace Ryujinx.SDL2.Common private uint _refereceCount; private Thread _worker; + private const uint SDL_JOYBATTERYUPDATED = 1543; + public event Action OnJoyStickConnected; public event Action OnJoystickDisconnected; + public event Action OnJoyBatteryUpdated; + private ConcurrentDictionary> _registeredWindowHandlers; - private readonly object _lock = new(); + private readonly Lock _lock = new(); private SDL2Driver() { } @@ -61,7 +65,6 @@ namespace Ryujinx.SDL2.Common SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS, "1"); SDL_SetHint(SDL_HINT_VIDEO_ALLOW_SCREENSAVER, "1"); - // NOTE: As of SDL2 2.24.0, joycons are combined by default but the motion source only come from one of them. // We disable this behavior for now. SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS, "0"); @@ -143,6 +146,10 @@ namespace Ryujinx.SDL2.Common OnJoystickDisconnected?.Invoke(evnt.cbutton.which); } + else if ((uint)evnt.type == SDL_JOYBATTERYUPDATED) + { + OnJoyBatteryUpdated?.Invoke(evnt.cbutton.which, (SDL_JoystickPowerLevel)evnt.user.code); + } else if (evnt.type is SDL_EventType.SDL_WINDOWEVENT or SDL_EventType.SDL_MOUSEBUTTONDOWN or SDL_EventType.SDL_MOUSEBUTTONUP) { if (_registeredWindowHandlers.TryGetValue(evnt.window.windowID, out Action handler)) diff --git a/src/Ryujinx.ShaderTools/Ryujinx.ShaderTools.csproj b/src/Ryujinx.ShaderTools/Ryujinx.ShaderTools.csproj index 639ceeac2..08d587f9c 100644 --- a/src/Ryujinx.ShaderTools/Ryujinx.ShaderTools.csproj +++ b/src/Ryujinx.ShaderTools/Ryujinx.ShaderTools.csproj @@ -1,7 +1,6 @@ - net8.0 Exe Debug;Release $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Tests.Memory/MockVirtualMemoryManager.cs b/src/Ryujinx.Tests.Memory/MockVirtualMemoryManager.cs index 3fe44db21..a01521c8f 100644 --- a/src/Ryujinx.Tests.Memory/MockVirtualMemoryManager.cs +++ b/src/Ryujinx.Tests.Memory/MockVirtualMemoryManager.cs @@ -85,7 +85,7 @@ namespace Ryujinx.Tests.Memory IEnumerable IVirtualMemoryManager.GetPhysicalRegions(ulong va, ulong size) { - return NoMappings ? Array.Empty() : new MemoryRange[] { new MemoryRange(va, size) }; + return NoMappings ? Array.Empty() : new MemoryRange[] { new(va, size) }; } public bool IsMapped(ulong va) diff --git a/src/Ryujinx.Tests.Memory/MultiRegionTrackingTests.cs b/src/Ryujinx.Tests.Memory/MultiRegionTrackingTests.cs index c71a3e1f0..b35de3a82 100644 --- a/src/Ryujinx.Tests.Memory/MultiRegionTrackingTests.cs +++ b/src/Ryujinx.Tests.Memory/MultiRegionTrackingTests.cs @@ -208,7 +208,7 @@ namespace Ryujinx.Tests.Memory // Query some large regions to prep the subdivision of the tracking region. - int[] regionSizes = new int[] { 6, 4, 3, 2, 6, 1 }; + int[] regionSizes = [6, 4, 3, 2, 6, 1]; ulong address = 0; for (int i = 0; i < regionSizes.Length; i++) @@ -333,24 +333,24 @@ namespace Ryujinx.Tests.Memory // Finally, create a granular handle that inherits all these handles. - IEnumerable[] handleGroups = new IEnumerable[] - { + IEnumerable[] handleGroups = + [ granular.GetHandles(), singlePages, - doublePages, - }; + doublePages + ]; MultiRegionHandle combined = _tracking.BeginGranularTracking(0, PageSize * 18, handleGroups.SelectMany((handles) => handles), PageSize, 0); - bool[] expectedDirty = new bool[] - { + bool[] expectedDirty = + [ true, true, true, // Gap. false, true, false, // Multi-region. true, true, // Gap. false, true, false, // Individual handles. false, false, true, true, false, false, // Double size handles. - true, // Gap. - }; + true // Gap. + ]; for (int i = 0; i < 18; i++) { @@ -400,6 +400,8 @@ namespace Ryujinx.Tests.Memory Assert.AreEqual(singlePages[2], combinedHandles.ElementAt(10)); } + static readonly bool[] _expectedPagesModified = [true, false, false]; + [Test] public void PreciseAction() { @@ -409,7 +411,11 @@ namespace Ryujinx.Tests.Memory PreparePages(granular, 3, PageSize * 3); // Add a precise action to the second and third handle in the multiregion. - granular.RegisterPreciseAction(PageSize * 4, PageSize * 2, (_, _, _) => { actionTriggered = true; return true; }); + granular.RegisterPreciseAction(PageSize * 4, PageSize * 2, (_, _, _) => + { + actionTriggered = true; + return true; + }); // Precise write to first handle in the multiregion. _tracking.VirtualMemoryEvent(PageSize * 3, PageSize, true, precise: true); @@ -433,7 +439,7 @@ namespace Ryujinx.Tests.Memory Assert.IsTrue(actionTriggered); // Action triggered. // Precise writes are ignored on two later handles due to the action returning true. - Assert.AreEqual(pagesModified, new bool[] { true, false, false }); + Assert.AreEqual(pagesModified, _expectedPagesModified); } } } diff --git a/src/Ryujinx.Tests.Memory/Ryujinx.Tests.Memory.csproj b/src/Ryujinx.Tests.Memory/Ryujinx.Tests.Memory.csproj index 3bb4bf74d..e5ebca789 100644 --- a/src/Ryujinx.Tests.Memory/Ryujinx.Tests.Memory.csproj +++ b/src/Ryujinx.Tests.Memory/Ryujinx.Tests.Memory.csproj @@ -1,7 +1,6 @@ - net8.0 false $(DefaultItemExcludes);._* diff --git a/src/Ryujinx.Tests.Memory/TrackingTests.cs b/src/Ryujinx.Tests.Memory/TrackingTests.cs index c74446cfb..ac661924e 100644 --- a/src/Ryujinx.Tests.Memory/TrackingTests.cs +++ b/src/Ryujinx.Tests.Memory/TrackingTests.cs @@ -214,7 +214,7 @@ namespace Ryujinx.Tests.Memory handles[i].Reprotect(); } - List testThreads = new(); + List testThreads = []; // Dirty flag consumer threads int dirtyFlagReprotects = 0; @@ -329,6 +329,7 @@ namespace Ryujinx.Tests.Memory { _tracking.VirtualMemoryEvent((ulong)random.Next(PageSize), 4, false); } + Interlocked.Increment(ref signalThreadsDone); }); } diff --git a/src/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj b/src/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj index 2f7695356..00fe473c5 100644 --- a/src/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj +++ b/src/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj @@ -1,14 +1,13 @@ - + - net8.0 true Debug;Release $(DefaultItemExcludes);._* - false + true diff --git a/src/Ryujinx.Tests.Unicorn/UnicornAArch32.cs b/src/Ryujinx.Tests.Unicorn/UnicornAArch32.cs index 6fe62b741..41b40b177 100644 --- a/src/Ryujinx.Tests.Unicorn/UnicornAArch32.cs +++ b/src/Ryujinx.Tests.Unicorn/UnicornAArch32.cs @@ -122,7 +122,7 @@ namespace Ryujinx.Tests.Unicorn } private static readonly int[] _xRegisters = - { + [ Arm.UC_ARM_REG_R0, Arm.UC_ARM_REG_R1, Arm.UC_ARM_REG_R2, @@ -138,12 +138,12 @@ namespace Ryujinx.Tests.Unicorn Arm.UC_ARM_REG_R12, Arm.UC_ARM_REG_R13, Arm.UC_ARM_REG_R14, - Arm.UC_ARM_REG_R15, - }; + Arm.UC_ARM_REG_R15 + ]; #pragma warning disable IDE0051, IDE0052 // Remove unused private member private static readonly int[] _qRegisters = - { + [ Arm.UC_ARM_REG_Q0, Arm.UC_ARM_REG_Q1, Arm.UC_ARM_REG_Q2, @@ -159,8 +159,8 @@ namespace Ryujinx.Tests.Unicorn Arm.UC_ARM_REG_Q12, Arm.UC_ARM_REG_Q13, Arm.UC_ARM_REG_Q14, - Arm.UC_ARM_REG_Q15, - }; + Arm.UC_ARM_REG_Q15 + ]; #pragma warning restore IDE0051, IDE0052 public uint GetX(int index) @@ -259,7 +259,7 @@ namespace Ryujinx.Tests.Unicorn Uc.MemWrite((long)address, value); } - public void MemoryWrite8(ulong address, byte value) => MemoryWrite(address, new[] { value }); + public void MemoryWrite8(ulong address, byte value) => MemoryWrite(address, [value]); public void MemoryWrite16(ulong address, short value) => MemoryWrite(address, BitConverter.GetBytes(value)); public void MemoryWrite16(ulong address, ushort value) => MemoryWrite(address, BitConverter.GetBytes(value)); public void MemoryWrite32(ulong address, int value) => MemoryWrite(address, BitConverter.GetBytes(value)); diff --git a/src/Ryujinx.Tests.Unicorn/UnicornAArch64.cs b/src/Ryujinx.Tests.Unicorn/UnicornAArch64.cs index bdb535581..8525b0446 100644 --- a/src/Ryujinx.Tests.Unicorn/UnicornAArch64.cs +++ b/src/Ryujinx.Tests.Unicorn/UnicornAArch64.cs @@ -111,7 +111,7 @@ namespace Ryujinx.Tests.Unicorn } private static readonly int[] _xRegisters = - { + [ Arm64.UC_ARM64_REG_X0, Arm64.UC_ARM64_REG_X1, Arm64.UC_ARM64_REG_X2, @@ -142,11 +142,11 @@ namespace Ryujinx.Tests.Unicorn Arm64.UC_ARM64_REG_X27, Arm64.UC_ARM64_REG_X28, Arm64.UC_ARM64_REG_X29, - Arm64.UC_ARM64_REG_X30, - }; + Arm64.UC_ARM64_REG_X30 + ]; private static readonly int[] _qRegisters = - { + [ Arm64.UC_ARM64_REG_Q0, Arm64.UC_ARM64_REG_Q1, Arm64.UC_ARM64_REG_Q2, @@ -178,8 +178,8 @@ namespace Ryujinx.Tests.Unicorn Arm64.UC_ARM64_REG_Q28, Arm64.UC_ARM64_REG_Q29, Arm64.UC_ARM64_REG_Q30, - Arm64.UC_ARM64_REG_Q31, - }; + Arm64.UC_ARM64_REG_Q31 + ]; public ulong GetX(int index) { @@ -272,7 +272,7 @@ namespace Ryujinx.Tests.Unicorn Uc.MemWrite((long)address, value); } - public void MemoryWrite8(ulong address, byte value) => MemoryWrite(address, new[] { value }); + public void MemoryWrite8(ulong address, byte value) => MemoryWrite(address, [value]); public void MemoryWrite16(ulong address, short value) => MemoryWrite(address, BitConverter.GetBytes(value)); public void MemoryWrite16(ulong address, ushort value) => MemoryWrite(address, BitConverter.GetBytes(value)); public void MemoryWrite32(ulong address, int value) => MemoryWrite(address, BitConverter.GetBytes(value)); diff --git a/src/Ryujinx.Tests/Audio/Renderer/Server/PoolMapperTests.cs b/src/Ryujinx.Tests/Audio/Renderer/Server/PoolMapperTests.cs index d7879d627..941afae6f 100644 --- a/src/Ryujinx.Tests/Audio/Renderer/Server/PoolMapperTests.cs +++ b/src/Ryujinx.Tests/Audio/Renderer/Server/PoolMapperTests.cs @@ -85,7 +85,6 @@ namespace Ryujinx.Tests.Audio.Renderer.Server memoryPoolStateArray[i].SetCpuAddress(CpuAddress + (ulong)i * CpuSize, CpuSize); } - AddressInfo addressInfo = AddressInfo.Create(); PoolMapper poolMapper = new(DummyProcessHandle, true); diff --git a/src/Ryujinx.Tests/Common/Extensions/SequenceReaderExtensionsTests.cs b/src/Ryujinx.Tests/Common/Extensions/SequenceReaderExtensionsTests.cs index c0127530a..5aa088e78 100644 --- a/src/Ryujinx.Tests/Common/Extensions/SequenceReaderExtensionsTests.cs +++ b/src/Ryujinx.Tests/Common/Extensions/SequenceReaderExtensionsTests.cs @@ -23,9 +23,9 @@ namespace Ryujinx.Tests.Common.Extensions ReadOnlySequence sequence = CreateSegmentedByteSequence(originalStructs, maxSegmentSize ?? Unsafe.SizeOf()); - var sequenceReader = new SequenceReader(sequence); + SequenceReader sequenceReader = new(sequence); - foreach (var original in originalStructs) + foreach (MyUnmanagedStruct original in originalStructs) { // Act ref readonly MyUnmanagedStruct read = ref sequenceReader.GetRefOrRefToCopy(out _); @@ -43,12 +43,12 @@ namespace Ryujinx.Tests.Common.Extensions ReadOnlySequence sequence = CreateSegmentedByteSequence(originalStructs, 3); - var sequenceReader = new SequenceReader(sequence); + SequenceReader sequenceReader = new(sequence); - foreach (var original in originalStructs) + foreach (MyUnmanagedStruct original in originalStructs) { // Act - ref readonly MyUnmanagedStruct read = ref sequenceReader.GetRefOrRefToCopy(out var copy); + ref readonly MyUnmanagedStruct read = ref sequenceReader.GetRefOrRefToCopy(out MyUnmanagedStruct copy); // Assert MyUnmanagedStruct.Assert(Assert.AreEqual, original, read); @@ -64,12 +64,12 @@ namespace Ryujinx.Tests.Common.Extensions ReadOnlySequence sequence = CreateSegmentedByteSequence(originalStructs, int.MaxValue); - var sequenceReader = new SequenceReader(sequence); + SequenceReader sequenceReader = new(sequence); - foreach (var original in originalStructs) + foreach (MyUnmanagedStruct original in originalStructs) { // Act - ref readonly MyUnmanagedStruct read = ref sequenceReader.GetRefOrRefToCopy(out var copy); + ref readonly MyUnmanagedStruct read = ref sequenceReader.GetRefOrRefToCopy(out MyUnmanagedStruct copy); // Assert MyUnmanagedStruct.Assert(Assert.AreEqual, original, read); @@ -88,7 +88,7 @@ namespace Ryujinx.Tests.Common.Extensions // Act/Assert Assert.Throws(() => { - var sequenceReader = new SequenceReader(sequence); + SequenceReader sequenceReader = new(sequence); sequenceReader.Advance(1); @@ -106,7 +106,7 @@ namespace Ryujinx.Tests.Common.Extensions BinaryPrimitives.WriteInt32LittleEndian(buffer.AsSpan(), TestValue); - var sequenceReader = new SequenceReader(new ReadOnlySequence(buffer)); + SequenceReader sequenceReader = new(new ReadOnlySequence(buffer)); // Act sequenceReader.ReadLittleEndian(out int roundTrippedValue); @@ -125,7 +125,7 @@ namespace Ryujinx.Tests.Common.Extensions BinaryPrimitives.WriteInt32BigEndian(buffer.AsSpan(), TestValue); - var sequenceReader = new SequenceReader(new ReadOnlySequence(buffer)); + SequenceReader sequenceReader = new(new ReadOnlySequence(buffer)); // Act sequenceReader.ReadLittleEndian(out int roundTrippedValue); @@ -147,7 +147,7 @@ namespace Ryujinx.Tests.Common.Extensions // Act/Assert Assert.Throws(() => { - var sequenceReader = new SequenceReader(new ReadOnlySequence(buffer)); + SequenceReader sequenceReader = new(new ReadOnlySequence(buffer)); sequenceReader.Advance(1); sequenceReader.ReadLittleEndian(out int roundTrippedValue); @@ -173,7 +173,7 @@ namespace Ryujinx.Tests.Common.Extensions // Act/Assert Assert.Throws(() => { - var sequenceReader = new SequenceReader(sequence); + SequenceReader sequenceReader = new(sequence); sequenceReader.Advance(1); @@ -200,7 +200,7 @@ namespace Ryujinx.Tests.Common.Extensions Assert.Throws(() => { - var sequenceReader = new SequenceReader(sequence); + SequenceReader sequenceReader = new(sequence); sequenceReader.SetConsumed(MyUnmanagedStruct.SizeOf * StructCount + 1); }); @@ -213,9 +213,9 @@ namespace Ryujinx.Tests.Common.Extensions ReadOnlySequence sequence = CreateSegmentedByteSequence(originalStructs, maxSegmentLength); - var sequenceReader = new SequenceReader(sequence); + SequenceReader sequenceReader = new(sequence); - foreach (var original in originalStructs) + foreach (MyUnmanagedStruct original in originalStructs) { // Act sequenceReader.ReadUnmanaged(out MyUnmanagedStruct read); @@ -232,7 +232,7 @@ namespace Ryujinx.Tests.Common.Extensions ReadOnlySequence sequence = CreateSegmentedByteSequence(originalStructs, maxSegmentLength); - var sequenceReader = new SequenceReader(sequence); + SequenceReader sequenceReader = new(sequence); static void SetConsumedAndAssert(scoped ref SequenceReader sequenceReader, long consumed) { @@ -283,7 +283,7 @@ namespace Ryujinx.Tests.Common.Extensions const int BaseInt32Value = 0x1234abcd; const short BaseInt16Value = 0x5678; - var result = new MyUnmanagedStruct + MyUnmanagedStruct result = new() { BehaviourSize = BaseInt32Value ^ rng.Next(), MemoryPoolsSize = BaseInt32Value ^ rng.Next(), @@ -320,7 +320,7 @@ namespace Ryujinx.Tests.Common.Extensions private static IEnumerable EnumerateNewUnmanagedStructs() { - var rng = new Random(0); + Random rng = new(0); while (true) { @@ -331,7 +331,7 @@ namespace Ryujinx.Tests.Common.Extensions private static ReadOnlySequence CreateSegmentedByteSequence(T[] array, int maxSegmentLength) where T : unmanaged { byte[] arrayBytes = MemoryMarshal.AsBytes(array.AsSpan()).ToArray(); - var memory = new Memory(arrayBytes); + Memory memory = new(arrayBytes); int index = 0; BytesReadOnlySequenceSegment first = null, last = null; @@ -339,7 +339,7 @@ namespace Ryujinx.Tests.Common.Extensions while (index < memory.Length) { int nextSegmentLength = Math.Min(maxSegmentLength, memory.Length - index); - var nextSegment = memory.Slice(index, nextSegmentLength); + Memory nextSegment = memory.Slice(index, nextSegmentLength); if (first == null) { diff --git a/src/Ryujinx.Tests/Cpu/Arm64CodeGenCommonTests.cs b/src/Ryujinx.Tests/Cpu/Arm64CodeGenCommonTests.cs index 0092d9a11..98a806509 100644 --- a/src/Ryujinx.Tests/Cpu/Arm64CodeGenCommonTests.cs +++ b/src/Ryujinx.Tests/Cpu/Arm64CodeGenCommonTests.cs @@ -15,7 +15,7 @@ namespace Ryujinx.Tests.Cpu } public static readonly TestCase[] TestCases = - { + [ new() { Value = 0, Valid = false, ImmN = 0, ImmS = 0, ImmR = 0 }, new() { Value = 0x970977f35f848714, Valid = false, ImmN = 0, ImmS = 0, ImmR = 0 }, new() { Value = 0xffffffffffffffff, Valid = false, ImmN = 0, ImmS = 0, ImmR = 0 }, @@ -29,8 +29,8 @@ namespace Ryujinx.Tests.Cpu new() { Value = 0xc001c001c001c001, Valid = true, ImmN = 0, ImmS = 0x22, ImmR = 2 }, new() { Value = 0x0000038000000380, Valid = true, ImmN = 0, ImmS = 0x02, ImmR = 25 }, new() { Value = 0xffff8fffffff8fff, Valid = true, ImmN = 0, ImmS = 0x1c, ImmR = 17 }, - new() { Value = 0x000000000ffff800, Valid = true, ImmN = 1, ImmS = 0x10, ImmR = 53 }, - }; + new() { Value = 0x000000000ffff800, Valid = true, ImmN = 1, ImmS = 0x10, ImmR = 53 } + ]; [Test] public void BitImmTests([ValueSource(nameof(TestCases))] TestCase test) diff --git a/src/Ryujinx.Tests/Cpu/CpuTest.cs b/src/Ryujinx.Tests/Cpu/CpuTest.cs index da0f03e6b..c01a9e4e8 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTest.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTest.cs @@ -1,6 +1,5 @@ using ARMeilleure; using ARMeilleure.State; -using ARMeilleure.Translation; using NUnit.Framework; using Ryujinx.Cpu.Jit; using Ryujinx.Memory; @@ -14,11 +13,8 @@ namespace Ryujinx.Tests.Cpu public class CpuTest { protected static readonly ulong Size = MemoryBlock.GetPageSize(); -#pragma warning disable CA2211 // Non-constant fields should not be visible - protected static ulong CodeBaseAddress = Size; - protected static ulong DataBaseAddress = CodeBaseAddress + Size; -#pragma warning restore CA2211 - + protected static ulong CodeBaseAddress { get; set; } = Size; + protected static ulong DataBaseAddress { get; set; } = CodeBaseAddress + Size; private static readonly bool _ignoreFpcrFz = false; private static readonly bool _ignoreFpcrDn = false; diff --git a/src/Ryujinx.Tests/Cpu/CpuTest32.cs b/src/Ryujinx.Tests/Cpu/CpuTest32.cs index 6a690834f..e742c1713 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTest32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTest32.cs @@ -1,6 +1,5 @@ using ARMeilleure; using ARMeilleure.State; -using ARMeilleure.Translation; using NUnit.Framework; using Ryujinx.Cpu.Jit; using Ryujinx.Memory; @@ -14,11 +13,8 @@ namespace Ryujinx.Tests.Cpu public class CpuTest32 { protected static readonly uint Size = (uint)MemoryBlock.GetPageSize(); -#pragma warning disable CA2211 // Non-constant fields should not be visible - protected static uint CodeBaseAddress = Size; - protected static uint DataBaseAddress = CodeBaseAddress + Size; -#pragma warning restore CA2211 - + protected static uint CodeBaseAddress { get; set; } = Size; + protected static uint DataBaseAddress { get; set; } = CodeBaseAddress + Size; private uint _currAddress; private MemoryBlock _ram; @@ -296,7 +292,7 @@ namespace Ryujinx.Tests.Cpu FinalRegs = test.FinalRegs, }); - foreach (var (address, value) in test.MemoryDelta) + foreach ((ulong address, ushort value) in test.MemoryDelta) { testMem[address - DataBaseAddress + 0] = (byte)(value >> 0); testMem[address - DataBaseAddress + 1] = (byte)(value >> 8); @@ -422,6 +418,7 @@ namespace Ryujinx.Tests.Cpu { ManageFpTolerances(fpTolerances); } + Assert.That(V128ToSimdValue(_context.GetV(1)), Is.EqualTo(_unicornEmu.Q[1]), "V1"); Assert.That(V128ToSimdValue(_context.GetV(2)), Is.EqualTo(_unicornEmu.Q[2]), "V2"); Assert.That(V128ToSimdValue(_context.GetV(3)), Is.EqualTo(_unicornEmu.Q[3]), "V3"); diff --git a/src/Ryujinx.Tests/Cpu/CpuTestAlu32.cs b/src/Ryujinx.Tests/Cpu/CpuTestAlu32.cs index 1e66d8112..f13bc0f68 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestAlu32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestAlu32.cs @@ -12,8 +12,8 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] SuHAddSub8() { - return new[] - { + return + [ 0xe6100f90u, // SADD8 R0, R0, R0 0xe6100ff0u, // SSUB8 R0, R0, R0 0xe6300f90u, // SHADD8 R0, R0, R0 @@ -21,58 +21,58 @@ namespace Ryujinx.Tests.Cpu 0xe6500f90u, // UADD8 R0, R0, R0 0xe6500ff0u, // USUB8 R0, R0, R0 0xe6700f90u, // UHADD8 R0, R0, R0 - 0xe6700ff0u, // UHSUB8 R0, R0, R0 - }; + 0xe6700ff0u // UHSUB8 R0, R0, R0 + ]; } private static uint[] UQAddSub16() { - return new[] - { + return + [ 0xe6200f10u, // QADD16 R0, R0, R0 0xe6600f10u, // UQADD16 R0, R0, R0 - 0xe6600f70u, // UQSUB16 R0, R0, R0 - }; + 0xe6600f70u // UQSUB16 R0, R0, R0 + ]; } private static uint[] UQAddSub8() { - return new[] - { + return + [ 0xe6600f90u, // UQADD8 R0, R0, R0 - 0xe6600ff0u, // UQSUB8 R0, R0, R0 - }; + 0xe6600ff0u // UQSUB8 R0, R0, R0 + ]; } private static uint[] SsatUsat() { - return new[] - { + return + [ 0xe6a00010u, // SSAT R0, #1, R0, LSL #0 0xe6a00050u, // SSAT R0, #1, R0, ASR #32 0xe6e00010u, // USAT R0, #0, R0, LSL #0 - 0xe6e00050u, // USAT R0, #0, R0, ASR #32 - }; + 0xe6e00050u // USAT R0, #0, R0, ASR #32 + ]; } private static uint[] Ssat16Usat16() { - return new[] - { + return + [ 0xe6a00f30u, // SSAT16 R0, #1, R0 - 0xe6e00f30u, // USAT16 R0, #0, R0 - }; + 0xe6e00f30u // USAT16 R0, #0, R0 + ]; } private static uint[] LsrLslAsrRor() { - return new[] - { + return + [ 0xe1b00030u, // LSRS R0, R0, R0 0xe1b00010u, // LSLS R0, R0, R0 0xe1b00050u, // ASRS R0, R0, R0 - 0xe1b00070u, // RORS R0, R0, R0 - }; + 0xe1b00070u // RORS R0, R0, R0 + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestAluBinary.cs b/src/Ryujinx.Tests/Cpu/CpuTestAluBinary.cs index 1e48086b2..2b3aa61aa 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestAluBinary.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestAluBinary.cs @@ -36,8 +36,8 @@ namespace Ryujinx.Tests.Cpu // - xor 0 // Only includes non-C variant, as the other can be tested with unicorn. - return new[] - { + return + [ new CrcTest(0x00000000u, 0x00_00_00_00_00_00_00_00u, false, 0x00000000, 0x00000000, 0x00000000, 0x00000000), new CrcTest(0x00000000u, 0x7f_ff_ff_ff_ff_ff_ff_ffu, false, 0x2d02ef8d, 0xbe2612ff, 0xdebb20e3, 0xa9de8355), new CrcTest(0x00000000u, 0x80_00_00_00_00_00_00_00u, false, 0x00000000, 0x00000000, 0x00000000, 0xedb88320), @@ -48,8 +48,8 @@ namespace Ryujinx.Tests.Cpu new CrcTest(0xffffffffu, 0x7f_ff_ff_ff_ff_ff_ff_ffu, false, 0x00ffffff, 0x0000ffff, 0x00000000, 0x3303a3c3), new CrcTest(0xffffffffu, 0x80_00_00_00_00_00_00_00u, false, 0x2dfd1072, 0xbe26ed00, 0xdebb20e3, 0x7765a3b6), new CrcTest(0xffffffffu, 0xff_ff_ff_ff_ff_ff_ff_ffu, false, 0x00ffffff, 0x0000ffff, 0x00000000, 0xdebb20e3), - new CrcTest(0xffffffffu, 0xa0_02_f1_ca_52_78_8c_1cu, false, 0x39fc4c3d, 0xbc5f7f56, 0x4ed8e906, 0x12cb419c), - }; + new CrcTest(0xffffffffu, 0xa0_02_f1_ca_52_78_8c_1cu, false, 0x39fc4c3d, 0xbc5f7f56, 0x4ed8e906, 0x12cb419c) + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestAluBinary32.cs b/src/Ryujinx.Tests/Cpu/CpuTestAluBinary32.cs index 43d054368..29d34605d 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestAluBinary32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestAluBinary32.cs @@ -36,8 +36,8 @@ namespace Ryujinx.Tests.Cpu // - bytes in order of increasing significance // - xor 0 - return new[] - { + return + [ new CrcTest32(0x00000000u, 0x00_00_00_00u, false, 0x00000000, 0x00000000, 0x00000000), new CrcTest32(0x00000000u, 0x7f_ff_ff_ffu, false, 0x2d02ef8d, 0xbe2612ff, 0x3303a3c3), new CrcTest32(0x00000000u, 0x80_00_00_00u, false, 0x00000000, 0x00000000, 0xedb88320), @@ -60,8 +60,8 @@ namespace Ryujinx.Tests.Cpu new CrcTest32(0xffffffffu, 0x7f_ff_ff_ffu, true, 0x00ffffff, 0x0000ffff, 0x82f63b78), new CrcTest32(0xffffffffu, 0x80_00_00_00u, true, 0xad82acae, 0x0e9e882d, 0x356e8f40), new CrcTest32(0xffffffffu, 0xff_ff_ff_ffu, true, 0x00ffffff, 0x0000ffff, 0x00000000), - new CrcTest32(0xffffffffu, 0x9d_cb_12_f0u, true, 0x5eecc3db, 0xbb6111cb, 0xcfb54fc9), - }; + new CrcTest32(0xffffffffu, 0x9d_cb_12_f0u, true, 0x5eecc3db, 0xbb6111cb, 0xcfb54fc9) + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestAluImm32.cs b/src/Ryujinx.Tests/Cpu/CpuTestAluImm32.cs index eeeef085c..1e53b6e32 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestAluImm32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestAluImm32.cs @@ -12,8 +12,8 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] Opcodes() { - return new[] - { + return + [ 0xe2a00000u, // ADC R0, R0, #0 0xe2b00000u, // ADCS R0, R0, #0 0xe2800000u, // ADD R0, R0, #0 @@ -27,8 +27,8 @@ namespace Ryujinx.Tests.Cpu 0xe2c00000u, // SBC R0, R0, #0 0xe2d00000u, // SBCS R0, R0, #0 0xe2400000u, // SUB R0, R0, #0 - 0xe2500000u, // SUBS R0, R0, #0 - }; + 0xe2500000u // SUBS R0, R0, #0 + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestAluRs32.cs b/src/Ryujinx.Tests/Cpu/CpuTestAluRs32.cs index 0e71b1839..48480f58b 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestAluRs32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestAluRs32.cs @@ -12,30 +12,29 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _Add_Adds_Rsb_Rsbs_() { - return new[] - { + return + [ 0xe0800000u, // ADD R0, R0, R0, LSL #0 0xe0900000u, // ADDS R0, R0, R0, LSL #0 0xe0600000u, // RSB R0, R0, R0, LSL #0 - 0xe0700000u, // RSBS R0, R0, R0, LSL #0 - }; + 0xe0700000u // RSBS R0, R0, R0, LSL #0 + ]; } private static uint[] _Adc_Adcs_Rsc_Rscs_Sbc_Sbcs_() { - return new[] - { + return + [ 0xe0a00000u, // ADC R0, R0, R0 0xe0b00000u, // ADCS R0, R0, R0 0xe0e00000u, // RSC R0, R0, R0 0xe0f00000u, // RSCS R0, R0, R0 0xe0c00000u, // SBC R0, R0, R0 - 0xe0d00000u, // SBCS R0, R0, R0 - }; + 0xe0d00000u // SBCS R0, R0, R0 + ]; } #endregion - [Test, Pairwise] public void Adc_Adcs_Rsc_Rscs_Sbc_Sbcs([ValueSource(nameof(_Adc_Adcs_Rsc_Rscs_Sbc_Sbcs_))] uint opcode, [Values(0u, 13u)] uint rd, diff --git a/src/Ryujinx.Tests/Cpu/CpuTestBf32.cs b/src/Ryujinx.Tests/Cpu/CpuTestBf32.cs index 197171b8d..2006ae5f8 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestBf32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestBf32.cs @@ -65,6 +65,7 @@ namespace Ryujinx.Tests.Cpu { widthm1 -= (lsb + widthm1) - 31; } + uint opcode = 0xe7e00050u; // UBFX R0, R0, #0, #1 opcode |= ((rd & 0xf) << 12); opcode |= ((rn & 0xf) << 0); @@ -90,6 +91,7 @@ namespace Ryujinx.Tests.Cpu { widthm1 -= (lsb + widthm1) - 31; } + uint opcode = 0xe7a00050u; // SBFX R0, R0, #0, #1 opcode |= ((rd & 0xf) << 12); opcode |= ((rn & 0xf) << 0); diff --git a/src/Ryujinx.Tests/Cpu/CpuTestMisc32.cs b/src/Ryujinx.Tests/Cpu/CpuTestMisc32.cs index e984a1584..4921193a2 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestMisc32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestMisc32.cs @@ -90,16 +90,19 @@ namespace Ryujinx.Tests.Cpu { Opcode(0xEEE10A10); // VMSR FPSCR, R0 } + Opcode(0xEEB48A4A); // VCMP.F32 S16, S20 if (mode2) { Opcode(0xEEF10A10); // VMRS R0, FPSCR Opcode(0xE200020F); // AND R0, #0xF0000000 // R0 &= "Fpsr.Nzcv". } + if (mode3) { Opcode(0xEEF1FA10); // VMRS APSR_NZCV, FPSCR } + Opcode(0xE12FFF1E); // BX LR ExecuteOpcodes(); diff --git a/src/Ryujinx.Tests/Cpu/CpuTestMul32.cs b/src/Ryujinx.Tests/Cpu/CpuTestMul32.cs index 7e4b4c062..b39b0bef9 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestMul32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestMul32.cs @@ -12,42 +12,42 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _Smlabb_Smlabt_Smlatb_Smlatt_() { - return new[] - { + return + [ 0xe1000080u, // SMLABB R0, R0, R0, R0 0xe10000C0u, // SMLABT R0, R0, R0, R0 0xe10000A0u, // SMLATB R0, R0, R0, R0 - 0xe10000E0u, // SMLATT R0, R0, R0, R0 - }; + 0xe10000E0u // SMLATT R0, R0, R0, R0 + ]; } private static uint[] _Smlawb_Smlawt_() { - return new[] - { + return + [ 0xe1200080u, // SMLAWB R0, R0, R0, R0 - 0xe12000C0u, // SMLAWT R0, R0, R0, R0 - }; + 0xe12000C0u // SMLAWT R0, R0, R0, R0 + ]; } private static uint[] _Smulbb_Smulbt_Smultb_Smultt_() { - return new[] - { + return + [ 0xe1600080u, // SMULBB R0, R0, R0 0xe16000C0u, // SMULBT R0, R0, R0 0xe16000A0u, // SMULTB R0, R0, R0 - 0xe16000E0u, // SMULTT R0, R0, R0 - }; + 0xe16000E0u // SMULTT R0, R0, R0 + ]; } private static uint[] _Smulwb_Smulwt_() { - return new[] - { + return + [ 0xe12000a0u, // SMULWB R0, R0, R0 - 0xe12000e0u, // SMULWT R0, R0, R0 - }; + 0xe12000e0u // SMULWT R0, R0, R0 + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimd.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimd.cs index eb763618d..f733f3e61 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimd.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimd.cs @@ -101,122 +101,135 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Types)" private static ulong[] _1B1H1S1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x000000000000007Ful, 0x0000000000000080ul, 0x00000000000000FFul, 0x0000000000007FFFul, 0x0000000000008000ul, 0x000000000000FFFFul, 0x000000007FFFFFFFul, 0x0000000080000000ul, 0x00000000FFFFFFFFul, 0x7FFFFFFFFFFFFFFFul, 0x8000000000000000ul, - 0xFFFFFFFFFFFFFFFFul, - }; + 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _1H1S1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x0000000000007FFFul, 0x0000000000008000ul, 0x000000000000FFFFul, 0x000000007FFFFFFFul, 0x0000000080000000ul, 0x00000000FFFFFFFFul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _1S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x000000007FFFFFFFul, - 0x0000000080000000ul, 0x00000000FFFFFFFFul, - }; + 0x0000000080000000ul, 0x00000000FFFFFFFFul + ]; } private static ulong[] _2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _4H_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul, - 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _4H2S1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, 0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, - 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B4H_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul, - 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B4H2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B4H2S1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, 0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static uint[] _W_() { - return new[] { + return + [ 0x00000000u, 0x7FFFFFFFu, - 0x80000000u, 0xFFFFFFFFu, - }; + 0x80000000u, 0xFFFFFFFFu + ]; } private static ulong[] _X_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static IEnumerable _1H_F_() @@ -694,558 +707,558 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _SU_Add_Max_Min_V_V_8BB_4HH_() { - return new[] - { + return + [ 0x0E31B800u, // ADDV B0, V0.8B 0x0E30A800u, // SMAXV B0, V0.8B 0x0E31A800u, // SMINV B0, V0.8B 0x2E30A800u, // UMAXV B0, V0.8B - 0x2E31A800u, // UMINV B0, V0.8B - }; + 0x2E31A800u // UMINV B0, V0.8B + ]; } private static uint[] _SU_Add_Max_Min_V_V_16BB_8HH_4SS_() { - return new[] - { + return + [ 0x4E31B800u, // ADDV B0, V0.16B 0x4E30A800u, // SMAXV B0, V0.16B 0x4E31A800u, // SMINV B0, V0.16B 0x6E30A800u, // UMAXV B0, V0.16B - 0x6E31A800u, // UMINV B0, V0.16B - }; + 0x6E31A800u // UMINV B0, V0.16B + ]; } private static uint[] _F_Abs_Neg_Recpx_Sqrt_S_S_() { - return new[] - { + return + [ 0x1E20C020u, // FABS S0, S1 0x1E214020u, // FNEG S0, S1 0x5EA1F820u, // FRECPX S0, S1 - 0x1E21C020u, // FSQRT S0, S1 - }; + 0x1E21C020u // FSQRT S0, S1 + ]; } private static uint[] _F_Abs_Neg_Recpx_Sqrt_S_D_() { - return new[] - { + return + [ 0x1E60C020u, // FABS D0, D1 0x1E614020u, // FNEG D0, D1 0x5EE1F820u, // FRECPX D0, D1 - 0x1E61C020u, // FSQRT D0, D1 - }; + 0x1E61C020u // FSQRT D0, D1 + ]; } private static uint[] _F_Abs_Neg_Sqrt_V_2S_4S_() { - return new[] - { + return + [ 0x0EA0F800u, // FABS V0.2S, V0.2S 0x2EA0F800u, // FNEG V0.2S, V0.2S - 0x2EA1F800u, // FSQRT V0.2S, V0.2S - }; + 0x2EA1F800u // FSQRT V0.2S, V0.2S + ]; } private static uint[] _F_Abs_Neg_Sqrt_V_2D_() { - return new[] - { + return + [ 0x4EE0F800u, // FABS V0.2D, V0.2D 0x6EE0F800u, // FNEG V0.2D, V0.2D - 0x6EE1F800u, // FSQRT V0.2D, V0.2D - }; + 0x6EE1F800u // FSQRT V0.2D, V0.2D + ]; } private static uint[] _F_Add_Max_Min_Nm_P_S_2SS_() { - return new[] - { + return + [ 0x7E30D820u, // FADDP S0, V1.2S 0x7E30C820u, // FMAXNMP S0, V1.2S 0x7E30F820u, // FMAXP S0, V1.2S 0x7EB0C820u, // FMINNMP S0, V1.2S - 0x7EB0F820u, // FMINP S0, V1.2S - }; + 0x7EB0F820u // FMINP S0, V1.2S + ]; } private static uint[] _F_Add_Max_Min_Nm_P_S_2DD_() { - return new[] - { + return + [ 0x7E70D820u, // FADDP D0, V1.2D 0x7E70C820u, // FMAXNMP D0, V1.2D 0x7E70F820u, // FMAXP D0, V1.2D 0x7EF0C820u, // FMINNMP D0, V1.2D - 0x7EF0F820u, // FMINP D0, V1.2D - }; + 0x7EF0F820u // FMINP D0, V1.2D + ]; } private static uint[] _F_Cm_EqGeGtLeLt_S_S_() { - return new[] - { + return + [ 0x5EA0D820u, // FCMEQ S0, S1, #0.0 0x7EA0C820u, // FCMGE S0, S1, #0.0 0x5EA0C820u, // FCMGT S0, S1, #0.0 0x7EA0D820u, // FCMLE S0, S1, #0.0 - 0x5EA0E820u, // FCMLT S0, S1, #0.0 - }; + 0x5EA0E820u // FCMLT S0, S1, #0.0 + ]; } private static uint[] _F_Cm_EqGeGtLeLt_S_D_() { - return new[] - { + return + [ 0x5EE0D820u, // FCMEQ D0, D1, #0.0 0x7EE0C820u, // FCMGE D0, D1, #0.0 0x5EE0C820u, // FCMGT D0, D1, #0.0 0x7EE0D820u, // FCMLE D0, D1, #0.0 - 0x5EE0E820u, // FCMLT D0, D1, #0.0 - }; + 0x5EE0E820u // FCMLT D0, D1, #0.0 + ]; } private static uint[] _F_Cm_EqGeGtLeLt_V_2S_4S_() { - return new[] - { + return + [ 0x0EA0D800u, // FCMEQ V0.2S, V0.2S, #0.0 0x2EA0C800u, // FCMGE V0.2S, V0.2S, #0.0 0x0EA0C800u, // FCMGT V0.2S, V0.2S, #0.0 0x2EA0D800u, // FCMLE V0.2S, V0.2S, #0.0 - 0x0EA0E800u, // FCMLT V0.2S, V0.2S, #0.0 - }; + 0x0EA0E800u // FCMLT V0.2S, V0.2S, #0.0 + ]; } private static uint[] _F_Cm_EqGeGtLeLt_V_2D_() { - return new[] - { + return + [ 0x4EE0D800u, // FCMEQ V0.2D, V0.2D, #0.0 0x6EE0C800u, // FCMGE V0.2D, V0.2D, #0.0 0x4EE0C800u, // FCMGT V0.2D, V0.2D, #0.0 0x6EE0D800u, // FCMLE V0.2D, V0.2D, #0.0 - 0x4EE0E800u, // FCMLT V0.2D, V0.2D, #0.0 - }; + 0x4EE0E800u // FCMLT V0.2D, V0.2D, #0.0 + ]; } private static uint[] _F_Cmp_Cmpe_S_S_() { - return new[] - { + return + [ 0x1E202028u, // FCMP S1, #0.0 - 0x1E202038u, // FCMPE S1, #0.0 - }; + 0x1E202038u // FCMPE S1, #0.0 + ]; } private static uint[] _F_Cmp_Cmpe_S_D_() { - return new[] - { + return + [ 0x1E602028u, // FCMP D1, #0.0 - 0x1E602038u, // FCMPE D1, #0.0 - }; + 0x1E602038u // FCMPE D1, #0.0 + ]; } private static uint[] _F_Cvt_S_SD_() { - return new[] - { - 0x1E22C020u, // FCVT D0, S1 - }; + return + [ + 0x1E22C020u // FCVT D0, S1 + ]; } private static uint[] _F_Cvt_S_DS_() { - return new[] - { - 0x1E624020u, // FCVT S0, D1 - }; + return + [ + 0x1E624020u // FCVT S0, D1 + ]; } private static uint[] _F_Cvt_S_SH_() { - return new[] - { - 0x1E23C020u, // FCVT H0, S1 - }; + return + [ + 0x1E23C020u // FCVT H0, S1 + ]; } private static uint[] _F_Cvt_S_DH_() { - return new[] - { - 0x1E63C020u, // FCVT H0, D1 - }; + return + [ + 0x1E63C020u // FCVT H0, D1 + ]; } private static uint[] _F_Cvt_S_HS_() { - return new[] - { - 0x1EE24020u, // FCVT S0, H1 - }; + return + [ + 0x1EE24020u // FCVT S0, H1 + ]; } private static uint[] _F_Cvt_S_HD_() { - return new[] - { - 0x1EE2C020u, // FCVT D0, H1 - }; + return + [ + 0x1EE2C020u // FCVT D0, H1 + ]; } private static uint[] _F_Cvt_ANZ_SU_S_S_() { - return new[] - { + return + [ 0x5E21C820u, // FCVTAS S0, S1 0x7E21C820u, // FCVTAU S0, S1 0x5E21A820u, // FCVTNS S0, S1 0x7E21A820u, // FCVTNU S0, S1 0x5EA1B820u, // FCVTZS S0, S1 - 0x7EA1B820u, // FCVTZU S0, S1 - }; + 0x7EA1B820u // FCVTZU S0, S1 + ]; } private static uint[] _F_Cvt_ANZ_SU_S_D_() { - return new[] - { + return + [ 0x5E61C820u, // FCVTAS D0, D1 0x7E61C820u, // FCVTAU D0, D1 0x5E61A820u, // FCVTNS D0, D1 0x7E61A820u, // FCVTNU D0, D1 0x5EE1B820u, // FCVTZS D0, D1 - 0x7EE1B820u, // FCVTZU D0, D1 - }; + 0x7EE1B820u // FCVTZU D0, D1 + ]; } private static uint[] _F_Cvt_ANZ_SU_V_2S_4S_() { - return new[] - { + return + [ 0x0E21C800u, // FCVTAS V0.2S, V0.2S 0x2E21C800u, // FCVTAU V0.2S, V0.2S 0x0E21B800u, // FCVTMS V0.2S, V0.2S 0x0E21A800u, // FCVTNS V0.2S, V0.2S 0x2E21A800u, // FCVTNU V0.2S, V0.2S 0x0EA1B800u, // FCVTZS V0.2S, V0.2S - 0x2EA1B800u, // FCVTZU V0.2S, V0.2S - }; + 0x2EA1B800u // FCVTZU V0.2S, V0.2S + ]; } private static uint[] _F_Cvt_ANZ_SU_V_2D_() { - return new[] - { + return + [ 0x4E61C800u, // FCVTAS V0.2D, V0.2D 0x6E61C800u, // FCVTAU V0.2D, V0.2D 0x4E61B800u, // FCVTMS V0.2D, V0.2D 0x4E61A800u, // FCVTNS V0.2D, V0.2D 0x6E61A800u, // FCVTNU V0.2D, V0.2D 0x4EE1B800u, // FCVTZS V0.2D, V0.2D - 0x6EE1B800u, // FCVTZU V0.2D, V0.2D - }; + 0x6EE1B800u // FCVTZU V0.2D, V0.2D + ]; } private static uint[] _F_Cvtl_V_4H4S_8H4S_() { - return new[] - { - 0x0E217800u, // FCVTL V0.4S, V0.4H - }; + return + [ + 0x0E217800u // FCVTL V0.4S, V0.4H + ]; } private static uint[] _F_Cvtl_V_2S2D_4S2D_() { - return new[] - { - 0x0E617800u, // FCVTL V0.2D, V0.2S - }; + return + [ + 0x0E617800u // FCVTL V0.2D, V0.2S + ]; } private static uint[] _F_Cvtn_V_4S4H_4S8H_() { - return new[] - { - 0x0E216800u, // FCVTN V0.4H, V0.4S - }; + return + [ + 0x0E216800u // FCVTN V0.4H, V0.4S + ]; } private static uint[] _F_Cvtn_V_2D2S_2D4S_() { - return new[] - { - 0x0E616800u, // FCVTN V0.2S, V0.2D - }; + return + [ + 0x0E616800u // FCVTN V0.2S, V0.2D + ]; } private static uint[] _F_Max_Min_Nm_V_V_4SS_() { - return new[] - { + return + [ 0x6E30C800u, // FMAXNMV S0, V0.4S 0x6E30F800u, // FMAXV S0, V0.4S 0x6EB0C800u, // FMINNMV S0, V0.4S - 0x6EB0F800u, // FMINV S0, V0.4S - }; + 0x6EB0F800u // FMINV S0, V0.4S + ]; } private static uint[] _F_Mov_Ftoi_SW_() { - return new[] - { - 0x1E260000u, // FMOV W0, S0 - }; + return + [ + 0x1E260000u // FMOV W0, S0 + ]; } private static uint[] _F_Mov_Ftoi_DX_() { - return new[] - { - 0x9E660000u, // FMOV X0, D0 - }; + return + [ + 0x9E660000u // FMOV X0, D0 + ]; } private static uint[] _F_Mov_Ftoi1_DX_() { - return new[] - { - 0x9EAE0000u, // FMOV X0, V0.D[1] - }; + return + [ + 0x9EAE0000u // FMOV X0, V0.D[1] + ]; } private static uint[] _F_Mov_Itof_WS_() { - return new[] - { - 0x1E270000u, // FMOV S0, W0 - }; + return + [ + 0x1E270000u // FMOV S0, W0 + ]; } private static uint[] _F_Mov_Itof_XD_() { - return new[] - { - 0x9E670000u, // FMOV D0, X0 - }; + return + [ + 0x9E670000u // FMOV D0, X0 + ]; } private static uint[] _F_Mov_Itof1_XD_() { - return new[] - { - 0x9EAF0000u, // FMOV V0.D[1], X0 - }; + return + [ + 0x9EAF0000u // FMOV V0.D[1], X0 + ]; } private static uint[] _F_Mov_S_S_() { - return new[] - { - 0x1E204020u, // FMOV S0, S1 - }; + return + [ + 0x1E204020u // FMOV S0, S1 + ]; } private static uint[] _F_Mov_S_D_() { - return new[] - { - 0x1E604020u, // FMOV D0, D1 - }; + return + [ + 0x1E604020u // FMOV D0, D1 + ]; } private static uint[] _F_Recpe_Rsqrte_S_S_() { - return new[] - { + return + [ 0x5EA1D820u, // FRECPE S0, S1 - 0x7EA1D820u, // FRSQRTE S0, S1 - }; + 0x7EA1D820u // FRSQRTE S0, S1 + ]; } private static uint[] _F_Recpe_Rsqrte_S_D_() { - return new[] - { + return + [ 0x5EE1D820u, // FRECPE D0, D1 - 0x7EE1D820u, // FRSQRTE D0, D1 - }; + 0x7EE1D820u // FRSQRTE D0, D1 + ]; } private static uint[] _F_Recpe_Rsqrte_V_2S_4S_() { - return new[] - { + return + [ 0x0EA1D800u, // FRECPE V0.2S, V0.2S - 0x2EA1D800u, // FRSQRTE V0.2S, V0.2S - }; + 0x2EA1D800u // FRSQRTE V0.2S, V0.2S + ]; } private static uint[] _F_Recpe_Rsqrte_V_2D_() { - return new[] - { + return + [ 0x4EE1D800u, // FRECPE V0.2D, V0.2D - 0x6EE1D800u, // FRSQRTE V0.2D, V0.2D - }; + 0x6EE1D800u // FRSQRTE V0.2D, V0.2D + ]; } private static uint[] _F_Rint_AMNPZ_S_S_() { - return new[] - { + return + [ 0x1E264020u, // FRINTA S0, S1 0x1E254020u, // FRINTM S0, S1 0x1E244020u, // FRINTN S0, S1 0x1E24C020u, // FRINTP S0, S1 - 0x1E25C020u, // FRINTZ S0, S1 - }; + 0x1E25C020u // FRINTZ S0, S1 + ]; } private static uint[] _F_Rint_AMNPZ_S_D_() { - return new[] - { + return + [ 0x1E664020u, // FRINTA D0, D1 0x1E654020u, // FRINTM D0, D1 0x1E644020u, // FRINTN D0, D1 0x1E64C020u, // FRINTP D0, D1 - 0x1E65C020u, // FRINTZ D0, D1 - }; + 0x1E65C020u // FRINTZ D0, D1 + ]; } private static uint[] _F_Rint_AMNPZ_V_2S_4S_() { - return new[] - { + return + [ 0x2E218800u, // FRINTA V0.2S, V0.2S 0x0E219800u, // FRINTM V0.2S, V0.2S 0x0E218800u, // FRINTN V0.2S, V0.2S 0x0EA18800u, // FRINTP V0.2S, V0.2S - 0x0EA19800u, // FRINTZ V0.2S, V0.2S - }; + 0x0EA19800u // FRINTZ V0.2S, V0.2S + ]; } private static uint[] _F_Rint_AMNPZ_V_2D_() { - return new[] - { + return + [ 0x6E618800u, // FRINTA V0.2D, V0.2D 0x4E619800u, // FRINTM V0.2D, V0.2D 0x4E618800u, // FRINTN V0.2D, V0.2D 0x4EE18800u, // FRINTP V0.2D, V0.2D - 0x4EE19800u, // FRINTZ V0.2D, V0.2D - }; + 0x4EE19800u // FRINTZ V0.2D, V0.2D + ]; } private static uint[] _F_Rint_IX_S_S_() { - return new[] - { + return + [ 0x1E27C020u, // FRINTI S0, S1 - 0x1E274020u, // FRINTX S0, S1 - }; + 0x1E274020u // FRINTX S0, S1 + ]; } private static uint[] _F_Rint_IX_S_D_() { - return new[] - { + return + [ 0x1E67C020u, // FRINTI D0, D1 - 0x1E674020u, // FRINTX D0, D1 - }; + 0x1E674020u // FRINTX D0, D1 + ]; } private static uint[] _F_Rint_IX_V_2S_4S_() { - return new[] - { + return + [ 0x2EA19800u, // FRINTI V0.2S, V0.2S - 0x2E219800u, // FRINTX V0.2S, V0.2S - }; + 0x2E219800u // FRINTX V0.2S, V0.2S + ]; } private static uint[] _F_Rint_IX_V_2D_() { - return new[] - { + return + [ 0x6EE19800u, // FRINTI V0.2D, V0.2D - 0x6E619800u, // FRINTX V0.2D, V0.2D - }; + 0x6E619800u // FRINTX V0.2D, V0.2D + ]; } private static uint[] _SU_Addl_V_V_8BH_4HS_() { - return new[] - { + return + [ 0x0E303800u, // SADDLV H0, V0.8B - 0x2E303800u, // UADDLV H0, V0.8B - }; + 0x2E303800u // UADDLV H0, V0.8B + ]; } private static uint[] _SU_Addl_V_V_16BH_8HS_4SD_() { - return new[] - { + return + [ 0x4E303800u, // SADDLV H0, V0.16B - 0x6E303800u, // UADDLV H0, V0.16B - }; + 0x6E303800u // UADDLV H0, V0.16B + ]; } private static uint[] _SU_Cvt_F_S_S_() { - return new[] - { + return + [ 0x5E21D820u, // SCVTF S0, S1 - 0x7E21D820u, // UCVTF S0, S1 - }; + 0x7E21D820u // UCVTF S0, S1 + ]; } private static uint[] _SU_Cvt_F_S_D_() { - return new[] - { + return + [ 0x5E61D820u, // SCVTF D0, D1 - 0x7E61D820u, // UCVTF D0, D1 - }; + 0x7E61D820u // UCVTF D0, D1 + ]; } private static uint[] _SU_Cvt_F_V_2S_4S_() { - return new[] - { + return + [ 0x0E21D800u, // SCVTF V0.2S, V0.2S - 0x2E21D800u, // UCVTF V0.2S, V0.2S - }; + 0x2E21D800u // UCVTF V0.2S, V0.2S + ]; } private static uint[] _SU_Cvt_F_V_2D_() { - return new[] - { + return + [ 0x4E61D800u, // SCVTF V0.2D, V0.2D - 0x6E61D800u, // UCVTF V0.2D, V0.2D - }; + 0x6E61D800u // UCVTF V0.2D, V0.2D + ]; } private static uint[] _Sha1h_Sha1su1_V_() { - return new[] - { + return + [ 0x5E280800u, // SHA1H S0, S0 - 0x5E281800u, // SHA1SU1 V0.4S, V0.4S - }; + 0x5E281800u // SHA1SU1 V0.4S, V0.4S + ]; } private static uint[] _Sha256su0_V_() { - return new[] - { - 0x5E282800u, // SHA256SU0 V0.4S, V0.4S - }; + return + [ + 0x5E282800u // SHA256SU0 V0.4S, V0.4S + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimd32.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimd32.cs index 08202c9e1..fd2c7ec92 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimd32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimd32.cs @@ -14,33 +14,34 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _Vabs_Vneg_Vpaddl_I_() { - return new[] - { + return + [ 0xf3b10300u, // VABS.S8 D0, D0 0xf3b10380u, // VNEG.S8 D0, D0 - 0xf3b00200u, // VPADDL.S8 D0, D0 - }; + 0xf3b00200u // VPADDL.S8 D0, D0 + ]; } private static uint[] _Vabs_Vneg_F_() { - return new[] - { + return + [ 0xf3b90700u, // VABS.F32 D0, D0 - 0xf3b90780u, // VNEG.F32 D0, D0 - }; + 0xf3b90780u // VNEG.F32 D0, D0 + ]; } #endregion #region "ValueSource (Types)" private static ulong[] _8B4H2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static IEnumerable _1S_F_() diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdCvt.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdCvt.cs index 007c0f8cb..551360ea5 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdCvt.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdCvt.cs @@ -15,18 +15,20 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Types)" private static uint[] _W_() { - return new[] { + return + [ 0x00000000u, 0x7FFFFFFFu, - 0x80000000u, 0xFFFFFFFFu, - }; + 0x80000000u, 0xFFFFFFFFu + ]; } private static ulong[] _X_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static IEnumerable _1S_F_WX_() @@ -197,8 +199,8 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _F_Cvt_AMPZ_SU_Gp_SW_() { - return new[] - { + return + [ 0x1E240000u, // FCVTAS W0, S0 0x1E250000u, // FCVTAU W0, S0 0x1E300000u, // FCVTMS W0, S0 @@ -207,14 +209,14 @@ namespace Ryujinx.Tests.Cpu 0x1E280000u, // FCVTPS W0, S0 0x1E290000u, // FCVTPU W0, S0 0x1E380000u, // FCVTZS W0, S0 - 0x1E390000u, // FCVTZU W0, S0 - }; + 0x1E390000u // FCVTZU W0, S0 + ]; } private static uint[] _F_Cvt_AMPZ_SU_Gp_SX_() { - return new[] - { + return + [ 0x9E240000u, // FCVTAS X0, S0 0x9E250000u, // FCVTAU X0, S0 0x9E300000u, // FCVTMS X0, S0 @@ -223,14 +225,14 @@ namespace Ryujinx.Tests.Cpu 0x9E280000u, // FCVTPS X0, S0 0x9E290000u, // FCVTPU X0, S0 0x9E380000u, // FCVTZS X0, S0 - 0x9E390000u, // FCVTZU X0, S0 - }; + 0x9E390000u // FCVTZU X0, S0 + ]; } private static uint[] _F_Cvt_AMPZ_SU_Gp_DW_() { - return new[] - { + return + [ 0x1E640000u, // FCVTAS W0, D0 0x1E650000u, // FCVTAU W0, D0 0x1E700000u, // FCVTMS W0, D0 @@ -239,14 +241,14 @@ namespace Ryujinx.Tests.Cpu 0x1E680000u, // FCVTPS W0, D0 0x1E690000u, // FCVTPU W0, D0 0x1E780000u, // FCVTZS W0, D0 - 0x1E790000u, // FCVTZU W0, D0 - }; + 0x1E790000u // FCVTZU W0, D0 + ]; } private static uint[] _F_Cvt_AMPZ_SU_Gp_DX_() { - return new[] - { + return + [ 0x9E640000u, // FCVTAS X0, D0 0x9E650000u, // FCVTAU X0, D0 0x9E700000u, // FCVTMS X0, D0 @@ -255,116 +257,116 @@ namespace Ryujinx.Tests.Cpu 0x9E680000u, // FCVTPS X0, D0 0x9E690000u, // FCVTPU X0, D0 0x9E780000u, // FCVTZS X0, D0 - 0x9E790000u, // FCVTZU X0, D0 - }; + 0x9E790000u // FCVTZU X0, D0 + ]; } private static uint[] _F_Cvt_Z_SU_Gp_Fixed_SW_() { - return new[] - { + return + [ 0x1E188000u, // FCVTZS W0, S0, #32 - 0x1E198000u, // FCVTZU W0, S0, #32 - }; + 0x1E198000u // FCVTZU W0, S0, #32 + ]; } private static uint[] _F_Cvt_Z_SU_Gp_Fixed_SX_() { - return new[] - { + return + [ 0x9E180000u, // FCVTZS X0, S0, #64 - 0x9E190000u, // FCVTZU X0, S0, #64 - }; + 0x9E190000u // FCVTZU X0, S0, #64 + ]; } private static uint[] _F_Cvt_Z_SU_Gp_Fixed_DW_() { - return new[] - { + return + [ 0x1E588000u, // FCVTZS W0, D0, #32 - 0x1E598000u, // FCVTZU W0, D0, #32 - }; + 0x1E598000u // FCVTZU W0, D0, #32 + ]; } private static uint[] _F_Cvt_Z_SU_Gp_Fixed_DX_() { - return new[] - { + return + [ 0x9E580000u, // FCVTZS X0, D0, #64 - 0x9E590000u, // FCVTZU X0, D0, #64 - }; + 0x9E590000u // FCVTZU X0, D0, #64 + ]; } private static uint[] _SU_Cvt_F_Gp_WS_() { - return new[] - { + return + [ 0x1E220000u, // SCVTF S0, W0 - 0x1E230000u, // UCVTF S0, W0 - }; + 0x1E230000u // UCVTF S0, W0 + ]; } private static uint[] _SU_Cvt_F_Gp_WD_() { - return new[] - { + return + [ 0x1E620000u, // SCVTF D0, W0 - 0x1E630000u, // UCVTF D0, W0 - }; + 0x1E630000u // UCVTF D0, W0 + ]; } private static uint[] _SU_Cvt_F_Gp_XS_() { - return new[] - { + return + [ 0x9E220000u, // SCVTF S0, X0 - 0x9E230000u, // UCVTF S0, X0 - }; + 0x9E230000u // UCVTF S0, X0 + ]; } private static uint[] _SU_Cvt_F_Gp_XD_() { - return new[] - { + return + [ 0x9E620000u, // SCVTF D0, X0 - 0x9E630000u, // UCVTF D0, X0 - }; + 0x9E630000u // UCVTF D0, X0 + ]; } private static uint[] _SU_Cvt_F_Gp_Fixed_WS_() { - return new[] - { + return + [ 0x1E028000u, // SCVTF S0, W0, #32 - 0x1E038000u, // UCVTF S0, W0, #32 - }; + 0x1E038000u // UCVTF S0, W0, #32 + ]; } private static uint[] _SU_Cvt_F_Gp_Fixed_WD_() { - return new[] - { + return + [ 0x1E428000u, // SCVTF D0, W0, #32 - 0x1E438000u, // UCVTF D0, W0, #32 - }; + 0x1E438000u // UCVTF D0, W0, #32 + ]; } private static uint[] _SU_Cvt_F_Gp_Fixed_XS_() { - return new[] - { + return + [ 0x9E020000u, // SCVTF S0, X0, #64 - 0x9E030000u, // UCVTF S0, X0, #64 - }; + 0x9E030000u // UCVTF S0, X0, #64 + ]; } private static uint[] _SU_Cvt_F_Gp_Fixed_XD_() { - return new[] - { + return + [ 0x9E420000u, // SCVTF D0, X0, #64 - 0x9E430000u, // UCVTF D0, X0, #64 - }; + 0x9E430000u // UCVTF D0, X0, #64 + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdCvt32.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdCvt32.cs index ba201a480..f31c7691e 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdCvt32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdCvt32.cs @@ -15,23 +15,24 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _Vrint_AMNP_V_F32_() { - return new[] - { + return + [ 0xf3ba0500u, // VRINTA.F32 Q0, Q0 0xf3ba0680u, // VRINTM.F32 Q0, Q0 0xf3ba0400u, // VRINTN.F32 Q0, Q0 - 0xf3ba0780u, // VRINTP.F32 Q0, Q0 - }; + 0xf3ba0780u // VRINTP.F32 Q0, Q0 + ]; } #endregion #region "ValueSource (Types)" private static uint[] _1S_() { - return new[] { + return + [ 0x00000000u, 0x7FFFFFFFu, - 0x80000000u, 0xFFFFFFFFu, - }; + 0x80000000u, 0xFFFFFFFFu + ]; } private static IEnumerable _1S_F_() @@ -465,7 +466,7 @@ namespace Ryujinx.Tests.Cpu opcode |= (fixImm & 0x3f) << 16; - var v0 = new V128((uint)s0, (uint)s1, (uint)s2, (uint)s3); + V128 v0 = new((uint)s0, (uint)s1, (uint)s2, (uint)s3); SingleOpcode(opcode, v0: v0); @@ -505,7 +506,7 @@ namespace Ryujinx.Tests.Cpu opcode |= (fixImm & 0x3f) << 16; - var v0 = new V128(s0, s1, s2, s3); + V128 v0 = new(s0, s1, s2, s3); SingleOpcode(opcode, v0: v0); diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdExt.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdExt.cs index 59bc4cb7e..2fd98a333 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdExt.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdExt.cs @@ -13,10 +13,11 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource" private static ulong[] _8B_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, - 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdFcond.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdFcond.cs index d6d12b278..63c68c57e 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdFcond.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdFcond.cs @@ -99,36 +99,36 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _F_Ccmp_Ccmpe_S_S_() { - return new[] - { + return + [ 0x1E220420u, // FCCMP S1, S2, #0, EQ - 0x1E220430u, // FCCMPE S1, S2, #0, EQ - }; + 0x1E220430u // FCCMPE S1, S2, #0, EQ + ]; } private static uint[] _F_Ccmp_Ccmpe_S_D_() { - return new[] - { + return + [ 0x1E620420u, // FCCMP D1, D2, #0, EQ - 0x1E620430u, // FCCMPE D1, D2, #0, EQ - }; + 0x1E620430u // FCCMPE D1, D2, #0, EQ + ]; } private static uint[] _F_Csel_S_S_() { - return new[] - { - 0x1E220C20u, // FCSEL S0, S1, S2, EQ - }; + return + [ + 0x1E220C20u // FCSEL S0, S1, S2, EQ + ]; } private static uint[] _F_Csel_S_D_() { - return new[] - { - 0x1E620C20u, // FCSEL D0, D1, D2, EQ - }; + return + [ + 0x1E620C20u // FCSEL D0, D1, D2, EQ + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdFmov.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdFmov.cs index 0c2582695..6191f82ab 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdFmov.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdFmov.cs @@ -13,18 +13,18 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource" private static uint[] _F_Mov_Si_S_() { - return new[] - { - 0x1E201000u, // FMOV S0, #2.0 - }; + return + [ + 0x1E201000u // FMOV S0, #2.0 + ]; } private static uint[] _F_Mov_Si_D_() { - return new[] - { - 0x1E601000u, // FMOV D0, #2.0 - }; + return + [ + 0x1E601000u // FMOV D0, #2.0 + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdImm.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdImm.cs index 27e3b41a0..79abdffd4 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdImm.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdImm.cs @@ -48,18 +48,20 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Types)" private static ulong[] _2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _4H_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul, - 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static IEnumerable _8BIT_IMM_() @@ -96,95 +98,95 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _Bic_Orr_Vi_16bit_() { - return new[] - { + return + [ 0x2F009400u, // BIC V0.4H, #0 - 0x0F009400u, // ORR V0.4H, #0 - }; + 0x0F009400u // ORR V0.4H, #0 + ]; } private static uint[] _Bic_Orr_Vi_32bit_() { - return new[] - { + return + [ 0x2F001400u, // BIC V0.2S, #0 - 0x0F001400u, // ORR V0.2S, #0 - }; + 0x0F001400u // ORR V0.2S, #0 + ]; } private static uint[] _F_Mov_Vi_2S_() { - return new[] - { - 0x0F00F400u, // FMOV V0.2S, #2.0 - }; + return + [ + 0x0F00F400u // FMOV V0.2S, #2.0 + ]; } private static uint[] _F_Mov_Vi_4S_() { - return new[] - { - 0x4F00F400u, // FMOV V0.4S, #2.0 - }; + return + [ + 0x4F00F400u // FMOV V0.4S, #2.0 + ]; } private static uint[] _F_Mov_Vi_2D_() { - return new[] - { - 0x6F00F400u, // FMOV V0.2D, #2.0 - }; + return + [ + 0x6F00F400u // FMOV V0.2D, #2.0 + ]; } private static uint[] _Movi_V_8bit_() { - return new[] - { - 0x0F00E400u, // MOVI V0.8B, #0 - }; + return + [ + 0x0F00E400u // MOVI V0.8B, #0 + ]; } private static uint[] _Movi_Mvni_V_16bit_shifted_imm_() { - return new[] - { + return + [ 0x0F008400u, // MOVI V0.4H, #0 - 0x2F008400u, // MVNI V0.4H, #0 - }; + 0x2F008400u // MVNI V0.4H, #0 + ]; } private static uint[] _Movi_Mvni_V_32bit_shifted_imm_() { - return new[] - { + return + [ 0x0F000400u, // MOVI V0.2S, #0 - 0x2F000400u, // MVNI V0.2S, #0 - }; + 0x2F000400u // MVNI V0.2S, #0 + ]; } private static uint[] _Movi_Mvni_V_32bit_shifting_ones_() { - return new[] - { + return + [ 0x0F00C400u, // MOVI V0.2S, #0, MSL #8 - 0x2F00C400u, // MVNI V0.2S, #0, MSL #8 - }; + 0x2F00C400u // MVNI V0.2S, #0, MSL #8 + ]; } private static uint[] _Movi_V_64bit_scalar_() { - return new[] - { - 0x2F00E400u, // MOVI D0, #0 - }; + return + [ + 0x2F00E400u // MOVI D0, #0 + ]; } private static uint[] _Movi_V_64bit_vector_() { - return new[] - { - 0x6F00E400u, // MOVI V0.2D, #0 - }; + return + [ + 0x6F00E400u // MOVI V0.2D, #0 + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdIns.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdIns.cs index 83dc07707..4acf7aa57 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdIns.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdIns.cs @@ -13,72 +13,80 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource" private static ulong[] _1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _4H_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul, - 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, - 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B4H_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul, - 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B4H2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static uint[] _W_() { - return new[] { + return + [ 0x00000000u, 0x0000007Fu, 0x00000080u, 0x000000FFu, 0x00007FFFu, 0x00008000u, 0x0000FFFFu, 0x7FFFFFFFu, - 0x80000000u, 0xFFFFFFFFu, - }; + 0x80000000u, 0xFFFFFFFFu + ]; } private static ulong[] _X_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdLogical32.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdLogical32.cs index 819d9300b..fbb80d15d 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdLogical32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdLogical32.cs @@ -13,20 +13,21 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Types)" private static ulong[] _8B4H2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } #endregion #region "ValueSource (Opcodes)" private static uint[] _Vbic_Vbif_Vbit_Vbsl_Vand_Vorn_Vorr_Veor_I_() { - return new[] - { + return + [ 0xf2100110u, // VBIC D0, D0, D0 0xf3300110u, // VBIF D0, D0, D0 0xf3200110u, // VBIT D0, D0, D0 @@ -34,19 +35,19 @@ namespace Ryujinx.Tests.Cpu 0xf2000110u, // VAND D0, D0, D0 0xf2300110u, // VORN D0, D0, D0 0xf2200110u, // VORR D0, D0, D0 - 0xf3000110u, // VEOR D0, D0, D0 - }; + 0xf3000110u // VEOR D0, D0, D0 + ]; } private static uint[] _Vbic_Vorr_II_() { - return new[] - { + return + [ 0xf2800130u, // VBIC.I32 D0, #0 (A1) 0xf2800930u, // VBIC.I16 D0, #0 (A2) 0xf2800110u, // VORR.I32 D0, #0 (A1) - 0xf2800910u, // VORR.I16 D0, #0 (A2) - }; + 0xf2800910u // VORR.I16 D0, #0 (A2) + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdMemory32.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdMemory32.cs index d59e963b5..04310dbbe 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdMemory32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdMemory32.cs @@ -14,7 +14,7 @@ namespace Ryujinx.Tests.Cpu #if SimdMemory32 private readonly uint[] _ldStModes = - { + [ // LD1 0b0111, 0b1010, @@ -32,8 +32,8 @@ namespace Ryujinx.Tests.Cpu // LD4 0b0000, - 0b0001, - }; + 0b0001 + ]; [Test, Pairwise, Description("VLDn. , [ {:}]{ /!/, } (single n element structure)")] public void Vldn_Single([Values(0u, 1u, 2u)] uint size, @@ -44,7 +44,7 @@ namespace Ryujinx.Tests.Cpu [Range(0u, 3u)] uint n, [Values(0x0u)] uint offset) { - var data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); + byte[] data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); SetWorkingMemory(0, data); uint opcode = 0xf4a00000u; // VLD1.8 {D0[0]}, [R0], R0 @@ -74,7 +74,7 @@ namespace Ryujinx.Tests.Cpu [Values] bool t, [Values(0x0u)] uint offset) { - var data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); + byte[] data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); SetWorkingMemory(0, data); uint opcode = 0xf4a00c00u; // VLD1.8 {D0[0]}, [R0], R0 @@ -103,7 +103,7 @@ namespace Ryujinx.Tests.Cpu [Range(0u, 10u)] uint mode, [Values(0x0u)] uint offset) { - var data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); + byte[] data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); SetWorkingMemory(0, data); uint opcode = 0xf4200000u; // VLD4.8 {D0, D1, D2, D3}, [R0], R0 @@ -133,7 +133,7 @@ namespace Ryujinx.Tests.Cpu [Range(0u, 3u)] uint n, [Values(0x0u)] uint offset) { - var data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); + byte[] data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); SetWorkingMemory(0, data); (V128 vec1, V128 vec2, V128 vec3, V128 vec4) = GenerateTestVectors(); @@ -164,7 +164,7 @@ namespace Ryujinx.Tests.Cpu [Range(0u, 10u)] uint mode, [Values(0x0u)] uint offset) { - var data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); + byte[] data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); SetWorkingMemory(0, data); (V128 vec1, V128 vec2, V128 vec3, V128 vec4) = GenerateTestVectors(); @@ -194,18 +194,18 @@ namespace Ryujinx.Tests.Cpu [Values(0x1u, 0x32u)] uint regs, [Values] bool single) { - var data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); + byte[] data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); SetWorkingMemory(0, data); uint opcode = 0xec100a00u; // VST4.8 {D0, D1, D2, D3}, [R0], R0 uint[] vldmModes = - { + [ // Note: 3rd 0 leaves a space for "D". 0b0100, // Increment after. 0b0101, // Increment after. (!) - 0b1001, // Decrement before. (!) - }; + 0b1001 // Decrement before. (!) + ]; opcode |= ((vldmModes[mode] & 15) << 21); opcode |= ((rn & 15) << 16); @@ -246,7 +246,7 @@ namespace Ryujinx.Tests.Cpu [Values(0x0u)] uint imm, [Values] bool sub) { - var data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); + byte[] data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); SetWorkingMemory(0, data); uint opcode = 0xed900a00u; // VLDR.32 S0, [R0, #0] @@ -267,6 +267,7 @@ namespace Ryujinx.Tests.Cpu opcode |= ((sd & 0x10) << 18); opcode |= ((sd & 0xf) << 12); } + opcode |= imm & 0xff; SingleOpcode(opcode, r0: _testOffset); @@ -281,7 +282,7 @@ namespace Ryujinx.Tests.Cpu [Values(0x0u)] uint imm, [Values] bool sub) { - var data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); + byte[] data = GenerateVectorSequence((int)MemoryBlock.GetPageSize()); SetWorkingMemory(0, data); uint opcode = 0xed800a00u; // VSTR.32 S0, [R0, #0] @@ -302,6 +303,7 @@ namespace Ryujinx.Tests.Cpu opcode |= ((sd & 0x10) << 18); opcode |= ((sd & 0xf) << 12); } + opcode |= imm & 0xff; (V128 vec1, V128 vec2, _, _) = GenerateTestVectors(); @@ -331,7 +333,7 @@ namespace Ryujinx.Tests.Cpu data[i] = i + (i / 9f); } - var result = new byte[length]; + byte[] result = new byte[length]; Buffer.BlockCopy(data, 0, result, 0, result.Length); return result; } diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdMov32.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdMov32.cs index 85f77fff1..17e8f4d40 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdMov32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdMov32.cs @@ -2,6 +2,7 @@ using ARMeilleure.State; using NUnit.Framework; +using NUnit.Framework.Internal; namespace Ryujinx.Tests.Cpu { @@ -18,7 +19,7 @@ namespace Ryujinx.Tests.Cpu [Values] bool q) { uint[] variants = - { + [ // I32 0b0000_0, 0b0010_0, @@ -35,8 +36,8 @@ namespace Ryujinx.Tests.Cpu 0b1110_0, 0b1111_0, - 0b1110_1, - }; + 0b1110_1 + ]; uint opcode = 0xf2800010u; // VMOV.I32 D0, #0 @@ -299,7 +300,7 @@ namespace Ryujinx.Tests.Cpu [Values] bool q) { uint[] variants = - { + [ // I32 0b0000, 0b0010, @@ -312,8 +313,8 @@ namespace Ryujinx.Tests.Cpu // I32 0b1100, - 0b1101, - }; + 0b1101 + ]; uint opcode = 0xf2800030u; // VMVN.I32 D0, #0 @@ -458,6 +459,7 @@ namespace Ryujinx.Tests.Cpu { opcode |= 1 << 6; } + opcode |= (vm & 0x10) << 1; opcode |= (vm & 0xf); opcode |= (vd & 0x10) << 18; @@ -467,7 +469,7 @@ namespace Ryujinx.Tests.Cpu opcode |= (vn & 0xf) << 16; opcode |= (length & 0x3) << 8; - var rnd = TestContext.CurrentContext.Random; + Randomizer rnd = TestContext.CurrentContext.Random; V128 v2 = new(TestContext.CurrentContext.Random.NextULong(), TestContext.CurrentContext.Random.NextULong()); V128 v3 = new(TestContext.CurrentContext.Random.NextULong(), TestContext.CurrentContext.Random.NextULong()); V128 v4 = new(TestContext.CurrentContext.Random.NextULong(), TestContext.CurrentContext.Random.NextULong()); @@ -510,6 +512,7 @@ namespace Ryujinx.Tests.Cpu { return; // Undefined. } + opcode |= (vm & 0x10) << 1; opcode |= (vm & 0xf); opcode |= (vd & 0x10) << 18; diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdReg.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdReg.cs index 207f76089..1488cb2f3 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdReg.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdReg.cs @@ -14,90 +14,99 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Types)" private static ulong[] _1B1H1S1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x000000000000007Ful, 0x0000000000000080ul, 0x00000000000000FFul, 0x0000000000007FFFul, 0x0000000000008000ul, 0x000000000000FFFFul, 0x000000007FFFFFFFul, 0x0000000080000000ul, 0x00000000FFFFFFFFul, 0x7FFFFFFFFFFFFFFFul, 0x8000000000000000ul, - 0xFFFFFFFFFFFFFFFFul, - }; + 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _1H1S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x0000000000007FFFul, 0x0000000000008000ul, 0x000000000000FFFFul, 0x000000007FFFFFFFul, 0x0000000080000000ul, - 0x00000000FFFFFFFFul, - }; + 0x00000000FFFFFFFFul + ]; } private static ulong[] _4H2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _4H2S1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, 0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, - 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B4H2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B4H2S1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, 0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static IEnumerable _1S_F_() @@ -228,174 +237,174 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _F_Abd_Add_Div_Mul_Mulx_Nmul_Sub_S_S_() { - return new[] - { + return + [ 0x7EA2D420u, // FABD S0, S1, S2 0x1E222820u, // FADD S0, S1, S2 0x1E221820u, // FDIV S0, S1, S2 0x1E220820u, // FMUL S0, S1, S2 0x5E22DC20u, // FMULX S0, S1, S2 0x1E228820u, // FNMUL S0, S1, S2 - 0x1E223820u, // FSUB S0, S1, S2 - }; + 0x1E223820u // FSUB S0, S1, S2 + ]; } private static uint[] _F_Abd_Add_Div_Mul_Mulx_Nmul_Sub_S_D_() { - return new[] - { + return + [ 0x7EE2D420u, // FABD D0, D1, D2 0x1E622820u, // FADD D0, D1, D2 0x1E621820u, // FDIV D0, D1, D2 0x1E620820u, // FMUL D0, D1, D2 0x5E62DC20u, // FMULX D0, D1, D2 0x1E628820u, // FNMUL D0, D1, D2 - 0x1E623820u, // FSUB D0, D1, D2 - }; + 0x1E623820u // FSUB D0, D1, D2 + ]; } private static uint[] _F_Abd_Add_Div_Mul_Mulx_Sub_P_V_2S_4S_() { - return new[] - { + return + [ 0x2EA0D400u, // FABD V0.2S, V0.2S, V0.2S 0x0E20D400u, // FADD V0.2S, V0.2S, V0.2S 0x2E20D400u, // FADDP V0.2S, V0.2S, V0.2S 0x2E20FC00u, // FDIV V0.2S, V0.2S, V0.2S 0x2E20DC00u, // FMUL V0.2S, V0.2S, V0.2S 0x0E20DC00u, // FMULX V0.2S, V0.2S, V0.2S - 0x0EA0D400u, // FSUB V0.2S, V0.2S, V0.2S - }; + 0x0EA0D400u // FSUB V0.2S, V0.2S, V0.2S + ]; } private static uint[] _F_Abd_Add_Div_Mul_Mulx_Sub_P_V_2D_() { - return new[] - { + return + [ 0x6EE0D400u, // FABD V0.2D, V0.2D, V0.2D 0x4E60D400u, // FADD V0.2D, V0.2D, V0.2D 0x6E60D400u, // FADDP V0.2D, V0.2D, V0.2D 0x6E60FC00u, // FDIV V0.2D, V0.2D, V0.2D 0x6E60DC00u, // FMUL V0.2D, V0.2D, V0.2D 0x4E60DC00u, // FMULX V0.2D, V0.2D, V0.2D - 0x4EE0D400u, // FSUB V0.2D, V0.2D, V0.2D - }; + 0x4EE0D400u // FSUB V0.2D, V0.2D, V0.2D + ]; } private static uint[] _F_AcCm_EqGeGt_S_S_() { - return new[] - { + return + [ 0x7E22EC20u, // FACGE S0, S1, S2 0x7EA2EC20u, // FACGT S0, S1, S2 0x5E22E420u, // FCMEQ S0, S1, S2 0x7E22E420u, // FCMGE S0, S1, S2 - 0x7EA2E420u, // FCMGT S0, S1, S2 - }; + 0x7EA2E420u // FCMGT S0, S1, S2 + ]; } private static uint[] _F_AcCm_EqGeGt_S_D_() { - return new[] - { + return + [ 0x7E62EC20u, // FACGE D0, D1, D2 0x7EE2EC20u, // FACGT D0, D1, D2 0x5E62E420u, // FCMEQ D0, D1, D2 0x7E62E420u, // FCMGE D0, D1, D2 - 0x7EE2E420u, // FCMGT D0, D1, D2 - }; + 0x7EE2E420u // FCMGT D0, D1, D2 + ]; } private static uint[] _F_AcCm_EqGeGt_V_2S_4S_() { - return new[] - { + return + [ 0x2E20EC00u, // FACGE V0.2S, V0.2S, V0.2S 0x2EA0EC00u, // FACGT V0.2S, V0.2S, V0.2S 0x0E20E400u, // FCMEQ V0.2S, V0.2S, V0.2S 0x2E20E400u, // FCMGE V0.2S, V0.2S, V0.2S - 0x2EA0E400u, // FCMGT V0.2S, V0.2S, V0.2S - }; + 0x2EA0E400u // FCMGT V0.2S, V0.2S, V0.2S + ]; } private static uint[] _F_AcCm_EqGeGt_V_2D_() { - return new[] - { + return + [ 0x6E60EC00u, // FACGE V0.2D, V0.2D, V0.2D 0x6EE0EC00u, // FACGT V0.2D, V0.2D, V0.2D 0x4E60E400u, // FCMEQ V0.2D, V0.2D, V0.2D 0x6E60E400u, // FCMGE V0.2D, V0.2D, V0.2D - 0x6EE0E400u, // FCMGT V0.2D, V0.2D, V0.2D - }; + 0x6EE0E400u // FCMGT V0.2D, V0.2D, V0.2D + ]; } private static uint[] _F_Cmp_Cmpe_S_S_() { - return new[] - { + return + [ 0x1E222020u, // FCMP S1, S2 - 0x1E222030u, // FCMPE S1, S2 - }; + 0x1E222030u // FCMPE S1, S2 + ]; } private static uint[] _F_Cmp_Cmpe_S_D_() { - return new[] - { + return + [ 0x1E622020u, // FCMP D1, D2 - 0x1E622030u, // FCMPE D1, D2 - }; + 0x1E622030u // FCMPE D1, D2 + ]; } private static uint[] _F_Madd_Msub_Nmadd_Nmsub_S_S_() { - return new[] - { + return + [ 0x1F020C20u, // FMADD S0, S1, S2, S3 0x1F028C20u, // FMSUB S0, S1, S2, S3 0x1F220C20u, // FNMADD S0, S1, S2, S3 - 0x1F228C20u, // FNMSUB S0, S1, S2, S3 - }; + 0x1F228C20u // FNMSUB S0, S1, S2, S3 + ]; } private static uint[] _F_Madd_Msub_Nmadd_Nmsub_S_D_() { - return new[] - { + return + [ 0x1F420C20u, // FMADD D0, D1, D2, D3 0x1F428C20u, // FMSUB D0, D1, D2, D3 0x1F620C20u, // FNMADD D0, D1, D2, D3 - 0x1F628C20u, // FNMSUB D0, D1, D2, D3 - }; + 0x1F628C20u // FNMSUB D0, D1, D2, D3 + ]; } private static uint[] _F_Max_Min_Nm_S_S_() { - return new[] - { + return + [ 0x1E224820u, // FMAX S0, S1, S2 0x1E226820u, // FMAXNM S0, S1, S2 0x1E225820u, // FMIN S0, S1, S2 - 0x1E227820u, // FMINNM S0, S1, S2 - }; + 0x1E227820u // FMINNM S0, S1, S2 + ]; } private static uint[] _F_Max_Min_Nm_S_D_() { - return new[] - { + return + [ 0x1E624820u, // FMAX D0, D1, D2 0x1E626820u, // FMAXNM D0, D1, D2 0x1E625820u, // FMIN D0, D1, D2 - 0x1E627820u, // FMINNM D0, D1, D2 - }; + 0x1E627820u // FMINNM D0, D1, D2 + ]; } private static uint[] _F_Max_Min_Nm_P_V_2S_4S_() { - return new[] - { + return + [ 0x0E20F400u, // FMAX V0.2S, V0.2S, V0.2S 0x0E20C400u, // FMAXNM V0.2S, V0.2S, V0.2S 0x2E20C400u, // FMAXNMP V0.2S, V0.2S, V0.2S @@ -403,14 +412,14 @@ namespace Ryujinx.Tests.Cpu 0x0EA0F400u, // FMIN V0.2S, V0.2S, V0.2S 0x0EA0C400u, // FMINNM V0.2S, V0.2S, V0.2S 0x2EA0C400u, // FMINNMP V0.2S, V0.2S, V0.2S - 0x2EA0F400u, // FMINP V0.2S, V0.2S, V0.2S - }; + 0x2EA0F400u // FMINP V0.2S, V0.2S, V0.2S + ]; } private static uint[] _F_Max_Min_Nm_P_V_2D_() { - return new[] - { + return + [ 0x4E60F400u, // FMAX V0.2D, V0.2D, V0.2D 0x4E60C400u, // FMAXNM V0.2D, V0.2D, V0.2D 0x6E60C400u, // FMAXNMP V0.2D, V0.2D, V0.2D @@ -418,109 +427,109 @@ namespace Ryujinx.Tests.Cpu 0x4EE0F400u, // FMIN V0.2D, V0.2D, V0.2D 0x4EE0C400u, // FMINNM V0.2D, V0.2D, V0.2D 0x6EE0C400u, // FMINNMP V0.2D, V0.2D, V0.2D - 0x6EE0F400u, // FMINP V0.2D, V0.2D, V0.2D - }; + 0x6EE0F400u // FMINP V0.2D, V0.2D, V0.2D + ]; } private static uint[] _F_Mla_Mls_V_2S_4S_() { - return new[] - { + return + [ 0x0E20CC00u, // FMLA V0.2S, V0.2S, V0.2S - 0x0EA0CC00u, // FMLS V0.2S, V0.2S, V0.2S - }; + 0x0EA0CC00u // FMLS V0.2S, V0.2S, V0.2S + ]; } private static uint[] _F_Mla_Mls_V_2D_() { - return new[] - { + return + [ 0x4E60CC00u, // FMLA V0.2D, V0.2D, V0.2D - 0x4EE0CC00u, // FMLS V0.2D, V0.2D, V0.2D - }; + 0x4EE0CC00u // FMLS V0.2D, V0.2D, V0.2D + ]; } private static uint[] _F_Recps_Rsqrts_S_S_() { - return new[] - { + return + [ 0x5E22FC20u, // FRECPS S0, S1, S2 - 0x5EA2FC20u, // FRSQRTS S0, S1, S2 - }; + 0x5EA2FC20u // FRSQRTS S0, S1, S2 + ]; } private static uint[] _F_Recps_Rsqrts_S_D_() { - return new[] - { + return + [ 0x5E62FC20u, // FRECPS D0, D1, D2 - 0x5EE2FC20u, // FRSQRTS D0, D1, D2 - }; + 0x5EE2FC20u // FRSQRTS D0, D1, D2 + ]; } private static uint[] _F_Recps_Rsqrts_V_2S_4S_() { - return new[] - { + return + [ 0x0E20FC00u, // FRECPS V0.2S, V0.2S, V0.2S - 0x0EA0FC00u, // FRSQRTS V0.2S, V0.2S, V0.2S - }; + 0x0EA0FC00u // FRSQRTS V0.2S, V0.2S, V0.2S + ]; } private static uint[] _F_Recps_Rsqrts_V_2D_() { - return new[] - { + return + [ 0x4E60FC00u, // FRECPS V0.2D, V0.2D, V0.2D - 0x4EE0FC00u, // FRSQRTS V0.2D, V0.2D, V0.2D - }; + 0x4EE0FC00u // FRSQRTS V0.2D, V0.2D, V0.2D + ]; } private static uint[] _Mla_Mls_Mul_V_8B_4H_2S_() { - return new[] - { + return + [ 0x0E209400u, // MLA V0.8B, V0.8B, V0.8B 0x2E209400u, // MLS V0.8B, V0.8B, V0.8B - 0x0E209C00u, // MUL V0.8B, V0.8B, V0.8B - }; + 0x0E209C00u // MUL V0.8B, V0.8B, V0.8B + ]; } private static uint[] _Mla_Mls_Mul_V_16B_8H_4S_() { - return new[] - { + return + [ 0x4E209400u, // MLA V0.16B, V0.16B, V0.16B 0x6E209400u, // MLS V0.16B, V0.16B, V0.16B - 0x4E209C00u, // MUL V0.16B, V0.16B, V0.16B - }; + 0x4E209C00u // MUL V0.16B, V0.16B, V0.16B + ]; } private static uint[] _Sha1c_Sha1m_Sha1p_Sha1su0_V_() { - return new[] - { + return + [ 0x5E000000u, // SHA1C Q0, S0, V0.4S 0x5E002000u, // SHA1M Q0, S0, V0.4S 0x5E001000u, // SHA1P Q0, S0, V0.4S - 0x5E003000u, // SHA1SU0 V0.4S, V0.4S, V0.4S - }; + 0x5E003000u // SHA1SU0 V0.4S, V0.4S, V0.4S + ]; } private static uint[] _Sha256h_Sha256h2_Sha256su1_V_() { - return new[] - { + return + [ 0x5E004000u, // SHA256H Q0, Q0, V0.4S 0x5E005000u, // SHA256H2 Q0, Q0, V0.4S - 0x5E006000u, // SHA256SU1 V0.4S, V0.4S, V0.4S - }; + 0x5E006000u // SHA256SU1 V0.4S, V0.4S, V0.4S + ]; } private static uint[] _SU_Max_Min_P_V_() { - return new[] - { + return + [ 0x0E206400u, // SMAX V0.8B, V0.8B, V0.8B 0x0E20A400u, // SMAXP V0.8B, V0.8B, V0.8B 0x0E206C00u, // SMIN V0.8B, V0.8B, V0.8B @@ -528,49 +537,49 @@ namespace Ryujinx.Tests.Cpu 0x2E206400u, // UMAX V0.8B, V0.8B, V0.8B 0x2E20A400u, // UMAXP V0.8B, V0.8B, V0.8B 0x2E206C00u, // UMIN V0.8B, V0.8B, V0.8B - 0x2E20AC00u, // UMINP V0.8B, V0.8B, V0.8B - }; + 0x2E20AC00u // UMINP V0.8B, V0.8B, V0.8B + ]; } private static uint[] _SU_Mlal_Mlsl_Mull_V_8B8H_4H4S_2S2D_() { - return new[] - { + return + [ 0x0E208000u, // SMLAL V0.8H, V0.8B, V0.8B 0x0E20A000u, // SMLSL V0.8H, V0.8B, V0.8B 0x0E20C000u, // SMULL V0.8H, V0.8B, V0.8B 0x2E208000u, // UMLAL V0.8H, V0.8B, V0.8B 0x2E20A000u, // UMLSL V0.8H, V0.8B, V0.8B - 0x2E20C000u, // UMULL V0.8H, V0.8B, V0.8B - }; + 0x2E20C000u // UMULL V0.8H, V0.8B, V0.8B + ]; } private static uint[] _SU_Mlal_Mlsl_Mull_V_16B8H_8H4S_4S2D_() { - return new[] - { + return + [ 0x4E208000u, // SMLAL2 V0.8H, V0.16B, V0.16B 0x4E20A000u, // SMLSL2 V0.8H, V0.16B, V0.16B 0x4E20C000u, // SMULL2 V0.8H, V0.16B, V0.16B 0x6E208000u, // UMLAL2 V0.8H, V0.16B, V0.16B 0x6E20A000u, // UMLSL2 V0.8H, V0.16B, V0.16B - 0x6E20C000u, // UMULL2 V0.8H, V0.16B, V0.16B - }; + 0x6E20C000u // UMULL2 V0.8H, V0.16B, V0.16B + ]; } private static uint[] _ShlReg_S_D_() { - return new[] - { + return + [ 0x5EE04400u, // SSHL D0, D0, D0 - 0x7EE04400u, // USHL D0, D0, D0 - }; + 0x7EE04400u // USHL D0, D0, D0 + ]; } private static uint[] _ShlReg_V_8B_4H_2S_() { - return new[] - { + return + [ 0x0E205C00u, // SQRSHL V0.8B, V0.8B, V0.8B 0x0E204C00u, // SQSHL V0.8B, V0.8B, V0.8B 0x0E205400u, // SRSHL V0.8B, V0.8B, V0.8B @@ -578,14 +587,14 @@ namespace Ryujinx.Tests.Cpu 0x2E205C00u, // UQRSHL V0.8B, V0.8B, V0.8B 0x2E204C00u, // UQSHL V0.8B, V0.8B, V0.8B 0x2E205400u, // URSHL V0.8B, V0.8B, V0.8B - 0x2E204400u, // USHL V0.8B, V0.8B, V0.8B - }; + 0x2E204400u // USHL V0.8B, V0.8B, V0.8B + ]; } private static uint[] _ShlReg_V_16B_8H_4S_2D_() { - return new[] - { + return + [ 0x4E205C00u, // SQRSHL V0.16B, V0.16B, V0.16B 0x4E204C00u, // SQSHL V0.16B, V0.16B, V0.16B 0x4E205400u, // SRSHL V0.16B, V0.16B, V0.16B @@ -593,8 +602,8 @@ namespace Ryujinx.Tests.Cpu 0x6E205C00u, // UQRSHL V0.16B, V0.16B, V0.16B 0x6E204C00u, // UQSHL V0.16B, V0.16B, V0.16B 0x6E205400u, // URSHL V0.16B, V0.16B, V0.16B - 0x6E204400u, // USHL V0.16B, V0.16B, V0.16B - }; + 0x6E204400u // USHL V0.16B, V0.16B, V0.16B + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdReg32.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdReg32.cs index 843273dc2..a4bc15729 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdReg32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdReg32.cs @@ -15,134 +15,136 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _V_Add_Sub_Long_Wide_I_() { - return new[] - { + return + [ 0xf2800000u, // VADDL.S8 Q0, D0, D0 0xf2800100u, // VADDW.S8 Q0, Q0, D0 0xf2800200u, // VSUBL.S8 Q0, D0, D0 - 0xf2800300u, // VSUBW.S8 Q0, Q0, D0 - }; + 0xf2800300u // VSUBW.S8 Q0, Q0, D0 + ]; } private static uint[] _Vfma_Vfms_Vfnma_Vfnms_S_F32_() { - return new[] - { + return + [ 0xEEA00A00u, // VFMA. F32 S0, S0, S0 0xEEA00A40u, // VFMS. F32 S0, S0, S0 0xEE900A40u, // VFNMA.F32 S0, S0, S0 - 0xEE900A00u, // VFNMS.F32 S0, S0, S0 - }; + 0xEE900A00u // VFNMS.F32 S0, S0, S0 + ]; } private static uint[] _Vfma_Vfms_Vfnma_Vfnms_S_F64_() { - return new[] - { + return + [ 0xEEA00B00u, // VFMA. F64 D0, D0, D0 0xEEA00B40u, // VFMS. F64 D0, D0, D0 0xEE900B40u, // VFNMA.F64 D0, D0, D0 - 0xEE900B00u, // VFNMS.F64 D0, D0, D0 - }; + 0xEE900B00u // VFNMS.F64 D0, D0, D0 + ]; } private static uint[] _Vfma_Vfms_V_F32_() { - return new[] - { + return + [ 0xF2000C10u, // VFMA.F32 D0, D0, D0 - 0xF2200C10u, // VFMS.F32 D0, D0, D0 - }; + 0xF2200C10u // VFMS.F32 D0, D0, D0 + ]; } private static uint[] _Vmla_Vmls_Vnmla_Vnmls_S_F32_() { - return new[] - { + return + [ 0xEE000A00u, // VMLA. F32 S0, S0, S0 0xEE000A40u, // VMLS. F32 S0, S0, S0 0xEE100A40u, // VNMLA.F32 S0, S0, S0 - 0xEE100A00u, // VNMLS.F32 S0, S0, S0 - }; + 0xEE100A00u // VNMLS.F32 S0, S0, S0 + ]; } private static uint[] _Vmla_Vmls_Vnmla_Vnmls_S_F64_() { - return new[] - { + return + [ 0xEE000B00u, // VMLA. F64 D0, D0, D0 0xEE000B40u, // VMLS. F64 D0, D0, D0 0xEE100B40u, // VNMLA.F64 D0, D0, D0 - 0xEE100B00u, // VNMLS.F64 D0, D0, D0 - }; + 0xEE100B00u // VNMLS.F64 D0, D0, D0 + ]; } private static uint[] _Vmlal_Vmlsl_V_I_() { - return new[] - { + return + [ 0xf2800800u, // VMLAL.S8 Q0, D0, D0 - 0xf2800a00u, // VMLSL.S8 Q0, D0, D0 - }; + 0xf2800a00u // VMLSL.S8 Q0, D0, D0 + ]; } private static uint[] _Vp_Add_Max_Min_F_() { - return new[] - { + return + [ 0xf3000d00u, // VPADD.F32 D0, D0, D0 0xf3000f00u, // VPMAX.F32 D0, D0, D0 - 0xf3200f00u, // VPMIN.F32 D0, D0, D0 - }; + 0xf3200f00u // VPMIN.F32 D0, D0, D0 + ]; } private static uint[] _Vp_Add_I_() { - return new[] - { - 0xf2000b10u, // VPADD.I8 D0, D0, D0 - }; + return + [ + 0xf2000b10u // VPADD.I8 D0, D0, D0 + ]; } private static uint[] _V_Pmax_Pmin_Rhadd_I_() { - return new[] - { + return + [ 0xf2000a00u, // VPMAX .S8 D0, D0, D0 0xf2000a10u, // VPMIN .S8 D0, D0, D0 - 0xf2000100u, // VRHADD.S8 D0, D0, D0 - }; + 0xf2000100u // VRHADD.S8 D0, D0, D0 + ]; } private static uint[] _Vq_Add_Sub_I_() { - return new[] - { + return + [ 0xf2000050u, // VQADD.S8 Q0, Q0, Q0 - 0xf2000250u, // VQSUB.S8 Q0, Q0, Q0 - }; + 0xf2000250u // VQSUB.S8 Q0, Q0, Q0 + ]; } #endregion #region "ValueSource (Types)" private static ulong[] _8B1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B4H2S1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0x7FFFFFFF7FFFFFFFul, 0x8000000080000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static IEnumerable _1S_F_() diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdRegElem.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdRegElem.cs index 23c6961f9..4d765fe1d 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdRegElem.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdRegElem.cs @@ -13,74 +13,75 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Types)" private static ulong[] _2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _4H_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul, - 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul + ]; } #endregion #region "ValueSource (Opcodes)" private static uint[] _Mla_Mls_Mul_Sqdmulh_Sqrdmulh_Ve_4H_8H_() { - return new[] - { + return + [ 0x2F400000u, // MLA V0.4H, V0.4H, V0.H[0] 0x2F404000u, // MLS V0.4H, V0.4H, V0.H[0] 0x0F408000u, // MUL V0.4H, V0.4H, V0.H[0] 0x0F40C000u, // SQDMULH V0.4H, V0.4H, V0.H[0] - 0x0F40D000u, // SQRDMULH V0.4H, V0.4H, V0.H[0] - }; + 0x0F40D000u // SQRDMULH V0.4H, V0.4H, V0.H[0] + ]; } private static uint[] _Mla_Mls_Mul_Sqdmulh_Sqrdmulh_Ve_2S_4S_() { - return new[] - { + return + [ 0x2F800000u, // MLA V0.2S, V0.2S, V0.S[0] 0x2F804000u, // MLS V0.2S, V0.2S, V0.S[0] 0x0F808000u, // MUL V0.2S, V0.2S, V0.S[0] 0x0F80C000u, // SQDMULH V0.2S, V0.2S, V0.S[0] - 0x0F80D000u, // SQRDMULH V0.2S, V0.2S, V0.S[0] - }; + 0x0F80D000u // SQRDMULH V0.2S, V0.2S, V0.S[0] + ]; } private static uint[] _SU_Mlal_Mlsl_Mull_Ve_4H4S_8H4S_() { - return new[] - { + return + [ 0x0F402000u, // SMLAL V0.4S, V0.4H, V0.H[0] 0x0F406000u, // SMLSL V0.4S, V0.4H, V0.H[0] 0x0F40A000u, // SMULL V0.4S, V0.4H, V0.H[0] 0x2F402000u, // UMLAL V0.4S, V0.4H, V0.H[0] 0x2F406000u, // UMLSL V0.4S, V0.4H, V0.H[0] - 0x2F40A000u, // UMULL V0.4S, V0.4H, V0.H[0] - }; + 0x2F40A000u // UMULL V0.4S, V0.4H, V0.H[0] + ]; } private static uint[] _SU_Mlal_Mlsl_Mull_Ve_2S2D_4S2D_() { - return new[] - { + return + [ 0x0F802000u, // SMLAL V0.2D, V0.2S, V0.S[0] 0x0F806000u, // SMLSL V0.2D, V0.2S, V0.S[0] 0x0F80A000u, // SMULL V0.2D, V0.2S, V0.S[0] 0x2F802000u, // UMLAL V0.2D, V0.2S, V0.S[0] 0x2F806000u, // UMLSL V0.2D, V0.2S, V0.S[0] - 0x2F80A000u, // UMULL V0.2D, V0.2S, V0.S[0] - }; + 0x2F80A000u // UMULL V0.2D, V0.2S, V0.S[0] + ]; } #endregion - [Test, Pairwise] public void Mla_Mls_Mul_Sqdmulh_Sqrdmulh_Ve_4H_8H([ValueSource(nameof(_Mla_Mls_Mul_Sqdmulh_Sqrdmulh_Ve_4H_8H_))] uint opcodes, [Values(0u)] uint rd, diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdRegElemF.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdRegElemF.cs index 1b670da76..5d18e55e8 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdRegElemF.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdRegElemF.cs @@ -140,74 +140,74 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _F_Mla_Mls_Se_S_() { - return new[] - { + return + [ 0x5F821020u, // FMLA S0, S1, V2.S[0] - 0x5F825020u, // FMLS S0, S1, V2.S[0] - }; + 0x5F825020u // FMLS S0, S1, V2.S[0] + ]; } private static uint[] _F_Mla_Mls_Se_D_() { - return new[] - { + return + [ 0x5FC21020u, // FMLA D0, D1, V2.D[0] - 0x5FC25020u, // FMLS D0, D1, V2.D[0] - }; + 0x5FC25020u // FMLS D0, D1, V2.D[0] + ]; } private static uint[] _F_Mla_Mls_Ve_2S_4S_() { - return new[] - { + return + [ 0x0F801000u, // FMLA V0.2S, V0.2S, V0.S[0] - 0x0F805000u, // FMLS V0.2S, V0.2S, V0.S[0] - }; + 0x0F805000u // FMLS V0.2S, V0.2S, V0.S[0] + ]; } private static uint[] _F_Mla_Mls_Ve_2D_() { - return new[] - { + return + [ 0x4FC01000u, // FMLA V0.2D, V0.2D, V0.D[0] - 0x4FC05000u, // FMLS V0.2D, V0.2D, V0.D[0] - }; + 0x4FC05000u // FMLS V0.2D, V0.2D, V0.D[0] + ]; } private static uint[] _F_Mul_Mulx_Se_S_() { - return new[] - { + return + [ 0x5F829020u, // FMUL S0, S1, V2.S[0] - 0x7F829020u, // FMULX S0, S1, V2.S[0] - }; + 0x7F829020u // FMULX S0, S1, V2.S[0] + ]; } private static uint[] _F_Mul_Mulx_Se_D_() { - return new[] - { + return + [ 0x5FC29020u, // FMUL D0, D1, V2.D[0] - 0x7FC29020u, // FMULX D0, D1, V2.D[0] - }; + 0x7FC29020u // FMULX D0, D1, V2.D[0] + ]; } private static uint[] _F_Mul_Mulx_Ve_2S_4S_() { - return new[] - { + return + [ 0x0F809000u, // FMUL V0.2S, V0.2S, V0.S[0] - 0x2F809000u, // FMULX V0.2S, V0.2S, V0.S[0] - }; + 0x2F809000u // FMULX V0.2S, V0.2S, V0.S[0] + ]; } private static uint[] _F_Mul_Mulx_Ve_2D_() { - return new[] - { + return + [ 0x4FC09000u, // FMUL V0.2D, V0.2D, V0.D[0] - 0x6FC09000u, // FMULX V0.2D, V0.2D, V0.D[0] - }; + 0x6FC09000u // FMULX V0.2D, V0.2D, V0.D[0] + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm.cs index 9816bc2cc..2becac676 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm.cs @@ -15,50 +15,56 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Types)" private static ulong[] _1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _1H_() { - return new[] { + return + [ 0x0000000000000000ul, 0x0000000000007FFFul, - 0x0000000000008000ul, 0x000000000000FFFFul, - }; + 0x0000000000008000ul, 0x000000000000FFFFul + ]; } private static ulong[] _1S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x000000007FFFFFFFul, - 0x0000000080000000ul, 0x00000000FFFFFFFFul, - }; + 0x0000000080000000ul, 0x00000000FFFFFFFFul + ]; } private static ulong[] _2S_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFF7FFFFFFFul, - 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _4H_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul, - 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, - 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static IEnumerable _2S_F_W_() @@ -187,174 +193,174 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _F_Cvt_Z_SU_V_Fixed_2S_4S_() { - return new[] - { + return + [ 0x0F20FC00u, // FCVTZS V0.2S, V0.2S, #32 - 0x2F20FC00u, // FCVTZU V0.2S, V0.2S, #32 - }; + 0x2F20FC00u // FCVTZU V0.2S, V0.2S, #32 + ]; } private static uint[] _F_Cvt_Z_SU_V_Fixed_2D_() { - return new[] - { + return + [ 0x4F40FC00u, // FCVTZS V0.2D, V0.2D, #64 - 0x6F40FC00u, // FCVTZU V0.2D, V0.2D, #64 - }; + 0x6F40FC00u // FCVTZU V0.2D, V0.2D, #64 + ]; } private static uint[] _SU_Cvt_F_S_Fixed_S_() { - return new[] - { + return + [ 0x5F20E420u, // SCVTF S0, S1, #32 - 0x7F20E420u, // UCVTF S0, S1, #32 - }; + 0x7F20E420u // UCVTF S0, S1, #32 + ]; } private static uint[] _SU_Cvt_F_S_Fixed_D_() { - return new[] - { + return + [ 0x5F40E420u, // SCVTF D0, D1, #64 - 0x7F40E420u, // UCVTF D0, D1, #64 - }; + 0x7F40E420u // UCVTF D0, D1, #64 + ]; } private static uint[] _SU_Cvt_F_V_Fixed_2S_4S_() { - return new[] - { + return + [ 0x0F20E400u, // SCVTF V0.2S, V0.2S, #32 - 0x2F20E400u, // UCVTF V0.2S, V0.2S, #32 - }; + 0x2F20E400u // UCVTF V0.2S, V0.2S, #32 + ]; } private static uint[] _SU_Cvt_F_V_Fixed_2D_() { - return new[] - { + return + [ 0x4F40E400u, // SCVTF V0.2D, V0.2D, #64 - 0x6F40E400u, // UCVTF V0.2D, V0.2D, #64 - }; + 0x6F40E400u // UCVTF V0.2D, V0.2D, #64 + ]; } private static uint[] _Shl_Sli_S_D_() { - return new[] - { + return + [ 0x5F405400u, // SHL D0, D0, #0 - 0x7F405400u, // SLI D0, D0, #0 - }; + 0x7F405400u // SLI D0, D0, #0 + ]; } private static uint[] _Shl_Sli_V_8B_16B_() { - return new[] - { + return + [ 0x0F085400u, // SHL V0.8B, V0.8B, #0 - 0x2F085400u, // SLI V0.8B, V0.8B, #0 - }; + 0x2F085400u // SLI V0.8B, V0.8B, #0 + ]; } private static uint[] _Shl_Sli_V_4H_8H_() { - return new[] - { + return + [ 0x0F105400u, // SHL V0.4H, V0.4H, #0 - 0x2F105400u, // SLI V0.4H, V0.4H, #0 - }; + 0x2F105400u // SLI V0.4H, V0.4H, #0 + ]; } private static uint[] _Shl_Sli_V_2S_4S_() { - return new[] - { + return + [ 0x0F205400u, // SHL V0.2S, V0.2S, #0 - 0x2F205400u, // SLI V0.2S, V0.2S, #0 - }; + 0x2F205400u // SLI V0.2S, V0.2S, #0 + ]; } private static uint[] _Shl_Sli_V_2D_() { - return new[] - { + return + [ 0x4F405400u, // SHL V0.2D, V0.2D, #0 - 0x6F405400u, // SLI V0.2D, V0.2D, #0 - }; + 0x6F405400u // SLI V0.2D, V0.2D, #0 + ]; } private static uint[] _SU_Shll_V_8B8H_16B8H_() { - return new[] - { + return + [ 0x0F08A400u, // SSHLL V0.8H, V0.8B, #0 - 0x2F08A400u, // USHLL V0.8H, V0.8B, #0 - }; + 0x2F08A400u // USHLL V0.8H, V0.8B, #0 + ]; } private static uint[] _SU_Shll_V_4H4S_8H4S_() { - return new[] - { + return + [ 0x0F10A400u, // SSHLL V0.4S, V0.4H, #0 - 0x2F10A400u, // USHLL V0.4S, V0.4H, #0 - }; + 0x2F10A400u // USHLL V0.4S, V0.4H, #0 + ]; } private static uint[] _SU_Shll_V_2S2D_4S2D_() { - return new[] - { + return + [ 0x0F20A400u, // SSHLL V0.2D, V0.2S, #0 - 0x2F20A400u, // USHLL V0.2D, V0.2S, #0 - }; + 0x2F20A400u // USHLL V0.2D, V0.2S, #0 + ]; } private static uint[] _ShlImm_S_D_() { - return new[] - { - 0x5F407400u, // SQSHL D0, D0, #0 - }; + return + [ + 0x5F407400u // SQSHL D0, D0, #0 + ]; } private static uint[] _ShlImm_V_8B_16B_() { - return new[] - { - 0x0F087400u, // SQSHL V0.8B, V0.8B, #0 - }; + return + [ + 0x0F087400u // SQSHL V0.8B, V0.8B, #0 + ]; } private static uint[] _ShlImm_V_4H_8H_() { - return new[] - { - 0x0F107400u, // SQSHL V0.4H, V0.4H, #0 - }; + return + [ + 0x0F107400u // SQSHL V0.4H, V0.4H, #0 + ]; } private static uint[] _ShlImm_V_2S_4S_() { - return new[] - { - 0x0F207400u, // SQSHL V0.2S, V0.2S, #0 - }; + return + [ + 0x0F207400u // SQSHL V0.2S, V0.2S, #0 + ]; } private static uint[] _ShlImm_V_2D_() { - return new[] - { - 0x4F407400u, // SQSHL V0.2D, V0.2D, #0 - }; + return + [ + 0x4F407400u // SQSHL V0.2D, V0.2D, #0 + ]; } private static uint[] _ShrImm_Sri_S_D_() { - return new[] - { + return + [ 0x7F404400u, // SRI D0, D0, #64 0x5F402400u, // SRSHR D0, D0, #64 0x5F403400u, // SRSRA D0, D0, #64 @@ -363,14 +369,14 @@ namespace Ryujinx.Tests.Cpu 0x7F402400u, // URSHR D0, D0, #64 0x7F403400u, // URSRA D0, D0, #64 0x7F400400u, // USHR D0, D0, #64 - 0x7F401400u, // USRA D0, D0, #64 - }; + 0x7F401400u // USRA D0, D0, #64 + ]; } private static uint[] _ShrImm_Sri_V_8B_16B_() { - return new[] - { + return + [ 0x2F084400u, // SRI V0.8B, V0.8B, #8 0x0F082400u, // SRSHR V0.8B, V0.8B, #8 0x0F083400u, // SRSRA V0.8B, V0.8B, #8 @@ -379,14 +385,14 @@ namespace Ryujinx.Tests.Cpu 0x2F082400u, // URSHR V0.8B, V0.8B, #8 0x2F083400u, // URSRA V0.8B, V0.8B, #8 0x2F080400u, // USHR V0.8B, V0.8B, #8 - 0x2F081400u, // USRA V0.8B, V0.8B, #8 - }; + 0x2F081400u // USRA V0.8B, V0.8B, #8 + ]; } private static uint[] _ShrImm_Sri_V_4H_8H_() { - return new[] - { + return + [ 0x2F104400u, // SRI V0.4H, V0.4H, #16 0x0F102400u, // SRSHR V0.4H, V0.4H, #16 0x0F103400u, // SRSRA V0.4H, V0.4H, #16 @@ -395,14 +401,14 @@ namespace Ryujinx.Tests.Cpu 0x2F102400u, // URSHR V0.4H, V0.4H, #16 0x2F103400u, // URSRA V0.4H, V0.4H, #16 0x2F100400u, // USHR V0.4H, V0.4H, #16 - 0x2F101400u, // USRA V0.4H, V0.4H, #16 - }; + 0x2F101400u // USRA V0.4H, V0.4H, #16 + ]; } private static uint[] _ShrImm_Sri_V_2S_4S_() { - return new[] - { + return + [ 0x2F204400u, // SRI V0.2S, V0.2S, #32 0x0F202400u, // SRSHR V0.2S, V0.2S, #32 0x0F203400u, // SRSRA V0.2S, V0.2S, #32 @@ -411,14 +417,14 @@ namespace Ryujinx.Tests.Cpu 0x2F202400u, // URSHR V0.2S, V0.2S, #32 0x2F203400u, // URSRA V0.2S, V0.2S, #32 0x2F200400u, // USHR V0.2S, V0.2S, #32 - 0x2F201400u, // USRA V0.2S, V0.2S, #32 - }; + 0x2F201400u // USRA V0.2S, V0.2S, #32 + ]; } private static uint[] _ShrImm_Sri_V_2D_() { - return new[] - { + return + [ 0x6F404400u, // SRI V0.2D, V0.2D, #64 0x4F402400u, // SRSHR V0.2D, V0.2D, #64 0x4F403400u, // SRSRA V0.2D, V0.2D, #64 @@ -427,113 +433,113 @@ namespace Ryujinx.Tests.Cpu 0x6F402400u, // URSHR V0.2D, V0.2D, #64 0x6F403400u, // URSRA V0.2D, V0.2D, #64 0x6F400400u, // USHR V0.2D, V0.2D, #64 - 0x6F401400u, // USRA V0.2D, V0.2D, #64 - }; + 0x6F401400u // USRA V0.2D, V0.2D, #64 + ]; } private static uint[] _ShrImmNarrow_V_8H8B_8H16B_() { - return new[] - { + return + [ 0x0F088C00u, // RSHRN V0.8B, V0.8H, #8 - 0x0F088400u, // SHRN V0.8B, V0.8H, #8 - }; + 0x0F088400u // SHRN V0.8B, V0.8H, #8 + ]; } private static uint[] _ShrImmNarrow_V_4S4H_4S8H_() { - return new[] - { + return + [ 0x0F108C00u, // RSHRN V0.4H, V0.4S, #16 - 0x0F108400u, // SHRN V0.4H, V0.4S, #16 - }; + 0x0F108400u // SHRN V0.4H, V0.4S, #16 + ]; } private static uint[] _ShrImmNarrow_V_2D2S_2D4S_() { - return new[] - { + return + [ 0x0F208C00u, // RSHRN V0.2S, V0.2D, #32 - 0x0F208400u, // SHRN V0.2S, V0.2D, #32 - }; + 0x0F208400u // SHRN V0.2S, V0.2D, #32 + ]; } private static uint[] _ShrImmSaturatingNarrow_S_HB_() { - return new[] - { + return + [ 0x5F089C00u, // SQRSHRN B0, H0, #8 0x7F089C00u, // UQRSHRN B0, H0, #8 0x7F088C00u, // SQRSHRUN B0, H0, #8 0x5F089400u, // SQSHRN B0, H0, #8 0x7F089400u, // UQSHRN B0, H0, #8 - 0x7F088400u, // SQSHRUN B0, H0, #8 - }; + 0x7F088400u // SQSHRUN B0, H0, #8 + ]; } private static uint[] _ShrImmSaturatingNarrow_S_SH_() { - return new[] - { + return + [ 0x5F109C00u, // SQRSHRN H0, S0, #16 0x7F109C00u, // UQRSHRN H0, S0, #16 0x7F108C00u, // SQRSHRUN H0, S0, #16 0x5F109400u, // SQSHRN H0, S0, #16 0x7F109400u, // UQSHRN H0, S0, #16 - 0x7F108400u, // SQSHRUN H0, S0, #16 - }; + 0x7F108400u // SQSHRUN H0, S0, #16 + ]; } private static uint[] _ShrImmSaturatingNarrow_S_DS_() { - return new[] - { + return + [ 0x5F209C00u, // SQRSHRN S0, D0, #32 0x7F209C00u, // UQRSHRN S0, D0, #32 0x7F208C00u, // SQRSHRUN S0, D0, #32 0x5F209400u, // SQSHRN S0, D0, #32 0x7F209400u, // UQSHRN S0, D0, #32 - 0x7F208400u, // SQSHRUN S0, D0, #32 - }; + 0x7F208400u // SQSHRUN S0, D0, #32 + ]; } private static uint[] _ShrImmSaturatingNarrow_V_8H8B_8H16B_() { - return new[] - { + return + [ 0x0F089C00u, // SQRSHRN V0.8B, V0.8H, #8 0x2F089C00u, // UQRSHRN V0.8B, V0.8H, #8 0x2F088C00u, // SQRSHRUN V0.8B, V0.8H, #8 0x0F089400u, // SQSHRN V0.8B, V0.8H, #8 0x2F089400u, // UQSHRN V0.8B, V0.8H, #8 - 0x2F088400u, // SQSHRUN V0.8B, V0.8H, #8 - }; + 0x2F088400u // SQSHRUN V0.8B, V0.8H, #8 + ]; } private static uint[] _ShrImmSaturatingNarrow_V_4S4H_4S8H_() { - return new[] - { + return + [ 0x0F109C00u, // SQRSHRN V0.4H, V0.4S, #16 0x2F109C00u, // UQRSHRN V0.4H, V0.4S, #16 0x2F108C00u, // SQRSHRUN V0.4H, V0.4S, #16 0x0F109400u, // SQSHRN V0.4H, V0.4S, #16 0x2F109400u, // UQSHRN V0.4H, V0.4S, #16 - 0x2F108400u, // SQSHRUN V0.4H, V0.4S, #16 - }; + 0x2F108400u // SQSHRUN V0.4H, V0.4S, #16 + ]; } private static uint[] _ShrImmSaturatingNarrow_V_2D2S_2D4S_() { - return new[] - { + return + [ 0x0F209C00u, // SQRSHRN V0.2S, V0.2D, #32 0x2F209C00u, // UQRSHRN V0.2S, V0.2D, #32 0x2F208C00u, // SQRSHRUN V0.2S, V0.2D, #32 0x0F209400u, // SQSHRN V0.2S, V0.2D, #32 0x2F209400u, // UQSHRN V0.2S, V0.2D, #32 - 0x2F208400u, // SQSHRUN V0.2S, V0.2D, #32 - }; + 0x2F208400u // SQSHRUN V0.2S, V0.2D, #32 + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm32.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm32.cs index 7375f4d55..81b712ad7 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdShImm32.cs @@ -13,98 +13,99 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Types)" private static ulong[] _1D_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7FFFFFFFFFFFFFFFul, - 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8000000000000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _2S_() { - return new[] - { - 0x0000000000000000ul, 0x7FFFFFFF7FFFFFFFul, 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul, - }; + return + [ + 0x0000000000000000ul, 0x7FFFFFFF7FFFFFFFul, 0x8000000080000000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _4H_() { - return new[] - { - 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul, - }; + return + [ + 0x0000000000000000ul, 0x7FFF7FFF7FFF7FFFul, 0x8000800080008000ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static ulong[] _8B_() { - return new[] - { - 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul, - }; + return + [ + 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul + ]; } #endregion #region "ValueSource (Opcodes)" private static uint[] _Vshr_Imm_SU8_() { - return new[] - { + return + [ 0xf2880010u, // VSHR.S8 D0, D0, #8 0xf2880110u, // VSRA.S8 D0, D0, #8 0xf2880210u, // VRSHR.S8 D0, D0, #8 - 0xf2880310u, // VRSRA.S8 D0, D0, #8 - }; + 0xf2880310u // VRSRA.S8 D0, D0, #8 + ]; } private static uint[] _Vshr_Imm_SU16_() { - return new[] - { + return + [ 0xf2900010u, // VSHR.S16 D0, D0, #16 0xf2900110u, // VSRA.S16 D0, D0, #16 0xf2900210u, // VRSHR.S16 D0, D0, #16 - 0xf2900310u, // VRSRA.S16 D0, D0, #16 - }; + 0xf2900310u // VRSRA.S16 D0, D0, #16 + ]; } private static uint[] _Vshr_Imm_SU32_() { - return new[] - { + return + [ 0xf2a00010u, // VSHR.S32 D0, D0, #32 0xf2a00110u, // VSRA.S32 D0, D0, #32 0xf2a00210u, // VRSHR.S32 D0, D0, #32 - 0xf2a00310u, // VRSRA.S32 D0, D0, #32 - }; + 0xf2a00310u // VRSRA.S32 D0, D0, #32 + ]; } private static uint[] _Vshr_Imm_SU64_() { - return new[] - { + return + [ 0xf2800190u, // VSRA.S64 D0, D0, #64 0xf2800290u, // VRSHR.S64 D0, D0, #64 - 0xf2800090u, // VSHR.S64 D0, D0, #64 - }; + 0xf2800090u // VSHR.S64 D0, D0, #64 + ]; } private static uint[] _Vqshrn_Vqrshrn_Vrshrn_Imm_() { - return new[] - { + return + [ 0xf2800910u, // VORR.I16 D0, #0 (immediate value changes it into QSHRN) 0xf2800950u, // VORR.I16 Q0, #0 (immediate value changes it into QRSHRN) - 0xf2800850u, // VMOV.I16 Q0, #0 (immediate value changes it into RSHRN) - }; + 0xf2800850u // VMOV.I16 Q0, #0 (immediate value changes it into RSHRN) + ]; } private static uint[] _Vqshrun_Vqrshrun_Imm_() { - return new[] - { + return + [ 0xf3800810u, // VMOV.I16 D0, #0x80 (immediate value changes it into QSHRUN) - 0xf3800850u, // VMOV.I16 Q0, #0x80 (immediate value changes it into QRSHRUN) - }; + 0xf3800850u // VMOV.I16 Q0, #0x80 (immediate value changes it into QRSHRUN) + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSimdTbl.cs b/src/Ryujinx.Tests/Cpu/CpuTestSimdTbl.cs index 78af6fe4e..2801a1dcb 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSimdTbl.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSimdTbl.cs @@ -38,10 +38,11 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Types)" private static ulong[] _8B_() { - return new[] { + return + [ 0x0000000000000000ul, 0x7F7F7F7F7F7F7F7Ful, - 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul, - }; + 0x8080808080808080ul, 0xFFFFFFFFFFFFFFFFul + ]; } private static IEnumerable _GenIdxsForTbl1_() @@ -100,38 +101,38 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _SingleRegisterTable_V_8B_16B_() { - return new[] - { + return + [ 0x0E000000u, // TBL V0.8B, { V0.16B }, V0.8B - 0x0E001000u, // TBX V0.8B, { V0.16B }, V0.8B - }; + 0x0E001000u // TBX V0.8B, { V0.16B }, V0.8B + ]; } private static uint[] _TwoRegisterTable_V_8B_16B_() { - return new[] - { + return + [ 0x0E002000u, // TBL V0.8B, { V0.16B, V1.16B }, V0.8B - 0x0E003000u, // TBX V0.8B, { V0.16B, V1.16B }, V0.8B - }; + 0x0E003000u // TBX V0.8B, { V0.16B, V1.16B }, V0.8B + ]; } private static uint[] _ThreeRegisterTable_V_8B_16B_() { - return new[] - { + return + [ 0x0E004000u, // TBL V0.8B, { V0.16B, V1.16B, V2.16B }, V0.8B - 0x0E005000u, // TBX V0.8B, { V0.16B, V1.16B, V2.16B }, V0.8B - }; + 0x0E005000u // TBX V0.8B, { V0.16B, V1.16B, V2.16B }, V0.8B + ]; } private static uint[] _FourRegisterTable_V_8B_16B_() { - return new[] - { + return + [ 0x0E006000u, // TBL V0.8B, { V0.16B, V1.16B, V2.16B, V3.16B }, V0.8B - 0x0E006000u, // TBX V0.8B, { V0.16B, V1.16B, V2.16B, V3.16B }, V0.8B - }; + 0x0E006000u // TBX V0.8B, { V0.16B, V1.16B, V2.16B, V3.16B }, V0.8B + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestSystem.cs b/src/Ryujinx.Tests/Cpu/CpuTestSystem.cs index 6c498ef0f..43cd6e65a 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestSystem.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestSystem.cs @@ -38,11 +38,11 @@ namespace Ryujinx.Tests.Cpu #region "ValueSource (Opcodes)" private static uint[] _MrsMsr_Nzcv_() { - return new[] - { + return + [ 0xD53B4200u, // MRS X0, NZCV - 0xD51B4200u, // MSR NZCV, X0 - }; + 0xD51B4200u // MSR NZCV, X0 + ]; } #endregion diff --git a/src/Ryujinx.Tests/Cpu/CpuTestT32Alu.cs b/src/Ryujinx.Tests/Cpu/CpuTestT32Alu.cs index a0d46692c..b116e70f6 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestT32Alu.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestT32Alu.cs @@ -18,997 +18,1315 @@ namespace Ryujinx.Tests.Cpu } public static readonly PrecomputedThumbTestCase[] RsImmTestCases = - { + [ // TST (reg) new() { - Instructions = new ushort[] { 0xea18, 0x4f03, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x15a99211, 0x08a56ba3, 0x3c588032, 0xdac302ae, 0x6b7d5b2d, 0x4fe1d8dd, 0x04a574ba, 0x7873779d, 0x17a565d1, 0x63a4bf95, 0xd62594fb, 0x2b9aa84b, 0x20448ccd, 0x70b2197e, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0x15a99211, 0x08a56ba3, 0x3c588032, 0xdac302ae, 0x6b7d5b2d, 0x4fe1d8dd, 0x04a574ba, 0x7873779d, 0x17a565d1, 0x63a4bf95, 0xd62594fb, 0x2b9aa84b, 0x20448ccd, 0x70b2197e, 0x00000000, 0x300001d0 }, + Instructions = [0xea18, 0x4f03, 0x4770, 0xe7fe], + StartRegs = [0x15a99211, 0x08a56ba3, 0x3c588032, 0xdac302ae, 0x6b7d5b2d, 0x4fe1d8dd, 0x04a574ba, 0x7873779d, 0x17a565d1, 0x63a4bf95, 0xd62594fb, 0x2b9aa84b, 0x20448ccd, 0x70b2197e, 0x00000000, 0x700001f0 + ], + FinalRegs = [0x15a99211, 0x08a56ba3, 0x3c588032, 0xdac302ae, 0x6b7d5b2d, 0x4fe1d8dd, 0x04a574ba, 0x7873779d, 0x17a565d1, 0x63a4bf95, 0xd62594fb, 0x2b9aa84b, 0x20448ccd, 0x70b2197e, 0x00000000, 0x300001d0 + ], }, new() { - Instructions = new ushort[] { 0xea11, 0x5f67, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xc9754393, 0xec511f2a, 0xc365b8f1, 0xa024565a, 0x089ae8e2, 0xf0c91f23, 0x290f83f4, 0x48f2f445, 0xd3288f2b, 0x7d7b2e44, 0xe80dd37e, 0xb000697f, 0x95be1027, 0x74702206, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0xc9754393, 0xec511f2a, 0xc365b8f1, 0xa024565a, 0x089ae8e2, 0xf0c91f23, 0x290f83f4, 0x48f2f445, 0xd3288f2b, 0x7d7b2e44, 0xe80dd37e, 0xb000697f, 0x95be1027, 0x74702206, 0x00000000, 0x200001d0 }, + Instructions = [0xea11, 0x5f67, 0x4770, 0xe7fe], + StartRegs = [0xc9754393, 0xec511f2a, 0xc365b8f1, 0xa024565a, 0x089ae8e2, 0xf0c91f23, 0x290f83f4, 0x48f2f445, 0xd3288f2b, 0x7d7b2e44, 0xe80dd37e, 0xb000697f, 0x95be1027, 0x74702206, 0x00000000, 0x200001f0 + ], + FinalRegs = [0xc9754393, 0xec511f2a, 0xc365b8f1, 0xa024565a, 0x089ae8e2, 0xf0c91f23, 0x290f83f4, 0x48f2f445, 0xd3288f2b, 0x7d7b2e44, 0xe80dd37e, 0xb000697f, 0x95be1027, 0x74702206, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1a, 0x2fc9, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xe9c49eb7, 0x2ca13a97, 0x3fded5a8, 0x30e203e9, 0x811a9ee5, 0x504f95f2, 0x746794b4, 0xfe92b6d6, 0x7608d3c4, 0xf3c5ea36, 0x6290c8f2, 0x45a4a521, 0x359a615c, 0x25674915, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0xe9c49eb7, 0x2ca13a97, 0x3fded5a8, 0x30e203e9, 0x811a9ee5, 0x504f95f2, 0x746794b4, 0xfe92b6d6, 0x7608d3c4, 0xf3c5ea36, 0x6290c8f2, 0x45a4a521, 0x359a615c, 0x25674915, 0x00000000, 0x100001d0 }, + Instructions = [0xea1a, 0x2fc9, 0x4770, 0xe7fe], + StartRegs = [0xe9c49eb7, 0x2ca13a97, 0x3fded5a8, 0x30e203e9, 0x811a9ee5, 0x504f95f2, 0x746794b4, 0xfe92b6d6, 0x7608d3c4, 0xf3c5ea36, 0x6290c8f2, 0x45a4a521, 0x359a615c, 0x25674915, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0xe9c49eb7, 0x2ca13a97, 0x3fded5a8, 0x30e203e9, 0x811a9ee5, 0x504f95f2, 0x746794b4, 0xfe92b6d6, 0x7608d3c4, 0xf3c5ea36, 0x6290c8f2, 0x45a4a521, 0x359a615c, 0x25674915, 0x00000000, 0x100001d0 + ], }, new() { - Instructions = new ushort[] { 0xea15, 0x0f85, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3130c8d7, 0x5917d350, 0xdf48eedb, 0x23025883, 0x076175bb, 0x5402cc6c, 0x54a95806, 0x7f59c691, 0x9c3eeebf, 0x4b52b4d1, 0xb4eb9626, 0x21fa7996, 0x0ff0a95a, 0x6beb27fd, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0x3130c8d7, 0x5917d350, 0xdf48eedb, 0x23025883, 0x076175bb, 0x5402cc6c, 0x54a95806, 0x7f59c691, 0x9c3eeebf, 0x4b52b4d1, 0xb4eb9626, 0x21fa7996, 0x0ff0a95a, 0x6beb27fd, 0x00000000, 0x200001d0 }, + Instructions = [0xea15, 0x0f85, 0x4770, 0xe7fe], + StartRegs = [0x3130c8d7, 0x5917d350, 0xdf48eedb, 0x23025883, 0x076175bb, 0x5402cc6c, 0x54a95806, 0x7f59c691, 0x9c3eeebf, 0x4b52b4d1, 0xb4eb9626, 0x21fa7996, 0x0ff0a95a, 0x6beb27fd, 0x00000000, 0x600001f0 + ], + FinalRegs = [0x3130c8d7, 0x5917d350, 0xdf48eedb, 0x23025883, 0x076175bb, 0x5402cc6c, 0x54a95806, 0x7f59c691, 0x9c3eeebf, 0x4b52b4d1, 0xb4eb9626, 0x21fa7996, 0x0ff0a95a, 0x6beb27fd, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1b, 0x6feb, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x39889074, 0xbea8978e, 0x0331cc7a, 0x448e3b19, 0x33285e9e, 0xdf295408, 0x8444676e, 0xe6998904, 0x819e4da4, 0xb099272c, 0x101385a7, 0x71728a87, 0x76f95b3a, 0x8d5012e4, 0x00000000, 0xc00001f0 }, - FinalRegs = new uint[] { 0x39889074, 0xbea8978e, 0x0331cc7a, 0x448e3b19, 0x33285e9e, 0xdf295408, 0x8444676e, 0xe6998904, 0x819e4da4, 0xb099272c, 0x101385a7, 0x71728a87, 0x76f95b3a, 0x8d5012e4, 0x00000000, 0x000001d0 }, + Instructions = [0xea1b, 0x6feb, 0x4770, 0xe7fe], + StartRegs = [0x39889074, 0xbea8978e, 0x0331cc7a, 0x448e3b19, 0x33285e9e, 0xdf295408, 0x8444676e, 0xe6998904, 0x819e4da4, 0xb099272c, 0x101385a7, 0x71728a87, 0x76f95b3a, 0x8d5012e4, 0x00000000, 0xc00001f0 + ], + FinalRegs = [0x39889074, 0xbea8978e, 0x0331cc7a, 0x448e3b19, 0x33285e9e, 0xdf295408, 0x8444676e, 0xe6998904, 0x819e4da4, 0xb099272c, 0x101385a7, 0x71728a87, 0x76f95b3a, 0x8d5012e4, 0x00000000, 0x000001d0 + ], }, // AND (reg) new() { - Instructions = new ushort[] { 0xea18, 0x1f52, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xcbe174f1, 0x44be318c, 0x4a8a1a70, 0x1f3c8883, 0x33b316ee, 0x0591a3c5, 0x0ceff4a5, 0xd74988e2, 0xa5ef1873, 0xbd35a940, 0x52a9f4d8, 0xf8662781, 0xda558ea8, 0x4c7d50bc, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0xcbe174f1, 0x44be318c, 0x4a8a1a70, 0x1f3c8883, 0x33b316ee, 0x0591a3c5, 0x0ceff4a5, 0xd74988e2, 0xa5ef1873, 0xbd35a940, 0x52a9f4d8, 0xf8662781, 0xda558ea8, 0x4c7d50bc, 0x00000000, 0x200001d0 }, + Instructions = [0xea18, 0x1f52, 0x4770, 0xe7fe], + StartRegs = [0xcbe174f1, 0x44be318c, 0x4a8a1a70, 0x1f3c8883, 0x33b316ee, 0x0591a3c5, 0x0ceff4a5, 0xd74988e2, 0xa5ef1873, 0xbd35a940, 0x52a9f4d8, 0xf8662781, 0xda558ea8, 0x4c7d50bc, 0x00000000, 0x400001f0 + ], + FinalRegs = [0xcbe174f1, 0x44be318c, 0x4a8a1a70, 0x1f3c8883, 0x33b316ee, 0x0591a3c5, 0x0ceff4a5, 0xd74988e2, 0xa5ef1873, 0xbd35a940, 0x52a9f4d8, 0xf8662781, 0xda558ea8, 0x4c7d50bc, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea19, 0x4f6b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x97b9423c, 0x1c25286b, 0x50f84fef, 0xd917c24e, 0x2a5116af, 0xcc65ba10, 0xf5e9dc41, 0xf9f61d10, 0x9876cfe5, 0xd0fdd4bc, 0x95913be0, 0x844c820f, 0xfdaf9519, 0xf3fb09b6, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x97b9423c, 0x1c25286b, 0x50f84fef, 0xd917c24e, 0x2a5116af, 0xcc65ba10, 0xf5e9dc41, 0xf9f61d10, 0x9876cfe5, 0xd0fdd4bc, 0x95913be0, 0x844c820f, 0xfdaf9519, 0xf3fb09b6, 0x00000000, 0x900001d0 }, + Instructions = [0xea19, 0x4f6b, 0x4770, 0xe7fe], + StartRegs = [0x97b9423c, 0x1c25286b, 0x50f84fef, 0xd917c24e, 0x2a5116af, 0xcc65ba10, 0xf5e9dc41, 0xf9f61d10, 0x9876cfe5, 0xd0fdd4bc, 0x95913be0, 0x844c820f, 0xfdaf9519, 0xf3fb09b6, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x97b9423c, 0x1c25286b, 0x50f84fef, 0xd917c24e, 0x2a5116af, 0xcc65ba10, 0xf5e9dc41, 0xf9f61d10, 0x9876cfe5, 0xd0fdd4bc, 0x95913be0, 0x844c820f, 0xfdaf9519, 0xf3fb09b6, 0x00000000, 0x900001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1b, 0x3f52, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x1900757b, 0x6914c62d, 0x5eaa28ed, 0xd927c1f7, 0xfd2052ac, 0x146bcb99, 0x604f9b1d, 0xb395bf46, 0x3723ba84, 0xb909d3ec, 0x3db4365e, 0x42df68cd, 0x5fdc10cb, 0x4955b8be, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x1900757b, 0x6914c62d, 0x5eaa28ed, 0xd927c1f7, 0xfd2052ac, 0x146bcb99, 0x604f9b1d, 0xb395bf46, 0x3723ba84, 0xb909d3ec, 0x3db4365e, 0x42df68cd, 0x5fdc10cb, 0x4955b8be, 0x00000000, 0x100001d0 }, + Instructions = [0xea1b, 0x3f52, 0x4770, 0xe7fe], + StartRegs = [0x1900757b, 0x6914c62d, 0x5eaa28ed, 0xd927c1f7, 0xfd2052ac, 0x146bcb99, 0x604f9b1d, 0xb395bf46, 0x3723ba84, 0xb909d3ec, 0x3db4365e, 0x42df68cd, 0x5fdc10cb, 0x4955b8be, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x1900757b, 0x6914c62d, 0x5eaa28ed, 0xd927c1f7, 0xfd2052ac, 0x146bcb99, 0x604f9b1d, 0xb395bf46, 0x3723ba84, 0xb909d3ec, 0x3db4365e, 0x42df68cd, 0x5fdc10cb, 0x4955b8be, 0x00000000, 0x100001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1a, 0x0f17, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6134093f, 0x115a1456, 0xa7877f6e, 0x2070e9eb, 0x9ddf4a73, 0x14266482, 0x7f98e557, 0xbaa854e0, 0xa37f89a6, 0x641325de, 0xae2dc79b, 0x5b3f2af2, 0x476476d2, 0xb99cc9fd, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x6134093f, 0x115a1456, 0xa7877f6e, 0x2070e9eb, 0x9ddf4a73, 0x14266482, 0x7f98e557, 0xbaa854e0, 0xa37f89a6, 0x641325de, 0xae2dc79b, 0x5b3f2af2, 0x476476d2, 0xb99cc9fd, 0x00000000, 0x700001d0 }, + Instructions = [0xea1a, 0x0f17, 0x4770, 0xe7fe], + StartRegs = [0x6134093f, 0x115a1456, 0xa7877f6e, 0x2070e9eb, 0x9ddf4a73, 0x14266482, 0x7f98e557, 0xbaa854e0, 0xa37f89a6, 0x641325de, 0xae2dc79b, 0x5b3f2af2, 0x476476d2, 0xb99cc9fd, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x6134093f, 0x115a1456, 0xa7877f6e, 0x2070e9eb, 0x9ddf4a73, 0x14266482, 0x7f98e557, 0xbaa854e0, 0xa37f89a6, 0x641325de, 0xae2dc79b, 0x5b3f2af2, 0x476476d2, 0xb99cc9fd, 0x00000000, 0x700001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1b, 0x5f17, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xbaa2bc1a, 0xee3e86d4, 0x3179d65a, 0x8a63cf55, 0x48ea14f4, 0xf85c5d5b, 0x6af50974, 0xf3ded3e9, 0xdab4d6e6, 0x930c07eb, 0x8084b2dd, 0xf6518695, 0x4a3e0f7a, 0x581bd56a, 0x00000000, 0x300001f0 }, - FinalRegs = new uint[] { 0xbaa2bc1a, 0xee3e86d4, 0x3179d65a, 0x8a63cf55, 0x48ea14f4, 0xf85c5d5b, 0x6af50974, 0xf3ded3e9, 0xdab4d6e6, 0x930c07eb, 0x8084b2dd, 0xf6518695, 0x4a3e0f7a, 0x581bd56a, 0x00000000, 0x300001d0 }, + Instructions = [0xea1b, 0x5f17, 0x4770, 0xe7fe], + StartRegs = [0xbaa2bc1a, 0xee3e86d4, 0x3179d65a, 0x8a63cf55, 0x48ea14f4, 0xf85c5d5b, 0x6af50974, 0xf3ded3e9, 0xdab4d6e6, 0x930c07eb, 0x8084b2dd, 0xf6518695, 0x4a3e0f7a, 0x581bd56a, 0x00000000, 0x300001f0 + ], + FinalRegs = [0xbaa2bc1a, 0xee3e86d4, 0x3179d65a, 0x8a63cf55, 0x48ea14f4, 0xf85c5d5b, 0x6af50974, 0xf3ded3e9, 0xdab4d6e6, 0x930c07eb, 0x8084b2dd, 0xf6518695, 0x4a3e0f7a, 0x581bd56a, 0x00000000, 0x300001d0 + ], }, // BIC (reg) new() { - Instructions = new ushort[] { 0xea1c, 0x0fbc, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xfc7b7a8b, 0xc1186d54, 0x0a83eda1, 0x88fed37c, 0x5438e8ea, 0xe0af3690, 0x6dba7b9f, 0xa7395bd6, 0xd43af274, 0xbb46f4c2, 0xb65dbcd5, 0xa6bd08b0, 0xb55971c7, 0x2244572e, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0xfc7b7a8b, 0xc1186d54, 0x0a83eda1, 0x88fed37c, 0x5438e8ea, 0xe0af3690, 0x6dba7b9f, 0xa7395bd6, 0xd43af274, 0xbb46f4c2, 0xb65dbcd5, 0xa6bd08b0, 0xb55971c7, 0x2244572e, 0x00000000, 0xb00001d0 }, + Instructions = [0xea1c, 0x0fbc, 0x4770, 0xe7fe], + StartRegs = [0xfc7b7a8b, 0xc1186d54, 0x0a83eda1, 0x88fed37c, 0x5438e8ea, 0xe0af3690, 0x6dba7b9f, 0xa7395bd6, 0xd43af274, 0xbb46f4c2, 0xb65dbcd5, 0xa6bd08b0, 0xb55971c7, 0x2244572e, 0x00000000, 0x700001f0 + ], + FinalRegs = [0xfc7b7a8b, 0xc1186d54, 0x0a83eda1, 0x88fed37c, 0x5438e8ea, 0xe0af3690, 0x6dba7b9f, 0xa7395bd6, 0xd43af274, 0xbb46f4c2, 0xb65dbcd5, 0xa6bd08b0, 0xb55971c7, 0x2244572e, 0x00000000, 0xb00001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1b, 0x5fe7, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x75f617c8, 0x12ac7ccd, 0x85e6d881, 0x30967bdd, 0xdf66b387, 0xb3d59ccf, 0xe3c824b4, 0xada7a9e4, 0x225da86f, 0x18e008ac, 0x51854224, 0xf3b43823, 0xde37f151, 0x6764b34a, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0x75f617c8, 0x12ac7ccd, 0x85e6d881, 0x30967bdd, 0xdf66b387, 0xb3d59ccf, 0xe3c824b4, 0xada7a9e4, 0x225da86f, 0x18e008ac, 0x51854224, 0xf3b43823, 0xde37f151, 0x6764b34a, 0x00000000, 0x800001d0 }, + Instructions = [0xea1b, 0x5fe7, 0x4770, 0xe7fe], + StartRegs = [0x75f617c8, 0x12ac7ccd, 0x85e6d881, 0x30967bdd, 0xdf66b387, 0xb3d59ccf, 0xe3c824b4, 0xada7a9e4, 0x225da86f, 0x18e008ac, 0x51854224, 0xf3b43823, 0xde37f151, 0x6764b34a, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0x75f617c8, 0x12ac7ccd, 0x85e6d881, 0x30967bdd, 0xdf66b387, 0xb3d59ccf, 0xe3c824b4, 0xada7a9e4, 0x225da86f, 0x18e008ac, 0x51854224, 0xf3b43823, 0xde37f151, 0x6764b34a, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x1fc3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xde174255, 0x3968e364, 0xf1efd73b, 0x9a159a4e, 0x2b906c3e, 0xf1dfb847, 0x34e3e8f0, 0x39c33745, 0xc368a812, 0x8f3fe175, 0xe3da055f, 0x7737a5d5, 0x7464344a, 0xdb3ac192, 0x00000000, 0x000001f0 }, - FinalRegs = new uint[] { 0xde174255, 0x3968e364, 0xf1efd73b, 0x9a159a4e, 0x2b906c3e, 0xf1dfb847, 0x34e3e8f0, 0x39c33745, 0xc368a812, 0x8f3fe175, 0xe3da055f, 0x7737a5d5, 0x7464344a, 0xdb3ac192, 0x00000000, 0x200001d0 }, + Instructions = [0xea14, 0x1fc3, 0x4770, 0xe7fe], + StartRegs = [0xde174255, 0x3968e364, 0xf1efd73b, 0x9a159a4e, 0x2b906c3e, 0xf1dfb847, 0x34e3e8f0, 0x39c33745, 0xc368a812, 0x8f3fe175, 0xe3da055f, 0x7737a5d5, 0x7464344a, 0xdb3ac192, 0x00000000, 0x000001f0 + ], + FinalRegs = [0xde174255, 0x3968e364, 0xf1efd73b, 0x9a159a4e, 0x2b906c3e, 0xf1dfb847, 0x34e3e8f0, 0x39c33745, 0xc368a812, 0x8f3fe175, 0xe3da055f, 0x7737a5d5, 0x7464344a, 0xdb3ac192, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea18, 0x6f66, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x368ef4f3, 0x18583461, 0x94f6e104, 0x21e1c1b0, 0x009c85df, 0xe6bddfb2, 0x118e9dad, 0xcdf92eb5, 0xae18b093, 0xe24a54ab, 0x55d1a1a0, 0x0eed1bad, 0x8b6bce47, 0x20b1fdc2, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x368ef4f3, 0x18583461, 0x94f6e104, 0x21e1c1b0, 0x009c85df, 0xe6bddfb2, 0x118e9dad, 0xcdf92eb5, 0xae18b093, 0xe24a54ab, 0x55d1a1a0, 0x0eed1bad, 0x8b6bce47, 0x20b1fdc2, 0x00000000, 0x700001d0 }, + Instructions = [0xea18, 0x6f66, 0x4770, 0xe7fe], + StartRegs = [0x368ef4f3, 0x18583461, 0x94f6e104, 0x21e1c1b0, 0x009c85df, 0xe6bddfb2, 0x118e9dad, 0xcdf92eb5, 0xae18b093, 0xe24a54ab, 0x55d1a1a0, 0x0eed1bad, 0x8b6bce47, 0x20b1fdc2, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x368ef4f3, 0x18583461, 0x94f6e104, 0x21e1c1b0, 0x009c85df, 0xe6bddfb2, 0x118e9dad, 0xcdf92eb5, 0xae18b093, 0xe24a54ab, 0x55d1a1a0, 0x0eed1bad, 0x8b6bce47, 0x20b1fdc2, 0x00000000, 0x700001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1b, 0x3fc6, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6f913e40, 0xd1814933, 0x181eb63c, 0x287a5050, 0xe5925dd9, 0x712ee261, 0xcca2e51d, 0x0e88a1ba, 0xa4c8d4c3, 0x26887e3e, 0x83b8de36, 0xc5a5d439, 0x8d2ace7a, 0x9df36292, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0x6f913e40, 0xd1814933, 0x181eb63c, 0x287a5050, 0xe5925dd9, 0x712ee261, 0xcca2e51d, 0x0e88a1ba, 0xa4c8d4c3, 0x26887e3e, 0x83b8de36, 0xc5a5d439, 0x8d2ace7a, 0x9df36292, 0x00000000, 0x200001d0 }, + Instructions = [0xea1b, 0x3fc6, 0x4770, 0xe7fe], + StartRegs = [0x6f913e40, 0xd1814933, 0x181eb63c, 0x287a5050, 0xe5925dd9, 0x712ee261, 0xcca2e51d, 0x0e88a1ba, 0xa4c8d4c3, 0x26887e3e, 0x83b8de36, 0xc5a5d439, 0x8d2ace7a, 0x9df36292, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0x6f913e40, 0xd1814933, 0x181eb63c, 0x287a5050, 0xe5925dd9, 0x712ee261, 0xcca2e51d, 0x0e88a1ba, 0xa4c8d4c3, 0x26887e3e, 0x83b8de36, 0xc5a5d439, 0x8d2ace7a, 0x9df36292, 0x00000000, 0x200001d0 + ], }, // MOV (reg) new() { - Instructions = new ushort[] { 0xea16, 0x2fdd, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x89fcb953, 0xafbf8db2, 0xad96137f, 0x7901360c, 0x513b561b, 0x2345a005, 0x0ece889b, 0xc8bb918f, 0x270458ce, 0x73bea675, 0xab735592, 0xf68e00e5, 0x88bf2dc1, 0x98601074, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0x89fcb953, 0xafbf8db2, 0xad96137f, 0x7901360c, 0x513b561b, 0x2345a005, 0x0ece889b, 0xc8bb918f, 0x270458ce, 0x73bea675, 0xab735592, 0xf68e00e5, 0x88bf2dc1, 0x98601074, 0x00000000, 0x000001d0 }, + Instructions = [0xea16, 0x2fdd, 0x4770, 0xe7fe], + StartRegs = [0x89fcb953, 0xafbf8db2, 0xad96137f, 0x7901360c, 0x513b561b, 0x2345a005, 0x0ece889b, 0xc8bb918f, 0x270458ce, 0x73bea675, 0xab735592, 0xf68e00e5, 0x88bf2dc1, 0x98601074, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0x89fcb953, 0xafbf8db2, 0xad96137f, 0x7901360c, 0x513b561b, 0x2345a005, 0x0ece889b, 0xc8bb918f, 0x270458ce, 0x73bea675, 0xab735592, 0xf68e00e5, 0x88bf2dc1, 0x98601074, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea19, 0x6fd6, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x35f5eea1, 0x75fe4252, 0x71165923, 0x13ad82d2, 0x01f69a1c, 0x33ff5351, 0x869c335f, 0x70ce9266, 0xf58868ad, 0x4f58e982, 0x89f7df88, 0xd0ba8d45, 0xf45e6e03, 0x7f653972, 0x00000000, 0x800001f0 }, - FinalRegs = new uint[] { 0x35f5eea1, 0x75fe4252, 0x71165923, 0x13ad82d2, 0x01f69a1c, 0x33ff5351, 0x869c335f, 0x70ce9266, 0xf58868ad, 0x4f58e982, 0x89f7df88, 0xd0ba8d45, 0xf45e6e03, 0x7f653972, 0x00000000, 0x600001d0 }, + Instructions = [0xea19, 0x6fd6, 0x4770, 0xe7fe], + StartRegs = [0x35f5eea1, 0x75fe4252, 0x71165923, 0x13ad82d2, 0x01f69a1c, 0x33ff5351, 0x869c335f, 0x70ce9266, 0xf58868ad, 0x4f58e982, 0x89f7df88, 0xd0ba8d45, 0xf45e6e03, 0x7f653972, 0x00000000, 0x800001f0 + ], + FinalRegs = [0x35f5eea1, 0x75fe4252, 0x71165923, 0x13ad82d2, 0x01f69a1c, 0x33ff5351, 0x869c335f, 0x70ce9266, 0xf58868ad, 0x4f58e982, 0x89f7df88, 0xd0ba8d45, 0xf45e6e03, 0x7f653972, 0x00000000, 0x600001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x6f5d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x1e83719a, 0x1b6405c5, 0x25d9d1d6, 0x3e5fc7f3, 0xd157d610, 0x271b5c46, 0xb65c2838, 0xe4590643, 0x2f2623d7, 0xf1155f93, 0xfa676221, 0x6fac2a1d, 0xc1fa1d8d, 0x8cfa89e1, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x1e83719a, 0x1b6405c5, 0x25d9d1d6, 0x3e5fc7f3, 0xd157d610, 0x271b5c46, 0xb65c2838, 0xe4590643, 0x2f2623d7, 0xf1155f93, 0xfa676221, 0x6fac2a1d, 0xc1fa1d8d, 0x8cfa89e1, 0x00000000, 0x500001d0 }, + Instructions = [0xea14, 0x6f5d, 0x4770, 0xe7fe], + StartRegs = [0x1e83719a, 0x1b6405c5, 0x25d9d1d6, 0x3e5fc7f3, 0xd157d610, 0x271b5c46, 0xb65c2838, 0xe4590643, 0x2f2623d7, 0xf1155f93, 0xfa676221, 0x6fac2a1d, 0xc1fa1d8d, 0x8cfa89e1, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x1e83719a, 0x1b6405c5, 0x25d9d1d6, 0x3e5fc7f3, 0xd157d610, 0x271b5c46, 0xb65c2838, 0xe4590643, 0x2f2623d7, 0xf1155f93, 0xfa676221, 0x6fac2a1d, 0xc1fa1d8d, 0x8cfa89e1, 0x00000000, 0x500001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1c, 0x2fa2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x431278f1, 0xd3fffe52, 0xbfb4d877, 0x10af0eeb, 0xd375b791, 0xbd19aa81, 0x45eb7ba3, 0x30e47d42, 0xc274e032, 0x6da10d33, 0xfeda1ba4, 0x3dc6205e, 0xc275197e, 0x6c8b86d1, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x431278f1, 0xd3fffe52, 0xbfb4d877, 0x10af0eeb, 0xd375b791, 0xbd19aa81, 0x45eb7ba3, 0x30e47d42, 0xc274e032, 0x6da10d33, 0xfeda1ba4, 0x3dc6205e, 0xc275197e, 0x6c8b86d1, 0x00000000, 0x900001d0 }, + Instructions = [0xea1c, 0x2fa2, 0x4770, 0xe7fe], + StartRegs = [0x431278f1, 0xd3fffe52, 0xbfb4d877, 0x10af0eeb, 0xd375b791, 0xbd19aa81, 0x45eb7ba3, 0x30e47d42, 0xc274e032, 0x6da10d33, 0xfeda1ba4, 0x3dc6205e, 0xc275197e, 0x6c8b86d1, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x431278f1, 0xd3fffe52, 0xbfb4d877, 0x10af0eeb, 0xd375b791, 0xbd19aa81, 0x45eb7ba3, 0x30e47d42, 0xc274e032, 0x6da10d33, 0xfeda1ba4, 0x3dc6205e, 0xc275197e, 0x6c8b86d1, 0x00000000, 0x900001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1a, 0x7f7b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x31f0830d, 0x69dda3f6, 0x983fc927, 0x0407652a, 0x32ceab65, 0xe76a77fd, 0x8a7dd0a6, 0x4892a02f, 0xeab00585, 0xa78bf230, 0x896dd5a9, 0xe3c44398, 0xc2d743d0, 0x42b03803, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x31f0830d, 0x69dda3f6, 0x983fc927, 0x0407652a, 0x32ceab65, 0xe76a77fd, 0x8a7dd0a6, 0x4892a02f, 0xeab00585, 0xa78bf230, 0x896dd5a9, 0xe3c44398, 0xc2d743d0, 0x42b03803, 0x00000000, 0x100001d0 }, + Instructions = [0xea1a, 0x7f7b, 0x4770, 0xe7fe], + StartRegs = [0x31f0830d, 0x69dda3f6, 0x983fc927, 0x0407652a, 0x32ceab65, 0xe76a77fd, 0x8a7dd0a6, 0x4892a02f, 0xeab00585, 0xa78bf230, 0x896dd5a9, 0xe3c44398, 0xc2d743d0, 0x42b03803, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x31f0830d, 0x69dda3f6, 0x983fc927, 0x0407652a, 0x32ceab65, 0xe76a77fd, 0x8a7dd0a6, 0x4892a02f, 0xeab00585, 0xa78bf230, 0x896dd5a9, 0xe3c44398, 0xc2d743d0, 0x42b03803, 0x00000000, 0x100001d0 + ], }, // ORR (reg) new() { - Instructions = new ushort[] { 0xea10, 0x5f72, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5834d41e, 0x7092ed2e, 0x8994242e, 0x7fac6d96, 0x4d896829, 0x1a578dec, 0x98649fd8, 0x3b713450, 0xca430792, 0xd68d5176, 0xfe0b5c4f, 0xd9caf416, 0xb0e9d5fa, 0x62c57422, 0x00000000, 0x800001f0 }, - FinalRegs = new uint[] { 0x5834d41e, 0x7092ed2e, 0x8994242e, 0x7fac6d96, 0x4d896829, 0x1a578dec, 0x98649fd8, 0x3b713450, 0xca430792, 0xd68d5176, 0xfe0b5c4f, 0xd9caf416, 0xb0e9d5fa, 0x62c57422, 0x00000000, 0x200001d0 }, + Instructions = [0xea10, 0x5f72, 0x4770, 0xe7fe], + StartRegs = [0x5834d41e, 0x7092ed2e, 0x8994242e, 0x7fac6d96, 0x4d896829, 0x1a578dec, 0x98649fd8, 0x3b713450, 0xca430792, 0xd68d5176, 0xfe0b5c4f, 0xd9caf416, 0xb0e9d5fa, 0x62c57422, 0x00000000, 0x800001f0 + ], + FinalRegs = [0x5834d41e, 0x7092ed2e, 0x8994242e, 0x7fac6d96, 0x4d896829, 0x1a578dec, 0x98649fd8, 0x3b713450, 0xca430792, 0xd68d5176, 0xfe0b5c4f, 0xd9caf416, 0xb0e9d5fa, 0x62c57422, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x0fb4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6842aa84, 0x0711ecb6, 0xebae7374, 0x6ea58edd, 0xa6d2837c, 0xbcc1e0d1, 0xe52c9d6c, 0x7bb5fa1c, 0xa7cd6f8a, 0x4558ddb7, 0x7adb449c, 0x95986dd8, 0x7432562c, 0x80d2595c, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x6842aa84, 0x0711ecb6, 0xebae7374, 0x6ea58edd, 0xa6d2837c, 0xbcc1e0d1, 0xe52c9d6c, 0x7bb5fa1c, 0xa7cd6f8a, 0x4558ddb7, 0x7adb449c, 0x95986dd8, 0x7432562c, 0x80d2595c, 0x00000000, 0x000001d0 }, + Instructions = [0xea14, 0x0fb4, 0x4770, 0xe7fe], + StartRegs = [0x6842aa84, 0x0711ecb6, 0xebae7374, 0x6ea58edd, 0xa6d2837c, 0xbcc1e0d1, 0xe52c9d6c, 0x7bb5fa1c, 0xa7cd6f8a, 0x4558ddb7, 0x7adb449c, 0x95986dd8, 0x7432562c, 0x80d2595c, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x6842aa84, 0x0711ecb6, 0xebae7374, 0x6ea58edd, 0xa6d2837c, 0xbcc1e0d1, 0xe52c9d6c, 0x7bb5fa1c, 0xa7cd6f8a, 0x4558ddb7, 0x7adb449c, 0x95986dd8, 0x7432562c, 0x80d2595c, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x2f78, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6be94e4c, 0x0569589b, 0xc7e6e127, 0xe5537aea, 0x323e7a85, 0x895e9a94, 0x2341f9b6, 0x9632a18a, 0xa790766f, 0x53533cf3, 0x83cec3aa, 0xa1d042af, 0xabff7e58, 0x614f9bc0, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x6be94e4c, 0x0569589b, 0xc7e6e127, 0xe5537aea, 0x323e7a85, 0x895e9a94, 0x2341f9b6, 0x9632a18a, 0xa790766f, 0x53533cf3, 0x83cec3aa, 0xa1d042af, 0xabff7e58, 0x614f9bc0, 0x00000000, 0x000001d0 }, + Instructions = [0xea14, 0x2f78, 0x4770, 0xe7fe], + StartRegs = [0x6be94e4c, 0x0569589b, 0xc7e6e127, 0xe5537aea, 0x323e7a85, 0x895e9a94, 0x2341f9b6, 0x9632a18a, 0xa790766f, 0x53533cf3, 0x83cec3aa, 0xa1d042af, 0xabff7e58, 0x614f9bc0, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x6be94e4c, 0x0569589b, 0xc7e6e127, 0xe5537aea, 0x323e7a85, 0x895e9a94, 0x2341f9b6, 0x9632a18a, 0xa790766f, 0x53533cf3, 0x83cec3aa, 0xa1d042af, 0xabff7e58, 0x614f9bc0, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea12, 0x4fbc, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x2e43ac9a, 0xa6a8d4b6, 0xf5853279, 0xf152f284, 0xce9656e5, 0x07642918, 0xd6e25d4a, 0xdebc7fa6, 0x8c3af5e0, 0x3d00cd4c, 0x7e744bb4, 0x2a4b8015, 0x602ea481, 0xdef7571b, 0x00000000, 0x300001f0 }, - FinalRegs = new uint[] { 0x2e43ac9a, 0xa6a8d4b6, 0xf5853279, 0xf152f284, 0xce9656e5, 0x07642918, 0xd6e25d4a, 0xdebc7fa6, 0x8c3af5e0, 0x3d00cd4c, 0x7e744bb4, 0x2a4b8015, 0x602ea481, 0xdef7571b, 0x00000000, 0xb00001d0 }, + Instructions = [0xea12, 0x4fbc, 0x4770, 0xe7fe], + StartRegs = [0x2e43ac9a, 0xa6a8d4b6, 0xf5853279, 0xf152f284, 0xce9656e5, 0x07642918, 0xd6e25d4a, 0xdebc7fa6, 0x8c3af5e0, 0x3d00cd4c, 0x7e744bb4, 0x2a4b8015, 0x602ea481, 0xdef7571b, 0x00000000, 0x300001f0 + ], + FinalRegs = [0x2e43ac9a, 0xa6a8d4b6, 0xf5853279, 0xf152f284, 0xce9656e5, 0x07642918, 0xd6e25d4a, 0xdebc7fa6, 0x8c3af5e0, 0x3d00cd4c, 0x7e744bb4, 0x2a4b8015, 0x602ea481, 0xdef7571b, 0x00000000, 0xb00001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x7f4c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x67be4dae, 0xff0f74a8, 0xd769f9e1, 0xb4a98e0a, 0x2988a7dc, 0xb5726464, 0xb7b3fb27, 0x077e539c, 0x9c817cd4, 0xa8cc3981, 0xbe5a7591, 0xc753850a, 0xb8c612a7, 0x6d913c9b, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0x67be4dae, 0xff0f74a8, 0xd769f9e1, 0xb4a98e0a, 0x2988a7dc, 0xb5726464, 0xb7b3fb27, 0x077e539c, 0x9c817cd4, 0xa8cc3981, 0xbe5a7591, 0xc753850a, 0xb8c612a7, 0x6d913c9b, 0x00000000, 0x100001d0 }, + Instructions = [0xea14, 0x7f4c, 0x4770, 0xe7fe], + StartRegs = [0x67be4dae, 0xff0f74a8, 0xd769f9e1, 0xb4a98e0a, 0x2988a7dc, 0xb5726464, 0xb7b3fb27, 0x077e539c, 0x9c817cd4, 0xa8cc3981, 0xbe5a7591, 0xc753850a, 0xb8c612a7, 0x6d913c9b, 0x00000000, 0x900001f0 + ], + FinalRegs = [0x67be4dae, 0xff0f74a8, 0xd769f9e1, 0xb4a98e0a, 0x2988a7dc, 0xb5726464, 0xb7b3fb27, 0x077e539c, 0x9c817cd4, 0xa8cc3981, 0xbe5a7591, 0xc753850a, 0xb8c612a7, 0x6d913c9b, 0x00000000, 0x100001d0 + ], }, // MVN (reg) new() { - Instructions = new ushort[] { 0xea15, 0x0ffb, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x4a0a7b4c, 0x4e58d907, 0x386b8207, 0xcd71b0c4, 0x86dcf525, 0x8ae9dba4, 0xf5d6a418, 0xfac79f2e, 0x44cf918b, 0x5d38193b, 0xc17adeaf, 0xa4ad8a86, 0x69527ece, 0x69b75c61, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0x4a0a7b4c, 0x4e58d907, 0x386b8207, 0xcd71b0c4, 0x86dcf525, 0x8ae9dba4, 0xf5d6a418, 0xfac79f2e, 0x44cf918b, 0x5d38193b, 0xc17adeaf, 0xa4ad8a86, 0x69527ece, 0x69b75c61, 0x00000000, 0xb00001d0 }, + Instructions = [0xea15, 0x0ffb, 0x4770, 0xe7fe], + StartRegs = [0x4a0a7b4c, 0x4e58d907, 0x386b8207, 0xcd71b0c4, 0x86dcf525, 0x8ae9dba4, 0xf5d6a418, 0xfac79f2e, 0x44cf918b, 0x5d38193b, 0xc17adeaf, 0xa4ad8a86, 0x69527ece, 0x69b75c61, 0x00000000, 0x900001f0 + ], + FinalRegs = [0x4a0a7b4c, 0x4e58d907, 0x386b8207, 0xcd71b0c4, 0x86dcf525, 0x8ae9dba4, 0xf5d6a418, 0xfac79f2e, 0x44cf918b, 0x5d38193b, 0xc17adeaf, 0xa4ad8a86, 0x69527ece, 0x69b75c61, 0x00000000, 0xb00001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1a, 0x4f01, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xce60a6df, 0xb1127c3f, 0x410d7b4a, 0xd9cfc917, 0xd1b2fc52, 0x8be1e03c, 0xde9b256d, 0xff989abd, 0x07e3c46a, 0x780e7d7c, 0xd807ce82, 0x5e5c8f2b, 0x09232f6d, 0x00746338, 0x00000000, 0x500001f0 }, - FinalRegs = new uint[] { 0xce60a6df, 0xb1127c3f, 0x410d7b4a, 0xd9cfc917, 0xd1b2fc52, 0x8be1e03c, 0xde9b256d, 0xff989abd, 0x07e3c46a, 0x780e7d7c, 0xd807ce82, 0x5e5c8f2b, 0x09232f6d, 0x00746338, 0x00000000, 0x100001d0 }, + Instructions = [0xea1a, 0x4f01, 0x4770, 0xe7fe], + StartRegs = [0xce60a6df, 0xb1127c3f, 0x410d7b4a, 0xd9cfc917, 0xd1b2fc52, 0x8be1e03c, 0xde9b256d, 0xff989abd, 0x07e3c46a, 0x780e7d7c, 0xd807ce82, 0x5e5c8f2b, 0x09232f6d, 0x00746338, 0x00000000, 0x500001f0 + ], + FinalRegs = [0xce60a6df, 0xb1127c3f, 0x410d7b4a, 0xd9cfc917, 0xd1b2fc52, 0x8be1e03c, 0xde9b256d, 0xff989abd, 0x07e3c46a, 0x780e7d7c, 0xd807ce82, 0x5e5c8f2b, 0x09232f6d, 0x00746338, 0x00000000, 0x100001d0 + ], }, new() { - Instructions = new ushort[] { 0xea18, 0x2f5e, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x18b1240a, 0xa896f734, 0xcd4a40bc, 0x28346a77, 0xbdf09586, 0x3c74ed70, 0x3e255ea3, 0xe55679b4, 0xcc602510, 0x9cd73bfb, 0xf21a6ddb, 0x263a4338, 0x06beb332, 0x0790ac93, 0x00000000, 0xa00001f0 }, - FinalRegs = new uint[] { 0x18b1240a, 0xa896f734, 0xcd4a40bc, 0x28346a77, 0xbdf09586, 0x3c74ed70, 0x3e255ea3, 0xe55679b4, 0xcc602510, 0x9cd73bfb, 0xf21a6ddb, 0x263a4338, 0x06beb332, 0x0790ac93, 0x00000000, 0x400001d0 }, + Instructions = [0xea18, 0x2f5e, 0x4770, 0xe7fe], + StartRegs = [0x18b1240a, 0xa896f734, 0xcd4a40bc, 0x28346a77, 0xbdf09586, 0x3c74ed70, 0x3e255ea3, 0xe55679b4, 0xcc602510, 0x9cd73bfb, 0xf21a6ddb, 0x263a4338, 0x06beb332, 0x0790ac93, 0x00000000, 0xa00001f0 + ], + FinalRegs = [0x18b1240a, 0xa896f734, 0xcd4a40bc, 0x28346a77, 0xbdf09586, 0x3c74ed70, 0x3e255ea3, 0xe55679b4, 0xcc602510, 0x9cd73bfb, 0xf21a6ddb, 0x263a4338, 0x06beb332, 0x0790ac93, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1b, 0x7f41, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0c25f69d, 0xc32dc28a, 0xf5e2fe71, 0xe46af209, 0x2d1b6ac8, 0xccac564c, 0x567cc561, 0x63707d28, 0xeae934c8, 0xab78e6f6, 0x2d78d86d, 0x76471cdc, 0x9b909f76, 0xa2cc099d, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0x0c25f69d, 0xc32dc28a, 0xf5e2fe71, 0xe46af209, 0x2d1b6ac8, 0xccac564c, 0x567cc561, 0x63707d28, 0xeae934c8, 0xab78e6f6, 0x2d78d86d, 0x76471cdc, 0x9b909f76, 0xa2cc099d, 0x00000000, 0x200001d0 }, + Instructions = [0xea1b, 0x7f41, 0x4770, 0xe7fe], + StartRegs = [0x0c25f69d, 0xc32dc28a, 0xf5e2fe71, 0xe46af209, 0x2d1b6ac8, 0xccac564c, 0x567cc561, 0x63707d28, 0xeae934c8, 0xab78e6f6, 0x2d78d86d, 0x76471cdc, 0x9b909f76, 0xa2cc099d, 0x00000000, 0x200001f0 + ], + FinalRegs = [0x0c25f69d, 0xc32dc28a, 0xf5e2fe71, 0xe46af209, 0x2d1b6ac8, 0xccac564c, 0x567cc561, 0x63707d28, 0xeae934c8, 0xab78e6f6, 0x2d78d86d, 0x76471cdc, 0x9b909f76, 0xa2cc099d, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea19, 0x6ff6, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6e79c449, 0xe9449bf7, 0x51f8fcb8, 0x138e0b80, 0x715312f2, 0x601ea894, 0xb01f9369, 0x02738c29, 0xee35545f, 0xb61ae4a2, 0xba412f08, 0x1d349e02, 0x56a0dfc0, 0x68cd5bfe, 0x00000000, 0x500001f0 }, - FinalRegs = new uint[] { 0x6e79c449, 0xe9449bf7, 0x51f8fcb8, 0x138e0b80, 0x715312f2, 0x601ea894, 0xb01f9369, 0x02738c29, 0xee35545f, 0xb61ae4a2, 0xba412f08, 0x1d349e02, 0x56a0dfc0, 0x68cd5bfe, 0x00000000, 0x100001d0 }, + Instructions = [0xea19, 0x6ff6, 0x4770, 0xe7fe], + StartRegs = [0x6e79c449, 0xe9449bf7, 0x51f8fcb8, 0x138e0b80, 0x715312f2, 0x601ea894, 0xb01f9369, 0x02738c29, 0xee35545f, 0xb61ae4a2, 0xba412f08, 0x1d349e02, 0x56a0dfc0, 0x68cd5bfe, 0x00000000, 0x500001f0 + ], + FinalRegs = [0x6e79c449, 0xe9449bf7, 0x51f8fcb8, 0x138e0b80, 0x715312f2, 0x601ea894, 0xb01f9369, 0x02738c29, 0xee35545f, 0xb61ae4a2, 0xba412f08, 0x1d349e02, 0x56a0dfc0, 0x68cd5bfe, 0x00000000, 0x100001d0 + ], }, // ORN (reg) new() { - Instructions = new ushort[] { 0xea1b, 0x3fd0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x77034e34, 0xd0727e58, 0x4748dbf2, 0x2becd551, 0x0a650329, 0x005548fa, 0xcfb963c2, 0x9561c965, 0xf157c850, 0x180a1a6c, 0x0252e103, 0x29d0f25a, 0xbd9bbecd, 0xbfd1347c, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0x77034e34, 0xd0727e58, 0x4748dbf2, 0x2becd551, 0x0a650329, 0x005548fa, 0xcfb963c2, 0x9561c965, 0xf157c850, 0x180a1a6c, 0x0252e103, 0x29d0f25a, 0xbd9bbecd, 0xbfd1347c, 0x00000000, 0x300001d0 }, + Instructions = [0xea1b, 0x3fd0, 0x4770, 0xe7fe], + StartRegs = [0x77034e34, 0xd0727e58, 0x4748dbf2, 0x2becd551, 0x0a650329, 0x005548fa, 0xcfb963c2, 0x9561c965, 0xf157c850, 0x180a1a6c, 0x0252e103, 0x29d0f25a, 0xbd9bbecd, 0xbfd1347c, 0x00000000, 0x100001f0 + ], + FinalRegs = [0x77034e34, 0xd0727e58, 0x4748dbf2, 0x2becd551, 0x0a650329, 0x005548fa, 0xcfb963c2, 0x9561c965, 0xf157c850, 0x180a1a6c, 0x0252e103, 0x29d0f25a, 0xbd9bbecd, 0xbfd1347c, 0x00000000, 0x300001d0 + ], }, new() { - Instructions = new ushort[] { 0xea16, 0x4f72, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x71cc7ddf, 0x67d4ce81, 0x60b04501, 0xcc90b805, 0xc5f34081, 0x5e83e9f7, 0xb5a78fa9, 0xc2497a71, 0xb20cdf14, 0x4de9f773, 0xf79525ec, 0x26534abd, 0xcd7b59d1, 0x5cfc9554, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0x71cc7ddf, 0x67d4ce81, 0x60b04501, 0xcc90b805, 0xc5f34081, 0x5e83e9f7, 0xb5a78fa9, 0xc2497a71, 0xb20cdf14, 0x4de9f773, 0xf79525ec, 0x26534abd, 0xcd7b59d1, 0x5cfc9554, 0x00000000, 0x000001d0 }, + Instructions = [0xea16, 0x4f72, 0x4770, 0xe7fe], + StartRegs = [0x71cc7ddf, 0x67d4ce81, 0x60b04501, 0xcc90b805, 0xc5f34081, 0x5e83e9f7, 0xb5a78fa9, 0xc2497a71, 0xb20cdf14, 0x4de9f773, 0xf79525ec, 0x26534abd, 0xcd7b59d1, 0x5cfc9554, 0x00000000, 0x200001f0 + ], + FinalRegs = [0x71cc7ddf, 0x67d4ce81, 0x60b04501, 0xcc90b805, 0xc5f34081, 0x5e83e9f7, 0xb5a78fa9, 0xc2497a71, 0xb20cdf14, 0x4de9f773, 0xf79525ec, 0x26534abd, 0xcd7b59d1, 0x5cfc9554, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1d, 0x4fa7, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x73259d94, 0xc85643db, 0xbf238eb1, 0x51648d99, 0xce2971c9, 0xf9e0e440, 0x90de33c9, 0xcf8ac8e9, 0xda964c21, 0x539eb057, 0x3a681b87, 0x11993d47, 0x05a1358f, 0xa8282529, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x73259d94, 0xc85643db, 0xbf238eb1, 0x51648d99, 0xce2971c9, 0xf9e0e440, 0x90de33c9, 0xcf8ac8e9, 0xda964c21, 0x539eb057, 0x3a681b87, 0x11993d47, 0x05a1358f, 0xa8282529, 0x00000000, 0xb00001d0 }, + Instructions = [0xea1d, 0x4fa7, 0x4770, 0xe7fe], + StartRegs = [0x73259d94, 0xc85643db, 0xbf238eb1, 0x51648d99, 0xce2971c9, 0xf9e0e440, 0x90de33c9, 0xcf8ac8e9, 0xda964c21, 0x539eb057, 0x3a681b87, 0x11993d47, 0x05a1358f, 0xa8282529, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x73259d94, 0xc85643db, 0xbf238eb1, 0x51648d99, 0xce2971c9, 0xf9e0e440, 0x90de33c9, 0xcf8ac8e9, 0xda964c21, 0x539eb057, 0x3a681b87, 0x11993d47, 0x05a1358f, 0xa8282529, 0x00000000, 0xb00001d0 + ], }, new() { - Instructions = new ushort[] { 0xea12, 0x3fdb, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd274d46b, 0x8937836f, 0x33b78178, 0xc250b807, 0xd3323d2f, 0x82e03ba2, 0xf93bf1a6, 0xb31e0c74, 0xc9238070, 0x957331d1, 0xfaadd1ee, 0x073d40fb, 0x05b3e8b4, 0x93e5233b, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0xd274d46b, 0x8937836f, 0x33b78178, 0xc250b807, 0xd3323d2f, 0x82e03ba2, 0xf93bf1a6, 0xb31e0c74, 0xc9238070, 0x957331d1, 0xfaadd1ee, 0x073d40fb, 0x05b3e8b4, 0x93e5233b, 0x00000000, 0x200001d0 }, + Instructions = [0xea12, 0x3fdb, 0x4770, 0xe7fe], + StartRegs = [0xd274d46b, 0x8937836f, 0x33b78178, 0xc250b807, 0xd3323d2f, 0x82e03ba2, 0xf93bf1a6, 0xb31e0c74, 0xc9238070, 0x957331d1, 0xfaadd1ee, 0x073d40fb, 0x05b3e8b4, 0x93e5233b, 0x00000000, 0x600001f0 + ], + FinalRegs = [0xd274d46b, 0x8937836f, 0x33b78178, 0xc250b807, 0xd3323d2f, 0x82e03ba2, 0xf93bf1a6, 0xb31e0c74, 0xc9238070, 0x957331d1, 0xfaadd1ee, 0x073d40fb, 0x05b3e8b4, 0x93e5233b, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea15, 0x5f92, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x24755d61, 0xb65b742d, 0xb46476cf, 0x771a9fcd, 0x465b367f, 0x3daa2a47, 0x6984eeb8, 0x238e3187, 0xa9717261, 0x4592be1d, 0x46d19147, 0x6a6e4dc8, 0x4ddd896f, 0x2f899425, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x24755d61, 0xb65b742d, 0xb46476cf, 0x771a9fcd, 0x465b367f, 0x3daa2a47, 0x6984eeb8, 0x238e3187, 0xa9717261, 0x4592be1d, 0x46d19147, 0x6a6e4dc8, 0x4ddd896f, 0x2f899425, 0x00000000, 0x300001d0 }, + Instructions = [0xea15, 0x5f92, 0x4770, 0xe7fe], + StartRegs = [0x24755d61, 0xb65b742d, 0xb46476cf, 0x771a9fcd, 0x465b367f, 0x3daa2a47, 0x6984eeb8, 0x238e3187, 0xa9717261, 0x4592be1d, 0x46d19147, 0x6a6e4dc8, 0x4ddd896f, 0x2f899425, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x24755d61, 0xb65b742d, 0xb46476cf, 0x771a9fcd, 0x465b367f, 0x3daa2a47, 0x6984eeb8, 0x238e3187, 0xa9717261, 0x4592be1d, 0x46d19147, 0x6a6e4dc8, 0x4ddd896f, 0x2f899425, 0x00000000, 0x300001d0 + ], }, // TEQ (reg) new() { - Instructions = new ushort[] { 0xea1a, 0x2f54, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x36675cac, 0xd9259257, 0x0b8ab9ad, 0xbfef324e, 0xf9623cd6, 0xfc1919ff, 0x616b25f5, 0x2d26a3d3, 0x61eb12c8, 0xbb8d48f0, 0xbfb9c232, 0x10383506, 0x31d10885, 0xf29cb615, 0x00000000, 0x500001f0 }, - FinalRegs = new uint[] { 0x36675cac, 0xd9259257, 0x0b8ab9ad, 0xbfef324e, 0xf9623cd6, 0xfc1919ff, 0x616b25f5, 0x2d26a3d3, 0x61eb12c8, 0xbb8d48f0, 0xbfb9c232, 0x10383506, 0x31d10885, 0xf29cb615, 0x00000000, 0x100001d0 }, + Instructions = [0xea1a, 0x2f54, 0x4770, 0xe7fe], + StartRegs = [0x36675cac, 0xd9259257, 0x0b8ab9ad, 0xbfef324e, 0xf9623cd6, 0xfc1919ff, 0x616b25f5, 0x2d26a3d3, 0x61eb12c8, 0xbb8d48f0, 0xbfb9c232, 0x10383506, 0x31d10885, 0xf29cb615, 0x00000000, 0x500001f0 + ], + FinalRegs = [0x36675cac, 0xd9259257, 0x0b8ab9ad, 0xbfef324e, 0xf9623cd6, 0xfc1919ff, 0x616b25f5, 0x2d26a3d3, 0x61eb12c8, 0xbb8d48f0, 0xbfb9c232, 0x10383506, 0x31d10885, 0xf29cb615, 0x00000000, 0x100001d0 + ], }, new() { - Instructions = new ushort[] { 0xea17, 0x1f43, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xf7dce25d, 0xbe296478, 0xe1aee674, 0x0414c126, 0xa258cf11, 0x5347cc5f, 0x6f8ed2c9, 0xed554dbe, 0xd3073560, 0x627dbd64, 0xca8bb3fc, 0x9590e3a9, 0xe4bea6bc, 0x557934a6, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0xf7dce25d, 0xbe296478, 0xe1aee674, 0x0414c126, 0xa258cf11, 0x5347cc5f, 0x6f8ed2c9, 0xed554dbe, 0xd3073560, 0x627dbd64, 0xca8bb3fc, 0x9590e3a9, 0xe4bea6bc, 0x557934a6, 0x00000000, 0x900001d0 }, + Instructions = [0xea17, 0x1f43, 0x4770, 0xe7fe], + StartRegs = [0xf7dce25d, 0xbe296478, 0xe1aee674, 0x0414c126, 0xa258cf11, 0x5347cc5f, 0x6f8ed2c9, 0xed554dbe, 0xd3073560, 0x627dbd64, 0xca8bb3fc, 0x9590e3a9, 0xe4bea6bc, 0x557934a6, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0xf7dce25d, 0xbe296478, 0xe1aee674, 0x0414c126, 0xa258cf11, 0x5347cc5f, 0x6f8ed2c9, 0xed554dbe, 0xd3073560, 0x627dbd64, 0xca8bb3fc, 0x9590e3a9, 0xe4bea6bc, 0x557934a6, 0x00000000, 0x900001d0 + ], }, new() { - Instructions = new ushort[] { 0xea13, 0x1f5b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x84ad5535, 0xc1f15e65, 0x5ea0078b, 0x79df457d, 0x1c735fe5, 0x06dcfd95, 0x6db96dae, 0x572f572d, 0xac88a919, 0x56d850a6, 0xd5ce3a30, 0x2be992e8, 0x497a47ce, 0x38a74019, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0x84ad5535, 0xc1f15e65, 0x5ea0078b, 0x79df457d, 0x1c735fe5, 0x06dcfd95, 0x6db96dae, 0x572f572d, 0xac88a919, 0x56d850a6, 0xd5ce3a30, 0x2be992e8, 0x497a47ce, 0x38a74019, 0x00000000, 0x000001d0 }, + Instructions = [0xea13, 0x1f5b, 0x4770, 0xe7fe], + StartRegs = [0x84ad5535, 0xc1f15e65, 0x5ea0078b, 0x79df457d, 0x1c735fe5, 0x06dcfd95, 0x6db96dae, 0x572f572d, 0xac88a919, 0x56d850a6, 0xd5ce3a30, 0x2be992e8, 0x497a47ce, 0x38a74019, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0x84ad5535, 0xc1f15e65, 0x5ea0078b, 0x79df457d, 0x1c735fe5, 0x06dcfd95, 0x6db96dae, 0x572f572d, 0xac88a919, 0x56d850a6, 0xd5ce3a30, 0x2be992e8, 0x497a47ce, 0x38a74019, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea16, 0x3ff3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xa85ea277, 0x6028643d, 0xa5a85f15, 0x47f0f2a5, 0x9b6eebdb, 0x9f064bc7, 0xab59939f, 0x1a278260, 0xb9f91cfa, 0xf913c49c, 0x2b5c0052, 0x1bf2d6dc, 0x81da80a4, 0xced90006, 0x00000000, 0x000001f0 }, - FinalRegs = new uint[] { 0xa85ea277, 0x6028643d, 0xa5a85f15, 0x47f0f2a5, 0x9b6eebdb, 0x9f064bc7, 0xab59939f, 0x1a278260, 0xb9f91cfa, 0xf913c49c, 0x2b5c0052, 0x1bf2d6dc, 0x81da80a4, 0xced90006, 0x00000000, 0xa00001d0 }, + Instructions = [0xea16, 0x3ff3, 0x4770, 0xe7fe], + StartRegs = [0xa85ea277, 0x6028643d, 0xa5a85f15, 0x47f0f2a5, 0x9b6eebdb, 0x9f064bc7, 0xab59939f, 0x1a278260, 0xb9f91cfa, 0xf913c49c, 0x2b5c0052, 0x1bf2d6dc, 0x81da80a4, 0xced90006, 0x00000000, 0x000001f0 + ], + FinalRegs = [0xa85ea277, 0x6028643d, 0xa5a85f15, 0x47f0f2a5, 0x9b6eebdb, 0x9f064bc7, 0xab59939f, 0x1a278260, 0xb9f91cfa, 0xf913c49c, 0x2b5c0052, 0x1bf2d6dc, 0x81da80a4, 0xced90006, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x3f09, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xdf494128, 0xbc975c16, 0x62c66823, 0x95be3737, 0xa07e8778, 0x6ce80cc7, 0xfea03385, 0x4c5bf35a, 0x5cd0bcdf, 0xc47451ab, 0x3849af70, 0x1329c14a, 0xb1f96f79, 0x321eaf12, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0xdf494128, 0xbc975c16, 0x62c66823, 0x95be3737, 0xa07e8778, 0x6ce80cc7, 0xfea03385, 0x4c5bf35a, 0x5cd0bcdf, 0xc47451ab, 0x3849af70, 0x1329c14a, 0xb1f96f79, 0x321eaf12, 0x00000000, 0x300001d0 }, + Instructions = [0xea14, 0x3f09, 0x4770, 0xe7fe], + StartRegs = [0xdf494128, 0xbc975c16, 0x62c66823, 0x95be3737, 0xa07e8778, 0x6ce80cc7, 0xfea03385, 0x4c5bf35a, 0x5cd0bcdf, 0xc47451ab, 0x3849af70, 0x1329c14a, 0xb1f96f79, 0x321eaf12, 0x00000000, 0x700001f0 + ], + FinalRegs = [0xdf494128, 0xbc975c16, 0x62c66823, 0x95be3737, 0xa07e8778, 0x6ce80cc7, 0xfea03385, 0x4c5bf35a, 0x5cd0bcdf, 0xc47451ab, 0x3849af70, 0x1329c14a, 0xb1f96f79, 0x321eaf12, 0x00000000, 0x300001d0 + ], }, // EOR (reg) new() { - Instructions = new ushort[] { 0xea17, 0x6fc0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x9c803ce5, 0x38e325f9, 0x4d32aea8, 0x0120f77b, 0x8e34b507, 0xee41aabf, 0x7e6d8a0c, 0x761a3f21, 0x99b57f1d, 0x32a4bbf3, 0x9902c1f4, 0xd5e2dd41, 0xe2a08209, 0x2896ceba, 0x00000000, 0xc00001f0 }, - FinalRegs = new uint[] { 0x9c803ce5, 0x38e325f9, 0x4d32aea8, 0x0120f77b, 0x8e34b507, 0xee41aabf, 0x7e6d8a0c, 0x761a3f21, 0x99b57f1d, 0x32a4bbf3, 0x9902c1f4, 0xd5e2dd41, 0xe2a08209, 0x2896ceba, 0x00000000, 0x200001d0 }, + Instructions = [0xea17, 0x6fc0, 0x4770, 0xe7fe], + StartRegs = [0x9c803ce5, 0x38e325f9, 0x4d32aea8, 0x0120f77b, 0x8e34b507, 0xee41aabf, 0x7e6d8a0c, 0x761a3f21, 0x99b57f1d, 0x32a4bbf3, 0x9902c1f4, 0xd5e2dd41, 0xe2a08209, 0x2896ceba, 0x00000000, 0xc00001f0 + ], + FinalRegs = [0x9c803ce5, 0x38e325f9, 0x4d32aea8, 0x0120f77b, 0x8e34b507, 0xee41aabf, 0x7e6d8a0c, 0x761a3f21, 0x99b57f1d, 0x32a4bbf3, 0x9902c1f4, 0xd5e2dd41, 0xe2a08209, 0x2896ceba, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1c, 0x4f58, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xe9c3e9b7, 0x26c9e052, 0x708b6153, 0x72dbdc3c, 0xdd3e922d, 0xd0260aca, 0x38dcf6be, 0x4164575f, 0x5d8e03dc, 0x30bfa694, 0xe72a6609, 0xba632c43, 0x1f768178, 0x6b4f56a6, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0xe9c3e9b7, 0x26c9e052, 0x708b6153, 0x72dbdc3c, 0xdd3e922d, 0xd0260aca, 0x38dcf6be, 0x4164575f, 0x5d8e03dc, 0x30bfa694, 0xe72a6609, 0xba632c43, 0x1f768178, 0x6b4f56a6, 0x00000000, 0x000001d0 }, + Instructions = [0xea1c, 0x4f58, 0x4770, 0xe7fe], + StartRegs = [0xe9c3e9b7, 0x26c9e052, 0x708b6153, 0x72dbdc3c, 0xdd3e922d, 0xd0260aca, 0x38dcf6be, 0x4164575f, 0x5d8e03dc, 0x30bfa694, 0xe72a6609, 0xba632c43, 0x1f768178, 0x6b4f56a6, 0x00000000, 0x600001f0 + ], + FinalRegs = [0xe9c3e9b7, 0x26c9e052, 0x708b6153, 0x72dbdc3c, 0xdd3e922d, 0xd0260aca, 0x38dcf6be, 0x4164575f, 0x5d8e03dc, 0x30bfa694, 0xe72a6609, 0xba632c43, 0x1f768178, 0x6b4f56a6, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea16, 0x7f31, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x9205c1f5, 0x80dd7e44, 0x8ecd5272, 0x3d8d3691, 0x35d45cca, 0x4b2d9eb3, 0xa1652285, 0x6a1cb7f1, 0x8e08b99f, 0xdf8f0c57, 0x28dd0dfa, 0xf2c0abbd, 0x167a6539, 0x75163a9d, 0x00000000, 0xa00001f0 }, - FinalRegs = new uint[] { 0x9205c1f5, 0x80dd7e44, 0x8ecd5272, 0x3d8d3691, 0x35d45cca, 0x4b2d9eb3, 0xa1652285, 0x6a1cb7f1, 0x8e08b99f, 0xdf8f0c57, 0x28dd0dfa, 0xf2c0abbd, 0x167a6539, 0x75163a9d, 0x00000000, 0x000001d0 }, + Instructions = [0xea16, 0x7f31, 0x4770, 0xe7fe], + StartRegs = [0x9205c1f5, 0x80dd7e44, 0x8ecd5272, 0x3d8d3691, 0x35d45cca, 0x4b2d9eb3, 0xa1652285, 0x6a1cb7f1, 0x8e08b99f, 0xdf8f0c57, 0x28dd0dfa, 0xf2c0abbd, 0x167a6539, 0x75163a9d, 0x00000000, 0xa00001f0 + ], + FinalRegs = [0x9205c1f5, 0x80dd7e44, 0x8ecd5272, 0x3d8d3691, 0x35d45cca, 0x4b2d9eb3, 0xa1652285, 0x6a1cb7f1, 0x8e08b99f, 0xdf8f0c57, 0x28dd0dfa, 0xf2c0abbd, 0x167a6539, 0x75163a9d, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x4f80, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x96547d6c, 0x7afda83c, 0xb3edea2d, 0x49d05904, 0xb661ef76, 0xf1cce5ff, 0x2986ab1b, 0xcb39b044, 0x88937ad3, 0x962cf736, 0x80d6f109, 0xb73dd0d6, 0xb93f9f60, 0xb93a02c9, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x96547d6c, 0x7afda83c, 0xb3edea2d, 0x49d05904, 0xb661ef76, 0xf1cce5ff, 0x2986ab1b, 0xcb39b044, 0x88937ad3, 0x962cf736, 0x80d6f109, 0xb73dd0d6, 0xb93f9f60, 0xb93a02c9, 0x00000000, 0xb00001d0 }, + Instructions = [0xea14, 0x4f80, 0x4770, 0xe7fe], + StartRegs = [0x96547d6c, 0x7afda83c, 0xb3edea2d, 0x49d05904, 0xb661ef76, 0xf1cce5ff, 0x2986ab1b, 0xcb39b044, 0x88937ad3, 0x962cf736, 0x80d6f109, 0xb73dd0d6, 0xb93f9f60, 0xb93a02c9, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x96547d6c, 0x7afda83c, 0xb3edea2d, 0x49d05904, 0xb661ef76, 0xf1cce5ff, 0x2986ab1b, 0xcb39b044, 0x88937ad3, 0x962cf736, 0x80d6f109, 0xb73dd0d6, 0xb93f9f60, 0xb93a02c9, 0x00000000, 0xb00001d0 + ], }, new() { - Instructions = new ushort[] { 0xea12, 0x1f35, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xb1a94a51, 0xa8679784, 0xd7558ceb, 0x58d63d95, 0x6e5cf7eb, 0x0d40398d, 0xf88fa339, 0xbe88a56f, 0x7180f980, 0x0795ba21, 0x0732b252, 0xa51be7c8, 0x47c02749, 0xb0fbbd9f, 0x00000000, 0x800001f0 }, - FinalRegs = new uint[] { 0xb1a94a51, 0xa8679784, 0xd7558ceb, 0x58d63d95, 0x6e5cf7eb, 0x0d40398d, 0xf88fa339, 0xbe88a56f, 0x7180f980, 0x0795ba21, 0x0732b252, 0xa51be7c8, 0x47c02749, 0xb0fbbd9f, 0x00000000, 0xa00001d0 }, + Instructions = [0xea12, 0x1f35, 0x4770, 0xe7fe], + StartRegs = [0xb1a94a51, 0xa8679784, 0xd7558ceb, 0x58d63d95, 0x6e5cf7eb, 0x0d40398d, 0xf88fa339, 0xbe88a56f, 0x7180f980, 0x0795ba21, 0x0732b252, 0xa51be7c8, 0x47c02749, 0xb0fbbd9f, 0x00000000, 0x800001f0 + ], + FinalRegs = [0xb1a94a51, 0xa8679784, 0xd7558ceb, 0x58d63d95, 0x6e5cf7eb, 0x0d40398d, 0xf88fa339, 0xbe88a56f, 0x7180f980, 0x0795ba21, 0x0732b252, 0xa51be7c8, 0x47c02749, 0xb0fbbd9f, 0x00000000, 0xa00001d0 + ], }, // CMN (reg) new() { - Instructions = new ushort[] { 0xea1a, 0x4fc5, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xf4440521, 0x26b151d9, 0x90053d26, 0x8c3bbde1, 0x4a757fa1, 0x34b63513, 0xd1d1a182, 0xa9123bc1, 0xadfbf652, 0xec28d3e6, 0x6ca54af1, 0x385d5637, 0x46280bac, 0x18f38d39, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0xf4440521, 0x26b151d9, 0x90053d26, 0x8c3bbde1, 0x4a757fa1, 0x34b63513, 0xd1d1a182, 0xa9123bc1, 0xadfbf652, 0xec28d3e6, 0x6ca54af1, 0x385d5637, 0x46280bac, 0x18f38d39, 0x00000000, 0x200001d0 }, + Instructions = [0xea1a, 0x4fc5, 0x4770, 0xe7fe], + StartRegs = [0xf4440521, 0x26b151d9, 0x90053d26, 0x8c3bbde1, 0x4a757fa1, 0x34b63513, 0xd1d1a182, 0xa9123bc1, 0xadfbf652, 0xec28d3e6, 0x6ca54af1, 0x385d5637, 0x46280bac, 0x18f38d39, 0x00000000, 0x400001f0 + ], + FinalRegs = [0xf4440521, 0x26b151d9, 0x90053d26, 0x8c3bbde1, 0x4a757fa1, 0x34b63513, 0xd1d1a182, 0xa9123bc1, 0xadfbf652, 0xec28d3e6, 0x6ca54af1, 0x385d5637, 0x46280bac, 0x18f38d39, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x4fe4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x20abeba4, 0x77f9bd90, 0x5c09b098, 0xdebadd51, 0x6e114dcf, 0xd8212cf8, 0x2a6a57d2, 0xb9667ed8, 0x93817fef, 0x639cd8b4, 0x52b67bce, 0x681ee61c, 0x50bb5414, 0x9f297765, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0x20abeba4, 0x77f9bd90, 0x5c09b098, 0xdebadd51, 0x6e114dcf, 0xd8212cf8, 0x2a6a57d2, 0xb9667ed8, 0x93817fef, 0x639cd8b4, 0x52b67bce, 0x681ee61c, 0x50bb5414, 0x9f297765, 0x00000000, 0x000001d0 }, + Instructions = [0xea14, 0x4fe4, 0x4770, 0xe7fe], + StartRegs = [0x20abeba4, 0x77f9bd90, 0x5c09b098, 0xdebadd51, 0x6e114dcf, 0xd8212cf8, 0x2a6a57d2, 0xb9667ed8, 0x93817fef, 0x639cd8b4, 0x52b67bce, 0x681ee61c, 0x50bb5414, 0x9f297765, 0x00000000, 0x200001f0 + ], + FinalRegs = [0x20abeba4, 0x77f9bd90, 0x5c09b098, 0xdebadd51, 0x6e114dcf, 0xd8212cf8, 0x2a6a57d2, 0xb9667ed8, 0x93817fef, 0x639cd8b4, 0x52b67bce, 0x681ee61c, 0x50bb5414, 0x9f297765, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1d, 0x6f51, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x12b54404, 0x9ad5df58, 0x8a73af2a, 0xd89dd454, 0x57f5a14b, 0xcee0a06f, 0xb53e67ca, 0x92730368, 0xab12a843, 0x929ae15d, 0xea1e4f49, 0xd7fadfbc, 0x9defdd99, 0xff22c9c8, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0x12b54404, 0x9ad5df58, 0x8a73af2a, 0xd89dd454, 0x57f5a14b, 0xcee0a06f, 0xb53e67ca, 0x92730368, 0xab12a843, 0x929ae15d, 0xea1e4f49, 0xd7fadfbc, 0x9defdd99, 0xff22c9c8, 0x00000000, 0x000001d0 }, + Instructions = [0xea1d, 0x6f51, 0x4770, 0xe7fe], + StartRegs = [0x12b54404, 0x9ad5df58, 0x8a73af2a, 0xd89dd454, 0x57f5a14b, 0xcee0a06f, 0xb53e67ca, 0x92730368, 0xab12a843, 0x929ae15d, 0xea1e4f49, 0xd7fadfbc, 0x9defdd99, 0xff22c9c8, 0x00000000, 0x600001f0 + ], + FinalRegs = [0x12b54404, 0x9ad5df58, 0x8a73af2a, 0xd89dd454, 0x57f5a14b, 0xcee0a06f, 0xb53e67ca, 0x92730368, 0xab12a843, 0x929ae15d, 0xea1e4f49, 0xd7fadfbc, 0x9defdd99, 0xff22c9c8, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea15, 0x5f77, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x64dfdc90, 0xd570bc25, 0xae804ff7, 0x491ad040, 0xfe5f6d58, 0x850c1223, 0x39afac7b, 0xcc5a165a, 0x956a9473, 0x89d3941f, 0x6e520e57, 0x804dca75, 0xbd40cde8, 0xff68c0e7, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0x64dfdc90, 0xd570bc25, 0xae804ff7, 0x491ad040, 0xfe5f6d58, 0x850c1223, 0x39afac7b, 0xcc5a165a, 0x956a9473, 0x89d3941f, 0x6e520e57, 0x804dca75, 0xbd40cde8, 0xff68c0e7, 0x00000000, 0xb00001d0 }, + Instructions = [0xea15, 0x5f77, 0x4770, 0xe7fe], + StartRegs = [0x64dfdc90, 0xd570bc25, 0xae804ff7, 0x491ad040, 0xfe5f6d58, 0x850c1223, 0x39afac7b, 0xcc5a165a, 0x956a9473, 0x89d3941f, 0x6e520e57, 0x804dca75, 0xbd40cde8, 0xff68c0e7, 0x00000000, 0x700001f0 + ], + FinalRegs = [0x64dfdc90, 0xd570bc25, 0xae804ff7, 0x491ad040, 0xfe5f6d58, 0x850c1223, 0x39afac7b, 0xcc5a165a, 0x956a9473, 0x89d3941f, 0x6e520e57, 0x804dca75, 0xbd40cde8, 0xff68c0e7, 0x00000000, 0xb00001d0 + ], }, // ADD (reg) new() { - Instructions = new ushort[] { 0xea1c, 0x4f0b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x8a81d956, 0x65b2b25b, 0x34dd981e, 0x924542f4, 0xeed4b95a, 0x096d832c, 0x8ddcb715, 0x2df1897b, 0x696d0d5c, 0xfa6853c1, 0xcbb52912, 0xe37a3fda, 0x54dd595d, 0x652e5a2b, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0x8a81d956, 0x65b2b25b, 0x34dd981e, 0x924542f4, 0xeed4b95a, 0x096d832c, 0x8ddcb715, 0x2df1897b, 0x696d0d5c, 0xfa6853c1, 0xcbb52912, 0xe37a3fda, 0x54dd595d, 0x652e5a2b, 0x00000000, 0x000001d0 }, + Instructions = [0xea1c, 0x4f0b, 0x4770, 0xe7fe], + StartRegs = [0x8a81d956, 0x65b2b25b, 0x34dd981e, 0x924542f4, 0xeed4b95a, 0x096d832c, 0x8ddcb715, 0x2df1897b, 0x696d0d5c, 0xfa6853c1, 0xcbb52912, 0xe37a3fda, 0x54dd595d, 0x652e5a2b, 0x00000000, 0x600001f0 + ], + FinalRegs = [0x8a81d956, 0x65b2b25b, 0x34dd981e, 0x924542f4, 0xeed4b95a, 0x096d832c, 0x8ddcb715, 0x2df1897b, 0x696d0d5c, 0xfa6853c1, 0xcbb52912, 0xe37a3fda, 0x54dd595d, 0x652e5a2b, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea12, 0x6faa, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x4b774bbf, 0xe1f3168c, 0xfcdf56d4, 0x0a9feca9, 0x8d832cd1, 0x27af5bb2, 0xe7123c8f, 0x5ae971a8, 0x7c86287f, 0x5e69f0a7, 0x43e672d3, 0xb552a0f4, 0xb8b4fc17, 0xa9cc9a9d, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x4b774bbf, 0xe1f3168c, 0xfcdf56d4, 0x0a9feca9, 0x8d832cd1, 0x27af5bb2, 0xe7123c8f, 0x5ae971a8, 0x7c86287f, 0x5e69f0a7, 0x43e672d3, 0xb552a0f4, 0xb8b4fc17, 0xa9cc9a9d, 0x00000000, 0x200001d0 }, + Instructions = [0xea12, 0x6faa, 0x4770, 0xe7fe], + StartRegs = [0x4b774bbf, 0xe1f3168c, 0xfcdf56d4, 0x0a9feca9, 0x8d832cd1, 0x27af5bb2, 0xe7123c8f, 0x5ae971a8, 0x7c86287f, 0x5e69f0a7, 0x43e672d3, 0xb552a0f4, 0xb8b4fc17, 0xa9cc9a9d, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x4b774bbf, 0xe1f3168c, 0xfcdf56d4, 0x0a9feca9, 0x8d832cd1, 0x27af5bb2, 0xe7123c8f, 0x5ae971a8, 0x7c86287f, 0x5e69f0a7, 0x43e672d3, 0xb552a0f4, 0xb8b4fc17, 0xa9cc9a9d, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea18, 0x2f2c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x907613be, 0x807d314f, 0x10328bb5, 0xf3433f78, 0x0fa6c190, 0x473e8ac5, 0x0019b12e, 0xa24d7590, 0x0fdac8d5, 0x24e4feea, 0xf5eadcbf, 0xdfd73f71, 0xee2c8957, 0xaef12e15, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0x907613be, 0x807d314f, 0x10328bb5, 0xf3433f78, 0x0fa6c190, 0x473e8ac5, 0x0019b12e, 0xa24d7590, 0x0fdac8d5, 0x24e4feea, 0xf5eadcbf, 0xdfd73f71, 0xee2c8957, 0xaef12e15, 0x00000000, 0x100001d0 }, + Instructions = [0xea18, 0x2f2c, 0x4770, 0xe7fe], + StartRegs = [0x907613be, 0x807d314f, 0x10328bb5, 0xf3433f78, 0x0fa6c190, 0x473e8ac5, 0x0019b12e, 0xa24d7590, 0x0fdac8d5, 0x24e4feea, 0xf5eadcbf, 0xdfd73f71, 0xee2c8957, 0xaef12e15, 0x00000000, 0x100001f0 + ], + FinalRegs = [0x907613be, 0x807d314f, 0x10328bb5, 0xf3433f78, 0x0fa6c190, 0x473e8ac5, 0x0019b12e, 0xa24d7590, 0x0fdac8d5, 0x24e4feea, 0xf5eadcbf, 0xdfd73f71, 0xee2c8957, 0xaef12e15, 0x00000000, 0x100001d0 + ], }, new() { - Instructions = new ushort[] { 0xea16, 0x3f00, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x2f9a7f7c, 0xc6ad7d01, 0x12b220a4, 0x57b4e83c, 0x2132b566, 0xb4afd045, 0x2b5d39bf, 0xceeecd89, 0x724bff21, 0xb527620e, 0xa9fba943, 0xd2d70658, 0x4e69f57b, 0x55df6b8f, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x2f9a7f7c, 0xc6ad7d01, 0x12b220a4, 0x57b4e83c, 0x2132b566, 0xb4afd045, 0x2b5d39bf, 0xceeecd89, 0x724bff21, 0xb527620e, 0xa9fba943, 0xd2d70658, 0x4e69f57b, 0x55df6b8f, 0x00000000, 0x300001d0 }, + Instructions = [0xea16, 0x3f00, 0x4770, 0xe7fe], + StartRegs = [0x2f9a7f7c, 0xc6ad7d01, 0x12b220a4, 0x57b4e83c, 0x2132b566, 0xb4afd045, 0x2b5d39bf, 0xceeecd89, 0x724bff21, 0xb527620e, 0xa9fba943, 0xd2d70658, 0x4e69f57b, 0x55df6b8f, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x2f9a7f7c, 0xc6ad7d01, 0x12b220a4, 0x57b4e83c, 0x2132b566, 0xb4afd045, 0x2b5d39bf, 0xceeecd89, 0x724bff21, 0xb527620e, 0xa9fba943, 0xd2d70658, 0x4e69f57b, 0x55df6b8f, 0x00000000, 0x300001d0 + ], }, new() { - Instructions = new ushort[] { 0xea16, 0x2fdb, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x854d0c91, 0x895ded29, 0x3e81cd89, 0x9ed269cf, 0x8a7354fa, 0x95cfe79f, 0x07248663, 0x3ec81b86, 0x6f1086e0, 0x51b4c91c, 0xb2d0946b, 0x1b81a616, 0x2b03fe57, 0xfbde03fd, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0x854d0c91, 0x895ded29, 0x3e81cd89, 0x9ed269cf, 0x8a7354fa, 0x95cfe79f, 0x07248663, 0x3ec81b86, 0x6f1086e0, 0x51b4c91c, 0xb2d0946b, 0x1b81a616, 0x2b03fe57, 0xfbde03fd, 0x00000000, 0x300001d0 }, + Instructions = [0xea16, 0x2fdb, 0x4770, 0xe7fe], + StartRegs = [0x854d0c91, 0x895ded29, 0x3e81cd89, 0x9ed269cf, 0x8a7354fa, 0x95cfe79f, 0x07248663, 0x3ec81b86, 0x6f1086e0, 0x51b4c91c, 0xb2d0946b, 0x1b81a616, 0x2b03fe57, 0xfbde03fd, 0x00000000, 0x700001f0 + ], + FinalRegs = [0x854d0c91, 0x895ded29, 0x3e81cd89, 0x9ed269cf, 0x8a7354fa, 0x95cfe79f, 0x07248663, 0x3ec81b86, 0x6f1086e0, 0x51b4c91c, 0xb2d0946b, 0x1b81a616, 0x2b03fe57, 0xfbde03fd, 0x00000000, 0x300001d0 + ], }, // ADC (reg) new() { - Instructions = new ushort[] { 0xea1a, 0x3fe4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x4333cbde, 0xb61e8731, 0x2121c6ec, 0x796ecc75, 0xb570472d, 0x203aa9ea, 0xdad7bf7e, 0x93654919, 0x9e4c4e08, 0x1e352004, 0x104a06d7, 0x6b9a4b8a, 0xa0bcd372, 0x1713789a, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x4333cbde, 0xb61e8731, 0x2121c6ec, 0x796ecc75, 0xb570472d, 0x203aa9ea, 0xdad7bf7e, 0x93654919, 0x9e4c4e08, 0x1e352004, 0x104a06d7, 0x6b9a4b8a, 0xa0bcd372, 0x1713789a, 0x00000000, 0x300001d0 }, + Instructions = [0xea1a, 0x3fe4, 0x4770, 0xe7fe], + StartRegs = [0x4333cbde, 0xb61e8731, 0x2121c6ec, 0x796ecc75, 0xb570472d, 0x203aa9ea, 0xdad7bf7e, 0x93654919, 0x9e4c4e08, 0x1e352004, 0x104a06d7, 0x6b9a4b8a, 0xa0bcd372, 0x1713789a, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x4333cbde, 0xb61e8731, 0x2121c6ec, 0x796ecc75, 0xb570472d, 0x203aa9ea, 0xdad7bf7e, 0x93654919, 0x9e4c4e08, 0x1e352004, 0x104a06d7, 0x6b9a4b8a, 0xa0bcd372, 0x1713789a, 0x00000000, 0x300001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1b, 0x3f40, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xad935c4c, 0x4c7dcbfc, 0x802965ca, 0x1dccd2e8, 0xe960e9e1, 0x3bff0055, 0x204f6a43, 0xe31b010d, 0x33c8f3c5, 0x8e27b912, 0x1351e4a6, 0x90195167, 0xd9112661, 0xee319b51, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0xad935c4c, 0x4c7dcbfc, 0x802965ca, 0x1dccd2e8, 0xe960e9e1, 0x3bff0055, 0x204f6a43, 0xe31b010d, 0x33c8f3c5, 0x8e27b912, 0x1351e4a6, 0x90195167, 0xd9112661, 0xee319b51, 0x00000000, 0x000001d0 }, + Instructions = [0xea1b, 0x3f40, 0x4770, 0xe7fe], + StartRegs = [0xad935c4c, 0x4c7dcbfc, 0x802965ca, 0x1dccd2e8, 0xe960e9e1, 0x3bff0055, 0x204f6a43, 0xe31b010d, 0x33c8f3c5, 0x8e27b912, 0x1351e4a6, 0x90195167, 0xd9112661, 0xee319b51, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0xad935c4c, 0x4c7dcbfc, 0x802965ca, 0x1dccd2e8, 0xe960e9e1, 0x3bff0055, 0x204f6a43, 0xe31b010d, 0x33c8f3c5, 0x8e27b912, 0x1351e4a6, 0x90195167, 0xd9112661, 0xee319b51, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea15, 0x3fe8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x26deb79f, 0x01ac9258, 0x5982ae34, 0x2c3c6df6, 0xabf6a749, 0x319d4b48, 0xce8cca6d, 0xe4b70851, 0x135c049c, 0xd8839d5e, 0xd3171a30, 0xfb09e096, 0x06d67a32, 0x0bab9825, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0x26deb79f, 0x01ac9258, 0x5982ae34, 0x2c3c6df6, 0xabf6a749, 0x319d4b48, 0xce8cca6d, 0xe4b70851, 0x135c049c, 0xd8839d5e, 0xd3171a30, 0xfb09e096, 0x06d67a32, 0x0bab9825, 0x00000000, 0x100001d0 }, + Instructions = [0xea15, 0x3fe8, 0x4770, 0xe7fe], + StartRegs = [0x26deb79f, 0x01ac9258, 0x5982ae34, 0x2c3c6df6, 0xabf6a749, 0x319d4b48, 0xce8cca6d, 0xe4b70851, 0x135c049c, 0xd8839d5e, 0xd3171a30, 0xfb09e096, 0x06d67a32, 0x0bab9825, 0x00000000, 0x100001f0 + ], + FinalRegs = [0x26deb79f, 0x01ac9258, 0x5982ae34, 0x2c3c6df6, 0xabf6a749, 0x319d4b48, 0xce8cca6d, 0xe4b70851, 0x135c049c, 0xd8839d5e, 0xd3171a30, 0xfb09e096, 0x06d67a32, 0x0bab9825, 0x00000000, 0x100001d0 + ], }, new() { - Instructions = new ushort[] { 0xea12, 0x2fec, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd2c9ebca, 0x3ace22dc, 0x41603f45, 0x8cc7e2c2, 0xa160b815, 0xac1e7eb8, 0x57c49232, 0x62547a9b, 0xa18407fd, 0x5c549424, 0xf3eec0e1, 0x4185299f, 0x329a9063, 0x649d9b44, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0xd2c9ebca, 0x3ace22dc, 0x41603f45, 0x8cc7e2c2, 0xa160b815, 0xac1e7eb8, 0x57c49232, 0x62547a9b, 0xa18407fd, 0x5c549424, 0xf3eec0e1, 0x4185299f, 0x329a9063, 0x649d9b44, 0x00000000, 0x100001d0 }, + Instructions = [0xea12, 0x2fec, 0x4770, 0xe7fe], + StartRegs = [0xd2c9ebca, 0x3ace22dc, 0x41603f45, 0x8cc7e2c2, 0xa160b815, 0xac1e7eb8, 0x57c49232, 0x62547a9b, 0xa18407fd, 0x5c549424, 0xf3eec0e1, 0x4185299f, 0x329a9063, 0x649d9b44, 0x00000000, 0x900001f0 + ], + FinalRegs = [0xd2c9ebca, 0x3ace22dc, 0x41603f45, 0x8cc7e2c2, 0xa160b815, 0xac1e7eb8, 0x57c49232, 0x62547a9b, 0xa18407fd, 0x5c549424, 0xf3eec0e1, 0x4185299f, 0x329a9063, 0x649d9b44, 0x00000000, 0x100001d0 + ], }, new() { - Instructions = new ushort[] { 0xea15, 0x2f73, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xf3f8be7b, 0x05e02ec4, 0x78bd9fce, 0x6fb329c8, 0x3094f103, 0x7c93c61d, 0xaade3d9f, 0x381bf77c, 0x738389cd, 0xc68dc0e2, 0x60a06e86, 0x9b717afd, 0x9e51e4eb, 0xf7966699, 0x00000000, 0x500001f0 }, - FinalRegs = new uint[] { 0xf3f8be7b, 0x05e02ec4, 0x78bd9fce, 0x6fb329c8, 0x3094f103, 0x7c93c61d, 0xaade3d9f, 0x381bf77c, 0x738389cd, 0xc68dc0e2, 0x60a06e86, 0x9b717afd, 0x9e51e4eb, 0xf7966699, 0x00000000, 0x300001d0 }, + Instructions = [0xea15, 0x2f73, 0x4770, 0xe7fe], + StartRegs = [0xf3f8be7b, 0x05e02ec4, 0x78bd9fce, 0x6fb329c8, 0x3094f103, 0x7c93c61d, 0xaade3d9f, 0x381bf77c, 0x738389cd, 0xc68dc0e2, 0x60a06e86, 0x9b717afd, 0x9e51e4eb, 0xf7966699, 0x00000000, 0x500001f0 + ], + FinalRegs = [0xf3f8be7b, 0x05e02ec4, 0x78bd9fce, 0x6fb329c8, 0x3094f103, 0x7c93c61d, 0xaade3d9f, 0x381bf77c, 0x738389cd, 0xc68dc0e2, 0x60a06e86, 0x9b717afd, 0x9e51e4eb, 0xf7966699, 0x00000000, 0x300001d0 + ], }, // SBC (reg) new() { - Instructions = new ushort[] { 0xea1d, 0x3faa, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd839dfb1, 0x7cc5425c, 0xc55b5255, 0x37b845aa, 0x59f892d4, 0x7ef8e6ec, 0x3491a7fb, 0x87b88546, 0x72b4c444, 0x24cf48d7, 0x7f530fb7, 0x5b243902, 0x6c39c38f, 0x10e3165c, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0xd839dfb1, 0x7cc5425c, 0xc55b5255, 0x37b845aa, 0x59f892d4, 0x7ef8e6ec, 0x3491a7fb, 0x87b88546, 0x72b4c444, 0x24cf48d7, 0x7f530fb7, 0x5b243902, 0x6c39c38f, 0x10e3165c, 0x00000000, 0x000001d0 }, + Instructions = [0xea1d, 0x3faa, 0x4770, 0xe7fe], + StartRegs = [0xd839dfb1, 0x7cc5425c, 0xc55b5255, 0x37b845aa, 0x59f892d4, 0x7ef8e6ec, 0x3491a7fb, 0x87b88546, 0x72b4c444, 0x24cf48d7, 0x7f530fb7, 0x5b243902, 0x6c39c38f, 0x10e3165c, 0x00000000, 0x200001f0 + ], + FinalRegs = [0xd839dfb1, 0x7cc5425c, 0xc55b5255, 0x37b845aa, 0x59f892d4, 0x7ef8e6ec, 0x3491a7fb, 0x87b88546, 0x72b4c444, 0x24cf48d7, 0x7f530fb7, 0x5b243902, 0x6c39c38f, 0x10e3165c, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea12, 0x1f7d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xcd24aba8, 0x1d7d0523, 0xc150da45, 0x2f7eb96b, 0x9c1ed9af, 0x75056b89, 0x91c818d1, 0x8a07d574, 0x67ff1d4a, 0x6aca4429, 0xc4b5fb7c, 0x21e9ca50, 0xb95cbd15, 0xce3752e7, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0xcd24aba8, 0x1d7d0523, 0xc150da45, 0x2f7eb96b, 0x9c1ed9af, 0x75056b89, 0x91c818d1, 0x8a07d574, 0x67ff1d4a, 0x6aca4429, 0xc4b5fb7c, 0x21e9ca50, 0xb95cbd15, 0xce3752e7, 0x00000000, 0x100001d0 }, + Instructions = [0xea12, 0x1f7d, 0x4770, 0xe7fe], + StartRegs = [0xcd24aba8, 0x1d7d0523, 0xc150da45, 0x2f7eb96b, 0x9c1ed9af, 0x75056b89, 0x91c818d1, 0x8a07d574, 0x67ff1d4a, 0x6aca4429, 0xc4b5fb7c, 0x21e9ca50, 0xb95cbd15, 0xce3752e7, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0xcd24aba8, 0x1d7d0523, 0xc150da45, 0x2f7eb96b, 0x9c1ed9af, 0x75056b89, 0x91c818d1, 0x8a07d574, 0x67ff1d4a, 0x6aca4429, 0xc4b5fb7c, 0x21e9ca50, 0xb95cbd15, 0xce3752e7, 0x00000000, 0x100001d0 + ], }, new() { - Instructions = new ushort[] { 0xea10, 0x2fc2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x401285a0, 0x7ab1e348, 0xf48a2615, 0x46d49913, 0xff5e9911, 0x4b4d7920, 0x8e1f921e, 0x05075455, 0x24e4acea, 0x8652e355, 0x11d0fe46, 0x0cfe7c08, 0xf326adee, 0x7fcde7ac, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0x401285a0, 0x7ab1e348, 0xf48a2615, 0x46d49913, 0xff5e9911, 0x4b4d7920, 0x8e1f921e, 0x05075455, 0x24e4acea, 0x8652e355, 0x11d0fe46, 0x0cfe7c08, 0xf326adee, 0x7fcde7ac, 0x00000000, 0x000001d0 }, + Instructions = [0xea10, 0x2fc2, 0x4770, 0xe7fe], + StartRegs = [0x401285a0, 0x7ab1e348, 0xf48a2615, 0x46d49913, 0xff5e9911, 0x4b4d7920, 0x8e1f921e, 0x05075455, 0x24e4acea, 0x8652e355, 0x11d0fe46, 0x0cfe7c08, 0xf326adee, 0x7fcde7ac, 0x00000000, 0x600001f0 + ], + FinalRegs = [0x401285a0, 0x7ab1e348, 0xf48a2615, 0x46d49913, 0xff5e9911, 0x4b4d7920, 0x8e1f921e, 0x05075455, 0x24e4acea, 0x8652e355, 0x11d0fe46, 0x0cfe7c08, 0xf326adee, 0x7fcde7ac, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea16, 0x3f22, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5bb504b3, 0x3dd293c9, 0x3b2b2d7c, 0x30c2876a, 0x1c99a70e, 0x741294e7, 0xfd5f7315, 0x0149b9db, 0x3975aa1c, 0x9269e207, 0xdc42fd14, 0xea6a1c89, 0xa03e7d65, 0x171c30ad, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0x5bb504b3, 0x3dd293c9, 0x3b2b2d7c, 0x30c2876a, 0x1c99a70e, 0x741294e7, 0xfd5f7315, 0x0149b9db, 0x3975aa1c, 0x9269e207, 0xdc42fd14, 0xea6a1c89, 0xa03e7d65, 0x171c30ad, 0x00000000, 0x200001d0 }, + Instructions = [0xea16, 0x3f22, 0x4770, 0xe7fe], + StartRegs = [0x5bb504b3, 0x3dd293c9, 0x3b2b2d7c, 0x30c2876a, 0x1c99a70e, 0x741294e7, 0xfd5f7315, 0x0149b9db, 0x3975aa1c, 0x9269e207, 0xdc42fd14, 0xea6a1c89, 0xa03e7d65, 0x171c30ad, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0x5bb504b3, 0x3dd293c9, 0x3b2b2d7c, 0x30c2876a, 0x1c99a70e, 0x741294e7, 0xfd5f7315, 0x0149b9db, 0x3975aa1c, 0x9269e207, 0xdc42fd14, 0xea6a1c89, 0xa03e7d65, 0x171c30ad, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1b, 0x1f86, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xe0f5bbe3, 0xd96f3c62, 0x11944b25, 0x372e4b0e, 0x7c956b35, 0x03df46ac, 0x8f11684b, 0x3044502e, 0x6ebf2992, 0x4f3a0366, 0x9f36f014, 0x4c55f6aa, 0x6473e494, 0x8b6310d6, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0xe0f5bbe3, 0xd96f3c62, 0x11944b25, 0x372e4b0e, 0x7c956b35, 0x03df46ac, 0x8f11684b, 0x3044502e, 0x6ebf2992, 0x4f3a0366, 0x9f36f014, 0x4c55f6aa, 0x6473e494, 0x8b6310d6, 0x00000000, 0x200001d0 }, + Instructions = [0xea1b, 0x1f86, 0x4770, 0xe7fe], + StartRegs = [0xe0f5bbe3, 0xd96f3c62, 0x11944b25, 0x372e4b0e, 0x7c956b35, 0x03df46ac, 0x8f11684b, 0x3044502e, 0x6ebf2992, 0x4f3a0366, 0x9f36f014, 0x4c55f6aa, 0x6473e494, 0x8b6310d6, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0xe0f5bbe3, 0xd96f3c62, 0x11944b25, 0x372e4b0e, 0x7c956b35, 0x03df46ac, 0x8f11684b, 0x3044502e, 0x6ebf2992, 0x4f3a0366, 0x9f36f014, 0x4c55f6aa, 0x6473e494, 0x8b6310d6, 0x00000000, 0x200001d0 + ], }, // CMP (reg) new() { - Instructions = new ushort[] { 0xea14, 0x6f45, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xe72e848a, 0x97499b66, 0xcde944bc, 0xf6a7e4e1, 0xd8860029, 0xc55c7e43, 0x58dc13d7, 0x5e1cf6ac, 0x8094a819, 0xdba64363, 0xd8f5423f, 0x6ae843f0, 0x69766600, 0x2814e4e6, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0xe72e848a, 0x97499b66, 0xcde944bc, 0xf6a7e4e1, 0xd8860029, 0xc55c7e43, 0x58dc13d7, 0x5e1cf6ac, 0x8094a819, 0xdba64363, 0xd8f5423f, 0x6ae843f0, 0x69766600, 0x2814e4e6, 0x00000000, 0x800001d0 }, + Instructions = [0xea14, 0x6f45, 0x4770, 0xe7fe], + StartRegs = [0xe72e848a, 0x97499b66, 0xcde944bc, 0xf6a7e4e1, 0xd8860029, 0xc55c7e43, 0x58dc13d7, 0x5e1cf6ac, 0x8094a819, 0xdba64363, 0xd8f5423f, 0x6ae843f0, 0x69766600, 0x2814e4e6, 0x00000000, 0x600001f0 + ], + FinalRegs = [0xe72e848a, 0x97499b66, 0xcde944bc, 0xf6a7e4e1, 0xd8860029, 0xc55c7e43, 0x58dc13d7, 0x5e1cf6ac, 0x8094a819, 0xdba64363, 0xd8f5423f, 0x6ae843f0, 0x69766600, 0x2814e4e6, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x7fd8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x323e5ef9, 0x46e23bdf, 0x8d69d89a, 0x9ffddd37, 0x53f4a07b, 0xe923f9bb, 0x5ea62678, 0x1709127c, 0xc0c20492, 0x0ee47a0c, 0xe137cc2e, 0x7d72db37, 0xca9eb971, 0x4447b224, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0x323e5ef9, 0x46e23bdf, 0x8d69d89a, 0x9ffddd37, 0x53f4a07b, 0xe923f9bb, 0x5ea62678, 0x1709127c, 0xc0c20492, 0x0ee47a0c, 0xe137cc2e, 0x7d72db37, 0xca9eb971, 0x4447b224, 0x00000000, 0x200001d0 }, + Instructions = [0xea14, 0x7fd8, 0x4770, 0xe7fe], + StartRegs = [0x323e5ef9, 0x46e23bdf, 0x8d69d89a, 0x9ffddd37, 0x53f4a07b, 0xe923f9bb, 0x5ea62678, 0x1709127c, 0xc0c20492, 0x0ee47a0c, 0xe137cc2e, 0x7d72db37, 0xca9eb971, 0x4447b224, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0x323e5ef9, 0x46e23bdf, 0x8d69d89a, 0x9ffddd37, 0x53f4a07b, 0xe923f9bb, 0x5ea62678, 0x1709127c, 0xc0c20492, 0x0ee47a0c, 0xe137cc2e, 0x7d72db37, 0xca9eb971, 0x4447b224, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea10, 0x3f43, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x4cce7ac7, 0x03055e03, 0x479ec669, 0x8b1d9783, 0xa59509e1, 0xa46866ef, 0x654578c4, 0x700e322b, 0xa4191329, 0xb1b8479a, 0xe555a2ce, 0x1ef22472, 0xd41fb2ae, 0x2d794684, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0x4cce7ac7, 0x03055e03, 0x479ec669, 0x8b1d9783, 0xa59509e1, 0xa46866ef, 0x654578c4, 0x700e322b, 0xa4191329, 0xb1b8479a, 0xe555a2ce, 0x1ef22472, 0xd41fb2ae, 0x2d794684, 0x00000000, 0x200001d0 }, + Instructions = [0xea10, 0x3f43, 0x4770, 0xe7fe], + StartRegs = [0x4cce7ac7, 0x03055e03, 0x479ec669, 0x8b1d9783, 0xa59509e1, 0xa46866ef, 0x654578c4, 0x700e322b, 0xa4191329, 0xb1b8479a, 0xe555a2ce, 0x1ef22472, 0xd41fb2ae, 0x2d794684, 0x00000000, 0x200001f0 + ], + FinalRegs = [0x4cce7ac7, 0x03055e03, 0x479ec669, 0x8b1d9783, 0xa59509e1, 0xa46866ef, 0x654578c4, 0x700e322b, 0xa4191329, 0xb1b8479a, 0xe555a2ce, 0x1ef22472, 0xd41fb2ae, 0x2d794684, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea18, 0x7fd2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xeecfbfb2, 0xbe6288fd, 0x34c0fc94, 0x3a01b105, 0xe7dc6252, 0xc05813fa, 0x6613d82d, 0x90dc7a0c, 0x34637299, 0x58f6d0e7, 0xb151d65e, 0xca975eca, 0xf83b6533, 0x10177f01, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0xeecfbfb2, 0xbe6288fd, 0x34c0fc94, 0x3a01b105, 0xe7dc6252, 0xc05813fa, 0x6613d82d, 0x90dc7a0c, 0x34637299, 0x58f6d0e7, 0xb151d65e, 0xca975eca, 0xf83b6533, 0x10177f01, 0x00000000, 0x400001d0 }, + Instructions = [0xea18, 0x7fd2, 0x4770, 0xe7fe], + StartRegs = [0xeecfbfb2, 0xbe6288fd, 0x34c0fc94, 0x3a01b105, 0xe7dc6252, 0xc05813fa, 0x6613d82d, 0x90dc7a0c, 0x34637299, 0x58f6d0e7, 0xb151d65e, 0xca975eca, 0xf83b6533, 0x10177f01, 0x00000000, 0x600001f0 + ], + FinalRegs = [0xeecfbfb2, 0xbe6288fd, 0x34c0fc94, 0x3a01b105, 0xe7dc6252, 0xc05813fa, 0x6613d82d, 0x90dc7a0c, 0x34637299, 0x58f6d0e7, 0xb151d65e, 0xca975eca, 0xf83b6533, 0x10177f01, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x2f6e, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x54dcd0c5, 0x629131da, 0xc4010f0b, 0xf28a7f0f, 0x866d92a3, 0xbb9a1b32, 0xc8c7f425, 0x8d13d61f, 0x1f9a5d13, 0x83e0b2b7, 0x7ef44e14, 0x24c291a3, 0x851cc882, 0x31a056cb, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x54dcd0c5, 0x629131da, 0xc4010f0b, 0xf28a7f0f, 0x866d92a3, 0xbb9a1b32, 0xc8c7f425, 0x8d13d61f, 0x1f9a5d13, 0x83e0b2b7, 0x7ef44e14, 0x24c291a3, 0x851cc882, 0x31a056cb, 0x00000000, 0x500001d0 }, + Instructions = [0xea14, 0x2f6e, 0x4770, 0xe7fe], + StartRegs = [0x54dcd0c5, 0x629131da, 0xc4010f0b, 0xf28a7f0f, 0x866d92a3, 0xbb9a1b32, 0xc8c7f425, 0x8d13d61f, 0x1f9a5d13, 0x83e0b2b7, 0x7ef44e14, 0x24c291a3, 0x851cc882, 0x31a056cb, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x54dcd0c5, 0x629131da, 0xc4010f0b, 0xf28a7f0f, 0x866d92a3, 0xbb9a1b32, 0xc8c7f425, 0x8d13d61f, 0x1f9a5d13, 0x83e0b2b7, 0x7ef44e14, 0x24c291a3, 0x851cc882, 0x31a056cb, 0x00000000, 0x500001d0 + ], }, // SUB (reg) new() { - Instructions = new ushort[] { 0xea1a, 0x6f56, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xf997cd9f, 0xf94c5bd7, 0x5411a289, 0x21311b8f, 0xee8a1fe4, 0x73808b62, 0x4daadf68, 0x14a1c57c, 0x92d98c4c, 0x31f999c9, 0x953b94b9, 0x108acc75, 0xcc38ea73, 0x5dc27e61, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0xf997cd9f, 0xf94c5bd7, 0x5411a289, 0x21311b8f, 0xee8a1fe4, 0x73808b62, 0x4daadf68, 0x14a1c57c, 0x92d98c4c, 0x31f999c9, 0x953b94b9, 0x108acc75, 0xcc38ea73, 0x5dc27e61, 0x00000000, 0x200001d0 }, + Instructions = [0xea1a, 0x6f56, 0x4770, 0xe7fe], + StartRegs = [0xf997cd9f, 0xf94c5bd7, 0x5411a289, 0x21311b8f, 0xee8a1fe4, 0x73808b62, 0x4daadf68, 0x14a1c57c, 0x92d98c4c, 0x31f999c9, 0x953b94b9, 0x108acc75, 0xcc38ea73, 0x5dc27e61, 0x00000000, 0x600001f0 + ], + FinalRegs = [0xf997cd9f, 0xf94c5bd7, 0x5411a289, 0x21311b8f, 0xee8a1fe4, 0x73808b62, 0x4daadf68, 0x14a1c57c, 0x92d98c4c, 0x31f999c9, 0x953b94b9, 0x108acc75, 0xcc38ea73, 0x5dc27e61, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea19, 0x0f94, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5f8de6f4, 0x09e82020, 0x480dc701, 0xd3303ca3, 0x8739e87a, 0x3da0b6d2, 0x10093787, 0xd30606fc, 0xd81d45da, 0xa66f5e86, 0xd8ddf48e, 0xa8321bd1, 0x62a75c1c, 0x3cffac30, 0x00000000, 0x800001f0 }, - FinalRegs = new uint[] { 0x5f8de6f4, 0x09e82020, 0x480dc701, 0xd3303ca3, 0x8739e87a, 0x3da0b6d2, 0x10093787, 0xd30606fc, 0xd81d45da, 0xa66f5e86, 0xd8ddf48e, 0xa8321bd1, 0x62a75c1c, 0x3cffac30, 0x00000000, 0x200001d0 }, + Instructions = [0xea19, 0x0f94, 0x4770, 0xe7fe], + StartRegs = [0x5f8de6f4, 0x09e82020, 0x480dc701, 0xd3303ca3, 0x8739e87a, 0x3da0b6d2, 0x10093787, 0xd30606fc, 0xd81d45da, 0xa66f5e86, 0xd8ddf48e, 0xa8321bd1, 0x62a75c1c, 0x3cffac30, 0x00000000, 0x800001f0 + ], + FinalRegs = [0x5f8de6f4, 0x09e82020, 0x480dc701, 0xd3303ca3, 0x8739e87a, 0x3da0b6d2, 0x10093787, 0xd30606fc, 0xd81d45da, 0xa66f5e86, 0xd8ddf48e, 0xa8321bd1, 0x62a75c1c, 0x3cffac30, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea14, 0x7fc6, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x001f39cf, 0x76b925c8, 0x292b283a, 0x9d142282, 0x2cda04fa, 0x87f29de5, 0x9e9a98e4, 0x9d48ddbb, 0x9ea329fd, 0x653f2346, 0xfc116785, 0x6e565e16, 0x9a7f8c11, 0x46f1ecbb, 0x00000000, 0xd00001f0 }, - FinalRegs = new uint[] { 0x001f39cf, 0x76b925c8, 0x292b283a, 0x9d142282, 0x2cda04fa, 0x87f29de5, 0x9e9a98e4, 0x9d48ddbb, 0x9ea329fd, 0x653f2346, 0xfc116785, 0x6e565e16, 0x9a7f8c11, 0x46f1ecbb, 0x00000000, 0x500001d0 }, + Instructions = [0xea14, 0x7fc6, 0x4770, 0xe7fe], + StartRegs = [0x001f39cf, 0x76b925c8, 0x292b283a, 0x9d142282, 0x2cda04fa, 0x87f29de5, 0x9e9a98e4, 0x9d48ddbb, 0x9ea329fd, 0x653f2346, 0xfc116785, 0x6e565e16, 0x9a7f8c11, 0x46f1ecbb, 0x00000000, 0xd00001f0 + ], + FinalRegs = [0x001f39cf, 0x76b925c8, 0x292b283a, 0x9d142282, 0x2cda04fa, 0x87f29de5, 0x9e9a98e4, 0x9d48ddbb, 0x9ea329fd, 0x653f2346, 0xfc116785, 0x6e565e16, 0x9a7f8c11, 0x46f1ecbb, 0x00000000, 0x500001d0 + ], }, new() { - Instructions = new ushort[] { 0xea19, 0x5fa5, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xfb6a4a50, 0xd074ee0e, 0x599131ef, 0x5db48236, 0xf287fcd1, 0xadea3b9f, 0xf2529f30, 0x6717a5af, 0xe1a3bc40, 0xd92e291b, 0x9b0337eb, 0xcab803ed, 0x255dd8a9, 0xea0e7824, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0xfb6a4a50, 0xd074ee0e, 0x599131ef, 0x5db48236, 0xf287fcd1, 0xadea3b9f, 0xf2529f30, 0x6717a5af, 0xe1a3bc40, 0xd92e291b, 0x9b0337eb, 0xcab803ed, 0x255dd8a9, 0xea0e7824, 0x00000000, 0xb00001d0 }, + Instructions = [0xea19, 0x5fa5, 0x4770, 0xe7fe], + StartRegs = [0xfb6a4a50, 0xd074ee0e, 0x599131ef, 0x5db48236, 0xf287fcd1, 0xadea3b9f, 0xf2529f30, 0x6717a5af, 0xe1a3bc40, 0xd92e291b, 0x9b0337eb, 0xcab803ed, 0x255dd8a9, 0xea0e7824, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0xfb6a4a50, 0xd074ee0e, 0x599131ef, 0x5db48236, 0xf287fcd1, 0xadea3b9f, 0xf2529f30, 0x6717a5af, 0xe1a3bc40, 0xd92e291b, 0x9b0337eb, 0xcab803ed, 0x255dd8a9, 0xea0e7824, 0x00000000, 0xb00001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1c, 0x6f86, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3a000492, 0xc16be6fa, 0x20053393, 0x597617c9, 0xc30c0ac0, 0x0ed34739, 0xf964a3d4, 0x4dcf9b40, 0x93109692, 0x7ed22040, 0x1f57a26e, 0x008d29d2, 0x99b2dae8, 0xe8a14948, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0x3a000492, 0xc16be6fa, 0x20053393, 0x597617c9, 0xc30c0ac0, 0x0ed34739, 0xf964a3d4, 0x4dcf9b40, 0x93109692, 0x7ed22040, 0x1f57a26e, 0x008d29d2, 0x99b2dae8, 0xe8a14948, 0x00000000, 0x200001d0 }, + Instructions = [0xea1c, 0x6f86, 0x4770, 0xe7fe], + StartRegs = [0x3a000492, 0xc16be6fa, 0x20053393, 0x597617c9, 0xc30c0ac0, 0x0ed34739, 0xf964a3d4, 0x4dcf9b40, 0x93109692, 0x7ed22040, 0x1f57a26e, 0x008d29d2, 0x99b2dae8, 0xe8a14948, 0x00000000, 0x200001f0 + ], + FinalRegs = [0x3a000492, 0xc16be6fa, 0x20053393, 0x597617c9, 0xc30c0ac0, 0x0ed34739, 0xf964a3d4, 0x4dcf9b40, 0x93109692, 0x7ed22040, 0x1f57a26e, 0x008d29d2, 0x99b2dae8, 0xe8a14948, 0x00000000, 0x200001d0 + ], }, // RSB (reg) new() { - Instructions = new ushort[] { 0xea1a, 0x6f72, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x9a603e20, 0x10004fe3, 0x8c33bcef, 0x8a23db09, 0x47244c0c, 0x53417661, 0x6486ac8b, 0x5276c43b, 0x577f49a7, 0x34542492, 0xb4ac7c99, 0x5de5cb55, 0x8f6e1d72, 0x077d4a02, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0x9a603e20, 0x10004fe3, 0x8c33bcef, 0x8a23db09, 0x47244c0c, 0x53417661, 0x6486ac8b, 0x5276c43b, 0x577f49a7, 0x34542492, 0xb4ac7c99, 0x5de5cb55, 0x8f6e1d72, 0x077d4a02, 0x00000000, 0x000001d0 }, + Instructions = [0xea1a, 0x6f72, 0x4770, 0xe7fe], + StartRegs = [0x9a603e20, 0x10004fe3, 0x8c33bcef, 0x8a23db09, 0x47244c0c, 0x53417661, 0x6486ac8b, 0x5276c43b, 0x577f49a7, 0x34542492, 0xb4ac7c99, 0x5de5cb55, 0x8f6e1d72, 0x077d4a02, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0x9a603e20, 0x10004fe3, 0x8c33bcef, 0x8a23db09, 0x47244c0c, 0x53417661, 0x6486ac8b, 0x5276c43b, 0x577f49a7, 0x34542492, 0xb4ac7c99, 0x5de5cb55, 0x8f6e1d72, 0x077d4a02, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1b, 0x0ff3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6fdd73d7, 0xc6c4c438, 0x772312e2, 0xa57de93f, 0xa1edd64b, 0x8ee41d33, 0x85849a41, 0xac34953a, 0xb3d7c6b5, 0x439ceff1, 0xa3096172, 0x5d8f0654, 0x2e2993a3, 0xca221149, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x6fdd73d7, 0xc6c4c438, 0x772312e2, 0xa57de93f, 0xa1edd64b, 0x8ee41d33, 0x85849a41, 0xac34953a, 0xb3d7c6b5, 0x439ceff1, 0xa3096172, 0x5d8f0654, 0x2e2993a3, 0xca221149, 0x00000000, 0x200001d0 }, + Instructions = [0xea1b, 0x0ff3, 0x4770, 0xe7fe], + StartRegs = [0x6fdd73d7, 0xc6c4c438, 0x772312e2, 0xa57de93f, 0xa1edd64b, 0x8ee41d33, 0x85849a41, 0xac34953a, 0xb3d7c6b5, 0x439ceff1, 0xa3096172, 0x5d8f0654, 0x2e2993a3, 0xca221149, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x6fdd73d7, 0xc6c4c438, 0x772312e2, 0xa57de93f, 0xa1edd64b, 0x8ee41d33, 0x85849a41, 0xac34953a, 0xb3d7c6b5, 0x439ceff1, 0xa3096172, 0x5d8f0654, 0x2e2993a3, 0xca221149, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1b, 0x1f34, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xbefd78a5, 0x6d071150, 0xe9ce2c88, 0x2251ed54, 0x30610b17, 0x6428697e, 0xf6e940a4, 0x2395634f, 0xdabff1a3, 0x89988d57, 0x85dd20b0, 0x2ca1311d, 0xcd0748d9, 0xedf55a6f, 0x00000000, 0x800001f0 }, - FinalRegs = new uint[] { 0xbefd78a5, 0x6d071150, 0xe9ce2c88, 0x2251ed54, 0x30610b17, 0x6428697e, 0xf6e940a4, 0x2395634f, 0xdabff1a3, 0x89988d57, 0x85dd20b0, 0x2ca1311d, 0xcd0748d9, 0xedf55a6f, 0x00000000, 0x000001d0 }, + Instructions = [0xea1b, 0x1f34, 0x4770, 0xe7fe], + StartRegs = [0xbefd78a5, 0x6d071150, 0xe9ce2c88, 0x2251ed54, 0x30610b17, 0x6428697e, 0xf6e940a4, 0x2395634f, 0xdabff1a3, 0x89988d57, 0x85dd20b0, 0x2ca1311d, 0xcd0748d9, 0xedf55a6f, 0x00000000, 0x800001f0 + ], + FinalRegs = [0xbefd78a5, 0x6d071150, 0xe9ce2c88, 0x2251ed54, 0x30610b17, 0x6428697e, 0xf6e940a4, 0x2395634f, 0xdabff1a3, 0x89988d57, 0x85dd20b0, 0x2ca1311d, 0xcd0748d9, 0xedf55a6f, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xea16, 0x5f83, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x57018e40, 0xc4027d19, 0x33a32bd7, 0x6a75787a, 0x18f8569a, 0xbbf3a50d, 0x7f35656f, 0x66fbdad7, 0x3aa48c57, 0x39709ea2, 0x5972e4ba, 0xb2c2c772, 0x52f35620, 0x7ef9f1d6, 0x00000000, 0xd00001f0 }, - FinalRegs = new uint[] { 0x57018e40, 0xc4027d19, 0x33a32bd7, 0x6a75787a, 0x18f8569a, 0xbbf3a50d, 0x7f35656f, 0x66fbdad7, 0x3aa48c57, 0x39709ea2, 0x5972e4ba, 0xb2c2c772, 0x52f35620, 0x7ef9f1d6, 0x00000000, 0x100001d0 }, + Instructions = [0xea16, 0x5f83, 0x4770, 0xe7fe], + StartRegs = [0x57018e40, 0xc4027d19, 0x33a32bd7, 0x6a75787a, 0x18f8569a, 0xbbf3a50d, 0x7f35656f, 0x66fbdad7, 0x3aa48c57, 0x39709ea2, 0x5972e4ba, 0xb2c2c772, 0x52f35620, 0x7ef9f1d6, 0x00000000, 0xd00001f0 + ], + FinalRegs = [0x57018e40, 0xc4027d19, 0x33a32bd7, 0x6a75787a, 0x18f8569a, 0xbbf3a50d, 0x7f35656f, 0x66fbdad7, 0x3aa48c57, 0x39709ea2, 0x5972e4ba, 0xb2c2c772, 0x52f35620, 0x7ef9f1d6, 0x00000000, 0x100001d0 + ], }, new() { - Instructions = new ushort[] { 0xea1a, 0x0fd8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x79108ff6, 0x0cb1e662, 0x9eb9ffed, 0x1ee4d3de, 0x7a8fa20a, 0x1db7e216, 0x6fc42752, 0x9cb6cdad, 0xa497a582, 0x654c446f, 0xcbb31efc, 0x601e6995, 0xe328af35, 0x824026e7, 0x00000000, 0xd00001f0 }, - FinalRegs = new uint[] { 0x79108ff6, 0x0cb1e662, 0x9eb9ffed, 0x1ee4d3de, 0x7a8fa20a, 0x1db7e216, 0x6fc42752, 0x9cb6cdad, 0xa497a582, 0x654c446f, 0xcbb31efc, 0x601e6995, 0xe328af35, 0x824026e7, 0x00000000, 0x100001d0 }, - }, - }; + Instructions = [0xea1a, 0x0fd8, 0x4770, 0xe7fe], + StartRegs = [0x79108ff6, 0x0cb1e662, 0x9eb9ffed, 0x1ee4d3de, 0x7a8fa20a, 0x1db7e216, 0x6fc42752, 0x9cb6cdad, 0xa497a582, 0x654c446f, 0xcbb31efc, 0x601e6995, 0xe328af35, 0x824026e7, 0x00000000, 0xd00001f0 + ], + FinalRegs = [0x79108ff6, 0x0cb1e662, 0x9eb9ffed, 0x1ee4d3de, 0x7a8fa20a, 0x1db7e216, 0x6fc42752, 0x9cb6cdad, 0xa497a582, 0x654c446f, 0xcbb31efc, 0x601e6995, 0xe328af35, 0x824026e7, 0x00000000, 0x100001d0 + ], + } + ]; public static readonly PrecomputedThumbTestCase[] ImmTestCases = - { + [ // TST (imm) new() { - Instructions = new ushort[] { 0xf018, 0x0fd4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xf5a1b919, 0x37ee0ad4, 0xec1bbb30, 0x8345ecb1, 0xf733e93e, 0x76668927, 0xa9b16176, 0x34b9678e, 0xa6167f8b, 0xea4f20a9, 0x45345e75, 0xc8a2ea55, 0xae108472, 0x67b5e3a4, 0x00000001, 0xb00001f0 }, - FinalRegs = new uint[] { 0xf5a1b919, 0x37ee0ad4, 0xec1bbb30, 0x8345ecb1, 0xf733e93e, 0x76668927, 0xa9b16176, 0x34b9678e, 0xa6167f8b, 0xea4f20a9, 0x45345e75, 0xc8a2ea55, 0xae108472, 0x67b5e3a4, 0x00000001, 0x300001f0 }, + Instructions = [0xf018, 0x0fd4, 0x4770, 0xe7fe], + StartRegs = [0xf5a1b919, 0x37ee0ad4, 0xec1bbb30, 0x8345ecb1, 0xf733e93e, 0x76668927, 0xa9b16176, 0x34b9678e, 0xa6167f8b, 0xea4f20a9, 0x45345e75, 0xc8a2ea55, 0xae108472, 0x67b5e3a4, 0x00000001, 0xb00001f0 + ], + FinalRegs = [0xf5a1b919, 0x37ee0ad4, 0xec1bbb30, 0x8345ecb1, 0xf733e93e, 0x76668927, 0xa9b16176, 0x34b9678e, 0xa6167f8b, 0xea4f20a9, 0x45345e75, 0xc8a2ea55, 0xae108472, 0x67b5e3a4, 0x00000001, 0x300001f0 + ], }, new() { - Instructions = new ushort[] { 0xf41b, 0x1fff, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xfc928b9b, 0xeff1f0a6, 0xe1cd22ba, 0xef1e4a75, 0x10779ef3, 0x3b003004, 0x7a532842, 0x2e71a8c4, 0x62b71ce6, 0x5ffcf3ce, 0xdbe8efa1, 0x86822f2b, 0x560da6b6, 0x46550850, 0x00000001, 0x700001f0 }, - FinalRegs = new uint[] { 0xfc928b9b, 0xeff1f0a6, 0xe1cd22ba, 0xef1e4a75, 0x10779ef3, 0x3b003004, 0x7a532842, 0x2e71a8c4, 0x62b71ce6, 0x5ffcf3ce, 0xdbe8efa1, 0x86822f2b, 0x560da6b6, 0x46550850, 0x00000001, 0x100001f0 }, + Instructions = [0xf41b, 0x1fff, 0x4770, 0xe7fe], + StartRegs = [0xfc928b9b, 0xeff1f0a6, 0xe1cd22ba, 0xef1e4a75, 0x10779ef3, 0x3b003004, 0x7a532842, 0x2e71a8c4, 0x62b71ce6, 0x5ffcf3ce, 0xdbe8efa1, 0x86822f2b, 0x560da6b6, 0x46550850, 0x00000001, 0x700001f0 + ], + FinalRegs = [0xfc928b9b, 0xeff1f0a6, 0xe1cd22ba, 0xef1e4a75, 0x10779ef3, 0x3b003004, 0x7a532842, 0x2e71a8c4, 0x62b71ce6, 0x5ffcf3ce, 0xdbe8efa1, 0x86822f2b, 0x560da6b6, 0x46550850, 0x00000001, 0x100001f0 + ], }, new() { - Instructions = new ushort[] { 0xf416, 0x7f97, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd0ba5d0a, 0xc8fa5c53, 0xac3069cb, 0x4be76d89, 0xcc9b4f47, 0x36984914, 0xd49fe0a5, 0x7d80c756, 0x8210fb6d, 0xcb498541, 0xc366597f, 0xacef4405, 0xdf6341a9, 0x6a1124b8, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0xd0ba5d0a, 0xc8fa5c53, 0xac3069cb, 0x4be76d89, 0xcc9b4f47, 0x36984914, 0xd49fe0a5, 0x7d80c756, 0x8210fb6d, 0xcb498541, 0xc366597f, 0xacef4405, 0xdf6341a9, 0x6a1124b8, 0x00000001, 0x000001f0 }, + Instructions = [0xf416, 0x7f97, 0x4770, 0xe7fe], + StartRegs = [0xd0ba5d0a, 0xc8fa5c53, 0xac3069cb, 0x4be76d89, 0xcc9b4f47, 0x36984914, 0xd49fe0a5, 0x7d80c756, 0x8210fb6d, 0xcb498541, 0xc366597f, 0xacef4405, 0xdf6341a9, 0x6a1124b8, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0xd0ba5d0a, 0xc8fa5c53, 0xac3069cb, 0x4be76d89, 0xcc9b4f47, 0x36984914, 0xd49fe0a5, 0x7d80c756, 0x8210fb6d, 0xcb498541, 0xc366597f, 0xacef4405, 0xdf6341a9, 0x6a1124b8, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf016, 0x0f12, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xb8568ac2, 0x67a7ee09, 0x266abe3b, 0x9d93101d, 0x504b4adb, 0x45838822, 0x62126cc4, 0xf4198159, 0xf24a524c, 0x163fa3e9, 0x3c6d489e, 0xacef0dff, 0x73fc8fdd, 0x9d34fc09, 0x00000001, 0x800001f0 }, - FinalRegs = new uint[] { 0xb8568ac2, 0x67a7ee09, 0x266abe3b, 0x9d93101d, 0x504b4adb, 0x45838822, 0x62126cc4, 0xf4198159, 0xf24a524c, 0x163fa3e9, 0x3c6d489e, 0xacef0dff, 0x73fc8fdd, 0x9d34fc09, 0x00000001, 0x400001f0 }, + Instructions = [0xf016, 0x0f12, 0x4770, 0xe7fe], + StartRegs = [0xb8568ac2, 0x67a7ee09, 0x266abe3b, 0x9d93101d, 0x504b4adb, 0x45838822, 0x62126cc4, 0xf4198159, 0xf24a524c, 0x163fa3e9, 0x3c6d489e, 0xacef0dff, 0x73fc8fdd, 0x9d34fc09, 0x00000001, 0x800001f0 + ], + FinalRegs = [0xb8568ac2, 0x67a7ee09, 0x266abe3b, 0x9d93101d, 0x504b4adb, 0x45838822, 0x62126cc4, 0xf4198159, 0xf24a524c, 0x163fa3e9, 0x3c6d489e, 0xacef0dff, 0x73fc8fdd, 0x9d34fc09, 0x00000001, 0x400001f0 + ], }, new() { - Instructions = new ushort[] { 0xf017, 0x2fd1, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5548cee0, 0x59a88eb4, 0x3624d775, 0x98fe9a19, 0x84d1b83f, 0xed2c476a, 0x046a6aea, 0x0c92fadb, 0xdff5abe1, 0x91a16e82, 0xbb0f8ba4, 0x87c1888c, 0xa2df958e, 0x6cebba03, 0x00000001, 0x400001f0 }, - FinalRegs = new uint[] { 0x5548cee0, 0x59a88eb4, 0x3624d775, 0x98fe9a19, 0x84d1b83f, 0xed2c476a, 0x046a6aea, 0x0c92fadb, 0xdff5abe1, 0x91a16e82, 0xbb0f8ba4, 0x87c1888c, 0xa2df958e, 0x6cebba03, 0x00000001, 0x000001f0 }, + Instructions = [0xf017, 0x2fd1, 0x4770, 0xe7fe], + StartRegs = [0x5548cee0, 0x59a88eb4, 0x3624d775, 0x98fe9a19, 0x84d1b83f, 0xed2c476a, 0x046a6aea, 0x0c92fadb, 0xdff5abe1, 0x91a16e82, 0xbb0f8ba4, 0x87c1888c, 0xa2df958e, 0x6cebba03, 0x00000001, 0x400001f0 + ], + FinalRegs = [0x5548cee0, 0x59a88eb4, 0x3624d775, 0x98fe9a19, 0x84d1b83f, 0xed2c476a, 0x046a6aea, 0x0c92fadb, 0xdff5abe1, 0x91a16e82, 0xbb0f8ba4, 0x87c1888c, 0xa2df958e, 0x6cebba03, 0x00000001, 0x000001f0 + ], }, // AND (imm) new() { - Instructions = new ushort[] { 0xf403, 0x3ce5, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xddd90378, 0xc3a2891f, 0x3d5007a2, 0x0f0c0756, 0xbdc5c113, 0xeee78000, 0x90693126, 0x8763b349, 0xbf6814b4, 0x40160bf9, 0xfff4a26d, 0x16a11d59, 0x26b3b8cc, 0xeb09487f, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0xddd90378, 0xc3a2891f, 0x3d5007a2, 0x0f0c0756, 0xbdc5c113, 0xeee78000, 0x90693126, 0x8763b349, 0xbf6814b4, 0x40160bf9, 0xfff4a26d, 0x16a11d59, 0x00000200, 0xeb09487f, 0x00000001, 0x200001f0 }, + Instructions = [0xf403, 0x3ce5, 0x4770, 0xe7fe], + StartRegs = [0xddd90378, 0xc3a2891f, 0x3d5007a2, 0x0f0c0756, 0xbdc5c113, 0xeee78000, 0x90693126, 0x8763b349, 0xbf6814b4, 0x40160bf9, 0xfff4a26d, 0x16a11d59, 0x26b3b8cc, 0xeb09487f, 0x00000001, 0x200001f0 + ], + FinalRegs = [0xddd90378, 0xc3a2891f, 0x3d5007a2, 0x0f0c0756, 0xbdc5c113, 0xeee78000, 0x90693126, 0x8763b349, 0xbf6814b4, 0x40160bf9, 0xfff4a26d, 0x16a11d59, 0x00000200, 0xeb09487f, 0x00000001, 0x200001f0 + ], }, new() { - Instructions = new ushort[] { 0xf00a, 0x177d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xce4db266, 0x67f21be8, 0x0de0c290, 0x2615cfc5, 0x6e3c46cb, 0x44a52240, 0xb12e0470, 0x903e0182, 0x61c32a9a, 0x58bf0753, 0xa9b3c209, 0x68ec1f37, 0x9320a3c9, 0xab952fd9, 0x00000001, 0xa00001f0 }, - FinalRegs = new uint[] { 0xce4db266, 0x67f21be8, 0x0de0c290, 0x2615cfc5, 0x6e3c46cb, 0x44a52240, 0xb12e0470, 0x00310009, 0x61c32a9a, 0x58bf0753, 0xa9b3c209, 0x68ec1f37, 0x9320a3c9, 0xab952fd9, 0x00000001, 0xa00001f0 }, + Instructions = [0xf00a, 0x177d, 0x4770, 0xe7fe], + StartRegs = [0xce4db266, 0x67f21be8, 0x0de0c290, 0x2615cfc5, 0x6e3c46cb, 0x44a52240, 0xb12e0470, 0x903e0182, 0x61c32a9a, 0x58bf0753, 0xa9b3c209, 0x68ec1f37, 0x9320a3c9, 0xab952fd9, 0x00000001, 0xa00001f0 + ], + FinalRegs = [0xce4db266, 0x67f21be8, 0x0de0c290, 0x2615cfc5, 0x6e3c46cb, 0x44a52240, 0xb12e0470, 0x00310009, 0x61c32a9a, 0x58bf0753, 0xa9b3c209, 0x68ec1f37, 0x9320a3c9, 0xab952fd9, 0x00000001, 0xa00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf014, 0x2913, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x4257c8eb, 0xd9eaf199, 0xe9381b0a, 0x39fcb309, 0xb1f24181, 0xebb2b7e4, 0x73799a0f, 0xc70a2fc7, 0xe2af6496, 0xb9014f5b, 0xe22ff568, 0x12dd4afe, 0x6d8544ac, 0x9293d043, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0x4257c8eb, 0xd9eaf199, 0xe9381b0a, 0x39fcb309, 0xb1f24181, 0xebb2b7e4, 0x73799a0f, 0xc70a2fc7, 0xe2af6496, 0x11000100, 0xe22ff568, 0x12dd4afe, 0x6d8544ac, 0x9293d043, 0x00000001, 0x000001f0 }, + Instructions = [0xf014, 0x2913, 0x4770, 0xe7fe], + StartRegs = [0x4257c8eb, 0xd9eaf199, 0xe9381b0a, 0x39fcb309, 0xb1f24181, 0xebb2b7e4, 0x73799a0f, 0xc70a2fc7, 0xe2af6496, 0xb9014f5b, 0xe22ff568, 0x12dd4afe, 0x6d8544ac, 0x9293d043, 0x00000001, 0x000001f0 + ], + FinalRegs = [0x4257c8eb, 0xd9eaf199, 0xe9381b0a, 0x39fcb309, 0xb1f24181, 0xebb2b7e4, 0x73799a0f, 0xc70a2fc7, 0xe2af6496, 0x11000100, 0xe22ff568, 0x12dd4afe, 0x6d8544ac, 0x9293d043, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf004, 0x27c2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x8d7ceb35, 0x000e9260, 0x6825b561, 0xbcf66952, 0x3fbc7775, 0xd5afaa83, 0xe4fde261, 0xa35fa71e, 0xbefc5c9f, 0x667d9163, 0x8c2543b0, 0xd8489b89, 0x661ffec5, 0x45ccdaa8, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0x8d7ceb35, 0x000e9260, 0x6825b561, 0xbcf66952, 0x3fbc7775, 0xd5afaa83, 0xe4fde261, 0x02004200, 0xbefc5c9f, 0x667d9163, 0x8c2543b0, 0xd8489b89, 0x661ffec5, 0x45ccdaa8, 0x00000001, 0xd00001f0 }, + Instructions = [0xf004, 0x27c2, 0x4770, 0xe7fe], + StartRegs = [0x8d7ceb35, 0x000e9260, 0x6825b561, 0xbcf66952, 0x3fbc7775, 0xd5afaa83, 0xe4fde261, 0xa35fa71e, 0xbefc5c9f, 0x667d9163, 0x8c2543b0, 0xd8489b89, 0x661ffec5, 0x45ccdaa8, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0x8d7ceb35, 0x000e9260, 0x6825b561, 0xbcf66952, 0x3fbc7775, 0xd5afaa83, 0xe4fde261, 0x02004200, 0xbefc5c9f, 0x667d9163, 0x8c2543b0, 0xd8489b89, 0x661ffec5, 0x45ccdaa8, 0x00000001, 0xd00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf008, 0x6ce5, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x78a2a638, 0x54ac2bd7, 0x60ad5509, 0x9c38b11f, 0x8dd109de, 0xd07aea77, 0xf5a0bcfc, 0xbcd81a17, 0x2f159ebd, 0xcc7e8454, 0x04621cce, 0xd0e9eca5, 0xb33f4ba6, 0x1e2bb5b2, 0x00000001, 0xf00001f0 }, - FinalRegs = new uint[] { 0x78a2a638, 0x54ac2bd7, 0x60ad5509, 0x9c38b11f, 0x8dd109de, 0xd07aea77, 0xf5a0bcfc, 0xbcd81a17, 0x2f159ebd, 0xcc7e8454, 0x04621cce, 0xd0e9eca5, 0x07000000, 0x1e2bb5b2, 0x00000001, 0xf00001f0 }, + Instructions = [0xf008, 0x6ce5, 0x4770, 0xe7fe], + StartRegs = [0x78a2a638, 0x54ac2bd7, 0x60ad5509, 0x9c38b11f, 0x8dd109de, 0xd07aea77, 0xf5a0bcfc, 0xbcd81a17, 0x2f159ebd, 0xcc7e8454, 0x04621cce, 0xd0e9eca5, 0xb33f4ba6, 0x1e2bb5b2, 0x00000001, 0xf00001f0 + ], + FinalRegs = [0x78a2a638, 0x54ac2bd7, 0x60ad5509, 0x9c38b11f, 0x8dd109de, 0xd07aea77, 0xf5a0bcfc, 0xbcd81a17, 0x2f159ebd, 0xcc7e8454, 0x04621cce, 0xd0e9eca5, 0x07000000, 0x1e2bb5b2, 0x00000001, 0xf00001f0 + ], }, // BIC (imm) new() { - Instructions = new ushort[] { 0xf420, 0x6425, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x28c2ef44, 0x206bdfed, 0x30c780a9, 0x440ab4ab, 0x666fc882, 0x92a4aa1d, 0x3ceb6b36, 0xca757a75, 0xdf2f77b7, 0xae012305, 0x06b5c956, 0x0ff05e78, 0xad918973, 0x73778e28, 0x00000001, 0xe00001f0 }, - FinalRegs = new uint[] { 0x28c2ef44, 0x206bdfed, 0x30c780a9, 0x440ab4ab, 0x28c2e504, 0x92a4aa1d, 0x3ceb6b36, 0xca757a75, 0xdf2f77b7, 0xae012305, 0x06b5c956, 0x0ff05e78, 0xad918973, 0x73778e28, 0x00000001, 0xe00001f0 }, + Instructions = [0xf420, 0x6425, 0x4770, 0xe7fe], + StartRegs = [0x28c2ef44, 0x206bdfed, 0x30c780a9, 0x440ab4ab, 0x666fc882, 0x92a4aa1d, 0x3ceb6b36, 0xca757a75, 0xdf2f77b7, 0xae012305, 0x06b5c956, 0x0ff05e78, 0xad918973, 0x73778e28, 0x00000001, 0xe00001f0 + ], + FinalRegs = [0x28c2ef44, 0x206bdfed, 0x30c780a9, 0x440ab4ab, 0x28c2e504, 0x92a4aa1d, 0x3ceb6b36, 0xca757a75, 0xdf2f77b7, 0xae012305, 0x06b5c956, 0x0ff05e78, 0xad918973, 0x73778e28, 0x00000001, 0xe00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf430, 0x44ed, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5cd96673, 0xa1c27ac5, 0xbb205490, 0xa844d844, 0x1e66662f, 0x0f259402, 0xbe81472f, 0x36d55b13, 0x02c6d2a2, 0xc39c31b1, 0x59b71936, 0xf1914252, 0xef8188b8, 0x0c18bea1, 0x00000001, 0x700001f0 }, - FinalRegs = new uint[] { 0x5cd96673, 0xa1c27ac5, 0xbb205490, 0xa844d844, 0x5cd90073, 0x0f259402, 0xbe81472f, 0x36d55b13, 0x02c6d2a2, 0xc39c31b1, 0x59b71936, 0xf1914252, 0xef8188b8, 0x0c18bea1, 0x00000001, 0x100001f0 }, + Instructions = [0xf430, 0x44ed, 0x4770, 0xe7fe], + StartRegs = [0x5cd96673, 0xa1c27ac5, 0xbb205490, 0xa844d844, 0x1e66662f, 0x0f259402, 0xbe81472f, 0x36d55b13, 0x02c6d2a2, 0xc39c31b1, 0x59b71936, 0xf1914252, 0xef8188b8, 0x0c18bea1, 0x00000001, 0x700001f0 + ], + FinalRegs = [0x5cd96673, 0xa1c27ac5, 0xbb205490, 0xa844d844, 0x5cd90073, 0x0f259402, 0xbe81472f, 0x36d55b13, 0x02c6d2a2, 0xc39c31b1, 0x59b71936, 0xf1914252, 0xef8188b8, 0x0c18bea1, 0x00000001, 0x100001f0 + ], }, new() { - Instructions = new ushort[] { 0xf038, 0x1334, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xe0afc0e0, 0x7ffd49d1, 0x6fe858fa, 0x7564882e, 0xaa895bf1, 0x725f4071, 0x612b9956, 0xb28fd700, 0xf0acd15c, 0xb62cf0bb, 0x1d9d5c1f, 0xdc3942a2, 0x9b3248ea, 0x3b7593ca, 0x00000001, 0xb00001f0 }, - FinalRegs = new uint[] { 0xe0afc0e0, 0x7ffd49d1, 0x6fe858fa, 0xf088d148, 0xaa895bf1, 0x725f4071, 0x612b9956, 0xb28fd700, 0xf0acd15c, 0xb62cf0bb, 0x1d9d5c1f, 0xdc3942a2, 0x9b3248ea, 0x3b7593ca, 0x00000001, 0xb00001f0 }, + Instructions = [0xf038, 0x1334, 0x4770, 0xe7fe], + StartRegs = [0xe0afc0e0, 0x7ffd49d1, 0x6fe858fa, 0x7564882e, 0xaa895bf1, 0x725f4071, 0x612b9956, 0xb28fd700, 0xf0acd15c, 0xb62cf0bb, 0x1d9d5c1f, 0xdc3942a2, 0x9b3248ea, 0x3b7593ca, 0x00000001, 0xb00001f0 + ], + FinalRegs = [0xe0afc0e0, 0x7ffd49d1, 0x6fe858fa, 0xf088d148, 0xaa895bf1, 0x725f4071, 0x612b9956, 0xb28fd700, 0xf0acd15c, 0xb62cf0bb, 0x1d9d5c1f, 0xdc3942a2, 0x9b3248ea, 0x3b7593ca, 0x00000001, 0xb00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf438, 0x51d7, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x75f070b0, 0x24e410c6, 0x128174fa, 0x04a10755, 0x6728fd35, 0xf6007f21, 0x0cb9efa3, 0x260e061c, 0xc5e02c94, 0x4aaa3354, 0x00796ab8, 0x897274d2, 0xe87dcffc, 0xa47bd3ab, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0x75f070b0, 0xc5e02414, 0x128174fa, 0x04a10755, 0x6728fd35, 0xf6007f21, 0x0cb9efa3, 0x260e061c, 0xc5e02c94, 0x4aaa3354, 0x00796ab8, 0x897274d2, 0xe87dcffc, 0xa47bd3ab, 0x00000001, 0x800001f0 }, + Instructions = [0xf438, 0x51d7, 0x4770, 0xe7fe], + StartRegs = [0x75f070b0, 0x24e410c6, 0x128174fa, 0x04a10755, 0x6728fd35, 0xf6007f21, 0x0cb9efa3, 0x260e061c, 0xc5e02c94, 0x4aaa3354, 0x00796ab8, 0x897274d2, 0xe87dcffc, 0xa47bd3ab, 0x00000001, 0x200001f0 + ], + FinalRegs = [0x75f070b0, 0xc5e02414, 0x128174fa, 0x04a10755, 0x6728fd35, 0xf6007f21, 0x0cb9efa3, 0x260e061c, 0xc5e02c94, 0x4aaa3354, 0x00796ab8, 0x897274d2, 0xe87dcffc, 0xa47bd3ab, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf438, 0x1db2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x62dcbe9e, 0x55f42016, 0x6689f461, 0x31e32805, 0x1fc90a1e, 0x02e3a47f, 0xf236bafd, 0x65006290, 0x0065bd7f, 0xc1752579, 0x59528615, 0x6ef68c79, 0x138b8bb3, 0x0761d66c, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0x62dcbe9e, 0x55f42016, 0x6689f461, 0x31e32805, 0x1fc90a1e, 0x02e3a47f, 0xf236bafd, 0x65006290, 0x0065bd7f, 0xc1752579, 0x59528615, 0x6ef68c79, 0x138b8bb3, 0x0061bd7f, 0x00000001, 0x000001f0 }, + Instructions = [0xf438, 0x1db2, 0x4770, 0xe7fe], + StartRegs = [0x62dcbe9e, 0x55f42016, 0x6689f461, 0x31e32805, 0x1fc90a1e, 0x02e3a47f, 0xf236bafd, 0x65006290, 0x0065bd7f, 0xc1752579, 0x59528615, 0x6ef68c79, 0x138b8bb3, 0x0761d66c, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0x62dcbe9e, 0x55f42016, 0x6689f461, 0x31e32805, 0x1fc90a1e, 0x02e3a47f, 0xf236bafd, 0x65006290, 0x0065bd7f, 0xc1752579, 0x59528615, 0x6ef68c79, 0x138b8bb3, 0x0061bd7f, 0x00000001, 0x000001f0 + ], }, // MOV (imm) new() { - Instructions = new ushort[] { 0xf45f, 0x5032, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6ed98807, 0x536a9cb7, 0x79c2d5bb, 0xc2e9a860, 0x185b4e57, 0x77c1c99f, 0x99a24897, 0xc6cc4ea1, 0xe3d294a6, 0xb8e525ae, 0xca245840, 0x27943892, 0xa76ed6fe, 0xecbcffe8, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0x00002c80, 0x536a9cb7, 0x79c2d5bb, 0xc2e9a860, 0x185b4e57, 0x77c1c99f, 0x99a24897, 0xc6cc4ea1, 0xe3d294a6, 0xb8e525ae, 0xca245840, 0x27943892, 0xa76ed6fe, 0xecbcffe8, 0x00000001, 0x000001f0 }, + Instructions = [0xf45f, 0x5032, 0x4770, 0xe7fe], + StartRegs = [0x6ed98807, 0x536a9cb7, 0x79c2d5bb, 0xc2e9a860, 0x185b4e57, 0x77c1c99f, 0x99a24897, 0xc6cc4ea1, 0xe3d294a6, 0xb8e525ae, 0xca245840, 0x27943892, 0xa76ed6fe, 0xecbcffe8, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0x00002c80, 0x536a9cb7, 0x79c2d5bb, 0xc2e9a860, 0x185b4e57, 0x77c1c99f, 0x99a24897, 0xc6cc4ea1, 0xe3d294a6, 0xb8e525ae, 0xca245840, 0x27943892, 0xa76ed6fe, 0xecbcffe8, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf04f, 0x23f9, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x7e6bf90e, 0x87533a8f, 0x29389323, 0x96a37f30, 0x63e6e58e, 0xb8bb21d0, 0x5bd9ae04, 0x26b7a586, 0xfa359510, 0x131a4e95, 0x5d0adb02, 0xa8148f64, 0xbfe74669, 0xea2cdf2d, 0x00000001, 0xb00001f0 }, - FinalRegs = new uint[] { 0x7e6bf90e, 0x87533a8f, 0x29389323, 0xf900f900, 0x63e6e58e, 0xb8bb21d0, 0x5bd9ae04, 0x26b7a586, 0xfa359510, 0x131a4e95, 0x5d0adb02, 0xa8148f64, 0xbfe74669, 0xea2cdf2d, 0x00000001, 0xb00001f0 }, + Instructions = [0xf04f, 0x23f9, 0x4770, 0xe7fe], + StartRegs = [0x7e6bf90e, 0x87533a8f, 0x29389323, 0x96a37f30, 0x63e6e58e, 0xb8bb21d0, 0x5bd9ae04, 0x26b7a586, 0xfa359510, 0x131a4e95, 0x5d0adb02, 0xa8148f64, 0xbfe74669, 0xea2cdf2d, 0x00000001, 0xb00001f0 + ], + FinalRegs = [0x7e6bf90e, 0x87533a8f, 0x29389323, 0xf900f900, 0x63e6e58e, 0xb8bb21d0, 0x5bd9ae04, 0x26b7a586, 0xfa359510, 0x131a4e95, 0x5d0adb02, 0xa8148f64, 0xbfe74669, 0xea2cdf2d, 0x00000001, 0xb00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf45f, 0x5351, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd8b5d8b2, 0x7ae44f2b, 0xda909eb2, 0xdb2fe423, 0xb2486971, 0x23427a2c, 0x96c88749, 0xb88d6d78, 0x2f4aa092, 0xbf40760f, 0x88d72a3f, 0x88854e62, 0x8d459486, 0x82a8ba9f, 0x00000001, 0x300001f0 }, - FinalRegs = new uint[] { 0xd8b5d8b2, 0x7ae44f2b, 0xda909eb2, 0x00003440, 0xb2486971, 0x23427a2c, 0x96c88749, 0xb88d6d78, 0x2f4aa092, 0xbf40760f, 0x88d72a3f, 0x88854e62, 0x8d459486, 0x82a8ba9f, 0x00000001, 0x100001f0 }, + Instructions = [0xf45f, 0x5351, 0x4770, 0xe7fe], + StartRegs = [0xd8b5d8b2, 0x7ae44f2b, 0xda909eb2, 0xdb2fe423, 0xb2486971, 0x23427a2c, 0x96c88749, 0xb88d6d78, 0x2f4aa092, 0xbf40760f, 0x88d72a3f, 0x88854e62, 0x8d459486, 0x82a8ba9f, 0x00000001, 0x300001f0 + ], + FinalRegs = [0xd8b5d8b2, 0x7ae44f2b, 0xda909eb2, 0x00003440, 0xb2486971, 0x23427a2c, 0x96c88749, 0xb88d6d78, 0x2f4aa092, 0xbf40760f, 0x88d72a3f, 0x88854e62, 0x8d459486, 0x82a8ba9f, 0x00000001, 0x100001f0 + ], }, new() { - Instructions = new ushort[] { 0xf45f, 0x207c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x73063041, 0x038b5f4a, 0xf7e85421, 0xe935f110, 0x9a5c34de, 0xbc3dbed9, 0x1c57c517, 0x3294067f, 0x01cd78b5, 0xe7bfe428, 0x6e297fce, 0xccb2c833, 0x2e8bb930, 0xeb6e2004, 0x00000001, 0x300001f0 }, - FinalRegs = new uint[] { 0x000fc000, 0x038b5f4a, 0xf7e85421, 0xe935f110, 0x9a5c34de, 0xbc3dbed9, 0x1c57c517, 0x3294067f, 0x01cd78b5, 0xe7bfe428, 0x6e297fce, 0xccb2c833, 0x2e8bb930, 0xeb6e2004, 0x00000001, 0x100001f0 }, + Instructions = [0xf45f, 0x207c, 0x4770, 0xe7fe], + StartRegs = [0x73063041, 0x038b5f4a, 0xf7e85421, 0xe935f110, 0x9a5c34de, 0xbc3dbed9, 0x1c57c517, 0x3294067f, 0x01cd78b5, 0xe7bfe428, 0x6e297fce, 0xccb2c833, 0x2e8bb930, 0xeb6e2004, 0x00000001, 0x300001f0 + ], + FinalRegs = [0x000fc000, 0x038b5f4a, 0xf7e85421, 0xe935f110, 0x9a5c34de, 0xbc3dbed9, 0x1c57c517, 0x3294067f, 0x01cd78b5, 0xe7bfe428, 0x6e297fce, 0xccb2c833, 0x2e8bb930, 0xeb6e2004, 0x00000001, 0x100001f0 + ], }, new() { - Instructions = new ushort[] { 0xf45f, 0x5073, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd0d531fe, 0xeb1676df, 0x0acf5912, 0x6061b3fe, 0xecac2ae2, 0x40075143, 0x88a47781, 0x3ecb7baa, 0x6aee3603, 0x53133f32, 0x1e891e57, 0x4d7f8f94, 0xd09c727a, 0x28a79c93, 0x00000001, 0x400001f0 }, - FinalRegs = new uint[] { 0x00003cc0, 0xeb1676df, 0x0acf5912, 0x6061b3fe, 0xecac2ae2, 0x40075143, 0x88a47781, 0x3ecb7baa, 0x6aee3603, 0x53133f32, 0x1e891e57, 0x4d7f8f94, 0xd09c727a, 0x28a79c93, 0x00000001, 0x000001f0 }, + Instructions = [0xf45f, 0x5073, 0x4770, 0xe7fe], + StartRegs = [0xd0d531fe, 0xeb1676df, 0x0acf5912, 0x6061b3fe, 0xecac2ae2, 0x40075143, 0x88a47781, 0x3ecb7baa, 0x6aee3603, 0x53133f32, 0x1e891e57, 0x4d7f8f94, 0xd09c727a, 0x28a79c93, 0x00000001, 0x400001f0 + ], + FinalRegs = [0x00003cc0, 0xeb1676df, 0x0acf5912, 0x6061b3fe, 0xecac2ae2, 0x40075143, 0x88a47781, 0x3ecb7baa, 0x6aee3603, 0x53133f32, 0x1e891e57, 0x4d7f8f94, 0xd09c727a, 0x28a79c93, 0x00000001, 0x000001f0 + ], }, // ORR (imm) new() { - Instructions = new ushort[] { 0xf45c, 0x03c9, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xc7d9e145, 0xc2a6bd5b, 0x92c8ca0b, 0x1fde4d2f, 0xa4705c7f, 0x47559e93, 0x9f9d3e22, 0x7b3719c0, 0x3746ffc9, 0xa1476ae8, 0x88f45e36, 0x0fc7d2a7, 0xaa94b64c, 0xe9fee33b, 0x00000001, 0x700001f0 }, - FinalRegs = new uint[] { 0xc7d9e145, 0xc2a6bd5b, 0x92c8ca0b, 0xaaf4b64c, 0xa4705c7f, 0x47559e93, 0x9f9d3e22, 0x7b3719c0, 0x3746ffc9, 0xa1476ae8, 0x88f45e36, 0x0fc7d2a7, 0xaa94b64c, 0xe9fee33b, 0x00000001, 0x900001f0 }, + Instructions = [0xf45c, 0x03c9, 0x4770, 0xe7fe], + StartRegs = [0xc7d9e145, 0xc2a6bd5b, 0x92c8ca0b, 0x1fde4d2f, 0xa4705c7f, 0x47559e93, 0x9f9d3e22, 0x7b3719c0, 0x3746ffc9, 0xa1476ae8, 0x88f45e36, 0x0fc7d2a7, 0xaa94b64c, 0xe9fee33b, 0x00000001, 0x700001f0 + ], + FinalRegs = [0xc7d9e145, 0xc2a6bd5b, 0x92c8ca0b, 0xaaf4b64c, 0xa4705c7f, 0x47559e93, 0x9f9d3e22, 0x7b3719c0, 0x3746ffc9, 0xa1476ae8, 0x88f45e36, 0x0fc7d2a7, 0xaa94b64c, 0xe9fee33b, 0x00000001, 0x900001f0 + ], }, new() { - Instructions = new ushort[] { 0xf441, 0x60ec, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x2262c23f, 0xf8ba9254, 0x2a870feb, 0xa66d2c1a, 0xa3bb8f6d, 0x2f754de2, 0xb3b0b9be, 0xc3cf59e8, 0xebaa6300, 0x22ea8a3d, 0xf3bcf0f4, 0xffb0aae8, 0x4982d5ab, 0x4c945119, 0x00000001, 0x800001f0 }, - FinalRegs = new uint[] { 0xf8ba9774, 0xf8ba9254, 0x2a870feb, 0xa66d2c1a, 0xa3bb8f6d, 0x2f754de2, 0xb3b0b9be, 0xc3cf59e8, 0xebaa6300, 0x22ea8a3d, 0xf3bcf0f4, 0xffb0aae8, 0x4982d5ab, 0x4c945119, 0x00000001, 0x800001f0 }, + Instructions = [0xf441, 0x60ec, 0x4770, 0xe7fe], + StartRegs = [0x2262c23f, 0xf8ba9254, 0x2a870feb, 0xa66d2c1a, 0xa3bb8f6d, 0x2f754de2, 0xb3b0b9be, 0xc3cf59e8, 0xebaa6300, 0x22ea8a3d, 0xf3bcf0f4, 0xffb0aae8, 0x4982d5ab, 0x4c945119, 0x00000001, 0x800001f0 + ], + FinalRegs = [0xf8ba9774, 0xf8ba9254, 0x2a870feb, 0xa66d2c1a, 0xa3bb8f6d, 0x2f754de2, 0xb3b0b9be, 0xc3cf59e8, 0xebaa6300, 0x22ea8a3d, 0xf3bcf0f4, 0xffb0aae8, 0x4982d5ab, 0x4c945119, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf44c, 0x5343, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x844cd5c4, 0x5a244353, 0xd74ff677, 0x25eefc9f, 0xa040f56f, 0x06e237a6, 0x7ccb1c91, 0xc9aa6d32, 0xf9e18bd6, 0xc0780954, 0x955d8f60, 0xa9cb014e, 0x64d583e2, 0x3e50533a, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0x844cd5c4, 0x5a244353, 0xd74ff677, 0x64d5b3e2, 0xa040f56f, 0x06e237a6, 0x7ccb1c91, 0xc9aa6d32, 0xf9e18bd6, 0xc0780954, 0x955d8f60, 0xa9cb014e, 0x64d583e2, 0x3e50533a, 0x00000001, 0x000001f0 }, + Instructions = [0xf44c, 0x5343, 0x4770, 0xe7fe], + StartRegs = [0x844cd5c4, 0x5a244353, 0xd74ff677, 0x25eefc9f, 0xa040f56f, 0x06e237a6, 0x7ccb1c91, 0xc9aa6d32, 0xf9e18bd6, 0xc0780954, 0x955d8f60, 0xa9cb014e, 0x64d583e2, 0x3e50533a, 0x00000001, 0x000001f0 + ], + FinalRegs = [0x844cd5c4, 0x5a244353, 0xd74ff677, 0x64d5b3e2, 0xa040f56f, 0x06e237a6, 0x7ccb1c91, 0xc9aa6d32, 0xf9e18bd6, 0xc0780954, 0x955d8f60, 0xa9cb014e, 0x64d583e2, 0x3e50533a, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf040, 0x48e2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x24423eae, 0x40f7667e, 0x017f283e, 0x72887399, 0x063f4da0, 0x9b57a1c5, 0x5500c630, 0x6a304cac, 0xf9f10e9a, 0x02cdd193, 0x3f42bccd, 0x3c52ef2e, 0x15858a11, 0x25fd30bf, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0x24423eae, 0x40f7667e, 0x017f283e, 0x72887399, 0x063f4da0, 0x9b57a1c5, 0x5500c630, 0x6a304cac, 0x75423eae, 0x02cdd193, 0x3f42bccd, 0x3c52ef2e, 0x15858a11, 0x25fd30bf, 0x00000001, 0xc00001f0 }, + Instructions = [0xf040, 0x48e2, 0x4770, 0xe7fe], + StartRegs = [0x24423eae, 0x40f7667e, 0x017f283e, 0x72887399, 0x063f4da0, 0x9b57a1c5, 0x5500c630, 0x6a304cac, 0xf9f10e9a, 0x02cdd193, 0x3f42bccd, 0x3c52ef2e, 0x15858a11, 0x25fd30bf, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0x24423eae, 0x40f7667e, 0x017f283e, 0x72887399, 0x063f4da0, 0x9b57a1c5, 0x5500c630, 0x6a304cac, 0x75423eae, 0x02cdd193, 0x3f42bccd, 0x3c52ef2e, 0x15858a11, 0x25fd30bf, 0x00000001, 0xc00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf455, 0x1de0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xc8c22d0e, 0x98a19d05, 0x61b4ea5e, 0x52f6f9a0, 0x2f8ceae4, 0x15649771, 0x61953174, 0x45b9d93f, 0x4e0629af, 0x30f43259, 0x863e8e5c, 0x3310b69e, 0xae5e5b9d, 0xf00e065a, 0x00000001, 0xb00001f0 }, - FinalRegs = new uint[] { 0xc8c22d0e, 0x98a19d05, 0x61b4ea5e, 0x52f6f9a0, 0x2f8ceae4, 0x15649771, 0x61953174, 0x45b9d93f, 0x4e0629af, 0x30f43259, 0x863e8e5c, 0x3310b69e, 0xae5e5b9d, 0x157c9771, 0x00000001, 0x100001f0 }, + Instructions = [0xf455, 0x1de0, 0x4770, 0xe7fe], + StartRegs = [0xc8c22d0e, 0x98a19d05, 0x61b4ea5e, 0x52f6f9a0, 0x2f8ceae4, 0x15649771, 0x61953174, 0x45b9d93f, 0x4e0629af, 0x30f43259, 0x863e8e5c, 0x3310b69e, 0xae5e5b9d, 0xf00e065a, 0x00000001, 0xb00001f0 + ], + FinalRegs = [0xc8c22d0e, 0x98a19d05, 0x61b4ea5e, 0x52f6f9a0, 0x2f8ceae4, 0x15649771, 0x61953174, 0x45b9d93f, 0x4e0629af, 0x30f43259, 0x863e8e5c, 0x3310b69e, 0xae5e5b9d, 0x157c9771, 0x00000001, 0x100001f0 + ], }, // MVN (imm) new() { - Instructions = new ushort[] { 0xf46f, 0x1681, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xb1267a38, 0xe72b03aa, 0x50dc392a, 0xaff74b0d, 0xf83a17ba, 0xb8edf09d, 0x799df56d, 0x1ecbd371, 0xb4a74b9a, 0xe79f52fb, 0xbcec8b62, 0xbb0b01ea, 0x26d72e8c, 0x1d2ac349, 0x00000001, 0x900001f0 }, - FinalRegs = new uint[] { 0xb1267a38, 0xe72b03aa, 0x50dc392a, 0xaff74b0d, 0xf83a17ba, 0xb8edf09d, 0xffefdfff, 0x1ecbd371, 0xb4a74b9a, 0xe79f52fb, 0xbcec8b62, 0xbb0b01ea, 0x26d72e8c, 0x1d2ac349, 0x00000001, 0x900001f0 }, + Instructions = [0xf46f, 0x1681, 0x4770, 0xe7fe], + StartRegs = [0xb1267a38, 0xe72b03aa, 0x50dc392a, 0xaff74b0d, 0xf83a17ba, 0xb8edf09d, 0x799df56d, 0x1ecbd371, 0xb4a74b9a, 0xe79f52fb, 0xbcec8b62, 0xbb0b01ea, 0x26d72e8c, 0x1d2ac349, 0x00000001, 0x900001f0 + ], + FinalRegs = [0xb1267a38, 0xe72b03aa, 0x50dc392a, 0xaff74b0d, 0xf83a17ba, 0xb8edf09d, 0xffefdfff, 0x1ecbd371, 0xb4a74b9a, 0xe79f52fb, 0xbcec8b62, 0xbb0b01ea, 0x26d72e8c, 0x1d2ac349, 0x00000001, 0x900001f0 + ], }, new() { - Instructions = new ushort[] { 0xf07f, 0x572f, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xa95387ad, 0x256c4ece, 0x32084d7a, 0x84935d58, 0x12f6880b, 0x3b386e47, 0xbeb69796, 0xdcf3fac5, 0xee2f9386, 0x25372541, 0x56499ba6, 0x06fa7586, 0xd114f908, 0x3442736e, 0x00000001, 0x400001f0 }, - FinalRegs = new uint[] { 0xa95387ad, 0x256c4ece, 0x32084d7a, 0x84935d58, 0x12f6880b, 0x3b386e47, 0xbeb69796, 0xd43fffff, 0xee2f9386, 0x25372541, 0x56499ba6, 0x06fa7586, 0xd114f908, 0x3442736e, 0x00000001, 0x800001f0 }, + Instructions = [0xf07f, 0x572f, 0x4770, 0xe7fe], + StartRegs = [0xa95387ad, 0x256c4ece, 0x32084d7a, 0x84935d58, 0x12f6880b, 0x3b386e47, 0xbeb69796, 0xdcf3fac5, 0xee2f9386, 0x25372541, 0x56499ba6, 0x06fa7586, 0xd114f908, 0x3442736e, 0x00000001, 0x400001f0 + ], + FinalRegs = [0xa95387ad, 0x256c4ece, 0x32084d7a, 0x84935d58, 0x12f6880b, 0x3b386e47, 0xbeb69796, 0xd43fffff, 0xee2f9386, 0x25372541, 0x56499ba6, 0x06fa7586, 0xd114f908, 0x3442736e, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf46f, 0x17e3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd7f2d1e1, 0x1d12b22c, 0x2c26620c, 0xeadb8ead, 0x73560a2e, 0xf521b384, 0x4094f3d2, 0x17ed0f6f, 0x79d30498, 0x6d47211a, 0x8fdfef1d, 0xce6cbfa7, 0x75dc1c1b, 0x2ffd5d28, 0x00000001, 0x700001f0 }, - FinalRegs = new uint[] { 0xd7f2d1e1, 0x1d12b22c, 0x2c26620c, 0xeadb8ead, 0x73560a2e, 0xf521b384, 0x4094f3d2, 0xffe39fff, 0x79d30498, 0x6d47211a, 0x8fdfef1d, 0xce6cbfa7, 0x75dc1c1b, 0x2ffd5d28, 0x00000001, 0x700001f0 }, + Instructions = [0xf46f, 0x17e3, 0x4770, 0xe7fe], + StartRegs = [0xd7f2d1e1, 0x1d12b22c, 0x2c26620c, 0xeadb8ead, 0x73560a2e, 0xf521b384, 0x4094f3d2, 0x17ed0f6f, 0x79d30498, 0x6d47211a, 0x8fdfef1d, 0xce6cbfa7, 0x75dc1c1b, 0x2ffd5d28, 0x00000001, 0x700001f0 + ], + FinalRegs = [0xd7f2d1e1, 0x1d12b22c, 0x2c26620c, 0xeadb8ead, 0x73560a2e, 0xf521b384, 0x4094f3d2, 0xffe39fff, 0x79d30498, 0x6d47211a, 0x8fdfef1d, 0xce6cbfa7, 0x75dc1c1b, 0x2ffd5d28, 0x00000001, 0x700001f0 + ], }, new() { - Instructions = new ushort[] { 0xf07f, 0x1431, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x4154dce7, 0x66c452e9, 0xff9bea1b, 0x228a4a5e, 0xe9fee66b, 0xddd7117f, 0x303cdcb6, 0x4bdf78a2, 0xfbcca92c, 0x2f628d24, 0x51816529, 0xcdea5042, 0x77a1e4a2, 0x8a745cb4, 0x00000001, 0xa00001f0 }, - FinalRegs = new uint[] { 0x4154dce7, 0x66c452e9, 0xff9bea1b, 0x228a4a5e, 0xffceffce, 0xddd7117f, 0x303cdcb6, 0x4bdf78a2, 0xfbcca92c, 0x2f628d24, 0x51816529, 0xcdea5042, 0x77a1e4a2, 0x8a745cb4, 0x00000001, 0xa00001f0 }, + Instructions = [0xf07f, 0x1431, 0x4770, 0xe7fe], + StartRegs = [0x4154dce7, 0x66c452e9, 0xff9bea1b, 0x228a4a5e, 0xe9fee66b, 0xddd7117f, 0x303cdcb6, 0x4bdf78a2, 0xfbcca92c, 0x2f628d24, 0x51816529, 0xcdea5042, 0x77a1e4a2, 0x8a745cb4, 0x00000001, 0xa00001f0 + ], + FinalRegs = [0x4154dce7, 0x66c452e9, 0xff9bea1b, 0x228a4a5e, 0xffceffce, 0xddd7117f, 0x303cdcb6, 0x4bdf78a2, 0xfbcca92c, 0x2f628d24, 0x51816529, 0xcdea5042, 0x77a1e4a2, 0x8a745cb4, 0x00000001, 0xa00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf07f, 0x73ac, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd7b60274, 0x1ff3baba, 0xfdc8fa51, 0xcfacae9d, 0xd27a8214, 0xbbfb1abf, 0x3766111f, 0x89af2196, 0x4bd14cd6, 0x5af84659, 0xd279ed2f, 0x7abdf656, 0x868a6980, 0xd343d52a, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0xd7b60274, 0x1ff3baba, 0xfdc8fa51, 0xfea7ffff, 0xd27a8214, 0xbbfb1abf, 0x3766111f, 0x89af2196, 0x4bd14cd6, 0x5af84659, 0xd279ed2f, 0x7abdf656, 0x868a6980, 0xd343d52a, 0x00000001, 0x900001f0 }, + Instructions = [0xf07f, 0x73ac, 0x4770, 0xe7fe], + StartRegs = [0xd7b60274, 0x1ff3baba, 0xfdc8fa51, 0xcfacae9d, 0xd27a8214, 0xbbfb1abf, 0x3766111f, 0x89af2196, 0x4bd14cd6, 0x5af84659, 0xd279ed2f, 0x7abdf656, 0x868a6980, 0xd343d52a, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0xd7b60274, 0x1ff3baba, 0xfdc8fa51, 0xfea7ffff, 0xd27a8214, 0xbbfb1abf, 0x3766111f, 0x89af2196, 0x4bd14cd6, 0x5af84659, 0xd279ed2f, 0x7abdf656, 0x868a6980, 0xd343d52a, 0x00000001, 0x900001f0 + ], }, // ORN (imm) new() { - Instructions = new ushort[] { 0xf464, 0x0976, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x02e1c999, 0x40c2ff04, 0x16f00059, 0xd360cd62, 0xcb34f9d2, 0x303b434a, 0x53e0151f, 0x188b36bc, 0x84868958, 0xebad0ada, 0xdcd0cb74, 0x64bc056c, 0xd17a7256, 0xb71ddae3, 0x00000001, 0x500001f0 }, - FinalRegs = new uint[] { 0x02e1c999, 0x40c2ff04, 0x16f00059, 0xd360cd62, 0xcb34f9d2, 0x303b434a, 0x53e0151f, 0x188b36bc, 0x84868958, 0xff3dffff, 0xdcd0cb74, 0x64bc056c, 0xd17a7256, 0xb71ddae3, 0x00000001, 0x500001f0 }, + Instructions = [0xf464, 0x0976, 0x4770, 0xe7fe], + StartRegs = [0x02e1c999, 0x40c2ff04, 0x16f00059, 0xd360cd62, 0xcb34f9d2, 0x303b434a, 0x53e0151f, 0x188b36bc, 0x84868958, 0xebad0ada, 0xdcd0cb74, 0x64bc056c, 0xd17a7256, 0xb71ddae3, 0x00000001, 0x500001f0 + ], + FinalRegs = [0x02e1c999, 0x40c2ff04, 0x16f00059, 0xd360cd62, 0xcb34f9d2, 0x303b434a, 0x53e0151f, 0x188b36bc, 0x84868958, 0xff3dffff, 0xdcd0cb74, 0x64bc056c, 0xd17a7256, 0xb71ddae3, 0x00000001, 0x500001f0 + ], }, new() { - Instructions = new ushort[] { 0xf477, 0x3c66, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x71910713, 0xd17f8e75, 0x2652c7ac, 0xfad0527a, 0xc52b726d, 0x29e66793, 0xa1011225, 0x00c8ecc1, 0x48af4edd, 0x5c4e2e67, 0xc5393bd5, 0x702fcda1, 0x4549b1cf, 0x72d5a971, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0x71910713, 0xd17f8e75, 0x2652c7ac, 0xfad0527a, 0xc52b726d, 0x29e66793, 0xa1011225, 0x00c8ecc1, 0x48af4edd, 0x5c4e2e67, 0xc5393bd5, 0x702fcda1, 0xfffcefff, 0x72d5a971, 0x00000001, 0x900001f0 }, + Instructions = [0xf477, 0x3c66, 0x4770, 0xe7fe], + StartRegs = [0x71910713, 0xd17f8e75, 0x2652c7ac, 0xfad0527a, 0xc52b726d, 0x29e66793, 0xa1011225, 0x00c8ecc1, 0x48af4edd, 0x5c4e2e67, 0xc5393bd5, 0x702fcda1, 0x4549b1cf, 0x72d5a971, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0x71910713, 0xd17f8e75, 0x2652c7ac, 0xfad0527a, 0xc52b726d, 0x29e66793, 0xa1011225, 0x00c8ecc1, 0x48af4edd, 0x5c4e2e67, 0xc5393bd5, 0x702fcda1, 0xfffcefff, 0x72d5a971, 0x00000001, 0x900001f0 + ], }, new() { - Instructions = new ushort[] { 0xf479, 0x1270, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x91060c85, 0x9b9c9033, 0x771ac325, 0x001e17c8, 0xb1adee43, 0xbaa9ec02, 0xf57f9f83, 0x3fed4e5c, 0x198cc3ea, 0x1a40edde, 0x6844391b, 0xa03319a0, 0xf741e11b, 0xc1892487, 0x00000001, 0x600001f0 }, - FinalRegs = new uint[] { 0x91060c85, 0x9b9c9033, 0xffc3ffff, 0x001e17c8, 0xb1adee43, 0xbaa9ec02, 0xf57f9f83, 0x3fed4e5c, 0x198cc3ea, 0x1a40edde, 0x6844391b, 0xa03319a0, 0xf741e11b, 0xc1892487, 0x00000001, 0x800001f0 }, + Instructions = [0xf479, 0x1270, 0x4770, 0xe7fe], + StartRegs = [0x91060c85, 0x9b9c9033, 0x771ac325, 0x001e17c8, 0xb1adee43, 0xbaa9ec02, 0xf57f9f83, 0x3fed4e5c, 0x198cc3ea, 0x1a40edde, 0x6844391b, 0xa03319a0, 0xf741e11b, 0xc1892487, 0x00000001, 0x600001f0 + ], + FinalRegs = [0x91060c85, 0x9b9c9033, 0xffc3ffff, 0x001e17c8, 0xb1adee43, 0xbaa9ec02, 0xf57f9f83, 0x3fed4e5c, 0x198cc3ea, 0x1a40edde, 0x6844391b, 0xa03319a0, 0xf741e11b, 0xc1892487, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf46f, 0x19d4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x4fd5b2bd, 0x1c8f29ae, 0x12803c79, 0x93683874, 0xccd779c1, 0x6978c335, 0x06eb789d, 0xc8b74ef8, 0x51ca145a, 0x242d8047, 0x5036f51f, 0x13a4a4a2, 0x08818ae4, 0xe1687e67, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0x4fd5b2bd, 0x1c8f29ae, 0x12803c79, 0x93683874, 0xccd779c1, 0x6978c335, 0x06eb789d, 0xc8b74ef8, 0x51ca145a, 0xffe57fff, 0x5036f51f, 0x13a4a4a2, 0x08818ae4, 0xe1687e67, 0x00000001, 0x000001f0 }, + Instructions = [0xf46f, 0x19d4, 0x4770, 0xe7fe], + StartRegs = [0x4fd5b2bd, 0x1c8f29ae, 0x12803c79, 0x93683874, 0xccd779c1, 0x6978c335, 0x06eb789d, 0xc8b74ef8, 0x51ca145a, 0x242d8047, 0x5036f51f, 0x13a4a4a2, 0x08818ae4, 0xe1687e67, 0x00000001, 0x000001f0 + ], + FinalRegs = [0x4fd5b2bd, 0x1c8f29ae, 0x12803c79, 0x93683874, 0xccd779c1, 0x6978c335, 0x06eb789d, 0xc8b74ef8, 0x51ca145a, 0xffe57fff, 0x5036f51f, 0x13a4a4a2, 0x08818ae4, 0xe1687e67, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf07f, 0x614f, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x83c9ef5a, 0xb5933c7e, 0x2dc23d71, 0x5723ae27, 0x1218bc2c, 0x456f3dbd, 0xf6ee7d22, 0xde4df878, 0x3e800973, 0x39c4c131, 0x0676384d, 0xef62a558, 0x2acc92f2, 0x9cd71aa1, 0x00000001, 0xb00001f0 }, - FinalRegs = new uint[] { 0x83c9ef5a, 0xf30fffff, 0x2dc23d71, 0x5723ae27, 0x1218bc2c, 0x456f3dbd, 0xf6ee7d22, 0xde4df878, 0x3e800973, 0x39c4c131, 0x0676384d, 0xef62a558, 0x2acc92f2, 0x9cd71aa1, 0x00000001, 0x900001f0 }, + Instructions = [0xf07f, 0x614f, 0x4770, 0xe7fe], + StartRegs = [0x83c9ef5a, 0xb5933c7e, 0x2dc23d71, 0x5723ae27, 0x1218bc2c, 0x456f3dbd, 0xf6ee7d22, 0xde4df878, 0x3e800973, 0x39c4c131, 0x0676384d, 0xef62a558, 0x2acc92f2, 0x9cd71aa1, 0x00000001, 0xb00001f0 + ], + FinalRegs = [0x83c9ef5a, 0xf30fffff, 0x2dc23d71, 0x5723ae27, 0x1218bc2c, 0x456f3dbd, 0xf6ee7d22, 0xde4df878, 0x3e800973, 0x39c4c131, 0x0676384d, 0xef62a558, 0x2acc92f2, 0x9cd71aa1, 0x00000001, 0x900001f0 + ], }, // TEQ (imm) new() { - Instructions = new ushort[] { 0xf49b, 0x2fe4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xc87047c3, 0x99001273, 0xa963adc7, 0xaba3d1a1, 0x4b9c13a0, 0xc42566ba, 0xee0b7ab1, 0x3e4423ec, 0x5d874e97, 0xfffb5799, 0xdb88f462, 0xbdc4a9e2, 0x3933e52b, 0xe1839111, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0xc87047c3, 0x99001273, 0xa963adc7, 0xaba3d1a1, 0x4b9c13a0, 0xc42566ba, 0xee0b7ab1, 0x3e4423ec, 0x5d874e97, 0xfffb5799, 0xdb88f462, 0xbdc4a9e2, 0x3933e52b, 0xe1839111, 0x00000001, 0x800001f0 }, + Instructions = [0xf49b, 0x2fe4, 0x4770, 0xe7fe], + StartRegs = [0xc87047c3, 0x99001273, 0xa963adc7, 0xaba3d1a1, 0x4b9c13a0, 0xc42566ba, 0xee0b7ab1, 0x3e4423ec, 0x5d874e97, 0xfffb5799, 0xdb88f462, 0xbdc4a9e2, 0x3933e52b, 0xe1839111, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0xc87047c3, 0x99001273, 0xa963adc7, 0xaba3d1a1, 0x4b9c13a0, 0xc42566ba, 0xee0b7ab1, 0x3e4423ec, 0x5d874e97, 0xfffb5799, 0xdb88f462, 0xbdc4a9e2, 0x3933e52b, 0xe1839111, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf09b, 0x0f59, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6d2c2ac7, 0xdd2b59f4, 0x3fc013f4, 0x567e744e, 0xc4feb096, 0x188454f3, 0xae13338b, 0x66a0a40b, 0xac995945, 0x7e27f097, 0x547cbd54, 0xd2abf0ab, 0x02c08b3e, 0xe6d1283f, 0x00000001, 0x500001f0 }, - FinalRegs = new uint[] { 0x6d2c2ac7, 0xdd2b59f4, 0x3fc013f4, 0x567e744e, 0xc4feb096, 0x188454f3, 0xae13338b, 0x66a0a40b, 0xac995945, 0x7e27f097, 0x547cbd54, 0xd2abf0ab, 0x02c08b3e, 0xe6d1283f, 0x00000001, 0x900001f0 }, + Instructions = [0xf09b, 0x0f59, 0x4770, 0xe7fe], + StartRegs = [0x6d2c2ac7, 0xdd2b59f4, 0x3fc013f4, 0x567e744e, 0xc4feb096, 0x188454f3, 0xae13338b, 0x66a0a40b, 0xac995945, 0x7e27f097, 0x547cbd54, 0xd2abf0ab, 0x02c08b3e, 0xe6d1283f, 0x00000001, 0x500001f0 + ], + FinalRegs = [0x6d2c2ac7, 0xdd2b59f4, 0x3fc013f4, 0x567e744e, 0xc4feb096, 0x188454f3, 0xae13338b, 0x66a0a40b, 0xac995945, 0x7e27f097, 0x547cbd54, 0xd2abf0ab, 0x02c08b3e, 0xe6d1283f, 0x00000001, 0x900001f0 + ], }, new() { - Instructions = new ushort[] { 0xf494, 0x6f3d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x16342d21, 0xff794fb0, 0x513ba230, 0x7b9e4b2b, 0x9a2d1ba9, 0xebce0dae, 0xe792f2b8, 0xf4932236, 0x0bcd9542, 0x12bcab94, 0x0110b845, 0xdde237b0, 0xa401d5b9, 0xc3162f6d, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0x16342d21, 0xff794fb0, 0x513ba230, 0x7b9e4b2b, 0x9a2d1ba9, 0xebce0dae, 0xe792f2b8, 0xf4932236, 0x0bcd9542, 0x12bcab94, 0x0110b845, 0xdde237b0, 0xa401d5b9, 0xc3162f6d, 0x00000001, 0x800001f0 }, + Instructions = [0xf494, 0x6f3d, 0x4770, 0xe7fe], + StartRegs = [0x16342d21, 0xff794fb0, 0x513ba230, 0x7b9e4b2b, 0x9a2d1ba9, 0xebce0dae, 0xe792f2b8, 0xf4932236, 0x0bcd9542, 0x12bcab94, 0x0110b845, 0xdde237b0, 0xa401d5b9, 0xc3162f6d, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0x16342d21, 0xff794fb0, 0x513ba230, 0x7b9e4b2b, 0x9a2d1ba9, 0xebce0dae, 0xe792f2b8, 0xf4932236, 0x0bcd9542, 0x12bcab94, 0x0110b845, 0xdde237b0, 0xa401d5b9, 0xc3162f6d, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf09c, 0x6f59, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x8d9e2002, 0xfa519294, 0x700740d6, 0x29220c73, 0x8f0ad8b2, 0x6ce9d5e8, 0x12f9da7a, 0x286a9813, 0x2be49d73, 0x16241aa1, 0xe096f43b, 0x1fd0d3e2, 0x31791bb5, 0xa4943f4e, 0x00000001, 0xe00001f0 }, - FinalRegs = new uint[] { 0x8d9e2002, 0xfa519294, 0x700740d6, 0x29220c73, 0x8f0ad8b2, 0x6ce9d5e8, 0x12f9da7a, 0x286a9813, 0x2be49d73, 0x16241aa1, 0xe096f43b, 0x1fd0d3e2, 0x31791bb5, 0xa4943f4e, 0x00000001, 0x000001f0 }, + Instructions = [0xf09c, 0x6f59, 0x4770, 0xe7fe], + StartRegs = [0x8d9e2002, 0xfa519294, 0x700740d6, 0x29220c73, 0x8f0ad8b2, 0x6ce9d5e8, 0x12f9da7a, 0x286a9813, 0x2be49d73, 0x16241aa1, 0xe096f43b, 0x1fd0d3e2, 0x31791bb5, 0xa4943f4e, 0x00000001, 0xe00001f0 + ], + FinalRegs = [0x8d9e2002, 0xfa519294, 0x700740d6, 0x29220c73, 0x8f0ad8b2, 0x6ce9d5e8, 0x12f9da7a, 0x286a9813, 0x2be49d73, 0x16241aa1, 0xe096f43b, 0x1fd0d3e2, 0x31791bb5, 0xa4943f4e, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf094, 0x6f35, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x222e0e7c, 0xa89d1fdf, 0xa7d67bc3, 0x658e1ee9, 0x10b41780, 0x5cd566a4, 0xce03a58a, 0x63fb9a9e, 0x4f5cb2bd, 0x14e72619, 0x296a9bd5, 0xbf7b1fb1, 0x705a45cc, 0xba8540ae, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0x222e0e7c, 0xa89d1fdf, 0xa7d67bc3, 0x658e1ee9, 0x10b41780, 0x5cd566a4, 0xce03a58a, 0x63fb9a9e, 0x4f5cb2bd, 0x14e72619, 0x296a9bd5, 0xbf7b1fb1, 0x705a45cc, 0xba8540ae, 0x00000001, 0x000001f0 }, + Instructions = [0xf094, 0x6f35, 0x4770, 0xe7fe], + StartRegs = [0x222e0e7c, 0xa89d1fdf, 0xa7d67bc3, 0x658e1ee9, 0x10b41780, 0x5cd566a4, 0xce03a58a, 0x63fb9a9e, 0x4f5cb2bd, 0x14e72619, 0x296a9bd5, 0xbf7b1fb1, 0x705a45cc, 0xba8540ae, 0x00000001, 0x000001f0 + ], + FinalRegs = [0x222e0e7c, 0xa89d1fdf, 0xa7d67bc3, 0x658e1ee9, 0x10b41780, 0x5cd566a4, 0xce03a58a, 0x63fb9a9e, 0x4f5cb2bd, 0x14e72619, 0x296a9bd5, 0xbf7b1fb1, 0x705a45cc, 0xba8540ae, 0x00000001, 0x000001f0 + ], }, // EOR (imm) new() { - Instructions = new ushort[] { 0xf496, 0x54fb, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6267728b, 0xc834f7c7, 0xa136a1d6, 0xfd9533e9, 0x096db729, 0x8fff8a73, 0x6a45348e, 0xd52111ed, 0xa5640aff, 0xa4cf82a6, 0x5ab70b5c, 0x5b3c4563, 0xf1a91ab7, 0x5718fdd1, 0x00000001, 0x500001f0 }, - FinalRegs = new uint[] { 0x6267728b, 0xc834f7c7, 0xa136a1d6, 0xfd9533e9, 0x6a452bee, 0x8fff8a73, 0x6a45348e, 0xd52111ed, 0xa5640aff, 0xa4cf82a6, 0x5ab70b5c, 0x5b3c4563, 0xf1a91ab7, 0x5718fdd1, 0x00000001, 0x100001f0 }, + Instructions = [0xf496, 0x54fb, 0x4770, 0xe7fe], + StartRegs = [0x6267728b, 0xc834f7c7, 0xa136a1d6, 0xfd9533e9, 0x096db729, 0x8fff8a73, 0x6a45348e, 0xd52111ed, 0xa5640aff, 0xa4cf82a6, 0x5ab70b5c, 0x5b3c4563, 0xf1a91ab7, 0x5718fdd1, 0x00000001, 0x500001f0 + ], + FinalRegs = [0x6267728b, 0xc834f7c7, 0xa136a1d6, 0xfd9533e9, 0x6a452bee, 0x8fff8a73, 0x6a45348e, 0xd52111ed, 0xa5640aff, 0xa4cf82a6, 0x5ab70b5c, 0x5b3c4563, 0xf1a91ab7, 0x5718fdd1, 0x00000001, 0x100001f0 + ], }, new() { - Instructions = new ushort[] { 0xf08a, 0x339d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xbf1e6da6, 0x2c10408a, 0xe961ddde, 0x5add8306, 0xc266064d, 0xa79569e1, 0x945c28ed, 0xb996f578, 0x68082b6e, 0x14cdd2c7, 0x7d0cc6a2, 0x8d6edfbf, 0x9151e24c, 0x63eaee32, 0x00000001, 0x300001f0 }, - FinalRegs = new uint[] { 0xbf1e6da6, 0x2c10408a, 0xe961ddde, 0xe0915b3f, 0xc266064d, 0xa79569e1, 0x945c28ed, 0xb996f578, 0x68082b6e, 0x14cdd2c7, 0x7d0cc6a2, 0x8d6edfbf, 0x9151e24c, 0x63eaee32, 0x00000001, 0x300001f0 }, + Instructions = [0xf08a, 0x339d, 0x4770, 0xe7fe], + StartRegs = [0xbf1e6da6, 0x2c10408a, 0xe961ddde, 0x5add8306, 0xc266064d, 0xa79569e1, 0x945c28ed, 0xb996f578, 0x68082b6e, 0x14cdd2c7, 0x7d0cc6a2, 0x8d6edfbf, 0x9151e24c, 0x63eaee32, 0x00000001, 0x300001f0 + ], + FinalRegs = [0xbf1e6da6, 0x2c10408a, 0xe961ddde, 0xe0915b3f, 0xc266064d, 0xa79569e1, 0x945c28ed, 0xb996f578, 0x68082b6e, 0x14cdd2c7, 0x7d0cc6a2, 0x8d6edfbf, 0x9151e24c, 0x63eaee32, 0x00000001, 0x300001f0 + ], }, new() { - Instructions = new ushort[] { 0xf490, 0x27d8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd6826a86, 0x39aa35f5, 0x2a8a913e, 0xd9dbf560, 0xcb1a9957, 0xe6779d2f, 0x0eeab3f9, 0xa463d4c2, 0xb3187660, 0xa51778c3, 0x73817179, 0x6d6dae92, 0x864a3e80, 0x43d8f181, 0x00000001, 0xe00001f0 }, - FinalRegs = new uint[] { 0xd6826a86, 0x39aa35f5, 0x2a8a913e, 0xd9dbf560, 0xcb1a9957, 0xe6779d2f, 0x0eeab3f9, 0xd684aa86, 0xb3187660, 0xa51778c3, 0x73817179, 0x6d6dae92, 0x864a3e80, 0x43d8f181, 0x00000001, 0x800001f0 }, + Instructions = [0xf490, 0x27d8, 0x4770, 0xe7fe], + StartRegs = [0xd6826a86, 0x39aa35f5, 0x2a8a913e, 0xd9dbf560, 0xcb1a9957, 0xe6779d2f, 0x0eeab3f9, 0xa463d4c2, 0xb3187660, 0xa51778c3, 0x73817179, 0x6d6dae92, 0x864a3e80, 0x43d8f181, 0x00000001, 0xe00001f0 + ], + FinalRegs = [0xd6826a86, 0x39aa35f5, 0x2a8a913e, 0xd9dbf560, 0xcb1a9957, 0xe6779d2f, 0x0eeab3f9, 0xd684aa86, 0xb3187660, 0xa51778c3, 0x73817179, 0x6d6dae92, 0x864a3e80, 0x43d8f181, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf485, 0x3d32, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x063885c0, 0xa183a44d, 0x5cb2f961, 0xe44b8670, 0x8ec25495, 0xb8f5a831, 0x1c2fecb4, 0xfc15fcff, 0x28dd902e, 0xf0c875f4, 0x0af03bb5, 0xefe4ba8b, 0x10e57000, 0x4cd51767, 0x00000001, 0xb00001f0 }, - FinalRegs = new uint[] { 0x063885c0, 0xa183a44d, 0x5cb2f961, 0xe44b8670, 0x8ec25495, 0xb8f5a831, 0x1c2fecb4, 0xfc15fcff, 0x28dd902e, 0xf0c875f4, 0x0af03bb5, 0xefe4ba8b, 0x10e57000, 0xb8f76031, 0x00000001, 0xb00001f0 }, + Instructions = [0xf485, 0x3d32, 0x4770, 0xe7fe], + StartRegs = [0x063885c0, 0xa183a44d, 0x5cb2f961, 0xe44b8670, 0x8ec25495, 0xb8f5a831, 0x1c2fecb4, 0xfc15fcff, 0x28dd902e, 0xf0c875f4, 0x0af03bb5, 0xefe4ba8b, 0x10e57000, 0x4cd51767, 0x00000001, 0xb00001f0 + ], + FinalRegs = [0x063885c0, 0xa183a44d, 0x5cb2f961, 0xe44b8670, 0x8ec25495, 0xb8f5a831, 0x1c2fecb4, 0xfc15fcff, 0x28dd902e, 0xf0c875f4, 0x0af03bb5, 0xefe4ba8b, 0x10e57000, 0xb8f76031, 0x00000001, 0xb00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf095, 0x58e8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5a60610b, 0x4d178413, 0x3b12edd0, 0x23afc7fc, 0x47f0647d, 0x327bd294, 0x52351d80, 0x36733323, 0x490a0d2a, 0x75d5888c, 0x9b45f4e6, 0x89ebf7dc, 0xd278dd78, 0x1b9b0bbd, 0x00000001, 0x400001f0 }, - FinalRegs = new uint[] { 0x5a60610b, 0x4d178413, 0x3b12edd0, 0x23afc7fc, 0x47f0647d, 0x327bd294, 0x52351d80, 0x36733323, 0x2f7bd294, 0x75d5888c, 0x9b45f4e6, 0x89ebf7dc, 0xd278dd78, 0x1b9b0bbd, 0x00000001, 0x000001f0 }, + Instructions = [0xf095, 0x58e8, 0x4770, 0xe7fe], + StartRegs = [0x5a60610b, 0x4d178413, 0x3b12edd0, 0x23afc7fc, 0x47f0647d, 0x327bd294, 0x52351d80, 0x36733323, 0x490a0d2a, 0x75d5888c, 0x9b45f4e6, 0x89ebf7dc, 0xd278dd78, 0x1b9b0bbd, 0x00000001, 0x400001f0 + ], + FinalRegs = [0x5a60610b, 0x4d178413, 0x3b12edd0, 0x23afc7fc, 0x47f0647d, 0x327bd294, 0x52351d80, 0x36733323, 0x2f7bd294, 0x75d5888c, 0x9b45f4e6, 0x89ebf7dc, 0xd278dd78, 0x1b9b0bbd, 0x00000001, 0x000001f0 + ], }, // CMN (imm) new() { - Instructions = new ushort[] { 0xf514, 0x6f12, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xec864396, 0xe2f483b8, 0x18df08c9, 0xae7780ba, 0xd16bc913, 0x892037de, 0x84a3589e, 0x3a468960, 0x004f92e4, 0x6fd793c2, 0x81b048c6, 0xe044e7cf, 0x2199ccda, 0x4667415d, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0xec864396, 0xe2f483b8, 0x18df08c9, 0xae7780ba, 0xd16bc913, 0x892037de, 0x84a3589e, 0x3a468960, 0x004f92e4, 0x6fd793c2, 0x81b048c6, 0xe044e7cf, 0x2199ccda, 0x4667415d, 0x00000001, 0x800001f0 }, + Instructions = [0xf514, 0x6f12, 0x4770, 0xe7fe], + StartRegs = [0xec864396, 0xe2f483b8, 0x18df08c9, 0xae7780ba, 0xd16bc913, 0x892037de, 0x84a3589e, 0x3a468960, 0x004f92e4, 0x6fd793c2, 0x81b048c6, 0xe044e7cf, 0x2199ccda, 0x4667415d, 0x00000001, 0x000001f0 + ], + FinalRegs = [0xec864396, 0xe2f483b8, 0x18df08c9, 0xae7780ba, 0xd16bc913, 0x892037de, 0x84a3589e, 0x3a468960, 0x004f92e4, 0x6fd793c2, 0x81b048c6, 0xe044e7cf, 0x2199ccda, 0x4667415d, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf517, 0x2f38, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x154548b0, 0x28aed64c, 0x533306b3, 0x8eace432, 0x9a6523f1, 0x22b08ccb, 0xe7fceaf6, 0x45429c2c, 0xf58378c1, 0x0ef49416, 0x88dbd472, 0xf6a35b6c, 0x46b19364, 0x52e4982d, 0x00000001, 0x900001f0 }, - FinalRegs = new uint[] { 0x154548b0, 0x28aed64c, 0x533306b3, 0x8eace432, 0x9a6523f1, 0x22b08ccb, 0xe7fceaf6, 0x45429c2c, 0xf58378c1, 0x0ef49416, 0x88dbd472, 0xf6a35b6c, 0x46b19364, 0x52e4982d, 0x00000001, 0x000001f0 }, + Instructions = [0xf517, 0x2f38, 0x4770, 0xe7fe], + StartRegs = [0x154548b0, 0x28aed64c, 0x533306b3, 0x8eace432, 0x9a6523f1, 0x22b08ccb, 0xe7fceaf6, 0x45429c2c, 0xf58378c1, 0x0ef49416, 0x88dbd472, 0xf6a35b6c, 0x46b19364, 0x52e4982d, 0x00000001, 0x900001f0 + ], + FinalRegs = [0x154548b0, 0x28aed64c, 0x533306b3, 0x8eace432, 0x9a6523f1, 0x22b08ccb, 0xe7fceaf6, 0x45429c2c, 0xf58378c1, 0x0ef49416, 0x88dbd472, 0xf6a35b6c, 0x46b19364, 0x52e4982d, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf116, 0x7fe2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x30b90186, 0xec7b038f, 0xcb392feb, 0x10c09c2f, 0x8619521d, 0xcf8d7075, 0x108f8f49, 0x6e44275d, 0x1728faed, 0xf2a0b2a4, 0x783cf97f, 0x201d6d0b, 0x317f276d, 0x5a7186e2, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0x30b90186, 0xec7b038f, 0xcb392feb, 0x10c09c2f, 0x8619521d, 0xcf8d7075, 0x108f8f49, 0x6e44275d, 0x1728faed, 0xf2a0b2a4, 0x783cf97f, 0x201d6d0b, 0x317f276d, 0x5a7186e2, 0x00000001, 0x000001f0 }, + Instructions = [0xf116, 0x7fe2, 0x4770, 0xe7fe], + StartRegs = [0x30b90186, 0xec7b038f, 0xcb392feb, 0x10c09c2f, 0x8619521d, 0xcf8d7075, 0x108f8f49, 0x6e44275d, 0x1728faed, 0xf2a0b2a4, 0x783cf97f, 0x201d6d0b, 0x317f276d, 0x5a7186e2, 0x00000001, 0x200001f0 + ], + FinalRegs = [0x30b90186, 0xec7b038f, 0xcb392feb, 0x10c09c2f, 0x8619521d, 0xcf8d7075, 0x108f8f49, 0x6e44275d, 0x1728faed, 0xf2a0b2a4, 0x783cf97f, 0x201d6d0b, 0x317f276d, 0x5a7186e2, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf51b, 0x7f4a, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xedd3c03d, 0xd7cce5a2, 0xfc40b40a, 0x6a9c96f3, 0x40ca8c2d, 0xaa2973e1, 0xd7953408, 0xfa11d2df, 0x7cec28c2, 0x4e523380, 0x007a4ac6, 0x03890c29, 0xd1495b3e, 0xdf1af969, 0x00000001, 0x500001f0 }, - FinalRegs = new uint[] { 0xedd3c03d, 0xd7cce5a2, 0xfc40b40a, 0x6a9c96f3, 0x40ca8c2d, 0xaa2973e1, 0xd7953408, 0xfa11d2df, 0x7cec28c2, 0x4e523380, 0x007a4ac6, 0x03890c29, 0xd1495b3e, 0xdf1af969, 0x00000001, 0x000001f0 }, + Instructions = [0xf51b, 0x7f4a, 0x4770, 0xe7fe], + StartRegs = [0xedd3c03d, 0xd7cce5a2, 0xfc40b40a, 0x6a9c96f3, 0x40ca8c2d, 0xaa2973e1, 0xd7953408, 0xfa11d2df, 0x7cec28c2, 0x4e523380, 0x007a4ac6, 0x03890c29, 0xd1495b3e, 0xdf1af969, 0x00000001, 0x500001f0 + ], + FinalRegs = [0xedd3c03d, 0xd7cce5a2, 0xfc40b40a, 0x6a9c96f3, 0x40ca8c2d, 0xaa2973e1, 0xd7953408, 0xfa11d2df, 0x7cec28c2, 0x4e523380, 0x007a4ac6, 0x03890c29, 0xd1495b3e, 0xdf1af969, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf11c, 0x5f9c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd8c0c360, 0xd50bcc87, 0xe265e8b2, 0xca49cc71, 0xa6bb11c8, 0x13649388, 0x034a4c8c, 0xa3b4c570, 0x014d32ac, 0x1847d102, 0x7fc3678d, 0xb0e0f469, 0x9508a619, 0x2a2372e0, 0x00000001, 0xa00001f0 }, - FinalRegs = new uint[] { 0xd8c0c360, 0xd50bcc87, 0xe265e8b2, 0xca49cc71, 0xa6bb11c8, 0x13649388, 0x034a4c8c, 0xa3b4c570, 0x014d32ac, 0x1847d102, 0x7fc3678d, 0xb0e0f469, 0x9508a619, 0x2a2372e0, 0x00000001, 0x800001f0 }, + Instructions = [0xf11c, 0x5f9c, 0x4770, 0xe7fe], + StartRegs = [0xd8c0c360, 0xd50bcc87, 0xe265e8b2, 0xca49cc71, 0xa6bb11c8, 0x13649388, 0x034a4c8c, 0xa3b4c570, 0x014d32ac, 0x1847d102, 0x7fc3678d, 0xb0e0f469, 0x9508a619, 0x2a2372e0, 0x00000001, 0xa00001f0 + ], + FinalRegs = [0xd8c0c360, 0xd50bcc87, 0xe265e8b2, 0xca49cc71, 0xa6bb11c8, 0x13649388, 0x034a4c8c, 0xa3b4c570, 0x014d32ac, 0x1847d102, 0x7fc3678d, 0xb0e0f469, 0x9508a619, 0x2a2372e0, 0x00000001, 0x800001f0 + ], }, // ADD (imm) new() { - Instructions = new ushort[] { 0xf10b, 0x00e0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xadc2fe68, 0xa8a14518, 0x5baf5e87, 0x17e2b502, 0x638227c2, 0xba11428f, 0x98c5b963, 0x5b9cbcd3, 0xb4c11f97, 0x0ca6832e, 0xea26efa6, 0x7bb19ec8, 0x8ea04a89, 0x62d597c2, 0x00000001, 0x300001f0 }, - FinalRegs = new uint[] { 0x7bb19fa8, 0xa8a14518, 0x5baf5e87, 0x17e2b502, 0x638227c2, 0xba11428f, 0x98c5b963, 0x5b9cbcd3, 0xb4c11f97, 0x0ca6832e, 0xea26efa6, 0x7bb19ec8, 0x8ea04a89, 0x62d597c2, 0x00000001, 0x300001f0 }, + Instructions = [0xf10b, 0x00e0, 0x4770, 0xe7fe], + StartRegs = [0xadc2fe68, 0xa8a14518, 0x5baf5e87, 0x17e2b502, 0x638227c2, 0xba11428f, 0x98c5b963, 0x5b9cbcd3, 0xb4c11f97, 0x0ca6832e, 0xea26efa6, 0x7bb19ec8, 0x8ea04a89, 0x62d597c2, 0x00000001, 0x300001f0 + ], + FinalRegs = [0x7bb19fa8, 0xa8a14518, 0x5baf5e87, 0x17e2b502, 0x638227c2, 0xba11428f, 0x98c5b963, 0x5b9cbcd3, 0xb4c11f97, 0x0ca6832e, 0xea26efa6, 0x7bb19ec8, 0x8ea04a89, 0x62d597c2, 0x00000001, 0x300001f0 + ], }, new() { - Instructions = new ushort[] { 0xf114, 0x7b41, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x9366f694, 0x02670e58, 0x6f3e74b8, 0x567d3e30, 0xeebb29c4, 0xc25ce8e6, 0x942b94c8, 0xc7dccdd9, 0xccfe17a9, 0xeacc4db1, 0xbbbc0fde, 0x248b7093, 0x7f66c92d, 0xfc063cb6, 0x00000001, 0xe00001f0 }, - FinalRegs = new uint[] { 0x9366f694, 0x02670e58, 0x6f3e74b8, 0x567d3e30, 0xeebb29c4, 0xc25ce8e6, 0x942b94c8, 0xc7dccdd9, 0xccfe17a9, 0xeacc4db1, 0xbbbc0fde, 0xf1bf29c4, 0x7f66c92d, 0xfc063cb6, 0x00000001, 0x800001f0 }, + Instructions = [0xf114, 0x7b41, 0x4770, 0xe7fe], + StartRegs = [0x9366f694, 0x02670e58, 0x6f3e74b8, 0x567d3e30, 0xeebb29c4, 0xc25ce8e6, 0x942b94c8, 0xc7dccdd9, 0xccfe17a9, 0xeacc4db1, 0xbbbc0fde, 0x248b7093, 0x7f66c92d, 0xfc063cb6, 0x00000001, 0xe00001f0 + ], + FinalRegs = [0x9366f694, 0x02670e58, 0x6f3e74b8, 0x567d3e30, 0xeebb29c4, 0xc25ce8e6, 0x942b94c8, 0xc7dccdd9, 0xccfe17a9, 0xeacc4db1, 0xbbbc0fde, 0xf1bf29c4, 0x7f66c92d, 0xfc063cb6, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf51c, 0x21d1, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x2b53ae1e, 0x733046c3, 0xbcc33a3a, 0x2f7bbd50, 0xed2a39f2, 0xfee631ec, 0xeb6d3bc3, 0x9f9b502d, 0x30d20f7b, 0xdc75211b, 0xdb234e2b, 0x85008c86, 0x43beb508, 0x6a8303d5, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0x2b53ae1e, 0x43c53d08, 0xbcc33a3a, 0x2f7bbd50, 0xed2a39f2, 0xfee631ec, 0xeb6d3bc3, 0x9f9b502d, 0x30d20f7b, 0xdc75211b, 0xdb234e2b, 0x85008c86, 0x43beb508, 0x6a8303d5, 0x00000001, 0x000001f0 }, + Instructions = [0xf51c, 0x21d1, 0x4770, 0xe7fe], + StartRegs = [0x2b53ae1e, 0x733046c3, 0xbcc33a3a, 0x2f7bbd50, 0xed2a39f2, 0xfee631ec, 0xeb6d3bc3, 0x9f9b502d, 0x30d20f7b, 0xdc75211b, 0xdb234e2b, 0x85008c86, 0x43beb508, 0x6a8303d5, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0x2b53ae1e, 0x43c53d08, 0xbcc33a3a, 0x2f7bbd50, 0xed2a39f2, 0xfee631ec, 0xeb6d3bc3, 0x9f9b502d, 0x30d20f7b, 0xdc75211b, 0xdb234e2b, 0x85008c86, 0x43beb508, 0x6a8303d5, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf513, 0x22e8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xbb3b52c1, 0x40ff59f3, 0x05ca09c5, 0x440114be, 0xec3a4022, 0x0ff93d8c, 0x38868879, 0x824d36d8, 0xf513a9d8, 0xf1d0ad5a, 0xc453fdd8, 0xe3dc8d52, 0x1fc5a9ef, 0x809dbe9b, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0xbb3b52c1, 0x40ff59f3, 0x440854be, 0x440114be, 0xec3a4022, 0x0ff93d8c, 0x38868879, 0x824d36d8, 0xf513a9d8, 0xf1d0ad5a, 0xc453fdd8, 0xe3dc8d52, 0x1fc5a9ef, 0x809dbe9b, 0x00000001, 0x000001f0 }, + Instructions = [0xf513, 0x22e8, 0x4770, 0xe7fe], + StartRegs = [0xbb3b52c1, 0x40ff59f3, 0x05ca09c5, 0x440114be, 0xec3a4022, 0x0ff93d8c, 0x38868879, 0x824d36d8, 0xf513a9d8, 0xf1d0ad5a, 0xc453fdd8, 0xe3dc8d52, 0x1fc5a9ef, 0x809dbe9b, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0xbb3b52c1, 0x40ff59f3, 0x440854be, 0x440114be, 0xec3a4022, 0x0ff93d8c, 0x38868879, 0x824d36d8, 0xf513a9d8, 0xf1d0ad5a, 0xc453fdd8, 0xe3dc8d52, 0x1fc5a9ef, 0x809dbe9b, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf518, 0x68c7, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xf9c00a78, 0xf47ee408, 0xdc31e40b, 0x167902da, 0x03b23f2f, 0x6d41efdc, 0x9cb99b17, 0x21bfbf63, 0x9fbe8105, 0x250087d0, 0xe0588965, 0x0f0f669c, 0x2ed04b37, 0xc65c6e2e, 0x00000001, 0x100001f0 }, - FinalRegs = new uint[] { 0xf9c00a78, 0xf47ee408, 0xdc31e40b, 0x167902da, 0x03b23f2f, 0x6d41efdc, 0x9cb99b17, 0x21bfbf63, 0x9fbe873d, 0x250087d0, 0xe0588965, 0x0f0f669c, 0x2ed04b37, 0xc65c6e2e, 0x00000001, 0x800001f0 }, + Instructions = [0xf518, 0x68c7, 0x4770, 0xe7fe], + StartRegs = [0xf9c00a78, 0xf47ee408, 0xdc31e40b, 0x167902da, 0x03b23f2f, 0x6d41efdc, 0x9cb99b17, 0x21bfbf63, 0x9fbe8105, 0x250087d0, 0xe0588965, 0x0f0f669c, 0x2ed04b37, 0xc65c6e2e, 0x00000001, 0x100001f0 + ], + FinalRegs = [0xf9c00a78, 0xf47ee408, 0xdc31e40b, 0x167902da, 0x03b23f2f, 0x6d41efdc, 0x9cb99b17, 0x21bfbf63, 0x9fbe873d, 0x250087d0, 0xe0588965, 0x0f0f669c, 0x2ed04b37, 0xc65c6e2e, 0x00000001, 0x800001f0 + ], }, // ADC (imm) new() { - Instructions = new ushort[] { 0xf54d, 0x379a, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x09eb57e5, 0xc9981095, 0x94b0bf26, 0x27080c39, 0x9fba115a, 0xde0e1533, 0xaa5916aa, 0x1bfc2313, 0x32a96f13, 0x5b8f2d6c, 0x9098dcf2, 0x86143a3f, 0x5c004908, 0xd233cd08, 0x00000001, 0x300001f0 }, - FinalRegs = new uint[] { 0x09eb57e5, 0xc9981095, 0x94b0bf26, 0x27080c39, 0x9fba115a, 0xde0e1533, 0xaa5916aa, 0xd2350109, 0x32a96f13, 0x5b8f2d6c, 0x9098dcf2, 0x86143a3f, 0x5c004908, 0xd233cd08, 0x00000001, 0x300001f0 }, + Instructions = [0xf54d, 0x379a, 0x4770, 0xe7fe], + StartRegs = [0x09eb57e5, 0xc9981095, 0x94b0bf26, 0x27080c39, 0x9fba115a, 0xde0e1533, 0xaa5916aa, 0x1bfc2313, 0x32a96f13, 0x5b8f2d6c, 0x9098dcf2, 0x86143a3f, 0x5c004908, 0xd233cd08, 0x00000001, 0x300001f0 + ], + FinalRegs = [0x09eb57e5, 0xc9981095, 0x94b0bf26, 0x27080c39, 0x9fba115a, 0xde0e1533, 0xaa5916aa, 0xd2350109, 0x32a96f13, 0x5b8f2d6c, 0x9098dcf2, 0x86143a3f, 0x5c004908, 0xd233cd08, 0x00000001, 0x300001f0 + ], }, new() { - Instructions = new ushort[] { 0xf149, 0x3a77, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xe32aaf45, 0x05fe0eac, 0x9c782c15, 0x9301164b, 0xa2f59aea, 0xe6b2618b, 0xfceb237a, 0xcfeb98bd, 0xaaa75e8d, 0xbb57f750, 0xd282f40d, 0xa181d4d7, 0x93313b48, 0x9a64c67f, 0x00000001, 0xf00001f0 }, - FinalRegs = new uint[] { 0xe32aaf45, 0x05fe0eac, 0x9c782c15, 0x9301164b, 0xa2f59aea, 0xe6b2618b, 0xfceb237a, 0xcfeb98bd, 0xaaa75e8d, 0xbb57f750, 0x32cf6ec8, 0xa181d4d7, 0x93313b48, 0x9a64c67f, 0x00000001, 0xf00001f0 }, + Instructions = [0xf149, 0x3a77, 0x4770, 0xe7fe], + StartRegs = [0xe32aaf45, 0x05fe0eac, 0x9c782c15, 0x9301164b, 0xa2f59aea, 0xe6b2618b, 0xfceb237a, 0xcfeb98bd, 0xaaa75e8d, 0xbb57f750, 0xd282f40d, 0xa181d4d7, 0x93313b48, 0x9a64c67f, 0x00000001, 0xf00001f0 + ], + FinalRegs = [0xe32aaf45, 0x05fe0eac, 0x9c782c15, 0x9301164b, 0xa2f59aea, 0xe6b2618b, 0xfceb237a, 0xcfeb98bd, 0xaaa75e8d, 0xbb57f750, 0x32cf6ec8, 0xa181d4d7, 0x93313b48, 0x9a64c67f, 0x00000001, 0xf00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf549, 0x57c8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x67da941e, 0x5d744410, 0x1f93bf8f, 0xb52727e0, 0x77ce10fe, 0xe7a40291, 0x40ac5a1f, 0x127e801f, 0x68233546, 0xdbe8086f, 0x82b65e68, 0xcf35c09b, 0x8846e02d, 0x5fd54256, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0x67da941e, 0x5d744410, 0x1f93bf8f, 0xb52727e0, 0x77ce10fe, 0xe7a40291, 0x40ac5a1f, 0xdbe82170, 0x68233546, 0xdbe8086f, 0x82b65e68, 0xcf35c09b, 0x8846e02d, 0x5fd54256, 0x00000001, 0x200001f0 }, + Instructions = [0xf549, 0x57c8, 0x4770, 0xe7fe], + StartRegs = [0x67da941e, 0x5d744410, 0x1f93bf8f, 0xb52727e0, 0x77ce10fe, 0xe7a40291, 0x40ac5a1f, 0x127e801f, 0x68233546, 0xdbe8086f, 0x82b65e68, 0xcf35c09b, 0x8846e02d, 0x5fd54256, 0x00000001, 0x200001f0 + ], + FinalRegs = [0x67da941e, 0x5d744410, 0x1f93bf8f, 0xb52727e0, 0x77ce10fe, 0xe7a40291, 0x40ac5a1f, 0xdbe82170, 0x68233546, 0xdbe8086f, 0x82b65e68, 0xcf35c09b, 0x8846e02d, 0x5fd54256, 0x00000001, 0x200001f0 + ], }, new() { - Instructions = new ushort[] { 0xf15c, 0x1649, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x86cf07b1, 0x1c86e00f, 0x8dc39789, 0xe8fafb40, 0xb837bf22, 0xe9c2c765, 0xb9e8b84b, 0xdbc9663e, 0x979b81da, 0xfb7a5636, 0x9012981d, 0xf52ec47c, 0xf98f6294, 0xaf70ff24, 0x00000001, 0xe00001f0 }, - FinalRegs = new uint[] { 0x86cf07b1, 0x1c86e00f, 0x8dc39789, 0xe8fafb40, 0xb837bf22, 0xe9c2c765, 0xf9d862de, 0xdbc9663e, 0x979b81da, 0xfb7a5636, 0x9012981d, 0xf52ec47c, 0xf98f6294, 0xaf70ff24, 0x00000001, 0x800001f0 }, + Instructions = [0xf15c, 0x1649, 0x4770, 0xe7fe], + StartRegs = [0x86cf07b1, 0x1c86e00f, 0x8dc39789, 0xe8fafb40, 0xb837bf22, 0xe9c2c765, 0xb9e8b84b, 0xdbc9663e, 0x979b81da, 0xfb7a5636, 0x9012981d, 0xf52ec47c, 0xf98f6294, 0xaf70ff24, 0x00000001, 0xe00001f0 + ], + FinalRegs = [0x86cf07b1, 0x1c86e00f, 0x8dc39789, 0xe8fafb40, 0xb837bf22, 0xe9c2c765, 0xf9d862de, 0xdbc9663e, 0x979b81da, 0xfb7a5636, 0x9012981d, 0xf52ec47c, 0xf98f6294, 0xaf70ff24, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf144, 0x6ab6, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x151549e7, 0xbdfa6ced, 0x47ba5025, 0xaba24048, 0x17c38ef8, 0xf92095ec, 0xdccd5b6f, 0xcb3878a5, 0x30d25594, 0x94886d84, 0xaec74633, 0xbe39725f, 0x439d8ef1, 0xcd66a204, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0x151549e7, 0xbdfa6ced, 0x47ba5025, 0xaba24048, 0x17c38ef8, 0xf92095ec, 0xdccd5b6f, 0xcb3878a5, 0x30d25594, 0x94886d84, 0x1d738ef8, 0xbe39725f, 0x439d8ef1, 0xcd66a204, 0x00000001, 0x000001f0 }, + Instructions = [0xf144, 0x6ab6, 0x4770, 0xe7fe], + StartRegs = [0x151549e7, 0xbdfa6ced, 0x47ba5025, 0xaba24048, 0x17c38ef8, 0xf92095ec, 0xdccd5b6f, 0xcb3878a5, 0x30d25594, 0x94886d84, 0xaec74633, 0xbe39725f, 0x439d8ef1, 0xcd66a204, 0x00000001, 0x000001f0 + ], + FinalRegs = [0x151549e7, 0xbdfa6ced, 0x47ba5025, 0xaba24048, 0x17c38ef8, 0xf92095ec, 0xdccd5b6f, 0xcb3878a5, 0x30d25594, 0x94886d84, 0x1d738ef8, 0xbe39725f, 0x439d8ef1, 0xcd66a204, 0x00000001, 0x000001f0 + ], }, // SBC (imm) new() { - Instructions = new ushort[] { 0xf565, 0x3beb, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x23efd21b, 0x78e2f658, 0x37a4e044, 0x8feab92a, 0x9795995f, 0x66c7ddab, 0x1c29040f, 0x10034172, 0x2eede540, 0x961c1400, 0x34cf45b9, 0xdb736f38, 0xd601c8ed, 0x99a714af, 0x00000001, 0xf00001f0 }, - FinalRegs = new uint[] { 0x23efd21b, 0x78e2f658, 0x37a4e044, 0x8feab92a, 0x9795995f, 0x66c7ddab, 0x1c29040f, 0x10034172, 0x2eede540, 0x961c1400, 0x34cf45b9, 0x66c607ab, 0xd601c8ed, 0x99a714af, 0x00000001, 0xf00001f0 }, + Instructions = [0xf565, 0x3beb, 0x4770, 0xe7fe], + StartRegs = [0x23efd21b, 0x78e2f658, 0x37a4e044, 0x8feab92a, 0x9795995f, 0x66c7ddab, 0x1c29040f, 0x10034172, 0x2eede540, 0x961c1400, 0x34cf45b9, 0xdb736f38, 0xd601c8ed, 0x99a714af, 0x00000001, 0xf00001f0 + ], + FinalRegs = [0x23efd21b, 0x78e2f658, 0x37a4e044, 0x8feab92a, 0x9795995f, 0x66c7ddab, 0x1c29040f, 0x10034172, 0x2eede540, 0x961c1400, 0x34cf45b9, 0x66c607ab, 0xd601c8ed, 0x99a714af, 0x00000001, 0xf00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf172, 0x1b0d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x596b63ec, 0xb659c798, 0x300ca58e, 0x52200fa5, 0x0db74ebe, 0x01e5b394, 0xed83d480, 0x1a524b19, 0x593d9bd1, 0x1152a751, 0xf3e1cb1c, 0xfb9392e3, 0x08fc2cd9, 0xc3910cf3, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0x596b63ec, 0xb659c798, 0x300ca58e, 0x52200fa5, 0x0db74ebe, 0x01e5b394, 0xed83d480, 0x1a524b19, 0x593d9bd1, 0x1152a751, 0xf3e1cb1c, 0x2fffa580, 0x08fc2cd9, 0xc3910cf3, 0x00000001, 0x200001f0 }, + Instructions = [0xf172, 0x1b0d, 0x4770, 0xe7fe], + StartRegs = [0x596b63ec, 0xb659c798, 0x300ca58e, 0x52200fa5, 0x0db74ebe, 0x01e5b394, 0xed83d480, 0x1a524b19, 0x593d9bd1, 0x1152a751, 0xf3e1cb1c, 0xfb9392e3, 0x08fc2cd9, 0xc3910cf3, 0x00000001, 0x000001f0 + ], + FinalRegs = [0x596b63ec, 0xb659c798, 0x300ca58e, 0x52200fa5, 0x0db74ebe, 0x01e5b394, 0xed83d480, 0x1a524b19, 0x593d9bd1, 0x1152a751, 0xf3e1cb1c, 0x2fffa580, 0x08fc2cd9, 0xc3910cf3, 0x00000001, 0x200001f0 + ], }, new() { - Instructions = new ushort[] { 0xf57c, 0x14da, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5eab5df9, 0x3cfdd390, 0xcfd20097, 0xc8986688, 0xa714c17c, 0xc9eee620, 0x6626498e, 0x2de48d3c, 0xc27c794f, 0xf7d0c67f, 0x75b6b9d9, 0xbaf9f630, 0x7bd89fad, 0xe5a2e298, 0x00000001, 0xe00001f0 }, - FinalRegs = new uint[] { 0x5eab5df9, 0x3cfdd390, 0xcfd20097, 0xc8986688, 0x7bbd5fad, 0xc9eee620, 0x6626498e, 0x2de48d3c, 0xc27c794f, 0xf7d0c67f, 0x75b6b9d9, 0xbaf9f630, 0x7bd89fad, 0xe5a2e298, 0x00000001, 0x200001f0 }, + Instructions = [0xf57c, 0x14da, 0x4770, 0xe7fe], + StartRegs = [0x5eab5df9, 0x3cfdd390, 0xcfd20097, 0xc8986688, 0xa714c17c, 0xc9eee620, 0x6626498e, 0x2de48d3c, 0xc27c794f, 0xf7d0c67f, 0x75b6b9d9, 0xbaf9f630, 0x7bd89fad, 0xe5a2e298, 0x00000001, 0xe00001f0 + ], + FinalRegs = [0x5eab5df9, 0x3cfdd390, 0xcfd20097, 0xc8986688, 0x7bbd5fad, 0xc9eee620, 0x6626498e, 0x2de48d3c, 0xc27c794f, 0xf7d0c67f, 0x75b6b9d9, 0xbaf9f630, 0x7bd89fad, 0xe5a2e298, 0x00000001, 0x200001f0 + ], }, new() { - Instructions = new ushort[] { 0xf57a, 0x6bbf, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xaee56760, 0xa9f9b7d4, 0x9dd85a8c, 0x4c8cea6b, 0x7807b53d, 0xd1349b90, 0xcf320f62, 0x7af6d0c9, 0xc61fac5f, 0x23b43bbd, 0xef7466b3, 0x98e322a8, 0x1e10ae81, 0xb6987dcc, 0x00000001, 0xa00001f0 }, - FinalRegs = new uint[] { 0xaee56760, 0xa9f9b7d4, 0x9dd85a8c, 0x4c8cea6b, 0x7807b53d, 0xd1349b90, 0xcf320f62, 0x7af6d0c9, 0xc61fac5f, 0x23b43bbd, 0xef7466b3, 0xef7460bb, 0x1e10ae81, 0xb6987dcc, 0x00000001, 0xa00001f0 }, + Instructions = [0xf57a, 0x6bbf, 0x4770, 0xe7fe], + StartRegs = [0xaee56760, 0xa9f9b7d4, 0x9dd85a8c, 0x4c8cea6b, 0x7807b53d, 0xd1349b90, 0xcf320f62, 0x7af6d0c9, 0xc61fac5f, 0x23b43bbd, 0xef7466b3, 0x98e322a8, 0x1e10ae81, 0xb6987dcc, 0x00000001, 0xa00001f0 + ], + FinalRegs = [0xaee56760, 0xa9f9b7d4, 0x9dd85a8c, 0x4c8cea6b, 0x7807b53d, 0xd1349b90, 0xcf320f62, 0x7af6d0c9, 0xc61fac5f, 0x23b43bbd, 0xef7466b3, 0xef7460bb, 0x1e10ae81, 0xb6987dcc, 0x00000001, 0xa00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf171, 0x47e8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x4164d035, 0x72eecb21, 0xbb63329c, 0x8883a249, 0x230b524b, 0x40c059ae, 0x529e2950, 0xd0f7b958, 0xae900a4a, 0xa5a3f2b5, 0xe68da7f3, 0x68fececb, 0x91a2f476, 0x3986b8a0, 0x00000001, 0x400001f0 }, - FinalRegs = new uint[] { 0x4164d035, 0x72eecb21, 0xbb63329c, 0x8883a249, 0x230b524b, 0x40c059ae, 0x529e2950, 0xfeeecb20, 0xae900a4a, 0xa5a3f2b5, 0xe68da7f3, 0x68fececb, 0x91a2f476, 0x3986b8a0, 0x00000001, 0x800001f0 }, + Instructions = [0xf171, 0x47e8, 0x4770, 0xe7fe], + StartRegs = [0x4164d035, 0x72eecb21, 0xbb63329c, 0x8883a249, 0x230b524b, 0x40c059ae, 0x529e2950, 0xd0f7b958, 0xae900a4a, 0xa5a3f2b5, 0xe68da7f3, 0x68fececb, 0x91a2f476, 0x3986b8a0, 0x00000001, 0x400001f0 + ], + FinalRegs = [0x4164d035, 0x72eecb21, 0xbb63329c, 0x8883a249, 0x230b524b, 0x40c059ae, 0x529e2950, 0xfeeecb20, 0xae900a4a, 0xa5a3f2b5, 0xe68da7f3, 0x68fececb, 0x91a2f476, 0x3986b8a0, 0x00000001, 0x800001f0 + ], }, // CMP (imm) new() { - Instructions = new ushort[] { 0xf5ba, 0x7f0c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x32876eff, 0x3127746f, 0x25274f4b, 0x50ba4fa5, 0xa3013fb5, 0x4985e2cb, 0x43dad09c, 0xfb6e47f2, 0x673ee708, 0x3beee172, 0x4866bb83, 0x9368060a, 0x565ecf8e, 0xecc22394, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0x32876eff, 0x3127746f, 0x25274f4b, 0x50ba4fa5, 0xa3013fb5, 0x4985e2cb, 0x43dad09c, 0xfb6e47f2, 0x673ee708, 0x3beee172, 0x4866bb83, 0x9368060a, 0x565ecf8e, 0xecc22394, 0x00000001, 0x200001f0 }, + Instructions = [0xf5ba, 0x7f0c, 0x4770, 0xe7fe], + StartRegs = [0x32876eff, 0x3127746f, 0x25274f4b, 0x50ba4fa5, 0xa3013fb5, 0x4985e2cb, 0x43dad09c, 0xfb6e47f2, 0x673ee708, 0x3beee172, 0x4866bb83, 0x9368060a, 0x565ecf8e, 0xecc22394, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0x32876eff, 0x3127746f, 0x25274f4b, 0x50ba4fa5, 0xa3013fb5, 0x4985e2cb, 0x43dad09c, 0xfb6e47f2, 0x673ee708, 0x3beee172, 0x4866bb83, 0x9368060a, 0x565ecf8e, 0xecc22394, 0x00000001, 0x200001f0 + ], }, new() { - Instructions = new ushort[] { 0xf1b4, 0x5f0c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xabb3ffca, 0x7dbdda85, 0xe413a0d4, 0xf2ea8958, 0x81be2593, 0x8b0997e0, 0x5319660b, 0xd4edc3d0, 0x4b147c71, 0xa60a6a5f, 0x9984a94a, 0xbabe5540, 0x24df8017, 0x1e97e9f5, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0xabb3ffca, 0x7dbdda85, 0xe413a0d4, 0xf2ea8958, 0x81be2593, 0x8b0997e0, 0x5319660b, 0xd4edc3d0, 0x4b147c71, 0xa60a6a5f, 0x9984a94a, 0xbabe5540, 0x24df8017, 0x1e97e9f5, 0x00000001, 0x300001f0 }, + Instructions = [0xf1b4, 0x5f0c, 0x4770, 0xe7fe], + StartRegs = [0xabb3ffca, 0x7dbdda85, 0xe413a0d4, 0xf2ea8958, 0x81be2593, 0x8b0997e0, 0x5319660b, 0xd4edc3d0, 0x4b147c71, 0xa60a6a5f, 0x9984a94a, 0xbabe5540, 0x24df8017, 0x1e97e9f5, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0xabb3ffca, 0x7dbdda85, 0xe413a0d4, 0xf2ea8958, 0x81be2593, 0x8b0997e0, 0x5319660b, 0xd4edc3d0, 0x4b147c71, 0xa60a6a5f, 0x9984a94a, 0xbabe5540, 0x24df8017, 0x1e97e9f5, 0x00000001, 0x300001f0 + ], }, new() { - Instructions = new ushort[] { 0xf5b1, 0x0f4b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xf6edbf76, 0xd3f53e21, 0x37679835, 0x6af58147, 0x143dd6be, 0x4f6339d1, 0x0261fa88, 0x38fe033f, 0x1b503fb3, 0x802af22b, 0x22901e74, 0xae61d40e, 0xe1e850ee, 0xe353701c, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0xf6edbf76, 0xd3f53e21, 0x37679835, 0x6af58147, 0x143dd6be, 0x4f6339d1, 0x0261fa88, 0x38fe033f, 0x1b503fb3, 0x802af22b, 0x22901e74, 0xae61d40e, 0xe1e850ee, 0xe353701c, 0x00000001, 0xa00001f0 }, + Instructions = [0xf5b1, 0x0f4b, 0x4770, 0xe7fe], + StartRegs = [0xf6edbf76, 0xd3f53e21, 0x37679835, 0x6af58147, 0x143dd6be, 0x4f6339d1, 0x0261fa88, 0x38fe033f, 0x1b503fb3, 0x802af22b, 0x22901e74, 0xae61d40e, 0xe1e850ee, 0xe353701c, 0x00000001, 0x200001f0 + ], + FinalRegs = [0xf6edbf76, 0xd3f53e21, 0x37679835, 0x6af58147, 0x143dd6be, 0x4f6339d1, 0x0261fa88, 0x38fe033f, 0x1b503fb3, 0x802af22b, 0x22901e74, 0xae61d40e, 0xe1e850ee, 0xe353701c, 0x00000001, 0xa00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf5b2, 0x7f57, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x350b2e14, 0xcc603c9e, 0xa7a56491, 0x1f4fe90b, 0x6bb14aba, 0x325154ef, 0xc7655249, 0xe1a6077b, 0x145fc2f0, 0x21e0bc5e, 0x18275d8b, 0x0d8f37f0, 0xfdb56518, 0x405f5649, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0x350b2e14, 0xcc603c9e, 0xa7a56491, 0x1f4fe90b, 0x6bb14aba, 0x325154ef, 0xc7655249, 0xe1a6077b, 0x145fc2f0, 0x21e0bc5e, 0x18275d8b, 0x0d8f37f0, 0xfdb56518, 0x405f5649, 0x00000001, 0xa00001f0 }, + Instructions = [0xf5b2, 0x7f57, 0x4770, 0xe7fe], + StartRegs = [0x350b2e14, 0xcc603c9e, 0xa7a56491, 0x1f4fe90b, 0x6bb14aba, 0x325154ef, 0xc7655249, 0xe1a6077b, 0x145fc2f0, 0x21e0bc5e, 0x18275d8b, 0x0d8f37f0, 0xfdb56518, 0x405f5649, 0x00000001, 0x200001f0 + ], + FinalRegs = [0x350b2e14, 0xcc603c9e, 0xa7a56491, 0x1f4fe90b, 0x6bb14aba, 0x325154ef, 0xc7655249, 0xe1a6077b, 0x145fc2f0, 0x21e0bc5e, 0x18275d8b, 0x0d8f37f0, 0xfdb56518, 0x405f5649, 0x00000001, 0xa00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf1b7, 0x0fd0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5a7f551b, 0x624d7cb7, 0xdc3e4dab, 0xd242610e, 0x8b7213db, 0x3c4f81df, 0x353e713e, 0x0ffdfd5c, 0xe56efdf9, 0x59330bc2, 0x1b91689c, 0x5497152e, 0x7ce02ab7, 0x0127aeca, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0x5a7f551b, 0x624d7cb7, 0xdc3e4dab, 0xd242610e, 0x8b7213db, 0x3c4f81df, 0x353e713e, 0x0ffdfd5c, 0xe56efdf9, 0x59330bc2, 0x1b91689c, 0x5497152e, 0x7ce02ab7, 0x0127aeca, 0x00000001, 0x200001f0 }, + Instructions = [0xf1b7, 0x0fd0, 0x4770, 0xe7fe], + StartRegs = [0x5a7f551b, 0x624d7cb7, 0xdc3e4dab, 0xd242610e, 0x8b7213db, 0x3c4f81df, 0x353e713e, 0x0ffdfd5c, 0xe56efdf9, 0x59330bc2, 0x1b91689c, 0x5497152e, 0x7ce02ab7, 0x0127aeca, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0x5a7f551b, 0x624d7cb7, 0xdc3e4dab, 0xd242610e, 0x8b7213db, 0x3c4f81df, 0x353e713e, 0x0ffdfd5c, 0xe56efdf9, 0x59330bc2, 0x1b91689c, 0x5497152e, 0x7ce02ab7, 0x0127aeca, 0x00000001, 0x200001f0 + ], }, // SUB (imm) new() { - Instructions = new ushort[] { 0xf5a6, 0x2902, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x688a6dd6, 0xcabb9832, 0xa187c464, 0xe4474634, 0x19316c88, 0x8b99d147, 0xd67bc441, 0x48cfa0cf, 0x4cd8b792, 0x9593d34d, 0x66b5a570, 0x9065cc35, 0x6ddf1e6f, 0xd49a2985, 0x00000001, 0xf00001f0 }, - FinalRegs = new uint[] { 0x688a6dd6, 0xcabb9832, 0xa187c464, 0xe4474634, 0x19316c88, 0x8b99d147, 0xd67bc441, 0x48cfa0cf, 0x4cd8b792, 0xd673a441, 0x66b5a570, 0x9065cc35, 0x6ddf1e6f, 0xd49a2985, 0x00000001, 0xf00001f0 }, + Instructions = [0xf5a6, 0x2902, 0x4770, 0xe7fe], + StartRegs = [0x688a6dd6, 0xcabb9832, 0xa187c464, 0xe4474634, 0x19316c88, 0x8b99d147, 0xd67bc441, 0x48cfa0cf, 0x4cd8b792, 0x9593d34d, 0x66b5a570, 0x9065cc35, 0x6ddf1e6f, 0xd49a2985, 0x00000001, 0xf00001f0 + ], + FinalRegs = [0x688a6dd6, 0xcabb9832, 0xa187c464, 0xe4474634, 0x19316c88, 0x8b99d147, 0xd67bc441, 0x48cfa0cf, 0x4cd8b792, 0xd673a441, 0x66b5a570, 0x9065cc35, 0x6ddf1e6f, 0xd49a2985, 0x00000001, 0xf00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf1a5, 0x4730, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x69e8d900, 0x3ca9d66e, 0x91788f4e, 0x6e821399, 0xd710747f, 0xc8e72a37, 0xf9f9702f, 0x8e689c3f, 0x87ef1e3c, 0xc8270c3e, 0xd76f0d87, 0x5482900c, 0xec43f474, 0x72617560, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0x69e8d900, 0x3ca9d66e, 0x91788f4e, 0x6e821399, 0xd710747f, 0xc8e72a37, 0xf9f9702f, 0x18e72a37, 0x87ef1e3c, 0xc8270c3e, 0xd76f0d87, 0x5482900c, 0xec43f474, 0x72617560, 0x00000001, 0x000001f0 }, + Instructions = [0xf1a5, 0x4730, 0x4770, 0xe7fe], + StartRegs = [0x69e8d900, 0x3ca9d66e, 0x91788f4e, 0x6e821399, 0xd710747f, 0xc8e72a37, 0xf9f9702f, 0x8e689c3f, 0x87ef1e3c, 0xc8270c3e, 0xd76f0d87, 0x5482900c, 0xec43f474, 0x72617560, 0x00000001, 0x000001f0 + ], + FinalRegs = [0x69e8d900, 0x3ca9d66e, 0x91788f4e, 0x6e821399, 0xd710747f, 0xc8e72a37, 0xf9f9702f, 0x18e72a37, 0x87ef1e3c, 0xc8270c3e, 0xd76f0d87, 0x5482900c, 0xec43f474, 0x72617560, 0x00000001, 0x000001f0 + ], }, new() { - Instructions = new ushort[] { 0xf5bd, 0x7d6b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x56f27741, 0xdf3a0328, 0x49864f87, 0xd8b84caa, 0xd7a4cc2b, 0x85467faf, 0x6e972a47, 0xc2440b53, 0xa56fc6fa, 0xe86c3322, 0x19e1532d, 0x2984be63, 0xd7302738, 0xbf00369c, 0x00000001, 0xb00001f0 }, - FinalRegs = new uint[] { 0x56f27741, 0xdf3a0328, 0x49864f87, 0xd8b84caa, 0xd7a4cc2b, 0x85467faf, 0x6e972a47, 0xc2440b53, 0xa56fc6fa, 0xe86c3322, 0x19e1532d, 0x2984be63, 0xd7302738, 0xbf0032f0, 0x00000001, 0xa00001f0 }, + Instructions = [0xf5bd, 0x7d6b, 0x4770, 0xe7fe], + StartRegs = [0x56f27741, 0xdf3a0328, 0x49864f87, 0xd8b84caa, 0xd7a4cc2b, 0x85467faf, 0x6e972a47, 0xc2440b53, 0xa56fc6fa, 0xe86c3322, 0x19e1532d, 0x2984be63, 0xd7302738, 0xbf00369c, 0x00000001, 0xb00001f0 + ], + FinalRegs = [0x56f27741, 0xdf3a0328, 0x49864f87, 0xd8b84caa, 0xd7a4cc2b, 0x85467faf, 0x6e972a47, 0xc2440b53, 0xa56fc6fa, 0xe86c3322, 0x19e1532d, 0x2984be63, 0xd7302738, 0xbf0032f0, 0x00000001, 0xa00001f0 + ], }, new() { - Instructions = new ushort[] { 0xf5aa, 0x048c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xc48ce68c, 0x33c654cc, 0xa31ea382, 0x398c4095, 0xfff680a5, 0x5886b5f4, 0xb1debf0b, 0x8bd529bb, 0x1354ba05, 0xcf80960a, 0x18582cbe, 0x37ca8996, 0x08f95e3c, 0xc87fdb04, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0xc48ce68c, 0x33c654cc, 0xa31ea382, 0x398c4095, 0x18122cbe, 0x5886b5f4, 0xb1debf0b, 0x8bd529bb, 0x1354ba05, 0xcf80960a, 0x18582cbe, 0x37ca8996, 0x08f95e3c, 0xc87fdb04, 0x00000001, 0x200001f0 }, + Instructions = [0xf5aa, 0x048c, 0x4770, 0xe7fe], + StartRegs = [0xc48ce68c, 0x33c654cc, 0xa31ea382, 0x398c4095, 0xfff680a5, 0x5886b5f4, 0xb1debf0b, 0x8bd529bb, 0x1354ba05, 0xcf80960a, 0x18582cbe, 0x37ca8996, 0x08f95e3c, 0xc87fdb04, 0x00000001, 0x200001f0 + ], + FinalRegs = [0xc48ce68c, 0x33c654cc, 0xa31ea382, 0x398c4095, 0x18122cbe, 0x5886b5f4, 0xb1debf0b, 0x8bd529bb, 0x1354ba05, 0xcf80960a, 0x18582cbe, 0x37ca8996, 0x08f95e3c, 0xc87fdb04, 0x00000001, 0x200001f0 + ], }, new() { - Instructions = new ushort[] { 0xf5ba, 0x13aa, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd2de6567, 0x993624bf, 0xcfbd492f, 0x7b922424, 0x9fa01912, 0x04225225, 0x3a812a6d, 0xe62792b8, 0xb47cee9a, 0x5694288e, 0x6c669666, 0x213701a6, 0xe423ad2d, 0xc7d5362b, 0x00000001, 0xb00001f0 }, - FinalRegs = new uint[] { 0xd2de6567, 0x993624bf, 0xcfbd492f, 0x6c515666, 0x9fa01912, 0x04225225, 0x3a812a6d, 0xe62792b8, 0xb47cee9a, 0x5694288e, 0x6c669666, 0x213701a6, 0xe423ad2d, 0xc7d5362b, 0x00000001, 0x200001f0 }, + Instructions = [0xf5ba, 0x13aa, 0x4770, 0xe7fe], + StartRegs = [0xd2de6567, 0x993624bf, 0xcfbd492f, 0x7b922424, 0x9fa01912, 0x04225225, 0x3a812a6d, 0xe62792b8, 0xb47cee9a, 0x5694288e, 0x6c669666, 0x213701a6, 0xe423ad2d, 0xc7d5362b, 0x00000001, 0xb00001f0 + ], + FinalRegs = [0xd2de6567, 0x993624bf, 0xcfbd492f, 0x6c515666, 0x9fa01912, 0x04225225, 0x3a812a6d, 0xe62792b8, 0xb47cee9a, 0x5694288e, 0x6c669666, 0x213701a6, 0xe423ad2d, 0xc7d5362b, 0x00000001, 0x200001f0 + ], }, // RSB (imm) new() { - Instructions = new ushort[] { 0xf5dc, 0x767d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x8496100e, 0x93007a60, 0x0d33d3dc, 0xd932c4e1, 0x6e05ad8d, 0xde3cc68e, 0x74400ff8, 0xce309ee7, 0x188e0ebd, 0xe10837ab, 0x6b2534e2, 0x280add20, 0x3adc0489, 0x8ef32355, 0x00000001, 0x600001f0 }, - FinalRegs = new uint[] { 0x8496100e, 0x93007a60, 0x0d33d3dc, 0xd932c4e1, 0x6e05ad8d, 0xde3cc68e, 0xc523ff6b, 0xce309ee7, 0x188e0ebd, 0xe10837ab, 0x6b2534e2, 0x280add20, 0x3adc0489, 0x8ef32355, 0x00000001, 0x800001f0 }, + Instructions = [0xf5dc, 0x767d, 0x4770, 0xe7fe], + StartRegs = [0x8496100e, 0x93007a60, 0x0d33d3dc, 0xd932c4e1, 0x6e05ad8d, 0xde3cc68e, 0x74400ff8, 0xce309ee7, 0x188e0ebd, 0xe10837ab, 0x6b2534e2, 0x280add20, 0x3adc0489, 0x8ef32355, 0x00000001, 0x600001f0 + ], + FinalRegs = [0x8496100e, 0x93007a60, 0x0d33d3dc, 0xd932c4e1, 0x6e05ad8d, 0xde3cc68e, 0xc523ff6b, 0xce309ee7, 0x188e0ebd, 0xe10837ab, 0x6b2534e2, 0x280add20, 0x3adc0489, 0x8ef32355, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf1dc, 0x377d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xc5d7fe20, 0xade81daf, 0xba65ccf8, 0xa101ee00, 0x3a2b70d9, 0xc90238d9, 0xc3b54049, 0x436bf83f, 0x99c96b58, 0xd134cb19, 0x4de47e7f, 0x6a175e2d, 0xd9e49229, 0x174d24ac, 0x00000001, 0x400001f0 }, - FinalRegs = new uint[] { 0xc5d7fe20, 0xade81daf, 0xba65ccf8, 0xa101ee00, 0x3a2b70d9, 0xc90238d9, 0xc3b54049, 0xa398eb54, 0x99c96b58, 0xd134cb19, 0x4de47e7f, 0x6a175e2d, 0xd9e49229, 0x174d24ac, 0x00000001, 0x900001f0 }, + Instructions = [0xf1dc, 0x377d, 0x4770, 0xe7fe], + StartRegs = [0xc5d7fe20, 0xade81daf, 0xba65ccf8, 0xa101ee00, 0x3a2b70d9, 0xc90238d9, 0xc3b54049, 0x436bf83f, 0x99c96b58, 0xd134cb19, 0x4de47e7f, 0x6a175e2d, 0xd9e49229, 0x174d24ac, 0x00000001, 0x400001f0 + ], + FinalRegs = [0xc5d7fe20, 0xade81daf, 0xba65ccf8, 0xa101ee00, 0x3a2b70d9, 0xc90238d9, 0xc3b54049, 0xa398eb54, 0x99c96b58, 0xd134cb19, 0x4de47e7f, 0x6a175e2d, 0xd9e49229, 0x174d24ac, 0x00000001, 0x900001f0 + ], }, new() { - Instructions = new ushort[] { 0xf5c5, 0x34bd, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xcea4f214, 0xdc15a8f8, 0xd22be9ef, 0x42c400c5, 0x2fd1fc9b, 0xca724b52, 0x5582071d, 0xd01b7816, 0xa4f5a435, 0xcfd50db5, 0x24e0c80b, 0x7b52178d, 0x11cd0449, 0xd6daa84a, 0x00000001, 0x800001f0 }, - FinalRegs = new uint[] { 0xcea4f214, 0xdc15a8f8, 0xd22be9ef, 0x42c400c5, 0x358f2eae, 0xca724b52, 0x5582071d, 0xd01b7816, 0xa4f5a435, 0xcfd50db5, 0x24e0c80b, 0x7b52178d, 0x11cd0449, 0xd6daa84a, 0x00000001, 0x800001f0 }, + Instructions = [0xf5c5, 0x34bd, 0x4770, 0xe7fe], + StartRegs = [0xcea4f214, 0xdc15a8f8, 0xd22be9ef, 0x42c400c5, 0x2fd1fc9b, 0xca724b52, 0x5582071d, 0xd01b7816, 0xa4f5a435, 0xcfd50db5, 0x24e0c80b, 0x7b52178d, 0x11cd0449, 0xd6daa84a, 0x00000001, 0x800001f0 + ], + FinalRegs = [0xcea4f214, 0xdc15a8f8, 0xd22be9ef, 0x42c400c5, 0x358f2eae, 0xca724b52, 0x5582071d, 0xd01b7816, 0xa4f5a435, 0xcfd50db5, 0x24e0c80b, 0x7b52178d, 0x11cd0449, 0xd6daa84a, 0x00000001, 0x800001f0 + ], }, new() { - Instructions = new ushort[] { 0xf1ce, 0x7846, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3c676ff3, 0x511ea0cb, 0x15e79c80, 0x51a3a8c1, 0x535cc233, 0x6ae729a3, 0x4e5726da, 0x81260fb9, 0x24dd423a, 0x9e81d6c0, 0x812b3bd1, 0x55bd0f44, 0x1871ec65, 0x87087126, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0x3c676ff3, 0x511ea0cb, 0x15e79c80, 0x51a3a8c1, 0x535cc233, 0x6ae729a3, 0x4e5726da, 0x81260fb9, 0x0317ffff, 0x9e81d6c0, 0x812b3bd1, 0x55bd0f44, 0x1871ec65, 0x87087126, 0x00000001, 0x200001f0 }, + Instructions = [0xf1ce, 0x7846, 0x4770, 0xe7fe], + StartRegs = [0x3c676ff3, 0x511ea0cb, 0x15e79c80, 0x51a3a8c1, 0x535cc233, 0x6ae729a3, 0x4e5726da, 0x81260fb9, 0x24dd423a, 0x9e81d6c0, 0x812b3bd1, 0x55bd0f44, 0x1871ec65, 0x87087126, 0x00000001, 0x200001f0 + ], + FinalRegs = [0x3c676ff3, 0x511ea0cb, 0x15e79c80, 0x51a3a8c1, 0x535cc233, 0x6ae729a3, 0x4e5726da, 0x81260fb9, 0x0317ffff, 0x9e81d6c0, 0x812b3bd1, 0x55bd0f44, 0x1871ec65, 0x87087126, 0x00000001, 0x200001f0 + ], }, new() { - Instructions = new ushort[] { 0xf5c5, 0x2418, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x2bb00694, 0x1c56a4c0, 0xc5cc4a3e, 0xc627c1ab, 0x4e4a8dfc, 0x1f3d71a4, 0x897d57b8, 0x0d4a7208, 0x433b7b88, 0xaaf24fd6, 0x2438f5f8, 0x9875e64a, 0xda475f22, 0x66d5e2e7, 0x00000001, 0x700001f0 }, - FinalRegs = new uint[] { 0x2bb00694, 0x1c56a4c0, 0xc5cc4a3e, 0xc627c1ab, 0xe0cc0e5c, 0x1f3d71a4, 0x897d57b8, 0x0d4a7208, 0x433b7b88, 0xaaf24fd6, 0x2438f5f8, 0x9875e64a, 0xda475f22, 0x66d5e2e7, 0x00000001, 0x700001f0 }, - }, - }; + Instructions = [0xf5c5, 0x2418, 0x4770, 0xe7fe], + StartRegs = [0x2bb00694, 0x1c56a4c0, 0xc5cc4a3e, 0xc627c1ab, 0x4e4a8dfc, 0x1f3d71a4, 0x897d57b8, 0x0d4a7208, 0x433b7b88, 0xaaf24fd6, 0x2438f5f8, 0x9875e64a, 0xda475f22, 0x66d5e2e7, 0x00000001, 0x700001f0 + ], + FinalRegs = [0x2bb00694, 0x1c56a4c0, 0xc5cc4a3e, 0xc627c1ab, 0xe0cc0e5c, 0x1f3d71a4, 0x897d57b8, 0x0d4a7208, 0x433b7b88, 0xaaf24fd6, 0x2438f5f8, 0x9875e64a, 0xda475f22, 0x66d5e2e7, 0x00000001, 0x700001f0 + ], + } + ]; } } diff --git a/src/Ryujinx.Tests/Cpu/CpuTestT32Flow.cs b/src/Ryujinx.Tests/Cpu/CpuTestT32Flow.cs index 01159afc6..b73072207 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestT32Flow.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestT32Flow.cs @@ -100,6 +100,7 @@ namespace Ryujinx.Tests.Cpu { ThumbOpcode(0xe7fe); } + ThumbOpcode(0x4670); // label: MOV R0, LR ThumbOpcode(0x2100); // MOVS R1, #0 ThumbOpcode(0x468e); // MOV LR, R1 diff --git a/src/Ryujinx.Tests/Cpu/CpuTestT32Mem.cs b/src/Ryujinx.Tests/Cpu/CpuTestT32Mem.cs index 94ccb950c..3d8847dc4 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestT32Mem.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestT32Mem.cs @@ -1,5 +1,4 @@ using NUnit.Framework; -using System; namespace Ryujinx.Tests.Cpu { @@ -13,509 +12,657 @@ namespace Ryujinx.Tests.Cpu } public static readonly PrecomputedMemoryThumbTestCase[] ImmTestCases = - { + [ // STRB (imm8) new() { - Instructions = new ushort[] { 0xf80c, 0x1b2f, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000023bd, 0x000027bb, 0x00002715, 0x000028f5, 0x0000233f, 0x0000213b, 0x00002eea, 0x0000282b, 0x000021e1, 0x0000264c, 0x000029e0, 0x00002ae7, 0x000021ff, 0x000026e3, 0x00000001, 0x800001f0 }, - FinalRegs = new uint[] { 0x000023bd, 0x000027bb, 0x00002715, 0x000028f5, 0x0000233f, 0x0000213b, 0x00002eea, 0x0000282b, 0x000021e1, 0x0000264c, 0x000029e0, 0x00002ae7, 0x0000222e, 0x000026e3, 0x00000001, 0x800001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x21fe, Value: 0xbbfe) }, + Instructions = [0xf80c, 0x1b2f, 0x4770, 0xe7fe], + StartRegs = [0x000023bd, 0x000027bb, 0x00002715, 0x000028f5, 0x0000233f, 0x0000213b, 0x00002eea, 0x0000282b, 0x000021e1, 0x0000264c, 0x000029e0, 0x00002ae7, 0x000021ff, 0x000026e3, 0x00000001, 0x800001f0 + ], + FinalRegs = [0x000023bd, 0x000027bb, 0x00002715, 0x000028f5, 0x0000233f, 0x0000213b, 0x00002eea, 0x0000282b, 0x000021e1, 0x0000264c, 0x000029e0, 0x00002ae7, 0x0000222e, 0x000026e3, 0x00000001, 0x800001f0 + ], + MemoryDelta = [(Address: 0x21fe, Value: 0xbbfe)], }, new() { - Instructions = new ushort[] { 0xf80a, 0x2f81, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0000223c, 0x00002db9, 0x00002900, 0x0000247c, 0x00002b0a, 0x0000266b, 0x000026df, 0x00002447, 0x000024bb, 0x00002687, 0x0000266f, 0x00002a80, 0x000025ff, 0x00002881, 0x00000001, 0xa00001f0 }, - FinalRegs = new uint[] { 0x0000223c, 0x00002db9, 0x00002900, 0x0000247c, 0x00002b0a, 0x0000266b, 0x000026df, 0x00002447, 0x000024bb, 0x00002687, 0x000026f0, 0x00002a80, 0x000025ff, 0x00002881, 0x00000001, 0xa00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x26f0, Value: 0x2600) }, + Instructions = [0xf80a, 0x2f81, 0x4770, 0xe7fe], + StartRegs = [0x0000223c, 0x00002db9, 0x00002900, 0x0000247c, 0x00002b0a, 0x0000266b, 0x000026df, 0x00002447, 0x000024bb, 0x00002687, 0x0000266f, 0x00002a80, 0x000025ff, 0x00002881, 0x00000001, 0xa00001f0 + ], + FinalRegs = [0x0000223c, 0x00002db9, 0x00002900, 0x0000247c, 0x00002b0a, 0x0000266b, 0x000026df, 0x00002447, 0x000024bb, 0x00002687, 0x000026f0, 0x00002a80, 0x000025ff, 0x00002881, 0x00000001, 0xa00001f0 + ], + MemoryDelta = [(Address: 0x26f0, Value: 0x2600)], }, new() { - Instructions = new ushort[] { 0xf803, 0x6968, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000026ed, 0x00002685, 0x00002cd1, 0x00002dac, 0x00002a23, 0x00002626, 0x00002ec9, 0x0000245c, 0x000024ef, 0x00002319, 0x000026ce, 0x0000214d, 0x00002401, 0x000028b4, 0x00000001, 0x300001f0 }, - FinalRegs = new uint[] { 0x000026ed, 0x00002685, 0x00002cd1, 0x00002d44, 0x00002a23, 0x00002626, 0x00002ec9, 0x0000245c, 0x000024ef, 0x00002319, 0x000026ce, 0x0000214d, 0x00002401, 0x000028b4, 0x00000001, 0x300001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2dac, Value: 0x2dc9) }, + Instructions = [0xf803, 0x6968, 0x4770, 0xe7fe], + StartRegs = [0x000026ed, 0x00002685, 0x00002cd1, 0x00002dac, 0x00002a23, 0x00002626, 0x00002ec9, 0x0000245c, 0x000024ef, 0x00002319, 0x000026ce, 0x0000214d, 0x00002401, 0x000028b4, 0x00000001, 0x300001f0 + ], + FinalRegs = [0x000026ed, 0x00002685, 0x00002cd1, 0x00002d44, 0x00002a23, 0x00002626, 0x00002ec9, 0x0000245c, 0x000024ef, 0x00002319, 0x000026ce, 0x0000214d, 0x00002401, 0x000028b4, 0x00000001, 0x300001f0 + ], + MemoryDelta = [(Address: 0x2dac, Value: 0x2dc9)], }, new() { - Instructions = new ushort[] { 0xf804, 0x89ad, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0000265d, 0x00002b9c, 0x00002360, 0x000029ec, 0x00002413, 0x00002d8e, 0x00002aad, 0x00002d29, 0x00002bca, 0x00002a44, 0x00002980, 0x00002710, 0x000022fa, 0x0000222e, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0x0000265d, 0x00002b9c, 0x00002360, 0x000029ec, 0x00002366, 0x00002d8e, 0x00002aad, 0x00002d29, 0x00002bca, 0x00002a44, 0x00002980, 0x00002710, 0x000022fa, 0x0000222e, 0x00000001, 0xc00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2412, Value: 0xca12) }, + Instructions = [0xf804, 0x89ad, 0x4770, 0xe7fe], + StartRegs = [0x0000265d, 0x00002b9c, 0x00002360, 0x000029ec, 0x00002413, 0x00002d8e, 0x00002aad, 0x00002d29, 0x00002bca, 0x00002a44, 0x00002980, 0x00002710, 0x000022fa, 0x0000222e, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0x0000265d, 0x00002b9c, 0x00002360, 0x000029ec, 0x00002366, 0x00002d8e, 0x00002aad, 0x00002d29, 0x00002bca, 0x00002a44, 0x00002980, 0x00002710, 0x000022fa, 0x0000222e, 0x00000001, 0xc00001f0 + ], + MemoryDelta = [(Address: 0x2412, Value: 0xca12)], }, new() { - Instructions = new ushort[] { 0xf80d, 0xa9fe, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0000298d, 0x00002e6c, 0x00002986, 0x00002ebb, 0x0000213e, 0x00002e39, 0x0000246f, 0x00002b6c, 0x00002ee2, 0x0000259e, 0x0000250a, 0x000029f6, 0x000021e7, 0x00002d9d, 0x00000001, 0x900001f0 }, - FinalRegs = new uint[] { 0x0000298d, 0x00002e6c, 0x00002986, 0x00002ebb, 0x0000213e, 0x00002e39, 0x0000246f, 0x00002b6c, 0x00002ee2, 0x0000259e, 0x0000250a, 0x000029f6, 0x000021e7, 0x00002c9f, 0x00000001, 0x900001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2d9c, Value: 0x0a9c) }, + Instructions = [0xf80d, 0xa9fe, 0x4770, 0xe7fe], + StartRegs = [0x0000298d, 0x00002e6c, 0x00002986, 0x00002ebb, 0x0000213e, 0x00002e39, 0x0000246f, 0x00002b6c, 0x00002ee2, 0x0000259e, 0x0000250a, 0x000029f6, 0x000021e7, 0x00002d9d, 0x00000001, 0x900001f0 + ], + FinalRegs = [0x0000298d, 0x00002e6c, 0x00002986, 0x00002ebb, 0x0000213e, 0x00002e39, 0x0000246f, 0x00002b6c, 0x00002ee2, 0x0000259e, 0x0000250a, 0x000029f6, 0x000021e7, 0x00002c9f, 0x00000001, 0x900001f0 + ], + MemoryDelta = [(Address: 0x2d9c, Value: 0x0a9c)], }, new() { - Instructions = new ushort[] { 0xf80d, 0x3c46, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002c6f, 0x000028cc, 0x000025f0, 0x000022cc, 0x00002de3, 0x0000243c, 0x000025fb, 0x00002e88, 0x00002985, 0x000023ee, 0x00002120, 0x00002d50, 0x0000270a, 0x00002bbd, 0x00000001, 0xa00001f0 }, - FinalRegs = new uint[] { 0x00002c6f, 0x000028cc, 0x000025f0, 0x000022cc, 0x00002de3, 0x0000243c, 0x000025fb, 0x00002e88, 0x00002985, 0x000023ee, 0x00002120, 0x00002d50, 0x0000270a, 0x00002bbd, 0x00000001, 0xa00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2b76, Value: 0xcc76) }, + Instructions = [0xf80d, 0x3c46, 0x4770, 0xe7fe], + StartRegs = [0x00002c6f, 0x000028cc, 0x000025f0, 0x000022cc, 0x00002de3, 0x0000243c, 0x000025fb, 0x00002e88, 0x00002985, 0x000023ee, 0x00002120, 0x00002d50, 0x0000270a, 0x00002bbd, 0x00000001, 0xa00001f0 + ], + FinalRegs = [0x00002c6f, 0x000028cc, 0x000025f0, 0x000022cc, 0x00002de3, 0x0000243c, 0x000025fb, 0x00002e88, 0x00002985, 0x000023ee, 0x00002120, 0x00002d50, 0x0000270a, 0x00002bbd, 0x00000001, 0xa00001f0 + ], + MemoryDelta = [(Address: 0x2b76, Value: 0xcc76)], }, new() { - Instructions = new ushort[] { 0xf801, 0x6c56, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002d6e, 0x00002530, 0x00002e6d, 0x00002942, 0x00002985, 0x00002d64, 0x00002a73, 0x00002ac6, 0x00002955, 0x00002881, 0x0000221d, 0x00002cb0, 0x0000225f, 0x00002534, 0x00000001, 0x100001f0 }, - FinalRegs = new uint[] { 0x00002d6e, 0x00002530, 0x00002e6d, 0x00002942, 0x00002985, 0x00002d64, 0x00002a73, 0x00002ac6, 0x00002955, 0x00002881, 0x0000221d, 0x00002cb0, 0x0000225f, 0x00002534, 0x00000001, 0x100001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x24da, Value: 0x2473) }, + Instructions = [0xf801, 0x6c56, 0x4770, 0xe7fe], + StartRegs = [0x00002d6e, 0x00002530, 0x00002e6d, 0x00002942, 0x00002985, 0x00002d64, 0x00002a73, 0x00002ac6, 0x00002955, 0x00002881, 0x0000221d, 0x00002cb0, 0x0000225f, 0x00002534, 0x00000001, 0x100001f0 + ], + FinalRegs = [0x00002d6e, 0x00002530, 0x00002e6d, 0x00002942, 0x00002985, 0x00002d64, 0x00002a73, 0x00002ac6, 0x00002955, 0x00002881, 0x0000221d, 0x00002cb0, 0x0000225f, 0x00002534, 0x00000001, 0x100001f0 + ], + MemoryDelta = [(Address: 0x24da, Value: 0x2473)], }, new() { - Instructions = new ushort[] { 0xf809, 0xcc76, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002d50, 0x000025f2, 0x0000250a, 0x0000214c, 0x000023d1, 0x00002115, 0x00002c27, 0x00002540, 0x0000222b, 0x00002d03, 0x00002679, 0x00002b52, 0x00002eee, 0x00002b2a, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0x00002d50, 0x000025f2, 0x0000250a, 0x0000214c, 0x000023d1, 0x00002115, 0x00002c27, 0x00002540, 0x0000222b, 0x00002d03, 0x00002679, 0x00002b52, 0x00002eee, 0x00002b2a, 0x00000001, 0xd00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2c8c, Value: 0xee8c) }, + Instructions = [0xf809, 0xcc76, 0x4770, 0xe7fe], + StartRegs = [0x00002d50, 0x000025f2, 0x0000250a, 0x0000214c, 0x000023d1, 0x00002115, 0x00002c27, 0x00002540, 0x0000222b, 0x00002d03, 0x00002679, 0x00002b52, 0x00002eee, 0x00002b2a, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0x00002d50, 0x000025f2, 0x0000250a, 0x0000214c, 0x000023d1, 0x00002115, 0x00002c27, 0x00002540, 0x0000222b, 0x00002d03, 0x00002679, 0x00002b52, 0x00002eee, 0x00002b2a, 0x00000001, 0xd00001f0 + ], + MemoryDelta = [(Address: 0x2c8c, Value: 0xee8c)], }, new() { - Instructions = new ushort[] { 0xf808, 0x1c8d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002844, 0x00002b78, 0x000028b0, 0x000026ff, 0x0000280b, 0x00002e0b, 0x00002de4, 0x00002b53, 0x00002ecd, 0x000021b5, 0x000026bc, 0x00002e9d, 0x00002d33, 0x000027f0, 0x00000001, 0x800001f0 }, - FinalRegs = new uint[] { 0x00002844, 0x00002b78, 0x000028b0, 0x000026ff, 0x0000280b, 0x00002e0b, 0x00002de4, 0x00002b53, 0x00002ecd, 0x000021b5, 0x000026bc, 0x00002e9d, 0x00002d33, 0x000027f0, 0x00000001, 0x800001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2e40, Value: 0x2e78) }, + Instructions = [0xf808, 0x1c8d, 0x4770, 0xe7fe], + StartRegs = [0x00002844, 0x00002b78, 0x000028b0, 0x000026ff, 0x0000280b, 0x00002e0b, 0x00002de4, 0x00002b53, 0x00002ecd, 0x000021b5, 0x000026bc, 0x00002e9d, 0x00002d33, 0x000027f0, 0x00000001, 0x800001f0 + ], + FinalRegs = [0x00002844, 0x00002b78, 0x000028b0, 0x000026ff, 0x0000280b, 0x00002e0b, 0x00002de4, 0x00002b53, 0x00002ecd, 0x000021b5, 0x000026bc, 0x00002e9d, 0x00002d33, 0x000027f0, 0x00000001, 0x800001f0 + ], + MemoryDelta = [(Address: 0x2e40, Value: 0x2e78)], }, new() { - Instructions = new ushort[] { 0xf80b, 0xbc26, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002244, 0x000025ad, 0x00002434, 0x00002b06, 0x00002ebd, 0x0000292b, 0x00002431, 0x00002e12, 0x0000289b, 0x0000265a, 0x00002747, 0x00002bac, 0x00002dae, 0x00002582, 0x00000001, 0xf00001f0 }, - FinalRegs = new uint[] { 0x00002244, 0x000025ad, 0x00002434, 0x00002b06, 0x00002ebd, 0x0000292b, 0x00002431, 0x00002e12, 0x0000289b, 0x0000265a, 0x00002747, 0x00002bac, 0x00002dae, 0x00002582, 0x00000001, 0xf00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2b86, Value: 0x2bac) }, + Instructions = [0xf80b, 0xbc26, 0x4770, 0xe7fe], + StartRegs = [0x00002244, 0x000025ad, 0x00002434, 0x00002b06, 0x00002ebd, 0x0000292b, 0x00002431, 0x00002e12, 0x0000289b, 0x0000265a, 0x00002747, 0x00002bac, 0x00002dae, 0x00002582, 0x00000001, 0xf00001f0 + ], + FinalRegs = [0x00002244, 0x000025ad, 0x00002434, 0x00002b06, 0x00002ebd, 0x0000292b, 0x00002431, 0x00002e12, 0x0000289b, 0x0000265a, 0x00002747, 0x00002bac, 0x00002dae, 0x00002582, 0x00000001, 0xf00001f0 + ], + MemoryDelta = [(Address: 0x2b86, Value: 0x2bac)], }, // STRB (imm12) new() { - Instructions = new ushort[] { 0xf887, 0x67c2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x700001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x700001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x27c2, Value: 0x2700) }, + Instructions = [0xf887, 0x67c2, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x700001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x700001f0 + ], + MemoryDelta = [(Address: 0x27c2, Value: 0x2700)], }, new() { - Instructions = new ushort[] { 0xf883, 0x9fda, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xc00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2fda, Value: 0x2f00) }, + Instructions = [0xf883, 0x9fda, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xc00001f0 + ], + MemoryDelta = [(Address: 0x2fda, Value: 0x2f00)], }, new() { - Instructions = new ushort[] { 0xf889, 0xd200, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x400001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x400001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf889, 0xd200, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x400001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x400001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf88c, 0x1c5b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2c5a, Value: 0x005a) }, + Instructions = [0xf88c, 0x1c5b, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 + ], + MemoryDelta = [(Address: 0x2c5a, Value: 0x005a)], }, new() { - Instructions = new ushort[] { 0xf887, 0x9fe2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2fe2, Value: 0x2f00) }, + Instructions = [0xf887, 0x9fe2, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 + ], + MemoryDelta = [(Address: 0x2fe2, Value: 0x2f00)], }, // STRH (imm8) new() { - Instructions = new ushort[] { 0xf826, 0x0b0a, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000025a2, 0x000024d5, 0x00002ca1, 0x0000238a, 0x0000279c, 0x0000244c, 0x00002620, 0x00002c0e, 0x0000233e, 0x0000285f, 0x000021ab, 0x00002bd0, 0x0000281f, 0x00002be7, 0x00000001, 0x600001f0 }, - FinalRegs = new uint[] { 0x000025a2, 0x000024d5, 0x00002ca1, 0x0000238a, 0x0000279c, 0x0000244c, 0x0000262a, 0x00002c0e, 0x0000233e, 0x0000285f, 0x000021ab, 0x00002bd0, 0x0000281f, 0x00002be7, 0x00000001, 0x600001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2620, Value: 0x25a2) }, + Instructions = [0xf826, 0x0b0a, 0x4770, 0xe7fe], + StartRegs = [0x000025a2, 0x000024d5, 0x00002ca1, 0x0000238a, 0x0000279c, 0x0000244c, 0x00002620, 0x00002c0e, 0x0000233e, 0x0000285f, 0x000021ab, 0x00002bd0, 0x0000281f, 0x00002be7, 0x00000001, 0x600001f0 + ], + FinalRegs = [0x000025a2, 0x000024d5, 0x00002ca1, 0x0000238a, 0x0000279c, 0x0000244c, 0x0000262a, 0x00002c0e, 0x0000233e, 0x0000285f, 0x000021ab, 0x00002bd0, 0x0000281f, 0x00002be7, 0x00000001, 0x600001f0 + ], + MemoryDelta = [(Address: 0x2620, Value: 0x25a2)], }, new() { - Instructions = new ushort[] { 0xf827, 0xcf61, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002555, 0x0000238f, 0x00002829, 0x000028c8, 0x00002399, 0x00002aab, 0x00002d6f, 0x000029eb, 0x000029e0, 0x00002d33, 0x0000292a, 0x00002b33, 0x00002e29, 0x00002ca4, 0x00000001, 0x100001f0 }, - FinalRegs = new uint[] { 0x00002555, 0x0000238f, 0x00002829, 0x000028c8, 0x00002399, 0x00002aab, 0x00002d6f, 0x00002a4c, 0x000029e0, 0x00002d33, 0x0000292a, 0x00002b33, 0x00002e29, 0x00002ca4, 0x00000001, 0x100001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2a4c, Value: 0x2e29) }, + Instructions = [0xf827, 0xcf61, 0x4770, 0xe7fe], + StartRegs = [0x00002555, 0x0000238f, 0x00002829, 0x000028c8, 0x00002399, 0x00002aab, 0x00002d6f, 0x000029eb, 0x000029e0, 0x00002d33, 0x0000292a, 0x00002b33, 0x00002e29, 0x00002ca4, 0x00000001, 0x100001f0 + ], + FinalRegs = [0x00002555, 0x0000238f, 0x00002829, 0x000028c8, 0x00002399, 0x00002aab, 0x00002d6f, 0x00002a4c, 0x000029e0, 0x00002d33, 0x0000292a, 0x00002b33, 0x00002e29, 0x00002ca4, 0x00000001, 0x100001f0 + ], + MemoryDelta = [(Address: 0x2a4c, Value: 0x2e29)], }, new() { - Instructions = new ushort[] { 0xf821, 0x9b00, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000027ba, 0x00002514, 0x00002b07, 0x00002daf, 0x00002790, 0x0000274b, 0x00002379, 0x00002a98, 0x000024c8, 0x00002398, 0x000021ba, 0x00002959, 0x00002821, 0x00002d09, 0x00000001, 0x500001f0 }, - FinalRegs = new uint[] { 0x000027ba, 0x00002514, 0x00002b07, 0x00002daf, 0x00002790, 0x0000274b, 0x00002379, 0x00002a98, 0x000024c8, 0x00002398, 0x000021ba, 0x00002959, 0x00002821, 0x00002d09, 0x00000001, 0x500001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2514, Value: 0x2398) }, + Instructions = [0xf821, 0x9b00, 0x4770, 0xe7fe], + StartRegs = [0x000027ba, 0x00002514, 0x00002b07, 0x00002daf, 0x00002790, 0x0000274b, 0x00002379, 0x00002a98, 0x000024c8, 0x00002398, 0x000021ba, 0x00002959, 0x00002821, 0x00002d09, 0x00000001, 0x500001f0 + ], + FinalRegs = [0x000027ba, 0x00002514, 0x00002b07, 0x00002daf, 0x00002790, 0x0000274b, 0x00002379, 0x00002a98, 0x000024c8, 0x00002398, 0x000021ba, 0x00002959, 0x00002821, 0x00002d09, 0x00000001, 0x500001f0 + ], + MemoryDelta = [(Address: 0x2514, Value: 0x2398)], }, new() { - Instructions = new ushort[] { 0xf82c, 0xa927, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0000226a, 0x00002792, 0x00002870, 0x00002918, 0x00002757, 0x00002679, 0x00002546, 0x000027f5, 0x00002edc, 0x00002cd3, 0x0000274a, 0x00002562, 0x000029a1, 0x00002976, 0x00000001, 0x100001f0 }, - FinalRegs = new uint[] { 0x0000226a, 0x00002792, 0x00002870, 0x00002918, 0x00002757, 0x00002679, 0x00002546, 0x000027f5, 0x00002edc, 0x00002cd3, 0x0000274a, 0x00002562, 0x0000297a, 0x00002976, 0x00000001, 0x100001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x29a0, Value: 0x4aa0), (Address: 0x29a2, Value: 0x2927) }, + Instructions = [0xf82c, 0xa927, 0x4770, 0xe7fe], + StartRegs = [0x0000226a, 0x00002792, 0x00002870, 0x00002918, 0x00002757, 0x00002679, 0x00002546, 0x000027f5, 0x00002edc, 0x00002cd3, 0x0000274a, 0x00002562, 0x000029a1, 0x00002976, 0x00000001, 0x100001f0 + ], + FinalRegs = [0x0000226a, 0x00002792, 0x00002870, 0x00002918, 0x00002757, 0x00002679, 0x00002546, 0x000027f5, 0x00002edc, 0x00002cd3, 0x0000274a, 0x00002562, 0x0000297a, 0x00002976, 0x00000001, 0x100001f0 + ], + MemoryDelta = [(Address: 0x29a0, Value: 0x4aa0), (Address: 0x29a2, Value: 0x2927)], }, new() { - Instructions = new ushort[] { 0xf824, 0xcfe4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0000238b, 0x00002d22, 0x00002476, 0x000028ae, 0x00002442, 0x0000212b, 0x000026de, 0x00002a1a, 0x00002a02, 0x00002e47, 0x00002b2d, 0x00002427, 0x00002d1c, 0x000026d4, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0x0000238b, 0x00002d22, 0x00002476, 0x000028ae, 0x00002526, 0x0000212b, 0x000026de, 0x00002a1a, 0x00002a02, 0x00002e47, 0x00002b2d, 0x00002427, 0x00002d1c, 0x000026d4, 0x00000001, 0xd00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2526, Value: 0x2d1c) }, + Instructions = [0xf824, 0xcfe4, 0x4770, 0xe7fe], + StartRegs = [0x0000238b, 0x00002d22, 0x00002476, 0x000028ae, 0x00002442, 0x0000212b, 0x000026de, 0x00002a1a, 0x00002a02, 0x00002e47, 0x00002b2d, 0x00002427, 0x00002d1c, 0x000026d4, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0x0000238b, 0x00002d22, 0x00002476, 0x000028ae, 0x00002526, 0x0000212b, 0x000026de, 0x00002a1a, 0x00002a02, 0x00002e47, 0x00002b2d, 0x00002427, 0x00002d1c, 0x000026d4, 0x00000001, 0xd00001f0 + ], + MemoryDelta = [(Address: 0x2526, Value: 0x2d1c)], }, new() { - Instructions = new ushort[] { 0xf820, 0x1c3d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002227, 0x00002b29, 0x0000232a, 0x0000214e, 0x000029ef, 0x00002522, 0x000029d3, 0x0000286c, 0x000029b2, 0x00002147, 0x00002c65, 0x00002891, 0x000029c2, 0x000028a5, 0x00000001, 0x800001f0 }, - FinalRegs = new uint[] { 0x00002227, 0x00002b29, 0x0000232a, 0x0000214e, 0x000029ef, 0x00002522, 0x000029d3, 0x0000286c, 0x000029b2, 0x00002147, 0x00002c65, 0x00002891, 0x000029c2, 0x000028a5, 0x00000001, 0x800001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x21ea, Value: 0x2b29) }, + Instructions = [0xf820, 0x1c3d, 0x4770, 0xe7fe], + StartRegs = [0x00002227, 0x00002b29, 0x0000232a, 0x0000214e, 0x000029ef, 0x00002522, 0x000029d3, 0x0000286c, 0x000029b2, 0x00002147, 0x00002c65, 0x00002891, 0x000029c2, 0x000028a5, 0x00000001, 0x800001f0 + ], + FinalRegs = [0x00002227, 0x00002b29, 0x0000232a, 0x0000214e, 0x000029ef, 0x00002522, 0x000029d3, 0x0000286c, 0x000029b2, 0x00002147, 0x00002c65, 0x00002891, 0x000029c2, 0x000028a5, 0x00000001, 0x800001f0 + ], + MemoryDelta = [(Address: 0x21ea, Value: 0x2b29)], }, new() { - Instructions = new ushort[] { 0xf826, 0x1cdf, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002232, 0x000029a1, 0x00002938, 0x00002ae7, 0x000029a4, 0x00002366, 0x0000273a, 0x000023f6, 0x00002601, 0x00002919, 0x000028e3, 0x00002907, 0x000023c1, 0x00002138, 0x00000001, 0x100001f0 }, - FinalRegs = new uint[] { 0x00002232, 0x000029a1, 0x00002938, 0x00002ae7, 0x000029a4, 0x00002366, 0x0000273a, 0x000023f6, 0x00002601, 0x00002919, 0x000028e3, 0x00002907, 0x000023c1, 0x00002138, 0x00000001, 0x100001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x265a, Value: 0xa15a), (Address: 0x265c, Value: 0x2629) }, + Instructions = [0xf826, 0x1cdf, 0x4770, 0xe7fe], + StartRegs = [0x00002232, 0x000029a1, 0x00002938, 0x00002ae7, 0x000029a4, 0x00002366, 0x0000273a, 0x000023f6, 0x00002601, 0x00002919, 0x000028e3, 0x00002907, 0x000023c1, 0x00002138, 0x00000001, 0x100001f0 + ], + FinalRegs = [0x00002232, 0x000029a1, 0x00002938, 0x00002ae7, 0x000029a4, 0x00002366, 0x0000273a, 0x000023f6, 0x00002601, 0x00002919, 0x000028e3, 0x00002907, 0x000023c1, 0x00002138, 0x00000001, 0x100001f0 + ], + MemoryDelta = [(Address: 0x265a, Value: 0xa15a), (Address: 0x265c, Value: 0x2629)], }, new() { - Instructions = new ushort[] { 0xf82b, 0x3c66, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002974, 0x00002372, 0x0000276c, 0x000021df, 0x00002272, 0x00002928, 0x00002c50, 0x0000290e, 0x00002319, 0x000021d1, 0x00002a82, 0x000027ff, 0x00002730, 0x000027b2, 0x00000001, 0x700001f0 }, - FinalRegs = new uint[] { 0x00002974, 0x00002372, 0x0000276c, 0x000021df, 0x00002272, 0x00002928, 0x00002c50, 0x0000290e, 0x00002319, 0x000021d1, 0x00002a82, 0x000027ff, 0x00002730, 0x000027b2, 0x00000001, 0x700001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2798, Value: 0xdf98), (Address: 0x279a, Value: 0x2721) }, + Instructions = [0xf82b, 0x3c66, 0x4770, 0xe7fe], + StartRegs = [0x00002974, 0x00002372, 0x0000276c, 0x000021df, 0x00002272, 0x00002928, 0x00002c50, 0x0000290e, 0x00002319, 0x000021d1, 0x00002a82, 0x000027ff, 0x00002730, 0x000027b2, 0x00000001, 0x700001f0 + ], + FinalRegs = [0x00002974, 0x00002372, 0x0000276c, 0x000021df, 0x00002272, 0x00002928, 0x00002c50, 0x0000290e, 0x00002319, 0x000021d1, 0x00002a82, 0x000027ff, 0x00002730, 0x000027b2, 0x00000001, 0x700001f0 + ], + MemoryDelta = [(Address: 0x2798, Value: 0xdf98), (Address: 0x279a, Value: 0x2721)], }, new() { - Instructions = new ushort[] { 0xf822, 0x3c06, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000021b8, 0x00002357, 0x00002b00, 0x00002207, 0x00002648, 0x0000219c, 0x000021d2, 0x000023b0, 0x00002368, 0x00002a41, 0x000026ac, 0x00002a86, 0x00002879, 0x00002c1d, 0x00000001, 0x700001f0 }, - FinalRegs = new uint[] { 0x000021b8, 0x00002357, 0x00002b00, 0x00002207, 0x00002648, 0x0000219c, 0x000021d2, 0x000023b0, 0x00002368, 0x00002a41, 0x000026ac, 0x00002a86, 0x00002879, 0x00002c1d, 0x00000001, 0x700001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2afa, Value: 0x2207) }, + Instructions = [0xf822, 0x3c06, 0x4770, 0xe7fe], + StartRegs = [0x000021b8, 0x00002357, 0x00002b00, 0x00002207, 0x00002648, 0x0000219c, 0x000021d2, 0x000023b0, 0x00002368, 0x00002a41, 0x000026ac, 0x00002a86, 0x00002879, 0x00002c1d, 0x00000001, 0x700001f0 + ], + FinalRegs = [0x000021b8, 0x00002357, 0x00002b00, 0x00002207, 0x00002648, 0x0000219c, 0x000021d2, 0x000023b0, 0x00002368, 0x00002a41, 0x000026ac, 0x00002a86, 0x00002879, 0x00002c1d, 0x00000001, 0x700001f0 + ], + MemoryDelta = [(Address: 0x2afa, Value: 0x2207)], }, new() { - Instructions = new ushort[] { 0xf824, 0xac84, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002796, 0x000027c8, 0x0000241b, 0x0000214d, 0x0000220b, 0x00002587, 0x00002130, 0x00002910, 0x00002ac2, 0x00002e74, 0x000028f8, 0x000024bf, 0x0000263a, 0x00002625, 0x00000001, 0x600001f0 }, - FinalRegs = new uint[] { 0x00002796, 0x000027c8, 0x0000241b, 0x0000214d, 0x0000220b, 0x00002587, 0x00002130, 0x00002910, 0x00002ac2, 0x00002e74, 0x000028f8, 0x000024bf, 0x0000263a, 0x00002625, 0x00000001, 0x600001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2186, Value: 0xf886), (Address: 0x2188, Value: 0x2128) }, + Instructions = [0xf824, 0xac84, 0x4770, 0xe7fe], + StartRegs = [0x00002796, 0x000027c8, 0x0000241b, 0x0000214d, 0x0000220b, 0x00002587, 0x00002130, 0x00002910, 0x00002ac2, 0x00002e74, 0x000028f8, 0x000024bf, 0x0000263a, 0x00002625, 0x00000001, 0x600001f0 + ], + FinalRegs = [0x00002796, 0x000027c8, 0x0000241b, 0x0000214d, 0x0000220b, 0x00002587, 0x00002130, 0x00002910, 0x00002ac2, 0x00002e74, 0x000028f8, 0x000024bf, 0x0000263a, 0x00002625, 0x00000001, 0x600001f0 + ], + MemoryDelta = [(Address: 0x2186, Value: 0xf886), (Address: 0x2188, Value: 0x2128)], }, // STRH (imm12) new() { - Instructions = new ushort[] { 0xf8a5, 0x59d4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x000001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x29d4, Value: 0x2000) }, + Instructions = [0xf8a5, 0x59d4, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x000001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x000001f0 + ], + MemoryDelta = [(Address: 0x29d4, Value: 0x2000)], }, new() { - Instructions = new ushort[] { 0xf8ac, 0xc533, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2532, Value: 0x0032), (Address: 0x2534, Value: 0x2520) }, + Instructions = [0xf8ac, 0xc533, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 + ], + MemoryDelta = [(Address: 0x2532, Value: 0x0032), (Address: 0x2534, Value: 0x2520)], }, new() { - Instructions = new ushort[] { 0xf8a3, 0xb559, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x000001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2558, Value: 0x0058), (Address: 0x255a, Value: 0x2520) }, + Instructions = [0xf8a3, 0xb559, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x000001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x000001f0 + ], + MemoryDelta = [(Address: 0x2558, Value: 0x0058), (Address: 0x255a, Value: 0x2520)], }, new() { - Instructions = new ushort[] { 0xf8a5, 0xdb3a, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xb00001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xb00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2b3a, Value: 0x2000) }, + Instructions = [0xf8a5, 0xdb3a, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xb00001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xb00001f0 + ], + MemoryDelta = [(Address: 0x2b3a, Value: 0x2000)], }, new() { - Instructions = new ushort[] { 0xf8a9, 0x02cc, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xc00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x22cc, Value: 0x2000) }, + Instructions = [0xf8a9, 0x02cc, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xc00001f0 + ], + MemoryDelta = [(Address: 0x22cc, Value: 0x2000)], }, // STR (imm8) new() { - Instructions = new ushort[] { 0xf846, 0x1fb4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002b17, 0x0000272f, 0x00002483, 0x0000284c, 0x0000287f, 0x0000238f, 0x0000222d, 0x00002259, 0x0000249d, 0x00002e3f, 0x00002323, 0x00002729, 0x000025c1, 0x00002866, 0x00000001, 0x900001f0 }, - FinalRegs = new uint[] { 0x00002b17, 0x0000272f, 0x00002483, 0x0000284c, 0x0000287f, 0x0000238f, 0x000022e1, 0x00002259, 0x0000249d, 0x00002e3f, 0x00002323, 0x00002729, 0x000025c1, 0x00002866, 0x00000001, 0x900001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x22e0, Value: 0x2fe0), (Address: 0x22e2, Value: 0x0027), (Address: 0x22e4, Value: 0x2200) }, + Instructions = [0xf846, 0x1fb4, 0x4770, 0xe7fe], + StartRegs = [0x00002b17, 0x0000272f, 0x00002483, 0x0000284c, 0x0000287f, 0x0000238f, 0x0000222d, 0x00002259, 0x0000249d, 0x00002e3f, 0x00002323, 0x00002729, 0x000025c1, 0x00002866, 0x00000001, 0x900001f0 + ], + FinalRegs = [0x00002b17, 0x0000272f, 0x00002483, 0x0000284c, 0x0000287f, 0x0000238f, 0x000022e1, 0x00002259, 0x0000249d, 0x00002e3f, 0x00002323, 0x00002729, 0x000025c1, 0x00002866, 0x00000001, 0x900001f0 + ], + MemoryDelta = [(Address: 0x22e0, Value: 0x2fe0), (Address: 0x22e2, Value: 0x0027), (Address: 0x22e4, Value: 0x2200) + ], }, new() { - Instructions = new ushort[] { 0xf844, 0x3f11, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000028e1, 0x00002d48, 0x000027d6, 0x000023ac, 0x000027bb, 0x000026cf, 0x000023c1, 0x00002633, 0x0000214b, 0x00002434, 0x0000239a, 0x000025c6, 0x00002148, 0x00002d1f, 0x00000001, 0x300001f0 }, - FinalRegs = new uint[] { 0x000028e1, 0x00002d48, 0x000027d6, 0x000023ac, 0x000027cc, 0x000026cf, 0x000023c1, 0x00002633, 0x0000214b, 0x00002434, 0x0000239a, 0x000025c6, 0x00002148, 0x00002d1f, 0x00000001, 0x300001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x27cc, Value: 0x23ac), (Address: 0x27ce, Value: 0x0000) }, + Instructions = [0xf844, 0x3f11, 0x4770, 0xe7fe], + StartRegs = [0x000028e1, 0x00002d48, 0x000027d6, 0x000023ac, 0x000027bb, 0x000026cf, 0x000023c1, 0x00002633, 0x0000214b, 0x00002434, 0x0000239a, 0x000025c6, 0x00002148, 0x00002d1f, 0x00000001, 0x300001f0 + ], + FinalRegs = [0x000028e1, 0x00002d48, 0x000027d6, 0x000023ac, 0x000027cc, 0x000026cf, 0x000023c1, 0x00002633, 0x0000214b, 0x00002434, 0x0000239a, 0x000025c6, 0x00002148, 0x00002d1f, 0x00000001, 0x300001f0 + ], + MemoryDelta = [(Address: 0x27cc, Value: 0x23ac), (Address: 0x27ce, Value: 0x0000)], }, new() { - Instructions = new ushort[] { 0xf847, 0x09c2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0000248b, 0x00002396, 0x000023c5, 0x00002be0, 0x0000237d, 0x00002191, 0x00002da0, 0x0000211c, 0x00002d24, 0x000021e6, 0x000024ff, 0x00002268, 0x00002968, 0x0000244d, 0x00000001, 0x800001f0 }, - FinalRegs = new uint[] { 0x0000248b, 0x00002396, 0x000023c5, 0x00002be0, 0x0000237d, 0x00002191, 0x00002da0, 0x0000205a, 0x00002d24, 0x000021e6, 0x000024ff, 0x00002268, 0x00002968, 0x0000244d, 0x00000001, 0x800001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x211c, Value: 0x248b), (Address: 0x211e, Value: 0x0000) }, + Instructions = [0xf847, 0x09c2, 0x4770, 0xe7fe], + StartRegs = [0x0000248b, 0x00002396, 0x000023c5, 0x00002be0, 0x0000237d, 0x00002191, 0x00002da0, 0x0000211c, 0x00002d24, 0x000021e6, 0x000024ff, 0x00002268, 0x00002968, 0x0000244d, 0x00000001, 0x800001f0 + ], + FinalRegs = [0x0000248b, 0x00002396, 0x000023c5, 0x00002be0, 0x0000237d, 0x00002191, 0x00002da0, 0x0000205a, 0x00002d24, 0x000021e6, 0x000024ff, 0x00002268, 0x00002968, 0x0000244d, 0x00000001, 0x800001f0 + ], + MemoryDelta = [(Address: 0x211c, Value: 0x248b), (Address: 0x211e, Value: 0x0000)], }, new() { - Instructions = new ushort[] { 0xf84d, 0x7f23, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000025b0, 0x0000260e, 0x00002343, 0x00002e36, 0x000024c5, 0x000029bc, 0x0000278e, 0x00002b63, 0x00002ce7, 0x000029af, 0x000023bf, 0x00002475, 0x00002197, 0x00002c33, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0x000025b0, 0x0000260e, 0x00002343, 0x00002e36, 0x000024c5, 0x000029bc, 0x0000278e, 0x00002b63, 0x00002ce7, 0x000029af, 0x000023bf, 0x00002475, 0x00002197, 0x00002c56, 0x00000001, 0x200001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2c56, Value: 0x2b63), (Address: 0x2c58, Value: 0x0000) }, + Instructions = [0xf84d, 0x7f23, 0x4770, 0xe7fe], + StartRegs = [0x000025b0, 0x0000260e, 0x00002343, 0x00002e36, 0x000024c5, 0x000029bc, 0x0000278e, 0x00002b63, 0x00002ce7, 0x000029af, 0x000023bf, 0x00002475, 0x00002197, 0x00002c33, 0x00000001, 0x200001f0 + ], + FinalRegs = [0x000025b0, 0x0000260e, 0x00002343, 0x00002e36, 0x000024c5, 0x000029bc, 0x0000278e, 0x00002b63, 0x00002ce7, 0x000029af, 0x000023bf, 0x00002475, 0x00002197, 0x00002c56, 0x00000001, 0x200001f0 + ], + MemoryDelta = [(Address: 0x2c56, Value: 0x2b63), (Address: 0x2c58, Value: 0x0000)], }, new() { - Instructions = new ushort[] { 0xf843, 0x9d24, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002ce4, 0x00002e0e, 0x000026d5, 0x000025fb, 0x00002b78, 0x0000215a, 0x00002af7, 0x0000259c, 0x00002645, 0x000027dc, 0x00002163, 0x000028f5, 0x000029df, 0x0000230b, 0x00000001, 0x500001f0 }, - FinalRegs = new uint[] { 0x00002ce4, 0x00002e0e, 0x000026d5, 0x000025d7, 0x00002b78, 0x0000215a, 0x00002af7, 0x0000259c, 0x00002645, 0x000027dc, 0x00002163, 0x000028f5, 0x000029df, 0x0000230b, 0x00000001, 0x500001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x25d6, Value: 0xdcd6), (Address: 0x25d8, Value: 0x0027), (Address: 0x25da, Value: 0x2500) }, + Instructions = [0xf843, 0x9d24, 0x4770, 0xe7fe], + StartRegs = [0x00002ce4, 0x00002e0e, 0x000026d5, 0x000025fb, 0x00002b78, 0x0000215a, 0x00002af7, 0x0000259c, 0x00002645, 0x000027dc, 0x00002163, 0x000028f5, 0x000029df, 0x0000230b, 0x00000001, 0x500001f0 + ], + FinalRegs = [0x00002ce4, 0x00002e0e, 0x000026d5, 0x000025d7, 0x00002b78, 0x0000215a, 0x00002af7, 0x0000259c, 0x00002645, 0x000027dc, 0x00002163, 0x000028f5, 0x000029df, 0x0000230b, 0x00000001, 0x500001f0 + ], + MemoryDelta = [(Address: 0x25d6, Value: 0xdcd6), (Address: 0x25d8, Value: 0x0027), (Address: 0x25da, Value: 0x2500) + ], }, new() { - Instructions = new ushort[] { 0xf849, 0xdc1a, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002d98, 0x0000254a, 0x00002540, 0x00002324, 0x0000264e, 0x00002523, 0x0000271f, 0x00002875, 0x000023b3, 0x00002680, 0x00002223, 0x000022bf, 0x000025f4, 0x00002d81, 0x00000001, 0x700001f0 }, - FinalRegs = new uint[] { 0x00002d98, 0x0000254a, 0x00002540, 0x00002324, 0x0000264e, 0x00002523, 0x0000271f, 0x00002875, 0x000023b3, 0x00002680, 0x00002223, 0x000022bf, 0x000025f4, 0x00002d81, 0x00000001, 0x700001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2666, Value: 0x2d81), (Address: 0x2668, Value: 0x0000) }, + Instructions = [0xf849, 0xdc1a, 0x4770, 0xe7fe], + StartRegs = [0x00002d98, 0x0000254a, 0x00002540, 0x00002324, 0x0000264e, 0x00002523, 0x0000271f, 0x00002875, 0x000023b3, 0x00002680, 0x00002223, 0x000022bf, 0x000025f4, 0x00002d81, 0x00000001, 0x700001f0 + ], + FinalRegs = [0x00002d98, 0x0000254a, 0x00002540, 0x00002324, 0x0000264e, 0x00002523, 0x0000271f, 0x00002875, 0x000023b3, 0x00002680, 0x00002223, 0x000022bf, 0x000025f4, 0x00002d81, 0x00000001, 0x700001f0 + ], + MemoryDelta = [(Address: 0x2666, Value: 0x2d81), (Address: 0x2668, Value: 0x0000)], }, new() { - Instructions = new ushort[] { 0xf849, 0x0cd1, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0000255a, 0x00002655, 0x00002276, 0x000022e4, 0x00002eef, 0x00002e99, 0x00002b55, 0x00002a40, 0x00002661, 0x00002dbd, 0x00002687, 0x000024e1, 0x000023ea, 0x00002b88, 0x00000001, 0xc00001f0 }, - FinalRegs = new uint[] { 0x0000255a, 0x00002655, 0x00002276, 0x000022e4, 0x00002eef, 0x00002e99, 0x00002b55, 0x00002a40, 0x00002661, 0x00002dbd, 0x00002687, 0x000024e1, 0x000023ea, 0x00002b88, 0x00000001, 0xc00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2cec, Value: 0x255a), (Address: 0x2cee, Value: 0x0000) }, + Instructions = [0xf849, 0x0cd1, 0x4770, 0xe7fe], + StartRegs = [0x0000255a, 0x00002655, 0x00002276, 0x000022e4, 0x00002eef, 0x00002e99, 0x00002b55, 0x00002a40, 0x00002661, 0x00002dbd, 0x00002687, 0x000024e1, 0x000023ea, 0x00002b88, 0x00000001, 0xc00001f0 + ], + FinalRegs = [0x0000255a, 0x00002655, 0x00002276, 0x000022e4, 0x00002eef, 0x00002e99, 0x00002b55, 0x00002a40, 0x00002661, 0x00002dbd, 0x00002687, 0x000024e1, 0x000023ea, 0x00002b88, 0x00000001, 0xc00001f0 + ], + MemoryDelta = [(Address: 0x2cec, Value: 0x255a), (Address: 0x2cee, Value: 0x0000)], }, new() { - Instructions = new ushort[] { 0xf847, 0x7c96, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000027f6, 0x0000222a, 0x000024e1, 0x00002a2d, 0x00002ee8, 0x000023f2, 0x000029de, 0x00002a53, 0x000029da, 0x00002d2c, 0x00002d6f, 0x000026b8, 0x00002777, 0x00002e3a, 0x00000001, 0xf00001f0 }, - FinalRegs = new uint[] { 0x000027f6, 0x0000222a, 0x000024e1, 0x00002a2d, 0x00002ee8, 0x000023f2, 0x000029de, 0x00002a53, 0x000029da, 0x00002d2c, 0x00002d6f, 0x000026b8, 0x00002777, 0x00002e3a, 0x00000001, 0xf00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x29bc, Value: 0x53bc), (Address: 0x29be, Value: 0x002a), (Address: 0x29c0, Value: 0x2900) }, + Instructions = [0xf847, 0x7c96, 0x4770, 0xe7fe], + StartRegs = [0x000027f6, 0x0000222a, 0x000024e1, 0x00002a2d, 0x00002ee8, 0x000023f2, 0x000029de, 0x00002a53, 0x000029da, 0x00002d2c, 0x00002d6f, 0x000026b8, 0x00002777, 0x00002e3a, 0x00000001, 0xf00001f0 + ], + FinalRegs = [0x000027f6, 0x0000222a, 0x000024e1, 0x00002a2d, 0x00002ee8, 0x000023f2, 0x000029de, 0x00002a53, 0x000029da, 0x00002d2c, 0x00002d6f, 0x000026b8, 0x00002777, 0x00002e3a, 0x00000001, 0xf00001f0 + ], + MemoryDelta = [(Address: 0x29bc, Value: 0x53bc), (Address: 0x29be, Value: 0x002a), (Address: 0x29c0, Value: 0x2900) + ], }, new() { - Instructions = new ushort[] { 0xf84d, 0x8cbd, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002a58, 0x00002a59, 0x00002dfd, 0x00002ba8, 0x00002929, 0x00002146, 0x00002706, 0x000025f3, 0x000023d7, 0x0000221f, 0x000027ae, 0x00002a6e, 0x00002824, 0x00002357, 0x00000001, 0x600001f0 }, - FinalRegs = new uint[] { 0x00002a58, 0x00002a59, 0x00002dfd, 0x00002ba8, 0x00002929, 0x00002146, 0x00002706, 0x000025f3, 0x000023d7, 0x0000221f, 0x000027ae, 0x00002a6e, 0x00002824, 0x00002357, 0x00000001, 0x600001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x229a, Value: 0x23d7), (Address: 0x229c, Value: 0x0000) }, + Instructions = [0xf84d, 0x8cbd, 0x4770, 0xe7fe], + StartRegs = [0x00002a58, 0x00002a59, 0x00002dfd, 0x00002ba8, 0x00002929, 0x00002146, 0x00002706, 0x000025f3, 0x000023d7, 0x0000221f, 0x000027ae, 0x00002a6e, 0x00002824, 0x00002357, 0x00000001, 0x600001f0 + ], + FinalRegs = [0x00002a58, 0x00002a59, 0x00002dfd, 0x00002ba8, 0x00002929, 0x00002146, 0x00002706, 0x000025f3, 0x000023d7, 0x0000221f, 0x000027ae, 0x00002a6e, 0x00002824, 0x00002357, 0x00000001, 0x600001f0 + ], + MemoryDelta = [(Address: 0x229a, Value: 0x23d7), (Address: 0x229c, Value: 0x0000)], }, new() { - Instructions = new ushort[] { 0xf846, 0xacaf, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0000284f, 0x00002def, 0x0000292f, 0x000021e8, 0x0000274e, 0x00002518, 0x00002538, 0x00002375, 0x00002d28, 0x0000229a, 0x0000255f, 0x00002eca, 0x00002e15, 0x000021aa, 0x00000001, 0x100001f0 }, - FinalRegs = new uint[] { 0x0000284f, 0x00002def, 0x0000292f, 0x000021e8, 0x0000274e, 0x00002518, 0x00002538, 0x00002375, 0x00002d28, 0x0000229a, 0x0000255f, 0x00002eca, 0x00002e15, 0x000021aa, 0x00000001, 0x100001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2488, Value: 0x5f88), (Address: 0x248a, Value: 0x0025), (Address: 0x248c, Value: 0x2400) }, + Instructions = [0xf846, 0xacaf, 0x4770, 0xe7fe], + StartRegs = [0x0000284f, 0x00002def, 0x0000292f, 0x000021e8, 0x0000274e, 0x00002518, 0x00002538, 0x00002375, 0x00002d28, 0x0000229a, 0x0000255f, 0x00002eca, 0x00002e15, 0x000021aa, 0x00000001, 0x100001f0 + ], + FinalRegs = [0x0000284f, 0x00002def, 0x0000292f, 0x000021e8, 0x0000274e, 0x00002518, 0x00002538, 0x00002375, 0x00002d28, 0x0000229a, 0x0000255f, 0x00002eca, 0x00002e15, 0x000021aa, 0x00000001, 0x100001f0 + ], + MemoryDelta = [(Address: 0x2488, Value: 0x5f88), (Address: 0x248a, Value: 0x0025), (Address: 0x248c, Value: 0x2400) + ], }, // STR (imm12) new() { - Instructions = new ushort[] { 0xf8cc, 0x1a6e, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2a6e, Value: 0x2000), (Address: 0x2a70, Value: 0x0000) }, + Instructions = [0xf8cc, 0x1a6e, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 + ], + MemoryDelta = [(Address: 0x2a6e, Value: 0x2000), (Address: 0x2a70, Value: 0x0000)], }, new() { - Instructions = new ushort[] { 0xf8c9, 0xcfc1, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x2fc0, Value: 0x00c0), (Address: 0x2fc2, Value: 0x0020), (Address: 0x2fc4, Value: 0x2f00) }, + Instructions = [0xf8c9, 0xcfc1, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 + ], + MemoryDelta = [(Address: 0x2fc0, Value: 0x00c0), (Address: 0x2fc2, Value: 0x0020), (Address: 0x2fc4, Value: 0x2f00) + ], }, new() { - Instructions = new ushort[] { 0xf8c3, 0xb5dd, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x600001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x600001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x25dc, Value: 0x00dc), (Address: 0x25de, Value: 0x0020), (Address: 0x25e0, Value: 0x2500) }, + Instructions = [0xf8c3, 0xb5dd, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x600001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x600001f0 + ], + MemoryDelta = [(Address: 0x25dc, Value: 0x00dc), (Address: 0x25de, Value: 0x0020), (Address: 0x25e0, Value: 0x2500) + ], }, new() { - Instructions = new ushort[] { 0xf8c0, 0x69e9, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x29e8, Value: 0x00e8), (Address: 0x29ea, Value: 0x0020), (Address: 0x29ec, Value: 0x2900) }, + Instructions = [0xf8c0, 0x69e9, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xe00001f0 + ], + MemoryDelta = [(Address: 0x29e8, Value: 0x00e8), (Address: 0x29ea, Value: 0x0020), (Address: 0x29ec, Value: 0x2900) + ], }, new() { - Instructions = new ushort[] { 0xf8cd, 0x028f, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x600001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x600001f0 }, - MemoryDelta = new (ulong Address, ushort Value)[] { (Address: 0x228e, Value: 0x008e), (Address: 0x2290, Value: 0x0020), (Address: 0x2292, Value: 0x2200) }, + Instructions = [0xf8cd, 0x028f, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x600001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x600001f0 + ], + MemoryDelta = [(Address: 0x228e, Value: 0x008e), (Address: 0x2290, Value: 0x0020), (Address: 0x2292, Value: 0x2200) + ], }, // LDRB (imm8) new() { - Instructions = new ushort[] { 0xf816, 0x1c48, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002cb8, 0x00002345, 0x00002ebc, 0x00002db8, 0x000021d4, 0x000026e4, 0x00002458, 0x000029e3, 0x000028d2, 0x000027f4, 0x000023d6, 0x00002def, 0x0000285c, 0x00002d06, 0x00000001, 0x600001f0 }, - FinalRegs = new uint[] { 0x00002cb8, 0x00000010, 0x00002ebc, 0x00002db8, 0x000021d4, 0x000026e4, 0x00002458, 0x000029e3, 0x000028d2, 0x000027f4, 0x000023d6, 0x00002def, 0x0000285c, 0x00002d06, 0x00000001, 0x600001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf816, 0x1c48, 0x4770, 0xe7fe], + StartRegs = [0x00002cb8, 0x00002345, 0x00002ebc, 0x00002db8, 0x000021d4, 0x000026e4, 0x00002458, 0x000029e3, 0x000028d2, 0x000027f4, 0x000023d6, 0x00002def, 0x0000285c, 0x00002d06, 0x00000001, 0x600001f0 + ], + FinalRegs = [0x00002cb8, 0x00000010, 0x00002ebc, 0x00002db8, 0x000021d4, 0x000026e4, 0x00002458, 0x000029e3, 0x000028d2, 0x000027f4, 0x000023d6, 0x00002def, 0x0000285c, 0x00002d06, 0x00000001, 0x600001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf815, 0x2d6e, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000021e4, 0x00002425, 0x00002e42, 0x00002a58, 0x00002708, 0x00002965, 0x00002a1d, 0x00002ed5, 0x00002cc4, 0x000026e1, 0x00002b4b, 0x00002ade, 0x00002824, 0x00002975, 0x00000001, 0x100001f0 }, - FinalRegs = new uint[] { 0x000021e4, 0x00002425, 0x00000028, 0x00002a58, 0x00002708, 0x000028f7, 0x00002a1d, 0x00002ed5, 0x00002cc4, 0x000026e1, 0x00002b4b, 0x00002ade, 0x00002824, 0x00002975, 0x00000001, 0x100001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf815, 0x2d6e, 0x4770, 0xe7fe], + StartRegs = [0x000021e4, 0x00002425, 0x00002e42, 0x00002a58, 0x00002708, 0x00002965, 0x00002a1d, 0x00002ed5, 0x00002cc4, 0x000026e1, 0x00002b4b, 0x00002ade, 0x00002824, 0x00002975, 0x00000001, 0x100001f0 + ], + FinalRegs = [0x000021e4, 0x00002425, 0x00000028, 0x00002a58, 0x00002708, 0x000028f7, 0x00002a1d, 0x00002ed5, 0x00002cc4, 0x000026e1, 0x00002b4b, 0x00002ade, 0x00002824, 0x00002975, 0x00000001, 0x100001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf818, 0x0d33, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002492, 0x0000214d, 0x00002827, 0x000021af, 0x0000215e, 0x000028d6, 0x000024ec, 0x00002984, 0x0000297b, 0x000024b5, 0x000024ca, 0x0000298f, 0x00002339, 0x00002b7e, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0x00000048, 0x0000214d, 0x00002827, 0x000021af, 0x0000215e, 0x000028d6, 0x000024ec, 0x00002984, 0x00002948, 0x000024b5, 0x000024ca, 0x0000298f, 0x00002339, 0x00002b7e, 0x00000001, 0xd00001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf818, 0x0d33, 0x4770, 0xe7fe], + StartRegs = [0x00002492, 0x0000214d, 0x00002827, 0x000021af, 0x0000215e, 0x000028d6, 0x000024ec, 0x00002984, 0x0000297b, 0x000024b5, 0x000024ca, 0x0000298f, 0x00002339, 0x00002b7e, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0x00000048, 0x0000214d, 0x00002827, 0x000021af, 0x0000215e, 0x000028d6, 0x000024ec, 0x00002984, 0x00002948, 0x000024b5, 0x000024ca, 0x0000298f, 0x00002339, 0x00002b7e, 0x00000001, 0xd00001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf810, 0xbff3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002ea6, 0x000024fa, 0x00002346, 0x00002748, 0x0000283f, 0x00002770, 0x000023e3, 0x000021aa, 0x0000214a, 0x00002d58, 0x00002159, 0x000022e7, 0x00002242, 0x00002728, 0x00000001, 0x600001f0 }, - FinalRegs = new uint[] { 0x00002f99, 0x000024fa, 0x00002346, 0x00002748, 0x0000283f, 0x00002770, 0x000023e3, 0x000021aa, 0x0000214a, 0x00002d58, 0x00002159, 0x0000002f, 0x00002242, 0x00002728, 0x00000001, 0x600001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf810, 0xbff3, 0x4770, 0xe7fe], + StartRegs = [0x00002ea6, 0x000024fa, 0x00002346, 0x00002748, 0x0000283f, 0x00002770, 0x000023e3, 0x000021aa, 0x0000214a, 0x00002d58, 0x00002159, 0x000022e7, 0x00002242, 0x00002728, 0x00000001, 0x600001f0 + ], + FinalRegs = [0x00002f99, 0x000024fa, 0x00002346, 0x00002748, 0x0000283f, 0x00002770, 0x000023e3, 0x000021aa, 0x0000214a, 0x00002d58, 0x00002159, 0x0000002f, 0x00002242, 0x00002728, 0x00000001, 0x600001f0 + ], + MemoryDelta = [], }, // LDRB (imm12) new() { - Instructions = new ushort[] { 0xf892, 0xcc8f, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x100001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x0000002c, 0x00002000, 0x00000001, 0x100001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf892, 0xcc8f, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x100001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x0000002c, 0x00002000, 0x00000001, 0x100001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf89a, 0x7fdc, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x000000dc, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x200001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf89a, 0x7fdc, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x200001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x000000dc, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x200001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf890, 0x5f9f, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x800001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x0000002f, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x800001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf890, 0x5f9f, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x800001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x0000002f, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x800001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf894, 0xdda1, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x900001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x0000002d, 0x00000001, 0x900001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf894, 0xdda1, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x900001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x0000002d, 0x00000001, 0x900001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf890, 0xc281, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x100001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000022, 0x00002000, 0x00000001, 0x100001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf890, 0xc281, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x100001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000022, 0x00002000, 0x00000001, 0x100001f0 + ], + MemoryDelta = [], }, // LDRH (imm8) new() { - Instructions = new ushort[] { 0xf834, 0x89d8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002a9e, 0x00002d84, 0x00002e9b, 0x00002e7f, 0x000024a2, 0x00002b7b, 0x00002e3b, 0x0000299a, 0x00002dff, 0x00002a9e, 0x000027b2, 0x00002a90, 0x00002883, 0x0000288d, 0x00000001, 0x500001f0 }, - FinalRegs = new uint[] { 0x00002a9e, 0x00002d84, 0x00002e9b, 0x00002e7f, 0x000023ca, 0x00002b7b, 0x00002e3b, 0x0000299a, 0x000024a2, 0x00002a9e, 0x000027b2, 0x00002a90, 0x00002883, 0x0000288d, 0x00000001, 0x500001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf834, 0x89d8, 0x4770, 0xe7fe], + StartRegs = [0x00002a9e, 0x00002d84, 0x00002e9b, 0x00002e7f, 0x000024a2, 0x00002b7b, 0x00002e3b, 0x0000299a, 0x00002dff, 0x00002a9e, 0x000027b2, 0x00002a90, 0x00002883, 0x0000288d, 0x00000001, 0x500001f0 + ], + FinalRegs = [0x00002a9e, 0x00002d84, 0x00002e9b, 0x00002e7f, 0x000023ca, 0x00002b7b, 0x00002e3b, 0x0000299a, 0x000024a2, 0x00002a9e, 0x000027b2, 0x00002a90, 0x00002883, 0x0000288d, 0x00000001, 0x500001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf833, 0x6be4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000028bd, 0x00002b0e, 0x00002bc1, 0x00002a83, 0x00002293, 0x00002c7c, 0x00002bfe, 0x00002eb7, 0x0000299b, 0x000026e6, 0x0000219c, 0x00002d5e, 0x00002cd4, 0x000026cf, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0x000028bd, 0x00002b0e, 0x00002bc1, 0x00002b67, 0x00002293, 0x00002c7c, 0x0000842a, 0x00002eb7, 0x0000299b, 0x000026e6, 0x0000219c, 0x00002d5e, 0x00002cd4, 0x000026cf, 0x00000001, 0xd00001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf833, 0x6be4, 0x4770, 0xe7fe], + StartRegs = [0x000028bd, 0x00002b0e, 0x00002bc1, 0x00002a83, 0x00002293, 0x00002c7c, 0x00002bfe, 0x00002eb7, 0x0000299b, 0x000026e6, 0x0000219c, 0x00002d5e, 0x00002cd4, 0x000026cf, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0x000028bd, 0x00002b0e, 0x00002bc1, 0x00002b67, 0x00002293, 0x00002c7c, 0x0000842a, 0x00002eb7, 0x0000299b, 0x000026e6, 0x0000219c, 0x00002d5e, 0x00002cd4, 0x000026cf, 0x00000001, 0xd00001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf83d, 0x1bca, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0000250e, 0x00002776, 0x000029e5, 0x0000276e, 0x00002c6b, 0x00002712, 0x00002a85, 0x00002d56, 0x000024c0, 0x00002d86, 0x0000254a, 0x00002549, 0x00002795, 0x00002e97, 0x00000001, 0x200001f0 }, - FinalRegs = new uint[] { 0x0000250e, 0x0000982e, 0x000029e5, 0x0000276e, 0x00002c6b, 0x00002712, 0x00002a85, 0x00002d56, 0x000024c0, 0x00002d86, 0x0000254a, 0x00002549, 0x00002795, 0x00002f61, 0x00000001, 0x200001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf83d, 0x1bca, 0x4770, 0xe7fe], + StartRegs = [0x0000250e, 0x00002776, 0x000029e5, 0x0000276e, 0x00002c6b, 0x00002712, 0x00002a85, 0x00002d56, 0x000024c0, 0x00002d86, 0x0000254a, 0x00002549, 0x00002795, 0x00002e97, 0x00000001, 0x200001f0 + ], + FinalRegs = [0x0000250e, 0x0000982e, 0x000029e5, 0x0000276e, 0x00002c6b, 0x00002712, 0x00002a85, 0x00002d56, 0x000024c0, 0x00002d86, 0x0000254a, 0x00002549, 0x00002795, 0x00002f61, 0x00000001, 0x200001f0 + ], + MemoryDelta = [], }, // LDRH (imm12) new() { - Instructions = new ushort[] { 0xf8b7, 0x92fc, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xa00001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x000022fc, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xa00001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf8b7, 0x92fc, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xa00001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x000022fc, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xa00001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf8ba, 0xadd9, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xa00001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x0000da2d, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xa00001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf8ba, 0xadd9, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xa00001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x0000da2d, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xa00001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf8bb, 0x0bb0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0x00002bb0, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xd00001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf8bb, 0x0bb0, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0x00002bb0, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0xd00001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf8b8, 0xc3f8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x600001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x000023f8, 0x00002000, 0x00000001, 0x600001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf8b8, 0xc3f8, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x600001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x000023f8, 0x00002000, 0x00000001, 0x600001f0 + ], + MemoryDelta = [], }, // LDR (imm8) new() { - Instructions = new ushort[] { 0xf85b, 0x3fd1, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002a19, 0x00002e5b, 0x0000231b, 0x000021fa, 0x00002e95, 0x00002bd5, 0x00002e9c, 0x00002dfa, 0x000021d8, 0x00002ce1, 0x00002318, 0x00002735, 0x0000247d, 0x00002436, 0x00000001, 0xf00001f0 }, - FinalRegs = new uint[] { 0x00002a19, 0x00002e5b, 0x0000231b, 0x28082806, 0x00002e95, 0x00002bd5, 0x00002e9c, 0x00002dfa, 0x000021d8, 0x00002ce1, 0x00002318, 0x00002806, 0x0000247d, 0x00002436, 0x00000001, 0xf00001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf85b, 0x3fd1, 0x4770, 0xe7fe], + StartRegs = [0x00002a19, 0x00002e5b, 0x0000231b, 0x000021fa, 0x00002e95, 0x00002bd5, 0x00002e9c, 0x00002dfa, 0x000021d8, 0x00002ce1, 0x00002318, 0x00002735, 0x0000247d, 0x00002436, 0x00000001, 0xf00001f0 + ], + FinalRegs = [0x00002a19, 0x00002e5b, 0x0000231b, 0x28082806, 0x00002e95, 0x00002bd5, 0x00002e9c, 0x00002dfa, 0x000021d8, 0x00002ce1, 0x00002318, 0x00002806, 0x0000247d, 0x00002436, 0x00000001, 0xf00001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf854, 0xab9e, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0000214f, 0x00002578, 0x00002a98, 0x000021b0, 0x00002ebb, 0x0000284a, 0x00002319, 0x00002581, 0x00002179, 0x00002594, 0x00002373, 0x000028f4, 0x00002ec5, 0x00002e0a, 0x00000001, 0xb00001f0 }, - FinalRegs = new uint[] { 0x0000214f, 0x00002578, 0x00002a98, 0x000021b0, 0x00002f59, 0x0000284a, 0x00002319, 0x00002581, 0x00002179, 0x00002594, 0xbe2ebc2e, 0x000028f4, 0x00002ec5, 0x00002e0a, 0x00000001, 0xb00001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf854, 0xab9e, 0x4770, 0xe7fe], + StartRegs = [0x0000214f, 0x00002578, 0x00002a98, 0x000021b0, 0x00002ebb, 0x0000284a, 0x00002319, 0x00002581, 0x00002179, 0x00002594, 0x00002373, 0x000028f4, 0x00002ec5, 0x00002e0a, 0x00000001, 0xb00001f0 + ], + FinalRegs = [0x0000214f, 0x00002578, 0x00002a98, 0x000021b0, 0x00002f59, 0x0000284a, 0x00002319, 0x00002581, 0x00002179, 0x00002594, 0xbe2ebc2e, 0x000028f4, 0x00002ec5, 0x00002e0a, 0x00000001, 0xb00001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf852, 0x6d2d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002e27, 0x00002676, 0x00002bde, 0x000022d9, 0x00002362, 0x00002d4b, 0x00002dab, 0x000022b6, 0x0000229c, 0x00002507, 0x00002848, 0x0000225f, 0x00002ac2, 0x000023c3, 0x00000001, 0xf00001f0 }, - FinalRegs = new uint[] { 0x00002e27, 0x00002676, 0x00002bb1, 0x000022d9, 0x00002362, 0x00002d4b, 0xb42bb22b, 0x000022b6, 0x0000229c, 0x00002507, 0x00002848, 0x0000225f, 0x00002ac2, 0x000023c3, 0x00000001, 0xf00001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf852, 0x6d2d, 0x4770, 0xe7fe], + StartRegs = [0x00002e27, 0x00002676, 0x00002bde, 0x000022d9, 0x00002362, 0x00002d4b, 0x00002dab, 0x000022b6, 0x0000229c, 0x00002507, 0x00002848, 0x0000225f, 0x00002ac2, 0x000023c3, 0x00000001, 0xf00001f0 + ], + FinalRegs = [0x00002e27, 0x00002676, 0x00002bb1, 0x000022d9, 0x00002362, 0x00002d4b, 0xb42bb22b, 0x000022b6, 0x0000229c, 0x00002507, 0x00002848, 0x0000225f, 0x00002ac2, 0x000023c3, 0x00000001, 0xf00001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf850, 0x8da5, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002559, 0x0000285e, 0x000021de, 0x00002223, 0x000023ff, 0x00002e05, 0x00002bf3, 0x000024a5, 0x00002124, 0x00002768, 0x00002a14, 0x0000219e, 0x00002739, 0x00002e3c, 0x00000001, 0xd00001f0 }, - FinalRegs = new uint[] { 0x000024b4, 0x0000285e, 0x000021de, 0x00002223, 0x000023ff, 0x00002e05, 0x00002bf3, 0x000024a5, 0x24b624b4, 0x00002768, 0x00002a14, 0x0000219e, 0x00002739, 0x00002e3c, 0x00000001, 0xd00001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf850, 0x8da5, 0x4770, 0xe7fe], + StartRegs = [0x00002559, 0x0000285e, 0x000021de, 0x00002223, 0x000023ff, 0x00002e05, 0x00002bf3, 0x000024a5, 0x00002124, 0x00002768, 0x00002a14, 0x0000219e, 0x00002739, 0x00002e3c, 0x00000001, 0xd00001f0 + ], + FinalRegs = [0x000024b4, 0x0000285e, 0x000021de, 0x00002223, 0x000023ff, 0x00002e05, 0x00002bf3, 0x000024a5, 0x24b624b4, 0x00002768, 0x00002a14, 0x0000219e, 0x00002739, 0x00002e3c, 0x00000001, 0xd00001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf857, 0x19f6, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x000027f5, 0x0000285e, 0x000025f6, 0x00002e22, 0x00002224, 0x00002870, 0x00002ecc, 0x000024cf, 0x00002711, 0x0000241b, 0x00002ddf, 0x00002545, 0x000028ca, 0x000023c5, 0x00000001, 0x400001f0 }, - FinalRegs = new uint[] { 0x000027f5, 0xd224d024, 0x000025f6, 0x00002e22, 0x00002224, 0x00002870, 0x00002ecc, 0x000023d9, 0x00002711, 0x0000241b, 0x00002ddf, 0x00002545, 0x000028ca, 0x000023c5, 0x00000001, 0x400001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf857, 0x19f6, 0x4770, 0xe7fe], + StartRegs = [0x000027f5, 0x0000285e, 0x000025f6, 0x00002e22, 0x00002224, 0x00002870, 0x00002ecc, 0x000024cf, 0x00002711, 0x0000241b, 0x00002ddf, 0x00002545, 0x000028ca, 0x000023c5, 0x00000001, 0x400001f0 + ], + FinalRegs = [0x000027f5, 0xd224d024, 0x000025f6, 0x00002e22, 0x00002224, 0x00002870, 0x00002ecc, 0x000023d9, 0x00002711, 0x0000241b, 0x00002ddf, 0x00002545, 0x000028ca, 0x000023c5, 0x00000001, 0x400001f0 + ], + MemoryDelta = [], }, // LDR (imm12) new() { - Instructions = new ushort[] { 0xf8d1, 0xc65e, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x000001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x2660265e, 0x00002000, 0x00000001, 0x000001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf8d1, 0xc65e, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x000001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x2660265e, 0x00002000, 0x00000001, 0x000001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf8db, 0xd09b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x800001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x9e209c20, 0x00000001, 0x800001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf8db, 0xd09b, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x800001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x9e209c20, 0x00000001, 0x800001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf8d2, 0x6fde, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x900001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x2fe02fde, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x900001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), + Instructions = [0xf8d2, 0x6fde, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x900001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x2fe02fde, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x900001f0 + ], + MemoryDelta = [], }, new() { - Instructions = new ushort[] { 0xf8dc, 0x3de5, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 }, - FinalRegs = new uint[] { 0x00002000, 0x00002000, 0x00002000, 0xe82de62d, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 }, - MemoryDelta = Array.Empty<(ulong Address, ushort Value)>(), - }, - }; + Instructions = [0xf8dc, 0x3de5, 0x4770, 0xe7fe], + StartRegs = [0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 + ], + FinalRegs = [0x00002000, 0x00002000, 0x00002000, 0xe82de62d, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00002000, 0x00000001, 0x500001f0 + ], + MemoryDelta = [], + } + ]; } } diff --git a/src/Ryujinx.Tests/Cpu/CpuTestThumb.cs b/src/Ryujinx.Tests/Cpu/CpuTestThumb.cs index 6111e53fa..1f00c663d 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTestThumb.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTestThumb.cs @@ -111,6 +111,7 @@ namespace Ryujinx.Tests.Cpu Assert.That(GetContext().GetPstateFlag(PState.CFlag), Is.EqualTo(w1 >= imm)); Assert.That(GetContext().GetPstateFlag(PState.VFlag), Is.EqualTo((overflow >> 31) != 0)); } + break; case 2: Assert.That(GetContext().GetX(1), Is.EqualTo((w1 + imm) & 0xffffffffu)); @@ -166,6 +167,7 @@ namespace Ryujinx.Tests.Cpu Assert.That(GetContext().GetPstateFlag(PState.NFlag), Is.EqualTo((result >> 31) != 0)); Assert.That(GetContext().GetPstateFlag(PState.ZFlag), Is.EqualTo(result == 0)); } + break; case 9: Assert.That(GetContext().GetX(1), Is.EqualTo((uint)-w2)); @@ -180,6 +182,7 @@ namespace Ryujinx.Tests.Cpu Assert.That(GetContext().GetPstateFlag(PState.CFlag), Is.EqualTo(w1 >= w2)); Assert.That(GetContext().GetPstateFlag(PState.VFlag), Is.EqualTo((overflow >> 31) != 0)); } + break; case 11: Assert.That(GetContext().GetX(1), Is.EqualTo(w1)); @@ -191,6 +194,7 @@ namespace Ryujinx.Tests.Cpu Assert.That(GetContext().GetPstateFlag(PState.CFlag), Is.EqualTo(result < w1)); Assert.That(GetContext().GetPstateFlag(PState.VFlag), Is.EqualTo((overflow >> 31) != 0)); } + break; case 12: Assert.That(GetContext().GetX(1), Is.EqualTo(w1 | w2)); @@ -244,6 +248,7 @@ namespace Ryujinx.Tests.Cpu Assert.That(GetContext().GetPstateFlag(PState.CFlag), Is.EqualTo(w1 >= w2)); Assert.That(GetContext().GetPstateFlag(PState.VFlag), Is.EqualTo((overflow >> 31) != 0)); } + break; case 2: Assert.That(GetContext().GetX((int)rd), Is.EqualTo(w2)); @@ -278,607 +283,907 @@ namespace Ryujinx.Tests.Cpu } public static readonly PrecomputedThumbTestCase[] RandomTestCases = - { + [ new() { - Instructions = new ushort[] { 0x42ab, 0xabed, 0x43fc, 0x4360, 0x40c1, 0x40b5, 0x4353, 0x43ac, 0xba74, 0x4613, 0xb03a, 0xbf2a, 0xa5bd, 0x187b, 0x410a, 0x4405, 0x15b3, 0x1472, 0xb248, 0x43a6, 0x41af, 0xbaf4, 0x1a6d, 0x4684, 0xbf04, 0x4068, 0xb26e, 0x014b, 0x4064, 0xba15, 0x3d2d, 0xb22d, 0x4378, 0x2501, 0x4279, 0xb299, 0x1586, 0x42e7, 0x2f55, 0xba55, 0x1f6f, 0x443d, 0x4194, 0xbfcb, 0xbacd, 0xb2a0, 0x406b, 0x1b65, 0xbfd0, 0x1bf7, 0x41e7, 0xba76, 0x436f, 0x46f8, 0x4042, 0x1ffe, 0x447c, 0xba50, 0x341e, 0x42fd, 0x409c, 0xbf09, 0xb2cf, 0x1c99, 0x41f7, 0x41a6, 0x4278, 0x4040, 0x3747, 0x301a, 0x01cc, 0x4304, 0x1ca3, 0xab1d, 0x43dd, 0x41e3, 0x35ad, 0x43f5, 0xb091, 0x3214, 0x44f1, 0x41d7, 0xb244, 0xb2a2, 0x41e1, 0x3d7a, 0xbf24, 0xbac1, 0x0059, 0xba3b, 0xabe5, 0x4550, 0x0a9e, 0xbfe2, 0x034e, 0xb0b7, 0x0aec, 0x1ee6, 0x3276, 0x0866, 0xa763, 0x1e45, 0x4275, 0xad25, 0x416d, 0x0d6d, 0x0b50, 0xb200, 0x1eba, 0x4378, 0x0547, 0x43bb, 0xb2f2, 0xb2af, 0x1ea0, 0x25b0, 0x4287, 0x1d55, 0x2225, 0xbf46, 0xb276, 0xba57, 0x4253, 0x19e0, 0xbf32, 0x1b06, 0x40ab, 0xb2a4, 0x1eda, 0x1dfd, 0xaabd, 0x1b08, 0xba0e, 0x4014, 0xa079, 0x119b, 0x1d17, 0x41b1, 0x005a, 0xb2ba, 0x419a, 0x4361, 0x2d2a, 0xba36, 0x1b49, 0xbf0c, 0x423c, 0xbae6, 0x2bc0, 0x409c, 0xbfa0, 0xba02, 0x2496, 0xb279, 0xbace, 0xb2e0, 0xbf07, 0x3b17, 0x40a9, 0x3154, 0x41ab, 0x284e, 0xb03c, 0xbf06, 0x41ff, 0xba45, 0x4144, 0xab32, 0x4000, 0xb2b2, 0x3729, 0x46fb, 0xb042, 0x32d0, 0x0557, 0x3583, 0xb249, 0x43f5, 0x0a54, 0x416f, 0x1fc6, 0x4560, 0xb2f6, 0xa114, 0x1dd7, 0x40b4, 0x4304, 0xbfc2, 0x41f2, 0xb2e2, 0xb0d4, 0xbaca, 0xbf65, 0x4065, 0xa1e5, 0xb043, 0x4004, 0xb237, 0x41e9, 0xba0f, 0xaa8e, 0x421d, 0x1d12, 0x435e, 0x434b, 0x4356, 0xacaf, 0x4551, 0x1935, 0x1c1a, 0xba67, 0x2441, 0xbf9a, 0x41a0, 0xb2d8, 0x1c00, 0xad68, 0x4185, 0xb272, 0x43ba, 0x436c, 0xb08b, 0xb2f4, 0x4379, 0x1d0f, 0x46f8, 0x4379, 0x1b8f, 0x4260, 0x40d8, 0xbfa7, 0x0730, 0xb27d, 0xb242, 0x43d3, 0x46fd, 0xbf92, 0xb067, 0xaa15, 0x428c, 0xb2e1, 0x43e5, 0xb2f6, 0x1da1, 0x023e, 0x1a86, 0xba01, 0xb203, 0x13ae, 0xa6a6, 0x45d8, 0xba4c, 0xb228, 0x438c, 0xbae8, 0x4378, 0x3b55, 0xbf5c, 0xb036, 0xb261, 0x1bea, 0x41b8, 0x43f5, 0xba70, 0xa959, 0xb2a9, 0x41fd, 0x19ad, 0x41cd, 0x4171, 0xb046, 0xbf37, 0x431e, 0x4302, 0xb04f, 0x396f, 0x44f0, 0x36d3, 0x01b0, 0x18f5, 0x424b, 0xb27a, 0x43a9, 0xba49, 0x4357, 0x41e5, 0x42d4, 0x0f27, 0x4325, 0x1f9b, 0x447a, 0x46b8, 0xbf60, 0x43c5, 0xa78b, 0x46b2, 0xb2c4, 0x4322, 0xbfad, 0xbf90, 0x4275, 0x40c4, 0x1e91, 0xba0c, 0xbfd0, 0xafd3, 0xbfa0, 0xb2ff, 0xb2dc, 0x43a1, 0xb0db, 0xbf1e, 0x269d, 0xb21a, 0x405d, 0x1822, 0x3dc1, 0xb247, 0x119e, 0xb2b9, 0x4056, 0xaedd, 0xba59, 0x40ed, 0x43c0, 0xbf5f, 0xba35, 0xad1b, 0xb0db, 0x274a, 0x4042, 0x404c, 0xb0a6, 0x2983, 0x41b9, 0x4226, 0x455b, 0xbad3, 0xba5c, 0x42e3, 0xbf8f, 0x3b28, 0xadf6, 0x0321, 0x41c0, 0x223b, 0x40ca, 0x1ea5, 0x4256, 0x409a, 0x4339, 0xba7c, 0x43cf, 0x40bb, 0xb217, 0x427a, 0x289f, 0xb28b, 0xb250, 0xbf2a, 0xb084, 0x410c, 0x416b, 0x4079, 0xb2c9, 0x4149, 0x4143, 0x0c11, 0x461f, 0x18ed, 0x41e1, 0x4651, 0xba1c, 0x422b, 0x44fb, 0xb2b4, 0xbfde, 0x45e1, 0x4601, 0x4483, 0xa182, 0x3311, 0x40bd, 0x446a, 0x431c, 0x2f1e, 0xbac8, 0x02c3, 0x43d5, 0x415d, 0x42f7, 0x1cad, 0x1597, 0xb2cd, 0x1cbd, 0x42df, 0x069e, 0x0986, 0x435d, 0xbad5, 0xbf39, 0x1044, 0x417c, 0x3afb, 0x3be4, 0xb2b8, 0xb0b6, 0x401b, 0x1e4f, 0x4270, 0x4278, 0xacb6, 0xbad1, 0xbaee, 0x1920, 0xba01, 0x4367, 0xb24d, 0xb2db, 0x05da, 0xa2c6, 0x4627, 0xba2b, 0xbfa3, 0x42aa, 0x3637, 0xbafa, 0x4364, 0x43f3, 0xaaea, 0x40a5, 0x424f, 0x45a3, 0x44e9, 0x4477, 0xb09e, 0x42ea, 0x44b9, 0x4694, 0x4629, 0xba4b, 0x42c8, 0x412e, 0xbf9e, 0xba0a, 0x420a, 0xb2d0, 0xbae8, 0xbfb3, 0x40f8, 0x36d0, 0x40bd, 0x4395, 0x0d0f, 0xbafa, 0xb20b, 0x41c6, 0x40ea, 0xbf62, 0x429b, 0x4142, 0x43a6, 0x1f1b, 0xa9b4, 0x4455, 0xb0b1, 0xbae8, 0xb24c, 0x0396, 0x4360, 0xb26d, 0x0693, 0x1842, 0xba1e, 0xb29b, 0xba44, 0x1c45, 0x456f, 0x1a6a, 0x439c, 0xb24d, 0xac7d, 0x410b, 0x419f, 0xbf7e, 0x4057, 0x4377, 0x1ea6, 0x2f69, 0xbfc0, 0x1a75, 0xb2cf, 0x3759, 0x4187, 0x429b, 0x40d7, 0x18e7, 0x2eaa, 0x2bc6, 0xbf0d, 0x028c, 0x40f2, 0x421c, 0xbad1, 0xbf70, 0x41c5, 0xb012, 0x42fe, 0xb2ef, 0xbf96, 0xba10, 0x4103, 0x4434, 0x449a, 0x0b03, 0x40d5, 0x4221, 0x345a, 0x1491, 0xb2fc, 0x46e1, 0x456c, 0xb0f0, 0xb2ba, 0x4254, 0x415f, 0x4269, 0x434f, 0xb04c, 0x4316, 0xb049, 0xba18, 0x1988, 0x4194, 0x4412, 0xbfb3, 0x43f8, 0xba4f, 0xb218, 0x4033, 0x38a4, 0x3d99, 0xa6b2, 0xb076, 0xbfc0, 0x42c6, 0x40ad, 0x432a, 0x4226, 0x1ee9, 0x1aa5, 0xbf13, 0x3370, 0x2820, 0x1191, 0x432c, 0x40b8, 0x464e, 0x1e58, 0x462f, 0xb022, 0x40ba, 0x464f, 0x4083, 0x4683, 0x16c7, 0xbf43, 0x42a0, 0xba56, 0x2f3d, 0x417b, 0x43ff, 0xac7d, 0xb285, 0x4041, 0xba51, 0xbf31, 0x4041, 0xb281, 0xb2d8, 0x1a99, 0x4342, 0x402f, 0x4185, 0x40f3, 0xbfd0, 0x4274, 0x40a3, 0x4064, 0x39a4, 0xba04, 0x408e, 0x3250, 0x3c3d, 0xa2bb, 0xba1c, 0x1a4b, 0x40e5, 0x3ca6, 0xbf67, 0x4285, 0xa9f3, 0x46bc, 0x420d, 0xba05, 0xb009, 0x417c, 0xb27e, 0x1c48, 0x41c8, 0x42e3, 0x1e8c, 0x42b4, 0xba08, 0x3598, 0xb263, 0xb2f2, 0x1053, 0x40da, 0x37c7, 0x370d, 0x1853, 0x41e9, 0xb061, 0x1af7, 0x4015, 0x44aa, 0x1db0, 0x4165, 0xbf27, 0x3d1f, 0x42f4, 0x432f, 0x407c, 0x1457, 0x43c4, 0xb226, 0x40d3, 0x4317, 0x409d, 0x4024, 0xb062, 0xaeba, 0x3c71, 0x43a1, 0xada2, 0x4115, 0xba3f, 0x4163, 0x4386, 0xb2c9, 0x1b5a, 0xba22, 0xbf1e, 0xbaea, 0xbadc, 0x0ff5, 0x1102, 0x41a5, 0x0122, 0x43b3, 0x30c2, 0x43cb, 0x41c8, 0x0365, 0xaa50, 0xb200, 0x4347, 0x4049, 0x4101, 0x0ba9, 0x325b, 0x296c, 0x4364, 0x43d7, 0xbaf1, 0xbfb4, 0x436e, 0xb28f, 0x0163, 0x42d8, 0x4016, 0x33c6, 0x23f4, 0x40e6, 0x25d3, 0x40cf, 0x3a7c, 0x445c, 0x3781, 0x4083, 0xbf16, 0x46a5, 0xae3c, 0x43d1, 0xbf2f, 0x41d9, 0x41b5, 0xbac7, 0x4381, 0x434b, 0x099c, 0x2c64, 0x4202, 0x40c8, 0x4194, 0x4625, 0xbf19, 0x423b, 0x4098, 0x40f0, 0x437f, 0x2643, 0xbaee, 0x40a0, 0x00b2, 0xb06f, 0x42d2, 0x4047, 0xa2b2, 0xb284, 0x4008, 0xaeed, 0x46a9, 0x40d4, 0x42fe, 0x4084, 0x41d0, 0x4304, 0x0437, 0xbad6, 0x4247, 0x4068, 0x43db, 0xbf8e, 0x1fcf, 0x278a, 0xb202, 0x4304, 0x0bf0, 0x4389, 0x3f6d, 0xb266, 0xb243, 0x152d, 0x4630, 0xaee7, 0x0104, 0x40c3, 0x40b9, 0xa96c, 0xb2e0, 0xa0f9, 0xb273, 0x0d05, 0x402b, 0x408f, 0x0b31, 0xa305, 0xbf65, 0x4200, 0xb2e0, 0x43e8, 0x43a2, 0xb206, 0x436f, 0xba61, 0x4037, 0xba4c, 0xbad3, 0x46ed, 0x3501, 0x4321, 0x4137, 0x41c3, 0x17ef, 0x42b7, 0xba13, 0x4246, 0xbf58, 0xb210, 0xb04f, 0x40e1, 0x42e3, 0xa428, 0x404e, 0xb2d1, 0x4043, 0x3f7b, 0x1d55, 0x35c0, 0x1b98, 0x1f9b, 0x44db, 0xbf17, 0xb240, 0x1e91, 0xb0a7, 0x402a, 0x4045, 0x414b, 0x415c, 0x08b1, 0xba10, 0x188b, 0x4219, 0x32e9, 0x427a, 0x2242, 0x1f51, 0x43f8, 0x409c, 0xbaff, 0x1f4a, 0x418f, 0x4566, 0x4151, 0xbaca, 0x4083, 0x409f, 0x44e4, 0xbf70, 0x341c, 0xbf0e, 0x400f, 0x40b5, 0x466d, 0x01a2, 0x4493, 0x43e4, 0x40e4, 0xba5b, 0xb289, 0xbad8, 0x0d68, 0x424f, 0xb20e, 0x418b, 0xb2c3, 0xade0, 0x4066, 0xbf95, 0x2228, 0x4110, 0x1db8, 0xa1e2, 0x0589, 0x4203, 0x4371, 0xbf77, 0x3288, 0x42f8, 0x4341, 0x413e, 0xb027, 0xbaf9, 0xbf70, 0x157d, 0x1d0d, 0xa3c2, 0x1e40, 0x448c, 0x405b, 0x14c2, 0x433f, 0x43b6, 0xba18, 0x1689, 0xbf82, 0x40aa, 0x4048, 0x320d, 0x4620, 0x42c9, 0x1670, 0x409f, 0xba26, 0xbad0, 0x43a5, 0x31b7, 0xbac8, 0x4405, 0xa60d, 0x1e58, 0x2989, 0xb22b, 0x3c62, 0x409f, 0x4295, 0xb287, 0xad38, 0xb025, 0x43eb, 0xbfbf, 0x0126, 0x4253, 0x42df, 0xa723, 0xa96e, 0x42f7, 0x3748, 0xac86, 0x408a, 0xae5c, 0x3778, 0xb2e5, 0xbfc1, 0x418b, 0xbac3, 0xb0fb, 0x45a6, 0x4293, 0x426b, 0xb07e, 0x43c3, 0x34f3, 0x08bc, 0x02c7, 0xbfbc, 0x42af, 0x421d, 0x2675, 0x428b, 0xba07, 0x4107, 0xb07a, 0x433d, 0x438e, 0x1195, 0x403d, 0x4545, 0xbad3, 0x1b5e, 0xbf8f, 0xb289, 0x23df, 0x402d, 0x413b, 0x2af8, 0x003b, 0x46ad, 0xbf9a, 0x4271, 0x433d, 0x43c0, 0x2f27, 0xa5e3, 0x179d, 0x1ced, 0x445d, 0x43c0, 0x3eb2, 0x40e8, 0x39ba, 0x4088, 0x4117, 0x3137, 0x189b, 0xb024, 0xa52f, 0x41b4, 0x1f27, 0x439d, 0x42e2, 0x4265, 0xbfe0, 0x252f, 0xbf7f, 0x3bd7, 0x40dd, 0x2cc1, 0x1c04, 0x41a6, 0x1403, 0x408c, 0x46bd, 0x2a99, 0x4230, 0x42f9, 0x04e8, 0xba5d, 0x284d, 0x43c7, 0x4332, 0x3921, 0x443c, 0xbf08, 0x4390, 0x1edf, 0xa980, 0x40a7, 0xb250, 0xb074, 0x41fd, 0xa12a, 0x1edd, 0xbad8, 0xb231, 0xbfd7, 0x1951, 0x4337, 0x2393, 0x4491, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xfb8e51a4, 0xf9f21a25, 0x2a13c422, 0x57b1ba81, 0xf344e297, 0x1706c70a, 0xb7e92cf4, 0x512917e4, 0x5a86f7df, 0x755562e5, 0xae714612, 0x2c5f02dc, 0x0dcdaeee, 0x75c86709, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x00000000, 0xffffff4b, 0xffffff4e, 0x00000093, 0xffffffff, 0xfffffffd, 0xffffff4e, 0x00000000, 0x00000000, 0x03f9e62a, 0x00000082, 0x000007de, 0xffff8cdd, 0x000042ac, 0x00000000, 0x800001d0 }, + Instructions = [0x42ab, 0xabed, 0x43fc, 0x4360, 0x40c1, 0x40b5, 0x4353, 0x43ac, 0xba74, 0x4613, 0xb03a, 0xbf2a, 0xa5bd, 0x187b, 0x410a, 0x4405, 0x15b3, 0x1472, 0xb248, 0x43a6, 0x41af, 0xbaf4, 0x1a6d, 0x4684, 0xbf04, 0x4068, 0xb26e, 0x014b, 0x4064, 0xba15, 0x3d2d, 0xb22d, 0x4378, 0x2501, 0x4279, 0xb299, 0x1586, 0x42e7, 0x2f55, 0xba55, 0x1f6f, 0x443d, 0x4194, 0xbfcb, 0xbacd, 0xb2a0, 0x406b, 0x1b65, 0xbfd0, 0x1bf7, 0x41e7, 0xba76, 0x436f, 0x46f8, 0x4042, 0x1ffe, 0x447c, 0xba50, 0x341e, 0x42fd, 0x409c, 0xbf09, 0xb2cf, 0x1c99, 0x41f7, 0x41a6, 0x4278, 0x4040, 0x3747, 0x301a, 0x01cc, 0x4304, 0x1ca3, 0xab1d, 0x43dd, 0x41e3, 0x35ad, 0x43f5, 0xb091, 0x3214, 0x44f1, 0x41d7, 0xb244, 0xb2a2, 0x41e1, 0x3d7a, 0xbf24, 0xbac1, 0x0059, 0xba3b, 0xabe5, 0x4550, 0x0a9e, 0xbfe2, 0x034e, 0xb0b7, 0x0aec, 0x1ee6, 0x3276, 0x0866, 0xa763, 0x1e45, 0x4275, 0xad25, 0x416d, 0x0d6d, 0x0b50, 0xb200, 0x1eba, 0x4378, 0x0547, 0x43bb, 0xb2f2, 0xb2af, 0x1ea0, 0x25b0, 0x4287, 0x1d55, 0x2225, 0xbf46, 0xb276, 0xba57, 0x4253, 0x19e0, 0xbf32, 0x1b06, 0x40ab, 0xb2a4, 0x1eda, 0x1dfd, 0xaabd, 0x1b08, 0xba0e, 0x4014, 0xa079, 0x119b, 0x1d17, 0x41b1, 0x005a, 0xb2ba, 0x419a, 0x4361, 0x2d2a, 0xba36, 0x1b49, 0xbf0c, 0x423c, 0xbae6, 0x2bc0, 0x409c, 0xbfa0, 0xba02, 0x2496, 0xb279, 0xbace, 0xb2e0, 0xbf07, 0x3b17, 0x40a9, 0x3154, 0x41ab, 0x284e, 0xb03c, 0xbf06, 0x41ff, 0xba45, 0x4144, 0xab32, 0x4000, 0xb2b2, 0x3729, 0x46fb, 0xb042, 0x32d0, 0x0557, 0x3583, 0xb249, 0x43f5, 0x0a54, 0x416f, 0x1fc6, 0x4560, 0xb2f6, 0xa114, 0x1dd7, 0x40b4, 0x4304, 0xbfc2, 0x41f2, 0xb2e2, 0xb0d4, 0xbaca, 0xbf65, 0x4065, 0xa1e5, 0xb043, 0x4004, 0xb237, 0x41e9, 0xba0f, 0xaa8e, 0x421d, 0x1d12, 0x435e, 0x434b, 0x4356, 0xacaf, 0x4551, 0x1935, 0x1c1a, 0xba67, 0x2441, 0xbf9a, 0x41a0, 0xb2d8, 0x1c00, 0xad68, 0x4185, 0xb272, 0x43ba, 0x436c, 0xb08b, 0xb2f4, 0x4379, 0x1d0f, 0x46f8, 0x4379, 0x1b8f, 0x4260, 0x40d8, 0xbfa7, 0x0730, 0xb27d, 0xb242, 0x43d3, 0x46fd, 0xbf92, 0xb067, 0xaa15, 0x428c, 0xb2e1, 0x43e5, 0xb2f6, 0x1da1, 0x023e, 0x1a86, 0xba01, 0xb203, 0x13ae, 0xa6a6, 0x45d8, 0xba4c, 0xb228, 0x438c, 0xbae8, 0x4378, 0x3b55, 0xbf5c, 0xb036, 0xb261, 0x1bea, 0x41b8, 0x43f5, 0xba70, 0xa959, 0xb2a9, 0x41fd, 0x19ad, 0x41cd, 0x4171, 0xb046, 0xbf37, 0x431e, 0x4302, 0xb04f, 0x396f, 0x44f0, 0x36d3, 0x01b0, 0x18f5, 0x424b, 0xb27a, 0x43a9, 0xba49, 0x4357, 0x41e5, 0x42d4, 0x0f27, 0x4325, 0x1f9b, 0x447a, 0x46b8, 0xbf60, 0x43c5, 0xa78b, 0x46b2, 0xb2c4, 0x4322, 0xbfad, 0xbf90, 0x4275, 0x40c4, 0x1e91, 0xba0c, 0xbfd0, 0xafd3, 0xbfa0, 0xb2ff, 0xb2dc, 0x43a1, 0xb0db, 0xbf1e, 0x269d, 0xb21a, 0x405d, 0x1822, 0x3dc1, 0xb247, 0x119e, 0xb2b9, 0x4056, 0xaedd, 0xba59, 0x40ed, 0x43c0, 0xbf5f, 0xba35, 0xad1b, 0xb0db, 0x274a, 0x4042, 0x404c, 0xb0a6, 0x2983, 0x41b9, 0x4226, 0x455b, 0xbad3, 0xba5c, 0x42e3, 0xbf8f, 0x3b28, 0xadf6, 0x0321, 0x41c0, 0x223b, 0x40ca, 0x1ea5, 0x4256, 0x409a, 0x4339, 0xba7c, 0x43cf, 0x40bb, 0xb217, 0x427a, 0x289f, 0xb28b, 0xb250, 0xbf2a, 0xb084, 0x410c, 0x416b, 0x4079, 0xb2c9, 0x4149, 0x4143, 0x0c11, 0x461f, 0x18ed, 0x41e1, 0x4651, 0xba1c, 0x422b, 0x44fb, 0xb2b4, 0xbfde, 0x45e1, 0x4601, 0x4483, 0xa182, 0x3311, 0x40bd, 0x446a, 0x431c, 0x2f1e, 0xbac8, 0x02c3, 0x43d5, 0x415d, 0x42f7, 0x1cad, 0x1597, 0xb2cd, 0x1cbd, 0x42df, 0x069e, 0x0986, 0x435d, 0xbad5, 0xbf39, 0x1044, 0x417c, 0x3afb, 0x3be4, 0xb2b8, 0xb0b6, 0x401b, 0x1e4f, 0x4270, 0x4278, 0xacb6, 0xbad1, 0xbaee, 0x1920, 0xba01, 0x4367, 0xb24d, 0xb2db, 0x05da, 0xa2c6, 0x4627, 0xba2b, 0xbfa3, 0x42aa, 0x3637, 0xbafa, 0x4364, 0x43f3, 0xaaea, 0x40a5, 0x424f, 0x45a3, 0x44e9, 0x4477, 0xb09e, 0x42ea, 0x44b9, 0x4694, 0x4629, 0xba4b, 0x42c8, 0x412e, 0xbf9e, 0xba0a, 0x420a, 0xb2d0, 0xbae8, 0xbfb3, 0x40f8, 0x36d0, 0x40bd, 0x4395, 0x0d0f, 0xbafa, 0xb20b, 0x41c6, 0x40ea, 0xbf62, 0x429b, 0x4142, 0x43a6, 0x1f1b, 0xa9b4, 0x4455, 0xb0b1, 0xbae8, 0xb24c, 0x0396, 0x4360, 0xb26d, 0x0693, 0x1842, 0xba1e, 0xb29b, 0xba44, 0x1c45, 0x456f, 0x1a6a, 0x439c, 0xb24d, 0xac7d, 0x410b, 0x419f, 0xbf7e, 0x4057, 0x4377, 0x1ea6, 0x2f69, 0xbfc0, 0x1a75, 0xb2cf, 0x3759, 0x4187, 0x429b, 0x40d7, 0x18e7, 0x2eaa, 0x2bc6, 0xbf0d, 0x028c, 0x40f2, 0x421c, 0xbad1, 0xbf70, 0x41c5, 0xb012, 0x42fe, 0xb2ef, 0xbf96, 0xba10, 0x4103, 0x4434, 0x449a, 0x0b03, 0x40d5, 0x4221, 0x345a, 0x1491, 0xb2fc, 0x46e1, 0x456c, 0xb0f0, 0xb2ba, 0x4254, 0x415f, 0x4269, 0x434f, 0xb04c, 0x4316, 0xb049, 0xba18, 0x1988, 0x4194, 0x4412, 0xbfb3, 0x43f8, 0xba4f, 0xb218, 0x4033, 0x38a4, 0x3d99, 0xa6b2, 0xb076, 0xbfc0, 0x42c6, 0x40ad, 0x432a, 0x4226, 0x1ee9, 0x1aa5, 0xbf13, 0x3370, 0x2820, 0x1191, 0x432c, 0x40b8, 0x464e, 0x1e58, 0x462f, 0xb022, 0x40ba, 0x464f, 0x4083, 0x4683, 0x16c7, 0xbf43, 0x42a0, 0xba56, 0x2f3d, 0x417b, 0x43ff, 0xac7d, 0xb285, 0x4041, 0xba51, 0xbf31, 0x4041, 0xb281, 0xb2d8, 0x1a99, 0x4342, 0x402f, 0x4185, 0x40f3, 0xbfd0, 0x4274, 0x40a3, 0x4064, 0x39a4, 0xba04, 0x408e, 0x3250, 0x3c3d, 0xa2bb, 0xba1c, 0x1a4b, 0x40e5, 0x3ca6, 0xbf67, 0x4285, 0xa9f3, 0x46bc, 0x420d, 0xba05, 0xb009, 0x417c, 0xb27e, 0x1c48, 0x41c8, 0x42e3, 0x1e8c, 0x42b4, 0xba08, 0x3598, 0xb263, 0xb2f2, 0x1053, 0x40da, 0x37c7, 0x370d, 0x1853, 0x41e9, 0xb061, 0x1af7, 0x4015, 0x44aa, 0x1db0, 0x4165, 0xbf27, 0x3d1f, 0x42f4, 0x432f, 0x407c, 0x1457, 0x43c4, 0xb226, 0x40d3, 0x4317, 0x409d, 0x4024, 0xb062, 0xaeba, 0x3c71, 0x43a1, 0xada2, 0x4115, 0xba3f, 0x4163, 0x4386, 0xb2c9, 0x1b5a, 0xba22, 0xbf1e, 0xbaea, 0xbadc, 0x0ff5, 0x1102, 0x41a5, 0x0122, 0x43b3, 0x30c2, 0x43cb, 0x41c8, 0x0365, 0xaa50, 0xb200, 0x4347, 0x4049, 0x4101, 0x0ba9, 0x325b, 0x296c, 0x4364, 0x43d7, 0xbaf1, 0xbfb4, 0x436e, 0xb28f, 0x0163, 0x42d8, 0x4016, 0x33c6, 0x23f4, 0x40e6, 0x25d3, 0x40cf, 0x3a7c, 0x445c, 0x3781, 0x4083, 0xbf16, 0x46a5, 0xae3c, 0x43d1, 0xbf2f, 0x41d9, 0x41b5, 0xbac7, 0x4381, 0x434b, 0x099c, 0x2c64, 0x4202, 0x40c8, 0x4194, 0x4625, 0xbf19, 0x423b, 0x4098, 0x40f0, 0x437f, 0x2643, 0xbaee, 0x40a0, 0x00b2, 0xb06f, 0x42d2, 0x4047, 0xa2b2, 0xb284, 0x4008, 0xaeed, 0x46a9, 0x40d4, 0x42fe, 0x4084, 0x41d0, 0x4304, 0x0437, 0xbad6, 0x4247, 0x4068, 0x43db, 0xbf8e, 0x1fcf, 0x278a, 0xb202, 0x4304, 0x0bf0, 0x4389, 0x3f6d, 0xb266, 0xb243, 0x152d, 0x4630, 0xaee7, 0x0104, 0x40c3, 0x40b9, 0xa96c, 0xb2e0, 0xa0f9, 0xb273, 0x0d05, 0x402b, 0x408f, 0x0b31, 0xa305, 0xbf65, 0x4200, 0xb2e0, 0x43e8, 0x43a2, 0xb206, 0x436f, 0xba61, 0x4037, 0xba4c, 0xbad3, 0x46ed, 0x3501, 0x4321, 0x4137, 0x41c3, 0x17ef, 0x42b7, 0xba13, 0x4246, 0xbf58, 0xb210, 0xb04f, 0x40e1, 0x42e3, 0xa428, 0x404e, 0xb2d1, 0x4043, 0x3f7b, 0x1d55, 0x35c0, 0x1b98, 0x1f9b, 0x44db, 0xbf17, 0xb240, 0x1e91, 0xb0a7, 0x402a, 0x4045, 0x414b, 0x415c, 0x08b1, 0xba10, 0x188b, 0x4219, 0x32e9, 0x427a, 0x2242, 0x1f51, 0x43f8, 0x409c, 0xbaff, 0x1f4a, 0x418f, 0x4566, 0x4151, 0xbaca, 0x4083, 0x409f, 0x44e4, 0xbf70, 0x341c, 0xbf0e, 0x400f, 0x40b5, 0x466d, 0x01a2, 0x4493, 0x43e4, 0x40e4, 0xba5b, 0xb289, 0xbad8, 0x0d68, 0x424f, 0xb20e, 0x418b, 0xb2c3, 0xade0, 0x4066, 0xbf95, 0x2228, 0x4110, 0x1db8, 0xa1e2, 0x0589, 0x4203, 0x4371, 0xbf77, 0x3288, 0x42f8, 0x4341, 0x413e, 0xb027, 0xbaf9, 0xbf70, 0x157d, 0x1d0d, 0xa3c2, 0x1e40, 0x448c, 0x405b, 0x14c2, 0x433f, 0x43b6, 0xba18, 0x1689, 0xbf82, 0x40aa, 0x4048, 0x320d, 0x4620, 0x42c9, 0x1670, 0x409f, 0xba26, 0xbad0, 0x43a5, 0x31b7, 0xbac8, 0x4405, 0xa60d, 0x1e58, 0x2989, 0xb22b, 0x3c62, 0x409f, 0x4295, 0xb287, 0xad38, 0xb025, 0x43eb, 0xbfbf, 0x0126, 0x4253, 0x42df, 0xa723, 0xa96e, 0x42f7, 0x3748, 0xac86, 0x408a, 0xae5c, 0x3778, 0xb2e5, 0xbfc1, 0x418b, 0xbac3, 0xb0fb, 0x45a6, 0x4293, 0x426b, 0xb07e, 0x43c3, 0x34f3, 0x08bc, 0x02c7, 0xbfbc, 0x42af, 0x421d, 0x2675, 0x428b, 0xba07, 0x4107, 0xb07a, 0x433d, 0x438e, 0x1195, 0x403d, 0x4545, 0xbad3, 0x1b5e, 0xbf8f, 0xb289, 0x23df, 0x402d, 0x413b, 0x2af8, 0x003b, 0x46ad, 0xbf9a, 0x4271, 0x433d, 0x43c0, 0x2f27, 0xa5e3, 0x179d, 0x1ced, 0x445d, 0x43c0, 0x3eb2, 0x40e8, 0x39ba, 0x4088, 0x4117, 0x3137, 0x189b, 0xb024, 0xa52f, 0x41b4, 0x1f27, 0x439d, 0x42e2, 0x4265, 0xbfe0, 0x252f, 0xbf7f, 0x3bd7, 0x40dd, 0x2cc1, 0x1c04, 0x41a6, 0x1403, 0x408c, 0x46bd, 0x2a99, 0x4230, 0x42f9, 0x04e8, 0xba5d, 0x284d, 0x43c7, 0x4332, 0x3921, 0x443c, 0xbf08, 0x4390, 0x1edf, 0xa980, 0x40a7, 0xb250, 0xb074, 0x41fd, 0xa12a, 0x1edd, 0xbad8, 0xb231, 0xbfd7, 0x1951, 0x4337, 0x2393, 0x4491, 0x4770, 0xe7fe + ], + StartRegs = [0xfb8e51a4, 0xf9f21a25, 0x2a13c422, 0x57b1ba81, 0xf344e297, 0x1706c70a, 0xb7e92cf4, 0x512917e4, 0x5a86f7df, 0x755562e5, 0xae714612, 0x2c5f02dc, 0x0dcdaeee, 0x75c86709, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x00000000, 0xffffff4b, 0xffffff4e, 0x00000093, 0xffffffff, 0xfffffffd, 0xffffff4e, 0x00000000, 0x00000000, 0x03f9e62a, 0x00000082, 0x000007de, 0xffff8cdd, 0x000042ac, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x18f0, 0x405d, 0x4152, 0x40a4, 0x426b, 0xb201, 0x1a63, 0x4623, 0x41a9, 0x1a48, 0x4165, 0xbf7d, 0xba5c, 0xbf00, 0xb06d, 0x43b7, 0x44ca, 0x41b2, 0x2b08, 0xb2c5, 0xb224, 0xb224, 0xb217, 0x2985, 0xba24, 0xb080, 0x43e8, 0x1d56, 0x45f2, 0x4226, 0x3d7c, 0x41bd, 0xbf9f, 0x4315, 0xbafe, 0x400f, 0x463e, 0x22db, 0x4143, 0x42c2, 0x43e0, 0x43e7, 0x40c5, 0xb221, 0xbfc2, 0xb0e4, 0xba4a, 0xbf90, 0x437a, 0x41e2, 0x403c, 0x2581, 0xa403, 0xa17c, 0x4322, 0x1bed, 0x01f8, 0xbf92, 0x3c28, 0x1ed9, 0x0c6a, 0xb219, 0xbf44, 0x416f, 0x18b5, 0xb2ce, 0x405e, 0x31f9, 0x1afe, 0xb068, 0xa488, 0xbaf0, 0x429e, 0xb265, 0x4154, 0x435c, 0x3f65, 0x4132, 0x400f, 0xbfcb, 0xb2b4, 0x4302, 0xa661, 0x429b, 0xba09, 0xb0bd, 0x1c5d, 0x4396, 0xb205, 0x4210, 0x4184, 0x4114, 0x30e9, 0x4694, 0x4281, 0xba3b, 0xb02c, 0x3c7c, 0xb068, 0x1f5f, 0xbad2, 0x2fc9, 0xb2fa, 0x422c, 0x40d1, 0x427a, 0xb00b, 0x1bd1, 0x1959, 0xbf94, 0x35f7, 0x415f, 0x4230, 0x4491, 0xbada, 0x4390, 0xa1d1, 0x4201, 0x4109, 0x3b9a, 0x4279, 0x4372, 0xbff0, 0xb2b4, 0x1c29, 0x0bba, 0x42ff, 0x0b07, 0x431a, 0x35b1, 0x2674, 0x1d4b, 0x43e4, 0xbfdc, 0x4385, 0x00d9, 0x33f4, 0x4010, 0xab8a, 0x42e7, 0xb093, 0xba39, 0x4140, 0x2120, 0xb2e8, 0x2254, 0x4354, 0x430e, 0xba16, 0x441b, 0x1b54, 0xaf2b, 0x4144, 0x424f, 0x3e6a, 0x0c2f, 0x4330, 0x44cc, 0x42a9, 0x433f, 0xbf93, 0x4367, 0x3de9, 0x4203, 0x4120, 0xa589, 0x1a1d, 0xaa95, 0x4068, 0x02ff, 0x4071, 0x44da, 0x181f, 0xbf8a, 0x2c8c, 0x183e, 0x40fd, 0x3711, 0xb2c1, 0x40d1, 0x0e30, 0x42e0, 0xba5f, 0xb00f, 0x0e5e, 0xb2b0, 0x419e, 0x42df, 0x4240, 0xa9a1, 0xaeba, 0x4319, 0x45f1, 0xbae7, 0x4390, 0x43ad, 0x40a0, 0x1e6e, 0x0c84, 0x2ddb, 0xbf45, 0xbfb0, 0x4405, 0x1ca9, 0x39cb, 0xb2e8, 0x0a6f, 0xba79, 0x4044, 0x4491, 0x3a70, 0xa45d, 0x425d, 0x3a30, 0x4107, 0xa248, 0x4055, 0x40f8, 0x43fb, 0x4078, 0x351f, 0x41a3, 0x439f, 0xba6a, 0x426a, 0x3f2f, 0xbf5d, 0x40ee, 0x43b9, 0x1b4a, 0xa56a, 0x2fec, 0xba54, 0x4613, 0x46c5, 0x4237, 0x3dd2, 0xb037, 0x3e1a, 0x04e2, 0x415d, 0x426c, 0xb2ed, 0x42c3, 0x416f, 0x1d8a, 0x42cd, 0x42c8, 0x422a, 0xbf7f, 0xa9b0, 0x4303, 0x43ea, 0x359a, 0x4058, 0x418f, 0x436e, 0xb289, 0x2731, 0x432b, 0x40c4, 0xb298, 0x401e, 0x011e, 0x4132, 0x43b6, 0x4148, 0x41a9, 0x413b, 0x4191, 0x1cb7, 0x0612, 0x4333, 0x3dfe, 0x4264, 0x4261, 0xaabe, 0xba60, 0x40d6, 0xbfe8, 0xa1fc, 0x025e, 0x4249, 0x33b2, 0x2d28, 0x428c, 0xb22d, 0xbae2, 0x449c, 0x40ac, 0x41b2, 0x193a, 0x435b, 0x4155, 0x4060, 0x42b8, 0x4363, 0x18d6, 0x4162, 0x145b, 0x439a, 0xbf2b, 0xba23, 0x41fa, 0x311d, 0xb2bf, 0x3045, 0xba6f, 0xbf06, 0x213a, 0x4565, 0xb0af, 0xb2cf, 0xa9db, 0x41b9, 0x19e3, 0x427d, 0xa296, 0x440c, 0x4363, 0x411f, 0x425b, 0x421a, 0x4207, 0x1840, 0x435e, 0x4285, 0xba48, 0xb2de, 0x420c, 0xba22, 0xbf5d, 0x41d3, 0x1db2, 0x400a, 0xb2b3, 0x42f1, 0x4014, 0x42a5, 0xae6b, 0x37bf, 0xa4b4, 0x437b, 0x4089, 0xbf23, 0x41ca, 0x43c7, 0x45b4, 0xb2d0, 0x418f, 0x4086, 0x03a8, 0x401c, 0x42b0, 0xb270, 0x41df, 0x0b28, 0x428e, 0x1cd2, 0x4666, 0x426a, 0x275d, 0x4189, 0x42a3, 0x0223, 0x40a6, 0xb041, 0x16a8, 0x2e46, 0xba19, 0xb2e6, 0x1b94, 0xbfc1, 0x40cd, 0x1074, 0xb29a, 0x411c, 0x41e6, 0xb052, 0x18f6, 0x4356, 0x43fc, 0x19b9, 0x4045, 0x1a37, 0x4582, 0x43ba, 0x462b, 0x2e1b, 0x4052, 0x0a1a, 0x43ae, 0x31a1, 0x41f2, 0x42dd, 0x17ea, 0x43ee, 0x42f3, 0x2cbf, 0xbf66, 0xb023, 0x40f6, 0x407e, 0x4499, 0x4234, 0x44f4, 0x404a, 0xb2ed, 0x40d4, 0xbaea, 0x0ea6, 0x439a, 0xae0e, 0x1334, 0x4558, 0x336a, 0xb03b, 0x0b94, 0x41cf, 0x4256, 0x4188, 0x31f8, 0x404b, 0x410e, 0xbf69, 0x2a6c, 0xbacb, 0x1e69, 0x011a, 0xb23e, 0x44d0, 0x3916, 0xb295, 0xa0d9, 0xbf84, 0x3b79, 0xa6c3, 0xb089, 0xbfb0, 0x4303, 0x331b, 0xb229, 0x4341, 0x0bbb, 0x1ad9, 0x4047, 0x1ae3, 0x431c, 0xa448, 0x4179, 0x432c, 0xb281, 0x348d, 0x4170, 0xbf47, 0x43e2, 0x41a1, 0x419f, 0xa0fb, 0xb2d7, 0xb2d1, 0x412f, 0x467f, 0xba40, 0xb2e0, 0xbad8, 0x423b, 0x4628, 0x43ea, 0x41b9, 0x41eb, 0xb2b3, 0xbf28, 0x4350, 0xa460, 0x433f, 0x4032, 0x4390, 0xb287, 0x1865, 0x4668, 0x448c, 0x41b5, 0xbf75, 0x41ce, 0xbacd, 0x18ba, 0x1c8d, 0x41fc, 0x42eb, 0xbf18, 0x401d, 0x3d5d, 0x4122, 0xb01a, 0x40c4, 0x4321, 0xa7b0, 0xba1f, 0x4035, 0x0f4e, 0x2829, 0x031f, 0x464a, 0x404f, 0xbf70, 0x4093, 0x4321, 0x42ad, 0x4230, 0x4124, 0x4218, 0x00a8, 0xa451, 0xb2b3, 0xbf7c, 0xb26f, 0x44d3, 0x423b, 0xbfd0, 0x04af, 0xb28f, 0x4335, 0x39ab, 0x42c8, 0xbf24, 0xbf70, 0x3665, 0xb24e, 0xb2d8, 0xa20d, 0x10a4, 0x407e, 0xb0c1, 0xbfc5, 0xb281, 0x400e, 0x4352, 0x46c8, 0xbfb8, 0x4074, 0x4410, 0x4249, 0x4335, 0x248a, 0x43aa, 0x4074, 0x4171, 0x43fd, 0x4060, 0x1fe9, 0xbfae, 0x4477, 0x2eb5, 0x410a, 0x187d, 0x41aa, 0x4137, 0x434c, 0x4353, 0x1ff7, 0xb215, 0x3c25, 0x183f, 0xb2ad, 0xbf4b, 0xb2c7, 0xb00b, 0x4339, 0x417b, 0x44f3, 0xaa2f, 0x4304, 0x43e5, 0x00a0, 0xba0a, 0x41b8, 0x4250, 0xbf22, 0x45bd, 0x41f0, 0xbaf1, 0x419a, 0x1d5c, 0x2eae, 0x42e7, 0x43e3, 0x4680, 0x433b, 0xb290, 0x26f8, 0x4398, 0xbff0, 0x41e6, 0x230e, 0x4173, 0xba5c, 0x077b, 0x4202, 0x40ff, 0xb2f9, 0x4137, 0xba2e, 0xbf90, 0xb08f, 0xb052, 0x42fe, 0xbf9a, 0xb046, 0xb023, 0x4348, 0x286e, 0x1c5b, 0x40af, 0x1c83, 0x41ae, 0xb2d7, 0x4198, 0xbafd, 0x42fd, 0x43ae, 0x3637, 0x30a2, 0x42e9, 0x34b2, 0x409b, 0x1fe7, 0x07b7, 0x19ea, 0xbf46, 0x2813, 0x1bb9, 0x42d9, 0x433b, 0xa211, 0xb24a, 0x24a3, 0xa199, 0x1fde, 0xb2c6, 0x4337, 0xbfce, 0x2ee1, 0x3710, 0xb20a, 0x41d4, 0x4026, 0x4361, 0x0eaf, 0x2d39, 0x1542, 0x04c4, 0x4361, 0x419b, 0x40e2, 0x417d, 0x4060, 0x1f09, 0x3473, 0x46ab, 0x430c, 0x400c, 0xb2d7, 0x4334, 0x4054, 0x0f0c, 0x188e, 0xbf92, 0xbaed, 0xb299, 0x4381, 0x0ac1, 0x0c56, 0x4267, 0x401f, 0x33e1, 0x4304, 0x3db4, 0xb0a2, 0x4635, 0x41f5, 0xbf92, 0x3fad, 0x4115, 0x1cf4, 0xb2bb, 0x4229, 0x437c, 0x4097, 0x412e, 0xa0b9, 0x4356, 0xb2ca, 0x43b0, 0x42f0, 0xba39, 0x4348, 0x4263, 0x4335, 0x42dc, 0x44f0, 0x42c6, 0xaa4f, 0x42bc, 0x43ed, 0xbf87, 0xb03d, 0x41cc, 0x1a30, 0x415e, 0xb257, 0x0f62, 0x4469, 0x4051, 0xa912, 0x4303, 0x4214, 0xb07d, 0x4067, 0xb264, 0x1dbe, 0xbf97, 0x41b8, 0x415c, 0x42d6, 0x414d, 0x13ac, 0x401c, 0x40ed, 0x25d9, 0x1883, 0x41e9, 0x410b, 0x1a38, 0xbfaa, 0x19e7, 0x19f6, 0x19db, 0x4173, 0x41a5, 0x17bc, 0x412d, 0x44d9, 0x4010, 0x1a2b, 0xbaf4, 0x393a, 0xba48, 0xb22d, 0xb0f5, 0xbaf2, 0xa232, 0xba3e, 0x41ce, 0x22dd, 0xbf8c, 0xb21b, 0x1ecd, 0x43a2, 0xba6b, 0x4044, 0x401e, 0x404b, 0x1854, 0xaafa, 0x4120, 0xa640, 0x43f7, 0x40c6, 0xb037, 0xa95e, 0xb2c5, 0xa3a2, 0x41f0, 0xb0e9, 0x4250, 0x4233, 0x438a, 0x401c, 0x46c5, 0x42ca, 0x4366, 0xbfd3, 0xba2b, 0x4029, 0x4060, 0x400f, 0x36eb, 0x404d, 0x400b, 0x171b, 0xb0c3, 0x4027, 0xb2eb, 0x0c68, 0xb04c, 0xa245, 0xb252, 0xb252, 0xb2e1, 0x414a, 0xbf0d, 0x426e, 0x1efb, 0xb2ba, 0x1865, 0xbafc, 0xb005, 0x41da, 0x40ce, 0x3cbd, 0x043e, 0x404c, 0x3d77, 0x4685, 0x1b3d, 0x2daa, 0xa0d8, 0xb2e3, 0x43b3, 0x4181, 0x2bba, 0x4316, 0x41dd, 0x4197, 0xbfc1, 0x0e0d, 0x430f, 0x11cd, 0x3a11, 0x413a, 0xb2b7, 0x4013, 0x409d, 0xb209, 0x281f, 0xba08, 0x41f6, 0xb024, 0x428b, 0xbafb, 0x42eb, 0x40c5, 0x11a0, 0x1876, 0xb009, 0x4004, 0xb224, 0x4395, 0xb04c, 0x3b7a, 0xbf01, 0x439b, 0xb247, 0x4162, 0x2a56, 0x1a27, 0x1d9a, 0x4065, 0xbf11, 0x05ff, 0xb25a, 0x1c63, 0xba4c, 0x3bdb, 0x40da, 0x33b3, 0x36fc, 0xbf7e, 0x41c5, 0xb0e1, 0x408f, 0x43a6, 0x187d, 0x4080, 0x009a, 0x41a1, 0x29d0, 0x41ad, 0x1c45, 0x37ad, 0x3de5, 0x1d62, 0x09f7, 0x402d, 0x43e5, 0xba78, 0xb221, 0xbad6, 0x1e4b, 0x289e, 0x43f0, 0x1bee, 0xb2dd, 0x43cc, 0xbfc2, 0x1d46, 0x40c2, 0xaaf5, 0x171e, 0xbfdf, 0x419c, 0xb2e8, 0xb20d, 0xbad1, 0xbadf, 0x4581, 0x27ba, 0x406b, 0x1a29, 0x436a, 0x466d, 0x121a, 0xb2e4, 0x4220, 0xba0f, 0x19d6, 0x1950, 0xb2ff, 0xbfb0, 0x1a2c, 0xb215, 0x4162, 0xbfcd, 0x05c0, 0x42cc, 0x40f1, 0xb2da, 0x05a2, 0x2929, 0xb0c1, 0xbf14, 0x4381, 0xbad8, 0x4480, 0xb0b6, 0x192e, 0x1f16, 0xba09, 0xbfc0, 0x4313, 0xb279, 0x40e9, 0x41af, 0x4233, 0x45e4, 0x4238, 0xb248, 0xb2a8, 0xb0f9, 0x3043, 0x4107, 0x070c, 0xba6a, 0x25de, 0x4212, 0x19d1, 0x41a4, 0xa17f, 0xbf36, 0x41fe, 0x08d3, 0x405f, 0xbff0, 0x41b2, 0x43e3, 0x4182, 0x08f4, 0x4293, 0x4267, 0x4030, 0x1822, 0xb2d6, 0x0575, 0x2c57, 0xb250, 0x166f, 0xaa81, 0x1c30, 0x4205, 0xab93, 0xbf60, 0xac46, 0x4328, 0xbf79, 0xb201, 0x33c5, 0x2c7f, 0x410c, 0x424e, 0x2676, 0xb0ce, 0x1f23, 0xbaf2, 0xb043, 0x392d, 0xb019, 0x04fb, 0x4227, 0xac6a, 0x27c0, 0x42a5, 0xba24, 0xbaf8, 0x4566, 0xb04f, 0x4299, 0x1cc3, 0x06e8, 0xb249, 0xbf00, 0xb0ba, 0x1be0, 0xbf96, 0x1251, 0xb2da, 0x3640, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x32016fcd, 0xf25a55e0, 0xc71b8a9f, 0x506131e5, 0xb5f08c7b, 0x8bec972b, 0x7ac97655, 0x7a33d75d, 0x0edf0fa3, 0x7cb7ebe2, 0x7905d5a9, 0x340efd29, 0x6029b34a, 0xfe1edb24, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0xef04ff40, 0x00000013, 0x00000003, 0xffffc003, 0xef050000, 0x08000000, 0x00000076, 0x000000c0, 0xe86c0001, 0x61d69c09, 0x29ccbeb4, 0xffffcd3f, 0x63b7d8f7, 0x0000049b, 0x00000000, 0xa00001d0 }, + Instructions = [0x18f0, 0x405d, 0x4152, 0x40a4, 0x426b, 0xb201, 0x1a63, 0x4623, 0x41a9, 0x1a48, 0x4165, 0xbf7d, 0xba5c, 0xbf00, 0xb06d, 0x43b7, 0x44ca, 0x41b2, 0x2b08, 0xb2c5, 0xb224, 0xb224, 0xb217, 0x2985, 0xba24, 0xb080, 0x43e8, 0x1d56, 0x45f2, 0x4226, 0x3d7c, 0x41bd, 0xbf9f, 0x4315, 0xbafe, 0x400f, 0x463e, 0x22db, 0x4143, 0x42c2, 0x43e0, 0x43e7, 0x40c5, 0xb221, 0xbfc2, 0xb0e4, 0xba4a, 0xbf90, 0x437a, 0x41e2, 0x403c, 0x2581, 0xa403, 0xa17c, 0x4322, 0x1bed, 0x01f8, 0xbf92, 0x3c28, 0x1ed9, 0x0c6a, 0xb219, 0xbf44, 0x416f, 0x18b5, 0xb2ce, 0x405e, 0x31f9, 0x1afe, 0xb068, 0xa488, 0xbaf0, 0x429e, 0xb265, 0x4154, 0x435c, 0x3f65, 0x4132, 0x400f, 0xbfcb, 0xb2b4, 0x4302, 0xa661, 0x429b, 0xba09, 0xb0bd, 0x1c5d, 0x4396, 0xb205, 0x4210, 0x4184, 0x4114, 0x30e9, 0x4694, 0x4281, 0xba3b, 0xb02c, 0x3c7c, 0xb068, 0x1f5f, 0xbad2, 0x2fc9, 0xb2fa, 0x422c, 0x40d1, 0x427a, 0xb00b, 0x1bd1, 0x1959, 0xbf94, 0x35f7, 0x415f, 0x4230, 0x4491, 0xbada, 0x4390, 0xa1d1, 0x4201, 0x4109, 0x3b9a, 0x4279, 0x4372, 0xbff0, 0xb2b4, 0x1c29, 0x0bba, 0x42ff, 0x0b07, 0x431a, 0x35b1, 0x2674, 0x1d4b, 0x43e4, 0xbfdc, 0x4385, 0x00d9, 0x33f4, 0x4010, 0xab8a, 0x42e7, 0xb093, 0xba39, 0x4140, 0x2120, 0xb2e8, 0x2254, 0x4354, 0x430e, 0xba16, 0x441b, 0x1b54, 0xaf2b, 0x4144, 0x424f, 0x3e6a, 0x0c2f, 0x4330, 0x44cc, 0x42a9, 0x433f, 0xbf93, 0x4367, 0x3de9, 0x4203, 0x4120, 0xa589, 0x1a1d, 0xaa95, 0x4068, 0x02ff, 0x4071, 0x44da, 0x181f, 0xbf8a, 0x2c8c, 0x183e, 0x40fd, 0x3711, 0xb2c1, 0x40d1, 0x0e30, 0x42e0, 0xba5f, 0xb00f, 0x0e5e, 0xb2b0, 0x419e, 0x42df, 0x4240, 0xa9a1, 0xaeba, 0x4319, 0x45f1, 0xbae7, 0x4390, 0x43ad, 0x40a0, 0x1e6e, 0x0c84, 0x2ddb, 0xbf45, 0xbfb0, 0x4405, 0x1ca9, 0x39cb, 0xb2e8, 0x0a6f, 0xba79, 0x4044, 0x4491, 0x3a70, 0xa45d, 0x425d, 0x3a30, 0x4107, 0xa248, 0x4055, 0x40f8, 0x43fb, 0x4078, 0x351f, 0x41a3, 0x439f, 0xba6a, 0x426a, 0x3f2f, 0xbf5d, 0x40ee, 0x43b9, 0x1b4a, 0xa56a, 0x2fec, 0xba54, 0x4613, 0x46c5, 0x4237, 0x3dd2, 0xb037, 0x3e1a, 0x04e2, 0x415d, 0x426c, 0xb2ed, 0x42c3, 0x416f, 0x1d8a, 0x42cd, 0x42c8, 0x422a, 0xbf7f, 0xa9b0, 0x4303, 0x43ea, 0x359a, 0x4058, 0x418f, 0x436e, 0xb289, 0x2731, 0x432b, 0x40c4, 0xb298, 0x401e, 0x011e, 0x4132, 0x43b6, 0x4148, 0x41a9, 0x413b, 0x4191, 0x1cb7, 0x0612, 0x4333, 0x3dfe, 0x4264, 0x4261, 0xaabe, 0xba60, 0x40d6, 0xbfe8, 0xa1fc, 0x025e, 0x4249, 0x33b2, 0x2d28, 0x428c, 0xb22d, 0xbae2, 0x449c, 0x40ac, 0x41b2, 0x193a, 0x435b, 0x4155, 0x4060, 0x42b8, 0x4363, 0x18d6, 0x4162, 0x145b, 0x439a, 0xbf2b, 0xba23, 0x41fa, 0x311d, 0xb2bf, 0x3045, 0xba6f, 0xbf06, 0x213a, 0x4565, 0xb0af, 0xb2cf, 0xa9db, 0x41b9, 0x19e3, 0x427d, 0xa296, 0x440c, 0x4363, 0x411f, 0x425b, 0x421a, 0x4207, 0x1840, 0x435e, 0x4285, 0xba48, 0xb2de, 0x420c, 0xba22, 0xbf5d, 0x41d3, 0x1db2, 0x400a, 0xb2b3, 0x42f1, 0x4014, 0x42a5, 0xae6b, 0x37bf, 0xa4b4, 0x437b, 0x4089, 0xbf23, 0x41ca, 0x43c7, 0x45b4, 0xb2d0, 0x418f, 0x4086, 0x03a8, 0x401c, 0x42b0, 0xb270, 0x41df, 0x0b28, 0x428e, 0x1cd2, 0x4666, 0x426a, 0x275d, 0x4189, 0x42a3, 0x0223, 0x40a6, 0xb041, 0x16a8, 0x2e46, 0xba19, 0xb2e6, 0x1b94, 0xbfc1, 0x40cd, 0x1074, 0xb29a, 0x411c, 0x41e6, 0xb052, 0x18f6, 0x4356, 0x43fc, 0x19b9, 0x4045, 0x1a37, 0x4582, 0x43ba, 0x462b, 0x2e1b, 0x4052, 0x0a1a, 0x43ae, 0x31a1, 0x41f2, 0x42dd, 0x17ea, 0x43ee, 0x42f3, 0x2cbf, 0xbf66, 0xb023, 0x40f6, 0x407e, 0x4499, 0x4234, 0x44f4, 0x404a, 0xb2ed, 0x40d4, 0xbaea, 0x0ea6, 0x439a, 0xae0e, 0x1334, 0x4558, 0x336a, 0xb03b, 0x0b94, 0x41cf, 0x4256, 0x4188, 0x31f8, 0x404b, 0x410e, 0xbf69, 0x2a6c, 0xbacb, 0x1e69, 0x011a, 0xb23e, 0x44d0, 0x3916, 0xb295, 0xa0d9, 0xbf84, 0x3b79, 0xa6c3, 0xb089, 0xbfb0, 0x4303, 0x331b, 0xb229, 0x4341, 0x0bbb, 0x1ad9, 0x4047, 0x1ae3, 0x431c, 0xa448, 0x4179, 0x432c, 0xb281, 0x348d, 0x4170, 0xbf47, 0x43e2, 0x41a1, 0x419f, 0xa0fb, 0xb2d7, 0xb2d1, 0x412f, 0x467f, 0xba40, 0xb2e0, 0xbad8, 0x423b, 0x4628, 0x43ea, 0x41b9, 0x41eb, 0xb2b3, 0xbf28, 0x4350, 0xa460, 0x433f, 0x4032, 0x4390, 0xb287, 0x1865, 0x4668, 0x448c, 0x41b5, 0xbf75, 0x41ce, 0xbacd, 0x18ba, 0x1c8d, 0x41fc, 0x42eb, 0xbf18, 0x401d, 0x3d5d, 0x4122, 0xb01a, 0x40c4, 0x4321, 0xa7b0, 0xba1f, 0x4035, 0x0f4e, 0x2829, 0x031f, 0x464a, 0x404f, 0xbf70, 0x4093, 0x4321, 0x42ad, 0x4230, 0x4124, 0x4218, 0x00a8, 0xa451, 0xb2b3, 0xbf7c, 0xb26f, 0x44d3, 0x423b, 0xbfd0, 0x04af, 0xb28f, 0x4335, 0x39ab, 0x42c8, 0xbf24, 0xbf70, 0x3665, 0xb24e, 0xb2d8, 0xa20d, 0x10a4, 0x407e, 0xb0c1, 0xbfc5, 0xb281, 0x400e, 0x4352, 0x46c8, 0xbfb8, 0x4074, 0x4410, 0x4249, 0x4335, 0x248a, 0x43aa, 0x4074, 0x4171, 0x43fd, 0x4060, 0x1fe9, 0xbfae, 0x4477, 0x2eb5, 0x410a, 0x187d, 0x41aa, 0x4137, 0x434c, 0x4353, 0x1ff7, 0xb215, 0x3c25, 0x183f, 0xb2ad, 0xbf4b, 0xb2c7, 0xb00b, 0x4339, 0x417b, 0x44f3, 0xaa2f, 0x4304, 0x43e5, 0x00a0, 0xba0a, 0x41b8, 0x4250, 0xbf22, 0x45bd, 0x41f0, 0xbaf1, 0x419a, 0x1d5c, 0x2eae, 0x42e7, 0x43e3, 0x4680, 0x433b, 0xb290, 0x26f8, 0x4398, 0xbff0, 0x41e6, 0x230e, 0x4173, 0xba5c, 0x077b, 0x4202, 0x40ff, 0xb2f9, 0x4137, 0xba2e, 0xbf90, 0xb08f, 0xb052, 0x42fe, 0xbf9a, 0xb046, 0xb023, 0x4348, 0x286e, 0x1c5b, 0x40af, 0x1c83, 0x41ae, 0xb2d7, 0x4198, 0xbafd, 0x42fd, 0x43ae, 0x3637, 0x30a2, 0x42e9, 0x34b2, 0x409b, 0x1fe7, 0x07b7, 0x19ea, 0xbf46, 0x2813, 0x1bb9, 0x42d9, 0x433b, 0xa211, 0xb24a, 0x24a3, 0xa199, 0x1fde, 0xb2c6, 0x4337, 0xbfce, 0x2ee1, 0x3710, 0xb20a, 0x41d4, 0x4026, 0x4361, 0x0eaf, 0x2d39, 0x1542, 0x04c4, 0x4361, 0x419b, 0x40e2, 0x417d, 0x4060, 0x1f09, 0x3473, 0x46ab, 0x430c, 0x400c, 0xb2d7, 0x4334, 0x4054, 0x0f0c, 0x188e, 0xbf92, 0xbaed, 0xb299, 0x4381, 0x0ac1, 0x0c56, 0x4267, 0x401f, 0x33e1, 0x4304, 0x3db4, 0xb0a2, 0x4635, 0x41f5, 0xbf92, 0x3fad, 0x4115, 0x1cf4, 0xb2bb, 0x4229, 0x437c, 0x4097, 0x412e, 0xa0b9, 0x4356, 0xb2ca, 0x43b0, 0x42f0, 0xba39, 0x4348, 0x4263, 0x4335, 0x42dc, 0x44f0, 0x42c6, 0xaa4f, 0x42bc, 0x43ed, 0xbf87, 0xb03d, 0x41cc, 0x1a30, 0x415e, 0xb257, 0x0f62, 0x4469, 0x4051, 0xa912, 0x4303, 0x4214, 0xb07d, 0x4067, 0xb264, 0x1dbe, 0xbf97, 0x41b8, 0x415c, 0x42d6, 0x414d, 0x13ac, 0x401c, 0x40ed, 0x25d9, 0x1883, 0x41e9, 0x410b, 0x1a38, 0xbfaa, 0x19e7, 0x19f6, 0x19db, 0x4173, 0x41a5, 0x17bc, 0x412d, 0x44d9, 0x4010, 0x1a2b, 0xbaf4, 0x393a, 0xba48, 0xb22d, 0xb0f5, 0xbaf2, 0xa232, 0xba3e, 0x41ce, 0x22dd, 0xbf8c, 0xb21b, 0x1ecd, 0x43a2, 0xba6b, 0x4044, 0x401e, 0x404b, 0x1854, 0xaafa, 0x4120, 0xa640, 0x43f7, 0x40c6, 0xb037, 0xa95e, 0xb2c5, 0xa3a2, 0x41f0, 0xb0e9, 0x4250, 0x4233, 0x438a, 0x401c, 0x46c5, 0x42ca, 0x4366, 0xbfd3, 0xba2b, 0x4029, 0x4060, 0x400f, 0x36eb, 0x404d, 0x400b, 0x171b, 0xb0c3, 0x4027, 0xb2eb, 0x0c68, 0xb04c, 0xa245, 0xb252, 0xb252, 0xb2e1, 0x414a, 0xbf0d, 0x426e, 0x1efb, 0xb2ba, 0x1865, 0xbafc, 0xb005, 0x41da, 0x40ce, 0x3cbd, 0x043e, 0x404c, 0x3d77, 0x4685, 0x1b3d, 0x2daa, 0xa0d8, 0xb2e3, 0x43b3, 0x4181, 0x2bba, 0x4316, 0x41dd, 0x4197, 0xbfc1, 0x0e0d, 0x430f, 0x11cd, 0x3a11, 0x413a, 0xb2b7, 0x4013, 0x409d, 0xb209, 0x281f, 0xba08, 0x41f6, 0xb024, 0x428b, 0xbafb, 0x42eb, 0x40c5, 0x11a0, 0x1876, 0xb009, 0x4004, 0xb224, 0x4395, 0xb04c, 0x3b7a, 0xbf01, 0x439b, 0xb247, 0x4162, 0x2a56, 0x1a27, 0x1d9a, 0x4065, 0xbf11, 0x05ff, 0xb25a, 0x1c63, 0xba4c, 0x3bdb, 0x40da, 0x33b3, 0x36fc, 0xbf7e, 0x41c5, 0xb0e1, 0x408f, 0x43a6, 0x187d, 0x4080, 0x009a, 0x41a1, 0x29d0, 0x41ad, 0x1c45, 0x37ad, 0x3de5, 0x1d62, 0x09f7, 0x402d, 0x43e5, 0xba78, 0xb221, 0xbad6, 0x1e4b, 0x289e, 0x43f0, 0x1bee, 0xb2dd, 0x43cc, 0xbfc2, 0x1d46, 0x40c2, 0xaaf5, 0x171e, 0xbfdf, 0x419c, 0xb2e8, 0xb20d, 0xbad1, 0xbadf, 0x4581, 0x27ba, 0x406b, 0x1a29, 0x436a, 0x466d, 0x121a, 0xb2e4, 0x4220, 0xba0f, 0x19d6, 0x1950, 0xb2ff, 0xbfb0, 0x1a2c, 0xb215, 0x4162, 0xbfcd, 0x05c0, 0x42cc, 0x40f1, 0xb2da, 0x05a2, 0x2929, 0xb0c1, 0xbf14, 0x4381, 0xbad8, 0x4480, 0xb0b6, 0x192e, 0x1f16, 0xba09, 0xbfc0, 0x4313, 0xb279, 0x40e9, 0x41af, 0x4233, 0x45e4, 0x4238, 0xb248, 0xb2a8, 0xb0f9, 0x3043, 0x4107, 0x070c, 0xba6a, 0x25de, 0x4212, 0x19d1, 0x41a4, 0xa17f, 0xbf36, 0x41fe, 0x08d3, 0x405f, 0xbff0, 0x41b2, 0x43e3, 0x4182, 0x08f4, 0x4293, 0x4267, 0x4030, 0x1822, 0xb2d6, 0x0575, 0x2c57, 0xb250, 0x166f, 0xaa81, 0x1c30, 0x4205, 0xab93, 0xbf60, 0xac46, 0x4328, 0xbf79, 0xb201, 0x33c5, 0x2c7f, 0x410c, 0x424e, 0x2676, 0xb0ce, 0x1f23, 0xbaf2, 0xb043, 0x392d, 0xb019, 0x04fb, 0x4227, 0xac6a, 0x27c0, 0x42a5, 0xba24, 0xbaf8, 0x4566, 0xb04f, 0x4299, 0x1cc3, 0x06e8, 0xb249, 0xbf00, 0xb0ba, 0x1be0, 0xbf96, 0x1251, 0xb2da, 0x3640, 0x4770, 0xe7fe + ], + StartRegs = [0x32016fcd, 0xf25a55e0, 0xc71b8a9f, 0x506131e5, 0xb5f08c7b, 0x8bec972b, 0x7ac97655, 0x7a33d75d, 0x0edf0fa3, 0x7cb7ebe2, 0x7905d5a9, 0x340efd29, 0x6029b34a, 0xfe1edb24, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0xef04ff40, 0x00000013, 0x00000003, 0xffffc003, 0xef050000, 0x08000000, 0x00000076, 0x000000c0, 0xe86c0001, 0x61d69c09, 0x29ccbeb4, 0xffffcd3f, 0x63b7d8f7, 0x0000049b, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x1e27, 0x1948, 0x1be1, 0x43de, 0x0cb5, 0x25a1, 0x4599, 0x0a02, 0xb22d, 0xb224, 0xba71, 0x420e, 0x1e8e, 0xb09a, 0xb2db, 0x40d0, 0xbf5f, 0x3342, 0x1e2b, 0x42b0, 0x43a6, 0xb2ab, 0x43dc, 0xaad3, 0x186c, 0x1b0b, 0xa519, 0xa22e, 0x2d3c, 0x1bde, 0x138c, 0x42ff, 0x4225, 0xba3f, 0xa44f, 0x4009, 0x2ad5, 0x417b, 0xb262, 0x43db, 0x41c3, 0x436b, 0xba2c, 0x40c9, 0x42ee, 0xba09, 0xbf75, 0x408d, 0x2dc2, 0xb27b, 0xb09e, 0x4468, 0x40da, 0x334e, 0x42f9, 0x40c7, 0x414b, 0x42b9, 0x4476, 0x40b3, 0x41b8, 0x4267, 0x41ac, 0xb25c, 0x4095, 0xbfcc, 0xb2e8, 0xb249, 0x1942, 0x4156, 0x1fae, 0xb27f, 0xb2ca, 0xbf60, 0x14ca, 0x408b, 0x12db, 0xb202, 0x40cf, 0x4037, 0xb2a7, 0x43f7, 0x41c0, 0xbf8a, 0x4340, 0xba72, 0x0994, 0x1910, 0x4442, 0xb073, 0x4351, 0x41fe, 0xbac0, 0x4415, 0x1f23, 0xb0ba, 0x3850, 0x4334, 0xbf75, 0x40bb, 0x1e9f, 0x40f5, 0x415c, 0xb046, 0x0819, 0x4222, 0xaae3, 0x3564, 0xb2ca, 0xba1d, 0x0578, 0xb26f, 0x4392, 0x127c, 0xa13e, 0x4307, 0xbfc5, 0x38f9, 0x40ae, 0x4013, 0xb24a, 0x422f, 0x436e, 0xb23a, 0x403c, 0x1d4e, 0xad67, 0xb28e, 0xbaf9, 0xba44, 0xb25d, 0x43be, 0x1ba1, 0x402e, 0x43c7, 0xba0e, 0xba5e, 0xbfad, 0x43ec, 0x42c4, 0x41f0, 0x1e15, 0x1ada, 0x42e2, 0xa13f, 0x086d, 0x4427, 0x4249, 0x416e, 0xb29c, 0x4388, 0x42c6, 0x42a9, 0x43e5, 0x41f1, 0x4024, 0x44fb, 0x40ba, 0xba65, 0x4143, 0x2a73, 0x21c3, 0x401d, 0x0307, 0xbf52, 0x2b55, 0x4412, 0xaf31, 0xbf99, 0x4374, 0x41c6, 0x4194, 0x187d, 0x03ca, 0x42a7, 0xbaca, 0x1c5c, 0x44a9, 0xba03, 0x1951, 0xaa90, 0xba3d, 0x0779, 0x1c92, 0xbf64, 0x1f8a, 0x3e68, 0xb2e4, 0xb078, 0x0aac, 0x1c35, 0x4105, 0x1fd2, 0x4260, 0x4119, 0x3a45, 0x43e5, 0x42e8, 0xa547, 0xb277, 0x3210, 0x2663, 0x4271, 0xb228, 0x4242, 0x4671, 0x40b7, 0x4328, 0xba4a, 0xbf22, 0xba26, 0x3a73, 0xad7d, 0x1ef1, 0x4114, 0xbf00, 0x420a, 0x4287, 0x40c6, 0xa529, 0x1c0e, 0x43c5, 0x0179, 0x305b, 0x4323, 0x1e26, 0x4261, 0x0a63, 0x45ae, 0x404d, 0x2fd0, 0x4341, 0xb0fb, 0xbfd5, 0x2fc4, 0x1f1e, 0x42d8, 0xbac4, 0xbae0, 0xb2ea, 0x281e, 0x17d1, 0x18fe, 0x4243, 0x4265, 0xb278, 0x4193, 0xaccc, 0x41e2, 0x4129, 0x4111, 0x41e7, 0xb02b, 0x42b1, 0xb252, 0x405e, 0x2ea6, 0x4355, 0xb29d, 0x408d, 0x4272, 0xbfbe, 0x4301, 0x425c, 0x43ef, 0x1be2, 0x1c16, 0x2a79, 0x3f7d, 0x446c, 0x1c40, 0x1890, 0xb20f, 0x19bc, 0x3f0f, 0x4109, 0xba4a, 0x1f0f, 0xb2b4, 0xba7e, 0x418a, 0x43e7, 0x094e, 0x4367, 0xaaf4, 0xbade, 0xbac4, 0x4082, 0xbfa4, 0x3bab, 0x4172, 0xb27e, 0x1bb3, 0x16c0, 0xb217, 0x408d, 0xbad1, 0xb202, 0x0c8a, 0x41d6, 0x432f, 0x1f7a, 0x1ab8, 0x43aa, 0xbae5, 0xbf8a, 0x4342, 0x0d85, 0x2184, 0xb2d6, 0x24ec, 0x4281, 0x4393, 0xbfba, 0x4542, 0x4368, 0xb05f, 0xb22b, 0xa6d1, 0x2917, 0x4071, 0x427a, 0xb2d9, 0x0c5b, 0xb0e2, 0xba75, 0x410d, 0x3696, 0x4078, 0x4203, 0xb2da, 0xb225, 0x4073, 0x408e, 0x43ec, 0x4335, 0x10a4, 0x33f6, 0x402e, 0x4264, 0xb240, 0xbfcb, 0x4314, 0x1b15, 0x41d7, 0xb0f6, 0x0643, 0xba6d, 0x4073, 0xad70, 0xbad7, 0x4646, 0x4275, 0xae3f, 0x46d5, 0xbf35, 0x4390, 0x0321, 0x06c6, 0x4219, 0x02fe, 0x4243, 0x41dd, 0x1e18, 0xb226, 0xbf67, 0x432d, 0x15c5, 0xb273, 0x4043, 0x1fb3, 0xb28e, 0x1df2, 0x42f4, 0x187f, 0xbfc2, 0xba73, 0x4356, 0x3703, 0xbfb2, 0x423d, 0x2afd, 0x412e, 0x42ff, 0xba54, 0xba15, 0xba18, 0x186a, 0xbf70, 0xba3e, 0x43bb, 0x0d94, 0x0940, 0xb015, 0x2f56, 0x4196, 0x4227, 0x437d, 0x40da, 0xb261, 0x4312, 0x4061, 0xbf32, 0x0d8e, 0x4203, 0x4308, 0xbac4, 0x437a, 0x4074, 0xbf5d, 0x427b, 0xb2c7, 0x43e4, 0x39b8, 0xb272, 0x42d4, 0x4183, 0x423e, 0x44ba, 0x428a, 0x2b49, 0x463f, 0x410a, 0x0679, 0x4194, 0xb0dd, 0x41d8, 0x43c4, 0x0a84, 0xbfd7, 0x3b2c, 0xb285, 0x41db, 0x40e2, 0x0e78, 0x43df, 0x4212, 0xbf00, 0x4072, 0x433f, 0xb26b, 0x4389, 0x431a, 0x1890, 0x4264, 0x1f58, 0xbf8a, 0x46d8, 0xa682, 0x1b9e, 0x41d6, 0xbfa2, 0x438e, 0x42f7, 0x46b9, 0x416d, 0xba21, 0xb015, 0x428c, 0x1135, 0x4221, 0x42eb, 0x2cbd, 0x40a3, 0xb033, 0xb2de, 0x4562, 0x43c1, 0x433d, 0x406a, 0xb273, 0x0ddf, 0x104a, 0x440a, 0x2b0d, 0x40ff, 0x40af, 0x43d5, 0xbf42, 0xbacd, 0x143b, 0x43f2, 0x4267, 0xbf7f, 0xb009, 0x1925, 0xb054, 0x1c76, 0x0fb2, 0xb2bd, 0x42cd, 0x43f9, 0x40b1, 0x42af, 0x40df, 0x42fb, 0x421a, 0x4259, 0x311c, 0x4057, 0xba52, 0xbf9f, 0x1f33, 0xba70, 0x44c3, 0xbae6, 0x3643, 0xbaf1, 0x4242, 0x00ff, 0x43ba, 0xb01b, 0x40c8, 0x4551, 0xb26b, 0x14dd, 0x43cd, 0xbfa8, 0xb29f, 0x31ff, 0xb2cd, 0xb2b9, 0x43ce, 0xa0da, 0x46e8, 0x43cd, 0x42a5, 0x4346, 0x431b, 0xba29, 0xb229, 0xbf44, 0x1ed8, 0x42a0, 0x42ed, 0xb067, 0x4217, 0x418a, 0xb020, 0x0ba2, 0xb25e, 0x1498, 0x238f, 0x1f2c, 0x1c97, 0xbf53, 0x41b2, 0x19de, 0x41ae, 0xb050, 0xbf25, 0x4139, 0x41dd, 0x4378, 0xa7a1, 0x1a9e, 0x0941, 0xb22f, 0x2449, 0x4048, 0xba34, 0xb2dd, 0xb2b3, 0xbfa7, 0x438d, 0xba40, 0x03a0, 0x0a6d, 0x11d7, 0x2d4f, 0xb2b8, 0x43c7, 0xb010, 0xb04e, 0x4335, 0xb233, 0x0886, 0x184c, 0x45a9, 0x42a7, 0x42cf, 0x1a82, 0x0bf2, 0x043d, 0x40e7, 0x428b, 0xbf3f, 0x3742, 0x1ac4, 0x4112, 0xbfd0, 0x41db, 0x4128, 0xab3c, 0xbaee, 0x4108, 0xba1b, 0x4298, 0x296b, 0x405a, 0xacd9, 0x4439, 0x392f, 0xbad4, 0x46d5, 0x4349, 0xbfa5, 0x18bd, 0x15c3, 0x4124, 0x1e91, 0xba64, 0xb26b, 0x45a9, 0x1e72, 0xb2e1, 0xa04c, 0x0fa8, 0x418c, 0xabfa, 0xaafd, 0x420f, 0x243b, 0xb0d6, 0xbfa0, 0x4485, 0x4360, 0x41f9, 0x418e, 0x41b2, 0xbf7c, 0xb22a, 0x421e, 0xaa51, 0x40cd, 0x41b0, 0xbfbb, 0x1e7f, 0x4224, 0x43be, 0x420a, 0xbfe1, 0x46d3, 0x4364, 0x427e, 0x404a, 0x422b, 0x3a5f, 0x4280, 0xba77, 0xb0ee, 0x41e9, 0xbfca, 0x4230, 0x4264, 0x2b53, 0xba07, 0x4136, 0xba67, 0xbfd7, 0xb0d5, 0x059a, 0x406a, 0x4216, 0x43d9, 0x3325, 0xa91c, 0xb048, 0x415c, 0xb20e, 0xb2c7, 0xba6f, 0x18d9, 0xba46, 0x1abb, 0x433a, 0x41d0, 0xbf55, 0x4300, 0x4030, 0x412b, 0x37b3, 0xbfd0, 0xa03a, 0x40c0, 0x05ba, 0xb26d, 0x437e, 0x1049, 0x43c6, 0xb00f, 0x44d0, 0x441b, 0x31f0, 0x40a5, 0x199e, 0x40ec, 0xbfa5, 0x1983, 0x4377, 0x40de, 0x2838, 0x1b98, 0x1385, 0x409b, 0x417a, 0x460c, 0x436d, 0x3510, 0xba26, 0x3883, 0x4110, 0x4495, 0x409e, 0xbfae, 0xb297, 0x4678, 0x143a, 0x40a3, 0xb221, 0x333b, 0x1f02, 0xb031, 0x1d7a, 0x4061, 0x4138, 0x41dd, 0xb2dc, 0xb2ed, 0xba39, 0xbf28, 0xb2e8, 0x3fbf, 0x411c, 0x3271, 0x14a9, 0x414f, 0xa624, 0x1d2c, 0xbfa0, 0x4195, 0x4361, 0xb234, 0xb052, 0x4097, 0x43be, 0x4083, 0xba41, 0xbf34, 0xad4e, 0x4109, 0xb256, 0xb2e5, 0x39b3, 0x43ae, 0xb2e3, 0x2479, 0x40ba, 0xb229, 0x40d2, 0xbf7f, 0x3365, 0x41ba, 0xba78, 0x1b0c, 0x40db, 0x4358, 0xa8af, 0x42d7, 0x4573, 0xb29d, 0x15fb, 0xb00a, 0xb2ee, 0xb25c, 0xbfc1, 0x428b, 0x0d95, 0x4121, 0x43d1, 0x424c, 0x2cb8, 0xbf4c, 0xa326, 0x42b0, 0x14f3, 0x43eb, 0x379b, 0x41b8, 0xba3d, 0x1d51, 0x42c0, 0x1012, 0x414d, 0x221b, 0x434d, 0x38f4, 0x19d3, 0xb22e, 0xbfcb, 0x41d2, 0x4124, 0x3cb4, 0x1be3, 0x40ae, 0xba40, 0xb0a4, 0x1bec, 0xbac0, 0x41da, 0x43a7, 0xbf21, 0x41f5, 0x406f, 0xb090, 0x2a79, 0x4314, 0x1e36, 0x1a8e, 0x4163, 0x336b, 0xb0c0, 0x43e4, 0x4266, 0x4312, 0x1e45, 0x42ba, 0x4215, 0x0214, 0xa1c8, 0x4032, 0x43ea, 0xba10, 0x43c3, 0x41cd, 0x46e5, 0x3272, 0x21ec, 0x26d0, 0xbf2f, 0x4266, 0xba19, 0x419e, 0x3453, 0xb2b1, 0xb21b, 0xb2ad, 0x400a, 0x40f5, 0x1c18, 0x433e, 0x40a5, 0x1e4e, 0xb0ec, 0x4354, 0x3d65, 0xaac5, 0xba57, 0x4649, 0x42ab, 0x4123, 0x4434, 0x43eb, 0x430c, 0x2549, 0x0da8, 0x4309, 0x4119, 0xbfa3, 0x4380, 0x24cb, 0x410d, 0x43da, 0x431a, 0x404c, 0xb008, 0x41f2, 0x4588, 0x4112, 0x4572, 0xb231, 0x4196, 0x14a7, 0xa3f8, 0x407d, 0x42a1, 0x4074, 0xbf9a, 0x40ef, 0x4450, 0xb2a4, 0x463d, 0xb0cb, 0xbfa0, 0x4141, 0x316d, 0x19f4, 0x1273, 0x4433, 0x3c10, 0x4228, 0x441e, 0xbfd6, 0x42bc, 0x4088, 0x430e, 0xb01d, 0x1fb4, 0x4054, 0xb287, 0x40ce, 0x4012, 0xba62, 0xb26d, 0x3cfc, 0x43d4, 0x2128, 0xba0d, 0x1837, 0x460b, 0x1add, 0xba23, 0x1abf, 0x437f, 0xbf2d, 0x43bb, 0x407e, 0xb09e, 0x428d, 0x4263, 0x18d9, 0x2f7a, 0x405d, 0x406b, 0x4293, 0xb251, 0x4151, 0x4300, 0x4383, 0xb240, 0xb2f2, 0x2fc6, 0x2bc6, 0xb234, 0xba56, 0xbf17, 0xba48, 0x41e6, 0xba28, 0x4035, 0x4324, 0xb050, 0x43e3, 0x1fb1, 0x42ab, 0x42d4, 0x0549, 0x456b, 0x41d0, 0xb0c4, 0xb07a, 0x42b5, 0x2d57, 0xba52, 0x40c0, 0x43f1, 0xb288, 0xb2db, 0xb231, 0xba37, 0xb2fd, 0x11f8, 0x416d, 0xbfa4, 0x41de, 0x3da7, 0x4157, 0x3ddb, 0x4083, 0x40a4, 0x43ea, 0xb004, 0x295b, 0x416b, 0xbfb6, 0x4695, 0xb275, 0x41db, 0x19b8, 0xb2ad, 0x402e, 0xbf7b, 0x44a4, 0xbfa0, 0x4035, 0x404c, 0xb034, 0x41e9, 0x46f0, 0xbfb2, 0x0925, 0xb022, 0xb0df, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3ca5ddec, 0x567ac17b, 0x5090d856, 0x31dc27ca, 0xce87e6ed, 0x44ad92e1, 0xe67fdf6b, 0xfc9f1f92, 0x0b5c7af3, 0x2abf17e7, 0xcbcf4b4e, 0xcccdc713, 0x7e5f0f46, 0x63825539, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0x00048400, 0x00001000, 0x00000181, 0xffffdebf, 0x00060440, 0x0000fe7e, 0x00008000, 0x00040400, 0x00000000, 0xfffffbe7, 0xcbcf4b30, 0xcbcf4b30, 0x7e650f86, 0x0000015d, 0x00000000, 0x000001d0 }, + Instructions = [0x1e27, 0x1948, 0x1be1, 0x43de, 0x0cb5, 0x25a1, 0x4599, 0x0a02, 0xb22d, 0xb224, 0xba71, 0x420e, 0x1e8e, 0xb09a, 0xb2db, 0x40d0, 0xbf5f, 0x3342, 0x1e2b, 0x42b0, 0x43a6, 0xb2ab, 0x43dc, 0xaad3, 0x186c, 0x1b0b, 0xa519, 0xa22e, 0x2d3c, 0x1bde, 0x138c, 0x42ff, 0x4225, 0xba3f, 0xa44f, 0x4009, 0x2ad5, 0x417b, 0xb262, 0x43db, 0x41c3, 0x436b, 0xba2c, 0x40c9, 0x42ee, 0xba09, 0xbf75, 0x408d, 0x2dc2, 0xb27b, 0xb09e, 0x4468, 0x40da, 0x334e, 0x42f9, 0x40c7, 0x414b, 0x42b9, 0x4476, 0x40b3, 0x41b8, 0x4267, 0x41ac, 0xb25c, 0x4095, 0xbfcc, 0xb2e8, 0xb249, 0x1942, 0x4156, 0x1fae, 0xb27f, 0xb2ca, 0xbf60, 0x14ca, 0x408b, 0x12db, 0xb202, 0x40cf, 0x4037, 0xb2a7, 0x43f7, 0x41c0, 0xbf8a, 0x4340, 0xba72, 0x0994, 0x1910, 0x4442, 0xb073, 0x4351, 0x41fe, 0xbac0, 0x4415, 0x1f23, 0xb0ba, 0x3850, 0x4334, 0xbf75, 0x40bb, 0x1e9f, 0x40f5, 0x415c, 0xb046, 0x0819, 0x4222, 0xaae3, 0x3564, 0xb2ca, 0xba1d, 0x0578, 0xb26f, 0x4392, 0x127c, 0xa13e, 0x4307, 0xbfc5, 0x38f9, 0x40ae, 0x4013, 0xb24a, 0x422f, 0x436e, 0xb23a, 0x403c, 0x1d4e, 0xad67, 0xb28e, 0xbaf9, 0xba44, 0xb25d, 0x43be, 0x1ba1, 0x402e, 0x43c7, 0xba0e, 0xba5e, 0xbfad, 0x43ec, 0x42c4, 0x41f0, 0x1e15, 0x1ada, 0x42e2, 0xa13f, 0x086d, 0x4427, 0x4249, 0x416e, 0xb29c, 0x4388, 0x42c6, 0x42a9, 0x43e5, 0x41f1, 0x4024, 0x44fb, 0x40ba, 0xba65, 0x4143, 0x2a73, 0x21c3, 0x401d, 0x0307, 0xbf52, 0x2b55, 0x4412, 0xaf31, 0xbf99, 0x4374, 0x41c6, 0x4194, 0x187d, 0x03ca, 0x42a7, 0xbaca, 0x1c5c, 0x44a9, 0xba03, 0x1951, 0xaa90, 0xba3d, 0x0779, 0x1c92, 0xbf64, 0x1f8a, 0x3e68, 0xb2e4, 0xb078, 0x0aac, 0x1c35, 0x4105, 0x1fd2, 0x4260, 0x4119, 0x3a45, 0x43e5, 0x42e8, 0xa547, 0xb277, 0x3210, 0x2663, 0x4271, 0xb228, 0x4242, 0x4671, 0x40b7, 0x4328, 0xba4a, 0xbf22, 0xba26, 0x3a73, 0xad7d, 0x1ef1, 0x4114, 0xbf00, 0x420a, 0x4287, 0x40c6, 0xa529, 0x1c0e, 0x43c5, 0x0179, 0x305b, 0x4323, 0x1e26, 0x4261, 0x0a63, 0x45ae, 0x404d, 0x2fd0, 0x4341, 0xb0fb, 0xbfd5, 0x2fc4, 0x1f1e, 0x42d8, 0xbac4, 0xbae0, 0xb2ea, 0x281e, 0x17d1, 0x18fe, 0x4243, 0x4265, 0xb278, 0x4193, 0xaccc, 0x41e2, 0x4129, 0x4111, 0x41e7, 0xb02b, 0x42b1, 0xb252, 0x405e, 0x2ea6, 0x4355, 0xb29d, 0x408d, 0x4272, 0xbfbe, 0x4301, 0x425c, 0x43ef, 0x1be2, 0x1c16, 0x2a79, 0x3f7d, 0x446c, 0x1c40, 0x1890, 0xb20f, 0x19bc, 0x3f0f, 0x4109, 0xba4a, 0x1f0f, 0xb2b4, 0xba7e, 0x418a, 0x43e7, 0x094e, 0x4367, 0xaaf4, 0xbade, 0xbac4, 0x4082, 0xbfa4, 0x3bab, 0x4172, 0xb27e, 0x1bb3, 0x16c0, 0xb217, 0x408d, 0xbad1, 0xb202, 0x0c8a, 0x41d6, 0x432f, 0x1f7a, 0x1ab8, 0x43aa, 0xbae5, 0xbf8a, 0x4342, 0x0d85, 0x2184, 0xb2d6, 0x24ec, 0x4281, 0x4393, 0xbfba, 0x4542, 0x4368, 0xb05f, 0xb22b, 0xa6d1, 0x2917, 0x4071, 0x427a, 0xb2d9, 0x0c5b, 0xb0e2, 0xba75, 0x410d, 0x3696, 0x4078, 0x4203, 0xb2da, 0xb225, 0x4073, 0x408e, 0x43ec, 0x4335, 0x10a4, 0x33f6, 0x402e, 0x4264, 0xb240, 0xbfcb, 0x4314, 0x1b15, 0x41d7, 0xb0f6, 0x0643, 0xba6d, 0x4073, 0xad70, 0xbad7, 0x4646, 0x4275, 0xae3f, 0x46d5, 0xbf35, 0x4390, 0x0321, 0x06c6, 0x4219, 0x02fe, 0x4243, 0x41dd, 0x1e18, 0xb226, 0xbf67, 0x432d, 0x15c5, 0xb273, 0x4043, 0x1fb3, 0xb28e, 0x1df2, 0x42f4, 0x187f, 0xbfc2, 0xba73, 0x4356, 0x3703, 0xbfb2, 0x423d, 0x2afd, 0x412e, 0x42ff, 0xba54, 0xba15, 0xba18, 0x186a, 0xbf70, 0xba3e, 0x43bb, 0x0d94, 0x0940, 0xb015, 0x2f56, 0x4196, 0x4227, 0x437d, 0x40da, 0xb261, 0x4312, 0x4061, 0xbf32, 0x0d8e, 0x4203, 0x4308, 0xbac4, 0x437a, 0x4074, 0xbf5d, 0x427b, 0xb2c7, 0x43e4, 0x39b8, 0xb272, 0x42d4, 0x4183, 0x423e, 0x44ba, 0x428a, 0x2b49, 0x463f, 0x410a, 0x0679, 0x4194, 0xb0dd, 0x41d8, 0x43c4, 0x0a84, 0xbfd7, 0x3b2c, 0xb285, 0x41db, 0x40e2, 0x0e78, 0x43df, 0x4212, 0xbf00, 0x4072, 0x433f, 0xb26b, 0x4389, 0x431a, 0x1890, 0x4264, 0x1f58, 0xbf8a, 0x46d8, 0xa682, 0x1b9e, 0x41d6, 0xbfa2, 0x438e, 0x42f7, 0x46b9, 0x416d, 0xba21, 0xb015, 0x428c, 0x1135, 0x4221, 0x42eb, 0x2cbd, 0x40a3, 0xb033, 0xb2de, 0x4562, 0x43c1, 0x433d, 0x406a, 0xb273, 0x0ddf, 0x104a, 0x440a, 0x2b0d, 0x40ff, 0x40af, 0x43d5, 0xbf42, 0xbacd, 0x143b, 0x43f2, 0x4267, 0xbf7f, 0xb009, 0x1925, 0xb054, 0x1c76, 0x0fb2, 0xb2bd, 0x42cd, 0x43f9, 0x40b1, 0x42af, 0x40df, 0x42fb, 0x421a, 0x4259, 0x311c, 0x4057, 0xba52, 0xbf9f, 0x1f33, 0xba70, 0x44c3, 0xbae6, 0x3643, 0xbaf1, 0x4242, 0x00ff, 0x43ba, 0xb01b, 0x40c8, 0x4551, 0xb26b, 0x14dd, 0x43cd, 0xbfa8, 0xb29f, 0x31ff, 0xb2cd, 0xb2b9, 0x43ce, 0xa0da, 0x46e8, 0x43cd, 0x42a5, 0x4346, 0x431b, 0xba29, 0xb229, 0xbf44, 0x1ed8, 0x42a0, 0x42ed, 0xb067, 0x4217, 0x418a, 0xb020, 0x0ba2, 0xb25e, 0x1498, 0x238f, 0x1f2c, 0x1c97, 0xbf53, 0x41b2, 0x19de, 0x41ae, 0xb050, 0xbf25, 0x4139, 0x41dd, 0x4378, 0xa7a1, 0x1a9e, 0x0941, 0xb22f, 0x2449, 0x4048, 0xba34, 0xb2dd, 0xb2b3, 0xbfa7, 0x438d, 0xba40, 0x03a0, 0x0a6d, 0x11d7, 0x2d4f, 0xb2b8, 0x43c7, 0xb010, 0xb04e, 0x4335, 0xb233, 0x0886, 0x184c, 0x45a9, 0x42a7, 0x42cf, 0x1a82, 0x0bf2, 0x043d, 0x40e7, 0x428b, 0xbf3f, 0x3742, 0x1ac4, 0x4112, 0xbfd0, 0x41db, 0x4128, 0xab3c, 0xbaee, 0x4108, 0xba1b, 0x4298, 0x296b, 0x405a, 0xacd9, 0x4439, 0x392f, 0xbad4, 0x46d5, 0x4349, 0xbfa5, 0x18bd, 0x15c3, 0x4124, 0x1e91, 0xba64, 0xb26b, 0x45a9, 0x1e72, 0xb2e1, 0xa04c, 0x0fa8, 0x418c, 0xabfa, 0xaafd, 0x420f, 0x243b, 0xb0d6, 0xbfa0, 0x4485, 0x4360, 0x41f9, 0x418e, 0x41b2, 0xbf7c, 0xb22a, 0x421e, 0xaa51, 0x40cd, 0x41b0, 0xbfbb, 0x1e7f, 0x4224, 0x43be, 0x420a, 0xbfe1, 0x46d3, 0x4364, 0x427e, 0x404a, 0x422b, 0x3a5f, 0x4280, 0xba77, 0xb0ee, 0x41e9, 0xbfca, 0x4230, 0x4264, 0x2b53, 0xba07, 0x4136, 0xba67, 0xbfd7, 0xb0d5, 0x059a, 0x406a, 0x4216, 0x43d9, 0x3325, 0xa91c, 0xb048, 0x415c, 0xb20e, 0xb2c7, 0xba6f, 0x18d9, 0xba46, 0x1abb, 0x433a, 0x41d0, 0xbf55, 0x4300, 0x4030, 0x412b, 0x37b3, 0xbfd0, 0xa03a, 0x40c0, 0x05ba, 0xb26d, 0x437e, 0x1049, 0x43c6, 0xb00f, 0x44d0, 0x441b, 0x31f0, 0x40a5, 0x199e, 0x40ec, 0xbfa5, 0x1983, 0x4377, 0x40de, 0x2838, 0x1b98, 0x1385, 0x409b, 0x417a, 0x460c, 0x436d, 0x3510, 0xba26, 0x3883, 0x4110, 0x4495, 0x409e, 0xbfae, 0xb297, 0x4678, 0x143a, 0x40a3, 0xb221, 0x333b, 0x1f02, 0xb031, 0x1d7a, 0x4061, 0x4138, 0x41dd, 0xb2dc, 0xb2ed, 0xba39, 0xbf28, 0xb2e8, 0x3fbf, 0x411c, 0x3271, 0x14a9, 0x414f, 0xa624, 0x1d2c, 0xbfa0, 0x4195, 0x4361, 0xb234, 0xb052, 0x4097, 0x43be, 0x4083, 0xba41, 0xbf34, 0xad4e, 0x4109, 0xb256, 0xb2e5, 0x39b3, 0x43ae, 0xb2e3, 0x2479, 0x40ba, 0xb229, 0x40d2, 0xbf7f, 0x3365, 0x41ba, 0xba78, 0x1b0c, 0x40db, 0x4358, 0xa8af, 0x42d7, 0x4573, 0xb29d, 0x15fb, 0xb00a, 0xb2ee, 0xb25c, 0xbfc1, 0x428b, 0x0d95, 0x4121, 0x43d1, 0x424c, 0x2cb8, 0xbf4c, 0xa326, 0x42b0, 0x14f3, 0x43eb, 0x379b, 0x41b8, 0xba3d, 0x1d51, 0x42c0, 0x1012, 0x414d, 0x221b, 0x434d, 0x38f4, 0x19d3, 0xb22e, 0xbfcb, 0x41d2, 0x4124, 0x3cb4, 0x1be3, 0x40ae, 0xba40, 0xb0a4, 0x1bec, 0xbac0, 0x41da, 0x43a7, 0xbf21, 0x41f5, 0x406f, 0xb090, 0x2a79, 0x4314, 0x1e36, 0x1a8e, 0x4163, 0x336b, 0xb0c0, 0x43e4, 0x4266, 0x4312, 0x1e45, 0x42ba, 0x4215, 0x0214, 0xa1c8, 0x4032, 0x43ea, 0xba10, 0x43c3, 0x41cd, 0x46e5, 0x3272, 0x21ec, 0x26d0, 0xbf2f, 0x4266, 0xba19, 0x419e, 0x3453, 0xb2b1, 0xb21b, 0xb2ad, 0x400a, 0x40f5, 0x1c18, 0x433e, 0x40a5, 0x1e4e, 0xb0ec, 0x4354, 0x3d65, 0xaac5, 0xba57, 0x4649, 0x42ab, 0x4123, 0x4434, 0x43eb, 0x430c, 0x2549, 0x0da8, 0x4309, 0x4119, 0xbfa3, 0x4380, 0x24cb, 0x410d, 0x43da, 0x431a, 0x404c, 0xb008, 0x41f2, 0x4588, 0x4112, 0x4572, 0xb231, 0x4196, 0x14a7, 0xa3f8, 0x407d, 0x42a1, 0x4074, 0xbf9a, 0x40ef, 0x4450, 0xb2a4, 0x463d, 0xb0cb, 0xbfa0, 0x4141, 0x316d, 0x19f4, 0x1273, 0x4433, 0x3c10, 0x4228, 0x441e, 0xbfd6, 0x42bc, 0x4088, 0x430e, 0xb01d, 0x1fb4, 0x4054, 0xb287, 0x40ce, 0x4012, 0xba62, 0xb26d, 0x3cfc, 0x43d4, 0x2128, 0xba0d, 0x1837, 0x460b, 0x1add, 0xba23, 0x1abf, 0x437f, 0xbf2d, 0x43bb, 0x407e, 0xb09e, 0x428d, 0x4263, 0x18d9, 0x2f7a, 0x405d, 0x406b, 0x4293, 0xb251, 0x4151, 0x4300, 0x4383, 0xb240, 0xb2f2, 0x2fc6, 0x2bc6, 0xb234, 0xba56, 0xbf17, 0xba48, 0x41e6, 0xba28, 0x4035, 0x4324, 0xb050, 0x43e3, 0x1fb1, 0x42ab, 0x42d4, 0x0549, 0x456b, 0x41d0, 0xb0c4, 0xb07a, 0x42b5, 0x2d57, 0xba52, 0x40c0, 0x43f1, 0xb288, 0xb2db, 0xb231, 0xba37, 0xb2fd, 0x11f8, 0x416d, 0xbfa4, 0x41de, 0x3da7, 0x4157, 0x3ddb, 0x4083, 0x40a4, 0x43ea, 0xb004, 0x295b, 0x416b, 0xbfb6, 0x4695, 0xb275, 0x41db, 0x19b8, 0xb2ad, 0x402e, 0xbf7b, 0x44a4, 0xbfa0, 0x4035, 0x404c, 0xb034, 0x41e9, 0x46f0, 0xbfb2, 0x0925, 0xb022, 0xb0df, 0x4770, 0xe7fe + ], + StartRegs = [0x3ca5ddec, 0x567ac17b, 0x5090d856, 0x31dc27ca, 0xce87e6ed, 0x44ad92e1, 0xe67fdf6b, 0xfc9f1f92, 0x0b5c7af3, 0x2abf17e7, 0xcbcf4b4e, 0xcccdc713, 0x7e5f0f46, 0x63825539, 0x00000000, 0x900001f0 + ], + FinalRegs = [0x00048400, 0x00001000, 0x00000181, 0xffffdebf, 0x00060440, 0x0000fe7e, 0x00008000, 0x00040400, 0x00000000, 0xfffffbe7, 0xcbcf4b30, 0xcbcf4b30, 0x7e650f86, 0x0000015d, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x3a7c, 0x0655, 0x41a9, 0x3921, 0x4147, 0x429a, 0x13d5, 0x415e, 0x43ad, 0x373d, 0xb2e7, 0xa82f, 0x45b2, 0xb299, 0x4174, 0xbf15, 0x1155, 0xba32, 0x3a9c, 0x4037, 0x437e, 0xb01c, 0x4245, 0xbf92, 0x4029, 0x4111, 0x3fd8, 0x4299, 0x1b95, 0x404a, 0x4057, 0x4315, 0x4047, 0x423f, 0xaf03, 0xb27d, 0x22a0, 0xb012, 0xa3cf, 0x40d9, 0x40c6, 0x0e90, 0x4694, 0x40fd, 0x418b, 0x03c9, 0x44e0, 0xa932, 0x4397, 0xba5b, 0xbf3d, 0x4223, 0x1ff6, 0xb296, 0x4322, 0x28dc, 0x32c9, 0x4108, 0xbfdb, 0x433f, 0xb249, 0xb00c, 0x1d27, 0x46cd, 0x1aa1, 0xba2b, 0x1c1d, 0xa28d, 0xbfd5, 0x0057, 0xbac6, 0x4308, 0x1a2a, 0x42d1, 0x18ff, 0x432f, 0xbae0, 0x415c, 0xb032, 0x3c6b, 0x43e3, 0xb265, 0x42a1, 0x4013, 0x430f, 0x1c8c, 0x1fa1, 0x33f7, 0x4168, 0xbf21, 0x2136, 0x431e, 0x422d, 0xbae0, 0x432d, 0xb0ed, 0xb2d8, 0x0a2c, 0x41e8, 0xbf80, 0xbf88, 0xba28, 0xb2aa, 0xb267, 0x430e, 0xbf47, 0x4091, 0x40a5, 0xb2b3, 0x1b9e, 0x41e0, 0x420f, 0x1bfd, 0x1a1f, 0x1e8e, 0xbf7e, 0xbaeb, 0xa08a, 0x437e, 0x4339, 0xb006, 0x221f, 0x42b5, 0xb2c8, 0xb202, 0xbaef, 0x1902, 0x4161, 0x413c, 0x42b3, 0x18ba, 0x2f5c, 0xb252, 0xba3d, 0x4166, 0x43ee, 0x438d, 0xbf8d, 0x46e2, 0x0540, 0x303a, 0x43f5, 0x42a2, 0x4081, 0x34fa, 0x024c, 0x11d5, 0x2ac3, 0xbf00, 0xbfcc, 0x45c3, 0x439d, 0x4019, 0x401d, 0x40b2, 0x0891, 0xa357, 0x0a3d, 0xbf00, 0x0e7b, 0xb29d, 0xae6d, 0x438f, 0x4364, 0x4311, 0x42bd, 0x19ad, 0x44a4, 0x4624, 0xb2e5, 0x4134, 0x43e5, 0xbf16, 0x402d, 0x4391, 0xba51, 0x438f, 0x18f7, 0x455a, 0xafda, 0xbf6f, 0x4125, 0xbf60, 0x2490, 0xba2a, 0x038d, 0x410b, 0x42e6, 0x4224, 0x40b0, 0x1a97, 0xa5ee, 0x4073, 0xbf90, 0x4362, 0x1fbf, 0x4314, 0x4051, 0xb234, 0x4336, 0xbf60, 0xb046, 0xba05, 0xa6cc, 0xb2e1, 0x3022, 0xbfe0, 0x4608, 0xb2b0, 0xbaf1, 0xbfc3, 0x2620, 0x45b5, 0xbad8, 0x408d, 0x24c8, 0xb242, 0xb0f6, 0x4284, 0x4251, 0xaed4, 0x4302, 0x4197, 0xba77, 0x1678, 0x45a8, 0xba65, 0x4333, 0x1e84, 0x1af4, 0x4212, 0xbaff, 0xa4d9, 0xac32, 0xbfd0, 0x2306, 0x42ac, 0xbfaf, 0xb04c, 0xb285, 0x21dc, 0x42a6, 0x4121, 0xbfc0, 0x432f, 0xbf99, 0x3be7, 0xbf90, 0x40e6, 0xb288, 0xb27f, 0x4328, 0x245d, 0x41ef, 0x43bd, 0xb291, 0x40bd, 0xb0b5, 0xbf90, 0xbfe4, 0xb209, 0x1860, 0x4270, 0x42f8, 0xbfb0, 0x40c2, 0xbaeb, 0x09fb, 0x44f1, 0x41fc, 0x406a, 0x4134, 0xbfb0, 0x332a, 0xb26e, 0x0619, 0xba45, 0xbf89, 0x432c, 0xb2c3, 0xac47, 0x1d59, 0x2714, 0xb098, 0x433a, 0xa38a, 0x4573, 0x40b7, 0x41d6, 0x4180, 0xb259, 0xad42, 0x46c1, 0xb076, 0x406b, 0x4131, 0x40fb, 0x243f, 0x4285, 0x1b92, 0xb256, 0xa70f, 0x4168, 0x40bd, 0xb290, 0x12c5, 0xbfb8, 0x3068, 0x42d4, 0x410b, 0x1ef1, 0x4258, 0x0368, 0x46b5, 0x406b, 0x40aa, 0x4321, 0x1f9d, 0x4173, 0x430c, 0x43e5, 0x4026, 0xb2d8, 0xbf01, 0x3733, 0xbac9, 0x4275, 0x4276, 0x43d1, 0x1b8c, 0x4169, 0x4146, 0xa9aa, 0x4302, 0x1316, 0x4416, 0x43ca, 0x02f5, 0x42bb, 0xa7f7, 0xb204, 0x4632, 0x416c, 0xb030, 0x409a, 0x404b, 0x4385, 0x41cd, 0xb2b5, 0xb287, 0x4390, 0xbfce, 0x1b41, 0xb279, 0x1df6, 0x4220, 0xb020, 0x40b1, 0x45d3, 0x1d7b, 0x4162, 0x4234, 0x4201, 0x41cb, 0x30ba, 0x4039, 0xba5e, 0x4402, 0x429d, 0xba4e, 0x4652, 0xb2e8, 0x19cc, 0x38fd, 0x41b3, 0xbfd0, 0x43d6, 0xbf01, 0x43ee, 0x42c8, 0x07a7, 0x1893, 0x43c5, 0x4013, 0x1288, 0xba4a, 0x1534, 0x4091, 0x429b, 0x426b, 0xb234, 0xbf3a, 0x2bf6, 0x1e2f, 0xb28a, 0xa71a, 0xba32, 0x41e8, 0xbf65, 0x43c9, 0xacce, 0x403b, 0xb250, 0xaa0b, 0xabc5, 0xa194, 0xb214, 0x421d, 0x40cc, 0xa0e9, 0xb2d7, 0x1eff, 0x43d1, 0x417e, 0x42f1, 0x4275, 0xba1b, 0x3012, 0x13d4, 0x1fdd, 0x0af4, 0x4255, 0x4264, 0xbf9b, 0x1f56, 0x43e9, 0x418b, 0xbad9, 0x410a, 0x083d, 0x30af, 0xba48, 0x2c36, 0xbfdb, 0xb0fa, 0xb216, 0x3970, 0xba5f, 0x0556, 0x435a, 0x41d2, 0xb2db, 0x4395, 0xb020, 0xa2df, 0x43f7, 0x1dca, 0xb017, 0xba46, 0xb2aa, 0xbfa0, 0x07b6, 0x4040, 0xbf60, 0xa3c8, 0xbf69, 0xb232, 0x3ac1, 0x42bc, 0x44a3, 0xbadf, 0x0651, 0xb27d, 0x1f97, 0xbf93, 0x1625, 0xb2f8, 0xb2b8, 0x1244, 0xbf00, 0x41ac, 0xba03, 0x4030, 0x3d8e, 0x08b1, 0x41c7, 0xb04e, 0x3332, 0x1f10, 0x2903, 0x2272, 0x462e, 0xb204, 0xbf3f, 0xb2d0, 0x4375, 0x4204, 0x4062, 0x180c, 0x4084, 0xb298, 0x0fc2, 0xb270, 0x4085, 0xbf9b, 0x243f, 0x4390, 0x4221, 0x4445, 0x43e3, 0x45a9, 0x43d4, 0xbfdc, 0x402e, 0xbaec, 0xa8b2, 0x40bd, 0x2eb6, 0x4281, 0xb206, 0xb268, 0x30ef, 0x4043, 0x434e, 0x1a1d, 0x14c5, 0x43a9, 0x1fa9, 0x4376, 0x41bd, 0x423c, 0x43ab, 0x1aa7, 0x42d6, 0x0513, 0x4033, 0x31c5, 0x410f, 0x1db1, 0x40d3, 0xbf0c, 0x422c, 0x427b, 0x4019, 0x4066, 0x419e, 0x1cc6, 0x3571, 0xa6f0, 0x1813, 0x40d3, 0xb099, 0x035f, 0x19c3, 0x42ad, 0x42fb, 0x1d9e, 0xb25f, 0x1a90, 0xb28f, 0xbf3b, 0x3c2e, 0xba0a, 0xb067, 0xb2d9, 0x401c, 0x406e, 0x1b33, 0x4320, 0x43f7, 0x0df9, 0xbf41, 0x4166, 0x42ca, 0x43e7, 0xba7c, 0xb077, 0x1792, 0x43d3, 0x4085, 0xb27a, 0x4293, 0x403d, 0x410c, 0xbf08, 0x11e3, 0x41c2, 0x4083, 0x4364, 0xa113, 0x4010, 0x207c, 0x42aa, 0x1b60, 0x25fe, 0x4097, 0xb202, 0x40fc, 0xb07c, 0xbfdb, 0x041e, 0x40e1, 0x4046, 0x43e8, 0x42a3, 0x424a, 0xba73, 0x4002, 0x4350, 0xb2ae, 0x05a7, 0xb244, 0xb2a4, 0x19b4, 0xbf81, 0x4146, 0x431b, 0x4137, 0x46f8, 0xbfb4, 0x423f, 0xba3c, 0x1c8a, 0x40b6, 0x416f, 0xbade, 0x0565, 0x4027, 0xb2e7, 0x42a7, 0x0c0a, 0x4213, 0x40e5, 0x4058, 0xba68, 0x41eb, 0x4234, 0xbf84, 0x4333, 0xba18, 0x4073, 0x39be, 0x4339, 0x1e78, 0x42e2, 0x1396, 0xba2e, 0x4051, 0x3e8c, 0x40a6, 0xbf5e, 0xbaef, 0x36c9, 0x4060, 0xbfe0, 0x19fb, 0xbf35, 0x40b3, 0xba2d, 0x417a, 0x425b, 0x0bc2, 0xa2c7, 0x43ef, 0x4550, 0x427f, 0x402d, 0x18b3, 0x4104, 0xba2e, 0x1a9a, 0x4243, 0xbacd, 0x4116, 0xb2dc, 0xba6c, 0x410d, 0xbfad, 0x4189, 0x40fb, 0x437f, 0xba6b, 0x1023, 0x4063, 0xb2af, 0xaa18, 0x2514, 0x41c0, 0x32e8, 0x01c7, 0x35a9, 0xbfad, 0x4029, 0xb083, 0xba10, 0xb2be, 0x3276, 0xaf71, 0x4086, 0xb277, 0xbf6b, 0xb2d6, 0xb2f3, 0xb2ae, 0x19c3, 0x4366, 0x443b, 0x4124, 0x43bf, 0xa919, 0x434e, 0x12bf, 0x009f, 0x4006, 0xbff0, 0x43c5, 0xbf1a, 0xb0f6, 0x416d, 0x4114, 0x4624, 0x4161, 0x4089, 0x43b1, 0x4155, 0xbad4, 0xb000, 0xb042, 0x191e, 0x41c1, 0x4013, 0xb24f, 0xbf6c, 0x1dee, 0xb294, 0x1ce2, 0x435d, 0x41b1, 0xad83, 0x11c0, 0x40ce, 0x317f, 0x43c6, 0xb21a, 0xb002, 0xb298, 0x41ae, 0xb20f, 0x05ef, 0xb2a6, 0xb2fe, 0x1ad7, 0x45a0, 0x030c, 0x4089, 0xb26b, 0x4088, 0x4079, 0x3dc9, 0xbf87, 0x42bb, 0x1efc, 0x4018, 0xb254, 0x40ce, 0x3abc, 0xb0be, 0x4017, 0x1890, 0x414e, 0x4670, 0x1c83, 0xbf70, 0xbf41, 0xb277, 0x4283, 0x42c1, 0x41b9, 0x4006, 0xb260, 0x40c6, 0x455f, 0x4169, 0xb09d, 0x19ba, 0x263d, 0x40f9, 0xb07c, 0x41f8, 0x41c3, 0xbf97, 0x4031, 0x40a4, 0x1d03, 0xb21e, 0x4051, 0x003a, 0x4191, 0x409f, 0xb240, 0xbfd0, 0x0eaa, 0x43c4, 0x4262, 0x112b, 0x4264, 0xba2c, 0x4239, 0xbfc1, 0x43d7, 0x422e, 0xb291, 0x323a, 0xbae2, 0xb22f, 0xb0da, 0xb26e, 0x1a25, 0x43e1, 0x4208, 0x407c, 0x1d1e, 0xb27e, 0x1c0c, 0x0edc, 0x43ae, 0x4064, 0x459c, 0xa866, 0xb06f, 0x437a, 0x411e, 0x0a15, 0x1aeb, 0xb228, 0xb21b, 0x426f, 0x42f6, 0xbf34, 0x44bc, 0x016d, 0xac00, 0xb2e4, 0xbafc, 0x41d6, 0x44eb, 0x4063, 0x41bd, 0x409d, 0x39be, 0x438f, 0x45d0, 0x172e, 0x45bb, 0xbf6e, 0xb28f, 0x4262, 0xb2b8, 0x1c01, 0x45c4, 0x188e, 0x432d, 0x3671, 0x4039, 0x4450, 0x0adc, 0x44eb, 0xbf2f, 0xbaec, 0xbfa0, 0x0c02, 0x4293, 0x43c3, 0x19b8, 0xb251, 0x22f4, 0x1f80, 0xba39, 0x42c6, 0x1caa, 0xa3ae, 0x3100, 0x41dc, 0x4252, 0xb00b, 0xba1e, 0x421b, 0x437e, 0x1770, 0x4094, 0xa2d9, 0x1b0d, 0x148d, 0x4328, 0x4569, 0xbf46, 0x4283, 0x43a3, 0x3399, 0x3025, 0x40ce, 0xb284, 0x432a, 0x03d0, 0xbf90, 0xbafd, 0xbfcb, 0x43ad, 0x4013, 0xba27, 0x3d2a, 0x466f, 0x1653, 0xb204, 0x225c, 0xb213, 0x21e4, 0x43d3, 0x0eb4, 0xbae8, 0x415e, 0x4244, 0x4239, 0x4692, 0x2014, 0x411f, 0x1dfb, 0x42a8, 0xbfb6, 0x42f3, 0x1138, 0x22d0, 0xbfbf, 0xbacc, 0x0049, 0xbfa0, 0x4315, 0xba7a, 0x4182, 0x142f, 0x42b7, 0xbaf4, 0x465e, 0x4030, 0xb21d, 0x1a68, 0xb240, 0x2a11, 0xa788, 0x4088, 0x373f, 0xbfc9, 0x4347, 0x4088, 0x40ad, 0xb24d, 0xba22, 0xba5b, 0xb2f6, 0x4294, 0x406d, 0x428c, 0x1e96, 0xba49, 0xb0bc, 0x41a1, 0x4298, 0xb099, 0x410b, 0xbf38, 0xb21e, 0x43a8, 0x41d9, 0x4316, 0x4308, 0xbf07, 0xba54, 0x402a, 0x045d, 0x4356, 0x4077, 0x1573, 0xb208, 0x4069, 0x4100, 0x42f4, 0xaffb, 0x284f, 0xae93, 0x4348, 0x33ec, 0xb2b1, 0x41ce, 0x40a1, 0x1683, 0x427f, 0x42c6, 0x18f3, 0xb29e, 0xb2c0, 0x3d0f, 0xba15, 0x4116, 0xbf12, 0x43bf, 0x1c9d, 0xbae6, 0x4167, 0x42e5, 0x40ff, 0x404f, 0x1a21, 0x4028, 0x4289, 0x438d, 0xbfa3, 0x182c, 0x1cd9, 0x4304, 0x45a0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x916cb869, 0x845ddb9e, 0xc71efbae, 0xb5b0ddd7, 0xc96a166f, 0x0896734c, 0xe975a539, 0xda33958c, 0xf0631e50, 0x552ee4b2, 0x94f77f64, 0x1bf67a8f, 0x4cd88fc1, 0xd2a84a20, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x0990000d, 0xffa3ffff, 0x0990000a, 0x00000000, 0x00000000, 0xffffffa3, 0x00000000, 0xf0631ef0, 0xf0631ef0, 0x0000005c, 0x1bf68b67, 0x000000a0, 0x00000744, 0x00000000, 0x600001d0 }, + Instructions = [0x3a7c, 0x0655, 0x41a9, 0x3921, 0x4147, 0x429a, 0x13d5, 0x415e, 0x43ad, 0x373d, 0xb2e7, 0xa82f, 0x45b2, 0xb299, 0x4174, 0xbf15, 0x1155, 0xba32, 0x3a9c, 0x4037, 0x437e, 0xb01c, 0x4245, 0xbf92, 0x4029, 0x4111, 0x3fd8, 0x4299, 0x1b95, 0x404a, 0x4057, 0x4315, 0x4047, 0x423f, 0xaf03, 0xb27d, 0x22a0, 0xb012, 0xa3cf, 0x40d9, 0x40c6, 0x0e90, 0x4694, 0x40fd, 0x418b, 0x03c9, 0x44e0, 0xa932, 0x4397, 0xba5b, 0xbf3d, 0x4223, 0x1ff6, 0xb296, 0x4322, 0x28dc, 0x32c9, 0x4108, 0xbfdb, 0x433f, 0xb249, 0xb00c, 0x1d27, 0x46cd, 0x1aa1, 0xba2b, 0x1c1d, 0xa28d, 0xbfd5, 0x0057, 0xbac6, 0x4308, 0x1a2a, 0x42d1, 0x18ff, 0x432f, 0xbae0, 0x415c, 0xb032, 0x3c6b, 0x43e3, 0xb265, 0x42a1, 0x4013, 0x430f, 0x1c8c, 0x1fa1, 0x33f7, 0x4168, 0xbf21, 0x2136, 0x431e, 0x422d, 0xbae0, 0x432d, 0xb0ed, 0xb2d8, 0x0a2c, 0x41e8, 0xbf80, 0xbf88, 0xba28, 0xb2aa, 0xb267, 0x430e, 0xbf47, 0x4091, 0x40a5, 0xb2b3, 0x1b9e, 0x41e0, 0x420f, 0x1bfd, 0x1a1f, 0x1e8e, 0xbf7e, 0xbaeb, 0xa08a, 0x437e, 0x4339, 0xb006, 0x221f, 0x42b5, 0xb2c8, 0xb202, 0xbaef, 0x1902, 0x4161, 0x413c, 0x42b3, 0x18ba, 0x2f5c, 0xb252, 0xba3d, 0x4166, 0x43ee, 0x438d, 0xbf8d, 0x46e2, 0x0540, 0x303a, 0x43f5, 0x42a2, 0x4081, 0x34fa, 0x024c, 0x11d5, 0x2ac3, 0xbf00, 0xbfcc, 0x45c3, 0x439d, 0x4019, 0x401d, 0x40b2, 0x0891, 0xa357, 0x0a3d, 0xbf00, 0x0e7b, 0xb29d, 0xae6d, 0x438f, 0x4364, 0x4311, 0x42bd, 0x19ad, 0x44a4, 0x4624, 0xb2e5, 0x4134, 0x43e5, 0xbf16, 0x402d, 0x4391, 0xba51, 0x438f, 0x18f7, 0x455a, 0xafda, 0xbf6f, 0x4125, 0xbf60, 0x2490, 0xba2a, 0x038d, 0x410b, 0x42e6, 0x4224, 0x40b0, 0x1a97, 0xa5ee, 0x4073, 0xbf90, 0x4362, 0x1fbf, 0x4314, 0x4051, 0xb234, 0x4336, 0xbf60, 0xb046, 0xba05, 0xa6cc, 0xb2e1, 0x3022, 0xbfe0, 0x4608, 0xb2b0, 0xbaf1, 0xbfc3, 0x2620, 0x45b5, 0xbad8, 0x408d, 0x24c8, 0xb242, 0xb0f6, 0x4284, 0x4251, 0xaed4, 0x4302, 0x4197, 0xba77, 0x1678, 0x45a8, 0xba65, 0x4333, 0x1e84, 0x1af4, 0x4212, 0xbaff, 0xa4d9, 0xac32, 0xbfd0, 0x2306, 0x42ac, 0xbfaf, 0xb04c, 0xb285, 0x21dc, 0x42a6, 0x4121, 0xbfc0, 0x432f, 0xbf99, 0x3be7, 0xbf90, 0x40e6, 0xb288, 0xb27f, 0x4328, 0x245d, 0x41ef, 0x43bd, 0xb291, 0x40bd, 0xb0b5, 0xbf90, 0xbfe4, 0xb209, 0x1860, 0x4270, 0x42f8, 0xbfb0, 0x40c2, 0xbaeb, 0x09fb, 0x44f1, 0x41fc, 0x406a, 0x4134, 0xbfb0, 0x332a, 0xb26e, 0x0619, 0xba45, 0xbf89, 0x432c, 0xb2c3, 0xac47, 0x1d59, 0x2714, 0xb098, 0x433a, 0xa38a, 0x4573, 0x40b7, 0x41d6, 0x4180, 0xb259, 0xad42, 0x46c1, 0xb076, 0x406b, 0x4131, 0x40fb, 0x243f, 0x4285, 0x1b92, 0xb256, 0xa70f, 0x4168, 0x40bd, 0xb290, 0x12c5, 0xbfb8, 0x3068, 0x42d4, 0x410b, 0x1ef1, 0x4258, 0x0368, 0x46b5, 0x406b, 0x40aa, 0x4321, 0x1f9d, 0x4173, 0x430c, 0x43e5, 0x4026, 0xb2d8, 0xbf01, 0x3733, 0xbac9, 0x4275, 0x4276, 0x43d1, 0x1b8c, 0x4169, 0x4146, 0xa9aa, 0x4302, 0x1316, 0x4416, 0x43ca, 0x02f5, 0x42bb, 0xa7f7, 0xb204, 0x4632, 0x416c, 0xb030, 0x409a, 0x404b, 0x4385, 0x41cd, 0xb2b5, 0xb287, 0x4390, 0xbfce, 0x1b41, 0xb279, 0x1df6, 0x4220, 0xb020, 0x40b1, 0x45d3, 0x1d7b, 0x4162, 0x4234, 0x4201, 0x41cb, 0x30ba, 0x4039, 0xba5e, 0x4402, 0x429d, 0xba4e, 0x4652, 0xb2e8, 0x19cc, 0x38fd, 0x41b3, 0xbfd0, 0x43d6, 0xbf01, 0x43ee, 0x42c8, 0x07a7, 0x1893, 0x43c5, 0x4013, 0x1288, 0xba4a, 0x1534, 0x4091, 0x429b, 0x426b, 0xb234, 0xbf3a, 0x2bf6, 0x1e2f, 0xb28a, 0xa71a, 0xba32, 0x41e8, 0xbf65, 0x43c9, 0xacce, 0x403b, 0xb250, 0xaa0b, 0xabc5, 0xa194, 0xb214, 0x421d, 0x40cc, 0xa0e9, 0xb2d7, 0x1eff, 0x43d1, 0x417e, 0x42f1, 0x4275, 0xba1b, 0x3012, 0x13d4, 0x1fdd, 0x0af4, 0x4255, 0x4264, 0xbf9b, 0x1f56, 0x43e9, 0x418b, 0xbad9, 0x410a, 0x083d, 0x30af, 0xba48, 0x2c36, 0xbfdb, 0xb0fa, 0xb216, 0x3970, 0xba5f, 0x0556, 0x435a, 0x41d2, 0xb2db, 0x4395, 0xb020, 0xa2df, 0x43f7, 0x1dca, 0xb017, 0xba46, 0xb2aa, 0xbfa0, 0x07b6, 0x4040, 0xbf60, 0xa3c8, 0xbf69, 0xb232, 0x3ac1, 0x42bc, 0x44a3, 0xbadf, 0x0651, 0xb27d, 0x1f97, 0xbf93, 0x1625, 0xb2f8, 0xb2b8, 0x1244, 0xbf00, 0x41ac, 0xba03, 0x4030, 0x3d8e, 0x08b1, 0x41c7, 0xb04e, 0x3332, 0x1f10, 0x2903, 0x2272, 0x462e, 0xb204, 0xbf3f, 0xb2d0, 0x4375, 0x4204, 0x4062, 0x180c, 0x4084, 0xb298, 0x0fc2, 0xb270, 0x4085, 0xbf9b, 0x243f, 0x4390, 0x4221, 0x4445, 0x43e3, 0x45a9, 0x43d4, 0xbfdc, 0x402e, 0xbaec, 0xa8b2, 0x40bd, 0x2eb6, 0x4281, 0xb206, 0xb268, 0x30ef, 0x4043, 0x434e, 0x1a1d, 0x14c5, 0x43a9, 0x1fa9, 0x4376, 0x41bd, 0x423c, 0x43ab, 0x1aa7, 0x42d6, 0x0513, 0x4033, 0x31c5, 0x410f, 0x1db1, 0x40d3, 0xbf0c, 0x422c, 0x427b, 0x4019, 0x4066, 0x419e, 0x1cc6, 0x3571, 0xa6f0, 0x1813, 0x40d3, 0xb099, 0x035f, 0x19c3, 0x42ad, 0x42fb, 0x1d9e, 0xb25f, 0x1a90, 0xb28f, 0xbf3b, 0x3c2e, 0xba0a, 0xb067, 0xb2d9, 0x401c, 0x406e, 0x1b33, 0x4320, 0x43f7, 0x0df9, 0xbf41, 0x4166, 0x42ca, 0x43e7, 0xba7c, 0xb077, 0x1792, 0x43d3, 0x4085, 0xb27a, 0x4293, 0x403d, 0x410c, 0xbf08, 0x11e3, 0x41c2, 0x4083, 0x4364, 0xa113, 0x4010, 0x207c, 0x42aa, 0x1b60, 0x25fe, 0x4097, 0xb202, 0x40fc, 0xb07c, 0xbfdb, 0x041e, 0x40e1, 0x4046, 0x43e8, 0x42a3, 0x424a, 0xba73, 0x4002, 0x4350, 0xb2ae, 0x05a7, 0xb244, 0xb2a4, 0x19b4, 0xbf81, 0x4146, 0x431b, 0x4137, 0x46f8, 0xbfb4, 0x423f, 0xba3c, 0x1c8a, 0x40b6, 0x416f, 0xbade, 0x0565, 0x4027, 0xb2e7, 0x42a7, 0x0c0a, 0x4213, 0x40e5, 0x4058, 0xba68, 0x41eb, 0x4234, 0xbf84, 0x4333, 0xba18, 0x4073, 0x39be, 0x4339, 0x1e78, 0x42e2, 0x1396, 0xba2e, 0x4051, 0x3e8c, 0x40a6, 0xbf5e, 0xbaef, 0x36c9, 0x4060, 0xbfe0, 0x19fb, 0xbf35, 0x40b3, 0xba2d, 0x417a, 0x425b, 0x0bc2, 0xa2c7, 0x43ef, 0x4550, 0x427f, 0x402d, 0x18b3, 0x4104, 0xba2e, 0x1a9a, 0x4243, 0xbacd, 0x4116, 0xb2dc, 0xba6c, 0x410d, 0xbfad, 0x4189, 0x40fb, 0x437f, 0xba6b, 0x1023, 0x4063, 0xb2af, 0xaa18, 0x2514, 0x41c0, 0x32e8, 0x01c7, 0x35a9, 0xbfad, 0x4029, 0xb083, 0xba10, 0xb2be, 0x3276, 0xaf71, 0x4086, 0xb277, 0xbf6b, 0xb2d6, 0xb2f3, 0xb2ae, 0x19c3, 0x4366, 0x443b, 0x4124, 0x43bf, 0xa919, 0x434e, 0x12bf, 0x009f, 0x4006, 0xbff0, 0x43c5, 0xbf1a, 0xb0f6, 0x416d, 0x4114, 0x4624, 0x4161, 0x4089, 0x43b1, 0x4155, 0xbad4, 0xb000, 0xb042, 0x191e, 0x41c1, 0x4013, 0xb24f, 0xbf6c, 0x1dee, 0xb294, 0x1ce2, 0x435d, 0x41b1, 0xad83, 0x11c0, 0x40ce, 0x317f, 0x43c6, 0xb21a, 0xb002, 0xb298, 0x41ae, 0xb20f, 0x05ef, 0xb2a6, 0xb2fe, 0x1ad7, 0x45a0, 0x030c, 0x4089, 0xb26b, 0x4088, 0x4079, 0x3dc9, 0xbf87, 0x42bb, 0x1efc, 0x4018, 0xb254, 0x40ce, 0x3abc, 0xb0be, 0x4017, 0x1890, 0x414e, 0x4670, 0x1c83, 0xbf70, 0xbf41, 0xb277, 0x4283, 0x42c1, 0x41b9, 0x4006, 0xb260, 0x40c6, 0x455f, 0x4169, 0xb09d, 0x19ba, 0x263d, 0x40f9, 0xb07c, 0x41f8, 0x41c3, 0xbf97, 0x4031, 0x40a4, 0x1d03, 0xb21e, 0x4051, 0x003a, 0x4191, 0x409f, 0xb240, 0xbfd0, 0x0eaa, 0x43c4, 0x4262, 0x112b, 0x4264, 0xba2c, 0x4239, 0xbfc1, 0x43d7, 0x422e, 0xb291, 0x323a, 0xbae2, 0xb22f, 0xb0da, 0xb26e, 0x1a25, 0x43e1, 0x4208, 0x407c, 0x1d1e, 0xb27e, 0x1c0c, 0x0edc, 0x43ae, 0x4064, 0x459c, 0xa866, 0xb06f, 0x437a, 0x411e, 0x0a15, 0x1aeb, 0xb228, 0xb21b, 0x426f, 0x42f6, 0xbf34, 0x44bc, 0x016d, 0xac00, 0xb2e4, 0xbafc, 0x41d6, 0x44eb, 0x4063, 0x41bd, 0x409d, 0x39be, 0x438f, 0x45d0, 0x172e, 0x45bb, 0xbf6e, 0xb28f, 0x4262, 0xb2b8, 0x1c01, 0x45c4, 0x188e, 0x432d, 0x3671, 0x4039, 0x4450, 0x0adc, 0x44eb, 0xbf2f, 0xbaec, 0xbfa0, 0x0c02, 0x4293, 0x43c3, 0x19b8, 0xb251, 0x22f4, 0x1f80, 0xba39, 0x42c6, 0x1caa, 0xa3ae, 0x3100, 0x41dc, 0x4252, 0xb00b, 0xba1e, 0x421b, 0x437e, 0x1770, 0x4094, 0xa2d9, 0x1b0d, 0x148d, 0x4328, 0x4569, 0xbf46, 0x4283, 0x43a3, 0x3399, 0x3025, 0x40ce, 0xb284, 0x432a, 0x03d0, 0xbf90, 0xbafd, 0xbfcb, 0x43ad, 0x4013, 0xba27, 0x3d2a, 0x466f, 0x1653, 0xb204, 0x225c, 0xb213, 0x21e4, 0x43d3, 0x0eb4, 0xbae8, 0x415e, 0x4244, 0x4239, 0x4692, 0x2014, 0x411f, 0x1dfb, 0x42a8, 0xbfb6, 0x42f3, 0x1138, 0x22d0, 0xbfbf, 0xbacc, 0x0049, 0xbfa0, 0x4315, 0xba7a, 0x4182, 0x142f, 0x42b7, 0xbaf4, 0x465e, 0x4030, 0xb21d, 0x1a68, 0xb240, 0x2a11, 0xa788, 0x4088, 0x373f, 0xbfc9, 0x4347, 0x4088, 0x40ad, 0xb24d, 0xba22, 0xba5b, 0xb2f6, 0x4294, 0x406d, 0x428c, 0x1e96, 0xba49, 0xb0bc, 0x41a1, 0x4298, 0xb099, 0x410b, 0xbf38, 0xb21e, 0x43a8, 0x41d9, 0x4316, 0x4308, 0xbf07, 0xba54, 0x402a, 0x045d, 0x4356, 0x4077, 0x1573, 0xb208, 0x4069, 0x4100, 0x42f4, 0xaffb, 0x284f, 0xae93, 0x4348, 0x33ec, 0xb2b1, 0x41ce, 0x40a1, 0x1683, 0x427f, 0x42c6, 0x18f3, 0xb29e, 0xb2c0, 0x3d0f, 0xba15, 0x4116, 0xbf12, 0x43bf, 0x1c9d, 0xbae6, 0x4167, 0x42e5, 0x40ff, 0x404f, 0x1a21, 0x4028, 0x4289, 0x438d, 0xbfa3, 0x182c, 0x1cd9, 0x4304, 0x45a0, 0x4770, 0xe7fe + ], + StartRegs = [0x916cb869, 0x845ddb9e, 0xc71efbae, 0xb5b0ddd7, 0xc96a166f, 0x0896734c, 0xe975a539, 0xda33958c, 0xf0631e50, 0x552ee4b2, 0x94f77f64, 0x1bf67a8f, 0x4cd88fc1, 0xd2a84a20, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x00000000, 0x0990000d, 0xffa3ffff, 0x0990000a, 0x00000000, 0x00000000, 0xffffffa3, 0x00000000, 0xf0631ef0, 0xf0631ef0, 0x0000005c, 0x1bf68b67, 0x000000a0, 0x00000744, 0x00000000, 0x600001d0 + ], }, new() { - Instructions = new ushort[] { 0x1e86, 0x39ce, 0xb015, 0x4241, 0xba7a, 0x0ca5, 0xba1c, 0xb2c7, 0x1ade, 0x40e0, 0xbfc0, 0x18d9, 0x4195, 0x43e7, 0x144f, 0x1aa8, 0x402c, 0x19e3, 0x0f08, 0xbf33, 0x0146, 0x0896, 0x4298, 0x4011, 0x40b9, 0x4225, 0xae23, 0xa371, 0xb2ea, 0xb293, 0xaa59, 0xbacb, 0xb203, 0x40e4, 0x42a3, 0x158d, 0x42d3, 0x4435, 0xa63f, 0x1cb7, 0xae3d, 0x1b9c, 0x1ae6, 0x43a5, 0x4682, 0x38c3, 0x4199, 0x40e3, 0x4462, 0xbfd6, 0x1737, 0x4034, 0x413d, 0x1491, 0x40bd, 0x40d4, 0x1b2a, 0xbf9f, 0xbafa, 0xb2e1, 0x435b, 0x4057, 0x414d, 0x43c2, 0x46b2, 0x4247, 0x41a7, 0x422e, 0x4082, 0xb207, 0x1a3a, 0x1515, 0x301f, 0x42a4, 0x391a, 0x41af, 0x4102, 0xb246, 0xbf1c, 0xb2a7, 0x1fcb, 0xbad6, 0x41e6, 0x290a, 0x42c7, 0x1a97, 0x4616, 0x42f6, 0x1668, 0x4144, 0xb229, 0x43de, 0x1abb, 0xaeb6, 0x4658, 0xb2fd, 0xbf80, 0xb027, 0x4068, 0xac56, 0x0b56, 0xba3e, 0xb0ae, 0x2699, 0x4175, 0xbf39, 0x4367, 0x39a9, 0x4377, 0x3b13, 0x0504, 0x41cb, 0x43fe, 0x43a9, 0xb037, 0x4226, 0x4090, 0xb219, 0x4236, 0x4043, 0x435b, 0x163b, 0x41b5, 0x42ff, 0x03d5, 0xbf4e, 0xbad9, 0x42d2, 0x4063, 0x18c2, 0x4441, 0x1dac, 0xb287, 0x40b8, 0x4007, 0xb28d, 0x41a5, 0x4230, 0xbfa0, 0x419f, 0x0084, 0x4042, 0x1fe7, 0x42e3, 0x03a8, 0x2f05, 0x4641, 0xba39, 0xb266, 0x42cd, 0xb0f9, 0xb012, 0x4066, 0xb276, 0xbf3c, 0xb2b6, 0x197f, 0x4091, 0x1871, 0xbf11, 0xba70, 0xa8b5, 0x404b, 0x1bce, 0x43bb, 0x3ac6, 0xb021, 0xb2f4, 0x41f0, 0x4402, 0x2c5a, 0x45cc, 0x437c, 0xb023, 0xb23c, 0x37b9, 0x412d, 0x42b2, 0x43a1, 0xb089, 0x417f, 0x43ad, 0x4220, 0x42b4, 0x4176, 0x2e55, 0xb228, 0xbf0d, 0x3038, 0x4315, 0x4302, 0xba33, 0x43e0, 0x43cd, 0x0765, 0xbfc3, 0x41b6, 0x1bbb, 0x4007, 0xafba, 0x1c38, 0xb25e, 0xb2f2, 0x1ad5, 0x4196, 0xba2c, 0x40b4, 0x1a04, 0xb01a, 0xba71, 0xb2a8, 0x4685, 0xb0b2, 0xb20c, 0xba54, 0x46c5, 0xbf86, 0xa737, 0x4309, 0xb230, 0x03e0, 0xb282, 0x45ae, 0xb293, 0x40d7, 0x40c5, 0x40da, 0xb2fc, 0x40fb, 0x42c4, 0xb217, 0x367a, 0x41bd, 0xba6f, 0xba59, 0xba7a, 0x08b7, 0xbf67, 0x13e5, 0x408c, 0x12cf, 0xa5fd, 0x44ad, 0x34f1, 0xb2eb, 0x407c, 0x2b7a, 0xbfe0, 0x4481, 0xb286, 0x18f7, 0x42c5, 0x1fa6, 0x41b2, 0x42de, 0x40a0, 0x2f21, 0x4090, 0x4309, 0x4071, 0x3c32, 0x4203, 0x42f0, 0xba32, 0x41d8, 0x1daa, 0xbfbf, 0x402f, 0xb2d2, 0x435b, 0x4158, 0x407e, 0x20ff, 0xba0a, 0x1a6a, 0xba33, 0x4093, 0x43f0, 0xbf57, 0x43f9, 0xb2a1, 0x432f, 0xb2f5, 0x41cc, 0x4244, 0x1dc6, 0xb2b1, 0xba27, 0xbfa7, 0x347c, 0xb042, 0xba06, 0x41b2, 0xbaeb, 0x199f, 0xbfa7, 0x432f, 0xb2dd, 0x1a37, 0xb2dc, 0x434d, 0xbac5, 0xbaf8, 0x420e, 0x3f3f, 0xb0b2, 0x4005, 0x2b8a, 0x1c8d, 0x46e8, 0xade4, 0x425b, 0x4152, 0x0240, 0x4175, 0x0d64, 0x449a, 0x4018, 0x4366, 0xb2d5, 0x226b, 0x40ae, 0xb20f, 0xbf57, 0xa2c7, 0x42ac, 0xaf3b, 0x461f, 0xba67, 0x2af4, 0x4230, 0x4087, 0x1543, 0x43a9, 0x4232, 0x432e, 0xba6b, 0x46da, 0xba31, 0xbacb, 0x431a, 0x4343, 0xbfa9, 0x40c7, 0x18fb, 0xb2c6, 0x4066, 0xbf13, 0x4399, 0x4480, 0x3d8f, 0x111f, 0xbf1f, 0xbad3, 0x42be, 0x22b8, 0x438a, 0x0dd7, 0xa490, 0x400b, 0x424b, 0x4285, 0x407a, 0xae75, 0x17ab, 0x41a9, 0x1d62, 0xb214, 0xbf29, 0x4084, 0xa46a, 0x23a2, 0x44d2, 0xb0e4, 0x4203, 0x45ac, 0x4266, 0x1e81, 0x1a45, 0x10c8, 0xb0e2, 0x0833, 0x40aa, 0xb2cf, 0x1866, 0x1948, 0x435b, 0x18e0, 0xb230, 0x3774, 0x41b7, 0x1d3c, 0xb2b5, 0xbf90, 0x4265, 0xbfba, 0x4008, 0xba33, 0x1e27, 0x42d4, 0x1eef, 0xaf74, 0x41b5, 0x4069, 0x0d28, 0x0e57, 0x4254, 0x406f, 0xaac3, 0x1f94, 0x14a1, 0x4290, 0x4141, 0x4216, 0xb01f, 0x081b, 0xbfa1, 0xbfb0, 0x412b, 0xb24b, 0xb035, 0xb21f, 0x4248, 0x3144, 0xba32, 0x41d9, 0x461c, 0x1bb8, 0x40c8, 0xb266, 0xb258, 0xb2d6, 0xbadf, 0x42d4, 0x1a11, 0xbae0, 0x4629, 0xbf80, 0x4268, 0x0cef, 0x410f, 0xba0f, 0xba5e, 0xbf16, 0x42b3, 0xa03d, 0xb2b4, 0xb030, 0x3899, 0x4541, 0xb2e3, 0x1803, 0x16d3, 0xbfc2, 0xb216, 0x41dd, 0x42fa, 0xbf80, 0xafdf, 0x42da, 0x40e8, 0x1c5b, 0xb291, 0x1afb, 0xbf31, 0x41e2, 0x3e9d, 0x3a13, 0x11f2, 0x40ae, 0x400e, 0xba28, 0x40b8, 0x409d, 0x417c, 0x1ee6, 0x4252, 0xaa67, 0x0485, 0x43c7, 0xb0f3, 0x410c, 0x28df, 0xba12, 0x2ed5, 0xbf9f, 0xba74, 0x1d89, 0x44ac, 0x437a, 0x1e57, 0xbff0, 0x40cf, 0x415b, 0xb0a7, 0x414b, 0x402c, 0x4495, 0x29be, 0xa885, 0x39bb, 0x43c7, 0xbfb8, 0xb233, 0x1b91, 0x438e, 0xb21c, 0x1b36, 0xbf61, 0x4378, 0x4393, 0xba2b, 0x34c6, 0x1fef, 0xaa51, 0xa22d, 0xb270, 0x0598, 0xbfb0, 0xbad6, 0x42d9, 0xba35, 0x1bb7, 0x45f3, 0x4115, 0x1cfd, 0x42e9, 0x402f, 0xb20c, 0xbfd0, 0xae0a, 0x40c1, 0xb09d, 0xba08, 0x1fad, 0x41a9, 0x4387, 0x461c, 0xbf53, 0x186f, 0x2e59, 0x42b8, 0x425d, 0xbf11, 0x436c, 0xba65, 0x43b9, 0x4626, 0x44c3, 0x41b6, 0x1884, 0xb057, 0x1e30, 0xbfdd, 0x43a6, 0x405e, 0xa060, 0x423e, 0xb014, 0xba47, 0xad06, 0x1f36, 0xbf75, 0x464a, 0x3179, 0xa268, 0x463e, 0xb086, 0x2610, 0x401f, 0x2f67, 0x4409, 0x42c7, 0x1f54, 0x409b, 0x4111, 0x424a, 0xbf5d, 0x43b2, 0x467c, 0x40dd, 0x4085, 0xa14a, 0xa7d5, 0xba37, 0x4378, 0x4152, 0x43f6, 0x022e, 0x22b8, 0xb219, 0xba5b, 0xbf27, 0x424a, 0x0809, 0x4413, 0xb046, 0xbf60, 0x10bf, 0x1d41, 0x41bd, 0x1ed3, 0xac2b, 0xb2e2, 0xbfa0, 0x0d1b, 0x1fa2, 0xbf0e, 0xba7c, 0x40e4, 0x404e, 0x4593, 0xb276, 0x4170, 0x3ab1, 0xaad4, 0x2013, 0x3e57, 0xb0b8, 0xba09, 0x463b, 0xa62e, 0x43ac, 0x4390, 0x1c3e, 0x41f4, 0x01b9, 0x43b4, 0xb20d, 0xbf69, 0x4246, 0x4183, 0x42f6, 0x1bae, 0x4081, 0xabe8, 0x4013, 0x44c1, 0xa15e, 0x4271, 0x41a5, 0x42e1, 0x1cc6, 0x4302, 0x1176, 0x0ade, 0x0697, 0x41ad, 0x42ab, 0x41c5, 0x4260, 0x454a, 0xba34, 0xbf02, 0xb035, 0xb04b, 0x430d, 0x4418, 0x1bdd, 0xbfba, 0xb26f, 0x1b87, 0x42f2, 0x403c, 0x420a, 0x40b0, 0x1c57, 0xb061, 0x438a, 0x4173, 0x2e49, 0xb2f9, 0xbfc6, 0x41db, 0x1ad3, 0xba5d, 0x456c, 0xba02, 0x4245, 0xb098, 0x4267, 0x4141, 0x4665, 0x44a4, 0x05b1, 0xb2c1, 0xb001, 0x4205, 0x43fb, 0x40df, 0x19be, 0x43a4, 0x405a, 0x463f, 0x4130, 0x41ee, 0xb2da, 0xbf97, 0xac39, 0x4601, 0x41e1, 0x4175, 0xa137, 0x43d0, 0x4182, 0x1bf3, 0xbfd9, 0x409d, 0xb2a1, 0xba51, 0x013e, 0xbac1, 0x12a3, 0x4069, 0xabd0, 0x4220, 0xb0f8, 0xa4f4, 0x198b, 0x2d94, 0x43ee, 0x1fce, 0xba06, 0x022e, 0x42ea, 0x4229, 0x1d1e, 0xb0e2, 0xbfa3, 0x0bed, 0x4095, 0xba7c, 0x0052, 0x403c, 0xbadb, 0x4180, 0xba66, 0x4028, 0x427c, 0x2473, 0xba2c, 0xbf9b, 0xb208, 0xba24, 0x41f2, 0x4377, 0x1dd5, 0x40c1, 0xbf90, 0xb2c3, 0x1b1d, 0x42ac, 0x45ca, 0xbf8a, 0x1edd, 0x276c, 0x46d5, 0x32fc, 0xa25c, 0xb2d8, 0x4063, 0xbfb0, 0x02b4, 0x1c84, 0x2bcf, 0x429e, 0xb0f0, 0x43c5, 0x0fe7, 0x4323, 0xb2af, 0x1c79, 0x42c9, 0xa5ef, 0x41e9, 0x039f, 0x46ec, 0x1cd3, 0x1747, 0xbf6e, 0x42ba, 0xbad7, 0x4048, 0xb25a, 0x1930, 0x4296, 0xb08c, 0x406a, 0xb066, 0x191b, 0x3bd6, 0xba7c, 0x416e, 0x0db1, 0x4273, 0xbff0, 0xbf19, 0xba02, 0xbaf5, 0x4297, 0x41cd, 0x42d0, 0x411a, 0x1adb, 0x3814, 0xbf68, 0xb0b9, 0x415a, 0x4658, 0xb215, 0x4198, 0x4082, 0x43f7, 0xb097, 0xba0e, 0x1ac2, 0x431a, 0xb075, 0x4253, 0xb2a6, 0xbf9a, 0x1816, 0x41d5, 0xb2ef, 0xb0fa, 0x428f, 0x1b75, 0xba57, 0x4241, 0x43b8, 0x41de, 0xb2c4, 0xbaf0, 0xa9d9, 0xbfd4, 0x3b4a, 0xbacd, 0x426c, 0x1fa9, 0x3d6f, 0xbf07, 0xa213, 0x42c7, 0x0aa3, 0x43a1, 0xb090, 0xba23, 0x42ff, 0xa8ce, 0x4313, 0x41f5, 0x4691, 0xa85a, 0xac75, 0xbfe0, 0x0459, 0xaabc, 0x42c0, 0xbf1a, 0x41e2, 0xb03b, 0x1b5e, 0x2210, 0x4263, 0xbfc0, 0x2f43, 0xa745, 0x1bcc, 0x403c, 0x443a, 0x44bd, 0xbfc0, 0xb25c, 0x400f, 0x42f4, 0xbfe4, 0x4446, 0xb23d, 0x4166, 0xba55, 0xb2b2, 0xb2aa, 0x19ad, 0xa192, 0xb0d9, 0xa1b6, 0x42d5, 0x429e, 0x402b, 0xbf37, 0xb2c3, 0x2823, 0x425c, 0x0c29, 0x42a0, 0x0885, 0x4077, 0x43db, 0xb2c9, 0x2cd3, 0x4249, 0xbf81, 0xb212, 0x400a, 0x133a, 0x03ef, 0x30dc, 0x2ebf, 0x1b95, 0x1abb, 0xbfb0, 0xb2e7, 0x41e0, 0x401b, 0x400f, 0x3cd1, 0x3f45, 0xbf5a, 0x43be, 0x44c1, 0x4662, 0xbfc0, 0x4019, 0x4357, 0xb298, 0x4278, 0x4338, 0x2492, 0x4279, 0xb0a0, 0x436e, 0x4378, 0x4272, 0x19be, 0x4243, 0x43dc, 0x41aa, 0x1938, 0xbf22, 0x4202, 0xb0b5, 0xbac3, 0x1989, 0xa4aa, 0xb21e, 0x43ad, 0x4495, 0xbfde, 0x2891, 0xb287, 0xb2bf, 0x182f, 0x436c, 0x0e88, 0xb2fd, 0x4207, 0xba23, 0xb0ac, 0xbf39, 0x3a14, 0xb2a6, 0x42f3, 0x13e5, 0xb097, 0x4008, 0x4286, 0x421c, 0xbf4a, 0x1dc9, 0x1a6a, 0x41bf, 0xba55, 0x2f4b, 0xaa67, 0x4175, 0x4003, 0x4189, 0xb279, 0xbf3e, 0x4102, 0x45dd, 0xbfd0, 0xbad2, 0x0cb3, 0xb06f, 0x43f0, 0x44ed, 0x1af4, 0x40e7, 0xbfa1, 0x1ea1, 0x461d, 0x42b7, 0xb0a6, 0x44c0, 0xa90f, 0x280c, 0x42ff, 0x39ac, 0x4334, 0x4395, 0xba55, 0x4119, 0x1c16, 0xbfa0, 0x40d1, 0xb24e, 0x41f0, 0x3292, 0xba52, 0x4016, 0x43ce, 0x0873, 0x3836, 0xb074, 0xb08c, 0xbacc, 0xbf8b, 0x4301, 0xb274, 0xbfa0, 0x41f3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5a5bb2e2, 0x70b44505, 0xf439f718, 0x7601686e, 0x506efe14, 0xe57877bf, 0xae23b7eb, 0x04b61cf8, 0x3e1feb19, 0x3ee9a3be, 0x31b2d471, 0x4f5928f4, 0x9e0f7156, 0x0e22cfed, 0x00000000, 0xc00001f0 }, - FinalRegs = new uint[] { 0xffffffc9, 0xffffffc9, 0x00009100, 0x7fffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x7c404452, 0x8d794b1c, 0x4f5928f4, 0x8d794b1d, 0xfb201937, 0xf1ddb58c, 0x00000000, 0xa00001d0 }, + Instructions = [0x1e86, 0x39ce, 0xb015, 0x4241, 0xba7a, 0x0ca5, 0xba1c, 0xb2c7, 0x1ade, 0x40e0, 0xbfc0, 0x18d9, 0x4195, 0x43e7, 0x144f, 0x1aa8, 0x402c, 0x19e3, 0x0f08, 0xbf33, 0x0146, 0x0896, 0x4298, 0x4011, 0x40b9, 0x4225, 0xae23, 0xa371, 0xb2ea, 0xb293, 0xaa59, 0xbacb, 0xb203, 0x40e4, 0x42a3, 0x158d, 0x42d3, 0x4435, 0xa63f, 0x1cb7, 0xae3d, 0x1b9c, 0x1ae6, 0x43a5, 0x4682, 0x38c3, 0x4199, 0x40e3, 0x4462, 0xbfd6, 0x1737, 0x4034, 0x413d, 0x1491, 0x40bd, 0x40d4, 0x1b2a, 0xbf9f, 0xbafa, 0xb2e1, 0x435b, 0x4057, 0x414d, 0x43c2, 0x46b2, 0x4247, 0x41a7, 0x422e, 0x4082, 0xb207, 0x1a3a, 0x1515, 0x301f, 0x42a4, 0x391a, 0x41af, 0x4102, 0xb246, 0xbf1c, 0xb2a7, 0x1fcb, 0xbad6, 0x41e6, 0x290a, 0x42c7, 0x1a97, 0x4616, 0x42f6, 0x1668, 0x4144, 0xb229, 0x43de, 0x1abb, 0xaeb6, 0x4658, 0xb2fd, 0xbf80, 0xb027, 0x4068, 0xac56, 0x0b56, 0xba3e, 0xb0ae, 0x2699, 0x4175, 0xbf39, 0x4367, 0x39a9, 0x4377, 0x3b13, 0x0504, 0x41cb, 0x43fe, 0x43a9, 0xb037, 0x4226, 0x4090, 0xb219, 0x4236, 0x4043, 0x435b, 0x163b, 0x41b5, 0x42ff, 0x03d5, 0xbf4e, 0xbad9, 0x42d2, 0x4063, 0x18c2, 0x4441, 0x1dac, 0xb287, 0x40b8, 0x4007, 0xb28d, 0x41a5, 0x4230, 0xbfa0, 0x419f, 0x0084, 0x4042, 0x1fe7, 0x42e3, 0x03a8, 0x2f05, 0x4641, 0xba39, 0xb266, 0x42cd, 0xb0f9, 0xb012, 0x4066, 0xb276, 0xbf3c, 0xb2b6, 0x197f, 0x4091, 0x1871, 0xbf11, 0xba70, 0xa8b5, 0x404b, 0x1bce, 0x43bb, 0x3ac6, 0xb021, 0xb2f4, 0x41f0, 0x4402, 0x2c5a, 0x45cc, 0x437c, 0xb023, 0xb23c, 0x37b9, 0x412d, 0x42b2, 0x43a1, 0xb089, 0x417f, 0x43ad, 0x4220, 0x42b4, 0x4176, 0x2e55, 0xb228, 0xbf0d, 0x3038, 0x4315, 0x4302, 0xba33, 0x43e0, 0x43cd, 0x0765, 0xbfc3, 0x41b6, 0x1bbb, 0x4007, 0xafba, 0x1c38, 0xb25e, 0xb2f2, 0x1ad5, 0x4196, 0xba2c, 0x40b4, 0x1a04, 0xb01a, 0xba71, 0xb2a8, 0x4685, 0xb0b2, 0xb20c, 0xba54, 0x46c5, 0xbf86, 0xa737, 0x4309, 0xb230, 0x03e0, 0xb282, 0x45ae, 0xb293, 0x40d7, 0x40c5, 0x40da, 0xb2fc, 0x40fb, 0x42c4, 0xb217, 0x367a, 0x41bd, 0xba6f, 0xba59, 0xba7a, 0x08b7, 0xbf67, 0x13e5, 0x408c, 0x12cf, 0xa5fd, 0x44ad, 0x34f1, 0xb2eb, 0x407c, 0x2b7a, 0xbfe0, 0x4481, 0xb286, 0x18f7, 0x42c5, 0x1fa6, 0x41b2, 0x42de, 0x40a0, 0x2f21, 0x4090, 0x4309, 0x4071, 0x3c32, 0x4203, 0x42f0, 0xba32, 0x41d8, 0x1daa, 0xbfbf, 0x402f, 0xb2d2, 0x435b, 0x4158, 0x407e, 0x20ff, 0xba0a, 0x1a6a, 0xba33, 0x4093, 0x43f0, 0xbf57, 0x43f9, 0xb2a1, 0x432f, 0xb2f5, 0x41cc, 0x4244, 0x1dc6, 0xb2b1, 0xba27, 0xbfa7, 0x347c, 0xb042, 0xba06, 0x41b2, 0xbaeb, 0x199f, 0xbfa7, 0x432f, 0xb2dd, 0x1a37, 0xb2dc, 0x434d, 0xbac5, 0xbaf8, 0x420e, 0x3f3f, 0xb0b2, 0x4005, 0x2b8a, 0x1c8d, 0x46e8, 0xade4, 0x425b, 0x4152, 0x0240, 0x4175, 0x0d64, 0x449a, 0x4018, 0x4366, 0xb2d5, 0x226b, 0x40ae, 0xb20f, 0xbf57, 0xa2c7, 0x42ac, 0xaf3b, 0x461f, 0xba67, 0x2af4, 0x4230, 0x4087, 0x1543, 0x43a9, 0x4232, 0x432e, 0xba6b, 0x46da, 0xba31, 0xbacb, 0x431a, 0x4343, 0xbfa9, 0x40c7, 0x18fb, 0xb2c6, 0x4066, 0xbf13, 0x4399, 0x4480, 0x3d8f, 0x111f, 0xbf1f, 0xbad3, 0x42be, 0x22b8, 0x438a, 0x0dd7, 0xa490, 0x400b, 0x424b, 0x4285, 0x407a, 0xae75, 0x17ab, 0x41a9, 0x1d62, 0xb214, 0xbf29, 0x4084, 0xa46a, 0x23a2, 0x44d2, 0xb0e4, 0x4203, 0x45ac, 0x4266, 0x1e81, 0x1a45, 0x10c8, 0xb0e2, 0x0833, 0x40aa, 0xb2cf, 0x1866, 0x1948, 0x435b, 0x18e0, 0xb230, 0x3774, 0x41b7, 0x1d3c, 0xb2b5, 0xbf90, 0x4265, 0xbfba, 0x4008, 0xba33, 0x1e27, 0x42d4, 0x1eef, 0xaf74, 0x41b5, 0x4069, 0x0d28, 0x0e57, 0x4254, 0x406f, 0xaac3, 0x1f94, 0x14a1, 0x4290, 0x4141, 0x4216, 0xb01f, 0x081b, 0xbfa1, 0xbfb0, 0x412b, 0xb24b, 0xb035, 0xb21f, 0x4248, 0x3144, 0xba32, 0x41d9, 0x461c, 0x1bb8, 0x40c8, 0xb266, 0xb258, 0xb2d6, 0xbadf, 0x42d4, 0x1a11, 0xbae0, 0x4629, 0xbf80, 0x4268, 0x0cef, 0x410f, 0xba0f, 0xba5e, 0xbf16, 0x42b3, 0xa03d, 0xb2b4, 0xb030, 0x3899, 0x4541, 0xb2e3, 0x1803, 0x16d3, 0xbfc2, 0xb216, 0x41dd, 0x42fa, 0xbf80, 0xafdf, 0x42da, 0x40e8, 0x1c5b, 0xb291, 0x1afb, 0xbf31, 0x41e2, 0x3e9d, 0x3a13, 0x11f2, 0x40ae, 0x400e, 0xba28, 0x40b8, 0x409d, 0x417c, 0x1ee6, 0x4252, 0xaa67, 0x0485, 0x43c7, 0xb0f3, 0x410c, 0x28df, 0xba12, 0x2ed5, 0xbf9f, 0xba74, 0x1d89, 0x44ac, 0x437a, 0x1e57, 0xbff0, 0x40cf, 0x415b, 0xb0a7, 0x414b, 0x402c, 0x4495, 0x29be, 0xa885, 0x39bb, 0x43c7, 0xbfb8, 0xb233, 0x1b91, 0x438e, 0xb21c, 0x1b36, 0xbf61, 0x4378, 0x4393, 0xba2b, 0x34c6, 0x1fef, 0xaa51, 0xa22d, 0xb270, 0x0598, 0xbfb0, 0xbad6, 0x42d9, 0xba35, 0x1bb7, 0x45f3, 0x4115, 0x1cfd, 0x42e9, 0x402f, 0xb20c, 0xbfd0, 0xae0a, 0x40c1, 0xb09d, 0xba08, 0x1fad, 0x41a9, 0x4387, 0x461c, 0xbf53, 0x186f, 0x2e59, 0x42b8, 0x425d, 0xbf11, 0x436c, 0xba65, 0x43b9, 0x4626, 0x44c3, 0x41b6, 0x1884, 0xb057, 0x1e30, 0xbfdd, 0x43a6, 0x405e, 0xa060, 0x423e, 0xb014, 0xba47, 0xad06, 0x1f36, 0xbf75, 0x464a, 0x3179, 0xa268, 0x463e, 0xb086, 0x2610, 0x401f, 0x2f67, 0x4409, 0x42c7, 0x1f54, 0x409b, 0x4111, 0x424a, 0xbf5d, 0x43b2, 0x467c, 0x40dd, 0x4085, 0xa14a, 0xa7d5, 0xba37, 0x4378, 0x4152, 0x43f6, 0x022e, 0x22b8, 0xb219, 0xba5b, 0xbf27, 0x424a, 0x0809, 0x4413, 0xb046, 0xbf60, 0x10bf, 0x1d41, 0x41bd, 0x1ed3, 0xac2b, 0xb2e2, 0xbfa0, 0x0d1b, 0x1fa2, 0xbf0e, 0xba7c, 0x40e4, 0x404e, 0x4593, 0xb276, 0x4170, 0x3ab1, 0xaad4, 0x2013, 0x3e57, 0xb0b8, 0xba09, 0x463b, 0xa62e, 0x43ac, 0x4390, 0x1c3e, 0x41f4, 0x01b9, 0x43b4, 0xb20d, 0xbf69, 0x4246, 0x4183, 0x42f6, 0x1bae, 0x4081, 0xabe8, 0x4013, 0x44c1, 0xa15e, 0x4271, 0x41a5, 0x42e1, 0x1cc6, 0x4302, 0x1176, 0x0ade, 0x0697, 0x41ad, 0x42ab, 0x41c5, 0x4260, 0x454a, 0xba34, 0xbf02, 0xb035, 0xb04b, 0x430d, 0x4418, 0x1bdd, 0xbfba, 0xb26f, 0x1b87, 0x42f2, 0x403c, 0x420a, 0x40b0, 0x1c57, 0xb061, 0x438a, 0x4173, 0x2e49, 0xb2f9, 0xbfc6, 0x41db, 0x1ad3, 0xba5d, 0x456c, 0xba02, 0x4245, 0xb098, 0x4267, 0x4141, 0x4665, 0x44a4, 0x05b1, 0xb2c1, 0xb001, 0x4205, 0x43fb, 0x40df, 0x19be, 0x43a4, 0x405a, 0x463f, 0x4130, 0x41ee, 0xb2da, 0xbf97, 0xac39, 0x4601, 0x41e1, 0x4175, 0xa137, 0x43d0, 0x4182, 0x1bf3, 0xbfd9, 0x409d, 0xb2a1, 0xba51, 0x013e, 0xbac1, 0x12a3, 0x4069, 0xabd0, 0x4220, 0xb0f8, 0xa4f4, 0x198b, 0x2d94, 0x43ee, 0x1fce, 0xba06, 0x022e, 0x42ea, 0x4229, 0x1d1e, 0xb0e2, 0xbfa3, 0x0bed, 0x4095, 0xba7c, 0x0052, 0x403c, 0xbadb, 0x4180, 0xba66, 0x4028, 0x427c, 0x2473, 0xba2c, 0xbf9b, 0xb208, 0xba24, 0x41f2, 0x4377, 0x1dd5, 0x40c1, 0xbf90, 0xb2c3, 0x1b1d, 0x42ac, 0x45ca, 0xbf8a, 0x1edd, 0x276c, 0x46d5, 0x32fc, 0xa25c, 0xb2d8, 0x4063, 0xbfb0, 0x02b4, 0x1c84, 0x2bcf, 0x429e, 0xb0f0, 0x43c5, 0x0fe7, 0x4323, 0xb2af, 0x1c79, 0x42c9, 0xa5ef, 0x41e9, 0x039f, 0x46ec, 0x1cd3, 0x1747, 0xbf6e, 0x42ba, 0xbad7, 0x4048, 0xb25a, 0x1930, 0x4296, 0xb08c, 0x406a, 0xb066, 0x191b, 0x3bd6, 0xba7c, 0x416e, 0x0db1, 0x4273, 0xbff0, 0xbf19, 0xba02, 0xbaf5, 0x4297, 0x41cd, 0x42d0, 0x411a, 0x1adb, 0x3814, 0xbf68, 0xb0b9, 0x415a, 0x4658, 0xb215, 0x4198, 0x4082, 0x43f7, 0xb097, 0xba0e, 0x1ac2, 0x431a, 0xb075, 0x4253, 0xb2a6, 0xbf9a, 0x1816, 0x41d5, 0xb2ef, 0xb0fa, 0x428f, 0x1b75, 0xba57, 0x4241, 0x43b8, 0x41de, 0xb2c4, 0xbaf0, 0xa9d9, 0xbfd4, 0x3b4a, 0xbacd, 0x426c, 0x1fa9, 0x3d6f, 0xbf07, 0xa213, 0x42c7, 0x0aa3, 0x43a1, 0xb090, 0xba23, 0x42ff, 0xa8ce, 0x4313, 0x41f5, 0x4691, 0xa85a, 0xac75, 0xbfe0, 0x0459, 0xaabc, 0x42c0, 0xbf1a, 0x41e2, 0xb03b, 0x1b5e, 0x2210, 0x4263, 0xbfc0, 0x2f43, 0xa745, 0x1bcc, 0x403c, 0x443a, 0x44bd, 0xbfc0, 0xb25c, 0x400f, 0x42f4, 0xbfe4, 0x4446, 0xb23d, 0x4166, 0xba55, 0xb2b2, 0xb2aa, 0x19ad, 0xa192, 0xb0d9, 0xa1b6, 0x42d5, 0x429e, 0x402b, 0xbf37, 0xb2c3, 0x2823, 0x425c, 0x0c29, 0x42a0, 0x0885, 0x4077, 0x43db, 0xb2c9, 0x2cd3, 0x4249, 0xbf81, 0xb212, 0x400a, 0x133a, 0x03ef, 0x30dc, 0x2ebf, 0x1b95, 0x1abb, 0xbfb0, 0xb2e7, 0x41e0, 0x401b, 0x400f, 0x3cd1, 0x3f45, 0xbf5a, 0x43be, 0x44c1, 0x4662, 0xbfc0, 0x4019, 0x4357, 0xb298, 0x4278, 0x4338, 0x2492, 0x4279, 0xb0a0, 0x436e, 0x4378, 0x4272, 0x19be, 0x4243, 0x43dc, 0x41aa, 0x1938, 0xbf22, 0x4202, 0xb0b5, 0xbac3, 0x1989, 0xa4aa, 0xb21e, 0x43ad, 0x4495, 0xbfde, 0x2891, 0xb287, 0xb2bf, 0x182f, 0x436c, 0x0e88, 0xb2fd, 0x4207, 0xba23, 0xb0ac, 0xbf39, 0x3a14, 0xb2a6, 0x42f3, 0x13e5, 0xb097, 0x4008, 0x4286, 0x421c, 0xbf4a, 0x1dc9, 0x1a6a, 0x41bf, 0xba55, 0x2f4b, 0xaa67, 0x4175, 0x4003, 0x4189, 0xb279, 0xbf3e, 0x4102, 0x45dd, 0xbfd0, 0xbad2, 0x0cb3, 0xb06f, 0x43f0, 0x44ed, 0x1af4, 0x40e7, 0xbfa1, 0x1ea1, 0x461d, 0x42b7, 0xb0a6, 0x44c0, 0xa90f, 0x280c, 0x42ff, 0x39ac, 0x4334, 0x4395, 0xba55, 0x4119, 0x1c16, 0xbfa0, 0x40d1, 0xb24e, 0x41f0, 0x3292, 0xba52, 0x4016, 0x43ce, 0x0873, 0x3836, 0xb074, 0xb08c, 0xbacc, 0xbf8b, 0x4301, 0xb274, 0xbfa0, 0x41f3, 0x4770, 0xe7fe + ], + StartRegs = [0x5a5bb2e2, 0x70b44505, 0xf439f718, 0x7601686e, 0x506efe14, 0xe57877bf, 0xae23b7eb, 0x04b61cf8, 0x3e1feb19, 0x3ee9a3be, 0x31b2d471, 0x4f5928f4, 0x9e0f7156, 0x0e22cfed, 0x00000000, 0xc00001f0 + ], + FinalRegs = [0xffffffc9, 0xffffffc9, 0x00009100, 0x7fffffff, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x7c404452, 0x8d794b1c, 0x4f5928f4, 0x8d794b1d, 0xfb201937, 0xf1ddb58c, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0xbac1, 0x4158, 0x40ea, 0x242c, 0x4288, 0xb29e, 0x418a, 0xbf23, 0xb2fa, 0x4148, 0x3f4d, 0xba28, 0x43a5, 0xb0fb, 0x1ba0, 0x4000, 0x2c42, 0xbac7, 0x40bf, 0xa072, 0x43fc, 0x1202, 0x40a6, 0xba20, 0xbf96, 0xb0ff, 0x0d2b, 0xb221, 0xb274, 0xb237, 0x4048, 0x43ef, 0x45a1, 0x1d08, 0x1c73, 0xbf35, 0x44c0, 0xbacb, 0xb0bf, 0xa4a5, 0x06ac, 0xa673, 0x4076, 0x42de, 0x411c, 0x4316, 0xba5a, 0xb222, 0xbf60, 0x1f22, 0x4047, 0x4599, 0x43eb, 0x3d4e, 0x4684, 0x4159, 0x42d6, 0x4397, 0x4019, 0x37f0, 0x0c64, 0xba56, 0x404f, 0x419b, 0xbfab, 0x0a60, 0x1678, 0xb2e1, 0x4087, 0x4113, 0x1c75, 0x43e2, 0x4580, 0xb2f4, 0x1a65, 0x41bf, 0xa5c4, 0xbf00, 0x023e, 0xba5b, 0x40ec, 0x423f, 0x4265, 0x4159, 0xba17, 0x43d5, 0xbfa0, 0x419d, 0x0690, 0x4613, 0x4026, 0x4237, 0x419a, 0xbfbd, 0xaf55, 0xb248, 0x1543, 0x43c3, 0x1eac, 0x4208, 0xb224, 0xbacd, 0x4290, 0x40dd, 0xb2bb, 0x4551, 0x40a6, 0x4595, 0x4118, 0x1940, 0xbf41, 0x3427, 0x18e1, 0x405d, 0x4086, 0x42c3, 0xaaaf, 0x39b0, 0x40a6, 0x2091, 0xbf1f, 0xb29c, 0x0054, 0x3139, 0x40a2, 0x3fcc, 0x2890, 0x4073, 0x4378, 0x1fe5, 0x00f7, 0x1a7b, 0xbad5, 0x401d, 0x4229, 0x424e, 0x1e92, 0xa256, 0x40ed, 0xa108, 0xbfa8, 0x41b1, 0x40ad, 0x1f7c, 0xb2ce, 0xb27e, 0xbf7b, 0x4066, 0x305d, 0xba36, 0xbafb, 0x2265, 0xba43, 0xb213, 0x43fe, 0x40ba, 0xa9a2, 0xbfc5, 0x1c2e, 0x4254, 0xa6ce, 0x40c7, 0xb0d1, 0x416d, 0x425f, 0xa0b5, 0x4365, 0x1da1, 0xb204, 0x3eca, 0x430c, 0x4646, 0x43f9, 0x42c3, 0xbf68, 0x4058, 0x416d, 0x1e07, 0x1e89, 0x40ec, 0x4041, 0x40b4, 0xb01d, 0xb234, 0x4023, 0xb019, 0x4679, 0xb0ff, 0x4624, 0xad8f, 0x188f, 0x412e, 0xaf18, 0x1adc, 0xbf11, 0x1f44, 0x436d, 0x436b, 0xa7ad, 0x0ba2, 0xb28b, 0x4273, 0xb22d, 0x4097, 0x4105, 0x426c, 0xb25a, 0xbf90, 0x428c, 0x138c, 0x44e1, 0x418a, 0x1aff, 0x219f, 0xb269, 0xbf15, 0x0b01, 0x4201, 0x4008, 0xbafe, 0x3265, 0xb0b0, 0x4359, 0x45ba, 0x425f, 0xb214, 0x42e9, 0x4456, 0x404d, 0xbfd7, 0x40a2, 0xb0f8, 0x4032, 0x18b3, 0x3009, 0xb2ab, 0x41b7, 0x44c9, 0x4419, 0xb096, 0x429f, 0x433d, 0x38f2, 0xbfe0, 0x4083, 0x414b, 0x4055, 0xba74, 0xbf75, 0x4072, 0x41fb, 0xb04a, 0x43e3, 0x43f7, 0xad8d, 0xb251, 0xba67, 0x4300, 0x4259, 0x4206, 0xb0a2, 0xb242, 0x4699, 0x1c9e, 0xbf73, 0x434f, 0x0744, 0xa414, 0x4099, 0x4661, 0xba62, 0x2e9f, 0x431a, 0x05c6, 0x465d, 0xb2ee, 0xbae1, 0x093a, 0xbf90, 0x4399, 0xb21d, 0x40dd, 0xb2b5, 0x0057, 0xbf60, 0x1f1c, 0xbf18, 0xb28b, 0x41f3, 0xbadb, 0xbf9c, 0xb261, 0x129d, 0x42fb, 0x42b7, 0x4306, 0xb06f, 0xb2d6, 0x41b6, 0xa264, 0x4001, 0x2ef9, 0x2dc8, 0x40c6, 0x40f3, 0x456f, 0x414e, 0x26ae, 0x2625, 0x41bf, 0x40b0, 0x1a12, 0x31a8, 0xb000, 0x1a30, 0xbf31, 0x1198, 0x44fd, 0x043c, 0x4301, 0x1a9d, 0x10cc, 0xbfac, 0x401e, 0x135e, 0xb2df, 0x4356, 0xae2b, 0x40e0, 0x43f7, 0x322f, 0xba6b, 0xbfde, 0x1e91, 0x21a5, 0x413f, 0x4081, 0x134a, 0x43d9, 0x417b, 0xb089, 0xadcd, 0xb220, 0x43ab, 0x1aed, 0xa819, 0x1ee7, 0xb0de, 0xb2dd, 0x2249, 0x4122, 0x29d1, 0xa87d, 0xb0b2, 0x128c, 0x33a1, 0x0d9c, 0xbf16, 0x15ea, 0x4607, 0xbf70, 0x2f6c, 0x1900, 0x4060, 0x1abd, 0xb2f2, 0xba65, 0x4166, 0x3593, 0xbfcf, 0x1a90, 0x4308, 0x4447, 0xba58, 0x1bf2, 0x419c, 0x181c, 0x2f88, 0x4141, 0x418a, 0x4067, 0x12a7, 0xb0c5, 0x4197, 0x0a82, 0x0774, 0x34e5, 0x4456, 0x4109, 0x4209, 0x445d, 0x4029, 0x0d4e, 0x424b, 0x42ee, 0x41a0, 0x4673, 0xbf70, 0xbf3c, 0x18f1, 0x3e63, 0xa7f4, 0x097a, 0x4586, 0x4163, 0x40f1, 0xba57, 0x284b, 0x420e, 0x41cd, 0x4092, 0xba0d, 0x4230, 0x43ce, 0x445c, 0x44cd, 0xb23f, 0x40a6, 0x41ce, 0x1d86, 0xb235, 0xb251, 0xb289, 0x43ba, 0xbfc5, 0x408f, 0xba1b, 0xb0fe, 0x41c0, 0x4107, 0x36ad, 0x3817, 0x2df3, 0xab39, 0x223f, 0x4253, 0xbf67, 0x4148, 0x40d9, 0x42f0, 0xb0e5, 0x4314, 0x404d, 0xb2c4, 0x2d43, 0x41eb, 0x2b28, 0x4630, 0x21d0, 0x1f98, 0xb28a, 0x43c0, 0xbf80, 0x1d10, 0xacb5, 0x45db, 0xbf59, 0x1132, 0x1ef9, 0x429c, 0x1cce, 0x41af, 0xa433, 0x15e1, 0x42b5, 0x419c, 0x1b1f, 0xb2e5, 0x4012, 0xb28c, 0x1d9b, 0xa11e, 0x1a24, 0x423a, 0x40e8, 0xb257, 0x41f4, 0x4452, 0x24ad, 0xbf9a, 0x1809, 0xb2dd, 0xb2be, 0x4104, 0x19b0, 0x43c4, 0xb037, 0x43ea, 0xae35, 0x04ab, 0xb2f8, 0x2c34, 0x2827, 0x40bd, 0x466b, 0xbf59, 0xb029, 0xb219, 0x42fd, 0x434f, 0x1cfa, 0xa456, 0x44c4, 0x415b, 0x1e44, 0xbfbe, 0x4648, 0x4263, 0x41bc, 0x186f, 0xba0f, 0x1cda, 0x1a0c, 0xb0b6, 0x1c21, 0x143a, 0x4284, 0xbae2, 0x4083, 0x1fbb, 0x436d, 0x4286, 0x0262, 0x1fcd, 0x4368, 0x40b5, 0x4339, 0x360f, 0x420a, 0x40e0, 0xb29e, 0xbf61, 0x0a3d, 0x40d3, 0x433b, 0xb20b, 0x4588, 0x401e, 0xb2cf, 0x0ab7, 0x46ab, 0xbfcd, 0x42b0, 0x4199, 0x1deb, 0x16b0, 0x43bb, 0xa042, 0x0943, 0x42d8, 0x4298, 0x412d, 0xbf3c, 0xb01b, 0x43b0, 0xbafe, 0xb02c, 0x4086, 0xbfd1, 0x3145, 0x40aa, 0x1e27, 0xbaff, 0x2464, 0xbf60, 0x435d, 0x43cf, 0x41d7, 0x4408, 0xba3f, 0x40bb, 0x1900, 0x2295, 0xb2d8, 0x2325, 0x46d1, 0xb0f8, 0x438a, 0x43ea, 0x460f, 0x4205, 0x41a7, 0x0b21, 0x1c41, 0xbaeb, 0x3f2f, 0x4340, 0xbf08, 0x1d1a, 0x2ee5, 0xb0b8, 0x432e, 0xbf0f, 0x1edc, 0x4365, 0x1bda, 0xba31, 0x186c, 0xbf95, 0x4027, 0x4268, 0x4136, 0x41a1, 0x407d, 0x1d56, 0x420d, 0xbf11, 0x4246, 0x1bd6, 0x41eb, 0x41b7, 0xb073, 0x40bb, 0x1804, 0x4146, 0xb234, 0x1ca5, 0x40e5, 0xba68, 0xaa9b, 0x2f01, 0x4102, 0x40d0, 0x1c95, 0xb2be, 0x402f, 0xb264, 0xb29b, 0x46fb, 0xb288, 0x418b, 0xbf38, 0xa198, 0x0caa, 0x14ba, 0xadde, 0x033f, 0x40ae, 0x1b2b, 0xb0a9, 0x067e, 0x1fc9, 0x35ab, 0xbad2, 0xac87, 0x1001, 0xb2d3, 0x01a8, 0x407f, 0xbac0, 0xbf23, 0xb2d0, 0x45a6, 0x430b, 0x44e0, 0x4223, 0x42dd, 0xb2bf, 0xb209, 0x462b, 0xb2d5, 0x18a0, 0x4280, 0x1d75, 0x4261, 0xb2fc, 0xb2f7, 0x37a6, 0xba4c, 0x42ee, 0xbaf7, 0x2e93, 0xbf17, 0x4295, 0x43fc, 0xb06f, 0xb20b, 0x4065, 0x4068, 0xbfde, 0x40b8, 0x17c8, 0x43bd, 0x40c4, 0x4159, 0x118d, 0x412a, 0xaebf, 0xbf04, 0x2ba2, 0xb2d5, 0x0b54, 0x0295, 0x438a, 0xbaf1, 0x32b1, 0x2c88, 0x414a, 0x19c9, 0x4026, 0x434d, 0x2396, 0x1d91, 0xb24d, 0xad96, 0x418b, 0x37e2, 0x436c, 0x42ee, 0xbf8b, 0x4166, 0x433a, 0x40b5, 0xbae9, 0x41dd, 0x4303, 0x431a, 0x41f6, 0xbaef, 0x411a, 0xb2ab, 0x113c, 0x1a84, 0xb03e, 0x063d, 0xbf1e, 0xb22a, 0x3926, 0x40e6, 0xba22, 0x2aca, 0x2561, 0xba47, 0xba3b, 0x0a0a, 0xb05d, 0xb2fc, 0xbf95, 0x467e, 0x17a2, 0xba2d, 0xb031, 0x4227, 0x1c1d, 0x427c, 0x3211, 0xb086, 0x43af, 0x4041, 0xad6c, 0x1877, 0x202b, 0x405a, 0x446b, 0x34ef, 0x4084, 0xb252, 0x1ef7, 0x41c8, 0xbf6f, 0xb06f, 0x02fc, 0x409f, 0xba72, 0xb030, 0x4221, 0x4139, 0xbf87, 0x42d1, 0x19be, 0x42de, 0x46eb, 0xba3c, 0x4078, 0xbfb7, 0xba51, 0x43e8, 0x4194, 0x42c7, 0xbf04, 0x4085, 0x42de, 0x40aa, 0x303e, 0x4234, 0x1a9f, 0x1abc, 0x42bc, 0x3b66, 0x361d, 0x01fd, 0x41d2, 0x427e, 0x4332, 0xb21f, 0xb01b, 0xb2de, 0xba46, 0x40bb, 0x1f62, 0x419c, 0x43b1, 0xb2bf, 0xbf7a, 0x1f92, 0xa922, 0x018a, 0xbadf, 0xb229, 0xb02f, 0x195a, 0xbae1, 0x400f, 0x182c, 0xb252, 0x412a, 0x40d9, 0xbf7c, 0xbad9, 0x06da, 0x43e5, 0xb0ab, 0x431f, 0xba39, 0xb016, 0x1ac4, 0x406a, 0x414e, 0x42b8, 0x4237, 0xb28a, 0x44eb, 0x1aa1, 0x34f8, 0xba2a, 0x4568, 0xb210, 0x42b8, 0x1836, 0x434f, 0x4253, 0x21fd, 0x43ec, 0x4181, 0x4239, 0xbf79, 0x43eb, 0x4061, 0xb2c0, 0x29fd, 0x1ac6, 0x3e8c, 0xacfe, 0x43a7, 0xb257, 0xba3d, 0xb06b, 0x40ce, 0xbf61, 0x4205, 0x430d, 0x43ad, 0x02a9, 0x07c4, 0x41c3, 0x1c78, 0x4018, 0x4286, 0xbfd4, 0xbac1, 0x41e3, 0xba27, 0x1e65, 0xb20f, 0x4001, 0xbf68, 0x4642, 0x43af, 0x0ff7, 0x43c4, 0x0a6f, 0xbf19, 0x405d, 0x401c, 0xa368, 0x1c07, 0x06eb, 0x42d9, 0x1863, 0xb0ae, 0x42a9, 0x41ac, 0xb0b6, 0xbfa0, 0xbf90, 0xb2db, 0x4075, 0x4284, 0x431f, 0x1f38, 0xbf2d, 0x4385, 0xb00f, 0x40af, 0x1b7a, 0xaaa3, 0xa6de, 0xba15, 0x4159, 0x41a1, 0x3aee, 0x4072, 0xb0bb, 0x40fb, 0x442b, 0x3328, 0x1e7d, 0x1d86, 0xb232, 0x1b14, 0xb00d, 0x41b9, 0x40fe, 0x1a56, 0x1c3d, 0x2f3c, 0x09ad, 0x4111, 0xbf71, 0x4630, 0x030d, 0x4117, 0x4034, 0x3845, 0x0b31, 0xbae2, 0x462f, 0x0e01, 0xb225, 0x2df4, 0x4651, 0xbfa0, 0x4381, 0x1bcc, 0x432d, 0x4265, 0x42ad, 0x4379, 0x410a, 0xbf04, 0xb28c, 0x42a8, 0x414c, 0x4065, 0x1586, 0x43aa, 0x336d, 0x4211, 0x1bee, 0x42a7, 0x4026, 0x263a, 0x1fa1, 0x4354, 0xbfa9, 0x1d2b, 0x4337, 0x432e, 0xb2d6, 0x18a9, 0xb0a0, 0xba29, 0x4131, 0x4348, 0x403f, 0x0ab3, 0x4214, 0x4175, 0x4259, 0x43d7, 0x33cf, 0xba42, 0x11bb, 0xbf3a, 0xba77, 0x4098, 0x4232, 0xb2a7, 0x4375, 0x0786, 0x1f14, 0xa4fd, 0x01a8, 0xa0ad, 0x411e, 0x2763, 0xba0a, 0xb05f, 0xbac6, 0x4123, 0xbf46, 0x41b5, 0xb20d, 0xac2e, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x4ccb59f7, 0x5e2a5ea7, 0x0598ceb9, 0xfde9560f, 0xaeee5f97, 0x81c7018e, 0x8dfd005d, 0xf0809e08, 0xf2345361, 0x7be970a4, 0xd526e1ae, 0xd985c732, 0x2702a40c, 0xf395aaaa, 0x00000000, 0x300001f0 }, - FinalRegs = new uint[] { 0x00001a78, 0x00000000, 0x00000000, 0xffffffff, 0x00001bb4, 0x00000000, 0x0000781a, 0x00000063, 0xc8d14d87, 0xd526e1ae, 0xd526e1ae, 0xf296cb30, 0xe468a6c5, 0xf296b6a4, 0x00000000, 0xa00001d0 }, + Instructions = [0xbac1, 0x4158, 0x40ea, 0x242c, 0x4288, 0xb29e, 0x418a, 0xbf23, 0xb2fa, 0x4148, 0x3f4d, 0xba28, 0x43a5, 0xb0fb, 0x1ba0, 0x4000, 0x2c42, 0xbac7, 0x40bf, 0xa072, 0x43fc, 0x1202, 0x40a6, 0xba20, 0xbf96, 0xb0ff, 0x0d2b, 0xb221, 0xb274, 0xb237, 0x4048, 0x43ef, 0x45a1, 0x1d08, 0x1c73, 0xbf35, 0x44c0, 0xbacb, 0xb0bf, 0xa4a5, 0x06ac, 0xa673, 0x4076, 0x42de, 0x411c, 0x4316, 0xba5a, 0xb222, 0xbf60, 0x1f22, 0x4047, 0x4599, 0x43eb, 0x3d4e, 0x4684, 0x4159, 0x42d6, 0x4397, 0x4019, 0x37f0, 0x0c64, 0xba56, 0x404f, 0x419b, 0xbfab, 0x0a60, 0x1678, 0xb2e1, 0x4087, 0x4113, 0x1c75, 0x43e2, 0x4580, 0xb2f4, 0x1a65, 0x41bf, 0xa5c4, 0xbf00, 0x023e, 0xba5b, 0x40ec, 0x423f, 0x4265, 0x4159, 0xba17, 0x43d5, 0xbfa0, 0x419d, 0x0690, 0x4613, 0x4026, 0x4237, 0x419a, 0xbfbd, 0xaf55, 0xb248, 0x1543, 0x43c3, 0x1eac, 0x4208, 0xb224, 0xbacd, 0x4290, 0x40dd, 0xb2bb, 0x4551, 0x40a6, 0x4595, 0x4118, 0x1940, 0xbf41, 0x3427, 0x18e1, 0x405d, 0x4086, 0x42c3, 0xaaaf, 0x39b0, 0x40a6, 0x2091, 0xbf1f, 0xb29c, 0x0054, 0x3139, 0x40a2, 0x3fcc, 0x2890, 0x4073, 0x4378, 0x1fe5, 0x00f7, 0x1a7b, 0xbad5, 0x401d, 0x4229, 0x424e, 0x1e92, 0xa256, 0x40ed, 0xa108, 0xbfa8, 0x41b1, 0x40ad, 0x1f7c, 0xb2ce, 0xb27e, 0xbf7b, 0x4066, 0x305d, 0xba36, 0xbafb, 0x2265, 0xba43, 0xb213, 0x43fe, 0x40ba, 0xa9a2, 0xbfc5, 0x1c2e, 0x4254, 0xa6ce, 0x40c7, 0xb0d1, 0x416d, 0x425f, 0xa0b5, 0x4365, 0x1da1, 0xb204, 0x3eca, 0x430c, 0x4646, 0x43f9, 0x42c3, 0xbf68, 0x4058, 0x416d, 0x1e07, 0x1e89, 0x40ec, 0x4041, 0x40b4, 0xb01d, 0xb234, 0x4023, 0xb019, 0x4679, 0xb0ff, 0x4624, 0xad8f, 0x188f, 0x412e, 0xaf18, 0x1adc, 0xbf11, 0x1f44, 0x436d, 0x436b, 0xa7ad, 0x0ba2, 0xb28b, 0x4273, 0xb22d, 0x4097, 0x4105, 0x426c, 0xb25a, 0xbf90, 0x428c, 0x138c, 0x44e1, 0x418a, 0x1aff, 0x219f, 0xb269, 0xbf15, 0x0b01, 0x4201, 0x4008, 0xbafe, 0x3265, 0xb0b0, 0x4359, 0x45ba, 0x425f, 0xb214, 0x42e9, 0x4456, 0x404d, 0xbfd7, 0x40a2, 0xb0f8, 0x4032, 0x18b3, 0x3009, 0xb2ab, 0x41b7, 0x44c9, 0x4419, 0xb096, 0x429f, 0x433d, 0x38f2, 0xbfe0, 0x4083, 0x414b, 0x4055, 0xba74, 0xbf75, 0x4072, 0x41fb, 0xb04a, 0x43e3, 0x43f7, 0xad8d, 0xb251, 0xba67, 0x4300, 0x4259, 0x4206, 0xb0a2, 0xb242, 0x4699, 0x1c9e, 0xbf73, 0x434f, 0x0744, 0xa414, 0x4099, 0x4661, 0xba62, 0x2e9f, 0x431a, 0x05c6, 0x465d, 0xb2ee, 0xbae1, 0x093a, 0xbf90, 0x4399, 0xb21d, 0x40dd, 0xb2b5, 0x0057, 0xbf60, 0x1f1c, 0xbf18, 0xb28b, 0x41f3, 0xbadb, 0xbf9c, 0xb261, 0x129d, 0x42fb, 0x42b7, 0x4306, 0xb06f, 0xb2d6, 0x41b6, 0xa264, 0x4001, 0x2ef9, 0x2dc8, 0x40c6, 0x40f3, 0x456f, 0x414e, 0x26ae, 0x2625, 0x41bf, 0x40b0, 0x1a12, 0x31a8, 0xb000, 0x1a30, 0xbf31, 0x1198, 0x44fd, 0x043c, 0x4301, 0x1a9d, 0x10cc, 0xbfac, 0x401e, 0x135e, 0xb2df, 0x4356, 0xae2b, 0x40e0, 0x43f7, 0x322f, 0xba6b, 0xbfde, 0x1e91, 0x21a5, 0x413f, 0x4081, 0x134a, 0x43d9, 0x417b, 0xb089, 0xadcd, 0xb220, 0x43ab, 0x1aed, 0xa819, 0x1ee7, 0xb0de, 0xb2dd, 0x2249, 0x4122, 0x29d1, 0xa87d, 0xb0b2, 0x128c, 0x33a1, 0x0d9c, 0xbf16, 0x15ea, 0x4607, 0xbf70, 0x2f6c, 0x1900, 0x4060, 0x1abd, 0xb2f2, 0xba65, 0x4166, 0x3593, 0xbfcf, 0x1a90, 0x4308, 0x4447, 0xba58, 0x1bf2, 0x419c, 0x181c, 0x2f88, 0x4141, 0x418a, 0x4067, 0x12a7, 0xb0c5, 0x4197, 0x0a82, 0x0774, 0x34e5, 0x4456, 0x4109, 0x4209, 0x445d, 0x4029, 0x0d4e, 0x424b, 0x42ee, 0x41a0, 0x4673, 0xbf70, 0xbf3c, 0x18f1, 0x3e63, 0xa7f4, 0x097a, 0x4586, 0x4163, 0x40f1, 0xba57, 0x284b, 0x420e, 0x41cd, 0x4092, 0xba0d, 0x4230, 0x43ce, 0x445c, 0x44cd, 0xb23f, 0x40a6, 0x41ce, 0x1d86, 0xb235, 0xb251, 0xb289, 0x43ba, 0xbfc5, 0x408f, 0xba1b, 0xb0fe, 0x41c0, 0x4107, 0x36ad, 0x3817, 0x2df3, 0xab39, 0x223f, 0x4253, 0xbf67, 0x4148, 0x40d9, 0x42f0, 0xb0e5, 0x4314, 0x404d, 0xb2c4, 0x2d43, 0x41eb, 0x2b28, 0x4630, 0x21d0, 0x1f98, 0xb28a, 0x43c0, 0xbf80, 0x1d10, 0xacb5, 0x45db, 0xbf59, 0x1132, 0x1ef9, 0x429c, 0x1cce, 0x41af, 0xa433, 0x15e1, 0x42b5, 0x419c, 0x1b1f, 0xb2e5, 0x4012, 0xb28c, 0x1d9b, 0xa11e, 0x1a24, 0x423a, 0x40e8, 0xb257, 0x41f4, 0x4452, 0x24ad, 0xbf9a, 0x1809, 0xb2dd, 0xb2be, 0x4104, 0x19b0, 0x43c4, 0xb037, 0x43ea, 0xae35, 0x04ab, 0xb2f8, 0x2c34, 0x2827, 0x40bd, 0x466b, 0xbf59, 0xb029, 0xb219, 0x42fd, 0x434f, 0x1cfa, 0xa456, 0x44c4, 0x415b, 0x1e44, 0xbfbe, 0x4648, 0x4263, 0x41bc, 0x186f, 0xba0f, 0x1cda, 0x1a0c, 0xb0b6, 0x1c21, 0x143a, 0x4284, 0xbae2, 0x4083, 0x1fbb, 0x436d, 0x4286, 0x0262, 0x1fcd, 0x4368, 0x40b5, 0x4339, 0x360f, 0x420a, 0x40e0, 0xb29e, 0xbf61, 0x0a3d, 0x40d3, 0x433b, 0xb20b, 0x4588, 0x401e, 0xb2cf, 0x0ab7, 0x46ab, 0xbfcd, 0x42b0, 0x4199, 0x1deb, 0x16b0, 0x43bb, 0xa042, 0x0943, 0x42d8, 0x4298, 0x412d, 0xbf3c, 0xb01b, 0x43b0, 0xbafe, 0xb02c, 0x4086, 0xbfd1, 0x3145, 0x40aa, 0x1e27, 0xbaff, 0x2464, 0xbf60, 0x435d, 0x43cf, 0x41d7, 0x4408, 0xba3f, 0x40bb, 0x1900, 0x2295, 0xb2d8, 0x2325, 0x46d1, 0xb0f8, 0x438a, 0x43ea, 0x460f, 0x4205, 0x41a7, 0x0b21, 0x1c41, 0xbaeb, 0x3f2f, 0x4340, 0xbf08, 0x1d1a, 0x2ee5, 0xb0b8, 0x432e, 0xbf0f, 0x1edc, 0x4365, 0x1bda, 0xba31, 0x186c, 0xbf95, 0x4027, 0x4268, 0x4136, 0x41a1, 0x407d, 0x1d56, 0x420d, 0xbf11, 0x4246, 0x1bd6, 0x41eb, 0x41b7, 0xb073, 0x40bb, 0x1804, 0x4146, 0xb234, 0x1ca5, 0x40e5, 0xba68, 0xaa9b, 0x2f01, 0x4102, 0x40d0, 0x1c95, 0xb2be, 0x402f, 0xb264, 0xb29b, 0x46fb, 0xb288, 0x418b, 0xbf38, 0xa198, 0x0caa, 0x14ba, 0xadde, 0x033f, 0x40ae, 0x1b2b, 0xb0a9, 0x067e, 0x1fc9, 0x35ab, 0xbad2, 0xac87, 0x1001, 0xb2d3, 0x01a8, 0x407f, 0xbac0, 0xbf23, 0xb2d0, 0x45a6, 0x430b, 0x44e0, 0x4223, 0x42dd, 0xb2bf, 0xb209, 0x462b, 0xb2d5, 0x18a0, 0x4280, 0x1d75, 0x4261, 0xb2fc, 0xb2f7, 0x37a6, 0xba4c, 0x42ee, 0xbaf7, 0x2e93, 0xbf17, 0x4295, 0x43fc, 0xb06f, 0xb20b, 0x4065, 0x4068, 0xbfde, 0x40b8, 0x17c8, 0x43bd, 0x40c4, 0x4159, 0x118d, 0x412a, 0xaebf, 0xbf04, 0x2ba2, 0xb2d5, 0x0b54, 0x0295, 0x438a, 0xbaf1, 0x32b1, 0x2c88, 0x414a, 0x19c9, 0x4026, 0x434d, 0x2396, 0x1d91, 0xb24d, 0xad96, 0x418b, 0x37e2, 0x436c, 0x42ee, 0xbf8b, 0x4166, 0x433a, 0x40b5, 0xbae9, 0x41dd, 0x4303, 0x431a, 0x41f6, 0xbaef, 0x411a, 0xb2ab, 0x113c, 0x1a84, 0xb03e, 0x063d, 0xbf1e, 0xb22a, 0x3926, 0x40e6, 0xba22, 0x2aca, 0x2561, 0xba47, 0xba3b, 0x0a0a, 0xb05d, 0xb2fc, 0xbf95, 0x467e, 0x17a2, 0xba2d, 0xb031, 0x4227, 0x1c1d, 0x427c, 0x3211, 0xb086, 0x43af, 0x4041, 0xad6c, 0x1877, 0x202b, 0x405a, 0x446b, 0x34ef, 0x4084, 0xb252, 0x1ef7, 0x41c8, 0xbf6f, 0xb06f, 0x02fc, 0x409f, 0xba72, 0xb030, 0x4221, 0x4139, 0xbf87, 0x42d1, 0x19be, 0x42de, 0x46eb, 0xba3c, 0x4078, 0xbfb7, 0xba51, 0x43e8, 0x4194, 0x42c7, 0xbf04, 0x4085, 0x42de, 0x40aa, 0x303e, 0x4234, 0x1a9f, 0x1abc, 0x42bc, 0x3b66, 0x361d, 0x01fd, 0x41d2, 0x427e, 0x4332, 0xb21f, 0xb01b, 0xb2de, 0xba46, 0x40bb, 0x1f62, 0x419c, 0x43b1, 0xb2bf, 0xbf7a, 0x1f92, 0xa922, 0x018a, 0xbadf, 0xb229, 0xb02f, 0x195a, 0xbae1, 0x400f, 0x182c, 0xb252, 0x412a, 0x40d9, 0xbf7c, 0xbad9, 0x06da, 0x43e5, 0xb0ab, 0x431f, 0xba39, 0xb016, 0x1ac4, 0x406a, 0x414e, 0x42b8, 0x4237, 0xb28a, 0x44eb, 0x1aa1, 0x34f8, 0xba2a, 0x4568, 0xb210, 0x42b8, 0x1836, 0x434f, 0x4253, 0x21fd, 0x43ec, 0x4181, 0x4239, 0xbf79, 0x43eb, 0x4061, 0xb2c0, 0x29fd, 0x1ac6, 0x3e8c, 0xacfe, 0x43a7, 0xb257, 0xba3d, 0xb06b, 0x40ce, 0xbf61, 0x4205, 0x430d, 0x43ad, 0x02a9, 0x07c4, 0x41c3, 0x1c78, 0x4018, 0x4286, 0xbfd4, 0xbac1, 0x41e3, 0xba27, 0x1e65, 0xb20f, 0x4001, 0xbf68, 0x4642, 0x43af, 0x0ff7, 0x43c4, 0x0a6f, 0xbf19, 0x405d, 0x401c, 0xa368, 0x1c07, 0x06eb, 0x42d9, 0x1863, 0xb0ae, 0x42a9, 0x41ac, 0xb0b6, 0xbfa0, 0xbf90, 0xb2db, 0x4075, 0x4284, 0x431f, 0x1f38, 0xbf2d, 0x4385, 0xb00f, 0x40af, 0x1b7a, 0xaaa3, 0xa6de, 0xba15, 0x4159, 0x41a1, 0x3aee, 0x4072, 0xb0bb, 0x40fb, 0x442b, 0x3328, 0x1e7d, 0x1d86, 0xb232, 0x1b14, 0xb00d, 0x41b9, 0x40fe, 0x1a56, 0x1c3d, 0x2f3c, 0x09ad, 0x4111, 0xbf71, 0x4630, 0x030d, 0x4117, 0x4034, 0x3845, 0x0b31, 0xbae2, 0x462f, 0x0e01, 0xb225, 0x2df4, 0x4651, 0xbfa0, 0x4381, 0x1bcc, 0x432d, 0x4265, 0x42ad, 0x4379, 0x410a, 0xbf04, 0xb28c, 0x42a8, 0x414c, 0x4065, 0x1586, 0x43aa, 0x336d, 0x4211, 0x1bee, 0x42a7, 0x4026, 0x263a, 0x1fa1, 0x4354, 0xbfa9, 0x1d2b, 0x4337, 0x432e, 0xb2d6, 0x18a9, 0xb0a0, 0xba29, 0x4131, 0x4348, 0x403f, 0x0ab3, 0x4214, 0x4175, 0x4259, 0x43d7, 0x33cf, 0xba42, 0x11bb, 0xbf3a, 0xba77, 0x4098, 0x4232, 0xb2a7, 0x4375, 0x0786, 0x1f14, 0xa4fd, 0x01a8, 0xa0ad, 0x411e, 0x2763, 0xba0a, 0xb05f, 0xbac6, 0x4123, 0xbf46, 0x41b5, 0xb20d, 0xac2e, 0x4770, 0xe7fe + ], + StartRegs = [0x4ccb59f7, 0x5e2a5ea7, 0x0598ceb9, 0xfde9560f, 0xaeee5f97, 0x81c7018e, 0x8dfd005d, 0xf0809e08, 0xf2345361, 0x7be970a4, 0xd526e1ae, 0xd985c732, 0x2702a40c, 0xf395aaaa, 0x00000000, 0x300001f0 + ], + FinalRegs = [0x00001a78, 0x00000000, 0x00000000, 0xffffffff, 0x00001bb4, 0x00000000, 0x0000781a, 0x00000063, 0xc8d14d87, 0xd526e1ae, 0xd526e1ae, 0xf296cb30, 0xe468a6c5, 0xf296b6a4, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x30ba, 0x3e17, 0xb2b6, 0x0e7a, 0x1ad3, 0x16d7, 0x3d09, 0xb2d4, 0x4149, 0x4388, 0xbf70, 0x403e, 0x4081, 0x2f93, 0xb263, 0x421d, 0x4136, 0x1fbc, 0xbadd, 0x42e0, 0x41df, 0x42f2, 0xb2ac, 0x4188, 0x1f29, 0xbf0c, 0x46e4, 0x0f06, 0x4220, 0xb090, 0xb2be, 0xa4e6, 0x4047, 0xbfe0, 0x465b, 0x3199, 0x4216, 0x1b5d, 0x0645, 0xb04b, 0x1ae2, 0xaec8, 0x1942, 0x4225, 0x4214, 0x3aa9, 0xba12, 0x41b2, 0x30a1, 0xb27b, 0xba72, 0xba69, 0x15c8, 0xbfdd, 0xb204, 0x427c, 0x42e0, 0xb260, 0x4169, 0xa447, 0xb204, 0x424e, 0x465d, 0x3fce, 0xabb3, 0x43f3, 0xba44, 0x418d, 0x42b9, 0xb045, 0x20a4, 0xb285, 0xb2c1, 0x424d, 0x0575, 0xb081, 0x0475, 0xb273, 0x43db, 0x4297, 0xbf16, 0x41d7, 0x1b1c, 0x1a44, 0x4220, 0x29a3, 0x4069, 0x4143, 0x464e, 0xb2e9, 0x4120, 0xb28b, 0xacb2, 0xac86, 0x2c6e, 0x43c5, 0x42d4, 0x42e7, 0xbf15, 0x1c4d, 0x41a9, 0x4300, 0x401c, 0x32f0, 0x431e, 0x4117, 0x43f3, 0xb041, 0x02d0, 0x443d, 0xbfc9, 0xb292, 0x436c, 0xb236, 0xb022, 0xb023, 0x430b, 0xbfc0, 0x4318, 0x456a, 0x2809, 0x4006, 0x432a, 0xba3e, 0x4396, 0x406b, 0xbf16, 0xba55, 0x4163, 0x4279, 0x035d, 0x4380, 0x4078, 0x1ccc, 0xba46, 0x4064, 0xb21a, 0x0727, 0x1a5e, 0xba7f, 0xa4ed, 0xbac7, 0x0244, 0xb26b, 0x23f1, 0x3321, 0xa490, 0x4284, 0xba64, 0xa24a, 0x4057, 0xbaff, 0x1877, 0x417c, 0x0d9c, 0xbf9c, 0x1c58, 0x42c3, 0x1c7f, 0xba5f, 0x0daa, 0x42d8, 0x41be, 0x40d2, 0x4298, 0x4118, 0x4085, 0x4353, 0xbf06, 0x402f, 0xb0fc, 0x45ab, 0x41da, 0x11d6, 0xbf04, 0xb025, 0x40a2, 0xb26c, 0x40ae, 0x40c5, 0x08ba, 0xb227, 0x4356, 0x423b, 0xb20c, 0x230b, 0x40e1, 0xb0fa, 0x4013, 0x14bd, 0x43de, 0x3daf, 0x0368, 0x407f, 0xb298, 0x41f8, 0x43de, 0x4048, 0x18a4, 0x08f7, 0x42b9, 0x41a8, 0xbf33, 0x404f, 0x4174, 0x4261, 0x43f1, 0x1609, 0x4281, 0x00ee, 0x4291, 0x43b1, 0x359a, 0xb0d0, 0xb09f, 0x40fe, 0xb2b5, 0x4466, 0xb050, 0xb25c, 0xba0b, 0xb03a, 0x04a6, 0xb247, 0x4390, 0xb291, 0x4198, 0xb02a, 0x421f, 0x40b3, 0xbf7d, 0x41f6, 0x23ee, 0x329a, 0x43d2, 0x421c, 0x4199, 0xb253, 0xb0c6, 0x3180, 0xb0b7, 0x43a0, 0xbfbf, 0x43e6, 0x1e76, 0x157f, 0x3290, 0x1952, 0x428a, 0x1b3f, 0x05ce, 0x0e2e, 0xb0bf, 0xb264, 0x41a3, 0x0a74, 0x4181, 0x4112, 0x3e9f, 0x42c4, 0x4214, 0x46b9, 0x1a96, 0xbf0f, 0xa787, 0x42fb, 0xb008, 0x40a0, 0x2262, 0xb261, 0x26a5, 0xa01b, 0x01fa, 0x40a4, 0xba0f, 0xa676, 0xb26b, 0xb262, 0xba1f, 0x4075, 0xbfc2, 0x415d, 0xb095, 0x1ead, 0x410a, 0x4328, 0x0c46, 0xb2e9, 0x430f, 0xb274, 0x415d, 0x420f, 0x197b, 0x46fb, 0x125d, 0x43ca, 0xa547, 0x4064, 0x425e, 0xbf2f, 0xb036, 0xb292, 0x40e9, 0x3d9e, 0xb227, 0xa088, 0xb0e0, 0xb21c, 0xafc4, 0xbace, 0x40a2, 0x100d, 0x405d, 0x135d, 0x4045, 0x054f, 0x430c, 0x415c, 0x3b73, 0x1c6b, 0x0905, 0x4213, 0x4471, 0xa947, 0xb269, 0xbf77, 0xba2b, 0x42c8, 0x119f, 0x1d18, 0x4031, 0x4657, 0x4240, 0x4147, 0x4191, 0x44ad, 0x410b, 0xbad7, 0x40d8, 0xa692, 0x1bd6, 0x4137, 0xb05c, 0x4204, 0xbf72, 0x22bb, 0xa447, 0x1ec3, 0xb07f, 0xbfd0, 0x438d, 0x4220, 0xbf4a, 0x40eb, 0x42f2, 0x2d2f, 0x40e1, 0xa238, 0x41fa, 0xb24e, 0xb2e5, 0xbfa0, 0x441c, 0xb056, 0x4365, 0x1cca, 0x1a9a, 0x4346, 0x2fbc, 0x4222, 0xb2c2, 0xbfda, 0x416c, 0xbfe0, 0xba4f, 0x40e8, 0x4386, 0xbfc0, 0x06e0, 0x4370, 0x419e, 0x3b0e, 0xae3e, 0x413b, 0xb0b1, 0xb02f, 0x1f7c, 0x377d, 0xbac4, 0x45d2, 0xb25d, 0x0d8c, 0x46c4, 0x4304, 0xa6dd, 0x1a5d, 0x4050, 0x410c, 0x4269, 0xb284, 0xbf2d, 0x414f, 0x044d, 0xba0a, 0x19a1, 0x4107, 0x4273, 0xbafa, 0xb222, 0x42ba, 0x45c0, 0x408b, 0x4081, 0x4102, 0x070a, 0xb2eb, 0xb056, 0x385b, 0x1b53, 0x046b, 0xba7b, 0x41a3, 0xbaf9, 0x4553, 0x313a, 0xb028, 0xbf42, 0x418c, 0x05c5, 0x4161, 0xa924, 0x4026, 0xba41, 0x40a4, 0x4285, 0x3ff7, 0x1c6a, 0xb207, 0x42ae, 0x4371, 0x116e, 0xbf35, 0x1d23, 0x429f, 0x1a06, 0x44fb, 0xb2ac, 0x40d4, 0x46e5, 0x403e, 0x4387, 0xb099, 0x4109, 0x40d0, 0x2f0a, 0x38cd, 0x02a6, 0xbf38, 0x46ac, 0x30d9, 0x087d, 0xb27b, 0x41ff, 0x1537, 0x4101, 0xba15, 0xb294, 0x41d6, 0x2af8, 0xba0e, 0x41d9, 0x3f8b, 0xba63, 0xb238, 0x4003, 0x1c25, 0x41c7, 0x43a7, 0x0ad6, 0xbf2b, 0x1ee5, 0xb2c4, 0xa57f, 0xb06e, 0x1e2e, 0x4039, 0x409b, 0x4102, 0x416d, 0xa855, 0xb235, 0x3847, 0xa008, 0x4411, 0xb26a, 0xa9fe, 0xbfd7, 0x41d7, 0xbf70, 0xbae6, 0xba06, 0x35df, 0xb219, 0x2f49, 0xb0cd, 0x35d3, 0xb0ca, 0x4383, 0xb233, 0x4381, 0x3a8f, 0x460c, 0x1df7, 0x0edb, 0x43d4, 0x1a05, 0x1318, 0xbac2, 0xb2b9, 0xb2d1, 0x4230, 0xbf3e, 0x422d, 0xb213, 0xb061, 0xa09a, 0x4057, 0x4077, 0x426c, 0x0376, 0x42a5, 0x19c9, 0xbf1d, 0x422d, 0xb2f2, 0xb04b, 0x41a5, 0x410e, 0xb2ac, 0x0819, 0x415b, 0x3316, 0x4314, 0x1fd3, 0xb075, 0xbfb3, 0xb08b, 0xa994, 0xbf80, 0xbae1, 0x40b4, 0xbfb8, 0x409d, 0x01ee, 0x43ec, 0x09d0, 0x2384, 0x4183, 0x416b, 0x411d, 0xbf78, 0xba54, 0xba72, 0x4397, 0x1eb9, 0x1efa, 0xb2ec, 0x183e, 0x18e1, 0x0a6c, 0x42c6, 0x232a, 0xba57, 0xbff0, 0x41f5, 0x42c9, 0x3b22, 0x421f, 0xb294, 0xb277, 0xa937, 0xbf8e, 0x462f, 0x20b5, 0x2e40, 0x4306, 0x43f1, 0x036f, 0xa324, 0xbf23, 0x3670, 0xba5c, 0x4050, 0x0906, 0x4389, 0x4684, 0x40b0, 0x3eb0, 0x1f2e, 0x1aba, 0x1963, 0x4145, 0x122d, 0xb2c1, 0x4555, 0x403d, 0xb28b, 0x4252, 0x1a41, 0x4077, 0x434f, 0x4459, 0x4360, 0xbf22, 0x1b7f, 0xb24e, 0x1433, 0x40b1, 0x41a3, 0xb2cd, 0xb021, 0x4251, 0x42e3, 0xb0b5, 0xb2d0, 0xbf55, 0xa034, 0x41e3, 0x05fb, 0x4067, 0x41c2, 0x4059, 0x40ea, 0x3288, 0x4328, 0x4268, 0xbf2d, 0xb05b, 0xb234, 0x4220, 0xba68, 0xbfc0, 0x42e8, 0x406d, 0x4371, 0x12db, 0x4157, 0x448c, 0x162f, 0x3d79, 0x4190, 0x4050, 0x0c23, 0x2cef, 0x415b, 0xbaf1, 0x4005, 0xbf57, 0x404d, 0x214b, 0xa974, 0x404c, 0x40cb, 0x03ca, 0x1675, 0x36c7, 0xbfda, 0xaecc, 0x4576, 0x2c9c, 0xa7ec, 0x423e, 0x1d8c, 0x4172, 0x437a, 0x0b36, 0xa6b8, 0x4160, 0x4648, 0x45c4, 0x1d48, 0x1cfb, 0xa650, 0x4265, 0xb2b3, 0x414c, 0x443a, 0x4378, 0xba29, 0x464e, 0x1d73, 0xbfa7, 0x121c, 0x2eb2, 0xba30, 0xb0e6, 0x40d8, 0x4108, 0xbf70, 0xbad4, 0xb27e, 0xbaca, 0x4694, 0x320f, 0x1605, 0xba48, 0xafdb, 0x41e1, 0x4095, 0x3649, 0x00ef, 0xbf25, 0x4233, 0x4226, 0x4390, 0x46b8, 0x4231, 0x43d0, 0x45d2, 0x42d7, 0x3871, 0x1a1d, 0x1d3e, 0xbad1, 0x418b, 0xb072, 0x1843, 0xb215, 0x1ae0, 0x0898, 0x4106, 0x41a2, 0xba0a, 0xbf43, 0x41c9, 0x4022, 0xa59a, 0xb035, 0x4549, 0xbfa7, 0x441f, 0x4167, 0x3b3a, 0x1bd7, 0xbf75, 0x3d63, 0x1bba, 0xb2ae, 0x401b, 0x0e2e, 0x42cd, 0x1ccd, 0x4028, 0xba22, 0x4343, 0x3458, 0x2dd4, 0xa814, 0x1985, 0x469a, 0x43c1, 0x4562, 0x444c, 0x19b5, 0x42ab, 0xbf7a, 0xb2a1, 0x4394, 0x4008, 0x0f19, 0xbae8, 0xb266, 0x4141, 0xae9b, 0x4349, 0x45ad, 0x1af6, 0x40c0, 0x40a2, 0xba1a, 0x439b, 0x1fb8, 0x11da, 0xa672, 0xb2d0, 0x4223, 0x449d, 0x431d, 0x42e8, 0x45ec, 0x18d7, 0xbf5e, 0x41df, 0xba7f, 0x423b, 0xa7ae, 0x28f4, 0x414b, 0x43fa, 0xb216, 0x190b, 0xa562, 0x4391, 0xb252, 0x03f3, 0xbac0, 0x40fe, 0x2da8, 0x4449, 0x0adc, 0x4103, 0xb0dd, 0x403f, 0x34fa, 0xbf00, 0x45a6, 0x4357, 0xbf8a, 0xb2a2, 0x4109, 0xadc3, 0x407b, 0x40ac, 0xb227, 0x41fa, 0xaccd, 0x46a8, 0x40fa, 0x1f95, 0xb069, 0x444a, 0x4037, 0xb230, 0x419b, 0x1426, 0x424d, 0xb05f, 0x107b, 0x4055, 0x3be8, 0x0e2b, 0xb0f2, 0x1793, 0x46cb, 0x1fe7, 0xbfc6, 0x4300, 0x1e82, 0x43cc, 0x34b4, 0x173b, 0xb290, 0x36a7, 0x4348, 0x0f9f, 0xba7e, 0x0bef, 0xb22d, 0x42bf, 0x4541, 0xbf70, 0x4193, 0xbff0, 0xb0f2, 0x4420, 0xb01f, 0x41b7, 0x4251, 0x4301, 0xbf0e, 0xbad0, 0xbafe, 0x1f39, 0x2717, 0x4651, 0x1858, 0xb0e6, 0xbf88, 0x0dc3, 0x162d, 0x1947, 0xb24e, 0x24fa, 0xba59, 0x18a4, 0x42f6, 0x4018, 0x42a2, 0x407c, 0x42c6, 0x30d6, 0x4299, 0xb081, 0x4288, 0x41f8, 0x01b4, 0xb00a, 0xb26d, 0x436c, 0xbf0c, 0xb27d, 0xb2a6, 0x45ae, 0x04d9, 0xa8af, 0xb050, 0xbf61, 0x3332, 0x27cd, 0x0c39, 0xb28b, 0xb0e7, 0x2bfa, 0x4231, 0x43cc, 0x4387, 0x1d3e, 0x2fcc, 0x0863, 0x43eb, 0xba00, 0x41bd, 0x4139, 0xbf80, 0x1a3d, 0xba4b, 0x1a7f, 0x41d5, 0x4695, 0x41eb, 0x4003, 0x4457, 0x4312, 0x3a69, 0xb253, 0xbf68, 0x4143, 0xba2f, 0xbaf5, 0xb2e5, 0xbf00, 0x0f33, 0x418a, 0xb254, 0xbf3a, 0xba72, 0x404a, 0xb297, 0xbf46, 0x4645, 0x41e7, 0x4320, 0x1a06, 0x44e0, 0x3e22, 0x41d4, 0xbaf8, 0x4226, 0x41a5, 0x4291, 0xbae8, 0xbaf5, 0x4199, 0x45d1, 0xbf0e, 0x1f1d, 0x3bb4, 0xba40, 0x0793, 0x4645, 0x0312, 0xb262, 0x41b9, 0xb20f, 0x42e3, 0x4018, 0x4570, 0x10d0, 0x038a, 0x434f, 0xb2d2, 0x4430, 0xa2b1, 0x042c, 0x194b, 0x45db, 0x43b7, 0xbf5e, 0x1b6d, 0xb282, 0x40a5, 0x4076, 0x2065, 0x1c00, 0x462d, 0xaded, 0x3907, 0x1fe4, 0x429a, 0x40bd, 0xba32, 0x43b0, 0x1b1d, 0x43ef, 0x41c0, 0x427a, 0xba34, 0xba7b, 0x2307, 0x008d, 0x46c3, 0x4373, 0x40f3, 0xbfb9, 0x4169, 0x4135, 0x413f, 0x2474, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x7602de1d, 0x625d8c21, 0x6c16bc87, 0xecb33bf3, 0xf2e0d596, 0x9ed96ef4, 0xc82738a1, 0xf563157e, 0x31d024d5, 0x481b545e, 0xbb853a8f, 0x828b1a9a, 0x77119f7e, 0x41a530b7, 0x00000000, 0x300001f0 }, - FinalRegs = new uint[] { 0x28000003, 0xf00ebff8, 0xd843d7d2, 0x00000000, 0x00000074, 0xc03affe0, 0x00000000, 0x00000000, 0x000017cb, 0xffffffae, 0x001b0000, 0x000017cb, 0xffffffff, 0xfffffffe, 0x00000000, 0x600001d0 }, + Instructions = [0x30ba, 0x3e17, 0xb2b6, 0x0e7a, 0x1ad3, 0x16d7, 0x3d09, 0xb2d4, 0x4149, 0x4388, 0xbf70, 0x403e, 0x4081, 0x2f93, 0xb263, 0x421d, 0x4136, 0x1fbc, 0xbadd, 0x42e0, 0x41df, 0x42f2, 0xb2ac, 0x4188, 0x1f29, 0xbf0c, 0x46e4, 0x0f06, 0x4220, 0xb090, 0xb2be, 0xa4e6, 0x4047, 0xbfe0, 0x465b, 0x3199, 0x4216, 0x1b5d, 0x0645, 0xb04b, 0x1ae2, 0xaec8, 0x1942, 0x4225, 0x4214, 0x3aa9, 0xba12, 0x41b2, 0x30a1, 0xb27b, 0xba72, 0xba69, 0x15c8, 0xbfdd, 0xb204, 0x427c, 0x42e0, 0xb260, 0x4169, 0xa447, 0xb204, 0x424e, 0x465d, 0x3fce, 0xabb3, 0x43f3, 0xba44, 0x418d, 0x42b9, 0xb045, 0x20a4, 0xb285, 0xb2c1, 0x424d, 0x0575, 0xb081, 0x0475, 0xb273, 0x43db, 0x4297, 0xbf16, 0x41d7, 0x1b1c, 0x1a44, 0x4220, 0x29a3, 0x4069, 0x4143, 0x464e, 0xb2e9, 0x4120, 0xb28b, 0xacb2, 0xac86, 0x2c6e, 0x43c5, 0x42d4, 0x42e7, 0xbf15, 0x1c4d, 0x41a9, 0x4300, 0x401c, 0x32f0, 0x431e, 0x4117, 0x43f3, 0xb041, 0x02d0, 0x443d, 0xbfc9, 0xb292, 0x436c, 0xb236, 0xb022, 0xb023, 0x430b, 0xbfc0, 0x4318, 0x456a, 0x2809, 0x4006, 0x432a, 0xba3e, 0x4396, 0x406b, 0xbf16, 0xba55, 0x4163, 0x4279, 0x035d, 0x4380, 0x4078, 0x1ccc, 0xba46, 0x4064, 0xb21a, 0x0727, 0x1a5e, 0xba7f, 0xa4ed, 0xbac7, 0x0244, 0xb26b, 0x23f1, 0x3321, 0xa490, 0x4284, 0xba64, 0xa24a, 0x4057, 0xbaff, 0x1877, 0x417c, 0x0d9c, 0xbf9c, 0x1c58, 0x42c3, 0x1c7f, 0xba5f, 0x0daa, 0x42d8, 0x41be, 0x40d2, 0x4298, 0x4118, 0x4085, 0x4353, 0xbf06, 0x402f, 0xb0fc, 0x45ab, 0x41da, 0x11d6, 0xbf04, 0xb025, 0x40a2, 0xb26c, 0x40ae, 0x40c5, 0x08ba, 0xb227, 0x4356, 0x423b, 0xb20c, 0x230b, 0x40e1, 0xb0fa, 0x4013, 0x14bd, 0x43de, 0x3daf, 0x0368, 0x407f, 0xb298, 0x41f8, 0x43de, 0x4048, 0x18a4, 0x08f7, 0x42b9, 0x41a8, 0xbf33, 0x404f, 0x4174, 0x4261, 0x43f1, 0x1609, 0x4281, 0x00ee, 0x4291, 0x43b1, 0x359a, 0xb0d0, 0xb09f, 0x40fe, 0xb2b5, 0x4466, 0xb050, 0xb25c, 0xba0b, 0xb03a, 0x04a6, 0xb247, 0x4390, 0xb291, 0x4198, 0xb02a, 0x421f, 0x40b3, 0xbf7d, 0x41f6, 0x23ee, 0x329a, 0x43d2, 0x421c, 0x4199, 0xb253, 0xb0c6, 0x3180, 0xb0b7, 0x43a0, 0xbfbf, 0x43e6, 0x1e76, 0x157f, 0x3290, 0x1952, 0x428a, 0x1b3f, 0x05ce, 0x0e2e, 0xb0bf, 0xb264, 0x41a3, 0x0a74, 0x4181, 0x4112, 0x3e9f, 0x42c4, 0x4214, 0x46b9, 0x1a96, 0xbf0f, 0xa787, 0x42fb, 0xb008, 0x40a0, 0x2262, 0xb261, 0x26a5, 0xa01b, 0x01fa, 0x40a4, 0xba0f, 0xa676, 0xb26b, 0xb262, 0xba1f, 0x4075, 0xbfc2, 0x415d, 0xb095, 0x1ead, 0x410a, 0x4328, 0x0c46, 0xb2e9, 0x430f, 0xb274, 0x415d, 0x420f, 0x197b, 0x46fb, 0x125d, 0x43ca, 0xa547, 0x4064, 0x425e, 0xbf2f, 0xb036, 0xb292, 0x40e9, 0x3d9e, 0xb227, 0xa088, 0xb0e0, 0xb21c, 0xafc4, 0xbace, 0x40a2, 0x100d, 0x405d, 0x135d, 0x4045, 0x054f, 0x430c, 0x415c, 0x3b73, 0x1c6b, 0x0905, 0x4213, 0x4471, 0xa947, 0xb269, 0xbf77, 0xba2b, 0x42c8, 0x119f, 0x1d18, 0x4031, 0x4657, 0x4240, 0x4147, 0x4191, 0x44ad, 0x410b, 0xbad7, 0x40d8, 0xa692, 0x1bd6, 0x4137, 0xb05c, 0x4204, 0xbf72, 0x22bb, 0xa447, 0x1ec3, 0xb07f, 0xbfd0, 0x438d, 0x4220, 0xbf4a, 0x40eb, 0x42f2, 0x2d2f, 0x40e1, 0xa238, 0x41fa, 0xb24e, 0xb2e5, 0xbfa0, 0x441c, 0xb056, 0x4365, 0x1cca, 0x1a9a, 0x4346, 0x2fbc, 0x4222, 0xb2c2, 0xbfda, 0x416c, 0xbfe0, 0xba4f, 0x40e8, 0x4386, 0xbfc0, 0x06e0, 0x4370, 0x419e, 0x3b0e, 0xae3e, 0x413b, 0xb0b1, 0xb02f, 0x1f7c, 0x377d, 0xbac4, 0x45d2, 0xb25d, 0x0d8c, 0x46c4, 0x4304, 0xa6dd, 0x1a5d, 0x4050, 0x410c, 0x4269, 0xb284, 0xbf2d, 0x414f, 0x044d, 0xba0a, 0x19a1, 0x4107, 0x4273, 0xbafa, 0xb222, 0x42ba, 0x45c0, 0x408b, 0x4081, 0x4102, 0x070a, 0xb2eb, 0xb056, 0x385b, 0x1b53, 0x046b, 0xba7b, 0x41a3, 0xbaf9, 0x4553, 0x313a, 0xb028, 0xbf42, 0x418c, 0x05c5, 0x4161, 0xa924, 0x4026, 0xba41, 0x40a4, 0x4285, 0x3ff7, 0x1c6a, 0xb207, 0x42ae, 0x4371, 0x116e, 0xbf35, 0x1d23, 0x429f, 0x1a06, 0x44fb, 0xb2ac, 0x40d4, 0x46e5, 0x403e, 0x4387, 0xb099, 0x4109, 0x40d0, 0x2f0a, 0x38cd, 0x02a6, 0xbf38, 0x46ac, 0x30d9, 0x087d, 0xb27b, 0x41ff, 0x1537, 0x4101, 0xba15, 0xb294, 0x41d6, 0x2af8, 0xba0e, 0x41d9, 0x3f8b, 0xba63, 0xb238, 0x4003, 0x1c25, 0x41c7, 0x43a7, 0x0ad6, 0xbf2b, 0x1ee5, 0xb2c4, 0xa57f, 0xb06e, 0x1e2e, 0x4039, 0x409b, 0x4102, 0x416d, 0xa855, 0xb235, 0x3847, 0xa008, 0x4411, 0xb26a, 0xa9fe, 0xbfd7, 0x41d7, 0xbf70, 0xbae6, 0xba06, 0x35df, 0xb219, 0x2f49, 0xb0cd, 0x35d3, 0xb0ca, 0x4383, 0xb233, 0x4381, 0x3a8f, 0x460c, 0x1df7, 0x0edb, 0x43d4, 0x1a05, 0x1318, 0xbac2, 0xb2b9, 0xb2d1, 0x4230, 0xbf3e, 0x422d, 0xb213, 0xb061, 0xa09a, 0x4057, 0x4077, 0x426c, 0x0376, 0x42a5, 0x19c9, 0xbf1d, 0x422d, 0xb2f2, 0xb04b, 0x41a5, 0x410e, 0xb2ac, 0x0819, 0x415b, 0x3316, 0x4314, 0x1fd3, 0xb075, 0xbfb3, 0xb08b, 0xa994, 0xbf80, 0xbae1, 0x40b4, 0xbfb8, 0x409d, 0x01ee, 0x43ec, 0x09d0, 0x2384, 0x4183, 0x416b, 0x411d, 0xbf78, 0xba54, 0xba72, 0x4397, 0x1eb9, 0x1efa, 0xb2ec, 0x183e, 0x18e1, 0x0a6c, 0x42c6, 0x232a, 0xba57, 0xbff0, 0x41f5, 0x42c9, 0x3b22, 0x421f, 0xb294, 0xb277, 0xa937, 0xbf8e, 0x462f, 0x20b5, 0x2e40, 0x4306, 0x43f1, 0x036f, 0xa324, 0xbf23, 0x3670, 0xba5c, 0x4050, 0x0906, 0x4389, 0x4684, 0x40b0, 0x3eb0, 0x1f2e, 0x1aba, 0x1963, 0x4145, 0x122d, 0xb2c1, 0x4555, 0x403d, 0xb28b, 0x4252, 0x1a41, 0x4077, 0x434f, 0x4459, 0x4360, 0xbf22, 0x1b7f, 0xb24e, 0x1433, 0x40b1, 0x41a3, 0xb2cd, 0xb021, 0x4251, 0x42e3, 0xb0b5, 0xb2d0, 0xbf55, 0xa034, 0x41e3, 0x05fb, 0x4067, 0x41c2, 0x4059, 0x40ea, 0x3288, 0x4328, 0x4268, 0xbf2d, 0xb05b, 0xb234, 0x4220, 0xba68, 0xbfc0, 0x42e8, 0x406d, 0x4371, 0x12db, 0x4157, 0x448c, 0x162f, 0x3d79, 0x4190, 0x4050, 0x0c23, 0x2cef, 0x415b, 0xbaf1, 0x4005, 0xbf57, 0x404d, 0x214b, 0xa974, 0x404c, 0x40cb, 0x03ca, 0x1675, 0x36c7, 0xbfda, 0xaecc, 0x4576, 0x2c9c, 0xa7ec, 0x423e, 0x1d8c, 0x4172, 0x437a, 0x0b36, 0xa6b8, 0x4160, 0x4648, 0x45c4, 0x1d48, 0x1cfb, 0xa650, 0x4265, 0xb2b3, 0x414c, 0x443a, 0x4378, 0xba29, 0x464e, 0x1d73, 0xbfa7, 0x121c, 0x2eb2, 0xba30, 0xb0e6, 0x40d8, 0x4108, 0xbf70, 0xbad4, 0xb27e, 0xbaca, 0x4694, 0x320f, 0x1605, 0xba48, 0xafdb, 0x41e1, 0x4095, 0x3649, 0x00ef, 0xbf25, 0x4233, 0x4226, 0x4390, 0x46b8, 0x4231, 0x43d0, 0x45d2, 0x42d7, 0x3871, 0x1a1d, 0x1d3e, 0xbad1, 0x418b, 0xb072, 0x1843, 0xb215, 0x1ae0, 0x0898, 0x4106, 0x41a2, 0xba0a, 0xbf43, 0x41c9, 0x4022, 0xa59a, 0xb035, 0x4549, 0xbfa7, 0x441f, 0x4167, 0x3b3a, 0x1bd7, 0xbf75, 0x3d63, 0x1bba, 0xb2ae, 0x401b, 0x0e2e, 0x42cd, 0x1ccd, 0x4028, 0xba22, 0x4343, 0x3458, 0x2dd4, 0xa814, 0x1985, 0x469a, 0x43c1, 0x4562, 0x444c, 0x19b5, 0x42ab, 0xbf7a, 0xb2a1, 0x4394, 0x4008, 0x0f19, 0xbae8, 0xb266, 0x4141, 0xae9b, 0x4349, 0x45ad, 0x1af6, 0x40c0, 0x40a2, 0xba1a, 0x439b, 0x1fb8, 0x11da, 0xa672, 0xb2d0, 0x4223, 0x449d, 0x431d, 0x42e8, 0x45ec, 0x18d7, 0xbf5e, 0x41df, 0xba7f, 0x423b, 0xa7ae, 0x28f4, 0x414b, 0x43fa, 0xb216, 0x190b, 0xa562, 0x4391, 0xb252, 0x03f3, 0xbac0, 0x40fe, 0x2da8, 0x4449, 0x0adc, 0x4103, 0xb0dd, 0x403f, 0x34fa, 0xbf00, 0x45a6, 0x4357, 0xbf8a, 0xb2a2, 0x4109, 0xadc3, 0x407b, 0x40ac, 0xb227, 0x41fa, 0xaccd, 0x46a8, 0x40fa, 0x1f95, 0xb069, 0x444a, 0x4037, 0xb230, 0x419b, 0x1426, 0x424d, 0xb05f, 0x107b, 0x4055, 0x3be8, 0x0e2b, 0xb0f2, 0x1793, 0x46cb, 0x1fe7, 0xbfc6, 0x4300, 0x1e82, 0x43cc, 0x34b4, 0x173b, 0xb290, 0x36a7, 0x4348, 0x0f9f, 0xba7e, 0x0bef, 0xb22d, 0x42bf, 0x4541, 0xbf70, 0x4193, 0xbff0, 0xb0f2, 0x4420, 0xb01f, 0x41b7, 0x4251, 0x4301, 0xbf0e, 0xbad0, 0xbafe, 0x1f39, 0x2717, 0x4651, 0x1858, 0xb0e6, 0xbf88, 0x0dc3, 0x162d, 0x1947, 0xb24e, 0x24fa, 0xba59, 0x18a4, 0x42f6, 0x4018, 0x42a2, 0x407c, 0x42c6, 0x30d6, 0x4299, 0xb081, 0x4288, 0x41f8, 0x01b4, 0xb00a, 0xb26d, 0x436c, 0xbf0c, 0xb27d, 0xb2a6, 0x45ae, 0x04d9, 0xa8af, 0xb050, 0xbf61, 0x3332, 0x27cd, 0x0c39, 0xb28b, 0xb0e7, 0x2bfa, 0x4231, 0x43cc, 0x4387, 0x1d3e, 0x2fcc, 0x0863, 0x43eb, 0xba00, 0x41bd, 0x4139, 0xbf80, 0x1a3d, 0xba4b, 0x1a7f, 0x41d5, 0x4695, 0x41eb, 0x4003, 0x4457, 0x4312, 0x3a69, 0xb253, 0xbf68, 0x4143, 0xba2f, 0xbaf5, 0xb2e5, 0xbf00, 0x0f33, 0x418a, 0xb254, 0xbf3a, 0xba72, 0x404a, 0xb297, 0xbf46, 0x4645, 0x41e7, 0x4320, 0x1a06, 0x44e0, 0x3e22, 0x41d4, 0xbaf8, 0x4226, 0x41a5, 0x4291, 0xbae8, 0xbaf5, 0x4199, 0x45d1, 0xbf0e, 0x1f1d, 0x3bb4, 0xba40, 0x0793, 0x4645, 0x0312, 0xb262, 0x41b9, 0xb20f, 0x42e3, 0x4018, 0x4570, 0x10d0, 0x038a, 0x434f, 0xb2d2, 0x4430, 0xa2b1, 0x042c, 0x194b, 0x45db, 0x43b7, 0xbf5e, 0x1b6d, 0xb282, 0x40a5, 0x4076, 0x2065, 0x1c00, 0x462d, 0xaded, 0x3907, 0x1fe4, 0x429a, 0x40bd, 0xba32, 0x43b0, 0x1b1d, 0x43ef, 0x41c0, 0x427a, 0xba34, 0xba7b, 0x2307, 0x008d, 0x46c3, 0x4373, 0x40f3, 0xbfb9, 0x4169, 0x4135, 0x413f, 0x2474, 0x4770, 0xe7fe + ], + StartRegs = [0x7602de1d, 0x625d8c21, 0x6c16bc87, 0xecb33bf3, 0xf2e0d596, 0x9ed96ef4, 0xc82738a1, 0xf563157e, 0x31d024d5, 0x481b545e, 0xbb853a8f, 0x828b1a9a, 0x77119f7e, 0x41a530b7, 0x00000000, 0x300001f0 + ], + FinalRegs = [0x28000003, 0xf00ebff8, 0xd843d7d2, 0x00000000, 0x00000074, 0xc03affe0, 0x00000000, 0x00000000, 0x000017cb, 0xffffffae, 0x001b0000, 0x000017cb, 0xffffffff, 0xfffffffe, 0x00000000, 0x600001d0 + ], }, new() { - Instructions = new ushort[] { 0x183a, 0xb2ba, 0xbff0, 0x4236, 0x4329, 0x416b, 0xb0ab, 0xbfc0, 0x461c, 0x1cc6, 0x438a, 0x1dfb, 0x43ef, 0x1b4e, 0xbaee, 0x36a4, 0xb2e2, 0x4169, 0xb048, 0x1d98, 0xa51c, 0x40cc, 0x4332, 0x42e2, 0xbf01, 0xa8ff, 0xb2c5, 0x4322, 0xba13, 0xb017, 0x278e, 0xba57, 0x43ca, 0x4097, 0xb239, 0x41e7, 0x43df, 0x1fe8, 0x4152, 0x34e7, 0xba3e, 0xb211, 0x41ce, 0xb229, 0x4194, 0xbfc8, 0x1c04, 0x403a, 0x43d2, 0xbf41, 0x434d, 0xba36, 0xba4f, 0x40f1, 0x12a2, 0xb2a6, 0x0ba3, 0x1430, 0xb2cf, 0xaf47, 0x4380, 0x215d, 0x18bc, 0xb0ff, 0x4088, 0x41b3, 0x4131, 0xb0ae, 0x1cf1, 0xbfdd, 0x42f0, 0xb2a4, 0x4245, 0x43dc, 0x19b7, 0x4322, 0xba58, 0x1c79, 0x4387, 0x4596, 0x1ece, 0x41fc, 0xbf01, 0x092d, 0xb016, 0x40d1, 0xbad3, 0xb2bf, 0x40a6, 0x4247, 0x402f, 0xa9b7, 0xb244, 0x19fa, 0x4244, 0x1b06, 0x18ef, 0x4181, 0x144c, 0x18b1, 0x4197, 0x4123, 0x3a3e, 0xb204, 0xbfbe, 0xbaea, 0x1c38, 0x436a, 0x2039, 0x1ccf, 0xaff3, 0x1847, 0xaecc, 0xb292, 0xb20f, 0x1f5a, 0xb2f2, 0x4183, 0x4004, 0x43b8, 0xab48, 0x43f9, 0x4234, 0x0ca8, 0x3607, 0x4118, 0x4206, 0xbfbe, 0x4073, 0x4688, 0x391a, 0x40b5, 0xba2f, 0xbf00, 0x3d16, 0x1b41, 0x421c, 0x434a, 0x413c, 0x405c, 0x41d8, 0x4375, 0x415c, 0x101b, 0x4540, 0x42ce, 0xb0aa, 0xbf9e, 0x42d0, 0x4215, 0x2cc7, 0x43db, 0xb23e, 0x2a9f, 0x461e, 0xbacf, 0x4344, 0xb2dd, 0x41d1, 0x4233, 0x2398, 0xa583, 0xb09d, 0xa90c, 0x3974, 0x407f, 0x41fe, 0xb03d, 0xb08a, 0x4283, 0x429a, 0x1730, 0x2b83, 0x414d, 0x3df6, 0x41ed, 0xbf0e, 0x19fd, 0x178e, 0x4158, 0xba46, 0x418b, 0x1030, 0xb033, 0x405b, 0x1e2f, 0x4063, 0xbfca, 0xbaf3, 0xb21d, 0x43dc, 0x412f, 0x42f0, 0xba72, 0xb040, 0x426e, 0x3339, 0xba6f, 0x10b4, 0x466c, 0x426b, 0xb276, 0x26bb, 0x42ea, 0x1338, 0x41f2, 0x4252, 0x41a3, 0x3467, 0x445c, 0x1034, 0x4577, 0x4277, 0x446c, 0x1933, 0x4032, 0xbfc6, 0x469c, 0xba1b, 0x2658, 0x4049, 0xb24d, 0x43ae, 0x42c8, 0x4316, 0x40cc, 0xb22b, 0xbf60, 0x3670, 0xba72, 0xb0e2, 0x40b8, 0xba6b, 0xb214, 0xbfd1, 0x428b, 0x1876, 0x1f3a, 0xb06f, 0x435e, 0x447a, 0x427d, 0xba75, 0xa04f, 0xaaee, 0x4222, 0x194f, 0x2702, 0xb05d, 0x015b, 0x4129, 0x425b, 0x4275, 0xaced, 0xb228, 0x04a5, 0x0d2c, 0x4140, 0xa285, 0xbfb3, 0x4208, 0x42c9, 0x380a, 0xbad3, 0x41c1, 0x4290, 0x4294, 0xba2b, 0xba5a, 0xbaed, 0x1fef, 0x4548, 0xb209, 0x43fd, 0x4233, 0xb0dd, 0xbff0, 0x418f, 0x4132, 0x4081, 0xae38, 0xb0e6, 0x4343, 0x427b, 0x1b87, 0xbf3c, 0xb051, 0x296c, 0xba3f, 0xa2de, 0xbf89, 0x4031, 0x1e9c, 0x429e, 0xb085, 0xbf90, 0x11c4, 0x40dc, 0x1dc6, 0x1d74, 0x4331, 0x4014, 0xb29f, 0x3445, 0x14a4, 0x4216, 0xbf51, 0x40f2, 0x4303, 0x4592, 0x42e2, 0x2058, 0xb296, 0xbfbc, 0xbfa0, 0x42d4, 0xbac6, 0x0f05, 0x4584, 0xba26, 0x4059, 0x26b3, 0x419d, 0xb2ac, 0x4261, 0xb200, 0x4201, 0x41cf, 0x4148, 0x4101, 0x43b7, 0xbf6f, 0x1c26, 0xb2f8, 0x426c, 0x1cce, 0x4438, 0xbaf2, 0x193a, 0x44d3, 0x1bf6, 0xba76, 0x39d2, 0x1223, 0x4243, 0xae1b, 0x405d, 0x40a8, 0x187c, 0x420f, 0xb226, 0xb050, 0x41ea, 0x418d, 0x42c6, 0xbf54, 0xa0f9, 0x38d5, 0x185c, 0x432a, 0xbfb4, 0xb2c7, 0x11a8, 0xb277, 0x4201, 0x41ab, 0xbf27, 0xb2ac, 0x1ab3, 0x3b89, 0x40f5, 0x2c46, 0x42ea, 0x43f4, 0x16c3, 0x4264, 0x3e2e, 0x4258, 0x4111, 0x40af, 0x01fe, 0x40b5, 0x0924, 0x1cb3, 0xba0f, 0xa039, 0x32d7, 0xbf80, 0x0949, 0x1bbe, 0xba79, 0xba3e, 0x41da, 0x4395, 0x4408, 0x18e5, 0xbf9e, 0x1ef5, 0x2b17, 0xa1b6, 0x1cb7, 0x42bb, 0x3992, 0x4109, 0x419c, 0x4445, 0x41d9, 0xbafc, 0x412d, 0x01bc, 0x4433, 0x434c, 0xba5a, 0xb207, 0xa3d7, 0xb090, 0x43bb, 0x42b1, 0xbfd7, 0x42e9, 0x4025, 0x331b, 0xad80, 0x41be, 0x430b, 0xb0c8, 0xbacd, 0x3b83, 0x1eca, 0xb073, 0x417d, 0x421a, 0x2cbc, 0x460d, 0xb224, 0x0041, 0xbfd0, 0xba2c, 0xb0d7, 0x42aa, 0x4360, 0xb239, 0xbf13, 0x4232, 0x43dc, 0x1d4d, 0x4172, 0x432f, 0xb217, 0x4014, 0xaf57, 0xb269, 0x4214, 0x401f, 0x4615, 0xba6d, 0x45f5, 0x3366, 0xba10, 0x41a7, 0x4320, 0x433c, 0x41aa, 0x4447, 0x43c4, 0x06b7, 0xbf13, 0x421a, 0x431e, 0x4337, 0xba43, 0x403e, 0xb281, 0x0bbe, 0x41ee, 0xa920, 0x4234, 0xb2f2, 0x43f3, 0x35f2, 0x41aa, 0xb247, 0x378e, 0xb214, 0x3c80, 0xba55, 0xb2fc, 0xb2ea, 0x402b, 0xb2bd, 0x4004, 0x4434, 0x443b, 0x0d49, 0xbfc5, 0x2a68, 0x4333, 0x4616, 0x421e, 0xb2b9, 0x4359, 0x43f8, 0x421a, 0x41bd, 0x16fe, 0xa8e2, 0xb25a, 0x435a, 0xb0d4, 0x416b, 0x1ea0, 0x4035, 0xb0ff, 0x4280, 0x31ab, 0xbf0c, 0x4043, 0x1d5c, 0xb01e, 0x414d, 0x43d1, 0x4283, 0x4008, 0x35e1, 0xb2c5, 0x4080, 0x26fa, 0x35a4, 0x2fee, 0xae2d, 0xbf94, 0x332b, 0x1c4b, 0xb234, 0xba72, 0x1f99, 0x4375, 0xb09b, 0xbfb1, 0x23e8, 0x1a82, 0xbad3, 0x4229, 0x40fa, 0x4271, 0x4454, 0x3f9c, 0xbf7f, 0x43dd, 0x43cf, 0x4051, 0x3ddd, 0x201d, 0xb293, 0xb260, 0xba02, 0x0725, 0x434e, 0x46b5, 0x46e9, 0x1748, 0x428b, 0xbac6, 0xb0b7, 0x41c3, 0xbaf9, 0xbf96, 0xb26d, 0x40bf, 0x1c2a, 0x41ee, 0x3251, 0x402b, 0x436d, 0xb012, 0x28c6, 0x3e10, 0x4472, 0xb064, 0x4254, 0x4008, 0x4326, 0x4187, 0x04fd, 0xb0f8, 0x4656, 0x400f, 0x1277, 0x3d1b, 0xba3a, 0x42bf, 0x43f3, 0xbf69, 0x4153, 0x43ad, 0x4695, 0x0135, 0x436b, 0x4167, 0xba22, 0xa2a9, 0x42f8, 0xbf0e, 0x437a, 0x1d74, 0xb01f, 0x017c, 0x1991, 0x42bc, 0x1faa, 0x43d2, 0x401f, 0xbf35, 0x43fc, 0xa8a4, 0x1b70, 0xb016, 0x0929, 0x2e6b, 0x4325, 0x4558, 0xb05d, 0xbf2e, 0x414c, 0x42cd, 0x4391, 0x433b, 0x4301, 0xbaeb, 0x1b75, 0xbfbb, 0xae43, 0x44aa, 0x41b4, 0x42a7, 0x1b64, 0x18d4, 0x2cac, 0xb222, 0xb2c7, 0x42c9, 0xbf90, 0xa53a, 0xbad0, 0x41b7, 0xb099, 0x46e3, 0xba47, 0x438d, 0x4244, 0xb0b5, 0x20f6, 0x456b, 0x433d, 0x4648, 0xba3f, 0x3fc9, 0xbf31, 0x194d, 0xac62, 0x42bb, 0x4315, 0x40ce, 0xaedd, 0xad17, 0x4026, 0x1270, 0xb0b2, 0x17c4, 0x1fbc, 0x417c, 0x1a36, 0x3eb7, 0xb004, 0xb03e, 0x4163, 0xba06, 0x424b, 0x43b4, 0xa91d, 0x4127, 0xb016, 0x4041, 0xb2db, 0x1abd, 0x2772, 0xbf2b, 0x410c, 0x1bc0, 0xbae4, 0x407f, 0x412b, 0x1900, 0x410f, 0x4255, 0xba25, 0x464a, 0xbf02, 0xbad9, 0x418a, 0x431a, 0xbad0, 0xb0b3, 0x4379, 0x442d, 0x4104, 0x13b2, 0x1b63, 0xbfc0, 0x1a55, 0x4271, 0x1d04, 0xb009, 0x42bd, 0x405c, 0x4175, 0xb268, 0x437d, 0xbfa3, 0x3b47, 0xbaec, 0xbae7, 0x0eca, 0xb275, 0x42d0, 0xb24a, 0x4369, 0x404d, 0x086e, 0x409c, 0x418f, 0x45b8, 0x3e1e, 0xbf81, 0x1f68, 0x435e, 0xba1b, 0x43b7, 0x40b5, 0x4064, 0x14b1, 0x13ed, 0x1849, 0xbfc9, 0xb05d, 0x40c3, 0x3623, 0xb2a0, 0x184d, 0x411c, 0x417e, 0xbf7a, 0x46e8, 0x41dc, 0x4329, 0x1cd8, 0xa148, 0xb0f5, 0x2e2a, 0x414d, 0x19ce, 0x41ee, 0x44cd, 0xa6a0, 0x412f, 0x4374, 0x43b9, 0xb06e, 0x1b62, 0x3bb0, 0x4336, 0x2103, 0xbf1f, 0x4291, 0xbadc, 0x4282, 0x4122, 0xab33, 0x4368, 0xbfb0, 0xbaf9, 0xb25f, 0xb0b5, 0xba09, 0xb271, 0x23c2, 0x4565, 0xa12c, 0xb24f, 0xbf3b, 0x2a8a, 0xa3fe, 0x09ff, 0xb288, 0x42b8, 0x40c4, 0xbac9, 0xba34, 0x425a, 0xba04, 0x42be, 0x0208, 0xb003, 0x29cc, 0xb23d, 0xa865, 0x4086, 0x2faa, 0xb0ab, 0xb0a2, 0xbfbb, 0x1955, 0x43af, 0xb2ba, 0x4211, 0x2327, 0x1d02, 0x4347, 0xb28d, 0x4126, 0xba03, 0x42f0, 0x4386, 0x4322, 0xa906, 0x0326, 0xba39, 0xba27, 0x1cfb, 0x4270, 0x419b, 0x0e80, 0x4662, 0x4303, 0x2737, 0x427d, 0x1a84, 0xbf7d, 0x4603, 0x1c74, 0xb27a, 0x4170, 0x346b, 0xba00, 0x38f6, 0x2096, 0x41aa, 0x1c51, 0x2ce4, 0xb097, 0x401d, 0xbf97, 0x4132, 0x439f, 0xb2dc, 0x43fc, 0x41a6, 0x1dc0, 0x4377, 0xb2c3, 0x4326, 0x4240, 0x42bd, 0x185d, 0x1a08, 0xba26, 0x4360, 0x4307, 0x093f, 0x23f5, 0x402e, 0x4423, 0x36b8, 0xacdd, 0x16a5, 0x4210, 0x421d, 0x4317, 0x42cb, 0x281f, 0xbf00, 0xbf38, 0x429c, 0x43f5, 0x4342, 0x44e4, 0xb217, 0x1af3, 0x40b5, 0x423f, 0x4095, 0xb0f7, 0x4593, 0xbf82, 0xbae0, 0x4132, 0xae4e, 0x2512, 0x4088, 0x4355, 0x43b2, 0xb24d, 0x3d61, 0x41ed, 0x1134, 0xb252, 0xb26b, 0x2517, 0x431f, 0xaf24, 0x42da, 0xbf31, 0xa58f, 0x3660, 0x227e, 0x43ef, 0x42de, 0x4203, 0x40fc, 0x42b6, 0x4158, 0x37ff, 0x366d, 0x4002, 0x1805, 0x466d, 0xb230, 0x423a, 0xb21e, 0xba0f, 0x41b2, 0xbad7, 0xb25e, 0x1948, 0xb029, 0xbf4b, 0x423f, 0xb2c8, 0xb25f, 0xba2d, 0x46b8, 0xb220, 0xbf60, 0x421e, 0xb20f, 0xba65, 0x4475, 0xbae1, 0x3874, 0x4031, 0xbf84, 0xb2d8, 0xbfe0, 0x2aa6, 0xbfa0, 0x4287, 0x4372, 0xba1e, 0x4250, 0xba77, 0x4619, 0x4098, 0x408f, 0x432d, 0xba12, 0xbfa2, 0x2b04, 0xba75, 0xb04d, 0x4251, 0x40c4, 0x4034, 0xba30, 0xba2a, 0x4010, 0x4139, 0x43ca, 0xba41, 0x18d1, 0x43ed, 0xb2c1, 0x4167, 0x2288, 0xba05, 0xad26, 0x0d4d, 0x4376, 0xbf53, 0x4139, 0xb2e0, 0xba4f, 0x4254, 0xbf98, 0x4331, 0xbf16, 0xa567, 0x420c, 0x081b, 0x1c4e, 0x03c9, 0x4220, 0xb097, 0x0871, 0x43da, 0xb06c, 0x427e, 0xb006, 0x42e0, 0xbf70, 0x42db, 0x06dc, 0x420f, 0x40eb, 0x41a4, 0xbfbc, 0x42d6, 0xb24a, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd3cfc4df, 0x5f6feaeb, 0x1bacfb37, 0xe934848c, 0x07b4b459, 0x8beb3310, 0x3e769455, 0x1dc2cbe1, 0xaa106f96, 0xf071655c, 0xa0cd784c, 0xed40276a, 0xb836b593, 0x485f4321, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x54ca3e07, 0x419af099, 0x485f4374, 0x90be86e8, 0xa9947992, 0x00000000, 0x800001d0 }, + Instructions = [0x183a, 0xb2ba, 0xbff0, 0x4236, 0x4329, 0x416b, 0xb0ab, 0xbfc0, 0x461c, 0x1cc6, 0x438a, 0x1dfb, 0x43ef, 0x1b4e, 0xbaee, 0x36a4, 0xb2e2, 0x4169, 0xb048, 0x1d98, 0xa51c, 0x40cc, 0x4332, 0x42e2, 0xbf01, 0xa8ff, 0xb2c5, 0x4322, 0xba13, 0xb017, 0x278e, 0xba57, 0x43ca, 0x4097, 0xb239, 0x41e7, 0x43df, 0x1fe8, 0x4152, 0x34e7, 0xba3e, 0xb211, 0x41ce, 0xb229, 0x4194, 0xbfc8, 0x1c04, 0x403a, 0x43d2, 0xbf41, 0x434d, 0xba36, 0xba4f, 0x40f1, 0x12a2, 0xb2a6, 0x0ba3, 0x1430, 0xb2cf, 0xaf47, 0x4380, 0x215d, 0x18bc, 0xb0ff, 0x4088, 0x41b3, 0x4131, 0xb0ae, 0x1cf1, 0xbfdd, 0x42f0, 0xb2a4, 0x4245, 0x43dc, 0x19b7, 0x4322, 0xba58, 0x1c79, 0x4387, 0x4596, 0x1ece, 0x41fc, 0xbf01, 0x092d, 0xb016, 0x40d1, 0xbad3, 0xb2bf, 0x40a6, 0x4247, 0x402f, 0xa9b7, 0xb244, 0x19fa, 0x4244, 0x1b06, 0x18ef, 0x4181, 0x144c, 0x18b1, 0x4197, 0x4123, 0x3a3e, 0xb204, 0xbfbe, 0xbaea, 0x1c38, 0x436a, 0x2039, 0x1ccf, 0xaff3, 0x1847, 0xaecc, 0xb292, 0xb20f, 0x1f5a, 0xb2f2, 0x4183, 0x4004, 0x43b8, 0xab48, 0x43f9, 0x4234, 0x0ca8, 0x3607, 0x4118, 0x4206, 0xbfbe, 0x4073, 0x4688, 0x391a, 0x40b5, 0xba2f, 0xbf00, 0x3d16, 0x1b41, 0x421c, 0x434a, 0x413c, 0x405c, 0x41d8, 0x4375, 0x415c, 0x101b, 0x4540, 0x42ce, 0xb0aa, 0xbf9e, 0x42d0, 0x4215, 0x2cc7, 0x43db, 0xb23e, 0x2a9f, 0x461e, 0xbacf, 0x4344, 0xb2dd, 0x41d1, 0x4233, 0x2398, 0xa583, 0xb09d, 0xa90c, 0x3974, 0x407f, 0x41fe, 0xb03d, 0xb08a, 0x4283, 0x429a, 0x1730, 0x2b83, 0x414d, 0x3df6, 0x41ed, 0xbf0e, 0x19fd, 0x178e, 0x4158, 0xba46, 0x418b, 0x1030, 0xb033, 0x405b, 0x1e2f, 0x4063, 0xbfca, 0xbaf3, 0xb21d, 0x43dc, 0x412f, 0x42f0, 0xba72, 0xb040, 0x426e, 0x3339, 0xba6f, 0x10b4, 0x466c, 0x426b, 0xb276, 0x26bb, 0x42ea, 0x1338, 0x41f2, 0x4252, 0x41a3, 0x3467, 0x445c, 0x1034, 0x4577, 0x4277, 0x446c, 0x1933, 0x4032, 0xbfc6, 0x469c, 0xba1b, 0x2658, 0x4049, 0xb24d, 0x43ae, 0x42c8, 0x4316, 0x40cc, 0xb22b, 0xbf60, 0x3670, 0xba72, 0xb0e2, 0x40b8, 0xba6b, 0xb214, 0xbfd1, 0x428b, 0x1876, 0x1f3a, 0xb06f, 0x435e, 0x447a, 0x427d, 0xba75, 0xa04f, 0xaaee, 0x4222, 0x194f, 0x2702, 0xb05d, 0x015b, 0x4129, 0x425b, 0x4275, 0xaced, 0xb228, 0x04a5, 0x0d2c, 0x4140, 0xa285, 0xbfb3, 0x4208, 0x42c9, 0x380a, 0xbad3, 0x41c1, 0x4290, 0x4294, 0xba2b, 0xba5a, 0xbaed, 0x1fef, 0x4548, 0xb209, 0x43fd, 0x4233, 0xb0dd, 0xbff0, 0x418f, 0x4132, 0x4081, 0xae38, 0xb0e6, 0x4343, 0x427b, 0x1b87, 0xbf3c, 0xb051, 0x296c, 0xba3f, 0xa2de, 0xbf89, 0x4031, 0x1e9c, 0x429e, 0xb085, 0xbf90, 0x11c4, 0x40dc, 0x1dc6, 0x1d74, 0x4331, 0x4014, 0xb29f, 0x3445, 0x14a4, 0x4216, 0xbf51, 0x40f2, 0x4303, 0x4592, 0x42e2, 0x2058, 0xb296, 0xbfbc, 0xbfa0, 0x42d4, 0xbac6, 0x0f05, 0x4584, 0xba26, 0x4059, 0x26b3, 0x419d, 0xb2ac, 0x4261, 0xb200, 0x4201, 0x41cf, 0x4148, 0x4101, 0x43b7, 0xbf6f, 0x1c26, 0xb2f8, 0x426c, 0x1cce, 0x4438, 0xbaf2, 0x193a, 0x44d3, 0x1bf6, 0xba76, 0x39d2, 0x1223, 0x4243, 0xae1b, 0x405d, 0x40a8, 0x187c, 0x420f, 0xb226, 0xb050, 0x41ea, 0x418d, 0x42c6, 0xbf54, 0xa0f9, 0x38d5, 0x185c, 0x432a, 0xbfb4, 0xb2c7, 0x11a8, 0xb277, 0x4201, 0x41ab, 0xbf27, 0xb2ac, 0x1ab3, 0x3b89, 0x40f5, 0x2c46, 0x42ea, 0x43f4, 0x16c3, 0x4264, 0x3e2e, 0x4258, 0x4111, 0x40af, 0x01fe, 0x40b5, 0x0924, 0x1cb3, 0xba0f, 0xa039, 0x32d7, 0xbf80, 0x0949, 0x1bbe, 0xba79, 0xba3e, 0x41da, 0x4395, 0x4408, 0x18e5, 0xbf9e, 0x1ef5, 0x2b17, 0xa1b6, 0x1cb7, 0x42bb, 0x3992, 0x4109, 0x419c, 0x4445, 0x41d9, 0xbafc, 0x412d, 0x01bc, 0x4433, 0x434c, 0xba5a, 0xb207, 0xa3d7, 0xb090, 0x43bb, 0x42b1, 0xbfd7, 0x42e9, 0x4025, 0x331b, 0xad80, 0x41be, 0x430b, 0xb0c8, 0xbacd, 0x3b83, 0x1eca, 0xb073, 0x417d, 0x421a, 0x2cbc, 0x460d, 0xb224, 0x0041, 0xbfd0, 0xba2c, 0xb0d7, 0x42aa, 0x4360, 0xb239, 0xbf13, 0x4232, 0x43dc, 0x1d4d, 0x4172, 0x432f, 0xb217, 0x4014, 0xaf57, 0xb269, 0x4214, 0x401f, 0x4615, 0xba6d, 0x45f5, 0x3366, 0xba10, 0x41a7, 0x4320, 0x433c, 0x41aa, 0x4447, 0x43c4, 0x06b7, 0xbf13, 0x421a, 0x431e, 0x4337, 0xba43, 0x403e, 0xb281, 0x0bbe, 0x41ee, 0xa920, 0x4234, 0xb2f2, 0x43f3, 0x35f2, 0x41aa, 0xb247, 0x378e, 0xb214, 0x3c80, 0xba55, 0xb2fc, 0xb2ea, 0x402b, 0xb2bd, 0x4004, 0x4434, 0x443b, 0x0d49, 0xbfc5, 0x2a68, 0x4333, 0x4616, 0x421e, 0xb2b9, 0x4359, 0x43f8, 0x421a, 0x41bd, 0x16fe, 0xa8e2, 0xb25a, 0x435a, 0xb0d4, 0x416b, 0x1ea0, 0x4035, 0xb0ff, 0x4280, 0x31ab, 0xbf0c, 0x4043, 0x1d5c, 0xb01e, 0x414d, 0x43d1, 0x4283, 0x4008, 0x35e1, 0xb2c5, 0x4080, 0x26fa, 0x35a4, 0x2fee, 0xae2d, 0xbf94, 0x332b, 0x1c4b, 0xb234, 0xba72, 0x1f99, 0x4375, 0xb09b, 0xbfb1, 0x23e8, 0x1a82, 0xbad3, 0x4229, 0x40fa, 0x4271, 0x4454, 0x3f9c, 0xbf7f, 0x43dd, 0x43cf, 0x4051, 0x3ddd, 0x201d, 0xb293, 0xb260, 0xba02, 0x0725, 0x434e, 0x46b5, 0x46e9, 0x1748, 0x428b, 0xbac6, 0xb0b7, 0x41c3, 0xbaf9, 0xbf96, 0xb26d, 0x40bf, 0x1c2a, 0x41ee, 0x3251, 0x402b, 0x436d, 0xb012, 0x28c6, 0x3e10, 0x4472, 0xb064, 0x4254, 0x4008, 0x4326, 0x4187, 0x04fd, 0xb0f8, 0x4656, 0x400f, 0x1277, 0x3d1b, 0xba3a, 0x42bf, 0x43f3, 0xbf69, 0x4153, 0x43ad, 0x4695, 0x0135, 0x436b, 0x4167, 0xba22, 0xa2a9, 0x42f8, 0xbf0e, 0x437a, 0x1d74, 0xb01f, 0x017c, 0x1991, 0x42bc, 0x1faa, 0x43d2, 0x401f, 0xbf35, 0x43fc, 0xa8a4, 0x1b70, 0xb016, 0x0929, 0x2e6b, 0x4325, 0x4558, 0xb05d, 0xbf2e, 0x414c, 0x42cd, 0x4391, 0x433b, 0x4301, 0xbaeb, 0x1b75, 0xbfbb, 0xae43, 0x44aa, 0x41b4, 0x42a7, 0x1b64, 0x18d4, 0x2cac, 0xb222, 0xb2c7, 0x42c9, 0xbf90, 0xa53a, 0xbad0, 0x41b7, 0xb099, 0x46e3, 0xba47, 0x438d, 0x4244, 0xb0b5, 0x20f6, 0x456b, 0x433d, 0x4648, 0xba3f, 0x3fc9, 0xbf31, 0x194d, 0xac62, 0x42bb, 0x4315, 0x40ce, 0xaedd, 0xad17, 0x4026, 0x1270, 0xb0b2, 0x17c4, 0x1fbc, 0x417c, 0x1a36, 0x3eb7, 0xb004, 0xb03e, 0x4163, 0xba06, 0x424b, 0x43b4, 0xa91d, 0x4127, 0xb016, 0x4041, 0xb2db, 0x1abd, 0x2772, 0xbf2b, 0x410c, 0x1bc0, 0xbae4, 0x407f, 0x412b, 0x1900, 0x410f, 0x4255, 0xba25, 0x464a, 0xbf02, 0xbad9, 0x418a, 0x431a, 0xbad0, 0xb0b3, 0x4379, 0x442d, 0x4104, 0x13b2, 0x1b63, 0xbfc0, 0x1a55, 0x4271, 0x1d04, 0xb009, 0x42bd, 0x405c, 0x4175, 0xb268, 0x437d, 0xbfa3, 0x3b47, 0xbaec, 0xbae7, 0x0eca, 0xb275, 0x42d0, 0xb24a, 0x4369, 0x404d, 0x086e, 0x409c, 0x418f, 0x45b8, 0x3e1e, 0xbf81, 0x1f68, 0x435e, 0xba1b, 0x43b7, 0x40b5, 0x4064, 0x14b1, 0x13ed, 0x1849, 0xbfc9, 0xb05d, 0x40c3, 0x3623, 0xb2a0, 0x184d, 0x411c, 0x417e, 0xbf7a, 0x46e8, 0x41dc, 0x4329, 0x1cd8, 0xa148, 0xb0f5, 0x2e2a, 0x414d, 0x19ce, 0x41ee, 0x44cd, 0xa6a0, 0x412f, 0x4374, 0x43b9, 0xb06e, 0x1b62, 0x3bb0, 0x4336, 0x2103, 0xbf1f, 0x4291, 0xbadc, 0x4282, 0x4122, 0xab33, 0x4368, 0xbfb0, 0xbaf9, 0xb25f, 0xb0b5, 0xba09, 0xb271, 0x23c2, 0x4565, 0xa12c, 0xb24f, 0xbf3b, 0x2a8a, 0xa3fe, 0x09ff, 0xb288, 0x42b8, 0x40c4, 0xbac9, 0xba34, 0x425a, 0xba04, 0x42be, 0x0208, 0xb003, 0x29cc, 0xb23d, 0xa865, 0x4086, 0x2faa, 0xb0ab, 0xb0a2, 0xbfbb, 0x1955, 0x43af, 0xb2ba, 0x4211, 0x2327, 0x1d02, 0x4347, 0xb28d, 0x4126, 0xba03, 0x42f0, 0x4386, 0x4322, 0xa906, 0x0326, 0xba39, 0xba27, 0x1cfb, 0x4270, 0x419b, 0x0e80, 0x4662, 0x4303, 0x2737, 0x427d, 0x1a84, 0xbf7d, 0x4603, 0x1c74, 0xb27a, 0x4170, 0x346b, 0xba00, 0x38f6, 0x2096, 0x41aa, 0x1c51, 0x2ce4, 0xb097, 0x401d, 0xbf97, 0x4132, 0x439f, 0xb2dc, 0x43fc, 0x41a6, 0x1dc0, 0x4377, 0xb2c3, 0x4326, 0x4240, 0x42bd, 0x185d, 0x1a08, 0xba26, 0x4360, 0x4307, 0x093f, 0x23f5, 0x402e, 0x4423, 0x36b8, 0xacdd, 0x16a5, 0x4210, 0x421d, 0x4317, 0x42cb, 0x281f, 0xbf00, 0xbf38, 0x429c, 0x43f5, 0x4342, 0x44e4, 0xb217, 0x1af3, 0x40b5, 0x423f, 0x4095, 0xb0f7, 0x4593, 0xbf82, 0xbae0, 0x4132, 0xae4e, 0x2512, 0x4088, 0x4355, 0x43b2, 0xb24d, 0x3d61, 0x41ed, 0x1134, 0xb252, 0xb26b, 0x2517, 0x431f, 0xaf24, 0x42da, 0xbf31, 0xa58f, 0x3660, 0x227e, 0x43ef, 0x42de, 0x4203, 0x40fc, 0x42b6, 0x4158, 0x37ff, 0x366d, 0x4002, 0x1805, 0x466d, 0xb230, 0x423a, 0xb21e, 0xba0f, 0x41b2, 0xbad7, 0xb25e, 0x1948, 0xb029, 0xbf4b, 0x423f, 0xb2c8, 0xb25f, 0xba2d, 0x46b8, 0xb220, 0xbf60, 0x421e, 0xb20f, 0xba65, 0x4475, 0xbae1, 0x3874, 0x4031, 0xbf84, 0xb2d8, 0xbfe0, 0x2aa6, 0xbfa0, 0x4287, 0x4372, 0xba1e, 0x4250, 0xba77, 0x4619, 0x4098, 0x408f, 0x432d, 0xba12, 0xbfa2, 0x2b04, 0xba75, 0xb04d, 0x4251, 0x40c4, 0x4034, 0xba30, 0xba2a, 0x4010, 0x4139, 0x43ca, 0xba41, 0x18d1, 0x43ed, 0xb2c1, 0x4167, 0x2288, 0xba05, 0xad26, 0x0d4d, 0x4376, 0xbf53, 0x4139, 0xb2e0, 0xba4f, 0x4254, 0xbf98, 0x4331, 0xbf16, 0xa567, 0x420c, 0x081b, 0x1c4e, 0x03c9, 0x4220, 0xb097, 0x0871, 0x43da, 0xb06c, 0x427e, 0xb006, 0x42e0, 0xbf70, 0x42db, 0x06dc, 0x420f, 0x40eb, 0x41a4, 0xbfbc, 0x42d6, 0xb24a, 0x4770, 0xe7fe + ], + StartRegs = [0xd3cfc4df, 0x5f6feaeb, 0x1bacfb37, 0xe934848c, 0x07b4b459, 0x8beb3310, 0x3e769455, 0x1dc2cbe1, 0xaa106f96, 0xf071655c, 0xa0cd784c, 0xed40276a, 0xb836b593, 0x485f4321, 0x00000000, 0x900001f0 + ], + FinalRegs = [0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x54ca3e07, 0x419af099, 0x485f4374, 0x90be86e8, 0xa9947992, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x4499, 0x4021, 0x1d2e, 0x1c30, 0xb2ac, 0x44b1, 0x4148, 0xba7c, 0x26b5, 0x42af, 0x4151, 0xa7ea, 0x1bc7, 0x10ed, 0x439b, 0xa19b, 0x4201, 0x3aff, 0x2dc8, 0xba14, 0xb244, 0xbf0c, 0xbff0, 0x45c9, 0x418e, 0xbfc0, 0x4300, 0x282d, 0x4432, 0x41fc, 0xa442, 0x400d, 0xbaff, 0x1ed1, 0x1faa, 0x1e48, 0x433d, 0xbf5b, 0x4661, 0xb2ef, 0x45b9, 0x420e, 0xb0f9, 0x24c6, 0xb2aa, 0x429a, 0x403c, 0xb24c, 0xb0a2, 0xb205, 0xabd2, 0x42a8, 0x4660, 0x4340, 0x44ac, 0x46d9, 0x407c, 0x1b8f, 0xbf18, 0x440e, 0x46e1, 0x4184, 0x4210, 0x421f, 0x1bb3, 0x437a, 0xb272, 0x4320, 0x4230, 0x15b4, 0x110f, 0x2278, 0x418f, 0x1069, 0x0cde, 0x3a07, 0x420d, 0xb2d3, 0x4073, 0x40ee, 0xb0db, 0x3342, 0x4073, 0xbf31, 0xbaee, 0x4359, 0x43c6, 0x42e6, 0x0503, 0xba7b, 0xa23c, 0x42c8, 0x1b6c, 0xbf98, 0x434f, 0x1caa, 0x43f3, 0x4143, 0x41ca, 0x19c6, 0xbff0, 0x105d, 0x42a1, 0x3045, 0x419e, 0xb2c4, 0x4395, 0x40df, 0xa984, 0x41a6, 0x18c1, 0x41cc, 0x43bc, 0x211d, 0x429f, 0x324a, 0x102b, 0x40f3, 0x404a, 0xbf17, 0x40d2, 0x0930, 0xafec, 0x25ca, 0x43f6, 0x1ddd, 0x418d, 0x41d7, 0x43de, 0x18e2, 0x43b2, 0x43a8, 0xa27b, 0xba5e, 0xba38, 0x42fa, 0x4176, 0x1e51, 0xb28a, 0xac01, 0x093b, 0x42a1, 0xbff0, 0xb0fe, 0x29c7, 0x0dae, 0x403b, 0x44c9, 0xbf4c, 0x3212, 0x0a25, 0x43a6, 0x14ea, 0xb095, 0x4293, 0x42bf, 0xba44, 0x2636, 0xbaf8, 0x446a, 0x1967, 0x428c, 0xb0e5, 0xba08, 0xb0d3, 0x4081, 0x4293, 0x4208, 0xbfb0, 0x038e, 0x3581, 0x4484, 0x40b4, 0xba43, 0x424e, 0x4000, 0xbf38, 0x4054, 0xb2ff, 0x44e5, 0x41d8, 0x4291, 0x45eb, 0x43c2, 0xba56, 0x1c4e, 0x44bc, 0x41d0, 0x3ee3, 0x00fb, 0x4038, 0xa75b, 0xbae2, 0xbf23, 0x44a4, 0x404f, 0xb277, 0xba23, 0x4178, 0x4620, 0x410e, 0x4028, 0x4040, 0xa3e9, 0x2281, 0x2238, 0xb211, 0xb285, 0x1adf, 0x4138, 0x240f, 0x4353, 0x428c, 0x4347, 0xbf24, 0x4360, 0x1ffc, 0xbf57, 0x412c, 0x40c9, 0x3611, 0x4062, 0xa2f2, 0x4332, 0xb079, 0x42e9, 0x15c2, 0x40af, 0x4409, 0xba47, 0x423b, 0x1b23, 0x1fc7, 0xbf3b, 0x23f9, 0x40f3, 0x4044, 0x41fa, 0x438d, 0x4081, 0x436f, 0x429a, 0x266b, 0x4277, 0x4544, 0x3a28, 0xba6e, 0x4131, 0x1d81, 0xbaf7, 0x011a, 0x415c, 0x09a7, 0x41de, 0x40cb, 0xbfb0, 0x40b7, 0xbfad, 0x42c9, 0x1993, 0x426b, 0x1201, 0x41d7, 0x42db, 0xb258, 0x41db, 0x435c, 0x447d, 0x461d, 0x43dc, 0x2410, 0x4287, 0xb08b, 0xb2c9, 0x438e, 0x433a, 0xb233, 0xad57, 0x44b8, 0x40fc, 0x4459, 0x1c30, 0x4118, 0x3dfe, 0xba53, 0x1ee0, 0x4130, 0xbfa6, 0xbac3, 0x0f62, 0xa018, 0x424b, 0x4109, 0x4351, 0x407e, 0xbf70, 0x1a92, 0x4289, 0x2f97, 0x41bb, 0x414d, 0x419a, 0xb0ab, 0x40a6, 0xb20d, 0x405e, 0x43fe, 0x422e, 0x4033, 0x41b9, 0x027e, 0x45e6, 0xbfe2, 0x4365, 0x4301, 0xa5e0, 0x430e, 0x4260, 0x40a4, 0x44cb, 0x0824, 0x2e66, 0x4490, 0x1efc, 0xbade, 0x228a, 0xbf60, 0x4048, 0x43b7, 0xbfce, 0x3516, 0x1e5d, 0xaabb, 0x2dbd, 0x36a6, 0xb2fe, 0x459a, 0xb0af, 0x2212, 0xb2f3, 0x42a2, 0x4346, 0x18fb, 0xbfda, 0xb2bb, 0xba39, 0xb261, 0xb231, 0x40f7, 0x4221, 0xb0d0, 0x427e, 0x4270, 0x463e, 0x4332, 0x40ff, 0xb086, 0x43a2, 0x41fc, 0x42d8, 0xbf33, 0xba11, 0x41f6, 0xb23d, 0xb004, 0x41ef, 0x2b68, 0x41a9, 0xbfc8, 0x41af, 0xb0bf, 0x2d51, 0xb08a, 0x41e4, 0xba33, 0x0fbb, 0x445b, 0x3c22, 0x4404, 0x42b7, 0x42da, 0x396d, 0xbfd9, 0x4069, 0x46d9, 0x40c9, 0x424b, 0xa8a1, 0x4399, 0x0771, 0x1ff4, 0xba29, 0x4232, 0x2361, 0xbf1c, 0xb248, 0x40b0, 0x45a2, 0x4171, 0x40b1, 0xb281, 0x4187, 0xb2ff, 0x1a83, 0x160c, 0x1f34, 0xb049, 0xbf2d, 0x430b, 0x4024, 0x2813, 0xbfb0, 0x4146, 0x2134, 0xb2a3, 0x42ca, 0xb0e6, 0x42c3, 0xb2aa, 0x462d, 0x41ee, 0x3025, 0xbf41, 0x152d, 0xb2ab, 0x22cc, 0x22c3, 0xb2ae, 0xba61, 0x430d, 0xbaf2, 0x42ef, 0x40f0, 0x2d16, 0x19da, 0xbf98, 0xba66, 0x1b36, 0xb202, 0x41ba, 0x43ca, 0x28ca, 0x406c, 0x458d, 0xbf5f, 0xba62, 0x42a5, 0xbf70, 0x412a, 0x42e1, 0xa8e9, 0xb000, 0xb0b3, 0x16fc, 0x45e4, 0x4345, 0xbf67, 0x4115, 0x4226, 0xaf4f, 0x41cf, 0x29e1, 0xa321, 0x42e8, 0x426e, 0x3646, 0x42ea, 0xb2f7, 0x42de, 0xac68, 0x341c, 0xb21f, 0x4352, 0xba35, 0xbfe0, 0xb0be, 0xbf24, 0x40f8, 0x1ace, 0xa6be, 0x4627, 0x445b, 0x4130, 0x30b1, 0x26c4, 0xbf00, 0xb08c, 0xb2ed, 0xba6f, 0xb219, 0xb2d1, 0x1ce1, 0x0ae6, 0xb25f, 0xbfd4, 0x05e1, 0x4648, 0xba06, 0xabfd, 0x4068, 0xb27f, 0x1a01, 0x0851, 0x42ff, 0x4691, 0x3367, 0x436c, 0xb20c, 0x4096, 0x43bf, 0x1f4b, 0x10e5, 0xb24f, 0x4325, 0xbfc0, 0x4113, 0xbf44, 0x41ee, 0x4045, 0x43d5, 0xbfbb, 0xb2cb, 0x42e1, 0x3336, 0x43e5, 0x0914, 0xb245, 0xba06, 0x198e, 0xadcb, 0x4079, 0xb23c, 0xbf3f, 0xa03a, 0x4155, 0x41d7, 0xba45, 0x37fe, 0x2b2e, 0x404e, 0xbaf3, 0x405a, 0x18c6, 0x42c6, 0x40f1, 0x402d, 0x184d, 0xa630, 0x42f2, 0xbfac, 0xb2ff, 0xb26a, 0xb2fe, 0xabc6, 0xb288, 0x4180, 0xbaf8, 0x4239, 0x1a7f, 0xb2c1, 0x40cc, 0x3a53, 0x34be, 0x4273, 0x435d, 0xb009, 0x1f2d, 0x4392, 0x424b, 0x459e, 0x43d3, 0x409d, 0x41d6, 0x3faf, 0xa208, 0x4107, 0xbf82, 0x4442, 0xa1e1, 0x1bc0, 0x42ed, 0x4068, 0x0b47, 0xb04b, 0x43fa, 0xba1a, 0xac7d, 0x1899, 0xa69d, 0x4327, 0xad06, 0x1f24, 0x1a75, 0xa2d1, 0x4257, 0x4106, 0x411f, 0x43b0, 0x4406, 0x45f1, 0xb2d5, 0x41a7, 0xb2f6, 0xa9a5, 0xbf25, 0x402e, 0x46a4, 0x41de, 0x4323, 0x1e92, 0x2b9b, 0xbfe0, 0xbfa0, 0xa5cb, 0x4276, 0x19cd, 0x0928, 0x40a9, 0xb2da, 0x4224, 0x42ca, 0xb095, 0x4399, 0x1917, 0xb260, 0xba50, 0xbf2d, 0xa243, 0xb29f, 0x42a1, 0x45aa, 0xa358, 0xb299, 0x4411, 0x4056, 0x4322, 0x1261, 0x40cc, 0x4153, 0x43d7, 0x4492, 0xba2d, 0x42fa, 0x437e, 0x40d1, 0xb0b6, 0xb28a, 0xb2c8, 0x07f6, 0x45ad, 0x4063, 0xb27b, 0x41b8, 0x1df7, 0xbf6e, 0xb225, 0xbf90, 0x1823, 0xb0a6, 0xbaf9, 0xba4b, 0x441d, 0x1bb0, 0x46bd, 0xa111, 0x43cc, 0x40bb, 0x41f1, 0xbf1d, 0x1c87, 0x409b, 0xba0a, 0x41ac, 0xaec5, 0xb24c, 0xbfab, 0x41f9, 0x45d3, 0x2e14, 0xb0fa, 0x156b, 0x4346, 0xb2b6, 0x19af, 0xbaf0, 0x418d, 0xb29e, 0xba47, 0x4342, 0x19aa, 0x3a55, 0x42b5, 0x4623, 0x42ac, 0xb0bb, 0xb246, 0xbfd0, 0x40af, 0x420e, 0x1f14, 0x250e, 0x1e9b, 0xbfca, 0x1d20, 0xbf70, 0xba73, 0x3e76, 0x1f68, 0x1b7b, 0x41d5, 0xbadb, 0x18ab, 0x42a0, 0x4024, 0x03ef, 0xbfd2, 0x1d77, 0xb298, 0x40b2, 0xb20f, 0x4102, 0x4046, 0x42a3, 0xbf8f, 0xb2b4, 0x3410, 0x1aca, 0x4032, 0x1bfc, 0x3a0b, 0xbf1f, 0x40b4, 0xb2d8, 0xb02c, 0x4288, 0x425d, 0x2c05, 0xab89, 0xbaec, 0x43d7, 0xb22b, 0xb20d, 0x4013, 0xb22d, 0x1819, 0xbf0c, 0xaba0, 0x43c0, 0xbac0, 0xba66, 0x4013, 0xb065, 0x18aa, 0x4139, 0x42bc, 0x45c5, 0x4128, 0x405e, 0x41eb, 0xba01, 0x4302, 0xaf34, 0x402e, 0x1181, 0xba70, 0x40c3, 0x191d, 0x4037, 0x40e4, 0xba4b, 0x09b6, 0x4561, 0xbfb9, 0x43ea, 0x02ee, 0x4311, 0x40ea, 0x4394, 0x4367, 0x4059, 0x4399, 0x43b5, 0xb077, 0x40af, 0x4394, 0x42d0, 0xb2b5, 0xb0f4, 0x3bf1, 0x44dc, 0x1887, 0x401f, 0x3da4, 0xbf7a, 0xb26f, 0x4421, 0x2540, 0x4107, 0x4229, 0x4389, 0xba20, 0x3378, 0xbae3, 0xba3e, 0x1c59, 0x40c5, 0x40a4, 0x1a2f, 0x1f4a, 0x432b, 0xa962, 0x41a1, 0x4631, 0xbf3b, 0x4245, 0xb295, 0xb28d, 0x42be, 0xbae8, 0x1b8a, 0x1a0c, 0x44fc, 0x469a, 0x42b7, 0x1ba4, 0x41b3, 0x4361, 0x4241, 0x4034, 0x4099, 0x433d, 0x438f, 0x41c4, 0xb2e4, 0xbf92, 0x426d, 0x4023, 0xba0b, 0xba3c, 0x40d4, 0x4152, 0xb23a, 0x425e, 0x43ac, 0x4146, 0xbfcd, 0x1617, 0x41a8, 0x08af, 0x4364, 0xbadc, 0x4348, 0xb295, 0xb2ee, 0xb21f, 0x400c, 0x4214, 0x4253, 0x4193, 0x4544, 0x1ff0, 0x43bc, 0x2489, 0x4145, 0x414c, 0x409c, 0xa728, 0xb09b, 0xbf19, 0x431f, 0xba0d, 0xba6c, 0x4201, 0x4063, 0x418e, 0x2b73, 0x0d77, 0x4574, 0x408f, 0x31b6, 0x077e, 0xbf48, 0xb2ac, 0xb2be, 0x1088, 0x411e, 0x42e5, 0x410d, 0x428d, 0x4319, 0xbf36, 0x354d, 0x0e3b, 0xb25f, 0x4316, 0xbfa3, 0x419a, 0x039b, 0x41b6, 0x04fd, 0x4583, 0x4284, 0x43c1, 0xbf24, 0x14e3, 0x4366, 0x438f, 0x4388, 0x4335, 0x423b, 0x4181, 0xb227, 0x0e84, 0x0fa9, 0x43a6, 0x1264, 0x0b9d, 0xb0e9, 0xb283, 0x46f2, 0x0ca3, 0x4364, 0x4311, 0xbac1, 0x4115, 0xb0d0, 0x2aa3, 0x1923, 0xbf5b, 0xb04e, 0x35af, 0xa9d4, 0x42c9, 0x4315, 0xbf60, 0x3bfd, 0x0a60, 0xbad1, 0x405a, 0x18b4, 0xb20a, 0xb075, 0x432b, 0x43ea, 0x4272, 0xb2ab, 0x4218, 0x430a, 0x13ee, 0xba22, 0xbf8e, 0x17e6, 0xb260, 0x43ed, 0x439a, 0xb29d, 0x1e98, 0x4355, 0xba54, 0xaffd, 0xb2d2, 0x4394, 0x404e, 0xb08f, 0x3bdc, 0x0f8b, 0x4243, 0x4382, 0xbf48, 0x4138, 0x44fd, 0x422b, 0xb08f, 0x1150, 0xbf73, 0x41d6, 0x1b03, 0xb0bf, 0x432e, 0x283d, 0x45a8, 0x0fa2, 0x0992, 0x40c4, 0x46d2, 0x43d8, 0x42a4, 0x4119, 0x4016, 0x427d, 0xb0c3, 0xb29e, 0xa0df, 0x4258, 0xba3a, 0x1df4, 0x0f25, 0x2f1c, 0x435a, 0x421c, 0x41d4, 0xbf07, 0xb2f7, 0x1a9e, 0x43a2, 0x43d8, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5cc0f53c, 0x72fcd234, 0xde457376, 0x49d4e05a, 0x758c22b2, 0x79c1668a, 0x3635ed63, 0xeac80e34, 0x347d2ad7, 0xd42d60b3, 0xe8a20e81, 0x381745c5, 0x0ec66078, 0xe13b4962, 0x00000000, 0x000001f0 }, - FinalRegs = new uint[] { 0x0000b3bc, 0x00000000, 0x8e4f0000, 0xffff4c43, 0x00004c4a, 0x00000000, 0x00004c43, 0x0000051b, 0x6c94709c, 0x00090000, 0x00000000, 0x55a4c7ed, 0x3cb8de89, 0x0000173b, 0x00000000, 0x200001d0 }, + Instructions = [0x4499, 0x4021, 0x1d2e, 0x1c30, 0xb2ac, 0x44b1, 0x4148, 0xba7c, 0x26b5, 0x42af, 0x4151, 0xa7ea, 0x1bc7, 0x10ed, 0x439b, 0xa19b, 0x4201, 0x3aff, 0x2dc8, 0xba14, 0xb244, 0xbf0c, 0xbff0, 0x45c9, 0x418e, 0xbfc0, 0x4300, 0x282d, 0x4432, 0x41fc, 0xa442, 0x400d, 0xbaff, 0x1ed1, 0x1faa, 0x1e48, 0x433d, 0xbf5b, 0x4661, 0xb2ef, 0x45b9, 0x420e, 0xb0f9, 0x24c6, 0xb2aa, 0x429a, 0x403c, 0xb24c, 0xb0a2, 0xb205, 0xabd2, 0x42a8, 0x4660, 0x4340, 0x44ac, 0x46d9, 0x407c, 0x1b8f, 0xbf18, 0x440e, 0x46e1, 0x4184, 0x4210, 0x421f, 0x1bb3, 0x437a, 0xb272, 0x4320, 0x4230, 0x15b4, 0x110f, 0x2278, 0x418f, 0x1069, 0x0cde, 0x3a07, 0x420d, 0xb2d3, 0x4073, 0x40ee, 0xb0db, 0x3342, 0x4073, 0xbf31, 0xbaee, 0x4359, 0x43c6, 0x42e6, 0x0503, 0xba7b, 0xa23c, 0x42c8, 0x1b6c, 0xbf98, 0x434f, 0x1caa, 0x43f3, 0x4143, 0x41ca, 0x19c6, 0xbff0, 0x105d, 0x42a1, 0x3045, 0x419e, 0xb2c4, 0x4395, 0x40df, 0xa984, 0x41a6, 0x18c1, 0x41cc, 0x43bc, 0x211d, 0x429f, 0x324a, 0x102b, 0x40f3, 0x404a, 0xbf17, 0x40d2, 0x0930, 0xafec, 0x25ca, 0x43f6, 0x1ddd, 0x418d, 0x41d7, 0x43de, 0x18e2, 0x43b2, 0x43a8, 0xa27b, 0xba5e, 0xba38, 0x42fa, 0x4176, 0x1e51, 0xb28a, 0xac01, 0x093b, 0x42a1, 0xbff0, 0xb0fe, 0x29c7, 0x0dae, 0x403b, 0x44c9, 0xbf4c, 0x3212, 0x0a25, 0x43a6, 0x14ea, 0xb095, 0x4293, 0x42bf, 0xba44, 0x2636, 0xbaf8, 0x446a, 0x1967, 0x428c, 0xb0e5, 0xba08, 0xb0d3, 0x4081, 0x4293, 0x4208, 0xbfb0, 0x038e, 0x3581, 0x4484, 0x40b4, 0xba43, 0x424e, 0x4000, 0xbf38, 0x4054, 0xb2ff, 0x44e5, 0x41d8, 0x4291, 0x45eb, 0x43c2, 0xba56, 0x1c4e, 0x44bc, 0x41d0, 0x3ee3, 0x00fb, 0x4038, 0xa75b, 0xbae2, 0xbf23, 0x44a4, 0x404f, 0xb277, 0xba23, 0x4178, 0x4620, 0x410e, 0x4028, 0x4040, 0xa3e9, 0x2281, 0x2238, 0xb211, 0xb285, 0x1adf, 0x4138, 0x240f, 0x4353, 0x428c, 0x4347, 0xbf24, 0x4360, 0x1ffc, 0xbf57, 0x412c, 0x40c9, 0x3611, 0x4062, 0xa2f2, 0x4332, 0xb079, 0x42e9, 0x15c2, 0x40af, 0x4409, 0xba47, 0x423b, 0x1b23, 0x1fc7, 0xbf3b, 0x23f9, 0x40f3, 0x4044, 0x41fa, 0x438d, 0x4081, 0x436f, 0x429a, 0x266b, 0x4277, 0x4544, 0x3a28, 0xba6e, 0x4131, 0x1d81, 0xbaf7, 0x011a, 0x415c, 0x09a7, 0x41de, 0x40cb, 0xbfb0, 0x40b7, 0xbfad, 0x42c9, 0x1993, 0x426b, 0x1201, 0x41d7, 0x42db, 0xb258, 0x41db, 0x435c, 0x447d, 0x461d, 0x43dc, 0x2410, 0x4287, 0xb08b, 0xb2c9, 0x438e, 0x433a, 0xb233, 0xad57, 0x44b8, 0x40fc, 0x4459, 0x1c30, 0x4118, 0x3dfe, 0xba53, 0x1ee0, 0x4130, 0xbfa6, 0xbac3, 0x0f62, 0xa018, 0x424b, 0x4109, 0x4351, 0x407e, 0xbf70, 0x1a92, 0x4289, 0x2f97, 0x41bb, 0x414d, 0x419a, 0xb0ab, 0x40a6, 0xb20d, 0x405e, 0x43fe, 0x422e, 0x4033, 0x41b9, 0x027e, 0x45e6, 0xbfe2, 0x4365, 0x4301, 0xa5e0, 0x430e, 0x4260, 0x40a4, 0x44cb, 0x0824, 0x2e66, 0x4490, 0x1efc, 0xbade, 0x228a, 0xbf60, 0x4048, 0x43b7, 0xbfce, 0x3516, 0x1e5d, 0xaabb, 0x2dbd, 0x36a6, 0xb2fe, 0x459a, 0xb0af, 0x2212, 0xb2f3, 0x42a2, 0x4346, 0x18fb, 0xbfda, 0xb2bb, 0xba39, 0xb261, 0xb231, 0x40f7, 0x4221, 0xb0d0, 0x427e, 0x4270, 0x463e, 0x4332, 0x40ff, 0xb086, 0x43a2, 0x41fc, 0x42d8, 0xbf33, 0xba11, 0x41f6, 0xb23d, 0xb004, 0x41ef, 0x2b68, 0x41a9, 0xbfc8, 0x41af, 0xb0bf, 0x2d51, 0xb08a, 0x41e4, 0xba33, 0x0fbb, 0x445b, 0x3c22, 0x4404, 0x42b7, 0x42da, 0x396d, 0xbfd9, 0x4069, 0x46d9, 0x40c9, 0x424b, 0xa8a1, 0x4399, 0x0771, 0x1ff4, 0xba29, 0x4232, 0x2361, 0xbf1c, 0xb248, 0x40b0, 0x45a2, 0x4171, 0x40b1, 0xb281, 0x4187, 0xb2ff, 0x1a83, 0x160c, 0x1f34, 0xb049, 0xbf2d, 0x430b, 0x4024, 0x2813, 0xbfb0, 0x4146, 0x2134, 0xb2a3, 0x42ca, 0xb0e6, 0x42c3, 0xb2aa, 0x462d, 0x41ee, 0x3025, 0xbf41, 0x152d, 0xb2ab, 0x22cc, 0x22c3, 0xb2ae, 0xba61, 0x430d, 0xbaf2, 0x42ef, 0x40f0, 0x2d16, 0x19da, 0xbf98, 0xba66, 0x1b36, 0xb202, 0x41ba, 0x43ca, 0x28ca, 0x406c, 0x458d, 0xbf5f, 0xba62, 0x42a5, 0xbf70, 0x412a, 0x42e1, 0xa8e9, 0xb000, 0xb0b3, 0x16fc, 0x45e4, 0x4345, 0xbf67, 0x4115, 0x4226, 0xaf4f, 0x41cf, 0x29e1, 0xa321, 0x42e8, 0x426e, 0x3646, 0x42ea, 0xb2f7, 0x42de, 0xac68, 0x341c, 0xb21f, 0x4352, 0xba35, 0xbfe0, 0xb0be, 0xbf24, 0x40f8, 0x1ace, 0xa6be, 0x4627, 0x445b, 0x4130, 0x30b1, 0x26c4, 0xbf00, 0xb08c, 0xb2ed, 0xba6f, 0xb219, 0xb2d1, 0x1ce1, 0x0ae6, 0xb25f, 0xbfd4, 0x05e1, 0x4648, 0xba06, 0xabfd, 0x4068, 0xb27f, 0x1a01, 0x0851, 0x42ff, 0x4691, 0x3367, 0x436c, 0xb20c, 0x4096, 0x43bf, 0x1f4b, 0x10e5, 0xb24f, 0x4325, 0xbfc0, 0x4113, 0xbf44, 0x41ee, 0x4045, 0x43d5, 0xbfbb, 0xb2cb, 0x42e1, 0x3336, 0x43e5, 0x0914, 0xb245, 0xba06, 0x198e, 0xadcb, 0x4079, 0xb23c, 0xbf3f, 0xa03a, 0x4155, 0x41d7, 0xba45, 0x37fe, 0x2b2e, 0x404e, 0xbaf3, 0x405a, 0x18c6, 0x42c6, 0x40f1, 0x402d, 0x184d, 0xa630, 0x42f2, 0xbfac, 0xb2ff, 0xb26a, 0xb2fe, 0xabc6, 0xb288, 0x4180, 0xbaf8, 0x4239, 0x1a7f, 0xb2c1, 0x40cc, 0x3a53, 0x34be, 0x4273, 0x435d, 0xb009, 0x1f2d, 0x4392, 0x424b, 0x459e, 0x43d3, 0x409d, 0x41d6, 0x3faf, 0xa208, 0x4107, 0xbf82, 0x4442, 0xa1e1, 0x1bc0, 0x42ed, 0x4068, 0x0b47, 0xb04b, 0x43fa, 0xba1a, 0xac7d, 0x1899, 0xa69d, 0x4327, 0xad06, 0x1f24, 0x1a75, 0xa2d1, 0x4257, 0x4106, 0x411f, 0x43b0, 0x4406, 0x45f1, 0xb2d5, 0x41a7, 0xb2f6, 0xa9a5, 0xbf25, 0x402e, 0x46a4, 0x41de, 0x4323, 0x1e92, 0x2b9b, 0xbfe0, 0xbfa0, 0xa5cb, 0x4276, 0x19cd, 0x0928, 0x40a9, 0xb2da, 0x4224, 0x42ca, 0xb095, 0x4399, 0x1917, 0xb260, 0xba50, 0xbf2d, 0xa243, 0xb29f, 0x42a1, 0x45aa, 0xa358, 0xb299, 0x4411, 0x4056, 0x4322, 0x1261, 0x40cc, 0x4153, 0x43d7, 0x4492, 0xba2d, 0x42fa, 0x437e, 0x40d1, 0xb0b6, 0xb28a, 0xb2c8, 0x07f6, 0x45ad, 0x4063, 0xb27b, 0x41b8, 0x1df7, 0xbf6e, 0xb225, 0xbf90, 0x1823, 0xb0a6, 0xbaf9, 0xba4b, 0x441d, 0x1bb0, 0x46bd, 0xa111, 0x43cc, 0x40bb, 0x41f1, 0xbf1d, 0x1c87, 0x409b, 0xba0a, 0x41ac, 0xaec5, 0xb24c, 0xbfab, 0x41f9, 0x45d3, 0x2e14, 0xb0fa, 0x156b, 0x4346, 0xb2b6, 0x19af, 0xbaf0, 0x418d, 0xb29e, 0xba47, 0x4342, 0x19aa, 0x3a55, 0x42b5, 0x4623, 0x42ac, 0xb0bb, 0xb246, 0xbfd0, 0x40af, 0x420e, 0x1f14, 0x250e, 0x1e9b, 0xbfca, 0x1d20, 0xbf70, 0xba73, 0x3e76, 0x1f68, 0x1b7b, 0x41d5, 0xbadb, 0x18ab, 0x42a0, 0x4024, 0x03ef, 0xbfd2, 0x1d77, 0xb298, 0x40b2, 0xb20f, 0x4102, 0x4046, 0x42a3, 0xbf8f, 0xb2b4, 0x3410, 0x1aca, 0x4032, 0x1bfc, 0x3a0b, 0xbf1f, 0x40b4, 0xb2d8, 0xb02c, 0x4288, 0x425d, 0x2c05, 0xab89, 0xbaec, 0x43d7, 0xb22b, 0xb20d, 0x4013, 0xb22d, 0x1819, 0xbf0c, 0xaba0, 0x43c0, 0xbac0, 0xba66, 0x4013, 0xb065, 0x18aa, 0x4139, 0x42bc, 0x45c5, 0x4128, 0x405e, 0x41eb, 0xba01, 0x4302, 0xaf34, 0x402e, 0x1181, 0xba70, 0x40c3, 0x191d, 0x4037, 0x40e4, 0xba4b, 0x09b6, 0x4561, 0xbfb9, 0x43ea, 0x02ee, 0x4311, 0x40ea, 0x4394, 0x4367, 0x4059, 0x4399, 0x43b5, 0xb077, 0x40af, 0x4394, 0x42d0, 0xb2b5, 0xb0f4, 0x3bf1, 0x44dc, 0x1887, 0x401f, 0x3da4, 0xbf7a, 0xb26f, 0x4421, 0x2540, 0x4107, 0x4229, 0x4389, 0xba20, 0x3378, 0xbae3, 0xba3e, 0x1c59, 0x40c5, 0x40a4, 0x1a2f, 0x1f4a, 0x432b, 0xa962, 0x41a1, 0x4631, 0xbf3b, 0x4245, 0xb295, 0xb28d, 0x42be, 0xbae8, 0x1b8a, 0x1a0c, 0x44fc, 0x469a, 0x42b7, 0x1ba4, 0x41b3, 0x4361, 0x4241, 0x4034, 0x4099, 0x433d, 0x438f, 0x41c4, 0xb2e4, 0xbf92, 0x426d, 0x4023, 0xba0b, 0xba3c, 0x40d4, 0x4152, 0xb23a, 0x425e, 0x43ac, 0x4146, 0xbfcd, 0x1617, 0x41a8, 0x08af, 0x4364, 0xbadc, 0x4348, 0xb295, 0xb2ee, 0xb21f, 0x400c, 0x4214, 0x4253, 0x4193, 0x4544, 0x1ff0, 0x43bc, 0x2489, 0x4145, 0x414c, 0x409c, 0xa728, 0xb09b, 0xbf19, 0x431f, 0xba0d, 0xba6c, 0x4201, 0x4063, 0x418e, 0x2b73, 0x0d77, 0x4574, 0x408f, 0x31b6, 0x077e, 0xbf48, 0xb2ac, 0xb2be, 0x1088, 0x411e, 0x42e5, 0x410d, 0x428d, 0x4319, 0xbf36, 0x354d, 0x0e3b, 0xb25f, 0x4316, 0xbfa3, 0x419a, 0x039b, 0x41b6, 0x04fd, 0x4583, 0x4284, 0x43c1, 0xbf24, 0x14e3, 0x4366, 0x438f, 0x4388, 0x4335, 0x423b, 0x4181, 0xb227, 0x0e84, 0x0fa9, 0x43a6, 0x1264, 0x0b9d, 0xb0e9, 0xb283, 0x46f2, 0x0ca3, 0x4364, 0x4311, 0xbac1, 0x4115, 0xb0d0, 0x2aa3, 0x1923, 0xbf5b, 0xb04e, 0x35af, 0xa9d4, 0x42c9, 0x4315, 0xbf60, 0x3bfd, 0x0a60, 0xbad1, 0x405a, 0x18b4, 0xb20a, 0xb075, 0x432b, 0x43ea, 0x4272, 0xb2ab, 0x4218, 0x430a, 0x13ee, 0xba22, 0xbf8e, 0x17e6, 0xb260, 0x43ed, 0x439a, 0xb29d, 0x1e98, 0x4355, 0xba54, 0xaffd, 0xb2d2, 0x4394, 0x404e, 0xb08f, 0x3bdc, 0x0f8b, 0x4243, 0x4382, 0xbf48, 0x4138, 0x44fd, 0x422b, 0xb08f, 0x1150, 0xbf73, 0x41d6, 0x1b03, 0xb0bf, 0x432e, 0x283d, 0x45a8, 0x0fa2, 0x0992, 0x40c4, 0x46d2, 0x43d8, 0x42a4, 0x4119, 0x4016, 0x427d, 0xb0c3, 0xb29e, 0xa0df, 0x4258, 0xba3a, 0x1df4, 0x0f25, 0x2f1c, 0x435a, 0x421c, 0x41d4, 0xbf07, 0xb2f7, 0x1a9e, 0x43a2, 0x43d8, 0x4770, 0xe7fe + ], + StartRegs = [0x5cc0f53c, 0x72fcd234, 0xde457376, 0x49d4e05a, 0x758c22b2, 0x79c1668a, 0x3635ed63, 0xeac80e34, 0x347d2ad7, 0xd42d60b3, 0xe8a20e81, 0x381745c5, 0x0ec66078, 0xe13b4962, 0x00000000, 0x000001f0 + ], + FinalRegs = [0x0000b3bc, 0x00000000, 0x8e4f0000, 0xffff4c43, 0x00004c4a, 0x00000000, 0x00004c43, 0x0000051b, 0x6c94709c, 0x00090000, 0x00000000, 0x55a4c7ed, 0x3cb8de89, 0x0000173b, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xb2ea, 0x42ba, 0x46c5, 0x422b, 0x1be5, 0x02d1, 0x1caa, 0x41bc, 0x43bd, 0x1dfd, 0xa8ec, 0xb044, 0x0ec5, 0x0aa4, 0x4022, 0x45c5, 0xb00b, 0x42da, 0x04c3, 0x00d9, 0x1e50, 0xbf03, 0x4184, 0x4254, 0xb282, 0x00fc, 0xb041, 0xb27c, 0xbafd, 0x18fc, 0x417c, 0x41d6, 0x4313, 0xba21, 0xb237, 0xbfb4, 0xb29f, 0xb260, 0x1acf, 0x21b0, 0xb062, 0xbac1, 0xbacb, 0x41aa, 0x1399, 0xb255, 0xb28d, 0x1f91, 0x408a, 0x1391, 0xb200, 0x40ba, 0x4234, 0xbad2, 0x4031, 0x417a, 0x43fe, 0x40ff, 0x4131, 0x44c2, 0xbf6d, 0xba23, 0xb22a, 0x1a46, 0x432b, 0x1a26, 0x1525, 0x4148, 0x421b, 0x3ac6, 0xba73, 0xb007, 0x448c, 0xb211, 0x40e9, 0xba0c, 0x2a7e, 0x409b, 0x4478, 0x4495, 0xba61, 0x40e5, 0x465d, 0x4110, 0xb07e, 0xbf04, 0x4174, 0x1ce1, 0xb2b7, 0xb26a, 0x40e2, 0x11ea, 0x091b, 0x46d5, 0x1def, 0x4351, 0x4244, 0x405a, 0x4109, 0xa87b, 0xb249, 0x44b1, 0xba4f, 0xb038, 0xb083, 0xbff0, 0x4016, 0x43f0, 0xb092, 0x03f6, 0x19ad, 0x4287, 0xbf76, 0x43b0, 0x4356, 0x3e6a, 0x1aa0, 0x41c5, 0xb2d4, 0x1cb6, 0xba0c, 0x43ce, 0x45f2, 0xb066, 0x361b, 0x294f, 0x4133, 0xaa78, 0x4659, 0x4019, 0x4310, 0x4158, 0x412d, 0x4077, 0x41d9, 0xba7e, 0xbf96, 0x112e, 0x3932, 0xb0cf, 0x4395, 0x4237, 0x2cd3, 0x35bb, 0x03ff, 0x3c3f, 0xa63b, 0x4352, 0x4110, 0x04e4, 0xaad1, 0xb05a, 0xb2af, 0x4101, 0x4309, 0x43c7, 0xa7cc, 0x1b1d, 0xb2bc, 0x42b2, 0x446d, 0x42e2, 0x4044, 0xbfae, 0xbfd0, 0xa92b, 0x2ca8, 0xba7a, 0x0c15, 0x18af, 0x10c6, 0x4125, 0x411c, 0xb290, 0x40c7, 0x38e2, 0x425a, 0x26d4, 0x45ca, 0x46b5, 0xa9af, 0xbfab, 0x401a, 0x3480, 0x43e2, 0xb205, 0xb06b, 0xb0ce, 0x4213, 0xba35, 0x42d3, 0x1d9c, 0x40c8, 0x43dd, 0x42cc, 0x264c, 0x0f86, 0xbf8a, 0x18b3, 0xb0b6, 0xbff0, 0x08c3, 0x146a, 0x43a1, 0xbfad, 0xb024, 0x419b, 0xada4, 0xb207, 0xa205, 0xb2b0, 0x4013, 0x1ffc, 0xb2dc, 0xb2a6, 0x4189, 0xa033, 0x373b, 0xa54c, 0x4229, 0x1f08, 0xbf17, 0x426b, 0xbf90, 0x18ca, 0xa154, 0x41c6, 0x3c30, 0x426a, 0x431a, 0x1add, 0xb0d0, 0xad69, 0x1d25, 0xbf1f, 0xb2c7, 0x26fe, 0x1dc6, 0xacb6, 0xba38, 0x4554, 0x19cd, 0x4167, 0xa82c, 0xb2d0, 0x15fe, 0x2a17, 0x43cf, 0x45bc, 0x4002, 0x438b, 0xb24a, 0x1bca, 0xb00a, 0x40e5, 0x4367, 0xbfa5, 0x425c, 0x1a88, 0x0641, 0x41e3, 0xb22c, 0xb245, 0x42d5, 0xb23f, 0x4615, 0x43fc, 0xbaed, 0x4272, 0x414c, 0xbf31, 0x41c1, 0xb2df, 0xb2cb, 0x402b, 0x42a6, 0x4356, 0xbf3e, 0xb2e9, 0x2814, 0xbfa0, 0x4143, 0xbfe0, 0x0b79, 0x1b81, 0x38a3, 0x412f, 0x20d2, 0x4068, 0x42cb, 0xbae8, 0x2a4f, 0x1d57, 0xb09d, 0x4168, 0xb208, 0x41e9, 0x408c, 0x357e, 0x469d, 0x43eb, 0x4189, 0xbac2, 0x40d8, 0x4580, 0xbf7a, 0x0b11, 0x4070, 0x4471, 0x43f4, 0x43b0, 0x4586, 0xba4a, 0x346a, 0xa7e9, 0x43b2, 0xbac3, 0x0423, 0x40d6, 0x248d, 0x40a5, 0x420a, 0x438f, 0x427b, 0x4202, 0x31ec, 0x2e50, 0xba26, 0xbf5e, 0x41f2, 0xb08f, 0x42ab, 0x2f2e, 0x4111, 0xbfd0, 0x4324, 0x40de, 0x4236, 0xba1b, 0x02e1, 0x3f0c, 0x0a8d, 0xa1e9, 0x092b, 0x42d4, 0x45dd, 0x43f4, 0x3b18, 0xaff9, 0xba2f, 0xba68, 0xb0de, 0x19b1, 0xbf37, 0x43c5, 0x1642, 0x41d7, 0xbf00, 0x311f, 0xbfd0, 0x4254, 0x423a, 0x4124, 0x1eb4, 0x4364, 0x4365, 0x40e0, 0xbf3e, 0x3c12, 0x43c1, 0x2fbc, 0xb0bd, 0xbac3, 0x4014, 0x41f6, 0x40dc, 0x40ac, 0x4330, 0x1e86, 0x438b, 0xb0d0, 0xac1f, 0x055f, 0x378c, 0x1f34, 0x1f9c, 0x0795, 0xb0c8, 0x410b, 0x4050, 0xbfdb, 0x41eb, 0x3e25, 0x4171, 0x432d, 0xb2d0, 0xb25f, 0xb281, 0x41e1, 0x432f, 0x4073, 0xbf60, 0x40fc, 0xbaf7, 0xb0ba, 0xaac8, 0x4318, 0x410c, 0xa369, 0xb08a, 0x42f8, 0x1c9b, 0xbf78, 0x34a5, 0x3209, 0xadae, 0x4272, 0x0d71, 0xa43d, 0x1180, 0x4229, 0x0689, 0x4313, 0xb208, 0x444c, 0x3a48, 0xba19, 0x4007, 0x4107, 0x2a6a, 0x41be, 0xb2ee, 0xbf42, 0x4332, 0x1870, 0x10cb, 0xb078, 0x411f, 0x29f2, 0xbfe0, 0x20df, 0x41f2, 0x39f3, 0x3ecf, 0x42fc, 0x1623, 0x43a9, 0xbf73, 0x40e3, 0x43ff, 0x40d3, 0x0ef5, 0x43a4, 0xb2aa, 0x4187, 0x403a, 0x1b1c, 0xb0be, 0x354e, 0xb09c, 0x402c, 0x2b3a, 0x0e11, 0x1335, 0xbf60, 0x44f1, 0x2ecf, 0x1b37, 0xb235, 0xb244, 0x428b, 0xb0bb, 0xb2d6, 0x19a6, 0x4589, 0xbf04, 0x1a8c, 0xb277, 0x13d1, 0x4394, 0x1f6f, 0xab11, 0x4335, 0x40f2, 0xb0b6, 0x1fb6, 0x403c, 0x40b0, 0x4274, 0x4345, 0x4282, 0x2a39, 0xb2e2, 0x4327, 0x4278, 0x44ab, 0xb014, 0x2313, 0x425e, 0x41e4, 0xbf6f, 0x1cd2, 0x40c1, 0x3319, 0x40dc, 0x43a4, 0x1839, 0x0638, 0x42b7, 0xbf17, 0x42b9, 0x0c5b, 0xb0e4, 0xb29a, 0xba78, 0xb290, 0x1ed9, 0xbf05, 0xb2ff, 0x42dc, 0x4253, 0x417a, 0x4304, 0x16d8, 0x3184, 0xb257, 0x3bd3, 0x419f, 0x3bd5, 0x4068, 0x10b7, 0x0f9e, 0x40a9, 0x4263, 0x414f, 0x43cd, 0xbfd0, 0xb0d9, 0x411e, 0xb26b, 0x3f5f, 0xbad3, 0x148b, 0x187a, 0x42ce, 0xb296, 0x1d75, 0xbf15, 0x4637, 0x42d9, 0x44d8, 0x4089, 0x05a3, 0x43d8, 0x43ad, 0x4091, 0xb21a, 0xb2bd, 0x4027, 0x1a6a, 0x40a2, 0x41ac, 0xa8f3, 0x41f9, 0xbf31, 0x4345, 0x3a56, 0xa529, 0x4215, 0x2faa, 0xb2b4, 0x195b, 0xb275, 0x4181, 0xba12, 0x43a6, 0x43f5, 0x315d, 0x4629, 0x1d9f, 0xbf94, 0x4212, 0x417b, 0x417c, 0xbfd1, 0x4614, 0x427d, 0x4140, 0xb2ae, 0x41ad, 0x1f90, 0x4286, 0x42ff, 0xac6c, 0xa113, 0xb29a, 0xb2e0, 0x0304, 0x46ed, 0xb2b4, 0xbf2c, 0x1079, 0x4056, 0x424b, 0x40b0, 0x43c2, 0x400d, 0xb2ba, 0xa574, 0x4354, 0x1145, 0x4567, 0x46a9, 0xba63, 0x4684, 0x4259, 0x4396, 0xb231, 0x4388, 0x4047, 0x40c5, 0x42b9, 0xba19, 0x31fc, 0xb012, 0x4154, 0x1a7b, 0x435c, 0xbf3b, 0x4211, 0x4136, 0xafba, 0x1a25, 0x4348, 0xb049, 0xba0e, 0xba6d, 0x43bd, 0xb231, 0xb2b6, 0x464e, 0x17cd, 0x4050, 0x438a, 0x410a, 0x41f7, 0x0d50, 0x41f6, 0x433c, 0xb0a6, 0xbaca, 0x40c2, 0xbf48, 0x4210, 0xbfc6, 0xba0c, 0xba18, 0x4641, 0xb2b3, 0x404f, 0x44f0, 0x4317, 0x2b5f, 0x4077, 0x458e, 0x1005, 0xb2a4, 0xbf42, 0x1ce5, 0x10f8, 0x4340, 0x43ca, 0xbfe0, 0x182e, 0x38a8, 0xa2ad, 0x42ed, 0x4592, 0x2346, 0xbf70, 0x43a2, 0x4037, 0x1360, 0xbafe, 0xb0bb, 0x43b2, 0x19c0, 0xbfa1, 0x4336, 0x4397, 0x1f3f, 0xba20, 0xb0e4, 0x4134, 0x1e98, 0x1926, 0xba44, 0x434d, 0xb087, 0x4673, 0xb20e, 0xba0f, 0x262a, 0xa308, 0x2693, 0x1e06, 0x424b, 0xb096, 0x439f, 0x36fa, 0x42d6, 0xb06a, 0x40fb, 0xbf13, 0xaa9f, 0x1d6c, 0xb2e0, 0x4363, 0x10e8, 0x1c58, 0xb290, 0xb072, 0x2deb, 0x421e, 0x1897, 0x4154, 0xab61, 0xba24, 0xbf70, 0x4326, 0x406a, 0x4595, 0x4169, 0xb228, 0x1e7f, 0xb20d, 0x188c, 0xb2a2, 0x1263, 0x0cbc, 0x46b0, 0xbf37, 0x42b0, 0x4374, 0x4312, 0x2515, 0xaa4a, 0x4150, 0x41fb, 0x434e, 0x42e0, 0x42f6, 0x408c, 0x26be, 0x42ea, 0x1edf, 0x1c47, 0x402c, 0x435e, 0xbf59, 0x3faf, 0x4462, 0xba3f, 0xb27d, 0xbf9d, 0x4207, 0xaede, 0xb223, 0x437f, 0x1786, 0x42a8, 0x4262, 0xb294, 0x1a29, 0xb2d6, 0x40cf, 0x1804, 0x42cb, 0xb025, 0xb265, 0x4298, 0xba0b, 0x4627, 0xb2d2, 0x40b4, 0xbf9b, 0x407c, 0x42b8, 0x18d0, 0xb2d0, 0xa7c8, 0x3b60, 0xb259, 0x2e49, 0xb228, 0x42dd, 0xb2b1, 0x237d, 0x43cd, 0x4001, 0x1a2b, 0xba71, 0xbf3f, 0x15f9, 0xb095, 0x01dc, 0x365f, 0x142e, 0xab9e, 0x4242, 0x4629, 0x424d, 0xb229, 0x404c, 0x0a33, 0x41a0, 0x455f, 0x077d, 0x1eb8, 0x1ba4, 0x13d8, 0x3aba, 0x1dbd, 0x4289, 0xbfca, 0x4253, 0x31bd, 0xb025, 0x27c1, 0x42dc, 0x1909, 0x37cd, 0xb28f, 0x43f0, 0x42af, 0x4185, 0xba6f, 0x466a, 0x15c5, 0x42e2, 0x3d8e, 0xba2d, 0x27ef, 0x45e6, 0xbfa3, 0x4204, 0x41b6, 0xb2bc, 0x4025, 0xbf67, 0x0886, 0x3457, 0x1cc4, 0x276c, 0x42a4, 0x3f63, 0xbad3, 0xbf16, 0xba62, 0xb087, 0x1e84, 0x4015, 0xb068, 0x31ca, 0x411e, 0x1fd1, 0xb01f, 0x4607, 0x1d77, 0x461c, 0x43cc, 0x401f, 0xb2b5, 0xa43d, 0xba66, 0xb28b, 0xbf16, 0xb209, 0x4097, 0x417e, 0x40bb, 0xa1b2, 0x4443, 0x4042, 0x405c, 0x1bfc, 0xba06, 0xb098, 0xb014, 0x40ec, 0x4159, 0x417a, 0xb2a6, 0x2ff6, 0xb21b, 0x44f8, 0x420a, 0xb239, 0x4156, 0xbf12, 0x1d1f, 0x42b6, 0xba5f, 0xb0a9, 0xbfe2, 0x43bd, 0x4384, 0x44bd, 0x4085, 0x43e4, 0x199f, 0x41bc, 0x186b, 0x429b, 0xb285, 0x1bf3, 0xb0ec, 0x4155, 0x40ff, 0x4019, 0x439f, 0xb0ad, 0x35bd, 0x21d8, 0x417f, 0x434d, 0x180b, 0x1a8d, 0xab25, 0xba3e, 0x1832, 0xbf37, 0x40f9, 0x427a, 0x4184, 0xba66, 0xba18, 0x4022, 0xbf60, 0xb2cc, 0xb2f2, 0x4127, 0x433b, 0xb0bc, 0xba3c, 0x4189, 0x439d, 0xb0e3, 0x4685, 0x3f24, 0x1d66, 0xbf08, 0x43c5, 0xb2de, 0x40f3, 0x183e, 0x430c, 0x40ea, 0x19e2, 0x1cd2, 0x1cf6, 0x3a92, 0xb0d3, 0xb2c3, 0x4236, 0x4313, 0x3162, 0x406d, 0xbf90, 0x42d3, 0x46d4, 0x40e9, 0x41a1, 0xa0cc, 0x4071, 0xba15, 0xbfa3, 0x3d16, 0x4361, 0x4247, 0x04b4, 0xb0ee, 0x1f85, 0x3042, 0x41a7, 0xb242, 0x428b, 0x4322, 0x420e, 0x38df, 0x4083, 0x41f9, 0x06c0, 0x420b, 0xb2a2, 0xb20f, 0xbf63, 0x4148, 0x0544, 0x4066, 0xa5e5, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x1ad1dd6f, 0x8a780aab, 0x92d86fe7, 0x3dcc1243, 0x715b8d62, 0xdd61381a, 0x5655e1f0, 0x38a9fd45, 0x5503834e, 0x5c5e12c5, 0xc6ca1316, 0xf112ee7a, 0x4c667450, 0xbace516f, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0x78000000, 0xe27ff7b4, 0x00000000, 0x00000000, 0xff7c0000, 0x00001b68, 0xa713ffdf, 0xfffff7b4, 0x05001840, 0x00000000, 0x1bcd9664, 0xf112ee7a, 0x1bcd9664, 0xa713fcfc, 0x00000000, 0x600001d0 }, + Instructions = [0xb2ea, 0x42ba, 0x46c5, 0x422b, 0x1be5, 0x02d1, 0x1caa, 0x41bc, 0x43bd, 0x1dfd, 0xa8ec, 0xb044, 0x0ec5, 0x0aa4, 0x4022, 0x45c5, 0xb00b, 0x42da, 0x04c3, 0x00d9, 0x1e50, 0xbf03, 0x4184, 0x4254, 0xb282, 0x00fc, 0xb041, 0xb27c, 0xbafd, 0x18fc, 0x417c, 0x41d6, 0x4313, 0xba21, 0xb237, 0xbfb4, 0xb29f, 0xb260, 0x1acf, 0x21b0, 0xb062, 0xbac1, 0xbacb, 0x41aa, 0x1399, 0xb255, 0xb28d, 0x1f91, 0x408a, 0x1391, 0xb200, 0x40ba, 0x4234, 0xbad2, 0x4031, 0x417a, 0x43fe, 0x40ff, 0x4131, 0x44c2, 0xbf6d, 0xba23, 0xb22a, 0x1a46, 0x432b, 0x1a26, 0x1525, 0x4148, 0x421b, 0x3ac6, 0xba73, 0xb007, 0x448c, 0xb211, 0x40e9, 0xba0c, 0x2a7e, 0x409b, 0x4478, 0x4495, 0xba61, 0x40e5, 0x465d, 0x4110, 0xb07e, 0xbf04, 0x4174, 0x1ce1, 0xb2b7, 0xb26a, 0x40e2, 0x11ea, 0x091b, 0x46d5, 0x1def, 0x4351, 0x4244, 0x405a, 0x4109, 0xa87b, 0xb249, 0x44b1, 0xba4f, 0xb038, 0xb083, 0xbff0, 0x4016, 0x43f0, 0xb092, 0x03f6, 0x19ad, 0x4287, 0xbf76, 0x43b0, 0x4356, 0x3e6a, 0x1aa0, 0x41c5, 0xb2d4, 0x1cb6, 0xba0c, 0x43ce, 0x45f2, 0xb066, 0x361b, 0x294f, 0x4133, 0xaa78, 0x4659, 0x4019, 0x4310, 0x4158, 0x412d, 0x4077, 0x41d9, 0xba7e, 0xbf96, 0x112e, 0x3932, 0xb0cf, 0x4395, 0x4237, 0x2cd3, 0x35bb, 0x03ff, 0x3c3f, 0xa63b, 0x4352, 0x4110, 0x04e4, 0xaad1, 0xb05a, 0xb2af, 0x4101, 0x4309, 0x43c7, 0xa7cc, 0x1b1d, 0xb2bc, 0x42b2, 0x446d, 0x42e2, 0x4044, 0xbfae, 0xbfd0, 0xa92b, 0x2ca8, 0xba7a, 0x0c15, 0x18af, 0x10c6, 0x4125, 0x411c, 0xb290, 0x40c7, 0x38e2, 0x425a, 0x26d4, 0x45ca, 0x46b5, 0xa9af, 0xbfab, 0x401a, 0x3480, 0x43e2, 0xb205, 0xb06b, 0xb0ce, 0x4213, 0xba35, 0x42d3, 0x1d9c, 0x40c8, 0x43dd, 0x42cc, 0x264c, 0x0f86, 0xbf8a, 0x18b3, 0xb0b6, 0xbff0, 0x08c3, 0x146a, 0x43a1, 0xbfad, 0xb024, 0x419b, 0xada4, 0xb207, 0xa205, 0xb2b0, 0x4013, 0x1ffc, 0xb2dc, 0xb2a6, 0x4189, 0xa033, 0x373b, 0xa54c, 0x4229, 0x1f08, 0xbf17, 0x426b, 0xbf90, 0x18ca, 0xa154, 0x41c6, 0x3c30, 0x426a, 0x431a, 0x1add, 0xb0d0, 0xad69, 0x1d25, 0xbf1f, 0xb2c7, 0x26fe, 0x1dc6, 0xacb6, 0xba38, 0x4554, 0x19cd, 0x4167, 0xa82c, 0xb2d0, 0x15fe, 0x2a17, 0x43cf, 0x45bc, 0x4002, 0x438b, 0xb24a, 0x1bca, 0xb00a, 0x40e5, 0x4367, 0xbfa5, 0x425c, 0x1a88, 0x0641, 0x41e3, 0xb22c, 0xb245, 0x42d5, 0xb23f, 0x4615, 0x43fc, 0xbaed, 0x4272, 0x414c, 0xbf31, 0x41c1, 0xb2df, 0xb2cb, 0x402b, 0x42a6, 0x4356, 0xbf3e, 0xb2e9, 0x2814, 0xbfa0, 0x4143, 0xbfe0, 0x0b79, 0x1b81, 0x38a3, 0x412f, 0x20d2, 0x4068, 0x42cb, 0xbae8, 0x2a4f, 0x1d57, 0xb09d, 0x4168, 0xb208, 0x41e9, 0x408c, 0x357e, 0x469d, 0x43eb, 0x4189, 0xbac2, 0x40d8, 0x4580, 0xbf7a, 0x0b11, 0x4070, 0x4471, 0x43f4, 0x43b0, 0x4586, 0xba4a, 0x346a, 0xa7e9, 0x43b2, 0xbac3, 0x0423, 0x40d6, 0x248d, 0x40a5, 0x420a, 0x438f, 0x427b, 0x4202, 0x31ec, 0x2e50, 0xba26, 0xbf5e, 0x41f2, 0xb08f, 0x42ab, 0x2f2e, 0x4111, 0xbfd0, 0x4324, 0x40de, 0x4236, 0xba1b, 0x02e1, 0x3f0c, 0x0a8d, 0xa1e9, 0x092b, 0x42d4, 0x45dd, 0x43f4, 0x3b18, 0xaff9, 0xba2f, 0xba68, 0xb0de, 0x19b1, 0xbf37, 0x43c5, 0x1642, 0x41d7, 0xbf00, 0x311f, 0xbfd0, 0x4254, 0x423a, 0x4124, 0x1eb4, 0x4364, 0x4365, 0x40e0, 0xbf3e, 0x3c12, 0x43c1, 0x2fbc, 0xb0bd, 0xbac3, 0x4014, 0x41f6, 0x40dc, 0x40ac, 0x4330, 0x1e86, 0x438b, 0xb0d0, 0xac1f, 0x055f, 0x378c, 0x1f34, 0x1f9c, 0x0795, 0xb0c8, 0x410b, 0x4050, 0xbfdb, 0x41eb, 0x3e25, 0x4171, 0x432d, 0xb2d0, 0xb25f, 0xb281, 0x41e1, 0x432f, 0x4073, 0xbf60, 0x40fc, 0xbaf7, 0xb0ba, 0xaac8, 0x4318, 0x410c, 0xa369, 0xb08a, 0x42f8, 0x1c9b, 0xbf78, 0x34a5, 0x3209, 0xadae, 0x4272, 0x0d71, 0xa43d, 0x1180, 0x4229, 0x0689, 0x4313, 0xb208, 0x444c, 0x3a48, 0xba19, 0x4007, 0x4107, 0x2a6a, 0x41be, 0xb2ee, 0xbf42, 0x4332, 0x1870, 0x10cb, 0xb078, 0x411f, 0x29f2, 0xbfe0, 0x20df, 0x41f2, 0x39f3, 0x3ecf, 0x42fc, 0x1623, 0x43a9, 0xbf73, 0x40e3, 0x43ff, 0x40d3, 0x0ef5, 0x43a4, 0xb2aa, 0x4187, 0x403a, 0x1b1c, 0xb0be, 0x354e, 0xb09c, 0x402c, 0x2b3a, 0x0e11, 0x1335, 0xbf60, 0x44f1, 0x2ecf, 0x1b37, 0xb235, 0xb244, 0x428b, 0xb0bb, 0xb2d6, 0x19a6, 0x4589, 0xbf04, 0x1a8c, 0xb277, 0x13d1, 0x4394, 0x1f6f, 0xab11, 0x4335, 0x40f2, 0xb0b6, 0x1fb6, 0x403c, 0x40b0, 0x4274, 0x4345, 0x4282, 0x2a39, 0xb2e2, 0x4327, 0x4278, 0x44ab, 0xb014, 0x2313, 0x425e, 0x41e4, 0xbf6f, 0x1cd2, 0x40c1, 0x3319, 0x40dc, 0x43a4, 0x1839, 0x0638, 0x42b7, 0xbf17, 0x42b9, 0x0c5b, 0xb0e4, 0xb29a, 0xba78, 0xb290, 0x1ed9, 0xbf05, 0xb2ff, 0x42dc, 0x4253, 0x417a, 0x4304, 0x16d8, 0x3184, 0xb257, 0x3bd3, 0x419f, 0x3bd5, 0x4068, 0x10b7, 0x0f9e, 0x40a9, 0x4263, 0x414f, 0x43cd, 0xbfd0, 0xb0d9, 0x411e, 0xb26b, 0x3f5f, 0xbad3, 0x148b, 0x187a, 0x42ce, 0xb296, 0x1d75, 0xbf15, 0x4637, 0x42d9, 0x44d8, 0x4089, 0x05a3, 0x43d8, 0x43ad, 0x4091, 0xb21a, 0xb2bd, 0x4027, 0x1a6a, 0x40a2, 0x41ac, 0xa8f3, 0x41f9, 0xbf31, 0x4345, 0x3a56, 0xa529, 0x4215, 0x2faa, 0xb2b4, 0x195b, 0xb275, 0x4181, 0xba12, 0x43a6, 0x43f5, 0x315d, 0x4629, 0x1d9f, 0xbf94, 0x4212, 0x417b, 0x417c, 0xbfd1, 0x4614, 0x427d, 0x4140, 0xb2ae, 0x41ad, 0x1f90, 0x4286, 0x42ff, 0xac6c, 0xa113, 0xb29a, 0xb2e0, 0x0304, 0x46ed, 0xb2b4, 0xbf2c, 0x1079, 0x4056, 0x424b, 0x40b0, 0x43c2, 0x400d, 0xb2ba, 0xa574, 0x4354, 0x1145, 0x4567, 0x46a9, 0xba63, 0x4684, 0x4259, 0x4396, 0xb231, 0x4388, 0x4047, 0x40c5, 0x42b9, 0xba19, 0x31fc, 0xb012, 0x4154, 0x1a7b, 0x435c, 0xbf3b, 0x4211, 0x4136, 0xafba, 0x1a25, 0x4348, 0xb049, 0xba0e, 0xba6d, 0x43bd, 0xb231, 0xb2b6, 0x464e, 0x17cd, 0x4050, 0x438a, 0x410a, 0x41f7, 0x0d50, 0x41f6, 0x433c, 0xb0a6, 0xbaca, 0x40c2, 0xbf48, 0x4210, 0xbfc6, 0xba0c, 0xba18, 0x4641, 0xb2b3, 0x404f, 0x44f0, 0x4317, 0x2b5f, 0x4077, 0x458e, 0x1005, 0xb2a4, 0xbf42, 0x1ce5, 0x10f8, 0x4340, 0x43ca, 0xbfe0, 0x182e, 0x38a8, 0xa2ad, 0x42ed, 0x4592, 0x2346, 0xbf70, 0x43a2, 0x4037, 0x1360, 0xbafe, 0xb0bb, 0x43b2, 0x19c0, 0xbfa1, 0x4336, 0x4397, 0x1f3f, 0xba20, 0xb0e4, 0x4134, 0x1e98, 0x1926, 0xba44, 0x434d, 0xb087, 0x4673, 0xb20e, 0xba0f, 0x262a, 0xa308, 0x2693, 0x1e06, 0x424b, 0xb096, 0x439f, 0x36fa, 0x42d6, 0xb06a, 0x40fb, 0xbf13, 0xaa9f, 0x1d6c, 0xb2e0, 0x4363, 0x10e8, 0x1c58, 0xb290, 0xb072, 0x2deb, 0x421e, 0x1897, 0x4154, 0xab61, 0xba24, 0xbf70, 0x4326, 0x406a, 0x4595, 0x4169, 0xb228, 0x1e7f, 0xb20d, 0x188c, 0xb2a2, 0x1263, 0x0cbc, 0x46b0, 0xbf37, 0x42b0, 0x4374, 0x4312, 0x2515, 0xaa4a, 0x4150, 0x41fb, 0x434e, 0x42e0, 0x42f6, 0x408c, 0x26be, 0x42ea, 0x1edf, 0x1c47, 0x402c, 0x435e, 0xbf59, 0x3faf, 0x4462, 0xba3f, 0xb27d, 0xbf9d, 0x4207, 0xaede, 0xb223, 0x437f, 0x1786, 0x42a8, 0x4262, 0xb294, 0x1a29, 0xb2d6, 0x40cf, 0x1804, 0x42cb, 0xb025, 0xb265, 0x4298, 0xba0b, 0x4627, 0xb2d2, 0x40b4, 0xbf9b, 0x407c, 0x42b8, 0x18d0, 0xb2d0, 0xa7c8, 0x3b60, 0xb259, 0x2e49, 0xb228, 0x42dd, 0xb2b1, 0x237d, 0x43cd, 0x4001, 0x1a2b, 0xba71, 0xbf3f, 0x15f9, 0xb095, 0x01dc, 0x365f, 0x142e, 0xab9e, 0x4242, 0x4629, 0x424d, 0xb229, 0x404c, 0x0a33, 0x41a0, 0x455f, 0x077d, 0x1eb8, 0x1ba4, 0x13d8, 0x3aba, 0x1dbd, 0x4289, 0xbfca, 0x4253, 0x31bd, 0xb025, 0x27c1, 0x42dc, 0x1909, 0x37cd, 0xb28f, 0x43f0, 0x42af, 0x4185, 0xba6f, 0x466a, 0x15c5, 0x42e2, 0x3d8e, 0xba2d, 0x27ef, 0x45e6, 0xbfa3, 0x4204, 0x41b6, 0xb2bc, 0x4025, 0xbf67, 0x0886, 0x3457, 0x1cc4, 0x276c, 0x42a4, 0x3f63, 0xbad3, 0xbf16, 0xba62, 0xb087, 0x1e84, 0x4015, 0xb068, 0x31ca, 0x411e, 0x1fd1, 0xb01f, 0x4607, 0x1d77, 0x461c, 0x43cc, 0x401f, 0xb2b5, 0xa43d, 0xba66, 0xb28b, 0xbf16, 0xb209, 0x4097, 0x417e, 0x40bb, 0xa1b2, 0x4443, 0x4042, 0x405c, 0x1bfc, 0xba06, 0xb098, 0xb014, 0x40ec, 0x4159, 0x417a, 0xb2a6, 0x2ff6, 0xb21b, 0x44f8, 0x420a, 0xb239, 0x4156, 0xbf12, 0x1d1f, 0x42b6, 0xba5f, 0xb0a9, 0xbfe2, 0x43bd, 0x4384, 0x44bd, 0x4085, 0x43e4, 0x199f, 0x41bc, 0x186b, 0x429b, 0xb285, 0x1bf3, 0xb0ec, 0x4155, 0x40ff, 0x4019, 0x439f, 0xb0ad, 0x35bd, 0x21d8, 0x417f, 0x434d, 0x180b, 0x1a8d, 0xab25, 0xba3e, 0x1832, 0xbf37, 0x40f9, 0x427a, 0x4184, 0xba66, 0xba18, 0x4022, 0xbf60, 0xb2cc, 0xb2f2, 0x4127, 0x433b, 0xb0bc, 0xba3c, 0x4189, 0x439d, 0xb0e3, 0x4685, 0x3f24, 0x1d66, 0xbf08, 0x43c5, 0xb2de, 0x40f3, 0x183e, 0x430c, 0x40ea, 0x19e2, 0x1cd2, 0x1cf6, 0x3a92, 0xb0d3, 0xb2c3, 0x4236, 0x4313, 0x3162, 0x406d, 0xbf90, 0x42d3, 0x46d4, 0x40e9, 0x41a1, 0xa0cc, 0x4071, 0xba15, 0xbfa3, 0x3d16, 0x4361, 0x4247, 0x04b4, 0xb0ee, 0x1f85, 0x3042, 0x41a7, 0xb242, 0x428b, 0x4322, 0x420e, 0x38df, 0x4083, 0x41f9, 0x06c0, 0x420b, 0xb2a2, 0xb20f, 0xbf63, 0x4148, 0x0544, 0x4066, 0xa5e5, 0x4770, 0xe7fe + ], + StartRegs = [0x1ad1dd6f, 0x8a780aab, 0x92d86fe7, 0x3dcc1243, 0x715b8d62, 0xdd61381a, 0x5655e1f0, 0x38a9fd45, 0x5503834e, 0x5c5e12c5, 0xc6ca1316, 0xf112ee7a, 0x4c667450, 0xbace516f, 0x00000000, 0x200001f0 + ], + FinalRegs = [0x78000000, 0xe27ff7b4, 0x00000000, 0x00000000, 0xff7c0000, 0x00001b68, 0xa713ffdf, 0xfffff7b4, 0x05001840, 0x00000000, 0x1bcd9664, 0xf112ee7a, 0x1bcd9664, 0xa713fcfc, 0x00000000, 0x600001d0 + ], }, new() { - Instructions = new ushort[] { 0x43ea, 0xb039, 0xb0f0, 0x4163, 0x08a9, 0xba5c, 0x410d, 0x06ef, 0x42b8, 0xb095, 0x4045, 0x456a, 0xbf74, 0xabfb, 0x4084, 0x159e, 0xb230, 0x4372, 0xb005, 0x404f, 0x4017, 0x43f0, 0x43da, 0x40c7, 0xbf9f, 0x4207, 0x44c0, 0x0047, 0x0b05, 0xbf7b, 0xbfe0, 0x4057, 0x1d47, 0x1f0f, 0x40b2, 0x403c, 0xb09f, 0x03e8, 0x4246, 0xb26d, 0xb26c, 0xbf04, 0x42d6, 0xb040, 0x4631, 0x4092, 0x430e, 0xbf00, 0x40cc, 0xb243, 0x214e, 0x06a1, 0xbfc6, 0x40b0, 0x4631, 0x43cd, 0x4340, 0x13ca, 0x14d1, 0x4603, 0x4079, 0x2c83, 0x421d, 0xbacb, 0xafa3, 0x409c, 0xb2f9, 0xa17d, 0x30ee, 0xba61, 0x4207, 0x0a66, 0x420d, 0x4189, 0x41ea, 0x20f3, 0x42b9, 0xb20d, 0xa046, 0x4388, 0xb2bc, 0xbf7c, 0xb010, 0x43a3, 0xb21d, 0xb22f, 0xb2c8, 0x40bb, 0x19aa, 0xa4a9, 0xac73, 0x4296, 0x2be3, 0x0f78, 0x4107, 0x421a, 0x16f8, 0x427c, 0x444b, 0xbacb, 0x40b4, 0x0480, 0xb0b8, 0xba71, 0x402b, 0x40b5, 0x46a8, 0xbf34, 0xb25d, 0x2418, 0xaac1, 0xb251, 0x2ca1, 0xbf60, 0x4012, 0xbae5, 0xba4d, 0xba63, 0x4172, 0x41bd, 0xa74e, 0xbad9, 0x1f15, 0xb2d0, 0xb26e, 0x2e39, 0x413e, 0x4026, 0x4136, 0xb0eb, 0xb2fe, 0x4211, 0xbf76, 0x44fb, 0x43da, 0x3f14, 0x01c4, 0x41d7, 0x41ee, 0x0326, 0x237a, 0xb026, 0xbfbf, 0xb286, 0x40d8, 0x183c, 0xb2fc, 0x43cd, 0x41d4, 0x1b4c, 0x42c7, 0x03da, 0x4156, 0x40ce, 0x1888, 0x02d2, 0xba79, 0x40ef, 0x4081, 0xb23b, 0x4099, 0x417b, 0xbfa0, 0x4152, 0x4158, 0xbff0, 0xad95, 0x4477, 0x4176, 0x4132, 0xbadb, 0xbf0c, 0xba3a, 0x43e2, 0x1e39, 0x438f, 0x2393, 0x413b, 0x423d, 0xba05, 0x30e8, 0x4383, 0x4081, 0x1dc3, 0xba17, 0xbf9b, 0x294d, 0xac43, 0x18c2, 0x4362, 0xb2d4, 0x4349, 0x420d, 0x42a7, 0x42df, 0x2363, 0x40c8, 0x226c, 0x417a, 0xbfd0, 0x435c, 0x411d, 0xb07f, 0xba54, 0x1da1, 0xa883, 0x1b72, 0x4022, 0x43cf, 0x129b, 0x0952, 0x1a40, 0x1aaf, 0xbf3a, 0x406e, 0xb274, 0xb0a9, 0xbfe0, 0xba4e, 0x4004, 0x38de, 0x41cc, 0x4167, 0xb2a4, 0x413b, 0x1b27, 0xb072, 0x1ed4, 0x3b32, 0xb237, 0xb0fe, 0x1821, 0x414d, 0x41f1, 0x42b0, 0xbf1b, 0x426e, 0x460d, 0x4246, 0x41b1, 0x1c38, 0x4473, 0x413c, 0x4143, 0x24b8, 0x43bf, 0x43dc, 0x3a1b, 0x41fd, 0x4386, 0xba70, 0x41e7, 0x2256, 0x4086, 0x4341, 0x1af4, 0xb21b, 0xbfa0, 0x1f37, 0x4598, 0x431d, 0xbf63, 0x2db5, 0x416c, 0x428d, 0xb2a5, 0x4558, 0xb2f6, 0x41a8, 0x4014, 0x43f5, 0x33d6, 0x41cb, 0xb268, 0x4275, 0xb023, 0x438e, 0xbfe4, 0x415e, 0x19b9, 0x468a, 0xb252, 0x3626, 0x43ea, 0x2d17, 0x40aa, 0x42aa, 0xbfe0, 0x43a3, 0x1b9b, 0xba61, 0x4330, 0x0dbd, 0xa126, 0x40c7, 0x41de, 0xbfc6, 0x404d, 0x46a4, 0x4647, 0x4340, 0x40c8, 0xbf80, 0x42c4, 0x1df3, 0xbf90, 0xa7ac, 0xba4e, 0x4308, 0x0dac, 0xba47, 0x1d7a, 0xb06e, 0x3e91, 0x2e8b, 0x4008, 0x1c78, 0xb219, 0x4161, 0x410d, 0x4076, 0xbf9d, 0xa660, 0x422a, 0x42f6, 0x19e9, 0xbf9a, 0x43fb, 0x421e, 0xb28a, 0x40a0, 0xa3a0, 0x4081, 0x1990, 0xba24, 0xbf02, 0x41d5, 0x4078, 0x4176, 0xba52, 0x1f86, 0xb042, 0x430f, 0x2816, 0x428f, 0x4084, 0xa29f, 0xb019, 0xbfc8, 0x432c, 0x40a9, 0x40a3, 0x1b29, 0x43f5, 0x3867, 0x40cd, 0x4330, 0xb277, 0x3830, 0x41d4, 0xb083, 0x4164, 0x36a6, 0x4082, 0x4141, 0x1167, 0xb2fa, 0x1a54, 0x4284, 0x43e4, 0xa27e, 0xa4e3, 0x413d, 0xbf9a, 0x08da, 0x1b35, 0x4385, 0xb232, 0x4166, 0x422c, 0xbf90, 0x412f, 0xbf2f, 0x41b9, 0x1b51, 0xba0c, 0xbfb0, 0xba34, 0xbf8f, 0x1d3d, 0x30c1, 0x439c, 0x4543, 0xb2d0, 0x1fef, 0x4359, 0x4167, 0xb29f, 0x4331, 0xb2f5, 0x4308, 0xa8a7, 0xba06, 0x400f, 0x43e8, 0x246f, 0x4206, 0x416f, 0xb22c, 0x4043, 0x42b3, 0xbacd, 0x41ac, 0xb280, 0x27e3, 0xbf44, 0x402b, 0x4009, 0xb22b, 0x423d, 0xb28a, 0xb234, 0x4114, 0x42c3, 0x2c01, 0x4344, 0x40a0, 0x41e8, 0x180b, 0x259d, 0x4296, 0x0859, 0x4004, 0xbf6e, 0x43a3, 0x42ca, 0x409f, 0xbaca, 0x1c37, 0x4085, 0x40c7, 0x4113, 0xbac5, 0xb02d, 0x1c91, 0x3cb2, 0x0819, 0x4352, 0x432f, 0x3f57, 0x3c39, 0x43a0, 0xb063, 0x430f, 0x4374, 0x4131, 0xbf52, 0x43d4, 0x432d, 0x07d6, 0xa457, 0x431b, 0xad5a, 0xb24f, 0x16dd, 0xb026, 0x22aa, 0x432c, 0xa6c9, 0x41f6, 0xac8c, 0xb07d, 0xa40a, 0x4137, 0xbf95, 0x3196, 0x41e4, 0xb2c0, 0x4362, 0xb24b, 0x407a, 0x4093, 0xbfdf, 0x0cd1, 0x3b7c, 0x427f, 0x4312, 0xa0a2, 0x20fd, 0x41cc, 0xba31, 0x424e, 0x1aa4, 0xbacb, 0xb26a, 0x4048, 0x4416, 0x43e5, 0x42d4, 0xba20, 0xbf8f, 0x4079, 0xb27e, 0x4271, 0x40ee, 0x466d, 0x2d6c, 0x1843, 0x4083, 0x4327, 0x0cc7, 0x4582, 0xbf6f, 0x424c, 0xafb3, 0x41a0, 0x4239, 0x4404, 0xbf80, 0x418d, 0x43e0, 0x1ab2, 0xbfaf, 0x43ab, 0x4357, 0x42cb, 0xb0bf, 0xba12, 0x1396, 0x41de, 0x4116, 0x2112, 0x1b76, 0x4007, 0x44e9, 0xb224, 0x14d0, 0x402d, 0x412e, 0xb2d1, 0x2afc, 0x42f2, 0x1eca, 0x3412, 0x4472, 0x4252, 0x40cd, 0xb0fa, 0x0898, 0xbf79, 0xbaca, 0x3752, 0x0b3b, 0x1f37, 0x3758, 0x42b8, 0x43bd, 0x01e7, 0x42d1, 0x400a, 0xb044, 0xb2c6, 0x40bb, 0x4384, 0x3f19, 0x43ae, 0xba2c, 0x05ef, 0xb211, 0x1e3a, 0x437d, 0xbfa0, 0xbf7b, 0xb0a2, 0x4326, 0x1c73, 0x425b, 0x412d, 0x44d0, 0x11c1, 0x1b69, 0xb2c3, 0x1f89, 0xa6b4, 0x2ed9, 0x418d, 0x1ccb, 0xaa53, 0x402d, 0x1a6b, 0x3c2d, 0x4622, 0xb2c7, 0xa4b8, 0x4066, 0x45cb, 0x10a2, 0x4010, 0x41bb, 0x4300, 0xbf15, 0xb0b0, 0xba4e, 0xb29f, 0x1d46, 0xba36, 0x43b8, 0x0c37, 0x4499, 0x1bcf, 0xae12, 0xb26a, 0x42d5, 0x4362, 0x25db, 0xba02, 0xb29e, 0x3650, 0x4564, 0x4158, 0x1d0e, 0x4132, 0x4237, 0xb06f, 0x4377, 0xbf92, 0xbfb0, 0x4151, 0x443e, 0x439f, 0x43af, 0xaf28, 0x4151, 0x40d7, 0x40c7, 0x070e, 0x467f, 0xb226, 0x4418, 0xb016, 0x4288, 0xb009, 0x3e9f, 0x2434, 0x45f5, 0xb0a5, 0x1b5f, 0xb270, 0xbf39, 0xb2b4, 0x4093, 0x169a, 0x43c0, 0x29c4, 0xbf61, 0x4206, 0x2bcc, 0x401c, 0x43b0, 0x432e, 0x07bf, 0x40a7, 0x1b14, 0xb09b, 0x1a2b, 0xa498, 0xbaf3, 0x4204, 0x415b, 0xb02f, 0x42c9, 0x4264, 0x40eb, 0x40b9, 0x2f8a, 0x162c, 0x1b93, 0x18c7, 0x40d6, 0x4484, 0xbf63, 0x407b, 0x40cc, 0x19bd, 0x4106, 0xbaec, 0x4076, 0x4271, 0xadcc, 0x42b6, 0xbf12, 0xb2fc, 0xb267, 0x40ea, 0x40c4, 0x34ed, 0xba7e, 0x0e23, 0xae59, 0xbf4a, 0x0743, 0x43d7, 0x42dd, 0x4097, 0x40ed, 0x40a8, 0x45ed, 0x1e93, 0xb213, 0x1c3b, 0x0ea9, 0x420d, 0xb038, 0xba5a, 0x42ed, 0x41e0, 0x41b2, 0x4327, 0x19c5, 0x42d8, 0x26fb, 0x43fd, 0x0f88, 0x43a7, 0x1c9b, 0xb207, 0xbfc9, 0xb2c5, 0x430a, 0x2512, 0x4356, 0x41ed, 0x4078, 0x40c0, 0xbf99, 0x4141, 0xba72, 0x4226, 0x42d0, 0xb2b2, 0x4150, 0x42d1, 0xb04c, 0xba33, 0x2f36, 0x45b0, 0x18b0, 0x1d78, 0xbf43, 0x426a, 0x4350, 0x4287, 0x406a, 0x1911, 0x4199, 0x4074, 0xbf9a, 0x43f2, 0x4344, 0x41f6, 0x0efc, 0x30a0, 0x2e3e, 0x4359, 0xb261, 0x46b5, 0x4164, 0x25dd, 0x0839, 0xa6d1, 0x4181, 0x4627, 0x419a, 0xba3a, 0xbf16, 0x3ee3, 0x158a, 0x407d, 0x424f, 0xba32, 0xb212, 0x41f9, 0xb019, 0xbf80, 0xbfa0, 0xb2af, 0xb2bb, 0xb21e, 0x427c, 0x441b, 0x40e7, 0x3e04, 0xba75, 0xbfde, 0x40dc, 0x4278, 0x2b7d, 0x3966, 0xb06e, 0x1733, 0x465b, 0x4185, 0xb2f9, 0x42dd, 0xb246, 0xbff0, 0xb019, 0x42e4, 0xb259, 0x42a0, 0xba79, 0x18d5, 0x2f05, 0x4093, 0xbf7d, 0x2891, 0x423a, 0xb201, 0xb001, 0x1ce7, 0x1de1, 0xbafd, 0xb2b0, 0x42d6, 0x41f4, 0x206e, 0xb0b6, 0x3d9b, 0x3156, 0xbff0, 0x4483, 0x46d2, 0x41bb, 0x22a6, 0x413e, 0x4180, 0x3d93, 0x46f3, 0xb2e1, 0x4064, 0x42b4, 0xb279, 0xbf6c, 0x41fd, 0x42a1, 0x396b, 0x1383, 0x42ec, 0x1e32, 0x4564, 0x312c, 0x416f, 0x43be, 0x2633, 0x1e58, 0xb29b, 0x415a, 0x384f, 0x43ec, 0x428a, 0xbad6, 0x40bb, 0xba2d, 0xbf3b, 0x41fb, 0xb26f, 0x4208, 0x407e, 0xbacd, 0x1bb6, 0xbf6c, 0x435d, 0x41db, 0x2381, 0x402e, 0x4278, 0x40cb, 0xba40, 0xbac3, 0x3c20, 0x3b4a, 0x1a38, 0x437d, 0x4100, 0x40d5, 0xb0fd, 0x46c4, 0xbfdf, 0x4251, 0xba51, 0x42c7, 0x0106, 0x0ab7, 0x1cf3, 0xa039, 0x1e55, 0x42b5, 0x43c6, 0x4614, 0x409c, 0x4383, 0xbf76, 0x45f3, 0x01b8, 0xb045, 0xba1d, 0x4000, 0xbfe0, 0x41ac, 0x42e8, 0xb055, 0xa8af, 0x4413, 0x3917, 0xba4b, 0x42a6, 0xb097, 0x3a05, 0x410d, 0x43a3, 0xa1f5, 0xba69, 0x4164, 0x295b, 0xb0d1, 0x43d5, 0xbf6d, 0x0b74, 0x41c4, 0xba32, 0x1c4d, 0x40cf, 0x41c7, 0x4591, 0xa4d4, 0x4376, 0x131b, 0x42f1, 0x4308, 0x42a9, 0x1d4d, 0x41bc, 0x425f, 0x42b1, 0xacd1, 0xaa4f, 0x45de, 0x0d5f, 0x270c, 0x1e62, 0x4353, 0x4113, 0x2cc0, 0xa57c, 0x1eba, 0x4153, 0xbfa8, 0x413a, 0x41be, 0xbf2f, 0x22f9, 0xada0, 0x4171, 0xb2fc, 0x458e, 0x405a, 0x4119, 0x42a9, 0xae09, 0x435e, 0x1c93, 0xbf32, 0x1d79, 0x401d, 0x4098, 0xbfa0, 0x3409, 0x41d9, 0x46a1, 0xbfa3, 0x2470, 0x4583, 0x41be, 0xb295, 0x1aab, 0x319a, 0xbf97, 0x1b2d, 0x0205, 0x424c, 0x41a8, 0x433f, 0xbae9, 0xba25, 0xbfd0, 0x43ab, 0x401c, 0x2ddb, 0x3ade, 0x404a, 0x4203, 0xb2b9, 0x4559, 0xba40, 0xaa0b, 0x3a83, 0xa48e, 0x4288, 0x10f8, 0x40fd, 0xbfd2, 0xb09f, 0x4280, 0x40bf, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3dfcb14d, 0x03113440, 0x43d4feab, 0xf4773a5f, 0x012ea932, 0x9dad9d54, 0xf24b822f, 0x4f0bd97c, 0x95955220, 0xe3991301, 0xb50130a1, 0xe8c03445, 0x19b5cca3, 0x0afb31b9, 0x00000000, 0x000001f0 }, - FinalRegs = new uint[] { 0x00000001, 0x0000000c, 0x3bae2320, 0x00000000, 0x00001a18, 0x0006677f, 0x54cd640e, 0x0000000c, 0x001bcc0d, 0x3bae26c4, 0x001c3ffd, 0x00000000, 0x001bcc0d, 0x3bae2377, 0x00000000, 0x600001d0 }, + Instructions = [0x43ea, 0xb039, 0xb0f0, 0x4163, 0x08a9, 0xba5c, 0x410d, 0x06ef, 0x42b8, 0xb095, 0x4045, 0x456a, 0xbf74, 0xabfb, 0x4084, 0x159e, 0xb230, 0x4372, 0xb005, 0x404f, 0x4017, 0x43f0, 0x43da, 0x40c7, 0xbf9f, 0x4207, 0x44c0, 0x0047, 0x0b05, 0xbf7b, 0xbfe0, 0x4057, 0x1d47, 0x1f0f, 0x40b2, 0x403c, 0xb09f, 0x03e8, 0x4246, 0xb26d, 0xb26c, 0xbf04, 0x42d6, 0xb040, 0x4631, 0x4092, 0x430e, 0xbf00, 0x40cc, 0xb243, 0x214e, 0x06a1, 0xbfc6, 0x40b0, 0x4631, 0x43cd, 0x4340, 0x13ca, 0x14d1, 0x4603, 0x4079, 0x2c83, 0x421d, 0xbacb, 0xafa3, 0x409c, 0xb2f9, 0xa17d, 0x30ee, 0xba61, 0x4207, 0x0a66, 0x420d, 0x4189, 0x41ea, 0x20f3, 0x42b9, 0xb20d, 0xa046, 0x4388, 0xb2bc, 0xbf7c, 0xb010, 0x43a3, 0xb21d, 0xb22f, 0xb2c8, 0x40bb, 0x19aa, 0xa4a9, 0xac73, 0x4296, 0x2be3, 0x0f78, 0x4107, 0x421a, 0x16f8, 0x427c, 0x444b, 0xbacb, 0x40b4, 0x0480, 0xb0b8, 0xba71, 0x402b, 0x40b5, 0x46a8, 0xbf34, 0xb25d, 0x2418, 0xaac1, 0xb251, 0x2ca1, 0xbf60, 0x4012, 0xbae5, 0xba4d, 0xba63, 0x4172, 0x41bd, 0xa74e, 0xbad9, 0x1f15, 0xb2d0, 0xb26e, 0x2e39, 0x413e, 0x4026, 0x4136, 0xb0eb, 0xb2fe, 0x4211, 0xbf76, 0x44fb, 0x43da, 0x3f14, 0x01c4, 0x41d7, 0x41ee, 0x0326, 0x237a, 0xb026, 0xbfbf, 0xb286, 0x40d8, 0x183c, 0xb2fc, 0x43cd, 0x41d4, 0x1b4c, 0x42c7, 0x03da, 0x4156, 0x40ce, 0x1888, 0x02d2, 0xba79, 0x40ef, 0x4081, 0xb23b, 0x4099, 0x417b, 0xbfa0, 0x4152, 0x4158, 0xbff0, 0xad95, 0x4477, 0x4176, 0x4132, 0xbadb, 0xbf0c, 0xba3a, 0x43e2, 0x1e39, 0x438f, 0x2393, 0x413b, 0x423d, 0xba05, 0x30e8, 0x4383, 0x4081, 0x1dc3, 0xba17, 0xbf9b, 0x294d, 0xac43, 0x18c2, 0x4362, 0xb2d4, 0x4349, 0x420d, 0x42a7, 0x42df, 0x2363, 0x40c8, 0x226c, 0x417a, 0xbfd0, 0x435c, 0x411d, 0xb07f, 0xba54, 0x1da1, 0xa883, 0x1b72, 0x4022, 0x43cf, 0x129b, 0x0952, 0x1a40, 0x1aaf, 0xbf3a, 0x406e, 0xb274, 0xb0a9, 0xbfe0, 0xba4e, 0x4004, 0x38de, 0x41cc, 0x4167, 0xb2a4, 0x413b, 0x1b27, 0xb072, 0x1ed4, 0x3b32, 0xb237, 0xb0fe, 0x1821, 0x414d, 0x41f1, 0x42b0, 0xbf1b, 0x426e, 0x460d, 0x4246, 0x41b1, 0x1c38, 0x4473, 0x413c, 0x4143, 0x24b8, 0x43bf, 0x43dc, 0x3a1b, 0x41fd, 0x4386, 0xba70, 0x41e7, 0x2256, 0x4086, 0x4341, 0x1af4, 0xb21b, 0xbfa0, 0x1f37, 0x4598, 0x431d, 0xbf63, 0x2db5, 0x416c, 0x428d, 0xb2a5, 0x4558, 0xb2f6, 0x41a8, 0x4014, 0x43f5, 0x33d6, 0x41cb, 0xb268, 0x4275, 0xb023, 0x438e, 0xbfe4, 0x415e, 0x19b9, 0x468a, 0xb252, 0x3626, 0x43ea, 0x2d17, 0x40aa, 0x42aa, 0xbfe0, 0x43a3, 0x1b9b, 0xba61, 0x4330, 0x0dbd, 0xa126, 0x40c7, 0x41de, 0xbfc6, 0x404d, 0x46a4, 0x4647, 0x4340, 0x40c8, 0xbf80, 0x42c4, 0x1df3, 0xbf90, 0xa7ac, 0xba4e, 0x4308, 0x0dac, 0xba47, 0x1d7a, 0xb06e, 0x3e91, 0x2e8b, 0x4008, 0x1c78, 0xb219, 0x4161, 0x410d, 0x4076, 0xbf9d, 0xa660, 0x422a, 0x42f6, 0x19e9, 0xbf9a, 0x43fb, 0x421e, 0xb28a, 0x40a0, 0xa3a0, 0x4081, 0x1990, 0xba24, 0xbf02, 0x41d5, 0x4078, 0x4176, 0xba52, 0x1f86, 0xb042, 0x430f, 0x2816, 0x428f, 0x4084, 0xa29f, 0xb019, 0xbfc8, 0x432c, 0x40a9, 0x40a3, 0x1b29, 0x43f5, 0x3867, 0x40cd, 0x4330, 0xb277, 0x3830, 0x41d4, 0xb083, 0x4164, 0x36a6, 0x4082, 0x4141, 0x1167, 0xb2fa, 0x1a54, 0x4284, 0x43e4, 0xa27e, 0xa4e3, 0x413d, 0xbf9a, 0x08da, 0x1b35, 0x4385, 0xb232, 0x4166, 0x422c, 0xbf90, 0x412f, 0xbf2f, 0x41b9, 0x1b51, 0xba0c, 0xbfb0, 0xba34, 0xbf8f, 0x1d3d, 0x30c1, 0x439c, 0x4543, 0xb2d0, 0x1fef, 0x4359, 0x4167, 0xb29f, 0x4331, 0xb2f5, 0x4308, 0xa8a7, 0xba06, 0x400f, 0x43e8, 0x246f, 0x4206, 0x416f, 0xb22c, 0x4043, 0x42b3, 0xbacd, 0x41ac, 0xb280, 0x27e3, 0xbf44, 0x402b, 0x4009, 0xb22b, 0x423d, 0xb28a, 0xb234, 0x4114, 0x42c3, 0x2c01, 0x4344, 0x40a0, 0x41e8, 0x180b, 0x259d, 0x4296, 0x0859, 0x4004, 0xbf6e, 0x43a3, 0x42ca, 0x409f, 0xbaca, 0x1c37, 0x4085, 0x40c7, 0x4113, 0xbac5, 0xb02d, 0x1c91, 0x3cb2, 0x0819, 0x4352, 0x432f, 0x3f57, 0x3c39, 0x43a0, 0xb063, 0x430f, 0x4374, 0x4131, 0xbf52, 0x43d4, 0x432d, 0x07d6, 0xa457, 0x431b, 0xad5a, 0xb24f, 0x16dd, 0xb026, 0x22aa, 0x432c, 0xa6c9, 0x41f6, 0xac8c, 0xb07d, 0xa40a, 0x4137, 0xbf95, 0x3196, 0x41e4, 0xb2c0, 0x4362, 0xb24b, 0x407a, 0x4093, 0xbfdf, 0x0cd1, 0x3b7c, 0x427f, 0x4312, 0xa0a2, 0x20fd, 0x41cc, 0xba31, 0x424e, 0x1aa4, 0xbacb, 0xb26a, 0x4048, 0x4416, 0x43e5, 0x42d4, 0xba20, 0xbf8f, 0x4079, 0xb27e, 0x4271, 0x40ee, 0x466d, 0x2d6c, 0x1843, 0x4083, 0x4327, 0x0cc7, 0x4582, 0xbf6f, 0x424c, 0xafb3, 0x41a0, 0x4239, 0x4404, 0xbf80, 0x418d, 0x43e0, 0x1ab2, 0xbfaf, 0x43ab, 0x4357, 0x42cb, 0xb0bf, 0xba12, 0x1396, 0x41de, 0x4116, 0x2112, 0x1b76, 0x4007, 0x44e9, 0xb224, 0x14d0, 0x402d, 0x412e, 0xb2d1, 0x2afc, 0x42f2, 0x1eca, 0x3412, 0x4472, 0x4252, 0x40cd, 0xb0fa, 0x0898, 0xbf79, 0xbaca, 0x3752, 0x0b3b, 0x1f37, 0x3758, 0x42b8, 0x43bd, 0x01e7, 0x42d1, 0x400a, 0xb044, 0xb2c6, 0x40bb, 0x4384, 0x3f19, 0x43ae, 0xba2c, 0x05ef, 0xb211, 0x1e3a, 0x437d, 0xbfa0, 0xbf7b, 0xb0a2, 0x4326, 0x1c73, 0x425b, 0x412d, 0x44d0, 0x11c1, 0x1b69, 0xb2c3, 0x1f89, 0xa6b4, 0x2ed9, 0x418d, 0x1ccb, 0xaa53, 0x402d, 0x1a6b, 0x3c2d, 0x4622, 0xb2c7, 0xa4b8, 0x4066, 0x45cb, 0x10a2, 0x4010, 0x41bb, 0x4300, 0xbf15, 0xb0b0, 0xba4e, 0xb29f, 0x1d46, 0xba36, 0x43b8, 0x0c37, 0x4499, 0x1bcf, 0xae12, 0xb26a, 0x42d5, 0x4362, 0x25db, 0xba02, 0xb29e, 0x3650, 0x4564, 0x4158, 0x1d0e, 0x4132, 0x4237, 0xb06f, 0x4377, 0xbf92, 0xbfb0, 0x4151, 0x443e, 0x439f, 0x43af, 0xaf28, 0x4151, 0x40d7, 0x40c7, 0x070e, 0x467f, 0xb226, 0x4418, 0xb016, 0x4288, 0xb009, 0x3e9f, 0x2434, 0x45f5, 0xb0a5, 0x1b5f, 0xb270, 0xbf39, 0xb2b4, 0x4093, 0x169a, 0x43c0, 0x29c4, 0xbf61, 0x4206, 0x2bcc, 0x401c, 0x43b0, 0x432e, 0x07bf, 0x40a7, 0x1b14, 0xb09b, 0x1a2b, 0xa498, 0xbaf3, 0x4204, 0x415b, 0xb02f, 0x42c9, 0x4264, 0x40eb, 0x40b9, 0x2f8a, 0x162c, 0x1b93, 0x18c7, 0x40d6, 0x4484, 0xbf63, 0x407b, 0x40cc, 0x19bd, 0x4106, 0xbaec, 0x4076, 0x4271, 0xadcc, 0x42b6, 0xbf12, 0xb2fc, 0xb267, 0x40ea, 0x40c4, 0x34ed, 0xba7e, 0x0e23, 0xae59, 0xbf4a, 0x0743, 0x43d7, 0x42dd, 0x4097, 0x40ed, 0x40a8, 0x45ed, 0x1e93, 0xb213, 0x1c3b, 0x0ea9, 0x420d, 0xb038, 0xba5a, 0x42ed, 0x41e0, 0x41b2, 0x4327, 0x19c5, 0x42d8, 0x26fb, 0x43fd, 0x0f88, 0x43a7, 0x1c9b, 0xb207, 0xbfc9, 0xb2c5, 0x430a, 0x2512, 0x4356, 0x41ed, 0x4078, 0x40c0, 0xbf99, 0x4141, 0xba72, 0x4226, 0x42d0, 0xb2b2, 0x4150, 0x42d1, 0xb04c, 0xba33, 0x2f36, 0x45b0, 0x18b0, 0x1d78, 0xbf43, 0x426a, 0x4350, 0x4287, 0x406a, 0x1911, 0x4199, 0x4074, 0xbf9a, 0x43f2, 0x4344, 0x41f6, 0x0efc, 0x30a0, 0x2e3e, 0x4359, 0xb261, 0x46b5, 0x4164, 0x25dd, 0x0839, 0xa6d1, 0x4181, 0x4627, 0x419a, 0xba3a, 0xbf16, 0x3ee3, 0x158a, 0x407d, 0x424f, 0xba32, 0xb212, 0x41f9, 0xb019, 0xbf80, 0xbfa0, 0xb2af, 0xb2bb, 0xb21e, 0x427c, 0x441b, 0x40e7, 0x3e04, 0xba75, 0xbfde, 0x40dc, 0x4278, 0x2b7d, 0x3966, 0xb06e, 0x1733, 0x465b, 0x4185, 0xb2f9, 0x42dd, 0xb246, 0xbff0, 0xb019, 0x42e4, 0xb259, 0x42a0, 0xba79, 0x18d5, 0x2f05, 0x4093, 0xbf7d, 0x2891, 0x423a, 0xb201, 0xb001, 0x1ce7, 0x1de1, 0xbafd, 0xb2b0, 0x42d6, 0x41f4, 0x206e, 0xb0b6, 0x3d9b, 0x3156, 0xbff0, 0x4483, 0x46d2, 0x41bb, 0x22a6, 0x413e, 0x4180, 0x3d93, 0x46f3, 0xb2e1, 0x4064, 0x42b4, 0xb279, 0xbf6c, 0x41fd, 0x42a1, 0x396b, 0x1383, 0x42ec, 0x1e32, 0x4564, 0x312c, 0x416f, 0x43be, 0x2633, 0x1e58, 0xb29b, 0x415a, 0x384f, 0x43ec, 0x428a, 0xbad6, 0x40bb, 0xba2d, 0xbf3b, 0x41fb, 0xb26f, 0x4208, 0x407e, 0xbacd, 0x1bb6, 0xbf6c, 0x435d, 0x41db, 0x2381, 0x402e, 0x4278, 0x40cb, 0xba40, 0xbac3, 0x3c20, 0x3b4a, 0x1a38, 0x437d, 0x4100, 0x40d5, 0xb0fd, 0x46c4, 0xbfdf, 0x4251, 0xba51, 0x42c7, 0x0106, 0x0ab7, 0x1cf3, 0xa039, 0x1e55, 0x42b5, 0x43c6, 0x4614, 0x409c, 0x4383, 0xbf76, 0x45f3, 0x01b8, 0xb045, 0xba1d, 0x4000, 0xbfe0, 0x41ac, 0x42e8, 0xb055, 0xa8af, 0x4413, 0x3917, 0xba4b, 0x42a6, 0xb097, 0x3a05, 0x410d, 0x43a3, 0xa1f5, 0xba69, 0x4164, 0x295b, 0xb0d1, 0x43d5, 0xbf6d, 0x0b74, 0x41c4, 0xba32, 0x1c4d, 0x40cf, 0x41c7, 0x4591, 0xa4d4, 0x4376, 0x131b, 0x42f1, 0x4308, 0x42a9, 0x1d4d, 0x41bc, 0x425f, 0x42b1, 0xacd1, 0xaa4f, 0x45de, 0x0d5f, 0x270c, 0x1e62, 0x4353, 0x4113, 0x2cc0, 0xa57c, 0x1eba, 0x4153, 0xbfa8, 0x413a, 0x41be, 0xbf2f, 0x22f9, 0xada0, 0x4171, 0xb2fc, 0x458e, 0x405a, 0x4119, 0x42a9, 0xae09, 0x435e, 0x1c93, 0xbf32, 0x1d79, 0x401d, 0x4098, 0xbfa0, 0x3409, 0x41d9, 0x46a1, 0xbfa3, 0x2470, 0x4583, 0x41be, 0xb295, 0x1aab, 0x319a, 0xbf97, 0x1b2d, 0x0205, 0x424c, 0x41a8, 0x433f, 0xbae9, 0xba25, 0xbfd0, 0x43ab, 0x401c, 0x2ddb, 0x3ade, 0x404a, 0x4203, 0xb2b9, 0x4559, 0xba40, 0xaa0b, 0x3a83, 0xa48e, 0x4288, 0x10f8, 0x40fd, 0xbfd2, 0xb09f, 0x4280, 0x40bf, 0x4770, 0xe7fe + ], + StartRegs = [0x3dfcb14d, 0x03113440, 0x43d4feab, 0xf4773a5f, 0x012ea932, 0x9dad9d54, 0xf24b822f, 0x4f0bd97c, 0x95955220, 0xe3991301, 0xb50130a1, 0xe8c03445, 0x19b5cca3, 0x0afb31b9, 0x00000000, 0x000001f0 + ], + FinalRegs = [0x00000001, 0x0000000c, 0x3bae2320, 0x00000000, 0x00001a18, 0x0006677f, 0x54cd640e, 0x0000000c, 0x001bcc0d, 0x3bae26c4, 0x001c3ffd, 0x00000000, 0x001bcc0d, 0x3bae2377, 0x00000000, 0x600001d0 + ], }, new() { - Instructions = new ushort[] { 0x1ba6, 0x4015, 0xb0f7, 0xba63, 0x1f03, 0xb220, 0x42c4, 0x1831, 0x2745, 0x42db, 0xb2af, 0x455f, 0x0c95, 0x2125, 0x454b, 0x3a14, 0x17d0, 0xb250, 0x4237, 0x1fb6, 0xbf79, 0x43dd, 0x4336, 0x407f, 0x1b4f, 0x305a, 0x4094, 0x3a18, 0xa357, 0xadef, 0xbaee, 0x3be9, 0x438a, 0xbf90, 0x4316, 0xba54, 0x40a1, 0x46e8, 0x1b13, 0xba2d, 0x4083, 0xbad4, 0xbf13, 0x1852, 0xb064, 0x1935, 0x4494, 0x4159, 0x4433, 0x2b74, 0xba35, 0x212c, 0x41a2, 0x41f0, 0x4078, 0xb24f, 0xb213, 0x4049, 0x439b, 0x1e45, 0x417c, 0xbff0, 0x17c1, 0x4304, 0x4363, 0xbf71, 0xb267, 0x41ef, 0x4213, 0x46f9, 0x1c2a, 0xba31, 0x40b6, 0xbfce, 0x43c3, 0x4341, 0x42f4, 0x4159, 0x42ea, 0x4233, 0x427f, 0xb2fa, 0x439b, 0x43b9, 0xba25, 0x1f55, 0x41bd, 0xbf8d, 0x3fdf, 0x40fd, 0x3e6e, 0xb219, 0x04ff, 0x2c3e, 0x44e2, 0x409c, 0x403c, 0x0d36, 0x441e, 0x01ff, 0x0059, 0x41db, 0x1af3, 0x0cd0, 0x1db2, 0x4384, 0x42bf, 0x1c2b, 0x2068, 0x4648, 0xb201, 0x3ab3, 0x380e, 0xba27, 0x4160, 0x0100, 0x1adc, 0xbf1c, 0x10ff, 0x0ce6, 0x4100, 0x4211, 0x4242, 0x417a, 0x419c, 0x4026, 0x4247, 0xb26e, 0x0b32, 0xb022, 0xbf82, 0xa679, 0x4307, 0xba4f, 0xbfce, 0x3af9, 0x1cf8, 0x0647, 0xbf59, 0xb225, 0x423b, 0xbff0, 0xba38, 0x3523, 0x3a16, 0x15c0, 0xb290, 0xa1f9, 0x4369, 0x422a, 0x42c8, 0x1897, 0xabe5, 0xbfc1, 0xb205, 0x22e3, 0x42cf, 0xb091, 0x30d5, 0xb244, 0x266b, 0x402b, 0x4076, 0x1cfb, 0x466d, 0xa4e3, 0xa5a0, 0x40f9, 0xb229, 0x433f, 0xb075, 0xb2b0, 0x4216, 0x4295, 0xbf4d, 0xb04e, 0x1ca6, 0x44e8, 0x4136, 0x42a2, 0x3f2b, 0x42a7, 0x425f, 0x4240, 0x46d2, 0x416b, 0x0590, 0x4118, 0xbae6, 0xb058, 0xae7a, 0xbfab, 0x19a7, 0xba3a, 0x15dc, 0x0445, 0x1dbf, 0x14eb, 0xbfb9, 0x4159, 0x0825, 0x40e2, 0x43a5, 0xb2dc, 0xb2c5, 0x4382, 0x4389, 0xb0c7, 0x4196, 0x2221, 0x4133, 0xba0e, 0xbfb0, 0xbf49, 0x1baa, 0x1239, 0xb2b2, 0x4078, 0x1b33, 0xba6b, 0x3c77, 0x412e, 0x397b, 0x1e15, 0xbfd2, 0xa6f7, 0xb23f, 0x3196, 0x43bf, 0x40a7, 0xab47, 0x43a0, 0xb028, 0xba0f, 0x4557, 0xa960, 0xb05a, 0x4004, 0x41b9, 0x41be, 0xbad8, 0xbf17, 0x42fb, 0x467f, 0x42fd, 0xba23, 0x1a1f, 0xb291, 0x1c6a, 0x4190, 0x23a3, 0x448b, 0x4047, 0x4284, 0xb2ab, 0xb052, 0x429a, 0x4108, 0x1114, 0x4498, 0x401c, 0xb24b, 0x415b, 0xb2e8, 0xbfb0, 0x45d9, 0xbadf, 0xbfb2, 0xbff0, 0x41d4, 0xb09a, 0x431a, 0x405b, 0x1d7d, 0x1d8c, 0x4388, 0x060c, 0x1f0b, 0xba03, 0x4167, 0xb2af, 0xb2e8, 0x4095, 0x1b2a, 0x4142, 0xb038, 0x1e28, 0x2d5a, 0xb007, 0x37ae, 0x432f, 0x43f9, 0x41f5, 0xbf72, 0x4377, 0x0585, 0xba7a, 0x2893, 0x3546, 0x1b6b, 0x4315, 0x3494, 0x4000, 0x4305, 0x3758, 0xbf05, 0x4298, 0x43ca, 0x4299, 0x0b40, 0x433c, 0xba6f, 0x41e3, 0x29c3, 0xa073, 0x176f, 0x41fa, 0x465e, 0x28ab, 0xbf04, 0x40f8, 0x4347, 0x4357, 0x4269, 0x43f7, 0x42f1, 0x41b9, 0x4373, 0x41ac, 0x419f, 0xb03a, 0x0ff1, 0xba12, 0x469d, 0x233d, 0x440a, 0xbac6, 0x43ca, 0x2379, 0x1332, 0x43d0, 0xb2cc, 0x4281, 0xbf0e, 0xb24d, 0xbf90, 0xb291, 0x4043, 0x2e1b, 0x02b8, 0xbf74, 0xb2ea, 0x4399, 0x408e, 0x42ed, 0x456a, 0x414d, 0xba4d, 0x1929, 0x039e, 0xb22d, 0x38ee, 0x408e, 0x40b8, 0xb20f, 0x410a, 0x4553, 0x189f, 0x110e, 0x17e1, 0x414a, 0x1ec4, 0x4499, 0xba68, 0xb060, 0x42c3, 0x4369, 0xbf0f, 0x3aec, 0x4157, 0x3771, 0x46cc, 0xb230, 0x4169, 0xb054, 0x10b7, 0x14f3, 0x33ae, 0x40cc, 0x1f4e, 0xba61, 0x4356, 0x422e, 0x4047, 0x409d, 0x41b5, 0x4193, 0x2017, 0xb013, 0x4559, 0xb20d, 0xba6c, 0x41db, 0xba06, 0x4167, 0x4252, 0xbf09, 0x4360, 0x188d, 0xb239, 0x4385, 0x413a, 0xb2e8, 0x4303, 0x0c1d, 0xbff0, 0xb2ea, 0xb06b, 0xba28, 0xb217, 0x4330, 0xa300, 0x16ab, 0x1053, 0x0c0c, 0x414b, 0x43dd, 0x0a6d, 0x428d, 0x4378, 0x1b7a, 0xbf80, 0xb265, 0xa0df, 0x4079, 0xbfbb, 0x3808, 0x1e91, 0xa711, 0xbaf8, 0x4665, 0x2c9b, 0x03fb, 0x2a72, 0x4186, 0x4052, 0x43ff, 0x407b, 0xa0ed, 0x4207, 0xbf70, 0x43d7, 0x1367, 0xb2b4, 0xb207, 0xa2b7, 0x0b98, 0xba72, 0xbf44, 0xb05e, 0x41db, 0x4231, 0xba15, 0xba3d, 0xbfe0, 0x3b3c, 0x434f, 0x1a8a, 0x4373, 0x437e, 0x19db, 0x45f0, 0xb291, 0xbfa8, 0x40c4, 0xbada, 0xb2a6, 0x410c, 0x2f9d, 0x4499, 0xb254, 0xb251, 0x4688, 0x36c7, 0xb28b, 0x3ca1, 0x2de1, 0x401d, 0xb233, 0xba5a, 0xb03a, 0xb2c0, 0x429c, 0x43b8, 0x40e6, 0xbfdc, 0x415f, 0x40c8, 0xb295, 0x46d0, 0x449a, 0xa9e5, 0x17e0, 0x4127, 0x4165, 0x4213, 0x4324, 0x3d81, 0x413b, 0x41c3, 0x1fb5, 0x4041, 0x1dce, 0xb2aa, 0xbaee, 0x2b6b, 0xa9ff, 0xbfaa, 0x1e69, 0xb056, 0xba20, 0xbaf9, 0x3584, 0x1ce5, 0x4170, 0xbfd6, 0x4029, 0x3811, 0x43c3, 0xba36, 0x4136, 0x0fcd, 0xa452, 0xa18a, 0x42f8, 0xb236, 0x46d1, 0x180f, 0x42b5, 0x43ac, 0xb2c3, 0xba0f, 0xb004, 0x4638, 0xb2bb, 0xba5f, 0xba19, 0xbf11, 0x4640, 0x1f23, 0xba63, 0xb2d6, 0x4159, 0xbf6d, 0x4242, 0x3570, 0xb2b6, 0x410c, 0x4243, 0x4340, 0x4347, 0x23c7, 0xb257, 0x1e21, 0xb2b1, 0x402c, 0x429e, 0xb2fc, 0x3a4c, 0xbfa0, 0x41bc, 0x4659, 0x02de, 0x40c0, 0xb21e, 0xbfd8, 0x40fb, 0x37f9, 0x17e4, 0xb0ab, 0x4144, 0x4158, 0x4182, 0xaaae, 0x400a, 0x41ac, 0x40ff, 0x4207, 0x414f, 0x41e8, 0xbf09, 0xb2c8, 0xb0a2, 0xb229, 0x41a3, 0x4210, 0xb20a, 0x11b2, 0x2fdf, 0xb242, 0x34cc, 0x430a, 0x4462, 0xb24f, 0x42ed, 0x3e95, 0x4214, 0xa49d, 0x1a98, 0x42ae, 0x407f, 0x1c46, 0xb260, 0x46d2, 0xbf38, 0x45a2, 0x4105, 0xb25a, 0x406b, 0x0e70, 0x1c2e, 0xbf6c, 0x42c7, 0x1e6b, 0x40f0, 0x1edc, 0x418f, 0x1c63, 0x4403, 0xaeec, 0x1d5e, 0xb289, 0xb20d, 0x0fbd, 0x40f0, 0xb0a7, 0xba3d, 0x43e8, 0xbfa4, 0x12ff, 0x437b, 0x43dc, 0xba54, 0x416d, 0x42b7, 0xb2e8, 0x1d0a, 0xbf60, 0x1ac0, 0x1972, 0xb07d, 0xba21, 0xbf5f, 0x45b1, 0xa40b, 0x42b3, 0x4008, 0x20cf, 0x184a, 0x41fe, 0x2f74, 0x4129, 0xba6e, 0x43f7, 0x438e, 0x459a, 0xba5f, 0x1d12, 0x1c06, 0xba3b, 0x4338, 0x4319, 0x412e, 0x14df, 0xbac7, 0xbf06, 0x0b43, 0xa015, 0x1998, 0x1ae9, 0xb251, 0x1b33, 0x29d5, 0x1def, 0x4306, 0x4170, 0x4674, 0x4036, 0xb29a, 0x415e, 0x4367, 0xbf36, 0xba3a, 0x400f, 0x1aab, 0x41d9, 0x0d1c, 0x4598, 0x44b5, 0xa285, 0x406f, 0xbf07, 0xba2b, 0xba21, 0x41ae, 0x4488, 0xbf81, 0x24c3, 0xbf00, 0x080d, 0x3f1d, 0x45c8, 0x01cb, 0xa168, 0xbf88, 0x1d8a, 0x4469, 0x0868, 0x1fb2, 0xb28d, 0x40c5, 0xb23b, 0xba1b, 0x4075, 0x43fd, 0x30ab, 0xb2d8, 0x3f10, 0x1c49, 0xab69, 0xbf27, 0x1415, 0x0643, 0x46f1, 0x1c17, 0xbad5, 0x4405, 0xa383, 0xa1ed, 0x420c, 0x1866, 0x41e3, 0x43c0, 0xba28, 0x428f, 0xb08f, 0xba7b, 0x4576, 0x0987, 0x4266, 0x42a8, 0xb278, 0xba0b, 0xbfdb, 0x1ae6, 0x19bc, 0x191d, 0x4019, 0x4358, 0x2895, 0x10c4, 0x33fe, 0x1eb2, 0x41bd, 0x42fd, 0x4230, 0x1c37, 0x445d, 0x1970, 0x420a, 0x4325, 0x4179, 0x4053, 0x0bb2, 0x4373, 0x3cd8, 0x40c0, 0x4194, 0xad38, 0xbf9e, 0x144c, 0x215a, 0x4100, 0xb29f, 0xbfe8, 0x146d, 0x1a76, 0x37cd, 0x2bc4, 0xba24, 0x4359, 0x0417, 0xbfcd, 0x0ffa, 0x4100, 0xbac8, 0x41c8, 0x350d, 0xb2d9, 0x41b3, 0xbf5f, 0xba5a, 0x1f92, 0x442f, 0x4342, 0xb2cc, 0x42f7, 0x42ec, 0xbfa0, 0xa018, 0x3c0a, 0x4650, 0x464a, 0x1d7b, 0xbf11, 0xba23, 0x421c, 0x42ea, 0xb23c, 0xb2cf, 0x131a, 0xbf8f, 0x00af, 0xb29d, 0xba50, 0xbaee, 0x4607, 0x4645, 0xb2a8, 0xa65e, 0xb0ae, 0x42c2, 0x4153, 0xbfb5, 0x1f5c, 0x2a64, 0xb04d, 0xb221, 0x2bcf, 0x4102, 0x4115, 0x4301, 0x1a80, 0x38b0, 0x41da, 0xbaf9, 0x42a2, 0xba22, 0x42dc, 0xba39, 0x41c0, 0x46bb, 0x3fbd, 0x1f57, 0x412f, 0x4150, 0x4319, 0xbf01, 0x4162, 0x4211, 0xba0b, 0x2ec4, 0x1345, 0x4336, 0x4064, 0x4622, 0x4372, 0x422b, 0x43b3, 0x427e, 0xb0f6, 0xbf46, 0x333c, 0x43d0, 0xb2fd, 0x4219, 0xb06a, 0x114c, 0xb287, 0x44e3, 0x41a7, 0xb089, 0x422e, 0x4059, 0xb066, 0xabef, 0x190a, 0x4263, 0x1dd3, 0x4209, 0xbf67, 0x42ca, 0x409b, 0x4286, 0xba45, 0x42a3, 0xbae1, 0x2947, 0x414f, 0x43b7, 0x0fc6, 0x4350, 0xbfab, 0x40e6, 0x45b6, 0x1dab, 0x4132, 0x4289, 0xb060, 0xbf97, 0x4212, 0xba0b, 0x068c, 0x4390, 0x4181, 0x03ac, 0x406a, 0x4044, 0xaa37, 0xb247, 0x46ab, 0x41dc, 0xa6bd, 0xbf6d, 0x4007, 0xb2fe, 0x40ee, 0x1047, 0x41d3, 0xb29b, 0x428d, 0x4275, 0x4392, 0xb2da, 0x40fa, 0xb0e0, 0xbf4c, 0xb0b4, 0x05a7, 0x414a, 0x1c39, 0xb2e9, 0x4080, 0x430f, 0x3d9b, 0x1ef4, 0x4167, 0xbf19, 0xb01b, 0x42dc, 0xb04b, 0x44cd, 0xb284, 0xb046, 0x3574, 0xb2c5, 0x41b5, 0xae2e, 0xb216, 0x1fe5, 0x10e6, 0xb2b8, 0x18a6, 0x4600, 0x4050, 0x406f, 0x420a, 0x41da, 0x43c4, 0xbf14, 0x202f, 0x43ea, 0x41e7, 0x4044, 0x3472, 0xb2f3, 0x42f8, 0x1937, 0x1ffd, 0xbf07, 0x420a, 0x0351, 0xbad2, 0xba49, 0x43be, 0x41eb, 0xbf70, 0x40b7, 0x4479, 0x0ed9, 0x4261, 0xb066, 0xb22d, 0x1b22, 0x4225, 0x1edd, 0x4180, 0x4090, 0x409c, 0x46ab, 0x413c, 0x3858, 0x4127, 0x42c6, 0xbfb0, 0xa6c1, 0xbfd4, 0x46e0, 0x423f, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xcb6e3399, 0x779d0a27, 0xb05aed8d, 0x68a1a047, 0x971f3c1b, 0xd982dff6, 0x911b2b51, 0x3af672e5, 0xc8b54557, 0xb853ba8e, 0x82d6c3bf, 0x67250d2b, 0x982aa4b0, 0x611a482f, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0xffffffa8, 0x845c5046, 0x00000000, 0x00006500, 0x7ba3afba, 0x000064fd, 0x00001ae0, 0x00000000, 0x982aa4b0, 0x00000000, 0x1b016935, 0x000064fd, 0x982aa4b0, 0xffd0f718, 0x00000000, 0xa00001d0 }, + Instructions = [0x1ba6, 0x4015, 0xb0f7, 0xba63, 0x1f03, 0xb220, 0x42c4, 0x1831, 0x2745, 0x42db, 0xb2af, 0x455f, 0x0c95, 0x2125, 0x454b, 0x3a14, 0x17d0, 0xb250, 0x4237, 0x1fb6, 0xbf79, 0x43dd, 0x4336, 0x407f, 0x1b4f, 0x305a, 0x4094, 0x3a18, 0xa357, 0xadef, 0xbaee, 0x3be9, 0x438a, 0xbf90, 0x4316, 0xba54, 0x40a1, 0x46e8, 0x1b13, 0xba2d, 0x4083, 0xbad4, 0xbf13, 0x1852, 0xb064, 0x1935, 0x4494, 0x4159, 0x4433, 0x2b74, 0xba35, 0x212c, 0x41a2, 0x41f0, 0x4078, 0xb24f, 0xb213, 0x4049, 0x439b, 0x1e45, 0x417c, 0xbff0, 0x17c1, 0x4304, 0x4363, 0xbf71, 0xb267, 0x41ef, 0x4213, 0x46f9, 0x1c2a, 0xba31, 0x40b6, 0xbfce, 0x43c3, 0x4341, 0x42f4, 0x4159, 0x42ea, 0x4233, 0x427f, 0xb2fa, 0x439b, 0x43b9, 0xba25, 0x1f55, 0x41bd, 0xbf8d, 0x3fdf, 0x40fd, 0x3e6e, 0xb219, 0x04ff, 0x2c3e, 0x44e2, 0x409c, 0x403c, 0x0d36, 0x441e, 0x01ff, 0x0059, 0x41db, 0x1af3, 0x0cd0, 0x1db2, 0x4384, 0x42bf, 0x1c2b, 0x2068, 0x4648, 0xb201, 0x3ab3, 0x380e, 0xba27, 0x4160, 0x0100, 0x1adc, 0xbf1c, 0x10ff, 0x0ce6, 0x4100, 0x4211, 0x4242, 0x417a, 0x419c, 0x4026, 0x4247, 0xb26e, 0x0b32, 0xb022, 0xbf82, 0xa679, 0x4307, 0xba4f, 0xbfce, 0x3af9, 0x1cf8, 0x0647, 0xbf59, 0xb225, 0x423b, 0xbff0, 0xba38, 0x3523, 0x3a16, 0x15c0, 0xb290, 0xa1f9, 0x4369, 0x422a, 0x42c8, 0x1897, 0xabe5, 0xbfc1, 0xb205, 0x22e3, 0x42cf, 0xb091, 0x30d5, 0xb244, 0x266b, 0x402b, 0x4076, 0x1cfb, 0x466d, 0xa4e3, 0xa5a0, 0x40f9, 0xb229, 0x433f, 0xb075, 0xb2b0, 0x4216, 0x4295, 0xbf4d, 0xb04e, 0x1ca6, 0x44e8, 0x4136, 0x42a2, 0x3f2b, 0x42a7, 0x425f, 0x4240, 0x46d2, 0x416b, 0x0590, 0x4118, 0xbae6, 0xb058, 0xae7a, 0xbfab, 0x19a7, 0xba3a, 0x15dc, 0x0445, 0x1dbf, 0x14eb, 0xbfb9, 0x4159, 0x0825, 0x40e2, 0x43a5, 0xb2dc, 0xb2c5, 0x4382, 0x4389, 0xb0c7, 0x4196, 0x2221, 0x4133, 0xba0e, 0xbfb0, 0xbf49, 0x1baa, 0x1239, 0xb2b2, 0x4078, 0x1b33, 0xba6b, 0x3c77, 0x412e, 0x397b, 0x1e15, 0xbfd2, 0xa6f7, 0xb23f, 0x3196, 0x43bf, 0x40a7, 0xab47, 0x43a0, 0xb028, 0xba0f, 0x4557, 0xa960, 0xb05a, 0x4004, 0x41b9, 0x41be, 0xbad8, 0xbf17, 0x42fb, 0x467f, 0x42fd, 0xba23, 0x1a1f, 0xb291, 0x1c6a, 0x4190, 0x23a3, 0x448b, 0x4047, 0x4284, 0xb2ab, 0xb052, 0x429a, 0x4108, 0x1114, 0x4498, 0x401c, 0xb24b, 0x415b, 0xb2e8, 0xbfb0, 0x45d9, 0xbadf, 0xbfb2, 0xbff0, 0x41d4, 0xb09a, 0x431a, 0x405b, 0x1d7d, 0x1d8c, 0x4388, 0x060c, 0x1f0b, 0xba03, 0x4167, 0xb2af, 0xb2e8, 0x4095, 0x1b2a, 0x4142, 0xb038, 0x1e28, 0x2d5a, 0xb007, 0x37ae, 0x432f, 0x43f9, 0x41f5, 0xbf72, 0x4377, 0x0585, 0xba7a, 0x2893, 0x3546, 0x1b6b, 0x4315, 0x3494, 0x4000, 0x4305, 0x3758, 0xbf05, 0x4298, 0x43ca, 0x4299, 0x0b40, 0x433c, 0xba6f, 0x41e3, 0x29c3, 0xa073, 0x176f, 0x41fa, 0x465e, 0x28ab, 0xbf04, 0x40f8, 0x4347, 0x4357, 0x4269, 0x43f7, 0x42f1, 0x41b9, 0x4373, 0x41ac, 0x419f, 0xb03a, 0x0ff1, 0xba12, 0x469d, 0x233d, 0x440a, 0xbac6, 0x43ca, 0x2379, 0x1332, 0x43d0, 0xb2cc, 0x4281, 0xbf0e, 0xb24d, 0xbf90, 0xb291, 0x4043, 0x2e1b, 0x02b8, 0xbf74, 0xb2ea, 0x4399, 0x408e, 0x42ed, 0x456a, 0x414d, 0xba4d, 0x1929, 0x039e, 0xb22d, 0x38ee, 0x408e, 0x40b8, 0xb20f, 0x410a, 0x4553, 0x189f, 0x110e, 0x17e1, 0x414a, 0x1ec4, 0x4499, 0xba68, 0xb060, 0x42c3, 0x4369, 0xbf0f, 0x3aec, 0x4157, 0x3771, 0x46cc, 0xb230, 0x4169, 0xb054, 0x10b7, 0x14f3, 0x33ae, 0x40cc, 0x1f4e, 0xba61, 0x4356, 0x422e, 0x4047, 0x409d, 0x41b5, 0x4193, 0x2017, 0xb013, 0x4559, 0xb20d, 0xba6c, 0x41db, 0xba06, 0x4167, 0x4252, 0xbf09, 0x4360, 0x188d, 0xb239, 0x4385, 0x413a, 0xb2e8, 0x4303, 0x0c1d, 0xbff0, 0xb2ea, 0xb06b, 0xba28, 0xb217, 0x4330, 0xa300, 0x16ab, 0x1053, 0x0c0c, 0x414b, 0x43dd, 0x0a6d, 0x428d, 0x4378, 0x1b7a, 0xbf80, 0xb265, 0xa0df, 0x4079, 0xbfbb, 0x3808, 0x1e91, 0xa711, 0xbaf8, 0x4665, 0x2c9b, 0x03fb, 0x2a72, 0x4186, 0x4052, 0x43ff, 0x407b, 0xa0ed, 0x4207, 0xbf70, 0x43d7, 0x1367, 0xb2b4, 0xb207, 0xa2b7, 0x0b98, 0xba72, 0xbf44, 0xb05e, 0x41db, 0x4231, 0xba15, 0xba3d, 0xbfe0, 0x3b3c, 0x434f, 0x1a8a, 0x4373, 0x437e, 0x19db, 0x45f0, 0xb291, 0xbfa8, 0x40c4, 0xbada, 0xb2a6, 0x410c, 0x2f9d, 0x4499, 0xb254, 0xb251, 0x4688, 0x36c7, 0xb28b, 0x3ca1, 0x2de1, 0x401d, 0xb233, 0xba5a, 0xb03a, 0xb2c0, 0x429c, 0x43b8, 0x40e6, 0xbfdc, 0x415f, 0x40c8, 0xb295, 0x46d0, 0x449a, 0xa9e5, 0x17e0, 0x4127, 0x4165, 0x4213, 0x4324, 0x3d81, 0x413b, 0x41c3, 0x1fb5, 0x4041, 0x1dce, 0xb2aa, 0xbaee, 0x2b6b, 0xa9ff, 0xbfaa, 0x1e69, 0xb056, 0xba20, 0xbaf9, 0x3584, 0x1ce5, 0x4170, 0xbfd6, 0x4029, 0x3811, 0x43c3, 0xba36, 0x4136, 0x0fcd, 0xa452, 0xa18a, 0x42f8, 0xb236, 0x46d1, 0x180f, 0x42b5, 0x43ac, 0xb2c3, 0xba0f, 0xb004, 0x4638, 0xb2bb, 0xba5f, 0xba19, 0xbf11, 0x4640, 0x1f23, 0xba63, 0xb2d6, 0x4159, 0xbf6d, 0x4242, 0x3570, 0xb2b6, 0x410c, 0x4243, 0x4340, 0x4347, 0x23c7, 0xb257, 0x1e21, 0xb2b1, 0x402c, 0x429e, 0xb2fc, 0x3a4c, 0xbfa0, 0x41bc, 0x4659, 0x02de, 0x40c0, 0xb21e, 0xbfd8, 0x40fb, 0x37f9, 0x17e4, 0xb0ab, 0x4144, 0x4158, 0x4182, 0xaaae, 0x400a, 0x41ac, 0x40ff, 0x4207, 0x414f, 0x41e8, 0xbf09, 0xb2c8, 0xb0a2, 0xb229, 0x41a3, 0x4210, 0xb20a, 0x11b2, 0x2fdf, 0xb242, 0x34cc, 0x430a, 0x4462, 0xb24f, 0x42ed, 0x3e95, 0x4214, 0xa49d, 0x1a98, 0x42ae, 0x407f, 0x1c46, 0xb260, 0x46d2, 0xbf38, 0x45a2, 0x4105, 0xb25a, 0x406b, 0x0e70, 0x1c2e, 0xbf6c, 0x42c7, 0x1e6b, 0x40f0, 0x1edc, 0x418f, 0x1c63, 0x4403, 0xaeec, 0x1d5e, 0xb289, 0xb20d, 0x0fbd, 0x40f0, 0xb0a7, 0xba3d, 0x43e8, 0xbfa4, 0x12ff, 0x437b, 0x43dc, 0xba54, 0x416d, 0x42b7, 0xb2e8, 0x1d0a, 0xbf60, 0x1ac0, 0x1972, 0xb07d, 0xba21, 0xbf5f, 0x45b1, 0xa40b, 0x42b3, 0x4008, 0x20cf, 0x184a, 0x41fe, 0x2f74, 0x4129, 0xba6e, 0x43f7, 0x438e, 0x459a, 0xba5f, 0x1d12, 0x1c06, 0xba3b, 0x4338, 0x4319, 0x412e, 0x14df, 0xbac7, 0xbf06, 0x0b43, 0xa015, 0x1998, 0x1ae9, 0xb251, 0x1b33, 0x29d5, 0x1def, 0x4306, 0x4170, 0x4674, 0x4036, 0xb29a, 0x415e, 0x4367, 0xbf36, 0xba3a, 0x400f, 0x1aab, 0x41d9, 0x0d1c, 0x4598, 0x44b5, 0xa285, 0x406f, 0xbf07, 0xba2b, 0xba21, 0x41ae, 0x4488, 0xbf81, 0x24c3, 0xbf00, 0x080d, 0x3f1d, 0x45c8, 0x01cb, 0xa168, 0xbf88, 0x1d8a, 0x4469, 0x0868, 0x1fb2, 0xb28d, 0x40c5, 0xb23b, 0xba1b, 0x4075, 0x43fd, 0x30ab, 0xb2d8, 0x3f10, 0x1c49, 0xab69, 0xbf27, 0x1415, 0x0643, 0x46f1, 0x1c17, 0xbad5, 0x4405, 0xa383, 0xa1ed, 0x420c, 0x1866, 0x41e3, 0x43c0, 0xba28, 0x428f, 0xb08f, 0xba7b, 0x4576, 0x0987, 0x4266, 0x42a8, 0xb278, 0xba0b, 0xbfdb, 0x1ae6, 0x19bc, 0x191d, 0x4019, 0x4358, 0x2895, 0x10c4, 0x33fe, 0x1eb2, 0x41bd, 0x42fd, 0x4230, 0x1c37, 0x445d, 0x1970, 0x420a, 0x4325, 0x4179, 0x4053, 0x0bb2, 0x4373, 0x3cd8, 0x40c0, 0x4194, 0xad38, 0xbf9e, 0x144c, 0x215a, 0x4100, 0xb29f, 0xbfe8, 0x146d, 0x1a76, 0x37cd, 0x2bc4, 0xba24, 0x4359, 0x0417, 0xbfcd, 0x0ffa, 0x4100, 0xbac8, 0x41c8, 0x350d, 0xb2d9, 0x41b3, 0xbf5f, 0xba5a, 0x1f92, 0x442f, 0x4342, 0xb2cc, 0x42f7, 0x42ec, 0xbfa0, 0xa018, 0x3c0a, 0x4650, 0x464a, 0x1d7b, 0xbf11, 0xba23, 0x421c, 0x42ea, 0xb23c, 0xb2cf, 0x131a, 0xbf8f, 0x00af, 0xb29d, 0xba50, 0xbaee, 0x4607, 0x4645, 0xb2a8, 0xa65e, 0xb0ae, 0x42c2, 0x4153, 0xbfb5, 0x1f5c, 0x2a64, 0xb04d, 0xb221, 0x2bcf, 0x4102, 0x4115, 0x4301, 0x1a80, 0x38b0, 0x41da, 0xbaf9, 0x42a2, 0xba22, 0x42dc, 0xba39, 0x41c0, 0x46bb, 0x3fbd, 0x1f57, 0x412f, 0x4150, 0x4319, 0xbf01, 0x4162, 0x4211, 0xba0b, 0x2ec4, 0x1345, 0x4336, 0x4064, 0x4622, 0x4372, 0x422b, 0x43b3, 0x427e, 0xb0f6, 0xbf46, 0x333c, 0x43d0, 0xb2fd, 0x4219, 0xb06a, 0x114c, 0xb287, 0x44e3, 0x41a7, 0xb089, 0x422e, 0x4059, 0xb066, 0xabef, 0x190a, 0x4263, 0x1dd3, 0x4209, 0xbf67, 0x42ca, 0x409b, 0x4286, 0xba45, 0x42a3, 0xbae1, 0x2947, 0x414f, 0x43b7, 0x0fc6, 0x4350, 0xbfab, 0x40e6, 0x45b6, 0x1dab, 0x4132, 0x4289, 0xb060, 0xbf97, 0x4212, 0xba0b, 0x068c, 0x4390, 0x4181, 0x03ac, 0x406a, 0x4044, 0xaa37, 0xb247, 0x46ab, 0x41dc, 0xa6bd, 0xbf6d, 0x4007, 0xb2fe, 0x40ee, 0x1047, 0x41d3, 0xb29b, 0x428d, 0x4275, 0x4392, 0xb2da, 0x40fa, 0xb0e0, 0xbf4c, 0xb0b4, 0x05a7, 0x414a, 0x1c39, 0xb2e9, 0x4080, 0x430f, 0x3d9b, 0x1ef4, 0x4167, 0xbf19, 0xb01b, 0x42dc, 0xb04b, 0x44cd, 0xb284, 0xb046, 0x3574, 0xb2c5, 0x41b5, 0xae2e, 0xb216, 0x1fe5, 0x10e6, 0xb2b8, 0x18a6, 0x4600, 0x4050, 0x406f, 0x420a, 0x41da, 0x43c4, 0xbf14, 0x202f, 0x43ea, 0x41e7, 0x4044, 0x3472, 0xb2f3, 0x42f8, 0x1937, 0x1ffd, 0xbf07, 0x420a, 0x0351, 0xbad2, 0xba49, 0x43be, 0x41eb, 0xbf70, 0x40b7, 0x4479, 0x0ed9, 0x4261, 0xb066, 0xb22d, 0x1b22, 0x4225, 0x1edd, 0x4180, 0x4090, 0x409c, 0x46ab, 0x413c, 0x3858, 0x4127, 0x42c6, 0xbfb0, 0xa6c1, 0xbfd4, 0x46e0, 0x423f, 0x4770, 0xe7fe + ], + StartRegs = [0xcb6e3399, 0x779d0a27, 0xb05aed8d, 0x68a1a047, 0x971f3c1b, 0xd982dff6, 0x911b2b51, 0x3af672e5, 0xc8b54557, 0xb853ba8e, 0x82d6c3bf, 0x67250d2b, 0x982aa4b0, 0x611a482f, 0x00000000, 0x900001f0 + ], + FinalRegs = [0xffffffa8, 0x845c5046, 0x00000000, 0x00006500, 0x7ba3afba, 0x000064fd, 0x00001ae0, 0x00000000, 0x982aa4b0, 0x00000000, 0x1b016935, 0x000064fd, 0x982aa4b0, 0xffd0f718, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x1604, 0x0a21, 0x4319, 0x4564, 0xb217, 0x459a, 0x4428, 0xb20d, 0x1b2c, 0x2a6d, 0x403e, 0x410b, 0xba30, 0x1e1d, 0xbad8, 0x309a, 0xbf63, 0xbfa0, 0xb283, 0x1430, 0x468c, 0xb071, 0xb082, 0xb0c2, 0xbfa0, 0x1caf, 0xb278, 0x4270, 0x307d, 0xbacc, 0xb0d7, 0x40ec, 0xbacf, 0x33cb, 0xa1ac, 0x1b5a, 0xbf80, 0xb2e6, 0xba4b, 0x1e68, 0xbfe0, 0xb2dc, 0x4085, 0xbf7f, 0x2943, 0x1edf, 0x4346, 0x32fb, 0x410d, 0x44f4, 0x1e4f, 0xa16f, 0xb25d, 0x4348, 0xbf18, 0xbac6, 0x0b17, 0xbac6, 0xba0c, 0xb232, 0x3f9e, 0xb22f, 0xa529, 0xbfe0, 0x43b4, 0x2768, 0x427a, 0xb2fd, 0x408f, 0x4269, 0x4388, 0x42c0, 0x3a6c, 0xbf25, 0x4219, 0x4311, 0x1de4, 0x2564, 0x41c2, 0x1963, 0xb239, 0x42c3, 0x421f, 0xb0a4, 0x403f, 0x1c19, 0x1f37, 0x40f1, 0xbfc8, 0x40ac, 0x43aa, 0x0762, 0x4672, 0xb226, 0x3a12, 0x1aa7, 0xbad5, 0xb21a, 0x42ff, 0xbfdb, 0x4302, 0x1a52, 0x16ad, 0x42cd, 0x43fa, 0xb2f5, 0x413b, 0x411c, 0xb044, 0xb056, 0xa3cf, 0x40a9, 0x11c8, 0x455b, 0x41f6, 0xb04e, 0x3cea, 0x4257, 0x4251, 0x42e9, 0x2352, 0x3e76, 0x1aa5, 0x4086, 0x4355, 0x40e8, 0x3a84, 0x103c, 0xbfb5, 0x4227, 0xb07d, 0x1056, 0x4078, 0x4166, 0xba60, 0x1dd5, 0xbfdc, 0xb294, 0x4020, 0xa37a, 0x433d, 0xb2ab, 0xb284, 0x4223, 0xbf22, 0x43c2, 0x18f8, 0x4181, 0x40f5, 0xb2fb, 0x38ea, 0x4151, 0xac89, 0xbff0, 0x40a4, 0xa65b, 0x098e, 0x4020, 0x415c, 0x244e, 0x4034, 0x27e0, 0xbf94, 0xb2ec, 0xb0d0, 0x4255, 0xbf41, 0x22ee, 0x42c3, 0x139b, 0xa16a, 0xbfc0, 0x18b8, 0x4020, 0xb05e, 0xa1b8, 0xbad3, 0xbf2e, 0x460e, 0xbaf4, 0x23aa, 0x1c22, 0x34b3, 0xba2c, 0xa046, 0x223a, 0x4236, 0x1f81, 0x40e4, 0x43ea, 0x065e, 0x4251, 0x4266, 0x409b, 0x2271, 0x43be, 0x4026, 0x4394, 0x2c3b, 0x1dfa, 0xb287, 0xa1f2, 0xaed8, 0x4044, 0x42d9, 0xbf33, 0xb2db, 0xaaec, 0x1a26, 0xa731, 0x41be, 0x4203, 0xa536, 0x4663, 0x09c1, 0x4236, 0x1bcd, 0x234a, 0x3426, 0x420c, 0x43fa, 0x42e2, 0x1fcf, 0x43f1, 0x43ef, 0x4122, 0xab1c, 0x40cb, 0x41ac, 0x40ba, 0xb2f7, 0x46b0, 0xa3fb, 0xb037, 0x4583, 0xbf1e, 0x40a3, 0x4005, 0xafe0, 0xba7e, 0x42a9, 0x38ab, 0xb2b3, 0x43bd, 0x43c4, 0x1ca1, 0x4208, 0x410d, 0x4319, 0xba00, 0x43a2, 0xbae2, 0x194f, 0x316c, 0xba00, 0xbfc1, 0x41af, 0x40eb, 0x2d1e, 0x0f59, 0xba37, 0x40ec, 0x454f, 0x23a9, 0x0eb7, 0x4130, 0x410c, 0x4273, 0xba56, 0xa4e0, 0x42d8, 0x439b, 0xa5a8, 0x43e4, 0x41ab, 0x463e, 0x4097, 0x407f, 0xbf83, 0x4203, 0x0ecb, 0x41d5, 0x423b, 0x413e, 0x41aa, 0xbf5f, 0x14be, 0x40f8, 0xbada, 0xb294, 0x1a4d, 0x41c1, 0x120e, 0x424b, 0x1ac7, 0x42e8, 0x2300, 0x4386, 0x46f2, 0x41f1, 0x413f, 0x4078, 0x4193, 0x42b0, 0x07d0, 0x194c, 0x4647, 0x4216, 0x3906, 0x1e78, 0x4038, 0x045d, 0xb2be, 0x2603, 0x416d, 0xbf4b, 0xb26e, 0x403f, 0x45c3, 0x0349, 0xba7a, 0x4186, 0x4438, 0xb078, 0xbfe0, 0x4314, 0xb236, 0xb0fc, 0x4467, 0x420b, 0x407c, 0x43d2, 0x4252, 0xba6b, 0xbadc, 0xbf4c, 0x4021, 0xba6d, 0xb2c7, 0x1f82, 0xb07b, 0x1706, 0xbf1c, 0xbfd0, 0x1d27, 0x4176, 0xb284, 0x380c, 0x4642, 0x4607, 0xb0cc, 0x44d9, 0xb2a7, 0x40b5, 0x42c2, 0xb2d6, 0xba22, 0x1ae8, 0x28fa, 0x4030, 0x0012, 0x19af, 0x4545, 0x407f, 0x43fd, 0x4603, 0xbfd6, 0x41de, 0x1ede, 0xba4c, 0x41a1, 0x41c3, 0x4371, 0x408e, 0x41bc, 0x42cd, 0x42be, 0x4172, 0xab14, 0x4068, 0xa34b, 0x1bfc, 0x1929, 0xb2a6, 0xbf76, 0xb2eb, 0x410c, 0x1fa5, 0x4241, 0x469a, 0x1eec, 0x408b, 0xbf15, 0x4304, 0x464f, 0x1424, 0x431e, 0xbf66, 0xa1af, 0xa8a3, 0xba6d, 0xb2c3, 0xba52, 0x0e61, 0x40a3, 0x4348, 0xbaf0, 0x412c, 0x1aae, 0x42a3, 0x1da6, 0x4404, 0x424c, 0x336d, 0x4044, 0x40bc, 0xb2cb, 0x3f79, 0x416e, 0xbf5f, 0x2954, 0xba01, 0xba05, 0xaef8, 0x1e85, 0x4035, 0x41c5, 0xb062, 0x1500, 0x4008, 0xbf85, 0x0e11, 0x279e, 0x4125, 0x42c2, 0xbac4, 0x438a, 0x46f2, 0x0210, 0xba56, 0xba5b, 0x11f8, 0xba09, 0xbf5f, 0xb2bd, 0x1e57, 0x3541, 0xba26, 0x1e26, 0x10de, 0x20bb, 0xbf90, 0xbf3c, 0x4182, 0x43cc, 0x40cb, 0x4275, 0x4150, 0x4164, 0x41c0, 0x42d8, 0x40c8, 0x3c64, 0xa413, 0xa6e0, 0x18fa, 0xa514, 0x464f, 0x40f1, 0x43a0, 0x1131, 0x4067, 0x4017, 0x0294, 0xb2f3, 0x4159, 0xba10, 0x3e05, 0xbf8b, 0x042f, 0x431c, 0x40c7, 0xba5a, 0x1cfe, 0x40d2, 0x4178, 0xb2ad, 0x2175, 0x41df, 0x226c, 0x426e, 0xb0a0, 0x4081, 0x42ec, 0x4035, 0x40b2, 0xbfd7, 0x4165, 0x4419, 0x43cd, 0x46ba, 0xbfc0, 0x4384, 0x0cc7, 0x1e7a, 0x466a, 0x04ed, 0x0fdc, 0x42e2, 0x42a3, 0x2874, 0x42df, 0xb2e6, 0x223a, 0x3d2a, 0x349c, 0x41b0, 0x1fb5, 0x2ef3, 0xbfa3, 0x14e3, 0xbac0, 0x4357, 0xb2a5, 0xba2a, 0x4161, 0x4218, 0xb0b3, 0x4110, 0x15d7, 0x412e, 0xbfaf, 0xb2bb, 0x1930, 0xba71, 0x1dc0, 0xbf53, 0x4363, 0x4237, 0x206b, 0x1a83, 0x1f94, 0x41fb, 0x4071, 0x4632, 0x41ca, 0xb000, 0x2298, 0x4191, 0xa626, 0xb215, 0x24be, 0x40b3, 0x02a0, 0xb209, 0x2ff4, 0x0d5d, 0x43ef, 0x21e6, 0x1915, 0x401f, 0xbf84, 0x461f, 0x4244, 0x421c, 0xba26, 0x43f2, 0xba11, 0x42b4, 0x17d4, 0x43e7, 0x072e, 0x41a1, 0xaee1, 0x4090, 0xb20e, 0x40e9, 0xb207, 0x1dd0, 0x1cc6, 0xbfb1, 0xb045, 0x2731, 0x4271, 0xbade, 0xb217, 0x403f, 0x35ea, 0x1eea, 0xaa77, 0x2632, 0x19c7, 0xba1a, 0x433f, 0x439e, 0xbf15, 0x1a25, 0x40b9, 0x14f0, 0x3dd4, 0x3c2a, 0x3be5, 0x43c9, 0x40e1, 0x435d, 0x41eb, 0xb236, 0x46ec, 0x1701, 0x403b, 0xbaee, 0xb030, 0x43d4, 0xa1a0, 0x0433, 0xb0ed, 0xbaee, 0xbf47, 0xb25d, 0x410c, 0x41e2, 0x1d4a, 0x1fa0, 0x3d98, 0x1f8f, 0x3a41, 0x41c6, 0x456d, 0x04a1, 0xb2ca, 0x1d5e, 0x40ca, 0xa917, 0x40d1, 0xa2c5, 0x428f, 0x225d, 0x11fe, 0x42d3, 0xbfd9, 0xb2d2, 0x1ca9, 0xafda, 0xbf80, 0xb252, 0x2a1a, 0xbaf3, 0x430a, 0xb244, 0x1c06, 0xa3c7, 0x1c7b, 0x407f, 0xba7a, 0xb2c9, 0x43af, 0x4266, 0xba74, 0xbfbd, 0x1822, 0xba00, 0xb218, 0xb23a, 0x42da, 0x1ec2, 0x412b, 0xb257, 0x2422, 0xbf68, 0xbac7, 0x43fa, 0x1072, 0x4102, 0xb2f7, 0xba43, 0x4303, 0xbac6, 0xb296, 0x1cd6, 0x4379, 0x180e, 0x3654, 0x432f, 0xbf80, 0x228d, 0x03ca, 0x43d0, 0x43b1, 0x2ddd, 0x41fa, 0x35b8, 0x35fe, 0x4212, 0x3dc5, 0xbf59, 0x446f, 0xba34, 0xb234, 0x45c0, 0x461c, 0x1c69, 0xa91c, 0xbfab, 0x43e0, 0x098b, 0x4052, 0x4389, 0xb2b5, 0x1ed5, 0x4129, 0x0b1b, 0x2abf, 0x1b81, 0x32cd, 0x431f, 0xbf60, 0x1adb, 0x42fb, 0x40f0, 0x43d0, 0xb272, 0x4041, 0x421b, 0x43f7, 0xbf2c, 0x46a2, 0x43d8, 0x43bd, 0x439c, 0xba01, 0x3e66, 0x19dc, 0xbf28, 0xb04a, 0x4286, 0x429d, 0x25ec, 0x4381, 0xba19, 0xb2f8, 0x4042, 0x1f44, 0x1ea0, 0x42dc, 0x438d, 0x40f1, 0x1f2f, 0xba50, 0x4311, 0xa700, 0xb0ed, 0x1c9b, 0xb0c5, 0x2742, 0x431c, 0xbf1e, 0x409e, 0xaf81, 0xba68, 0x4364, 0x4078, 0x0ac1, 0xab14, 0xbaec, 0x4499, 0x0a77, 0x0594, 0x2e04, 0xba67, 0x2c60, 0x41c8, 0x443e, 0x4273, 0xb00f, 0x41b1, 0x43b1, 0x1f25, 0xbf34, 0x4282, 0xb2fc, 0xbf44, 0x400d, 0xb275, 0xaf07, 0xb06d, 0x44db, 0x12f2, 0x4082, 0x0b28, 0xb0ac, 0xbfc0, 0xb2ca, 0xb2cb, 0x4462, 0x45b6, 0x4328, 0xb24a, 0x2a77, 0x425e, 0xbf78, 0xb24c, 0x43f5, 0x17b8, 0x2ab7, 0xb285, 0x40b9, 0xa7d7, 0x45e4, 0xb0e1, 0x4395, 0x4020, 0x2b72, 0x4200, 0xb069, 0x40db, 0x41af, 0x42dc, 0x41c6, 0x16a0, 0xb268, 0xbf68, 0xb0e3, 0x421b, 0x4208, 0xa3e3, 0x3cd0, 0xbf54, 0x3d55, 0xba7c, 0x4399, 0xb213, 0x43d0, 0x160a, 0xbfe4, 0x4659, 0x4327, 0x107b, 0xb2f7, 0x42ea, 0xbf00, 0x43d4, 0x2fa0, 0x41ad, 0x195b, 0xb2c5, 0x05dc, 0x43c7, 0x4074, 0x426e, 0xb084, 0x4354, 0x1993, 0xbf44, 0x4226, 0x118b, 0x0a67, 0xbaca, 0x43ea, 0x2159, 0x416e, 0x190e, 0x0629, 0xbf68, 0x4155, 0x41f9, 0x2408, 0xbf2c, 0x1a7a, 0x4137, 0x17b6, 0x4092, 0xb039, 0x404c, 0x4324, 0x40de, 0x40df, 0xbf35, 0x400e, 0x1853, 0x4246, 0x3887, 0xb2b8, 0x44b3, 0x0cc0, 0x294e, 0x0158, 0xb24b, 0xba1c, 0x1f56, 0x0aff, 0xb298, 0xbf69, 0x32c4, 0x44ad, 0x1804, 0x4189, 0x40ff, 0x1993, 0xada4, 0x1f03, 0xbaec, 0x43ed, 0x40e9, 0x1957, 0x40af, 0x46dc, 0xad97, 0x4368, 0x4271, 0x4156, 0xbf52, 0x41ba, 0x4348, 0x4550, 0x0bf9, 0x4039, 0x4692, 0x2bed, 0x40d5, 0xba49, 0x0c78, 0x1ba4, 0xba44, 0x0087, 0x4045, 0x42fe, 0xb299, 0xba7b, 0xbf86, 0x46e9, 0x1a43, 0x0677, 0x3bf7, 0x445e, 0x1c2d, 0x4208, 0x43e0, 0x18ff, 0x1077, 0x2711, 0x425a, 0xba76, 0xb04f, 0xb2a9, 0x1a42, 0x449a, 0xb2e8, 0x4019, 0x1195, 0x42c2, 0xb208, 0x449c, 0xbacc, 0xba2f, 0xbf90, 0xbf44, 0xbacb, 0xbaeb, 0x1d0c, 0x4119, 0xb2e4, 0xb209, 0x45c3, 0x4580, 0xba39, 0x41f0, 0xbf7b, 0xb239, 0x42ed, 0x412f, 0x3276, 0xb0e3, 0xb285, 0x146e, 0xb064, 0xa6c5, 0xbf12, 0x4037, 0xbaf9, 0xb2ba, 0x4345, 0x156c, 0x404b, 0x407a, 0x1c20, 0x44f2, 0xba73, 0x404e, 0x4338, 0x2e25, 0xba5e, 0x1b5b, 0xb2f5, 0x4247, 0xbf5a, 0xa67b, 0xb257, 0x1c8e, 0x2226, 0x43d4, 0xb045, 0x4197, 0x41f6, 0x08df, 0xbf5c, 0x42b0, 0x4170, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x51ade2cc, 0xec524c8c, 0x38eff947, 0x36d7c854, 0xe5629cca, 0xa8d08a62, 0x7a884da5, 0xfbdda384, 0xdb38fbe9, 0xf6976dfd, 0x005fd422, 0x93c6813c, 0xb8f2dcc9, 0x6cfd2716, 0x00000000, 0x500001f0 }, - FinalRegs = new uint[] { 0x40ffffff, 0xffffffff, 0x00000026, 0xff767516, 0xffffffd9, 0x000000b4, 0x80000000, 0x1feecea2, 0x6cfd1de1, 0xf75b1a7b, 0xffffff09, 0x278d022c, 0x278d0135, 0x6cfd2fc6, 0x00000000, 0x900001d0 }, + Instructions = [0x1604, 0x0a21, 0x4319, 0x4564, 0xb217, 0x459a, 0x4428, 0xb20d, 0x1b2c, 0x2a6d, 0x403e, 0x410b, 0xba30, 0x1e1d, 0xbad8, 0x309a, 0xbf63, 0xbfa0, 0xb283, 0x1430, 0x468c, 0xb071, 0xb082, 0xb0c2, 0xbfa0, 0x1caf, 0xb278, 0x4270, 0x307d, 0xbacc, 0xb0d7, 0x40ec, 0xbacf, 0x33cb, 0xa1ac, 0x1b5a, 0xbf80, 0xb2e6, 0xba4b, 0x1e68, 0xbfe0, 0xb2dc, 0x4085, 0xbf7f, 0x2943, 0x1edf, 0x4346, 0x32fb, 0x410d, 0x44f4, 0x1e4f, 0xa16f, 0xb25d, 0x4348, 0xbf18, 0xbac6, 0x0b17, 0xbac6, 0xba0c, 0xb232, 0x3f9e, 0xb22f, 0xa529, 0xbfe0, 0x43b4, 0x2768, 0x427a, 0xb2fd, 0x408f, 0x4269, 0x4388, 0x42c0, 0x3a6c, 0xbf25, 0x4219, 0x4311, 0x1de4, 0x2564, 0x41c2, 0x1963, 0xb239, 0x42c3, 0x421f, 0xb0a4, 0x403f, 0x1c19, 0x1f37, 0x40f1, 0xbfc8, 0x40ac, 0x43aa, 0x0762, 0x4672, 0xb226, 0x3a12, 0x1aa7, 0xbad5, 0xb21a, 0x42ff, 0xbfdb, 0x4302, 0x1a52, 0x16ad, 0x42cd, 0x43fa, 0xb2f5, 0x413b, 0x411c, 0xb044, 0xb056, 0xa3cf, 0x40a9, 0x11c8, 0x455b, 0x41f6, 0xb04e, 0x3cea, 0x4257, 0x4251, 0x42e9, 0x2352, 0x3e76, 0x1aa5, 0x4086, 0x4355, 0x40e8, 0x3a84, 0x103c, 0xbfb5, 0x4227, 0xb07d, 0x1056, 0x4078, 0x4166, 0xba60, 0x1dd5, 0xbfdc, 0xb294, 0x4020, 0xa37a, 0x433d, 0xb2ab, 0xb284, 0x4223, 0xbf22, 0x43c2, 0x18f8, 0x4181, 0x40f5, 0xb2fb, 0x38ea, 0x4151, 0xac89, 0xbff0, 0x40a4, 0xa65b, 0x098e, 0x4020, 0x415c, 0x244e, 0x4034, 0x27e0, 0xbf94, 0xb2ec, 0xb0d0, 0x4255, 0xbf41, 0x22ee, 0x42c3, 0x139b, 0xa16a, 0xbfc0, 0x18b8, 0x4020, 0xb05e, 0xa1b8, 0xbad3, 0xbf2e, 0x460e, 0xbaf4, 0x23aa, 0x1c22, 0x34b3, 0xba2c, 0xa046, 0x223a, 0x4236, 0x1f81, 0x40e4, 0x43ea, 0x065e, 0x4251, 0x4266, 0x409b, 0x2271, 0x43be, 0x4026, 0x4394, 0x2c3b, 0x1dfa, 0xb287, 0xa1f2, 0xaed8, 0x4044, 0x42d9, 0xbf33, 0xb2db, 0xaaec, 0x1a26, 0xa731, 0x41be, 0x4203, 0xa536, 0x4663, 0x09c1, 0x4236, 0x1bcd, 0x234a, 0x3426, 0x420c, 0x43fa, 0x42e2, 0x1fcf, 0x43f1, 0x43ef, 0x4122, 0xab1c, 0x40cb, 0x41ac, 0x40ba, 0xb2f7, 0x46b0, 0xa3fb, 0xb037, 0x4583, 0xbf1e, 0x40a3, 0x4005, 0xafe0, 0xba7e, 0x42a9, 0x38ab, 0xb2b3, 0x43bd, 0x43c4, 0x1ca1, 0x4208, 0x410d, 0x4319, 0xba00, 0x43a2, 0xbae2, 0x194f, 0x316c, 0xba00, 0xbfc1, 0x41af, 0x40eb, 0x2d1e, 0x0f59, 0xba37, 0x40ec, 0x454f, 0x23a9, 0x0eb7, 0x4130, 0x410c, 0x4273, 0xba56, 0xa4e0, 0x42d8, 0x439b, 0xa5a8, 0x43e4, 0x41ab, 0x463e, 0x4097, 0x407f, 0xbf83, 0x4203, 0x0ecb, 0x41d5, 0x423b, 0x413e, 0x41aa, 0xbf5f, 0x14be, 0x40f8, 0xbada, 0xb294, 0x1a4d, 0x41c1, 0x120e, 0x424b, 0x1ac7, 0x42e8, 0x2300, 0x4386, 0x46f2, 0x41f1, 0x413f, 0x4078, 0x4193, 0x42b0, 0x07d0, 0x194c, 0x4647, 0x4216, 0x3906, 0x1e78, 0x4038, 0x045d, 0xb2be, 0x2603, 0x416d, 0xbf4b, 0xb26e, 0x403f, 0x45c3, 0x0349, 0xba7a, 0x4186, 0x4438, 0xb078, 0xbfe0, 0x4314, 0xb236, 0xb0fc, 0x4467, 0x420b, 0x407c, 0x43d2, 0x4252, 0xba6b, 0xbadc, 0xbf4c, 0x4021, 0xba6d, 0xb2c7, 0x1f82, 0xb07b, 0x1706, 0xbf1c, 0xbfd0, 0x1d27, 0x4176, 0xb284, 0x380c, 0x4642, 0x4607, 0xb0cc, 0x44d9, 0xb2a7, 0x40b5, 0x42c2, 0xb2d6, 0xba22, 0x1ae8, 0x28fa, 0x4030, 0x0012, 0x19af, 0x4545, 0x407f, 0x43fd, 0x4603, 0xbfd6, 0x41de, 0x1ede, 0xba4c, 0x41a1, 0x41c3, 0x4371, 0x408e, 0x41bc, 0x42cd, 0x42be, 0x4172, 0xab14, 0x4068, 0xa34b, 0x1bfc, 0x1929, 0xb2a6, 0xbf76, 0xb2eb, 0x410c, 0x1fa5, 0x4241, 0x469a, 0x1eec, 0x408b, 0xbf15, 0x4304, 0x464f, 0x1424, 0x431e, 0xbf66, 0xa1af, 0xa8a3, 0xba6d, 0xb2c3, 0xba52, 0x0e61, 0x40a3, 0x4348, 0xbaf0, 0x412c, 0x1aae, 0x42a3, 0x1da6, 0x4404, 0x424c, 0x336d, 0x4044, 0x40bc, 0xb2cb, 0x3f79, 0x416e, 0xbf5f, 0x2954, 0xba01, 0xba05, 0xaef8, 0x1e85, 0x4035, 0x41c5, 0xb062, 0x1500, 0x4008, 0xbf85, 0x0e11, 0x279e, 0x4125, 0x42c2, 0xbac4, 0x438a, 0x46f2, 0x0210, 0xba56, 0xba5b, 0x11f8, 0xba09, 0xbf5f, 0xb2bd, 0x1e57, 0x3541, 0xba26, 0x1e26, 0x10de, 0x20bb, 0xbf90, 0xbf3c, 0x4182, 0x43cc, 0x40cb, 0x4275, 0x4150, 0x4164, 0x41c0, 0x42d8, 0x40c8, 0x3c64, 0xa413, 0xa6e0, 0x18fa, 0xa514, 0x464f, 0x40f1, 0x43a0, 0x1131, 0x4067, 0x4017, 0x0294, 0xb2f3, 0x4159, 0xba10, 0x3e05, 0xbf8b, 0x042f, 0x431c, 0x40c7, 0xba5a, 0x1cfe, 0x40d2, 0x4178, 0xb2ad, 0x2175, 0x41df, 0x226c, 0x426e, 0xb0a0, 0x4081, 0x42ec, 0x4035, 0x40b2, 0xbfd7, 0x4165, 0x4419, 0x43cd, 0x46ba, 0xbfc0, 0x4384, 0x0cc7, 0x1e7a, 0x466a, 0x04ed, 0x0fdc, 0x42e2, 0x42a3, 0x2874, 0x42df, 0xb2e6, 0x223a, 0x3d2a, 0x349c, 0x41b0, 0x1fb5, 0x2ef3, 0xbfa3, 0x14e3, 0xbac0, 0x4357, 0xb2a5, 0xba2a, 0x4161, 0x4218, 0xb0b3, 0x4110, 0x15d7, 0x412e, 0xbfaf, 0xb2bb, 0x1930, 0xba71, 0x1dc0, 0xbf53, 0x4363, 0x4237, 0x206b, 0x1a83, 0x1f94, 0x41fb, 0x4071, 0x4632, 0x41ca, 0xb000, 0x2298, 0x4191, 0xa626, 0xb215, 0x24be, 0x40b3, 0x02a0, 0xb209, 0x2ff4, 0x0d5d, 0x43ef, 0x21e6, 0x1915, 0x401f, 0xbf84, 0x461f, 0x4244, 0x421c, 0xba26, 0x43f2, 0xba11, 0x42b4, 0x17d4, 0x43e7, 0x072e, 0x41a1, 0xaee1, 0x4090, 0xb20e, 0x40e9, 0xb207, 0x1dd0, 0x1cc6, 0xbfb1, 0xb045, 0x2731, 0x4271, 0xbade, 0xb217, 0x403f, 0x35ea, 0x1eea, 0xaa77, 0x2632, 0x19c7, 0xba1a, 0x433f, 0x439e, 0xbf15, 0x1a25, 0x40b9, 0x14f0, 0x3dd4, 0x3c2a, 0x3be5, 0x43c9, 0x40e1, 0x435d, 0x41eb, 0xb236, 0x46ec, 0x1701, 0x403b, 0xbaee, 0xb030, 0x43d4, 0xa1a0, 0x0433, 0xb0ed, 0xbaee, 0xbf47, 0xb25d, 0x410c, 0x41e2, 0x1d4a, 0x1fa0, 0x3d98, 0x1f8f, 0x3a41, 0x41c6, 0x456d, 0x04a1, 0xb2ca, 0x1d5e, 0x40ca, 0xa917, 0x40d1, 0xa2c5, 0x428f, 0x225d, 0x11fe, 0x42d3, 0xbfd9, 0xb2d2, 0x1ca9, 0xafda, 0xbf80, 0xb252, 0x2a1a, 0xbaf3, 0x430a, 0xb244, 0x1c06, 0xa3c7, 0x1c7b, 0x407f, 0xba7a, 0xb2c9, 0x43af, 0x4266, 0xba74, 0xbfbd, 0x1822, 0xba00, 0xb218, 0xb23a, 0x42da, 0x1ec2, 0x412b, 0xb257, 0x2422, 0xbf68, 0xbac7, 0x43fa, 0x1072, 0x4102, 0xb2f7, 0xba43, 0x4303, 0xbac6, 0xb296, 0x1cd6, 0x4379, 0x180e, 0x3654, 0x432f, 0xbf80, 0x228d, 0x03ca, 0x43d0, 0x43b1, 0x2ddd, 0x41fa, 0x35b8, 0x35fe, 0x4212, 0x3dc5, 0xbf59, 0x446f, 0xba34, 0xb234, 0x45c0, 0x461c, 0x1c69, 0xa91c, 0xbfab, 0x43e0, 0x098b, 0x4052, 0x4389, 0xb2b5, 0x1ed5, 0x4129, 0x0b1b, 0x2abf, 0x1b81, 0x32cd, 0x431f, 0xbf60, 0x1adb, 0x42fb, 0x40f0, 0x43d0, 0xb272, 0x4041, 0x421b, 0x43f7, 0xbf2c, 0x46a2, 0x43d8, 0x43bd, 0x439c, 0xba01, 0x3e66, 0x19dc, 0xbf28, 0xb04a, 0x4286, 0x429d, 0x25ec, 0x4381, 0xba19, 0xb2f8, 0x4042, 0x1f44, 0x1ea0, 0x42dc, 0x438d, 0x40f1, 0x1f2f, 0xba50, 0x4311, 0xa700, 0xb0ed, 0x1c9b, 0xb0c5, 0x2742, 0x431c, 0xbf1e, 0x409e, 0xaf81, 0xba68, 0x4364, 0x4078, 0x0ac1, 0xab14, 0xbaec, 0x4499, 0x0a77, 0x0594, 0x2e04, 0xba67, 0x2c60, 0x41c8, 0x443e, 0x4273, 0xb00f, 0x41b1, 0x43b1, 0x1f25, 0xbf34, 0x4282, 0xb2fc, 0xbf44, 0x400d, 0xb275, 0xaf07, 0xb06d, 0x44db, 0x12f2, 0x4082, 0x0b28, 0xb0ac, 0xbfc0, 0xb2ca, 0xb2cb, 0x4462, 0x45b6, 0x4328, 0xb24a, 0x2a77, 0x425e, 0xbf78, 0xb24c, 0x43f5, 0x17b8, 0x2ab7, 0xb285, 0x40b9, 0xa7d7, 0x45e4, 0xb0e1, 0x4395, 0x4020, 0x2b72, 0x4200, 0xb069, 0x40db, 0x41af, 0x42dc, 0x41c6, 0x16a0, 0xb268, 0xbf68, 0xb0e3, 0x421b, 0x4208, 0xa3e3, 0x3cd0, 0xbf54, 0x3d55, 0xba7c, 0x4399, 0xb213, 0x43d0, 0x160a, 0xbfe4, 0x4659, 0x4327, 0x107b, 0xb2f7, 0x42ea, 0xbf00, 0x43d4, 0x2fa0, 0x41ad, 0x195b, 0xb2c5, 0x05dc, 0x43c7, 0x4074, 0x426e, 0xb084, 0x4354, 0x1993, 0xbf44, 0x4226, 0x118b, 0x0a67, 0xbaca, 0x43ea, 0x2159, 0x416e, 0x190e, 0x0629, 0xbf68, 0x4155, 0x41f9, 0x2408, 0xbf2c, 0x1a7a, 0x4137, 0x17b6, 0x4092, 0xb039, 0x404c, 0x4324, 0x40de, 0x40df, 0xbf35, 0x400e, 0x1853, 0x4246, 0x3887, 0xb2b8, 0x44b3, 0x0cc0, 0x294e, 0x0158, 0xb24b, 0xba1c, 0x1f56, 0x0aff, 0xb298, 0xbf69, 0x32c4, 0x44ad, 0x1804, 0x4189, 0x40ff, 0x1993, 0xada4, 0x1f03, 0xbaec, 0x43ed, 0x40e9, 0x1957, 0x40af, 0x46dc, 0xad97, 0x4368, 0x4271, 0x4156, 0xbf52, 0x41ba, 0x4348, 0x4550, 0x0bf9, 0x4039, 0x4692, 0x2bed, 0x40d5, 0xba49, 0x0c78, 0x1ba4, 0xba44, 0x0087, 0x4045, 0x42fe, 0xb299, 0xba7b, 0xbf86, 0x46e9, 0x1a43, 0x0677, 0x3bf7, 0x445e, 0x1c2d, 0x4208, 0x43e0, 0x18ff, 0x1077, 0x2711, 0x425a, 0xba76, 0xb04f, 0xb2a9, 0x1a42, 0x449a, 0xb2e8, 0x4019, 0x1195, 0x42c2, 0xb208, 0x449c, 0xbacc, 0xba2f, 0xbf90, 0xbf44, 0xbacb, 0xbaeb, 0x1d0c, 0x4119, 0xb2e4, 0xb209, 0x45c3, 0x4580, 0xba39, 0x41f0, 0xbf7b, 0xb239, 0x42ed, 0x412f, 0x3276, 0xb0e3, 0xb285, 0x146e, 0xb064, 0xa6c5, 0xbf12, 0x4037, 0xbaf9, 0xb2ba, 0x4345, 0x156c, 0x404b, 0x407a, 0x1c20, 0x44f2, 0xba73, 0x404e, 0x4338, 0x2e25, 0xba5e, 0x1b5b, 0xb2f5, 0x4247, 0xbf5a, 0xa67b, 0xb257, 0x1c8e, 0x2226, 0x43d4, 0xb045, 0x4197, 0x41f6, 0x08df, 0xbf5c, 0x42b0, 0x4170, 0x4770, 0xe7fe + ], + StartRegs = [0x51ade2cc, 0xec524c8c, 0x38eff947, 0x36d7c854, 0xe5629cca, 0xa8d08a62, 0x7a884da5, 0xfbdda384, 0xdb38fbe9, 0xf6976dfd, 0x005fd422, 0x93c6813c, 0xb8f2dcc9, 0x6cfd2716, 0x00000000, 0x500001f0 + ], + FinalRegs = [0x40ffffff, 0xffffffff, 0x00000026, 0xff767516, 0xffffffd9, 0x000000b4, 0x80000000, 0x1feecea2, 0x6cfd1de1, 0xf75b1a7b, 0xffffff09, 0x278d022c, 0x278d0135, 0x6cfd2fc6, 0x00000000, 0x900001d0 + ], }, new() { - Instructions = new ushort[] { 0xa6c2, 0x4488, 0xb2d1, 0xb06a, 0x4083, 0x44ca, 0xba42, 0x1d14, 0x420d, 0xbade, 0x4103, 0x40f9, 0x4003, 0xb0d9, 0x4552, 0xbfcc, 0xa2db, 0xa663, 0xba1e, 0x2e6c, 0x43d1, 0x407f, 0x401a, 0xb2c1, 0x4631, 0x0681, 0xa7bb, 0x4649, 0xb05b, 0xbfe1, 0x28a0, 0x1af0, 0x16fa, 0x45c8, 0xab5a, 0x4399, 0x4423, 0x1bdd, 0xb044, 0x2499, 0x4440, 0x3ee0, 0xb02f, 0x0ddd, 0x4127, 0xbf08, 0xba20, 0xba1c, 0x03ac, 0xb0f7, 0x40e5, 0x4116, 0x4116, 0x468a, 0x422d, 0xb2d9, 0x43c9, 0x41ea, 0x4054, 0xbace, 0x437c, 0xbf91, 0x40a4, 0xb247, 0x18af, 0x16e1, 0xb255, 0xbade, 0xb0a3, 0x1f17, 0xbf47, 0xb0be, 0x1037, 0xb2b8, 0x175f, 0x18fc, 0xb286, 0x41bd, 0x46f3, 0x42b4, 0x0b47, 0x4359, 0x18c2, 0xadd5, 0xbf2c, 0x1c76, 0xba76, 0x4132, 0xba48, 0x43f4, 0x168c, 0x416e, 0xbfab, 0x4194, 0x1bc0, 0x28da, 0x42c5, 0x4423, 0x41ff, 0xb2ff, 0xb008, 0x20d3, 0x437e, 0x4034, 0xba40, 0x425e, 0xa06c, 0xba68, 0xba72, 0x00eb, 0x41b2, 0x411e, 0x1b3d, 0x2f08, 0xb089, 0x411a, 0x14ff, 0xb2be, 0x4633, 0xbf7d, 0x4150, 0x40c2, 0xb28a, 0x1e72, 0xba3d, 0x0aae, 0x435e, 0x205c, 0xb067, 0x4353, 0x21c0, 0x43e1, 0x4141, 0x0572, 0x43ae, 0x427c, 0x42ae, 0x4026, 0x2df2, 0x405c, 0x37ec, 0x4074, 0x1559, 0xb2e7, 0xbfe0, 0xb2b4, 0x41cb, 0x0d6c, 0x433a, 0xbf64, 0x1d3e, 0xb2f3, 0xba2e, 0x4020, 0xba4f, 0xb2b6, 0x43ff, 0xa82c, 0x1929, 0x421e, 0x18af, 0x4415, 0xbf33, 0x4698, 0x1b4a, 0x27e0, 0x40f2, 0xb25e, 0xba7b, 0xb26a, 0x4309, 0x4064, 0x402b, 0x4098, 0xb245, 0x43bd, 0x0c9f, 0x42de, 0x015f, 0x4321, 0x1a23, 0xb28e, 0xba29, 0x406b, 0x1998, 0x4265, 0xbf38, 0x4314, 0xb2b6, 0x165c, 0xbafc, 0xbf70, 0xb048, 0xba43, 0x46bb, 0x4001, 0x0cb8, 0x43fb, 0x270f, 0xb2fc, 0x0ae9, 0x4223, 0x423f, 0x26fd, 0x419e, 0xa390, 0xb0ff, 0xb2cf, 0x0bc0, 0xbf4b, 0x4135, 0x4559, 0xb2bf, 0xba2e, 0xa3e9, 0x4310, 0xba44, 0x43ff, 0x4394, 0x401c, 0x41f6, 0x42d0, 0xbf84, 0xa7d9, 0x42c0, 0x0a4b, 0x4285, 0x42a0, 0xb040, 0x1ba8, 0xa9fa, 0xba04, 0x358a, 0x4003, 0x46d4, 0x41fe, 0xba48, 0x2c12, 0x41a3, 0x4161, 0x4372, 0x448b, 0xbf98, 0x0627, 0xb23c, 0x4170, 0x0a61, 0xb279, 0x4260, 0x06b6, 0x3f4f, 0x4319, 0x40a8, 0x24ea, 0xbfe8, 0x412c, 0x3af2, 0x415d, 0x42f8, 0x27fc, 0xb04c, 0x2615, 0x432f, 0x447e, 0xb0b6, 0xb0e8, 0xbf15, 0x4034, 0xbadf, 0xba1e, 0x43d6, 0x00f1, 0x2101, 0xb229, 0x270d, 0x0d8f, 0x1c5a, 0x3665, 0x4364, 0xbad0, 0x435f, 0x1ae3, 0x20f4, 0x42f6, 0x4606, 0x38db, 0x1391, 0x42ee, 0x4550, 0xb233, 0xa680, 0x4310, 0x4005, 0x41a2, 0x42dc, 0x43e8, 0xbf0e, 0xb2ad, 0xa2f4, 0x1508, 0xae86, 0x4320, 0xbf55, 0x2d19, 0x43ef, 0x42db, 0xb0a9, 0x3556, 0xb01e, 0x4176, 0x43b8, 0x4462, 0x077f, 0xba0b, 0x42d6, 0xb2c2, 0x4336, 0x4384, 0xb2bf, 0x4002, 0x4262, 0x1f32, 0x46db, 0x4239, 0xb200, 0x1f3c, 0x4167, 0xb23b, 0xb0d4, 0x43cd, 0x0623, 0xbfb5, 0x2020, 0x1c56, 0x1cf6, 0x433f, 0x43b3, 0x429e, 0x41e3, 0xb2aa, 0x43fd, 0x1cac, 0x3d18, 0x4077, 0x411f, 0x4058, 0x43dd, 0xb244, 0x41ee, 0x4268, 0x2fa0, 0x243a, 0xb00a, 0xb2e4, 0x3b24, 0xa3df, 0xbfa6, 0x42c4, 0xb072, 0x1cbb, 0x4090, 0xbf9f, 0xba2a, 0x3835, 0xb27c, 0x4217, 0x4283, 0xb232, 0xbf1c, 0x43c9, 0xb2a2, 0xb2a3, 0x4194, 0xb25c, 0xbf92, 0x4085, 0x4278, 0x4073, 0x40b4, 0x423c, 0x1d1a, 0xbac1, 0x43b0, 0x4330, 0x1c88, 0xb210, 0x2e6a, 0x4018, 0x41ac, 0x0ac5, 0xb2ea, 0x4569, 0x141c, 0xbf8b, 0xbf70, 0x42ab, 0x4031, 0xbacb, 0x41ec, 0x4019, 0x3670, 0x2cf6, 0x401f, 0x26a1, 0x41eb, 0xb23f, 0xb221, 0x4671, 0xb2bb, 0xbf60, 0x363e, 0x420b, 0xab50, 0xbf77, 0x1e0f, 0xae4e, 0xb025, 0xba19, 0x1f73, 0x37a5, 0x1c37, 0xbf90, 0xbf93, 0xb058, 0x1c46, 0x1c5d, 0x19a0, 0x0b41, 0xbfa0, 0xb2ae, 0x1f46, 0xb237, 0x14c9, 0x405c, 0x2f26, 0x46e8, 0x41a5, 0x46b0, 0xb22d, 0xb03f, 0x1fc2, 0x3b4f, 0xbfa6, 0x1faa, 0x432c, 0x19ea, 0x40f5, 0x4246, 0x1f94, 0x4385, 0xa1df, 0x38f5, 0x049a, 0x455f, 0xa132, 0x08ee, 0x1c37, 0xbfa0, 0x1e5e, 0x401a, 0x43ac, 0x402c, 0x4222, 0x3931, 0x2124, 0x44aa, 0x42a8, 0xb0f0, 0xa8c8, 0x1e5e, 0xa92c, 0xbf65, 0x4045, 0xbaeb, 0xba57, 0x44ad, 0xac8a, 0x420b, 0x353f, 0xb23e, 0xa0ff, 0x1872, 0x41cb, 0xb22e, 0xb0cc, 0x4213, 0x40e3, 0x0aef, 0x411c, 0xb0bc, 0x1d52, 0xa778, 0xb0d0, 0xbf56, 0x43d1, 0x42f4, 0x1d5b, 0x1dc2, 0x0f45, 0x4381, 0xb214, 0xb09f, 0x4175, 0x4680, 0x24ea, 0xb231, 0xb264, 0xa2ed, 0xbace, 0x181b, 0xbf08, 0x42a5, 0xa7c2, 0x4018, 0xbfbf, 0xb2b2, 0x4309, 0x4264, 0x02c3, 0xa5f0, 0x1d34, 0xb209, 0x4090, 0x3005, 0x431d, 0xb223, 0x434e, 0x0cec, 0x0970, 0x43d2, 0x402e, 0x403d, 0x1385, 0x1eac, 0x1fe2, 0x427b, 0x0159, 0x0702, 0x0390, 0xbf6b, 0x40e8, 0x403d, 0xa17c, 0x2fb8, 0x41ec, 0x4112, 0xba4c, 0x2c3a, 0xaecc, 0x458a, 0x435a, 0x1950, 0x429d, 0x1d8e, 0xaf4e, 0x36e9, 0xb205, 0xb0d3, 0x4394, 0x4489, 0x425e, 0x01cf, 0xbae3, 0x4131, 0xbae9, 0x4001, 0x0f9b, 0x431c, 0xbf91, 0xabc7, 0x40b6, 0xba5c, 0xa210, 0xbaf8, 0x0f46, 0x43d3, 0x3404, 0xaaea, 0x430e, 0x4248, 0x1d7e, 0x42e1, 0x41ff, 0x011a, 0xb230, 0x4037, 0x0e79, 0x3a4a, 0xb0d9, 0xbf97, 0xb21f, 0xafa8, 0xa731, 0x4185, 0x1b7d, 0xb095, 0x4156, 0xb2cb, 0x14d5, 0x41e0, 0x40b7, 0x31e8, 0x42ee, 0x2060, 0x3a39, 0x419b, 0x40a7, 0x1e06, 0x39bc, 0x1930, 0x4238, 0x412b, 0x43e6, 0xbfcb, 0xbaf1, 0x3518, 0x27a0, 0x42d2, 0xb2a4, 0xbfdc, 0x4293, 0x4337, 0xae16, 0x4429, 0x4050, 0xb079, 0x4031, 0x1638, 0x420b, 0x1f17, 0x43a4, 0x1bf4, 0x433b, 0x178f, 0x4060, 0xbf7b, 0x4339, 0x43d1, 0x40c6, 0xbaea, 0x154c, 0x4247, 0x412a, 0x41a0, 0x41d1, 0x4260, 0xbacf, 0x20af, 0x4285, 0x126a, 0xbf44, 0xbfb0, 0x4425, 0xb22f, 0x1a6f, 0x427c, 0x4196, 0x4367, 0x4213, 0x1620, 0xbf7b, 0x4565, 0x32f9, 0x40b2, 0x395c, 0x4105, 0xbf70, 0xbfb5, 0x412d, 0x409e, 0x180e, 0x1a80, 0x4136, 0x27e3, 0xbae3, 0x1c3a, 0xb213, 0x1301, 0xb2fb, 0xb098, 0xbfd0, 0x324c, 0x2876, 0xab33, 0x1c23, 0x248e, 0xb256, 0x1dd9, 0x0d3e, 0x01e8, 0x403b, 0x40fa, 0x41a4, 0x41f6, 0xbf69, 0x4371, 0x40dd, 0x46a1, 0x402c, 0x41e8, 0xba49, 0x40d7, 0x4605, 0x1aa1, 0x37d2, 0xba62, 0xbf61, 0xb28b, 0x4136, 0x36ee, 0x40fc, 0x3ead, 0x412c, 0x43aa, 0x233d, 0x3ac3, 0x421a, 0x4117, 0x091d, 0xb2c9, 0x163a, 0x408b, 0x4273, 0x141e, 0xa5b2, 0x40da, 0x4082, 0xbfd8, 0x4080, 0x4347, 0x1830, 0x414c, 0xbafe, 0xbf07, 0x21d3, 0x435b, 0x415c, 0xbf00, 0xb285, 0x0453, 0x1b3f, 0x383a, 0x40db, 0x36f2, 0xba4d, 0x4128, 0xbf72, 0x428f, 0xa6c7, 0x19c1, 0x2878, 0x1f51, 0xba30, 0xbae9, 0x4346, 0x43c2, 0x0c82, 0x1d23, 0x466b, 0x40e0, 0xba10, 0xac8c, 0x1ff2, 0x1adf, 0x4356, 0x401c, 0xbaf8, 0xac9d, 0xb000, 0x41e9, 0xb297, 0x4155, 0xbfdb, 0xb04e, 0xb281, 0x43a2, 0x428c, 0xb2d8, 0x42bb, 0x2cfb, 0xb2de, 0x1fc8, 0x4301, 0x45f2, 0x1ee3, 0x04c6, 0xba61, 0x4002, 0x0798, 0xb29a, 0x433d, 0x1e61, 0x42fb, 0xbf56, 0x411f, 0xb0ed, 0xbf90, 0x456d, 0x1437, 0x413c, 0x4126, 0x42ca, 0xbad4, 0x1917, 0x4350, 0xbae2, 0x4135, 0x0247, 0x418b, 0x151d, 0x173d, 0x4054, 0xb284, 0xb22f, 0x4296, 0xb28f, 0x2e6c, 0xb2c0, 0x1f1c, 0xbfa9, 0x0906, 0xba7e, 0x1b04, 0xba58, 0xbaee, 0x4000, 0xb200, 0xb0d5, 0x414f, 0x14ff, 0xb0a0, 0x4220, 0x4249, 0xba6a, 0x4187, 0xbf53, 0x43bd, 0x1de3, 0x467d, 0x3a73, 0x18c3, 0x4263, 0x42cd, 0x42ec, 0x44b5, 0x089b, 0x1ce1, 0x18d2, 0x41d3, 0x3636, 0x1de6, 0xba4c, 0xb08d, 0x1b88, 0x1d9e, 0x3a85, 0xbfd3, 0xb051, 0xb2cd, 0x1c2b, 0xb07a, 0xb261, 0x07f4, 0x3ffa, 0xb0a1, 0x42a9, 0x40f3, 0xba2c, 0x40d5, 0xb026, 0x08bd, 0x415d, 0x1e67, 0x4377, 0x43c9, 0x1d0c, 0xb278, 0x437e, 0x4159, 0x456c, 0xbf90, 0x4191, 0x428e, 0xbfa9, 0x2e5f, 0x43af, 0x41d7, 0xb259, 0x42e0, 0x4221, 0xb2d4, 0xb07e, 0x4186, 0xbf80, 0x40a3, 0x45bd, 0x416a, 0x4324, 0x4068, 0x3029, 0x43dc, 0x41d1, 0xa79d, 0xbf1d, 0x2443, 0xba2b, 0x4111, 0x1a70, 0xa102, 0x43a3, 0xb0c8, 0xba62, 0x41b6, 0x41b6, 0x09a5, 0x41a6, 0x427a, 0x3e4d, 0x419e, 0x062f, 0xb24e, 0x1110, 0x41c9, 0x41ad, 0x2a40, 0xbf6b, 0x4279, 0x4347, 0xb242, 0xb2b0, 0x097c, 0x460e, 0x1e67, 0x4144, 0xa11e, 0x1ee4, 0x351d, 0xb247, 0x43f5, 0x1a26, 0x4357, 0x41fa, 0x40cb, 0x41ac, 0xba63, 0x1d28, 0xba76, 0x28e1, 0x38e7, 0x4098, 0x42b3, 0xbfbd, 0xb2bc, 0xbadc, 0xbad0, 0xba1a, 0x40fd, 0x42ca, 0x40ad, 0x42d4, 0xb251, 0xb2f2, 0xb2fd, 0x4138, 0x1b82, 0xba23, 0x1efb, 0x11d5, 0x413c, 0xb273, 0x1ce6, 0xa2a1, 0xbf79, 0x4197, 0x43e3, 0xbae9, 0x4015, 0x43e9, 0xa21c, 0xb0d0, 0x4059, 0x408f, 0x4067, 0x4387, 0xb2f2, 0x461b, 0x4019, 0x40a4, 0x4619, 0x41f1, 0xb04c, 0x46ac, 0x43d7, 0xa438, 0x4108, 0x0e03, 0xba59, 0x41e4, 0x43db, 0xb2e0, 0xb2b8, 0x1f88, 0xbf55, 0x432d, 0xb223, 0x09e7, 0xaea6, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x76fb2e83, 0x2c9a97ce, 0x4afe2dc9, 0x2a8a6d29, 0xf34a1d2a, 0xe92c22a4, 0xcd859d8b, 0xab9291ff, 0xdca83fbb, 0x24a63f86, 0xf4d326a0, 0xc55ab8ca, 0x50c313fb, 0x47bdd172, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0xfffffffa, 0x00000000, 0x00000003, 0x0000018a, 0x4000018a, 0xff91f802, 0x47bdd252, 0xfffffffc, 0x000017c0, 0x24a35e06, 0x20022b04, 0x47bdd732, 0xff91f802, 0x47bdcfba, 0x00000000, 0x800001d0 }, + Instructions = [0xa6c2, 0x4488, 0xb2d1, 0xb06a, 0x4083, 0x44ca, 0xba42, 0x1d14, 0x420d, 0xbade, 0x4103, 0x40f9, 0x4003, 0xb0d9, 0x4552, 0xbfcc, 0xa2db, 0xa663, 0xba1e, 0x2e6c, 0x43d1, 0x407f, 0x401a, 0xb2c1, 0x4631, 0x0681, 0xa7bb, 0x4649, 0xb05b, 0xbfe1, 0x28a0, 0x1af0, 0x16fa, 0x45c8, 0xab5a, 0x4399, 0x4423, 0x1bdd, 0xb044, 0x2499, 0x4440, 0x3ee0, 0xb02f, 0x0ddd, 0x4127, 0xbf08, 0xba20, 0xba1c, 0x03ac, 0xb0f7, 0x40e5, 0x4116, 0x4116, 0x468a, 0x422d, 0xb2d9, 0x43c9, 0x41ea, 0x4054, 0xbace, 0x437c, 0xbf91, 0x40a4, 0xb247, 0x18af, 0x16e1, 0xb255, 0xbade, 0xb0a3, 0x1f17, 0xbf47, 0xb0be, 0x1037, 0xb2b8, 0x175f, 0x18fc, 0xb286, 0x41bd, 0x46f3, 0x42b4, 0x0b47, 0x4359, 0x18c2, 0xadd5, 0xbf2c, 0x1c76, 0xba76, 0x4132, 0xba48, 0x43f4, 0x168c, 0x416e, 0xbfab, 0x4194, 0x1bc0, 0x28da, 0x42c5, 0x4423, 0x41ff, 0xb2ff, 0xb008, 0x20d3, 0x437e, 0x4034, 0xba40, 0x425e, 0xa06c, 0xba68, 0xba72, 0x00eb, 0x41b2, 0x411e, 0x1b3d, 0x2f08, 0xb089, 0x411a, 0x14ff, 0xb2be, 0x4633, 0xbf7d, 0x4150, 0x40c2, 0xb28a, 0x1e72, 0xba3d, 0x0aae, 0x435e, 0x205c, 0xb067, 0x4353, 0x21c0, 0x43e1, 0x4141, 0x0572, 0x43ae, 0x427c, 0x42ae, 0x4026, 0x2df2, 0x405c, 0x37ec, 0x4074, 0x1559, 0xb2e7, 0xbfe0, 0xb2b4, 0x41cb, 0x0d6c, 0x433a, 0xbf64, 0x1d3e, 0xb2f3, 0xba2e, 0x4020, 0xba4f, 0xb2b6, 0x43ff, 0xa82c, 0x1929, 0x421e, 0x18af, 0x4415, 0xbf33, 0x4698, 0x1b4a, 0x27e0, 0x40f2, 0xb25e, 0xba7b, 0xb26a, 0x4309, 0x4064, 0x402b, 0x4098, 0xb245, 0x43bd, 0x0c9f, 0x42de, 0x015f, 0x4321, 0x1a23, 0xb28e, 0xba29, 0x406b, 0x1998, 0x4265, 0xbf38, 0x4314, 0xb2b6, 0x165c, 0xbafc, 0xbf70, 0xb048, 0xba43, 0x46bb, 0x4001, 0x0cb8, 0x43fb, 0x270f, 0xb2fc, 0x0ae9, 0x4223, 0x423f, 0x26fd, 0x419e, 0xa390, 0xb0ff, 0xb2cf, 0x0bc0, 0xbf4b, 0x4135, 0x4559, 0xb2bf, 0xba2e, 0xa3e9, 0x4310, 0xba44, 0x43ff, 0x4394, 0x401c, 0x41f6, 0x42d0, 0xbf84, 0xa7d9, 0x42c0, 0x0a4b, 0x4285, 0x42a0, 0xb040, 0x1ba8, 0xa9fa, 0xba04, 0x358a, 0x4003, 0x46d4, 0x41fe, 0xba48, 0x2c12, 0x41a3, 0x4161, 0x4372, 0x448b, 0xbf98, 0x0627, 0xb23c, 0x4170, 0x0a61, 0xb279, 0x4260, 0x06b6, 0x3f4f, 0x4319, 0x40a8, 0x24ea, 0xbfe8, 0x412c, 0x3af2, 0x415d, 0x42f8, 0x27fc, 0xb04c, 0x2615, 0x432f, 0x447e, 0xb0b6, 0xb0e8, 0xbf15, 0x4034, 0xbadf, 0xba1e, 0x43d6, 0x00f1, 0x2101, 0xb229, 0x270d, 0x0d8f, 0x1c5a, 0x3665, 0x4364, 0xbad0, 0x435f, 0x1ae3, 0x20f4, 0x42f6, 0x4606, 0x38db, 0x1391, 0x42ee, 0x4550, 0xb233, 0xa680, 0x4310, 0x4005, 0x41a2, 0x42dc, 0x43e8, 0xbf0e, 0xb2ad, 0xa2f4, 0x1508, 0xae86, 0x4320, 0xbf55, 0x2d19, 0x43ef, 0x42db, 0xb0a9, 0x3556, 0xb01e, 0x4176, 0x43b8, 0x4462, 0x077f, 0xba0b, 0x42d6, 0xb2c2, 0x4336, 0x4384, 0xb2bf, 0x4002, 0x4262, 0x1f32, 0x46db, 0x4239, 0xb200, 0x1f3c, 0x4167, 0xb23b, 0xb0d4, 0x43cd, 0x0623, 0xbfb5, 0x2020, 0x1c56, 0x1cf6, 0x433f, 0x43b3, 0x429e, 0x41e3, 0xb2aa, 0x43fd, 0x1cac, 0x3d18, 0x4077, 0x411f, 0x4058, 0x43dd, 0xb244, 0x41ee, 0x4268, 0x2fa0, 0x243a, 0xb00a, 0xb2e4, 0x3b24, 0xa3df, 0xbfa6, 0x42c4, 0xb072, 0x1cbb, 0x4090, 0xbf9f, 0xba2a, 0x3835, 0xb27c, 0x4217, 0x4283, 0xb232, 0xbf1c, 0x43c9, 0xb2a2, 0xb2a3, 0x4194, 0xb25c, 0xbf92, 0x4085, 0x4278, 0x4073, 0x40b4, 0x423c, 0x1d1a, 0xbac1, 0x43b0, 0x4330, 0x1c88, 0xb210, 0x2e6a, 0x4018, 0x41ac, 0x0ac5, 0xb2ea, 0x4569, 0x141c, 0xbf8b, 0xbf70, 0x42ab, 0x4031, 0xbacb, 0x41ec, 0x4019, 0x3670, 0x2cf6, 0x401f, 0x26a1, 0x41eb, 0xb23f, 0xb221, 0x4671, 0xb2bb, 0xbf60, 0x363e, 0x420b, 0xab50, 0xbf77, 0x1e0f, 0xae4e, 0xb025, 0xba19, 0x1f73, 0x37a5, 0x1c37, 0xbf90, 0xbf93, 0xb058, 0x1c46, 0x1c5d, 0x19a0, 0x0b41, 0xbfa0, 0xb2ae, 0x1f46, 0xb237, 0x14c9, 0x405c, 0x2f26, 0x46e8, 0x41a5, 0x46b0, 0xb22d, 0xb03f, 0x1fc2, 0x3b4f, 0xbfa6, 0x1faa, 0x432c, 0x19ea, 0x40f5, 0x4246, 0x1f94, 0x4385, 0xa1df, 0x38f5, 0x049a, 0x455f, 0xa132, 0x08ee, 0x1c37, 0xbfa0, 0x1e5e, 0x401a, 0x43ac, 0x402c, 0x4222, 0x3931, 0x2124, 0x44aa, 0x42a8, 0xb0f0, 0xa8c8, 0x1e5e, 0xa92c, 0xbf65, 0x4045, 0xbaeb, 0xba57, 0x44ad, 0xac8a, 0x420b, 0x353f, 0xb23e, 0xa0ff, 0x1872, 0x41cb, 0xb22e, 0xb0cc, 0x4213, 0x40e3, 0x0aef, 0x411c, 0xb0bc, 0x1d52, 0xa778, 0xb0d0, 0xbf56, 0x43d1, 0x42f4, 0x1d5b, 0x1dc2, 0x0f45, 0x4381, 0xb214, 0xb09f, 0x4175, 0x4680, 0x24ea, 0xb231, 0xb264, 0xa2ed, 0xbace, 0x181b, 0xbf08, 0x42a5, 0xa7c2, 0x4018, 0xbfbf, 0xb2b2, 0x4309, 0x4264, 0x02c3, 0xa5f0, 0x1d34, 0xb209, 0x4090, 0x3005, 0x431d, 0xb223, 0x434e, 0x0cec, 0x0970, 0x43d2, 0x402e, 0x403d, 0x1385, 0x1eac, 0x1fe2, 0x427b, 0x0159, 0x0702, 0x0390, 0xbf6b, 0x40e8, 0x403d, 0xa17c, 0x2fb8, 0x41ec, 0x4112, 0xba4c, 0x2c3a, 0xaecc, 0x458a, 0x435a, 0x1950, 0x429d, 0x1d8e, 0xaf4e, 0x36e9, 0xb205, 0xb0d3, 0x4394, 0x4489, 0x425e, 0x01cf, 0xbae3, 0x4131, 0xbae9, 0x4001, 0x0f9b, 0x431c, 0xbf91, 0xabc7, 0x40b6, 0xba5c, 0xa210, 0xbaf8, 0x0f46, 0x43d3, 0x3404, 0xaaea, 0x430e, 0x4248, 0x1d7e, 0x42e1, 0x41ff, 0x011a, 0xb230, 0x4037, 0x0e79, 0x3a4a, 0xb0d9, 0xbf97, 0xb21f, 0xafa8, 0xa731, 0x4185, 0x1b7d, 0xb095, 0x4156, 0xb2cb, 0x14d5, 0x41e0, 0x40b7, 0x31e8, 0x42ee, 0x2060, 0x3a39, 0x419b, 0x40a7, 0x1e06, 0x39bc, 0x1930, 0x4238, 0x412b, 0x43e6, 0xbfcb, 0xbaf1, 0x3518, 0x27a0, 0x42d2, 0xb2a4, 0xbfdc, 0x4293, 0x4337, 0xae16, 0x4429, 0x4050, 0xb079, 0x4031, 0x1638, 0x420b, 0x1f17, 0x43a4, 0x1bf4, 0x433b, 0x178f, 0x4060, 0xbf7b, 0x4339, 0x43d1, 0x40c6, 0xbaea, 0x154c, 0x4247, 0x412a, 0x41a0, 0x41d1, 0x4260, 0xbacf, 0x20af, 0x4285, 0x126a, 0xbf44, 0xbfb0, 0x4425, 0xb22f, 0x1a6f, 0x427c, 0x4196, 0x4367, 0x4213, 0x1620, 0xbf7b, 0x4565, 0x32f9, 0x40b2, 0x395c, 0x4105, 0xbf70, 0xbfb5, 0x412d, 0x409e, 0x180e, 0x1a80, 0x4136, 0x27e3, 0xbae3, 0x1c3a, 0xb213, 0x1301, 0xb2fb, 0xb098, 0xbfd0, 0x324c, 0x2876, 0xab33, 0x1c23, 0x248e, 0xb256, 0x1dd9, 0x0d3e, 0x01e8, 0x403b, 0x40fa, 0x41a4, 0x41f6, 0xbf69, 0x4371, 0x40dd, 0x46a1, 0x402c, 0x41e8, 0xba49, 0x40d7, 0x4605, 0x1aa1, 0x37d2, 0xba62, 0xbf61, 0xb28b, 0x4136, 0x36ee, 0x40fc, 0x3ead, 0x412c, 0x43aa, 0x233d, 0x3ac3, 0x421a, 0x4117, 0x091d, 0xb2c9, 0x163a, 0x408b, 0x4273, 0x141e, 0xa5b2, 0x40da, 0x4082, 0xbfd8, 0x4080, 0x4347, 0x1830, 0x414c, 0xbafe, 0xbf07, 0x21d3, 0x435b, 0x415c, 0xbf00, 0xb285, 0x0453, 0x1b3f, 0x383a, 0x40db, 0x36f2, 0xba4d, 0x4128, 0xbf72, 0x428f, 0xa6c7, 0x19c1, 0x2878, 0x1f51, 0xba30, 0xbae9, 0x4346, 0x43c2, 0x0c82, 0x1d23, 0x466b, 0x40e0, 0xba10, 0xac8c, 0x1ff2, 0x1adf, 0x4356, 0x401c, 0xbaf8, 0xac9d, 0xb000, 0x41e9, 0xb297, 0x4155, 0xbfdb, 0xb04e, 0xb281, 0x43a2, 0x428c, 0xb2d8, 0x42bb, 0x2cfb, 0xb2de, 0x1fc8, 0x4301, 0x45f2, 0x1ee3, 0x04c6, 0xba61, 0x4002, 0x0798, 0xb29a, 0x433d, 0x1e61, 0x42fb, 0xbf56, 0x411f, 0xb0ed, 0xbf90, 0x456d, 0x1437, 0x413c, 0x4126, 0x42ca, 0xbad4, 0x1917, 0x4350, 0xbae2, 0x4135, 0x0247, 0x418b, 0x151d, 0x173d, 0x4054, 0xb284, 0xb22f, 0x4296, 0xb28f, 0x2e6c, 0xb2c0, 0x1f1c, 0xbfa9, 0x0906, 0xba7e, 0x1b04, 0xba58, 0xbaee, 0x4000, 0xb200, 0xb0d5, 0x414f, 0x14ff, 0xb0a0, 0x4220, 0x4249, 0xba6a, 0x4187, 0xbf53, 0x43bd, 0x1de3, 0x467d, 0x3a73, 0x18c3, 0x4263, 0x42cd, 0x42ec, 0x44b5, 0x089b, 0x1ce1, 0x18d2, 0x41d3, 0x3636, 0x1de6, 0xba4c, 0xb08d, 0x1b88, 0x1d9e, 0x3a85, 0xbfd3, 0xb051, 0xb2cd, 0x1c2b, 0xb07a, 0xb261, 0x07f4, 0x3ffa, 0xb0a1, 0x42a9, 0x40f3, 0xba2c, 0x40d5, 0xb026, 0x08bd, 0x415d, 0x1e67, 0x4377, 0x43c9, 0x1d0c, 0xb278, 0x437e, 0x4159, 0x456c, 0xbf90, 0x4191, 0x428e, 0xbfa9, 0x2e5f, 0x43af, 0x41d7, 0xb259, 0x42e0, 0x4221, 0xb2d4, 0xb07e, 0x4186, 0xbf80, 0x40a3, 0x45bd, 0x416a, 0x4324, 0x4068, 0x3029, 0x43dc, 0x41d1, 0xa79d, 0xbf1d, 0x2443, 0xba2b, 0x4111, 0x1a70, 0xa102, 0x43a3, 0xb0c8, 0xba62, 0x41b6, 0x41b6, 0x09a5, 0x41a6, 0x427a, 0x3e4d, 0x419e, 0x062f, 0xb24e, 0x1110, 0x41c9, 0x41ad, 0x2a40, 0xbf6b, 0x4279, 0x4347, 0xb242, 0xb2b0, 0x097c, 0x460e, 0x1e67, 0x4144, 0xa11e, 0x1ee4, 0x351d, 0xb247, 0x43f5, 0x1a26, 0x4357, 0x41fa, 0x40cb, 0x41ac, 0xba63, 0x1d28, 0xba76, 0x28e1, 0x38e7, 0x4098, 0x42b3, 0xbfbd, 0xb2bc, 0xbadc, 0xbad0, 0xba1a, 0x40fd, 0x42ca, 0x40ad, 0x42d4, 0xb251, 0xb2f2, 0xb2fd, 0x4138, 0x1b82, 0xba23, 0x1efb, 0x11d5, 0x413c, 0xb273, 0x1ce6, 0xa2a1, 0xbf79, 0x4197, 0x43e3, 0xbae9, 0x4015, 0x43e9, 0xa21c, 0xb0d0, 0x4059, 0x408f, 0x4067, 0x4387, 0xb2f2, 0x461b, 0x4019, 0x40a4, 0x4619, 0x41f1, 0xb04c, 0x46ac, 0x43d7, 0xa438, 0x4108, 0x0e03, 0xba59, 0x41e4, 0x43db, 0xb2e0, 0xb2b8, 0x1f88, 0xbf55, 0x432d, 0xb223, 0x09e7, 0xaea6, 0x4770, 0xe7fe + ], + StartRegs = [0x76fb2e83, 0x2c9a97ce, 0x4afe2dc9, 0x2a8a6d29, 0xf34a1d2a, 0xe92c22a4, 0xcd859d8b, 0xab9291ff, 0xdca83fbb, 0x24a63f86, 0xf4d326a0, 0xc55ab8ca, 0x50c313fb, 0x47bdd172, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0xfffffffa, 0x00000000, 0x00000003, 0x0000018a, 0x4000018a, 0xff91f802, 0x47bdd252, 0xfffffffc, 0x000017c0, 0x24a35e06, 0x20022b04, 0x47bdd732, 0xff91f802, 0x47bdcfba, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0xb247, 0xbac6, 0xb2bc, 0xba00, 0x4236, 0x4542, 0xbf84, 0x4353, 0x454b, 0x2d7d, 0xb214, 0xbf73, 0x2346, 0x1da1, 0xa600, 0x41de, 0xb0cf, 0x45c5, 0xb057, 0xbf11, 0x43f5, 0x4171, 0x026e, 0x2a0c, 0xafe4, 0x4215, 0xba19, 0x3837, 0x4677, 0x428a, 0xb281, 0xb2e1, 0x43af, 0x427f, 0xbf45, 0x41ef, 0xb289, 0x2c54, 0x4128, 0x4076, 0xb2d4, 0x41c2, 0x191b, 0x438c, 0xa81f, 0xb075, 0xb2e1, 0xbfb9, 0x4396, 0x2ac3, 0x4052, 0x4453, 0xb2c7, 0x40b6, 0x4273, 0x40b6, 0x424e, 0x449d, 0x0849, 0x42c1, 0xa3b4, 0x2413, 0x1e42, 0x40c1, 0x41f8, 0x1e05, 0xbf6e, 0xbae1, 0x1e62, 0x445c, 0x3418, 0x4363, 0x4094, 0x445c, 0x4283, 0x4611, 0xa556, 0x42fb, 0x1f16, 0x43f5, 0x1a7a, 0x020f, 0xba79, 0xbf24, 0x44cb, 0x0902, 0x4376, 0x19ed, 0x4181, 0x41b4, 0xb222, 0x4391, 0xbfcd, 0x05b5, 0x1fa3, 0x422c, 0xb210, 0x18d5, 0xbf70, 0x40c1, 0x42b9, 0x107f, 0xb281, 0xa90c, 0xbfba, 0x4301, 0x4282, 0xb254, 0x2d6a, 0x42d5, 0x42c1, 0x3ff4, 0xb09d, 0x0856, 0x41a4, 0x4357, 0x42d8, 0xbfd9, 0x3dcf, 0xba42, 0x206a, 0x4168, 0x1f5e, 0x460a, 0x0f10, 0xa577, 0x456c, 0x3967, 0x4643, 0xbf4e, 0x4183, 0x36fb, 0x41ea, 0xb0dc, 0x32d3, 0x43ee, 0x31b0, 0x4030, 0x407c, 0xb22d, 0x4455, 0x3342, 0xb0d7, 0xbf83, 0x1c18, 0x35e6, 0xb063, 0x4315, 0x45ec, 0x1f25, 0x18e9, 0xb264, 0xa7c2, 0x3e41, 0x43b8, 0x3363, 0x0c12, 0x0d27, 0x3e41, 0xbfb0, 0xba45, 0xa29a, 0xabaa, 0x3d44, 0xb2f5, 0xa599, 0x3ed6, 0x423f, 0x45da, 0x28ca, 0x40aa, 0x4288, 0x2acc, 0xbfc6, 0x21e5, 0x41a9, 0x4140, 0x4236, 0x0189, 0xb21a, 0x197d, 0xbf93, 0x13b7, 0x44a5, 0x3404, 0x443b, 0x421b, 0xba46, 0xba41, 0xb2d1, 0x022f, 0xb276, 0xba18, 0xb26a, 0xb20e, 0xb294, 0x42c5, 0x42f5, 0x1b96, 0x11dc, 0x1c7e, 0xbfb5, 0x46db, 0xab1b, 0x416e, 0xb0a2, 0xb2ab, 0x43dc, 0x3076, 0xba40, 0x2e15, 0xba09, 0xb2df, 0x4100, 0x4139, 0x004d, 0x40fe, 0xbf38, 0xa914, 0x42b4, 0x43cb, 0x43e8, 0x407c, 0x21cf, 0x2d7f, 0xb2e4, 0xb26f, 0xb2e2, 0x18d5, 0xb03e, 0x45a8, 0x433a, 0xb235, 0x44b4, 0xb000, 0x43ea, 0x313a, 0x4641, 0xb268, 0x3771, 0x40e5, 0xbff0, 0xbf9c, 0x4051, 0xba56, 0x07db, 0xb2b3, 0xb0e7, 0x40ed, 0xb264, 0x4193, 0xb08b, 0x422e, 0x4079, 0x26bc, 0x42e8, 0xba16, 0xa565, 0xba1c, 0xb06c, 0x409b, 0x43f5, 0x41fb, 0x42fa, 0xb2ea, 0x4184, 0x23d2, 0x431b, 0x4125, 0x1ef6, 0xbfa3, 0xaecf, 0x44b8, 0xb2a2, 0x1b75, 0x4145, 0x46f4, 0x42d4, 0x11f0, 0xb255, 0x411d, 0x121a, 0x42d1, 0x1a78, 0xbfae, 0x1d7b, 0xb0e1, 0x40e4, 0x422b, 0x428a, 0xba68, 0x18d6, 0x2f33, 0x4093, 0x433d, 0xbf32, 0x45c9, 0x4227, 0x423b, 0x41a1, 0x0f2d, 0x2021, 0x4679, 0x1f9b, 0x418c, 0x436b, 0xbf87, 0x41e4, 0x41bd, 0x407b, 0xa9d5, 0x1e4b, 0x00d3, 0x4389, 0x42b6, 0x46bd, 0x401e, 0x4067, 0x41d4, 0x4341, 0x4146, 0x2898, 0x463d, 0x1ece, 0x324f, 0xbaed, 0x4186, 0xbf31, 0x1dc1, 0xb275, 0x3cd7, 0xbf00, 0x4162, 0x4202, 0x431b, 0xba19, 0xb281, 0x40f0, 0xb2d9, 0x1ebc, 0xb2ae, 0x40ec, 0x42c1, 0xb2b9, 0x4241, 0x1eec, 0x081f, 0x4225, 0x3497, 0x4371, 0xac55, 0xad9c, 0xbf7e, 0xa740, 0x1a53, 0xb2ee, 0x0406, 0x403a, 0x40de, 0x1ea4, 0x4252, 0xa544, 0x41b5, 0xba14, 0x4225, 0x42c2, 0x430d, 0xbf43, 0x40db, 0xa456, 0x1b59, 0x4347, 0xb2b6, 0xbff0, 0xbae4, 0x4363, 0xb200, 0x40dd, 0xba74, 0x420a, 0xbf2e, 0xa9e7, 0x3c0c, 0x4285, 0x13d7, 0xb28b, 0xb05e, 0x1826, 0x42bd, 0x2d51, 0x4242, 0x4227, 0xbfd3, 0x43fb, 0x41ce, 0x4171, 0x416e, 0x4313, 0xa531, 0x4302, 0x010c, 0x201b, 0x2549, 0x45b4, 0x1366, 0x41a2, 0xba6f, 0xb2f8, 0x4049, 0x1e75, 0x4471, 0x45be, 0x1814, 0x4430, 0x415e, 0xbf4f, 0x187a, 0x418d, 0x2a18, 0xb278, 0x4002, 0x2b61, 0xbf6f, 0x06cc, 0x4265, 0x41fb, 0x408d, 0xbf56, 0x3963, 0x1e83, 0x45c0, 0xa06b, 0xa6e9, 0xb252, 0x1e7d, 0xb000, 0x4024, 0xb0ab, 0x4394, 0x418b, 0x1873, 0xaeb9, 0xbfaf, 0x4331, 0x1e39, 0x4405, 0x1ccb, 0x274d, 0x4344, 0xb0be, 0x41ca, 0x4268, 0x431f, 0x44c9, 0x41bf, 0x40d0, 0x42f3, 0xb09a, 0x1c08, 0x2223, 0xbf24, 0x0599, 0x46a3, 0x4207, 0x4114, 0xbf48, 0x1e64, 0xb0fe, 0x2c19, 0x4074, 0xab7a, 0x41d7, 0x4262, 0x46b0, 0x15eb, 0x42ae, 0xb23b, 0x35c8, 0x4567, 0x4177, 0x42a7, 0x4219, 0xb018, 0xb231, 0x42f7, 0xa4cc, 0x4414, 0x2023, 0x1c10, 0xbf3d, 0x1242, 0x4258, 0xb046, 0x4159, 0xba45, 0x4585, 0x4276, 0x4123, 0xb243, 0x443d, 0x409b, 0xa4f1, 0x426d, 0x42e9, 0x3228, 0x4645, 0x4543, 0x2747, 0x42ed, 0x4316, 0xbf7e, 0x4120, 0x41ec, 0x41eb, 0x4174, 0x424f, 0xbfb1, 0x03c4, 0x2fe1, 0xb25d, 0x4068, 0x1b8f, 0xb270, 0xb058, 0x1c88, 0xbf6f, 0x1fce, 0x1bb9, 0xb23a, 0x4300, 0x4480, 0xaf8f, 0xb21d, 0xba5e, 0xba13, 0x1e5e, 0xbad9, 0x41a4, 0xb2c8, 0x40dd, 0xb27c, 0x382e, 0x089a, 0x429a, 0x4076, 0xae8a, 0xbf72, 0x1e10, 0x433d, 0xa7c9, 0xb0b4, 0xb034, 0xb0d4, 0x41b6, 0x1858, 0xbf7e, 0x1ec5, 0x40e7, 0x02cc, 0x41ce, 0x06fb, 0x42e7, 0xa6f3, 0x1a85, 0x40e9, 0x427f, 0x0051, 0xb0ca, 0xb28e, 0x1888, 0x4682, 0x4344, 0x1f2e, 0x429e, 0x426a, 0x324f, 0x0eae, 0xbf9d, 0xb00a, 0x4081, 0xab91, 0x465e, 0xbf2b, 0xaf28, 0x4091, 0x428f, 0x45c4, 0x191d, 0x191b, 0x42bb, 0x0d5a, 0x428a, 0x463e, 0xbf44, 0x400a, 0x40b3, 0x0aa6, 0x4085, 0xba42, 0xbf1f, 0x425e, 0xbfa0, 0xb008, 0x4315, 0xb232, 0xba77, 0x1412, 0x41dc, 0x43c2, 0x0566, 0xbf6e, 0x34aa, 0xb272, 0x1b03, 0x4171, 0x1b82, 0x0772, 0x2458, 0xab4d, 0x1c39, 0x43f9, 0x429b, 0x40ad, 0x42a2, 0xba19, 0xad15, 0xb078, 0x42f2, 0x1e62, 0x43a8, 0x3a59, 0x425a, 0xb00c, 0x0ce3, 0x29fc, 0xb291, 0x3847, 0x1bc4, 0xbf86, 0x431b, 0x1b36, 0xb26f, 0x40ee, 0x43aa, 0x124f, 0xbac5, 0x0f90, 0x402d, 0xb2d0, 0xb2b6, 0x46b1, 0x4327, 0xa182, 0xbf9a, 0x406e, 0x43a9, 0x430a, 0x05fc, 0x41d8, 0x4072, 0xbf12, 0x4287, 0x43d0, 0x2863, 0x4392, 0x1bf0, 0xa512, 0xbf92, 0x442c, 0x187c, 0x4429, 0xbad3, 0x43a2, 0x42cb, 0xa016, 0x422c, 0xbfb1, 0xb245, 0x1b85, 0x42a3, 0xba1d, 0xb023, 0x4185, 0x40ce, 0x43e7, 0x1c32, 0x4222, 0xa312, 0x34a2, 0xbfc0, 0x42a0, 0xb26c, 0x1e0d, 0x19fd, 0x434a, 0xba0c, 0x41be, 0x40a1, 0x1009, 0x410c, 0xbf9c, 0x441c, 0x41ca, 0xbf0b, 0x088d, 0xbf60, 0x2873, 0x1968, 0x41b9, 0x411f, 0x06ff, 0x463f, 0x40f2, 0x4220, 0x4278, 0x41bb, 0x06d0, 0x42d7, 0x42e2, 0x43c5, 0x1ece, 0x3ef3, 0x4218, 0xb2ae, 0x41bc, 0xa77e, 0x1068, 0xbf28, 0xbf00, 0xb296, 0x11b9, 0x4309, 0xbafd, 0xb286, 0x40e8, 0xbfd1, 0x437a, 0x35d5, 0x42d1, 0x424e, 0x4548, 0x40a7, 0x4056, 0x40ff, 0x44c9, 0xb26a, 0xba07, 0x43ca, 0x4310, 0xb2b3, 0x40ce, 0x1810, 0x462f, 0xb28f, 0xb276, 0x4266, 0x4669, 0x1e7a, 0xb21a, 0x21ce, 0x4611, 0xbf53, 0xbac4, 0x4477, 0xb2ff, 0x1eda, 0xb2de, 0x0819, 0xb28b, 0x4029, 0xbaeb, 0x050d, 0x43bb, 0x4327, 0xb23b, 0x27fd, 0xbf98, 0x1d5c, 0x4275, 0xaa35, 0x186d, 0x2879, 0xbaf5, 0x4011, 0x401c, 0x43a0, 0x3fd9, 0xba7a, 0x1b93, 0xb288, 0xaad0, 0xbf22, 0x3c38, 0xb26b, 0x2763, 0x3f20, 0x4003, 0x1a28, 0xb26d, 0xabec, 0x0d07, 0x0bf5, 0x4117, 0xbac5, 0x434a, 0xb0ee, 0xb028, 0x433d, 0x4695, 0xba77, 0x3ea1, 0x4177, 0x446f, 0xbad3, 0xa161, 0x11de, 0x1a2b, 0xb23f, 0xb2cd, 0x3450, 0xbf61, 0x3f26, 0xb291, 0x34e5, 0x46c1, 0x1fce, 0x4215, 0x423b, 0xab8c, 0x1627, 0x1011, 0x40e9, 0xb0d3, 0x1f42, 0x4164, 0xbfb3, 0x1886, 0x4018, 0x2218, 0xbadc, 0x4245, 0x42ab, 0x1f0c, 0xb2ec, 0xaa74, 0xad5c, 0x413a, 0xbf79, 0xb07a, 0x4213, 0x43ed, 0x41ac, 0x423d, 0x06e5, 0x0ad8, 0x1aaf, 0x4388, 0xb280, 0xbae9, 0x403a, 0xa331, 0xb2d9, 0xbfdf, 0x421e, 0xb0ad, 0x424e, 0x4065, 0x422c, 0x1001, 0x1a77, 0x4017, 0xbf65, 0x14cb, 0x4573, 0xb26b, 0x4371, 0x4026, 0x46fc, 0x42e2, 0xa06e, 0xae37, 0x0f59, 0xb045, 0x42d9, 0x4136, 0xba1b, 0xb2cf, 0xb2da, 0x3ce5, 0x3b2e, 0x44f9, 0x46b9, 0x3256, 0x4265, 0xbff0, 0x410d, 0xbff0, 0x2599, 0x4287, 0xbf74, 0x42ae, 0x4009, 0x2b2f, 0x4167, 0x4321, 0x459b, 0x42da, 0x416f, 0x406c, 0x42c4, 0xb2c2, 0x4630, 0x40db, 0x39ab, 0x0d75, 0xbf55, 0xb2df, 0x3c88, 0xb084, 0xb220, 0x2296, 0xbae0, 0x3e6b, 0xb002, 0x1d1f, 0x2309, 0xb26d, 0xba77, 0x2e13, 0x4084, 0xb29b, 0x10cb, 0x4397, 0xbf3b, 0xb0da, 0x42ee, 0xb2e6, 0x42c4, 0x4603, 0x1c1b, 0xbfd0, 0xbfc0, 0x4297, 0x1f20, 0x3f0e, 0x4246, 0x27a5, 0x42ca, 0xb2d0, 0x02d7, 0xaf51, 0x1d35, 0x41c5, 0x43cc, 0xb251, 0xb24f, 0x428f, 0x4101, 0x3bfb, 0x1f9d, 0xbf46, 0x4314, 0x469c, 0x1932, 0x40bf, 0xafff, 0x1cb1, 0x4141, 0xa9be, 0x43ed, 0x41a7, 0x4035, 0xba21, 0x1f1b, 0x1f56, 0x4054, 0x1554, 0x456b, 0x4249, 0xbf41, 0x4327, 0xba1f, 0x41ab, 0x407a, 0xb050, 0xbaf9, 0xb272, 0xabcc, 0x40c8, 0x4078, 0x1bcf, 0x42ae, 0xba1c, 0x42fc, 0x40b0, 0xb2ef, 0xb0c6, 0x401d, 0x46fd, 0x29e9, 0xb2a4, 0x1805, 0x42b5, 0xb01d, 0xbf47, 0x40e8, 0xb0d8, 0x056d, 0x4271, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x1a5fd34d, 0x3103aa3c, 0x3e4f9ef4, 0xf82df4a2, 0x3ba27697, 0x32d28d47, 0x5158d643, 0x5cf29a73, 0x8ce84a47, 0x4e93790b, 0xc7f42d1c, 0x6b5dd957, 0x35ca5f7d, 0xde453ad4, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x00000000, 0xffff9c02, 0xffffff91, 0x000004b0, 0x00000000, 0x00000000, 0x00000091, 0x00000000, 0x00000844, 0x00000000, 0x19860000, 0x6b5dd957, 0xffff8204, 0x000016e4, 0x00000000, 0x800001d0 }, + Instructions = [0xb247, 0xbac6, 0xb2bc, 0xba00, 0x4236, 0x4542, 0xbf84, 0x4353, 0x454b, 0x2d7d, 0xb214, 0xbf73, 0x2346, 0x1da1, 0xa600, 0x41de, 0xb0cf, 0x45c5, 0xb057, 0xbf11, 0x43f5, 0x4171, 0x026e, 0x2a0c, 0xafe4, 0x4215, 0xba19, 0x3837, 0x4677, 0x428a, 0xb281, 0xb2e1, 0x43af, 0x427f, 0xbf45, 0x41ef, 0xb289, 0x2c54, 0x4128, 0x4076, 0xb2d4, 0x41c2, 0x191b, 0x438c, 0xa81f, 0xb075, 0xb2e1, 0xbfb9, 0x4396, 0x2ac3, 0x4052, 0x4453, 0xb2c7, 0x40b6, 0x4273, 0x40b6, 0x424e, 0x449d, 0x0849, 0x42c1, 0xa3b4, 0x2413, 0x1e42, 0x40c1, 0x41f8, 0x1e05, 0xbf6e, 0xbae1, 0x1e62, 0x445c, 0x3418, 0x4363, 0x4094, 0x445c, 0x4283, 0x4611, 0xa556, 0x42fb, 0x1f16, 0x43f5, 0x1a7a, 0x020f, 0xba79, 0xbf24, 0x44cb, 0x0902, 0x4376, 0x19ed, 0x4181, 0x41b4, 0xb222, 0x4391, 0xbfcd, 0x05b5, 0x1fa3, 0x422c, 0xb210, 0x18d5, 0xbf70, 0x40c1, 0x42b9, 0x107f, 0xb281, 0xa90c, 0xbfba, 0x4301, 0x4282, 0xb254, 0x2d6a, 0x42d5, 0x42c1, 0x3ff4, 0xb09d, 0x0856, 0x41a4, 0x4357, 0x42d8, 0xbfd9, 0x3dcf, 0xba42, 0x206a, 0x4168, 0x1f5e, 0x460a, 0x0f10, 0xa577, 0x456c, 0x3967, 0x4643, 0xbf4e, 0x4183, 0x36fb, 0x41ea, 0xb0dc, 0x32d3, 0x43ee, 0x31b0, 0x4030, 0x407c, 0xb22d, 0x4455, 0x3342, 0xb0d7, 0xbf83, 0x1c18, 0x35e6, 0xb063, 0x4315, 0x45ec, 0x1f25, 0x18e9, 0xb264, 0xa7c2, 0x3e41, 0x43b8, 0x3363, 0x0c12, 0x0d27, 0x3e41, 0xbfb0, 0xba45, 0xa29a, 0xabaa, 0x3d44, 0xb2f5, 0xa599, 0x3ed6, 0x423f, 0x45da, 0x28ca, 0x40aa, 0x4288, 0x2acc, 0xbfc6, 0x21e5, 0x41a9, 0x4140, 0x4236, 0x0189, 0xb21a, 0x197d, 0xbf93, 0x13b7, 0x44a5, 0x3404, 0x443b, 0x421b, 0xba46, 0xba41, 0xb2d1, 0x022f, 0xb276, 0xba18, 0xb26a, 0xb20e, 0xb294, 0x42c5, 0x42f5, 0x1b96, 0x11dc, 0x1c7e, 0xbfb5, 0x46db, 0xab1b, 0x416e, 0xb0a2, 0xb2ab, 0x43dc, 0x3076, 0xba40, 0x2e15, 0xba09, 0xb2df, 0x4100, 0x4139, 0x004d, 0x40fe, 0xbf38, 0xa914, 0x42b4, 0x43cb, 0x43e8, 0x407c, 0x21cf, 0x2d7f, 0xb2e4, 0xb26f, 0xb2e2, 0x18d5, 0xb03e, 0x45a8, 0x433a, 0xb235, 0x44b4, 0xb000, 0x43ea, 0x313a, 0x4641, 0xb268, 0x3771, 0x40e5, 0xbff0, 0xbf9c, 0x4051, 0xba56, 0x07db, 0xb2b3, 0xb0e7, 0x40ed, 0xb264, 0x4193, 0xb08b, 0x422e, 0x4079, 0x26bc, 0x42e8, 0xba16, 0xa565, 0xba1c, 0xb06c, 0x409b, 0x43f5, 0x41fb, 0x42fa, 0xb2ea, 0x4184, 0x23d2, 0x431b, 0x4125, 0x1ef6, 0xbfa3, 0xaecf, 0x44b8, 0xb2a2, 0x1b75, 0x4145, 0x46f4, 0x42d4, 0x11f0, 0xb255, 0x411d, 0x121a, 0x42d1, 0x1a78, 0xbfae, 0x1d7b, 0xb0e1, 0x40e4, 0x422b, 0x428a, 0xba68, 0x18d6, 0x2f33, 0x4093, 0x433d, 0xbf32, 0x45c9, 0x4227, 0x423b, 0x41a1, 0x0f2d, 0x2021, 0x4679, 0x1f9b, 0x418c, 0x436b, 0xbf87, 0x41e4, 0x41bd, 0x407b, 0xa9d5, 0x1e4b, 0x00d3, 0x4389, 0x42b6, 0x46bd, 0x401e, 0x4067, 0x41d4, 0x4341, 0x4146, 0x2898, 0x463d, 0x1ece, 0x324f, 0xbaed, 0x4186, 0xbf31, 0x1dc1, 0xb275, 0x3cd7, 0xbf00, 0x4162, 0x4202, 0x431b, 0xba19, 0xb281, 0x40f0, 0xb2d9, 0x1ebc, 0xb2ae, 0x40ec, 0x42c1, 0xb2b9, 0x4241, 0x1eec, 0x081f, 0x4225, 0x3497, 0x4371, 0xac55, 0xad9c, 0xbf7e, 0xa740, 0x1a53, 0xb2ee, 0x0406, 0x403a, 0x40de, 0x1ea4, 0x4252, 0xa544, 0x41b5, 0xba14, 0x4225, 0x42c2, 0x430d, 0xbf43, 0x40db, 0xa456, 0x1b59, 0x4347, 0xb2b6, 0xbff0, 0xbae4, 0x4363, 0xb200, 0x40dd, 0xba74, 0x420a, 0xbf2e, 0xa9e7, 0x3c0c, 0x4285, 0x13d7, 0xb28b, 0xb05e, 0x1826, 0x42bd, 0x2d51, 0x4242, 0x4227, 0xbfd3, 0x43fb, 0x41ce, 0x4171, 0x416e, 0x4313, 0xa531, 0x4302, 0x010c, 0x201b, 0x2549, 0x45b4, 0x1366, 0x41a2, 0xba6f, 0xb2f8, 0x4049, 0x1e75, 0x4471, 0x45be, 0x1814, 0x4430, 0x415e, 0xbf4f, 0x187a, 0x418d, 0x2a18, 0xb278, 0x4002, 0x2b61, 0xbf6f, 0x06cc, 0x4265, 0x41fb, 0x408d, 0xbf56, 0x3963, 0x1e83, 0x45c0, 0xa06b, 0xa6e9, 0xb252, 0x1e7d, 0xb000, 0x4024, 0xb0ab, 0x4394, 0x418b, 0x1873, 0xaeb9, 0xbfaf, 0x4331, 0x1e39, 0x4405, 0x1ccb, 0x274d, 0x4344, 0xb0be, 0x41ca, 0x4268, 0x431f, 0x44c9, 0x41bf, 0x40d0, 0x42f3, 0xb09a, 0x1c08, 0x2223, 0xbf24, 0x0599, 0x46a3, 0x4207, 0x4114, 0xbf48, 0x1e64, 0xb0fe, 0x2c19, 0x4074, 0xab7a, 0x41d7, 0x4262, 0x46b0, 0x15eb, 0x42ae, 0xb23b, 0x35c8, 0x4567, 0x4177, 0x42a7, 0x4219, 0xb018, 0xb231, 0x42f7, 0xa4cc, 0x4414, 0x2023, 0x1c10, 0xbf3d, 0x1242, 0x4258, 0xb046, 0x4159, 0xba45, 0x4585, 0x4276, 0x4123, 0xb243, 0x443d, 0x409b, 0xa4f1, 0x426d, 0x42e9, 0x3228, 0x4645, 0x4543, 0x2747, 0x42ed, 0x4316, 0xbf7e, 0x4120, 0x41ec, 0x41eb, 0x4174, 0x424f, 0xbfb1, 0x03c4, 0x2fe1, 0xb25d, 0x4068, 0x1b8f, 0xb270, 0xb058, 0x1c88, 0xbf6f, 0x1fce, 0x1bb9, 0xb23a, 0x4300, 0x4480, 0xaf8f, 0xb21d, 0xba5e, 0xba13, 0x1e5e, 0xbad9, 0x41a4, 0xb2c8, 0x40dd, 0xb27c, 0x382e, 0x089a, 0x429a, 0x4076, 0xae8a, 0xbf72, 0x1e10, 0x433d, 0xa7c9, 0xb0b4, 0xb034, 0xb0d4, 0x41b6, 0x1858, 0xbf7e, 0x1ec5, 0x40e7, 0x02cc, 0x41ce, 0x06fb, 0x42e7, 0xa6f3, 0x1a85, 0x40e9, 0x427f, 0x0051, 0xb0ca, 0xb28e, 0x1888, 0x4682, 0x4344, 0x1f2e, 0x429e, 0x426a, 0x324f, 0x0eae, 0xbf9d, 0xb00a, 0x4081, 0xab91, 0x465e, 0xbf2b, 0xaf28, 0x4091, 0x428f, 0x45c4, 0x191d, 0x191b, 0x42bb, 0x0d5a, 0x428a, 0x463e, 0xbf44, 0x400a, 0x40b3, 0x0aa6, 0x4085, 0xba42, 0xbf1f, 0x425e, 0xbfa0, 0xb008, 0x4315, 0xb232, 0xba77, 0x1412, 0x41dc, 0x43c2, 0x0566, 0xbf6e, 0x34aa, 0xb272, 0x1b03, 0x4171, 0x1b82, 0x0772, 0x2458, 0xab4d, 0x1c39, 0x43f9, 0x429b, 0x40ad, 0x42a2, 0xba19, 0xad15, 0xb078, 0x42f2, 0x1e62, 0x43a8, 0x3a59, 0x425a, 0xb00c, 0x0ce3, 0x29fc, 0xb291, 0x3847, 0x1bc4, 0xbf86, 0x431b, 0x1b36, 0xb26f, 0x40ee, 0x43aa, 0x124f, 0xbac5, 0x0f90, 0x402d, 0xb2d0, 0xb2b6, 0x46b1, 0x4327, 0xa182, 0xbf9a, 0x406e, 0x43a9, 0x430a, 0x05fc, 0x41d8, 0x4072, 0xbf12, 0x4287, 0x43d0, 0x2863, 0x4392, 0x1bf0, 0xa512, 0xbf92, 0x442c, 0x187c, 0x4429, 0xbad3, 0x43a2, 0x42cb, 0xa016, 0x422c, 0xbfb1, 0xb245, 0x1b85, 0x42a3, 0xba1d, 0xb023, 0x4185, 0x40ce, 0x43e7, 0x1c32, 0x4222, 0xa312, 0x34a2, 0xbfc0, 0x42a0, 0xb26c, 0x1e0d, 0x19fd, 0x434a, 0xba0c, 0x41be, 0x40a1, 0x1009, 0x410c, 0xbf9c, 0x441c, 0x41ca, 0xbf0b, 0x088d, 0xbf60, 0x2873, 0x1968, 0x41b9, 0x411f, 0x06ff, 0x463f, 0x40f2, 0x4220, 0x4278, 0x41bb, 0x06d0, 0x42d7, 0x42e2, 0x43c5, 0x1ece, 0x3ef3, 0x4218, 0xb2ae, 0x41bc, 0xa77e, 0x1068, 0xbf28, 0xbf00, 0xb296, 0x11b9, 0x4309, 0xbafd, 0xb286, 0x40e8, 0xbfd1, 0x437a, 0x35d5, 0x42d1, 0x424e, 0x4548, 0x40a7, 0x4056, 0x40ff, 0x44c9, 0xb26a, 0xba07, 0x43ca, 0x4310, 0xb2b3, 0x40ce, 0x1810, 0x462f, 0xb28f, 0xb276, 0x4266, 0x4669, 0x1e7a, 0xb21a, 0x21ce, 0x4611, 0xbf53, 0xbac4, 0x4477, 0xb2ff, 0x1eda, 0xb2de, 0x0819, 0xb28b, 0x4029, 0xbaeb, 0x050d, 0x43bb, 0x4327, 0xb23b, 0x27fd, 0xbf98, 0x1d5c, 0x4275, 0xaa35, 0x186d, 0x2879, 0xbaf5, 0x4011, 0x401c, 0x43a0, 0x3fd9, 0xba7a, 0x1b93, 0xb288, 0xaad0, 0xbf22, 0x3c38, 0xb26b, 0x2763, 0x3f20, 0x4003, 0x1a28, 0xb26d, 0xabec, 0x0d07, 0x0bf5, 0x4117, 0xbac5, 0x434a, 0xb0ee, 0xb028, 0x433d, 0x4695, 0xba77, 0x3ea1, 0x4177, 0x446f, 0xbad3, 0xa161, 0x11de, 0x1a2b, 0xb23f, 0xb2cd, 0x3450, 0xbf61, 0x3f26, 0xb291, 0x34e5, 0x46c1, 0x1fce, 0x4215, 0x423b, 0xab8c, 0x1627, 0x1011, 0x40e9, 0xb0d3, 0x1f42, 0x4164, 0xbfb3, 0x1886, 0x4018, 0x2218, 0xbadc, 0x4245, 0x42ab, 0x1f0c, 0xb2ec, 0xaa74, 0xad5c, 0x413a, 0xbf79, 0xb07a, 0x4213, 0x43ed, 0x41ac, 0x423d, 0x06e5, 0x0ad8, 0x1aaf, 0x4388, 0xb280, 0xbae9, 0x403a, 0xa331, 0xb2d9, 0xbfdf, 0x421e, 0xb0ad, 0x424e, 0x4065, 0x422c, 0x1001, 0x1a77, 0x4017, 0xbf65, 0x14cb, 0x4573, 0xb26b, 0x4371, 0x4026, 0x46fc, 0x42e2, 0xa06e, 0xae37, 0x0f59, 0xb045, 0x42d9, 0x4136, 0xba1b, 0xb2cf, 0xb2da, 0x3ce5, 0x3b2e, 0x44f9, 0x46b9, 0x3256, 0x4265, 0xbff0, 0x410d, 0xbff0, 0x2599, 0x4287, 0xbf74, 0x42ae, 0x4009, 0x2b2f, 0x4167, 0x4321, 0x459b, 0x42da, 0x416f, 0x406c, 0x42c4, 0xb2c2, 0x4630, 0x40db, 0x39ab, 0x0d75, 0xbf55, 0xb2df, 0x3c88, 0xb084, 0xb220, 0x2296, 0xbae0, 0x3e6b, 0xb002, 0x1d1f, 0x2309, 0xb26d, 0xba77, 0x2e13, 0x4084, 0xb29b, 0x10cb, 0x4397, 0xbf3b, 0xb0da, 0x42ee, 0xb2e6, 0x42c4, 0x4603, 0x1c1b, 0xbfd0, 0xbfc0, 0x4297, 0x1f20, 0x3f0e, 0x4246, 0x27a5, 0x42ca, 0xb2d0, 0x02d7, 0xaf51, 0x1d35, 0x41c5, 0x43cc, 0xb251, 0xb24f, 0x428f, 0x4101, 0x3bfb, 0x1f9d, 0xbf46, 0x4314, 0x469c, 0x1932, 0x40bf, 0xafff, 0x1cb1, 0x4141, 0xa9be, 0x43ed, 0x41a7, 0x4035, 0xba21, 0x1f1b, 0x1f56, 0x4054, 0x1554, 0x456b, 0x4249, 0xbf41, 0x4327, 0xba1f, 0x41ab, 0x407a, 0xb050, 0xbaf9, 0xb272, 0xabcc, 0x40c8, 0x4078, 0x1bcf, 0x42ae, 0xba1c, 0x42fc, 0x40b0, 0xb2ef, 0xb0c6, 0x401d, 0x46fd, 0x29e9, 0xb2a4, 0x1805, 0x42b5, 0xb01d, 0xbf47, 0x40e8, 0xb0d8, 0x056d, 0x4271, 0x4770, 0xe7fe + ], + StartRegs = [0x1a5fd34d, 0x3103aa3c, 0x3e4f9ef4, 0xf82df4a2, 0x3ba27697, 0x32d28d47, 0x5158d643, 0x5cf29a73, 0x8ce84a47, 0x4e93790b, 0xc7f42d1c, 0x6b5dd957, 0x35ca5f7d, 0xde453ad4, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x00000000, 0xffff9c02, 0xffffff91, 0x000004b0, 0x00000000, 0x00000000, 0x00000091, 0x00000000, 0x00000844, 0x00000000, 0x19860000, 0x6b5dd957, 0xffff8204, 0x000016e4, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0xa14c, 0x4132, 0x41bc, 0x4020, 0x0b92, 0x157b, 0x41d2, 0x4033, 0x0ac1, 0x1a9f, 0x4029, 0x27ea, 0xb2ec, 0xbff0, 0x1c03, 0xb249, 0xbfba, 0x2af5, 0x063a, 0xb2f7, 0x1fde, 0x4650, 0x419d, 0x4254, 0x423c, 0x45c5, 0x43f5, 0xbfb7, 0xb22c, 0x439d, 0x41ae, 0xa021, 0x405d, 0xb2f5, 0xa199, 0x4328, 0x43c1, 0xa29f, 0x3ace, 0x40cd, 0xb29a, 0x4192, 0x4165, 0xbaf5, 0x281e, 0x2f02, 0xa053, 0xb2a9, 0x414c, 0x2319, 0x40bb, 0xbfdb, 0xbf80, 0xa7d7, 0xbff0, 0x424b, 0xb031, 0x4063, 0xbf29, 0x443d, 0xba16, 0x2f1f, 0x2cae, 0x4108, 0xb0e1, 0x4362, 0x3931, 0xbac3, 0xbf8d, 0xb286, 0xb2bd, 0x43b0, 0xb01c, 0x42f2, 0xbfb5, 0xba58, 0x4066, 0x42a6, 0x40f4, 0x25d9, 0xba15, 0xba76, 0x4173, 0x32e9, 0x4184, 0x45f3, 0xb0e2, 0xb2e3, 0x32b6, 0xbf81, 0x4136, 0x448a, 0xba7b, 0xba55, 0xb23c, 0x4153, 0x4323, 0xb2cb, 0x18e5, 0x4161, 0xba7b, 0x363d, 0x408c, 0xbf39, 0x400f, 0x406c, 0x41c0, 0x420d, 0x32e5, 0xb24a, 0x2bb8, 0xaa8c, 0xb053, 0xb276, 0xbf4d, 0x4109, 0xae28, 0xba33, 0x429e, 0xb055, 0x2c5a, 0x43c2, 0xb283, 0x05b1, 0xbfd3, 0x19f9, 0x4081, 0xbace, 0x43c3, 0x455e, 0x42aa, 0xbfcf, 0x42d3, 0x4000, 0xb23a, 0x42ee, 0x41b4, 0xba39, 0x2cd1, 0x303c, 0x43a4, 0xbfbc, 0xb2db, 0x2de9, 0xbaf6, 0xafed, 0xba77, 0x42f4, 0x4163, 0x41b5, 0x41b5, 0x3a75, 0x4298, 0x4215, 0xba5c, 0x42bc, 0xb2c8, 0x41ec, 0x2f90, 0x42b1, 0xb065, 0xbfbc, 0xba6f, 0x456e, 0xb234, 0xbf42, 0x44b4, 0x46f9, 0x1b3f, 0x1d00, 0x4201, 0xb223, 0xa1f4, 0x27e7, 0x41c0, 0x1e5c, 0x46b1, 0x412b, 0xa523, 0xbf00, 0x4033, 0x151c, 0x3328, 0xba10, 0x420f, 0x45b4, 0x1217, 0xbf6f, 0xa77d, 0x2c63, 0x1985, 0x411a, 0xb262, 0xbf1f, 0xb260, 0x1a16, 0x43ac, 0x41d4, 0x440c, 0x41f6, 0x3409, 0xb2a6, 0xbfe1, 0x2013, 0x43e1, 0x43fd, 0x46d1, 0x4160, 0xbf73, 0x4132, 0x429b, 0x23b3, 0xbae9, 0x10bd, 0xba7f, 0xba1b, 0x1886, 0x109c, 0x41a6, 0xb201, 0x1be2, 0xbf95, 0x410e, 0x46a2, 0x430a, 0x02f1, 0xb2d5, 0xb206, 0xbae9, 0x1b5c, 0x40f3, 0x44da, 0xbf43, 0xabc8, 0x0f66, 0x1883, 0x458b, 0x426d, 0xa283, 0x4033, 0x416e, 0x4173, 0x4461, 0xb2f6, 0x1139, 0xb0b0, 0xbfe0, 0x437a, 0x41f9, 0xb226, 0x4359, 0x4160, 0x4618, 0xb27e, 0x41ab, 0xbfb4, 0xb0f4, 0x4603, 0x401e, 0x2dd7, 0x1b5c, 0xb2ec, 0x16ab, 0xb00d, 0x41b9, 0xa2eb, 0xb00d, 0x40bf, 0x2e03, 0x46b2, 0xbf13, 0x38c1, 0x1ed1, 0xbac9, 0x4036, 0xb0bf, 0x41bc, 0xba14, 0x02dc, 0x41c1, 0x4383, 0xba42, 0xb223, 0xba53, 0x4037, 0xba00, 0x43d0, 0x4362, 0x42ea, 0xb03f, 0x41a3, 0x4111, 0x001b, 0x0080, 0xbf7f, 0xb299, 0x40e7, 0x4158, 0x4196, 0x1a5d, 0x07f6, 0x41ee, 0x0c49, 0xb2c8, 0xb243, 0x409a, 0x392d, 0xb2bf, 0xa325, 0x4629, 0xbfd4, 0x4334, 0x4305, 0x2dd2, 0xbfe0, 0xb01d, 0x36a2, 0x4211, 0xbfe4, 0x4151, 0xbfb0, 0xb2da, 0xbf70, 0xb2ee, 0x43a8, 0xbf85, 0x448d, 0x43e6, 0x1b34, 0x18e6, 0x43f7, 0x1d9f, 0xb251, 0x40b6, 0x0822, 0x4048, 0xb086, 0x0161, 0xbaca, 0xb211, 0x0500, 0xb076, 0x400d, 0xbf9c, 0x40bd, 0x41bd, 0x22d5, 0x421d, 0x3876, 0x1a86, 0x408e, 0x357b, 0x4567, 0x41f6, 0xb29f, 0x43f4, 0x439b, 0x431b, 0x4115, 0x3962, 0xb0cc, 0x4198, 0x0afa, 0x445d, 0xbac5, 0xaa18, 0x41e1, 0x43e4, 0xbf59, 0x43b8, 0x431e, 0x1849, 0x4233, 0x4393, 0x42dd, 0x4275, 0x430f, 0x420b, 0xbf90, 0x4116, 0x43b5, 0xb226, 0xad7b, 0x45e8, 0x4202, 0x43c7, 0x2c0c, 0x4070, 0x4185, 0x43ce, 0xbad1, 0x1a16, 0x1c88, 0x413b, 0x4163, 0x2d64, 0xb03b, 0xbf63, 0x1d22, 0x40c5, 0x285b, 0x1f82, 0x41ba, 0x417d, 0xba1b, 0x4219, 0x40e2, 0x4297, 0x4307, 0x1873, 0x4050, 0xbfa0, 0x229d, 0x4055, 0x436a, 0x3545, 0x1a18, 0x42ef, 0xb280, 0x40a1, 0x1c13, 0xb05e, 0x408e, 0x42d4, 0x2688, 0x40d3, 0xbfc3, 0xa2eb, 0x421d, 0x440e, 0x090b, 0xb264, 0x4160, 0xb2b3, 0xbad4, 0xba36, 0x40f8, 0xb2f5, 0x3be0, 0xb096, 0x1da7, 0x1f4e, 0xba52, 0x4155, 0x4273, 0xbf8e, 0x42f4, 0x4247, 0x4148, 0x428e, 0x4481, 0x1cd6, 0x436c, 0xb22a, 0x4189, 0x27ea, 0x42c1, 0x435f, 0x41ca, 0x24f5, 0x40a8, 0x4304, 0x4575, 0x416a, 0x42d4, 0x41d8, 0x1cf2, 0x430a, 0x4249, 0xa6d5, 0x4208, 0x4361, 0xbf77, 0xb2bf, 0x4061, 0x42f5, 0x1df1, 0xb2fb, 0x2eb2, 0x1f36, 0x0636, 0x4233, 0xb051, 0x0d22, 0x437a, 0x187c, 0x431d, 0x2642, 0x4329, 0xba5e, 0x402e, 0x1a7d, 0xb27c, 0xbfc0, 0x4382, 0x430d, 0xaad4, 0x4033, 0x423d, 0x4266, 0xbfc1, 0x1a59, 0x4349, 0x416c, 0xb236, 0x4337, 0x2973, 0x43cb, 0x41d8, 0xb031, 0x431b, 0x1bce, 0x1553, 0x40ea, 0x0c9e, 0xba3b, 0x1192, 0x41a9, 0x4261, 0x4086, 0x1582, 0x4637, 0x4056, 0xbf8c, 0x4600, 0x429b, 0xbfac, 0x2ba6, 0x2e02, 0xbf2d, 0x463a, 0x41d0, 0x1d05, 0x43f9, 0x2c9c, 0x40af, 0xb00f, 0x2d8b, 0x4201, 0x4354, 0xba21, 0x1e4b, 0x41ae, 0xb2ba, 0xb28c, 0xa6c2, 0xbafd, 0x27e8, 0xa499, 0xbf8f, 0x4272, 0x076d, 0x4342, 0x4337, 0x1f5e, 0x41a3, 0x37d5, 0x417e, 0x4215, 0x4678, 0x143e, 0xbafc, 0xab29, 0x4095, 0xb28d, 0x0ed2, 0xbf80, 0xabb9, 0x433d, 0xba51, 0x0bba, 0xaa69, 0xa93d, 0x4117, 0xbfc7, 0x312f, 0xb099, 0x119d, 0x4393, 0x40e9, 0xbf94, 0x1cb6, 0x4294, 0x43f5, 0x42b8, 0xb26f, 0x2772, 0xb0a6, 0x413b, 0xadeb, 0x408e, 0xbfbc, 0x4542, 0xba61, 0xb066, 0x40f9, 0x45d5, 0xabc9, 0xba51, 0x19c0, 0x4202, 0x4245, 0x4162, 0xb256, 0x0fff, 0x1ca8, 0xbaf9, 0x3ce8, 0x45ee, 0x1bd9, 0xbfa0, 0xa474, 0xbfb3, 0x42c1, 0x39dc, 0xb08f, 0x303f, 0xba67, 0x1ec2, 0x43bd, 0xb2b5, 0x42df, 0x0cbd, 0x240e, 0x402b, 0x411d, 0xba53, 0xb20e, 0x41b8, 0xbf78, 0x413f, 0xbff0, 0x0612, 0xbf36, 0x4685, 0x3a69, 0x4318, 0x4137, 0xba21, 0x42ba, 0x4259, 0x4207, 0x41d7, 0xb2bc, 0x3b7e, 0x40d0, 0x423b, 0xab19, 0xb2ae, 0xb2b8, 0x43a4, 0xba50, 0xba2f, 0x21c8, 0x24c1, 0x4110, 0x422d, 0xbf4d, 0xa1c2, 0x1745, 0x18d8, 0x095c, 0xb260, 0x4070, 0xb23f, 0xa815, 0x346e, 0xb21f, 0x418c, 0x407f, 0xb259, 0xba4e, 0x3d84, 0xb2ff, 0x40d6, 0x44b3, 0x1bfb, 0xa6b7, 0x41f2, 0x412c, 0x4262, 0xbafd, 0x4460, 0xbfb0, 0x414c, 0xbfa9, 0x129a, 0x43d9, 0x09f1, 0x4262, 0x2b67, 0x4369, 0x40b7, 0xbf4c, 0x4473, 0xba7f, 0xba3f, 0xba30, 0xb039, 0x4378, 0x431a, 0xbf71, 0xb20b, 0xba76, 0x410a, 0x4284, 0xa2fb, 0xb283, 0xb2c3, 0xa762, 0x3e09, 0xba6c, 0xbf65, 0x4387, 0x218b, 0x2a1c, 0x4184, 0xb2b6, 0x41c0, 0x4298, 0x4249, 0x4397, 0x1ed0, 0xbafe, 0x4659, 0x1fc5, 0xa570, 0x4684, 0x40d0, 0xb012, 0x2c6b, 0xb22b, 0x105a, 0x4229, 0x409a, 0x43ce, 0xb06d, 0x4085, 0x4280, 0x12a1, 0xbf4d, 0xb09d, 0x436c, 0x281c, 0x40ff, 0x0cc9, 0xbfad, 0x1195, 0x42b4, 0x43f7, 0x415b, 0x40ad, 0x43e6, 0xb016, 0x4086, 0x4037, 0x0149, 0xbfd0, 0x41f5, 0x3cc4, 0xad52, 0x2422, 0xa9f5, 0x41c6, 0x26b2, 0x4226, 0xb27e, 0xbf3e, 0x02a3, 0xbac8, 0xb225, 0xbf31, 0x0663, 0xaea1, 0x4010, 0x00b1, 0x4201, 0xb0ce, 0xba4c, 0x400b, 0x4442, 0x436d, 0x0722, 0x42f6, 0x4321, 0x4001, 0x1f25, 0x411e, 0x401d, 0xba3a, 0x0ba3, 0xb2e1, 0x0141, 0xb01f, 0xb26c, 0x41a7, 0x435a, 0xaa86, 0xbfbb, 0x459c, 0x1caf, 0x441e, 0x43e5, 0x3643, 0x4240, 0xb292, 0x3097, 0xb2c2, 0x1b2f, 0x0db8, 0x40ab, 0xba0c, 0xb21c, 0x415e, 0x42ba, 0x4182, 0x25a2, 0x42c0, 0xb08f, 0x2808, 0xbf97, 0x400b, 0x43af, 0xb22e, 0x416e, 0xba40, 0xbf80, 0x43fe, 0x4349, 0xbada, 0x4003, 0xbff0, 0x0a40, 0x3d0b, 0x412c, 0xbf2f, 0x430f, 0x101c, 0x1a47, 0x41ce, 0xb2de, 0x4359, 0x4297, 0x41ad, 0x1d4a, 0x44eb, 0xbf80, 0x436f, 0xa5d7, 0x1cb2, 0xbf1f, 0x2907, 0x1b41, 0x43c7, 0x42a7, 0x41d0, 0xb2d9, 0x429f, 0x43d2, 0xa0eb, 0x4106, 0xb2d9, 0xa5a9, 0xa43e, 0x43d7, 0x12d3, 0x1e49, 0x41e3, 0x4589, 0x433d, 0x430f, 0xab65, 0xb22d, 0xbaee, 0xb22a, 0xaec2, 0xb265, 0xba6c, 0x1a12, 0xbfb2, 0x4137, 0xa12b, 0x4115, 0x4306, 0x43e9, 0x1c8b, 0x1542, 0x2360, 0x45ea, 0x4387, 0xba7a, 0x1fab, 0xb245, 0xbfd8, 0x2725, 0xbf78, 0x4146, 0x428a, 0xb21b, 0x19f9, 0xb282, 0xb2da, 0x4622, 0x40ae, 0x46ac, 0x41ac, 0xbf33, 0xb213, 0xb22d, 0xba56, 0x40b7, 0xab93, 0x18e7, 0x4372, 0x40ce, 0xb23d, 0x1a8c, 0xb281, 0x42a2, 0x41ce, 0xb22e, 0x43ee, 0xb221, 0xbf2f, 0xb2c3, 0x4081, 0x23a1, 0x4162, 0x42b6, 0xb004, 0x1e59, 0xb2d0, 0x4121, 0x435d, 0xb2af, 0xb2f0, 0x42ab, 0xbfe0, 0x1cb8, 0x44f3, 0x4605, 0x1e0e, 0x4625, 0x31e0, 0x4570, 0x40ec, 0xbf7a, 0x4173, 0xa0f7, 0xb2f3, 0xba19, 0x4149, 0x1f51, 0xba44, 0x29ac, 0x402d, 0x1808, 0x01f2, 0x41bf, 0x4186, 0x42e4, 0x10e4, 0x1f7a, 0x416a, 0xb0b8, 0x4130, 0x4467, 0xbf4a, 0xba17, 0x4237, 0xb2bd, 0x1cb4, 0x1955, 0x3010, 0xbf6c, 0x419f, 0xbf90, 0x4326, 0x423d, 0x40b3, 0xb24d, 0x413a, 0x414f, 0x4317, 0x4018, 0xb254, 0x0dd2, 0x4281, 0x4175, 0x4590, 0x19ad, 0x405f, 0x1d33, 0xbf2b, 0x3132, 0x1412, 0x1bbc, 0x1bb8, 0x4259, 0x426e, 0x414f, 0x4358, 0x43df, 0xb056, 0x4677, 0xa879, 0xade8, 0xba78, 0x436a, 0xb211, 0x4013, 0x40e9, 0x4280, 0xbff0, 0x41e8, 0x068f, 0x185e, 0x43c5, 0x43c6, 0xb021, 0xbfa7, 0x42da, 0x1aa9, 0x4214, 0xa017, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x371597f2, 0x76cf74c6, 0xf6f07bf9, 0x14bc3ff2, 0x44d46dd4, 0x85b9d3ca, 0x44827883, 0x4ba02ac3, 0x45d4fe43, 0x55355bd7, 0xa1571ee2, 0x4065eef1, 0x6a318c25, 0x4295c0bf, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x45d4fe43, 0xa1571ee2, 0x00000000, 0x82fbba0c, 0x00000064, 0x4295cc27, 0x00000000, 0x400001d0 }, + Instructions = [0xa14c, 0x4132, 0x41bc, 0x4020, 0x0b92, 0x157b, 0x41d2, 0x4033, 0x0ac1, 0x1a9f, 0x4029, 0x27ea, 0xb2ec, 0xbff0, 0x1c03, 0xb249, 0xbfba, 0x2af5, 0x063a, 0xb2f7, 0x1fde, 0x4650, 0x419d, 0x4254, 0x423c, 0x45c5, 0x43f5, 0xbfb7, 0xb22c, 0x439d, 0x41ae, 0xa021, 0x405d, 0xb2f5, 0xa199, 0x4328, 0x43c1, 0xa29f, 0x3ace, 0x40cd, 0xb29a, 0x4192, 0x4165, 0xbaf5, 0x281e, 0x2f02, 0xa053, 0xb2a9, 0x414c, 0x2319, 0x40bb, 0xbfdb, 0xbf80, 0xa7d7, 0xbff0, 0x424b, 0xb031, 0x4063, 0xbf29, 0x443d, 0xba16, 0x2f1f, 0x2cae, 0x4108, 0xb0e1, 0x4362, 0x3931, 0xbac3, 0xbf8d, 0xb286, 0xb2bd, 0x43b0, 0xb01c, 0x42f2, 0xbfb5, 0xba58, 0x4066, 0x42a6, 0x40f4, 0x25d9, 0xba15, 0xba76, 0x4173, 0x32e9, 0x4184, 0x45f3, 0xb0e2, 0xb2e3, 0x32b6, 0xbf81, 0x4136, 0x448a, 0xba7b, 0xba55, 0xb23c, 0x4153, 0x4323, 0xb2cb, 0x18e5, 0x4161, 0xba7b, 0x363d, 0x408c, 0xbf39, 0x400f, 0x406c, 0x41c0, 0x420d, 0x32e5, 0xb24a, 0x2bb8, 0xaa8c, 0xb053, 0xb276, 0xbf4d, 0x4109, 0xae28, 0xba33, 0x429e, 0xb055, 0x2c5a, 0x43c2, 0xb283, 0x05b1, 0xbfd3, 0x19f9, 0x4081, 0xbace, 0x43c3, 0x455e, 0x42aa, 0xbfcf, 0x42d3, 0x4000, 0xb23a, 0x42ee, 0x41b4, 0xba39, 0x2cd1, 0x303c, 0x43a4, 0xbfbc, 0xb2db, 0x2de9, 0xbaf6, 0xafed, 0xba77, 0x42f4, 0x4163, 0x41b5, 0x41b5, 0x3a75, 0x4298, 0x4215, 0xba5c, 0x42bc, 0xb2c8, 0x41ec, 0x2f90, 0x42b1, 0xb065, 0xbfbc, 0xba6f, 0x456e, 0xb234, 0xbf42, 0x44b4, 0x46f9, 0x1b3f, 0x1d00, 0x4201, 0xb223, 0xa1f4, 0x27e7, 0x41c0, 0x1e5c, 0x46b1, 0x412b, 0xa523, 0xbf00, 0x4033, 0x151c, 0x3328, 0xba10, 0x420f, 0x45b4, 0x1217, 0xbf6f, 0xa77d, 0x2c63, 0x1985, 0x411a, 0xb262, 0xbf1f, 0xb260, 0x1a16, 0x43ac, 0x41d4, 0x440c, 0x41f6, 0x3409, 0xb2a6, 0xbfe1, 0x2013, 0x43e1, 0x43fd, 0x46d1, 0x4160, 0xbf73, 0x4132, 0x429b, 0x23b3, 0xbae9, 0x10bd, 0xba7f, 0xba1b, 0x1886, 0x109c, 0x41a6, 0xb201, 0x1be2, 0xbf95, 0x410e, 0x46a2, 0x430a, 0x02f1, 0xb2d5, 0xb206, 0xbae9, 0x1b5c, 0x40f3, 0x44da, 0xbf43, 0xabc8, 0x0f66, 0x1883, 0x458b, 0x426d, 0xa283, 0x4033, 0x416e, 0x4173, 0x4461, 0xb2f6, 0x1139, 0xb0b0, 0xbfe0, 0x437a, 0x41f9, 0xb226, 0x4359, 0x4160, 0x4618, 0xb27e, 0x41ab, 0xbfb4, 0xb0f4, 0x4603, 0x401e, 0x2dd7, 0x1b5c, 0xb2ec, 0x16ab, 0xb00d, 0x41b9, 0xa2eb, 0xb00d, 0x40bf, 0x2e03, 0x46b2, 0xbf13, 0x38c1, 0x1ed1, 0xbac9, 0x4036, 0xb0bf, 0x41bc, 0xba14, 0x02dc, 0x41c1, 0x4383, 0xba42, 0xb223, 0xba53, 0x4037, 0xba00, 0x43d0, 0x4362, 0x42ea, 0xb03f, 0x41a3, 0x4111, 0x001b, 0x0080, 0xbf7f, 0xb299, 0x40e7, 0x4158, 0x4196, 0x1a5d, 0x07f6, 0x41ee, 0x0c49, 0xb2c8, 0xb243, 0x409a, 0x392d, 0xb2bf, 0xa325, 0x4629, 0xbfd4, 0x4334, 0x4305, 0x2dd2, 0xbfe0, 0xb01d, 0x36a2, 0x4211, 0xbfe4, 0x4151, 0xbfb0, 0xb2da, 0xbf70, 0xb2ee, 0x43a8, 0xbf85, 0x448d, 0x43e6, 0x1b34, 0x18e6, 0x43f7, 0x1d9f, 0xb251, 0x40b6, 0x0822, 0x4048, 0xb086, 0x0161, 0xbaca, 0xb211, 0x0500, 0xb076, 0x400d, 0xbf9c, 0x40bd, 0x41bd, 0x22d5, 0x421d, 0x3876, 0x1a86, 0x408e, 0x357b, 0x4567, 0x41f6, 0xb29f, 0x43f4, 0x439b, 0x431b, 0x4115, 0x3962, 0xb0cc, 0x4198, 0x0afa, 0x445d, 0xbac5, 0xaa18, 0x41e1, 0x43e4, 0xbf59, 0x43b8, 0x431e, 0x1849, 0x4233, 0x4393, 0x42dd, 0x4275, 0x430f, 0x420b, 0xbf90, 0x4116, 0x43b5, 0xb226, 0xad7b, 0x45e8, 0x4202, 0x43c7, 0x2c0c, 0x4070, 0x4185, 0x43ce, 0xbad1, 0x1a16, 0x1c88, 0x413b, 0x4163, 0x2d64, 0xb03b, 0xbf63, 0x1d22, 0x40c5, 0x285b, 0x1f82, 0x41ba, 0x417d, 0xba1b, 0x4219, 0x40e2, 0x4297, 0x4307, 0x1873, 0x4050, 0xbfa0, 0x229d, 0x4055, 0x436a, 0x3545, 0x1a18, 0x42ef, 0xb280, 0x40a1, 0x1c13, 0xb05e, 0x408e, 0x42d4, 0x2688, 0x40d3, 0xbfc3, 0xa2eb, 0x421d, 0x440e, 0x090b, 0xb264, 0x4160, 0xb2b3, 0xbad4, 0xba36, 0x40f8, 0xb2f5, 0x3be0, 0xb096, 0x1da7, 0x1f4e, 0xba52, 0x4155, 0x4273, 0xbf8e, 0x42f4, 0x4247, 0x4148, 0x428e, 0x4481, 0x1cd6, 0x436c, 0xb22a, 0x4189, 0x27ea, 0x42c1, 0x435f, 0x41ca, 0x24f5, 0x40a8, 0x4304, 0x4575, 0x416a, 0x42d4, 0x41d8, 0x1cf2, 0x430a, 0x4249, 0xa6d5, 0x4208, 0x4361, 0xbf77, 0xb2bf, 0x4061, 0x42f5, 0x1df1, 0xb2fb, 0x2eb2, 0x1f36, 0x0636, 0x4233, 0xb051, 0x0d22, 0x437a, 0x187c, 0x431d, 0x2642, 0x4329, 0xba5e, 0x402e, 0x1a7d, 0xb27c, 0xbfc0, 0x4382, 0x430d, 0xaad4, 0x4033, 0x423d, 0x4266, 0xbfc1, 0x1a59, 0x4349, 0x416c, 0xb236, 0x4337, 0x2973, 0x43cb, 0x41d8, 0xb031, 0x431b, 0x1bce, 0x1553, 0x40ea, 0x0c9e, 0xba3b, 0x1192, 0x41a9, 0x4261, 0x4086, 0x1582, 0x4637, 0x4056, 0xbf8c, 0x4600, 0x429b, 0xbfac, 0x2ba6, 0x2e02, 0xbf2d, 0x463a, 0x41d0, 0x1d05, 0x43f9, 0x2c9c, 0x40af, 0xb00f, 0x2d8b, 0x4201, 0x4354, 0xba21, 0x1e4b, 0x41ae, 0xb2ba, 0xb28c, 0xa6c2, 0xbafd, 0x27e8, 0xa499, 0xbf8f, 0x4272, 0x076d, 0x4342, 0x4337, 0x1f5e, 0x41a3, 0x37d5, 0x417e, 0x4215, 0x4678, 0x143e, 0xbafc, 0xab29, 0x4095, 0xb28d, 0x0ed2, 0xbf80, 0xabb9, 0x433d, 0xba51, 0x0bba, 0xaa69, 0xa93d, 0x4117, 0xbfc7, 0x312f, 0xb099, 0x119d, 0x4393, 0x40e9, 0xbf94, 0x1cb6, 0x4294, 0x43f5, 0x42b8, 0xb26f, 0x2772, 0xb0a6, 0x413b, 0xadeb, 0x408e, 0xbfbc, 0x4542, 0xba61, 0xb066, 0x40f9, 0x45d5, 0xabc9, 0xba51, 0x19c0, 0x4202, 0x4245, 0x4162, 0xb256, 0x0fff, 0x1ca8, 0xbaf9, 0x3ce8, 0x45ee, 0x1bd9, 0xbfa0, 0xa474, 0xbfb3, 0x42c1, 0x39dc, 0xb08f, 0x303f, 0xba67, 0x1ec2, 0x43bd, 0xb2b5, 0x42df, 0x0cbd, 0x240e, 0x402b, 0x411d, 0xba53, 0xb20e, 0x41b8, 0xbf78, 0x413f, 0xbff0, 0x0612, 0xbf36, 0x4685, 0x3a69, 0x4318, 0x4137, 0xba21, 0x42ba, 0x4259, 0x4207, 0x41d7, 0xb2bc, 0x3b7e, 0x40d0, 0x423b, 0xab19, 0xb2ae, 0xb2b8, 0x43a4, 0xba50, 0xba2f, 0x21c8, 0x24c1, 0x4110, 0x422d, 0xbf4d, 0xa1c2, 0x1745, 0x18d8, 0x095c, 0xb260, 0x4070, 0xb23f, 0xa815, 0x346e, 0xb21f, 0x418c, 0x407f, 0xb259, 0xba4e, 0x3d84, 0xb2ff, 0x40d6, 0x44b3, 0x1bfb, 0xa6b7, 0x41f2, 0x412c, 0x4262, 0xbafd, 0x4460, 0xbfb0, 0x414c, 0xbfa9, 0x129a, 0x43d9, 0x09f1, 0x4262, 0x2b67, 0x4369, 0x40b7, 0xbf4c, 0x4473, 0xba7f, 0xba3f, 0xba30, 0xb039, 0x4378, 0x431a, 0xbf71, 0xb20b, 0xba76, 0x410a, 0x4284, 0xa2fb, 0xb283, 0xb2c3, 0xa762, 0x3e09, 0xba6c, 0xbf65, 0x4387, 0x218b, 0x2a1c, 0x4184, 0xb2b6, 0x41c0, 0x4298, 0x4249, 0x4397, 0x1ed0, 0xbafe, 0x4659, 0x1fc5, 0xa570, 0x4684, 0x40d0, 0xb012, 0x2c6b, 0xb22b, 0x105a, 0x4229, 0x409a, 0x43ce, 0xb06d, 0x4085, 0x4280, 0x12a1, 0xbf4d, 0xb09d, 0x436c, 0x281c, 0x40ff, 0x0cc9, 0xbfad, 0x1195, 0x42b4, 0x43f7, 0x415b, 0x40ad, 0x43e6, 0xb016, 0x4086, 0x4037, 0x0149, 0xbfd0, 0x41f5, 0x3cc4, 0xad52, 0x2422, 0xa9f5, 0x41c6, 0x26b2, 0x4226, 0xb27e, 0xbf3e, 0x02a3, 0xbac8, 0xb225, 0xbf31, 0x0663, 0xaea1, 0x4010, 0x00b1, 0x4201, 0xb0ce, 0xba4c, 0x400b, 0x4442, 0x436d, 0x0722, 0x42f6, 0x4321, 0x4001, 0x1f25, 0x411e, 0x401d, 0xba3a, 0x0ba3, 0xb2e1, 0x0141, 0xb01f, 0xb26c, 0x41a7, 0x435a, 0xaa86, 0xbfbb, 0x459c, 0x1caf, 0x441e, 0x43e5, 0x3643, 0x4240, 0xb292, 0x3097, 0xb2c2, 0x1b2f, 0x0db8, 0x40ab, 0xba0c, 0xb21c, 0x415e, 0x42ba, 0x4182, 0x25a2, 0x42c0, 0xb08f, 0x2808, 0xbf97, 0x400b, 0x43af, 0xb22e, 0x416e, 0xba40, 0xbf80, 0x43fe, 0x4349, 0xbada, 0x4003, 0xbff0, 0x0a40, 0x3d0b, 0x412c, 0xbf2f, 0x430f, 0x101c, 0x1a47, 0x41ce, 0xb2de, 0x4359, 0x4297, 0x41ad, 0x1d4a, 0x44eb, 0xbf80, 0x436f, 0xa5d7, 0x1cb2, 0xbf1f, 0x2907, 0x1b41, 0x43c7, 0x42a7, 0x41d0, 0xb2d9, 0x429f, 0x43d2, 0xa0eb, 0x4106, 0xb2d9, 0xa5a9, 0xa43e, 0x43d7, 0x12d3, 0x1e49, 0x41e3, 0x4589, 0x433d, 0x430f, 0xab65, 0xb22d, 0xbaee, 0xb22a, 0xaec2, 0xb265, 0xba6c, 0x1a12, 0xbfb2, 0x4137, 0xa12b, 0x4115, 0x4306, 0x43e9, 0x1c8b, 0x1542, 0x2360, 0x45ea, 0x4387, 0xba7a, 0x1fab, 0xb245, 0xbfd8, 0x2725, 0xbf78, 0x4146, 0x428a, 0xb21b, 0x19f9, 0xb282, 0xb2da, 0x4622, 0x40ae, 0x46ac, 0x41ac, 0xbf33, 0xb213, 0xb22d, 0xba56, 0x40b7, 0xab93, 0x18e7, 0x4372, 0x40ce, 0xb23d, 0x1a8c, 0xb281, 0x42a2, 0x41ce, 0xb22e, 0x43ee, 0xb221, 0xbf2f, 0xb2c3, 0x4081, 0x23a1, 0x4162, 0x42b6, 0xb004, 0x1e59, 0xb2d0, 0x4121, 0x435d, 0xb2af, 0xb2f0, 0x42ab, 0xbfe0, 0x1cb8, 0x44f3, 0x4605, 0x1e0e, 0x4625, 0x31e0, 0x4570, 0x40ec, 0xbf7a, 0x4173, 0xa0f7, 0xb2f3, 0xba19, 0x4149, 0x1f51, 0xba44, 0x29ac, 0x402d, 0x1808, 0x01f2, 0x41bf, 0x4186, 0x42e4, 0x10e4, 0x1f7a, 0x416a, 0xb0b8, 0x4130, 0x4467, 0xbf4a, 0xba17, 0x4237, 0xb2bd, 0x1cb4, 0x1955, 0x3010, 0xbf6c, 0x419f, 0xbf90, 0x4326, 0x423d, 0x40b3, 0xb24d, 0x413a, 0x414f, 0x4317, 0x4018, 0xb254, 0x0dd2, 0x4281, 0x4175, 0x4590, 0x19ad, 0x405f, 0x1d33, 0xbf2b, 0x3132, 0x1412, 0x1bbc, 0x1bb8, 0x4259, 0x426e, 0x414f, 0x4358, 0x43df, 0xb056, 0x4677, 0xa879, 0xade8, 0xba78, 0x436a, 0xb211, 0x4013, 0x40e9, 0x4280, 0xbff0, 0x41e8, 0x068f, 0x185e, 0x43c5, 0x43c6, 0xb021, 0xbfa7, 0x42da, 0x1aa9, 0x4214, 0xa017, 0x4770, 0xe7fe + ], + StartRegs = [0x371597f2, 0x76cf74c6, 0xf6f07bf9, 0x14bc3ff2, 0x44d46dd4, 0x85b9d3ca, 0x44827883, 0x4ba02ac3, 0x45d4fe43, 0x55355bd7, 0xa1571ee2, 0x4065eef1, 0x6a318c25, 0x4295c0bf, 0x00000000, 0x600001f0 + ], + FinalRegs = [0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x45d4fe43, 0xa1571ee2, 0x00000000, 0x82fbba0c, 0x00000064, 0x4295cc27, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x200c, 0xbf4b, 0x3eb3, 0x4389, 0x4279, 0xb2c4, 0x432f, 0xb2ad, 0x1a23, 0xa8ec, 0x4396, 0x424d, 0x4177, 0xb0e4, 0x30b3, 0x4175, 0x42f2, 0x43e7, 0x40d1, 0x1e00, 0xb20a, 0x1f46, 0x42a6, 0x401c, 0xbf26, 0x4342, 0x4082, 0x38b3, 0x01dc, 0xbfe0, 0x429c, 0x4192, 0xb294, 0x1c89, 0xbf8a, 0x4290, 0xba28, 0xba38, 0x4255, 0xa885, 0x41bc, 0x1e2c, 0x4188, 0xb25d, 0xb245, 0x0f0d, 0x1af7, 0x1a13, 0x00b2, 0x23e6, 0x05cc, 0x350b, 0x43da, 0xb2ee, 0xa17e, 0x4290, 0x11a2, 0x4151, 0x1629, 0xbfaa, 0x44a8, 0x3802, 0x2ddb, 0x3c35, 0x4328, 0x1c04, 0x41cc, 0x4010, 0x4031, 0x41b9, 0xbfcd, 0x420c, 0x43fe, 0xb209, 0x4070, 0x4009, 0xb04f, 0x1b1a, 0x1ad0, 0xba64, 0xab75, 0xbaf7, 0xb01e, 0x41f5, 0x423f, 0x46d9, 0x0581, 0x40aa, 0x2fd3, 0x19d7, 0x1d89, 0x357c, 0xb0e6, 0x1ef7, 0xbf29, 0x44e1, 0x066d, 0x3b50, 0xac4d, 0x19a8, 0x449d, 0x0215, 0x0662, 0x4348, 0x4168, 0x4392, 0xac1f, 0xb02d, 0xbf88, 0x1835, 0xa8cb, 0xb06d, 0x426f, 0x3a1f, 0x1aeb, 0xb01d, 0xb014, 0x4221, 0x1e94, 0xbf53, 0xb287, 0xadbc, 0xb275, 0x42b6, 0x46c4, 0xab25, 0x394f, 0x1a27, 0x1dc2, 0xbff0, 0x43bc, 0xb062, 0xb2bd, 0x4109, 0x4305, 0xbf37, 0xb09e, 0x40a7, 0xb2ca, 0x42dd, 0xb248, 0xb0c0, 0x311c, 0x40cd, 0x40e7, 0x428f, 0x422c, 0x4213, 0x4101, 0x1838, 0x1f0a, 0x1b05, 0xbad3, 0xb28d, 0xbf70, 0x40bc, 0x4383, 0x43f6, 0x0bb7, 0x4036, 0x4582, 0x3552, 0xbf0f, 0x4329, 0xb244, 0xb2cf, 0x4095, 0xb261, 0x41f2, 0x083b, 0xb278, 0x0ce4, 0x415c, 0xbf3f, 0x4001, 0xb0ec, 0x0cbe, 0x1347, 0xbf1d, 0x4254, 0x199b, 0x1f28, 0xb2c1, 0x071c, 0x4234, 0xba53, 0xb074, 0xba5d, 0x4391, 0x3240, 0xb2e7, 0x4320, 0x19b5, 0x020e, 0x439b, 0x2782, 0xba6a, 0x094a, 0xb044, 0x40f5, 0xb21a, 0x40cd, 0xb274, 0xbf9a, 0x424f, 0x4624, 0x4009, 0xb23e, 0x42ef, 0x4284, 0x4548, 0x1da1, 0x19f5, 0x4100, 0xb2b2, 0xad48, 0x40a6, 0x1f3d, 0x45e1, 0xb22d, 0xbf12, 0x4008, 0x08ae, 0x420c, 0xbae7, 0x4273, 0x4225, 0x1c10, 0xbf68, 0x4070, 0x4113, 0xb08a, 0x0a0a, 0xa398, 0x08f0, 0xbfe0, 0x0f55, 0x41c3, 0x1c12, 0x385a, 0xa0f9, 0x1e68, 0x13ce, 0x1ffe, 0x4032, 0x435f, 0xba10, 0xb231, 0xb27f, 0xbf13, 0x42e5, 0x16d2, 0xb2e2, 0x4379, 0xba75, 0x428e, 0x4239, 0x4311, 0x42df, 0x43ed, 0x29dd, 0xbfa4, 0xb05e, 0xaf16, 0x1b1d, 0x4101, 0x415a, 0xb2a8, 0x40ed, 0x3eb0, 0x4346, 0x412b, 0xb28f, 0x415a, 0xbfd9, 0x425f, 0x4182, 0xb249, 0x43e6, 0xb2b9, 0x1400, 0x4073, 0x1272, 0x42d9, 0x4391, 0x407b, 0x43ba, 0xb07c, 0x41b6, 0xba09, 0x4419, 0xbfba, 0x40ae, 0x44f2, 0x1e03, 0x3d31, 0x4313, 0x417c, 0x1f4a, 0x40e1, 0x1b00, 0x425e, 0x46d2, 0x406c, 0xbfc3, 0x1ef0, 0x4266, 0x407f, 0x2f1e, 0x2462, 0x43ae, 0xb077, 0x4187, 0x4624, 0x4366, 0xba60, 0x43ed, 0x4429, 0xb20c, 0x2bc8, 0x181e, 0xbfb0, 0xb02b, 0xb26f, 0xa896, 0x42e8, 0x1cc9, 0x404d, 0x2159, 0xb27e, 0xbf2e, 0xbff0, 0x0378, 0x4598, 0x45ec, 0xbfda, 0xba4e, 0xb250, 0xb2b4, 0xb0f9, 0x43d1, 0xb027, 0x41e3, 0x4076, 0x43df, 0xbafd, 0x4397, 0x4046, 0x4567, 0xb251, 0x454f, 0x44e5, 0xbf8d, 0xba25, 0x461d, 0x415d, 0xae84, 0x4577, 0xbaeb, 0x0cd3, 0x4201, 0x025f, 0x4126, 0x2412, 0x1896, 0x424a, 0x1daf, 0xb22e, 0x4311, 0xba23, 0xbaf4, 0x4243, 0x3d58, 0xb0c3, 0xb0dc, 0xb230, 0x424f, 0x401f, 0xbf32, 0xa999, 0x42d4, 0x4306, 0xbfd2, 0x45f4, 0xaab3, 0xb0d5, 0x34d6, 0xb280, 0xb229, 0x4068, 0x1e55, 0x4368, 0x40bd, 0xba7f, 0xba63, 0x4108, 0x1fd9, 0xb000, 0xb295, 0x40b9, 0x2f6d, 0x447c, 0x43b9, 0xbf7c, 0xb059, 0xba47, 0x40d6, 0x1e41, 0x378b, 0xbfa0, 0x25c8, 0x2b2f, 0x014f, 0xbf03, 0x4139, 0xb238, 0x01a8, 0x3707, 0x1878, 0x4301, 0x19e6, 0xab18, 0xba2e, 0x4126, 0x43eb, 0xb29f, 0x42a6, 0x41bb, 0x0eca, 0x08f5, 0x414a, 0x41c5, 0x4305, 0x43bd, 0x40ed, 0x0b88, 0x4387, 0x4380, 0xb0fd, 0x31e5, 0xba59, 0xbf90, 0xbf57, 0x40f1, 0x435f, 0x385f, 0x403b, 0xbadc, 0x301d, 0xb265, 0x440c, 0xbac3, 0xb2a3, 0x402c, 0x45bb, 0x43e4, 0x2833, 0x4109, 0xae7c, 0xb0d2, 0x458e, 0x40ec, 0x14c5, 0x405a, 0x2480, 0x0070, 0xbf24, 0x41b2, 0xba46, 0x401c, 0xbf27, 0x2583, 0xb24d, 0x41ff, 0x32fc, 0xb0d4, 0x4045, 0x4145, 0x00ca, 0x4067, 0x42ac, 0x4094, 0x3145, 0x4120, 0x1e2a, 0xba20, 0x4156, 0x3e8c, 0x40e0, 0x1c02, 0xba0d, 0xb061, 0x46fd, 0x42e6, 0xbf6b, 0x411b, 0x1fbf, 0xb070, 0x1846, 0xb22b, 0x4695, 0x407e, 0xba6e, 0x10bc, 0xbf94, 0x42fd, 0x43b9, 0xac56, 0x414a, 0x0183, 0x41a6, 0x42f3, 0x433d, 0x19c1, 0x4053, 0x4204, 0xb282, 0xb241, 0x1e8c, 0xb287, 0x421b, 0xb270, 0xb036, 0xb285, 0x4220, 0xbaca, 0xb289, 0xb275, 0x2849, 0x410d, 0xa4a3, 0xb231, 0xbfb4, 0x1e9b, 0x413e, 0xa953, 0xb289, 0x408c, 0x4237, 0x3547, 0xb0fe, 0xbf4c, 0x45d8, 0x424e, 0x40a3, 0x1e5c, 0x41c3, 0xbafe, 0x32ef, 0x4191, 0x41f2, 0x1d7d, 0xaacc, 0x43f2, 0x418f, 0xb203, 0xb0cb, 0x3ac6, 0xa494, 0x41fe, 0x4015, 0xbace, 0x34f5, 0x4385, 0xbf1c, 0x323a, 0x414f, 0x4312, 0x402a, 0x426f, 0x41b7, 0x4257, 0x2fda, 0xb2d1, 0x4251, 0xbf34, 0x405a, 0x44c0, 0xbfbc, 0x45e2, 0x4285, 0x40b7, 0x4293, 0xb0fa, 0xba14, 0x15bf, 0x4350, 0x420a, 0x418c, 0x33de, 0xba58, 0xa868, 0x1eb6, 0xb202, 0x43a4, 0x439c, 0x42a7, 0x4323, 0x45e6, 0x1e1b, 0xa2d3, 0x1833, 0x1896, 0x4174, 0x411b, 0xbf6d, 0x13be, 0x2d69, 0x41eb, 0x429c, 0xb2d2, 0xb2a0, 0x2ec9, 0x41ee, 0x1b0a, 0x1fbf, 0x423a, 0x1db5, 0xba10, 0x40df, 0x41dc, 0xb25f, 0xb2b9, 0xb2dd, 0x45dd, 0x403d, 0x31a2, 0x4190, 0x402b, 0xbf5c, 0x43ce, 0xa551, 0x386b, 0xbae4, 0x09fd, 0x4318, 0xbf46, 0x413d, 0x1c10, 0x41e9, 0x42b9, 0x1792, 0x419e, 0x1f8d, 0xbfb2, 0xb2be, 0x426b, 0x12da, 0xa7d4, 0x19a3, 0x40c7, 0xbad2, 0x43ee, 0x45cb, 0x0e6b, 0xabd7, 0x094f, 0xbac9, 0x40a0, 0x43aa, 0xbfe2, 0x4375, 0x2acd, 0x41de, 0x43e1, 0x1035, 0x067c, 0x40e4, 0x43cd, 0x1499, 0x19fd, 0xb09a, 0x43eb, 0x3b91, 0x0573, 0x4043, 0x1edc, 0xba7a, 0x4341, 0x37ca, 0x4030, 0x1037, 0xbae7, 0xb2b5, 0x4339, 0xbf03, 0x1731, 0x461f, 0xb040, 0x417d, 0x41dc, 0xb013, 0x1e18, 0x05e4, 0xbfb8, 0x41d7, 0x1c58, 0x0e05, 0x41ed, 0x431f, 0x406f, 0x43f3, 0x19df, 0x4058, 0x412a, 0x1e46, 0x4248, 0x4561, 0xbf6d, 0x4073, 0x429a, 0x4280, 0x1bd4, 0xb0fe, 0x4024, 0xbfde, 0x41ca, 0x4143, 0x424d, 0x4137, 0x434d, 0x4206, 0x2331, 0x434b, 0x41d2, 0x412d, 0x3037, 0x423c, 0x4582, 0xbaed, 0x41f8, 0x4113, 0x4584, 0xbf2a, 0xb234, 0x1de1, 0xb2cd, 0x4099, 0xa0ca, 0x4167, 0xbf00, 0x42e3, 0x2ee1, 0x1d91, 0x0fa0, 0x400d, 0x3248, 0xbfde, 0x25d6, 0x4332, 0x0ca8, 0x18fd, 0xb25f, 0xba37, 0x4121, 0x4402, 0x42c8, 0xbfc0, 0x3ff9, 0x41c3, 0xb2a8, 0x184f, 0x37a4, 0x439d, 0x17f7, 0x4273, 0x0b72, 0x428d, 0x4293, 0xad65, 0xbf60, 0x1be0, 0xba20, 0x43e8, 0x4033, 0x219f, 0xbf27, 0x425b, 0x1cab, 0x42c0, 0xa753, 0x411b, 0x42ad, 0x14cd, 0xba71, 0x4221, 0xba79, 0xbfbf, 0x423f, 0x437b, 0x418d, 0x43c5, 0x4062, 0x0c46, 0x3c2f, 0x442a, 0xbf26, 0x1a90, 0xb2b7, 0x07b4, 0xbf52, 0x04df, 0x42e1, 0x1d76, 0x418b, 0x333f, 0x1f08, 0x4007, 0x1246, 0xb259, 0x4084, 0x4223, 0xb257, 0xb26b, 0x2ba1, 0xb232, 0x11ce, 0xb25e, 0xb213, 0xbf5e, 0xb26f, 0x1bdd, 0x426c, 0x4375, 0x18e4, 0x403c, 0x42b8, 0xb02b, 0x4197, 0x1861, 0x2f7a, 0xbfb8, 0xa15b, 0x43d1, 0x3df1, 0xb2e7, 0x43dd, 0x425d, 0xba27, 0x4281, 0xbaf7, 0x4644, 0xbf4d, 0xa7c4, 0x4208, 0x411c, 0x43f3, 0xbacf, 0xb04f, 0x4091, 0x41d0, 0x2fd4, 0x4332, 0xb205, 0x45ee, 0xb2b7, 0xb0a1, 0xb235, 0x214e, 0x4232, 0x41e1, 0xbada, 0x2e04, 0xb2ba, 0x40f8, 0x3e46, 0xbf05, 0x3862, 0x0057, 0x426a, 0x401e, 0xb014, 0xba19, 0x0d65, 0xba7d, 0x41cc, 0x34c8, 0x4201, 0x4202, 0x43a6, 0xb004, 0xbf2c, 0xa057, 0x0d9f, 0x431a, 0xba38, 0x40b7, 0xb277, 0x4275, 0x27a1, 0x4222, 0xb098, 0xb02e, 0xb2de, 0x40e5, 0xbf27, 0x42a3, 0xad53, 0x4627, 0xbfe0, 0xba06, 0x4098, 0xb24c, 0x40e0, 0x0ec3, 0x411a, 0x403f, 0xb256, 0x42eb, 0xba5f, 0xbfb6, 0x42ac, 0x41cd, 0xb2ec, 0xbf85, 0x0e6f, 0x164c, 0xb207, 0x434c, 0xbfe0, 0x40f4, 0xbaed, 0x4056, 0xb20a, 0x1834, 0x4659, 0x1d2e, 0x0587, 0xbfb6, 0xaaf8, 0x45c6, 0x401b, 0xba6a, 0xba64, 0x40b0, 0xba31, 0x0731, 0x41ae, 0x427d, 0x4021, 0x272c, 0xba2e, 0x409f, 0xbae6, 0x4048, 0x4065, 0xbf06, 0x40e6, 0x430c, 0xb20a, 0xba68, 0xba40, 0xbf95, 0x4171, 0x43f2, 0xb25a, 0x43cb, 0x42d0, 0x46db, 0xa3e7, 0x43e8, 0x402c, 0x053e, 0x422a, 0x4261, 0x429e, 0x417d, 0xb234, 0x41f5, 0x2f6f, 0x44d2, 0xbf6a, 0x1fff, 0x1a5b, 0xba78, 0x29e0, 0x43ad, 0x4200, 0xb2dd, 0x0096, 0x3a21, 0xb247, 0x382e, 0xba2e, 0x4336, 0x4021, 0x4221, 0xbf59, 0x43cd, 0x1810, 0xa198, 0x2e75, 0xba5d, 0x42dd, 0x42a6, 0x422b, 0xbf07, 0xa0f8, 0x4206, 0x41d6, 0x3238, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3aa91aa4, 0x4c5784a8, 0x59e0657d, 0x51ef61ac, 0x760b00f1, 0x0da5a30b, 0x69a772e3, 0x96f320f6, 0x01c12c2c, 0xe5449e38, 0x74e0fd57, 0xcf8b32f0, 0x484f3e23, 0x911d3cda, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0xffffffb0, 0x00000000, 0x00000017, 0x00001b1c, 0x00000000, 0x00001c1b, 0x38000000, 0xffffffff, 0x0382586e, 0x17da7113, 0xe9c1faae, 0xcf8b32f0, 0x01c12c37, 0xfffffbd4, 0x00000000, 0x200001d0 }, + Instructions = [0x200c, 0xbf4b, 0x3eb3, 0x4389, 0x4279, 0xb2c4, 0x432f, 0xb2ad, 0x1a23, 0xa8ec, 0x4396, 0x424d, 0x4177, 0xb0e4, 0x30b3, 0x4175, 0x42f2, 0x43e7, 0x40d1, 0x1e00, 0xb20a, 0x1f46, 0x42a6, 0x401c, 0xbf26, 0x4342, 0x4082, 0x38b3, 0x01dc, 0xbfe0, 0x429c, 0x4192, 0xb294, 0x1c89, 0xbf8a, 0x4290, 0xba28, 0xba38, 0x4255, 0xa885, 0x41bc, 0x1e2c, 0x4188, 0xb25d, 0xb245, 0x0f0d, 0x1af7, 0x1a13, 0x00b2, 0x23e6, 0x05cc, 0x350b, 0x43da, 0xb2ee, 0xa17e, 0x4290, 0x11a2, 0x4151, 0x1629, 0xbfaa, 0x44a8, 0x3802, 0x2ddb, 0x3c35, 0x4328, 0x1c04, 0x41cc, 0x4010, 0x4031, 0x41b9, 0xbfcd, 0x420c, 0x43fe, 0xb209, 0x4070, 0x4009, 0xb04f, 0x1b1a, 0x1ad0, 0xba64, 0xab75, 0xbaf7, 0xb01e, 0x41f5, 0x423f, 0x46d9, 0x0581, 0x40aa, 0x2fd3, 0x19d7, 0x1d89, 0x357c, 0xb0e6, 0x1ef7, 0xbf29, 0x44e1, 0x066d, 0x3b50, 0xac4d, 0x19a8, 0x449d, 0x0215, 0x0662, 0x4348, 0x4168, 0x4392, 0xac1f, 0xb02d, 0xbf88, 0x1835, 0xa8cb, 0xb06d, 0x426f, 0x3a1f, 0x1aeb, 0xb01d, 0xb014, 0x4221, 0x1e94, 0xbf53, 0xb287, 0xadbc, 0xb275, 0x42b6, 0x46c4, 0xab25, 0x394f, 0x1a27, 0x1dc2, 0xbff0, 0x43bc, 0xb062, 0xb2bd, 0x4109, 0x4305, 0xbf37, 0xb09e, 0x40a7, 0xb2ca, 0x42dd, 0xb248, 0xb0c0, 0x311c, 0x40cd, 0x40e7, 0x428f, 0x422c, 0x4213, 0x4101, 0x1838, 0x1f0a, 0x1b05, 0xbad3, 0xb28d, 0xbf70, 0x40bc, 0x4383, 0x43f6, 0x0bb7, 0x4036, 0x4582, 0x3552, 0xbf0f, 0x4329, 0xb244, 0xb2cf, 0x4095, 0xb261, 0x41f2, 0x083b, 0xb278, 0x0ce4, 0x415c, 0xbf3f, 0x4001, 0xb0ec, 0x0cbe, 0x1347, 0xbf1d, 0x4254, 0x199b, 0x1f28, 0xb2c1, 0x071c, 0x4234, 0xba53, 0xb074, 0xba5d, 0x4391, 0x3240, 0xb2e7, 0x4320, 0x19b5, 0x020e, 0x439b, 0x2782, 0xba6a, 0x094a, 0xb044, 0x40f5, 0xb21a, 0x40cd, 0xb274, 0xbf9a, 0x424f, 0x4624, 0x4009, 0xb23e, 0x42ef, 0x4284, 0x4548, 0x1da1, 0x19f5, 0x4100, 0xb2b2, 0xad48, 0x40a6, 0x1f3d, 0x45e1, 0xb22d, 0xbf12, 0x4008, 0x08ae, 0x420c, 0xbae7, 0x4273, 0x4225, 0x1c10, 0xbf68, 0x4070, 0x4113, 0xb08a, 0x0a0a, 0xa398, 0x08f0, 0xbfe0, 0x0f55, 0x41c3, 0x1c12, 0x385a, 0xa0f9, 0x1e68, 0x13ce, 0x1ffe, 0x4032, 0x435f, 0xba10, 0xb231, 0xb27f, 0xbf13, 0x42e5, 0x16d2, 0xb2e2, 0x4379, 0xba75, 0x428e, 0x4239, 0x4311, 0x42df, 0x43ed, 0x29dd, 0xbfa4, 0xb05e, 0xaf16, 0x1b1d, 0x4101, 0x415a, 0xb2a8, 0x40ed, 0x3eb0, 0x4346, 0x412b, 0xb28f, 0x415a, 0xbfd9, 0x425f, 0x4182, 0xb249, 0x43e6, 0xb2b9, 0x1400, 0x4073, 0x1272, 0x42d9, 0x4391, 0x407b, 0x43ba, 0xb07c, 0x41b6, 0xba09, 0x4419, 0xbfba, 0x40ae, 0x44f2, 0x1e03, 0x3d31, 0x4313, 0x417c, 0x1f4a, 0x40e1, 0x1b00, 0x425e, 0x46d2, 0x406c, 0xbfc3, 0x1ef0, 0x4266, 0x407f, 0x2f1e, 0x2462, 0x43ae, 0xb077, 0x4187, 0x4624, 0x4366, 0xba60, 0x43ed, 0x4429, 0xb20c, 0x2bc8, 0x181e, 0xbfb0, 0xb02b, 0xb26f, 0xa896, 0x42e8, 0x1cc9, 0x404d, 0x2159, 0xb27e, 0xbf2e, 0xbff0, 0x0378, 0x4598, 0x45ec, 0xbfda, 0xba4e, 0xb250, 0xb2b4, 0xb0f9, 0x43d1, 0xb027, 0x41e3, 0x4076, 0x43df, 0xbafd, 0x4397, 0x4046, 0x4567, 0xb251, 0x454f, 0x44e5, 0xbf8d, 0xba25, 0x461d, 0x415d, 0xae84, 0x4577, 0xbaeb, 0x0cd3, 0x4201, 0x025f, 0x4126, 0x2412, 0x1896, 0x424a, 0x1daf, 0xb22e, 0x4311, 0xba23, 0xbaf4, 0x4243, 0x3d58, 0xb0c3, 0xb0dc, 0xb230, 0x424f, 0x401f, 0xbf32, 0xa999, 0x42d4, 0x4306, 0xbfd2, 0x45f4, 0xaab3, 0xb0d5, 0x34d6, 0xb280, 0xb229, 0x4068, 0x1e55, 0x4368, 0x40bd, 0xba7f, 0xba63, 0x4108, 0x1fd9, 0xb000, 0xb295, 0x40b9, 0x2f6d, 0x447c, 0x43b9, 0xbf7c, 0xb059, 0xba47, 0x40d6, 0x1e41, 0x378b, 0xbfa0, 0x25c8, 0x2b2f, 0x014f, 0xbf03, 0x4139, 0xb238, 0x01a8, 0x3707, 0x1878, 0x4301, 0x19e6, 0xab18, 0xba2e, 0x4126, 0x43eb, 0xb29f, 0x42a6, 0x41bb, 0x0eca, 0x08f5, 0x414a, 0x41c5, 0x4305, 0x43bd, 0x40ed, 0x0b88, 0x4387, 0x4380, 0xb0fd, 0x31e5, 0xba59, 0xbf90, 0xbf57, 0x40f1, 0x435f, 0x385f, 0x403b, 0xbadc, 0x301d, 0xb265, 0x440c, 0xbac3, 0xb2a3, 0x402c, 0x45bb, 0x43e4, 0x2833, 0x4109, 0xae7c, 0xb0d2, 0x458e, 0x40ec, 0x14c5, 0x405a, 0x2480, 0x0070, 0xbf24, 0x41b2, 0xba46, 0x401c, 0xbf27, 0x2583, 0xb24d, 0x41ff, 0x32fc, 0xb0d4, 0x4045, 0x4145, 0x00ca, 0x4067, 0x42ac, 0x4094, 0x3145, 0x4120, 0x1e2a, 0xba20, 0x4156, 0x3e8c, 0x40e0, 0x1c02, 0xba0d, 0xb061, 0x46fd, 0x42e6, 0xbf6b, 0x411b, 0x1fbf, 0xb070, 0x1846, 0xb22b, 0x4695, 0x407e, 0xba6e, 0x10bc, 0xbf94, 0x42fd, 0x43b9, 0xac56, 0x414a, 0x0183, 0x41a6, 0x42f3, 0x433d, 0x19c1, 0x4053, 0x4204, 0xb282, 0xb241, 0x1e8c, 0xb287, 0x421b, 0xb270, 0xb036, 0xb285, 0x4220, 0xbaca, 0xb289, 0xb275, 0x2849, 0x410d, 0xa4a3, 0xb231, 0xbfb4, 0x1e9b, 0x413e, 0xa953, 0xb289, 0x408c, 0x4237, 0x3547, 0xb0fe, 0xbf4c, 0x45d8, 0x424e, 0x40a3, 0x1e5c, 0x41c3, 0xbafe, 0x32ef, 0x4191, 0x41f2, 0x1d7d, 0xaacc, 0x43f2, 0x418f, 0xb203, 0xb0cb, 0x3ac6, 0xa494, 0x41fe, 0x4015, 0xbace, 0x34f5, 0x4385, 0xbf1c, 0x323a, 0x414f, 0x4312, 0x402a, 0x426f, 0x41b7, 0x4257, 0x2fda, 0xb2d1, 0x4251, 0xbf34, 0x405a, 0x44c0, 0xbfbc, 0x45e2, 0x4285, 0x40b7, 0x4293, 0xb0fa, 0xba14, 0x15bf, 0x4350, 0x420a, 0x418c, 0x33de, 0xba58, 0xa868, 0x1eb6, 0xb202, 0x43a4, 0x439c, 0x42a7, 0x4323, 0x45e6, 0x1e1b, 0xa2d3, 0x1833, 0x1896, 0x4174, 0x411b, 0xbf6d, 0x13be, 0x2d69, 0x41eb, 0x429c, 0xb2d2, 0xb2a0, 0x2ec9, 0x41ee, 0x1b0a, 0x1fbf, 0x423a, 0x1db5, 0xba10, 0x40df, 0x41dc, 0xb25f, 0xb2b9, 0xb2dd, 0x45dd, 0x403d, 0x31a2, 0x4190, 0x402b, 0xbf5c, 0x43ce, 0xa551, 0x386b, 0xbae4, 0x09fd, 0x4318, 0xbf46, 0x413d, 0x1c10, 0x41e9, 0x42b9, 0x1792, 0x419e, 0x1f8d, 0xbfb2, 0xb2be, 0x426b, 0x12da, 0xa7d4, 0x19a3, 0x40c7, 0xbad2, 0x43ee, 0x45cb, 0x0e6b, 0xabd7, 0x094f, 0xbac9, 0x40a0, 0x43aa, 0xbfe2, 0x4375, 0x2acd, 0x41de, 0x43e1, 0x1035, 0x067c, 0x40e4, 0x43cd, 0x1499, 0x19fd, 0xb09a, 0x43eb, 0x3b91, 0x0573, 0x4043, 0x1edc, 0xba7a, 0x4341, 0x37ca, 0x4030, 0x1037, 0xbae7, 0xb2b5, 0x4339, 0xbf03, 0x1731, 0x461f, 0xb040, 0x417d, 0x41dc, 0xb013, 0x1e18, 0x05e4, 0xbfb8, 0x41d7, 0x1c58, 0x0e05, 0x41ed, 0x431f, 0x406f, 0x43f3, 0x19df, 0x4058, 0x412a, 0x1e46, 0x4248, 0x4561, 0xbf6d, 0x4073, 0x429a, 0x4280, 0x1bd4, 0xb0fe, 0x4024, 0xbfde, 0x41ca, 0x4143, 0x424d, 0x4137, 0x434d, 0x4206, 0x2331, 0x434b, 0x41d2, 0x412d, 0x3037, 0x423c, 0x4582, 0xbaed, 0x41f8, 0x4113, 0x4584, 0xbf2a, 0xb234, 0x1de1, 0xb2cd, 0x4099, 0xa0ca, 0x4167, 0xbf00, 0x42e3, 0x2ee1, 0x1d91, 0x0fa0, 0x400d, 0x3248, 0xbfde, 0x25d6, 0x4332, 0x0ca8, 0x18fd, 0xb25f, 0xba37, 0x4121, 0x4402, 0x42c8, 0xbfc0, 0x3ff9, 0x41c3, 0xb2a8, 0x184f, 0x37a4, 0x439d, 0x17f7, 0x4273, 0x0b72, 0x428d, 0x4293, 0xad65, 0xbf60, 0x1be0, 0xba20, 0x43e8, 0x4033, 0x219f, 0xbf27, 0x425b, 0x1cab, 0x42c0, 0xa753, 0x411b, 0x42ad, 0x14cd, 0xba71, 0x4221, 0xba79, 0xbfbf, 0x423f, 0x437b, 0x418d, 0x43c5, 0x4062, 0x0c46, 0x3c2f, 0x442a, 0xbf26, 0x1a90, 0xb2b7, 0x07b4, 0xbf52, 0x04df, 0x42e1, 0x1d76, 0x418b, 0x333f, 0x1f08, 0x4007, 0x1246, 0xb259, 0x4084, 0x4223, 0xb257, 0xb26b, 0x2ba1, 0xb232, 0x11ce, 0xb25e, 0xb213, 0xbf5e, 0xb26f, 0x1bdd, 0x426c, 0x4375, 0x18e4, 0x403c, 0x42b8, 0xb02b, 0x4197, 0x1861, 0x2f7a, 0xbfb8, 0xa15b, 0x43d1, 0x3df1, 0xb2e7, 0x43dd, 0x425d, 0xba27, 0x4281, 0xbaf7, 0x4644, 0xbf4d, 0xa7c4, 0x4208, 0x411c, 0x43f3, 0xbacf, 0xb04f, 0x4091, 0x41d0, 0x2fd4, 0x4332, 0xb205, 0x45ee, 0xb2b7, 0xb0a1, 0xb235, 0x214e, 0x4232, 0x41e1, 0xbada, 0x2e04, 0xb2ba, 0x40f8, 0x3e46, 0xbf05, 0x3862, 0x0057, 0x426a, 0x401e, 0xb014, 0xba19, 0x0d65, 0xba7d, 0x41cc, 0x34c8, 0x4201, 0x4202, 0x43a6, 0xb004, 0xbf2c, 0xa057, 0x0d9f, 0x431a, 0xba38, 0x40b7, 0xb277, 0x4275, 0x27a1, 0x4222, 0xb098, 0xb02e, 0xb2de, 0x40e5, 0xbf27, 0x42a3, 0xad53, 0x4627, 0xbfe0, 0xba06, 0x4098, 0xb24c, 0x40e0, 0x0ec3, 0x411a, 0x403f, 0xb256, 0x42eb, 0xba5f, 0xbfb6, 0x42ac, 0x41cd, 0xb2ec, 0xbf85, 0x0e6f, 0x164c, 0xb207, 0x434c, 0xbfe0, 0x40f4, 0xbaed, 0x4056, 0xb20a, 0x1834, 0x4659, 0x1d2e, 0x0587, 0xbfb6, 0xaaf8, 0x45c6, 0x401b, 0xba6a, 0xba64, 0x40b0, 0xba31, 0x0731, 0x41ae, 0x427d, 0x4021, 0x272c, 0xba2e, 0x409f, 0xbae6, 0x4048, 0x4065, 0xbf06, 0x40e6, 0x430c, 0xb20a, 0xba68, 0xba40, 0xbf95, 0x4171, 0x43f2, 0xb25a, 0x43cb, 0x42d0, 0x46db, 0xa3e7, 0x43e8, 0x402c, 0x053e, 0x422a, 0x4261, 0x429e, 0x417d, 0xb234, 0x41f5, 0x2f6f, 0x44d2, 0xbf6a, 0x1fff, 0x1a5b, 0xba78, 0x29e0, 0x43ad, 0x4200, 0xb2dd, 0x0096, 0x3a21, 0xb247, 0x382e, 0xba2e, 0x4336, 0x4021, 0x4221, 0xbf59, 0x43cd, 0x1810, 0xa198, 0x2e75, 0xba5d, 0x42dd, 0x42a6, 0x422b, 0xbf07, 0xa0f8, 0x4206, 0x41d6, 0x3238, 0x4770, 0xe7fe + ], + StartRegs = [0x3aa91aa4, 0x4c5784a8, 0x59e0657d, 0x51ef61ac, 0x760b00f1, 0x0da5a30b, 0x69a772e3, 0x96f320f6, 0x01c12c2c, 0xe5449e38, 0x74e0fd57, 0xcf8b32f0, 0x484f3e23, 0x911d3cda, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0xffffffb0, 0x00000000, 0x00000017, 0x00001b1c, 0x00000000, 0x00001c1b, 0x38000000, 0xffffffff, 0x0382586e, 0x17da7113, 0xe9c1faae, 0xcf8b32f0, 0x01c12c37, 0xfffffbd4, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xb251, 0x317d, 0xb2ae, 0x2093, 0xb04a, 0xb0b8, 0x1e16, 0x405a, 0xbfb8, 0xb0cf, 0x4099, 0x431e, 0x41e5, 0xbf70, 0xb0e1, 0xa18f, 0x1f25, 0xba65, 0x1d38, 0x1119, 0xba41, 0xb23a, 0x03ae, 0x01a6, 0x1dfc, 0x1e5c, 0x4181, 0xba71, 0x401c, 0x3c40, 0x4154, 0x1895, 0xbfd0, 0xbf7c, 0x1af1, 0x429c, 0x1148, 0x41b5, 0x432d, 0x43f4, 0x461b, 0x41d6, 0x1ef7, 0x1d2d, 0x41c8, 0x3021, 0xb25c, 0x431b, 0xa59d, 0x4355, 0xbae7, 0xbff0, 0xb2fa, 0x39aa, 0x0c26, 0x4144, 0x0954, 0x419b, 0x03a0, 0xbfd1, 0x45e9, 0x439a, 0x4127, 0xb23d, 0x4132, 0x1ae1, 0x4671, 0x4613, 0x45e2, 0xbac3, 0x421c, 0x1379, 0x1ea9, 0x16a8, 0x406d, 0x3d2b, 0x4267, 0xb205, 0x4042, 0x4232, 0x45e4, 0xb2ba, 0x1a6c, 0xb2a8, 0xb0fe, 0x2dc3, 0xb0d7, 0xbf4a, 0x407c, 0x40f2, 0xb21b, 0x0c04, 0x2884, 0x1b10, 0x42fb, 0x41b3, 0x0235, 0x2120, 0xb062, 0x438b, 0x444c, 0x43d0, 0x41d9, 0x1dc3, 0xb02b, 0x1b8e, 0x4231, 0xba4a, 0x4372, 0x42d1, 0xb246, 0x1cfa, 0x2420, 0x41ec, 0x41a2, 0x43cf, 0xbf6c, 0x0d46, 0xba57, 0x4266, 0xaca4, 0xb220, 0x33fb, 0xb2da, 0x40ac, 0x4207, 0xb2ca, 0x40fa, 0xb2ce, 0x2f83, 0x426d, 0x1f13, 0x42f0, 0x1902, 0x4374, 0x1fff, 0xa5f3, 0x40e8, 0x42ed, 0x43c6, 0x40de, 0x4244, 0x0f5d, 0x40f3, 0xbfb6, 0x36a3, 0x418e, 0xb0f3, 0x46c5, 0xbac8, 0x1cc6, 0x1495, 0x4121, 0xb286, 0x43d1, 0x431b, 0xad3e, 0xb240, 0xbaed, 0xba30, 0x41af, 0x400c, 0xb216, 0x08b2, 0x4426, 0x4321, 0xb28e, 0x439c, 0xbfa4, 0x2883, 0xba2e, 0x094c, 0x4382, 0x4118, 0x19a5, 0x05b0, 0x4000, 0x4064, 0x19b5, 0x435f, 0xb2e0, 0x4399, 0x1ec1, 0xb09a, 0x28c9, 0x0895, 0xba6b, 0x41c7, 0x4481, 0x42f6, 0x1dc4, 0xbfb8, 0xb249, 0xba32, 0xa293, 0xba7e, 0x40c7, 0x4369, 0x4211, 0x4198, 0x4294, 0x4256, 0x1be2, 0x1f8a, 0xb20f, 0x40c6, 0x409c, 0xbfd4, 0x4197, 0x42ab, 0x4149, 0x4284, 0x4610, 0xb2fd, 0x41f9, 0xb260, 0x427d, 0x18bf, 0x45f4, 0xa24d, 0xba4e, 0xba66, 0xb2dd, 0xbaed, 0xbf25, 0x1a95, 0x1d6a, 0xb2c6, 0x4005, 0x0738, 0x1930, 0xba7b, 0xb289, 0x14bb, 0x13be, 0x4368, 0x4005, 0xba63, 0x18f7, 0x078c, 0x464a, 0xbf84, 0x0f5a, 0x1e55, 0x4262, 0x26de, 0x4132, 0x421e, 0xb04b, 0x0632, 0xb2a5, 0x43a4, 0xb03d, 0x18a6, 0x41f7, 0xb2dc, 0xb226, 0xbf34, 0x4427, 0x4019, 0x4448, 0xbaeb, 0x43de, 0x42d8, 0x4345, 0x407f, 0x4691, 0x4245, 0x4200, 0x1c1d, 0x4130, 0xa717, 0x417e, 0x42eb, 0x3c1a, 0xa401, 0xbf24, 0x0fd2, 0x424e, 0xb26c, 0x4315, 0x4064, 0xb025, 0x4431, 0xb2d9, 0x0876, 0xb2df, 0x0bb1, 0xbf48, 0x259e, 0x3f2b, 0x38c9, 0x44fb, 0x4216, 0xb0ab, 0x4138, 0x4203, 0xbfab, 0xa3bb, 0xba73, 0x3abe, 0x4136, 0x4212, 0x129e, 0xbfb0, 0xbf67, 0xb2f7, 0xbafe, 0x4066, 0x4329, 0xb0dc, 0xb050, 0x42d8, 0xb05c, 0x421d, 0x43c2, 0x42c6, 0x2ed9, 0x4088, 0xbf7e, 0x43c3, 0xba22, 0x40b5, 0x18ed, 0x4064, 0xbfd1, 0xaf28, 0xb0d5, 0x03d5, 0xb2d3, 0x2eb3, 0x10a5, 0x4298, 0xba28, 0x1329, 0x3160, 0xb01f, 0xaea8, 0x41fa, 0xb24a, 0x44c4, 0x05f4, 0x1eaf, 0xba36, 0xbf60, 0x1f18, 0x2c2c, 0x408b, 0x3269, 0x436e, 0xb2c0, 0x1392, 0xbfa1, 0x4220, 0x41f7, 0xbacc, 0xbad9, 0x0d2a, 0xb0bb, 0x4175, 0xb20e, 0x4007, 0xb225, 0x4152, 0xbf62, 0xb0f3, 0x4127, 0x1e7d, 0x4615, 0x375f, 0x4545, 0x4064, 0x40ed, 0x4015, 0x4082, 0x404a, 0xb211, 0x4073, 0x41f6, 0x42ae, 0x409d, 0x4348, 0x068b, 0x1364, 0x42af, 0x45c6, 0x1fdc, 0x25a7, 0xb24c, 0xa940, 0x1cc5, 0x40d4, 0x4006, 0xbfca, 0x4352, 0xb288, 0x2129, 0x438b, 0xb2f9, 0xa900, 0x40a9, 0xbf03, 0x456d, 0x2efc, 0xbad4, 0x1f74, 0x4204, 0x421f, 0xba1f, 0x42a2, 0x404d, 0x2d74, 0x406b, 0x2fb9, 0x4334, 0xbfd6, 0x40c5, 0x4105, 0x42a6, 0xbf00, 0x4024, 0x406a, 0x43c7, 0x4456, 0xb26d, 0x4034, 0x4230, 0x0f59, 0x4065, 0x4037, 0x0ee0, 0xadf8, 0xbf7c, 0xb2e3, 0x43b7, 0x429c, 0x40e0, 0x4338, 0xba25, 0x424e, 0x005a, 0x400e, 0x407e, 0x43e8, 0xbf0d, 0x4270, 0x1dd0, 0x4021, 0x1eb2, 0x4381, 0xae1b, 0x4122, 0x0dc4, 0xba5e, 0xbf79, 0x46da, 0x1bb1, 0x1117, 0xb03a, 0xa9c5, 0xb0de, 0x1e18, 0x42c2, 0x4043, 0x42f9, 0x4151, 0x013b, 0xbf00, 0xbf76, 0xb2c1, 0x4263, 0x40fd, 0xb02f, 0x41e1, 0x4484, 0xbfd8, 0x27ae, 0xba27, 0x430f, 0x283f, 0x4331, 0xb254, 0x4183, 0x1f9f, 0x1a56, 0xb264, 0xbf70, 0x2af2, 0x4390, 0x032a, 0x4383, 0x31cd, 0x18b8, 0x32ac, 0x41de, 0x43b5, 0xb2a0, 0x434f, 0xbf68, 0x466f, 0x3cd0, 0x4398, 0xb2a7, 0x4225, 0xb204, 0x4445, 0x4446, 0xba17, 0x4102, 0x11e8, 0x1f7d, 0xbf29, 0x438c, 0xb242, 0xb23c, 0x4016, 0x41ee, 0xbf15, 0x0f9b, 0x2845, 0x431f, 0x4012, 0xa905, 0x43bd, 0x40a7, 0xb21c, 0xbfa0, 0xb218, 0x41fb, 0x21c7, 0x1e5c, 0x2eba, 0x26a0, 0xba1e, 0x42a2, 0xbf23, 0x1c9b, 0x3ddb, 0x1ade, 0x421e, 0xb2ae, 0xa855, 0xbacc, 0x4067, 0x4670, 0xb299, 0x4633, 0x4009, 0xbfe2, 0x4005, 0x37ee, 0xbfc0, 0x0bf7, 0x439b, 0x4099, 0x425a, 0x1ebc, 0x445b, 0x4373, 0xba1c, 0x41b7, 0xb2d8, 0xb2b6, 0xbf34, 0x4273, 0x4121, 0x435f, 0x4158, 0x4021, 0x4231, 0x0c75, 0x4369, 0x3a94, 0xb247, 0x43c7, 0x4556, 0x4186, 0xb22d, 0xb25c, 0x42f0, 0x31d2, 0xbf46, 0x4062, 0x2ee4, 0x0296, 0x41f3, 0x4173, 0x4295, 0xb2db, 0x1d70, 0xbf84, 0x29a9, 0x2a9d, 0x41a0, 0x400d, 0xbf80, 0xb2a8, 0x1d70, 0x430d, 0xb22b, 0x4299, 0x0a23, 0x402a, 0xb275, 0xbf8c, 0x4405, 0x41bc, 0x43dd, 0xbf80, 0xb258, 0x4231, 0x1842, 0xa26e, 0x1e27, 0xb2ad, 0xb064, 0x4057, 0x46a1, 0x43e5, 0x439b, 0x4011, 0x41ce, 0x194e, 0xba1f, 0xb004, 0xb26b, 0x43ff, 0xb253, 0x4287, 0x402a, 0x40b4, 0x3a6d, 0xbfd4, 0xba49, 0x4172, 0x4043, 0x1e30, 0xb24c, 0xbad8, 0x4061, 0x418f, 0x1940, 0x4180, 0xbf7d, 0x23b5, 0x42a2, 0x40f9, 0x1e06, 0xbf99, 0xba15, 0x4164, 0xbac4, 0xb246, 0xa06a, 0x1923, 0x4553, 0xba1e, 0xbfa0, 0xab04, 0x4290, 0x4298, 0x3dc9, 0x4031, 0x40f5, 0x43aa, 0x329f, 0x45ae, 0xb209, 0xb2cf, 0xbf9d, 0x4123, 0x400e, 0xbae6, 0xb0c4, 0x05a3, 0x4353, 0x4057, 0xb060, 0x424c, 0x4189, 0xb2ec, 0x401f, 0xb2be, 0x1e8c, 0x4656, 0xb05d, 0x0fb9, 0x4069, 0x42b0, 0xb21f, 0xb277, 0x43f0, 0x4071, 0x419c, 0x22b1, 0xb02f, 0xa8c1, 0xb2ae, 0xbf84, 0x2d2c, 0x1df6, 0x4617, 0xae87, 0xb20f, 0x06bb, 0x420e, 0x0ba4, 0x4440, 0x422d, 0x4207, 0xb0ac, 0x431e, 0x1829, 0xb23b, 0xb23a, 0x41ed, 0x4016, 0xb023, 0x19db, 0x4351, 0xb2b8, 0x4151, 0xbf73, 0x4607, 0xaa70, 0x465a, 0x4242, 0xba3e, 0xb27f, 0x43ce, 0x0c36, 0xa72f, 0xb29d, 0x415d, 0xbfb3, 0xb0a3, 0xb2da, 0x429d, 0xb2df, 0x408c, 0x445a, 0x43fc, 0x4022, 0x4262, 0x1782, 0x4424, 0x40ef, 0x39b4, 0x1cf4, 0xb22d, 0x41a7, 0xba1e, 0x40be, 0x40ac, 0x36a1, 0xbae3, 0xbfb1, 0xac8c, 0xb23c, 0x40ca, 0xb203, 0x1d66, 0x117b, 0xb2a0, 0xba12, 0x401b, 0xaafd, 0xbaed, 0x1f75, 0x1c02, 0x42b4, 0x1f7f, 0x1d3c, 0xbad4, 0xbf24, 0x020b, 0x4226, 0x425f, 0xb27e, 0x3ed4, 0xba40, 0x2724, 0x4006, 0x107b, 0x2d4b, 0x464d, 0xb215, 0x41b4, 0x4172, 0x42dd, 0xa957, 0xba2e, 0x3f84, 0x1fdb, 0x290d, 0x43e3, 0xbf99, 0xb231, 0x422c, 0x02c8, 0xbacb, 0x432c, 0x1b38, 0xa296, 0x424f, 0x4640, 0x4175, 0xbf5b, 0x436b, 0x428b, 0x40a1, 0x4629, 0x40cd, 0xbfa4, 0x097e, 0x42e0, 0x4566, 0x4063, 0x3ef3, 0x464e, 0xb25c, 0x04b0, 0x4272, 0x41b1, 0x422d, 0xb070, 0x4254, 0xb034, 0x40b5, 0xb2a4, 0x41f0, 0x3546, 0xbf36, 0x40be, 0xba51, 0x437e, 0xba32, 0xbf60, 0x04b2, 0x16eb, 0x4092, 0x444f, 0x4634, 0x405a, 0x420b, 0x4342, 0x46b0, 0x1e8d, 0x4206, 0xba4c, 0xba29, 0x45d9, 0x1cd4, 0xbf8f, 0x42e7, 0xb0c7, 0x047c, 0x1f41, 0x4132, 0x4125, 0x23aa, 0x26ae, 0x294f, 0xae1f, 0x408d, 0x1aaa, 0xb052, 0xb2d6, 0xb2bf, 0x437e, 0xaf3c, 0x42ab, 0x2fe4, 0xb0d7, 0xbfc0, 0x38cb, 0x428e, 0xb2c3, 0xb081, 0x429f, 0xb220, 0xbf03, 0x4018, 0x1e76, 0x4167, 0x14fc, 0x42a0, 0x4642, 0x4543, 0xba6d, 0x1e81, 0x42fa, 0xbaeb, 0xbae0, 0xbac6, 0x0364, 0x0be5, 0xb2f1, 0x456b, 0xb225, 0xb2ba, 0x426a, 0x4359, 0x40db, 0xbf05, 0x4255, 0x147a, 0x4072, 0x0e8c, 0x0c55, 0x4178, 0xb28d, 0x4272, 0xba3b, 0x38c8, 0x41af, 0x46b8, 0x4075, 0x435c, 0x1b06, 0xbaeb, 0x3f2b, 0x0271, 0x310e, 0x424e, 0x013d, 0x4038, 0x2416, 0x35e0, 0x428d, 0xb0b8, 0x424a, 0x4380, 0x43e2, 0xbf3e, 0x4115, 0xb079, 0x4134, 0x3588, 0x20b7, 0xaa55, 0x43d3, 0x1ff2, 0x1ce9, 0x420e, 0x1ba2, 0x4007, 0x4327, 0xb0f2, 0xb082, 0xbfd4, 0x4390, 0xb233, 0xb2b2, 0xaa54, 0xb2d9, 0x4142, 0x4065, 0x41a9, 0x43fc, 0x42c6, 0x0daa, 0xb29e, 0xa5ae, 0xb288, 0x4241, 0xb237, 0x4303, 0x189b, 0xbf1e, 0x0a78, 0xbace, 0x0a87, 0x4154, 0x31e7, 0xbf3b, 0xba28, 0x419c, 0xba17, 0x3f48, 0x3ef8, 0x42f1, 0x4104, 0x4605, 0x413c, 0x4558, 0xb22a, 0xb287, 0xba47, 0x33a1, 0x430d, 0x42aa, 0xbf32, 0xb270, 0x42b3, 0x4392, 0x0bbe, 0x43bf, 0x41fc, 0x19ee, 0x2639, 0x42ca, 0x4219, 0xb2ec, 0x4600, 0x436c, 0xb011, 0xbaea, 0xb218, 0x412a, 0x41d8, 0x2cb9, 0x41b7, 0x4001, 0x0d3f, 0x1bc5, 0xbf03, 0x42d0, 0x4091, 0x40bd, 0x1ecd, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xaf3cc1f1, 0x05fac305, 0x3db327e1, 0x36ea8c1c, 0x589f9f57, 0xa4ce47b1, 0x8ee4ab13, 0xd31f4de3, 0xa8944d30, 0xd6eab546, 0xbc8af831, 0x69b223cd, 0x24711ddc, 0x33c795e8, 0x00000000, 0x500001f0 }, - FinalRegs = new uint[] { 0x00059360, 0x00000060, 0x00000000, 0x00002c9b, 0x00003d09, 0x0000005d, 0x00000039, 0x00000fff, 0xa89457bc, 0xffffffdb, 0x69b23619, 0x69b23619, 0xcd056b3d, 0xa89454e4, 0x00000000, 0x200001d0 }, + Instructions = [0xb251, 0x317d, 0xb2ae, 0x2093, 0xb04a, 0xb0b8, 0x1e16, 0x405a, 0xbfb8, 0xb0cf, 0x4099, 0x431e, 0x41e5, 0xbf70, 0xb0e1, 0xa18f, 0x1f25, 0xba65, 0x1d38, 0x1119, 0xba41, 0xb23a, 0x03ae, 0x01a6, 0x1dfc, 0x1e5c, 0x4181, 0xba71, 0x401c, 0x3c40, 0x4154, 0x1895, 0xbfd0, 0xbf7c, 0x1af1, 0x429c, 0x1148, 0x41b5, 0x432d, 0x43f4, 0x461b, 0x41d6, 0x1ef7, 0x1d2d, 0x41c8, 0x3021, 0xb25c, 0x431b, 0xa59d, 0x4355, 0xbae7, 0xbff0, 0xb2fa, 0x39aa, 0x0c26, 0x4144, 0x0954, 0x419b, 0x03a0, 0xbfd1, 0x45e9, 0x439a, 0x4127, 0xb23d, 0x4132, 0x1ae1, 0x4671, 0x4613, 0x45e2, 0xbac3, 0x421c, 0x1379, 0x1ea9, 0x16a8, 0x406d, 0x3d2b, 0x4267, 0xb205, 0x4042, 0x4232, 0x45e4, 0xb2ba, 0x1a6c, 0xb2a8, 0xb0fe, 0x2dc3, 0xb0d7, 0xbf4a, 0x407c, 0x40f2, 0xb21b, 0x0c04, 0x2884, 0x1b10, 0x42fb, 0x41b3, 0x0235, 0x2120, 0xb062, 0x438b, 0x444c, 0x43d0, 0x41d9, 0x1dc3, 0xb02b, 0x1b8e, 0x4231, 0xba4a, 0x4372, 0x42d1, 0xb246, 0x1cfa, 0x2420, 0x41ec, 0x41a2, 0x43cf, 0xbf6c, 0x0d46, 0xba57, 0x4266, 0xaca4, 0xb220, 0x33fb, 0xb2da, 0x40ac, 0x4207, 0xb2ca, 0x40fa, 0xb2ce, 0x2f83, 0x426d, 0x1f13, 0x42f0, 0x1902, 0x4374, 0x1fff, 0xa5f3, 0x40e8, 0x42ed, 0x43c6, 0x40de, 0x4244, 0x0f5d, 0x40f3, 0xbfb6, 0x36a3, 0x418e, 0xb0f3, 0x46c5, 0xbac8, 0x1cc6, 0x1495, 0x4121, 0xb286, 0x43d1, 0x431b, 0xad3e, 0xb240, 0xbaed, 0xba30, 0x41af, 0x400c, 0xb216, 0x08b2, 0x4426, 0x4321, 0xb28e, 0x439c, 0xbfa4, 0x2883, 0xba2e, 0x094c, 0x4382, 0x4118, 0x19a5, 0x05b0, 0x4000, 0x4064, 0x19b5, 0x435f, 0xb2e0, 0x4399, 0x1ec1, 0xb09a, 0x28c9, 0x0895, 0xba6b, 0x41c7, 0x4481, 0x42f6, 0x1dc4, 0xbfb8, 0xb249, 0xba32, 0xa293, 0xba7e, 0x40c7, 0x4369, 0x4211, 0x4198, 0x4294, 0x4256, 0x1be2, 0x1f8a, 0xb20f, 0x40c6, 0x409c, 0xbfd4, 0x4197, 0x42ab, 0x4149, 0x4284, 0x4610, 0xb2fd, 0x41f9, 0xb260, 0x427d, 0x18bf, 0x45f4, 0xa24d, 0xba4e, 0xba66, 0xb2dd, 0xbaed, 0xbf25, 0x1a95, 0x1d6a, 0xb2c6, 0x4005, 0x0738, 0x1930, 0xba7b, 0xb289, 0x14bb, 0x13be, 0x4368, 0x4005, 0xba63, 0x18f7, 0x078c, 0x464a, 0xbf84, 0x0f5a, 0x1e55, 0x4262, 0x26de, 0x4132, 0x421e, 0xb04b, 0x0632, 0xb2a5, 0x43a4, 0xb03d, 0x18a6, 0x41f7, 0xb2dc, 0xb226, 0xbf34, 0x4427, 0x4019, 0x4448, 0xbaeb, 0x43de, 0x42d8, 0x4345, 0x407f, 0x4691, 0x4245, 0x4200, 0x1c1d, 0x4130, 0xa717, 0x417e, 0x42eb, 0x3c1a, 0xa401, 0xbf24, 0x0fd2, 0x424e, 0xb26c, 0x4315, 0x4064, 0xb025, 0x4431, 0xb2d9, 0x0876, 0xb2df, 0x0bb1, 0xbf48, 0x259e, 0x3f2b, 0x38c9, 0x44fb, 0x4216, 0xb0ab, 0x4138, 0x4203, 0xbfab, 0xa3bb, 0xba73, 0x3abe, 0x4136, 0x4212, 0x129e, 0xbfb0, 0xbf67, 0xb2f7, 0xbafe, 0x4066, 0x4329, 0xb0dc, 0xb050, 0x42d8, 0xb05c, 0x421d, 0x43c2, 0x42c6, 0x2ed9, 0x4088, 0xbf7e, 0x43c3, 0xba22, 0x40b5, 0x18ed, 0x4064, 0xbfd1, 0xaf28, 0xb0d5, 0x03d5, 0xb2d3, 0x2eb3, 0x10a5, 0x4298, 0xba28, 0x1329, 0x3160, 0xb01f, 0xaea8, 0x41fa, 0xb24a, 0x44c4, 0x05f4, 0x1eaf, 0xba36, 0xbf60, 0x1f18, 0x2c2c, 0x408b, 0x3269, 0x436e, 0xb2c0, 0x1392, 0xbfa1, 0x4220, 0x41f7, 0xbacc, 0xbad9, 0x0d2a, 0xb0bb, 0x4175, 0xb20e, 0x4007, 0xb225, 0x4152, 0xbf62, 0xb0f3, 0x4127, 0x1e7d, 0x4615, 0x375f, 0x4545, 0x4064, 0x40ed, 0x4015, 0x4082, 0x404a, 0xb211, 0x4073, 0x41f6, 0x42ae, 0x409d, 0x4348, 0x068b, 0x1364, 0x42af, 0x45c6, 0x1fdc, 0x25a7, 0xb24c, 0xa940, 0x1cc5, 0x40d4, 0x4006, 0xbfca, 0x4352, 0xb288, 0x2129, 0x438b, 0xb2f9, 0xa900, 0x40a9, 0xbf03, 0x456d, 0x2efc, 0xbad4, 0x1f74, 0x4204, 0x421f, 0xba1f, 0x42a2, 0x404d, 0x2d74, 0x406b, 0x2fb9, 0x4334, 0xbfd6, 0x40c5, 0x4105, 0x42a6, 0xbf00, 0x4024, 0x406a, 0x43c7, 0x4456, 0xb26d, 0x4034, 0x4230, 0x0f59, 0x4065, 0x4037, 0x0ee0, 0xadf8, 0xbf7c, 0xb2e3, 0x43b7, 0x429c, 0x40e0, 0x4338, 0xba25, 0x424e, 0x005a, 0x400e, 0x407e, 0x43e8, 0xbf0d, 0x4270, 0x1dd0, 0x4021, 0x1eb2, 0x4381, 0xae1b, 0x4122, 0x0dc4, 0xba5e, 0xbf79, 0x46da, 0x1bb1, 0x1117, 0xb03a, 0xa9c5, 0xb0de, 0x1e18, 0x42c2, 0x4043, 0x42f9, 0x4151, 0x013b, 0xbf00, 0xbf76, 0xb2c1, 0x4263, 0x40fd, 0xb02f, 0x41e1, 0x4484, 0xbfd8, 0x27ae, 0xba27, 0x430f, 0x283f, 0x4331, 0xb254, 0x4183, 0x1f9f, 0x1a56, 0xb264, 0xbf70, 0x2af2, 0x4390, 0x032a, 0x4383, 0x31cd, 0x18b8, 0x32ac, 0x41de, 0x43b5, 0xb2a0, 0x434f, 0xbf68, 0x466f, 0x3cd0, 0x4398, 0xb2a7, 0x4225, 0xb204, 0x4445, 0x4446, 0xba17, 0x4102, 0x11e8, 0x1f7d, 0xbf29, 0x438c, 0xb242, 0xb23c, 0x4016, 0x41ee, 0xbf15, 0x0f9b, 0x2845, 0x431f, 0x4012, 0xa905, 0x43bd, 0x40a7, 0xb21c, 0xbfa0, 0xb218, 0x41fb, 0x21c7, 0x1e5c, 0x2eba, 0x26a0, 0xba1e, 0x42a2, 0xbf23, 0x1c9b, 0x3ddb, 0x1ade, 0x421e, 0xb2ae, 0xa855, 0xbacc, 0x4067, 0x4670, 0xb299, 0x4633, 0x4009, 0xbfe2, 0x4005, 0x37ee, 0xbfc0, 0x0bf7, 0x439b, 0x4099, 0x425a, 0x1ebc, 0x445b, 0x4373, 0xba1c, 0x41b7, 0xb2d8, 0xb2b6, 0xbf34, 0x4273, 0x4121, 0x435f, 0x4158, 0x4021, 0x4231, 0x0c75, 0x4369, 0x3a94, 0xb247, 0x43c7, 0x4556, 0x4186, 0xb22d, 0xb25c, 0x42f0, 0x31d2, 0xbf46, 0x4062, 0x2ee4, 0x0296, 0x41f3, 0x4173, 0x4295, 0xb2db, 0x1d70, 0xbf84, 0x29a9, 0x2a9d, 0x41a0, 0x400d, 0xbf80, 0xb2a8, 0x1d70, 0x430d, 0xb22b, 0x4299, 0x0a23, 0x402a, 0xb275, 0xbf8c, 0x4405, 0x41bc, 0x43dd, 0xbf80, 0xb258, 0x4231, 0x1842, 0xa26e, 0x1e27, 0xb2ad, 0xb064, 0x4057, 0x46a1, 0x43e5, 0x439b, 0x4011, 0x41ce, 0x194e, 0xba1f, 0xb004, 0xb26b, 0x43ff, 0xb253, 0x4287, 0x402a, 0x40b4, 0x3a6d, 0xbfd4, 0xba49, 0x4172, 0x4043, 0x1e30, 0xb24c, 0xbad8, 0x4061, 0x418f, 0x1940, 0x4180, 0xbf7d, 0x23b5, 0x42a2, 0x40f9, 0x1e06, 0xbf99, 0xba15, 0x4164, 0xbac4, 0xb246, 0xa06a, 0x1923, 0x4553, 0xba1e, 0xbfa0, 0xab04, 0x4290, 0x4298, 0x3dc9, 0x4031, 0x40f5, 0x43aa, 0x329f, 0x45ae, 0xb209, 0xb2cf, 0xbf9d, 0x4123, 0x400e, 0xbae6, 0xb0c4, 0x05a3, 0x4353, 0x4057, 0xb060, 0x424c, 0x4189, 0xb2ec, 0x401f, 0xb2be, 0x1e8c, 0x4656, 0xb05d, 0x0fb9, 0x4069, 0x42b0, 0xb21f, 0xb277, 0x43f0, 0x4071, 0x419c, 0x22b1, 0xb02f, 0xa8c1, 0xb2ae, 0xbf84, 0x2d2c, 0x1df6, 0x4617, 0xae87, 0xb20f, 0x06bb, 0x420e, 0x0ba4, 0x4440, 0x422d, 0x4207, 0xb0ac, 0x431e, 0x1829, 0xb23b, 0xb23a, 0x41ed, 0x4016, 0xb023, 0x19db, 0x4351, 0xb2b8, 0x4151, 0xbf73, 0x4607, 0xaa70, 0x465a, 0x4242, 0xba3e, 0xb27f, 0x43ce, 0x0c36, 0xa72f, 0xb29d, 0x415d, 0xbfb3, 0xb0a3, 0xb2da, 0x429d, 0xb2df, 0x408c, 0x445a, 0x43fc, 0x4022, 0x4262, 0x1782, 0x4424, 0x40ef, 0x39b4, 0x1cf4, 0xb22d, 0x41a7, 0xba1e, 0x40be, 0x40ac, 0x36a1, 0xbae3, 0xbfb1, 0xac8c, 0xb23c, 0x40ca, 0xb203, 0x1d66, 0x117b, 0xb2a0, 0xba12, 0x401b, 0xaafd, 0xbaed, 0x1f75, 0x1c02, 0x42b4, 0x1f7f, 0x1d3c, 0xbad4, 0xbf24, 0x020b, 0x4226, 0x425f, 0xb27e, 0x3ed4, 0xba40, 0x2724, 0x4006, 0x107b, 0x2d4b, 0x464d, 0xb215, 0x41b4, 0x4172, 0x42dd, 0xa957, 0xba2e, 0x3f84, 0x1fdb, 0x290d, 0x43e3, 0xbf99, 0xb231, 0x422c, 0x02c8, 0xbacb, 0x432c, 0x1b38, 0xa296, 0x424f, 0x4640, 0x4175, 0xbf5b, 0x436b, 0x428b, 0x40a1, 0x4629, 0x40cd, 0xbfa4, 0x097e, 0x42e0, 0x4566, 0x4063, 0x3ef3, 0x464e, 0xb25c, 0x04b0, 0x4272, 0x41b1, 0x422d, 0xb070, 0x4254, 0xb034, 0x40b5, 0xb2a4, 0x41f0, 0x3546, 0xbf36, 0x40be, 0xba51, 0x437e, 0xba32, 0xbf60, 0x04b2, 0x16eb, 0x4092, 0x444f, 0x4634, 0x405a, 0x420b, 0x4342, 0x46b0, 0x1e8d, 0x4206, 0xba4c, 0xba29, 0x45d9, 0x1cd4, 0xbf8f, 0x42e7, 0xb0c7, 0x047c, 0x1f41, 0x4132, 0x4125, 0x23aa, 0x26ae, 0x294f, 0xae1f, 0x408d, 0x1aaa, 0xb052, 0xb2d6, 0xb2bf, 0x437e, 0xaf3c, 0x42ab, 0x2fe4, 0xb0d7, 0xbfc0, 0x38cb, 0x428e, 0xb2c3, 0xb081, 0x429f, 0xb220, 0xbf03, 0x4018, 0x1e76, 0x4167, 0x14fc, 0x42a0, 0x4642, 0x4543, 0xba6d, 0x1e81, 0x42fa, 0xbaeb, 0xbae0, 0xbac6, 0x0364, 0x0be5, 0xb2f1, 0x456b, 0xb225, 0xb2ba, 0x426a, 0x4359, 0x40db, 0xbf05, 0x4255, 0x147a, 0x4072, 0x0e8c, 0x0c55, 0x4178, 0xb28d, 0x4272, 0xba3b, 0x38c8, 0x41af, 0x46b8, 0x4075, 0x435c, 0x1b06, 0xbaeb, 0x3f2b, 0x0271, 0x310e, 0x424e, 0x013d, 0x4038, 0x2416, 0x35e0, 0x428d, 0xb0b8, 0x424a, 0x4380, 0x43e2, 0xbf3e, 0x4115, 0xb079, 0x4134, 0x3588, 0x20b7, 0xaa55, 0x43d3, 0x1ff2, 0x1ce9, 0x420e, 0x1ba2, 0x4007, 0x4327, 0xb0f2, 0xb082, 0xbfd4, 0x4390, 0xb233, 0xb2b2, 0xaa54, 0xb2d9, 0x4142, 0x4065, 0x41a9, 0x43fc, 0x42c6, 0x0daa, 0xb29e, 0xa5ae, 0xb288, 0x4241, 0xb237, 0x4303, 0x189b, 0xbf1e, 0x0a78, 0xbace, 0x0a87, 0x4154, 0x31e7, 0xbf3b, 0xba28, 0x419c, 0xba17, 0x3f48, 0x3ef8, 0x42f1, 0x4104, 0x4605, 0x413c, 0x4558, 0xb22a, 0xb287, 0xba47, 0x33a1, 0x430d, 0x42aa, 0xbf32, 0xb270, 0x42b3, 0x4392, 0x0bbe, 0x43bf, 0x41fc, 0x19ee, 0x2639, 0x42ca, 0x4219, 0xb2ec, 0x4600, 0x436c, 0xb011, 0xbaea, 0xb218, 0x412a, 0x41d8, 0x2cb9, 0x41b7, 0x4001, 0x0d3f, 0x1bc5, 0xbf03, 0x42d0, 0x4091, 0x40bd, 0x1ecd, 0x4770, 0xe7fe + ], + StartRegs = [0xaf3cc1f1, 0x05fac305, 0x3db327e1, 0x36ea8c1c, 0x589f9f57, 0xa4ce47b1, 0x8ee4ab13, 0xd31f4de3, 0xa8944d30, 0xd6eab546, 0xbc8af831, 0x69b223cd, 0x24711ddc, 0x33c795e8, 0x00000000, 0x500001f0 + ], + FinalRegs = [0x00059360, 0x00000060, 0x00000000, 0x00002c9b, 0x00003d09, 0x0000005d, 0x00000039, 0x00000fff, 0xa89457bc, 0xffffffdb, 0x69b23619, 0x69b23619, 0xcd056b3d, 0xa89454e4, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x2427, 0x3f90, 0x2091, 0x2633, 0x40e5, 0x429e, 0xb272, 0x4572, 0xbacb, 0x358e, 0xb054, 0x426b, 0xb2ad, 0x17b5, 0xbae7, 0x403b, 0xb2af, 0x199f, 0xa0e1, 0x148a, 0xb068, 0x40ac, 0x1c34, 0x41cd, 0x4387, 0xbfa8, 0x42c7, 0xa9ac, 0x2d10, 0xbae3, 0x419c, 0xba60, 0x004e, 0xb0c7, 0x18c0, 0x42fd, 0x4021, 0x4592, 0x4365, 0x4591, 0xba50, 0x4440, 0xa24c, 0x438b, 0x1aea, 0x404f, 0x4171, 0xbf8f, 0x27e3, 0x4170, 0xb024, 0x4156, 0xb2c5, 0x4361, 0x2b01, 0x42af, 0x43a7, 0x1c67, 0xb088, 0xaf29, 0xba76, 0x45a6, 0x1daf, 0x06d5, 0x40b0, 0x40d8, 0xba5c, 0x1cb8, 0x185a, 0xa518, 0x43ce, 0xbf76, 0x4378, 0x4216, 0x43cc, 0x3321, 0x40af, 0xbae8, 0x41a2, 0x40ac, 0x4602, 0xbf00, 0x1919, 0x40d8, 0x1df2, 0x1eac, 0xbf07, 0x18df, 0x41ea, 0xba54, 0x4211, 0x2835, 0xb230, 0x2c47, 0xb2aa, 0x4118, 0x4013, 0x4327, 0x3e32, 0xbfd0, 0x4351, 0x41ba, 0x40c9, 0x4174, 0x181a, 0x423a, 0xb2ad, 0x424d, 0x4296, 0x4232, 0xbaf5, 0xba6d, 0xb0ef, 0xbf48, 0xbafe, 0x428b, 0xba5f, 0x3c65, 0xba32, 0x0379, 0x3701, 0x40bb, 0xbae9, 0x4164, 0x42f8, 0x435a, 0x042a, 0xb2d2, 0x4159, 0x425d, 0x46cb, 0x1db3, 0x4463, 0x4299, 0xbf0c, 0x37c3, 0x0331, 0x19be, 0x406b, 0x41ad, 0xb22c, 0x43bc, 0x4195, 0x4351, 0x4227, 0xb097, 0x42b8, 0xb2a9, 0x408e, 0xb0c5, 0x411b, 0xbfcd, 0xb200, 0x4113, 0x40d2, 0x35f4, 0x1bb3, 0xbf97, 0x1d53, 0x41ad, 0x1c7d, 0xb283, 0x43c9, 0x419b, 0x4263, 0xb0a4, 0x1f68, 0xa4bb, 0x4005, 0xbac2, 0x3f7c, 0x2f53, 0x4192, 0xb05d, 0x03fb, 0x4619, 0xba2e, 0xb2ad, 0xb038, 0x0315, 0xbf1c, 0x43ba, 0xb0da, 0xbfb0, 0x1836, 0xb08d, 0xb066, 0xb0a2, 0x4132, 0x1883, 0x4688, 0xac7b, 0x35bc, 0x4016, 0x40b4, 0x40fe, 0x09dd, 0xb2b4, 0x41b9, 0x4331, 0x46d8, 0xbfd4, 0x1b67, 0x427f, 0x0d12, 0x4141, 0x3ca3, 0x1bf4, 0x406f, 0xbf04, 0x425f, 0xa73c, 0x1fd5, 0x441b, 0xb04a, 0x0fa5, 0xbf23, 0x4407, 0xbfb0, 0x24d0, 0xb073, 0x4283, 0xbf16, 0x061a, 0x41d7, 0x2266, 0x41ef, 0xb2ef, 0x4324, 0x40ba, 0x0c29, 0xb08c, 0x4160, 0x43e0, 0x439a, 0x3f33, 0xb03e, 0xb264, 0x4275, 0x45f2, 0x070e, 0x41b4, 0x43d4, 0x4127, 0x2d76, 0x0c90, 0x4207, 0xbf97, 0x4250, 0x4221, 0x4017, 0xbac8, 0xaf4c, 0xbac6, 0x1d9f, 0x4148, 0xa3e9, 0xa244, 0x4013, 0x1ffe, 0xbf6a, 0x4031, 0x41d6, 0xaa58, 0x40cc, 0x328a, 0x437e, 0xb06f, 0xbaeb, 0xbf15, 0x4106, 0x06a9, 0x41fd, 0x0967, 0x3300, 0x22da, 0x41c8, 0x45d4, 0x4030, 0xba6e, 0xb042, 0x1fc5, 0xba63, 0xa4e4, 0x2c03, 0xbfa0, 0x3858, 0xb2c5, 0xb0d9, 0x4067, 0x42c8, 0x4225, 0x0778, 0xbf07, 0x42a6, 0xb273, 0x4048, 0x42a1, 0x1125, 0x41ea, 0x051b, 0x19e4, 0x42c7, 0x09cd, 0x1a48, 0x0be5, 0xb271, 0xbf9e, 0x4167, 0x4471, 0xb2ed, 0x4058, 0x423d, 0x219d, 0x43bc, 0x1bbb, 0x22c4, 0x1e06, 0x4153, 0xb267, 0x2bde, 0x1d6b, 0x40db, 0x41cf, 0x437e, 0xba1a, 0x166c, 0xb068, 0xb23a, 0xbf77, 0xb238, 0x1fde, 0x4335, 0x4640, 0x409e, 0x42b4, 0x434f, 0xbad5, 0x2036, 0x4314, 0xb2e2, 0xb2fa, 0xb020, 0x41f7, 0xba26, 0xb002, 0x1200, 0x4326, 0x32db, 0x156e, 0xb2e7, 0x424f, 0x4079, 0xbfab, 0x3d18, 0x447a, 0x10c9, 0x454b, 0xa020, 0xbf70, 0xbfa9, 0x4336, 0x3cc4, 0x2dc9, 0x423d, 0x46ab, 0x4150, 0x1847, 0x40ec, 0x0a6d, 0xbf19, 0x36e4, 0x436a, 0x436c, 0x1efc, 0x4200, 0xbfc5, 0xa281, 0xbac7, 0xb0e5, 0x41bf, 0x4119, 0x13e8, 0x4142, 0x43e0, 0x40bd, 0x0769, 0x41d6, 0xa91c, 0xb2db, 0x4078, 0x41e3, 0x40e5, 0x1b36, 0xb247, 0x42cb, 0xbf75, 0x4175, 0x4258, 0x4276, 0x4572, 0x4237, 0x1eac, 0xb2ca, 0x4171, 0x40b8, 0x42d1, 0x4293, 0x41bd, 0xbfe0, 0x34d8, 0x4024, 0x4128, 0xa7bb, 0x43c5, 0x4342, 0x42a0, 0x0306, 0x42cb, 0x4082, 0xbf70, 0x0fa2, 0x43ef, 0x45d6, 0x4300, 0xbf94, 0x077c, 0xbaf3, 0xa980, 0x33d4, 0x3b98, 0x18ab, 0x435f, 0x4310, 0xb0a1, 0x40e1, 0x149a, 0xaab9, 0x422a, 0xb2df, 0xbf80, 0x4592, 0x086f, 0x337d, 0x1dd5, 0x09b8, 0x197f, 0x45a0, 0x422d, 0xb084, 0xbf19, 0xbaf5, 0x04e9, 0xba29, 0x194a, 0x1a57, 0x32bd, 0xa80e, 0xb2c8, 0x3542, 0x2086, 0x422c, 0xba36, 0x46ab, 0x14bc, 0x20b4, 0x402f, 0x40ff, 0x46e1, 0x40a0, 0x43fc, 0x41ce, 0xbf4f, 0xb26f, 0x415b, 0x1523, 0x061f, 0xb090, 0x06ec, 0xb2eb, 0xb292, 0x426f, 0x42db, 0x167a, 0x43a3, 0x424f, 0xb247, 0x1b40, 0x1e25, 0x4087, 0xbad4, 0x431f, 0x435d, 0x006f, 0xbfb1, 0x40b3, 0x39d4, 0x4291, 0x165f, 0x42b8, 0x4200, 0x42aa, 0x43f5, 0x154e, 0xa5de, 0xba50, 0x3da7, 0x0d4e, 0xa9bf, 0xba1c, 0x402b, 0x418c, 0x4360, 0xb056, 0x3ef6, 0xbfcd, 0x4038, 0x1a87, 0x2473, 0x4317, 0x4285, 0x40c7, 0x40f6, 0xbf8b, 0x4077, 0x431a, 0x05ad, 0xba42, 0x4040, 0x16d8, 0x1913, 0xb265, 0x4436, 0x4102, 0x40fd, 0xa3f4, 0xba27, 0x4109, 0x40b2, 0xb035, 0x437e, 0xbf84, 0xba37, 0x189e, 0x0bee, 0xba76, 0xb2d0, 0xb204, 0xa150, 0x41a7, 0x41bb, 0xb295, 0x33f3, 0xbf80, 0x2f8a, 0x459b, 0xabe4, 0x11a0, 0x426b, 0xba78, 0xb272, 0x3718, 0x43c8, 0xbfb7, 0xb224, 0x1ec8, 0x06d7, 0x4327, 0x273c, 0xb2fe, 0x4294, 0x179f, 0x42a5, 0x4131, 0x43f0, 0xb25d, 0x4298, 0x42b2, 0x40b1, 0xbff0, 0x0bbe, 0xbf22, 0x2944, 0x4147, 0x0969, 0x433c, 0x1b91, 0x419b, 0xa0b4, 0x429a, 0xaa98, 0xa7ae, 0xbfad, 0x430e, 0xb2b8, 0x40dc, 0x403f, 0x19b8, 0x41f4, 0x1da0, 0x406c, 0x40aa, 0x1e72, 0xbfc0, 0x41e6, 0x43a2, 0x40d6, 0x1a1a, 0x191d, 0x1b1b, 0x2f8f, 0xb0d0, 0x1ce2, 0x4375, 0xb04b, 0xba0c, 0x4146, 0x4305, 0x40b4, 0xbf1b, 0x42d1, 0xb2ae, 0x4347, 0xb22e, 0x42ad, 0x41df, 0x1d6d, 0xb2b8, 0x409b, 0x38ce, 0xba78, 0x2add, 0x4377, 0x3fea, 0x42d5, 0xb2a0, 0xac6f, 0x3f00, 0x42e0, 0x42e4, 0x121d, 0x411a, 0xba59, 0x43b2, 0xb069, 0x4310, 0xb297, 0xbf88, 0x41ac, 0xb033, 0x1884, 0xb030, 0x42fa, 0x2a9b, 0x419a, 0xb270, 0x014f, 0x4100, 0x414a, 0x42b2, 0xb264, 0x43a7, 0x2e7d, 0x417d, 0x30eb, 0x4367, 0x429d, 0x3747, 0x3eda, 0x3129, 0xbfb4, 0x1f57, 0x0b56, 0x4039, 0xb26f, 0x462f, 0xb26f, 0x4181, 0x445f, 0x46c3, 0xb033, 0xbfb0, 0xb201, 0x422b, 0x4017, 0x431d, 0x4274, 0x40b4, 0x4481, 0x44a2, 0xaeb3, 0x42ad, 0x41ec, 0x40f8, 0xb2a7, 0x294e, 0xbf64, 0x41b6, 0xbac6, 0x423e, 0xb0b6, 0xba73, 0x45cc, 0x1d55, 0xb2f8, 0x3cee, 0x187b, 0x0e9e, 0x41b7, 0x42ce, 0xa773, 0xb2d4, 0x18dc, 0x207b, 0x4050, 0x4198, 0x3ee7, 0x40ea, 0xb243, 0x18a8, 0xbfe2, 0xba17, 0xbf00, 0x2883, 0xb06f, 0x40ce, 0x42fc, 0xba28, 0x4201, 0x1c4e, 0xbf80, 0xbf19, 0xae7d, 0x406a, 0x0bf7, 0xb0a2, 0xbf70, 0x4683, 0x4319, 0xbad2, 0xa731, 0x43ae, 0xba75, 0x426d, 0x2679, 0x2eeb, 0x149d, 0x45c5, 0x2848, 0xb229, 0xada6, 0x3a2c, 0x4002, 0x4098, 0xbf58, 0x4004, 0x43dc, 0x4585, 0x28bf, 0x4291, 0x4025, 0xba3d, 0xb242, 0x310b, 0xba76, 0xb2da, 0x4275, 0x41a4, 0x44b2, 0xb283, 0xb251, 0x3af7, 0x4188, 0x424d, 0xbf47, 0x38f5, 0x4602, 0x402d, 0x15f2, 0xb0e8, 0x4364, 0x2c36, 0x14be, 0x40a0, 0xbf4b, 0x40c8, 0x4150, 0x3428, 0x3375, 0xa475, 0x43c8, 0x4129, 0xbf00, 0x40de, 0x415d, 0x4235, 0x43fb, 0xb0f8, 0x4120, 0xbad0, 0x43b6, 0x4220, 0xb0d3, 0xba72, 0x0b42, 0xbf00, 0x421d, 0xb2d2, 0x0ccc, 0xb2ee, 0x2fb3, 0xaa42, 0xb0b1, 0xbf54, 0x4182, 0x40ce, 0x1fc6, 0xb291, 0x133c, 0x40ac, 0x405f, 0xbfca, 0xac9d, 0x4024, 0x0355, 0x43d6, 0x46b4, 0xb254, 0x1e21, 0x1824, 0x41f8, 0xbf56, 0xb0f4, 0x4396, 0x3777, 0xb01f, 0x42a3, 0xb2c6, 0x41ef, 0x0db1, 0xb0fb, 0xba3f, 0xa7bf, 0x4217, 0x0bf8, 0x4327, 0x4368, 0xbfc0, 0x42e1, 0xb0fe, 0xba62, 0x427f, 0xbf80, 0x3777, 0xb2f7, 0xbf16, 0x42a0, 0xaa78, 0x42d0, 0x41d5, 0xa44e, 0xbadd, 0xb0be, 0xb2e0, 0xba54, 0x4121, 0xbfd0, 0x2647, 0x4574, 0xba1c, 0x20a2, 0x1ae6, 0x2e30, 0x43e5, 0xb27d, 0xb0ee, 0x4053, 0xb2b6, 0x1c72, 0xbf70, 0x1562, 0xbfa9, 0x1f12, 0x4198, 0x4297, 0xb09b, 0x440e, 0x1eb9, 0x2ec0, 0xbfa4, 0x1c9d, 0xba34, 0x428e, 0x22cb, 0x4313, 0xb29f, 0x418d, 0xb27b, 0x4664, 0x1daa, 0xba05, 0xb230, 0xbf07, 0x314a, 0x42c9, 0x03a2, 0x4198, 0x1c5f, 0xb0aa, 0xb078, 0x404d, 0xb2b7, 0x4204, 0x4378, 0xbf09, 0xbfe0, 0x4307, 0x41fa, 0xba3f, 0xba74, 0xb042, 0x0f95, 0xb251, 0x44d8, 0x0fa5, 0x42a6, 0x0927, 0x1e0f, 0xbfd9, 0xb0ac, 0xa99d, 0x3a4b, 0x3435, 0x4154, 0x4046, 0xb231, 0xb201, 0x19c1, 0x418b, 0x0d1a, 0x4000, 0xb032, 0xbfc1, 0xb257, 0x2c04, 0xb029, 0xba42, 0x42ab, 0x2783, 0x1c91, 0x2f6d, 0x40cb, 0x1ac3, 0x4093, 0x45da, 0x434d, 0x4429, 0xbf55, 0x419c, 0x41c1, 0x43f2, 0x3a64, 0x4041, 0x183f, 0x4103, 0x4057, 0x41ec, 0x4268, 0x20b0, 0xb294, 0xba16, 0xb238, 0xbf0a, 0x4622, 0x432e, 0x3ed4, 0x46a2, 0xb239, 0xb2ca, 0xb2bb, 0xbfa3, 0x41fb, 0x400b, 0x42f9, 0x4296, 0xb215, 0x11b5, 0xb292, 0xbfcb, 0xab70, 0x4088, 0x18fc, 0x40fa, 0x31cf, 0x44c0, 0x1a3e, 0x20a8, 0x36f0, 0x421a, 0x4547, 0x4101, 0xb259, 0x4094, 0xa222, 0x1d0f, 0xbfc0, 0x0582, 0xb080, 0xb214, 0x4605, 0x407d, 0x1a4a, 0x400d, 0x4168, 0xb091, 0x1ef9, 0x424b, 0xba65, 0xbfc3, 0x4033, 0x4258, 0xb043, 0x4095, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x9f18068a, 0x03643f9c, 0x4d4c0930, 0xb5ba15e8, 0xff9da78d, 0x8731d796, 0x094b9e5e, 0x291d98f7, 0x1392fdc3, 0x4fe11ddf, 0x2f0cc7b5, 0x2d5bda6f, 0x2d85b32d, 0x081e2031, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0xffffffa0, 0xffffff96, 0x00000000, 0x00000060, 0x00000000, 0x00000000, 0x000000f0, 0xffffff99, 0x2fc23bbc, 0x2d85b418, 0x0000d42f, 0xc7ffffff, 0xf7e1d472, 0x081e259d, 0x00000000, 0x000001d0 }, + Instructions = [0x2427, 0x3f90, 0x2091, 0x2633, 0x40e5, 0x429e, 0xb272, 0x4572, 0xbacb, 0x358e, 0xb054, 0x426b, 0xb2ad, 0x17b5, 0xbae7, 0x403b, 0xb2af, 0x199f, 0xa0e1, 0x148a, 0xb068, 0x40ac, 0x1c34, 0x41cd, 0x4387, 0xbfa8, 0x42c7, 0xa9ac, 0x2d10, 0xbae3, 0x419c, 0xba60, 0x004e, 0xb0c7, 0x18c0, 0x42fd, 0x4021, 0x4592, 0x4365, 0x4591, 0xba50, 0x4440, 0xa24c, 0x438b, 0x1aea, 0x404f, 0x4171, 0xbf8f, 0x27e3, 0x4170, 0xb024, 0x4156, 0xb2c5, 0x4361, 0x2b01, 0x42af, 0x43a7, 0x1c67, 0xb088, 0xaf29, 0xba76, 0x45a6, 0x1daf, 0x06d5, 0x40b0, 0x40d8, 0xba5c, 0x1cb8, 0x185a, 0xa518, 0x43ce, 0xbf76, 0x4378, 0x4216, 0x43cc, 0x3321, 0x40af, 0xbae8, 0x41a2, 0x40ac, 0x4602, 0xbf00, 0x1919, 0x40d8, 0x1df2, 0x1eac, 0xbf07, 0x18df, 0x41ea, 0xba54, 0x4211, 0x2835, 0xb230, 0x2c47, 0xb2aa, 0x4118, 0x4013, 0x4327, 0x3e32, 0xbfd0, 0x4351, 0x41ba, 0x40c9, 0x4174, 0x181a, 0x423a, 0xb2ad, 0x424d, 0x4296, 0x4232, 0xbaf5, 0xba6d, 0xb0ef, 0xbf48, 0xbafe, 0x428b, 0xba5f, 0x3c65, 0xba32, 0x0379, 0x3701, 0x40bb, 0xbae9, 0x4164, 0x42f8, 0x435a, 0x042a, 0xb2d2, 0x4159, 0x425d, 0x46cb, 0x1db3, 0x4463, 0x4299, 0xbf0c, 0x37c3, 0x0331, 0x19be, 0x406b, 0x41ad, 0xb22c, 0x43bc, 0x4195, 0x4351, 0x4227, 0xb097, 0x42b8, 0xb2a9, 0x408e, 0xb0c5, 0x411b, 0xbfcd, 0xb200, 0x4113, 0x40d2, 0x35f4, 0x1bb3, 0xbf97, 0x1d53, 0x41ad, 0x1c7d, 0xb283, 0x43c9, 0x419b, 0x4263, 0xb0a4, 0x1f68, 0xa4bb, 0x4005, 0xbac2, 0x3f7c, 0x2f53, 0x4192, 0xb05d, 0x03fb, 0x4619, 0xba2e, 0xb2ad, 0xb038, 0x0315, 0xbf1c, 0x43ba, 0xb0da, 0xbfb0, 0x1836, 0xb08d, 0xb066, 0xb0a2, 0x4132, 0x1883, 0x4688, 0xac7b, 0x35bc, 0x4016, 0x40b4, 0x40fe, 0x09dd, 0xb2b4, 0x41b9, 0x4331, 0x46d8, 0xbfd4, 0x1b67, 0x427f, 0x0d12, 0x4141, 0x3ca3, 0x1bf4, 0x406f, 0xbf04, 0x425f, 0xa73c, 0x1fd5, 0x441b, 0xb04a, 0x0fa5, 0xbf23, 0x4407, 0xbfb0, 0x24d0, 0xb073, 0x4283, 0xbf16, 0x061a, 0x41d7, 0x2266, 0x41ef, 0xb2ef, 0x4324, 0x40ba, 0x0c29, 0xb08c, 0x4160, 0x43e0, 0x439a, 0x3f33, 0xb03e, 0xb264, 0x4275, 0x45f2, 0x070e, 0x41b4, 0x43d4, 0x4127, 0x2d76, 0x0c90, 0x4207, 0xbf97, 0x4250, 0x4221, 0x4017, 0xbac8, 0xaf4c, 0xbac6, 0x1d9f, 0x4148, 0xa3e9, 0xa244, 0x4013, 0x1ffe, 0xbf6a, 0x4031, 0x41d6, 0xaa58, 0x40cc, 0x328a, 0x437e, 0xb06f, 0xbaeb, 0xbf15, 0x4106, 0x06a9, 0x41fd, 0x0967, 0x3300, 0x22da, 0x41c8, 0x45d4, 0x4030, 0xba6e, 0xb042, 0x1fc5, 0xba63, 0xa4e4, 0x2c03, 0xbfa0, 0x3858, 0xb2c5, 0xb0d9, 0x4067, 0x42c8, 0x4225, 0x0778, 0xbf07, 0x42a6, 0xb273, 0x4048, 0x42a1, 0x1125, 0x41ea, 0x051b, 0x19e4, 0x42c7, 0x09cd, 0x1a48, 0x0be5, 0xb271, 0xbf9e, 0x4167, 0x4471, 0xb2ed, 0x4058, 0x423d, 0x219d, 0x43bc, 0x1bbb, 0x22c4, 0x1e06, 0x4153, 0xb267, 0x2bde, 0x1d6b, 0x40db, 0x41cf, 0x437e, 0xba1a, 0x166c, 0xb068, 0xb23a, 0xbf77, 0xb238, 0x1fde, 0x4335, 0x4640, 0x409e, 0x42b4, 0x434f, 0xbad5, 0x2036, 0x4314, 0xb2e2, 0xb2fa, 0xb020, 0x41f7, 0xba26, 0xb002, 0x1200, 0x4326, 0x32db, 0x156e, 0xb2e7, 0x424f, 0x4079, 0xbfab, 0x3d18, 0x447a, 0x10c9, 0x454b, 0xa020, 0xbf70, 0xbfa9, 0x4336, 0x3cc4, 0x2dc9, 0x423d, 0x46ab, 0x4150, 0x1847, 0x40ec, 0x0a6d, 0xbf19, 0x36e4, 0x436a, 0x436c, 0x1efc, 0x4200, 0xbfc5, 0xa281, 0xbac7, 0xb0e5, 0x41bf, 0x4119, 0x13e8, 0x4142, 0x43e0, 0x40bd, 0x0769, 0x41d6, 0xa91c, 0xb2db, 0x4078, 0x41e3, 0x40e5, 0x1b36, 0xb247, 0x42cb, 0xbf75, 0x4175, 0x4258, 0x4276, 0x4572, 0x4237, 0x1eac, 0xb2ca, 0x4171, 0x40b8, 0x42d1, 0x4293, 0x41bd, 0xbfe0, 0x34d8, 0x4024, 0x4128, 0xa7bb, 0x43c5, 0x4342, 0x42a0, 0x0306, 0x42cb, 0x4082, 0xbf70, 0x0fa2, 0x43ef, 0x45d6, 0x4300, 0xbf94, 0x077c, 0xbaf3, 0xa980, 0x33d4, 0x3b98, 0x18ab, 0x435f, 0x4310, 0xb0a1, 0x40e1, 0x149a, 0xaab9, 0x422a, 0xb2df, 0xbf80, 0x4592, 0x086f, 0x337d, 0x1dd5, 0x09b8, 0x197f, 0x45a0, 0x422d, 0xb084, 0xbf19, 0xbaf5, 0x04e9, 0xba29, 0x194a, 0x1a57, 0x32bd, 0xa80e, 0xb2c8, 0x3542, 0x2086, 0x422c, 0xba36, 0x46ab, 0x14bc, 0x20b4, 0x402f, 0x40ff, 0x46e1, 0x40a0, 0x43fc, 0x41ce, 0xbf4f, 0xb26f, 0x415b, 0x1523, 0x061f, 0xb090, 0x06ec, 0xb2eb, 0xb292, 0x426f, 0x42db, 0x167a, 0x43a3, 0x424f, 0xb247, 0x1b40, 0x1e25, 0x4087, 0xbad4, 0x431f, 0x435d, 0x006f, 0xbfb1, 0x40b3, 0x39d4, 0x4291, 0x165f, 0x42b8, 0x4200, 0x42aa, 0x43f5, 0x154e, 0xa5de, 0xba50, 0x3da7, 0x0d4e, 0xa9bf, 0xba1c, 0x402b, 0x418c, 0x4360, 0xb056, 0x3ef6, 0xbfcd, 0x4038, 0x1a87, 0x2473, 0x4317, 0x4285, 0x40c7, 0x40f6, 0xbf8b, 0x4077, 0x431a, 0x05ad, 0xba42, 0x4040, 0x16d8, 0x1913, 0xb265, 0x4436, 0x4102, 0x40fd, 0xa3f4, 0xba27, 0x4109, 0x40b2, 0xb035, 0x437e, 0xbf84, 0xba37, 0x189e, 0x0bee, 0xba76, 0xb2d0, 0xb204, 0xa150, 0x41a7, 0x41bb, 0xb295, 0x33f3, 0xbf80, 0x2f8a, 0x459b, 0xabe4, 0x11a0, 0x426b, 0xba78, 0xb272, 0x3718, 0x43c8, 0xbfb7, 0xb224, 0x1ec8, 0x06d7, 0x4327, 0x273c, 0xb2fe, 0x4294, 0x179f, 0x42a5, 0x4131, 0x43f0, 0xb25d, 0x4298, 0x42b2, 0x40b1, 0xbff0, 0x0bbe, 0xbf22, 0x2944, 0x4147, 0x0969, 0x433c, 0x1b91, 0x419b, 0xa0b4, 0x429a, 0xaa98, 0xa7ae, 0xbfad, 0x430e, 0xb2b8, 0x40dc, 0x403f, 0x19b8, 0x41f4, 0x1da0, 0x406c, 0x40aa, 0x1e72, 0xbfc0, 0x41e6, 0x43a2, 0x40d6, 0x1a1a, 0x191d, 0x1b1b, 0x2f8f, 0xb0d0, 0x1ce2, 0x4375, 0xb04b, 0xba0c, 0x4146, 0x4305, 0x40b4, 0xbf1b, 0x42d1, 0xb2ae, 0x4347, 0xb22e, 0x42ad, 0x41df, 0x1d6d, 0xb2b8, 0x409b, 0x38ce, 0xba78, 0x2add, 0x4377, 0x3fea, 0x42d5, 0xb2a0, 0xac6f, 0x3f00, 0x42e0, 0x42e4, 0x121d, 0x411a, 0xba59, 0x43b2, 0xb069, 0x4310, 0xb297, 0xbf88, 0x41ac, 0xb033, 0x1884, 0xb030, 0x42fa, 0x2a9b, 0x419a, 0xb270, 0x014f, 0x4100, 0x414a, 0x42b2, 0xb264, 0x43a7, 0x2e7d, 0x417d, 0x30eb, 0x4367, 0x429d, 0x3747, 0x3eda, 0x3129, 0xbfb4, 0x1f57, 0x0b56, 0x4039, 0xb26f, 0x462f, 0xb26f, 0x4181, 0x445f, 0x46c3, 0xb033, 0xbfb0, 0xb201, 0x422b, 0x4017, 0x431d, 0x4274, 0x40b4, 0x4481, 0x44a2, 0xaeb3, 0x42ad, 0x41ec, 0x40f8, 0xb2a7, 0x294e, 0xbf64, 0x41b6, 0xbac6, 0x423e, 0xb0b6, 0xba73, 0x45cc, 0x1d55, 0xb2f8, 0x3cee, 0x187b, 0x0e9e, 0x41b7, 0x42ce, 0xa773, 0xb2d4, 0x18dc, 0x207b, 0x4050, 0x4198, 0x3ee7, 0x40ea, 0xb243, 0x18a8, 0xbfe2, 0xba17, 0xbf00, 0x2883, 0xb06f, 0x40ce, 0x42fc, 0xba28, 0x4201, 0x1c4e, 0xbf80, 0xbf19, 0xae7d, 0x406a, 0x0bf7, 0xb0a2, 0xbf70, 0x4683, 0x4319, 0xbad2, 0xa731, 0x43ae, 0xba75, 0x426d, 0x2679, 0x2eeb, 0x149d, 0x45c5, 0x2848, 0xb229, 0xada6, 0x3a2c, 0x4002, 0x4098, 0xbf58, 0x4004, 0x43dc, 0x4585, 0x28bf, 0x4291, 0x4025, 0xba3d, 0xb242, 0x310b, 0xba76, 0xb2da, 0x4275, 0x41a4, 0x44b2, 0xb283, 0xb251, 0x3af7, 0x4188, 0x424d, 0xbf47, 0x38f5, 0x4602, 0x402d, 0x15f2, 0xb0e8, 0x4364, 0x2c36, 0x14be, 0x40a0, 0xbf4b, 0x40c8, 0x4150, 0x3428, 0x3375, 0xa475, 0x43c8, 0x4129, 0xbf00, 0x40de, 0x415d, 0x4235, 0x43fb, 0xb0f8, 0x4120, 0xbad0, 0x43b6, 0x4220, 0xb0d3, 0xba72, 0x0b42, 0xbf00, 0x421d, 0xb2d2, 0x0ccc, 0xb2ee, 0x2fb3, 0xaa42, 0xb0b1, 0xbf54, 0x4182, 0x40ce, 0x1fc6, 0xb291, 0x133c, 0x40ac, 0x405f, 0xbfca, 0xac9d, 0x4024, 0x0355, 0x43d6, 0x46b4, 0xb254, 0x1e21, 0x1824, 0x41f8, 0xbf56, 0xb0f4, 0x4396, 0x3777, 0xb01f, 0x42a3, 0xb2c6, 0x41ef, 0x0db1, 0xb0fb, 0xba3f, 0xa7bf, 0x4217, 0x0bf8, 0x4327, 0x4368, 0xbfc0, 0x42e1, 0xb0fe, 0xba62, 0x427f, 0xbf80, 0x3777, 0xb2f7, 0xbf16, 0x42a0, 0xaa78, 0x42d0, 0x41d5, 0xa44e, 0xbadd, 0xb0be, 0xb2e0, 0xba54, 0x4121, 0xbfd0, 0x2647, 0x4574, 0xba1c, 0x20a2, 0x1ae6, 0x2e30, 0x43e5, 0xb27d, 0xb0ee, 0x4053, 0xb2b6, 0x1c72, 0xbf70, 0x1562, 0xbfa9, 0x1f12, 0x4198, 0x4297, 0xb09b, 0x440e, 0x1eb9, 0x2ec0, 0xbfa4, 0x1c9d, 0xba34, 0x428e, 0x22cb, 0x4313, 0xb29f, 0x418d, 0xb27b, 0x4664, 0x1daa, 0xba05, 0xb230, 0xbf07, 0x314a, 0x42c9, 0x03a2, 0x4198, 0x1c5f, 0xb0aa, 0xb078, 0x404d, 0xb2b7, 0x4204, 0x4378, 0xbf09, 0xbfe0, 0x4307, 0x41fa, 0xba3f, 0xba74, 0xb042, 0x0f95, 0xb251, 0x44d8, 0x0fa5, 0x42a6, 0x0927, 0x1e0f, 0xbfd9, 0xb0ac, 0xa99d, 0x3a4b, 0x3435, 0x4154, 0x4046, 0xb231, 0xb201, 0x19c1, 0x418b, 0x0d1a, 0x4000, 0xb032, 0xbfc1, 0xb257, 0x2c04, 0xb029, 0xba42, 0x42ab, 0x2783, 0x1c91, 0x2f6d, 0x40cb, 0x1ac3, 0x4093, 0x45da, 0x434d, 0x4429, 0xbf55, 0x419c, 0x41c1, 0x43f2, 0x3a64, 0x4041, 0x183f, 0x4103, 0x4057, 0x41ec, 0x4268, 0x20b0, 0xb294, 0xba16, 0xb238, 0xbf0a, 0x4622, 0x432e, 0x3ed4, 0x46a2, 0xb239, 0xb2ca, 0xb2bb, 0xbfa3, 0x41fb, 0x400b, 0x42f9, 0x4296, 0xb215, 0x11b5, 0xb292, 0xbfcb, 0xab70, 0x4088, 0x18fc, 0x40fa, 0x31cf, 0x44c0, 0x1a3e, 0x20a8, 0x36f0, 0x421a, 0x4547, 0x4101, 0xb259, 0x4094, 0xa222, 0x1d0f, 0xbfc0, 0x0582, 0xb080, 0xb214, 0x4605, 0x407d, 0x1a4a, 0x400d, 0x4168, 0xb091, 0x1ef9, 0x424b, 0xba65, 0xbfc3, 0x4033, 0x4258, 0xb043, 0x4095, 0x4770, 0xe7fe + ], + StartRegs = [0x9f18068a, 0x03643f9c, 0x4d4c0930, 0xb5ba15e8, 0xff9da78d, 0x8731d796, 0x094b9e5e, 0x291d98f7, 0x1392fdc3, 0x4fe11ddf, 0x2f0cc7b5, 0x2d5bda6f, 0x2d85b32d, 0x081e2031, 0x00000000, 0x400001f0 + ], + FinalRegs = [0xffffffa0, 0xffffff96, 0x00000000, 0x00000060, 0x00000000, 0x00000000, 0x000000f0, 0xffffff99, 0x2fc23bbc, 0x2d85b418, 0x0000d42f, 0xc7ffffff, 0xf7e1d472, 0x081e259d, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xb235, 0x3f52, 0xb2ed, 0xa9b5, 0xbf53, 0x2bef, 0x1829, 0x2f6e, 0xba3a, 0xba63, 0x42c9, 0x41fa, 0xbf22, 0x415e, 0xa64f, 0xb072, 0xb2fe, 0x2efd, 0x4080, 0x0976, 0xb299, 0x4673, 0xb22c, 0x436d, 0xb2f3, 0x41f3, 0x02e9, 0x1955, 0x43fa, 0x411d, 0x4197, 0x41b0, 0x40cd, 0xbae5, 0xbadf, 0xbf42, 0x41ed, 0x41ea, 0xb240, 0xba2a, 0xb0eb, 0x4049, 0x40e4, 0xb223, 0x4361, 0x430c, 0x4144, 0x17db, 0x4053, 0xb284, 0xb0f5, 0x4074, 0x401b, 0x213c, 0x40eb, 0x4331, 0xb27f, 0xb2ba, 0xb2c6, 0x428e, 0x40c1, 0xbf8b, 0xb239, 0x41c2, 0x43a2, 0xb2f8, 0x4193, 0x4005, 0x432e, 0x4596, 0x44b9, 0x43a5, 0xb288, 0x3e1e, 0x449d, 0xb2b7, 0x1b4f, 0x2bc5, 0x43f4, 0xba10, 0x409c, 0x4090, 0x414c, 0x0672, 0xbfd4, 0x4356, 0x44b3, 0x424e, 0x1fb8, 0x4434, 0xb00d, 0x4045, 0x2fcd, 0x40fb, 0xba20, 0x41ae, 0x4266, 0xba12, 0x407b, 0x420a, 0x1a0f, 0x2281, 0x31c6, 0x1abf, 0x1d76, 0x41b8, 0x4055, 0x45c4, 0x43cc, 0x40c8, 0x4165, 0x163e, 0xbf1f, 0xba6c, 0xacaf, 0xba04, 0x412c, 0xb2a6, 0x42fb, 0xbaea, 0xb0ac, 0x446b, 0x4381, 0xa37d, 0xbf27, 0x4163, 0x42f8, 0xb24c, 0x41d5, 0x182b, 0x426e, 0x40e5, 0x3fa2, 0xbf9f, 0xba3c, 0x2e88, 0x4362, 0x3a89, 0xb2f3, 0xbacc, 0xb218, 0x3a16, 0x2c8f, 0x42f4, 0x43a4, 0xbf2c, 0x2016, 0x0105, 0x2c60, 0x425d, 0xbf17, 0x443d, 0x19cd, 0x21e8, 0x2803, 0x402d, 0x40e0, 0x1330, 0x1a90, 0x42e5, 0x151c, 0xb022, 0xbf47, 0x1f76, 0xba71, 0xb207, 0x40f2, 0x4172, 0x0965, 0x42af, 0x407f, 0x4162, 0x4355, 0x13d1, 0xbfa0, 0x0910, 0x4574, 0x42f4, 0x206f, 0x431d, 0x437c, 0x42a0, 0x4108, 0x4469, 0x21dc, 0x42d4, 0x3b95, 0xbad0, 0x420f, 0x1295, 0x428b, 0xbfd6, 0x05f7, 0xbf00, 0x4685, 0x4193, 0x463c, 0x4190, 0xbf5e, 0xba3e, 0xb2b8, 0xbafb, 0x07a5, 0x4320, 0x4161, 0x43d8, 0x004d, 0x40f4, 0x4040, 0xb253, 0x412b, 0xb230, 0x408f, 0xbf00, 0x021f, 0xbfa0, 0x42aa, 0x3978, 0x3bc6, 0x1e67, 0x406f, 0x4161, 0x4628, 0xad0c, 0x4232, 0xba05, 0xb2ea, 0xbf45, 0x2bbd, 0x224d, 0x43ce, 0x4262, 0xbfe1, 0x0ac9, 0x42d2, 0x4592, 0x2030, 0x3981, 0xbf7d, 0x3d39, 0xae51, 0xbfd0, 0x4161, 0x41e6, 0x414d, 0xba32, 0x4680, 0x311a, 0x18e4, 0x1f85, 0xbf64, 0x1a28, 0xbadf, 0x46e4, 0xa5c9, 0x4199, 0x3d07, 0x0825, 0xbf2d, 0x40e5, 0x21ec, 0x0b46, 0x430a, 0x1cd7, 0xa4e2, 0x4396, 0x4370, 0x2c8a, 0xbf04, 0xb273, 0xba2e, 0x423f, 0x428d, 0x1f54, 0xbfc6, 0x41cc, 0x1aa1, 0x402c, 0x4397, 0x4175, 0xb287, 0x4222, 0x46c3, 0x305a, 0x421f, 0x41c1, 0xb283, 0x43a0, 0x431f, 0x1ec0, 0x43fa, 0x0821, 0xba45, 0x405d, 0xb0e4, 0x407e, 0xbfbf, 0x00ab, 0xb22b, 0x309d, 0x4269, 0x4021, 0xb09e, 0xbf0d, 0xb251, 0xbae7, 0x42de, 0x41d1, 0x4132, 0xb08a, 0xa1ec, 0x1fc5, 0xb09a, 0x4332, 0xbfd0, 0x26f4, 0x4069, 0x42e6, 0xb275, 0x1ae3, 0x4350, 0xbf31, 0x3b04, 0x1f7a, 0x4152, 0xbaca, 0x1f2f, 0xb032, 0x1d51, 0x44cc, 0x4016, 0x18ce, 0x41fc, 0x1d3e, 0x409d, 0xbf4b, 0x4241, 0x2393, 0x4139, 0x4374, 0x43c6, 0x40fb, 0x41ba, 0x370d, 0xb205, 0x42d5, 0x4231, 0xb2c5, 0x4253, 0x42c6, 0x40ea, 0x38fd, 0xb2f0, 0x1002, 0x1676, 0x42bc, 0xbfdb, 0x1c6c, 0x0b4f, 0xb230, 0x41ee, 0x4233, 0x29f8, 0x191e, 0xba4a, 0x408e, 0x45bd, 0xb20f, 0x3a1d, 0x2891, 0x3659, 0x127e, 0x43a2, 0x167c, 0xb2b5, 0xb298, 0x43b5, 0xb2ba, 0x4344, 0x426e, 0xb259, 0x1293, 0xbf25, 0x4134, 0x2a59, 0x40d7, 0xafc9, 0x2b8d, 0x42da, 0xb03d, 0xb000, 0x4656, 0x420a, 0x2c8d, 0x065e, 0x4252, 0x43c6, 0x458b, 0xa5fd, 0x4111, 0x42fd, 0xbf85, 0xbaff, 0x4032, 0xb2b7, 0xb236, 0xb044, 0xb205, 0xbae5, 0x416e, 0x42e0, 0x412d, 0x1d40, 0x0fc4, 0x42e7, 0x428e, 0x4376, 0x1b9e, 0x263a, 0x42c3, 0x43a4, 0x08bf, 0x409a, 0x2124, 0x40f9, 0xb29c, 0xbf9d, 0x415e, 0x4003, 0x275f, 0xaf43, 0xba41, 0xa013, 0xb02a, 0x4398, 0x424f, 0x411f, 0x42ee, 0xa2da, 0x45f3, 0x440d, 0xb2ed, 0x429c, 0x4263, 0x1f66, 0x0f8d, 0x3500, 0xbf68, 0x40a6, 0xb2de, 0x43df, 0x40a1, 0xba52, 0xb0fb, 0x145d, 0x19ce, 0x43a1, 0x427d, 0x4493, 0x40cf, 0x4103, 0x463b, 0xb0cf, 0x4113, 0x458c, 0x1ac8, 0x030e, 0x42ef, 0x4381, 0x19ae, 0xa923, 0x4209, 0xbf91, 0xb01d, 0x199e, 0x1a59, 0x41d7, 0x4390, 0x414f, 0x4144, 0x19df, 0xa99a, 0x43d8, 0x4059, 0x400b, 0xba42, 0x4327, 0xb20f, 0x2ad1, 0xbfa6, 0x4335, 0xb2ef, 0x10be, 0x1845, 0xbfd8, 0xb2a8, 0x40f2, 0x405d, 0x42bd, 0x43c2, 0xabd0, 0x40f0, 0x4361, 0x413b, 0x1dcf, 0xb20d, 0x3168, 0xba5b, 0x43e1, 0x43a3, 0xb053, 0xba1f, 0xa340, 0xba35, 0x27b0, 0x45c6, 0x4093, 0x40d7, 0x43fd, 0x1f45, 0xbfb9, 0x424e, 0xaf65, 0x1215, 0xb247, 0xb220, 0x44d0, 0xb27c, 0xbf82, 0x232d, 0xa8e7, 0x42cb, 0x3cd3, 0x1aea, 0x4110, 0xbaee, 0x2c77, 0x4028, 0xb2f8, 0x2376, 0xb262, 0x0ccd, 0x4059, 0x40bc, 0xba54, 0x4367, 0xb2dc, 0x4012, 0x4012, 0x4221, 0x182a, 0x195a, 0xbf02, 0x4361, 0x04db, 0x427f, 0x44a2, 0x43c3, 0x41d8, 0x427f, 0x017f, 0xaffb, 0xbfc9, 0x426e, 0xb09d, 0x11ce, 0xb21b, 0xba66, 0x0ab4, 0x420b, 0x075f, 0xb25e, 0xbf95, 0x42bc, 0xb23a, 0x4070, 0x41b8, 0x43c6, 0xa5d7, 0x4271, 0x438a, 0xbf05, 0xac31, 0xbadf, 0x43e3, 0x1eb1, 0xb225, 0x4237, 0x4015, 0x425d, 0x07fc, 0xa809, 0x43b6, 0x43f8, 0x4330, 0x4028, 0xbf5a, 0x42c3, 0x1ce7, 0xb2eb, 0x42ef, 0x34ec, 0x4334, 0xba3d, 0x1d32, 0xb232, 0xbaca, 0xb23c, 0x4039, 0xadc4, 0xb0a5, 0xb2f2, 0x199a, 0x41f9, 0xb26c, 0x404a, 0xba1e, 0x40ac, 0xb044, 0xba2a, 0xbf35, 0xb015, 0xba51, 0xa8ac, 0x1963, 0x20b1, 0xbf39, 0x40ad, 0x40ed, 0x4151, 0x2d49, 0xb20b, 0xba2d, 0x1edd, 0xb211, 0x1f04, 0x4339, 0x4349, 0xb218, 0x4286, 0x43d1, 0xbfd3, 0xba2d, 0x41ce, 0x18d1, 0x4543, 0x1d0b, 0xa053, 0xbfe0, 0x15da, 0x2d45, 0x3d82, 0x4115, 0x04a6, 0x43b4, 0xb065, 0x282f, 0x0267, 0xa36f, 0x422f, 0x011c, 0xbf0e, 0x029e, 0xba71, 0xad75, 0x43c6, 0x4288, 0x42f7, 0x4616, 0xbf2b, 0x404e, 0x1a44, 0x30f1, 0xb09e, 0x4354, 0xb2c7, 0x4000, 0x3fd3, 0x18f4, 0x2e42, 0xb279, 0x4257, 0xb0f8, 0x42e9, 0x4065, 0x4021, 0xba0f, 0x4121, 0x419d, 0x40e4, 0x41c7, 0x259c, 0x4023, 0x435a, 0x1afd, 0x1f12, 0xba21, 0xbf4e, 0x4313, 0x254b, 0xb27e, 0x41f6, 0x4557, 0x4287, 0xb270, 0x42cf, 0xb07e, 0xbf94, 0xb2c9, 0x432f, 0x4397, 0xafbd, 0x3d40, 0xa8ae, 0x3690, 0x40b8, 0xafdc, 0xb064, 0x26fe, 0x43a3, 0x466f, 0x39e6, 0xb2ee, 0x0008, 0x4273, 0xba2e, 0x1d7b, 0x39d9, 0xbf48, 0xba57, 0x1c17, 0x0edb, 0x415e, 0xbfc6, 0x14c0, 0xbacf, 0xbacc, 0xacb0, 0x4359, 0xb21a, 0xbf5d, 0x415e, 0x41cf, 0x4423, 0x42f2, 0xb27b, 0x41ac, 0x4571, 0xbf00, 0xba7e, 0xb01c, 0x42db, 0x2818, 0x3d11, 0xbf90, 0x4186, 0xb0f6, 0xb0c3, 0xba49, 0x1c79, 0xbac8, 0x19b8, 0x407a, 0xa439, 0x1af9, 0x414e, 0xb227, 0xa3ab, 0xbf83, 0x4107, 0xba3e, 0x1e2f, 0xbfe0, 0x0b3b, 0x437d, 0x40b5, 0xba44, 0x45f2, 0x447f, 0xb2f9, 0xb2f6, 0x44a0, 0x4470, 0x4634, 0x42df, 0x1b5d, 0x426f, 0xbfb0, 0x4056, 0x1e3d, 0x1ad9, 0xa59d, 0xbfc0, 0x1404, 0xbf48, 0xb2f1, 0xbf61, 0x099c, 0x43c9, 0xba5a, 0xb278, 0x4002, 0x4083, 0x08c7, 0x42d0, 0x44eb, 0xa734, 0x462e, 0x4121, 0x4218, 0x4060, 0x402f, 0x415b, 0x464b, 0x441c, 0xabc9, 0xb255, 0xbaf4, 0xb2c5, 0x43c2, 0xbf7b, 0x1f61, 0x1dda, 0x42f6, 0xb22d, 0xbf72, 0x4604, 0x4384, 0x1ef3, 0x1d46, 0xbf05, 0xbafd, 0xb207, 0xaf8f, 0x4561, 0xba57, 0x406d, 0x421e, 0x420f, 0x41c5, 0x45e5, 0x1dbd, 0x1fc6, 0x41f5, 0x4203, 0x422f, 0x42c3, 0xb247, 0xb069, 0xbf5c, 0x414b, 0x41c3, 0x41fa, 0xbf00, 0xafae, 0x4215, 0xbf4a, 0x4000, 0x41b2, 0x1e3b, 0x2842, 0x133b, 0x42d9, 0x4165, 0x4262, 0x43b9, 0x2626, 0x41b8, 0x4295, 0xacbc, 0x2fcf, 0xbfe2, 0x2b38, 0x4020, 0x09e3, 0xbfae, 0x40bb, 0x4289, 0xb226, 0xbf17, 0xa215, 0x4326, 0x2a3b, 0x0daa, 0xbf98, 0xb045, 0x42b7, 0x462d, 0x43d2, 0xa357, 0xb20e, 0x401b, 0x0d93, 0xba3d, 0xba27, 0x3a82, 0xbf60, 0x1844, 0x4211, 0x4004, 0x42ac, 0xba4b, 0x282a, 0xb272, 0x42f8, 0xbf90, 0xa34e, 0xbf0f, 0x43f0, 0x2f72, 0xb06f, 0x461e, 0x1d80, 0x19fb, 0xada0, 0xa8f2, 0x3b75, 0xbf02, 0xb294, 0x0e2f, 0x0a11, 0xb21e, 0x1af3, 0x43b1, 0xa521, 0xb264, 0xbad0, 0x43fc, 0x42c9, 0x1877, 0x403d, 0x43fc, 0x0217, 0xbf0c, 0xb0cd, 0xb2a4, 0x4196, 0xb2ee, 0x2b9c, 0xb007, 0x41a1, 0xbf2c, 0xba44, 0xb06d, 0xba5d, 0x4063, 0x1c68, 0x45c8, 0xbf71, 0x4100, 0xb274, 0xb0c0, 0x4421, 0x3a36, 0x0655, 0x204b, 0x1fc2, 0xb2b6, 0x1c68, 0xb050, 0x1e86, 0x3b90, 0x3b9e, 0x2bb7, 0xa64d, 0xaf8e, 0xbf14, 0x4219, 0x074a, 0x43c7, 0x4179, 0x42ae, 0xb026, 0x4551, 0xbfc9, 0x427e, 0xa12c, 0x465b, 0x42c1, 0x419c, 0x2a70, 0x4200, 0x4217, 0x4437, 0x1842, 0xbf70, 0xb03c, 0xa47b, 0x40fd, 0x4623, 0x1ee8, 0xbf23, 0xb23b, 0x41a1, 0x40ff, 0x42be, 0x1b0b, 0x43a1, 0x4193, 0x4008, 0xba0d, 0x4392, 0x0f39, 0x46bc, 0x2b84, 0x462e, 0xbf0d, 0x426a, 0xb093, 0x3ef0, 0x2b53, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x284dbe99, 0x058f67cb, 0xb9dae013, 0xa1c1f55b, 0x52670afd, 0x96fcee8f, 0x8a2497af, 0xbd5ee36d, 0x01bd25ee, 0x57094880, 0x25509dd6, 0xeb081cb3, 0x37cda5c3, 0x8213e3ef, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x01ffe449, 0x00000000, 0x00000000, 0x65ffccb7, 0x000019a4, 0x49e4ff65, 0x49e4fe75, 0x00000000, 0x25508003, 0x57094880, 0x25509e4c, 0x000070de, 0x00000000, 0xffffa158, 0x00000000, 0x200001d0 }, + Instructions = [0xb235, 0x3f52, 0xb2ed, 0xa9b5, 0xbf53, 0x2bef, 0x1829, 0x2f6e, 0xba3a, 0xba63, 0x42c9, 0x41fa, 0xbf22, 0x415e, 0xa64f, 0xb072, 0xb2fe, 0x2efd, 0x4080, 0x0976, 0xb299, 0x4673, 0xb22c, 0x436d, 0xb2f3, 0x41f3, 0x02e9, 0x1955, 0x43fa, 0x411d, 0x4197, 0x41b0, 0x40cd, 0xbae5, 0xbadf, 0xbf42, 0x41ed, 0x41ea, 0xb240, 0xba2a, 0xb0eb, 0x4049, 0x40e4, 0xb223, 0x4361, 0x430c, 0x4144, 0x17db, 0x4053, 0xb284, 0xb0f5, 0x4074, 0x401b, 0x213c, 0x40eb, 0x4331, 0xb27f, 0xb2ba, 0xb2c6, 0x428e, 0x40c1, 0xbf8b, 0xb239, 0x41c2, 0x43a2, 0xb2f8, 0x4193, 0x4005, 0x432e, 0x4596, 0x44b9, 0x43a5, 0xb288, 0x3e1e, 0x449d, 0xb2b7, 0x1b4f, 0x2bc5, 0x43f4, 0xba10, 0x409c, 0x4090, 0x414c, 0x0672, 0xbfd4, 0x4356, 0x44b3, 0x424e, 0x1fb8, 0x4434, 0xb00d, 0x4045, 0x2fcd, 0x40fb, 0xba20, 0x41ae, 0x4266, 0xba12, 0x407b, 0x420a, 0x1a0f, 0x2281, 0x31c6, 0x1abf, 0x1d76, 0x41b8, 0x4055, 0x45c4, 0x43cc, 0x40c8, 0x4165, 0x163e, 0xbf1f, 0xba6c, 0xacaf, 0xba04, 0x412c, 0xb2a6, 0x42fb, 0xbaea, 0xb0ac, 0x446b, 0x4381, 0xa37d, 0xbf27, 0x4163, 0x42f8, 0xb24c, 0x41d5, 0x182b, 0x426e, 0x40e5, 0x3fa2, 0xbf9f, 0xba3c, 0x2e88, 0x4362, 0x3a89, 0xb2f3, 0xbacc, 0xb218, 0x3a16, 0x2c8f, 0x42f4, 0x43a4, 0xbf2c, 0x2016, 0x0105, 0x2c60, 0x425d, 0xbf17, 0x443d, 0x19cd, 0x21e8, 0x2803, 0x402d, 0x40e0, 0x1330, 0x1a90, 0x42e5, 0x151c, 0xb022, 0xbf47, 0x1f76, 0xba71, 0xb207, 0x40f2, 0x4172, 0x0965, 0x42af, 0x407f, 0x4162, 0x4355, 0x13d1, 0xbfa0, 0x0910, 0x4574, 0x42f4, 0x206f, 0x431d, 0x437c, 0x42a0, 0x4108, 0x4469, 0x21dc, 0x42d4, 0x3b95, 0xbad0, 0x420f, 0x1295, 0x428b, 0xbfd6, 0x05f7, 0xbf00, 0x4685, 0x4193, 0x463c, 0x4190, 0xbf5e, 0xba3e, 0xb2b8, 0xbafb, 0x07a5, 0x4320, 0x4161, 0x43d8, 0x004d, 0x40f4, 0x4040, 0xb253, 0x412b, 0xb230, 0x408f, 0xbf00, 0x021f, 0xbfa0, 0x42aa, 0x3978, 0x3bc6, 0x1e67, 0x406f, 0x4161, 0x4628, 0xad0c, 0x4232, 0xba05, 0xb2ea, 0xbf45, 0x2bbd, 0x224d, 0x43ce, 0x4262, 0xbfe1, 0x0ac9, 0x42d2, 0x4592, 0x2030, 0x3981, 0xbf7d, 0x3d39, 0xae51, 0xbfd0, 0x4161, 0x41e6, 0x414d, 0xba32, 0x4680, 0x311a, 0x18e4, 0x1f85, 0xbf64, 0x1a28, 0xbadf, 0x46e4, 0xa5c9, 0x4199, 0x3d07, 0x0825, 0xbf2d, 0x40e5, 0x21ec, 0x0b46, 0x430a, 0x1cd7, 0xa4e2, 0x4396, 0x4370, 0x2c8a, 0xbf04, 0xb273, 0xba2e, 0x423f, 0x428d, 0x1f54, 0xbfc6, 0x41cc, 0x1aa1, 0x402c, 0x4397, 0x4175, 0xb287, 0x4222, 0x46c3, 0x305a, 0x421f, 0x41c1, 0xb283, 0x43a0, 0x431f, 0x1ec0, 0x43fa, 0x0821, 0xba45, 0x405d, 0xb0e4, 0x407e, 0xbfbf, 0x00ab, 0xb22b, 0x309d, 0x4269, 0x4021, 0xb09e, 0xbf0d, 0xb251, 0xbae7, 0x42de, 0x41d1, 0x4132, 0xb08a, 0xa1ec, 0x1fc5, 0xb09a, 0x4332, 0xbfd0, 0x26f4, 0x4069, 0x42e6, 0xb275, 0x1ae3, 0x4350, 0xbf31, 0x3b04, 0x1f7a, 0x4152, 0xbaca, 0x1f2f, 0xb032, 0x1d51, 0x44cc, 0x4016, 0x18ce, 0x41fc, 0x1d3e, 0x409d, 0xbf4b, 0x4241, 0x2393, 0x4139, 0x4374, 0x43c6, 0x40fb, 0x41ba, 0x370d, 0xb205, 0x42d5, 0x4231, 0xb2c5, 0x4253, 0x42c6, 0x40ea, 0x38fd, 0xb2f0, 0x1002, 0x1676, 0x42bc, 0xbfdb, 0x1c6c, 0x0b4f, 0xb230, 0x41ee, 0x4233, 0x29f8, 0x191e, 0xba4a, 0x408e, 0x45bd, 0xb20f, 0x3a1d, 0x2891, 0x3659, 0x127e, 0x43a2, 0x167c, 0xb2b5, 0xb298, 0x43b5, 0xb2ba, 0x4344, 0x426e, 0xb259, 0x1293, 0xbf25, 0x4134, 0x2a59, 0x40d7, 0xafc9, 0x2b8d, 0x42da, 0xb03d, 0xb000, 0x4656, 0x420a, 0x2c8d, 0x065e, 0x4252, 0x43c6, 0x458b, 0xa5fd, 0x4111, 0x42fd, 0xbf85, 0xbaff, 0x4032, 0xb2b7, 0xb236, 0xb044, 0xb205, 0xbae5, 0x416e, 0x42e0, 0x412d, 0x1d40, 0x0fc4, 0x42e7, 0x428e, 0x4376, 0x1b9e, 0x263a, 0x42c3, 0x43a4, 0x08bf, 0x409a, 0x2124, 0x40f9, 0xb29c, 0xbf9d, 0x415e, 0x4003, 0x275f, 0xaf43, 0xba41, 0xa013, 0xb02a, 0x4398, 0x424f, 0x411f, 0x42ee, 0xa2da, 0x45f3, 0x440d, 0xb2ed, 0x429c, 0x4263, 0x1f66, 0x0f8d, 0x3500, 0xbf68, 0x40a6, 0xb2de, 0x43df, 0x40a1, 0xba52, 0xb0fb, 0x145d, 0x19ce, 0x43a1, 0x427d, 0x4493, 0x40cf, 0x4103, 0x463b, 0xb0cf, 0x4113, 0x458c, 0x1ac8, 0x030e, 0x42ef, 0x4381, 0x19ae, 0xa923, 0x4209, 0xbf91, 0xb01d, 0x199e, 0x1a59, 0x41d7, 0x4390, 0x414f, 0x4144, 0x19df, 0xa99a, 0x43d8, 0x4059, 0x400b, 0xba42, 0x4327, 0xb20f, 0x2ad1, 0xbfa6, 0x4335, 0xb2ef, 0x10be, 0x1845, 0xbfd8, 0xb2a8, 0x40f2, 0x405d, 0x42bd, 0x43c2, 0xabd0, 0x40f0, 0x4361, 0x413b, 0x1dcf, 0xb20d, 0x3168, 0xba5b, 0x43e1, 0x43a3, 0xb053, 0xba1f, 0xa340, 0xba35, 0x27b0, 0x45c6, 0x4093, 0x40d7, 0x43fd, 0x1f45, 0xbfb9, 0x424e, 0xaf65, 0x1215, 0xb247, 0xb220, 0x44d0, 0xb27c, 0xbf82, 0x232d, 0xa8e7, 0x42cb, 0x3cd3, 0x1aea, 0x4110, 0xbaee, 0x2c77, 0x4028, 0xb2f8, 0x2376, 0xb262, 0x0ccd, 0x4059, 0x40bc, 0xba54, 0x4367, 0xb2dc, 0x4012, 0x4012, 0x4221, 0x182a, 0x195a, 0xbf02, 0x4361, 0x04db, 0x427f, 0x44a2, 0x43c3, 0x41d8, 0x427f, 0x017f, 0xaffb, 0xbfc9, 0x426e, 0xb09d, 0x11ce, 0xb21b, 0xba66, 0x0ab4, 0x420b, 0x075f, 0xb25e, 0xbf95, 0x42bc, 0xb23a, 0x4070, 0x41b8, 0x43c6, 0xa5d7, 0x4271, 0x438a, 0xbf05, 0xac31, 0xbadf, 0x43e3, 0x1eb1, 0xb225, 0x4237, 0x4015, 0x425d, 0x07fc, 0xa809, 0x43b6, 0x43f8, 0x4330, 0x4028, 0xbf5a, 0x42c3, 0x1ce7, 0xb2eb, 0x42ef, 0x34ec, 0x4334, 0xba3d, 0x1d32, 0xb232, 0xbaca, 0xb23c, 0x4039, 0xadc4, 0xb0a5, 0xb2f2, 0x199a, 0x41f9, 0xb26c, 0x404a, 0xba1e, 0x40ac, 0xb044, 0xba2a, 0xbf35, 0xb015, 0xba51, 0xa8ac, 0x1963, 0x20b1, 0xbf39, 0x40ad, 0x40ed, 0x4151, 0x2d49, 0xb20b, 0xba2d, 0x1edd, 0xb211, 0x1f04, 0x4339, 0x4349, 0xb218, 0x4286, 0x43d1, 0xbfd3, 0xba2d, 0x41ce, 0x18d1, 0x4543, 0x1d0b, 0xa053, 0xbfe0, 0x15da, 0x2d45, 0x3d82, 0x4115, 0x04a6, 0x43b4, 0xb065, 0x282f, 0x0267, 0xa36f, 0x422f, 0x011c, 0xbf0e, 0x029e, 0xba71, 0xad75, 0x43c6, 0x4288, 0x42f7, 0x4616, 0xbf2b, 0x404e, 0x1a44, 0x30f1, 0xb09e, 0x4354, 0xb2c7, 0x4000, 0x3fd3, 0x18f4, 0x2e42, 0xb279, 0x4257, 0xb0f8, 0x42e9, 0x4065, 0x4021, 0xba0f, 0x4121, 0x419d, 0x40e4, 0x41c7, 0x259c, 0x4023, 0x435a, 0x1afd, 0x1f12, 0xba21, 0xbf4e, 0x4313, 0x254b, 0xb27e, 0x41f6, 0x4557, 0x4287, 0xb270, 0x42cf, 0xb07e, 0xbf94, 0xb2c9, 0x432f, 0x4397, 0xafbd, 0x3d40, 0xa8ae, 0x3690, 0x40b8, 0xafdc, 0xb064, 0x26fe, 0x43a3, 0x466f, 0x39e6, 0xb2ee, 0x0008, 0x4273, 0xba2e, 0x1d7b, 0x39d9, 0xbf48, 0xba57, 0x1c17, 0x0edb, 0x415e, 0xbfc6, 0x14c0, 0xbacf, 0xbacc, 0xacb0, 0x4359, 0xb21a, 0xbf5d, 0x415e, 0x41cf, 0x4423, 0x42f2, 0xb27b, 0x41ac, 0x4571, 0xbf00, 0xba7e, 0xb01c, 0x42db, 0x2818, 0x3d11, 0xbf90, 0x4186, 0xb0f6, 0xb0c3, 0xba49, 0x1c79, 0xbac8, 0x19b8, 0x407a, 0xa439, 0x1af9, 0x414e, 0xb227, 0xa3ab, 0xbf83, 0x4107, 0xba3e, 0x1e2f, 0xbfe0, 0x0b3b, 0x437d, 0x40b5, 0xba44, 0x45f2, 0x447f, 0xb2f9, 0xb2f6, 0x44a0, 0x4470, 0x4634, 0x42df, 0x1b5d, 0x426f, 0xbfb0, 0x4056, 0x1e3d, 0x1ad9, 0xa59d, 0xbfc0, 0x1404, 0xbf48, 0xb2f1, 0xbf61, 0x099c, 0x43c9, 0xba5a, 0xb278, 0x4002, 0x4083, 0x08c7, 0x42d0, 0x44eb, 0xa734, 0x462e, 0x4121, 0x4218, 0x4060, 0x402f, 0x415b, 0x464b, 0x441c, 0xabc9, 0xb255, 0xbaf4, 0xb2c5, 0x43c2, 0xbf7b, 0x1f61, 0x1dda, 0x42f6, 0xb22d, 0xbf72, 0x4604, 0x4384, 0x1ef3, 0x1d46, 0xbf05, 0xbafd, 0xb207, 0xaf8f, 0x4561, 0xba57, 0x406d, 0x421e, 0x420f, 0x41c5, 0x45e5, 0x1dbd, 0x1fc6, 0x41f5, 0x4203, 0x422f, 0x42c3, 0xb247, 0xb069, 0xbf5c, 0x414b, 0x41c3, 0x41fa, 0xbf00, 0xafae, 0x4215, 0xbf4a, 0x4000, 0x41b2, 0x1e3b, 0x2842, 0x133b, 0x42d9, 0x4165, 0x4262, 0x43b9, 0x2626, 0x41b8, 0x4295, 0xacbc, 0x2fcf, 0xbfe2, 0x2b38, 0x4020, 0x09e3, 0xbfae, 0x40bb, 0x4289, 0xb226, 0xbf17, 0xa215, 0x4326, 0x2a3b, 0x0daa, 0xbf98, 0xb045, 0x42b7, 0x462d, 0x43d2, 0xa357, 0xb20e, 0x401b, 0x0d93, 0xba3d, 0xba27, 0x3a82, 0xbf60, 0x1844, 0x4211, 0x4004, 0x42ac, 0xba4b, 0x282a, 0xb272, 0x42f8, 0xbf90, 0xa34e, 0xbf0f, 0x43f0, 0x2f72, 0xb06f, 0x461e, 0x1d80, 0x19fb, 0xada0, 0xa8f2, 0x3b75, 0xbf02, 0xb294, 0x0e2f, 0x0a11, 0xb21e, 0x1af3, 0x43b1, 0xa521, 0xb264, 0xbad0, 0x43fc, 0x42c9, 0x1877, 0x403d, 0x43fc, 0x0217, 0xbf0c, 0xb0cd, 0xb2a4, 0x4196, 0xb2ee, 0x2b9c, 0xb007, 0x41a1, 0xbf2c, 0xba44, 0xb06d, 0xba5d, 0x4063, 0x1c68, 0x45c8, 0xbf71, 0x4100, 0xb274, 0xb0c0, 0x4421, 0x3a36, 0x0655, 0x204b, 0x1fc2, 0xb2b6, 0x1c68, 0xb050, 0x1e86, 0x3b90, 0x3b9e, 0x2bb7, 0xa64d, 0xaf8e, 0xbf14, 0x4219, 0x074a, 0x43c7, 0x4179, 0x42ae, 0xb026, 0x4551, 0xbfc9, 0x427e, 0xa12c, 0x465b, 0x42c1, 0x419c, 0x2a70, 0x4200, 0x4217, 0x4437, 0x1842, 0xbf70, 0xb03c, 0xa47b, 0x40fd, 0x4623, 0x1ee8, 0xbf23, 0xb23b, 0x41a1, 0x40ff, 0x42be, 0x1b0b, 0x43a1, 0x4193, 0x4008, 0xba0d, 0x4392, 0x0f39, 0x46bc, 0x2b84, 0x462e, 0xbf0d, 0x426a, 0xb093, 0x3ef0, 0x2b53, 0x4770, 0xe7fe + ], + StartRegs = [0x284dbe99, 0x058f67cb, 0xb9dae013, 0xa1c1f55b, 0x52670afd, 0x96fcee8f, 0x8a2497af, 0xbd5ee36d, 0x01bd25ee, 0x57094880, 0x25509dd6, 0xeb081cb3, 0x37cda5c3, 0x8213e3ef, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x01ffe449, 0x00000000, 0x00000000, 0x65ffccb7, 0x000019a4, 0x49e4ff65, 0x49e4fe75, 0x00000000, 0x25508003, 0x57094880, 0x25509e4c, 0x000070de, 0x00000000, 0xffffa158, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x1d00, 0x407e, 0x3525, 0x2982, 0x43ea, 0x4352, 0x4151, 0xbf5e, 0x09a3, 0x4196, 0xa5c3, 0x3298, 0xb061, 0x1d31, 0x4086, 0xbf05, 0xb040, 0x1336, 0x1c1e, 0xa99b, 0x1174, 0x3dc2, 0x4117, 0x40bb, 0x43a0, 0xbaec, 0xb0de, 0xb229, 0x4450, 0xbf05, 0x4142, 0x1f56, 0x4160, 0xb258, 0x438b, 0x4160, 0x2c59, 0x433f, 0x13c8, 0x35ae, 0x4398, 0x1eb1, 0x236d, 0x406a, 0x41cf, 0xbfd4, 0x417a, 0x41a3, 0x42d5, 0xb2f5, 0x410e, 0x41b9, 0x45bb, 0x4083, 0x4189, 0x41b7, 0x01e2, 0x1f77, 0xba53, 0x2388, 0x4561, 0x40c8, 0xbf1f, 0x401d, 0x007d, 0x26a6, 0x24e5, 0xb209, 0x4623, 0x4346, 0x403a, 0xb0b1, 0xba2d, 0x41d9, 0x1af2, 0x444e, 0xb0ea, 0x40f1, 0x01d5, 0xa4bd, 0xbf91, 0x41d9, 0x425c, 0x414e, 0x40d0, 0xba56, 0xb2ce, 0x0d2b, 0x1984, 0xb0bb, 0x3257, 0x2ba1, 0x43d1, 0x1f95, 0x43d6, 0x40d2, 0x1fa9, 0xba3f, 0xbaca, 0x4294, 0x174e, 0x40ef, 0x434e, 0x4089, 0x445b, 0x19e7, 0x42a7, 0xbfb9, 0x4056, 0xac80, 0x2696, 0x43f6, 0x465f, 0x425d, 0xba41, 0x4092, 0x251d, 0x1e2e, 0x40af, 0x4397, 0xbfb0, 0xbf9f, 0x4166, 0x444d, 0x41c4, 0xbaf0, 0x316d, 0x43db, 0x414b, 0x32c1, 0x325c, 0x41ab, 0xbaf1, 0xbf60, 0x08d1, 0x313c, 0x4387, 0x4613, 0xbf0b, 0x19f0, 0x411d, 0x4141, 0x11c6, 0xb2c3, 0x1f54, 0x41d1, 0xb030, 0xb227, 0x1d06, 0x355b, 0xbf21, 0x0f72, 0x41b6, 0x1f75, 0xb048, 0x4382, 0x43ff, 0x411f, 0x1bbf, 0xb263, 0x434d, 0x40c1, 0x1f58, 0x2d9e, 0x403d, 0x4341, 0x4379, 0xb2a8, 0x30d6, 0xbf08, 0x4027, 0x4312, 0xbacf, 0x4021, 0x414c, 0x4304, 0x1878, 0x2a19, 0x4688, 0x40a8, 0x146a, 0x410c, 0xb02d, 0xb2bc, 0x2063, 0x3346, 0x438f, 0x43fd, 0x4160, 0x1a4f, 0x4373, 0x4128, 0x4132, 0xb2c2, 0xb0ce, 0xa0e0, 0xbf3f, 0x4282, 0x423e, 0x41fc, 0xac39, 0xbfb8, 0xbfc0, 0x1996, 0x3e39, 0x0f2b, 0x1ece, 0xb069, 0x40fc, 0xbaf6, 0xbfc2, 0x0f93, 0xb0f4, 0x4346, 0x08d7, 0xba06, 0xb200, 0xba43, 0xba72, 0x0fc7, 0x1b92, 0xba08, 0x41f0, 0x19fe, 0xb256, 0x1bac, 0x4222, 0xb062, 0xbade, 0xb0aa, 0x436d, 0x1faa, 0x0663, 0xbf80, 0xbf53, 0x4195, 0x408b, 0x4034, 0xb2c6, 0x1a0f, 0xb2e8, 0xb291, 0x40b8, 0xbaec, 0x117c, 0x27ef, 0x4084, 0x405a, 0x40e7, 0xafea, 0x40d1, 0x1157, 0x4121, 0xb06f, 0x4135, 0x2090, 0x16e4, 0x4318, 0x1c80, 0x310f, 0xb0e2, 0x40cf, 0xbf8e, 0x407a, 0xb09c, 0x388f, 0x4299, 0x1fdd, 0xb23f, 0xbf15, 0x1f0a, 0x40b2, 0x42de, 0x2ca0, 0x424f, 0xa934, 0x40be, 0x1dda, 0xb04d, 0x0c79, 0xbac7, 0x18ec, 0x4300, 0x1a08, 0xb219, 0x2eab, 0xbf8e, 0x1a3c, 0xb228, 0xad72, 0x403c, 0xb000, 0x44b2, 0x23a8, 0x41a6, 0x43d7, 0x404d, 0x0805, 0x43e8, 0x459b, 0xa1b1, 0x45b3, 0x4159, 0x44b4, 0x09a2, 0x42a1, 0xbf7e, 0xb2d5, 0xb007, 0x391a, 0x1bb2, 0x45d1, 0x4179, 0x420f, 0xba1f, 0x1ad5, 0xb22f, 0xb05f, 0xb0a6, 0xb269, 0x279d, 0x41c9, 0x4012, 0x0e08, 0xbf11, 0xba49, 0x417d, 0x3e9d, 0x436e, 0x4189, 0x42fb, 0x43e7, 0x4229, 0x40f3, 0x1a1e, 0x1ef2, 0x1061, 0x133f, 0xbac4, 0xb211, 0x42f1, 0x46ab, 0xb25e, 0x4387, 0x404f, 0x400e, 0xb038, 0x4167, 0x4564, 0xb201, 0x4073, 0xb03c, 0x234a, 0xbfae, 0x46e0, 0xb20d, 0x1862, 0xbf88, 0x42b6, 0xb029, 0xa541, 0x406d, 0x4236, 0x413e, 0x45e5, 0x1b98, 0x4224, 0x40ad, 0x41d4, 0x4197, 0x0ec7, 0xbac8, 0x425b, 0x0254, 0xb28b, 0x328c, 0xba1a, 0x42db, 0xba4f, 0x418b, 0x4104, 0xb265, 0x40d9, 0xbf39, 0x41df, 0xb23c, 0x43bd, 0x43b3, 0x4312, 0x41de, 0xbf2b, 0x365d, 0x195c, 0x40ac, 0x0fea, 0x1dc7, 0x2d8d, 0x420f, 0x43bc, 0x41ac, 0xb0d0, 0xb279, 0x25fb, 0x4386, 0xb095, 0xa6c5, 0x4106, 0x3591, 0x41c0, 0xb06c, 0x43f2, 0x4037, 0x4388, 0x0cab, 0x4065, 0xa28e, 0xbf02, 0x4209, 0x1874, 0xb0c1, 0x4085, 0xb2c9, 0xb099, 0xb045, 0x4183, 0x13ed, 0x1dd4, 0xa5f9, 0x42d7, 0x1691, 0x436c, 0xa84e, 0x40e4, 0x439e, 0xb2cc, 0x0e65, 0xb238, 0x42b6, 0x3c33, 0xbf73, 0x1e26, 0xb2f2, 0x4376, 0x43dc, 0xbacf, 0x40dd, 0x431d, 0xba58, 0x2b96, 0x463a, 0x3767, 0x42cb, 0xb0ec, 0x40d7, 0xb007, 0x454f, 0xb28f, 0x1ee1, 0xbf1c, 0xb20e, 0x454f, 0x46dc, 0x4380, 0xa1b6, 0xbfd2, 0x07c6, 0x0f93, 0x4294, 0x4159, 0xbf39, 0xb27e, 0x4396, 0x40b8, 0x27c1, 0x410a, 0xb05f, 0x4364, 0x0507, 0x41a0, 0xb2ea, 0x1c8d, 0x007f, 0x214d, 0x4191, 0x11b4, 0x4096, 0x01bb, 0xbf2a, 0xaff8, 0x2725, 0xb29d, 0x1c3a, 0x41a2, 0x0bea, 0x4337, 0x413b, 0x3f7a, 0x4493, 0x4058, 0x1f5f, 0x29c8, 0x1b7d, 0xba6b, 0x41a1, 0x1142, 0x1b05, 0xba5a, 0x422a, 0xb23e, 0xbfd3, 0x4171, 0x43c0, 0xb04b, 0x4417, 0x2814, 0x4068, 0x40b9, 0x4123, 0xa999, 0x44ba, 0x4375, 0x3e79, 0x42d2, 0x4104, 0x1b76, 0x3c21, 0x4150, 0x431e, 0xb2fe, 0xba47, 0xb279, 0xbf85, 0x415b, 0x1c20, 0x4477, 0xac9a, 0x28ba, 0x433f, 0xbfd0, 0xb0fb, 0x409b, 0x4299, 0xba02, 0x418e, 0xa2a0, 0x3aae, 0xb0ad, 0xa584, 0x1a84, 0xa29f, 0x3a28, 0xa99b, 0xba7b, 0xb0d9, 0xba18, 0x32f2, 0x460b, 0x441a, 0x3bb7, 0xbfd5, 0x4324, 0xb2bb, 0x4117, 0x4563, 0x1fd6, 0xba34, 0x429e, 0x4078, 0xaba3, 0xa4bb, 0x0e12, 0xb259, 0xb2f0, 0x443a, 0x4215, 0x42f5, 0xa264, 0xbaed, 0xba2b, 0xbf1b, 0xba59, 0x0098, 0xb205, 0x414e, 0x1e4e, 0x40a9, 0x42f0, 0x4052, 0x4485, 0xbf93, 0x15d8, 0x3ddc, 0x407d, 0x4381, 0x418a, 0xa2dd, 0xb29f, 0xb27d, 0xb0f2, 0x304b, 0x1d56, 0x46e5, 0xa925, 0x2fb8, 0x419e, 0x45ec, 0x41b4, 0x406d, 0x13e1, 0x426b, 0x4095, 0x4262, 0x15d2, 0x443f, 0x41d1, 0xbfcb, 0x2b00, 0x4319, 0xb229, 0xb21e, 0x4277, 0xbf35, 0xb28c, 0xb22d, 0x4558, 0xbad2, 0x43b9, 0xbac8, 0x404d, 0xba27, 0x4236, 0xb217, 0xacb6, 0x3991, 0xb271, 0xac00, 0xb2ba, 0x3bf7, 0x438b, 0xb2b9, 0x26a3, 0x431d, 0x2cf2, 0x421f, 0x23ac, 0x41db, 0x40c1, 0xb2c7, 0x1678, 0x427c, 0xbf8b, 0x3bd6, 0x43b7, 0x041a, 0x42ab, 0x21b7, 0x3236, 0x1892, 0x149e, 0xb27f, 0xb28e, 0x0325, 0xba7c, 0x43a8, 0x4242, 0x441c, 0xbaf4, 0x4210, 0x417f, 0x401e, 0x4252, 0xb2d2, 0x4321, 0x4062, 0xb2d4, 0x3dcc, 0xbfac, 0x40ab, 0xb00f, 0xb08f, 0x4148, 0x41e1, 0xb0a5, 0x41b9, 0x0630, 0x0865, 0x43e9, 0xb0c2, 0x4551, 0x4131, 0x41c5, 0x4014, 0x2bfc, 0x42a0, 0xbf4e, 0x407f, 0x41f6, 0x1b7a, 0x0220, 0x41ac, 0x099e, 0x46b4, 0x42d8, 0xb223, 0x423d, 0x42d1, 0x1d10, 0x41bd, 0x4188, 0x4165, 0x12c7, 0x4174, 0x4018, 0x41e2, 0x414e, 0xbae3, 0x4250, 0x43f9, 0x1ed9, 0x28a1, 0x0e3f, 0x408e, 0x43db, 0xbf9b, 0x4009, 0xb295, 0x4131, 0xb275, 0x4099, 0xb2b9, 0x0ea5, 0x456c, 0x1eaa, 0xa4ed, 0xb085, 0x4194, 0x4197, 0x0d72, 0xaffc, 0x4031, 0x0194, 0xadd6, 0xb270, 0x1eac, 0x1981, 0x2bdd, 0xba1f, 0xbf70, 0xbfbf, 0xbad7, 0x4073, 0x4454, 0xba1d, 0x446b, 0x419e, 0x4021, 0xbfd0, 0x40a7, 0x1e5e, 0xbf63, 0xb2cf, 0x462a, 0xba68, 0x0c00, 0xb02a, 0xb070, 0x1318, 0x2880, 0xb061, 0x0995, 0x4273, 0xb283, 0xbad8, 0x1b22, 0x40a1, 0x15d5, 0xbf84, 0x419e, 0xb274, 0xba71, 0x46d4, 0x45b1, 0x432e, 0x1fb3, 0x381a, 0x42d1, 0x4183, 0x4588, 0x408b, 0x4599, 0x43f9, 0x3324, 0x4338, 0xbf60, 0xbff0, 0xbff0, 0x1fb8, 0xbafc, 0x421c, 0x40d7, 0x40fb, 0xbf79, 0xbade, 0xba55, 0x2335, 0xb047, 0xbfb8, 0x403b, 0xb0a0, 0xbad2, 0x1c8b, 0xba65, 0x3c31, 0x407d, 0x1992, 0x2c0f, 0x0e6d, 0x2f2a, 0x4119, 0xb218, 0x0128, 0x4216, 0xa76e, 0x4390, 0x4045, 0x466f, 0xba55, 0x43e0, 0x3c13, 0x41f9, 0xbf91, 0x3368, 0x1acc, 0x4040, 0x4349, 0x406d, 0x408e, 0xbaf5, 0x42f7, 0x400c, 0xb21a, 0x4306, 0xb253, 0x41e1, 0x32fa, 0x3fdf, 0xa3d0, 0xb207, 0x402c, 0xb25a, 0xba45, 0xbfcf, 0xa252, 0x443a, 0x40c1, 0x0341, 0xbf05, 0xabce, 0x4354, 0x4559, 0xb000, 0x40c2, 0x02ff, 0xb288, 0x425d, 0x40ec, 0x4599, 0xba76, 0x4198, 0x1188, 0x385c, 0x193e, 0x411e, 0xba18, 0xbf47, 0x41ff, 0x1b0c, 0x4298, 0x40c5, 0xb235, 0xba44, 0x3560, 0x4346, 0x415a, 0x199e, 0x1b6e, 0xbad1, 0x45b6, 0x42a7, 0x4253, 0xa5a4, 0x4384, 0x420a, 0xb0aa, 0xbf11, 0x3731, 0x12c0, 0xadb1, 0x426f, 0x4310, 0x2243, 0x25ec, 0xb2e4, 0x0845, 0xbf97, 0x426f, 0x425f, 0x40d3, 0xb2c2, 0x3293, 0x4610, 0xa6f4, 0x4376, 0x1838, 0x4143, 0x179e, 0x4381, 0x1922, 0x15ff, 0x41b3, 0xb2fb, 0x188a, 0xbf3e, 0xb028, 0x3da2, 0x4227, 0x43ef, 0x4079, 0xb055, 0x429d, 0xba59, 0x2586, 0xb0ad, 0x19bf, 0x41fd, 0x4023, 0xb2a1, 0x43e8, 0xa823, 0x4266, 0x41f9, 0x42a1, 0xb228, 0x2c34, 0x41da, 0xb211, 0x16da, 0x2895, 0x4392, 0x2eea, 0xbf24, 0x4255, 0x1922, 0x40c6, 0xbaf3, 0xb2ff, 0x40dc, 0x4141, 0x437f, 0x43c4, 0xb283, 0x1b59, 0x4198, 0x3aba, 0x1f81, 0x1f5b, 0x429a, 0x4204, 0x4037, 0xaefc, 0x183d, 0x1309, 0x4563, 0x09a5, 0xb207, 0xba1f, 0xbfa0, 0x1cd7, 0xbfa3, 0x4258, 0xb205, 0x427a, 0x43b2, 0x41cc, 0x1797, 0x43de, 0xb227, 0x1a3c, 0x4038, 0x4355, 0x4033, 0xbf6b, 0x42f5, 0xb083, 0x4396, 0x3d30, 0x0b59, 0x38cb, 0x4319, 0x37ab, 0x425a, 0x251a, 0x41fd, 0xb2c8, 0x454b, 0xbaea, 0x40ec, 0x43fd, 0x4286, 0x445e, 0x4689, 0xb270, 0x4011, 0x2d71, 0xb0df, 0x4026, 0xa569, 0xbf2e, 0x4121, 0x4393, 0x40e1, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x0542461d, 0xf5f04e12, 0x8bc7b1fe, 0xbd178d21, 0x26456cae, 0xca50d85d, 0xf3453942, 0x72f63230, 0x00bbda65, 0xae6250a2, 0xb5896c69, 0xd8e9e883, 0x00e97798, 0xcb5e9574, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0xffffffc9, 0x00000000, 0x00000000, 0x00000000, 0xfffff79f, 0x00001998, 0xfffff389, 0xfffff84a, 0x00e9e597, 0x00000000, 0xb58955e6, 0xfffffff5, 0xb58955e6, 0x000000c1, 0x00000000, 0xa00001d0 }, + Instructions = [0x1d00, 0x407e, 0x3525, 0x2982, 0x43ea, 0x4352, 0x4151, 0xbf5e, 0x09a3, 0x4196, 0xa5c3, 0x3298, 0xb061, 0x1d31, 0x4086, 0xbf05, 0xb040, 0x1336, 0x1c1e, 0xa99b, 0x1174, 0x3dc2, 0x4117, 0x40bb, 0x43a0, 0xbaec, 0xb0de, 0xb229, 0x4450, 0xbf05, 0x4142, 0x1f56, 0x4160, 0xb258, 0x438b, 0x4160, 0x2c59, 0x433f, 0x13c8, 0x35ae, 0x4398, 0x1eb1, 0x236d, 0x406a, 0x41cf, 0xbfd4, 0x417a, 0x41a3, 0x42d5, 0xb2f5, 0x410e, 0x41b9, 0x45bb, 0x4083, 0x4189, 0x41b7, 0x01e2, 0x1f77, 0xba53, 0x2388, 0x4561, 0x40c8, 0xbf1f, 0x401d, 0x007d, 0x26a6, 0x24e5, 0xb209, 0x4623, 0x4346, 0x403a, 0xb0b1, 0xba2d, 0x41d9, 0x1af2, 0x444e, 0xb0ea, 0x40f1, 0x01d5, 0xa4bd, 0xbf91, 0x41d9, 0x425c, 0x414e, 0x40d0, 0xba56, 0xb2ce, 0x0d2b, 0x1984, 0xb0bb, 0x3257, 0x2ba1, 0x43d1, 0x1f95, 0x43d6, 0x40d2, 0x1fa9, 0xba3f, 0xbaca, 0x4294, 0x174e, 0x40ef, 0x434e, 0x4089, 0x445b, 0x19e7, 0x42a7, 0xbfb9, 0x4056, 0xac80, 0x2696, 0x43f6, 0x465f, 0x425d, 0xba41, 0x4092, 0x251d, 0x1e2e, 0x40af, 0x4397, 0xbfb0, 0xbf9f, 0x4166, 0x444d, 0x41c4, 0xbaf0, 0x316d, 0x43db, 0x414b, 0x32c1, 0x325c, 0x41ab, 0xbaf1, 0xbf60, 0x08d1, 0x313c, 0x4387, 0x4613, 0xbf0b, 0x19f0, 0x411d, 0x4141, 0x11c6, 0xb2c3, 0x1f54, 0x41d1, 0xb030, 0xb227, 0x1d06, 0x355b, 0xbf21, 0x0f72, 0x41b6, 0x1f75, 0xb048, 0x4382, 0x43ff, 0x411f, 0x1bbf, 0xb263, 0x434d, 0x40c1, 0x1f58, 0x2d9e, 0x403d, 0x4341, 0x4379, 0xb2a8, 0x30d6, 0xbf08, 0x4027, 0x4312, 0xbacf, 0x4021, 0x414c, 0x4304, 0x1878, 0x2a19, 0x4688, 0x40a8, 0x146a, 0x410c, 0xb02d, 0xb2bc, 0x2063, 0x3346, 0x438f, 0x43fd, 0x4160, 0x1a4f, 0x4373, 0x4128, 0x4132, 0xb2c2, 0xb0ce, 0xa0e0, 0xbf3f, 0x4282, 0x423e, 0x41fc, 0xac39, 0xbfb8, 0xbfc0, 0x1996, 0x3e39, 0x0f2b, 0x1ece, 0xb069, 0x40fc, 0xbaf6, 0xbfc2, 0x0f93, 0xb0f4, 0x4346, 0x08d7, 0xba06, 0xb200, 0xba43, 0xba72, 0x0fc7, 0x1b92, 0xba08, 0x41f0, 0x19fe, 0xb256, 0x1bac, 0x4222, 0xb062, 0xbade, 0xb0aa, 0x436d, 0x1faa, 0x0663, 0xbf80, 0xbf53, 0x4195, 0x408b, 0x4034, 0xb2c6, 0x1a0f, 0xb2e8, 0xb291, 0x40b8, 0xbaec, 0x117c, 0x27ef, 0x4084, 0x405a, 0x40e7, 0xafea, 0x40d1, 0x1157, 0x4121, 0xb06f, 0x4135, 0x2090, 0x16e4, 0x4318, 0x1c80, 0x310f, 0xb0e2, 0x40cf, 0xbf8e, 0x407a, 0xb09c, 0x388f, 0x4299, 0x1fdd, 0xb23f, 0xbf15, 0x1f0a, 0x40b2, 0x42de, 0x2ca0, 0x424f, 0xa934, 0x40be, 0x1dda, 0xb04d, 0x0c79, 0xbac7, 0x18ec, 0x4300, 0x1a08, 0xb219, 0x2eab, 0xbf8e, 0x1a3c, 0xb228, 0xad72, 0x403c, 0xb000, 0x44b2, 0x23a8, 0x41a6, 0x43d7, 0x404d, 0x0805, 0x43e8, 0x459b, 0xa1b1, 0x45b3, 0x4159, 0x44b4, 0x09a2, 0x42a1, 0xbf7e, 0xb2d5, 0xb007, 0x391a, 0x1bb2, 0x45d1, 0x4179, 0x420f, 0xba1f, 0x1ad5, 0xb22f, 0xb05f, 0xb0a6, 0xb269, 0x279d, 0x41c9, 0x4012, 0x0e08, 0xbf11, 0xba49, 0x417d, 0x3e9d, 0x436e, 0x4189, 0x42fb, 0x43e7, 0x4229, 0x40f3, 0x1a1e, 0x1ef2, 0x1061, 0x133f, 0xbac4, 0xb211, 0x42f1, 0x46ab, 0xb25e, 0x4387, 0x404f, 0x400e, 0xb038, 0x4167, 0x4564, 0xb201, 0x4073, 0xb03c, 0x234a, 0xbfae, 0x46e0, 0xb20d, 0x1862, 0xbf88, 0x42b6, 0xb029, 0xa541, 0x406d, 0x4236, 0x413e, 0x45e5, 0x1b98, 0x4224, 0x40ad, 0x41d4, 0x4197, 0x0ec7, 0xbac8, 0x425b, 0x0254, 0xb28b, 0x328c, 0xba1a, 0x42db, 0xba4f, 0x418b, 0x4104, 0xb265, 0x40d9, 0xbf39, 0x41df, 0xb23c, 0x43bd, 0x43b3, 0x4312, 0x41de, 0xbf2b, 0x365d, 0x195c, 0x40ac, 0x0fea, 0x1dc7, 0x2d8d, 0x420f, 0x43bc, 0x41ac, 0xb0d0, 0xb279, 0x25fb, 0x4386, 0xb095, 0xa6c5, 0x4106, 0x3591, 0x41c0, 0xb06c, 0x43f2, 0x4037, 0x4388, 0x0cab, 0x4065, 0xa28e, 0xbf02, 0x4209, 0x1874, 0xb0c1, 0x4085, 0xb2c9, 0xb099, 0xb045, 0x4183, 0x13ed, 0x1dd4, 0xa5f9, 0x42d7, 0x1691, 0x436c, 0xa84e, 0x40e4, 0x439e, 0xb2cc, 0x0e65, 0xb238, 0x42b6, 0x3c33, 0xbf73, 0x1e26, 0xb2f2, 0x4376, 0x43dc, 0xbacf, 0x40dd, 0x431d, 0xba58, 0x2b96, 0x463a, 0x3767, 0x42cb, 0xb0ec, 0x40d7, 0xb007, 0x454f, 0xb28f, 0x1ee1, 0xbf1c, 0xb20e, 0x454f, 0x46dc, 0x4380, 0xa1b6, 0xbfd2, 0x07c6, 0x0f93, 0x4294, 0x4159, 0xbf39, 0xb27e, 0x4396, 0x40b8, 0x27c1, 0x410a, 0xb05f, 0x4364, 0x0507, 0x41a0, 0xb2ea, 0x1c8d, 0x007f, 0x214d, 0x4191, 0x11b4, 0x4096, 0x01bb, 0xbf2a, 0xaff8, 0x2725, 0xb29d, 0x1c3a, 0x41a2, 0x0bea, 0x4337, 0x413b, 0x3f7a, 0x4493, 0x4058, 0x1f5f, 0x29c8, 0x1b7d, 0xba6b, 0x41a1, 0x1142, 0x1b05, 0xba5a, 0x422a, 0xb23e, 0xbfd3, 0x4171, 0x43c0, 0xb04b, 0x4417, 0x2814, 0x4068, 0x40b9, 0x4123, 0xa999, 0x44ba, 0x4375, 0x3e79, 0x42d2, 0x4104, 0x1b76, 0x3c21, 0x4150, 0x431e, 0xb2fe, 0xba47, 0xb279, 0xbf85, 0x415b, 0x1c20, 0x4477, 0xac9a, 0x28ba, 0x433f, 0xbfd0, 0xb0fb, 0x409b, 0x4299, 0xba02, 0x418e, 0xa2a0, 0x3aae, 0xb0ad, 0xa584, 0x1a84, 0xa29f, 0x3a28, 0xa99b, 0xba7b, 0xb0d9, 0xba18, 0x32f2, 0x460b, 0x441a, 0x3bb7, 0xbfd5, 0x4324, 0xb2bb, 0x4117, 0x4563, 0x1fd6, 0xba34, 0x429e, 0x4078, 0xaba3, 0xa4bb, 0x0e12, 0xb259, 0xb2f0, 0x443a, 0x4215, 0x42f5, 0xa264, 0xbaed, 0xba2b, 0xbf1b, 0xba59, 0x0098, 0xb205, 0x414e, 0x1e4e, 0x40a9, 0x42f0, 0x4052, 0x4485, 0xbf93, 0x15d8, 0x3ddc, 0x407d, 0x4381, 0x418a, 0xa2dd, 0xb29f, 0xb27d, 0xb0f2, 0x304b, 0x1d56, 0x46e5, 0xa925, 0x2fb8, 0x419e, 0x45ec, 0x41b4, 0x406d, 0x13e1, 0x426b, 0x4095, 0x4262, 0x15d2, 0x443f, 0x41d1, 0xbfcb, 0x2b00, 0x4319, 0xb229, 0xb21e, 0x4277, 0xbf35, 0xb28c, 0xb22d, 0x4558, 0xbad2, 0x43b9, 0xbac8, 0x404d, 0xba27, 0x4236, 0xb217, 0xacb6, 0x3991, 0xb271, 0xac00, 0xb2ba, 0x3bf7, 0x438b, 0xb2b9, 0x26a3, 0x431d, 0x2cf2, 0x421f, 0x23ac, 0x41db, 0x40c1, 0xb2c7, 0x1678, 0x427c, 0xbf8b, 0x3bd6, 0x43b7, 0x041a, 0x42ab, 0x21b7, 0x3236, 0x1892, 0x149e, 0xb27f, 0xb28e, 0x0325, 0xba7c, 0x43a8, 0x4242, 0x441c, 0xbaf4, 0x4210, 0x417f, 0x401e, 0x4252, 0xb2d2, 0x4321, 0x4062, 0xb2d4, 0x3dcc, 0xbfac, 0x40ab, 0xb00f, 0xb08f, 0x4148, 0x41e1, 0xb0a5, 0x41b9, 0x0630, 0x0865, 0x43e9, 0xb0c2, 0x4551, 0x4131, 0x41c5, 0x4014, 0x2bfc, 0x42a0, 0xbf4e, 0x407f, 0x41f6, 0x1b7a, 0x0220, 0x41ac, 0x099e, 0x46b4, 0x42d8, 0xb223, 0x423d, 0x42d1, 0x1d10, 0x41bd, 0x4188, 0x4165, 0x12c7, 0x4174, 0x4018, 0x41e2, 0x414e, 0xbae3, 0x4250, 0x43f9, 0x1ed9, 0x28a1, 0x0e3f, 0x408e, 0x43db, 0xbf9b, 0x4009, 0xb295, 0x4131, 0xb275, 0x4099, 0xb2b9, 0x0ea5, 0x456c, 0x1eaa, 0xa4ed, 0xb085, 0x4194, 0x4197, 0x0d72, 0xaffc, 0x4031, 0x0194, 0xadd6, 0xb270, 0x1eac, 0x1981, 0x2bdd, 0xba1f, 0xbf70, 0xbfbf, 0xbad7, 0x4073, 0x4454, 0xba1d, 0x446b, 0x419e, 0x4021, 0xbfd0, 0x40a7, 0x1e5e, 0xbf63, 0xb2cf, 0x462a, 0xba68, 0x0c00, 0xb02a, 0xb070, 0x1318, 0x2880, 0xb061, 0x0995, 0x4273, 0xb283, 0xbad8, 0x1b22, 0x40a1, 0x15d5, 0xbf84, 0x419e, 0xb274, 0xba71, 0x46d4, 0x45b1, 0x432e, 0x1fb3, 0x381a, 0x42d1, 0x4183, 0x4588, 0x408b, 0x4599, 0x43f9, 0x3324, 0x4338, 0xbf60, 0xbff0, 0xbff0, 0x1fb8, 0xbafc, 0x421c, 0x40d7, 0x40fb, 0xbf79, 0xbade, 0xba55, 0x2335, 0xb047, 0xbfb8, 0x403b, 0xb0a0, 0xbad2, 0x1c8b, 0xba65, 0x3c31, 0x407d, 0x1992, 0x2c0f, 0x0e6d, 0x2f2a, 0x4119, 0xb218, 0x0128, 0x4216, 0xa76e, 0x4390, 0x4045, 0x466f, 0xba55, 0x43e0, 0x3c13, 0x41f9, 0xbf91, 0x3368, 0x1acc, 0x4040, 0x4349, 0x406d, 0x408e, 0xbaf5, 0x42f7, 0x400c, 0xb21a, 0x4306, 0xb253, 0x41e1, 0x32fa, 0x3fdf, 0xa3d0, 0xb207, 0x402c, 0xb25a, 0xba45, 0xbfcf, 0xa252, 0x443a, 0x40c1, 0x0341, 0xbf05, 0xabce, 0x4354, 0x4559, 0xb000, 0x40c2, 0x02ff, 0xb288, 0x425d, 0x40ec, 0x4599, 0xba76, 0x4198, 0x1188, 0x385c, 0x193e, 0x411e, 0xba18, 0xbf47, 0x41ff, 0x1b0c, 0x4298, 0x40c5, 0xb235, 0xba44, 0x3560, 0x4346, 0x415a, 0x199e, 0x1b6e, 0xbad1, 0x45b6, 0x42a7, 0x4253, 0xa5a4, 0x4384, 0x420a, 0xb0aa, 0xbf11, 0x3731, 0x12c0, 0xadb1, 0x426f, 0x4310, 0x2243, 0x25ec, 0xb2e4, 0x0845, 0xbf97, 0x426f, 0x425f, 0x40d3, 0xb2c2, 0x3293, 0x4610, 0xa6f4, 0x4376, 0x1838, 0x4143, 0x179e, 0x4381, 0x1922, 0x15ff, 0x41b3, 0xb2fb, 0x188a, 0xbf3e, 0xb028, 0x3da2, 0x4227, 0x43ef, 0x4079, 0xb055, 0x429d, 0xba59, 0x2586, 0xb0ad, 0x19bf, 0x41fd, 0x4023, 0xb2a1, 0x43e8, 0xa823, 0x4266, 0x41f9, 0x42a1, 0xb228, 0x2c34, 0x41da, 0xb211, 0x16da, 0x2895, 0x4392, 0x2eea, 0xbf24, 0x4255, 0x1922, 0x40c6, 0xbaf3, 0xb2ff, 0x40dc, 0x4141, 0x437f, 0x43c4, 0xb283, 0x1b59, 0x4198, 0x3aba, 0x1f81, 0x1f5b, 0x429a, 0x4204, 0x4037, 0xaefc, 0x183d, 0x1309, 0x4563, 0x09a5, 0xb207, 0xba1f, 0xbfa0, 0x1cd7, 0xbfa3, 0x4258, 0xb205, 0x427a, 0x43b2, 0x41cc, 0x1797, 0x43de, 0xb227, 0x1a3c, 0x4038, 0x4355, 0x4033, 0xbf6b, 0x42f5, 0xb083, 0x4396, 0x3d30, 0x0b59, 0x38cb, 0x4319, 0x37ab, 0x425a, 0x251a, 0x41fd, 0xb2c8, 0x454b, 0xbaea, 0x40ec, 0x43fd, 0x4286, 0x445e, 0x4689, 0xb270, 0x4011, 0x2d71, 0xb0df, 0x4026, 0xa569, 0xbf2e, 0x4121, 0x4393, 0x40e1, 0x4770, 0xe7fe + ], + StartRegs = [0x0542461d, 0xf5f04e12, 0x8bc7b1fe, 0xbd178d21, 0x26456cae, 0xca50d85d, 0xf3453942, 0x72f63230, 0x00bbda65, 0xae6250a2, 0xb5896c69, 0xd8e9e883, 0x00e97798, 0xcb5e9574, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0xffffffc9, 0x00000000, 0x00000000, 0x00000000, 0xfffff79f, 0x00001998, 0xfffff389, 0xfffff84a, 0x00e9e597, 0x00000000, 0xb58955e6, 0xfffffff5, 0xb58955e6, 0x000000c1, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x0039, 0x3a23, 0x427e, 0x40e9, 0xb280, 0x0a50, 0xbfc9, 0x4114, 0x0bf0, 0x1254, 0xbf90, 0x2ad8, 0x440a, 0x414d, 0xbae8, 0xb243, 0xb01e, 0x2da6, 0xae3f, 0x4280, 0x445e, 0x4080, 0x4080, 0x3da8, 0x29dc, 0x2d10, 0x4373, 0x426e, 0xbf22, 0xb24b, 0x424a, 0x4332, 0x40a5, 0x46e3, 0xb28a, 0x42af, 0x4574, 0x1219, 0x1a9c, 0x43df, 0x438a, 0x43dc, 0xbfa9, 0x4318, 0xb28d, 0xb278, 0x0f00, 0xa9a1, 0x4359, 0xb0d5, 0xbf9a, 0x4283, 0xb2bf, 0x1f9a, 0xbfd0, 0x4054, 0x439c, 0xbfd0, 0x4243, 0xb026, 0x0245, 0xbf3b, 0x1b0d, 0x21ca, 0x1fff, 0x4199, 0x1a16, 0x425a, 0xb05a, 0x43cb, 0xbfd2, 0xba68, 0x434e, 0xb237, 0x438c, 0xa6ac, 0xbfcb, 0xbad2, 0x3246, 0x4255, 0xb263, 0x0abb, 0xaec5, 0x2008, 0xb049, 0xa1ea, 0xaa8d, 0xb2d9, 0x2152, 0xb27a, 0x4121, 0xb05a, 0xac70, 0x4138, 0xae5b, 0x2ee8, 0x18cd, 0xb253, 0x4143, 0xba11, 0x4483, 0x41b1, 0xbfcd, 0x1bac, 0x4222, 0x41e5, 0xa4ae, 0x1904, 0x4070, 0x1ff3, 0xb290, 0x40b3, 0xb031, 0x4098, 0x4624, 0x1a74, 0x4284, 0x05c1, 0x401d, 0x416b, 0xb238, 0xbf25, 0x434d, 0x1fa2, 0x40b2, 0x11e3, 0xb2cc, 0x413a, 0x41b7, 0xbf94, 0x43d4, 0x189b, 0xbacf, 0x4571, 0x430f, 0x1056, 0xba57, 0xb202, 0x1be7, 0x42eb, 0xb20e, 0x4544, 0x3f1d, 0xbfbf, 0x18ff, 0xbafa, 0x1a37, 0x4352, 0x0bfe, 0x1eec, 0x42e9, 0xbfd0, 0x419b, 0xbf6c, 0x3b65, 0x4115, 0x4051, 0xbfe0, 0x0eb4, 0x40b3, 0xa454, 0x4399, 0xb05f, 0x39c5, 0x4061, 0x1cb2, 0xbf0a, 0x369f, 0x210e, 0xb0b8, 0xbaf7, 0xa0a5, 0x4197, 0x45ce, 0x4073, 0x1918, 0xb2b8, 0x02a5, 0xb2e8, 0xbf79, 0xb24a, 0x43c6, 0x4034, 0xb08e, 0x46cc, 0x42be, 0x050b, 0x414a, 0x432e, 0x422b, 0xba14, 0x18f5, 0x372a, 0x239e, 0xb0e7, 0x1843, 0x4148, 0x465c, 0xb0b9, 0x3b44, 0x420e, 0xbf9a, 0x4299, 0x39a6, 0x2008, 0x2573, 0x4154, 0xb022, 0xae69, 0x417c, 0x3cbf, 0xb29d, 0x2b2d, 0xba06, 0x4175, 0xb222, 0xbfe4, 0xb205, 0x430a, 0xb211, 0x43ff, 0x0a2c, 0x41e5, 0x1575, 0x0b8d, 0xaf72, 0x1b99, 0x1e09, 0x4149, 0x40b8, 0x1d9c, 0x0c47, 0xba36, 0xb279, 0x4001, 0xb0d3, 0x1b1d, 0xbf13, 0xb219, 0x25db, 0x2745, 0x40c1, 0x1830, 0x4117, 0x428b, 0xb297, 0xb0b8, 0x406e, 0x40ec, 0x41f2, 0x42a1, 0x40da, 0x1df0, 0xaad8, 0x0ad3, 0x40f2, 0x42ae, 0xbf04, 0xba01, 0xae3e, 0xb26a, 0x1dbf, 0x442a, 0xb01f, 0x4051, 0x4147, 0xadb7, 0x420a, 0x1b8a, 0x18b9, 0xb0ab, 0xab57, 0xb072, 0x425d, 0x434a, 0xb2e0, 0xb280, 0xba33, 0x2c1d, 0x430f, 0x1080, 0xbf34, 0x41af, 0xba02, 0xb09a, 0x43d2, 0x1971, 0x3a78, 0x42e3, 0x4300, 0x4482, 0x1bbf, 0x02dd, 0x422a, 0x41a2, 0xbfdd, 0x4592, 0x41af, 0xba74, 0x15b3, 0x42cf, 0xba5b, 0xb2e1, 0xba39, 0x1e81, 0x461f, 0x415f, 0x4173, 0x4253, 0x4041, 0x405a, 0x1f00, 0xbf92, 0xa1f5, 0xb260, 0x456a, 0xb2ff, 0x3029, 0x45a5, 0x418f, 0xb01b, 0xba4d, 0x2658, 0x4384, 0xba5c, 0x3e1b, 0x35d4, 0x174a, 0x09ac, 0xb009, 0xb2ee, 0xb255, 0xbfda, 0x2f7e, 0xa637, 0x41d5, 0x1d37, 0xb0cc, 0x100a, 0x288d, 0x1d1f, 0x4129, 0xba7f, 0x19c8, 0xbf5f, 0x43ee, 0xb0d3, 0x4111, 0x4142, 0xb283, 0x1fd6, 0x4498, 0x43b5, 0x194a, 0x4124, 0x3b97, 0x4670, 0x427c, 0x45dd, 0x410c, 0x4377, 0xbadd, 0x4184, 0x424c, 0x40f7, 0xb25c, 0x4052, 0x2cdd, 0xbfa6, 0xbfe0, 0x416f, 0xb048, 0x4126, 0x40f3, 0xb0f5, 0x4153, 0x13cf, 0xbfd0, 0x41fd, 0x4072, 0x0639, 0x22bf, 0x3c4b, 0x0edb, 0x401d, 0x1f77, 0x4126, 0x4580, 0xbfe8, 0x1bd0, 0xb0fd, 0x2d03, 0x43e4, 0x4418, 0x405a, 0x41cd, 0x28aa, 0x425c, 0x4107, 0xa420, 0x4678, 0xba4f, 0xa155, 0x41e3, 0x4430, 0x400f, 0xba18, 0xba08, 0xb219, 0xbad8, 0xb2e6, 0xbfa2, 0x0925, 0x40f6, 0xba5f, 0xb0e6, 0xbf70, 0xb253, 0x40fd, 0x430e, 0x3042, 0x40ad, 0x4016, 0xba0f, 0xbf5e, 0x4544, 0x3faf, 0x464f, 0x1cb3, 0xbf90, 0x432c, 0x277c, 0x41e9, 0x42d3, 0x4181, 0x4149, 0xb27c, 0x19f6, 0x1e2f, 0x4118, 0x426f, 0xb214, 0xba78, 0x418b, 0xa945, 0x15e6, 0xba23, 0xb242, 0xbfd0, 0x4322, 0xbfab, 0x41cb, 0x4194, 0xba49, 0x4199, 0x42c0, 0xb2b0, 0x43d2, 0xb21d, 0x3ad9, 0x3b7a, 0xba1c, 0xbff0, 0x1b38, 0xbfc6, 0x42a1, 0xba7b, 0x4051, 0xba14, 0x413e, 0xbf85, 0xbfc0, 0xba1a, 0x43cc, 0x44f5, 0xb013, 0xba6c, 0x3c27, 0x4057, 0xb2f1, 0x1bb7, 0x1d41, 0xb28f, 0x42a1, 0xbfda, 0x1d46, 0xb0da, 0xb244, 0xa4aa, 0xb2b6, 0x1b67, 0x2f35, 0x1f03, 0x41cb, 0xb271, 0xbac4, 0x059f, 0x423a, 0xba22, 0x40e9, 0xb0e1, 0xb01b, 0xa845, 0xb063, 0xbf8c, 0x43a3, 0x40b4, 0x39d6, 0x4175, 0x4282, 0xb0de, 0x4037, 0x41e0, 0x42aa, 0xba1c, 0x41ae, 0x1d11, 0xbfa4, 0x186a, 0x4310, 0x432e, 0x1856, 0xb229, 0x4079, 0xa1d2, 0xbf80, 0x4665, 0x4225, 0xbfe2, 0x4372, 0x42a3, 0x448c, 0xbf7c, 0x4293, 0xba76, 0x2941, 0x42ff, 0x15ef, 0xbaee, 0x1735, 0x407c, 0x40c1, 0x1fab, 0xbf44, 0x43cd, 0xb2a0, 0xb2ad, 0x405e, 0x43d4, 0x40a5, 0x4128, 0x2340, 0x43c0, 0x027b, 0x434d, 0x1e76, 0xba2d, 0x4119, 0xbf0d, 0x1c53, 0x0600, 0x40dd, 0x4183, 0x1a96, 0x4167, 0x1c55, 0x4333, 0x46ad, 0xb22e, 0xb244, 0x41ee, 0x40da, 0x4063, 0x022b, 0xb26b, 0x43f3, 0x435a, 0x186e, 0xba0f, 0x1894, 0x4212, 0x4073, 0x41ca, 0x4368, 0xbfb9, 0x2971, 0xbf60, 0xb2f6, 0x43bc, 0xbf9e, 0x4651, 0xb224, 0xa186, 0x40ba, 0x415f, 0x42b0, 0xb044, 0x410c, 0x4035, 0x46c3, 0x3fa3, 0x400a, 0xbf60, 0xbf07, 0xb00a, 0xb263, 0x1cd7, 0x4119, 0x463a, 0x42c9, 0x4307, 0x1f80, 0x030c, 0xb2f0, 0x427c, 0x4619, 0x438a, 0xbfb1, 0x4178, 0x4197, 0x425b, 0x41fd, 0xb26f, 0x4101, 0xb08d, 0x2e09, 0xb072, 0x413a, 0xb281, 0x1eee, 0xaac3, 0x4175, 0x405d, 0x41d8, 0x4665, 0x418b, 0x458a, 0x4059, 0xac9b, 0x3661, 0x4332, 0xbf3a, 0xba5d, 0x4332, 0x4458, 0xb290, 0x1aa8, 0x42db, 0xa756, 0xb2df, 0x284d, 0x1cf5, 0x4148, 0x416b, 0x4445, 0x4114, 0x44aa, 0x4455, 0x40b5, 0xb01a, 0xb249, 0xbad0, 0x1fec, 0x4025, 0x19c2, 0x2014, 0x40c4, 0x42b8, 0xbf93, 0x415b, 0xb08a, 0x4363, 0x43ee, 0xba7e, 0xb2ec, 0xb28d, 0xb0e9, 0xb069, 0x43f1, 0xb2d9, 0xb254, 0x436c, 0x4479, 0x4345, 0xb0d7, 0xba17, 0x4213, 0x46d1, 0x30a5, 0x2e55, 0xbf4f, 0xba63, 0x4426, 0x363e, 0xa9e7, 0x4294, 0xb257, 0x20d4, 0xb22a, 0x1b17, 0x43e6, 0x419e, 0x40cc, 0xaf14, 0xba0b, 0xa0e6, 0xb086, 0x42a3, 0x28ed, 0x43a1, 0x427c, 0xb2f0, 0x1ccc, 0xba6c, 0x41b9, 0xb022, 0xba4f, 0x19a4, 0xbf12, 0x40a4, 0x412b, 0x412d, 0x1e6a, 0x4122, 0x412c, 0x4365, 0x0f73, 0xb2b8, 0x40ca, 0x07ee, 0x3940, 0x200e, 0x377a, 0x4167, 0x40d2, 0x4311, 0x4351, 0x433c, 0x1749, 0x1c33, 0x4137, 0xbf90, 0x1fc8, 0xbfc7, 0x43d6, 0x4294, 0x4338, 0xb27b, 0x4268, 0x2cd4, 0xbf1f, 0x41af, 0xbac7, 0x413b, 0x4099, 0x411f, 0x4270, 0x43e7, 0x40bc, 0xbfdc, 0x425a, 0x4489, 0x4004, 0x4162, 0x2867, 0x454d, 0x1607, 0xba54, 0xb2e4, 0x40c2, 0xbff0, 0x1641, 0xb2b1, 0xbf1d, 0x4560, 0x4371, 0xb2ca, 0x2dc0, 0x41ae, 0x4290, 0x43a2, 0x02d6, 0x1e8f, 0xa801, 0xb054, 0xb03f, 0x4204, 0xba5e, 0x1d4b, 0x42ba, 0x11a0, 0x1f7f, 0xba40, 0x421d, 0xba0d, 0xbacc, 0x434c, 0x4369, 0xbfb5, 0x0d27, 0x2c32, 0x4057, 0x4215, 0x438a, 0xb26c, 0xb028, 0x438a, 0x432d, 0x40a6, 0x0e5c, 0xb224, 0x410c, 0x40f8, 0xa486, 0x421f, 0x0fd8, 0xbf51, 0xab22, 0x135b, 0x1bad, 0x1afa, 0x43de, 0x43cc, 0x2f57, 0x41ff, 0xb27f, 0x15b7, 0x4362, 0xbf03, 0x4084, 0x444e, 0xb21c, 0x4285, 0x41d1, 0x199f, 0x4199, 0x1b47, 0xb2ee, 0x4150, 0xbfd5, 0x432e, 0xa445, 0x40b2, 0x41f0, 0xbac4, 0x45a9, 0x1ee8, 0x0504, 0x410d, 0x34f6, 0x4096, 0x34d1, 0xb26e, 0x439d, 0x24b8, 0x4299, 0x1226, 0x4009, 0xbf46, 0xbff0, 0x42a0, 0x40f7, 0x42b7, 0x43f7, 0x4164, 0xaa14, 0x424a, 0x45d8, 0x414c, 0xbf9d, 0xb218, 0x4223, 0x4430, 0x4036, 0x4163, 0xb0ac, 0xbfaa, 0x409d, 0xb2db, 0x0ae2, 0xb23b, 0xb218, 0x1a2c, 0x441b, 0xa0d2, 0x0e6a, 0xbfb9, 0x3fec, 0x22c2, 0x3012, 0x43ec, 0x1c2c, 0x4264, 0x42f9, 0xb2a2, 0xba13, 0xb270, 0x41dd, 0xb28f, 0x3315, 0x4267, 0x404a, 0x40b8, 0x4077, 0xbf8a, 0x4287, 0x0ce2, 0x406e, 0xbf2b, 0x1ab6, 0xb0aa, 0xbf90, 0xb2c4, 0x4666, 0x1af4, 0xba17, 0x4049, 0x4179, 0xb01b, 0x4154, 0x42e8, 0xb2dc, 0x431f, 0x4029, 0x4442, 0x19ff, 0x3b2a, 0x1a44, 0x1ac3, 0x160c, 0xb06d, 0x31fd, 0xb073, 0x4313, 0x3f1b, 0x43a2, 0xb22f, 0xa562, 0xbfb1, 0xba65, 0xb0d2, 0x1c51, 0x4158, 0xb27e, 0x40b8, 0x43fd, 0x4294, 0xb042, 0xba17, 0xb2ff, 0xbfdf, 0x400f, 0x3598, 0x404c, 0x4101, 0xb202, 0x2e65, 0x417a, 0xb05b, 0x1cd6, 0xab8e, 0x0d74, 0xbff0, 0x3f0d, 0xbadb, 0x0dce, 0x435f, 0xb269, 0xb291, 0x42e0, 0x46bd, 0x41c9, 0xbf63, 0xac82, 0x194d, 0x1cb3, 0x42db, 0xba49, 0x41dd, 0x40b3, 0x1c57, 0x43c3, 0xbf9c, 0x1d84, 0xb2bd, 0xb2c2, 0xbfe2, 0x1df6, 0x405c, 0x4022, 0x4173, 0x423f, 0x40ce, 0x4198, 0x42d3, 0x1cac, 0xbf65, 0x42bf, 0xba1c, 0x1889, 0x42c2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xaa459540, 0xb7417607, 0x90b1ad8e, 0x16822de0, 0x187003f9, 0x872131ae, 0x3224d4e1, 0x42eca858, 0x011e7d28, 0x6dc708e1, 0xb65556a7, 0xb63bce08, 0xc50698a6, 0x40eb158e, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x023ec6b9, 0x0080b091, 0x00000060, 0xfee09ca6, 0x00006364, 0x00006362, 0x00000000, 0x00006362, 0x011f635a, 0xc060e558, 0xc060e558, 0x011f635a, 0x6dc72045, 0x00028578, 0x00000000, 0x000001d0 }, + Instructions = [0x0039, 0x3a23, 0x427e, 0x40e9, 0xb280, 0x0a50, 0xbfc9, 0x4114, 0x0bf0, 0x1254, 0xbf90, 0x2ad8, 0x440a, 0x414d, 0xbae8, 0xb243, 0xb01e, 0x2da6, 0xae3f, 0x4280, 0x445e, 0x4080, 0x4080, 0x3da8, 0x29dc, 0x2d10, 0x4373, 0x426e, 0xbf22, 0xb24b, 0x424a, 0x4332, 0x40a5, 0x46e3, 0xb28a, 0x42af, 0x4574, 0x1219, 0x1a9c, 0x43df, 0x438a, 0x43dc, 0xbfa9, 0x4318, 0xb28d, 0xb278, 0x0f00, 0xa9a1, 0x4359, 0xb0d5, 0xbf9a, 0x4283, 0xb2bf, 0x1f9a, 0xbfd0, 0x4054, 0x439c, 0xbfd0, 0x4243, 0xb026, 0x0245, 0xbf3b, 0x1b0d, 0x21ca, 0x1fff, 0x4199, 0x1a16, 0x425a, 0xb05a, 0x43cb, 0xbfd2, 0xba68, 0x434e, 0xb237, 0x438c, 0xa6ac, 0xbfcb, 0xbad2, 0x3246, 0x4255, 0xb263, 0x0abb, 0xaec5, 0x2008, 0xb049, 0xa1ea, 0xaa8d, 0xb2d9, 0x2152, 0xb27a, 0x4121, 0xb05a, 0xac70, 0x4138, 0xae5b, 0x2ee8, 0x18cd, 0xb253, 0x4143, 0xba11, 0x4483, 0x41b1, 0xbfcd, 0x1bac, 0x4222, 0x41e5, 0xa4ae, 0x1904, 0x4070, 0x1ff3, 0xb290, 0x40b3, 0xb031, 0x4098, 0x4624, 0x1a74, 0x4284, 0x05c1, 0x401d, 0x416b, 0xb238, 0xbf25, 0x434d, 0x1fa2, 0x40b2, 0x11e3, 0xb2cc, 0x413a, 0x41b7, 0xbf94, 0x43d4, 0x189b, 0xbacf, 0x4571, 0x430f, 0x1056, 0xba57, 0xb202, 0x1be7, 0x42eb, 0xb20e, 0x4544, 0x3f1d, 0xbfbf, 0x18ff, 0xbafa, 0x1a37, 0x4352, 0x0bfe, 0x1eec, 0x42e9, 0xbfd0, 0x419b, 0xbf6c, 0x3b65, 0x4115, 0x4051, 0xbfe0, 0x0eb4, 0x40b3, 0xa454, 0x4399, 0xb05f, 0x39c5, 0x4061, 0x1cb2, 0xbf0a, 0x369f, 0x210e, 0xb0b8, 0xbaf7, 0xa0a5, 0x4197, 0x45ce, 0x4073, 0x1918, 0xb2b8, 0x02a5, 0xb2e8, 0xbf79, 0xb24a, 0x43c6, 0x4034, 0xb08e, 0x46cc, 0x42be, 0x050b, 0x414a, 0x432e, 0x422b, 0xba14, 0x18f5, 0x372a, 0x239e, 0xb0e7, 0x1843, 0x4148, 0x465c, 0xb0b9, 0x3b44, 0x420e, 0xbf9a, 0x4299, 0x39a6, 0x2008, 0x2573, 0x4154, 0xb022, 0xae69, 0x417c, 0x3cbf, 0xb29d, 0x2b2d, 0xba06, 0x4175, 0xb222, 0xbfe4, 0xb205, 0x430a, 0xb211, 0x43ff, 0x0a2c, 0x41e5, 0x1575, 0x0b8d, 0xaf72, 0x1b99, 0x1e09, 0x4149, 0x40b8, 0x1d9c, 0x0c47, 0xba36, 0xb279, 0x4001, 0xb0d3, 0x1b1d, 0xbf13, 0xb219, 0x25db, 0x2745, 0x40c1, 0x1830, 0x4117, 0x428b, 0xb297, 0xb0b8, 0x406e, 0x40ec, 0x41f2, 0x42a1, 0x40da, 0x1df0, 0xaad8, 0x0ad3, 0x40f2, 0x42ae, 0xbf04, 0xba01, 0xae3e, 0xb26a, 0x1dbf, 0x442a, 0xb01f, 0x4051, 0x4147, 0xadb7, 0x420a, 0x1b8a, 0x18b9, 0xb0ab, 0xab57, 0xb072, 0x425d, 0x434a, 0xb2e0, 0xb280, 0xba33, 0x2c1d, 0x430f, 0x1080, 0xbf34, 0x41af, 0xba02, 0xb09a, 0x43d2, 0x1971, 0x3a78, 0x42e3, 0x4300, 0x4482, 0x1bbf, 0x02dd, 0x422a, 0x41a2, 0xbfdd, 0x4592, 0x41af, 0xba74, 0x15b3, 0x42cf, 0xba5b, 0xb2e1, 0xba39, 0x1e81, 0x461f, 0x415f, 0x4173, 0x4253, 0x4041, 0x405a, 0x1f00, 0xbf92, 0xa1f5, 0xb260, 0x456a, 0xb2ff, 0x3029, 0x45a5, 0x418f, 0xb01b, 0xba4d, 0x2658, 0x4384, 0xba5c, 0x3e1b, 0x35d4, 0x174a, 0x09ac, 0xb009, 0xb2ee, 0xb255, 0xbfda, 0x2f7e, 0xa637, 0x41d5, 0x1d37, 0xb0cc, 0x100a, 0x288d, 0x1d1f, 0x4129, 0xba7f, 0x19c8, 0xbf5f, 0x43ee, 0xb0d3, 0x4111, 0x4142, 0xb283, 0x1fd6, 0x4498, 0x43b5, 0x194a, 0x4124, 0x3b97, 0x4670, 0x427c, 0x45dd, 0x410c, 0x4377, 0xbadd, 0x4184, 0x424c, 0x40f7, 0xb25c, 0x4052, 0x2cdd, 0xbfa6, 0xbfe0, 0x416f, 0xb048, 0x4126, 0x40f3, 0xb0f5, 0x4153, 0x13cf, 0xbfd0, 0x41fd, 0x4072, 0x0639, 0x22bf, 0x3c4b, 0x0edb, 0x401d, 0x1f77, 0x4126, 0x4580, 0xbfe8, 0x1bd0, 0xb0fd, 0x2d03, 0x43e4, 0x4418, 0x405a, 0x41cd, 0x28aa, 0x425c, 0x4107, 0xa420, 0x4678, 0xba4f, 0xa155, 0x41e3, 0x4430, 0x400f, 0xba18, 0xba08, 0xb219, 0xbad8, 0xb2e6, 0xbfa2, 0x0925, 0x40f6, 0xba5f, 0xb0e6, 0xbf70, 0xb253, 0x40fd, 0x430e, 0x3042, 0x40ad, 0x4016, 0xba0f, 0xbf5e, 0x4544, 0x3faf, 0x464f, 0x1cb3, 0xbf90, 0x432c, 0x277c, 0x41e9, 0x42d3, 0x4181, 0x4149, 0xb27c, 0x19f6, 0x1e2f, 0x4118, 0x426f, 0xb214, 0xba78, 0x418b, 0xa945, 0x15e6, 0xba23, 0xb242, 0xbfd0, 0x4322, 0xbfab, 0x41cb, 0x4194, 0xba49, 0x4199, 0x42c0, 0xb2b0, 0x43d2, 0xb21d, 0x3ad9, 0x3b7a, 0xba1c, 0xbff0, 0x1b38, 0xbfc6, 0x42a1, 0xba7b, 0x4051, 0xba14, 0x413e, 0xbf85, 0xbfc0, 0xba1a, 0x43cc, 0x44f5, 0xb013, 0xba6c, 0x3c27, 0x4057, 0xb2f1, 0x1bb7, 0x1d41, 0xb28f, 0x42a1, 0xbfda, 0x1d46, 0xb0da, 0xb244, 0xa4aa, 0xb2b6, 0x1b67, 0x2f35, 0x1f03, 0x41cb, 0xb271, 0xbac4, 0x059f, 0x423a, 0xba22, 0x40e9, 0xb0e1, 0xb01b, 0xa845, 0xb063, 0xbf8c, 0x43a3, 0x40b4, 0x39d6, 0x4175, 0x4282, 0xb0de, 0x4037, 0x41e0, 0x42aa, 0xba1c, 0x41ae, 0x1d11, 0xbfa4, 0x186a, 0x4310, 0x432e, 0x1856, 0xb229, 0x4079, 0xa1d2, 0xbf80, 0x4665, 0x4225, 0xbfe2, 0x4372, 0x42a3, 0x448c, 0xbf7c, 0x4293, 0xba76, 0x2941, 0x42ff, 0x15ef, 0xbaee, 0x1735, 0x407c, 0x40c1, 0x1fab, 0xbf44, 0x43cd, 0xb2a0, 0xb2ad, 0x405e, 0x43d4, 0x40a5, 0x4128, 0x2340, 0x43c0, 0x027b, 0x434d, 0x1e76, 0xba2d, 0x4119, 0xbf0d, 0x1c53, 0x0600, 0x40dd, 0x4183, 0x1a96, 0x4167, 0x1c55, 0x4333, 0x46ad, 0xb22e, 0xb244, 0x41ee, 0x40da, 0x4063, 0x022b, 0xb26b, 0x43f3, 0x435a, 0x186e, 0xba0f, 0x1894, 0x4212, 0x4073, 0x41ca, 0x4368, 0xbfb9, 0x2971, 0xbf60, 0xb2f6, 0x43bc, 0xbf9e, 0x4651, 0xb224, 0xa186, 0x40ba, 0x415f, 0x42b0, 0xb044, 0x410c, 0x4035, 0x46c3, 0x3fa3, 0x400a, 0xbf60, 0xbf07, 0xb00a, 0xb263, 0x1cd7, 0x4119, 0x463a, 0x42c9, 0x4307, 0x1f80, 0x030c, 0xb2f0, 0x427c, 0x4619, 0x438a, 0xbfb1, 0x4178, 0x4197, 0x425b, 0x41fd, 0xb26f, 0x4101, 0xb08d, 0x2e09, 0xb072, 0x413a, 0xb281, 0x1eee, 0xaac3, 0x4175, 0x405d, 0x41d8, 0x4665, 0x418b, 0x458a, 0x4059, 0xac9b, 0x3661, 0x4332, 0xbf3a, 0xba5d, 0x4332, 0x4458, 0xb290, 0x1aa8, 0x42db, 0xa756, 0xb2df, 0x284d, 0x1cf5, 0x4148, 0x416b, 0x4445, 0x4114, 0x44aa, 0x4455, 0x40b5, 0xb01a, 0xb249, 0xbad0, 0x1fec, 0x4025, 0x19c2, 0x2014, 0x40c4, 0x42b8, 0xbf93, 0x415b, 0xb08a, 0x4363, 0x43ee, 0xba7e, 0xb2ec, 0xb28d, 0xb0e9, 0xb069, 0x43f1, 0xb2d9, 0xb254, 0x436c, 0x4479, 0x4345, 0xb0d7, 0xba17, 0x4213, 0x46d1, 0x30a5, 0x2e55, 0xbf4f, 0xba63, 0x4426, 0x363e, 0xa9e7, 0x4294, 0xb257, 0x20d4, 0xb22a, 0x1b17, 0x43e6, 0x419e, 0x40cc, 0xaf14, 0xba0b, 0xa0e6, 0xb086, 0x42a3, 0x28ed, 0x43a1, 0x427c, 0xb2f0, 0x1ccc, 0xba6c, 0x41b9, 0xb022, 0xba4f, 0x19a4, 0xbf12, 0x40a4, 0x412b, 0x412d, 0x1e6a, 0x4122, 0x412c, 0x4365, 0x0f73, 0xb2b8, 0x40ca, 0x07ee, 0x3940, 0x200e, 0x377a, 0x4167, 0x40d2, 0x4311, 0x4351, 0x433c, 0x1749, 0x1c33, 0x4137, 0xbf90, 0x1fc8, 0xbfc7, 0x43d6, 0x4294, 0x4338, 0xb27b, 0x4268, 0x2cd4, 0xbf1f, 0x41af, 0xbac7, 0x413b, 0x4099, 0x411f, 0x4270, 0x43e7, 0x40bc, 0xbfdc, 0x425a, 0x4489, 0x4004, 0x4162, 0x2867, 0x454d, 0x1607, 0xba54, 0xb2e4, 0x40c2, 0xbff0, 0x1641, 0xb2b1, 0xbf1d, 0x4560, 0x4371, 0xb2ca, 0x2dc0, 0x41ae, 0x4290, 0x43a2, 0x02d6, 0x1e8f, 0xa801, 0xb054, 0xb03f, 0x4204, 0xba5e, 0x1d4b, 0x42ba, 0x11a0, 0x1f7f, 0xba40, 0x421d, 0xba0d, 0xbacc, 0x434c, 0x4369, 0xbfb5, 0x0d27, 0x2c32, 0x4057, 0x4215, 0x438a, 0xb26c, 0xb028, 0x438a, 0x432d, 0x40a6, 0x0e5c, 0xb224, 0x410c, 0x40f8, 0xa486, 0x421f, 0x0fd8, 0xbf51, 0xab22, 0x135b, 0x1bad, 0x1afa, 0x43de, 0x43cc, 0x2f57, 0x41ff, 0xb27f, 0x15b7, 0x4362, 0xbf03, 0x4084, 0x444e, 0xb21c, 0x4285, 0x41d1, 0x199f, 0x4199, 0x1b47, 0xb2ee, 0x4150, 0xbfd5, 0x432e, 0xa445, 0x40b2, 0x41f0, 0xbac4, 0x45a9, 0x1ee8, 0x0504, 0x410d, 0x34f6, 0x4096, 0x34d1, 0xb26e, 0x439d, 0x24b8, 0x4299, 0x1226, 0x4009, 0xbf46, 0xbff0, 0x42a0, 0x40f7, 0x42b7, 0x43f7, 0x4164, 0xaa14, 0x424a, 0x45d8, 0x414c, 0xbf9d, 0xb218, 0x4223, 0x4430, 0x4036, 0x4163, 0xb0ac, 0xbfaa, 0x409d, 0xb2db, 0x0ae2, 0xb23b, 0xb218, 0x1a2c, 0x441b, 0xa0d2, 0x0e6a, 0xbfb9, 0x3fec, 0x22c2, 0x3012, 0x43ec, 0x1c2c, 0x4264, 0x42f9, 0xb2a2, 0xba13, 0xb270, 0x41dd, 0xb28f, 0x3315, 0x4267, 0x404a, 0x40b8, 0x4077, 0xbf8a, 0x4287, 0x0ce2, 0x406e, 0xbf2b, 0x1ab6, 0xb0aa, 0xbf90, 0xb2c4, 0x4666, 0x1af4, 0xba17, 0x4049, 0x4179, 0xb01b, 0x4154, 0x42e8, 0xb2dc, 0x431f, 0x4029, 0x4442, 0x19ff, 0x3b2a, 0x1a44, 0x1ac3, 0x160c, 0xb06d, 0x31fd, 0xb073, 0x4313, 0x3f1b, 0x43a2, 0xb22f, 0xa562, 0xbfb1, 0xba65, 0xb0d2, 0x1c51, 0x4158, 0xb27e, 0x40b8, 0x43fd, 0x4294, 0xb042, 0xba17, 0xb2ff, 0xbfdf, 0x400f, 0x3598, 0x404c, 0x4101, 0xb202, 0x2e65, 0x417a, 0xb05b, 0x1cd6, 0xab8e, 0x0d74, 0xbff0, 0x3f0d, 0xbadb, 0x0dce, 0x435f, 0xb269, 0xb291, 0x42e0, 0x46bd, 0x41c9, 0xbf63, 0xac82, 0x194d, 0x1cb3, 0x42db, 0xba49, 0x41dd, 0x40b3, 0x1c57, 0x43c3, 0xbf9c, 0x1d84, 0xb2bd, 0xb2c2, 0xbfe2, 0x1df6, 0x405c, 0x4022, 0x4173, 0x423f, 0x40ce, 0x4198, 0x42d3, 0x1cac, 0xbf65, 0x42bf, 0xba1c, 0x1889, 0x42c2, 0x4770, 0xe7fe + ], + StartRegs = [0xaa459540, 0xb7417607, 0x90b1ad8e, 0x16822de0, 0x187003f9, 0x872131ae, 0x3224d4e1, 0x42eca858, 0x011e7d28, 0x6dc708e1, 0xb65556a7, 0xb63bce08, 0xc50698a6, 0x40eb158e, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x023ec6b9, 0x0080b091, 0x00000060, 0xfee09ca6, 0x00006364, 0x00006362, 0x00000000, 0x00006362, 0x011f635a, 0xc060e558, 0xc060e558, 0x011f635a, 0x6dc72045, 0x00028578, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xbac5, 0x1cc4, 0x3c3f, 0x43b2, 0x408c, 0x4133, 0x4354, 0x4190, 0xbf13, 0x4393, 0xba2e, 0x41f1, 0xb2db, 0xaaa2, 0x4338, 0xbf80, 0xba55, 0x211b, 0x37fa, 0x407b, 0x4103, 0x3bfe, 0xb08f, 0xbf09, 0x413b, 0xa520, 0x4223, 0x1e36, 0xb047, 0x4388, 0x44ed, 0x43b3, 0x180a, 0x41fd, 0x1940, 0x4037, 0x4136, 0x4075, 0xa15f, 0x3b50, 0xb2e2, 0x0a6b, 0x343e, 0xb0b8, 0xae5e, 0x1666, 0xa2f2, 0x42fa, 0x4045, 0xbf3b, 0x4490, 0xb250, 0x4197, 0x406f, 0x1dd6, 0xa912, 0x41b6, 0xa73c, 0x41a3, 0xbf70, 0x40be, 0x1c04, 0x42b0, 0x2e98, 0x27d6, 0xba6a, 0x1eed, 0xb21d, 0x05ea, 0xbfa8, 0xa64d, 0x41e5, 0x42f8, 0x4241, 0xbf90, 0x40b6, 0x4301, 0x3ef6, 0x2451, 0xb076, 0xbf6e, 0x45a5, 0x1fc7, 0x2e04, 0x2934, 0x4098, 0x42e1, 0x102b, 0xbfcb, 0x2cb4, 0xb2ca, 0x1679, 0x2d5a, 0xba39, 0xb280, 0xa5d9, 0x1f1e, 0x3bd4, 0xb20d, 0x4089, 0xba3f, 0x0ef3, 0x392f, 0x40b4, 0xba51, 0x44c8, 0x4340, 0x402b, 0x4400, 0xbf3c, 0x4655, 0x4011, 0xa8bd, 0x057f, 0x432a, 0x1827, 0x434b, 0xbfab, 0xb25c, 0x1467, 0x4101, 0x40b2, 0x43e0, 0x43e1, 0x404c, 0x46bc, 0xb23b, 0x3c33, 0x081d, 0xb006, 0xbaca, 0xb2dc, 0xb202, 0xa346, 0x43a2, 0xb072, 0x4092, 0x1e9d, 0xa2b5, 0x4111, 0xbfac, 0xaf78, 0x2c58, 0x1f71, 0xa7c8, 0xb2ac, 0x3fd4, 0x45cb, 0x44b2, 0x196d, 0x4007, 0x42b5, 0x1953, 0x4049, 0xb0d6, 0xb2e3, 0x4384, 0x1f22, 0x163d, 0xb288, 0xba2f, 0x4226, 0xb292, 0xbf66, 0xba2b, 0xbac8, 0xb0fa, 0xb079, 0x1205, 0xb2f9, 0x43de, 0x3cff, 0x424e, 0x40e0, 0x0cf1, 0x4073, 0x4390, 0x4082, 0x4000, 0x4084, 0xabf0, 0xabd0, 0x0886, 0x466a, 0x41ca, 0xb0ed, 0xb2ec, 0x41fc, 0xbf4b, 0x4478, 0xba51, 0xb2df, 0x419b, 0x1e34, 0xb2f8, 0xbf49, 0xaa3d, 0x41c6, 0x41a3, 0x1aba, 0x40b2, 0x44bd, 0x3d3a, 0xb2bf, 0x28a6, 0x4012, 0x438e, 0x43bc, 0x0ad5, 0xbaca, 0xbf5e, 0x4445, 0x42dc, 0xba1a, 0xa19c, 0x42c9, 0xbfd5, 0x40a1, 0x4048, 0x1893, 0xabd3, 0x404f, 0x4244, 0x4187, 0x4621, 0x4330, 0xb01f, 0x46d3, 0x0861, 0xb2e6, 0x415f, 0x3a61, 0xb24d, 0x1e93, 0x1bac, 0x42d8, 0xb280, 0x40af, 0x40b7, 0x4045, 0xbfbf, 0x40ec, 0xba4c, 0x4494, 0x1454, 0x3538, 0xb2c8, 0xba51, 0x0e63, 0xb276, 0x1d0e, 0x20ee, 0x4337, 0x4204, 0x401e, 0x43b4, 0xb23f, 0x12a9, 0x229b, 0x44ed, 0x444d, 0x407a, 0x1ec5, 0x45c4, 0xba1a, 0xbfc3, 0x3dad, 0x40f6, 0x4085, 0x2377, 0x4418, 0x43a7, 0x2f7d, 0x4071, 0xbfaa, 0x129b, 0xbae5, 0x4691, 0x1be4, 0x1d41, 0x43ce, 0x35f0, 0x1bda, 0x411e, 0xba1a, 0xb2dc, 0x40f8, 0xa3d4, 0x431c, 0x4368, 0xba34, 0x1c65, 0xba13, 0x439f, 0x1b26, 0x4477, 0x40e3, 0x43a2, 0xbf00, 0xaab3, 0xba61, 0x43ab, 0xbf19, 0x4145, 0x40af, 0x182b, 0xb2b4, 0xba74, 0xb0a9, 0x4111, 0x448c, 0x4107, 0x4069, 0x0494, 0x41ef, 0x1af8, 0x42c0, 0x424d, 0x40a4, 0x43da, 0x4246, 0xb260, 0x41cb, 0x403a, 0x424c, 0xba33, 0x43a4, 0x37d0, 0x4390, 0x189b, 0xb2a0, 0xb052, 0xbf83, 0xa25c, 0x24d7, 0xb01e, 0x34d1, 0x3654, 0xb239, 0x1874, 0xba5e, 0xb27a, 0xb24e, 0x406b, 0x43a9, 0x45e2, 0xbafa, 0x4258, 0x393e, 0xbf7b, 0xb2d2, 0xa24e, 0xb293, 0x4027, 0x4268, 0xbf60, 0x4100, 0xb08b, 0x4062, 0x16d0, 0xbf71, 0x4132, 0x4398, 0x41d6, 0x4074, 0x059c, 0x437d, 0xbaf1, 0x400f, 0x4239, 0x0f8a, 0x4387, 0x1e07, 0x40b2, 0xb0a9, 0x4168, 0x43f8, 0xbf84, 0x0189, 0x1606, 0xb0fe, 0x41fa, 0xbfc5, 0x418e, 0x1a73, 0x42bf, 0x4269, 0x41b7, 0xbf95, 0x1abf, 0xac8e, 0x41b7, 0x4249, 0x41e2, 0xb06d, 0x186f, 0x4097, 0x4333, 0x4223, 0x424e, 0x46c4, 0x435b, 0x1c82, 0x416c, 0x40f2, 0xb000, 0xb09b, 0x434a, 0xbac7, 0x4255, 0x365a, 0xb27e, 0x4223, 0xbf2a, 0x4113, 0x411f, 0x4234, 0x3feb, 0xb2bf, 0x436a, 0xb0cd, 0x18e6, 0xa251, 0xbf72, 0x196c, 0xbac9, 0x190f, 0xb065, 0x4222, 0xbf9f, 0x0e34, 0xb234, 0x04ae, 0x401a, 0x19e3, 0xa8be, 0xba60, 0xb0b5, 0xbfd6, 0x4288, 0x375c, 0xb2d6, 0x4269, 0x419e, 0x46c5, 0x228a, 0x467e, 0xba01, 0x2f41, 0x415e, 0xb0d3, 0xb0de, 0x306a, 0x41b2, 0xb251, 0x432f, 0x430c, 0x189f, 0xbf69, 0x4061, 0x4423, 0x0dcf, 0xb272, 0x43e9, 0xa0e9, 0x03b4, 0x4606, 0xba5c, 0x42e5, 0x442d, 0x428f, 0x4044, 0x2c64, 0x4188, 0x4250, 0xa133, 0xbfe1, 0x4467, 0x4379, 0xb209, 0x43ef, 0x10af, 0x42b5, 0x43cd, 0xbad7, 0x4385, 0x1434, 0x4371, 0x44a9, 0xbaff, 0xb2c5, 0xb028, 0x46b1, 0x249e, 0x1a7c, 0x3608, 0x1561, 0x19da, 0x420f, 0x38a2, 0xa417, 0xbf8f, 0x1805, 0x18f3, 0x2abc, 0x44d3, 0xb210, 0x422d, 0xb29e, 0xb2d8, 0x4463, 0x4148, 0xa528, 0x407c, 0x40a0, 0x433e, 0xbfc1, 0x43dc, 0x38b7, 0xb232, 0x43f0, 0x3de3, 0x3077, 0xbf9d, 0x3ccd, 0xb0be, 0xb2c7, 0xba66, 0x420c, 0xb21e, 0x22d8, 0x2e67, 0xba0c, 0x4293, 0x2f4a, 0xba64, 0x413f, 0x1a2d, 0x4177, 0x424a, 0x4258, 0x4280, 0xa986, 0x3839, 0x4171, 0xb055, 0x4330, 0x4233, 0x41a5, 0x1f63, 0xbf78, 0x43c6, 0xb24c, 0x4199, 0xb2bd, 0x42a6, 0x0c98, 0x1f23, 0xb0ce, 0x4159, 0x1e07, 0xbad3, 0xbae3, 0x42db, 0x41bc, 0xb227, 0xba6d, 0x42f3, 0xbf52, 0xb0f4, 0x45c9, 0x4358, 0x4012, 0x411e, 0x41e5, 0x0b04, 0x41af, 0x43d1, 0xbf1e, 0x2603, 0x466d, 0xba17, 0x1fb1, 0x4363, 0xb21e, 0x4221, 0xb093, 0xbadd, 0xba2c, 0xb2a4, 0x43a0, 0xb2f0, 0xb221, 0x4601, 0xbf2b, 0x4629, 0xb07b, 0x0cb6, 0xb262, 0x439e, 0x40d0, 0xb02b, 0x337d, 0xbf03, 0x4683, 0xba7e, 0x18b9, 0x425b, 0xb0e9, 0x467f, 0x22c2, 0xbfba, 0x400a, 0x426b, 0x43b5, 0x3e16, 0x417e, 0xa4af, 0x40c7, 0x4379, 0x4079, 0x2d9d, 0x4374, 0x4333, 0x412e, 0x2fb4, 0xbf70, 0x4295, 0xae48, 0x1be3, 0x41f9, 0xbfd8, 0xb074, 0x4275, 0x45b5, 0x4133, 0x40a1, 0x402a, 0x405f, 0xbfbd, 0x423b, 0x463c, 0xba19, 0x439b, 0x3b6f, 0xb23f, 0x0f1d, 0xba56, 0xb261, 0xba54, 0xa2ae, 0x46bd, 0x43f6, 0x4017, 0xb2b0, 0x4435, 0x40bd, 0x1e76, 0x413e, 0x410b, 0x411b, 0x1a0e, 0x12dc, 0x1d50, 0x42d7, 0x420f, 0x40e3, 0xb2d6, 0xbfa6, 0xb242, 0xb2eb, 0x40e3, 0x4368, 0x24cc, 0x455d, 0x06b0, 0xbf49, 0xb0a0, 0x3dec, 0xba24, 0x432a, 0x4296, 0x40f9, 0xbff0, 0xa816, 0xb27b, 0x4053, 0xb095, 0x42a4, 0x46e2, 0x19c6, 0x421d, 0x406d, 0xbfc1, 0x4226, 0x4101, 0xbafc, 0x427e, 0x29ba, 0x2f83, 0x41b6, 0x4315, 0x4252, 0xbfa0, 0x45f0, 0x0cbd, 0x40dd, 0x1a3c, 0x43c3, 0x4020, 0xbacd, 0x414d, 0x41e7, 0x4323, 0xb25a, 0x1983, 0x17c3, 0xbf8a, 0x40ab, 0x4601, 0x44f9, 0x4080, 0x3d43, 0x09f7, 0x43de, 0x4637, 0x4052, 0x40dc, 0xbaeb, 0x446a, 0x1e28, 0x4007, 0x359a, 0x45ae, 0xab99, 0x23d8, 0x1cb7, 0xb29f, 0x41c3, 0x4463, 0xbf4f, 0x1f1a, 0x42b4, 0xbacd, 0xb27c, 0xb25b, 0x1aa8, 0xadce, 0xbfd0, 0x352d, 0x4383, 0xb26b, 0x43c0, 0xb201, 0x425c, 0x4356, 0x40a4, 0x43f7, 0x40f8, 0xbf6a, 0x4149, 0x3093, 0xba79, 0xba61, 0x431d, 0x1bb2, 0x405d, 0x09e3, 0x43c3, 0xb0da, 0x4116, 0x4561, 0x4094, 0xbfe0, 0xba18, 0xbaf1, 0xbf8c, 0xb225, 0x12db, 0x1aa6, 0x40f3, 0x327f, 0xb2c3, 0x15eb, 0xb22c, 0x27c4, 0xb229, 0x4015, 0xa837, 0xa0aa, 0x4045, 0x44c9, 0xb2cd, 0x416d, 0xbf58, 0x441a, 0xba16, 0x44aa, 0x1be5, 0xb2dd, 0x456e, 0x2da2, 0x4485, 0x3a61, 0x43d4, 0x127d, 0x0f03, 0x4046, 0xa7c2, 0x43ba, 0x422d, 0xb2f8, 0xa357, 0x40bc, 0x1f75, 0xa5db, 0xbf90, 0x42a1, 0x41bc, 0xbf87, 0x1bc0, 0xbf60, 0x3130, 0x40a2, 0x416d, 0x4171, 0x43d6, 0x180c, 0x46c4, 0x1efb, 0xbfad, 0x118b, 0xb211, 0x41cd, 0xba1f, 0xa45a, 0x400a, 0xbfc1, 0xba49, 0x4103, 0x4212, 0xb20b, 0x42d7, 0x42e0, 0x413a, 0xba68, 0x42d4, 0x4241, 0x41b2, 0x427f, 0x42e9, 0xbfa7, 0xb09c, 0x20ae, 0x3704, 0xb2ce, 0x1f73, 0xa18a, 0xbf80, 0x4266, 0xb0d8, 0x419a, 0xbf41, 0x4270, 0x1810, 0x4264, 0x39da, 0x1d65, 0x41a7, 0xa97c, 0x1288, 0xba61, 0x0e71, 0x425c, 0x41e5, 0x4542, 0x42fe, 0x4183, 0xb283, 0x401d, 0x00d1, 0x4232, 0x4246, 0x226e, 0x1918, 0x4299, 0x15ac, 0xbfad, 0x1ce1, 0x2a0a, 0x40a6, 0xb2fd, 0x3635, 0x1933, 0x412c, 0x1439, 0xa558, 0x4220, 0xbf33, 0x43c6, 0x416d, 0x26aa, 0xb213, 0x44e4, 0xbfe4, 0x29dc, 0x1d40, 0x42a2, 0x1ea9, 0x3f4b, 0x2e37, 0xb0e2, 0x0098, 0x427a, 0x4347, 0xbfe0, 0xb0a6, 0x053b, 0xb236, 0xba79, 0x444d, 0x429b, 0xbf94, 0xba27, 0xb2a0, 0x42aa, 0xb2e1, 0x43d0, 0xbf90, 0xba6b, 0xba4d, 0xa3ce, 0xb266, 0x43e6, 0x23cf, 0x422e, 0x4102, 0xaaf3, 0xa539, 0x419a, 0x137f, 0x45d8, 0x4067, 0xbfc2, 0x40f6, 0x416f, 0x08f8, 0x1f01, 0xb22b, 0x40a3, 0x40f9, 0x3a0e, 0x4370, 0xb2ad, 0x437a, 0x16d6, 0x0960, 0x1f6d, 0xa78d, 0x0385, 0xb2c2, 0x41cf, 0xb2f5, 0x1f83, 0xbaef, 0x4077, 0x1b8c, 0xba12, 0x4386, 0x40d0, 0xbf12, 0x40a8, 0xb237, 0x4237, 0xba4f, 0x4296, 0x45c8, 0x1f18, 0x1d76, 0x43ab, 0x3e32, 0x43f0, 0xbf72, 0x1a78, 0x1b64, 0x4028, 0x40cf, 0x43bb, 0x1f2c, 0x438f, 0x1fb8, 0x4282, 0x4669, 0x41d5, 0x1db5, 0xbafd, 0x41d4, 0x11c4, 0x405f, 0x1fb3, 0xb24b, 0x034f, 0x4345, 0x0970, 0x44fd, 0xb06b, 0xbf87, 0xa48d, 0x4492, 0xb095, 0x40b4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xec6fcb87, 0x37fe5171, 0x476101c9, 0xb4b6dc30, 0x961e2dee, 0xdd91c1a4, 0xedf2ecd8, 0xdc6fc622, 0x228a66a9, 0x3398789a, 0xa6476515, 0xda1e950b, 0x49ed8832, 0xb877df50, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x07fffffe, 0x0000285e, 0x00000000, 0x0000005e, 0x00001a14, 0x00000000, 0xffffffd3, 0x050bc000, 0x5622f36b, 0x00002e90, 0x5622f36b, 0xa6476511, 0xac45e6d6, 0x000041e6, 0x00000000, 0x200001d0 }, + Instructions = [0xbac5, 0x1cc4, 0x3c3f, 0x43b2, 0x408c, 0x4133, 0x4354, 0x4190, 0xbf13, 0x4393, 0xba2e, 0x41f1, 0xb2db, 0xaaa2, 0x4338, 0xbf80, 0xba55, 0x211b, 0x37fa, 0x407b, 0x4103, 0x3bfe, 0xb08f, 0xbf09, 0x413b, 0xa520, 0x4223, 0x1e36, 0xb047, 0x4388, 0x44ed, 0x43b3, 0x180a, 0x41fd, 0x1940, 0x4037, 0x4136, 0x4075, 0xa15f, 0x3b50, 0xb2e2, 0x0a6b, 0x343e, 0xb0b8, 0xae5e, 0x1666, 0xa2f2, 0x42fa, 0x4045, 0xbf3b, 0x4490, 0xb250, 0x4197, 0x406f, 0x1dd6, 0xa912, 0x41b6, 0xa73c, 0x41a3, 0xbf70, 0x40be, 0x1c04, 0x42b0, 0x2e98, 0x27d6, 0xba6a, 0x1eed, 0xb21d, 0x05ea, 0xbfa8, 0xa64d, 0x41e5, 0x42f8, 0x4241, 0xbf90, 0x40b6, 0x4301, 0x3ef6, 0x2451, 0xb076, 0xbf6e, 0x45a5, 0x1fc7, 0x2e04, 0x2934, 0x4098, 0x42e1, 0x102b, 0xbfcb, 0x2cb4, 0xb2ca, 0x1679, 0x2d5a, 0xba39, 0xb280, 0xa5d9, 0x1f1e, 0x3bd4, 0xb20d, 0x4089, 0xba3f, 0x0ef3, 0x392f, 0x40b4, 0xba51, 0x44c8, 0x4340, 0x402b, 0x4400, 0xbf3c, 0x4655, 0x4011, 0xa8bd, 0x057f, 0x432a, 0x1827, 0x434b, 0xbfab, 0xb25c, 0x1467, 0x4101, 0x40b2, 0x43e0, 0x43e1, 0x404c, 0x46bc, 0xb23b, 0x3c33, 0x081d, 0xb006, 0xbaca, 0xb2dc, 0xb202, 0xa346, 0x43a2, 0xb072, 0x4092, 0x1e9d, 0xa2b5, 0x4111, 0xbfac, 0xaf78, 0x2c58, 0x1f71, 0xa7c8, 0xb2ac, 0x3fd4, 0x45cb, 0x44b2, 0x196d, 0x4007, 0x42b5, 0x1953, 0x4049, 0xb0d6, 0xb2e3, 0x4384, 0x1f22, 0x163d, 0xb288, 0xba2f, 0x4226, 0xb292, 0xbf66, 0xba2b, 0xbac8, 0xb0fa, 0xb079, 0x1205, 0xb2f9, 0x43de, 0x3cff, 0x424e, 0x40e0, 0x0cf1, 0x4073, 0x4390, 0x4082, 0x4000, 0x4084, 0xabf0, 0xabd0, 0x0886, 0x466a, 0x41ca, 0xb0ed, 0xb2ec, 0x41fc, 0xbf4b, 0x4478, 0xba51, 0xb2df, 0x419b, 0x1e34, 0xb2f8, 0xbf49, 0xaa3d, 0x41c6, 0x41a3, 0x1aba, 0x40b2, 0x44bd, 0x3d3a, 0xb2bf, 0x28a6, 0x4012, 0x438e, 0x43bc, 0x0ad5, 0xbaca, 0xbf5e, 0x4445, 0x42dc, 0xba1a, 0xa19c, 0x42c9, 0xbfd5, 0x40a1, 0x4048, 0x1893, 0xabd3, 0x404f, 0x4244, 0x4187, 0x4621, 0x4330, 0xb01f, 0x46d3, 0x0861, 0xb2e6, 0x415f, 0x3a61, 0xb24d, 0x1e93, 0x1bac, 0x42d8, 0xb280, 0x40af, 0x40b7, 0x4045, 0xbfbf, 0x40ec, 0xba4c, 0x4494, 0x1454, 0x3538, 0xb2c8, 0xba51, 0x0e63, 0xb276, 0x1d0e, 0x20ee, 0x4337, 0x4204, 0x401e, 0x43b4, 0xb23f, 0x12a9, 0x229b, 0x44ed, 0x444d, 0x407a, 0x1ec5, 0x45c4, 0xba1a, 0xbfc3, 0x3dad, 0x40f6, 0x4085, 0x2377, 0x4418, 0x43a7, 0x2f7d, 0x4071, 0xbfaa, 0x129b, 0xbae5, 0x4691, 0x1be4, 0x1d41, 0x43ce, 0x35f0, 0x1bda, 0x411e, 0xba1a, 0xb2dc, 0x40f8, 0xa3d4, 0x431c, 0x4368, 0xba34, 0x1c65, 0xba13, 0x439f, 0x1b26, 0x4477, 0x40e3, 0x43a2, 0xbf00, 0xaab3, 0xba61, 0x43ab, 0xbf19, 0x4145, 0x40af, 0x182b, 0xb2b4, 0xba74, 0xb0a9, 0x4111, 0x448c, 0x4107, 0x4069, 0x0494, 0x41ef, 0x1af8, 0x42c0, 0x424d, 0x40a4, 0x43da, 0x4246, 0xb260, 0x41cb, 0x403a, 0x424c, 0xba33, 0x43a4, 0x37d0, 0x4390, 0x189b, 0xb2a0, 0xb052, 0xbf83, 0xa25c, 0x24d7, 0xb01e, 0x34d1, 0x3654, 0xb239, 0x1874, 0xba5e, 0xb27a, 0xb24e, 0x406b, 0x43a9, 0x45e2, 0xbafa, 0x4258, 0x393e, 0xbf7b, 0xb2d2, 0xa24e, 0xb293, 0x4027, 0x4268, 0xbf60, 0x4100, 0xb08b, 0x4062, 0x16d0, 0xbf71, 0x4132, 0x4398, 0x41d6, 0x4074, 0x059c, 0x437d, 0xbaf1, 0x400f, 0x4239, 0x0f8a, 0x4387, 0x1e07, 0x40b2, 0xb0a9, 0x4168, 0x43f8, 0xbf84, 0x0189, 0x1606, 0xb0fe, 0x41fa, 0xbfc5, 0x418e, 0x1a73, 0x42bf, 0x4269, 0x41b7, 0xbf95, 0x1abf, 0xac8e, 0x41b7, 0x4249, 0x41e2, 0xb06d, 0x186f, 0x4097, 0x4333, 0x4223, 0x424e, 0x46c4, 0x435b, 0x1c82, 0x416c, 0x40f2, 0xb000, 0xb09b, 0x434a, 0xbac7, 0x4255, 0x365a, 0xb27e, 0x4223, 0xbf2a, 0x4113, 0x411f, 0x4234, 0x3feb, 0xb2bf, 0x436a, 0xb0cd, 0x18e6, 0xa251, 0xbf72, 0x196c, 0xbac9, 0x190f, 0xb065, 0x4222, 0xbf9f, 0x0e34, 0xb234, 0x04ae, 0x401a, 0x19e3, 0xa8be, 0xba60, 0xb0b5, 0xbfd6, 0x4288, 0x375c, 0xb2d6, 0x4269, 0x419e, 0x46c5, 0x228a, 0x467e, 0xba01, 0x2f41, 0x415e, 0xb0d3, 0xb0de, 0x306a, 0x41b2, 0xb251, 0x432f, 0x430c, 0x189f, 0xbf69, 0x4061, 0x4423, 0x0dcf, 0xb272, 0x43e9, 0xa0e9, 0x03b4, 0x4606, 0xba5c, 0x42e5, 0x442d, 0x428f, 0x4044, 0x2c64, 0x4188, 0x4250, 0xa133, 0xbfe1, 0x4467, 0x4379, 0xb209, 0x43ef, 0x10af, 0x42b5, 0x43cd, 0xbad7, 0x4385, 0x1434, 0x4371, 0x44a9, 0xbaff, 0xb2c5, 0xb028, 0x46b1, 0x249e, 0x1a7c, 0x3608, 0x1561, 0x19da, 0x420f, 0x38a2, 0xa417, 0xbf8f, 0x1805, 0x18f3, 0x2abc, 0x44d3, 0xb210, 0x422d, 0xb29e, 0xb2d8, 0x4463, 0x4148, 0xa528, 0x407c, 0x40a0, 0x433e, 0xbfc1, 0x43dc, 0x38b7, 0xb232, 0x43f0, 0x3de3, 0x3077, 0xbf9d, 0x3ccd, 0xb0be, 0xb2c7, 0xba66, 0x420c, 0xb21e, 0x22d8, 0x2e67, 0xba0c, 0x4293, 0x2f4a, 0xba64, 0x413f, 0x1a2d, 0x4177, 0x424a, 0x4258, 0x4280, 0xa986, 0x3839, 0x4171, 0xb055, 0x4330, 0x4233, 0x41a5, 0x1f63, 0xbf78, 0x43c6, 0xb24c, 0x4199, 0xb2bd, 0x42a6, 0x0c98, 0x1f23, 0xb0ce, 0x4159, 0x1e07, 0xbad3, 0xbae3, 0x42db, 0x41bc, 0xb227, 0xba6d, 0x42f3, 0xbf52, 0xb0f4, 0x45c9, 0x4358, 0x4012, 0x411e, 0x41e5, 0x0b04, 0x41af, 0x43d1, 0xbf1e, 0x2603, 0x466d, 0xba17, 0x1fb1, 0x4363, 0xb21e, 0x4221, 0xb093, 0xbadd, 0xba2c, 0xb2a4, 0x43a0, 0xb2f0, 0xb221, 0x4601, 0xbf2b, 0x4629, 0xb07b, 0x0cb6, 0xb262, 0x439e, 0x40d0, 0xb02b, 0x337d, 0xbf03, 0x4683, 0xba7e, 0x18b9, 0x425b, 0xb0e9, 0x467f, 0x22c2, 0xbfba, 0x400a, 0x426b, 0x43b5, 0x3e16, 0x417e, 0xa4af, 0x40c7, 0x4379, 0x4079, 0x2d9d, 0x4374, 0x4333, 0x412e, 0x2fb4, 0xbf70, 0x4295, 0xae48, 0x1be3, 0x41f9, 0xbfd8, 0xb074, 0x4275, 0x45b5, 0x4133, 0x40a1, 0x402a, 0x405f, 0xbfbd, 0x423b, 0x463c, 0xba19, 0x439b, 0x3b6f, 0xb23f, 0x0f1d, 0xba56, 0xb261, 0xba54, 0xa2ae, 0x46bd, 0x43f6, 0x4017, 0xb2b0, 0x4435, 0x40bd, 0x1e76, 0x413e, 0x410b, 0x411b, 0x1a0e, 0x12dc, 0x1d50, 0x42d7, 0x420f, 0x40e3, 0xb2d6, 0xbfa6, 0xb242, 0xb2eb, 0x40e3, 0x4368, 0x24cc, 0x455d, 0x06b0, 0xbf49, 0xb0a0, 0x3dec, 0xba24, 0x432a, 0x4296, 0x40f9, 0xbff0, 0xa816, 0xb27b, 0x4053, 0xb095, 0x42a4, 0x46e2, 0x19c6, 0x421d, 0x406d, 0xbfc1, 0x4226, 0x4101, 0xbafc, 0x427e, 0x29ba, 0x2f83, 0x41b6, 0x4315, 0x4252, 0xbfa0, 0x45f0, 0x0cbd, 0x40dd, 0x1a3c, 0x43c3, 0x4020, 0xbacd, 0x414d, 0x41e7, 0x4323, 0xb25a, 0x1983, 0x17c3, 0xbf8a, 0x40ab, 0x4601, 0x44f9, 0x4080, 0x3d43, 0x09f7, 0x43de, 0x4637, 0x4052, 0x40dc, 0xbaeb, 0x446a, 0x1e28, 0x4007, 0x359a, 0x45ae, 0xab99, 0x23d8, 0x1cb7, 0xb29f, 0x41c3, 0x4463, 0xbf4f, 0x1f1a, 0x42b4, 0xbacd, 0xb27c, 0xb25b, 0x1aa8, 0xadce, 0xbfd0, 0x352d, 0x4383, 0xb26b, 0x43c0, 0xb201, 0x425c, 0x4356, 0x40a4, 0x43f7, 0x40f8, 0xbf6a, 0x4149, 0x3093, 0xba79, 0xba61, 0x431d, 0x1bb2, 0x405d, 0x09e3, 0x43c3, 0xb0da, 0x4116, 0x4561, 0x4094, 0xbfe0, 0xba18, 0xbaf1, 0xbf8c, 0xb225, 0x12db, 0x1aa6, 0x40f3, 0x327f, 0xb2c3, 0x15eb, 0xb22c, 0x27c4, 0xb229, 0x4015, 0xa837, 0xa0aa, 0x4045, 0x44c9, 0xb2cd, 0x416d, 0xbf58, 0x441a, 0xba16, 0x44aa, 0x1be5, 0xb2dd, 0x456e, 0x2da2, 0x4485, 0x3a61, 0x43d4, 0x127d, 0x0f03, 0x4046, 0xa7c2, 0x43ba, 0x422d, 0xb2f8, 0xa357, 0x40bc, 0x1f75, 0xa5db, 0xbf90, 0x42a1, 0x41bc, 0xbf87, 0x1bc0, 0xbf60, 0x3130, 0x40a2, 0x416d, 0x4171, 0x43d6, 0x180c, 0x46c4, 0x1efb, 0xbfad, 0x118b, 0xb211, 0x41cd, 0xba1f, 0xa45a, 0x400a, 0xbfc1, 0xba49, 0x4103, 0x4212, 0xb20b, 0x42d7, 0x42e0, 0x413a, 0xba68, 0x42d4, 0x4241, 0x41b2, 0x427f, 0x42e9, 0xbfa7, 0xb09c, 0x20ae, 0x3704, 0xb2ce, 0x1f73, 0xa18a, 0xbf80, 0x4266, 0xb0d8, 0x419a, 0xbf41, 0x4270, 0x1810, 0x4264, 0x39da, 0x1d65, 0x41a7, 0xa97c, 0x1288, 0xba61, 0x0e71, 0x425c, 0x41e5, 0x4542, 0x42fe, 0x4183, 0xb283, 0x401d, 0x00d1, 0x4232, 0x4246, 0x226e, 0x1918, 0x4299, 0x15ac, 0xbfad, 0x1ce1, 0x2a0a, 0x40a6, 0xb2fd, 0x3635, 0x1933, 0x412c, 0x1439, 0xa558, 0x4220, 0xbf33, 0x43c6, 0x416d, 0x26aa, 0xb213, 0x44e4, 0xbfe4, 0x29dc, 0x1d40, 0x42a2, 0x1ea9, 0x3f4b, 0x2e37, 0xb0e2, 0x0098, 0x427a, 0x4347, 0xbfe0, 0xb0a6, 0x053b, 0xb236, 0xba79, 0x444d, 0x429b, 0xbf94, 0xba27, 0xb2a0, 0x42aa, 0xb2e1, 0x43d0, 0xbf90, 0xba6b, 0xba4d, 0xa3ce, 0xb266, 0x43e6, 0x23cf, 0x422e, 0x4102, 0xaaf3, 0xa539, 0x419a, 0x137f, 0x45d8, 0x4067, 0xbfc2, 0x40f6, 0x416f, 0x08f8, 0x1f01, 0xb22b, 0x40a3, 0x40f9, 0x3a0e, 0x4370, 0xb2ad, 0x437a, 0x16d6, 0x0960, 0x1f6d, 0xa78d, 0x0385, 0xb2c2, 0x41cf, 0xb2f5, 0x1f83, 0xbaef, 0x4077, 0x1b8c, 0xba12, 0x4386, 0x40d0, 0xbf12, 0x40a8, 0xb237, 0x4237, 0xba4f, 0x4296, 0x45c8, 0x1f18, 0x1d76, 0x43ab, 0x3e32, 0x43f0, 0xbf72, 0x1a78, 0x1b64, 0x4028, 0x40cf, 0x43bb, 0x1f2c, 0x438f, 0x1fb8, 0x4282, 0x4669, 0x41d5, 0x1db5, 0xbafd, 0x41d4, 0x11c4, 0x405f, 0x1fb3, 0xb24b, 0x034f, 0x4345, 0x0970, 0x44fd, 0xb06b, 0xbf87, 0xa48d, 0x4492, 0xb095, 0x40b4, 0x4770, 0xe7fe + ], + StartRegs = [0xec6fcb87, 0x37fe5171, 0x476101c9, 0xb4b6dc30, 0x961e2dee, 0xdd91c1a4, 0xedf2ecd8, 0xdc6fc622, 0x228a66a9, 0x3398789a, 0xa6476515, 0xda1e950b, 0x49ed8832, 0xb877df50, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x07fffffe, 0x0000285e, 0x00000000, 0x0000005e, 0x00001a14, 0x00000000, 0xffffffd3, 0x050bc000, 0x5622f36b, 0x00002e90, 0x5622f36b, 0xa6476511, 0xac45e6d6, 0x000041e6, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x42f8, 0x07a3, 0xba44, 0x42a4, 0xbff0, 0x43f8, 0x2211, 0xb240, 0x40ef, 0x3564, 0xbad8, 0x45a3, 0x41ca, 0xba31, 0x4163, 0xbf47, 0x0b13, 0x42a0, 0xb288, 0x4498, 0x40a7, 0x4388, 0x3a67, 0xba1f, 0x4109, 0x4267, 0xb250, 0x437a, 0x46d4, 0x1fc3, 0x44cb, 0x421f, 0x36f5, 0xba5b, 0x1805, 0x46f8, 0x39bb, 0x170b, 0xb245, 0x4671, 0x40a1, 0x4175, 0xbf8e, 0xaafd, 0x4046, 0x415e, 0x41ad, 0x4342, 0x43b2, 0x182a, 0x1fea, 0xbfce, 0xa26c, 0x4232, 0x4184, 0xbfcb, 0x421c, 0x4350, 0xbf00, 0x420a, 0x4073, 0x434b, 0x43c6, 0xba76, 0xba57, 0x43fa, 0x422a, 0xb0d1, 0x42ff, 0xb2fe, 0x4327, 0xbf52, 0x41ef, 0x0772, 0xb293, 0x4371, 0xb0d4, 0x3aea, 0x3a19, 0xbac1, 0x408c, 0x4177, 0xbf00, 0xa92b, 0xba79, 0x4317, 0x4231, 0x4139, 0xbae8, 0x4107, 0xba54, 0x43c4, 0x4066, 0x1a61, 0xba23, 0xb0b9, 0x41a5, 0x410a, 0x43f4, 0xb027, 0xbfbe, 0xb02e, 0xaa85, 0xa3ba, 0x1c41, 0x3ab9, 0x1700, 0x44db, 0x1e0f, 0x40fc, 0xbaeb, 0xb015, 0xbf5c, 0x433d, 0x3457, 0x408e, 0x443e, 0xa97f, 0x19f0, 0xbf6a, 0x2099, 0x41a3, 0x400d, 0x41b8, 0x42d7, 0x4049, 0x416f, 0x428f, 0xbad9, 0xbf65, 0xb066, 0xa894, 0x18db, 0x11e7, 0x4351, 0x4113, 0x4182, 0xbae8, 0x1ea4, 0x3b34, 0xbf8d, 0xba5c, 0x4198, 0x436b, 0x421d, 0xbaf3, 0x435b, 0x12bd, 0x40cd, 0x2ba7, 0x180e, 0x43a7, 0x409b, 0xba76, 0x20b6, 0xba6e, 0x22f8, 0x184a, 0x41c9, 0x2f18, 0x43bb, 0xb28a, 0x3e03, 0x42bd, 0x1873, 0x4076, 0xbf42, 0xbaf0, 0x40b4, 0x185e, 0xbfaa, 0xbf00, 0x14e1, 0x27ae, 0x16e9, 0x43d5, 0x412c, 0xbf8f, 0x1bc8, 0x4048, 0x403e, 0x176a, 0x4126, 0x469d, 0xba7f, 0x0dc0, 0x4363, 0x436d, 0x1848, 0x1944, 0x422e, 0xb273, 0xbf00, 0x1c50, 0xbfc2, 0xb2b1, 0x421b, 0xbfd0, 0x320b, 0x300e, 0x1cd6, 0xb2ae, 0x433e, 0xb2f0, 0x1f18, 0x2045, 0x3f7d, 0xb2ac, 0x31e0, 0x1882, 0x1c64, 0xb2e2, 0x1d30, 0xbf90, 0x4316, 0x4429, 0x3b53, 0xba3c, 0x1c65, 0x21a2, 0x4246, 0xb070, 0xbfc6, 0xa834, 0xb2c4, 0xa89e, 0xb24a, 0xb292, 0x1341, 0xb20c, 0xbad2, 0x40a1, 0x425e, 0x0227, 0x4294, 0x2458, 0x4278, 0x4130, 0xad67, 0xb2dc, 0x4112, 0x4329, 0xb037, 0xa54d, 0x031f, 0x4105, 0xbfca, 0x400f, 0x233b, 0x4108, 0x1a02, 0xbf44, 0xb0a7, 0x416d, 0xbfdb, 0xb2d8, 0x2ed4, 0x4046, 0x1bd0, 0x1e0e, 0x426a, 0xa1db, 0x1fb1, 0x40b9, 0x4304, 0x424a, 0x02d1, 0xb245, 0x4153, 0x41cb, 0xbf22, 0x43f8, 0x41c8, 0x18fc, 0xa2a2, 0x42cf, 0x411e, 0xbfc6, 0x41db, 0xb2ed, 0xae81, 0x43c9, 0xbaef, 0x40fa, 0x0fd7, 0x430f, 0x072e, 0x3c69, 0xa74f, 0xbfa0, 0xba11, 0x410c, 0x000b, 0x4028, 0x1c4d, 0xba4c, 0x0ca2, 0x0b17, 0x43bd, 0x0149, 0xbfa7, 0x1c43, 0xbae0, 0x4245, 0x14f5, 0xba01, 0x4231, 0x421e, 0x4390, 0xa298, 0x4200, 0x2a55, 0x416f, 0x1a4f, 0x42b7, 0x097a, 0x1d13, 0x2dc8, 0xb2f7, 0x3cbf, 0x4270, 0x1f05, 0xa2c0, 0x057e, 0x40bb, 0xbac7, 0x1fef, 0xbfc6, 0x2651, 0x1ef8, 0x41fb, 0x382d, 0x40b0, 0xa7ea, 0xb034, 0x439a, 0xba7d, 0x4387, 0xb2f0, 0x4319, 0xbad5, 0x4427, 0x19c9, 0xb27d, 0xbf70, 0x2c31, 0x4260, 0x098c, 0x40de, 0x4220, 0x418c, 0x435b, 0x4589, 0xb27d, 0xb290, 0x1d46, 0xbf13, 0xb21d, 0xb2b3, 0x42cc, 0xba42, 0x40c0, 0x02a9, 0x4345, 0x40f4, 0xbfe4, 0x436f, 0xb25e, 0x1f19, 0xba1a, 0x2f2c, 0xb23a, 0xb238, 0xb239, 0x436b, 0x4287, 0xbac9, 0xbaf9, 0x1b47, 0xb245, 0x4338, 0x0077, 0x4179, 0xbae7, 0x431d, 0x4108, 0xb06f, 0x418a, 0x4253, 0xb02a, 0xa84c, 0xbfc2, 0xba77, 0x1a6c, 0x4018, 0x2ed1, 0xabb2, 0x409b, 0xa523, 0x4335, 0x4319, 0x4250, 0xb256, 0xb228, 0xa371, 0x1b22, 0x4350, 0x4273, 0xb09d, 0x18a4, 0x4297, 0x0814, 0xbf58, 0x27b9, 0x22c1, 0xb053, 0xa1b1, 0x414c, 0x1e1a, 0xbfd2, 0x4246, 0x42af, 0x4340, 0x4069, 0x4236, 0x4334, 0x425c, 0x41e5, 0x43ff, 0x4349, 0x3950, 0x237f, 0xba38, 0x42f8, 0x40f8, 0x034e, 0xb2c9, 0xb255, 0xba46, 0x426d, 0xa40b, 0x1ed1, 0xbf19, 0xb26f, 0x158c, 0x43a4, 0x402a, 0xb205, 0xbaf6, 0x45db, 0x4167, 0xb28a, 0x218e, 0x189d, 0x1d70, 0x458c, 0x072f, 0x424e, 0x1eff, 0xbacd, 0xb2ca, 0x45c1, 0x0ef0, 0xac77, 0xbfb2, 0x4099, 0x3d38, 0xad0b, 0xbfa4, 0x07ea, 0x41cb, 0x4262, 0x428f, 0x117b, 0xbfc0, 0x33fb, 0xbfc0, 0x413d, 0x4414, 0x45c1, 0x15b1, 0x01b3, 0x419c, 0x4257, 0xbfc6, 0x1c88, 0x406f, 0xa0e7, 0x4068, 0x4292, 0xb295, 0x1e8d, 0x41e8, 0x3710, 0x42da, 0x4234, 0xb0b0, 0xb06b, 0xbf77, 0x0b97, 0x4060, 0xba38, 0x1cb0, 0xba36, 0x427b, 0x4281, 0x411f, 0xb04b, 0x4026, 0xa71a, 0xbf9f, 0x41a0, 0xba1c, 0xb289, 0xadd3, 0xba4b, 0x43d7, 0xb0c9, 0xbafb, 0xba0a, 0x414e, 0x401b, 0x2a82, 0x4300, 0x43a9, 0xbfdd, 0x40e4, 0x4327, 0x1c8d, 0x1c33, 0x4260, 0x43de, 0x4669, 0x433f, 0xb253, 0x1d24, 0x107c, 0xba13, 0x40f4, 0x43f5, 0xbf90, 0x438e, 0x1c5e, 0x41e1, 0x3f39, 0x1bd4, 0xbfd9, 0xb2c4, 0x418e, 0xb2e7, 0x15b8, 0xac3d, 0x2430, 0xb291, 0x42c9, 0x4003, 0xb2fd, 0x34aa, 0x4680, 0x2a30, 0x42f9, 0x43eb, 0xbf41, 0x41eb, 0x2f26, 0xaa5f, 0x42b7, 0x42e0, 0x3e1d, 0xba1c, 0x4261, 0x0676, 0xbfe8, 0x423c, 0x3bd6, 0xba24, 0xbf70, 0x4152, 0x228a, 0x1848, 0x120b, 0xb262, 0x4309, 0x402e, 0x4106, 0xa354, 0x200b, 0x415e, 0xbfd6, 0x407f, 0x4563, 0x41b5, 0x212e, 0xb0e2, 0xbfb6, 0xae17, 0xb021, 0x2a99, 0xb0cd, 0xa019, 0xb090, 0x42ad, 0x42ad, 0x15ca, 0x43d3, 0x43cf, 0xb2e3, 0x43dd, 0xb2be, 0xac16, 0x41bb, 0x249a, 0x42b0, 0x083b, 0x4435, 0x4349, 0x40b3, 0x463a, 0x1a4e, 0xba55, 0xbf19, 0x40fe, 0x4300, 0xba69, 0x4299, 0x1f04, 0x013a, 0xb276, 0x09e9, 0x0926, 0x402a, 0x46c9, 0x1243, 0x4347, 0x412e, 0xb26f, 0xb2d5, 0x4388, 0x41cb, 0xba1e, 0xbfa2, 0xbac4, 0x4254, 0xb2e2, 0x0ffb, 0x20b7, 0x40b7, 0xb2b1, 0x432e, 0x466a, 0x40b0, 0xb2a7, 0x43c7, 0x18b4, 0x4279, 0xb272, 0x41c0, 0x4561, 0x40bb, 0xb047, 0x1fcc, 0xa0e0, 0x437a, 0xbf36, 0x2ab2, 0xb202, 0xad4d, 0xbad7, 0x0427, 0x1995, 0x31b3, 0x1235, 0x1f89, 0x340f, 0x45b5, 0x4556, 0x1941, 0x4203, 0x4593, 0x4071, 0x40a0, 0x387d, 0x3c40, 0x15de, 0x4215, 0xb219, 0xbf5a, 0x16e9, 0x44ed, 0xa529, 0x1cd4, 0x428b, 0x414a, 0xb2d6, 0x4572, 0xbf41, 0x414d, 0x40e1, 0x1862, 0x44d9, 0x414a, 0x4292, 0x425e, 0xb061, 0x436c, 0x3ba1, 0xb247, 0x40cb, 0xbaed, 0x412e, 0xba4b, 0xb298, 0x431c, 0xbf36, 0x0bfe, 0x3111, 0xba26, 0x1fb8, 0x4215, 0x1841, 0x40b7, 0xb0f5, 0xbf80, 0x42f8, 0x08a3, 0x45ee, 0x40d2, 0xb2f2, 0x33d3, 0xbf0d, 0x4200, 0x4083, 0x42af, 0x1a3b, 0xbfd1, 0xb060, 0xb0a4, 0x3ab1, 0xb23d, 0xba06, 0x4296, 0xb29f, 0x421c, 0xb2bd, 0xbae4, 0x46fa, 0x467e, 0xb019, 0x40f0, 0xb216, 0xbf35, 0x107c, 0xb296, 0x42c3, 0x4418, 0xba0c, 0xb22f, 0x0196, 0x42bc, 0x27fa, 0xa5b8, 0xbf02, 0x407c, 0x2e4e, 0xb28c, 0x091b, 0x1c4e, 0x1a4e, 0x4320, 0x40f6, 0x419b, 0xbac2, 0x43ab, 0xba4e, 0x4331, 0xb2ba, 0x43aa, 0x437f, 0x3ace, 0x27c8, 0xb246, 0x265d, 0x1ceb, 0x2cc8, 0xbff0, 0x2612, 0xbf1b, 0x1fd7, 0x43b0, 0xa909, 0x418b, 0xae30, 0xbfa2, 0x4563, 0x37cc, 0x4396, 0x4303, 0x4129, 0x1d9b, 0xbfcd, 0xb228, 0x43d6, 0x417e, 0xb00c, 0x4142, 0xba08, 0x41b2, 0x4260, 0x4066, 0x4362, 0x4210, 0xbf81, 0x40a6, 0x3a50, 0x40ac, 0x305e, 0xba75, 0x41e3, 0xb09c, 0xbf5a, 0x42e9, 0xbae5, 0x1a1b, 0x418d, 0xa430, 0x41ae, 0x4265, 0x2f35, 0x0f5f, 0x41b7, 0xbf71, 0xb056, 0x3e3a, 0xb2b8, 0x4227, 0x16be, 0xb213, 0x3ea4, 0xbf0c, 0xa864, 0xb25c, 0x42e2, 0x4083, 0x23de, 0x07bc, 0x42ca, 0x42cb, 0x1a5f, 0x3d6f, 0xb266, 0x3a16, 0x43ba, 0x434f, 0x41db, 0xb0b8, 0x427d, 0xb0b7, 0xbfe1, 0x1e76, 0x400e, 0xba71, 0xa62e, 0xb23b, 0x4358, 0x18ae, 0xb292, 0x4254, 0xbfbb, 0xba59, 0xb28e, 0x33cb, 0x46aa, 0x4219, 0xa5a6, 0x1ed8, 0x42d0, 0x150b, 0x4214, 0x42ed, 0x2da7, 0xb22b, 0x0e19, 0x3532, 0x43f0, 0x42a1, 0x439e, 0x40b3, 0x4361, 0x2193, 0x4451, 0x3894, 0x2d7e, 0x43c2, 0x1f33, 0xb0d9, 0x4440, 0xbf39, 0x1af5, 0x3c98, 0x42b7, 0x2c63, 0x1bb5, 0x06ac, 0x415c, 0x4012, 0x0d2f, 0x43cf, 0x43d1, 0x4272, 0x411d, 0x1dbc, 0xa93d, 0x1f13, 0x4222, 0x1904, 0xb24e, 0x44b1, 0xa1e6, 0x4074, 0x1a21, 0x4046, 0x4095, 0x4047, 0xbf8a, 0xba15, 0xb0ae, 0xa64e, 0xb26f, 0x4387, 0x05f8, 0x4548, 0xba5d, 0xb227, 0x407e, 0x43e8, 0xb238, 0x1f65, 0x45a2, 0x40f5, 0xba4a, 0x35d1, 0x403f, 0x4637, 0xbf49, 0x1dc2, 0x128b, 0xa29c, 0x41c0, 0xba48, 0x1adb, 0xb286, 0xb250, 0xb0af, 0x4132, 0x43e3, 0x1895, 0xba7b, 0x169e, 0x113d, 0x4589, 0x1fa1, 0xbfb7, 0x412d, 0x43fe, 0xb232, 0x3c71, 0x2e4a, 0xa936, 0x417e, 0x410c, 0xa245, 0x0a3e, 0x16c3, 0x0a0b, 0x0823, 0x3518, 0xba3e, 0x4135, 0x45f0, 0x412c, 0x4217, 0x4068, 0x4376, 0xb232, 0x416d, 0x42a2, 0x46db, 0x40a5, 0xb269, 0xb070, 0xbfbf, 0x2ff5, 0x2a6b, 0xb2a0, 0x45be, 0x1ab5, 0x1e69, 0x0d07, 0x4018, 0x1fcb, 0x414a, 0xb065, 0x08e8, 0xbaff, 0xbad4, 0x4332, 0xa6fd, 0x441e, 0xba61, 0xbfc2, 0xba53, 0xa9e9, 0x4260, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x618c22bd, 0x5bef2a39, 0xee6c28df, 0x55cc73d5, 0xfa7df287, 0x5074f3f0, 0x2ce650c2, 0xead87231, 0x32e2b3c0, 0xe82f84ef, 0x182094bd, 0x98581b15, 0x94fdcdeb, 0xe3d0b1ff, 0x00000000, 0x800001f0 }, - FinalRegs = new uint[] { 0x00006f62, 0x6525d096, 0x68d99e90, 0xd968909e, 0xffff909e, 0x68da0000, 0x68da1bcc, 0xffffff0f, 0xb3350301, 0xe82f84f5, 0x000000df, 0x010f4008, 0x182094bd, 0x6525ccf2, 0x00000000, 0x000001d0 }, + Instructions = [0x42f8, 0x07a3, 0xba44, 0x42a4, 0xbff0, 0x43f8, 0x2211, 0xb240, 0x40ef, 0x3564, 0xbad8, 0x45a3, 0x41ca, 0xba31, 0x4163, 0xbf47, 0x0b13, 0x42a0, 0xb288, 0x4498, 0x40a7, 0x4388, 0x3a67, 0xba1f, 0x4109, 0x4267, 0xb250, 0x437a, 0x46d4, 0x1fc3, 0x44cb, 0x421f, 0x36f5, 0xba5b, 0x1805, 0x46f8, 0x39bb, 0x170b, 0xb245, 0x4671, 0x40a1, 0x4175, 0xbf8e, 0xaafd, 0x4046, 0x415e, 0x41ad, 0x4342, 0x43b2, 0x182a, 0x1fea, 0xbfce, 0xa26c, 0x4232, 0x4184, 0xbfcb, 0x421c, 0x4350, 0xbf00, 0x420a, 0x4073, 0x434b, 0x43c6, 0xba76, 0xba57, 0x43fa, 0x422a, 0xb0d1, 0x42ff, 0xb2fe, 0x4327, 0xbf52, 0x41ef, 0x0772, 0xb293, 0x4371, 0xb0d4, 0x3aea, 0x3a19, 0xbac1, 0x408c, 0x4177, 0xbf00, 0xa92b, 0xba79, 0x4317, 0x4231, 0x4139, 0xbae8, 0x4107, 0xba54, 0x43c4, 0x4066, 0x1a61, 0xba23, 0xb0b9, 0x41a5, 0x410a, 0x43f4, 0xb027, 0xbfbe, 0xb02e, 0xaa85, 0xa3ba, 0x1c41, 0x3ab9, 0x1700, 0x44db, 0x1e0f, 0x40fc, 0xbaeb, 0xb015, 0xbf5c, 0x433d, 0x3457, 0x408e, 0x443e, 0xa97f, 0x19f0, 0xbf6a, 0x2099, 0x41a3, 0x400d, 0x41b8, 0x42d7, 0x4049, 0x416f, 0x428f, 0xbad9, 0xbf65, 0xb066, 0xa894, 0x18db, 0x11e7, 0x4351, 0x4113, 0x4182, 0xbae8, 0x1ea4, 0x3b34, 0xbf8d, 0xba5c, 0x4198, 0x436b, 0x421d, 0xbaf3, 0x435b, 0x12bd, 0x40cd, 0x2ba7, 0x180e, 0x43a7, 0x409b, 0xba76, 0x20b6, 0xba6e, 0x22f8, 0x184a, 0x41c9, 0x2f18, 0x43bb, 0xb28a, 0x3e03, 0x42bd, 0x1873, 0x4076, 0xbf42, 0xbaf0, 0x40b4, 0x185e, 0xbfaa, 0xbf00, 0x14e1, 0x27ae, 0x16e9, 0x43d5, 0x412c, 0xbf8f, 0x1bc8, 0x4048, 0x403e, 0x176a, 0x4126, 0x469d, 0xba7f, 0x0dc0, 0x4363, 0x436d, 0x1848, 0x1944, 0x422e, 0xb273, 0xbf00, 0x1c50, 0xbfc2, 0xb2b1, 0x421b, 0xbfd0, 0x320b, 0x300e, 0x1cd6, 0xb2ae, 0x433e, 0xb2f0, 0x1f18, 0x2045, 0x3f7d, 0xb2ac, 0x31e0, 0x1882, 0x1c64, 0xb2e2, 0x1d30, 0xbf90, 0x4316, 0x4429, 0x3b53, 0xba3c, 0x1c65, 0x21a2, 0x4246, 0xb070, 0xbfc6, 0xa834, 0xb2c4, 0xa89e, 0xb24a, 0xb292, 0x1341, 0xb20c, 0xbad2, 0x40a1, 0x425e, 0x0227, 0x4294, 0x2458, 0x4278, 0x4130, 0xad67, 0xb2dc, 0x4112, 0x4329, 0xb037, 0xa54d, 0x031f, 0x4105, 0xbfca, 0x400f, 0x233b, 0x4108, 0x1a02, 0xbf44, 0xb0a7, 0x416d, 0xbfdb, 0xb2d8, 0x2ed4, 0x4046, 0x1bd0, 0x1e0e, 0x426a, 0xa1db, 0x1fb1, 0x40b9, 0x4304, 0x424a, 0x02d1, 0xb245, 0x4153, 0x41cb, 0xbf22, 0x43f8, 0x41c8, 0x18fc, 0xa2a2, 0x42cf, 0x411e, 0xbfc6, 0x41db, 0xb2ed, 0xae81, 0x43c9, 0xbaef, 0x40fa, 0x0fd7, 0x430f, 0x072e, 0x3c69, 0xa74f, 0xbfa0, 0xba11, 0x410c, 0x000b, 0x4028, 0x1c4d, 0xba4c, 0x0ca2, 0x0b17, 0x43bd, 0x0149, 0xbfa7, 0x1c43, 0xbae0, 0x4245, 0x14f5, 0xba01, 0x4231, 0x421e, 0x4390, 0xa298, 0x4200, 0x2a55, 0x416f, 0x1a4f, 0x42b7, 0x097a, 0x1d13, 0x2dc8, 0xb2f7, 0x3cbf, 0x4270, 0x1f05, 0xa2c0, 0x057e, 0x40bb, 0xbac7, 0x1fef, 0xbfc6, 0x2651, 0x1ef8, 0x41fb, 0x382d, 0x40b0, 0xa7ea, 0xb034, 0x439a, 0xba7d, 0x4387, 0xb2f0, 0x4319, 0xbad5, 0x4427, 0x19c9, 0xb27d, 0xbf70, 0x2c31, 0x4260, 0x098c, 0x40de, 0x4220, 0x418c, 0x435b, 0x4589, 0xb27d, 0xb290, 0x1d46, 0xbf13, 0xb21d, 0xb2b3, 0x42cc, 0xba42, 0x40c0, 0x02a9, 0x4345, 0x40f4, 0xbfe4, 0x436f, 0xb25e, 0x1f19, 0xba1a, 0x2f2c, 0xb23a, 0xb238, 0xb239, 0x436b, 0x4287, 0xbac9, 0xbaf9, 0x1b47, 0xb245, 0x4338, 0x0077, 0x4179, 0xbae7, 0x431d, 0x4108, 0xb06f, 0x418a, 0x4253, 0xb02a, 0xa84c, 0xbfc2, 0xba77, 0x1a6c, 0x4018, 0x2ed1, 0xabb2, 0x409b, 0xa523, 0x4335, 0x4319, 0x4250, 0xb256, 0xb228, 0xa371, 0x1b22, 0x4350, 0x4273, 0xb09d, 0x18a4, 0x4297, 0x0814, 0xbf58, 0x27b9, 0x22c1, 0xb053, 0xa1b1, 0x414c, 0x1e1a, 0xbfd2, 0x4246, 0x42af, 0x4340, 0x4069, 0x4236, 0x4334, 0x425c, 0x41e5, 0x43ff, 0x4349, 0x3950, 0x237f, 0xba38, 0x42f8, 0x40f8, 0x034e, 0xb2c9, 0xb255, 0xba46, 0x426d, 0xa40b, 0x1ed1, 0xbf19, 0xb26f, 0x158c, 0x43a4, 0x402a, 0xb205, 0xbaf6, 0x45db, 0x4167, 0xb28a, 0x218e, 0x189d, 0x1d70, 0x458c, 0x072f, 0x424e, 0x1eff, 0xbacd, 0xb2ca, 0x45c1, 0x0ef0, 0xac77, 0xbfb2, 0x4099, 0x3d38, 0xad0b, 0xbfa4, 0x07ea, 0x41cb, 0x4262, 0x428f, 0x117b, 0xbfc0, 0x33fb, 0xbfc0, 0x413d, 0x4414, 0x45c1, 0x15b1, 0x01b3, 0x419c, 0x4257, 0xbfc6, 0x1c88, 0x406f, 0xa0e7, 0x4068, 0x4292, 0xb295, 0x1e8d, 0x41e8, 0x3710, 0x42da, 0x4234, 0xb0b0, 0xb06b, 0xbf77, 0x0b97, 0x4060, 0xba38, 0x1cb0, 0xba36, 0x427b, 0x4281, 0x411f, 0xb04b, 0x4026, 0xa71a, 0xbf9f, 0x41a0, 0xba1c, 0xb289, 0xadd3, 0xba4b, 0x43d7, 0xb0c9, 0xbafb, 0xba0a, 0x414e, 0x401b, 0x2a82, 0x4300, 0x43a9, 0xbfdd, 0x40e4, 0x4327, 0x1c8d, 0x1c33, 0x4260, 0x43de, 0x4669, 0x433f, 0xb253, 0x1d24, 0x107c, 0xba13, 0x40f4, 0x43f5, 0xbf90, 0x438e, 0x1c5e, 0x41e1, 0x3f39, 0x1bd4, 0xbfd9, 0xb2c4, 0x418e, 0xb2e7, 0x15b8, 0xac3d, 0x2430, 0xb291, 0x42c9, 0x4003, 0xb2fd, 0x34aa, 0x4680, 0x2a30, 0x42f9, 0x43eb, 0xbf41, 0x41eb, 0x2f26, 0xaa5f, 0x42b7, 0x42e0, 0x3e1d, 0xba1c, 0x4261, 0x0676, 0xbfe8, 0x423c, 0x3bd6, 0xba24, 0xbf70, 0x4152, 0x228a, 0x1848, 0x120b, 0xb262, 0x4309, 0x402e, 0x4106, 0xa354, 0x200b, 0x415e, 0xbfd6, 0x407f, 0x4563, 0x41b5, 0x212e, 0xb0e2, 0xbfb6, 0xae17, 0xb021, 0x2a99, 0xb0cd, 0xa019, 0xb090, 0x42ad, 0x42ad, 0x15ca, 0x43d3, 0x43cf, 0xb2e3, 0x43dd, 0xb2be, 0xac16, 0x41bb, 0x249a, 0x42b0, 0x083b, 0x4435, 0x4349, 0x40b3, 0x463a, 0x1a4e, 0xba55, 0xbf19, 0x40fe, 0x4300, 0xba69, 0x4299, 0x1f04, 0x013a, 0xb276, 0x09e9, 0x0926, 0x402a, 0x46c9, 0x1243, 0x4347, 0x412e, 0xb26f, 0xb2d5, 0x4388, 0x41cb, 0xba1e, 0xbfa2, 0xbac4, 0x4254, 0xb2e2, 0x0ffb, 0x20b7, 0x40b7, 0xb2b1, 0x432e, 0x466a, 0x40b0, 0xb2a7, 0x43c7, 0x18b4, 0x4279, 0xb272, 0x41c0, 0x4561, 0x40bb, 0xb047, 0x1fcc, 0xa0e0, 0x437a, 0xbf36, 0x2ab2, 0xb202, 0xad4d, 0xbad7, 0x0427, 0x1995, 0x31b3, 0x1235, 0x1f89, 0x340f, 0x45b5, 0x4556, 0x1941, 0x4203, 0x4593, 0x4071, 0x40a0, 0x387d, 0x3c40, 0x15de, 0x4215, 0xb219, 0xbf5a, 0x16e9, 0x44ed, 0xa529, 0x1cd4, 0x428b, 0x414a, 0xb2d6, 0x4572, 0xbf41, 0x414d, 0x40e1, 0x1862, 0x44d9, 0x414a, 0x4292, 0x425e, 0xb061, 0x436c, 0x3ba1, 0xb247, 0x40cb, 0xbaed, 0x412e, 0xba4b, 0xb298, 0x431c, 0xbf36, 0x0bfe, 0x3111, 0xba26, 0x1fb8, 0x4215, 0x1841, 0x40b7, 0xb0f5, 0xbf80, 0x42f8, 0x08a3, 0x45ee, 0x40d2, 0xb2f2, 0x33d3, 0xbf0d, 0x4200, 0x4083, 0x42af, 0x1a3b, 0xbfd1, 0xb060, 0xb0a4, 0x3ab1, 0xb23d, 0xba06, 0x4296, 0xb29f, 0x421c, 0xb2bd, 0xbae4, 0x46fa, 0x467e, 0xb019, 0x40f0, 0xb216, 0xbf35, 0x107c, 0xb296, 0x42c3, 0x4418, 0xba0c, 0xb22f, 0x0196, 0x42bc, 0x27fa, 0xa5b8, 0xbf02, 0x407c, 0x2e4e, 0xb28c, 0x091b, 0x1c4e, 0x1a4e, 0x4320, 0x40f6, 0x419b, 0xbac2, 0x43ab, 0xba4e, 0x4331, 0xb2ba, 0x43aa, 0x437f, 0x3ace, 0x27c8, 0xb246, 0x265d, 0x1ceb, 0x2cc8, 0xbff0, 0x2612, 0xbf1b, 0x1fd7, 0x43b0, 0xa909, 0x418b, 0xae30, 0xbfa2, 0x4563, 0x37cc, 0x4396, 0x4303, 0x4129, 0x1d9b, 0xbfcd, 0xb228, 0x43d6, 0x417e, 0xb00c, 0x4142, 0xba08, 0x41b2, 0x4260, 0x4066, 0x4362, 0x4210, 0xbf81, 0x40a6, 0x3a50, 0x40ac, 0x305e, 0xba75, 0x41e3, 0xb09c, 0xbf5a, 0x42e9, 0xbae5, 0x1a1b, 0x418d, 0xa430, 0x41ae, 0x4265, 0x2f35, 0x0f5f, 0x41b7, 0xbf71, 0xb056, 0x3e3a, 0xb2b8, 0x4227, 0x16be, 0xb213, 0x3ea4, 0xbf0c, 0xa864, 0xb25c, 0x42e2, 0x4083, 0x23de, 0x07bc, 0x42ca, 0x42cb, 0x1a5f, 0x3d6f, 0xb266, 0x3a16, 0x43ba, 0x434f, 0x41db, 0xb0b8, 0x427d, 0xb0b7, 0xbfe1, 0x1e76, 0x400e, 0xba71, 0xa62e, 0xb23b, 0x4358, 0x18ae, 0xb292, 0x4254, 0xbfbb, 0xba59, 0xb28e, 0x33cb, 0x46aa, 0x4219, 0xa5a6, 0x1ed8, 0x42d0, 0x150b, 0x4214, 0x42ed, 0x2da7, 0xb22b, 0x0e19, 0x3532, 0x43f0, 0x42a1, 0x439e, 0x40b3, 0x4361, 0x2193, 0x4451, 0x3894, 0x2d7e, 0x43c2, 0x1f33, 0xb0d9, 0x4440, 0xbf39, 0x1af5, 0x3c98, 0x42b7, 0x2c63, 0x1bb5, 0x06ac, 0x415c, 0x4012, 0x0d2f, 0x43cf, 0x43d1, 0x4272, 0x411d, 0x1dbc, 0xa93d, 0x1f13, 0x4222, 0x1904, 0xb24e, 0x44b1, 0xa1e6, 0x4074, 0x1a21, 0x4046, 0x4095, 0x4047, 0xbf8a, 0xba15, 0xb0ae, 0xa64e, 0xb26f, 0x4387, 0x05f8, 0x4548, 0xba5d, 0xb227, 0x407e, 0x43e8, 0xb238, 0x1f65, 0x45a2, 0x40f5, 0xba4a, 0x35d1, 0x403f, 0x4637, 0xbf49, 0x1dc2, 0x128b, 0xa29c, 0x41c0, 0xba48, 0x1adb, 0xb286, 0xb250, 0xb0af, 0x4132, 0x43e3, 0x1895, 0xba7b, 0x169e, 0x113d, 0x4589, 0x1fa1, 0xbfb7, 0x412d, 0x43fe, 0xb232, 0x3c71, 0x2e4a, 0xa936, 0x417e, 0x410c, 0xa245, 0x0a3e, 0x16c3, 0x0a0b, 0x0823, 0x3518, 0xba3e, 0x4135, 0x45f0, 0x412c, 0x4217, 0x4068, 0x4376, 0xb232, 0x416d, 0x42a2, 0x46db, 0x40a5, 0xb269, 0xb070, 0xbfbf, 0x2ff5, 0x2a6b, 0xb2a0, 0x45be, 0x1ab5, 0x1e69, 0x0d07, 0x4018, 0x1fcb, 0x414a, 0xb065, 0x08e8, 0xbaff, 0xbad4, 0x4332, 0xa6fd, 0x441e, 0xba61, 0xbfc2, 0xba53, 0xa9e9, 0x4260, 0x4770, 0xe7fe + ], + StartRegs = [0x618c22bd, 0x5bef2a39, 0xee6c28df, 0x55cc73d5, 0xfa7df287, 0x5074f3f0, 0x2ce650c2, 0xead87231, 0x32e2b3c0, 0xe82f84ef, 0x182094bd, 0x98581b15, 0x94fdcdeb, 0xe3d0b1ff, 0x00000000, 0x800001f0 + ], + FinalRegs = [0x00006f62, 0x6525d096, 0x68d99e90, 0xd968909e, 0xffff909e, 0x68da0000, 0x68da1bcc, 0xffffff0f, 0xb3350301, 0xe82f84f5, 0x000000df, 0x010f4008, 0x182094bd, 0x6525ccf2, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x40a3, 0x4088, 0x431e, 0x40a5, 0xb02c, 0xba79, 0xb24d, 0x40f5, 0x43df, 0x43c1, 0xaef2, 0x4008, 0x414b, 0x41fc, 0xb235, 0xbfc0, 0xafbb, 0x1c05, 0x196a, 0x40b4, 0xb072, 0x38d1, 0xbf43, 0x46b1, 0xa0e6, 0x45a4, 0x4043, 0xbf90, 0x4626, 0xb2fc, 0xbf7e, 0xba61, 0xa1ca, 0x2175, 0xaf95, 0x4312, 0x1d8a, 0x190e, 0xb2df, 0x1698, 0x2d52, 0x1a9a, 0xb0ed, 0x407f, 0xa460, 0x4254, 0xb066, 0xbf89, 0xb0a9, 0xb2b8, 0x1a5d, 0x4194, 0x4211, 0x41a0, 0x40e0, 0x4139, 0x4362, 0x4336, 0x42a4, 0x447b, 0xabbd, 0x443a, 0x4459, 0xaf35, 0xbfb2, 0x45cc, 0x1e31, 0x1b94, 0xb07a, 0xb29e, 0x4212, 0xbae6, 0x427e, 0xb034, 0x2b28, 0x400a, 0x3ca6, 0x43a4, 0xb04a, 0xb248, 0x409a, 0xab1f, 0x4278, 0xb04b, 0x407f, 0x4291, 0xbf75, 0x415f, 0x4087, 0xb298, 0x41d4, 0x423e, 0x1b3f, 0x4206, 0xba6d, 0xb2d7, 0x458c, 0x319d, 0x4222, 0x40c1, 0x43ac, 0x4340, 0x1308, 0x4011, 0x4118, 0x40b3, 0x4379, 0xba4b, 0xb23e, 0xbf74, 0x40b5, 0x3319, 0xb07b, 0x41cb, 0xb2f9, 0x431d, 0x02c4, 0x1996, 0x419a, 0x435b, 0x255c, 0xb2f5, 0x33ad, 0xb04a, 0x4408, 0x0974, 0x42f7, 0x4339, 0xb280, 0x1b82, 0xb247, 0x464c, 0x4211, 0xbf0b, 0x4030, 0x43e6, 0x4087, 0x3611, 0x0981, 0x416e, 0x4315, 0x43c1, 0x2147, 0x4090, 0x4136, 0xbf66, 0x2933, 0x2ecf, 0x43eb, 0xb283, 0x42af, 0x1c96, 0xb09f, 0x41f2, 0xb21c, 0xbf09, 0xb087, 0x4463, 0xbaf1, 0x419d, 0xa7b0, 0xb211, 0x41a6, 0x3f86, 0xba54, 0x3385, 0x03b0, 0xb211, 0x4331, 0xaf96, 0x4119, 0x0c9e, 0x419b, 0xb2dc, 0x43d0, 0xb24c, 0x4042, 0xbf00, 0x4162, 0x1fc3, 0x4189, 0xb25a, 0x06f9, 0xb274, 0xbf6c, 0xbacf, 0x407e, 0x4204, 0x140f, 0x4309, 0x4176, 0x407e, 0x4130, 0x1c8a, 0x4354, 0x2411, 0x2605, 0xb057, 0xbf70, 0x406b, 0x3cd9, 0x437f, 0xa2e1, 0xba57, 0x069e, 0xbf76, 0x46ec, 0xbaf9, 0xb2ae, 0x436a, 0xadd9, 0xb09d, 0x40db, 0x4244, 0x1a39, 0xac08, 0x408d, 0x4021, 0x4263, 0xb281, 0x4418, 0x4116, 0x42f6, 0xa919, 0x1470, 0x1f33, 0x4245, 0x434f, 0x43ff, 0x43a1, 0x0d92, 0x4051, 0x43af, 0x30c5, 0xbf46, 0x425e, 0x4008, 0x4678, 0x42db, 0x1c2c, 0x4410, 0x1c4e, 0x4282, 0xba0d, 0x4075, 0x194f, 0x41ab, 0xb065, 0x1871, 0x412f, 0x0399, 0xa0db, 0xb239, 0x4559, 0x43d6, 0x1faf, 0x411f, 0xb0b7, 0x4606, 0x43c2, 0xbf81, 0x0823, 0x2a43, 0x18c5, 0x1a77, 0xad27, 0x43ff, 0x4212, 0x0e3c, 0x411a, 0x43a6, 0x1916, 0x4394, 0xb225, 0x1eb5, 0x449b, 0x438e, 0x40ca, 0x4623, 0xb2e3, 0x41ef, 0x4493, 0x3e02, 0x4069, 0x1c2b, 0xb234, 0x1e69, 0x41df, 0xb2b8, 0x41d8, 0xbf56, 0x05ad, 0xba1c, 0x42c2, 0x4051, 0x42b2, 0x40f4, 0x43ce, 0x44f0, 0x43f3, 0x4229, 0x213e, 0xb2c2, 0x3200, 0x4214, 0x42b6, 0x005f, 0x4075, 0xb272, 0xbaf8, 0xb224, 0xb29f, 0xbfd5, 0x40c1, 0x438e, 0x43c4, 0x0aa3, 0xa689, 0xb22f, 0x2428, 0x45bd, 0x4004, 0x43f9, 0xb29e, 0x4679, 0xb21b, 0x40bb, 0x4027, 0x40f4, 0x4074, 0xbf7b, 0x45c2, 0x43f6, 0xb2a0, 0x416c, 0xba07, 0x1da5, 0x416e, 0xba1c, 0x406a, 0x0523, 0xa9b7, 0x352b, 0x35c0, 0xbf97, 0xb26c, 0xbf60, 0x40f8, 0xba7a, 0x423f, 0x02f2, 0x4068, 0x3e52, 0x42c7, 0x4050, 0x1d10, 0x4211, 0x42d9, 0x4565, 0xb2a5, 0x416d, 0xba27, 0x420a, 0xb228, 0xbf80, 0xa3ea, 0x437b, 0xb2cf, 0xb2cb, 0x1473, 0xbf7c, 0x4285, 0x41b6, 0x4280, 0x3a9f, 0xba06, 0xba22, 0x3f7e, 0x1822, 0x1663, 0xbf80, 0x182b, 0x1d47, 0x37c4, 0xaa51, 0x1efc, 0xbfb7, 0x43b7, 0xba12, 0xbaf0, 0x40e9, 0xbf80, 0xb09e, 0x4448, 0x1f27, 0x4083, 0xac6a, 0x400e, 0x1c32, 0xba54, 0xba14, 0x249e, 0x3f80, 0x4610, 0x4293, 0x4396, 0x1e57, 0xb23f, 0xb093, 0x4161, 0x42c0, 0x3494, 0x40d5, 0xbf56, 0x1ee5, 0x2143, 0x18b0, 0x4360, 0x46a4, 0x1930, 0xba5a, 0x44d0, 0x1ad6, 0x371e, 0xb2ce, 0x1534, 0xb09c, 0x1b0b, 0x095d, 0x2f9f, 0x1608, 0x40f7, 0xbada, 0x05c1, 0xbf3e, 0xa521, 0xb29a, 0x42af, 0x404a, 0x0f8c, 0x41c9, 0xb089, 0x1a99, 0xba0a, 0x1fc9, 0xb25b, 0x41a2, 0x4109, 0x40b7, 0x364f, 0x2648, 0x011f, 0x4157, 0xbf47, 0xb037, 0x1b4a, 0x4096, 0x41a8, 0x4246, 0xba0f, 0x40f0, 0xb250, 0xbf59, 0x42b7, 0xb251, 0xba5b, 0xb0d1, 0x4208, 0x4103, 0x40a7, 0x4355, 0xb216, 0x4476, 0x1962, 0xb03d, 0xba1a, 0x1928, 0x1f0b, 0xbf71, 0x2d76, 0x40f6, 0x4369, 0x29d5, 0x42f6, 0x1dd5, 0xb25e, 0xaf1a, 0x42fd, 0x40b9, 0x41bb, 0xa259, 0x40b7, 0x45f6, 0x4283, 0xbf3e, 0xba6c, 0xbae8, 0x41cb, 0xbf08, 0x42f3, 0x15e3, 0x1eb6, 0x386c, 0xb090, 0x1d6c, 0x3160, 0x43ca, 0x1a41, 0xb260, 0x4252, 0x3a39, 0xae9f, 0x41cf, 0xb2ae, 0x40ed, 0x4347, 0xb2ae, 0xba31, 0xbfda, 0x43a6, 0x4125, 0xb036, 0x408f, 0xba00, 0x1ddf, 0x4062, 0xb0ba, 0x4176, 0xba23, 0x2c17, 0x42e6, 0x3bc2, 0x43fb, 0x11b5, 0x400e, 0x439d, 0x3079, 0xb0a7, 0xbf7b, 0xb0e1, 0x4271, 0x44d1, 0xbfb0, 0xb028, 0xb015, 0x43d1, 0x4322, 0x1dcf, 0x42cc, 0xbac0, 0x1847, 0xbfd1, 0xb036, 0xb060, 0x2bea, 0x4020, 0x4193, 0x43d5, 0xaa64, 0x41c7, 0x427c, 0x41ec, 0xbf0b, 0x4398, 0x4200, 0x4283, 0x4000, 0x1f81, 0x44d1, 0x42d6, 0x402c, 0x0e29, 0x4606, 0xb0b9, 0x4093, 0x40fa, 0x42b6, 0xba48, 0x43a9, 0xbf72, 0x1aba, 0xbf00, 0x369e, 0xbf00, 0x4109, 0x251e, 0xba6f, 0x40bc, 0x4464, 0x40d4, 0x3776, 0xb2de, 0xb01a, 0xb05d, 0x27ed, 0xb252, 0x368f, 0xb044, 0x45e0, 0xba62, 0x4135, 0xbf23, 0x4188, 0x41f4, 0xb223, 0x418e, 0x40e4, 0x4256, 0xbf01, 0x411b, 0x1f16, 0x4253, 0xbadd, 0x43e0, 0xaeab, 0x4431, 0x24cb, 0x30b8, 0x406e, 0xb0e9, 0x41aa, 0x43a6, 0x438e, 0x4342, 0x4307, 0x419c, 0x4053, 0x4311, 0x41c7, 0x4152, 0x1ba5, 0x41db, 0x42a0, 0x40b8, 0xbf2e, 0xb01c, 0x423b, 0x1d13, 0xb262, 0xba11, 0x1803, 0x433e, 0x287b, 0x1977, 0xb0ba, 0x297d, 0xbf01, 0xb294, 0x40bf, 0x4391, 0x43e8, 0x232d, 0x431a, 0x4228, 0x375a, 0x36d7, 0x424d, 0xbf60, 0x4071, 0x40e8, 0x3242, 0xb0fe, 0x4214, 0x41a3, 0xbf62, 0x2756, 0x40f0, 0xba17, 0x3696, 0x427f, 0xaaa1, 0xbfa9, 0x4285, 0x427c, 0xa783, 0x4369, 0x274e, 0xb299, 0x411c, 0x40f0, 0x073b, 0x40d4, 0x43f7, 0xba1b, 0xb22d, 0x1c83, 0x1f11, 0x4277, 0x32b1, 0xbf52, 0x424b, 0x438f, 0xbfd0, 0x4118, 0x39e7, 0xba37, 0x3e6d, 0x41f3, 0x4239, 0x2daa, 0xbfa6, 0x432e, 0xb015, 0xb2f6, 0xbaf2, 0x4184, 0x4324, 0x1c78, 0xbaf1, 0xba29, 0xbfca, 0x1b4d, 0xb28b, 0x4577, 0x3ade, 0x43b3, 0xbf64, 0x401f, 0x41d7, 0x4060, 0x1be9, 0x4453, 0xba44, 0x37d4, 0x424a, 0xb006, 0x1882, 0xbac4, 0xba5b, 0x3c59, 0x0c92, 0x42a0, 0xba4e, 0x2d9b, 0xbfe4, 0x441b, 0x2199, 0x05fd, 0x43b2, 0xba42, 0x4301, 0x1ec4, 0x4656, 0xb0e4, 0xb06e, 0xbf82, 0x40a6, 0xaebe, 0x30ca, 0x4181, 0x42a4, 0xb24d, 0x4080, 0x43ca, 0x3592, 0x1943, 0x4217, 0x43ee, 0x08c3, 0xb003, 0x2cbd, 0x4412, 0x2e2f, 0x26db, 0x4179, 0x42a4, 0x36d3, 0xbfb2, 0x4386, 0x431c, 0x44ba, 0x4464, 0xb281, 0x40b3, 0x4152, 0xb25b, 0x41f2, 0xb059, 0xb278, 0x0dfe, 0x425f, 0x4215, 0x3ca0, 0x4234, 0xbad2, 0x41f0, 0x3f2d, 0x43ce, 0x4218, 0xbf12, 0x45e9, 0x1a54, 0x1fff, 0xacd6, 0x410e, 0xbf8f, 0xb0e1, 0x352d, 0x1fed, 0x1af4, 0x428e, 0x3c91, 0xb039, 0x4079, 0x4347, 0x3c04, 0x4424, 0x4260, 0xa798, 0x41b9, 0x4033, 0x4238, 0x2419, 0x4227, 0x0d53, 0xb2c3, 0x42d7, 0xbf14, 0x46a5, 0x0852, 0xa387, 0x13d9, 0x41c7, 0x1f38, 0x43e8, 0x1dcc, 0x43e6, 0x465a, 0x419a, 0x4387, 0x4338, 0x43a0, 0x033e, 0xba5d, 0x4176, 0x3d63, 0x3285, 0x1d0b, 0xacee, 0x4105, 0x44e8, 0x3c90, 0xa4a5, 0xbf17, 0x432e, 0x4020, 0x4367, 0x43ee, 0x43f8, 0x3f58, 0x1f04, 0x08fa, 0x43cf, 0xb097, 0xba07, 0xb228, 0x45c4, 0x09ae, 0xbf31, 0x31a7, 0x3a09, 0x42cf, 0x4019, 0x2390, 0x4145, 0x4179, 0x40bd, 0xb243, 0xbf5d, 0x3f0c, 0x3406, 0x1f8a, 0xba3b, 0xbfb5, 0x43b0, 0x3120, 0xb26c, 0xa3b0, 0x4272, 0x465d, 0x3214, 0xba0e, 0x3a60, 0x4230, 0x2d1c, 0x43ea, 0xbf63, 0x43ae, 0x14fa, 0x38d6, 0x423d, 0xac84, 0xb210, 0x402e, 0xb273, 0x441e, 0x43b0, 0xab4e, 0xb275, 0x42c8, 0x41f1, 0xb2ba, 0x42fd, 0x40b9, 0x4244, 0x42ed, 0x420d, 0x4190, 0xba13, 0xba1f, 0x2758, 0x40d7, 0x1012, 0x41f7, 0xbff0, 0xbfaf, 0x1aee, 0x425b, 0x0e1a, 0x3ddb, 0xb2e9, 0xba50, 0x3fd8, 0x1ba9, 0xb002, 0x437d, 0x4279, 0x34fb, 0xba3b, 0x43e3, 0x4185, 0xba1f, 0xa0db, 0x4218, 0x3d58, 0x0f00, 0xb2b0, 0x429f, 0xb063, 0xbf0d, 0xba52, 0xba07, 0xa5c8, 0x409c, 0x431f, 0xb2f9, 0x1ff7, 0xb0e6, 0x463f, 0x3ac2, 0xba14, 0xba7c, 0xbf43, 0xbff0, 0x40b3, 0x2e64, 0xa3a0, 0x1bac, 0xb2c7, 0x1f9a, 0x31d1, 0x387c, 0x1993, 0x4224, 0xba20, 0x4044, 0xb2f2, 0x1983, 0x428f, 0x11fc, 0x00a5, 0xb071, 0x12ae, 0x4007, 0x15cc, 0xbfcf, 0x416e, 0x0667, 0x1b46, 0xb250, 0x4285, 0x41ea, 0xa38d, 0x43dd, 0x43a7, 0xa77b, 0x0711, 0xba66, 0x445c, 0x1b40, 0x4095, 0x41b8, 0x400b, 0x4079, 0x3567, 0x43a6, 0x461d, 0x435d, 0x4036, 0x42fa, 0xa9a6, 0x43b7, 0xb295, 0x427e, 0x4300, 0xbf54, 0xb0f4, 0x2b0b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x36179bbd, 0x4c84b624, 0xf2f6b902, 0xcc71b138, 0x0afbc809, 0xac7ce4df, 0xb01ce320, 0xe9d87f98, 0xc61c700a, 0x6f44ba87, 0x76d17376, 0x6c662875, 0x88e99f9f, 0x5ec4aa7f, 0x00000000, 0x500001f0 }, - FinalRegs = new uint[] { 0xffffffeb, 0x00000415, 0x6000000a, 0x00000000, 0xf16324f3, 0x0000000a, 0xffffe660, 0x000019a0, 0x3cede399, 0xd596226d, 0xe4d0754a, 0xf16324f3, 0x00000132, 0x0000017d, 0x00000000, 0x800001d0 }, + Instructions = [0x40a3, 0x4088, 0x431e, 0x40a5, 0xb02c, 0xba79, 0xb24d, 0x40f5, 0x43df, 0x43c1, 0xaef2, 0x4008, 0x414b, 0x41fc, 0xb235, 0xbfc0, 0xafbb, 0x1c05, 0x196a, 0x40b4, 0xb072, 0x38d1, 0xbf43, 0x46b1, 0xa0e6, 0x45a4, 0x4043, 0xbf90, 0x4626, 0xb2fc, 0xbf7e, 0xba61, 0xa1ca, 0x2175, 0xaf95, 0x4312, 0x1d8a, 0x190e, 0xb2df, 0x1698, 0x2d52, 0x1a9a, 0xb0ed, 0x407f, 0xa460, 0x4254, 0xb066, 0xbf89, 0xb0a9, 0xb2b8, 0x1a5d, 0x4194, 0x4211, 0x41a0, 0x40e0, 0x4139, 0x4362, 0x4336, 0x42a4, 0x447b, 0xabbd, 0x443a, 0x4459, 0xaf35, 0xbfb2, 0x45cc, 0x1e31, 0x1b94, 0xb07a, 0xb29e, 0x4212, 0xbae6, 0x427e, 0xb034, 0x2b28, 0x400a, 0x3ca6, 0x43a4, 0xb04a, 0xb248, 0x409a, 0xab1f, 0x4278, 0xb04b, 0x407f, 0x4291, 0xbf75, 0x415f, 0x4087, 0xb298, 0x41d4, 0x423e, 0x1b3f, 0x4206, 0xba6d, 0xb2d7, 0x458c, 0x319d, 0x4222, 0x40c1, 0x43ac, 0x4340, 0x1308, 0x4011, 0x4118, 0x40b3, 0x4379, 0xba4b, 0xb23e, 0xbf74, 0x40b5, 0x3319, 0xb07b, 0x41cb, 0xb2f9, 0x431d, 0x02c4, 0x1996, 0x419a, 0x435b, 0x255c, 0xb2f5, 0x33ad, 0xb04a, 0x4408, 0x0974, 0x42f7, 0x4339, 0xb280, 0x1b82, 0xb247, 0x464c, 0x4211, 0xbf0b, 0x4030, 0x43e6, 0x4087, 0x3611, 0x0981, 0x416e, 0x4315, 0x43c1, 0x2147, 0x4090, 0x4136, 0xbf66, 0x2933, 0x2ecf, 0x43eb, 0xb283, 0x42af, 0x1c96, 0xb09f, 0x41f2, 0xb21c, 0xbf09, 0xb087, 0x4463, 0xbaf1, 0x419d, 0xa7b0, 0xb211, 0x41a6, 0x3f86, 0xba54, 0x3385, 0x03b0, 0xb211, 0x4331, 0xaf96, 0x4119, 0x0c9e, 0x419b, 0xb2dc, 0x43d0, 0xb24c, 0x4042, 0xbf00, 0x4162, 0x1fc3, 0x4189, 0xb25a, 0x06f9, 0xb274, 0xbf6c, 0xbacf, 0x407e, 0x4204, 0x140f, 0x4309, 0x4176, 0x407e, 0x4130, 0x1c8a, 0x4354, 0x2411, 0x2605, 0xb057, 0xbf70, 0x406b, 0x3cd9, 0x437f, 0xa2e1, 0xba57, 0x069e, 0xbf76, 0x46ec, 0xbaf9, 0xb2ae, 0x436a, 0xadd9, 0xb09d, 0x40db, 0x4244, 0x1a39, 0xac08, 0x408d, 0x4021, 0x4263, 0xb281, 0x4418, 0x4116, 0x42f6, 0xa919, 0x1470, 0x1f33, 0x4245, 0x434f, 0x43ff, 0x43a1, 0x0d92, 0x4051, 0x43af, 0x30c5, 0xbf46, 0x425e, 0x4008, 0x4678, 0x42db, 0x1c2c, 0x4410, 0x1c4e, 0x4282, 0xba0d, 0x4075, 0x194f, 0x41ab, 0xb065, 0x1871, 0x412f, 0x0399, 0xa0db, 0xb239, 0x4559, 0x43d6, 0x1faf, 0x411f, 0xb0b7, 0x4606, 0x43c2, 0xbf81, 0x0823, 0x2a43, 0x18c5, 0x1a77, 0xad27, 0x43ff, 0x4212, 0x0e3c, 0x411a, 0x43a6, 0x1916, 0x4394, 0xb225, 0x1eb5, 0x449b, 0x438e, 0x40ca, 0x4623, 0xb2e3, 0x41ef, 0x4493, 0x3e02, 0x4069, 0x1c2b, 0xb234, 0x1e69, 0x41df, 0xb2b8, 0x41d8, 0xbf56, 0x05ad, 0xba1c, 0x42c2, 0x4051, 0x42b2, 0x40f4, 0x43ce, 0x44f0, 0x43f3, 0x4229, 0x213e, 0xb2c2, 0x3200, 0x4214, 0x42b6, 0x005f, 0x4075, 0xb272, 0xbaf8, 0xb224, 0xb29f, 0xbfd5, 0x40c1, 0x438e, 0x43c4, 0x0aa3, 0xa689, 0xb22f, 0x2428, 0x45bd, 0x4004, 0x43f9, 0xb29e, 0x4679, 0xb21b, 0x40bb, 0x4027, 0x40f4, 0x4074, 0xbf7b, 0x45c2, 0x43f6, 0xb2a0, 0x416c, 0xba07, 0x1da5, 0x416e, 0xba1c, 0x406a, 0x0523, 0xa9b7, 0x352b, 0x35c0, 0xbf97, 0xb26c, 0xbf60, 0x40f8, 0xba7a, 0x423f, 0x02f2, 0x4068, 0x3e52, 0x42c7, 0x4050, 0x1d10, 0x4211, 0x42d9, 0x4565, 0xb2a5, 0x416d, 0xba27, 0x420a, 0xb228, 0xbf80, 0xa3ea, 0x437b, 0xb2cf, 0xb2cb, 0x1473, 0xbf7c, 0x4285, 0x41b6, 0x4280, 0x3a9f, 0xba06, 0xba22, 0x3f7e, 0x1822, 0x1663, 0xbf80, 0x182b, 0x1d47, 0x37c4, 0xaa51, 0x1efc, 0xbfb7, 0x43b7, 0xba12, 0xbaf0, 0x40e9, 0xbf80, 0xb09e, 0x4448, 0x1f27, 0x4083, 0xac6a, 0x400e, 0x1c32, 0xba54, 0xba14, 0x249e, 0x3f80, 0x4610, 0x4293, 0x4396, 0x1e57, 0xb23f, 0xb093, 0x4161, 0x42c0, 0x3494, 0x40d5, 0xbf56, 0x1ee5, 0x2143, 0x18b0, 0x4360, 0x46a4, 0x1930, 0xba5a, 0x44d0, 0x1ad6, 0x371e, 0xb2ce, 0x1534, 0xb09c, 0x1b0b, 0x095d, 0x2f9f, 0x1608, 0x40f7, 0xbada, 0x05c1, 0xbf3e, 0xa521, 0xb29a, 0x42af, 0x404a, 0x0f8c, 0x41c9, 0xb089, 0x1a99, 0xba0a, 0x1fc9, 0xb25b, 0x41a2, 0x4109, 0x40b7, 0x364f, 0x2648, 0x011f, 0x4157, 0xbf47, 0xb037, 0x1b4a, 0x4096, 0x41a8, 0x4246, 0xba0f, 0x40f0, 0xb250, 0xbf59, 0x42b7, 0xb251, 0xba5b, 0xb0d1, 0x4208, 0x4103, 0x40a7, 0x4355, 0xb216, 0x4476, 0x1962, 0xb03d, 0xba1a, 0x1928, 0x1f0b, 0xbf71, 0x2d76, 0x40f6, 0x4369, 0x29d5, 0x42f6, 0x1dd5, 0xb25e, 0xaf1a, 0x42fd, 0x40b9, 0x41bb, 0xa259, 0x40b7, 0x45f6, 0x4283, 0xbf3e, 0xba6c, 0xbae8, 0x41cb, 0xbf08, 0x42f3, 0x15e3, 0x1eb6, 0x386c, 0xb090, 0x1d6c, 0x3160, 0x43ca, 0x1a41, 0xb260, 0x4252, 0x3a39, 0xae9f, 0x41cf, 0xb2ae, 0x40ed, 0x4347, 0xb2ae, 0xba31, 0xbfda, 0x43a6, 0x4125, 0xb036, 0x408f, 0xba00, 0x1ddf, 0x4062, 0xb0ba, 0x4176, 0xba23, 0x2c17, 0x42e6, 0x3bc2, 0x43fb, 0x11b5, 0x400e, 0x439d, 0x3079, 0xb0a7, 0xbf7b, 0xb0e1, 0x4271, 0x44d1, 0xbfb0, 0xb028, 0xb015, 0x43d1, 0x4322, 0x1dcf, 0x42cc, 0xbac0, 0x1847, 0xbfd1, 0xb036, 0xb060, 0x2bea, 0x4020, 0x4193, 0x43d5, 0xaa64, 0x41c7, 0x427c, 0x41ec, 0xbf0b, 0x4398, 0x4200, 0x4283, 0x4000, 0x1f81, 0x44d1, 0x42d6, 0x402c, 0x0e29, 0x4606, 0xb0b9, 0x4093, 0x40fa, 0x42b6, 0xba48, 0x43a9, 0xbf72, 0x1aba, 0xbf00, 0x369e, 0xbf00, 0x4109, 0x251e, 0xba6f, 0x40bc, 0x4464, 0x40d4, 0x3776, 0xb2de, 0xb01a, 0xb05d, 0x27ed, 0xb252, 0x368f, 0xb044, 0x45e0, 0xba62, 0x4135, 0xbf23, 0x4188, 0x41f4, 0xb223, 0x418e, 0x40e4, 0x4256, 0xbf01, 0x411b, 0x1f16, 0x4253, 0xbadd, 0x43e0, 0xaeab, 0x4431, 0x24cb, 0x30b8, 0x406e, 0xb0e9, 0x41aa, 0x43a6, 0x438e, 0x4342, 0x4307, 0x419c, 0x4053, 0x4311, 0x41c7, 0x4152, 0x1ba5, 0x41db, 0x42a0, 0x40b8, 0xbf2e, 0xb01c, 0x423b, 0x1d13, 0xb262, 0xba11, 0x1803, 0x433e, 0x287b, 0x1977, 0xb0ba, 0x297d, 0xbf01, 0xb294, 0x40bf, 0x4391, 0x43e8, 0x232d, 0x431a, 0x4228, 0x375a, 0x36d7, 0x424d, 0xbf60, 0x4071, 0x40e8, 0x3242, 0xb0fe, 0x4214, 0x41a3, 0xbf62, 0x2756, 0x40f0, 0xba17, 0x3696, 0x427f, 0xaaa1, 0xbfa9, 0x4285, 0x427c, 0xa783, 0x4369, 0x274e, 0xb299, 0x411c, 0x40f0, 0x073b, 0x40d4, 0x43f7, 0xba1b, 0xb22d, 0x1c83, 0x1f11, 0x4277, 0x32b1, 0xbf52, 0x424b, 0x438f, 0xbfd0, 0x4118, 0x39e7, 0xba37, 0x3e6d, 0x41f3, 0x4239, 0x2daa, 0xbfa6, 0x432e, 0xb015, 0xb2f6, 0xbaf2, 0x4184, 0x4324, 0x1c78, 0xbaf1, 0xba29, 0xbfca, 0x1b4d, 0xb28b, 0x4577, 0x3ade, 0x43b3, 0xbf64, 0x401f, 0x41d7, 0x4060, 0x1be9, 0x4453, 0xba44, 0x37d4, 0x424a, 0xb006, 0x1882, 0xbac4, 0xba5b, 0x3c59, 0x0c92, 0x42a0, 0xba4e, 0x2d9b, 0xbfe4, 0x441b, 0x2199, 0x05fd, 0x43b2, 0xba42, 0x4301, 0x1ec4, 0x4656, 0xb0e4, 0xb06e, 0xbf82, 0x40a6, 0xaebe, 0x30ca, 0x4181, 0x42a4, 0xb24d, 0x4080, 0x43ca, 0x3592, 0x1943, 0x4217, 0x43ee, 0x08c3, 0xb003, 0x2cbd, 0x4412, 0x2e2f, 0x26db, 0x4179, 0x42a4, 0x36d3, 0xbfb2, 0x4386, 0x431c, 0x44ba, 0x4464, 0xb281, 0x40b3, 0x4152, 0xb25b, 0x41f2, 0xb059, 0xb278, 0x0dfe, 0x425f, 0x4215, 0x3ca0, 0x4234, 0xbad2, 0x41f0, 0x3f2d, 0x43ce, 0x4218, 0xbf12, 0x45e9, 0x1a54, 0x1fff, 0xacd6, 0x410e, 0xbf8f, 0xb0e1, 0x352d, 0x1fed, 0x1af4, 0x428e, 0x3c91, 0xb039, 0x4079, 0x4347, 0x3c04, 0x4424, 0x4260, 0xa798, 0x41b9, 0x4033, 0x4238, 0x2419, 0x4227, 0x0d53, 0xb2c3, 0x42d7, 0xbf14, 0x46a5, 0x0852, 0xa387, 0x13d9, 0x41c7, 0x1f38, 0x43e8, 0x1dcc, 0x43e6, 0x465a, 0x419a, 0x4387, 0x4338, 0x43a0, 0x033e, 0xba5d, 0x4176, 0x3d63, 0x3285, 0x1d0b, 0xacee, 0x4105, 0x44e8, 0x3c90, 0xa4a5, 0xbf17, 0x432e, 0x4020, 0x4367, 0x43ee, 0x43f8, 0x3f58, 0x1f04, 0x08fa, 0x43cf, 0xb097, 0xba07, 0xb228, 0x45c4, 0x09ae, 0xbf31, 0x31a7, 0x3a09, 0x42cf, 0x4019, 0x2390, 0x4145, 0x4179, 0x40bd, 0xb243, 0xbf5d, 0x3f0c, 0x3406, 0x1f8a, 0xba3b, 0xbfb5, 0x43b0, 0x3120, 0xb26c, 0xa3b0, 0x4272, 0x465d, 0x3214, 0xba0e, 0x3a60, 0x4230, 0x2d1c, 0x43ea, 0xbf63, 0x43ae, 0x14fa, 0x38d6, 0x423d, 0xac84, 0xb210, 0x402e, 0xb273, 0x441e, 0x43b0, 0xab4e, 0xb275, 0x42c8, 0x41f1, 0xb2ba, 0x42fd, 0x40b9, 0x4244, 0x42ed, 0x420d, 0x4190, 0xba13, 0xba1f, 0x2758, 0x40d7, 0x1012, 0x41f7, 0xbff0, 0xbfaf, 0x1aee, 0x425b, 0x0e1a, 0x3ddb, 0xb2e9, 0xba50, 0x3fd8, 0x1ba9, 0xb002, 0x437d, 0x4279, 0x34fb, 0xba3b, 0x43e3, 0x4185, 0xba1f, 0xa0db, 0x4218, 0x3d58, 0x0f00, 0xb2b0, 0x429f, 0xb063, 0xbf0d, 0xba52, 0xba07, 0xa5c8, 0x409c, 0x431f, 0xb2f9, 0x1ff7, 0xb0e6, 0x463f, 0x3ac2, 0xba14, 0xba7c, 0xbf43, 0xbff0, 0x40b3, 0x2e64, 0xa3a0, 0x1bac, 0xb2c7, 0x1f9a, 0x31d1, 0x387c, 0x1993, 0x4224, 0xba20, 0x4044, 0xb2f2, 0x1983, 0x428f, 0x11fc, 0x00a5, 0xb071, 0x12ae, 0x4007, 0x15cc, 0xbfcf, 0x416e, 0x0667, 0x1b46, 0xb250, 0x4285, 0x41ea, 0xa38d, 0x43dd, 0x43a7, 0xa77b, 0x0711, 0xba66, 0x445c, 0x1b40, 0x4095, 0x41b8, 0x400b, 0x4079, 0x3567, 0x43a6, 0x461d, 0x435d, 0x4036, 0x42fa, 0xa9a6, 0x43b7, 0xb295, 0x427e, 0x4300, 0xbf54, 0xb0f4, 0x2b0b, 0x4770, 0xe7fe + ], + StartRegs = [0x36179bbd, 0x4c84b624, 0xf2f6b902, 0xcc71b138, 0x0afbc809, 0xac7ce4df, 0xb01ce320, 0xe9d87f98, 0xc61c700a, 0x6f44ba87, 0x76d17376, 0x6c662875, 0x88e99f9f, 0x5ec4aa7f, 0x00000000, 0x500001f0 + ], + FinalRegs = [0xffffffeb, 0x00000415, 0x6000000a, 0x00000000, 0xf16324f3, 0x0000000a, 0xffffe660, 0x000019a0, 0x3cede399, 0xd596226d, 0xe4d0754a, 0xf16324f3, 0x00000132, 0x0000017d, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x4194, 0x41e1, 0x426d, 0xabea, 0xa7e7, 0x181f, 0x4209, 0x38b4, 0x4330, 0x42fd, 0x40db, 0xbfb4, 0x1903, 0x4570, 0xba65, 0xa18b, 0x1868, 0x41bc, 0xb269, 0x3a0f, 0xb2ef, 0x43d0, 0x301c, 0x1b59, 0x4185, 0xa33d, 0x43c3, 0x448a, 0xa735, 0x1c22, 0x4273, 0x4584, 0xb215, 0xbfb5, 0xb059, 0x43ed, 0x412b, 0x1c26, 0xb0cb, 0xbae5, 0x40ca, 0xb28a, 0x19c5, 0x4120, 0x4274, 0x4594, 0xba53, 0x42c7, 0xbf71, 0x4182, 0x43e9, 0x412a, 0x28e9, 0x4057, 0x4310, 0x41a1, 0x40cd, 0xbfac, 0xba50, 0xaa8a, 0x26a9, 0x432c, 0x46b1, 0x454c, 0x1542, 0x4222, 0x02f8, 0xb2f9, 0x4014, 0xb23d, 0xbf55, 0xbfd0, 0x404a, 0x3680, 0x40a4, 0x4275, 0x42b9, 0x4249, 0xbfa7, 0x2da6, 0xa070, 0x4377, 0x10a2, 0x411c, 0x1f50, 0x466a, 0xa9fd, 0x237a, 0x43e4, 0xb2b7, 0x4457, 0x4157, 0x2ec4, 0x4606, 0x41f1, 0x4432, 0x1376, 0x4143, 0x4663, 0x43ae, 0xbf8a, 0x426f, 0xb299, 0x422f, 0x1c31, 0x415c, 0x39de, 0xbf60, 0x25cc, 0x4097, 0xb24e, 0xbac7, 0xb2c8, 0x4030, 0x43f2, 0x41af, 0x4012, 0xb2d2, 0x4415, 0xbf9e, 0x4208, 0xba30, 0x1d45, 0x0615, 0xb2d8, 0xba11, 0x40f9, 0x4011, 0x42c7, 0xb262, 0x41df, 0x429f, 0x0b94, 0x1fbf, 0xbf94, 0xb2c3, 0x4073, 0x40e2, 0x4166, 0xa2e0, 0x4475, 0x4026, 0xb0a2, 0xb20a, 0x1c3b, 0xa334, 0xa04c, 0xaae3, 0xbf85, 0xba51, 0x42c5, 0xa2df, 0x43c6, 0x42f2, 0x4252, 0x43bb, 0xbf96, 0xa5a2, 0x41ae, 0xa663, 0x11de, 0xbaeb, 0x1b6f, 0x42f3, 0xba22, 0xbfe1, 0x438c, 0xba76, 0xb2e7, 0xa84c, 0x4389, 0x14e8, 0x316f, 0x1e56, 0xa1ea, 0x4270, 0x0962, 0x1f5d, 0x40f4, 0xbf69, 0xbae7, 0x4019, 0x1c1e, 0x43fe, 0x4245, 0x1a32, 0x418f, 0x10f5, 0x1a47, 0x1d6f, 0xa720, 0xb0e0, 0x43ae, 0x0ac4, 0x4232, 0x4044, 0x42fe, 0xbaf8, 0xba6b, 0x19ef, 0x408b, 0x4287, 0x41a5, 0xbfc6, 0x1d24, 0xb2f7, 0xb291, 0xaf34, 0x40f3, 0x1a78, 0xba54, 0x08f7, 0x19b6, 0x3b08, 0xba23, 0x318f, 0x1fe9, 0x4646, 0xbf41, 0x1b4a, 0x4224, 0xb201, 0x221a, 0x4027, 0xb09c, 0xbada, 0x438d, 0xa29c, 0xba71, 0x43ed, 0x40ee, 0x408a, 0x4366, 0xbf02, 0xb2f8, 0xb09a, 0x35f4, 0xb2db, 0x0d06, 0xba58, 0x42c8, 0x4374, 0x40f9, 0x42c4, 0xbaee, 0x4014, 0xba77, 0x4330, 0xb0f9, 0x43b5, 0x3ee4, 0xba5c, 0xa37c, 0x18f9, 0xba01, 0x43e4, 0x45ad, 0x3b98, 0x431c, 0xae45, 0xb0e9, 0xba6a, 0xbf3f, 0xb093, 0x40cf, 0x31f1, 0xbae3, 0x18e3, 0xafbb, 0x46fb, 0x4467, 0x4377, 0x4439, 0x46fd, 0x01e6, 0x43ca, 0x423d, 0xbf80, 0xb2f8, 0x439c, 0x4158, 0xbf9e, 0x4343, 0x433d, 0x41a2, 0x2ced, 0xbae8, 0x1b42, 0x3e7d, 0x41ba, 0x4022, 0x43a7, 0x424b, 0x4253, 0xb0e9, 0x42b3, 0x1d29, 0x2454, 0x412b, 0x4253, 0x4156, 0xbfd3, 0x423a, 0x400b, 0xba35, 0x1cf9, 0x00db, 0x04bb, 0x1b4c, 0xbafc, 0x1fb0, 0xb034, 0xb2a7, 0x4328, 0x4248, 0xbf67, 0x1bc5, 0x42c7, 0x157d, 0xb206, 0x4040, 0xa039, 0xaf24, 0x41b8, 0xa314, 0x2db8, 0x1a50, 0xb2df, 0x35ca, 0x423d, 0xb23f, 0x41ee, 0x456c, 0x4365, 0xb2d6, 0x421a, 0xba7d, 0x43be, 0x43a1, 0xbf39, 0x2460, 0xb271, 0x2223, 0x3e58, 0x1ac1, 0x4225, 0x422b, 0xb0af, 0xb2df, 0xba76, 0x4085, 0x4226, 0x1f02, 0xb2a0, 0x41a6, 0xa49b, 0xbfb0, 0x4097, 0x4145, 0xbf82, 0x414e, 0xb240, 0x246d, 0xba4b, 0xaca3, 0x35f0, 0x42c9, 0x3d4b, 0x46db, 0x43fe, 0xba60, 0x1736, 0x100c, 0xbaf4, 0xa17b, 0x42ae, 0xbfdd, 0x0867, 0xb0b5, 0x4236, 0x420b, 0x4256, 0x4166, 0x4653, 0x4372, 0x1a16, 0xa649, 0x43e3, 0x42a6, 0xbf5f, 0x3fd3, 0x31db, 0x41fa, 0x2e10, 0x3186, 0xa1ae, 0xb012, 0xb2f5, 0x3260, 0x44a2, 0x43dc, 0x05d4, 0x41a8, 0xb030, 0x443b, 0x2d52, 0xba2f, 0x44f2, 0x4200, 0xba05, 0x42f4, 0x431b, 0x1ae3, 0xb2db, 0x4405, 0xbaeb, 0x3772, 0x423d, 0xbf1f, 0x20f7, 0x40be, 0x1b66, 0x1b9f, 0x439e, 0x0d71, 0xa52b, 0x1fd0, 0x2322, 0xbff0, 0xac82, 0xbfa0, 0x274e, 0x4079, 0xafe0, 0x1f38, 0x4235, 0x1de4, 0x403d, 0x434b, 0x343f, 0xba6d, 0xba07, 0xbf02, 0x439f, 0x46c1, 0xba20, 0xb206, 0x4127, 0xba1f, 0x4226, 0xb295, 0x436b, 0xb2aa, 0xa2b9, 0xba5e, 0x423f, 0xb008, 0xb00f, 0xb081, 0x0a56, 0xbfa3, 0x3f44, 0xb0a9, 0x4022, 0x244d, 0xb07d, 0xba2b, 0xbf90, 0xbfa0, 0x41a1, 0xba26, 0x2997, 0xa317, 0xb2ce, 0x410e, 0xba51, 0x40a8, 0x4285, 0x20bd, 0x411d, 0x1eaa, 0xbfcd, 0x4027, 0x4032, 0x42f8, 0x286a, 0xb212, 0x4191, 0x184a, 0x43a3, 0x4097, 0xba16, 0x369b, 0x4336, 0x46e2, 0xa6ed, 0x41f2, 0x0322, 0xb2ab, 0xbf48, 0x4139, 0x4077, 0x4096, 0x1da1, 0x4266, 0x4365, 0xb051, 0x413b, 0x45cb, 0x1533, 0x425c, 0x423e, 0xba34, 0x4679, 0x3ad5, 0x439b, 0x420d, 0x4228, 0x4406, 0xbf42, 0x4211, 0x4272, 0xb2a1, 0xb272, 0xb2d0, 0xa24b, 0xb0b4, 0x36f9, 0x1c6f, 0x405c, 0x36ad, 0x411f, 0x41d2, 0x426f, 0xb2f9, 0x29f9, 0x4572, 0x43cf, 0x4016, 0x4068, 0x4262, 0x151a, 0xbfa5, 0xafd2, 0x4382, 0x4308, 0x46e4, 0x43cb, 0x18af, 0x428e, 0xac0f, 0x1f7c, 0xbfc1, 0x425a, 0x424e, 0x120e, 0x43fa, 0x0332, 0x19c4, 0x4044, 0xbf0a, 0xbac9, 0x435b, 0x4255, 0xbf92, 0x41b7, 0x42a9, 0x08e3, 0x4114, 0x42ad, 0xb27b, 0x1ab9, 0x0adf, 0xbaed, 0x40b7, 0x307f, 0x4457, 0x40f1, 0x4296, 0xb218, 0xb21d, 0xb2d0, 0x4054, 0x40b4, 0x41ee, 0x45d1, 0x1f57, 0x011c, 0x4174, 0xbf02, 0x417a, 0x4124, 0x2931, 0x4021, 0xbac1, 0xb2ac, 0x4034, 0x4138, 0x44a1, 0x41a5, 0x4034, 0x30f3, 0x1952, 0xb003, 0x3fb2, 0x4624, 0xb04f, 0x3f0f, 0xbf54, 0xa9c0, 0x43af, 0xb2b0, 0xb0f0, 0xb2d8, 0x4288, 0x17b6, 0x2e75, 0x416f, 0x1f51, 0x1a93, 0xbfe4, 0x410c, 0x4465, 0x407b, 0x426d, 0x46a2, 0x37d7, 0xbfc7, 0xb2ee, 0x09c2, 0x41b0, 0x41a5, 0xba50, 0x4081, 0x459d, 0x4437, 0x433e, 0x1473, 0x435d, 0xbf00, 0x43fa, 0x1863, 0xb021, 0x4585, 0x4096, 0x1b2a, 0xbfb2, 0x067e, 0x18e2, 0xb20f, 0x43af, 0x4080, 0x1b32, 0xb29e, 0x0a11, 0x434a, 0x4392, 0x424e, 0xb2e3, 0x40a6, 0xab7a, 0x09d9, 0x1fed, 0x43c1, 0x19d4, 0x4089, 0xb236, 0x1f21, 0xb2e0, 0x4289, 0x461d, 0xaaf9, 0xbf3c, 0x1183, 0x0293, 0xa59b, 0x43bc, 0xb047, 0x403e, 0xb26a, 0xbfd2, 0x11e9, 0x4672, 0xbfa0, 0x414f, 0x39c9, 0xb2e5, 0x43a6, 0x43f4, 0xa04b, 0xa4bb, 0x4359, 0x4297, 0x41cb, 0x44e3, 0x2f11, 0xb237, 0x1971, 0x1c47, 0xbf3a, 0x424d, 0x448d, 0xb211, 0x412c, 0x41c1, 0x41e1, 0x41cc, 0x4265, 0xb08b, 0x4224, 0xba4b, 0xb240, 0xba27, 0xba7b, 0xbaca, 0xbfac, 0xb27c, 0x1d89, 0x43be, 0x1f77, 0xbf00, 0x43ea, 0x4326, 0xba22, 0x0315, 0xbf02, 0x42a2, 0x405a, 0xba05, 0x4152, 0xbfb0, 0xba4c, 0x42c6, 0x4334, 0x18b9, 0x4250, 0x40c8, 0xbf77, 0x33a6, 0xa4d7, 0xba55, 0x4361, 0x274f, 0xba03, 0x1ae7, 0x4038, 0xbf8d, 0x40fe, 0x1b4b, 0x4063, 0x40b7, 0xb2c8, 0x40ce, 0x38c1, 0xba40, 0x410f, 0x4445, 0x33b7, 0xba40, 0x4378, 0x3c3e, 0x4286, 0x41b1, 0xb219, 0xb23e, 0x437b, 0x2d6d, 0xbf9f, 0x1a09, 0xb00d, 0x436b, 0x41a5, 0x2188, 0xb29e, 0xb02f, 0x4255, 0x40ff, 0x4095, 0x4226, 0x1baf, 0x46ad, 0x262a, 0xa6a5, 0x1bf9, 0x41f0, 0x42fb, 0x43b9, 0xbf4a, 0x1d63, 0x1a48, 0x3668, 0x2ad8, 0xa836, 0xb0ad, 0xb205, 0xbf96, 0x1e1d, 0x27ba, 0x4677, 0xbac0, 0xa376, 0x40be, 0xbf05, 0xb2e9, 0x4164, 0x3e9d, 0x43b9, 0x4330, 0x1136, 0xba46, 0x41ae, 0x41c7, 0xb20f, 0xbafd, 0x42a2, 0x4007, 0xa269, 0x434e, 0xac40, 0x42da, 0x4553, 0xb2f3, 0xbfce, 0x433f, 0xa7f6, 0x4294, 0xb2e6, 0x41f3, 0x4355, 0x10e0, 0xb226, 0xb239, 0x1a8c, 0xb014, 0x431c, 0x1391, 0xba2d, 0x41ba, 0x402f, 0xb025, 0xb2bb, 0x35c5, 0xa0c6, 0x4042, 0xb27b, 0x4120, 0x250f, 0x4272, 0xbf32, 0x1a7c, 0x1e48, 0xbaf6, 0x1f12, 0x432a, 0x4608, 0x40f1, 0x1b8e, 0x1e05, 0x4021, 0x4053, 0xbf48, 0x41aa, 0xb2e4, 0xb230, 0x43ea, 0x1f4c, 0xa125, 0x1ef8, 0x4139, 0x4376, 0xbf6d, 0x42db, 0x32da, 0x4222, 0x2930, 0x2189, 0x4116, 0xb077, 0x429a, 0x40db, 0x45ac, 0x1a86, 0x1546, 0xb21d, 0x463a, 0x4062, 0xbf3e, 0x1a52, 0x407c, 0xba38, 0x454e, 0xa28b, 0x42a2, 0x3760, 0x1e45, 0x19ab, 0x292e, 0x0f80, 0x1d7e, 0x4572, 0x19be, 0x4318, 0xb0e2, 0x2ead, 0xbf15, 0x43d3, 0xb297, 0x4156, 0x4274, 0x3215, 0x43d5, 0x4101, 0x4009, 0x14bb, 0x4217, 0xb228, 0xba72, 0x1a16, 0x41af, 0x40c8, 0x4314, 0xb22a, 0x43a4, 0xb212, 0x4139, 0xb23d, 0x1b80, 0x1b4f, 0xb064, 0xbfb1, 0xb0ea, 0x419e, 0xa853, 0x406b, 0x41ba, 0xbfbd, 0x4353, 0x4018, 0x45e1, 0xba2b, 0xb264, 0x42e9, 0xb2e9, 0x40c2, 0x395e, 0x437f, 0x43f4, 0x406e, 0x0807, 0xba3e, 0xbf88, 0x430a, 0x43af, 0x4417, 0x426d, 0x410c, 0xbff0, 0x4683, 0xb25f, 0xbf00, 0xbf5c, 0xba47, 0x4033, 0x1942, 0x43e0, 0x12e6, 0x3c46, 0x436c, 0xba3c, 0x0145, 0x43cc, 0xb2d6, 0x4477, 0xb2d5, 0xb0d1, 0x4189, 0x43eb, 0x1ac6, 0xb258, 0xb0b6, 0xbf57, 0xbf60, 0x4285, 0x4364, 0x416f, 0x4111, 0x0d56, 0xb286, 0x4066, 0xb2dd, 0x4156, 0x4217, 0xa9c0, 0x43c6, 0xaf85, 0xb258, 0x41cb, 0xbfc4, 0x4220, 0x43bc, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5163634f, 0x69953bc6, 0xc471194b, 0xd797bd76, 0xca82e30c, 0xd0e3d0b1, 0x315d5946, 0x74209518, 0xbfc706cf, 0x907cff0b, 0x9e3f1e57, 0x892343bb, 0x37dc0fed, 0xbc49e0f0, 0x00000000, 0xa00001f0 }, - FinalRegs = new uint[] { 0x00000025, 0x9eb0014e, 0xfffec9da, 0xfc97ffff, 0x00000e10, 0x00000025, 0xffffffda, 0x9eb00062, 0xbfc706cf, 0x000000ad, 0x00000000, 0xfffee373, 0x37dc0fed, 0x9eaffe4e, 0x00000000, 0xa00001d0 }, + Instructions = [0x4194, 0x41e1, 0x426d, 0xabea, 0xa7e7, 0x181f, 0x4209, 0x38b4, 0x4330, 0x42fd, 0x40db, 0xbfb4, 0x1903, 0x4570, 0xba65, 0xa18b, 0x1868, 0x41bc, 0xb269, 0x3a0f, 0xb2ef, 0x43d0, 0x301c, 0x1b59, 0x4185, 0xa33d, 0x43c3, 0x448a, 0xa735, 0x1c22, 0x4273, 0x4584, 0xb215, 0xbfb5, 0xb059, 0x43ed, 0x412b, 0x1c26, 0xb0cb, 0xbae5, 0x40ca, 0xb28a, 0x19c5, 0x4120, 0x4274, 0x4594, 0xba53, 0x42c7, 0xbf71, 0x4182, 0x43e9, 0x412a, 0x28e9, 0x4057, 0x4310, 0x41a1, 0x40cd, 0xbfac, 0xba50, 0xaa8a, 0x26a9, 0x432c, 0x46b1, 0x454c, 0x1542, 0x4222, 0x02f8, 0xb2f9, 0x4014, 0xb23d, 0xbf55, 0xbfd0, 0x404a, 0x3680, 0x40a4, 0x4275, 0x42b9, 0x4249, 0xbfa7, 0x2da6, 0xa070, 0x4377, 0x10a2, 0x411c, 0x1f50, 0x466a, 0xa9fd, 0x237a, 0x43e4, 0xb2b7, 0x4457, 0x4157, 0x2ec4, 0x4606, 0x41f1, 0x4432, 0x1376, 0x4143, 0x4663, 0x43ae, 0xbf8a, 0x426f, 0xb299, 0x422f, 0x1c31, 0x415c, 0x39de, 0xbf60, 0x25cc, 0x4097, 0xb24e, 0xbac7, 0xb2c8, 0x4030, 0x43f2, 0x41af, 0x4012, 0xb2d2, 0x4415, 0xbf9e, 0x4208, 0xba30, 0x1d45, 0x0615, 0xb2d8, 0xba11, 0x40f9, 0x4011, 0x42c7, 0xb262, 0x41df, 0x429f, 0x0b94, 0x1fbf, 0xbf94, 0xb2c3, 0x4073, 0x40e2, 0x4166, 0xa2e0, 0x4475, 0x4026, 0xb0a2, 0xb20a, 0x1c3b, 0xa334, 0xa04c, 0xaae3, 0xbf85, 0xba51, 0x42c5, 0xa2df, 0x43c6, 0x42f2, 0x4252, 0x43bb, 0xbf96, 0xa5a2, 0x41ae, 0xa663, 0x11de, 0xbaeb, 0x1b6f, 0x42f3, 0xba22, 0xbfe1, 0x438c, 0xba76, 0xb2e7, 0xa84c, 0x4389, 0x14e8, 0x316f, 0x1e56, 0xa1ea, 0x4270, 0x0962, 0x1f5d, 0x40f4, 0xbf69, 0xbae7, 0x4019, 0x1c1e, 0x43fe, 0x4245, 0x1a32, 0x418f, 0x10f5, 0x1a47, 0x1d6f, 0xa720, 0xb0e0, 0x43ae, 0x0ac4, 0x4232, 0x4044, 0x42fe, 0xbaf8, 0xba6b, 0x19ef, 0x408b, 0x4287, 0x41a5, 0xbfc6, 0x1d24, 0xb2f7, 0xb291, 0xaf34, 0x40f3, 0x1a78, 0xba54, 0x08f7, 0x19b6, 0x3b08, 0xba23, 0x318f, 0x1fe9, 0x4646, 0xbf41, 0x1b4a, 0x4224, 0xb201, 0x221a, 0x4027, 0xb09c, 0xbada, 0x438d, 0xa29c, 0xba71, 0x43ed, 0x40ee, 0x408a, 0x4366, 0xbf02, 0xb2f8, 0xb09a, 0x35f4, 0xb2db, 0x0d06, 0xba58, 0x42c8, 0x4374, 0x40f9, 0x42c4, 0xbaee, 0x4014, 0xba77, 0x4330, 0xb0f9, 0x43b5, 0x3ee4, 0xba5c, 0xa37c, 0x18f9, 0xba01, 0x43e4, 0x45ad, 0x3b98, 0x431c, 0xae45, 0xb0e9, 0xba6a, 0xbf3f, 0xb093, 0x40cf, 0x31f1, 0xbae3, 0x18e3, 0xafbb, 0x46fb, 0x4467, 0x4377, 0x4439, 0x46fd, 0x01e6, 0x43ca, 0x423d, 0xbf80, 0xb2f8, 0x439c, 0x4158, 0xbf9e, 0x4343, 0x433d, 0x41a2, 0x2ced, 0xbae8, 0x1b42, 0x3e7d, 0x41ba, 0x4022, 0x43a7, 0x424b, 0x4253, 0xb0e9, 0x42b3, 0x1d29, 0x2454, 0x412b, 0x4253, 0x4156, 0xbfd3, 0x423a, 0x400b, 0xba35, 0x1cf9, 0x00db, 0x04bb, 0x1b4c, 0xbafc, 0x1fb0, 0xb034, 0xb2a7, 0x4328, 0x4248, 0xbf67, 0x1bc5, 0x42c7, 0x157d, 0xb206, 0x4040, 0xa039, 0xaf24, 0x41b8, 0xa314, 0x2db8, 0x1a50, 0xb2df, 0x35ca, 0x423d, 0xb23f, 0x41ee, 0x456c, 0x4365, 0xb2d6, 0x421a, 0xba7d, 0x43be, 0x43a1, 0xbf39, 0x2460, 0xb271, 0x2223, 0x3e58, 0x1ac1, 0x4225, 0x422b, 0xb0af, 0xb2df, 0xba76, 0x4085, 0x4226, 0x1f02, 0xb2a0, 0x41a6, 0xa49b, 0xbfb0, 0x4097, 0x4145, 0xbf82, 0x414e, 0xb240, 0x246d, 0xba4b, 0xaca3, 0x35f0, 0x42c9, 0x3d4b, 0x46db, 0x43fe, 0xba60, 0x1736, 0x100c, 0xbaf4, 0xa17b, 0x42ae, 0xbfdd, 0x0867, 0xb0b5, 0x4236, 0x420b, 0x4256, 0x4166, 0x4653, 0x4372, 0x1a16, 0xa649, 0x43e3, 0x42a6, 0xbf5f, 0x3fd3, 0x31db, 0x41fa, 0x2e10, 0x3186, 0xa1ae, 0xb012, 0xb2f5, 0x3260, 0x44a2, 0x43dc, 0x05d4, 0x41a8, 0xb030, 0x443b, 0x2d52, 0xba2f, 0x44f2, 0x4200, 0xba05, 0x42f4, 0x431b, 0x1ae3, 0xb2db, 0x4405, 0xbaeb, 0x3772, 0x423d, 0xbf1f, 0x20f7, 0x40be, 0x1b66, 0x1b9f, 0x439e, 0x0d71, 0xa52b, 0x1fd0, 0x2322, 0xbff0, 0xac82, 0xbfa0, 0x274e, 0x4079, 0xafe0, 0x1f38, 0x4235, 0x1de4, 0x403d, 0x434b, 0x343f, 0xba6d, 0xba07, 0xbf02, 0x439f, 0x46c1, 0xba20, 0xb206, 0x4127, 0xba1f, 0x4226, 0xb295, 0x436b, 0xb2aa, 0xa2b9, 0xba5e, 0x423f, 0xb008, 0xb00f, 0xb081, 0x0a56, 0xbfa3, 0x3f44, 0xb0a9, 0x4022, 0x244d, 0xb07d, 0xba2b, 0xbf90, 0xbfa0, 0x41a1, 0xba26, 0x2997, 0xa317, 0xb2ce, 0x410e, 0xba51, 0x40a8, 0x4285, 0x20bd, 0x411d, 0x1eaa, 0xbfcd, 0x4027, 0x4032, 0x42f8, 0x286a, 0xb212, 0x4191, 0x184a, 0x43a3, 0x4097, 0xba16, 0x369b, 0x4336, 0x46e2, 0xa6ed, 0x41f2, 0x0322, 0xb2ab, 0xbf48, 0x4139, 0x4077, 0x4096, 0x1da1, 0x4266, 0x4365, 0xb051, 0x413b, 0x45cb, 0x1533, 0x425c, 0x423e, 0xba34, 0x4679, 0x3ad5, 0x439b, 0x420d, 0x4228, 0x4406, 0xbf42, 0x4211, 0x4272, 0xb2a1, 0xb272, 0xb2d0, 0xa24b, 0xb0b4, 0x36f9, 0x1c6f, 0x405c, 0x36ad, 0x411f, 0x41d2, 0x426f, 0xb2f9, 0x29f9, 0x4572, 0x43cf, 0x4016, 0x4068, 0x4262, 0x151a, 0xbfa5, 0xafd2, 0x4382, 0x4308, 0x46e4, 0x43cb, 0x18af, 0x428e, 0xac0f, 0x1f7c, 0xbfc1, 0x425a, 0x424e, 0x120e, 0x43fa, 0x0332, 0x19c4, 0x4044, 0xbf0a, 0xbac9, 0x435b, 0x4255, 0xbf92, 0x41b7, 0x42a9, 0x08e3, 0x4114, 0x42ad, 0xb27b, 0x1ab9, 0x0adf, 0xbaed, 0x40b7, 0x307f, 0x4457, 0x40f1, 0x4296, 0xb218, 0xb21d, 0xb2d0, 0x4054, 0x40b4, 0x41ee, 0x45d1, 0x1f57, 0x011c, 0x4174, 0xbf02, 0x417a, 0x4124, 0x2931, 0x4021, 0xbac1, 0xb2ac, 0x4034, 0x4138, 0x44a1, 0x41a5, 0x4034, 0x30f3, 0x1952, 0xb003, 0x3fb2, 0x4624, 0xb04f, 0x3f0f, 0xbf54, 0xa9c0, 0x43af, 0xb2b0, 0xb0f0, 0xb2d8, 0x4288, 0x17b6, 0x2e75, 0x416f, 0x1f51, 0x1a93, 0xbfe4, 0x410c, 0x4465, 0x407b, 0x426d, 0x46a2, 0x37d7, 0xbfc7, 0xb2ee, 0x09c2, 0x41b0, 0x41a5, 0xba50, 0x4081, 0x459d, 0x4437, 0x433e, 0x1473, 0x435d, 0xbf00, 0x43fa, 0x1863, 0xb021, 0x4585, 0x4096, 0x1b2a, 0xbfb2, 0x067e, 0x18e2, 0xb20f, 0x43af, 0x4080, 0x1b32, 0xb29e, 0x0a11, 0x434a, 0x4392, 0x424e, 0xb2e3, 0x40a6, 0xab7a, 0x09d9, 0x1fed, 0x43c1, 0x19d4, 0x4089, 0xb236, 0x1f21, 0xb2e0, 0x4289, 0x461d, 0xaaf9, 0xbf3c, 0x1183, 0x0293, 0xa59b, 0x43bc, 0xb047, 0x403e, 0xb26a, 0xbfd2, 0x11e9, 0x4672, 0xbfa0, 0x414f, 0x39c9, 0xb2e5, 0x43a6, 0x43f4, 0xa04b, 0xa4bb, 0x4359, 0x4297, 0x41cb, 0x44e3, 0x2f11, 0xb237, 0x1971, 0x1c47, 0xbf3a, 0x424d, 0x448d, 0xb211, 0x412c, 0x41c1, 0x41e1, 0x41cc, 0x4265, 0xb08b, 0x4224, 0xba4b, 0xb240, 0xba27, 0xba7b, 0xbaca, 0xbfac, 0xb27c, 0x1d89, 0x43be, 0x1f77, 0xbf00, 0x43ea, 0x4326, 0xba22, 0x0315, 0xbf02, 0x42a2, 0x405a, 0xba05, 0x4152, 0xbfb0, 0xba4c, 0x42c6, 0x4334, 0x18b9, 0x4250, 0x40c8, 0xbf77, 0x33a6, 0xa4d7, 0xba55, 0x4361, 0x274f, 0xba03, 0x1ae7, 0x4038, 0xbf8d, 0x40fe, 0x1b4b, 0x4063, 0x40b7, 0xb2c8, 0x40ce, 0x38c1, 0xba40, 0x410f, 0x4445, 0x33b7, 0xba40, 0x4378, 0x3c3e, 0x4286, 0x41b1, 0xb219, 0xb23e, 0x437b, 0x2d6d, 0xbf9f, 0x1a09, 0xb00d, 0x436b, 0x41a5, 0x2188, 0xb29e, 0xb02f, 0x4255, 0x40ff, 0x4095, 0x4226, 0x1baf, 0x46ad, 0x262a, 0xa6a5, 0x1bf9, 0x41f0, 0x42fb, 0x43b9, 0xbf4a, 0x1d63, 0x1a48, 0x3668, 0x2ad8, 0xa836, 0xb0ad, 0xb205, 0xbf96, 0x1e1d, 0x27ba, 0x4677, 0xbac0, 0xa376, 0x40be, 0xbf05, 0xb2e9, 0x4164, 0x3e9d, 0x43b9, 0x4330, 0x1136, 0xba46, 0x41ae, 0x41c7, 0xb20f, 0xbafd, 0x42a2, 0x4007, 0xa269, 0x434e, 0xac40, 0x42da, 0x4553, 0xb2f3, 0xbfce, 0x433f, 0xa7f6, 0x4294, 0xb2e6, 0x41f3, 0x4355, 0x10e0, 0xb226, 0xb239, 0x1a8c, 0xb014, 0x431c, 0x1391, 0xba2d, 0x41ba, 0x402f, 0xb025, 0xb2bb, 0x35c5, 0xa0c6, 0x4042, 0xb27b, 0x4120, 0x250f, 0x4272, 0xbf32, 0x1a7c, 0x1e48, 0xbaf6, 0x1f12, 0x432a, 0x4608, 0x40f1, 0x1b8e, 0x1e05, 0x4021, 0x4053, 0xbf48, 0x41aa, 0xb2e4, 0xb230, 0x43ea, 0x1f4c, 0xa125, 0x1ef8, 0x4139, 0x4376, 0xbf6d, 0x42db, 0x32da, 0x4222, 0x2930, 0x2189, 0x4116, 0xb077, 0x429a, 0x40db, 0x45ac, 0x1a86, 0x1546, 0xb21d, 0x463a, 0x4062, 0xbf3e, 0x1a52, 0x407c, 0xba38, 0x454e, 0xa28b, 0x42a2, 0x3760, 0x1e45, 0x19ab, 0x292e, 0x0f80, 0x1d7e, 0x4572, 0x19be, 0x4318, 0xb0e2, 0x2ead, 0xbf15, 0x43d3, 0xb297, 0x4156, 0x4274, 0x3215, 0x43d5, 0x4101, 0x4009, 0x14bb, 0x4217, 0xb228, 0xba72, 0x1a16, 0x41af, 0x40c8, 0x4314, 0xb22a, 0x43a4, 0xb212, 0x4139, 0xb23d, 0x1b80, 0x1b4f, 0xb064, 0xbfb1, 0xb0ea, 0x419e, 0xa853, 0x406b, 0x41ba, 0xbfbd, 0x4353, 0x4018, 0x45e1, 0xba2b, 0xb264, 0x42e9, 0xb2e9, 0x40c2, 0x395e, 0x437f, 0x43f4, 0x406e, 0x0807, 0xba3e, 0xbf88, 0x430a, 0x43af, 0x4417, 0x426d, 0x410c, 0xbff0, 0x4683, 0xb25f, 0xbf00, 0xbf5c, 0xba47, 0x4033, 0x1942, 0x43e0, 0x12e6, 0x3c46, 0x436c, 0xba3c, 0x0145, 0x43cc, 0xb2d6, 0x4477, 0xb2d5, 0xb0d1, 0x4189, 0x43eb, 0x1ac6, 0xb258, 0xb0b6, 0xbf57, 0xbf60, 0x4285, 0x4364, 0x416f, 0x4111, 0x0d56, 0xb286, 0x4066, 0xb2dd, 0x4156, 0x4217, 0xa9c0, 0x43c6, 0xaf85, 0xb258, 0x41cb, 0xbfc4, 0x4220, 0x43bc, 0x4770, 0xe7fe + ], + StartRegs = [0x5163634f, 0x69953bc6, 0xc471194b, 0xd797bd76, 0xca82e30c, 0xd0e3d0b1, 0x315d5946, 0x74209518, 0xbfc706cf, 0x907cff0b, 0x9e3f1e57, 0x892343bb, 0x37dc0fed, 0xbc49e0f0, 0x00000000, 0xa00001f0 + ], + FinalRegs = [0x00000025, 0x9eb0014e, 0xfffec9da, 0xfc97ffff, 0x00000e10, 0x00000025, 0xffffffda, 0x9eb00062, 0xbfc706cf, 0x000000ad, 0x00000000, 0xfffee373, 0x37dc0fed, 0x9eaffe4e, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0xbacf, 0xbfa6, 0xb202, 0x40b6, 0x4165, 0x42b2, 0xb299, 0x40d5, 0x4183, 0xb09b, 0x4018, 0xb2a2, 0x4123, 0x0034, 0x45b6, 0x05e6, 0xaadf, 0x400e, 0x44da, 0xb220, 0xbfc8, 0x4147, 0x089b, 0x40e1, 0xa64f, 0xac9d, 0xb2cc, 0x39d6, 0xbf46, 0x42c9, 0x4314, 0x2b9a, 0x42cc, 0x19d2, 0x187f, 0x3b09, 0xba5f, 0xb2ef, 0x4281, 0x4298, 0x4253, 0xb284, 0x40ef, 0x4148, 0xaa53, 0x2d5e, 0x4301, 0xbf49, 0x4365, 0x3271, 0xb278, 0x10ca, 0x3100, 0x4298, 0xbfaa, 0xb27e, 0x46b9, 0x1972, 0xb08a, 0x428c, 0x4398, 0x1610, 0x4160, 0x40e9, 0x403b, 0x0964, 0xbf0d, 0x40e6, 0x40b1, 0x4183, 0x43af, 0x4195, 0x3dda, 0xa5d0, 0x2ba7, 0xb0d0, 0x1486, 0x4312, 0x42c5, 0xa382, 0x016e, 0xbf5c, 0x428b, 0xb2f2, 0x4367, 0xbf27, 0xba7b, 0x4676, 0x4229, 0x41f9, 0xb0b1, 0x4371, 0x40e3, 0x41f3, 0x1d96, 0x4019, 0xbad5, 0x0714, 0xbaf8, 0x3df6, 0x1b08, 0xb2ad, 0x32ce, 0xb26b, 0x120d, 0x438c, 0x41a6, 0x1e12, 0x421c, 0x416b, 0xb2ca, 0x4298, 0x31dc, 0xbf0c, 0x27c0, 0x41ea, 0x18b6, 0x4097, 0x42ed, 0x059a, 0x42fd, 0x428a, 0x4216, 0x1846, 0x43ec, 0x4194, 0x247c, 0x4347, 0xbf8f, 0x45b4, 0xb2cd, 0x41e7, 0xb2b8, 0xaf7f, 0xbf6c, 0xbae3, 0x4117, 0x43ae, 0x41b9, 0xbfe0, 0x144c, 0xbf13, 0x4292, 0x0fcd, 0x4329, 0x43f7, 0x1aba, 0x2109, 0x41e3, 0x4426, 0x401c, 0x40ea, 0xae86, 0x42c2, 0xbf02, 0x43c1, 0x2e2f, 0x42c3, 0x40a1, 0x4161, 0x43ff, 0x1a3e, 0x4334, 0xb234, 0xb256, 0x4037, 0xbaf8, 0x40e5, 0xba12, 0x2f78, 0x4019, 0x4144, 0x4305, 0x21a3, 0xbfcf, 0x0a76, 0x412b, 0xad51, 0x01b7, 0x4276, 0x1aa1, 0x42eb, 0x405b, 0xa6b4, 0x40d1, 0x410a, 0x41f4, 0x1a37, 0x1bd6, 0x38ea, 0xb27b, 0x4120, 0x4238, 0xb250, 0x4099, 0x437a, 0xbfce, 0xba3b, 0xbfb0, 0xb211, 0xa07d, 0x1deb, 0xbad9, 0x448d, 0x1528, 0xbf00, 0xb2d4, 0x44b3, 0x1efb, 0x408d, 0x41c8, 0x43f3, 0x4289, 0x43fa, 0x2672, 0xb2cc, 0x4253, 0x4234, 0xbadc, 0x4049, 0x430a, 0xb280, 0x42ef, 0xbfb7, 0xb276, 0xbac8, 0x416f, 0xb2aa, 0x1bc1, 0x0b1a, 0xb0ee, 0x4022, 0xb273, 0x2575, 0x1867, 0x1e00, 0xb245, 0x41d9, 0x446e, 0xba5f, 0xb07a, 0xb263, 0x2274, 0x135c, 0x4045, 0xb29a, 0x19c5, 0xbf56, 0x4361, 0x422a, 0x4193, 0x4138, 0x0c7c, 0x40b9, 0x2b3b, 0xb2e2, 0xb075, 0x40b4, 0x434e, 0x4363, 0x43d6, 0x10cf, 0x400d, 0x1fc8, 0xbf3d, 0x41ee, 0x4244, 0x2a6c, 0x1e41, 0x3e24, 0x4675, 0x43b5, 0x4032, 0xb080, 0xbf95, 0x431d, 0x4159, 0x43d6, 0xba46, 0xb025, 0xbfae, 0x4024, 0x14c7, 0x2339, 0x41f7, 0x445f, 0x43e8, 0x12db, 0xba11, 0x42bb, 0x42d0, 0x1b2e, 0x1d0b, 0xba72, 0x1c00, 0x1672, 0xbf5a, 0x40bc, 0x1094, 0xb068, 0xb053, 0xb027, 0xb22a, 0x213b, 0x4133, 0xb0e5, 0x1c94, 0xb244, 0x4228, 0x41ec, 0xb2a8, 0x440a, 0x3ea0, 0x3cd2, 0xb28b, 0x431a, 0x4372, 0x4084, 0xb2b5, 0x4135, 0xbf3b, 0x0936, 0x4385, 0x3455, 0x1f02, 0xb2b5, 0x00b2, 0x0a84, 0x43b7, 0x41a9, 0x42ca, 0x2e91, 0xbf18, 0xb242, 0xbfb0, 0x4220, 0xb2bf, 0x44ba, 0x41e7, 0x4181, 0x1eaa, 0x18c0, 0x1a7a, 0x4123, 0x3ffe, 0xa60e, 0x434f, 0x082b, 0x428f, 0xbf4b, 0x3482, 0x18c0, 0x4158, 0x4454, 0xbf5e, 0xbae3, 0x18cf, 0x4221, 0x42e8, 0x2748, 0xbfbd, 0x424f, 0x41f9, 0x41d8, 0x40e2, 0x285a, 0x426a, 0x43e0, 0x4170, 0x4387, 0xaf96, 0x3f64, 0x4066, 0xbf28, 0x4089, 0x2a20, 0x43c9, 0x43fd, 0x4096, 0x460b, 0xbf7b, 0xbadd, 0x1a8d, 0x1c50, 0x401c, 0x41ea, 0xa29b, 0xba76, 0xbae3, 0xb2f9, 0x4240, 0x4193, 0x0dd9, 0xbf9a, 0xba6e, 0x4362, 0x2f82, 0x41b2, 0x4111, 0x442b, 0xa3ab, 0x4069, 0xba77, 0x3e1a, 0xbfa0, 0xaac3, 0x1fa1, 0x4122, 0x4601, 0x43f2, 0x4031, 0x43b3, 0x1305, 0xb2ff, 0x1da3, 0x40a3, 0x4019, 0xbfba, 0x40a3, 0xba43, 0x41f9, 0xb2a0, 0xae39, 0x41d2, 0x0268, 0xb2b4, 0x4082, 0x4197, 0x1ed8, 0x4323, 0x43a4, 0xbaef, 0x082d, 0x4065, 0x4188, 0x42c9, 0xa7c3, 0xbf45, 0x4269, 0x401e, 0x45b1, 0x427b, 0x43cf, 0x4242, 0xba2b, 0xbf0f, 0x4392, 0xb09c, 0xb284, 0x4117, 0x17e3, 0x414a, 0xb0ac, 0xbfd7, 0xba34, 0xbf70, 0xb0ba, 0x4243, 0xb20e, 0x431e, 0x441b, 0x43e7, 0x4005, 0xacd8, 0xba47, 0xbf85, 0xa91c, 0x42c8, 0x0b69, 0xa1d4, 0x1f9d, 0x4100, 0x41c3, 0x40a5, 0xb2a1, 0x1f71, 0xb2d3, 0x4424, 0x4176, 0x439e, 0xb2e0, 0x42f8, 0x40d1, 0xb204, 0x4617, 0x462b, 0x40e6, 0x416f, 0x4197, 0xb2ea, 0x42cf, 0x0d0d, 0xbfa7, 0xb2b5, 0x13da, 0xbaec, 0x4351, 0x42af, 0xbaf1, 0xb2e7, 0x0ff2, 0x45d2, 0xbf9a, 0x414d, 0x1ddb, 0x4047, 0x4106, 0xa497, 0x40b7, 0x2043, 0xbfe1, 0x40e4, 0x41e4, 0xb207, 0xb255, 0x4134, 0x285e, 0xb24d, 0xb28c, 0x40ab, 0x4359, 0xbfc9, 0xb25f, 0x3c0a, 0x40d3, 0x1b61, 0x41fe, 0x4443, 0x45cc, 0x4242, 0xb275, 0xb24b, 0x228c, 0x42c1, 0x437a, 0x40d9, 0x27fc, 0x38fc, 0x43e4, 0x418f, 0xbf3c, 0xb043, 0x18c6, 0x4246, 0xbfab, 0xb248, 0x08df, 0xba5e, 0x419f, 0x41d2, 0x41c1, 0x4084, 0x42a7, 0x46e4, 0x40d0, 0x43e2, 0xaef6, 0x40f3, 0xb2f6, 0x422b, 0xa7b8, 0x4596, 0x405a, 0xb203, 0xad67, 0xb023, 0xbf0b, 0x3f5c, 0x46d9, 0x29a6, 0x42c9, 0x41c7, 0xbaf7, 0x1173, 0x41cf, 0x4388, 0xbf5b, 0x45c3, 0xba74, 0xbad9, 0xb279, 0x40ad, 0x4591, 0x4332, 0x40ae, 0x1963, 0x1ced, 0x0f02, 0xba62, 0x42b6, 0x4260, 0xbaed, 0x42e7, 0xb2f9, 0x312b, 0x43d8, 0x1dfa, 0x1440, 0xa31d, 0x44c2, 0xba08, 0xb01a, 0xbac7, 0xbf9d, 0x45dc, 0x43ca, 0xaad2, 0x0c3a, 0xaa18, 0x1024, 0x3f34, 0x46fb, 0xb0e3, 0xb2e8, 0x331a, 0xbf80, 0x2092, 0x4257, 0x4328, 0xb0e0, 0xb07d, 0x4268, 0xbf76, 0x0232, 0x42df, 0xb2a0, 0xb2ab, 0x4022, 0x402f, 0x42d3, 0x1ec6, 0xb2f6, 0x18a4, 0xbaed, 0x41a9, 0xbad1, 0x4175, 0xb06b, 0x405f, 0x4189, 0xaa10, 0x42c4, 0xba1a, 0xa362, 0x2a89, 0x4022, 0xb0df, 0x0583, 0xba04, 0xbf98, 0x46b4, 0x0d9a, 0xbaec, 0xba1c, 0x2507, 0x43be, 0x43d0, 0x407c, 0xbf80, 0x0db8, 0x4114, 0x4329, 0xbf4a, 0x442b, 0xb0d9, 0xb02a, 0x4063, 0x068e, 0x40a1, 0xbfcb, 0x4398, 0x1aab, 0x42ec, 0x41b6, 0xba5a, 0x411e, 0x456b, 0x42a1, 0xba39, 0x4183, 0x4222, 0xbfb1, 0x43ca, 0xb05a, 0x4474, 0x4546, 0x1140, 0x18cc, 0x43e2, 0xba0c, 0x2c60, 0x428a, 0x426c, 0x1909, 0x42b3, 0xb049, 0x425a, 0x4234, 0x406a, 0x02de, 0x0a53, 0x4038, 0x4079, 0xbfe0, 0x40d4, 0xba20, 0x4010, 0xbaeb, 0xb2b8, 0x3c73, 0x384d, 0xbf5f, 0xb22c, 0x3e1f, 0xb2f5, 0xa11e, 0x1d16, 0x1cd4, 0xbfaa, 0x0d49, 0x4112, 0x09c1, 0x4249, 0xb211, 0x4393, 0xb210, 0xb295, 0xbf43, 0x08a4, 0x40ad, 0x4635, 0xbf70, 0x462d, 0x07ae, 0x4357, 0xb07c, 0x433c, 0x1d49, 0x394d, 0x4340, 0x4310, 0x3c5b, 0xae19, 0xb044, 0xb0c1, 0x4675, 0x3437, 0xb225, 0x4013, 0xba48, 0x42e5, 0x382d, 0x42f8, 0x01ac, 0xbf28, 0x426a, 0x424b, 0x45ce, 0xb0f4, 0x40fc, 0xb28a, 0xb2aa, 0xb098, 0xb2ec, 0x4193, 0x1b94, 0x40c9, 0x4145, 0x22d4, 0x14ab, 0xbf32, 0x3629, 0x46b5, 0x454b, 0x1c0c, 0xbaf7, 0x1078, 0xb20f, 0x434d, 0xbaff, 0x4327, 0x4282, 0x4251, 0x3560, 0x419b, 0x4694, 0x1f84, 0x42e6, 0xa35c, 0x4194, 0xa25f, 0x2f49, 0xbace, 0x1cdf, 0xb062, 0x2c47, 0x41b0, 0xbf77, 0x429e, 0xb280, 0x42e6, 0x40e5, 0xb282, 0x4002, 0x08db, 0xba3f, 0x46fc, 0xb00b, 0xba3b, 0x41dd, 0xb286, 0x1677, 0x1eff, 0xb254, 0xb2c2, 0x0100, 0x1699, 0x1c80, 0x00fd, 0x0604, 0x3bfd, 0x15b4, 0xba0c, 0x25fc, 0x42db, 0x4354, 0xbf0b, 0x1c85, 0x40cc, 0xb2f8, 0xb01c, 0x43f9, 0xb2e3, 0x438f, 0x45cb, 0x1d66, 0x430c, 0x46c0, 0x42bc, 0x41d6, 0xbfaf, 0xba63, 0x078d, 0x42c2, 0x4266, 0x4591, 0x2b98, 0x4478, 0x1fa1, 0x3b41, 0xb0ea, 0xb032, 0x4033, 0xb093, 0x0e51, 0x4357, 0xba31, 0xba29, 0xaa85, 0x40e3, 0x1e97, 0x1f3a, 0x067b, 0x428d, 0x4266, 0x430c, 0xb2ee, 0xbfcb, 0xac4b, 0xba04, 0xb009, 0x4290, 0x12a4, 0x40a2, 0x1d68, 0x4140, 0x07d3, 0x1fcb, 0xb226, 0x03c1, 0x459d, 0x42a3, 0x40a1, 0x409f, 0x1a49, 0x4040, 0x39e8, 0x4214, 0x40c5, 0xb066, 0xbf4e, 0x43ec, 0x01da, 0x420f, 0x43d5, 0xba21, 0x0941, 0xba04, 0x401a, 0xba44, 0x421c, 0xbf98, 0xbac2, 0xa729, 0xbf80, 0x0966, 0x1970, 0x402f, 0x22fc, 0x432b, 0x4026, 0x434b, 0x43e7, 0xb06f, 0xbf08, 0x403d, 0x1454, 0x44e8, 0xbf4c, 0xbafd, 0x42cd, 0x104f, 0x4361, 0x4253, 0x34fe, 0x1d4d, 0xa421, 0x21da, 0x4488, 0xbafb, 0x418f, 0x41ec, 0xb203, 0x4190, 0x45d6, 0x3a4f, 0xbac0, 0xbf9c, 0x45a4, 0x43c1, 0xba5c, 0x0eaa, 0x4241, 0xb230, 0xb21a, 0xb070, 0x43f9, 0x40a0, 0x42ec, 0x423c, 0xba04, 0x41b0, 0xb25d, 0xb09e, 0x462e, 0x41ae, 0x40f5, 0x4338, 0x28dc, 0xb004, 0xaf65, 0xb29b, 0x40d0, 0x2689, 0x4302, 0xbf37, 0x1467, 0x40ff, 0xab16, 0x40cf, 0x45a8, 0x403c, 0x4340, 0x05f5, 0x2cca, 0x42d3, 0x1583, 0x1a0e, 0x40ae, 0x3d53, 0x412e, 0x4354, 0x4328, 0x461a, 0x4208, 0x413c, 0x366a, 0xbad5, 0x41be, 0x1b57, 0xbf3f, 0x43d2, 0x425f, 0x324a, 0xb0b4, 0x3dbb, 0x4395, 0x4168, 0x4381, 0xb0af, 0x1b4b, 0x43b9, 0xb272, 0xb290, 0x3ca5, 0xba31, 0xba02, 0x43a2, 0xba37, 0xbf00, 0x1d08, 0x4442, 0x4261, 0x3c8b, 0x09bd, 0x4051, 0x294a, 0x435e, 0xbf9a, 0x426b, 0xb0de, 0xba13, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xb365a6c0, 0x01723518, 0x0009419f, 0x745fc87d, 0x5ed42207, 0x1f49801a, 0x138d5de7, 0xd2498a44, 0x0115d59c, 0x1cc12bbe, 0x5e000be4, 0xe36b4a94, 0x3974216e, 0x5afb38c7, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0x69000004, 0x5c11201c, 0x5c1120b9, 0xb920115c, 0xfffffed0, 0x01a40000, 0x00004ffb, 0x69000000, 0x5c1120b9, 0xf9076780, 0x42812c14, 0x000014ca, 0x00001650, 0x5afb4adf, 0x00000000, 0x200001d0 }, + Instructions = [0xbacf, 0xbfa6, 0xb202, 0x40b6, 0x4165, 0x42b2, 0xb299, 0x40d5, 0x4183, 0xb09b, 0x4018, 0xb2a2, 0x4123, 0x0034, 0x45b6, 0x05e6, 0xaadf, 0x400e, 0x44da, 0xb220, 0xbfc8, 0x4147, 0x089b, 0x40e1, 0xa64f, 0xac9d, 0xb2cc, 0x39d6, 0xbf46, 0x42c9, 0x4314, 0x2b9a, 0x42cc, 0x19d2, 0x187f, 0x3b09, 0xba5f, 0xb2ef, 0x4281, 0x4298, 0x4253, 0xb284, 0x40ef, 0x4148, 0xaa53, 0x2d5e, 0x4301, 0xbf49, 0x4365, 0x3271, 0xb278, 0x10ca, 0x3100, 0x4298, 0xbfaa, 0xb27e, 0x46b9, 0x1972, 0xb08a, 0x428c, 0x4398, 0x1610, 0x4160, 0x40e9, 0x403b, 0x0964, 0xbf0d, 0x40e6, 0x40b1, 0x4183, 0x43af, 0x4195, 0x3dda, 0xa5d0, 0x2ba7, 0xb0d0, 0x1486, 0x4312, 0x42c5, 0xa382, 0x016e, 0xbf5c, 0x428b, 0xb2f2, 0x4367, 0xbf27, 0xba7b, 0x4676, 0x4229, 0x41f9, 0xb0b1, 0x4371, 0x40e3, 0x41f3, 0x1d96, 0x4019, 0xbad5, 0x0714, 0xbaf8, 0x3df6, 0x1b08, 0xb2ad, 0x32ce, 0xb26b, 0x120d, 0x438c, 0x41a6, 0x1e12, 0x421c, 0x416b, 0xb2ca, 0x4298, 0x31dc, 0xbf0c, 0x27c0, 0x41ea, 0x18b6, 0x4097, 0x42ed, 0x059a, 0x42fd, 0x428a, 0x4216, 0x1846, 0x43ec, 0x4194, 0x247c, 0x4347, 0xbf8f, 0x45b4, 0xb2cd, 0x41e7, 0xb2b8, 0xaf7f, 0xbf6c, 0xbae3, 0x4117, 0x43ae, 0x41b9, 0xbfe0, 0x144c, 0xbf13, 0x4292, 0x0fcd, 0x4329, 0x43f7, 0x1aba, 0x2109, 0x41e3, 0x4426, 0x401c, 0x40ea, 0xae86, 0x42c2, 0xbf02, 0x43c1, 0x2e2f, 0x42c3, 0x40a1, 0x4161, 0x43ff, 0x1a3e, 0x4334, 0xb234, 0xb256, 0x4037, 0xbaf8, 0x40e5, 0xba12, 0x2f78, 0x4019, 0x4144, 0x4305, 0x21a3, 0xbfcf, 0x0a76, 0x412b, 0xad51, 0x01b7, 0x4276, 0x1aa1, 0x42eb, 0x405b, 0xa6b4, 0x40d1, 0x410a, 0x41f4, 0x1a37, 0x1bd6, 0x38ea, 0xb27b, 0x4120, 0x4238, 0xb250, 0x4099, 0x437a, 0xbfce, 0xba3b, 0xbfb0, 0xb211, 0xa07d, 0x1deb, 0xbad9, 0x448d, 0x1528, 0xbf00, 0xb2d4, 0x44b3, 0x1efb, 0x408d, 0x41c8, 0x43f3, 0x4289, 0x43fa, 0x2672, 0xb2cc, 0x4253, 0x4234, 0xbadc, 0x4049, 0x430a, 0xb280, 0x42ef, 0xbfb7, 0xb276, 0xbac8, 0x416f, 0xb2aa, 0x1bc1, 0x0b1a, 0xb0ee, 0x4022, 0xb273, 0x2575, 0x1867, 0x1e00, 0xb245, 0x41d9, 0x446e, 0xba5f, 0xb07a, 0xb263, 0x2274, 0x135c, 0x4045, 0xb29a, 0x19c5, 0xbf56, 0x4361, 0x422a, 0x4193, 0x4138, 0x0c7c, 0x40b9, 0x2b3b, 0xb2e2, 0xb075, 0x40b4, 0x434e, 0x4363, 0x43d6, 0x10cf, 0x400d, 0x1fc8, 0xbf3d, 0x41ee, 0x4244, 0x2a6c, 0x1e41, 0x3e24, 0x4675, 0x43b5, 0x4032, 0xb080, 0xbf95, 0x431d, 0x4159, 0x43d6, 0xba46, 0xb025, 0xbfae, 0x4024, 0x14c7, 0x2339, 0x41f7, 0x445f, 0x43e8, 0x12db, 0xba11, 0x42bb, 0x42d0, 0x1b2e, 0x1d0b, 0xba72, 0x1c00, 0x1672, 0xbf5a, 0x40bc, 0x1094, 0xb068, 0xb053, 0xb027, 0xb22a, 0x213b, 0x4133, 0xb0e5, 0x1c94, 0xb244, 0x4228, 0x41ec, 0xb2a8, 0x440a, 0x3ea0, 0x3cd2, 0xb28b, 0x431a, 0x4372, 0x4084, 0xb2b5, 0x4135, 0xbf3b, 0x0936, 0x4385, 0x3455, 0x1f02, 0xb2b5, 0x00b2, 0x0a84, 0x43b7, 0x41a9, 0x42ca, 0x2e91, 0xbf18, 0xb242, 0xbfb0, 0x4220, 0xb2bf, 0x44ba, 0x41e7, 0x4181, 0x1eaa, 0x18c0, 0x1a7a, 0x4123, 0x3ffe, 0xa60e, 0x434f, 0x082b, 0x428f, 0xbf4b, 0x3482, 0x18c0, 0x4158, 0x4454, 0xbf5e, 0xbae3, 0x18cf, 0x4221, 0x42e8, 0x2748, 0xbfbd, 0x424f, 0x41f9, 0x41d8, 0x40e2, 0x285a, 0x426a, 0x43e0, 0x4170, 0x4387, 0xaf96, 0x3f64, 0x4066, 0xbf28, 0x4089, 0x2a20, 0x43c9, 0x43fd, 0x4096, 0x460b, 0xbf7b, 0xbadd, 0x1a8d, 0x1c50, 0x401c, 0x41ea, 0xa29b, 0xba76, 0xbae3, 0xb2f9, 0x4240, 0x4193, 0x0dd9, 0xbf9a, 0xba6e, 0x4362, 0x2f82, 0x41b2, 0x4111, 0x442b, 0xa3ab, 0x4069, 0xba77, 0x3e1a, 0xbfa0, 0xaac3, 0x1fa1, 0x4122, 0x4601, 0x43f2, 0x4031, 0x43b3, 0x1305, 0xb2ff, 0x1da3, 0x40a3, 0x4019, 0xbfba, 0x40a3, 0xba43, 0x41f9, 0xb2a0, 0xae39, 0x41d2, 0x0268, 0xb2b4, 0x4082, 0x4197, 0x1ed8, 0x4323, 0x43a4, 0xbaef, 0x082d, 0x4065, 0x4188, 0x42c9, 0xa7c3, 0xbf45, 0x4269, 0x401e, 0x45b1, 0x427b, 0x43cf, 0x4242, 0xba2b, 0xbf0f, 0x4392, 0xb09c, 0xb284, 0x4117, 0x17e3, 0x414a, 0xb0ac, 0xbfd7, 0xba34, 0xbf70, 0xb0ba, 0x4243, 0xb20e, 0x431e, 0x441b, 0x43e7, 0x4005, 0xacd8, 0xba47, 0xbf85, 0xa91c, 0x42c8, 0x0b69, 0xa1d4, 0x1f9d, 0x4100, 0x41c3, 0x40a5, 0xb2a1, 0x1f71, 0xb2d3, 0x4424, 0x4176, 0x439e, 0xb2e0, 0x42f8, 0x40d1, 0xb204, 0x4617, 0x462b, 0x40e6, 0x416f, 0x4197, 0xb2ea, 0x42cf, 0x0d0d, 0xbfa7, 0xb2b5, 0x13da, 0xbaec, 0x4351, 0x42af, 0xbaf1, 0xb2e7, 0x0ff2, 0x45d2, 0xbf9a, 0x414d, 0x1ddb, 0x4047, 0x4106, 0xa497, 0x40b7, 0x2043, 0xbfe1, 0x40e4, 0x41e4, 0xb207, 0xb255, 0x4134, 0x285e, 0xb24d, 0xb28c, 0x40ab, 0x4359, 0xbfc9, 0xb25f, 0x3c0a, 0x40d3, 0x1b61, 0x41fe, 0x4443, 0x45cc, 0x4242, 0xb275, 0xb24b, 0x228c, 0x42c1, 0x437a, 0x40d9, 0x27fc, 0x38fc, 0x43e4, 0x418f, 0xbf3c, 0xb043, 0x18c6, 0x4246, 0xbfab, 0xb248, 0x08df, 0xba5e, 0x419f, 0x41d2, 0x41c1, 0x4084, 0x42a7, 0x46e4, 0x40d0, 0x43e2, 0xaef6, 0x40f3, 0xb2f6, 0x422b, 0xa7b8, 0x4596, 0x405a, 0xb203, 0xad67, 0xb023, 0xbf0b, 0x3f5c, 0x46d9, 0x29a6, 0x42c9, 0x41c7, 0xbaf7, 0x1173, 0x41cf, 0x4388, 0xbf5b, 0x45c3, 0xba74, 0xbad9, 0xb279, 0x40ad, 0x4591, 0x4332, 0x40ae, 0x1963, 0x1ced, 0x0f02, 0xba62, 0x42b6, 0x4260, 0xbaed, 0x42e7, 0xb2f9, 0x312b, 0x43d8, 0x1dfa, 0x1440, 0xa31d, 0x44c2, 0xba08, 0xb01a, 0xbac7, 0xbf9d, 0x45dc, 0x43ca, 0xaad2, 0x0c3a, 0xaa18, 0x1024, 0x3f34, 0x46fb, 0xb0e3, 0xb2e8, 0x331a, 0xbf80, 0x2092, 0x4257, 0x4328, 0xb0e0, 0xb07d, 0x4268, 0xbf76, 0x0232, 0x42df, 0xb2a0, 0xb2ab, 0x4022, 0x402f, 0x42d3, 0x1ec6, 0xb2f6, 0x18a4, 0xbaed, 0x41a9, 0xbad1, 0x4175, 0xb06b, 0x405f, 0x4189, 0xaa10, 0x42c4, 0xba1a, 0xa362, 0x2a89, 0x4022, 0xb0df, 0x0583, 0xba04, 0xbf98, 0x46b4, 0x0d9a, 0xbaec, 0xba1c, 0x2507, 0x43be, 0x43d0, 0x407c, 0xbf80, 0x0db8, 0x4114, 0x4329, 0xbf4a, 0x442b, 0xb0d9, 0xb02a, 0x4063, 0x068e, 0x40a1, 0xbfcb, 0x4398, 0x1aab, 0x42ec, 0x41b6, 0xba5a, 0x411e, 0x456b, 0x42a1, 0xba39, 0x4183, 0x4222, 0xbfb1, 0x43ca, 0xb05a, 0x4474, 0x4546, 0x1140, 0x18cc, 0x43e2, 0xba0c, 0x2c60, 0x428a, 0x426c, 0x1909, 0x42b3, 0xb049, 0x425a, 0x4234, 0x406a, 0x02de, 0x0a53, 0x4038, 0x4079, 0xbfe0, 0x40d4, 0xba20, 0x4010, 0xbaeb, 0xb2b8, 0x3c73, 0x384d, 0xbf5f, 0xb22c, 0x3e1f, 0xb2f5, 0xa11e, 0x1d16, 0x1cd4, 0xbfaa, 0x0d49, 0x4112, 0x09c1, 0x4249, 0xb211, 0x4393, 0xb210, 0xb295, 0xbf43, 0x08a4, 0x40ad, 0x4635, 0xbf70, 0x462d, 0x07ae, 0x4357, 0xb07c, 0x433c, 0x1d49, 0x394d, 0x4340, 0x4310, 0x3c5b, 0xae19, 0xb044, 0xb0c1, 0x4675, 0x3437, 0xb225, 0x4013, 0xba48, 0x42e5, 0x382d, 0x42f8, 0x01ac, 0xbf28, 0x426a, 0x424b, 0x45ce, 0xb0f4, 0x40fc, 0xb28a, 0xb2aa, 0xb098, 0xb2ec, 0x4193, 0x1b94, 0x40c9, 0x4145, 0x22d4, 0x14ab, 0xbf32, 0x3629, 0x46b5, 0x454b, 0x1c0c, 0xbaf7, 0x1078, 0xb20f, 0x434d, 0xbaff, 0x4327, 0x4282, 0x4251, 0x3560, 0x419b, 0x4694, 0x1f84, 0x42e6, 0xa35c, 0x4194, 0xa25f, 0x2f49, 0xbace, 0x1cdf, 0xb062, 0x2c47, 0x41b0, 0xbf77, 0x429e, 0xb280, 0x42e6, 0x40e5, 0xb282, 0x4002, 0x08db, 0xba3f, 0x46fc, 0xb00b, 0xba3b, 0x41dd, 0xb286, 0x1677, 0x1eff, 0xb254, 0xb2c2, 0x0100, 0x1699, 0x1c80, 0x00fd, 0x0604, 0x3bfd, 0x15b4, 0xba0c, 0x25fc, 0x42db, 0x4354, 0xbf0b, 0x1c85, 0x40cc, 0xb2f8, 0xb01c, 0x43f9, 0xb2e3, 0x438f, 0x45cb, 0x1d66, 0x430c, 0x46c0, 0x42bc, 0x41d6, 0xbfaf, 0xba63, 0x078d, 0x42c2, 0x4266, 0x4591, 0x2b98, 0x4478, 0x1fa1, 0x3b41, 0xb0ea, 0xb032, 0x4033, 0xb093, 0x0e51, 0x4357, 0xba31, 0xba29, 0xaa85, 0x40e3, 0x1e97, 0x1f3a, 0x067b, 0x428d, 0x4266, 0x430c, 0xb2ee, 0xbfcb, 0xac4b, 0xba04, 0xb009, 0x4290, 0x12a4, 0x40a2, 0x1d68, 0x4140, 0x07d3, 0x1fcb, 0xb226, 0x03c1, 0x459d, 0x42a3, 0x40a1, 0x409f, 0x1a49, 0x4040, 0x39e8, 0x4214, 0x40c5, 0xb066, 0xbf4e, 0x43ec, 0x01da, 0x420f, 0x43d5, 0xba21, 0x0941, 0xba04, 0x401a, 0xba44, 0x421c, 0xbf98, 0xbac2, 0xa729, 0xbf80, 0x0966, 0x1970, 0x402f, 0x22fc, 0x432b, 0x4026, 0x434b, 0x43e7, 0xb06f, 0xbf08, 0x403d, 0x1454, 0x44e8, 0xbf4c, 0xbafd, 0x42cd, 0x104f, 0x4361, 0x4253, 0x34fe, 0x1d4d, 0xa421, 0x21da, 0x4488, 0xbafb, 0x418f, 0x41ec, 0xb203, 0x4190, 0x45d6, 0x3a4f, 0xbac0, 0xbf9c, 0x45a4, 0x43c1, 0xba5c, 0x0eaa, 0x4241, 0xb230, 0xb21a, 0xb070, 0x43f9, 0x40a0, 0x42ec, 0x423c, 0xba04, 0x41b0, 0xb25d, 0xb09e, 0x462e, 0x41ae, 0x40f5, 0x4338, 0x28dc, 0xb004, 0xaf65, 0xb29b, 0x40d0, 0x2689, 0x4302, 0xbf37, 0x1467, 0x40ff, 0xab16, 0x40cf, 0x45a8, 0x403c, 0x4340, 0x05f5, 0x2cca, 0x42d3, 0x1583, 0x1a0e, 0x40ae, 0x3d53, 0x412e, 0x4354, 0x4328, 0x461a, 0x4208, 0x413c, 0x366a, 0xbad5, 0x41be, 0x1b57, 0xbf3f, 0x43d2, 0x425f, 0x324a, 0xb0b4, 0x3dbb, 0x4395, 0x4168, 0x4381, 0xb0af, 0x1b4b, 0x43b9, 0xb272, 0xb290, 0x3ca5, 0xba31, 0xba02, 0x43a2, 0xba37, 0xbf00, 0x1d08, 0x4442, 0x4261, 0x3c8b, 0x09bd, 0x4051, 0x294a, 0x435e, 0xbf9a, 0x426b, 0xb0de, 0xba13, 0x4770, 0xe7fe + ], + StartRegs = [0xb365a6c0, 0x01723518, 0x0009419f, 0x745fc87d, 0x5ed42207, 0x1f49801a, 0x138d5de7, 0xd2498a44, 0x0115d59c, 0x1cc12bbe, 0x5e000be4, 0xe36b4a94, 0x3974216e, 0x5afb38c7, 0x00000000, 0x900001f0 + ], + FinalRegs = [0x69000004, 0x5c11201c, 0x5c1120b9, 0xb920115c, 0xfffffed0, 0x01a40000, 0x00004ffb, 0x69000000, 0x5c1120b9, 0xf9076780, 0x42812c14, 0x000014ca, 0x00001650, 0x5afb4adf, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x3e9f, 0x423a, 0xb038, 0x1a66, 0x2ab4, 0xbf88, 0x41f2, 0x43ed, 0x46e2, 0xbafa, 0xb277, 0xacc3, 0x3d1f, 0xb2f5, 0x008e, 0x4288, 0x298f, 0x4058, 0x1fc4, 0x4234, 0x4372, 0x422f, 0xb260, 0x41ca, 0x4030, 0x4004, 0x40a9, 0x40c8, 0xb2e9, 0xb24e, 0x1d5a, 0xbf9b, 0xb062, 0x4160, 0x3cb1, 0xba5f, 0x43a1, 0x4362, 0x4553, 0x4260, 0x4329, 0x1061, 0xba58, 0xb2f4, 0x40ad, 0x41be, 0x436a, 0x43a3, 0xbfc0, 0xb0f6, 0x401a, 0x0c62, 0x1513, 0xb205, 0xb215, 0x090b, 0x1c21, 0x28af, 0x4092, 0xb294, 0xbfbd, 0x2cb1, 0x1b1e, 0x0984, 0x4175, 0xa7e8, 0xb273, 0x2636, 0x410b, 0x45c0, 0x41ec, 0xb2eb, 0xb0d0, 0x42ca, 0xba52, 0x4185, 0x1455, 0x4600, 0xb215, 0x1947, 0x24af, 0xba32, 0xbfab, 0x40ac, 0xba0b, 0xba5b, 0x07fa, 0x0723, 0xb2c4, 0x2163, 0x42d5, 0x4004, 0x40a7, 0x45d8, 0x43af, 0x42b4, 0x465d, 0xba27, 0x4395, 0x2d9c, 0x192f, 0x1a6a, 0xb28d, 0xbfc7, 0x458b, 0x4281, 0xadc4, 0x4092, 0x125e, 0xbfac, 0x43c8, 0xadde, 0x2713, 0xb265, 0xbf62, 0x3095, 0xbff0, 0x1bd1, 0x40a8, 0x43e3, 0x18c1, 0x41b0, 0x3fb9, 0x18ae, 0x4314, 0x347e, 0x4258, 0x45b5, 0x4660, 0x401d, 0x1dcc, 0x4667, 0x420b, 0x4172, 0xac70, 0x39f3, 0x4097, 0x19b6, 0x41fe, 0xb0c1, 0x4623, 0x1394, 0xbf25, 0xba65, 0x4101, 0x439d, 0x42e1, 0x4333, 0xb0e5, 0x41dd, 0xb268, 0x22c7, 0x2674, 0xba71, 0x421f, 0x4450, 0x0cd7, 0x40e4, 0x1b43, 0x3ea7, 0x1311, 0xbf4e, 0x411b, 0x4112, 0xa8fa, 0xbf19, 0x4015, 0x3844, 0x40d4, 0x4087, 0xbfa7, 0x1f9b, 0x0c01, 0x213b, 0x3a56, 0x4242, 0x40bf, 0x4233, 0xb046, 0x42b5, 0x4556, 0x3058, 0x42b8, 0x36be, 0x437b, 0x1eb6, 0xbacd, 0x4173, 0x433f, 0x42a2, 0x41f3, 0xba23, 0x412f, 0xacfb, 0x4221, 0xbf25, 0x40b0, 0x40b4, 0xba72, 0xb0f2, 0x461f, 0x3123, 0x037e, 0x4580, 0xa9da, 0x2938, 0x42a6, 0x3aaa, 0x4125, 0x2721, 0xbfa4, 0x2a82, 0xb215, 0x41c0, 0xa1c3, 0xb27f, 0x4223, 0xba05, 0x1e73, 0x4054, 0x4629, 0x4415, 0x1cae, 0xb222, 0x1ac2, 0x424f, 0x206a, 0x4080, 0xb2c3, 0x412a, 0xa37e, 0x4037, 0xb26d, 0xb09a, 0xb211, 0x442d, 0xaca9, 0xbf0d, 0x34d4, 0xbfa0, 0x196a, 0x408f, 0x4313, 0x41ea, 0x1560, 0x46ea, 0x449c, 0x3a47, 0x40a6, 0x440a, 0xb267, 0x33b8, 0xb22c, 0x46eb, 0x1824, 0x3843, 0xbfca, 0xbfd0, 0x0716, 0x1031, 0xba00, 0x0daf, 0xba7e, 0xba72, 0xba11, 0x4375, 0xad64, 0xa1db, 0xb263, 0x42e7, 0x46f3, 0xa375, 0x4097, 0xa116, 0x4302, 0x19f5, 0x40ce, 0xbaf9, 0x269e, 0xbf0b, 0x407e, 0xb0f0, 0x45f4, 0x40fc, 0x1e2e, 0xba56, 0x4136, 0xba41, 0x4222, 0xbf1c, 0xb00c, 0x433f, 0xba7a, 0x41a5, 0xbfd0, 0x4260, 0xaf36, 0x42f3, 0x4376, 0xb0e8, 0x42e7, 0x0b6f, 0x4315, 0x1e04, 0xa4ef, 0x135b, 0xa6cd, 0x29d1, 0x40b6, 0x42d0, 0x4596, 0x4383, 0x466d, 0xbf7d, 0x46e4, 0x3014, 0xba02, 0x2ad7, 0xb2fe, 0x3de9, 0x1aa7, 0x2d8c, 0x150c, 0x4233, 0x40a0, 0xba40, 0x3a7a, 0x4361, 0x4447, 0xae8e, 0x4268, 0x4391, 0x41c8, 0x29dc, 0x4174, 0xb23c, 0x1bfc, 0x2c34, 0xbfc0, 0x194b, 0xbf9c, 0x43a6, 0xba78, 0x1b4b, 0x43ce, 0xbad7, 0xbfad, 0x067f, 0x4117, 0x4298, 0x4380, 0xb206, 0xba22, 0x4553, 0x3d55, 0x42f4, 0x1c7d, 0x419e, 0x206f, 0x1af1, 0xbff0, 0x3531, 0x1d92, 0x4150, 0x3fb8, 0x1e5f, 0x4250, 0x1fa1, 0x4202, 0xb0a1, 0xbf11, 0x45d9, 0x4676, 0x40fa, 0x421e, 0x1f6a, 0x0bf8, 0x29cc, 0xbf9d, 0x412e, 0xbf60, 0x3489, 0x4007, 0xba3b, 0x1836, 0x297c, 0x4284, 0x42e1, 0x4409, 0x429f, 0xba1a, 0xbac9, 0xb2b9, 0x3794, 0xa128, 0xa5c4, 0x42fb, 0x4593, 0x4184, 0xb0de, 0x0384, 0xbf3a, 0x3416, 0x3ea6, 0x411c, 0x42cd, 0xbfc0, 0xbaf3, 0xaa2e, 0x4317, 0xb2b2, 0x42d2, 0xb025, 0xb2d1, 0x091b, 0x423a, 0xb094, 0x468d, 0x4426, 0x31f9, 0xbf2e, 0x1e6b, 0x4388, 0x1c68, 0xba48, 0x3089, 0x4607, 0xba01, 0x416d, 0x1d85, 0x4424, 0x40d4, 0x41fa, 0xb28e, 0x1d5f, 0x4177, 0xb0d1, 0x1c5e, 0x4203, 0x0cf5, 0xb24b, 0x1cde, 0x1d65, 0x4281, 0xbfa6, 0xba36, 0x42a4, 0x4243, 0x44fa, 0x43b6, 0xa162, 0x41be, 0xb05d, 0x001b, 0x4283, 0xb2fd, 0x0395, 0xb28d, 0x40fb, 0xba1f, 0x43b1, 0x41af, 0x4157, 0xb245, 0x42f4, 0xb06b, 0xb27c, 0x1d2f, 0x45ee, 0x4435, 0xbfe2, 0x190a, 0x43a7, 0x4565, 0x41c3, 0xba46, 0x42d3, 0xb014, 0x23e7, 0x43a1, 0x436d, 0x4386, 0x1b31, 0x44e9, 0x427e, 0x1b44, 0xba66, 0xb02b, 0x404f, 0x42df, 0x438c, 0xba6f, 0x4083, 0xb02c, 0xba59, 0xaf47, 0x456d, 0xbfbd, 0xb2bd, 0x1e66, 0xbaee, 0x41af, 0xb05e, 0xbf70, 0x41eb, 0x4099, 0x42f1, 0x41d3, 0x40ed, 0xaefe, 0x4223, 0xa7ab, 0x02cb, 0x4393, 0xb258, 0xbfa3, 0x4311, 0x43f3, 0xb2f5, 0x43f4, 0xbf5e, 0x1854, 0x2a65, 0x1c8d, 0x4363, 0x4087, 0x40b2, 0x410a, 0xa11a, 0xb2ca, 0x1efa, 0x20d8, 0x419c, 0x41fd, 0x4283, 0x43f4, 0x4264, 0x420a, 0x469c, 0x1961, 0xb2fc, 0x429a, 0xb2b7, 0x4293, 0xa373, 0xbf98, 0xab6d, 0xb266, 0x01e3, 0x4176, 0xa2e0, 0x0265, 0x42ba, 0x40ce, 0x0695, 0x42a8, 0x3b85, 0x1ea1, 0x428b, 0x442a, 0x4452, 0xbf3c, 0x1bcb, 0xba76, 0x466b, 0x41bb, 0x44b8, 0x401d, 0xba78, 0x4020, 0x46a2, 0xb2ce, 0xb24f, 0x4202, 0xba02, 0x46d1, 0xbf3b, 0x4329, 0x0e1d, 0x40f7, 0x0daa, 0x40b6, 0xb2f0, 0xb208, 0x45a8, 0xbf0a, 0x43d7, 0xb238, 0x43e5, 0x43f3, 0x1dee, 0x3982, 0xbaf5, 0xbf70, 0x022f, 0x42d8, 0x4270, 0xae68, 0x1b50, 0xb2fa, 0x43ce, 0xa22b, 0x4103, 0xb0fe, 0xbf0a, 0xba03, 0xba58, 0xb21c, 0x4242, 0x428b, 0xb21b, 0x46fc, 0xbad7, 0x44f9, 0x409d, 0x1fa0, 0x422f, 0x4045, 0x0cb9, 0xbf37, 0x4168, 0x42e2, 0x1d17, 0x4146, 0x404b, 0x4397, 0x4023, 0x4218, 0x1be7, 0xb20c, 0xbfd0, 0x4166, 0x4677, 0x442e, 0x0bc1, 0x462e, 0x4103, 0x1b0b, 0xb0b5, 0xbf39, 0x3c04, 0xb2a6, 0x4132, 0x031d, 0xbac8, 0xb0d9, 0x436b, 0xb208, 0x4127, 0xbad3, 0x0705, 0x116f, 0xb23b, 0xba75, 0xaccc, 0xba6c, 0x19b5, 0x42c1, 0xb296, 0xbf98, 0x28ab, 0x1165, 0x4195, 0xb06b, 0x4356, 0xbf21, 0x2e2c, 0xba6e, 0xbf70, 0x1b50, 0x1d56, 0x4299, 0x41d0, 0xb2b1, 0x4097, 0x436b, 0x442b, 0xba7f, 0x409b, 0x2918, 0x40a4, 0x2155, 0x444c, 0x3bce, 0x4417, 0x1d3d, 0xb0b1, 0x4414, 0xb28b, 0xbf9e, 0x26d9, 0xba2e, 0x1b11, 0xbf60, 0x40a3, 0xb244, 0xb2b3, 0x4357, 0x40fd, 0x4253, 0x1b39, 0x408f, 0x43e5, 0x2a5f, 0x467b, 0x0fc0, 0x43fa, 0x1ad5, 0x0dca, 0x414e, 0x4401, 0x1cb1, 0xb229, 0x0cdd, 0x19a8, 0x29c7, 0xb2d4, 0x45b6, 0xbf6a, 0x085b, 0x0aa6, 0x195f, 0x4178, 0x0eae, 0x42af, 0xbfa2, 0x287d, 0x40e7, 0x45cb, 0x4233, 0xa5e9, 0x4005, 0xba4a, 0x42c7, 0xbf99, 0xba16, 0x402b, 0xb0a5, 0xb286, 0x40cb, 0x436b, 0x4326, 0x42da, 0x1762, 0x41f8, 0xb2c4, 0x4172, 0x3324, 0x1be2, 0xb210, 0x0a29, 0x2800, 0x225c, 0x02b0, 0xa200, 0x4125, 0x43c4, 0x4055, 0xb22c, 0x2b85, 0x42bc, 0x3465, 0xa4e5, 0xbfba, 0x4268, 0x33b2, 0x1ef1, 0x1d70, 0x4314, 0x4335, 0x4112, 0x2e63, 0x1fc5, 0xb091, 0x0ce5, 0x42a8, 0x17b0, 0x407a, 0xbf5d, 0x407a, 0x3b90, 0x0908, 0xb282, 0x1327, 0xbf00, 0x4376, 0x4278, 0x4075, 0x1de1, 0x4209, 0xb2c6, 0x42fd, 0x0018, 0x1d05, 0x46a3, 0x4290, 0xba7b, 0x0fc7, 0x1652, 0xbac1, 0x4309, 0x41b7, 0x36d6, 0xbf34, 0x43d6, 0x449c, 0xb2a3, 0xb269, 0x41d7, 0x24c0, 0xba4e, 0x40a0, 0xb005, 0x4454, 0x1542, 0x4311, 0x40ef, 0xb28f, 0x42c9, 0x2a56, 0x44f9, 0x407f, 0x454b, 0x2eff, 0x43e9, 0xba66, 0x4332, 0x4344, 0xb0a0, 0xbf31, 0x3bdd, 0x1e29, 0x1289, 0x3d48, 0x4077, 0xace3, 0x43ee, 0xb085, 0x1d32, 0x43b9, 0x411b, 0xb2ee, 0xb06f, 0xb26a, 0xb0ed, 0x0de4, 0x2e64, 0x36cd, 0x44d9, 0xbf26, 0x2866, 0xb271, 0x4132, 0x435c, 0xab9f, 0xa5f0, 0x40e8, 0x1dc4, 0x44e5, 0x409e, 0x15a3, 0x2a03, 0x4032, 0x43c2, 0xb29d, 0x3611, 0xbf02, 0x1a71, 0xb2bd, 0x44a5, 0x44dd, 0x2f63, 0x1176, 0x4017, 0x1c57, 0x42c5, 0xb257, 0xb01a, 0xb210, 0xba3e, 0x1033, 0xbaea, 0x2913, 0xb216, 0xbfa0, 0x414a, 0xbf01, 0x45dc, 0xba34, 0x43a4, 0x09ca, 0x44cc, 0x1fe2, 0xba21, 0x1c5d, 0x1a65, 0xba3f, 0xbfa4, 0x4344, 0xb24f, 0x1d4a, 0x4191, 0x4444, 0xba06, 0x413b, 0xbf58, 0x2509, 0xba2b, 0xb2a8, 0x1f68, 0x3a63, 0x467a, 0x05de, 0x4186, 0xba34, 0x42db, 0x1e2d, 0xbaef, 0xbfd0, 0x1c2d, 0x4176, 0x26bd, 0x4214, 0xa8fb, 0x4187, 0xba36, 0x42aa, 0x4073, 0x46d8, 0xb2f4, 0x40b5, 0x43fa, 0xbf87, 0x4225, 0x4336, 0x4376, 0x1c37, 0x4142, 0xb2e3, 0xbfe0, 0x3578, 0x41e3, 0x41cb, 0xb246, 0x402f, 0x2890, 0x422c, 0x40e9, 0x1892, 0x422d, 0xb209, 0xb2d6, 0x4045, 0xa2a6, 0x43bc, 0xbf37, 0x43ee, 0x4239, 0x326a, 0x3538, 0xb240, 0x43e8, 0xaae3, 0x3b5c, 0xa277, 0xb26f, 0xbf6d, 0xaf28, 0x4372, 0x1e45, 0x40f4, 0xb09f, 0x46e9, 0xb272, 0x4275, 0x2cb5, 0x42df, 0x03a3, 0x413f, 0xbac0, 0x40fa, 0xbad1, 0x0fba, 0xb2ca, 0x42dc, 0x4119, 0xb299, 0x41b9, 0x415f, 0xb240, 0xbf9c, 0xb224, 0x41de, 0x42f1, 0xbace, 0x34a5, 0xb073, 0xb2e6, 0x4073, 0x4185, 0xba32, 0x429b, 0x037d, 0xbfb0, 0x1855, 0xba71, 0x4199, 0x425a, 0x2faf, 0x410d, 0x41f6, 0x4349, 0x1eb6, 0x4333, 0x40dd, 0x40e9, 0xbf8b, 0x431c, 0x1eb9, 0x40c9, 0xb2ca, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x034bf2c4, 0xca960aa8, 0x9456a116, 0xb988fc86, 0x50cab48a, 0xa5759d59, 0x0dfb191d, 0x2b41a1c1, 0x1b2df3ef, 0x1463f435, 0x89ed0b15, 0x9d5b9a9c, 0x39b4b3b7, 0x23d2d921, 0x00000000, 0xc00001f0 }, - FinalRegs = new uint[] { 0xffffffc7, 0xfffffffd, 0x000000fd, 0x280000a7, 0x000000a5, 0x00000000, 0x28000003, 0xffffffff, 0x00001dec, 0x00003494, 0x000000ac, 0x00001dec, 0x00005e9c, 0x00003660, 0x00000000, 0x000001d0 }, + Instructions = [0x3e9f, 0x423a, 0xb038, 0x1a66, 0x2ab4, 0xbf88, 0x41f2, 0x43ed, 0x46e2, 0xbafa, 0xb277, 0xacc3, 0x3d1f, 0xb2f5, 0x008e, 0x4288, 0x298f, 0x4058, 0x1fc4, 0x4234, 0x4372, 0x422f, 0xb260, 0x41ca, 0x4030, 0x4004, 0x40a9, 0x40c8, 0xb2e9, 0xb24e, 0x1d5a, 0xbf9b, 0xb062, 0x4160, 0x3cb1, 0xba5f, 0x43a1, 0x4362, 0x4553, 0x4260, 0x4329, 0x1061, 0xba58, 0xb2f4, 0x40ad, 0x41be, 0x436a, 0x43a3, 0xbfc0, 0xb0f6, 0x401a, 0x0c62, 0x1513, 0xb205, 0xb215, 0x090b, 0x1c21, 0x28af, 0x4092, 0xb294, 0xbfbd, 0x2cb1, 0x1b1e, 0x0984, 0x4175, 0xa7e8, 0xb273, 0x2636, 0x410b, 0x45c0, 0x41ec, 0xb2eb, 0xb0d0, 0x42ca, 0xba52, 0x4185, 0x1455, 0x4600, 0xb215, 0x1947, 0x24af, 0xba32, 0xbfab, 0x40ac, 0xba0b, 0xba5b, 0x07fa, 0x0723, 0xb2c4, 0x2163, 0x42d5, 0x4004, 0x40a7, 0x45d8, 0x43af, 0x42b4, 0x465d, 0xba27, 0x4395, 0x2d9c, 0x192f, 0x1a6a, 0xb28d, 0xbfc7, 0x458b, 0x4281, 0xadc4, 0x4092, 0x125e, 0xbfac, 0x43c8, 0xadde, 0x2713, 0xb265, 0xbf62, 0x3095, 0xbff0, 0x1bd1, 0x40a8, 0x43e3, 0x18c1, 0x41b0, 0x3fb9, 0x18ae, 0x4314, 0x347e, 0x4258, 0x45b5, 0x4660, 0x401d, 0x1dcc, 0x4667, 0x420b, 0x4172, 0xac70, 0x39f3, 0x4097, 0x19b6, 0x41fe, 0xb0c1, 0x4623, 0x1394, 0xbf25, 0xba65, 0x4101, 0x439d, 0x42e1, 0x4333, 0xb0e5, 0x41dd, 0xb268, 0x22c7, 0x2674, 0xba71, 0x421f, 0x4450, 0x0cd7, 0x40e4, 0x1b43, 0x3ea7, 0x1311, 0xbf4e, 0x411b, 0x4112, 0xa8fa, 0xbf19, 0x4015, 0x3844, 0x40d4, 0x4087, 0xbfa7, 0x1f9b, 0x0c01, 0x213b, 0x3a56, 0x4242, 0x40bf, 0x4233, 0xb046, 0x42b5, 0x4556, 0x3058, 0x42b8, 0x36be, 0x437b, 0x1eb6, 0xbacd, 0x4173, 0x433f, 0x42a2, 0x41f3, 0xba23, 0x412f, 0xacfb, 0x4221, 0xbf25, 0x40b0, 0x40b4, 0xba72, 0xb0f2, 0x461f, 0x3123, 0x037e, 0x4580, 0xa9da, 0x2938, 0x42a6, 0x3aaa, 0x4125, 0x2721, 0xbfa4, 0x2a82, 0xb215, 0x41c0, 0xa1c3, 0xb27f, 0x4223, 0xba05, 0x1e73, 0x4054, 0x4629, 0x4415, 0x1cae, 0xb222, 0x1ac2, 0x424f, 0x206a, 0x4080, 0xb2c3, 0x412a, 0xa37e, 0x4037, 0xb26d, 0xb09a, 0xb211, 0x442d, 0xaca9, 0xbf0d, 0x34d4, 0xbfa0, 0x196a, 0x408f, 0x4313, 0x41ea, 0x1560, 0x46ea, 0x449c, 0x3a47, 0x40a6, 0x440a, 0xb267, 0x33b8, 0xb22c, 0x46eb, 0x1824, 0x3843, 0xbfca, 0xbfd0, 0x0716, 0x1031, 0xba00, 0x0daf, 0xba7e, 0xba72, 0xba11, 0x4375, 0xad64, 0xa1db, 0xb263, 0x42e7, 0x46f3, 0xa375, 0x4097, 0xa116, 0x4302, 0x19f5, 0x40ce, 0xbaf9, 0x269e, 0xbf0b, 0x407e, 0xb0f0, 0x45f4, 0x40fc, 0x1e2e, 0xba56, 0x4136, 0xba41, 0x4222, 0xbf1c, 0xb00c, 0x433f, 0xba7a, 0x41a5, 0xbfd0, 0x4260, 0xaf36, 0x42f3, 0x4376, 0xb0e8, 0x42e7, 0x0b6f, 0x4315, 0x1e04, 0xa4ef, 0x135b, 0xa6cd, 0x29d1, 0x40b6, 0x42d0, 0x4596, 0x4383, 0x466d, 0xbf7d, 0x46e4, 0x3014, 0xba02, 0x2ad7, 0xb2fe, 0x3de9, 0x1aa7, 0x2d8c, 0x150c, 0x4233, 0x40a0, 0xba40, 0x3a7a, 0x4361, 0x4447, 0xae8e, 0x4268, 0x4391, 0x41c8, 0x29dc, 0x4174, 0xb23c, 0x1bfc, 0x2c34, 0xbfc0, 0x194b, 0xbf9c, 0x43a6, 0xba78, 0x1b4b, 0x43ce, 0xbad7, 0xbfad, 0x067f, 0x4117, 0x4298, 0x4380, 0xb206, 0xba22, 0x4553, 0x3d55, 0x42f4, 0x1c7d, 0x419e, 0x206f, 0x1af1, 0xbff0, 0x3531, 0x1d92, 0x4150, 0x3fb8, 0x1e5f, 0x4250, 0x1fa1, 0x4202, 0xb0a1, 0xbf11, 0x45d9, 0x4676, 0x40fa, 0x421e, 0x1f6a, 0x0bf8, 0x29cc, 0xbf9d, 0x412e, 0xbf60, 0x3489, 0x4007, 0xba3b, 0x1836, 0x297c, 0x4284, 0x42e1, 0x4409, 0x429f, 0xba1a, 0xbac9, 0xb2b9, 0x3794, 0xa128, 0xa5c4, 0x42fb, 0x4593, 0x4184, 0xb0de, 0x0384, 0xbf3a, 0x3416, 0x3ea6, 0x411c, 0x42cd, 0xbfc0, 0xbaf3, 0xaa2e, 0x4317, 0xb2b2, 0x42d2, 0xb025, 0xb2d1, 0x091b, 0x423a, 0xb094, 0x468d, 0x4426, 0x31f9, 0xbf2e, 0x1e6b, 0x4388, 0x1c68, 0xba48, 0x3089, 0x4607, 0xba01, 0x416d, 0x1d85, 0x4424, 0x40d4, 0x41fa, 0xb28e, 0x1d5f, 0x4177, 0xb0d1, 0x1c5e, 0x4203, 0x0cf5, 0xb24b, 0x1cde, 0x1d65, 0x4281, 0xbfa6, 0xba36, 0x42a4, 0x4243, 0x44fa, 0x43b6, 0xa162, 0x41be, 0xb05d, 0x001b, 0x4283, 0xb2fd, 0x0395, 0xb28d, 0x40fb, 0xba1f, 0x43b1, 0x41af, 0x4157, 0xb245, 0x42f4, 0xb06b, 0xb27c, 0x1d2f, 0x45ee, 0x4435, 0xbfe2, 0x190a, 0x43a7, 0x4565, 0x41c3, 0xba46, 0x42d3, 0xb014, 0x23e7, 0x43a1, 0x436d, 0x4386, 0x1b31, 0x44e9, 0x427e, 0x1b44, 0xba66, 0xb02b, 0x404f, 0x42df, 0x438c, 0xba6f, 0x4083, 0xb02c, 0xba59, 0xaf47, 0x456d, 0xbfbd, 0xb2bd, 0x1e66, 0xbaee, 0x41af, 0xb05e, 0xbf70, 0x41eb, 0x4099, 0x42f1, 0x41d3, 0x40ed, 0xaefe, 0x4223, 0xa7ab, 0x02cb, 0x4393, 0xb258, 0xbfa3, 0x4311, 0x43f3, 0xb2f5, 0x43f4, 0xbf5e, 0x1854, 0x2a65, 0x1c8d, 0x4363, 0x4087, 0x40b2, 0x410a, 0xa11a, 0xb2ca, 0x1efa, 0x20d8, 0x419c, 0x41fd, 0x4283, 0x43f4, 0x4264, 0x420a, 0x469c, 0x1961, 0xb2fc, 0x429a, 0xb2b7, 0x4293, 0xa373, 0xbf98, 0xab6d, 0xb266, 0x01e3, 0x4176, 0xa2e0, 0x0265, 0x42ba, 0x40ce, 0x0695, 0x42a8, 0x3b85, 0x1ea1, 0x428b, 0x442a, 0x4452, 0xbf3c, 0x1bcb, 0xba76, 0x466b, 0x41bb, 0x44b8, 0x401d, 0xba78, 0x4020, 0x46a2, 0xb2ce, 0xb24f, 0x4202, 0xba02, 0x46d1, 0xbf3b, 0x4329, 0x0e1d, 0x40f7, 0x0daa, 0x40b6, 0xb2f0, 0xb208, 0x45a8, 0xbf0a, 0x43d7, 0xb238, 0x43e5, 0x43f3, 0x1dee, 0x3982, 0xbaf5, 0xbf70, 0x022f, 0x42d8, 0x4270, 0xae68, 0x1b50, 0xb2fa, 0x43ce, 0xa22b, 0x4103, 0xb0fe, 0xbf0a, 0xba03, 0xba58, 0xb21c, 0x4242, 0x428b, 0xb21b, 0x46fc, 0xbad7, 0x44f9, 0x409d, 0x1fa0, 0x422f, 0x4045, 0x0cb9, 0xbf37, 0x4168, 0x42e2, 0x1d17, 0x4146, 0x404b, 0x4397, 0x4023, 0x4218, 0x1be7, 0xb20c, 0xbfd0, 0x4166, 0x4677, 0x442e, 0x0bc1, 0x462e, 0x4103, 0x1b0b, 0xb0b5, 0xbf39, 0x3c04, 0xb2a6, 0x4132, 0x031d, 0xbac8, 0xb0d9, 0x436b, 0xb208, 0x4127, 0xbad3, 0x0705, 0x116f, 0xb23b, 0xba75, 0xaccc, 0xba6c, 0x19b5, 0x42c1, 0xb296, 0xbf98, 0x28ab, 0x1165, 0x4195, 0xb06b, 0x4356, 0xbf21, 0x2e2c, 0xba6e, 0xbf70, 0x1b50, 0x1d56, 0x4299, 0x41d0, 0xb2b1, 0x4097, 0x436b, 0x442b, 0xba7f, 0x409b, 0x2918, 0x40a4, 0x2155, 0x444c, 0x3bce, 0x4417, 0x1d3d, 0xb0b1, 0x4414, 0xb28b, 0xbf9e, 0x26d9, 0xba2e, 0x1b11, 0xbf60, 0x40a3, 0xb244, 0xb2b3, 0x4357, 0x40fd, 0x4253, 0x1b39, 0x408f, 0x43e5, 0x2a5f, 0x467b, 0x0fc0, 0x43fa, 0x1ad5, 0x0dca, 0x414e, 0x4401, 0x1cb1, 0xb229, 0x0cdd, 0x19a8, 0x29c7, 0xb2d4, 0x45b6, 0xbf6a, 0x085b, 0x0aa6, 0x195f, 0x4178, 0x0eae, 0x42af, 0xbfa2, 0x287d, 0x40e7, 0x45cb, 0x4233, 0xa5e9, 0x4005, 0xba4a, 0x42c7, 0xbf99, 0xba16, 0x402b, 0xb0a5, 0xb286, 0x40cb, 0x436b, 0x4326, 0x42da, 0x1762, 0x41f8, 0xb2c4, 0x4172, 0x3324, 0x1be2, 0xb210, 0x0a29, 0x2800, 0x225c, 0x02b0, 0xa200, 0x4125, 0x43c4, 0x4055, 0xb22c, 0x2b85, 0x42bc, 0x3465, 0xa4e5, 0xbfba, 0x4268, 0x33b2, 0x1ef1, 0x1d70, 0x4314, 0x4335, 0x4112, 0x2e63, 0x1fc5, 0xb091, 0x0ce5, 0x42a8, 0x17b0, 0x407a, 0xbf5d, 0x407a, 0x3b90, 0x0908, 0xb282, 0x1327, 0xbf00, 0x4376, 0x4278, 0x4075, 0x1de1, 0x4209, 0xb2c6, 0x42fd, 0x0018, 0x1d05, 0x46a3, 0x4290, 0xba7b, 0x0fc7, 0x1652, 0xbac1, 0x4309, 0x41b7, 0x36d6, 0xbf34, 0x43d6, 0x449c, 0xb2a3, 0xb269, 0x41d7, 0x24c0, 0xba4e, 0x40a0, 0xb005, 0x4454, 0x1542, 0x4311, 0x40ef, 0xb28f, 0x42c9, 0x2a56, 0x44f9, 0x407f, 0x454b, 0x2eff, 0x43e9, 0xba66, 0x4332, 0x4344, 0xb0a0, 0xbf31, 0x3bdd, 0x1e29, 0x1289, 0x3d48, 0x4077, 0xace3, 0x43ee, 0xb085, 0x1d32, 0x43b9, 0x411b, 0xb2ee, 0xb06f, 0xb26a, 0xb0ed, 0x0de4, 0x2e64, 0x36cd, 0x44d9, 0xbf26, 0x2866, 0xb271, 0x4132, 0x435c, 0xab9f, 0xa5f0, 0x40e8, 0x1dc4, 0x44e5, 0x409e, 0x15a3, 0x2a03, 0x4032, 0x43c2, 0xb29d, 0x3611, 0xbf02, 0x1a71, 0xb2bd, 0x44a5, 0x44dd, 0x2f63, 0x1176, 0x4017, 0x1c57, 0x42c5, 0xb257, 0xb01a, 0xb210, 0xba3e, 0x1033, 0xbaea, 0x2913, 0xb216, 0xbfa0, 0x414a, 0xbf01, 0x45dc, 0xba34, 0x43a4, 0x09ca, 0x44cc, 0x1fe2, 0xba21, 0x1c5d, 0x1a65, 0xba3f, 0xbfa4, 0x4344, 0xb24f, 0x1d4a, 0x4191, 0x4444, 0xba06, 0x413b, 0xbf58, 0x2509, 0xba2b, 0xb2a8, 0x1f68, 0x3a63, 0x467a, 0x05de, 0x4186, 0xba34, 0x42db, 0x1e2d, 0xbaef, 0xbfd0, 0x1c2d, 0x4176, 0x26bd, 0x4214, 0xa8fb, 0x4187, 0xba36, 0x42aa, 0x4073, 0x46d8, 0xb2f4, 0x40b5, 0x43fa, 0xbf87, 0x4225, 0x4336, 0x4376, 0x1c37, 0x4142, 0xb2e3, 0xbfe0, 0x3578, 0x41e3, 0x41cb, 0xb246, 0x402f, 0x2890, 0x422c, 0x40e9, 0x1892, 0x422d, 0xb209, 0xb2d6, 0x4045, 0xa2a6, 0x43bc, 0xbf37, 0x43ee, 0x4239, 0x326a, 0x3538, 0xb240, 0x43e8, 0xaae3, 0x3b5c, 0xa277, 0xb26f, 0xbf6d, 0xaf28, 0x4372, 0x1e45, 0x40f4, 0xb09f, 0x46e9, 0xb272, 0x4275, 0x2cb5, 0x42df, 0x03a3, 0x413f, 0xbac0, 0x40fa, 0xbad1, 0x0fba, 0xb2ca, 0x42dc, 0x4119, 0xb299, 0x41b9, 0x415f, 0xb240, 0xbf9c, 0xb224, 0x41de, 0x42f1, 0xbace, 0x34a5, 0xb073, 0xb2e6, 0x4073, 0x4185, 0xba32, 0x429b, 0x037d, 0xbfb0, 0x1855, 0xba71, 0x4199, 0x425a, 0x2faf, 0x410d, 0x41f6, 0x4349, 0x1eb6, 0x4333, 0x40dd, 0x40e9, 0xbf8b, 0x431c, 0x1eb9, 0x40c9, 0xb2ca, 0x4770, 0xe7fe + ], + StartRegs = [0x034bf2c4, 0xca960aa8, 0x9456a116, 0xb988fc86, 0x50cab48a, 0xa5759d59, 0x0dfb191d, 0x2b41a1c1, 0x1b2df3ef, 0x1463f435, 0x89ed0b15, 0x9d5b9a9c, 0x39b4b3b7, 0x23d2d921, 0x00000000, 0xc00001f0 + ], + FinalRegs = [0xffffffc7, 0xfffffffd, 0x000000fd, 0x280000a7, 0x000000a5, 0x00000000, 0x28000003, 0xffffffff, 0x00001dec, 0x00003494, 0x000000ac, 0x00001dec, 0x00005e9c, 0x00003660, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x404a, 0x1e38, 0x41ce, 0x41f6, 0xa61e, 0x43e1, 0xba33, 0x0e8f, 0x4366, 0x1fcf, 0x1f02, 0x417c, 0xb24c, 0xbf09, 0xadc6, 0x1cfb, 0x2652, 0x3b78, 0x43dd, 0x4058, 0x435c, 0x418d, 0x41e9, 0xba1e, 0x461a, 0x417c, 0x4070, 0x2e53, 0xbf46, 0xb213, 0x0a50, 0x43ce, 0x403c, 0xb0fb, 0xba32, 0x43c9, 0x408b, 0x4240, 0xba6c, 0x4345, 0x43c8, 0x422f, 0x1b87, 0xb288, 0x1b5c, 0xba0a, 0xbf8c, 0x4371, 0xba11, 0xbf45, 0xa04e, 0xb290, 0x430b, 0x43e5, 0x1ae7, 0x41e3, 0x4260, 0x4631, 0x3e11, 0x46e1, 0xbae9, 0x4207, 0x40ac, 0x404c, 0x2f8f, 0xbf2e, 0x43db, 0x0ef2, 0x41bd, 0x0426, 0xb2e5, 0x3c47, 0xb092, 0x4331, 0xae0c, 0xa2f5, 0x420d, 0x4245, 0x436a, 0x1e7b, 0xac86, 0xb221, 0xb0d1, 0x38f0, 0xbfe0, 0x420b, 0x428d, 0x46c3, 0xa967, 0xb236, 0xbac2, 0x41fc, 0x4026, 0xbf4a, 0x1a93, 0xa7fd, 0x43e8, 0x0d91, 0x42f0, 0xb013, 0x1cb9, 0xb2bd, 0x039a, 0x4307, 0xbfb2, 0x049f, 0x1b17, 0x0a41, 0x18b0, 0xb23e, 0x4126, 0x14d5, 0x3efd, 0x42cd, 0xa767, 0x431e, 0x41f3, 0xb29c, 0x06c1, 0x29be, 0x363e, 0xb26a, 0xa0f2, 0x1e42, 0xbad5, 0xbaca, 0x1ab0, 0xba62, 0xb29d, 0xba6a, 0xbf27, 0x4385, 0x4135, 0x4637, 0x429e, 0xb04e, 0xbf90, 0x432d, 0x4199, 0x40ff, 0x4009, 0x4229, 0xb250, 0x055e, 0x2803, 0xb27c, 0x40f2, 0x4060, 0x41de, 0xb087, 0x2667, 0x439e, 0x466d, 0x4060, 0x1c10, 0x4003, 0xa2e9, 0xb0fc, 0xbfca, 0x4230, 0x42db, 0x1a8c, 0xb2dc, 0x42d5, 0x40d2, 0xba72, 0xbad8, 0x2197, 0x4029, 0x434b, 0x1b03, 0x20bf, 0xb2d0, 0x45e6, 0x4248, 0xac8e, 0x45d8, 0xb23f, 0x431c, 0x2e97, 0x4041, 0x413f, 0xbf92, 0x42b5, 0x4351, 0x46c5, 0x4098, 0x40d4, 0xb2cd, 0x43af, 0x41a1, 0xb035, 0x3e50, 0xbf45, 0x419c, 0x3771, 0xb270, 0x0cda, 0x1f3d, 0xb2a1, 0x18d4, 0x3595, 0xa300, 0x2257, 0x4230, 0xb267, 0xbf63, 0x22b5, 0x334c, 0x4008, 0xb2fb, 0xba14, 0x435b, 0x4253, 0x2bbd, 0x4375, 0x114d, 0xa458, 0x2764, 0x4073, 0x437d, 0x32d1, 0xb034, 0xba67, 0x40b2, 0xa45b, 0xa541, 0x417e, 0xbf93, 0x449d, 0x19af, 0xbada, 0x1c8f, 0xb288, 0x44b9, 0x35bc, 0x407f, 0x4389, 0x099d, 0x1daf, 0x433e, 0x07cc, 0x31b7, 0xb0e3, 0xa4fb, 0x4095, 0xb207, 0x40ec, 0xb2e8, 0x0ec7, 0x0c90, 0xb218, 0xbf6d, 0xa111, 0x1cb3, 0x2234, 0x1fa6, 0x4242, 0x2c82, 0x41d4, 0x2053, 0xbac3, 0x0cd9, 0x2ead, 0x425d, 0xb0c0, 0x44b0, 0xb2b5, 0xb01f, 0x1ce8, 0x46b1, 0x4156, 0xb2e2, 0x41b7, 0xae46, 0x1ee3, 0x444a, 0x415f, 0x4375, 0x1251, 0xbaee, 0xbf13, 0xb22f, 0x401b, 0x19ba, 0x4290, 0xa67b, 0xbac7, 0x1b71, 0x4156, 0x241a, 0x4577, 0x3cbe, 0x1b08, 0x40b2, 0x2f7d, 0x1a27, 0x4335, 0xbaf1, 0x2f52, 0x1850, 0x2414, 0x4129, 0xb24d, 0xbfbb, 0xb283, 0x07e8, 0x399e, 0xbac4, 0xb0af, 0x374d, 0x1bc1, 0x0f91, 0xb09d, 0x22a6, 0x419f, 0x3131, 0x1bdc, 0x42f7, 0x43d7, 0x29ac, 0xbf4c, 0xa2c6, 0xac1c, 0x1d92, 0x4127, 0xaa2a, 0xba5b, 0x4159, 0x41b8, 0x4320, 0x1a6f, 0x249a, 0x3fec, 0xbf5c, 0x41c0, 0x42ed, 0x1a95, 0x1ce2, 0xa1a3, 0x41e9, 0x4014, 0x05f4, 0xb03d, 0x4177, 0x3a2b, 0x4230, 0xabc9, 0x115d, 0x4308, 0x41c6, 0xb273, 0xb2cf, 0xa77c, 0xac87, 0x417e, 0x300c, 0x28a6, 0x42a9, 0xbf39, 0xaeb8, 0x1d9b, 0x1aed, 0x4346, 0xbaf9, 0x462a, 0x4199, 0x0418, 0x45cc, 0x4371, 0x04e7, 0x43f4, 0xb204, 0x4398, 0x438c, 0x43eb, 0xb201, 0x4155, 0x0a6e, 0x2d49, 0x42a3, 0xbac0, 0x43f4, 0x4245, 0xbfa3, 0x1edc, 0x446c, 0x3da5, 0x42e3, 0x42ae, 0xbf2c, 0xb25a, 0x40e7, 0xbfae, 0xb2ec, 0xba4a, 0x4301, 0x43c0, 0x0f46, 0x4182, 0x4233, 0x4084, 0xa36e, 0xbf9f, 0x410e, 0x42a0, 0x1879, 0x43d8, 0x44ea, 0xba40, 0xbfc5, 0x43fe, 0x42b9, 0x42b1, 0x4172, 0x4151, 0x42d4, 0xb25a, 0xbff0, 0xb026, 0x4116, 0x1ac9, 0x435b, 0xbfa2, 0x4482, 0x188e, 0x46f0, 0x26c3, 0x4103, 0x4491, 0xbf80, 0x2b1b, 0x41a2, 0x4022, 0x4132, 0x4235, 0x4214, 0x43d6, 0x4025, 0xa55b, 0x4040, 0x2d18, 0xac95, 0x4316, 0xbadd, 0x41c9, 0xbf9c, 0x2e9b, 0x34ac, 0x40d6, 0x1f75, 0xbfc0, 0x43a8, 0x3e7b, 0x20b6, 0xb0d7, 0xb22f, 0x41d0, 0x1c3a, 0x23a0, 0x1a3a, 0x426e, 0x4178, 0x45c8, 0x426a, 0xbf18, 0x42d7, 0x42e9, 0x40c1, 0x40da, 0xb273, 0xba11, 0xb209, 0xb07b, 0x18af, 0x40bf, 0x4253, 0x0e6f, 0xbf9d, 0x42a7, 0xa767, 0xba35, 0xad49, 0x1d61, 0x1dca, 0x436a, 0x2f36, 0x40e9, 0x1cf2, 0x4061, 0xba3e, 0x099e, 0xac24, 0x4559, 0x467b, 0x1a05, 0x08ce, 0xb295, 0xbfb3, 0x4057, 0x4384, 0x1f5a, 0x13e2, 0x4561, 0x442b, 0xbf02, 0x1563, 0xba37, 0xb230, 0xb0be, 0x41a4, 0x4235, 0xbf3c, 0x4008, 0xb04a, 0x4297, 0xb20d, 0x2cca, 0xb0d8, 0x4386, 0x4054, 0x402c, 0xbf60, 0xbf82, 0x41d9, 0x18bf, 0x1a14, 0x1236, 0x2e49, 0x429d, 0xa669, 0x4120, 0xbfdb, 0x3c29, 0x04af, 0x3169, 0x425f, 0xa558, 0xbf0d, 0xaf86, 0xb0ef, 0x0707, 0x41ba, 0xb263, 0xbfb9, 0x42eb, 0x3db5, 0x3ac5, 0xb214, 0x40ab, 0x42c6, 0x1d21, 0x439c, 0x2200, 0xb0fb, 0x4695, 0x41ef, 0x4178, 0x42ea, 0x43ec, 0xb297, 0x419d, 0x4091, 0x405b, 0x43a6, 0xb2de, 0x21ab, 0xba6d, 0x4002, 0xabb4, 0x400f, 0x40a2, 0xbf2f, 0xb243, 0xa1a2, 0x460c, 0xb2e0, 0xbf9f, 0x1ad6, 0x41d4, 0xb0a0, 0x1b7f, 0x43d7, 0xb228, 0xb2ca, 0x2655, 0x3efc, 0xb249, 0x27dc, 0x428c, 0x40f9, 0x4354, 0x429d, 0xb266, 0x4595, 0xb0cf, 0xb2c9, 0x401e, 0x4264, 0x42b4, 0x0c35, 0x0e87, 0x407f, 0x4336, 0x403d, 0x1df2, 0x41c1, 0xbf39, 0x43bd, 0x4174, 0x4329, 0x44a2, 0x1932, 0xbf4b, 0xb282, 0x1ded, 0xbacf, 0x404a, 0xb246, 0x4630, 0x1ac0, 0x43d7, 0x40a2, 0x4270, 0xb2e1, 0x0cf0, 0x1ecc, 0xbac3, 0x408b, 0x4358, 0x1ca6, 0xbf6c, 0x416b, 0x2d6e, 0xb017, 0x4385, 0xa144, 0xb2b5, 0x41fd, 0xbf28, 0x1aef, 0xb239, 0xb2ba, 0x430e, 0xb0c0, 0x42cb, 0xbfdd, 0xb020, 0x44d9, 0x414d, 0x402b, 0xb033, 0xba4c, 0x1ace, 0x401b, 0xb200, 0x40ae, 0xa013, 0x1fb4, 0x42a2, 0xba53, 0x4006, 0xbfc5, 0xba13, 0xba0a, 0xb21c, 0x406c, 0x0f32, 0x0d61, 0xb28a, 0xadd9, 0x2943, 0x42d8, 0xb212, 0x1e8f, 0xb273, 0x426f, 0xb08b, 0xa7ca, 0xbac8, 0x43b2, 0xa2d0, 0x0940, 0xbaee, 0x42b3, 0x42fe, 0x0239, 0xbf6c, 0x4082, 0xb272, 0x1219, 0x4101, 0x43a8, 0x403e, 0xb251, 0xb251, 0xb035, 0x1abe, 0x1853, 0x4373, 0x4086, 0x4330, 0xb22d, 0x4491, 0x42cb, 0x442d, 0x073a, 0x1abd, 0xb23c, 0xbf6e, 0x43b5, 0x1cd5, 0x1cac, 0x1a26, 0x42c9, 0x4312, 0x41f6, 0x034a, 0xbf1b, 0xba22, 0x43c1, 0x408b, 0x3efd, 0xbf8e, 0x45b1, 0x1ff9, 0xb0b4, 0x42a4, 0x40ff, 0xbae4, 0xa80c, 0xac90, 0x42fd, 0x41e9, 0x434a, 0xba62, 0x4263, 0xafea, 0x42a8, 0x1ebd, 0x0ace, 0x41e2, 0x448b, 0xb231, 0x4186, 0x40cf, 0xbf93, 0xba41, 0x4355, 0xbaca, 0xba6e, 0xb2c3, 0xa584, 0x421d, 0x42c3, 0x0b33, 0xb24a, 0x459b, 0x406a, 0x44c3, 0x1c47, 0x1dbe, 0x1b02, 0xa03c, 0x43af, 0xba58, 0x41b4, 0x43f2, 0x1e2f, 0xbfb8, 0x2fcb, 0x43d3, 0x425e, 0x2f90, 0xb2eb, 0xbfaf, 0x4446, 0x42d0, 0xb0e1, 0x3d22, 0x40fe, 0x425a, 0x439f, 0x4190, 0x417d, 0xb23f, 0x0e6c, 0xbf5d, 0xbfc0, 0xbfb0, 0x4136, 0x3dbb, 0x4548, 0x1ed0, 0x2e7c, 0x427e, 0x420b, 0x1a4a, 0x1b24, 0x405e, 0x42c8, 0x1e86, 0xb2b6, 0x4369, 0x02c5, 0x41c0, 0x4586, 0x417c, 0xb23c, 0x13d1, 0x2eb6, 0xbf9a, 0x4406, 0xbae8, 0x0fc1, 0x4302, 0x37a4, 0x3676, 0x16fc, 0x4292, 0xbf8b, 0x4022, 0x4122, 0xb2d8, 0x3706, 0x4258, 0xbf91, 0x4310, 0x4631, 0x408d, 0x19e5, 0xb01d, 0x4087, 0xa7ab, 0x0ffe, 0xba00, 0x37e6, 0x41ec, 0x407c, 0x406d, 0x1896, 0x43c4, 0x1666, 0x4023, 0x26e4, 0xbf7d, 0xad97, 0x43cd, 0x41cd, 0x215e, 0x41f7, 0x40e6, 0xb270, 0x414c, 0x18d9, 0x3998, 0xb078, 0xb2f5, 0x42bd, 0x0eef, 0x42c4, 0x0f53, 0xaf6b, 0xb29b, 0x11f7, 0x1f08, 0x4030, 0x4384, 0x3b0a, 0x3012, 0x4004, 0x43f4, 0x4636, 0x403f, 0x4484, 0xbfd4, 0xba40, 0xb049, 0x4608, 0x40c4, 0xbf92, 0x1898, 0x36dd, 0x403d, 0x1b5e, 0x4136, 0xbac7, 0x0f85, 0x1f13, 0x4337, 0xbae7, 0x416d, 0xa007, 0xbfcf, 0xaa8b, 0x2329, 0xb28f, 0x4380, 0x431c, 0xa918, 0xadc2, 0xad91, 0x250b, 0x4127, 0x11a2, 0x4395, 0xba07, 0x2356, 0xb21a, 0x4367, 0xb25b, 0x32db, 0x435e, 0x0285, 0xa8d6, 0x4164, 0x045d, 0x3a1c, 0x4191, 0xb0f5, 0x192a, 0x43c2, 0xb278, 0xbf1f, 0xb2e9, 0x456c, 0x4308, 0xb2f4, 0x4261, 0xbf2c, 0xbfe0, 0x4592, 0x431b, 0x402c, 0x1e54, 0x427f, 0x1f79, 0x4052, 0xa524, 0x4132, 0x2bc5, 0x0dfc, 0x1b3d, 0x4053, 0x42e1, 0xbaea, 0x3163, 0x42bc, 0xbfb1, 0x3240, 0x34fb, 0x42b0, 0xb034, 0xadf0, 0x4069, 0x413f, 0xbad6, 0x4335, 0xba39, 0x428e, 0x3b25, 0x41f9, 0x1816, 0x2ec7, 0x1e92, 0x4307, 0xb2d1, 0x405c, 0x41a0, 0x0efc, 0xa329, 0xbfc3, 0x435e, 0x438f, 0x4352, 0xb0c0, 0xb259, 0xae76, 0x40bf, 0x18f7, 0xbae0, 0xb2e7, 0xa6fe, 0x46c3, 0xbf69, 0x4613, 0x406b, 0xb2eb, 0x43ce, 0xa9e3, 0x10eb, 0x46ec, 0xba10, 0x427a, 0x412b, 0xbf9e, 0x41c1, 0x4353, 0xb2c7, 0x42f8, 0xafae, 0x1ab7, 0xb062, 0x407d, 0x4330, 0xb2af, 0x3801, 0xbfab, 0x43c8, 0x423d, 0x4159, 0x41e0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x7059abe5, 0xb415f906, 0x8490eae9, 0x0ff183c6, 0xf39f6a2c, 0xb4413795, 0xee05d88d, 0x50185d92, 0xf621a094, 0x8902e42e, 0x9ecca830, 0x152bbe7f, 0x038e4ec7, 0xeb5d3b32, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0x89283ba8, 0x000001bb, 0xfffffff1, 0x00000000, 0x0000000f, 0x0000240e, 0x00001ba8, 0x0000240e, 0x00000000, 0x000013e8, 0x94ee481b, 0x00000000, 0xffffffe8, 0x00000170, 0x00000000, 0x200001d0 }, + Instructions = [0x404a, 0x1e38, 0x41ce, 0x41f6, 0xa61e, 0x43e1, 0xba33, 0x0e8f, 0x4366, 0x1fcf, 0x1f02, 0x417c, 0xb24c, 0xbf09, 0xadc6, 0x1cfb, 0x2652, 0x3b78, 0x43dd, 0x4058, 0x435c, 0x418d, 0x41e9, 0xba1e, 0x461a, 0x417c, 0x4070, 0x2e53, 0xbf46, 0xb213, 0x0a50, 0x43ce, 0x403c, 0xb0fb, 0xba32, 0x43c9, 0x408b, 0x4240, 0xba6c, 0x4345, 0x43c8, 0x422f, 0x1b87, 0xb288, 0x1b5c, 0xba0a, 0xbf8c, 0x4371, 0xba11, 0xbf45, 0xa04e, 0xb290, 0x430b, 0x43e5, 0x1ae7, 0x41e3, 0x4260, 0x4631, 0x3e11, 0x46e1, 0xbae9, 0x4207, 0x40ac, 0x404c, 0x2f8f, 0xbf2e, 0x43db, 0x0ef2, 0x41bd, 0x0426, 0xb2e5, 0x3c47, 0xb092, 0x4331, 0xae0c, 0xa2f5, 0x420d, 0x4245, 0x436a, 0x1e7b, 0xac86, 0xb221, 0xb0d1, 0x38f0, 0xbfe0, 0x420b, 0x428d, 0x46c3, 0xa967, 0xb236, 0xbac2, 0x41fc, 0x4026, 0xbf4a, 0x1a93, 0xa7fd, 0x43e8, 0x0d91, 0x42f0, 0xb013, 0x1cb9, 0xb2bd, 0x039a, 0x4307, 0xbfb2, 0x049f, 0x1b17, 0x0a41, 0x18b0, 0xb23e, 0x4126, 0x14d5, 0x3efd, 0x42cd, 0xa767, 0x431e, 0x41f3, 0xb29c, 0x06c1, 0x29be, 0x363e, 0xb26a, 0xa0f2, 0x1e42, 0xbad5, 0xbaca, 0x1ab0, 0xba62, 0xb29d, 0xba6a, 0xbf27, 0x4385, 0x4135, 0x4637, 0x429e, 0xb04e, 0xbf90, 0x432d, 0x4199, 0x40ff, 0x4009, 0x4229, 0xb250, 0x055e, 0x2803, 0xb27c, 0x40f2, 0x4060, 0x41de, 0xb087, 0x2667, 0x439e, 0x466d, 0x4060, 0x1c10, 0x4003, 0xa2e9, 0xb0fc, 0xbfca, 0x4230, 0x42db, 0x1a8c, 0xb2dc, 0x42d5, 0x40d2, 0xba72, 0xbad8, 0x2197, 0x4029, 0x434b, 0x1b03, 0x20bf, 0xb2d0, 0x45e6, 0x4248, 0xac8e, 0x45d8, 0xb23f, 0x431c, 0x2e97, 0x4041, 0x413f, 0xbf92, 0x42b5, 0x4351, 0x46c5, 0x4098, 0x40d4, 0xb2cd, 0x43af, 0x41a1, 0xb035, 0x3e50, 0xbf45, 0x419c, 0x3771, 0xb270, 0x0cda, 0x1f3d, 0xb2a1, 0x18d4, 0x3595, 0xa300, 0x2257, 0x4230, 0xb267, 0xbf63, 0x22b5, 0x334c, 0x4008, 0xb2fb, 0xba14, 0x435b, 0x4253, 0x2bbd, 0x4375, 0x114d, 0xa458, 0x2764, 0x4073, 0x437d, 0x32d1, 0xb034, 0xba67, 0x40b2, 0xa45b, 0xa541, 0x417e, 0xbf93, 0x449d, 0x19af, 0xbada, 0x1c8f, 0xb288, 0x44b9, 0x35bc, 0x407f, 0x4389, 0x099d, 0x1daf, 0x433e, 0x07cc, 0x31b7, 0xb0e3, 0xa4fb, 0x4095, 0xb207, 0x40ec, 0xb2e8, 0x0ec7, 0x0c90, 0xb218, 0xbf6d, 0xa111, 0x1cb3, 0x2234, 0x1fa6, 0x4242, 0x2c82, 0x41d4, 0x2053, 0xbac3, 0x0cd9, 0x2ead, 0x425d, 0xb0c0, 0x44b0, 0xb2b5, 0xb01f, 0x1ce8, 0x46b1, 0x4156, 0xb2e2, 0x41b7, 0xae46, 0x1ee3, 0x444a, 0x415f, 0x4375, 0x1251, 0xbaee, 0xbf13, 0xb22f, 0x401b, 0x19ba, 0x4290, 0xa67b, 0xbac7, 0x1b71, 0x4156, 0x241a, 0x4577, 0x3cbe, 0x1b08, 0x40b2, 0x2f7d, 0x1a27, 0x4335, 0xbaf1, 0x2f52, 0x1850, 0x2414, 0x4129, 0xb24d, 0xbfbb, 0xb283, 0x07e8, 0x399e, 0xbac4, 0xb0af, 0x374d, 0x1bc1, 0x0f91, 0xb09d, 0x22a6, 0x419f, 0x3131, 0x1bdc, 0x42f7, 0x43d7, 0x29ac, 0xbf4c, 0xa2c6, 0xac1c, 0x1d92, 0x4127, 0xaa2a, 0xba5b, 0x4159, 0x41b8, 0x4320, 0x1a6f, 0x249a, 0x3fec, 0xbf5c, 0x41c0, 0x42ed, 0x1a95, 0x1ce2, 0xa1a3, 0x41e9, 0x4014, 0x05f4, 0xb03d, 0x4177, 0x3a2b, 0x4230, 0xabc9, 0x115d, 0x4308, 0x41c6, 0xb273, 0xb2cf, 0xa77c, 0xac87, 0x417e, 0x300c, 0x28a6, 0x42a9, 0xbf39, 0xaeb8, 0x1d9b, 0x1aed, 0x4346, 0xbaf9, 0x462a, 0x4199, 0x0418, 0x45cc, 0x4371, 0x04e7, 0x43f4, 0xb204, 0x4398, 0x438c, 0x43eb, 0xb201, 0x4155, 0x0a6e, 0x2d49, 0x42a3, 0xbac0, 0x43f4, 0x4245, 0xbfa3, 0x1edc, 0x446c, 0x3da5, 0x42e3, 0x42ae, 0xbf2c, 0xb25a, 0x40e7, 0xbfae, 0xb2ec, 0xba4a, 0x4301, 0x43c0, 0x0f46, 0x4182, 0x4233, 0x4084, 0xa36e, 0xbf9f, 0x410e, 0x42a0, 0x1879, 0x43d8, 0x44ea, 0xba40, 0xbfc5, 0x43fe, 0x42b9, 0x42b1, 0x4172, 0x4151, 0x42d4, 0xb25a, 0xbff0, 0xb026, 0x4116, 0x1ac9, 0x435b, 0xbfa2, 0x4482, 0x188e, 0x46f0, 0x26c3, 0x4103, 0x4491, 0xbf80, 0x2b1b, 0x41a2, 0x4022, 0x4132, 0x4235, 0x4214, 0x43d6, 0x4025, 0xa55b, 0x4040, 0x2d18, 0xac95, 0x4316, 0xbadd, 0x41c9, 0xbf9c, 0x2e9b, 0x34ac, 0x40d6, 0x1f75, 0xbfc0, 0x43a8, 0x3e7b, 0x20b6, 0xb0d7, 0xb22f, 0x41d0, 0x1c3a, 0x23a0, 0x1a3a, 0x426e, 0x4178, 0x45c8, 0x426a, 0xbf18, 0x42d7, 0x42e9, 0x40c1, 0x40da, 0xb273, 0xba11, 0xb209, 0xb07b, 0x18af, 0x40bf, 0x4253, 0x0e6f, 0xbf9d, 0x42a7, 0xa767, 0xba35, 0xad49, 0x1d61, 0x1dca, 0x436a, 0x2f36, 0x40e9, 0x1cf2, 0x4061, 0xba3e, 0x099e, 0xac24, 0x4559, 0x467b, 0x1a05, 0x08ce, 0xb295, 0xbfb3, 0x4057, 0x4384, 0x1f5a, 0x13e2, 0x4561, 0x442b, 0xbf02, 0x1563, 0xba37, 0xb230, 0xb0be, 0x41a4, 0x4235, 0xbf3c, 0x4008, 0xb04a, 0x4297, 0xb20d, 0x2cca, 0xb0d8, 0x4386, 0x4054, 0x402c, 0xbf60, 0xbf82, 0x41d9, 0x18bf, 0x1a14, 0x1236, 0x2e49, 0x429d, 0xa669, 0x4120, 0xbfdb, 0x3c29, 0x04af, 0x3169, 0x425f, 0xa558, 0xbf0d, 0xaf86, 0xb0ef, 0x0707, 0x41ba, 0xb263, 0xbfb9, 0x42eb, 0x3db5, 0x3ac5, 0xb214, 0x40ab, 0x42c6, 0x1d21, 0x439c, 0x2200, 0xb0fb, 0x4695, 0x41ef, 0x4178, 0x42ea, 0x43ec, 0xb297, 0x419d, 0x4091, 0x405b, 0x43a6, 0xb2de, 0x21ab, 0xba6d, 0x4002, 0xabb4, 0x400f, 0x40a2, 0xbf2f, 0xb243, 0xa1a2, 0x460c, 0xb2e0, 0xbf9f, 0x1ad6, 0x41d4, 0xb0a0, 0x1b7f, 0x43d7, 0xb228, 0xb2ca, 0x2655, 0x3efc, 0xb249, 0x27dc, 0x428c, 0x40f9, 0x4354, 0x429d, 0xb266, 0x4595, 0xb0cf, 0xb2c9, 0x401e, 0x4264, 0x42b4, 0x0c35, 0x0e87, 0x407f, 0x4336, 0x403d, 0x1df2, 0x41c1, 0xbf39, 0x43bd, 0x4174, 0x4329, 0x44a2, 0x1932, 0xbf4b, 0xb282, 0x1ded, 0xbacf, 0x404a, 0xb246, 0x4630, 0x1ac0, 0x43d7, 0x40a2, 0x4270, 0xb2e1, 0x0cf0, 0x1ecc, 0xbac3, 0x408b, 0x4358, 0x1ca6, 0xbf6c, 0x416b, 0x2d6e, 0xb017, 0x4385, 0xa144, 0xb2b5, 0x41fd, 0xbf28, 0x1aef, 0xb239, 0xb2ba, 0x430e, 0xb0c0, 0x42cb, 0xbfdd, 0xb020, 0x44d9, 0x414d, 0x402b, 0xb033, 0xba4c, 0x1ace, 0x401b, 0xb200, 0x40ae, 0xa013, 0x1fb4, 0x42a2, 0xba53, 0x4006, 0xbfc5, 0xba13, 0xba0a, 0xb21c, 0x406c, 0x0f32, 0x0d61, 0xb28a, 0xadd9, 0x2943, 0x42d8, 0xb212, 0x1e8f, 0xb273, 0x426f, 0xb08b, 0xa7ca, 0xbac8, 0x43b2, 0xa2d0, 0x0940, 0xbaee, 0x42b3, 0x42fe, 0x0239, 0xbf6c, 0x4082, 0xb272, 0x1219, 0x4101, 0x43a8, 0x403e, 0xb251, 0xb251, 0xb035, 0x1abe, 0x1853, 0x4373, 0x4086, 0x4330, 0xb22d, 0x4491, 0x42cb, 0x442d, 0x073a, 0x1abd, 0xb23c, 0xbf6e, 0x43b5, 0x1cd5, 0x1cac, 0x1a26, 0x42c9, 0x4312, 0x41f6, 0x034a, 0xbf1b, 0xba22, 0x43c1, 0x408b, 0x3efd, 0xbf8e, 0x45b1, 0x1ff9, 0xb0b4, 0x42a4, 0x40ff, 0xbae4, 0xa80c, 0xac90, 0x42fd, 0x41e9, 0x434a, 0xba62, 0x4263, 0xafea, 0x42a8, 0x1ebd, 0x0ace, 0x41e2, 0x448b, 0xb231, 0x4186, 0x40cf, 0xbf93, 0xba41, 0x4355, 0xbaca, 0xba6e, 0xb2c3, 0xa584, 0x421d, 0x42c3, 0x0b33, 0xb24a, 0x459b, 0x406a, 0x44c3, 0x1c47, 0x1dbe, 0x1b02, 0xa03c, 0x43af, 0xba58, 0x41b4, 0x43f2, 0x1e2f, 0xbfb8, 0x2fcb, 0x43d3, 0x425e, 0x2f90, 0xb2eb, 0xbfaf, 0x4446, 0x42d0, 0xb0e1, 0x3d22, 0x40fe, 0x425a, 0x439f, 0x4190, 0x417d, 0xb23f, 0x0e6c, 0xbf5d, 0xbfc0, 0xbfb0, 0x4136, 0x3dbb, 0x4548, 0x1ed0, 0x2e7c, 0x427e, 0x420b, 0x1a4a, 0x1b24, 0x405e, 0x42c8, 0x1e86, 0xb2b6, 0x4369, 0x02c5, 0x41c0, 0x4586, 0x417c, 0xb23c, 0x13d1, 0x2eb6, 0xbf9a, 0x4406, 0xbae8, 0x0fc1, 0x4302, 0x37a4, 0x3676, 0x16fc, 0x4292, 0xbf8b, 0x4022, 0x4122, 0xb2d8, 0x3706, 0x4258, 0xbf91, 0x4310, 0x4631, 0x408d, 0x19e5, 0xb01d, 0x4087, 0xa7ab, 0x0ffe, 0xba00, 0x37e6, 0x41ec, 0x407c, 0x406d, 0x1896, 0x43c4, 0x1666, 0x4023, 0x26e4, 0xbf7d, 0xad97, 0x43cd, 0x41cd, 0x215e, 0x41f7, 0x40e6, 0xb270, 0x414c, 0x18d9, 0x3998, 0xb078, 0xb2f5, 0x42bd, 0x0eef, 0x42c4, 0x0f53, 0xaf6b, 0xb29b, 0x11f7, 0x1f08, 0x4030, 0x4384, 0x3b0a, 0x3012, 0x4004, 0x43f4, 0x4636, 0x403f, 0x4484, 0xbfd4, 0xba40, 0xb049, 0x4608, 0x40c4, 0xbf92, 0x1898, 0x36dd, 0x403d, 0x1b5e, 0x4136, 0xbac7, 0x0f85, 0x1f13, 0x4337, 0xbae7, 0x416d, 0xa007, 0xbfcf, 0xaa8b, 0x2329, 0xb28f, 0x4380, 0x431c, 0xa918, 0xadc2, 0xad91, 0x250b, 0x4127, 0x11a2, 0x4395, 0xba07, 0x2356, 0xb21a, 0x4367, 0xb25b, 0x32db, 0x435e, 0x0285, 0xa8d6, 0x4164, 0x045d, 0x3a1c, 0x4191, 0xb0f5, 0x192a, 0x43c2, 0xb278, 0xbf1f, 0xb2e9, 0x456c, 0x4308, 0xb2f4, 0x4261, 0xbf2c, 0xbfe0, 0x4592, 0x431b, 0x402c, 0x1e54, 0x427f, 0x1f79, 0x4052, 0xa524, 0x4132, 0x2bc5, 0x0dfc, 0x1b3d, 0x4053, 0x42e1, 0xbaea, 0x3163, 0x42bc, 0xbfb1, 0x3240, 0x34fb, 0x42b0, 0xb034, 0xadf0, 0x4069, 0x413f, 0xbad6, 0x4335, 0xba39, 0x428e, 0x3b25, 0x41f9, 0x1816, 0x2ec7, 0x1e92, 0x4307, 0xb2d1, 0x405c, 0x41a0, 0x0efc, 0xa329, 0xbfc3, 0x435e, 0x438f, 0x4352, 0xb0c0, 0xb259, 0xae76, 0x40bf, 0x18f7, 0xbae0, 0xb2e7, 0xa6fe, 0x46c3, 0xbf69, 0x4613, 0x406b, 0xb2eb, 0x43ce, 0xa9e3, 0x10eb, 0x46ec, 0xba10, 0x427a, 0x412b, 0xbf9e, 0x41c1, 0x4353, 0xb2c7, 0x42f8, 0xafae, 0x1ab7, 0xb062, 0x407d, 0x4330, 0xb2af, 0x3801, 0xbfab, 0x43c8, 0x423d, 0x4159, 0x41e0, 0x4770, 0xe7fe + ], + StartRegs = [0x7059abe5, 0xb415f906, 0x8490eae9, 0x0ff183c6, 0xf39f6a2c, 0xb4413795, 0xee05d88d, 0x50185d92, 0xf621a094, 0x8902e42e, 0x9ecca830, 0x152bbe7f, 0x038e4ec7, 0xeb5d3b32, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0x89283ba8, 0x000001bb, 0xfffffff1, 0x00000000, 0x0000000f, 0x0000240e, 0x00001ba8, 0x0000240e, 0x00000000, 0x000013e8, 0x94ee481b, 0x00000000, 0xffffffe8, 0x00000170, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0xba51, 0x414a, 0x4030, 0x4380, 0x4328, 0xb07b, 0x425a, 0xb214, 0x42fd, 0x2b6a, 0xaf72, 0x0da2, 0xb260, 0xb0a2, 0x4017, 0x4242, 0x38f4, 0x40d8, 0xb2b5, 0xbf43, 0x40f1, 0xb29b, 0x4240, 0x412b, 0x1c5d, 0xb27f, 0x2483, 0x4322, 0xba3d, 0x380c, 0xba4e, 0x1a5d, 0x4387, 0xb21d, 0xb2b6, 0xbf29, 0x2514, 0x43b9, 0x424b, 0x3cb5, 0xbf90, 0x40b2, 0x2a94, 0x42ce, 0x42df, 0xb23a, 0x12c2, 0xb232, 0x3230, 0x194f, 0xbf9e, 0xac89, 0x40d9, 0x4023, 0x424a, 0x2736, 0x0a55, 0x401a, 0x1835, 0x402e, 0xb20b, 0xbf6f, 0x2155, 0xbaf4, 0x39c6, 0x0161, 0x4217, 0x33de, 0x379d, 0x1dbc, 0x0b38, 0xb2ff, 0x23eb, 0x4072, 0xbf8a, 0x4201, 0x4240, 0x41b1, 0x1916, 0x40c4, 0xb26a, 0x4345, 0x0e81, 0xbf17, 0x4359, 0x4396, 0x4185, 0xa8f1, 0x43ce, 0x0472, 0x424d, 0x438d, 0x4018, 0x3684, 0xb244, 0x4349, 0x40a9, 0x400c, 0x41ac, 0x42ff, 0xaea0, 0xa7e6, 0xb2ec, 0x31eb, 0xb211, 0x42c8, 0x2649, 0x4064, 0xbad9, 0xbf05, 0x4169, 0x4664, 0x4679, 0x4576, 0x415b, 0xb200, 0x1f31, 0x2abf, 0xb0f4, 0x46d5, 0x4387, 0x40fa, 0x42dd, 0x18c0, 0xb021, 0x3d89, 0x403f, 0x4257, 0x1f9a, 0x43ed, 0x3c5c, 0x1c96, 0x41d4, 0xb201, 0x2ff5, 0x43ab, 0x0f0f, 0xbf69, 0x4637, 0x1895, 0x1d62, 0xa75b, 0xb0c3, 0x45d2, 0x432b, 0xb217, 0x18c7, 0x41dd, 0xa705, 0x4219, 0x433d, 0xa9c2, 0xb29d, 0x40f1, 0xbaf1, 0x420c, 0xb256, 0x4112, 0xbfbd, 0x1ab8, 0xba34, 0xbfe0, 0xbadf, 0xa4ed, 0x4323, 0x41a6, 0x40d6, 0x40c3, 0x4361, 0x0974, 0x1990, 0x42dc, 0x4377, 0xb2d8, 0x44d4, 0xba4e, 0x46e9, 0x188c, 0xbfd5, 0x429b, 0x4374, 0x4551, 0xb259, 0x418c, 0x4588, 0x43fe, 0xbfd0, 0x4175, 0x4227, 0x44b8, 0xbfe0, 0x2e9a, 0x406a, 0x2535, 0x4168, 0x0ad7, 0x1d42, 0x4264, 0xb086, 0xbada, 0xb00f, 0xb26f, 0x1b8d, 0x1c5c, 0x44c1, 0x3f77, 0x0f15, 0xb24c, 0xbf0e, 0x42d1, 0x44eb, 0x4253, 0x4233, 0x4203, 0xbfcd, 0x427a, 0x18a6, 0x4011, 0x29a1, 0x40cc, 0x448c, 0x1d4f, 0x0d2b, 0xb2dc, 0x4026, 0x12ff, 0x434c, 0x06a7, 0x415f, 0x41e4, 0x1842, 0xbf3a, 0xba5a, 0x4082, 0x43d2, 0x42a7, 0xa3c3, 0x41f5, 0x4341, 0x35dd, 0x425e, 0xb2c6, 0x4396, 0x420d, 0xb298, 0xbfd0, 0xa02a, 0x060e, 0x009f, 0x0988, 0x22b2, 0x4168, 0xbfbd, 0x437e, 0x38d0, 0x08f1, 0x41eb, 0x41c6, 0x21e9, 0x40d5, 0x1495, 0x436d, 0x41a6, 0x43f7, 0x21f7, 0xb04a, 0x4349, 0xb2d4, 0x0baa, 0xb034, 0x4087, 0x41f3, 0x40ff, 0xbf48, 0x41e7, 0xa4cb, 0x3b1b, 0xa68b, 0x18b1, 0xbaeb, 0xb045, 0xb231, 0x4194, 0x4425, 0x40f8, 0x1fda, 0xa62a, 0x4302, 0xb2ee, 0x40f9, 0x1bb8, 0x4365, 0x42ff, 0x434d, 0xba42, 0xb2ad, 0xbfb3, 0xba16, 0xb2bd, 0x41df, 0x42c9, 0x4367, 0x0235, 0x34d6, 0x4176, 0x40cb, 0x4295, 0x42b9, 0x0de1, 0x41c8, 0x41be, 0xb2ea, 0x1312, 0x4230, 0x1907, 0xb2f6, 0x4215, 0xba0a, 0xba32, 0x42a1, 0xbf07, 0x397f, 0xbfc0, 0x4206, 0x124e, 0x40cb, 0x440d, 0xb0a0, 0xb27c, 0x3960, 0x411d, 0x4217, 0x463a, 0x3a91, 0x3950, 0x438c, 0x1c16, 0xbfcb, 0xb207, 0x435b, 0x40ee, 0xbfb0, 0x2ebf, 0x3df7, 0xb21e, 0xba74, 0x1b05, 0x46fb, 0x428d, 0x43c1, 0x4196, 0x4379, 0x4239, 0x19e7, 0x411d, 0xbfd2, 0x3b6c, 0x42a7, 0x1ab9, 0xbafe, 0x40f8, 0x0e6a, 0x4422, 0xba1f, 0xbfa5, 0xba17, 0x43cb, 0x3d92, 0x43f7, 0x18a0, 0xbf21, 0x2196, 0x1fb2, 0x2491, 0x402b, 0xbf6a, 0x244e, 0x43b9, 0x03b7, 0x4228, 0x40e1, 0x42e3, 0x4353, 0x00d9, 0x41a9, 0xbac9, 0xbf74, 0x1b6a, 0x4381, 0x412b, 0x43d6, 0xbf26, 0x4194, 0x19f9, 0xb28a, 0x4000, 0xba61, 0x41a6, 0x1f6d, 0x19da, 0xb211, 0xbfa5, 0x1bf6, 0x4070, 0x1f03, 0xb275, 0x413d, 0x40f0, 0x45c8, 0x4036, 0x1844, 0x400a, 0x408b, 0x1cf3, 0xb2f6, 0x4302, 0xbf23, 0x16bb, 0x40c6, 0xba47, 0xba62, 0x42b8, 0xb24d, 0x4088, 0xba35, 0x43f5, 0xbade, 0x434f, 0x1ae1, 0x1df1, 0xb2da, 0xbfcc, 0x42ab, 0x1ece, 0x4252, 0x1e4c, 0x3aed, 0x4175, 0xb2c9, 0x422d, 0x4306, 0x3dd4, 0x4247, 0x413f, 0x3a6f, 0xb0c0, 0xb052, 0x41eb, 0xb222, 0xb05d, 0xbf16, 0x4332, 0x4142, 0xb29f, 0xb26d, 0x43b0, 0x2c2f, 0xa515, 0x43e4, 0x3d7a, 0xbf80, 0x2e76, 0x45e0, 0x1b4e, 0xbfd2, 0x45e2, 0x4033, 0x4305, 0xbf47, 0x1ad6, 0xbff0, 0x150c, 0x3e9a, 0x1ea8, 0x4120, 0x19ce, 0xbf79, 0x43ba, 0xbfe0, 0x3779, 0x42db, 0x39fe, 0xac2d, 0x1c17, 0x43b7, 0x4338, 0x29d6, 0x4069, 0xb0ba, 0xbf90, 0xa22d, 0x423c, 0x1df9, 0x40ba, 0xb24a, 0xbf87, 0x1999, 0xb277, 0x465f, 0x41da, 0xba31, 0xb2b8, 0xba07, 0x1950, 0x2ad8, 0x03a6, 0x4598, 0x1e2e, 0x4291, 0x439e, 0x43b4, 0xb0dd, 0x407d, 0x1859, 0xbf36, 0x196c, 0xb2f4, 0x19c2, 0x426f, 0xb2ed, 0xba27, 0xb209, 0x44e1, 0x2f28, 0x412a, 0x1f41, 0x26d7, 0xba26, 0x2bcb, 0x43ce, 0xbfa0, 0x1ee7, 0x307b, 0x1f27, 0x1438, 0x3bae, 0xb20a, 0x2af0, 0x1747, 0xbf03, 0xb272, 0x42c1, 0x445d, 0x1032, 0x43ac, 0x4048, 0x40c7, 0x43eb, 0x20f9, 0x4167, 0x4257, 0x419d, 0xb254, 0x020a, 0x0824, 0xbf60, 0x1bc9, 0xaa64, 0x4306, 0x41a8, 0x4368, 0x2461, 0x4412, 0x0a06, 0x426b, 0x380f, 0x429d, 0xb2b6, 0xb06a, 0xbf2c, 0x44a2, 0x4216, 0x42c3, 0xb24d, 0x455a, 0x417b, 0x4237, 0x1a76, 0xba20, 0xb08b, 0xba73, 0x178c, 0x144c, 0x1477, 0x3fff, 0xbac6, 0x40c6, 0x416b, 0xb221, 0x2221, 0x14a6, 0x3de1, 0xbf8f, 0x426c, 0xb28f, 0x4094, 0xb21a, 0x371b, 0x4654, 0x46ec, 0xba7f, 0x086c, 0x159f, 0xbaf8, 0x4094, 0xb2d1, 0x412e, 0x4087, 0xb246, 0x4190, 0x4318, 0xb2f2, 0x0736, 0xb269, 0xbf60, 0x4569, 0x466c, 0x4271, 0x4591, 0xbf91, 0x1b68, 0x4287, 0xba47, 0x4338, 0x42c7, 0xb27a, 0x4046, 0x4280, 0xbf77, 0x42e7, 0x456a, 0x117c, 0x4216, 0xbf51, 0x443e, 0x4362, 0x4036, 0x4336, 0x1e6b, 0xb25e, 0x0281, 0x4258, 0x456f, 0x4247, 0xb253, 0x358c, 0x4225, 0xb209, 0x4292, 0x2ac6, 0xb2c5, 0x2643, 0xad8c, 0x432d, 0xba18, 0x4155, 0x2239, 0x2027, 0xb27b, 0x4161, 0xb224, 0x0e38, 0xbf6f, 0x316c, 0xba5f, 0xad65, 0x4059, 0x1cd7, 0x4174, 0x325d, 0x1c2f, 0x41f3, 0xbaeb, 0x4065, 0xbf18, 0x4107, 0xb04b, 0xb2e6, 0x4060, 0x4058, 0x43e0, 0x13fe, 0x3d85, 0x4240, 0xbf58, 0x41ac, 0xbacd, 0xb218, 0x422f, 0xb228, 0x04cc, 0x1ed0, 0x43c1, 0x414a, 0x21dd, 0x1de5, 0x40d8, 0x4174, 0x4607, 0x430e, 0x4303, 0x40fd, 0xbf80, 0xbf96, 0x0173, 0xb21f, 0x44bb, 0xba35, 0x1e73, 0x40cf, 0xb0a8, 0x412d, 0x43ee, 0x42de, 0xb258, 0x411f, 0x4139, 0xb2aa, 0xae46, 0x0246, 0x421c, 0x18d7, 0x4258, 0xba6e, 0xb09e, 0x4024, 0xbaec, 0xba26, 0x41aa, 0x1e8d, 0x2a8c, 0xbf2e, 0x43e9, 0x46a9, 0x42ef, 0x43a1, 0x409c, 0x4176, 0x4133, 0xba70, 0x4649, 0xb0c6, 0x41a3, 0x4285, 0xb2e9, 0x41d2, 0x3f71, 0x403e, 0x4322, 0x4627, 0xbfae, 0xaa92, 0x43c6, 0x42d2, 0xac63, 0x0a31, 0xb258, 0xbfc6, 0x417a, 0xbaf1, 0xba1f, 0x43b8, 0x41fb, 0x4253, 0x1b4b, 0x4419, 0xbf4e, 0x4012, 0xb245, 0x3e4e, 0x44f8, 0x368f, 0x4324, 0x416d, 0x409b, 0x4254, 0xbf80, 0x27fa, 0xa534, 0xbf90, 0x1ab2, 0xb2ec, 0x4335, 0x1eb9, 0xba45, 0x4333, 0xbfb9, 0x1c4d, 0x2c8a, 0x2e8a, 0x423a, 0xb0e3, 0xb21c, 0x422d, 0xbf8e, 0x2e30, 0x42a7, 0xb0bf, 0x43b5, 0x1af2, 0x43c7, 0x1aef, 0x466c, 0xbf13, 0x3802, 0xba0b, 0x4043, 0xb089, 0xba08, 0x4153, 0x1a77, 0xb2fd, 0xa20a, 0x43b8, 0x402e, 0x4031, 0x18ce, 0x400a, 0xbf60, 0x32d5, 0x2169, 0xba6d, 0x41f3, 0x1722, 0x4396, 0xb266, 0x4165, 0xb2ad, 0x402a, 0x40ca, 0xb254, 0xbf15, 0x1b9e, 0x32eb, 0x4148, 0xba7a, 0x3889, 0x1cf3, 0x4117, 0xbad5, 0x40aa, 0x41e2, 0xbf67, 0x30d2, 0x1428, 0x42ab, 0x3d03, 0xa881, 0xbfb0, 0xb2bd, 0x1759, 0x4550, 0x0672, 0x1807, 0x300d, 0x40ad, 0x2e4a, 0xb237, 0x290f, 0xb228, 0x433e, 0x4273, 0x0bf7, 0xb0ac, 0xbaf3, 0xb00c, 0x0408, 0x4009, 0xbf3d, 0x411e, 0x433e, 0x4079, 0x41fb, 0x4375, 0x43b5, 0x4365, 0xb02c, 0x4654, 0x44e5, 0x4271, 0xb216, 0x41c5, 0x42c0, 0x4630, 0x3d54, 0xbfde, 0xba79, 0x1dba, 0xb0b7, 0x402a, 0x4279, 0x4120, 0x1e83, 0x4383, 0x18e9, 0x462c, 0x4178, 0x40a4, 0x4285, 0xb058, 0x1e53, 0xbf27, 0xb025, 0x29c0, 0x40d3, 0xb2e7, 0xba77, 0xbae1, 0x2061, 0x425a, 0x42e6, 0xbf71, 0x4018, 0x4337, 0x4287, 0xbafd, 0x42eb, 0x418e, 0x4177, 0xb01f, 0x4274, 0x1e4b, 0xad9b, 0xb2d2, 0xbad4, 0x40aa, 0x4302, 0x18be, 0x4214, 0x427c, 0x41ed, 0x18e8, 0xbfb5, 0x41ee, 0x41c8, 0x43f5, 0x401a, 0xaacd, 0x402a, 0x0dae, 0xb05e, 0x40af, 0x4019, 0x1c2f, 0x4273, 0x28ca, 0x3e2e, 0x4636, 0xba00, 0x41cf, 0xbfcd, 0x4393, 0x4225, 0x42c6, 0x08dd, 0x4085, 0x41df, 0x43e0, 0x1ef3, 0x2fc5, 0x1893, 0x407c, 0x4263, 0xa557, 0xb0ad, 0xbfbd, 0x2c87, 0xb254, 0xba35, 0x404b, 0x1f02, 0x4128, 0xba23, 0x21ae, 0x04df, 0x4097, 0xb06f, 0x4630, 0xb2d9, 0x4076, 0x4118, 0x34d4, 0x402c, 0x4014, 0x4660, 0x1b57, 0x1ed9, 0x1d79, 0x0656, 0x1a34, 0x3ed4, 0xbfde, 0x1cbc, 0x4318, 0xba0c, 0x4485, 0x3cb7, 0x1be9, 0x411e, 0x0c28, 0x4320, 0x4048, 0xba28, 0xba50, 0xb0ce, 0x43d5, 0x409f, 0x454c, 0xa404, 0x41ce, 0xbf25, 0x402a, 0x4621, 0x4193, 0x41d2, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xc53d8d03, 0xff04be91, 0xd7eb41e1, 0xf292368c, 0xc17640e7, 0x57b5fdc3, 0x3ca7f7e5, 0x438f9293, 0xbf87ea5c, 0x7ed4e28f, 0xf51a6864, 0x539c9c7c, 0x62d8cca2, 0xc0701359, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0xfffffcff, 0x000017f4, 0x00000000, 0x00000800, 0x000017f4, 0x00000003, 0xf2cf7fff, 0xffffe718, 0xc0464ce0, 0x0d53d3ba, 0xf51a6864, 0x000012ba, 0xf51a6b68, 0xdf4f4290, 0x00000000, 0xa00001d0 }, + Instructions = [0xba51, 0x414a, 0x4030, 0x4380, 0x4328, 0xb07b, 0x425a, 0xb214, 0x42fd, 0x2b6a, 0xaf72, 0x0da2, 0xb260, 0xb0a2, 0x4017, 0x4242, 0x38f4, 0x40d8, 0xb2b5, 0xbf43, 0x40f1, 0xb29b, 0x4240, 0x412b, 0x1c5d, 0xb27f, 0x2483, 0x4322, 0xba3d, 0x380c, 0xba4e, 0x1a5d, 0x4387, 0xb21d, 0xb2b6, 0xbf29, 0x2514, 0x43b9, 0x424b, 0x3cb5, 0xbf90, 0x40b2, 0x2a94, 0x42ce, 0x42df, 0xb23a, 0x12c2, 0xb232, 0x3230, 0x194f, 0xbf9e, 0xac89, 0x40d9, 0x4023, 0x424a, 0x2736, 0x0a55, 0x401a, 0x1835, 0x402e, 0xb20b, 0xbf6f, 0x2155, 0xbaf4, 0x39c6, 0x0161, 0x4217, 0x33de, 0x379d, 0x1dbc, 0x0b38, 0xb2ff, 0x23eb, 0x4072, 0xbf8a, 0x4201, 0x4240, 0x41b1, 0x1916, 0x40c4, 0xb26a, 0x4345, 0x0e81, 0xbf17, 0x4359, 0x4396, 0x4185, 0xa8f1, 0x43ce, 0x0472, 0x424d, 0x438d, 0x4018, 0x3684, 0xb244, 0x4349, 0x40a9, 0x400c, 0x41ac, 0x42ff, 0xaea0, 0xa7e6, 0xb2ec, 0x31eb, 0xb211, 0x42c8, 0x2649, 0x4064, 0xbad9, 0xbf05, 0x4169, 0x4664, 0x4679, 0x4576, 0x415b, 0xb200, 0x1f31, 0x2abf, 0xb0f4, 0x46d5, 0x4387, 0x40fa, 0x42dd, 0x18c0, 0xb021, 0x3d89, 0x403f, 0x4257, 0x1f9a, 0x43ed, 0x3c5c, 0x1c96, 0x41d4, 0xb201, 0x2ff5, 0x43ab, 0x0f0f, 0xbf69, 0x4637, 0x1895, 0x1d62, 0xa75b, 0xb0c3, 0x45d2, 0x432b, 0xb217, 0x18c7, 0x41dd, 0xa705, 0x4219, 0x433d, 0xa9c2, 0xb29d, 0x40f1, 0xbaf1, 0x420c, 0xb256, 0x4112, 0xbfbd, 0x1ab8, 0xba34, 0xbfe0, 0xbadf, 0xa4ed, 0x4323, 0x41a6, 0x40d6, 0x40c3, 0x4361, 0x0974, 0x1990, 0x42dc, 0x4377, 0xb2d8, 0x44d4, 0xba4e, 0x46e9, 0x188c, 0xbfd5, 0x429b, 0x4374, 0x4551, 0xb259, 0x418c, 0x4588, 0x43fe, 0xbfd0, 0x4175, 0x4227, 0x44b8, 0xbfe0, 0x2e9a, 0x406a, 0x2535, 0x4168, 0x0ad7, 0x1d42, 0x4264, 0xb086, 0xbada, 0xb00f, 0xb26f, 0x1b8d, 0x1c5c, 0x44c1, 0x3f77, 0x0f15, 0xb24c, 0xbf0e, 0x42d1, 0x44eb, 0x4253, 0x4233, 0x4203, 0xbfcd, 0x427a, 0x18a6, 0x4011, 0x29a1, 0x40cc, 0x448c, 0x1d4f, 0x0d2b, 0xb2dc, 0x4026, 0x12ff, 0x434c, 0x06a7, 0x415f, 0x41e4, 0x1842, 0xbf3a, 0xba5a, 0x4082, 0x43d2, 0x42a7, 0xa3c3, 0x41f5, 0x4341, 0x35dd, 0x425e, 0xb2c6, 0x4396, 0x420d, 0xb298, 0xbfd0, 0xa02a, 0x060e, 0x009f, 0x0988, 0x22b2, 0x4168, 0xbfbd, 0x437e, 0x38d0, 0x08f1, 0x41eb, 0x41c6, 0x21e9, 0x40d5, 0x1495, 0x436d, 0x41a6, 0x43f7, 0x21f7, 0xb04a, 0x4349, 0xb2d4, 0x0baa, 0xb034, 0x4087, 0x41f3, 0x40ff, 0xbf48, 0x41e7, 0xa4cb, 0x3b1b, 0xa68b, 0x18b1, 0xbaeb, 0xb045, 0xb231, 0x4194, 0x4425, 0x40f8, 0x1fda, 0xa62a, 0x4302, 0xb2ee, 0x40f9, 0x1bb8, 0x4365, 0x42ff, 0x434d, 0xba42, 0xb2ad, 0xbfb3, 0xba16, 0xb2bd, 0x41df, 0x42c9, 0x4367, 0x0235, 0x34d6, 0x4176, 0x40cb, 0x4295, 0x42b9, 0x0de1, 0x41c8, 0x41be, 0xb2ea, 0x1312, 0x4230, 0x1907, 0xb2f6, 0x4215, 0xba0a, 0xba32, 0x42a1, 0xbf07, 0x397f, 0xbfc0, 0x4206, 0x124e, 0x40cb, 0x440d, 0xb0a0, 0xb27c, 0x3960, 0x411d, 0x4217, 0x463a, 0x3a91, 0x3950, 0x438c, 0x1c16, 0xbfcb, 0xb207, 0x435b, 0x40ee, 0xbfb0, 0x2ebf, 0x3df7, 0xb21e, 0xba74, 0x1b05, 0x46fb, 0x428d, 0x43c1, 0x4196, 0x4379, 0x4239, 0x19e7, 0x411d, 0xbfd2, 0x3b6c, 0x42a7, 0x1ab9, 0xbafe, 0x40f8, 0x0e6a, 0x4422, 0xba1f, 0xbfa5, 0xba17, 0x43cb, 0x3d92, 0x43f7, 0x18a0, 0xbf21, 0x2196, 0x1fb2, 0x2491, 0x402b, 0xbf6a, 0x244e, 0x43b9, 0x03b7, 0x4228, 0x40e1, 0x42e3, 0x4353, 0x00d9, 0x41a9, 0xbac9, 0xbf74, 0x1b6a, 0x4381, 0x412b, 0x43d6, 0xbf26, 0x4194, 0x19f9, 0xb28a, 0x4000, 0xba61, 0x41a6, 0x1f6d, 0x19da, 0xb211, 0xbfa5, 0x1bf6, 0x4070, 0x1f03, 0xb275, 0x413d, 0x40f0, 0x45c8, 0x4036, 0x1844, 0x400a, 0x408b, 0x1cf3, 0xb2f6, 0x4302, 0xbf23, 0x16bb, 0x40c6, 0xba47, 0xba62, 0x42b8, 0xb24d, 0x4088, 0xba35, 0x43f5, 0xbade, 0x434f, 0x1ae1, 0x1df1, 0xb2da, 0xbfcc, 0x42ab, 0x1ece, 0x4252, 0x1e4c, 0x3aed, 0x4175, 0xb2c9, 0x422d, 0x4306, 0x3dd4, 0x4247, 0x413f, 0x3a6f, 0xb0c0, 0xb052, 0x41eb, 0xb222, 0xb05d, 0xbf16, 0x4332, 0x4142, 0xb29f, 0xb26d, 0x43b0, 0x2c2f, 0xa515, 0x43e4, 0x3d7a, 0xbf80, 0x2e76, 0x45e0, 0x1b4e, 0xbfd2, 0x45e2, 0x4033, 0x4305, 0xbf47, 0x1ad6, 0xbff0, 0x150c, 0x3e9a, 0x1ea8, 0x4120, 0x19ce, 0xbf79, 0x43ba, 0xbfe0, 0x3779, 0x42db, 0x39fe, 0xac2d, 0x1c17, 0x43b7, 0x4338, 0x29d6, 0x4069, 0xb0ba, 0xbf90, 0xa22d, 0x423c, 0x1df9, 0x40ba, 0xb24a, 0xbf87, 0x1999, 0xb277, 0x465f, 0x41da, 0xba31, 0xb2b8, 0xba07, 0x1950, 0x2ad8, 0x03a6, 0x4598, 0x1e2e, 0x4291, 0x439e, 0x43b4, 0xb0dd, 0x407d, 0x1859, 0xbf36, 0x196c, 0xb2f4, 0x19c2, 0x426f, 0xb2ed, 0xba27, 0xb209, 0x44e1, 0x2f28, 0x412a, 0x1f41, 0x26d7, 0xba26, 0x2bcb, 0x43ce, 0xbfa0, 0x1ee7, 0x307b, 0x1f27, 0x1438, 0x3bae, 0xb20a, 0x2af0, 0x1747, 0xbf03, 0xb272, 0x42c1, 0x445d, 0x1032, 0x43ac, 0x4048, 0x40c7, 0x43eb, 0x20f9, 0x4167, 0x4257, 0x419d, 0xb254, 0x020a, 0x0824, 0xbf60, 0x1bc9, 0xaa64, 0x4306, 0x41a8, 0x4368, 0x2461, 0x4412, 0x0a06, 0x426b, 0x380f, 0x429d, 0xb2b6, 0xb06a, 0xbf2c, 0x44a2, 0x4216, 0x42c3, 0xb24d, 0x455a, 0x417b, 0x4237, 0x1a76, 0xba20, 0xb08b, 0xba73, 0x178c, 0x144c, 0x1477, 0x3fff, 0xbac6, 0x40c6, 0x416b, 0xb221, 0x2221, 0x14a6, 0x3de1, 0xbf8f, 0x426c, 0xb28f, 0x4094, 0xb21a, 0x371b, 0x4654, 0x46ec, 0xba7f, 0x086c, 0x159f, 0xbaf8, 0x4094, 0xb2d1, 0x412e, 0x4087, 0xb246, 0x4190, 0x4318, 0xb2f2, 0x0736, 0xb269, 0xbf60, 0x4569, 0x466c, 0x4271, 0x4591, 0xbf91, 0x1b68, 0x4287, 0xba47, 0x4338, 0x42c7, 0xb27a, 0x4046, 0x4280, 0xbf77, 0x42e7, 0x456a, 0x117c, 0x4216, 0xbf51, 0x443e, 0x4362, 0x4036, 0x4336, 0x1e6b, 0xb25e, 0x0281, 0x4258, 0x456f, 0x4247, 0xb253, 0x358c, 0x4225, 0xb209, 0x4292, 0x2ac6, 0xb2c5, 0x2643, 0xad8c, 0x432d, 0xba18, 0x4155, 0x2239, 0x2027, 0xb27b, 0x4161, 0xb224, 0x0e38, 0xbf6f, 0x316c, 0xba5f, 0xad65, 0x4059, 0x1cd7, 0x4174, 0x325d, 0x1c2f, 0x41f3, 0xbaeb, 0x4065, 0xbf18, 0x4107, 0xb04b, 0xb2e6, 0x4060, 0x4058, 0x43e0, 0x13fe, 0x3d85, 0x4240, 0xbf58, 0x41ac, 0xbacd, 0xb218, 0x422f, 0xb228, 0x04cc, 0x1ed0, 0x43c1, 0x414a, 0x21dd, 0x1de5, 0x40d8, 0x4174, 0x4607, 0x430e, 0x4303, 0x40fd, 0xbf80, 0xbf96, 0x0173, 0xb21f, 0x44bb, 0xba35, 0x1e73, 0x40cf, 0xb0a8, 0x412d, 0x43ee, 0x42de, 0xb258, 0x411f, 0x4139, 0xb2aa, 0xae46, 0x0246, 0x421c, 0x18d7, 0x4258, 0xba6e, 0xb09e, 0x4024, 0xbaec, 0xba26, 0x41aa, 0x1e8d, 0x2a8c, 0xbf2e, 0x43e9, 0x46a9, 0x42ef, 0x43a1, 0x409c, 0x4176, 0x4133, 0xba70, 0x4649, 0xb0c6, 0x41a3, 0x4285, 0xb2e9, 0x41d2, 0x3f71, 0x403e, 0x4322, 0x4627, 0xbfae, 0xaa92, 0x43c6, 0x42d2, 0xac63, 0x0a31, 0xb258, 0xbfc6, 0x417a, 0xbaf1, 0xba1f, 0x43b8, 0x41fb, 0x4253, 0x1b4b, 0x4419, 0xbf4e, 0x4012, 0xb245, 0x3e4e, 0x44f8, 0x368f, 0x4324, 0x416d, 0x409b, 0x4254, 0xbf80, 0x27fa, 0xa534, 0xbf90, 0x1ab2, 0xb2ec, 0x4335, 0x1eb9, 0xba45, 0x4333, 0xbfb9, 0x1c4d, 0x2c8a, 0x2e8a, 0x423a, 0xb0e3, 0xb21c, 0x422d, 0xbf8e, 0x2e30, 0x42a7, 0xb0bf, 0x43b5, 0x1af2, 0x43c7, 0x1aef, 0x466c, 0xbf13, 0x3802, 0xba0b, 0x4043, 0xb089, 0xba08, 0x4153, 0x1a77, 0xb2fd, 0xa20a, 0x43b8, 0x402e, 0x4031, 0x18ce, 0x400a, 0xbf60, 0x32d5, 0x2169, 0xba6d, 0x41f3, 0x1722, 0x4396, 0xb266, 0x4165, 0xb2ad, 0x402a, 0x40ca, 0xb254, 0xbf15, 0x1b9e, 0x32eb, 0x4148, 0xba7a, 0x3889, 0x1cf3, 0x4117, 0xbad5, 0x40aa, 0x41e2, 0xbf67, 0x30d2, 0x1428, 0x42ab, 0x3d03, 0xa881, 0xbfb0, 0xb2bd, 0x1759, 0x4550, 0x0672, 0x1807, 0x300d, 0x40ad, 0x2e4a, 0xb237, 0x290f, 0xb228, 0x433e, 0x4273, 0x0bf7, 0xb0ac, 0xbaf3, 0xb00c, 0x0408, 0x4009, 0xbf3d, 0x411e, 0x433e, 0x4079, 0x41fb, 0x4375, 0x43b5, 0x4365, 0xb02c, 0x4654, 0x44e5, 0x4271, 0xb216, 0x41c5, 0x42c0, 0x4630, 0x3d54, 0xbfde, 0xba79, 0x1dba, 0xb0b7, 0x402a, 0x4279, 0x4120, 0x1e83, 0x4383, 0x18e9, 0x462c, 0x4178, 0x40a4, 0x4285, 0xb058, 0x1e53, 0xbf27, 0xb025, 0x29c0, 0x40d3, 0xb2e7, 0xba77, 0xbae1, 0x2061, 0x425a, 0x42e6, 0xbf71, 0x4018, 0x4337, 0x4287, 0xbafd, 0x42eb, 0x418e, 0x4177, 0xb01f, 0x4274, 0x1e4b, 0xad9b, 0xb2d2, 0xbad4, 0x40aa, 0x4302, 0x18be, 0x4214, 0x427c, 0x41ed, 0x18e8, 0xbfb5, 0x41ee, 0x41c8, 0x43f5, 0x401a, 0xaacd, 0x402a, 0x0dae, 0xb05e, 0x40af, 0x4019, 0x1c2f, 0x4273, 0x28ca, 0x3e2e, 0x4636, 0xba00, 0x41cf, 0xbfcd, 0x4393, 0x4225, 0x42c6, 0x08dd, 0x4085, 0x41df, 0x43e0, 0x1ef3, 0x2fc5, 0x1893, 0x407c, 0x4263, 0xa557, 0xb0ad, 0xbfbd, 0x2c87, 0xb254, 0xba35, 0x404b, 0x1f02, 0x4128, 0xba23, 0x21ae, 0x04df, 0x4097, 0xb06f, 0x4630, 0xb2d9, 0x4076, 0x4118, 0x34d4, 0x402c, 0x4014, 0x4660, 0x1b57, 0x1ed9, 0x1d79, 0x0656, 0x1a34, 0x3ed4, 0xbfde, 0x1cbc, 0x4318, 0xba0c, 0x4485, 0x3cb7, 0x1be9, 0x411e, 0x0c28, 0x4320, 0x4048, 0xba28, 0xba50, 0xb0ce, 0x43d5, 0x409f, 0x454c, 0xa404, 0x41ce, 0xbf25, 0x402a, 0x4621, 0x4193, 0x41d2, 0x4770, 0xe7fe + ], + StartRegs = [0xc53d8d03, 0xff04be91, 0xd7eb41e1, 0xf292368c, 0xc17640e7, 0x57b5fdc3, 0x3ca7f7e5, 0x438f9293, 0xbf87ea5c, 0x7ed4e28f, 0xf51a6864, 0x539c9c7c, 0x62d8cca2, 0xc0701359, 0x00000000, 0x700001f0 + ], + FinalRegs = [0xfffffcff, 0x000017f4, 0x00000000, 0x00000800, 0x000017f4, 0x00000003, 0xf2cf7fff, 0xffffe718, 0xc0464ce0, 0x0d53d3ba, 0xf51a6864, 0x000012ba, 0xf51a6b68, 0xdf4f4290, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x2af4, 0x4229, 0x413f, 0xb264, 0x4327, 0x4106, 0x402a, 0xb0a1, 0x45b0, 0xb2fa, 0x1ebf, 0x441e, 0x43f6, 0xbf8f, 0x4628, 0x3760, 0x4360, 0x42af, 0x4179, 0xbf1f, 0x41d3, 0x1991, 0x4181, 0xb293, 0x4235, 0x1f56, 0x4650, 0xaf8a, 0xadfe, 0xb20e, 0x1abd, 0xba65, 0x4210, 0xb2ea, 0xa27b, 0xbafe, 0xbf00, 0x41ca, 0x1a78, 0x1668, 0xb2a2, 0xb061, 0x400f, 0x43a0, 0xbf58, 0x41af, 0x413f, 0x183a, 0x1e39, 0xbf15, 0x41e3, 0x4322, 0x41ed, 0xb0d3, 0x37ae, 0x120e, 0xb229, 0x417e, 0xb2dd, 0x4181, 0x08cd, 0xb2e2, 0x42b3, 0x43f4, 0x0bb2, 0x40ca, 0x412b, 0xb066, 0xbad4, 0x1c95, 0x4128, 0xa2c0, 0xbfa1, 0x4165, 0x40a1, 0xb2fa, 0x4054, 0x439d, 0xb29b, 0xb219, 0xb0b8, 0xbae4, 0x10ce, 0x43c6, 0xba78, 0x4163, 0xb2b7, 0x4151, 0x416f, 0x4323, 0xb205, 0x4443, 0x421b, 0x4378, 0x439d, 0x4306, 0x11f7, 0x41ce, 0xb270, 0x4040, 0x3828, 0xbf4a, 0xa7f5, 0x4036, 0xbfb0, 0x46fb, 0x4638, 0x41ce, 0x4018, 0xb2f7, 0x3777, 0x4297, 0x4372, 0x1b90, 0x215f, 0x4096, 0x436b, 0x0217, 0xb26a, 0xb200, 0xa480, 0x4406, 0x2fbe, 0x0701, 0x426c, 0xb2f6, 0x41b3, 0x431f, 0xb2aa, 0x406a, 0xbf3a, 0x427b, 0x064a, 0x1ad3, 0xb265, 0xac12, 0xb0a2, 0x4100, 0xbf7e, 0x1d85, 0x43a1, 0x4009, 0x1338, 0x4315, 0xba41, 0x3f3c, 0x4211, 0x40a4, 0x055d, 0x455a, 0xba61, 0x439e, 0xbf80, 0x43ab, 0x45ed, 0x3ab9, 0xb2e2, 0x3618, 0xbf76, 0x2654, 0x4555, 0xa5a8, 0x4349, 0xaa9c, 0x41c5, 0x4356, 0x3c41, 0x40c2, 0x085c, 0x40a7, 0xbfba, 0xbae7, 0x42b5, 0x42a0, 0x21d7, 0x420f, 0x1a68, 0x41f7, 0xbfa0, 0x43ab, 0xbf9a, 0x41b4, 0x397b, 0xb23b, 0x1b68, 0x4260, 0xb256, 0x432a, 0xb2b4, 0x44c8, 0xb2cc, 0x409c, 0xbff0, 0x416e, 0xbf13, 0x4312, 0xb0bb, 0x342f, 0x43c9, 0x4107, 0x1a19, 0x223f, 0xabb8, 0x43f4, 0xbf83, 0x2d30, 0x4155, 0x424b, 0xb2b6, 0x4296, 0xb21c, 0x3cca, 0x41fd, 0xba12, 0x424c, 0xbf2e, 0xba38, 0xbacd, 0xa7e7, 0x00be, 0x43f9, 0x1a9f, 0x2f15, 0x1eb0, 0x42c1, 0x4576, 0x418c, 0x4203, 0x1428, 0x1b1a, 0xbaff, 0x430a, 0x41d1, 0x42ee, 0x42d1, 0xb0dc, 0x437a, 0xbf6e, 0x4009, 0xb2f8, 0x43e9, 0x4188, 0x3d63, 0x1f9c, 0xa47d, 0xba6a, 0xbadd, 0x45d4, 0xbfb1, 0xb2bf, 0x1fdf, 0x41c9, 0xbf90, 0xba05, 0xb2e1, 0x4012, 0x4353, 0x438d, 0x462c, 0xb019, 0x41c6, 0x4092, 0xb2dd, 0xb21e, 0xba72, 0x2b0f, 0x401e, 0xba33, 0x0636, 0xb213, 0x3216, 0x41a6, 0xbf99, 0x3934, 0x4290, 0xbff0, 0xba7f, 0x0aa5, 0x1b9d, 0x1b5e, 0xba5d, 0xbfd8, 0x39cd, 0x41ea, 0x427e, 0x42ea, 0xb292, 0xb2c5, 0x422d, 0x413d, 0xba0d, 0xafa1, 0x324a, 0xbf26, 0xb243, 0x1cb1, 0x4017, 0x4430, 0x42ce, 0xbf51, 0xb23e, 0xba00, 0xba27, 0x18b7, 0x4084, 0xb0d7, 0xb229, 0x423c, 0x429e, 0xbad8, 0xba28, 0x430c, 0xb070, 0x4091, 0x4191, 0x4038, 0x436d, 0x4285, 0x41de, 0x4037, 0xbfbb, 0x45a5, 0x1c02, 0x2189, 0x0fae, 0xb25d, 0x1d7c, 0x43ef, 0xa694, 0x10c2, 0xbfc8, 0xba12, 0xad26, 0x1501, 0x41c6, 0x4212, 0x197b, 0x4350, 0x403b, 0xbfe0, 0xb29d, 0x4558, 0x4205, 0x439c, 0x444f, 0xb01c, 0x1e76, 0xb2d5, 0x44f9, 0x46d3, 0x4036, 0x41de, 0xba6d, 0x2a32, 0xbf38, 0x4160, 0xbf37, 0xb0ec, 0xba41, 0xb28f, 0x41f1, 0xbf86, 0x2b4a, 0xb209, 0x4338, 0x1eb8, 0xbf04, 0x4336, 0xb210, 0xb0d2, 0x41de, 0xaa40, 0xb00f, 0xb025, 0x424e, 0x4454, 0x43c9, 0x42c6, 0x4158, 0x42e4, 0xbf22, 0x40d0, 0x40b8, 0xb2cf, 0x1b2e, 0xba36, 0xb2df, 0xbf4e, 0xbad7, 0x4172, 0x41ab, 0x46e0, 0x048d, 0x40d0, 0x42d6, 0x4302, 0xbacf, 0x42b1, 0x30ee, 0xb2ce, 0x43e0, 0x3e75, 0x402b, 0x0cb9, 0xba34, 0x0d88, 0xbfce, 0x0bf1, 0x1510, 0x4316, 0x463d, 0x458e, 0x1925, 0xaec3, 0xbf4c, 0x408b, 0xb08c, 0xb268, 0x4283, 0x410e, 0xbfc8, 0x261d, 0x1efb, 0x4309, 0x43ca, 0x4080, 0x423b, 0x4099, 0x4566, 0x4000, 0x10e8, 0xb20e, 0xba40, 0xbad2, 0x21b3, 0x4310, 0x4023, 0x1c67, 0x418e, 0xa05b, 0x4275, 0xb00a, 0xbf7c, 0x1ae8, 0xba49, 0x1039, 0x438d, 0x435f, 0x40ad, 0xb287, 0x282a, 0xaa2d, 0x427f, 0x42c7, 0x4354, 0x435d, 0x41b9, 0xb06f, 0x46e9, 0xba23, 0x40e8, 0x408d, 0x4013, 0xbf0a, 0x435c, 0x2384, 0x4542, 0xa98c, 0xb20b, 0xb27c, 0xbafa, 0x4303, 0x4097, 0x41f9, 0x42ea, 0x407e, 0x3c9a, 0x4097, 0x4359, 0x1e96, 0x0020, 0x3c97, 0xba3c, 0xb2ff, 0x42ca, 0x4471, 0x4076, 0xb250, 0xbf7e, 0xbfd0, 0xb23f, 0x4365, 0x4638, 0x1d42, 0x21a7, 0x1325, 0x4367, 0xb038, 0x4379, 0x4304, 0x4574, 0x410c, 0xbf8e, 0x23da, 0x40ad, 0xb202, 0x42a5, 0x4321, 0x44f4, 0x1a22, 0xba30, 0x40f6, 0x40a1, 0xa786, 0xb0b2, 0x414a, 0x43cd, 0x42ef, 0x034a, 0xbf3d, 0x4029, 0x463e, 0x0ac8, 0x43f0, 0x1ac0, 0x401e, 0xbaea, 0x0d5e, 0xbfd3, 0xb2a2, 0x42b9, 0xb2ff, 0x4151, 0x42e3, 0x4083, 0x1864, 0x42f9, 0x19ba, 0xb058, 0x1a60, 0xa486, 0x2355, 0x2060, 0xbf0b, 0x42bd, 0x418e, 0x1ceb, 0x4290, 0x1f52, 0x1c67, 0xa739, 0x437c, 0x189e, 0x43e6, 0xbf0f, 0x415d, 0xb208, 0xb267, 0xa399, 0x411f, 0x1954, 0x346b, 0x19f7, 0x43e8, 0x433b, 0x3630, 0xba34, 0xbad2, 0xbf2c, 0xb291, 0x42b5, 0x4102, 0x1bbe, 0x4033, 0x4632, 0x1ffe, 0x436a, 0x4364, 0xbaf1, 0xbf94, 0xb289, 0xb0fc, 0x432a, 0x1ced, 0xba74, 0x2483, 0xbf5b, 0x426c, 0xb207, 0x41d8, 0x4157, 0x42e7, 0x42df, 0xb26e, 0x13cd, 0x4120, 0x1d31, 0xa70b, 0xbff0, 0xb03f, 0xb272, 0x4388, 0x370d, 0x1d74, 0x1ce9, 0x40ee, 0x403b, 0x1c1b, 0xbac0, 0x1007, 0x4008, 0x1996, 0xbf32, 0x1b8b, 0x23d1, 0x4556, 0x1cac, 0xa867, 0x3b4b, 0xb22c, 0x4419, 0xba1d, 0x4384, 0x4038, 0xba49, 0x4173, 0x3e55, 0xba7a, 0x4041, 0x421a, 0x4475, 0x409a, 0xbfd0, 0xb023, 0xb2be, 0xb2b7, 0x46ad, 0x4027, 0xa0cf, 0xbfe1, 0x3b58, 0x4156, 0xb213, 0x4388, 0x4443, 0xb21a, 0x42a6, 0xb2bd, 0xbace, 0x415c, 0x19b0, 0xbf97, 0x0d21, 0x1f02, 0x4133, 0x0a3b, 0xb027, 0x39b7, 0x429d, 0xb2b5, 0x4243, 0x00bf, 0x42a1, 0x45eb, 0xbf99, 0x4124, 0x2790, 0x4250, 0xbae9, 0x1d8c, 0x041e, 0x4222, 0x4243, 0x421a, 0x41e6, 0x1efc, 0x4611, 0xbfd6, 0x1e2d, 0x41a8, 0x4220, 0x42ee, 0x40ae, 0xba77, 0x4177, 0xae2a, 0x4190, 0x43f0, 0x1dc7, 0xb036, 0x464f, 0x4654, 0x4100, 0xbad3, 0x420e, 0x2f13, 0x42c7, 0xb00b, 0x4387, 0x12cc, 0x406e, 0x419b, 0x420e, 0x1e6c, 0x2d42, 0xb24d, 0xbf11, 0x421e, 0x43a3, 0x18d2, 0x3178, 0x4093, 0x42cd, 0x1c0a, 0x4173, 0x1821, 0x1c38, 0x43d8, 0x44e5, 0x4239, 0x13f2, 0xbf11, 0x42df, 0xba20, 0x4020, 0x4190, 0x40d4, 0x438a, 0x403e, 0xb22b, 0x400a, 0x2101, 0x223e, 0x0d56, 0xbf9b, 0x4328, 0xb276, 0xb09a, 0xb229, 0x1c8c, 0x09ad, 0x1cc6, 0x0e1f, 0x43f6, 0x411c, 0x41b2, 0x265b, 0xba5c, 0x0f83, 0x41be, 0x2897, 0xba67, 0x40eb, 0x413c, 0x1c6c, 0x4010, 0x1829, 0x43ce, 0x4292, 0xbf06, 0x4156, 0x43d6, 0x431b, 0xb2e6, 0x4167, 0x0318, 0xbfe0, 0x4224, 0x13e7, 0x4165, 0x4402, 0x41be, 0xa3ad, 0xb22e, 0xba0d, 0x1fae, 0xaf2b, 0x13bb, 0xb299, 0x422d, 0x4113, 0x3fef, 0x41ea, 0x1ebd, 0x12b6, 0x1b80, 0xbf4e, 0xb2f6, 0x33be, 0x4075, 0xbf35, 0xb24b, 0x42fc, 0x4039, 0x18d0, 0x2d6f, 0x1e21, 0x1cd0, 0xba62, 0xab70, 0xa93f, 0xba33, 0xbf92, 0xb23f, 0x41fc, 0x176e, 0x436f, 0x4246, 0x4119, 0x445f, 0xba22, 0xbf60, 0x4075, 0x45da, 0xbf70, 0x4011, 0xb29b, 0x1d67, 0x413f, 0x0a8d, 0x464c, 0xac75, 0x432d, 0xa2cf, 0x0872, 0x18ae, 0x4315, 0xbf66, 0xb249, 0xba19, 0x4074, 0xa674, 0x4009, 0xbf90, 0x4373, 0x4072, 0x1f85, 0x1968, 0x3a9a, 0x1e06, 0x44cd, 0x4152, 0x433c, 0xba71, 0x1835, 0x40bf, 0xbf80, 0x4150, 0xbf05, 0xb241, 0xba5b, 0x41a7, 0x4445, 0x4232, 0xb2c9, 0x418b, 0xb20c, 0x436c, 0x46b9, 0xba16, 0x411b, 0x40d0, 0x1af2, 0xb06c, 0xbf3f, 0x429d, 0x4296, 0xac36, 0x40b1, 0x19f1, 0x1a06, 0x131c, 0x403f, 0x19e2, 0xa234, 0xbf62, 0xba62, 0x2ad5, 0x1b63, 0x4048, 0xb00f, 0xb265, 0xb03b, 0xb2da, 0x17c2, 0xb0c6, 0x1c3e, 0x41c4, 0x42af, 0xbfae, 0x2515, 0xb2e3, 0x42f6, 0x4065, 0x21bc, 0x2a1c, 0x2d3e, 0x43ba, 0x40e0, 0x435e, 0xb24d, 0x0e36, 0x406f, 0x404b, 0x1c48, 0xbf97, 0xbf70, 0x4153, 0xb20f, 0xb25e, 0x43c9, 0x4226, 0x40dd, 0x405c, 0x43cb, 0x0d09, 0x19fa, 0x1d04, 0x430c, 0x4029, 0xb2fa, 0xbf1f, 0x0aa8, 0xb223, 0xb2ca, 0x413f, 0x1b91, 0x36e0, 0x19dc, 0x005f, 0x1420, 0x40fc, 0x439f, 0xbfb3, 0x0279, 0x1824, 0x1879, 0xa189, 0xba14, 0x33bb, 0x4266, 0x0602, 0x41c4, 0xba73, 0x40eb, 0x419b, 0xbfc3, 0x4179, 0x183d, 0x4339, 0x41bb, 0xa7fd, 0xb257, 0x42bf, 0x4551, 0x425d, 0xba0a, 0x1e0f, 0x200a, 0x4204, 0x42ca, 0xa1de, 0x0124, 0x4282, 0x1d1d, 0x411c, 0x18bd, 0x406d, 0xba1f, 0xbad9, 0x0714, 0x421f, 0xbf5f, 0x409f, 0x4317, 0x419c, 0xba34, 0x40e1, 0x1b14, 0xbf21, 0x38e6, 0x1016, 0x4387, 0x42c9, 0x10ca, 0x101a, 0x43e1, 0xb2a6, 0x1c7d, 0x4318, 0xbf49, 0x4573, 0x1e86, 0xb256, 0x40df, 0x43fb, 0xbfd3, 0xa2c5, 0x4175, 0xb22e, 0x18cb, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xff38a7fb, 0x4577c13c, 0xbafd4bd9, 0x608edce2, 0x0b12ce77, 0xdd0d292c, 0xd713d1ca, 0x0199fdd1, 0xee4843e5, 0x33f7a879, 0xf40bded8, 0x113e3e39, 0xfa00e8ce, 0xeb295429, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0xffffffbe, 0x3ffeffff, 0x00001ae0, 0x3ffefffe, 0xc0010000, 0x000000dc, 0xffffffff, 0x00000000, 0xfa00e8ce, 0x5b129380, 0xf40bded8, 0xf40bded8, 0xfa00e8ce, 0x9b2a428a, 0x00000000, 0xa00001d0 }, + Instructions = [0x2af4, 0x4229, 0x413f, 0xb264, 0x4327, 0x4106, 0x402a, 0xb0a1, 0x45b0, 0xb2fa, 0x1ebf, 0x441e, 0x43f6, 0xbf8f, 0x4628, 0x3760, 0x4360, 0x42af, 0x4179, 0xbf1f, 0x41d3, 0x1991, 0x4181, 0xb293, 0x4235, 0x1f56, 0x4650, 0xaf8a, 0xadfe, 0xb20e, 0x1abd, 0xba65, 0x4210, 0xb2ea, 0xa27b, 0xbafe, 0xbf00, 0x41ca, 0x1a78, 0x1668, 0xb2a2, 0xb061, 0x400f, 0x43a0, 0xbf58, 0x41af, 0x413f, 0x183a, 0x1e39, 0xbf15, 0x41e3, 0x4322, 0x41ed, 0xb0d3, 0x37ae, 0x120e, 0xb229, 0x417e, 0xb2dd, 0x4181, 0x08cd, 0xb2e2, 0x42b3, 0x43f4, 0x0bb2, 0x40ca, 0x412b, 0xb066, 0xbad4, 0x1c95, 0x4128, 0xa2c0, 0xbfa1, 0x4165, 0x40a1, 0xb2fa, 0x4054, 0x439d, 0xb29b, 0xb219, 0xb0b8, 0xbae4, 0x10ce, 0x43c6, 0xba78, 0x4163, 0xb2b7, 0x4151, 0x416f, 0x4323, 0xb205, 0x4443, 0x421b, 0x4378, 0x439d, 0x4306, 0x11f7, 0x41ce, 0xb270, 0x4040, 0x3828, 0xbf4a, 0xa7f5, 0x4036, 0xbfb0, 0x46fb, 0x4638, 0x41ce, 0x4018, 0xb2f7, 0x3777, 0x4297, 0x4372, 0x1b90, 0x215f, 0x4096, 0x436b, 0x0217, 0xb26a, 0xb200, 0xa480, 0x4406, 0x2fbe, 0x0701, 0x426c, 0xb2f6, 0x41b3, 0x431f, 0xb2aa, 0x406a, 0xbf3a, 0x427b, 0x064a, 0x1ad3, 0xb265, 0xac12, 0xb0a2, 0x4100, 0xbf7e, 0x1d85, 0x43a1, 0x4009, 0x1338, 0x4315, 0xba41, 0x3f3c, 0x4211, 0x40a4, 0x055d, 0x455a, 0xba61, 0x439e, 0xbf80, 0x43ab, 0x45ed, 0x3ab9, 0xb2e2, 0x3618, 0xbf76, 0x2654, 0x4555, 0xa5a8, 0x4349, 0xaa9c, 0x41c5, 0x4356, 0x3c41, 0x40c2, 0x085c, 0x40a7, 0xbfba, 0xbae7, 0x42b5, 0x42a0, 0x21d7, 0x420f, 0x1a68, 0x41f7, 0xbfa0, 0x43ab, 0xbf9a, 0x41b4, 0x397b, 0xb23b, 0x1b68, 0x4260, 0xb256, 0x432a, 0xb2b4, 0x44c8, 0xb2cc, 0x409c, 0xbff0, 0x416e, 0xbf13, 0x4312, 0xb0bb, 0x342f, 0x43c9, 0x4107, 0x1a19, 0x223f, 0xabb8, 0x43f4, 0xbf83, 0x2d30, 0x4155, 0x424b, 0xb2b6, 0x4296, 0xb21c, 0x3cca, 0x41fd, 0xba12, 0x424c, 0xbf2e, 0xba38, 0xbacd, 0xa7e7, 0x00be, 0x43f9, 0x1a9f, 0x2f15, 0x1eb0, 0x42c1, 0x4576, 0x418c, 0x4203, 0x1428, 0x1b1a, 0xbaff, 0x430a, 0x41d1, 0x42ee, 0x42d1, 0xb0dc, 0x437a, 0xbf6e, 0x4009, 0xb2f8, 0x43e9, 0x4188, 0x3d63, 0x1f9c, 0xa47d, 0xba6a, 0xbadd, 0x45d4, 0xbfb1, 0xb2bf, 0x1fdf, 0x41c9, 0xbf90, 0xba05, 0xb2e1, 0x4012, 0x4353, 0x438d, 0x462c, 0xb019, 0x41c6, 0x4092, 0xb2dd, 0xb21e, 0xba72, 0x2b0f, 0x401e, 0xba33, 0x0636, 0xb213, 0x3216, 0x41a6, 0xbf99, 0x3934, 0x4290, 0xbff0, 0xba7f, 0x0aa5, 0x1b9d, 0x1b5e, 0xba5d, 0xbfd8, 0x39cd, 0x41ea, 0x427e, 0x42ea, 0xb292, 0xb2c5, 0x422d, 0x413d, 0xba0d, 0xafa1, 0x324a, 0xbf26, 0xb243, 0x1cb1, 0x4017, 0x4430, 0x42ce, 0xbf51, 0xb23e, 0xba00, 0xba27, 0x18b7, 0x4084, 0xb0d7, 0xb229, 0x423c, 0x429e, 0xbad8, 0xba28, 0x430c, 0xb070, 0x4091, 0x4191, 0x4038, 0x436d, 0x4285, 0x41de, 0x4037, 0xbfbb, 0x45a5, 0x1c02, 0x2189, 0x0fae, 0xb25d, 0x1d7c, 0x43ef, 0xa694, 0x10c2, 0xbfc8, 0xba12, 0xad26, 0x1501, 0x41c6, 0x4212, 0x197b, 0x4350, 0x403b, 0xbfe0, 0xb29d, 0x4558, 0x4205, 0x439c, 0x444f, 0xb01c, 0x1e76, 0xb2d5, 0x44f9, 0x46d3, 0x4036, 0x41de, 0xba6d, 0x2a32, 0xbf38, 0x4160, 0xbf37, 0xb0ec, 0xba41, 0xb28f, 0x41f1, 0xbf86, 0x2b4a, 0xb209, 0x4338, 0x1eb8, 0xbf04, 0x4336, 0xb210, 0xb0d2, 0x41de, 0xaa40, 0xb00f, 0xb025, 0x424e, 0x4454, 0x43c9, 0x42c6, 0x4158, 0x42e4, 0xbf22, 0x40d0, 0x40b8, 0xb2cf, 0x1b2e, 0xba36, 0xb2df, 0xbf4e, 0xbad7, 0x4172, 0x41ab, 0x46e0, 0x048d, 0x40d0, 0x42d6, 0x4302, 0xbacf, 0x42b1, 0x30ee, 0xb2ce, 0x43e0, 0x3e75, 0x402b, 0x0cb9, 0xba34, 0x0d88, 0xbfce, 0x0bf1, 0x1510, 0x4316, 0x463d, 0x458e, 0x1925, 0xaec3, 0xbf4c, 0x408b, 0xb08c, 0xb268, 0x4283, 0x410e, 0xbfc8, 0x261d, 0x1efb, 0x4309, 0x43ca, 0x4080, 0x423b, 0x4099, 0x4566, 0x4000, 0x10e8, 0xb20e, 0xba40, 0xbad2, 0x21b3, 0x4310, 0x4023, 0x1c67, 0x418e, 0xa05b, 0x4275, 0xb00a, 0xbf7c, 0x1ae8, 0xba49, 0x1039, 0x438d, 0x435f, 0x40ad, 0xb287, 0x282a, 0xaa2d, 0x427f, 0x42c7, 0x4354, 0x435d, 0x41b9, 0xb06f, 0x46e9, 0xba23, 0x40e8, 0x408d, 0x4013, 0xbf0a, 0x435c, 0x2384, 0x4542, 0xa98c, 0xb20b, 0xb27c, 0xbafa, 0x4303, 0x4097, 0x41f9, 0x42ea, 0x407e, 0x3c9a, 0x4097, 0x4359, 0x1e96, 0x0020, 0x3c97, 0xba3c, 0xb2ff, 0x42ca, 0x4471, 0x4076, 0xb250, 0xbf7e, 0xbfd0, 0xb23f, 0x4365, 0x4638, 0x1d42, 0x21a7, 0x1325, 0x4367, 0xb038, 0x4379, 0x4304, 0x4574, 0x410c, 0xbf8e, 0x23da, 0x40ad, 0xb202, 0x42a5, 0x4321, 0x44f4, 0x1a22, 0xba30, 0x40f6, 0x40a1, 0xa786, 0xb0b2, 0x414a, 0x43cd, 0x42ef, 0x034a, 0xbf3d, 0x4029, 0x463e, 0x0ac8, 0x43f0, 0x1ac0, 0x401e, 0xbaea, 0x0d5e, 0xbfd3, 0xb2a2, 0x42b9, 0xb2ff, 0x4151, 0x42e3, 0x4083, 0x1864, 0x42f9, 0x19ba, 0xb058, 0x1a60, 0xa486, 0x2355, 0x2060, 0xbf0b, 0x42bd, 0x418e, 0x1ceb, 0x4290, 0x1f52, 0x1c67, 0xa739, 0x437c, 0x189e, 0x43e6, 0xbf0f, 0x415d, 0xb208, 0xb267, 0xa399, 0x411f, 0x1954, 0x346b, 0x19f7, 0x43e8, 0x433b, 0x3630, 0xba34, 0xbad2, 0xbf2c, 0xb291, 0x42b5, 0x4102, 0x1bbe, 0x4033, 0x4632, 0x1ffe, 0x436a, 0x4364, 0xbaf1, 0xbf94, 0xb289, 0xb0fc, 0x432a, 0x1ced, 0xba74, 0x2483, 0xbf5b, 0x426c, 0xb207, 0x41d8, 0x4157, 0x42e7, 0x42df, 0xb26e, 0x13cd, 0x4120, 0x1d31, 0xa70b, 0xbff0, 0xb03f, 0xb272, 0x4388, 0x370d, 0x1d74, 0x1ce9, 0x40ee, 0x403b, 0x1c1b, 0xbac0, 0x1007, 0x4008, 0x1996, 0xbf32, 0x1b8b, 0x23d1, 0x4556, 0x1cac, 0xa867, 0x3b4b, 0xb22c, 0x4419, 0xba1d, 0x4384, 0x4038, 0xba49, 0x4173, 0x3e55, 0xba7a, 0x4041, 0x421a, 0x4475, 0x409a, 0xbfd0, 0xb023, 0xb2be, 0xb2b7, 0x46ad, 0x4027, 0xa0cf, 0xbfe1, 0x3b58, 0x4156, 0xb213, 0x4388, 0x4443, 0xb21a, 0x42a6, 0xb2bd, 0xbace, 0x415c, 0x19b0, 0xbf97, 0x0d21, 0x1f02, 0x4133, 0x0a3b, 0xb027, 0x39b7, 0x429d, 0xb2b5, 0x4243, 0x00bf, 0x42a1, 0x45eb, 0xbf99, 0x4124, 0x2790, 0x4250, 0xbae9, 0x1d8c, 0x041e, 0x4222, 0x4243, 0x421a, 0x41e6, 0x1efc, 0x4611, 0xbfd6, 0x1e2d, 0x41a8, 0x4220, 0x42ee, 0x40ae, 0xba77, 0x4177, 0xae2a, 0x4190, 0x43f0, 0x1dc7, 0xb036, 0x464f, 0x4654, 0x4100, 0xbad3, 0x420e, 0x2f13, 0x42c7, 0xb00b, 0x4387, 0x12cc, 0x406e, 0x419b, 0x420e, 0x1e6c, 0x2d42, 0xb24d, 0xbf11, 0x421e, 0x43a3, 0x18d2, 0x3178, 0x4093, 0x42cd, 0x1c0a, 0x4173, 0x1821, 0x1c38, 0x43d8, 0x44e5, 0x4239, 0x13f2, 0xbf11, 0x42df, 0xba20, 0x4020, 0x4190, 0x40d4, 0x438a, 0x403e, 0xb22b, 0x400a, 0x2101, 0x223e, 0x0d56, 0xbf9b, 0x4328, 0xb276, 0xb09a, 0xb229, 0x1c8c, 0x09ad, 0x1cc6, 0x0e1f, 0x43f6, 0x411c, 0x41b2, 0x265b, 0xba5c, 0x0f83, 0x41be, 0x2897, 0xba67, 0x40eb, 0x413c, 0x1c6c, 0x4010, 0x1829, 0x43ce, 0x4292, 0xbf06, 0x4156, 0x43d6, 0x431b, 0xb2e6, 0x4167, 0x0318, 0xbfe0, 0x4224, 0x13e7, 0x4165, 0x4402, 0x41be, 0xa3ad, 0xb22e, 0xba0d, 0x1fae, 0xaf2b, 0x13bb, 0xb299, 0x422d, 0x4113, 0x3fef, 0x41ea, 0x1ebd, 0x12b6, 0x1b80, 0xbf4e, 0xb2f6, 0x33be, 0x4075, 0xbf35, 0xb24b, 0x42fc, 0x4039, 0x18d0, 0x2d6f, 0x1e21, 0x1cd0, 0xba62, 0xab70, 0xa93f, 0xba33, 0xbf92, 0xb23f, 0x41fc, 0x176e, 0x436f, 0x4246, 0x4119, 0x445f, 0xba22, 0xbf60, 0x4075, 0x45da, 0xbf70, 0x4011, 0xb29b, 0x1d67, 0x413f, 0x0a8d, 0x464c, 0xac75, 0x432d, 0xa2cf, 0x0872, 0x18ae, 0x4315, 0xbf66, 0xb249, 0xba19, 0x4074, 0xa674, 0x4009, 0xbf90, 0x4373, 0x4072, 0x1f85, 0x1968, 0x3a9a, 0x1e06, 0x44cd, 0x4152, 0x433c, 0xba71, 0x1835, 0x40bf, 0xbf80, 0x4150, 0xbf05, 0xb241, 0xba5b, 0x41a7, 0x4445, 0x4232, 0xb2c9, 0x418b, 0xb20c, 0x436c, 0x46b9, 0xba16, 0x411b, 0x40d0, 0x1af2, 0xb06c, 0xbf3f, 0x429d, 0x4296, 0xac36, 0x40b1, 0x19f1, 0x1a06, 0x131c, 0x403f, 0x19e2, 0xa234, 0xbf62, 0xba62, 0x2ad5, 0x1b63, 0x4048, 0xb00f, 0xb265, 0xb03b, 0xb2da, 0x17c2, 0xb0c6, 0x1c3e, 0x41c4, 0x42af, 0xbfae, 0x2515, 0xb2e3, 0x42f6, 0x4065, 0x21bc, 0x2a1c, 0x2d3e, 0x43ba, 0x40e0, 0x435e, 0xb24d, 0x0e36, 0x406f, 0x404b, 0x1c48, 0xbf97, 0xbf70, 0x4153, 0xb20f, 0xb25e, 0x43c9, 0x4226, 0x40dd, 0x405c, 0x43cb, 0x0d09, 0x19fa, 0x1d04, 0x430c, 0x4029, 0xb2fa, 0xbf1f, 0x0aa8, 0xb223, 0xb2ca, 0x413f, 0x1b91, 0x36e0, 0x19dc, 0x005f, 0x1420, 0x40fc, 0x439f, 0xbfb3, 0x0279, 0x1824, 0x1879, 0xa189, 0xba14, 0x33bb, 0x4266, 0x0602, 0x41c4, 0xba73, 0x40eb, 0x419b, 0xbfc3, 0x4179, 0x183d, 0x4339, 0x41bb, 0xa7fd, 0xb257, 0x42bf, 0x4551, 0x425d, 0xba0a, 0x1e0f, 0x200a, 0x4204, 0x42ca, 0xa1de, 0x0124, 0x4282, 0x1d1d, 0x411c, 0x18bd, 0x406d, 0xba1f, 0xbad9, 0x0714, 0x421f, 0xbf5f, 0x409f, 0x4317, 0x419c, 0xba34, 0x40e1, 0x1b14, 0xbf21, 0x38e6, 0x1016, 0x4387, 0x42c9, 0x10ca, 0x101a, 0x43e1, 0xb2a6, 0x1c7d, 0x4318, 0xbf49, 0x4573, 0x1e86, 0xb256, 0x40df, 0x43fb, 0xbfd3, 0xa2c5, 0x4175, 0xb22e, 0x18cb, 0x4770, 0xe7fe + ], + StartRegs = [0xff38a7fb, 0x4577c13c, 0xbafd4bd9, 0x608edce2, 0x0b12ce77, 0xdd0d292c, 0xd713d1ca, 0x0199fdd1, 0xee4843e5, 0x33f7a879, 0xf40bded8, 0x113e3e39, 0xfa00e8ce, 0xeb295429, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0xffffffbe, 0x3ffeffff, 0x00001ae0, 0x3ffefffe, 0xc0010000, 0x000000dc, 0xffffffff, 0x00000000, 0xfa00e8ce, 0x5b129380, 0xf40bded8, 0xf40bded8, 0xfa00e8ce, 0x9b2a428a, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0xbae5, 0xb227, 0x44d8, 0x43d3, 0x41d7, 0x40a2, 0x41d7, 0x42f3, 0x42eb, 0xb065, 0x42f8, 0xbfd8, 0x1e0b, 0x4085, 0x4121, 0x4130, 0xbf3d, 0x4042, 0x43f3, 0xa770, 0x4317, 0xb214, 0x4005, 0x2688, 0xb26b, 0x4044, 0x41b2, 0x2c6e, 0x1b18, 0x1d98, 0x1f7c, 0xb0fc, 0x427e, 0xbfa4, 0x0b8c, 0xb2a3, 0x1991, 0x3cc3, 0xa055, 0x1bcb, 0x42a4, 0xaa13, 0xbf8c, 0x400e, 0x1fcd, 0x420e, 0x437f, 0xb009, 0x44e0, 0x40d3, 0x45ad, 0x4242, 0x435b, 0x24d1, 0xa139, 0x3049, 0xba6c, 0x1689, 0x2538, 0x009e, 0x12e4, 0x4226, 0x1db2, 0xa704, 0x41ff, 0xb252, 0xbf25, 0xb201, 0x45a3, 0xb2f1, 0xb06a, 0x10c5, 0x24cf, 0x42ed, 0x4420, 0x40d0, 0xb29b, 0xbf0a, 0x2ff2, 0x46d3, 0xba69, 0x44da, 0x0515, 0xba24, 0xb263, 0x1e73, 0x43ce, 0x4269, 0xbfb0, 0x4322, 0x41e8, 0xb229, 0x1d20, 0x46aa, 0xb2c3, 0x4613, 0x41d9, 0x0ac4, 0x4352, 0x4031, 0x40dd, 0xa769, 0xb008, 0xb09e, 0x29dd, 0xbf87, 0x437b, 0x0284, 0x4337, 0x4224, 0x417f, 0x3e53, 0x44a4, 0x400d, 0x1cf0, 0x4388, 0xbaf0, 0x4181, 0x4399, 0x2de9, 0x1200, 0xbf97, 0x4200, 0x41ea, 0xb0e3, 0x40f6, 0x4436, 0x4077, 0xa2c4, 0xbf6c, 0x1095, 0x1f06, 0x05cd, 0xb2e0, 0x40a7, 0xb0e6, 0x4090, 0xa9ac, 0x1fff, 0x4303, 0xb08d, 0xbad3, 0x413b, 0xbf2a, 0xbae2, 0xbfd0, 0x41d7, 0x437e, 0x42f2, 0xa025, 0x42d1, 0x3ebf, 0x1acc, 0xb28a, 0xa56f, 0x407b, 0x1ffc, 0x4124, 0x400b, 0x41fb, 0x1d4e, 0x40a0, 0xba67, 0x4383, 0x4239, 0x418c, 0x43e7, 0xba5c, 0xb03e, 0x4260, 0x404d, 0xbf8d, 0x1f0c, 0x1e74, 0x4132, 0x41ce, 0x4263, 0xb204, 0x1be7, 0x426d, 0x40ca, 0x408d, 0x4298, 0x183a, 0x1b8f, 0x4063, 0xb207, 0xbf7d, 0x4259, 0x2680, 0x44e4, 0x414f, 0x4390, 0x4218, 0x4111, 0x4477, 0xa2f6, 0xaac4, 0x40f7, 0xb24e, 0x026d, 0x1dae, 0x4296, 0x4151, 0xb0b1, 0x439b, 0x4264, 0x0f33, 0x1cee, 0xba12, 0x4026, 0x32d6, 0xbf26, 0xba1d, 0x4310, 0x1da4, 0xbfa5, 0xa234, 0x4551, 0xba63, 0xad72, 0x38dd, 0x421f, 0x418b, 0x4198, 0xba0c, 0xb063, 0xba67, 0xbf00, 0xa1f0, 0x419d, 0x459e, 0x2726, 0x40c7, 0xbad0, 0x4105, 0x1835, 0x4245, 0x4088, 0x411d, 0x0545, 0x42fa, 0x4549, 0xbf68, 0x0932, 0x3b74, 0x27a2, 0xbad1, 0x403e, 0x1edf, 0x125f, 0x4020, 0xba01, 0xb243, 0x40cc, 0x40c3, 0x431a, 0xba6a, 0x1e8f, 0xb297, 0x3805, 0x4385, 0x3068, 0x1ffa, 0x4568, 0x4240, 0x41c8, 0x449d, 0xbfda, 0x423a, 0x1853, 0xb217, 0xa4c3, 0x4260, 0x41e0, 0x405f, 0x4258, 0x4348, 0xb0ad, 0x407e, 0x42e6, 0x1c88, 0xbafc, 0x4112, 0x42f5, 0xba7c, 0xb200, 0xb243, 0x4050, 0xbf8c, 0x409c, 0x16eb, 0x4324, 0xb26a, 0xb0e0, 0xbf11, 0xba41, 0x4276, 0x3fbd, 0xb227, 0x46f9, 0x4096, 0x4115, 0x428f, 0x4341, 0xba68, 0x430d, 0x439c, 0x0258, 0xb0ac, 0x3247, 0xb2fd, 0x18dc, 0x4196, 0x1bc4, 0xbf69, 0x1fc3, 0x17db, 0x4028, 0x426b, 0xb045, 0x3fc7, 0x403b, 0x42b2, 0x4155, 0x4027, 0x4055, 0x4397, 0x40ca, 0xb2e4, 0xbfe0, 0x4067, 0x4213, 0xb019, 0x42f1, 0x18c4, 0xb26e, 0x2a83, 0x40d4, 0x43a9, 0x3df6, 0xb2d0, 0xbfd0, 0x1aa2, 0xbf38, 0x4283, 0x41a3, 0x4261, 0x07ee, 0x406e, 0x4323, 0x24cd, 0x413d, 0xb2d9, 0x4217, 0x41a7, 0x0450, 0x40e0, 0xb0f8, 0xb2cd, 0xbf6f, 0xa598, 0x36ad, 0xbafa, 0x4247, 0x428c, 0x419b, 0x2ddd, 0x2ff4, 0x42a3, 0x420b, 0x0665, 0xb09f, 0x25aa, 0xb222, 0x424b, 0x41d5, 0x084b, 0xbfdc, 0x448c, 0x1ee0, 0x427a, 0x42ec, 0xb24b, 0xb203, 0x4277, 0x40d6, 0x43b7, 0xbfce, 0x40fd, 0xb05a, 0x443e, 0x4319, 0xaf57, 0x4372, 0xbfb3, 0x0ea7, 0x1c4d, 0xa3d4, 0x4445, 0x424c, 0x0597, 0xb2e2, 0x44bb, 0xba22, 0x448a, 0x40b2, 0x0495, 0x1d64, 0x4227, 0xbaf8, 0xb2eb, 0x40e2, 0x350e, 0x38b4, 0x19de, 0x4351, 0x43d9, 0x4078, 0x0edb, 0x42b0, 0xbf08, 0x07cf, 0x41f1, 0xbff0, 0xbad4, 0x45a0, 0xbae6, 0xb001, 0xbad4, 0x430d, 0x425b, 0xbf6d, 0x0b2e, 0xa8b3, 0xb282, 0xbaff, 0xaf30, 0x0047, 0x18af, 0x2845, 0xbf0a, 0xba43, 0xb2e9, 0x445d, 0x42b1, 0x415c, 0x428b, 0x4305, 0x4298, 0x432a, 0x43ed, 0x142c, 0xab21, 0x4167, 0x211c, 0x4346, 0xbf7f, 0xb0a2, 0xb2a2, 0x23cf, 0xb22b, 0x41d2, 0x4187, 0x3931, 0x1ad7, 0x402b, 0x41d2, 0x4128, 0x0ad0, 0x4170, 0x1dac, 0xba34, 0x402d, 0x40e6, 0x41d2, 0x0a0b, 0x45f2, 0xa738, 0xa730, 0x4076, 0xbf74, 0x44f0, 0x2744, 0x1bf9, 0xbafa, 0xb258, 0xb215, 0xbf9f, 0x46b2, 0xb083, 0xb2d0, 0x18ba, 0xba65, 0x43ee, 0xbfdc, 0x0348, 0xb2a8, 0xbf72, 0x4345, 0x1fa2, 0xb08b, 0x433a, 0xbf14, 0xba2d, 0xbacf, 0x400b, 0xbac3, 0x4203, 0x443c, 0x40e6, 0x1f06, 0x43ab, 0xb2c5, 0xba4f, 0x417d, 0x43b4, 0x4044, 0x1f8a, 0x4299, 0xaa10, 0x183b, 0xbfd4, 0x454a, 0x3c00, 0xb2c6, 0x0d40, 0x411f, 0x4292, 0x11dc, 0xb2e2, 0x422f, 0xb2cc, 0x41f2, 0x438b, 0xbac1, 0x423e, 0x4329, 0x4390, 0xb019, 0x40e1, 0x458c, 0x4305, 0x09ce, 0x4666, 0x4459, 0x46dd, 0x0581, 0x4368, 0x34e4, 0xbf5c, 0xb22a, 0x4199, 0x4330, 0x42e2, 0x46ec, 0x3b8e, 0x2edc, 0x4173, 0x4356, 0x41e0, 0x43ab, 0x0b77, 0x4222, 0x1f4c, 0xba39, 0x407d, 0xb298, 0xb26d, 0x4088, 0xb0b2, 0x4055, 0xbf59, 0x4689, 0xb004, 0x4380, 0x406b, 0x19ab, 0x2018, 0x447c, 0xbf1f, 0x41e0, 0xb24f, 0x406b, 0x2d16, 0x05be, 0x4252, 0x008b, 0x1d45, 0x424b, 0x41fe, 0xb282, 0x4089, 0xbf25, 0xb252, 0x430c, 0xba72, 0x42e9, 0x3df2, 0x4351, 0x40af, 0xbf79, 0x4375, 0x1be2, 0x43b9, 0x28e9, 0xbf08, 0xb203, 0x4201, 0x40b3, 0x0265, 0xb060, 0x4236, 0x41dc, 0xbfe0, 0x1d87, 0x41bf, 0x4040, 0xb27e, 0x0ad0, 0x3812, 0x4141, 0x1d57, 0x43fc, 0x1e44, 0xba47, 0xa9bb, 0xbfbc, 0x414d, 0x4386, 0x1cd0, 0x4445, 0x4014, 0xba62, 0x19ed, 0x41d1, 0xbfbf, 0x41bc, 0xb0d9, 0x42b1, 0xb281, 0x3f21, 0xbf65, 0x409f, 0x4051, 0x004b, 0xba2b, 0x463d, 0xaa52, 0xa84c, 0xb0ec, 0x06ee, 0xa560, 0x463c, 0xb007, 0x2991, 0xb22c, 0xbf80, 0x3632, 0xb296, 0x3c62, 0x43cc, 0x120c, 0x42e2, 0x4030, 0xbfd0, 0x43a0, 0x0c17, 0x3416, 0x4624, 0xaae3, 0xbfd2, 0x454e, 0x430d, 0xba74, 0x41b8, 0x37e3, 0x3b51, 0x411f, 0x4200, 0x437a, 0x1e3e, 0x4098, 0xbf4b, 0x19a0, 0x4544, 0xa8a3, 0x41ec, 0xb0de, 0xbf80, 0x3899, 0x0994, 0x1c6c, 0x42d6, 0xba74, 0x43c6, 0xba20, 0x429d, 0x4010, 0x118b, 0x402c, 0xbf62, 0x42b4, 0x4638, 0x4269, 0x2880, 0xb015, 0x36fd, 0x4179, 0x1d14, 0x46da, 0x1a37, 0x21a6, 0xb0b8, 0xb2a7, 0x1f43, 0xba10, 0x1ea2, 0xba07, 0xb09e, 0x28a5, 0x426e, 0x3bc9, 0x41b8, 0x465e, 0x1cfe, 0xbf72, 0x41e6, 0x1bc3, 0xb04a, 0xbae4, 0x43df, 0x4281, 0x2e57, 0x408f, 0xb08e, 0x4069, 0xbfb0, 0x440a, 0xbfb0, 0xb230, 0xb0f2, 0x45b4, 0x402b, 0xb2e8, 0x4207, 0xbac1, 0x4186, 0xba45, 0x43d8, 0x43b2, 0x42cf, 0x41ad, 0x432d, 0xbf66, 0x401f, 0x43f5, 0x44f8, 0x42af, 0xa978, 0x439a, 0xb2fd, 0xb259, 0xb24a, 0x42b1, 0xba6d, 0x398d, 0x4190, 0x43cf, 0xb2a3, 0xba25, 0x26d9, 0x43db, 0xba1f, 0x1d49, 0x197a, 0xb0bc, 0x40ae, 0xa9b4, 0x3109, 0xbf03, 0x4125, 0x31de, 0x459b, 0xb2e0, 0xba14, 0x41bb, 0x437a, 0x425a, 0x1a58, 0x288b, 0x1d8f, 0xb084, 0x4235, 0x4349, 0x1631, 0x4043, 0x2199, 0x075f, 0xb071, 0x0a46, 0xba55, 0x40a5, 0x26e7, 0xbf00, 0x3d20, 0xa8f9, 0x4025, 0x44c4, 0xbf2a, 0x40eb, 0xba2a, 0xba0b, 0x4115, 0x42c2, 0x1d34, 0xba10, 0xba7c, 0x4079, 0x1b5d, 0xba50, 0x4369, 0x3eba, 0x400b, 0xb0b8, 0xbae1, 0x41f2, 0x43ef, 0x42a4, 0x4559, 0x242c, 0xacb2, 0xad93, 0xbf72, 0x4297, 0x42fc, 0x4269, 0x43b5, 0x1e97, 0x40dc, 0x35e6, 0xbacf, 0x1a73, 0x411a, 0xbae3, 0xbf33, 0xb2b2, 0x34a3, 0x425a, 0x405e, 0x3399, 0x21cc, 0x195d, 0x435e, 0x4099, 0xbfa0, 0xae2f, 0x43d9, 0x0109, 0x4025, 0x4155, 0x4462, 0x1602, 0x43bd, 0x4248, 0x4194, 0x434a, 0xabb9, 0xb2c8, 0xbf4d, 0x413d, 0xba58, 0x03e3, 0x40f5, 0x403c, 0x1598, 0x4265, 0x1f54, 0x4188, 0xb0aa, 0x18e2, 0x4223, 0xbfb0, 0x410b, 0x40f5, 0x1ab4, 0x23b7, 0x19ba, 0xbf7f, 0x18fe, 0x199f, 0x4011, 0x410d, 0x27b0, 0x4339, 0x1d01, 0x2979, 0x31af, 0xa4a3, 0x1dfb, 0x401b, 0x40b7, 0x3d6e, 0xb22d, 0xbf64, 0xb040, 0x3846, 0xbfbf, 0xb24b, 0x41fd, 0x2226, 0x43cf, 0x3af2, 0x4365, 0xb003, 0x4333, 0xaa10, 0x1ca0, 0xb0f2, 0xbf9f, 0x1fed, 0xb09e, 0x41b3, 0x468b, 0x40f3, 0x4398, 0x413c, 0x40b8, 0xb017, 0xb226, 0x43f4, 0x4340, 0x41d7, 0x01f2, 0x4374, 0x410a, 0x28e5, 0xb07f, 0x0cf8, 0x40c0, 0x422f, 0xbfdd, 0x4023, 0x085c, 0xb22c, 0x41c8, 0x4433, 0x45c9, 0x43d7, 0x4378, 0xbf06, 0x4570, 0x40e0, 0xb004, 0xb292, 0x449d, 0x1d73, 0xb24e, 0x4347, 0x4071, 0xb2d4, 0x1aed, 0x43ec, 0x1f32, 0x43e5, 0xa386, 0x3bc4, 0x4418, 0x40d4, 0x4031, 0xbfd5, 0x41f7, 0x401c, 0x41cd, 0x2c18, 0xb04b, 0x43da, 0xbafd, 0x41de, 0x4169, 0x406e, 0x43ee, 0x204a, 0xbf41, 0xbaff, 0x42ab, 0xbac3, 0x4691, 0xb269, 0x188e, 0x4277, 0xbf81, 0x43c8, 0xb223, 0x1dfd, 0x2342, 0x12d6, 0xb254, 0x19ce, 0x359d, 0x4343, 0x1cc8, 0x00c8, 0x26e1, 0xa58f, 0xb2c4, 0x4047, 0x3780, 0x4157, 0x3829, 0xbf48, 0x447c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xf96275eb, 0x02fe41e7, 0xeefa2e22, 0x4b46bc43, 0x003dddf6, 0xa6272337, 0xb656ca8c, 0x7ccb9d65, 0xf8d3063c, 0x09bff66f, 0x1d231647, 0xe7c3d8f9, 0x0fbd2fe9, 0x8a2c763d, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0xffffffd7, 0x00000000, 0xffffe71f, 0x000730c0, 0x000017ea, 0x00001a18, 0x000000e1, 0x00000080, 0xf054250c, 0x00000000, 0x1d231647, 0x00000a54, 0x0d773b53, 0x1d23118b, 0x00000000, 0x800001d0 }, + Instructions = [0xbae5, 0xb227, 0x44d8, 0x43d3, 0x41d7, 0x40a2, 0x41d7, 0x42f3, 0x42eb, 0xb065, 0x42f8, 0xbfd8, 0x1e0b, 0x4085, 0x4121, 0x4130, 0xbf3d, 0x4042, 0x43f3, 0xa770, 0x4317, 0xb214, 0x4005, 0x2688, 0xb26b, 0x4044, 0x41b2, 0x2c6e, 0x1b18, 0x1d98, 0x1f7c, 0xb0fc, 0x427e, 0xbfa4, 0x0b8c, 0xb2a3, 0x1991, 0x3cc3, 0xa055, 0x1bcb, 0x42a4, 0xaa13, 0xbf8c, 0x400e, 0x1fcd, 0x420e, 0x437f, 0xb009, 0x44e0, 0x40d3, 0x45ad, 0x4242, 0x435b, 0x24d1, 0xa139, 0x3049, 0xba6c, 0x1689, 0x2538, 0x009e, 0x12e4, 0x4226, 0x1db2, 0xa704, 0x41ff, 0xb252, 0xbf25, 0xb201, 0x45a3, 0xb2f1, 0xb06a, 0x10c5, 0x24cf, 0x42ed, 0x4420, 0x40d0, 0xb29b, 0xbf0a, 0x2ff2, 0x46d3, 0xba69, 0x44da, 0x0515, 0xba24, 0xb263, 0x1e73, 0x43ce, 0x4269, 0xbfb0, 0x4322, 0x41e8, 0xb229, 0x1d20, 0x46aa, 0xb2c3, 0x4613, 0x41d9, 0x0ac4, 0x4352, 0x4031, 0x40dd, 0xa769, 0xb008, 0xb09e, 0x29dd, 0xbf87, 0x437b, 0x0284, 0x4337, 0x4224, 0x417f, 0x3e53, 0x44a4, 0x400d, 0x1cf0, 0x4388, 0xbaf0, 0x4181, 0x4399, 0x2de9, 0x1200, 0xbf97, 0x4200, 0x41ea, 0xb0e3, 0x40f6, 0x4436, 0x4077, 0xa2c4, 0xbf6c, 0x1095, 0x1f06, 0x05cd, 0xb2e0, 0x40a7, 0xb0e6, 0x4090, 0xa9ac, 0x1fff, 0x4303, 0xb08d, 0xbad3, 0x413b, 0xbf2a, 0xbae2, 0xbfd0, 0x41d7, 0x437e, 0x42f2, 0xa025, 0x42d1, 0x3ebf, 0x1acc, 0xb28a, 0xa56f, 0x407b, 0x1ffc, 0x4124, 0x400b, 0x41fb, 0x1d4e, 0x40a0, 0xba67, 0x4383, 0x4239, 0x418c, 0x43e7, 0xba5c, 0xb03e, 0x4260, 0x404d, 0xbf8d, 0x1f0c, 0x1e74, 0x4132, 0x41ce, 0x4263, 0xb204, 0x1be7, 0x426d, 0x40ca, 0x408d, 0x4298, 0x183a, 0x1b8f, 0x4063, 0xb207, 0xbf7d, 0x4259, 0x2680, 0x44e4, 0x414f, 0x4390, 0x4218, 0x4111, 0x4477, 0xa2f6, 0xaac4, 0x40f7, 0xb24e, 0x026d, 0x1dae, 0x4296, 0x4151, 0xb0b1, 0x439b, 0x4264, 0x0f33, 0x1cee, 0xba12, 0x4026, 0x32d6, 0xbf26, 0xba1d, 0x4310, 0x1da4, 0xbfa5, 0xa234, 0x4551, 0xba63, 0xad72, 0x38dd, 0x421f, 0x418b, 0x4198, 0xba0c, 0xb063, 0xba67, 0xbf00, 0xa1f0, 0x419d, 0x459e, 0x2726, 0x40c7, 0xbad0, 0x4105, 0x1835, 0x4245, 0x4088, 0x411d, 0x0545, 0x42fa, 0x4549, 0xbf68, 0x0932, 0x3b74, 0x27a2, 0xbad1, 0x403e, 0x1edf, 0x125f, 0x4020, 0xba01, 0xb243, 0x40cc, 0x40c3, 0x431a, 0xba6a, 0x1e8f, 0xb297, 0x3805, 0x4385, 0x3068, 0x1ffa, 0x4568, 0x4240, 0x41c8, 0x449d, 0xbfda, 0x423a, 0x1853, 0xb217, 0xa4c3, 0x4260, 0x41e0, 0x405f, 0x4258, 0x4348, 0xb0ad, 0x407e, 0x42e6, 0x1c88, 0xbafc, 0x4112, 0x42f5, 0xba7c, 0xb200, 0xb243, 0x4050, 0xbf8c, 0x409c, 0x16eb, 0x4324, 0xb26a, 0xb0e0, 0xbf11, 0xba41, 0x4276, 0x3fbd, 0xb227, 0x46f9, 0x4096, 0x4115, 0x428f, 0x4341, 0xba68, 0x430d, 0x439c, 0x0258, 0xb0ac, 0x3247, 0xb2fd, 0x18dc, 0x4196, 0x1bc4, 0xbf69, 0x1fc3, 0x17db, 0x4028, 0x426b, 0xb045, 0x3fc7, 0x403b, 0x42b2, 0x4155, 0x4027, 0x4055, 0x4397, 0x40ca, 0xb2e4, 0xbfe0, 0x4067, 0x4213, 0xb019, 0x42f1, 0x18c4, 0xb26e, 0x2a83, 0x40d4, 0x43a9, 0x3df6, 0xb2d0, 0xbfd0, 0x1aa2, 0xbf38, 0x4283, 0x41a3, 0x4261, 0x07ee, 0x406e, 0x4323, 0x24cd, 0x413d, 0xb2d9, 0x4217, 0x41a7, 0x0450, 0x40e0, 0xb0f8, 0xb2cd, 0xbf6f, 0xa598, 0x36ad, 0xbafa, 0x4247, 0x428c, 0x419b, 0x2ddd, 0x2ff4, 0x42a3, 0x420b, 0x0665, 0xb09f, 0x25aa, 0xb222, 0x424b, 0x41d5, 0x084b, 0xbfdc, 0x448c, 0x1ee0, 0x427a, 0x42ec, 0xb24b, 0xb203, 0x4277, 0x40d6, 0x43b7, 0xbfce, 0x40fd, 0xb05a, 0x443e, 0x4319, 0xaf57, 0x4372, 0xbfb3, 0x0ea7, 0x1c4d, 0xa3d4, 0x4445, 0x424c, 0x0597, 0xb2e2, 0x44bb, 0xba22, 0x448a, 0x40b2, 0x0495, 0x1d64, 0x4227, 0xbaf8, 0xb2eb, 0x40e2, 0x350e, 0x38b4, 0x19de, 0x4351, 0x43d9, 0x4078, 0x0edb, 0x42b0, 0xbf08, 0x07cf, 0x41f1, 0xbff0, 0xbad4, 0x45a0, 0xbae6, 0xb001, 0xbad4, 0x430d, 0x425b, 0xbf6d, 0x0b2e, 0xa8b3, 0xb282, 0xbaff, 0xaf30, 0x0047, 0x18af, 0x2845, 0xbf0a, 0xba43, 0xb2e9, 0x445d, 0x42b1, 0x415c, 0x428b, 0x4305, 0x4298, 0x432a, 0x43ed, 0x142c, 0xab21, 0x4167, 0x211c, 0x4346, 0xbf7f, 0xb0a2, 0xb2a2, 0x23cf, 0xb22b, 0x41d2, 0x4187, 0x3931, 0x1ad7, 0x402b, 0x41d2, 0x4128, 0x0ad0, 0x4170, 0x1dac, 0xba34, 0x402d, 0x40e6, 0x41d2, 0x0a0b, 0x45f2, 0xa738, 0xa730, 0x4076, 0xbf74, 0x44f0, 0x2744, 0x1bf9, 0xbafa, 0xb258, 0xb215, 0xbf9f, 0x46b2, 0xb083, 0xb2d0, 0x18ba, 0xba65, 0x43ee, 0xbfdc, 0x0348, 0xb2a8, 0xbf72, 0x4345, 0x1fa2, 0xb08b, 0x433a, 0xbf14, 0xba2d, 0xbacf, 0x400b, 0xbac3, 0x4203, 0x443c, 0x40e6, 0x1f06, 0x43ab, 0xb2c5, 0xba4f, 0x417d, 0x43b4, 0x4044, 0x1f8a, 0x4299, 0xaa10, 0x183b, 0xbfd4, 0x454a, 0x3c00, 0xb2c6, 0x0d40, 0x411f, 0x4292, 0x11dc, 0xb2e2, 0x422f, 0xb2cc, 0x41f2, 0x438b, 0xbac1, 0x423e, 0x4329, 0x4390, 0xb019, 0x40e1, 0x458c, 0x4305, 0x09ce, 0x4666, 0x4459, 0x46dd, 0x0581, 0x4368, 0x34e4, 0xbf5c, 0xb22a, 0x4199, 0x4330, 0x42e2, 0x46ec, 0x3b8e, 0x2edc, 0x4173, 0x4356, 0x41e0, 0x43ab, 0x0b77, 0x4222, 0x1f4c, 0xba39, 0x407d, 0xb298, 0xb26d, 0x4088, 0xb0b2, 0x4055, 0xbf59, 0x4689, 0xb004, 0x4380, 0x406b, 0x19ab, 0x2018, 0x447c, 0xbf1f, 0x41e0, 0xb24f, 0x406b, 0x2d16, 0x05be, 0x4252, 0x008b, 0x1d45, 0x424b, 0x41fe, 0xb282, 0x4089, 0xbf25, 0xb252, 0x430c, 0xba72, 0x42e9, 0x3df2, 0x4351, 0x40af, 0xbf79, 0x4375, 0x1be2, 0x43b9, 0x28e9, 0xbf08, 0xb203, 0x4201, 0x40b3, 0x0265, 0xb060, 0x4236, 0x41dc, 0xbfe0, 0x1d87, 0x41bf, 0x4040, 0xb27e, 0x0ad0, 0x3812, 0x4141, 0x1d57, 0x43fc, 0x1e44, 0xba47, 0xa9bb, 0xbfbc, 0x414d, 0x4386, 0x1cd0, 0x4445, 0x4014, 0xba62, 0x19ed, 0x41d1, 0xbfbf, 0x41bc, 0xb0d9, 0x42b1, 0xb281, 0x3f21, 0xbf65, 0x409f, 0x4051, 0x004b, 0xba2b, 0x463d, 0xaa52, 0xa84c, 0xb0ec, 0x06ee, 0xa560, 0x463c, 0xb007, 0x2991, 0xb22c, 0xbf80, 0x3632, 0xb296, 0x3c62, 0x43cc, 0x120c, 0x42e2, 0x4030, 0xbfd0, 0x43a0, 0x0c17, 0x3416, 0x4624, 0xaae3, 0xbfd2, 0x454e, 0x430d, 0xba74, 0x41b8, 0x37e3, 0x3b51, 0x411f, 0x4200, 0x437a, 0x1e3e, 0x4098, 0xbf4b, 0x19a0, 0x4544, 0xa8a3, 0x41ec, 0xb0de, 0xbf80, 0x3899, 0x0994, 0x1c6c, 0x42d6, 0xba74, 0x43c6, 0xba20, 0x429d, 0x4010, 0x118b, 0x402c, 0xbf62, 0x42b4, 0x4638, 0x4269, 0x2880, 0xb015, 0x36fd, 0x4179, 0x1d14, 0x46da, 0x1a37, 0x21a6, 0xb0b8, 0xb2a7, 0x1f43, 0xba10, 0x1ea2, 0xba07, 0xb09e, 0x28a5, 0x426e, 0x3bc9, 0x41b8, 0x465e, 0x1cfe, 0xbf72, 0x41e6, 0x1bc3, 0xb04a, 0xbae4, 0x43df, 0x4281, 0x2e57, 0x408f, 0xb08e, 0x4069, 0xbfb0, 0x440a, 0xbfb0, 0xb230, 0xb0f2, 0x45b4, 0x402b, 0xb2e8, 0x4207, 0xbac1, 0x4186, 0xba45, 0x43d8, 0x43b2, 0x42cf, 0x41ad, 0x432d, 0xbf66, 0x401f, 0x43f5, 0x44f8, 0x42af, 0xa978, 0x439a, 0xb2fd, 0xb259, 0xb24a, 0x42b1, 0xba6d, 0x398d, 0x4190, 0x43cf, 0xb2a3, 0xba25, 0x26d9, 0x43db, 0xba1f, 0x1d49, 0x197a, 0xb0bc, 0x40ae, 0xa9b4, 0x3109, 0xbf03, 0x4125, 0x31de, 0x459b, 0xb2e0, 0xba14, 0x41bb, 0x437a, 0x425a, 0x1a58, 0x288b, 0x1d8f, 0xb084, 0x4235, 0x4349, 0x1631, 0x4043, 0x2199, 0x075f, 0xb071, 0x0a46, 0xba55, 0x40a5, 0x26e7, 0xbf00, 0x3d20, 0xa8f9, 0x4025, 0x44c4, 0xbf2a, 0x40eb, 0xba2a, 0xba0b, 0x4115, 0x42c2, 0x1d34, 0xba10, 0xba7c, 0x4079, 0x1b5d, 0xba50, 0x4369, 0x3eba, 0x400b, 0xb0b8, 0xbae1, 0x41f2, 0x43ef, 0x42a4, 0x4559, 0x242c, 0xacb2, 0xad93, 0xbf72, 0x4297, 0x42fc, 0x4269, 0x43b5, 0x1e97, 0x40dc, 0x35e6, 0xbacf, 0x1a73, 0x411a, 0xbae3, 0xbf33, 0xb2b2, 0x34a3, 0x425a, 0x405e, 0x3399, 0x21cc, 0x195d, 0x435e, 0x4099, 0xbfa0, 0xae2f, 0x43d9, 0x0109, 0x4025, 0x4155, 0x4462, 0x1602, 0x43bd, 0x4248, 0x4194, 0x434a, 0xabb9, 0xb2c8, 0xbf4d, 0x413d, 0xba58, 0x03e3, 0x40f5, 0x403c, 0x1598, 0x4265, 0x1f54, 0x4188, 0xb0aa, 0x18e2, 0x4223, 0xbfb0, 0x410b, 0x40f5, 0x1ab4, 0x23b7, 0x19ba, 0xbf7f, 0x18fe, 0x199f, 0x4011, 0x410d, 0x27b0, 0x4339, 0x1d01, 0x2979, 0x31af, 0xa4a3, 0x1dfb, 0x401b, 0x40b7, 0x3d6e, 0xb22d, 0xbf64, 0xb040, 0x3846, 0xbfbf, 0xb24b, 0x41fd, 0x2226, 0x43cf, 0x3af2, 0x4365, 0xb003, 0x4333, 0xaa10, 0x1ca0, 0xb0f2, 0xbf9f, 0x1fed, 0xb09e, 0x41b3, 0x468b, 0x40f3, 0x4398, 0x413c, 0x40b8, 0xb017, 0xb226, 0x43f4, 0x4340, 0x41d7, 0x01f2, 0x4374, 0x410a, 0x28e5, 0xb07f, 0x0cf8, 0x40c0, 0x422f, 0xbfdd, 0x4023, 0x085c, 0xb22c, 0x41c8, 0x4433, 0x45c9, 0x43d7, 0x4378, 0xbf06, 0x4570, 0x40e0, 0xb004, 0xb292, 0x449d, 0x1d73, 0xb24e, 0x4347, 0x4071, 0xb2d4, 0x1aed, 0x43ec, 0x1f32, 0x43e5, 0xa386, 0x3bc4, 0x4418, 0x40d4, 0x4031, 0xbfd5, 0x41f7, 0x401c, 0x41cd, 0x2c18, 0xb04b, 0x43da, 0xbafd, 0x41de, 0x4169, 0x406e, 0x43ee, 0x204a, 0xbf41, 0xbaff, 0x42ab, 0xbac3, 0x4691, 0xb269, 0x188e, 0x4277, 0xbf81, 0x43c8, 0xb223, 0x1dfd, 0x2342, 0x12d6, 0xb254, 0x19ce, 0x359d, 0x4343, 0x1cc8, 0x00c8, 0x26e1, 0xa58f, 0xb2c4, 0x4047, 0x3780, 0x4157, 0x3829, 0xbf48, 0x447c, 0x4770, 0xe7fe + ], + StartRegs = [0xf96275eb, 0x02fe41e7, 0xeefa2e22, 0x4b46bc43, 0x003dddf6, 0xa6272337, 0xb656ca8c, 0x7ccb9d65, 0xf8d3063c, 0x09bff66f, 0x1d231647, 0xe7c3d8f9, 0x0fbd2fe9, 0x8a2c763d, 0x00000000, 0x900001f0 + ], + FinalRegs = [0xffffffd7, 0x00000000, 0xffffe71f, 0x000730c0, 0x000017ea, 0x00001a18, 0x000000e1, 0x00000080, 0xf054250c, 0x00000000, 0x1d231647, 0x00000a54, 0x0d773b53, 0x1d23118b, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x409f, 0x4371, 0x4362, 0xb217, 0xbf00, 0x43fa, 0xbf8c, 0x18bb, 0x42a0, 0xba1a, 0xada9, 0x403c, 0x00d4, 0xbf02, 0xb01d, 0x43d0, 0xb264, 0xb2aa, 0xb0dd, 0x425d, 0x1dc1, 0x0378, 0xb072, 0x1d92, 0x2fa8, 0x4140, 0x40ac, 0x4620, 0x0a08, 0x42a6, 0xba07, 0xbafe, 0x4171, 0x40c2, 0x4376, 0x41db, 0x40e1, 0x4305, 0xbf97, 0x14b7, 0xba36, 0x4393, 0x1f2f, 0x4483, 0xbf46, 0x2407, 0xba63, 0x4096, 0x4103, 0x4650, 0x2684, 0x41aa, 0x4377, 0x43fc, 0x11ca, 0x4595, 0x3398, 0x43ef, 0x4634, 0x436d, 0xb060, 0x0ea8, 0xb2b5, 0x2045, 0x43ef, 0x46a4, 0x40b6, 0x40bd, 0x127f, 0x290e, 0x4087, 0x422c, 0x1856, 0xbf8c, 0x4065, 0x3e07, 0xb004, 0x44ec, 0xbf4c, 0x193a, 0xbaf4, 0xafa0, 0xb2c6, 0x406a, 0x1865, 0xbfc0, 0x19b2, 0x43d6, 0x1b78, 0xb039, 0x407a, 0x4163, 0x411a, 0x1d8c, 0x04e2, 0x1988, 0xb215, 0x40a0, 0x13bd, 0x38a5, 0xb2ce, 0x403b, 0x4291, 0x0562, 0x4680, 0x402c, 0xbf2e, 0x409c, 0xbaf0, 0x433f, 0xa329, 0x4031, 0x3824, 0x403f, 0xb2c0, 0x428b, 0x0991, 0x4153, 0x3e46, 0x4097, 0x2e7d, 0x05f3, 0xb2ee, 0xbade, 0x2267, 0xba3a, 0x198c, 0xbf6d, 0x461a, 0x337e, 0x43f0, 0xb225, 0x42a7, 0xb2ab, 0x45f3, 0x1f4b, 0x421a, 0xbac9, 0xbf47, 0x42c3, 0x44b4, 0x1c39, 0x0574, 0x4051, 0x4010, 0xb20e, 0xb2b3, 0x4575, 0x2bae, 0x1821, 0x366d, 0xb273, 0xb237, 0xbf4e, 0x425c, 0x4340, 0x191e, 0xbaf4, 0xbadf, 0x1a8b, 0x118f, 0xbfb0, 0x1ee0, 0x0041, 0xbfd9, 0xa940, 0xba2a, 0x4389, 0xba3a, 0x410e, 0xb03c, 0xba6a, 0x0b96, 0xb2d5, 0x1cb5, 0x026c, 0x4176, 0x1c59, 0x43d8, 0xb291, 0x3bf6, 0x1cff, 0x0650, 0xb2f6, 0x4348, 0x460d, 0x411d, 0x413c, 0x42fe, 0x0242, 0x415c, 0x088e, 0xbfb4, 0x136d, 0x2a54, 0x4183, 0xb2ae, 0x4457, 0xb0ff, 0x2d0f, 0x1f2b, 0x437a, 0x2ba1, 0xbfb4, 0x439e, 0x4196, 0x43e3, 0xb23e, 0x1be7, 0x4181, 0x4250, 0xbfd0, 0x413d, 0xbf80, 0x4289, 0xb058, 0xbac1, 0x432b, 0x40b4, 0xbf8a, 0x400d, 0x236d, 0x42a4, 0xa46c, 0xb053, 0x2598, 0x015b, 0x0966, 0x4335, 0xb29d, 0xbf51, 0x4185, 0xb2f6, 0xac2b, 0xb2fa, 0x3432, 0x4628, 0x2d72, 0xb053, 0xa1e1, 0x059e, 0xb225, 0x42e2, 0x4383, 0x400f, 0x42bc, 0x190e, 0x4094, 0x43f7, 0xb245, 0x403e, 0x41b3, 0x419d, 0xbf65, 0x4045, 0xb013, 0x417b, 0x0ea0, 0xaf84, 0x42d0, 0xb228, 0x40f7, 0xba01, 0xbfc0, 0xb2d9, 0x1dc9, 0xbfc6, 0x1aca, 0x4375, 0x1b51, 0x1f9c, 0x1b0a, 0x0661, 0x447e, 0x436a, 0x4051, 0xad93, 0x41b5, 0x4213, 0x006d, 0x40da, 0x4619, 0x42d5, 0xbaf4, 0xaabe, 0xbf70, 0x38e2, 0xbf8b, 0x40ce, 0xb21f, 0xbfd0, 0xb24e, 0xab0e, 0xbae3, 0xb25d, 0xb2c7, 0x443c, 0x42f8, 0x4173, 0x420a, 0xb2d7, 0x42dc, 0xb283, 0xa7ba, 0xbfb0, 0x4074, 0xb2d4, 0xbfb2, 0x40b8, 0x40bb, 0x1964, 0x40ff, 0x43e7, 0x4290, 0xb26c, 0xb226, 0x240c, 0xb090, 0x4321, 0xb26b, 0x4234, 0xba39, 0xba20, 0x40e5, 0x4153, 0x0199, 0xb262, 0x0485, 0x40f7, 0x2228, 0xbfe0, 0x4241, 0x4287, 0x4352, 0xb233, 0x1f2a, 0xbf07, 0xb0fb, 0x19b1, 0x3a72, 0x41c3, 0x1d5c, 0x0cfd, 0xbf90, 0xb293, 0xbaca, 0xbf6d, 0xba19, 0xb06f, 0x2275, 0xb246, 0xae73, 0x405f, 0xb247, 0x40c7, 0x1cb3, 0xb2ef, 0x4125, 0x413d, 0x1e18, 0x28fe, 0xb0a7, 0xb0af, 0xbfb5, 0xba0e, 0x40ee, 0x41f1, 0x424b, 0x4308, 0x17c4, 0xb00a, 0x42ff, 0xbf49, 0x21f1, 0x409f, 0x43b7, 0x1990, 0xbfa6, 0x4602, 0x1a37, 0xb28e, 0x4223, 0x401b, 0x0ee5, 0x4382, 0x4017, 0xba24, 0x402e, 0x4220, 0x41a7, 0x411b, 0xb2e5, 0x42f2, 0x41f2, 0xb247, 0xbf90, 0x430e, 0x2206, 0x3b7b, 0x4253, 0x4376, 0x4017, 0xba4d, 0x4257, 0xbf28, 0xb2a0, 0x4194, 0x42b6, 0x1919, 0x40c2, 0x467a, 0x4374, 0xb2cd, 0x1d2c, 0x4462, 0x40d7, 0x402a, 0xba75, 0xb0f9, 0x44c0, 0x428a, 0x3166, 0x0ecd, 0xbf07, 0x0e7f, 0xb03c, 0xb023, 0x416d, 0x4106, 0xba15, 0x072f, 0x1f48, 0x1d5c, 0x45b6, 0x3b35, 0x4003, 0xbff0, 0x3519, 0x4268, 0x40a9, 0x4364, 0x40a1, 0x412e, 0x4393, 0x462b, 0xa299, 0x2497, 0xb286, 0xacdc, 0xb027, 0xbf70, 0xbaee, 0xb213, 0xbf5c, 0xb00c, 0x4376, 0x4541, 0x33d7, 0x41d9, 0x43a6, 0x2c34, 0x44fc, 0xb001, 0x05ac, 0x40d4, 0x4201, 0x2dc1, 0xbaf3, 0xb201, 0xba73, 0x1f51, 0xb20a, 0x43ab, 0x4100, 0x4389, 0xba77, 0xbf3f, 0xa8c2, 0xba34, 0x41ce, 0x43fa, 0xb059, 0x46db, 0xbf7f, 0xb2e4, 0x43d5, 0xba10, 0x41c4, 0xbad6, 0x41df, 0x1918, 0x4117, 0x117b, 0xbf00, 0x42ed, 0x442e, 0x4229, 0x4393, 0x422e, 0xba58, 0x4058, 0xb270, 0xba2f, 0x40a7, 0x36a0, 0x405b, 0x2f9e, 0xbfb9, 0x41df, 0x4201, 0x3389, 0x405f, 0xa198, 0x43f0, 0x4151, 0x410c, 0x2c84, 0x2f92, 0x4206, 0xba04, 0x462b, 0xbf1a, 0x41eb, 0x2a6c, 0x4245, 0xa394, 0xb28e, 0xb24e, 0x04f0, 0x46e1, 0x42b3, 0xb03f, 0x30ef, 0x1d17, 0xbaec, 0xb2f8, 0x4168, 0x1b83, 0xbfac, 0x2cce, 0x4159, 0xb227, 0x45a2, 0x43d6, 0x43ca, 0x4124, 0xbf07, 0x0220, 0x40f0, 0x4201, 0xb224, 0x32db, 0x4340, 0x4145, 0x42c3, 0xbfa0, 0xb2e1, 0x42ee, 0xb0ed, 0x40e9, 0x414b, 0x42bd, 0x4555, 0x09ca, 0xb076, 0x1fcf, 0x09e5, 0xaf80, 0xb209, 0x40f0, 0xb04a, 0x4015, 0x41b1, 0x0408, 0xbfa8, 0x177c, 0xbf60, 0x41f9, 0x4251, 0xbf1f, 0x464a, 0xbf70, 0xba33, 0x425c, 0x4233, 0x454e, 0x4374, 0xbadb, 0x4105, 0x431b, 0x32b3, 0xb042, 0xb242, 0x4357, 0x28d3, 0x20b8, 0x2d3a, 0xba3a, 0xba75, 0x409b, 0xb2e3, 0x2cf2, 0x4078, 0xb257, 0xbf55, 0x427d, 0xb29a, 0xbad7, 0xbff0, 0x4207, 0x3766, 0x1fff, 0x1e14, 0x3528, 0x41c9, 0x27a9, 0x4114, 0x44f8, 0x18b7, 0x1c48, 0x4278, 0x2785, 0x1db7, 0x4473, 0x41f3, 0x18f7, 0x2d3c, 0xbfd8, 0x1c68, 0x402d, 0x43db, 0x4017, 0xb049, 0x401a, 0xba2f, 0xb090, 0x4558, 0x42e2, 0xba3b, 0x444c, 0xb01f, 0xad32, 0x4391, 0xbafc, 0xbf18, 0x418c, 0xb224, 0xb2bd, 0x1d32, 0x4076, 0xac73, 0x3419, 0x4128, 0x435b, 0x44bb, 0x42ed, 0xba33, 0xaaf8, 0xba11, 0xbf80, 0xb04f, 0x4253, 0x3fd6, 0x43df, 0xba71, 0xb255, 0xbf23, 0xbad5, 0xb01d, 0x4054, 0x4178, 0x4213, 0xbad9, 0xbf5f, 0x43e8, 0xb204, 0x45bd, 0x311b, 0x4286, 0xb261, 0x2ba0, 0x1a16, 0xb042, 0x4417, 0x1915, 0x4220, 0x429f, 0x4223, 0x41b3, 0xbac5, 0xb06a, 0x1b2c, 0x1452, 0xbf74, 0xb251, 0x423d, 0x1d7d, 0x43f3, 0xba14, 0x230c, 0x41e8, 0x436a, 0xb2c1, 0x40fd, 0x413f, 0x420a, 0xb2dd, 0xb28c, 0x46a5, 0xb291, 0xb2ee, 0x1f83, 0xb2e8, 0xb2cf, 0xa1bd, 0xb0c7, 0x1ba4, 0xbae4, 0x425a, 0x41f3, 0xb04b, 0xbfdc, 0x0f78, 0xba29, 0xb0e8, 0x42c9, 0xb291, 0xba18, 0x432b, 0xbfac, 0x4109, 0xab55, 0x436f, 0x4349, 0x4132, 0x41d9, 0xb240, 0x4227, 0x43c5, 0x403c, 0x1d71, 0x4182, 0x403c, 0x40e0, 0x4077, 0xb27b, 0x45bc, 0xa153, 0xb017, 0x429e, 0x42ee, 0x4453, 0x4064, 0xb0c1, 0xbf43, 0x0c27, 0x0f14, 0x3796, 0x433a, 0xad1c, 0xb27f, 0x431e, 0x1f68, 0xbf00, 0x3852, 0x43b8, 0x32f1, 0x4380, 0x1ec3, 0x1500, 0xa820, 0xa8b8, 0xbf73, 0xb28d, 0xac37, 0x1ab0, 0x0759, 0xaf00, 0xb28d, 0x40e7, 0x4314, 0xbaf9, 0xb05d, 0x33b3, 0x372a, 0x430c, 0x421d, 0x432d, 0xbfc7, 0x14a2, 0xba0b, 0x2f72, 0x45d5, 0x40da, 0xbf94, 0x4398, 0xb2c2, 0x10af, 0xba46, 0xaedb, 0x41ed, 0xba66, 0xba70, 0xb28d, 0x4130, 0x4106, 0x225a, 0x42d1, 0xba7f, 0xb07b, 0x41f3, 0x18bc, 0xa31f, 0x1c7e, 0x2979, 0xb267, 0x430c, 0xbfb3, 0x4005, 0x45b6, 0x1d0a, 0xb29c, 0xbfe8, 0x413f, 0x4212, 0x1a6c, 0xb2cd, 0x41a3, 0x1b19, 0xad5e, 0xba4a, 0x155b, 0x0e84, 0x4041, 0x43fc, 0x41ac, 0xba0c, 0x41ab, 0x38f2, 0x43c9, 0x1f49, 0xb006, 0xb218, 0x0657, 0x0076, 0xb071, 0xb292, 0xbf33, 0x42d9, 0x419a, 0x430a, 0x40d0, 0x43ed, 0xae7a, 0xba09, 0x1dee, 0x4172, 0xbac3, 0x40b6, 0x418f, 0x4102, 0xba3a, 0xb255, 0xa8b8, 0x28b4, 0xbf2a, 0xbac3, 0x46b3, 0xb029, 0x402b, 0x18ac, 0x14fb, 0xbf26, 0x42ff, 0x4545, 0x413c, 0x43f9, 0xb099, 0xb2ea, 0xa112, 0x4037, 0xac7a, 0x42d3, 0xb2d3, 0x4136, 0xba7d, 0x4081, 0x40fb, 0x4421, 0x41ea, 0x46eb, 0x43d5, 0x1956, 0x3dd2, 0x1e1c, 0x4323, 0x1833, 0xb0c3, 0x4267, 0x428e, 0xbad9, 0xbfb5, 0x1cb6, 0x4248, 0x42b6, 0x19fb, 0xb0a6, 0x1a7f, 0xba5a, 0x1a28, 0x4446, 0x4207, 0x3fd4, 0x4119, 0x4069, 0xb215, 0xa19b, 0x4392, 0xbaef, 0xb2de, 0x1c2a, 0x46f5, 0xbf73, 0x4286, 0xbff0, 0x4006, 0xb279, 0xb27f, 0x428e, 0x416f, 0x411a, 0xbfd8, 0x0c5e, 0x444e, 0x43c3, 0x156d, 0x4175, 0xb2fb, 0x3877, 0xb2d7, 0x400a, 0x4429, 0x38fe, 0xb27a, 0x1868, 0x429f, 0xb0d5, 0x1515, 0x42ce, 0x45a1, 0x43e7, 0xbf55, 0xba1e, 0x4365, 0x1d96, 0x42fc, 0x43f5, 0x41ed, 0x4020, 0x4390, 0x1fa2, 0xbfd6, 0xb25f, 0x4128, 0x43ad, 0x1f47, 0x4373, 0x41e2, 0x4040, 0x4102, 0xad91, 0xb2ea, 0x4064, 0x44f9, 0x1cc9, 0x42d0, 0x2e1d, 0xb094, 0xbad1, 0xb0bd, 0x4144, 0x4074, 0xbfa0, 0x00b7, 0x4556, 0xb21d, 0xba47, 0x42e0, 0xb0fb, 0xbfcd, 0x193b, 0x4266, 0xb230, 0x41ec, 0x4271, 0x416e, 0xa323, 0x4225, 0xa208, 0x4057, 0x356c, 0x2a9d, 0x0db2, 0xbfc1, 0x19d8, 0x4242, 0x4240, 0x41eb, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x1ecc668c, 0x2e9c60ff, 0x9990f0ee, 0xf1a38886, 0x3f294482, 0xc54ff2ce, 0x36359d5d, 0x6e0e101b, 0xc58ac456, 0x564992fe, 0xcc932f92, 0x05cbf818, 0x7c022c30, 0xc34238ff, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0xffffcfb8, 0xc342cf05, 0xffffcfb8, 0x80000185, 0xc342cf05, 0x000013a4, 0x3cbd4433, 0x000017f0, 0x0000138c, 0xc34266a3, 0xcc932f92, 0x00000371, 0xc3424f05, 0xfffffb7c, 0x00000000, 0x200001d0 }, + Instructions = [0x409f, 0x4371, 0x4362, 0xb217, 0xbf00, 0x43fa, 0xbf8c, 0x18bb, 0x42a0, 0xba1a, 0xada9, 0x403c, 0x00d4, 0xbf02, 0xb01d, 0x43d0, 0xb264, 0xb2aa, 0xb0dd, 0x425d, 0x1dc1, 0x0378, 0xb072, 0x1d92, 0x2fa8, 0x4140, 0x40ac, 0x4620, 0x0a08, 0x42a6, 0xba07, 0xbafe, 0x4171, 0x40c2, 0x4376, 0x41db, 0x40e1, 0x4305, 0xbf97, 0x14b7, 0xba36, 0x4393, 0x1f2f, 0x4483, 0xbf46, 0x2407, 0xba63, 0x4096, 0x4103, 0x4650, 0x2684, 0x41aa, 0x4377, 0x43fc, 0x11ca, 0x4595, 0x3398, 0x43ef, 0x4634, 0x436d, 0xb060, 0x0ea8, 0xb2b5, 0x2045, 0x43ef, 0x46a4, 0x40b6, 0x40bd, 0x127f, 0x290e, 0x4087, 0x422c, 0x1856, 0xbf8c, 0x4065, 0x3e07, 0xb004, 0x44ec, 0xbf4c, 0x193a, 0xbaf4, 0xafa0, 0xb2c6, 0x406a, 0x1865, 0xbfc0, 0x19b2, 0x43d6, 0x1b78, 0xb039, 0x407a, 0x4163, 0x411a, 0x1d8c, 0x04e2, 0x1988, 0xb215, 0x40a0, 0x13bd, 0x38a5, 0xb2ce, 0x403b, 0x4291, 0x0562, 0x4680, 0x402c, 0xbf2e, 0x409c, 0xbaf0, 0x433f, 0xa329, 0x4031, 0x3824, 0x403f, 0xb2c0, 0x428b, 0x0991, 0x4153, 0x3e46, 0x4097, 0x2e7d, 0x05f3, 0xb2ee, 0xbade, 0x2267, 0xba3a, 0x198c, 0xbf6d, 0x461a, 0x337e, 0x43f0, 0xb225, 0x42a7, 0xb2ab, 0x45f3, 0x1f4b, 0x421a, 0xbac9, 0xbf47, 0x42c3, 0x44b4, 0x1c39, 0x0574, 0x4051, 0x4010, 0xb20e, 0xb2b3, 0x4575, 0x2bae, 0x1821, 0x366d, 0xb273, 0xb237, 0xbf4e, 0x425c, 0x4340, 0x191e, 0xbaf4, 0xbadf, 0x1a8b, 0x118f, 0xbfb0, 0x1ee0, 0x0041, 0xbfd9, 0xa940, 0xba2a, 0x4389, 0xba3a, 0x410e, 0xb03c, 0xba6a, 0x0b96, 0xb2d5, 0x1cb5, 0x026c, 0x4176, 0x1c59, 0x43d8, 0xb291, 0x3bf6, 0x1cff, 0x0650, 0xb2f6, 0x4348, 0x460d, 0x411d, 0x413c, 0x42fe, 0x0242, 0x415c, 0x088e, 0xbfb4, 0x136d, 0x2a54, 0x4183, 0xb2ae, 0x4457, 0xb0ff, 0x2d0f, 0x1f2b, 0x437a, 0x2ba1, 0xbfb4, 0x439e, 0x4196, 0x43e3, 0xb23e, 0x1be7, 0x4181, 0x4250, 0xbfd0, 0x413d, 0xbf80, 0x4289, 0xb058, 0xbac1, 0x432b, 0x40b4, 0xbf8a, 0x400d, 0x236d, 0x42a4, 0xa46c, 0xb053, 0x2598, 0x015b, 0x0966, 0x4335, 0xb29d, 0xbf51, 0x4185, 0xb2f6, 0xac2b, 0xb2fa, 0x3432, 0x4628, 0x2d72, 0xb053, 0xa1e1, 0x059e, 0xb225, 0x42e2, 0x4383, 0x400f, 0x42bc, 0x190e, 0x4094, 0x43f7, 0xb245, 0x403e, 0x41b3, 0x419d, 0xbf65, 0x4045, 0xb013, 0x417b, 0x0ea0, 0xaf84, 0x42d0, 0xb228, 0x40f7, 0xba01, 0xbfc0, 0xb2d9, 0x1dc9, 0xbfc6, 0x1aca, 0x4375, 0x1b51, 0x1f9c, 0x1b0a, 0x0661, 0x447e, 0x436a, 0x4051, 0xad93, 0x41b5, 0x4213, 0x006d, 0x40da, 0x4619, 0x42d5, 0xbaf4, 0xaabe, 0xbf70, 0x38e2, 0xbf8b, 0x40ce, 0xb21f, 0xbfd0, 0xb24e, 0xab0e, 0xbae3, 0xb25d, 0xb2c7, 0x443c, 0x42f8, 0x4173, 0x420a, 0xb2d7, 0x42dc, 0xb283, 0xa7ba, 0xbfb0, 0x4074, 0xb2d4, 0xbfb2, 0x40b8, 0x40bb, 0x1964, 0x40ff, 0x43e7, 0x4290, 0xb26c, 0xb226, 0x240c, 0xb090, 0x4321, 0xb26b, 0x4234, 0xba39, 0xba20, 0x40e5, 0x4153, 0x0199, 0xb262, 0x0485, 0x40f7, 0x2228, 0xbfe0, 0x4241, 0x4287, 0x4352, 0xb233, 0x1f2a, 0xbf07, 0xb0fb, 0x19b1, 0x3a72, 0x41c3, 0x1d5c, 0x0cfd, 0xbf90, 0xb293, 0xbaca, 0xbf6d, 0xba19, 0xb06f, 0x2275, 0xb246, 0xae73, 0x405f, 0xb247, 0x40c7, 0x1cb3, 0xb2ef, 0x4125, 0x413d, 0x1e18, 0x28fe, 0xb0a7, 0xb0af, 0xbfb5, 0xba0e, 0x40ee, 0x41f1, 0x424b, 0x4308, 0x17c4, 0xb00a, 0x42ff, 0xbf49, 0x21f1, 0x409f, 0x43b7, 0x1990, 0xbfa6, 0x4602, 0x1a37, 0xb28e, 0x4223, 0x401b, 0x0ee5, 0x4382, 0x4017, 0xba24, 0x402e, 0x4220, 0x41a7, 0x411b, 0xb2e5, 0x42f2, 0x41f2, 0xb247, 0xbf90, 0x430e, 0x2206, 0x3b7b, 0x4253, 0x4376, 0x4017, 0xba4d, 0x4257, 0xbf28, 0xb2a0, 0x4194, 0x42b6, 0x1919, 0x40c2, 0x467a, 0x4374, 0xb2cd, 0x1d2c, 0x4462, 0x40d7, 0x402a, 0xba75, 0xb0f9, 0x44c0, 0x428a, 0x3166, 0x0ecd, 0xbf07, 0x0e7f, 0xb03c, 0xb023, 0x416d, 0x4106, 0xba15, 0x072f, 0x1f48, 0x1d5c, 0x45b6, 0x3b35, 0x4003, 0xbff0, 0x3519, 0x4268, 0x40a9, 0x4364, 0x40a1, 0x412e, 0x4393, 0x462b, 0xa299, 0x2497, 0xb286, 0xacdc, 0xb027, 0xbf70, 0xbaee, 0xb213, 0xbf5c, 0xb00c, 0x4376, 0x4541, 0x33d7, 0x41d9, 0x43a6, 0x2c34, 0x44fc, 0xb001, 0x05ac, 0x40d4, 0x4201, 0x2dc1, 0xbaf3, 0xb201, 0xba73, 0x1f51, 0xb20a, 0x43ab, 0x4100, 0x4389, 0xba77, 0xbf3f, 0xa8c2, 0xba34, 0x41ce, 0x43fa, 0xb059, 0x46db, 0xbf7f, 0xb2e4, 0x43d5, 0xba10, 0x41c4, 0xbad6, 0x41df, 0x1918, 0x4117, 0x117b, 0xbf00, 0x42ed, 0x442e, 0x4229, 0x4393, 0x422e, 0xba58, 0x4058, 0xb270, 0xba2f, 0x40a7, 0x36a0, 0x405b, 0x2f9e, 0xbfb9, 0x41df, 0x4201, 0x3389, 0x405f, 0xa198, 0x43f0, 0x4151, 0x410c, 0x2c84, 0x2f92, 0x4206, 0xba04, 0x462b, 0xbf1a, 0x41eb, 0x2a6c, 0x4245, 0xa394, 0xb28e, 0xb24e, 0x04f0, 0x46e1, 0x42b3, 0xb03f, 0x30ef, 0x1d17, 0xbaec, 0xb2f8, 0x4168, 0x1b83, 0xbfac, 0x2cce, 0x4159, 0xb227, 0x45a2, 0x43d6, 0x43ca, 0x4124, 0xbf07, 0x0220, 0x40f0, 0x4201, 0xb224, 0x32db, 0x4340, 0x4145, 0x42c3, 0xbfa0, 0xb2e1, 0x42ee, 0xb0ed, 0x40e9, 0x414b, 0x42bd, 0x4555, 0x09ca, 0xb076, 0x1fcf, 0x09e5, 0xaf80, 0xb209, 0x40f0, 0xb04a, 0x4015, 0x41b1, 0x0408, 0xbfa8, 0x177c, 0xbf60, 0x41f9, 0x4251, 0xbf1f, 0x464a, 0xbf70, 0xba33, 0x425c, 0x4233, 0x454e, 0x4374, 0xbadb, 0x4105, 0x431b, 0x32b3, 0xb042, 0xb242, 0x4357, 0x28d3, 0x20b8, 0x2d3a, 0xba3a, 0xba75, 0x409b, 0xb2e3, 0x2cf2, 0x4078, 0xb257, 0xbf55, 0x427d, 0xb29a, 0xbad7, 0xbff0, 0x4207, 0x3766, 0x1fff, 0x1e14, 0x3528, 0x41c9, 0x27a9, 0x4114, 0x44f8, 0x18b7, 0x1c48, 0x4278, 0x2785, 0x1db7, 0x4473, 0x41f3, 0x18f7, 0x2d3c, 0xbfd8, 0x1c68, 0x402d, 0x43db, 0x4017, 0xb049, 0x401a, 0xba2f, 0xb090, 0x4558, 0x42e2, 0xba3b, 0x444c, 0xb01f, 0xad32, 0x4391, 0xbafc, 0xbf18, 0x418c, 0xb224, 0xb2bd, 0x1d32, 0x4076, 0xac73, 0x3419, 0x4128, 0x435b, 0x44bb, 0x42ed, 0xba33, 0xaaf8, 0xba11, 0xbf80, 0xb04f, 0x4253, 0x3fd6, 0x43df, 0xba71, 0xb255, 0xbf23, 0xbad5, 0xb01d, 0x4054, 0x4178, 0x4213, 0xbad9, 0xbf5f, 0x43e8, 0xb204, 0x45bd, 0x311b, 0x4286, 0xb261, 0x2ba0, 0x1a16, 0xb042, 0x4417, 0x1915, 0x4220, 0x429f, 0x4223, 0x41b3, 0xbac5, 0xb06a, 0x1b2c, 0x1452, 0xbf74, 0xb251, 0x423d, 0x1d7d, 0x43f3, 0xba14, 0x230c, 0x41e8, 0x436a, 0xb2c1, 0x40fd, 0x413f, 0x420a, 0xb2dd, 0xb28c, 0x46a5, 0xb291, 0xb2ee, 0x1f83, 0xb2e8, 0xb2cf, 0xa1bd, 0xb0c7, 0x1ba4, 0xbae4, 0x425a, 0x41f3, 0xb04b, 0xbfdc, 0x0f78, 0xba29, 0xb0e8, 0x42c9, 0xb291, 0xba18, 0x432b, 0xbfac, 0x4109, 0xab55, 0x436f, 0x4349, 0x4132, 0x41d9, 0xb240, 0x4227, 0x43c5, 0x403c, 0x1d71, 0x4182, 0x403c, 0x40e0, 0x4077, 0xb27b, 0x45bc, 0xa153, 0xb017, 0x429e, 0x42ee, 0x4453, 0x4064, 0xb0c1, 0xbf43, 0x0c27, 0x0f14, 0x3796, 0x433a, 0xad1c, 0xb27f, 0x431e, 0x1f68, 0xbf00, 0x3852, 0x43b8, 0x32f1, 0x4380, 0x1ec3, 0x1500, 0xa820, 0xa8b8, 0xbf73, 0xb28d, 0xac37, 0x1ab0, 0x0759, 0xaf00, 0xb28d, 0x40e7, 0x4314, 0xbaf9, 0xb05d, 0x33b3, 0x372a, 0x430c, 0x421d, 0x432d, 0xbfc7, 0x14a2, 0xba0b, 0x2f72, 0x45d5, 0x40da, 0xbf94, 0x4398, 0xb2c2, 0x10af, 0xba46, 0xaedb, 0x41ed, 0xba66, 0xba70, 0xb28d, 0x4130, 0x4106, 0x225a, 0x42d1, 0xba7f, 0xb07b, 0x41f3, 0x18bc, 0xa31f, 0x1c7e, 0x2979, 0xb267, 0x430c, 0xbfb3, 0x4005, 0x45b6, 0x1d0a, 0xb29c, 0xbfe8, 0x413f, 0x4212, 0x1a6c, 0xb2cd, 0x41a3, 0x1b19, 0xad5e, 0xba4a, 0x155b, 0x0e84, 0x4041, 0x43fc, 0x41ac, 0xba0c, 0x41ab, 0x38f2, 0x43c9, 0x1f49, 0xb006, 0xb218, 0x0657, 0x0076, 0xb071, 0xb292, 0xbf33, 0x42d9, 0x419a, 0x430a, 0x40d0, 0x43ed, 0xae7a, 0xba09, 0x1dee, 0x4172, 0xbac3, 0x40b6, 0x418f, 0x4102, 0xba3a, 0xb255, 0xa8b8, 0x28b4, 0xbf2a, 0xbac3, 0x46b3, 0xb029, 0x402b, 0x18ac, 0x14fb, 0xbf26, 0x42ff, 0x4545, 0x413c, 0x43f9, 0xb099, 0xb2ea, 0xa112, 0x4037, 0xac7a, 0x42d3, 0xb2d3, 0x4136, 0xba7d, 0x4081, 0x40fb, 0x4421, 0x41ea, 0x46eb, 0x43d5, 0x1956, 0x3dd2, 0x1e1c, 0x4323, 0x1833, 0xb0c3, 0x4267, 0x428e, 0xbad9, 0xbfb5, 0x1cb6, 0x4248, 0x42b6, 0x19fb, 0xb0a6, 0x1a7f, 0xba5a, 0x1a28, 0x4446, 0x4207, 0x3fd4, 0x4119, 0x4069, 0xb215, 0xa19b, 0x4392, 0xbaef, 0xb2de, 0x1c2a, 0x46f5, 0xbf73, 0x4286, 0xbff0, 0x4006, 0xb279, 0xb27f, 0x428e, 0x416f, 0x411a, 0xbfd8, 0x0c5e, 0x444e, 0x43c3, 0x156d, 0x4175, 0xb2fb, 0x3877, 0xb2d7, 0x400a, 0x4429, 0x38fe, 0xb27a, 0x1868, 0x429f, 0xb0d5, 0x1515, 0x42ce, 0x45a1, 0x43e7, 0xbf55, 0xba1e, 0x4365, 0x1d96, 0x42fc, 0x43f5, 0x41ed, 0x4020, 0x4390, 0x1fa2, 0xbfd6, 0xb25f, 0x4128, 0x43ad, 0x1f47, 0x4373, 0x41e2, 0x4040, 0x4102, 0xad91, 0xb2ea, 0x4064, 0x44f9, 0x1cc9, 0x42d0, 0x2e1d, 0xb094, 0xbad1, 0xb0bd, 0x4144, 0x4074, 0xbfa0, 0x00b7, 0x4556, 0xb21d, 0xba47, 0x42e0, 0xb0fb, 0xbfcd, 0x193b, 0x4266, 0xb230, 0x41ec, 0x4271, 0x416e, 0xa323, 0x4225, 0xa208, 0x4057, 0x356c, 0x2a9d, 0x0db2, 0xbfc1, 0x19d8, 0x4242, 0x4240, 0x41eb, 0x4770, 0xe7fe + ], + StartRegs = [0x1ecc668c, 0x2e9c60ff, 0x9990f0ee, 0xf1a38886, 0x3f294482, 0xc54ff2ce, 0x36359d5d, 0x6e0e101b, 0xc58ac456, 0x564992fe, 0xcc932f92, 0x05cbf818, 0x7c022c30, 0xc34238ff, 0x00000000, 0x700001f0 + ], + FinalRegs = [0xffffcfb8, 0xc342cf05, 0xffffcfb8, 0x80000185, 0xc342cf05, 0x000013a4, 0x3cbd4433, 0x000017f0, 0x0000138c, 0xc34266a3, 0xcc932f92, 0x00000371, 0xc3424f05, 0xfffffb7c, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x430e, 0x1b60, 0x2a48, 0xbadf, 0xb061, 0x420b, 0x41bf, 0xba6c, 0xb2dd, 0x3070, 0xb2ae, 0xb21f, 0x4226, 0x4260, 0xbaef, 0xb233, 0x4645, 0x439f, 0x2b19, 0x394a, 0xba1e, 0xba60, 0x40fe, 0xba31, 0xbf48, 0x4296, 0x433d, 0x4353, 0x26f9, 0x42c3, 0x4286, 0x2142, 0xba78, 0xa6be, 0x2ec6, 0xba58, 0xb2e3, 0x43c8, 0x43ce, 0x3eb2, 0x1c58, 0xbf61, 0xb24d, 0x1a44, 0xb2f5, 0xa49d, 0xba3d, 0xba1c, 0x420f, 0x0ec6, 0xbf1f, 0x4636, 0xad48, 0x4181, 0x4155, 0x3050, 0x4001, 0xba03, 0x422b, 0x0266, 0xb0c4, 0xba50, 0xa8b4, 0x1e73, 0x41f5, 0xa645, 0x436a, 0x277c, 0x432a, 0x1b94, 0x1d44, 0xb294, 0x4080, 0x42a6, 0xb256, 0xbf2d, 0x1926, 0x4000, 0x4396, 0xb221, 0xb071, 0x0912, 0xba74, 0xb2d9, 0x3bd3, 0x45f5, 0x35e1, 0xb2a0, 0x42f2, 0x1e6b, 0x1595, 0x0e57, 0x42a0, 0x45d6, 0xba44, 0x41a2, 0xb26d, 0x43d3, 0xa79e, 0x434c, 0xbfd9, 0x40a3, 0x418c, 0xb230, 0x2774, 0x414a, 0x4385, 0xba77, 0x4019, 0x4202, 0x4251, 0xbafe, 0x4243, 0xb0e9, 0x1fc2, 0x4196, 0x2115, 0x4570, 0x420b, 0x4344, 0x40fc, 0x1820, 0xbf13, 0x40f3, 0xbaf1, 0x4280, 0x4110, 0x43ba, 0x25f9, 0x4175, 0xbfa0, 0x09ba, 0x35e7, 0x41ec, 0x12ba, 0xb249, 0xbade, 0x3bf7, 0x3c20, 0xba5f, 0x4094, 0x3b99, 0x2bb1, 0xb2e3, 0x4166, 0x402f, 0x414c, 0x425d, 0x415d, 0x43ba, 0x40da, 0xbfdf, 0x45e1, 0x412c, 0xb2da, 0x44d5, 0x4180, 0x3b39, 0x4221, 0xbf62, 0xba33, 0x42c8, 0xadf9, 0xb2af, 0xb28f, 0x4254, 0x4121, 0x393f, 0xa074, 0x4320, 0xb0ef, 0x400e, 0xbf37, 0x41a4, 0xbfb0, 0x39e8, 0x4226, 0xafd2, 0x400d, 0x435e, 0x42f0, 0xb223, 0x403e, 0xba0c, 0xb09d, 0x42a0, 0x2b3a, 0x4016, 0x4308, 0xae2c, 0x3e99, 0x06a6, 0x45cb, 0x0741, 0xba55, 0xbf93, 0x1c12, 0x40e2, 0x24c4, 0x1fb7, 0x41ca, 0x2258, 0xbf5d, 0x3ccc, 0x420f, 0x41d4, 0xba60, 0x402d, 0x40e3, 0xb261, 0xbfcd, 0x415d, 0xb01f, 0x1901, 0x420b, 0x1a54, 0x3fa6, 0x4021, 0x1dcc, 0xb260, 0x425f, 0xb038, 0xba79, 0xba11, 0x103d, 0x1f3c, 0xba7c, 0xb283, 0xbfba, 0xb24d, 0xb273, 0x3b72, 0x3c0a, 0x40ca, 0xb2c3, 0x3882, 0xb282, 0xba42, 0x402a, 0x4655, 0x43bf, 0x2362, 0x43c6, 0x4148, 0xb08d, 0x4072, 0xa1f3, 0x3784, 0xb2a2, 0x438a, 0xbf3c, 0x22a4, 0x401c, 0x4201, 0xa508, 0xbae9, 0x4490, 0xb2ea, 0x1de4, 0xbae9, 0x43ab, 0x3fcb, 0x4028, 0xa9ca, 0x1a68, 0x2cfc, 0xb01d, 0xbfb8, 0x406b, 0x3db1, 0x41ff, 0x2386, 0x3663, 0xb206, 0x421c, 0xab7f, 0x41c8, 0xba13, 0x2a54, 0x41db, 0x407d, 0xb066, 0xbf1f, 0x1a65, 0x1d6f, 0x066a, 0x428d, 0x4065, 0x404f, 0x1ac2, 0x44db, 0x0b90, 0x4488, 0x4255, 0x4550, 0xb0c3, 0x4291, 0x414c, 0xb2e4, 0x4231, 0x430e, 0xb240, 0x4003, 0x1210, 0x43b1, 0xb246, 0x4344, 0xbf4f, 0x44f9, 0xb218, 0xba07, 0x4053, 0xbf60, 0x4248, 0x1432, 0x45c3, 0x4083, 0x4403, 0x2f70, 0xbfb9, 0xaecd, 0xb050, 0x40e7, 0x409f, 0xaeeb, 0x40d6, 0x4315, 0x125b, 0x400b, 0xb0a3, 0x44db, 0xbf37, 0x4202, 0x4179, 0x1d0e, 0x2d2d, 0xa705, 0x43ee, 0x3206, 0x1586, 0xb25f, 0x37da, 0x423c, 0x4151, 0x401f, 0x04c3, 0x219b, 0x22dd, 0x402d, 0x1c87, 0x4201, 0x41bb, 0xbfa6, 0xb040, 0xaf1a, 0x4372, 0xbadd, 0xbf02, 0x0c72, 0xb20c, 0x41cd, 0xb2e9, 0x4115, 0x1f3c, 0x4000, 0x44e1, 0xb2c9, 0x31aa, 0xbac6, 0xb083, 0x2dc0, 0x432d, 0x2a5c, 0xb2d3, 0x4019, 0x46ed, 0xbf6f, 0x4322, 0x4466, 0xb249, 0x2cf1, 0x4387, 0x4170, 0x43e0, 0x40a7, 0x16ff, 0x1793, 0x29d4, 0xba1d, 0x2029, 0x4173, 0xb217, 0x434f, 0xb231, 0xa7fa, 0xbf5e, 0x43ce, 0xb0ae, 0x3cf2, 0x3a2e, 0x43c6, 0x2f25, 0x4304, 0x0394, 0x43de, 0x4312, 0x429c, 0x1fd2, 0xb2c4, 0x3066, 0x4159, 0x4192, 0x46f8, 0xbae6, 0x412d, 0x400d, 0x4272, 0x3c14, 0x427f, 0x447c, 0xb294, 0x4609, 0xbf88, 0x43c4, 0x35ea, 0x4308, 0xbacc, 0x42b6, 0x433f, 0xa5b2, 0x43f6, 0xb212, 0x0a9d, 0xbae2, 0x118e, 0x4214, 0x4344, 0x1ff4, 0x18ec, 0xb025, 0x1865, 0x04b5, 0xbf63, 0x4102, 0xbae5, 0x41a5, 0x40fc, 0x1fee, 0x42f4, 0x438e, 0x1d08, 0xb27c, 0xba61, 0x40b7, 0x03e2, 0x1bcf, 0x34ad, 0xb2b0, 0x007d, 0x3c4f, 0x41d8, 0x45d1, 0x41ac, 0x442b, 0x424d, 0x4279, 0xa121, 0x44a9, 0x41f3, 0x01c8, 0x40bd, 0x414f, 0xbfcf, 0xba19, 0x42ea, 0x2383, 0x00d8, 0xba6a, 0xba41, 0xb01c, 0x317c, 0x40a8, 0x401d, 0xb054, 0x400b, 0x1d1a, 0x1fd3, 0x1b51, 0xbfa8, 0x403c, 0xb003, 0x4336, 0x3dd6, 0x40d2, 0x410b, 0xafc3, 0xabd6, 0xa7d5, 0x02c0, 0x4201, 0x4242, 0xa5f6, 0xb061, 0xba2d, 0x1be8, 0x0262, 0x434c, 0xa56e, 0xbf95, 0xba08, 0x22fd, 0xb22d, 0xa383, 0x1876, 0x024b, 0x4134, 0x2c98, 0x4232, 0xa829, 0x41cc, 0x4237, 0x4287, 0x44db, 0x46fa, 0x415c, 0x432b, 0x416d, 0x4231, 0xaba6, 0xb208, 0x402f, 0xba7d, 0xa377, 0x4005, 0xacdb, 0xbfc2, 0x1ce5, 0xbf70, 0xb26c, 0x3bb5, 0x05cf, 0xb0f3, 0xb222, 0x4398, 0x4632, 0x4132, 0x4371, 0x1bd3, 0xb212, 0xbfac, 0xbf80, 0x41e2, 0xbf3e, 0x431e, 0x0ade, 0x4225, 0x26de, 0x4062, 0x4660, 0x4054, 0xbf5a, 0x43b4, 0x4282, 0x4255, 0x1cb3, 0x286c, 0xba6f, 0xabbd, 0xb0f6, 0x4206, 0x4154, 0x40f2, 0x42e7, 0x30f7, 0x4005, 0x45b6, 0xbf9f, 0x40a2, 0xb2b8, 0xba26, 0x2711, 0xad55, 0x4382, 0xb0b4, 0x1990, 0xba12, 0xb2e0, 0xba00, 0xa4f2, 0x4356, 0xb211, 0x435a, 0x4052, 0xaaa8, 0x404c, 0x41d0, 0x1cb9, 0xb28e, 0x41dc, 0x2275, 0x4492, 0x0359, 0xb2e5, 0xbf4e, 0x1301, 0x44d5, 0x4122, 0x39cf, 0x347b, 0x43cd, 0x28be, 0x1851, 0x1a41, 0x40e7, 0xba0e, 0x18bd, 0xb095, 0xb269, 0x4029, 0x1879, 0x1b1b, 0x4156, 0x4210, 0xbf3b, 0x44ac, 0x405e, 0x42b1, 0x4306, 0xb297, 0x4198, 0xb002, 0x4232, 0x3704, 0x3643, 0x4220, 0xbf9a, 0x3986, 0xb2a7, 0x412d, 0x416f, 0x3c6c, 0xba06, 0x1bda, 0x435d, 0x421d, 0x41cf, 0xa2e4, 0x1cf3, 0x442b, 0x40ec, 0xb281, 0x1ebc, 0x4373, 0x40c9, 0xac98, 0xbff0, 0xa100, 0x409f, 0xb290, 0x41f9, 0x1733, 0xb255, 0x1efe, 0x4004, 0xbf3e, 0xb0c3, 0x4023, 0x09b0, 0x0995, 0x1ec1, 0x2998, 0xba06, 0x1e93, 0x43cc, 0xb2de, 0x42d3, 0x41ac, 0x4354, 0x4013, 0xa9a8, 0xbfd4, 0xb241, 0x4022, 0x1dcf, 0xb0ee, 0x43cc, 0x1a03, 0xbac9, 0x1b7e, 0x4311, 0x439e, 0xbf8a, 0x025e, 0x43b7, 0xa7ed, 0x4276, 0x4200, 0x42fa, 0xb04a, 0xa648, 0x418e, 0x40bd, 0x09bd, 0xbaec, 0x42d1, 0x2ede, 0x1b6e, 0x06b5, 0x08c6, 0xb2ba, 0xb2f6, 0x1d2f, 0x1aac, 0xba61, 0xbf2d, 0xb283, 0x4311, 0xb203, 0x4193, 0xa79a, 0x1eb0, 0x436e, 0xba53, 0x4612, 0x42d8, 0xb202, 0x3e0c, 0xaf8a, 0xba34, 0x4084, 0xabe0, 0x19fe, 0x4331, 0x4337, 0xb247, 0x4647, 0x407b, 0x31ff, 0xbf1c, 0x4148, 0x385b, 0x3fa5, 0xb2e5, 0x1e35, 0x087e, 0xaef2, 0xb093, 0x424c, 0xb227, 0x43dc, 0x102d, 0x4612, 0xb2c3, 0xb221, 0xb2ac, 0xbf24, 0x4359, 0x42b6, 0xb25d, 0x3d87, 0x42e8, 0xbaea, 0x436d, 0x1a91, 0xbafc, 0x42db, 0xa79c, 0x1946, 0x4140, 0x40af, 0x4095, 0x1ce6, 0x12fc, 0x2a6a, 0x40fd, 0x1e44, 0xbf75, 0x1ecd, 0x4114, 0x1fb8, 0xb07d, 0x41e1, 0x4306, 0x4040, 0x4007, 0xba64, 0xbf70, 0x4011, 0xbf39, 0x40be, 0xb257, 0xb05a, 0xb000, 0x2cf7, 0x0fae, 0xaa47, 0xbf1f, 0x4095, 0x43a6, 0xbfc0, 0x34a2, 0x3dc5, 0x42fe, 0x4329, 0x4135, 0xbae2, 0x46b9, 0xbfdb, 0x1c14, 0x4482, 0x432a, 0xb29a, 0x1fb4, 0x1869, 0x199f, 0x43b6, 0x3cd5, 0x437e, 0x2331, 0xb201, 0x4348, 0x2663, 0x41c9, 0x421e, 0xb2a6, 0x41a1, 0xbfc4, 0x3897, 0x4458, 0x41a9, 0xb2c6, 0xbfbf, 0xbf70, 0x1c52, 0x4132, 0x1e34, 0x0d87, 0xbae6, 0xb2b4, 0x2385, 0x41c1, 0x42ab, 0x1a6a, 0x07b7, 0x40aa, 0xbf21, 0x403b, 0xbaee, 0x43d9, 0x43ef, 0x41ab, 0x426c, 0x4280, 0x4019, 0xbf60, 0x4245, 0x1f77, 0x4061, 0xba66, 0x4086, 0x337a, 0x1942, 0x2580, 0x0667, 0x40dd, 0x4135, 0xbf56, 0x408c, 0xb2b1, 0xba18, 0xb2ac, 0xbf1b, 0x42d0, 0xb0c8, 0x418c, 0xb283, 0xaf4c, 0x1bab, 0xb047, 0xb092, 0x16b1, 0xbae1, 0xa058, 0xa49b, 0x4007, 0xaca0, 0x1e8e, 0x41dc, 0x4065, 0x3fbb, 0x4192, 0x191a, 0xb263, 0xbfa9, 0x4384, 0x438c, 0x46da, 0x1e3b, 0x1cc2, 0x43a3, 0xba39, 0xbfa5, 0xb0bf, 0x1e42, 0x1a0a, 0x1cad, 0x401c, 0x439f, 0xa4ab, 0x4302, 0x4484, 0x40d3, 0xbfd0, 0x41cd, 0x3bc6, 0x1fc1, 0x41b9, 0xb255, 0x41c4, 0xba13, 0xb298, 0x2459, 0x054c, 0xbfd4, 0x41d4, 0x1b7d, 0x1d2c, 0x2806, 0x1bec, 0xb2f3, 0x268c, 0x4131, 0x42cb, 0x4146, 0xbf8a, 0x42c8, 0x4057, 0xa7d7, 0x36f5, 0xb082, 0x439c, 0x42cf, 0x454e, 0x403b, 0xb225, 0x1e75, 0x4357, 0x2f15, 0x4096, 0x314f, 0xa555, 0xba10, 0x4003, 0x3197, 0xba21, 0x40a5, 0xbf9f, 0x41cd, 0x24ad, 0xaf2c, 0x42d0, 0x38f1, 0x407c, 0x429e, 0xb03e, 0xbf1f, 0x40c7, 0xb294, 0xa6a8, 0x387d, 0x1236, 0x4148, 0x3c48, 0xbf76, 0x00f5, 0xb2bf, 0x12a8, 0x423b, 0x41c2, 0x4206, 0xb0a4, 0x0c83, 0x40ff, 0x4138, 0xbfb0, 0x1b14, 0x4228, 0x3697, 0x3a11, 0x4107, 0xbafd, 0x447c, 0x43a3, 0xb28f, 0x4246, 0x454f, 0x432e, 0xbfdc, 0xb2d1, 0x437e, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xcc2ef87d, 0xae95a3fd, 0x5e6e0ca5, 0x1ef09cca, 0x00ea6c00, 0x963e3b79, 0xc2107f27, 0x7b8c8e2a, 0xa52501a4, 0xdd47e07c, 0x58514dc3, 0xb401ec82, 0x88632001, 0xabb2221b, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x0000003e, 0x0000183e, 0x00000000, 0x544dfc0a, 0x00000000, 0x00000000, 0x0000ffff, 0x0000133c, 0xffffffff, 0x0000148f, 0xa00f6410, 0x88633849, 0xabb2349a, 0x00000000, 0x400001d0 }, + Instructions = [0x430e, 0x1b60, 0x2a48, 0xbadf, 0xb061, 0x420b, 0x41bf, 0xba6c, 0xb2dd, 0x3070, 0xb2ae, 0xb21f, 0x4226, 0x4260, 0xbaef, 0xb233, 0x4645, 0x439f, 0x2b19, 0x394a, 0xba1e, 0xba60, 0x40fe, 0xba31, 0xbf48, 0x4296, 0x433d, 0x4353, 0x26f9, 0x42c3, 0x4286, 0x2142, 0xba78, 0xa6be, 0x2ec6, 0xba58, 0xb2e3, 0x43c8, 0x43ce, 0x3eb2, 0x1c58, 0xbf61, 0xb24d, 0x1a44, 0xb2f5, 0xa49d, 0xba3d, 0xba1c, 0x420f, 0x0ec6, 0xbf1f, 0x4636, 0xad48, 0x4181, 0x4155, 0x3050, 0x4001, 0xba03, 0x422b, 0x0266, 0xb0c4, 0xba50, 0xa8b4, 0x1e73, 0x41f5, 0xa645, 0x436a, 0x277c, 0x432a, 0x1b94, 0x1d44, 0xb294, 0x4080, 0x42a6, 0xb256, 0xbf2d, 0x1926, 0x4000, 0x4396, 0xb221, 0xb071, 0x0912, 0xba74, 0xb2d9, 0x3bd3, 0x45f5, 0x35e1, 0xb2a0, 0x42f2, 0x1e6b, 0x1595, 0x0e57, 0x42a0, 0x45d6, 0xba44, 0x41a2, 0xb26d, 0x43d3, 0xa79e, 0x434c, 0xbfd9, 0x40a3, 0x418c, 0xb230, 0x2774, 0x414a, 0x4385, 0xba77, 0x4019, 0x4202, 0x4251, 0xbafe, 0x4243, 0xb0e9, 0x1fc2, 0x4196, 0x2115, 0x4570, 0x420b, 0x4344, 0x40fc, 0x1820, 0xbf13, 0x40f3, 0xbaf1, 0x4280, 0x4110, 0x43ba, 0x25f9, 0x4175, 0xbfa0, 0x09ba, 0x35e7, 0x41ec, 0x12ba, 0xb249, 0xbade, 0x3bf7, 0x3c20, 0xba5f, 0x4094, 0x3b99, 0x2bb1, 0xb2e3, 0x4166, 0x402f, 0x414c, 0x425d, 0x415d, 0x43ba, 0x40da, 0xbfdf, 0x45e1, 0x412c, 0xb2da, 0x44d5, 0x4180, 0x3b39, 0x4221, 0xbf62, 0xba33, 0x42c8, 0xadf9, 0xb2af, 0xb28f, 0x4254, 0x4121, 0x393f, 0xa074, 0x4320, 0xb0ef, 0x400e, 0xbf37, 0x41a4, 0xbfb0, 0x39e8, 0x4226, 0xafd2, 0x400d, 0x435e, 0x42f0, 0xb223, 0x403e, 0xba0c, 0xb09d, 0x42a0, 0x2b3a, 0x4016, 0x4308, 0xae2c, 0x3e99, 0x06a6, 0x45cb, 0x0741, 0xba55, 0xbf93, 0x1c12, 0x40e2, 0x24c4, 0x1fb7, 0x41ca, 0x2258, 0xbf5d, 0x3ccc, 0x420f, 0x41d4, 0xba60, 0x402d, 0x40e3, 0xb261, 0xbfcd, 0x415d, 0xb01f, 0x1901, 0x420b, 0x1a54, 0x3fa6, 0x4021, 0x1dcc, 0xb260, 0x425f, 0xb038, 0xba79, 0xba11, 0x103d, 0x1f3c, 0xba7c, 0xb283, 0xbfba, 0xb24d, 0xb273, 0x3b72, 0x3c0a, 0x40ca, 0xb2c3, 0x3882, 0xb282, 0xba42, 0x402a, 0x4655, 0x43bf, 0x2362, 0x43c6, 0x4148, 0xb08d, 0x4072, 0xa1f3, 0x3784, 0xb2a2, 0x438a, 0xbf3c, 0x22a4, 0x401c, 0x4201, 0xa508, 0xbae9, 0x4490, 0xb2ea, 0x1de4, 0xbae9, 0x43ab, 0x3fcb, 0x4028, 0xa9ca, 0x1a68, 0x2cfc, 0xb01d, 0xbfb8, 0x406b, 0x3db1, 0x41ff, 0x2386, 0x3663, 0xb206, 0x421c, 0xab7f, 0x41c8, 0xba13, 0x2a54, 0x41db, 0x407d, 0xb066, 0xbf1f, 0x1a65, 0x1d6f, 0x066a, 0x428d, 0x4065, 0x404f, 0x1ac2, 0x44db, 0x0b90, 0x4488, 0x4255, 0x4550, 0xb0c3, 0x4291, 0x414c, 0xb2e4, 0x4231, 0x430e, 0xb240, 0x4003, 0x1210, 0x43b1, 0xb246, 0x4344, 0xbf4f, 0x44f9, 0xb218, 0xba07, 0x4053, 0xbf60, 0x4248, 0x1432, 0x45c3, 0x4083, 0x4403, 0x2f70, 0xbfb9, 0xaecd, 0xb050, 0x40e7, 0x409f, 0xaeeb, 0x40d6, 0x4315, 0x125b, 0x400b, 0xb0a3, 0x44db, 0xbf37, 0x4202, 0x4179, 0x1d0e, 0x2d2d, 0xa705, 0x43ee, 0x3206, 0x1586, 0xb25f, 0x37da, 0x423c, 0x4151, 0x401f, 0x04c3, 0x219b, 0x22dd, 0x402d, 0x1c87, 0x4201, 0x41bb, 0xbfa6, 0xb040, 0xaf1a, 0x4372, 0xbadd, 0xbf02, 0x0c72, 0xb20c, 0x41cd, 0xb2e9, 0x4115, 0x1f3c, 0x4000, 0x44e1, 0xb2c9, 0x31aa, 0xbac6, 0xb083, 0x2dc0, 0x432d, 0x2a5c, 0xb2d3, 0x4019, 0x46ed, 0xbf6f, 0x4322, 0x4466, 0xb249, 0x2cf1, 0x4387, 0x4170, 0x43e0, 0x40a7, 0x16ff, 0x1793, 0x29d4, 0xba1d, 0x2029, 0x4173, 0xb217, 0x434f, 0xb231, 0xa7fa, 0xbf5e, 0x43ce, 0xb0ae, 0x3cf2, 0x3a2e, 0x43c6, 0x2f25, 0x4304, 0x0394, 0x43de, 0x4312, 0x429c, 0x1fd2, 0xb2c4, 0x3066, 0x4159, 0x4192, 0x46f8, 0xbae6, 0x412d, 0x400d, 0x4272, 0x3c14, 0x427f, 0x447c, 0xb294, 0x4609, 0xbf88, 0x43c4, 0x35ea, 0x4308, 0xbacc, 0x42b6, 0x433f, 0xa5b2, 0x43f6, 0xb212, 0x0a9d, 0xbae2, 0x118e, 0x4214, 0x4344, 0x1ff4, 0x18ec, 0xb025, 0x1865, 0x04b5, 0xbf63, 0x4102, 0xbae5, 0x41a5, 0x40fc, 0x1fee, 0x42f4, 0x438e, 0x1d08, 0xb27c, 0xba61, 0x40b7, 0x03e2, 0x1bcf, 0x34ad, 0xb2b0, 0x007d, 0x3c4f, 0x41d8, 0x45d1, 0x41ac, 0x442b, 0x424d, 0x4279, 0xa121, 0x44a9, 0x41f3, 0x01c8, 0x40bd, 0x414f, 0xbfcf, 0xba19, 0x42ea, 0x2383, 0x00d8, 0xba6a, 0xba41, 0xb01c, 0x317c, 0x40a8, 0x401d, 0xb054, 0x400b, 0x1d1a, 0x1fd3, 0x1b51, 0xbfa8, 0x403c, 0xb003, 0x4336, 0x3dd6, 0x40d2, 0x410b, 0xafc3, 0xabd6, 0xa7d5, 0x02c0, 0x4201, 0x4242, 0xa5f6, 0xb061, 0xba2d, 0x1be8, 0x0262, 0x434c, 0xa56e, 0xbf95, 0xba08, 0x22fd, 0xb22d, 0xa383, 0x1876, 0x024b, 0x4134, 0x2c98, 0x4232, 0xa829, 0x41cc, 0x4237, 0x4287, 0x44db, 0x46fa, 0x415c, 0x432b, 0x416d, 0x4231, 0xaba6, 0xb208, 0x402f, 0xba7d, 0xa377, 0x4005, 0xacdb, 0xbfc2, 0x1ce5, 0xbf70, 0xb26c, 0x3bb5, 0x05cf, 0xb0f3, 0xb222, 0x4398, 0x4632, 0x4132, 0x4371, 0x1bd3, 0xb212, 0xbfac, 0xbf80, 0x41e2, 0xbf3e, 0x431e, 0x0ade, 0x4225, 0x26de, 0x4062, 0x4660, 0x4054, 0xbf5a, 0x43b4, 0x4282, 0x4255, 0x1cb3, 0x286c, 0xba6f, 0xabbd, 0xb0f6, 0x4206, 0x4154, 0x40f2, 0x42e7, 0x30f7, 0x4005, 0x45b6, 0xbf9f, 0x40a2, 0xb2b8, 0xba26, 0x2711, 0xad55, 0x4382, 0xb0b4, 0x1990, 0xba12, 0xb2e0, 0xba00, 0xa4f2, 0x4356, 0xb211, 0x435a, 0x4052, 0xaaa8, 0x404c, 0x41d0, 0x1cb9, 0xb28e, 0x41dc, 0x2275, 0x4492, 0x0359, 0xb2e5, 0xbf4e, 0x1301, 0x44d5, 0x4122, 0x39cf, 0x347b, 0x43cd, 0x28be, 0x1851, 0x1a41, 0x40e7, 0xba0e, 0x18bd, 0xb095, 0xb269, 0x4029, 0x1879, 0x1b1b, 0x4156, 0x4210, 0xbf3b, 0x44ac, 0x405e, 0x42b1, 0x4306, 0xb297, 0x4198, 0xb002, 0x4232, 0x3704, 0x3643, 0x4220, 0xbf9a, 0x3986, 0xb2a7, 0x412d, 0x416f, 0x3c6c, 0xba06, 0x1bda, 0x435d, 0x421d, 0x41cf, 0xa2e4, 0x1cf3, 0x442b, 0x40ec, 0xb281, 0x1ebc, 0x4373, 0x40c9, 0xac98, 0xbff0, 0xa100, 0x409f, 0xb290, 0x41f9, 0x1733, 0xb255, 0x1efe, 0x4004, 0xbf3e, 0xb0c3, 0x4023, 0x09b0, 0x0995, 0x1ec1, 0x2998, 0xba06, 0x1e93, 0x43cc, 0xb2de, 0x42d3, 0x41ac, 0x4354, 0x4013, 0xa9a8, 0xbfd4, 0xb241, 0x4022, 0x1dcf, 0xb0ee, 0x43cc, 0x1a03, 0xbac9, 0x1b7e, 0x4311, 0x439e, 0xbf8a, 0x025e, 0x43b7, 0xa7ed, 0x4276, 0x4200, 0x42fa, 0xb04a, 0xa648, 0x418e, 0x40bd, 0x09bd, 0xbaec, 0x42d1, 0x2ede, 0x1b6e, 0x06b5, 0x08c6, 0xb2ba, 0xb2f6, 0x1d2f, 0x1aac, 0xba61, 0xbf2d, 0xb283, 0x4311, 0xb203, 0x4193, 0xa79a, 0x1eb0, 0x436e, 0xba53, 0x4612, 0x42d8, 0xb202, 0x3e0c, 0xaf8a, 0xba34, 0x4084, 0xabe0, 0x19fe, 0x4331, 0x4337, 0xb247, 0x4647, 0x407b, 0x31ff, 0xbf1c, 0x4148, 0x385b, 0x3fa5, 0xb2e5, 0x1e35, 0x087e, 0xaef2, 0xb093, 0x424c, 0xb227, 0x43dc, 0x102d, 0x4612, 0xb2c3, 0xb221, 0xb2ac, 0xbf24, 0x4359, 0x42b6, 0xb25d, 0x3d87, 0x42e8, 0xbaea, 0x436d, 0x1a91, 0xbafc, 0x42db, 0xa79c, 0x1946, 0x4140, 0x40af, 0x4095, 0x1ce6, 0x12fc, 0x2a6a, 0x40fd, 0x1e44, 0xbf75, 0x1ecd, 0x4114, 0x1fb8, 0xb07d, 0x41e1, 0x4306, 0x4040, 0x4007, 0xba64, 0xbf70, 0x4011, 0xbf39, 0x40be, 0xb257, 0xb05a, 0xb000, 0x2cf7, 0x0fae, 0xaa47, 0xbf1f, 0x4095, 0x43a6, 0xbfc0, 0x34a2, 0x3dc5, 0x42fe, 0x4329, 0x4135, 0xbae2, 0x46b9, 0xbfdb, 0x1c14, 0x4482, 0x432a, 0xb29a, 0x1fb4, 0x1869, 0x199f, 0x43b6, 0x3cd5, 0x437e, 0x2331, 0xb201, 0x4348, 0x2663, 0x41c9, 0x421e, 0xb2a6, 0x41a1, 0xbfc4, 0x3897, 0x4458, 0x41a9, 0xb2c6, 0xbfbf, 0xbf70, 0x1c52, 0x4132, 0x1e34, 0x0d87, 0xbae6, 0xb2b4, 0x2385, 0x41c1, 0x42ab, 0x1a6a, 0x07b7, 0x40aa, 0xbf21, 0x403b, 0xbaee, 0x43d9, 0x43ef, 0x41ab, 0x426c, 0x4280, 0x4019, 0xbf60, 0x4245, 0x1f77, 0x4061, 0xba66, 0x4086, 0x337a, 0x1942, 0x2580, 0x0667, 0x40dd, 0x4135, 0xbf56, 0x408c, 0xb2b1, 0xba18, 0xb2ac, 0xbf1b, 0x42d0, 0xb0c8, 0x418c, 0xb283, 0xaf4c, 0x1bab, 0xb047, 0xb092, 0x16b1, 0xbae1, 0xa058, 0xa49b, 0x4007, 0xaca0, 0x1e8e, 0x41dc, 0x4065, 0x3fbb, 0x4192, 0x191a, 0xb263, 0xbfa9, 0x4384, 0x438c, 0x46da, 0x1e3b, 0x1cc2, 0x43a3, 0xba39, 0xbfa5, 0xb0bf, 0x1e42, 0x1a0a, 0x1cad, 0x401c, 0x439f, 0xa4ab, 0x4302, 0x4484, 0x40d3, 0xbfd0, 0x41cd, 0x3bc6, 0x1fc1, 0x41b9, 0xb255, 0x41c4, 0xba13, 0xb298, 0x2459, 0x054c, 0xbfd4, 0x41d4, 0x1b7d, 0x1d2c, 0x2806, 0x1bec, 0xb2f3, 0x268c, 0x4131, 0x42cb, 0x4146, 0xbf8a, 0x42c8, 0x4057, 0xa7d7, 0x36f5, 0xb082, 0x439c, 0x42cf, 0x454e, 0x403b, 0xb225, 0x1e75, 0x4357, 0x2f15, 0x4096, 0x314f, 0xa555, 0xba10, 0x4003, 0x3197, 0xba21, 0x40a5, 0xbf9f, 0x41cd, 0x24ad, 0xaf2c, 0x42d0, 0x38f1, 0x407c, 0x429e, 0xb03e, 0xbf1f, 0x40c7, 0xb294, 0xa6a8, 0x387d, 0x1236, 0x4148, 0x3c48, 0xbf76, 0x00f5, 0xb2bf, 0x12a8, 0x423b, 0x41c2, 0x4206, 0xb0a4, 0x0c83, 0x40ff, 0x4138, 0xbfb0, 0x1b14, 0x4228, 0x3697, 0x3a11, 0x4107, 0xbafd, 0x447c, 0x43a3, 0xb28f, 0x4246, 0x454f, 0x432e, 0xbfdc, 0xb2d1, 0x437e, 0x4770, 0xe7fe + ], + StartRegs = [0xcc2ef87d, 0xae95a3fd, 0x5e6e0ca5, 0x1ef09cca, 0x00ea6c00, 0x963e3b79, 0xc2107f27, 0x7b8c8e2a, 0xa52501a4, 0xdd47e07c, 0x58514dc3, 0xb401ec82, 0x88632001, 0xabb2221b, 0x00000000, 0x900001f0 + ], + FinalRegs = [0x00000000, 0x0000003e, 0x0000183e, 0x00000000, 0x544dfc0a, 0x00000000, 0x00000000, 0x0000ffff, 0x0000133c, 0xffffffff, 0x0000148f, 0xa00f6410, 0x88633849, 0xabb2349a, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x1a9a, 0xaba5, 0x42a3, 0x4339, 0x43b9, 0xb263, 0xb077, 0xbf80, 0x409b, 0x4178, 0xba22, 0x439a, 0x428e, 0xb0b6, 0x404e, 0x1ae0, 0xba1e, 0x0e81, 0x41c2, 0xbfb8, 0x40e2, 0x18d2, 0x462c, 0x43c9, 0x1e7d, 0xb21b, 0x43ce, 0x45b5, 0x42d0, 0xb038, 0x42c9, 0x4238, 0x1e37, 0x42b5, 0x41cc, 0x42f9, 0xb072, 0x4154, 0x030b, 0x4384, 0x42d6, 0x46a8, 0xbf6c, 0x0ce2, 0xb24b, 0x4305, 0x4418, 0xb006, 0x404c, 0x438f, 0x438f, 0x0532, 0x41e4, 0x4290, 0x4019, 0xba4e, 0xbf54, 0x412d, 0x4202, 0x4208, 0x4614, 0x193b, 0xbf57, 0x3ef2, 0x4692, 0xbaf4, 0xad07, 0xba72, 0x4549, 0xb22f, 0x40a5, 0x4184, 0x1cf9, 0x416c, 0x421a, 0x4371, 0xba66, 0xba38, 0x1c55, 0xaa65, 0xaa8c, 0x4070, 0x0cf2, 0x1ff4, 0x1a0b, 0xbfad, 0xb219, 0x400b, 0x2178, 0x1d28, 0x43f7, 0x419f, 0x421b, 0x1f66, 0x40a0, 0x4224, 0x4370, 0x4325, 0x37c4, 0xa62d, 0xb080, 0x43e0, 0xb2a1, 0x00db, 0xab3b, 0xbf15, 0x40ae, 0x109e, 0x3d73, 0x1fc1, 0x19fb, 0x3e2e, 0x42d5, 0x1946, 0x419c, 0x4135, 0x02c7, 0x46fb, 0xb22c, 0x40b6, 0x43a1, 0x4229, 0x4382, 0x42c3, 0x422d, 0x3ecb, 0x4289, 0x407d, 0xb090, 0xbf12, 0x0c06, 0xba06, 0x4324, 0x439b, 0x440d, 0x4177, 0x41a8, 0x41d5, 0x4282, 0xbaff, 0xbfc0, 0x3148, 0x4294, 0xbfb0, 0x1b88, 0x1f7c, 0xb2ba, 0xbf9f, 0x4085, 0x421a, 0xb2d2, 0x1e81, 0x40e0, 0x41c4, 0xbade, 0x19d2, 0x4289, 0xb237, 0xba1c, 0xba3c, 0x41e1, 0xba5e, 0xb2b8, 0x41f3, 0x423a, 0xb272, 0x40d7, 0x41d2, 0x4046, 0xbf88, 0x40d6, 0x4045, 0x43ff, 0x18df, 0xa909, 0x40cf, 0x42bc, 0x4198, 0x0130, 0x071f, 0x427e, 0x45a3, 0x1b5c, 0xbf0a, 0xb222, 0x3b72, 0x4039, 0x43af, 0x1dfe, 0x4338, 0xbfc2, 0x43f5, 0x41f6, 0x4012, 0x416e, 0x1d8b, 0x1ff4, 0xb2e2, 0x29ae, 0xa123, 0xb2ef, 0xbf26, 0x1f7f, 0x347b, 0x3277, 0x41e4, 0x43b0, 0x41b1, 0x4193, 0xbf05, 0xba7f, 0xb26d, 0x2ee4, 0x1eb0, 0x43dd, 0x413e, 0x4072, 0x1b4b, 0x4047, 0xb2ae, 0xbaf6, 0x41d7, 0xa6ec, 0xbfdb, 0xb250, 0x4057, 0x2618, 0xb282, 0x4321, 0x4288, 0x400d, 0x4138, 0xa678, 0xa9a6, 0xba47, 0xb2e9, 0x1995, 0x43d3, 0x4237, 0xb03d, 0x4144, 0x46a2, 0xb206, 0x1d19, 0x1b25, 0x4389, 0x4104, 0xb066, 0x1d21, 0x1f7e, 0x2adb, 0xbfd2, 0xa0ea, 0xa87a, 0x4382, 0xb018, 0x44ba, 0x425f, 0x3c44, 0x40eb, 0x43b6, 0xb0a6, 0xba7c, 0xba0c, 0xaeec, 0x4592, 0xb036, 0xbf15, 0xba48, 0xb076, 0x4042, 0xac7c, 0x4560, 0x4003, 0xb03b, 0x1bc1, 0x0ad5, 0x4293, 0xb262, 0x1c32, 0x199d, 0x435d, 0xbf80, 0x2273, 0xb2b2, 0x427b, 0x23cc, 0xb251, 0xb09b, 0x42c1, 0x37da, 0x437a, 0xb022, 0x4384, 0x4280, 0x2b09, 0x4396, 0xbfb8, 0xb09d, 0xaebd, 0xbf34, 0x4346, 0x169e, 0x425d, 0xb036, 0x1e3d, 0x1384, 0xb00e, 0x1cce, 0x135c, 0x4266, 0x025b, 0x46cd, 0x3cf3, 0xbf9d, 0x43d8, 0x41be, 0x2ba8, 0x1ba7, 0x43b3, 0x1ae9, 0xbad7, 0x4019, 0x1deb, 0x292d, 0x413c, 0x4096, 0xb203, 0x4033, 0x1e9e, 0x40c4, 0x2339, 0xb228, 0xb090, 0xbf2a, 0x4172, 0xb22f, 0x4418, 0x162b, 0x4061, 0xa58e, 0xba40, 0x42e7, 0x41e1, 0xb27b, 0x1c28, 0x45ae, 0x41a1, 0x4383, 0x4149, 0x4382, 0x1e4c, 0xbf14, 0x40bd, 0x4209, 0x401c, 0x0482, 0x42f0, 0x4681, 0x43d3, 0x4226, 0xadee, 0x1e44, 0xb0ad, 0x417e, 0x1efc, 0xbf49, 0xb22f, 0x2bad, 0x42a4, 0x42b2, 0xba1f, 0x4562, 0x40d3, 0x4619, 0xbae8, 0xba17, 0x4154, 0xbf6a, 0x407f, 0x40e1, 0x4359, 0x42f3, 0x137f, 0xb2b2, 0x419e, 0xbf0a, 0x4277, 0x41ca, 0x4025, 0x41f8, 0x11b6, 0xb015, 0x42bc, 0xb098, 0xbf26, 0x4382, 0xba65, 0x2399, 0x44e3, 0x1b58, 0x4395, 0x30cc, 0x41c1, 0x41fa, 0x4632, 0xa687, 0x192f, 0x3f96, 0x45d8, 0x41b2, 0x4075, 0x4080, 0xbf9f, 0x43b9, 0x1902, 0x1a58, 0xb003, 0xa201, 0xb28f, 0x405c, 0x41d8, 0xb0cb, 0x42ba, 0x43c2, 0x40fa, 0x4331, 0xb294, 0xb205, 0xb0a7, 0xbfc2, 0x4268, 0x403f, 0x40bf, 0x41e1, 0x407b, 0x4013, 0x2de8, 0xbf75, 0xb039, 0x1f48, 0x428a, 0x4226, 0xba11, 0x0c28, 0x338a, 0x1d9a, 0xb075, 0x3f72, 0x3f5e, 0x4165, 0x4585, 0x3a3d, 0x427e, 0xb0b8, 0xa4b0, 0x436a, 0x4385, 0xbf02, 0x45ba, 0xb07c, 0x42b1, 0xb26b, 0xb22a, 0x4297, 0x1bda, 0x4634, 0x0a08, 0x43e7, 0x169b, 0xa98d, 0x43e2, 0x42f6, 0x42c1, 0x41c2, 0x1cfd, 0xbf48, 0x40b7, 0x40de, 0x1f98, 0xb246, 0xb03d, 0x1e78, 0x3ac4, 0x407d, 0x1862, 0xb238, 0x2451, 0xba4a, 0x445e, 0x1a72, 0x4252, 0x1d66, 0xbf41, 0x42df, 0x31d5, 0xb095, 0x41d9, 0x434b, 0x4303, 0x2470, 0x1dff, 0x469a, 0x45b8, 0x418e, 0x456e, 0x4417, 0xba49, 0xb2b7, 0x4228, 0xa06c, 0x41e7, 0xa99b, 0x36cf, 0x46c4, 0x1852, 0x142a, 0xbfce, 0x06af, 0x4135, 0xb260, 0x3bfc, 0x410a, 0xbf90, 0xb0ca, 0x4165, 0xbf2d, 0x4001, 0x42d4, 0x2d2d, 0x46e0, 0x190d, 0xbfba, 0x18a6, 0xb240, 0x4309, 0x1378, 0x466f, 0x41e6, 0xb079, 0x188f, 0x4012, 0xba77, 0x082f, 0x4018, 0xba48, 0x1786, 0xbac1, 0x1734, 0xbf73, 0x1a6e, 0x4295, 0x1bc2, 0x1956, 0x4196, 0x0623, 0x3a43, 0x4197, 0xbf91, 0xb283, 0x4234, 0x0324, 0x4663, 0x4050, 0x4364, 0xb237, 0xb22e, 0x362c, 0xb21f, 0x2ab6, 0x3262, 0x1b32, 0xbf49, 0xaf0d, 0xb2d7, 0xba6d, 0x43e4, 0xb2a6, 0xb20d, 0x390c, 0xbfcf, 0x1a4a, 0xb2df, 0x447c, 0x4555, 0x437d, 0x412f, 0xbf90, 0xb0fe, 0x43bc, 0xb210, 0xb22b, 0xba63, 0xba2e, 0x4293, 0xb015, 0x0ba7, 0xbf92, 0x1956, 0x413e, 0x40db, 0xa728, 0x4360, 0x04c0, 0xb060, 0x41fa, 0x460d, 0x4168, 0xb24f, 0xaff6, 0x4284, 0x4018, 0x002e, 0x43ea, 0xbfb4, 0x3528, 0x40d5, 0xba2d, 0x4296, 0x1e62, 0x44d9, 0x189c, 0xb0c5, 0x4485, 0xb2b2, 0x42e6, 0x432f, 0x26d4, 0xa09d, 0x0530, 0xb0df, 0x42af, 0x4367, 0x1aff, 0x40c6, 0x2ceb, 0xba26, 0x4337, 0x4013, 0x42a1, 0xbf47, 0x1a0a, 0x435d, 0x4602, 0x26ee, 0x4313, 0x4128, 0x4135, 0x1ada, 0x1f63, 0x40be, 0x1a3d, 0xac4c, 0x40dd, 0x2cc1, 0x206b, 0x4224, 0xbf4e, 0xb2b9, 0x2ace, 0x1fba, 0xbad6, 0x42b6, 0xbf3e, 0xba6f, 0x41a1, 0xb0c5, 0x20d2, 0xb243, 0x1113, 0xba49, 0x04a8, 0xb253, 0xb0e5, 0xb27b, 0xba5e, 0x1f73, 0x4165, 0xb2e0, 0xb239, 0x4044, 0x431f, 0xb2ed, 0x047d, 0x2407, 0x464b, 0x1298, 0xbfc3, 0x4216, 0x1e84, 0x40c9, 0x4383, 0xb0de, 0x410b, 0xb03b, 0x41a5, 0x409b, 0x1186, 0xbfd2, 0x442c, 0xb0ed, 0x1b84, 0x06a9, 0x43d7, 0xb2ee, 0x4370, 0x420f, 0x41a9, 0x4281, 0xbf00, 0xbac5, 0xad27, 0x1f67, 0x4304, 0xbfe0, 0x4079, 0xba16, 0x425e, 0xbf2a, 0xb00d, 0xa749, 0x3c0b, 0xb00e, 0x19d6, 0xb264, 0x433f, 0x2049, 0x406c, 0xbf61, 0x420e, 0x4223, 0x41b5, 0x418e, 0x4032, 0x4012, 0x4379, 0x4323, 0x3185, 0x43ba, 0x4190, 0xb093, 0xafab, 0x4592, 0xb0b0, 0xbfae, 0x173a, 0x412d, 0x4273, 0x2c58, 0x183c, 0x4389, 0x420c, 0xb211, 0x4304, 0x43e2, 0x41eb, 0x335a, 0x431e, 0x1a7d, 0x4119, 0x12ff, 0xbf3a, 0x42c1, 0x1ea5, 0xb060, 0x4222, 0xb0d4, 0xa12d, 0x4217, 0x0a9a, 0xaa17, 0x4206, 0x445f, 0x4348, 0x20b4, 0xb209, 0xbf11, 0x4072, 0x4023, 0xbadf, 0x41f3, 0x43bf, 0xa351, 0xb266, 0x43a0, 0x1e38, 0x43a9, 0xb24b, 0x2ade, 0x4167, 0x3e49, 0x41f3, 0x4103, 0x0576, 0x433e, 0x42d4, 0xbf91, 0xb2f7, 0x45c9, 0x41b5, 0x4040, 0x3aff, 0xbac7, 0xb213, 0x4192, 0xbf00, 0xb205, 0x43e9, 0x4264, 0x1c65, 0x41e6, 0x45f4, 0xbf7b, 0x4290, 0x42dd, 0x1e56, 0xbadf, 0xb03a, 0xadad, 0x42f2, 0x404b, 0x4635, 0x1eaf, 0x46a5, 0xb25c, 0x2d7c, 0x4053, 0x4005, 0xb068, 0x42b6, 0x1a03, 0x4346, 0xa2f9, 0x402f, 0x40ed, 0xbf51, 0x4694, 0x23a6, 0x1a50, 0x29c4, 0x404b, 0x1283, 0x425c, 0x1de7, 0x40ad, 0xb205, 0x402f, 0x4399, 0x1cb5, 0x430e, 0xb2ba, 0x19d9, 0xbf1f, 0x43f4, 0x41df, 0x1cc0, 0x407d, 0x430f, 0xbf06, 0x43e0, 0xad43, 0x065c, 0x42ed, 0x260a, 0xba07, 0x4415, 0xb0c3, 0x419b, 0x180a, 0xb049, 0x38a3, 0xbf93, 0xb0f3, 0x1c0b, 0xb241, 0x417f, 0xbf9f, 0x428f, 0x39fb, 0x45e5, 0x407d, 0x4664, 0x4202, 0xbaf6, 0x43c1, 0x42a5, 0x409e, 0x4049, 0x0925, 0xadf3, 0x0581, 0x4043, 0x1a2c, 0x42ca, 0x1b73, 0xbfaa, 0xb248, 0x42bb, 0xb253, 0xb254, 0x4432, 0x43ac, 0xbaf8, 0xba1e, 0x27ea, 0xbf55, 0x17bc, 0x4193, 0x0a07, 0x198a, 0x41f9, 0xbf95, 0x4370, 0x2713, 0x3500, 0x4093, 0x41df, 0xba7c, 0x19ec, 0xb21f, 0x357a, 0x0226, 0x3727, 0x43db, 0xb0a4, 0x4017, 0xa52a, 0x4381, 0x40ae, 0xb258, 0x2d00, 0x2206, 0x4286, 0xa01c, 0x4452, 0x43b3, 0xaf31, 0x4208, 0x4342, 0x1cc8, 0x41e0, 0xbf88, 0x02a7, 0xb002, 0x394d, 0xb0f4, 0x43c2, 0x42f8, 0x413a, 0x411c, 0xbace, 0x3d27, 0x42d9, 0x1410, 0x3a6d, 0x4106, 0x027a, 0x4346, 0x408a, 0x43bb, 0x43c6, 0x41b2, 0xbf08, 0x1c77, 0x421b, 0x1322, 0x4425, 0xbace, 0x2ecb, 0x43ad, 0x4415, 0x414a, 0x420e, 0xba66, 0x41a3, 0x40eb, 0x3809, 0x2732, 0xb0b1, 0xb2dc, 0x3668, 0xbf89, 0x413a, 0xb03e, 0x3a5e, 0x41cd, 0xbf37, 0x4372, 0xb2db, 0xacdb, 0x086c, 0x42be, 0x4275, 0xbafd, 0x422b, 0x1bcc, 0x4272, 0x41c1, 0x0e46, 0x433d, 0xbfc1, 0x0ce0, 0xaaad, 0x1982, 0x42cb, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x46ce3787, 0x91b9dd82, 0x5c30a10f, 0x98b32b04, 0x61635373, 0xdfb71ffc, 0x105be440, 0x6bd3228d, 0x9979b985, 0xe4135b49, 0x78e8170d, 0x00193fd1, 0xf7f4c7a5, 0x0e660f37, 0x00000000, 0xd00001f0 }, - FinalRegs = new uint[] { 0x00001fff, 0xfffecfff, 0x0000207e, 0xe413586f, 0xffffff81, 0x00003232, 0x0000007f, 0x00000032, 0x6bd3228c, 0xf7f4ed77, 0x00000000, 0xf7f4d893, 0x00001a68, 0x1beca537, 0x00000000, 0xa00001d0 }, + Instructions = [0x1a9a, 0xaba5, 0x42a3, 0x4339, 0x43b9, 0xb263, 0xb077, 0xbf80, 0x409b, 0x4178, 0xba22, 0x439a, 0x428e, 0xb0b6, 0x404e, 0x1ae0, 0xba1e, 0x0e81, 0x41c2, 0xbfb8, 0x40e2, 0x18d2, 0x462c, 0x43c9, 0x1e7d, 0xb21b, 0x43ce, 0x45b5, 0x42d0, 0xb038, 0x42c9, 0x4238, 0x1e37, 0x42b5, 0x41cc, 0x42f9, 0xb072, 0x4154, 0x030b, 0x4384, 0x42d6, 0x46a8, 0xbf6c, 0x0ce2, 0xb24b, 0x4305, 0x4418, 0xb006, 0x404c, 0x438f, 0x438f, 0x0532, 0x41e4, 0x4290, 0x4019, 0xba4e, 0xbf54, 0x412d, 0x4202, 0x4208, 0x4614, 0x193b, 0xbf57, 0x3ef2, 0x4692, 0xbaf4, 0xad07, 0xba72, 0x4549, 0xb22f, 0x40a5, 0x4184, 0x1cf9, 0x416c, 0x421a, 0x4371, 0xba66, 0xba38, 0x1c55, 0xaa65, 0xaa8c, 0x4070, 0x0cf2, 0x1ff4, 0x1a0b, 0xbfad, 0xb219, 0x400b, 0x2178, 0x1d28, 0x43f7, 0x419f, 0x421b, 0x1f66, 0x40a0, 0x4224, 0x4370, 0x4325, 0x37c4, 0xa62d, 0xb080, 0x43e0, 0xb2a1, 0x00db, 0xab3b, 0xbf15, 0x40ae, 0x109e, 0x3d73, 0x1fc1, 0x19fb, 0x3e2e, 0x42d5, 0x1946, 0x419c, 0x4135, 0x02c7, 0x46fb, 0xb22c, 0x40b6, 0x43a1, 0x4229, 0x4382, 0x42c3, 0x422d, 0x3ecb, 0x4289, 0x407d, 0xb090, 0xbf12, 0x0c06, 0xba06, 0x4324, 0x439b, 0x440d, 0x4177, 0x41a8, 0x41d5, 0x4282, 0xbaff, 0xbfc0, 0x3148, 0x4294, 0xbfb0, 0x1b88, 0x1f7c, 0xb2ba, 0xbf9f, 0x4085, 0x421a, 0xb2d2, 0x1e81, 0x40e0, 0x41c4, 0xbade, 0x19d2, 0x4289, 0xb237, 0xba1c, 0xba3c, 0x41e1, 0xba5e, 0xb2b8, 0x41f3, 0x423a, 0xb272, 0x40d7, 0x41d2, 0x4046, 0xbf88, 0x40d6, 0x4045, 0x43ff, 0x18df, 0xa909, 0x40cf, 0x42bc, 0x4198, 0x0130, 0x071f, 0x427e, 0x45a3, 0x1b5c, 0xbf0a, 0xb222, 0x3b72, 0x4039, 0x43af, 0x1dfe, 0x4338, 0xbfc2, 0x43f5, 0x41f6, 0x4012, 0x416e, 0x1d8b, 0x1ff4, 0xb2e2, 0x29ae, 0xa123, 0xb2ef, 0xbf26, 0x1f7f, 0x347b, 0x3277, 0x41e4, 0x43b0, 0x41b1, 0x4193, 0xbf05, 0xba7f, 0xb26d, 0x2ee4, 0x1eb0, 0x43dd, 0x413e, 0x4072, 0x1b4b, 0x4047, 0xb2ae, 0xbaf6, 0x41d7, 0xa6ec, 0xbfdb, 0xb250, 0x4057, 0x2618, 0xb282, 0x4321, 0x4288, 0x400d, 0x4138, 0xa678, 0xa9a6, 0xba47, 0xb2e9, 0x1995, 0x43d3, 0x4237, 0xb03d, 0x4144, 0x46a2, 0xb206, 0x1d19, 0x1b25, 0x4389, 0x4104, 0xb066, 0x1d21, 0x1f7e, 0x2adb, 0xbfd2, 0xa0ea, 0xa87a, 0x4382, 0xb018, 0x44ba, 0x425f, 0x3c44, 0x40eb, 0x43b6, 0xb0a6, 0xba7c, 0xba0c, 0xaeec, 0x4592, 0xb036, 0xbf15, 0xba48, 0xb076, 0x4042, 0xac7c, 0x4560, 0x4003, 0xb03b, 0x1bc1, 0x0ad5, 0x4293, 0xb262, 0x1c32, 0x199d, 0x435d, 0xbf80, 0x2273, 0xb2b2, 0x427b, 0x23cc, 0xb251, 0xb09b, 0x42c1, 0x37da, 0x437a, 0xb022, 0x4384, 0x4280, 0x2b09, 0x4396, 0xbfb8, 0xb09d, 0xaebd, 0xbf34, 0x4346, 0x169e, 0x425d, 0xb036, 0x1e3d, 0x1384, 0xb00e, 0x1cce, 0x135c, 0x4266, 0x025b, 0x46cd, 0x3cf3, 0xbf9d, 0x43d8, 0x41be, 0x2ba8, 0x1ba7, 0x43b3, 0x1ae9, 0xbad7, 0x4019, 0x1deb, 0x292d, 0x413c, 0x4096, 0xb203, 0x4033, 0x1e9e, 0x40c4, 0x2339, 0xb228, 0xb090, 0xbf2a, 0x4172, 0xb22f, 0x4418, 0x162b, 0x4061, 0xa58e, 0xba40, 0x42e7, 0x41e1, 0xb27b, 0x1c28, 0x45ae, 0x41a1, 0x4383, 0x4149, 0x4382, 0x1e4c, 0xbf14, 0x40bd, 0x4209, 0x401c, 0x0482, 0x42f0, 0x4681, 0x43d3, 0x4226, 0xadee, 0x1e44, 0xb0ad, 0x417e, 0x1efc, 0xbf49, 0xb22f, 0x2bad, 0x42a4, 0x42b2, 0xba1f, 0x4562, 0x40d3, 0x4619, 0xbae8, 0xba17, 0x4154, 0xbf6a, 0x407f, 0x40e1, 0x4359, 0x42f3, 0x137f, 0xb2b2, 0x419e, 0xbf0a, 0x4277, 0x41ca, 0x4025, 0x41f8, 0x11b6, 0xb015, 0x42bc, 0xb098, 0xbf26, 0x4382, 0xba65, 0x2399, 0x44e3, 0x1b58, 0x4395, 0x30cc, 0x41c1, 0x41fa, 0x4632, 0xa687, 0x192f, 0x3f96, 0x45d8, 0x41b2, 0x4075, 0x4080, 0xbf9f, 0x43b9, 0x1902, 0x1a58, 0xb003, 0xa201, 0xb28f, 0x405c, 0x41d8, 0xb0cb, 0x42ba, 0x43c2, 0x40fa, 0x4331, 0xb294, 0xb205, 0xb0a7, 0xbfc2, 0x4268, 0x403f, 0x40bf, 0x41e1, 0x407b, 0x4013, 0x2de8, 0xbf75, 0xb039, 0x1f48, 0x428a, 0x4226, 0xba11, 0x0c28, 0x338a, 0x1d9a, 0xb075, 0x3f72, 0x3f5e, 0x4165, 0x4585, 0x3a3d, 0x427e, 0xb0b8, 0xa4b0, 0x436a, 0x4385, 0xbf02, 0x45ba, 0xb07c, 0x42b1, 0xb26b, 0xb22a, 0x4297, 0x1bda, 0x4634, 0x0a08, 0x43e7, 0x169b, 0xa98d, 0x43e2, 0x42f6, 0x42c1, 0x41c2, 0x1cfd, 0xbf48, 0x40b7, 0x40de, 0x1f98, 0xb246, 0xb03d, 0x1e78, 0x3ac4, 0x407d, 0x1862, 0xb238, 0x2451, 0xba4a, 0x445e, 0x1a72, 0x4252, 0x1d66, 0xbf41, 0x42df, 0x31d5, 0xb095, 0x41d9, 0x434b, 0x4303, 0x2470, 0x1dff, 0x469a, 0x45b8, 0x418e, 0x456e, 0x4417, 0xba49, 0xb2b7, 0x4228, 0xa06c, 0x41e7, 0xa99b, 0x36cf, 0x46c4, 0x1852, 0x142a, 0xbfce, 0x06af, 0x4135, 0xb260, 0x3bfc, 0x410a, 0xbf90, 0xb0ca, 0x4165, 0xbf2d, 0x4001, 0x42d4, 0x2d2d, 0x46e0, 0x190d, 0xbfba, 0x18a6, 0xb240, 0x4309, 0x1378, 0x466f, 0x41e6, 0xb079, 0x188f, 0x4012, 0xba77, 0x082f, 0x4018, 0xba48, 0x1786, 0xbac1, 0x1734, 0xbf73, 0x1a6e, 0x4295, 0x1bc2, 0x1956, 0x4196, 0x0623, 0x3a43, 0x4197, 0xbf91, 0xb283, 0x4234, 0x0324, 0x4663, 0x4050, 0x4364, 0xb237, 0xb22e, 0x362c, 0xb21f, 0x2ab6, 0x3262, 0x1b32, 0xbf49, 0xaf0d, 0xb2d7, 0xba6d, 0x43e4, 0xb2a6, 0xb20d, 0x390c, 0xbfcf, 0x1a4a, 0xb2df, 0x447c, 0x4555, 0x437d, 0x412f, 0xbf90, 0xb0fe, 0x43bc, 0xb210, 0xb22b, 0xba63, 0xba2e, 0x4293, 0xb015, 0x0ba7, 0xbf92, 0x1956, 0x413e, 0x40db, 0xa728, 0x4360, 0x04c0, 0xb060, 0x41fa, 0x460d, 0x4168, 0xb24f, 0xaff6, 0x4284, 0x4018, 0x002e, 0x43ea, 0xbfb4, 0x3528, 0x40d5, 0xba2d, 0x4296, 0x1e62, 0x44d9, 0x189c, 0xb0c5, 0x4485, 0xb2b2, 0x42e6, 0x432f, 0x26d4, 0xa09d, 0x0530, 0xb0df, 0x42af, 0x4367, 0x1aff, 0x40c6, 0x2ceb, 0xba26, 0x4337, 0x4013, 0x42a1, 0xbf47, 0x1a0a, 0x435d, 0x4602, 0x26ee, 0x4313, 0x4128, 0x4135, 0x1ada, 0x1f63, 0x40be, 0x1a3d, 0xac4c, 0x40dd, 0x2cc1, 0x206b, 0x4224, 0xbf4e, 0xb2b9, 0x2ace, 0x1fba, 0xbad6, 0x42b6, 0xbf3e, 0xba6f, 0x41a1, 0xb0c5, 0x20d2, 0xb243, 0x1113, 0xba49, 0x04a8, 0xb253, 0xb0e5, 0xb27b, 0xba5e, 0x1f73, 0x4165, 0xb2e0, 0xb239, 0x4044, 0x431f, 0xb2ed, 0x047d, 0x2407, 0x464b, 0x1298, 0xbfc3, 0x4216, 0x1e84, 0x40c9, 0x4383, 0xb0de, 0x410b, 0xb03b, 0x41a5, 0x409b, 0x1186, 0xbfd2, 0x442c, 0xb0ed, 0x1b84, 0x06a9, 0x43d7, 0xb2ee, 0x4370, 0x420f, 0x41a9, 0x4281, 0xbf00, 0xbac5, 0xad27, 0x1f67, 0x4304, 0xbfe0, 0x4079, 0xba16, 0x425e, 0xbf2a, 0xb00d, 0xa749, 0x3c0b, 0xb00e, 0x19d6, 0xb264, 0x433f, 0x2049, 0x406c, 0xbf61, 0x420e, 0x4223, 0x41b5, 0x418e, 0x4032, 0x4012, 0x4379, 0x4323, 0x3185, 0x43ba, 0x4190, 0xb093, 0xafab, 0x4592, 0xb0b0, 0xbfae, 0x173a, 0x412d, 0x4273, 0x2c58, 0x183c, 0x4389, 0x420c, 0xb211, 0x4304, 0x43e2, 0x41eb, 0x335a, 0x431e, 0x1a7d, 0x4119, 0x12ff, 0xbf3a, 0x42c1, 0x1ea5, 0xb060, 0x4222, 0xb0d4, 0xa12d, 0x4217, 0x0a9a, 0xaa17, 0x4206, 0x445f, 0x4348, 0x20b4, 0xb209, 0xbf11, 0x4072, 0x4023, 0xbadf, 0x41f3, 0x43bf, 0xa351, 0xb266, 0x43a0, 0x1e38, 0x43a9, 0xb24b, 0x2ade, 0x4167, 0x3e49, 0x41f3, 0x4103, 0x0576, 0x433e, 0x42d4, 0xbf91, 0xb2f7, 0x45c9, 0x41b5, 0x4040, 0x3aff, 0xbac7, 0xb213, 0x4192, 0xbf00, 0xb205, 0x43e9, 0x4264, 0x1c65, 0x41e6, 0x45f4, 0xbf7b, 0x4290, 0x42dd, 0x1e56, 0xbadf, 0xb03a, 0xadad, 0x42f2, 0x404b, 0x4635, 0x1eaf, 0x46a5, 0xb25c, 0x2d7c, 0x4053, 0x4005, 0xb068, 0x42b6, 0x1a03, 0x4346, 0xa2f9, 0x402f, 0x40ed, 0xbf51, 0x4694, 0x23a6, 0x1a50, 0x29c4, 0x404b, 0x1283, 0x425c, 0x1de7, 0x40ad, 0xb205, 0x402f, 0x4399, 0x1cb5, 0x430e, 0xb2ba, 0x19d9, 0xbf1f, 0x43f4, 0x41df, 0x1cc0, 0x407d, 0x430f, 0xbf06, 0x43e0, 0xad43, 0x065c, 0x42ed, 0x260a, 0xba07, 0x4415, 0xb0c3, 0x419b, 0x180a, 0xb049, 0x38a3, 0xbf93, 0xb0f3, 0x1c0b, 0xb241, 0x417f, 0xbf9f, 0x428f, 0x39fb, 0x45e5, 0x407d, 0x4664, 0x4202, 0xbaf6, 0x43c1, 0x42a5, 0x409e, 0x4049, 0x0925, 0xadf3, 0x0581, 0x4043, 0x1a2c, 0x42ca, 0x1b73, 0xbfaa, 0xb248, 0x42bb, 0xb253, 0xb254, 0x4432, 0x43ac, 0xbaf8, 0xba1e, 0x27ea, 0xbf55, 0x17bc, 0x4193, 0x0a07, 0x198a, 0x41f9, 0xbf95, 0x4370, 0x2713, 0x3500, 0x4093, 0x41df, 0xba7c, 0x19ec, 0xb21f, 0x357a, 0x0226, 0x3727, 0x43db, 0xb0a4, 0x4017, 0xa52a, 0x4381, 0x40ae, 0xb258, 0x2d00, 0x2206, 0x4286, 0xa01c, 0x4452, 0x43b3, 0xaf31, 0x4208, 0x4342, 0x1cc8, 0x41e0, 0xbf88, 0x02a7, 0xb002, 0x394d, 0xb0f4, 0x43c2, 0x42f8, 0x413a, 0x411c, 0xbace, 0x3d27, 0x42d9, 0x1410, 0x3a6d, 0x4106, 0x027a, 0x4346, 0x408a, 0x43bb, 0x43c6, 0x41b2, 0xbf08, 0x1c77, 0x421b, 0x1322, 0x4425, 0xbace, 0x2ecb, 0x43ad, 0x4415, 0x414a, 0x420e, 0xba66, 0x41a3, 0x40eb, 0x3809, 0x2732, 0xb0b1, 0xb2dc, 0x3668, 0xbf89, 0x413a, 0xb03e, 0x3a5e, 0x41cd, 0xbf37, 0x4372, 0xb2db, 0xacdb, 0x086c, 0x42be, 0x4275, 0xbafd, 0x422b, 0x1bcc, 0x4272, 0x41c1, 0x0e46, 0x433d, 0xbfc1, 0x0ce0, 0xaaad, 0x1982, 0x42cb, 0x4770, 0xe7fe + ], + StartRegs = [0x46ce3787, 0x91b9dd82, 0x5c30a10f, 0x98b32b04, 0x61635373, 0xdfb71ffc, 0x105be440, 0x6bd3228d, 0x9979b985, 0xe4135b49, 0x78e8170d, 0x00193fd1, 0xf7f4c7a5, 0x0e660f37, 0x00000000, 0xd00001f0 + ], + FinalRegs = [0x00001fff, 0xfffecfff, 0x0000207e, 0xe413586f, 0xffffff81, 0x00003232, 0x0000007f, 0x00000032, 0x6bd3228c, 0xf7f4ed77, 0x00000000, 0xf7f4d893, 0x00001a68, 0x1beca537, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x40de, 0xbf27, 0x1dbc, 0x42ee, 0x414f, 0xab56, 0x4170, 0x4225, 0x1b8e, 0xa89e, 0x00b6, 0x3e79, 0x46d8, 0xb2dc, 0x410d, 0x4058, 0x4395, 0x08c6, 0x43ce, 0xb000, 0xb07f, 0xa5ad, 0xbf14, 0x1da0, 0xb283, 0xbf2e, 0xb0a5, 0x425c, 0xb0ff, 0x4097, 0x3cc7, 0xb2ea, 0x406a, 0x401a, 0x4189, 0x1d12, 0x4265, 0x4167, 0x409d, 0x19c6, 0x40ef, 0xba26, 0x43e0, 0xbf94, 0xbf80, 0x1afd, 0xb067, 0xbfa0, 0xb227, 0x18c1, 0x4584, 0x249c, 0x4037, 0x1d6e, 0x462f, 0x42c7, 0xbf0d, 0xaf08, 0x1c64, 0xba1d, 0x40b0, 0x41a4, 0xa66a, 0x41b1, 0x4164, 0x1108, 0xbfb0, 0x096a, 0xb25f, 0x41aa, 0x1af7, 0x28de, 0x44a1, 0xb261, 0x4084, 0x43bd, 0xbfd3, 0x423d, 0x2de7, 0x1d14, 0x4079, 0xa83f, 0x41fb, 0xb216, 0x0c50, 0x1b4f, 0x42ec, 0xb212, 0x4085, 0x4211, 0x42a1, 0x1fdd, 0x4288, 0xba4e, 0x1029, 0x1d39, 0x3e7c, 0x4175, 0x4065, 0xb045, 0x40a2, 0xa278, 0xba5b, 0xbfd0, 0xad9f, 0xafe7, 0xbfdd, 0x1c5c, 0xb055, 0x3b51, 0x420c, 0xa911, 0x45b2, 0x43f3, 0xbf14, 0x403f, 0x3b14, 0x406f, 0x43c3, 0x41f5, 0x0da8, 0x4083, 0x09b3, 0xb20d, 0xaa12, 0xb022, 0x4693, 0xbf87, 0xba59, 0x165c, 0xb299, 0x19e1, 0x410a, 0x072b, 0xb236, 0x427d, 0x4310, 0xb2b1, 0x43c9, 0xaf02, 0x1ff3, 0xbf27, 0xadf3, 0xaec5, 0x42ee, 0x426e, 0xbfb6, 0x4153, 0x143e, 0x4354, 0x3bde, 0x2571, 0xaaa9, 0xbfb2, 0x401a, 0x4014, 0x186d, 0x1b1d, 0x1d49, 0xb0ed, 0xbfe2, 0x0f4b, 0xb28e, 0x4353, 0x2d51, 0xb219, 0x2806, 0x4614, 0x4046, 0x0727, 0x439d, 0xb2d1, 0xa936, 0xb21c, 0x2643, 0x4338, 0x4115, 0x2663, 0x1fab, 0xb234, 0x4484, 0x46ad, 0x1de8, 0xb291, 0x4379, 0x3751, 0x4672, 0xb23e, 0xbfa3, 0x411f, 0xb217, 0xb0af, 0xba5f, 0xb287, 0xba1a, 0x40b7, 0x428f, 0x4179, 0xbaf8, 0x42ba, 0xb01d, 0xb216, 0x432e, 0x411c, 0x405c, 0x10dd, 0x4358, 0x4277, 0x1b1d, 0x1afd, 0x442f, 0x408e, 0xbf1a, 0xb2d1, 0x20f4, 0x42e0, 0x1865, 0x4360, 0x419b, 0xad85, 0xbf47, 0x42dc, 0x1c28, 0x099a, 0xb021, 0x42c6, 0x3001, 0x4204, 0xb04c, 0x43cc, 0x4011, 0x4383, 0x42c0, 0x42b8, 0x426c, 0x431e, 0x4073, 0xb0de, 0xbf7d, 0xbadf, 0x1b97, 0x44dd, 0xba7a, 0x43a2, 0x2527, 0x1e82, 0x17ea, 0x1ae3, 0x1f1f, 0x40ad, 0xaf9c, 0x44f8, 0xa34e, 0x19ef, 0x3993, 0xbf9a, 0xb246, 0xba3a, 0x2ae0, 0x40b1, 0x230a, 0x41c9, 0x41d8, 0x4612, 0x4217, 0xb2af, 0x0e46, 0x469b, 0x06c2, 0xbfbd, 0xb2d8, 0xb20c, 0xb278, 0xa4ee, 0x4220, 0x2bee, 0xbf03, 0x0713, 0x46a4, 0xb296, 0x45c9, 0x381e, 0x26f9, 0x2596, 0xb20d, 0x1855, 0x31ca, 0xabe7, 0x1e1f, 0xbf95, 0x42ec, 0x4335, 0xb261, 0xba75, 0xba1e, 0xb2e6, 0xb277, 0x41ff, 0x408f, 0x1968, 0x401a, 0xb03f, 0x02b7, 0xb000, 0x3dd6, 0x4165, 0x42c7, 0x4159, 0xbfa8, 0x433e, 0x0a1e, 0x42bf, 0x145b, 0xbaf9, 0x4327, 0x4355, 0xafcf, 0x2661, 0x3e86, 0x415c, 0xa1d9, 0xbae1, 0x1dba, 0xa6de, 0x3bcb, 0xbfd0, 0x1fe8, 0x0997, 0x4268, 0x42d9, 0x432c, 0x3238, 0x1bbb, 0x4076, 0xbfc7, 0x0e40, 0x078c, 0x42ad, 0x2739, 0x3255, 0xbf88, 0x4096, 0x1d9a, 0xb228, 0xbfc1, 0x4025, 0x4021, 0xb21a, 0x41ac, 0x410a, 0x40bb, 0x1b99, 0x22c4, 0xaf4c, 0x21f4, 0x40fc, 0xb0d0, 0xbf18, 0x1ce1, 0xba1c, 0x1d77, 0xb08c, 0xb2ca, 0x160e, 0x1660, 0x0400, 0x41c4, 0x4038, 0x40d4, 0x19d5, 0x40de, 0x4216, 0xb0f3, 0x05c6, 0xba08, 0x2094, 0x18df, 0x43a2, 0x0d66, 0x42b6, 0xbf5d, 0x4088, 0x4150, 0x4207, 0x1fc0, 0x434d, 0xba10, 0x404c, 0x43da, 0xbfd4, 0xa24f, 0xba3a, 0xba01, 0x0721, 0xba0d, 0x41eb, 0xb2d4, 0xb2f9, 0x40d5, 0x423a, 0x430f, 0x41d1, 0x19f0, 0x179f, 0x42a6, 0x4325, 0x37cd, 0x1943, 0x43a7, 0xbf38, 0x3469, 0xbf55, 0xb024, 0x415e, 0xb24e, 0xb042, 0xb29f, 0xb257, 0x43d5, 0x421c, 0x017e, 0x33bd, 0x3636, 0x4102, 0x40b7, 0x4562, 0xb092, 0x42dd, 0xbac5, 0x4352, 0xbf64, 0x4608, 0xa1f5, 0x1810, 0xb080, 0xa0f4, 0x4373, 0x40bb, 0x43f3, 0x42bb, 0x4372, 0x0653, 0x41c3, 0x4205, 0xbafa, 0x0977, 0xbaff, 0xb2c9, 0x43e7, 0xba3e, 0x443d, 0x4390, 0xbf80, 0x409d, 0x42ae, 0x1d3a, 0xb0dd, 0xbfa7, 0xba14, 0x43c7, 0x4064, 0xab20, 0x41a3, 0xb22f, 0x41f3, 0x4338, 0x4088, 0xa77f, 0x3c19, 0x4212, 0x41a2, 0x407b, 0x0a0e, 0x41df, 0x1fba, 0xba60, 0x1432, 0x1fdf, 0x4082, 0x1b87, 0x2588, 0x430b, 0xaf0a, 0xbf44, 0xba6c, 0xbace, 0x16c6, 0x1fb1, 0xa6d9, 0x1b20, 0x4246, 0x2523, 0x00c0, 0x43b2, 0x4612, 0xb0a6, 0x4180, 0x46bb, 0x42da, 0x430f, 0xb2ac, 0xbafe, 0x4655, 0xb2d3, 0xba32, 0xbfb8, 0x4259, 0x1f8c, 0x40d1, 0x415f, 0x404d, 0x4418, 0x40db, 0x43d8, 0x08aa, 0x1e2b, 0x1ef5, 0x41fe, 0x4346, 0x4269, 0xadc3, 0xb2f5, 0x42ab, 0xb0c9, 0xb034, 0x28d6, 0x4276, 0xba16, 0x4294, 0xad99, 0x418f, 0x06b5, 0xbfba, 0x427c, 0x4542, 0xb2fa, 0xa6ac, 0x418d, 0x4564, 0xb04e, 0xbf80, 0x3973, 0x3f72, 0x1830, 0xbfd2, 0xacbf, 0xbaf1, 0x4546, 0x203c, 0x1a47, 0x28e1, 0xbf2e, 0xb235, 0x1eae, 0x4195, 0x1476, 0x43da, 0x4450, 0x428b, 0xb22d, 0xbfd0, 0x1805, 0xba04, 0x1a83, 0x297b, 0x403a, 0x1fca, 0xbaf8, 0x40b6, 0x43c5, 0x3560, 0x43f8, 0x416d, 0xba13, 0x4329, 0xa727, 0x159f, 0x4212, 0xbad7, 0x4085, 0xbfb5, 0x33d8, 0x4388, 0xb280, 0xba44, 0x41cd, 0x1f18, 0x40ae, 0x437a, 0xb081, 0x4340, 0x4163, 0x1a20, 0xbad1, 0xbf03, 0x4390, 0x41d0, 0x40c1, 0x1ff4, 0xb299, 0xbfd0, 0x1bc9, 0xbad6, 0x16cb, 0x4062, 0x1c0c, 0x41df, 0x401b, 0x40e3, 0x4103, 0xa549, 0xbfb0, 0x3b0b, 0x4405, 0x40ca, 0xb290, 0x4100, 0x433c, 0x424b, 0x2d35, 0x46eb, 0xbf70, 0x40ae, 0xbf9d, 0x425c, 0x41c5, 0x4168, 0x434a, 0xbfd6, 0x25f5, 0x43b9, 0x3278, 0x432d, 0x3711, 0x181a, 0x1b7e, 0xba70, 0x437d, 0xb2ed, 0x259f, 0x19f0, 0x1c30, 0x1b3b, 0x43df, 0x443a, 0xb29a, 0x4091, 0xad24, 0xbfaa, 0x419b, 0x25e8, 0x20d2, 0xb2f9, 0xba50, 0x42ef, 0x42b5, 0x368e, 0x3a76, 0xb240, 0x1e37, 0xbafb, 0x42ac, 0x1a73, 0x2848, 0xb0a9, 0x4656, 0x4138, 0xbad8, 0x4115, 0x42ba, 0x425b, 0x414f, 0x430f, 0xb2f1, 0x1ec6, 0xbf37, 0x4171, 0x41a4, 0x41bd, 0x1911, 0xb268, 0x44e9, 0xac0d, 0x3861, 0xb2cf, 0x425a, 0x0c98, 0x1799, 0x3eca, 0x1076, 0xba36, 0x35c9, 0x1a07, 0x4131, 0x4312, 0xbf14, 0x41df, 0x40fc, 0x1d3f, 0x424b, 0x4332, 0x4186, 0xbfc2, 0x42cb, 0x4202, 0xb202, 0xb2d1, 0x1331, 0x2071, 0xb2a9, 0x41ea, 0x4129, 0xab06, 0x4396, 0x41aa, 0x1d8b, 0xba52, 0xb23f, 0x07dd, 0xa183, 0x19f1, 0x05cf, 0x1809, 0x434c, 0xbf84, 0x4008, 0x4286, 0x4289, 0x0abd, 0x20ef, 0xb2ed, 0x1a86, 0x43f6, 0xbadc, 0x4257, 0x3cd6, 0xb207, 0x43ab, 0xbf90, 0xb2d2, 0x4208, 0x405f, 0x1bad, 0x4315, 0x0b32, 0xbf74, 0xbfd0, 0x3ed1, 0x4074, 0x423c, 0x40fd, 0x441c, 0xa2af, 0x2616, 0x2ca8, 0x11e7, 0x438b, 0x43d2, 0x046c, 0xbfbd, 0x18f0, 0x1c25, 0x42fc, 0x43c8, 0x03e7, 0x409d, 0x4277, 0x46f3, 0x4162, 0xbf14, 0xa46b, 0xaf5f, 0x16cb, 0x422b, 0xabe0, 0x0653, 0x0cb8, 0xb2ca, 0xb286, 0x1b6d, 0x4134, 0x215e, 0x437f, 0x4049, 0x41c9, 0x1b35, 0x4214, 0x4048, 0xbf42, 0x43ca, 0xb2ac, 0x43de, 0xa5f1, 0x42b0, 0xb075, 0x413f, 0xba3c, 0x41f2, 0x1d5b, 0x1b0f, 0x3cad, 0x4175, 0x43df, 0xbfd0, 0xb081, 0x0b73, 0x4330, 0xb079, 0x41ec, 0xb232, 0x4621, 0xb06e, 0x400f, 0xa68f, 0x2c56, 0x42f3, 0x1a96, 0xbfab, 0x418c, 0x43b6, 0x4360, 0x4310, 0x1012, 0x4315, 0x42c4, 0x1df4, 0x41ed, 0x2de9, 0x4277, 0x46c8, 0x411e, 0xbf9a, 0xba26, 0xbfd0, 0x4229, 0x1deb, 0x42b0, 0xb245, 0x40bc, 0x426e, 0x42af, 0xb2a0, 0x427c, 0x4262, 0x43ae, 0x4648, 0x4346, 0x40a4, 0x4135, 0xba30, 0x1a4b, 0x437f, 0x402b, 0x4064, 0x2f49, 0x4699, 0xa05f, 0xbaeb, 0x08a5, 0xbf32, 0xba5a, 0x19b5, 0x1807, 0x43d6, 0x4243, 0x4548, 0x015d, 0x09fa, 0x4161, 0x40c3, 0x1528, 0x22e7, 0x43e1, 0x40c1, 0x42f5, 0x4219, 0x1719, 0x4391, 0xba42, 0x1aa8, 0x42de, 0xba05, 0x40e1, 0x42b8, 0x46e2, 0xb07e, 0xbf16, 0x435c, 0x4255, 0x42a5, 0x414d, 0x0353, 0x423e, 0xb0ac, 0xaf6a, 0xbf6d, 0x423a, 0x4303, 0x42b4, 0x42ff, 0xbf09, 0x4043, 0x4052, 0x42cb, 0x439d, 0x3cae, 0x1752, 0xbff0, 0x4120, 0x1b16, 0x42cd, 0xb0bd, 0x4109, 0xbf2b, 0xba63, 0x415b, 0x1f93, 0xbaff, 0xb25c, 0x4327, 0xb0ea, 0x456f, 0xb280, 0x41da, 0x2a24, 0x184d, 0x420f, 0x400b, 0x42d8, 0xb200, 0xb270, 0xb050, 0xba5b, 0xb20b, 0x1eb7, 0x432e, 0xbfd1, 0x4367, 0x2e30, 0xb225, 0x43d0, 0x4211, 0xb2e7, 0x40b4, 0x41b3, 0xba16, 0x409e, 0x1452, 0x28cd, 0x4342, 0x335d, 0x25d5, 0x1fcb, 0x0ab1, 0x4179, 0x40a2, 0xb213, 0x4113, 0x298a, 0x415c, 0x4209, 0x42dd, 0x41c1, 0xb0f2, 0x423a, 0x4021, 0xbf8c, 0x0529, 0xa789, 0xbae0, 0xb217, 0x4195, 0x42dd, 0x424a, 0x40dc, 0x429b, 0x18b2, 0xb228, 0x4288, 0x171a, 0x438a, 0xb2a5, 0x4453, 0xb04f, 0x0047, 0xb27d, 0xbfbf, 0x3cd5, 0xb294, 0x1550, 0x402f, 0xb027, 0x1e0f, 0x43b7, 0x42bb, 0xbf9c, 0xa295, 0x43c2, 0xb2b3, 0xaec7, 0x4168, 0x43bd, 0xb09b, 0xbae4, 0x40dc, 0x4351, 0x4266, 0x0b06, 0xb24c, 0x18ee, 0x41b7, 0xbf7c, 0x43fc, 0x420c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x1c45d6ba, 0x53e984f2, 0x3a0df554, 0xdcee8efa, 0x8d61a15b, 0x42a11c1a, 0xe46650af, 0x77ca9117, 0x8878f892, 0x1c01e917, 0x9521508e, 0x1cb29f47, 0xca2a8d7c, 0xe5798906, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x0000007d, 0x00000000, 0x00000000, 0x00000000, 0xffffffa8, 0xffffffa8, 0xffffffa8, 0x00000057, 0x017b7293, 0x00000000, 0xca2a8d7b, 0x00000000, 0xca2a8d7b, 0xe5798e79, 0x00000000, 0x400001d0 }, + Instructions = [0x40de, 0xbf27, 0x1dbc, 0x42ee, 0x414f, 0xab56, 0x4170, 0x4225, 0x1b8e, 0xa89e, 0x00b6, 0x3e79, 0x46d8, 0xb2dc, 0x410d, 0x4058, 0x4395, 0x08c6, 0x43ce, 0xb000, 0xb07f, 0xa5ad, 0xbf14, 0x1da0, 0xb283, 0xbf2e, 0xb0a5, 0x425c, 0xb0ff, 0x4097, 0x3cc7, 0xb2ea, 0x406a, 0x401a, 0x4189, 0x1d12, 0x4265, 0x4167, 0x409d, 0x19c6, 0x40ef, 0xba26, 0x43e0, 0xbf94, 0xbf80, 0x1afd, 0xb067, 0xbfa0, 0xb227, 0x18c1, 0x4584, 0x249c, 0x4037, 0x1d6e, 0x462f, 0x42c7, 0xbf0d, 0xaf08, 0x1c64, 0xba1d, 0x40b0, 0x41a4, 0xa66a, 0x41b1, 0x4164, 0x1108, 0xbfb0, 0x096a, 0xb25f, 0x41aa, 0x1af7, 0x28de, 0x44a1, 0xb261, 0x4084, 0x43bd, 0xbfd3, 0x423d, 0x2de7, 0x1d14, 0x4079, 0xa83f, 0x41fb, 0xb216, 0x0c50, 0x1b4f, 0x42ec, 0xb212, 0x4085, 0x4211, 0x42a1, 0x1fdd, 0x4288, 0xba4e, 0x1029, 0x1d39, 0x3e7c, 0x4175, 0x4065, 0xb045, 0x40a2, 0xa278, 0xba5b, 0xbfd0, 0xad9f, 0xafe7, 0xbfdd, 0x1c5c, 0xb055, 0x3b51, 0x420c, 0xa911, 0x45b2, 0x43f3, 0xbf14, 0x403f, 0x3b14, 0x406f, 0x43c3, 0x41f5, 0x0da8, 0x4083, 0x09b3, 0xb20d, 0xaa12, 0xb022, 0x4693, 0xbf87, 0xba59, 0x165c, 0xb299, 0x19e1, 0x410a, 0x072b, 0xb236, 0x427d, 0x4310, 0xb2b1, 0x43c9, 0xaf02, 0x1ff3, 0xbf27, 0xadf3, 0xaec5, 0x42ee, 0x426e, 0xbfb6, 0x4153, 0x143e, 0x4354, 0x3bde, 0x2571, 0xaaa9, 0xbfb2, 0x401a, 0x4014, 0x186d, 0x1b1d, 0x1d49, 0xb0ed, 0xbfe2, 0x0f4b, 0xb28e, 0x4353, 0x2d51, 0xb219, 0x2806, 0x4614, 0x4046, 0x0727, 0x439d, 0xb2d1, 0xa936, 0xb21c, 0x2643, 0x4338, 0x4115, 0x2663, 0x1fab, 0xb234, 0x4484, 0x46ad, 0x1de8, 0xb291, 0x4379, 0x3751, 0x4672, 0xb23e, 0xbfa3, 0x411f, 0xb217, 0xb0af, 0xba5f, 0xb287, 0xba1a, 0x40b7, 0x428f, 0x4179, 0xbaf8, 0x42ba, 0xb01d, 0xb216, 0x432e, 0x411c, 0x405c, 0x10dd, 0x4358, 0x4277, 0x1b1d, 0x1afd, 0x442f, 0x408e, 0xbf1a, 0xb2d1, 0x20f4, 0x42e0, 0x1865, 0x4360, 0x419b, 0xad85, 0xbf47, 0x42dc, 0x1c28, 0x099a, 0xb021, 0x42c6, 0x3001, 0x4204, 0xb04c, 0x43cc, 0x4011, 0x4383, 0x42c0, 0x42b8, 0x426c, 0x431e, 0x4073, 0xb0de, 0xbf7d, 0xbadf, 0x1b97, 0x44dd, 0xba7a, 0x43a2, 0x2527, 0x1e82, 0x17ea, 0x1ae3, 0x1f1f, 0x40ad, 0xaf9c, 0x44f8, 0xa34e, 0x19ef, 0x3993, 0xbf9a, 0xb246, 0xba3a, 0x2ae0, 0x40b1, 0x230a, 0x41c9, 0x41d8, 0x4612, 0x4217, 0xb2af, 0x0e46, 0x469b, 0x06c2, 0xbfbd, 0xb2d8, 0xb20c, 0xb278, 0xa4ee, 0x4220, 0x2bee, 0xbf03, 0x0713, 0x46a4, 0xb296, 0x45c9, 0x381e, 0x26f9, 0x2596, 0xb20d, 0x1855, 0x31ca, 0xabe7, 0x1e1f, 0xbf95, 0x42ec, 0x4335, 0xb261, 0xba75, 0xba1e, 0xb2e6, 0xb277, 0x41ff, 0x408f, 0x1968, 0x401a, 0xb03f, 0x02b7, 0xb000, 0x3dd6, 0x4165, 0x42c7, 0x4159, 0xbfa8, 0x433e, 0x0a1e, 0x42bf, 0x145b, 0xbaf9, 0x4327, 0x4355, 0xafcf, 0x2661, 0x3e86, 0x415c, 0xa1d9, 0xbae1, 0x1dba, 0xa6de, 0x3bcb, 0xbfd0, 0x1fe8, 0x0997, 0x4268, 0x42d9, 0x432c, 0x3238, 0x1bbb, 0x4076, 0xbfc7, 0x0e40, 0x078c, 0x42ad, 0x2739, 0x3255, 0xbf88, 0x4096, 0x1d9a, 0xb228, 0xbfc1, 0x4025, 0x4021, 0xb21a, 0x41ac, 0x410a, 0x40bb, 0x1b99, 0x22c4, 0xaf4c, 0x21f4, 0x40fc, 0xb0d0, 0xbf18, 0x1ce1, 0xba1c, 0x1d77, 0xb08c, 0xb2ca, 0x160e, 0x1660, 0x0400, 0x41c4, 0x4038, 0x40d4, 0x19d5, 0x40de, 0x4216, 0xb0f3, 0x05c6, 0xba08, 0x2094, 0x18df, 0x43a2, 0x0d66, 0x42b6, 0xbf5d, 0x4088, 0x4150, 0x4207, 0x1fc0, 0x434d, 0xba10, 0x404c, 0x43da, 0xbfd4, 0xa24f, 0xba3a, 0xba01, 0x0721, 0xba0d, 0x41eb, 0xb2d4, 0xb2f9, 0x40d5, 0x423a, 0x430f, 0x41d1, 0x19f0, 0x179f, 0x42a6, 0x4325, 0x37cd, 0x1943, 0x43a7, 0xbf38, 0x3469, 0xbf55, 0xb024, 0x415e, 0xb24e, 0xb042, 0xb29f, 0xb257, 0x43d5, 0x421c, 0x017e, 0x33bd, 0x3636, 0x4102, 0x40b7, 0x4562, 0xb092, 0x42dd, 0xbac5, 0x4352, 0xbf64, 0x4608, 0xa1f5, 0x1810, 0xb080, 0xa0f4, 0x4373, 0x40bb, 0x43f3, 0x42bb, 0x4372, 0x0653, 0x41c3, 0x4205, 0xbafa, 0x0977, 0xbaff, 0xb2c9, 0x43e7, 0xba3e, 0x443d, 0x4390, 0xbf80, 0x409d, 0x42ae, 0x1d3a, 0xb0dd, 0xbfa7, 0xba14, 0x43c7, 0x4064, 0xab20, 0x41a3, 0xb22f, 0x41f3, 0x4338, 0x4088, 0xa77f, 0x3c19, 0x4212, 0x41a2, 0x407b, 0x0a0e, 0x41df, 0x1fba, 0xba60, 0x1432, 0x1fdf, 0x4082, 0x1b87, 0x2588, 0x430b, 0xaf0a, 0xbf44, 0xba6c, 0xbace, 0x16c6, 0x1fb1, 0xa6d9, 0x1b20, 0x4246, 0x2523, 0x00c0, 0x43b2, 0x4612, 0xb0a6, 0x4180, 0x46bb, 0x42da, 0x430f, 0xb2ac, 0xbafe, 0x4655, 0xb2d3, 0xba32, 0xbfb8, 0x4259, 0x1f8c, 0x40d1, 0x415f, 0x404d, 0x4418, 0x40db, 0x43d8, 0x08aa, 0x1e2b, 0x1ef5, 0x41fe, 0x4346, 0x4269, 0xadc3, 0xb2f5, 0x42ab, 0xb0c9, 0xb034, 0x28d6, 0x4276, 0xba16, 0x4294, 0xad99, 0x418f, 0x06b5, 0xbfba, 0x427c, 0x4542, 0xb2fa, 0xa6ac, 0x418d, 0x4564, 0xb04e, 0xbf80, 0x3973, 0x3f72, 0x1830, 0xbfd2, 0xacbf, 0xbaf1, 0x4546, 0x203c, 0x1a47, 0x28e1, 0xbf2e, 0xb235, 0x1eae, 0x4195, 0x1476, 0x43da, 0x4450, 0x428b, 0xb22d, 0xbfd0, 0x1805, 0xba04, 0x1a83, 0x297b, 0x403a, 0x1fca, 0xbaf8, 0x40b6, 0x43c5, 0x3560, 0x43f8, 0x416d, 0xba13, 0x4329, 0xa727, 0x159f, 0x4212, 0xbad7, 0x4085, 0xbfb5, 0x33d8, 0x4388, 0xb280, 0xba44, 0x41cd, 0x1f18, 0x40ae, 0x437a, 0xb081, 0x4340, 0x4163, 0x1a20, 0xbad1, 0xbf03, 0x4390, 0x41d0, 0x40c1, 0x1ff4, 0xb299, 0xbfd0, 0x1bc9, 0xbad6, 0x16cb, 0x4062, 0x1c0c, 0x41df, 0x401b, 0x40e3, 0x4103, 0xa549, 0xbfb0, 0x3b0b, 0x4405, 0x40ca, 0xb290, 0x4100, 0x433c, 0x424b, 0x2d35, 0x46eb, 0xbf70, 0x40ae, 0xbf9d, 0x425c, 0x41c5, 0x4168, 0x434a, 0xbfd6, 0x25f5, 0x43b9, 0x3278, 0x432d, 0x3711, 0x181a, 0x1b7e, 0xba70, 0x437d, 0xb2ed, 0x259f, 0x19f0, 0x1c30, 0x1b3b, 0x43df, 0x443a, 0xb29a, 0x4091, 0xad24, 0xbfaa, 0x419b, 0x25e8, 0x20d2, 0xb2f9, 0xba50, 0x42ef, 0x42b5, 0x368e, 0x3a76, 0xb240, 0x1e37, 0xbafb, 0x42ac, 0x1a73, 0x2848, 0xb0a9, 0x4656, 0x4138, 0xbad8, 0x4115, 0x42ba, 0x425b, 0x414f, 0x430f, 0xb2f1, 0x1ec6, 0xbf37, 0x4171, 0x41a4, 0x41bd, 0x1911, 0xb268, 0x44e9, 0xac0d, 0x3861, 0xb2cf, 0x425a, 0x0c98, 0x1799, 0x3eca, 0x1076, 0xba36, 0x35c9, 0x1a07, 0x4131, 0x4312, 0xbf14, 0x41df, 0x40fc, 0x1d3f, 0x424b, 0x4332, 0x4186, 0xbfc2, 0x42cb, 0x4202, 0xb202, 0xb2d1, 0x1331, 0x2071, 0xb2a9, 0x41ea, 0x4129, 0xab06, 0x4396, 0x41aa, 0x1d8b, 0xba52, 0xb23f, 0x07dd, 0xa183, 0x19f1, 0x05cf, 0x1809, 0x434c, 0xbf84, 0x4008, 0x4286, 0x4289, 0x0abd, 0x20ef, 0xb2ed, 0x1a86, 0x43f6, 0xbadc, 0x4257, 0x3cd6, 0xb207, 0x43ab, 0xbf90, 0xb2d2, 0x4208, 0x405f, 0x1bad, 0x4315, 0x0b32, 0xbf74, 0xbfd0, 0x3ed1, 0x4074, 0x423c, 0x40fd, 0x441c, 0xa2af, 0x2616, 0x2ca8, 0x11e7, 0x438b, 0x43d2, 0x046c, 0xbfbd, 0x18f0, 0x1c25, 0x42fc, 0x43c8, 0x03e7, 0x409d, 0x4277, 0x46f3, 0x4162, 0xbf14, 0xa46b, 0xaf5f, 0x16cb, 0x422b, 0xabe0, 0x0653, 0x0cb8, 0xb2ca, 0xb286, 0x1b6d, 0x4134, 0x215e, 0x437f, 0x4049, 0x41c9, 0x1b35, 0x4214, 0x4048, 0xbf42, 0x43ca, 0xb2ac, 0x43de, 0xa5f1, 0x42b0, 0xb075, 0x413f, 0xba3c, 0x41f2, 0x1d5b, 0x1b0f, 0x3cad, 0x4175, 0x43df, 0xbfd0, 0xb081, 0x0b73, 0x4330, 0xb079, 0x41ec, 0xb232, 0x4621, 0xb06e, 0x400f, 0xa68f, 0x2c56, 0x42f3, 0x1a96, 0xbfab, 0x418c, 0x43b6, 0x4360, 0x4310, 0x1012, 0x4315, 0x42c4, 0x1df4, 0x41ed, 0x2de9, 0x4277, 0x46c8, 0x411e, 0xbf9a, 0xba26, 0xbfd0, 0x4229, 0x1deb, 0x42b0, 0xb245, 0x40bc, 0x426e, 0x42af, 0xb2a0, 0x427c, 0x4262, 0x43ae, 0x4648, 0x4346, 0x40a4, 0x4135, 0xba30, 0x1a4b, 0x437f, 0x402b, 0x4064, 0x2f49, 0x4699, 0xa05f, 0xbaeb, 0x08a5, 0xbf32, 0xba5a, 0x19b5, 0x1807, 0x43d6, 0x4243, 0x4548, 0x015d, 0x09fa, 0x4161, 0x40c3, 0x1528, 0x22e7, 0x43e1, 0x40c1, 0x42f5, 0x4219, 0x1719, 0x4391, 0xba42, 0x1aa8, 0x42de, 0xba05, 0x40e1, 0x42b8, 0x46e2, 0xb07e, 0xbf16, 0x435c, 0x4255, 0x42a5, 0x414d, 0x0353, 0x423e, 0xb0ac, 0xaf6a, 0xbf6d, 0x423a, 0x4303, 0x42b4, 0x42ff, 0xbf09, 0x4043, 0x4052, 0x42cb, 0x439d, 0x3cae, 0x1752, 0xbff0, 0x4120, 0x1b16, 0x42cd, 0xb0bd, 0x4109, 0xbf2b, 0xba63, 0x415b, 0x1f93, 0xbaff, 0xb25c, 0x4327, 0xb0ea, 0x456f, 0xb280, 0x41da, 0x2a24, 0x184d, 0x420f, 0x400b, 0x42d8, 0xb200, 0xb270, 0xb050, 0xba5b, 0xb20b, 0x1eb7, 0x432e, 0xbfd1, 0x4367, 0x2e30, 0xb225, 0x43d0, 0x4211, 0xb2e7, 0x40b4, 0x41b3, 0xba16, 0x409e, 0x1452, 0x28cd, 0x4342, 0x335d, 0x25d5, 0x1fcb, 0x0ab1, 0x4179, 0x40a2, 0xb213, 0x4113, 0x298a, 0x415c, 0x4209, 0x42dd, 0x41c1, 0xb0f2, 0x423a, 0x4021, 0xbf8c, 0x0529, 0xa789, 0xbae0, 0xb217, 0x4195, 0x42dd, 0x424a, 0x40dc, 0x429b, 0x18b2, 0xb228, 0x4288, 0x171a, 0x438a, 0xb2a5, 0x4453, 0xb04f, 0x0047, 0xb27d, 0xbfbf, 0x3cd5, 0xb294, 0x1550, 0x402f, 0xb027, 0x1e0f, 0x43b7, 0x42bb, 0xbf9c, 0xa295, 0x43c2, 0xb2b3, 0xaec7, 0x4168, 0x43bd, 0xb09b, 0xbae4, 0x40dc, 0x4351, 0x4266, 0x0b06, 0xb24c, 0x18ee, 0x41b7, 0xbf7c, 0x43fc, 0x420c, 0x4770, 0xe7fe + ], + StartRegs = [0x1c45d6ba, 0x53e984f2, 0x3a0df554, 0xdcee8efa, 0x8d61a15b, 0x42a11c1a, 0xe46650af, 0x77ca9117, 0x8878f892, 0x1c01e917, 0x9521508e, 0x1cb29f47, 0xca2a8d7c, 0xe5798906, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x0000007d, 0x00000000, 0x00000000, 0x00000000, 0xffffffa8, 0xffffffa8, 0xffffffa8, 0x00000057, 0x017b7293, 0x00000000, 0xca2a8d7b, 0x00000000, 0xca2a8d7b, 0xe5798e79, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x1ed2, 0xb283, 0x434a, 0x3937, 0x4179, 0x4253, 0x4017, 0x023f, 0x42bc, 0x408d, 0xb22a, 0x4268, 0xba5b, 0x1a31, 0x40a2, 0x1dd9, 0x2161, 0x4449, 0x4000, 0x402e, 0x41ce, 0xbf83, 0xba1e, 0x44b0, 0xba18, 0x425e, 0xa764, 0xbfc0, 0x406f, 0x40bd, 0xb0b7, 0xa99c, 0x4005, 0xa0c2, 0x41a4, 0x3ff8, 0x402c, 0x036d, 0xbf57, 0x3e68, 0x4153, 0xb0e0, 0x4689, 0x42e0, 0x406f, 0x40c8, 0xb0b1, 0x4593, 0x40f8, 0xb2d1, 0xa877, 0x4379, 0x434e, 0xba1e, 0xbf71, 0xba71, 0xb2b1, 0xb0c1, 0xb232, 0x41fc, 0x463f, 0x4069, 0xb25b, 0x4241, 0xb2c0, 0x405a, 0x4048, 0xba32, 0x4258, 0x41ef, 0xbf78, 0x0754, 0xb277, 0xbf60, 0x4089, 0xba4a, 0x4074, 0xb252, 0xb2cb, 0x4134, 0x434c, 0x43e1, 0x1e9c, 0x1c02, 0x40a7, 0xb24e, 0x1e02, 0xbf17, 0x3511, 0xb2a3, 0xba19, 0xaccd, 0x4091, 0x1fc1, 0xb057, 0x43b8, 0xb2c8, 0x4180, 0x377e, 0x43d3, 0x09e2, 0x4266, 0xb26c, 0xbf1f, 0x4260, 0xb24e, 0xb24a, 0xb2ac, 0xbfd0, 0xba7a, 0x45b2, 0x4038, 0x418f, 0x15f9, 0xba63, 0xba2d, 0x42f3, 0x403e, 0x4038, 0x41c9, 0x4152, 0x2ee7, 0x4259, 0x0226, 0xbf41, 0x21d2, 0x4430, 0x4007, 0x17ed, 0xbfbd, 0x4058, 0x3e16, 0x407a, 0x40e3, 0x41a0, 0x43d8, 0x404a, 0x40f2, 0x1605, 0x42a3, 0x4631, 0x44f0, 0xbfe0, 0xa21c, 0x290b, 0xaade, 0x40aa, 0x43ae, 0x4126, 0x29c9, 0x420d, 0xbfa4, 0xba6b, 0x41cc, 0x2a49, 0xa316, 0x4308, 0xb04c, 0x4261, 0x0a3b, 0x27f8, 0x422b, 0x02f7, 0x401f, 0x4084, 0xa4c4, 0x1d89, 0xaf46, 0x4159, 0xbad0, 0xb287, 0x41f4, 0x0ae8, 0x423b, 0x3f2b, 0xb210, 0x41bf, 0xbfa5, 0x4333, 0x447e, 0x4403, 0xb24d, 0xbf80, 0x4201, 0x40ff, 0xb2da, 0x41df, 0xb2fa, 0x4257, 0x4366, 0x43e5, 0xbfba, 0x431d, 0x4558, 0xb296, 0xba51, 0xbacf, 0x4313, 0xbadd, 0x40e6, 0x25fe, 0x4223, 0xb2e4, 0x400a, 0x362d, 0x40bd, 0x1e5c, 0x4010, 0xa3e8, 0x4695, 0x22de, 0x3070, 0x1c9a, 0x2d98, 0xb0b1, 0x1f41, 0xb2e6, 0x415c, 0xbac2, 0xbf69, 0x3816, 0x1f3a, 0x1f46, 0xb06c, 0x10f7, 0x1ee5, 0x400e, 0xbf08, 0x2a02, 0x179e, 0xadb5, 0x42f2, 0x410d, 0x4258, 0xb24d, 0x4424, 0xbaf2, 0x4143, 0x40e8, 0x4339, 0xb231, 0x437a, 0xb2f1, 0x42fd, 0x1dff, 0xbf91, 0x43ed, 0x468c, 0x427d, 0xb211, 0x4388, 0x4101, 0xba6d, 0x3708, 0x19fc, 0xb2fe, 0x410f, 0x1fdc, 0x2d26, 0x0b81, 0xb23e, 0x46b2, 0x4194, 0xacb8, 0x40ec, 0x3012, 0xbfb0, 0x45b1, 0xb2b7, 0x1ea0, 0xb246, 0x4007, 0x23e5, 0xbf92, 0x426f, 0x1eab, 0x4371, 0x0c6a, 0xb21d, 0x4442, 0x1954, 0x1957, 0xba05, 0xb27f, 0xb00c, 0x437f, 0xb022, 0x4223, 0x1d0e, 0xbf97, 0xbaf4, 0x1c45, 0xba0e, 0x469d, 0x4049, 0x2a26, 0xb2f0, 0x4272, 0x441a, 0x465b, 0xb2b7, 0x1885, 0x45ca, 0x43b9, 0x1b66, 0x42fe, 0x467e, 0x3529, 0x36da, 0x43fb, 0x1fea, 0x4249, 0x281b, 0xbf81, 0x3ce3, 0xb25a, 0x4119, 0x41d7, 0x1ba6, 0x426c, 0x41ad, 0x4041, 0x41af, 0x44b2, 0x41c6, 0xbf86, 0x41b6, 0xac9f, 0x2b28, 0x4001, 0xba03, 0xbfb0, 0x40b8, 0x3572, 0xba6e, 0x19d2, 0xbf22, 0xacf7, 0xab27, 0x2775, 0x40d1, 0x438f, 0x4214, 0x17c4, 0x40f8, 0x42ce, 0xa942, 0x3854, 0x44cd, 0x1cf3, 0xbfb8, 0x1a6f, 0x1817, 0x2f34, 0x42f3, 0xaa11, 0xba6c, 0x4560, 0x2208, 0x43ac, 0x45bb, 0x45f5, 0x09eb, 0xbf06, 0xb251, 0x1def, 0xbff0, 0x0c9f, 0x40e4, 0x4453, 0x1aab, 0x4365, 0xb2e1, 0x46a4, 0x4000, 0x12f4, 0x3204, 0x4360, 0x4350, 0x4185, 0x41ba, 0x3fca, 0x31d6, 0xa211, 0x42eb, 0x42a0, 0xadb7, 0xbaec, 0x41d4, 0x409c, 0xbaf5, 0xbfa1, 0x15b0, 0x4234, 0x4345, 0x4215, 0x43fc, 0xba60, 0xb034, 0x25ec, 0x4108, 0xb250, 0x2343, 0x44aa, 0xb2ed, 0x4234, 0x46ba, 0x420a, 0x0fcf, 0xbf2e, 0xb0aa, 0xa5a5, 0xb0e2, 0x41d3, 0xb292, 0x1d9c, 0xbf75, 0x190f, 0x2337, 0xb245, 0x080c, 0xb2cf, 0xa08b, 0x40ce, 0x40c3, 0x4121, 0x192b, 0x327a, 0x4341, 0x0fb8, 0xbfe0, 0xb2a8, 0x26ea, 0x3b79, 0x41eb, 0x18ea, 0xb28a, 0x3412, 0xbff0, 0xbf2d, 0x43a0, 0xaba3, 0x1b78, 0x43f6, 0x406c, 0x43ad, 0x3e65, 0xbac1, 0x45ae, 0x3dce, 0x42da, 0x43c0, 0x42d3, 0x412a, 0xbfc7, 0x0784, 0x41db, 0xb288, 0x209d, 0x117f, 0x404f, 0x2dca, 0x2fa2, 0x0b73, 0x414d, 0x406e, 0xbad2, 0x431b, 0xbafd, 0x466b, 0x429e, 0x4198, 0xb2cb, 0xb2e6, 0xbf9e, 0x404a, 0xb2ba, 0xb096, 0xbac1, 0xba3b, 0x037e, 0x40fa, 0xb26c, 0x416c, 0xb2cb, 0xb014, 0x14dc, 0x412c, 0x2d78, 0x1d2e, 0x199d, 0xb2e8, 0x2adc, 0x426c, 0x1e46, 0x4305, 0x1c4a, 0x43a9, 0x1c02, 0x43e3, 0x466d, 0xbf6a, 0x3376, 0x11a5, 0x37df, 0x416c, 0x1bb3, 0xb27b, 0x4385, 0x0a41, 0x1dd5, 0xb2c3, 0x409e, 0x4112, 0x1cb0, 0x428d, 0x0dfe, 0x4391, 0xbf90, 0xba2b, 0xb2a9, 0x4159, 0x426e, 0x2534, 0x4260, 0xbafc, 0xb294, 0x4332, 0x3fed, 0xbfa9, 0x42a7, 0x422b, 0x1f0f, 0xbaf5, 0x21f3, 0xba2f, 0x15fb, 0xb2fa, 0xb025, 0x4024, 0x4014, 0x3c14, 0xbfac, 0x3734, 0xba6e, 0x435b, 0xba12, 0x2012, 0x4058, 0x423e, 0xabd2, 0x3645, 0x40c3, 0x20d0, 0x1d9d, 0x43c2, 0x41b3, 0x4693, 0x40b4, 0x2296, 0x409b, 0xb291, 0x437a, 0x424b, 0xbaf7, 0x4104, 0x437f, 0xbf96, 0x4102, 0x1886, 0x0fb9, 0x426e, 0x40b8, 0xb20e, 0x431d, 0x4291, 0x4291, 0x0c05, 0xb2d4, 0x199c, 0x428f, 0x44db, 0x413d, 0xbf31, 0xb289, 0x43f0, 0x332d, 0x4569, 0x4299, 0xb014, 0xba7d, 0xb0f3, 0x402e, 0x4045, 0x06a4, 0x43ca, 0x4094, 0x31bd, 0x4081, 0x427b, 0xb20d, 0xb2e6, 0x4632, 0x162d, 0x41c4, 0x2895, 0x40e7, 0x4653, 0xa661, 0xbf66, 0xbf90, 0x42b2, 0xaab5, 0xb090, 0x1583, 0x4639, 0xb28d, 0xb270, 0x40de, 0xbf82, 0xb222, 0x4270, 0x435a, 0x0de4, 0xb092, 0x40a8, 0x429e, 0x3997, 0x414e, 0x4399, 0x21a7, 0xb0e8, 0x4137, 0x46c0, 0x2806, 0x4172, 0x421d, 0x4322, 0x412e, 0x423d, 0x4127, 0x135d, 0x40da, 0x422f, 0x1a75, 0x40f4, 0xbaf0, 0xbf18, 0xba57, 0x0d36, 0xb2bb, 0x0ca6, 0x42fd, 0x425b, 0xbfe2, 0x4373, 0xbfc0, 0xa74d, 0xbfb6, 0xb262, 0xba79, 0x1e98, 0xa253, 0x0db2, 0x4160, 0x29eb, 0x0771, 0x4360, 0x1f61, 0xb2ac, 0x4196, 0x433c, 0x412b, 0x4054, 0x4197, 0xb04b, 0x240f, 0xb2fb, 0x4277, 0x4292, 0xb0a4, 0x1b9f, 0x4007, 0xb01d, 0xbf3d, 0xbfe0, 0x45e0, 0x4297, 0x420b, 0x4659, 0x4051, 0x4012, 0xbf78, 0x468a, 0x4083, 0x2755, 0x42be, 0x4699, 0x40fc, 0xb0e4, 0xaead, 0x458e, 0xa47e, 0x43cd, 0xac1b, 0x4401, 0x4182, 0x45f1, 0xbad0, 0x277d, 0x4580, 0x43f0, 0x1e04, 0x4001, 0x41f1, 0x42a9, 0xbf31, 0x2018, 0x435d, 0xb097, 0x0bdd, 0x449c, 0x4553, 0x1052, 0x41e1, 0x42ef, 0x43a3, 0x04ac, 0xae49, 0x4346, 0x1de8, 0x1ce6, 0x44a3, 0x432c, 0x4646, 0xb240, 0xb29f, 0x1d48, 0x436d, 0xbf36, 0x06c9, 0xbfa0, 0xb231, 0xbf52, 0x1d57, 0x40df, 0x40de, 0xb23c, 0x39bb, 0x2829, 0x4313, 0xa2f6, 0xb003, 0x446e, 0x1c7c, 0x3a4f, 0x007b, 0x427e, 0x083a, 0x1d84, 0xb088, 0x4176, 0x433b, 0x439c, 0xbf05, 0x44c2, 0x42ae, 0x4211, 0xa9ac, 0x1a23, 0xb20a, 0x46e4, 0xa4cc, 0xba2b, 0x4655, 0x2b20, 0x4070, 0xbfc0, 0x40ff, 0x4071, 0x1e59, 0x43a5, 0xbfdf, 0x1c22, 0x4315, 0x462d, 0x4183, 0x4560, 0x43b1, 0x1dc0, 0x4089, 0x17b2, 0x416c, 0x4345, 0x4302, 0xbf1d, 0x42a9, 0xbaf4, 0x40ea, 0x418d, 0xbad4, 0x1f28, 0x4035, 0x4255, 0x2404, 0x43a6, 0x4167, 0xba28, 0x2c13, 0x1a6a, 0x1bb3, 0x4186, 0x430e, 0x4556, 0x1a01, 0xbacc, 0xba0c, 0x410c, 0xb2e3, 0xbf1a, 0x1fc7, 0x4229, 0x462a, 0x4295, 0x1a63, 0xbf00, 0xbf70, 0xb26c, 0x1360, 0xbf95, 0x4151, 0x1132, 0x432b, 0x42d3, 0x0fb4, 0xba25, 0x1505, 0xbfde, 0x4338, 0x41dc, 0x4223, 0x3524, 0x422f, 0x4104, 0x414f, 0x3667, 0x1993, 0x4174, 0x40c2, 0xba13, 0xba2b, 0x289e, 0xba20, 0x406e, 0x20ae, 0xbacb, 0xa364, 0x40d6, 0xbfb8, 0x404f, 0x4398, 0xae33, 0x4023, 0x4333, 0x40c9, 0x43e8, 0x1b35, 0xb0c3, 0xbafb, 0x08c2, 0x4139, 0x42b3, 0xb089, 0xb242, 0x4129, 0xb008, 0xbf47, 0x2a1c, 0xb092, 0x2c58, 0x43c8, 0x41ca, 0x40c9, 0x32e6, 0x4182, 0x1769, 0x363c, 0x1639, 0x4231, 0xb286, 0x4075, 0xbf7f, 0x424c, 0x0094, 0x1c3d, 0x43a3, 0x40b6, 0x41ca, 0x435a, 0x3614, 0x378c, 0xb213, 0xbf85, 0x1839, 0xbae4, 0x1dd2, 0x414c, 0x4040, 0x41d3, 0x4040, 0xb254, 0x4110, 0x1e0a, 0x42e6, 0x095a, 0x0a7b, 0xbf46, 0x1375, 0xba1e, 0x4224, 0x41ee, 0xa734, 0x40dd, 0x42ee, 0x2906, 0x397f, 0xba5b, 0x41eb, 0xa422, 0x3dd1, 0x1dfc, 0x4444, 0x1c7b, 0x4068, 0x4258, 0x1350, 0xb2a6, 0x4155, 0x4213, 0x43ab, 0xbf37, 0xa368, 0x0c7a, 0x4175, 0x1cf7, 0x4260, 0x04fe, 0x18dc, 0xba1c, 0xa450, 0x2a7c, 0x351b, 0x416f, 0xbf55, 0x3b8b, 0x401f, 0x4282, 0xa41b, 0x41e1, 0xa299, 0xa6f3, 0xaca9, 0x1c37, 0x0145, 0x4285, 0xb269, 0x438b, 0x138c, 0x1eb7, 0x1d6e, 0xa51c, 0xb2d2, 0xae4b, 0xb2fc, 0xac6e, 0x4176, 0x1937, 0x42f2, 0x4293, 0xbf48, 0x4280, 0x4685, 0x421f, 0x4394, 0x050c, 0xbfc4, 0x372a, 0x401d, 0xbae7, 0x42f6, 0x40b6, 0xa1e8, 0x44aa, 0x3def, 0x429c, 0x3117, 0x1dba, 0x1a58, 0x415a, 0xa67a, 0x43b3, 0xbf21, 0xbf90, 0xa973, 0xba48, 0xba58, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x2222d05c, 0xcfc689d4, 0xc2140172, 0x47506221, 0xe5f77550, 0x38359c85, 0x4e95a963, 0xe20bac00, 0x9f1922b1, 0x5e07b7dc, 0x32b31e2b, 0x9b89a1e5, 0x70e8b6e8, 0xae4936fc, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0xffffe4fa, 0x00001b77, 0x00000077, 0x00000041, 0xf8000000, 0x00001719, 0x000019b8, 0x00000000, 0x9f1922b1, 0x00000057, 0x00001666, 0xfffffe5e, 0x00007157, 0x60e6c544, 0x00000000, 0x000001d0 }, + Instructions = [0x1ed2, 0xb283, 0x434a, 0x3937, 0x4179, 0x4253, 0x4017, 0x023f, 0x42bc, 0x408d, 0xb22a, 0x4268, 0xba5b, 0x1a31, 0x40a2, 0x1dd9, 0x2161, 0x4449, 0x4000, 0x402e, 0x41ce, 0xbf83, 0xba1e, 0x44b0, 0xba18, 0x425e, 0xa764, 0xbfc0, 0x406f, 0x40bd, 0xb0b7, 0xa99c, 0x4005, 0xa0c2, 0x41a4, 0x3ff8, 0x402c, 0x036d, 0xbf57, 0x3e68, 0x4153, 0xb0e0, 0x4689, 0x42e0, 0x406f, 0x40c8, 0xb0b1, 0x4593, 0x40f8, 0xb2d1, 0xa877, 0x4379, 0x434e, 0xba1e, 0xbf71, 0xba71, 0xb2b1, 0xb0c1, 0xb232, 0x41fc, 0x463f, 0x4069, 0xb25b, 0x4241, 0xb2c0, 0x405a, 0x4048, 0xba32, 0x4258, 0x41ef, 0xbf78, 0x0754, 0xb277, 0xbf60, 0x4089, 0xba4a, 0x4074, 0xb252, 0xb2cb, 0x4134, 0x434c, 0x43e1, 0x1e9c, 0x1c02, 0x40a7, 0xb24e, 0x1e02, 0xbf17, 0x3511, 0xb2a3, 0xba19, 0xaccd, 0x4091, 0x1fc1, 0xb057, 0x43b8, 0xb2c8, 0x4180, 0x377e, 0x43d3, 0x09e2, 0x4266, 0xb26c, 0xbf1f, 0x4260, 0xb24e, 0xb24a, 0xb2ac, 0xbfd0, 0xba7a, 0x45b2, 0x4038, 0x418f, 0x15f9, 0xba63, 0xba2d, 0x42f3, 0x403e, 0x4038, 0x41c9, 0x4152, 0x2ee7, 0x4259, 0x0226, 0xbf41, 0x21d2, 0x4430, 0x4007, 0x17ed, 0xbfbd, 0x4058, 0x3e16, 0x407a, 0x40e3, 0x41a0, 0x43d8, 0x404a, 0x40f2, 0x1605, 0x42a3, 0x4631, 0x44f0, 0xbfe0, 0xa21c, 0x290b, 0xaade, 0x40aa, 0x43ae, 0x4126, 0x29c9, 0x420d, 0xbfa4, 0xba6b, 0x41cc, 0x2a49, 0xa316, 0x4308, 0xb04c, 0x4261, 0x0a3b, 0x27f8, 0x422b, 0x02f7, 0x401f, 0x4084, 0xa4c4, 0x1d89, 0xaf46, 0x4159, 0xbad0, 0xb287, 0x41f4, 0x0ae8, 0x423b, 0x3f2b, 0xb210, 0x41bf, 0xbfa5, 0x4333, 0x447e, 0x4403, 0xb24d, 0xbf80, 0x4201, 0x40ff, 0xb2da, 0x41df, 0xb2fa, 0x4257, 0x4366, 0x43e5, 0xbfba, 0x431d, 0x4558, 0xb296, 0xba51, 0xbacf, 0x4313, 0xbadd, 0x40e6, 0x25fe, 0x4223, 0xb2e4, 0x400a, 0x362d, 0x40bd, 0x1e5c, 0x4010, 0xa3e8, 0x4695, 0x22de, 0x3070, 0x1c9a, 0x2d98, 0xb0b1, 0x1f41, 0xb2e6, 0x415c, 0xbac2, 0xbf69, 0x3816, 0x1f3a, 0x1f46, 0xb06c, 0x10f7, 0x1ee5, 0x400e, 0xbf08, 0x2a02, 0x179e, 0xadb5, 0x42f2, 0x410d, 0x4258, 0xb24d, 0x4424, 0xbaf2, 0x4143, 0x40e8, 0x4339, 0xb231, 0x437a, 0xb2f1, 0x42fd, 0x1dff, 0xbf91, 0x43ed, 0x468c, 0x427d, 0xb211, 0x4388, 0x4101, 0xba6d, 0x3708, 0x19fc, 0xb2fe, 0x410f, 0x1fdc, 0x2d26, 0x0b81, 0xb23e, 0x46b2, 0x4194, 0xacb8, 0x40ec, 0x3012, 0xbfb0, 0x45b1, 0xb2b7, 0x1ea0, 0xb246, 0x4007, 0x23e5, 0xbf92, 0x426f, 0x1eab, 0x4371, 0x0c6a, 0xb21d, 0x4442, 0x1954, 0x1957, 0xba05, 0xb27f, 0xb00c, 0x437f, 0xb022, 0x4223, 0x1d0e, 0xbf97, 0xbaf4, 0x1c45, 0xba0e, 0x469d, 0x4049, 0x2a26, 0xb2f0, 0x4272, 0x441a, 0x465b, 0xb2b7, 0x1885, 0x45ca, 0x43b9, 0x1b66, 0x42fe, 0x467e, 0x3529, 0x36da, 0x43fb, 0x1fea, 0x4249, 0x281b, 0xbf81, 0x3ce3, 0xb25a, 0x4119, 0x41d7, 0x1ba6, 0x426c, 0x41ad, 0x4041, 0x41af, 0x44b2, 0x41c6, 0xbf86, 0x41b6, 0xac9f, 0x2b28, 0x4001, 0xba03, 0xbfb0, 0x40b8, 0x3572, 0xba6e, 0x19d2, 0xbf22, 0xacf7, 0xab27, 0x2775, 0x40d1, 0x438f, 0x4214, 0x17c4, 0x40f8, 0x42ce, 0xa942, 0x3854, 0x44cd, 0x1cf3, 0xbfb8, 0x1a6f, 0x1817, 0x2f34, 0x42f3, 0xaa11, 0xba6c, 0x4560, 0x2208, 0x43ac, 0x45bb, 0x45f5, 0x09eb, 0xbf06, 0xb251, 0x1def, 0xbff0, 0x0c9f, 0x40e4, 0x4453, 0x1aab, 0x4365, 0xb2e1, 0x46a4, 0x4000, 0x12f4, 0x3204, 0x4360, 0x4350, 0x4185, 0x41ba, 0x3fca, 0x31d6, 0xa211, 0x42eb, 0x42a0, 0xadb7, 0xbaec, 0x41d4, 0x409c, 0xbaf5, 0xbfa1, 0x15b0, 0x4234, 0x4345, 0x4215, 0x43fc, 0xba60, 0xb034, 0x25ec, 0x4108, 0xb250, 0x2343, 0x44aa, 0xb2ed, 0x4234, 0x46ba, 0x420a, 0x0fcf, 0xbf2e, 0xb0aa, 0xa5a5, 0xb0e2, 0x41d3, 0xb292, 0x1d9c, 0xbf75, 0x190f, 0x2337, 0xb245, 0x080c, 0xb2cf, 0xa08b, 0x40ce, 0x40c3, 0x4121, 0x192b, 0x327a, 0x4341, 0x0fb8, 0xbfe0, 0xb2a8, 0x26ea, 0x3b79, 0x41eb, 0x18ea, 0xb28a, 0x3412, 0xbff0, 0xbf2d, 0x43a0, 0xaba3, 0x1b78, 0x43f6, 0x406c, 0x43ad, 0x3e65, 0xbac1, 0x45ae, 0x3dce, 0x42da, 0x43c0, 0x42d3, 0x412a, 0xbfc7, 0x0784, 0x41db, 0xb288, 0x209d, 0x117f, 0x404f, 0x2dca, 0x2fa2, 0x0b73, 0x414d, 0x406e, 0xbad2, 0x431b, 0xbafd, 0x466b, 0x429e, 0x4198, 0xb2cb, 0xb2e6, 0xbf9e, 0x404a, 0xb2ba, 0xb096, 0xbac1, 0xba3b, 0x037e, 0x40fa, 0xb26c, 0x416c, 0xb2cb, 0xb014, 0x14dc, 0x412c, 0x2d78, 0x1d2e, 0x199d, 0xb2e8, 0x2adc, 0x426c, 0x1e46, 0x4305, 0x1c4a, 0x43a9, 0x1c02, 0x43e3, 0x466d, 0xbf6a, 0x3376, 0x11a5, 0x37df, 0x416c, 0x1bb3, 0xb27b, 0x4385, 0x0a41, 0x1dd5, 0xb2c3, 0x409e, 0x4112, 0x1cb0, 0x428d, 0x0dfe, 0x4391, 0xbf90, 0xba2b, 0xb2a9, 0x4159, 0x426e, 0x2534, 0x4260, 0xbafc, 0xb294, 0x4332, 0x3fed, 0xbfa9, 0x42a7, 0x422b, 0x1f0f, 0xbaf5, 0x21f3, 0xba2f, 0x15fb, 0xb2fa, 0xb025, 0x4024, 0x4014, 0x3c14, 0xbfac, 0x3734, 0xba6e, 0x435b, 0xba12, 0x2012, 0x4058, 0x423e, 0xabd2, 0x3645, 0x40c3, 0x20d0, 0x1d9d, 0x43c2, 0x41b3, 0x4693, 0x40b4, 0x2296, 0x409b, 0xb291, 0x437a, 0x424b, 0xbaf7, 0x4104, 0x437f, 0xbf96, 0x4102, 0x1886, 0x0fb9, 0x426e, 0x40b8, 0xb20e, 0x431d, 0x4291, 0x4291, 0x0c05, 0xb2d4, 0x199c, 0x428f, 0x44db, 0x413d, 0xbf31, 0xb289, 0x43f0, 0x332d, 0x4569, 0x4299, 0xb014, 0xba7d, 0xb0f3, 0x402e, 0x4045, 0x06a4, 0x43ca, 0x4094, 0x31bd, 0x4081, 0x427b, 0xb20d, 0xb2e6, 0x4632, 0x162d, 0x41c4, 0x2895, 0x40e7, 0x4653, 0xa661, 0xbf66, 0xbf90, 0x42b2, 0xaab5, 0xb090, 0x1583, 0x4639, 0xb28d, 0xb270, 0x40de, 0xbf82, 0xb222, 0x4270, 0x435a, 0x0de4, 0xb092, 0x40a8, 0x429e, 0x3997, 0x414e, 0x4399, 0x21a7, 0xb0e8, 0x4137, 0x46c0, 0x2806, 0x4172, 0x421d, 0x4322, 0x412e, 0x423d, 0x4127, 0x135d, 0x40da, 0x422f, 0x1a75, 0x40f4, 0xbaf0, 0xbf18, 0xba57, 0x0d36, 0xb2bb, 0x0ca6, 0x42fd, 0x425b, 0xbfe2, 0x4373, 0xbfc0, 0xa74d, 0xbfb6, 0xb262, 0xba79, 0x1e98, 0xa253, 0x0db2, 0x4160, 0x29eb, 0x0771, 0x4360, 0x1f61, 0xb2ac, 0x4196, 0x433c, 0x412b, 0x4054, 0x4197, 0xb04b, 0x240f, 0xb2fb, 0x4277, 0x4292, 0xb0a4, 0x1b9f, 0x4007, 0xb01d, 0xbf3d, 0xbfe0, 0x45e0, 0x4297, 0x420b, 0x4659, 0x4051, 0x4012, 0xbf78, 0x468a, 0x4083, 0x2755, 0x42be, 0x4699, 0x40fc, 0xb0e4, 0xaead, 0x458e, 0xa47e, 0x43cd, 0xac1b, 0x4401, 0x4182, 0x45f1, 0xbad0, 0x277d, 0x4580, 0x43f0, 0x1e04, 0x4001, 0x41f1, 0x42a9, 0xbf31, 0x2018, 0x435d, 0xb097, 0x0bdd, 0x449c, 0x4553, 0x1052, 0x41e1, 0x42ef, 0x43a3, 0x04ac, 0xae49, 0x4346, 0x1de8, 0x1ce6, 0x44a3, 0x432c, 0x4646, 0xb240, 0xb29f, 0x1d48, 0x436d, 0xbf36, 0x06c9, 0xbfa0, 0xb231, 0xbf52, 0x1d57, 0x40df, 0x40de, 0xb23c, 0x39bb, 0x2829, 0x4313, 0xa2f6, 0xb003, 0x446e, 0x1c7c, 0x3a4f, 0x007b, 0x427e, 0x083a, 0x1d84, 0xb088, 0x4176, 0x433b, 0x439c, 0xbf05, 0x44c2, 0x42ae, 0x4211, 0xa9ac, 0x1a23, 0xb20a, 0x46e4, 0xa4cc, 0xba2b, 0x4655, 0x2b20, 0x4070, 0xbfc0, 0x40ff, 0x4071, 0x1e59, 0x43a5, 0xbfdf, 0x1c22, 0x4315, 0x462d, 0x4183, 0x4560, 0x43b1, 0x1dc0, 0x4089, 0x17b2, 0x416c, 0x4345, 0x4302, 0xbf1d, 0x42a9, 0xbaf4, 0x40ea, 0x418d, 0xbad4, 0x1f28, 0x4035, 0x4255, 0x2404, 0x43a6, 0x4167, 0xba28, 0x2c13, 0x1a6a, 0x1bb3, 0x4186, 0x430e, 0x4556, 0x1a01, 0xbacc, 0xba0c, 0x410c, 0xb2e3, 0xbf1a, 0x1fc7, 0x4229, 0x462a, 0x4295, 0x1a63, 0xbf00, 0xbf70, 0xb26c, 0x1360, 0xbf95, 0x4151, 0x1132, 0x432b, 0x42d3, 0x0fb4, 0xba25, 0x1505, 0xbfde, 0x4338, 0x41dc, 0x4223, 0x3524, 0x422f, 0x4104, 0x414f, 0x3667, 0x1993, 0x4174, 0x40c2, 0xba13, 0xba2b, 0x289e, 0xba20, 0x406e, 0x20ae, 0xbacb, 0xa364, 0x40d6, 0xbfb8, 0x404f, 0x4398, 0xae33, 0x4023, 0x4333, 0x40c9, 0x43e8, 0x1b35, 0xb0c3, 0xbafb, 0x08c2, 0x4139, 0x42b3, 0xb089, 0xb242, 0x4129, 0xb008, 0xbf47, 0x2a1c, 0xb092, 0x2c58, 0x43c8, 0x41ca, 0x40c9, 0x32e6, 0x4182, 0x1769, 0x363c, 0x1639, 0x4231, 0xb286, 0x4075, 0xbf7f, 0x424c, 0x0094, 0x1c3d, 0x43a3, 0x40b6, 0x41ca, 0x435a, 0x3614, 0x378c, 0xb213, 0xbf85, 0x1839, 0xbae4, 0x1dd2, 0x414c, 0x4040, 0x41d3, 0x4040, 0xb254, 0x4110, 0x1e0a, 0x42e6, 0x095a, 0x0a7b, 0xbf46, 0x1375, 0xba1e, 0x4224, 0x41ee, 0xa734, 0x40dd, 0x42ee, 0x2906, 0x397f, 0xba5b, 0x41eb, 0xa422, 0x3dd1, 0x1dfc, 0x4444, 0x1c7b, 0x4068, 0x4258, 0x1350, 0xb2a6, 0x4155, 0x4213, 0x43ab, 0xbf37, 0xa368, 0x0c7a, 0x4175, 0x1cf7, 0x4260, 0x04fe, 0x18dc, 0xba1c, 0xa450, 0x2a7c, 0x351b, 0x416f, 0xbf55, 0x3b8b, 0x401f, 0x4282, 0xa41b, 0x41e1, 0xa299, 0xa6f3, 0xaca9, 0x1c37, 0x0145, 0x4285, 0xb269, 0x438b, 0x138c, 0x1eb7, 0x1d6e, 0xa51c, 0xb2d2, 0xae4b, 0xb2fc, 0xac6e, 0x4176, 0x1937, 0x42f2, 0x4293, 0xbf48, 0x4280, 0x4685, 0x421f, 0x4394, 0x050c, 0xbfc4, 0x372a, 0x401d, 0xbae7, 0x42f6, 0x40b6, 0xa1e8, 0x44aa, 0x3def, 0x429c, 0x3117, 0x1dba, 0x1a58, 0x415a, 0xa67a, 0x43b3, 0xbf21, 0xbf90, 0xa973, 0xba48, 0xba58, 0x4770, 0xe7fe + ], + StartRegs = [0x2222d05c, 0xcfc689d4, 0xc2140172, 0x47506221, 0xe5f77550, 0x38359c85, 0x4e95a963, 0xe20bac00, 0x9f1922b1, 0x5e07b7dc, 0x32b31e2b, 0x9b89a1e5, 0x70e8b6e8, 0xae4936fc, 0x00000000, 0x100001f0 + ], + FinalRegs = [0xffffe4fa, 0x00001b77, 0x00000077, 0x00000041, 0xf8000000, 0x00001719, 0x000019b8, 0x00000000, 0x9f1922b1, 0x00000057, 0x00001666, 0xfffffe5e, 0x00007157, 0x60e6c544, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x439f, 0x404c, 0x454a, 0x41ed, 0xbf7a, 0x1535, 0x428d, 0x1c71, 0x4125, 0xb281, 0x40a4, 0xb25a, 0x40f7, 0xaab2, 0xb256, 0xb236, 0xb08c, 0x4180, 0x1249, 0x3e60, 0x235c, 0x40f0, 0xba68, 0xbaf7, 0x45e3, 0x4314, 0x411a, 0xb2f1, 0xbf35, 0x4689, 0xb26e, 0xba71, 0x4072, 0x1cd9, 0x4451, 0x4343, 0x4275, 0x1acd, 0x3026, 0x43af, 0x4279, 0xb2fb, 0xb24f, 0x41c1, 0x4101, 0x40d8, 0x4171, 0x436e, 0xb092, 0xbf9b, 0x4190, 0x40ab, 0x1bbc, 0x1ad7, 0x45a3, 0x412f, 0x1374, 0x45c8, 0x1e94, 0x40c4, 0xb0d8, 0x41c8, 0x4044, 0x1d6f, 0x4134, 0x45d8, 0x426b, 0x404c, 0x1986, 0x401c, 0xb2aa, 0x4375, 0x423e, 0x1ac8, 0xbfb3, 0xb296, 0xba27, 0x3e43, 0x4315, 0xbfb0, 0x1914, 0x43f8, 0x42a1, 0x426a, 0x0cfa, 0x4027, 0x4270, 0xadfb, 0x45dc, 0x309c, 0x407d, 0xa010, 0x1d78, 0x34b3, 0x1b29, 0xb2c0, 0x463a, 0x196a, 0x41b1, 0x42c5, 0x40a5, 0x454d, 0xb28f, 0xbf37, 0xba22, 0x1c18, 0x2832, 0x41fe, 0x1a1b, 0x1dd0, 0x4634, 0x4058, 0x2da1, 0x427b, 0xb2c7, 0x4280, 0x1e11, 0x40a9, 0xba2d, 0xba19, 0xbf44, 0xba11, 0x4068, 0x180e, 0x4178, 0x41ee, 0x4651, 0x407e, 0x4353, 0x4245, 0xbae4, 0xa4d0, 0x0dd5, 0xb27b, 0x1be0, 0x4062, 0xb220, 0x4352, 0x40e3, 0x41c9, 0xb21f, 0xbf00, 0xbf03, 0x29da, 0x40c0, 0x4179, 0x1f95, 0x187d, 0x43d8, 0x1ad8, 0xb223, 0x4648, 0x3fb2, 0x2ec5, 0xba50, 0x42c2, 0x3b0b, 0x1fbf, 0xb240, 0x41e0, 0x3a20, 0x032c, 0xb21a, 0xa161, 0x42bb, 0xbf26, 0xbf80, 0x446c, 0x4305, 0xb068, 0xba5f, 0x130a, 0x2736, 0xabf8, 0x1967, 0x2038, 0xb260, 0xba40, 0x4241, 0xaf27, 0x4381, 0x40af, 0x438c, 0x437c, 0x4672, 0xbae3, 0x3e4c, 0xb228, 0x1cc4, 0x432e, 0xbf3a, 0x1c2b, 0x1678, 0xa23f, 0x1dd4, 0x42a9, 0xbff0, 0x397e, 0x42a1, 0xbf54, 0x41a6, 0x4124, 0xb2f5, 0x1d50, 0x42a9, 0xba79, 0xba33, 0xa80d, 0xbf60, 0x4329, 0x4161, 0x3a12, 0x40ed, 0x4562, 0x4303, 0x1853, 0xbf6b, 0x4379, 0x4307, 0x436e, 0x41b0, 0xba44, 0x4178, 0xbf90, 0xb2db, 0xa99c, 0x4671, 0x46a9, 0x44b3, 0x40fc, 0xab9e, 0xb21d, 0x42a7, 0x40f3, 0xb2cd, 0x24b3, 0x41b7, 0x1db8, 0xbf4c, 0x4207, 0xba4b, 0x4227, 0xb064, 0x405a, 0x416a, 0x1222, 0xb0e1, 0x0ff4, 0xba13, 0xbf8a, 0x423f, 0x440b, 0x4007, 0xbadf, 0xb25b, 0xae38, 0x229d, 0xbfcb, 0x3f66, 0x259e, 0xb092, 0x4248, 0x422f, 0x18b3, 0xbfd2, 0x147a, 0x43ce, 0xac74, 0xa9c0, 0x454c, 0xba1f, 0x0865, 0x40bf, 0xb291, 0xb241, 0x4311, 0x1e25, 0xb2e5, 0x3038, 0x4647, 0x4254, 0x4007, 0x4276, 0x42cb, 0x4024, 0x1ee1, 0x206a, 0x0c99, 0x3aea, 0xbfc8, 0xbf60, 0x1eea, 0x410e, 0x4365, 0x03ee, 0x1d17, 0xb2e5, 0x4244, 0x0fc2, 0x1bf2, 0x1b74, 0xbac0, 0x1770, 0xbfcd, 0x02d1, 0x4251, 0x4200, 0xb2c5, 0xbafb, 0x43b8, 0xbf87, 0x425a, 0xbfd0, 0x18bb, 0x4186, 0xb0de, 0xba16, 0x199f, 0x444c, 0x4265, 0xa487, 0x41cf, 0x40e4, 0xb093, 0xbfa0, 0x4164, 0x0082, 0x433b, 0x40a3, 0x1957, 0x0653, 0xba10, 0x1011, 0x43cc, 0xb08c, 0xb24a, 0x2f88, 0xbfe4, 0xb291, 0x4251, 0xb0ec, 0xba67, 0x3fec, 0x401c, 0x2df3, 0xb225, 0x1ed0, 0x22cf, 0x41c4, 0xbfdc, 0xaa7d, 0x1e25, 0x40a5, 0x43a0, 0x41bf, 0xba39, 0x40cc, 0x4117, 0x46b9, 0x407b, 0xb0d5, 0x1cfb, 0x43ed, 0xb2ce, 0x4229, 0x2a4a, 0x1317, 0x41f3, 0x1a08, 0x1aae, 0x1737, 0xbf8a, 0x1ee8, 0x430e, 0x401b, 0x419c, 0x4121, 0xba1d, 0x109a, 0x18d9, 0x1dc3, 0x4331, 0xbac3, 0x00f7, 0x4178, 0x41c8, 0xa2e7, 0xb2be, 0x18bc, 0xb288, 0x1527, 0x43e5, 0x1c45, 0x2f37, 0x423d, 0xba43, 0x4238, 0xbf75, 0x22e5, 0xbfb0, 0x4073, 0x34ad, 0xa802, 0xb084, 0x4154, 0x4333, 0xa7e3, 0x4170, 0x43d9, 0xbfa0, 0x43c6, 0x43d0, 0xb292, 0xa2aa, 0x42e5, 0xbace, 0x42a1, 0x4361, 0x42f9, 0xbf4c, 0x423e, 0x0e80, 0xb233, 0xb2c7, 0xa44f, 0x1a00, 0xbf00, 0x1d47, 0xb265, 0xb203, 0x4330, 0x4268, 0x40c9, 0xb299, 0xba4d, 0xb23a, 0x2d3b, 0xba5e, 0xbf00, 0x43cb, 0xbf28, 0x1595, 0x43e5, 0x0dd2, 0xb287, 0x429c, 0x4683, 0xbfe0, 0x410c, 0x4363, 0x117d, 0x0706, 0x377b, 0xbfa4, 0xb2e7, 0x42e5, 0x45e1, 0x441b, 0x42bf, 0xb08c, 0x427e, 0xb05a, 0x09e5, 0xbf69, 0x438c, 0xbafe, 0x45f6, 0xaad2, 0x0016, 0xbf0b, 0x419d, 0x4024, 0x4146, 0xb0b5, 0x461d, 0x41f8, 0xb044, 0x1cc0, 0xbae5, 0xb086, 0x44cc, 0x420f, 0xb0b0, 0x4679, 0x4009, 0x1a55, 0x404c, 0x41cb, 0x4035, 0x4313, 0x4085, 0x404f, 0x000e, 0x1544, 0xada3, 0xbf09, 0x2288, 0xb215, 0x40ff, 0x426a, 0x40a6, 0xb26e, 0x305e, 0xb206, 0x3b04, 0xa30a, 0xba3a, 0x459e, 0xba24, 0x418b, 0x40ad, 0x440a, 0x435d, 0xb262, 0x42ad, 0xb0d9, 0xb08c, 0xbf5c, 0x4351, 0xb2d0, 0xbf12, 0x1b96, 0xb27a, 0x4154, 0xa009, 0x1c94, 0xa32e, 0x1c08, 0x38a7, 0x43af, 0x418b, 0x43c7, 0x296c, 0x273c, 0x4276, 0x25d3, 0x42c3, 0xba0c, 0xb284, 0xbf19, 0xb2ea, 0xba0e, 0x4069, 0xb003, 0x469c, 0xb0ee, 0xb219, 0x43cb, 0x424b, 0x41f6, 0x3973, 0xb271, 0x401c, 0x23a6, 0x40ea, 0xba16, 0x194a, 0xa210, 0x1c5b, 0xb07a, 0xbfa1, 0x4271, 0x190b, 0xba0c, 0x0783, 0xa0dc, 0x46d0, 0xbf54, 0x42fc, 0x0ea4, 0x1cde, 0x0a0a, 0x4115, 0xb2b7, 0xb2fa, 0xbf2f, 0x436e, 0x4374, 0xba73, 0x43cd, 0x4460, 0xad56, 0xb2cd, 0x4157, 0x40c1, 0x1a23, 0x4011, 0x42de, 0x42ab, 0x41f5, 0x4299, 0x43d1, 0x36ef, 0x4135, 0xade3, 0xbfcc, 0x1d9e, 0x425d, 0x43d0, 0xb26e, 0xb26d, 0xb0fe, 0xbaf7, 0x4106, 0x43d0, 0x4311, 0xbfdc, 0x2ac1, 0xb048, 0x434f, 0xb2b4, 0x12bc, 0x1ff4, 0x1aa2, 0xbad4, 0x428d, 0xb28c, 0x44e3, 0x4323, 0x407e, 0x350d, 0x4600, 0x4304, 0x40b5, 0x4253, 0xb2d9, 0xbfd7, 0xb062, 0xb0bd, 0x4567, 0x465d, 0xba1f, 0x0580, 0x46da, 0xb073, 0x3249, 0xb2fc, 0x41a4, 0x4235, 0x2daa, 0xb097, 0xbf5a, 0x41aa, 0x44c3, 0x42c0, 0x0536, 0xb239, 0x42c5, 0xbf6e, 0x19da, 0x296c, 0x324a, 0x395f, 0x40c6, 0x40fe, 0x4023, 0x00f5, 0x281c, 0x2646, 0x3352, 0xb2b7, 0xb2fb, 0xb27b, 0x44a0, 0x41ee, 0xbf81, 0xa1c3, 0x43e2, 0x4047, 0x43c2, 0xba7c, 0x2eae, 0xb281, 0x1807, 0x23c0, 0x1b92, 0x4116, 0xa4a6, 0x43f3, 0x4333, 0x1ae6, 0x25ec, 0x373d, 0xbfc3, 0xafa6, 0x409b, 0x1ffa, 0x183a, 0x46d5, 0x42e4, 0x418e, 0x422e, 0x43ad, 0xad75, 0x18e8, 0x4087, 0x0fb4, 0x0dc6, 0x1913, 0xabed, 0x4331, 0x40fa, 0xbf95, 0x18ab, 0x1aa0, 0x33e6, 0x4354, 0x4338, 0xb2cf, 0x4683, 0x4289, 0x42a1, 0x1ed3, 0x43c5, 0x434e, 0xb2bc, 0xa1bd, 0x4098, 0x418a, 0x25fe, 0x4348, 0x27b1, 0xa5ce, 0x121a, 0x4229, 0xbfa4, 0xb2d8, 0xb290, 0xbfdd, 0xa03c, 0x4217, 0x41b7, 0x41c0, 0xb0e8, 0x19ee, 0x41ea, 0x4294, 0x418d, 0x4075, 0xb04c, 0xbfce, 0xb083, 0x3289, 0x40a7, 0x429d, 0x4277, 0x454a, 0x43a4, 0x1f9a, 0xb2cf, 0x40a6, 0x42b7, 0xb277, 0x27de, 0x43cd, 0xba20, 0xb255, 0x4301, 0x43de, 0x41f0, 0xba42, 0x40b3, 0x05ae, 0xbafb, 0xbaf1, 0x443b, 0x4022, 0xbf68, 0xb286, 0xb2f3, 0xac85, 0x4129, 0x435d, 0x4344, 0x42c3, 0x41d8, 0xb247, 0xbf65, 0x42b9, 0x0ff6, 0x412c, 0xb2e8, 0x4406, 0x42e1, 0x3032, 0x416c, 0xb298, 0xab81, 0xb090, 0x434d, 0xbf87, 0x1cb0, 0x404c, 0xaf0e, 0x33b1, 0x3a35, 0x1c47, 0x43e5, 0xbacc, 0x323d, 0x336a, 0x4125, 0xb062, 0xba38, 0x429b, 0x4173, 0xbf95, 0x40bd, 0x164b, 0xb232, 0xb292, 0x4283, 0xa0d8, 0xb0a5, 0x197f, 0x43d2, 0x1b4f, 0x092b, 0x40d5, 0x1abc, 0x468d, 0xb0ac, 0xb289, 0xb231, 0x1f75, 0xba2c, 0x3a4e, 0x429d, 0x3a08, 0x414a, 0x400f, 0xbfc5, 0x42db, 0x4041, 0x4204, 0xb225, 0x022c, 0x41a9, 0x1def, 0x1cf5, 0x4217, 0x4047, 0x0cb3, 0x3896, 0x4383, 0x28ec, 0x4036, 0x434c, 0x424d, 0x392c, 0x0f8f, 0x2d25, 0x1ca0, 0x40d1, 0x4273, 0x4365, 0x41ce, 0xbf27, 0xb22d, 0x1762, 0x430b, 0xb23a, 0x419f, 0x40f7, 0x421c, 0x44f9, 0x41fa, 0x43d0, 0x428a, 0xb010, 0xb0b8, 0x402a, 0x40ba, 0xbf65, 0x3a3b, 0x4205, 0x41d3, 0xb2df, 0xb019, 0x422b, 0x4207, 0xba0a, 0x430c, 0x18fd, 0xbaf8, 0x4162, 0x400e, 0x4099, 0x40bd, 0x268f, 0xbaee, 0x42ed, 0x1a55, 0x42a5, 0x19bf, 0xb229, 0xb2de, 0x4169, 0xba79, 0x0f16, 0xb2d5, 0x4193, 0xbf2f, 0x0861, 0x4315, 0x05f0, 0xba76, 0xb2e6, 0xbf75, 0x0d63, 0x4580, 0x41dc, 0x4196, 0xbad8, 0x042b, 0x1a1c, 0x1e88, 0xba71, 0x19b1, 0x08a3, 0x314e, 0xba39, 0x40f9, 0x23e3, 0xb0e9, 0x11cb, 0x41b8, 0xbf1c, 0x1a4f, 0xa122, 0x416d, 0xb045, 0xb05f, 0x456c, 0x2fbd, 0x1eae, 0x43ef, 0x1264, 0x41be, 0x2531, 0x4240, 0xbf8c, 0x40fa, 0xb2ef, 0xaa96, 0x4398, 0x40fe, 0xb2e5, 0x4331, 0x419d, 0xba00, 0x4618, 0x4219, 0x408f, 0x438c, 0xb2a7, 0x41f6, 0xb272, 0xab3a, 0x1bd0, 0x2ece, 0x40ff, 0x1f10, 0xbf34, 0x2253, 0x40a3, 0x426e, 0x4206, 0x4262, 0x4354, 0x2793, 0xae78, 0x427a, 0x4370, 0x1911, 0x387b, 0x46e4, 0x18dc, 0x4259, 0x4013, 0xad55, 0x443c, 0x4231, 0xb015, 0x42d5, 0xa0d6, 0x41b8, 0xbf92, 0x4689, 0x4305, 0x3f97, 0x4356, 0xba74, 0x40a2, 0x43b8, 0x46bc, 0x4002, 0x0f62, 0xbacf, 0xbadb, 0x4562, 0xbf3c, 0xbfd0, 0x1eb6, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xb6e12d7d, 0x2bc8f2a0, 0xe074d4cb, 0x76b33514, 0x92975e84, 0xc4f82ea7, 0xeb560f6d, 0x9507ee5e, 0xd48a048b, 0x1aa04244, 0xe9639443, 0xe7dafbbf, 0x050a37ec, 0x91c1b356, 0x00000000, 0xd00001f0 }, - FinalRegs = new uint[] { 0x00000001, 0xffffff18, 0x00000007, 0x00006800, 0xfeff60ec, 0x00001b7d, 0xfffeec5e, 0x000018ff, 0xe9639443, 0x000016c5, 0x00001547, 0xf400171a, 0xfffffffc, 0x00000054, 0x00000000, 0x000001d0 }, + Instructions = [0x439f, 0x404c, 0x454a, 0x41ed, 0xbf7a, 0x1535, 0x428d, 0x1c71, 0x4125, 0xb281, 0x40a4, 0xb25a, 0x40f7, 0xaab2, 0xb256, 0xb236, 0xb08c, 0x4180, 0x1249, 0x3e60, 0x235c, 0x40f0, 0xba68, 0xbaf7, 0x45e3, 0x4314, 0x411a, 0xb2f1, 0xbf35, 0x4689, 0xb26e, 0xba71, 0x4072, 0x1cd9, 0x4451, 0x4343, 0x4275, 0x1acd, 0x3026, 0x43af, 0x4279, 0xb2fb, 0xb24f, 0x41c1, 0x4101, 0x40d8, 0x4171, 0x436e, 0xb092, 0xbf9b, 0x4190, 0x40ab, 0x1bbc, 0x1ad7, 0x45a3, 0x412f, 0x1374, 0x45c8, 0x1e94, 0x40c4, 0xb0d8, 0x41c8, 0x4044, 0x1d6f, 0x4134, 0x45d8, 0x426b, 0x404c, 0x1986, 0x401c, 0xb2aa, 0x4375, 0x423e, 0x1ac8, 0xbfb3, 0xb296, 0xba27, 0x3e43, 0x4315, 0xbfb0, 0x1914, 0x43f8, 0x42a1, 0x426a, 0x0cfa, 0x4027, 0x4270, 0xadfb, 0x45dc, 0x309c, 0x407d, 0xa010, 0x1d78, 0x34b3, 0x1b29, 0xb2c0, 0x463a, 0x196a, 0x41b1, 0x42c5, 0x40a5, 0x454d, 0xb28f, 0xbf37, 0xba22, 0x1c18, 0x2832, 0x41fe, 0x1a1b, 0x1dd0, 0x4634, 0x4058, 0x2da1, 0x427b, 0xb2c7, 0x4280, 0x1e11, 0x40a9, 0xba2d, 0xba19, 0xbf44, 0xba11, 0x4068, 0x180e, 0x4178, 0x41ee, 0x4651, 0x407e, 0x4353, 0x4245, 0xbae4, 0xa4d0, 0x0dd5, 0xb27b, 0x1be0, 0x4062, 0xb220, 0x4352, 0x40e3, 0x41c9, 0xb21f, 0xbf00, 0xbf03, 0x29da, 0x40c0, 0x4179, 0x1f95, 0x187d, 0x43d8, 0x1ad8, 0xb223, 0x4648, 0x3fb2, 0x2ec5, 0xba50, 0x42c2, 0x3b0b, 0x1fbf, 0xb240, 0x41e0, 0x3a20, 0x032c, 0xb21a, 0xa161, 0x42bb, 0xbf26, 0xbf80, 0x446c, 0x4305, 0xb068, 0xba5f, 0x130a, 0x2736, 0xabf8, 0x1967, 0x2038, 0xb260, 0xba40, 0x4241, 0xaf27, 0x4381, 0x40af, 0x438c, 0x437c, 0x4672, 0xbae3, 0x3e4c, 0xb228, 0x1cc4, 0x432e, 0xbf3a, 0x1c2b, 0x1678, 0xa23f, 0x1dd4, 0x42a9, 0xbff0, 0x397e, 0x42a1, 0xbf54, 0x41a6, 0x4124, 0xb2f5, 0x1d50, 0x42a9, 0xba79, 0xba33, 0xa80d, 0xbf60, 0x4329, 0x4161, 0x3a12, 0x40ed, 0x4562, 0x4303, 0x1853, 0xbf6b, 0x4379, 0x4307, 0x436e, 0x41b0, 0xba44, 0x4178, 0xbf90, 0xb2db, 0xa99c, 0x4671, 0x46a9, 0x44b3, 0x40fc, 0xab9e, 0xb21d, 0x42a7, 0x40f3, 0xb2cd, 0x24b3, 0x41b7, 0x1db8, 0xbf4c, 0x4207, 0xba4b, 0x4227, 0xb064, 0x405a, 0x416a, 0x1222, 0xb0e1, 0x0ff4, 0xba13, 0xbf8a, 0x423f, 0x440b, 0x4007, 0xbadf, 0xb25b, 0xae38, 0x229d, 0xbfcb, 0x3f66, 0x259e, 0xb092, 0x4248, 0x422f, 0x18b3, 0xbfd2, 0x147a, 0x43ce, 0xac74, 0xa9c0, 0x454c, 0xba1f, 0x0865, 0x40bf, 0xb291, 0xb241, 0x4311, 0x1e25, 0xb2e5, 0x3038, 0x4647, 0x4254, 0x4007, 0x4276, 0x42cb, 0x4024, 0x1ee1, 0x206a, 0x0c99, 0x3aea, 0xbfc8, 0xbf60, 0x1eea, 0x410e, 0x4365, 0x03ee, 0x1d17, 0xb2e5, 0x4244, 0x0fc2, 0x1bf2, 0x1b74, 0xbac0, 0x1770, 0xbfcd, 0x02d1, 0x4251, 0x4200, 0xb2c5, 0xbafb, 0x43b8, 0xbf87, 0x425a, 0xbfd0, 0x18bb, 0x4186, 0xb0de, 0xba16, 0x199f, 0x444c, 0x4265, 0xa487, 0x41cf, 0x40e4, 0xb093, 0xbfa0, 0x4164, 0x0082, 0x433b, 0x40a3, 0x1957, 0x0653, 0xba10, 0x1011, 0x43cc, 0xb08c, 0xb24a, 0x2f88, 0xbfe4, 0xb291, 0x4251, 0xb0ec, 0xba67, 0x3fec, 0x401c, 0x2df3, 0xb225, 0x1ed0, 0x22cf, 0x41c4, 0xbfdc, 0xaa7d, 0x1e25, 0x40a5, 0x43a0, 0x41bf, 0xba39, 0x40cc, 0x4117, 0x46b9, 0x407b, 0xb0d5, 0x1cfb, 0x43ed, 0xb2ce, 0x4229, 0x2a4a, 0x1317, 0x41f3, 0x1a08, 0x1aae, 0x1737, 0xbf8a, 0x1ee8, 0x430e, 0x401b, 0x419c, 0x4121, 0xba1d, 0x109a, 0x18d9, 0x1dc3, 0x4331, 0xbac3, 0x00f7, 0x4178, 0x41c8, 0xa2e7, 0xb2be, 0x18bc, 0xb288, 0x1527, 0x43e5, 0x1c45, 0x2f37, 0x423d, 0xba43, 0x4238, 0xbf75, 0x22e5, 0xbfb0, 0x4073, 0x34ad, 0xa802, 0xb084, 0x4154, 0x4333, 0xa7e3, 0x4170, 0x43d9, 0xbfa0, 0x43c6, 0x43d0, 0xb292, 0xa2aa, 0x42e5, 0xbace, 0x42a1, 0x4361, 0x42f9, 0xbf4c, 0x423e, 0x0e80, 0xb233, 0xb2c7, 0xa44f, 0x1a00, 0xbf00, 0x1d47, 0xb265, 0xb203, 0x4330, 0x4268, 0x40c9, 0xb299, 0xba4d, 0xb23a, 0x2d3b, 0xba5e, 0xbf00, 0x43cb, 0xbf28, 0x1595, 0x43e5, 0x0dd2, 0xb287, 0x429c, 0x4683, 0xbfe0, 0x410c, 0x4363, 0x117d, 0x0706, 0x377b, 0xbfa4, 0xb2e7, 0x42e5, 0x45e1, 0x441b, 0x42bf, 0xb08c, 0x427e, 0xb05a, 0x09e5, 0xbf69, 0x438c, 0xbafe, 0x45f6, 0xaad2, 0x0016, 0xbf0b, 0x419d, 0x4024, 0x4146, 0xb0b5, 0x461d, 0x41f8, 0xb044, 0x1cc0, 0xbae5, 0xb086, 0x44cc, 0x420f, 0xb0b0, 0x4679, 0x4009, 0x1a55, 0x404c, 0x41cb, 0x4035, 0x4313, 0x4085, 0x404f, 0x000e, 0x1544, 0xada3, 0xbf09, 0x2288, 0xb215, 0x40ff, 0x426a, 0x40a6, 0xb26e, 0x305e, 0xb206, 0x3b04, 0xa30a, 0xba3a, 0x459e, 0xba24, 0x418b, 0x40ad, 0x440a, 0x435d, 0xb262, 0x42ad, 0xb0d9, 0xb08c, 0xbf5c, 0x4351, 0xb2d0, 0xbf12, 0x1b96, 0xb27a, 0x4154, 0xa009, 0x1c94, 0xa32e, 0x1c08, 0x38a7, 0x43af, 0x418b, 0x43c7, 0x296c, 0x273c, 0x4276, 0x25d3, 0x42c3, 0xba0c, 0xb284, 0xbf19, 0xb2ea, 0xba0e, 0x4069, 0xb003, 0x469c, 0xb0ee, 0xb219, 0x43cb, 0x424b, 0x41f6, 0x3973, 0xb271, 0x401c, 0x23a6, 0x40ea, 0xba16, 0x194a, 0xa210, 0x1c5b, 0xb07a, 0xbfa1, 0x4271, 0x190b, 0xba0c, 0x0783, 0xa0dc, 0x46d0, 0xbf54, 0x42fc, 0x0ea4, 0x1cde, 0x0a0a, 0x4115, 0xb2b7, 0xb2fa, 0xbf2f, 0x436e, 0x4374, 0xba73, 0x43cd, 0x4460, 0xad56, 0xb2cd, 0x4157, 0x40c1, 0x1a23, 0x4011, 0x42de, 0x42ab, 0x41f5, 0x4299, 0x43d1, 0x36ef, 0x4135, 0xade3, 0xbfcc, 0x1d9e, 0x425d, 0x43d0, 0xb26e, 0xb26d, 0xb0fe, 0xbaf7, 0x4106, 0x43d0, 0x4311, 0xbfdc, 0x2ac1, 0xb048, 0x434f, 0xb2b4, 0x12bc, 0x1ff4, 0x1aa2, 0xbad4, 0x428d, 0xb28c, 0x44e3, 0x4323, 0x407e, 0x350d, 0x4600, 0x4304, 0x40b5, 0x4253, 0xb2d9, 0xbfd7, 0xb062, 0xb0bd, 0x4567, 0x465d, 0xba1f, 0x0580, 0x46da, 0xb073, 0x3249, 0xb2fc, 0x41a4, 0x4235, 0x2daa, 0xb097, 0xbf5a, 0x41aa, 0x44c3, 0x42c0, 0x0536, 0xb239, 0x42c5, 0xbf6e, 0x19da, 0x296c, 0x324a, 0x395f, 0x40c6, 0x40fe, 0x4023, 0x00f5, 0x281c, 0x2646, 0x3352, 0xb2b7, 0xb2fb, 0xb27b, 0x44a0, 0x41ee, 0xbf81, 0xa1c3, 0x43e2, 0x4047, 0x43c2, 0xba7c, 0x2eae, 0xb281, 0x1807, 0x23c0, 0x1b92, 0x4116, 0xa4a6, 0x43f3, 0x4333, 0x1ae6, 0x25ec, 0x373d, 0xbfc3, 0xafa6, 0x409b, 0x1ffa, 0x183a, 0x46d5, 0x42e4, 0x418e, 0x422e, 0x43ad, 0xad75, 0x18e8, 0x4087, 0x0fb4, 0x0dc6, 0x1913, 0xabed, 0x4331, 0x40fa, 0xbf95, 0x18ab, 0x1aa0, 0x33e6, 0x4354, 0x4338, 0xb2cf, 0x4683, 0x4289, 0x42a1, 0x1ed3, 0x43c5, 0x434e, 0xb2bc, 0xa1bd, 0x4098, 0x418a, 0x25fe, 0x4348, 0x27b1, 0xa5ce, 0x121a, 0x4229, 0xbfa4, 0xb2d8, 0xb290, 0xbfdd, 0xa03c, 0x4217, 0x41b7, 0x41c0, 0xb0e8, 0x19ee, 0x41ea, 0x4294, 0x418d, 0x4075, 0xb04c, 0xbfce, 0xb083, 0x3289, 0x40a7, 0x429d, 0x4277, 0x454a, 0x43a4, 0x1f9a, 0xb2cf, 0x40a6, 0x42b7, 0xb277, 0x27de, 0x43cd, 0xba20, 0xb255, 0x4301, 0x43de, 0x41f0, 0xba42, 0x40b3, 0x05ae, 0xbafb, 0xbaf1, 0x443b, 0x4022, 0xbf68, 0xb286, 0xb2f3, 0xac85, 0x4129, 0x435d, 0x4344, 0x42c3, 0x41d8, 0xb247, 0xbf65, 0x42b9, 0x0ff6, 0x412c, 0xb2e8, 0x4406, 0x42e1, 0x3032, 0x416c, 0xb298, 0xab81, 0xb090, 0x434d, 0xbf87, 0x1cb0, 0x404c, 0xaf0e, 0x33b1, 0x3a35, 0x1c47, 0x43e5, 0xbacc, 0x323d, 0x336a, 0x4125, 0xb062, 0xba38, 0x429b, 0x4173, 0xbf95, 0x40bd, 0x164b, 0xb232, 0xb292, 0x4283, 0xa0d8, 0xb0a5, 0x197f, 0x43d2, 0x1b4f, 0x092b, 0x40d5, 0x1abc, 0x468d, 0xb0ac, 0xb289, 0xb231, 0x1f75, 0xba2c, 0x3a4e, 0x429d, 0x3a08, 0x414a, 0x400f, 0xbfc5, 0x42db, 0x4041, 0x4204, 0xb225, 0x022c, 0x41a9, 0x1def, 0x1cf5, 0x4217, 0x4047, 0x0cb3, 0x3896, 0x4383, 0x28ec, 0x4036, 0x434c, 0x424d, 0x392c, 0x0f8f, 0x2d25, 0x1ca0, 0x40d1, 0x4273, 0x4365, 0x41ce, 0xbf27, 0xb22d, 0x1762, 0x430b, 0xb23a, 0x419f, 0x40f7, 0x421c, 0x44f9, 0x41fa, 0x43d0, 0x428a, 0xb010, 0xb0b8, 0x402a, 0x40ba, 0xbf65, 0x3a3b, 0x4205, 0x41d3, 0xb2df, 0xb019, 0x422b, 0x4207, 0xba0a, 0x430c, 0x18fd, 0xbaf8, 0x4162, 0x400e, 0x4099, 0x40bd, 0x268f, 0xbaee, 0x42ed, 0x1a55, 0x42a5, 0x19bf, 0xb229, 0xb2de, 0x4169, 0xba79, 0x0f16, 0xb2d5, 0x4193, 0xbf2f, 0x0861, 0x4315, 0x05f0, 0xba76, 0xb2e6, 0xbf75, 0x0d63, 0x4580, 0x41dc, 0x4196, 0xbad8, 0x042b, 0x1a1c, 0x1e88, 0xba71, 0x19b1, 0x08a3, 0x314e, 0xba39, 0x40f9, 0x23e3, 0xb0e9, 0x11cb, 0x41b8, 0xbf1c, 0x1a4f, 0xa122, 0x416d, 0xb045, 0xb05f, 0x456c, 0x2fbd, 0x1eae, 0x43ef, 0x1264, 0x41be, 0x2531, 0x4240, 0xbf8c, 0x40fa, 0xb2ef, 0xaa96, 0x4398, 0x40fe, 0xb2e5, 0x4331, 0x419d, 0xba00, 0x4618, 0x4219, 0x408f, 0x438c, 0xb2a7, 0x41f6, 0xb272, 0xab3a, 0x1bd0, 0x2ece, 0x40ff, 0x1f10, 0xbf34, 0x2253, 0x40a3, 0x426e, 0x4206, 0x4262, 0x4354, 0x2793, 0xae78, 0x427a, 0x4370, 0x1911, 0x387b, 0x46e4, 0x18dc, 0x4259, 0x4013, 0xad55, 0x443c, 0x4231, 0xb015, 0x42d5, 0xa0d6, 0x41b8, 0xbf92, 0x4689, 0x4305, 0x3f97, 0x4356, 0xba74, 0x40a2, 0x43b8, 0x46bc, 0x4002, 0x0f62, 0xbacf, 0xbadb, 0x4562, 0xbf3c, 0xbfd0, 0x1eb6, 0x4770, 0xe7fe + ], + StartRegs = [0xb6e12d7d, 0x2bc8f2a0, 0xe074d4cb, 0x76b33514, 0x92975e84, 0xc4f82ea7, 0xeb560f6d, 0x9507ee5e, 0xd48a048b, 0x1aa04244, 0xe9639443, 0xe7dafbbf, 0x050a37ec, 0x91c1b356, 0x00000000, 0xd00001f0 + ], + FinalRegs = [0x00000001, 0xffffff18, 0x00000007, 0x00006800, 0xfeff60ec, 0x00001b7d, 0xfffeec5e, 0x000018ff, 0xe9639443, 0x000016c5, 0x00001547, 0xf400171a, 0xfffffffc, 0x00000054, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xb29c, 0xba51, 0x43ec, 0x4103, 0x372e, 0x2b03, 0x42b6, 0x41ad, 0xbac4, 0x463c, 0x2969, 0x24f2, 0x2801, 0x4274, 0xb048, 0x438e, 0x3129, 0x41e5, 0xb223, 0x40f8, 0xb004, 0xbac2, 0xba3e, 0x1aa2, 0xbf3b, 0x427c, 0x458c, 0x4062, 0x1d1d, 0x4184, 0x16db, 0x4429, 0x1dae, 0x4326, 0xbacf, 0x404a, 0xb2cc, 0xbf0a, 0xac02, 0x2e4d, 0x29e9, 0x298b, 0x30b9, 0xb0c0, 0xbf43, 0x1d40, 0x0fd8, 0xb21a, 0x2ed1, 0xb23d, 0x1fc5, 0x4639, 0x4308, 0x41f1, 0xba0c, 0x0fb2, 0xbff0, 0xbfd4, 0x40c3, 0xba36, 0x42d3, 0xba79, 0x42f6, 0x44c1, 0x414d, 0x430a, 0x4163, 0xbf0d, 0x3df5, 0x4390, 0xb280, 0xa4a3, 0x1918, 0x4075, 0x40f7, 0x4254, 0x431b, 0x40f2, 0x4272, 0xb252, 0x43c5, 0xb21f, 0xba24, 0xbfaa, 0x4096, 0xbac4, 0x4469, 0xbf28, 0xb098, 0xb24b, 0x42b8, 0x3c87, 0xb0bf, 0xba48, 0xa742, 0x41ed, 0xba57, 0xbff0, 0x42dd, 0x43f2, 0xb2e8, 0x1f6e, 0x2f4d, 0xbfc8, 0xafdb, 0xbaf9, 0x4313, 0x2895, 0xb06b, 0x180c, 0xb247, 0x1a0e, 0x4002, 0xb2be, 0x3206, 0x43e3, 0x40ec, 0x4609, 0xbf00, 0x410e, 0x4328, 0x45c5, 0xbf21, 0x169f, 0x1a33, 0xa416, 0xb2af, 0x42d6, 0xbfa4, 0x439f, 0xacea, 0x40c3, 0x43d7, 0x4184, 0x1ea5, 0xbade, 0x41b2, 0xbf96, 0xbac9, 0x1703, 0x18d6, 0xbf60, 0x1cb9, 0x2c88, 0x3e09, 0xba5f, 0x3f42, 0xb2d1, 0xb2a6, 0x42cf, 0xb2be, 0x2c25, 0x4315, 0xba76, 0xb029, 0x41fe, 0x437c, 0x4186, 0x41ce, 0x1adf, 0xba71, 0xb0d3, 0xbf76, 0x4399, 0x42b3, 0x418d, 0x4258, 0x1fe3, 0x4150, 0x4595, 0x1b75, 0x4255, 0x40d4, 0x42ee, 0x4207, 0xba40, 0x41c3, 0x030d, 0x2a47, 0x1f8f, 0x40a9, 0xb0c1, 0xbfae, 0x4080, 0x4358, 0x4005, 0xbfe2, 0x1724, 0xa1be, 0x183c, 0x408e, 0x3b25, 0xb255, 0x4222, 0xb2e2, 0x1244, 0xb0bd, 0xa6fa, 0x1fe0, 0xb05f, 0xb237, 0x07aa, 0xbaef, 0xa553, 0x3698, 0x41c0, 0x41a0, 0x4354, 0xbfcc, 0x46d0, 0xb0fd, 0x1374, 0x42ec, 0x4077, 0xa062, 0x1e82, 0x40fe, 0xb227, 0x172b, 0xbfa3, 0x0541, 0xb093, 0xba2e, 0x4359, 0x3053, 0x4163, 0x4190, 0x01d8, 0x434b, 0x420a, 0x0cdf, 0x1b4d, 0x4045, 0x09df, 0xb268, 0x1d2c, 0xb008, 0xbfe2, 0x4342, 0x4138, 0x2a50, 0x4197, 0x43d7, 0xbafc, 0x443a, 0xa855, 0xb00a, 0x43b9, 0xbaf2, 0xbf4d, 0x1f75, 0x42d8, 0x431a, 0x407c, 0xbac1, 0x42b1, 0x08e3, 0x4217, 0x2206, 0x436d, 0x429d, 0x43d8, 0xb061, 0x4280, 0x4164, 0x422c, 0xbfd8, 0x405c, 0x1ae9, 0x1cce, 0x4346, 0xb079, 0x2ad0, 0xafb0, 0x10f5, 0x430d, 0x41ad, 0xbfe2, 0x0a34, 0x0894, 0x1b3e, 0x429b, 0x46a8, 0xb2e6, 0x40cb, 0x3e07, 0x40ea, 0x2248, 0x4096, 0xba45, 0x43b5, 0x40c4, 0x40c0, 0x1a05, 0x4044, 0x4303, 0x42ab, 0x15f7, 0x4679, 0x4321, 0x447e, 0x429b, 0xbfc2, 0x1d66, 0x42f6, 0xb079, 0x24c9, 0x189d, 0xbad0, 0x20cb, 0x43d4, 0x1572, 0x4352, 0x2b09, 0xb2b0, 0x0800, 0xba78, 0x1e22, 0x1973, 0xb27e, 0xb2d0, 0xb21c, 0x3d33, 0x2ea5, 0x0470, 0x419e, 0x066e, 0xbadb, 0x43a1, 0x412f, 0xbf52, 0xba60, 0xb2a5, 0xba7f, 0xb019, 0x4117, 0x43cf, 0x1f1f, 0x42ca, 0x40ab, 0xa704, 0x18b4, 0x3160, 0x435a, 0xb2da, 0xbaee, 0x252b, 0xbf94, 0x374f, 0xb0e2, 0x3612, 0xbf90, 0x1c26, 0xa209, 0x4173, 0x4119, 0x4375, 0xb09a, 0x2b4a, 0x41d0, 0x404e, 0x4337, 0xa05b, 0xbad3, 0x3b56, 0x1b76, 0xba1d, 0xb217, 0x41de, 0xbf1a, 0x1e6f, 0xb234, 0xbae1, 0x45c5, 0x2c47, 0x41e8, 0x1fe5, 0x42bb, 0xbacb, 0xb007, 0x43e8, 0x423a, 0x3f88, 0x0af3, 0x1cbb, 0x408f, 0x427d, 0x403e, 0xb253, 0x43b4, 0x436a, 0xb252, 0x2ae0, 0x3ae8, 0x435e, 0xb06f, 0xbf84, 0x34ff, 0x1acd, 0xba06, 0x22dc, 0x4022, 0x4343, 0x45f4, 0x4361, 0x18d9, 0x40fc, 0xb024, 0x4208, 0x1820, 0x4391, 0x41ea, 0x37a3, 0x46c8, 0xbf60, 0xb04f, 0x41dd, 0x0cfa, 0x0e15, 0xa479, 0xbac6, 0xbf54, 0x46c2, 0x288a, 0x182e, 0xba13, 0x1f09, 0x40dd, 0xa3e4, 0x426a, 0xb27d, 0x2af6, 0xbafe, 0x41e7, 0xba35, 0xb07c, 0x050a, 0xb2e1, 0xabb5, 0x1423, 0x3493, 0x40be, 0x2644, 0x1da5, 0x1bae, 0x1e6c, 0x41c0, 0x44c9, 0xbfc3, 0x40c4, 0x21e1, 0xaeb3, 0x1fdc, 0xb254, 0x418a, 0xbf0b, 0xb224, 0xae41, 0x42e5, 0x42f6, 0x2d3f, 0x4137, 0xb093, 0x4105, 0x420d, 0x40ac, 0xb210, 0x42dd, 0x2bf7, 0x43bc, 0x417d, 0xb2f3, 0xac37, 0x4031, 0xb2cc, 0x405b, 0x415f, 0x23b1, 0xb215, 0xba5e, 0xa2d0, 0x4415, 0x2582, 0xbf1c, 0x408a, 0x42a5, 0x4118, 0xb292, 0x413e, 0x4472, 0x406b, 0xb2c3, 0x3639, 0x40e3, 0xb25e, 0xbfd0, 0x40f2, 0x1fd9, 0xbfb0, 0x1e92, 0x1e5f, 0x40df, 0x4665, 0xbf37, 0x4479, 0x1602, 0x1a33, 0x437a, 0x2900, 0x4411, 0xbf00, 0xbf60, 0x4108, 0x41ef, 0xb2d3, 0x42f9, 0x38a6, 0x43f4, 0xb2d5, 0x292a, 0xba42, 0x2eb4, 0xbae0, 0xa21b, 0x1a60, 0xbf8a, 0xb239, 0x1dea, 0x1be6, 0x4042, 0x18b4, 0x4217, 0x0c3d, 0x1826, 0x41d1, 0xba1c, 0x36b3, 0xa241, 0x43f6, 0x4435, 0x425e, 0x3c53, 0x2281, 0x25fe, 0x409d, 0x42c6, 0xba3b, 0x43ba, 0xbf86, 0xba54, 0x2522, 0x43df, 0xbfd7, 0x18f1, 0x4308, 0x1fb2, 0x429d, 0xb010, 0x4445, 0x4169, 0x4054, 0x2abe, 0xa0b6, 0x3317, 0x1f53, 0x42d4, 0x4272, 0x46ab, 0x2008, 0x1d36, 0xbf73, 0x42d6, 0xb238, 0x425f, 0x411c, 0x4098, 0xb044, 0xb23a, 0x420d, 0x1f38, 0xb20e, 0x0203, 0xacf3, 0xb2e9, 0x4055, 0x1667, 0x42a1, 0x4073, 0x3006, 0x4229, 0x41e2, 0x4630, 0xb2e0, 0xa326, 0x4146, 0x1d00, 0xbf35, 0xb2d1, 0x14a1, 0xb2e9, 0x31e8, 0x0f16, 0x41ec, 0x4245, 0x1a7a, 0x421a, 0x2429, 0x4017, 0x0882, 0x3395, 0x00f1, 0xbad4, 0x42b0, 0x43d9, 0x293c, 0xbf98, 0x1938, 0x40a9, 0xb26c, 0x1bf5, 0x1a28, 0x4016, 0x432b, 0xb21e, 0x43e9, 0x4457, 0x417a, 0x41b0, 0x4052, 0xbae8, 0xa883, 0xb266, 0xba3a, 0x431e, 0x1b96, 0x4238, 0x43ac, 0xbfc0, 0x4157, 0xbf04, 0xaa02, 0x42a0, 0xba3b, 0x4114, 0x4145, 0x3e46, 0x0cc6, 0x1885, 0x4102, 0x43ba, 0x430e, 0xb2d1, 0xb286, 0x3084, 0x01e7, 0xa8bb, 0x42d1, 0xba6c, 0x402b, 0x427c, 0x4279, 0xbf61, 0x4177, 0x40f1, 0x424e, 0x01c2, 0x11e7, 0x369e, 0x413e, 0x1a54, 0xb090, 0x1844, 0x43c1, 0x42dc, 0x4038, 0xbadb, 0xbf1c, 0x4345, 0xbaf7, 0x4103, 0xb297, 0xb030, 0xba42, 0xac35, 0x4078, 0xba2a, 0xbfb9, 0x416f, 0xba16, 0xa940, 0x41f8, 0xbf65, 0x43c9, 0x45a4, 0xb2fe, 0x4020, 0xba2b, 0x400e, 0xb282, 0x40ec, 0x1afb, 0x4584, 0xbf70, 0x3323, 0x41c6, 0x1bfb, 0xb288, 0xbfac, 0xba01, 0xa344, 0x3658, 0xba58, 0x408e, 0x1efe, 0xb0bf, 0x119d, 0x0af0, 0x4194, 0x4162, 0x419b, 0x4311, 0xb2f7, 0x4312, 0x411a, 0xbf70, 0x405d, 0x405d, 0x1b4b, 0xbad8, 0x416e, 0x4327, 0xbf63, 0x4311, 0x1fcc, 0x41f8, 0x2cae, 0x41d4, 0x422b, 0xbf6b, 0x4260, 0x43cb, 0x1cd2, 0xa5a3, 0xbfb0, 0xb030, 0xbfac, 0xbfc0, 0x4148, 0x4264, 0x3326, 0x41cb, 0x4132, 0x2736, 0xb012, 0x11c0, 0x3453, 0xbfa9, 0x1e76, 0xb0f2, 0xb2b5, 0xba0e, 0x09f7, 0x1b71, 0x46a5, 0x415a, 0xb29f, 0x4493, 0xb0f9, 0x3943, 0x317b, 0x44e4, 0x438c, 0xbf0b, 0x4144, 0x07a1, 0x4392, 0xadf3, 0xaf15, 0x1422, 0x212f, 0xa165, 0x44db, 0x070c, 0x4381, 0xb0e2, 0x1f2b, 0x40a3, 0x4647, 0x3bf5, 0x1b02, 0x42c9, 0x2996, 0x43a7, 0x0d6b, 0x46eb, 0xb0e6, 0x4160, 0x41be, 0xb053, 0xb083, 0x1e27, 0xbf2a, 0x22b5, 0xbaf4, 0x08fb, 0x4556, 0x464b, 0x4333, 0x1337, 0x1a48, 0xb29e, 0x4167, 0x41ee, 0xb2d8, 0xbfa9, 0x1cc6, 0x4351, 0xb28b, 0x4308, 0x43f7, 0x432e, 0x1f58, 0x43b0, 0x4057, 0x41e8, 0x411c, 0x22d8, 0x3135, 0xba7c, 0x43a2, 0x2df5, 0x42cb, 0xb2d6, 0x441d, 0xb2ef, 0x2d14, 0x436b, 0xaed5, 0x322f, 0x1da6, 0xb08e, 0xbf2e, 0xb271, 0x33f0, 0x33be, 0x424c, 0x1be6, 0x4319, 0x2dc9, 0xb06b, 0x1f95, 0x3107, 0xb2ca, 0x439b, 0x1965, 0x2ed1, 0x45ba, 0x2066, 0xbf64, 0x1aca, 0x411b, 0xae5e, 0xadca, 0xb0cf, 0xba28, 0xbf85, 0xb278, 0x41c5, 0xb287, 0xb26e, 0xa4a7, 0x1aeb, 0xba16, 0x41b8, 0x3a44, 0xbf80, 0x42e4, 0x0580, 0x3e82, 0xb2f4, 0x1afe, 0xb244, 0xb25b, 0xbafb, 0x1961, 0x41f9, 0xbfb0, 0xba5f, 0x0ba4, 0x40d9, 0xb21b, 0xbf29, 0x01dd, 0xa878, 0xbfd0, 0xb2ad, 0x1ba2, 0x1c18, 0xaf6a, 0x39a8, 0xbfc0, 0x3400, 0x40b3, 0x192a, 0x4128, 0x3f37, 0x42c0, 0x14c8, 0x42d4, 0x402d, 0x21a6, 0xb25b, 0x4045, 0x184f, 0x406f, 0xb0de, 0x4046, 0xbf8a, 0xba50, 0xaae3, 0x2719, 0xb2d4, 0xb22b, 0x35ad, 0x40fb, 0x0e62, 0x43ac, 0x439a, 0x0f5d, 0x4063, 0x1ca1, 0x40a4, 0x406a, 0x18fb, 0x27b5, 0x409a, 0xbf6b, 0x43c7, 0x293d, 0x074b, 0x336f, 0x456f, 0x41e1, 0x40a7, 0x2b00, 0x3c88, 0x4616, 0x1f8d, 0xb2b5, 0x129a, 0x4224, 0x407e, 0xbf53, 0x3fae, 0xbacf, 0x4313, 0x46ec, 0x1a1c, 0x4268, 0xb07b, 0x433e, 0x4407, 0x4189, 0x45ce, 0x428c, 0xb068, 0x413f, 0xbfac, 0xb200, 0xbae2, 0x1f79, 0x4236, 0x417c, 0xa561, 0xbaf0, 0xb2f6, 0x1290, 0xb243, 0xba63, 0x40c8, 0xbfa0, 0xafcf, 0x43f2, 0x1bdd, 0x42bf, 0xbfa3, 0x42c0, 0xba51, 0x1c8c, 0xba37, 0xb239, 0x4008, 0xb2e7, 0xb290, 0xbaee, 0x431d, 0x421f, 0x4364, 0x437c, 0x01b9, 0x43ad, 0x4544, 0x2c61, 0x4640, 0xa354, 0x2ad2, 0x2d4b, 0x4052, 0xbf2f, 0xaff9, 0xaa46, 0xae6b, 0x0c27, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x60ab798e, 0xeb64755b, 0x32fad41e, 0x906517a9, 0x6b2d648d, 0x9c5a9d43, 0xefba7776, 0x297a6da6, 0x3750e535, 0xf070ec03, 0x5dff78cd, 0x69746ba1, 0xc40e9ad7, 0xa94af44d, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0x27c1d138, 0x00000040, 0x00000374, 0x0000192c, 0x82cf9201, 0x00000000, 0x00000408, 0x000082cf, 0x27c1d138, 0x4f83a270, 0x27c1d138, 0x00000068, 0xfffffed0, 0x0000025c, 0x00000000, 0x400001d0 }, + Instructions = [0xb29c, 0xba51, 0x43ec, 0x4103, 0x372e, 0x2b03, 0x42b6, 0x41ad, 0xbac4, 0x463c, 0x2969, 0x24f2, 0x2801, 0x4274, 0xb048, 0x438e, 0x3129, 0x41e5, 0xb223, 0x40f8, 0xb004, 0xbac2, 0xba3e, 0x1aa2, 0xbf3b, 0x427c, 0x458c, 0x4062, 0x1d1d, 0x4184, 0x16db, 0x4429, 0x1dae, 0x4326, 0xbacf, 0x404a, 0xb2cc, 0xbf0a, 0xac02, 0x2e4d, 0x29e9, 0x298b, 0x30b9, 0xb0c0, 0xbf43, 0x1d40, 0x0fd8, 0xb21a, 0x2ed1, 0xb23d, 0x1fc5, 0x4639, 0x4308, 0x41f1, 0xba0c, 0x0fb2, 0xbff0, 0xbfd4, 0x40c3, 0xba36, 0x42d3, 0xba79, 0x42f6, 0x44c1, 0x414d, 0x430a, 0x4163, 0xbf0d, 0x3df5, 0x4390, 0xb280, 0xa4a3, 0x1918, 0x4075, 0x40f7, 0x4254, 0x431b, 0x40f2, 0x4272, 0xb252, 0x43c5, 0xb21f, 0xba24, 0xbfaa, 0x4096, 0xbac4, 0x4469, 0xbf28, 0xb098, 0xb24b, 0x42b8, 0x3c87, 0xb0bf, 0xba48, 0xa742, 0x41ed, 0xba57, 0xbff0, 0x42dd, 0x43f2, 0xb2e8, 0x1f6e, 0x2f4d, 0xbfc8, 0xafdb, 0xbaf9, 0x4313, 0x2895, 0xb06b, 0x180c, 0xb247, 0x1a0e, 0x4002, 0xb2be, 0x3206, 0x43e3, 0x40ec, 0x4609, 0xbf00, 0x410e, 0x4328, 0x45c5, 0xbf21, 0x169f, 0x1a33, 0xa416, 0xb2af, 0x42d6, 0xbfa4, 0x439f, 0xacea, 0x40c3, 0x43d7, 0x4184, 0x1ea5, 0xbade, 0x41b2, 0xbf96, 0xbac9, 0x1703, 0x18d6, 0xbf60, 0x1cb9, 0x2c88, 0x3e09, 0xba5f, 0x3f42, 0xb2d1, 0xb2a6, 0x42cf, 0xb2be, 0x2c25, 0x4315, 0xba76, 0xb029, 0x41fe, 0x437c, 0x4186, 0x41ce, 0x1adf, 0xba71, 0xb0d3, 0xbf76, 0x4399, 0x42b3, 0x418d, 0x4258, 0x1fe3, 0x4150, 0x4595, 0x1b75, 0x4255, 0x40d4, 0x42ee, 0x4207, 0xba40, 0x41c3, 0x030d, 0x2a47, 0x1f8f, 0x40a9, 0xb0c1, 0xbfae, 0x4080, 0x4358, 0x4005, 0xbfe2, 0x1724, 0xa1be, 0x183c, 0x408e, 0x3b25, 0xb255, 0x4222, 0xb2e2, 0x1244, 0xb0bd, 0xa6fa, 0x1fe0, 0xb05f, 0xb237, 0x07aa, 0xbaef, 0xa553, 0x3698, 0x41c0, 0x41a0, 0x4354, 0xbfcc, 0x46d0, 0xb0fd, 0x1374, 0x42ec, 0x4077, 0xa062, 0x1e82, 0x40fe, 0xb227, 0x172b, 0xbfa3, 0x0541, 0xb093, 0xba2e, 0x4359, 0x3053, 0x4163, 0x4190, 0x01d8, 0x434b, 0x420a, 0x0cdf, 0x1b4d, 0x4045, 0x09df, 0xb268, 0x1d2c, 0xb008, 0xbfe2, 0x4342, 0x4138, 0x2a50, 0x4197, 0x43d7, 0xbafc, 0x443a, 0xa855, 0xb00a, 0x43b9, 0xbaf2, 0xbf4d, 0x1f75, 0x42d8, 0x431a, 0x407c, 0xbac1, 0x42b1, 0x08e3, 0x4217, 0x2206, 0x436d, 0x429d, 0x43d8, 0xb061, 0x4280, 0x4164, 0x422c, 0xbfd8, 0x405c, 0x1ae9, 0x1cce, 0x4346, 0xb079, 0x2ad0, 0xafb0, 0x10f5, 0x430d, 0x41ad, 0xbfe2, 0x0a34, 0x0894, 0x1b3e, 0x429b, 0x46a8, 0xb2e6, 0x40cb, 0x3e07, 0x40ea, 0x2248, 0x4096, 0xba45, 0x43b5, 0x40c4, 0x40c0, 0x1a05, 0x4044, 0x4303, 0x42ab, 0x15f7, 0x4679, 0x4321, 0x447e, 0x429b, 0xbfc2, 0x1d66, 0x42f6, 0xb079, 0x24c9, 0x189d, 0xbad0, 0x20cb, 0x43d4, 0x1572, 0x4352, 0x2b09, 0xb2b0, 0x0800, 0xba78, 0x1e22, 0x1973, 0xb27e, 0xb2d0, 0xb21c, 0x3d33, 0x2ea5, 0x0470, 0x419e, 0x066e, 0xbadb, 0x43a1, 0x412f, 0xbf52, 0xba60, 0xb2a5, 0xba7f, 0xb019, 0x4117, 0x43cf, 0x1f1f, 0x42ca, 0x40ab, 0xa704, 0x18b4, 0x3160, 0x435a, 0xb2da, 0xbaee, 0x252b, 0xbf94, 0x374f, 0xb0e2, 0x3612, 0xbf90, 0x1c26, 0xa209, 0x4173, 0x4119, 0x4375, 0xb09a, 0x2b4a, 0x41d0, 0x404e, 0x4337, 0xa05b, 0xbad3, 0x3b56, 0x1b76, 0xba1d, 0xb217, 0x41de, 0xbf1a, 0x1e6f, 0xb234, 0xbae1, 0x45c5, 0x2c47, 0x41e8, 0x1fe5, 0x42bb, 0xbacb, 0xb007, 0x43e8, 0x423a, 0x3f88, 0x0af3, 0x1cbb, 0x408f, 0x427d, 0x403e, 0xb253, 0x43b4, 0x436a, 0xb252, 0x2ae0, 0x3ae8, 0x435e, 0xb06f, 0xbf84, 0x34ff, 0x1acd, 0xba06, 0x22dc, 0x4022, 0x4343, 0x45f4, 0x4361, 0x18d9, 0x40fc, 0xb024, 0x4208, 0x1820, 0x4391, 0x41ea, 0x37a3, 0x46c8, 0xbf60, 0xb04f, 0x41dd, 0x0cfa, 0x0e15, 0xa479, 0xbac6, 0xbf54, 0x46c2, 0x288a, 0x182e, 0xba13, 0x1f09, 0x40dd, 0xa3e4, 0x426a, 0xb27d, 0x2af6, 0xbafe, 0x41e7, 0xba35, 0xb07c, 0x050a, 0xb2e1, 0xabb5, 0x1423, 0x3493, 0x40be, 0x2644, 0x1da5, 0x1bae, 0x1e6c, 0x41c0, 0x44c9, 0xbfc3, 0x40c4, 0x21e1, 0xaeb3, 0x1fdc, 0xb254, 0x418a, 0xbf0b, 0xb224, 0xae41, 0x42e5, 0x42f6, 0x2d3f, 0x4137, 0xb093, 0x4105, 0x420d, 0x40ac, 0xb210, 0x42dd, 0x2bf7, 0x43bc, 0x417d, 0xb2f3, 0xac37, 0x4031, 0xb2cc, 0x405b, 0x415f, 0x23b1, 0xb215, 0xba5e, 0xa2d0, 0x4415, 0x2582, 0xbf1c, 0x408a, 0x42a5, 0x4118, 0xb292, 0x413e, 0x4472, 0x406b, 0xb2c3, 0x3639, 0x40e3, 0xb25e, 0xbfd0, 0x40f2, 0x1fd9, 0xbfb0, 0x1e92, 0x1e5f, 0x40df, 0x4665, 0xbf37, 0x4479, 0x1602, 0x1a33, 0x437a, 0x2900, 0x4411, 0xbf00, 0xbf60, 0x4108, 0x41ef, 0xb2d3, 0x42f9, 0x38a6, 0x43f4, 0xb2d5, 0x292a, 0xba42, 0x2eb4, 0xbae0, 0xa21b, 0x1a60, 0xbf8a, 0xb239, 0x1dea, 0x1be6, 0x4042, 0x18b4, 0x4217, 0x0c3d, 0x1826, 0x41d1, 0xba1c, 0x36b3, 0xa241, 0x43f6, 0x4435, 0x425e, 0x3c53, 0x2281, 0x25fe, 0x409d, 0x42c6, 0xba3b, 0x43ba, 0xbf86, 0xba54, 0x2522, 0x43df, 0xbfd7, 0x18f1, 0x4308, 0x1fb2, 0x429d, 0xb010, 0x4445, 0x4169, 0x4054, 0x2abe, 0xa0b6, 0x3317, 0x1f53, 0x42d4, 0x4272, 0x46ab, 0x2008, 0x1d36, 0xbf73, 0x42d6, 0xb238, 0x425f, 0x411c, 0x4098, 0xb044, 0xb23a, 0x420d, 0x1f38, 0xb20e, 0x0203, 0xacf3, 0xb2e9, 0x4055, 0x1667, 0x42a1, 0x4073, 0x3006, 0x4229, 0x41e2, 0x4630, 0xb2e0, 0xa326, 0x4146, 0x1d00, 0xbf35, 0xb2d1, 0x14a1, 0xb2e9, 0x31e8, 0x0f16, 0x41ec, 0x4245, 0x1a7a, 0x421a, 0x2429, 0x4017, 0x0882, 0x3395, 0x00f1, 0xbad4, 0x42b0, 0x43d9, 0x293c, 0xbf98, 0x1938, 0x40a9, 0xb26c, 0x1bf5, 0x1a28, 0x4016, 0x432b, 0xb21e, 0x43e9, 0x4457, 0x417a, 0x41b0, 0x4052, 0xbae8, 0xa883, 0xb266, 0xba3a, 0x431e, 0x1b96, 0x4238, 0x43ac, 0xbfc0, 0x4157, 0xbf04, 0xaa02, 0x42a0, 0xba3b, 0x4114, 0x4145, 0x3e46, 0x0cc6, 0x1885, 0x4102, 0x43ba, 0x430e, 0xb2d1, 0xb286, 0x3084, 0x01e7, 0xa8bb, 0x42d1, 0xba6c, 0x402b, 0x427c, 0x4279, 0xbf61, 0x4177, 0x40f1, 0x424e, 0x01c2, 0x11e7, 0x369e, 0x413e, 0x1a54, 0xb090, 0x1844, 0x43c1, 0x42dc, 0x4038, 0xbadb, 0xbf1c, 0x4345, 0xbaf7, 0x4103, 0xb297, 0xb030, 0xba42, 0xac35, 0x4078, 0xba2a, 0xbfb9, 0x416f, 0xba16, 0xa940, 0x41f8, 0xbf65, 0x43c9, 0x45a4, 0xb2fe, 0x4020, 0xba2b, 0x400e, 0xb282, 0x40ec, 0x1afb, 0x4584, 0xbf70, 0x3323, 0x41c6, 0x1bfb, 0xb288, 0xbfac, 0xba01, 0xa344, 0x3658, 0xba58, 0x408e, 0x1efe, 0xb0bf, 0x119d, 0x0af0, 0x4194, 0x4162, 0x419b, 0x4311, 0xb2f7, 0x4312, 0x411a, 0xbf70, 0x405d, 0x405d, 0x1b4b, 0xbad8, 0x416e, 0x4327, 0xbf63, 0x4311, 0x1fcc, 0x41f8, 0x2cae, 0x41d4, 0x422b, 0xbf6b, 0x4260, 0x43cb, 0x1cd2, 0xa5a3, 0xbfb0, 0xb030, 0xbfac, 0xbfc0, 0x4148, 0x4264, 0x3326, 0x41cb, 0x4132, 0x2736, 0xb012, 0x11c0, 0x3453, 0xbfa9, 0x1e76, 0xb0f2, 0xb2b5, 0xba0e, 0x09f7, 0x1b71, 0x46a5, 0x415a, 0xb29f, 0x4493, 0xb0f9, 0x3943, 0x317b, 0x44e4, 0x438c, 0xbf0b, 0x4144, 0x07a1, 0x4392, 0xadf3, 0xaf15, 0x1422, 0x212f, 0xa165, 0x44db, 0x070c, 0x4381, 0xb0e2, 0x1f2b, 0x40a3, 0x4647, 0x3bf5, 0x1b02, 0x42c9, 0x2996, 0x43a7, 0x0d6b, 0x46eb, 0xb0e6, 0x4160, 0x41be, 0xb053, 0xb083, 0x1e27, 0xbf2a, 0x22b5, 0xbaf4, 0x08fb, 0x4556, 0x464b, 0x4333, 0x1337, 0x1a48, 0xb29e, 0x4167, 0x41ee, 0xb2d8, 0xbfa9, 0x1cc6, 0x4351, 0xb28b, 0x4308, 0x43f7, 0x432e, 0x1f58, 0x43b0, 0x4057, 0x41e8, 0x411c, 0x22d8, 0x3135, 0xba7c, 0x43a2, 0x2df5, 0x42cb, 0xb2d6, 0x441d, 0xb2ef, 0x2d14, 0x436b, 0xaed5, 0x322f, 0x1da6, 0xb08e, 0xbf2e, 0xb271, 0x33f0, 0x33be, 0x424c, 0x1be6, 0x4319, 0x2dc9, 0xb06b, 0x1f95, 0x3107, 0xb2ca, 0x439b, 0x1965, 0x2ed1, 0x45ba, 0x2066, 0xbf64, 0x1aca, 0x411b, 0xae5e, 0xadca, 0xb0cf, 0xba28, 0xbf85, 0xb278, 0x41c5, 0xb287, 0xb26e, 0xa4a7, 0x1aeb, 0xba16, 0x41b8, 0x3a44, 0xbf80, 0x42e4, 0x0580, 0x3e82, 0xb2f4, 0x1afe, 0xb244, 0xb25b, 0xbafb, 0x1961, 0x41f9, 0xbfb0, 0xba5f, 0x0ba4, 0x40d9, 0xb21b, 0xbf29, 0x01dd, 0xa878, 0xbfd0, 0xb2ad, 0x1ba2, 0x1c18, 0xaf6a, 0x39a8, 0xbfc0, 0x3400, 0x40b3, 0x192a, 0x4128, 0x3f37, 0x42c0, 0x14c8, 0x42d4, 0x402d, 0x21a6, 0xb25b, 0x4045, 0x184f, 0x406f, 0xb0de, 0x4046, 0xbf8a, 0xba50, 0xaae3, 0x2719, 0xb2d4, 0xb22b, 0x35ad, 0x40fb, 0x0e62, 0x43ac, 0x439a, 0x0f5d, 0x4063, 0x1ca1, 0x40a4, 0x406a, 0x18fb, 0x27b5, 0x409a, 0xbf6b, 0x43c7, 0x293d, 0x074b, 0x336f, 0x456f, 0x41e1, 0x40a7, 0x2b00, 0x3c88, 0x4616, 0x1f8d, 0xb2b5, 0x129a, 0x4224, 0x407e, 0xbf53, 0x3fae, 0xbacf, 0x4313, 0x46ec, 0x1a1c, 0x4268, 0xb07b, 0x433e, 0x4407, 0x4189, 0x45ce, 0x428c, 0xb068, 0x413f, 0xbfac, 0xb200, 0xbae2, 0x1f79, 0x4236, 0x417c, 0xa561, 0xbaf0, 0xb2f6, 0x1290, 0xb243, 0xba63, 0x40c8, 0xbfa0, 0xafcf, 0x43f2, 0x1bdd, 0x42bf, 0xbfa3, 0x42c0, 0xba51, 0x1c8c, 0xba37, 0xb239, 0x4008, 0xb2e7, 0xb290, 0xbaee, 0x431d, 0x421f, 0x4364, 0x437c, 0x01b9, 0x43ad, 0x4544, 0x2c61, 0x4640, 0xa354, 0x2ad2, 0x2d4b, 0x4052, 0xbf2f, 0xaff9, 0xaa46, 0xae6b, 0x0c27, 0x4770, 0xe7fe + ], + StartRegs = [0x60ab798e, 0xeb64755b, 0x32fad41e, 0x906517a9, 0x6b2d648d, 0x9c5a9d43, 0xefba7776, 0x297a6da6, 0x3750e535, 0xf070ec03, 0x5dff78cd, 0x69746ba1, 0xc40e9ad7, 0xa94af44d, 0x00000000, 0x200001f0 + ], + FinalRegs = [0x27c1d138, 0x00000040, 0x00000374, 0x0000192c, 0x82cf9201, 0x00000000, 0x00000408, 0x000082cf, 0x27c1d138, 0x4f83a270, 0x27c1d138, 0x00000068, 0xfffffed0, 0x0000025c, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0xb234, 0x4215, 0x2ab0, 0x43d9, 0x42a0, 0x432b, 0x0bb3, 0x191b, 0x086d, 0x4251, 0x42d3, 0xba6f, 0xa2e4, 0x4069, 0x42ec, 0xae3e, 0xb293, 0xbf16, 0xa0fb, 0x433a, 0x4366, 0x45a5, 0x41d4, 0xb2ca, 0x1ed4, 0xb06d, 0x2a1c, 0x1fbf, 0xbaf6, 0xb266, 0xb293, 0x1c35, 0x3693, 0x2df7, 0xb031, 0x1c23, 0xad6c, 0x36e1, 0x4116, 0xbfc0, 0x32a2, 0xba37, 0x455d, 0x40e1, 0x4047, 0xbf01, 0xbaf8, 0xbad3, 0x19a9, 0x4255, 0xb074, 0x4360, 0xba2b, 0x1e38, 0x18c5, 0x44ed, 0x44e5, 0x187b, 0xb22a, 0x40a3, 0x1852, 0xb276, 0x40dc, 0x42dc, 0x2cf9, 0xb041, 0x18c1, 0xba29, 0xbff0, 0xa748, 0x42ab, 0xbf7d, 0x253d, 0x4352, 0x0c85, 0x438f, 0x4274, 0x3cf4, 0xafce, 0x1974, 0xb074, 0xbfa6, 0x4257, 0xba5b, 0x4037, 0xa515, 0xb0bd, 0x04fe, 0x1cf8, 0x420c, 0x4119, 0x4184, 0x4312, 0x45d3, 0x41ef, 0x4011, 0xb00a, 0xb027, 0xb0f9, 0x41bc, 0x4087, 0x41bd, 0xa595, 0x4126, 0x45d8, 0xbfbd, 0x2aaa, 0xb22b, 0x4361, 0xb2ad, 0x02e9, 0x43f5, 0xb21b, 0x41c2, 0x0d25, 0x03aa, 0x3663, 0x4404, 0x45ce, 0xbf8a, 0x21db, 0x4362, 0x1af0, 0xbf68, 0x415b, 0x4223, 0x2828, 0x4075, 0xbf42, 0xb262, 0xacd1, 0xb011, 0x1da5, 0x43fc, 0x408c, 0x43b3, 0x43c5, 0xb0c7, 0xa5b2, 0xbf17, 0x409d, 0xbac7, 0x4440, 0x0ba9, 0x4025, 0x2022, 0xa67c, 0x4214, 0x40e4, 0xba71, 0xb28c, 0x40ea, 0x41cf, 0x41e2, 0xbfbf, 0xb2bc, 0x3e8c, 0x40eb, 0xb2d4, 0xa13f, 0x4311, 0xbf52, 0x19f8, 0xbf70, 0xb2f4, 0xb06c, 0x0ab2, 0x0a8e, 0x40ae, 0xba23, 0x1c9c, 0x4211, 0x17ac, 0x1c16, 0x1235, 0xab09, 0x1a59, 0x41f7, 0x46a3, 0x1b42, 0x416e, 0x0f01, 0x0b26, 0x407f, 0x4228, 0x0d9f, 0x43c2, 0x435d, 0xbf22, 0x4270, 0x1893, 0x4246, 0xbf06, 0x30d0, 0xba13, 0xae81, 0x0378, 0x4088, 0x463e, 0x4101, 0x4243, 0x1ddd, 0x41bf, 0xba17, 0xae45, 0x1c8e, 0xb014, 0xa8ef, 0x4167, 0x4207, 0x40c6, 0xb018, 0xa950, 0x4073, 0x049b, 0x41a2, 0x45c5, 0x424b, 0x439a, 0x1a0a, 0x3231, 0xbf32, 0xb20b, 0x433b, 0xba2b, 0xbf5d, 0x430c, 0xb2f5, 0x4131, 0x43e4, 0x1e5f, 0x42e8, 0x1f98, 0x115d, 0x4268, 0x41eb, 0x05f8, 0x28e7, 0x06ea, 0xb002, 0xb2d0, 0x1cac, 0x43ca, 0x0c9b, 0x425b, 0xbfe0, 0x40d1, 0x42a1, 0x3faf, 0x403d, 0xb011, 0xb204, 0x4204, 0x4274, 0xbf7f, 0x0588, 0xa465, 0xbadf, 0x1860, 0x0720, 0x4115, 0xbaf0, 0x417e, 0x4569, 0xb211, 0x40a2, 0x43d8, 0x38ea, 0x4061, 0x42df, 0xb2d6, 0x415e, 0x432c, 0xba38, 0x4353, 0x4352, 0x45a5, 0xbf05, 0x4078, 0x3f2a, 0xba41, 0x44e8, 0xb209, 0x1da4, 0xb2c8, 0x41e8, 0xbf29, 0xbafe, 0x1a67, 0x1829, 0x1bf3, 0x0647, 0xb2c6, 0x0c9f, 0x41f5, 0x11dc, 0xbf87, 0x4124, 0xbacc, 0x424a, 0x2a70, 0x403e, 0xb25a, 0x1d42, 0xa62a, 0x4097, 0x43d5, 0xbfa0, 0x3791, 0xba00, 0x1644, 0xba57, 0xb215, 0x4251, 0x07ef, 0xbf4a, 0x2bd0, 0x2e96, 0x4355, 0x4393, 0x4376, 0xbf59, 0x411a, 0x400e, 0xba18, 0x43f5, 0xbf65, 0x4054, 0xae5d, 0xb2e8, 0x4230, 0xa533, 0x4134, 0xb2d9, 0x4149, 0x3cee, 0xbf80, 0x40a1, 0x1745, 0x1b9c, 0x1b90, 0x41be, 0x4468, 0xab8c, 0x4618, 0x1d05, 0x1c91, 0x259f, 0x4228, 0x414b, 0x4028, 0xbfd9, 0x4298, 0x4139, 0x1f8a, 0x4355, 0x4302, 0x42f9, 0x1951, 0xbf9c, 0xba05, 0x400c, 0xacba, 0x44b1, 0xb216, 0x4151, 0x2013, 0x40df, 0x3de1, 0x1f4a, 0x4036, 0x401e, 0x42a0, 0x42cd, 0x40dd, 0x428c, 0xbfd2, 0x4012, 0x1b19, 0x4099, 0x437f, 0x0289, 0x40ef, 0x1f98, 0x418f, 0x19e0, 0x40c5, 0xb2ea, 0x4366, 0x46ea, 0x427a, 0x4464, 0x4262, 0x4280, 0xbafa, 0xbf6f, 0x21d0, 0x1e60, 0x0a92, 0x0f02, 0x2122, 0x434c, 0x40c6, 0xba0c, 0xbf64, 0xa3fa, 0x10b4, 0xbac4, 0x41f5, 0x4079, 0x4197, 0x226a, 0xb2bf, 0x209e, 0x4085, 0xb07d, 0x437c, 0x3671, 0x2d5b, 0x4090, 0x44d0, 0xbf3b, 0x4259, 0xbaf9, 0x4329, 0x418d, 0x4292, 0x4485, 0x4694, 0x4059, 0xb21e, 0x41e6, 0xad2c, 0x3caf, 0xbf0b, 0xb29f, 0x4133, 0x4366, 0x04e2, 0xba2f, 0x1f7a, 0x41a6, 0x0e62, 0xb2f1, 0x43a3, 0xb09c, 0x443d, 0x025f, 0x4128, 0x1fb1, 0x1dea, 0x3733, 0xbfc5, 0x4263, 0xbad3, 0x42f0, 0xb238, 0xba0d, 0x3c1f, 0x4206, 0x41bb, 0x430a, 0x43ad, 0x1984, 0x4303, 0x0cb0, 0xba11, 0x1c1f, 0xb2df, 0xba43, 0x415b, 0xbfa4, 0xbf90, 0x1c9d, 0x1d4a, 0xab5e, 0x46f0, 0xb22e, 0xba16, 0x09f6, 0xba6a, 0x408e, 0x4380, 0xac19, 0x439f, 0x43d2, 0xbfa0, 0x4258, 0xa366, 0x4051, 0xbf36, 0x438a, 0x429f, 0x43f3, 0xb2c5, 0x3bd3, 0x1fa1, 0xb23c, 0x443d, 0xba27, 0xb089, 0x4354, 0x0f0f, 0x1da0, 0x4384, 0x4228, 0xb201, 0xbfe2, 0x4227, 0x395f, 0x447c, 0x43b0, 0x3a46, 0x1ba2, 0xbf80, 0x1c7c, 0xb200, 0x42e2, 0xba2b, 0xb279, 0x43e7, 0xb275, 0x3d99, 0x23a0, 0x41c6, 0x020a, 0x456b, 0x41ea, 0xb0dc, 0x466d, 0x3dec, 0xa2f3, 0x0a1d, 0xbfcc, 0x2a39, 0x215f, 0xbade, 0xb2a5, 0xb22a, 0x406c, 0x4093, 0x33ea, 0x117d, 0xabbf, 0x4291, 0x4055, 0x425e, 0x43e6, 0x4202, 0x4383, 0xbf3e, 0xae2d, 0x4165, 0x404b, 0x45e2, 0xbf60, 0xb0c6, 0x405b, 0xbff0, 0x0ed3, 0xb256, 0x4305, 0x02d6, 0x10a9, 0xac5f, 0xba55, 0xad0d, 0x1b53, 0x42c5, 0x40b6, 0xb211, 0x40cc, 0x1d30, 0x4098, 0x1df1, 0xbf66, 0x4553, 0x41af, 0x0cff, 0x4307, 0x40fa, 0x318f, 0x1b3e, 0xb2f6, 0x442e, 0xb229, 0x0b45, 0xb2de, 0x1948, 0xba36, 0x1a5b, 0x40ae, 0x0dc0, 0x4316, 0x1e5a, 0x258e, 0x4299, 0x1e58, 0x42b1, 0x4322, 0xb058, 0xbf0b, 0x080d, 0xba66, 0x4326, 0x096f, 0x4366, 0x42eb, 0x1b82, 0x43af, 0x4032, 0xb20e, 0x42a5, 0x1ed5, 0xa3f5, 0x410f, 0xba5d, 0x4120, 0xbf5f, 0x2aa9, 0xba1b, 0x0051, 0x40ad, 0x04a1, 0x420e, 0x3c42, 0x42e0, 0x42bb, 0x43d1, 0x447f, 0xbf14, 0x0ca2, 0xba56, 0x42ed, 0x4372, 0x2ffe, 0x42bd, 0x411e, 0x400a, 0x4285, 0x4652, 0xb079, 0x40ee, 0x0a3a, 0x11c7, 0x403f, 0x14df, 0x40eb, 0xb236, 0x323f, 0x43d7, 0x05c3, 0xbfca, 0xb0cc, 0xba51, 0x1d2c, 0xbf72, 0xba3a, 0x2c3a, 0x4154, 0xbf31, 0xba27, 0x19d1, 0x43b4, 0x4167, 0xba36, 0x42bb, 0x0e3a, 0x4011, 0x4363, 0xbae0, 0x186e, 0x40d1, 0x3dff, 0x38c3, 0x12b7, 0x0292, 0x4561, 0xb037, 0x1dda, 0x401e, 0x43d8, 0xacf4, 0x3e49, 0xbf81, 0x1a75, 0x1d50, 0xb2e7, 0x4080, 0x108c, 0x0fbc, 0x41c5, 0x4189, 0xbad6, 0x1d8f, 0x3b0a, 0xa7a7, 0xbfe0, 0x4072, 0x43a6, 0x19e2, 0x4376, 0x09a4, 0x42fe, 0x0780, 0x4158, 0xbfc9, 0x435d, 0xa29f, 0x4111, 0x01c5, 0x435f, 0x41b2, 0xba73, 0x46cd, 0xbf1b, 0xba2a, 0x161c, 0xb0f2, 0xbff0, 0x00c3, 0xa332, 0x2528, 0x19e9, 0x26a9, 0x1d5c, 0xb2ff, 0x42d8, 0xbf70, 0x175e, 0xbf3c, 0x40db, 0x43af, 0x2e2b, 0xb207, 0x421b, 0x4172, 0x0976, 0x410d, 0x439f, 0x1933, 0x1b15, 0x0093, 0x43df, 0x41f1, 0x40c6, 0x1c52, 0x1e4d, 0x4600, 0x0be1, 0xbf7d, 0x2de0, 0x43e4, 0x4319, 0x428c, 0x41bd, 0x4155, 0x46ab, 0x2730, 0x3a48, 0x4365, 0x403d, 0x1ad8, 0x0537, 0x41a0, 0x1994, 0x401b, 0x4088, 0xb2a0, 0x4050, 0x1dc2, 0x435d, 0x437d, 0xb0b7, 0x4060, 0x4109, 0x44aa, 0x41c1, 0xbf8b, 0x43f8, 0xb2bc, 0xba6e, 0xb023, 0x215b, 0x43c9, 0x43c4, 0x1feb, 0x00f7, 0x40e7, 0xb267, 0xbfc5, 0xb229, 0x42e8, 0xbad3, 0x4171, 0x400c, 0xbadf, 0x42ac, 0x431d, 0x4393, 0x4380, 0xa188, 0xbf81, 0xa3d8, 0x442b, 0x42d3, 0x41ce, 0x1e19, 0x4143, 0x4005, 0xb0c1, 0x4211, 0x455c, 0x25ba, 0x0780, 0x422e, 0x400f, 0x45d4, 0x2e74, 0x41cb, 0x1c7e, 0xbfcb, 0xb26a, 0x46f5, 0x3ee4, 0xa482, 0x18c4, 0x44b2, 0x4204, 0x43db, 0x3545, 0x421f, 0xb2f0, 0x463e, 0x2001, 0x43eb, 0x42d4, 0xb28a, 0x3886, 0x4191, 0xadd9, 0x415b, 0x4138, 0x4103, 0x45c9, 0x111b, 0xb02b, 0xb0e6, 0xbf3d, 0x23cd, 0x40ad, 0xb2d2, 0xb0cb, 0xb2e1, 0x21e4, 0xba28, 0xba05, 0xbf48, 0xbfb0, 0x060e, 0x1fa5, 0xba0d, 0x45dd, 0x4017, 0xbf1b, 0x30fd, 0x210c, 0x42b3, 0x17b5, 0x401f, 0x0b91, 0x264c, 0x40af, 0x40c2, 0xbf7d, 0x0302, 0xa7b3, 0x43e0, 0xba6c, 0xbf18, 0x0add, 0x1fe5, 0x0f9f, 0xb073, 0x381f, 0x1b07, 0xb0fa, 0x40d8, 0x1852, 0x4211, 0x42a6, 0x4036, 0xbac4, 0xa27b, 0x435d, 0x18eb, 0x4171, 0x4318, 0xb08e, 0x4296, 0xb2f4, 0xb2ea, 0x3e89, 0xbf32, 0x43b9, 0x1a0b, 0xb2d2, 0x429c, 0x2aad, 0xbf90, 0x18a6, 0x4360, 0x1a4a, 0x4435, 0xba4e, 0x4071, 0x1b83, 0x465d, 0x2ed8, 0x1a91, 0xbada, 0xbfb1, 0x41a8, 0x278e, 0x4182, 0x42c1, 0x1821, 0xbfa0, 0xbad2, 0xb0fe, 0x42e1, 0x1964, 0x46b9, 0xb2a2, 0x40f9, 0xbacc, 0x4221, 0x425a, 0x4464, 0x418e, 0xb0e6, 0x4392, 0x3a7b, 0x4206, 0x1970, 0xbf67, 0x4241, 0xb2f2, 0xbad7, 0x429e, 0x4332, 0x42e6, 0xa4a7, 0x42f6, 0x4011, 0xa32e, 0x40bb, 0x4651, 0x4458, 0x4309, 0x43f5, 0x438c, 0x2ca1, 0xba00, 0x438e, 0xba55, 0x1c48, 0x43f6, 0x41d3, 0xb2a4, 0x4034, 0xba2f, 0xbf0f, 0xbf60, 0xbaf7, 0x42fc, 0xbacb, 0x4217, 0x421e, 0x4113, 0x1863, 0x4103, 0xb052, 0x43b2, 0xb2ab, 0x440f, 0xb22a, 0x4207, 0x40df, 0x449b, 0x185d, 0xbf33, 0x0307, 0x1f5c, 0xb22f, 0x365e, 0x415a, 0xb218, 0x44fc, 0x3db0, 0x41bf, 0x41e6, 0x21d8, 0x412b, 0x4065, 0xbf4d, 0x1013, 0xa00f, 0x444e, 0x4341, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x81c55787, 0xada11b20, 0x3e10df97, 0x7b862743, 0x1f0517ba, 0x4d0933c2, 0x10df7fe1, 0x2dec0c53, 0xcbcf889f, 0x3e17e3e5, 0x8eacf129, 0xd8f1b147, 0xb8b631ab, 0x63405cb4, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x0000181c, 0x000000d8, 0x0000fffe, 0x00000000, 0x00000a00, 0x7f37fe5f, 0xfffffffc, 0x00000000, 0x00000000, 0x0000008e, 0x7f36f510, 0xfb5e1489, 0x0000183a, 0xbf82a5e0, 0x00000000, 0x000001d0 }, + Instructions = [0xb234, 0x4215, 0x2ab0, 0x43d9, 0x42a0, 0x432b, 0x0bb3, 0x191b, 0x086d, 0x4251, 0x42d3, 0xba6f, 0xa2e4, 0x4069, 0x42ec, 0xae3e, 0xb293, 0xbf16, 0xa0fb, 0x433a, 0x4366, 0x45a5, 0x41d4, 0xb2ca, 0x1ed4, 0xb06d, 0x2a1c, 0x1fbf, 0xbaf6, 0xb266, 0xb293, 0x1c35, 0x3693, 0x2df7, 0xb031, 0x1c23, 0xad6c, 0x36e1, 0x4116, 0xbfc0, 0x32a2, 0xba37, 0x455d, 0x40e1, 0x4047, 0xbf01, 0xbaf8, 0xbad3, 0x19a9, 0x4255, 0xb074, 0x4360, 0xba2b, 0x1e38, 0x18c5, 0x44ed, 0x44e5, 0x187b, 0xb22a, 0x40a3, 0x1852, 0xb276, 0x40dc, 0x42dc, 0x2cf9, 0xb041, 0x18c1, 0xba29, 0xbff0, 0xa748, 0x42ab, 0xbf7d, 0x253d, 0x4352, 0x0c85, 0x438f, 0x4274, 0x3cf4, 0xafce, 0x1974, 0xb074, 0xbfa6, 0x4257, 0xba5b, 0x4037, 0xa515, 0xb0bd, 0x04fe, 0x1cf8, 0x420c, 0x4119, 0x4184, 0x4312, 0x45d3, 0x41ef, 0x4011, 0xb00a, 0xb027, 0xb0f9, 0x41bc, 0x4087, 0x41bd, 0xa595, 0x4126, 0x45d8, 0xbfbd, 0x2aaa, 0xb22b, 0x4361, 0xb2ad, 0x02e9, 0x43f5, 0xb21b, 0x41c2, 0x0d25, 0x03aa, 0x3663, 0x4404, 0x45ce, 0xbf8a, 0x21db, 0x4362, 0x1af0, 0xbf68, 0x415b, 0x4223, 0x2828, 0x4075, 0xbf42, 0xb262, 0xacd1, 0xb011, 0x1da5, 0x43fc, 0x408c, 0x43b3, 0x43c5, 0xb0c7, 0xa5b2, 0xbf17, 0x409d, 0xbac7, 0x4440, 0x0ba9, 0x4025, 0x2022, 0xa67c, 0x4214, 0x40e4, 0xba71, 0xb28c, 0x40ea, 0x41cf, 0x41e2, 0xbfbf, 0xb2bc, 0x3e8c, 0x40eb, 0xb2d4, 0xa13f, 0x4311, 0xbf52, 0x19f8, 0xbf70, 0xb2f4, 0xb06c, 0x0ab2, 0x0a8e, 0x40ae, 0xba23, 0x1c9c, 0x4211, 0x17ac, 0x1c16, 0x1235, 0xab09, 0x1a59, 0x41f7, 0x46a3, 0x1b42, 0x416e, 0x0f01, 0x0b26, 0x407f, 0x4228, 0x0d9f, 0x43c2, 0x435d, 0xbf22, 0x4270, 0x1893, 0x4246, 0xbf06, 0x30d0, 0xba13, 0xae81, 0x0378, 0x4088, 0x463e, 0x4101, 0x4243, 0x1ddd, 0x41bf, 0xba17, 0xae45, 0x1c8e, 0xb014, 0xa8ef, 0x4167, 0x4207, 0x40c6, 0xb018, 0xa950, 0x4073, 0x049b, 0x41a2, 0x45c5, 0x424b, 0x439a, 0x1a0a, 0x3231, 0xbf32, 0xb20b, 0x433b, 0xba2b, 0xbf5d, 0x430c, 0xb2f5, 0x4131, 0x43e4, 0x1e5f, 0x42e8, 0x1f98, 0x115d, 0x4268, 0x41eb, 0x05f8, 0x28e7, 0x06ea, 0xb002, 0xb2d0, 0x1cac, 0x43ca, 0x0c9b, 0x425b, 0xbfe0, 0x40d1, 0x42a1, 0x3faf, 0x403d, 0xb011, 0xb204, 0x4204, 0x4274, 0xbf7f, 0x0588, 0xa465, 0xbadf, 0x1860, 0x0720, 0x4115, 0xbaf0, 0x417e, 0x4569, 0xb211, 0x40a2, 0x43d8, 0x38ea, 0x4061, 0x42df, 0xb2d6, 0x415e, 0x432c, 0xba38, 0x4353, 0x4352, 0x45a5, 0xbf05, 0x4078, 0x3f2a, 0xba41, 0x44e8, 0xb209, 0x1da4, 0xb2c8, 0x41e8, 0xbf29, 0xbafe, 0x1a67, 0x1829, 0x1bf3, 0x0647, 0xb2c6, 0x0c9f, 0x41f5, 0x11dc, 0xbf87, 0x4124, 0xbacc, 0x424a, 0x2a70, 0x403e, 0xb25a, 0x1d42, 0xa62a, 0x4097, 0x43d5, 0xbfa0, 0x3791, 0xba00, 0x1644, 0xba57, 0xb215, 0x4251, 0x07ef, 0xbf4a, 0x2bd0, 0x2e96, 0x4355, 0x4393, 0x4376, 0xbf59, 0x411a, 0x400e, 0xba18, 0x43f5, 0xbf65, 0x4054, 0xae5d, 0xb2e8, 0x4230, 0xa533, 0x4134, 0xb2d9, 0x4149, 0x3cee, 0xbf80, 0x40a1, 0x1745, 0x1b9c, 0x1b90, 0x41be, 0x4468, 0xab8c, 0x4618, 0x1d05, 0x1c91, 0x259f, 0x4228, 0x414b, 0x4028, 0xbfd9, 0x4298, 0x4139, 0x1f8a, 0x4355, 0x4302, 0x42f9, 0x1951, 0xbf9c, 0xba05, 0x400c, 0xacba, 0x44b1, 0xb216, 0x4151, 0x2013, 0x40df, 0x3de1, 0x1f4a, 0x4036, 0x401e, 0x42a0, 0x42cd, 0x40dd, 0x428c, 0xbfd2, 0x4012, 0x1b19, 0x4099, 0x437f, 0x0289, 0x40ef, 0x1f98, 0x418f, 0x19e0, 0x40c5, 0xb2ea, 0x4366, 0x46ea, 0x427a, 0x4464, 0x4262, 0x4280, 0xbafa, 0xbf6f, 0x21d0, 0x1e60, 0x0a92, 0x0f02, 0x2122, 0x434c, 0x40c6, 0xba0c, 0xbf64, 0xa3fa, 0x10b4, 0xbac4, 0x41f5, 0x4079, 0x4197, 0x226a, 0xb2bf, 0x209e, 0x4085, 0xb07d, 0x437c, 0x3671, 0x2d5b, 0x4090, 0x44d0, 0xbf3b, 0x4259, 0xbaf9, 0x4329, 0x418d, 0x4292, 0x4485, 0x4694, 0x4059, 0xb21e, 0x41e6, 0xad2c, 0x3caf, 0xbf0b, 0xb29f, 0x4133, 0x4366, 0x04e2, 0xba2f, 0x1f7a, 0x41a6, 0x0e62, 0xb2f1, 0x43a3, 0xb09c, 0x443d, 0x025f, 0x4128, 0x1fb1, 0x1dea, 0x3733, 0xbfc5, 0x4263, 0xbad3, 0x42f0, 0xb238, 0xba0d, 0x3c1f, 0x4206, 0x41bb, 0x430a, 0x43ad, 0x1984, 0x4303, 0x0cb0, 0xba11, 0x1c1f, 0xb2df, 0xba43, 0x415b, 0xbfa4, 0xbf90, 0x1c9d, 0x1d4a, 0xab5e, 0x46f0, 0xb22e, 0xba16, 0x09f6, 0xba6a, 0x408e, 0x4380, 0xac19, 0x439f, 0x43d2, 0xbfa0, 0x4258, 0xa366, 0x4051, 0xbf36, 0x438a, 0x429f, 0x43f3, 0xb2c5, 0x3bd3, 0x1fa1, 0xb23c, 0x443d, 0xba27, 0xb089, 0x4354, 0x0f0f, 0x1da0, 0x4384, 0x4228, 0xb201, 0xbfe2, 0x4227, 0x395f, 0x447c, 0x43b0, 0x3a46, 0x1ba2, 0xbf80, 0x1c7c, 0xb200, 0x42e2, 0xba2b, 0xb279, 0x43e7, 0xb275, 0x3d99, 0x23a0, 0x41c6, 0x020a, 0x456b, 0x41ea, 0xb0dc, 0x466d, 0x3dec, 0xa2f3, 0x0a1d, 0xbfcc, 0x2a39, 0x215f, 0xbade, 0xb2a5, 0xb22a, 0x406c, 0x4093, 0x33ea, 0x117d, 0xabbf, 0x4291, 0x4055, 0x425e, 0x43e6, 0x4202, 0x4383, 0xbf3e, 0xae2d, 0x4165, 0x404b, 0x45e2, 0xbf60, 0xb0c6, 0x405b, 0xbff0, 0x0ed3, 0xb256, 0x4305, 0x02d6, 0x10a9, 0xac5f, 0xba55, 0xad0d, 0x1b53, 0x42c5, 0x40b6, 0xb211, 0x40cc, 0x1d30, 0x4098, 0x1df1, 0xbf66, 0x4553, 0x41af, 0x0cff, 0x4307, 0x40fa, 0x318f, 0x1b3e, 0xb2f6, 0x442e, 0xb229, 0x0b45, 0xb2de, 0x1948, 0xba36, 0x1a5b, 0x40ae, 0x0dc0, 0x4316, 0x1e5a, 0x258e, 0x4299, 0x1e58, 0x42b1, 0x4322, 0xb058, 0xbf0b, 0x080d, 0xba66, 0x4326, 0x096f, 0x4366, 0x42eb, 0x1b82, 0x43af, 0x4032, 0xb20e, 0x42a5, 0x1ed5, 0xa3f5, 0x410f, 0xba5d, 0x4120, 0xbf5f, 0x2aa9, 0xba1b, 0x0051, 0x40ad, 0x04a1, 0x420e, 0x3c42, 0x42e0, 0x42bb, 0x43d1, 0x447f, 0xbf14, 0x0ca2, 0xba56, 0x42ed, 0x4372, 0x2ffe, 0x42bd, 0x411e, 0x400a, 0x4285, 0x4652, 0xb079, 0x40ee, 0x0a3a, 0x11c7, 0x403f, 0x14df, 0x40eb, 0xb236, 0x323f, 0x43d7, 0x05c3, 0xbfca, 0xb0cc, 0xba51, 0x1d2c, 0xbf72, 0xba3a, 0x2c3a, 0x4154, 0xbf31, 0xba27, 0x19d1, 0x43b4, 0x4167, 0xba36, 0x42bb, 0x0e3a, 0x4011, 0x4363, 0xbae0, 0x186e, 0x40d1, 0x3dff, 0x38c3, 0x12b7, 0x0292, 0x4561, 0xb037, 0x1dda, 0x401e, 0x43d8, 0xacf4, 0x3e49, 0xbf81, 0x1a75, 0x1d50, 0xb2e7, 0x4080, 0x108c, 0x0fbc, 0x41c5, 0x4189, 0xbad6, 0x1d8f, 0x3b0a, 0xa7a7, 0xbfe0, 0x4072, 0x43a6, 0x19e2, 0x4376, 0x09a4, 0x42fe, 0x0780, 0x4158, 0xbfc9, 0x435d, 0xa29f, 0x4111, 0x01c5, 0x435f, 0x41b2, 0xba73, 0x46cd, 0xbf1b, 0xba2a, 0x161c, 0xb0f2, 0xbff0, 0x00c3, 0xa332, 0x2528, 0x19e9, 0x26a9, 0x1d5c, 0xb2ff, 0x42d8, 0xbf70, 0x175e, 0xbf3c, 0x40db, 0x43af, 0x2e2b, 0xb207, 0x421b, 0x4172, 0x0976, 0x410d, 0x439f, 0x1933, 0x1b15, 0x0093, 0x43df, 0x41f1, 0x40c6, 0x1c52, 0x1e4d, 0x4600, 0x0be1, 0xbf7d, 0x2de0, 0x43e4, 0x4319, 0x428c, 0x41bd, 0x4155, 0x46ab, 0x2730, 0x3a48, 0x4365, 0x403d, 0x1ad8, 0x0537, 0x41a0, 0x1994, 0x401b, 0x4088, 0xb2a0, 0x4050, 0x1dc2, 0x435d, 0x437d, 0xb0b7, 0x4060, 0x4109, 0x44aa, 0x41c1, 0xbf8b, 0x43f8, 0xb2bc, 0xba6e, 0xb023, 0x215b, 0x43c9, 0x43c4, 0x1feb, 0x00f7, 0x40e7, 0xb267, 0xbfc5, 0xb229, 0x42e8, 0xbad3, 0x4171, 0x400c, 0xbadf, 0x42ac, 0x431d, 0x4393, 0x4380, 0xa188, 0xbf81, 0xa3d8, 0x442b, 0x42d3, 0x41ce, 0x1e19, 0x4143, 0x4005, 0xb0c1, 0x4211, 0x455c, 0x25ba, 0x0780, 0x422e, 0x400f, 0x45d4, 0x2e74, 0x41cb, 0x1c7e, 0xbfcb, 0xb26a, 0x46f5, 0x3ee4, 0xa482, 0x18c4, 0x44b2, 0x4204, 0x43db, 0x3545, 0x421f, 0xb2f0, 0x463e, 0x2001, 0x43eb, 0x42d4, 0xb28a, 0x3886, 0x4191, 0xadd9, 0x415b, 0x4138, 0x4103, 0x45c9, 0x111b, 0xb02b, 0xb0e6, 0xbf3d, 0x23cd, 0x40ad, 0xb2d2, 0xb0cb, 0xb2e1, 0x21e4, 0xba28, 0xba05, 0xbf48, 0xbfb0, 0x060e, 0x1fa5, 0xba0d, 0x45dd, 0x4017, 0xbf1b, 0x30fd, 0x210c, 0x42b3, 0x17b5, 0x401f, 0x0b91, 0x264c, 0x40af, 0x40c2, 0xbf7d, 0x0302, 0xa7b3, 0x43e0, 0xba6c, 0xbf18, 0x0add, 0x1fe5, 0x0f9f, 0xb073, 0x381f, 0x1b07, 0xb0fa, 0x40d8, 0x1852, 0x4211, 0x42a6, 0x4036, 0xbac4, 0xa27b, 0x435d, 0x18eb, 0x4171, 0x4318, 0xb08e, 0x4296, 0xb2f4, 0xb2ea, 0x3e89, 0xbf32, 0x43b9, 0x1a0b, 0xb2d2, 0x429c, 0x2aad, 0xbf90, 0x18a6, 0x4360, 0x1a4a, 0x4435, 0xba4e, 0x4071, 0x1b83, 0x465d, 0x2ed8, 0x1a91, 0xbada, 0xbfb1, 0x41a8, 0x278e, 0x4182, 0x42c1, 0x1821, 0xbfa0, 0xbad2, 0xb0fe, 0x42e1, 0x1964, 0x46b9, 0xb2a2, 0x40f9, 0xbacc, 0x4221, 0x425a, 0x4464, 0x418e, 0xb0e6, 0x4392, 0x3a7b, 0x4206, 0x1970, 0xbf67, 0x4241, 0xb2f2, 0xbad7, 0x429e, 0x4332, 0x42e6, 0xa4a7, 0x42f6, 0x4011, 0xa32e, 0x40bb, 0x4651, 0x4458, 0x4309, 0x43f5, 0x438c, 0x2ca1, 0xba00, 0x438e, 0xba55, 0x1c48, 0x43f6, 0x41d3, 0xb2a4, 0x4034, 0xba2f, 0xbf0f, 0xbf60, 0xbaf7, 0x42fc, 0xbacb, 0x4217, 0x421e, 0x4113, 0x1863, 0x4103, 0xb052, 0x43b2, 0xb2ab, 0x440f, 0xb22a, 0x4207, 0x40df, 0x449b, 0x185d, 0xbf33, 0x0307, 0x1f5c, 0xb22f, 0x365e, 0x415a, 0xb218, 0x44fc, 0x3db0, 0x41bf, 0x41e6, 0x21d8, 0x412b, 0x4065, 0xbf4d, 0x1013, 0xa00f, 0x444e, 0x4341, 0x4770, 0xe7fe + ], + StartRegs = [0x81c55787, 0xada11b20, 0x3e10df97, 0x7b862743, 0x1f0517ba, 0x4d0933c2, 0x10df7fe1, 0x2dec0c53, 0xcbcf889f, 0x3e17e3e5, 0x8eacf129, 0xd8f1b147, 0xb8b631ab, 0x63405cb4, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x0000181c, 0x000000d8, 0x0000fffe, 0x00000000, 0x00000a00, 0x7f37fe5f, 0xfffffffc, 0x00000000, 0x00000000, 0x0000008e, 0x7f36f510, 0xfb5e1489, 0x0000183a, 0xbf82a5e0, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x43e9, 0xb2ae, 0x2b63, 0x4354, 0xbf91, 0xb23c, 0x4231, 0xb075, 0xb2fc, 0xba3a, 0x4162, 0x1cd2, 0x42af, 0x426e, 0x43fa, 0x0099, 0x1acc, 0x4434, 0x411d, 0x4624, 0xb25e, 0xbfc4, 0x1ef8, 0x45ac, 0x0b2d, 0xb2b0, 0x424d, 0x365f, 0x4336, 0xb0ac, 0x2a8b, 0xaa5c, 0x1bc1, 0x40ca, 0x18db, 0x3c16, 0x4181, 0x4348, 0x1cdf, 0x0413, 0xb2ad, 0xbfce, 0x1e96, 0x4304, 0x405b, 0x42ed, 0x1cea, 0x4159, 0x4057, 0x1c6b, 0x4256, 0x372b, 0x41d8, 0x4268, 0xa6ea, 0x430f, 0x1e36, 0x42bc, 0x40f5, 0xa28f, 0x1ae4, 0xb2a0, 0x4282, 0xa134, 0x4355, 0x42ba, 0x4395, 0x1faa, 0x154b, 0x434a, 0xbf6e, 0x43d1, 0xb2cd, 0x40b8, 0xbfe0, 0x0c97, 0x2541, 0x350e, 0x41c6, 0x40b5, 0x1e4d, 0x4048, 0x4657, 0x428a, 0x07dc, 0x42bb, 0x3923, 0x430d, 0x41a0, 0xbaed, 0xbf4e, 0x40ee, 0x0acb, 0x1f73, 0xbae9, 0xa18e, 0x41a8, 0x1947, 0x181b, 0x4248, 0x4349, 0xbf11, 0x1e48, 0x41d8, 0x18dc, 0x2073, 0xb20f, 0x41df, 0x41bf, 0x1ba3, 0xbf90, 0x4144, 0x428d, 0x41f9, 0x43b8, 0xb239, 0x4180, 0x432a, 0x4119, 0x46f8, 0x4329, 0x4091, 0x4302, 0xb228, 0x4094, 0x40b1, 0xbfcd, 0x2d26, 0x454f, 0x18a4, 0x42fb, 0x1b0e, 0x0d5a, 0x1ddb, 0x14c4, 0x43c2, 0xa374, 0x426b, 0xb0c9, 0x4262, 0xbf80, 0xbf8f, 0x46d3, 0x40cb, 0x4377, 0xb2b3, 0x3a47, 0xba60, 0xbfd9, 0xb267, 0x429a, 0x1806, 0x43d3, 0x3142, 0xb2be, 0x1487, 0x18ab, 0x1cd7, 0xba36, 0x1027, 0xb028, 0x1742, 0x435b, 0x4147, 0x2501, 0x41f0, 0xbadb, 0x40af, 0x444b, 0xb24c, 0xbae8, 0x40aa, 0xb2fe, 0xa75f, 0xbfcb, 0x4162, 0x4146, 0x4328, 0x2a69, 0x4247, 0x286e, 0x0b98, 0x24fb, 0xb061, 0x43a8, 0x409b, 0x1a0b, 0x41b6, 0x435a, 0xb244, 0x242e, 0xbad4, 0x0f4e, 0xbf0b, 0x4069, 0x273a, 0x4422, 0x4208, 0x4248, 0x43fa, 0x4406, 0xb2c1, 0x4046, 0x40bb, 0x4267, 0xb2b6, 0x03b8, 0xb2fd, 0x3dd7, 0xba6c, 0xb29b, 0xba17, 0x4109, 0x1b66, 0xb2df, 0xb005, 0x3496, 0x4598, 0xbf48, 0x40b2, 0x2979, 0x40d4, 0x4269, 0xb2ba, 0x3b3b, 0x408f, 0x336d, 0x1b00, 0x42c9, 0x2a70, 0xbf00, 0xaf87, 0x4386, 0x40c3, 0x4601, 0x461a, 0xbf90, 0xb217, 0x1d8e, 0x1c52, 0x42eb, 0x403f, 0xa25c, 0xa437, 0xbfcd, 0x19b1, 0x413f, 0x404a, 0x19f3, 0xbae3, 0x20a3, 0xbf4e, 0x3dd9, 0x4157, 0xb2ee, 0x29e2, 0xbad3, 0x42ab, 0x40af, 0xbf0d, 0xbaea, 0x43c8, 0xbae8, 0x0451, 0x424a, 0x1c6b, 0x400e, 0x4144, 0x3a3a, 0x412f, 0xbf04, 0x42df, 0x3821, 0x40ec, 0x433e, 0x4196, 0x43fd, 0x42e0, 0xb00f, 0x44dc, 0x2af8, 0x157c, 0x4316, 0xb095, 0xbf4b, 0x1a70, 0x1aaf, 0xb263, 0x41a3, 0x42ae, 0x44ba, 0x289a, 0xb293, 0x40d8, 0x3bc3, 0x42a1, 0x41e8, 0xbaf7, 0x403d, 0x418d, 0x42cf, 0xb023, 0xb05c, 0x4029, 0x40e4, 0x4209, 0x40fc, 0x108c, 0x40d5, 0xbf14, 0xb0e2, 0x425c, 0x4220, 0x244c, 0x0736, 0x1d18, 0x401d, 0x40ac, 0x4045, 0x4051, 0xaf3a, 0xbaef, 0x4451, 0x439a, 0x43ba, 0x406b, 0x1daf, 0x409e, 0x44ad, 0xb09c, 0x4087, 0x205e, 0x4540, 0x40fc, 0xb27d, 0xbf7a, 0x28c4, 0x42c5, 0x4178, 0x42eb, 0x40d3, 0xb273, 0x45f3, 0x401b, 0x43ca, 0x43f4, 0x43d1, 0xaed9, 0xba70, 0x41c3, 0x11e8, 0x41bb, 0x40e2, 0x41c0, 0xa5a2, 0x09c4, 0xbfc0, 0x43aa, 0x388c, 0x411e, 0x189f, 0xbf81, 0x4339, 0x1f88, 0x1b87, 0xa26a, 0xbf0a, 0x4366, 0x415a, 0x42ac, 0x41bc, 0xbf60, 0xba4b, 0xba12, 0x41b7, 0x413d, 0xb02f, 0x4235, 0x0548, 0x0509, 0x41de, 0x42c6, 0x16c5, 0x3d8d, 0xbf0d, 0x2de3, 0x40b7, 0x417f, 0x40f6, 0xa413, 0x4232, 0xba60, 0x4126, 0x4044, 0x1bd0, 0x2d4b, 0x20bd, 0xb215, 0x40d9, 0x415c, 0xbf08, 0x1d75, 0x1e01, 0x411c, 0x0b49, 0x410e, 0xbfcf, 0x1455, 0x0ee7, 0x05cd, 0x4394, 0xb2b1, 0x432c, 0x25fb, 0x4671, 0x4053, 0x3e48, 0x0be7, 0x405f, 0x4276, 0x41f6, 0x440e, 0x40f6, 0x435a, 0x41a5, 0xb2ef, 0x3d3f, 0x443a, 0x332a, 0xb00d, 0x4432, 0x1d1c, 0x428e, 0x4296, 0x42ef, 0xbfaf, 0x4062, 0x1918, 0x08bd, 0x4241, 0xba2f, 0x40b9, 0x1e32, 0x42be, 0x2983, 0xbf99, 0x402b, 0x423e, 0x41e5, 0x403a, 0xbf70, 0x41d1, 0x42cf, 0x434f, 0x41ea, 0x1dd7, 0x418c, 0x418f, 0xb248, 0x1e0f, 0x2ec4, 0x42f5, 0x40e2, 0x4330, 0x4118, 0xad76, 0xb089, 0x41b9, 0x40de, 0x42fa, 0xba54, 0xb2c6, 0xbf09, 0x4102, 0x41e7, 0xb08b, 0x41bd, 0x1dbf, 0x4140, 0x4009, 0x42fc, 0x46db, 0xbad8, 0x45ae, 0x40e0, 0x4212, 0x43fd, 0x43cb, 0x435f, 0x4276, 0x15a5, 0xb222, 0x409b, 0x40cb, 0xbf48, 0xad26, 0x40e7, 0x3491, 0x36b5, 0xbfa6, 0x4192, 0x43e1, 0x430d, 0xb28b, 0xaa14, 0x42eb, 0x4492, 0x41a8, 0xa8d2, 0x436e, 0x41c9, 0x4211, 0x42cf, 0x0d26, 0x41ea, 0x40bd, 0x0f79, 0x40d2, 0x394c, 0x4072, 0x40c9, 0xbf84, 0xb278, 0x2591, 0x43a9, 0x13e4, 0xb287, 0x02ad, 0x3290, 0x43ec, 0x4141, 0x431a, 0x46a9, 0x4629, 0x2e09, 0x1a14, 0x41f5, 0xba19, 0x35d8, 0x2c4a, 0x43dc, 0xb28e, 0x40b7, 0x41db, 0x41fe, 0x2f4d, 0xbfe8, 0x4459, 0x46d8, 0x42c5, 0x1d4f, 0x1a9e, 0x4203, 0x42b2, 0x4299, 0x428d, 0xbf29, 0x4129, 0xb223, 0x427a, 0x41c5, 0x089e, 0xad9a, 0xb24c, 0x1f2a, 0xb023, 0xb291, 0x42b3, 0xb07a, 0x1e3c, 0xa3d6, 0x4194, 0xbaf7, 0x370e, 0x1faa, 0x197f, 0x409e, 0x19c8, 0x4616, 0xbf7a, 0x42a2, 0x437e, 0xba3e, 0x4312, 0x428a, 0x418a, 0x433b, 0x03d8, 0x0250, 0xb29a, 0x1dd0, 0x33c0, 0x4334, 0xb0fd, 0xbfa0, 0xb279, 0x4067, 0x405b, 0xb23e, 0x2224, 0x4375, 0x2e15, 0x406f, 0x43b4, 0xbf94, 0xba6d, 0x04eb, 0x42f4, 0x42d7, 0x4184, 0x40cb, 0x40c5, 0x422d, 0x19c7, 0x415e, 0x426f, 0x4124, 0xb2e7, 0xa9a4, 0x40ed, 0x412f, 0x43c9, 0x3ca8, 0x1b05, 0x32fc, 0x4276, 0x4037, 0x447f, 0x40c3, 0xb267, 0xbf81, 0x43bb, 0xb243, 0x4570, 0x2b22, 0x0e9c, 0x4063, 0x1bea, 0x4055, 0x2367, 0xba35, 0x1e69, 0x0926, 0x44f5, 0xb00b, 0x18f8, 0x4007, 0xb255, 0x4350, 0xb0a5, 0x4095, 0xba26, 0xa26b, 0x14b9, 0x4346, 0xbfae, 0x4312, 0x4446, 0xbf80, 0xa9c8, 0xba7d, 0x410a, 0xbfa2, 0x2319, 0xb282, 0x4185, 0x425f, 0x41c1, 0x409c, 0x1a10, 0x1003, 0x284b, 0xbae6, 0xb221, 0xb242, 0x4262, 0xbad8, 0xbafe, 0xaa78, 0x4223, 0x41d8, 0xb0f9, 0x4091, 0x445c, 0x321e, 0x42c1, 0x4023, 0x411a, 0x438f, 0x43fd, 0xbf29, 0x434f, 0xa7a0, 0x1d7a, 0x40f0, 0xba4f, 0x2879, 0x4093, 0xa50b, 0x42b5, 0xb289, 0x43dd, 0xb014, 0xba26, 0x0450, 0x413b, 0x1828, 0xba63, 0x4156, 0x292f, 0x428f, 0xb053, 0xbf68, 0x42c4, 0x059b, 0x14ec, 0x4207, 0x43c8, 0x43b7, 0xba72, 0xb297, 0x1ab9, 0x1525, 0x416d, 0x420c, 0x446b, 0xb205, 0x466b, 0x416f, 0x19c5, 0x4351, 0x22d5, 0x4670, 0xb06b, 0x0374, 0x066b, 0xbfb9, 0x0c25, 0xabee, 0x4143, 0x41f2, 0x181b, 0x42f7, 0x40ab, 0x4130, 0xba4a, 0x1a6d, 0xba02, 0x4165, 0xbf60, 0x417e, 0x340c, 0xba72, 0xbaff, 0x3ddc, 0xbf35, 0x415a, 0x4011, 0x42cb, 0x437c, 0x3d03, 0x41d4, 0x1855, 0x0b24, 0xa86b, 0x41ef, 0xb262, 0x41a4, 0xb272, 0x43a4, 0x030c, 0x4365, 0xbf52, 0x46b5, 0x464d, 0x42b3, 0x1b6e, 0xba3d, 0x20f7, 0x35dc, 0x2ee9, 0xbf4e, 0x4378, 0xaf6a, 0x142e, 0xb290, 0x42d9, 0x40d8, 0xb069, 0x1fb9, 0x430a, 0x0594, 0x4231, 0xbafd, 0x3a53, 0xb2b1, 0xb0e0, 0x001d, 0xa85d, 0x17cd, 0x42b5, 0x4330, 0xb012, 0xbacd, 0x0ed9, 0xbf86, 0xba22, 0x4068, 0x263e, 0x0048, 0xb2a4, 0xba4a, 0xbf3a, 0x4224, 0x426e, 0x0a8d, 0xa5f2, 0x14f4, 0x4164, 0x1e8e, 0x324b, 0xba1c, 0x40ed, 0x4108, 0x170d, 0x30b8, 0x04a7, 0xb073, 0x2d88, 0x4171, 0x1b68, 0xbfa4, 0x40fe, 0xbac1, 0xba57, 0xb2ce, 0x330f, 0x2614, 0x070e, 0xb0c2, 0x4244, 0xad7d, 0x06ac, 0xa5ef, 0x0d63, 0x42aa, 0xb2df, 0xb2ce, 0x42d1, 0x2ea4, 0xbf4d, 0x4185, 0x41bb, 0x45e1, 0x326c, 0x42ea, 0x443c, 0xb219, 0x41a7, 0xbf31, 0x42af, 0x43f5, 0x4137, 0x1efb, 0x4175, 0x40fa, 0x4340, 0x40f0, 0x4342, 0x43f6, 0xbafe, 0x17c7, 0xbfcc, 0x4485, 0x43e3, 0x4085, 0x4003, 0x4187, 0x07dd, 0x3c2d, 0x1acf, 0x40a2, 0xbae2, 0x417c, 0xbfe0, 0x198c, 0xbf8c, 0x1a73, 0xbafc, 0x2c1d, 0x0cf6, 0x43a9, 0x403d, 0xbf34, 0x4297, 0xb000, 0xb27b, 0xab7d, 0x05c9, 0xb245, 0x4326, 0x426d, 0x4226, 0x42df, 0xb0d8, 0x46f2, 0x43ca, 0x4096, 0x283c, 0x4406, 0x41bc, 0xbf6d, 0x433b, 0x458b, 0x41be, 0xb019, 0x4029, 0x4167, 0x42a1, 0x4024, 0xbaf1, 0xb26c, 0x1e3d, 0xb292, 0x41ea, 0x241b, 0x4024, 0x1aec, 0x431e, 0x4606, 0x4209, 0x356f, 0x4308, 0xa65e, 0xbf7d, 0xbf70, 0x1a6b, 0xbaf8, 0x42f3, 0x1dac, 0xb2bf, 0x26b6, 0xba4a, 0x460b, 0x4390, 0x422d, 0x0a84, 0xb0d1, 0x43d7, 0x4022, 0xb0ee, 0x409e, 0xba72, 0x2a10, 0x429f, 0xbf70, 0x304b, 0xa8bc, 0xbf2c, 0x4288, 0x41cc, 0xbf28, 0xba26, 0x419b, 0x42af, 0x4357, 0xab5e, 0x4307, 0xbae7, 0x4449, 0x2dca, 0x46d9, 0xa4d7, 0x4384, 0xb0ae, 0x39ca, 0x4153, 0xba66, 0x43ae, 0xba2b, 0xbfe1, 0x189b, 0x4062, 0xbaf2, 0xba5c, 0xb041, 0x431f, 0x0f58, 0x4474, 0xbf19, 0x421c, 0x09c9, 0x0947, 0xb013, 0xba56, 0x3cdb, 0x43d0, 0xbf7a, 0x40d6, 0x079a, 0x030a, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x69b72ece, 0x9ea70faf, 0x0bef8eae, 0x8b8f6dd5, 0x4fde440e, 0x8c63dba4, 0xee0baa0f, 0xb2812116, 0x764ead9f, 0xda04bbb5, 0xc49fd907, 0xf371f841, 0xb64410f1, 0x71a52826, 0x00000000, 0x000001f0 }, - FinalRegs = new uint[] { 0xffffef27, 0x00002035, 0x00000000, 0x4e010000, 0x014dff25, 0x0000014e, 0x00000000, 0x00000000, 0xf371f841, 0xf371f841, 0x00000000, 0xf371f841, 0xa9b60932, 0x41f962cf, 0x00000000, 0xa00001d0 }, + Instructions = [0x43e9, 0xb2ae, 0x2b63, 0x4354, 0xbf91, 0xb23c, 0x4231, 0xb075, 0xb2fc, 0xba3a, 0x4162, 0x1cd2, 0x42af, 0x426e, 0x43fa, 0x0099, 0x1acc, 0x4434, 0x411d, 0x4624, 0xb25e, 0xbfc4, 0x1ef8, 0x45ac, 0x0b2d, 0xb2b0, 0x424d, 0x365f, 0x4336, 0xb0ac, 0x2a8b, 0xaa5c, 0x1bc1, 0x40ca, 0x18db, 0x3c16, 0x4181, 0x4348, 0x1cdf, 0x0413, 0xb2ad, 0xbfce, 0x1e96, 0x4304, 0x405b, 0x42ed, 0x1cea, 0x4159, 0x4057, 0x1c6b, 0x4256, 0x372b, 0x41d8, 0x4268, 0xa6ea, 0x430f, 0x1e36, 0x42bc, 0x40f5, 0xa28f, 0x1ae4, 0xb2a0, 0x4282, 0xa134, 0x4355, 0x42ba, 0x4395, 0x1faa, 0x154b, 0x434a, 0xbf6e, 0x43d1, 0xb2cd, 0x40b8, 0xbfe0, 0x0c97, 0x2541, 0x350e, 0x41c6, 0x40b5, 0x1e4d, 0x4048, 0x4657, 0x428a, 0x07dc, 0x42bb, 0x3923, 0x430d, 0x41a0, 0xbaed, 0xbf4e, 0x40ee, 0x0acb, 0x1f73, 0xbae9, 0xa18e, 0x41a8, 0x1947, 0x181b, 0x4248, 0x4349, 0xbf11, 0x1e48, 0x41d8, 0x18dc, 0x2073, 0xb20f, 0x41df, 0x41bf, 0x1ba3, 0xbf90, 0x4144, 0x428d, 0x41f9, 0x43b8, 0xb239, 0x4180, 0x432a, 0x4119, 0x46f8, 0x4329, 0x4091, 0x4302, 0xb228, 0x4094, 0x40b1, 0xbfcd, 0x2d26, 0x454f, 0x18a4, 0x42fb, 0x1b0e, 0x0d5a, 0x1ddb, 0x14c4, 0x43c2, 0xa374, 0x426b, 0xb0c9, 0x4262, 0xbf80, 0xbf8f, 0x46d3, 0x40cb, 0x4377, 0xb2b3, 0x3a47, 0xba60, 0xbfd9, 0xb267, 0x429a, 0x1806, 0x43d3, 0x3142, 0xb2be, 0x1487, 0x18ab, 0x1cd7, 0xba36, 0x1027, 0xb028, 0x1742, 0x435b, 0x4147, 0x2501, 0x41f0, 0xbadb, 0x40af, 0x444b, 0xb24c, 0xbae8, 0x40aa, 0xb2fe, 0xa75f, 0xbfcb, 0x4162, 0x4146, 0x4328, 0x2a69, 0x4247, 0x286e, 0x0b98, 0x24fb, 0xb061, 0x43a8, 0x409b, 0x1a0b, 0x41b6, 0x435a, 0xb244, 0x242e, 0xbad4, 0x0f4e, 0xbf0b, 0x4069, 0x273a, 0x4422, 0x4208, 0x4248, 0x43fa, 0x4406, 0xb2c1, 0x4046, 0x40bb, 0x4267, 0xb2b6, 0x03b8, 0xb2fd, 0x3dd7, 0xba6c, 0xb29b, 0xba17, 0x4109, 0x1b66, 0xb2df, 0xb005, 0x3496, 0x4598, 0xbf48, 0x40b2, 0x2979, 0x40d4, 0x4269, 0xb2ba, 0x3b3b, 0x408f, 0x336d, 0x1b00, 0x42c9, 0x2a70, 0xbf00, 0xaf87, 0x4386, 0x40c3, 0x4601, 0x461a, 0xbf90, 0xb217, 0x1d8e, 0x1c52, 0x42eb, 0x403f, 0xa25c, 0xa437, 0xbfcd, 0x19b1, 0x413f, 0x404a, 0x19f3, 0xbae3, 0x20a3, 0xbf4e, 0x3dd9, 0x4157, 0xb2ee, 0x29e2, 0xbad3, 0x42ab, 0x40af, 0xbf0d, 0xbaea, 0x43c8, 0xbae8, 0x0451, 0x424a, 0x1c6b, 0x400e, 0x4144, 0x3a3a, 0x412f, 0xbf04, 0x42df, 0x3821, 0x40ec, 0x433e, 0x4196, 0x43fd, 0x42e0, 0xb00f, 0x44dc, 0x2af8, 0x157c, 0x4316, 0xb095, 0xbf4b, 0x1a70, 0x1aaf, 0xb263, 0x41a3, 0x42ae, 0x44ba, 0x289a, 0xb293, 0x40d8, 0x3bc3, 0x42a1, 0x41e8, 0xbaf7, 0x403d, 0x418d, 0x42cf, 0xb023, 0xb05c, 0x4029, 0x40e4, 0x4209, 0x40fc, 0x108c, 0x40d5, 0xbf14, 0xb0e2, 0x425c, 0x4220, 0x244c, 0x0736, 0x1d18, 0x401d, 0x40ac, 0x4045, 0x4051, 0xaf3a, 0xbaef, 0x4451, 0x439a, 0x43ba, 0x406b, 0x1daf, 0x409e, 0x44ad, 0xb09c, 0x4087, 0x205e, 0x4540, 0x40fc, 0xb27d, 0xbf7a, 0x28c4, 0x42c5, 0x4178, 0x42eb, 0x40d3, 0xb273, 0x45f3, 0x401b, 0x43ca, 0x43f4, 0x43d1, 0xaed9, 0xba70, 0x41c3, 0x11e8, 0x41bb, 0x40e2, 0x41c0, 0xa5a2, 0x09c4, 0xbfc0, 0x43aa, 0x388c, 0x411e, 0x189f, 0xbf81, 0x4339, 0x1f88, 0x1b87, 0xa26a, 0xbf0a, 0x4366, 0x415a, 0x42ac, 0x41bc, 0xbf60, 0xba4b, 0xba12, 0x41b7, 0x413d, 0xb02f, 0x4235, 0x0548, 0x0509, 0x41de, 0x42c6, 0x16c5, 0x3d8d, 0xbf0d, 0x2de3, 0x40b7, 0x417f, 0x40f6, 0xa413, 0x4232, 0xba60, 0x4126, 0x4044, 0x1bd0, 0x2d4b, 0x20bd, 0xb215, 0x40d9, 0x415c, 0xbf08, 0x1d75, 0x1e01, 0x411c, 0x0b49, 0x410e, 0xbfcf, 0x1455, 0x0ee7, 0x05cd, 0x4394, 0xb2b1, 0x432c, 0x25fb, 0x4671, 0x4053, 0x3e48, 0x0be7, 0x405f, 0x4276, 0x41f6, 0x440e, 0x40f6, 0x435a, 0x41a5, 0xb2ef, 0x3d3f, 0x443a, 0x332a, 0xb00d, 0x4432, 0x1d1c, 0x428e, 0x4296, 0x42ef, 0xbfaf, 0x4062, 0x1918, 0x08bd, 0x4241, 0xba2f, 0x40b9, 0x1e32, 0x42be, 0x2983, 0xbf99, 0x402b, 0x423e, 0x41e5, 0x403a, 0xbf70, 0x41d1, 0x42cf, 0x434f, 0x41ea, 0x1dd7, 0x418c, 0x418f, 0xb248, 0x1e0f, 0x2ec4, 0x42f5, 0x40e2, 0x4330, 0x4118, 0xad76, 0xb089, 0x41b9, 0x40de, 0x42fa, 0xba54, 0xb2c6, 0xbf09, 0x4102, 0x41e7, 0xb08b, 0x41bd, 0x1dbf, 0x4140, 0x4009, 0x42fc, 0x46db, 0xbad8, 0x45ae, 0x40e0, 0x4212, 0x43fd, 0x43cb, 0x435f, 0x4276, 0x15a5, 0xb222, 0x409b, 0x40cb, 0xbf48, 0xad26, 0x40e7, 0x3491, 0x36b5, 0xbfa6, 0x4192, 0x43e1, 0x430d, 0xb28b, 0xaa14, 0x42eb, 0x4492, 0x41a8, 0xa8d2, 0x436e, 0x41c9, 0x4211, 0x42cf, 0x0d26, 0x41ea, 0x40bd, 0x0f79, 0x40d2, 0x394c, 0x4072, 0x40c9, 0xbf84, 0xb278, 0x2591, 0x43a9, 0x13e4, 0xb287, 0x02ad, 0x3290, 0x43ec, 0x4141, 0x431a, 0x46a9, 0x4629, 0x2e09, 0x1a14, 0x41f5, 0xba19, 0x35d8, 0x2c4a, 0x43dc, 0xb28e, 0x40b7, 0x41db, 0x41fe, 0x2f4d, 0xbfe8, 0x4459, 0x46d8, 0x42c5, 0x1d4f, 0x1a9e, 0x4203, 0x42b2, 0x4299, 0x428d, 0xbf29, 0x4129, 0xb223, 0x427a, 0x41c5, 0x089e, 0xad9a, 0xb24c, 0x1f2a, 0xb023, 0xb291, 0x42b3, 0xb07a, 0x1e3c, 0xa3d6, 0x4194, 0xbaf7, 0x370e, 0x1faa, 0x197f, 0x409e, 0x19c8, 0x4616, 0xbf7a, 0x42a2, 0x437e, 0xba3e, 0x4312, 0x428a, 0x418a, 0x433b, 0x03d8, 0x0250, 0xb29a, 0x1dd0, 0x33c0, 0x4334, 0xb0fd, 0xbfa0, 0xb279, 0x4067, 0x405b, 0xb23e, 0x2224, 0x4375, 0x2e15, 0x406f, 0x43b4, 0xbf94, 0xba6d, 0x04eb, 0x42f4, 0x42d7, 0x4184, 0x40cb, 0x40c5, 0x422d, 0x19c7, 0x415e, 0x426f, 0x4124, 0xb2e7, 0xa9a4, 0x40ed, 0x412f, 0x43c9, 0x3ca8, 0x1b05, 0x32fc, 0x4276, 0x4037, 0x447f, 0x40c3, 0xb267, 0xbf81, 0x43bb, 0xb243, 0x4570, 0x2b22, 0x0e9c, 0x4063, 0x1bea, 0x4055, 0x2367, 0xba35, 0x1e69, 0x0926, 0x44f5, 0xb00b, 0x18f8, 0x4007, 0xb255, 0x4350, 0xb0a5, 0x4095, 0xba26, 0xa26b, 0x14b9, 0x4346, 0xbfae, 0x4312, 0x4446, 0xbf80, 0xa9c8, 0xba7d, 0x410a, 0xbfa2, 0x2319, 0xb282, 0x4185, 0x425f, 0x41c1, 0x409c, 0x1a10, 0x1003, 0x284b, 0xbae6, 0xb221, 0xb242, 0x4262, 0xbad8, 0xbafe, 0xaa78, 0x4223, 0x41d8, 0xb0f9, 0x4091, 0x445c, 0x321e, 0x42c1, 0x4023, 0x411a, 0x438f, 0x43fd, 0xbf29, 0x434f, 0xa7a0, 0x1d7a, 0x40f0, 0xba4f, 0x2879, 0x4093, 0xa50b, 0x42b5, 0xb289, 0x43dd, 0xb014, 0xba26, 0x0450, 0x413b, 0x1828, 0xba63, 0x4156, 0x292f, 0x428f, 0xb053, 0xbf68, 0x42c4, 0x059b, 0x14ec, 0x4207, 0x43c8, 0x43b7, 0xba72, 0xb297, 0x1ab9, 0x1525, 0x416d, 0x420c, 0x446b, 0xb205, 0x466b, 0x416f, 0x19c5, 0x4351, 0x22d5, 0x4670, 0xb06b, 0x0374, 0x066b, 0xbfb9, 0x0c25, 0xabee, 0x4143, 0x41f2, 0x181b, 0x42f7, 0x40ab, 0x4130, 0xba4a, 0x1a6d, 0xba02, 0x4165, 0xbf60, 0x417e, 0x340c, 0xba72, 0xbaff, 0x3ddc, 0xbf35, 0x415a, 0x4011, 0x42cb, 0x437c, 0x3d03, 0x41d4, 0x1855, 0x0b24, 0xa86b, 0x41ef, 0xb262, 0x41a4, 0xb272, 0x43a4, 0x030c, 0x4365, 0xbf52, 0x46b5, 0x464d, 0x42b3, 0x1b6e, 0xba3d, 0x20f7, 0x35dc, 0x2ee9, 0xbf4e, 0x4378, 0xaf6a, 0x142e, 0xb290, 0x42d9, 0x40d8, 0xb069, 0x1fb9, 0x430a, 0x0594, 0x4231, 0xbafd, 0x3a53, 0xb2b1, 0xb0e0, 0x001d, 0xa85d, 0x17cd, 0x42b5, 0x4330, 0xb012, 0xbacd, 0x0ed9, 0xbf86, 0xba22, 0x4068, 0x263e, 0x0048, 0xb2a4, 0xba4a, 0xbf3a, 0x4224, 0x426e, 0x0a8d, 0xa5f2, 0x14f4, 0x4164, 0x1e8e, 0x324b, 0xba1c, 0x40ed, 0x4108, 0x170d, 0x30b8, 0x04a7, 0xb073, 0x2d88, 0x4171, 0x1b68, 0xbfa4, 0x40fe, 0xbac1, 0xba57, 0xb2ce, 0x330f, 0x2614, 0x070e, 0xb0c2, 0x4244, 0xad7d, 0x06ac, 0xa5ef, 0x0d63, 0x42aa, 0xb2df, 0xb2ce, 0x42d1, 0x2ea4, 0xbf4d, 0x4185, 0x41bb, 0x45e1, 0x326c, 0x42ea, 0x443c, 0xb219, 0x41a7, 0xbf31, 0x42af, 0x43f5, 0x4137, 0x1efb, 0x4175, 0x40fa, 0x4340, 0x40f0, 0x4342, 0x43f6, 0xbafe, 0x17c7, 0xbfcc, 0x4485, 0x43e3, 0x4085, 0x4003, 0x4187, 0x07dd, 0x3c2d, 0x1acf, 0x40a2, 0xbae2, 0x417c, 0xbfe0, 0x198c, 0xbf8c, 0x1a73, 0xbafc, 0x2c1d, 0x0cf6, 0x43a9, 0x403d, 0xbf34, 0x4297, 0xb000, 0xb27b, 0xab7d, 0x05c9, 0xb245, 0x4326, 0x426d, 0x4226, 0x42df, 0xb0d8, 0x46f2, 0x43ca, 0x4096, 0x283c, 0x4406, 0x41bc, 0xbf6d, 0x433b, 0x458b, 0x41be, 0xb019, 0x4029, 0x4167, 0x42a1, 0x4024, 0xbaf1, 0xb26c, 0x1e3d, 0xb292, 0x41ea, 0x241b, 0x4024, 0x1aec, 0x431e, 0x4606, 0x4209, 0x356f, 0x4308, 0xa65e, 0xbf7d, 0xbf70, 0x1a6b, 0xbaf8, 0x42f3, 0x1dac, 0xb2bf, 0x26b6, 0xba4a, 0x460b, 0x4390, 0x422d, 0x0a84, 0xb0d1, 0x43d7, 0x4022, 0xb0ee, 0x409e, 0xba72, 0x2a10, 0x429f, 0xbf70, 0x304b, 0xa8bc, 0xbf2c, 0x4288, 0x41cc, 0xbf28, 0xba26, 0x419b, 0x42af, 0x4357, 0xab5e, 0x4307, 0xbae7, 0x4449, 0x2dca, 0x46d9, 0xa4d7, 0x4384, 0xb0ae, 0x39ca, 0x4153, 0xba66, 0x43ae, 0xba2b, 0xbfe1, 0x189b, 0x4062, 0xbaf2, 0xba5c, 0xb041, 0x431f, 0x0f58, 0x4474, 0xbf19, 0x421c, 0x09c9, 0x0947, 0xb013, 0xba56, 0x3cdb, 0x43d0, 0xbf7a, 0x40d6, 0x079a, 0x030a, 0x4770, 0xe7fe + ], + StartRegs = [0x69b72ece, 0x9ea70faf, 0x0bef8eae, 0x8b8f6dd5, 0x4fde440e, 0x8c63dba4, 0xee0baa0f, 0xb2812116, 0x764ead9f, 0xda04bbb5, 0xc49fd907, 0xf371f841, 0xb64410f1, 0x71a52826, 0x00000000, 0x000001f0 + ], + FinalRegs = [0xffffef27, 0x00002035, 0x00000000, 0x4e010000, 0x014dff25, 0x0000014e, 0x00000000, 0x00000000, 0xf371f841, 0xf371f841, 0x00000000, 0xf371f841, 0xa9b60932, 0x41f962cf, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x40c2, 0x4026, 0x4391, 0x4114, 0x43fc, 0x4369, 0x4099, 0x0707, 0xbfe0, 0xbf8f, 0x3fa9, 0x4220, 0x1d09, 0x4261, 0xba25, 0xb018, 0x2131, 0x41ab, 0x404f, 0x4031, 0xbaf3, 0xb2b6, 0x1e5f, 0x4202, 0x1b23, 0x42e2, 0x2214, 0x4247, 0xba0a, 0x4146, 0xbf5f, 0x0974, 0xa6cd, 0x1ecc, 0x41a9, 0x403b, 0x4312, 0xb08f, 0x4074, 0x4191, 0x4381, 0x404f, 0x45a0, 0xb2e0, 0x0258, 0x1eb3, 0x057e, 0x444f, 0x259e, 0xbfc7, 0x1e86, 0xb080, 0x43cd, 0x1c81, 0x41cb, 0xba3f, 0x423a, 0x4627, 0x4040, 0x32a8, 0x3811, 0x463d, 0x284f, 0x0180, 0xb29e, 0x2fcb, 0x18ee, 0xba4b, 0x4239, 0xba51, 0x42b7, 0xbad0, 0x429c, 0xbf2c, 0x438a, 0x41aa, 0x0bf1, 0x23b2, 0x4393, 0xb27f, 0xafd2, 0xb233, 0x4434, 0x2e78, 0x41f2, 0xbfac, 0xb27e, 0x1ace, 0x40b0, 0x45d2, 0x400e, 0x1fed, 0xb071, 0x239f, 0x4171, 0x18f1, 0xa24f, 0xb2b1, 0x421b, 0x0b5c, 0x464b, 0xba55, 0x424a, 0x4541, 0xbf90, 0x440d, 0xb2de, 0x42a9, 0xb05b, 0xbfce, 0x431a, 0x465b, 0x1108, 0x411b, 0xbafd, 0x4141, 0x40fd, 0x174d, 0x46a8, 0xba6f, 0x2829, 0x0e03, 0x19ed, 0x26d3, 0x4379, 0x40a2, 0xb21b, 0x40bc, 0x185d, 0x4352, 0xb09a, 0xb280, 0x40ae, 0x42a9, 0x4218, 0xba0a, 0x1aa9, 0xbf86, 0xaf41, 0x40df, 0xb2f9, 0x429a, 0xa93c, 0x26b5, 0x22a0, 0xa0ec, 0x1def, 0xb2ea, 0xb231, 0x437b, 0xab30, 0x41ee, 0x1f12, 0x423f, 0x43b6, 0x4218, 0xb0e1, 0x40b9, 0x4175, 0x41aa, 0xbf9f, 0xb04a, 0xb28d, 0xba0e, 0x40f5, 0x1bda, 0x4460, 0x45ce, 0xb253, 0x1fbc, 0x2b3b, 0xb054, 0x216b, 0x1ef5, 0xb239, 0x4117, 0x3e6a, 0x1c59, 0xb212, 0x1e71, 0x435d, 0xb0f6, 0x40af, 0x426f, 0xb267, 0xbfac, 0xb29a, 0x4231, 0x1064, 0xb2bf, 0x42ee, 0xbf90, 0x4194, 0xb2cf, 0x4029, 0x1651, 0x43f7, 0x4091, 0xa737, 0x1c29, 0x36ec, 0x2620, 0x4664, 0xb210, 0x4630, 0xaa7e, 0x4254, 0x4571, 0xbf04, 0x41ad, 0x40b9, 0x407d, 0x06a0, 0xb29d, 0x43af, 0xb2b2, 0xbafc, 0xb2bc, 0xb278, 0xb235, 0x40d5, 0x1e08, 0x3d80, 0x42f6, 0xb01d, 0x4383, 0x08db, 0x428b, 0x43d1, 0x1835, 0x1efa, 0x221b, 0xb057, 0x4051, 0x0216, 0xbfb5, 0xad04, 0x424a, 0x42b2, 0x427a, 0xa99f, 0x2987, 0xb2a1, 0x0a0e, 0xb2d1, 0xbf97, 0x41b9, 0x41d7, 0x18b3, 0x1e5f, 0x3969, 0x323f, 0x1a8e, 0x4643, 0x46e1, 0x4005, 0x435e, 0x4353, 0x35c5, 0x41af, 0x43c6, 0xbaf6, 0x05c4, 0xba7f, 0x41dc, 0x464f, 0x454e, 0xbfe1, 0x3f23, 0x46e4, 0x42e1, 0xb26b, 0x1fe7, 0x44a3, 0x22da, 0x02a8, 0x4366, 0x0239, 0xb2ba, 0x431e, 0x4267, 0xba59, 0x2155, 0x41ff, 0x43b6, 0x4112, 0xb289, 0xb28d, 0xa0b5, 0x415d, 0x4234, 0xbf81, 0x442b, 0x3b05, 0x4359, 0xb2f1, 0xad7d, 0xb2c7, 0x411f, 0x414b, 0x1ce1, 0x41dc, 0xb2ed, 0x4580, 0xba56, 0xb259, 0x407a, 0x1c86, 0xba38, 0x422a, 0x40c4, 0xbf81, 0x411b, 0x1dd0, 0x1eba, 0x3194, 0x3435, 0xb225, 0x43a8, 0x1b6d, 0x231b, 0xbf7d, 0x46ab, 0xb2ed, 0xb0f3, 0xb254, 0xb0e0, 0x41f3, 0x2773, 0x1869, 0x40c3, 0xb25f, 0x1820, 0xbf97, 0x3435, 0x41d2, 0xb2f2, 0x1c37, 0x176a, 0x425f, 0x43f8, 0x400b, 0x23a7, 0xb09a, 0xbff0, 0x414d, 0x4221, 0x283e, 0x43bd, 0x41b9, 0xbaeb, 0x3c41, 0x2790, 0x0b0a, 0xb2e4, 0x1fca, 0xbf80, 0xb0f0, 0xbac8, 0xbfc0, 0xbf7c, 0xba70, 0x41d4, 0x4655, 0x22f4, 0x40bc, 0x4223, 0x42e7, 0x39e7, 0x437c, 0xa249, 0x0634, 0x1fac, 0x413f, 0x2aa4, 0xa70a, 0x4651, 0x424e, 0x4074, 0xbfca, 0x405f, 0x1201, 0xba3f, 0x40ee, 0x40d4, 0x46ac, 0xa9d0, 0x1dc7, 0x41b3, 0x1d14, 0x41c8, 0x332d, 0xb2be, 0x4290, 0x4625, 0xa891, 0xbf70, 0x4335, 0xbf38, 0x42bc, 0xac43, 0x4180, 0x4357, 0x41c2, 0x3ce3, 0x368c, 0x414b, 0x40d4, 0x40a4, 0x4072, 0xbadd, 0x436c, 0x4102, 0x34c9, 0x4430, 0x43e2, 0x407d, 0x018e, 0xa86d, 0x431e, 0x4072, 0xbf74, 0x4271, 0xba6f, 0x4333, 0x180b, 0xb2c8, 0x18ca, 0x40a4, 0x2445, 0xaf56, 0x43a6, 0x438d, 0x41b5, 0xb20a, 0xb0ec, 0x410c, 0x012a, 0x40d4, 0x43e2, 0x40c9, 0x41ce, 0xb2c3, 0xba5e, 0xbf95, 0x4135, 0x1f74, 0x4107, 0x46e4, 0xbfd8, 0x42ed, 0x0c9a, 0x0919, 0x43f9, 0xbfc4, 0x4035, 0x0f3f, 0xbac2, 0xab07, 0x2db8, 0x0c01, 0x4012, 0x1ef4, 0xaae2, 0xb02a, 0xbaf4, 0xbfbc, 0x41d3, 0x4416, 0x40c7, 0x44e4, 0xb2c9, 0x40fa, 0x38e7, 0x42da, 0xba4a, 0x4145, 0x3e87, 0xb018, 0x42d3, 0x07f6, 0x42ec, 0xb2b7, 0x4379, 0xb060, 0xba0d, 0x40ff, 0x2f57, 0xba5b, 0x4263, 0xbf8b, 0x426a, 0x42e1, 0x41b0, 0x461c, 0x438c, 0x33c7, 0x43ef, 0x46b8, 0x1dd3, 0xb233, 0xbf1f, 0x439e, 0x4459, 0x4411, 0xbfd0, 0xab1b, 0xb067, 0xb277, 0x01d0, 0x415b, 0x416e, 0xb20e, 0x4309, 0x423b, 0x0763, 0xbf7e, 0xb04d, 0xb2b9, 0x1c91, 0x4399, 0x4341, 0xba55, 0x40ae, 0xb288, 0xb06e, 0xb2a7, 0x4095, 0x44e8, 0x19a4, 0x42d0, 0x4318, 0xb063, 0x41c6, 0xb284, 0x415f, 0xba44, 0x3c51, 0x4388, 0xb0d2, 0x433a, 0x418e, 0x430b, 0x40bb, 0x4075, 0xbf96, 0x4191, 0xba78, 0x4380, 0x402f, 0xbaec, 0x45da, 0xa7ba, 0xb280, 0x42cd, 0x0e15, 0xbfc0, 0x4292, 0x46c9, 0x44ad, 0xb280, 0x4246, 0xb262, 0xb247, 0x4082, 0x402b, 0xb230, 0xba1b, 0xb077, 0x41f3, 0xbf0c, 0x1901, 0xb016, 0x1edf, 0x3519, 0x4058, 0x418b, 0x42bb, 0xbfd0, 0x014d, 0x43dd, 0xbf52, 0x1b22, 0x434a, 0x41f1, 0x4181, 0xa9a5, 0xb20d, 0xb0cb, 0xbf42, 0x3727, 0xb271, 0x4088, 0xabfb, 0xbf61, 0x1ab9, 0x0344, 0x40cd, 0x41d4, 0x1f44, 0x43b7, 0x298e, 0xbf72, 0x1c94, 0xb0ed, 0x2b19, 0x4427, 0x4337, 0x40c3, 0x3601, 0x19a2, 0x414d, 0x18c7, 0x4006, 0x4313, 0x4253, 0x1d49, 0xbf94, 0xba13, 0xa1dc, 0xb2d7, 0x0b0b, 0x41c8, 0x41b5, 0x1b21, 0x3242, 0x1d53, 0x3ac5, 0xb0ec, 0xba22, 0xa9c9, 0x40ef, 0x4027, 0xb0bf, 0xb00f, 0x211f, 0xb018, 0x1fb8, 0x14c1, 0x410c, 0x4081, 0x4604, 0x3ab7, 0xb20f, 0x4301, 0xbf54, 0x42dc, 0x1861, 0x41bf, 0x405e, 0x1dbd, 0x17ce, 0x46e1, 0x4287, 0xa83c, 0x3e4d, 0xb03a, 0xb2bb, 0x41cd, 0x40a4, 0x430e, 0xb288, 0xb25d, 0x4312, 0xb0de, 0x18b3, 0xb2c9, 0x08aa, 0xba4f, 0xbf61, 0x42aa, 0xb249, 0x2856, 0xa13d, 0x4092, 0x424b, 0x2284, 0xb206, 0x40c5, 0x2801, 0x443b, 0x43df, 0x0c18, 0xbf35, 0x42f2, 0x4031, 0x4048, 0xb225, 0x4215, 0x449c, 0x1ecf, 0x43fd, 0x421a, 0x4584, 0xb03e, 0x2473, 0x16d8, 0x42c8, 0x44db, 0x43bb, 0xba55, 0xba18, 0xb06e, 0x1a1d, 0xb281, 0x23c5, 0xbf72, 0x4288, 0x176a, 0x431a, 0x4392, 0xb0d3, 0x43d6, 0x0263, 0x43e7, 0xbfde, 0x0aab, 0x22c9, 0x4203, 0xba25, 0xb2ed, 0x0d84, 0x3b27, 0x17d9, 0x1c5e, 0xb027, 0x19d8, 0xb22d, 0x4284, 0xada7, 0x44c3, 0x431d, 0x1549, 0xb293, 0xb20b, 0xbaf3, 0x419b, 0x2a68, 0x3d99, 0xbf3f, 0x411d, 0xb2c7, 0x4346, 0x1ea1, 0xbf22, 0x1c0c, 0x16ab, 0x1a2e, 0xb0c8, 0x4253, 0x432b, 0xa1c3, 0xbadb, 0x408b, 0x4339, 0x064c, 0x43be, 0x421d, 0x439c, 0x4042, 0x4197, 0x11d2, 0xbf18, 0xbad3, 0x1e4a, 0x4239, 0x2672, 0xb267, 0xa0f4, 0x4240, 0xba29, 0x42a2, 0x4225, 0xbf73, 0x4263, 0x0e6d, 0x43a7, 0x1be0, 0x4460, 0xba4b, 0x42ad, 0x406a, 0x4002, 0x40c9, 0x41e8, 0xb237, 0x4281, 0x4378, 0x4473, 0xb297, 0x3829, 0xbf60, 0x4110, 0x426d, 0x1b20, 0x1ade, 0xbac1, 0x4227, 0xb216, 0x41ed, 0x430d, 0xbf46, 0x4200, 0xb22b, 0x46ed, 0x1496, 0x180b, 0x3e53, 0x4601, 0x4404, 0xbf37, 0x42a3, 0x24ec, 0x3704, 0x2ead, 0xb041, 0xb239, 0xb0f5, 0x418b, 0xbaef, 0xba37, 0x413c, 0x4076, 0xbada, 0x35ef, 0x40cf, 0xbf8b, 0x4379, 0x3548, 0x1edb, 0x41ea, 0x1d56, 0xba6a, 0xba46, 0xb0ac, 0x33d6, 0x40e1, 0x21ce, 0xbf8f, 0xba17, 0xb257, 0xba54, 0xba5f, 0x26c7, 0x40fc, 0x4283, 0xbf04, 0xb280, 0x43de, 0x1eed, 0x3a39, 0x401d, 0x4310, 0xba5b, 0x4656, 0x404c, 0xbfd9, 0x465b, 0xba4b, 0x4656, 0x438a, 0x4347, 0xa967, 0x4049, 0x41c0, 0x1930, 0xb040, 0x433f, 0x1c50, 0xbf54, 0x41bf, 0x4027, 0xbf03, 0xb0dd, 0x42b3, 0x435a, 0xb292, 0x404c, 0xb290, 0xba28, 0x400b, 0x4092, 0x406e, 0x4318, 0x442c, 0x0c48, 0xa5ad, 0x4148, 0x424d, 0x4279, 0x40b1, 0x4331, 0xb27b, 0xb049, 0x1cae, 0x45ab, 0x4319, 0xb06e, 0x40b7, 0xbf1c, 0x4484, 0x1ce2, 0x439b, 0x41d4, 0xb28f, 0x4038, 0x45c1, 0xaf03, 0xa786, 0x409e, 0x0b05, 0x1295, 0x3ba6, 0xa9df, 0x42df, 0xba11, 0xb2d0, 0xba4e, 0xbf38, 0x43a1, 0x3a98, 0x4163, 0x41e4, 0x40e0, 0x4619, 0x4259, 0x1b6a, 0xbf81, 0x396c, 0x3ebc, 0xb2e6, 0xad08, 0x4350, 0x13f0, 0x1898, 0x1f15, 0xbfaa, 0x4335, 0x321b, 0x4189, 0x40b1, 0x0a31, 0xbfa3, 0x3fc0, 0x2d58, 0x43ad, 0xa85a, 0x40af, 0x423d, 0x02b8, 0x1dfe, 0xbac5, 0x4342, 0x40e1, 0x41fb, 0xab7c, 0x28a1, 0x4219, 0x098d, 0x4085, 0xb20e, 0x2e27, 0x0b99, 0x4403, 0xb2c0, 0x405d, 0xb0bc, 0xb0cb, 0xbf98, 0x42c0, 0xb207, 0xb250, 0x40d5, 0x19ff, 0xb2bb, 0x42cc, 0x42d6, 0xae29, 0xba31, 0xbfdd, 0x3003, 0x0f3d, 0xb091, 0xba54, 0x41ed, 0x40e3, 0x20e4, 0xb012, 0xb2c2, 0x409d, 0xb28e, 0x080e, 0xaedd, 0x06d2, 0xb226, 0x4160, 0x4059, 0xb229, 0x040c, 0x4223, 0x422f, 0x3772, 0xb2b6, 0x417e, 0xb21b, 0xbacb, 0xb2d4, 0x2fb1, 0x45e2, 0xbfc9, 0x41f2, 0x42c9, 0x0d4f, 0x4300, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x82916b79, 0x515ecb9e, 0x9eeb80a7, 0x4448bdb6, 0x9fbc4379, 0x7f419a33, 0x42be67d1, 0x712a0dae, 0x4382a2e5, 0x7d2ed79f, 0xe8c9993b, 0x9fd1abb1, 0xed4e4991, 0xf7cf8b5c, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0xa000b5cd, 0x00000000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0x0000b55a, 0x00000000, 0xf7cf8df7, 0xd1933276, 0xe8c9993b, 0xf7cf8df7, 0xd1942582, 0xf7cf8df0, 0x00000000, 0x200001d0 }, + Instructions = [0x40c2, 0x4026, 0x4391, 0x4114, 0x43fc, 0x4369, 0x4099, 0x0707, 0xbfe0, 0xbf8f, 0x3fa9, 0x4220, 0x1d09, 0x4261, 0xba25, 0xb018, 0x2131, 0x41ab, 0x404f, 0x4031, 0xbaf3, 0xb2b6, 0x1e5f, 0x4202, 0x1b23, 0x42e2, 0x2214, 0x4247, 0xba0a, 0x4146, 0xbf5f, 0x0974, 0xa6cd, 0x1ecc, 0x41a9, 0x403b, 0x4312, 0xb08f, 0x4074, 0x4191, 0x4381, 0x404f, 0x45a0, 0xb2e0, 0x0258, 0x1eb3, 0x057e, 0x444f, 0x259e, 0xbfc7, 0x1e86, 0xb080, 0x43cd, 0x1c81, 0x41cb, 0xba3f, 0x423a, 0x4627, 0x4040, 0x32a8, 0x3811, 0x463d, 0x284f, 0x0180, 0xb29e, 0x2fcb, 0x18ee, 0xba4b, 0x4239, 0xba51, 0x42b7, 0xbad0, 0x429c, 0xbf2c, 0x438a, 0x41aa, 0x0bf1, 0x23b2, 0x4393, 0xb27f, 0xafd2, 0xb233, 0x4434, 0x2e78, 0x41f2, 0xbfac, 0xb27e, 0x1ace, 0x40b0, 0x45d2, 0x400e, 0x1fed, 0xb071, 0x239f, 0x4171, 0x18f1, 0xa24f, 0xb2b1, 0x421b, 0x0b5c, 0x464b, 0xba55, 0x424a, 0x4541, 0xbf90, 0x440d, 0xb2de, 0x42a9, 0xb05b, 0xbfce, 0x431a, 0x465b, 0x1108, 0x411b, 0xbafd, 0x4141, 0x40fd, 0x174d, 0x46a8, 0xba6f, 0x2829, 0x0e03, 0x19ed, 0x26d3, 0x4379, 0x40a2, 0xb21b, 0x40bc, 0x185d, 0x4352, 0xb09a, 0xb280, 0x40ae, 0x42a9, 0x4218, 0xba0a, 0x1aa9, 0xbf86, 0xaf41, 0x40df, 0xb2f9, 0x429a, 0xa93c, 0x26b5, 0x22a0, 0xa0ec, 0x1def, 0xb2ea, 0xb231, 0x437b, 0xab30, 0x41ee, 0x1f12, 0x423f, 0x43b6, 0x4218, 0xb0e1, 0x40b9, 0x4175, 0x41aa, 0xbf9f, 0xb04a, 0xb28d, 0xba0e, 0x40f5, 0x1bda, 0x4460, 0x45ce, 0xb253, 0x1fbc, 0x2b3b, 0xb054, 0x216b, 0x1ef5, 0xb239, 0x4117, 0x3e6a, 0x1c59, 0xb212, 0x1e71, 0x435d, 0xb0f6, 0x40af, 0x426f, 0xb267, 0xbfac, 0xb29a, 0x4231, 0x1064, 0xb2bf, 0x42ee, 0xbf90, 0x4194, 0xb2cf, 0x4029, 0x1651, 0x43f7, 0x4091, 0xa737, 0x1c29, 0x36ec, 0x2620, 0x4664, 0xb210, 0x4630, 0xaa7e, 0x4254, 0x4571, 0xbf04, 0x41ad, 0x40b9, 0x407d, 0x06a0, 0xb29d, 0x43af, 0xb2b2, 0xbafc, 0xb2bc, 0xb278, 0xb235, 0x40d5, 0x1e08, 0x3d80, 0x42f6, 0xb01d, 0x4383, 0x08db, 0x428b, 0x43d1, 0x1835, 0x1efa, 0x221b, 0xb057, 0x4051, 0x0216, 0xbfb5, 0xad04, 0x424a, 0x42b2, 0x427a, 0xa99f, 0x2987, 0xb2a1, 0x0a0e, 0xb2d1, 0xbf97, 0x41b9, 0x41d7, 0x18b3, 0x1e5f, 0x3969, 0x323f, 0x1a8e, 0x4643, 0x46e1, 0x4005, 0x435e, 0x4353, 0x35c5, 0x41af, 0x43c6, 0xbaf6, 0x05c4, 0xba7f, 0x41dc, 0x464f, 0x454e, 0xbfe1, 0x3f23, 0x46e4, 0x42e1, 0xb26b, 0x1fe7, 0x44a3, 0x22da, 0x02a8, 0x4366, 0x0239, 0xb2ba, 0x431e, 0x4267, 0xba59, 0x2155, 0x41ff, 0x43b6, 0x4112, 0xb289, 0xb28d, 0xa0b5, 0x415d, 0x4234, 0xbf81, 0x442b, 0x3b05, 0x4359, 0xb2f1, 0xad7d, 0xb2c7, 0x411f, 0x414b, 0x1ce1, 0x41dc, 0xb2ed, 0x4580, 0xba56, 0xb259, 0x407a, 0x1c86, 0xba38, 0x422a, 0x40c4, 0xbf81, 0x411b, 0x1dd0, 0x1eba, 0x3194, 0x3435, 0xb225, 0x43a8, 0x1b6d, 0x231b, 0xbf7d, 0x46ab, 0xb2ed, 0xb0f3, 0xb254, 0xb0e0, 0x41f3, 0x2773, 0x1869, 0x40c3, 0xb25f, 0x1820, 0xbf97, 0x3435, 0x41d2, 0xb2f2, 0x1c37, 0x176a, 0x425f, 0x43f8, 0x400b, 0x23a7, 0xb09a, 0xbff0, 0x414d, 0x4221, 0x283e, 0x43bd, 0x41b9, 0xbaeb, 0x3c41, 0x2790, 0x0b0a, 0xb2e4, 0x1fca, 0xbf80, 0xb0f0, 0xbac8, 0xbfc0, 0xbf7c, 0xba70, 0x41d4, 0x4655, 0x22f4, 0x40bc, 0x4223, 0x42e7, 0x39e7, 0x437c, 0xa249, 0x0634, 0x1fac, 0x413f, 0x2aa4, 0xa70a, 0x4651, 0x424e, 0x4074, 0xbfca, 0x405f, 0x1201, 0xba3f, 0x40ee, 0x40d4, 0x46ac, 0xa9d0, 0x1dc7, 0x41b3, 0x1d14, 0x41c8, 0x332d, 0xb2be, 0x4290, 0x4625, 0xa891, 0xbf70, 0x4335, 0xbf38, 0x42bc, 0xac43, 0x4180, 0x4357, 0x41c2, 0x3ce3, 0x368c, 0x414b, 0x40d4, 0x40a4, 0x4072, 0xbadd, 0x436c, 0x4102, 0x34c9, 0x4430, 0x43e2, 0x407d, 0x018e, 0xa86d, 0x431e, 0x4072, 0xbf74, 0x4271, 0xba6f, 0x4333, 0x180b, 0xb2c8, 0x18ca, 0x40a4, 0x2445, 0xaf56, 0x43a6, 0x438d, 0x41b5, 0xb20a, 0xb0ec, 0x410c, 0x012a, 0x40d4, 0x43e2, 0x40c9, 0x41ce, 0xb2c3, 0xba5e, 0xbf95, 0x4135, 0x1f74, 0x4107, 0x46e4, 0xbfd8, 0x42ed, 0x0c9a, 0x0919, 0x43f9, 0xbfc4, 0x4035, 0x0f3f, 0xbac2, 0xab07, 0x2db8, 0x0c01, 0x4012, 0x1ef4, 0xaae2, 0xb02a, 0xbaf4, 0xbfbc, 0x41d3, 0x4416, 0x40c7, 0x44e4, 0xb2c9, 0x40fa, 0x38e7, 0x42da, 0xba4a, 0x4145, 0x3e87, 0xb018, 0x42d3, 0x07f6, 0x42ec, 0xb2b7, 0x4379, 0xb060, 0xba0d, 0x40ff, 0x2f57, 0xba5b, 0x4263, 0xbf8b, 0x426a, 0x42e1, 0x41b0, 0x461c, 0x438c, 0x33c7, 0x43ef, 0x46b8, 0x1dd3, 0xb233, 0xbf1f, 0x439e, 0x4459, 0x4411, 0xbfd0, 0xab1b, 0xb067, 0xb277, 0x01d0, 0x415b, 0x416e, 0xb20e, 0x4309, 0x423b, 0x0763, 0xbf7e, 0xb04d, 0xb2b9, 0x1c91, 0x4399, 0x4341, 0xba55, 0x40ae, 0xb288, 0xb06e, 0xb2a7, 0x4095, 0x44e8, 0x19a4, 0x42d0, 0x4318, 0xb063, 0x41c6, 0xb284, 0x415f, 0xba44, 0x3c51, 0x4388, 0xb0d2, 0x433a, 0x418e, 0x430b, 0x40bb, 0x4075, 0xbf96, 0x4191, 0xba78, 0x4380, 0x402f, 0xbaec, 0x45da, 0xa7ba, 0xb280, 0x42cd, 0x0e15, 0xbfc0, 0x4292, 0x46c9, 0x44ad, 0xb280, 0x4246, 0xb262, 0xb247, 0x4082, 0x402b, 0xb230, 0xba1b, 0xb077, 0x41f3, 0xbf0c, 0x1901, 0xb016, 0x1edf, 0x3519, 0x4058, 0x418b, 0x42bb, 0xbfd0, 0x014d, 0x43dd, 0xbf52, 0x1b22, 0x434a, 0x41f1, 0x4181, 0xa9a5, 0xb20d, 0xb0cb, 0xbf42, 0x3727, 0xb271, 0x4088, 0xabfb, 0xbf61, 0x1ab9, 0x0344, 0x40cd, 0x41d4, 0x1f44, 0x43b7, 0x298e, 0xbf72, 0x1c94, 0xb0ed, 0x2b19, 0x4427, 0x4337, 0x40c3, 0x3601, 0x19a2, 0x414d, 0x18c7, 0x4006, 0x4313, 0x4253, 0x1d49, 0xbf94, 0xba13, 0xa1dc, 0xb2d7, 0x0b0b, 0x41c8, 0x41b5, 0x1b21, 0x3242, 0x1d53, 0x3ac5, 0xb0ec, 0xba22, 0xa9c9, 0x40ef, 0x4027, 0xb0bf, 0xb00f, 0x211f, 0xb018, 0x1fb8, 0x14c1, 0x410c, 0x4081, 0x4604, 0x3ab7, 0xb20f, 0x4301, 0xbf54, 0x42dc, 0x1861, 0x41bf, 0x405e, 0x1dbd, 0x17ce, 0x46e1, 0x4287, 0xa83c, 0x3e4d, 0xb03a, 0xb2bb, 0x41cd, 0x40a4, 0x430e, 0xb288, 0xb25d, 0x4312, 0xb0de, 0x18b3, 0xb2c9, 0x08aa, 0xba4f, 0xbf61, 0x42aa, 0xb249, 0x2856, 0xa13d, 0x4092, 0x424b, 0x2284, 0xb206, 0x40c5, 0x2801, 0x443b, 0x43df, 0x0c18, 0xbf35, 0x42f2, 0x4031, 0x4048, 0xb225, 0x4215, 0x449c, 0x1ecf, 0x43fd, 0x421a, 0x4584, 0xb03e, 0x2473, 0x16d8, 0x42c8, 0x44db, 0x43bb, 0xba55, 0xba18, 0xb06e, 0x1a1d, 0xb281, 0x23c5, 0xbf72, 0x4288, 0x176a, 0x431a, 0x4392, 0xb0d3, 0x43d6, 0x0263, 0x43e7, 0xbfde, 0x0aab, 0x22c9, 0x4203, 0xba25, 0xb2ed, 0x0d84, 0x3b27, 0x17d9, 0x1c5e, 0xb027, 0x19d8, 0xb22d, 0x4284, 0xada7, 0x44c3, 0x431d, 0x1549, 0xb293, 0xb20b, 0xbaf3, 0x419b, 0x2a68, 0x3d99, 0xbf3f, 0x411d, 0xb2c7, 0x4346, 0x1ea1, 0xbf22, 0x1c0c, 0x16ab, 0x1a2e, 0xb0c8, 0x4253, 0x432b, 0xa1c3, 0xbadb, 0x408b, 0x4339, 0x064c, 0x43be, 0x421d, 0x439c, 0x4042, 0x4197, 0x11d2, 0xbf18, 0xbad3, 0x1e4a, 0x4239, 0x2672, 0xb267, 0xa0f4, 0x4240, 0xba29, 0x42a2, 0x4225, 0xbf73, 0x4263, 0x0e6d, 0x43a7, 0x1be0, 0x4460, 0xba4b, 0x42ad, 0x406a, 0x4002, 0x40c9, 0x41e8, 0xb237, 0x4281, 0x4378, 0x4473, 0xb297, 0x3829, 0xbf60, 0x4110, 0x426d, 0x1b20, 0x1ade, 0xbac1, 0x4227, 0xb216, 0x41ed, 0x430d, 0xbf46, 0x4200, 0xb22b, 0x46ed, 0x1496, 0x180b, 0x3e53, 0x4601, 0x4404, 0xbf37, 0x42a3, 0x24ec, 0x3704, 0x2ead, 0xb041, 0xb239, 0xb0f5, 0x418b, 0xbaef, 0xba37, 0x413c, 0x4076, 0xbada, 0x35ef, 0x40cf, 0xbf8b, 0x4379, 0x3548, 0x1edb, 0x41ea, 0x1d56, 0xba6a, 0xba46, 0xb0ac, 0x33d6, 0x40e1, 0x21ce, 0xbf8f, 0xba17, 0xb257, 0xba54, 0xba5f, 0x26c7, 0x40fc, 0x4283, 0xbf04, 0xb280, 0x43de, 0x1eed, 0x3a39, 0x401d, 0x4310, 0xba5b, 0x4656, 0x404c, 0xbfd9, 0x465b, 0xba4b, 0x4656, 0x438a, 0x4347, 0xa967, 0x4049, 0x41c0, 0x1930, 0xb040, 0x433f, 0x1c50, 0xbf54, 0x41bf, 0x4027, 0xbf03, 0xb0dd, 0x42b3, 0x435a, 0xb292, 0x404c, 0xb290, 0xba28, 0x400b, 0x4092, 0x406e, 0x4318, 0x442c, 0x0c48, 0xa5ad, 0x4148, 0x424d, 0x4279, 0x40b1, 0x4331, 0xb27b, 0xb049, 0x1cae, 0x45ab, 0x4319, 0xb06e, 0x40b7, 0xbf1c, 0x4484, 0x1ce2, 0x439b, 0x41d4, 0xb28f, 0x4038, 0x45c1, 0xaf03, 0xa786, 0x409e, 0x0b05, 0x1295, 0x3ba6, 0xa9df, 0x42df, 0xba11, 0xb2d0, 0xba4e, 0xbf38, 0x43a1, 0x3a98, 0x4163, 0x41e4, 0x40e0, 0x4619, 0x4259, 0x1b6a, 0xbf81, 0x396c, 0x3ebc, 0xb2e6, 0xad08, 0x4350, 0x13f0, 0x1898, 0x1f15, 0xbfaa, 0x4335, 0x321b, 0x4189, 0x40b1, 0x0a31, 0xbfa3, 0x3fc0, 0x2d58, 0x43ad, 0xa85a, 0x40af, 0x423d, 0x02b8, 0x1dfe, 0xbac5, 0x4342, 0x40e1, 0x41fb, 0xab7c, 0x28a1, 0x4219, 0x098d, 0x4085, 0xb20e, 0x2e27, 0x0b99, 0x4403, 0xb2c0, 0x405d, 0xb0bc, 0xb0cb, 0xbf98, 0x42c0, 0xb207, 0xb250, 0x40d5, 0x19ff, 0xb2bb, 0x42cc, 0x42d6, 0xae29, 0xba31, 0xbfdd, 0x3003, 0x0f3d, 0xb091, 0xba54, 0x41ed, 0x40e3, 0x20e4, 0xb012, 0xb2c2, 0x409d, 0xb28e, 0x080e, 0xaedd, 0x06d2, 0xb226, 0x4160, 0x4059, 0xb229, 0x040c, 0x4223, 0x422f, 0x3772, 0xb2b6, 0x417e, 0xb21b, 0xbacb, 0xb2d4, 0x2fb1, 0x45e2, 0xbfc9, 0x41f2, 0x42c9, 0x0d4f, 0x4300, 0x4770, 0xe7fe + ], + StartRegs = [0x82916b79, 0x515ecb9e, 0x9eeb80a7, 0x4448bdb6, 0x9fbc4379, 0x7f419a33, 0x42be67d1, 0x712a0dae, 0x4382a2e5, 0x7d2ed79f, 0xe8c9993b, 0x9fd1abb1, 0xed4e4991, 0xf7cf8b5c, 0x00000000, 0x400001f0 + ], + FinalRegs = [0xa000b5cd, 0x00000000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0x0000b55a, 0x00000000, 0xf7cf8df7, 0xd1933276, 0xe8c9993b, 0xf7cf8df7, 0xd1942582, 0xf7cf8df0, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x45f6, 0xa7e3, 0x4240, 0x4552, 0x19ea, 0x1ee9, 0x4223, 0xb029, 0x03fc, 0x41ff, 0x4699, 0x4543, 0x40eb, 0x1189, 0xb2eb, 0x2ed0, 0x46c5, 0x152e, 0xbf8b, 0x42ee, 0x454e, 0x2a1e, 0x3168, 0xa0a7, 0x1fa6, 0x415b, 0xb286, 0x3cff, 0x35a2, 0x405c, 0x4228, 0x40e1, 0x43e2, 0x40c6, 0x37cc, 0xbfda, 0x4320, 0xba70, 0xb067, 0x43f0, 0xb2b7, 0x4213, 0x4247, 0xb229, 0xb2f5, 0x42e7, 0x40cd, 0x1bdf, 0x43f8, 0x3887, 0xa60a, 0xba2e, 0x1b0d, 0x1e22, 0xba51, 0x437e, 0x45e4, 0x466e, 0xb017, 0x29df, 0x4057, 0x19e9, 0xb0cd, 0xbf34, 0x4466, 0x1283, 0xb0de, 0x42ff, 0x1c85, 0x4430, 0x42b0, 0xba35, 0x4274, 0x41e6, 0x4331, 0x42dd, 0x40ec, 0xbf43, 0xb23f, 0x405d, 0xba5f, 0x4563, 0x432c, 0xba0d, 0x43a2, 0x2a71, 0x439d, 0xb26e, 0x4685, 0xb086, 0xb217, 0xb264, 0x4412, 0xbff0, 0x4388, 0x18ff, 0x43c7, 0x407f, 0x4174, 0x410b, 0x4324, 0x469c, 0x410a, 0x4302, 0xbaff, 0xbfa5, 0x4371, 0xb26b, 0xb079, 0x42f6, 0xbf8f, 0xb251, 0x411a, 0x42e3, 0x21bb, 0xba73, 0xb2c3, 0x3374, 0x0cd7, 0x4128, 0x1ca9, 0x40fd, 0xae9f, 0x40fc, 0x1df9, 0x44a8, 0x1d1d, 0x4061, 0xb08f, 0x40f0, 0x4375, 0xb244, 0x45f3, 0x404a, 0x406e, 0xbf5f, 0x4146, 0x41ff, 0x4065, 0x4071, 0x4391, 0x0932, 0x42c2, 0xba62, 0x4146, 0x402b, 0x424f, 0x4263, 0xba47, 0xb0df, 0xbf79, 0x419b, 0x40d5, 0xbfa0, 0x4157, 0xb2e6, 0x42f3, 0x4216, 0x4174, 0x40b0, 0x3c8e, 0xa763, 0x0bb7, 0xba04, 0x45de, 0x4598, 0x1c37, 0xb250, 0x414b, 0xb299, 0xba17, 0xb0c3, 0xa7f5, 0x1e74, 0xbfc7, 0xb23b, 0x42ad, 0x4235, 0xb270, 0x11c2, 0x436f, 0x42ac, 0x45f4, 0x1221, 0xb26e, 0x46a4, 0xb283, 0x2610, 0xb05b, 0x098e, 0x1946, 0x439c, 0xa1ce, 0x4057, 0x16ac, 0x4357, 0xb2d1, 0x4231, 0x4300, 0xae54, 0xbf70, 0x40f3, 0xb2e8, 0xbf2d, 0x1b23, 0xba0a, 0xb0fc, 0x280d, 0x423d, 0xba50, 0xb29c, 0x416e, 0x41f3, 0x42f3, 0xb06a, 0xabca, 0x24ba, 0x1ba6, 0xb2ef, 0x41ec, 0xb22a, 0x1b17, 0xaa10, 0x41b2, 0xba10, 0x1fa7, 0x3414, 0xbacb, 0x4439, 0xbf90, 0xae5e, 0x41a1, 0xbfd4, 0xba4d, 0xb271, 0x0305, 0x422a, 0x411a, 0x4194, 0xb20e, 0xb29b, 0x41b3, 0x46a1, 0xb2c4, 0x3014, 0x40dc, 0x36e7, 0x432d, 0x09b3, 0x430c, 0xb01f, 0x12d7, 0x40aa, 0xb2d9, 0x055b, 0xbaee, 0x42d2, 0x43b4, 0x1875, 0xbf51, 0xa093, 0x226a, 0x284d, 0xb29f, 0x44a4, 0x3de8, 0x35aa, 0x465e, 0xb266, 0xb0a1, 0xb2f5, 0x437f, 0x4250, 0xa47f, 0xbfb4, 0x273b, 0x1d3e, 0x15c1, 0x1c60, 0x0830, 0x0bcd, 0x4255, 0x44db, 0xbf1b, 0x434d, 0x2582, 0xb094, 0x1fa4, 0xa542, 0x05e2, 0xb29f, 0xba52, 0xb00f, 0xb2f3, 0x4285, 0x1a85, 0x4636, 0xb09e, 0x2a91, 0xbf90, 0xb28f, 0xbf80, 0xb234, 0x18fc, 0xbf2d, 0xb07c, 0x41bf, 0x425d, 0x419e, 0x4327, 0x4026, 0x4241, 0xa452, 0x0cbc, 0x41f0, 0x46f4, 0x42d6, 0x4464, 0x1f9f, 0xba60, 0xbfe4, 0x42a5, 0x40a2, 0xb2bf, 0x405f, 0xb2f5, 0x4333, 0x43af, 0x435d, 0x191d, 0x4002, 0xbf68, 0x42a3, 0xb0ee, 0x26e9, 0xbfcc, 0x3226, 0x4342, 0x4280, 0x1715, 0x19cc, 0xb2ed, 0x4407, 0x2653, 0xbaf6, 0xb2c4, 0x43c4, 0xb2b1, 0x4131, 0x1090, 0x41e3, 0x4217, 0xbf90, 0xba7f, 0x401d, 0xb268, 0x408f, 0x4287, 0x4257, 0xbfce, 0x4185, 0x1e28, 0x4265, 0x45ec, 0x43da, 0x422e, 0x2405, 0x00ae, 0xb269, 0xb2c5, 0xbfb9, 0x3700, 0xb067, 0x41ab, 0x408c, 0x4053, 0x4023, 0xbfc6, 0x1c83, 0x4078, 0xace2, 0xbf00, 0x390d, 0x4247, 0x4343, 0x4291, 0x44e4, 0x18eb, 0x4214, 0x4044, 0xb0ae, 0xbacd, 0x4171, 0xb0b7, 0x42f1, 0x4045, 0xb277, 0x40dc, 0x19a8, 0xbf91, 0x09fd, 0xb21c, 0xba3e, 0x41a5, 0xbad5, 0x1abb, 0xbfbd, 0x3179, 0x22a8, 0x1555, 0x31a9, 0xbfe0, 0x420d, 0xbf7d, 0x428d, 0xbaea, 0x1e6b, 0x2b66, 0xb05d, 0x1ac3, 0x4176, 0x41c6, 0x41c5, 0x421b, 0xb2ec, 0x41e9, 0x2cf0, 0x4386, 0x4108, 0xbf1f, 0x4066, 0x181d, 0xb2a1, 0x43f5, 0x43a1, 0x00a7, 0x42ff, 0x1f65, 0x43aa, 0xb24d, 0x0ab5, 0x42ee, 0x2d96, 0x456b, 0xbaec, 0x3863, 0xbaf2, 0xbafd, 0x1f60, 0xb2f5, 0x4144, 0x2be1, 0xaca3, 0xb2a9, 0xbf96, 0xaed3, 0xac10, 0x404d, 0x4040, 0xbac2, 0x228d, 0x4144, 0x43d7, 0x45e5, 0x419f, 0x1d89, 0x4463, 0x311c, 0xbf4a, 0x1cd6, 0x4618, 0xb2db, 0x43fa, 0x40ae, 0xb0af, 0x32a0, 0xb2fe, 0xaef6, 0x1de3, 0x4302, 0x42a0, 0xabb6, 0x411e, 0x439b, 0x464b, 0x406f, 0x2a8b, 0x38cd, 0xbfc2, 0x422d, 0xb068, 0x4327, 0x4328, 0x4109, 0xbf4b, 0x0a21, 0x44b3, 0x4089, 0x40bd, 0x18ca, 0x4112, 0xba1f, 0x0bf6, 0x31e8, 0x41bf, 0x45c1, 0x4354, 0x2f9f, 0x0993, 0xba25, 0x4010, 0x1a4b, 0x43ab, 0xbf8e, 0xbacb, 0xa49a, 0x42f5, 0xb029, 0xbfc8, 0x4376, 0x40af, 0x464f, 0x01c2, 0x43da, 0x4251, 0x40a8, 0x422c, 0x438e, 0xbacf, 0x0b64, 0x437d, 0xa181, 0x40ca, 0x411f, 0x4677, 0x4353, 0x2f02, 0x43f2, 0x05fe, 0xb2e2, 0xb083, 0xbf3a, 0x303c, 0xb007, 0x24d0, 0xb27d, 0xb216, 0x3049, 0xba34, 0x4399, 0xb27a, 0x2f9c, 0xb006, 0x223e, 0x0844, 0x4044, 0x436a, 0xb276, 0xb2b6, 0xba1e, 0xbf52, 0x425c, 0xbaee, 0x42d5, 0x417d, 0x4187, 0xbaf2, 0x4238, 0x402b, 0x4206, 0x41cd, 0x05b2, 0x402d, 0x408b, 0x4681, 0x419d, 0xb0b5, 0xb28d, 0xbfe8, 0x27bb, 0x25c4, 0x02ee, 0x40e2, 0x435b, 0x40ad, 0x43ea, 0x1fd2, 0x4065, 0x1d5a, 0x4347, 0xb2d5, 0x436f, 0xae55, 0xba71, 0x0f2c, 0x4187, 0xbf73, 0xb20a, 0x44eb, 0xa5dd, 0x40ed, 0xba53, 0xba13, 0x4191, 0x42e5, 0x4193, 0x4168, 0x40ab, 0x4476, 0x4135, 0x41c3, 0x4145, 0x353e, 0xbfd0, 0xb220, 0xa3e1, 0x42a1, 0xb2d3, 0xb2af, 0x433d, 0x412a, 0x28d7, 0x411d, 0x42bc, 0x4155, 0xbfd5, 0xac98, 0x4353, 0x4142, 0x4435, 0x03bd, 0x402c, 0xb056, 0xb08b, 0x460f, 0xb284, 0x45e0, 0x4240, 0x265c, 0xba4a, 0xa052, 0xa53d, 0xbae5, 0xb2a0, 0xbf31, 0x413b, 0x1ecb, 0x4234, 0xb27a, 0xb204, 0xac49, 0x4387, 0xb064, 0xbf80, 0xbfd1, 0xb229, 0x4342, 0x41b5, 0x43f9, 0x43a7, 0x405e, 0x449d, 0x43c1, 0xba4e, 0x4181, 0x40a6, 0x238d, 0x4280, 0x422f, 0x401a, 0xbf70, 0x09df, 0xa4e7, 0x4040, 0x37cc, 0xbfa2, 0x300b, 0x013f, 0x423e, 0x42ab, 0x412a, 0x45b3, 0xb2f0, 0x405b, 0x12ca, 0x40a4, 0xabdf, 0x43ab, 0x4383, 0x43c4, 0xba14, 0x4105, 0xbf05, 0x14da, 0x4294, 0x4065, 0x40f4, 0xb246, 0x4179, 0x1d11, 0xb240, 0x283b, 0xb2df, 0xbf75, 0x1b5a, 0x435a, 0x05db, 0xbaf6, 0x4399, 0x4394, 0x42b3, 0x1fdc, 0x40e4, 0x41ba, 0x432e, 0x438f, 0xb2e0, 0x3f84, 0xb003, 0x137f, 0xb051, 0x419f, 0xba3e, 0xbad0, 0xb208, 0x417b, 0x431f, 0x2355, 0xb25c, 0x266c, 0x43f6, 0x4478, 0xbfa8, 0x42af, 0x4167, 0x2ef4, 0x42b2, 0x411a, 0x4151, 0xba77, 0x4391, 0x27b8, 0xba78, 0x0a0c, 0xb2d7, 0x4595, 0x41e3, 0x40dc, 0x41e5, 0x41ec, 0x1c70, 0xbfe4, 0x41bc, 0x4109, 0xb2fd, 0xb292, 0x0159, 0x240f, 0x4363, 0x4398, 0x4371, 0x1ba9, 0x4088, 0x3e3e, 0x4016, 0x4363, 0xb2c2, 0x05b5, 0xbfb0, 0xba63, 0x24f5, 0xb23c, 0xbf03, 0x4146, 0xb2a1, 0x380d, 0xb267, 0x3bde, 0x4092, 0xb274, 0x251e, 0x421c, 0x0687, 0xba79, 0x059e, 0x429b, 0x45b9, 0x0d1c, 0x45a6, 0x1185, 0x46a3, 0x0230, 0x4128, 0x1b96, 0x3e30, 0xbaca, 0x418f, 0x43d4, 0xbfda, 0xb0e8, 0xbf80, 0x3cf6, 0x4264, 0x4005, 0xa0bc, 0x3a93, 0x1777, 0x454d, 0xbad4, 0x4066, 0x414f, 0x181b, 0x1b26, 0x40d9, 0x42bd, 0xba42, 0x1930, 0x0023, 0x405b, 0xbf3b, 0xad73, 0xb278, 0x4111, 0xbadc, 0x4276, 0xaa86, 0x4310, 0x441a, 0x0ee1, 0x2eb8, 0x4379, 0x4268, 0x43ed, 0xb268, 0x187e, 0x4221, 0x2188, 0xb05a, 0x43e6, 0x43ed, 0x4148, 0xb2cf, 0x4491, 0xbf3f, 0x0b27, 0x1cc0, 0xb236, 0x1a4a, 0x43fe, 0x43c3, 0xba58, 0x4326, 0xb0d9, 0x1a6c, 0xa71b, 0x1461, 0x40cc, 0x41ba, 0x1d96, 0x42aa, 0x19d1, 0x1413, 0xba22, 0xb2a4, 0xba5b, 0x441f, 0x0936, 0x3137, 0x4491, 0xbf76, 0xb0dd, 0xa93b, 0xb0a4, 0xb09d, 0x1677, 0x1dd3, 0x40fa, 0xa6a6, 0x4054, 0x424f, 0xb008, 0x4650, 0x401f, 0xab43, 0x43a7, 0x1a59, 0x4034, 0xbacd, 0xaff8, 0xb062, 0xbfc3, 0x4081, 0xba07, 0x459e, 0x4037, 0x1f32, 0xba28, 0x43b7, 0x0c12, 0x4133, 0x1b17, 0xbf94, 0x4286, 0x4212, 0x41cd, 0x1953, 0x4049, 0xba1c, 0x43cc, 0x1c4e, 0x43ac, 0x432d, 0x4616, 0x45c3, 0x3f22, 0x0c24, 0x2bbe, 0x414e, 0xbf51, 0x41ba, 0x3fed, 0x42b0, 0xb2eb, 0x1a7a, 0x1d81, 0x43d0, 0x4358, 0x1f1a, 0x4362, 0xba60, 0x42a1, 0x40e8, 0x43f5, 0x1c51, 0x4249, 0xba7b, 0xbf27, 0x4169, 0x4296, 0xbf70, 0x4344, 0x4356, 0xbaff, 0x436f, 0x42d8, 0x0bc9, 0xba0d, 0x428e, 0x4038, 0x40f8, 0x1ba6, 0x428e, 0x417a, 0x44b1, 0xb0cc, 0x4328, 0x4187, 0x4090, 0x41d3, 0x458c, 0xba28, 0xbfba, 0x42e5, 0x459b, 0xb27c, 0x42ec, 0x2a3e, 0x408c, 0x3be5, 0x2aec, 0xbf0d, 0xb282, 0xba27, 0x43fa, 0x419b, 0x43c8, 0x1934, 0x445c, 0xbf86, 0xb0e9, 0x4240, 0x4282, 0x044a, 0xb240, 0xaa3d, 0x424a, 0x39f5, 0x0ee1, 0x41ab, 0x1a6e, 0x4324, 0x0e64, 0x41e5, 0xbf8c, 0x4170, 0x19eb, 0x3ff4, 0x4404, 0xb021, 0x435a, 0x4380, 0x46b0, 0xb2ea, 0x24d2, 0x40ed, 0x42d8, 0x40e1, 0x4245, 0x4108, 0x19c7, 0x428d, 0x422e, 0x4244, 0x260e, 0xb045, 0xb060, 0x1ab1, 0x40b1, 0xb0b9, 0x42eb, 0xbf9e, 0x1a35, 0xb24a, 0x4411, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xdb27f4a8, 0x745a69a1, 0xc76c58a7, 0xcb93d578, 0x59551d1e, 0xdd275e29, 0xa41a07ab, 0xcd4584a9, 0x8cd3e811, 0x92d54b8c, 0x7a714058, 0xd6ca1b2d, 0xbb97bd53, 0x4fb916ee, 0x00000000, 0xc00001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00034000, 0x00000000, 0x0382fe19, 0x00000000, 0x0000000e, 0x0000000e, 0xffffff0c, 0xf47d00e9, 0x1f5a553b, 0x7a714058, 0x00000000, 0x00000000, 0x605fe8c0, 0x00000000, 0x000001d0 }, + Instructions = [0x45f6, 0xa7e3, 0x4240, 0x4552, 0x19ea, 0x1ee9, 0x4223, 0xb029, 0x03fc, 0x41ff, 0x4699, 0x4543, 0x40eb, 0x1189, 0xb2eb, 0x2ed0, 0x46c5, 0x152e, 0xbf8b, 0x42ee, 0x454e, 0x2a1e, 0x3168, 0xa0a7, 0x1fa6, 0x415b, 0xb286, 0x3cff, 0x35a2, 0x405c, 0x4228, 0x40e1, 0x43e2, 0x40c6, 0x37cc, 0xbfda, 0x4320, 0xba70, 0xb067, 0x43f0, 0xb2b7, 0x4213, 0x4247, 0xb229, 0xb2f5, 0x42e7, 0x40cd, 0x1bdf, 0x43f8, 0x3887, 0xa60a, 0xba2e, 0x1b0d, 0x1e22, 0xba51, 0x437e, 0x45e4, 0x466e, 0xb017, 0x29df, 0x4057, 0x19e9, 0xb0cd, 0xbf34, 0x4466, 0x1283, 0xb0de, 0x42ff, 0x1c85, 0x4430, 0x42b0, 0xba35, 0x4274, 0x41e6, 0x4331, 0x42dd, 0x40ec, 0xbf43, 0xb23f, 0x405d, 0xba5f, 0x4563, 0x432c, 0xba0d, 0x43a2, 0x2a71, 0x439d, 0xb26e, 0x4685, 0xb086, 0xb217, 0xb264, 0x4412, 0xbff0, 0x4388, 0x18ff, 0x43c7, 0x407f, 0x4174, 0x410b, 0x4324, 0x469c, 0x410a, 0x4302, 0xbaff, 0xbfa5, 0x4371, 0xb26b, 0xb079, 0x42f6, 0xbf8f, 0xb251, 0x411a, 0x42e3, 0x21bb, 0xba73, 0xb2c3, 0x3374, 0x0cd7, 0x4128, 0x1ca9, 0x40fd, 0xae9f, 0x40fc, 0x1df9, 0x44a8, 0x1d1d, 0x4061, 0xb08f, 0x40f0, 0x4375, 0xb244, 0x45f3, 0x404a, 0x406e, 0xbf5f, 0x4146, 0x41ff, 0x4065, 0x4071, 0x4391, 0x0932, 0x42c2, 0xba62, 0x4146, 0x402b, 0x424f, 0x4263, 0xba47, 0xb0df, 0xbf79, 0x419b, 0x40d5, 0xbfa0, 0x4157, 0xb2e6, 0x42f3, 0x4216, 0x4174, 0x40b0, 0x3c8e, 0xa763, 0x0bb7, 0xba04, 0x45de, 0x4598, 0x1c37, 0xb250, 0x414b, 0xb299, 0xba17, 0xb0c3, 0xa7f5, 0x1e74, 0xbfc7, 0xb23b, 0x42ad, 0x4235, 0xb270, 0x11c2, 0x436f, 0x42ac, 0x45f4, 0x1221, 0xb26e, 0x46a4, 0xb283, 0x2610, 0xb05b, 0x098e, 0x1946, 0x439c, 0xa1ce, 0x4057, 0x16ac, 0x4357, 0xb2d1, 0x4231, 0x4300, 0xae54, 0xbf70, 0x40f3, 0xb2e8, 0xbf2d, 0x1b23, 0xba0a, 0xb0fc, 0x280d, 0x423d, 0xba50, 0xb29c, 0x416e, 0x41f3, 0x42f3, 0xb06a, 0xabca, 0x24ba, 0x1ba6, 0xb2ef, 0x41ec, 0xb22a, 0x1b17, 0xaa10, 0x41b2, 0xba10, 0x1fa7, 0x3414, 0xbacb, 0x4439, 0xbf90, 0xae5e, 0x41a1, 0xbfd4, 0xba4d, 0xb271, 0x0305, 0x422a, 0x411a, 0x4194, 0xb20e, 0xb29b, 0x41b3, 0x46a1, 0xb2c4, 0x3014, 0x40dc, 0x36e7, 0x432d, 0x09b3, 0x430c, 0xb01f, 0x12d7, 0x40aa, 0xb2d9, 0x055b, 0xbaee, 0x42d2, 0x43b4, 0x1875, 0xbf51, 0xa093, 0x226a, 0x284d, 0xb29f, 0x44a4, 0x3de8, 0x35aa, 0x465e, 0xb266, 0xb0a1, 0xb2f5, 0x437f, 0x4250, 0xa47f, 0xbfb4, 0x273b, 0x1d3e, 0x15c1, 0x1c60, 0x0830, 0x0bcd, 0x4255, 0x44db, 0xbf1b, 0x434d, 0x2582, 0xb094, 0x1fa4, 0xa542, 0x05e2, 0xb29f, 0xba52, 0xb00f, 0xb2f3, 0x4285, 0x1a85, 0x4636, 0xb09e, 0x2a91, 0xbf90, 0xb28f, 0xbf80, 0xb234, 0x18fc, 0xbf2d, 0xb07c, 0x41bf, 0x425d, 0x419e, 0x4327, 0x4026, 0x4241, 0xa452, 0x0cbc, 0x41f0, 0x46f4, 0x42d6, 0x4464, 0x1f9f, 0xba60, 0xbfe4, 0x42a5, 0x40a2, 0xb2bf, 0x405f, 0xb2f5, 0x4333, 0x43af, 0x435d, 0x191d, 0x4002, 0xbf68, 0x42a3, 0xb0ee, 0x26e9, 0xbfcc, 0x3226, 0x4342, 0x4280, 0x1715, 0x19cc, 0xb2ed, 0x4407, 0x2653, 0xbaf6, 0xb2c4, 0x43c4, 0xb2b1, 0x4131, 0x1090, 0x41e3, 0x4217, 0xbf90, 0xba7f, 0x401d, 0xb268, 0x408f, 0x4287, 0x4257, 0xbfce, 0x4185, 0x1e28, 0x4265, 0x45ec, 0x43da, 0x422e, 0x2405, 0x00ae, 0xb269, 0xb2c5, 0xbfb9, 0x3700, 0xb067, 0x41ab, 0x408c, 0x4053, 0x4023, 0xbfc6, 0x1c83, 0x4078, 0xace2, 0xbf00, 0x390d, 0x4247, 0x4343, 0x4291, 0x44e4, 0x18eb, 0x4214, 0x4044, 0xb0ae, 0xbacd, 0x4171, 0xb0b7, 0x42f1, 0x4045, 0xb277, 0x40dc, 0x19a8, 0xbf91, 0x09fd, 0xb21c, 0xba3e, 0x41a5, 0xbad5, 0x1abb, 0xbfbd, 0x3179, 0x22a8, 0x1555, 0x31a9, 0xbfe0, 0x420d, 0xbf7d, 0x428d, 0xbaea, 0x1e6b, 0x2b66, 0xb05d, 0x1ac3, 0x4176, 0x41c6, 0x41c5, 0x421b, 0xb2ec, 0x41e9, 0x2cf0, 0x4386, 0x4108, 0xbf1f, 0x4066, 0x181d, 0xb2a1, 0x43f5, 0x43a1, 0x00a7, 0x42ff, 0x1f65, 0x43aa, 0xb24d, 0x0ab5, 0x42ee, 0x2d96, 0x456b, 0xbaec, 0x3863, 0xbaf2, 0xbafd, 0x1f60, 0xb2f5, 0x4144, 0x2be1, 0xaca3, 0xb2a9, 0xbf96, 0xaed3, 0xac10, 0x404d, 0x4040, 0xbac2, 0x228d, 0x4144, 0x43d7, 0x45e5, 0x419f, 0x1d89, 0x4463, 0x311c, 0xbf4a, 0x1cd6, 0x4618, 0xb2db, 0x43fa, 0x40ae, 0xb0af, 0x32a0, 0xb2fe, 0xaef6, 0x1de3, 0x4302, 0x42a0, 0xabb6, 0x411e, 0x439b, 0x464b, 0x406f, 0x2a8b, 0x38cd, 0xbfc2, 0x422d, 0xb068, 0x4327, 0x4328, 0x4109, 0xbf4b, 0x0a21, 0x44b3, 0x4089, 0x40bd, 0x18ca, 0x4112, 0xba1f, 0x0bf6, 0x31e8, 0x41bf, 0x45c1, 0x4354, 0x2f9f, 0x0993, 0xba25, 0x4010, 0x1a4b, 0x43ab, 0xbf8e, 0xbacb, 0xa49a, 0x42f5, 0xb029, 0xbfc8, 0x4376, 0x40af, 0x464f, 0x01c2, 0x43da, 0x4251, 0x40a8, 0x422c, 0x438e, 0xbacf, 0x0b64, 0x437d, 0xa181, 0x40ca, 0x411f, 0x4677, 0x4353, 0x2f02, 0x43f2, 0x05fe, 0xb2e2, 0xb083, 0xbf3a, 0x303c, 0xb007, 0x24d0, 0xb27d, 0xb216, 0x3049, 0xba34, 0x4399, 0xb27a, 0x2f9c, 0xb006, 0x223e, 0x0844, 0x4044, 0x436a, 0xb276, 0xb2b6, 0xba1e, 0xbf52, 0x425c, 0xbaee, 0x42d5, 0x417d, 0x4187, 0xbaf2, 0x4238, 0x402b, 0x4206, 0x41cd, 0x05b2, 0x402d, 0x408b, 0x4681, 0x419d, 0xb0b5, 0xb28d, 0xbfe8, 0x27bb, 0x25c4, 0x02ee, 0x40e2, 0x435b, 0x40ad, 0x43ea, 0x1fd2, 0x4065, 0x1d5a, 0x4347, 0xb2d5, 0x436f, 0xae55, 0xba71, 0x0f2c, 0x4187, 0xbf73, 0xb20a, 0x44eb, 0xa5dd, 0x40ed, 0xba53, 0xba13, 0x4191, 0x42e5, 0x4193, 0x4168, 0x40ab, 0x4476, 0x4135, 0x41c3, 0x4145, 0x353e, 0xbfd0, 0xb220, 0xa3e1, 0x42a1, 0xb2d3, 0xb2af, 0x433d, 0x412a, 0x28d7, 0x411d, 0x42bc, 0x4155, 0xbfd5, 0xac98, 0x4353, 0x4142, 0x4435, 0x03bd, 0x402c, 0xb056, 0xb08b, 0x460f, 0xb284, 0x45e0, 0x4240, 0x265c, 0xba4a, 0xa052, 0xa53d, 0xbae5, 0xb2a0, 0xbf31, 0x413b, 0x1ecb, 0x4234, 0xb27a, 0xb204, 0xac49, 0x4387, 0xb064, 0xbf80, 0xbfd1, 0xb229, 0x4342, 0x41b5, 0x43f9, 0x43a7, 0x405e, 0x449d, 0x43c1, 0xba4e, 0x4181, 0x40a6, 0x238d, 0x4280, 0x422f, 0x401a, 0xbf70, 0x09df, 0xa4e7, 0x4040, 0x37cc, 0xbfa2, 0x300b, 0x013f, 0x423e, 0x42ab, 0x412a, 0x45b3, 0xb2f0, 0x405b, 0x12ca, 0x40a4, 0xabdf, 0x43ab, 0x4383, 0x43c4, 0xba14, 0x4105, 0xbf05, 0x14da, 0x4294, 0x4065, 0x40f4, 0xb246, 0x4179, 0x1d11, 0xb240, 0x283b, 0xb2df, 0xbf75, 0x1b5a, 0x435a, 0x05db, 0xbaf6, 0x4399, 0x4394, 0x42b3, 0x1fdc, 0x40e4, 0x41ba, 0x432e, 0x438f, 0xb2e0, 0x3f84, 0xb003, 0x137f, 0xb051, 0x419f, 0xba3e, 0xbad0, 0xb208, 0x417b, 0x431f, 0x2355, 0xb25c, 0x266c, 0x43f6, 0x4478, 0xbfa8, 0x42af, 0x4167, 0x2ef4, 0x42b2, 0x411a, 0x4151, 0xba77, 0x4391, 0x27b8, 0xba78, 0x0a0c, 0xb2d7, 0x4595, 0x41e3, 0x40dc, 0x41e5, 0x41ec, 0x1c70, 0xbfe4, 0x41bc, 0x4109, 0xb2fd, 0xb292, 0x0159, 0x240f, 0x4363, 0x4398, 0x4371, 0x1ba9, 0x4088, 0x3e3e, 0x4016, 0x4363, 0xb2c2, 0x05b5, 0xbfb0, 0xba63, 0x24f5, 0xb23c, 0xbf03, 0x4146, 0xb2a1, 0x380d, 0xb267, 0x3bde, 0x4092, 0xb274, 0x251e, 0x421c, 0x0687, 0xba79, 0x059e, 0x429b, 0x45b9, 0x0d1c, 0x45a6, 0x1185, 0x46a3, 0x0230, 0x4128, 0x1b96, 0x3e30, 0xbaca, 0x418f, 0x43d4, 0xbfda, 0xb0e8, 0xbf80, 0x3cf6, 0x4264, 0x4005, 0xa0bc, 0x3a93, 0x1777, 0x454d, 0xbad4, 0x4066, 0x414f, 0x181b, 0x1b26, 0x40d9, 0x42bd, 0xba42, 0x1930, 0x0023, 0x405b, 0xbf3b, 0xad73, 0xb278, 0x4111, 0xbadc, 0x4276, 0xaa86, 0x4310, 0x441a, 0x0ee1, 0x2eb8, 0x4379, 0x4268, 0x43ed, 0xb268, 0x187e, 0x4221, 0x2188, 0xb05a, 0x43e6, 0x43ed, 0x4148, 0xb2cf, 0x4491, 0xbf3f, 0x0b27, 0x1cc0, 0xb236, 0x1a4a, 0x43fe, 0x43c3, 0xba58, 0x4326, 0xb0d9, 0x1a6c, 0xa71b, 0x1461, 0x40cc, 0x41ba, 0x1d96, 0x42aa, 0x19d1, 0x1413, 0xba22, 0xb2a4, 0xba5b, 0x441f, 0x0936, 0x3137, 0x4491, 0xbf76, 0xb0dd, 0xa93b, 0xb0a4, 0xb09d, 0x1677, 0x1dd3, 0x40fa, 0xa6a6, 0x4054, 0x424f, 0xb008, 0x4650, 0x401f, 0xab43, 0x43a7, 0x1a59, 0x4034, 0xbacd, 0xaff8, 0xb062, 0xbfc3, 0x4081, 0xba07, 0x459e, 0x4037, 0x1f32, 0xba28, 0x43b7, 0x0c12, 0x4133, 0x1b17, 0xbf94, 0x4286, 0x4212, 0x41cd, 0x1953, 0x4049, 0xba1c, 0x43cc, 0x1c4e, 0x43ac, 0x432d, 0x4616, 0x45c3, 0x3f22, 0x0c24, 0x2bbe, 0x414e, 0xbf51, 0x41ba, 0x3fed, 0x42b0, 0xb2eb, 0x1a7a, 0x1d81, 0x43d0, 0x4358, 0x1f1a, 0x4362, 0xba60, 0x42a1, 0x40e8, 0x43f5, 0x1c51, 0x4249, 0xba7b, 0xbf27, 0x4169, 0x4296, 0xbf70, 0x4344, 0x4356, 0xbaff, 0x436f, 0x42d8, 0x0bc9, 0xba0d, 0x428e, 0x4038, 0x40f8, 0x1ba6, 0x428e, 0x417a, 0x44b1, 0xb0cc, 0x4328, 0x4187, 0x4090, 0x41d3, 0x458c, 0xba28, 0xbfba, 0x42e5, 0x459b, 0xb27c, 0x42ec, 0x2a3e, 0x408c, 0x3be5, 0x2aec, 0xbf0d, 0xb282, 0xba27, 0x43fa, 0x419b, 0x43c8, 0x1934, 0x445c, 0xbf86, 0xb0e9, 0x4240, 0x4282, 0x044a, 0xb240, 0xaa3d, 0x424a, 0x39f5, 0x0ee1, 0x41ab, 0x1a6e, 0x4324, 0x0e64, 0x41e5, 0xbf8c, 0x4170, 0x19eb, 0x3ff4, 0x4404, 0xb021, 0x435a, 0x4380, 0x46b0, 0xb2ea, 0x24d2, 0x40ed, 0x42d8, 0x40e1, 0x4245, 0x4108, 0x19c7, 0x428d, 0x422e, 0x4244, 0x260e, 0xb045, 0xb060, 0x1ab1, 0x40b1, 0xb0b9, 0x42eb, 0xbf9e, 0x1a35, 0xb24a, 0x4411, 0x4770, 0xe7fe + ], + StartRegs = [0xdb27f4a8, 0x745a69a1, 0xc76c58a7, 0xcb93d578, 0x59551d1e, 0xdd275e29, 0xa41a07ab, 0xcd4584a9, 0x8cd3e811, 0x92d54b8c, 0x7a714058, 0xd6ca1b2d, 0xbb97bd53, 0x4fb916ee, 0x00000000, 0xc00001f0 + ], + FinalRegs = [0x00000000, 0x00034000, 0x00000000, 0x0382fe19, 0x00000000, 0x0000000e, 0x0000000e, 0xffffff0c, 0xf47d00e9, 0x1f5a553b, 0x7a714058, 0x00000000, 0x00000000, 0x605fe8c0, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x4283, 0xa90f, 0x4210, 0x1dab, 0x4172, 0x40c4, 0x40b1, 0x44d5, 0x2a9b, 0xba65, 0x4002, 0x1842, 0x308f, 0xb226, 0x42c5, 0x425c, 0x40fd, 0xb279, 0xba34, 0x4284, 0xbf60, 0x3d5d, 0x420c, 0x401a, 0x0e39, 0xbf79, 0x4395, 0x1ccb, 0x41ae, 0x1ddc, 0x4062, 0x44db, 0x2e06, 0x4389, 0x1d42, 0x1c39, 0x4347, 0xb298, 0xb007, 0x43a7, 0xb22a, 0xba22, 0xb22c, 0xba54, 0x4304, 0xa8d3, 0x42a8, 0x2c0a, 0x40a3, 0x2b03, 0x1b34, 0xb2ef, 0x06d3, 0xbf3a, 0x1d56, 0x1ef0, 0x0fa3, 0xb2a8, 0x1939, 0xbff0, 0x422c, 0x019c, 0x1f8e, 0x42cb, 0xbae4, 0x17be, 0x404e, 0xb2d3, 0x1fa5, 0xb209, 0x42ae, 0x2bb5, 0x424e, 0xb273, 0x4202, 0xba33, 0xb2af, 0x1d35, 0x1a2f, 0x1cf0, 0xb266, 0x2255, 0xbf3f, 0xac6b, 0x42f7, 0xb092, 0x1263, 0x46a9, 0x4099, 0x105a, 0x18b5, 0x34aa, 0x1b91, 0x4129, 0x1449, 0x4096, 0xb27a, 0x437a, 0x40f5, 0xb27d, 0x1628, 0xb242, 0x42da, 0x404b, 0xbfbb, 0xb077, 0x4297, 0x0570, 0x4152, 0x2525, 0x1be3, 0xbfe0, 0x4633, 0x12e2, 0x4547, 0xba67, 0x06a6, 0x40c9, 0x371b, 0xbfb0, 0x4201, 0x0101, 0xba0d, 0xbfd9, 0x4192, 0x2123, 0x4117, 0x428e, 0x4084, 0xba04, 0x417c, 0x4390, 0x41e5, 0x41ad, 0x462e, 0x46da, 0x4268, 0x40b4, 0xb279, 0xa5df, 0xb26a, 0xbf4d, 0x356c, 0x09bf, 0xb06e, 0xb292, 0xb2f2, 0x1897, 0x0d15, 0xb261, 0xb29b, 0x40e6, 0x3e3a, 0x46ba, 0x3342, 0x1d7b, 0x401c, 0xb0ce, 0x177f, 0x430d, 0x0189, 0x43ba, 0x4309, 0xb20f, 0xb228, 0xac9c, 0x086d, 0x13e5, 0xbf61, 0x1fc8, 0x41b5, 0x2273, 0x40ab, 0x4334, 0x43fd, 0xbf6d, 0x4304, 0x4286, 0x4372, 0xb213, 0x4426, 0x02e4, 0x40da, 0xb2bd, 0x441a, 0xbf79, 0x40c6, 0x1e05, 0x1b15, 0x420d, 0x4248, 0xbf60, 0xb093, 0x39aa, 0x40c8, 0x085d, 0x37e8, 0x400a, 0x15dc, 0x218d, 0xb223, 0x1910, 0xb248, 0xb00d, 0x4168, 0x44c2, 0x418d, 0xb0e5, 0xb0b2, 0x33e7, 0xa4e7, 0x43e3, 0x0066, 0x165b, 0x4231, 0xbfa7, 0x2e38, 0xb249, 0x431a, 0x4089, 0xba16, 0xa64d, 0x4181, 0xbfd0, 0x3a3f, 0xb258, 0x44cd, 0xaa78, 0x41d7, 0xa0cb, 0x4279, 0x4061, 0x41de, 0xb2bc, 0x4125, 0xae63, 0x41bc, 0x418f, 0xba71, 0xa347, 0xbf4f, 0x4666, 0xb204, 0x4202, 0x42db, 0xb006, 0xbf7b, 0x0978, 0x1c50, 0x1bc7, 0x1818, 0x053b, 0xbfb5, 0xa485, 0x4134, 0x27f9, 0x2199, 0xae03, 0x4126, 0x46e5, 0x1a12, 0x1ee6, 0xb22d, 0x2692, 0x4361, 0x411d, 0x4064, 0x4091, 0x3d71, 0x3936, 0xb2a0, 0x34de, 0xbfdf, 0x4552, 0x1bb7, 0x1a4a, 0x1264, 0x40d4, 0x1d83, 0x4227, 0xbfe0, 0x0a4d, 0x429b, 0x3aa5, 0x4055, 0x43f3, 0x1c83, 0xbf5a, 0x4567, 0x43f6, 0xa01f, 0x1cdc, 0x40bd, 0x41c3, 0x4223, 0x3fea, 0x422b, 0x3d0a, 0x18f7, 0x432d, 0x1e00, 0xbf04, 0xaf5d, 0x1b42, 0xb0e2, 0x46e4, 0xbf09, 0x463a, 0x4355, 0xb0dd, 0x44d2, 0xb24c, 0xba2b, 0xa14c, 0xbfc0, 0xb2b7, 0xba12, 0x43f1, 0xb294, 0x41b6, 0xb247, 0x0688, 0x43e8, 0x42c7, 0x4155, 0x43c4, 0x44fd, 0xa8d2, 0x19a7, 0xb2d5, 0xb035, 0xb2a8, 0x43fd, 0x455d, 0x4314, 0x1f85, 0xbf2c, 0x4287, 0x4154, 0x4204, 0xbf06, 0x4201, 0x408b, 0x40f5, 0x43f3, 0x43b4, 0x4329, 0x42ab, 0x45d0, 0xb093, 0x434c, 0x0f4f, 0x1d8c, 0x402f, 0xba58, 0x444c, 0xb294, 0x41b1, 0x42a7, 0x4177, 0xbfc7, 0x4560, 0xba10, 0xb28a, 0x41f7, 0x40c1, 0xb21b, 0x4068, 0xacc3, 0x41b5, 0x0829, 0x42eb, 0x408f, 0x46f9, 0x1c2f, 0xa7ff, 0xb27e, 0xb2a2, 0x194b, 0x4182, 0x3acc, 0x1527, 0x4143, 0x40f4, 0x3a3c, 0xb2ea, 0x44b5, 0x4076, 0xbf69, 0x34c1, 0x43ce, 0xb299, 0x18d5, 0xbfa0, 0xb24d, 0xbf15, 0x427e, 0xb003, 0x4289, 0xba4b, 0x356d, 0xb2a7, 0xa497, 0xba5a, 0x405e, 0xb249, 0xb2a7, 0x4176, 0x426b, 0xb204, 0xaea9, 0x4110, 0x2479, 0x3502, 0x46ca, 0xbfbc, 0x4321, 0x41f4, 0x4170, 0xba41, 0x1d2c, 0xba4a, 0x11a4, 0x009a, 0x28c5, 0x43d3, 0xbfcf, 0x4034, 0xabeb, 0xaac6, 0xa608, 0x4056, 0x338f, 0x0394, 0xb02f, 0x4274, 0xa5c6, 0x1be8, 0x40fc, 0x4029, 0xb2b5, 0x0227, 0x090b, 0xbacc, 0x1116, 0x2c45, 0x08ee, 0x14fa, 0xbf82, 0x405a, 0x423f, 0xba2a, 0x4052, 0x4200, 0xa671, 0x0efd, 0x42de, 0x1e89, 0xb049, 0xb264, 0x3e26, 0x41d5, 0x4445, 0x32af, 0xb0e8, 0xbafb, 0xb0f7, 0x4093, 0xb034, 0xb2e8, 0x2e69, 0xb259, 0x2479, 0x439d, 0xb2de, 0x1b5b, 0xbf8c, 0x437b, 0xbad1, 0x217d, 0x4093, 0xb2e6, 0x1972, 0xb2e5, 0x1d51, 0x4210, 0x4310, 0xb20c, 0xad06, 0x1879, 0x40b7, 0x4077, 0xbfbd, 0x1fa9, 0xb00b, 0x40bf, 0xbaf2, 0xa690, 0x4298, 0xa00d, 0x2c47, 0x1e51, 0x41c2, 0x42dc, 0xbf6e, 0xb0c0, 0x2ddd, 0x43b9, 0xba69, 0xa0f1, 0x1c40, 0xbfe0, 0xba04, 0x4263, 0xba26, 0xa397, 0x1731, 0x0de3, 0x40bc, 0xa1e7, 0x411c, 0x4005, 0x417a, 0xb043, 0x43d3, 0x42a1, 0x4053, 0x42e8, 0xb0eb, 0xbf16, 0x1c21, 0x4442, 0xbf80, 0x4164, 0x401e, 0x41e5, 0x18d4, 0xb241, 0x45ed, 0x4037, 0xba05, 0x415a, 0xbf25, 0xa2a9, 0x0e62, 0x26af, 0x182b, 0x4134, 0xa7ee, 0x4212, 0x42bd, 0x4243, 0x402a, 0x4182, 0xbf2e, 0x16a0, 0xb213, 0x42b4, 0xb2fe, 0xb20f, 0xb23c, 0x0bb8, 0x43da, 0x4265, 0x42cb, 0xb02a, 0xb226, 0x43db, 0x421e, 0x41e7, 0x1f20, 0x22ca, 0x41d9, 0x1e79, 0xb00b, 0x41cf, 0x401b, 0x3174, 0xb0f4, 0x404a, 0xbf03, 0x4674, 0xb243, 0x43cb, 0x431a, 0x43cd, 0xb0af, 0x0481, 0xaca0, 0x419a, 0x3433, 0x43dc, 0x4197, 0x3d98, 0x19f0, 0x21f1, 0x42d2, 0xba2f, 0xa60c, 0x4337, 0x4102, 0x2851, 0xba4b, 0x44db, 0x4432, 0x422c, 0x4339, 0x4002, 0x1e4d, 0xbf7d, 0x434f, 0xb20d, 0xb00e, 0x3545, 0x41a7, 0x40bb, 0x03ab, 0xba58, 0x2faa, 0x45eb, 0x0643, 0x4098, 0xb2ff, 0xb038, 0xa185, 0x3d65, 0x062b, 0xb010, 0xb20e, 0x1fab, 0x417d, 0x46bc, 0x080c, 0x1913, 0x4146, 0xbfd3, 0x42af, 0x064d, 0xbaeb, 0xba5c, 0x2be1, 0xbf90, 0x404a, 0x0e2c, 0xba56, 0x434e, 0x4320, 0x4180, 0x4658, 0x42d3, 0x4281, 0x1986, 0x424a, 0x4281, 0xb28f, 0x42db, 0xbf6b, 0x41da, 0x42d3, 0xbaed, 0x43de, 0x1d8d, 0x04df, 0x1e09, 0x421f, 0xb21a, 0xb2eb, 0x41cf, 0xbff0, 0x44bb, 0x1ce0, 0x185f, 0x2ceb, 0x42a9, 0x1d0f, 0x4000, 0x1c0c, 0x4127, 0xba21, 0xbac3, 0x3822, 0x15bb, 0x3d53, 0xbf47, 0xb064, 0xb075, 0xb258, 0xba4e, 0x4314, 0x466c, 0x41d2, 0x1a9c, 0xb056, 0x413e, 0x4089, 0xb0d0, 0x40c2, 0x4202, 0x421f, 0x1ca7, 0xb2bc, 0x3348, 0xb280, 0xbf6a, 0xb0ae, 0x016e, 0xb0a7, 0x4672, 0x4147, 0x3098, 0xa236, 0xb00f, 0xbf1a, 0x4330, 0x42ec, 0xbf00, 0xba37, 0xb2b5, 0x4182, 0x4075, 0xb038, 0x413e, 0xba59, 0x45eb, 0xba2b, 0xbaf7, 0x44b1, 0x1dd1, 0x417b, 0x1a2c, 0x40d5, 0x438a, 0xb03a, 0x1d73, 0xb21e, 0xb25d, 0xb27f, 0xbf1e, 0x430a, 0xb0ec, 0x4159, 0x2733, 0x4247, 0x424a, 0xbf4a, 0xb263, 0x1b5f, 0x40ae, 0xb2fe, 0xbf76, 0x407d, 0xb28a, 0x1f72, 0x1e7c, 0x463c, 0x42c2, 0x40e7, 0x4166, 0x4380, 0x1603, 0x1b69, 0xb212, 0x1739, 0x4377, 0x3103, 0xbf49, 0x40ac, 0x278e, 0xb07d, 0x45c1, 0x1ef5, 0xbff0, 0xb2a0, 0x4379, 0x1956, 0xb233, 0xb26d, 0xbfdf, 0x463b, 0x4096, 0xaeb4, 0x17d4, 0x4663, 0xba6b, 0x4640, 0x3004, 0x404c, 0x46aa, 0xbaed, 0x3318, 0x44e5, 0x1d45, 0x1c9c, 0x1883, 0x425e, 0x0c46, 0xba40, 0xa97f, 0xbff0, 0x0b6c, 0x425e, 0x4207, 0x420c, 0x4257, 0xbf86, 0xabef, 0x40d0, 0x4050, 0x43bf, 0x38f6, 0xb240, 0x3692, 0xbf9c, 0x4288, 0x0c04, 0x41a9, 0xac55, 0xb0b2, 0x414c, 0x1b78, 0xb003, 0x3531, 0xb280, 0x0064, 0x4437, 0x1c72, 0x1f4c, 0xbf1c, 0x435e, 0x40fd, 0x3a0e, 0xbfa0, 0xba1b, 0x4060, 0xba2e, 0x3a97, 0xbaf7, 0x39bd, 0x4264, 0x4472, 0x4328, 0xbf49, 0x1acf, 0x42f6, 0x42b4, 0xb294, 0xb272, 0xb090, 0x4654, 0x4017, 0x467f, 0x468a, 0xace4, 0x44ed, 0x4557, 0x466a, 0x1257, 0x4153, 0xb05e, 0x4121, 0x41b0, 0x4393, 0x410b, 0xbaf3, 0x4556, 0x4242, 0x1f43, 0xbf1d, 0x42c3, 0xb240, 0x4038, 0x404b, 0x43e7, 0xb0fa, 0x420a, 0xbf9d, 0x4323, 0xb0a3, 0x4340, 0x42e9, 0x0052, 0x1cc4, 0x4305, 0x020b, 0xb09d, 0x411d, 0x2c14, 0xb0ee, 0x416c, 0x38f9, 0x4357, 0xb2b9, 0xb21f, 0x4152, 0xbfa4, 0xa537, 0x1f40, 0x0f0b, 0xa47e, 0x4040, 0xbade, 0x401b, 0xb006, 0x0394, 0x2d32, 0xbfba, 0x438b, 0x42b3, 0xb2b0, 0xa573, 0x02fc, 0x1ac5, 0x28b6, 0x43c8, 0x2d0f, 0x3b61, 0x423d, 0x262f, 0x411e, 0x43c5, 0x435d, 0x03e2, 0xae57, 0x1b6e, 0x4238, 0x4110, 0xbf31, 0x2052, 0x38bb, 0x454c, 0x2b69, 0x4009, 0x0ac4, 0x0dad, 0x41f9, 0x1f6e, 0x414d, 0x30e6, 0xb2ea, 0xbfa0, 0x0fbf, 0x42e4, 0xbfe0, 0x400e, 0x061f, 0x00c8, 0xba25, 0x427c, 0x38db, 0xbf5a, 0x44bd, 0x42c9, 0x417e, 0x032e, 0x4205, 0x2143, 0xaf50, 0xbfb2, 0x36cb, 0xb2f9, 0x402c, 0x427a, 0x4350, 0x4315, 0xb0a9, 0x402c, 0x0802, 0x3632, 0x4495, 0x4179, 0x1c57, 0x1bd3, 0xbfd8, 0xa483, 0x3213, 0x4113, 0x4341, 0xb2de, 0xba5c, 0x4246, 0xba0f, 0x0363, 0x3661, 0x41b0, 0xb0ae, 0x4138, 0x4143, 0xba45, 0xb2aa, 0xba01, 0x1824, 0xb049, 0x0a3a, 0x4096, 0xb0ea, 0x274a, 0x43eb, 0xb274, 0xbfde, 0x1aea, 0x417b, 0x0b2f, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd2fc5a9a, 0xcbe6f391, 0xc5271121, 0x66c4d03a, 0xce34ff10, 0xe796f79c, 0x37623fb3, 0x4d059abb, 0xf938c94f, 0x8d0659ac, 0xc525e62e, 0xad6bb1ea, 0xe561afeb, 0x8226b8c9, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0xfffec5fe, 0xfec5feff, 0x00807dfa, 0x0100013a, 0x00000000, 0xfefffec5, 0x00000000, 0x0000004a, 0xf938c94f, 0x0002e84e, 0xec28f749, 0xb5aec7a8, 0x000000c3, 0x69c37868, 0x00000000, 0x000001d0 }, + Instructions = [0x4283, 0xa90f, 0x4210, 0x1dab, 0x4172, 0x40c4, 0x40b1, 0x44d5, 0x2a9b, 0xba65, 0x4002, 0x1842, 0x308f, 0xb226, 0x42c5, 0x425c, 0x40fd, 0xb279, 0xba34, 0x4284, 0xbf60, 0x3d5d, 0x420c, 0x401a, 0x0e39, 0xbf79, 0x4395, 0x1ccb, 0x41ae, 0x1ddc, 0x4062, 0x44db, 0x2e06, 0x4389, 0x1d42, 0x1c39, 0x4347, 0xb298, 0xb007, 0x43a7, 0xb22a, 0xba22, 0xb22c, 0xba54, 0x4304, 0xa8d3, 0x42a8, 0x2c0a, 0x40a3, 0x2b03, 0x1b34, 0xb2ef, 0x06d3, 0xbf3a, 0x1d56, 0x1ef0, 0x0fa3, 0xb2a8, 0x1939, 0xbff0, 0x422c, 0x019c, 0x1f8e, 0x42cb, 0xbae4, 0x17be, 0x404e, 0xb2d3, 0x1fa5, 0xb209, 0x42ae, 0x2bb5, 0x424e, 0xb273, 0x4202, 0xba33, 0xb2af, 0x1d35, 0x1a2f, 0x1cf0, 0xb266, 0x2255, 0xbf3f, 0xac6b, 0x42f7, 0xb092, 0x1263, 0x46a9, 0x4099, 0x105a, 0x18b5, 0x34aa, 0x1b91, 0x4129, 0x1449, 0x4096, 0xb27a, 0x437a, 0x40f5, 0xb27d, 0x1628, 0xb242, 0x42da, 0x404b, 0xbfbb, 0xb077, 0x4297, 0x0570, 0x4152, 0x2525, 0x1be3, 0xbfe0, 0x4633, 0x12e2, 0x4547, 0xba67, 0x06a6, 0x40c9, 0x371b, 0xbfb0, 0x4201, 0x0101, 0xba0d, 0xbfd9, 0x4192, 0x2123, 0x4117, 0x428e, 0x4084, 0xba04, 0x417c, 0x4390, 0x41e5, 0x41ad, 0x462e, 0x46da, 0x4268, 0x40b4, 0xb279, 0xa5df, 0xb26a, 0xbf4d, 0x356c, 0x09bf, 0xb06e, 0xb292, 0xb2f2, 0x1897, 0x0d15, 0xb261, 0xb29b, 0x40e6, 0x3e3a, 0x46ba, 0x3342, 0x1d7b, 0x401c, 0xb0ce, 0x177f, 0x430d, 0x0189, 0x43ba, 0x4309, 0xb20f, 0xb228, 0xac9c, 0x086d, 0x13e5, 0xbf61, 0x1fc8, 0x41b5, 0x2273, 0x40ab, 0x4334, 0x43fd, 0xbf6d, 0x4304, 0x4286, 0x4372, 0xb213, 0x4426, 0x02e4, 0x40da, 0xb2bd, 0x441a, 0xbf79, 0x40c6, 0x1e05, 0x1b15, 0x420d, 0x4248, 0xbf60, 0xb093, 0x39aa, 0x40c8, 0x085d, 0x37e8, 0x400a, 0x15dc, 0x218d, 0xb223, 0x1910, 0xb248, 0xb00d, 0x4168, 0x44c2, 0x418d, 0xb0e5, 0xb0b2, 0x33e7, 0xa4e7, 0x43e3, 0x0066, 0x165b, 0x4231, 0xbfa7, 0x2e38, 0xb249, 0x431a, 0x4089, 0xba16, 0xa64d, 0x4181, 0xbfd0, 0x3a3f, 0xb258, 0x44cd, 0xaa78, 0x41d7, 0xa0cb, 0x4279, 0x4061, 0x41de, 0xb2bc, 0x4125, 0xae63, 0x41bc, 0x418f, 0xba71, 0xa347, 0xbf4f, 0x4666, 0xb204, 0x4202, 0x42db, 0xb006, 0xbf7b, 0x0978, 0x1c50, 0x1bc7, 0x1818, 0x053b, 0xbfb5, 0xa485, 0x4134, 0x27f9, 0x2199, 0xae03, 0x4126, 0x46e5, 0x1a12, 0x1ee6, 0xb22d, 0x2692, 0x4361, 0x411d, 0x4064, 0x4091, 0x3d71, 0x3936, 0xb2a0, 0x34de, 0xbfdf, 0x4552, 0x1bb7, 0x1a4a, 0x1264, 0x40d4, 0x1d83, 0x4227, 0xbfe0, 0x0a4d, 0x429b, 0x3aa5, 0x4055, 0x43f3, 0x1c83, 0xbf5a, 0x4567, 0x43f6, 0xa01f, 0x1cdc, 0x40bd, 0x41c3, 0x4223, 0x3fea, 0x422b, 0x3d0a, 0x18f7, 0x432d, 0x1e00, 0xbf04, 0xaf5d, 0x1b42, 0xb0e2, 0x46e4, 0xbf09, 0x463a, 0x4355, 0xb0dd, 0x44d2, 0xb24c, 0xba2b, 0xa14c, 0xbfc0, 0xb2b7, 0xba12, 0x43f1, 0xb294, 0x41b6, 0xb247, 0x0688, 0x43e8, 0x42c7, 0x4155, 0x43c4, 0x44fd, 0xa8d2, 0x19a7, 0xb2d5, 0xb035, 0xb2a8, 0x43fd, 0x455d, 0x4314, 0x1f85, 0xbf2c, 0x4287, 0x4154, 0x4204, 0xbf06, 0x4201, 0x408b, 0x40f5, 0x43f3, 0x43b4, 0x4329, 0x42ab, 0x45d0, 0xb093, 0x434c, 0x0f4f, 0x1d8c, 0x402f, 0xba58, 0x444c, 0xb294, 0x41b1, 0x42a7, 0x4177, 0xbfc7, 0x4560, 0xba10, 0xb28a, 0x41f7, 0x40c1, 0xb21b, 0x4068, 0xacc3, 0x41b5, 0x0829, 0x42eb, 0x408f, 0x46f9, 0x1c2f, 0xa7ff, 0xb27e, 0xb2a2, 0x194b, 0x4182, 0x3acc, 0x1527, 0x4143, 0x40f4, 0x3a3c, 0xb2ea, 0x44b5, 0x4076, 0xbf69, 0x34c1, 0x43ce, 0xb299, 0x18d5, 0xbfa0, 0xb24d, 0xbf15, 0x427e, 0xb003, 0x4289, 0xba4b, 0x356d, 0xb2a7, 0xa497, 0xba5a, 0x405e, 0xb249, 0xb2a7, 0x4176, 0x426b, 0xb204, 0xaea9, 0x4110, 0x2479, 0x3502, 0x46ca, 0xbfbc, 0x4321, 0x41f4, 0x4170, 0xba41, 0x1d2c, 0xba4a, 0x11a4, 0x009a, 0x28c5, 0x43d3, 0xbfcf, 0x4034, 0xabeb, 0xaac6, 0xa608, 0x4056, 0x338f, 0x0394, 0xb02f, 0x4274, 0xa5c6, 0x1be8, 0x40fc, 0x4029, 0xb2b5, 0x0227, 0x090b, 0xbacc, 0x1116, 0x2c45, 0x08ee, 0x14fa, 0xbf82, 0x405a, 0x423f, 0xba2a, 0x4052, 0x4200, 0xa671, 0x0efd, 0x42de, 0x1e89, 0xb049, 0xb264, 0x3e26, 0x41d5, 0x4445, 0x32af, 0xb0e8, 0xbafb, 0xb0f7, 0x4093, 0xb034, 0xb2e8, 0x2e69, 0xb259, 0x2479, 0x439d, 0xb2de, 0x1b5b, 0xbf8c, 0x437b, 0xbad1, 0x217d, 0x4093, 0xb2e6, 0x1972, 0xb2e5, 0x1d51, 0x4210, 0x4310, 0xb20c, 0xad06, 0x1879, 0x40b7, 0x4077, 0xbfbd, 0x1fa9, 0xb00b, 0x40bf, 0xbaf2, 0xa690, 0x4298, 0xa00d, 0x2c47, 0x1e51, 0x41c2, 0x42dc, 0xbf6e, 0xb0c0, 0x2ddd, 0x43b9, 0xba69, 0xa0f1, 0x1c40, 0xbfe0, 0xba04, 0x4263, 0xba26, 0xa397, 0x1731, 0x0de3, 0x40bc, 0xa1e7, 0x411c, 0x4005, 0x417a, 0xb043, 0x43d3, 0x42a1, 0x4053, 0x42e8, 0xb0eb, 0xbf16, 0x1c21, 0x4442, 0xbf80, 0x4164, 0x401e, 0x41e5, 0x18d4, 0xb241, 0x45ed, 0x4037, 0xba05, 0x415a, 0xbf25, 0xa2a9, 0x0e62, 0x26af, 0x182b, 0x4134, 0xa7ee, 0x4212, 0x42bd, 0x4243, 0x402a, 0x4182, 0xbf2e, 0x16a0, 0xb213, 0x42b4, 0xb2fe, 0xb20f, 0xb23c, 0x0bb8, 0x43da, 0x4265, 0x42cb, 0xb02a, 0xb226, 0x43db, 0x421e, 0x41e7, 0x1f20, 0x22ca, 0x41d9, 0x1e79, 0xb00b, 0x41cf, 0x401b, 0x3174, 0xb0f4, 0x404a, 0xbf03, 0x4674, 0xb243, 0x43cb, 0x431a, 0x43cd, 0xb0af, 0x0481, 0xaca0, 0x419a, 0x3433, 0x43dc, 0x4197, 0x3d98, 0x19f0, 0x21f1, 0x42d2, 0xba2f, 0xa60c, 0x4337, 0x4102, 0x2851, 0xba4b, 0x44db, 0x4432, 0x422c, 0x4339, 0x4002, 0x1e4d, 0xbf7d, 0x434f, 0xb20d, 0xb00e, 0x3545, 0x41a7, 0x40bb, 0x03ab, 0xba58, 0x2faa, 0x45eb, 0x0643, 0x4098, 0xb2ff, 0xb038, 0xa185, 0x3d65, 0x062b, 0xb010, 0xb20e, 0x1fab, 0x417d, 0x46bc, 0x080c, 0x1913, 0x4146, 0xbfd3, 0x42af, 0x064d, 0xbaeb, 0xba5c, 0x2be1, 0xbf90, 0x404a, 0x0e2c, 0xba56, 0x434e, 0x4320, 0x4180, 0x4658, 0x42d3, 0x4281, 0x1986, 0x424a, 0x4281, 0xb28f, 0x42db, 0xbf6b, 0x41da, 0x42d3, 0xbaed, 0x43de, 0x1d8d, 0x04df, 0x1e09, 0x421f, 0xb21a, 0xb2eb, 0x41cf, 0xbff0, 0x44bb, 0x1ce0, 0x185f, 0x2ceb, 0x42a9, 0x1d0f, 0x4000, 0x1c0c, 0x4127, 0xba21, 0xbac3, 0x3822, 0x15bb, 0x3d53, 0xbf47, 0xb064, 0xb075, 0xb258, 0xba4e, 0x4314, 0x466c, 0x41d2, 0x1a9c, 0xb056, 0x413e, 0x4089, 0xb0d0, 0x40c2, 0x4202, 0x421f, 0x1ca7, 0xb2bc, 0x3348, 0xb280, 0xbf6a, 0xb0ae, 0x016e, 0xb0a7, 0x4672, 0x4147, 0x3098, 0xa236, 0xb00f, 0xbf1a, 0x4330, 0x42ec, 0xbf00, 0xba37, 0xb2b5, 0x4182, 0x4075, 0xb038, 0x413e, 0xba59, 0x45eb, 0xba2b, 0xbaf7, 0x44b1, 0x1dd1, 0x417b, 0x1a2c, 0x40d5, 0x438a, 0xb03a, 0x1d73, 0xb21e, 0xb25d, 0xb27f, 0xbf1e, 0x430a, 0xb0ec, 0x4159, 0x2733, 0x4247, 0x424a, 0xbf4a, 0xb263, 0x1b5f, 0x40ae, 0xb2fe, 0xbf76, 0x407d, 0xb28a, 0x1f72, 0x1e7c, 0x463c, 0x42c2, 0x40e7, 0x4166, 0x4380, 0x1603, 0x1b69, 0xb212, 0x1739, 0x4377, 0x3103, 0xbf49, 0x40ac, 0x278e, 0xb07d, 0x45c1, 0x1ef5, 0xbff0, 0xb2a0, 0x4379, 0x1956, 0xb233, 0xb26d, 0xbfdf, 0x463b, 0x4096, 0xaeb4, 0x17d4, 0x4663, 0xba6b, 0x4640, 0x3004, 0x404c, 0x46aa, 0xbaed, 0x3318, 0x44e5, 0x1d45, 0x1c9c, 0x1883, 0x425e, 0x0c46, 0xba40, 0xa97f, 0xbff0, 0x0b6c, 0x425e, 0x4207, 0x420c, 0x4257, 0xbf86, 0xabef, 0x40d0, 0x4050, 0x43bf, 0x38f6, 0xb240, 0x3692, 0xbf9c, 0x4288, 0x0c04, 0x41a9, 0xac55, 0xb0b2, 0x414c, 0x1b78, 0xb003, 0x3531, 0xb280, 0x0064, 0x4437, 0x1c72, 0x1f4c, 0xbf1c, 0x435e, 0x40fd, 0x3a0e, 0xbfa0, 0xba1b, 0x4060, 0xba2e, 0x3a97, 0xbaf7, 0x39bd, 0x4264, 0x4472, 0x4328, 0xbf49, 0x1acf, 0x42f6, 0x42b4, 0xb294, 0xb272, 0xb090, 0x4654, 0x4017, 0x467f, 0x468a, 0xace4, 0x44ed, 0x4557, 0x466a, 0x1257, 0x4153, 0xb05e, 0x4121, 0x41b0, 0x4393, 0x410b, 0xbaf3, 0x4556, 0x4242, 0x1f43, 0xbf1d, 0x42c3, 0xb240, 0x4038, 0x404b, 0x43e7, 0xb0fa, 0x420a, 0xbf9d, 0x4323, 0xb0a3, 0x4340, 0x42e9, 0x0052, 0x1cc4, 0x4305, 0x020b, 0xb09d, 0x411d, 0x2c14, 0xb0ee, 0x416c, 0x38f9, 0x4357, 0xb2b9, 0xb21f, 0x4152, 0xbfa4, 0xa537, 0x1f40, 0x0f0b, 0xa47e, 0x4040, 0xbade, 0x401b, 0xb006, 0x0394, 0x2d32, 0xbfba, 0x438b, 0x42b3, 0xb2b0, 0xa573, 0x02fc, 0x1ac5, 0x28b6, 0x43c8, 0x2d0f, 0x3b61, 0x423d, 0x262f, 0x411e, 0x43c5, 0x435d, 0x03e2, 0xae57, 0x1b6e, 0x4238, 0x4110, 0xbf31, 0x2052, 0x38bb, 0x454c, 0x2b69, 0x4009, 0x0ac4, 0x0dad, 0x41f9, 0x1f6e, 0x414d, 0x30e6, 0xb2ea, 0xbfa0, 0x0fbf, 0x42e4, 0xbfe0, 0x400e, 0x061f, 0x00c8, 0xba25, 0x427c, 0x38db, 0xbf5a, 0x44bd, 0x42c9, 0x417e, 0x032e, 0x4205, 0x2143, 0xaf50, 0xbfb2, 0x36cb, 0xb2f9, 0x402c, 0x427a, 0x4350, 0x4315, 0xb0a9, 0x402c, 0x0802, 0x3632, 0x4495, 0x4179, 0x1c57, 0x1bd3, 0xbfd8, 0xa483, 0x3213, 0x4113, 0x4341, 0xb2de, 0xba5c, 0x4246, 0xba0f, 0x0363, 0x3661, 0x41b0, 0xb0ae, 0x4138, 0x4143, 0xba45, 0xb2aa, 0xba01, 0x1824, 0xb049, 0x0a3a, 0x4096, 0xb0ea, 0x274a, 0x43eb, 0xb274, 0xbfde, 0x1aea, 0x417b, 0x0b2f, 0x4770, 0xe7fe + ], + StartRegs = [0xd2fc5a9a, 0xcbe6f391, 0xc5271121, 0x66c4d03a, 0xce34ff10, 0xe796f79c, 0x37623fb3, 0x4d059abb, 0xf938c94f, 0x8d0659ac, 0xc525e62e, 0xad6bb1ea, 0xe561afeb, 0x8226b8c9, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0xfffec5fe, 0xfec5feff, 0x00807dfa, 0x0100013a, 0x00000000, 0xfefffec5, 0x00000000, 0x0000004a, 0xf938c94f, 0x0002e84e, 0xec28f749, 0xb5aec7a8, 0x000000c3, 0x69c37868, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x1d4f, 0xbfc5, 0xb068, 0x40ba, 0x3da9, 0xaeb3, 0x40b6, 0xa066, 0x13be, 0x4028, 0x4049, 0xba69, 0x4602, 0xbfaf, 0x21d5, 0x1879, 0xa68c, 0xa2f5, 0x41f6, 0x0953, 0xbfd0, 0x2aeb, 0x1d85, 0x3904, 0x38c6, 0xb07e, 0x4079, 0x04e6, 0x1634, 0xbf3c, 0x40cd, 0x4237, 0x41ca, 0xbf72, 0x41ee, 0x1cc9, 0xac16, 0x435a, 0xa938, 0x1f53, 0x3c3e, 0xbf9b, 0xb0b9, 0xb0fa, 0x2372, 0x031a, 0xb011, 0xa5c9, 0x2022, 0xb062, 0x40d8, 0xb223, 0x2f62, 0x46a8, 0xb0f8, 0x4201, 0x4398, 0x19ce, 0x404a, 0xa2b4, 0x2542, 0x41c1, 0xbfc1, 0x42af, 0xb065, 0x20ad, 0x1db5, 0x405a, 0x4008, 0x42bd, 0x0eb3, 0x19c3, 0x414f, 0x4288, 0xb2fe, 0x423d, 0x41ff, 0x4285, 0x4249, 0x42a4, 0xbfe2, 0x4226, 0x1c2a, 0x1323, 0xaf72, 0xb008, 0x42a1, 0x14d3, 0x12cd, 0x4655, 0xb2b7, 0xadf9, 0xba1c, 0x40b0, 0xb21d, 0x4045, 0x1ba6, 0x41d3, 0x41ee, 0xbf6a, 0x416b, 0x3ed9, 0x424d, 0xb238, 0x420e, 0xb22f, 0x4013, 0x3404, 0x41bc, 0x08d8, 0xba7f, 0x407c, 0x1924, 0x424b, 0xb2cc, 0xb232, 0x0896, 0x2a78, 0x43b1, 0x437c, 0xa967, 0x4546, 0xbf8f, 0x4039, 0xa773, 0x40f6, 0xb236, 0xb2e8, 0x43fa, 0x1b34, 0x420e, 0xa787, 0x43a8, 0x2f7a, 0x40b1, 0x46d1, 0x1c90, 0x41ad, 0x4200, 0xba78, 0xbf9f, 0x406d, 0x23c7, 0x0b7f, 0xb2ed, 0x3622, 0x1dd2, 0x425a, 0x43bc, 0xb0ea, 0x4544, 0xa6be, 0x460e, 0x1722, 0x42e9, 0x273e, 0x4366, 0x4691, 0xa936, 0x41a2, 0xbf2e, 0x3231, 0x42a6, 0x43da, 0x2f37, 0x1d1a, 0xb26c, 0xbaff, 0x404c, 0x4132, 0x4076, 0x43fc, 0xb218, 0xba40, 0x4337, 0x385b, 0xb265, 0xb018, 0x462a, 0xba63, 0x41e6, 0xbf59, 0x4289, 0x1fa7, 0x40d7, 0xba59, 0xba5a, 0x0422, 0x07af, 0x428d, 0xb211, 0x4355, 0x431d, 0xbf51, 0x39c4, 0x1ee0, 0x0119, 0x414d, 0xa186, 0x1809, 0x42b4, 0x4065, 0xb2db, 0x43e6, 0xb26c, 0x45b6, 0x1be2, 0xb2ac, 0x42a9, 0x4067, 0xaf6c, 0xb2df, 0xbf1b, 0x4299, 0xb015, 0xb064, 0x44c9, 0x43f8, 0x2914, 0x1c11, 0x2d02, 0x1ebc, 0x43bb, 0x400e, 0x1cb3, 0x4246, 0xb00a, 0xb003, 0xbfb0, 0x1909, 0x3166, 0x30fd, 0xb25f, 0x1c45, 0x1e5e, 0xba68, 0xbf5a, 0x43a4, 0x1a5e, 0x4080, 0x050c, 0xbfc0, 0x14c5, 0x41c0, 0x438e, 0x416e, 0xba10, 0x1a22, 0xb0c6, 0x3aaf, 0x43a3, 0x0345, 0xbf72, 0xb248, 0x44c3, 0x42a4, 0xba19, 0x1e6b, 0x4475, 0x4347, 0xb29a, 0xb285, 0xb2dc, 0x40e7, 0x18bd, 0x4022, 0xb26f, 0xb01e, 0x4329, 0x4592, 0xa298, 0x433b, 0x2c82, 0x413d, 0xbf6e, 0x4554, 0x418b, 0xb0ab, 0x1a76, 0x4015, 0x4050, 0x4613, 0x42a6, 0x435b, 0x467c, 0x0354, 0x3662, 0x093c, 0xb2a8, 0xb2f2, 0x42db, 0x41ff, 0x4030, 0x420c, 0xb063, 0x4580, 0xbf1f, 0x07e2, 0x408b, 0xb0af, 0xb096, 0xba7c, 0xb273, 0x4336, 0x4628, 0x2ede, 0x4249, 0x41fa, 0x3d4c, 0x43b4, 0x40b6, 0x4132, 0xb2c7, 0x138e, 0x2c2a, 0xafa8, 0xb284, 0x1fcc, 0xbad1, 0xba35, 0x40d2, 0xae8d, 0x40b7, 0xb0ef, 0xb245, 0xbf88, 0x1aa3, 0x36d9, 0x4217, 0x0d64, 0x4247, 0xb07b, 0x4093, 0x4398, 0xbf95, 0xbaeb, 0x41db, 0x009d, 0x2ac3, 0xb298, 0x3a13, 0x4361, 0x072c, 0x01ba, 0x1b20, 0x1bc5, 0x404b, 0x0f91, 0x4129, 0xb01a, 0x0794, 0x4001, 0x406a, 0x273d, 0x40a3, 0x4021, 0x441a, 0x418d, 0x4161, 0xbf2f, 0x40d9, 0xbfe0, 0x0fdc, 0x1ae0, 0x37ff, 0x42ed, 0xb0a6, 0x2e0f, 0xa6c5, 0xb0ba, 0x19cc, 0xb21f, 0x220f, 0xb2d3, 0x1dbf, 0x433e, 0x44f4, 0x36f5, 0x422f, 0x1a45, 0x052c, 0x40fd, 0x4285, 0x4294, 0xbae3, 0xba73, 0x42e7, 0xbfab, 0x40f3, 0xba5f, 0x168e, 0x405c, 0x4200, 0x4267, 0xba7d, 0x42ca, 0xb294, 0x42a6, 0x43b9, 0xb2d1, 0x40b4, 0xa04c, 0x18b5, 0x4627, 0x3b0d, 0x4292, 0x460c, 0x4133, 0xb2c5, 0x40f7, 0x42cd, 0xbf21, 0x1c7e, 0x2cb5, 0x2027, 0x4689, 0xb20f, 0xbfd4, 0x1f88, 0xa0aa, 0x1a08, 0xa41d, 0xb2dc, 0x1cae, 0x423e, 0x40e5, 0x43ea, 0x182c, 0xbadd, 0x4349, 0x41b3, 0x1a46, 0x4545, 0xbff0, 0x19b3, 0x3943, 0x0759, 0x36e9, 0x42ff, 0x27f6, 0x0bda, 0x22f4, 0xbf9e, 0x405a, 0x2a35, 0xb2bf, 0x432c, 0x0307, 0xab18, 0x4128, 0x4350, 0x1eae, 0xac20, 0x411d, 0xb2bc, 0x39f4, 0x43b9, 0x4065, 0x1f99, 0x1fc1, 0x4245, 0xa9e3, 0x456e, 0x41ae, 0x4251, 0x4292, 0x4277, 0xbf3a, 0xba5e, 0xb205, 0xb27b, 0x40ca, 0xb233, 0xb037, 0x411f, 0x2fdc, 0xba7a, 0xb0d7, 0x42fa, 0x2a0d, 0x29bf, 0x46ad, 0xb062, 0xa1f5, 0x1f2f, 0x434b, 0x41f3, 0x2f98, 0xbf72, 0x41c9, 0x40da, 0xa73f, 0x4388, 0x42bf, 0xb201, 0x342d, 0x41d8, 0xb2e2, 0xb2a8, 0x2e8d, 0x4096, 0xb280, 0xba42, 0x40fd, 0x418e, 0x4616, 0x1902, 0x4162, 0x1a4b, 0xbfbc, 0xb22c, 0x4108, 0x432f, 0x46bb, 0x46c9, 0xba32, 0x1a44, 0xae82, 0x45c4, 0xba4d, 0x12e4, 0x4273, 0xbaf9, 0xbfd0, 0x43ab, 0x193e, 0x46e9, 0xb09f, 0x116a, 0x4062, 0xbf4b, 0x3063, 0x4186, 0x4022, 0x4413, 0x1e60, 0x4221, 0xb067, 0x42cc, 0x43b5, 0xbaec, 0x2f0a, 0xba21, 0x40f1, 0xb021, 0x42c5, 0x41b5, 0x4408, 0x019a, 0x1bce, 0x4445, 0xbade, 0x3ba5, 0x1b4c, 0x3db9, 0x407c, 0xba29, 0x438a, 0x28d3, 0xbf36, 0x464d, 0x426d, 0x3ef8, 0xb2d1, 0x41b4, 0x1b02, 0xb2b2, 0x18f4, 0x436a, 0x1c88, 0x3013, 0xb2e5, 0xb0fb, 0xb20a, 0x1f07, 0xaaf3, 0xb09b, 0x4150, 0xbf44, 0x425f, 0xb26c, 0xba7d, 0xbfda, 0x1a16, 0x2eb2, 0x4127, 0x4358, 0xbf25, 0x1e43, 0xb26e, 0x46b5, 0xb2f1, 0xb20f, 0x4190, 0xba77, 0xb2d0, 0xb256, 0x192d, 0x1c18, 0x0155, 0x4019, 0xbaf7, 0x424e, 0xba74, 0xb28c, 0xba1e, 0x1a15, 0xb084, 0x3be4, 0xbf44, 0x4244, 0xba70, 0x4109, 0x0237, 0xb2fb, 0x43fb, 0x4113, 0xbae0, 0xa7a3, 0x4552, 0x422f, 0xb291, 0xb263, 0xbfd4, 0xb22b, 0x2765, 0xbaf4, 0xb049, 0x1a38, 0x405e, 0x1b6f, 0xb25e, 0xba65, 0x0639, 0x4581, 0xbaca, 0x41a7, 0x1c50, 0x4030, 0x4272, 0x435e, 0xbf43, 0x4225, 0x180c, 0x42f2, 0x416f, 0x429f, 0xbad2, 0x40bd, 0x448d, 0x417e, 0xb220, 0x10d2, 0xbf06, 0x4068, 0x3614, 0x1307, 0x432a, 0x46d0, 0x4233, 0x41c4, 0x46f3, 0x1c04, 0x40a0, 0xaa36, 0xbaf7, 0xb2e8, 0x425c, 0x42ba, 0x3767, 0xb20e, 0x400b, 0xb087, 0x1886, 0x2c3e, 0x2840, 0xb06a, 0xbf05, 0x43a1, 0xb250, 0x4543, 0x412c, 0x22a1, 0x41c1, 0x4133, 0x1976, 0x404f, 0x425a, 0xaad6, 0x41ed, 0x40a4, 0x4333, 0x4278, 0xb04c, 0x41c5, 0x42c3, 0x336a, 0x4004, 0x411b, 0xb24b, 0x4399, 0x43b7, 0x4098, 0x4180, 0xbf7b, 0x41d0, 0x423c, 0x4301, 0x416c, 0x432b, 0xb2a3, 0xb2a2, 0xb0d9, 0x42df, 0x1237, 0x43d1, 0x437d, 0x41fd, 0x4352, 0xba00, 0xbf6b, 0x1c45, 0x0c59, 0x21e6, 0x1d8a, 0x1a4b, 0x43cf, 0x098f, 0x2f7b, 0x4307, 0xba68, 0x4093, 0xb2cf, 0x4106, 0x19a1, 0x0fd2, 0xbac5, 0x1a26, 0x43da, 0x4279, 0x40dd, 0xbf01, 0xb0b5, 0x41e6, 0x3dc6, 0x406f, 0xb258, 0x19fe, 0x40e1, 0xba16, 0x4267, 0x4093, 0xb2e8, 0x42c0, 0xb282, 0x4083, 0xb269, 0x40f8, 0x3805, 0xbfc3, 0x437a, 0x425d, 0xb0f4, 0x2503, 0x4074, 0xb021, 0xbfaa, 0x42f4, 0x413d, 0x42c7, 0x0bf2, 0xb06c, 0x1949, 0x40e4, 0x40b4, 0x1a5d, 0xbf13, 0xb2a1, 0x230b, 0xb0e9, 0xb294, 0x46b8, 0x2508, 0xb09d, 0xb24f, 0xb0d1, 0xad5e, 0xbfb2, 0x4037, 0xba4b, 0x1f76, 0x1ed9, 0x412a, 0xbf90, 0x4694, 0xb0aa, 0x39bf, 0x4070, 0x4492, 0x0b7e, 0xa95a, 0xb08c, 0x0ebd, 0x4381, 0xa285, 0x3e4b, 0xbf07, 0x4159, 0xae4d, 0x4269, 0xb277, 0x46d3, 0x29f9, 0x45be, 0x4362, 0x1925, 0xba2a, 0x4573, 0x0196, 0xb2ea, 0x434c, 0xb26d, 0xbae2, 0x1e42, 0x411c, 0x416e, 0x4259, 0xb28b, 0xbfe2, 0xbac6, 0x437e, 0x076e, 0x41ba, 0x407a, 0x45f1, 0x4205, 0xb289, 0x1840, 0x4027, 0x4190, 0x408f, 0xb23c, 0x419a, 0x001e, 0xb0b6, 0x4081, 0xba25, 0xa216, 0xb2ff, 0x405c, 0x18ad, 0x426a, 0x4179, 0xb21a, 0xbf8a, 0x4312, 0x44d3, 0xba1d, 0x42a8, 0x283f, 0x4169, 0x13bc, 0xb00d, 0xaac5, 0x403a, 0x439d, 0xaaca, 0x4369, 0x1c07, 0x4256, 0x434e, 0xb054, 0x1634, 0xbfdf, 0x1ab7, 0x3f94, 0x1b06, 0x42f4, 0x407e, 0x058b, 0x409a, 0xba4b, 0x180e, 0xaf82, 0x43f8, 0x161d, 0x44e0, 0xbf14, 0x4215, 0x1acc, 0x401a, 0x402e, 0x41e4, 0x4678, 0x1d6b, 0x1d43, 0x427b, 0x015f, 0xaf31, 0x41de, 0x0fa6, 0xbf45, 0xb2c8, 0x417c, 0x438b, 0x45be, 0x4334, 0xba6f, 0x429a, 0xbf00, 0xb2ad, 0x4342, 0x4154, 0xbf26, 0xb2ad, 0x4347, 0x16db, 0x4423, 0x40ac, 0x4384, 0xb270, 0xb005, 0x42b8, 0x4305, 0xba31, 0x1d89, 0x2ca0, 0xb21f, 0xba55, 0xba38, 0xb26a, 0x30c9, 0xb20e, 0xb224, 0x4069, 0x431a, 0x43fa, 0xa8e2, 0x41a8, 0x40f1, 0x4253, 0x1eae, 0xbf0b, 0x405d, 0x3e93, 0x43ec, 0x45a3, 0xb267, 0x1c8a, 0x19fc, 0x417c, 0xb214, 0x4350, 0x4083, 0x2458, 0x42cc, 0x40f4, 0x40f0, 0x31dd, 0x43b0, 0xb2bf, 0x419f, 0xb2bb, 0x41f0, 0xbfbd, 0x42bd, 0x1c0f, 0xb06e, 0x4085, 0x43ea, 0xb2c7, 0xb0c4, 0x428a, 0x4294, 0xb2ea, 0x44d1, 0x4374, 0x4361, 0x41bf, 0xa12e, 0x02fa, 0xbac8, 0xbf15, 0x4004, 0x3b3a, 0x05be, 0x41c9, 0x40ab, 0xbadf, 0x3b7c, 0xb075, 0x2c0e, 0x02fb, 0x18b4, 0x19f6, 0x43eb, 0xb254, 0x431d, 0x40e1, 0x40f1, 0x0f2a, 0x4248, 0xbf95, 0xa360, 0x4095, 0x1a15, 0x4387, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x14152dbc, 0xac42cb3d, 0x80d39deb, 0xf842bf41, 0xc80af0cb, 0xb2924a15, 0xe20c7a41, 0xd0c9f409, 0xfd5e5b81, 0x4d1dced7, 0x6694566b, 0x954b09bd, 0x823d8b85, 0xd32e765b, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0xffffe7a0, 0x00001860, 0x0000000f, 0x00001958, 0x00000000, 0x0000186f, 0xffc00000, 0x00000000, 0x00000000, 0x669456ff, 0x6694566b, 0xcd28acd6, 0x00000000, 0x000060e9, 0x00000000, 0x800001d0 }, + Instructions = [0x1d4f, 0xbfc5, 0xb068, 0x40ba, 0x3da9, 0xaeb3, 0x40b6, 0xa066, 0x13be, 0x4028, 0x4049, 0xba69, 0x4602, 0xbfaf, 0x21d5, 0x1879, 0xa68c, 0xa2f5, 0x41f6, 0x0953, 0xbfd0, 0x2aeb, 0x1d85, 0x3904, 0x38c6, 0xb07e, 0x4079, 0x04e6, 0x1634, 0xbf3c, 0x40cd, 0x4237, 0x41ca, 0xbf72, 0x41ee, 0x1cc9, 0xac16, 0x435a, 0xa938, 0x1f53, 0x3c3e, 0xbf9b, 0xb0b9, 0xb0fa, 0x2372, 0x031a, 0xb011, 0xa5c9, 0x2022, 0xb062, 0x40d8, 0xb223, 0x2f62, 0x46a8, 0xb0f8, 0x4201, 0x4398, 0x19ce, 0x404a, 0xa2b4, 0x2542, 0x41c1, 0xbfc1, 0x42af, 0xb065, 0x20ad, 0x1db5, 0x405a, 0x4008, 0x42bd, 0x0eb3, 0x19c3, 0x414f, 0x4288, 0xb2fe, 0x423d, 0x41ff, 0x4285, 0x4249, 0x42a4, 0xbfe2, 0x4226, 0x1c2a, 0x1323, 0xaf72, 0xb008, 0x42a1, 0x14d3, 0x12cd, 0x4655, 0xb2b7, 0xadf9, 0xba1c, 0x40b0, 0xb21d, 0x4045, 0x1ba6, 0x41d3, 0x41ee, 0xbf6a, 0x416b, 0x3ed9, 0x424d, 0xb238, 0x420e, 0xb22f, 0x4013, 0x3404, 0x41bc, 0x08d8, 0xba7f, 0x407c, 0x1924, 0x424b, 0xb2cc, 0xb232, 0x0896, 0x2a78, 0x43b1, 0x437c, 0xa967, 0x4546, 0xbf8f, 0x4039, 0xa773, 0x40f6, 0xb236, 0xb2e8, 0x43fa, 0x1b34, 0x420e, 0xa787, 0x43a8, 0x2f7a, 0x40b1, 0x46d1, 0x1c90, 0x41ad, 0x4200, 0xba78, 0xbf9f, 0x406d, 0x23c7, 0x0b7f, 0xb2ed, 0x3622, 0x1dd2, 0x425a, 0x43bc, 0xb0ea, 0x4544, 0xa6be, 0x460e, 0x1722, 0x42e9, 0x273e, 0x4366, 0x4691, 0xa936, 0x41a2, 0xbf2e, 0x3231, 0x42a6, 0x43da, 0x2f37, 0x1d1a, 0xb26c, 0xbaff, 0x404c, 0x4132, 0x4076, 0x43fc, 0xb218, 0xba40, 0x4337, 0x385b, 0xb265, 0xb018, 0x462a, 0xba63, 0x41e6, 0xbf59, 0x4289, 0x1fa7, 0x40d7, 0xba59, 0xba5a, 0x0422, 0x07af, 0x428d, 0xb211, 0x4355, 0x431d, 0xbf51, 0x39c4, 0x1ee0, 0x0119, 0x414d, 0xa186, 0x1809, 0x42b4, 0x4065, 0xb2db, 0x43e6, 0xb26c, 0x45b6, 0x1be2, 0xb2ac, 0x42a9, 0x4067, 0xaf6c, 0xb2df, 0xbf1b, 0x4299, 0xb015, 0xb064, 0x44c9, 0x43f8, 0x2914, 0x1c11, 0x2d02, 0x1ebc, 0x43bb, 0x400e, 0x1cb3, 0x4246, 0xb00a, 0xb003, 0xbfb0, 0x1909, 0x3166, 0x30fd, 0xb25f, 0x1c45, 0x1e5e, 0xba68, 0xbf5a, 0x43a4, 0x1a5e, 0x4080, 0x050c, 0xbfc0, 0x14c5, 0x41c0, 0x438e, 0x416e, 0xba10, 0x1a22, 0xb0c6, 0x3aaf, 0x43a3, 0x0345, 0xbf72, 0xb248, 0x44c3, 0x42a4, 0xba19, 0x1e6b, 0x4475, 0x4347, 0xb29a, 0xb285, 0xb2dc, 0x40e7, 0x18bd, 0x4022, 0xb26f, 0xb01e, 0x4329, 0x4592, 0xa298, 0x433b, 0x2c82, 0x413d, 0xbf6e, 0x4554, 0x418b, 0xb0ab, 0x1a76, 0x4015, 0x4050, 0x4613, 0x42a6, 0x435b, 0x467c, 0x0354, 0x3662, 0x093c, 0xb2a8, 0xb2f2, 0x42db, 0x41ff, 0x4030, 0x420c, 0xb063, 0x4580, 0xbf1f, 0x07e2, 0x408b, 0xb0af, 0xb096, 0xba7c, 0xb273, 0x4336, 0x4628, 0x2ede, 0x4249, 0x41fa, 0x3d4c, 0x43b4, 0x40b6, 0x4132, 0xb2c7, 0x138e, 0x2c2a, 0xafa8, 0xb284, 0x1fcc, 0xbad1, 0xba35, 0x40d2, 0xae8d, 0x40b7, 0xb0ef, 0xb245, 0xbf88, 0x1aa3, 0x36d9, 0x4217, 0x0d64, 0x4247, 0xb07b, 0x4093, 0x4398, 0xbf95, 0xbaeb, 0x41db, 0x009d, 0x2ac3, 0xb298, 0x3a13, 0x4361, 0x072c, 0x01ba, 0x1b20, 0x1bc5, 0x404b, 0x0f91, 0x4129, 0xb01a, 0x0794, 0x4001, 0x406a, 0x273d, 0x40a3, 0x4021, 0x441a, 0x418d, 0x4161, 0xbf2f, 0x40d9, 0xbfe0, 0x0fdc, 0x1ae0, 0x37ff, 0x42ed, 0xb0a6, 0x2e0f, 0xa6c5, 0xb0ba, 0x19cc, 0xb21f, 0x220f, 0xb2d3, 0x1dbf, 0x433e, 0x44f4, 0x36f5, 0x422f, 0x1a45, 0x052c, 0x40fd, 0x4285, 0x4294, 0xbae3, 0xba73, 0x42e7, 0xbfab, 0x40f3, 0xba5f, 0x168e, 0x405c, 0x4200, 0x4267, 0xba7d, 0x42ca, 0xb294, 0x42a6, 0x43b9, 0xb2d1, 0x40b4, 0xa04c, 0x18b5, 0x4627, 0x3b0d, 0x4292, 0x460c, 0x4133, 0xb2c5, 0x40f7, 0x42cd, 0xbf21, 0x1c7e, 0x2cb5, 0x2027, 0x4689, 0xb20f, 0xbfd4, 0x1f88, 0xa0aa, 0x1a08, 0xa41d, 0xb2dc, 0x1cae, 0x423e, 0x40e5, 0x43ea, 0x182c, 0xbadd, 0x4349, 0x41b3, 0x1a46, 0x4545, 0xbff0, 0x19b3, 0x3943, 0x0759, 0x36e9, 0x42ff, 0x27f6, 0x0bda, 0x22f4, 0xbf9e, 0x405a, 0x2a35, 0xb2bf, 0x432c, 0x0307, 0xab18, 0x4128, 0x4350, 0x1eae, 0xac20, 0x411d, 0xb2bc, 0x39f4, 0x43b9, 0x4065, 0x1f99, 0x1fc1, 0x4245, 0xa9e3, 0x456e, 0x41ae, 0x4251, 0x4292, 0x4277, 0xbf3a, 0xba5e, 0xb205, 0xb27b, 0x40ca, 0xb233, 0xb037, 0x411f, 0x2fdc, 0xba7a, 0xb0d7, 0x42fa, 0x2a0d, 0x29bf, 0x46ad, 0xb062, 0xa1f5, 0x1f2f, 0x434b, 0x41f3, 0x2f98, 0xbf72, 0x41c9, 0x40da, 0xa73f, 0x4388, 0x42bf, 0xb201, 0x342d, 0x41d8, 0xb2e2, 0xb2a8, 0x2e8d, 0x4096, 0xb280, 0xba42, 0x40fd, 0x418e, 0x4616, 0x1902, 0x4162, 0x1a4b, 0xbfbc, 0xb22c, 0x4108, 0x432f, 0x46bb, 0x46c9, 0xba32, 0x1a44, 0xae82, 0x45c4, 0xba4d, 0x12e4, 0x4273, 0xbaf9, 0xbfd0, 0x43ab, 0x193e, 0x46e9, 0xb09f, 0x116a, 0x4062, 0xbf4b, 0x3063, 0x4186, 0x4022, 0x4413, 0x1e60, 0x4221, 0xb067, 0x42cc, 0x43b5, 0xbaec, 0x2f0a, 0xba21, 0x40f1, 0xb021, 0x42c5, 0x41b5, 0x4408, 0x019a, 0x1bce, 0x4445, 0xbade, 0x3ba5, 0x1b4c, 0x3db9, 0x407c, 0xba29, 0x438a, 0x28d3, 0xbf36, 0x464d, 0x426d, 0x3ef8, 0xb2d1, 0x41b4, 0x1b02, 0xb2b2, 0x18f4, 0x436a, 0x1c88, 0x3013, 0xb2e5, 0xb0fb, 0xb20a, 0x1f07, 0xaaf3, 0xb09b, 0x4150, 0xbf44, 0x425f, 0xb26c, 0xba7d, 0xbfda, 0x1a16, 0x2eb2, 0x4127, 0x4358, 0xbf25, 0x1e43, 0xb26e, 0x46b5, 0xb2f1, 0xb20f, 0x4190, 0xba77, 0xb2d0, 0xb256, 0x192d, 0x1c18, 0x0155, 0x4019, 0xbaf7, 0x424e, 0xba74, 0xb28c, 0xba1e, 0x1a15, 0xb084, 0x3be4, 0xbf44, 0x4244, 0xba70, 0x4109, 0x0237, 0xb2fb, 0x43fb, 0x4113, 0xbae0, 0xa7a3, 0x4552, 0x422f, 0xb291, 0xb263, 0xbfd4, 0xb22b, 0x2765, 0xbaf4, 0xb049, 0x1a38, 0x405e, 0x1b6f, 0xb25e, 0xba65, 0x0639, 0x4581, 0xbaca, 0x41a7, 0x1c50, 0x4030, 0x4272, 0x435e, 0xbf43, 0x4225, 0x180c, 0x42f2, 0x416f, 0x429f, 0xbad2, 0x40bd, 0x448d, 0x417e, 0xb220, 0x10d2, 0xbf06, 0x4068, 0x3614, 0x1307, 0x432a, 0x46d0, 0x4233, 0x41c4, 0x46f3, 0x1c04, 0x40a0, 0xaa36, 0xbaf7, 0xb2e8, 0x425c, 0x42ba, 0x3767, 0xb20e, 0x400b, 0xb087, 0x1886, 0x2c3e, 0x2840, 0xb06a, 0xbf05, 0x43a1, 0xb250, 0x4543, 0x412c, 0x22a1, 0x41c1, 0x4133, 0x1976, 0x404f, 0x425a, 0xaad6, 0x41ed, 0x40a4, 0x4333, 0x4278, 0xb04c, 0x41c5, 0x42c3, 0x336a, 0x4004, 0x411b, 0xb24b, 0x4399, 0x43b7, 0x4098, 0x4180, 0xbf7b, 0x41d0, 0x423c, 0x4301, 0x416c, 0x432b, 0xb2a3, 0xb2a2, 0xb0d9, 0x42df, 0x1237, 0x43d1, 0x437d, 0x41fd, 0x4352, 0xba00, 0xbf6b, 0x1c45, 0x0c59, 0x21e6, 0x1d8a, 0x1a4b, 0x43cf, 0x098f, 0x2f7b, 0x4307, 0xba68, 0x4093, 0xb2cf, 0x4106, 0x19a1, 0x0fd2, 0xbac5, 0x1a26, 0x43da, 0x4279, 0x40dd, 0xbf01, 0xb0b5, 0x41e6, 0x3dc6, 0x406f, 0xb258, 0x19fe, 0x40e1, 0xba16, 0x4267, 0x4093, 0xb2e8, 0x42c0, 0xb282, 0x4083, 0xb269, 0x40f8, 0x3805, 0xbfc3, 0x437a, 0x425d, 0xb0f4, 0x2503, 0x4074, 0xb021, 0xbfaa, 0x42f4, 0x413d, 0x42c7, 0x0bf2, 0xb06c, 0x1949, 0x40e4, 0x40b4, 0x1a5d, 0xbf13, 0xb2a1, 0x230b, 0xb0e9, 0xb294, 0x46b8, 0x2508, 0xb09d, 0xb24f, 0xb0d1, 0xad5e, 0xbfb2, 0x4037, 0xba4b, 0x1f76, 0x1ed9, 0x412a, 0xbf90, 0x4694, 0xb0aa, 0x39bf, 0x4070, 0x4492, 0x0b7e, 0xa95a, 0xb08c, 0x0ebd, 0x4381, 0xa285, 0x3e4b, 0xbf07, 0x4159, 0xae4d, 0x4269, 0xb277, 0x46d3, 0x29f9, 0x45be, 0x4362, 0x1925, 0xba2a, 0x4573, 0x0196, 0xb2ea, 0x434c, 0xb26d, 0xbae2, 0x1e42, 0x411c, 0x416e, 0x4259, 0xb28b, 0xbfe2, 0xbac6, 0x437e, 0x076e, 0x41ba, 0x407a, 0x45f1, 0x4205, 0xb289, 0x1840, 0x4027, 0x4190, 0x408f, 0xb23c, 0x419a, 0x001e, 0xb0b6, 0x4081, 0xba25, 0xa216, 0xb2ff, 0x405c, 0x18ad, 0x426a, 0x4179, 0xb21a, 0xbf8a, 0x4312, 0x44d3, 0xba1d, 0x42a8, 0x283f, 0x4169, 0x13bc, 0xb00d, 0xaac5, 0x403a, 0x439d, 0xaaca, 0x4369, 0x1c07, 0x4256, 0x434e, 0xb054, 0x1634, 0xbfdf, 0x1ab7, 0x3f94, 0x1b06, 0x42f4, 0x407e, 0x058b, 0x409a, 0xba4b, 0x180e, 0xaf82, 0x43f8, 0x161d, 0x44e0, 0xbf14, 0x4215, 0x1acc, 0x401a, 0x402e, 0x41e4, 0x4678, 0x1d6b, 0x1d43, 0x427b, 0x015f, 0xaf31, 0x41de, 0x0fa6, 0xbf45, 0xb2c8, 0x417c, 0x438b, 0x45be, 0x4334, 0xba6f, 0x429a, 0xbf00, 0xb2ad, 0x4342, 0x4154, 0xbf26, 0xb2ad, 0x4347, 0x16db, 0x4423, 0x40ac, 0x4384, 0xb270, 0xb005, 0x42b8, 0x4305, 0xba31, 0x1d89, 0x2ca0, 0xb21f, 0xba55, 0xba38, 0xb26a, 0x30c9, 0xb20e, 0xb224, 0x4069, 0x431a, 0x43fa, 0xa8e2, 0x41a8, 0x40f1, 0x4253, 0x1eae, 0xbf0b, 0x405d, 0x3e93, 0x43ec, 0x45a3, 0xb267, 0x1c8a, 0x19fc, 0x417c, 0xb214, 0x4350, 0x4083, 0x2458, 0x42cc, 0x40f4, 0x40f0, 0x31dd, 0x43b0, 0xb2bf, 0x419f, 0xb2bb, 0x41f0, 0xbfbd, 0x42bd, 0x1c0f, 0xb06e, 0x4085, 0x43ea, 0xb2c7, 0xb0c4, 0x428a, 0x4294, 0xb2ea, 0x44d1, 0x4374, 0x4361, 0x41bf, 0xa12e, 0x02fa, 0xbac8, 0xbf15, 0x4004, 0x3b3a, 0x05be, 0x41c9, 0x40ab, 0xbadf, 0x3b7c, 0xb075, 0x2c0e, 0x02fb, 0x18b4, 0x19f6, 0x43eb, 0xb254, 0x431d, 0x40e1, 0x40f1, 0x0f2a, 0x4248, 0xbf95, 0xa360, 0x4095, 0x1a15, 0x4387, 0x4770, 0xe7fe + ], + StartRegs = [0x14152dbc, 0xac42cb3d, 0x80d39deb, 0xf842bf41, 0xc80af0cb, 0xb2924a15, 0xe20c7a41, 0xd0c9f409, 0xfd5e5b81, 0x4d1dced7, 0x6694566b, 0x954b09bd, 0x823d8b85, 0xd32e765b, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0xffffe7a0, 0x00001860, 0x0000000f, 0x00001958, 0x00000000, 0x0000186f, 0xffc00000, 0x00000000, 0x00000000, 0x669456ff, 0x6694566b, 0xcd28acd6, 0x00000000, 0x000060e9, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x4379, 0x2480, 0x4389, 0x4462, 0xb2b1, 0xb229, 0x4064, 0xb2ce, 0xbf8a, 0xb233, 0x4052, 0xbafd, 0x40a1, 0x047d, 0xb2a8, 0xbac2, 0x43fc, 0x41d7, 0xb0c2, 0xba50, 0x41ac, 0x24ec, 0x1cde, 0x4678, 0xb0e8, 0x46f0, 0x438c, 0x4034, 0x3f2b, 0xa9c5, 0xa5d8, 0x1472, 0xbfc6, 0xb2f0, 0x223e, 0x0dc1, 0x408e, 0x4220, 0x417f, 0xa4bb, 0x4347, 0xa2fa, 0xbf8a, 0x1a45, 0x0d2e, 0xb2ed, 0xbaf2, 0x41cf, 0x437f, 0xb077, 0xb271, 0xb256, 0x4138, 0x0a13, 0x439d, 0x275a, 0xb0ad, 0x4094, 0x4133, 0xbfbc, 0xb0d7, 0x290e, 0x43ec, 0x41df, 0x259f, 0x402a, 0x42c6, 0x4148, 0xa7d3, 0x2e2c, 0xb2c3, 0xb223, 0x439b, 0x4209, 0x1e5b, 0xb213, 0x421f, 0x0902, 0xb2b4, 0xba54, 0x4340, 0x1988, 0xbfcb, 0x43b0, 0xba07, 0x436e, 0x41b2, 0xb0ff, 0x43f6, 0x42a5, 0x29d5, 0x4325, 0x22f7, 0x403b, 0x4363, 0x1a03, 0x08bc, 0x1a8e, 0x458a, 0x1328, 0xba5c, 0x315f, 0x40af, 0xbadc, 0x1b66, 0x1bfa, 0x1a5d, 0xb06a, 0x3d85, 0xb077, 0x434c, 0x40c6, 0xbf59, 0x40ec, 0x40a9, 0x4491, 0x4274, 0xba68, 0x1b59, 0x2148, 0xba32, 0x288d, 0x41ba, 0x2e3b, 0x4561, 0xbf5a, 0x42e1, 0x445d, 0x4181, 0x1f97, 0x436c, 0xb005, 0xba1d, 0xab7e, 0x38a1, 0x3f8a, 0x4139, 0x463c, 0xb047, 0xbafd, 0x43c1, 0x40a5, 0x429c, 0xba1c, 0xad94, 0x420a, 0xb275, 0xba3e, 0x447c, 0x1b00, 0xba5e, 0xb282, 0xbf78, 0xb226, 0xb293, 0x1e34, 0x1cf0, 0xae4a, 0xbfa7, 0x40d6, 0xba23, 0x46a0, 0x2172, 0x44eb, 0xbf2f, 0x4095, 0x42cb, 0x2e23, 0x312c, 0xb2e8, 0x1a06, 0x431b, 0xb2b4, 0x42ae, 0x424d, 0xb2ec, 0x1bbd, 0x45f2, 0x137e, 0x204b, 0x18e0, 0x40be, 0xb2c0, 0x25a8, 0x4319, 0xb277, 0x2318, 0x4181, 0xb29e, 0x43a4, 0x1b2b, 0xa73b, 0xbfc7, 0x074b, 0x2a98, 0xb07d, 0xba4b, 0xb256, 0x4088, 0xa8c4, 0xa053, 0x4448, 0x41ca, 0x42f1, 0xb239, 0xbf2d, 0x40a8, 0x3a69, 0x2ffe, 0x3bec, 0x23ee, 0x43f1, 0x2309, 0x43c7, 0x431c, 0x42a9, 0xb29d, 0x41dc, 0x39ff, 0x412f, 0xb2c0, 0xba55, 0xa7bf, 0x41cc, 0xbad7, 0x4104, 0x018a, 0xb2bf, 0x43c6, 0x4170, 0xb28f, 0x41f2, 0x409b, 0x4372, 0xb007, 0xbf2e, 0x01f0, 0xba38, 0x409d, 0xb0ad, 0x4363, 0xb042, 0x2a86, 0x4140, 0x415f, 0xbfb8, 0x41e5, 0x28f2, 0x4035, 0x42ce, 0xb0ae, 0x43d6, 0x4357, 0x44a9, 0x40a8, 0x4117, 0x433b, 0x4213, 0x3385, 0x09e7, 0xbf80, 0xb063, 0xaa00, 0xb013, 0xbf90, 0x409a, 0x4007, 0xbf04, 0x4060, 0x4377, 0xb0f3, 0xb0ab, 0x4279, 0x1a56, 0xba2b, 0x1931, 0x434c, 0xb090, 0x0500, 0x1b0f, 0x1a85, 0x4681, 0x3e3a, 0x43ce, 0xb2fa, 0x430b, 0x4043, 0xbfb0, 0x3a7d, 0xbf76, 0xb009, 0xbace, 0xbf70, 0x403a, 0x438c, 0x41fd, 0x433c, 0x4202, 0x2d3d, 0x4277, 0x428e, 0x4156, 0xb2d2, 0xbf68, 0x3ab5, 0x409c, 0x1f03, 0x1d6d, 0x42f8, 0x0aaf, 0x2d64, 0x2022, 0xbf12, 0x137d, 0xba6f, 0x45a2, 0xa7a7, 0x40f5, 0x45d3, 0xb2e4, 0x3f2e, 0xba5e, 0x1df2, 0xafc9, 0x42be, 0x4683, 0x4001, 0xba00, 0xb2ae, 0xba1c, 0x089d, 0xb052, 0x1bb8, 0x198b, 0x2162, 0x1f49, 0x3d1b, 0x46fa, 0xbf68, 0x4018, 0xa1e0, 0x40fa, 0x1bdd, 0xbf7c, 0x1a6b, 0x435a, 0xb240, 0x434e, 0x2af4, 0x438b, 0x40f3, 0x4049, 0x43df, 0xb231, 0x0e09, 0x434a, 0x1a40, 0x4079, 0x34eb, 0x41b5, 0x4033, 0x431b, 0x28b1, 0x4575, 0xb022, 0x4221, 0x41b5, 0xbf05, 0x1e57, 0x41d7, 0xb26b, 0x40e3, 0x18d7, 0x40c4, 0x4204, 0xb249, 0x1c5a, 0xbfa4, 0x4063, 0x36b9, 0x4414, 0x42ca, 0x1c8b, 0x42d0, 0x458c, 0xb04f, 0xbf79, 0x4369, 0x1d45, 0x383b, 0x41af, 0x132e, 0x1a3c, 0x0552, 0x467b, 0xba03, 0xb09d, 0xb0ed, 0x43a8, 0x2abd, 0x181a, 0x43c3, 0xb2f9, 0xaa2e, 0x38d6, 0xba77, 0x427b, 0x41f9, 0xbf21, 0x42e7, 0xb282, 0x4224, 0xb2e2, 0x1fab, 0x40f1, 0xbfd0, 0xbf84, 0x01fc, 0x42d2, 0x4379, 0xb000, 0x4246, 0xbfbd, 0xba44, 0x42ec, 0x43e8, 0x0d71, 0x238f, 0xbfd8, 0x46d4, 0x4068, 0x430e, 0xa79c, 0xa11e, 0x4375, 0x0698, 0xb241, 0x4343, 0xbaf7, 0x1af4, 0x4399, 0x4227, 0x43c3, 0xb2e3, 0xb08b, 0x39ed, 0xb07b, 0xb2d1, 0x4162, 0x425e, 0x0066, 0x4046, 0x4025, 0x0499, 0xbf48, 0x430d, 0xba16, 0x215d, 0x2992, 0x4078, 0xb226, 0x126c, 0x406e, 0x43cc, 0xb23f, 0x43db, 0xbf37, 0x2e15, 0xbaec, 0x4356, 0x3c9d, 0x4393, 0x245d, 0x411b, 0xbf00, 0x2629, 0xb21e, 0x423e, 0x27ca, 0x4001, 0x46e2, 0x4191, 0x439b, 0xba57, 0x465a, 0x1d3a, 0x1cb4, 0x4377, 0xbfc5, 0x40f1, 0x43b1, 0x42ea, 0x4249, 0xba57, 0x439e, 0x4263, 0x42cf, 0x4204, 0xb296, 0x4022, 0xa2ce, 0x4155, 0x07a1, 0x4005, 0x41bc, 0x430f, 0xbf0c, 0x4388, 0x1383, 0xb0da, 0x2956, 0x44e3, 0x432a, 0x4061, 0x421b, 0x4215, 0x455a, 0x41fa, 0x1d49, 0x4165, 0x40b8, 0x1258, 0x208a, 0xbf12, 0xa283, 0x1d11, 0x41bf, 0xbf55, 0xba7b, 0x4204, 0xba24, 0xbff0, 0xbf61, 0x40e1, 0x1ed0, 0x43c5, 0x42c8, 0x4215, 0xbad5, 0x4220, 0xb029, 0x439a, 0xb07b, 0xa83b, 0xb2ef, 0x1fb5, 0x4298, 0xb071, 0x40ef, 0x42e1, 0x2792, 0x1a2b, 0x1fb9, 0x32df, 0x209b, 0x3ecf, 0xba10, 0x409e, 0xb253, 0x4041, 0x196f, 0x443c, 0xbfd9, 0x189c, 0x441c, 0xbac0, 0xaa98, 0x0b73, 0xb229, 0x42d2, 0x4225, 0xbff0, 0x4226, 0x404c, 0x43b7, 0x4039, 0x4348, 0x411d, 0x40d0, 0x401b, 0x4187, 0xa008, 0xb2fa, 0xa858, 0xbf35, 0x420b, 0xb2c3, 0xb2fb, 0xb03c, 0x4063, 0xb0e0, 0xbfb0, 0x1b44, 0xbf5d, 0x4034, 0x4427, 0x43a2, 0xba5a, 0x46d8, 0x46d1, 0x3045, 0x33da, 0x43bb, 0x4018, 0x0618, 0x4192, 0x4357, 0x430e, 0x414b, 0x3656, 0xb2b3, 0xb03f, 0xbf90, 0x460b, 0x43c5, 0xbf1c, 0x4368, 0xba32, 0xbfc0, 0x415b, 0x4113, 0x1e66, 0x1eef, 0x4217, 0xba3a, 0xb280, 0x4355, 0x44a0, 0x4340, 0xb097, 0x423c, 0x43f6, 0x2cf6, 0xb250, 0x4627, 0x42cc, 0x2090, 0xba59, 0x4277, 0x24e1, 0x1f43, 0x14a1, 0xa852, 0xbfb6, 0x45f4, 0x46ec, 0x2c9b, 0x3866, 0xb2a8, 0x1d24, 0x4311, 0xb051, 0x4082, 0x2e93, 0x40f7, 0x40e3, 0xb010, 0xac6c, 0x1928, 0xbfdd, 0x0c95, 0xba78, 0x4409, 0x41af, 0x3367, 0x4204, 0x436a, 0x1d3c, 0x4043, 0xb0f9, 0x417f, 0x42ea, 0x42c7, 0x1cd8, 0x1db7, 0xa9fc, 0x1d0c, 0xbf60, 0x4589, 0x41e8, 0x25ec, 0x422c, 0xb239, 0x3b17, 0x45f5, 0xbf7b, 0x0725, 0x40b4, 0x4005, 0xb2f4, 0xbff0, 0x40a6, 0x412e, 0x4167, 0x30c3, 0x403b, 0xbfb8, 0x43c5, 0x402b, 0x1fa2, 0x3aca, 0xbfc5, 0xbafa, 0x4232, 0x4632, 0xb2b6, 0x4639, 0x4061, 0x4256, 0xb2e8, 0x17be, 0x4346, 0x4313, 0xbfb6, 0xba6f, 0x4103, 0xb030, 0x4196, 0xb03a, 0x0a90, 0xbf90, 0x4610, 0x40ae, 0xba66, 0x1d15, 0xa4b5, 0x4210, 0x42a7, 0xbac1, 0xbfb4, 0xaa8b, 0xb2e7, 0x405f, 0x4013, 0xa7f6, 0x1a48, 0x38c2, 0x420c, 0x210c, 0x40ad, 0x4309, 0x2e0a, 0xba29, 0xbad8, 0x0cb0, 0x4333, 0xba55, 0x1e96, 0xb21b, 0x2b22, 0x3f84, 0xbfa1, 0xa0a2, 0x419a, 0xb2c8, 0x40c3, 0x42ef, 0x4132, 0x41f4, 0xbfc6, 0x4650, 0x4322, 0x341e, 0xbf8b, 0x426b, 0x46b2, 0xb271, 0x422c, 0x4205, 0x4329, 0x419d, 0xa66e, 0xb28b, 0x409d, 0x3f5c, 0x37f3, 0x4135, 0xb25e, 0x4032, 0x4368, 0x44ad, 0x4089, 0x468a, 0x4309, 0x19f0, 0xb2ec, 0x419a, 0x4642, 0xaade, 0x221c, 0xbf12, 0xa8f7, 0xb251, 0x43cd, 0x4189, 0xbadc, 0x0a21, 0xb02b, 0x43a2, 0x4136, 0xbf07, 0x005c, 0x1ab6, 0x4192, 0x4084, 0x36b5, 0xb239, 0x19f8, 0xb236, 0x1a91, 0x40f4, 0x1c8b, 0x4142, 0x015e, 0x0894, 0x4229, 0xb090, 0xb051, 0x4073, 0x42f0, 0x1f44, 0x0dc9, 0x447f, 0xba48, 0x4150, 0x1af6, 0xba5e, 0x2fa7, 0xb088, 0x421c, 0xbf92, 0x43b1, 0x4007, 0x1992, 0x411c, 0x4021, 0x4004, 0x26a4, 0x0e50, 0x43ad, 0x3588, 0x1d58, 0x426c, 0xb0c6, 0x2222, 0xb2ef, 0x4440, 0xbf59, 0xb05b, 0x42fb, 0xb277, 0x4314, 0xbacf, 0x17b8, 0x4192, 0x40c9, 0x1d08, 0x43a8, 0xba2a, 0xb069, 0x43b9, 0x44d5, 0x10b0, 0xb2cd, 0x46e9, 0x4054, 0x4417, 0x2d2c, 0x42fb, 0x4094, 0xbf9c, 0x4598, 0x41d7, 0x4257, 0x4284, 0x4277, 0xaf28, 0xba78, 0xb0d1, 0x40f2, 0x43d2, 0x41e7, 0xb25d, 0x420c, 0x40e6, 0x1fa1, 0xb00c, 0x4066, 0x40ee, 0xbf08, 0x4387, 0xbf70, 0xb048, 0x42af, 0xbac4, 0x44cb, 0x40dd, 0x2044, 0x4247, 0x1dda, 0x250b, 0xbadd, 0x45a8, 0x4195, 0xbf38, 0x42d6, 0x4613, 0xb26d, 0x4581, 0x2f5e, 0xb2c5, 0x464e, 0xba66, 0x41c2, 0x2431, 0x4301, 0x4063, 0x2637, 0x46a0, 0xb059, 0x1d7b, 0x1f71, 0xb089, 0xbf15, 0x4111, 0x4372, 0xba3f, 0x1869, 0x13c5, 0x42cd, 0xb216, 0xb2b9, 0x4324, 0xbf70, 0x418d, 0x405a, 0x130b, 0xbfd7, 0x43e3, 0x131f, 0x42d2, 0x42b0, 0x0eb5, 0xba07, 0xb261, 0x4173, 0x4124, 0x3d11, 0x410c, 0xb268, 0xb23b, 0xb219, 0x4044, 0x011f, 0x33bd, 0x1f80, 0xb2c8, 0x4133, 0x4352, 0x1aad, 0xbfc2, 0x3647, 0xb2ef, 0x1964, 0x41f0, 0x2fd2, 0x4291, 0x438f, 0x1518, 0x4184, 0x4138, 0x1c5b, 0xa1de, 0xae02, 0x40f0, 0xbfdc, 0xba47, 0x40eb, 0x42f7, 0x2577, 0x1ba5, 0x431d, 0x4227, 0x1e88, 0xbf28, 0x1cfb, 0x409d, 0xbf5d, 0x4039, 0x4328, 0xb23c, 0x0f79, 0xb03e, 0x4177, 0x44c3, 0x4334, 0xbf4d, 0x40bc, 0x4343, 0x402a, 0x40c6, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x2facc260, 0xdcf5a5c6, 0x996babf4, 0xcf26a6f8, 0x2df7e7e5, 0xee4ea13b, 0xf856da3e, 0x6c32216c, 0x0f115238, 0x504a66b5, 0xb0cc8c19, 0x7ac767c7, 0x4550fd6f, 0x45a84035, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0x00001b12, 0x00000000, 0x60000d99, 0x00000003, 0xfffc0000, 0xd2bdaee8, 0x0000116a, 0x45a84a12, 0x00000031, 0x45a848bd, 0x00000000, 0x8af9467f, 0x45a844ad, 0x45a84b01, 0x00000000, 0x800001d0 }, + Instructions = [0x4379, 0x2480, 0x4389, 0x4462, 0xb2b1, 0xb229, 0x4064, 0xb2ce, 0xbf8a, 0xb233, 0x4052, 0xbafd, 0x40a1, 0x047d, 0xb2a8, 0xbac2, 0x43fc, 0x41d7, 0xb0c2, 0xba50, 0x41ac, 0x24ec, 0x1cde, 0x4678, 0xb0e8, 0x46f0, 0x438c, 0x4034, 0x3f2b, 0xa9c5, 0xa5d8, 0x1472, 0xbfc6, 0xb2f0, 0x223e, 0x0dc1, 0x408e, 0x4220, 0x417f, 0xa4bb, 0x4347, 0xa2fa, 0xbf8a, 0x1a45, 0x0d2e, 0xb2ed, 0xbaf2, 0x41cf, 0x437f, 0xb077, 0xb271, 0xb256, 0x4138, 0x0a13, 0x439d, 0x275a, 0xb0ad, 0x4094, 0x4133, 0xbfbc, 0xb0d7, 0x290e, 0x43ec, 0x41df, 0x259f, 0x402a, 0x42c6, 0x4148, 0xa7d3, 0x2e2c, 0xb2c3, 0xb223, 0x439b, 0x4209, 0x1e5b, 0xb213, 0x421f, 0x0902, 0xb2b4, 0xba54, 0x4340, 0x1988, 0xbfcb, 0x43b0, 0xba07, 0x436e, 0x41b2, 0xb0ff, 0x43f6, 0x42a5, 0x29d5, 0x4325, 0x22f7, 0x403b, 0x4363, 0x1a03, 0x08bc, 0x1a8e, 0x458a, 0x1328, 0xba5c, 0x315f, 0x40af, 0xbadc, 0x1b66, 0x1bfa, 0x1a5d, 0xb06a, 0x3d85, 0xb077, 0x434c, 0x40c6, 0xbf59, 0x40ec, 0x40a9, 0x4491, 0x4274, 0xba68, 0x1b59, 0x2148, 0xba32, 0x288d, 0x41ba, 0x2e3b, 0x4561, 0xbf5a, 0x42e1, 0x445d, 0x4181, 0x1f97, 0x436c, 0xb005, 0xba1d, 0xab7e, 0x38a1, 0x3f8a, 0x4139, 0x463c, 0xb047, 0xbafd, 0x43c1, 0x40a5, 0x429c, 0xba1c, 0xad94, 0x420a, 0xb275, 0xba3e, 0x447c, 0x1b00, 0xba5e, 0xb282, 0xbf78, 0xb226, 0xb293, 0x1e34, 0x1cf0, 0xae4a, 0xbfa7, 0x40d6, 0xba23, 0x46a0, 0x2172, 0x44eb, 0xbf2f, 0x4095, 0x42cb, 0x2e23, 0x312c, 0xb2e8, 0x1a06, 0x431b, 0xb2b4, 0x42ae, 0x424d, 0xb2ec, 0x1bbd, 0x45f2, 0x137e, 0x204b, 0x18e0, 0x40be, 0xb2c0, 0x25a8, 0x4319, 0xb277, 0x2318, 0x4181, 0xb29e, 0x43a4, 0x1b2b, 0xa73b, 0xbfc7, 0x074b, 0x2a98, 0xb07d, 0xba4b, 0xb256, 0x4088, 0xa8c4, 0xa053, 0x4448, 0x41ca, 0x42f1, 0xb239, 0xbf2d, 0x40a8, 0x3a69, 0x2ffe, 0x3bec, 0x23ee, 0x43f1, 0x2309, 0x43c7, 0x431c, 0x42a9, 0xb29d, 0x41dc, 0x39ff, 0x412f, 0xb2c0, 0xba55, 0xa7bf, 0x41cc, 0xbad7, 0x4104, 0x018a, 0xb2bf, 0x43c6, 0x4170, 0xb28f, 0x41f2, 0x409b, 0x4372, 0xb007, 0xbf2e, 0x01f0, 0xba38, 0x409d, 0xb0ad, 0x4363, 0xb042, 0x2a86, 0x4140, 0x415f, 0xbfb8, 0x41e5, 0x28f2, 0x4035, 0x42ce, 0xb0ae, 0x43d6, 0x4357, 0x44a9, 0x40a8, 0x4117, 0x433b, 0x4213, 0x3385, 0x09e7, 0xbf80, 0xb063, 0xaa00, 0xb013, 0xbf90, 0x409a, 0x4007, 0xbf04, 0x4060, 0x4377, 0xb0f3, 0xb0ab, 0x4279, 0x1a56, 0xba2b, 0x1931, 0x434c, 0xb090, 0x0500, 0x1b0f, 0x1a85, 0x4681, 0x3e3a, 0x43ce, 0xb2fa, 0x430b, 0x4043, 0xbfb0, 0x3a7d, 0xbf76, 0xb009, 0xbace, 0xbf70, 0x403a, 0x438c, 0x41fd, 0x433c, 0x4202, 0x2d3d, 0x4277, 0x428e, 0x4156, 0xb2d2, 0xbf68, 0x3ab5, 0x409c, 0x1f03, 0x1d6d, 0x42f8, 0x0aaf, 0x2d64, 0x2022, 0xbf12, 0x137d, 0xba6f, 0x45a2, 0xa7a7, 0x40f5, 0x45d3, 0xb2e4, 0x3f2e, 0xba5e, 0x1df2, 0xafc9, 0x42be, 0x4683, 0x4001, 0xba00, 0xb2ae, 0xba1c, 0x089d, 0xb052, 0x1bb8, 0x198b, 0x2162, 0x1f49, 0x3d1b, 0x46fa, 0xbf68, 0x4018, 0xa1e0, 0x40fa, 0x1bdd, 0xbf7c, 0x1a6b, 0x435a, 0xb240, 0x434e, 0x2af4, 0x438b, 0x40f3, 0x4049, 0x43df, 0xb231, 0x0e09, 0x434a, 0x1a40, 0x4079, 0x34eb, 0x41b5, 0x4033, 0x431b, 0x28b1, 0x4575, 0xb022, 0x4221, 0x41b5, 0xbf05, 0x1e57, 0x41d7, 0xb26b, 0x40e3, 0x18d7, 0x40c4, 0x4204, 0xb249, 0x1c5a, 0xbfa4, 0x4063, 0x36b9, 0x4414, 0x42ca, 0x1c8b, 0x42d0, 0x458c, 0xb04f, 0xbf79, 0x4369, 0x1d45, 0x383b, 0x41af, 0x132e, 0x1a3c, 0x0552, 0x467b, 0xba03, 0xb09d, 0xb0ed, 0x43a8, 0x2abd, 0x181a, 0x43c3, 0xb2f9, 0xaa2e, 0x38d6, 0xba77, 0x427b, 0x41f9, 0xbf21, 0x42e7, 0xb282, 0x4224, 0xb2e2, 0x1fab, 0x40f1, 0xbfd0, 0xbf84, 0x01fc, 0x42d2, 0x4379, 0xb000, 0x4246, 0xbfbd, 0xba44, 0x42ec, 0x43e8, 0x0d71, 0x238f, 0xbfd8, 0x46d4, 0x4068, 0x430e, 0xa79c, 0xa11e, 0x4375, 0x0698, 0xb241, 0x4343, 0xbaf7, 0x1af4, 0x4399, 0x4227, 0x43c3, 0xb2e3, 0xb08b, 0x39ed, 0xb07b, 0xb2d1, 0x4162, 0x425e, 0x0066, 0x4046, 0x4025, 0x0499, 0xbf48, 0x430d, 0xba16, 0x215d, 0x2992, 0x4078, 0xb226, 0x126c, 0x406e, 0x43cc, 0xb23f, 0x43db, 0xbf37, 0x2e15, 0xbaec, 0x4356, 0x3c9d, 0x4393, 0x245d, 0x411b, 0xbf00, 0x2629, 0xb21e, 0x423e, 0x27ca, 0x4001, 0x46e2, 0x4191, 0x439b, 0xba57, 0x465a, 0x1d3a, 0x1cb4, 0x4377, 0xbfc5, 0x40f1, 0x43b1, 0x42ea, 0x4249, 0xba57, 0x439e, 0x4263, 0x42cf, 0x4204, 0xb296, 0x4022, 0xa2ce, 0x4155, 0x07a1, 0x4005, 0x41bc, 0x430f, 0xbf0c, 0x4388, 0x1383, 0xb0da, 0x2956, 0x44e3, 0x432a, 0x4061, 0x421b, 0x4215, 0x455a, 0x41fa, 0x1d49, 0x4165, 0x40b8, 0x1258, 0x208a, 0xbf12, 0xa283, 0x1d11, 0x41bf, 0xbf55, 0xba7b, 0x4204, 0xba24, 0xbff0, 0xbf61, 0x40e1, 0x1ed0, 0x43c5, 0x42c8, 0x4215, 0xbad5, 0x4220, 0xb029, 0x439a, 0xb07b, 0xa83b, 0xb2ef, 0x1fb5, 0x4298, 0xb071, 0x40ef, 0x42e1, 0x2792, 0x1a2b, 0x1fb9, 0x32df, 0x209b, 0x3ecf, 0xba10, 0x409e, 0xb253, 0x4041, 0x196f, 0x443c, 0xbfd9, 0x189c, 0x441c, 0xbac0, 0xaa98, 0x0b73, 0xb229, 0x42d2, 0x4225, 0xbff0, 0x4226, 0x404c, 0x43b7, 0x4039, 0x4348, 0x411d, 0x40d0, 0x401b, 0x4187, 0xa008, 0xb2fa, 0xa858, 0xbf35, 0x420b, 0xb2c3, 0xb2fb, 0xb03c, 0x4063, 0xb0e0, 0xbfb0, 0x1b44, 0xbf5d, 0x4034, 0x4427, 0x43a2, 0xba5a, 0x46d8, 0x46d1, 0x3045, 0x33da, 0x43bb, 0x4018, 0x0618, 0x4192, 0x4357, 0x430e, 0x414b, 0x3656, 0xb2b3, 0xb03f, 0xbf90, 0x460b, 0x43c5, 0xbf1c, 0x4368, 0xba32, 0xbfc0, 0x415b, 0x4113, 0x1e66, 0x1eef, 0x4217, 0xba3a, 0xb280, 0x4355, 0x44a0, 0x4340, 0xb097, 0x423c, 0x43f6, 0x2cf6, 0xb250, 0x4627, 0x42cc, 0x2090, 0xba59, 0x4277, 0x24e1, 0x1f43, 0x14a1, 0xa852, 0xbfb6, 0x45f4, 0x46ec, 0x2c9b, 0x3866, 0xb2a8, 0x1d24, 0x4311, 0xb051, 0x4082, 0x2e93, 0x40f7, 0x40e3, 0xb010, 0xac6c, 0x1928, 0xbfdd, 0x0c95, 0xba78, 0x4409, 0x41af, 0x3367, 0x4204, 0x436a, 0x1d3c, 0x4043, 0xb0f9, 0x417f, 0x42ea, 0x42c7, 0x1cd8, 0x1db7, 0xa9fc, 0x1d0c, 0xbf60, 0x4589, 0x41e8, 0x25ec, 0x422c, 0xb239, 0x3b17, 0x45f5, 0xbf7b, 0x0725, 0x40b4, 0x4005, 0xb2f4, 0xbff0, 0x40a6, 0x412e, 0x4167, 0x30c3, 0x403b, 0xbfb8, 0x43c5, 0x402b, 0x1fa2, 0x3aca, 0xbfc5, 0xbafa, 0x4232, 0x4632, 0xb2b6, 0x4639, 0x4061, 0x4256, 0xb2e8, 0x17be, 0x4346, 0x4313, 0xbfb6, 0xba6f, 0x4103, 0xb030, 0x4196, 0xb03a, 0x0a90, 0xbf90, 0x4610, 0x40ae, 0xba66, 0x1d15, 0xa4b5, 0x4210, 0x42a7, 0xbac1, 0xbfb4, 0xaa8b, 0xb2e7, 0x405f, 0x4013, 0xa7f6, 0x1a48, 0x38c2, 0x420c, 0x210c, 0x40ad, 0x4309, 0x2e0a, 0xba29, 0xbad8, 0x0cb0, 0x4333, 0xba55, 0x1e96, 0xb21b, 0x2b22, 0x3f84, 0xbfa1, 0xa0a2, 0x419a, 0xb2c8, 0x40c3, 0x42ef, 0x4132, 0x41f4, 0xbfc6, 0x4650, 0x4322, 0x341e, 0xbf8b, 0x426b, 0x46b2, 0xb271, 0x422c, 0x4205, 0x4329, 0x419d, 0xa66e, 0xb28b, 0x409d, 0x3f5c, 0x37f3, 0x4135, 0xb25e, 0x4032, 0x4368, 0x44ad, 0x4089, 0x468a, 0x4309, 0x19f0, 0xb2ec, 0x419a, 0x4642, 0xaade, 0x221c, 0xbf12, 0xa8f7, 0xb251, 0x43cd, 0x4189, 0xbadc, 0x0a21, 0xb02b, 0x43a2, 0x4136, 0xbf07, 0x005c, 0x1ab6, 0x4192, 0x4084, 0x36b5, 0xb239, 0x19f8, 0xb236, 0x1a91, 0x40f4, 0x1c8b, 0x4142, 0x015e, 0x0894, 0x4229, 0xb090, 0xb051, 0x4073, 0x42f0, 0x1f44, 0x0dc9, 0x447f, 0xba48, 0x4150, 0x1af6, 0xba5e, 0x2fa7, 0xb088, 0x421c, 0xbf92, 0x43b1, 0x4007, 0x1992, 0x411c, 0x4021, 0x4004, 0x26a4, 0x0e50, 0x43ad, 0x3588, 0x1d58, 0x426c, 0xb0c6, 0x2222, 0xb2ef, 0x4440, 0xbf59, 0xb05b, 0x42fb, 0xb277, 0x4314, 0xbacf, 0x17b8, 0x4192, 0x40c9, 0x1d08, 0x43a8, 0xba2a, 0xb069, 0x43b9, 0x44d5, 0x10b0, 0xb2cd, 0x46e9, 0x4054, 0x4417, 0x2d2c, 0x42fb, 0x4094, 0xbf9c, 0x4598, 0x41d7, 0x4257, 0x4284, 0x4277, 0xaf28, 0xba78, 0xb0d1, 0x40f2, 0x43d2, 0x41e7, 0xb25d, 0x420c, 0x40e6, 0x1fa1, 0xb00c, 0x4066, 0x40ee, 0xbf08, 0x4387, 0xbf70, 0xb048, 0x42af, 0xbac4, 0x44cb, 0x40dd, 0x2044, 0x4247, 0x1dda, 0x250b, 0xbadd, 0x45a8, 0x4195, 0xbf38, 0x42d6, 0x4613, 0xb26d, 0x4581, 0x2f5e, 0xb2c5, 0x464e, 0xba66, 0x41c2, 0x2431, 0x4301, 0x4063, 0x2637, 0x46a0, 0xb059, 0x1d7b, 0x1f71, 0xb089, 0xbf15, 0x4111, 0x4372, 0xba3f, 0x1869, 0x13c5, 0x42cd, 0xb216, 0xb2b9, 0x4324, 0xbf70, 0x418d, 0x405a, 0x130b, 0xbfd7, 0x43e3, 0x131f, 0x42d2, 0x42b0, 0x0eb5, 0xba07, 0xb261, 0x4173, 0x4124, 0x3d11, 0x410c, 0xb268, 0xb23b, 0xb219, 0x4044, 0x011f, 0x33bd, 0x1f80, 0xb2c8, 0x4133, 0x4352, 0x1aad, 0xbfc2, 0x3647, 0xb2ef, 0x1964, 0x41f0, 0x2fd2, 0x4291, 0x438f, 0x1518, 0x4184, 0x4138, 0x1c5b, 0xa1de, 0xae02, 0x40f0, 0xbfdc, 0xba47, 0x40eb, 0x42f7, 0x2577, 0x1ba5, 0x431d, 0x4227, 0x1e88, 0xbf28, 0x1cfb, 0x409d, 0xbf5d, 0x4039, 0x4328, 0xb23c, 0x0f79, 0xb03e, 0x4177, 0x44c3, 0x4334, 0xbf4d, 0x40bc, 0x4343, 0x402a, 0x40c6, 0x4770, 0xe7fe + ], + StartRegs = [0x2facc260, 0xdcf5a5c6, 0x996babf4, 0xcf26a6f8, 0x2df7e7e5, 0xee4ea13b, 0xf856da3e, 0x6c32216c, 0x0f115238, 0x504a66b5, 0xb0cc8c19, 0x7ac767c7, 0x4550fd6f, 0x45a84035, 0x00000000, 0x100001f0 + ], + FinalRegs = [0x00001b12, 0x00000000, 0x60000d99, 0x00000003, 0xfffc0000, 0xd2bdaee8, 0x0000116a, 0x45a84a12, 0x00000031, 0x45a848bd, 0x00000000, 0x8af9467f, 0x45a844ad, 0x45a84b01, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0xb2fe, 0x3eee, 0x4080, 0x4136, 0xb2e1, 0xb2b8, 0xba6e, 0x4298, 0x4164, 0x427d, 0x42cc, 0x416f, 0xbf4b, 0xba4a, 0x1e12, 0x43ca, 0x1c32, 0x41dd, 0x40be, 0x4374, 0x401a, 0xb0ad, 0x1506, 0x19bc, 0x11fe, 0xb298, 0x44c2, 0x1c97, 0xbf29, 0x4123, 0x4052, 0x4092, 0x4160, 0x209c, 0x42d7, 0x413b, 0x4333, 0xad04, 0x1147, 0x4054, 0x437a, 0xbaf8, 0x427a, 0x4197, 0x2636, 0xbfa2, 0x1958, 0x41b0, 0x40a3, 0x1ee7, 0x4132, 0x4306, 0x404f, 0xba70, 0x432f, 0x4551, 0xb0d9, 0xa5fd, 0x2460, 0x06fc, 0x3f2e, 0x29f1, 0x4233, 0x4318, 0x1044, 0xb277, 0xbf09, 0xb28f, 0x439f, 0x43ba, 0x06a4, 0x43b8, 0xba39, 0x1ebb, 0xb21f, 0x41e4, 0x4280, 0xbfb9, 0x3ebe, 0x11aa, 0x1b41, 0x1f7b, 0x4407, 0x2a7a, 0x4211, 0x41bb, 0xb0ae, 0x418b, 0x1665, 0x4177, 0xbfc0, 0xb280, 0x1905, 0x4267, 0xbfc6, 0x43a0, 0x42e5, 0x45b4, 0xba2e, 0x43a3, 0x2486, 0x40eb, 0x4297, 0x23fa, 0xbf71, 0x41e5, 0x4449, 0xb051, 0x0d5b, 0x4027, 0xba23, 0x3126, 0xbf57, 0x40b8, 0x41cf, 0x464f, 0x4082, 0x4075, 0x416a, 0x18df, 0xb0e9, 0xba0a, 0x4172, 0x14b5, 0x4394, 0x4232, 0x0ff1, 0xbf96, 0x406f, 0x43d7, 0x42e3, 0x0dc2, 0x4025, 0x46a0, 0x1d27, 0xb2f3, 0x42e4, 0x4099, 0x1a00, 0xb0b2, 0x1b48, 0x40a8, 0x420f, 0x43cd, 0xb270, 0xbf92, 0x412d, 0x4178, 0x4400, 0xb2f4, 0x40f1, 0x409f, 0x124a, 0x4584, 0x4312, 0x40f4, 0x1b70, 0x441e, 0x1866, 0x40ba, 0x4337, 0xbf1f, 0xb235, 0x41a4, 0xbf80, 0xb250, 0x40f9, 0xb2f5, 0x4237, 0xba2e, 0xbf1a, 0x433c, 0xb2b5, 0xbad6, 0xb0c9, 0xbf41, 0x43b3, 0x43c4, 0x3c17, 0x414f, 0x4194, 0xaf3b, 0x42cb, 0x1b27, 0x41bf, 0x418c, 0x050e, 0x44e5, 0x41ac, 0x45db, 0x431e, 0x43e8, 0x421e, 0x41f6, 0x18a1, 0x417f, 0xbf7f, 0x412b, 0x1dc5, 0xbacb, 0x46e1, 0x1321, 0x1e34, 0x42c6, 0x413f, 0x3725, 0x3245, 0x43cd, 0x1de1, 0x40d4, 0x35bb, 0x42c1, 0x4100, 0x4438, 0x028c, 0xb208, 0x4449, 0xbae6, 0xb08b, 0x0936, 0x433c, 0x412e, 0xb095, 0x41b8, 0x1d8c, 0x41b3, 0xbfa8, 0x4616, 0x4043, 0x45b3, 0x4214, 0x1ceb, 0x4133, 0x410a, 0x1c15, 0xbf16, 0xb2fc, 0xba2d, 0xab9f, 0x4037, 0x1f6d, 0x2f24, 0x4309, 0x4431, 0xbace, 0xba3d, 0x43cc, 0xb2e1, 0x137d, 0x43d5, 0x3f6c, 0x41e8, 0x3089, 0x42bf, 0x45d3, 0x4049, 0xbf89, 0x0e07, 0x2da2, 0x427e, 0x43c9, 0xb2cd, 0x1f71, 0xadba, 0xb2e3, 0xba77, 0x4250, 0x46fc, 0x24c9, 0x43ce, 0xb02f, 0x468d, 0xba17, 0x2ee2, 0x448b, 0xbfbd, 0x195a, 0x41a3, 0x33fb, 0x437a, 0xbf65, 0x4004, 0x43ab, 0x42c3, 0xaa5c, 0x2944, 0x1baf, 0x2a27, 0x4266, 0xbf91, 0x41c6, 0x42b8, 0xba74, 0x41b7, 0x355c, 0xbae4, 0x405f, 0x40be, 0xbaf5, 0x437e, 0xbac0, 0x4204, 0x436f, 0x46f3, 0x1f70, 0x4277, 0x4053, 0xbf80, 0xb2ee, 0xbfd5, 0xb2b0, 0x41e9, 0x424b, 0x4135, 0x4561, 0xbae0, 0xb200, 0xba21, 0x4360, 0xb0c1, 0xb207, 0x40a1, 0x4373, 0xb09e, 0x0929, 0x3cad, 0x1997, 0x411a, 0xb020, 0xbfa2, 0x3fca, 0xb23d, 0x087e, 0x055d, 0x4149, 0xb289, 0x2152, 0x1be1, 0x43b1, 0x40a1, 0xbf0d, 0x431d, 0xa7b2, 0x3d9a, 0x40a1, 0x42cf, 0x43e4, 0xbfc2, 0xaf46, 0xb23e, 0xb2e6, 0xb279, 0xa8af, 0xb076, 0xb0e7, 0x184a, 0x41bf, 0x42c8, 0x3d7b, 0xb02c, 0x1bd0, 0x1866, 0x14fe, 0x19c0, 0x409b, 0x435c, 0x4169, 0x405d, 0x4556, 0x4052, 0x435b, 0x412b, 0xbf73, 0x1ed8, 0x419f, 0x198b, 0x43da, 0x42f3, 0xba35, 0x1db6, 0xb012, 0x43d6, 0x0534, 0xabbe, 0x2ce2, 0x427f, 0x435f, 0x4169, 0x4265, 0xbf58, 0xb280, 0xbf90, 0x404e, 0xba75, 0x4162, 0x4105, 0xba5d, 0x40c4, 0x4044, 0x3603, 0x43c0, 0xb2ba, 0xb0b5, 0x247f, 0xba45, 0x4330, 0xb21a, 0x40ba, 0xba1d, 0xb24f, 0x43e3, 0xb09c, 0xbf5e, 0xb07d, 0xba5a, 0xb093, 0xb244, 0xba35, 0x419d, 0x4303, 0x09ce, 0x1af4, 0x4584, 0xb215, 0x4385, 0xb2ef, 0x46a4, 0x413d, 0x4389, 0x1d06, 0x07b8, 0x4558, 0x4494, 0x460a, 0xbf3c, 0x4158, 0xb225, 0xb2f1, 0x41ce, 0xbf2e, 0xb054, 0x4249, 0x45c6, 0x433e, 0x4685, 0x0ade, 0x4172, 0x42dc, 0x0fbd, 0x24d2, 0x4101, 0xbfd0, 0xb2a9, 0x4155, 0x416a, 0x4186, 0xba42, 0xb269, 0x1b7d, 0x4132, 0xa644, 0x1fc0, 0x43a1, 0xbf23, 0x02c3, 0x280b, 0x40b4, 0x4149, 0x4029, 0x217e, 0x10d4, 0x422a, 0x43ba, 0xba4b, 0x4291, 0x04ca, 0x1b38, 0x439a, 0x2d58, 0x42ca, 0x1e61, 0x2260, 0x4639, 0x46ca, 0x45be, 0xbf26, 0xb26d, 0x422e, 0x28d7, 0x4055, 0x3584, 0x41ff, 0x4322, 0xb27a, 0x40ee, 0x42f5, 0xba76, 0x40cc, 0xba68, 0x41b2, 0x1053, 0xbf7a, 0x4351, 0xb2a9, 0x4209, 0x2895, 0xb013, 0xbfd0, 0xa94c, 0x32bd, 0x41d8, 0xb283, 0x405c, 0x195d, 0xb25d, 0x1f07, 0xb249, 0x1a63, 0xb079, 0xaa92, 0x140c, 0xa9f0, 0x2d54, 0xa645, 0x37b2, 0x0ae8, 0xbf57, 0xbaf4, 0xba7c, 0x0abd, 0x42b9, 0x405c, 0x3f47, 0x43df, 0xb2db, 0x4329, 0x4134, 0x298d, 0xbaf3, 0xbfd5, 0xb2e3, 0x193e, 0xb232, 0xb276, 0xa3a0, 0x1d92, 0x41f6, 0x420f, 0x424d, 0xba32, 0x426a, 0xa208, 0x37fd, 0xba7e, 0x4363, 0x405f, 0x2b88, 0x1094, 0xbf1b, 0x1f17, 0xa26c, 0xbf70, 0xb27a, 0xb03a, 0x415b, 0x436d, 0xacf7, 0x42b2, 0xa2a5, 0x42f9, 0x414b, 0x4236, 0x1c8d, 0xbfa9, 0x41d8, 0x45a8, 0x43f5, 0x3226, 0xb0ec, 0x4248, 0x1e80, 0x4192, 0x1c5b, 0xb287, 0x4107, 0x467b, 0x4391, 0x406b, 0x4489, 0x18c6, 0x44dc, 0x4126, 0x1c8d, 0xb029, 0x42ac, 0x4055, 0x413e, 0x408e, 0xbf76, 0x052a, 0xbf90, 0xb261, 0xb2ae, 0x42b4, 0x26af, 0x43d5, 0x4084, 0xba6b, 0xb002, 0x09f3, 0x1f9b, 0x4300, 0xbf92, 0xa86c, 0x4187, 0x46f3, 0xb0cb, 0x41c1, 0x400e, 0x04b6, 0xbaf0, 0x10bc, 0xb0ff, 0xbfc1, 0xb244, 0x3bf7, 0x45a2, 0x4173, 0x415b, 0xba34, 0x3976, 0x1837, 0x40ad, 0x197e, 0x284b, 0x459a, 0x17e0, 0x41bf, 0x408f, 0x1ae0, 0x13a0, 0xbacd, 0x40c1, 0x420b, 0xba22, 0x44e8, 0x41a9, 0xa4b1, 0xb2ba, 0x41b2, 0x2d95, 0x4320, 0x4663, 0xbf37, 0xa9ae, 0xb2c5, 0x2310, 0x4329, 0x4239, 0xb0ef, 0x2d06, 0x4418, 0x42f3, 0xba76, 0xa639, 0x45d8, 0xb263, 0x2dc3, 0x1ce6, 0xbf4b, 0x43e6, 0xa2b7, 0x1c0c, 0x0252, 0xbf9b, 0x4151, 0x4062, 0x4148, 0x4360, 0x43bf, 0x07ca, 0x15e8, 0x40e2, 0x34b3, 0x433a, 0x42e4, 0x38ce, 0x34cc, 0x1796, 0xb04d, 0x3fc2, 0x46d3, 0x422e, 0xb09d, 0xbaf0, 0x4319, 0x4057, 0x435e, 0xbfe0, 0x4393, 0xbf64, 0x1a89, 0x422e, 0xb01e, 0x400c, 0xb07d, 0x1d17, 0x426c, 0x46ab, 0x454f, 0x44e5, 0x4085, 0xb209, 0x194d, 0x1f97, 0x411d, 0x4051, 0x1fd4, 0x3a6e, 0xbf4a, 0xb27a, 0x0cda, 0xae68, 0x4026, 0xb2cc, 0xba30, 0xb24b, 0x1e97, 0xbf77, 0x4231, 0xa0c7, 0xb268, 0x268b, 0xb0ad, 0xb209, 0x1b9f, 0x4035, 0x4237, 0x0231, 0x1aaf, 0xb0cb, 0x1d8e, 0x42e4, 0x42e4, 0x21cf, 0xb2d2, 0x420d, 0x4041, 0xac5b, 0xa18a, 0x43f6, 0xbaf7, 0x388e, 0x1c7f, 0xa574, 0xbf89, 0x43bd, 0x1ab6, 0xba61, 0x4218, 0x1ea0, 0x42c9, 0x432d, 0x4376, 0x1933, 0x4134, 0x1d9b, 0x27df, 0x43c4, 0xbfd5, 0x4203, 0xa8dc, 0x0ae8, 0x440a, 0xba0c, 0x3294, 0x4174, 0x42c9, 0xa2d7, 0x42ed, 0xbad3, 0x1bfe, 0x4326, 0x4035, 0x4348, 0xb292, 0xbf9e, 0x18f3, 0x43f1, 0x1367, 0x411b, 0x4477, 0x1e0b, 0x1d22, 0x1c39, 0x40bd, 0x435a, 0x1be5, 0x13c2, 0x1b7c, 0x433c, 0xa9d8, 0xa165, 0xbf69, 0xb057, 0x413d, 0x40f9, 0xb202, 0x3e95, 0x4185, 0xbf29, 0x1f39, 0x19fd, 0x42f1, 0xa2f2, 0xb2d2, 0xb070, 0x415c, 0xbf24, 0x43ba, 0x3aca, 0x1a2f, 0x4150, 0x43de, 0xb2df, 0x436d, 0xbfba, 0xad69, 0x1080, 0xb0f5, 0x4307, 0x0ab6, 0x4002, 0x41f4, 0xba63, 0x4220, 0xb28f, 0xba7e, 0xa3b6, 0xa952, 0xba6a, 0x447f, 0x1cd0, 0xb055, 0x4392, 0xb231, 0x1af3, 0x4354, 0x41cf, 0xa231, 0xbfde, 0x35ca, 0xab3b, 0xb0e7, 0x43ea, 0xbae7, 0x4375, 0x43ce, 0x31e5, 0x393c, 0x42f9, 0x4135, 0xb260, 0x409b, 0xba67, 0xb26d, 0x3fac, 0xb26c, 0x425d, 0x43de, 0xbf6d, 0x435b, 0x2efd, 0x1ae3, 0x429f, 0x187d, 0xb0a5, 0x41d7, 0x40b9, 0xbad6, 0x15d3, 0x4666, 0x46ad, 0xbf6f, 0x2348, 0x4006, 0x1221, 0xba18, 0x4271, 0x4057, 0x1829, 0x1e42, 0xa497, 0x1dc7, 0x41eb, 0x4225, 0x43b5, 0x1603, 0xb04f, 0xbf84, 0x3451, 0xb055, 0x4499, 0xb2e1, 0x41cd, 0xb25a, 0x41d8, 0x4305, 0x40ee, 0x411e, 0xba6f, 0x0452, 0x4160, 0x413d, 0x408c, 0x4232, 0x4047, 0x4452, 0xba4c, 0xa758, 0xbf21, 0x4616, 0x1990, 0x422a, 0x1dae, 0x1f74, 0x0f3f, 0x1f61, 0xbac5, 0x1d9e, 0xbaf1, 0xbf12, 0x1bd8, 0x2b26, 0xb05d, 0x09a5, 0x408e, 0x1ca7, 0x0a35, 0xa904, 0xaed0, 0x16fb, 0xbf80, 0xa941, 0xae2a, 0x1e3e, 0xb256, 0xa51e, 0xb2c4, 0x435e, 0xb288, 0x403f, 0xb2a9, 0xa590, 0x40a3, 0x4112, 0xbf99, 0x1c5f, 0x426e, 0x40c1, 0xb26c, 0xbfae, 0xb2a3, 0x43a7, 0xb213, 0x420f, 0x429f, 0x4080, 0x38a0, 0xba39, 0x1afa, 0xb027, 0x36e3, 0x37ef, 0x42c4, 0x40c9, 0x42de, 0xb0ec, 0xbf0b, 0xbac5, 0x241d, 0x25fb, 0x4182, 0xb251, 0xaa91, 0x4383, 0xbfb3, 0xba70, 0xb0a0, 0xba77, 0x4068, 0x1c8f, 0x12d3, 0xb27f, 0xb2c8, 0xbada, 0x3b8f, 0xbf32, 0xbaec, 0xb092, 0xbae3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x989fe979, 0xeb6d1dc2, 0x0199a793, 0xfd6ddabf, 0x2337d8f4, 0x10d088ef, 0x6abc19fa, 0x03f7a6b3, 0x8efc124d, 0x26bfcdfd, 0x162448d8, 0x1f47e67e, 0xbfa7bf3d, 0xf5019635, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0x000000ea, 0xffffffea, 0xfffffbff, 0x00001d00, 0x0000001d, 0x000019b4, 0x000000a6, 0xffffffec, 0x3fffff72, 0xffd83f36, 0xbfa7bf3d, 0x000000d6, 0x020003a0, 0xffffdcc8, 0x00000000, 0xa00001d0 }, + Instructions = [0xb2fe, 0x3eee, 0x4080, 0x4136, 0xb2e1, 0xb2b8, 0xba6e, 0x4298, 0x4164, 0x427d, 0x42cc, 0x416f, 0xbf4b, 0xba4a, 0x1e12, 0x43ca, 0x1c32, 0x41dd, 0x40be, 0x4374, 0x401a, 0xb0ad, 0x1506, 0x19bc, 0x11fe, 0xb298, 0x44c2, 0x1c97, 0xbf29, 0x4123, 0x4052, 0x4092, 0x4160, 0x209c, 0x42d7, 0x413b, 0x4333, 0xad04, 0x1147, 0x4054, 0x437a, 0xbaf8, 0x427a, 0x4197, 0x2636, 0xbfa2, 0x1958, 0x41b0, 0x40a3, 0x1ee7, 0x4132, 0x4306, 0x404f, 0xba70, 0x432f, 0x4551, 0xb0d9, 0xa5fd, 0x2460, 0x06fc, 0x3f2e, 0x29f1, 0x4233, 0x4318, 0x1044, 0xb277, 0xbf09, 0xb28f, 0x439f, 0x43ba, 0x06a4, 0x43b8, 0xba39, 0x1ebb, 0xb21f, 0x41e4, 0x4280, 0xbfb9, 0x3ebe, 0x11aa, 0x1b41, 0x1f7b, 0x4407, 0x2a7a, 0x4211, 0x41bb, 0xb0ae, 0x418b, 0x1665, 0x4177, 0xbfc0, 0xb280, 0x1905, 0x4267, 0xbfc6, 0x43a0, 0x42e5, 0x45b4, 0xba2e, 0x43a3, 0x2486, 0x40eb, 0x4297, 0x23fa, 0xbf71, 0x41e5, 0x4449, 0xb051, 0x0d5b, 0x4027, 0xba23, 0x3126, 0xbf57, 0x40b8, 0x41cf, 0x464f, 0x4082, 0x4075, 0x416a, 0x18df, 0xb0e9, 0xba0a, 0x4172, 0x14b5, 0x4394, 0x4232, 0x0ff1, 0xbf96, 0x406f, 0x43d7, 0x42e3, 0x0dc2, 0x4025, 0x46a0, 0x1d27, 0xb2f3, 0x42e4, 0x4099, 0x1a00, 0xb0b2, 0x1b48, 0x40a8, 0x420f, 0x43cd, 0xb270, 0xbf92, 0x412d, 0x4178, 0x4400, 0xb2f4, 0x40f1, 0x409f, 0x124a, 0x4584, 0x4312, 0x40f4, 0x1b70, 0x441e, 0x1866, 0x40ba, 0x4337, 0xbf1f, 0xb235, 0x41a4, 0xbf80, 0xb250, 0x40f9, 0xb2f5, 0x4237, 0xba2e, 0xbf1a, 0x433c, 0xb2b5, 0xbad6, 0xb0c9, 0xbf41, 0x43b3, 0x43c4, 0x3c17, 0x414f, 0x4194, 0xaf3b, 0x42cb, 0x1b27, 0x41bf, 0x418c, 0x050e, 0x44e5, 0x41ac, 0x45db, 0x431e, 0x43e8, 0x421e, 0x41f6, 0x18a1, 0x417f, 0xbf7f, 0x412b, 0x1dc5, 0xbacb, 0x46e1, 0x1321, 0x1e34, 0x42c6, 0x413f, 0x3725, 0x3245, 0x43cd, 0x1de1, 0x40d4, 0x35bb, 0x42c1, 0x4100, 0x4438, 0x028c, 0xb208, 0x4449, 0xbae6, 0xb08b, 0x0936, 0x433c, 0x412e, 0xb095, 0x41b8, 0x1d8c, 0x41b3, 0xbfa8, 0x4616, 0x4043, 0x45b3, 0x4214, 0x1ceb, 0x4133, 0x410a, 0x1c15, 0xbf16, 0xb2fc, 0xba2d, 0xab9f, 0x4037, 0x1f6d, 0x2f24, 0x4309, 0x4431, 0xbace, 0xba3d, 0x43cc, 0xb2e1, 0x137d, 0x43d5, 0x3f6c, 0x41e8, 0x3089, 0x42bf, 0x45d3, 0x4049, 0xbf89, 0x0e07, 0x2da2, 0x427e, 0x43c9, 0xb2cd, 0x1f71, 0xadba, 0xb2e3, 0xba77, 0x4250, 0x46fc, 0x24c9, 0x43ce, 0xb02f, 0x468d, 0xba17, 0x2ee2, 0x448b, 0xbfbd, 0x195a, 0x41a3, 0x33fb, 0x437a, 0xbf65, 0x4004, 0x43ab, 0x42c3, 0xaa5c, 0x2944, 0x1baf, 0x2a27, 0x4266, 0xbf91, 0x41c6, 0x42b8, 0xba74, 0x41b7, 0x355c, 0xbae4, 0x405f, 0x40be, 0xbaf5, 0x437e, 0xbac0, 0x4204, 0x436f, 0x46f3, 0x1f70, 0x4277, 0x4053, 0xbf80, 0xb2ee, 0xbfd5, 0xb2b0, 0x41e9, 0x424b, 0x4135, 0x4561, 0xbae0, 0xb200, 0xba21, 0x4360, 0xb0c1, 0xb207, 0x40a1, 0x4373, 0xb09e, 0x0929, 0x3cad, 0x1997, 0x411a, 0xb020, 0xbfa2, 0x3fca, 0xb23d, 0x087e, 0x055d, 0x4149, 0xb289, 0x2152, 0x1be1, 0x43b1, 0x40a1, 0xbf0d, 0x431d, 0xa7b2, 0x3d9a, 0x40a1, 0x42cf, 0x43e4, 0xbfc2, 0xaf46, 0xb23e, 0xb2e6, 0xb279, 0xa8af, 0xb076, 0xb0e7, 0x184a, 0x41bf, 0x42c8, 0x3d7b, 0xb02c, 0x1bd0, 0x1866, 0x14fe, 0x19c0, 0x409b, 0x435c, 0x4169, 0x405d, 0x4556, 0x4052, 0x435b, 0x412b, 0xbf73, 0x1ed8, 0x419f, 0x198b, 0x43da, 0x42f3, 0xba35, 0x1db6, 0xb012, 0x43d6, 0x0534, 0xabbe, 0x2ce2, 0x427f, 0x435f, 0x4169, 0x4265, 0xbf58, 0xb280, 0xbf90, 0x404e, 0xba75, 0x4162, 0x4105, 0xba5d, 0x40c4, 0x4044, 0x3603, 0x43c0, 0xb2ba, 0xb0b5, 0x247f, 0xba45, 0x4330, 0xb21a, 0x40ba, 0xba1d, 0xb24f, 0x43e3, 0xb09c, 0xbf5e, 0xb07d, 0xba5a, 0xb093, 0xb244, 0xba35, 0x419d, 0x4303, 0x09ce, 0x1af4, 0x4584, 0xb215, 0x4385, 0xb2ef, 0x46a4, 0x413d, 0x4389, 0x1d06, 0x07b8, 0x4558, 0x4494, 0x460a, 0xbf3c, 0x4158, 0xb225, 0xb2f1, 0x41ce, 0xbf2e, 0xb054, 0x4249, 0x45c6, 0x433e, 0x4685, 0x0ade, 0x4172, 0x42dc, 0x0fbd, 0x24d2, 0x4101, 0xbfd0, 0xb2a9, 0x4155, 0x416a, 0x4186, 0xba42, 0xb269, 0x1b7d, 0x4132, 0xa644, 0x1fc0, 0x43a1, 0xbf23, 0x02c3, 0x280b, 0x40b4, 0x4149, 0x4029, 0x217e, 0x10d4, 0x422a, 0x43ba, 0xba4b, 0x4291, 0x04ca, 0x1b38, 0x439a, 0x2d58, 0x42ca, 0x1e61, 0x2260, 0x4639, 0x46ca, 0x45be, 0xbf26, 0xb26d, 0x422e, 0x28d7, 0x4055, 0x3584, 0x41ff, 0x4322, 0xb27a, 0x40ee, 0x42f5, 0xba76, 0x40cc, 0xba68, 0x41b2, 0x1053, 0xbf7a, 0x4351, 0xb2a9, 0x4209, 0x2895, 0xb013, 0xbfd0, 0xa94c, 0x32bd, 0x41d8, 0xb283, 0x405c, 0x195d, 0xb25d, 0x1f07, 0xb249, 0x1a63, 0xb079, 0xaa92, 0x140c, 0xa9f0, 0x2d54, 0xa645, 0x37b2, 0x0ae8, 0xbf57, 0xbaf4, 0xba7c, 0x0abd, 0x42b9, 0x405c, 0x3f47, 0x43df, 0xb2db, 0x4329, 0x4134, 0x298d, 0xbaf3, 0xbfd5, 0xb2e3, 0x193e, 0xb232, 0xb276, 0xa3a0, 0x1d92, 0x41f6, 0x420f, 0x424d, 0xba32, 0x426a, 0xa208, 0x37fd, 0xba7e, 0x4363, 0x405f, 0x2b88, 0x1094, 0xbf1b, 0x1f17, 0xa26c, 0xbf70, 0xb27a, 0xb03a, 0x415b, 0x436d, 0xacf7, 0x42b2, 0xa2a5, 0x42f9, 0x414b, 0x4236, 0x1c8d, 0xbfa9, 0x41d8, 0x45a8, 0x43f5, 0x3226, 0xb0ec, 0x4248, 0x1e80, 0x4192, 0x1c5b, 0xb287, 0x4107, 0x467b, 0x4391, 0x406b, 0x4489, 0x18c6, 0x44dc, 0x4126, 0x1c8d, 0xb029, 0x42ac, 0x4055, 0x413e, 0x408e, 0xbf76, 0x052a, 0xbf90, 0xb261, 0xb2ae, 0x42b4, 0x26af, 0x43d5, 0x4084, 0xba6b, 0xb002, 0x09f3, 0x1f9b, 0x4300, 0xbf92, 0xa86c, 0x4187, 0x46f3, 0xb0cb, 0x41c1, 0x400e, 0x04b6, 0xbaf0, 0x10bc, 0xb0ff, 0xbfc1, 0xb244, 0x3bf7, 0x45a2, 0x4173, 0x415b, 0xba34, 0x3976, 0x1837, 0x40ad, 0x197e, 0x284b, 0x459a, 0x17e0, 0x41bf, 0x408f, 0x1ae0, 0x13a0, 0xbacd, 0x40c1, 0x420b, 0xba22, 0x44e8, 0x41a9, 0xa4b1, 0xb2ba, 0x41b2, 0x2d95, 0x4320, 0x4663, 0xbf37, 0xa9ae, 0xb2c5, 0x2310, 0x4329, 0x4239, 0xb0ef, 0x2d06, 0x4418, 0x42f3, 0xba76, 0xa639, 0x45d8, 0xb263, 0x2dc3, 0x1ce6, 0xbf4b, 0x43e6, 0xa2b7, 0x1c0c, 0x0252, 0xbf9b, 0x4151, 0x4062, 0x4148, 0x4360, 0x43bf, 0x07ca, 0x15e8, 0x40e2, 0x34b3, 0x433a, 0x42e4, 0x38ce, 0x34cc, 0x1796, 0xb04d, 0x3fc2, 0x46d3, 0x422e, 0xb09d, 0xbaf0, 0x4319, 0x4057, 0x435e, 0xbfe0, 0x4393, 0xbf64, 0x1a89, 0x422e, 0xb01e, 0x400c, 0xb07d, 0x1d17, 0x426c, 0x46ab, 0x454f, 0x44e5, 0x4085, 0xb209, 0x194d, 0x1f97, 0x411d, 0x4051, 0x1fd4, 0x3a6e, 0xbf4a, 0xb27a, 0x0cda, 0xae68, 0x4026, 0xb2cc, 0xba30, 0xb24b, 0x1e97, 0xbf77, 0x4231, 0xa0c7, 0xb268, 0x268b, 0xb0ad, 0xb209, 0x1b9f, 0x4035, 0x4237, 0x0231, 0x1aaf, 0xb0cb, 0x1d8e, 0x42e4, 0x42e4, 0x21cf, 0xb2d2, 0x420d, 0x4041, 0xac5b, 0xa18a, 0x43f6, 0xbaf7, 0x388e, 0x1c7f, 0xa574, 0xbf89, 0x43bd, 0x1ab6, 0xba61, 0x4218, 0x1ea0, 0x42c9, 0x432d, 0x4376, 0x1933, 0x4134, 0x1d9b, 0x27df, 0x43c4, 0xbfd5, 0x4203, 0xa8dc, 0x0ae8, 0x440a, 0xba0c, 0x3294, 0x4174, 0x42c9, 0xa2d7, 0x42ed, 0xbad3, 0x1bfe, 0x4326, 0x4035, 0x4348, 0xb292, 0xbf9e, 0x18f3, 0x43f1, 0x1367, 0x411b, 0x4477, 0x1e0b, 0x1d22, 0x1c39, 0x40bd, 0x435a, 0x1be5, 0x13c2, 0x1b7c, 0x433c, 0xa9d8, 0xa165, 0xbf69, 0xb057, 0x413d, 0x40f9, 0xb202, 0x3e95, 0x4185, 0xbf29, 0x1f39, 0x19fd, 0x42f1, 0xa2f2, 0xb2d2, 0xb070, 0x415c, 0xbf24, 0x43ba, 0x3aca, 0x1a2f, 0x4150, 0x43de, 0xb2df, 0x436d, 0xbfba, 0xad69, 0x1080, 0xb0f5, 0x4307, 0x0ab6, 0x4002, 0x41f4, 0xba63, 0x4220, 0xb28f, 0xba7e, 0xa3b6, 0xa952, 0xba6a, 0x447f, 0x1cd0, 0xb055, 0x4392, 0xb231, 0x1af3, 0x4354, 0x41cf, 0xa231, 0xbfde, 0x35ca, 0xab3b, 0xb0e7, 0x43ea, 0xbae7, 0x4375, 0x43ce, 0x31e5, 0x393c, 0x42f9, 0x4135, 0xb260, 0x409b, 0xba67, 0xb26d, 0x3fac, 0xb26c, 0x425d, 0x43de, 0xbf6d, 0x435b, 0x2efd, 0x1ae3, 0x429f, 0x187d, 0xb0a5, 0x41d7, 0x40b9, 0xbad6, 0x15d3, 0x4666, 0x46ad, 0xbf6f, 0x2348, 0x4006, 0x1221, 0xba18, 0x4271, 0x4057, 0x1829, 0x1e42, 0xa497, 0x1dc7, 0x41eb, 0x4225, 0x43b5, 0x1603, 0xb04f, 0xbf84, 0x3451, 0xb055, 0x4499, 0xb2e1, 0x41cd, 0xb25a, 0x41d8, 0x4305, 0x40ee, 0x411e, 0xba6f, 0x0452, 0x4160, 0x413d, 0x408c, 0x4232, 0x4047, 0x4452, 0xba4c, 0xa758, 0xbf21, 0x4616, 0x1990, 0x422a, 0x1dae, 0x1f74, 0x0f3f, 0x1f61, 0xbac5, 0x1d9e, 0xbaf1, 0xbf12, 0x1bd8, 0x2b26, 0xb05d, 0x09a5, 0x408e, 0x1ca7, 0x0a35, 0xa904, 0xaed0, 0x16fb, 0xbf80, 0xa941, 0xae2a, 0x1e3e, 0xb256, 0xa51e, 0xb2c4, 0x435e, 0xb288, 0x403f, 0xb2a9, 0xa590, 0x40a3, 0x4112, 0xbf99, 0x1c5f, 0x426e, 0x40c1, 0xb26c, 0xbfae, 0xb2a3, 0x43a7, 0xb213, 0x420f, 0x429f, 0x4080, 0x38a0, 0xba39, 0x1afa, 0xb027, 0x36e3, 0x37ef, 0x42c4, 0x40c9, 0x42de, 0xb0ec, 0xbf0b, 0xbac5, 0x241d, 0x25fb, 0x4182, 0xb251, 0xaa91, 0x4383, 0xbfb3, 0xba70, 0xb0a0, 0xba77, 0x4068, 0x1c8f, 0x12d3, 0xb27f, 0xb2c8, 0xbada, 0x3b8f, 0xbf32, 0xbaec, 0xb092, 0xbae3, 0x4770, 0xe7fe + ], + StartRegs = [0x989fe979, 0xeb6d1dc2, 0x0199a793, 0xfd6ddabf, 0x2337d8f4, 0x10d088ef, 0x6abc19fa, 0x03f7a6b3, 0x8efc124d, 0x26bfcdfd, 0x162448d8, 0x1f47e67e, 0xbfa7bf3d, 0xf5019635, 0x00000000, 0x100001f0 + ], + FinalRegs = [0x000000ea, 0xffffffea, 0xfffffbff, 0x00001d00, 0x0000001d, 0x000019b4, 0x000000a6, 0xffffffec, 0x3fffff72, 0xffd83f36, 0xbfa7bf3d, 0x000000d6, 0x020003a0, 0xffffdcc8, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x432c, 0x0c6d, 0xb075, 0x4339, 0x43c2, 0xb043, 0x4305, 0x42c6, 0x0cb5, 0x3d42, 0x3249, 0x40c7, 0xbf9f, 0x0213, 0x4268, 0x4192, 0x342f, 0x20a6, 0xb2bf, 0x0700, 0x41ae, 0x17af, 0x1c55, 0xbfd1, 0x437d, 0x3f9d, 0x40a9, 0x41e4, 0xba3d, 0x415d, 0xb2bf, 0x4211, 0x2b93, 0x4161, 0x412a, 0x41e7, 0x2540, 0x41a9, 0xbacf, 0x34a4, 0x1847, 0x448b, 0x448a, 0x4187, 0x40cc, 0xa4d4, 0xb2fd, 0xb2d5, 0x1e75, 0x0762, 0x43ac, 0x4020, 0xbf8f, 0xb207, 0x4351, 0xb296, 0xb230, 0xb0e4, 0xbf4c, 0x44e2, 0x4043, 0xbac6, 0xb26b, 0xb2c3, 0x3a43, 0x4182, 0x46d9, 0x312b, 0x32a1, 0x3341, 0x4136, 0x4385, 0xbf77, 0x30bb, 0x4083, 0x4621, 0xba7a, 0x46c0, 0xb2eb, 0x42c5, 0xb27f, 0x1e4f, 0x416f, 0x199e, 0x4463, 0xbf8b, 0x4117, 0xbaf4, 0x45f2, 0x3e2f, 0xb248, 0x41d0, 0xb068, 0x467f, 0xa251, 0xb26e, 0x29aa, 0x2bbf, 0xb2cf, 0x439e, 0x1e50, 0x41f9, 0xbf80, 0x456d, 0xbf48, 0x1ff7, 0x46f9, 0x28ba, 0xbae5, 0x455a, 0xb23a, 0x4234, 0x4224, 0x3582, 0x41d8, 0x4038, 0x420d, 0x42a4, 0x2823, 0x2019, 0xbf98, 0x289f, 0xb027, 0x3f10, 0x2356, 0x43d4, 0x4327, 0x2b77, 0xab61, 0x43dc, 0x41fe, 0x1560, 0x01d5, 0x43cc, 0x4310, 0xbf04, 0x4053, 0x093b, 0x43b5, 0x4311, 0xb033, 0x30ba, 0xae34, 0xbf78, 0x4051, 0xba31, 0x4113, 0x4364, 0xaa6d, 0x2548, 0xb254, 0x1979, 0x4399, 0xb2d1, 0x2a2e, 0xb22e, 0x40a2, 0x1026, 0x428d, 0xb29f, 0x18b9, 0xb0b5, 0x422a, 0x4138, 0x2e00, 0x402b, 0xbf2c, 0xb06a, 0x187c, 0x402f, 0xba21, 0x407d, 0x008f, 0x4119, 0xb2ef, 0x4260, 0x4185, 0x43f8, 0x4028, 0xbae3, 0x4005, 0x1f3a, 0xad44, 0xb28e, 0xa699, 0xa201, 0x4243, 0xb2b5, 0x1978, 0x40d2, 0xbf48, 0x430a, 0x1965, 0xb222, 0x123c, 0x40ab, 0x0239, 0xb2b0, 0xbf9d, 0x36b8, 0x2273, 0xafdb, 0xb2dd, 0x1b98, 0x3bd9, 0x2680, 0xba1b, 0x1485, 0x4387, 0x42e2, 0x3bc3, 0x43c9, 0xb005, 0x363c, 0xbf07, 0xba48, 0x3851, 0xba45, 0x4288, 0x41ea, 0x19f6, 0xb2e6, 0x1a33, 0x413c, 0x4002, 0x4304, 0x42de, 0xbadf, 0x1b8a, 0x4032, 0xb219, 0x4423, 0x4634, 0x4089, 0x4640, 0x1b8d, 0x4207, 0x3e42, 0x41f1, 0x42fa, 0xbfa7, 0x4601, 0x1f59, 0xb2cf, 0x40bf, 0x4559, 0x1eb2, 0x1bdb, 0x42af, 0xb226, 0x44f4, 0x43a2, 0x1aea, 0x3d70, 0x190d, 0x436a, 0xb2b9, 0x17f6, 0xba64, 0x44d3, 0x400c, 0xb033, 0x4015, 0x0c75, 0xba2c, 0xbae8, 0xbf64, 0x1a67, 0x411e, 0xb2dc, 0x41ca, 0x45ec, 0x08d1, 0x4039, 0x42b9, 0x40f1, 0xb076, 0xae19, 0xb256, 0x3711, 0x4067, 0x410b, 0xa4c0, 0x1cd5, 0x1c2e, 0x1f01, 0x426c, 0x4274, 0x075d, 0xbf66, 0x2825, 0x1fca, 0xb266, 0xbaf2, 0x424a, 0x42f6, 0x236d, 0xb27f, 0xb2fa, 0x45eb, 0xbf0e, 0x1cdd, 0xaf37, 0x43a7, 0xb08e, 0x4258, 0x41f3, 0x211e, 0x40b6, 0xba7a, 0xbf76, 0x467c, 0x417d, 0x4173, 0x4623, 0x4058, 0xbad5, 0x423c, 0xbf80, 0x42e7, 0x3860, 0x2a24, 0x0276, 0xb033, 0xbfdc, 0xb2c3, 0xb224, 0xb27e, 0x2369, 0xba38, 0x4277, 0xb07a, 0x42c2, 0x41c2, 0x4668, 0xa9f2, 0xbae0, 0xbfc2, 0x41c2, 0x414e, 0x4322, 0x42d9, 0xbaf8, 0x169e, 0x4229, 0x2d30, 0x402b, 0x42ef, 0xb2e0, 0x42c4, 0x3c0f, 0x33ac, 0x117b, 0xbacd, 0x1961, 0x41af, 0x4041, 0xba1d, 0xbfa0, 0xbf7c, 0x403d, 0x3710, 0x429d, 0x41e8, 0xba30, 0xbf80, 0xacb2, 0x196a, 0x40b1, 0x416c, 0x1a81, 0xbf90, 0x41ef, 0xb079, 0x412c, 0xb00a, 0xbf80, 0x03d7, 0xb28b, 0x44ed, 0x4153, 0xbf7f, 0x413a, 0x4553, 0x416b, 0x4030, 0x408a, 0x1fc8, 0xb0d4, 0x3ad1, 0x4153, 0x4188, 0x409e, 0x45a0, 0x390b, 0x0957, 0x105d, 0x2a7c, 0x437c, 0xbf4f, 0xba1b, 0x1847, 0xb22a, 0x4574, 0xba75, 0x4162, 0x17f6, 0x4357, 0x42e1, 0x4186, 0x4378, 0x4035, 0xa34c, 0x43e1, 0x1d89, 0x46a1, 0x3132, 0x443e, 0x4173, 0x45c2, 0x1fd2, 0x41f9, 0xbfb4, 0x460c, 0x1f6e, 0x3143, 0x435a, 0xb2bc, 0x4272, 0x1719, 0xbacc, 0xbf46, 0x427d, 0x40d9, 0x437e, 0x03aa, 0x41fd, 0x4187, 0x3d10, 0x40b6, 0xb2d2, 0xbfd0, 0x427d, 0x421c, 0x430a, 0xba14, 0x18cb, 0xba2c, 0xb087, 0xbfb3, 0x3e14, 0x4305, 0x4134, 0xb291, 0x165c, 0x406b, 0xbf1e, 0x40cd, 0xb2dc, 0x403c, 0x029a, 0x0386, 0x406e, 0x429d, 0x1e23, 0x441c, 0x0b65, 0x460e, 0xb224, 0x4158, 0x3c93, 0xa9dc, 0xbfbd, 0x0dfc, 0x46ba, 0xb07f, 0xba01, 0x414d, 0x1744, 0x1cce, 0x40fa, 0x4120, 0x2b23, 0x4465, 0x1c51, 0x0aef, 0x4234, 0xb04a, 0x4392, 0x2c8e, 0xb20e, 0xbf61, 0xbae5, 0xba31, 0x4055, 0x42b4, 0xb28b, 0x02b5, 0x02a8, 0xa873, 0x417e, 0x41fe, 0x42c0, 0x4259, 0x41bc, 0xbff0, 0xbfc1, 0x1987, 0x40d2, 0x1b97, 0x41fc, 0x0019, 0x4139, 0xb212, 0x151d, 0x4231, 0xbfb0, 0xbafb, 0x06e7, 0x1817, 0x4270, 0x006c, 0x409c, 0x3797, 0x1801, 0x4116, 0xb242, 0x4028, 0xb2e8, 0x0e08, 0x426b, 0xbf8c, 0x1eb2, 0xb27e, 0xb2e9, 0x3814, 0x0b2a, 0xb2e7, 0xbf87, 0x2e03, 0x1bd0, 0x43f5, 0x4356, 0x42b1, 0xa47c, 0xb0f4, 0x427d, 0xb26a, 0xb287, 0x1b09, 0x0484, 0xbf85, 0x4112, 0xb057, 0xbfc0, 0x2044, 0x435f, 0x41a3, 0x3ba9, 0x4141, 0xb2a4, 0x4060, 0x40af, 0xb0fd, 0x4243, 0x4170, 0x422a, 0xba39, 0x416d, 0xbf81, 0xb2ef, 0xb061, 0xb015, 0x437e, 0xbfe2, 0x4168, 0x13c9, 0xb02d, 0x296a, 0x42d2, 0x3994, 0x426b, 0x46c3, 0x1a5d, 0x4336, 0x4133, 0x43a4, 0xb202, 0x42dd, 0x3226, 0xb2a9, 0xb0e7, 0x23db, 0xb072, 0x1bf5, 0x43f7, 0x44c5, 0xb223, 0x4312, 0xbf47, 0xba56, 0x1089, 0x27e8, 0xb208, 0xabdd, 0x3972, 0x41ce, 0x4371, 0x41c1, 0x4082, 0x2c57, 0x1ef7, 0x428c, 0x4053, 0x21b6, 0x447d, 0xb015, 0x40d2, 0x4110, 0x0df3, 0xbf8d, 0xb28d, 0x4350, 0xbada, 0x4058, 0xbaf3, 0x1e42, 0xbad4, 0xabca, 0x2d58, 0x41b7, 0x421f, 0x40a4, 0x0c09, 0xb022, 0x4170, 0x1811, 0x3af8, 0x30c1, 0xba50, 0x41e6, 0x4477, 0x425d, 0x4076, 0x42ca, 0x43a5, 0x1834, 0xbf7a, 0x31ad, 0xbafe, 0x1bc6, 0xb247, 0x1db0, 0x418f, 0x4163, 0x4008, 0x4674, 0xb2f5, 0xb269, 0xb215, 0x066e, 0x19dc, 0x24a4, 0xba0e, 0x4100, 0xbac7, 0xa0f0, 0x46ec, 0xa3c8, 0x311e, 0x0490, 0xb04b, 0x4016, 0x4085, 0x4024, 0xbf5b, 0x4028, 0xb2e5, 0xb054, 0x4189, 0xb267, 0xa751, 0x42b0, 0x40ca, 0xaf76, 0xbace, 0xbad2, 0xbf99, 0x1ef3, 0x435f, 0x4384, 0x3383, 0x4247, 0x4338, 0x1a84, 0x416a, 0xbaea, 0x41a6, 0x4002, 0xbf90, 0xb05a, 0xa518, 0x3010, 0x43eb, 0x4350, 0x352f, 0x43c9, 0xba2b, 0x3361, 0x421e, 0xb268, 0x407d, 0xbfb4, 0xba4e, 0x44b5, 0x41a2, 0x419f, 0x410f, 0x46c9, 0x19d8, 0x0eec, 0xbad3, 0xa0a0, 0xbf60, 0xbfda, 0x188a, 0x129a, 0x400d, 0xba64, 0x4310, 0x41af, 0xba79, 0xba55, 0xb063, 0xbf80, 0xbf0e, 0x442d, 0x1826, 0x42d1, 0x1bf8, 0x435f, 0xba15, 0x2f8f, 0x1945, 0xa28c, 0x41f4, 0xbf93, 0x1eab, 0xaaf6, 0xba0b, 0x2fda, 0xbfb0, 0x4228, 0xa802, 0xb2f6, 0x425d, 0xb2b8, 0xbf33, 0x418e, 0x435b, 0x1feb, 0x4252, 0x4359, 0x462b, 0xba17, 0x40bf, 0x43f9, 0x43d5, 0x03c1, 0x40bb, 0x40f7, 0x4391, 0xaa2c, 0x45b8, 0x4678, 0x42ad, 0x4088, 0x03c6, 0x4573, 0x40e9, 0xb282, 0x41cd, 0xb2f6, 0x1913, 0x40cd, 0x41e9, 0xbfa5, 0x262c, 0x42c9, 0x28d4, 0x3fec, 0x3b30, 0x42a4, 0x41ab, 0xbff0, 0x43f8, 0xb225, 0x41dc, 0xb2ff, 0x1866, 0x2870, 0x4286, 0xab63, 0x3889, 0x407d, 0x40fa, 0x25a1, 0x4488, 0x416c, 0x433a, 0xbfbf, 0x0155, 0x43f6, 0xb225, 0xb22e, 0x403f, 0x1355, 0x428f, 0xba2e, 0x438b, 0xb074, 0x445a, 0xb2de, 0xb0f1, 0x4241, 0x387f, 0xa5ab, 0x401c, 0xb02a, 0xb23a, 0xb22c, 0x2cba, 0x43c6, 0x1755, 0x4313, 0xbfb1, 0xa2de, 0x085c, 0xb0d9, 0x2705, 0xbf81, 0xb2af, 0xba09, 0x4314, 0xb2fa, 0xbad6, 0xbfb0, 0xbaf6, 0x1ba9, 0x4699, 0xb058, 0x43de, 0x32d1, 0x1c10, 0x41cb, 0xb281, 0x41be, 0x4360, 0xb296, 0x01d1, 0xb227, 0xafe4, 0x3965, 0x19d5, 0x40b6, 0xb09d, 0xb2e4, 0x42c3, 0x426a, 0xab02, 0xbf48, 0x4143, 0xbf1e, 0xb091, 0x0169, 0x09c9, 0xba62, 0x1f2b, 0xb060, 0xb0c4, 0x4353, 0x4377, 0x1c67, 0x4083, 0x1ba9, 0x43cb, 0x435f, 0x1b26, 0xb2ed, 0x3409, 0x2f3c, 0x41d0, 0x4306, 0x19f8, 0xb035, 0x4401, 0x076b, 0x4474, 0x1add, 0x41a4, 0xbf6a, 0x2302, 0x401a, 0x44f1, 0xbf6c, 0x426f, 0xb214, 0xb25d, 0xb226, 0x010f, 0x4261, 0xbacc, 0xbf25, 0x434e, 0x2220, 0xa694, 0x0089, 0x421d, 0x4083, 0x4092, 0x4333, 0xb22f, 0x4217, 0x432b, 0xb0d5, 0x4637, 0xab70, 0x42b4, 0x3cef, 0xb21a, 0x09ba, 0xb2fb, 0x4193, 0x41eb, 0xba2a, 0xba50, 0xa277, 0x4198, 0x4075, 0xbfbc, 0xaba3, 0x1814, 0x1dbd, 0xb260, 0x4305, 0xbfc0, 0x4334, 0x43cb, 0x2690, 0x1dd1, 0x42f4, 0xbf3f, 0x4294, 0x034c, 0x31f5, 0x4616, 0x4340, 0x224f, 0xba03, 0x4063, 0xb2ef, 0x4026, 0x4182, 0x4321, 0xaa72, 0x4242, 0x4265, 0xb085, 0xbaf2, 0xbfc9, 0xb2dc, 0x432c, 0x0a3b, 0xba19, 0x40fa, 0x4580, 0x1ec1, 0xba1b, 0x1a32, 0xa367, 0xbfe0, 0xacd3, 0x4179, 0x13e8, 0x2574, 0xb25c, 0xb228, 0x1852, 0xbfcb, 0xb2b6, 0x415c, 0x42bc, 0xba53, 0x439d, 0xbf2a, 0x15c3, 0xb2ac, 0x0d9c, 0xbf1c, 0xba32, 0xbaed, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x73229dce, 0x0f640776, 0x9c25ec11, 0x66a54f6d, 0xca4c2372, 0x617f5393, 0xfc67eb08, 0x99c5589c, 0x6805463b, 0x1f6ada41, 0x7ed9c21c, 0x50147fab, 0x6e783256, 0x5296ab63, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x00000074, 0x00000135, 0x10000000, 0x00000000, 0x00000000, 0x00003000, 0x00000010, 0x00000017, 0x6805463b, 0x0d36c137, 0x0a3e95fc, 0x6805463b, 0x0d32b38d, 0x0d36bf7f, 0x00000000, 0x200001d0 }, + Instructions = [0x432c, 0x0c6d, 0xb075, 0x4339, 0x43c2, 0xb043, 0x4305, 0x42c6, 0x0cb5, 0x3d42, 0x3249, 0x40c7, 0xbf9f, 0x0213, 0x4268, 0x4192, 0x342f, 0x20a6, 0xb2bf, 0x0700, 0x41ae, 0x17af, 0x1c55, 0xbfd1, 0x437d, 0x3f9d, 0x40a9, 0x41e4, 0xba3d, 0x415d, 0xb2bf, 0x4211, 0x2b93, 0x4161, 0x412a, 0x41e7, 0x2540, 0x41a9, 0xbacf, 0x34a4, 0x1847, 0x448b, 0x448a, 0x4187, 0x40cc, 0xa4d4, 0xb2fd, 0xb2d5, 0x1e75, 0x0762, 0x43ac, 0x4020, 0xbf8f, 0xb207, 0x4351, 0xb296, 0xb230, 0xb0e4, 0xbf4c, 0x44e2, 0x4043, 0xbac6, 0xb26b, 0xb2c3, 0x3a43, 0x4182, 0x46d9, 0x312b, 0x32a1, 0x3341, 0x4136, 0x4385, 0xbf77, 0x30bb, 0x4083, 0x4621, 0xba7a, 0x46c0, 0xb2eb, 0x42c5, 0xb27f, 0x1e4f, 0x416f, 0x199e, 0x4463, 0xbf8b, 0x4117, 0xbaf4, 0x45f2, 0x3e2f, 0xb248, 0x41d0, 0xb068, 0x467f, 0xa251, 0xb26e, 0x29aa, 0x2bbf, 0xb2cf, 0x439e, 0x1e50, 0x41f9, 0xbf80, 0x456d, 0xbf48, 0x1ff7, 0x46f9, 0x28ba, 0xbae5, 0x455a, 0xb23a, 0x4234, 0x4224, 0x3582, 0x41d8, 0x4038, 0x420d, 0x42a4, 0x2823, 0x2019, 0xbf98, 0x289f, 0xb027, 0x3f10, 0x2356, 0x43d4, 0x4327, 0x2b77, 0xab61, 0x43dc, 0x41fe, 0x1560, 0x01d5, 0x43cc, 0x4310, 0xbf04, 0x4053, 0x093b, 0x43b5, 0x4311, 0xb033, 0x30ba, 0xae34, 0xbf78, 0x4051, 0xba31, 0x4113, 0x4364, 0xaa6d, 0x2548, 0xb254, 0x1979, 0x4399, 0xb2d1, 0x2a2e, 0xb22e, 0x40a2, 0x1026, 0x428d, 0xb29f, 0x18b9, 0xb0b5, 0x422a, 0x4138, 0x2e00, 0x402b, 0xbf2c, 0xb06a, 0x187c, 0x402f, 0xba21, 0x407d, 0x008f, 0x4119, 0xb2ef, 0x4260, 0x4185, 0x43f8, 0x4028, 0xbae3, 0x4005, 0x1f3a, 0xad44, 0xb28e, 0xa699, 0xa201, 0x4243, 0xb2b5, 0x1978, 0x40d2, 0xbf48, 0x430a, 0x1965, 0xb222, 0x123c, 0x40ab, 0x0239, 0xb2b0, 0xbf9d, 0x36b8, 0x2273, 0xafdb, 0xb2dd, 0x1b98, 0x3bd9, 0x2680, 0xba1b, 0x1485, 0x4387, 0x42e2, 0x3bc3, 0x43c9, 0xb005, 0x363c, 0xbf07, 0xba48, 0x3851, 0xba45, 0x4288, 0x41ea, 0x19f6, 0xb2e6, 0x1a33, 0x413c, 0x4002, 0x4304, 0x42de, 0xbadf, 0x1b8a, 0x4032, 0xb219, 0x4423, 0x4634, 0x4089, 0x4640, 0x1b8d, 0x4207, 0x3e42, 0x41f1, 0x42fa, 0xbfa7, 0x4601, 0x1f59, 0xb2cf, 0x40bf, 0x4559, 0x1eb2, 0x1bdb, 0x42af, 0xb226, 0x44f4, 0x43a2, 0x1aea, 0x3d70, 0x190d, 0x436a, 0xb2b9, 0x17f6, 0xba64, 0x44d3, 0x400c, 0xb033, 0x4015, 0x0c75, 0xba2c, 0xbae8, 0xbf64, 0x1a67, 0x411e, 0xb2dc, 0x41ca, 0x45ec, 0x08d1, 0x4039, 0x42b9, 0x40f1, 0xb076, 0xae19, 0xb256, 0x3711, 0x4067, 0x410b, 0xa4c0, 0x1cd5, 0x1c2e, 0x1f01, 0x426c, 0x4274, 0x075d, 0xbf66, 0x2825, 0x1fca, 0xb266, 0xbaf2, 0x424a, 0x42f6, 0x236d, 0xb27f, 0xb2fa, 0x45eb, 0xbf0e, 0x1cdd, 0xaf37, 0x43a7, 0xb08e, 0x4258, 0x41f3, 0x211e, 0x40b6, 0xba7a, 0xbf76, 0x467c, 0x417d, 0x4173, 0x4623, 0x4058, 0xbad5, 0x423c, 0xbf80, 0x42e7, 0x3860, 0x2a24, 0x0276, 0xb033, 0xbfdc, 0xb2c3, 0xb224, 0xb27e, 0x2369, 0xba38, 0x4277, 0xb07a, 0x42c2, 0x41c2, 0x4668, 0xa9f2, 0xbae0, 0xbfc2, 0x41c2, 0x414e, 0x4322, 0x42d9, 0xbaf8, 0x169e, 0x4229, 0x2d30, 0x402b, 0x42ef, 0xb2e0, 0x42c4, 0x3c0f, 0x33ac, 0x117b, 0xbacd, 0x1961, 0x41af, 0x4041, 0xba1d, 0xbfa0, 0xbf7c, 0x403d, 0x3710, 0x429d, 0x41e8, 0xba30, 0xbf80, 0xacb2, 0x196a, 0x40b1, 0x416c, 0x1a81, 0xbf90, 0x41ef, 0xb079, 0x412c, 0xb00a, 0xbf80, 0x03d7, 0xb28b, 0x44ed, 0x4153, 0xbf7f, 0x413a, 0x4553, 0x416b, 0x4030, 0x408a, 0x1fc8, 0xb0d4, 0x3ad1, 0x4153, 0x4188, 0x409e, 0x45a0, 0x390b, 0x0957, 0x105d, 0x2a7c, 0x437c, 0xbf4f, 0xba1b, 0x1847, 0xb22a, 0x4574, 0xba75, 0x4162, 0x17f6, 0x4357, 0x42e1, 0x4186, 0x4378, 0x4035, 0xa34c, 0x43e1, 0x1d89, 0x46a1, 0x3132, 0x443e, 0x4173, 0x45c2, 0x1fd2, 0x41f9, 0xbfb4, 0x460c, 0x1f6e, 0x3143, 0x435a, 0xb2bc, 0x4272, 0x1719, 0xbacc, 0xbf46, 0x427d, 0x40d9, 0x437e, 0x03aa, 0x41fd, 0x4187, 0x3d10, 0x40b6, 0xb2d2, 0xbfd0, 0x427d, 0x421c, 0x430a, 0xba14, 0x18cb, 0xba2c, 0xb087, 0xbfb3, 0x3e14, 0x4305, 0x4134, 0xb291, 0x165c, 0x406b, 0xbf1e, 0x40cd, 0xb2dc, 0x403c, 0x029a, 0x0386, 0x406e, 0x429d, 0x1e23, 0x441c, 0x0b65, 0x460e, 0xb224, 0x4158, 0x3c93, 0xa9dc, 0xbfbd, 0x0dfc, 0x46ba, 0xb07f, 0xba01, 0x414d, 0x1744, 0x1cce, 0x40fa, 0x4120, 0x2b23, 0x4465, 0x1c51, 0x0aef, 0x4234, 0xb04a, 0x4392, 0x2c8e, 0xb20e, 0xbf61, 0xbae5, 0xba31, 0x4055, 0x42b4, 0xb28b, 0x02b5, 0x02a8, 0xa873, 0x417e, 0x41fe, 0x42c0, 0x4259, 0x41bc, 0xbff0, 0xbfc1, 0x1987, 0x40d2, 0x1b97, 0x41fc, 0x0019, 0x4139, 0xb212, 0x151d, 0x4231, 0xbfb0, 0xbafb, 0x06e7, 0x1817, 0x4270, 0x006c, 0x409c, 0x3797, 0x1801, 0x4116, 0xb242, 0x4028, 0xb2e8, 0x0e08, 0x426b, 0xbf8c, 0x1eb2, 0xb27e, 0xb2e9, 0x3814, 0x0b2a, 0xb2e7, 0xbf87, 0x2e03, 0x1bd0, 0x43f5, 0x4356, 0x42b1, 0xa47c, 0xb0f4, 0x427d, 0xb26a, 0xb287, 0x1b09, 0x0484, 0xbf85, 0x4112, 0xb057, 0xbfc0, 0x2044, 0x435f, 0x41a3, 0x3ba9, 0x4141, 0xb2a4, 0x4060, 0x40af, 0xb0fd, 0x4243, 0x4170, 0x422a, 0xba39, 0x416d, 0xbf81, 0xb2ef, 0xb061, 0xb015, 0x437e, 0xbfe2, 0x4168, 0x13c9, 0xb02d, 0x296a, 0x42d2, 0x3994, 0x426b, 0x46c3, 0x1a5d, 0x4336, 0x4133, 0x43a4, 0xb202, 0x42dd, 0x3226, 0xb2a9, 0xb0e7, 0x23db, 0xb072, 0x1bf5, 0x43f7, 0x44c5, 0xb223, 0x4312, 0xbf47, 0xba56, 0x1089, 0x27e8, 0xb208, 0xabdd, 0x3972, 0x41ce, 0x4371, 0x41c1, 0x4082, 0x2c57, 0x1ef7, 0x428c, 0x4053, 0x21b6, 0x447d, 0xb015, 0x40d2, 0x4110, 0x0df3, 0xbf8d, 0xb28d, 0x4350, 0xbada, 0x4058, 0xbaf3, 0x1e42, 0xbad4, 0xabca, 0x2d58, 0x41b7, 0x421f, 0x40a4, 0x0c09, 0xb022, 0x4170, 0x1811, 0x3af8, 0x30c1, 0xba50, 0x41e6, 0x4477, 0x425d, 0x4076, 0x42ca, 0x43a5, 0x1834, 0xbf7a, 0x31ad, 0xbafe, 0x1bc6, 0xb247, 0x1db0, 0x418f, 0x4163, 0x4008, 0x4674, 0xb2f5, 0xb269, 0xb215, 0x066e, 0x19dc, 0x24a4, 0xba0e, 0x4100, 0xbac7, 0xa0f0, 0x46ec, 0xa3c8, 0x311e, 0x0490, 0xb04b, 0x4016, 0x4085, 0x4024, 0xbf5b, 0x4028, 0xb2e5, 0xb054, 0x4189, 0xb267, 0xa751, 0x42b0, 0x40ca, 0xaf76, 0xbace, 0xbad2, 0xbf99, 0x1ef3, 0x435f, 0x4384, 0x3383, 0x4247, 0x4338, 0x1a84, 0x416a, 0xbaea, 0x41a6, 0x4002, 0xbf90, 0xb05a, 0xa518, 0x3010, 0x43eb, 0x4350, 0x352f, 0x43c9, 0xba2b, 0x3361, 0x421e, 0xb268, 0x407d, 0xbfb4, 0xba4e, 0x44b5, 0x41a2, 0x419f, 0x410f, 0x46c9, 0x19d8, 0x0eec, 0xbad3, 0xa0a0, 0xbf60, 0xbfda, 0x188a, 0x129a, 0x400d, 0xba64, 0x4310, 0x41af, 0xba79, 0xba55, 0xb063, 0xbf80, 0xbf0e, 0x442d, 0x1826, 0x42d1, 0x1bf8, 0x435f, 0xba15, 0x2f8f, 0x1945, 0xa28c, 0x41f4, 0xbf93, 0x1eab, 0xaaf6, 0xba0b, 0x2fda, 0xbfb0, 0x4228, 0xa802, 0xb2f6, 0x425d, 0xb2b8, 0xbf33, 0x418e, 0x435b, 0x1feb, 0x4252, 0x4359, 0x462b, 0xba17, 0x40bf, 0x43f9, 0x43d5, 0x03c1, 0x40bb, 0x40f7, 0x4391, 0xaa2c, 0x45b8, 0x4678, 0x42ad, 0x4088, 0x03c6, 0x4573, 0x40e9, 0xb282, 0x41cd, 0xb2f6, 0x1913, 0x40cd, 0x41e9, 0xbfa5, 0x262c, 0x42c9, 0x28d4, 0x3fec, 0x3b30, 0x42a4, 0x41ab, 0xbff0, 0x43f8, 0xb225, 0x41dc, 0xb2ff, 0x1866, 0x2870, 0x4286, 0xab63, 0x3889, 0x407d, 0x40fa, 0x25a1, 0x4488, 0x416c, 0x433a, 0xbfbf, 0x0155, 0x43f6, 0xb225, 0xb22e, 0x403f, 0x1355, 0x428f, 0xba2e, 0x438b, 0xb074, 0x445a, 0xb2de, 0xb0f1, 0x4241, 0x387f, 0xa5ab, 0x401c, 0xb02a, 0xb23a, 0xb22c, 0x2cba, 0x43c6, 0x1755, 0x4313, 0xbfb1, 0xa2de, 0x085c, 0xb0d9, 0x2705, 0xbf81, 0xb2af, 0xba09, 0x4314, 0xb2fa, 0xbad6, 0xbfb0, 0xbaf6, 0x1ba9, 0x4699, 0xb058, 0x43de, 0x32d1, 0x1c10, 0x41cb, 0xb281, 0x41be, 0x4360, 0xb296, 0x01d1, 0xb227, 0xafe4, 0x3965, 0x19d5, 0x40b6, 0xb09d, 0xb2e4, 0x42c3, 0x426a, 0xab02, 0xbf48, 0x4143, 0xbf1e, 0xb091, 0x0169, 0x09c9, 0xba62, 0x1f2b, 0xb060, 0xb0c4, 0x4353, 0x4377, 0x1c67, 0x4083, 0x1ba9, 0x43cb, 0x435f, 0x1b26, 0xb2ed, 0x3409, 0x2f3c, 0x41d0, 0x4306, 0x19f8, 0xb035, 0x4401, 0x076b, 0x4474, 0x1add, 0x41a4, 0xbf6a, 0x2302, 0x401a, 0x44f1, 0xbf6c, 0x426f, 0xb214, 0xb25d, 0xb226, 0x010f, 0x4261, 0xbacc, 0xbf25, 0x434e, 0x2220, 0xa694, 0x0089, 0x421d, 0x4083, 0x4092, 0x4333, 0xb22f, 0x4217, 0x432b, 0xb0d5, 0x4637, 0xab70, 0x42b4, 0x3cef, 0xb21a, 0x09ba, 0xb2fb, 0x4193, 0x41eb, 0xba2a, 0xba50, 0xa277, 0x4198, 0x4075, 0xbfbc, 0xaba3, 0x1814, 0x1dbd, 0xb260, 0x4305, 0xbfc0, 0x4334, 0x43cb, 0x2690, 0x1dd1, 0x42f4, 0xbf3f, 0x4294, 0x034c, 0x31f5, 0x4616, 0x4340, 0x224f, 0xba03, 0x4063, 0xb2ef, 0x4026, 0x4182, 0x4321, 0xaa72, 0x4242, 0x4265, 0xb085, 0xbaf2, 0xbfc9, 0xb2dc, 0x432c, 0x0a3b, 0xba19, 0x40fa, 0x4580, 0x1ec1, 0xba1b, 0x1a32, 0xa367, 0xbfe0, 0xacd3, 0x4179, 0x13e8, 0x2574, 0xb25c, 0xb228, 0x1852, 0xbfcb, 0xb2b6, 0x415c, 0x42bc, 0xba53, 0x439d, 0xbf2a, 0x15c3, 0xb2ac, 0x0d9c, 0xbf1c, 0xba32, 0xbaed, 0x4770, 0xe7fe + ], + StartRegs = [0x73229dce, 0x0f640776, 0x9c25ec11, 0x66a54f6d, 0xca4c2372, 0x617f5393, 0xfc67eb08, 0x99c5589c, 0x6805463b, 0x1f6ada41, 0x7ed9c21c, 0x50147fab, 0x6e783256, 0x5296ab63, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x00000074, 0x00000135, 0x10000000, 0x00000000, 0x00000000, 0x00003000, 0x00000010, 0x00000017, 0x6805463b, 0x0d36c137, 0x0a3e95fc, 0x6805463b, 0x0d32b38d, 0x0d36bf7f, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x42c2, 0x2d74, 0x4116, 0x4185, 0x40fd, 0x428a, 0x1707, 0x406c, 0xb298, 0xb252, 0x41ac, 0x1a53, 0xba5c, 0x411c, 0x4253, 0x3541, 0xbf27, 0x015a, 0xba76, 0x1226, 0x4251, 0xba16, 0xbfd0, 0x352c, 0x417b, 0xb009, 0x34c2, 0x41a9, 0x1d34, 0x438e, 0xb083, 0xb24a, 0x41d0, 0x1f5b, 0x1c0b, 0x4322, 0x1ae0, 0x234a, 0xbfd2, 0x43c9, 0x4212, 0x1556, 0x456d, 0x07bd, 0x4336, 0x43ab, 0xba1f, 0x3fd4, 0x4210, 0x41e2, 0x18d9, 0x1d4d, 0x4572, 0x4199, 0xb25e, 0xb207, 0x43fd, 0x3dee, 0x4382, 0x42fb, 0xb0cc, 0xba09, 0x2beb, 0x00e1, 0xba2a, 0xb068, 0xbf31, 0x40f0, 0x3c42, 0xb236, 0xb274, 0x44da, 0xa2d8, 0xb211, 0xba22, 0x43f8, 0x4102, 0x42e7, 0x46ca, 0x24ab, 0x4423, 0xb0f0, 0xb221, 0x421f, 0xb20d, 0x1dbe, 0x460c, 0x4040, 0xb026, 0xba47, 0x404d, 0xb22b, 0xbfb3, 0x43a8, 0x107b, 0xbf60, 0xb2d0, 0x430a, 0x3e97, 0xb272, 0x1c2b, 0x42b5, 0x4053, 0xb286, 0x42e0, 0xba44, 0x4114, 0x421c, 0xb2bf, 0x1eb5, 0x41de, 0x4097, 0xb273, 0x4121, 0x198c, 0xb281, 0xb03c, 0x409c, 0xbf46, 0xb2db, 0x443a, 0x41bf, 0xb244, 0x43a6, 0xaa45, 0xb03b, 0x43c8, 0x1d75, 0x400b, 0x1c22, 0xbae4, 0x0c72, 0x4130, 0xbae0, 0x46cc, 0xbfb1, 0x43ad, 0xba49, 0x41c2, 0x0327, 0x4027, 0x41ff, 0x4085, 0xbfcb, 0x412a, 0x1157, 0x43ab, 0xb23c, 0xb278, 0x421c, 0x416c, 0x4173, 0x43b1, 0x41c4, 0x40e9, 0x420e, 0x1bdf, 0xbfd0, 0x4672, 0xba6d, 0x07d1, 0x43c0, 0xb2aa, 0x40d1, 0x41d4, 0xa179, 0x44b2, 0xb052, 0x464a, 0xb24e, 0x4476, 0xa5a9, 0xbf0d, 0xbf90, 0x40c4, 0x44d9, 0x43cc, 0xbf00, 0x42bd, 0x4123, 0xb0ef, 0xba5f, 0x3212, 0x26f0, 0x4357, 0xb227, 0x43ef, 0x28d3, 0x1a18, 0x1e20, 0xade4, 0x42b0, 0xae3b, 0xa4cb, 0x1e56, 0x41c0, 0x434c, 0xbf51, 0x411e, 0xbfe0, 0xba57, 0xb06f, 0x4278, 0xbadd, 0xa0b7, 0x43b7, 0x41fe, 0x4284, 0x41a9, 0x40d7, 0xb0e4, 0x4418, 0x2466, 0x401f, 0xbfa4, 0xb258, 0x1aa7, 0x427b, 0xb2ec, 0x40e4, 0x40f3, 0x1f6b, 0x4462, 0xb29d, 0xb09d, 0x3a5d, 0x43d9, 0xb253, 0x40a7, 0xbac5, 0x4193, 0x0e8b, 0x43c0, 0x4214, 0x2268, 0xb2fc, 0x24b2, 0xb20c, 0x431e, 0x31a0, 0x43de, 0xbfc7, 0xad2f, 0xb0f3, 0x1fc6, 0xb272, 0x40fe, 0xb24f, 0x4115, 0x456e, 0x3ea3, 0x4122, 0x4323, 0x41b7, 0x414b, 0x4624, 0x33c0, 0x1eb4, 0x4333, 0x419e, 0x1a49, 0x1cc2, 0x35b5, 0x423e, 0xbf7c, 0x1f87, 0xb2cd, 0x43a1, 0xbf1c, 0x4215, 0xba79, 0xbfd7, 0xbad0, 0xba62, 0x4213, 0x429a, 0xbfbb, 0x43d6, 0x4197, 0x426d, 0x43f5, 0x4267, 0x40cd, 0xb2ad, 0x4071, 0xa27f, 0x3837, 0x408f, 0x41f2, 0x4167, 0x1d86, 0xaa44, 0xbae5, 0x1f57, 0x456a, 0x45c6, 0x42fb, 0xb2bc, 0xbf21, 0x199d, 0x1f8b, 0xba71, 0x443f, 0x1192, 0x4240, 0x43c2, 0xba2b, 0x4196, 0xb242, 0x3996, 0x0844, 0x4340, 0x4691, 0xbfe4, 0x1911, 0xb0fd, 0x402d, 0x419f, 0xad1e, 0x4038, 0x3877, 0x2e52, 0xb2a3, 0x2181, 0x35e8, 0xa034, 0x4115, 0x1b67, 0x43c1, 0x1c10, 0x2cac, 0x2a71, 0xb2f6, 0xa5dc, 0x4184, 0x4013, 0x19f5, 0x40c7, 0x4085, 0xbfc8, 0x456d, 0x4235, 0xba27, 0xbac8, 0xb298, 0xb29c, 0xbf00, 0xb051, 0x42d1, 0xb220, 0xbf03, 0xa71c, 0x44c0, 0x4327, 0x195d, 0x4092, 0x3e66, 0x40d0, 0x4345, 0x42fe, 0x41f3, 0x11cf, 0x4043, 0x1c92, 0xbacc, 0xbf04, 0x406f, 0x1da6, 0xba6a, 0x4059, 0xb01b, 0x43b6, 0x3fce, 0x43ff, 0x403e, 0x43da, 0xafac, 0x409e, 0x2481, 0x4148, 0x439e, 0x4220, 0x44a2, 0x437c, 0xbf3f, 0xb24d, 0x0870, 0x1cbd, 0x41bc, 0x4035, 0xb27f, 0xbf0a, 0x411c, 0x40f0, 0x1740, 0x4449, 0x4254, 0x430e, 0xb209, 0x41b6, 0x43f3, 0xb244, 0xbf70, 0x19bf, 0x412d, 0xa727, 0x1c54, 0x41e4, 0x43ee, 0xb093, 0xbf2b, 0xba16, 0x4063, 0x1e36, 0x35fc, 0xbae6, 0x4198, 0xbfb5, 0x01d4, 0x3182, 0x1fe1, 0x40f2, 0xbfc9, 0xb248, 0x2caa, 0x36f3, 0x40ac, 0x18b3, 0xb2a0, 0x43bc, 0xbfc0, 0xbf81, 0xb044, 0x43e6, 0x1fc6, 0xa96e, 0xb2fd, 0xa63b, 0xb002, 0x1aa8, 0xba59, 0x4307, 0x401a, 0x3bc9, 0xb2b3, 0x0cde, 0x4183, 0x4163, 0x4493, 0x430f, 0x4302, 0x42a0, 0x1d82, 0xbfd0, 0xb21e, 0x432c, 0xbfd9, 0x30c9, 0x406e, 0xa56b, 0xb05a, 0x3184, 0xba02, 0x43a5, 0xb204, 0xb229, 0xa861, 0x0096, 0x2731, 0xbf48, 0x13cf, 0x424a, 0x4564, 0xb2e8, 0x1c0d, 0x03f4, 0x434c, 0xb051, 0x0c36, 0x4286, 0xb2a2, 0xb082, 0x11ca, 0x195d, 0x35c8, 0xa2bb, 0x4649, 0x41a1, 0x423c, 0x458e, 0xb28a, 0xb0e0, 0x1dea, 0x365e, 0xbfdc, 0x33a6, 0xba77, 0x4318, 0x09c2, 0xbf9e, 0x1d19, 0x1660, 0x4213, 0x3a84, 0x1c5a, 0x1e48, 0x4174, 0x4585, 0x1cb4, 0xbf3f, 0x1280, 0x4215, 0x4036, 0x43f3, 0x4361, 0x4119, 0xb26a, 0x40a1, 0xb0e1, 0x4609, 0x3d49, 0x3257, 0xb2c3, 0xbfc0, 0x41c0, 0x41ff, 0x40ff, 0x3cec, 0x1c4c, 0x4217, 0xb20e, 0x411c, 0xb07c, 0x41ce, 0xbf79, 0x4349, 0x4392, 0x1b61, 0xba4f, 0x415e, 0x3dc1, 0x1623, 0xb0d5, 0x4099, 0x41c4, 0xbf0d, 0x1e73, 0x43e9, 0x4461, 0xb2ab, 0xba3a, 0x43a1, 0x4083, 0x428c, 0x4277, 0x0587, 0xb29d, 0xae40, 0xbad2, 0x42ad, 0x45e1, 0x407a, 0x4290, 0x409c, 0x42b5, 0x4001, 0xb2af, 0x25ef, 0x32ea, 0x1ad7, 0xbfc7, 0x42a0, 0x1cf5, 0x3c74, 0xbf00, 0x41f7, 0xb270, 0x4009, 0xaf02, 0x4331, 0x4627, 0x42ac, 0x4020, 0xbfb3, 0x42c2, 0xa284, 0xab3b, 0x40b2, 0x4319, 0xb051, 0x42cc, 0xb0ae, 0x206b, 0x413b, 0xb241, 0x2001, 0xb2b6, 0xbfa2, 0x408d, 0x34d3, 0x43db, 0xba01, 0x1a1f, 0x4396, 0x42b9, 0x4335, 0xa054, 0xa317, 0x1c89, 0x4186, 0xb01f, 0xba56, 0x4616, 0xb204, 0xb24e, 0x028d, 0x41d0, 0xb217, 0x2943, 0x402d, 0x1de0, 0x1988, 0xba51, 0xbfdd, 0xa8d1, 0x41d9, 0x40e2, 0x441a, 0x41fc, 0x4018, 0x4354, 0x430c, 0x404a, 0xb2a3, 0x42dc, 0xb230, 0xa56c, 0xbf05, 0x4121, 0x434e, 0xbae3, 0x401c, 0x2b71, 0xb2bb, 0x43b2, 0x084a, 0x19e1, 0x1f23, 0x444a, 0x40cf, 0xbf21, 0x41ef, 0xb243, 0x43ab, 0x404d, 0xb229, 0x00d5, 0xb2ce, 0x0a30, 0x41f0, 0x1c86, 0x419b, 0x1f9f, 0xa91e, 0x4164, 0xb0a2, 0x318d, 0x414a, 0xa788, 0xbf60, 0x42aa, 0x432f, 0x1754, 0xba1d, 0x4148, 0xbf0e, 0x44bc, 0xba0e, 0xabb9, 0x18ad, 0x0df7, 0x46e3, 0xbad6, 0x432d, 0x42c3, 0xb21e, 0x1ee1, 0x43be, 0x437d, 0xb23d, 0x43a1, 0x42cb, 0x0e87, 0xb226, 0xba14, 0x1cd1, 0x0971, 0x1a7d, 0x2824, 0x40bb, 0xb2bb, 0x0c39, 0xbf9f, 0xb2a2, 0x43b1, 0x0463, 0x426a, 0x18bb, 0xba13, 0x4311, 0xabcc, 0xba1e, 0x41d1, 0x3d05, 0x43f5, 0xafc8, 0x3d69, 0x405e, 0x38ae, 0xa74e, 0x401b, 0x417b, 0x378f, 0x4204, 0xbf60, 0x1c69, 0x378e, 0x0c89, 0xbfb4, 0xbfc0, 0xb235, 0x4032, 0xb218, 0x4011, 0x4188, 0x3b23, 0x4277, 0x186e, 0x3f07, 0x3860, 0x44f5, 0x46ac, 0xb019, 0x42fc, 0x41ef, 0x2835, 0x45e4, 0xbf77, 0x4038, 0x2bca, 0x42fc, 0x4303, 0xbad5, 0x00fc, 0x197c, 0x2b44, 0x39e8, 0xb2aa, 0x4674, 0xa0f7, 0xb2b3, 0xa01d, 0x1b99, 0x429e, 0x101a, 0x41c5, 0xb085, 0x4320, 0x3520, 0x1c04, 0x4283, 0x420c, 0x3cf3, 0x42f2, 0x414f, 0xb2c6, 0xbfdf, 0x41db, 0x4139, 0x18e3, 0xba4c, 0x43b7, 0xb0c2, 0x051f, 0x42cc, 0x4300, 0x1caf, 0x1ef3, 0x417a, 0x1aef, 0xbfa1, 0x43d4, 0x18cd, 0xb24c, 0x2610, 0xb22b, 0x4355, 0xb213, 0x1c9b, 0xb266, 0xbf82, 0x422b, 0xb048, 0x03e0, 0x4312, 0x4325, 0xa9c3, 0x43a1, 0xb083, 0x295f, 0x4257, 0xb221, 0x1ab7, 0xba30, 0x43b0, 0x27d6, 0x03ce, 0x403e, 0x4247, 0x1a77, 0x179e, 0x1ecd, 0x42b2, 0x1fcb, 0x3acb, 0xbf93, 0x1fdb, 0xb06b, 0xb2ec, 0x4116, 0xbad3, 0x0437, 0xb209, 0x2cc6, 0x1355, 0x402d, 0x4424, 0xbff0, 0xb0df, 0xb2ae, 0x4373, 0xbf75, 0x448c, 0x1c21, 0x1ebf, 0x40f4, 0x427d, 0x417f, 0xb205, 0x40fb, 0x406a, 0xba49, 0x40b8, 0xba45, 0x45d0, 0x419a, 0x41d2, 0x43c6, 0x1ada, 0x42bb, 0x44dd, 0xbf87, 0x1c48, 0x1116, 0x02ee, 0x41db, 0xb225, 0x3137, 0x0f02, 0xaf6e, 0x1ba4, 0x4085, 0xb2fd, 0x4699, 0xbf70, 0x4401, 0x03f6, 0xb0d6, 0xa069, 0x42f2, 0x1a31, 0x1c36, 0x421c, 0x403f, 0x3545, 0x1f3f, 0x4255, 0x1cae, 0xb0ef, 0x3f75, 0x41bc, 0xbfde, 0x40f2, 0x42cc, 0x1dbe, 0xb240, 0xb00b, 0x0f1b, 0xba61, 0x41da, 0x424a, 0xba4b, 0xbf0d, 0x2f8d, 0x418f, 0x189f, 0xb045, 0xa835, 0x2001, 0x28d8, 0xb2e9, 0x4018, 0x441d, 0xb0ff, 0x156f, 0xb240, 0x1d6c, 0xb209, 0xb067, 0xbf60, 0x4280, 0xbaee, 0xbafb, 0x41dd, 0xb040, 0xa92d, 0xbfac, 0x00f2, 0x1d85, 0x320b, 0xb2f5, 0x415e, 0x42d2, 0xb23b, 0x0f07, 0x436d, 0x4142, 0xb2fa, 0xb218, 0xba0a, 0x4088, 0xbf80, 0x19da, 0x1356, 0x43c8, 0x2171, 0x43e1, 0xbfda, 0x4215, 0x42bd, 0x4364, 0x424e, 0xb228, 0x4009, 0xbaee, 0x1bce, 0x0502, 0xb2ae, 0xb217, 0xa6c0, 0x2900, 0x4033, 0x40e8, 0xba45, 0x2caf, 0xb21f, 0xbae6, 0x37ae, 0x2684, 0x43c8, 0x31de, 0xb26f, 0x40eb, 0x4293, 0xb209, 0xbf0e, 0x41ea, 0x4290, 0x40c1, 0xb282, 0x1aa9, 0x28c0, 0x1b96, 0x1d5d, 0x13c2, 0x437f, 0xafd5, 0x41fa, 0xba21, 0x0efd, 0x412a, 0xb08c, 0x4011, 0x46ed, 0xbaee, 0x0121, 0xb250, 0x4075, 0x4386, 0x41a3, 0xbfbe, 0x21d1, 0x34ae, 0x2fce, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xebd6df8c, 0x38bf55a7, 0xab137ca7, 0x96f9989a, 0x94c70e1c, 0x27865596, 0x517c3a55, 0x121297cb, 0xb921216d, 0x142c6285, 0xbbeafbb7, 0x8e13fca7, 0x38c24dd1, 0x08c88e6c, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x00000061, 0x000000d1, 0x0ffffc61, 0xbd9eb746, 0x42616367, 0x00000303, 0x00000300, 0x1cf4f061, 0xb921216d, 0x00000000, 0x142c6306, 0x142c6285, 0x0000589c, 0x1cf4ecdd, 0x00000000, 0x200001d0 }, + Instructions = [0x42c2, 0x2d74, 0x4116, 0x4185, 0x40fd, 0x428a, 0x1707, 0x406c, 0xb298, 0xb252, 0x41ac, 0x1a53, 0xba5c, 0x411c, 0x4253, 0x3541, 0xbf27, 0x015a, 0xba76, 0x1226, 0x4251, 0xba16, 0xbfd0, 0x352c, 0x417b, 0xb009, 0x34c2, 0x41a9, 0x1d34, 0x438e, 0xb083, 0xb24a, 0x41d0, 0x1f5b, 0x1c0b, 0x4322, 0x1ae0, 0x234a, 0xbfd2, 0x43c9, 0x4212, 0x1556, 0x456d, 0x07bd, 0x4336, 0x43ab, 0xba1f, 0x3fd4, 0x4210, 0x41e2, 0x18d9, 0x1d4d, 0x4572, 0x4199, 0xb25e, 0xb207, 0x43fd, 0x3dee, 0x4382, 0x42fb, 0xb0cc, 0xba09, 0x2beb, 0x00e1, 0xba2a, 0xb068, 0xbf31, 0x40f0, 0x3c42, 0xb236, 0xb274, 0x44da, 0xa2d8, 0xb211, 0xba22, 0x43f8, 0x4102, 0x42e7, 0x46ca, 0x24ab, 0x4423, 0xb0f0, 0xb221, 0x421f, 0xb20d, 0x1dbe, 0x460c, 0x4040, 0xb026, 0xba47, 0x404d, 0xb22b, 0xbfb3, 0x43a8, 0x107b, 0xbf60, 0xb2d0, 0x430a, 0x3e97, 0xb272, 0x1c2b, 0x42b5, 0x4053, 0xb286, 0x42e0, 0xba44, 0x4114, 0x421c, 0xb2bf, 0x1eb5, 0x41de, 0x4097, 0xb273, 0x4121, 0x198c, 0xb281, 0xb03c, 0x409c, 0xbf46, 0xb2db, 0x443a, 0x41bf, 0xb244, 0x43a6, 0xaa45, 0xb03b, 0x43c8, 0x1d75, 0x400b, 0x1c22, 0xbae4, 0x0c72, 0x4130, 0xbae0, 0x46cc, 0xbfb1, 0x43ad, 0xba49, 0x41c2, 0x0327, 0x4027, 0x41ff, 0x4085, 0xbfcb, 0x412a, 0x1157, 0x43ab, 0xb23c, 0xb278, 0x421c, 0x416c, 0x4173, 0x43b1, 0x41c4, 0x40e9, 0x420e, 0x1bdf, 0xbfd0, 0x4672, 0xba6d, 0x07d1, 0x43c0, 0xb2aa, 0x40d1, 0x41d4, 0xa179, 0x44b2, 0xb052, 0x464a, 0xb24e, 0x4476, 0xa5a9, 0xbf0d, 0xbf90, 0x40c4, 0x44d9, 0x43cc, 0xbf00, 0x42bd, 0x4123, 0xb0ef, 0xba5f, 0x3212, 0x26f0, 0x4357, 0xb227, 0x43ef, 0x28d3, 0x1a18, 0x1e20, 0xade4, 0x42b0, 0xae3b, 0xa4cb, 0x1e56, 0x41c0, 0x434c, 0xbf51, 0x411e, 0xbfe0, 0xba57, 0xb06f, 0x4278, 0xbadd, 0xa0b7, 0x43b7, 0x41fe, 0x4284, 0x41a9, 0x40d7, 0xb0e4, 0x4418, 0x2466, 0x401f, 0xbfa4, 0xb258, 0x1aa7, 0x427b, 0xb2ec, 0x40e4, 0x40f3, 0x1f6b, 0x4462, 0xb29d, 0xb09d, 0x3a5d, 0x43d9, 0xb253, 0x40a7, 0xbac5, 0x4193, 0x0e8b, 0x43c0, 0x4214, 0x2268, 0xb2fc, 0x24b2, 0xb20c, 0x431e, 0x31a0, 0x43de, 0xbfc7, 0xad2f, 0xb0f3, 0x1fc6, 0xb272, 0x40fe, 0xb24f, 0x4115, 0x456e, 0x3ea3, 0x4122, 0x4323, 0x41b7, 0x414b, 0x4624, 0x33c0, 0x1eb4, 0x4333, 0x419e, 0x1a49, 0x1cc2, 0x35b5, 0x423e, 0xbf7c, 0x1f87, 0xb2cd, 0x43a1, 0xbf1c, 0x4215, 0xba79, 0xbfd7, 0xbad0, 0xba62, 0x4213, 0x429a, 0xbfbb, 0x43d6, 0x4197, 0x426d, 0x43f5, 0x4267, 0x40cd, 0xb2ad, 0x4071, 0xa27f, 0x3837, 0x408f, 0x41f2, 0x4167, 0x1d86, 0xaa44, 0xbae5, 0x1f57, 0x456a, 0x45c6, 0x42fb, 0xb2bc, 0xbf21, 0x199d, 0x1f8b, 0xba71, 0x443f, 0x1192, 0x4240, 0x43c2, 0xba2b, 0x4196, 0xb242, 0x3996, 0x0844, 0x4340, 0x4691, 0xbfe4, 0x1911, 0xb0fd, 0x402d, 0x419f, 0xad1e, 0x4038, 0x3877, 0x2e52, 0xb2a3, 0x2181, 0x35e8, 0xa034, 0x4115, 0x1b67, 0x43c1, 0x1c10, 0x2cac, 0x2a71, 0xb2f6, 0xa5dc, 0x4184, 0x4013, 0x19f5, 0x40c7, 0x4085, 0xbfc8, 0x456d, 0x4235, 0xba27, 0xbac8, 0xb298, 0xb29c, 0xbf00, 0xb051, 0x42d1, 0xb220, 0xbf03, 0xa71c, 0x44c0, 0x4327, 0x195d, 0x4092, 0x3e66, 0x40d0, 0x4345, 0x42fe, 0x41f3, 0x11cf, 0x4043, 0x1c92, 0xbacc, 0xbf04, 0x406f, 0x1da6, 0xba6a, 0x4059, 0xb01b, 0x43b6, 0x3fce, 0x43ff, 0x403e, 0x43da, 0xafac, 0x409e, 0x2481, 0x4148, 0x439e, 0x4220, 0x44a2, 0x437c, 0xbf3f, 0xb24d, 0x0870, 0x1cbd, 0x41bc, 0x4035, 0xb27f, 0xbf0a, 0x411c, 0x40f0, 0x1740, 0x4449, 0x4254, 0x430e, 0xb209, 0x41b6, 0x43f3, 0xb244, 0xbf70, 0x19bf, 0x412d, 0xa727, 0x1c54, 0x41e4, 0x43ee, 0xb093, 0xbf2b, 0xba16, 0x4063, 0x1e36, 0x35fc, 0xbae6, 0x4198, 0xbfb5, 0x01d4, 0x3182, 0x1fe1, 0x40f2, 0xbfc9, 0xb248, 0x2caa, 0x36f3, 0x40ac, 0x18b3, 0xb2a0, 0x43bc, 0xbfc0, 0xbf81, 0xb044, 0x43e6, 0x1fc6, 0xa96e, 0xb2fd, 0xa63b, 0xb002, 0x1aa8, 0xba59, 0x4307, 0x401a, 0x3bc9, 0xb2b3, 0x0cde, 0x4183, 0x4163, 0x4493, 0x430f, 0x4302, 0x42a0, 0x1d82, 0xbfd0, 0xb21e, 0x432c, 0xbfd9, 0x30c9, 0x406e, 0xa56b, 0xb05a, 0x3184, 0xba02, 0x43a5, 0xb204, 0xb229, 0xa861, 0x0096, 0x2731, 0xbf48, 0x13cf, 0x424a, 0x4564, 0xb2e8, 0x1c0d, 0x03f4, 0x434c, 0xb051, 0x0c36, 0x4286, 0xb2a2, 0xb082, 0x11ca, 0x195d, 0x35c8, 0xa2bb, 0x4649, 0x41a1, 0x423c, 0x458e, 0xb28a, 0xb0e0, 0x1dea, 0x365e, 0xbfdc, 0x33a6, 0xba77, 0x4318, 0x09c2, 0xbf9e, 0x1d19, 0x1660, 0x4213, 0x3a84, 0x1c5a, 0x1e48, 0x4174, 0x4585, 0x1cb4, 0xbf3f, 0x1280, 0x4215, 0x4036, 0x43f3, 0x4361, 0x4119, 0xb26a, 0x40a1, 0xb0e1, 0x4609, 0x3d49, 0x3257, 0xb2c3, 0xbfc0, 0x41c0, 0x41ff, 0x40ff, 0x3cec, 0x1c4c, 0x4217, 0xb20e, 0x411c, 0xb07c, 0x41ce, 0xbf79, 0x4349, 0x4392, 0x1b61, 0xba4f, 0x415e, 0x3dc1, 0x1623, 0xb0d5, 0x4099, 0x41c4, 0xbf0d, 0x1e73, 0x43e9, 0x4461, 0xb2ab, 0xba3a, 0x43a1, 0x4083, 0x428c, 0x4277, 0x0587, 0xb29d, 0xae40, 0xbad2, 0x42ad, 0x45e1, 0x407a, 0x4290, 0x409c, 0x42b5, 0x4001, 0xb2af, 0x25ef, 0x32ea, 0x1ad7, 0xbfc7, 0x42a0, 0x1cf5, 0x3c74, 0xbf00, 0x41f7, 0xb270, 0x4009, 0xaf02, 0x4331, 0x4627, 0x42ac, 0x4020, 0xbfb3, 0x42c2, 0xa284, 0xab3b, 0x40b2, 0x4319, 0xb051, 0x42cc, 0xb0ae, 0x206b, 0x413b, 0xb241, 0x2001, 0xb2b6, 0xbfa2, 0x408d, 0x34d3, 0x43db, 0xba01, 0x1a1f, 0x4396, 0x42b9, 0x4335, 0xa054, 0xa317, 0x1c89, 0x4186, 0xb01f, 0xba56, 0x4616, 0xb204, 0xb24e, 0x028d, 0x41d0, 0xb217, 0x2943, 0x402d, 0x1de0, 0x1988, 0xba51, 0xbfdd, 0xa8d1, 0x41d9, 0x40e2, 0x441a, 0x41fc, 0x4018, 0x4354, 0x430c, 0x404a, 0xb2a3, 0x42dc, 0xb230, 0xa56c, 0xbf05, 0x4121, 0x434e, 0xbae3, 0x401c, 0x2b71, 0xb2bb, 0x43b2, 0x084a, 0x19e1, 0x1f23, 0x444a, 0x40cf, 0xbf21, 0x41ef, 0xb243, 0x43ab, 0x404d, 0xb229, 0x00d5, 0xb2ce, 0x0a30, 0x41f0, 0x1c86, 0x419b, 0x1f9f, 0xa91e, 0x4164, 0xb0a2, 0x318d, 0x414a, 0xa788, 0xbf60, 0x42aa, 0x432f, 0x1754, 0xba1d, 0x4148, 0xbf0e, 0x44bc, 0xba0e, 0xabb9, 0x18ad, 0x0df7, 0x46e3, 0xbad6, 0x432d, 0x42c3, 0xb21e, 0x1ee1, 0x43be, 0x437d, 0xb23d, 0x43a1, 0x42cb, 0x0e87, 0xb226, 0xba14, 0x1cd1, 0x0971, 0x1a7d, 0x2824, 0x40bb, 0xb2bb, 0x0c39, 0xbf9f, 0xb2a2, 0x43b1, 0x0463, 0x426a, 0x18bb, 0xba13, 0x4311, 0xabcc, 0xba1e, 0x41d1, 0x3d05, 0x43f5, 0xafc8, 0x3d69, 0x405e, 0x38ae, 0xa74e, 0x401b, 0x417b, 0x378f, 0x4204, 0xbf60, 0x1c69, 0x378e, 0x0c89, 0xbfb4, 0xbfc0, 0xb235, 0x4032, 0xb218, 0x4011, 0x4188, 0x3b23, 0x4277, 0x186e, 0x3f07, 0x3860, 0x44f5, 0x46ac, 0xb019, 0x42fc, 0x41ef, 0x2835, 0x45e4, 0xbf77, 0x4038, 0x2bca, 0x42fc, 0x4303, 0xbad5, 0x00fc, 0x197c, 0x2b44, 0x39e8, 0xb2aa, 0x4674, 0xa0f7, 0xb2b3, 0xa01d, 0x1b99, 0x429e, 0x101a, 0x41c5, 0xb085, 0x4320, 0x3520, 0x1c04, 0x4283, 0x420c, 0x3cf3, 0x42f2, 0x414f, 0xb2c6, 0xbfdf, 0x41db, 0x4139, 0x18e3, 0xba4c, 0x43b7, 0xb0c2, 0x051f, 0x42cc, 0x4300, 0x1caf, 0x1ef3, 0x417a, 0x1aef, 0xbfa1, 0x43d4, 0x18cd, 0xb24c, 0x2610, 0xb22b, 0x4355, 0xb213, 0x1c9b, 0xb266, 0xbf82, 0x422b, 0xb048, 0x03e0, 0x4312, 0x4325, 0xa9c3, 0x43a1, 0xb083, 0x295f, 0x4257, 0xb221, 0x1ab7, 0xba30, 0x43b0, 0x27d6, 0x03ce, 0x403e, 0x4247, 0x1a77, 0x179e, 0x1ecd, 0x42b2, 0x1fcb, 0x3acb, 0xbf93, 0x1fdb, 0xb06b, 0xb2ec, 0x4116, 0xbad3, 0x0437, 0xb209, 0x2cc6, 0x1355, 0x402d, 0x4424, 0xbff0, 0xb0df, 0xb2ae, 0x4373, 0xbf75, 0x448c, 0x1c21, 0x1ebf, 0x40f4, 0x427d, 0x417f, 0xb205, 0x40fb, 0x406a, 0xba49, 0x40b8, 0xba45, 0x45d0, 0x419a, 0x41d2, 0x43c6, 0x1ada, 0x42bb, 0x44dd, 0xbf87, 0x1c48, 0x1116, 0x02ee, 0x41db, 0xb225, 0x3137, 0x0f02, 0xaf6e, 0x1ba4, 0x4085, 0xb2fd, 0x4699, 0xbf70, 0x4401, 0x03f6, 0xb0d6, 0xa069, 0x42f2, 0x1a31, 0x1c36, 0x421c, 0x403f, 0x3545, 0x1f3f, 0x4255, 0x1cae, 0xb0ef, 0x3f75, 0x41bc, 0xbfde, 0x40f2, 0x42cc, 0x1dbe, 0xb240, 0xb00b, 0x0f1b, 0xba61, 0x41da, 0x424a, 0xba4b, 0xbf0d, 0x2f8d, 0x418f, 0x189f, 0xb045, 0xa835, 0x2001, 0x28d8, 0xb2e9, 0x4018, 0x441d, 0xb0ff, 0x156f, 0xb240, 0x1d6c, 0xb209, 0xb067, 0xbf60, 0x4280, 0xbaee, 0xbafb, 0x41dd, 0xb040, 0xa92d, 0xbfac, 0x00f2, 0x1d85, 0x320b, 0xb2f5, 0x415e, 0x42d2, 0xb23b, 0x0f07, 0x436d, 0x4142, 0xb2fa, 0xb218, 0xba0a, 0x4088, 0xbf80, 0x19da, 0x1356, 0x43c8, 0x2171, 0x43e1, 0xbfda, 0x4215, 0x42bd, 0x4364, 0x424e, 0xb228, 0x4009, 0xbaee, 0x1bce, 0x0502, 0xb2ae, 0xb217, 0xa6c0, 0x2900, 0x4033, 0x40e8, 0xba45, 0x2caf, 0xb21f, 0xbae6, 0x37ae, 0x2684, 0x43c8, 0x31de, 0xb26f, 0x40eb, 0x4293, 0xb209, 0xbf0e, 0x41ea, 0x4290, 0x40c1, 0xb282, 0x1aa9, 0x28c0, 0x1b96, 0x1d5d, 0x13c2, 0x437f, 0xafd5, 0x41fa, 0xba21, 0x0efd, 0x412a, 0xb08c, 0x4011, 0x46ed, 0xbaee, 0x0121, 0xb250, 0x4075, 0x4386, 0x41a3, 0xbfbe, 0x21d1, 0x34ae, 0x2fce, 0x4770, 0xe7fe + ], + StartRegs = [0xebd6df8c, 0x38bf55a7, 0xab137ca7, 0x96f9989a, 0x94c70e1c, 0x27865596, 0x517c3a55, 0x121297cb, 0xb921216d, 0x142c6285, 0xbbeafbb7, 0x8e13fca7, 0x38c24dd1, 0x08c88e6c, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x00000061, 0x000000d1, 0x0ffffc61, 0xbd9eb746, 0x42616367, 0x00000303, 0x00000300, 0x1cf4f061, 0xb921216d, 0x00000000, 0x142c6306, 0x142c6285, 0x0000589c, 0x1cf4ecdd, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x4338, 0x4299, 0x454c, 0x40a5, 0x4298, 0xbfa8, 0x3d94, 0x19e4, 0x345c, 0x45c0, 0x41ff, 0x1ab0, 0x19a5, 0x420a, 0x41df, 0xba39, 0x3566, 0x410a, 0x4337, 0x444a, 0x4290, 0x0663, 0xabc7, 0xa261, 0x324d, 0xbf41, 0xb222, 0x31c6, 0x10f2, 0xaee3, 0x43e0, 0x297b, 0xb284, 0x42f3, 0xbf60, 0x419e, 0x1577, 0xb2a4, 0x43a9, 0x1fcf, 0x44f2, 0x4404, 0xbaf0, 0x1f57, 0x4047, 0x1e49, 0x4187, 0xbf56, 0x40f3, 0x1380, 0x1fe3, 0x41a4, 0x4320, 0x407d, 0x428a, 0x1547, 0x439d, 0x40b0, 0x3a5b, 0x430b, 0x43f6, 0x4256, 0x195f, 0x423f, 0xb225, 0x4616, 0x4041, 0xb0c4, 0x43e0, 0xbfa6, 0xa0f5, 0xb077, 0x419f, 0xb2da, 0x1d2d, 0x40c0, 0xbfd0, 0xb243, 0x41f6, 0x41ff, 0x4390, 0x435b, 0x416e, 0x3f68, 0x0b87, 0x435d, 0xba48, 0x1af2, 0x410f, 0xa9b6, 0xbfbc, 0x4608, 0x1e08, 0x0178, 0xbfa8, 0x4019, 0xbae4, 0xb2f8, 0xa945, 0x1037, 0x421e, 0xb083, 0x422d, 0xa323, 0x34de, 0x439b, 0x407a, 0x4076, 0x4343, 0x4150, 0xb242, 0xba63, 0x302d, 0xbfd6, 0x06a7, 0x2697, 0x41d0, 0x415d, 0x4205, 0xbf70, 0x40c4, 0x1aa6, 0x42c8, 0x43b3, 0x4044, 0x4250, 0x3f43, 0x25e4, 0xbfc5, 0x19c7, 0xbf60, 0x43f1, 0xa2d9, 0xba5c, 0x4112, 0x461e, 0x1fc7, 0x1ad9, 0x425a, 0x4100, 0x2df6, 0xb284, 0x4295, 0x01fe, 0x0e8d, 0x42c2, 0x401f, 0xb277, 0xba3c, 0x4231, 0xbf43, 0x1e0b, 0x2c65, 0x12e5, 0x4119, 0x463a, 0x408e, 0x4358, 0x4356, 0x40d5, 0x4329, 0xbf71, 0x11c0, 0x0e12, 0x4022, 0x41e7, 0x467d, 0x460e, 0xb221, 0x41a2, 0x40bf, 0xbf27, 0xaeb8, 0xb2fc, 0xb0f1, 0x42ad, 0x1a47, 0x0111, 0x1a9e, 0xb04f, 0x40de, 0x4146, 0x3ad4, 0xa618, 0x408d, 0x1a2f, 0x1b24, 0x1dcd, 0xbac0, 0x3909, 0x3e34, 0x43e0, 0x4328, 0x434d, 0x4268, 0x404b, 0x1493, 0x435b, 0x45b9, 0xbfc9, 0x4439, 0x412a, 0x1de7, 0x0b4e, 0x436b, 0x4173, 0x304b, 0x447e, 0xa9c9, 0x403b, 0x42d6, 0x42a2, 0x43da, 0x1d54, 0x42eb, 0x4378, 0x464b, 0x1a7b, 0x292c, 0x3a9a, 0xbf75, 0x1ab2, 0x2b8f, 0x1db2, 0xb2d8, 0xb288, 0xbaed, 0x4202, 0x1df2, 0xb282, 0x0d5f, 0xbf05, 0x2cb7, 0xb293, 0x09e9, 0x4016, 0x403d, 0x43aa, 0x42bb, 0x4218, 0x44a0, 0x40e0, 0x4079, 0x1b6b, 0x41b3, 0x429e, 0x469c, 0x42fe, 0x1a84, 0x4481, 0xb2c7, 0xa3da, 0x42e6, 0xbfb9, 0x1f14, 0xb2ef, 0xba2b, 0x38bf, 0xadd9, 0x42fd, 0x1918, 0x1bc9, 0x0495, 0x08f9, 0x40a9, 0x3a59, 0x1821, 0x45f5, 0x4050, 0x427c, 0xb234, 0x45d0, 0xbaef, 0x43cc, 0xbfaf, 0xbad3, 0xb20a, 0xba2a, 0x43fb, 0xb26d, 0x1913, 0xb074, 0x1e82, 0x427c, 0x1bb6, 0x40d6, 0xbf04, 0xb202, 0x1ad3, 0x4041, 0xb26d, 0xb284, 0x405f, 0x1e47, 0x421f, 0x4036, 0x40e8, 0x4117, 0x414b, 0x421c, 0x40bb, 0xb2c4, 0x189b, 0xb20e, 0x4262, 0xabcd, 0xbf8c, 0xba15, 0x40ec, 0x406d, 0xb032, 0xb288, 0x2202, 0x1574, 0xb280, 0xbfa2, 0x4229, 0x0a10, 0x25cd, 0xb0bb, 0x442d, 0x41d1, 0x400e, 0x40d7, 0x41da, 0xb0f5, 0x439e, 0x1c27, 0xbfa5, 0x1037, 0xa2f5, 0x1d46, 0xbfe0, 0x4118, 0x2e5b, 0x1d76, 0xb2eb, 0x413e, 0x422e, 0x2f5d, 0xb277, 0x4255, 0x293d, 0x42ba, 0xa3c3, 0x3e34, 0xbfa9, 0x4372, 0x459b, 0xb2a6, 0xbfb0, 0x418f, 0x4039, 0x420b, 0xa411, 0x3f81, 0xbf71, 0x463b, 0x0320, 0x4136, 0xba7e, 0xa4fa, 0x41cd, 0xba36, 0xbf36, 0xb0f5, 0x415e, 0x1e0c, 0x44cb, 0xba29, 0x1e27, 0x04f0, 0x1d30, 0xbfe0, 0x41c2, 0x412d, 0xb270, 0x1d49, 0x1c0f, 0xb04c, 0x434d, 0x3c92, 0x1f4e, 0x30be, 0xade7, 0x4344, 0xba1f, 0xa02e, 0x4113, 0x1e0d, 0xb25b, 0xbfa4, 0xb001, 0x3134, 0x409f, 0x4150, 0x1b5c, 0x4007, 0xa6fa, 0x2ffd, 0x42d5, 0xba53, 0xb23f, 0x40e3, 0xb0ca, 0xa7f4, 0x18ef, 0x0936, 0x43c7, 0xbfc2, 0xab87, 0x4378, 0x3710, 0x40f6, 0x4622, 0x456a, 0x46ca, 0x46a4, 0x41b8, 0x412b, 0xba2f, 0x1e94, 0xba4e, 0xb2e4, 0x43e0, 0x1a71, 0x411d, 0x4164, 0x0b2b, 0x40bb, 0x43c1, 0x4267, 0xba1d, 0xb2ab, 0xbfc0, 0x0624, 0xbfbd, 0xb02d, 0x43e9, 0x18ad, 0x3146, 0xa882, 0x227f, 0x4382, 0x4314, 0x19cc, 0xb25d, 0x465b, 0x43c9, 0x1800, 0x4169, 0x426f, 0x427a, 0x182c, 0x41ed, 0x2dfb, 0x1239, 0x41a2, 0x1aae, 0x3887, 0x42c2, 0x4352, 0x46d2, 0x4362, 0xb27a, 0xbf5b, 0x3437, 0xb09b, 0x41fa, 0x1fa2, 0xb2ee, 0x3c06, 0x437b, 0x2315, 0x410e, 0x404e, 0xbf78, 0x4231, 0x4387, 0x4258, 0x32ba, 0xb264, 0x43c0, 0xbfc0, 0x4244, 0x46b2, 0x408a, 0xba45, 0xbf07, 0x1a65, 0x19c0, 0x448b, 0x3b5f, 0x419d, 0x4653, 0xbaf2, 0x423f, 0x4118, 0x4138, 0xbaf1, 0xb2ed, 0xb26c, 0x2947, 0x41d4, 0xb265, 0xa04c, 0x2b65, 0xba2d, 0xbad6, 0x418c, 0x3bc0, 0xb26b, 0x1ebd, 0x43e5, 0xbfd4, 0x43ae, 0xb271, 0x4226, 0xb03c, 0x409a, 0xb21f, 0x42e8, 0xbf1b, 0x449b, 0x4310, 0xb2a4, 0x245b, 0x4322, 0xa98a, 0x41eb, 0xb284, 0xb2ac, 0x410f, 0xb2cc, 0x439f, 0x437f, 0x4120, 0xba47, 0x190f, 0x4313, 0x424d, 0x36a7, 0x432a, 0x45e3, 0xb263, 0xbf13, 0xb0c7, 0x423a, 0x437b, 0x41a1, 0x42b1, 0xba59, 0x43e4, 0x40a7, 0x4679, 0x438a, 0xad17, 0x43b4, 0x1420, 0xb229, 0x42b8, 0xb2cf, 0x1a2e, 0x3665, 0x08c0, 0xbf9d, 0x32d9, 0x0937, 0xb0be, 0x43c4, 0x4220, 0x1d47, 0x40f6, 0x4373, 0x4257, 0xafdc, 0x23cf, 0x41f4, 0x3b0e, 0x40ce, 0xb230, 0xb255, 0x4664, 0x1dcb, 0xb291, 0x42fa, 0xbf91, 0x1d7c, 0xb020, 0xba72, 0x4007, 0x3978, 0x4054, 0xbaed, 0x1bf6, 0x31ff, 0x46cc, 0xa2f6, 0x3bd0, 0xba7e, 0x193e, 0xb287, 0xb031, 0xbae0, 0x40d3, 0xb0d4, 0xb0ae, 0x02d5, 0x434e, 0x403d, 0xafe6, 0x3faa, 0x411c, 0xbfbd, 0x0cd3, 0x119f, 0x4394, 0xbacc, 0xb2e1, 0x4180, 0x4351, 0xbaeb, 0x43a4, 0x43f9, 0x4138, 0x2b8b, 0x2caf, 0x413e, 0x41a8, 0xbf48, 0x42c4, 0x012d, 0x4172, 0x422d, 0xb08b, 0x4295, 0x19b4, 0x1fd9, 0x40d1, 0x45e2, 0x4228, 0x424b, 0xbad8, 0x40ee, 0x40e9, 0x439d, 0xbaef, 0xbadf, 0xbf2a, 0x40c8, 0x192c, 0x4408, 0x401c, 0x2766, 0x30bd, 0x40f5, 0x4387, 0x3c4a, 0xbf0f, 0xba2e, 0xb242, 0x4624, 0x1a7b, 0xb27e, 0xba6c, 0x4169, 0x419f, 0x406b, 0x4427, 0x0415, 0x3065, 0x4015, 0xb2eb, 0x1cdd, 0x4222, 0xb225, 0xa0ed, 0x1826, 0xba16, 0x437d, 0x0dae, 0xb0fe, 0xbfb6, 0xb256, 0x1666, 0x42df, 0x45b4, 0x0c1b, 0xba18, 0xb29b, 0x4586, 0xbf32, 0x1bfe, 0xbad5, 0x422c, 0xbf2d, 0x1cc6, 0x1e0d, 0xb0c9, 0x437c, 0x342f, 0x429d, 0x4103, 0xbf7c, 0x41a5, 0xb02f, 0x4035, 0x0a5d, 0xbac1, 0xac84, 0x4071, 0x0d2f, 0x4235, 0x4203, 0x44b8, 0x0677, 0xba51, 0xb0d1, 0xbae3, 0xae14, 0xbf49, 0xb29a, 0x41ff, 0x1298, 0x1e6a, 0xb286, 0x4156, 0x3c1e, 0x4088, 0x075d, 0x414c, 0x4343, 0x4197, 0xa990, 0xb085, 0xacb8, 0x1984, 0xbfe0, 0xa3f4, 0x423f, 0xb2e3, 0x41d6, 0x1d5d, 0xbf65, 0x407c, 0x4269, 0x348b, 0xb2af, 0x43e5, 0x4169, 0x42e6, 0x4258, 0x434b, 0xbfc0, 0x4385, 0x3551, 0x4452, 0x41fd, 0x461c, 0xb2c5, 0x1e89, 0xba0b, 0xbf00, 0xacdf, 0xb2c0, 0x4241, 0x4247, 0x421b, 0x436f, 0x43d2, 0x14e5, 0x45a5, 0xbf1b, 0x1e6b, 0x4195, 0x45f2, 0xb27b, 0x4125, 0xb29f, 0xb26e, 0x4010, 0x422a, 0xa1a0, 0xbafc, 0xaa80, 0x1c8f, 0xb06f, 0x43a8, 0x42ac, 0xbae1, 0x415f, 0x117d, 0x4339, 0xb250, 0xbfe2, 0x4263, 0xb2bd, 0x409c, 0xb269, 0x19a4, 0xbfc0, 0x0fdf, 0x41f6, 0x4621, 0x4044, 0x40f5, 0x2e6e, 0x4221, 0x46d3, 0xbf9a, 0xba60, 0x41bf, 0x424a, 0x43bf, 0xbf9c, 0x26c7, 0x4242, 0x1d65, 0xb050, 0x4612, 0xa5c5, 0x1da4, 0x43a3, 0xb0fb, 0x444d, 0xba09, 0x3649, 0x4062, 0x1293, 0xba5b, 0x2db9, 0x43dc, 0x4333, 0x1a29, 0xbf0d, 0x0c2d, 0x4306, 0x4001, 0xbf70, 0xb04a, 0x43b5, 0x32dc, 0xba2b, 0x4367, 0x412e, 0x191f, 0x1a9a, 0x4027, 0x4139, 0x1951, 0xbf00, 0x4239, 0x40e2, 0x42c2, 0x40f2, 0x0880, 0x43f8, 0x1da1, 0xbf99, 0xb245, 0x464e, 0xbaf4, 0x4220, 0x4653, 0x43b9, 0x3e09, 0xbfc5, 0xba26, 0xb287, 0x1747, 0xb231, 0xb2ff, 0x21a4, 0xba1e, 0x44b4, 0x44a3, 0x4281, 0x4113, 0x40ab, 0x02cd, 0xb0f6, 0x40c1, 0xba59, 0x42a6, 0xb2e1, 0x1ed0, 0x3728, 0xba7f, 0x425d, 0xbf82, 0x2b31, 0xb03e, 0x4133, 0x1ce6, 0x413d, 0x4027, 0xb2c5, 0x1e77, 0x424d, 0x4051, 0xa275, 0xb00b, 0x4090, 0x408c, 0xbf79, 0x0e9e, 0x0767, 0x196e, 0x424a, 0x46fa, 0x2756, 0x24c8, 0x2108, 0x09cd, 0x1b81, 0x421a, 0xb256, 0xb007, 0x0ad0, 0x40cd, 0x4114, 0x404a, 0x400e, 0x40d8, 0xbf70, 0x4476, 0x01e4, 0x40e0, 0x2e5d, 0xbf9a, 0x2d03, 0x45c2, 0xbf00, 0xb0c5, 0x4585, 0x40e6, 0x42dd, 0xbac3, 0x41c0, 0x1a33, 0x1f44, 0x4347, 0x41ec, 0x20fe, 0xbf69, 0x3e36, 0x41e0, 0xadd6, 0x1aee, 0x2879, 0xb258, 0x432a, 0x2c20, 0x1ba8, 0x0ba8, 0x4361, 0x42bc, 0x408c, 0xbf9a, 0x4127, 0x42e9, 0xba00, 0x4127, 0x0bd8, 0x421a, 0x1d0b, 0xb2c6, 0xb0b8, 0xbf65, 0x2eb1, 0x43ee, 0x43e4, 0x4103, 0xb041, 0x40e0, 0xa3f4, 0x421a, 0xb284, 0xba0c, 0xae98, 0x42b7, 0x2272, 0x1c87, 0x3cf3, 0x41c5, 0x423b, 0xb202, 0x1f4a, 0x43a6, 0x124a, 0xb20e, 0xb0b4, 0x40e4, 0x40e9, 0x4135, 0xa232, 0x18a6, 0xbf48, 0x461c, 0xba4a, 0xba16, 0xa76b, 0x4106, 0x4289, 0x43fe, 0xba65, 0x4127, 0x0a75, 0xaddb, 0x2441, 0x1904, 0x1705, 0xb2c6, 0x1503, 0xbff0, 0x43c1, 0xbf52, 0xbac9, 0xb241, 0xbf80, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x2fdaaeb9, 0xb79696f8, 0x5b75e8b3, 0xb8bc6fba, 0xcb255eac, 0xe7fd35fd, 0xddb0f0b1, 0x6a6b7524, 0x61dac898, 0x5adfbd3a, 0xe9b18555, 0xf3de49cb, 0x123c8a0c, 0x745a0959, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x00001400, 0x00000000, 0x00000000, 0x00000000, 0x00001441, 0x00000000, 0x00000000, 0x00000000, 0x61dac89a, 0x5adfbff0, 0x0000171e, 0x00000900, 0x5adfbff0, 0x745a0295, 0x00000000, 0x800001d0 }, + Instructions = [0x4338, 0x4299, 0x454c, 0x40a5, 0x4298, 0xbfa8, 0x3d94, 0x19e4, 0x345c, 0x45c0, 0x41ff, 0x1ab0, 0x19a5, 0x420a, 0x41df, 0xba39, 0x3566, 0x410a, 0x4337, 0x444a, 0x4290, 0x0663, 0xabc7, 0xa261, 0x324d, 0xbf41, 0xb222, 0x31c6, 0x10f2, 0xaee3, 0x43e0, 0x297b, 0xb284, 0x42f3, 0xbf60, 0x419e, 0x1577, 0xb2a4, 0x43a9, 0x1fcf, 0x44f2, 0x4404, 0xbaf0, 0x1f57, 0x4047, 0x1e49, 0x4187, 0xbf56, 0x40f3, 0x1380, 0x1fe3, 0x41a4, 0x4320, 0x407d, 0x428a, 0x1547, 0x439d, 0x40b0, 0x3a5b, 0x430b, 0x43f6, 0x4256, 0x195f, 0x423f, 0xb225, 0x4616, 0x4041, 0xb0c4, 0x43e0, 0xbfa6, 0xa0f5, 0xb077, 0x419f, 0xb2da, 0x1d2d, 0x40c0, 0xbfd0, 0xb243, 0x41f6, 0x41ff, 0x4390, 0x435b, 0x416e, 0x3f68, 0x0b87, 0x435d, 0xba48, 0x1af2, 0x410f, 0xa9b6, 0xbfbc, 0x4608, 0x1e08, 0x0178, 0xbfa8, 0x4019, 0xbae4, 0xb2f8, 0xa945, 0x1037, 0x421e, 0xb083, 0x422d, 0xa323, 0x34de, 0x439b, 0x407a, 0x4076, 0x4343, 0x4150, 0xb242, 0xba63, 0x302d, 0xbfd6, 0x06a7, 0x2697, 0x41d0, 0x415d, 0x4205, 0xbf70, 0x40c4, 0x1aa6, 0x42c8, 0x43b3, 0x4044, 0x4250, 0x3f43, 0x25e4, 0xbfc5, 0x19c7, 0xbf60, 0x43f1, 0xa2d9, 0xba5c, 0x4112, 0x461e, 0x1fc7, 0x1ad9, 0x425a, 0x4100, 0x2df6, 0xb284, 0x4295, 0x01fe, 0x0e8d, 0x42c2, 0x401f, 0xb277, 0xba3c, 0x4231, 0xbf43, 0x1e0b, 0x2c65, 0x12e5, 0x4119, 0x463a, 0x408e, 0x4358, 0x4356, 0x40d5, 0x4329, 0xbf71, 0x11c0, 0x0e12, 0x4022, 0x41e7, 0x467d, 0x460e, 0xb221, 0x41a2, 0x40bf, 0xbf27, 0xaeb8, 0xb2fc, 0xb0f1, 0x42ad, 0x1a47, 0x0111, 0x1a9e, 0xb04f, 0x40de, 0x4146, 0x3ad4, 0xa618, 0x408d, 0x1a2f, 0x1b24, 0x1dcd, 0xbac0, 0x3909, 0x3e34, 0x43e0, 0x4328, 0x434d, 0x4268, 0x404b, 0x1493, 0x435b, 0x45b9, 0xbfc9, 0x4439, 0x412a, 0x1de7, 0x0b4e, 0x436b, 0x4173, 0x304b, 0x447e, 0xa9c9, 0x403b, 0x42d6, 0x42a2, 0x43da, 0x1d54, 0x42eb, 0x4378, 0x464b, 0x1a7b, 0x292c, 0x3a9a, 0xbf75, 0x1ab2, 0x2b8f, 0x1db2, 0xb2d8, 0xb288, 0xbaed, 0x4202, 0x1df2, 0xb282, 0x0d5f, 0xbf05, 0x2cb7, 0xb293, 0x09e9, 0x4016, 0x403d, 0x43aa, 0x42bb, 0x4218, 0x44a0, 0x40e0, 0x4079, 0x1b6b, 0x41b3, 0x429e, 0x469c, 0x42fe, 0x1a84, 0x4481, 0xb2c7, 0xa3da, 0x42e6, 0xbfb9, 0x1f14, 0xb2ef, 0xba2b, 0x38bf, 0xadd9, 0x42fd, 0x1918, 0x1bc9, 0x0495, 0x08f9, 0x40a9, 0x3a59, 0x1821, 0x45f5, 0x4050, 0x427c, 0xb234, 0x45d0, 0xbaef, 0x43cc, 0xbfaf, 0xbad3, 0xb20a, 0xba2a, 0x43fb, 0xb26d, 0x1913, 0xb074, 0x1e82, 0x427c, 0x1bb6, 0x40d6, 0xbf04, 0xb202, 0x1ad3, 0x4041, 0xb26d, 0xb284, 0x405f, 0x1e47, 0x421f, 0x4036, 0x40e8, 0x4117, 0x414b, 0x421c, 0x40bb, 0xb2c4, 0x189b, 0xb20e, 0x4262, 0xabcd, 0xbf8c, 0xba15, 0x40ec, 0x406d, 0xb032, 0xb288, 0x2202, 0x1574, 0xb280, 0xbfa2, 0x4229, 0x0a10, 0x25cd, 0xb0bb, 0x442d, 0x41d1, 0x400e, 0x40d7, 0x41da, 0xb0f5, 0x439e, 0x1c27, 0xbfa5, 0x1037, 0xa2f5, 0x1d46, 0xbfe0, 0x4118, 0x2e5b, 0x1d76, 0xb2eb, 0x413e, 0x422e, 0x2f5d, 0xb277, 0x4255, 0x293d, 0x42ba, 0xa3c3, 0x3e34, 0xbfa9, 0x4372, 0x459b, 0xb2a6, 0xbfb0, 0x418f, 0x4039, 0x420b, 0xa411, 0x3f81, 0xbf71, 0x463b, 0x0320, 0x4136, 0xba7e, 0xa4fa, 0x41cd, 0xba36, 0xbf36, 0xb0f5, 0x415e, 0x1e0c, 0x44cb, 0xba29, 0x1e27, 0x04f0, 0x1d30, 0xbfe0, 0x41c2, 0x412d, 0xb270, 0x1d49, 0x1c0f, 0xb04c, 0x434d, 0x3c92, 0x1f4e, 0x30be, 0xade7, 0x4344, 0xba1f, 0xa02e, 0x4113, 0x1e0d, 0xb25b, 0xbfa4, 0xb001, 0x3134, 0x409f, 0x4150, 0x1b5c, 0x4007, 0xa6fa, 0x2ffd, 0x42d5, 0xba53, 0xb23f, 0x40e3, 0xb0ca, 0xa7f4, 0x18ef, 0x0936, 0x43c7, 0xbfc2, 0xab87, 0x4378, 0x3710, 0x40f6, 0x4622, 0x456a, 0x46ca, 0x46a4, 0x41b8, 0x412b, 0xba2f, 0x1e94, 0xba4e, 0xb2e4, 0x43e0, 0x1a71, 0x411d, 0x4164, 0x0b2b, 0x40bb, 0x43c1, 0x4267, 0xba1d, 0xb2ab, 0xbfc0, 0x0624, 0xbfbd, 0xb02d, 0x43e9, 0x18ad, 0x3146, 0xa882, 0x227f, 0x4382, 0x4314, 0x19cc, 0xb25d, 0x465b, 0x43c9, 0x1800, 0x4169, 0x426f, 0x427a, 0x182c, 0x41ed, 0x2dfb, 0x1239, 0x41a2, 0x1aae, 0x3887, 0x42c2, 0x4352, 0x46d2, 0x4362, 0xb27a, 0xbf5b, 0x3437, 0xb09b, 0x41fa, 0x1fa2, 0xb2ee, 0x3c06, 0x437b, 0x2315, 0x410e, 0x404e, 0xbf78, 0x4231, 0x4387, 0x4258, 0x32ba, 0xb264, 0x43c0, 0xbfc0, 0x4244, 0x46b2, 0x408a, 0xba45, 0xbf07, 0x1a65, 0x19c0, 0x448b, 0x3b5f, 0x419d, 0x4653, 0xbaf2, 0x423f, 0x4118, 0x4138, 0xbaf1, 0xb2ed, 0xb26c, 0x2947, 0x41d4, 0xb265, 0xa04c, 0x2b65, 0xba2d, 0xbad6, 0x418c, 0x3bc0, 0xb26b, 0x1ebd, 0x43e5, 0xbfd4, 0x43ae, 0xb271, 0x4226, 0xb03c, 0x409a, 0xb21f, 0x42e8, 0xbf1b, 0x449b, 0x4310, 0xb2a4, 0x245b, 0x4322, 0xa98a, 0x41eb, 0xb284, 0xb2ac, 0x410f, 0xb2cc, 0x439f, 0x437f, 0x4120, 0xba47, 0x190f, 0x4313, 0x424d, 0x36a7, 0x432a, 0x45e3, 0xb263, 0xbf13, 0xb0c7, 0x423a, 0x437b, 0x41a1, 0x42b1, 0xba59, 0x43e4, 0x40a7, 0x4679, 0x438a, 0xad17, 0x43b4, 0x1420, 0xb229, 0x42b8, 0xb2cf, 0x1a2e, 0x3665, 0x08c0, 0xbf9d, 0x32d9, 0x0937, 0xb0be, 0x43c4, 0x4220, 0x1d47, 0x40f6, 0x4373, 0x4257, 0xafdc, 0x23cf, 0x41f4, 0x3b0e, 0x40ce, 0xb230, 0xb255, 0x4664, 0x1dcb, 0xb291, 0x42fa, 0xbf91, 0x1d7c, 0xb020, 0xba72, 0x4007, 0x3978, 0x4054, 0xbaed, 0x1bf6, 0x31ff, 0x46cc, 0xa2f6, 0x3bd0, 0xba7e, 0x193e, 0xb287, 0xb031, 0xbae0, 0x40d3, 0xb0d4, 0xb0ae, 0x02d5, 0x434e, 0x403d, 0xafe6, 0x3faa, 0x411c, 0xbfbd, 0x0cd3, 0x119f, 0x4394, 0xbacc, 0xb2e1, 0x4180, 0x4351, 0xbaeb, 0x43a4, 0x43f9, 0x4138, 0x2b8b, 0x2caf, 0x413e, 0x41a8, 0xbf48, 0x42c4, 0x012d, 0x4172, 0x422d, 0xb08b, 0x4295, 0x19b4, 0x1fd9, 0x40d1, 0x45e2, 0x4228, 0x424b, 0xbad8, 0x40ee, 0x40e9, 0x439d, 0xbaef, 0xbadf, 0xbf2a, 0x40c8, 0x192c, 0x4408, 0x401c, 0x2766, 0x30bd, 0x40f5, 0x4387, 0x3c4a, 0xbf0f, 0xba2e, 0xb242, 0x4624, 0x1a7b, 0xb27e, 0xba6c, 0x4169, 0x419f, 0x406b, 0x4427, 0x0415, 0x3065, 0x4015, 0xb2eb, 0x1cdd, 0x4222, 0xb225, 0xa0ed, 0x1826, 0xba16, 0x437d, 0x0dae, 0xb0fe, 0xbfb6, 0xb256, 0x1666, 0x42df, 0x45b4, 0x0c1b, 0xba18, 0xb29b, 0x4586, 0xbf32, 0x1bfe, 0xbad5, 0x422c, 0xbf2d, 0x1cc6, 0x1e0d, 0xb0c9, 0x437c, 0x342f, 0x429d, 0x4103, 0xbf7c, 0x41a5, 0xb02f, 0x4035, 0x0a5d, 0xbac1, 0xac84, 0x4071, 0x0d2f, 0x4235, 0x4203, 0x44b8, 0x0677, 0xba51, 0xb0d1, 0xbae3, 0xae14, 0xbf49, 0xb29a, 0x41ff, 0x1298, 0x1e6a, 0xb286, 0x4156, 0x3c1e, 0x4088, 0x075d, 0x414c, 0x4343, 0x4197, 0xa990, 0xb085, 0xacb8, 0x1984, 0xbfe0, 0xa3f4, 0x423f, 0xb2e3, 0x41d6, 0x1d5d, 0xbf65, 0x407c, 0x4269, 0x348b, 0xb2af, 0x43e5, 0x4169, 0x42e6, 0x4258, 0x434b, 0xbfc0, 0x4385, 0x3551, 0x4452, 0x41fd, 0x461c, 0xb2c5, 0x1e89, 0xba0b, 0xbf00, 0xacdf, 0xb2c0, 0x4241, 0x4247, 0x421b, 0x436f, 0x43d2, 0x14e5, 0x45a5, 0xbf1b, 0x1e6b, 0x4195, 0x45f2, 0xb27b, 0x4125, 0xb29f, 0xb26e, 0x4010, 0x422a, 0xa1a0, 0xbafc, 0xaa80, 0x1c8f, 0xb06f, 0x43a8, 0x42ac, 0xbae1, 0x415f, 0x117d, 0x4339, 0xb250, 0xbfe2, 0x4263, 0xb2bd, 0x409c, 0xb269, 0x19a4, 0xbfc0, 0x0fdf, 0x41f6, 0x4621, 0x4044, 0x40f5, 0x2e6e, 0x4221, 0x46d3, 0xbf9a, 0xba60, 0x41bf, 0x424a, 0x43bf, 0xbf9c, 0x26c7, 0x4242, 0x1d65, 0xb050, 0x4612, 0xa5c5, 0x1da4, 0x43a3, 0xb0fb, 0x444d, 0xba09, 0x3649, 0x4062, 0x1293, 0xba5b, 0x2db9, 0x43dc, 0x4333, 0x1a29, 0xbf0d, 0x0c2d, 0x4306, 0x4001, 0xbf70, 0xb04a, 0x43b5, 0x32dc, 0xba2b, 0x4367, 0x412e, 0x191f, 0x1a9a, 0x4027, 0x4139, 0x1951, 0xbf00, 0x4239, 0x40e2, 0x42c2, 0x40f2, 0x0880, 0x43f8, 0x1da1, 0xbf99, 0xb245, 0x464e, 0xbaf4, 0x4220, 0x4653, 0x43b9, 0x3e09, 0xbfc5, 0xba26, 0xb287, 0x1747, 0xb231, 0xb2ff, 0x21a4, 0xba1e, 0x44b4, 0x44a3, 0x4281, 0x4113, 0x40ab, 0x02cd, 0xb0f6, 0x40c1, 0xba59, 0x42a6, 0xb2e1, 0x1ed0, 0x3728, 0xba7f, 0x425d, 0xbf82, 0x2b31, 0xb03e, 0x4133, 0x1ce6, 0x413d, 0x4027, 0xb2c5, 0x1e77, 0x424d, 0x4051, 0xa275, 0xb00b, 0x4090, 0x408c, 0xbf79, 0x0e9e, 0x0767, 0x196e, 0x424a, 0x46fa, 0x2756, 0x24c8, 0x2108, 0x09cd, 0x1b81, 0x421a, 0xb256, 0xb007, 0x0ad0, 0x40cd, 0x4114, 0x404a, 0x400e, 0x40d8, 0xbf70, 0x4476, 0x01e4, 0x40e0, 0x2e5d, 0xbf9a, 0x2d03, 0x45c2, 0xbf00, 0xb0c5, 0x4585, 0x40e6, 0x42dd, 0xbac3, 0x41c0, 0x1a33, 0x1f44, 0x4347, 0x41ec, 0x20fe, 0xbf69, 0x3e36, 0x41e0, 0xadd6, 0x1aee, 0x2879, 0xb258, 0x432a, 0x2c20, 0x1ba8, 0x0ba8, 0x4361, 0x42bc, 0x408c, 0xbf9a, 0x4127, 0x42e9, 0xba00, 0x4127, 0x0bd8, 0x421a, 0x1d0b, 0xb2c6, 0xb0b8, 0xbf65, 0x2eb1, 0x43ee, 0x43e4, 0x4103, 0xb041, 0x40e0, 0xa3f4, 0x421a, 0xb284, 0xba0c, 0xae98, 0x42b7, 0x2272, 0x1c87, 0x3cf3, 0x41c5, 0x423b, 0xb202, 0x1f4a, 0x43a6, 0x124a, 0xb20e, 0xb0b4, 0x40e4, 0x40e9, 0x4135, 0xa232, 0x18a6, 0xbf48, 0x461c, 0xba4a, 0xba16, 0xa76b, 0x4106, 0x4289, 0x43fe, 0xba65, 0x4127, 0x0a75, 0xaddb, 0x2441, 0x1904, 0x1705, 0xb2c6, 0x1503, 0xbff0, 0x43c1, 0xbf52, 0xbac9, 0xb241, 0xbf80, 0x4770, 0xe7fe + ], + StartRegs = [0x2fdaaeb9, 0xb79696f8, 0x5b75e8b3, 0xb8bc6fba, 0xcb255eac, 0xe7fd35fd, 0xddb0f0b1, 0x6a6b7524, 0x61dac898, 0x5adfbd3a, 0xe9b18555, 0xf3de49cb, 0x123c8a0c, 0x745a0959, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x00001400, 0x00000000, 0x00000000, 0x00000000, 0x00001441, 0x00000000, 0x00000000, 0x00000000, 0x61dac89a, 0x5adfbff0, 0x0000171e, 0x00000900, 0x5adfbff0, 0x745a0295, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x4177, 0x1819, 0x2414, 0x1b72, 0x43dc, 0xbf80, 0xba41, 0xa052, 0xb20b, 0xb083, 0xa090, 0x4329, 0xa61b, 0x43d1, 0x46cc, 0x1a14, 0xbf68, 0x46fa, 0xb233, 0x1a2a, 0xb2b8, 0xa819, 0xb037, 0xba10, 0x4042, 0xb298, 0x41fb, 0x409a, 0xa96a, 0xbfbd, 0x42cf, 0x4253, 0x408a, 0x405b, 0x42f3, 0x4059, 0xba0f, 0x4567, 0x1cdc, 0x46fc, 0x408c, 0x4422, 0x35df, 0x1b9c, 0x2518, 0x40fd, 0xbfc0, 0x427e, 0x088c, 0x12b3, 0x420e, 0x1f21, 0xb2db, 0x4082, 0xba04, 0x43d5, 0x417d, 0x40cc, 0xbfe1, 0xb2e4, 0x41cb, 0xb26a, 0x0fc6, 0x41fd, 0xa87b, 0x19ba, 0xb082, 0x4007, 0x403f, 0xb051, 0xb2ae, 0xbfb4, 0x41ae, 0x30da, 0x3846, 0x428b, 0x42d0, 0x4346, 0x42c7, 0x432c, 0x4130, 0x1e5c, 0x456b, 0x40d8, 0x4220, 0x40aa, 0x4158, 0x431d, 0x44bb, 0x1bcc, 0x04bf, 0x1cfa, 0x4025, 0x119d, 0xbfbb, 0x44ed, 0xa46d, 0x405d, 0x444c, 0x1c30, 0x4203, 0x45c5, 0x41d8, 0xb032, 0xbaf2, 0x0ea6, 0x45da, 0x4201, 0xb08f, 0xba40, 0x46fd, 0xb036, 0x4299, 0xb204, 0x41b6, 0x2913, 0x3bba, 0xba0b, 0x0540, 0x417a, 0xbafd, 0xbf73, 0x4048, 0xb25b, 0x1f4c, 0x429e, 0x3765, 0x1070, 0x1cd1, 0xa19b, 0x462d, 0xae77, 0x4138, 0x4417, 0xb26e, 0xade1, 0x1fc2, 0xb066, 0x43e2, 0x45e4, 0xba67, 0xb2dc, 0x1ce1, 0x4618, 0x41f8, 0x41cc, 0xbfd9, 0x21de, 0xba18, 0xbad6, 0x1ced, 0x4268, 0x408e, 0xbf42, 0xb203, 0xb22f, 0x41a0, 0xb01e, 0x148e, 0xb213, 0x1f18, 0xb066, 0x4220, 0x402f, 0x2024, 0xb0d0, 0xb029, 0x4013, 0xb2e6, 0xaad2, 0x4412, 0x2186, 0x08b7, 0xb017, 0x2c68, 0xac81, 0x03a5, 0x410d, 0x1ad9, 0x4385, 0xbf8f, 0x423e, 0x43a9, 0x4540, 0xb206, 0x1913, 0x45f4, 0x410a, 0xba27, 0xb03a, 0xa1a3, 0x1bab, 0x40a9, 0x1e67, 0x1d41, 0x45a1, 0x43a2, 0x433c, 0xbf3e, 0x447b, 0x40fa, 0x42f1, 0xbfba, 0x3ad7, 0x1a64, 0x436a, 0x4236, 0xb244, 0x423e, 0x46ca, 0x20e3, 0xb2e8, 0x433e, 0xb2e5, 0x2bee, 0x42bb, 0xa98d, 0xad9c, 0x4386, 0x2257, 0xbff0, 0x42c6, 0xbf33, 0x4493, 0xb283, 0x42fe, 0x2141, 0x4036, 0x45ee, 0x4021, 0x4094, 0x1804, 0x415d, 0xbf83, 0x1901, 0xba69, 0x40b4, 0x2756, 0xa4e3, 0x46f5, 0x44e4, 0xbf08, 0x409c, 0xb28d, 0x432e, 0x40b3, 0x2d20, 0x3e1f, 0xbfb6, 0xada3, 0xba6b, 0x1a51, 0xb230, 0x417d, 0xb08f, 0x4147, 0xb204, 0x1c74, 0xbfc0, 0x40d6, 0x297f, 0x42da, 0x4647, 0x0785, 0x41ed, 0x43e8, 0xbfc3, 0x1814, 0x40f2, 0x44d1, 0x4336, 0x40cd, 0x4310, 0x0796, 0x0448, 0x0afd, 0x2b10, 0x454c, 0x409c, 0x4071, 0x4190, 0x022b, 0x42aa, 0x4077, 0x3044, 0x43c2, 0xb201, 0xbf8d, 0xba41, 0x4057, 0xb057, 0x1b40, 0xb24a, 0xa1a7, 0x4307, 0x0539, 0x416a, 0xba50, 0xbf87, 0xba7b, 0x43a4, 0x2500, 0xba5b, 0x43bb, 0x42f3, 0x4611, 0x4280, 0xbac7, 0x41ae, 0x1ca3, 0x43b2, 0xa44d, 0xba30, 0x0ab4, 0x1dcd, 0x461a, 0x435a, 0x025a, 0x432a, 0x20e9, 0xa954, 0x4392, 0xba42, 0x424c, 0x41b8, 0xb235, 0xbf51, 0x4185, 0xb006, 0x4049, 0xb26a, 0x417b, 0xb0e2, 0x19d5, 0x3021, 0xbf00, 0x19dd, 0x4005, 0x4153, 0x1c3e, 0x411b, 0xb272, 0x4222, 0xb249, 0x45e0, 0xb258, 0xb0fc, 0x193e, 0x42eb, 0xb2b2, 0x3edb, 0x4186, 0xb0cb, 0x302a, 0xbf36, 0xb289, 0x4139, 0x4193, 0xb08c, 0x42b8, 0xb254, 0x4421, 0x411c, 0x1ef1, 0xb041, 0x46e3, 0xbfb8, 0x43c0, 0x4015, 0xa898, 0xb20e, 0x42ce, 0x42ac, 0x4067, 0x43d6, 0x42a2, 0xba33, 0xbafe, 0x4208, 0x4142, 0x4159, 0x328e, 0x31d0, 0x40f7, 0x318d, 0x191f, 0x4393, 0x21e0, 0xbf15, 0x4350, 0x19a5, 0x44b5, 0x1a52, 0x18d9, 0x4298, 0xb2f1, 0xb283, 0x1d3c, 0x184a, 0x1919, 0x4185, 0x389d, 0x1fcf, 0x4075, 0x4354, 0x426d, 0x412b, 0x08c8, 0xaa20, 0xb0fc, 0x430a, 0x4371, 0xb036, 0xba55, 0x401d, 0x0a8a, 0x4216, 0xbf76, 0x418a, 0x438a, 0x4239, 0x41f2, 0x43bf, 0x1183, 0x163f, 0x1d04, 0x44d4, 0x4142, 0x40ec, 0x2292, 0x4216, 0x114a, 0x402c, 0x4182, 0x4274, 0x4175, 0xbf34, 0x0866, 0xba17, 0x425d, 0x408c, 0x455f, 0x4226, 0x352f, 0xbfd0, 0x41aa, 0xba23, 0xb22e, 0x4332, 0xb2dc, 0xb0f0, 0x41c1, 0x4244, 0x1935, 0xba0a, 0x434a, 0x4102, 0xbf3b, 0x4006, 0x40df, 0xb0f8, 0x4056, 0x400f, 0x43f9, 0x43ce, 0x42fe, 0x40d4, 0x28b0, 0x429b, 0xbf74, 0x182a, 0x41cb, 0xb286, 0x43e0, 0xbaf2, 0x4048, 0x4290, 0xb01d, 0x42a0, 0x4607, 0xb05c, 0x4350, 0x1c44, 0x332b, 0x4472, 0x41e1, 0x4367, 0x4326, 0x246e, 0x424d, 0xacbc, 0xb25d, 0x42fc, 0x1cfd, 0xbfba, 0x1862, 0x4434, 0x4642, 0x1a03, 0xac03, 0xb011, 0xb268, 0x0d38, 0x4269, 0x447e, 0x40d4, 0xb02c, 0x08bf, 0xb2b2, 0xbfa0, 0x410b, 0xb284, 0x1c4a, 0x414b, 0xbaf7, 0x4177, 0x3a36, 0xbf4a, 0x1dd8, 0x41c6, 0x4094, 0x4586, 0xbfb9, 0xb0e7, 0x43c0, 0x45dc, 0x0f5d, 0x164f, 0x0ba3, 0x1ddc, 0x0097, 0xb29b, 0xba38, 0xba74, 0x4381, 0xb0da, 0x4250, 0xb2a1, 0x41d4, 0x4081, 0x43bb, 0x4406, 0x345b, 0x3396, 0x1de6, 0x1962, 0x1b0e, 0xbf09, 0xb297, 0x44a0, 0x2a36, 0x3650, 0x427f, 0xb26b, 0xb271, 0x438f, 0x4339, 0x4129, 0x376e, 0x4296, 0x1ea5, 0xbfd8, 0x4225, 0x41e9, 0xbadc, 0x4033, 0x06d5, 0xb204, 0x4004, 0x43db, 0xb056, 0x1a4d, 0x168e, 0xbf13, 0xb2c3, 0x40b7, 0x4099, 0x0e40, 0x04b2, 0x2491, 0xbfb0, 0xba29, 0x40ab, 0x45c5, 0xb235, 0x4682, 0x44cd, 0x4336, 0xa9f5, 0x3173, 0xb2ba, 0xb2ae, 0x410b, 0x2490, 0xba68, 0xb05a, 0x4243, 0x4046, 0xb29e, 0xb26d, 0x412d, 0xbfc5, 0x3c36, 0x43ad, 0x4233, 0xb276, 0x1bbe, 0x4130, 0xad7d, 0x43e8, 0xbf86, 0x42b4, 0xb201, 0x39a2, 0xa298, 0x422d, 0x420e, 0xbae0, 0x42ba, 0x419b, 0x4373, 0x3c8a, 0x1b84, 0x2f19, 0x4215, 0xbae3, 0x4301, 0xbfd4, 0xb271, 0x4071, 0x184c, 0xbaf9, 0x1a13, 0x46d8, 0xbfc7, 0xb230, 0x46e9, 0x3397, 0x44d2, 0x2603, 0xba1b, 0x217b, 0xb0fd, 0x42c2, 0x0680, 0x1e31, 0xb203, 0xbac1, 0x2ed6, 0x41cc, 0xb232, 0x423d, 0x24a3, 0xbf43, 0x3980, 0x4273, 0x4234, 0xa0f4, 0xb270, 0x401e, 0xad39, 0xb045, 0x1bbb, 0x1f36, 0xb0ac, 0xba3f, 0xb227, 0x4433, 0xb001, 0xb060, 0x1679, 0x287b, 0x4134, 0xb2b5, 0xabaa, 0x1a26, 0x44a2, 0x42fe, 0xb293, 0xbf8d, 0x4198, 0x1f37, 0xb2c9, 0x425c, 0xb2e3, 0xaaa2, 0xbf26, 0x4306, 0xb013, 0x1e28, 0x1668, 0x411a, 0x4370, 0x0257, 0x1efc, 0x4060, 0x4243, 0x4419, 0xb211, 0x1ade, 0x413e, 0xbfd6, 0x4329, 0x4305, 0x423c, 0x1a58, 0x4075, 0x4377, 0xb24c, 0x4055, 0x1b29, 0xb212, 0xba6d, 0x4011, 0x265d, 0xaa17, 0xa9c1, 0xb2ed, 0x4011, 0x31b0, 0x421d, 0x4399, 0xb0da, 0x4040, 0x4160, 0xbfd0, 0xbad9, 0xbfb4, 0x45f3, 0x4329, 0x434a, 0x40fe, 0x432e, 0xb290, 0x4043, 0x4077, 0xba4d, 0x238f, 0x40ea, 0x46da, 0x3def, 0xbf0e, 0x4565, 0x180b, 0x25be, 0xba29, 0xb0cf, 0x421a, 0xba15, 0x0c57, 0x1ca8, 0x4202, 0x4369, 0x3400, 0xb230, 0xb010, 0x1e9e, 0x4185, 0xaa1b, 0x4069, 0x41f7, 0xba0a, 0x1bbf, 0x401d, 0x1bff, 0xbf2a, 0xb24b, 0xb06f, 0x24ba, 0xa781, 0x42f6, 0xb26b, 0x2a8a, 0xba6c, 0x2c03, 0xb2e8, 0xb24a, 0x42aa, 0x45e3, 0x40a0, 0x40e2, 0x4044, 0x406e, 0x4011, 0xb2b0, 0xbfa7, 0x4155, 0xb20c, 0x421a, 0xb011, 0x06e8, 0x1c54, 0xb20d, 0xafeb, 0xbf90, 0xbfa1, 0x1d96, 0xb2c9, 0xbae8, 0x4123, 0xb29f, 0xac33, 0xbfc0, 0xb2d6, 0x119e, 0x41fa, 0xba79, 0x436a, 0x41f6, 0xbadc, 0x406d, 0x08c6, 0xbafc, 0x4247, 0x419d, 0x40e4, 0x4032, 0xbf9d, 0xb2b5, 0x4301, 0x1fd1, 0x1878, 0x190b, 0x41b6, 0x1a06, 0x1884, 0x413e, 0x1e69, 0xb26e, 0x400f, 0xba25, 0xacaa, 0xaa90, 0xb2f7, 0x41be, 0x414d, 0x2fe7, 0xb01b, 0xbf6b, 0xbf80, 0x4424, 0x1ac3, 0x2b49, 0x42d4, 0xba6d, 0x00b4, 0xaccd, 0x2bba, 0x42b0, 0x4317, 0x408d, 0x4088, 0x1c63, 0x41f2, 0x340f, 0x41be, 0xbfbc, 0xba04, 0xb2a4, 0xb03e, 0x41f3, 0x43d5, 0x3fb9, 0x4130, 0x40b7, 0x1a94, 0xba2c, 0xb24d, 0x40ac, 0x4397, 0x1e2d, 0x0f84, 0x1ac9, 0x4094, 0xba79, 0x4014, 0x345f, 0x4369, 0xa53c, 0xb236, 0x417e, 0xba2d, 0x0ddf, 0x41eb, 0xbfd8, 0xb236, 0x4430, 0x1c1f, 0x408b, 0xb260, 0xab37, 0xb252, 0x40e5, 0x41fe, 0xb289, 0x4157, 0x416e, 0x1cc9, 0xbfb0, 0x40ba, 0x4358, 0x1f8c, 0x40fb, 0xb009, 0xb296, 0x3130, 0x4042, 0x43ca, 0x433c, 0xbf12, 0x4349, 0xbfa0, 0x4092, 0xb0f5, 0xb2a1, 0x4112, 0x2f71, 0xba43, 0x4480, 0x4075, 0x4066, 0x09fb, 0x404b, 0xb263, 0xbfa9, 0xb224, 0x41dd, 0xb03f, 0x19ba, 0x45e5, 0x1a02, 0x40ef, 0x3fa2, 0x1ee5, 0x0f21, 0x4175, 0x4009, 0x4364, 0x0066, 0x4243, 0x1b6e, 0x3b34, 0x40fd, 0x058f, 0x4021, 0xa4f2, 0xb2c8, 0xbf3a, 0xbfe0, 0x402b, 0x4633, 0x2f79, 0xb027, 0xb066, 0x4046, 0x186b, 0x4288, 0x41ef, 0x28df, 0x3cb6, 0x0efe, 0xba01, 0x42a7, 0x3d58, 0xbae9, 0x41eb, 0x1c69, 0xbae0, 0x434d, 0x44f4, 0x41fc, 0x32c2, 0xb028, 0xbf71, 0x40a0, 0x2fd0, 0x1eea, 0xb02c, 0x4393, 0x3037, 0x2793, 0x405e, 0x25a9, 0x2f3c, 0x3e1b, 0xb2fe, 0x41ba, 0xbfd7, 0xba39, 0xb249, 0x4150, 0x43c2, 0x43e1, 0xba14, 0x412c, 0xb003, 0x0b24, 0x4243, 0x306c, 0x436a, 0x1a6a, 0x1cff, 0x1599, 0x43b2, 0x4306, 0x4264, 0x424f, 0x22b4, 0xb2bb, 0x418e, 0x4021, 0xbf0f, 0xb243, 0x1971, 0x43d7, 0x435d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xa631da32, 0x8b25e0fa, 0xc036f7d7, 0x14e1473e, 0x0d42c45b, 0x1272500d, 0xe6b2d752, 0xafd08c78, 0xdf628cd7, 0xcc7f4ab5, 0xc596f8ca, 0x035ba176, 0x9004931a, 0xcc587fb1, 0x00000000, 0x300001f0 }, - FinalRegs = new uint[] { 0x000000a3, 0x00000000, 0x000000b4, 0xffffffa3, 0x00000000, 0x000000a9, 0x000000b3, 0x00000001, 0xe32471b4, 0xcc7f08d4, 0x000020a4, 0x000020a4, 0xcc7f6b59, 0xcc7f0a40, 0x00000000, 0x400001d0 }, + Instructions = [0x4177, 0x1819, 0x2414, 0x1b72, 0x43dc, 0xbf80, 0xba41, 0xa052, 0xb20b, 0xb083, 0xa090, 0x4329, 0xa61b, 0x43d1, 0x46cc, 0x1a14, 0xbf68, 0x46fa, 0xb233, 0x1a2a, 0xb2b8, 0xa819, 0xb037, 0xba10, 0x4042, 0xb298, 0x41fb, 0x409a, 0xa96a, 0xbfbd, 0x42cf, 0x4253, 0x408a, 0x405b, 0x42f3, 0x4059, 0xba0f, 0x4567, 0x1cdc, 0x46fc, 0x408c, 0x4422, 0x35df, 0x1b9c, 0x2518, 0x40fd, 0xbfc0, 0x427e, 0x088c, 0x12b3, 0x420e, 0x1f21, 0xb2db, 0x4082, 0xba04, 0x43d5, 0x417d, 0x40cc, 0xbfe1, 0xb2e4, 0x41cb, 0xb26a, 0x0fc6, 0x41fd, 0xa87b, 0x19ba, 0xb082, 0x4007, 0x403f, 0xb051, 0xb2ae, 0xbfb4, 0x41ae, 0x30da, 0x3846, 0x428b, 0x42d0, 0x4346, 0x42c7, 0x432c, 0x4130, 0x1e5c, 0x456b, 0x40d8, 0x4220, 0x40aa, 0x4158, 0x431d, 0x44bb, 0x1bcc, 0x04bf, 0x1cfa, 0x4025, 0x119d, 0xbfbb, 0x44ed, 0xa46d, 0x405d, 0x444c, 0x1c30, 0x4203, 0x45c5, 0x41d8, 0xb032, 0xbaf2, 0x0ea6, 0x45da, 0x4201, 0xb08f, 0xba40, 0x46fd, 0xb036, 0x4299, 0xb204, 0x41b6, 0x2913, 0x3bba, 0xba0b, 0x0540, 0x417a, 0xbafd, 0xbf73, 0x4048, 0xb25b, 0x1f4c, 0x429e, 0x3765, 0x1070, 0x1cd1, 0xa19b, 0x462d, 0xae77, 0x4138, 0x4417, 0xb26e, 0xade1, 0x1fc2, 0xb066, 0x43e2, 0x45e4, 0xba67, 0xb2dc, 0x1ce1, 0x4618, 0x41f8, 0x41cc, 0xbfd9, 0x21de, 0xba18, 0xbad6, 0x1ced, 0x4268, 0x408e, 0xbf42, 0xb203, 0xb22f, 0x41a0, 0xb01e, 0x148e, 0xb213, 0x1f18, 0xb066, 0x4220, 0x402f, 0x2024, 0xb0d0, 0xb029, 0x4013, 0xb2e6, 0xaad2, 0x4412, 0x2186, 0x08b7, 0xb017, 0x2c68, 0xac81, 0x03a5, 0x410d, 0x1ad9, 0x4385, 0xbf8f, 0x423e, 0x43a9, 0x4540, 0xb206, 0x1913, 0x45f4, 0x410a, 0xba27, 0xb03a, 0xa1a3, 0x1bab, 0x40a9, 0x1e67, 0x1d41, 0x45a1, 0x43a2, 0x433c, 0xbf3e, 0x447b, 0x40fa, 0x42f1, 0xbfba, 0x3ad7, 0x1a64, 0x436a, 0x4236, 0xb244, 0x423e, 0x46ca, 0x20e3, 0xb2e8, 0x433e, 0xb2e5, 0x2bee, 0x42bb, 0xa98d, 0xad9c, 0x4386, 0x2257, 0xbff0, 0x42c6, 0xbf33, 0x4493, 0xb283, 0x42fe, 0x2141, 0x4036, 0x45ee, 0x4021, 0x4094, 0x1804, 0x415d, 0xbf83, 0x1901, 0xba69, 0x40b4, 0x2756, 0xa4e3, 0x46f5, 0x44e4, 0xbf08, 0x409c, 0xb28d, 0x432e, 0x40b3, 0x2d20, 0x3e1f, 0xbfb6, 0xada3, 0xba6b, 0x1a51, 0xb230, 0x417d, 0xb08f, 0x4147, 0xb204, 0x1c74, 0xbfc0, 0x40d6, 0x297f, 0x42da, 0x4647, 0x0785, 0x41ed, 0x43e8, 0xbfc3, 0x1814, 0x40f2, 0x44d1, 0x4336, 0x40cd, 0x4310, 0x0796, 0x0448, 0x0afd, 0x2b10, 0x454c, 0x409c, 0x4071, 0x4190, 0x022b, 0x42aa, 0x4077, 0x3044, 0x43c2, 0xb201, 0xbf8d, 0xba41, 0x4057, 0xb057, 0x1b40, 0xb24a, 0xa1a7, 0x4307, 0x0539, 0x416a, 0xba50, 0xbf87, 0xba7b, 0x43a4, 0x2500, 0xba5b, 0x43bb, 0x42f3, 0x4611, 0x4280, 0xbac7, 0x41ae, 0x1ca3, 0x43b2, 0xa44d, 0xba30, 0x0ab4, 0x1dcd, 0x461a, 0x435a, 0x025a, 0x432a, 0x20e9, 0xa954, 0x4392, 0xba42, 0x424c, 0x41b8, 0xb235, 0xbf51, 0x4185, 0xb006, 0x4049, 0xb26a, 0x417b, 0xb0e2, 0x19d5, 0x3021, 0xbf00, 0x19dd, 0x4005, 0x4153, 0x1c3e, 0x411b, 0xb272, 0x4222, 0xb249, 0x45e0, 0xb258, 0xb0fc, 0x193e, 0x42eb, 0xb2b2, 0x3edb, 0x4186, 0xb0cb, 0x302a, 0xbf36, 0xb289, 0x4139, 0x4193, 0xb08c, 0x42b8, 0xb254, 0x4421, 0x411c, 0x1ef1, 0xb041, 0x46e3, 0xbfb8, 0x43c0, 0x4015, 0xa898, 0xb20e, 0x42ce, 0x42ac, 0x4067, 0x43d6, 0x42a2, 0xba33, 0xbafe, 0x4208, 0x4142, 0x4159, 0x328e, 0x31d0, 0x40f7, 0x318d, 0x191f, 0x4393, 0x21e0, 0xbf15, 0x4350, 0x19a5, 0x44b5, 0x1a52, 0x18d9, 0x4298, 0xb2f1, 0xb283, 0x1d3c, 0x184a, 0x1919, 0x4185, 0x389d, 0x1fcf, 0x4075, 0x4354, 0x426d, 0x412b, 0x08c8, 0xaa20, 0xb0fc, 0x430a, 0x4371, 0xb036, 0xba55, 0x401d, 0x0a8a, 0x4216, 0xbf76, 0x418a, 0x438a, 0x4239, 0x41f2, 0x43bf, 0x1183, 0x163f, 0x1d04, 0x44d4, 0x4142, 0x40ec, 0x2292, 0x4216, 0x114a, 0x402c, 0x4182, 0x4274, 0x4175, 0xbf34, 0x0866, 0xba17, 0x425d, 0x408c, 0x455f, 0x4226, 0x352f, 0xbfd0, 0x41aa, 0xba23, 0xb22e, 0x4332, 0xb2dc, 0xb0f0, 0x41c1, 0x4244, 0x1935, 0xba0a, 0x434a, 0x4102, 0xbf3b, 0x4006, 0x40df, 0xb0f8, 0x4056, 0x400f, 0x43f9, 0x43ce, 0x42fe, 0x40d4, 0x28b0, 0x429b, 0xbf74, 0x182a, 0x41cb, 0xb286, 0x43e0, 0xbaf2, 0x4048, 0x4290, 0xb01d, 0x42a0, 0x4607, 0xb05c, 0x4350, 0x1c44, 0x332b, 0x4472, 0x41e1, 0x4367, 0x4326, 0x246e, 0x424d, 0xacbc, 0xb25d, 0x42fc, 0x1cfd, 0xbfba, 0x1862, 0x4434, 0x4642, 0x1a03, 0xac03, 0xb011, 0xb268, 0x0d38, 0x4269, 0x447e, 0x40d4, 0xb02c, 0x08bf, 0xb2b2, 0xbfa0, 0x410b, 0xb284, 0x1c4a, 0x414b, 0xbaf7, 0x4177, 0x3a36, 0xbf4a, 0x1dd8, 0x41c6, 0x4094, 0x4586, 0xbfb9, 0xb0e7, 0x43c0, 0x45dc, 0x0f5d, 0x164f, 0x0ba3, 0x1ddc, 0x0097, 0xb29b, 0xba38, 0xba74, 0x4381, 0xb0da, 0x4250, 0xb2a1, 0x41d4, 0x4081, 0x43bb, 0x4406, 0x345b, 0x3396, 0x1de6, 0x1962, 0x1b0e, 0xbf09, 0xb297, 0x44a0, 0x2a36, 0x3650, 0x427f, 0xb26b, 0xb271, 0x438f, 0x4339, 0x4129, 0x376e, 0x4296, 0x1ea5, 0xbfd8, 0x4225, 0x41e9, 0xbadc, 0x4033, 0x06d5, 0xb204, 0x4004, 0x43db, 0xb056, 0x1a4d, 0x168e, 0xbf13, 0xb2c3, 0x40b7, 0x4099, 0x0e40, 0x04b2, 0x2491, 0xbfb0, 0xba29, 0x40ab, 0x45c5, 0xb235, 0x4682, 0x44cd, 0x4336, 0xa9f5, 0x3173, 0xb2ba, 0xb2ae, 0x410b, 0x2490, 0xba68, 0xb05a, 0x4243, 0x4046, 0xb29e, 0xb26d, 0x412d, 0xbfc5, 0x3c36, 0x43ad, 0x4233, 0xb276, 0x1bbe, 0x4130, 0xad7d, 0x43e8, 0xbf86, 0x42b4, 0xb201, 0x39a2, 0xa298, 0x422d, 0x420e, 0xbae0, 0x42ba, 0x419b, 0x4373, 0x3c8a, 0x1b84, 0x2f19, 0x4215, 0xbae3, 0x4301, 0xbfd4, 0xb271, 0x4071, 0x184c, 0xbaf9, 0x1a13, 0x46d8, 0xbfc7, 0xb230, 0x46e9, 0x3397, 0x44d2, 0x2603, 0xba1b, 0x217b, 0xb0fd, 0x42c2, 0x0680, 0x1e31, 0xb203, 0xbac1, 0x2ed6, 0x41cc, 0xb232, 0x423d, 0x24a3, 0xbf43, 0x3980, 0x4273, 0x4234, 0xa0f4, 0xb270, 0x401e, 0xad39, 0xb045, 0x1bbb, 0x1f36, 0xb0ac, 0xba3f, 0xb227, 0x4433, 0xb001, 0xb060, 0x1679, 0x287b, 0x4134, 0xb2b5, 0xabaa, 0x1a26, 0x44a2, 0x42fe, 0xb293, 0xbf8d, 0x4198, 0x1f37, 0xb2c9, 0x425c, 0xb2e3, 0xaaa2, 0xbf26, 0x4306, 0xb013, 0x1e28, 0x1668, 0x411a, 0x4370, 0x0257, 0x1efc, 0x4060, 0x4243, 0x4419, 0xb211, 0x1ade, 0x413e, 0xbfd6, 0x4329, 0x4305, 0x423c, 0x1a58, 0x4075, 0x4377, 0xb24c, 0x4055, 0x1b29, 0xb212, 0xba6d, 0x4011, 0x265d, 0xaa17, 0xa9c1, 0xb2ed, 0x4011, 0x31b0, 0x421d, 0x4399, 0xb0da, 0x4040, 0x4160, 0xbfd0, 0xbad9, 0xbfb4, 0x45f3, 0x4329, 0x434a, 0x40fe, 0x432e, 0xb290, 0x4043, 0x4077, 0xba4d, 0x238f, 0x40ea, 0x46da, 0x3def, 0xbf0e, 0x4565, 0x180b, 0x25be, 0xba29, 0xb0cf, 0x421a, 0xba15, 0x0c57, 0x1ca8, 0x4202, 0x4369, 0x3400, 0xb230, 0xb010, 0x1e9e, 0x4185, 0xaa1b, 0x4069, 0x41f7, 0xba0a, 0x1bbf, 0x401d, 0x1bff, 0xbf2a, 0xb24b, 0xb06f, 0x24ba, 0xa781, 0x42f6, 0xb26b, 0x2a8a, 0xba6c, 0x2c03, 0xb2e8, 0xb24a, 0x42aa, 0x45e3, 0x40a0, 0x40e2, 0x4044, 0x406e, 0x4011, 0xb2b0, 0xbfa7, 0x4155, 0xb20c, 0x421a, 0xb011, 0x06e8, 0x1c54, 0xb20d, 0xafeb, 0xbf90, 0xbfa1, 0x1d96, 0xb2c9, 0xbae8, 0x4123, 0xb29f, 0xac33, 0xbfc0, 0xb2d6, 0x119e, 0x41fa, 0xba79, 0x436a, 0x41f6, 0xbadc, 0x406d, 0x08c6, 0xbafc, 0x4247, 0x419d, 0x40e4, 0x4032, 0xbf9d, 0xb2b5, 0x4301, 0x1fd1, 0x1878, 0x190b, 0x41b6, 0x1a06, 0x1884, 0x413e, 0x1e69, 0xb26e, 0x400f, 0xba25, 0xacaa, 0xaa90, 0xb2f7, 0x41be, 0x414d, 0x2fe7, 0xb01b, 0xbf6b, 0xbf80, 0x4424, 0x1ac3, 0x2b49, 0x42d4, 0xba6d, 0x00b4, 0xaccd, 0x2bba, 0x42b0, 0x4317, 0x408d, 0x4088, 0x1c63, 0x41f2, 0x340f, 0x41be, 0xbfbc, 0xba04, 0xb2a4, 0xb03e, 0x41f3, 0x43d5, 0x3fb9, 0x4130, 0x40b7, 0x1a94, 0xba2c, 0xb24d, 0x40ac, 0x4397, 0x1e2d, 0x0f84, 0x1ac9, 0x4094, 0xba79, 0x4014, 0x345f, 0x4369, 0xa53c, 0xb236, 0x417e, 0xba2d, 0x0ddf, 0x41eb, 0xbfd8, 0xb236, 0x4430, 0x1c1f, 0x408b, 0xb260, 0xab37, 0xb252, 0x40e5, 0x41fe, 0xb289, 0x4157, 0x416e, 0x1cc9, 0xbfb0, 0x40ba, 0x4358, 0x1f8c, 0x40fb, 0xb009, 0xb296, 0x3130, 0x4042, 0x43ca, 0x433c, 0xbf12, 0x4349, 0xbfa0, 0x4092, 0xb0f5, 0xb2a1, 0x4112, 0x2f71, 0xba43, 0x4480, 0x4075, 0x4066, 0x09fb, 0x404b, 0xb263, 0xbfa9, 0xb224, 0x41dd, 0xb03f, 0x19ba, 0x45e5, 0x1a02, 0x40ef, 0x3fa2, 0x1ee5, 0x0f21, 0x4175, 0x4009, 0x4364, 0x0066, 0x4243, 0x1b6e, 0x3b34, 0x40fd, 0x058f, 0x4021, 0xa4f2, 0xb2c8, 0xbf3a, 0xbfe0, 0x402b, 0x4633, 0x2f79, 0xb027, 0xb066, 0x4046, 0x186b, 0x4288, 0x41ef, 0x28df, 0x3cb6, 0x0efe, 0xba01, 0x42a7, 0x3d58, 0xbae9, 0x41eb, 0x1c69, 0xbae0, 0x434d, 0x44f4, 0x41fc, 0x32c2, 0xb028, 0xbf71, 0x40a0, 0x2fd0, 0x1eea, 0xb02c, 0x4393, 0x3037, 0x2793, 0x405e, 0x25a9, 0x2f3c, 0x3e1b, 0xb2fe, 0x41ba, 0xbfd7, 0xba39, 0xb249, 0x4150, 0x43c2, 0x43e1, 0xba14, 0x412c, 0xb003, 0x0b24, 0x4243, 0x306c, 0x436a, 0x1a6a, 0x1cff, 0x1599, 0x43b2, 0x4306, 0x4264, 0x424f, 0x22b4, 0xb2bb, 0x418e, 0x4021, 0xbf0f, 0xb243, 0x1971, 0x43d7, 0x435d, 0x4770, 0xe7fe + ], + StartRegs = [0xa631da32, 0x8b25e0fa, 0xc036f7d7, 0x14e1473e, 0x0d42c45b, 0x1272500d, 0xe6b2d752, 0xafd08c78, 0xdf628cd7, 0xcc7f4ab5, 0xc596f8ca, 0x035ba176, 0x9004931a, 0xcc587fb1, 0x00000000, 0x300001f0 + ], + FinalRegs = [0x000000a3, 0x00000000, 0x000000b4, 0xffffffa3, 0x00000000, 0x000000a9, 0x000000b3, 0x00000001, 0xe32471b4, 0xcc7f08d4, 0x000020a4, 0x000020a4, 0xcc7f6b59, 0xcc7f0a40, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x1eba, 0xbf6c, 0x40f9, 0x42e2, 0xbf00, 0x4352, 0xba71, 0x415f, 0x4121, 0x4370, 0x18bf, 0xb228, 0xb21f, 0x437a, 0x410e, 0xa9be, 0x4094, 0xbf01, 0x1bfc, 0x417c, 0x1d9a, 0x342e, 0xb058, 0xa3e9, 0x15d8, 0x42da, 0xbfd6, 0x414f, 0x43b2, 0x46dd, 0x41c9, 0x46d0, 0x46f2, 0xba5f, 0x1558, 0x4221, 0x4156, 0x42f2, 0x38cc, 0x1fa0, 0x436a, 0xb062, 0x4070, 0x19c3, 0xb205, 0x4206, 0xba6a, 0x42be, 0x4388, 0x42ae, 0xb29c, 0xbf1b, 0xbae8, 0x00da, 0xa33e, 0x1ca7, 0x40fd, 0xbf81, 0xb2d7, 0xba69, 0x1ea1, 0xb0bb, 0x0645, 0x1cb6, 0xb27a, 0xbfb0, 0x28b8, 0xbad7, 0x40e0, 0x4253, 0xbaf6, 0x1466, 0x318a, 0xa4ad, 0x1f98, 0xbf4a, 0xbaf1, 0x4350, 0x08cd, 0xbfb6, 0xb047, 0x0b95, 0xb250, 0x405b, 0x4125, 0x42f5, 0x1da1, 0xa969, 0xbfc4, 0x400d, 0xb2b6, 0x4321, 0x43ec, 0xb279, 0x41e6, 0x066a, 0x1e01, 0xbf6c, 0xb260, 0xb099, 0x4237, 0x4192, 0x4453, 0xb258, 0x40c4, 0x1f86, 0x1f54, 0x1da2, 0xb0cf, 0x460b, 0x40e3, 0xbfc0, 0xb27b, 0xba0a, 0x424d, 0xb099, 0x1e52, 0xb213, 0x4073, 0xb091, 0x4456, 0x4549, 0xbfc0, 0xbfb5, 0x435a, 0x1eb5, 0xb2fc, 0xb2b8, 0x1ccd, 0x0313, 0xbacd, 0x1835, 0x4048, 0xba3e, 0x423e, 0xb0ef, 0x33e7, 0x406b, 0xb294, 0x4176, 0xaaa3, 0x43e9, 0xba3e, 0x4592, 0xb2b8, 0x41ee, 0x4166, 0x40d4, 0x407a, 0x41b4, 0xb08c, 0x466c, 0x466b, 0xbf84, 0xb256, 0x05dd, 0x402d, 0x400d, 0xae81, 0x448a, 0x409e, 0xb2bb, 0x4330, 0xb2a2, 0x3a1d, 0x155f, 0x4375, 0x42a3, 0x4042, 0x1e6c, 0x4043, 0x437f, 0xbf5d, 0x0a83, 0x0278, 0xbaef, 0xb225, 0xb2c6, 0xa084, 0x42c4, 0xb044, 0xb276, 0x4254, 0x1ff5, 0x3ecd, 0x42d5, 0x40ab, 0x1d0b, 0xbf5b, 0xa84c, 0x42fa, 0x4153, 0xb20f, 0x43f5, 0xb0ae, 0x40a6, 0xba43, 0x40d1, 0x4031, 0xb201, 0x40a2, 0xa821, 0x41ba, 0x057c, 0x4158, 0xbfdc, 0x4058, 0x0e46, 0x41b1, 0x1ede, 0x430b, 0x427a, 0x2579, 0xb210, 0x10b9, 0x40ac, 0x144d, 0x277e, 0x4361, 0x407b, 0x4292, 0x438e, 0x1c52, 0xbf29, 0x43da, 0x4175, 0x40cd, 0x422e, 0x1bce, 0xbafe, 0x4048, 0x4392, 0x1f58, 0xb06f, 0x4172, 0x140a, 0x42c1, 0x4129, 0x3dc7, 0x43c9, 0xbf62, 0x1cfc, 0x1c76, 0xb258, 0xb2a7, 0x0c27, 0x428d, 0x419d, 0x4247, 0xbfa0, 0x4003, 0x462a, 0xb20e, 0xba7f, 0x410b, 0xbf49, 0xb063, 0x406f, 0x1d81, 0x0426, 0x1ecc, 0x37da, 0xba5c, 0x265f, 0xba45, 0x4623, 0xb2ce, 0x437a, 0x3263, 0x4216, 0x46d2, 0xbf60, 0xb2b3, 0x438b, 0x43a6, 0x127c, 0x2a4a, 0xb087, 0x418d, 0xbfdc, 0xbaf9, 0x2d49, 0xbad8, 0x4555, 0x4034, 0xbf3c, 0x4163, 0x4195, 0x1af2, 0x436b, 0xba0c, 0x4645, 0xb006, 0xba20, 0x2774, 0x0b44, 0x4191, 0x40c4, 0x3255, 0x4316, 0xad9e, 0xb281, 0x2148, 0x19bf, 0x2cb2, 0x41da, 0x4245, 0x4304, 0xbf1c, 0x4266, 0x40d7, 0x1d42, 0x420e, 0x0277, 0x4072, 0x1f21, 0x4117, 0xbfcb, 0x4020, 0xbaf0, 0x3750, 0x438c, 0xb249, 0xb232, 0x42bf, 0x087b, 0xbf60, 0x20a3, 0x2159, 0x4376, 0x401f, 0xac09, 0x41b6, 0xb2eb, 0x44e0, 0x44f5, 0x4180, 0xbf70, 0x4027, 0x4376, 0x4249, 0xbf76, 0x4013, 0xa685, 0x4178, 0x1b24, 0x3bf1, 0x43fc, 0x4564, 0x4359, 0xbf60, 0x3001, 0xbf7a, 0x42b3, 0x431f, 0x0fb3, 0xba60, 0xab2c, 0x4084, 0x4382, 0x1b93, 0x445d, 0x0fa1, 0x42c8, 0xaf44, 0x326c, 0x2fce, 0x41fa, 0x46ed, 0x435a, 0x43e7, 0x3b92, 0x41ad, 0x4387, 0x4148, 0xb243, 0xba0f, 0x468d, 0x41d3, 0x4283, 0x3a35, 0xbf74, 0xb280, 0xb26e, 0x4288, 0x1b27, 0x3713, 0x460d, 0x4608, 0xa4ad, 0x40af, 0x2de0, 0x111b, 0xbafa, 0x421f, 0x432d, 0xba3b, 0x4353, 0x418e, 0xbfa8, 0x41f0, 0xba53, 0xb0e1, 0xb0b1, 0x13bc, 0xba4a, 0x42d6, 0xb26d, 0x468c, 0x4064, 0xb048, 0xa308, 0x4171, 0xbf7a, 0xa025, 0x4079, 0x287b, 0xb2d9, 0xafc6, 0x1287, 0x3e24, 0xbfc0, 0x4383, 0x0175, 0xb229, 0xb098, 0xba56, 0x1cdf, 0xb216, 0x3b28, 0x4083, 0x41cd, 0x4233, 0xb0fb, 0xba6a, 0x40f7, 0xb092, 0x4151, 0x4332, 0xbf01, 0x431e, 0x4064, 0x3e5b, 0xbae3, 0x41a0, 0xbad8, 0x4396, 0x16ef, 0xb2ac, 0x43db, 0xba05, 0x42a4, 0x287a, 0xbfe4, 0x423c, 0x4093, 0x4363, 0x428c, 0x4245, 0xbf1d, 0xb288, 0x4170, 0x44fd, 0xb20d, 0x1ba5, 0x41df, 0x404e, 0x1bf4, 0x363f, 0x4235, 0x2879, 0x3929, 0x1c19, 0x462f, 0x40ea, 0xb291, 0x1ba1, 0x40fa, 0x1144, 0xb291, 0xbf16, 0x4355, 0x410a, 0x4359, 0x2f7f, 0xbf4a, 0x4315, 0x18ae, 0xb28b, 0x013c, 0x2be1, 0x423a, 0x426b, 0x2686, 0x0bda, 0xb070, 0x1a04, 0x433b, 0x4000, 0x4374, 0x122a, 0xab72, 0x240a, 0x43cd, 0x1fcc, 0xb24a, 0x3817, 0xb28a, 0x43a1, 0xbfbf, 0x41ad, 0x4353, 0x1ca2, 0x0f5f, 0xb2cc, 0x335c, 0xbfdc, 0x4564, 0x42f9, 0xb27b, 0x4334, 0x4164, 0x3681, 0x42f9, 0xbf4e, 0x4638, 0x4449, 0x43ed, 0x19bb, 0xb215, 0xbfe0, 0x423f, 0x2108, 0x4383, 0xb228, 0x4652, 0x1dc3, 0xba3f, 0xbfc4, 0x438b, 0x40e8, 0x4567, 0x418c, 0x40fc, 0xba28, 0x40b1, 0x1e4c, 0xbfba, 0x3458, 0xb0ab, 0x2ad2, 0x45e9, 0x1a0c, 0x43b5, 0x4198, 0xab8d, 0x41f9, 0x1d52, 0x4436, 0x2e46, 0x436d, 0xba14, 0x449b, 0x1c84, 0xb2bc, 0xba6a, 0xbf28, 0x382e, 0x41c1, 0x4630, 0x40fb, 0xb25a, 0xa5ff, 0xbf66, 0x407f, 0x1ba9, 0x40f7, 0xba4d, 0xad6a, 0x42d4, 0x416a, 0x41ec, 0x058b, 0xb03f, 0x400b, 0x41de, 0x42f8, 0xb239, 0x43a1, 0xb0bc, 0xb278, 0x3723, 0x2aba, 0x08ce, 0xbac4, 0x4117, 0xba71, 0x43e7, 0x4160, 0x40f9, 0xbfb5, 0xb204, 0x46aa, 0x2031, 0x427d, 0x434d, 0xbac1, 0x41c2, 0xba36, 0x3418, 0x4154, 0x0077, 0xbf8f, 0x1ce1, 0xb299, 0x403b, 0x4327, 0x417e, 0x2a98, 0x41f9, 0x44fb, 0x4284, 0x3e49, 0x4338, 0xb20a, 0x0cc0, 0xb24c, 0x4379, 0x0318, 0x4361, 0xaf1c, 0x4374, 0x4050, 0x18ef, 0xb060, 0x2d77, 0x1924, 0x41bd, 0xbfa8, 0xb0e8, 0x4190, 0x42dc, 0x415d, 0x40ea, 0xb23b, 0x400a, 0x22d5, 0xb25d, 0x1dd6, 0x1d96, 0x2ce9, 0xbf91, 0x4038, 0xb066, 0x43e7, 0x1822, 0xb269, 0x4593, 0xb2f5, 0x19bd, 0xa3f6, 0x0e7e, 0xb24b, 0xba7d, 0x42ca, 0x4663, 0xbfad, 0x4299, 0x1e65, 0x4225, 0x2788, 0x43e8, 0xb0d3, 0xba16, 0x1e5d, 0x404a, 0x1f58, 0x4365, 0xaa39, 0xb2bb, 0xb220, 0x4582, 0x43a7, 0xb256, 0xb209, 0xb2ab, 0xb0d2, 0x43e4, 0x42c8, 0x413f, 0xb243, 0xbf53, 0x2e4e, 0x466d, 0x4037, 0x41b3, 0x4440, 0xbf49, 0x42be, 0xb2cd, 0x4600, 0x32a9, 0x4148, 0x446c, 0x4220, 0xb0de, 0x0ce2, 0xb0b4, 0xabd7, 0x42ff, 0xb026, 0x419a, 0x40b3, 0x0b25, 0xb2cd, 0x3c35, 0x19ab, 0x1f78, 0xbfb0, 0x0e94, 0x1e9d, 0x258f, 0xa68b, 0xbf65, 0xb08c, 0x4419, 0x079e, 0xb268, 0x0e32, 0xba48, 0xb263, 0x404f, 0x0184, 0x4363, 0x40ac, 0x2bea, 0x4333, 0x4212, 0x1b18, 0x2632, 0x419e, 0xaddd, 0x26d7, 0xab35, 0x43ae, 0x44a1, 0x4553, 0xa3ae, 0xb035, 0x43eb, 0x431a, 0x3b78, 0xbf5f, 0x44f2, 0xa8a4, 0x2b62, 0x41b5, 0xb2a0, 0xb26b, 0xbf60, 0x408a, 0x42f5, 0xb248, 0x4186, 0x0be3, 0xba08, 0xba09, 0x43b1, 0x32eb, 0x435e, 0x1a5f, 0x46a1, 0xa636, 0x40a4, 0x1cc4, 0xb205, 0x4008, 0x1ab0, 0x43dd, 0x44ba, 0x1a0a, 0x41e8, 0xbf0b, 0x4107, 0x43fb, 0xb278, 0x0d1b, 0xb24f, 0x4072, 0xb0fe, 0x1f22, 0x41d6, 0xa4b7, 0xa2e7, 0xbace, 0x1986, 0x41ea, 0xbf8f, 0xb2bd, 0xa889, 0x2c1e, 0x4377, 0x43fe, 0x4208, 0x0d22, 0x1fb7, 0x13a5, 0x1dc7, 0xb2a7, 0x4322, 0xb0e3, 0x20ce, 0x2c78, 0xb02e, 0x1dd1, 0x4260, 0x409c, 0x4072, 0x41c0, 0x43b5, 0xb229, 0x42ae, 0xb2fb, 0x41c4, 0x0949, 0xbf46, 0x4240, 0x0cde, 0x1cd9, 0x3d63, 0xba31, 0x4182, 0x46c9, 0x207c, 0xbfd0, 0xba2e, 0xb03a, 0xa2cf, 0x430a, 0xbf00, 0xbfa3, 0x2012, 0x1aef, 0xbae5, 0x429b, 0x42a3, 0x40d8, 0xb27e, 0x43e3, 0x00d0, 0xbfd0, 0xb0f6, 0x235a, 0x4206, 0x28e5, 0x12df, 0x44c8, 0x29d4, 0x07dc, 0xb0ee, 0x2a46, 0x4684, 0x41c8, 0x4256, 0x419f, 0x1840, 0xbfb6, 0x2d6c, 0xbf00, 0x4111, 0xb2a4, 0x2ac4, 0x4357, 0x2969, 0xbfdb, 0x06e7, 0x1834, 0x4303, 0x1301, 0x4349, 0x4359, 0x4199, 0x42d7, 0x43df, 0x1c72, 0xbf29, 0x42e9, 0x0dc8, 0x444f, 0xb2b3, 0xbade, 0x4096, 0xbf39, 0x4222, 0x4132, 0xbaf8, 0x423a, 0x411a, 0x3d0e, 0x27cd, 0xa5b1, 0xba60, 0x402c, 0x1c06, 0x1e7f, 0x4125, 0x437c, 0x2d39, 0x41e8, 0x43b0, 0x1aec, 0x410f, 0xbf70, 0x4151, 0xbfd7, 0xb24b, 0x434a, 0x420a, 0xb0bb, 0x40b5, 0x2a48, 0x42f7, 0x4357, 0xa542, 0x4377, 0x456a, 0xba32, 0x256c, 0x4293, 0x420d, 0x41b2, 0x4116, 0x0db1, 0xb2fd, 0x2b59, 0xbf5e, 0x4386, 0x46a9, 0x44f0, 0x403d, 0x42a2, 0xbfad, 0x4332, 0xb278, 0x33f7, 0x4154, 0x42d1, 0x45a4, 0xbf2c, 0x43d3, 0x4328, 0x1b3b, 0x2fb0, 0xb2fc, 0xba1f, 0x4081, 0xbac6, 0x43a8, 0xaf84, 0x41f1, 0x4242, 0x417b, 0xb210, 0xbf2e, 0x40d4, 0x43d6, 0x1ccf, 0x187b, 0x308a, 0x4377, 0x42ba, 0x31d7, 0xaffe, 0x1fcd, 0x44e8, 0xb28b, 0x1bb6, 0x441a, 0xa875, 0x40b0, 0x40b8, 0xa3ff, 0xbaea, 0xbf0f, 0xb025, 0xb00c, 0x400b, 0xb242, 0xba32, 0x46f3, 0x4637, 0xba20, 0xa645, 0x42df, 0x40a8, 0x42ed, 0xbf5c, 0x1a0c, 0x1899, 0xbaf9, 0xb259, 0x430a, 0xb2f9, 0x026c, 0x4245, 0xb2d4, 0x2e6f, 0x4339, 0xa74d, 0xafb6, 0x410a, 0xb20b, 0x431a, 0x41cc, 0xaa3b, 0x4138, 0xb0c4, 0x4481, 0xb22d, 0x4048, 0xbf81, 0x29ef, 0x44eb, 0x4173, 0xbff0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x229975ae, 0x62ce2e1e, 0xd2564bd4, 0x39d45247, 0xd49d4418, 0x1318e716, 0x729bdcf6, 0x3efcaaa5, 0xa00a7b25, 0x4ae3af8e, 0x4525a887, 0x9586bb86, 0x0c982ef9, 0x7b92ae66, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00000000, 0xfffff740, 0x00000000, 0x000000a8, 0x00000000, 0x000018d8, 0xfffff92c, 0x51bdcd40, 0x00000000, 0x00000005, 0x00000000, 0xfffffff8, 0xfffff544, 0x00000000, 0x400001d0 }, + Instructions = [0x1eba, 0xbf6c, 0x40f9, 0x42e2, 0xbf00, 0x4352, 0xba71, 0x415f, 0x4121, 0x4370, 0x18bf, 0xb228, 0xb21f, 0x437a, 0x410e, 0xa9be, 0x4094, 0xbf01, 0x1bfc, 0x417c, 0x1d9a, 0x342e, 0xb058, 0xa3e9, 0x15d8, 0x42da, 0xbfd6, 0x414f, 0x43b2, 0x46dd, 0x41c9, 0x46d0, 0x46f2, 0xba5f, 0x1558, 0x4221, 0x4156, 0x42f2, 0x38cc, 0x1fa0, 0x436a, 0xb062, 0x4070, 0x19c3, 0xb205, 0x4206, 0xba6a, 0x42be, 0x4388, 0x42ae, 0xb29c, 0xbf1b, 0xbae8, 0x00da, 0xa33e, 0x1ca7, 0x40fd, 0xbf81, 0xb2d7, 0xba69, 0x1ea1, 0xb0bb, 0x0645, 0x1cb6, 0xb27a, 0xbfb0, 0x28b8, 0xbad7, 0x40e0, 0x4253, 0xbaf6, 0x1466, 0x318a, 0xa4ad, 0x1f98, 0xbf4a, 0xbaf1, 0x4350, 0x08cd, 0xbfb6, 0xb047, 0x0b95, 0xb250, 0x405b, 0x4125, 0x42f5, 0x1da1, 0xa969, 0xbfc4, 0x400d, 0xb2b6, 0x4321, 0x43ec, 0xb279, 0x41e6, 0x066a, 0x1e01, 0xbf6c, 0xb260, 0xb099, 0x4237, 0x4192, 0x4453, 0xb258, 0x40c4, 0x1f86, 0x1f54, 0x1da2, 0xb0cf, 0x460b, 0x40e3, 0xbfc0, 0xb27b, 0xba0a, 0x424d, 0xb099, 0x1e52, 0xb213, 0x4073, 0xb091, 0x4456, 0x4549, 0xbfc0, 0xbfb5, 0x435a, 0x1eb5, 0xb2fc, 0xb2b8, 0x1ccd, 0x0313, 0xbacd, 0x1835, 0x4048, 0xba3e, 0x423e, 0xb0ef, 0x33e7, 0x406b, 0xb294, 0x4176, 0xaaa3, 0x43e9, 0xba3e, 0x4592, 0xb2b8, 0x41ee, 0x4166, 0x40d4, 0x407a, 0x41b4, 0xb08c, 0x466c, 0x466b, 0xbf84, 0xb256, 0x05dd, 0x402d, 0x400d, 0xae81, 0x448a, 0x409e, 0xb2bb, 0x4330, 0xb2a2, 0x3a1d, 0x155f, 0x4375, 0x42a3, 0x4042, 0x1e6c, 0x4043, 0x437f, 0xbf5d, 0x0a83, 0x0278, 0xbaef, 0xb225, 0xb2c6, 0xa084, 0x42c4, 0xb044, 0xb276, 0x4254, 0x1ff5, 0x3ecd, 0x42d5, 0x40ab, 0x1d0b, 0xbf5b, 0xa84c, 0x42fa, 0x4153, 0xb20f, 0x43f5, 0xb0ae, 0x40a6, 0xba43, 0x40d1, 0x4031, 0xb201, 0x40a2, 0xa821, 0x41ba, 0x057c, 0x4158, 0xbfdc, 0x4058, 0x0e46, 0x41b1, 0x1ede, 0x430b, 0x427a, 0x2579, 0xb210, 0x10b9, 0x40ac, 0x144d, 0x277e, 0x4361, 0x407b, 0x4292, 0x438e, 0x1c52, 0xbf29, 0x43da, 0x4175, 0x40cd, 0x422e, 0x1bce, 0xbafe, 0x4048, 0x4392, 0x1f58, 0xb06f, 0x4172, 0x140a, 0x42c1, 0x4129, 0x3dc7, 0x43c9, 0xbf62, 0x1cfc, 0x1c76, 0xb258, 0xb2a7, 0x0c27, 0x428d, 0x419d, 0x4247, 0xbfa0, 0x4003, 0x462a, 0xb20e, 0xba7f, 0x410b, 0xbf49, 0xb063, 0x406f, 0x1d81, 0x0426, 0x1ecc, 0x37da, 0xba5c, 0x265f, 0xba45, 0x4623, 0xb2ce, 0x437a, 0x3263, 0x4216, 0x46d2, 0xbf60, 0xb2b3, 0x438b, 0x43a6, 0x127c, 0x2a4a, 0xb087, 0x418d, 0xbfdc, 0xbaf9, 0x2d49, 0xbad8, 0x4555, 0x4034, 0xbf3c, 0x4163, 0x4195, 0x1af2, 0x436b, 0xba0c, 0x4645, 0xb006, 0xba20, 0x2774, 0x0b44, 0x4191, 0x40c4, 0x3255, 0x4316, 0xad9e, 0xb281, 0x2148, 0x19bf, 0x2cb2, 0x41da, 0x4245, 0x4304, 0xbf1c, 0x4266, 0x40d7, 0x1d42, 0x420e, 0x0277, 0x4072, 0x1f21, 0x4117, 0xbfcb, 0x4020, 0xbaf0, 0x3750, 0x438c, 0xb249, 0xb232, 0x42bf, 0x087b, 0xbf60, 0x20a3, 0x2159, 0x4376, 0x401f, 0xac09, 0x41b6, 0xb2eb, 0x44e0, 0x44f5, 0x4180, 0xbf70, 0x4027, 0x4376, 0x4249, 0xbf76, 0x4013, 0xa685, 0x4178, 0x1b24, 0x3bf1, 0x43fc, 0x4564, 0x4359, 0xbf60, 0x3001, 0xbf7a, 0x42b3, 0x431f, 0x0fb3, 0xba60, 0xab2c, 0x4084, 0x4382, 0x1b93, 0x445d, 0x0fa1, 0x42c8, 0xaf44, 0x326c, 0x2fce, 0x41fa, 0x46ed, 0x435a, 0x43e7, 0x3b92, 0x41ad, 0x4387, 0x4148, 0xb243, 0xba0f, 0x468d, 0x41d3, 0x4283, 0x3a35, 0xbf74, 0xb280, 0xb26e, 0x4288, 0x1b27, 0x3713, 0x460d, 0x4608, 0xa4ad, 0x40af, 0x2de0, 0x111b, 0xbafa, 0x421f, 0x432d, 0xba3b, 0x4353, 0x418e, 0xbfa8, 0x41f0, 0xba53, 0xb0e1, 0xb0b1, 0x13bc, 0xba4a, 0x42d6, 0xb26d, 0x468c, 0x4064, 0xb048, 0xa308, 0x4171, 0xbf7a, 0xa025, 0x4079, 0x287b, 0xb2d9, 0xafc6, 0x1287, 0x3e24, 0xbfc0, 0x4383, 0x0175, 0xb229, 0xb098, 0xba56, 0x1cdf, 0xb216, 0x3b28, 0x4083, 0x41cd, 0x4233, 0xb0fb, 0xba6a, 0x40f7, 0xb092, 0x4151, 0x4332, 0xbf01, 0x431e, 0x4064, 0x3e5b, 0xbae3, 0x41a0, 0xbad8, 0x4396, 0x16ef, 0xb2ac, 0x43db, 0xba05, 0x42a4, 0x287a, 0xbfe4, 0x423c, 0x4093, 0x4363, 0x428c, 0x4245, 0xbf1d, 0xb288, 0x4170, 0x44fd, 0xb20d, 0x1ba5, 0x41df, 0x404e, 0x1bf4, 0x363f, 0x4235, 0x2879, 0x3929, 0x1c19, 0x462f, 0x40ea, 0xb291, 0x1ba1, 0x40fa, 0x1144, 0xb291, 0xbf16, 0x4355, 0x410a, 0x4359, 0x2f7f, 0xbf4a, 0x4315, 0x18ae, 0xb28b, 0x013c, 0x2be1, 0x423a, 0x426b, 0x2686, 0x0bda, 0xb070, 0x1a04, 0x433b, 0x4000, 0x4374, 0x122a, 0xab72, 0x240a, 0x43cd, 0x1fcc, 0xb24a, 0x3817, 0xb28a, 0x43a1, 0xbfbf, 0x41ad, 0x4353, 0x1ca2, 0x0f5f, 0xb2cc, 0x335c, 0xbfdc, 0x4564, 0x42f9, 0xb27b, 0x4334, 0x4164, 0x3681, 0x42f9, 0xbf4e, 0x4638, 0x4449, 0x43ed, 0x19bb, 0xb215, 0xbfe0, 0x423f, 0x2108, 0x4383, 0xb228, 0x4652, 0x1dc3, 0xba3f, 0xbfc4, 0x438b, 0x40e8, 0x4567, 0x418c, 0x40fc, 0xba28, 0x40b1, 0x1e4c, 0xbfba, 0x3458, 0xb0ab, 0x2ad2, 0x45e9, 0x1a0c, 0x43b5, 0x4198, 0xab8d, 0x41f9, 0x1d52, 0x4436, 0x2e46, 0x436d, 0xba14, 0x449b, 0x1c84, 0xb2bc, 0xba6a, 0xbf28, 0x382e, 0x41c1, 0x4630, 0x40fb, 0xb25a, 0xa5ff, 0xbf66, 0x407f, 0x1ba9, 0x40f7, 0xba4d, 0xad6a, 0x42d4, 0x416a, 0x41ec, 0x058b, 0xb03f, 0x400b, 0x41de, 0x42f8, 0xb239, 0x43a1, 0xb0bc, 0xb278, 0x3723, 0x2aba, 0x08ce, 0xbac4, 0x4117, 0xba71, 0x43e7, 0x4160, 0x40f9, 0xbfb5, 0xb204, 0x46aa, 0x2031, 0x427d, 0x434d, 0xbac1, 0x41c2, 0xba36, 0x3418, 0x4154, 0x0077, 0xbf8f, 0x1ce1, 0xb299, 0x403b, 0x4327, 0x417e, 0x2a98, 0x41f9, 0x44fb, 0x4284, 0x3e49, 0x4338, 0xb20a, 0x0cc0, 0xb24c, 0x4379, 0x0318, 0x4361, 0xaf1c, 0x4374, 0x4050, 0x18ef, 0xb060, 0x2d77, 0x1924, 0x41bd, 0xbfa8, 0xb0e8, 0x4190, 0x42dc, 0x415d, 0x40ea, 0xb23b, 0x400a, 0x22d5, 0xb25d, 0x1dd6, 0x1d96, 0x2ce9, 0xbf91, 0x4038, 0xb066, 0x43e7, 0x1822, 0xb269, 0x4593, 0xb2f5, 0x19bd, 0xa3f6, 0x0e7e, 0xb24b, 0xba7d, 0x42ca, 0x4663, 0xbfad, 0x4299, 0x1e65, 0x4225, 0x2788, 0x43e8, 0xb0d3, 0xba16, 0x1e5d, 0x404a, 0x1f58, 0x4365, 0xaa39, 0xb2bb, 0xb220, 0x4582, 0x43a7, 0xb256, 0xb209, 0xb2ab, 0xb0d2, 0x43e4, 0x42c8, 0x413f, 0xb243, 0xbf53, 0x2e4e, 0x466d, 0x4037, 0x41b3, 0x4440, 0xbf49, 0x42be, 0xb2cd, 0x4600, 0x32a9, 0x4148, 0x446c, 0x4220, 0xb0de, 0x0ce2, 0xb0b4, 0xabd7, 0x42ff, 0xb026, 0x419a, 0x40b3, 0x0b25, 0xb2cd, 0x3c35, 0x19ab, 0x1f78, 0xbfb0, 0x0e94, 0x1e9d, 0x258f, 0xa68b, 0xbf65, 0xb08c, 0x4419, 0x079e, 0xb268, 0x0e32, 0xba48, 0xb263, 0x404f, 0x0184, 0x4363, 0x40ac, 0x2bea, 0x4333, 0x4212, 0x1b18, 0x2632, 0x419e, 0xaddd, 0x26d7, 0xab35, 0x43ae, 0x44a1, 0x4553, 0xa3ae, 0xb035, 0x43eb, 0x431a, 0x3b78, 0xbf5f, 0x44f2, 0xa8a4, 0x2b62, 0x41b5, 0xb2a0, 0xb26b, 0xbf60, 0x408a, 0x42f5, 0xb248, 0x4186, 0x0be3, 0xba08, 0xba09, 0x43b1, 0x32eb, 0x435e, 0x1a5f, 0x46a1, 0xa636, 0x40a4, 0x1cc4, 0xb205, 0x4008, 0x1ab0, 0x43dd, 0x44ba, 0x1a0a, 0x41e8, 0xbf0b, 0x4107, 0x43fb, 0xb278, 0x0d1b, 0xb24f, 0x4072, 0xb0fe, 0x1f22, 0x41d6, 0xa4b7, 0xa2e7, 0xbace, 0x1986, 0x41ea, 0xbf8f, 0xb2bd, 0xa889, 0x2c1e, 0x4377, 0x43fe, 0x4208, 0x0d22, 0x1fb7, 0x13a5, 0x1dc7, 0xb2a7, 0x4322, 0xb0e3, 0x20ce, 0x2c78, 0xb02e, 0x1dd1, 0x4260, 0x409c, 0x4072, 0x41c0, 0x43b5, 0xb229, 0x42ae, 0xb2fb, 0x41c4, 0x0949, 0xbf46, 0x4240, 0x0cde, 0x1cd9, 0x3d63, 0xba31, 0x4182, 0x46c9, 0x207c, 0xbfd0, 0xba2e, 0xb03a, 0xa2cf, 0x430a, 0xbf00, 0xbfa3, 0x2012, 0x1aef, 0xbae5, 0x429b, 0x42a3, 0x40d8, 0xb27e, 0x43e3, 0x00d0, 0xbfd0, 0xb0f6, 0x235a, 0x4206, 0x28e5, 0x12df, 0x44c8, 0x29d4, 0x07dc, 0xb0ee, 0x2a46, 0x4684, 0x41c8, 0x4256, 0x419f, 0x1840, 0xbfb6, 0x2d6c, 0xbf00, 0x4111, 0xb2a4, 0x2ac4, 0x4357, 0x2969, 0xbfdb, 0x06e7, 0x1834, 0x4303, 0x1301, 0x4349, 0x4359, 0x4199, 0x42d7, 0x43df, 0x1c72, 0xbf29, 0x42e9, 0x0dc8, 0x444f, 0xb2b3, 0xbade, 0x4096, 0xbf39, 0x4222, 0x4132, 0xbaf8, 0x423a, 0x411a, 0x3d0e, 0x27cd, 0xa5b1, 0xba60, 0x402c, 0x1c06, 0x1e7f, 0x4125, 0x437c, 0x2d39, 0x41e8, 0x43b0, 0x1aec, 0x410f, 0xbf70, 0x4151, 0xbfd7, 0xb24b, 0x434a, 0x420a, 0xb0bb, 0x40b5, 0x2a48, 0x42f7, 0x4357, 0xa542, 0x4377, 0x456a, 0xba32, 0x256c, 0x4293, 0x420d, 0x41b2, 0x4116, 0x0db1, 0xb2fd, 0x2b59, 0xbf5e, 0x4386, 0x46a9, 0x44f0, 0x403d, 0x42a2, 0xbfad, 0x4332, 0xb278, 0x33f7, 0x4154, 0x42d1, 0x45a4, 0xbf2c, 0x43d3, 0x4328, 0x1b3b, 0x2fb0, 0xb2fc, 0xba1f, 0x4081, 0xbac6, 0x43a8, 0xaf84, 0x41f1, 0x4242, 0x417b, 0xb210, 0xbf2e, 0x40d4, 0x43d6, 0x1ccf, 0x187b, 0x308a, 0x4377, 0x42ba, 0x31d7, 0xaffe, 0x1fcd, 0x44e8, 0xb28b, 0x1bb6, 0x441a, 0xa875, 0x40b0, 0x40b8, 0xa3ff, 0xbaea, 0xbf0f, 0xb025, 0xb00c, 0x400b, 0xb242, 0xba32, 0x46f3, 0x4637, 0xba20, 0xa645, 0x42df, 0x40a8, 0x42ed, 0xbf5c, 0x1a0c, 0x1899, 0xbaf9, 0xb259, 0x430a, 0xb2f9, 0x026c, 0x4245, 0xb2d4, 0x2e6f, 0x4339, 0xa74d, 0xafb6, 0x410a, 0xb20b, 0x431a, 0x41cc, 0xaa3b, 0x4138, 0xb0c4, 0x4481, 0xb22d, 0x4048, 0xbf81, 0x29ef, 0x44eb, 0x4173, 0xbff0, 0x4770, 0xe7fe + ], + StartRegs = [0x229975ae, 0x62ce2e1e, 0xd2564bd4, 0x39d45247, 0xd49d4418, 0x1318e716, 0x729bdcf6, 0x3efcaaa5, 0xa00a7b25, 0x4ae3af8e, 0x4525a887, 0x9586bb86, 0x0c982ef9, 0x7b92ae66, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x00000000, 0x00000000, 0xfffff740, 0x00000000, 0x000000a8, 0x00000000, 0x000018d8, 0xfffff92c, 0x51bdcd40, 0x00000000, 0x00000005, 0x00000000, 0xfffffff8, 0xfffff544, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x4140, 0xb2b3, 0x4323, 0xba15, 0x4344, 0xbff0, 0xbfbf, 0x43a6, 0x4559, 0x4223, 0x44dc, 0x4127, 0xb0a9, 0xbf8a, 0xaaf8, 0x46c3, 0x4581, 0x40c3, 0x34c1, 0x0454, 0x4391, 0x1926, 0x0506, 0x409b, 0xb240, 0xb2d2, 0xb2bc, 0x41a3, 0x401e, 0x467e, 0x461e, 0x418a, 0xbfa2, 0x4106, 0xb2d4, 0xba41, 0x41e2, 0xbf60, 0xa5bd, 0xb0f2, 0x0ae4, 0xaf92, 0x4178, 0x4288, 0xaafb, 0x2c49, 0x4297, 0x42aa, 0xb279, 0x417e, 0x4030, 0xb092, 0x43af, 0xb2dd, 0x40f2, 0x4248, 0x4185, 0x424d, 0x1bde, 0x42be, 0xbfa3, 0xb2fb, 0x4202, 0xb284, 0x1e62, 0x4435, 0x1a75, 0xad47, 0x1f63, 0xbfc9, 0x4248, 0x42a4, 0x4043, 0x406f, 0x4235, 0x2e18, 0xba30, 0x0eb5, 0xb010, 0x4284, 0x1c3d, 0xba47, 0x1ab5, 0x40c5, 0x42bb, 0x42b3, 0xb2bd, 0x40cb, 0xbf66, 0x42b1, 0xba69, 0xa9e3, 0xba74, 0xba6b, 0x362a, 0xbaf3, 0x41fa, 0x3157, 0x43e1, 0x197e, 0x2357, 0x2121, 0x4399, 0x40e8, 0xba4e, 0x46a4, 0xb24a, 0x1e4c, 0xbf14, 0x434f, 0xba7e, 0x0794, 0x41a9, 0x4271, 0x0540, 0xb245, 0x4034, 0xa808, 0xa761, 0x1e1b, 0x432a, 0xbfd0, 0x4056, 0x0f35, 0x42dc, 0x41e8, 0x28b7, 0x41e4, 0x42d3, 0x4003, 0xb266, 0x23b0, 0x40f3, 0xbfc2, 0xba05, 0x37dc, 0xa115, 0x2d82, 0x427d, 0x4267, 0xb231, 0x425b, 0x4333, 0x15c9, 0x4365, 0x33cc, 0x4245, 0xb258, 0x4456, 0x418d, 0xbfda, 0xa73d, 0x4151, 0xb06a, 0x113e, 0x40a9, 0x0bd6, 0x4011, 0x0e0d, 0x428b, 0xb085, 0x1887, 0x4306, 0x1e58, 0xba34, 0x0264, 0x1425, 0xbf75, 0xbf80, 0x063a, 0x4075, 0xb0ad, 0x4301, 0x41a9, 0xb2de, 0xb06d, 0xbf4e, 0x2c08, 0x195b, 0x1f78, 0x4665, 0x18a8, 0x427d, 0x1e10, 0x1902, 0x4184, 0xb26c, 0x4202, 0xabcc, 0xa09e, 0xb240, 0xbf97, 0xb2f9, 0x0e5d, 0x4016, 0x41e6, 0x0fa0, 0xb03e, 0xba09, 0xba2d, 0x1d8d, 0x4236, 0x4169, 0x42e1, 0xbfa2, 0x1c7a, 0x4209, 0x46d8, 0x40ba, 0x131e, 0x43e9, 0x4322, 0x2c4c, 0xb0f2, 0x420d, 0x43cf, 0xbfe0, 0xbaf7, 0x11fd, 0x3c3c, 0xb074, 0xa603, 0x40c0, 0xba24, 0xbfdf, 0xba1f, 0x4355, 0x1c3e, 0x3c1f, 0x1771, 0x435e, 0x43f0, 0xbfe0, 0xbf1e, 0x2909, 0x4388, 0xb283, 0xbfb0, 0x4345, 0xb037, 0x4422, 0xba30, 0xb299, 0xb27c, 0xba4e, 0x439c, 0x402a, 0xbfb7, 0x42b5, 0x4306, 0x12ed, 0x4036, 0xa7ea, 0x3301, 0x00dd, 0x43ff, 0xbf80, 0x43a5, 0xa662, 0xb2cc, 0x1fd1, 0xb2f3, 0xb2e5, 0xba3b, 0x41d9, 0x19bb, 0xbf53, 0xb2d3, 0x4060, 0x40a0, 0x41e4, 0x430e, 0x1ace, 0xb292, 0x4126, 0x14a7, 0x4213, 0xba11, 0xba68, 0xbaea, 0x40f4, 0x1efb, 0xad4e, 0xb219, 0x403a, 0xa6a1, 0xbac6, 0x400e, 0x4179, 0x27cf, 0xbf2c, 0xb00d, 0x41da, 0xba16, 0x43f4, 0x419b, 0xae62, 0x40e8, 0xba76, 0xa541, 0xba4f, 0x42c2, 0x41aa, 0x446e, 0x423c, 0x400e, 0xbf45, 0x411e, 0xba27, 0x4150, 0xbff0, 0xbfb0, 0x1d0a, 0x4110, 0x0264, 0xb08d, 0x4094, 0xb237, 0x433d, 0xb2df, 0x445a, 0x18bd, 0x232b, 0x42aa, 0x4049, 0x41e8, 0x4241, 0x43c0, 0xabef, 0xbf27, 0x466a, 0xb235, 0xb210, 0x40c1, 0x1b03, 0x34b9, 0x330b, 0x0d21, 0x1c91, 0x411e, 0x4309, 0x24b1, 0x4694, 0x4352, 0xb06b, 0x43fe, 0x4335, 0x4062, 0xb262, 0xb2cf, 0x41ba, 0x1f6a, 0xbf19, 0xaa47, 0x41d2, 0x3d1a, 0x4214, 0xb041, 0xba7d, 0x4256, 0x44cc, 0x443b, 0x0975, 0x40f5, 0xb218, 0x3e53, 0xb20d, 0x3524, 0xb266, 0x3cde, 0xb268, 0x4488, 0x4242, 0x0d85, 0x4359, 0xbfc0, 0xb2c5, 0xbf42, 0xb2ac, 0x30e2, 0x40f1, 0x0e8c, 0x4253, 0x41f5, 0x4338, 0x23ee, 0x4452, 0x435b, 0xbfe0, 0x4322, 0xba03, 0x4434, 0x425e, 0x4138, 0xb0f5, 0xb027, 0x1244, 0x4199, 0x069e, 0x1cd5, 0x43e7, 0xb251, 0x2463, 0x1b4f, 0x369f, 0xbf07, 0x3825, 0xb2a9, 0x425d, 0x01f8, 0x459d, 0x41f8, 0x1c1a, 0xbfb0, 0x4036, 0x400b, 0x4020, 0x42a5, 0x1c96, 0x4282, 0x1e80, 0x1a86, 0xa400, 0xbfd0, 0x437f, 0x42de, 0x4071, 0x43a6, 0x403d, 0xb2c8, 0x36f0, 0xbf7d, 0xa9ca, 0x4321, 0x4397, 0x3f2d, 0xb0ff, 0x1db9, 0x4327, 0x42ee, 0x4102, 0x1929, 0x1a60, 0x42ae, 0x43fa, 0x4238, 0x335e, 0x4195, 0x41a0, 0x434f, 0x07df, 0x0b88, 0x415c, 0x1bed, 0x1239, 0x2484, 0xbfe0, 0x429a, 0x43f1, 0xbf00, 0xbf81, 0x1d1a, 0x03ca, 0xb001, 0x1144, 0xba4c, 0x4588, 0x4298, 0x1adc, 0x0bf3, 0x425c, 0x40bc, 0x46d0, 0x4196, 0x3c97, 0x1a0e, 0x40d8, 0x4689, 0x4211, 0xb2c7, 0x3858, 0xbf94, 0x1f8b, 0x1dd1, 0x43fc, 0x4221, 0x4134, 0x4091, 0xbf45, 0xb216, 0xa369, 0x425f, 0x41f1, 0x1d77, 0x4351, 0x4052, 0x43b8, 0xaab0, 0x41bd, 0x436a, 0x10b8, 0x1be7, 0xb0a0, 0x4408, 0xba5c, 0x46ed, 0x4280, 0x43e5, 0xb24f, 0x413e, 0x40de, 0x4072, 0x0af6, 0xb0fc, 0x182b, 0xbf18, 0x40a2, 0x4274, 0xbf7b, 0x40e1, 0x4374, 0x1980, 0x446c, 0x3816, 0xb011, 0x1a4f, 0x432b, 0x3edd, 0x443b, 0x4100, 0x4089, 0x1aab, 0xadf1, 0xb27b, 0x41b2, 0x4654, 0x14fc, 0x42be, 0x0988, 0xbade, 0x01d9, 0xbfb2, 0x4495, 0xa451, 0xb236, 0x40a0, 0xa32b, 0x160f, 0x158c, 0x1b5a, 0x1bf9, 0x415f, 0xa9d3, 0x2d3b, 0x0186, 0x2ee4, 0xb2ee, 0x4203, 0x4282, 0xbf25, 0x42fb, 0x41cd, 0x4005, 0x412e, 0x4166, 0xb060, 0x419a, 0xb096, 0x421a, 0xbf9e, 0xbaea, 0xb24b, 0xb266, 0x04cc, 0x4346, 0x1cf3, 0x3752, 0x4191, 0x40df, 0x2bc9, 0xba3f, 0x418a, 0xa35c, 0x40bf, 0xb202, 0xbf75, 0xb022, 0xb2af, 0x4494, 0xb2b3, 0x42ff, 0x4234, 0xba3d, 0x4294, 0xafd7, 0xbf5e, 0x42dd, 0xb06e, 0xb289, 0x16e1, 0x4296, 0xba26, 0xb23d, 0x3187, 0x4257, 0x43b4, 0xb055, 0x43f0, 0xba3b, 0xba4f, 0x4264, 0x1d45, 0x4139, 0x2e94, 0x43c5, 0xbf3a, 0xa887, 0x1db3, 0xb2ed, 0x4155, 0x403a, 0x459c, 0xbf16, 0x4185, 0x435d, 0x4233, 0x4040, 0x195b, 0x3b21, 0x3ac0, 0x41d6, 0xb0d6, 0xbaf9, 0x32b7, 0xb25a, 0xa09f, 0x403a, 0x36e7, 0x01a5, 0x0cbb, 0x19d8, 0x432c, 0x4144, 0xb210, 0x40a9, 0x369e, 0xb208, 0xbfe0, 0xbf74, 0xba77, 0x43fd, 0x430e, 0x431d, 0x0f9e, 0x4093, 0x41ca, 0xac30, 0x1d21, 0x435a, 0xba6a, 0x4070, 0xa76e, 0x40a2, 0x3100, 0x433f, 0x1c9a, 0x447d, 0x0792, 0x28d8, 0xb2ae, 0x309b, 0xa509, 0xb2c1, 0x43d3, 0x1ab7, 0xbf39, 0xb261, 0xa83d, 0x0040, 0x43f9, 0x43aa, 0x0d1a, 0xb2f5, 0x1f4f, 0xa00a, 0x1b3a, 0xbae6, 0xbfba, 0x1dc5, 0x4244, 0x41c2, 0xb2ab, 0x4202, 0xb29c, 0xb257, 0xa703, 0x427e, 0xbf89, 0xb275, 0x4019, 0x46ca, 0x1d3d, 0x1a9b, 0x1f9c, 0x06a0, 0x2760, 0xb258, 0x42d9, 0xbfe0, 0xb284, 0x4693, 0xb028, 0xba10, 0x4070, 0xb0d6, 0x4117, 0x4144, 0x1cb9, 0xbafd, 0x414d, 0x428b, 0x404c, 0x40a9, 0xbfc1, 0xbad9, 0x1cd4, 0x4193, 0x2175, 0x4424, 0x4353, 0x41fb, 0x1085, 0xbfd9, 0x40d9, 0xb226, 0xba45, 0x4397, 0xba74, 0xb04a, 0x0585, 0x0166, 0x43fc, 0x0cb9, 0x4163, 0xa2c8, 0x4167, 0x4298, 0xb2f4, 0x4178, 0x25dd, 0xbf78, 0x4219, 0xba57, 0x2cec, 0x41eb, 0xb2b4, 0x42e3, 0x41d4, 0x4028, 0x19fc, 0x25f6, 0x42c6, 0x411a, 0xb2fc, 0x405f, 0x2db0, 0xba12, 0xba0d, 0x4086, 0x190a, 0xb0d4, 0xb0c7, 0x1a0e, 0x1865, 0x43d6, 0x40f3, 0xbf53, 0x4346, 0x2cce, 0x1b64, 0x4251, 0x4132, 0x3b90, 0x4106, 0x4068, 0x42c8, 0xba69, 0x435b, 0x409c, 0xb23c, 0x40d8, 0xba3a, 0x41f8, 0x0255, 0xba6c, 0x4057, 0x154c, 0x423d, 0xb295, 0xbf5e, 0x39c1, 0xb2c6, 0xb2aa, 0x42ba, 0x41e1, 0x2188, 0xba24, 0xba62, 0xb07c, 0x21ef, 0xb0f3, 0x43ec, 0x4167, 0x16d4, 0x03a1, 0x042a, 0x41bd, 0x41ef, 0x0ce7, 0x40b1, 0x1945, 0x4412, 0x416d, 0xbf73, 0x0cc6, 0x43be, 0x406c, 0x4650, 0x434e, 0xb09f, 0x0557, 0x13bd, 0x1647, 0x1a01, 0x40eb, 0x4257, 0x165b, 0x39b5, 0xba40, 0xbf8d, 0xbf00, 0x45cc, 0xacf1, 0xb21a, 0xb045, 0xba06, 0x42c3, 0x434c, 0x22f5, 0x4361, 0x4168, 0x2d5a, 0x4197, 0x42c2, 0x429f, 0x420f, 0x41ce, 0x4072, 0xb2e6, 0x42b7, 0x0373, 0x0dd4, 0xb2b9, 0x426e, 0x4398, 0x41d1, 0x4391, 0x4388, 0xbfbb, 0x1116, 0x41d9, 0x43a3, 0xb01c, 0x423c, 0xbf23, 0x31dc, 0x4363, 0x1dda, 0x41cb, 0xbf57, 0xba39, 0xa456, 0xb210, 0xb2c3, 0xbacd, 0xb2ae, 0x19df, 0x0c65, 0xbf3c, 0x42c9, 0x4073, 0x46a9, 0x41b0, 0xa506, 0xafdf, 0x4279, 0x416e, 0xa894, 0x15c3, 0x4182, 0x17b8, 0x41c0, 0x2e9c, 0x40bf, 0x4297, 0x42c9, 0x221d, 0xbfe0, 0x27c7, 0xb072, 0xbf13, 0x42e0, 0x1610, 0x43b9, 0x388e, 0x0521, 0xb29e, 0x38ac, 0x1a33, 0x4163, 0x40ae, 0x0262, 0x19ad, 0x1987, 0xbf04, 0x4029, 0x1f7d, 0x4358, 0x046c, 0x1f40, 0xbf00, 0x4052, 0x4228, 0xb0a8, 0xb094, 0xbfdc, 0x4183, 0x1e1d, 0xb006, 0xb244, 0x46b2, 0x40e0, 0x438a, 0x1cf2, 0x09e7, 0xb077, 0x3b0c, 0x42c6, 0x411d, 0x40f4, 0x1d92, 0xb230, 0x3ef5, 0x25ff, 0x40d3, 0xb2fa, 0x0906, 0x33f4, 0x4616, 0xbf93, 0x3405, 0x401a, 0xafb7, 0x4653, 0xb2f2, 0xba5f, 0x43cd, 0x433e, 0xaa58, 0xba2f, 0xb21f, 0x44f2, 0xb2c9, 0xb27f, 0xb219, 0x1f6e, 0x4234, 0xb241, 0x41fc, 0xb299, 0x4262, 0x4332, 0x43c9, 0x1ef1, 0xb209, 0xbf31, 0x4169, 0x4561, 0x439f, 0x43bb, 0x416e, 0x3af5, 0x435e, 0x2c99, 0x407a, 0x41eb, 0xa890, 0x4362, 0xb278, 0xba0b, 0x3322, 0x40ee, 0x4381, 0x3041, 0x434d, 0xbf33, 0xb0f7, 0x40a3, 0x46bd, 0xac4b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3b6339cb, 0xac4b9998, 0x998fa8a0, 0x40e73eaf, 0xf51f8ebf, 0x6f72ff20, 0xf89a82e1, 0x902e336b, 0xebc6f449, 0x4b10b8cd, 0x4c95ab80, 0xffe2804d, 0xe91ff5c2, 0x37fd5281, 0x00000000, 0x000001f0 }, - FinalRegs = new uint[] { 0x00000041, 0xfffffff7, 0x0c803106, 0xf8000021, 0x37fd52a9, 0x02400009, 0x00000000, 0x00000000, 0x4c95ab80, 0x00000000, 0x06f00000, 0xc802acfb, 0x4af3391b, 0x37fd517d, 0x00000000, 0x000001d0 }, + Instructions = [0x4140, 0xb2b3, 0x4323, 0xba15, 0x4344, 0xbff0, 0xbfbf, 0x43a6, 0x4559, 0x4223, 0x44dc, 0x4127, 0xb0a9, 0xbf8a, 0xaaf8, 0x46c3, 0x4581, 0x40c3, 0x34c1, 0x0454, 0x4391, 0x1926, 0x0506, 0x409b, 0xb240, 0xb2d2, 0xb2bc, 0x41a3, 0x401e, 0x467e, 0x461e, 0x418a, 0xbfa2, 0x4106, 0xb2d4, 0xba41, 0x41e2, 0xbf60, 0xa5bd, 0xb0f2, 0x0ae4, 0xaf92, 0x4178, 0x4288, 0xaafb, 0x2c49, 0x4297, 0x42aa, 0xb279, 0x417e, 0x4030, 0xb092, 0x43af, 0xb2dd, 0x40f2, 0x4248, 0x4185, 0x424d, 0x1bde, 0x42be, 0xbfa3, 0xb2fb, 0x4202, 0xb284, 0x1e62, 0x4435, 0x1a75, 0xad47, 0x1f63, 0xbfc9, 0x4248, 0x42a4, 0x4043, 0x406f, 0x4235, 0x2e18, 0xba30, 0x0eb5, 0xb010, 0x4284, 0x1c3d, 0xba47, 0x1ab5, 0x40c5, 0x42bb, 0x42b3, 0xb2bd, 0x40cb, 0xbf66, 0x42b1, 0xba69, 0xa9e3, 0xba74, 0xba6b, 0x362a, 0xbaf3, 0x41fa, 0x3157, 0x43e1, 0x197e, 0x2357, 0x2121, 0x4399, 0x40e8, 0xba4e, 0x46a4, 0xb24a, 0x1e4c, 0xbf14, 0x434f, 0xba7e, 0x0794, 0x41a9, 0x4271, 0x0540, 0xb245, 0x4034, 0xa808, 0xa761, 0x1e1b, 0x432a, 0xbfd0, 0x4056, 0x0f35, 0x42dc, 0x41e8, 0x28b7, 0x41e4, 0x42d3, 0x4003, 0xb266, 0x23b0, 0x40f3, 0xbfc2, 0xba05, 0x37dc, 0xa115, 0x2d82, 0x427d, 0x4267, 0xb231, 0x425b, 0x4333, 0x15c9, 0x4365, 0x33cc, 0x4245, 0xb258, 0x4456, 0x418d, 0xbfda, 0xa73d, 0x4151, 0xb06a, 0x113e, 0x40a9, 0x0bd6, 0x4011, 0x0e0d, 0x428b, 0xb085, 0x1887, 0x4306, 0x1e58, 0xba34, 0x0264, 0x1425, 0xbf75, 0xbf80, 0x063a, 0x4075, 0xb0ad, 0x4301, 0x41a9, 0xb2de, 0xb06d, 0xbf4e, 0x2c08, 0x195b, 0x1f78, 0x4665, 0x18a8, 0x427d, 0x1e10, 0x1902, 0x4184, 0xb26c, 0x4202, 0xabcc, 0xa09e, 0xb240, 0xbf97, 0xb2f9, 0x0e5d, 0x4016, 0x41e6, 0x0fa0, 0xb03e, 0xba09, 0xba2d, 0x1d8d, 0x4236, 0x4169, 0x42e1, 0xbfa2, 0x1c7a, 0x4209, 0x46d8, 0x40ba, 0x131e, 0x43e9, 0x4322, 0x2c4c, 0xb0f2, 0x420d, 0x43cf, 0xbfe0, 0xbaf7, 0x11fd, 0x3c3c, 0xb074, 0xa603, 0x40c0, 0xba24, 0xbfdf, 0xba1f, 0x4355, 0x1c3e, 0x3c1f, 0x1771, 0x435e, 0x43f0, 0xbfe0, 0xbf1e, 0x2909, 0x4388, 0xb283, 0xbfb0, 0x4345, 0xb037, 0x4422, 0xba30, 0xb299, 0xb27c, 0xba4e, 0x439c, 0x402a, 0xbfb7, 0x42b5, 0x4306, 0x12ed, 0x4036, 0xa7ea, 0x3301, 0x00dd, 0x43ff, 0xbf80, 0x43a5, 0xa662, 0xb2cc, 0x1fd1, 0xb2f3, 0xb2e5, 0xba3b, 0x41d9, 0x19bb, 0xbf53, 0xb2d3, 0x4060, 0x40a0, 0x41e4, 0x430e, 0x1ace, 0xb292, 0x4126, 0x14a7, 0x4213, 0xba11, 0xba68, 0xbaea, 0x40f4, 0x1efb, 0xad4e, 0xb219, 0x403a, 0xa6a1, 0xbac6, 0x400e, 0x4179, 0x27cf, 0xbf2c, 0xb00d, 0x41da, 0xba16, 0x43f4, 0x419b, 0xae62, 0x40e8, 0xba76, 0xa541, 0xba4f, 0x42c2, 0x41aa, 0x446e, 0x423c, 0x400e, 0xbf45, 0x411e, 0xba27, 0x4150, 0xbff0, 0xbfb0, 0x1d0a, 0x4110, 0x0264, 0xb08d, 0x4094, 0xb237, 0x433d, 0xb2df, 0x445a, 0x18bd, 0x232b, 0x42aa, 0x4049, 0x41e8, 0x4241, 0x43c0, 0xabef, 0xbf27, 0x466a, 0xb235, 0xb210, 0x40c1, 0x1b03, 0x34b9, 0x330b, 0x0d21, 0x1c91, 0x411e, 0x4309, 0x24b1, 0x4694, 0x4352, 0xb06b, 0x43fe, 0x4335, 0x4062, 0xb262, 0xb2cf, 0x41ba, 0x1f6a, 0xbf19, 0xaa47, 0x41d2, 0x3d1a, 0x4214, 0xb041, 0xba7d, 0x4256, 0x44cc, 0x443b, 0x0975, 0x40f5, 0xb218, 0x3e53, 0xb20d, 0x3524, 0xb266, 0x3cde, 0xb268, 0x4488, 0x4242, 0x0d85, 0x4359, 0xbfc0, 0xb2c5, 0xbf42, 0xb2ac, 0x30e2, 0x40f1, 0x0e8c, 0x4253, 0x41f5, 0x4338, 0x23ee, 0x4452, 0x435b, 0xbfe0, 0x4322, 0xba03, 0x4434, 0x425e, 0x4138, 0xb0f5, 0xb027, 0x1244, 0x4199, 0x069e, 0x1cd5, 0x43e7, 0xb251, 0x2463, 0x1b4f, 0x369f, 0xbf07, 0x3825, 0xb2a9, 0x425d, 0x01f8, 0x459d, 0x41f8, 0x1c1a, 0xbfb0, 0x4036, 0x400b, 0x4020, 0x42a5, 0x1c96, 0x4282, 0x1e80, 0x1a86, 0xa400, 0xbfd0, 0x437f, 0x42de, 0x4071, 0x43a6, 0x403d, 0xb2c8, 0x36f0, 0xbf7d, 0xa9ca, 0x4321, 0x4397, 0x3f2d, 0xb0ff, 0x1db9, 0x4327, 0x42ee, 0x4102, 0x1929, 0x1a60, 0x42ae, 0x43fa, 0x4238, 0x335e, 0x4195, 0x41a0, 0x434f, 0x07df, 0x0b88, 0x415c, 0x1bed, 0x1239, 0x2484, 0xbfe0, 0x429a, 0x43f1, 0xbf00, 0xbf81, 0x1d1a, 0x03ca, 0xb001, 0x1144, 0xba4c, 0x4588, 0x4298, 0x1adc, 0x0bf3, 0x425c, 0x40bc, 0x46d0, 0x4196, 0x3c97, 0x1a0e, 0x40d8, 0x4689, 0x4211, 0xb2c7, 0x3858, 0xbf94, 0x1f8b, 0x1dd1, 0x43fc, 0x4221, 0x4134, 0x4091, 0xbf45, 0xb216, 0xa369, 0x425f, 0x41f1, 0x1d77, 0x4351, 0x4052, 0x43b8, 0xaab0, 0x41bd, 0x436a, 0x10b8, 0x1be7, 0xb0a0, 0x4408, 0xba5c, 0x46ed, 0x4280, 0x43e5, 0xb24f, 0x413e, 0x40de, 0x4072, 0x0af6, 0xb0fc, 0x182b, 0xbf18, 0x40a2, 0x4274, 0xbf7b, 0x40e1, 0x4374, 0x1980, 0x446c, 0x3816, 0xb011, 0x1a4f, 0x432b, 0x3edd, 0x443b, 0x4100, 0x4089, 0x1aab, 0xadf1, 0xb27b, 0x41b2, 0x4654, 0x14fc, 0x42be, 0x0988, 0xbade, 0x01d9, 0xbfb2, 0x4495, 0xa451, 0xb236, 0x40a0, 0xa32b, 0x160f, 0x158c, 0x1b5a, 0x1bf9, 0x415f, 0xa9d3, 0x2d3b, 0x0186, 0x2ee4, 0xb2ee, 0x4203, 0x4282, 0xbf25, 0x42fb, 0x41cd, 0x4005, 0x412e, 0x4166, 0xb060, 0x419a, 0xb096, 0x421a, 0xbf9e, 0xbaea, 0xb24b, 0xb266, 0x04cc, 0x4346, 0x1cf3, 0x3752, 0x4191, 0x40df, 0x2bc9, 0xba3f, 0x418a, 0xa35c, 0x40bf, 0xb202, 0xbf75, 0xb022, 0xb2af, 0x4494, 0xb2b3, 0x42ff, 0x4234, 0xba3d, 0x4294, 0xafd7, 0xbf5e, 0x42dd, 0xb06e, 0xb289, 0x16e1, 0x4296, 0xba26, 0xb23d, 0x3187, 0x4257, 0x43b4, 0xb055, 0x43f0, 0xba3b, 0xba4f, 0x4264, 0x1d45, 0x4139, 0x2e94, 0x43c5, 0xbf3a, 0xa887, 0x1db3, 0xb2ed, 0x4155, 0x403a, 0x459c, 0xbf16, 0x4185, 0x435d, 0x4233, 0x4040, 0x195b, 0x3b21, 0x3ac0, 0x41d6, 0xb0d6, 0xbaf9, 0x32b7, 0xb25a, 0xa09f, 0x403a, 0x36e7, 0x01a5, 0x0cbb, 0x19d8, 0x432c, 0x4144, 0xb210, 0x40a9, 0x369e, 0xb208, 0xbfe0, 0xbf74, 0xba77, 0x43fd, 0x430e, 0x431d, 0x0f9e, 0x4093, 0x41ca, 0xac30, 0x1d21, 0x435a, 0xba6a, 0x4070, 0xa76e, 0x40a2, 0x3100, 0x433f, 0x1c9a, 0x447d, 0x0792, 0x28d8, 0xb2ae, 0x309b, 0xa509, 0xb2c1, 0x43d3, 0x1ab7, 0xbf39, 0xb261, 0xa83d, 0x0040, 0x43f9, 0x43aa, 0x0d1a, 0xb2f5, 0x1f4f, 0xa00a, 0x1b3a, 0xbae6, 0xbfba, 0x1dc5, 0x4244, 0x41c2, 0xb2ab, 0x4202, 0xb29c, 0xb257, 0xa703, 0x427e, 0xbf89, 0xb275, 0x4019, 0x46ca, 0x1d3d, 0x1a9b, 0x1f9c, 0x06a0, 0x2760, 0xb258, 0x42d9, 0xbfe0, 0xb284, 0x4693, 0xb028, 0xba10, 0x4070, 0xb0d6, 0x4117, 0x4144, 0x1cb9, 0xbafd, 0x414d, 0x428b, 0x404c, 0x40a9, 0xbfc1, 0xbad9, 0x1cd4, 0x4193, 0x2175, 0x4424, 0x4353, 0x41fb, 0x1085, 0xbfd9, 0x40d9, 0xb226, 0xba45, 0x4397, 0xba74, 0xb04a, 0x0585, 0x0166, 0x43fc, 0x0cb9, 0x4163, 0xa2c8, 0x4167, 0x4298, 0xb2f4, 0x4178, 0x25dd, 0xbf78, 0x4219, 0xba57, 0x2cec, 0x41eb, 0xb2b4, 0x42e3, 0x41d4, 0x4028, 0x19fc, 0x25f6, 0x42c6, 0x411a, 0xb2fc, 0x405f, 0x2db0, 0xba12, 0xba0d, 0x4086, 0x190a, 0xb0d4, 0xb0c7, 0x1a0e, 0x1865, 0x43d6, 0x40f3, 0xbf53, 0x4346, 0x2cce, 0x1b64, 0x4251, 0x4132, 0x3b90, 0x4106, 0x4068, 0x42c8, 0xba69, 0x435b, 0x409c, 0xb23c, 0x40d8, 0xba3a, 0x41f8, 0x0255, 0xba6c, 0x4057, 0x154c, 0x423d, 0xb295, 0xbf5e, 0x39c1, 0xb2c6, 0xb2aa, 0x42ba, 0x41e1, 0x2188, 0xba24, 0xba62, 0xb07c, 0x21ef, 0xb0f3, 0x43ec, 0x4167, 0x16d4, 0x03a1, 0x042a, 0x41bd, 0x41ef, 0x0ce7, 0x40b1, 0x1945, 0x4412, 0x416d, 0xbf73, 0x0cc6, 0x43be, 0x406c, 0x4650, 0x434e, 0xb09f, 0x0557, 0x13bd, 0x1647, 0x1a01, 0x40eb, 0x4257, 0x165b, 0x39b5, 0xba40, 0xbf8d, 0xbf00, 0x45cc, 0xacf1, 0xb21a, 0xb045, 0xba06, 0x42c3, 0x434c, 0x22f5, 0x4361, 0x4168, 0x2d5a, 0x4197, 0x42c2, 0x429f, 0x420f, 0x41ce, 0x4072, 0xb2e6, 0x42b7, 0x0373, 0x0dd4, 0xb2b9, 0x426e, 0x4398, 0x41d1, 0x4391, 0x4388, 0xbfbb, 0x1116, 0x41d9, 0x43a3, 0xb01c, 0x423c, 0xbf23, 0x31dc, 0x4363, 0x1dda, 0x41cb, 0xbf57, 0xba39, 0xa456, 0xb210, 0xb2c3, 0xbacd, 0xb2ae, 0x19df, 0x0c65, 0xbf3c, 0x42c9, 0x4073, 0x46a9, 0x41b0, 0xa506, 0xafdf, 0x4279, 0x416e, 0xa894, 0x15c3, 0x4182, 0x17b8, 0x41c0, 0x2e9c, 0x40bf, 0x4297, 0x42c9, 0x221d, 0xbfe0, 0x27c7, 0xb072, 0xbf13, 0x42e0, 0x1610, 0x43b9, 0x388e, 0x0521, 0xb29e, 0x38ac, 0x1a33, 0x4163, 0x40ae, 0x0262, 0x19ad, 0x1987, 0xbf04, 0x4029, 0x1f7d, 0x4358, 0x046c, 0x1f40, 0xbf00, 0x4052, 0x4228, 0xb0a8, 0xb094, 0xbfdc, 0x4183, 0x1e1d, 0xb006, 0xb244, 0x46b2, 0x40e0, 0x438a, 0x1cf2, 0x09e7, 0xb077, 0x3b0c, 0x42c6, 0x411d, 0x40f4, 0x1d92, 0xb230, 0x3ef5, 0x25ff, 0x40d3, 0xb2fa, 0x0906, 0x33f4, 0x4616, 0xbf93, 0x3405, 0x401a, 0xafb7, 0x4653, 0xb2f2, 0xba5f, 0x43cd, 0x433e, 0xaa58, 0xba2f, 0xb21f, 0x44f2, 0xb2c9, 0xb27f, 0xb219, 0x1f6e, 0x4234, 0xb241, 0x41fc, 0xb299, 0x4262, 0x4332, 0x43c9, 0x1ef1, 0xb209, 0xbf31, 0x4169, 0x4561, 0x439f, 0x43bb, 0x416e, 0x3af5, 0x435e, 0x2c99, 0x407a, 0x41eb, 0xa890, 0x4362, 0xb278, 0xba0b, 0x3322, 0x40ee, 0x4381, 0x3041, 0x434d, 0xbf33, 0xb0f7, 0x40a3, 0x46bd, 0xac4b, 0x4770, 0xe7fe + ], + StartRegs = [0x3b6339cb, 0xac4b9998, 0x998fa8a0, 0x40e73eaf, 0xf51f8ebf, 0x6f72ff20, 0xf89a82e1, 0x902e336b, 0xebc6f449, 0x4b10b8cd, 0x4c95ab80, 0xffe2804d, 0xe91ff5c2, 0x37fd5281, 0x00000000, 0x000001f0 + ], + FinalRegs = [0x00000041, 0xfffffff7, 0x0c803106, 0xf8000021, 0x37fd52a9, 0x02400009, 0x00000000, 0x00000000, 0x4c95ab80, 0x00000000, 0x06f00000, 0xc802acfb, 0x4af3391b, 0x37fd517d, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xa5fa, 0x42f7, 0xb2c5, 0x40ad, 0x440d, 0x430e, 0x1a77, 0xbadb, 0x4199, 0x40e9, 0xa24d, 0xb221, 0x1a13, 0x403c, 0x4128, 0xba46, 0xbf7c, 0x43e8, 0x1a3e, 0xba00, 0x1aaf, 0x42f7, 0x433a, 0xbacb, 0x46c1, 0x4312, 0x43a5, 0x2370, 0x40f9, 0x195f, 0x4133, 0xb06b, 0xba1a, 0xba11, 0x09a0, 0x42e4, 0x4269, 0x42f2, 0xb28d, 0x0ba3, 0x05ab, 0xb298, 0xbfcf, 0xbaff, 0x4302, 0x438e, 0x4286, 0xb06a, 0x42ae, 0xbae0, 0x049b, 0x39b9, 0x4570, 0x4222, 0x0878, 0xbf66, 0x3af7, 0xbf90, 0x45e6, 0x4321, 0x400b, 0x0fdf, 0x42ff, 0xba07, 0x4424, 0x427d, 0x2f2b, 0xb23e, 0x4233, 0xbad7, 0xba58, 0xb293, 0x4430, 0xa78b, 0x424f, 0xb2f0, 0x1cab, 0xbf4f, 0x431c, 0x4199, 0xb0fa, 0x29cf, 0x405a, 0x150b, 0xb2fb, 0x43a7, 0x41c5, 0x31b3, 0xb258, 0x40dc, 0xbfb0, 0xb0b5, 0xa486, 0x4338, 0xba40, 0xbfe0, 0xba52, 0x4157, 0xa730, 0x431c, 0x188f, 0xbf92, 0x4306, 0x415b, 0x251b, 0x407f, 0xaef4, 0x4127, 0x0478, 0x0bcd, 0xb2b8, 0xa743, 0x4220, 0x420f, 0x1bfb, 0x4340, 0xa62a, 0x4329, 0xbf70, 0x2233, 0x43d6, 0x46da, 0x06d3, 0x1a7b, 0xb2fb, 0x08eb, 0x4372, 0xb2cc, 0x20d8, 0x0227, 0xbfc2, 0x1f6f, 0x2906, 0xb2c8, 0x4676, 0xb086, 0xb21f, 0x43e1, 0x4094, 0xbf0b, 0x4269, 0x4153, 0x322b, 0x05ec, 0xb00f, 0x41e5, 0xab98, 0xb03e, 0xb2f7, 0x44dd, 0xb29b, 0x1b5f, 0xb223, 0x1136, 0xb222, 0xb0d3, 0xb2c3, 0x413d, 0xba0c, 0x40c4, 0xbaf2, 0x355b, 0x4352, 0xbaec, 0x428a, 0x3477, 0xbf07, 0x427f, 0x193c, 0x4101, 0x4047, 0x42bd, 0x316c, 0x1da0, 0x460e, 0x18ac, 0x442d, 0x4489, 0xb261, 0xbf6a, 0xb265, 0x4134, 0x430b, 0xb280, 0xb007, 0x146b, 0x0779, 0xb07d, 0x4478, 0x42b5, 0xb25c, 0xbfaa, 0xa1d2, 0x4139, 0xb206, 0xb212, 0xba5e, 0xb261, 0xb237, 0xba11, 0xba18, 0x4357, 0x4178, 0x43cd, 0x4234, 0x4134, 0xb2cc, 0x4388, 0x4374, 0xa39f, 0x43e8, 0x411e, 0xb274, 0xbf5f, 0x1e46, 0x1ddd, 0x404b, 0xb279, 0x37e1, 0x44c4, 0xb093, 0xbf6c, 0xbf70, 0xb068, 0x1584, 0x4018, 0xb256, 0x00cb, 0x4205, 0xa715, 0xbf70, 0x4253, 0x44c5, 0x1f85, 0x189e, 0xbfa0, 0x400c, 0x3a61, 0x424c, 0x46dc, 0xab38, 0xbfb7, 0x0388, 0xba10, 0x1f7f, 0xb052, 0x43f1, 0xbf80, 0xb26b, 0xb2c1, 0x4249, 0x40d6, 0x26e0, 0xbae6, 0x4132, 0x404f, 0x461b, 0x4062, 0x1a87, 0x23fe, 0xb216, 0xba38, 0x4141, 0xa221, 0x40ab, 0x19c9, 0x1f3c, 0xbf65, 0x40fe, 0xb268, 0x413a, 0xb0b3, 0x44e4, 0xa369, 0x4211, 0x2341, 0xbfb0, 0xbfb2, 0xb2aa, 0x2549, 0x4034, 0xb269, 0xa110, 0x4140, 0x4089, 0x4028, 0x2609, 0x4218, 0x43e4, 0xbf00, 0xb2e3, 0xba33, 0x42db, 0x40d0, 0x18fb, 0x3271, 0xbf19, 0x3067, 0x3c16, 0x4130, 0x3563, 0x072b, 0xb043, 0xb0df, 0xb077, 0x4326, 0x42cc, 0x24bd, 0x37cb, 0x41c6, 0x4350, 0x18da, 0xb267, 0x44da, 0x0379, 0xaf9b, 0x42c5, 0xb04f, 0x4012, 0x401e, 0x433c, 0x23d8, 0x4130, 0x1b4a, 0xb264, 0x416a, 0xbf18, 0xb2e9, 0xb056, 0x1944, 0xba2c, 0x4110, 0x2e24, 0x3a58, 0xb291, 0xba4a, 0x322e, 0x45d4, 0x43a9, 0xba4d, 0xbfe1, 0xba67, 0xa1ba, 0x0aab, 0x41d7, 0x1393, 0xaff4, 0xbfc0, 0xaa25, 0x4004, 0x4646, 0x044a, 0x42f6, 0x407f, 0x432c, 0x4394, 0xbf60, 0x409a, 0x4174, 0x0bde, 0x41b7, 0x42e1, 0x42e0, 0x19fd, 0x072c, 0xb005, 0x23da, 0xba36, 0x013b, 0x02b8, 0xbf83, 0x1896, 0x38ab, 0x1802, 0xa075, 0xba64, 0xb23b, 0x40e7, 0x4245, 0x42f4, 0xa000, 0xb27a, 0xbaef, 0x4052, 0x06e6, 0x3e0f, 0xb02a, 0x29cd, 0x0a60, 0x42ad, 0x25d3, 0x4220, 0xb24c, 0x1ad2, 0x4077, 0xb218, 0x4030, 0x4273, 0xbfc1, 0x4288, 0xb0e5, 0x42d9, 0xb219, 0x4303, 0xb2a7, 0x1845, 0x43d0, 0x4378, 0x3c9c, 0x33b3, 0x4156, 0xb0ec, 0xbaf1, 0x3ee5, 0xbada, 0xb2ff, 0x4571, 0x41dc, 0xbfc9, 0xb043, 0x0309, 0xa14d, 0x411d, 0x0eb5, 0x41da, 0x406f, 0x43a7, 0xba70, 0xba57, 0x1bbf, 0x42bb, 0x3d25, 0x1b41, 0xb0f2, 0xba0c, 0x4127, 0xbfcf, 0x4157, 0x1e08, 0xb2a9, 0x4615, 0x41bd, 0x4279, 0xab6d, 0xbaeb, 0x05c6, 0x41de, 0xb24b, 0x0bf1, 0x42ba, 0x42be, 0x392a, 0x4251, 0xba79, 0x0623, 0xbac2, 0x43c4, 0x4279, 0x4222, 0x1d6e, 0x43a2, 0x10dc, 0xb0d9, 0x18c8, 0xb25c, 0xbfa8, 0x402c, 0x1b45, 0x42bd, 0x4367, 0xb0c8, 0x4375, 0x4341, 0xb2d6, 0x42ee, 0xa002, 0x4279, 0xb21b, 0x4397, 0x4057, 0x40c4, 0x2547, 0xa55a, 0x41ed, 0xb06b, 0x43c9, 0x45d2, 0x41b8, 0x4338, 0xbfc9, 0xb249, 0x066a, 0xa8d4, 0xbfa0, 0x41e7, 0x013f, 0x40e1, 0xb27d, 0xba48, 0x19f8, 0xb0d6, 0xb02a, 0xb022, 0x41e3, 0x4363, 0xb200, 0xbf46, 0x431d, 0x0a44, 0x419c, 0x42ce, 0x2bd3, 0x42c1, 0xb0d5, 0x0d26, 0x44d8, 0x1cfa, 0x4054, 0xba30, 0xb29a, 0xb241, 0xbfd0, 0xb297, 0xb2b9, 0x43f8, 0xb23e, 0xb2ad, 0xba6f, 0xb23d, 0xb013, 0xba77, 0x3e95, 0xba62, 0xb0cc, 0xba22, 0xbf79, 0xba6e, 0x1ac2, 0x339f, 0xb041, 0x415b, 0xb289, 0x42b5, 0xb246, 0x0107, 0x406c, 0x4219, 0x41ae, 0x1dfa, 0xba38, 0xb217, 0xb217, 0x432f, 0x43fe, 0x1e95, 0xbfcc, 0x43df, 0x06a8, 0x4158, 0xad6e, 0x43d8, 0x1902, 0x43ba, 0x4289, 0xbf55, 0xba62, 0xbafa, 0x41dc, 0x3893, 0x41a6, 0x3bd9, 0x0066, 0x4433, 0xbae0, 0x4373, 0x4367, 0x3924, 0x4193, 0xb295, 0xb23e, 0x19cf, 0xb24b, 0x42a2, 0x3c87, 0xb015, 0xbf55, 0x1b93, 0x46bd, 0x423e, 0x43f0, 0xb0b4, 0x4036, 0xb2ef, 0x0fc6, 0xb225, 0x45c6, 0xa8dd, 0xb00a, 0x4091, 0xb265, 0x4211, 0xbacb, 0xbf68, 0xb21d, 0x1058, 0x4385, 0xaa47, 0x32ae, 0x46f0, 0xbf29, 0x1858, 0xab7c, 0xba78, 0x44d3, 0x464d, 0x42dd, 0x43d2, 0x17b7, 0xb0f1, 0x4138, 0x408d, 0xbf6f, 0x41b8, 0xb25c, 0x1b45, 0x40b6, 0x4084, 0x1a56, 0x1c02, 0xb2c7, 0x41df, 0xb0f9, 0x3625, 0x0a77, 0xbf80, 0x1997, 0x441f, 0x410a, 0xb209, 0x4323, 0x2e9c, 0xade2, 0xb211, 0x40aa, 0x4618, 0x4160, 0x18d1, 0x4398, 0xb25a, 0x409d, 0x4311, 0xbf05, 0x29a5, 0x438b, 0xb003, 0xa5db, 0x42b5, 0xbae1, 0x4011, 0x4415, 0x416c, 0xbfce, 0x08cd, 0xb29b, 0xb26c, 0x40c6, 0xbf8f, 0x41de, 0xb09d, 0x3a51, 0x2fba, 0x4341, 0xb27d, 0xb250, 0x438d, 0x43a3, 0x417a, 0xb2b8, 0xba3b, 0x40c8, 0x4349, 0x4323, 0xb2b1, 0x45c1, 0x41a5, 0xba36, 0x4138, 0x401f, 0xbfd0, 0xb20b, 0xb27d, 0x4267, 0x42e2, 0x45a8, 0xbf9e, 0xbadd, 0x41e8, 0x1c5e, 0x4133, 0xbaef, 0xbf6e, 0xa20d, 0xba19, 0x4194, 0x283b, 0x1d04, 0xb2bf, 0x42aa, 0x2109, 0x433c, 0x45ca, 0xa3e1, 0xbff0, 0xb0cc, 0x3304, 0x40af, 0xa1b6, 0x38e2, 0xba5f, 0x3c6d, 0xb2c9, 0x44f3, 0xb23c, 0x3f80, 0xbf60, 0x419c, 0x427c, 0x4207, 0xbfc5, 0x1e21, 0xa5e6, 0x40b7, 0x4020, 0xbf70, 0xa166, 0xbf2b, 0xb065, 0x10e9, 0x4355, 0xb262, 0x43ad, 0x40aa, 0x0291, 0x1958, 0x1c0b, 0x02ce, 0x4046, 0x3833, 0x1b88, 0xbfd0, 0xbf60, 0xbf66, 0xb09b, 0x1abf, 0x4381, 0x40fe, 0x4175, 0x3d96, 0x1bcb, 0x0a61, 0x43ee, 0x2678, 0xa7a5, 0x40d8, 0xb283, 0x4419, 0x40df, 0x1f45, 0x436f, 0x4085, 0x40c5, 0x413d, 0xb251, 0xbf15, 0x0cf4, 0x4205, 0xba59, 0xb239, 0x4394, 0x41ba, 0x4162, 0x17bb, 0xb2c0, 0x404c, 0x4155, 0x41e9, 0xbf2c, 0x42f5, 0xb254, 0x43a2, 0xbad4, 0xb266, 0xbaf9, 0x1a34, 0x2cef, 0xba72, 0x411d, 0xb0d2, 0x423e, 0x4437, 0x460a, 0xbfb2, 0x38b1, 0x28e2, 0xb285, 0xbfd0, 0x0d57, 0xb0a5, 0x439c, 0xb21f, 0x0547, 0x2a77, 0x43a2, 0x3c57, 0xb223, 0x1a5c, 0x12e5, 0xaa5a, 0xbf97, 0xba6b, 0x1f64, 0xba18, 0x431a, 0xb2fc, 0x4245, 0x438c, 0x4248, 0xbf60, 0x403c, 0x436e, 0x42c7, 0xb218, 0x4169, 0xbfc0, 0xba72, 0x4285, 0x4493, 0x4296, 0x4255, 0xb0e8, 0x45c9, 0x4083, 0xbfaf, 0xbf60, 0x4323, 0xbfd0, 0xb260, 0x45e4, 0x40e6, 0x43b3, 0xbf73, 0x440f, 0x1b4e, 0x430c, 0x43aa, 0xba3a, 0xb27b, 0xb251, 0x2bbe, 0xb2c2, 0xae3d, 0xb2d6, 0xba1b, 0x3599, 0x40ce, 0xb060, 0x40bc, 0xb237, 0x4087, 0x0927, 0x41a4, 0xb03b, 0x2497, 0x4485, 0x41c7, 0x426c, 0x4097, 0xbfaf, 0x41ed, 0xba17, 0x43fb, 0x40a4, 0xbf4e, 0xa776, 0x206d, 0x288a, 0x4300, 0x4111, 0x40cf, 0x4287, 0x404e, 0x426f, 0x2cfd, 0xb26a, 0xabd6, 0x43c3, 0xbfa9, 0x259b, 0x2856, 0x41ef, 0x196c, 0xb242, 0x45e4, 0x41ad, 0xa510, 0xb2ba, 0x16fe, 0x44e8, 0x42f3, 0x40a6, 0x1d3a, 0x2313, 0x4167, 0x44c5, 0x43e2, 0xa74d, 0x42a4, 0x257a, 0x1d63, 0xb202, 0x1ccf, 0x46b2, 0x2a5f, 0x4354, 0x39a8, 0xbf65, 0xb09e, 0x43e6, 0xa4e6, 0x1cb6, 0x1f46, 0x1ff3, 0x348a, 0xb220, 0xb2d8, 0xbfa0, 0xbf5d, 0x415d, 0xb265, 0x4299, 0x413f, 0xba62, 0x031b, 0x4473, 0x0ba1, 0x1acf, 0x41ce, 0x4041, 0x403b, 0xb276, 0xba7e, 0x0190, 0x0272, 0x408e, 0xbf13, 0xb2ea, 0x4216, 0x43a0, 0x4216, 0x4034, 0x401f, 0x43c0, 0x4147, 0xba0b, 0x42c1, 0xba30, 0xbaf4, 0x416a, 0x4178, 0xbad5, 0xbf90, 0xa8a6, 0x4192, 0xbfc3, 0x40c7, 0x4377, 0x2630, 0xb0eb, 0x45a1, 0x43dd, 0x1a55, 0xb229, 0xb2dc, 0x406a, 0x40f7, 0xb075, 0x43d3, 0xb2aa, 0x0a60, 0x07d8, 0x42ab, 0x4266, 0xbf69, 0x436f, 0xbfe0, 0x45d9, 0x1de6, 0x4003, 0x435b, 0xa29c, 0xb255, 0x2ad4, 0x41c4, 0x458d, 0xbf04, 0xba6b, 0x1aad, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xa3e9d705, 0xe9aa48da, 0xc172d1f9, 0x9b3d01b0, 0x01afea06, 0xeb3a9b8a, 0x12cc8d93, 0x01c88d27, 0x58e8c5c1, 0xdc241641, 0x7eb66cf7, 0x4ab2dd86, 0x10ad69fd, 0x3b68308b, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x00000000, 0xffffff9e, 0x00001a40, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0xffe68b7f, 0x008fee88, 0x58e8c62c, 0x00000000, 0x22b65886, 0x9565bb0c, 0x011fdd38, 0x00000000, 0x000001d0 }, + Instructions = [0xa5fa, 0x42f7, 0xb2c5, 0x40ad, 0x440d, 0x430e, 0x1a77, 0xbadb, 0x4199, 0x40e9, 0xa24d, 0xb221, 0x1a13, 0x403c, 0x4128, 0xba46, 0xbf7c, 0x43e8, 0x1a3e, 0xba00, 0x1aaf, 0x42f7, 0x433a, 0xbacb, 0x46c1, 0x4312, 0x43a5, 0x2370, 0x40f9, 0x195f, 0x4133, 0xb06b, 0xba1a, 0xba11, 0x09a0, 0x42e4, 0x4269, 0x42f2, 0xb28d, 0x0ba3, 0x05ab, 0xb298, 0xbfcf, 0xbaff, 0x4302, 0x438e, 0x4286, 0xb06a, 0x42ae, 0xbae0, 0x049b, 0x39b9, 0x4570, 0x4222, 0x0878, 0xbf66, 0x3af7, 0xbf90, 0x45e6, 0x4321, 0x400b, 0x0fdf, 0x42ff, 0xba07, 0x4424, 0x427d, 0x2f2b, 0xb23e, 0x4233, 0xbad7, 0xba58, 0xb293, 0x4430, 0xa78b, 0x424f, 0xb2f0, 0x1cab, 0xbf4f, 0x431c, 0x4199, 0xb0fa, 0x29cf, 0x405a, 0x150b, 0xb2fb, 0x43a7, 0x41c5, 0x31b3, 0xb258, 0x40dc, 0xbfb0, 0xb0b5, 0xa486, 0x4338, 0xba40, 0xbfe0, 0xba52, 0x4157, 0xa730, 0x431c, 0x188f, 0xbf92, 0x4306, 0x415b, 0x251b, 0x407f, 0xaef4, 0x4127, 0x0478, 0x0bcd, 0xb2b8, 0xa743, 0x4220, 0x420f, 0x1bfb, 0x4340, 0xa62a, 0x4329, 0xbf70, 0x2233, 0x43d6, 0x46da, 0x06d3, 0x1a7b, 0xb2fb, 0x08eb, 0x4372, 0xb2cc, 0x20d8, 0x0227, 0xbfc2, 0x1f6f, 0x2906, 0xb2c8, 0x4676, 0xb086, 0xb21f, 0x43e1, 0x4094, 0xbf0b, 0x4269, 0x4153, 0x322b, 0x05ec, 0xb00f, 0x41e5, 0xab98, 0xb03e, 0xb2f7, 0x44dd, 0xb29b, 0x1b5f, 0xb223, 0x1136, 0xb222, 0xb0d3, 0xb2c3, 0x413d, 0xba0c, 0x40c4, 0xbaf2, 0x355b, 0x4352, 0xbaec, 0x428a, 0x3477, 0xbf07, 0x427f, 0x193c, 0x4101, 0x4047, 0x42bd, 0x316c, 0x1da0, 0x460e, 0x18ac, 0x442d, 0x4489, 0xb261, 0xbf6a, 0xb265, 0x4134, 0x430b, 0xb280, 0xb007, 0x146b, 0x0779, 0xb07d, 0x4478, 0x42b5, 0xb25c, 0xbfaa, 0xa1d2, 0x4139, 0xb206, 0xb212, 0xba5e, 0xb261, 0xb237, 0xba11, 0xba18, 0x4357, 0x4178, 0x43cd, 0x4234, 0x4134, 0xb2cc, 0x4388, 0x4374, 0xa39f, 0x43e8, 0x411e, 0xb274, 0xbf5f, 0x1e46, 0x1ddd, 0x404b, 0xb279, 0x37e1, 0x44c4, 0xb093, 0xbf6c, 0xbf70, 0xb068, 0x1584, 0x4018, 0xb256, 0x00cb, 0x4205, 0xa715, 0xbf70, 0x4253, 0x44c5, 0x1f85, 0x189e, 0xbfa0, 0x400c, 0x3a61, 0x424c, 0x46dc, 0xab38, 0xbfb7, 0x0388, 0xba10, 0x1f7f, 0xb052, 0x43f1, 0xbf80, 0xb26b, 0xb2c1, 0x4249, 0x40d6, 0x26e0, 0xbae6, 0x4132, 0x404f, 0x461b, 0x4062, 0x1a87, 0x23fe, 0xb216, 0xba38, 0x4141, 0xa221, 0x40ab, 0x19c9, 0x1f3c, 0xbf65, 0x40fe, 0xb268, 0x413a, 0xb0b3, 0x44e4, 0xa369, 0x4211, 0x2341, 0xbfb0, 0xbfb2, 0xb2aa, 0x2549, 0x4034, 0xb269, 0xa110, 0x4140, 0x4089, 0x4028, 0x2609, 0x4218, 0x43e4, 0xbf00, 0xb2e3, 0xba33, 0x42db, 0x40d0, 0x18fb, 0x3271, 0xbf19, 0x3067, 0x3c16, 0x4130, 0x3563, 0x072b, 0xb043, 0xb0df, 0xb077, 0x4326, 0x42cc, 0x24bd, 0x37cb, 0x41c6, 0x4350, 0x18da, 0xb267, 0x44da, 0x0379, 0xaf9b, 0x42c5, 0xb04f, 0x4012, 0x401e, 0x433c, 0x23d8, 0x4130, 0x1b4a, 0xb264, 0x416a, 0xbf18, 0xb2e9, 0xb056, 0x1944, 0xba2c, 0x4110, 0x2e24, 0x3a58, 0xb291, 0xba4a, 0x322e, 0x45d4, 0x43a9, 0xba4d, 0xbfe1, 0xba67, 0xa1ba, 0x0aab, 0x41d7, 0x1393, 0xaff4, 0xbfc0, 0xaa25, 0x4004, 0x4646, 0x044a, 0x42f6, 0x407f, 0x432c, 0x4394, 0xbf60, 0x409a, 0x4174, 0x0bde, 0x41b7, 0x42e1, 0x42e0, 0x19fd, 0x072c, 0xb005, 0x23da, 0xba36, 0x013b, 0x02b8, 0xbf83, 0x1896, 0x38ab, 0x1802, 0xa075, 0xba64, 0xb23b, 0x40e7, 0x4245, 0x42f4, 0xa000, 0xb27a, 0xbaef, 0x4052, 0x06e6, 0x3e0f, 0xb02a, 0x29cd, 0x0a60, 0x42ad, 0x25d3, 0x4220, 0xb24c, 0x1ad2, 0x4077, 0xb218, 0x4030, 0x4273, 0xbfc1, 0x4288, 0xb0e5, 0x42d9, 0xb219, 0x4303, 0xb2a7, 0x1845, 0x43d0, 0x4378, 0x3c9c, 0x33b3, 0x4156, 0xb0ec, 0xbaf1, 0x3ee5, 0xbada, 0xb2ff, 0x4571, 0x41dc, 0xbfc9, 0xb043, 0x0309, 0xa14d, 0x411d, 0x0eb5, 0x41da, 0x406f, 0x43a7, 0xba70, 0xba57, 0x1bbf, 0x42bb, 0x3d25, 0x1b41, 0xb0f2, 0xba0c, 0x4127, 0xbfcf, 0x4157, 0x1e08, 0xb2a9, 0x4615, 0x41bd, 0x4279, 0xab6d, 0xbaeb, 0x05c6, 0x41de, 0xb24b, 0x0bf1, 0x42ba, 0x42be, 0x392a, 0x4251, 0xba79, 0x0623, 0xbac2, 0x43c4, 0x4279, 0x4222, 0x1d6e, 0x43a2, 0x10dc, 0xb0d9, 0x18c8, 0xb25c, 0xbfa8, 0x402c, 0x1b45, 0x42bd, 0x4367, 0xb0c8, 0x4375, 0x4341, 0xb2d6, 0x42ee, 0xa002, 0x4279, 0xb21b, 0x4397, 0x4057, 0x40c4, 0x2547, 0xa55a, 0x41ed, 0xb06b, 0x43c9, 0x45d2, 0x41b8, 0x4338, 0xbfc9, 0xb249, 0x066a, 0xa8d4, 0xbfa0, 0x41e7, 0x013f, 0x40e1, 0xb27d, 0xba48, 0x19f8, 0xb0d6, 0xb02a, 0xb022, 0x41e3, 0x4363, 0xb200, 0xbf46, 0x431d, 0x0a44, 0x419c, 0x42ce, 0x2bd3, 0x42c1, 0xb0d5, 0x0d26, 0x44d8, 0x1cfa, 0x4054, 0xba30, 0xb29a, 0xb241, 0xbfd0, 0xb297, 0xb2b9, 0x43f8, 0xb23e, 0xb2ad, 0xba6f, 0xb23d, 0xb013, 0xba77, 0x3e95, 0xba62, 0xb0cc, 0xba22, 0xbf79, 0xba6e, 0x1ac2, 0x339f, 0xb041, 0x415b, 0xb289, 0x42b5, 0xb246, 0x0107, 0x406c, 0x4219, 0x41ae, 0x1dfa, 0xba38, 0xb217, 0xb217, 0x432f, 0x43fe, 0x1e95, 0xbfcc, 0x43df, 0x06a8, 0x4158, 0xad6e, 0x43d8, 0x1902, 0x43ba, 0x4289, 0xbf55, 0xba62, 0xbafa, 0x41dc, 0x3893, 0x41a6, 0x3bd9, 0x0066, 0x4433, 0xbae0, 0x4373, 0x4367, 0x3924, 0x4193, 0xb295, 0xb23e, 0x19cf, 0xb24b, 0x42a2, 0x3c87, 0xb015, 0xbf55, 0x1b93, 0x46bd, 0x423e, 0x43f0, 0xb0b4, 0x4036, 0xb2ef, 0x0fc6, 0xb225, 0x45c6, 0xa8dd, 0xb00a, 0x4091, 0xb265, 0x4211, 0xbacb, 0xbf68, 0xb21d, 0x1058, 0x4385, 0xaa47, 0x32ae, 0x46f0, 0xbf29, 0x1858, 0xab7c, 0xba78, 0x44d3, 0x464d, 0x42dd, 0x43d2, 0x17b7, 0xb0f1, 0x4138, 0x408d, 0xbf6f, 0x41b8, 0xb25c, 0x1b45, 0x40b6, 0x4084, 0x1a56, 0x1c02, 0xb2c7, 0x41df, 0xb0f9, 0x3625, 0x0a77, 0xbf80, 0x1997, 0x441f, 0x410a, 0xb209, 0x4323, 0x2e9c, 0xade2, 0xb211, 0x40aa, 0x4618, 0x4160, 0x18d1, 0x4398, 0xb25a, 0x409d, 0x4311, 0xbf05, 0x29a5, 0x438b, 0xb003, 0xa5db, 0x42b5, 0xbae1, 0x4011, 0x4415, 0x416c, 0xbfce, 0x08cd, 0xb29b, 0xb26c, 0x40c6, 0xbf8f, 0x41de, 0xb09d, 0x3a51, 0x2fba, 0x4341, 0xb27d, 0xb250, 0x438d, 0x43a3, 0x417a, 0xb2b8, 0xba3b, 0x40c8, 0x4349, 0x4323, 0xb2b1, 0x45c1, 0x41a5, 0xba36, 0x4138, 0x401f, 0xbfd0, 0xb20b, 0xb27d, 0x4267, 0x42e2, 0x45a8, 0xbf9e, 0xbadd, 0x41e8, 0x1c5e, 0x4133, 0xbaef, 0xbf6e, 0xa20d, 0xba19, 0x4194, 0x283b, 0x1d04, 0xb2bf, 0x42aa, 0x2109, 0x433c, 0x45ca, 0xa3e1, 0xbff0, 0xb0cc, 0x3304, 0x40af, 0xa1b6, 0x38e2, 0xba5f, 0x3c6d, 0xb2c9, 0x44f3, 0xb23c, 0x3f80, 0xbf60, 0x419c, 0x427c, 0x4207, 0xbfc5, 0x1e21, 0xa5e6, 0x40b7, 0x4020, 0xbf70, 0xa166, 0xbf2b, 0xb065, 0x10e9, 0x4355, 0xb262, 0x43ad, 0x40aa, 0x0291, 0x1958, 0x1c0b, 0x02ce, 0x4046, 0x3833, 0x1b88, 0xbfd0, 0xbf60, 0xbf66, 0xb09b, 0x1abf, 0x4381, 0x40fe, 0x4175, 0x3d96, 0x1bcb, 0x0a61, 0x43ee, 0x2678, 0xa7a5, 0x40d8, 0xb283, 0x4419, 0x40df, 0x1f45, 0x436f, 0x4085, 0x40c5, 0x413d, 0xb251, 0xbf15, 0x0cf4, 0x4205, 0xba59, 0xb239, 0x4394, 0x41ba, 0x4162, 0x17bb, 0xb2c0, 0x404c, 0x4155, 0x41e9, 0xbf2c, 0x42f5, 0xb254, 0x43a2, 0xbad4, 0xb266, 0xbaf9, 0x1a34, 0x2cef, 0xba72, 0x411d, 0xb0d2, 0x423e, 0x4437, 0x460a, 0xbfb2, 0x38b1, 0x28e2, 0xb285, 0xbfd0, 0x0d57, 0xb0a5, 0x439c, 0xb21f, 0x0547, 0x2a77, 0x43a2, 0x3c57, 0xb223, 0x1a5c, 0x12e5, 0xaa5a, 0xbf97, 0xba6b, 0x1f64, 0xba18, 0x431a, 0xb2fc, 0x4245, 0x438c, 0x4248, 0xbf60, 0x403c, 0x436e, 0x42c7, 0xb218, 0x4169, 0xbfc0, 0xba72, 0x4285, 0x4493, 0x4296, 0x4255, 0xb0e8, 0x45c9, 0x4083, 0xbfaf, 0xbf60, 0x4323, 0xbfd0, 0xb260, 0x45e4, 0x40e6, 0x43b3, 0xbf73, 0x440f, 0x1b4e, 0x430c, 0x43aa, 0xba3a, 0xb27b, 0xb251, 0x2bbe, 0xb2c2, 0xae3d, 0xb2d6, 0xba1b, 0x3599, 0x40ce, 0xb060, 0x40bc, 0xb237, 0x4087, 0x0927, 0x41a4, 0xb03b, 0x2497, 0x4485, 0x41c7, 0x426c, 0x4097, 0xbfaf, 0x41ed, 0xba17, 0x43fb, 0x40a4, 0xbf4e, 0xa776, 0x206d, 0x288a, 0x4300, 0x4111, 0x40cf, 0x4287, 0x404e, 0x426f, 0x2cfd, 0xb26a, 0xabd6, 0x43c3, 0xbfa9, 0x259b, 0x2856, 0x41ef, 0x196c, 0xb242, 0x45e4, 0x41ad, 0xa510, 0xb2ba, 0x16fe, 0x44e8, 0x42f3, 0x40a6, 0x1d3a, 0x2313, 0x4167, 0x44c5, 0x43e2, 0xa74d, 0x42a4, 0x257a, 0x1d63, 0xb202, 0x1ccf, 0x46b2, 0x2a5f, 0x4354, 0x39a8, 0xbf65, 0xb09e, 0x43e6, 0xa4e6, 0x1cb6, 0x1f46, 0x1ff3, 0x348a, 0xb220, 0xb2d8, 0xbfa0, 0xbf5d, 0x415d, 0xb265, 0x4299, 0x413f, 0xba62, 0x031b, 0x4473, 0x0ba1, 0x1acf, 0x41ce, 0x4041, 0x403b, 0xb276, 0xba7e, 0x0190, 0x0272, 0x408e, 0xbf13, 0xb2ea, 0x4216, 0x43a0, 0x4216, 0x4034, 0x401f, 0x43c0, 0x4147, 0xba0b, 0x42c1, 0xba30, 0xbaf4, 0x416a, 0x4178, 0xbad5, 0xbf90, 0xa8a6, 0x4192, 0xbfc3, 0x40c7, 0x4377, 0x2630, 0xb0eb, 0x45a1, 0x43dd, 0x1a55, 0xb229, 0xb2dc, 0x406a, 0x40f7, 0xb075, 0x43d3, 0xb2aa, 0x0a60, 0x07d8, 0x42ab, 0x4266, 0xbf69, 0x436f, 0xbfe0, 0x45d9, 0x1de6, 0x4003, 0x435b, 0xa29c, 0xb255, 0x2ad4, 0x41c4, 0x458d, 0xbf04, 0xba6b, 0x1aad, 0x4770, 0xe7fe + ], + StartRegs = [0xa3e9d705, 0xe9aa48da, 0xc172d1f9, 0x9b3d01b0, 0x01afea06, 0xeb3a9b8a, 0x12cc8d93, 0x01c88d27, 0x58e8c5c1, 0xdc241641, 0x7eb66cf7, 0x4ab2dd86, 0x10ad69fd, 0x3b68308b, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x00000000, 0xffffff9e, 0x00001a40, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0xffe68b7f, 0x008fee88, 0x58e8c62c, 0x00000000, 0x22b65886, 0x9565bb0c, 0x011fdd38, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x43cc, 0x407a, 0x415b, 0x42d2, 0xb20d, 0x41de, 0x1b41, 0x19b6, 0xb051, 0x1dcf, 0x36bc, 0x29fd, 0xbf00, 0x15eb, 0x415d, 0x2be9, 0x1bd3, 0xba76, 0x41a0, 0x45b0, 0xb26e, 0x0c41, 0x3dc0, 0xa863, 0x08ac, 0xbf87, 0x01a2, 0xba51, 0x430e, 0x1090, 0x425e, 0x428c, 0xba79, 0xb0b7, 0x1c66, 0x1c0e, 0x1bf3, 0x40df, 0x4663, 0x4346, 0x1b2f, 0x19fe, 0xbfdd, 0x0720, 0xa14b, 0x1a70, 0xba79, 0xba54, 0xba53, 0x42ef, 0x42c0, 0x409f, 0xbfd6, 0x4276, 0x41df, 0x2a4b, 0x43d6, 0x4094, 0x403d, 0x456a, 0x4027, 0x40b1, 0xac6c, 0x4201, 0x426d, 0x40f2, 0x3d25, 0xb26c, 0x2c76, 0x4193, 0xb0ae, 0x4048, 0x46f4, 0x0f9b, 0xbf00, 0x435b, 0xbfd0, 0x4166, 0x42da, 0xbf78, 0x42a6, 0x455c, 0x428d, 0xbafc, 0x140b, 0xbf8d, 0xb201, 0x4348, 0x4198, 0x1ad2, 0x41fb, 0xba39, 0xb295, 0xbf07, 0x43cb, 0x1d7c, 0xb285, 0x4223, 0x41a0, 0x2f9b, 0xbfa0, 0xb0ab, 0xb00d, 0x411f, 0x463a, 0x43d7, 0xb240, 0xbac6, 0x4067, 0xaa78, 0xb25f, 0x41f2, 0x438d, 0x42ed, 0x4217, 0xbf36, 0x4110, 0x4127, 0xb2dd, 0x4033, 0xae52, 0x4633, 0x401e, 0x1060, 0xb026, 0x3426, 0x4328, 0x4223, 0x3866, 0x4665, 0x1c0d, 0x05a2, 0xbf5c, 0xb2e6, 0xa188, 0xac49, 0x424b, 0x261f, 0x41c5, 0x41e9, 0xad0a, 0x2738, 0xba47, 0xa121, 0xb095, 0x45ee, 0x18ca, 0xbf80, 0x030f, 0x4279, 0x46e2, 0x418d, 0x44c5, 0xb250, 0x4248, 0xb026, 0xbfa8, 0x41d3, 0xa696, 0x426f, 0x45da, 0xb294, 0x40e2, 0x1ccd, 0xa595, 0x420e, 0xaf3b, 0x10ee, 0xb0ae, 0x3c78, 0x413a, 0xb0b4, 0x23f4, 0xbf5d, 0x18be, 0xb077, 0x4070, 0x022e, 0x41be, 0xb2a9, 0x42c3, 0xbf1f, 0x4194, 0x037b, 0xbfd0, 0x42ef, 0x025e, 0xb21c, 0xbf91, 0x4016, 0x43e7, 0x4280, 0x409e, 0xb25b, 0xb023, 0xb224, 0xaa0f, 0xba4b, 0x1b56, 0xba31, 0xa177, 0x4118, 0x08be, 0x433b, 0xb023, 0x40cb, 0x2d55, 0xb0a3, 0x40ef, 0x44d9, 0x420f, 0xb0a7, 0x39b0, 0x412b, 0xbfa8, 0x1e44, 0x4602, 0xbfa3, 0xba1e, 0xb2c6, 0x429a, 0xb205, 0x047a, 0xb0fe, 0x4373, 0xbad8, 0x434c, 0x30e0, 0x1ee5, 0xbfb0, 0x410e, 0xb21e, 0xa97d, 0x42b1, 0x4671, 0x433f, 0xbf0d, 0x0ee6, 0x42ac, 0x19e3, 0x41a3, 0xbfa0, 0xba44, 0xa51c, 0xb241, 0xb2af, 0x415a, 0x0a3c, 0xbf1c, 0x28a0, 0x43d5, 0x4200, 0x43f3, 0x4240, 0x419c, 0x3d0b, 0xb09a, 0xa807, 0x42fa, 0x41e0, 0xbad5, 0x3438, 0xba09, 0xb0f9, 0x4628, 0x4167, 0x1b7b, 0xba0a, 0xa17a, 0xb276, 0x40b8, 0x121a, 0x133c, 0xbf34, 0x3613, 0xb259, 0x4105, 0x41de, 0x4155, 0xa2c3, 0x189d, 0xbf65, 0xb017, 0xa019, 0xb082, 0x40c1, 0x4319, 0x1806, 0x1131, 0xbf87, 0x402b, 0x2960, 0x1969, 0x4232, 0x465a, 0xa10c, 0x464a, 0x37eb, 0x45a3, 0x401d, 0x1f11, 0xb0f1, 0x4210, 0x439a, 0x4048, 0x44a1, 0x28fb, 0x44f0, 0xb0b6, 0x41bf, 0x199b, 0xb268, 0x421a, 0x0b58, 0x40ad, 0x18b6, 0xbf09, 0x402a, 0x137c, 0x4046, 0x175f, 0xb0cf, 0x419b, 0xbf52, 0x419d, 0x4213, 0x04a6, 0xba01, 0xbff0, 0x01d4, 0x1932, 0x42d7, 0x4123, 0x4160, 0x0e55, 0x40c5, 0x195a, 0x43bc, 0x413d, 0x1d89, 0x40e8, 0xb21b, 0xb2a3, 0x43e1, 0x417e, 0x423c, 0x24d1, 0xbf6d, 0xa57c, 0x2ff1, 0x05fa, 0x4200, 0xb26f, 0x05f6, 0x064f, 0xbfcd, 0xb2dd, 0x40ed, 0x360f, 0xbafa, 0xb0e6, 0x2f81, 0x09cc, 0x4072, 0x408c, 0x0899, 0xb26c, 0x1ee4, 0x465f, 0x4175, 0xa5b6, 0xba63, 0x1ffc, 0x4094, 0x1a4f, 0xba23, 0xbf2b, 0x25dc, 0xba1f, 0x413b, 0x4105, 0x4180, 0x4186, 0xb2f9, 0x4194, 0xbfae, 0x1da7, 0x1afc, 0x4330, 0x3083, 0x43e5, 0x1f44, 0xba0a, 0x4469, 0x4062, 0xbaeb, 0x16ab, 0x363c, 0x1bdd, 0x40b0, 0xbfa8, 0x4346, 0x4129, 0xb080, 0x4450, 0x40d1, 0x12e2, 0x40a6, 0xae28, 0xbf74, 0xb08f, 0xb280, 0x0fb5, 0xb287, 0xb28e, 0x4238, 0x296f, 0x4398, 0x43b3, 0xb0b7, 0xba78, 0xbf73, 0x41be, 0x40ec, 0x1602, 0xb227, 0xb2c4, 0xbf28, 0x4298, 0x2f81, 0xbadc, 0x1dd0, 0xb255, 0x2521, 0xbac6, 0x03e6, 0xa5ac, 0xba11, 0x401e, 0x4172, 0x1912, 0x43a1, 0xbfa0, 0x41da, 0xb283, 0x2be3, 0xbaff, 0x24bf, 0x415a, 0x1da5, 0x4212, 0x436f, 0x41b8, 0xb29e, 0xbf28, 0xb2e8, 0x1ff8, 0xabd8, 0xb064, 0xba4e, 0x4136, 0x425c, 0x41b5, 0xba40, 0x19bb, 0x26a6, 0xbf26, 0xbaf6, 0xba55, 0x4169, 0x40c2, 0xb2c0, 0x0da2, 0x41fc, 0x3d98, 0x43d1, 0x19af, 0x4023, 0x0a9d, 0xb003, 0xb046, 0x1866, 0x40b2, 0x41af, 0xbafa, 0x1bd8, 0xbfa8, 0x4450, 0x427a, 0x4190, 0x1aa2, 0xa784, 0x1069, 0xb095, 0x181a, 0x4450, 0x41b6, 0x1bf7, 0x1d12, 0x347a, 0x41a3, 0xb263, 0x4215, 0x431c, 0x433c, 0xbf61, 0xb200, 0xb2db, 0x1c1d, 0xb2e5, 0xbf60, 0x12e2, 0xa6a8, 0x45aa, 0xb2bc, 0x41ca, 0xb2d7, 0xab7e, 0x0d22, 0xbf9e, 0x40b8, 0x2c08, 0x1db6, 0x3d47, 0x42ee, 0x4081, 0x412b, 0xa807, 0x350a, 0x43c6, 0xaea7, 0xbf5d, 0xa806, 0xb2cc, 0x4143, 0x30fb, 0x0043, 0x46b9, 0x1c7f, 0x1e13, 0x0da5, 0xb214, 0x3da5, 0x437f, 0x3532, 0x458a, 0x4131, 0x424b, 0x144f, 0x433a, 0x3f9b, 0x0dfc, 0x1faf, 0xb253, 0x4137, 0xbfd0, 0xbf49, 0x4107, 0x24b5, 0x4324, 0x40fb, 0x30c9, 0x1ea2, 0x324f, 0x1a34, 0x0dc7, 0x40e7, 0x1d48, 0x41dd, 0xae7c, 0x43a3, 0x299f, 0xbf01, 0xb077, 0x3770, 0x4140, 0xbfe0, 0x4265, 0x4019, 0x40ed, 0x0afe, 0x1b29, 0x1afc, 0xb23c, 0x04db, 0xb214, 0x439d, 0x2938, 0x0092, 0x40b0, 0x43c0, 0x43d5, 0xb0c1, 0xa37e, 0x1e61, 0xb021, 0x4022, 0xbf6f, 0x4114, 0x407d, 0x428c, 0x415e, 0x4256, 0xb0ea, 0x41e6, 0xbaf7, 0x4060, 0x1ee1, 0x1100, 0x42d5, 0xb25f, 0xb063, 0xb253, 0x1945, 0x30ee, 0x4210, 0x3373, 0x42a7, 0xbf72, 0x42d1, 0xb038, 0xbae9, 0x43ea, 0x40c7, 0xbfa0, 0x299d, 0xb294, 0x404e, 0x085d, 0x4341, 0x4172, 0x1c2a, 0x4183, 0xbf2b, 0xb2b7, 0x40ab, 0xb279, 0x43a9, 0x1cc5, 0x4208, 0x402f, 0x43b8, 0x43ee, 0x41e4, 0x3928, 0xba55, 0x4235, 0x2c5d, 0xbf90, 0x4278, 0xab33, 0x4338, 0x1631, 0x43b3, 0xbfc0, 0x058f, 0xba1c, 0x424d, 0x40e6, 0x3bc1, 0x43a9, 0xba00, 0xbf3e, 0x41fc, 0xa8a3, 0xba2b, 0x1e86, 0x23a6, 0x41f5, 0x40e4, 0x40c8, 0x430d, 0x46b2, 0xba5d, 0x415b, 0x32b1, 0x43ec, 0x2faf, 0xbfda, 0x43ac, 0xa3e2, 0xb283, 0x1c45, 0x4341, 0x4133, 0x40b4, 0x36da, 0x1c1e, 0x4395, 0xba7e, 0x4070, 0x1aeb, 0x467a, 0xb29e, 0x345f, 0x4364, 0xbf00, 0x412e, 0xb2e8, 0x1b7e, 0x2b8a, 0x42c7, 0x412b, 0x4097, 0xb2bf, 0xbf0c, 0x1914, 0x443e, 0x3c97, 0x310b, 0x4091, 0x4367, 0x409f, 0xba38, 0xbf33, 0x403d, 0x4024, 0x1d51, 0x43ed, 0xba4c, 0x4057, 0x46fc, 0x4356, 0x4095, 0x4119, 0x4019, 0xb232, 0xba07, 0x22e0, 0x4082, 0xb038, 0x19e5, 0x1171, 0xbfc3, 0x1cf0, 0x1e78, 0xb2bd, 0x250a, 0x4128, 0x42bf, 0x43c4, 0xb0cf, 0xb269, 0xba09, 0x42dd, 0x1ad6, 0x41c3, 0x2cab, 0x411d, 0xbf95, 0xaf53, 0x45b5, 0x4255, 0x41d7, 0x43c1, 0x4447, 0xb2c7, 0xb284, 0x1c1e, 0xba76, 0xaada, 0x1344, 0x40ac, 0x426f, 0xaa92, 0x41d1, 0x261f, 0x189e, 0x1904, 0x41fe, 0xb283, 0xa695, 0xbfa3, 0xb0f1, 0x41dd, 0xb2c2, 0xb2fd, 0x431b, 0x438d, 0xb2a1, 0x4240, 0x42c9, 0xa2b2, 0x345e, 0x435e, 0xbf1f, 0xba7f, 0x41d4, 0x1e3f, 0x0eee, 0x1d12, 0x42d2, 0xbfb0, 0x41b0, 0xa79a, 0xbf80, 0x32a0, 0xb20d, 0x3e30, 0xb2ad, 0xb273, 0x41a4, 0xb2c3, 0x404c, 0xba3e, 0x4377, 0x4197, 0xbfd9, 0xba3a, 0xb23e, 0x41c3, 0xb042, 0xb2ee, 0xb24c, 0x43ce, 0xbade, 0xa3fb, 0x04f6, 0xb293, 0xa149, 0xb25e, 0x4319, 0x19e5, 0xbf1c, 0x1878, 0x1bb1, 0x4061, 0x4657, 0x414d, 0x1f05, 0xba55, 0x1a6a, 0x4065, 0x0674, 0xab5f, 0xa70a, 0xbf87, 0x4095, 0xb089, 0x4121, 0x4300, 0x4012, 0xbfbf, 0x40a1, 0x436c, 0x4032, 0xbad1, 0xa20b, 0x1d95, 0xa4be, 0x1deb, 0x419f, 0x4324, 0x4418, 0x4363, 0x42ce, 0x403c, 0xbfb3, 0xb07a, 0x4179, 0xbaf5, 0x1daa, 0xb22a, 0x4671, 0xba28, 0x188a, 0x41cd, 0xb298, 0x19e9, 0x428b, 0x1e5c, 0x413a, 0x3a1f, 0x41d5, 0xa080, 0x43d2, 0x28e1, 0x436e, 0x40ce, 0xb27c, 0x26cf, 0x407e, 0x456a, 0x43c7, 0xb253, 0x4667, 0xbf34, 0x411e, 0x43f8, 0x4152, 0xbaff, 0x42ce, 0x4147, 0x128c, 0x4095, 0x1a0a, 0x4392, 0x1c9b, 0x41ed, 0x2a7a, 0x01f2, 0xbf00, 0x004d, 0xb2b3, 0x1d3b, 0xb0e9, 0xb2f3, 0xbf93, 0x10bb, 0x41bf, 0x1f9e, 0x1d2d, 0xb2d4, 0x08c2, 0x4190, 0xbadc, 0xba46, 0x42cc, 0x446d, 0x424e, 0x4146, 0x40ef, 0xa359, 0x1a54, 0xb066, 0xba55, 0xbacf, 0x41f3, 0x4689, 0xbf0f, 0x1492, 0xbae7, 0xb2b4, 0xb2a0, 0x413f, 0x00d2, 0x406e, 0x40dd, 0xb2c9, 0x0345, 0xb20e, 0x432d, 0x4227, 0x34a0, 0x429c, 0x416b, 0xb08d, 0xbf4f, 0x19d9, 0x42bd, 0xa315, 0x442a, 0x1a15, 0x445e, 0xaea8, 0x0a9d, 0x35e8, 0xb29f, 0x1a1e, 0x3022, 0xb050, 0xa914, 0x0e5a, 0x4267, 0x4445, 0x4367, 0x1ff7, 0x40f8, 0x23dd, 0x4283, 0x454d, 0x415e, 0x4199, 0xbfe4, 0xbfc0, 0x4185, 0x4564, 0xb059, 0x409f, 0xbf55, 0x446b, 0x2c78, 0x43b4, 0x435a, 0xa547, 0x411d, 0x2c11, 0xb0a8, 0x0e79, 0xb23c, 0x4111, 0x42e8, 0x1a3e, 0x1e15, 0xbf06, 0x0cce, 0x1e92, 0x0485, 0xba74, 0x0a52, 0xa544, 0x4120, 0xb087, 0x41e8, 0xba64, 0xbf25, 0x3059, 0xb2f3, 0x4301, 0xb2e3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5b8d957d, 0xda740f74, 0xf45748f5, 0x13975c8e, 0xd433eb4e, 0xa749743f, 0x6c798277, 0xd9c1885d, 0xc3623606, 0xea7f747e, 0x8bf0542c, 0xfe1fe0b1, 0xd0d3fbf2, 0xed311e85, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00000000, 0x007fffff, 0xb0934dd8, 0x00000000, 0x000018e4, 0x00000000, 0x00000000, 0xc3623606, 0xffff8cd5, 0xb0934e5d, 0xfe1fe0b1, 0x000015a6, 0xb0934c3f, 0x00000000, 0x400001d0 }, + Instructions = [0x43cc, 0x407a, 0x415b, 0x42d2, 0xb20d, 0x41de, 0x1b41, 0x19b6, 0xb051, 0x1dcf, 0x36bc, 0x29fd, 0xbf00, 0x15eb, 0x415d, 0x2be9, 0x1bd3, 0xba76, 0x41a0, 0x45b0, 0xb26e, 0x0c41, 0x3dc0, 0xa863, 0x08ac, 0xbf87, 0x01a2, 0xba51, 0x430e, 0x1090, 0x425e, 0x428c, 0xba79, 0xb0b7, 0x1c66, 0x1c0e, 0x1bf3, 0x40df, 0x4663, 0x4346, 0x1b2f, 0x19fe, 0xbfdd, 0x0720, 0xa14b, 0x1a70, 0xba79, 0xba54, 0xba53, 0x42ef, 0x42c0, 0x409f, 0xbfd6, 0x4276, 0x41df, 0x2a4b, 0x43d6, 0x4094, 0x403d, 0x456a, 0x4027, 0x40b1, 0xac6c, 0x4201, 0x426d, 0x40f2, 0x3d25, 0xb26c, 0x2c76, 0x4193, 0xb0ae, 0x4048, 0x46f4, 0x0f9b, 0xbf00, 0x435b, 0xbfd0, 0x4166, 0x42da, 0xbf78, 0x42a6, 0x455c, 0x428d, 0xbafc, 0x140b, 0xbf8d, 0xb201, 0x4348, 0x4198, 0x1ad2, 0x41fb, 0xba39, 0xb295, 0xbf07, 0x43cb, 0x1d7c, 0xb285, 0x4223, 0x41a0, 0x2f9b, 0xbfa0, 0xb0ab, 0xb00d, 0x411f, 0x463a, 0x43d7, 0xb240, 0xbac6, 0x4067, 0xaa78, 0xb25f, 0x41f2, 0x438d, 0x42ed, 0x4217, 0xbf36, 0x4110, 0x4127, 0xb2dd, 0x4033, 0xae52, 0x4633, 0x401e, 0x1060, 0xb026, 0x3426, 0x4328, 0x4223, 0x3866, 0x4665, 0x1c0d, 0x05a2, 0xbf5c, 0xb2e6, 0xa188, 0xac49, 0x424b, 0x261f, 0x41c5, 0x41e9, 0xad0a, 0x2738, 0xba47, 0xa121, 0xb095, 0x45ee, 0x18ca, 0xbf80, 0x030f, 0x4279, 0x46e2, 0x418d, 0x44c5, 0xb250, 0x4248, 0xb026, 0xbfa8, 0x41d3, 0xa696, 0x426f, 0x45da, 0xb294, 0x40e2, 0x1ccd, 0xa595, 0x420e, 0xaf3b, 0x10ee, 0xb0ae, 0x3c78, 0x413a, 0xb0b4, 0x23f4, 0xbf5d, 0x18be, 0xb077, 0x4070, 0x022e, 0x41be, 0xb2a9, 0x42c3, 0xbf1f, 0x4194, 0x037b, 0xbfd0, 0x42ef, 0x025e, 0xb21c, 0xbf91, 0x4016, 0x43e7, 0x4280, 0x409e, 0xb25b, 0xb023, 0xb224, 0xaa0f, 0xba4b, 0x1b56, 0xba31, 0xa177, 0x4118, 0x08be, 0x433b, 0xb023, 0x40cb, 0x2d55, 0xb0a3, 0x40ef, 0x44d9, 0x420f, 0xb0a7, 0x39b0, 0x412b, 0xbfa8, 0x1e44, 0x4602, 0xbfa3, 0xba1e, 0xb2c6, 0x429a, 0xb205, 0x047a, 0xb0fe, 0x4373, 0xbad8, 0x434c, 0x30e0, 0x1ee5, 0xbfb0, 0x410e, 0xb21e, 0xa97d, 0x42b1, 0x4671, 0x433f, 0xbf0d, 0x0ee6, 0x42ac, 0x19e3, 0x41a3, 0xbfa0, 0xba44, 0xa51c, 0xb241, 0xb2af, 0x415a, 0x0a3c, 0xbf1c, 0x28a0, 0x43d5, 0x4200, 0x43f3, 0x4240, 0x419c, 0x3d0b, 0xb09a, 0xa807, 0x42fa, 0x41e0, 0xbad5, 0x3438, 0xba09, 0xb0f9, 0x4628, 0x4167, 0x1b7b, 0xba0a, 0xa17a, 0xb276, 0x40b8, 0x121a, 0x133c, 0xbf34, 0x3613, 0xb259, 0x4105, 0x41de, 0x4155, 0xa2c3, 0x189d, 0xbf65, 0xb017, 0xa019, 0xb082, 0x40c1, 0x4319, 0x1806, 0x1131, 0xbf87, 0x402b, 0x2960, 0x1969, 0x4232, 0x465a, 0xa10c, 0x464a, 0x37eb, 0x45a3, 0x401d, 0x1f11, 0xb0f1, 0x4210, 0x439a, 0x4048, 0x44a1, 0x28fb, 0x44f0, 0xb0b6, 0x41bf, 0x199b, 0xb268, 0x421a, 0x0b58, 0x40ad, 0x18b6, 0xbf09, 0x402a, 0x137c, 0x4046, 0x175f, 0xb0cf, 0x419b, 0xbf52, 0x419d, 0x4213, 0x04a6, 0xba01, 0xbff0, 0x01d4, 0x1932, 0x42d7, 0x4123, 0x4160, 0x0e55, 0x40c5, 0x195a, 0x43bc, 0x413d, 0x1d89, 0x40e8, 0xb21b, 0xb2a3, 0x43e1, 0x417e, 0x423c, 0x24d1, 0xbf6d, 0xa57c, 0x2ff1, 0x05fa, 0x4200, 0xb26f, 0x05f6, 0x064f, 0xbfcd, 0xb2dd, 0x40ed, 0x360f, 0xbafa, 0xb0e6, 0x2f81, 0x09cc, 0x4072, 0x408c, 0x0899, 0xb26c, 0x1ee4, 0x465f, 0x4175, 0xa5b6, 0xba63, 0x1ffc, 0x4094, 0x1a4f, 0xba23, 0xbf2b, 0x25dc, 0xba1f, 0x413b, 0x4105, 0x4180, 0x4186, 0xb2f9, 0x4194, 0xbfae, 0x1da7, 0x1afc, 0x4330, 0x3083, 0x43e5, 0x1f44, 0xba0a, 0x4469, 0x4062, 0xbaeb, 0x16ab, 0x363c, 0x1bdd, 0x40b0, 0xbfa8, 0x4346, 0x4129, 0xb080, 0x4450, 0x40d1, 0x12e2, 0x40a6, 0xae28, 0xbf74, 0xb08f, 0xb280, 0x0fb5, 0xb287, 0xb28e, 0x4238, 0x296f, 0x4398, 0x43b3, 0xb0b7, 0xba78, 0xbf73, 0x41be, 0x40ec, 0x1602, 0xb227, 0xb2c4, 0xbf28, 0x4298, 0x2f81, 0xbadc, 0x1dd0, 0xb255, 0x2521, 0xbac6, 0x03e6, 0xa5ac, 0xba11, 0x401e, 0x4172, 0x1912, 0x43a1, 0xbfa0, 0x41da, 0xb283, 0x2be3, 0xbaff, 0x24bf, 0x415a, 0x1da5, 0x4212, 0x436f, 0x41b8, 0xb29e, 0xbf28, 0xb2e8, 0x1ff8, 0xabd8, 0xb064, 0xba4e, 0x4136, 0x425c, 0x41b5, 0xba40, 0x19bb, 0x26a6, 0xbf26, 0xbaf6, 0xba55, 0x4169, 0x40c2, 0xb2c0, 0x0da2, 0x41fc, 0x3d98, 0x43d1, 0x19af, 0x4023, 0x0a9d, 0xb003, 0xb046, 0x1866, 0x40b2, 0x41af, 0xbafa, 0x1bd8, 0xbfa8, 0x4450, 0x427a, 0x4190, 0x1aa2, 0xa784, 0x1069, 0xb095, 0x181a, 0x4450, 0x41b6, 0x1bf7, 0x1d12, 0x347a, 0x41a3, 0xb263, 0x4215, 0x431c, 0x433c, 0xbf61, 0xb200, 0xb2db, 0x1c1d, 0xb2e5, 0xbf60, 0x12e2, 0xa6a8, 0x45aa, 0xb2bc, 0x41ca, 0xb2d7, 0xab7e, 0x0d22, 0xbf9e, 0x40b8, 0x2c08, 0x1db6, 0x3d47, 0x42ee, 0x4081, 0x412b, 0xa807, 0x350a, 0x43c6, 0xaea7, 0xbf5d, 0xa806, 0xb2cc, 0x4143, 0x30fb, 0x0043, 0x46b9, 0x1c7f, 0x1e13, 0x0da5, 0xb214, 0x3da5, 0x437f, 0x3532, 0x458a, 0x4131, 0x424b, 0x144f, 0x433a, 0x3f9b, 0x0dfc, 0x1faf, 0xb253, 0x4137, 0xbfd0, 0xbf49, 0x4107, 0x24b5, 0x4324, 0x40fb, 0x30c9, 0x1ea2, 0x324f, 0x1a34, 0x0dc7, 0x40e7, 0x1d48, 0x41dd, 0xae7c, 0x43a3, 0x299f, 0xbf01, 0xb077, 0x3770, 0x4140, 0xbfe0, 0x4265, 0x4019, 0x40ed, 0x0afe, 0x1b29, 0x1afc, 0xb23c, 0x04db, 0xb214, 0x439d, 0x2938, 0x0092, 0x40b0, 0x43c0, 0x43d5, 0xb0c1, 0xa37e, 0x1e61, 0xb021, 0x4022, 0xbf6f, 0x4114, 0x407d, 0x428c, 0x415e, 0x4256, 0xb0ea, 0x41e6, 0xbaf7, 0x4060, 0x1ee1, 0x1100, 0x42d5, 0xb25f, 0xb063, 0xb253, 0x1945, 0x30ee, 0x4210, 0x3373, 0x42a7, 0xbf72, 0x42d1, 0xb038, 0xbae9, 0x43ea, 0x40c7, 0xbfa0, 0x299d, 0xb294, 0x404e, 0x085d, 0x4341, 0x4172, 0x1c2a, 0x4183, 0xbf2b, 0xb2b7, 0x40ab, 0xb279, 0x43a9, 0x1cc5, 0x4208, 0x402f, 0x43b8, 0x43ee, 0x41e4, 0x3928, 0xba55, 0x4235, 0x2c5d, 0xbf90, 0x4278, 0xab33, 0x4338, 0x1631, 0x43b3, 0xbfc0, 0x058f, 0xba1c, 0x424d, 0x40e6, 0x3bc1, 0x43a9, 0xba00, 0xbf3e, 0x41fc, 0xa8a3, 0xba2b, 0x1e86, 0x23a6, 0x41f5, 0x40e4, 0x40c8, 0x430d, 0x46b2, 0xba5d, 0x415b, 0x32b1, 0x43ec, 0x2faf, 0xbfda, 0x43ac, 0xa3e2, 0xb283, 0x1c45, 0x4341, 0x4133, 0x40b4, 0x36da, 0x1c1e, 0x4395, 0xba7e, 0x4070, 0x1aeb, 0x467a, 0xb29e, 0x345f, 0x4364, 0xbf00, 0x412e, 0xb2e8, 0x1b7e, 0x2b8a, 0x42c7, 0x412b, 0x4097, 0xb2bf, 0xbf0c, 0x1914, 0x443e, 0x3c97, 0x310b, 0x4091, 0x4367, 0x409f, 0xba38, 0xbf33, 0x403d, 0x4024, 0x1d51, 0x43ed, 0xba4c, 0x4057, 0x46fc, 0x4356, 0x4095, 0x4119, 0x4019, 0xb232, 0xba07, 0x22e0, 0x4082, 0xb038, 0x19e5, 0x1171, 0xbfc3, 0x1cf0, 0x1e78, 0xb2bd, 0x250a, 0x4128, 0x42bf, 0x43c4, 0xb0cf, 0xb269, 0xba09, 0x42dd, 0x1ad6, 0x41c3, 0x2cab, 0x411d, 0xbf95, 0xaf53, 0x45b5, 0x4255, 0x41d7, 0x43c1, 0x4447, 0xb2c7, 0xb284, 0x1c1e, 0xba76, 0xaada, 0x1344, 0x40ac, 0x426f, 0xaa92, 0x41d1, 0x261f, 0x189e, 0x1904, 0x41fe, 0xb283, 0xa695, 0xbfa3, 0xb0f1, 0x41dd, 0xb2c2, 0xb2fd, 0x431b, 0x438d, 0xb2a1, 0x4240, 0x42c9, 0xa2b2, 0x345e, 0x435e, 0xbf1f, 0xba7f, 0x41d4, 0x1e3f, 0x0eee, 0x1d12, 0x42d2, 0xbfb0, 0x41b0, 0xa79a, 0xbf80, 0x32a0, 0xb20d, 0x3e30, 0xb2ad, 0xb273, 0x41a4, 0xb2c3, 0x404c, 0xba3e, 0x4377, 0x4197, 0xbfd9, 0xba3a, 0xb23e, 0x41c3, 0xb042, 0xb2ee, 0xb24c, 0x43ce, 0xbade, 0xa3fb, 0x04f6, 0xb293, 0xa149, 0xb25e, 0x4319, 0x19e5, 0xbf1c, 0x1878, 0x1bb1, 0x4061, 0x4657, 0x414d, 0x1f05, 0xba55, 0x1a6a, 0x4065, 0x0674, 0xab5f, 0xa70a, 0xbf87, 0x4095, 0xb089, 0x4121, 0x4300, 0x4012, 0xbfbf, 0x40a1, 0x436c, 0x4032, 0xbad1, 0xa20b, 0x1d95, 0xa4be, 0x1deb, 0x419f, 0x4324, 0x4418, 0x4363, 0x42ce, 0x403c, 0xbfb3, 0xb07a, 0x4179, 0xbaf5, 0x1daa, 0xb22a, 0x4671, 0xba28, 0x188a, 0x41cd, 0xb298, 0x19e9, 0x428b, 0x1e5c, 0x413a, 0x3a1f, 0x41d5, 0xa080, 0x43d2, 0x28e1, 0x436e, 0x40ce, 0xb27c, 0x26cf, 0x407e, 0x456a, 0x43c7, 0xb253, 0x4667, 0xbf34, 0x411e, 0x43f8, 0x4152, 0xbaff, 0x42ce, 0x4147, 0x128c, 0x4095, 0x1a0a, 0x4392, 0x1c9b, 0x41ed, 0x2a7a, 0x01f2, 0xbf00, 0x004d, 0xb2b3, 0x1d3b, 0xb0e9, 0xb2f3, 0xbf93, 0x10bb, 0x41bf, 0x1f9e, 0x1d2d, 0xb2d4, 0x08c2, 0x4190, 0xbadc, 0xba46, 0x42cc, 0x446d, 0x424e, 0x4146, 0x40ef, 0xa359, 0x1a54, 0xb066, 0xba55, 0xbacf, 0x41f3, 0x4689, 0xbf0f, 0x1492, 0xbae7, 0xb2b4, 0xb2a0, 0x413f, 0x00d2, 0x406e, 0x40dd, 0xb2c9, 0x0345, 0xb20e, 0x432d, 0x4227, 0x34a0, 0x429c, 0x416b, 0xb08d, 0xbf4f, 0x19d9, 0x42bd, 0xa315, 0x442a, 0x1a15, 0x445e, 0xaea8, 0x0a9d, 0x35e8, 0xb29f, 0x1a1e, 0x3022, 0xb050, 0xa914, 0x0e5a, 0x4267, 0x4445, 0x4367, 0x1ff7, 0x40f8, 0x23dd, 0x4283, 0x454d, 0x415e, 0x4199, 0xbfe4, 0xbfc0, 0x4185, 0x4564, 0xb059, 0x409f, 0xbf55, 0x446b, 0x2c78, 0x43b4, 0x435a, 0xa547, 0x411d, 0x2c11, 0xb0a8, 0x0e79, 0xb23c, 0x4111, 0x42e8, 0x1a3e, 0x1e15, 0xbf06, 0x0cce, 0x1e92, 0x0485, 0xba74, 0x0a52, 0xa544, 0x4120, 0xb087, 0x41e8, 0xba64, 0xbf25, 0x3059, 0xb2f3, 0x4301, 0xb2e3, 0x4770, 0xe7fe + ], + StartRegs = [0x5b8d957d, 0xda740f74, 0xf45748f5, 0x13975c8e, 0xd433eb4e, 0xa749743f, 0x6c798277, 0xd9c1885d, 0xc3623606, 0xea7f747e, 0x8bf0542c, 0xfe1fe0b1, 0xd0d3fbf2, 0xed311e85, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x00000000, 0x00000000, 0x007fffff, 0xb0934dd8, 0x00000000, 0x000018e4, 0x00000000, 0x00000000, 0xc3623606, 0xffff8cd5, 0xb0934e5d, 0xfe1fe0b1, 0x000015a6, 0xb0934c3f, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x2722, 0x4544, 0x4378, 0x437b, 0x33fe, 0x41f0, 0x1814, 0x1583, 0x0945, 0xa03e, 0xb24c, 0x1ba2, 0x1e8e, 0x4291, 0xb2d6, 0x1b2d, 0x1637, 0xbfca, 0x3736, 0xb2a1, 0x41d7, 0x42e1, 0xb2b3, 0x4007, 0xb073, 0x1d95, 0xb219, 0x3d08, 0x415a, 0x4282, 0x4245, 0x43c9, 0x1a86, 0xb2bf, 0x463e, 0x40af, 0x1cd7, 0x43b1, 0x4108, 0x0da6, 0x430f, 0x418b, 0xbf2b, 0x4608, 0x441c, 0x41b7, 0xb254, 0xba40, 0x42b7, 0x1de0, 0xbf70, 0x1d62, 0xba76, 0xb045, 0x4138, 0x4067, 0x0654, 0x1e1a, 0xb015, 0x447a, 0x430b, 0x4154, 0x2823, 0x4685, 0xbf75, 0x4080, 0x426a, 0x43a2, 0x40eb, 0x437c, 0x4048, 0x4285, 0xba0d, 0x1eea, 0x4364, 0xbf29, 0x41b9, 0x4351, 0x4204, 0x1c9d, 0xa86b, 0x1174, 0x4064, 0x00d4, 0x4021, 0xb047, 0xba13, 0x4113, 0xb2a0, 0x12fd, 0x4171, 0x4178, 0x410e, 0xba24, 0x432b, 0xb2b0, 0x3ef8, 0xb2ea, 0x410e, 0x1db0, 0x18de, 0x1ffa, 0x1bc9, 0xbf27, 0x43af, 0x4021, 0xb2f6, 0x4307, 0x400e, 0xba4a, 0x44f4, 0x43e4, 0x22a9, 0xba03, 0x1c54, 0x4356, 0x1c4c, 0xbf8a, 0x426e, 0x4136, 0xac9b, 0xb011, 0xba49, 0x4458, 0x1230, 0x4551, 0x4003, 0xbf41, 0x1ff7, 0xb2a2, 0x19dc, 0xabbe, 0xbf28, 0xa7a7, 0x407c, 0x4019, 0xa9c5, 0x4479, 0xb07b, 0x00e2, 0xbf16, 0xb2a7, 0x323b, 0xbfe0, 0x42fd, 0xb2b7, 0x40fd, 0x4140, 0x421e, 0x41dc, 0x179a, 0x2e91, 0xb25a, 0xb0af, 0x4384, 0x4157, 0x45ad, 0x280d, 0xbfa2, 0x467b, 0xba07, 0x4262, 0x36bd, 0xb0d2, 0x289b, 0x4211, 0x4152, 0x41ef, 0x426e, 0xb2f2, 0x4356, 0x4614, 0xbaf0, 0x4229, 0x314a, 0x4182, 0xbf1e, 0x1fd7, 0xba5d, 0xad77, 0x43aa, 0xbae9, 0xbfd0, 0x0a05, 0xa8b2, 0x419a, 0xb23c, 0x4367, 0x4090, 0xbf70, 0xbf1c, 0xbf00, 0xb0f9, 0x4274, 0x4299, 0xb210, 0xb215, 0x1e80, 0x08e8, 0x43ee, 0x412f, 0x379d, 0x402e, 0x1919, 0xaff5, 0x4106, 0xbae6, 0x42e4, 0x45aa, 0x40e4, 0x1b18, 0x43b9, 0xbf1d, 0xbaca, 0x3c0c, 0xb090, 0x463c, 0x1fe5, 0xb21c, 0x4129, 0x3dd7, 0xb24f, 0xaeb3, 0x4651, 0xb0f0, 0x0629, 0xba16, 0x42be, 0x4147, 0x1d46, 0x2698, 0x436f, 0xb080, 0xbff0, 0x4337, 0x3d59, 0x465e, 0x2c6d, 0x4262, 0xb088, 0x417d, 0x41b8, 0xbf12, 0xbac4, 0x40c5, 0x1406, 0x3e5f, 0x3f1c, 0x04b0, 0xa681, 0x469a, 0x433a, 0x443c, 0x26c9, 0x41eb, 0x4198, 0xbfd3, 0xb2d5, 0x4380, 0xb24d, 0xba72, 0x4366, 0x42af, 0x1ae5, 0x43ff, 0x43ed, 0x412e, 0x1d52, 0x405a, 0x41ed, 0x45cd, 0x41ae, 0xb2b8, 0xbfda, 0x2331, 0x4430, 0x0f27, 0x4036, 0x1f45, 0x40b2, 0xb0a7, 0x4230, 0x0a6e, 0x44f8, 0x460d, 0xb29f, 0xa318, 0x430b, 0x3556, 0xae3e, 0xb034, 0xbf57, 0xb2d5, 0x3b8c, 0x44ea, 0xb05a, 0x42f4, 0xa5f5, 0x2209, 0x416c, 0x4466, 0x422b, 0x4263, 0x43d2, 0x1468, 0xb265, 0xbfcb, 0xbad4, 0xb28f, 0xbadb, 0xa163, 0x443b, 0x3b15, 0x197c, 0x261a, 0x43a1, 0x4028, 0xb24b, 0x4182, 0x1e7a, 0xb2d8, 0x4108, 0xba42, 0xbfe0, 0x42ba, 0x4212, 0x1849, 0x1a51, 0x1a9f, 0x15e7, 0xba28, 0xb27f, 0xbf23, 0x41c9, 0x3442, 0xad53, 0x406f, 0x0712, 0x1cd0, 0x467c, 0x1da8, 0x42fe, 0x43e1, 0xba5f, 0xb2fa, 0x41be, 0x3f24, 0xbfb0, 0x426b, 0xbf05, 0x2ee5, 0xbade, 0x43f9, 0x43ed, 0x4195, 0x4176, 0x4294, 0x4286, 0x00e1, 0xacdb, 0x1e04, 0x1f46, 0xbfc4, 0xa533, 0x4165, 0x41a6, 0x4344, 0xbf97, 0xba71, 0xa713, 0xbafc, 0x40a1, 0x00da, 0xb0c8, 0xba61, 0x4161, 0x1da3, 0x4053, 0x19d0, 0x40dc, 0x4036, 0x4075, 0x40a6, 0xab72, 0x08d1, 0xb21b, 0xaddc, 0x416e, 0x1c32, 0x41b8, 0x0b12, 0x1434, 0xb042, 0x408a, 0xb24d, 0x1743, 0xb287, 0xbf37, 0x40cd, 0x417f, 0x34ae, 0x427e, 0x42d5, 0x4039, 0x360f, 0x413f, 0x3864, 0x27c9, 0x40f8, 0x4318, 0x422e, 0x3c63, 0x1bd9, 0x424c, 0x1384, 0x1c1e, 0xa82e, 0xbfc8, 0xa049, 0x079e, 0xa832, 0x46e8, 0xba13, 0xbfc0, 0x1af3, 0xb2a3, 0xb074, 0x19b9, 0x2c75, 0xbacf, 0x3dca, 0x0f0b, 0x2979, 0x4007, 0x43be, 0xba62, 0xbadc, 0xbf87, 0x125a, 0x435f, 0x1c1a, 0x13ab, 0x42b7, 0xbf70, 0x42cc, 0x1978, 0x41b2, 0xba50, 0x42be, 0x4346, 0x4336, 0xb2a5, 0x45bd, 0xa15a, 0x2038, 0xba4c, 0x1a84, 0x430b, 0xb2b4, 0xbfae, 0x41c1, 0x42d3, 0x1ef4, 0xb01a, 0x1c63, 0x210b, 0xb272, 0xa49d, 0x1be2, 0x18b4, 0x1c08, 0xa4d3, 0x1f6b, 0x113c, 0x4663, 0x41c6, 0x4247, 0x402f, 0x4379, 0x0949, 0x4008, 0x42c6, 0x41fc, 0x0b89, 0xbf7c, 0x4370, 0x422d, 0x4362, 0x0b78, 0x040c, 0x43da, 0x462d, 0xb251, 0x1e56, 0x4123, 0xaaef, 0x43a6, 0x0408, 0x2a06, 0xb276, 0xb091, 0x42a4, 0x4319, 0x3ce5, 0xb297, 0x40df, 0xba2d, 0x3233, 0x29dc, 0x407f, 0xbf4a, 0x4685, 0xba15, 0x1404, 0xba06, 0x42a9, 0x262a, 0x3e76, 0x0ba0, 0xb2e8, 0x4482, 0x4047, 0xb037, 0xb06b, 0x05a4, 0x40ad, 0x435d, 0x4057, 0x4280, 0x4049, 0x42b3, 0xbf6d, 0xba7a, 0x42f6, 0x0984, 0x2d9f, 0x44d5, 0x4374, 0x4047, 0x1a23, 0x435b, 0x1f11, 0xb213, 0xba1a, 0x4030, 0x43ca, 0x0f9c, 0x4682, 0xaed1, 0x45be, 0x42eb, 0x41ef, 0xa19a, 0xa571, 0x43e4, 0xbf4c, 0x4255, 0x43bc, 0x40d9, 0x0a28, 0x2786, 0xbf33, 0x42c9, 0x1b40, 0xb2c6, 0xb0a8, 0xafac, 0x40a8, 0x1c68, 0x4184, 0x1420, 0xb2d5, 0xbf34, 0x433a, 0xb24b, 0x45e4, 0x0183, 0xb22d, 0xb091, 0xb2cf, 0x4038, 0x41a3, 0xbf60, 0x40ef, 0x4360, 0x45c4, 0xb080, 0x339d, 0xba16, 0x4115, 0xbf96, 0x406e, 0xaf42, 0xb28f, 0x413d, 0xbfbb, 0x4146, 0xb038, 0x4285, 0x216e, 0xb264, 0x431e, 0x42b9, 0x2f56, 0x0e0c, 0x4217, 0xa12d, 0xac5c, 0x4328, 0x40a2, 0x1a29, 0xb0e9, 0x442f, 0x41bc, 0x37c6, 0xb0cc, 0x18ce, 0xb042, 0x1b4e, 0xbf90, 0xbf9d, 0x419f, 0x414f, 0x1eb1, 0x1f9e, 0x4294, 0xa197, 0x1896, 0xbaf5, 0x4272, 0x45c8, 0x0da9, 0x424c, 0x2c62, 0x4022, 0x1bfa, 0x4091, 0x0417, 0xb099, 0xba6b, 0x40c9, 0x1d35, 0x43c1, 0xb0e2, 0x443b, 0x4137, 0x0c33, 0x418c, 0xbf7e, 0x4196, 0xba14, 0x4585, 0xbfca, 0x41f0, 0x3bb0, 0xb044, 0xb2e7, 0x2b49, 0x4428, 0xbfca, 0xb092, 0x4051, 0x4201, 0x1a8d, 0xbf90, 0xba5c, 0xb0bf, 0x4151, 0x19c8, 0xb293, 0x437a, 0xb2a9, 0xbace, 0xbf71, 0x40da, 0xb24e, 0x0bb8, 0x1879, 0xba3b, 0x402b, 0x1e0d, 0xbad2, 0xb204, 0xba07, 0x3165, 0xb08b, 0x3c16, 0x1e6d, 0x40f9, 0x1379, 0x17f9, 0xaf70, 0x4287, 0xbf2b, 0xbaf2, 0xba11, 0x41e7, 0x0360, 0xb237, 0x43d9, 0x1db8, 0xba48, 0xba5d, 0xbac7, 0xbfdd, 0x0be8, 0x1c5b, 0x20b0, 0x4099, 0x3a34, 0x4254, 0xb236, 0x419a, 0x1b31, 0xbf2d, 0x42a2, 0x4271, 0xbad5, 0xb254, 0x1bb2, 0x43b2, 0xb2b2, 0xbae9, 0xb22b, 0xa066, 0xba09, 0x4028, 0x400a, 0xb212, 0x42a3, 0x4047, 0xbf4a, 0x2bc0, 0xa346, 0x40a3, 0x42ee, 0x138f, 0x1b40, 0xba12, 0x1b0e, 0xa916, 0xb241, 0x400b, 0xbfdb, 0xba28, 0x41a1, 0x4390, 0x3d2b, 0x443e, 0x4673, 0x1d4d, 0x4120, 0x4269, 0x419d, 0x46f2, 0x4682, 0x41c5, 0xb2d2, 0xb234, 0x4036, 0xbf7e, 0xba39, 0xb2e8, 0x466f, 0x441e, 0x1b36, 0x3f5d, 0xba69, 0x20de, 0x1fdf, 0x18d0, 0x095f, 0x416b, 0x437d, 0x4331, 0x40de, 0x0e6a, 0x353b, 0x13c7, 0x4221, 0x437c, 0x1f97, 0x3a6d, 0x435d, 0x42cc, 0x43c4, 0x310b, 0x428c, 0x2383, 0xbfc7, 0xb0c1, 0x1fd1, 0xa1ce, 0x41d6, 0x45a6, 0xb275, 0x4257, 0xb2b3, 0x43ab, 0x4278, 0x1ecd, 0x359e, 0xb2e9, 0xba0c, 0xbad3, 0x1dc2, 0x419e, 0x424a, 0x41aa, 0xb2c1, 0x44e5, 0x40f0, 0x1778, 0x4088, 0xbfd6, 0x4246, 0x4197, 0x1c5c, 0x1b2e, 0xb28b, 0x0f3d, 0x1e81, 0x4122, 0x2e73, 0x1db5, 0x42fa, 0x1d43, 0x43f2, 0xba18, 0x0068, 0x42ff, 0x0dd0, 0x4247, 0x45ce, 0xb2ba, 0xa73d, 0x428f, 0x4329, 0xb225, 0xbf62, 0xba24, 0x43a0, 0x204c, 0x1466, 0xb2dc, 0x3f46, 0x42a7, 0x43a4, 0xba61, 0xb0f1, 0x40bb, 0x40c9, 0x4192, 0x4113, 0x1d47, 0x448d, 0xaa2a, 0xbaf6, 0xb2db, 0x4294, 0x4206, 0x0429, 0xb2b2, 0x41ee, 0x4081, 0x44b3, 0xbfd1, 0xbadd, 0x424e, 0x2a0e, 0x334e, 0x41f0, 0x1b77, 0xbae8, 0x4067, 0x42eb, 0x00b1, 0x423e, 0x4073, 0x4106, 0x40a9, 0x416b, 0x128f, 0x0281, 0xba3c, 0xbac5, 0x0c2f, 0xb012, 0x1c56, 0x40a6, 0x4096, 0x40e4, 0x42b5, 0xb090, 0x42ea, 0xbf49, 0x4287, 0x4051, 0x43d7, 0xba1d, 0x41dc, 0x4161, 0x2296, 0x4251, 0x4166, 0x43ad, 0xba47, 0x1b9f, 0xb026, 0xb2d0, 0xb2ec, 0x420d, 0x4355, 0x434c, 0xb08f, 0xb252, 0x1b04, 0xa364, 0xbafc, 0x19a4, 0x3c98, 0xbf9f, 0x41c0, 0x34d7, 0x456e, 0x42d5, 0xb264, 0x43df, 0x4542, 0xba15, 0x40de, 0x42d1, 0x1a20, 0xbf2f, 0x4103, 0xacdc, 0x40cc, 0xb099, 0x43eb, 0x43df, 0x317c, 0xba70, 0x1e2c, 0xbf84, 0x4158, 0x1c12, 0x40cb, 0x46d1, 0x408a, 0x037c, 0xb071, 0x4347, 0x4320, 0x25fa, 0x4078, 0xb25d, 0x1e50, 0xa645, 0x2831, 0xbf51, 0x4092, 0x19b4, 0xa3f1, 0xbada, 0x4036, 0x42a7, 0x09ac, 0x1f55, 0xb247, 0x2753, 0x426b, 0x40a5, 0x4223, 0x40f3, 0xbfae, 0x292e, 0x1f9b, 0x46cc, 0x181d, 0x40ca, 0x413f, 0x0b7e, 0x423a, 0xb264, 0x43b4, 0x214a, 0xad2e, 0x215a, 0xba7f, 0x409b, 0x4568, 0xaf04, 0x2c49, 0xa536, 0x425e, 0x42fe, 0xa0ba, 0x4107, 0xbf77, 0xb019, 0x1640, 0x4336, 0x2631, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x7f732ac7, 0xd652158c, 0xc810dc10, 0x451cfb90, 0x698e290f, 0x67d2fe9c, 0xfa98fc70, 0xc792f08a, 0x938d63b5, 0xf0a64fe6, 0xd6444518, 0x197a89a8, 0x8b76fcf7, 0x660046dd, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x00001ab4, 0x0000005a, 0x00000000, 0x00000000, 0x00000000, 0x0000189c, 0x00000031, 0xffffffff, 0x000000ac, 0x00000000, 0x00000000, 0x197a89a7, 0x00000000, 0x8b76fcc7, 0x00000000, 0xa00001d0 }, + Instructions = [0x2722, 0x4544, 0x4378, 0x437b, 0x33fe, 0x41f0, 0x1814, 0x1583, 0x0945, 0xa03e, 0xb24c, 0x1ba2, 0x1e8e, 0x4291, 0xb2d6, 0x1b2d, 0x1637, 0xbfca, 0x3736, 0xb2a1, 0x41d7, 0x42e1, 0xb2b3, 0x4007, 0xb073, 0x1d95, 0xb219, 0x3d08, 0x415a, 0x4282, 0x4245, 0x43c9, 0x1a86, 0xb2bf, 0x463e, 0x40af, 0x1cd7, 0x43b1, 0x4108, 0x0da6, 0x430f, 0x418b, 0xbf2b, 0x4608, 0x441c, 0x41b7, 0xb254, 0xba40, 0x42b7, 0x1de0, 0xbf70, 0x1d62, 0xba76, 0xb045, 0x4138, 0x4067, 0x0654, 0x1e1a, 0xb015, 0x447a, 0x430b, 0x4154, 0x2823, 0x4685, 0xbf75, 0x4080, 0x426a, 0x43a2, 0x40eb, 0x437c, 0x4048, 0x4285, 0xba0d, 0x1eea, 0x4364, 0xbf29, 0x41b9, 0x4351, 0x4204, 0x1c9d, 0xa86b, 0x1174, 0x4064, 0x00d4, 0x4021, 0xb047, 0xba13, 0x4113, 0xb2a0, 0x12fd, 0x4171, 0x4178, 0x410e, 0xba24, 0x432b, 0xb2b0, 0x3ef8, 0xb2ea, 0x410e, 0x1db0, 0x18de, 0x1ffa, 0x1bc9, 0xbf27, 0x43af, 0x4021, 0xb2f6, 0x4307, 0x400e, 0xba4a, 0x44f4, 0x43e4, 0x22a9, 0xba03, 0x1c54, 0x4356, 0x1c4c, 0xbf8a, 0x426e, 0x4136, 0xac9b, 0xb011, 0xba49, 0x4458, 0x1230, 0x4551, 0x4003, 0xbf41, 0x1ff7, 0xb2a2, 0x19dc, 0xabbe, 0xbf28, 0xa7a7, 0x407c, 0x4019, 0xa9c5, 0x4479, 0xb07b, 0x00e2, 0xbf16, 0xb2a7, 0x323b, 0xbfe0, 0x42fd, 0xb2b7, 0x40fd, 0x4140, 0x421e, 0x41dc, 0x179a, 0x2e91, 0xb25a, 0xb0af, 0x4384, 0x4157, 0x45ad, 0x280d, 0xbfa2, 0x467b, 0xba07, 0x4262, 0x36bd, 0xb0d2, 0x289b, 0x4211, 0x4152, 0x41ef, 0x426e, 0xb2f2, 0x4356, 0x4614, 0xbaf0, 0x4229, 0x314a, 0x4182, 0xbf1e, 0x1fd7, 0xba5d, 0xad77, 0x43aa, 0xbae9, 0xbfd0, 0x0a05, 0xa8b2, 0x419a, 0xb23c, 0x4367, 0x4090, 0xbf70, 0xbf1c, 0xbf00, 0xb0f9, 0x4274, 0x4299, 0xb210, 0xb215, 0x1e80, 0x08e8, 0x43ee, 0x412f, 0x379d, 0x402e, 0x1919, 0xaff5, 0x4106, 0xbae6, 0x42e4, 0x45aa, 0x40e4, 0x1b18, 0x43b9, 0xbf1d, 0xbaca, 0x3c0c, 0xb090, 0x463c, 0x1fe5, 0xb21c, 0x4129, 0x3dd7, 0xb24f, 0xaeb3, 0x4651, 0xb0f0, 0x0629, 0xba16, 0x42be, 0x4147, 0x1d46, 0x2698, 0x436f, 0xb080, 0xbff0, 0x4337, 0x3d59, 0x465e, 0x2c6d, 0x4262, 0xb088, 0x417d, 0x41b8, 0xbf12, 0xbac4, 0x40c5, 0x1406, 0x3e5f, 0x3f1c, 0x04b0, 0xa681, 0x469a, 0x433a, 0x443c, 0x26c9, 0x41eb, 0x4198, 0xbfd3, 0xb2d5, 0x4380, 0xb24d, 0xba72, 0x4366, 0x42af, 0x1ae5, 0x43ff, 0x43ed, 0x412e, 0x1d52, 0x405a, 0x41ed, 0x45cd, 0x41ae, 0xb2b8, 0xbfda, 0x2331, 0x4430, 0x0f27, 0x4036, 0x1f45, 0x40b2, 0xb0a7, 0x4230, 0x0a6e, 0x44f8, 0x460d, 0xb29f, 0xa318, 0x430b, 0x3556, 0xae3e, 0xb034, 0xbf57, 0xb2d5, 0x3b8c, 0x44ea, 0xb05a, 0x42f4, 0xa5f5, 0x2209, 0x416c, 0x4466, 0x422b, 0x4263, 0x43d2, 0x1468, 0xb265, 0xbfcb, 0xbad4, 0xb28f, 0xbadb, 0xa163, 0x443b, 0x3b15, 0x197c, 0x261a, 0x43a1, 0x4028, 0xb24b, 0x4182, 0x1e7a, 0xb2d8, 0x4108, 0xba42, 0xbfe0, 0x42ba, 0x4212, 0x1849, 0x1a51, 0x1a9f, 0x15e7, 0xba28, 0xb27f, 0xbf23, 0x41c9, 0x3442, 0xad53, 0x406f, 0x0712, 0x1cd0, 0x467c, 0x1da8, 0x42fe, 0x43e1, 0xba5f, 0xb2fa, 0x41be, 0x3f24, 0xbfb0, 0x426b, 0xbf05, 0x2ee5, 0xbade, 0x43f9, 0x43ed, 0x4195, 0x4176, 0x4294, 0x4286, 0x00e1, 0xacdb, 0x1e04, 0x1f46, 0xbfc4, 0xa533, 0x4165, 0x41a6, 0x4344, 0xbf97, 0xba71, 0xa713, 0xbafc, 0x40a1, 0x00da, 0xb0c8, 0xba61, 0x4161, 0x1da3, 0x4053, 0x19d0, 0x40dc, 0x4036, 0x4075, 0x40a6, 0xab72, 0x08d1, 0xb21b, 0xaddc, 0x416e, 0x1c32, 0x41b8, 0x0b12, 0x1434, 0xb042, 0x408a, 0xb24d, 0x1743, 0xb287, 0xbf37, 0x40cd, 0x417f, 0x34ae, 0x427e, 0x42d5, 0x4039, 0x360f, 0x413f, 0x3864, 0x27c9, 0x40f8, 0x4318, 0x422e, 0x3c63, 0x1bd9, 0x424c, 0x1384, 0x1c1e, 0xa82e, 0xbfc8, 0xa049, 0x079e, 0xa832, 0x46e8, 0xba13, 0xbfc0, 0x1af3, 0xb2a3, 0xb074, 0x19b9, 0x2c75, 0xbacf, 0x3dca, 0x0f0b, 0x2979, 0x4007, 0x43be, 0xba62, 0xbadc, 0xbf87, 0x125a, 0x435f, 0x1c1a, 0x13ab, 0x42b7, 0xbf70, 0x42cc, 0x1978, 0x41b2, 0xba50, 0x42be, 0x4346, 0x4336, 0xb2a5, 0x45bd, 0xa15a, 0x2038, 0xba4c, 0x1a84, 0x430b, 0xb2b4, 0xbfae, 0x41c1, 0x42d3, 0x1ef4, 0xb01a, 0x1c63, 0x210b, 0xb272, 0xa49d, 0x1be2, 0x18b4, 0x1c08, 0xa4d3, 0x1f6b, 0x113c, 0x4663, 0x41c6, 0x4247, 0x402f, 0x4379, 0x0949, 0x4008, 0x42c6, 0x41fc, 0x0b89, 0xbf7c, 0x4370, 0x422d, 0x4362, 0x0b78, 0x040c, 0x43da, 0x462d, 0xb251, 0x1e56, 0x4123, 0xaaef, 0x43a6, 0x0408, 0x2a06, 0xb276, 0xb091, 0x42a4, 0x4319, 0x3ce5, 0xb297, 0x40df, 0xba2d, 0x3233, 0x29dc, 0x407f, 0xbf4a, 0x4685, 0xba15, 0x1404, 0xba06, 0x42a9, 0x262a, 0x3e76, 0x0ba0, 0xb2e8, 0x4482, 0x4047, 0xb037, 0xb06b, 0x05a4, 0x40ad, 0x435d, 0x4057, 0x4280, 0x4049, 0x42b3, 0xbf6d, 0xba7a, 0x42f6, 0x0984, 0x2d9f, 0x44d5, 0x4374, 0x4047, 0x1a23, 0x435b, 0x1f11, 0xb213, 0xba1a, 0x4030, 0x43ca, 0x0f9c, 0x4682, 0xaed1, 0x45be, 0x42eb, 0x41ef, 0xa19a, 0xa571, 0x43e4, 0xbf4c, 0x4255, 0x43bc, 0x40d9, 0x0a28, 0x2786, 0xbf33, 0x42c9, 0x1b40, 0xb2c6, 0xb0a8, 0xafac, 0x40a8, 0x1c68, 0x4184, 0x1420, 0xb2d5, 0xbf34, 0x433a, 0xb24b, 0x45e4, 0x0183, 0xb22d, 0xb091, 0xb2cf, 0x4038, 0x41a3, 0xbf60, 0x40ef, 0x4360, 0x45c4, 0xb080, 0x339d, 0xba16, 0x4115, 0xbf96, 0x406e, 0xaf42, 0xb28f, 0x413d, 0xbfbb, 0x4146, 0xb038, 0x4285, 0x216e, 0xb264, 0x431e, 0x42b9, 0x2f56, 0x0e0c, 0x4217, 0xa12d, 0xac5c, 0x4328, 0x40a2, 0x1a29, 0xb0e9, 0x442f, 0x41bc, 0x37c6, 0xb0cc, 0x18ce, 0xb042, 0x1b4e, 0xbf90, 0xbf9d, 0x419f, 0x414f, 0x1eb1, 0x1f9e, 0x4294, 0xa197, 0x1896, 0xbaf5, 0x4272, 0x45c8, 0x0da9, 0x424c, 0x2c62, 0x4022, 0x1bfa, 0x4091, 0x0417, 0xb099, 0xba6b, 0x40c9, 0x1d35, 0x43c1, 0xb0e2, 0x443b, 0x4137, 0x0c33, 0x418c, 0xbf7e, 0x4196, 0xba14, 0x4585, 0xbfca, 0x41f0, 0x3bb0, 0xb044, 0xb2e7, 0x2b49, 0x4428, 0xbfca, 0xb092, 0x4051, 0x4201, 0x1a8d, 0xbf90, 0xba5c, 0xb0bf, 0x4151, 0x19c8, 0xb293, 0x437a, 0xb2a9, 0xbace, 0xbf71, 0x40da, 0xb24e, 0x0bb8, 0x1879, 0xba3b, 0x402b, 0x1e0d, 0xbad2, 0xb204, 0xba07, 0x3165, 0xb08b, 0x3c16, 0x1e6d, 0x40f9, 0x1379, 0x17f9, 0xaf70, 0x4287, 0xbf2b, 0xbaf2, 0xba11, 0x41e7, 0x0360, 0xb237, 0x43d9, 0x1db8, 0xba48, 0xba5d, 0xbac7, 0xbfdd, 0x0be8, 0x1c5b, 0x20b0, 0x4099, 0x3a34, 0x4254, 0xb236, 0x419a, 0x1b31, 0xbf2d, 0x42a2, 0x4271, 0xbad5, 0xb254, 0x1bb2, 0x43b2, 0xb2b2, 0xbae9, 0xb22b, 0xa066, 0xba09, 0x4028, 0x400a, 0xb212, 0x42a3, 0x4047, 0xbf4a, 0x2bc0, 0xa346, 0x40a3, 0x42ee, 0x138f, 0x1b40, 0xba12, 0x1b0e, 0xa916, 0xb241, 0x400b, 0xbfdb, 0xba28, 0x41a1, 0x4390, 0x3d2b, 0x443e, 0x4673, 0x1d4d, 0x4120, 0x4269, 0x419d, 0x46f2, 0x4682, 0x41c5, 0xb2d2, 0xb234, 0x4036, 0xbf7e, 0xba39, 0xb2e8, 0x466f, 0x441e, 0x1b36, 0x3f5d, 0xba69, 0x20de, 0x1fdf, 0x18d0, 0x095f, 0x416b, 0x437d, 0x4331, 0x40de, 0x0e6a, 0x353b, 0x13c7, 0x4221, 0x437c, 0x1f97, 0x3a6d, 0x435d, 0x42cc, 0x43c4, 0x310b, 0x428c, 0x2383, 0xbfc7, 0xb0c1, 0x1fd1, 0xa1ce, 0x41d6, 0x45a6, 0xb275, 0x4257, 0xb2b3, 0x43ab, 0x4278, 0x1ecd, 0x359e, 0xb2e9, 0xba0c, 0xbad3, 0x1dc2, 0x419e, 0x424a, 0x41aa, 0xb2c1, 0x44e5, 0x40f0, 0x1778, 0x4088, 0xbfd6, 0x4246, 0x4197, 0x1c5c, 0x1b2e, 0xb28b, 0x0f3d, 0x1e81, 0x4122, 0x2e73, 0x1db5, 0x42fa, 0x1d43, 0x43f2, 0xba18, 0x0068, 0x42ff, 0x0dd0, 0x4247, 0x45ce, 0xb2ba, 0xa73d, 0x428f, 0x4329, 0xb225, 0xbf62, 0xba24, 0x43a0, 0x204c, 0x1466, 0xb2dc, 0x3f46, 0x42a7, 0x43a4, 0xba61, 0xb0f1, 0x40bb, 0x40c9, 0x4192, 0x4113, 0x1d47, 0x448d, 0xaa2a, 0xbaf6, 0xb2db, 0x4294, 0x4206, 0x0429, 0xb2b2, 0x41ee, 0x4081, 0x44b3, 0xbfd1, 0xbadd, 0x424e, 0x2a0e, 0x334e, 0x41f0, 0x1b77, 0xbae8, 0x4067, 0x42eb, 0x00b1, 0x423e, 0x4073, 0x4106, 0x40a9, 0x416b, 0x128f, 0x0281, 0xba3c, 0xbac5, 0x0c2f, 0xb012, 0x1c56, 0x40a6, 0x4096, 0x40e4, 0x42b5, 0xb090, 0x42ea, 0xbf49, 0x4287, 0x4051, 0x43d7, 0xba1d, 0x41dc, 0x4161, 0x2296, 0x4251, 0x4166, 0x43ad, 0xba47, 0x1b9f, 0xb026, 0xb2d0, 0xb2ec, 0x420d, 0x4355, 0x434c, 0xb08f, 0xb252, 0x1b04, 0xa364, 0xbafc, 0x19a4, 0x3c98, 0xbf9f, 0x41c0, 0x34d7, 0x456e, 0x42d5, 0xb264, 0x43df, 0x4542, 0xba15, 0x40de, 0x42d1, 0x1a20, 0xbf2f, 0x4103, 0xacdc, 0x40cc, 0xb099, 0x43eb, 0x43df, 0x317c, 0xba70, 0x1e2c, 0xbf84, 0x4158, 0x1c12, 0x40cb, 0x46d1, 0x408a, 0x037c, 0xb071, 0x4347, 0x4320, 0x25fa, 0x4078, 0xb25d, 0x1e50, 0xa645, 0x2831, 0xbf51, 0x4092, 0x19b4, 0xa3f1, 0xbada, 0x4036, 0x42a7, 0x09ac, 0x1f55, 0xb247, 0x2753, 0x426b, 0x40a5, 0x4223, 0x40f3, 0xbfae, 0x292e, 0x1f9b, 0x46cc, 0x181d, 0x40ca, 0x413f, 0x0b7e, 0x423a, 0xb264, 0x43b4, 0x214a, 0xad2e, 0x215a, 0xba7f, 0x409b, 0x4568, 0xaf04, 0x2c49, 0xa536, 0x425e, 0x42fe, 0xa0ba, 0x4107, 0xbf77, 0xb019, 0x1640, 0x4336, 0x2631, 0x4770, 0xe7fe + ], + StartRegs = [0x7f732ac7, 0xd652158c, 0xc810dc10, 0x451cfb90, 0x698e290f, 0x67d2fe9c, 0xfa98fc70, 0xc792f08a, 0x938d63b5, 0xf0a64fe6, 0xd6444518, 0x197a89a8, 0x8b76fcf7, 0x660046dd, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x00001ab4, 0x0000005a, 0x00000000, 0x00000000, 0x00000000, 0x0000189c, 0x00000031, 0xffffffff, 0x000000ac, 0x00000000, 0x00000000, 0x197a89a7, 0x00000000, 0x8b76fcc7, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x4143, 0x4476, 0x3a03, 0x419e, 0x43b2, 0x0275, 0x1d6f, 0x4247, 0x28b0, 0x412b, 0x405c, 0x4317, 0xb2f8, 0xb0d0, 0x4669, 0xbf17, 0xb2cf, 0x2c9b, 0x0e98, 0xba5c, 0x4230, 0x2d3b, 0x28af, 0x46bd, 0x423d, 0x429e, 0xbae4, 0x4683, 0xba7e, 0x4359, 0xb0cb, 0xbfcd, 0x0cd3, 0xa0ac, 0x41a5, 0x1bcb, 0xba6f, 0x44f1, 0x4058, 0x0d71, 0x46cb, 0xbfb0, 0x4310, 0x0701, 0x4026, 0x4320, 0xb2fe, 0x4317, 0xb28d, 0xb269, 0xb2d7, 0x43f5, 0xbaed, 0x40d1, 0x42cd, 0xbfdc, 0x075b, 0x4183, 0x12da, 0x4646, 0xb258, 0x2fa1, 0xba16, 0xba7f, 0xb2f9, 0xa1b7, 0x4198, 0x3436, 0x428a, 0x41da, 0x0f61, 0x43c0, 0xb2a7, 0xba6e, 0xb210, 0x1820, 0x1923, 0xb278, 0x4136, 0x2035, 0x429e, 0xb2c2, 0xbf77, 0xb260, 0x4616, 0x1d26, 0x4176, 0x42fc, 0x43c9, 0xa2cf, 0x454d, 0x4342, 0x2e4c, 0xbf16, 0xb09b, 0xbaea, 0x438f, 0xbf65, 0xb0a5, 0xa6ba, 0x1f3d, 0x415f, 0xb296, 0x4113, 0x03e8, 0x2fa2, 0x19e9, 0x2348, 0x44e3, 0xb0d0, 0x43b4, 0x28e6, 0x1b96, 0x41d4, 0x0f21, 0x439d, 0xb07b, 0xbf74, 0x3b03, 0xba3f, 0x1942, 0x459e, 0x194f, 0xb0a7, 0x174e, 0xbf92, 0xb00d, 0x3171, 0x1f1d, 0x436c, 0xbf86, 0x15ba, 0x3e2f, 0x1711, 0x4351, 0x2b18, 0x418b, 0x0a50, 0x40a0, 0xba20, 0x4154, 0x4174, 0x1d34, 0x3da5, 0x41f4, 0x403a, 0x4201, 0xba51, 0x33d0, 0x1823, 0xb0b7, 0x4396, 0x40c1, 0xbf96, 0xb212, 0x23d4, 0xa987, 0x4344, 0x3df9, 0x32bf, 0x4082, 0xb297, 0x4174, 0xac14, 0x4297, 0xb2e2, 0xb2e8, 0xbfaa, 0x429e, 0xb0b8, 0x465f, 0xba46, 0x433d, 0xa49c, 0x432d, 0x3e9f, 0x1e23, 0xb2a2, 0xa5aa, 0xb0cf, 0xba2f, 0x41f9, 0xbfce, 0x41a6, 0x41af, 0x29a7, 0xbf59, 0xb004, 0x4003, 0xbf00, 0x3449, 0x40b1, 0x116e, 0xb027, 0xb25c, 0xabd8, 0x1bad, 0x0806, 0x0827, 0x46e1, 0x41b0, 0x419d, 0x1e88, 0xb213, 0xbad2, 0x341a, 0xafb2, 0x4416, 0x429e, 0x2857, 0x40a7, 0xba0c, 0x4205, 0x0eeb, 0x43b9, 0xbf2d, 0x41e5, 0x1a16, 0x45a0, 0x423c, 0xb00d, 0x1f94, 0xbae0, 0xbf1b, 0x42d0, 0xb071, 0x4345, 0x4340, 0x41ab, 0xb067, 0x3432, 0xbf1d, 0xb2ef, 0xb061, 0xba7f, 0x3047, 0xa46e, 0x429e, 0xbaf6, 0x41b3, 0x45ec, 0xb20a, 0xb2d5, 0x4360, 0x2af9, 0xb061, 0x2ed2, 0x1329, 0x1c60, 0x4151, 0x1351, 0x465d, 0x40f1, 0x4388, 0x408b, 0xba1e, 0xbfd0, 0xbfb6, 0x4132, 0x074b, 0x18de, 0x420a, 0x43ec, 0xb2e0, 0x4319, 0x41a9, 0xb0e2, 0x4190, 0x400d, 0x4159, 0xba5f, 0xa852, 0x4346, 0xb0b5, 0xbf44, 0xa4e4, 0x1b56, 0x1a5d, 0xba77, 0xbae3, 0xb2be, 0x405a, 0x41e3, 0x3cc6, 0x1ebf, 0x19c2, 0x41ed, 0x4498, 0x1c91, 0x3ae6, 0x42b5, 0xb2e3, 0x18f6, 0xaa8b, 0x45d8, 0x414a, 0xbf6a, 0x4172, 0x4017, 0x1a6f, 0x45d8, 0xa35e, 0x4259, 0xba00, 0x1ede, 0x4125, 0xba04, 0xb2bc, 0x419b, 0x18ef, 0xb20b, 0x18bc, 0x449a, 0xbad5, 0x40b3, 0x42d1, 0x2138, 0x1f04, 0xb266, 0x410f, 0xb04f, 0xba03, 0xbf44, 0x1a63, 0xb276, 0xb2ff, 0x408e, 0x2b75, 0x468d, 0x402e, 0x4265, 0x1e0a, 0x1e17, 0xba0d, 0x0383, 0x44d5, 0x1333, 0x1bf7, 0x408e, 0x0079, 0x4227, 0x43ba, 0x41f2, 0xa9a9, 0x4072, 0x42ca, 0x124f, 0xba40, 0xba14, 0x4146, 0xbf03, 0x426f, 0xba4f, 0xba49, 0xb28b, 0x4368, 0xbf47, 0x4315, 0x3f70, 0x43ed, 0x310d, 0xb013, 0xbacc, 0xbfc0, 0xbf90, 0x4272, 0xbf85, 0xb06d, 0x4162, 0x4155, 0x1d1a, 0xa425, 0x08d3, 0x1f77, 0xb0a4, 0x1e2b, 0xbf00, 0x40f9, 0x2f9d, 0x3eea, 0xb035, 0x42a1, 0xbaf2, 0x2410, 0xa6e0, 0xbf6f, 0x4335, 0x4319, 0x43bc, 0x1f9b, 0x41e0, 0x1b46, 0xbfe0, 0x4297, 0x4177, 0x19ef, 0x42bb, 0x4075, 0x40d4, 0x42cb, 0x1db4, 0xb251, 0x400a, 0xbfa3, 0x441c, 0xb2ce, 0x4187, 0x4365, 0xba30, 0x43a9, 0x42b6, 0x4330, 0x41eb, 0x1341, 0xb016, 0xba5b, 0x4208, 0xbff0, 0x42ba, 0x4001, 0x42b4, 0xb243, 0xb2bd, 0x1cca, 0x420a, 0xa277, 0x4129, 0x40c6, 0x187b, 0x3b6a, 0xbfc9, 0x4083, 0xb2a0, 0x07bb, 0x413d, 0x4116, 0xae4f, 0xb097, 0x39d7, 0xba11, 0x43d3, 0x42b9, 0x2daf, 0x43cd, 0xb21e, 0x4185, 0x4203, 0xba2e, 0xb21a, 0x4095, 0xbf2d, 0x4230, 0x42c8, 0x4277, 0x1e62, 0x19ae, 0x4309, 0xba43, 0xba09, 0x415b, 0x40b8, 0x4271, 0xaf78, 0xb298, 0x434f, 0x2fe1, 0x414a, 0x43b1, 0xbf72, 0x4043, 0xbff0, 0x0c11, 0x4161, 0x40e6, 0x191d, 0xb222, 0xa0d6, 0x4247, 0x2b58, 0x1941, 0x4157, 0x4223, 0xac08, 0xb0a0, 0x1aa4, 0x42fa, 0x18bb, 0x4080, 0x1a11, 0xb26c, 0x3e43, 0x4089, 0x41ac, 0xba1c, 0x4326, 0x42b3, 0xbf9c, 0x21eb, 0xba4a, 0xbf3e, 0x0c75, 0x2d1e, 0x43a7, 0xb200, 0x4005, 0x42a7, 0x1848, 0xb2db, 0x05fb, 0xbae2, 0xbf65, 0x407e, 0xb2f1, 0x418a, 0x43db, 0xb2a6, 0x4244, 0xbf2a, 0xa9d3, 0x0194, 0x42dd, 0x25d1, 0xb2d1, 0x41f3, 0x42da, 0x3808, 0x412a, 0xb287, 0x44d3, 0x1977, 0x41c2, 0x1091, 0xbf28, 0xbae4, 0x4144, 0xba62, 0x4643, 0x40f8, 0x4194, 0x1bec, 0x407a, 0xb0f3, 0xb234, 0xba45, 0xb0d3, 0xba4e, 0x404e, 0xbf76, 0xb2e2, 0xbaec, 0x4665, 0xaa4c, 0xb20e, 0xba08, 0xa8b3, 0xb072, 0x1b10, 0xbacb, 0xb064, 0x41ef, 0x44f2, 0xaaa2, 0x4362, 0x1eb0, 0xa948, 0x4236, 0x46c4, 0x1b32, 0x40f1, 0x2641, 0xab44, 0x4222, 0x42be, 0x1bc0, 0x4639, 0x4135, 0xbfe4, 0x434a, 0xba33, 0x1ee0, 0xb229, 0xb06d, 0x44e9, 0x04af, 0x40d1, 0x4456, 0x46e9, 0x4112, 0x18ce, 0x2066, 0xbfe8, 0x4240, 0xbaf0, 0xbfcf, 0x4691, 0x079d, 0x438f, 0x406e, 0x4075, 0x2821, 0xa06e, 0x4167, 0x4385, 0x3a13, 0xbac8, 0x45e4, 0x429d, 0x42b0, 0xb20b, 0xbfb1, 0xa2ee, 0x35d9, 0x1d65, 0x152c, 0xb04e, 0x0f48, 0x254e, 0x1ce5, 0x2e0f, 0x3304, 0xb0bf, 0xb2de, 0x1c11, 0x1e33, 0x1957, 0xbf60, 0x19b6, 0x400b, 0x401a, 0xbfd9, 0x4621, 0x19a6, 0x2a35, 0x26e2, 0xb294, 0x412b, 0x4165, 0x1b4f, 0xad1b, 0x2f76, 0x1a42, 0xbf65, 0x3406, 0xb20a, 0x43f5, 0xba32, 0x45db, 0x23fe, 0xbad4, 0x1ab0, 0x222a, 0xb22a, 0xb206, 0x43cd, 0x13e5, 0x1c19, 0x2ac8, 0x268a, 0x4319, 0x1c7b, 0x1f02, 0x45f3, 0xb25c, 0x400e, 0xa29c, 0xb041, 0xbfd2, 0x4261, 0xb0dc, 0xa298, 0x447b, 0xbfc3, 0x2c44, 0xba23, 0x41f3, 0x43a1, 0x41ec, 0x43ad, 0x41e2, 0x401d, 0xb096, 0x40dd, 0x3336, 0x415c, 0x4037, 0x42e5, 0x4323, 0xb257, 0xb2a7, 0x1cc7, 0xba28, 0x40de, 0x40dd, 0x4069, 0x1bda, 0x46e4, 0xbf4d, 0x010c, 0x1533, 0x41f8, 0x42c3, 0x41ff, 0x14cd, 0x4291, 0x1da6, 0x16e2, 0x3752, 0xafe8, 0x4192, 0x46c4, 0x4204, 0x40b8, 0x222c, 0x23e3, 0xaca3, 0xbf5c, 0x02c8, 0x4219, 0xb078, 0x205d, 0x4267, 0x41c0, 0xba36, 0x1c8d, 0x35be, 0xb2d4, 0xb2fe, 0x40e7, 0x404f, 0x43a1, 0x3017, 0x0f83, 0xb08b, 0x40ff, 0xbf68, 0x40f7, 0x2d84, 0x4072, 0xb2a9, 0x089e, 0x1c2f, 0x1ccf, 0x412c, 0xba2b, 0x1cda, 0x19d2, 0xb04a, 0xb053, 0x2419, 0x422f, 0x4269, 0x1997, 0x0701, 0x1326, 0x0e29, 0x4105, 0x425b, 0x4111, 0x4677, 0x4373, 0xbf6c, 0x1ad8, 0x4305, 0xba7c, 0x064b, 0x34a4, 0x4241, 0xb2b5, 0xbf0e, 0x4282, 0x187e, 0xbaf4, 0x460d, 0x417c, 0xba19, 0xbf90, 0x1e52, 0x42f2, 0x41c9, 0x23d2, 0xb221, 0xb2cc, 0x1f32, 0xba0d, 0x43b3, 0x408e, 0x4040, 0x43d5, 0xb05f, 0x40bb, 0x44f8, 0x179c, 0xa95e, 0x18de, 0xb229, 0x42ce, 0x4310, 0xbf45, 0x426a, 0xab45, 0x4339, 0x40a8, 0xabbe, 0x43d3, 0x3ba2, 0x1a98, 0x43f4, 0x4364, 0xaa92, 0x1878, 0xaf21, 0x4422, 0xa6c1, 0xa127, 0xba16, 0x4032, 0x1ed2, 0x4354, 0x46c2, 0x4275, 0x3beb, 0xb240, 0x4029, 0x417c, 0x41a4, 0x42c1, 0xbf5b, 0x411a, 0x4134, 0x3a11, 0x39e1, 0x2cc5, 0xb0f1, 0x35af, 0xb2b3, 0xb214, 0x4312, 0xbfc3, 0x4151, 0xb227, 0x4190, 0xa889, 0x402e, 0xaa1c, 0x4236, 0xbf72, 0x1ab4, 0x40f2, 0xab93, 0x33d2, 0xb26d, 0xa602, 0xb090, 0xb0af, 0x4333, 0xba5e, 0x4036, 0x411a, 0x3860, 0xb2dd, 0x4322, 0x41f9, 0xbff0, 0x031c, 0x4093, 0xb05a, 0x4284, 0x40fe, 0xb031, 0x31d3, 0xb060, 0xbf7f, 0xb02b, 0xb254, 0x42e4, 0xb247, 0xbf00, 0xb221, 0xb040, 0xb2e4, 0x40b1, 0x1dff, 0x400c, 0xba6e, 0x4457, 0x1e3f, 0xb2bf, 0x40de, 0xbfc3, 0x1e09, 0x42ed, 0xb2a3, 0xba5d, 0xbfe0, 0xba5f, 0xba77, 0x1976, 0x42c1, 0xb278, 0x46e5, 0x40b7, 0x4495, 0x43b4, 0xb00e, 0x40f8, 0x27fa, 0x4170, 0x422a, 0x411e, 0x1b39, 0x41e0, 0x447f, 0xbf94, 0xa87e, 0x41a6, 0x45f5, 0xb204, 0x43bb, 0xb270, 0xb0f6, 0xb0f3, 0x0fcf, 0x2554, 0xb202, 0x4009, 0x4056, 0x37e1, 0x1d32, 0x41e1, 0x1988, 0xba4e, 0x468b, 0x4186, 0x42d5, 0x42a4, 0xbf21, 0x3a5e, 0xbff0, 0x13c6, 0x2352, 0x1def, 0xb26e, 0x41ed, 0x429b, 0x4253, 0xb2d1, 0x4180, 0xbf6f, 0x427b, 0x0ff2, 0xa388, 0x42e5, 0xb2aa, 0x1c71, 0x429b, 0xb072, 0xb22d, 0xb211, 0xb066, 0x173e, 0x1d80, 0x4253, 0xa2d6, 0x4033, 0x404a, 0xb2a5, 0x413b, 0xbade, 0x417c, 0x40c2, 0xb257, 0x1fd5, 0x0bb8, 0x42aa, 0x1d98, 0x43e6, 0xbfba, 0x1e34, 0x020a, 0xb238, 0x3c80, 0x4023, 0x4000, 0x437c, 0xbf80, 0x15e7, 0x1366, 0x42d7, 0x44bd, 0xbf2b, 0x4274, 0x28cf, 0x4376, 0x46f5, 0x0319, 0x465b, 0x4087, 0x4106, 0x4135, 0x0ef5, 0xb2e9, 0xb07d, 0x415a, 0xba1f, 0x4368, 0x40af, 0x469c, 0x41bf, 0x2d0c, 0x4305, 0x4222, 0x41e3, 0xbf98, 0x4649, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xbb7d36f6, 0x99698622, 0x49d98852, 0x36cb9669, 0x824878bf, 0xc93e95e5, 0x63323f2d, 0xc8f7f318, 0x96c967ec, 0x5a2d76e7, 0x8dfbec30, 0x6fa00b5f, 0x2d920f82, 0x5d28d234, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00000000, 0x004003e8, 0xfa000000, 0x000022ea, 0x00000000, 0x00000000, 0xffffffff, 0x9681941b, 0x00000000, 0x9681941b, 0x000003e8, 0x000003e8, 0x000001f4, 0x00000000, 0xa00001d0 }, + Instructions = [0x4143, 0x4476, 0x3a03, 0x419e, 0x43b2, 0x0275, 0x1d6f, 0x4247, 0x28b0, 0x412b, 0x405c, 0x4317, 0xb2f8, 0xb0d0, 0x4669, 0xbf17, 0xb2cf, 0x2c9b, 0x0e98, 0xba5c, 0x4230, 0x2d3b, 0x28af, 0x46bd, 0x423d, 0x429e, 0xbae4, 0x4683, 0xba7e, 0x4359, 0xb0cb, 0xbfcd, 0x0cd3, 0xa0ac, 0x41a5, 0x1bcb, 0xba6f, 0x44f1, 0x4058, 0x0d71, 0x46cb, 0xbfb0, 0x4310, 0x0701, 0x4026, 0x4320, 0xb2fe, 0x4317, 0xb28d, 0xb269, 0xb2d7, 0x43f5, 0xbaed, 0x40d1, 0x42cd, 0xbfdc, 0x075b, 0x4183, 0x12da, 0x4646, 0xb258, 0x2fa1, 0xba16, 0xba7f, 0xb2f9, 0xa1b7, 0x4198, 0x3436, 0x428a, 0x41da, 0x0f61, 0x43c0, 0xb2a7, 0xba6e, 0xb210, 0x1820, 0x1923, 0xb278, 0x4136, 0x2035, 0x429e, 0xb2c2, 0xbf77, 0xb260, 0x4616, 0x1d26, 0x4176, 0x42fc, 0x43c9, 0xa2cf, 0x454d, 0x4342, 0x2e4c, 0xbf16, 0xb09b, 0xbaea, 0x438f, 0xbf65, 0xb0a5, 0xa6ba, 0x1f3d, 0x415f, 0xb296, 0x4113, 0x03e8, 0x2fa2, 0x19e9, 0x2348, 0x44e3, 0xb0d0, 0x43b4, 0x28e6, 0x1b96, 0x41d4, 0x0f21, 0x439d, 0xb07b, 0xbf74, 0x3b03, 0xba3f, 0x1942, 0x459e, 0x194f, 0xb0a7, 0x174e, 0xbf92, 0xb00d, 0x3171, 0x1f1d, 0x436c, 0xbf86, 0x15ba, 0x3e2f, 0x1711, 0x4351, 0x2b18, 0x418b, 0x0a50, 0x40a0, 0xba20, 0x4154, 0x4174, 0x1d34, 0x3da5, 0x41f4, 0x403a, 0x4201, 0xba51, 0x33d0, 0x1823, 0xb0b7, 0x4396, 0x40c1, 0xbf96, 0xb212, 0x23d4, 0xa987, 0x4344, 0x3df9, 0x32bf, 0x4082, 0xb297, 0x4174, 0xac14, 0x4297, 0xb2e2, 0xb2e8, 0xbfaa, 0x429e, 0xb0b8, 0x465f, 0xba46, 0x433d, 0xa49c, 0x432d, 0x3e9f, 0x1e23, 0xb2a2, 0xa5aa, 0xb0cf, 0xba2f, 0x41f9, 0xbfce, 0x41a6, 0x41af, 0x29a7, 0xbf59, 0xb004, 0x4003, 0xbf00, 0x3449, 0x40b1, 0x116e, 0xb027, 0xb25c, 0xabd8, 0x1bad, 0x0806, 0x0827, 0x46e1, 0x41b0, 0x419d, 0x1e88, 0xb213, 0xbad2, 0x341a, 0xafb2, 0x4416, 0x429e, 0x2857, 0x40a7, 0xba0c, 0x4205, 0x0eeb, 0x43b9, 0xbf2d, 0x41e5, 0x1a16, 0x45a0, 0x423c, 0xb00d, 0x1f94, 0xbae0, 0xbf1b, 0x42d0, 0xb071, 0x4345, 0x4340, 0x41ab, 0xb067, 0x3432, 0xbf1d, 0xb2ef, 0xb061, 0xba7f, 0x3047, 0xa46e, 0x429e, 0xbaf6, 0x41b3, 0x45ec, 0xb20a, 0xb2d5, 0x4360, 0x2af9, 0xb061, 0x2ed2, 0x1329, 0x1c60, 0x4151, 0x1351, 0x465d, 0x40f1, 0x4388, 0x408b, 0xba1e, 0xbfd0, 0xbfb6, 0x4132, 0x074b, 0x18de, 0x420a, 0x43ec, 0xb2e0, 0x4319, 0x41a9, 0xb0e2, 0x4190, 0x400d, 0x4159, 0xba5f, 0xa852, 0x4346, 0xb0b5, 0xbf44, 0xa4e4, 0x1b56, 0x1a5d, 0xba77, 0xbae3, 0xb2be, 0x405a, 0x41e3, 0x3cc6, 0x1ebf, 0x19c2, 0x41ed, 0x4498, 0x1c91, 0x3ae6, 0x42b5, 0xb2e3, 0x18f6, 0xaa8b, 0x45d8, 0x414a, 0xbf6a, 0x4172, 0x4017, 0x1a6f, 0x45d8, 0xa35e, 0x4259, 0xba00, 0x1ede, 0x4125, 0xba04, 0xb2bc, 0x419b, 0x18ef, 0xb20b, 0x18bc, 0x449a, 0xbad5, 0x40b3, 0x42d1, 0x2138, 0x1f04, 0xb266, 0x410f, 0xb04f, 0xba03, 0xbf44, 0x1a63, 0xb276, 0xb2ff, 0x408e, 0x2b75, 0x468d, 0x402e, 0x4265, 0x1e0a, 0x1e17, 0xba0d, 0x0383, 0x44d5, 0x1333, 0x1bf7, 0x408e, 0x0079, 0x4227, 0x43ba, 0x41f2, 0xa9a9, 0x4072, 0x42ca, 0x124f, 0xba40, 0xba14, 0x4146, 0xbf03, 0x426f, 0xba4f, 0xba49, 0xb28b, 0x4368, 0xbf47, 0x4315, 0x3f70, 0x43ed, 0x310d, 0xb013, 0xbacc, 0xbfc0, 0xbf90, 0x4272, 0xbf85, 0xb06d, 0x4162, 0x4155, 0x1d1a, 0xa425, 0x08d3, 0x1f77, 0xb0a4, 0x1e2b, 0xbf00, 0x40f9, 0x2f9d, 0x3eea, 0xb035, 0x42a1, 0xbaf2, 0x2410, 0xa6e0, 0xbf6f, 0x4335, 0x4319, 0x43bc, 0x1f9b, 0x41e0, 0x1b46, 0xbfe0, 0x4297, 0x4177, 0x19ef, 0x42bb, 0x4075, 0x40d4, 0x42cb, 0x1db4, 0xb251, 0x400a, 0xbfa3, 0x441c, 0xb2ce, 0x4187, 0x4365, 0xba30, 0x43a9, 0x42b6, 0x4330, 0x41eb, 0x1341, 0xb016, 0xba5b, 0x4208, 0xbff0, 0x42ba, 0x4001, 0x42b4, 0xb243, 0xb2bd, 0x1cca, 0x420a, 0xa277, 0x4129, 0x40c6, 0x187b, 0x3b6a, 0xbfc9, 0x4083, 0xb2a0, 0x07bb, 0x413d, 0x4116, 0xae4f, 0xb097, 0x39d7, 0xba11, 0x43d3, 0x42b9, 0x2daf, 0x43cd, 0xb21e, 0x4185, 0x4203, 0xba2e, 0xb21a, 0x4095, 0xbf2d, 0x4230, 0x42c8, 0x4277, 0x1e62, 0x19ae, 0x4309, 0xba43, 0xba09, 0x415b, 0x40b8, 0x4271, 0xaf78, 0xb298, 0x434f, 0x2fe1, 0x414a, 0x43b1, 0xbf72, 0x4043, 0xbff0, 0x0c11, 0x4161, 0x40e6, 0x191d, 0xb222, 0xa0d6, 0x4247, 0x2b58, 0x1941, 0x4157, 0x4223, 0xac08, 0xb0a0, 0x1aa4, 0x42fa, 0x18bb, 0x4080, 0x1a11, 0xb26c, 0x3e43, 0x4089, 0x41ac, 0xba1c, 0x4326, 0x42b3, 0xbf9c, 0x21eb, 0xba4a, 0xbf3e, 0x0c75, 0x2d1e, 0x43a7, 0xb200, 0x4005, 0x42a7, 0x1848, 0xb2db, 0x05fb, 0xbae2, 0xbf65, 0x407e, 0xb2f1, 0x418a, 0x43db, 0xb2a6, 0x4244, 0xbf2a, 0xa9d3, 0x0194, 0x42dd, 0x25d1, 0xb2d1, 0x41f3, 0x42da, 0x3808, 0x412a, 0xb287, 0x44d3, 0x1977, 0x41c2, 0x1091, 0xbf28, 0xbae4, 0x4144, 0xba62, 0x4643, 0x40f8, 0x4194, 0x1bec, 0x407a, 0xb0f3, 0xb234, 0xba45, 0xb0d3, 0xba4e, 0x404e, 0xbf76, 0xb2e2, 0xbaec, 0x4665, 0xaa4c, 0xb20e, 0xba08, 0xa8b3, 0xb072, 0x1b10, 0xbacb, 0xb064, 0x41ef, 0x44f2, 0xaaa2, 0x4362, 0x1eb0, 0xa948, 0x4236, 0x46c4, 0x1b32, 0x40f1, 0x2641, 0xab44, 0x4222, 0x42be, 0x1bc0, 0x4639, 0x4135, 0xbfe4, 0x434a, 0xba33, 0x1ee0, 0xb229, 0xb06d, 0x44e9, 0x04af, 0x40d1, 0x4456, 0x46e9, 0x4112, 0x18ce, 0x2066, 0xbfe8, 0x4240, 0xbaf0, 0xbfcf, 0x4691, 0x079d, 0x438f, 0x406e, 0x4075, 0x2821, 0xa06e, 0x4167, 0x4385, 0x3a13, 0xbac8, 0x45e4, 0x429d, 0x42b0, 0xb20b, 0xbfb1, 0xa2ee, 0x35d9, 0x1d65, 0x152c, 0xb04e, 0x0f48, 0x254e, 0x1ce5, 0x2e0f, 0x3304, 0xb0bf, 0xb2de, 0x1c11, 0x1e33, 0x1957, 0xbf60, 0x19b6, 0x400b, 0x401a, 0xbfd9, 0x4621, 0x19a6, 0x2a35, 0x26e2, 0xb294, 0x412b, 0x4165, 0x1b4f, 0xad1b, 0x2f76, 0x1a42, 0xbf65, 0x3406, 0xb20a, 0x43f5, 0xba32, 0x45db, 0x23fe, 0xbad4, 0x1ab0, 0x222a, 0xb22a, 0xb206, 0x43cd, 0x13e5, 0x1c19, 0x2ac8, 0x268a, 0x4319, 0x1c7b, 0x1f02, 0x45f3, 0xb25c, 0x400e, 0xa29c, 0xb041, 0xbfd2, 0x4261, 0xb0dc, 0xa298, 0x447b, 0xbfc3, 0x2c44, 0xba23, 0x41f3, 0x43a1, 0x41ec, 0x43ad, 0x41e2, 0x401d, 0xb096, 0x40dd, 0x3336, 0x415c, 0x4037, 0x42e5, 0x4323, 0xb257, 0xb2a7, 0x1cc7, 0xba28, 0x40de, 0x40dd, 0x4069, 0x1bda, 0x46e4, 0xbf4d, 0x010c, 0x1533, 0x41f8, 0x42c3, 0x41ff, 0x14cd, 0x4291, 0x1da6, 0x16e2, 0x3752, 0xafe8, 0x4192, 0x46c4, 0x4204, 0x40b8, 0x222c, 0x23e3, 0xaca3, 0xbf5c, 0x02c8, 0x4219, 0xb078, 0x205d, 0x4267, 0x41c0, 0xba36, 0x1c8d, 0x35be, 0xb2d4, 0xb2fe, 0x40e7, 0x404f, 0x43a1, 0x3017, 0x0f83, 0xb08b, 0x40ff, 0xbf68, 0x40f7, 0x2d84, 0x4072, 0xb2a9, 0x089e, 0x1c2f, 0x1ccf, 0x412c, 0xba2b, 0x1cda, 0x19d2, 0xb04a, 0xb053, 0x2419, 0x422f, 0x4269, 0x1997, 0x0701, 0x1326, 0x0e29, 0x4105, 0x425b, 0x4111, 0x4677, 0x4373, 0xbf6c, 0x1ad8, 0x4305, 0xba7c, 0x064b, 0x34a4, 0x4241, 0xb2b5, 0xbf0e, 0x4282, 0x187e, 0xbaf4, 0x460d, 0x417c, 0xba19, 0xbf90, 0x1e52, 0x42f2, 0x41c9, 0x23d2, 0xb221, 0xb2cc, 0x1f32, 0xba0d, 0x43b3, 0x408e, 0x4040, 0x43d5, 0xb05f, 0x40bb, 0x44f8, 0x179c, 0xa95e, 0x18de, 0xb229, 0x42ce, 0x4310, 0xbf45, 0x426a, 0xab45, 0x4339, 0x40a8, 0xabbe, 0x43d3, 0x3ba2, 0x1a98, 0x43f4, 0x4364, 0xaa92, 0x1878, 0xaf21, 0x4422, 0xa6c1, 0xa127, 0xba16, 0x4032, 0x1ed2, 0x4354, 0x46c2, 0x4275, 0x3beb, 0xb240, 0x4029, 0x417c, 0x41a4, 0x42c1, 0xbf5b, 0x411a, 0x4134, 0x3a11, 0x39e1, 0x2cc5, 0xb0f1, 0x35af, 0xb2b3, 0xb214, 0x4312, 0xbfc3, 0x4151, 0xb227, 0x4190, 0xa889, 0x402e, 0xaa1c, 0x4236, 0xbf72, 0x1ab4, 0x40f2, 0xab93, 0x33d2, 0xb26d, 0xa602, 0xb090, 0xb0af, 0x4333, 0xba5e, 0x4036, 0x411a, 0x3860, 0xb2dd, 0x4322, 0x41f9, 0xbff0, 0x031c, 0x4093, 0xb05a, 0x4284, 0x40fe, 0xb031, 0x31d3, 0xb060, 0xbf7f, 0xb02b, 0xb254, 0x42e4, 0xb247, 0xbf00, 0xb221, 0xb040, 0xb2e4, 0x40b1, 0x1dff, 0x400c, 0xba6e, 0x4457, 0x1e3f, 0xb2bf, 0x40de, 0xbfc3, 0x1e09, 0x42ed, 0xb2a3, 0xba5d, 0xbfe0, 0xba5f, 0xba77, 0x1976, 0x42c1, 0xb278, 0x46e5, 0x40b7, 0x4495, 0x43b4, 0xb00e, 0x40f8, 0x27fa, 0x4170, 0x422a, 0x411e, 0x1b39, 0x41e0, 0x447f, 0xbf94, 0xa87e, 0x41a6, 0x45f5, 0xb204, 0x43bb, 0xb270, 0xb0f6, 0xb0f3, 0x0fcf, 0x2554, 0xb202, 0x4009, 0x4056, 0x37e1, 0x1d32, 0x41e1, 0x1988, 0xba4e, 0x468b, 0x4186, 0x42d5, 0x42a4, 0xbf21, 0x3a5e, 0xbff0, 0x13c6, 0x2352, 0x1def, 0xb26e, 0x41ed, 0x429b, 0x4253, 0xb2d1, 0x4180, 0xbf6f, 0x427b, 0x0ff2, 0xa388, 0x42e5, 0xb2aa, 0x1c71, 0x429b, 0xb072, 0xb22d, 0xb211, 0xb066, 0x173e, 0x1d80, 0x4253, 0xa2d6, 0x4033, 0x404a, 0xb2a5, 0x413b, 0xbade, 0x417c, 0x40c2, 0xb257, 0x1fd5, 0x0bb8, 0x42aa, 0x1d98, 0x43e6, 0xbfba, 0x1e34, 0x020a, 0xb238, 0x3c80, 0x4023, 0x4000, 0x437c, 0xbf80, 0x15e7, 0x1366, 0x42d7, 0x44bd, 0xbf2b, 0x4274, 0x28cf, 0x4376, 0x46f5, 0x0319, 0x465b, 0x4087, 0x4106, 0x4135, 0x0ef5, 0xb2e9, 0xb07d, 0x415a, 0xba1f, 0x4368, 0x40af, 0x469c, 0x41bf, 0x2d0c, 0x4305, 0x4222, 0x41e3, 0xbf98, 0x4649, 0x4770, 0xe7fe + ], + StartRegs = [0xbb7d36f6, 0x99698622, 0x49d98852, 0x36cb9669, 0x824878bf, 0xc93e95e5, 0x63323f2d, 0xc8f7f318, 0x96c967ec, 0x5a2d76e7, 0x8dfbec30, 0x6fa00b5f, 0x2d920f82, 0x5d28d234, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x00000000, 0x00000000, 0x004003e8, 0xfa000000, 0x000022ea, 0x00000000, 0x00000000, 0xffffffff, 0x9681941b, 0x00000000, 0x9681941b, 0x000003e8, 0x000003e8, 0x000001f4, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x43de, 0x4327, 0xb263, 0xa931, 0x4228, 0xb061, 0xbac6, 0x434d, 0xa868, 0xbf90, 0xba1c, 0x43bf, 0xbf70, 0x4229, 0x42b0, 0x40f0, 0x32dd, 0xba5d, 0xbf85, 0x43a4, 0xb2af, 0xb2b1, 0x4021, 0x2d77, 0xa666, 0x4176, 0x4089, 0x426e, 0x41de, 0x4345, 0x400b, 0x4056, 0x1bee, 0x19d7, 0xa0e7, 0x40b1, 0x2328, 0xbf06, 0xa385, 0x465d, 0xb277, 0x4664, 0x1a4b, 0xbad8, 0x0428, 0x0685, 0x4028, 0x300a, 0x4349, 0xba0f, 0xb2e3, 0x4662, 0x40d7, 0x435e, 0x0b39, 0x421f, 0x4670, 0xb2d6, 0x17aa, 0x4652, 0x4688, 0x1d08, 0x0544, 0x1fd9, 0xbfb3, 0x4166, 0x40ef, 0xbff0, 0xb0c9, 0x047f, 0x4063, 0x1011, 0x1f38, 0x4475, 0x427b, 0x4149, 0xba6c, 0x428f, 0x43da, 0xb2c2, 0x1f1a, 0x40d0, 0x4283, 0x1b46, 0x2aad, 0xb26d, 0x42b6, 0xa275, 0xba02, 0x40bf, 0x047c, 0xb2de, 0xbf60, 0x41a9, 0xbf28, 0x43ae, 0xba2b, 0x1dbc, 0x0735, 0x4234, 0x408b, 0xba25, 0x1086, 0x420d, 0xb074, 0xb290, 0x41e9, 0x410d, 0x4256, 0x42a2, 0x40bd, 0xabce, 0x4380, 0x4015, 0x4169, 0x405d, 0x3fbd, 0xb253, 0x433a, 0xbfd7, 0x41b2, 0x15be, 0x188a, 0x0fc1, 0x2952, 0x35a4, 0x40f1, 0x2a4c, 0xbfbd, 0xb2e4, 0xb23a, 0x1f28, 0x4630, 0x388c, 0x4147, 0x40f0, 0x4567, 0xbac7, 0xbfa0, 0x436c, 0x3e60, 0xb2d1, 0xb0e4, 0xb26a, 0x1830, 0xba33, 0xb26f, 0x2b61, 0x400b, 0x4346, 0xb069, 0x4039, 0x0aaa, 0xba75, 0x43d5, 0x417b, 0x42ec, 0xae57, 0xbf6e, 0x41cf, 0x3075, 0xb29b, 0x15ef, 0x1b99, 0x435d, 0xb215, 0x42fd, 0x4234, 0x2e88, 0xba7d, 0xbade, 0xba31, 0xbad9, 0xa2a3, 0x42f1, 0x1bb3, 0xbafa, 0xa940, 0x40a6, 0x3689, 0xb2ba, 0xbfaf, 0x4052, 0x1a92, 0xb2be, 0x462e, 0x41d1, 0x4145, 0x1619, 0x46c2, 0x3167, 0x409e, 0xba38, 0xb20f, 0xbacc, 0xb238, 0x4297, 0xbfa1, 0xbaf4, 0x38a8, 0xb293, 0xa847, 0x4138, 0x4175, 0x40fa, 0x259a, 0x4244, 0x4029, 0x3497, 0x15f3, 0xb07c, 0xbacb, 0x433f, 0x42e5, 0x3baf, 0x4029, 0x1aab, 0x20de, 0xa582, 0xbf87, 0xb2ff, 0x4098, 0xbace, 0x415c, 0x40cf, 0xb272, 0xbfdf, 0x40e0, 0x42dd, 0x4122, 0x41ba, 0xb2e2, 0x2632, 0x4153, 0xbf7d, 0x3131, 0x3b4d, 0x43ba, 0x41ab, 0x3b6c, 0xb2b3, 0x31e5, 0xba05, 0xb268, 0x1431, 0xba04, 0x4556, 0x43ab, 0x421c, 0xb2a4, 0xb23c, 0x410e, 0x42c9, 0x4063, 0x1da5, 0x402f, 0xb288, 0x0b26, 0x0570, 0xb03b, 0x4260, 0x4096, 0xbf8e, 0x10ad, 0x3f3a, 0x418e, 0x0b8b, 0x2f4f, 0x405a, 0xb00a, 0xb07e, 0x04ce, 0x41fa, 0x4271, 0x30c8, 0x40e5, 0x43f5, 0x3887, 0xa453, 0x4608, 0xbf71, 0x0220, 0x4540, 0x4188, 0xbff0, 0x434c, 0x3c0b, 0x41eb, 0x2d26, 0x4675, 0x4149, 0x4614, 0xb238, 0x308c, 0x4005, 0xbf5f, 0x4041, 0x0a0d, 0xb258, 0x43f4, 0x4316, 0x4170, 0xb2dc, 0xbfb6, 0x2875, 0xb052, 0x40dd, 0xbfb4, 0x4208, 0xba45, 0x409b, 0x4385, 0xa8f3, 0xb213, 0x42cb, 0x3f92, 0x3ae4, 0xb2f3, 0x3366, 0xb236, 0x4399, 0x400d, 0x4128, 0x4419, 0x34de, 0xa079, 0x43d7, 0xbaf8, 0x4277, 0x0594, 0x42fd, 0x4413, 0x43fe, 0xbf78, 0xb29b, 0x41ee, 0x185b, 0x19f6, 0xba51, 0x4012, 0x44d8, 0x05fc, 0xa2ea, 0xb2f6, 0x415a, 0xb2a7, 0x310d, 0x19e3, 0x408f, 0x19c7, 0xa5d4, 0xb05a, 0x1485, 0x4162, 0x41f0, 0x4200, 0x402a, 0xbf49, 0x0fdf, 0x185a, 0x1e02, 0xb2ab, 0xba13, 0xbaca, 0x46ed, 0x1e91, 0x42f5, 0xbf77, 0x459b, 0x42ae, 0x40eb, 0x19c3, 0x4213, 0x2acb, 0x1080, 0x41c1, 0x42fb, 0xb211, 0xab6c, 0x309e, 0xba6e, 0xb03e, 0x43fa, 0x42c5, 0xa06c, 0x1777, 0x3986, 0xbf51, 0x40d2, 0x4691, 0x22f9, 0x43fe, 0x40c2, 0x4215, 0xb028, 0x43a4, 0x42ae, 0xb2bd, 0x429e, 0x433d, 0x42e7, 0x42f5, 0xa94c, 0xbfaa, 0x34b2, 0xba3d, 0x424d, 0x4291, 0x4120, 0x1bb9, 0x43c2, 0x1ff7, 0x40fa, 0x342f, 0x43fe, 0x42bf, 0x433e, 0xbfb5, 0x4076, 0x3aaa, 0x4158, 0xb2bf, 0x40d7, 0x4068, 0xbf6f, 0xb036, 0x40ed, 0xbaec, 0x18fe, 0x00f2, 0xbadd, 0x439b, 0xa23d, 0x42a5, 0x411a, 0x41d8, 0x16cf, 0xba28, 0xbfe2, 0xba20, 0x43cf, 0xb2ae, 0xb2bc, 0xb2f7, 0x448c, 0x43dc, 0x43ae, 0xb2a8, 0xa5a6, 0x4216, 0x4295, 0x344b, 0x1da4, 0x4273, 0x408f, 0xb21d, 0xa9a9, 0x43db, 0x42b0, 0xbf5a, 0x4640, 0xb20a, 0xa7bb, 0x417c, 0xb26b, 0xbfd7, 0x1e2c, 0x4250, 0xb053, 0x4071, 0x424f, 0xb0d4, 0x4373, 0x429a, 0xba12, 0x4078, 0xba4e, 0x2762, 0xa5a4, 0xb200, 0x44b3, 0x2257, 0x0339, 0x42b5, 0x1a8f, 0x45b2, 0x4033, 0xbaed, 0x1f10, 0x1b45, 0xbae3, 0x3bae, 0x40d9, 0x03ff, 0x4175, 0xbf45, 0x32f9, 0x4053, 0x3ad1, 0x27bf, 0x40c4, 0xbf60, 0x40d2, 0x4202, 0x41f2, 0xb2be, 0x4341, 0xb25c, 0x1b18, 0x40bd, 0xb089, 0xbae2, 0xbf5f, 0x4403, 0x4607, 0xa684, 0xa2f3, 0x40ae, 0xba3b, 0x4358, 0x422c, 0x4167, 0x40a7, 0x4215, 0x4440, 0xb219, 0xbfd0, 0x40d5, 0x4038, 0xb2ca, 0x42e9, 0x43af, 0x42cb, 0x413c, 0x4158, 0x44a3, 0x422f, 0xbadf, 0xb279, 0xb286, 0x1f1e, 0xbf09, 0x4319, 0xba13, 0xba31, 0xa86a, 0x4367, 0xbf00, 0xb0d8, 0x423f, 0x413a, 0x44d5, 0xbac4, 0xad13, 0x4093, 0x4149, 0x41fb, 0x422b, 0x1e34, 0x3f5e, 0xb246, 0x41b8, 0xbf70, 0x435d, 0xbfdd, 0x01b2, 0x420b, 0xbfc0, 0x464f, 0xb034, 0x1c2d, 0x1a10, 0xbfd5, 0xa298, 0x412d, 0x41a3, 0x42de, 0x42b2, 0xba1e, 0xb298, 0x4170, 0x1827, 0x4093, 0xb015, 0xba4a, 0x2cf0, 0xb2d9, 0xb067, 0x0c34, 0x35ed, 0x3b0a, 0x085a, 0x46ab, 0x158d, 0x3889, 0x42ab, 0x1c3a, 0xbfc6, 0x372b, 0x17bc, 0x3899, 0x4611, 0x1a8a, 0xbf5d, 0x44d8, 0xb042, 0x1ab4, 0xb0ac, 0x438a, 0x41af, 0xba06, 0xb25e, 0x164a, 0x4067, 0xb01c, 0x43eb, 0xbf2e, 0x1b94, 0xba3c, 0x1494, 0xbf77, 0x41da, 0x09e3, 0xbadc, 0xa22f, 0x3fcc, 0x1f3d, 0xba4a, 0x400a, 0x432e, 0xb289, 0x1b35, 0xb07e, 0x3cc2, 0x428c, 0x2025, 0xafee, 0x251a, 0xbfb3, 0x44cb, 0x45a8, 0xb294, 0x4328, 0xb08c, 0xb0b4, 0xba26, 0x4097, 0xaa3d, 0x40a6, 0x434b, 0x4560, 0x4660, 0x1f5f, 0x0839, 0x42f0, 0xb2b9, 0x465b, 0x41b9, 0x194f, 0x405a, 0x400d, 0xa719, 0x2c50, 0x1e4e, 0xb242, 0xba30, 0x42ae, 0xb24f, 0xbf43, 0x4681, 0x1a48, 0x1d26, 0xb0fd, 0x4004, 0x423e, 0xa9f0, 0xba40, 0xbaff, 0x43e1, 0xa99b, 0x4432, 0x41f4, 0xbf26, 0x0a13, 0x1821, 0x2ba4, 0x44b9, 0xba22, 0x322b, 0x1c9a, 0x432c, 0xba70, 0xb234, 0x3ca7, 0x4547, 0x4078, 0x4144, 0x40ec, 0xad9a, 0x04d0, 0x4327, 0x37e6, 0x09ea, 0x3f50, 0x1526, 0x407d, 0x1835, 0x4402, 0x1e38, 0x0896, 0xbf04, 0x1909, 0xb2db, 0xb297, 0xb2a2, 0x012d, 0x389d, 0x0b0f, 0x0c37, 0xb0af, 0x4460, 0x4057, 0x44cb, 0x41c7, 0xbaef, 0x429c, 0xaf1a, 0x46dd, 0x4305, 0xb00e, 0x4071, 0x1817, 0xbf34, 0x4349, 0x01c4, 0xb0f7, 0xb209, 0xbfc0, 0x4362, 0xa7c2, 0x43bc, 0x45cd, 0x2edb, 0xb28f, 0xbf53, 0x4102, 0x44cc, 0x431a, 0x1c7c, 0xb207, 0x445e, 0x432c, 0xb099, 0x1de3, 0x46b2, 0x2163, 0x429a, 0x4108, 0x1361, 0xb09d, 0xbac4, 0xb285, 0x0eaa, 0xbf65, 0x437f, 0x41b1, 0x4197, 0x1ff3, 0x2b09, 0x403b, 0x41b8, 0xb231, 0x42c8, 0x42cf, 0x43e6, 0x0f35, 0x1989, 0x1ff2, 0x41c6, 0xbfd0, 0x1e9b, 0x434a, 0x42e3, 0xa90c, 0x40a4, 0x4208, 0x4200, 0xbf8a, 0x1b32, 0x410f, 0x2ee4, 0x33ed, 0xb240, 0xb0f4, 0x40c3, 0x4250, 0x2be7, 0xb019, 0xb2dd, 0xbfd7, 0xb0d4, 0xba08, 0xb2fb, 0x41b7, 0x1308, 0x4267, 0x41c0, 0xbfd0, 0x434c, 0xb06c, 0x4540, 0xb204, 0x1a34, 0x4140, 0xbad7, 0x1cc9, 0x3e9e, 0x390a, 0x40fa, 0x404e, 0xbfaa, 0x08cb, 0x4261, 0x4583, 0x339d, 0x1e37, 0x42fc, 0x437e, 0x435b, 0x3be3, 0x1891, 0xb222, 0x4245, 0x4130, 0x08b8, 0x447a, 0xb226, 0x034a, 0x4392, 0x4379, 0x40ec, 0xa38a, 0xba18, 0x42d9, 0x02f5, 0x4337, 0x41da, 0xbfc6, 0x4491, 0x4071, 0xb215, 0x1b51, 0x41dd, 0x41cd, 0x4223, 0x00af, 0xb2a7, 0x42e5, 0xb020, 0x43e6, 0xb27b, 0x439a, 0x4213, 0xbac3, 0x426a, 0x3d19, 0xa5b8, 0xb0f3, 0xbfc0, 0xba34, 0xba5e, 0xbfc6, 0x42f6, 0x103e, 0x45c1, 0x4482, 0x42ab, 0x2d50, 0x1f4e, 0x411b, 0x4316, 0xb01d, 0x45ee, 0x1db2, 0xb0a5, 0xbf6e, 0x0cf1, 0x1ac8, 0xba74, 0x43ca, 0xba28, 0xa979, 0x18a9, 0xbf01, 0xa761, 0x41fb, 0xb23a, 0x4242, 0x4358, 0x4163, 0xaabf, 0x13cb, 0xbf08, 0x189a, 0xb257, 0x43ee, 0x4085, 0x46f2, 0xb281, 0x45e3, 0x1a1f, 0xa8aa, 0x45e8, 0xba58, 0xb24c, 0x1e6b, 0xb252, 0x41b6, 0x43f7, 0xbf0c, 0xbad8, 0xb276, 0x43b7, 0x4205, 0x283f, 0x4208, 0x2afa, 0x46f1, 0x387c, 0x4269, 0x433a, 0x201c, 0x4072, 0x45bb, 0xbf55, 0x27d4, 0xb0b8, 0x4049, 0x426f, 0x400d, 0x4031, 0x41da, 0x41f1, 0x42c2, 0x4336, 0x432c, 0x4187, 0x445d, 0x423d, 0xb0cc, 0x408d, 0x43d5, 0x401b, 0x4397, 0xb26d, 0xba34, 0x41e3, 0x4326, 0x4355, 0xb01e, 0xbad7, 0xbfdd, 0xba3c, 0xba46, 0xba70, 0xa0a6, 0x1e83, 0x41cd, 0x41f0, 0x4256, 0xbf00, 0xb2df, 0x41c4, 0x45d3, 0xb2c6, 0xa98f, 0xbfde, 0x3ce1, 0x4263, 0x40b3, 0x45b6, 0x445f, 0xbf0b, 0x1d50, 0xb238, 0x2de2, 0x2b7f, 0xb0b8, 0x1629, 0x411b, 0xaeab, 0x4306, 0x2c95, 0x02e2, 0x4208, 0xba37, 0x25ef, 0xb08d, 0x4352, 0x2571, 0x425e, 0xba43, 0xb21d, 0xbfd2, 0x412b, 0x4644, 0x260f, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd8508733, 0x37686f1d, 0x97ff025a, 0x7e27c2d9, 0xe771ba18, 0xaba51d16, 0x78d8fc78, 0x633a3766, 0xf31e6a39, 0xaa1cca97, 0x3f7fc03c, 0x49e22f13, 0xd6f3fcdf, 0x6bb27080, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0xffffcb9d, 0x00000000, 0xe1000000, 0xffffffff, 0xffffff1e, 0xffff9dcb, 0xe0000000, 0xdfcfffff, 0x49e23000, 0x00000000, 0x00000000, 0xaa1ccb83, 0xd6f3fcdf, 0xaa1cc3e3, 0x00000000, 0x800001d0 }, + Instructions = [0x43de, 0x4327, 0xb263, 0xa931, 0x4228, 0xb061, 0xbac6, 0x434d, 0xa868, 0xbf90, 0xba1c, 0x43bf, 0xbf70, 0x4229, 0x42b0, 0x40f0, 0x32dd, 0xba5d, 0xbf85, 0x43a4, 0xb2af, 0xb2b1, 0x4021, 0x2d77, 0xa666, 0x4176, 0x4089, 0x426e, 0x41de, 0x4345, 0x400b, 0x4056, 0x1bee, 0x19d7, 0xa0e7, 0x40b1, 0x2328, 0xbf06, 0xa385, 0x465d, 0xb277, 0x4664, 0x1a4b, 0xbad8, 0x0428, 0x0685, 0x4028, 0x300a, 0x4349, 0xba0f, 0xb2e3, 0x4662, 0x40d7, 0x435e, 0x0b39, 0x421f, 0x4670, 0xb2d6, 0x17aa, 0x4652, 0x4688, 0x1d08, 0x0544, 0x1fd9, 0xbfb3, 0x4166, 0x40ef, 0xbff0, 0xb0c9, 0x047f, 0x4063, 0x1011, 0x1f38, 0x4475, 0x427b, 0x4149, 0xba6c, 0x428f, 0x43da, 0xb2c2, 0x1f1a, 0x40d0, 0x4283, 0x1b46, 0x2aad, 0xb26d, 0x42b6, 0xa275, 0xba02, 0x40bf, 0x047c, 0xb2de, 0xbf60, 0x41a9, 0xbf28, 0x43ae, 0xba2b, 0x1dbc, 0x0735, 0x4234, 0x408b, 0xba25, 0x1086, 0x420d, 0xb074, 0xb290, 0x41e9, 0x410d, 0x4256, 0x42a2, 0x40bd, 0xabce, 0x4380, 0x4015, 0x4169, 0x405d, 0x3fbd, 0xb253, 0x433a, 0xbfd7, 0x41b2, 0x15be, 0x188a, 0x0fc1, 0x2952, 0x35a4, 0x40f1, 0x2a4c, 0xbfbd, 0xb2e4, 0xb23a, 0x1f28, 0x4630, 0x388c, 0x4147, 0x40f0, 0x4567, 0xbac7, 0xbfa0, 0x436c, 0x3e60, 0xb2d1, 0xb0e4, 0xb26a, 0x1830, 0xba33, 0xb26f, 0x2b61, 0x400b, 0x4346, 0xb069, 0x4039, 0x0aaa, 0xba75, 0x43d5, 0x417b, 0x42ec, 0xae57, 0xbf6e, 0x41cf, 0x3075, 0xb29b, 0x15ef, 0x1b99, 0x435d, 0xb215, 0x42fd, 0x4234, 0x2e88, 0xba7d, 0xbade, 0xba31, 0xbad9, 0xa2a3, 0x42f1, 0x1bb3, 0xbafa, 0xa940, 0x40a6, 0x3689, 0xb2ba, 0xbfaf, 0x4052, 0x1a92, 0xb2be, 0x462e, 0x41d1, 0x4145, 0x1619, 0x46c2, 0x3167, 0x409e, 0xba38, 0xb20f, 0xbacc, 0xb238, 0x4297, 0xbfa1, 0xbaf4, 0x38a8, 0xb293, 0xa847, 0x4138, 0x4175, 0x40fa, 0x259a, 0x4244, 0x4029, 0x3497, 0x15f3, 0xb07c, 0xbacb, 0x433f, 0x42e5, 0x3baf, 0x4029, 0x1aab, 0x20de, 0xa582, 0xbf87, 0xb2ff, 0x4098, 0xbace, 0x415c, 0x40cf, 0xb272, 0xbfdf, 0x40e0, 0x42dd, 0x4122, 0x41ba, 0xb2e2, 0x2632, 0x4153, 0xbf7d, 0x3131, 0x3b4d, 0x43ba, 0x41ab, 0x3b6c, 0xb2b3, 0x31e5, 0xba05, 0xb268, 0x1431, 0xba04, 0x4556, 0x43ab, 0x421c, 0xb2a4, 0xb23c, 0x410e, 0x42c9, 0x4063, 0x1da5, 0x402f, 0xb288, 0x0b26, 0x0570, 0xb03b, 0x4260, 0x4096, 0xbf8e, 0x10ad, 0x3f3a, 0x418e, 0x0b8b, 0x2f4f, 0x405a, 0xb00a, 0xb07e, 0x04ce, 0x41fa, 0x4271, 0x30c8, 0x40e5, 0x43f5, 0x3887, 0xa453, 0x4608, 0xbf71, 0x0220, 0x4540, 0x4188, 0xbff0, 0x434c, 0x3c0b, 0x41eb, 0x2d26, 0x4675, 0x4149, 0x4614, 0xb238, 0x308c, 0x4005, 0xbf5f, 0x4041, 0x0a0d, 0xb258, 0x43f4, 0x4316, 0x4170, 0xb2dc, 0xbfb6, 0x2875, 0xb052, 0x40dd, 0xbfb4, 0x4208, 0xba45, 0x409b, 0x4385, 0xa8f3, 0xb213, 0x42cb, 0x3f92, 0x3ae4, 0xb2f3, 0x3366, 0xb236, 0x4399, 0x400d, 0x4128, 0x4419, 0x34de, 0xa079, 0x43d7, 0xbaf8, 0x4277, 0x0594, 0x42fd, 0x4413, 0x43fe, 0xbf78, 0xb29b, 0x41ee, 0x185b, 0x19f6, 0xba51, 0x4012, 0x44d8, 0x05fc, 0xa2ea, 0xb2f6, 0x415a, 0xb2a7, 0x310d, 0x19e3, 0x408f, 0x19c7, 0xa5d4, 0xb05a, 0x1485, 0x4162, 0x41f0, 0x4200, 0x402a, 0xbf49, 0x0fdf, 0x185a, 0x1e02, 0xb2ab, 0xba13, 0xbaca, 0x46ed, 0x1e91, 0x42f5, 0xbf77, 0x459b, 0x42ae, 0x40eb, 0x19c3, 0x4213, 0x2acb, 0x1080, 0x41c1, 0x42fb, 0xb211, 0xab6c, 0x309e, 0xba6e, 0xb03e, 0x43fa, 0x42c5, 0xa06c, 0x1777, 0x3986, 0xbf51, 0x40d2, 0x4691, 0x22f9, 0x43fe, 0x40c2, 0x4215, 0xb028, 0x43a4, 0x42ae, 0xb2bd, 0x429e, 0x433d, 0x42e7, 0x42f5, 0xa94c, 0xbfaa, 0x34b2, 0xba3d, 0x424d, 0x4291, 0x4120, 0x1bb9, 0x43c2, 0x1ff7, 0x40fa, 0x342f, 0x43fe, 0x42bf, 0x433e, 0xbfb5, 0x4076, 0x3aaa, 0x4158, 0xb2bf, 0x40d7, 0x4068, 0xbf6f, 0xb036, 0x40ed, 0xbaec, 0x18fe, 0x00f2, 0xbadd, 0x439b, 0xa23d, 0x42a5, 0x411a, 0x41d8, 0x16cf, 0xba28, 0xbfe2, 0xba20, 0x43cf, 0xb2ae, 0xb2bc, 0xb2f7, 0x448c, 0x43dc, 0x43ae, 0xb2a8, 0xa5a6, 0x4216, 0x4295, 0x344b, 0x1da4, 0x4273, 0x408f, 0xb21d, 0xa9a9, 0x43db, 0x42b0, 0xbf5a, 0x4640, 0xb20a, 0xa7bb, 0x417c, 0xb26b, 0xbfd7, 0x1e2c, 0x4250, 0xb053, 0x4071, 0x424f, 0xb0d4, 0x4373, 0x429a, 0xba12, 0x4078, 0xba4e, 0x2762, 0xa5a4, 0xb200, 0x44b3, 0x2257, 0x0339, 0x42b5, 0x1a8f, 0x45b2, 0x4033, 0xbaed, 0x1f10, 0x1b45, 0xbae3, 0x3bae, 0x40d9, 0x03ff, 0x4175, 0xbf45, 0x32f9, 0x4053, 0x3ad1, 0x27bf, 0x40c4, 0xbf60, 0x40d2, 0x4202, 0x41f2, 0xb2be, 0x4341, 0xb25c, 0x1b18, 0x40bd, 0xb089, 0xbae2, 0xbf5f, 0x4403, 0x4607, 0xa684, 0xa2f3, 0x40ae, 0xba3b, 0x4358, 0x422c, 0x4167, 0x40a7, 0x4215, 0x4440, 0xb219, 0xbfd0, 0x40d5, 0x4038, 0xb2ca, 0x42e9, 0x43af, 0x42cb, 0x413c, 0x4158, 0x44a3, 0x422f, 0xbadf, 0xb279, 0xb286, 0x1f1e, 0xbf09, 0x4319, 0xba13, 0xba31, 0xa86a, 0x4367, 0xbf00, 0xb0d8, 0x423f, 0x413a, 0x44d5, 0xbac4, 0xad13, 0x4093, 0x4149, 0x41fb, 0x422b, 0x1e34, 0x3f5e, 0xb246, 0x41b8, 0xbf70, 0x435d, 0xbfdd, 0x01b2, 0x420b, 0xbfc0, 0x464f, 0xb034, 0x1c2d, 0x1a10, 0xbfd5, 0xa298, 0x412d, 0x41a3, 0x42de, 0x42b2, 0xba1e, 0xb298, 0x4170, 0x1827, 0x4093, 0xb015, 0xba4a, 0x2cf0, 0xb2d9, 0xb067, 0x0c34, 0x35ed, 0x3b0a, 0x085a, 0x46ab, 0x158d, 0x3889, 0x42ab, 0x1c3a, 0xbfc6, 0x372b, 0x17bc, 0x3899, 0x4611, 0x1a8a, 0xbf5d, 0x44d8, 0xb042, 0x1ab4, 0xb0ac, 0x438a, 0x41af, 0xba06, 0xb25e, 0x164a, 0x4067, 0xb01c, 0x43eb, 0xbf2e, 0x1b94, 0xba3c, 0x1494, 0xbf77, 0x41da, 0x09e3, 0xbadc, 0xa22f, 0x3fcc, 0x1f3d, 0xba4a, 0x400a, 0x432e, 0xb289, 0x1b35, 0xb07e, 0x3cc2, 0x428c, 0x2025, 0xafee, 0x251a, 0xbfb3, 0x44cb, 0x45a8, 0xb294, 0x4328, 0xb08c, 0xb0b4, 0xba26, 0x4097, 0xaa3d, 0x40a6, 0x434b, 0x4560, 0x4660, 0x1f5f, 0x0839, 0x42f0, 0xb2b9, 0x465b, 0x41b9, 0x194f, 0x405a, 0x400d, 0xa719, 0x2c50, 0x1e4e, 0xb242, 0xba30, 0x42ae, 0xb24f, 0xbf43, 0x4681, 0x1a48, 0x1d26, 0xb0fd, 0x4004, 0x423e, 0xa9f0, 0xba40, 0xbaff, 0x43e1, 0xa99b, 0x4432, 0x41f4, 0xbf26, 0x0a13, 0x1821, 0x2ba4, 0x44b9, 0xba22, 0x322b, 0x1c9a, 0x432c, 0xba70, 0xb234, 0x3ca7, 0x4547, 0x4078, 0x4144, 0x40ec, 0xad9a, 0x04d0, 0x4327, 0x37e6, 0x09ea, 0x3f50, 0x1526, 0x407d, 0x1835, 0x4402, 0x1e38, 0x0896, 0xbf04, 0x1909, 0xb2db, 0xb297, 0xb2a2, 0x012d, 0x389d, 0x0b0f, 0x0c37, 0xb0af, 0x4460, 0x4057, 0x44cb, 0x41c7, 0xbaef, 0x429c, 0xaf1a, 0x46dd, 0x4305, 0xb00e, 0x4071, 0x1817, 0xbf34, 0x4349, 0x01c4, 0xb0f7, 0xb209, 0xbfc0, 0x4362, 0xa7c2, 0x43bc, 0x45cd, 0x2edb, 0xb28f, 0xbf53, 0x4102, 0x44cc, 0x431a, 0x1c7c, 0xb207, 0x445e, 0x432c, 0xb099, 0x1de3, 0x46b2, 0x2163, 0x429a, 0x4108, 0x1361, 0xb09d, 0xbac4, 0xb285, 0x0eaa, 0xbf65, 0x437f, 0x41b1, 0x4197, 0x1ff3, 0x2b09, 0x403b, 0x41b8, 0xb231, 0x42c8, 0x42cf, 0x43e6, 0x0f35, 0x1989, 0x1ff2, 0x41c6, 0xbfd0, 0x1e9b, 0x434a, 0x42e3, 0xa90c, 0x40a4, 0x4208, 0x4200, 0xbf8a, 0x1b32, 0x410f, 0x2ee4, 0x33ed, 0xb240, 0xb0f4, 0x40c3, 0x4250, 0x2be7, 0xb019, 0xb2dd, 0xbfd7, 0xb0d4, 0xba08, 0xb2fb, 0x41b7, 0x1308, 0x4267, 0x41c0, 0xbfd0, 0x434c, 0xb06c, 0x4540, 0xb204, 0x1a34, 0x4140, 0xbad7, 0x1cc9, 0x3e9e, 0x390a, 0x40fa, 0x404e, 0xbfaa, 0x08cb, 0x4261, 0x4583, 0x339d, 0x1e37, 0x42fc, 0x437e, 0x435b, 0x3be3, 0x1891, 0xb222, 0x4245, 0x4130, 0x08b8, 0x447a, 0xb226, 0x034a, 0x4392, 0x4379, 0x40ec, 0xa38a, 0xba18, 0x42d9, 0x02f5, 0x4337, 0x41da, 0xbfc6, 0x4491, 0x4071, 0xb215, 0x1b51, 0x41dd, 0x41cd, 0x4223, 0x00af, 0xb2a7, 0x42e5, 0xb020, 0x43e6, 0xb27b, 0x439a, 0x4213, 0xbac3, 0x426a, 0x3d19, 0xa5b8, 0xb0f3, 0xbfc0, 0xba34, 0xba5e, 0xbfc6, 0x42f6, 0x103e, 0x45c1, 0x4482, 0x42ab, 0x2d50, 0x1f4e, 0x411b, 0x4316, 0xb01d, 0x45ee, 0x1db2, 0xb0a5, 0xbf6e, 0x0cf1, 0x1ac8, 0xba74, 0x43ca, 0xba28, 0xa979, 0x18a9, 0xbf01, 0xa761, 0x41fb, 0xb23a, 0x4242, 0x4358, 0x4163, 0xaabf, 0x13cb, 0xbf08, 0x189a, 0xb257, 0x43ee, 0x4085, 0x46f2, 0xb281, 0x45e3, 0x1a1f, 0xa8aa, 0x45e8, 0xba58, 0xb24c, 0x1e6b, 0xb252, 0x41b6, 0x43f7, 0xbf0c, 0xbad8, 0xb276, 0x43b7, 0x4205, 0x283f, 0x4208, 0x2afa, 0x46f1, 0x387c, 0x4269, 0x433a, 0x201c, 0x4072, 0x45bb, 0xbf55, 0x27d4, 0xb0b8, 0x4049, 0x426f, 0x400d, 0x4031, 0x41da, 0x41f1, 0x42c2, 0x4336, 0x432c, 0x4187, 0x445d, 0x423d, 0xb0cc, 0x408d, 0x43d5, 0x401b, 0x4397, 0xb26d, 0xba34, 0x41e3, 0x4326, 0x4355, 0xb01e, 0xbad7, 0xbfdd, 0xba3c, 0xba46, 0xba70, 0xa0a6, 0x1e83, 0x41cd, 0x41f0, 0x4256, 0xbf00, 0xb2df, 0x41c4, 0x45d3, 0xb2c6, 0xa98f, 0xbfde, 0x3ce1, 0x4263, 0x40b3, 0x45b6, 0x445f, 0xbf0b, 0x1d50, 0xb238, 0x2de2, 0x2b7f, 0xb0b8, 0x1629, 0x411b, 0xaeab, 0x4306, 0x2c95, 0x02e2, 0x4208, 0xba37, 0x25ef, 0xb08d, 0x4352, 0x2571, 0x425e, 0xba43, 0xb21d, 0xbfd2, 0x412b, 0x4644, 0x260f, 0x4770, 0xe7fe + ], + StartRegs = [0xd8508733, 0x37686f1d, 0x97ff025a, 0x7e27c2d9, 0xe771ba18, 0xaba51d16, 0x78d8fc78, 0x633a3766, 0xf31e6a39, 0xaa1cca97, 0x3f7fc03c, 0x49e22f13, 0xd6f3fcdf, 0x6bb27080, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0xffffcb9d, 0x00000000, 0xe1000000, 0xffffffff, 0xffffff1e, 0xffff9dcb, 0xe0000000, 0xdfcfffff, 0x49e23000, 0x00000000, 0x00000000, 0xaa1ccb83, 0xd6f3fcdf, 0xaa1cc3e3, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x46f3, 0xbfa0, 0xba72, 0x422f, 0x4194, 0x403f, 0x418a, 0x1b2f, 0x1a10, 0xb282, 0xb004, 0xad90, 0xa257, 0x43cc, 0x1e2d, 0x44a9, 0x4093, 0xba76, 0x4158, 0xbfe0, 0x2347, 0x434f, 0x0059, 0x45eb, 0xbf72, 0x40e7, 0xb086, 0x1feb, 0x4339, 0x40e6, 0x42bd, 0x409b, 0x4000, 0x4420, 0xba49, 0x4276, 0xb210, 0x2b38, 0xba5c, 0x1a1e, 0xab1f, 0x2962, 0x20bd, 0x42ae, 0xb0ab, 0x2234, 0x3607, 0x0b88, 0x29e7, 0x4378, 0xb06b, 0x40ec, 0xbf28, 0x43f2, 0x4135, 0xb00e, 0x1c37, 0x4025, 0x3570, 0xbf80, 0x42db, 0x249a, 0x4328, 0x4211, 0x41c7, 0x4239, 0x2924, 0xa5ef, 0x0387, 0x1a9f, 0x4352, 0x1f8f, 0xb031, 0x41bd, 0x1cdd, 0xb2ed, 0x4002, 0x4182, 0x07c7, 0xbf77, 0x406f, 0x431f, 0x42d9, 0x3e9c, 0xbf60, 0x4377, 0x4277, 0x4314, 0xb001, 0xbf6b, 0x4070, 0x41f7, 0xbadf, 0x0139, 0xb246, 0xba0a, 0x439e, 0x433b, 0x18e3, 0x320f, 0x0f77, 0x45a2, 0x1d6b, 0x1a0b, 0x42eb, 0xbf01, 0x1a8f, 0x4286, 0xa09a, 0xbae4, 0x431c, 0x4307, 0x3e46, 0x430d, 0x42ce, 0x433f, 0x109e, 0xa573, 0xba79, 0x1ef6, 0x41cf, 0x29c8, 0x0dca, 0x0e56, 0xbae7, 0x3d0d, 0x4374, 0x1e44, 0x0b81, 0xba51, 0x4087, 0x4425, 0x4283, 0x420e, 0xbf94, 0x409f, 0x42be, 0x4353, 0x436d, 0x4291, 0xbfc4, 0x4365, 0x40b3, 0x418f, 0xbf3e, 0x1e3d, 0x46ba, 0x1f8c, 0x42ea, 0x1c25, 0x4135, 0xb21a, 0xb29b, 0x16e9, 0x401d, 0x4653, 0xa607, 0x43e2, 0x0ec5, 0x4201, 0xbae0, 0xba26, 0xa713, 0x43c5, 0x23cf, 0x10a8, 0xb08e, 0x4232, 0x43cb, 0x43d9, 0x0774, 0xb03b, 0xbf62, 0x4205, 0xbfa0, 0x4661, 0x403b, 0xbf17, 0x40bb, 0xbaee, 0x42a1, 0x42b3, 0x463e, 0xafdf, 0x3543, 0x3528, 0x1eea, 0x4038, 0x1dd7, 0x38ba, 0x4092, 0x41b0, 0xba32, 0x4416, 0x44fd, 0xbfc8, 0x439f, 0x4319, 0xa47d, 0xb275, 0xb244, 0xbf95, 0x1453, 0xb04f, 0x1c40, 0x3477, 0xbf76, 0xaeb7, 0x0406, 0xbad8, 0xbf5e, 0x1a0d, 0xb2d6, 0xba5e, 0x437b, 0x0b3c, 0x1d54, 0x3c58, 0x404e, 0x427b, 0x25f8, 0xbfa0, 0x4053, 0x127f, 0x42e6, 0x438b, 0xbf23, 0xb2d9, 0x4389, 0x4350, 0xade8, 0x439e, 0x4485, 0x3ec6, 0x19a8, 0x0fe2, 0x42fc, 0x4262, 0xada2, 0x40e6, 0xb0e5, 0x4251, 0xb221, 0x1f4c, 0x127c, 0xbf56, 0x25d6, 0x20f9, 0x4329, 0x4123, 0x413d, 0xb2df, 0xb23b, 0x4653, 0xb2e4, 0xb0a9, 0x42ea, 0xb215, 0x4130, 0x4249, 0x4391, 0xb28f, 0x4127, 0x420e, 0x16ab, 0xa580, 0xb26c, 0x29b2, 0xa29e, 0xb09c, 0xb20f, 0xbfd2, 0x42e1, 0x42cf, 0x0a23, 0x4049, 0x433c, 0x45e0, 0xbf46, 0x407f, 0x408f, 0x4165, 0x4148, 0x19e5, 0x4594, 0xb0f1, 0x438d, 0x4000, 0x42b7, 0x4136, 0x31af, 0x40ea, 0xb0b9, 0x4323, 0x0710, 0xbfa2, 0x38a1, 0x40d2, 0x41a9, 0x4149, 0x0c49, 0x4168, 0x3f89, 0x433c, 0xb2fd, 0x42e3, 0x4353, 0x40a7, 0x43e8, 0xba3a, 0xb266, 0x4397, 0x0a3a, 0x40ab, 0x1fc5, 0x1f5f, 0x4117, 0x4573, 0xb01a, 0x418c, 0x44a9, 0xaa7b, 0x13a2, 0xbfe4, 0xb213, 0x41c3, 0xb28f, 0x2ff1, 0x2600, 0x2452, 0x438c, 0xa2cc, 0x1b55, 0x42ad, 0xb2fc, 0x1067, 0xb2b8, 0x41f0, 0x4625, 0x0ac8, 0xb25e, 0x441f, 0x40a8, 0x43d6, 0x18c7, 0xbadb, 0xb292, 0x4453, 0xbf8b, 0x19d8, 0x1f32, 0x18f9, 0x46b5, 0xb22a, 0x088b, 0xba5a, 0xba7f, 0xb068, 0x03a6, 0x444b, 0xb21c, 0x3014, 0x41cb, 0xbf26, 0x4015, 0xb2c5, 0x1a29, 0x1a7f, 0x0b53, 0x4219, 0x3afd, 0xba1c, 0x0def, 0x3b5b, 0x423c, 0x4003, 0x42a3, 0xb0f8, 0x42ce, 0x4357, 0x41ed, 0x4070, 0x42c4, 0x1c75, 0xa517, 0xb0ab, 0xba3f, 0x4341, 0x2c35, 0x1bd9, 0xbf76, 0x07be, 0x4173, 0x4145, 0xb0a5, 0x11a1, 0x4068, 0x43d8, 0x42e2, 0x40f6, 0xbafd, 0x1fc1, 0x407e, 0xba38, 0x4109, 0xb016, 0x40a6, 0x43d5, 0x4274, 0xbf1e, 0x2433, 0x289d, 0x43ca, 0xb25d, 0xba5d, 0x0a85, 0x43d7, 0x3e24, 0x0e1d, 0x1723, 0x444a, 0x18e3, 0xb2ba, 0xba2c, 0xba55, 0x075d, 0x43e8, 0x0247, 0x40fc, 0x1e94, 0xbfa6, 0x1c10, 0x3a69, 0x4023, 0x4581, 0x1925, 0xb0d7, 0x1f3f, 0xb0a9, 0x45e6, 0x2ec7, 0x41c3, 0x046b, 0x1f29, 0xbf4e, 0xb289, 0xb250, 0x425b, 0x40df, 0xb2b8, 0xab56, 0x1cb4, 0xbac1, 0x4271, 0xbf64, 0x4373, 0x3c6a, 0xbf5a, 0x43bb, 0x429f, 0x1f9e, 0xbac2, 0x404a, 0x0103, 0x4213, 0x46f1, 0x287a, 0x4088, 0xbacf, 0x4331, 0xba4b, 0x32fc, 0x43bb, 0xb02b, 0x4176, 0xa3dc, 0x44e1, 0x1f3a, 0xbfce, 0x3dc6, 0x4227, 0xba11, 0x4148, 0x09b4, 0xbfd3, 0xb245, 0x4394, 0x40ce, 0x07e5, 0x1956, 0x0db9, 0xb238, 0x40f2, 0x412b, 0x1af5, 0xa1f7, 0x466b, 0xba34, 0x4038, 0xa130, 0x404e, 0x19ca, 0x3a04, 0x1d1c, 0x4077, 0x439c, 0xbadb, 0x1f1d, 0x36ff, 0xbf4e, 0x42d1, 0xba5d, 0x4020, 0x0dd2, 0x42a9, 0x1943, 0x405d, 0xba7f, 0x41a1, 0x447d, 0x4181, 0x0963, 0xb038, 0x436e, 0x412f, 0x404f, 0xae5c, 0x41e7, 0x40e5, 0x434b, 0x20c5, 0x1eb2, 0x4010, 0x3a97, 0xbfb1, 0xb047, 0x0ba6, 0x3abe, 0xb252, 0x4104, 0x4346, 0xb206, 0xad63, 0xbf46, 0x4144, 0x41e0, 0x422b, 0xb0ed, 0x4389, 0x423b, 0xba65, 0xbaf3, 0xaaed, 0xb219, 0xba43, 0x243c, 0x197c, 0x421c, 0x18fd, 0x4313, 0x1cae, 0x140a, 0x42a0, 0xbf4e, 0x4015, 0x18f5, 0x42c6, 0x4115, 0x42c0, 0xba0a, 0x437a, 0xbf5f, 0xb0ae, 0x1d9d, 0x4085, 0x4350, 0x1a00, 0x369b, 0xb22b, 0x24f9, 0x4253, 0x360c, 0x41cd, 0x0fb1, 0xb0a6, 0x025d, 0x18c4, 0xb251, 0x40c6, 0x4349, 0xb2cc, 0xa0be, 0x4377, 0x43da, 0x16b2, 0x413d, 0xbf80, 0x44ac, 0xbfdb, 0xb266, 0x0d95, 0x420e, 0xb083, 0x1b6c, 0x4305, 0xbae4, 0xb28f, 0xb236, 0xba09, 0x2da7, 0xb252, 0xba09, 0xa115, 0x447d, 0xb272, 0xbf75, 0x40f6, 0x0b5a, 0xb086, 0x466b, 0x4632, 0xbf0a, 0x43e0, 0x1f0f, 0xb2e7, 0xba3d, 0x36d4, 0x07bc, 0x4172, 0x3697, 0xb221, 0x0e04, 0x28f3, 0x42e6, 0x198a, 0x4089, 0xbf90, 0x3694, 0x2837, 0x4082, 0x4263, 0x4142, 0x4074, 0x2fc6, 0x1e01, 0xab23, 0x0cb5, 0x4033, 0x0067, 0xbfca, 0x111a, 0x4261, 0x29e3, 0x462d, 0xb299, 0x4072, 0xbfe0, 0x4342, 0xbf3d, 0x0830, 0x1afe, 0x419c, 0x1ce9, 0x42e6, 0x40d5, 0x41cc, 0xb072, 0x3bd5, 0xbfdf, 0x1807, 0x44c2, 0xba38, 0x4693, 0x41a2, 0x4072, 0x42e7, 0xbaef, 0x01b3, 0x25c5, 0x4006, 0x096e, 0x4115, 0x0622, 0x43ac, 0xb00c, 0x1f03, 0xbf48, 0x41c4, 0x43dc, 0x415a, 0x20b3, 0x4064, 0xba24, 0x40f8, 0xb23f, 0x0b4b, 0x42ec, 0xb014, 0x4119, 0xbf78, 0x4393, 0x3aa5, 0x410a, 0x0b23, 0x442f, 0xba39, 0x4298, 0xba42, 0x42c5, 0xa365, 0xbfba, 0x40a8, 0x17e3, 0x4057, 0x417c, 0xaa59, 0xafc2, 0x33ad, 0xa425, 0xbfb9, 0x2e0c, 0x0192, 0xaa5d, 0x0448, 0x421e, 0x4357, 0xb2f0, 0x2a8b, 0x378b, 0xb219, 0x416c, 0xbf8e, 0x43ff, 0x4348, 0x4262, 0xba30, 0x202d, 0xa784, 0xadcc, 0xba34, 0x121b, 0x41da, 0xbfd1, 0xb293, 0x435f, 0x31bc, 0xb263, 0x40a0, 0xbf1c, 0x46cd, 0x22d6, 0x3198, 0x250f, 0x2fc5, 0x4100, 0x4090, 0xbfd2, 0xb207, 0xba6f, 0x436b, 0xba5f, 0x4618, 0xb2d4, 0x1123, 0xba54, 0x33e5, 0x43eb, 0x1e8d, 0xb21b, 0xaf42, 0xab0f, 0xb2cb, 0x4101, 0x4026, 0xb2b9, 0xaaf3, 0x1f93, 0x4208, 0x1d01, 0x400d, 0xbf99, 0x3677, 0x182f, 0x3f84, 0x363f, 0x185c, 0xb2d0, 0x0c54, 0x43dd, 0xa014, 0xb23f, 0x41f8, 0xba0b, 0xba39, 0x255a, 0x4313, 0x4449, 0x1934, 0x4317, 0x4102, 0x156d, 0x01fd, 0x41ec, 0x41e1, 0xb023, 0xbf62, 0x41b9, 0x3f1c, 0x3b9c, 0x1930, 0x1e90, 0x429a, 0x1a6c, 0x1dda, 0x1834, 0x440c, 0xb284, 0xb225, 0xae4e, 0x4080, 0xbfca, 0x1cfd, 0x264f, 0x4298, 0x185e, 0x1dc1, 0xbf17, 0x244c, 0x4546, 0x1b6d, 0xbaf7, 0xb286, 0x2054, 0x3c0d, 0x3570, 0x25a7, 0xb261, 0xb21e, 0xa108, 0x13c0, 0x4274, 0x4310, 0xbf42, 0x4212, 0x40c5, 0x438f, 0x0e16, 0x424f, 0xbf90, 0x438e, 0x37c7, 0xbf70, 0x1c3a, 0x437c, 0x06c9, 0x3d63, 0xba3c, 0x1fc0, 0xb223, 0xb245, 0x4003, 0x43aa, 0x0028, 0xba31, 0x038a, 0xba46, 0x1c2d, 0x4435, 0x0726, 0x41d5, 0xbfa6, 0xb2a3, 0xad24, 0x4662, 0x1fdc, 0xb2f7, 0x4012, 0x37dc, 0x418c, 0x1bf3, 0x42b6, 0x44ca, 0x03ed, 0xba5a, 0x431e, 0xbfdf, 0x4315, 0x437b, 0x42ea, 0xbad9, 0xad16, 0xb24d, 0x0b0b, 0xb24e, 0xbfc0, 0xb05b, 0x435f, 0xb255, 0x424e, 0xbae9, 0x4148, 0xb05f, 0xb243, 0x4182, 0x0e5a, 0xb205, 0xbad7, 0x2fd5, 0xbf21, 0x40ac, 0xb2a3, 0xba5c, 0xb2e0, 0x4061, 0x402e, 0xb0a7, 0x3380, 0x42b8, 0xa8cf, 0x2a06, 0x42ab, 0xb296, 0x42c7, 0x41fd, 0xb25b, 0x4333, 0x419f, 0x437b, 0x2ab1, 0xbaf1, 0x17dd, 0x43a2, 0x36ea, 0x4153, 0xbf91, 0x4023, 0x410e, 0xb2b9, 0xb0e9, 0xace2, 0x00d9, 0x2367, 0xb2f9, 0x41df, 0x2087, 0x3147, 0x41f5, 0xb086, 0x40e6, 0x43ef, 0xb21a, 0x41fa, 0xbf6b, 0x311c, 0xb297, 0xba54, 0xa3cd, 0x4189, 0xb252, 0x4186, 0x43d4, 0x4312, 0x4096, 0xb20e, 0x45f6, 0xba7c, 0x3889, 0x4085, 0x4067, 0x4254, 0x1829, 0x414f, 0x4447, 0x2373, 0x4184, 0xb24e, 0x408b, 0x404b, 0xa39a, 0xa843, 0x4007, 0x401e, 0xbf68, 0xba09, 0xb0f7, 0x46a1, 0xb068, 0x427a, 0x42c9, 0x43f4, 0x41e2, 0x40fa, 0xbac6, 0x4377, 0xbf70, 0x3cb1, 0x41b3, 0x43a8, 0xbf74, 0x1f66, 0xb25c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x320c594d, 0xb070758d, 0x7506c560, 0x186ad0f5, 0x6d69bf75, 0xb7cad7d5, 0x7a31742f, 0xa62baad6, 0x3f33b7a4, 0x3237b374, 0x612a830d, 0xd1ce3d3c, 0xdf52c51d, 0x8c1be78a, 0x00000000, 0xa00001f0 }, - FinalRegs = new uint[] { 0xdf52c8e9, 0xfffffffe, 0x0077f7e0, 0x00003048, 0xffffe53e, 0x00000000, 0xffffe539, 0xd3cd7808, 0x3f33b7a4, 0xffffff9b, 0x407d482a, 0x00000000, 0xdf52c51d, 0xdf52c7a1, 0x00000000, 0x800001d0 }, + Instructions = [0x46f3, 0xbfa0, 0xba72, 0x422f, 0x4194, 0x403f, 0x418a, 0x1b2f, 0x1a10, 0xb282, 0xb004, 0xad90, 0xa257, 0x43cc, 0x1e2d, 0x44a9, 0x4093, 0xba76, 0x4158, 0xbfe0, 0x2347, 0x434f, 0x0059, 0x45eb, 0xbf72, 0x40e7, 0xb086, 0x1feb, 0x4339, 0x40e6, 0x42bd, 0x409b, 0x4000, 0x4420, 0xba49, 0x4276, 0xb210, 0x2b38, 0xba5c, 0x1a1e, 0xab1f, 0x2962, 0x20bd, 0x42ae, 0xb0ab, 0x2234, 0x3607, 0x0b88, 0x29e7, 0x4378, 0xb06b, 0x40ec, 0xbf28, 0x43f2, 0x4135, 0xb00e, 0x1c37, 0x4025, 0x3570, 0xbf80, 0x42db, 0x249a, 0x4328, 0x4211, 0x41c7, 0x4239, 0x2924, 0xa5ef, 0x0387, 0x1a9f, 0x4352, 0x1f8f, 0xb031, 0x41bd, 0x1cdd, 0xb2ed, 0x4002, 0x4182, 0x07c7, 0xbf77, 0x406f, 0x431f, 0x42d9, 0x3e9c, 0xbf60, 0x4377, 0x4277, 0x4314, 0xb001, 0xbf6b, 0x4070, 0x41f7, 0xbadf, 0x0139, 0xb246, 0xba0a, 0x439e, 0x433b, 0x18e3, 0x320f, 0x0f77, 0x45a2, 0x1d6b, 0x1a0b, 0x42eb, 0xbf01, 0x1a8f, 0x4286, 0xa09a, 0xbae4, 0x431c, 0x4307, 0x3e46, 0x430d, 0x42ce, 0x433f, 0x109e, 0xa573, 0xba79, 0x1ef6, 0x41cf, 0x29c8, 0x0dca, 0x0e56, 0xbae7, 0x3d0d, 0x4374, 0x1e44, 0x0b81, 0xba51, 0x4087, 0x4425, 0x4283, 0x420e, 0xbf94, 0x409f, 0x42be, 0x4353, 0x436d, 0x4291, 0xbfc4, 0x4365, 0x40b3, 0x418f, 0xbf3e, 0x1e3d, 0x46ba, 0x1f8c, 0x42ea, 0x1c25, 0x4135, 0xb21a, 0xb29b, 0x16e9, 0x401d, 0x4653, 0xa607, 0x43e2, 0x0ec5, 0x4201, 0xbae0, 0xba26, 0xa713, 0x43c5, 0x23cf, 0x10a8, 0xb08e, 0x4232, 0x43cb, 0x43d9, 0x0774, 0xb03b, 0xbf62, 0x4205, 0xbfa0, 0x4661, 0x403b, 0xbf17, 0x40bb, 0xbaee, 0x42a1, 0x42b3, 0x463e, 0xafdf, 0x3543, 0x3528, 0x1eea, 0x4038, 0x1dd7, 0x38ba, 0x4092, 0x41b0, 0xba32, 0x4416, 0x44fd, 0xbfc8, 0x439f, 0x4319, 0xa47d, 0xb275, 0xb244, 0xbf95, 0x1453, 0xb04f, 0x1c40, 0x3477, 0xbf76, 0xaeb7, 0x0406, 0xbad8, 0xbf5e, 0x1a0d, 0xb2d6, 0xba5e, 0x437b, 0x0b3c, 0x1d54, 0x3c58, 0x404e, 0x427b, 0x25f8, 0xbfa0, 0x4053, 0x127f, 0x42e6, 0x438b, 0xbf23, 0xb2d9, 0x4389, 0x4350, 0xade8, 0x439e, 0x4485, 0x3ec6, 0x19a8, 0x0fe2, 0x42fc, 0x4262, 0xada2, 0x40e6, 0xb0e5, 0x4251, 0xb221, 0x1f4c, 0x127c, 0xbf56, 0x25d6, 0x20f9, 0x4329, 0x4123, 0x413d, 0xb2df, 0xb23b, 0x4653, 0xb2e4, 0xb0a9, 0x42ea, 0xb215, 0x4130, 0x4249, 0x4391, 0xb28f, 0x4127, 0x420e, 0x16ab, 0xa580, 0xb26c, 0x29b2, 0xa29e, 0xb09c, 0xb20f, 0xbfd2, 0x42e1, 0x42cf, 0x0a23, 0x4049, 0x433c, 0x45e0, 0xbf46, 0x407f, 0x408f, 0x4165, 0x4148, 0x19e5, 0x4594, 0xb0f1, 0x438d, 0x4000, 0x42b7, 0x4136, 0x31af, 0x40ea, 0xb0b9, 0x4323, 0x0710, 0xbfa2, 0x38a1, 0x40d2, 0x41a9, 0x4149, 0x0c49, 0x4168, 0x3f89, 0x433c, 0xb2fd, 0x42e3, 0x4353, 0x40a7, 0x43e8, 0xba3a, 0xb266, 0x4397, 0x0a3a, 0x40ab, 0x1fc5, 0x1f5f, 0x4117, 0x4573, 0xb01a, 0x418c, 0x44a9, 0xaa7b, 0x13a2, 0xbfe4, 0xb213, 0x41c3, 0xb28f, 0x2ff1, 0x2600, 0x2452, 0x438c, 0xa2cc, 0x1b55, 0x42ad, 0xb2fc, 0x1067, 0xb2b8, 0x41f0, 0x4625, 0x0ac8, 0xb25e, 0x441f, 0x40a8, 0x43d6, 0x18c7, 0xbadb, 0xb292, 0x4453, 0xbf8b, 0x19d8, 0x1f32, 0x18f9, 0x46b5, 0xb22a, 0x088b, 0xba5a, 0xba7f, 0xb068, 0x03a6, 0x444b, 0xb21c, 0x3014, 0x41cb, 0xbf26, 0x4015, 0xb2c5, 0x1a29, 0x1a7f, 0x0b53, 0x4219, 0x3afd, 0xba1c, 0x0def, 0x3b5b, 0x423c, 0x4003, 0x42a3, 0xb0f8, 0x42ce, 0x4357, 0x41ed, 0x4070, 0x42c4, 0x1c75, 0xa517, 0xb0ab, 0xba3f, 0x4341, 0x2c35, 0x1bd9, 0xbf76, 0x07be, 0x4173, 0x4145, 0xb0a5, 0x11a1, 0x4068, 0x43d8, 0x42e2, 0x40f6, 0xbafd, 0x1fc1, 0x407e, 0xba38, 0x4109, 0xb016, 0x40a6, 0x43d5, 0x4274, 0xbf1e, 0x2433, 0x289d, 0x43ca, 0xb25d, 0xba5d, 0x0a85, 0x43d7, 0x3e24, 0x0e1d, 0x1723, 0x444a, 0x18e3, 0xb2ba, 0xba2c, 0xba55, 0x075d, 0x43e8, 0x0247, 0x40fc, 0x1e94, 0xbfa6, 0x1c10, 0x3a69, 0x4023, 0x4581, 0x1925, 0xb0d7, 0x1f3f, 0xb0a9, 0x45e6, 0x2ec7, 0x41c3, 0x046b, 0x1f29, 0xbf4e, 0xb289, 0xb250, 0x425b, 0x40df, 0xb2b8, 0xab56, 0x1cb4, 0xbac1, 0x4271, 0xbf64, 0x4373, 0x3c6a, 0xbf5a, 0x43bb, 0x429f, 0x1f9e, 0xbac2, 0x404a, 0x0103, 0x4213, 0x46f1, 0x287a, 0x4088, 0xbacf, 0x4331, 0xba4b, 0x32fc, 0x43bb, 0xb02b, 0x4176, 0xa3dc, 0x44e1, 0x1f3a, 0xbfce, 0x3dc6, 0x4227, 0xba11, 0x4148, 0x09b4, 0xbfd3, 0xb245, 0x4394, 0x40ce, 0x07e5, 0x1956, 0x0db9, 0xb238, 0x40f2, 0x412b, 0x1af5, 0xa1f7, 0x466b, 0xba34, 0x4038, 0xa130, 0x404e, 0x19ca, 0x3a04, 0x1d1c, 0x4077, 0x439c, 0xbadb, 0x1f1d, 0x36ff, 0xbf4e, 0x42d1, 0xba5d, 0x4020, 0x0dd2, 0x42a9, 0x1943, 0x405d, 0xba7f, 0x41a1, 0x447d, 0x4181, 0x0963, 0xb038, 0x436e, 0x412f, 0x404f, 0xae5c, 0x41e7, 0x40e5, 0x434b, 0x20c5, 0x1eb2, 0x4010, 0x3a97, 0xbfb1, 0xb047, 0x0ba6, 0x3abe, 0xb252, 0x4104, 0x4346, 0xb206, 0xad63, 0xbf46, 0x4144, 0x41e0, 0x422b, 0xb0ed, 0x4389, 0x423b, 0xba65, 0xbaf3, 0xaaed, 0xb219, 0xba43, 0x243c, 0x197c, 0x421c, 0x18fd, 0x4313, 0x1cae, 0x140a, 0x42a0, 0xbf4e, 0x4015, 0x18f5, 0x42c6, 0x4115, 0x42c0, 0xba0a, 0x437a, 0xbf5f, 0xb0ae, 0x1d9d, 0x4085, 0x4350, 0x1a00, 0x369b, 0xb22b, 0x24f9, 0x4253, 0x360c, 0x41cd, 0x0fb1, 0xb0a6, 0x025d, 0x18c4, 0xb251, 0x40c6, 0x4349, 0xb2cc, 0xa0be, 0x4377, 0x43da, 0x16b2, 0x413d, 0xbf80, 0x44ac, 0xbfdb, 0xb266, 0x0d95, 0x420e, 0xb083, 0x1b6c, 0x4305, 0xbae4, 0xb28f, 0xb236, 0xba09, 0x2da7, 0xb252, 0xba09, 0xa115, 0x447d, 0xb272, 0xbf75, 0x40f6, 0x0b5a, 0xb086, 0x466b, 0x4632, 0xbf0a, 0x43e0, 0x1f0f, 0xb2e7, 0xba3d, 0x36d4, 0x07bc, 0x4172, 0x3697, 0xb221, 0x0e04, 0x28f3, 0x42e6, 0x198a, 0x4089, 0xbf90, 0x3694, 0x2837, 0x4082, 0x4263, 0x4142, 0x4074, 0x2fc6, 0x1e01, 0xab23, 0x0cb5, 0x4033, 0x0067, 0xbfca, 0x111a, 0x4261, 0x29e3, 0x462d, 0xb299, 0x4072, 0xbfe0, 0x4342, 0xbf3d, 0x0830, 0x1afe, 0x419c, 0x1ce9, 0x42e6, 0x40d5, 0x41cc, 0xb072, 0x3bd5, 0xbfdf, 0x1807, 0x44c2, 0xba38, 0x4693, 0x41a2, 0x4072, 0x42e7, 0xbaef, 0x01b3, 0x25c5, 0x4006, 0x096e, 0x4115, 0x0622, 0x43ac, 0xb00c, 0x1f03, 0xbf48, 0x41c4, 0x43dc, 0x415a, 0x20b3, 0x4064, 0xba24, 0x40f8, 0xb23f, 0x0b4b, 0x42ec, 0xb014, 0x4119, 0xbf78, 0x4393, 0x3aa5, 0x410a, 0x0b23, 0x442f, 0xba39, 0x4298, 0xba42, 0x42c5, 0xa365, 0xbfba, 0x40a8, 0x17e3, 0x4057, 0x417c, 0xaa59, 0xafc2, 0x33ad, 0xa425, 0xbfb9, 0x2e0c, 0x0192, 0xaa5d, 0x0448, 0x421e, 0x4357, 0xb2f0, 0x2a8b, 0x378b, 0xb219, 0x416c, 0xbf8e, 0x43ff, 0x4348, 0x4262, 0xba30, 0x202d, 0xa784, 0xadcc, 0xba34, 0x121b, 0x41da, 0xbfd1, 0xb293, 0x435f, 0x31bc, 0xb263, 0x40a0, 0xbf1c, 0x46cd, 0x22d6, 0x3198, 0x250f, 0x2fc5, 0x4100, 0x4090, 0xbfd2, 0xb207, 0xba6f, 0x436b, 0xba5f, 0x4618, 0xb2d4, 0x1123, 0xba54, 0x33e5, 0x43eb, 0x1e8d, 0xb21b, 0xaf42, 0xab0f, 0xb2cb, 0x4101, 0x4026, 0xb2b9, 0xaaf3, 0x1f93, 0x4208, 0x1d01, 0x400d, 0xbf99, 0x3677, 0x182f, 0x3f84, 0x363f, 0x185c, 0xb2d0, 0x0c54, 0x43dd, 0xa014, 0xb23f, 0x41f8, 0xba0b, 0xba39, 0x255a, 0x4313, 0x4449, 0x1934, 0x4317, 0x4102, 0x156d, 0x01fd, 0x41ec, 0x41e1, 0xb023, 0xbf62, 0x41b9, 0x3f1c, 0x3b9c, 0x1930, 0x1e90, 0x429a, 0x1a6c, 0x1dda, 0x1834, 0x440c, 0xb284, 0xb225, 0xae4e, 0x4080, 0xbfca, 0x1cfd, 0x264f, 0x4298, 0x185e, 0x1dc1, 0xbf17, 0x244c, 0x4546, 0x1b6d, 0xbaf7, 0xb286, 0x2054, 0x3c0d, 0x3570, 0x25a7, 0xb261, 0xb21e, 0xa108, 0x13c0, 0x4274, 0x4310, 0xbf42, 0x4212, 0x40c5, 0x438f, 0x0e16, 0x424f, 0xbf90, 0x438e, 0x37c7, 0xbf70, 0x1c3a, 0x437c, 0x06c9, 0x3d63, 0xba3c, 0x1fc0, 0xb223, 0xb245, 0x4003, 0x43aa, 0x0028, 0xba31, 0x038a, 0xba46, 0x1c2d, 0x4435, 0x0726, 0x41d5, 0xbfa6, 0xb2a3, 0xad24, 0x4662, 0x1fdc, 0xb2f7, 0x4012, 0x37dc, 0x418c, 0x1bf3, 0x42b6, 0x44ca, 0x03ed, 0xba5a, 0x431e, 0xbfdf, 0x4315, 0x437b, 0x42ea, 0xbad9, 0xad16, 0xb24d, 0x0b0b, 0xb24e, 0xbfc0, 0xb05b, 0x435f, 0xb255, 0x424e, 0xbae9, 0x4148, 0xb05f, 0xb243, 0x4182, 0x0e5a, 0xb205, 0xbad7, 0x2fd5, 0xbf21, 0x40ac, 0xb2a3, 0xba5c, 0xb2e0, 0x4061, 0x402e, 0xb0a7, 0x3380, 0x42b8, 0xa8cf, 0x2a06, 0x42ab, 0xb296, 0x42c7, 0x41fd, 0xb25b, 0x4333, 0x419f, 0x437b, 0x2ab1, 0xbaf1, 0x17dd, 0x43a2, 0x36ea, 0x4153, 0xbf91, 0x4023, 0x410e, 0xb2b9, 0xb0e9, 0xace2, 0x00d9, 0x2367, 0xb2f9, 0x41df, 0x2087, 0x3147, 0x41f5, 0xb086, 0x40e6, 0x43ef, 0xb21a, 0x41fa, 0xbf6b, 0x311c, 0xb297, 0xba54, 0xa3cd, 0x4189, 0xb252, 0x4186, 0x43d4, 0x4312, 0x4096, 0xb20e, 0x45f6, 0xba7c, 0x3889, 0x4085, 0x4067, 0x4254, 0x1829, 0x414f, 0x4447, 0x2373, 0x4184, 0xb24e, 0x408b, 0x404b, 0xa39a, 0xa843, 0x4007, 0x401e, 0xbf68, 0xba09, 0xb0f7, 0x46a1, 0xb068, 0x427a, 0x42c9, 0x43f4, 0x41e2, 0x40fa, 0xbac6, 0x4377, 0xbf70, 0x3cb1, 0x41b3, 0x43a8, 0xbf74, 0x1f66, 0xb25c, 0x4770, 0xe7fe + ], + StartRegs = [0x320c594d, 0xb070758d, 0x7506c560, 0x186ad0f5, 0x6d69bf75, 0xb7cad7d5, 0x7a31742f, 0xa62baad6, 0x3f33b7a4, 0x3237b374, 0x612a830d, 0xd1ce3d3c, 0xdf52c51d, 0x8c1be78a, 0x00000000, 0xa00001f0 + ], + FinalRegs = [0xdf52c8e9, 0xfffffffe, 0x0077f7e0, 0x00003048, 0xffffe53e, 0x00000000, 0xffffe539, 0xd3cd7808, 0x3f33b7a4, 0xffffff9b, 0x407d482a, 0x00000000, 0xdf52c51d, 0xdf52c7a1, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x43ce, 0xba1b, 0xba2e, 0x02ec, 0x4241, 0xb244, 0x0d54, 0x40ed, 0x2352, 0xb025, 0x4172, 0x3f8e, 0x1fc3, 0x423a, 0x43ee, 0x41e7, 0x4155, 0xa91e, 0xbaee, 0x41fb, 0x35a0, 0x1a31, 0x414f, 0x4075, 0xbf8f, 0x39ec, 0x4032, 0x29b2, 0x2093, 0x4196, 0x1b62, 0x4411, 0x3f4e, 0xb242, 0x226a, 0xb2b0, 0x3fc2, 0xba70, 0x43b8, 0xbf7b, 0xa6be, 0x41ab, 0xbae6, 0x401e, 0x46a4, 0xbf2e, 0xb09d, 0x435c, 0x423a, 0xb2a8, 0xac17, 0x4382, 0xb2e8, 0x33df, 0x45a1, 0x11b9, 0x4435, 0xbacf, 0xbf23, 0x2fe4, 0x4137, 0x1be5, 0x1528, 0x41c1, 0xb241, 0xb2e2, 0x2601, 0xb2c8, 0xbace, 0x3e99, 0x417c, 0x4362, 0x426b, 0xb2cb, 0xac16, 0x42dd, 0xab93, 0xbad6, 0x44fb, 0x1c86, 0x445b, 0xa008, 0x41ca, 0xbfe0, 0x45d3, 0xb20a, 0xb06e, 0x443d, 0xbfce, 0x43cf, 0x4278, 0x406a, 0xb23d, 0xac1d, 0x4317, 0x14b6, 0x1aba, 0x4437, 0x409d, 0x40d8, 0x1c08, 0xad81, 0x2e13, 0x43da, 0x354d, 0x418a, 0x1911, 0x3024, 0x40cb, 0xbf4c, 0x190c, 0x400b, 0x4090, 0xbfcf, 0xb09d, 0x3f1b, 0xb235, 0x1f6d, 0x1a67, 0x4078, 0x4045, 0x066d, 0x404d, 0x4148, 0xba75, 0x1c4a, 0xb219, 0x2277, 0x41f9, 0xb0c6, 0xb2a5, 0x0907, 0xbf4b, 0xb244, 0x0cdc, 0xb2ea, 0x4093, 0x42a8, 0x40e0, 0x3381, 0x0521, 0x41dd, 0xb290, 0x4064, 0xb08d, 0x400b, 0x43fa, 0x4349, 0xbf2b, 0xab6c, 0xb0ed, 0x43df, 0x0ae3, 0x24ae, 0xbf67, 0x407d, 0x1041, 0xbae3, 0x43fe, 0xbf63, 0x4185, 0xb033, 0x40df, 0x4362, 0x30bd, 0x455d, 0xb090, 0x411a, 0x44b3, 0x40da, 0xbf80, 0x41d1, 0xb2eb, 0x3e13, 0x4112, 0x40b0, 0x1f92, 0x407e, 0x36db, 0x41cf, 0x4397, 0x1982, 0xbad6, 0xb0be, 0x240e, 0x1c50, 0xba3f, 0x4224, 0xbfdf, 0xa4fd, 0x42c3, 0x4022, 0x4021, 0x1e68, 0xb23d, 0x43c1, 0x46fc, 0x4667, 0xba1c, 0x381b, 0x4189, 0x4186, 0x42da, 0xba72, 0x4230, 0x2b23, 0x40b4, 0x431c, 0x414c, 0xa472, 0x419e, 0xba03, 0x429b, 0x0c07, 0x1985, 0x412a, 0x3faa, 0x4689, 0xbf8f, 0x41e3, 0x427b, 0xb28d, 0xa220, 0xa8e1, 0x42ad, 0x4302, 0x41d7, 0xb224, 0x4240, 0x4063, 0x418d, 0xb2f7, 0x422d, 0x2633, 0x46f8, 0x13db, 0xbf84, 0x3ef1, 0x434c, 0x115c, 0xbf98, 0xba27, 0x1d98, 0xbf95, 0x4273, 0x1cdc, 0x428c, 0xb215, 0x3d32, 0xb219, 0xba4a, 0x4640, 0x4349, 0x4123, 0xba50, 0x447f, 0x3398, 0x4017, 0x325e, 0x1afd, 0xb20b, 0x1f41, 0xb200, 0x422e, 0x16a1, 0x43b4, 0x1f01, 0xbf58, 0x42f1, 0xb2c7, 0xb269, 0x41c9, 0x4445, 0x42fd, 0x4228, 0x1796, 0x1d3a, 0x40d8, 0xbf23, 0x44ac, 0x433c, 0x41d0, 0x280a, 0x4555, 0x428d, 0xbf48, 0xb219, 0x40e5, 0x4178, 0x4072, 0x438f, 0x4351, 0x45a5, 0x42ed, 0xa654, 0xb27b, 0xbfab, 0x1c9b, 0x42b1, 0xb03b, 0xba2d, 0x19b2, 0x4279, 0x429a, 0x4025, 0x41d4, 0xb228, 0x426f, 0xb2dd, 0xb26b, 0x4377, 0x18e1, 0x1a2d, 0x1e4f, 0x40b3, 0x42e2, 0x4249, 0x1b7c, 0xbaec, 0x40c5, 0x193f, 0x414c, 0xba00, 0x437b, 0x40d7, 0xba26, 0xbf4c, 0x43b5, 0x3b21, 0xab9e, 0x44ac, 0x18b3, 0x40c8, 0xbaed, 0x17c8, 0x3a04, 0x1751, 0x41c0, 0x41b2, 0x41c4, 0xb039, 0xbf01, 0x43de, 0x41f5, 0x1b0f, 0x4336, 0xba08, 0xb03b, 0x41d8, 0x366c, 0x0cf1, 0x4615, 0x412e, 0x4541, 0x030a, 0x28f4, 0x419c, 0x45e3, 0x3ee7, 0x3be2, 0xb031, 0x4301, 0x4327, 0x403a, 0xbad8, 0x425e, 0x42f5, 0xbfaa, 0x413e, 0x448c, 0xafe4, 0x40de, 0x417c, 0xbfb0, 0x22f0, 0xb2de, 0x4197, 0x421f, 0x410f, 0xb2d4, 0x40e4, 0x4117, 0x40ef, 0xbf54, 0x415e, 0xa3a1, 0x42bb, 0x40b0, 0x43b0, 0x4176, 0xb0b5, 0xb2e8, 0x3f9f, 0xba16, 0x4130, 0x412a, 0xbf5b, 0x1a0c, 0x42ba, 0x43e9, 0xa069, 0xb287, 0x41fd, 0xb0f8, 0x4275, 0x4443, 0x2643, 0x41ee, 0xba6b, 0xb25d, 0x32bc, 0xacb5, 0x45e2, 0x1049, 0xbf01, 0x4093, 0x4349, 0xaf09, 0xba72, 0xbadf, 0xbf00, 0xbf3c, 0xb0ff, 0x4190, 0xbf70, 0x4246, 0x1fb4, 0x439b, 0x0a5c, 0x265f, 0x409e, 0x1bae, 0xbae4, 0x20cd, 0x1f9b, 0x1ec0, 0x3cf8, 0xbae2, 0xb0d1, 0xaeaf, 0xbac7, 0x44f2, 0x416f, 0xbf1a, 0x415a, 0x2deb, 0x42f6, 0xa78e, 0x26f7, 0x429c, 0x30db, 0xb0d6, 0x4348, 0x4161, 0x409a, 0x432f, 0xbae7, 0x4105, 0x41b1, 0x4103, 0x1f6d, 0x12bd, 0x4362, 0x42d4, 0xbfa2, 0xbaf3, 0x4287, 0x1c0e, 0xb27a, 0x4628, 0x1861, 0x0bdf, 0x4139, 0x3f0a, 0xbfe0, 0x431b, 0x40bf, 0x403c, 0x24d3, 0x11e4, 0x1802, 0x2b5b, 0xa8ce, 0x15cd, 0x0a73, 0x1f3d, 0x1aa4, 0x41e8, 0xbf7c, 0xba36, 0x1a63, 0x1d63, 0x255d, 0x437d, 0x0969, 0xbac2, 0xba01, 0x4053, 0x40a7, 0x46ec, 0xb2f4, 0x1eab, 0xb243, 0x1a9f, 0x40a3, 0x4488, 0xb217, 0x434b, 0xb22e, 0x36e8, 0xb0a1, 0xb2b3, 0xbf25, 0x33da, 0x37e0, 0x43ad, 0x4418, 0x38ba, 0xa987, 0x4139, 0xbf2a, 0xa07a, 0x39a8, 0xb282, 0xba45, 0x43af, 0xba0b, 0x4275, 0x4273, 0xbad6, 0x435a, 0xb088, 0x402a, 0x40a6, 0xb029, 0x4304, 0xaa79, 0xb263, 0x4094, 0x08e2, 0x42cb, 0x42e7, 0x40dc, 0x1604, 0x43ca, 0x2b37, 0xbfc2, 0x4398, 0x300a, 0x41f9, 0xbf9d, 0x4485, 0xa8ec, 0x3bfb, 0xb23f, 0x0380, 0x3972, 0x40d9, 0x4019, 0x1c09, 0x1091, 0xbadf, 0x40c8, 0x43d0, 0x45aa, 0xbf90, 0xb224, 0x43fb, 0xb25c, 0xbf99, 0xbaf7, 0xb08e, 0x1b57, 0xb202, 0xb26b, 0x4160, 0xb03b, 0x1b50, 0x1f3c, 0x4107, 0x4027, 0x446f, 0x4183, 0x323e, 0xa035, 0x41ff, 0x415d, 0xbaff, 0x4634, 0x430a, 0x434f, 0x414d, 0xba3f, 0x1c05, 0xb0e7, 0xbf6b, 0x43e5, 0x3391, 0x1fed, 0x4341, 0x46f3, 0x4280, 0x4103, 0x401e, 0x1e8c, 0xba73, 0x4110, 0x404e, 0x2e56, 0x1b29, 0x1fc5, 0x4562, 0x418f, 0xbfa1, 0x414a, 0xb2fd, 0x42e9, 0xb2c3, 0x4170, 0xb242, 0x4371, 0x160c, 0xb0da, 0x3438, 0xba7e, 0xba02, 0x40ac, 0xbf92, 0x438b, 0x4009, 0x41b3, 0xbae1, 0xb26c, 0x060c, 0x4023, 0x4377, 0x35b8, 0x413d, 0x411a, 0x43b2, 0x0ad3, 0x42a6, 0xbf00, 0x4279, 0x1fe4, 0xb228, 0x42f0, 0x0ab4, 0x41bf, 0x41f0, 0x24fe, 0xbf67, 0x2bbb, 0x0f1e, 0x4101, 0x4402, 0xb2f6, 0x435e, 0xba00, 0xbfb0, 0x41bd, 0x4540, 0xbfb8, 0x1ba4, 0xb25c, 0x1478, 0x415b, 0xb01a, 0x4067, 0xa8f1, 0x429b, 0x1211, 0x42d8, 0xbf6b, 0x42b0, 0xba0f, 0x4175, 0x42a3, 0x3eba, 0x418b, 0x3558, 0x4044, 0x1c92, 0x40ee, 0x4345, 0x429a, 0x42f0, 0xbac9, 0x46b4, 0x429d, 0xbf0a, 0x4338, 0x418b, 0x43c0, 0x4224, 0xbf0f, 0xaa79, 0xba2e, 0x2cfb, 0xa092, 0x4003, 0x2293, 0xb2fb, 0x1a02, 0x4298, 0x4204, 0x41f3, 0x255f, 0x1884, 0xbfc0, 0x403a, 0x407b, 0xb044, 0xbf5d, 0x12b1, 0x3384, 0x4336, 0xb05d, 0x42be, 0x419e, 0xb2ad, 0xba4a, 0x4117, 0xba5b, 0xb292, 0xbafd, 0x428e, 0x43f5, 0x40f8, 0x4601, 0x406b, 0xae07, 0x42e5, 0x4053, 0x4068, 0xb0b4, 0x3961, 0x4340, 0x37c8, 0xbfcb, 0x423c, 0xa03f, 0x4342, 0x423c, 0xbf88, 0x0fdd, 0x4193, 0xb2d9, 0x43da, 0xbfa0, 0x1396, 0x40af, 0x4317, 0xa51a, 0x211a, 0xadb9, 0x433e, 0xba22, 0x41f9, 0x180e, 0x411c, 0xba61, 0x4001, 0x4268, 0x03fc, 0xbf00, 0xb281, 0xb23f, 0xbae2, 0xbf80, 0xbf65, 0x43e1, 0x394f, 0x35a0, 0x329b, 0x422f, 0x4164, 0x0d8f, 0x4237, 0x465a, 0x43b6, 0xbaf0, 0xbfe0, 0xbf11, 0x4267, 0xba2f, 0x41a6, 0xb210, 0x4221, 0x4319, 0x1482, 0x3205, 0xb256, 0x2dfd, 0xba01, 0x402a, 0xb2ca, 0x163f, 0x432d, 0x41fd, 0x4161, 0xb0b4, 0x42f8, 0x40c2, 0x1aa5, 0x4167, 0xb051, 0x0978, 0x4149, 0xbf1f, 0x4175, 0x43fa, 0xb252, 0x4140, 0x4215, 0xba55, 0xb2d2, 0x4210, 0x406a, 0xaf57, 0xacee, 0xa935, 0xba5d, 0x4259, 0x05bf, 0xb015, 0x43e6, 0x4192, 0xa8db, 0x44e2, 0x1588, 0x0d4d, 0x437f, 0x0618, 0xbfdb, 0x41e3, 0x4108, 0xa17e, 0x416f, 0x1b33, 0x42df, 0x438e, 0x41d0, 0xbfb1, 0x0d0f, 0xb28f, 0xba4b, 0x3c20, 0x42e3, 0x0f9b, 0x41af, 0x40fd, 0x415c, 0x40f5, 0x436d, 0xa5a7, 0xa82e, 0xba46, 0x42ac, 0xb204, 0x4067, 0x438d, 0x40e0, 0x09d3, 0xaaf7, 0xbf79, 0x4386, 0x1b23, 0x41ea, 0x4010, 0xbff0, 0x4491, 0xa083, 0xb227, 0xb2d3, 0x4196, 0x1c87, 0xb22a, 0xb09b, 0x01cd, 0x1c6f, 0xafc3, 0x43be, 0xa9d2, 0x42c6, 0x0ad5, 0x4341, 0x432b, 0xba5c, 0xb0bc, 0x4120, 0x412e, 0x4475, 0x4284, 0xb01b, 0xbfda, 0xa893, 0x1afa, 0xa310, 0x40f9, 0xb25d, 0x42b4, 0xb00e, 0xb06b, 0xb26e, 0x43eb, 0x4237, 0x40a9, 0x4369, 0x40cc, 0x4233, 0x40fc, 0x3d00, 0x43aa, 0xb2d7, 0x40bc, 0xbf00, 0xb296, 0xb223, 0x0c49, 0xaaff, 0x4180, 0x18bc, 0xbf70, 0xbf6c, 0x430a, 0xb208, 0x0bd5, 0x1bcd, 0x421c, 0xb289, 0xb250, 0xbf1e, 0x41b7, 0x44fa, 0xb0f3, 0x2760, 0x1c87, 0x189c, 0xb217, 0x41a3, 0xaf06, 0xbfb4, 0x422b, 0x2caf, 0x1b6f, 0x429c, 0x406b, 0x417d, 0x41c5, 0xa01c, 0xb258, 0x43ee, 0x1c6b, 0x4171, 0xb0ab, 0xa87d, 0x40e3, 0x1b3f, 0xba4a, 0xbf46, 0x3418, 0x19da, 0xa67e, 0x4223, 0x3401, 0x3b45, 0x2a8f, 0x45ab, 0xb249, 0xb2d7, 0x416d, 0xbf80, 0x1b06, 0xba61, 0x070c, 0xb2e8, 0x4394, 0x3fb6, 0x41b7, 0xbf56, 0x4087, 0x42fa, 0xb01d, 0x438c, 0x1fb3, 0xbae0, 0xb01a, 0xa6da, 0x4396, 0xb009, 0x3260, 0x4347, 0x4097, 0xb06f, 0x42b9, 0x2e15, 0xb033, 0x4253, 0x43a3, 0x0261, 0x1e9b, 0x4657, 0xb2fb, 0xb288, 0xbf9e, 0x42ed, 0x43d9, 0xba33, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3e63c940, 0xd2f40362, 0xbb77737e, 0x677685e4, 0x97ccf408, 0x3dfa0433, 0x43332c01, 0xa5fc83ef, 0x5b5a10e7, 0x93fd7fe6, 0xe271cf59, 0xac70a2fd, 0xc4be1954, 0x93de22cc, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00000000, 0xfffff05f, 0x00000059, 0x00000000, 0x00000020, 0x00001000, 0xe271cf59, 0x49f6f315, 0x93de1f28, 0xe271cf59, 0x00000000, 0x00000000, 0x93de1f1c, 0x00000000, 0x200001d0 }, + Instructions = [0x43ce, 0xba1b, 0xba2e, 0x02ec, 0x4241, 0xb244, 0x0d54, 0x40ed, 0x2352, 0xb025, 0x4172, 0x3f8e, 0x1fc3, 0x423a, 0x43ee, 0x41e7, 0x4155, 0xa91e, 0xbaee, 0x41fb, 0x35a0, 0x1a31, 0x414f, 0x4075, 0xbf8f, 0x39ec, 0x4032, 0x29b2, 0x2093, 0x4196, 0x1b62, 0x4411, 0x3f4e, 0xb242, 0x226a, 0xb2b0, 0x3fc2, 0xba70, 0x43b8, 0xbf7b, 0xa6be, 0x41ab, 0xbae6, 0x401e, 0x46a4, 0xbf2e, 0xb09d, 0x435c, 0x423a, 0xb2a8, 0xac17, 0x4382, 0xb2e8, 0x33df, 0x45a1, 0x11b9, 0x4435, 0xbacf, 0xbf23, 0x2fe4, 0x4137, 0x1be5, 0x1528, 0x41c1, 0xb241, 0xb2e2, 0x2601, 0xb2c8, 0xbace, 0x3e99, 0x417c, 0x4362, 0x426b, 0xb2cb, 0xac16, 0x42dd, 0xab93, 0xbad6, 0x44fb, 0x1c86, 0x445b, 0xa008, 0x41ca, 0xbfe0, 0x45d3, 0xb20a, 0xb06e, 0x443d, 0xbfce, 0x43cf, 0x4278, 0x406a, 0xb23d, 0xac1d, 0x4317, 0x14b6, 0x1aba, 0x4437, 0x409d, 0x40d8, 0x1c08, 0xad81, 0x2e13, 0x43da, 0x354d, 0x418a, 0x1911, 0x3024, 0x40cb, 0xbf4c, 0x190c, 0x400b, 0x4090, 0xbfcf, 0xb09d, 0x3f1b, 0xb235, 0x1f6d, 0x1a67, 0x4078, 0x4045, 0x066d, 0x404d, 0x4148, 0xba75, 0x1c4a, 0xb219, 0x2277, 0x41f9, 0xb0c6, 0xb2a5, 0x0907, 0xbf4b, 0xb244, 0x0cdc, 0xb2ea, 0x4093, 0x42a8, 0x40e0, 0x3381, 0x0521, 0x41dd, 0xb290, 0x4064, 0xb08d, 0x400b, 0x43fa, 0x4349, 0xbf2b, 0xab6c, 0xb0ed, 0x43df, 0x0ae3, 0x24ae, 0xbf67, 0x407d, 0x1041, 0xbae3, 0x43fe, 0xbf63, 0x4185, 0xb033, 0x40df, 0x4362, 0x30bd, 0x455d, 0xb090, 0x411a, 0x44b3, 0x40da, 0xbf80, 0x41d1, 0xb2eb, 0x3e13, 0x4112, 0x40b0, 0x1f92, 0x407e, 0x36db, 0x41cf, 0x4397, 0x1982, 0xbad6, 0xb0be, 0x240e, 0x1c50, 0xba3f, 0x4224, 0xbfdf, 0xa4fd, 0x42c3, 0x4022, 0x4021, 0x1e68, 0xb23d, 0x43c1, 0x46fc, 0x4667, 0xba1c, 0x381b, 0x4189, 0x4186, 0x42da, 0xba72, 0x4230, 0x2b23, 0x40b4, 0x431c, 0x414c, 0xa472, 0x419e, 0xba03, 0x429b, 0x0c07, 0x1985, 0x412a, 0x3faa, 0x4689, 0xbf8f, 0x41e3, 0x427b, 0xb28d, 0xa220, 0xa8e1, 0x42ad, 0x4302, 0x41d7, 0xb224, 0x4240, 0x4063, 0x418d, 0xb2f7, 0x422d, 0x2633, 0x46f8, 0x13db, 0xbf84, 0x3ef1, 0x434c, 0x115c, 0xbf98, 0xba27, 0x1d98, 0xbf95, 0x4273, 0x1cdc, 0x428c, 0xb215, 0x3d32, 0xb219, 0xba4a, 0x4640, 0x4349, 0x4123, 0xba50, 0x447f, 0x3398, 0x4017, 0x325e, 0x1afd, 0xb20b, 0x1f41, 0xb200, 0x422e, 0x16a1, 0x43b4, 0x1f01, 0xbf58, 0x42f1, 0xb2c7, 0xb269, 0x41c9, 0x4445, 0x42fd, 0x4228, 0x1796, 0x1d3a, 0x40d8, 0xbf23, 0x44ac, 0x433c, 0x41d0, 0x280a, 0x4555, 0x428d, 0xbf48, 0xb219, 0x40e5, 0x4178, 0x4072, 0x438f, 0x4351, 0x45a5, 0x42ed, 0xa654, 0xb27b, 0xbfab, 0x1c9b, 0x42b1, 0xb03b, 0xba2d, 0x19b2, 0x4279, 0x429a, 0x4025, 0x41d4, 0xb228, 0x426f, 0xb2dd, 0xb26b, 0x4377, 0x18e1, 0x1a2d, 0x1e4f, 0x40b3, 0x42e2, 0x4249, 0x1b7c, 0xbaec, 0x40c5, 0x193f, 0x414c, 0xba00, 0x437b, 0x40d7, 0xba26, 0xbf4c, 0x43b5, 0x3b21, 0xab9e, 0x44ac, 0x18b3, 0x40c8, 0xbaed, 0x17c8, 0x3a04, 0x1751, 0x41c0, 0x41b2, 0x41c4, 0xb039, 0xbf01, 0x43de, 0x41f5, 0x1b0f, 0x4336, 0xba08, 0xb03b, 0x41d8, 0x366c, 0x0cf1, 0x4615, 0x412e, 0x4541, 0x030a, 0x28f4, 0x419c, 0x45e3, 0x3ee7, 0x3be2, 0xb031, 0x4301, 0x4327, 0x403a, 0xbad8, 0x425e, 0x42f5, 0xbfaa, 0x413e, 0x448c, 0xafe4, 0x40de, 0x417c, 0xbfb0, 0x22f0, 0xb2de, 0x4197, 0x421f, 0x410f, 0xb2d4, 0x40e4, 0x4117, 0x40ef, 0xbf54, 0x415e, 0xa3a1, 0x42bb, 0x40b0, 0x43b0, 0x4176, 0xb0b5, 0xb2e8, 0x3f9f, 0xba16, 0x4130, 0x412a, 0xbf5b, 0x1a0c, 0x42ba, 0x43e9, 0xa069, 0xb287, 0x41fd, 0xb0f8, 0x4275, 0x4443, 0x2643, 0x41ee, 0xba6b, 0xb25d, 0x32bc, 0xacb5, 0x45e2, 0x1049, 0xbf01, 0x4093, 0x4349, 0xaf09, 0xba72, 0xbadf, 0xbf00, 0xbf3c, 0xb0ff, 0x4190, 0xbf70, 0x4246, 0x1fb4, 0x439b, 0x0a5c, 0x265f, 0x409e, 0x1bae, 0xbae4, 0x20cd, 0x1f9b, 0x1ec0, 0x3cf8, 0xbae2, 0xb0d1, 0xaeaf, 0xbac7, 0x44f2, 0x416f, 0xbf1a, 0x415a, 0x2deb, 0x42f6, 0xa78e, 0x26f7, 0x429c, 0x30db, 0xb0d6, 0x4348, 0x4161, 0x409a, 0x432f, 0xbae7, 0x4105, 0x41b1, 0x4103, 0x1f6d, 0x12bd, 0x4362, 0x42d4, 0xbfa2, 0xbaf3, 0x4287, 0x1c0e, 0xb27a, 0x4628, 0x1861, 0x0bdf, 0x4139, 0x3f0a, 0xbfe0, 0x431b, 0x40bf, 0x403c, 0x24d3, 0x11e4, 0x1802, 0x2b5b, 0xa8ce, 0x15cd, 0x0a73, 0x1f3d, 0x1aa4, 0x41e8, 0xbf7c, 0xba36, 0x1a63, 0x1d63, 0x255d, 0x437d, 0x0969, 0xbac2, 0xba01, 0x4053, 0x40a7, 0x46ec, 0xb2f4, 0x1eab, 0xb243, 0x1a9f, 0x40a3, 0x4488, 0xb217, 0x434b, 0xb22e, 0x36e8, 0xb0a1, 0xb2b3, 0xbf25, 0x33da, 0x37e0, 0x43ad, 0x4418, 0x38ba, 0xa987, 0x4139, 0xbf2a, 0xa07a, 0x39a8, 0xb282, 0xba45, 0x43af, 0xba0b, 0x4275, 0x4273, 0xbad6, 0x435a, 0xb088, 0x402a, 0x40a6, 0xb029, 0x4304, 0xaa79, 0xb263, 0x4094, 0x08e2, 0x42cb, 0x42e7, 0x40dc, 0x1604, 0x43ca, 0x2b37, 0xbfc2, 0x4398, 0x300a, 0x41f9, 0xbf9d, 0x4485, 0xa8ec, 0x3bfb, 0xb23f, 0x0380, 0x3972, 0x40d9, 0x4019, 0x1c09, 0x1091, 0xbadf, 0x40c8, 0x43d0, 0x45aa, 0xbf90, 0xb224, 0x43fb, 0xb25c, 0xbf99, 0xbaf7, 0xb08e, 0x1b57, 0xb202, 0xb26b, 0x4160, 0xb03b, 0x1b50, 0x1f3c, 0x4107, 0x4027, 0x446f, 0x4183, 0x323e, 0xa035, 0x41ff, 0x415d, 0xbaff, 0x4634, 0x430a, 0x434f, 0x414d, 0xba3f, 0x1c05, 0xb0e7, 0xbf6b, 0x43e5, 0x3391, 0x1fed, 0x4341, 0x46f3, 0x4280, 0x4103, 0x401e, 0x1e8c, 0xba73, 0x4110, 0x404e, 0x2e56, 0x1b29, 0x1fc5, 0x4562, 0x418f, 0xbfa1, 0x414a, 0xb2fd, 0x42e9, 0xb2c3, 0x4170, 0xb242, 0x4371, 0x160c, 0xb0da, 0x3438, 0xba7e, 0xba02, 0x40ac, 0xbf92, 0x438b, 0x4009, 0x41b3, 0xbae1, 0xb26c, 0x060c, 0x4023, 0x4377, 0x35b8, 0x413d, 0x411a, 0x43b2, 0x0ad3, 0x42a6, 0xbf00, 0x4279, 0x1fe4, 0xb228, 0x42f0, 0x0ab4, 0x41bf, 0x41f0, 0x24fe, 0xbf67, 0x2bbb, 0x0f1e, 0x4101, 0x4402, 0xb2f6, 0x435e, 0xba00, 0xbfb0, 0x41bd, 0x4540, 0xbfb8, 0x1ba4, 0xb25c, 0x1478, 0x415b, 0xb01a, 0x4067, 0xa8f1, 0x429b, 0x1211, 0x42d8, 0xbf6b, 0x42b0, 0xba0f, 0x4175, 0x42a3, 0x3eba, 0x418b, 0x3558, 0x4044, 0x1c92, 0x40ee, 0x4345, 0x429a, 0x42f0, 0xbac9, 0x46b4, 0x429d, 0xbf0a, 0x4338, 0x418b, 0x43c0, 0x4224, 0xbf0f, 0xaa79, 0xba2e, 0x2cfb, 0xa092, 0x4003, 0x2293, 0xb2fb, 0x1a02, 0x4298, 0x4204, 0x41f3, 0x255f, 0x1884, 0xbfc0, 0x403a, 0x407b, 0xb044, 0xbf5d, 0x12b1, 0x3384, 0x4336, 0xb05d, 0x42be, 0x419e, 0xb2ad, 0xba4a, 0x4117, 0xba5b, 0xb292, 0xbafd, 0x428e, 0x43f5, 0x40f8, 0x4601, 0x406b, 0xae07, 0x42e5, 0x4053, 0x4068, 0xb0b4, 0x3961, 0x4340, 0x37c8, 0xbfcb, 0x423c, 0xa03f, 0x4342, 0x423c, 0xbf88, 0x0fdd, 0x4193, 0xb2d9, 0x43da, 0xbfa0, 0x1396, 0x40af, 0x4317, 0xa51a, 0x211a, 0xadb9, 0x433e, 0xba22, 0x41f9, 0x180e, 0x411c, 0xba61, 0x4001, 0x4268, 0x03fc, 0xbf00, 0xb281, 0xb23f, 0xbae2, 0xbf80, 0xbf65, 0x43e1, 0x394f, 0x35a0, 0x329b, 0x422f, 0x4164, 0x0d8f, 0x4237, 0x465a, 0x43b6, 0xbaf0, 0xbfe0, 0xbf11, 0x4267, 0xba2f, 0x41a6, 0xb210, 0x4221, 0x4319, 0x1482, 0x3205, 0xb256, 0x2dfd, 0xba01, 0x402a, 0xb2ca, 0x163f, 0x432d, 0x41fd, 0x4161, 0xb0b4, 0x42f8, 0x40c2, 0x1aa5, 0x4167, 0xb051, 0x0978, 0x4149, 0xbf1f, 0x4175, 0x43fa, 0xb252, 0x4140, 0x4215, 0xba55, 0xb2d2, 0x4210, 0x406a, 0xaf57, 0xacee, 0xa935, 0xba5d, 0x4259, 0x05bf, 0xb015, 0x43e6, 0x4192, 0xa8db, 0x44e2, 0x1588, 0x0d4d, 0x437f, 0x0618, 0xbfdb, 0x41e3, 0x4108, 0xa17e, 0x416f, 0x1b33, 0x42df, 0x438e, 0x41d0, 0xbfb1, 0x0d0f, 0xb28f, 0xba4b, 0x3c20, 0x42e3, 0x0f9b, 0x41af, 0x40fd, 0x415c, 0x40f5, 0x436d, 0xa5a7, 0xa82e, 0xba46, 0x42ac, 0xb204, 0x4067, 0x438d, 0x40e0, 0x09d3, 0xaaf7, 0xbf79, 0x4386, 0x1b23, 0x41ea, 0x4010, 0xbff0, 0x4491, 0xa083, 0xb227, 0xb2d3, 0x4196, 0x1c87, 0xb22a, 0xb09b, 0x01cd, 0x1c6f, 0xafc3, 0x43be, 0xa9d2, 0x42c6, 0x0ad5, 0x4341, 0x432b, 0xba5c, 0xb0bc, 0x4120, 0x412e, 0x4475, 0x4284, 0xb01b, 0xbfda, 0xa893, 0x1afa, 0xa310, 0x40f9, 0xb25d, 0x42b4, 0xb00e, 0xb06b, 0xb26e, 0x43eb, 0x4237, 0x40a9, 0x4369, 0x40cc, 0x4233, 0x40fc, 0x3d00, 0x43aa, 0xb2d7, 0x40bc, 0xbf00, 0xb296, 0xb223, 0x0c49, 0xaaff, 0x4180, 0x18bc, 0xbf70, 0xbf6c, 0x430a, 0xb208, 0x0bd5, 0x1bcd, 0x421c, 0xb289, 0xb250, 0xbf1e, 0x41b7, 0x44fa, 0xb0f3, 0x2760, 0x1c87, 0x189c, 0xb217, 0x41a3, 0xaf06, 0xbfb4, 0x422b, 0x2caf, 0x1b6f, 0x429c, 0x406b, 0x417d, 0x41c5, 0xa01c, 0xb258, 0x43ee, 0x1c6b, 0x4171, 0xb0ab, 0xa87d, 0x40e3, 0x1b3f, 0xba4a, 0xbf46, 0x3418, 0x19da, 0xa67e, 0x4223, 0x3401, 0x3b45, 0x2a8f, 0x45ab, 0xb249, 0xb2d7, 0x416d, 0xbf80, 0x1b06, 0xba61, 0x070c, 0xb2e8, 0x4394, 0x3fb6, 0x41b7, 0xbf56, 0x4087, 0x42fa, 0xb01d, 0x438c, 0x1fb3, 0xbae0, 0xb01a, 0xa6da, 0x4396, 0xb009, 0x3260, 0x4347, 0x4097, 0xb06f, 0x42b9, 0x2e15, 0xb033, 0x4253, 0x43a3, 0x0261, 0x1e9b, 0x4657, 0xb2fb, 0xb288, 0xbf9e, 0x42ed, 0x43d9, 0xba33, 0x4770, 0xe7fe + ], + StartRegs = [0x3e63c940, 0xd2f40362, 0xbb77737e, 0x677685e4, 0x97ccf408, 0x3dfa0433, 0x43332c01, 0xa5fc83ef, 0x5b5a10e7, 0x93fd7fe6, 0xe271cf59, 0xac70a2fd, 0xc4be1954, 0x93de22cc, 0x00000000, 0x900001f0 + ], + FinalRegs = [0x00000000, 0x00000000, 0xfffff05f, 0x00000059, 0x00000000, 0x00000020, 0x00001000, 0xe271cf59, 0x49f6f315, 0x93de1f28, 0xe271cf59, 0x00000000, 0x00000000, 0x93de1f1c, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x4010, 0x421c, 0x3d78, 0x4344, 0x43d7, 0x401a, 0x1ce0, 0x4051, 0xb2b6, 0x0a48, 0xbad9, 0x4206, 0x4163, 0x1efa, 0x402d, 0x1e69, 0x4221, 0xbfba, 0x4154, 0xb2b8, 0x19e2, 0xb243, 0x15ea, 0x406b, 0x46d3, 0x4546, 0x417a, 0x41b7, 0xba61, 0x41fd, 0x41d5, 0x45bd, 0xb0fa, 0x0951, 0x454f, 0x0377, 0x4262, 0xb097, 0xb04b, 0xb277, 0x37da, 0xbfcc, 0x15dc, 0x4385, 0x18c8, 0xb22d, 0x412b, 0xb029, 0xba75, 0x411d, 0x14c5, 0x456f, 0xbaf2, 0xba3d, 0x45f3, 0xb0da, 0xb087, 0x4253, 0x411a, 0xb2fa, 0x469d, 0x44cd, 0x0459, 0x4410, 0x1378, 0x1239, 0xbf2d, 0x423d, 0x070b, 0x4353, 0x43a9, 0xb015, 0x4301, 0xbae3, 0x0c4b, 0x46bd, 0x4013, 0x3765, 0x4147, 0xbf59, 0x1d79, 0x2918, 0xb014, 0xb223, 0x4202, 0x1ceb, 0x18bb, 0x4274, 0xaa53, 0x4201, 0xbacc, 0xa37f, 0xb0af, 0x411f, 0x41cf, 0x186b, 0x40cd, 0x14ec, 0x4018, 0x435d, 0x327d, 0x43eb, 0x4305, 0xbf64, 0x13ef, 0x40d6, 0x4095, 0x369f, 0x4065, 0x41b3, 0x1cc7, 0xbf8b, 0xb297, 0x432e, 0x4268, 0x4002, 0x430a, 0x4479, 0xb048, 0x421e, 0x1ca3, 0xa979, 0xb01d, 0x4459, 0x07f7, 0xb262, 0x1862, 0xb289, 0xb211, 0xbac9, 0x43cd, 0xbfdf, 0xb072, 0x421a, 0x412d, 0x2962, 0x46ec, 0xb09e, 0x1e20, 0x44c1, 0xbfd1, 0xb00c, 0x437b, 0x18ee, 0x41e2, 0xba0c, 0xba2c, 0x04b5, 0xb05b, 0x4596, 0xa87e, 0x422a, 0x40cc, 0x4002, 0x40a3, 0xb041, 0xbf8b, 0x40d4, 0xb0c0, 0x41b8, 0x45e3, 0x3460, 0xb24b, 0xb285, 0xbf04, 0x4225, 0x4064, 0x420a, 0xbf34, 0x43ed, 0x0cab, 0x4194, 0x0ffb, 0x41b8, 0x43e0, 0x4173, 0xbf9a, 0x3fab, 0x210e, 0xa820, 0x426a, 0x4395, 0x43ee, 0x3657, 0xbfc0, 0x430b, 0x438b, 0x1b6d, 0x1c7b, 0xb231, 0x42f2, 0x439e, 0x4389, 0x41b5, 0x4082, 0x1de1, 0x1ca6, 0xbfd0, 0x34cc, 0x1dda, 0xae7c, 0x4181, 0xbf2f, 0x410f, 0xbaf2, 0x40aa, 0x409e, 0x13c8, 0x4076, 0x1bd4, 0x4020, 0x4128, 0xba1f, 0xb24b, 0xa578, 0xaabf, 0x4049, 0xa063, 0x418b, 0xbafd, 0x407c, 0xb234, 0x4380, 0x4288, 0x43e2, 0xbf38, 0x422b, 0xbf80, 0x43b2, 0x43fc, 0x3c13, 0x4282, 0xab63, 0x41db, 0x298d, 0xba1e, 0x1f37, 0x41e6, 0x464d, 0xb031, 0x4380, 0x467c, 0x1b44, 0xbf07, 0x1891, 0x0bcc, 0x420c, 0x4330, 0x4038, 0x4155, 0x4162, 0x4421, 0x4071, 0xbafd, 0x1b7a, 0x42b8, 0x37f8, 0x46aa, 0x0159, 0xb28a, 0x43cf, 0x43ba, 0xb056, 0x43b4, 0xb067, 0xbf35, 0x46fa, 0x40e7, 0x45c4, 0x42dd, 0xbfa3, 0x1995, 0x407b, 0x3862, 0x43bd, 0x0793, 0xbaf8, 0x1f40, 0x40fd, 0x1a53, 0xbf7f, 0x384d, 0x261a, 0x416d, 0x4200, 0x204f, 0x40e1, 0xb0eb, 0x0a31, 0x43ac, 0xb266, 0x1b0e, 0x4127, 0x27e7, 0x4570, 0x2786, 0x40e4, 0xb23c, 0x44dd, 0x4125, 0xbf6a, 0x402a, 0x40f1, 0x4161, 0x45f1, 0x18cf, 0x1e84, 0xba1e, 0x42dd, 0x406e, 0x09d5, 0xbac2, 0xaa6d, 0x4128, 0x226e, 0xb26e, 0xaf3c, 0x0e65, 0xbf75, 0x45d1, 0x18a2, 0x433e, 0x2402, 0x41e3, 0x43cb, 0x427f, 0xbac3, 0x4180, 0x1df8, 0x41c7, 0x1bf7, 0x439f, 0xab0c, 0x4463, 0xbf4a, 0x43d8, 0x44ba, 0x415a, 0x40d1, 0x4167, 0x4026, 0x0966, 0x423e, 0x1de0, 0x41f5, 0xb07c, 0x4628, 0x4288, 0x460a, 0x1376, 0xbf94, 0x4364, 0x41f7, 0x43de, 0xba74, 0x4027, 0x4453, 0x1dd1, 0x1a65, 0xa7ce, 0xb2c5, 0x4658, 0xb29b, 0xb2b8, 0x18be, 0xb2bc, 0xb022, 0x402c, 0xba7a, 0x0b2a, 0x40d6, 0xba03, 0xbf27, 0x4613, 0x1739, 0x1c8d, 0xb258, 0x1f23, 0xba74, 0x45e6, 0x1b3c, 0x4090, 0x0567, 0xbf4c, 0x1e05, 0xba36, 0xb2a9, 0xbfa5, 0xbae7, 0xafde, 0xba56, 0xb2c6, 0x08f6, 0xb0e6, 0x42dd, 0xbf74, 0xb0a8, 0x2a22, 0x1c73, 0x0bf3, 0xa2ab, 0x4359, 0x07b8, 0x40ea, 0x4207, 0xba17, 0x3f61, 0x1f21, 0x4040, 0x41ed, 0xbae2, 0xba23, 0x42d9, 0xb2e5, 0xa1b9, 0xb0a8, 0xa31a, 0xbf02, 0x1e10, 0xba2a, 0xb20d, 0x4261, 0x4013, 0x1b84, 0x40ce, 0xb218, 0xabc9, 0x1aa3, 0xba7f, 0x42e1, 0x4322, 0x41a1, 0x2a78, 0x4245, 0x46f0, 0x4189, 0x4164, 0xb080, 0x4003, 0x145d, 0xbf67, 0xba42, 0xa206, 0x1c5f, 0x4353, 0x441d, 0xb220, 0xbf3f, 0xba17, 0x416a, 0xb04e, 0x40e8, 0x40f1, 0x41ca, 0xbfb5, 0xba7b, 0xb2e2, 0x1300, 0xb0d2, 0xb03d, 0x435e, 0xb297, 0x1980, 0x4074, 0xbfcc, 0xa9ef, 0x0790, 0x464b, 0x3062, 0x4238, 0x3c74, 0x1fad, 0x34e8, 0x467f, 0xaa62, 0xa96d, 0xbf13, 0xbad9, 0x1c8e, 0xb21f, 0x4236, 0x4249, 0x40d1, 0x4371, 0x4130, 0x4066, 0x274a, 0x4073, 0xb2ee, 0x2f2d, 0x1a18, 0x26db, 0xb206, 0xb26b, 0x44d0, 0xb21e, 0x0cc4, 0xba08, 0x401b, 0xb0a5, 0xbf3b, 0x4362, 0xbf70, 0x4205, 0x432f, 0xba36, 0x4015, 0xb264, 0x4021, 0xb2e6, 0x40ff, 0x4323, 0xbadb, 0x22db, 0x0a58, 0xbf90, 0xb2a7, 0x378b, 0xbfc0, 0x4334, 0x41ff, 0x41a6, 0xab67, 0x4149, 0x42bf, 0x4295, 0xbf00, 0xbf82, 0xa510, 0xb2ac, 0x429a, 0x1e48, 0x2779, 0x4316, 0x1d29, 0x41b7, 0x408a, 0x4213, 0xba3c, 0x1423, 0xbfd2, 0x4647, 0x41ed, 0x219f, 0xbf8f, 0xba7d, 0x1ada, 0x1e7f, 0x3e40, 0x4325, 0x4166, 0x4206, 0x4335, 0x33d2, 0xb22b, 0x1f30, 0x42da, 0x402e, 0x43c6, 0xbfd6, 0x4312, 0xb2d3, 0x41c1, 0xb22a, 0x438d, 0x02af, 0xbf4a, 0x41d6, 0x0ac5, 0x40eb, 0xb00d, 0x41c8, 0x09ce, 0xb276, 0xbfd3, 0x24d8, 0x44b9, 0x4581, 0x4156, 0x071a, 0xba20, 0xb2ee, 0x41cd, 0xa9ca, 0xbf80, 0x2ad3, 0x4242, 0x4040, 0x1ba8, 0xb2c0, 0x41df, 0xbfab, 0xbad7, 0x1efd, 0x418e, 0xba0d, 0x2484, 0x41d0, 0x1b17, 0x402f, 0xb2c3, 0xb062, 0x02be, 0xbfbe, 0x0c82, 0x41c5, 0xba53, 0xa095, 0xa516, 0x1939, 0x43bf, 0x1e52, 0x408a, 0x2dff, 0x4001, 0x4146, 0x439e, 0x4397, 0xbf00, 0x40db, 0xba6a, 0x4445, 0x429d, 0xb2f1, 0x1d3d, 0x43a0, 0xbf74, 0x4246, 0xb096, 0xa063, 0xb269, 0x3cbc, 0x4552, 0xb221, 0xba52, 0xbadc, 0x4211, 0x3825, 0xb2db, 0xbfa0, 0xba0c, 0x3ad0, 0xb261, 0x4170, 0x430c, 0x41ec, 0x1dd5, 0x0d4d, 0x4140, 0x1a8b, 0x1904, 0xbfa5, 0x41f9, 0xba0c, 0x436d, 0x1d2a, 0x3b51, 0xba39, 0x4014, 0x40f5, 0x40a8, 0x415d, 0x2e7c, 0x3625, 0xb283, 0x421b, 0x2b20, 0x205e, 0x2a8e, 0x43be, 0xba39, 0xbf33, 0x4173, 0x2675, 0x10d5, 0x284b, 0x4227, 0xaaa0, 0x1bcb, 0x1c0e, 0x2a8d, 0x43fa, 0x417e, 0x4379, 0x4096, 0x1d43, 0x409a, 0x42b3, 0xba76, 0x0be7, 0x4316, 0xaed0, 0xbf1d, 0x407c, 0x42da, 0x18c3, 0x1f4d, 0x420e, 0x2a5f, 0xbfa9, 0x40a8, 0x1eb0, 0x4273, 0x40ea, 0x43d0, 0x07e3, 0xb210, 0xba4c, 0x41a8, 0xb294, 0xbf5d, 0x1a32, 0xbafd, 0x4031, 0xa0dc, 0xb2d0, 0x40bb, 0x431e, 0xbf73, 0x4186, 0x4054, 0x36b8, 0x40f2, 0x18fa, 0x1dc6, 0x431a, 0x4298, 0x43a4, 0x25c7, 0x1976, 0x1aa5, 0x41e8, 0x43cb, 0xbfb0, 0xbf58, 0x4328, 0xbf02, 0x43ad, 0x4118, 0xb0b3, 0x40cc, 0x24f8, 0x40e8, 0x4127, 0xa3a1, 0x30df, 0xb238, 0x3b0a, 0xb274, 0x4210, 0xb296, 0x4131, 0xb2dc, 0x37ca, 0x4243, 0x405c, 0x45ab, 0xbf2b, 0x270b, 0xbae4, 0x1bcd, 0x4396, 0x438b, 0x1ed0, 0xbf80, 0x2b6e, 0x436a, 0xb2ea, 0x437f, 0x4606, 0x1f3f, 0x4269, 0x0f94, 0xb223, 0x0628, 0xbf98, 0xbf60, 0xb234, 0xb23d, 0x43be, 0x4137, 0x40fe, 0x41f4, 0x40f5, 0xa3f3, 0xb2ba, 0xba6a, 0x4126, 0x4364, 0xb2f1, 0x42e2, 0xba6b, 0xb0b8, 0x199e, 0xb22a, 0x41e9, 0x461f, 0x431f, 0x44cd, 0x1bdb, 0x1b8e, 0x1deb, 0xbf3c, 0x253b, 0x4355, 0x41ad, 0x4340, 0x40ab, 0x1952, 0x40d0, 0x1cee, 0x43cd, 0xbad6, 0x2461, 0xbf28, 0x28e7, 0xbad3, 0x4420, 0xb29b, 0x436d, 0xb01c, 0xa3bc, 0x4173, 0x4194, 0xb2f1, 0x4298, 0xb0d3, 0xbfb0, 0xb200, 0x415d, 0x406e, 0xba4e, 0x4182, 0x41a4, 0x4207, 0x40dc, 0xbaec, 0x193c, 0x415a, 0x4317, 0xbf83, 0x1e0b, 0x3d29, 0x40a1, 0x4333, 0xb046, 0xaf27, 0x1988, 0xb28a, 0xb204, 0x16d6, 0xac6b, 0x425b, 0x1f0d, 0x4251, 0x408e, 0x42de, 0x464c, 0xbfae, 0x40e7, 0x44b8, 0x43fc, 0x4065, 0x4333, 0x4479, 0x0559, 0xbaeb, 0xb252, 0x41f3, 0x4380, 0xb230, 0x46c0, 0x44a0, 0xbf8e, 0xb023, 0x4288, 0x4017, 0x406b, 0x4288, 0x4398, 0x18cc, 0xabdd, 0x429a, 0x42ab, 0xbf95, 0x43f2, 0x4057, 0x4442, 0x40ee, 0x4111, 0x4358, 0xa518, 0x34fa, 0x4180, 0x3ecd, 0x4223, 0xb265, 0x42a4, 0x1f7c, 0xb296, 0x1d3c, 0x430f, 0x442d, 0x4307, 0x437a, 0xbf27, 0x1d82, 0x391c, 0xb2a8, 0xbae1, 0x40a0, 0x41b3, 0x40e2, 0xb27e, 0x43a4, 0xafdf, 0x43ad, 0xb024, 0x40e0, 0x4048, 0x3c42, 0x1d9d, 0x1954, 0x0cd9, 0xbf4b, 0x4236, 0xa2ef, 0x424e, 0xbac2, 0xba67, 0x4103, 0x43eb, 0x1d60, 0x459e, 0x4059, 0x41b5, 0xbf83, 0x4310, 0xba42, 0x3684, 0xb299, 0x43ca, 0x1f66, 0x43e1, 0x1358, 0xb08d, 0x41ee, 0x1b3a, 0x4386, 0x40ad, 0x43fd, 0x4653, 0xb0bc, 0xb2ac, 0x405b, 0x037e, 0x418c, 0x1887, 0x42bd, 0x05ee, 0x46ed, 0x4238, 0x4062, 0x43f9, 0xbfad, 0x461f, 0xb0fa, 0x3e21, 0x411c, 0x403b, 0x2342, 0x3259, 0x076d, 0xbf81, 0x4009, 0x4152, 0xba08, 0x1811, 0x4312, 0x32f2, 0x1b6f, 0x408c, 0x43d8, 0x437e, 0x40c1, 0x40a1, 0x40cd, 0x43af, 0x2042, 0x4342, 0x4082, 0x4029, 0xa300, 0xbf49, 0xb076, 0x421e, 0x45a2, 0x185f, 0xba07, 0x4283, 0x4306, 0x3c84, 0x454f, 0x42d5, 0x4071, 0xae63, 0xb2b0, 0xab50, 0x21b6, 0x4024, 0x4485, 0xb292, 0xb266, 0x424d, 0x1559, 0x0623, 0x42e7, 0xb2e3, 0x4094, 0xbf38, 0x4378, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xfbee3e06, 0xf7bc3994, 0x7ccee582, 0x65c6dfd8, 0x7d765d73, 0x2669bec2, 0x4d20d1a8, 0x414bdcb0, 0x53f02dc6, 0xad07dc25, 0xbd4dd249, 0x070bd4e7, 0x1404f4cb, 0x80985f65, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0x000061d2, 0xfffffdef, 0x00000000, 0x0000007c, 0xffffff7c, 0xffffff4a, 0x0000007c, 0x42000000, 0x0b273264, 0x00a885eb, 0x0b273265, 0xbd4dd249, 0x00000322, 0xbdf6c218, 0x00000000, 0xa00001d0 }, + Instructions = [0x4010, 0x421c, 0x3d78, 0x4344, 0x43d7, 0x401a, 0x1ce0, 0x4051, 0xb2b6, 0x0a48, 0xbad9, 0x4206, 0x4163, 0x1efa, 0x402d, 0x1e69, 0x4221, 0xbfba, 0x4154, 0xb2b8, 0x19e2, 0xb243, 0x15ea, 0x406b, 0x46d3, 0x4546, 0x417a, 0x41b7, 0xba61, 0x41fd, 0x41d5, 0x45bd, 0xb0fa, 0x0951, 0x454f, 0x0377, 0x4262, 0xb097, 0xb04b, 0xb277, 0x37da, 0xbfcc, 0x15dc, 0x4385, 0x18c8, 0xb22d, 0x412b, 0xb029, 0xba75, 0x411d, 0x14c5, 0x456f, 0xbaf2, 0xba3d, 0x45f3, 0xb0da, 0xb087, 0x4253, 0x411a, 0xb2fa, 0x469d, 0x44cd, 0x0459, 0x4410, 0x1378, 0x1239, 0xbf2d, 0x423d, 0x070b, 0x4353, 0x43a9, 0xb015, 0x4301, 0xbae3, 0x0c4b, 0x46bd, 0x4013, 0x3765, 0x4147, 0xbf59, 0x1d79, 0x2918, 0xb014, 0xb223, 0x4202, 0x1ceb, 0x18bb, 0x4274, 0xaa53, 0x4201, 0xbacc, 0xa37f, 0xb0af, 0x411f, 0x41cf, 0x186b, 0x40cd, 0x14ec, 0x4018, 0x435d, 0x327d, 0x43eb, 0x4305, 0xbf64, 0x13ef, 0x40d6, 0x4095, 0x369f, 0x4065, 0x41b3, 0x1cc7, 0xbf8b, 0xb297, 0x432e, 0x4268, 0x4002, 0x430a, 0x4479, 0xb048, 0x421e, 0x1ca3, 0xa979, 0xb01d, 0x4459, 0x07f7, 0xb262, 0x1862, 0xb289, 0xb211, 0xbac9, 0x43cd, 0xbfdf, 0xb072, 0x421a, 0x412d, 0x2962, 0x46ec, 0xb09e, 0x1e20, 0x44c1, 0xbfd1, 0xb00c, 0x437b, 0x18ee, 0x41e2, 0xba0c, 0xba2c, 0x04b5, 0xb05b, 0x4596, 0xa87e, 0x422a, 0x40cc, 0x4002, 0x40a3, 0xb041, 0xbf8b, 0x40d4, 0xb0c0, 0x41b8, 0x45e3, 0x3460, 0xb24b, 0xb285, 0xbf04, 0x4225, 0x4064, 0x420a, 0xbf34, 0x43ed, 0x0cab, 0x4194, 0x0ffb, 0x41b8, 0x43e0, 0x4173, 0xbf9a, 0x3fab, 0x210e, 0xa820, 0x426a, 0x4395, 0x43ee, 0x3657, 0xbfc0, 0x430b, 0x438b, 0x1b6d, 0x1c7b, 0xb231, 0x42f2, 0x439e, 0x4389, 0x41b5, 0x4082, 0x1de1, 0x1ca6, 0xbfd0, 0x34cc, 0x1dda, 0xae7c, 0x4181, 0xbf2f, 0x410f, 0xbaf2, 0x40aa, 0x409e, 0x13c8, 0x4076, 0x1bd4, 0x4020, 0x4128, 0xba1f, 0xb24b, 0xa578, 0xaabf, 0x4049, 0xa063, 0x418b, 0xbafd, 0x407c, 0xb234, 0x4380, 0x4288, 0x43e2, 0xbf38, 0x422b, 0xbf80, 0x43b2, 0x43fc, 0x3c13, 0x4282, 0xab63, 0x41db, 0x298d, 0xba1e, 0x1f37, 0x41e6, 0x464d, 0xb031, 0x4380, 0x467c, 0x1b44, 0xbf07, 0x1891, 0x0bcc, 0x420c, 0x4330, 0x4038, 0x4155, 0x4162, 0x4421, 0x4071, 0xbafd, 0x1b7a, 0x42b8, 0x37f8, 0x46aa, 0x0159, 0xb28a, 0x43cf, 0x43ba, 0xb056, 0x43b4, 0xb067, 0xbf35, 0x46fa, 0x40e7, 0x45c4, 0x42dd, 0xbfa3, 0x1995, 0x407b, 0x3862, 0x43bd, 0x0793, 0xbaf8, 0x1f40, 0x40fd, 0x1a53, 0xbf7f, 0x384d, 0x261a, 0x416d, 0x4200, 0x204f, 0x40e1, 0xb0eb, 0x0a31, 0x43ac, 0xb266, 0x1b0e, 0x4127, 0x27e7, 0x4570, 0x2786, 0x40e4, 0xb23c, 0x44dd, 0x4125, 0xbf6a, 0x402a, 0x40f1, 0x4161, 0x45f1, 0x18cf, 0x1e84, 0xba1e, 0x42dd, 0x406e, 0x09d5, 0xbac2, 0xaa6d, 0x4128, 0x226e, 0xb26e, 0xaf3c, 0x0e65, 0xbf75, 0x45d1, 0x18a2, 0x433e, 0x2402, 0x41e3, 0x43cb, 0x427f, 0xbac3, 0x4180, 0x1df8, 0x41c7, 0x1bf7, 0x439f, 0xab0c, 0x4463, 0xbf4a, 0x43d8, 0x44ba, 0x415a, 0x40d1, 0x4167, 0x4026, 0x0966, 0x423e, 0x1de0, 0x41f5, 0xb07c, 0x4628, 0x4288, 0x460a, 0x1376, 0xbf94, 0x4364, 0x41f7, 0x43de, 0xba74, 0x4027, 0x4453, 0x1dd1, 0x1a65, 0xa7ce, 0xb2c5, 0x4658, 0xb29b, 0xb2b8, 0x18be, 0xb2bc, 0xb022, 0x402c, 0xba7a, 0x0b2a, 0x40d6, 0xba03, 0xbf27, 0x4613, 0x1739, 0x1c8d, 0xb258, 0x1f23, 0xba74, 0x45e6, 0x1b3c, 0x4090, 0x0567, 0xbf4c, 0x1e05, 0xba36, 0xb2a9, 0xbfa5, 0xbae7, 0xafde, 0xba56, 0xb2c6, 0x08f6, 0xb0e6, 0x42dd, 0xbf74, 0xb0a8, 0x2a22, 0x1c73, 0x0bf3, 0xa2ab, 0x4359, 0x07b8, 0x40ea, 0x4207, 0xba17, 0x3f61, 0x1f21, 0x4040, 0x41ed, 0xbae2, 0xba23, 0x42d9, 0xb2e5, 0xa1b9, 0xb0a8, 0xa31a, 0xbf02, 0x1e10, 0xba2a, 0xb20d, 0x4261, 0x4013, 0x1b84, 0x40ce, 0xb218, 0xabc9, 0x1aa3, 0xba7f, 0x42e1, 0x4322, 0x41a1, 0x2a78, 0x4245, 0x46f0, 0x4189, 0x4164, 0xb080, 0x4003, 0x145d, 0xbf67, 0xba42, 0xa206, 0x1c5f, 0x4353, 0x441d, 0xb220, 0xbf3f, 0xba17, 0x416a, 0xb04e, 0x40e8, 0x40f1, 0x41ca, 0xbfb5, 0xba7b, 0xb2e2, 0x1300, 0xb0d2, 0xb03d, 0x435e, 0xb297, 0x1980, 0x4074, 0xbfcc, 0xa9ef, 0x0790, 0x464b, 0x3062, 0x4238, 0x3c74, 0x1fad, 0x34e8, 0x467f, 0xaa62, 0xa96d, 0xbf13, 0xbad9, 0x1c8e, 0xb21f, 0x4236, 0x4249, 0x40d1, 0x4371, 0x4130, 0x4066, 0x274a, 0x4073, 0xb2ee, 0x2f2d, 0x1a18, 0x26db, 0xb206, 0xb26b, 0x44d0, 0xb21e, 0x0cc4, 0xba08, 0x401b, 0xb0a5, 0xbf3b, 0x4362, 0xbf70, 0x4205, 0x432f, 0xba36, 0x4015, 0xb264, 0x4021, 0xb2e6, 0x40ff, 0x4323, 0xbadb, 0x22db, 0x0a58, 0xbf90, 0xb2a7, 0x378b, 0xbfc0, 0x4334, 0x41ff, 0x41a6, 0xab67, 0x4149, 0x42bf, 0x4295, 0xbf00, 0xbf82, 0xa510, 0xb2ac, 0x429a, 0x1e48, 0x2779, 0x4316, 0x1d29, 0x41b7, 0x408a, 0x4213, 0xba3c, 0x1423, 0xbfd2, 0x4647, 0x41ed, 0x219f, 0xbf8f, 0xba7d, 0x1ada, 0x1e7f, 0x3e40, 0x4325, 0x4166, 0x4206, 0x4335, 0x33d2, 0xb22b, 0x1f30, 0x42da, 0x402e, 0x43c6, 0xbfd6, 0x4312, 0xb2d3, 0x41c1, 0xb22a, 0x438d, 0x02af, 0xbf4a, 0x41d6, 0x0ac5, 0x40eb, 0xb00d, 0x41c8, 0x09ce, 0xb276, 0xbfd3, 0x24d8, 0x44b9, 0x4581, 0x4156, 0x071a, 0xba20, 0xb2ee, 0x41cd, 0xa9ca, 0xbf80, 0x2ad3, 0x4242, 0x4040, 0x1ba8, 0xb2c0, 0x41df, 0xbfab, 0xbad7, 0x1efd, 0x418e, 0xba0d, 0x2484, 0x41d0, 0x1b17, 0x402f, 0xb2c3, 0xb062, 0x02be, 0xbfbe, 0x0c82, 0x41c5, 0xba53, 0xa095, 0xa516, 0x1939, 0x43bf, 0x1e52, 0x408a, 0x2dff, 0x4001, 0x4146, 0x439e, 0x4397, 0xbf00, 0x40db, 0xba6a, 0x4445, 0x429d, 0xb2f1, 0x1d3d, 0x43a0, 0xbf74, 0x4246, 0xb096, 0xa063, 0xb269, 0x3cbc, 0x4552, 0xb221, 0xba52, 0xbadc, 0x4211, 0x3825, 0xb2db, 0xbfa0, 0xba0c, 0x3ad0, 0xb261, 0x4170, 0x430c, 0x41ec, 0x1dd5, 0x0d4d, 0x4140, 0x1a8b, 0x1904, 0xbfa5, 0x41f9, 0xba0c, 0x436d, 0x1d2a, 0x3b51, 0xba39, 0x4014, 0x40f5, 0x40a8, 0x415d, 0x2e7c, 0x3625, 0xb283, 0x421b, 0x2b20, 0x205e, 0x2a8e, 0x43be, 0xba39, 0xbf33, 0x4173, 0x2675, 0x10d5, 0x284b, 0x4227, 0xaaa0, 0x1bcb, 0x1c0e, 0x2a8d, 0x43fa, 0x417e, 0x4379, 0x4096, 0x1d43, 0x409a, 0x42b3, 0xba76, 0x0be7, 0x4316, 0xaed0, 0xbf1d, 0x407c, 0x42da, 0x18c3, 0x1f4d, 0x420e, 0x2a5f, 0xbfa9, 0x40a8, 0x1eb0, 0x4273, 0x40ea, 0x43d0, 0x07e3, 0xb210, 0xba4c, 0x41a8, 0xb294, 0xbf5d, 0x1a32, 0xbafd, 0x4031, 0xa0dc, 0xb2d0, 0x40bb, 0x431e, 0xbf73, 0x4186, 0x4054, 0x36b8, 0x40f2, 0x18fa, 0x1dc6, 0x431a, 0x4298, 0x43a4, 0x25c7, 0x1976, 0x1aa5, 0x41e8, 0x43cb, 0xbfb0, 0xbf58, 0x4328, 0xbf02, 0x43ad, 0x4118, 0xb0b3, 0x40cc, 0x24f8, 0x40e8, 0x4127, 0xa3a1, 0x30df, 0xb238, 0x3b0a, 0xb274, 0x4210, 0xb296, 0x4131, 0xb2dc, 0x37ca, 0x4243, 0x405c, 0x45ab, 0xbf2b, 0x270b, 0xbae4, 0x1bcd, 0x4396, 0x438b, 0x1ed0, 0xbf80, 0x2b6e, 0x436a, 0xb2ea, 0x437f, 0x4606, 0x1f3f, 0x4269, 0x0f94, 0xb223, 0x0628, 0xbf98, 0xbf60, 0xb234, 0xb23d, 0x43be, 0x4137, 0x40fe, 0x41f4, 0x40f5, 0xa3f3, 0xb2ba, 0xba6a, 0x4126, 0x4364, 0xb2f1, 0x42e2, 0xba6b, 0xb0b8, 0x199e, 0xb22a, 0x41e9, 0x461f, 0x431f, 0x44cd, 0x1bdb, 0x1b8e, 0x1deb, 0xbf3c, 0x253b, 0x4355, 0x41ad, 0x4340, 0x40ab, 0x1952, 0x40d0, 0x1cee, 0x43cd, 0xbad6, 0x2461, 0xbf28, 0x28e7, 0xbad3, 0x4420, 0xb29b, 0x436d, 0xb01c, 0xa3bc, 0x4173, 0x4194, 0xb2f1, 0x4298, 0xb0d3, 0xbfb0, 0xb200, 0x415d, 0x406e, 0xba4e, 0x4182, 0x41a4, 0x4207, 0x40dc, 0xbaec, 0x193c, 0x415a, 0x4317, 0xbf83, 0x1e0b, 0x3d29, 0x40a1, 0x4333, 0xb046, 0xaf27, 0x1988, 0xb28a, 0xb204, 0x16d6, 0xac6b, 0x425b, 0x1f0d, 0x4251, 0x408e, 0x42de, 0x464c, 0xbfae, 0x40e7, 0x44b8, 0x43fc, 0x4065, 0x4333, 0x4479, 0x0559, 0xbaeb, 0xb252, 0x41f3, 0x4380, 0xb230, 0x46c0, 0x44a0, 0xbf8e, 0xb023, 0x4288, 0x4017, 0x406b, 0x4288, 0x4398, 0x18cc, 0xabdd, 0x429a, 0x42ab, 0xbf95, 0x43f2, 0x4057, 0x4442, 0x40ee, 0x4111, 0x4358, 0xa518, 0x34fa, 0x4180, 0x3ecd, 0x4223, 0xb265, 0x42a4, 0x1f7c, 0xb296, 0x1d3c, 0x430f, 0x442d, 0x4307, 0x437a, 0xbf27, 0x1d82, 0x391c, 0xb2a8, 0xbae1, 0x40a0, 0x41b3, 0x40e2, 0xb27e, 0x43a4, 0xafdf, 0x43ad, 0xb024, 0x40e0, 0x4048, 0x3c42, 0x1d9d, 0x1954, 0x0cd9, 0xbf4b, 0x4236, 0xa2ef, 0x424e, 0xbac2, 0xba67, 0x4103, 0x43eb, 0x1d60, 0x459e, 0x4059, 0x41b5, 0xbf83, 0x4310, 0xba42, 0x3684, 0xb299, 0x43ca, 0x1f66, 0x43e1, 0x1358, 0xb08d, 0x41ee, 0x1b3a, 0x4386, 0x40ad, 0x43fd, 0x4653, 0xb0bc, 0xb2ac, 0x405b, 0x037e, 0x418c, 0x1887, 0x42bd, 0x05ee, 0x46ed, 0x4238, 0x4062, 0x43f9, 0xbfad, 0x461f, 0xb0fa, 0x3e21, 0x411c, 0x403b, 0x2342, 0x3259, 0x076d, 0xbf81, 0x4009, 0x4152, 0xba08, 0x1811, 0x4312, 0x32f2, 0x1b6f, 0x408c, 0x43d8, 0x437e, 0x40c1, 0x40a1, 0x40cd, 0x43af, 0x2042, 0x4342, 0x4082, 0x4029, 0xa300, 0xbf49, 0xb076, 0x421e, 0x45a2, 0x185f, 0xba07, 0x4283, 0x4306, 0x3c84, 0x454f, 0x42d5, 0x4071, 0xae63, 0xb2b0, 0xab50, 0x21b6, 0x4024, 0x4485, 0xb292, 0xb266, 0x424d, 0x1559, 0x0623, 0x42e7, 0xb2e3, 0x4094, 0xbf38, 0x4378, 0x4770, 0xe7fe + ], + StartRegs = [0xfbee3e06, 0xf7bc3994, 0x7ccee582, 0x65c6dfd8, 0x7d765d73, 0x2669bec2, 0x4d20d1a8, 0x414bdcb0, 0x53f02dc6, 0xad07dc25, 0xbd4dd249, 0x070bd4e7, 0x1404f4cb, 0x80985f65, 0x00000000, 0x700001f0 + ], + FinalRegs = [0x000061d2, 0xfffffdef, 0x00000000, 0x0000007c, 0xffffff7c, 0xffffff4a, 0x0000007c, 0x42000000, 0x0b273264, 0x00a885eb, 0x0b273265, 0xbd4dd249, 0x00000322, 0xbdf6c218, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0xba5b, 0x07d6, 0x17ae, 0x42a8, 0x465e, 0x4335, 0x121d, 0xa28d, 0x4605, 0x4319, 0x4115, 0x1eed, 0x40b7, 0x43ba, 0x4680, 0x4079, 0x4604, 0xb239, 0x41f3, 0x40fa, 0xba5e, 0x4247, 0xba6d, 0x42ce, 0xbfb7, 0xba11, 0x4025, 0xbfa0, 0x4034, 0xb096, 0x1948, 0x4194, 0x42a7, 0x43b5, 0x416e, 0x40a9, 0x42db, 0x4601, 0xbf38, 0xb2e6, 0x426f, 0x444a, 0x40ee, 0x44ed, 0x44d1, 0x4000, 0xb215, 0x30a0, 0xba5a, 0xb261, 0x41bb, 0xb00b, 0xbf6c, 0xbae1, 0x0ef2, 0x431c, 0x00d4, 0x446c, 0x4357, 0x42d7, 0x2fd0, 0xb224, 0xb099, 0x424c, 0x1b9f, 0x01d3, 0x40e7, 0x3e10, 0x4648, 0xbfcb, 0x0411, 0xba0b, 0x40bb, 0xbac8, 0x24c9, 0x42cf, 0xba3d, 0x01fa, 0x1a3f, 0x03a8, 0x28e0, 0x42e1, 0x40b4, 0xb24b, 0x1cd5, 0xb2c8, 0x43ef, 0x2f59, 0x18d0, 0xa4b2, 0xba71, 0x2bb4, 0xb088, 0x21d1, 0xb2db, 0xb2b4, 0xbfb7, 0x1d84, 0x1c34, 0x438f, 0x40d3, 0x4542, 0xaf8e, 0xbad0, 0x4106, 0x28c9, 0x4102, 0x40e9, 0x42d2, 0xbf2c, 0xb203, 0xb295, 0x4262, 0x42ab, 0xbfca, 0x4477, 0x43df, 0x425f, 0xb2b8, 0x425d, 0xb2f7, 0x1d27, 0x40e0, 0x41d8, 0x40e2, 0x3bf3, 0x40f4, 0x416c, 0x17a2, 0xa33f, 0xb254, 0xba60, 0xb056, 0xbfd7, 0x4208, 0xb025, 0x4590, 0x18f9, 0xb20c, 0xba78, 0xb059, 0xba72, 0x2cea, 0x0a1e, 0xbf00, 0xaaee, 0x4651, 0x4315, 0xbaf9, 0x42c3, 0x4176, 0xa362, 0x0638, 0x2acd, 0x1a26, 0xb251, 0x40c7, 0x4469, 0x410c, 0xbfd7, 0x43a1, 0x419c, 0x4093, 0x43d5, 0x3b5f, 0x33cf, 0xa83a, 0x4160, 0xb222, 0x41bf, 0xb2c9, 0x4324, 0x1fd8, 0x1cd4, 0xb0ab, 0x427b, 0xbaf5, 0x407f, 0xbf63, 0x19af, 0xa6ef, 0x438b, 0x43cb, 0xbfc0, 0x4367, 0x428f, 0x4088, 0x4219, 0xb273, 0x0619, 0x4385, 0x420f, 0x46e3, 0x4466, 0xb019, 0x4366, 0x402f, 0xbf36, 0xb2b2, 0x2705, 0x1202, 0x0143, 0xbfa7, 0xbfc0, 0xad30, 0x42ee, 0x4279, 0x4273, 0x1d83, 0x432e, 0xb2fd, 0x42af, 0xbfd7, 0x4304, 0xba66, 0x1f02, 0x04b7, 0x4547, 0x0537, 0x4478, 0x4396, 0x421a, 0xbf64, 0x421e, 0x2be3, 0x41cd, 0x43fd, 0x435c, 0x4205, 0xa4ee, 0x439a, 0x4270, 0x42cd, 0x435b, 0x4057, 0x2f2c, 0xb22c, 0x27ee, 0x43df, 0xb2bd, 0x40ce, 0x17f1, 0xbf58, 0x4179, 0xba3d, 0x4036, 0x4150, 0xa831, 0xba54, 0x4278, 0x4270, 0x1454, 0x42e3, 0x4099, 0xb253, 0x41b7, 0x1c6d, 0x4148, 0x4158, 0xb096, 0x4495, 0xb07e, 0xbaca, 0xb2b8, 0x1b78, 0xbf53, 0xb2a8, 0xb2a0, 0x3743, 0xba20, 0x41cc, 0x1435, 0x438c, 0x4074, 0xb09f, 0xb291, 0x1fb0, 0x4040, 0xbafc, 0x1ebc, 0x14da, 0xbfa0, 0x4235, 0xb22c, 0x41b4, 0x3a86, 0x433a, 0xbfa8, 0xb047, 0x4639, 0xbadf, 0x4225, 0x43f8, 0x0dab, 0xa751, 0xbff0, 0x4347, 0xbfb6, 0xba06, 0xbadf, 0xb084, 0x06c0, 0x2b46, 0x42b3, 0x014f, 0x0b86, 0xba4f, 0x44ab, 0xb2c4, 0x154e, 0xb24e, 0xbaf5, 0xa94c, 0x30d0, 0x435b, 0xbaeb, 0xbfa3, 0x41fc, 0xba0e, 0x4180, 0xba0b, 0x1810, 0x0d4e, 0xba04, 0x0f96, 0xb0db, 0x4117, 0x4335, 0x4314, 0x3157, 0xb26d, 0x4554, 0xb23a, 0xb2ad, 0x3ee7, 0x3bcf, 0xba46, 0x42cc, 0x415a, 0x421b, 0x43bf, 0xbf80, 0x1b5d, 0xba10, 0x099c, 0x421d, 0xbf32, 0x20d0, 0xb21d, 0xacf5, 0xba23, 0x4120, 0x4102, 0xbaf4, 0xbfa8, 0x2f4b, 0x1913, 0x2795, 0x43fe, 0x4472, 0x4419, 0x4224, 0x423b, 0xba6a, 0x33f4, 0x466a, 0x0602, 0x42e6, 0x45c5, 0x0a3f, 0xb279, 0xb294, 0x42cb, 0x4013, 0xb2f7, 0x41ce, 0x1fbe, 0x4229, 0x41eb, 0xbf5d, 0x0f87, 0x4120, 0x4233, 0x410a, 0x3a7d, 0x1365, 0x4633, 0x42f0, 0xba0c, 0x415a, 0x438f, 0xb062, 0x42f1, 0x4205, 0xba13, 0xbfa5, 0xb221, 0xb2eb, 0x436a, 0xb2cf, 0xb241, 0x4120, 0x4233, 0x446e, 0x40c9, 0x3943, 0xb2c5, 0x0b33, 0x13f7, 0xb236, 0xa84f, 0x415a, 0xb09b, 0x43e2, 0x4105, 0xbfc0, 0x438e, 0x1901, 0x4146, 0xbf52, 0xa619, 0xba67, 0x4354, 0x3f22, 0x430e, 0x44d5, 0x1fbf, 0x413b, 0xa872, 0x4304, 0xba65, 0xb27e, 0xb20f, 0x41a5, 0xbade, 0x4157, 0xaeb4, 0x423d, 0x42fa, 0xbfc1, 0x4416, 0x434d, 0x44ea, 0xb239, 0x4594, 0x0037, 0xbf1b, 0x1864, 0x42d5, 0xba2f, 0x017e, 0x4065, 0xb0bc, 0x13a1, 0xbfa0, 0x43b2, 0x41a4, 0xb269, 0x46d1, 0xb27b, 0x410e, 0xb24b, 0xbf06, 0xb061, 0x0c0c, 0xb294, 0x4010, 0x1e48, 0x435f, 0xa4ab, 0xb2db, 0x248f, 0xa37f, 0x403a, 0xb0df, 0x4023, 0x42ba, 0x42dd, 0x1e2d, 0x4299, 0x41a2, 0x2d1b, 0x2b1b, 0x41f5, 0x194d, 0x422c, 0xb23b, 0x427d, 0xb2a0, 0xbf1a, 0xab55, 0x43ca, 0xa750, 0xa102, 0xbaed, 0xbff0, 0xba5f, 0x4274, 0xb28e, 0xa5be, 0x40e5, 0xb20e, 0x4173, 0x2778, 0xb26b, 0xa8ff, 0x18f0, 0x4036, 0xbf65, 0x1b9b, 0x46ec, 0xb0bf, 0x4017, 0x4126, 0x2f2d, 0x3504, 0xb05a, 0x45e5, 0x4053, 0x41f7, 0x43d1, 0x417c, 0x421c, 0xbfe2, 0x4377, 0x1723, 0xbff0, 0x46c2, 0xa232, 0xaec0, 0xba6c, 0xb251, 0xb2f6, 0x4060, 0x404f, 0x1ce5, 0xbf88, 0x4655, 0x1a5a, 0x403d, 0xba12, 0x19c7, 0xba50, 0x4169, 0x4106, 0x4250, 0xb291, 0x42c7, 0x4347, 0x27bd, 0x2c35, 0x0626, 0x1ec8, 0x0280, 0x400e, 0x2bf8, 0xb263, 0xb2af, 0xb01d, 0xba2b, 0x1cf0, 0xbfdf, 0x431f, 0x4604, 0xb295, 0xba0c, 0xb218, 0x4325, 0x213d, 0x415a, 0xb0aa, 0x410d, 0x41d0, 0x18ec, 0x445d, 0x4031, 0x1a49, 0xbaf3, 0x4089, 0x4001, 0x42c8, 0x40d9, 0x1fd4, 0xbf3f, 0x41ab, 0xa638, 0x42fa, 0x1c8f, 0xa077, 0x1b97, 0xb204, 0x4210, 0x42f2, 0x1b51, 0xb0ed, 0x1bc5, 0xb25f, 0xba2d, 0x335d, 0x3031, 0x15d4, 0x403d, 0xa32c, 0xbadb, 0x41be, 0xbf33, 0xba5e, 0xba5f, 0x45ba, 0xb01a, 0x4214, 0xbad1, 0xbf82, 0x429c, 0x171a, 0x1728, 0xbfb2, 0x413e, 0xac11, 0x42bc, 0x4149, 0x41b5, 0x433a, 0xb26f, 0x1d40, 0x461b, 0x4046, 0xb243, 0xb2fc, 0x4259, 0x1b06, 0x4253, 0x4179, 0x4369, 0xba48, 0x403d, 0xb2b1, 0xb06f, 0xb21c, 0x4122, 0x2dc7, 0xbf9d, 0x43c5, 0xb2cd, 0xa4b1, 0x417e, 0xb232, 0x42e0, 0xbfdc, 0xb073, 0xb2a0, 0x1caa, 0xb2d4, 0x4037, 0x16f9, 0x05b2, 0xbf00, 0x43f5, 0x4135, 0x43d8, 0x4115, 0x42e9, 0xb248, 0x4037, 0xb274, 0xb249, 0x4284, 0x3542, 0x3c24, 0xa2e5, 0x1a2f, 0x40d1, 0xb2e3, 0x41da, 0x4255, 0xbf0f, 0x2d1a, 0x46d8, 0x422c, 0x28a3, 0x1c9e, 0x1f60, 0xb0a9, 0xb08f, 0x4056, 0x19b4, 0xb20b, 0xba7b, 0x4308, 0x40de, 0xb204, 0x4684, 0x4179, 0x0f4b, 0xb2e6, 0x45f0, 0x43f6, 0x43f6, 0x4181, 0xb2ab, 0xbf82, 0xb242, 0x2355, 0xb227, 0x1e77, 0x403d, 0x4381, 0x404c, 0x427e, 0x4220, 0xbfd0, 0x3630, 0xb282, 0xbf75, 0x1fe1, 0x1f1f, 0x288b, 0x40f3, 0x46f9, 0x39bb, 0x4328, 0x407f, 0x4245, 0x434a, 0xae95, 0x41c9, 0xba43, 0x09d6, 0x4179, 0xa589, 0x1d18, 0x1cdd, 0x42dc, 0xbf02, 0x35d5, 0x43c8, 0x4270, 0x403c, 0xba6d, 0x42ea, 0xbf65, 0x1ade, 0x2288, 0x4660, 0x437f, 0x4281, 0xba01, 0xb2e8, 0x4248, 0x46d1, 0xba30, 0x41b0, 0xb21e, 0x4017, 0x024f, 0x4305, 0x40cb, 0xb29c, 0x40d0, 0x0b3f, 0x0661, 0xb2fc, 0x4083, 0x196d, 0xb2aa, 0x3149, 0xbfc9, 0x41ae, 0x40ea, 0x4126, 0x462a, 0x42e4, 0x434f, 0x4242, 0xb2e1, 0x43de, 0x43e2, 0x41cb, 0x4112, 0xba58, 0x42c6, 0x426d, 0xb082, 0x43e7, 0x419e, 0x43ad, 0x4576, 0x42a1, 0x40a6, 0xbf54, 0x40a9, 0xbac0, 0xb254, 0x1bc9, 0x3ef4, 0xba5a, 0xa96a, 0x40a2, 0x4688, 0xb2a4, 0xba68, 0xb21e, 0xb2a2, 0xbf38, 0x0405, 0xb219, 0x2f28, 0x40fb, 0xb23c, 0xb29e, 0x4035, 0xb0cc, 0x4653, 0x4006, 0x460b, 0xbf3c, 0x427b, 0x4182, 0x4274, 0xbff0, 0x4252, 0x1272, 0xbfa4, 0xae65, 0x0ca1, 0x14f9, 0x00b0, 0x40b8, 0xba23, 0x4349, 0xbfa3, 0x4461, 0x063b, 0xb229, 0x41eb, 0xb224, 0x4124, 0xb0cc, 0x4342, 0x3167, 0x42c9, 0x1d8e, 0x4626, 0x3374, 0x4167, 0x4060, 0x45dd, 0x1ad6, 0x3446, 0x4237, 0x442f, 0x4214, 0x1d7c, 0x46c5, 0x42c7, 0x4491, 0x3e38, 0x1d56, 0x42cc, 0xaec2, 0xbf8e, 0x4090, 0xba77, 0x45d4, 0x40e8, 0x190e, 0x1b87, 0x0e51, 0xba73, 0x0806, 0xb206, 0xbf46, 0x4326, 0x111b, 0xba4a, 0x1b79, 0xa71d, 0x42a8, 0x4294, 0x423c, 0x4667, 0xba77, 0x4110, 0x43a9, 0x1d4d, 0x42c5, 0xb2f7, 0xb216, 0x40d9, 0xb06f, 0x43ba, 0x41b9, 0x467f, 0xa135, 0xbaee, 0x40e7, 0xbfc6, 0xb241, 0xa4a6, 0x423b, 0x408e, 0x364b, 0xa098, 0x4005, 0xb275, 0xb0f2, 0xba79, 0xbfa0, 0x4387, 0x41d9, 0x0761, 0xb251, 0x418c, 0xba33, 0xbf51, 0x4007, 0xb256, 0x44c3, 0xb212, 0x434f, 0x40b4, 0x0edf, 0x4546, 0x4343, 0x45b3, 0xb29c, 0x40fe, 0x341e, 0x1af1, 0x42dc, 0x1c07, 0xba79, 0x08bb, 0xbfc7, 0x16a1, 0x4655, 0x1fe7, 0x4235, 0xbf3d, 0x338e, 0x43a2, 0x36ad, 0x2e82, 0xa991, 0x423e, 0xba76, 0xba17, 0x1a36, 0xbad3, 0x42e4, 0x41d8, 0xb206, 0x41fd, 0x3bb8, 0x42a0, 0xb2ec, 0xbacd, 0x43c3, 0x1bde, 0xba65, 0x4188, 0x41a4, 0x40fb, 0x4225, 0x25ce, 0xbf97, 0xb22b, 0x19e4, 0x43cc, 0x4101, 0x27f0, 0x1f7e, 0x1d8d, 0xb23d, 0x4280, 0x1d99, 0x41ca, 0x4170, 0x440d, 0xbae8, 0x4114, 0x0519, 0x41db, 0x214d, 0x4255, 0xb25f, 0x1b50, 0x14bd, 0xba46, 0xbf0f, 0x43b1, 0x20c0, 0xa4da, 0xb273, 0xbf65, 0x0636, 0x43e3, 0xb006, 0x410e, 0x161c, 0xba02, 0x4471, 0x2f5a, 0x40e6, 0xbf55, 0x4030, 0xba21, 0x412c, 0xb2a7, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd10f75bd, 0x744765d0, 0x4700bcdf, 0x41a4f9ee, 0x0164f011, 0x5d046666, 0xcc6ba3ee, 0xcaed7f40, 0xc754ff08, 0xa741fc6a, 0x1e4ce65a, 0x41d5f9d4, 0xf0c8c8a5, 0x9b837a0d, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x0000004d, 0x00000000, 0x03380000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x5553dda0, 0xd10f75bd, 0xd10f75bd, 0xf0c8c8a5, 0xffffff86, 0x5553ddac, 0x00000000, 0x400001d0 }, + Instructions = [0xba5b, 0x07d6, 0x17ae, 0x42a8, 0x465e, 0x4335, 0x121d, 0xa28d, 0x4605, 0x4319, 0x4115, 0x1eed, 0x40b7, 0x43ba, 0x4680, 0x4079, 0x4604, 0xb239, 0x41f3, 0x40fa, 0xba5e, 0x4247, 0xba6d, 0x42ce, 0xbfb7, 0xba11, 0x4025, 0xbfa0, 0x4034, 0xb096, 0x1948, 0x4194, 0x42a7, 0x43b5, 0x416e, 0x40a9, 0x42db, 0x4601, 0xbf38, 0xb2e6, 0x426f, 0x444a, 0x40ee, 0x44ed, 0x44d1, 0x4000, 0xb215, 0x30a0, 0xba5a, 0xb261, 0x41bb, 0xb00b, 0xbf6c, 0xbae1, 0x0ef2, 0x431c, 0x00d4, 0x446c, 0x4357, 0x42d7, 0x2fd0, 0xb224, 0xb099, 0x424c, 0x1b9f, 0x01d3, 0x40e7, 0x3e10, 0x4648, 0xbfcb, 0x0411, 0xba0b, 0x40bb, 0xbac8, 0x24c9, 0x42cf, 0xba3d, 0x01fa, 0x1a3f, 0x03a8, 0x28e0, 0x42e1, 0x40b4, 0xb24b, 0x1cd5, 0xb2c8, 0x43ef, 0x2f59, 0x18d0, 0xa4b2, 0xba71, 0x2bb4, 0xb088, 0x21d1, 0xb2db, 0xb2b4, 0xbfb7, 0x1d84, 0x1c34, 0x438f, 0x40d3, 0x4542, 0xaf8e, 0xbad0, 0x4106, 0x28c9, 0x4102, 0x40e9, 0x42d2, 0xbf2c, 0xb203, 0xb295, 0x4262, 0x42ab, 0xbfca, 0x4477, 0x43df, 0x425f, 0xb2b8, 0x425d, 0xb2f7, 0x1d27, 0x40e0, 0x41d8, 0x40e2, 0x3bf3, 0x40f4, 0x416c, 0x17a2, 0xa33f, 0xb254, 0xba60, 0xb056, 0xbfd7, 0x4208, 0xb025, 0x4590, 0x18f9, 0xb20c, 0xba78, 0xb059, 0xba72, 0x2cea, 0x0a1e, 0xbf00, 0xaaee, 0x4651, 0x4315, 0xbaf9, 0x42c3, 0x4176, 0xa362, 0x0638, 0x2acd, 0x1a26, 0xb251, 0x40c7, 0x4469, 0x410c, 0xbfd7, 0x43a1, 0x419c, 0x4093, 0x43d5, 0x3b5f, 0x33cf, 0xa83a, 0x4160, 0xb222, 0x41bf, 0xb2c9, 0x4324, 0x1fd8, 0x1cd4, 0xb0ab, 0x427b, 0xbaf5, 0x407f, 0xbf63, 0x19af, 0xa6ef, 0x438b, 0x43cb, 0xbfc0, 0x4367, 0x428f, 0x4088, 0x4219, 0xb273, 0x0619, 0x4385, 0x420f, 0x46e3, 0x4466, 0xb019, 0x4366, 0x402f, 0xbf36, 0xb2b2, 0x2705, 0x1202, 0x0143, 0xbfa7, 0xbfc0, 0xad30, 0x42ee, 0x4279, 0x4273, 0x1d83, 0x432e, 0xb2fd, 0x42af, 0xbfd7, 0x4304, 0xba66, 0x1f02, 0x04b7, 0x4547, 0x0537, 0x4478, 0x4396, 0x421a, 0xbf64, 0x421e, 0x2be3, 0x41cd, 0x43fd, 0x435c, 0x4205, 0xa4ee, 0x439a, 0x4270, 0x42cd, 0x435b, 0x4057, 0x2f2c, 0xb22c, 0x27ee, 0x43df, 0xb2bd, 0x40ce, 0x17f1, 0xbf58, 0x4179, 0xba3d, 0x4036, 0x4150, 0xa831, 0xba54, 0x4278, 0x4270, 0x1454, 0x42e3, 0x4099, 0xb253, 0x41b7, 0x1c6d, 0x4148, 0x4158, 0xb096, 0x4495, 0xb07e, 0xbaca, 0xb2b8, 0x1b78, 0xbf53, 0xb2a8, 0xb2a0, 0x3743, 0xba20, 0x41cc, 0x1435, 0x438c, 0x4074, 0xb09f, 0xb291, 0x1fb0, 0x4040, 0xbafc, 0x1ebc, 0x14da, 0xbfa0, 0x4235, 0xb22c, 0x41b4, 0x3a86, 0x433a, 0xbfa8, 0xb047, 0x4639, 0xbadf, 0x4225, 0x43f8, 0x0dab, 0xa751, 0xbff0, 0x4347, 0xbfb6, 0xba06, 0xbadf, 0xb084, 0x06c0, 0x2b46, 0x42b3, 0x014f, 0x0b86, 0xba4f, 0x44ab, 0xb2c4, 0x154e, 0xb24e, 0xbaf5, 0xa94c, 0x30d0, 0x435b, 0xbaeb, 0xbfa3, 0x41fc, 0xba0e, 0x4180, 0xba0b, 0x1810, 0x0d4e, 0xba04, 0x0f96, 0xb0db, 0x4117, 0x4335, 0x4314, 0x3157, 0xb26d, 0x4554, 0xb23a, 0xb2ad, 0x3ee7, 0x3bcf, 0xba46, 0x42cc, 0x415a, 0x421b, 0x43bf, 0xbf80, 0x1b5d, 0xba10, 0x099c, 0x421d, 0xbf32, 0x20d0, 0xb21d, 0xacf5, 0xba23, 0x4120, 0x4102, 0xbaf4, 0xbfa8, 0x2f4b, 0x1913, 0x2795, 0x43fe, 0x4472, 0x4419, 0x4224, 0x423b, 0xba6a, 0x33f4, 0x466a, 0x0602, 0x42e6, 0x45c5, 0x0a3f, 0xb279, 0xb294, 0x42cb, 0x4013, 0xb2f7, 0x41ce, 0x1fbe, 0x4229, 0x41eb, 0xbf5d, 0x0f87, 0x4120, 0x4233, 0x410a, 0x3a7d, 0x1365, 0x4633, 0x42f0, 0xba0c, 0x415a, 0x438f, 0xb062, 0x42f1, 0x4205, 0xba13, 0xbfa5, 0xb221, 0xb2eb, 0x436a, 0xb2cf, 0xb241, 0x4120, 0x4233, 0x446e, 0x40c9, 0x3943, 0xb2c5, 0x0b33, 0x13f7, 0xb236, 0xa84f, 0x415a, 0xb09b, 0x43e2, 0x4105, 0xbfc0, 0x438e, 0x1901, 0x4146, 0xbf52, 0xa619, 0xba67, 0x4354, 0x3f22, 0x430e, 0x44d5, 0x1fbf, 0x413b, 0xa872, 0x4304, 0xba65, 0xb27e, 0xb20f, 0x41a5, 0xbade, 0x4157, 0xaeb4, 0x423d, 0x42fa, 0xbfc1, 0x4416, 0x434d, 0x44ea, 0xb239, 0x4594, 0x0037, 0xbf1b, 0x1864, 0x42d5, 0xba2f, 0x017e, 0x4065, 0xb0bc, 0x13a1, 0xbfa0, 0x43b2, 0x41a4, 0xb269, 0x46d1, 0xb27b, 0x410e, 0xb24b, 0xbf06, 0xb061, 0x0c0c, 0xb294, 0x4010, 0x1e48, 0x435f, 0xa4ab, 0xb2db, 0x248f, 0xa37f, 0x403a, 0xb0df, 0x4023, 0x42ba, 0x42dd, 0x1e2d, 0x4299, 0x41a2, 0x2d1b, 0x2b1b, 0x41f5, 0x194d, 0x422c, 0xb23b, 0x427d, 0xb2a0, 0xbf1a, 0xab55, 0x43ca, 0xa750, 0xa102, 0xbaed, 0xbff0, 0xba5f, 0x4274, 0xb28e, 0xa5be, 0x40e5, 0xb20e, 0x4173, 0x2778, 0xb26b, 0xa8ff, 0x18f0, 0x4036, 0xbf65, 0x1b9b, 0x46ec, 0xb0bf, 0x4017, 0x4126, 0x2f2d, 0x3504, 0xb05a, 0x45e5, 0x4053, 0x41f7, 0x43d1, 0x417c, 0x421c, 0xbfe2, 0x4377, 0x1723, 0xbff0, 0x46c2, 0xa232, 0xaec0, 0xba6c, 0xb251, 0xb2f6, 0x4060, 0x404f, 0x1ce5, 0xbf88, 0x4655, 0x1a5a, 0x403d, 0xba12, 0x19c7, 0xba50, 0x4169, 0x4106, 0x4250, 0xb291, 0x42c7, 0x4347, 0x27bd, 0x2c35, 0x0626, 0x1ec8, 0x0280, 0x400e, 0x2bf8, 0xb263, 0xb2af, 0xb01d, 0xba2b, 0x1cf0, 0xbfdf, 0x431f, 0x4604, 0xb295, 0xba0c, 0xb218, 0x4325, 0x213d, 0x415a, 0xb0aa, 0x410d, 0x41d0, 0x18ec, 0x445d, 0x4031, 0x1a49, 0xbaf3, 0x4089, 0x4001, 0x42c8, 0x40d9, 0x1fd4, 0xbf3f, 0x41ab, 0xa638, 0x42fa, 0x1c8f, 0xa077, 0x1b97, 0xb204, 0x4210, 0x42f2, 0x1b51, 0xb0ed, 0x1bc5, 0xb25f, 0xba2d, 0x335d, 0x3031, 0x15d4, 0x403d, 0xa32c, 0xbadb, 0x41be, 0xbf33, 0xba5e, 0xba5f, 0x45ba, 0xb01a, 0x4214, 0xbad1, 0xbf82, 0x429c, 0x171a, 0x1728, 0xbfb2, 0x413e, 0xac11, 0x42bc, 0x4149, 0x41b5, 0x433a, 0xb26f, 0x1d40, 0x461b, 0x4046, 0xb243, 0xb2fc, 0x4259, 0x1b06, 0x4253, 0x4179, 0x4369, 0xba48, 0x403d, 0xb2b1, 0xb06f, 0xb21c, 0x4122, 0x2dc7, 0xbf9d, 0x43c5, 0xb2cd, 0xa4b1, 0x417e, 0xb232, 0x42e0, 0xbfdc, 0xb073, 0xb2a0, 0x1caa, 0xb2d4, 0x4037, 0x16f9, 0x05b2, 0xbf00, 0x43f5, 0x4135, 0x43d8, 0x4115, 0x42e9, 0xb248, 0x4037, 0xb274, 0xb249, 0x4284, 0x3542, 0x3c24, 0xa2e5, 0x1a2f, 0x40d1, 0xb2e3, 0x41da, 0x4255, 0xbf0f, 0x2d1a, 0x46d8, 0x422c, 0x28a3, 0x1c9e, 0x1f60, 0xb0a9, 0xb08f, 0x4056, 0x19b4, 0xb20b, 0xba7b, 0x4308, 0x40de, 0xb204, 0x4684, 0x4179, 0x0f4b, 0xb2e6, 0x45f0, 0x43f6, 0x43f6, 0x4181, 0xb2ab, 0xbf82, 0xb242, 0x2355, 0xb227, 0x1e77, 0x403d, 0x4381, 0x404c, 0x427e, 0x4220, 0xbfd0, 0x3630, 0xb282, 0xbf75, 0x1fe1, 0x1f1f, 0x288b, 0x40f3, 0x46f9, 0x39bb, 0x4328, 0x407f, 0x4245, 0x434a, 0xae95, 0x41c9, 0xba43, 0x09d6, 0x4179, 0xa589, 0x1d18, 0x1cdd, 0x42dc, 0xbf02, 0x35d5, 0x43c8, 0x4270, 0x403c, 0xba6d, 0x42ea, 0xbf65, 0x1ade, 0x2288, 0x4660, 0x437f, 0x4281, 0xba01, 0xb2e8, 0x4248, 0x46d1, 0xba30, 0x41b0, 0xb21e, 0x4017, 0x024f, 0x4305, 0x40cb, 0xb29c, 0x40d0, 0x0b3f, 0x0661, 0xb2fc, 0x4083, 0x196d, 0xb2aa, 0x3149, 0xbfc9, 0x41ae, 0x40ea, 0x4126, 0x462a, 0x42e4, 0x434f, 0x4242, 0xb2e1, 0x43de, 0x43e2, 0x41cb, 0x4112, 0xba58, 0x42c6, 0x426d, 0xb082, 0x43e7, 0x419e, 0x43ad, 0x4576, 0x42a1, 0x40a6, 0xbf54, 0x40a9, 0xbac0, 0xb254, 0x1bc9, 0x3ef4, 0xba5a, 0xa96a, 0x40a2, 0x4688, 0xb2a4, 0xba68, 0xb21e, 0xb2a2, 0xbf38, 0x0405, 0xb219, 0x2f28, 0x40fb, 0xb23c, 0xb29e, 0x4035, 0xb0cc, 0x4653, 0x4006, 0x460b, 0xbf3c, 0x427b, 0x4182, 0x4274, 0xbff0, 0x4252, 0x1272, 0xbfa4, 0xae65, 0x0ca1, 0x14f9, 0x00b0, 0x40b8, 0xba23, 0x4349, 0xbfa3, 0x4461, 0x063b, 0xb229, 0x41eb, 0xb224, 0x4124, 0xb0cc, 0x4342, 0x3167, 0x42c9, 0x1d8e, 0x4626, 0x3374, 0x4167, 0x4060, 0x45dd, 0x1ad6, 0x3446, 0x4237, 0x442f, 0x4214, 0x1d7c, 0x46c5, 0x42c7, 0x4491, 0x3e38, 0x1d56, 0x42cc, 0xaec2, 0xbf8e, 0x4090, 0xba77, 0x45d4, 0x40e8, 0x190e, 0x1b87, 0x0e51, 0xba73, 0x0806, 0xb206, 0xbf46, 0x4326, 0x111b, 0xba4a, 0x1b79, 0xa71d, 0x42a8, 0x4294, 0x423c, 0x4667, 0xba77, 0x4110, 0x43a9, 0x1d4d, 0x42c5, 0xb2f7, 0xb216, 0x40d9, 0xb06f, 0x43ba, 0x41b9, 0x467f, 0xa135, 0xbaee, 0x40e7, 0xbfc6, 0xb241, 0xa4a6, 0x423b, 0x408e, 0x364b, 0xa098, 0x4005, 0xb275, 0xb0f2, 0xba79, 0xbfa0, 0x4387, 0x41d9, 0x0761, 0xb251, 0x418c, 0xba33, 0xbf51, 0x4007, 0xb256, 0x44c3, 0xb212, 0x434f, 0x40b4, 0x0edf, 0x4546, 0x4343, 0x45b3, 0xb29c, 0x40fe, 0x341e, 0x1af1, 0x42dc, 0x1c07, 0xba79, 0x08bb, 0xbfc7, 0x16a1, 0x4655, 0x1fe7, 0x4235, 0xbf3d, 0x338e, 0x43a2, 0x36ad, 0x2e82, 0xa991, 0x423e, 0xba76, 0xba17, 0x1a36, 0xbad3, 0x42e4, 0x41d8, 0xb206, 0x41fd, 0x3bb8, 0x42a0, 0xb2ec, 0xbacd, 0x43c3, 0x1bde, 0xba65, 0x4188, 0x41a4, 0x40fb, 0x4225, 0x25ce, 0xbf97, 0xb22b, 0x19e4, 0x43cc, 0x4101, 0x27f0, 0x1f7e, 0x1d8d, 0xb23d, 0x4280, 0x1d99, 0x41ca, 0x4170, 0x440d, 0xbae8, 0x4114, 0x0519, 0x41db, 0x214d, 0x4255, 0xb25f, 0x1b50, 0x14bd, 0xba46, 0xbf0f, 0x43b1, 0x20c0, 0xa4da, 0xb273, 0xbf65, 0x0636, 0x43e3, 0xb006, 0x410e, 0x161c, 0xba02, 0x4471, 0x2f5a, 0x40e6, 0xbf55, 0x4030, 0xba21, 0x412c, 0xb2a7, 0x4770, 0xe7fe + ], + StartRegs = [0xd10f75bd, 0x744765d0, 0x4700bcdf, 0x41a4f9ee, 0x0164f011, 0x5d046666, 0xcc6ba3ee, 0xcaed7f40, 0xc754ff08, 0xa741fc6a, 0x1e4ce65a, 0x41d5f9d4, 0xf0c8c8a5, 0x9b837a0d, 0x00000000, 0x200001f0 + ], + FinalRegs = [0x00000000, 0x0000004d, 0x00000000, 0x03380000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x5553dda0, 0xd10f75bd, 0xd10f75bd, 0xf0c8c8a5, 0xffffff86, 0x5553ddac, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0xa199, 0x43c5, 0x4111, 0x1dd7, 0x4284, 0x4103, 0x41a4, 0xbf24, 0x0c40, 0x44e5, 0x448a, 0x1c19, 0x4275, 0x1e0c, 0xa7fd, 0x1c09, 0x009a, 0x1ee8, 0x459c, 0x43d0, 0x40b2, 0x426f, 0x402e, 0x4421, 0xbae9, 0x2640, 0x402a, 0x1fcd, 0x2ff9, 0x3926, 0xbf1b, 0xb281, 0xaacb, 0x45b0, 0x1c61, 0xba01, 0xb22d, 0x277d, 0x4042, 0x4374, 0x13b1, 0x146d, 0x410f, 0xb09b, 0x179d, 0x421b, 0x1ae6, 0x4085, 0x2920, 0x425a, 0x43df, 0xb244, 0x4080, 0x42dd, 0x4178, 0x43a1, 0x4057, 0xa843, 0xb2ea, 0x4195, 0xbf3f, 0x4058, 0x4042, 0xa1e7, 0x4263, 0x4060, 0x45ea, 0xba42, 0x40c5, 0xbf63, 0x0953, 0x4287, 0x11ec, 0xba1b, 0x2900, 0x1d63, 0x425b, 0xb209, 0x427d, 0x2ffd, 0x40a6, 0xba7b, 0xbfa1, 0xb227, 0x1390, 0xb2ae, 0x413f, 0xb230, 0x1ea6, 0xb063, 0x44d9, 0x43ed, 0x38e6, 0xb266, 0x11c6, 0x4353, 0x4395, 0x423d, 0x4038, 0xb0dd, 0x418d, 0x405b, 0x4165, 0xbf39, 0x1373, 0x4200, 0x458b, 0x42d4, 0x4307, 0x1f3f, 0xbf95, 0x405d, 0x43cd, 0xbaf2, 0xa1f9, 0x40f1, 0x40cf, 0x40ec, 0xb203, 0xbfcc, 0x420f, 0x1ebf, 0x2b1b, 0x4186, 0x1e1f, 0x464a, 0xba6a, 0x423d, 0x4453, 0x1f67, 0x434e, 0x27b3, 0x15d6, 0xb2d8, 0xbf53, 0xba22, 0x413b, 0x187f, 0x42fd, 0xa8c3, 0xba09, 0x41fd, 0x4442, 0x420c, 0xb296, 0xbac5, 0x4215, 0x40f2, 0x4082, 0x1a04, 0x11e2, 0x1cbf, 0x43d9, 0xb216, 0x4026, 0x3608, 0x43ea, 0x4022, 0x4092, 0x0e1f, 0x429b, 0xb2e8, 0x42df, 0xbfad, 0x349f, 0xb2ff, 0x4212, 0x4168, 0xbad1, 0x390c, 0x41e0, 0xa34a, 0x40cf, 0x419f, 0x40db, 0x2fbd, 0xb0a9, 0x4329, 0x4351, 0x4129, 0x4104, 0x4268, 0xb2c4, 0xbf13, 0x1afa, 0x2de8, 0xb0e4, 0x4191, 0xb234, 0x4041, 0xb0b4, 0xb05c, 0xba7f, 0x2b96, 0xbfc6, 0xba54, 0x434b, 0x447f, 0xbfc2, 0x4113, 0xb2ea, 0xae3d, 0x417a, 0x42f8, 0x1884, 0x1f4a, 0xba51, 0xa2aa, 0xbf15, 0x4386, 0xba75, 0x40e8, 0x1f84, 0x4202, 0x42d7, 0x19e7, 0xbf80, 0x4168, 0x45e6, 0xbff0, 0x4152, 0xbf0c, 0xabb2, 0xa8e2, 0x42f0, 0x43d5, 0x405c, 0x4229, 0x42b1, 0xb0d1, 0xbf98, 0xba2d, 0x43c0, 0x024c, 0x3d62, 0xb22e, 0x400d, 0xba54, 0x4002, 0x2696, 0x1c64, 0x1d10, 0xb2f5, 0x40b8, 0xb04f, 0x24dd, 0x43fb, 0x4042, 0x182b, 0xbafd, 0x46d2, 0xbf78, 0x4317, 0x2901, 0xadeb, 0xa020, 0x43de, 0x352d, 0x4025, 0x4067, 0x4184, 0x42af, 0x4197, 0x410b, 0x4240, 0x42ef, 0xbfcc, 0x3013, 0x454d, 0xbf58, 0x4317, 0x0df1, 0x1877, 0x422f, 0xb01b, 0xb083, 0x402d, 0xb24c, 0x3837, 0xb0ad, 0x1a40, 0x0cad, 0xa457, 0x1c71, 0xb0c5, 0x40c7, 0xbf24, 0x4115, 0x4613, 0x41da, 0x1e59, 0x1099, 0xa19d, 0x25c9, 0xba1f, 0x0da3, 0xa9c4, 0x4263, 0x4128, 0xaae7, 0xb051, 0x427c, 0xba0b, 0x41fc, 0xb234, 0x1cec, 0x40be, 0xb221, 0xba4c, 0x1fcd, 0xb21e, 0xbf4c, 0xb0fd, 0x4172, 0x1d00, 0x1b78, 0x424e, 0xbf1e, 0x1f40, 0x0324, 0x4271, 0x41f0, 0xa81e, 0x4692, 0xb21e, 0x4114, 0xbf39, 0x46aa, 0x19a7, 0x2315, 0xbadf, 0xab7d, 0x1edf, 0xba3a, 0x1a7a, 0x1ede, 0xba56, 0xb074, 0xb207, 0x460f, 0xb20f, 0xba15, 0x40de, 0x40d3, 0x4029, 0x3388, 0xb265, 0x4274, 0xba28, 0xbfd4, 0xbac1, 0x403a, 0xb011, 0xb282, 0xb212, 0xbf37, 0x4134, 0x401e, 0x42b3, 0xbaf5, 0xbfbe, 0x417e, 0x4009, 0x14f9, 0xba76, 0xb2d3, 0x40de, 0x43ee, 0x446f, 0x4238, 0xbf90, 0x4302, 0x1f23, 0x0475, 0xb256, 0x40a3, 0x4008, 0xb0d8, 0x4147, 0x3b2a, 0x00cf, 0x4381, 0xb233, 0xbff0, 0xba1c, 0x43ff, 0x41a2, 0x4376, 0xb20f, 0xbf49, 0xb2b4, 0x0dbc, 0x3189, 0x418e, 0xba32, 0x1bd8, 0xbf6f, 0xba48, 0xb207, 0xa2ad, 0x411d, 0x1a87, 0x2df4, 0x03c2, 0x2dfd, 0x4046, 0xbf90, 0x3240, 0xb015, 0x4003, 0xb29c, 0x44a2, 0x43b7, 0x4378, 0x0fd8, 0x42fe, 0x466c, 0x41a6, 0x1940, 0x4087, 0xbfba, 0x4106, 0x3ee3, 0x4219, 0x409b, 0x1976, 0x18e7, 0x24f6, 0x3f8d, 0xbad5, 0x40d9, 0x1c9a, 0x2916, 0x1cd9, 0x41e2, 0x4069, 0x1c0c, 0x45c3, 0xb0e6, 0xbfb9, 0x40dc, 0xb055, 0x0946, 0x349c, 0x4004, 0x42d3, 0x1e78, 0x43f0, 0x427c, 0xb20b, 0xb2da, 0x4206, 0x42aa, 0x1d43, 0x428a, 0x19a6, 0xb04f, 0x1f39, 0x2fdc, 0x0fa5, 0x067d, 0x2bbc, 0x405a, 0x0080, 0xbfdd, 0x1ab5, 0xba61, 0x46ec, 0x2e41, 0x43aa, 0x4080, 0x437a, 0x4112, 0x428a, 0x1efc, 0xbaf3, 0xbfc3, 0x4203, 0x45ed, 0x42d6, 0x4552, 0x0588, 0x2ab8, 0x19d9, 0x4391, 0x1c52, 0xbf4f, 0x422e, 0x43c2, 0x43be, 0x13f3, 0x40da, 0xb2ba, 0x3a04, 0xb2cf, 0x0bb2, 0x40ab, 0x42fd, 0x3dd3, 0x417d, 0xb08a, 0x4494, 0xa6be, 0xb229, 0x426d, 0x341a, 0x4312, 0x4212, 0x4258, 0x4195, 0xb2ff, 0x4011, 0x410a, 0x42c5, 0xbfc3, 0xadc5, 0x4367, 0xb29b, 0x4272, 0x416b, 0x42d9, 0xb0bb, 0x458d, 0x4290, 0xa66c, 0x1b4c, 0xac1d, 0x4092, 0xbfd5, 0xb081, 0x438b, 0x4029, 0x00df, 0xb009, 0x449c, 0x432c, 0x425f, 0x08fe, 0xb2dd, 0xba3c, 0x4053, 0x4111, 0x43e5, 0x42fe, 0xba44, 0xb26b, 0x3581, 0x439c, 0x354a, 0x0240, 0x3da2, 0x1bad, 0x4143, 0x407e, 0xbf76, 0x40ac, 0x403e, 0x402b, 0x1fdf, 0xb2c3, 0x40cf, 0x33fb, 0x42cb, 0xb2de, 0x4075, 0x1f1c, 0x43f7, 0x4081, 0x4386, 0xb248, 0x1b37, 0xb237, 0xb251, 0xbae9, 0xb2fb, 0x43da, 0x41d1, 0xba24, 0xbfc3, 0xad4b, 0x40ad, 0x0935, 0xb2b5, 0x43f4, 0xa290, 0xb24c, 0xaea0, 0xbaf1, 0xba23, 0xab45, 0x1e3d, 0x4219, 0x4350, 0x12e3, 0x0d50, 0x4545, 0xbf70, 0x1c23, 0xb28c, 0xb2df, 0x4375, 0x44d4, 0x42b2, 0x43dd, 0xbaf0, 0x41ef, 0xbf91, 0xb24b, 0xab23, 0x1a7b, 0x285e, 0xb09a, 0x40d1, 0x4149, 0x4084, 0x1cc5, 0xba75, 0x4348, 0xba27, 0xa8ac, 0xa7d2, 0x42b9, 0x334a, 0x4594, 0x40c1, 0x42e5, 0x41a1, 0x43f8, 0x4378, 0xa603, 0xb264, 0xba4d, 0xbf53, 0xb073, 0x1f6a, 0x1d2f, 0x1c93, 0x46b3, 0x4289, 0xa678, 0x1899, 0x434b, 0x438d, 0x43e2, 0xa5b7, 0x1f65, 0x3ea4, 0x44dd, 0x43ba, 0xb2b5, 0x2490, 0x4316, 0x18d2, 0xb257, 0x4472, 0xbfb4, 0x403c, 0x4036, 0x1989, 0xa6ae, 0xb211, 0x1d91, 0x43ea, 0x404a, 0x30c3, 0x43ac, 0x124b, 0x164d, 0x40e4, 0x4271, 0xb2c4, 0x2d41, 0x417b, 0xbf14, 0x40cc, 0xba78, 0x426e, 0x31c8, 0x44c3, 0xafc8, 0x43d0, 0x1d72, 0x0d4e, 0x1c65, 0xa4d5, 0xbf7d, 0x2ea8, 0xb0c3, 0x4424, 0x466c, 0x16b6, 0x43c5, 0x181f, 0x1f13, 0x398f, 0x42e2, 0x4354, 0x18b0, 0x2c22, 0x43c8, 0xae35, 0x44d4, 0x4113, 0x1834, 0x4590, 0xbf27, 0x400e, 0x42e3, 0x4289, 0xb28d, 0x0cf4, 0x32b2, 0x0f02, 0x414b, 0x40d5, 0x43c8, 0x4565, 0x376a, 0x330d, 0x1a0e, 0xbf53, 0xb0bd, 0x42b4, 0x422e, 0xb05a, 0x41bb, 0xa3cb, 0x0947, 0xb064, 0x42c4, 0x4156, 0x1bb2, 0x0104, 0x42c6, 0x4181, 0x4096, 0xba72, 0xb0da, 0x42e1, 0xa882, 0x427e, 0x4078, 0x4174, 0x4165, 0x406c, 0xbf01, 0xb0e3, 0x40ec, 0x29ba, 0xba6a, 0x183d, 0xb22c, 0x1b41, 0xb20d, 0xbf18, 0x027e, 0x42de, 0x429a, 0x4326, 0xbace, 0x412b, 0x4394, 0x43cf, 0xbfa1, 0xaeee, 0x4398, 0x18da, 0x42d5, 0x1c5e, 0x3817, 0x312b, 0x145c, 0xb294, 0x42c0, 0x40b9, 0x42fb, 0x3eb7, 0x44e1, 0x43ef, 0x4137, 0x0b6e, 0x4248, 0x4260, 0x4130, 0x43ea, 0x413f, 0x1ae0, 0x41b9, 0x43dd, 0x40dc, 0xbf8f, 0x42bb, 0x425a, 0x40cf, 0xbaca, 0x1f8a, 0xb243, 0x1802, 0x1e4f, 0x035e, 0x411a, 0x4160, 0xae4e, 0x1d60, 0xbfdb, 0x32ef, 0x42b2, 0x46d4, 0xbf70, 0x1ffa, 0x40bc, 0xb05a, 0xbaef, 0xb2ef, 0xb2aa, 0xbf8c, 0x194e, 0x42e9, 0x46d3, 0x4388, 0x40d0, 0x200f, 0xba17, 0xba0d, 0x443e, 0x2066, 0x410d, 0x40ca, 0xa869, 0xb07f, 0x425e, 0x432d, 0xb2b5, 0x43db, 0x1d95, 0x435a, 0xaf6a, 0xb2b0, 0x1b4d, 0x41de, 0xba5f, 0x1217, 0xbf81, 0xb217, 0xb224, 0x1db7, 0x1a1b, 0x2695, 0x406a, 0x3710, 0xb291, 0x3615, 0x3e59, 0x4181, 0x188d, 0x41fd, 0xbace, 0x46b2, 0x431a, 0x4121, 0x43bf, 0x186f, 0x4178, 0x00f5, 0xbf39, 0xa8c3, 0x0415, 0xba21, 0xbad8, 0x3fc6, 0x4116, 0x41f6, 0x443e, 0x0825, 0x43cf, 0x4388, 0x3e82, 0x171a, 0xb0e0, 0xbfa7, 0x42eb, 0x4006, 0x4029, 0x4128, 0x422a, 0x4279, 0x44a1, 0x45cc, 0x1913, 0x4174, 0xbf54, 0xb2a7, 0x4123, 0x4236, 0xba06, 0x425d, 0x1d1c, 0xbf12, 0x12b2, 0xba57, 0x19cf, 0xba6a, 0xb29e, 0xbfb6, 0x2718, 0xaf18, 0xba0b, 0xb2d7, 0x405e, 0x3f04, 0x268f, 0x426e, 0x1a97, 0xa68b, 0x1dab, 0x4104, 0x4661, 0x280a, 0x4550, 0x29ff, 0x41c9, 0xbf70, 0x432b, 0x1fb6, 0x2eb9, 0x419c, 0xb2cc, 0x2b88, 0x0da0, 0xb2b1, 0x42a6, 0x1ad6, 0xbfc1, 0x4599, 0x40b2, 0xb291, 0x43d2, 0x421a, 0x4209, 0x432a, 0xb04f, 0xbaf6, 0x16c6, 0x46d3, 0xbac0, 0x1dbe, 0xbff0, 0x40e7, 0x2de7, 0xbf21, 0x1d42, 0x0f07, 0x4274, 0x4151, 0x46e4, 0xb00a, 0xbad8, 0xbf34, 0x40a1, 0x2ef9, 0x4396, 0xbf53, 0x40e9, 0x4239, 0x42da, 0x405f, 0xba0c, 0x4368, 0xb2de, 0x4449, 0x4278, 0xb2e9, 0x4317, 0x405f, 0xb063, 0x4100, 0x4698, 0x40b0, 0x45c5, 0xb2df, 0x454f, 0x2aca, 0x42ea, 0x43b0, 0x3976, 0x4327, 0x2cbd, 0xbf7d, 0x1c79, 0x2d95, 0x41cd, 0x1af1, 0x408a, 0x2eae, 0x419d, 0x1859, 0x42bf, 0x4272, 0x412a, 0x42a9, 0x0694, 0x1f68, 0x4653, 0x3a31, 0x4277, 0xa6d1, 0x413c, 0xb23c, 0xbfc0, 0x42f6, 0x4377, 0x418f, 0x464c, 0x4133, 0x4129, 0xb294, 0xbfa9, 0x247d, 0x1b16, 0x21cc, 0xbf70, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x181236f9, 0x459e9e0f, 0xd961342f, 0x122ddd5e, 0x38b78514, 0x9508b2ee, 0x97896aed, 0xad92e120, 0xfd37fa46, 0x2e0a81f8, 0x8cf97fb4, 0x8d4b1243, 0x5e1eda21, 0x54da9be4, 0x00000000, 0x500001f0 }, - FinalRegs = new uint[] { 0x00fffff3, 0x000000cc, 0xffffffce, 0xffffffff, 0x0000007d, 0x00fffff8, 0x00001b20, 0xffff4210, 0x00000007, 0x6e4f1c33, 0xfffffaff, 0xfffffaff, 0x000000c5, 0x54dab658, 0x00000000, 0x400001d0 }, + Instructions = [0xa199, 0x43c5, 0x4111, 0x1dd7, 0x4284, 0x4103, 0x41a4, 0xbf24, 0x0c40, 0x44e5, 0x448a, 0x1c19, 0x4275, 0x1e0c, 0xa7fd, 0x1c09, 0x009a, 0x1ee8, 0x459c, 0x43d0, 0x40b2, 0x426f, 0x402e, 0x4421, 0xbae9, 0x2640, 0x402a, 0x1fcd, 0x2ff9, 0x3926, 0xbf1b, 0xb281, 0xaacb, 0x45b0, 0x1c61, 0xba01, 0xb22d, 0x277d, 0x4042, 0x4374, 0x13b1, 0x146d, 0x410f, 0xb09b, 0x179d, 0x421b, 0x1ae6, 0x4085, 0x2920, 0x425a, 0x43df, 0xb244, 0x4080, 0x42dd, 0x4178, 0x43a1, 0x4057, 0xa843, 0xb2ea, 0x4195, 0xbf3f, 0x4058, 0x4042, 0xa1e7, 0x4263, 0x4060, 0x45ea, 0xba42, 0x40c5, 0xbf63, 0x0953, 0x4287, 0x11ec, 0xba1b, 0x2900, 0x1d63, 0x425b, 0xb209, 0x427d, 0x2ffd, 0x40a6, 0xba7b, 0xbfa1, 0xb227, 0x1390, 0xb2ae, 0x413f, 0xb230, 0x1ea6, 0xb063, 0x44d9, 0x43ed, 0x38e6, 0xb266, 0x11c6, 0x4353, 0x4395, 0x423d, 0x4038, 0xb0dd, 0x418d, 0x405b, 0x4165, 0xbf39, 0x1373, 0x4200, 0x458b, 0x42d4, 0x4307, 0x1f3f, 0xbf95, 0x405d, 0x43cd, 0xbaf2, 0xa1f9, 0x40f1, 0x40cf, 0x40ec, 0xb203, 0xbfcc, 0x420f, 0x1ebf, 0x2b1b, 0x4186, 0x1e1f, 0x464a, 0xba6a, 0x423d, 0x4453, 0x1f67, 0x434e, 0x27b3, 0x15d6, 0xb2d8, 0xbf53, 0xba22, 0x413b, 0x187f, 0x42fd, 0xa8c3, 0xba09, 0x41fd, 0x4442, 0x420c, 0xb296, 0xbac5, 0x4215, 0x40f2, 0x4082, 0x1a04, 0x11e2, 0x1cbf, 0x43d9, 0xb216, 0x4026, 0x3608, 0x43ea, 0x4022, 0x4092, 0x0e1f, 0x429b, 0xb2e8, 0x42df, 0xbfad, 0x349f, 0xb2ff, 0x4212, 0x4168, 0xbad1, 0x390c, 0x41e0, 0xa34a, 0x40cf, 0x419f, 0x40db, 0x2fbd, 0xb0a9, 0x4329, 0x4351, 0x4129, 0x4104, 0x4268, 0xb2c4, 0xbf13, 0x1afa, 0x2de8, 0xb0e4, 0x4191, 0xb234, 0x4041, 0xb0b4, 0xb05c, 0xba7f, 0x2b96, 0xbfc6, 0xba54, 0x434b, 0x447f, 0xbfc2, 0x4113, 0xb2ea, 0xae3d, 0x417a, 0x42f8, 0x1884, 0x1f4a, 0xba51, 0xa2aa, 0xbf15, 0x4386, 0xba75, 0x40e8, 0x1f84, 0x4202, 0x42d7, 0x19e7, 0xbf80, 0x4168, 0x45e6, 0xbff0, 0x4152, 0xbf0c, 0xabb2, 0xa8e2, 0x42f0, 0x43d5, 0x405c, 0x4229, 0x42b1, 0xb0d1, 0xbf98, 0xba2d, 0x43c0, 0x024c, 0x3d62, 0xb22e, 0x400d, 0xba54, 0x4002, 0x2696, 0x1c64, 0x1d10, 0xb2f5, 0x40b8, 0xb04f, 0x24dd, 0x43fb, 0x4042, 0x182b, 0xbafd, 0x46d2, 0xbf78, 0x4317, 0x2901, 0xadeb, 0xa020, 0x43de, 0x352d, 0x4025, 0x4067, 0x4184, 0x42af, 0x4197, 0x410b, 0x4240, 0x42ef, 0xbfcc, 0x3013, 0x454d, 0xbf58, 0x4317, 0x0df1, 0x1877, 0x422f, 0xb01b, 0xb083, 0x402d, 0xb24c, 0x3837, 0xb0ad, 0x1a40, 0x0cad, 0xa457, 0x1c71, 0xb0c5, 0x40c7, 0xbf24, 0x4115, 0x4613, 0x41da, 0x1e59, 0x1099, 0xa19d, 0x25c9, 0xba1f, 0x0da3, 0xa9c4, 0x4263, 0x4128, 0xaae7, 0xb051, 0x427c, 0xba0b, 0x41fc, 0xb234, 0x1cec, 0x40be, 0xb221, 0xba4c, 0x1fcd, 0xb21e, 0xbf4c, 0xb0fd, 0x4172, 0x1d00, 0x1b78, 0x424e, 0xbf1e, 0x1f40, 0x0324, 0x4271, 0x41f0, 0xa81e, 0x4692, 0xb21e, 0x4114, 0xbf39, 0x46aa, 0x19a7, 0x2315, 0xbadf, 0xab7d, 0x1edf, 0xba3a, 0x1a7a, 0x1ede, 0xba56, 0xb074, 0xb207, 0x460f, 0xb20f, 0xba15, 0x40de, 0x40d3, 0x4029, 0x3388, 0xb265, 0x4274, 0xba28, 0xbfd4, 0xbac1, 0x403a, 0xb011, 0xb282, 0xb212, 0xbf37, 0x4134, 0x401e, 0x42b3, 0xbaf5, 0xbfbe, 0x417e, 0x4009, 0x14f9, 0xba76, 0xb2d3, 0x40de, 0x43ee, 0x446f, 0x4238, 0xbf90, 0x4302, 0x1f23, 0x0475, 0xb256, 0x40a3, 0x4008, 0xb0d8, 0x4147, 0x3b2a, 0x00cf, 0x4381, 0xb233, 0xbff0, 0xba1c, 0x43ff, 0x41a2, 0x4376, 0xb20f, 0xbf49, 0xb2b4, 0x0dbc, 0x3189, 0x418e, 0xba32, 0x1bd8, 0xbf6f, 0xba48, 0xb207, 0xa2ad, 0x411d, 0x1a87, 0x2df4, 0x03c2, 0x2dfd, 0x4046, 0xbf90, 0x3240, 0xb015, 0x4003, 0xb29c, 0x44a2, 0x43b7, 0x4378, 0x0fd8, 0x42fe, 0x466c, 0x41a6, 0x1940, 0x4087, 0xbfba, 0x4106, 0x3ee3, 0x4219, 0x409b, 0x1976, 0x18e7, 0x24f6, 0x3f8d, 0xbad5, 0x40d9, 0x1c9a, 0x2916, 0x1cd9, 0x41e2, 0x4069, 0x1c0c, 0x45c3, 0xb0e6, 0xbfb9, 0x40dc, 0xb055, 0x0946, 0x349c, 0x4004, 0x42d3, 0x1e78, 0x43f0, 0x427c, 0xb20b, 0xb2da, 0x4206, 0x42aa, 0x1d43, 0x428a, 0x19a6, 0xb04f, 0x1f39, 0x2fdc, 0x0fa5, 0x067d, 0x2bbc, 0x405a, 0x0080, 0xbfdd, 0x1ab5, 0xba61, 0x46ec, 0x2e41, 0x43aa, 0x4080, 0x437a, 0x4112, 0x428a, 0x1efc, 0xbaf3, 0xbfc3, 0x4203, 0x45ed, 0x42d6, 0x4552, 0x0588, 0x2ab8, 0x19d9, 0x4391, 0x1c52, 0xbf4f, 0x422e, 0x43c2, 0x43be, 0x13f3, 0x40da, 0xb2ba, 0x3a04, 0xb2cf, 0x0bb2, 0x40ab, 0x42fd, 0x3dd3, 0x417d, 0xb08a, 0x4494, 0xa6be, 0xb229, 0x426d, 0x341a, 0x4312, 0x4212, 0x4258, 0x4195, 0xb2ff, 0x4011, 0x410a, 0x42c5, 0xbfc3, 0xadc5, 0x4367, 0xb29b, 0x4272, 0x416b, 0x42d9, 0xb0bb, 0x458d, 0x4290, 0xa66c, 0x1b4c, 0xac1d, 0x4092, 0xbfd5, 0xb081, 0x438b, 0x4029, 0x00df, 0xb009, 0x449c, 0x432c, 0x425f, 0x08fe, 0xb2dd, 0xba3c, 0x4053, 0x4111, 0x43e5, 0x42fe, 0xba44, 0xb26b, 0x3581, 0x439c, 0x354a, 0x0240, 0x3da2, 0x1bad, 0x4143, 0x407e, 0xbf76, 0x40ac, 0x403e, 0x402b, 0x1fdf, 0xb2c3, 0x40cf, 0x33fb, 0x42cb, 0xb2de, 0x4075, 0x1f1c, 0x43f7, 0x4081, 0x4386, 0xb248, 0x1b37, 0xb237, 0xb251, 0xbae9, 0xb2fb, 0x43da, 0x41d1, 0xba24, 0xbfc3, 0xad4b, 0x40ad, 0x0935, 0xb2b5, 0x43f4, 0xa290, 0xb24c, 0xaea0, 0xbaf1, 0xba23, 0xab45, 0x1e3d, 0x4219, 0x4350, 0x12e3, 0x0d50, 0x4545, 0xbf70, 0x1c23, 0xb28c, 0xb2df, 0x4375, 0x44d4, 0x42b2, 0x43dd, 0xbaf0, 0x41ef, 0xbf91, 0xb24b, 0xab23, 0x1a7b, 0x285e, 0xb09a, 0x40d1, 0x4149, 0x4084, 0x1cc5, 0xba75, 0x4348, 0xba27, 0xa8ac, 0xa7d2, 0x42b9, 0x334a, 0x4594, 0x40c1, 0x42e5, 0x41a1, 0x43f8, 0x4378, 0xa603, 0xb264, 0xba4d, 0xbf53, 0xb073, 0x1f6a, 0x1d2f, 0x1c93, 0x46b3, 0x4289, 0xa678, 0x1899, 0x434b, 0x438d, 0x43e2, 0xa5b7, 0x1f65, 0x3ea4, 0x44dd, 0x43ba, 0xb2b5, 0x2490, 0x4316, 0x18d2, 0xb257, 0x4472, 0xbfb4, 0x403c, 0x4036, 0x1989, 0xa6ae, 0xb211, 0x1d91, 0x43ea, 0x404a, 0x30c3, 0x43ac, 0x124b, 0x164d, 0x40e4, 0x4271, 0xb2c4, 0x2d41, 0x417b, 0xbf14, 0x40cc, 0xba78, 0x426e, 0x31c8, 0x44c3, 0xafc8, 0x43d0, 0x1d72, 0x0d4e, 0x1c65, 0xa4d5, 0xbf7d, 0x2ea8, 0xb0c3, 0x4424, 0x466c, 0x16b6, 0x43c5, 0x181f, 0x1f13, 0x398f, 0x42e2, 0x4354, 0x18b0, 0x2c22, 0x43c8, 0xae35, 0x44d4, 0x4113, 0x1834, 0x4590, 0xbf27, 0x400e, 0x42e3, 0x4289, 0xb28d, 0x0cf4, 0x32b2, 0x0f02, 0x414b, 0x40d5, 0x43c8, 0x4565, 0x376a, 0x330d, 0x1a0e, 0xbf53, 0xb0bd, 0x42b4, 0x422e, 0xb05a, 0x41bb, 0xa3cb, 0x0947, 0xb064, 0x42c4, 0x4156, 0x1bb2, 0x0104, 0x42c6, 0x4181, 0x4096, 0xba72, 0xb0da, 0x42e1, 0xa882, 0x427e, 0x4078, 0x4174, 0x4165, 0x406c, 0xbf01, 0xb0e3, 0x40ec, 0x29ba, 0xba6a, 0x183d, 0xb22c, 0x1b41, 0xb20d, 0xbf18, 0x027e, 0x42de, 0x429a, 0x4326, 0xbace, 0x412b, 0x4394, 0x43cf, 0xbfa1, 0xaeee, 0x4398, 0x18da, 0x42d5, 0x1c5e, 0x3817, 0x312b, 0x145c, 0xb294, 0x42c0, 0x40b9, 0x42fb, 0x3eb7, 0x44e1, 0x43ef, 0x4137, 0x0b6e, 0x4248, 0x4260, 0x4130, 0x43ea, 0x413f, 0x1ae0, 0x41b9, 0x43dd, 0x40dc, 0xbf8f, 0x42bb, 0x425a, 0x40cf, 0xbaca, 0x1f8a, 0xb243, 0x1802, 0x1e4f, 0x035e, 0x411a, 0x4160, 0xae4e, 0x1d60, 0xbfdb, 0x32ef, 0x42b2, 0x46d4, 0xbf70, 0x1ffa, 0x40bc, 0xb05a, 0xbaef, 0xb2ef, 0xb2aa, 0xbf8c, 0x194e, 0x42e9, 0x46d3, 0x4388, 0x40d0, 0x200f, 0xba17, 0xba0d, 0x443e, 0x2066, 0x410d, 0x40ca, 0xa869, 0xb07f, 0x425e, 0x432d, 0xb2b5, 0x43db, 0x1d95, 0x435a, 0xaf6a, 0xb2b0, 0x1b4d, 0x41de, 0xba5f, 0x1217, 0xbf81, 0xb217, 0xb224, 0x1db7, 0x1a1b, 0x2695, 0x406a, 0x3710, 0xb291, 0x3615, 0x3e59, 0x4181, 0x188d, 0x41fd, 0xbace, 0x46b2, 0x431a, 0x4121, 0x43bf, 0x186f, 0x4178, 0x00f5, 0xbf39, 0xa8c3, 0x0415, 0xba21, 0xbad8, 0x3fc6, 0x4116, 0x41f6, 0x443e, 0x0825, 0x43cf, 0x4388, 0x3e82, 0x171a, 0xb0e0, 0xbfa7, 0x42eb, 0x4006, 0x4029, 0x4128, 0x422a, 0x4279, 0x44a1, 0x45cc, 0x1913, 0x4174, 0xbf54, 0xb2a7, 0x4123, 0x4236, 0xba06, 0x425d, 0x1d1c, 0xbf12, 0x12b2, 0xba57, 0x19cf, 0xba6a, 0xb29e, 0xbfb6, 0x2718, 0xaf18, 0xba0b, 0xb2d7, 0x405e, 0x3f04, 0x268f, 0x426e, 0x1a97, 0xa68b, 0x1dab, 0x4104, 0x4661, 0x280a, 0x4550, 0x29ff, 0x41c9, 0xbf70, 0x432b, 0x1fb6, 0x2eb9, 0x419c, 0xb2cc, 0x2b88, 0x0da0, 0xb2b1, 0x42a6, 0x1ad6, 0xbfc1, 0x4599, 0x40b2, 0xb291, 0x43d2, 0x421a, 0x4209, 0x432a, 0xb04f, 0xbaf6, 0x16c6, 0x46d3, 0xbac0, 0x1dbe, 0xbff0, 0x40e7, 0x2de7, 0xbf21, 0x1d42, 0x0f07, 0x4274, 0x4151, 0x46e4, 0xb00a, 0xbad8, 0xbf34, 0x40a1, 0x2ef9, 0x4396, 0xbf53, 0x40e9, 0x4239, 0x42da, 0x405f, 0xba0c, 0x4368, 0xb2de, 0x4449, 0x4278, 0xb2e9, 0x4317, 0x405f, 0xb063, 0x4100, 0x4698, 0x40b0, 0x45c5, 0xb2df, 0x454f, 0x2aca, 0x42ea, 0x43b0, 0x3976, 0x4327, 0x2cbd, 0xbf7d, 0x1c79, 0x2d95, 0x41cd, 0x1af1, 0x408a, 0x2eae, 0x419d, 0x1859, 0x42bf, 0x4272, 0x412a, 0x42a9, 0x0694, 0x1f68, 0x4653, 0x3a31, 0x4277, 0xa6d1, 0x413c, 0xb23c, 0xbfc0, 0x42f6, 0x4377, 0x418f, 0x464c, 0x4133, 0x4129, 0xb294, 0xbfa9, 0x247d, 0x1b16, 0x21cc, 0xbf70, 0x4770, 0xe7fe + ], + StartRegs = [0x181236f9, 0x459e9e0f, 0xd961342f, 0x122ddd5e, 0x38b78514, 0x9508b2ee, 0x97896aed, 0xad92e120, 0xfd37fa46, 0x2e0a81f8, 0x8cf97fb4, 0x8d4b1243, 0x5e1eda21, 0x54da9be4, 0x00000000, 0x500001f0 + ], + FinalRegs = [0x00fffff3, 0x000000cc, 0xffffffce, 0xffffffff, 0x0000007d, 0x00fffff8, 0x00001b20, 0xffff4210, 0x00000007, 0x6e4f1c33, 0xfffffaff, 0xfffffaff, 0x000000c5, 0x54dab658, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x4239, 0xba45, 0xa273, 0xbacd, 0xb2e4, 0x0b51, 0x406c, 0x43a9, 0x1ae2, 0xbad9, 0x1eff, 0xbfc2, 0x42b3, 0xb0ef, 0xb0ab, 0x2572, 0x4344, 0x4165, 0xb279, 0x127a, 0xb2e2, 0xac76, 0x35b9, 0xb2d5, 0x41d2, 0x3d37, 0x43f2, 0xbf9a, 0xb207, 0x40b9, 0xba37, 0x21f3, 0x03e4, 0x430f, 0x444d, 0x1d73, 0x4354, 0x07a6, 0x1b8f, 0xb284, 0xb239, 0xbaed, 0xb2b2, 0xb2a6, 0x45da, 0xb20a, 0x1f8f, 0xb21e, 0x40fa, 0xa7cd, 0xb237, 0xbfd7, 0x444e, 0x4113, 0xbad8, 0x34c6, 0xbf43, 0xa315, 0x14bc, 0x416b, 0x4246, 0x3ae5, 0x46a3, 0xac12, 0xba29, 0xad08, 0x11c5, 0xb28e, 0x1443, 0xbf60, 0x41cb, 0xba32, 0x40a7, 0x40a0, 0x4206, 0xb250, 0xb268, 0x435b, 0xbf8f, 0x429d, 0xbfc0, 0x422b, 0x43e4, 0xb070, 0x1d90, 0x405b, 0x40f8, 0x435b, 0xb232, 0x4251, 0xbfac, 0x424d, 0x39e5, 0xb2b8, 0x46e3, 0x0171, 0x46bd, 0xbf90, 0x40c3, 0x36af, 0x429a, 0x41e9, 0xb25d, 0xb000, 0x3c9d, 0x096e, 0x4030, 0xbfd1, 0x1f7e, 0x27fe, 0xb073, 0x41e0, 0xa276, 0xb0ae, 0xb062, 0x1d63, 0xb203, 0xbfaf, 0x4323, 0x4376, 0xbac1, 0xb0e5, 0x43b8, 0x26f1, 0x4120, 0x37ee, 0xbf7a, 0xb232, 0x43ca, 0x43b9, 0xb2c2, 0x46c0, 0x3ea3, 0x152b, 0x4202, 0x4232, 0xb2b0, 0xbf15, 0xb299, 0xba6a, 0x4199, 0x102a, 0x4023, 0x401a, 0xaa93, 0x4190, 0xba4c, 0xa1ab, 0xb2bd, 0xb017, 0x4375, 0x40b6, 0x43b8, 0x18cf, 0x18c8, 0x406c, 0xac65, 0x2956, 0x0fe6, 0x4001, 0x1c31, 0x423a, 0x42c6, 0x41fa, 0x1bf9, 0x40b7, 0x21bc, 0xbf43, 0x405e, 0x1ce7, 0x41a4, 0x415e, 0x41eb, 0x40a9, 0x41fc, 0xb004, 0x42e1, 0x4370, 0x42db, 0xbaee, 0x42df, 0x0d78, 0xb0f8, 0x4394, 0xb2a4, 0x3923, 0x3c97, 0x4206, 0xb0fb, 0xb21c, 0x10cb, 0x4050, 0x3634, 0xbf03, 0xb0ad, 0x46ed, 0x38c3, 0x1945, 0x4236, 0x17c2, 0x282d, 0xbae2, 0x40b6, 0x22e8, 0x42ac, 0x1b6d, 0xba53, 0x414e, 0xb013, 0xb0c2, 0x41ff, 0xb281, 0x1cd3, 0x41da, 0x4141, 0x420f, 0xa91b, 0x35d5, 0xa6d8, 0xba09, 0x4156, 0x278e, 0xbf11, 0x45be, 0xa4ee, 0xb28b, 0x3d9d, 0xb2b3, 0x0dea, 0xa044, 0x43d1, 0x2843, 0x425b, 0xa5dc, 0x26b9, 0x1ef7, 0xba61, 0x028d, 0xa302, 0xb061, 0x4306, 0x2b7d, 0x1b33, 0x4215, 0x1dbe, 0x40cc, 0x41af, 0x1fef, 0xbf77, 0x4308, 0xba38, 0x4306, 0x4099, 0xb275, 0xbf6d, 0xbae5, 0x1f9f, 0x1cc6, 0x1101, 0x42ca, 0x2e58, 0x41a7, 0xb235, 0x29fa, 0x43dd, 0x41d8, 0x402c, 0x4138, 0x41e8, 0x3d38, 0xba10, 0x41f6, 0xb26f, 0x1e35, 0xba03, 0xb2b3, 0x1c33, 0x40f7, 0x3fbf, 0x4359, 0x45ae, 0xbf1f, 0x405e, 0x43f4, 0x419a, 0x207e, 0xa253, 0xb084, 0xac7c, 0xb232, 0xbf00, 0xb01e, 0x1b16, 0x318e, 0xae09, 0x447c, 0x1a2c, 0xaf1f, 0x0953, 0xaf93, 0xb23f, 0xb286, 0x43b0, 0x1cdb, 0xba74, 0x2e38, 0xbf3d, 0x3640, 0x1eba, 0x3f29, 0x4339, 0x43b4, 0x257a, 0xba48, 0xb20d, 0x188c, 0x412b, 0x1232, 0xba24, 0x464e, 0xb2f5, 0x42fe, 0x40d8, 0xa5b3, 0xb210, 0x43ad, 0xaf54, 0xb273, 0x0770, 0x4261, 0x415a, 0x42cf, 0x3104, 0x1c29, 0x368d, 0xba20, 0xbfd2, 0x416b, 0xb2ed, 0x40a7, 0x1ff4, 0xbaf4, 0x1d6a, 0x1d89, 0x4398, 0x1839, 0xb0d7, 0x458e, 0xba38, 0x4019, 0x432c, 0x028b, 0x4323, 0xb09c, 0x1444, 0x423d, 0xb286, 0xbfe0, 0xba19, 0x1439, 0x346c, 0xbfa5, 0xb0ab, 0x2da0, 0x403d, 0x40b0, 0x404a, 0x105c, 0x1c9c, 0x408b, 0x4239, 0x2701, 0x226e, 0x41ba, 0xb246, 0x4123, 0xb0ba, 0x40b6, 0xbfcf, 0xb065, 0x4220, 0x4200, 0x410e, 0x0e39, 0x415f, 0xba6e, 0x43ef, 0x424c, 0x3ba0, 0x3e8d, 0x45b6, 0x4037, 0x4179, 0x4241, 0xb0dd, 0xbf2f, 0x40ff, 0x434a, 0x4336, 0xbada, 0xb279, 0xb0f4, 0x11c7, 0x41c2, 0x1e64, 0x4301, 0x1e52, 0x1892, 0xbfd2, 0x409a, 0xba57, 0x4197, 0x432d, 0xbf25, 0x40a2, 0xac2d, 0xaaed, 0xb257, 0x34e1, 0xba04, 0x4258, 0x18b0, 0x4384, 0x1397, 0xa3ae, 0xb0d7, 0xb28f, 0x425e, 0x422b, 0x4314, 0x222d, 0x3b0e, 0xbf97, 0x41c3, 0x4209, 0x43b1, 0x2442, 0xa92c, 0xb02c, 0xbf35, 0xb293, 0x2e27, 0x41f5, 0x4322, 0x0a11, 0x40ee, 0x0966, 0xbad5, 0xb28e, 0x19b3, 0x4015, 0x45be, 0xb25d, 0x415d, 0x41e0, 0x1bc8, 0xbfd9, 0xb08a, 0x1c28, 0x4281, 0x4309, 0x430a, 0x402c, 0xb2c2, 0x40e4, 0xba22, 0xb00d, 0x418c, 0x32ee, 0x40a5, 0xb2bb, 0x43fb, 0xb2f9, 0x43bc, 0x41b8, 0x4098, 0x1a85, 0x4162, 0x41d2, 0x40be, 0x4613, 0x2b71, 0x0ee4, 0xb0ef, 0xbae0, 0xbf17, 0x43cb, 0x4082, 0xb20f, 0x41a0, 0x198a, 0x2530, 0x2c43, 0x3981, 0x1f52, 0x423e, 0xbf04, 0x43a2, 0x4043, 0x4079, 0x1bb9, 0x4268, 0x2138, 0x1aee, 0xbf88, 0x419c, 0xb2cd, 0x1cf4, 0x03df, 0x1acf, 0x4589, 0xba06, 0x4207, 0x43d8, 0xba09, 0xbfa0, 0x4606, 0x4243, 0x417c, 0x3043, 0xbf6e, 0x4365, 0x4488, 0x405d, 0x2d15, 0x41c4, 0x4111, 0xbf62, 0x4321, 0x4135, 0x3c6e, 0x0893, 0x260f, 0x400c, 0x4091, 0x4135, 0x40a7, 0x116e, 0x467d, 0xbf2e, 0x0fae, 0x4091, 0xa2a7, 0x0bed, 0x4550, 0x4268, 0x4305, 0xbf46, 0xb2e8, 0x3fe3, 0x1942, 0x439f, 0xa9d4, 0xbf9b, 0x4236, 0x1d7a, 0x28a1, 0xb0d2, 0x3a43, 0x40f6, 0x42c5, 0x4275, 0xb245, 0x43c2, 0x3019, 0x1eff, 0xa434, 0x4360, 0x3af7, 0x42bb, 0xbf80, 0x44ab, 0xbf4d, 0xab4f, 0xb068, 0xaf79, 0x4291, 0xb281, 0x4621, 0x42fa, 0xb2fe, 0x10f6, 0xbf80, 0x4018, 0x41ed, 0xb24f, 0xb02e, 0x456f, 0x41da, 0xbf1d, 0xbf90, 0x4118, 0x4307, 0x422d, 0x430e, 0x41c3, 0x0fe8, 0x315d, 0xb2b8, 0x1d2f, 0x1e41, 0x0a83, 0x41ac, 0x1d8c, 0x43b9, 0x4691, 0x45c2, 0xba25, 0x1cf0, 0xba01, 0x0098, 0xbfb2, 0x05fd, 0x404f, 0x4268, 0x0194, 0xabd2, 0xbfd0, 0xbf93, 0x1489, 0xb274, 0x2bec, 0x4225, 0x2a29, 0xba47, 0x23e9, 0xa627, 0xba14, 0x40ea, 0xa9ef, 0x27b9, 0xba57, 0xbf5d, 0x1a24, 0x465d, 0x4319, 0xba31, 0x4170, 0x04ed, 0xb295, 0xbaca, 0x417b, 0x4130, 0xb28a, 0x406b, 0xb252, 0x4090, 0x371e, 0x43fd, 0x1b99, 0x222a, 0x40f2, 0x4607, 0xbf91, 0xa406, 0x0d68, 0x410b, 0x41cb, 0xbfca, 0x43b5, 0x1cc7, 0x3cf1, 0xb275, 0x438c, 0x409d, 0xa26c, 0x433d, 0x1e60, 0xb24f, 0xbf63, 0x1b7e, 0x423d, 0x129a, 0xb0d1, 0x40b2, 0x1f17, 0x1fa4, 0x4095, 0xb068, 0xbf70, 0x40aa, 0x2399, 0x012b, 0x00cb, 0x410b, 0x2251, 0x1eed, 0x1f84, 0xaab2, 0xb064, 0x4090, 0xb043, 0x4180, 0x46a0, 0x2617, 0x4203, 0x4122, 0x136f, 0xbf46, 0x195a, 0x43d9, 0xb025, 0xb02b, 0x42db, 0x41e2, 0xa62b, 0x404e, 0xba7f, 0xbfa9, 0x31f0, 0x43db, 0x46b1, 0x404a, 0x1862, 0x425a, 0xb21e, 0x41a0, 0x4573, 0x40f0, 0xb228, 0x423b, 0x1f8f, 0x410f, 0x0667, 0x44a3, 0x02bf, 0xb280, 0x4008, 0x44d0, 0x4216, 0xbf61, 0x3b93, 0x420f, 0x0b94, 0xa28c, 0x432b, 0x1fa5, 0xbf5e, 0x4305, 0x42dc, 0x42ce, 0x4335, 0x1c24, 0x4615, 0x4295, 0x11a7, 0xba38, 0x42e6, 0x46aa, 0x1faa, 0xb2b0, 0xb222, 0x1112, 0x094a, 0x43d4, 0x4034, 0x1b1b, 0xbf66, 0x1fa4, 0x4082, 0x4228, 0x1b74, 0xb252, 0x3875, 0xb2f6, 0x23ec, 0x420b, 0x40b2, 0x46a8, 0x06f2, 0x1954, 0xb206, 0xbfac, 0x421d, 0xbac3, 0xbf80, 0xb0e5, 0x4274, 0xbfaf, 0xbf70, 0x36bc, 0xb2ae, 0xba44, 0x405c, 0xbf70, 0xb0be, 0xbadf, 0x304b, 0x4231, 0xb250, 0x18ca, 0xba6b, 0x4144, 0xb248, 0x2d0a, 0xbf90, 0x4474, 0x43e4, 0x4307, 0xa8c6, 0x4153, 0x41c6, 0xbf5c, 0x4161, 0x0875, 0x432f, 0xb234, 0xb2f0, 0x417e, 0xb2b2, 0x3ea9, 0x42d7, 0xba5e, 0xb04b, 0x1d7c, 0x4227, 0xbfbd, 0x422f, 0x43db, 0x3b1d, 0x41a3, 0x431b, 0xb29f, 0x433a, 0xb275, 0xa6ed, 0x4035, 0x07e4, 0x1978, 0x4096, 0x1f30, 0x386d, 0x4132, 0x41e5, 0xb254, 0x04e9, 0x1f81, 0xb2c5, 0x1507, 0xbf49, 0x4464, 0x431d, 0xa8cc, 0x41ab, 0x42df, 0x4158, 0x43e5, 0x4243, 0xb230, 0xb24b, 0xb262, 0x0f27, 0x42c5, 0x4321, 0xbad1, 0x0b26, 0x24b1, 0x18e4, 0xb285, 0xbf8d, 0x434a, 0x42f9, 0x4007, 0x4061, 0xbfc3, 0x3a04, 0x45ed, 0xa055, 0x44c8, 0xa20f, 0x423d, 0x1ee2, 0x44b5, 0x1e41, 0xae96, 0x0d96, 0x411b, 0x4384, 0x45ab, 0xbf15, 0x1f8a, 0x0b2d, 0x42e4, 0x437d, 0xb23c, 0x3ca6, 0x1d27, 0x429f, 0xbad6, 0x4056, 0x429a, 0xbf02, 0xb0c7, 0xbfb0, 0x4300, 0x413c, 0x40ca, 0x42e3, 0x426b, 0x08df, 0xa9a2, 0x44ec, 0x42e1, 0x4295, 0x0436, 0xb2e8, 0xbf53, 0x4499, 0xa2c7, 0x4000, 0x4274, 0x4299, 0xb211, 0x40c7, 0x31f0, 0xb25e, 0xb2f4, 0x413b, 0x1d10, 0x3f32, 0xbf22, 0x4381, 0x2c17, 0xb2a3, 0x4075, 0x3d15, 0x4455, 0x1a65, 0x40c1, 0x2389, 0x41eb, 0x1238, 0xb2ab, 0x1fea, 0x4022, 0x1f25, 0x4072, 0x403e, 0xb021, 0x45c5, 0x1c07, 0x421a, 0x4557, 0xbf60, 0x416b, 0xb2f3, 0xbf7d, 0x4005, 0x3e21, 0xbf60, 0xb225, 0x409b, 0x4340, 0x00db, 0x413d, 0x4275, 0x4574, 0x44b1, 0x412f, 0x4049, 0x2295, 0x20e6, 0xbf0c, 0x4021, 0x185e, 0x4317, 0x41a6, 0xb24e, 0x41c4, 0x2d7b, 0xb07b, 0x0b1e, 0x2317, 0x4254, 0x295f, 0x42f9, 0x4644, 0x1a5e, 0xb208, 0xba1e, 0x400d, 0x1bc5, 0xa2fc, 0x194f, 0xbfb5, 0xb26e, 0x40fd, 0x37c1, 0x4314, 0x432e, 0xaa7f, 0x17da, 0x43e1, 0x1ad4, 0xb06b, 0x4001, 0x071f, 0xba54, 0x1eeb, 0x1ddb, 0x2da8, 0x432c, 0x307f, 0x41c2, 0x2eea, 0xbad1, 0x43d7, 0xbf5c, 0x1edb, 0xbaed, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x7050d002, 0x2ad824dc, 0xcda44a5a, 0xbe440822, 0x6fa909fc, 0x5324049c, 0xb3f8f834, 0x42ed399f, 0x207b9830, 0xa4b5347a, 0x1f876040, 0xfb4d4a81, 0x16ce792a, 0x219b1d90, 0x00000000, 0x300001f0 }, - FinalRegs = new uint[] { 0x0000007f, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x17000000, 0xffffffff, 0x00001631, 0x0000160f, 0x00000001, 0x16ce8d4b, 0x16cfdbf9, 0x000166eb, 0x00000000, 0xa00001d0 }, + Instructions = [0x4239, 0xba45, 0xa273, 0xbacd, 0xb2e4, 0x0b51, 0x406c, 0x43a9, 0x1ae2, 0xbad9, 0x1eff, 0xbfc2, 0x42b3, 0xb0ef, 0xb0ab, 0x2572, 0x4344, 0x4165, 0xb279, 0x127a, 0xb2e2, 0xac76, 0x35b9, 0xb2d5, 0x41d2, 0x3d37, 0x43f2, 0xbf9a, 0xb207, 0x40b9, 0xba37, 0x21f3, 0x03e4, 0x430f, 0x444d, 0x1d73, 0x4354, 0x07a6, 0x1b8f, 0xb284, 0xb239, 0xbaed, 0xb2b2, 0xb2a6, 0x45da, 0xb20a, 0x1f8f, 0xb21e, 0x40fa, 0xa7cd, 0xb237, 0xbfd7, 0x444e, 0x4113, 0xbad8, 0x34c6, 0xbf43, 0xa315, 0x14bc, 0x416b, 0x4246, 0x3ae5, 0x46a3, 0xac12, 0xba29, 0xad08, 0x11c5, 0xb28e, 0x1443, 0xbf60, 0x41cb, 0xba32, 0x40a7, 0x40a0, 0x4206, 0xb250, 0xb268, 0x435b, 0xbf8f, 0x429d, 0xbfc0, 0x422b, 0x43e4, 0xb070, 0x1d90, 0x405b, 0x40f8, 0x435b, 0xb232, 0x4251, 0xbfac, 0x424d, 0x39e5, 0xb2b8, 0x46e3, 0x0171, 0x46bd, 0xbf90, 0x40c3, 0x36af, 0x429a, 0x41e9, 0xb25d, 0xb000, 0x3c9d, 0x096e, 0x4030, 0xbfd1, 0x1f7e, 0x27fe, 0xb073, 0x41e0, 0xa276, 0xb0ae, 0xb062, 0x1d63, 0xb203, 0xbfaf, 0x4323, 0x4376, 0xbac1, 0xb0e5, 0x43b8, 0x26f1, 0x4120, 0x37ee, 0xbf7a, 0xb232, 0x43ca, 0x43b9, 0xb2c2, 0x46c0, 0x3ea3, 0x152b, 0x4202, 0x4232, 0xb2b0, 0xbf15, 0xb299, 0xba6a, 0x4199, 0x102a, 0x4023, 0x401a, 0xaa93, 0x4190, 0xba4c, 0xa1ab, 0xb2bd, 0xb017, 0x4375, 0x40b6, 0x43b8, 0x18cf, 0x18c8, 0x406c, 0xac65, 0x2956, 0x0fe6, 0x4001, 0x1c31, 0x423a, 0x42c6, 0x41fa, 0x1bf9, 0x40b7, 0x21bc, 0xbf43, 0x405e, 0x1ce7, 0x41a4, 0x415e, 0x41eb, 0x40a9, 0x41fc, 0xb004, 0x42e1, 0x4370, 0x42db, 0xbaee, 0x42df, 0x0d78, 0xb0f8, 0x4394, 0xb2a4, 0x3923, 0x3c97, 0x4206, 0xb0fb, 0xb21c, 0x10cb, 0x4050, 0x3634, 0xbf03, 0xb0ad, 0x46ed, 0x38c3, 0x1945, 0x4236, 0x17c2, 0x282d, 0xbae2, 0x40b6, 0x22e8, 0x42ac, 0x1b6d, 0xba53, 0x414e, 0xb013, 0xb0c2, 0x41ff, 0xb281, 0x1cd3, 0x41da, 0x4141, 0x420f, 0xa91b, 0x35d5, 0xa6d8, 0xba09, 0x4156, 0x278e, 0xbf11, 0x45be, 0xa4ee, 0xb28b, 0x3d9d, 0xb2b3, 0x0dea, 0xa044, 0x43d1, 0x2843, 0x425b, 0xa5dc, 0x26b9, 0x1ef7, 0xba61, 0x028d, 0xa302, 0xb061, 0x4306, 0x2b7d, 0x1b33, 0x4215, 0x1dbe, 0x40cc, 0x41af, 0x1fef, 0xbf77, 0x4308, 0xba38, 0x4306, 0x4099, 0xb275, 0xbf6d, 0xbae5, 0x1f9f, 0x1cc6, 0x1101, 0x42ca, 0x2e58, 0x41a7, 0xb235, 0x29fa, 0x43dd, 0x41d8, 0x402c, 0x4138, 0x41e8, 0x3d38, 0xba10, 0x41f6, 0xb26f, 0x1e35, 0xba03, 0xb2b3, 0x1c33, 0x40f7, 0x3fbf, 0x4359, 0x45ae, 0xbf1f, 0x405e, 0x43f4, 0x419a, 0x207e, 0xa253, 0xb084, 0xac7c, 0xb232, 0xbf00, 0xb01e, 0x1b16, 0x318e, 0xae09, 0x447c, 0x1a2c, 0xaf1f, 0x0953, 0xaf93, 0xb23f, 0xb286, 0x43b0, 0x1cdb, 0xba74, 0x2e38, 0xbf3d, 0x3640, 0x1eba, 0x3f29, 0x4339, 0x43b4, 0x257a, 0xba48, 0xb20d, 0x188c, 0x412b, 0x1232, 0xba24, 0x464e, 0xb2f5, 0x42fe, 0x40d8, 0xa5b3, 0xb210, 0x43ad, 0xaf54, 0xb273, 0x0770, 0x4261, 0x415a, 0x42cf, 0x3104, 0x1c29, 0x368d, 0xba20, 0xbfd2, 0x416b, 0xb2ed, 0x40a7, 0x1ff4, 0xbaf4, 0x1d6a, 0x1d89, 0x4398, 0x1839, 0xb0d7, 0x458e, 0xba38, 0x4019, 0x432c, 0x028b, 0x4323, 0xb09c, 0x1444, 0x423d, 0xb286, 0xbfe0, 0xba19, 0x1439, 0x346c, 0xbfa5, 0xb0ab, 0x2da0, 0x403d, 0x40b0, 0x404a, 0x105c, 0x1c9c, 0x408b, 0x4239, 0x2701, 0x226e, 0x41ba, 0xb246, 0x4123, 0xb0ba, 0x40b6, 0xbfcf, 0xb065, 0x4220, 0x4200, 0x410e, 0x0e39, 0x415f, 0xba6e, 0x43ef, 0x424c, 0x3ba0, 0x3e8d, 0x45b6, 0x4037, 0x4179, 0x4241, 0xb0dd, 0xbf2f, 0x40ff, 0x434a, 0x4336, 0xbada, 0xb279, 0xb0f4, 0x11c7, 0x41c2, 0x1e64, 0x4301, 0x1e52, 0x1892, 0xbfd2, 0x409a, 0xba57, 0x4197, 0x432d, 0xbf25, 0x40a2, 0xac2d, 0xaaed, 0xb257, 0x34e1, 0xba04, 0x4258, 0x18b0, 0x4384, 0x1397, 0xa3ae, 0xb0d7, 0xb28f, 0x425e, 0x422b, 0x4314, 0x222d, 0x3b0e, 0xbf97, 0x41c3, 0x4209, 0x43b1, 0x2442, 0xa92c, 0xb02c, 0xbf35, 0xb293, 0x2e27, 0x41f5, 0x4322, 0x0a11, 0x40ee, 0x0966, 0xbad5, 0xb28e, 0x19b3, 0x4015, 0x45be, 0xb25d, 0x415d, 0x41e0, 0x1bc8, 0xbfd9, 0xb08a, 0x1c28, 0x4281, 0x4309, 0x430a, 0x402c, 0xb2c2, 0x40e4, 0xba22, 0xb00d, 0x418c, 0x32ee, 0x40a5, 0xb2bb, 0x43fb, 0xb2f9, 0x43bc, 0x41b8, 0x4098, 0x1a85, 0x4162, 0x41d2, 0x40be, 0x4613, 0x2b71, 0x0ee4, 0xb0ef, 0xbae0, 0xbf17, 0x43cb, 0x4082, 0xb20f, 0x41a0, 0x198a, 0x2530, 0x2c43, 0x3981, 0x1f52, 0x423e, 0xbf04, 0x43a2, 0x4043, 0x4079, 0x1bb9, 0x4268, 0x2138, 0x1aee, 0xbf88, 0x419c, 0xb2cd, 0x1cf4, 0x03df, 0x1acf, 0x4589, 0xba06, 0x4207, 0x43d8, 0xba09, 0xbfa0, 0x4606, 0x4243, 0x417c, 0x3043, 0xbf6e, 0x4365, 0x4488, 0x405d, 0x2d15, 0x41c4, 0x4111, 0xbf62, 0x4321, 0x4135, 0x3c6e, 0x0893, 0x260f, 0x400c, 0x4091, 0x4135, 0x40a7, 0x116e, 0x467d, 0xbf2e, 0x0fae, 0x4091, 0xa2a7, 0x0bed, 0x4550, 0x4268, 0x4305, 0xbf46, 0xb2e8, 0x3fe3, 0x1942, 0x439f, 0xa9d4, 0xbf9b, 0x4236, 0x1d7a, 0x28a1, 0xb0d2, 0x3a43, 0x40f6, 0x42c5, 0x4275, 0xb245, 0x43c2, 0x3019, 0x1eff, 0xa434, 0x4360, 0x3af7, 0x42bb, 0xbf80, 0x44ab, 0xbf4d, 0xab4f, 0xb068, 0xaf79, 0x4291, 0xb281, 0x4621, 0x42fa, 0xb2fe, 0x10f6, 0xbf80, 0x4018, 0x41ed, 0xb24f, 0xb02e, 0x456f, 0x41da, 0xbf1d, 0xbf90, 0x4118, 0x4307, 0x422d, 0x430e, 0x41c3, 0x0fe8, 0x315d, 0xb2b8, 0x1d2f, 0x1e41, 0x0a83, 0x41ac, 0x1d8c, 0x43b9, 0x4691, 0x45c2, 0xba25, 0x1cf0, 0xba01, 0x0098, 0xbfb2, 0x05fd, 0x404f, 0x4268, 0x0194, 0xabd2, 0xbfd0, 0xbf93, 0x1489, 0xb274, 0x2bec, 0x4225, 0x2a29, 0xba47, 0x23e9, 0xa627, 0xba14, 0x40ea, 0xa9ef, 0x27b9, 0xba57, 0xbf5d, 0x1a24, 0x465d, 0x4319, 0xba31, 0x4170, 0x04ed, 0xb295, 0xbaca, 0x417b, 0x4130, 0xb28a, 0x406b, 0xb252, 0x4090, 0x371e, 0x43fd, 0x1b99, 0x222a, 0x40f2, 0x4607, 0xbf91, 0xa406, 0x0d68, 0x410b, 0x41cb, 0xbfca, 0x43b5, 0x1cc7, 0x3cf1, 0xb275, 0x438c, 0x409d, 0xa26c, 0x433d, 0x1e60, 0xb24f, 0xbf63, 0x1b7e, 0x423d, 0x129a, 0xb0d1, 0x40b2, 0x1f17, 0x1fa4, 0x4095, 0xb068, 0xbf70, 0x40aa, 0x2399, 0x012b, 0x00cb, 0x410b, 0x2251, 0x1eed, 0x1f84, 0xaab2, 0xb064, 0x4090, 0xb043, 0x4180, 0x46a0, 0x2617, 0x4203, 0x4122, 0x136f, 0xbf46, 0x195a, 0x43d9, 0xb025, 0xb02b, 0x42db, 0x41e2, 0xa62b, 0x404e, 0xba7f, 0xbfa9, 0x31f0, 0x43db, 0x46b1, 0x404a, 0x1862, 0x425a, 0xb21e, 0x41a0, 0x4573, 0x40f0, 0xb228, 0x423b, 0x1f8f, 0x410f, 0x0667, 0x44a3, 0x02bf, 0xb280, 0x4008, 0x44d0, 0x4216, 0xbf61, 0x3b93, 0x420f, 0x0b94, 0xa28c, 0x432b, 0x1fa5, 0xbf5e, 0x4305, 0x42dc, 0x42ce, 0x4335, 0x1c24, 0x4615, 0x4295, 0x11a7, 0xba38, 0x42e6, 0x46aa, 0x1faa, 0xb2b0, 0xb222, 0x1112, 0x094a, 0x43d4, 0x4034, 0x1b1b, 0xbf66, 0x1fa4, 0x4082, 0x4228, 0x1b74, 0xb252, 0x3875, 0xb2f6, 0x23ec, 0x420b, 0x40b2, 0x46a8, 0x06f2, 0x1954, 0xb206, 0xbfac, 0x421d, 0xbac3, 0xbf80, 0xb0e5, 0x4274, 0xbfaf, 0xbf70, 0x36bc, 0xb2ae, 0xba44, 0x405c, 0xbf70, 0xb0be, 0xbadf, 0x304b, 0x4231, 0xb250, 0x18ca, 0xba6b, 0x4144, 0xb248, 0x2d0a, 0xbf90, 0x4474, 0x43e4, 0x4307, 0xa8c6, 0x4153, 0x41c6, 0xbf5c, 0x4161, 0x0875, 0x432f, 0xb234, 0xb2f0, 0x417e, 0xb2b2, 0x3ea9, 0x42d7, 0xba5e, 0xb04b, 0x1d7c, 0x4227, 0xbfbd, 0x422f, 0x43db, 0x3b1d, 0x41a3, 0x431b, 0xb29f, 0x433a, 0xb275, 0xa6ed, 0x4035, 0x07e4, 0x1978, 0x4096, 0x1f30, 0x386d, 0x4132, 0x41e5, 0xb254, 0x04e9, 0x1f81, 0xb2c5, 0x1507, 0xbf49, 0x4464, 0x431d, 0xa8cc, 0x41ab, 0x42df, 0x4158, 0x43e5, 0x4243, 0xb230, 0xb24b, 0xb262, 0x0f27, 0x42c5, 0x4321, 0xbad1, 0x0b26, 0x24b1, 0x18e4, 0xb285, 0xbf8d, 0x434a, 0x42f9, 0x4007, 0x4061, 0xbfc3, 0x3a04, 0x45ed, 0xa055, 0x44c8, 0xa20f, 0x423d, 0x1ee2, 0x44b5, 0x1e41, 0xae96, 0x0d96, 0x411b, 0x4384, 0x45ab, 0xbf15, 0x1f8a, 0x0b2d, 0x42e4, 0x437d, 0xb23c, 0x3ca6, 0x1d27, 0x429f, 0xbad6, 0x4056, 0x429a, 0xbf02, 0xb0c7, 0xbfb0, 0x4300, 0x413c, 0x40ca, 0x42e3, 0x426b, 0x08df, 0xa9a2, 0x44ec, 0x42e1, 0x4295, 0x0436, 0xb2e8, 0xbf53, 0x4499, 0xa2c7, 0x4000, 0x4274, 0x4299, 0xb211, 0x40c7, 0x31f0, 0xb25e, 0xb2f4, 0x413b, 0x1d10, 0x3f32, 0xbf22, 0x4381, 0x2c17, 0xb2a3, 0x4075, 0x3d15, 0x4455, 0x1a65, 0x40c1, 0x2389, 0x41eb, 0x1238, 0xb2ab, 0x1fea, 0x4022, 0x1f25, 0x4072, 0x403e, 0xb021, 0x45c5, 0x1c07, 0x421a, 0x4557, 0xbf60, 0x416b, 0xb2f3, 0xbf7d, 0x4005, 0x3e21, 0xbf60, 0xb225, 0x409b, 0x4340, 0x00db, 0x413d, 0x4275, 0x4574, 0x44b1, 0x412f, 0x4049, 0x2295, 0x20e6, 0xbf0c, 0x4021, 0x185e, 0x4317, 0x41a6, 0xb24e, 0x41c4, 0x2d7b, 0xb07b, 0x0b1e, 0x2317, 0x4254, 0x295f, 0x42f9, 0x4644, 0x1a5e, 0xb208, 0xba1e, 0x400d, 0x1bc5, 0xa2fc, 0x194f, 0xbfb5, 0xb26e, 0x40fd, 0x37c1, 0x4314, 0x432e, 0xaa7f, 0x17da, 0x43e1, 0x1ad4, 0xb06b, 0x4001, 0x071f, 0xba54, 0x1eeb, 0x1ddb, 0x2da8, 0x432c, 0x307f, 0x41c2, 0x2eea, 0xbad1, 0x43d7, 0xbf5c, 0x1edb, 0xbaed, 0x4770, 0xe7fe + ], + StartRegs = [0x7050d002, 0x2ad824dc, 0xcda44a5a, 0xbe440822, 0x6fa909fc, 0x5324049c, 0xb3f8f834, 0x42ed399f, 0x207b9830, 0xa4b5347a, 0x1f876040, 0xfb4d4a81, 0x16ce792a, 0x219b1d90, 0x00000000, 0x300001f0 + ], + FinalRegs = [0x0000007f, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x17000000, 0xffffffff, 0x00001631, 0x0000160f, 0x00000001, 0x16ce8d4b, 0x16cfdbf9, 0x000166eb, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x1d91, 0xbae9, 0x3565, 0xb2f7, 0x4627, 0x41f1, 0xbfe8, 0x4294, 0x0fb8, 0x2445, 0x0e33, 0x29fa, 0x116e, 0x345c, 0x44b5, 0xb2d2, 0x4013, 0x4246, 0x2612, 0x4133, 0x42bc, 0xb28a, 0xbf14, 0x4370, 0x194f, 0x4319, 0x4264, 0xb0d1, 0x1c87, 0x4329, 0xbfc4, 0x441e, 0x4212, 0x1b80, 0x4261, 0x0436, 0x46e1, 0x444e, 0x1a0b, 0x40d3, 0xa4e6, 0x407b, 0x4201, 0x426d, 0x43a3, 0x436d, 0x1a3c, 0x1b83, 0xad83, 0xbadf, 0x4016, 0xb058, 0xacc4, 0xbf90, 0x43ea, 0x4445, 0xb2fe, 0x08da, 0xbf29, 0x41a9, 0x0835, 0x0f8d, 0x1e32, 0x0a48, 0x41f4, 0xbaca, 0x41e4, 0x41ac, 0xba02, 0x1db6, 0xb099, 0x1f86, 0xbfd0, 0xa3b6, 0x463a, 0x4108, 0x2cb1, 0xb0ce, 0xb261, 0xba1b, 0x1edc, 0xba7a, 0x4285, 0xb206, 0x4078, 0x4252, 0xa63c, 0x107d, 0xbf9b, 0x4331, 0x40c1, 0x415c, 0x4062, 0x186b, 0x1e9d, 0x4014, 0x32c3, 0x43e7, 0x40e6, 0x4382, 0xba6e, 0x4332, 0x1cea, 0x0bb1, 0x1de5, 0x429c, 0x41f1, 0x4243, 0x0059, 0x41db, 0xa558, 0xbf7c, 0x4203, 0x43a7, 0x43d8, 0x4460, 0x413e, 0x439e, 0x424d, 0x1ae1, 0xbadd, 0x1cb2, 0x415a, 0xb240, 0x311d, 0x41de, 0x155b, 0xa4c4, 0xb25d, 0xb2b4, 0x4329, 0x445c, 0x40be, 0xa150, 0x4284, 0x44eb, 0x456d, 0x40a2, 0x439d, 0xbf6d, 0x4073, 0xa3d2, 0xb036, 0x41c9, 0xbad3, 0x41a2, 0x432a, 0xba1c, 0xbafe, 0x42a1, 0x43e8, 0x4120, 0x414b, 0xb202, 0x251f, 0xba64, 0xbac8, 0x1977, 0x4291, 0x19a1, 0x1459, 0x1af3, 0xb0ca, 0x3165, 0x1a2f, 0xb224, 0xa3d5, 0xbfd5, 0xb20e, 0xb2df, 0x4689, 0x4143, 0xbae5, 0x4169, 0x40e7, 0xa294, 0xaa9c, 0xba66, 0x2969, 0x35a9, 0x4363, 0xbf69, 0x40e8, 0xa271, 0x41f2, 0x4391, 0x426b, 0x40c5, 0x411c, 0x46ed, 0x1839, 0x4345, 0x4202, 0x4056, 0xb26c, 0x406d, 0x16ec, 0x4276, 0x1249, 0xba23, 0x4301, 0x409a, 0xbfa4, 0x408e, 0xb2d2, 0x0054, 0x4092, 0x421f, 0x4313, 0xb2f2, 0x4115, 0x1c95, 0x1ba7, 0xba42, 0x0497, 0x0d14, 0x1c8d, 0x41ca, 0x400e, 0x436d, 0x17de, 0x1cc0, 0x417c, 0x1e15, 0x1250, 0x4288, 0x0add, 0x2783, 0x40d7, 0xbfce, 0xbfa0, 0x41e4, 0x3706, 0x33b9, 0xba5f, 0xb063, 0xb215, 0x421c, 0x04a2, 0xbf0b, 0xa42c, 0xba4a, 0x425f, 0xb2f4, 0x0891, 0xbf60, 0x1796, 0x43d7, 0x1520, 0xb26d, 0xbf9c, 0xb28d, 0x1b2e, 0x4137, 0x41be, 0xa19f, 0x40eb, 0x4247, 0x2c5d, 0x40fd, 0x41e9, 0xb260, 0x4069, 0x2417, 0x407b, 0xbf62, 0x2e6e, 0x42e9, 0x1f8b, 0xbae8, 0x1d37, 0x3234, 0x4287, 0xba75, 0x4232, 0x245c, 0x1176, 0xb025, 0x3f5c, 0xbfd9, 0xba5c, 0x40ad, 0x43d1, 0x189d, 0xba3c, 0x41c0, 0x4240, 0x41f1, 0x4276, 0x42ed, 0x4242, 0x4398, 0x40de, 0x444b, 0xb295, 0x411c, 0x0bf0, 0x3c69, 0x40d3, 0xbf1d, 0x41e0, 0x320b, 0x43bd, 0x02b9, 0x41da, 0xbaf3, 0x1052, 0xb27b, 0x4116, 0x1de7, 0xb2d3, 0x41b7, 0x1b37, 0x15a2, 0xb074, 0x4246, 0x428b, 0x1dbe, 0x1dd3, 0x1a49, 0xba20, 0x04d8, 0xbfe1, 0xb0fc, 0x400a, 0xbaf7, 0xbae1, 0xb043, 0x2790, 0xb273, 0xabe4, 0x405b, 0xa232, 0xbf33, 0x2d1d, 0x40f3, 0x4129, 0x133f, 0x41a7, 0xa789, 0x4264, 0x292e, 0x4056, 0x2f67, 0x40c9, 0x0a78, 0x41b6, 0x43cc, 0x0601, 0x4177, 0x3fd1, 0x42bf, 0x1e48, 0x4256, 0x426d, 0x1342, 0x4279, 0x4341, 0xab7e, 0x43f5, 0xb293, 0x2783, 0x2ef7, 0xbfdb, 0x43e2, 0x4098, 0x41eb, 0x4115, 0x1b25, 0x1f61, 0x43b5, 0x0cf3, 0x3f68, 0x0ce3, 0x004b, 0xb2de, 0x41e2, 0xb07e, 0x1ed0, 0x2e59, 0xba46, 0xba44, 0x3742, 0x17bf, 0x3e63, 0xbf07, 0xa4a5, 0xba1f, 0x4249, 0x3421, 0x435b, 0x434f, 0xba74, 0x0c5d, 0x4121, 0x3700, 0xb226, 0x3869, 0xb279, 0x46dd, 0x441c, 0x43da, 0x40ab, 0xbf2d, 0x1e81, 0x422c, 0x1c93, 0x4090, 0x424c, 0x4108, 0xb213, 0xa996, 0x3006, 0x438e, 0x41f8, 0x1c12, 0x20d7, 0x41d7, 0x0620, 0x4216, 0x22be, 0xba02, 0xbf60, 0x18b1, 0x431f, 0xbad4, 0x0f22, 0x4607, 0xb257, 0x38ed, 0xbfca, 0xb25c, 0xb245, 0x401b, 0x4009, 0x4303, 0x1615, 0xbf23, 0x42e0, 0x42db, 0x428f, 0x42f0, 0xb205, 0x1d0b, 0x404b, 0x2453, 0xba3d, 0x0eb6, 0x4319, 0xb073, 0x0b49, 0x43e2, 0xba38, 0xbf41, 0x1dc4, 0x1ea7, 0x1ffc, 0x408f, 0x3064, 0x189c, 0xa006, 0xbaef, 0x405e, 0x0d23, 0x2a88, 0x43a7, 0x401c, 0x092a, 0x4023, 0x440f, 0x41aa, 0x407f, 0x353c, 0x1de4, 0x4250, 0x4431, 0x4606, 0x4160, 0x42c3, 0xbf5e, 0x1f23, 0x3650, 0x4652, 0xa61a, 0x44db, 0x446f, 0x418b, 0xba3a, 0xb217, 0x03a3, 0xb03c, 0xb00e, 0x42bf, 0x4582, 0x41af, 0xb22c, 0x1c40, 0x42d8, 0xa1af, 0x42a8, 0x40d6, 0x40c3, 0xb27b, 0xbf88, 0xa181, 0x18bd, 0x1d56, 0xb2c3, 0x3309, 0xbfd9, 0x0e90, 0x1b15, 0xb2cf, 0xbafd, 0x446c, 0x4166, 0x427f, 0x2cd4, 0xbff0, 0xb20b, 0xba7f, 0x4374, 0xbf44, 0xb0fa, 0xb2a7, 0x4595, 0x4240, 0x4405, 0xb253, 0xba4d, 0x1879, 0xb231, 0x2937, 0x2c54, 0x1b7c, 0x0fca, 0xb0be, 0xbf00, 0x428c, 0x2f47, 0x4248, 0x4075, 0x121d, 0x40bc, 0xbad3, 0xba4e, 0x44f8, 0xbf7e, 0x42f5, 0x4319, 0xb2d6, 0xa214, 0x41ca, 0x41b6, 0xb001, 0xbf88, 0xa731, 0x4452, 0x1ee4, 0xb2ab, 0x39e6, 0xb092, 0x4097, 0x407b, 0xba6b, 0x464d, 0x44c1, 0x40d8, 0x100e, 0x4010, 0x46eb, 0xbafb, 0x07e0, 0xb2d3, 0x4332, 0x41ab, 0x4022, 0x46b9, 0x3214, 0xbf8d, 0xba7d, 0x407a, 0x42c2, 0x195d, 0x2988, 0xb23d, 0x4382, 0xbf46, 0xb236, 0x44c2, 0x1f13, 0x0599, 0x1edf, 0x1984, 0xba34, 0x25fe, 0xb202, 0x2128, 0xb227, 0xbf5e, 0x1bd5, 0x4265, 0x454a, 0x1485, 0xa79d, 0x1484, 0x409e, 0x431e, 0x4028, 0x4272, 0xba7d, 0xb2d3, 0xb228, 0x4093, 0x3c65, 0xba5d, 0x3bb9, 0xb2cf, 0xbf76, 0xb053, 0x4272, 0x41fd, 0xb052, 0x3908, 0xb042, 0x407f, 0xb29e, 0x43cd, 0x2c83, 0x4310, 0x4680, 0xb210, 0x0762, 0x4350, 0xbf77, 0xb243, 0x1b98, 0xb0f5, 0x4041, 0xb287, 0x4038, 0xbad5, 0x408d, 0xabd0, 0xba34, 0xbf71, 0xb2cd, 0x4168, 0x1b2e, 0x42e3, 0x1824, 0xb21f, 0x3ab2, 0x025b, 0xb23f, 0x45f3, 0xbaf0, 0x1d87, 0x40e1, 0x4177, 0xb21c, 0x4362, 0x43c5, 0x3708, 0x0554, 0x1d4d, 0xb073, 0xbfe4, 0xac1d, 0x4172, 0x0cf2, 0x4048, 0xbaf8, 0x442b, 0x1a0b, 0xbf67, 0x426e, 0x1c1c, 0x40a9, 0xbf60, 0x434d, 0xbae5, 0x4426, 0xb280, 0x150b, 0xb2ac, 0x4421, 0xbf2d, 0x1ede, 0x42c3, 0x426f, 0xbf90, 0x40aa, 0x4175, 0xb205, 0xb2f0, 0xaf19, 0xbfa7, 0x43b3, 0xba7f, 0xada2, 0x40ff, 0x4263, 0x0093, 0x42a8, 0xb2d3, 0x4114, 0x381b, 0x417b, 0xb2e3, 0xb206, 0xa446, 0xb204, 0x4192, 0x2850, 0xbfc0, 0x4078, 0x0d01, 0xbf53, 0x1bf6, 0x4218, 0x4065, 0x435e, 0x016b, 0x3bcd, 0x4326, 0x4335, 0xadc9, 0x1c41, 0x2724, 0xbad3, 0x4125, 0x42f7, 0xae86, 0xb2ac, 0xaced, 0x42fb, 0x4572, 0xba46, 0x4178, 0xbfc0, 0x0a8a, 0x02c0, 0xa6fb, 0x4117, 0x430b, 0xbf73, 0x1ee6, 0x1b3a, 0x42e0, 0x4279, 0x40d8, 0x45a4, 0xb204, 0x40e3, 0x3114, 0x4274, 0xa303, 0x421b, 0xbac2, 0x42c5, 0x4284, 0xbfca, 0x4142, 0x1e76, 0x41f2, 0xb272, 0x1ec0, 0xb2fa, 0x4494, 0x1ec1, 0x1ec0, 0x414a, 0xba7d, 0x4647, 0x439b, 0xbfa0, 0x40fa, 0xbaef, 0x0dd9, 0xb26c, 0xa054, 0x4032, 0x40aa, 0xba37, 0x456f, 0xbfb3, 0x40a4, 0x4027, 0x12fe, 0x25e9, 0x259e, 0x2bbc, 0x4223, 0xba2c, 0x2553, 0xbf24, 0xa784, 0xb2db, 0xb23c, 0x4362, 0x40c8, 0x24fc, 0xa161, 0x08af, 0xb26a, 0x43cc, 0xb2f7, 0x41ad, 0xbfb6, 0x44a3, 0xbfb0, 0x1c2a, 0xb2cc, 0x456f, 0x040a, 0x400e, 0xb270, 0x288c, 0x4056, 0x29c3, 0x4330, 0x1244, 0x128a, 0xbfa6, 0x1f86, 0x3fb5, 0x40ec, 0x40ab, 0x4078, 0xba5d, 0x43a9, 0xbad0, 0x4052, 0x40e3, 0x428e, 0x4603, 0xbf03, 0x416b, 0x0d03, 0xa3b5, 0x1f7e, 0x3e32, 0xb04e, 0x4085, 0xb2d4, 0xb211, 0x4394, 0x3b55, 0xb2d7, 0xbf3b, 0x1379, 0x41d9, 0x4121, 0xb250, 0x43e4, 0xb231, 0x14c6, 0x4245, 0x40ce, 0xa90a, 0x45f4, 0x43bd, 0xb28c, 0xb058, 0x41ac, 0xb276, 0x322f, 0x42b0, 0xa84f, 0x42f0, 0x43da, 0x299e, 0xbfc1, 0x13ef, 0x4298, 0x4304, 0x1aea, 0xb006, 0x4352, 0x41cc, 0x1c38, 0x2f37, 0x439e, 0x4329, 0x45f6, 0x41d2, 0x4253, 0xb209, 0x1129, 0xb27f, 0xbaec, 0x40fd, 0xbf74, 0xa497, 0x372a, 0xbaea, 0xb06a, 0xb24c, 0xba25, 0x45d2, 0x1638, 0xb0b8, 0xba4e, 0x406b, 0xbaf5, 0xbf35, 0x4340, 0x1ffe, 0x4075, 0x1ebb, 0x4029, 0xba36, 0x3d21, 0x0bf9, 0x1dd1, 0x43f4, 0x4316, 0xb241, 0xb212, 0xb2d7, 0x42cc, 0x4379, 0x1e94, 0xb03b, 0x3bc7, 0xbfd0, 0xba35, 0xa8cd, 0x009f, 0x1f3f, 0x436e, 0xbaf2, 0x4369, 0x1f29, 0x4164, 0xbf39, 0x433f, 0x403d, 0x316c, 0x4252, 0x4204, 0xb2b4, 0xba22, 0x19f7, 0x4120, 0x412c, 0x05e0, 0xb2c5, 0x3aa5, 0xbf67, 0x46a0, 0x4076, 0xb2aa, 0x436f, 0x43a9, 0x4183, 0x1c21, 0x12f9, 0x408a, 0x41bb, 0x42a6, 0x220c, 0xb2cf, 0x3de8, 0xbfb5, 0xbf00, 0x2586, 0xb2ce, 0x40ba, 0xa486, 0xa26e, 0x1b02, 0xb063, 0x40d3, 0x07ab, 0x26fd, 0xba10, 0x43ac, 0xbf24, 0x3285, 0x3eb9, 0x1f75, 0xb202, 0x2771, 0xacd9, 0xba3d, 0x4326, 0xbf60, 0xb263, 0x4013, 0x3cb8, 0xbaef, 0x4074, 0x42f5, 0x43f8, 0x40d9, 0x20ec, 0x42f6, 0xbf2b, 0x4336, 0x4321, 0xb06c, 0x2f28, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x45444af8, 0x3713ac06, 0xc0dfa961, 0xa4318add, 0x64c2ab43, 0xd5a78f68, 0x13e65e07, 0x035cff70, 0xf5623146, 0xb8ad178f, 0xade3820c, 0x0224fa96, 0x9850b729, 0xe11a6537, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x000000ec, 0x00000000, 0xffffffff, 0x0000006b, 0x0000014c, 0x71000000, 0xe1eca9ff, 0x00000000, 0x00003ff7, 0x00000000, 0xade3820c, 0xe1ec9c83, 0x9850b74d, 0xe1eca7b7, 0x00000000, 0xa00001d0 }, + Instructions = [0x1d91, 0xbae9, 0x3565, 0xb2f7, 0x4627, 0x41f1, 0xbfe8, 0x4294, 0x0fb8, 0x2445, 0x0e33, 0x29fa, 0x116e, 0x345c, 0x44b5, 0xb2d2, 0x4013, 0x4246, 0x2612, 0x4133, 0x42bc, 0xb28a, 0xbf14, 0x4370, 0x194f, 0x4319, 0x4264, 0xb0d1, 0x1c87, 0x4329, 0xbfc4, 0x441e, 0x4212, 0x1b80, 0x4261, 0x0436, 0x46e1, 0x444e, 0x1a0b, 0x40d3, 0xa4e6, 0x407b, 0x4201, 0x426d, 0x43a3, 0x436d, 0x1a3c, 0x1b83, 0xad83, 0xbadf, 0x4016, 0xb058, 0xacc4, 0xbf90, 0x43ea, 0x4445, 0xb2fe, 0x08da, 0xbf29, 0x41a9, 0x0835, 0x0f8d, 0x1e32, 0x0a48, 0x41f4, 0xbaca, 0x41e4, 0x41ac, 0xba02, 0x1db6, 0xb099, 0x1f86, 0xbfd0, 0xa3b6, 0x463a, 0x4108, 0x2cb1, 0xb0ce, 0xb261, 0xba1b, 0x1edc, 0xba7a, 0x4285, 0xb206, 0x4078, 0x4252, 0xa63c, 0x107d, 0xbf9b, 0x4331, 0x40c1, 0x415c, 0x4062, 0x186b, 0x1e9d, 0x4014, 0x32c3, 0x43e7, 0x40e6, 0x4382, 0xba6e, 0x4332, 0x1cea, 0x0bb1, 0x1de5, 0x429c, 0x41f1, 0x4243, 0x0059, 0x41db, 0xa558, 0xbf7c, 0x4203, 0x43a7, 0x43d8, 0x4460, 0x413e, 0x439e, 0x424d, 0x1ae1, 0xbadd, 0x1cb2, 0x415a, 0xb240, 0x311d, 0x41de, 0x155b, 0xa4c4, 0xb25d, 0xb2b4, 0x4329, 0x445c, 0x40be, 0xa150, 0x4284, 0x44eb, 0x456d, 0x40a2, 0x439d, 0xbf6d, 0x4073, 0xa3d2, 0xb036, 0x41c9, 0xbad3, 0x41a2, 0x432a, 0xba1c, 0xbafe, 0x42a1, 0x43e8, 0x4120, 0x414b, 0xb202, 0x251f, 0xba64, 0xbac8, 0x1977, 0x4291, 0x19a1, 0x1459, 0x1af3, 0xb0ca, 0x3165, 0x1a2f, 0xb224, 0xa3d5, 0xbfd5, 0xb20e, 0xb2df, 0x4689, 0x4143, 0xbae5, 0x4169, 0x40e7, 0xa294, 0xaa9c, 0xba66, 0x2969, 0x35a9, 0x4363, 0xbf69, 0x40e8, 0xa271, 0x41f2, 0x4391, 0x426b, 0x40c5, 0x411c, 0x46ed, 0x1839, 0x4345, 0x4202, 0x4056, 0xb26c, 0x406d, 0x16ec, 0x4276, 0x1249, 0xba23, 0x4301, 0x409a, 0xbfa4, 0x408e, 0xb2d2, 0x0054, 0x4092, 0x421f, 0x4313, 0xb2f2, 0x4115, 0x1c95, 0x1ba7, 0xba42, 0x0497, 0x0d14, 0x1c8d, 0x41ca, 0x400e, 0x436d, 0x17de, 0x1cc0, 0x417c, 0x1e15, 0x1250, 0x4288, 0x0add, 0x2783, 0x40d7, 0xbfce, 0xbfa0, 0x41e4, 0x3706, 0x33b9, 0xba5f, 0xb063, 0xb215, 0x421c, 0x04a2, 0xbf0b, 0xa42c, 0xba4a, 0x425f, 0xb2f4, 0x0891, 0xbf60, 0x1796, 0x43d7, 0x1520, 0xb26d, 0xbf9c, 0xb28d, 0x1b2e, 0x4137, 0x41be, 0xa19f, 0x40eb, 0x4247, 0x2c5d, 0x40fd, 0x41e9, 0xb260, 0x4069, 0x2417, 0x407b, 0xbf62, 0x2e6e, 0x42e9, 0x1f8b, 0xbae8, 0x1d37, 0x3234, 0x4287, 0xba75, 0x4232, 0x245c, 0x1176, 0xb025, 0x3f5c, 0xbfd9, 0xba5c, 0x40ad, 0x43d1, 0x189d, 0xba3c, 0x41c0, 0x4240, 0x41f1, 0x4276, 0x42ed, 0x4242, 0x4398, 0x40de, 0x444b, 0xb295, 0x411c, 0x0bf0, 0x3c69, 0x40d3, 0xbf1d, 0x41e0, 0x320b, 0x43bd, 0x02b9, 0x41da, 0xbaf3, 0x1052, 0xb27b, 0x4116, 0x1de7, 0xb2d3, 0x41b7, 0x1b37, 0x15a2, 0xb074, 0x4246, 0x428b, 0x1dbe, 0x1dd3, 0x1a49, 0xba20, 0x04d8, 0xbfe1, 0xb0fc, 0x400a, 0xbaf7, 0xbae1, 0xb043, 0x2790, 0xb273, 0xabe4, 0x405b, 0xa232, 0xbf33, 0x2d1d, 0x40f3, 0x4129, 0x133f, 0x41a7, 0xa789, 0x4264, 0x292e, 0x4056, 0x2f67, 0x40c9, 0x0a78, 0x41b6, 0x43cc, 0x0601, 0x4177, 0x3fd1, 0x42bf, 0x1e48, 0x4256, 0x426d, 0x1342, 0x4279, 0x4341, 0xab7e, 0x43f5, 0xb293, 0x2783, 0x2ef7, 0xbfdb, 0x43e2, 0x4098, 0x41eb, 0x4115, 0x1b25, 0x1f61, 0x43b5, 0x0cf3, 0x3f68, 0x0ce3, 0x004b, 0xb2de, 0x41e2, 0xb07e, 0x1ed0, 0x2e59, 0xba46, 0xba44, 0x3742, 0x17bf, 0x3e63, 0xbf07, 0xa4a5, 0xba1f, 0x4249, 0x3421, 0x435b, 0x434f, 0xba74, 0x0c5d, 0x4121, 0x3700, 0xb226, 0x3869, 0xb279, 0x46dd, 0x441c, 0x43da, 0x40ab, 0xbf2d, 0x1e81, 0x422c, 0x1c93, 0x4090, 0x424c, 0x4108, 0xb213, 0xa996, 0x3006, 0x438e, 0x41f8, 0x1c12, 0x20d7, 0x41d7, 0x0620, 0x4216, 0x22be, 0xba02, 0xbf60, 0x18b1, 0x431f, 0xbad4, 0x0f22, 0x4607, 0xb257, 0x38ed, 0xbfca, 0xb25c, 0xb245, 0x401b, 0x4009, 0x4303, 0x1615, 0xbf23, 0x42e0, 0x42db, 0x428f, 0x42f0, 0xb205, 0x1d0b, 0x404b, 0x2453, 0xba3d, 0x0eb6, 0x4319, 0xb073, 0x0b49, 0x43e2, 0xba38, 0xbf41, 0x1dc4, 0x1ea7, 0x1ffc, 0x408f, 0x3064, 0x189c, 0xa006, 0xbaef, 0x405e, 0x0d23, 0x2a88, 0x43a7, 0x401c, 0x092a, 0x4023, 0x440f, 0x41aa, 0x407f, 0x353c, 0x1de4, 0x4250, 0x4431, 0x4606, 0x4160, 0x42c3, 0xbf5e, 0x1f23, 0x3650, 0x4652, 0xa61a, 0x44db, 0x446f, 0x418b, 0xba3a, 0xb217, 0x03a3, 0xb03c, 0xb00e, 0x42bf, 0x4582, 0x41af, 0xb22c, 0x1c40, 0x42d8, 0xa1af, 0x42a8, 0x40d6, 0x40c3, 0xb27b, 0xbf88, 0xa181, 0x18bd, 0x1d56, 0xb2c3, 0x3309, 0xbfd9, 0x0e90, 0x1b15, 0xb2cf, 0xbafd, 0x446c, 0x4166, 0x427f, 0x2cd4, 0xbff0, 0xb20b, 0xba7f, 0x4374, 0xbf44, 0xb0fa, 0xb2a7, 0x4595, 0x4240, 0x4405, 0xb253, 0xba4d, 0x1879, 0xb231, 0x2937, 0x2c54, 0x1b7c, 0x0fca, 0xb0be, 0xbf00, 0x428c, 0x2f47, 0x4248, 0x4075, 0x121d, 0x40bc, 0xbad3, 0xba4e, 0x44f8, 0xbf7e, 0x42f5, 0x4319, 0xb2d6, 0xa214, 0x41ca, 0x41b6, 0xb001, 0xbf88, 0xa731, 0x4452, 0x1ee4, 0xb2ab, 0x39e6, 0xb092, 0x4097, 0x407b, 0xba6b, 0x464d, 0x44c1, 0x40d8, 0x100e, 0x4010, 0x46eb, 0xbafb, 0x07e0, 0xb2d3, 0x4332, 0x41ab, 0x4022, 0x46b9, 0x3214, 0xbf8d, 0xba7d, 0x407a, 0x42c2, 0x195d, 0x2988, 0xb23d, 0x4382, 0xbf46, 0xb236, 0x44c2, 0x1f13, 0x0599, 0x1edf, 0x1984, 0xba34, 0x25fe, 0xb202, 0x2128, 0xb227, 0xbf5e, 0x1bd5, 0x4265, 0x454a, 0x1485, 0xa79d, 0x1484, 0x409e, 0x431e, 0x4028, 0x4272, 0xba7d, 0xb2d3, 0xb228, 0x4093, 0x3c65, 0xba5d, 0x3bb9, 0xb2cf, 0xbf76, 0xb053, 0x4272, 0x41fd, 0xb052, 0x3908, 0xb042, 0x407f, 0xb29e, 0x43cd, 0x2c83, 0x4310, 0x4680, 0xb210, 0x0762, 0x4350, 0xbf77, 0xb243, 0x1b98, 0xb0f5, 0x4041, 0xb287, 0x4038, 0xbad5, 0x408d, 0xabd0, 0xba34, 0xbf71, 0xb2cd, 0x4168, 0x1b2e, 0x42e3, 0x1824, 0xb21f, 0x3ab2, 0x025b, 0xb23f, 0x45f3, 0xbaf0, 0x1d87, 0x40e1, 0x4177, 0xb21c, 0x4362, 0x43c5, 0x3708, 0x0554, 0x1d4d, 0xb073, 0xbfe4, 0xac1d, 0x4172, 0x0cf2, 0x4048, 0xbaf8, 0x442b, 0x1a0b, 0xbf67, 0x426e, 0x1c1c, 0x40a9, 0xbf60, 0x434d, 0xbae5, 0x4426, 0xb280, 0x150b, 0xb2ac, 0x4421, 0xbf2d, 0x1ede, 0x42c3, 0x426f, 0xbf90, 0x40aa, 0x4175, 0xb205, 0xb2f0, 0xaf19, 0xbfa7, 0x43b3, 0xba7f, 0xada2, 0x40ff, 0x4263, 0x0093, 0x42a8, 0xb2d3, 0x4114, 0x381b, 0x417b, 0xb2e3, 0xb206, 0xa446, 0xb204, 0x4192, 0x2850, 0xbfc0, 0x4078, 0x0d01, 0xbf53, 0x1bf6, 0x4218, 0x4065, 0x435e, 0x016b, 0x3bcd, 0x4326, 0x4335, 0xadc9, 0x1c41, 0x2724, 0xbad3, 0x4125, 0x42f7, 0xae86, 0xb2ac, 0xaced, 0x42fb, 0x4572, 0xba46, 0x4178, 0xbfc0, 0x0a8a, 0x02c0, 0xa6fb, 0x4117, 0x430b, 0xbf73, 0x1ee6, 0x1b3a, 0x42e0, 0x4279, 0x40d8, 0x45a4, 0xb204, 0x40e3, 0x3114, 0x4274, 0xa303, 0x421b, 0xbac2, 0x42c5, 0x4284, 0xbfca, 0x4142, 0x1e76, 0x41f2, 0xb272, 0x1ec0, 0xb2fa, 0x4494, 0x1ec1, 0x1ec0, 0x414a, 0xba7d, 0x4647, 0x439b, 0xbfa0, 0x40fa, 0xbaef, 0x0dd9, 0xb26c, 0xa054, 0x4032, 0x40aa, 0xba37, 0x456f, 0xbfb3, 0x40a4, 0x4027, 0x12fe, 0x25e9, 0x259e, 0x2bbc, 0x4223, 0xba2c, 0x2553, 0xbf24, 0xa784, 0xb2db, 0xb23c, 0x4362, 0x40c8, 0x24fc, 0xa161, 0x08af, 0xb26a, 0x43cc, 0xb2f7, 0x41ad, 0xbfb6, 0x44a3, 0xbfb0, 0x1c2a, 0xb2cc, 0x456f, 0x040a, 0x400e, 0xb270, 0x288c, 0x4056, 0x29c3, 0x4330, 0x1244, 0x128a, 0xbfa6, 0x1f86, 0x3fb5, 0x40ec, 0x40ab, 0x4078, 0xba5d, 0x43a9, 0xbad0, 0x4052, 0x40e3, 0x428e, 0x4603, 0xbf03, 0x416b, 0x0d03, 0xa3b5, 0x1f7e, 0x3e32, 0xb04e, 0x4085, 0xb2d4, 0xb211, 0x4394, 0x3b55, 0xb2d7, 0xbf3b, 0x1379, 0x41d9, 0x4121, 0xb250, 0x43e4, 0xb231, 0x14c6, 0x4245, 0x40ce, 0xa90a, 0x45f4, 0x43bd, 0xb28c, 0xb058, 0x41ac, 0xb276, 0x322f, 0x42b0, 0xa84f, 0x42f0, 0x43da, 0x299e, 0xbfc1, 0x13ef, 0x4298, 0x4304, 0x1aea, 0xb006, 0x4352, 0x41cc, 0x1c38, 0x2f37, 0x439e, 0x4329, 0x45f6, 0x41d2, 0x4253, 0xb209, 0x1129, 0xb27f, 0xbaec, 0x40fd, 0xbf74, 0xa497, 0x372a, 0xbaea, 0xb06a, 0xb24c, 0xba25, 0x45d2, 0x1638, 0xb0b8, 0xba4e, 0x406b, 0xbaf5, 0xbf35, 0x4340, 0x1ffe, 0x4075, 0x1ebb, 0x4029, 0xba36, 0x3d21, 0x0bf9, 0x1dd1, 0x43f4, 0x4316, 0xb241, 0xb212, 0xb2d7, 0x42cc, 0x4379, 0x1e94, 0xb03b, 0x3bc7, 0xbfd0, 0xba35, 0xa8cd, 0x009f, 0x1f3f, 0x436e, 0xbaf2, 0x4369, 0x1f29, 0x4164, 0xbf39, 0x433f, 0x403d, 0x316c, 0x4252, 0x4204, 0xb2b4, 0xba22, 0x19f7, 0x4120, 0x412c, 0x05e0, 0xb2c5, 0x3aa5, 0xbf67, 0x46a0, 0x4076, 0xb2aa, 0x436f, 0x43a9, 0x4183, 0x1c21, 0x12f9, 0x408a, 0x41bb, 0x42a6, 0x220c, 0xb2cf, 0x3de8, 0xbfb5, 0xbf00, 0x2586, 0xb2ce, 0x40ba, 0xa486, 0xa26e, 0x1b02, 0xb063, 0x40d3, 0x07ab, 0x26fd, 0xba10, 0x43ac, 0xbf24, 0x3285, 0x3eb9, 0x1f75, 0xb202, 0x2771, 0xacd9, 0xba3d, 0x4326, 0xbf60, 0xb263, 0x4013, 0x3cb8, 0xbaef, 0x4074, 0x42f5, 0x43f8, 0x40d9, 0x20ec, 0x42f6, 0xbf2b, 0x4336, 0x4321, 0xb06c, 0x2f28, 0x4770, 0xe7fe + ], + StartRegs = [0x45444af8, 0x3713ac06, 0xc0dfa961, 0xa4318add, 0x64c2ab43, 0xd5a78f68, 0x13e65e07, 0x035cff70, 0xf5623146, 0xb8ad178f, 0xade3820c, 0x0224fa96, 0x9850b729, 0xe11a6537, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x000000ec, 0x00000000, 0xffffffff, 0x0000006b, 0x0000014c, 0x71000000, 0xe1eca9ff, 0x00000000, 0x00003ff7, 0x00000000, 0xade3820c, 0xe1ec9c83, 0x9850b74d, 0xe1eca7b7, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0xa520, 0xb223, 0x4254, 0x04d2, 0xb2bb, 0x0b78, 0x4241, 0x3e94, 0x4367, 0xbf06, 0x40db, 0x409c, 0xbfb0, 0x40bd, 0xb297, 0x44fa, 0xb2b3, 0x406c, 0x4348, 0xb2ac, 0x4158, 0x40b0, 0x2122, 0x3cd3, 0x433b, 0xbf01, 0x42bb, 0xb2b2, 0x3a8d, 0x43f1, 0x4200, 0x1c8e, 0xada7, 0x40f6, 0x403d, 0x40db, 0x422b, 0xbad1, 0xa3da, 0x4319, 0xa9a2, 0xb21f, 0x4231, 0x41b5, 0x4104, 0x043a, 0xba2f, 0xbfb6, 0x41b2, 0x05c3, 0xb0be, 0x1de0, 0xa730, 0xba13, 0x05fe, 0x41ea, 0xbf4a, 0xa3f1, 0x182e, 0xb217, 0xad55, 0x44d9, 0xb0c0, 0x4389, 0x401f, 0xba25, 0x18ab, 0x02e1, 0x46dd, 0xba26, 0xba21, 0xb2bc, 0x42a2, 0x124d, 0xbfd0, 0xb271, 0x01b0, 0x42e0, 0x4011, 0xa094, 0xb02f, 0x43dd, 0xbf74, 0x41b0, 0x41bc, 0x4133, 0x105d, 0xb28f, 0xb0d0, 0xaf65, 0xaf83, 0xbf71, 0x4196, 0xb06b, 0x4122, 0x400d, 0x41ac, 0x1863, 0xb2e0, 0xb218, 0x41b8, 0x4588, 0xb2a0, 0xbfdb, 0x436c, 0x0f45, 0x0994, 0x43ab, 0x4106, 0x2c4b, 0x01db, 0xb048, 0x4495, 0x42a5, 0x40ae, 0x419c, 0x41ca, 0x40be, 0xa8ed, 0x3fe9, 0x42ea, 0x4127, 0x425f, 0x4499, 0x1c46, 0xb258, 0x3f68, 0xa832, 0xbf0c, 0x42cf, 0xa86c, 0x42ce, 0x4113, 0xb24f, 0xb0ec, 0xb0e0, 0x3d7f, 0xa273, 0x40cd, 0xb03f, 0x41ef, 0x4266, 0x413e, 0xb20c, 0x43b9, 0xb019, 0x4097, 0x05f4, 0x3445, 0x408b, 0x409a, 0x2673, 0xbf4f, 0x417b, 0xbaee, 0x443c, 0xbae3, 0x426c, 0xbf2d, 0x4185, 0x4366, 0x431c, 0x3f62, 0x42bd, 0x46c5, 0x416f, 0xb205, 0x4011, 0x07d0, 0x06d4, 0x413a, 0xbf5b, 0xb2b5, 0x1ae2, 0xa9a9, 0xba0e, 0x401c, 0xb22e, 0x44f0, 0x17c2, 0xb036, 0x1cf0, 0x4096, 0x4299, 0xba11, 0xa27d, 0x1e0a, 0xbf7f, 0xb285, 0x4342, 0x24a7, 0x1a9e, 0x2cbc, 0x4218, 0x0e6d, 0xb21d, 0x437c, 0x4392, 0x41e9, 0xb05d, 0x4101, 0xa9d4, 0x4371, 0x41ab, 0x1bc2, 0x4241, 0x4002, 0xb2d4, 0xb016, 0xbac0, 0xb201, 0x4398, 0x40a2, 0xbf49, 0x430c, 0x1c44, 0x3eed, 0xab02, 0xb20f, 0xbf3f, 0x17a7, 0x418f, 0x4151, 0xba01, 0xbf9b, 0x41a4, 0x0136, 0xa343, 0xb29b, 0x2019, 0xab1a, 0x43d2, 0xbf5e, 0x42b3, 0x297f, 0xb2ce, 0x2057, 0x1d80, 0x1633, 0x4310, 0x337b, 0x40bc, 0x4077, 0xb224, 0xb298, 0x2a78, 0x4233, 0x0d0e, 0x32a6, 0x42cb, 0x4396, 0x40a2, 0xb00f, 0x4050, 0xb271, 0x40ee, 0x410a, 0xbfc8, 0xb230, 0x1a49, 0x4360, 0xb03d, 0x0d57, 0x4276, 0x406d, 0xb223, 0x40b9, 0x40b7, 0x1e40, 0xb257, 0x07e4, 0xa579, 0xb217, 0xbf7c, 0xbae9, 0x4333, 0xbae6, 0xb23c, 0xbae4, 0x423d, 0x4121, 0xbacc, 0x41eb, 0xaaae, 0x1c89, 0x1960, 0x42af, 0x2b33, 0x4287, 0x4000, 0xb27b, 0x436d, 0x458d, 0x42aa, 0x43fd, 0x423a, 0x43fd, 0xbfc3, 0x1e10, 0x4317, 0xb272, 0xbaec, 0x4152, 0x4173, 0x30c9, 0x404e, 0x2173, 0x46c8, 0xb260, 0x4084, 0xb234, 0x4217, 0x1fbc, 0xbf13, 0x46b1, 0x41fd, 0xa309, 0x1f35, 0x418e, 0xb21a, 0x43a6, 0x41f1, 0x4219, 0x45d4, 0x45c6, 0x1ac2, 0x1c3e, 0xbad6, 0xbfc0, 0xba74, 0x4342, 0x41e9, 0x43c2, 0x4051, 0xbf88, 0xb2ce, 0xbfb0, 0xb03b, 0x248a, 0x42c8, 0xa7f9, 0xb2dc, 0x4284, 0xb27d, 0x4207, 0x43d4, 0x3a09, 0x43b6, 0xbfd2, 0x4636, 0x431f, 0x359a, 0x4035, 0xa58b, 0xb293, 0xba72, 0x40b4, 0x42fa, 0x08f7, 0x415c, 0x16ac, 0x438c, 0x42d5, 0x4069, 0x18ce, 0xa2a3, 0x4259, 0x245a, 0x2c8c, 0x4104, 0xbf52, 0xa8d4, 0x1a52, 0xae71, 0xb0dc, 0xa6c6, 0xb240, 0x33b4, 0x3314, 0x4183, 0x183d, 0x1fe5, 0xba4f, 0x1b3b, 0x41b3, 0x3897, 0xb209, 0x4380, 0x417f, 0xbaef, 0xb2e6, 0x42a0, 0x4177, 0xbfb2, 0x1e3c, 0x4250, 0xba34, 0x402c, 0x2e43, 0x435b, 0xbf8f, 0x3463, 0x40a0, 0x4174, 0x44dd, 0x40cf, 0x400b, 0x2fca, 0x3ccd, 0x2e2e, 0x3764, 0xa626, 0x40bc, 0xa3ba, 0x44ca, 0xbfa7, 0x43ed, 0xb278, 0x412a, 0xba1a, 0x01d4, 0x185c, 0x4365, 0x389a, 0x37b6, 0x4111, 0x40f7, 0x4114, 0x06a0, 0x4167, 0x3736, 0x42dc, 0x40c3, 0x32cb, 0x41b0, 0x412b, 0x2c08, 0xbacd, 0x1806, 0xb247, 0x3a1f, 0xbf70, 0x4137, 0xbf9e, 0x42a3, 0x3af2, 0x424f, 0x2f4b, 0xba6c, 0x3b5b, 0xbff0, 0xb2bc, 0x414b, 0x4570, 0xb216, 0xb2a1, 0xbad1, 0x40ae, 0x40d0, 0x41ca, 0x4059, 0xacfd, 0x43ae, 0x43de, 0x428c, 0x19ac, 0x2ed4, 0xba26, 0xbfc5, 0x1e66, 0x403a, 0x41a7, 0x3900, 0x432b, 0x4386, 0x3670, 0x1674, 0x0a49, 0x41b9, 0x438a, 0x42b9, 0x41aa, 0x40a8, 0x43c9, 0xba1c, 0x4167, 0xb0ed, 0x4359, 0xa917, 0xbf59, 0xb040, 0x4205, 0x43eb, 0x1811, 0x1e8e, 0x41cd, 0x41f2, 0x4190, 0x41b0, 0x368c, 0x387e, 0x1545, 0x18d3, 0x40d8, 0x4279, 0x438b, 0x0c33, 0xbf28, 0x4218, 0x41c7, 0xa71d, 0x4373, 0x229d, 0x4605, 0x2a5d, 0xb265, 0xbf15, 0x1c05, 0xb006, 0x193f, 0xba38, 0x4338, 0xbf4e, 0x4177, 0x4138, 0x22ae, 0xb268, 0x40e2, 0xbfa0, 0x42a9, 0x4612, 0x267c, 0x41c9, 0xb291, 0xbad0, 0xba3a, 0x45c2, 0xbac5, 0x43df, 0xb00c, 0x43e4, 0x1faf, 0x1c18, 0x1f38, 0x42f0, 0x1ac4, 0xbf2d, 0x4158, 0x40dc, 0x4329, 0xba24, 0x4009, 0xbace, 0x4206, 0x0e36, 0x3b42, 0x023c, 0x0ab2, 0x42f3, 0xb2d2, 0x4165, 0x236b, 0x4125, 0xb239, 0x45db, 0xbf5e, 0x4198, 0x444c, 0x1601, 0x19a8, 0xbaf6, 0xb251, 0x4035, 0x4169, 0x4265, 0x406f, 0x403c, 0x4319, 0xb29f, 0x4052, 0xb273, 0x1bfe, 0x4588, 0x40fe, 0x41cc, 0x40bb, 0x46f3, 0x42ff, 0xa67e, 0x1fff, 0x10c0, 0xbf33, 0x4286, 0x412d, 0xb26d, 0x41bd, 0x436e, 0x439d, 0x417e, 0x0746, 0x42c6, 0x04ce, 0x406d, 0x4249, 0xb22a, 0x43ff, 0x27d4, 0xb2a7, 0xbf95, 0xb287, 0x366b, 0x1cc0, 0x1802, 0xba5c, 0x43e7, 0x4061, 0x4153, 0x150c, 0x4681, 0x44a1, 0x45cd, 0xbad6, 0xbfc9, 0x42f2, 0x1bfc, 0x4180, 0x25a3, 0x42d3, 0x409b, 0xb0e1, 0x4676, 0xbfa1, 0x436a, 0x42b6, 0xba61, 0x424c, 0x4354, 0x340e, 0x43b7, 0x0ce6, 0x45bd, 0xa0d6, 0x42e8, 0xba77, 0x4037, 0x42b2, 0x446d, 0xbae6, 0x439f, 0xb0a1, 0xba6e, 0x4231, 0xa05f, 0x46ca, 0xb081, 0xba3e, 0x1d40, 0x435a, 0x196f, 0x4168, 0x405e, 0xbf9f, 0x4056, 0x30ab, 0x43be, 0x1956, 0xb01d, 0x41d5, 0xba3b, 0xbf48, 0x08f2, 0x42d2, 0x42a7, 0x4291, 0x423d, 0x405e, 0xb2a9, 0x2cb9, 0x43bd, 0x4270, 0xb2d2, 0x420d, 0x1494, 0x4098, 0xa21a, 0x43d1, 0x442e, 0x4559, 0x3192, 0x43d2, 0xbad2, 0x4379, 0x4298, 0xb2d6, 0xbafd, 0xbfc5, 0xbaca, 0xbaf2, 0x1ba9, 0x422c, 0xb2b0, 0x096c, 0x0443, 0xbafe, 0x44e4, 0xba0a, 0x1d8f, 0x15f2, 0xba7b, 0xbad0, 0xb295, 0x41f3, 0xb212, 0xb0dc, 0x24d5, 0x40c8, 0xba3a, 0x4023, 0xb2cd, 0xa317, 0xa11d, 0x4374, 0x1e3e, 0x414d, 0x401b, 0xbf85, 0x418b, 0xae75, 0xb226, 0x37f7, 0x4392, 0x432b, 0x426c, 0x4312, 0x0f46, 0xbfd0, 0x406c, 0xa729, 0x4136, 0x0f4f, 0x40dd, 0x1d25, 0x1a81, 0x41e9, 0x36ab, 0x4694, 0x4558, 0x1868, 0xb220, 0xbfa3, 0x1ecd, 0x4274, 0x1b66, 0x2988, 0x41e0, 0x08f1, 0x4214, 0xb28a, 0xb243, 0x4071, 0x2b56, 0x4038, 0x438f, 0x2441, 0x41bd, 0x41ba, 0x31cf, 0x408b, 0xb036, 0x1db4, 0x19c7, 0xb2c0, 0xbf55, 0x0c41, 0xbaf0, 0xb2ae, 0x4007, 0x1b06, 0xb08f, 0x1d3d, 0x430e, 0x2937, 0x41a0, 0x4209, 0x4448, 0x402a, 0xba03, 0x3597, 0xb20b, 0x45b3, 0x4376, 0x4663, 0x437c, 0x417e, 0xb088, 0xbf9c, 0x14f2, 0xb29a, 0x2554, 0x18c1, 0x180a, 0x417f, 0x0c42, 0xba14, 0xb05c, 0x41ba, 0xbf5e, 0x2562, 0x4243, 0x420f, 0x0a72, 0x438c, 0xb0ab, 0x4210, 0x1dca, 0xb2d9, 0x434a, 0xbf60, 0xad83, 0xbf35, 0xbadb, 0x407a, 0xb2a5, 0xa130, 0x429e, 0xa4e3, 0x142b, 0x35b8, 0xbfc0, 0x40a6, 0xbaf6, 0x3089, 0x4280, 0xba19, 0x43a6, 0x0fef, 0x442e, 0x1cf6, 0xb2ac, 0x18b2, 0xb0c3, 0xbad1, 0x42e0, 0x391a, 0x435c, 0xbf87, 0xb272, 0x05bc, 0x4226, 0xb2f2, 0x4313, 0x459e, 0x4326, 0x4495, 0x4236, 0x1239, 0xbf55, 0x43f8, 0xb289, 0xbf70, 0xb249, 0xb2cd, 0xb224, 0x4017, 0x1d5d, 0x4026, 0x423e, 0x1214, 0x431a, 0x351a, 0x40d3, 0xbf88, 0xba4e, 0x434f, 0x3815, 0x15ac, 0x1693, 0x40ad, 0xbf90, 0x43ac, 0x42c3, 0x060d, 0x4013, 0x3896, 0x428c, 0x2d3e, 0x435b, 0xaeac, 0x42b7, 0xbfbc, 0x42c5, 0x31b5, 0x1b10, 0x0f85, 0xbaf0, 0xbfa5, 0x09a7, 0x0762, 0xb2cb, 0xab8a, 0xba7c, 0x3c28, 0x40a2, 0x173c, 0xa6f8, 0x0788, 0x4623, 0x4324, 0x4310, 0xb208, 0x3297, 0x4667, 0x41c1, 0xbfc7, 0xbf00, 0xb222, 0x0499, 0x422f, 0x46f8, 0xa72c, 0x2e9e, 0xa41b, 0x4370, 0xbf08, 0xb073, 0xbfc0, 0x04bb, 0x2e56, 0xba6a, 0xba56, 0x4206, 0x4306, 0x427b, 0xb060, 0x4260, 0x4298, 0x4360, 0x434f, 0xbf70, 0xa2d2, 0xbae6, 0xbf80, 0xac39, 0x441b, 0xb2e7, 0x40d7, 0x42a2, 0x42b5, 0x08fe, 0xbf05, 0x195f, 0x414a, 0x40a5, 0x4344, 0xbafe, 0x4212, 0xb225, 0x429d, 0x428b, 0x22bc, 0x43e8, 0xb27d, 0xb2ac, 0x4108, 0xb2d2, 0x1d5f, 0x23c3, 0x4257, 0xb060, 0x4105, 0xb208, 0x441f, 0x2f98, 0x1f2b, 0xbf17, 0x43d2, 0x413e, 0xba24, 0x40ca, 0x4101, 0xbf90, 0x43dc, 0x42b6, 0x431d, 0x42db, 0x43e6, 0xac1f, 0x42c9, 0xba0b, 0x46a4, 0xba41, 0x42f3, 0x45a2, 0xbf2e, 0xb088, 0x40fd, 0x0d9d, 0x1a17, 0x2ee0, 0x1b8c, 0x41cc, 0x42b4, 0xb294, 0x436d, 0xabb1, 0xa7ed, 0xba2c, 0x4002, 0x4214, 0x417c, 0x03a3, 0x1b3a, 0x4645, 0xa99a, 0x4661, 0x41b7, 0xbacd, 0x2cb1, 0x1dca, 0x1d24, 0x42c5, 0xba4c, 0xbf9c, 0x1e2b, 0xb24b, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6858fdc0, 0x2c117adb, 0x4e91c10b, 0x490c37fa, 0xdc3cc5ba, 0x19d843cc, 0x38054938, 0xa1f0a710, 0x540c538f, 0x8e7e0cd6, 0x8458328c, 0x917b025c, 0x75c492d1, 0x64488841, 0x00000000, 0x000001f0 }, - FinalRegs = new uint[] { 0xffffa800, 0x540c5724, 0x540c572b, 0x00000024, 0x0c542457, 0x00002457, 0xfffffffc, 0x00001b93, 0x00001730, 0xffffff42, 0xffffff42, 0x00000000, 0x540c5724, 0x540c5688, 0x00000000, 0x800001d0 }, + Instructions = [0xa520, 0xb223, 0x4254, 0x04d2, 0xb2bb, 0x0b78, 0x4241, 0x3e94, 0x4367, 0xbf06, 0x40db, 0x409c, 0xbfb0, 0x40bd, 0xb297, 0x44fa, 0xb2b3, 0x406c, 0x4348, 0xb2ac, 0x4158, 0x40b0, 0x2122, 0x3cd3, 0x433b, 0xbf01, 0x42bb, 0xb2b2, 0x3a8d, 0x43f1, 0x4200, 0x1c8e, 0xada7, 0x40f6, 0x403d, 0x40db, 0x422b, 0xbad1, 0xa3da, 0x4319, 0xa9a2, 0xb21f, 0x4231, 0x41b5, 0x4104, 0x043a, 0xba2f, 0xbfb6, 0x41b2, 0x05c3, 0xb0be, 0x1de0, 0xa730, 0xba13, 0x05fe, 0x41ea, 0xbf4a, 0xa3f1, 0x182e, 0xb217, 0xad55, 0x44d9, 0xb0c0, 0x4389, 0x401f, 0xba25, 0x18ab, 0x02e1, 0x46dd, 0xba26, 0xba21, 0xb2bc, 0x42a2, 0x124d, 0xbfd0, 0xb271, 0x01b0, 0x42e0, 0x4011, 0xa094, 0xb02f, 0x43dd, 0xbf74, 0x41b0, 0x41bc, 0x4133, 0x105d, 0xb28f, 0xb0d0, 0xaf65, 0xaf83, 0xbf71, 0x4196, 0xb06b, 0x4122, 0x400d, 0x41ac, 0x1863, 0xb2e0, 0xb218, 0x41b8, 0x4588, 0xb2a0, 0xbfdb, 0x436c, 0x0f45, 0x0994, 0x43ab, 0x4106, 0x2c4b, 0x01db, 0xb048, 0x4495, 0x42a5, 0x40ae, 0x419c, 0x41ca, 0x40be, 0xa8ed, 0x3fe9, 0x42ea, 0x4127, 0x425f, 0x4499, 0x1c46, 0xb258, 0x3f68, 0xa832, 0xbf0c, 0x42cf, 0xa86c, 0x42ce, 0x4113, 0xb24f, 0xb0ec, 0xb0e0, 0x3d7f, 0xa273, 0x40cd, 0xb03f, 0x41ef, 0x4266, 0x413e, 0xb20c, 0x43b9, 0xb019, 0x4097, 0x05f4, 0x3445, 0x408b, 0x409a, 0x2673, 0xbf4f, 0x417b, 0xbaee, 0x443c, 0xbae3, 0x426c, 0xbf2d, 0x4185, 0x4366, 0x431c, 0x3f62, 0x42bd, 0x46c5, 0x416f, 0xb205, 0x4011, 0x07d0, 0x06d4, 0x413a, 0xbf5b, 0xb2b5, 0x1ae2, 0xa9a9, 0xba0e, 0x401c, 0xb22e, 0x44f0, 0x17c2, 0xb036, 0x1cf0, 0x4096, 0x4299, 0xba11, 0xa27d, 0x1e0a, 0xbf7f, 0xb285, 0x4342, 0x24a7, 0x1a9e, 0x2cbc, 0x4218, 0x0e6d, 0xb21d, 0x437c, 0x4392, 0x41e9, 0xb05d, 0x4101, 0xa9d4, 0x4371, 0x41ab, 0x1bc2, 0x4241, 0x4002, 0xb2d4, 0xb016, 0xbac0, 0xb201, 0x4398, 0x40a2, 0xbf49, 0x430c, 0x1c44, 0x3eed, 0xab02, 0xb20f, 0xbf3f, 0x17a7, 0x418f, 0x4151, 0xba01, 0xbf9b, 0x41a4, 0x0136, 0xa343, 0xb29b, 0x2019, 0xab1a, 0x43d2, 0xbf5e, 0x42b3, 0x297f, 0xb2ce, 0x2057, 0x1d80, 0x1633, 0x4310, 0x337b, 0x40bc, 0x4077, 0xb224, 0xb298, 0x2a78, 0x4233, 0x0d0e, 0x32a6, 0x42cb, 0x4396, 0x40a2, 0xb00f, 0x4050, 0xb271, 0x40ee, 0x410a, 0xbfc8, 0xb230, 0x1a49, 0x4360, 0xb03d, 0x0d57, 0x4276, 0x406d, 0xb223, 0x40b9, 0x40b7, 0x1e40, 0xb257, 0x07e4, 0xa579, 0xb217, 0xbf7c, 0xbae9, 0x4333, 0xbae6, 0xb23c, 0xbae4, 0x423d, 0x4121, 0xbacc, 0x41eb, 0xaaae, 0x1c89, 0x1960, 0x42af, 0x2b33, 0x4287, 0x4000, 0xb27b, 0x436d, 0x458d, 0x42aa, 0x43fd, 0x423a, 0x43fd, 0xbfc3, 0x1e10, 0x4317, 0xb272, 0xbaec, 0x4152, 0x4173, 0x30c9, 0x404e, 0x2173, 0x46c8, 0xb260, 0x4084, 0xb234, 0x4217, 0x1fbc, 0xbf13, 0x46b1, 0x41fd, 0xa309, 0x1f35, 0x418e, 0xb21a, 0x43a6, 0x41f1, 0x4219, 0x45d4, 0x45c6, 0x1ac2, 0x1c3e, 0xbad6, 0xbfc0, 0xba74, 0x4342, 0x41e9, 0x43c2, 0x4051, 0xbf88, 0xb2ce, 0xbfb0, 0xb03b, 0x248a, 0x42c8, 0xa7f9, 0xb2dc, 0x4284, 0xb27d, 0x4207, 0x43d4, 0x3a09, 0x43b6, 0xbfd2, 0x4636, 0x431f, 0x359a, 0x4035, 0xa58b, 0xb293, 0xba72, 0x40b4, 0x42fa, 0x08f7, 0x415c, 0x16ac, 0x438c, 0x42d5, 0x4069, 0x18ce, 0xa2a3, 0x4259, 0x245a, 0x2c8c, 0x4104, 0xbf52, 0xa8d4, 0x1a52, 0xae71, 0xb0dc, 0xa6c6, 0xb240, 0x33b4, 0x3314, 0x4183, 0x183d, 0x1fe5, 0xba4f, 0x1b3b, 0x41b3, 0x3897, 0xb209, 0x4380, 0x417f, 0xbaef, 0xb2e6, 0x42a0, 0x4177, 0xbfb2, 0x1e3c, 0x4250, 0xba34, 0x402c, 0x2e43, 0x435b, 0xbf8f, 0x3463, 0x40a0, 0x4174, 0x44dd, 0x40cf, 0x400b, 0x2fca, 0x3ccd, 0x2e2e, 0x3764, 0xa626, 0x40bc, 0xa3ba, 0x44ca, 0xbfa7, 0x43ed, 0xb278, 0x412a, 0xba1a, 0x01d4, 0x185c, 0x4365, 0x389a, 0x37b6, 0x4111, 0x40f7, 0x4114, 0x06a0, 0x4167, 0x3736, 0x42dc, 0x40c3, 0x32cb, 0x41b0, 0x412b, 0x2c08, 0xbacd, 0x1806, 0xb247, 0x3a1f, 0xbf70, 0x4137, 0xbf9e, 0x42a3, 0x3af2, 0x424f, 0x2f4b, 0xba6c, 0x3b5b, 0xbff0, 0xb2bc, 0x414b, 0x4570, 0xb216, 0xb2a1, 0xbad1, 0x40ae, 0x40d0, 0x41ca, 0x4059, 0xacfd, 0x43ae, 0x43de, 0x428c, 0x19ac, 0x2ed4, 0xba26, 0xbfc5, 0x1e66, 0x403a, 0x41a7, 0x3900, 0x432b, 0x4386, 0x3670, 0x1674, 0x0a49, 0x41b9, 0x438a, 0x42b9, 0x41aa, 0x40a8, 0x43c9, 0xba1c, 0x4167, 0xb0ed, 0x4359, 0xa917, 0xbf59, 0xb040, 0x4205, 0x43eb, 0x1811, 0x1e8e, 0x41cd, 0x41f2, 0x4190, 0x41b0, 0x368c, 0x387e, 0x1545, 0x18d3, 0x40d8, 0x4279, 0x438b, 0x0c33, 0xbf28, 0x4218, 0x41c7, 0xa71d, 0x4373, 0x229d, 0x4605, 0x2a5d, 0xb265, 0xbf15, 0x1c05, 0xb006, 0x193f, 0xba38, 0x4338, 0xbf4e, 0x4177, 0x4138, 0x22ae, 0xb268, 0x40e2, 0xbfa0, 0x42a9, 0x4612, 0x267c, 0x41c9, 0xb291, 0xbad0, 0xba3a, 0x45c2, 0xbac5, 0x43df, 0xb00c, 0x43e4, 0x1faf, 0x1c18, 0x1f38, 0x42f0, 0x1ac4, 0xbf2d, 0x4158, 0x40dc, 0x4329, 0xba24, 0x4009, 0xbace, 0x4206, 0x0e36, 0x3b42, 0x023c, 0x0ab2, 0x42f3, 0xb2d2, 0x4165, 0x236b, 0x4125, 0xb239, 0x45db, 0xbf5e, 0x4198, 0x444c, 0x1601, 0x19a8, 0xbaf6, 0xb251, 0x4035, 0x4169, 0x4265, 0x406f, 0x403c, 0x4319, 0xb29f, 0x4052, 0xb273, 0x1bfe, 0x4588, 0x40fe, 0x41cc, 0x40bb, 0x46f3, 0x42ff, 0xa67e, 0x1fff, 0x10c0, 0xbf33, 0x4286, 0x412d, 0xb26d, 0x41bd, 0x436e, 0x439d, 0x417e, 0x0746, 0x42c6, 0x04ce, 0x406d, 0x4249, 0xb22a, 0x43ff, 0x27d4, 0xb2a7, 0xbf95, 0xb287, 0x366b, 0x1cc0, 0x1802, 0xba5c, 0x43e7, 0x4061, 0x4153, 0x150c, 0x4681, 0x44a1, 0x45cd, 0xbad6, 0xbfc9, 0x42f2, 0x1bfc, 0x4180, 0x25a3, 0x42d3, 0x409b, 0xb0e1, 0x4676, 0xbfa1, 0x436a, 0x42b6, 0xba61, 0x424c, 0x4354, 0x340e, 0x43b7, 0x0ce6, 0x45bd, 0xa0d6, 0x42e8, 0xba77, 0x4037, 0x42b2, 0x446d, 0xbae6, 0x439f, 0xb0a1, 0xba6e, 0x4231, 0xa05f, 0x46ca, 0xb081, 0xba3e, 0x1d40, 0x435a, 0x196f, 0x4168, 0x405e, 0xbf9f, 0x4056, 0x30ab, 0x43be, 0x1956, 0xb01d, 0x41d5, 0xba3b, 0xbf48, 0x08f2, 0x42d2, 0x42a7, 0x4291, 0x423d, 0x405e, 0xb2a9, 0x2cb9, 0x43bd, 0x4270, 0xb2d2, 0x420d, 0x1494, 0x4098, 0xa21a, 0x43d1, 0x442e, 0x4559, 0x3192, 0x43d2, 0xbad2, 0x4379, 0x4298, 0xb2d6, 0xbafd, 0xbfc5, 0xbaca, 0xbaf2, 0x1ba9, 0x422c, 0xb2b0, 0x096c, 0x0443, 0xbafe, 0x44e4, 0xba0a, 0x1d8f, 0x15f2, 0xba7b, 0xbad0, 0xb295, 0x41f3, 0xb212, 0xb0dc, 0x24d5, 0x40c8, 0xba3a, 0x4023, 0xb2cd, 0xa317, 0xa11d, 0x4374, 0x1e3e, 0x414d, 0x401b, 0xbf85, 0x418b, 0xae75, 0xb226, 0x37f7, 0x4392, 0x432b, 0x426c, 0x4312, 0x0f46, 0xbfd0, 0x406c, 0xa729, 0x4136, 0x0f4f, 0x40dd, 0x1d25, 0x1a81, 0x41e9, 0x36ab, 0x4694, 0x4558, 0x1868, 0xb220, 0xbfa3, 0x1ecd, 0x4274, 0x1b66, 0x2988, 0x41e0, 0x08f1, 0x4214, 0xb28a, 0xb243, 0x4071, 0x2b56, 0x4038, 0x438f, 0x2441, 0x41bd, 0x41ba, 0x31cf, 0x408b, 0xb036, 0x1db4, 0x19c7, 0xb2c0, 0xbf55, 0x0c41, 0xbaf0, 0xb2ae, 0x4007, 0x1b06, 0xb08f, 0x1d3d, 0x430e, 0x2937, 0x41a0, 0x4209, 0x4448, 0x402a, 0xba03, 0x3597, 0xb20b, 0x45b3, 0x4376, 0x4663, 0x437c, 0x417e, 0xb088, 0xbf9c, 0x14f2, 0xb29a, 0x2554, 0x18c1, 0x180a, 0x417f, 0x0c42, 0xba14, 0xb05c, 0x41ba, 0xbf5e, 0x2562, 0x4243, 0x420f, 0x0a72, 0x438c, 0xb0ab, 0x4210, 0x1dca, 0xb2d9, 0x434a, 0xbf60, 0xad83, 0xbf35, 0xbadb, 0x407a, 0xb2a5, 0xa130, 0x429e, 0xa4e3, 0x142b, 0x35b8, 0xbfc0, 0x40a6, 0xbaf6, 0x3089, 0x4280, 0xba19, 0x43a6, 0x0fef, 0x442e, 0x1cf6, 0xb2ac, 0x18b2, 0xb0c3, 0xbad1, 0x42e0, 0x391a, 0x435c, 0xbf87, 0xb272, 0x05bc, 0x4226, 0xb2f2, 0x4313, 0x459e, 0x4326, 0x4495, 0x4236, 0x1239, 0xbf55, 0x43f8, 0xb289, 0xbf70, 0xb249, 0xb2cd, 0xb224, 0x4017, 0x1d5d, 0x4026, 0x423e, 0x1214, 0x431a, 0x351a, 0x40d3, 0xbf88, 0xba4e, 0x434f, 0x3815, 0x15ac, 0x1693, 0x40ad, 0xbf90, 0x43ac, 0x42c3, 0x060d, 0x4013, 0x3896, 0x428c, 0x2d3e, 0x435b, 0xaeac, 0x42b7, 0xbfbc, 0x42c5, 0x31b5, 0x1b10, 0x0f85, 0xbaf0, 0xbfa5, 0x09a7, 0x0762, 0xb2cb, 0xab8a, 0xba7c, 0x3c28, 0x40a2, 0x173c, 0xa6f8, 0x0788, 0x4623, 0x4324, 0x4310, 0xb208, 0x3297, 0x4667, 0x41c1, 0xbfc7, 0xbf00, 0xb222, 0x0499, 0x422f, 0x46f8, 0xa72c, 0x2e9e, 0xa41b, 0x4370, 0xbf08, 0xb073, 0xbfc0, 0x04bb, 0x2e56, 0xba6a, 0xba56, 0x4206, 0x4306, 0x427b, 0xb060, 0x4260, 0x4298, 0x4360, 0x434f, 0xbf70, 0xa2d2, 0xbae6, 0xbf80, 0xac39, 0x441b, 0xb2e7, 0x40d7, 0x42a2, 0x42b5, 0x08fe, 0xbf05, 0x195f, 0x414a, 0x40a5, 0x4344, 0xbafe, 0x4212, 0xb225, 0x429d, 0x428b, 0x22bc, 0x43e8, 0xb27d, 0xb2ac, 0x4108, 0xb2d2, 0x1d5f, 0x23c3, 0x4257, 0xb060, 0x4105, 0xb208, 0x441f, 0x2f98, 0x1f2b, 0xbf17, 0x43d2, 0x413e, 0xba24, 0x40ca, 0x4101, 0xbf90, 0x43dc, 0x42b6, 0x431d, 0x42db, 0x43e6, 0xac1f, 0x42c9, 0xba0b, 0x46a4, 0xba41, 0x42f3, 0x45a2, 0xbf2e, 0xb088, 0x40fd, 0x0d9d, 0x1a17, 0x2ee0, 0x1b8c, 0x41cc, 0x42b4, 0xb294, 0x436d, 0xabb1, 0xa7ed, 0xba2c, 0x4002, 0x4214, 0x417c, 0x03a3, 0x1b3a, 0x4645, 0xa99a, 0x4661, 0x41b7, 0xbacd, 0x2cb1, 0x1dca, 0x1d24, 0x42c5, 0xba4c, 0xbf9c, 0x1e2b, 0xb24b, 0x4770, 0xe7fe + ], + StartRegs = [0x6858fdc0, 0x2c117adb, 0x4e91c10b, 0x490c37fa, 0xdc3cc5ba, 0x19d843cc, 0x38054938, 0xa1f0a710, 0x540c538f, 0x8e7e0cd6, 0x8458328c, 0x917b025c, 0x75c492d1, 0x64488841, 0x00000000, 0x000001f0 + ], + FinalRegs = [0xffffa800, 0x540c5724, 0x540c572b, 0x00000024, 0x0c542457, 0x00002457, 0xfffffffc, 0x00001b93, 0x00001730, 0xffffff42, 0xffffff42, 0x00000000, 0x540c5724, 0x540c5688, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0xab86, 0x436f, 0xb06c, 0x401b, 0x4278, 0x4283, 0x4243, 0x1d91, 0x427d, 0x312e, 0xad98, 0x4070, 0x4267, 0x4481, 0x438f, 0xba4e, 0xb280, 0xb2d0, 0x4139, 0x40e3, 0x42f9, 0xbf7f, 0x242c, 0x43f9, 0x40cf, 0xb0cc, 0x410e, 0xb250, 0xb083, 0x2759, 0x434c, 0xbad5, 0x0875, 0xb036, 0x426c, 0x3721, 0x412f, 0xbf4c, 0x1bd7, 0x4137, 0xb04a, 0xb2d2, 0xb017, 0xbae5, 0xb258, 0x41ec, 0x1aa9, 0x1e1b, 0x42d2, 0x42a6, 0xb2a0, 0xbf36, 0xbae1, 0x426e, 0x4011, 0x41fc, 0x3afd, 0x4289, 0x355c, 0xb24f, 0x0e2c, 0x4391, 0xb2b5, 0x4059, 0x4030, 0xb299, 0xb281, 0xb04f, 0xb0d6, 0xbf33, 0x0a54, 0xbfe0, 0x41a6, 0x1b05, 0xbae0, 0xac71, 0xbf00, 0xb042, 0x18f7, 0x4576, 0x4056, 0x0b0d, 0xb224, 0xbf62, 0xba1e, 0x4629, 0xad90, 0x44e5, 0x1a37, 0x41c5, 0xbae3, 0xba68, 0x4436, 0x45b4, 0x4203, 0xba1c, 0x026e, 0x4649, 0x42c6, 0x4166, 0xba1d, 0x1d0b, 0x4006, 0x12f0, 0x0f55, 0x425a, 0xbfe1, 0xb264, 0x4672, 0xb031, 0xbac4, 0x2a1f, 0x42ec, 0x4147, 0x437f, 0x4165, 0x407e, 0x1e5e, 0x429e, 0xb03d, 0x262b, 0x4181, 0xa9bc, 0x1b17, 0xbf60, 0x1a3b, 0xa1c0, 0x18d3, 0xb03d, 0xbf25, 0xbad5, 0x421b, 0xbaeb, 0x18d4, 0x3660, 0x42ad, 0xbad0, 0xbfc0, 0x42b4, 0x0065, 0xba05, 0xb242, 0x41d4, 0x43f1, 0x427a, 0xbaf9, 0x4594, 0x41ba, 0xb004, 0xbf11, 0x3700, 0xb272, 0x4242, 0x1bab, 0xa2be, 0x43af, 0x418a, 0xb2c7, 0x0201, 0xb2c8, 0x425c, 0x405e, 0x4119, 0xb20b, 0x22a8, 0xb0bf, 0x1fd3, 0x0867, 0x4324, 0xbf89, 0xb01e, 0xb0a3, 0x3674, 0x29de, 0x4349, 0xb070, 0x00b9, 0xb27a, 0x4396, 0x45f2, 0x280b, 0x4288, 0xbf9e, 0x42fb, 0x0703, 0x40e5, 0x44e5, 0x1bd1, 0x46a2, 0xb2ca, 0x18e5, 0x010b, 0x16dc, 0x4389, 0x440c, 0x4134, 0x0684, 0x3025, 0x400b, 0x4272, 0xba24, 0x2c2f, 0x43c7, 0x2148, 0x151a, 0x433b, 0x41a2, 0xa6d0, 0xbf57, 0x085a, 0xb2c6, 0x44ba, 0x40a1, 0x43cd, 0xb2bc, 0xba3e, 0xb2d1, 0xba61, 0x0c3e, 0x1cfa, 0xbf84, 0x1b40, 0x372a, 0x3b42, 0xb06c, 0x43b7, 0x1d1f, 0x41fc, 0x41f6, 0x4552, 0xb29d, 0x43dc, 0x1a4e, 0x2de6, 0x4204, 0x407e, 0x16a1, 0xb276, 0x40ba, 0xb223, 0x4377, 0x4073, 0xb007, 0xbfdc, 0x41e3, 0x3889, 0x4117, 0x43bb, 0xba05, 0xb2ac, 0x274e, 0xb0fe, 0x01ee, 0x0c90, 0x46ab, 0x1775, 0x426c, 0xbaf1, 0x1030, 0x2822, 0xbad0, 0x089f, 0x4036, 0xbaf4, 0x1e1b, 0xba3b, 0x428e, 0x420c, 0xbf4e, 0x4228, 0x1bf3, 0x40dd, 0x40c8, 0x4010, 0xa54e, 0x4646, 0xba62, 0xbf84, 0x1d90, 0xb25f, 0xbf0f, 0xbacd, 0x410b, 0xb25c, 0x43ec, 0x25fc, 0xa882, 0x29ac, 0x4339, 0x2a4f, 0x431a, 0x032a, 0x4384, 0x3a9f, 0xb2e9, 0x401d, 0x1d5e, 0xbf64, 0x1da6, 0x062e, 0x4150, 0x0935, 0xa143, 0x2840, 0xbac7, 0xbac8, 0x44dc, 0x1af0, 0x434a, 0xba37, 0x432e, 0x4223, 0xbf00, 0x40be, 0x41ac, 0xb2d9, 0x4373, 0x19dc, 0x402c, 0x3f03, 0x43f9, 0xbf44, 0x4057, 0x07ef, 0xb2e1, 0x4308, 0xba47, 0x4033, 0x4069, 0x1590, 0xb2d7, 0x2ff9, 0xb281, 0x07a2, 0x0caa, 0x4022, 0x42fa, 0x425b, 0xba05, 0x2f80, 0xbadf, 0xa0c2, 0xbf14, 0x41ca, 0xbafb, 0x3b0a, 0x084d, 0x41c2, 0x43d6, 0x016f, 0xba73, 0x40ff, 0x1e2f, 0x4634, 0xa32a, 0x4212, 0x4234, 0x193e, 0xb036, 0xb2d3, 0xb2b5, 0x40f7, 0x40a5, 0x43f4, 0xbf84, 0x4322, 0x431a, 0x40e3, 0x3a14, 0xb2ef, 0xba6a, 0x439a, 0x43e2, 0x40db, 0xba35, 0x279e, 0x41f9, 0xb053, 0x400d, 0x4442, 0x45d4, 0xa582, 0xbf6a, 0x4249, 0x05f6, 0x439d, 0xb29f, 0x41d6, 0xa1a1, 0x1849, 0xbf8e, 0x4215, 0x130c, 0x43c9, 0xbfe0, 0xb2ff, 0x1d87, 0x4378, 0xb062, 0x42de, 0x4335, 0xb0b6, 0x416d, 0x4241, 0x08b9, 0x04fb, 0xba2d, 0x44f2, 0x0af9, 0xba57, 0x17c9, 0x4188, 0x1f59, 0x02cc, 0x42fb, 0xbf8f, 0xb289, 0x4148, 0x0ee2, 0x43ef, 0xba1c, 0x40df, 0x456e, 0xb235, 0x1d34, 0x43b0, 0x44ed, 0x4010, 0x43a1, 0x4096, 0x1a2d, 0xbf9d, 0xb01c, 0x417a, 0x429d, 0xb226, 0x19eb, 0xb20e, 0x434a, 0x46ba, 0x4374, 0xbf48, 0x41ea, 0x23aa, 0x41f7, 0xaef1, 0x4331, 0x41c3, 0x1dff, 0x349b, 0x220e, 0x43ec, 0xaf93, 0xbf7d, 0xba45, 0x33db, 0x41e2, 0x465f, 0x42d7, 0xb268, 0xba51, 0x42bf, 0xba33, 0xb03c, 0x42b2, 0x101c, 0x422b, 0xbf05, 0xb2a6, 0x348a, 0xba46, 0x1691, 0xb055, 0xbf60, 0xb058, 0x40f3, 0x404b, 0x3a1b, 0x44b1, 0x18d2, 0x165e, 0x439a, 0x401c, 0x1860, 0x44ca, 0xba4f, 0xbf7a, 0x1f7f, 0x410a, 0x44e0, 0xa367, 0xa9b9, 0x43e5, 0x41a3, 0x112b, 0xba5f, 0xbf01, 0xbf80, 0x4288, 0x4613, 0x1f10, 0x2223, 0xb2ab, 0xb231, 0xba03, 0x415d, 0x38a5, 0xba64, 0x4287, 0x42c7, 0x3c02, 0x1b36, 0x444e, 0xbf0c, 0x42ec, 0x419b, 0xb08b, 0x0e22, 0xbf58, 0x45a0, 0x3d48, 0xa1d0, 0xba09, 0x2ae7, 0x1240, 0xa3da, 0x430b, 0x41d5, 0xb267, 0x4173, 0xab95, 0x4323, 0xb24f, 0x436b, 0x12fc, 0xbf06, 0xbac0, 0x184d, 0xb2c8, 0x1e2e, 0x1b5c, 0x1f35, 0x414f, 0xb2f4, 0x41c8, 0x1bf7, 0x1c02, 0x4179, 0x054d, 0xa9e5, 0x19de, 0x40d4, 0xba00, 0xbae8, 0x406d, 0x4090, 0x16e9, 0xba19, 0xbf17, 0x4135, 0x2fdd, 0xa4f3, 0x4007, 0x43be, 0x4103, 0x46a4, 0xb201, 0x4061, 0xba27, 0xb056, 0x1c97, 0xb294, 0xba6c, 0x1ed4, 0xbacf, 0x35d1, 0x3094, 0x1c4d, 0xba09, 0x28a4, 0xb0a4, 0x2f5f, 0x4263, 0xb03c, 0x0667, 0x31f0, 0xbfc7, 0x259c, 0x41a9, 0x3f6d, 0x4345, 0x4240, 0x1b3e, 0x40d3, 0xba05, 0x4066, 0xbad7, 0xb0e7, 0x1f93, 0xbff0, 0x1c32, 0x41c5, 0x36e4, 0xb086, 0x3d60, 0x1927, 0x4339, 0x41fc, 0xb27d, 0x4253, 0xa158, 0xba4f, 0x0102, 0xbf2a, 0x353f, 0x1eb5, 0x400c, 0xab8b, 0x402c, 0x44fc, 0x384f, 0xb253, 0xacde, 0xaec7, 0x446b, 0xb2dc, 0x413e, 0x1d6c, 0x4206, 0xb298, 0x4297, 0xb2cf, 0x4008, 0x41b4, 0x2866, 0x4115, 0x4369, 0x46e5, 0xbf70, 0x4006, 0xa904, 0x40c4, 0xbf56, 0xa695, 0x42a2, 0x40c0, 0x4152, 0x409a, 0x411b, 0x408e, 0xbf80, 0xb074, 0x43be, 0x072c, 0x40a7, 0x41e3, 0xb0d3, 0x455e, 0xb2a5, 0x1be1, 0x4178, 0x405a, 0x4066, 0xb242, 0x42da, 0xb205, 0xba4a, 0xbfde, 0xba32, 0x45ce, 0x1dc4, 0x42be, 0x4257, 0xb22d, 0xaad1, 0x41f9, 0xb298, 0x4033, 0xb26c, 0xb08a, 0x4210, 0x4094, 0x40d3, 0x4105, 0x41be, 0x02d9, 0x405f, 0xba3a, 0xbac2, 0xbfde, 0x436d, 0x41f2, 0x42cb, 0x4225, 0x40d2, 0x44e5, 0x42a0, 0x41f1, 0x41b7, 0x1e7e, 0x4385, 0x114c, 0x1e14, 0xbf26, 0x37d0, 0xb00b, 0x2124, 0xb276, 0xbac4, 0x41ad, 0x4077, 0x44d0, 0xba27, 0xbf13, 0x2327, 0x21a0, 0x22e5, 0xb069, 0xba4a, 0xb22a, 0xad1e, 0x4207, 0x2a4e, 0x1a9e, 0xb0a8, 0x4095, 0xb0b5, 0x419e, 0xb2fd, 0x422c, 0x33c7, 0xbfb1, 0x4050, 0xb2ed, 0x29d5, 0x191a, 0x1c19, 0xbfbe, 0x1823, 0x447c, 0x41ee, 0x0ba8, 0x46d3, 0xbfb0, 0xaf6e, 0xbfa3, 0x42cb, 0xb043, 0xaf56, 0x4122, 0x405e, 0x1e9e, 0xb2f6, 0x4171, 0x18c9, 0xba2d, 0x0c08, 0x4200, 0x402a, 0x401b, 0xadfe, 0x4365, 0x1fd0, 0x411b, 0xb03b, 0x43d2, 0x42d3, 0xba5c, 0xbfcf, 0x420b, 0x253c, 0xaf62, 0xbafc, 0x4223, 0x4484, 0x41bd, 0x424a, 0xba4b, 0x41be, 0x2525, 0x4262, 0x432b, 0x3897, 0x29b2, 0xbf42, 0xa188, 0x4004, 0x449b, 0x46e5, 0x42ec, 0x45be, 0x3f6a, 0xbf60, 0x436d, 0x412f, 0xbf60, 0x4284, 0xb227, 0xba46, 0x4329, 0xa61f, 0xb21d, 0xbfb7, 0x43aa, 0x1d94, 0xafd1, 0x4102, 0xa3bc, 0xb240, 0x42d0, 0x1b46, 0x4140, 0x1d73, 0x19e9, 0xb0b2, 0x1ac2, 0xb2be, 0xbf57, 0x42e1, 0x455c, 0xb27d, 0x42fa, 0x3cb0, 0xb218, 0x41fc, 0x3d3a, 0x2b79, 0xb2c3, 0x1853, 0xbfa0, 0x4556, 0x4035, 0x1d83, 0x33c4, 0x131e, 0xbad3, 0x428c, 0x41ff, 0x456a, 0xbf56, 0x41f6, 0x4115, 0x4654, 0xa539, 0x43ae, 0x41d6, 0xba1c, 0x3b02, 0x2859, 0xba41, 0xa4f5, 0x43de, 0x41d6, 0xb251, 0x401d, 0xbfe4, 0x42dc, 0xa953, 0x4129, 0x406e, 0x09c1, 0x3105, 0x2ce2, 0xa65c, 0x42e6, 0x42a8, 0x34ac, 0x4270, 0x42ef, 0x3dc8, 0xb2dd, 0x189c, 0xb2bd, 0x1d7d, 0x44d8, 0xb224, 0xbf6a, 0xba40, 0x4194, 0x0198, 0x436f, 0x423c, 0x429f, 0x4077, 0xbad1, 0x1ac3, 0xb0be, 0x2bdf, 0xb051, 0x435d, 0x1573, 0x1d5f, 0x0b67, 0xb0e6, 0x430f, 0x4025, 0xbad2, 0xbfa7, 0x1896, 0x4386, 0x1e61, 0xb250, 0x2733, 0x13f6, 0xba6c, 0x4246, 0x1d98, 0x41f0, 0x4362, 0xb213, 0x41f1, 0xb074, 0xb050, 0x4139, 0xbac9, 0x420e, 0x416e, 0x0a81, 0xbf61, 0xba0f, 0x41c5, 0x40f4, 0xb2e3, 0x2f84, 0xb278, 0xbf67, 0x46c5, 0xba2e, 0x40f1, 0x1036, 0xbff0, 0x3a3b, 0xbaee, 0x3276, 0xb093, 0x1b72, 0x400d, 0x3cda, 0xbf24, 0x197a, 0x42e5, 0x4623, 0xbfbb, 0x1cc0, 0x42cd, 0x41dd, 0x2127, 0x1817, 0x404e, 0x4207, 0x4331, 0x1bf1, 0xbfd7, 0xa8e1, 0x46eb, 0x4372, 0x406b, 0x4670, 0xbf70, 0x401c, 0x403d, 0x4087, 0x4039, 0x43ce, 0x266c, 0x42c2, 0x1b06, 0x2d2d, 0xb0ad, 0x4613, 0x4029, 0x1cbb, 0x1878, 0x4294, 0x4154, 0xb253, 0xbf9b, 0xba0f, 0x4400, 0x422a, 0x34f1, 0xbfd3, 0xb20e, 0x41bd, 0x1c19, 0x418d, 0x3be1, 0xb056, 0x43cc, 0x40e0, 0x133b, 0x43fa, 0x1a07, 0x4086, 0xb26c, 0xbf46, 0x1caf, 0xbae1, 0xb0bf, 0xb2cc, 0xb024, 0x4345, 0x4474, 0xb031, 0x4553, 0x1c60, 0x2731, 0xb2be, 0x297d, 0x4367, 0x40ff, 0x401c, 0xba33, 0x2258, 0xbfce, 0xb280, 0x40c7, 0x0b15, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x38d6f90d, 0xcd984b26, 0xc8b29dc9, 0x67c34614, 0x14951b86, 0xae2631e0, 0x418035e3, 0x147814c2, 0xb4096d8b, 0xc30ae4ae, 0xb5c6061f, 0x1b3e3fa0, 0x0b9ebe6d, 0x746bc3e8, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0x00000100, 0xffffffff, 0x00000058, 0x31000000, 0x00000000, 0x00000000, 0x00000031, 0x00000000, 0x00fc342b, 0x2eb36651, 0x26796350, 0x00002db3, 0x00002d03, 0x00002fab, 0x00000000, 0x000001d0 }, + Instructions = [0xab86, 0x436f, 0xb06c, 0x401b, 0x4278, 0x4283, 0x4243, 0x1d91, 0x427d, 0x312e, 0xad98, 0x4070, 0x4267, 0x4481, 0x438f, 0xba4e, 0xb280, 0xb2d0, 0x4139, 0x40e3, 0x42f9, 0xbf7f, 0x242c, 0x43f9, 0x40cf, 0xb0cc, 0x410e, 0xb250, 0xb083, 0x2759, 0x434c, 0xbad5, 0x0875, 0xb036, 0x426c, 0x3721, 0x412f, 0xbf4c, 0x1bd7, 0x4137, 0xb04a, 0xb2d2, 0xb017, 0xbae5, 0xb258, 0x41ec, 0x1aa9, 0x1e1b, 0x42d2, 0x42a6, 0xb2a0, 0xbf36, 0xbae1, 0x426e, 0x4011, 0x41fc, 0x3afd, 0x4289, 0x355c, 0xb24f, 0x0e2c, 0x4391, 0xb2b5, 0x4059, 0x4030, 0xb299, 0xb281, 0xb04f, 0xb0d6, 0xbf33, 0x0a54, 0xbfe0, 0x41a6, 0x1b05, 0xbae0, 0xac71, 0xbf00, 0xb042, 0x18f7, 0x4576, 0x4056, 0x0b0d, 0xb224, 0xbf62, 0xba1e, 0x4629, 0xad90, 0x44e5, 0x1a37, 0x41c5, 0xbae3, 0xba68, 0x4436, 0x45b4, 0x4203, 0xba1c, 0x026e, 0x4649, 0x42c6, 0x4166, 0xba1d, 0x1d0b, 0x4006, 0x12f0, 0x0f55, 0x425a, 0xbfe1, 0xb264, 0x4672, 0xb031, 0xbac4, 0x2a1f, 0x42ec, 0x4147, 0x437f, 0x4165, 0x407e, 0x1e5e, 0x429e, 0xb03d, 0x262b, 0x4181, 0xa9bc, 0x1b17, 0xbf60, 0x1a3b, 0xa1c0, 0x18d3, 0xb03d, 0xbf25, 0xbad5, 0x421b, 0xbaeb, 0x18d4, 0x3660, 0x42ad, 0xbad0, 0xbfc0, 0x42b4, 0x0065, 0xba05, 0xb242, 0x41d4, 0x43f1, 0x427a, 0xbaf9, 0x4594, 0x41ba, 0xb004, 0xbf11, 0x3700, 0xb272, 0x4242, 0x1bab, 0xa2be, 0x43af, 0x418a, 0xb2c7, 0x0201, 0xb2c8, 0x425c, 0x405e, 0x4119, 0xb20b, 0x22a8, 0xb0bf, 0x1fd3, 0x0867, 0x4324, 0xbf89, 0xb01e, 0xb0a3, 0x3674, 0x29de, 0x4349, 0xb070, 0x00b9, 0xb27a, 0x4396, 0x45f2, 0x280b, 0x4288, 0xbf9e, 0x42fb, 0x0703, 0x40e5, 0x44e5, 0x1bd1, 0x46a2, 0xb2ca, 0x18e5, 0x010b, 0x16dc, 0x4389, 0x440c, 0x4134, 0x0684, 0x3025, 0x400b, 0x4272, 0xba24, 0x2c2f, 0x43c7, 0x2148, 0x151a, 0x433b, 0x41a2, 0xa6d0, 0xbf57, 0x085a, 0xb2c6, 0x44ba, 0x40a1, 0x43cd, 0xb2bc, 0xba3e, 0xb2d1, 0xba61, 0x0c3e, 0x1cfa, 0xbf84, 0x1b40, 0x372a, 0x3b42, 0xb06c, 0x43b7, 0x1d1f, 0x41fc, 0x41f6, 0x4552, 0xb29d, 0x43dc, 0x1a4e, 0x2de6, 0x4204, 0x407e, 0x16a1, 0xb276, 0x40ba, 0xb223, 0x4377, 0x4073, 0xb007, 0xbfdc, 0x41e3, 0x3889, 0x4117, 0x43bb, 0xba05, 0xb2ac, 0x274e, 0xb0fe, 0x01ee, 0x0c90, 0x46ab, 0x1775, 0x426c, 0xbaf1, 0x1030, 0x2822, 0xbad0, 0x089f, 0x4036, 0xbaf4, 0x1e1b, 0xba3b, 0x428e, 0x420c, 0xbf4e, 0x4228, 0x1bf3, 0x40dd, 0x40c8, 0x4010, 0xa54e, 0x4646, 0xba62, 0xbf84, 0x1d90, 0xb25f, 0xbf0f, 0xbacd, 0x410b, 0xb25c, 0x43ec, 0x25fc, 0xa882, 0x29ac, 0x4339, 0x2a4f, 0x431a, 0x032a, 0x4384, 0x3a9f, 0xb2e9, 0x401d, 0x1d5e, 0xbf64, 0x1da6, 0x062e, 0x4150, 0x0935, 0xa143, 0x2840, 0xbac7, 0xbac8, 0x44dc, 0x1af0, 0x434a, 0xba37, 0x432e, 0x4223, 0xbf00, 0x40be, 0x41ac, 0xb2d9, 0x4373, 0x19dc, 0x402c, 0x3f03, 0x43f9, 0xbf44, 0x4057, 0x07ef, 0xb2e1, 0x4308, 0xba47, 0x4033, 0x4069, 0x1590, 0xb2d7, 0x2ff9, 0xb281, 0x07a2, 0x0caa, 0x4022, 0x42fa, 0x425b, 0xba05, 0x2f80, 0xbadf, 0xa0c2, 0xbf14, 0x41ca, 0xbafb, 0x3b0a, 0x084d, 0x41c2, 0x43d6, 0x016f, 0xba73, 0x40ff, 0x1e2f, 0x4634, 0xa32a, 0x4212, 0x4234, 0x193e, 0xb036, 0xb2d3, 0xb2b5, 0x40f7, 0x40a5, 0x43f4, 0xbf84, 0x4322, 0x431a, 0x40e3, 0x3a14, 0xb2ef, 0xba6a, 0x439a, 0x43e2, 0x40db, 0xba35, 0x279e, 0x41f9, 0xb053, 0x400d, 0x4442, 0x45d4, 0xa582, 0xbf6a, 0x4249, 0x05f6, 0x439d, 0xb29f, 0x41d6, 0xa1a1, 0x1849, 0xbf8e, 0x4215, 0x130c, 0x43c9, 0xbfe0, 0xb2ff, 0x1d87, 0x4378, 0xb062, 0x42de, 0x4335, 0xb0b6, 0x416d, 0x4241, 0x08b9, 0x04fb, 0xba2d, 0x44f2, 0x0af9, 0xba57, 0x17c9, 0x4188, 0x1f59, 0x02cc, 0x42fb, 0xbf8f, 0xb289, 0x4148, 0x0ee2, 0x43ef, 0xba1c, 0x40df, 0x456e, 0xb235, 0x1d34, 0x43b0, 0x44ed, 0x4010, 0x43a1, 0x4096, 0x1a2d, 0xbf9d, 0xb01c, 0x417a, 0x429d, 0xb226, 0x19eb, 0xb20e, 0x434a, 0x46ba, 0x4374, 0xbf48, 0x41ea, 0x23aa, 0x41f7, 0xaef1, 0x4331, 0x41c3, 0x1dff, 0x349b, 0x220e, 0x43ec, 0xaf93, 0xbf7d, 0xba45, 0x33db, 0x41e2, 0x465f, 0x42d7, 0xb268, 0xba51, 0x42bf, 0xba33, 0xb03c, 0x42b2, 0x101c, 0x422b, 0xbf05, 0xb2a6, 0x348a, 0xba46, 0x1691, 0xb055, 0xbf60, 0xb058, 0x40f3, 0x404b, 0x3a1b, 0x44b1, 0x18d2, 0x165e, 0x439a, 0x401c, 0x1860, 0x44ca, 0xba4f, 0xbf7a, 0x1f7f, 0x410a, 0x44e0, 0xa367, 0xa9b9, 0x43e5, 0x41a3, 0x112b, 0xba5f, 0xbf01, 0xbf80, 0x4288, 0x4613, 0x1f10, 0x2223, 0xb2ab, 0xb231, 0xba03, 0x415d, 0x38a5, 0xba64, 0x4287, 0x42c7, 0x3c02, 0x1b36, 0x444e, 0xbf0c, 0x42ec, 0x419b, 0xb08b, 0x0e22, 0xbf58, 0x45a0, 0x3d48, 0xa1d0, 0xba09, 0x2ae7, 0x1240, 0xa3da, 0x430b, 0x41d5, 0xb267, 0x4173, 0xab95, 0x4323, 0xb24f, 0x436b, 0x12fc, 0xbf06, 0xbac0, 0x184d, 0xb2c8, 0x1e2e, 0x1b5c, 0x1f35, 0x414f, 0xb2f4, 0x41c8, 0x1bf7, 0x1c02, 0x4179, 0x054d, 0xa9e5, 0x19de, 0x40d4, 0xba00, 0xbae8, 0x406d, 0x4090, 0x16e9, 0xba19, 0xbf17, 0x4135, 0x2fdd, 0xa4f3, 0x4007, 0x43be, 0x4103, 0x46a4, 0xb201, 0x4061, 0xba27, 0xb056, 0x1c97, 0xb294, 0xba6c, 0x1ed4, 0xbacf, 0x35d1, 0x3094, 0x1c4d, 0xba09, 0x28a4, 0xb0a4, 0x2f5f, 0x4263, 0xb03c, 0x0667, 0x31f0, 0xbfc7, 0x259c, 0x41a9, 0x3f6d, 0x4345, 0x4240, 0x1b3e, 0x40d3, 0xba05, 0x4066, 0xbad7, 0xb0e7, 0x1f93, 0xbff0, 0x1c32, 0x41c5, 0x36e4, 0xb086, 0x3d60, 0x1927, 0x4339, 0x41fc, 0xb27d, 0x4253, 0xa158, 0xba4f, 0x0102, 0xbf2a, 0x353f, 0x1eb5, 0x400c, 0xab8b, 0x402c, 0x44fc, 0x384f, 0xb253, 0xacde, 0xaec7, 0x446b, 0xb2dc, 0x413e, 0x1d6c, 0x4206, 0xb298, 0x4297, 0xb2cf, 0x4008, 0x41b4, 0x2866, 0x4115, 0x4369, 0x46e5, 0xbf70, 0x4006, 0xa904, 0x40c4, 0xbf56, 0xa695, 0x42a2, 0x40c0, 0x4152, 0x409a, 0x411b, 0x408e, 0xbf80, 0xb074, 0x43be, 0x072c, 0x40a7, 0x41e3, 0xb0d3, 0x455e, 0xb2a5, 0x1be1, 0x4178, 0x405a, 0x4066, 0xb242, 0x42da, 0xb205, 0xba4a, 0xbfde, 0xba32, 0x45ce, 0x1dc4, 0x42be, 0x4257, 0xb22d, 0xaad1, 0x41f9, 0xb298, 0x4033, 0xb26c, 0xb08a, 0x4210, 0x4094, 0x40d3, 0x4105, 0x41be, 0x02d9, 0x405f, 0xba3a, 0xbac2, 0xbfde, 0x436d, 0x41f2, 0x42cb, 0x4225, 0x40d2, 0x44e5, 0x42a0, 0x41f1, 0x41b7, 0x1e7e, 0x4385, 0x114c, 0x1e14, 0xbf26, 0x37d0, 0xb00b, 0x2124, 0xb276, 0xbac4, 0x41ad, 0x4077, 0x44d0, 0xba27, 0xbf13, 0x2327, 0x21a0, 0x22e5, 0xb069, 0xba4a, 0xb22a, 0xad1e, 0x4207, 0x2a4e, 0x1a9e, 0xb0a8, 0x4095, 0xb0b5, 0x419e, 0xb2fd, 0x422c, 0x33c7, 0xbfb1, 0x4050, 0xb2ed, 0x29d5, 0x191a, 0x1c19, 0xbfbe, 0x1823, 0x447c, 0x41ee, 0x0ba8, 0x46d3, 0xbfb0, 0xaf6e, 0xbfa3, 0x42cb, 0xb043, 0xaf56, 0x4122, 0x405e, 0x1e9e, 0xb2f6, 0x4171, 0x18c9, 0xba2d, 0x0c08, 0x4200, 0x402a, 0x401b, 0xadfe, 0x4365, 0x1fd0, 0x411b, 0xb03b, 0x43d2, 0x42d3, 0xba5c, 0xbfcf, 0x420b, 0x253c, 0xaf62, 0xbafc, 0x4223, 0x4484, 0x41bd, 0x424a, 0xba4b, 0x41be, 0x2525, 0x4262, 0x432b, 0x3897, 0x29b2, 0xbf42, 0xa188, 0x4004, 0x449b, 0x46e5, 0x42ec, 0x45be, 0x3f6a, 0xbf60, 0x436d, 0x412f, 0xbf60, 0x4284, 0xb227, 0xba46, 0x4329, 0xa61f, 0xb21d, 0xbfb7, 0x43aa, 0x1d94, 0xafd1, 0x4102, 0xa3bc, 0xb240, 0x42d0, 0x1b46, 0x4140, 0x1d73, 0x19e9, 0xb0b2, 0x1ac2, 0xb2be, 0xbf57, 0x42e1, 0x455c, 0xb27d, 0x42fa, 0x3cb0, 0xb218, 0x41fc, 0x3d3a, 0x2b79, 0xb2c3, 0x1853, 0xbfa0, 0x4556, 0x4035, 0x1d83, 0x33c4, 0x131e, 0xbad3, 0x428c, 0x41ff, 0x456a, 0xbf56, 0x41f6, 0x4115, 0x4654, 0xa539, 0x43ae, 0x41d6, 0xba1c, 0x3b02, 0x2859, 0xba41, 0xa4f5, 0x43de, 0x41d6, 0xb251, 0x401d, 0xbfe4, 0x42dc, 0xa953, 0x4129, 0x406e, 0x09c1, 0x3105, 0x2ce2, 0xa65c, 0x42e6, 0x42a8, 0x34ac, 0x4270, 0x42ef, 0x3dc8, 0xb2dd, 0x189c, 0xb2bd, 0x1d7d, 0x44d8, 0xb224, 0xbf6a, 0xba40, 0x4194, 0x0198, 0x436f, 0x423c, 0x429f, 0x4077, 0xbad1, 0x1ac3, 0xb0be, 0x2bdf, 0xb051, 0x435d, 0x1573, 0x1d5f, 0x0b67, 0xb0e6, 0x430f, 0x4025, 0xbad2, 0xbfa7, 0x1896, 0x4386, 0x1e61, 0xb250, 0x2733, 0x13f6, 0xba6c, 0x4246, 0x1d98, 0x41f0, 0x4362, 0xb213, 0x41f1, 0xb074, 0xb050, 0x4139, 0xbac9, 0x420e, 0x416e, 0x0a81, 0xbf61, 0xba0f, 0x41c5, 0x40f4, 0xb2e3, 0x2f84, 0xb278, 0xbf67, 0x46c5, 0xba2e, 0x40f1, 0x1036, 0xbff0, 0x3a3b, 0xbaee, 0x3276, 0xb093, 0x1b72, 0x400d, 0x3cda, 0xbf24, 0x197a, 0x42e5, 0x4623, 0xbfbb, 0x1cc0, 0x42cd, 0x41dd, 0x2127, 0x1817, 0x404e, 0x4207, 0x4331, 0x1bf1, 0xbfd7, 0xa8e1, 0x46eb, 0x4372, 0x406b, 0x4670, 0xbf70, 0x401c, 0x403d, 0x4087, 0x4039, 0x43ce, 0x266c, 0x42c2, 0x1b06, 0x2d2d, 0xb0ad, 0x4613, 0x4029, 0x1cbb, 0x1878, 0x4294, 0x4154, 0xb253, 0xbf9b, 0xba0f, 0x4400, 0x422a, 0x34f1, 0xbfd3, 0xb20e, 0x41bd, 0x1c19, 0x418d, 0x3be1, 0xb056, 0x43cc, 0x40e0, 0x133b, 0x43fa, 0x1a07, 0x4086, 0xb26c, 0xbf46, 0x1caf, 0xbae1, 0xb0bf, 0xb2cc, 0xb024, 0x4345, 0x4474, 0xb031, 0x4553, 0x1c60, 0x2731, 0xb2be, 0x297d, 0x4367, 0x40ff, 0x401c, 0xba33, 0x2258, 0xbfce, 0xb280, 0x40c7, 0x0b15, 0x4770, 0xe7fe + ], + StartRegs = [0x38d6f90d, 0xcd984b26, 0xc8b29dc9, 0x67c34614, 0x14951b86, 0xae2631e0, 0x418035e3, 0x147814c2, 0xb4096d8b, 0xc30ae4ae, 0xb5c6061f, 0x1b3e3fa0, 0x0b9ebe6d, 0x746bc3e8, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0x00000100, 0xffffffff, 0x00000058, 0x31000000, 0x00000000, 0x00000000, 0x00000031, 0x00000000, 0x00fc342b, 0x2eb36651, 0x26796350, 0x00002db3, 0x00002d03, 0x00002fab, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x1971, 0x439c, 0x401d, 0x1924, 0x1fc0, 0x3352, 0xba14, 0x4306, 0x432b, 0xb268, 0x1c6f, 0x4158, 0x4633, 0x37a0, 0xbfbe, 0x4286, 0x410c, 0x41c5, 0xb209, 0xb2f5, 0xa3dd, 0x40f7, 0xb087, 0xae09, 0xb2de, 0xba4c, 0x4349, 0xa6c5, 0x436c, 0xb05c, 0x4575, 0x2190, 0xbf3c, 0x1ed6, 0xa383, 0x4192, 0xbf60, 0xba2a, 0x36db, 0x4116, 0x2df4, 0x41a7, 0x299f, 0x406c, 0xa653, 0xbaca, 0xb282, 0xbac8, 0x40f7, 0x4669, 0xb274, 0xb022, 0xb2eb, 0x0ccf, 0x41b7, 0x20ed, 0x047a, 0xb083, 0xbf33, 0xb2bf, 0xa78d, 0x3ae6, 0x3882, 0xba1b, 0x455f, 0xbaeb, 0xaa73, 0x435d, 0xb201, 0x42d4, 0x4183, 0x415e, 0xba41, 0x41a3, 0xbfa5, 0x43ac, 0x4255, 0x1b2d, 0x422c, 0x4217, 0xbafe, 0x420c, 0x43e3, 0x40e3, 0x4199, 0x42fc, 0xbf4c, 0x41c6, 0x1001, 0x4674, 0x41d0, 0x404c, 0x4193, 0x4301, 0x16cb, 0x2399, 0x3509, 0x419b, 0x43d0, 0x18c3, 0x43d3, 0x40b9, 0x43ed, 0x137b, 0x40be, 0x2372, 0x3e64, 0x0ccb, 0xbf9b, 0x41a1, 0x26ed, 0x4359, 0x1326, 0xa32a, 0x4364, 0x3046, 0x410d, 0x416d, 0x3711, 0x41db, 0x40b5, 0x429f, 0x43a8, 0x42d0, 0xb2f9, 0x0758, 0xadfe, 0x421e, 0xb247, 0x2f6a, 0xbf0e, 0xb2e4, 0x2aad, 0x43a4, 0xb2d4, 0x439a, 0x4206, 0xbad9, 0x4153, 0x0dc3, 0xb217, 0xa3ea, 0x1a60, 0x1768, 0x4555, 0x40f9, 0x4205, 0x463d, 0x3e44, 0x4016, 0x3638, 0xba58, 0xb2c2, 0xba3a, 0xba04, 0x4224, 0x4359, 0x0001, 0x422a, 0xbf3c, 0x4342, 0x1b5e, 0xb22b, 0xb2ef, 0x36ae, 0xb204, 0xbfb0, 0x1858, 0x41da, 0x241b, 0xb04f, 0xb28d, 0xba31, 0x42f0, 0x42e7, 0x4028, 0x1dde, 0x45cd, 0xba2a, 0x40c0, 0x18b0, 0x0b4c, 0xbfbd, 0x1b99, 0x0418, 0x4239, 0x3b1d, 0x23c6, 0xba4f, 0x1f5d, 0xb2b0, 0xbac5, 0x1c2a, 0x45f1, 0x422b, 0x43bd, 0xa17c, 0xbf33, 0xba74, 0xb235, 0x0c06, 0x43b2, 0x40b3, 0xb0d2, 0xbf39, 0x4182, 0x46d9, 0xb2f1, 0x4271, 0x43e5, 0xb2b0, 0x41de, 0xbf00, 0x317f, 0x41e1, 0xa9e4, 0x18b0, 0x2a87, 0x4151, 0x43a1, 0x4179, 0x4204, 0x42c1, 0x44f8, 0x4389, 0x40f0, 0x2442, 0x43af, 0xbfa8, 0x3cac, 0x4365, 0x2149, 0x41ff, 0x443f, 0x4190, 0xb0ba, 0x216f, 0xb225, 0xb248, 0xb0f5, 0xba3e, 0x0b19, 0x1bc6, 0x41a7, 0xb0d7, 0xb2dc, 0xb20b, 0x1da9, 0x432d, 0x4293, 0x4035, 0x01ab, 0x2725, 0xbf93, 0xb264, 0x42b6, 0xb074, 0xb2db, 0xb2b6, 0x1dd3, 0x40fc, 0xba52, 0x4301, 0x1e30, 0xba78, 0x413c, 0xbfab, 0xa981, 0x414a, 0x439f, 0x4015, 0x0769, 0xb23d, 0x43de, 0x2bb2, 0xba4a, 0x4261, 0x412c, 0xbf9c, 0x4135, 0xb2ce, 0x4224, 0x1fcf, 0x42bc, 0x18cd, 0x1b98, 0x2bdb, 0x3605, 0x43df, 0xa64c, 0xbf9a, 0x32a3, 0x43ec, 0xb2d2, 0x43a1, 0xba7d, 0x43ee, 0x0e94, 0x44c9, 0x01d6, 0x4140, 0x2921, 0x424d, 0xb0a4, 0x0caa, 0xbf85, 0x41d4, 0x19a8, 0x0dc9, 0x4161, 0x1b35, 0x43ee, 0xa171, 0x4477, 0x4385, 0xba16, 0x420f, 0x3013, 0x0573, 0x4281, 0x3bf9, 0x181a, 0xb0bd, 0xb046, 0x3254, 0x4654, 0x43fd, 0xba34, 0x42b0, 0x4215, 0xb022, 0x42cf, 0x4225, 0x4281, 0xbf0e, 0x4021, 0x4217, 0x4351, 0x4283, 0xb2d9, 0xb223, 0xbfe0, 0x4209, 0xbfb6, 0xbaeb, 0x078c, 0xb21e, 0x1bc3, 0x2e6e, 0x43d9, 0x41c8, 0x40e0, 0x4361, 0x4225, 0x4078, 0x37fa, 0xb065, 0x4390, 0x40bd, 0x418c, 0xbfcf, 0xba18, 0x40e6, 0x4039, 0xbf00, 0x1bf0, 0x441a, 0x4345, 0x42d6, 0x2c06, 0x238c, 0x4284, 0x413b, 0x4295, 0xb291, 0x21de, 0xaabe, 0xba14, 0x4253, 0x3c60, 0xb29b, 0xbf00, 0xbfbc, 0x4081, 0xb2d5, 0xb2f1, 0x4253, 0x04c1, 0xb055, 0x1f26, 0x1d48, 0xbf88, 0x401d, 0x2150, 0x40ff, 0x08dd, 0xbf45, 0x18ce, 0x4341, 0x4217, 0x40b9, 0x09c6, 0x43a1, 0xbac8, 0xb28f, 0x420c, 0x41ea, 0xb2f7, 0x0e48, 0xa96a, 0xb29e, 0x0631, 0x3cc9, 0x43cb, 0x3771, 0xb23c, 0x46f9, 0xa882, 0xb2d3, 0xba10, 0x4375, 0x17f2, 0x03ab, 0xb2da, 0x43b0, 0x43ef, 0xbfbb, 0x2f20, 0xb051, 0x1ffa, 0x42c9, 0x2d15, 0x2157, 0xa778, 0x432c, 0x421a, 0x4430, 0x43f6, 0x4271, 0x436f, 0xbf62, 0xbac5, 0x4288, 0x24a8, 0x4361, 0xad27, 0x433f, 0x3a4e, 0xba0e, 0x41ed, 0xb2b6, 0xb27a, 0xbf53, 0xa105, 0x1f58, 0xa2f2, 0x43ff, 0xb074, 0x1ac5, 0x421e, 0x4241, 0xb2b7, 0x2ad2, 0x40d9, 0xa5fd, 0x25d8, 0xb2b6, 0xa3c8, 0xb2bf, 0xb226, 0xba6d, 0x07ed, 0x43db, 0x4261, 0x40e7, 0x41a5, 0x4619, 0x3e15, 0xb25a, 0x427f, 0xbff0, 0x1a2f, 0xbfd6, 0xbac4, 0x42ba, 0x0922, 0x11a7, 0x439f, 0x44d0, 0x43ff, 0x3c72, 0xba33, 0x4386, 0x1f3a, 0x40c0, 0x418f, 0x411a, 0x4212, 0x4110, 0x428f, 0x447c, 0xb097, 0xbf77, 0x42b7, 0x0621, 0xbacb, 0x46ca, 0x43af, 0x01f4, 0xba26, 0x1815, 0x41e1, 0x4150, 0x4171, 0x43b4, 0xa937, 0x412f, 0x42df, 0x429a, 0x415e, 0x431c, 0xad19, 0x4282, 0x4073, 0xbf87, 0x43d0, 0xba54, 0x2db6, 0x4350, 0x4237, 0x4164, 0xbae5, 0xb22b, 0x0a33, 0x43f8, 0xbf33, 0x40f2, 0xb2bc, 0xb2a4, 0x40e6, 0x41c9, 0x326c, 0x41c8, 0x42e9, 0x42af, 0xba3b, 0x359d, 0x4109, 0x4028, 0xb269, 0xba16, 0xb2fc, 0x3acb, 0x4063, 0xbf16, 0x09a3, 0xb2d5, 0xba22, 0x4142, 0xbf8b, 0x1c3c, 0x3e0e, 0xb29c, 0x1164, 0x331c, 0x1ce8, 0xbff0, 0x43d7, 0x4137, 0x429b, 0x18a9, 0x4193, 0xb0cc, 0xba49, 0xba38, 0x411f, 0xb205, 0xbfa6, 0x4173, 0x4142, 0x43e0, 0x4089, 0x182e, 0xba01, 0x41ea, 0x3a41, 0x2930, 0x4025, 0x0594, 0x1556, 0x0b43, 0x46f2, 0x248c, 0x4340, 0xbf7b, 0x4257, 0x4328, 0xba28, 0x04e8, 0x42c7, 0x4207, 0x1d28, 0x40d1, 0x2167, 0x43a3, 0x284d, 0xbf05, 0xb2a2, 0x1605, 0xb276, 0x412d, 0x40f3, 0x378b, 0xba41, 0xbaf7, 0x42a3, 0x425d, 0x45b4, 0xbf9b, 0xa2c2, 0xba13, 0x410c, 0x45da, 0x4372, 0x4228, 0x0a0b, 0x4550, 0x4295, 0x06c1, 0xb2cd, 0x1487, 0x31fb, 0xbac1, 0xb200, 0xba13, 0x2c7f, 0x4449, 0x42f8, 0xbaf4, 0xb2b4, 0x24b1, 0x4166, 0xba16, 0xbf7c, 0x4171, 0x4311, 0x32bc, 0x4572, 0x3a43, 0x4690, 0xb2b3, 0xb037, 0x41c0, 0x4198, 0x4459, 0x41e3, 0x42e3, 0x2d4e, 0x05da, 0xb20a, 0x1cfd, 0xb28f, 0xb080, 0xa6d7, 0x4268, 0x243a, 0x43b9, 0xbf27, 0x14b0, 0x2410, 0xba40, 0x1f3a, 0x4008, 0xbfd9, 0x1b4b, 0x40a4, 0x2a6f, 0x14aa, 0x407b, 0xba5c, 0x41ec, 0x4245, 0x1b03, 0x4315, 0x4139, 0x2c74, 0xbfc0, 0x1806, 0x0ae6, 0xbae8, 0x3d2f, 0xb244, 0x0bac, 0xb245, 0x4304, 0xbf90, 0xbf9a, 0xb218, 0x408a, 0x42e1, 0x0fa0, 0xb06d, 0x43d5, 0x41b2, 0xb20e, 0x222f, 0xbfd3, 0x3289, 0xb2d2, 0x45e1, 0xb0ab, 0xbf8b, 0xba5c, 0x41a9, 0x41e2, 0x42ee, 0x446d, 0x41d9, 0x4362, 0x4265, 0xba7d, 0x43c5, 0x2cce, 0xb284, 0xb2fb, 0x40fa, 0x3ddf, 0x4188, 0xb251, 0xba1d, 0xbf26, 0x424b, 0x4566, 0x14d4, 0x3784, 0xbf70, 0x4225, 0xb22b, 0x1f12, 0x4022, 0xb061, 0x4145, 0x42d3, 0xb2c9, 0x2199, 0x42e5, 0x1a4d, 0x25c8, 0xbf56, 0x401e, 0x1c37, 0xba38, 0x1498, 0x4052, 0x4181, 0xba67, 0x41ab, 0x1bc7, 0x43d8, 0x4379, 0x42d0, 0x4211, 0x3a14, 0x00c0, 0x4068, 0x41dd, 0x4138, 0x40cb, 0xb21f, 0xb0c9, 0xba5c, 0x4004, 0xbfd5, 0x43bf, 0x4344, 0x06d0, 0x40ea, 0x2d6a, 0xbfe4, 0x42bc, 0x40a0, 0x40c6, 0xaa16, 0x42bd, 0x421a, 0xb2d7, 0x41ca, 0xb016, 0x43ef, 0xae2d, 0x4341, 0xb0c0, 0xba1b, 0x40c7, 0xb0cd, 0x3c18, 0x2ab4, 0x41d2, 0x0506, 0x2144, 0x183c, 0xba30, 0xb266, 0xb2e5, 0xbf90, 0xbf4a, 0xa979, 0x4300, 0xb26e, 0xbfd0, 0xba66, 0x13dc, 0xb28e, 0x1a28, 0x4158, 0x43ab, 0x4075, 0x40f2, 0x4593, 0x198f, 0x38c5, 0x4061, 0xbf23, 0x3e56, 0xa0ef, 0xba50, 0x4433, 0xba0b, 0xad1b, 0x1df6, 0xbad9, 0xb253, 0x40cc, 0x424c, 0x1a18, 0x1b36, 0x186b, 0xbfdf, 0x4167, 0x0075, 0x431c, 0x400c, 0x3e22, 0x434d, 0xba3b, 0x4388, 0x2f78, 0x407f, 0x4254, 0x1610, 0xba4b, 0x43f8, 0x4089, 0xb231, 0x4050, 0xb29d, 0x0c5a, 0x3afd, 0x42e8, 0x1c7a, 0xb241, 0x0cad, 0xb268, 0xbfc0, 0xbf6a, 0xb2cc, 0x37b0, 0x46eb, 0x4129, 0x1e5b, 0xb216, 0x0748, 0x41d1, 0x4308, 0x45ac, 0xb2a5, 0x43d5, 0x4049, 0x4076, 0xb28d, 0x2611, 0xb26d, 0xba2e, 0x34d4, 0xbafb, 0x3761, 0x417a, 0x4156, 0x4575, 0xb210, 0xbf4d, 0x42ba, 0xba26, 0xa039, 0x422c, 0x4357, 0xaee4, 0x41ab, 0x43eb, 0x1d12, 0x434c, 0x1818, 0x0a20, 0xb208, 0xb2a2, 0x4187, 0xba69, 0x43de, 0xa5ce, 0xbfac, 0xb0db, 0xb274, 0x4347, 0x4151, 0x1f64, 0x1c6b, 0x1db7, 0xbad5, 0x1e0a, 0x198e, 0x416f, 0xbacf, 0x42fe, 0x4173, 0x183b, 0x44f4, 0x4075, 0x43a0, 0xbaf0, 0xbf41, 0x1e71, 0x39a2, 0x1dc5, 0xb212, 0x0159, 0xbaea, 0x1fdd, 0x42d7, 0x4453, 0xb2dc, 0x0817, 0x4698, 0xba22, 0xbf58, 0x04db, 0xb216, 0x1b55, 0x42e8, 0xba7c, 0xbf88, 0xa1f0, 0xba12, 0xb21f, 0x2628, 0x4091, 0x4554, 0x0c86, 0x4098, 0xb0fb, 0x43e1, 0xbaed, 0xb2c1, 0x1f65, 0x4019, 0x4365, 0x0c81, 0x40dd, 0xaf49, 0x40f2, 0x40a3, 0xba56, 0x4378, 0xa9c0, 0xbf81, 0xba7f, 0x404b, 0xaec3, 0x3eec, 0xbadf, 0xacb7, 0x434a, 0xba10, 0xbaeb, 0x1ea3, 0xbf19, 0x413d, 0xb07a, 0x1d45, 0x42ff, 0xb08d, 0x1a6b, 0xa7c4, 0xa3d1, 0x40bb, 0xba7f, 0x460a, 0x45cb, 0x4490, 0xb097, 0x40f8, 0x00c0, 0x3d1a, 0x42bb, 0x30ae, 0x1c4f, 0xad13, 0xbafd, 0x40c3, 0x40e1, 0x4046, 0x434e, 0xbf3a, 0x185c, 0x409a, 0x26fc, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6e009d47, 0x4404ee01, 0xc475426e, 0xc7651e4f, 0x99397e2c, 0xe2311d1e, 0x13b3b0d5, 0x94ee1dcc, 0x8a96e390, 0xfb8d253a, 0x3cd58f7e, 0xf938ad79, 0x61646a13, 0x14d0ae7f, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0x000000ae, 0x00000000, 0x14d0af83, 0x00000000, 0x00000000, 0xffff84af, 0x00000000, 0x14d0af84, 0x14d0b083, 0x00001344, 0x00000000, 0xf938ad79, 0x61646a13, 0x14d0addb, 0x00000000, 0x400001d0 }, + Instructions = [0x1971, 0x439c, 0x401d, 0x1924, 0x1fc0, 0x3352, 0xba14, 0x4306, 0x432b, 0xb268, 0x1c6f, 0x4158, 0x4633, 0x37a0, 0xbfbe, 0x4286, 0x410c, 0x41c5, 0xb209, 0xb2f5, 0xa3dd, 0x40f7, 0xb087, 0xae09, 0xb2de, 0xba4c, 0x4349, 0xa6c5, 0x436c, 0xb05c, 0x4575, 0x2190, 0xbf3c, 0x1ed6, 0xa383, 0x4192, 0xbf60, 0xba2a, 0x36db, 0x4116, 0x2df4, 0x41a7, 0x299f, 0x406c, 0xa653, 0xbaca, 0xb282, 0xbac8, 0x40f7, 0x4669, 0xb274, 0xb022, 0xb2eb, 0x0ccf, 0x41b7, 0x20ed, 0x047a, 0xb083, 0xbf33, 0xb2bf, 0xa78d, 0x3ae6, 0x3882, 0xba1b, 0x455f, 0xbaeb, 0xaa73, 0x435d, 0xb201, 0x42d4, 0x4183, 0x415e, 0xba41, 0x41a3, 0xbfa5, 0x43ac, 0x4255, 0x1b2d, 0x422c, 0x4217, 0xbafe, 0x420c, 0x43e3, 0x40e3, 0x4199, 0x42fc, 0xbf4c, 0x41c6, 0x1001, 0x4674, 0x41d0, 0x404c, 0x4193, 0x4301, 0x16cb, 0x2399, 0x3509, 0x419b, 0x43d0, 0x18c3, 0x43d3, 0x40b9, 0x43ed, 0x137b, 0x40be, 0x2372, 0x3e64, 0x0ccb, 0xbf9b, 0x41a1, 0x26ed, 0x4359, 0x1326, 0xa32a, 0x4364, 0x3046, 0x410d, 0x416d, 0x3711, 0x41db, 0x40b5, 0x429f, 0x43a8, 0x42d0, 0xb2f9, 0x0758, 0xadfe, 0x421e, 0xb247, 0x2f6a, 0xbf0e, 0xb2e4, 0x2aad, 0x43a4, 0xb2d4, 0x439a, 0x4206, 0xbad9, 0x4153, 0x0dc3, 0xb217, 0xa3ea, 0x1a60, 0x1768, 0x4555, 0x40f9, 0x4205, 0x463d, 0x3e44, 0x4016, 0x3638, 0xba58, 0xb2c2, 0xba3a, 0xba04, 0x4224, 0x4359, 0x0001, 0x422a, 0xbf3c, 0x4342, 0x1b5e, 0xb22b, 0xb2ef, 0x36ae, 0xb204, 0xbfb0, 0x1858, 0x41da, 0x241b, 0xb04f, 0xb28d, 0xba31, 0x42f0, 0x42e7, 0x4028, 0x1dde, 0x45cd, 0xba2a, 0x40c0, 0x18b0, 0x0b4c, 0xbfbd, 0x1b99, 0x0418, 0x4239, 0x3b1d, 0x23c6, 0xba4f, 0x1f5d, 0xb2b0, 0xbac5, 0x1c2a, 0x45f1, 0x422b, 0x43bd, 0xa17c, 0xbf33, 0xba74, 0xb235, 0x0c06, 0x43b2, 0x40b3, 0xb0d2, 0xbf39, 0x4182, 0x46d9, 0xb2f1, 0x4271, 0x43e5, 0xb2b0, 0x41de, 0xbf00, 0x317f, 0x41e1, 0xa9e4, 0x18b0, 0x2a87, 0x4151, 0x43a1, 0x4179, 0x4204, 0x42c1, 0x44f8, 0x4389, 0x40f0, 0x2442, 0x43af, 0xbfa8, 0x3cac, 0x4365, 0x2149, 0x41ff, 0x443f, 0x4190, 0xb0ba, 0x216f, 0xb225, 0xb248, 0xb0f5, 0xba3e, 0x0b19, 0x1bc6, 0x41a7, 0xb0d7, 0xb2dc, 0xb20b, 0x1da9, 0x432d, 0x4293, 0x4035, 0x01ab, 0x2725, 0xbf93, 0xb264, 0x42b6, 0xb074, 0xb2db, 0xb2b6, 0x1dd3, 0x40fc, 0xba52, 0x4301, 0x1e30, 0xba78, 0x413c, 0xbfab, 0xa981, 0x414a, 0x439f, 0x4015, 0x0769, 0xb23d, 0x43de, 0x2bb2, 0xba4a, 0x4261, 0x412c, 0xbf9c, 0x4135, 0xb2ce, 0x4224, 0x1fcf, 0x42bc, 0x18cd, 0x1b98, 0x2bdb, 0x3605, 0x43df, 0xa64c, 0xbf9a, 0x32a3, 0x43ec, 0xb2d2, 0x43a1, 0xba7d, 0x43ee, 0x0e94, 0x44c9, 0x01d6, 0x4140, 0x2921, 0x424d, 0xb0a4, 0x0caa, 0xbf85, 0x41d4, 0x19a8, 0x0dc9, 0x4161, 0x1b35, 0x43ee, 0xa171, 0x4477, 0x4385, 0xba16, 0x420f, 0x3013, 0x0573, 0x4281, 0x3bf9, 0x181a, 0xb0bd, 0xb046, 0x3254, 0x4654, 0x43fd, 0xba34, 0x42b0, 0x4215, 0xb022, 0x42cf, 0x4225, 0x4281, 0xbf0e, 0x4021, 0x4217, 0x4351, 0x4283, 0xb2d9, 0xb223, 0xbfe0, 0x4209, 0xbfb6, 0xbaeb, 0x078c, 0xb21e, 0x1bc3, 0x2e6e, 0x43d9, 0x41c8, 0x40e0, 0x4361, 0x4225, 0x4078, 0x37fa, 0xb065, 0x4390, 0x40bd, 0x418c, 0xbfcf, 0xba18, 0x40e6, 0x4039, 0xbf00, 0x1bf0, 0x441a, 0x4345, 0x42d6, 0x2c06, 0x238c, 0x4284, 0x413b, 0x4295, 0xb291, 0x21de, 0xaabe, 0xba14, 0x4253, 0x3c60, 0xb29b, 0xbf00, 0xbfbc, 0x4081, 0xb2d5, 0xb2f1, 0x4253, 0x04c1, 0xb055, 0x1f26, 0x1d48, 0xbf88, 0x401d, 0x2150, 0x40ff, 0x08dd, 0xbf45, 0x18ce, 0x4341, 0x4217, 0x40b9, 0x09c6, 0x43a1, 0xbac8, 0xb28f, 0x420c, 0x41ea, 0xb2f7, 0x0e48, 0xa96a, 0xb29e, 0x0631, 0x3cc9, 0x43cb, 0x3771, 0xb23c, 0x46f9, 0xa882, 0xb2d3, 0xba10, 0x4375, 0x17f2, 0x03ab, 0xb2da, 0x43b0, 0x43ef, 0xbfbb, 0x2f20, 0xb051, 0x1ffa, 0x42c9, 0x2d15, 0x2157, 0xa778, 0x432c, 0x421a, 0x4430, 0x43f6, 0x4271, 0x436f, 0xbf62, 0xbac5, 0x4288, 0x24a8, 0x4361, 0xad27, 0x433f, 0x3a4e, 0xba0e, 0x41ed, 0xb2b6, 0xb27a, 0xbf53, 0xa105, 0x1f58, 0xa2f2, 0x43ff, 0xb074, 0x1ac5, 0x421e, 0x4241, 0xb2b7, 0x2ad2, 0x40d9, 0xa5fd, 0x25d8, 0xb2b6, 0xa3c8, 0xb2bf, 0xb226, 0xba6d, 0x07ed, 0x43db, 0x4261, 0x40e7, 0x41a5, 0x4619, 0x3e15, 0xb25a, 0x427f, 0xbff0, 0x1a2f, 0xbfd6, 0xbac4, 0x42ba, 0x0922, 0x11a7, 0x439f, 0x44d0, 0x43ff, 0x3c72, 0xba33, 0x4386, 0x1f3a, 0x40c0, 0x418f, 0x411a, 0x4212, 0x4110, 0x428f, 0x447c, 0xb097, 0xbf77, 0x42b7, 0x0621, 0xbacb, 0x46ca, 0x43af, 0x01f4, 0xba26, 0x1815, 0x41e1, 0x4150, 0x4171, 0x43b4, 0xa937, 0x412f, 0x42df, 0x429a, 0x415e, 0x431c, 0xad19, 0x4282, 0x4073, 0xbf87, 0x43d0, 0xba54, 0x2db6, 0x4350, 0x4237, 0x4164, 0xbae5, 0xb22b, 0x0a33, 0x43f8, 0xbf33, 0x40f2, 0xb2bc, 0xb2a4, 0x40e6, 0x41c9, 0x326c, 0x41c8, 0x42e9, 0x42af, 0xba3b, 0x359d, 0x4109, 0x4028, 0xb269, 0xba16, 0xb2fc, 0x3acb, 0x4063, 0xbf16, 0x09a3, 0xb2d5, 0xba22, 0x4142, 0xbf8b, 0x1c3c, 0x3e0e, 0xb29c, 0x1164, 0x331c, 0x1ce8, 0xbff0, 0x43d7, 0x4137, 0x429b, 0x18a9, 0x4193, 0xb0cc, 0xba49, 0xba38, 0x411f, 0xb205, 0xbfa6, 0x4173, 0x4142, 0x43e0, 0x4089, 0x182e, 0xba01, 0x41ea, 0x3a41, 0x2930, 0x4025, 0x0594, 0x1556, 0x0b43, 0x46f2, 0x248c, 0x4340, 0xbf7b, 0x4257, 0x4328, 0xba28, 0x04e8, 0x42c7, 0x4207, 0x1d28, 0x40d1, 0x2167, 0x43a3, 0x284d, 0xbf05, 0xb2a2, 0x1605, 0xb276, 0x412d, 0x40f3, 0x378b, 0xba41, 0xbaf7, 0x42a3, 0x425d, 0x45b4, 0xbf9b, 0xa2c2, 0xba13, 0x410c, 0x45da, 0x4372, 0x4228, 0x0a0b, 0x4550, 0x4295, 0x06c1, 0xb2cd, 0x1487, 0x31fb, 0xbac1, 0xb200, 0xba13, 0x2c7f, 0x4449, 0x42f8, 0xbaf4, 0xb2b4, 0x24b1, 0x4166, 0xba16, 0xbf7c, 0x4171, 0x4311, 0x32bc, 0x4572, 0x3a43, 0x4690, 0xb2b3, 0xb037, 0x41c0, 0x4198, 0x4459, 0x41e3, 0x42e3, 0x2d4e, 0x05da, 0xb20a, 0x1cfd, 0xb28f, 0xb080, 0xa6d7, 0x4268, 0x243a, 0x43b9, 0xbf27, 0x14b0, 0x2410, 0xba40, 0x1f3a, 0x4008, 0xbfd9, 0x1b4b, 0x40a4, 0x2a6f, 0x14aa, 0x407b, 0xba5c, 0x41ec, 0x4245, 0x1b03, 0x4315, 0x4139, 0x2c74, 0xbfc0, 0x1806, 0x0ae6, 0xbae8, 0x3d2f, 0xb244, 0x0bac, 0xb245, 0x4304, 0xbf90, 0xbf9a, 0xb218, 0x408a, 0x42e1, 0x0fa0, 0xb06d, 0x43d5, 0x41b2, 0xb20e, 0x222f, 0xbfd3, 0x3289, 0xb2d2, 0x45e1, 0xb0ab, 0xbf8b, 0xba5c, 0x41a9, 0x41e2, 0x42ee, 0x446d, 0x41d9, 0x4362, 0x4265, 0xba7d, 0x43c5, 0x2cce, 0xb284, 0xb2fb, 0x40fa, 0x3ddf, 0x4188, 0xb251, 0xba1d, 0xbf26, 0x424b, 0x4566, 0x14d4, 0x3784, 0xbf70, 0x4225, 0xb22b, 0x1f12, 0x4022, 0xb061, 0x4145, 0x42d3, 0xb2c9, 0x2199, 0x42e5, 0x1a4d, 0x25c8, 0xbf56, 0x401e, 0x1c37, 0xba38, 0x1498, 0x4052, 0x4181, 0xba67, 0x41ab, 0x1bc7, 0x43d8, 0x4379, 0x42d0, 0x4211, 0x3a14, 0x00c0, 0x4068, 0x41dd, 0x4138, 0x40cb, 0xb21f, 0xb0c9, 0xba5c, 0x4004, 0xbfd5, 0x43bf, 0x4344, 0x06d0, 0x40ea, 0x2d6a, 0xbfe4, 0x42bc, 0x40a0, 0x40c6, 0xaa16, 0x42bd, 0x421a, 0xb2d7, 0x41ca, 0xb016, 0x43ef, 0xae2d, 0x4341, 0xb0c0, 0xba1b, 0x40c7, 0xb0cd, 0x3c18, 0x2ab4, 0x41d2, 0x0506, 0x2144, 0x183c, 0xba30, 0xb266, 0xb2e5, 0xbf90, 0xbf4a, 0xa979, 0x4300, 0xb26e, 0xbfd0, 0xba66, 0x13dc, 0xb28e, 0x1a28, 0x4158, 0x43ab, 0x4075, 0x40f2, 0x4593, 0x198f, 0x38c5, 0x4061, 0xbf23, 0x3e56, 0xa0ef, 0xba50, 0x4433, 0xba0b, 0xad1b, 0x1df6, 0xbad9, 0xb253, 0x40cc, 0x424c, 0x1a18, 0x1b36, 0x186b, 0xbfdf, 0x4167, 0x0075, 0x431c, 0x400c, 0x3e22, 0x434d, 0xba3b, 0x4388, 0x2f78, 0x407f, 0x4254, 0x1610, 0xba4b, 0x43f8, 0x4089, 0xb231, 0x4050, 0xb29d, 0x0c5a, 0x3afd, 0x42e8, 0x1c7a, 0xb241, 0x0cad, 0xb268, 0xbfc0, 0xbf6a, 0xb2cc, 0x37b0, 0x46eb, 0x4129, 0x1e5b, 0xb216, 0x0748, 0x41d1, 0x4308, 0x45ac, 0xb2a5, 0x43d5, 0x4049, 0x4076, 0xb28d, 0x2611, 0xb26d, 0xba2e, 0x34d4, 0xbafb, 0x3761, 0x417a, 0x4156, 0x4575, 0xb210, 0xbf4d, 0x42ba, 0xba26, 0xa039, 0x422c, 0x4357, 0xaee4, 0x41ab, 0x43eb, 0x1d12, 0x434c, 0x1818, 0x0a20, 0xb208, 0xb2a2, 0x4187, 0xba69, 0x43de, 0xa5ce, 0xbfac, 0xb0db, 0xb274, 0x4347, 0x4151, 0x1f64, 0x1c6b, 0x1db7, 0xbad5, 0x1e0a, 0x198e, 0x416f, 0xbacf, 0x42fe, 0x4173, 0x183b, 0x44f4, 0x4075, 0x43a0, 0xbaf0, 0xbf41, 0x1e71, 0x39a2, 0x1dc5, 0xb212, 0x0159, 0xbaea, 0x1fdd, 0x42d7, 0x4453, 0xb2dc, 0x0817, 0x4698, 0xba22, 0xbf58, 0x04db, 0xb216, 0x1b55, 0x42e8, 0xba7c, 0xbf88, 0xa1f0, 0xba12, 0xb21f, 0x2628, 0x4091, 0x4554, 0x0c86, 0x4098, 0xb0fb, 0x43e1, 0xbaed, 0xb2c1, 0x1f65, 0x4019, 0x4365, 0x0c81, 0x40dd, 0xaf49, 0x40f2, 0x40a3, 0xba56, 0x4378, 0xa9c0, 0xbf81, 0xba7f, 0x404b, 0xaec3, 0x3eec, 0xbadf, 0xacb7, 0x434a, 0xba10, 0xbaeb, 0x1ea3, 0xbf19, 0x413d, 0xb07a, 0x1d45, 0x42ff, 0xb08d, 0x1a6b, 0xa7c4, 0xa3d1, 0x40bb, 0xba7f, 0x460a, 0x45cb, 0x4490, 0xb097, 0x40f8, 0x00c0, 0x3d1a, 0x42bb, 0x30ae, 0x1c4f, 0xad13, 0xbafd, 0x40c3, 0x40e1, 0x4046, 0x434e, 0xbf3a, 0x185c, 0x409a, 0x26fc, 0x4770, 0xe7fe + ], + StartRegs = [0x6e009d47, 0x4404ee01, 0xc475426e, 0xc7651e4f, 0x99397e2c, 0xe2311d1e, 0x13b3b0d5, 0x94ee1dcc, 0x8a96e390, 0xfb8d253a, 0x3cd58f7e, 0xf938ad79, 0x61646a13, 0x14d0ae7f, 0x00000000, 0x100001f0 + ], + FinalRegs = [0x000000ae, 0x00000000, 0x14d0af83, 0x00000000, 0x00000000, 0xffff84af, 0x00000000, 0x14d0af84, 0x14d0b083, 0x00001344, 0x00000000, 0xf938ad79, 0x61646a13, 0x14d0addb, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0xb08d, 0xba58, 0x1eea, 0x4241, 0x439f, 0x27f1, 0x40eb, 0xb27f, 0x1bed, 0x407c, 0x4327, 0x41ea, 0x27fd, 0x410a, 0xbf6d, 0x4038, 0xa806, 0xba0f, 0xb265, 0xb22d, 0x1b44, 0x1c14, 0x431d, 0xaad5, 0x3ee7, 0x4034, 0x2d0b, 0x2dcc, 0x4334, 0x3e1c, 0xbf00, 0x11eb, 0xb2db, 0xa20c, 0xb058, 0xbfab, 0x4390, 0xb042, 0xb051, 0x2fcb, 0x415c, 0x0a57, 0x408c, 0x1d6e, 0xa072, 0xba55, 0x2581, 0x447b, 0x43a5, 0x440b, 0x1e63, 0xb2cc, 0xa334, 0xba69, 0xabd9, 0x1d2d, 0xbf62, 0x4140, 0x024e, 0xb2ac, 0x40ac, 0x4567, 0xba10, 0x1eb6, 0x3178, 0x0a5f, 0xb2bc, 0x40b0, 0xbfd4, 0x4285, 0x0c35, 0xb21e, 0xbacd, 0x1a41, 0x3ab5, 0x117a, 0x4469, 0xb2a3, 0x2dc3, 0x416d, 0x4541, 0xba7f, 0x1a93, 0x4389, 0xbf57, 0x301f, 0x4320, 0x28ae, 0x4020, 0xbac7, 0x1192, 0xbf45, 0x42ba, 0x43c3, 0x42b2, 0x0233, 0x1fa2, 0xb0b2, 0x41f2, 0xbaf6, 0xbf92, 0x0ec4, 0xb28d, 0x406b, 0xbff0, 0x403f, 0xba61, 0xb204, 0xbaeb, 0xba0b, 0x402a, 0x1ee1, 0x431b, 0x4331, 0x2513, 0x2108, 0xbf62, 0x4257, 0xa533, 0x3fd8, 0x42c7, 0x2195, 0xb2df, 0x42ab, 0x2830, 0x4373, 0xb286, 0x3afb, 0x42a2, 0x2e11, 0x4188, 0xb0c4, 0xba0e, 0x1d2e, 0x4158, 0xa422, 0x1dec, 0x417a, 0xb239, 0x43c5, 0x4074, 0xbf1c, 0x459e, 0x417c, 0x1b2b, 0xb2d6, 0xb296, 0x43ca, 0xbfd6, 0x449d, 0x23aa, 0x4198, 0xb267, 0xa248, 0xbf00, 0x4368, 0xb04a, 0x0734, 0x1ae6, 0x42d9, 0x414f, 0x1ed1, 0x4291, 0x1cde, 0xba3d, 0x4103, 0xa7df, 0x4586, 0xb257, 0x2302, 0x46a2, 0x43e6, 0xba41, 0x4128, 0xb2dc, 0x268d, 0xb235, 0xbfb7, 0x183a, 0x432d, 0xb0be, 0x40c4, 0x46c2, 0x42ae, 0x1cef, 0x16a2, 0x432a, 0x034c, 0xa8cc, 0x1aa9, 0x4635, 0x33d5, 0x42be, 0xb225, 0x4054, 0x1856, 0xb02b, 0x4683, 0xbfd6, 0x3dcb, 0x45ad, 0x4149, 0x42ec, 0xa5a3, 0xbfb0, 0xb04d, 0xb266, 0x405c, 0x40ef, 0xb23d, 0xb2fe, 0x432d, 0x41fe, 0x43ad, 0xb268, 0xa0d6, 0x41d9, 0x023a, 0xb291, 0x4397, 0xb2fb, 0x035e, 0xbf3f, 0x43aa, 0x4371, 0x3540, 0x4013, 0x42bc, 0xba4d, 0xb04e, 0x4156, 0x43be, 0x40b7, 0x40a9, 0x409c, 0x4288, 0x415e, 0x0f3e, 0xb009, 0xbfd7, 0xb0d2, 0x4263, 0x3228, 0x26dd, 0x1b78, 0x4170, 0x408e, 0xbfc7, 0x1ed8, 0x459d, 0x4199, 0x41af, 0x4340, 0x434a, 0x43a6, 0xbfc1, 0x2986, 0xbadc, 0x1d21, 0x00cc, 0x42e0, 0xae51, 0xa7dc, 0xb24e, 0x42fb, 0x1ba5, 0x1a40, 0x1ce0, 0x1e2b, 0x355f, 0x4357, 0x40c2, 0xba61, 0x4182, 0x4383, 0x430e, 0x1593, 0x41d6, 0xb0fa, 0x410f, 0xb21c, 0x4075, 0xbf8f, 0xb2c4, 0x4285, 0x4003, 0x1281, 0x414a, 0x408b, 0x403e, 0x2363, 0x412a, 0x430e, 0xbf45, 0x2282, 0xb24a, 0x330a, 0x4145, 0x4285, 0x43ed, 0x4031, 0x18ea, 0x4227, 0xbf80, 0x2468, 0xba52, 0x41ce, 0x4659, 0x4095, 0xb28c, 0xa9d4, 0x4439, 0x1b5b, 0x1349, 0x41d5, 0xbac3, 0xb09a, 0xba48, 0x4216, 0xbfa1, 0x0eec, 0x205a, 0x1cee, 0x44f9, 0x43c9, 0x0ee8, 0x0e50, 0x4258, 0x4029, 0x403f, 0xb226, 0x42bc, 0x1ba6, 0xbf48, 0x42a7, 0x40f2, 0x4260, 0x4499, 0xbfd3, 0x38e7, 0x40f2, 0x2087, 0x4189, 0x2243, 0x4111, 0x3fa8, 0x40bb, 0xb0be, 0x4026, 0x1b74, 0xbf0e, 0xb047, 0xb20e, 0x1961, 0x4241, 0x4063, 0xba4f, 0x40dd, 0x411b, 0xafbd, 0x39a3, 0x4254, 0x4262, 0x41e0, 0xbacd, 0x2264, 0x40bc, 0xa651, 0xb20c, 0xba0d, 0xb261, 0x4484, 0x432a, 0xbfdf, 0xb01a, 0xb20e, 0x2256, 0xbac1, 0x1ac5, 0xb2eb, 0xb2ee, 0x2927, 0x009a, 0x4291, 0x3575, 0xb21a, 0xb2d1, 0x1a67, 0xbaff, 0x4115, 0x42ef, 0xbf26, 0x0fa4, 0x415d, 0xb253, 0x010c, 0xb0aa, 0x2d7b, 0xb020, 0xb0da, 0xae00, 0x2f87, 0xb095, 0x0ca0, 0x42f8, 0x4037, 0x1c6f, 0x436b, 0x42b4, 0x1d3d, 0x3251, 0x43ff, 0x411a, 0x4394, 0xbf71, 0x1ac3, 0x42b2, 0x37b3, 0x3db9, 0x4388, 0xb080, 0x4314, 0x406c, 0x40ad, 0xb0ac, 0xb047, 0xbaff, 0x4091, 0x4372, 0xb29b, 0x4119, 0x45ab, 0x405d, 0xbf95, 0x3f6d, 0x1d73, 0x1896, 0x4074, 0xbad7, 0x211b, 0xa48f, 0x436d, 0x4181, 0x1e91, 0x1d3a, 0x42d0, 0xb25b, 0x43c6, 0xba43, 0xb284, 0xbfe0, 0x1eed, 0x0218, 0x40a2, 0x42a8, 0x40a7, 0x1c26, 0xbf00, 0xbf38, 0x447c, 0xbae0, 0x40d9, 0x1c9a, 0x42ec, 0x43f7, 0x386f, 0xbf59, 0x189b, 0x4037, 0x4323, 0xb281, 0xba6c, 0x1a55, 0xb2a2, 0x4218, 0x41d1, 0x4215, 0x383f, 0x429f, 0xbf89, 0x2d17, 0x46b9, 0xb0d1, 0xbf70, 0xba01, 0xbf2e, 0x1f89, 0x45a3, 0xb07c, 0xadd1, 0x42dd, 0x400c, 0x1adc, 0x43b9, 0x4072, 0x418c, 0x0a53, 0xad90, 0x1f17, 0x418f, 0xbacf, 0x1fc4, 0xa559, 0xba37, 0x1b9c, 0x461c, 0x42c8, 0x401e, 0x1971, 0x43b5, 0xba29, 0xa499, 0x4366, 0xbf7d, 0x1b05, 0xbadb, 0xbad4, 0x1b87, 0x43f7, 0x45b4, 0xa2ab, 0x43a8, 0xb08b, 0x18c0, 0xb2fe, 0x435d, 0x0129, 0x4200, 0x43fa, 0x33ac, 0xb2f5, 0x411c, 0x423b, 0x418e, 0x3876, 0xb22f, 0xbad0, 0x4464, 0xbf0e, 0x24f1, 0xb21c, 0x42dc, 0x42c1, 0x40f5, 0xa9ad, 0x4283, 0xb2a1, 0x432e, 0xbfb0, 0x428b, 0x42d3, 0x08fd, 0x0f6c, 0x437c, 0x0f32, 0x43ea, 0x0768, 0x4192, 0x4001, 0x01af, 0x22ab, 0x43df, 0x41d1, 0xa87c, 0x1cc1, 0x0e0e, 0xbf55, 0x1b17, 0x4265, 0xb0e6, 0x4359, 0x43ca, 0x43bd, 0x40ff, 0x4110, 0x1cf1, 0x4037, 0xb254, 0x1957, 0xbf41, 0x0fec, 0x45b3, 0xb21a, 0x41e8, 0xb21e, 0x417f, 0xaf50, 0x0c9d, 0x4395, 0x4122, 0x43ef, 0xb01c, 0x42fa, 0x41da, 0x43a3, 0x41c8, 0x3d6b, 0xb06d, 0x41c4, 0xba07, 0x391d, 0x4214, 0xb2f7, 0x44dc, 0xa011, 0x42fa, 0x4483, 0x1ddc, 0xbf7a, 0xb24d, 0x4270, 0x269c, 0xba2a, 0x435a, 0xb29d, 0x1ce6, 0x1852, 0x093e, 0xb0ed, 0xbaf1, 0x1d00, 0x02b5, 0x17ec, 0x42d8, 0xba16, 0x4624, 0x26af, 0x41b1, 0x1631, 0xb2fe, 0x4361, 0x1058, 0x41db, 0x1992, 0xbf1e, 0x41d8, 0x40c2, 0x43a3, 0x42ba, 0x41b7, 0x1d22, 0x43d5, 0xb213, 0x0005, 0x4004, 0x4171, 0x4038, 0x4364, 0x3420, 0x4135, 0x445c, 0x42f6, 0x4282, 0x4110, 0xbf5a, 0x3781, 0xb2f5, 0x40f8, 0xb2bc, 0xb264, 0x4591, 0x1812, 0xb06d, 0xba2f, 0xbf43, 0xa219, 0x46c0, 0xb2f3, 0x40f0, 0xbf5d, 0xbae7, 0xa3f0, 0x423e, 0xb246, 0x36e6, 0x402e, 0x400e, 0xb2af, 0xbfde, 0xba53, 0x085b, 0xab40, 0x43ac, 0x431a, 0x2778, 0x1da4, 0xb029, 0x14e4, 0x439f, 0x15ca, 0xa275, 0x1f63, 0x41ad, 0x3dee, 0xbf97, 0xbff0, 0x40e4, 0x448d, 0xb2d7, 0xbf8a, 0x41e5, 0xba2e, 0x2351, 0x1b2d, 0xbfe0, 0x4261, 0x414d, 0xbf55, 0xb28e, 0x1bb7, 0x439d, 0x41f4, 0x04a2, 0x040e, 0xb2a2, 0x4313, 0x1df1, 0xbac7, 0x41cc, 0x41d6, 0xbfb5, 0x432e, 0x42c0, 0x1cdd, 0x1ccb, 0xbf07, 0xb052, 0x1ead, 0x4281, 0x431d, 0x4365, 0x4206, 0x1b51, 0x43b9, 0x16d4, 0x0878, 0xbf89, 0x40d5, 0xa72b, 0xbad8, 0x3d59, 0x43b9, 0x42ff, 0x454d, 0xbae8, 0x11ea, 0xb2d7, 0x1455, 0xb2bc, 0xb29d, 0xba69, 0x461c, 0x19b1, 0xb282, 0xb054, 0x08a5, 0x45cc, 0x40ec, 0xbf9b, 0x0e9d, 0x1b02, 0x4099, 0x4080, 0x4322, 0x1313, 0x236c, 0x19cb, 0xa05e, 0x4350, 0x4299, 0xba45, 0x1afa, 0x1a45, 0x41f1, 0x058f, 0x18aa, 0x4190, 0xb0b6, 0xbfc8, 0xba6c, 0xb019, 0x4260, 0x40cb, 0x40e2, 0x1c47, 0xae93, 0x340d, 0x0e55, 0xba34, 0xaacd, 0xbfae, 0x416d, 0xb0ef, 0x4056, 0xba07, 0x41eb, 0x4490, 0xba61, 0x402c, 0x469a, 0x3dbe, 0x4015, 0x4560, 0x439c, 0x2497, 0x3ceb, 0x4196, 0xbf2d, 0x3df9, 0xb029, 0x1aa2, 0x1f04, 0xbfb3, 0xb006, 0xb001, 0x4067, 0x405f, 0xbaf8, 0xba17, 0xbf6f, 0xb2a3, 0x32e4, 0x27be, 0x4297, 0x3a02, 0x438b, 0x422b, 0xb0bc, 0x437e, 0x1f3a, 0xba0e, 0x40fa, 0xbf00, 0xa05d, 0x4052, 0x4302, 0x3ae8, 0xb207, 0xb01a, 0x4317, 0x440d, 0x44ca, 0xbad5, 0xa59a, 0x462c, 0xb22a, 0xa1e3, 0x46c4, 0x417a, 0xbf14, 0xbaec, 0xb296, 0x43c8, 0xb213, 0x2bbb, 0xb20d, 0x0e03, 0x43a6, 0x139c, 0xba1a, 0xacf0, 0x406e, 0x0198, 0xbf60, 0x400f, 0x428d, 0x40dc, 0x1881, 0xba24, 0x4222, 0xb0f8, 0x4380, 0x4093, 0x40a8, 0x3f1c, 0xbf49, 0xb2ae, 0xb238, 0x42d6, 0xb20c, 0x24d6, 0x1e47, 0xbf1b, 0x396a, 0x1a86, 0x4184, 0x402e, 0x3053, 0xb26c, 0x0b64, 0x4109, 0x46c2, 0x424b, 0xba29, 0x1c0e, 0x41bd, 0x4459, 0xb21f, 0xb20a, 0x43af, 0x424a, 0x432c, 0xb0db, 0x41c0, 0x4454, 0xbf88, 0x37f0, 0x4129, 0x4137, 0x436b, 0x44b8, 0x4043, 0x310e, 0xba09, 0x258e, 0x40a9, 0x4205, 0x4269, 0xba39, 0xb011, 0xbf00, 0x1e11, 0xba64, 0x1c52, 0x4113, 0x2228, 0xb2bf, 0xb058, 0x2bfe, 0x430f, 0x1d24, 0xbf0e, 0x43f1, 0x4113, 0xb268, 0x189e, 0x43a1, 0xb21a, 0x4193, 0xb287, 0x346a, 0x419b, 0x42a4, 0xad64, 0x41ac, 0x459d, 0x30a2, 0x2363, 0x40ad, 0x462f, 0x459c, 0x3579, 0x298b, 0x4105, 0xbfab, 0x3d00, 0x42dd, 0x4390, 0x1c75, 0x4156, 0x1cb5, 0x4349, 0x43f2, 0x45d6, 0x40f5, 0x4328, 0x41d2, 0x4165, 0xb00f, 0x4023, 0xba7b, 0xb0d4, 0x41f4, 0xbff0, 0x4085, 0x40a0, 0xbf78, 0x1892, 0xb067, 0x4055, 0x4094, 0x42d6, 0xba35, 0x42b0, 0x41e8, 0xac04, 0x42d6, 0x41aa, 0xba6c, 0xb273, 0x1c21, 0x40cf, 0x4492, 0x46d5, 0x1965, 0x4221, 0xb2c4, 0x43e7, 0x415a, 0x432f, 0x407f, 0xbf8c, 0xb283, 0x46a5, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd25485a3, 0x65f9ab76, 0x3fac21bc, 0xb38c4c4b, 0x9ae6ab78, 0xff30a4a6, 0x01b8bb18, 0x9f4c9ead, 0xa09d6abf, 0x3ea9cd0d, 0x60d7d350, 0x04406247, 0x923282a2, 0xf465cdc9, 0x00000000, 0x300001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00280000, 0xd7ff6025, 0x00000028, 0x00000000, 0x28280000, 0x00000028, 0x00000000, 0x55f83e89, 0x3eaa3cd7, 0x2df79e85, 0xb55ae7e5, 0x55f83e88, 0x00000000, 0x00000000, 0x400001d0 }, + Instructions = [0xb08d, 0xba58, 0x1eea, 0x4241, 0x439f, 0x27f1, 0x40eb, 0xb27f, 0x1bed, 0x407c, 0x4327, 0x41ea, 0x27fd, 0x410a, 0xbf6d, 0x4038, 0xa806, 0xba0f, 0xb265, 0xb22d, 0x1b44, 0x1c14, 0x431d, 0xaad5, 0x3ee7, 0x4034, 0x2d0b, 0x2dcc, 0x4334, 0x3e1c, 0xbf00, 0x11eb, 0xb2db, 0xa20c, 0xb058, 0xbfab, 0x4390, 0xb042, 0xb051, 0x2fcb, 0x415c, 0x0a57, 0x408c, 0x1d6e, 0xa072, 0xba55, 0x2581, 0x447b, 0x43a5, 0x440b, 0x1e63, 0xb2cc, 0xa334, 0xba69, 0xabd9, 0x1d2d, 0xbf62, 0x4140, 0x024e, 0xb2ac, 0x40ac, 0x4567, 0xba10, 0x1eb6, 0x3178, 0x0a5f, 0xb2bc, 0x40b0, 0xbfd4, 0x4285, 0x0c35, 0xb21e, 0xbacd, 0x1a41, 0x3ab5, 0x117a, 0x4469, 0xb2a3, 0x2dc3, 0x416d, 0x4541, 0xba7f, 0x1a93, 0x4389, 0xbf57, 0x301f, 0x4320, 0x28ae, 0x4020, 0xbac7, 0x1192, 0xbf45, 0x42ba, 0x43c3, 0x42b2, 0x0233, 0x1fa2, 0xb0b2, 0x41f2, 0xbaf6, 0xbf92, 0x0ec4, 0xb28d, 0x406b, 0xbff0, 0x403f, 0xba61, 0xb204, 0xbaeb, 0xba0b, 0x402a, 0x1ee1, 0x431b, 0x4331, 0x2513, 0x2108, 0xbf62, 0x4257, 0xa533, 0x3fd8, 0x42c7, 0x2195, 0xb2df, 0x42ab, 0x2830, 0x4373, 0xb286, 0x3afb, 0x42a2, 0x2e11, 0x4188, 0xb0c4, 0xba0e, 0x1d2e, 0x4158, 0xa422, 0x1dec, 0x417a, 0xb239, 0x43c5, 0x4074, 0xbf1c, 0x459e, 0x417c, 0x1b2b, 0xb2d6, 0xb296, 0x43ca, 0xbfd6, 0x449d, 0x23aa, 0x4198, 0xb267, 0xa248, 0xbf00, 0x4368, 0xb04a, 0x0734, 0x1ae6, 0x42d9, 0x414f, 0x1ed1, 0x4291, 0x1cde, 0xba3d, 0x4103, 0xa7df, 0x4586, 0xb257, 0x2302, 0x46a2, 0x43e6, 0xba41, 0x4128, 0xb2dc, 0x268d, 0xb235, 0xbfb7, 0x183a, 0x432d, 0xb0be, 0x40c4, 0x46c2, 0x42ae, 0x1cef, 0x16a2, 0x432a, 0x034c, 0xa8cc, 0x1aa9, 0x4635, 0x33d5, 0x42be, 0xb225, 0x4054, 0x1856, 0xb02b, 0x4683, 0xbfd6, 0x3dcb, 0x45ad, 0x4149, 0x42ec, 0xa5a3, 0xbfb0, 0xb04d, 0xb266, 0x405c, 0x40ef, 0xb23d, 0xb2fe, 0x432d, 0x41fe, 0x43ad, 0xb268, 0xa0d6, 0x41d9, 0x023a, 0xb291, 0x4397, 0xb2fb, 0x035e, 0xbf3f, 0x43aa, 0x4371, 0x3540, 0x4013, 0x42bc, 0xba4d, 0xb04e, 0x4156, 0x43be, 0x40b7, 0x40a9, 0x409c, 0x4288, 0x415e, 0x0f3e, 0xb009, 0xbfd7, 0xb0d2, 0x4263, 0x3228, 0x26dd, 0x1b78, 0x4170, 0x408e, 0xbfc7, 0x1ed8, 0x459d, 0x4199, 0x41af, 0x4340, 0x434a, 0x43a6, 0xbfc1, 0x2986, 0xbadc, 0x1d21, 0x00cc, 0x42e0, 0xae51, 0xa7dc, 0xb24e, 0x42fb, 0x1ba5, 0x1a40, 0x1ce0, 0x1e2b, 0x355f, 0x4357, 0x40c2, 0xba61, 0x4182, 0x4383, 0x430e, 0x1593, 0x41d6, 0xb0fa, 0x410f, 0xb21c, 0x4075, 0xbf8f, 0xb2c4, 0x4285, 0x4003, 0x1281, 0x414a, 0x408b, 0x403e, 0x2363, 0x412a, 0x430e, 0xbf45, 0x2282, 0xb24a, 0x330a, 0x4145, 0x4285, 0x43ed, 0x4031, 0x18ea, 0x4227, 0xbf80, 0x2468, 0xba52, 0x41ce, 0x4659, 0x4095, 0xb28c, 0xa9d4, 0x4439, 0x1b5b, 0x1349, 0x41d5, 0xbac3, 0xb09a, 0xba48, 0x4216, 0xbfa1, 0x0eec, 0x205a, 0x1cee, 0x44f9, 0x43c9, 0x0ee8, 0x0e50, 0x4258, 0x4029, 0x403f, 0xb226, 0x42bc, 0x1ba6, 0xbf48, 0x42a7, 0x40f2, 0x4260, 0x4499, 0xbfd3, 0x38e7, 0x40f2, 0x2087, 0x4189, 0x2243, 0x4111, 0x3fa8, 0x40bb, 0xb0be, 0x4026, 0x1b74, 0xbf0e, 0xb047, 0xb20e, 0x1961, 0x4241, 0x4063, 0xba4f, 0x40dd, 0x411b, 0xafbd, 0x39a3, 0x4254, 0x4262, 0x41e0, 0xbacd, 0x2264, 0x40bc, 0xa651, 0xb20c, 0xba0d, 0xb261, 0x4484, 0x432a, 0xbfdf, 0xb01a, 0xb20e, 0x2256, 0xbac1, 0x1ac5, 0xb2eb, 0xb2ee, 0x2927, 0x009a, 0x4291, 0x3575, 0xb21a, 0xb2d1, 0x1a67, 0xbaff, 0x4115, 0x42ef, 0xbf26, 0x0fa4, 0x415d, 0xb253, 0x010c, 0xb0aa, 0x2d7b, 0xb020, 0xb0da, 0xae00, 0x2f87, 0xb095, 0x0ca0, 0x42f8, 0x4037, 0x1c6f, 0x436b, 0x42b4, 0x1d3d, 0x3251, 0x43ff, 0x411a, 0x4394, 0xbf71, 0x1ac3, 0x42b2, 0x37b3, 0x3db9, 0x4388, 0xb080, 0x4314, 0x406c, 0x40ad, 0xb0ac, 0xb047, 0xbaff, 0x4091, 0x4372, 0xb29b, 0x4119, 0x45ab, 0x405d, 0xbf95, 0x3f6d, 0x1d73, 0x1896, 0x4074, 0xbad7, 0x211b, 0xa48f, 0x436d, 0x4181, 0x1e91, 0x1d3a, 0x42d0, 0xb25b, 0x43c6, 0xba43, 0xb284, 0xbfe0, 0x1eed, 0x0218, 0x40a2, 0x42a8, 0x40a7, 0x1c26, 0xbf00, 0xbf38, 0x447c, 0xbae0, 0x40d9, 0x1c9a, 0x42ec, 0x43f7, 0x386f, 0xbf59, 0x189b, 0x4037, 0x4323, 0xb281, 0xba6c, 0x1a55, 0xb2a2, 0x4218, 0x41d1, 0x4215, 0x383f, 0x429f, 0xbf89, 0x2d17, 0x46b9, 0xb0d1, 0xbf70, 0xba01, 0xbf2e, 0x1f89, 0x45a3, 0xb07c, 0xadd1, 0x42dd, 0x400c, 0x1adc, 0x43b9, 0x4072, 0x418c, 0x0a53, 0xad90, 0x1f17, 0x418f, 0xbacf, 0x1fc4, 0xa559, 0xba37, 0x1b9c, 0x461c, 0x42c8, 0x401e, 0x1971, 0x43b5, 0xba29, 0xa499, 0x4366, 0xbf7d, 0x1b05, 0xbadb, 0xbad4, 0x1b87, 0x43f7, 0x45b4, 0xa2ab, 0x43a8, 0xb08b, 0x18c0, 0xb2fe, 0x435d, 0x0129, 0x4200, 0x43fa, 0x33ac, 0xb2f5, 0x411c, 0x423b, 0x418e, 0x3876, 0xb22f, 0xbad0, 0x4464, 0xbf0e, 0x24f1, 0xb21c, 0x42dc, 0x42c1, 0x40f5, 0xa9ad, 0x4283, 0xb2a1, 0x432e, 0xbfb0, 0x428b, 0x42d3, 0x08fd, 0x0f6c, 0x437c, 0x0f32, 0x43ea, 0x0768, 0x4192, 0x4001, 0x01af, 0x22ab, 0x43df, 0x41d1, 0xa87c, 0x1cc1, 0x0e0e, 0xbf55, 0x1b17, 0x4265, 0xb0e6, 0x4359, 0x43ca, 0x43bd, 0x40ff, 0x4110, 0x1cf1, 0x4037, 0xb254, 0x1957, 0xbf41, 0x0fec, 0x45b3, 0xb21a, 0x41e8, 0xb21e, 0x417f, 0xaf50, 0x0c9d, 0x4395, 0x4122, 0x43ef, 0xb01c, 0x42fa, 0x41da, 0x43a3, 0x41c8, 0x3d6b, 0xb06d, 0x41c4, 0xba07, 0x391d, 0x4214, 0xb2f7, 0x44dc, 0xa011, 0x42fa, 0x4483, 0x1ddc, 0xbf7a, 0xb24d, 0x4270, 0x269c, 0xba2a, 0x435a, 0xb29d, 0x1ce6, 0x1852, 0x093e, 0xb0ed, 0xbaf1, 0x1d00, 0x02b5, 0x17ec, 0x42d8, 0xba16, 0x4624, 0x26af, 0x41b1, 0x1631, 0xb2fe, 0x4361, 0x1058, 0x41db, 0x1992, 0xbf1e, 0x41d8, 0x40c2, 0x43a3, 0x42ba, 0x41b7, 0x1d22, 0x43d5, 0xb213, 0x0005, 0x4004, 0x4171, 0x4038, 0x4364, 0x3420, 0x4135, 0x445c, 0x42f6, 0x4282, 0x4110, 0xbf5a, 0x3781, 0xb2f5, 0x40f8, 0xb2bc, 0xb264, 0x4591, 0x1812, 0xb06d, 0xba2f, 0xbf43, 0xa219, 0x46c0, 0xb2f3, 0x40f0, 0xbf5d, 0xbae7, 0xa3f0, 0x423e, 0xb246, 0x36e6, 0x402e, 0x400e, 0xb2af, 0xbfde, 0xba53, 0x085b, 0xab40, 0x43ac, 0x431a, 0x2778, 0x1da4, 0xb029, 0x14e4, 0x439f, 0x15ca, 0xa275, 0x1f63, 0x41ad, 0x3dee, 0xbf97, 0xbff0, 0x40e4, 0x448d, 0xb2d7, 0xbf8a, 0x41e5, 0xba2e, 0x2351, 0x1b2d, 0xbfe0, 0x4261, 0x414d, 0xbf55, 0xb28e, 0x1bb7, 0x439d, 0x41f4, 0x04a2, 0x040e, 0xb2a2, 0x4313, 0x1df1, 0xbac7, 0x41cc, 0x41d6, 0xbfb5, 0x432e, 0x42c0, 0x1cdd, 0x1ccb, 0xbf07, 0xb052, 0x1ead, 0x4281, 0x431d, 0x4365, 0x4206, 0x1b51, 0x43b9, 0x16d4, 0x0878, 0xbf89, 0x40d5, 0xa72b, 0xbad8, 0x3d59, 0x43b9, 0x42ff, 0x454d, 0xbae8, 0x11ea, 0xb2d7, 0x1455, 0xb2bc, 0xb29d, 0xba69, 0x461c, 0x19b1, 0xb282, 0xb054, 0x08a5, 0x45cc, 0x40ec, 0xbf9b, 0x0e9d, 0x1b02, 0x4099, 0x4080, 0x4322, 0x1313, 0x236c, 0x19cb, 0xa05e, 0x4350, 0x4299, 0xba45, 0x1afa, 0x1a45, 0x41f1, 0x058f, 0x18aa, 0x4190, 0xb0b6, 0xbfc8, 0xba6c, 0xb019, 0x4260, 0x40cb, 0x40e2, 0x1c47, 0xae93, 0x340d, 0x0e55, 0xba34, 0xaacd, 0xbfae, 0x416d, 0xb0ef, 0x4056, 0xba07, 0x41eb, 0x4490, 0xba61, 0x402c, 0x469a, 0x3dbe, 0x4015, 0x4560, 0x439c, 0x2497, 0x3ceb, 0x4196, 0xbf2d, 0x3df9, 0xb029, 0x1aa2, 0x1f04, 0xbfb3, 0xb006, 0xb001, 0x4067, 0x405f, 0xbaf8, 0xba17, 0xbf6f, 0xb2a3, 0x32e4, 0x27be, 0x4297, 0x3a02, 0x438b, 0x422b, 0xb0bc, 0x437e, 0x1f3a, 0xba0e, 0x40fa, 0xbf00, 0xa05d, 0x4052, 0x4302, 0x3ae8, 0xb207, 0xb01a, 0x4317, 0x440d, 0x44ca, 0xbad5, 0xa59a, 0x462c, 0xb22a, 0xa1e3, 0x46c4, 0x417a, 0xbf14, 0xbaec, 0xb296, 0x43c8, 0xb213, 0x2bbb, 0xb20d, 0x0e03, 0x43a6, 0x139c, 0xba1a, 0xacf0, 0x406e, 0x0198, 0xbf60, 0x400f, 0x428d, 0x40dc, 0x1881, 0xba24, 0x4222, 0xb0f8, 0x4380, 0x4093, 0x40a8, 0x3f1c, 0xbf49, 0xb2ae, 0xb238, 0x42d6, 0xb20c, 0x24d6, 0x1e47, 0xbf1b, 0x396a, 0x1a86, 0x4184, 0x402e, 0x3053, 0xb26c, 0x0b64, 0x4109, 0x46c2, 0x424b, 0xba29, 0x1c0e, 0x41bd, 0x4459, 0xb21f, 0xb20a, 0x43af, 0x424a, 0x432c, 0xb0db, 0x41c0, 0x4454, 0xbf88, 0x37f0, 0x4129, 0x4137, 0x436b, 0x44b8, 0x4043, 0x310e, 0xba09, 0x258e, 0x40a9, 0x4205, 0x4269, 0xba39, 0xb011, 0xbf00, 0x1e11, 0xba64, 0x1c52, 0x4113, 0x2228, 0xb2bf, 0xb058, 0x2bfe, 0x430f, 0x1d24, 0xbf0e, 0x43f1, 0x4113, 0xb268, 0x189e, 0x43a1, 0xb21a, 0x4193, 0xb287, 0x346a, 0x419b, 0x42a4, 0xad64, 0x41ac, 0x459d, 0x30a2, 0x2363, 0x40ad, 0x462f, 0x459c, 0x3579, 0x298b, 0x4105, 0xbfab, 0x3d00, 0x42dd, 0x4390, 0x1c75, 0x4156, 0x1cb5, 0x4349, 0x43f2, 0x45d6, 0x40f5, 0x4328, 0x41d2, 0x4165, 0xb00f, 0x4023, 0xba7b, 0xb0d4, 0x41f4, 0xbff0, 0x4085, 0x40a0, 0xbf78, 0x1892, 0xb067, 0x4055, 0x4094, 0x42d6, 0xba35, 0x42b0, 0x41e8, 0xac04, 0x42d6, 0x41aa, 0xba6c, 0xb273, 0x1c21, 0x40cf, 0x4492, 0x46d5, 0x1965, 0x4221, 0xb2c4, 0x43e7, 0x415a, 0x432f, 0x407f, 0xbf8c, 0xb283, 0x46a5, 0x4770, 0xe7fe + ], + StartRegs = [0xd25485a3, 0x65f9ab76, 0x3fac21bc, 0xb38c4c4b, 0x9ae6ab78, 0xff30a4a6, 0x01b8bb18, 0x9f4c9ead, 0xa09d6abf, 0x3ea9cd0d, 0x60d7d350, 0x04406247, 0x923282a2, 0xf465cdc9, 0x00000000, 0x300001f0 + ], + FinalRegs = [0x00000000, 0x00280000, 0xd7ff6025, 0x00000028, 0x00000000, 0x28280000, 0x00000028, 0x00000000, 0x55f83e89, 0x3eaa3cd7, 0x2df79e85, 0xb55ae7e5, 0x55f83e88, 0x00000000, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0xbad5, 0x1d59, 0xa4c4, 0x1a8d, 0x1b22, 0xa8c9, 0x45cc, 0x422b, 0x3e2e, 0x4264, 0x4080, 0x3475, 0x4121, 0x41b2, 0x4344, 0xa434, 0x45f0, 0x1e00, 0xbf34, 0x4409, 0x4310, 0x43ce, 0x43ed, 0x4044, 0x4019, 0x41dc, 0x1ea8, 0x4076, 0xbaf0, 0x42b2, 0x41ce, 0x406e, 0xb2e7, 0xbfc0, 0xb202, 0x1d55, 0xbf74, 0x42b3, 0xa20f, 0x41e6, 0x1551, 0x29e3, 0x417b, 0x4037, 0x2314, 0x4311, 0x4163, 0xb2d6, 0x416c, 0xadaa, 0xb258, 0x3667, 0xbfcd, 0x42b1, 0x42ab, 0xbfb0, 0x4591, 0xa1d1, 0xb05f, 0x442c, 0x1b90, 0x42c0, 0xb29a, 0x43e5, 0xb283, 0xba53, 0xb228, 0xbad6, 0x4031, 0x185e, 0xba00, 0xb2d1, 0x4298, 0xb2c9, 0xbfbd, 0x4229, 0xb297, 0xb016, 0x42a1, 0x4022, 0x120d, 0xba0f, 0x1dce, 0x435a, 0x4039, 0x183a, 0xbf70, 0x3a82, 0xa4d5, 0x250f, 0x4341, 0x413b, 0x4209, 0x467a, 0xbfa0, 0x1dc9, 0xbad6, 0x4106, 0x43dd, 0xbf8b, 0x45a0, 0x4253, 0x44d5, 0x1d62, 0x4128, 0xaaf0, 0x40be, 0x4373, 0xba76, 0x4314, 0xbf35, 0x400c, 0x019c, 0x43aa, 0x42dd, 0xba6c, 0xb23f, 0x4437, 0xbfd8, 0x4419, 0x2e1a, 0x4270, 0x429f, 0xba18, 0x2478, 0x3fa1, 0x40b6, 0x4130, 0x43c6, 0xbf9f, 0x401f, 0x01ae, 0x4264, 0xb264, 0x41db, 0xbac5, 0xbfd6, 0x4678, 0xb20e, 0x4244, 0x44c5, 0x1729, 0xba6d, 0x418b, 0x46a2, 0xb0bf, 0x38e1, 0x4386, 0xba49, 0x4387, 0x1dd4, 0x1e09, 0x40dd, 0x45e6, 0x40c6, 0xbf81, 0x05a7, 0xb2a8, 0xba43, 0x0104, 0x0c94, 0x42d5, 0x4153, 0x407a, 0xbfb6, 0x406f, 0x4146, 0x1c98, 0x43cf, 0x40c8, 0x40bf, 0x432b, 0x1ab7, 0xbf0b, 0x0f94, 0x42bb, 0xba05, 0xba0f, 0x43dd, 0x40d1, 0xb28d, 0x1d03, 0xb02f, 0x43f1, 0x430f, 0xbf19, 0xb05c, 0xba78, 0x423d, 0x41d4, 0x44d0, 0xa90f, 0x120b, 0x4649, 0x40b5, 0x3754, 0x42d1, 0x40a8, 0x2a90, 0xb20b, 0x41e6, 0xb066, 0xb290, 0x4188, 0x40c2, 0xb273, 0xbf41, 0x00f2, 0x427b, 0x1c07, 0x4654, 0xab5e, 0x03e3, 0x441a, 0x40c2, 0x4273, 0xb0a5, 0xba56, 0x45bd, 0x42a5, 0x4369, 0x049c, 0x23de, 0xbf76, 0x1a8a, 0x424c, 0xbff0, 0xbfc0, 0x1e0a, 0xb2c1, 0x4238, 0x4388, 0x4485, 0x34b5, 0xa687, 0x4235, 0xb295, 0xb0a0, 0x4175, 0x4280, 0xadc3, 0xa75e, 0x467c, 0x4169, 0xb20c, 0x42cb, 0xbf12, 0x1ad9, 0x1acf, 0x46e8, 0xba62, 0x4180, 0x1e87, 0x4028, 0x093f, 0x1810, 0xb015, 0x42d2, 0x1ba6, 0xbf04, 0xb0d5, 0x4156, 0x43e8, 0x4246, 0xbac6, 0x4204, 0xb272, 0xba2f, 0xb24e, 0x422c, 0x40e9, 0x43ec, 0x4019, 0x41a1, 0x1cad, 0x007a, 0x41b7, 0x4231, 0xbfc1, 0x3779, 0x1010, 0xbafe, 0x4311, 0x45b9, 0x469a, 0x41fe, 0xb205, 0x17e7, 0x0096, 0x166f, 0x4090, 0xb260, 0x4241, 0xb0ad, 0x1c8e, 0xbf4f, 0xb2a7, 0x432d, 0xba6a, 0x4358, 0xb26d, 0x429c, 0x40c8, 0x1de3, 0x244f, 0xa9e5, 0x412a, 0x1bff, 0x40b1, 0xb2c6, 0x469b, 0x0d3c, 0x1ef1, 0xbfb6, 0xa11f, 0x4011, 0xb298, 0x0847, 0x400c, 0xb255, 0xb0a0, 0xbae9, 0xba33, 0x413e, 0xb2a9, 0x40c4, 0x199a, 0xb2b8, 0xbf8b, 0x437d, 0x18dc, 0x19c1, 0x43ee, 0x0ce7, 0x0e99, 0x287c, 0x2f2a, 0x1e51, 0xbf90, 0xb217, 0x41a9, 0xb230, 0xb02b, 0xbf7b, 0x4319, 0x12d0, 0x4279, 0xba78, 0x1950, 0xbf90, 0x0410, 0xb08d, 0x260b, 0xbfa8, 0x3d18, 0x4338, 0x4185, 0x4061, 0x4042, 0x41ad, 0xbaef, 0x419e, 0x194f, 0x249b, 0xb2c1, 0xbf19, 0x1f07, 0x4370, 0x1cd7, 0x439a, 0xab32, 0x4256, 0xbf2f, 0x43cb, 0x412b, 0x41a7, 0x1b51, 0xb20f, 0xb03a, 0x4000, 0x3858, 0x3170, 0x2475, 0xae13, 0xb231, 0x4498, 0xbf9a, 0x45ad, 0x404e, 0x2df8, 0xb25b, 0x3db3, 0xa424, 0xb211, 0xb208, 0x43fb, 0x4241, 0x1937, 0x1c73, 0x40f4, 0x0729, 0x41cd, 0x2eff, 0x4288, 0xb0cc, 0x1be4, 0xbafc, 0xbf21, 0x1150, 0xba5b, 0x41ec, 0x1e5d, 0x4324, 0x430d, 0x189e, 0x416b, 0xb0ed, 0x1958, 0x43c4, 0x439c, 0x40aa, 0x42e3, 0xba03, 0x4255, 0x4014, 0x4583, 0xb2b2, 0xb278, 0xb233, 0x2f6f, 0x31e0, 0x41bb, 0xbfce, 0x439f, 0xa48e, 0x42cf, 0x434c, 0xb25d, 0x4317, 0xb281, 0x439b, 0x4098, 0x4201, 0xae51, 0x4281, 0x43c0, 0x417b, 0xb014, 0x4561, 0xba03, 0xb26b, 0x1e97, 0xb2f8, 0x4131, 0x4191, 0x40fe, 0xbf78, 0x227e, 0x4692, 0xba49, 0x4175, 0x4495, 0xb252, 0xba21, 0x43d7, 0x4317, 0x214c, 0xba01, 0x46d9, 0x41a8, 0x4023, 0xbf4b, 0x28eb, 0xb055, 0x431e, 0x40cb, 0x40d2, 0x1bce, 0x1a62, 0x4004, 0x438d, 0x1f3c, 0xb20b, 0x4025, 0x410f, 0xa075, 0xb262, 0xbf37, 0xbade, 0xb264, 0x1a2d, 0x19a6, 0x1811, 0xbfdd, 0xbad4, 0x4331, 0x2bc6, 0x42d3, 0x42ff, 0x23d1, 0x442b, 0x28f2, 0x1597, 0xbfa5, 0xb0ad, 0x41fc, 0x446c, 0xba71, 0x45d1, 0x24a8, 0x1f6f, 0xba30, 0x4228, 0x40dc, 0x402e, 0x43d7, 0xae6c, 0x403b, 0x4027, 0x4391, 0xbf69, 0xb2c4, 0x45ec, 0xba6a, 0x406c, 0x46a5, 0xba6a, 0xb2dd, 0xbad4, 0x41e5, 0x40a9, 0x41e5, 0x1abf, 0xbf74, 0x1c83, 0x42d6, 0x43d1, 0xba0f, 0x43f6, 0x042d, 0x4341, 0x42b2, 0xbf14, 0x1fe1, 0x4275, 0x4128, 0x401c, 0xb20d, 0x02b4, 0x4493, 0x41ac, 0xb21a, 0x417f, 0x4283, 0x2bd4, 0x40a7, 0xb293, 0x4028, 0xb2d5, 0xbac8, 0xb250, 0xbf2f, 0x426d, 0x424e, 0x433a, 0x1e87, 0x4352, 0xb295, 0xbadd, 0x4369, 0x05ca, 0x415d, 0xb215, 0x4247, 0x4220, 0x3a43, 0x0025, 0x4166, 0xbac9, 0xba2a, 0x4084, 0x0d4f, 0xb07c, 0x43b7, 0x45e5, 0x42de, 0x401b, 0x4382, 0xbf6b, 0x45ae, 0x279c, 0x4117, 0x4138, 0x0998, 0x425f, 0xbf24, 0x08b8, 0xb016, 0x1f7d, 0x2512, 0x19cd, 0xba6d, 0x42d8, 0xba0c, 0x30ef, 0x4407, 0x2342, 0x0c6e, 0x432c, 0x41d3, 0x13e8, 0x1350, 0x363a, 0xb072, 0x3631, 0xbf6f, 0x1a7d, 0x2ed0, 0x43d7, 0x28be, 0x3dc7, 0x15f5, 0x4118, 0xba6c, 0x4604, 0xa826, 0x423a, 0xb2bc, 0xb201, 0xbf0d, 0x41bc, 0x1afd, 0xb061, 0x3a1d, 0x4126, 0x42fe, 0x2aa7, 0x4165, 0xba5b, 0xb078, 0xbfc0, 0x4351, 0x42e4, 0x4183, 0x4211, 0x4651, 0x40b3, 0x4328, 0x43d0, 0x207b, 0xb24b, 0x1018, 0xae51, 0x18f3, 0x4037, 0xba1d, 0x1529, 0x3c02, 0xbf14, 0x0859, 0x40a1, 0x1daf, 0xb296, 0xb0b8, 0x2b0a, 0x4221, 0xbacc, 0x185d, 0x402d, 0x18ff, 0x42a7, 0xb28b, 0xbf6e, 0x43af, 0x419c, 0x3a08, 0x4230, 0x2623, 0x1903, 0x0462, 0x0149, 0xba1a, 0x1eba, 0x436d, 0xb0b8, 0x40df, 0xb279, 0xba60, 0x44f1, 0xba16, 0x4085, 0xb2c5, 0x1e6e, 0x40e0, 0xbf8c, 0x422a, 0x42ea, 0x42fe, 0x4544, 0xbf53, 0x430b, 0x3121, 0x4012, 0x4291, 0xb007, 0xb223, 0xb2a1, 0xb2ce, 0x09bd, 0x1d76, 0x4171, 0x40d3, 0x08b5, 0xacc9, 0x2e88, 0xb2dd, 0xb2e7, 0x42f5, 0x408d, 0x41a0, 0x41ef, 0x1c3f, 0x464e, 0x2766, 0xbf4a, 0x4087, 0xafb7, 0x461c, 0x43d1, 0xa153, 0x34a3, 0xbfa0, 0xba05, 0x0f87, 0x4095, 0xbfbf, 0x4252, 0x4160, 0x41d3, 0xb071, 0x09c2, 0xb05b, 0x4368, 0x40ab, 0x07d6, 0x45dd, 0xb047, 0x43b8, 0x42f8, 0x23c1, 0x19d1, 0x3c53, 0x42a3, 0x2e39, 0x4208, 0x04ed, 0x411c, 0x29ec, 0x43ac, 0xa6b8, 0x403b, 0xba30, 0xbf11, 0xb2fb, 0x1810, 0x05a6, 0x40b2, 0xa664, 0xbfaa, 0x434c, 0xb280, 0x2bd7, 0x22b9, 0x42ca, 0x0fe6, 0x2a39, 0xa493, 0x40ce, 0x424a, 0xba10, 0x42e2, 0xa50a, 0x43b9, 0x456b, 0xb2a1, 0x432b, 0x43ee, 0x05a5, 0x4142, 0x4417, 0x1ccf, 0x40a5, 0x43d8, 0xbfa1, 0xb268, 0x4092, 0xb20f, 0x401f, 0x40ea, 0x1b3d, 0xbaed, 0x0264, 0x0b78, 0x42fb, 0x0836, 0xb2ed, 0x424a, 0x40d1, 0x2cfd, 0x101f, 0x4293, 0x46a9, 0x46cb, 0xbfa3, 0x4058, 0x41d6, 0x40c1, 0xba3a, 0x45dc, 0x11ed, 0x3aa0, 0x468d, 0xbf80, 0xa4dc, 0x1936, 0x1766, 0x280e, 0x1ae8, 0xbfde, 0x33a9, 0x17d0, 0xa82c, 0xba1a, 0x43d1, 0x4310, 0x41b3, 0xb21a, 0x4270, 0xb285, 0x4055, 0xba60, 0x1c37, 0x224c, 0x43ce, 0x43c3, 0x234e, 0x43ca, 0xb213, 0xb29c, 0x4294, 0xba5c, 0xb2b3, 0x2d4b, 0xa6db, 0xbf1e, 0x4240, 0xa2f2, 0x138e, 0x1d24, 0x4235, 0x4569, 0x432e, 0x41ef, 0xa704, 0x25b2, 0x13bc, 0xb0eb, 0x41e4, 0x401e, 0xa704, 0x41ad, 0x41dd, 0x4298, 0x1b03, 0x423c, 0xb248, 0x405c, 0x0b80, 0x40c7, 0xba75, 0x43b0, 0xbfb6, 0x10b0, 0x41ec, 0xa1b4, 0xb26b, 0xb295, 0x412c, 0x44e5, 0x2796, 0x2eb7, 0x4165, 0xbfc9, 0x42b4, 0xac49, 0x40da, 0xba7f, 0x40c1, 0xbf00, 0x4376, 0x0fd1, 0x1a0f, 0x4356, 0x41ac, 0xb00e, 0x45f3, 0x2458, 0x333c, 0x0171, 0xb273, 0x4304, 0xbfe2, 0x45cb, 0xa2d9, 0x40d8, 0x4348, 0x1760, 0x412f, 0x42d4, 0x40a9, 0x424f, 0xbf18, 0xb07a, 0x40b1, 0x00cf, 0x43fa, 0x4299, 0x4367, 0x222f, 0x1212, 0x4401, 0x4388, 0x2451, 0xb29b, 0x4319, 0xb210, 0x420f, 0x40fd, 0x45b0, 0x32f6, 0x43b9, 0x1ca3, 0x1863, 0xbfac, 0xb083, 0x4385, 0x42d0, 0x422c, 0x1fe8, 0x2eaa, 0x1075, 0xb2a0, 0xbf0b, 0x42d9, 0xa9de, 0xb093, 0x42ce, 0x41eb, 0x40a4, 0x4242, 0x43df, 0xb254, 0xa2a0, 0x421b, 0x4305, 0xbf55, 0x10f1, 0xabe9, 0x41fb, 0x4333, 0x2b35, 0x405e, 0x1e82, 0x2a61, 0xbf46, 0x4234, 0xb26c, 0x1935, 0xbad9, 0x4164, 0xb241, 0x43fe, 0xb25b, 0x1df3, 0x4304, 0x1a0c, 0xba35, 0xbf0e, 0x336a, 0x3265, 0x068a, 0xba61, 0x06fd, 0x1c50, 0xb2c0, 0x4124, 0x4418, 0x41c6, 0xabd2, 0x429d, 0xba40, 0x4225, 0xb0e6, 0xb2c8, 0x4148, 0xb2b2, 0x400d, 0x1bc1, 0x24ff, 0xbf6c, 0x43f2, 0xba30, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xb95fc095, 0x46c9af8c, 0x44f999c1, 0xf75c725c, 0xeef9897b, 0x7583419d, 0xd7d5f784, 0xf2f60e6f, 0xa9e0afa9, 0x25abe41c, 0x5498383c, 0x7f430b81, 0xac6b7408, 0xf3f13b36, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x00401400, 0x00000052, 0x00004000, 0xac6b75d0, 0x000000ff, 0x00000000, 0x00144000, 0xffffffae, 0x2206c8a0, 0x00000000, 0x0000007e, 0x00000000, 0xac6b7408, 0xac6b70f0, 0x00000000, 0x000001d0 }, + Instructions = [0xbad5, 0x1d59, 0xa4c4, 0x1a8d, 0x1b22, 0xa8c9, 0x45cc, 0x422b, 0x3e2e, 0x4264, 0x4080, 0x3475, 0x4121, 0x41b2, 0x4344, 0xa434, 0x45f0, 0x1e00, 0xbf34, 0x4409, 0x4310, 0x43ce, 0x43ed, 0x4044, 0x4019, 0x41dc, 0x1ea8, 0x4076, 0xbaf0, 0x42b2, 0x41ce, 0x406e, 0xb2e7, 0xbfc0, 0xb202, 0x1d55, 0xbf74, 0x42b3, 0xa20f, 0x41e6, 0x1551, 0x29e3, 0x417b, 0x4037, 0x2314, 0x4311, 0x4163, 0xb2d6, 0x416c, 0xadaa, 0xb258, 0x3667, 0xbfcd, 0x42b1, 0x42ab, 0xbfb0, 0x4591, 0xa1d1, 0xb05f, 0x442c, 0x1b90, 0x42c0, 0xb29a, 0x43e5, 0xb283, 0xba53, 0xb228, 0xbad6, 0x4031, 0x185e, 0xba00, 0xb2d1, 0x4298, 0xb2c9, 0xbfbd, 0x4229, 0xb297, 0xb016, 0x42a1, 0x4022, 0x120d, 0xba0f, 0x1dce, 0x435a, 0x4039, 0x183a, 0xbf70, 0x3a82, 0xa4d5, 0x250f, 0x4341, 0x413b, 0x4209, 0x467a, 0xbfa0, 0x1dc9, 0xbad6, 0x4106, 0x43dd, 0xbf8b, 0x45a0, 0x4253, 0x44d5, 0x1d62, 0x4128, 0xaaf0, 0x40be, 0x4373, 0xba76, 0x4314, 0xbf35, 0x400c, 0x019c, 0x43aa, 0x42dd, 0xba6c, 0xb23f, 0x4437, 0xbfd8, 0x4419, 0x2e1a, 0x4270, 0x429f, 0xba18, 0x2478, 0x3fa1, 0x40b6, 0x4130, 0x43c6, 0xbf9f, 0x401f, 0x01ae, 0x4264, 0xb264, 0x41db, 0xbac5, 0xbfd6, 0x4678, 0xb20e, 0x4244, 0x44c5, 0x1729, 0xba6d, 0x418b, 0x46a2, 0xb0bf, 0x38e1, 0x4386, 0xba49, 0x4387, 0x1dd4, 0x1e09, 0x40dd, 0x45e6, 0x40c6, 0xbf81, 0x05a7, 0xb2a8, 0xba43, 0x0104, 0x0c94, 0x42d5, 0x4153, 0x407a, 0xbfb6, 0x406f, 0x4146, 0x1c98, 0x43cf, 0x40c8, 0x40bf, 0x432b, 0x1ab7, 0xbf0b, 0x0f94, 0x42bb, 0xba05, 0xba0f, 0x43dd, 0x40d1, 0xb28d, 0x1d03, 0xb02f, 0x43f1, 0x430f, 0xbf19, 0xb05c, 0xba78, 0x423d, 0x41d4, 0x44d0, 0xa90f, 0x120b, 0x4649, 0x40b5, 0x3754, 0x42d1, 0x40a8, 0x2a90, 0xb20b, 0x41e6, 0xb066, 0xb290, 0x4188, 0x40c2, 0xb273, 0xbf41, 0x00f2, 0x427b, 0x1c07, 0x4654, 0xab5e, 0x03e3, 0x441a, 0x40c2, 0x4273, 0xb0a5, 0xba56, 0x45bd, 0x42a5, 0x4369, 0x049c, 0x23de, 0xbf76, 0x1a8a, 0x424c, 0xbff0, 0xbfc0, 0x1e0a, 0xb2c1, 0x4238, 0x4388, 0x4485, 0x34b5, 0xa687, 0x4235, 0xb295, 0xb0a0, 0x4175, 0x4280, 0xadc3, 0xa75e, 0x467c, 0x4169, 0xb20c, 0x42cb, 0xbf12, 0x1ad9, 0x1acf, 0x46e8, 0xba62, 0x4180, 0x1e87, 0x4028, 0x093f, 0x1810, 0xb015, 0x42d2, 0x1ba6, 0xbf04, 0xb0d5, 0x4156, 0x43e8, 0x4246, 0xbac6, 0x4204, 0xb272, 0xba2f, 0xb24e, 0x422c, 0x40e9, 0x43ec, 0x4019, 0x41a1, 0x1cad, 0x007a, 0x41b7, 0x4231, 0xbfc1, 0x3779, 0x1010, 0xbafe, 0x4311, 0x45b9, 0x469a, 0x41fe, 0xb205, 0x17e7, 0x0096, 0x166f, 0x4090, 0xb260, 0x4241, 0xb0ad, 0x1c8e, 0xbf4f, 0xb2a7, 0x432d, 0xba6a, 0x4358, 0xb26d, 0x429c, 0x40c8, 0x1de3, 0x244f, 0xa9e5, 0x412a, 0x1bff, 0x40b1, 0xb2c6, 0x469b, 0x0d3c, 0x1ef1, 0xbfb6, 0xa11f, 0x4011, 0xb298, 0x0847, 0x400c, 0xb255, 0xb0a0, 0xbae9, 0xba33, 0x413e, 0xb2a9, 0x40c4, 0x199a, 0xb2b8, 0xbf8b, 0x437d, 0x18dc, 0x19c1, 0x43ee, 0x0ce7, 0x0e99, 0x287c, 0x2f2a, 0x1e51, 0xbf90, 0xb217, 0x41a9, 0xb230, 0xb02b, 0xbf7b, 0x4319, 0x12d0, 0x4279, 0xba78, 0x1950, 0xbf90, 0x0410, 0xb08d, 0x260b, 0xbfa8, 0x3d18, 0x4338, 0x4185, 0x4061, 0x4042, 0x41ad, 0xbaef, 0x419e, 0x194f, 0x249b, 0xb2c1, 0xbf19, 0x1f07, 0x4370, 0x1cd7, 0x439a, 0xab32, 0x4256, 0xbf2f, 0x43cb, 0x412b, 0x41a7, 0x1b51, 0xb20f, 0xb03a, 0x4000, 0x3858, 0x3170, 0x2475, 0xae13, 0xb231, 0x4498, 0xbf9a, 0x45ad, 0x404e, 0x2df8, 0xb25b, 0x3db3, 0xa424, 0xb211, 0xb208, 0x43fb, 0x4241, 0x1937, 0x1c73, 0x40f4, 0x0729, 0x41cd, 0x2eff, 0x4288, 0xb0cc, 0x1be4, 0xbafc, 0xbf21, 0x1150, 0xba5b, 0x41ec, 0x1e5d, 0x4324, 0x430d, 0x189e, 0x416b, 0xb0ed, 0x1958, 0x43c4, 0x439c, 0x40aa, 0x42e3, 0xba03, 0x4255, 0x4014, 0x4583, 0xb2b2, 0xb278, 0xb233, 0x2f6f, 0x31e0, 0x41bb, 0xbfce, 0x439f, 0xa48e, 0x42cf, 0x434c, 0xb25d, 0x4317, 0xb281, 0x439b, 0x4098, 0x4201, 0xae51, 0x4281, 0x43c0, 0x417b, 0xb014, 0x4561, 0xba03, 0xb26b, 0x1e97, 0xb2f8, 0x4131, 0x4191, 0x40fe, 0xbf78, 0x227e, 0x4692, 0xba49, 0x4175, 0x4495, 0xb252, 0xba21, 0x43d7, 0x4317, 0x214c, 0xba01, 0x46d9, 0x41a8, 0x4023, 0xbf4b, 0x28eb, 0xb055, 0x431e, 0x40cb, 0x40d2, 0x1bce, 0x1a62, 0x4004, 0x438d, 0x1f3c, 0xb20b, 0x4025, 0x410f, 0xa075, 0xb262, 0xbf37, 0xbade, 0xb264, 0x1a2d, 0x19a6, 0x1811, 0xbfdd, 0xbad4, 0x4331, 0x2bc6, 0x42d3, 0x42ff, 0x23d1, 0x442b, 0x28f2, 0x1597, 0xbfa5, 0xb0ad, 0x41fc, 0x446c, 0xba71, 0x45d1, 0x24a8, 0x1f6f, 0xba30, 0x4228, 0x40dc, 0x402e, 0x43d7, 0xae6c, 0x403b, 0x4027, 0x4391, 0xbf69, 0xb2c4, 0x45ec, 0xba6a, 0x406c, 0x46a5, 0xba6a, 0xb2dd, 0xbad4, 0x41e5, 0x40a9, 0x41e5, 0x1abf, 0xbf74, 0x1c83, 0x42d6, 0x43d1, 0xba0f, 0x43f6, 0x042d, 0x4341, 0x42b2, 0xbf14, 0x1fe1, 0x4275, 0x4128, 0x401c, 0xb20d, 0x02b4, 0x4493, 0x41ac, 0xb21a, 0x417f, 0x4283, 0x2bd4, 0x40a7, 0xb293, 0x4028, 0xb2d5, 0xbac8, 0xb250, 0xbf2f, 0x426d, 0x424e, 0x433a, 0x1e87, 0x4352, 0xb295, 0xbadd, 0x4369, 0x05ca, 0x415d, 0xb215, 0x4247, 0x4220, 0x3a43, 0x0025, 0x4166, 0xbac9, 0xba2a, 0x4084, 0x0d4f, 0xb07c, 0x43b7, 0x45e5, 0x42de, 0x401b, 0x4382, 0xbf6b, 0x45ae, 0x279c, 0x4117, 0x4138, 0x0998, 0x425f, 0xbf24, 0x08b8, 0xb016, 0x1f7d, 0x2512, 0x19cd, 0xba6d, 0x42d8, 0xba0c, 0x30ef, 0x4407, 0x2342, 0x0c6e, 0x432c, 0x41d3, 0x13e8, 0x1350, 0x363a, 0xb072, 0x3631, 0xbf6f, 0x1a7d, 0x2ed0, 0x43d7, 0x28be, 0x3dc7, 0x15f5, 0x4118, 0xba6c, 0x4604, 0xa826, 0x423a, 0xb2bc, 0xb201, 0xbf0d, 0x41bc, 0x1afd, 0xb061, 0x3a1d, 0x4126, 0x42fe, 0x2aa7, 0x4165, 0xba5b, 0xb078, 0xbfc0, 0x4351, 0x42e4, 0x4183, 0x4211, 0x4651, 0x40b3, 0x4328, 0x43d0, 0x207b, 0xb24b, 0x1018, 0xae51, 0x18f3, 0x4037, 0xba1d, 0x1529, 0x3c02, 0xbf14, 0x0859, 0x40a1, 0x1daf, 0xb296, 0xb0b8, 0x2b0a, 0x4221, 0xbacc, 0x185d, 0x402d, 0x18ff, 0x42a7, 0xb28b, 0xbf6e, 0x43af, 0x419c, 0x3a08, 0x4230, 0x2623, 0x1903, 0x0462, 0x0149, 0xba1a, 0x1eba, 0x436d, 0xb0b8, 0x40df, 0xb279, 0xba60, 0x44f1, 0xba16, 0x4085, 0xb2c5, 0x1e6e, 0x40e0, 0xbf8c, 0x422a, 0x42ea, 0x42fe, 0x4544, 0xbf53, 0x430b, 0x3121, 0x4012, 0x4291, 0xb007, 0xb223, 0xb2a1, 0xb2ce, 0x09bd, 0x1d76, 0x4171, 0x40d3, 0x08b5, 0xacc9, 0x2e88, 0xb2dd, 0xb2e7, 0x42f5, 0x408d, 0x41a0, 0x41ef, 0x1c3f, 0x464e, 0x2766, 0xbf4a, 0x4087, 0xafb7, 0x461c, 0x43d1, 0xa153, 0x34a3, 0xbfa0, 0xba05, 0x0f87, 0x4095, 0xbfbf, 0x4252, 0x4160, 0x41d3, 0xb071, 0x09c2, 0xb05b, 0x4368, 0x40ab, 0x07d6, 0x45dd, 0xb047, 0x43b8, 0x42f8, 0x23c1, 0x19d1, 0x3c53, 0x42a3, 0x2e39, 0x4208, 0x04ed, 0x411c, 0x29ec, 0x43ac, 0xa6b8, 0x403b, 0xba30, 0xbf11, 0xb2fb, 0x1810, 0x05a6, 0x40b2, 0xa664, 0xbfaa, 0x434c, 0xb280, 0x2bd7, 0x22b9, 0x42ca, 0x0fe6, 0x2a39, 0xa493, 0x40ce, 0x424a, 0xba10, 0x42e2, 0xa50a, 0x43b9, 0x456b, 0xb2a1, 0x432b, 0x43ee, 0x05a5, 0x4142, 0x4417, 0x1ccf, 0x40a5, 0x43d8, 0xbfa1, 0xb268, 0x4092, 0xb20f, 0x401f, 0x40ea, 0x1b3d, 0xbaed, 0x0264, 0x0b78, 0x42fb, 0x0836, 0xb2ed, 0x424a, 0x40d1, 0x2cfd, 0x101f, 0x4293, 0x46a9, 0x46cb, 0xbfa3, 0x4058, 0x41d6, 0x40c1, 0xba3a, 0x45dc, 0x11ed, 0x3aa0, 0x468d, 0xbf80, 0xa4dc, 0x1936, 0x1766, 0x280e, 0x1ae8, 0xbfde, 0x33a9, 0x17d0, 0xa82c, 0xba1a, 0x43d1, 0x4310, 0x41b3, 0xb21a, 0x4270, 0xb285, 0x4055, 0xba60, 0x1c37, 0x224c, 0x43ce, 0x43c3, 0x234e, 0x43ca, 0xb213, 0xb29c, 0x4294, 0xba5c, 0xb2b3, 0x2d4b, 0xa6db, 0xbf1e, 0x4240, 0xa2f2, 0x138e, 0x1d24, 0x4235, 0x4569, 0x432e, 0x41ef, 0xa704, 0x25b2, 0x13bc, 0xb0eb, 0x41e4, 0x401e, 0xa704, 0x41ad, 0x41dd, 0x4298, 0x1b03, 0x423c, 0xb248, 0x405c, 0x0b80, 0x40c7, 0xba75, 0x43b0, 0xbfb6, 0x10b0, 0x41ec, 0xa1b4, 0xb26b, 0xb295, 0x412c, 0x44e5, 0x2796, 0x2eb7, 0x4165, 0xbfc9, 0x42b4, 0xac49, 0x40da, 0xba7f, 0x40c1, 0xbf00, 0x4376, 0x0fd1, 0x1a0f, 0x4356, 0x41ac, 0xb00e, 0x45f3, 0x2458, 0x333c, 0x0171, 0xb273, 0x4304, 0xbfe2, 0x45cb, 0xa2d9, 0x40d8, 0x4348, 0x1760, 0x412f, 0x42d4, 0x40a9, 0x424f, 0xbf18, 0xb07a, 0x40b1, 0x00cf, 0x43fa, 0x4299, 0x4367, 0x222f, 0x1212, 0x4401, 0x4388, 0x2451, 0xb29b, 0x4319, 0xb210, 0x420f, 0x40fd, 0x45b0, 0x32f6, 0x43b9, 0x1ca3, 0x1863, 0xbfac, 0xb083, 0x4385, 0x42d0, 0x422c, 0x1fe8, 0x2eaa, 0x1075, 0xb2a0, 0xbf0b, 0x42d9, 0xa9de, 0xb093, 0x42ce, 0x41eb, 0x40a4, 0x4242, 0x43df, 0xb254, 0xa2a0, 0x421b, 0x4305, 0xbf55, 0x10f1, 0xabe9, 0x41fb, 0x4333, 0x2b35, 0x405e, 0x1e82, 0x2a61, 0xbf46, 0x4234, 0xb26c, 0x1935, 0xbad9, 0x4164, 0xb241, 0x43fe, 0xb25b, 0x1df3, 0x4304, 0x1a0c, 0xba35, 0xbf0e, 0x336a, 0x3265, 0x068a, 0xba61, 0x06fd, 0x1c50, 0xb2c0, 0x4124, 0x4418, 0x41c6, 0xabd2, 0x429d, 0xba40, 0x4225, 0xb0e6, 0xb2c8, 0x4148, 0xb2b2, 0x400d, 0x1bc1, 0x24ff, 0xbf6c, 0x43f2, 0xba30, 0x4770, 0xe7fe + ], + StartRegs = [0xb95fc095, 0x46c9af8c, 0x44f999c1, 0xf75c725c, 0xeef9897b, 0x7583419d, 0xd7d5f784, 0xf2f60e6f, 0xa9e0afa9, 0x25abe41c, 0x5498383c, 0x7f430b81, 0xac6b7408, 0xf3f13b36, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x00401400, 0x00000052, 0x00004000, 0xac6b75d0, 0x000000ff, 0x00000000, 0x00144000, 0xffffffae, 0x2206c8a0, 0x00000000, 0x0000007e, 0x00000000, 0xac6b7408, 0xac6b70f0, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x185d, 0x4287, 0x405b, 0xb0b0, 0x192e, 0xb012, 0x414b, 0x436f, 0xa9b7, 0x438f, 0x108e, 0xb067, 0x418e, 0x4013, 0x3736, 0x4549, 0x4259, 0xb2c8, 0x42a8, 0x415c, 0x43a9, 0xb28b, 0xbfb3, 0xb2f8, 0x43c9, 0x0a66, 0x4216, 0xbf64, 0x1ee1, 0x42e3, 0xb2bd, 0x00ef, 0xbaf4, 0x40be, 0x4353, 0x44a9, 0x4104, 0x1b6b, 0x403d, 0xb266, 0x078d, 0xba6b, 0x3c0d, 0x05b8, 0xbfbd, 0xbaee, 0x4277, 0x42c0, 0x0958, 0x4254, 0x40a3, 0x4250, 0xa6f7, 0x4050, 0x4541, 0xb211, 0x14d3, 0x41ae, 0x46c8, 0xba25, 0x3f96, 0x0fc8, 0xb246, 0xbf45, 0x45ce, 0x130d, 0xbf00, 0x2176, 0x404f, 0x435a, 0xafd3, 0x4093, 0xb2b3, 0x4202, 0x41df, 0x4089, 0x43d4, 0x0739, 0xaa0d, 0x3f8f, 0xba47, 0x1a4c, 0xb224, 0xbf5d, 0xb20e, 0x1e5c, 0x46a1, 0xba65, 0x40af, 0x41e6, 0x4076, 0xb23a, 0x3fa5, 0x438d, 0xba57, 0xae3f, 0x4141, 0xb2f9, 0xbfe0, 0x43d0, 0x1ec1, 0xb2b6, 0xb28b, 0x1ded, 0x055e, 0x41f0, 0x40f8, 0x0692, 0x4051, 0xbf97, 0x4388, 0xacb2, 0xb04b, 0x19ce, 0x32d5, 0x0b66, 0x4368, 0x1627, 0xb288, 0xb241, 0x4042, 0x2698, 0xb0b7, 0x429f, 0x262d, 0x40b3, 0xb065, 0x42f4, 0xbf14, 0x4009, 0x1661, 0x4304, 0x430d, 0xbfb5, 0x417a, 0x428d, 0x1d15, 0x0175, 0x4282, 0x1183, 0xb22c, 0x1fbc, 0x4352, 0x0e63, 0xa412, 0xba64, 0xa285, 0x41f2, 0x41de, 0x4372, 0xbafe, 0x00ef, 0x40d8, 0xb29d, 0x41a1, 0x44b5, 0xbfaa, 0x4668, 0xbaf8, 0x4180, 0x4462, 0x1dbb, 0x4492, 0x4022, 0xba5c, 0x4070, 0xb2b6, 0x4321, 0x4314, 0x4330, 0xa81d, 0x38c2, 0x427a, 0x417c, 0x4691, 0x4111, 0x4065, 0x1c3d, 0xb02f, 0x424a, 0x4047, 0x4349, 0x411a, 0x40fa, 0xbac1, 0xbf7e, 0x36e7, 0x4189, 0x233b, 0xb032, 0x4071, 0x2ae4, 0x2b36, 0x4290, 0x310b, 0xb22c, 0x430a, 0x4204, 0xbf7f, 0x172e, 0xba71, 0x08ee, 0x43bf, 0x1b31, 0xb068, 0x42b5, 0xbf00, 0x4545, 0xb08e, 0xa37d, 0xb234, 0xb011, 0xbfe4, 0xb208, 0xa6ee, 0x0e43, 0x107e, 0x405d, 0x1c5f, 0x0f55, 0x0342, 0x44cd, 0x2b29, 0xb086, 0xa40a, 0xb21d, 0x4028, 0x426b, 0x2a20, 0x4267, 0x406f, 0x419f, 0x4274, 0x4006, 0xa492, 0x18a2, 0x4177, 0x4140, 0x42a6, 0xbf83, 0x2b7b, 0x4242, 0x40a5, 0x079e, 0x46e0, 0x1907, 0x44f5, 0x094d, 0xb295, 0x438d, 0x409c, 0x465c, 0x43db, 0x36e9, 0xba2d, 0xbf95, 0x430f, 0x4129, 0xb2d0, 0x46dc, 0xa2f1, 0xbf16, 0x433f, 0xb27b, 0x4348, 0xaf01, 0xbf35, 0xba7d, 0x1b43, 0xbaf0, 0x4006, 0x2e62, 0x1e1d, 0xae4d, 0xa032, 0x40fd, 0x42bb, 0x4395, 0x423b, 0x420c, 0x41c1, 0x42fc, 0x466f, 0x4604, 0x41be, 0x4283, 0x426c, 0xbfd3, 0xb2d1, 0x4025, 0x42e2, 0x1d04, 0x228c, 0xb052, 0x37a0, 0x1c67, 0x403a, 0xbfa6, 0x0a6e, 0xb06e, 0xb0b7, 0xaeb4, 0x30fd, 0x423a, 0x41ed, 0x4040, 0x4116, 0x3637, 0x4302, 0xb2f8, 0x1e49, 0xb2e1, 0x437a, 0x05e7, 0x408c, 0xb02a, 0xba09, 0x402c, 0x43db, 0x4062, 0x4664, 0x38d1, 0xbfcb, 0xb012, 0x4595, 0xb2d4, 0xb224, 0xba4c, 0xbf06, 0x088c, 0x1077, 0x414a, 0xafd7, 0x1496, 0xbfa0, 0x45b0, 0x1c0c, 0x3354, 0x43e0, 0x1eab, 0x4281, 0x45c1, 0x406b, 0x075b, 0x3898, 0x4242, 0x430f, 0x4612, 0x40fb, 0xb03f, 0xb0f6, 0x400e, 0x4316, 0x418c, 0x270c, 0xbf93, 0xbac5, 0x18ed, 0xa70b, 0x42f6, 0x4238, 0xbf76, 0x3431, 0x4200, 0x46b8, 0x411c, 0x43a6, 0x439b, 0xbaff, 0x1a05, 0x404b, 0xb238, 0xb2f6, 0xba00, 0x0df6, 0x4021, 0x409b, 0xba4f, 0x1fb3, 0x252f, 0x4018, 0xa721, 0x0f4b, 0x40b9, 0x4211, 0x40d7, 0xba5c, 0xb0f1, 0xbfdf, 0x2384, 0xba0a, 0x435a, 0x42d7, 0x4653, 0x401e, 0xac83, 0x4073, 0xba4b, 0xb0df, 0x0b60, 0x4316, 0x4624, 0xa092, 0x0bf5, 0xbfb0, 0xb057, 0x42d6, 0x42fe, 0x156c, 0x41d6, 0xb0bb, 0x13d3, 0x4248, 0xbfbb, 0x437d, 0x0a8b, 0x4317, 0x40db, 0x42b3, 0x40cd, 0x4095, 0x4362, 0x42d2, 0x4475, 0x4137, 0xae4f, 0x400e, 0x0014, 0xbf7c, 0x420f, 0x1b5a, 0xbf70, 0x18ef, 0xb07e, 0x44fb, 0x43cf, 0x404b, 0x4171, 0xb0e2, 0xba20, 0xa7cc, 0x4580, 0xbf0e, 0x385a, 0x43d1, 0xac36, 0x434c, 0xb0d6, 0x4284, 0x12a5, 0x43bd, 0xb26e, 0x438a, 0xb059, 0x4370, 0x18bd, 0x362f, 0x4309, 0xb0fc, 0xb2d3, 0xbf13, 0xb23e, 0x4285, 0xb0fb, 0xba0b, 0x41b6, 0x04d1, 0xb249, 0x1ee9, 0xb2aa, 0x4340, 0x4285, 0x43e9, 0xbac6, 0xba62, 0x40d2, 0xb23d, 0xb0f0, 0x1cca, 0x083a, 0xb0b2, 0x43c6, 0x18d1, 0x2883, 0xbf66, 0x4121, 0xbaeb, 0x402e, 0x40c5, 0xbaf2, 0x41a9, 0x1839, 0xba61, 0xb0cf, 0xb2ae, 0x40ef, 0x405a, 0xb207, 0x1bb5, 0xab4a, 0x4572, 0x41f5, 0x33d6, 0x40a5, 0x1a06, 0xb2c3, 0x403c, 0x4341, 0xa0bd, 0x42a7, 0xb276, 0x1daf, 0x37ad, 0xbf5e, 0x3150, 0x43eb, 0x4213, 0xbf66, 0xb21d, 0x429b, 0x4004, 0x4012, 0x41ab, 0x467e, 0xb2d5, 0x4213, 0x4229, 0x0fbc, 0xa2a8, 0xbfd8, 0x4042, 0x32a7, 0x3304, 0xbf8a, 0x125d, 0x3c49, 0x4596, 0x4060, 0xa368, 0x448b, 0x409c, 0x2f24, 0xb0ca, 0x42ff, 0xb22a, 0x0971, 0x469a, 0xb260, 0x4243, 0x2673, 0x0f84, 0xbf36, 0xa7f5, 0xa907, 0xb081, 0xb2b0, 0x4157, 0x1ad4, 0x4360, 0x1c8f, 0xba6a, 0x40ac, 0x429a, 0x425f, 0xb062, 0xb2cd, 0x4228, 0x1806, 0x1d41, 0xbf0d, 0xba56, 0xbf60, 0xb255, 0x1952, 0x19ca, 0x2d41, 0xb0a0, 0x45e8, 0x3a49, 0xba58, 0x41cc, 0xbf00, 0xb283, 0x462e, 0x18ad, 0xbaf6, 0x26f5, 0x1680, 0x41bb, 0xb2d7, 0x40a9, 0xbf59, 0x40a2, 0xba67, 0x0b0a, 0xa067, 0x1d7b, 0x42ad, 0x2159, 0xbf2a, 0xa8ac, 0x421b, 0x1c35, 0x4381, 0x424c, 0x4216, 0xba6b, 0x4262, 0x432d, 0xb2f3, 0x402b, 0xb29f, 0xb032, 0x0bae, 0x40ba, 0x41a6, 0x4063, 0x405b, 0xb051, 0xbf9e, 0x4242, 0xb2cd, 0x2966, 0x4388, 0xb281, 0xb24f, 0x442a, 0xbae4, 0xb0d7, 0x25c2, 0x4013, 0x308b, 0x4231, 0x3ca8, 0x1fc9, 0x4563, 0x4420, 0xbaf2, 0x0a8b, 0xa349, 0xbada, 0x4188, 0x04c9, 0xb0c5, 0x1db0, 0xb079, 0x4204, 0x4305, 0xbf53, 0xa0e7, 0x434e, 0x1fb1, 0xb079, 0x1c64, 0x43e0, 0x1c51, 0x3ea3, 0x428e, 0x409d, 0x4323, 0x43b9, 0x42fd, 0x22fb, 0xb228, 0x41bb, 0x4320, 0x40f4, 0x2bec, 0x45cc, 0x419d, 0xb2d8, 0x325d, 0x44c3, 0x201f, 0x41d5, 0xbf59, 0xbf70, 0x2ef4, 0xb27b, 0xb03b, 0xa979, 0x24f4, 0xba21, 0x44a8, 0x028d, 0xb207, 0xa84c, 0x409d, 0xbf80, 0xbf26, 0xb2ef, 0xb2c9, 0x2659, 0x430f, 0xb2eb, 0x41d1, 0x10fa, 0x2baa, 0x09a6, 0xb02f, 0xb2c9, 0xba2f, 0xba67, 0x4211, 0xbf57, 0x10f3, 0x185c, 0x419a, 0x4271, 0xad46, 0xb077, 0x4627, 0xb2e2, 0x1a5e, 0x42a8, 0x422f, 0xb27a, 0x40f5, 0x4085, 0x0255, 0xa249, 0x4270, 0x4392, 0xb0ff, 0xb2e3, 0x46b2, 0xb2d1, 0x4001, 0x4639, 0x1fa7, 0x42f2, 0xa470, 0xbaf5, 0xbfdd, 0x1d21, 0x3f09, 0x2d80, 0x1aa9, 0xbf1a, 0x4061, 0x400e, 0xae29, 0xa3a0, 0x4010, 0x1f99, 0x121b, 0x41a0, 0xb2af, 0xbad1, 0xbf1c, 0xb298, 0x3db6, 0xb05b, 0xba33, 0xa3d9, 0xa2e3, 0x4162, 0x4188, 0x413b, 0x2805, 0x40a0, 0x4151, 0x2a6d, 0xbae7, 0x444f, 0x430e, 0x413a, 0x1767, 0xb05b, 0x303f, 0x001c, 0x43b9, 0x28e3, 0x3dad, 0x420e, 0x4205, 0xbf03, 0xb21b, 0x022e, 0x44d1, 0xb283, 0xb2c7, 0x0c1a, 0x4107, 0x198e, 0x43e8, 0x1c24, 0x3d5c, 0xa5ee, 0xbfd0, 0xbf43, 0x2a0c, 0x40ac, 0x4414, 0xa9ce, 0xbf2c, 0xbac9, 0x396d, 0x42fa, 0xbf0b, 0x4292, 0x43ba, 0x424a, 0xb25f, 0x42d6, 0x4188, 0x2f30, 0xb081, 0x38a0, 0x4213, 0x4130, 0x415f, 0x2c4c, 0xadab, 0xba23, 0xadc1, 0xb25f, 0xabf8, 0x45cd, 0x416d, 0x40d1, 0x403b, 0x1dc9, 0x4150, 0xba03, 0xb076, 0xbaf1, 0xbf2d, 0x40dc, 0x0d13, 0x18a9, 0x43a4, 0xb076, 0xba07, 0xb27d, 0x0b40, 0x3d88, 0x40a7, 0x0533, 0x2c71, 0x41cc, 0x42f9, 0x1ef9, 0x4583, 0x41e2, 0xba3b, 0xba44, 0x41b1, 0x42f2, 0xbfdf, 0xb23d, 0xbfc0, 0x071e, 0x19b6, 0x1a1f, 0x417f, 0xb268, 0x4132, 0xbaf6, 0x3af3, 0x1f37, 0x4352, 0x437d, 0xbfa2, 0x05b2, 0x43cb, 0x42a5, 0x43e5, 0x42ac, 0xa525, 0x18ad, 0xbace, 0x2d15, 0x1f1e, 0x01c6, 0xa4ad, 0x433a, 0x436a, 0x1e2a, 0x4389, 0x1898, 0xb2a5, 0x1a20, 0x42ec, 0xa6ed, 0xb038, 0xbacd, 0xbf8e, 0x41b9, 0x43ea, 0x42ba, 0x30cd, 0xaff4, 0x42fb, 0x460d, 0xbfa0, 0x1f87, 0x122b, 0x1b3f, 0x1cd8, 0x4109, 0x1cf9, 0x4146, 0x27b9, 0x4637, 0x43f7, 0xba68, 0x459b, 0xbf8d, 0xbf60, 0x1be6, 0x4691, 0xb267, 0x4062, 0xb2b4, 0xb2ca, 0x4198, 0x4331, 0x2b7d, 0xbf60, 0xbadc, 0xb221, 0x1ca0, 0xb200, 0x4007, 0x1e11, 0x43f6, 0x43af, 0x2b4b, 0x41d0, 0x21a9, 0x43d0, 0x43d1, 0xbfd2, 0x410a, 0xb0a3, 0xb266, 0x4153, 0x42fa, 0x371e, 0x4037, 0x1c33, 0x43de, 0xb0ef, 0xb059, 0x43fe, 0x410f, 0x0ed6, 0xb2ef, 0xbf33, 0xb080, 0xb023, 0x416c, 0x4390, 0x4484, 0x059f, 0x03c7, 0x4176, 0x425b, 0x42b5, 0xbf0b, 0x4680, 0x4202, 0x1ee9, 0x456a, 0xaae9, 0x4333, 0x1c96, 0x20f2, 0x3d1d, 0x434e, 0x39dd, 0x40c9, 0x433b, 0xbf21, 0x444b, 0xb295, 0x3462, 0x3275, 0x4110, 0xb214, 0x1edc, 0x4136, 0xbad1, 0x43a5, 0xb2ae, 0xadf4, 0x40ac, 0xa037, 0x4199, 0x41d7, 0x426e, 0xb2de, 0x43eb, 0xba38, 0xb253, 0x4092, 0xbfba, 0x413c, 0x4238, 0x41a0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd919f6a3, 0x9e176573, 0x3795cb44, 0x666e776e, 0x370d6712, 0xb9f52030, 0x59d84426, 0xcda6b649, 0x3c751555, 0x13a5d9a9, 0x68b254f2, 0x4c783b43, 0xb4ebd830, 0x01180a73, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0x0080fb0e, 0x005002e4, 0x00000000, 0x00000024, 0x00000000, 0x011021db, 0x0000003d, 0x0ffb8000, 0x0001470c, 0xfff80698, 0x00000003, 0x4c784f07, 0xb4ebd7a0, 0x01101e0b, 0x00000000, 0x400001d0 }, + Instructions = [0x185d, 0x4287, 0x405b, 0xb0b0, 0x192e, 0xb012, 0x414b, 0x436f, 0xa9b7, 0x438f, 0x108e, 0xb067, 0x418e, 0x4013, 0x3736, 0x4549, 0x4259, 0xb2c8, 0x42a8, 0x415c, 0x43a9, 0xb28b, 0xbfb3, 0xb2f8, 0x43c9, 0x0a66, 0x4216, 0xbf64, 0x1ee1, 0x42e3, 0xb2bd, 0x00ef, 0xbaf4, 0x40be, 0x4353, 0x44a9, 0x4104, 0x1b6b, 0x403d, 0xb266, 0x078d, 0xba6b, 0x3c0d, 0x05b8, 0xbfbd, 0xbaee, 0x4277, 0x42c0, 0x0958, 0x4254, 0x40a3, 0x4250, 0xa6f7, 0x4050, 0x4541, 0xb211, 0x14d3, 0x41ae, 0x46c8, 0xba25, 0x3f96, 0x0fc8, 0xb246, 0xbf45, 0x45ce, 0x130d, 0xbf00, 0x2176, 0x404f, 0x435a, 0xafd3, 0x4093, 0xb2b3, 0x4202, 0x41df, 0x4089, 0x43d4, 0x0739, 0xaa0d, 0x3f8f, 0xba47, 0x1a4c, 0xb224, 0xbf5d, 0xb20e, 0x1e5c, 0x46a1, 0xba65, 0x40af, 0x41e6, 0x4076, 0xb23a, 0x3fa5, 0x438d, 0xba57, 0xae3f, 0x4141, 0xb2f9, 0xbfe0, 0x43d0, 0x1ec1, 0xb2b6, 0xb28b, 0x1ded, 0x055e, 0x41f0, 0x40f8, 0x0692, 0x4051, 0xbf97, 0x4388, 0xacb2, 0xb04b, 0x19ce, 0x32d5, 0x0b66, 0x4368, 0x1627, 0xb288, 0xb241, 0x4042, 0x2698, 0xb0b7, 0x429f, 0x262d, 0x40b3, 0xb065, 0x42f4, 0xbf14, 0x4009, 0x1661, 0x4304, 0x430d, 0xbfb5, 0x417a, 0x428d, 0x1d15, 0x0175, 0x4282, 0x1183, 0xb22c, 0x1fbc, 0x4352, 0x0e63, 0xa412, 0xba64, 0xa285, 0x41f2, 0x41de, 0x4372, 0xbafe, 0x00ef, 0x40d8, 0xb29d, 0x41a1, 0x44b5, 0xbfaa, 0x4668, 0xbaf8, 0x4180, 0x4462, 0x1dbb, 0x4492, 0x4022, 0xba5c, 0x4070, 0xb2b6, 0x4321, 0x4314, 0x4330, 0xa81d, 0x38c2, 0x427a, 0x417c, 0x4691, 0x4111, 0x4065, 0x1c3d, 0xb02f, 0x424a, 0x4047, 0x4349, 0x411a, 0x40fa, 0xbac1, 0xbf7e, 0x36e7, 0x4189, 0x233b, 0xb032, 0x4071, 0x2ae4, 0x2b36, 0x4290, 0x310b, 0xb22c, 0x430a, 0x4204, 0xbf7f, 0x172e, 0xba71, 0x08ee, 0x43bf, 0x1b31, 0xb068, 0x42b5, 0xbf00, 0x4545, 0xb08e, 0xa37d, 0xb234, 0xb011, 0xbfe4, 0xb208, 0xa6ee, 0x0e43, 0x107e, 0x405d, 0x1c5f, 0x0f55, 0x0342, 0x44cd, 0x2b29, 0xb086, 0xa40a, 0xb21d, 0x4028, 0x426b, 0x2a20, 0x4267, 0x406f, 0x419f, 0x4274, 0x4006, 0xa492, 0x18a2, 0x4177, 0x4140, 0x42a6, 0xbf83, 0x2b7b, 0x4242, 0x40a5, 0x079e, 0x46e0, 0x1907, 0x44f5, 0x094d, 0xb295, 0x438d, 0x409c, 0x465c, 0x43db, 0x36e9, 0xba2d, 0xbf95, 0x430f, 0x4129, 0xb2d0, 0x46dc, 0xa2f1, 0xbf16, 0x433f, 0xb27b, 0x4348, 0xaf01, 0xbf35, 0xba7d, 0x1b43, 0xbaf0, 0x4006, 0x2e62, 0x1e1d, 0xae4d, 0xa032, 0x40fd, 0x42bb, 0x4395, 0x423b, 0x420c, 0x41c1, 0x42fc, 0x466f, 0x4604, 0x41be, 0x4283, 0x426c, 0xbfd3, 0xb2d1, 0x4025, 0x42e2, 0x1d04, 0x228c, 0xb052, 0x37a0, 0x1c67, 0x403a, 0xbfa6, 0x0a6e, 0xb06e, 0xb0b7, 0xaeb4, 0x30fd, 0x423a, 0x41ed, 0x4040, 0x4116, 0x3637, 0x4302, 0xb2f8, 0x1e49, 0xb2e1, 0x437a, 0x05e7, 0x408c, 0xb02a, 0xba09, 0x402c, 0x43db, 0x4062, 0x4664, 0x38d1, 0xbfcb, 0xb012, 0x4595, 0xb2d4, 0xb224, 0xba4c, 0xbf06, 0x088c, 0x1077, 0x414a, 0xafd7, 0x1496, 0xbfa0, 0x45b0, 0x1c0c, 0x3354, 0x43e0, 0x1eab, 0x4281, 0x45c1, 0x406b, 0x075b, 0x3898, 0x4242, 0x430f, 0x4612, 0x40fb, 0xb03f, 0xb0f6, 0x400e, 0x4316, 0x418c, 0x270c, 0xbf93, 0xbac5, 0x18ed, 0xa70b, 0x42f6, 0x4238, 0xbf76, 0x3431, 0x4200, 0x46b8, 0x411c, 0x43a6, 0x439b, 0xbaff, 0x1a05, 0x404b, 0xb238, 0xb2f6, 0xba00, 0x0df6, 0x4021, 0x409b, 0xba4f, 0x1fb3, 0x252f, 0x4018, 0xa721, 0x0f4b, 0x40b9, 0x4211, 0x40d7, 0xba5c, 0xb0f1, 0xbfdf, 0x2384, 0xba0a, 0x435a, 0x42d7, 0x4653, 0x401e, 0xac83, 0x4073, 0xba4b, 0xb0df, 0x0b60, 0x4316, 0x4624, 0xa092, 0x0bf5, 0xbfb0, 0xb057, 0x42d6, 0x42fe, 0x156c, 0x41d6, 0xb0bb, 0x13d3, 0x4248, 0xbfbb, 0x437d, 0x0a8b, 0x4317, 0x40db, 0x42b3, 0x40cd, 0x4095, 0x4362, 0x42d2, 0x4475, 0x4137, 0xae4f, 0x400e, 0x0014, 0xbf7c, 0x420f, 0x1b5a, 0xbf70, 0x18ef, 0xb07e, 0x44fb, 0x43cf, 0x404b, 0x4171, 0xb0e2, 0xba20, 0xa7cc, 0x4580, 0xbf0e, 0x385a, 0x43d1, 0xac36, 0x434c, 0xb0d6, 0x4284, 0x12a5, 0x43bd, 0xb26e, 0x438a, 0xb059, 0x4370, 0x18bd, 0x362f, 0x4309, 0xb0fc, 0xb2d3, 0xbf13, 0xb23e, 0x4285, 0xb0fb, 0xba0b, 0x41b6, 0x04d1, 0xb249, 0x1ee9, 0xb2aa, 0x4340, 0x4285, 0x43e9, 0xbac6, 0xba62, 0x40d2, 0xb23d, 0xb0f0, 0x1cca, 0x083a, 0xb0b2, 0x43c6, 0x18d1, 0x2883, 0xbf66, 0x4121, 0xbaeb, 0x402e, 0x40c5, 0xbaf2, 0x41a9, 0x1839, 0xba61, 0xb0cf, 0xb2ae, 0x40ef, 0x405a, 0xb207, 0x1bb5, 0xab4a, 0x4572, 0x41f5, 0x33d6, 0x40a5, 0x1a06, 0xb2c3, 0x403c, 0x4341, 0xa0bd, 0x42a7, 0xb276, 0x1daf, 0x37ad, 0xbf5e, 0x3150, 0x43eb, 0x4213, 0xbf66, 0xb21d, 0x429b, 0x4004, 0x4012, 0x41ab, 0x467e, 0xb2d5, 0x4213, 0x4229, 0x0fbc, 0xa2a8, 0xbfd8, 0x4042, 0x32a7, 0x3304, 0xbf8a, 0x125d, 0x3c49, 0x4596, 0x4060, 0xa368, 0x448b, 0x409c, 0x2f24, 0xb0ca, 0x42ff, 0xb22a, 0x0971, 0x469a, 0xb260, 0x4243, 0x2673, 0x0f84, 0xbf36, 0xa7f5, 0xa907, 0xb081, 0xb2b0, 0x4157, 0x1ad4, 0x4360, 0x1c8f, 0xba6a, 0x40ac, 0x429a, 0x425f, 0xb062, 0xb2cd, 0x4228, 0x1806, 0x1d41, 0xbf0d, 0xba56, 0xbf60, 0xb255, 0x1952, 0x19ca, 0x2d41, 0xb0a0, 0x45e8, 0x3a49, 0xba58, 0x41cc, 0xbf00, 0xb283, 0x462e, 0x18ad, 0xbaf6, 0x26f5, 0x1680, 0x41bb, 0xb2d7, 0x40a9, 0xbf59, 0x40a2, 0xba67, 0x0b0a, 0xa067, 0x1d7b, 0x42ad, 0x2159, 0xbf2a, 0xa8ac, 0x421b, 0x1c35, 0x4381, 0x424c, 0x4216, 0xba6b, 0x4262, 0x432d, 0xb2f3, 0x402b, 0xb29f, 0xb032, 0x0bae, 0x40ba, 0x41a6, 0x4063, 0x405b, 0xb051, 0xbf9e, 0x4242, 0xb2cd, 0x2966, 0x4388, 0xb281, 0xb24f, 0x442a, 0xbae4, 0xb0d7, 0x25c2, 0x4013, 0x308b, 0x4231, 0x3ca8, 0x1fc9, 0x4563, 0x4420, 0xbaf2, 0x0a8b, 0xa349, 0xbada, 0x4188, 0x04c9, 0xb0c5, 0x1db0, 0xb079, 0x4204, 0x4305, 0xbf53, 0xa0e7, 0x434e, 0x1fb1, 0xb079, 0x1c64, 0x43e0, 0x1c51, 0x3ea3, 0x428e, 0x409d, 0x4323, 0x43b9, 0x42fd, 0x22fb, 0xb228, 0x41bb, 0x4320, 0x40f4, 0x2bec, 0x45cc, 0x419d, 0xb2d8, 0x325d, 0x44c3, 0x201f, 0x41d5, 0xbf59, 0xbf70, 0x2ef4, 0xb27b, 0xb03b, 0xa979, 0x24f4, 0xba21, 0x44a8, 0x028d, 0xb207, 0xa84c, 0x409d, 0xbf80, 0xbf26, 0xb2ef, 0xb2c9, 0x2659, 0x430f, 0xb2eb, 0x41d1, 0x10fa, 0x2baa, 0x09a6, 0xb02f, 0xb2c9, 0xba2f, 0xba67, 0x4211, 0xbf57, 0x10f3, 0x185c, 0x419a, 0x4271, 0xad46, 0xb077, 0x4627, 0xb2e2, 0x1a5e, 0x42a8, 0x422f, 0xb27a, 0x40f5, 0x4085, 0x0255, 0xa249, 0x4270, 0x4392, 0xb0ff, 0xb2e3, 0x46b2, 0xb2d1, 0x4001, 0x4639, 0x1fa7, 0x42f2, 0xa470, 0xbaf5, 0xbfdd, 0x1d21, 0x3f09, 0x2d80, 0x1aa9, 0xbf1a, 0x4061, 0x400e, 0xae29, 0xa3a0, 0x4010, 0x1f99, 0x121b, 0x41a0, 0xb2af, 0xbad1, 0xbf1c, 0xb298, 0x3db6, 0xb05b, 0xba33, 0xa3d9, 0xa2e3, 0x4162, 0x4188, 0x413b, 0x2805, 0x40a0, 0x4151, 0x2a6d, 0xbae7, 0x444f, 0x430e, 0x413a, 0x1767, 0xb05b, 0x303f, 0x001c, 0x43b9, 0x28e3, 0x3dad, 0x420e, 0x4205, 0xbf03, 0xb21b, 0x022e, 0x44d1, 0xb283, 0xb2c7, 0x0c1a, 0x4107, 0x198e, 0x43e8, 0x1c24, 0x3d5c, 0xa5ee, 0xbfd0, 0xbf43, 0x2a0c, 0x40ac, 0x4414, 0xa9ce, 0xbf2c, 0xbac9, 0x396d, 0x42fa, 0xbf0b, 0x4292, 0x43ba, 0x424a, 0xb25f, 0x42d6, 0x4188, 0x2f30, 0xb081, 0x38a0, 0x4213, 0x4130, 0x415f, 0x2c4c, 0xadab, 0xba23, 0xadc1, 0xb25f, 0xabf8, 0x45cd, 0x416d, 0x40d1, 0x403b, 0x1dc9, 0x4150, 0xba03, 0xb076, 0xbaf1, 0xbf2d, 0x40dc, 0x0d13, 0x18a9, 0x43a4, 0xb076, 0xba07, 0xb27d, 0x0b40, 0x3d88, 0x40a7, 0x0533, 0x2c71, 0x41cc, 0x42f9, 0x1ef9, 0x4583, 0x41e2, 0xba3b, 0xba44, 0x41b1, 0x42f2, 0xbfdf, 0xb23d, 0xbfc0, 0x071e, 0x19b6, 0x1a1f, 0x417f, 0xb268, 0x4132, 0xbaf6, 0x3af3, 0x1f37, 0x4352, 0x437d, 0xbfa2, 0x05b2, 0x43cb, 0x42a5, 0x43e5, 0x42ac, 0xa525, 0x18ad, 0xbace, 0x2d15, 0x1f1e, 0x01c6, 0xa4ad, 0x433a, 0x436a, 0x1e2a, 0x4389, 0x1898, 0xb2a5, 0x1a20, 0x42ec, 0xa6ed, 0xb038, 0xbacd, 0xbf8e, 0x41b9, 0x43ea, 0x42ba, 0x30cd, 0xaff4, 0x42fb, 0x460d, 0xbfa0, 0x1f87, 0x122b, 0x1b3f, 0x1cd8, 0x4109, 0x1cf9, 0x4146, 0x27b9, 0x4637, 0x43f7, 0xba68, 0x459b, 0xbf8d, 0xbf60, 0x1be6, 0x4691, 0xb267, 0x4062, 0xb2b4, 0xb2ca, 0x4198, 0x4331, 0x2b7d, 0xbf60, 0xbadc, 0xb221, 0x1ca0, 0xb200, 0x4007, 0x1e11, 0x43f6, 0x43af, 0x2b4b, 0x41d0, 0x21a9, 0x43d0, 0x43d1, 0xbfd2, 0x410a, 0xb0a3, 0xb266, 0x4153, 0x42fa, 0x371e, 0x4037, 0x1c33, 0x43de, 0xb0ef, 0xb059, 0x43fe, 0x410f, 0x0ed6, 0xb2ef, 0xbf33, 0xb080, 0xb023, 0x416c, 0x4390, 0x4484, 0x059f, 0x03c7, 0x4176, 0x425b, 0x42b5, 0xbf0b, 0x4680, 0x4202, 0x1ee9, 0x456a, 0xaae9, 0x4333, 0x1c96, 0x20f2, 0x3d1d, 0x434e, 0x39dd, 0x40c9, 0x433b, 0xbf21, 0x444b, 0xb295, 0x3462, 0x3275, 0x4110, 0xb214, 0x1edc, 0x4136, 0xbad1, 0x43a5, 0xb2ae, 0xadf4, 0x40ac, 0xa037, 0x4199, 0x41d7, 0x426e, 0xb2de, 0x43eb, 0xba38, 0xb253, 0x4092, 0xbfba, 0x413c, 0x4238, 0x41a0, 0x4770, 0xe7fe + ], + StartRegs = [0xd919f6a3, 0x9e176573, 0x3795cb44, 0x666e776e, 0x370d6712, 0xb9f52030, 0x59d84426, 0xcda6b649, 0x3c751555, 0x13a5d9a9, 0x68b254f2, 0x4c783b43, 0xb4ebd830, 0x01180a73, 0x00000000, 0x900001f0 + ], + FinalRegs = [0x0080fb0e, 0x005002e4, 0x00000000, 0x00000024, 0x00000000, 0x011021db, 0x0000003d, 0x0ffb8000, 0x0001470c, 0xfff80698, 0x00000003, 0x4c784f07, 0xb4ebd7a0, 0x01101e0b, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x4139, 0x0239, 0x4470, 0x43b0, 0xa91a, 0xb068, 0x1c4a, 0x2666, 0x43c6, 0xa8cd, 0x4184, 0xbafc, 0xb29e, 0x42dd, 0x1781, 0x4033, 0x35f4, 0x31c2, 0xa3f5, 0xbf3a, 0x1884, 0xbafc, 0x424b, 0x42ab, 0x0955, 0x432a, 0x43f5, 0x410f, 0x4694, 0x401b, 0x41c7, 0xb058, 0x419f, 0x41f2, 0xb2fc, 0x1fd1, 0x464b, 0xbfb0, 0x41c5, 0x2b5f, 0x4330, 0x4152, 0xbfbf, 0xbf70, 0x43fb, 0x0114, 0x439b, 0x4376, 0x35bb, 0xa42b, 0x4130, 0x25df, 0x2ee3, 0x42a8, 0x4128, 0x42df, 0x4220, 0x43ec, 0x2ecd, 0xb291, 0xbf4f, 0xab48, 0x41da, 0x4198, 0x4214, 0x40c7, 0x3fb9, 0x424e, 0x414e, 0x01e3, 0x379f, 0x44b2, 0x4166, 0x42e8, 0x4208, 0xb2aa, 0xbf6f, 0xb05e, 0x40da, 0x463a, 0x193e, 0x42ef, 0x40ed, 0x1cc4, 0x4272, 0x1550, 0x42b1, 0x3bbb, 0x227a, 0x449c, 0x42b0, 0x41bf, 0xa310, 0xb0a6, 0x439e, 0x42a2, 0x4392, 0xbf1d, 0x2af5, 0xb2b1, 0x426b, 0x43dd, 0x4204, 0x466b, 0xb060, 0xbac4, 0xb0d2, 0x4320, 0x4006, 0x4303, 0xbf83, 0xa242, 0x42e1, 0xba65, 0xa4c1, 0xbfe0, 0xb26a, 0x3dc0, 0x1e3f, 0x423d, 0x439e, 0xba4e, 0xab3b, 0xba29, 0x4606, 0x41f2, 0xbac9, 0xb23d, 0xaac3, 0x19e2, 0xbf78, 0x1ad9, 0x4089, 0xba78, 0x46a3, 0xa084, 0xb27c, 0xbf72, 0x1439, 0x4000, 0xb275, 0x40cc, 0x4252, 0xbf7b, 0xbad4, 0x43d2, 0x1ce1, 0x4562, 0xb20b, 0x2fbd, 0xbadd, 0xba61, 0x2a48, 0x405a, 0x4343, 0xbf42, 0xb233, 0x4261, 0x423a, 0x42d4, 0x4330, 0x46f2, 0xbaf3, 0xb240, 0xba69, 0xba78, 0x091c, 0xb296, 0xbae4, 0x2223, 0x40f9, 0x42db, 0x1838, 0xb21f, 0x03b3, 0x43a0, 0xb2eb, 0xbf0f, 0x42ac, 0xb22e, 0xb013, 0xa332, 0xb2d0, 0xb271, 0x110f, 0x2fc7, 0x4668, 0x43dc, 0x41ef, 0x3a07, 0xbacf, 0x4158, 0x4129, 0x00ac, 0xb254, 0x416a, 0x4312, 0xad39, 0x4070, 0x1d12, 0x43e3, 0xaf2e, 0xb2fb, 0x250c, 0xa0c5, 0xbf96, 0x3811, 0x43a2, 0xa7d3, 0x1a37, 0x41b5, 0x414d, 0x43b6, 0xbacc, 0xa587, 0xbf35, 0x1ea8, 0x3706, 0xb0d5, 0x42f9, 0x405f, 0x426e, 0x1c33, 0x4369, 0xb01e, 0x4611, 0xa7cc, 0xbf9d, 0x1e4f, 0x1939, 0xbfe0, 0x43e7, 0x445d, 0xbfbc, 0x4146, 0x4093, 0xb255, 0x0325, 0x42bf, 0xbfe1, 0x45cb, 0x1a8f, 0xb2ca, 0x1912, 0x007c, 0xba33, 0x3771, 0x4355, 0xaa43, 0xbf00, 0xbad0, 0xbf93, 0x1e05, 0x1bb5, 0xb28c, 0x296d, 0xbf9c, 0xafa4, 0xb2e5, 0x4672, 0xbf27, 0xba7a, 0x419e, 0x4047, 0x4025, 0xb238, 0x4046, 0xb211, 0x3e6a, 0x4058, 0xbf32, 0x45c6, 0x3629, 0x42f1, 0x41da, 0xb2c1, 0x4441, 0x412d, 0xb09f, 0x43d8, 0x41c0, 0x40cb, 0x25d4, 0xa604, 0xa1e9, 0xb2b3, 0x42a5, 0x42c7, 0xb223, 0xb2f4, 0x403d, 0x41f9, 0x417e, 0xbf90, 0xbf3c, 0x1adc, 0x41c3, 0x0b57, 0xa98b, 0xace1, 0x19d8, 0x42bc, 0x141e, 0xbfb6, 0xb0bf, 0xba07, 0x425b, 0x3db1, 0x4186, 0x4052, 0x42c9, 0x114a, 0xb2c7, 0x4461, 0xbac5, 0x40f0, 0xa656, 0xa678, 0xb2a0, 0x1fdb, 0x186e, 0x4549, 0xb0c9, 0x2198, 0xb048, 0x4316, 0xa29b, 0xb2df, 0xb269, 0x1cf6, 0xbf8a, 0x418e, 0x012f, 0x1ff4, 0xb060, 0xad7c, 0x42a8, 0x42dd, 0x420e, 0x4153, 0xae8b, 0x03f1, 0x439f, 0x41f3, 0xbf83, 0x1395, 0xb281, 0x41f3, 0x19e3, 0x4002, 0x2ac4, 0x3a17, 0x4225, 0x4007, 0x4201, 0x45b4, 0xb29c, 0x410f, 0xa3ad, 0x43d4, 0xb2b9, 0x1d09, 0xb082, 0x4335, 0xbf58, 0xb297, 0xb0c3, 0x4240, 0xba79, 0xb230, 0xba2a, 0xbf57, 0xb0a6, 0xa975, 0x1f5b, 0x42e8, 0x190f, 0xbfc3, 0x420a, 0xb21a, 0x2c87, 0x417e, 0xbfe0, 0x40b1, 0x339a, 0x2f4c, 0x4353, 0x1b7c, 0x4349, 0x4335, 0x41c6, 0x4283, 0xa0bc, 0xa2da, 0x413b, 0x42c5, 0xbf8b, 0x4572, 0x061e, 0xbf90, 0x4159, 0xb280, 0xb0ef, 0x204a, 0x1dfe, 0x068c, 0x4122, 0x43be, 0x4286, 0xba1e, 0x4333, 0xb272, 0xa671, 0x4002, 0x42ed, 0x14b2, 0x32d9, 0xbf2c, 0x358d, 0x4615, 0x410b, 0x3ecd, 0xb223, 0x2f09, 0x1b6c, 0xbf2c, 0xbae5, 0x1cee, 0xb2fe, 0x42ea, 0xb045, 0x41ca, 0x4016, 0x10c6, 0x0828, 0xabe4, 0x123d, 0xa82a, 0xb04d, 0x45b0, 0xbfb0, 0x4118, 0xba15, 0x442d, 0x4098, 0x2145, 0x1a40, 0x1935, 0x394e, 0x45c2, 0xbf19, 0x402e, 0xb2ba, 0x42cb, 0x40d9, 0x4193, 0x41e8, 0x4261, 0x167e, 0xbad3, 0xbf1a, 0xb24d, 0x09c9, 0xb27f, 0x0295, 0x417d, 0x4362, 0x40a0, 0x4636, 0xba62, 0x2a28, 0x405d, 0x1ac1, 0x2e7e, 0x4027, 0x4222, 0xba7d, 0x429c, 0x40d6, 0x424b, 0x4430, 0xb042, 0xa73d, 0x406e, 0x3722, 0xb2a9, 0x4014, 0x44b1, 0xbfac, 0x4035, 0x4326, 0x0c54, 0x4007, 0xba2c, 0x43a7, 0x4333, 0x4092, 0xa7c2, 0xbf01, 0x27cb, 0xb047, 0x1a86, 0xbade, 0xb2b7, 0x2147, 0x0e71, 0xb295, 0xba38, 0x4388, 0x159c, 0x416b, 0xba1a, 0xb0d2, 0x0162, 0xba33, 0x40cd, 0x465c, 0x420f, 0x368f, 0x42bf, 0xbf60, 0x40f3, 0x4002, 0x0fed, 0x4165, 0x415c, 0xba29, 0xbfcd, 0x42b2, 0x40d4, 0xb0ac, 0x43f7, 0x12b0, 0x416d, 0x2be8, 0x4103, 0x408e, 0x43e6, 0x40d5, 0x427a, 0xba11, 0x1c74, 0x40b9, 0x4066, 0x4254, 0x4081, 0x2821, 0x4003, 0x44ab, 0x431a, 0x4282, 0x4569, 0x2f84, 0xb2ef, 0x4340, 0xb218, 0xbf8f, 0xb024, 0x1c87, 0x289f, 0x43d9, 0xba0a, 0x421d, 0x44f0, 0x42a2, 0x41b4, 0xa51b, 0x1c28, 0xa535, 0x40cb, 0x44b9, 0x40ed, 0x0bbe, 0x413e, 0x1eb8, 0x41ad, 0x1dac, 0x3f25, 0xb0ec, 0x12e7, 0xab9a, 0xbf77, 0xbae9, 0x1b49, 0x40a5, 0x40d7, 0x4392, 0x43e6, 0x190e, 0x40b0, 0xb2dc, 0x425f, 0x41ad, 0x10b1, 0x40f4, 0x43b7, 0x4037, 0xb03c, 0x1a72, 0x407b, 0xba50, 0x466e, 0xbf11, 0xbad4, 0xa393, 0xaa42, 0x41c5, 0x413c, 0x410a, 0xba1f, 0xba17, 0x41f4, 0x2138, 0xbfe0, 0x1ace, 0xba65, 0x40cc, 0x44e1, 0x1646, 0x4228, 0x43b7, 0xa7cf, 0x4160, 0xbfa8, 0xba18, 0x43f1, 0x1ed8, 0x4355, 0x2fce, 0xbacb, 0x41c5, 0x42c2, 0x44f8, 0x1f13, 0xbf5f, 0xaa2a, 0xb2fd, 0x1405, 0x25d1, 0xa644, 0x4134, 0x4280, 0x19f2, 0x0a34, 0x1b5e, 0x4137, 0xba1e, 0xba4c, 0x424c, 0x43d3, 0xb062, 0xb2b4, 0x43c3, 0x42a4, 0xb200, 0x4219, 0x4646, 0xa445, 0x4248, 0xbfe0, 0xbf05, 0x415f, 0x1832, 0x439d, 0xaaa6, 0xb234, 0x43b7, 0xb01a, 0xba02, 0x1f57, 0x43c9, 0x46c0, 0x4558, 0x4116, 0x1707, 0xb0b8, 0xbfc0, 0x41c0, 0x4032, 0x112c, 0x44e4, 0x4290, 0x04f6, 0xa289, 0x4226, 0x43bb, 0x1ee1, 0x434e, 0xbf66, 0x4210, 0x425f, 0xa705, 0x1aff, 0x31fd, 0xbf0e, 0x4295, 0x4107, 0xb283, 0x4067, 0x1dec, 0xb0b8, 0xb089, 0x2a04, 0x4172, 0xbfc0, 0x4217, 0xb2ea, 0x41a8, 0x41a2, 0x1610, 0x4294, 0xb016, 0x406e, 0x4281, 0x42a7, 0x1f7a, 0x1866, 0x4047, 0x4672, 0x20bc, 0x420b, 0x198a, 0xbf8a, 0x43f3, 0x3aed, 0xbfb0, 0x4612, 0x408c, 0x43e6, 0x0f02, 0x4214, 0xbfb5, 0xae8e, 0x408a, 0x41d9, 0x02f0, 0x341b, 0xb07d, 0x413b, 0xb0d9, 0xb2c5, 0x42f0, 0xb2f4, 0xba45, 0xa723, 0x42f1, 0x19aa, 0x4005, 0xb00b, 0x42ec, 0x4239, 0x43c4, 0x40ed, 0xaaa1, 0x1ff0, 0x4215, 0xb005, 0x414d, 0xb037, 0x43d1, 0xbf5b, 0xb24a, 0xb2cc, 0xb0e1, 0xb25e, 0x4298, 0x427a, 0xb0e5, 0x42be, 0x1cf1, 0x43b3, 0xb0b9, 0x4242, 0xbf0b, 0x435b, 0x14c6, 0x43d8, 0xb2e2, 0x414c, 0x4165, 0xad8d, 0xb2f3, 0xb053, 0x42a1, 0x4301, 0xa3c4, 0x43fe, 0x2e37, 0xb019, 0x4112, 0xba58, 0x40c9, 0x4204, 0x1870, 0x4592, 0x4360, 0x24a0, 0x42ab, 0x4066, 0x404b, 0x4144, 0x4252, 0x422c, 0xbfa5, 0x1caa, 0x02c7, 0x09fa, 0x4364, 0x43fe, 0x3b92, 0x4616, 0x4376, 0x1be2, 0x40ee, 0x34a4, 0x2c90, 0xba42, 0x42de, 0x435b, 0xb272, 0x413d, 0x1f64, 0x4099, 0x42b2, 0x43bb, 0x43fb, 0xbfd1, 0xba53, 0xb067, 0x42a2, 0x0f18, 0x43cc, 0x1f8e, 0x1dfe, 0xb28b, 0xbad5, 0x188f, 0x4363, 0x4299, 0x12b3, 0x0831, 0x41fb, 0x40fd, 0xbfa9, 0xba30, 0x4183, 0x42ad, 0x40b2, 0x418b, 0x42ea, 0xb0fb, 0x42aa, 0x42df, 0x1f34, 0x0bd2, 0x3df7, 0xb215, 0xba60, 0xb28d, 0x30e7, 0xb2a0, 0x4567, 0x42a8, 0xbfc3, 0xb0a0, 0x41c7, 0x0f8a, 0x16a1, 0x4168, 0x445e, 0xb236, 0x4271, 0xbf39, 0x4312, 0xbad2, 0x42e4, 0x1cb2, 0xb2c7, 0xbaee, 0x431c, 0x42dd, 0x42f2, 0xb262, 0x403a, 0x1dfb, 0x4330, 0x36a0, 0xba46, 0xb224, 0xbf56, 0x1b15, 0x3160, 0x40e6, 0xb025, 0x1390, 0x42a7, 0x078b, 0x4263, 0x141e, 0x0633, 0x4281, 0x40f5, 0x422b, 0x45f1, 0xba2b, 0x1a8a, 0x41a8, 0xb275, 0xb2a3, 0xb22a, 0xbf7a, 0x4540, 0x43da, 0x42da, 0xaa06, 0xb284, 0x3f4f, 0x42ae, 0x40a2, 0xbfb1, 0x4382, 0xbaf0, 0x1db0, 0x43af, 0x0b87, 0x433d, 0x461a, 0x2502, 0xb234, 0x3130, 0xb2b7, 0x43d2, 0xba2f, 0x37df, 0x3ab5, 0xafcb, 0x0f62, 0x46f8, 0x404f, 0x4560, 0x43fd, 0xbf59, 0x4237, 0x414e, 0x3b8d, 0x43e4, 0x4370, 0x2d12, 0xbf2b, 0x42cd, 0xba1a, 0xb2f9, 0xb2b0, 0xb0ea, 0xbac2, 0xb284, 0xaa89, 0x4041, 0x22ca, 0xb229, 0xafec, 0x438d, 0xbae3, 0x4314, 0x0739, 0xb229, 0xb2f4, 0xbf45, 0x189c, 0x43db, 0x4116, 0x409d, 0xb2b0, 0x4227, 0xb297, 0x469b, 0x31d0, 0x2360, 0x462f, 0xbacf, 0x4277, 0x305e, 0x2d0f, 0x381c, 0xbfcf, 0xb2f4, 0x42db, 0x435f, 0x3aaa, 0xb0ee, 0x44f4, 0x1b64, 0x4372, 0xb284, 0x40cd, 0x46d4, 0x13bf, 0xba5d, 0x4092, 0xba52, 0x41e2, 0x1dc6, 0xbf7d, 0x1eb2, 0x2606, 0x401f, 0x1d2f, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xb856fb9b, 0x192a6db9, 0x8500700e, 0x51377f3b, 0xcf8d1a8e, 0xeb924976, 0xf20bcc21, 0xd216b99a, 0xee51a075, 0x8bdc3aa5, 0x4c0f0144, 0xdedd3f79, 0xfe5590cd, 0x20762c18, 0x00000000, 0x600001f0 }, - FinalRegs = new uint[] { 0x00010041, 0x000000d0, 0x00010046, 0x00000060, 0x00000041, 0x00006000, 0x00000006, 0x00000000, 0x00001756, 0xad5388b8, 0x00000000, 0x000058ca, 0x00000000, 0x20762a7c, 0x00000000, 0x000001d0 }, + Instructions = [0x4139, 0x0239, 0x4470, 0x43b0, 0xa91a, 0xb068, 0x1c4a, 0x2666, 0x43c6, 0xa8cd, 0x4184, 0xbafc, 0xb29e, 0x42dd, 0x1781, 0x4033, 0x35f4, 0x31c2, 0xa3f5, 0xbf3a, 0x1884, 0xbafc, 0x424b, 0x42ab, 0x0955, 0x432a, 0x43f5, 0x410f, 0x4694, 0x401b, 0x41c7, 0xb058, 0x419f, 0x41f2, 0xb2fc, 0x1fd1, 0x464b, 0xbfb0, 0x41c5, 0x2b5f, 0x4330, 0x4152, 0xbfbf, 0xbf70, 0x43fb, 0x0114, 0x439b, 0x4376, 0x35bb, 0xa42b, 0x4130, 0x25df, 0x2ee3, 0x42a8, 0x4128, 0x42df, 0x4220, 0x43ec, 0x2ecd, 0xb291, 0xbf4f, 0xab48, 0x41da, 0x4198, 0x4214, 0x40c7, 0x3fb9, 0x424e, 0x414e, 0x01e3, 0x379f, 0x44b2, 0x4166, 0x42e8, 0x4208, 0xb2aa, 0xbf6f, 0xb05e, 0x40da, 0x463a, 0x193e, 0x42ef, 0x40ed, 0x1cc4, 0x4272, 0x1550, 0x42b1, 0x3bbb, 0x227a, 0x449c, 0x42b0, 0x41bf, 0xa310, 0xb0a6, 0x439e, 0x42a2, 0x4392, 0xbf1d, 0x2af5, 0xb2b1, 0x426b, 0x43dd, 0x4204, 0x466b, 0xb060, 0xbac4, 0xb0d2, 0x4320, 0x4006, 0x4303, 0xbf83, 0xa242, 0x42e1, 0xba65, 0xa4c1, 0xbfe0, 0xb26a, 0x3dc0, 0x1e3f, 0x423d, 0x439e, 0xba4e, 0xab3b, 0xba29, 0x4606, 0x41f2, 0xbac9, 0xb23d, 0xaac3, 0x19e2, 0xbf78, 0x1ad9, 0x4089, 0xba78, 0x46a3, 0xa084, 0xb27c, 0xbf72, 0x1439, 0x4000, 0xb275, 0x40cc, 0x4252, 0xbf7b, 0xbad4, 0x43d2, 0x1ce1, 0x4562, 0xb20b, 0x2fbd, 0xbadd, 0xba61, 0x2a48, 0x405a, 0x4343, 0xbf42, 0xb233, 0x4261, 0x423a, 0x42d4, 0x4330, 0x46f2, 0xbaf3, 0xb240, 0xba69, 0xba78, 0x091c, 0xb296, 0xbae4, 0x2223, 0x40f9, 0x42db, 0x1838, 0xb21f, 0x03b3, 0x43a0, 0xb2eb, 0xbf0f, 0x42ac, 0xb22e, 0xb013, 0xa332, 0xb2d0, 0xb271, 0x110f, 0x2fc7, 0x4668, 0x43dc, 0x41ef, 0x3a07, 0xbacf, 0x4158, 0x4129, 0x00ac, 0xb254, 0x416a, 0x4312, 0xad39, 0x4070, 0x1d12, 0x43e3, 0xaf2e, 0xb2fb, 0x250c, 0xa0c5, 0xbf96, 0x3811, 0x43a2, 0xa7d3, 0x1a37, 0x41b5, 0x414d, 0x43b6, 0xbacc, 0xa587, 0xbf35, 0x1ea8, 0x3706, 0xb0d5, 0x42f9, 0x405f, 0x426e, 0x1c33, 0x4369, 0xb01e, 0x4611, 0xa7cc, 0xbf9d, 0x1e4f, 0x1939, 0xbfe0, 0x43e7, 0x445d, 0xbfbc, 0x4146, 0x4093, 0xb255, 0x0325, 0x42bf, 0xbfe1, 0x45cb, 0x1a8f, 0xb2ca, 0x1912, 0x007c, 0xba33, 0x3771, 0x4355, 0xaa43, 0xbf00, 0xbad0, 0xbf93, 0x1e05, 0x1bb5, 0xb28c, 0x296d, 0xbf9c, 0xafa4, 0xb2e5, 0x4672, 0xbf27, 0xba7a, 0x419e, 0x4047, 0x4025, 0xb238, 0x4046, 0xb211, 0x3e6a, 0x4058, 0xbf32, 0x45c6, 0x3629, 0x42f1, 0x41da, 0xb2c1, 0x4441, 0x412d, 0xb09f, 0x43d8, 0x41c0, 0x40cb, 0x25d4, 0xa604, 0xa1e9, 0xb2b3, 0x42a5, 0x42c7, 0xb223, 0xb2f4, 0x403d, 0x41f9, 0x417e, 0xbf90, 0xbf3c, 0x1adc, 0x41c3, 0x0b57, 0xa98b, 0xace1, 0x19d8, 0x42bc, 0x141e, 0xbfb6, 0xb0bf, 0xba07, 0x425b, 0x3db1, 0x4186, 0x4052, 0x42c9, 0x114a, 0xb2c7, 0x4461, 0xbac5, 0x40f0, 0xa656, 0xa678, 0xb2a0, 0x1fdb, 0x186e, 0x4549, 0xb0c9, 0x2198, 0xb048, 0x4316, 0xa29b, 0xb2df, 0xb269, 0x1cf6, 0xbf8a, 0x418e, 0x012f, 0x1ff4, 0xb060, 0xad7c, 0x42a8, 0x42dd, 0x420e, 0x4153, 0xae8b, 0x03f1, 0x439f, 0x41f3, 0xbf83, 0x1395, 0xb281, 0x41f3, 0x19e3, 0x4002, 0x2ac4, 0x3a17, 0x4225, 0x4007, 0x4201, 0x45b4, 0xb29c, 0x410f, 0xa3ad, 0x43d4, 0xb2b9, 0x1d09, 0xb082, 0x4335, 0xbf58, 0xb297, 0xb0c3, 0x4240, 0xba79, 0xb230, 0xba2a, 0xbf57, 0xb0a6, 0xa975, 0x1f5b, 0x42e8, 0x190f, 0xbfc3, 0x420a, 0xb21a, 0x2c87, 0x417e, 0xbfe0, 0x40b1, 0x339a, 0x2f4c, 0x4353, 0x1b7c, 0x4349, 0x4335, 0x41c6, 0x4283, 0xa0bc, 0xa2da, 0x413b, 0x42c5, 0xbf8b, 0x4572, 0x061e, 0xbf90, 0x4159, 0xb280, 0xb0ef, 0x204a, 0x1dfe, 0x068c, 0x4122, 0x43be, 0x4286, 0xba1e, 0x4333, 0xb272, 0xa671, 0x4002, 0x42ed, 0x14b2, 0x32d9, 0xbf2c, 0x358d, 0x4615, 0x410b, 0x3ecd, 0xb223, 0x2f09, 0x1b6c, 0xbf2c, 0xbae5, 0x1cee, 0xb2fe, 0x42ea, 0xb045, 0x41ca, 0x4016, 0x10c6, 0x0828, 0xabe4, 0x123d, 0xa82a, 0xb04d, 0x45b0, 0xbfb0, 0x4118, 0xba15, 0x442d, 0x4098, 0x2145, 0x1a40, 0x1935, 0x394e, 0x45c2, 0xbf19, 0x402e, 0xb2ba, 0x42cb, 0x40d9, 0x4193, 0x41e8, 0x4261, 0x167e, 0xbad3, 0xbf1a, 0xb24d, 0x09c9, 0xb27f, 0x0295, 0x417d, 0x4362, 0x40a0, 0x4636, 0xba62, 0x2a28, 0x405d, 0x1ac1, 0x2e7e, 0x4027, 0x4222, 0xba7d, 0x429c, 0x40d6, 0x424b, 0x4430, 0xb042, 0xa73d, 0x406e, 0x3722, 0xb2a9, 0x4014, 0x44b1, 0xbfac, 0x4035, 0x4326, 0x0c54, 0x4007, 0xba2c, 0x43a7, 0x4333, 0x4092, 0xa7c2, 0xbf01, 0x27cb, 0xb047, 0x1a86, 0xbade, 0xb2b7, 0x2147, 0x0e71, 0xb295, 0xba38, 0x4388, 0x159c, 0x416b, 0xba1a, 0xb0d2, 0x0162, 0xba33, 0x40cd, 0x465c, 0x420f, 0x368f, 0x42bf, 0xbf60, 0x40f3, 0x4002, 0x0fed, 0x4165, 0x415c, 0xba29, 0xbfcd, 0x42b2, 0x40d4, 0xb0ac, 0x43f7, 0x12b0, 0x416d, 0x2be8, 0x4103, 0x408e, 0x43e6, 0x40d5, 0x427a, 0xba11, 0x1c74, 0x40b9, 0x4066, 0x4254, 0x4081, 0x2821, 0x4003, 0x44ab, 0x431a, 0x4282, 0x4569, 0x2f84, 0xb2ef, 0x4340, 0xb218, 0xbf8f, 0xb024, 0x1c87, 0x289f, 0x43d9, 0xba0a, 0x421d, 0x44f0, 0x42a2, 0x41b4, 0xa51b, 0x1c28, 0xa535, 0x40cb, 0x44b9, 0x40ed, 0x0bbe, 0x413e, 0x1eb8, 0x41ad, 0x1dac, 0x3f25, 0xb0ec, 0x12e7, 0xab9a, 0xbf77, 0xbae9, 0x1b49, 0x40a5, 0x40d7, 0x4392, 0x43e6, 0x190e, 0x40b0, 0xb2dc, 0x425f, 0x41ad, 0x10b1, 0x40f4, 0x43b7, 0x4037, 0xb03c, 0x1a72, 0x407b, 0xba50, 0x466e, 0xbf11, 0xbad4, 0xa393, 0xaa42, 0x41c5, 0x413c, 0x410a, 0xba1f, 0xba17, 0x41f4, 0x2138, 0xbfe0, 0x1ace, 0xba65, 0x40cc, 0x44e1, 0x1646, 0x4228, 0x43b7, 0xa7cf, 0x4160, 0xbfa8, 0xba18, 0x43f1, 0x1ed8, 0x4355, 0x2fce, 0xbacb, 0x41c5, 0x42c2, 0x44f8, 0x1f13, 0xbf5f, 0xaa2a, 0xb2fd, 0x1405, 0x25d1, 0xa644, 0x4134, 0x4280, 0x19f2, 0x0a34, 0x1b5e, 0x4137, 0xba1e, 0xba4c, 0x424c, 0x43d3, 0xb062, 0xb2b4, 0x43c3, 0x42a4, 0xb200, 0x4219, 0x4646, 0xa445, 0x4248, 0xbfe0, 0xbf05, 0x415f, 0x1832, 0x439d, 0xaaa6, 0xb234, 0x43b7, 0xb01a, 0xba02, 0x1f57, 0x43c9, 0x46c0, 0x4558, 0x4116, 0x1707, 0xb0b8, 0xbfc0, 0x41c0, 0x4032, 0x112c, 0x44e4, 0x4290, 0x04f6, 0xa289, 0x4226, 0x43bb, 0x1ee1, 0x434e, 0xbf66, 0x4210, 0x425f, 0xa705, 0x1aff, 0x31fd, 0xbf0e, 0x4295, 0x4107, 0xb283, 0x4067, 0x1dec, 0xb0b8, 0xb089, 0x2a04, 0x4172, 0xbfc0, 0x4217, 0xb2ea, 0x41a8, 0x41a2, 0x1610, 0x4294, 0xb016, 0x406e, 0x4281, 0x42a7, 0x1f7a, 0x1866, 0x4047, 0x4672, 0x20bc, 0x420b, 0x198a, 0xbf8a, 0x43f3, 0x3aed, 0xbfb0, 0x4612, 0x408c, 0x43e6, 0x0f02, 0x4214, 0xbfb5, 0xae8e, 0x408a, 0x41d9, 0x02f0, 0x341b, 0xb07d, 0x413b, 0xb0d9, 0xb2c5, 0x42f0, 0xb2f4, 0xba45, 0xa723, 0x42f1, 0x19aa, 0x4005, 0xb00b, 0x42ec, 0x4239, 0x43c4, 0x40ed, 0xaaa1, 0x1ff0, 0x4215, 0xb005, 0x414d, 0xb037, 0x43d1, 0xbf5b, 0xb24a, 0xb2cc, 0xb0e1, 0xb25e, 0x4298, 0x427a, 0xb0e5, 0x42be, 0x1cf1, 0x43b3, 0xb0b9, 0x4242, 0xbf0b, 0x435b, 0x14c6, 0x43d8, 0xb2e2, 0x414c, 0x4165, 0xad8d, 0xb2f3, 0xb053, 0x42a1, 0x4301, 0xa3c4, 0x43fe, 0x2e37, 0xb019, 0x4112, 0xba58, 0x40c9, 0x4204, 0x1870, 0x4592, 0x4360, 0x24a0, 0x42ab, 0x4066, 0x404b, 0x4144, 0x4252, 0x422c, 0xbfa5, 0x1caa, 0x02c7, 0x09fa, 0x4364, 0x43fe, 0x3b92, 0x4616, 0x4376, 0x1be2, 0x40ee, 0x34a4, 0x2c90, 0xba42, 0x42de, 0x435b, 0xb272, 0x413d, 0x1f64, 0x4099, 0x42b2, 0x43bb, 0x43fb, 0xbfd1, 0xba53, 0xb067, 0x42a2, 0x0f18, 0x43cc, 0x1f8e, 0x1dfe, 0xb28b, 0xbad5, 0x188f, 0x4363, 0x4299, 0x12b3, 0x0831, 0x41fb, 0x40fd, 0xbfa9, 0xba30, 0x4183, 0x42ad, 0x40b2, 0x418b, 0x42ea, 0xb0fb, 0x42aa, 0x42df, 0x1f34, 0x0bd2, 0x3df7, 0xb215, 0xba60, 0xb28d, 0x30e7, 0xb2a0, 0x4567, 0x42a8, 0xbfc3, 0xb0a0, 0x41c7, 0x0f8a, 0x16a1, 0x4168, 0x445e, 0xb236, 0x4271, 0xbf39, 0x4312, 0xbad2, 0x42e4, 0x1cb2, 0xb2c7, 0xbaee, 0x431c, 0x42dd, 0x42f2, 0xb262, 0x403a, 0x1dfb, 0x4330, 0x36a0, 0xba46, 0xb224, 0xbf56, 0x1b15, 0x3160, 0x40e6, 0xb025, 0x1390, 0x42a7, 0x078b, 0x4263, 0x141e, 0x0633, 0x4281, 0x40f5, 0x422b, 0x45f1, 0xba2b, 0x1a8a, 0x41a8, 0xb275, 0xb2a3, 0xb22a, 0xbf7a, 0x4540, 0x43da, 0x42da, 0xaa06, 0xb284, 0x3f4f, 0x42ae, 0x40a2, 0xbfb1, 0x4382, 0xbaf0, 0x1db0, 0x43af, 0x0b87, 0x433d, 0x461a, 0x2502, 0xb234, 0x3130, 0xb2b7, 0x43d2, 0xba2f, 0x37df, 0x3ab5, 0xafcb, 0x0f62, 0x46f8, 0x404f, 0x4560, 0x43fd, 0xbf59, 0x4237, 0x414e, 0x3b8d, 0x43e4, 0x4370, 0x2d12, 0xbf2b, 0x42cd, 0xba1a, 0xb2f9, 0xb2b0, 0xb0ea, 0xbac2, 0xb284, 0xaa89, 0x4041, 0x22ca, 0xb229, 0xafec, 0x438d, 0xbae3, 0x4314, 0x0739, 0xb229, 0xb2f4, 0xbf45, 0x189c, 0x43db, 0x4116, 0x409d, 0xb2b0, 0x4227, 0xb297, 0x469b, 0x31d0, 0x2360, 0x462f, 0xbacf, 0x4277, 0x305e, 0x2d0f, 0x381c, 0xbfcf, 0xb2f4, 0x42db, 0x435f, 0x3aaa, 0xb0ee, 0x44f4, 0x1b64, 0x4372, 0xb284, 0x40cd, 0x46d4, 0x13bf, 0xba5d, 0x4092, 0xba52, 0x41e2, 0x1dc6, 0xbf7d, 0x1eb2, 0x2606, 0x401f, 0x1d2f, 0x4770, 0xe7fe + ], + StartRegs = [0xb856fb9b, 0x192a6db9, 0x8500700e, 0x51377f3b, 0xcf8d1a8e, 0xeb924976, 0xf20bcc21, 0xd216b99a, 0xee51a075, 0x8bdc3aa5, 0x4c0f0144, 0xdedd3f79, 0xfe5590cd, 0x20762c18, 0x00000000, 0x600001f0 + ], + FinalRegs = [0x00010041, 0x000000d0, 0x00010046, 0x00000060, 0x00000041, 0x00006000, 0x00000006, 0x00000000, 0x00001756, 0xad5388b8, 0x00000000, 0x000058ca, 0x00000000, 0x20762a7c, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x404c, 0x424a, 0x2986, 0xb245, 0x4373, 0x4073, 0x4006, 0x41df, 0x02dc, 0x3691, 0x42c5, 0xb2bf, 0x4020, 0x422c, 0x396a, 0xa360, 0xbf6f, 0x1d2b, 0x2d8e, 0x1815, 0x42f8, 0x41e0, 0x0084, 0x42c0, 0x43a4, 0x3d65, 0x11d0, 0xb2ee, 0x21d7, 0xbf8b, 0x3e83, 0x406a, 0x42ba, 0x4370, 0x446d, 0x3c88, 0x0c4e, 0x3ac9, 0x4284, 0xb2a9, 0x3c89, 0xb21a, 0x42df, 0x43e9, 0x4079, 0x1879, 0x40ea, 0xbafd, 0x435f, 0x40c2, 0x2c52, 0xba2c, 0xba4d, 0x45ba, 0xb288, 0x4228, 0x40cd, 0xbf67, 0x4092, 0x41bf, 0xba76, 0xb25f, 0x1c56, 0xb23c, 0xba28, 0x4063, 0x4083, 0xba20, 0xbad0, 0x40c5, 0xb245, 0xba73, 0x37df, 0x405d, 0x3e0c, 0xba79, 0xb241, 0x425a, 0x40c9, 0x4031, 0xb2b4, 0x4288, 0x4333, 0xbf95, 0xb20d, 0x42d8, 0xb0e6, 0x41c3, 0xbad8, 0x417b, 0x1c10, 0x030e, 0x403c, 0xb0e2, 0x12a0, 0x4451, 0x420b, 0xb20c, 0x3174, 0xbf60, 0xbada, 0xb2fd, 0xbf4a, 0xb22e, 0xb0ea, 0x19bf, 0x41cd, 0xbfbc, 0x412a, 0xba0d, 0xba38, 0x4092, 0x42af, 0x1db0, 0x41b5, 0xb281, 0x4059, 0xba6f, 0x410d, 0x4421, 0x410a, 0xa37d, 0xb289, 0x2b11, 0xad56, 0x383f, 0xb20c, 0xbfb3, 0x428f, 0x1f82, 0xba34, 0xb0ef, 0x1c73, 0x401e, 0xba6a, 0x40c8, 0x4554, 0xb0b6, 0x1d62, 0xb092, 0xb000, 0xbf7c, 0x40c0, 0x3aca, 0x1db0, 0x4124, 0x461c, 0xba2f, 0x1a4d, 0x1f44, 0xbfd9, 0x33dc, 0xb2c9, 0x41fe, 0x1921, 0xba75, 0x40ea, 0x424e, 0x43ca, 0xa25a, 0x423e, 0x4175, 0x410a, 0x41e1, 0x41c2, 0xbfca, 0x1f2c, 0xb2ce, 0xae78, 0xb262, 0x4045, 0x4287, 0xb24e, 0x1d5e, 0x4092, 0x2e56, 0xbacd, 0x400e, 0xba42, 0x40f4, 0xbafd, 0x4482, 0x40fc, 0x2f63, 0xb01c, 0x408d, 0x4008, 0x4250, 0xa846, 0xb2a7, 0x376b, 0xb012, 0xbad0, 0xbf7c, 0x4382, 0xb23e, 0x414c, 0x4091, 0xb0ab, 0x40fe, 0x4076, 0x458c, 0xa397, 0x445a, 0xb267, 0x43d7, 0x42c5, 0xa924, 0x41c9, 0x431d, 0x4207, 0x4182, 0x4012, 0x0c79, 0xb26a, 0x1b23, 0xabb2, 0x40df, 0xbf4a, 0x27b0, 0x4467, 0xa236, 0xba10, 0x4386, 0x42c2, 0x41d5, 0x4665, 0x41bb, 0x41d0, 0xba31, 0x4388, 0x1d9c, 0x2d56, 0x420d, 0x432e, 0xba31, 0x1d22, 0x4428, 0x419b, 0x1cd7, 0xb081, 0x4327, 0x4162, 0x42d8, 0x1947, 0xbf2c, 0x43cb, 0xb250, 0x4012, 0x3734, 0x4214, 0xa5bb, 0x4611, 0xba60, 0x2aed, 0xba05, 0x43a1, 0x431d, 0x0608, 0xbade, 0xa596, 0x4312, 0xb0b8, 0xb249, 0xbf6d, 0x42ac, 0xbfe0, 0x42e8, 0xb284, 0x42cd, 0x380e, 0x405b, 0x42e8, 0xb07d, 0xbad9, 0x43ca, 0x4282, 0xb283, 0x4353, 0x1ca4, 0xba3e, 0x41f3, 0x18a3, 0xb2da, 0x41d5, 0x416a, 0x2f3e, 0x46ec, 0xbf9c, 0x430f, 0x434e, 0xb2dd, 0xb27d, 0x1064, 0x43f0, 0xb2c9, 0x15a6, 0x28ab, 0xa5f9, 0x08db, 0xbfbe, 0x41ed, 0x41f9, 0x4385, 0x4197, 0x0b37, 0x418b, 0x133a, 0xb0f9, 0xba40, 0x434b, 0xb2b2, 0xa303, 0x464d, 0x1c7a, 0xbfe0, 0x46ac, 0x028d, 0x445c, 0xb034, 0xbf4f, 0x1af3, 0x1e0d, 0x4148, 0xaf26, 0xb01e, 0x1575, 0xba61, 0x29a4, 0xb238, 0x40ca, 0xbf5e, 0xab8b, 0x351a, 0x4121, 0xba67, 0xbfd2, 0xacfe, 0xba11, 0x4381, 0x186f, 0x36ef, 0xbae7, 0x1389, 0x1a97, 0x42be, 0x4123, 0x21ca, 0xb2ee, 0xb2b4, 0x463f, 0x2825, 0x449c, 0x4225, 0x4271, 0x1f0c, 0xba51, 0x43c4, 0x4148, 0x017d, 0xbf7b, 0x43e6, 0x41ee, 0xb255, 0x43e6, 0xb048, 0x4033, 0x4282, 0x412e, 0xbae8, 0xaede, 0x4125, 0x41c2, 0x4229, 0xb014, 0x403a, 0xb001, 0xba7c, 0xbada, 0x1dc4, 0x25c1, 0xa5f1, 0x43c5, 0xb293, 0x4011, 0x2dea, 0x1912, 0x43cc, 0xa25f, 0xba41, 0xbfaa, 0x41db, 0x4060, 0x1be4, 0x09de, 0x3dd2, 0x1ca8, 0xb200, 0x460d, 0x4066, 0x02af, 0x432e, 0x1dce, 0xb20f, 0x4468, 0x4058, 0xb037, 0x4137, 0x4158, 0xbf96, 0x39fe, 0x40a2, 0x417e, 0xa421, 0x3a98, 0x12e7, 0x4106, 0xb0fc, 0x2564, 0x40e0, 0xb0a6, 0x0a30, 0x42eb, 0x0ad5, 0x42ec, 0xbacc, 0xbff0, 0x13cc, 0x1bdc, 0x33ae, 0xbf90, 0xba18, 0x42f5, 0xb084, 0x410c, 0x4571, 0xbf94, 0x422b, 0x424b, 0x43a2, 0x433b, 0xba17, 0x1b36, 0x4221, 0x40e2, 0x4247, 0x1e2f, 0x3746, 0x43ef, 0xbf26, 0x1a41, 0x40ae, 0xb2f1, 0x4348, 0x43ce, 0x4128, 0xb27e, 0x400f, 0x41c4, 0xb023, 0x4054, 0x40cb, 0xb260, 0x41c9, 0x3d51, 0x42bf, 0x36f6, 0x1d00, 0x2cc0, 0x412b, 0xbf08, 0x03d1, 0xb280, 0x432e, 0xb0a1, 0xb2d1, 0xa60e, 0xb229, 0x418b, 0xbfe2, 0x438a, 0xba58, 0xa4a8, 0x4393, 0xb2ce, 0xbfd0, 0x447d, 0xb0fc, 0x42c8, 0xba09, 0x43eb, 0xbf42, 0xb24c, 0x19f5, 0x426b, 0xb2a7, 0x1baf, 0x1b6b, 0x4276, 0x0857, 0x22f0, 0xb238, 0x41fc, 0x440b, 0xbf88, 0x2db9, 0x1b79, 0x4117, 0xba00, 0x04c4, 0xbafa, 0x42fa, 0x0f86, 0x439c, 0xa156, 0xb274, 0x4223, 0xbfcf, 0x10c5, 0xb28b, 0x43df, 0x41f3, 0xbf8d, 0x43f8, 0x42b4, 0xb031, 0x0817, 0xb261, 0xbfe0, 0x4137, 0x1da3, 0x404b, 0xbae6, 0xb254, 0x412f, 0xbad5, 0xb295, 0x444e, 0xb28e, 0xb279, 0x406f, 0x45ea, 0xb2db, 0x1d07, 0xbfb3, 0x3b0e, 0x4138, 0x2a53, 0x421f, 0x40bd, 0x43cb, 0x430f, 0x21b6, 0x18d6, 0x43a4, 0xb04e, 0x43a3, 0x420e, 0x467e, 0x4134, 0xb060, 0x44fc, 0x41ed, 0xbff0, 0x43a6, 0x217f, 0xbad4, 0x417d, 0x42e7, 0x3065, 0x1ce3, 0x4016, 0xb218, 0x4219, 0xbf1d, 0x3fb0, 0x2c2e, 0x089c, 0xbaf3, 0x42ef, 0xb26b, 0xbf3d, 0x39ec, 0x4375, 0xb2e2, 0x191e, 0x433f, 0x38b8, 0x4217, 0xb074, 0xb272, 0xbfa4, 0x1bb0, 0x223f, 0xbaf3, 0x4192, 0xba64, 0x4278, 0xbace, 0x01b2, 0x431a, 0xa920, 0x40bf, 0x4498, 0x4331, 0x43fa, 0x4212, 0x41d4, 0x0257, 0x4136, 0x3ca6, 0x4229, 0xbad2, 0x199e, 0x08c5, 0x406e, 0x4480, 0xb2c0, 0xbf70, 0xbf23, 0x4295, 0x46d2, 0x159c, 0x40ca, 0x281b, 0x4333, 0xbfab, 0x1fdd, 0xba6f, 0x3ac7, 0xba26, 0x1da2, 0x4216, 0x1ca9, 0xb263, 0x408e, 0x4491, 0xb230, 0xac9f, 0x4098, 0x4302, 0x41ea, 0x181d, 0xb289, 0xb2fa, 0x1e16, 0x424c, 0x414f, 0x443e, 0x1c8d, 0x428f, 0x2079, 0x44d4, 0x437d, 0xbae2, 0x0ba5, 0xbf43, 0x435f, 0x4446, 0x4383, 0x1b2e, 0xb2c1, 0x1ac6, 0x45d5, 0xaa8d, 0xa9ff, 0x4280, 0xab67, 0xb222, 0xba68, 0x435d, 0x43a2, 0x1957, 0x425a, 0xb03f, 0x42dc, 0xba2c, 0x423f, 0x4071, 0xa66f, 0x06e5, 0xbf51, 0x40e0, 0x30d9, 0x4263, 0xba77, 0x18c4, 0x424f, 0x2054, 0x4136, 0xb09d, 0x3276, 0xb0c2, 0x0886, 0xb20e, 0x3afb, 0x41db, 0x31d9, 0x4062, 0x41cb, 0x1813, 0x40fc, 0x4389, 0xb0b2, 0xbaf4, 0xba68, 0xbf8f, 0x40c3, 0x4068, 0x4017, 0x131f, 0x4310, 0x113a, 0x1dad, 0x43ae, 0xb230, 0x2a6e, 0xb221, 0xb274, 0xbadf, 0xbfc9, 0x23d7, 0xba0a, 0xba0c, 0x40fa, 0xb2b1, 0xbfd0, 0xbf0c, 0x06f7, 0x18c9, 0x46ba, 0xba47, 0x422f, 0x04b2, 0xb2f1, 0x0069, 0x4037, 0xb243, 0x41a8, 0xb253, 0x1a27, 0xb069, 0x42e3, 0x007f, 0xa0c1, 0xaafc, 0xbf87, 0xaa98, 0xb2b1, 0x421a, 0xbaf5, 0x3e9b, 0xbfa0, 0xba22, 0x16cb, 0x408a, 0x1721, 0xb2a9, 0xb2c6, 0x158e, 0x40dd, 0x3ac2, 0xbf5a, 0xafd9, 0x4334, 0xba57, 0x3f09, 0xb0e9, 0xb01e, 0x1bb9, 0xbfc7, 0xb2d0, 0xbac9, 0xb042, 0x4138, 0xbfaa, 0x4429, 0x0e51, 0x424d, 0x423e, 0x3928, 0x415a, 0xa9ee, 0x4049, 0x1bfd, 0xb030, 0x417f, 0x1335, 0x4151, 0x41ad, 0xb2e4, 0x1b22, 0x42cb, 0x34dd, 0x4104, 0x186f, 0x3a3b, 0x437a, 0x42c9, 0x43c3, 0xb275, 0xb281, 0xbfb7, 0x1a57, 0x4257, 0xb06e, 0x215e, 0xa0cf, 0xa019, 0x4438, 0xb2ad, 0x446b, 0xba48, 0x4595, 0x44e3, 0xbf33, 0x4078, 0x4366, 0x1a43, 0x4078, 0x43e9, 0xb0c3, 0x44e9, 0xb008, 0x4000, 0x4015, 0x40f3, 0xbf7c, 0x4063, 0x41e7, 0xbf7d, 0xb0ee, 0xb27e, 0xa702, 0xb2b0, 0x414e, 0xbf00, 0xb2d7, 0x4033, 0x1fb8, 0xb06b, 0x2c22, 0xbfb0, 0x42ca, 0xb220, 0xb019, 0x4274, 0x125e, 0x426d, 0xab1b, 0x4046, 0x465a, 0xb2ca, 0xba26, 0xba09, 0xb07a, 0x4565, 0x4253, 0xbaf0, 0x1b4f, 0xbf67, 0x1ace, 0x403a, 0x1e60, 0x3a08, 0xb030, 0xba66, 0x4176, 0x4003, 0x4227, 0xb000, 0xba2d, 0xbf4b, 0x46a2, 0x4343, 0xba26, 0x438b, 0x4217, 0xb23c, 0x41c3, 0x44a0, 0x40dc, 0x40f1, 0xb29a, 0x1be5, 0xb085, 0x421e, 0x10ec, 0x41da, 0xbfd0, 0x423f, 0x40c7, 0x1689, 0xb2bd, 0x4005, 0xbf7e, 0xba14, 0xb234, 0x41a4, 0x2b94, 0x43f5, 0xb048, 0xb059, 0x0639, 0x4255, 0x14a6, 0x400e, 0x1f55, 0x41ad, 0x3822, 0x4218, 0x1cb8, 0xb22a, 0x4410, 0x40c0, 0xa6c5, 0xb03b, 0xbf46, 0x2d61, 0x43f2, 0x15b7, 0x4347, 0xacc9, 0x422d, 0xb2f4, 0xbfd0, 0xbfe4, 0x42fd, 0xb28c, 0x1d63, 0xba3f, 0x432e, 0x40bc, 0x4337, 0xbfa0, 0x05a9, 0x4160, 0xb030, 0x0da5, 0x0cad, 0x42e0, 0xb2fa, 0x3352, 0x4184, 0x4309, 0x4262, 0x1cfc, 0x43b2, 0xbf25, 0xbaf4, 0x1eb8, 0xba24, 0x3854, 0xb2af, 0x4074, 0x16ab, 0xb28c, 0xa7af, 0x348f, 0x415d, 0x2104, 0xa0dc, 0xba00, 0x129c, 0x413e, 0x40a6, 0x439a, 0x407c, 0x1c34, 0x1b66, 0xb256, 0x425d, 0x423c, 0xbf71, 0xa64f, 0x412c, 0xb257, 0x4035, 0x420d, 0x45da, 0x11e7, 0x403b, 0xb0a8, 0xb2c9, 0x420c, 0xba22, 0xb0f6, 0x211b, 0x41f9, 0xb2b1, 0xbf00, 0xba40, 0xbf45, 0xbada, 0xbade, 0xb24b, 0x424c, 0x4050, 0x40a3, 0x4669, 0xaaff, 0xb089, 0x4335, 0x4104, 0x401d, 0x418d, 0x4000, 0x42f2, 0xa8da, 0x4151, 0xbf38, 0x45a4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x10ecc80c, 0x68d834e9, 0x195770d2, 0xf92fff26, 0x0d6457be, 0xa5d13c2e, 0x614b9061, 0xbd8cee14, 0x4cf5750a, 0x29eac697, 0xd29e8d3c, 0x1f3a1fb0, 0xc8c54efa, 0x28709a39, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0x2870a341, 0x50e143f6, 0x2870a3f9, 0x00000000, 0xffffffff, 0xd78f6003, 0x000018dc, 0xffffffff, 0x4cf575b9, 0x525b6130, 0xffffcfff, 0x1bc387ef, 0xfc89683f, 0x28709fd9, 0x00000000, 0x800001d0 }, + Instructions = [0x404c, 0x424a, 0x2986, 0xb245, 0x4373, 0x4073, 0x4006, 0x41df, 0x02dc, 0x3691, 0x42c5, 0xb2bf, 0x4020, 0x422c, 0x396a, 0xa360, 0xbf6f, 0x1d2b, 0x2d8e, 0x1815, 0x42f8, 0x41e0, 0x0084, 0x42c0, 0x43a4, 0x3d65, 0x11d0, 0xb2ee, 0x21d7, 0xbf8b, 0x3e83, 0x406a, 0x42ba, 0x4370, 0x446d, 0x3c88, 0x0c4e, 0x3ac9, 0x4284, 0xb2a9, 0x3c89, 0xb21a, 0x42df, 0x43e9, 0x4079, 0x1879, 0x40ea, 0xbafd, 0x435f, 0x40c2, 0x2c52, 0xba2c, 0xba4d, 0x45ba, 0xb288, 0x4228, 0x40cd, 0xbf67, 0x4092, 0x41bf, 0xba76, 0xb25f, 0x1c56, 0xb23c, 0xba28, 0x4063, 0x4083, 0xba20, 0xbad0, 0x40c5, 0xb245, 0xba73, 0x37df, 0x405d, 0x3e0c, 0xba79, 0xb241, 0x425a, 0x40c9, 0x4031, 0xb2b4, 0x4288, 0x4333, 0xbf95, 0xb20d, 0x42d8, 0xb0e6, 0x41c3, 0xbad8, 0x417b, 0x1c10, 0x030e, 0x403c, 0xb0e2, 0x12a0, 0x4451, 0x420b, 0xb20c, 0x3174, 0xbf60, 0xbada, 0xb2fd, 0xbf4a, 0xb22e, 0xb0ea, 0x19bf, 0x41cd, 0xbfbc, 0x412a, 0xba0d, 0xba38, 0x4092, 0x42af, 0x1db0, 0x41b5, 0xb281, 0x4059, 0xba6f, 0x410d, 0x4421, 0x410a, 0xa37d, 0xb289, 0x2b11, 0xad56, 0x383f, 0xb20c, 0xbfb3, 0x428f, 0x1f82, 0xba34, 0xb0ef, 0x1c73, 0x401e, 0xba6a, 0x40c8, 0x4554, 0xb0b6, 0x1d62, 0xb092, 0xb000, 0xbf7c, 0x40c0, 0x3aca, 0x1db0, 0x4124, 0x461c, 0xba2f, 0x1a4d, 0x1f44, 0xbfd9, 0x33dc, 0xb2c9, 0x41fe, 0x1921, 0xba75, 0x40ea, 0x424e, 0x43ca, 0xa25a, 0x423e, 0x4175, 0x410a, 0x41e1, 0x41c2, 0xbfca, 0x1f2c, 0xb2ce, 0xae78, 0xb262, 0x4045, 0x4287, 0xb24e, 0x1d5e, 0x4092, 0x2e56, 0xbacd, 0x400e, 0xba42, 0x40f4, 0xbafd, 0x4482, 0x40fc, 0x2f63, 0xb01c, 0x408d, 0x4008, 0x4250, 0xa846, 0xb2a7, 0x376b, 0xb012, 0xbad0, 0xbf7c, 0x4382, 0xb23e, 0x414c, 0x4091, 0xb0ab, 0x40fe, 0x4076, 0x458c, 0xa397, 0x445a, 0xb267, 0x43d7, 0x42c5, 0xa924, 0x41c9, 0x431d, 0x4207, 0x4182, 0x4012, 0x0c79, 0xb26a, 0x1b23, 0xabb2, 0x40df, 0xbf4a, 0x27b0, 0x4467, 0xa236, 0xba10, 0x4386, 0x42c2, 0x41d5, 0x4665, 0x41bb, 0x41d0, 0xba31, 0x4388, 0x1d9c, 0x2d56, 0x420d, 0x432e, 0xba31, 0x1d22, 0x4428, 0x419b, 0x1cd7, 0xb081, 0x4327, 0x4162, 0x42d8, 0x1947, 0xbf2c, 0x43cb, 0xb250, 0x4012, 0x3734, 0x4214, 0xa5bb, 0x4611, 0xba60, 0x2aed, 0xba05, 0x43a1, 0x431d, 0x0608, 0xbade, 0xa596, 0x4312, 0xb0b8, 0xb249, 0xbf6d, 0x42ac, 0xbfe0, 0x42e8, 0xb284, 0x42cd, 0x380e, 0x405b, 0x42e8, 0xb07d, 0xbad9, 0x43ca, 0x4282, 0xb283, 0x4353, 0x1ca4, 0xba3e, 0x41f3, 0x18a3, 0xb2da, 0x41d5, 0x416a, 0x2f3e, 0x46ec, 0xbf9c, 0x430f, 0x434e, 0xb2dd, 0xb27d, 0x1064, 0x43f0, 0xb2c9, 0x15a6, 0x28ab, 0xa5f9, 0x08db, 0xbfbe, 0x41ed, 0x41f9, 0x4385, 0x4197, 0x0b37, 0x418b, 0x133a, 0xb0f9, 0xba40, 0x434b, 0xb2b2, 0xa303, 0x464d, 0x1c7a, 0xbfe0, 0x46ac, 0x028d, 0x445c, 0xb034, 0xbf4f, 0x1af3, 0x1e0d, 0x4148, 0xaf26, 0xb01e, 0x1575, 0xba61, 0x29a4, 0xb238, 0x40ca, 0xbf5e, 0xab8b, 0x351a, 0x4121, 0xba67, 0xbfd2, 0xacfe, 0xba11, 0x4381, 0x186f, 0x36ef, 0xbae7, 0x1389, 0x1a97, 0x42be, 0x4123, 0x21ca, 0xb2ee, 0xb2b4, 0x463f, 0x2825, 0x449c, 0x4225, 0x4271, 0x1f0c, 0xba51, 0x43c4, 0x4148, 0x017d, 0xbf7b, 0x43e6, 0x41ee, 0xb255, 0x43e6, 0xb048, 0x4033, 0x4282, 0x412e, 0xbae8, 0xaede, 0x4125, 0x41c2, 0x4229, 0xb014, 0x403a, 0xb001, 0xba7c, 0xbada, 0x1dc4, 0x25c1, 0xa5f1, 0x43c5, 0xb293, 0x4011, 0x2dea, 0x1912, 0x43cc, 0xa25f, 0xba41, 0xbfaa, 0x41db, 0x4060, 0x1be4, 0x09de, 0x3dd2, 0x1ca8, 0xb200, 0x460d, 0x4066, 0x02af, 0x432e, 0x1dce, 0xb20f, 0x4468, 0x4058, 0xb037, 0x4137, 0x4158, 0xbf96, 0x39fe, 0x40a2, 0x417e, 0xa421, 0x3a98, 0x12e7, 0x4106, 0xb0fc, 0x2564, 0x40e0, 0xb0a6, 0x0a30, 0x42eb, 0x0ad5, 0x42ec, 0xbacc, 0xbff0, 0x13cc, 0x1bdc, 0x33ae, 0xbf90, 0xba18, 0x42f5, 0xb084, 0x410c, 0x4571, 0xbf94, 0x422b, 0x424b, 0x43a2, 0x433b, 0xba17, 0x1b36, 0x4221, 0x40e2, 0x4247, 0x1e2f, 0x3746, 0x43ef, 0xbf26, 0x1a41, 0x40ae, 0xb2f1, 0x4348, 0x43ce, 0x4128, 0xb27e, 0x400f, 0x41c4, 0xb023, 0x4054, 0x40cb, 0xb260, 0x41c9, 0x3d51, 0x42bf, 0x36f6, 0x1d00, 0x2cc0, 0x412b, 0xbf08, 0x03d1, 0xb280, 0x432e, 0xb0a1, 0xb2d1, 0xa60e, 0xb229, 0x418b, 0xbfe2, 0x438a, 0xba58, 0xa4a8, 0x4393, 0xb2ce, 0xbfd0, 0x447d, 0xb0fc, 0x42c8, 0xba09, 0x43eb, 0xbf42, 0xb24c, 0x19f5, 0x426b, 0xb2a7, 0x1baf, 0x1b6b, 0x4276, 0x0857, 0x22f0, 0xb238, 0x41fc, 0x440b, 0xbf88, 0x2db9, 0x1b79, 0x4117, 0xba00, 0x04c4, 0xbafa, 0x42fa, 0x0f86, 0x439c, 0xa156, 0xb274, 0x4223, 0xbfcf, 0x10c5, 0xb28b, 0x43df, 0x41f3, 0xbf8d, 0x43f8, 0x42b4, 0xb031, 0x0817, 0xb261, 0xbfe0, 0x4137, 0x1da3, 0x404b, 0xbae6, 0xb254, 0x412f, 0xbad5, 0xb295, 0x444e, 0xb28e, 0xb279, 0x406f, 0x45ea, 0xb2db, 0x1d07, 0xbfb3, 0x3b0e, 0x4138, 0x2a53, 0x421f, 0x40bd, 0x43cb, 0x430f, 0x21b6, 0x18d6, 0x43a4, 0xb04e, 0x43a3, 0x420e, 0x467e, 0x4134, 0xb060, 0x44fc, 0x41ed, 0xbff0, 0x43a6, 0x217f, 0xbad4, 0x417d, 0x42e7, 0x3065, 0x1ce3, 0x4016, 0xb218, 0x4219, 0xbf1d, 0x3fb0, 0x2c2e, 0x089c, 0xbaf3, 0x42ef, 0xb26b, 0xbf3d, 0x39ec, 0x4375, 0xb2e2, 0x191e, 0x433f, 0x38b8, 0x4217, 0xb074, 0xb272, 0xbfa4, 0x1bb0, 0x223f, 0xbaf3, 0x4192, 0xba64, 0x4278, 0xbace, 0x01b2, 0x431a, 0xa920, 0x40bf, 0x4498, 0x4331, 0x43fa, 0x4212, 0x41d4, 0x0257, 0x4136, 0x3ca6, 0x4229, 0xbad2, 0x199e, 0x08c5, 0x406e, 0x4480, 0xb2c0, 0xbf70, 0xbf23, 0x4295, 0x46d2, 0x159c, 0x40ca, 0x281b, 0x4333, 0xbfab, 0x1fdd, 0xba6f, 0x3ac7, 0xba26, 0x1da2, 0x4216, 0x1ca9, 0xb263, 0x408e, 0x4491, 0xb230, 0xac9f, 0x4098, 0x4302, 0x41ea, 0x181d, 0xb289, 0xb2fa, 0x1e16, 0x424c, 0x414f, 0x443e, 0x1c8d, 0x428f, 0x2079, 0x44d4, 0x437d, 0xbae2, 0x0ba5, 0xbf43, 0x435f, 0x4446, 0x4383, 0x1b2e, 0xb2c1, 0x1ac6, 0x45d5, 0xaa8d, 0xa9ff, 0x4280, 0xab67, 0xb222, 0xba68, 0x435d, 0x43a2, 0x1957, 0x425a, 0xb03f, 0x42dc, 0xba2c, 0x423f, 0x4071, 0xa66f, 0x06e5, 0xbf51, 0x40e0, 0x30d9, 0x4263, 0xba77, 0x18c4, 0x424f, 0x2054, 0x4136, 0xb09d, 0x3276, 0xb0c2, 0x0886, 0xb20e, 0x3afb, 0x41db, 0x31d9, 0x4062, 0x41cb, 0x1813, 0x40fc, 0x4389, 0xb0b2, 0xbaf4, 0xba68, 0xbf8f, 0x40c3, 0x4068, 0x4017, 0x131f, 0x4310, 0x113a, 0x1dad, 0x43ae, 0xb230, 0x2a6e, 0xb221, 0xb274, 0xbadf, 0xbfc9, 0x23d7, 0xba0a, 0xba0c, 0x40fa, 0xb2b1, 0xbfd0, 0xbf0c, 0x06f7, 0x18c9, 0x46ba, 0xba47, 0x422f, 0x04b2, 0xb2f1, 0x0069, 0x4037, 0xb243, 0x41a8, 0xb253, 0x1a27, 0xb069, 0x42e3, 0x007f, 0xa0c1, 0xaafc, 0xbf87, 0xaa98, 0xb2b1, 0x421a, 0xbaf5, 0x3e9b, 0xbfa0, 0xba22, 0x16cb, 0x408a, 0x1721, 0xb2a9, 0xb2c6, 0x158e, 0x40dd, 0x3ac2, 0xbf5a, 0xafd9, 0x4334, 0xba57, 0x3f09, 0xb0e9, 0xb01e, 0x1bb9, 0xbfc7, 0xb2d0, 0xbac9, 0xb042, 0x4138, 0xbfaa, 0x4429, 0x0e51, 0x424d, 0x423e, 0x3928, 0x415a, 0xa9ee, 0x4049, 0x1bfd, 0xb030, 0x417f, 0x1335, 0x4151, 0x41ad, 0xb2e4, 0x1b22, 0x42cb, 0x34dd, 0x4104, 0x186f, 0x3a3b, 0x437a, 0x42c9, 0x43c3, 0xb275, 0xb281, 0xbfb7, 0x1a57, 0x4257, 0xb06e, 0x215e, 0xa0cf, 0xa019, 0x4438, 0xb2ad, 0x446b, 0xba48, 0x4595, 0x44e3, 0xbf33, 0x4078, 0x4366, 0x1a43, 0x4078, 0x43e9, 0xb0c3, 0x44e9, 0xb008, 0x4000, 0x4015, 0x40f3, 0xbf7c, 0x4063, 0x41e7, 0xbf7d, 0xb0ee, 0xb27e, 0xa702, 0xb2b0, 0x414e, 0xbf00, 0xb2d7, 0x4033, 0x1fb8, 0xb06b, 0x2c22, 0xbfb0, 0x42ca, 0xb220, 0xb019, 0x4274, 0x125e, 0x426d, 0xab1b, 0x4046, 0x465a, 0xb2ca, 0xba26, 0xba09, 0xb07a, 0x4565, 0x4253, 0xbaf0, 0x1b4f, 0xbf67, 0x1ace, 0x403a, 0x1e60, 0x3a08, 0xb030, 0xba66, 0x4176, 0x4003, 0x4227, 0xb000, 0xba2d, 0xbf4b, 0x46a2, 0x4343, 0xba26, 0x438b, 0x4217, 0xb23c, 0x41c3, 0x44a0, 0x40dc, 0x40f1, 0xb29a, 0x1be5, 0xb085, 0x421e, 0x10ec, 0x41da, 0xbfd0, 0x423f, 0x40c7, 0x1689, 0xb2bd, 0x4005, 0xbf7e, 0xba14, 0xb234, 0x41a4, 0x2b94, 0x43f5, 0xb048, 0xb059, 0x0639, 0x4255, 0x14a6, 0x400e, 0x1f55, 0x41ad, 0x3822, 0x4218, 0x1cb8, 0xb22a, 0x4410, 0x40c0, 0xa6c5, 0xb03b, 0xbf46, 0x2d61, 0x43f2, 0x15b7, 0x4347, 0xacc9, 0x422d, 0xb2f4, 0xbfd0, 0xbfe4, 0x42fd, 0xb28c, 0x1d63, 0xba3f, 0x432e, 0x40bc, 0x4337, 0xbfa0, 0x05a9, 0x4160, 0xb030, 0x0da5, 0x0cad, 0x42e0, 0xb2fa, 0x3352, 0x4184, 0x4309, 0x4262, 0x1cfc, 0x43b2, 0xbf25, 0xbaf4, 0x1eb8, 0xba24, 0x3854, 0xb2af, 0x4074, 0x16ab, 0xb28c, 0xa7af, 0x348f, 0x415d, 0x2104, 0xa0dc, 0xba00, 0x129c, 0x413e, 0x40a6, 0x439a, 0x407c, 0x1c34, 0x1b66, 0xb256, 0x425d, 0x423c, 0xbf71, 0xa64f, 0x412c, 0xb257, 0x4035, 0x420d, 0x45da, 0x11e7, 0x403b, 0xb0a8, 0xb2c9, 0x420c, 0xba22, 0xb0f6, 0x211b, 0x41f9, 0xb2b1, 0xbf00, 0xba40, 0xbf45, 0xbada, 0xbade, 0xb24b, 0x424c, 0x4050, 0x40a3, 0x4669, 0xaaff, 0xb089, 0x4335, 0x4104, 0x401d, 0x418d, 0x4000, 0x42f2, 0xa8da, 0x4151, 0xbf38, 0x45a4, 0x4770, 0xe7fe + ], + StartRegs = [0x10ecc80c, 0x68d834e9, 0x195770d2, 0xf92fff26, 0x0d6457be, 0xa5d13c2e, 0x614b9061, 0xbd8cee14, 0x4cf5750a, 0x29eac697, 0xd29e8d3c, 0x1f3a1fb0, 0xc8c54efa, 0x28709a39, 0x00000000, 0x100001f0 + ], + FinalRegs = [0x2870a341, 0x50e143f6, 0x2870a3f9, 0x00000000, 0xffffffff, 0xd78f6003, 0x000018dc, 0xffffffff, 0x4cf575b9, 0x525b6130, 0xffffcfff, 0x1bc387ef, 0xfc89683f, 0x28709fd9, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x155d, 0x212d, 0x4196, 0x4176, 0x42cb, 0x4436, 0xba13, 0x41cd, 0x4049, 0x42e3, 0x435c, 0xa81a, 0xba0c, 0xba6d, 0xbfa0, 0xb2d5, 0x42bc, 0xbfc0, 0xbf00, 0x45a9, 0xbf19, 0xba0c, 0xb256, 0xba51, 0x393b, 0xb048, 0xbf0f, 0xb2fc, 0x406e, 0x2068, 0x4007, 0xbf15, 0x4022, 0x4100, 0x4268, 0x408b, 0x42f9, 0xba0d, 0x41f9, 0x1b65, 0x4226, 0xb24a, 0x4677, 0x43ab, 0x3cba, 0x43ad, 0x3eae, 0x42df, 0xbf2a, 0x07ab, 0xb27e, 0x1e70, 0x440d, 0xb280, 0xba74, 0xb0a6, 0x1992, 0x275c, 0xb25e, 0xb027, 0x43c7, 0x4274, 0x4399, 0x40cb, 0x420e, 0x40be, 0x411c, 0x3e42, 0x1e52, 0x44ca, 0xb0b2, 0x4499, 0x418b, 0x3ecd, 0xac43, 0xbf76, 0xa566, 0xa33d, 0x4011, 0xbf22, 0x46ba, 0x45a1, 0x431d, 0x43a3, 0x4288, 0xbf02, 0x4157, 0x25bb, 0x24da, 0xbaf0, 0x4260, 0x12c9, 0x215f, 0xbf32, 0x432a, 0x419b, 0x413e, 0x1b77, 0xb0d4, 0x41a6, 0x0aae, 0xbff0, 0xb00f, 0x4091, 0x400e, 0x4036, 0xba1d, 0x1f20, 0x4194, 0xba73, 0x1a36, 0xbfc0, 0x405c, 0xbf93, 0x381b, 0x42d2, 0xba26, 0x41c8, 0xba43, 0xb03a, 0x410a, 0x4142, 0xb2b6, 0x46e1, 0x4227, 0xab57, 0xb29d, 0xbf3d, 0x195a, 0xba11, 0x42b7, 0x418a, 0x40b3, 0x420f, 0xb285, 0xbf41, 0x1aec, 0x10d6, 0x41eb, 0x2252, 0xbf80, 0xb0db, 0x1e20, 0x43c7, 0x41f8, 0xb24a, 0x4605, 0xbadb, 0x41b6, 0x4267, 0x3473, 0x42c0, 0x42e1, 0x42d2, 0x45aa, 0x4240, 0xbf90, 0x43d7, 0xb03a, 0x411f, 0x42ee, 0x4370, 0x4238, 0x4646, 0x1ce2, 0xbf65, 0x2fa6, 0x41fc, 0xba40, 0x40e0, 0x10fd, 0xb0b7, 0x1851, 0x4300, 0xbaf7, 0xb030, 0xb031, 0xa1cf, 0x135c, 0xb09e, 0x4131, 0xb039, 0x4548, 0x4022, 0xbfb2, 0x35c4, 0xb2a0, 0xb05a, 0xbfc3, 0x40bb, 0x4694, 0x419f, 0xbf80, 0x436f, 0x19c2, 0xb210, 0x1efd, 0x4104, 0x0fff, 0xbfc3, 0x4271, 0x4282, 0x2373, 0xb22e, 0x1d4c, 0x41a8, 0x41e0, 0xb264, 0xb0f2, 0xb202, 0x4087, 0xba73, 0x4351, 0x43cb, 0xae08, 0x40d4, 0x2529, 0xb22b, 0x412e, 0xa5ec, 0x42ce, 0x0a48, 0x3422, 0x186a, 0x2588, 0xba79, 0x40dc, 0x041b, 0xbf65, 0x434f, 0x1ca9, 0xb262, 0x299b, 0x4371, 0x43a0, 0x433d, 0x0586, 0x2f06, 0xb267, 0x4695, 0x4287, 0xbf7d, 0x1d88, 0x4665, 0xb282, 0x1912, 0x401e, 0x40cf, 0x1883, 0x4195, 0xba42, 0x45b4, 0xbf53, 0xb22f, 0xa9fe, 0xba1a, 0x3a48, 0xbaea, 0x4000, 0x07fe, 0x405f, 0x4351, 0xbf1d, 0x40f7, 0xb098, 0xb0a6, 0x3be8, 0x1980, 0xb014, 0x405d, 0x42bb, 0xac85, 0x06b7, 0x42a8, 0x42c8, 0x421e, 0xbf19, 0xb2ba, 0xb0b2, 0x4154, 0x42bc, 0x25fb, 0x4612, 0x4112, 0xb290, 0x40a0, 0x4195, 0x1e8b, 0x3ac1, 0x438d, 0x4340, 0x1a9e, 0x426a, 0x402a, 0x2d5c, 0xba5d, 0xb281, 0xb2ca, 0x4365, 0x191e, 0x2171, 0x3a69, 0x409a, 0x4304, 0xbfe1, 0x4316, 0xb2d2, 0xa9b9, 0x42e7, 0x4684, 0x2f78, 0xbaed, 0xbf81, 0x166e, 0x465e, 0xbadd, 0x4662, 0xbacb, 0x4003, 0x428b, 0x3668, 0x42ce, 0x42ab, 0xb22a, 0x40a0, 0x1cd8, 0x4029, 0xb2a7, 0xb061, 0x160d, 0x424f, 0xba7f, 0x4446, 0x3ea4, 0x0dac, 0xbfca, 0x0a49, 0xbae0, 0xb2d8, 0xabe7, 0xba1f, 0x40b2, 0xbafc, 0x4679, 0x37aa, 0x40e8, 0x12a2, 0xb0fa, 0x3fe1, 0x42a3, 0x1866, 0xba6b, 0x00a0, 0x3304, 0xbf5b, 0x4431, 0x40d8, 0x0a5a, 0x42e0, 0x41c7, 0x1980, 0xb096, 0xbfc3, 0xba10, 0x1efd, 0x2704, 0x419c, 0xb235, 0xbf97, 0x4391, 0x0740, 0x4057, 0x0d91, 0x4122, 0x1f06, 0x42d4, 0x42ce, 0x4211, 0x439a, 0x1d59, 0xbf98, 0xba68, 0x4275, 0x413f, 0x1d15, 0x4180, 0x414a, 0x421e, 0x438a, 0xa29c, 0x3fb4, 0xbf0b, 0x4025, 0x41ab, 0x428d, 0xb2b5, 0xb067, 0xbf90, 0xb258, 0xbf18, 0x2023, 0x43e4, 0x44d5, 0x37d4, 0xb09e, 0x427d, 0x29dc, 0x4171, 0x041a, 0xbfba, 0xb29f, 0xb26a, 0x427f, 0x4238, 0x4381, 0x15bc, 0x430b, 0x2760, 0x1aab, 0xb2ff, 0x4282, 0x103e, 0xa10f, 0x0891, 0x4056, 0x408e, 0x0276, 0xbfb6, 0x094c, 0x2c6a, 0xba4e, 0x403b, 0xb24c, 0xabc2, 0xb0f6, 0x4366, 0x1ded, 0x408a, 0x40bf, 0x4352, 0x10a3, 0xb0bc, 0x42e6, 0x40a5, 0x4551, 0x37ad, 0xbf02, 0xb0f1, 0x43e0, 0xb213, 0x4105, 0xb2bc, 0x40c4, 0xb20e, 0x1117, 0x40b2, 0x412b, 0x1dd0, 0x43a6, 0x43f9, 0x4391, 0x26fd, 0x07df, 0xbf13, 0x4152, 0x22a3, 0x1936, 0x1915, 0x40bb, 0x21c5, 0x2a65, 0x2572, 0x4117, 0x19ba, 0x43c3, 0x41ad, 0xb20a, 0x1fd6, 0x37bd, 0xb00b, 0x41b3, 0xa0b2, 0xb2f5, 0xb209, 0x40f3, 0xb244, 0x4380, 0xb20a, 0x41c7, 0xbf9c, 0xba2b, 0x4064, 0x4048, 0xb2f9, 0xbff0, 0x4399, 0x42bb, 0x1c85, 0x31be, 0x322d, 0x102a, 0x4614, 0x1860, 0x42fb, 0x1fd4, 0x1ba5, 0x4395, 0x3c83, 0xa80f, 0x439b, 0xba4a, 0xbf98, 0x40a3, 0x4065, 0x04dc, 0xbf38, 0x4260, 0xaa25, 0x220a, 0x05e2, 0x40ec, 0xbf60, 0x41b3, 0x127f, 0x40de, 0xb0a8, 0x43ba, 0x41be, 0xbf93, 0x2f9a, 0xb059, 0xb0a5, 0x4196, 0x4343, 0x400e, 0xbfb4, 0x4324, 0xb0fd, 0x09ed, 0xbad8, 0xb02d, 0x150b, 0x4016, 0xbfa6, 0xba3e, 0x439a, 0x3d0b, 0x1b7a, 0xba18, 0x241e, 0xa47d, 0xb22f, 0xb281, 0x40be, 0x4096, 0xb046, 0x43c2, 0x0c15, 0xb079, 0xb21e, 0xbf54, 0x42ab, 0xb234, 0x46b0, 0x1c7b, 0x4297, 0x43f4, 0x029f, 0x3405, 0x42d0, 0x42d2, 0x41b3, 0x40fe, 0x45c4, 0xb0db, 0x43ba, 0x4219, 0x4269, 0x1612, 0x41ac, 0x40ce, 0x3511, 0x4339, 0xb023, 0x130e, 0xb281, 0x1d1d, 0xbfcd, 0x419a, 0xba2b, 0x4011, 0xb295, 0x43f1, 0x40f7, 0xb264, 0xba37, 0xb2d0, 0xbf46, 0x18b3, 0x34c0, 0x040f, 0x401a, 0x138a, 0xa805, 0xb259, 0x440a, 0x1bee, 0xa5a7, 0x43f8, 0x407e, 0x424a, 0xb2f0, 0x433a, 0x39aa, 0x19d8, 0x42d2, 0xa041, 0x41c5, 0x214f, 0xb08f, 0x4231, 0x40b5, 0x05df, 0xbfa6, 0xa527, 0x455f, 0x2dc3, 0x1f02, 0xbaf8, 0x45e2, 0x466d, 0xa17d, 0x39d3, 0x1cdb, 0x4353, 0x43d0, 0x1b82, 0x0fc7, 0x4367, 0xba0b, 0xa21c, 0xbf4d, 0xba44, 0xa48c, 0x4185, 0x4168, 0x27d1, 0x21e1, 0x4316, 0x309b, 0x1859, 0x3d8d, 0x41fa, 0xba63, 0x2168, 0x0966, 0x43f5, 0x35ce, 0x3894, 0x412f, 0xbae5, 0x4557, 0x45b2, 0x4601, 0xb240, 0x4301, 0x4237, 0x4608, 0x1707, 0x08e5, 0xbf57, 0x3831, 0x41fe, 0x1722, 0x1f29, 0x45dd, 0x4233, 0x4550, 0xba2f, 0x3c89, 0xbfc0, 0xbf0c, 0xb2ad, 0x4042, 0x3c09, 0x1f76, 0xb29c, 0x43ce, 0x28fc, 0x4661, 0xb28c, 0x432b, 0x4277, 0xa32e, 0x42ae, 0x41c3, 0x1cad, 0x4203, 0x40bc, 0x43c6, 0xbf78, 0xbae9, 0x4222, 0x0094, 0x4350, 0x41d9, 0x415e, 0xb2b7, 0x4088, 0xb060, 0x40bd, 0xbf6b, 0x1a14, 0xa78c, 0xb2cf, 0x4021, 0x1adf, 0xba10, 0x1bfb, 0x41fe, 0x1b0e, 0x4369, 0x40e6, 0xbfab, 0x4077, 0x4673, 0x2c2d, 0x1df1, 0xb2bd, 0x42b0, 0xbf90, 0x03a8, 0xae03, 0x40ea, 0xbf15, 0x388f, 0x43ef, 0x2e69, 0x4130, 0x40b8, 0x3597, 0x4688, 0x1a86, 0x08aa, 0x4479, 0x45ea, 0x433c, 0xbf60, 0x1e2d, 0x1a2d, 0xb001, 0x1932, 0xaf95, 0x41aa, 0x4477, 0xb050, 0x42f6, 0xb219, 0xb03e, 0xb27e, 0xb0e7, 0xbae9, 0x4189, 0x4077, 0xbfb1, 0x407f, 0x454d, 0x044d, 0x410f, 0x46fa, 0x4265, 0x43aa, 0x41e0, 0x19da, 0x3196, 0x403d, 0x435c, 0x40f5, 0x4067, 0x3122, 0x1ea4, 0x40d7, 0x40dd, 0x1cb3, 0xb241, 0xb20d, 0xae94, 0xb20c, 0x42bb, 0x41a6, 0x4084, 0xa88d, 0xbfb8, 0x42c2, 0xb260, 0xba2d, 0x4119, 0xba63, 0xb2cf, 0x2aaa, 0xa2c2, 0x32e4, 0x42eb, 0xb24c, 0x04eb, 0x43fc, 0xb2c5, 0x4158, 0xb26f, 0x4664, 0x2f2a, 0xb0f7, 0x0290, 0x40d7, 0x1955, 0x1cc8, 0x405c, 0x1d87, 0x40b5, 0xbf89, 0xa488, 0xb2db, 0x401e, 0xb25d, 0xb2c8, 0xba28, 0xb09b, 0x0813, 0x06b2, 0xba07, 0x416e, 0x2476, 0x40c1, 0x1902, 0xb0c8, 0x3d59, 0x26cd, 0xbad0, 0x3338, 0xb2d5, 0x41c1, 0x19e0, 0xbfdf, 0x1e0b, 0x4301, 0x00f0, 0xb252, 0xb2be, 0x4614, 0x1c4b, 0xb00a, 0x44b3, 0xba75, 0x416c, 0x4283, 0x0e46, 0xae89, 0xba0e, 0x4287, 0x3290, 0x4296, 0x43fe, 0xa47a, 0x4243, 0xba58, 0x4076, 0xb2d3, 0xb2ee, 0x42c8, 0xbf8a, 0x4087, 0x465d, 0x0812, 0xb0d0, 0x1b04, 0x41c3, 0xba2c, 0x461b, 0x43c2, 0x1d5b, 0x439d, 0x41d2, 0xbf62, 0x4283, 0x41d3, 0x2cd1, 0x19da, 0xba70, 0xba7d, 0xbf4c, 0x4024, 0xa8a8, 0x3533, 0x4356, 0x4360, 0x40e8, 0x1a0c, 0x4217, 0x46ad, 0x2bcf, 0x4136, 0x41ba, 0xa279, 0x25e8, 0xbfe0, 0xb2a5, 0xa2f0, 0xbf15, 0x41e7, 0xbac9, 0x1f73, 0x410f, 0x0d8a, 0x40d3, 0xab54, 0x4219, 0x1984, 0xbada, 0x4384, 0x1b68, 0x44a8, 0x11d9, 0x4048, 0xbfa6, 0xb2f9, 0x42a0, 0x4237, 0x1298, 0xb0ce, 0x42e5, 0xb2c3, 0x40ce, 0x43eb, 0x29fe, 0x437a, 0xb238, 0xb2e5, 0xa899, 0xb05c, 0xbf91, 0x1947, 0x446b, 0x2586, 0x407f, 0xb275, 0x4193, 0x40eb, 0x439a, 0x2b6e, 0x4378, 0xb2b0, 0xba74, 0x438a, 0x1949, 0xab0c, 0xb208, 0xbae5, 0x4631, 0xbfcd, 0x4165, 0xba67, 0x4038, 0xb007, 0x177e, 0x4275, 0x1b62, 0x2fff, 0x45c6, 0x31d9, 0x429d, 0x18c1, 0x46dc, 0xb2c2, 0x41a9, 0x4390, 0x4362, 0xb0a3, 0xbae3, 0x102a, 0xb08c, 0x27c5, 0xbf0d, 0x1b86, 0xadce, 0xb0bb, 0x1d65, 0x412e, 0xb0d9, 0x2bf0, 0x320b, 0x433e, 0xadb6, 0x406a, 0x20e1, 0x1c81, 0x40ba, 0x13e1, 0x19cd, 0xb2a4, 0xbf5a, 0x46aa, 0x43b8, 0xb211, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x35faf52d, 0x178d83c4, 0xd9eed1e5, 0x2d403c23, 0x142e3ba1, 0xfdb96242, 0xb8568fae, 0xd9e9fcd8, 0xdb303d2f, 0xb29babc4, 0x02ba22df, 0x57781ed2, 0x79ab341b, 0x84723a31, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000c5, 0x000000c5, 0x000000c5, 0x0fa51006, 0x79ab341b, 0x000000c5, 0x57781ed2, 0x57781ed2, 0xfffffd5f, 0x00000000, 0x000001d0 }, + Instructions = [0x155d, 0x212d, 0x4196, 0x4176, 0x42cb, 0x4436, 0xba13, 0x41cd, 0x4049, 0x42e3, 0x435c, 0xa81a, 0xba0c, 0xba6d, 0xbfa0, 0xb2d5, 0x42bc, 0xbfc0, 0xbf00, 0x45a9, 0xbf19, 0xba0c, 0xb256, 0xba51, 0x393b, 0xb048, 0xbf0f, 0xb2fc, 0x406e, 0x2068, 0x4007, 0xbf15, 0x4022, 0x4100, 0x4268, 0x408b, 0x42f9, 0xba0d, 0x41f9, 0x1b65, 0x4226, 0xb24a, 0x4677, 0x43ab, 0x3cba, 0x43ad, 0x3eae, 0x42df, 0xbf2a, 0x07ab, 0xb27e, 0x1e70, 0x440d, 0xb280, 0xba74, 0xb0a6, 0x1992, 0x275c, 0xb25e, 0xb027, 0x43c7, 0x4274, 0x4399, 0x40cb, 0x420e, 0x40be, 0x411c, 0x3e42, 0x1e52, 0x44ca, 0xb0b2, 0x4499, 0x418b, 0x3ecd, 0xac43, 0xbf76, 0xa566, 0xa33d, 0x4011, 0xbf22, 0x46ba, 0x45a1, 0x431d, 0x43a3, 0x4288, 0xbf02, 0x4157, 0x25bb, 0x24da, 0xbaf0, 0x4260, 0x12c9, 0x215f, 0xbf32, 0x432a, 0x419b, 0x413e, 0x1b77, 0xb0d4, 0x41a6, 0x0aae, 0xbff0, 0xb00f, 0x4091, 0x400e, 0x4036, 0xba1d, 0x1f20, 0x4194, 0xba73, 0x1a36, 0xbfc0, 0x405c, 0xbf93, 0x381b, 0x42d2, 0xba26, 0x41c8, 0xba43, 0xb03a, 0x410a, 0x4142, 0xb2b6, 0x46e1, 0x4227, 0xab57, 0xb29d, 0xbf3d, 0x195a, 0xba11, 0x42b7, 0x418a, 0x40b3, 0x420f, 0xb285, 0xbf41, 0x1aec, 0x10d6, 0x41eb, 0x2252, 0xbf80, 0xb0db, 0x1e20, 0x43c7, 0x41f8, 0xb24a, 0x4605, 0xbadb, 0x41b6, 0x4267, 0x3473, 0x42c0, 0x42e1, 0x42d2, 0x45aa, 0x4240, 0xbf90, 0x43d7, 0xb03a, 0x411f, 0x42ee, 0x4370, 0x4238, 0x4646, 0x1ce2, 0xbf65, 0x2fa6, 0x41fc, 0xba40, 0x40e0, 0x10fd, 0xb0b7, 0x1851, 0x4300, 0xbaf7, 0xb030, 0xb031, 0xa1cf, 0x135c, 0xb09e, 0x4131, 0xb039, 0x4548, 0x4022, 0xbfb2, 0x35c4, 0xb2a0, 0xb05a, 0xbfc3, 0x40bb, 0x4694, 0x419f, 0xbf80, 0x436f, 0x19c2, 0xb210, 0x1efd, 0x4104, 0x0fff, 0xbfc3, 0x4271, 0x4282, 0x2373, 0xb22e, 0x1d4c, 0x41a8, 0x41e0, 0xb264, 0xb0f2, 0xb202, 0x4087, 0xba73, 0x4351, 0x43cb, 0xae08, 0x40d4, 0x2529, 0xb22b, 0x412e, 0xa5ec, 0x42ce, 0x0a48, 0x3422, 0x186a, 0x2588, 0xba79, 0x40dc, 0x041b, 0xbf65, 0x434f, 0x1ca9, 0xb262, 0x299b, 0x4371, 0x43a0, 0x433d, 0x0586, 0x2f06, 0xb267, 0x4695, 0x4287, 0xbf7d, 0x1d88, 0x4665, 0xb282, 0x1912, 0x401e, 0x40cf, 0x1883, 0x4195, 0xba42, 0x45b4, 0xbf53, 0xb22f, 0xa9fe, 0xba1a, 0x3a48, 0xbaea, 0x4000, 0x07fe, 0x405f, 0x4351, 0xbf1d, 0x40f7, 0xb098, 0xb0a6, 0x3be8, 0x1980, 0xb014, 0x405d, 0x42bb, 0xac85, 0x06b7, 0x42a8, 0x42c8, 0x421e, 0xbf19, 0xb2ba, 0xb0b2, 0x4154, 0x42bc, 0x25fb, 0x4612, 0x4112, 0xb290, 0x40a0, 0x4195, 0x1e8b, 0x3ac1, 0x438d, 0x4340, 0x1a9e, 0x426a, 0x402a, 0x2d5c, 0xba5d, 0xb281, 0xb2ca, 0x4365, 0x191e, 0x2171, 0x3a69, 0x409a, 0x4304, 0xbfe1, 0x4316, 0xb2d2, 0xa9b9, 0x42e7, 0x4684, 0x2f78, 0xbaed, 0xbf81, 0x166e, 0x465e, 0xbadd, 0x4662, 0xbacb, 0x4003, 0x428b, 0x3668, 0x42ce, 0x42ab, 0xb22a, 0x40a0, 0x1cd8, 0x4029, 0xb2a7, 0xb061, 0x160d, 0x424f, 0xba7f, 0x4446, 0x3ea4, 0x0dac, 0xbfca, 0x0a49, 0xbae0, 0xb2d8, 0xabe7, 0xba1f, 0x40b2, 0xbafc, 0x4679, 0x37aa, 0x40e8, 0x12a2, 0xb0fa, 0x3fe1, 0x42a3, 0x1866, 0xba6b, 0x00a0, 0x3304, 0xbf5b, 0x4431, 0x40d8, 0x0a5a, 0x42e0, 0x41c7, 0x1980, 0xb096, 0xbfc3, 0xba10, 0x1efd, 0x2704, 0x419c, 0xb235, 0xbf97, 0x4391, 0x0740, 0x4057, 0x0d91, 0x4122, 0x1f06, 0x42d4, 0x42ce, 0x4211, 0x439a, 0x1d59, 0xbf98, 0xba68, 0x4275, 0x413f, 0x1d15, 0x4180, 0x414a, 0x421e, 0x438a, 0xa29c, 0x3fb4, 0xbf0b, 0x4025, 0x41ab, 0x428d, 0xb2b5, 0xb067, 0xbf90, 0xb258, 0xbf18, 0x2023, 0x43e4, 0x44d5, 0x37d4, 0xb09e, 0x427d, 0x29dc, 0x4171, 0x041a, 0xbfba, 0xb29f, 0xb26a, 0x427f, 0x4238, 0x4381, 0x15bc, 0x430b, 0x2760, 0x1aab, 0xb2ff, 0x4282, 0x103e, 0xa10f, 0x0891, 0x4056, 0x408e, 0x0276, 0xbfb6, 0x094c, 0x2c6a, 0xba4e, 0x403b, 0xb24c, 0xabc2, 0xb0f6, 0x4366, 0x1ded, 0x408a, 0x40bf, 0x4352, 0x10a3, 0xb0bc, 0x42e6, 0x40a5, 0x4551, 0x37ad, 0xbf02, 0xb0f1, 0x43e0, 0xb213, 0x4105, 0xb2bc, 0x40c4, 0xb20e, 0x1117, 0x40b2, 0x412b, 0x1dd0, 0x43a6, 0x43f9, 0x4391, 0x26fd, 0x07df, 0xbf13, 0x4152, 0x22a3, 0x1936, 0x1915, 0x40bb, 0x21c5, 0x2a65, 0x2572, 0x4117, 0x19ba, 0x43c3, 0x41ad, 0xb20a, 0x1fd6, 0x37bd, 0xb00b, 0x41b3, 0xa0b2, 0xb2f5, 0xb209, 0x40f3, 0xb244, 0x4380, 0xb20a, 0x41c7, 0xbf9c, 0xba2b, 0x4064, 0x4048, 0xb2f9, 0xbff0, 0x4399, 0x42bb, 0x1c85, 0x31be, 0x322d, 0x102a, 0x4614, 0x1860, 0x42fb, 0x1fd4, 0x1ba5, 0x4395, 0x3c83, 0xa80f, 0x439b, 0xba4a, 0xbf98, 0x40a3, 0x4065, 0x04dc, 0xbf38, 0x4260, 0xaa25, 0x220a, 0x05e2, 0x40ec, 0xbf60, 0x41b3, 0x127f, 0x40de, 0xb0a8, 0x43ba, 0x41be, 0xbf93, 0x2f9a, 0xb059, 0xb0a5, 0x4196, 0x4343, 0x400e, 0xbfb4, 0x4324, 0xb0fd, 0x09ed, 0xbad8, 0xb02d, 0x150b, 0x4016, 0xbfa6, 0xba3e, 0x439a, 0x3d0b, 0x1b7a, 0xba18, 0x241e, 0xa47d, 0xb22f, 0xb281, 0x40be, 0x4096, 0xb046, 0x43c2, 0x0c15, 0xb079, 0xb21e, 0xbf54, 0x42ab, 0xb234, 0x46b0, 0x1c7b, 0x4297, 0x43f4, 0x029f, 0x3405, 0x42d0, 0x42d2, 0x41b3, 0x40fe, 0x45c4, 0xb0db, 0x43ba, 0x4219, 0x4269, 0x1612, 0x41ac, 0x40ce, 0x3511, 0x4339, 0xb023, 0x130e, 0xb281, 0x1d1d, 0xbfcd, 0x419a, 0xba2b, 0x4011, 0xb295, 0x43f1, 0x40f7, 0xb264, 0xba37, 0xb2d0, 0xbf46, 0x18b3, 0x34c0, 0x040f, 0x401a, 0x138a, 0xa805, 0xb259, 0x440a, 0x1bee, 0xa5a7, 0x43f8, 0x407e, 0x424a, 0xb2f0, 0x433a, 0x39aa, 0x19d8, 0x42d2, 0xa041, 0x41c5, 0x214f, 0xb08f, 0x4231, 0x40b5, 0x05df, 0xbfa6, 0xa527, 0x455f, 0x2dc3, 0x1f02, 0xbaf8, 0x45e2, 0x466d, 0xa17d, 0x39d3, 0x1cdb, 0x4353, 0x43d0, 0x1b82, 0x0fc7, 0x4367, 0xba0b, 0xa21c, 0xbf4d, 0xba44, 0xa48c, 0x4185, 0x4168, 0x27d1, 0x21e1, 0x4316, 0x309b, 0x1859, 0x3d8d, 0x41fa, 0xba63, 0x2168, 0x0966, 0x43f5, 0x35ce, 0x3894, 0x412f, 0xbae5, 0x4557, 0x45b2, 0x4601, 0xb240, 0x4301, 0x4237, 0x4608, 0x1707, 0x08e5, 0xbf57, 0x3831, 0x41fe, 0x1722, 0x1f29, 0x45dd, 0x4233, 0x4550, 0xba2f, 0x3c89, 0xbfc0, 0xbf0c, 0xb2ad, 0x4042, 0x3c09, 0x1f76, 0xb29c, 0x43ce, 0x28fc, 0x4661, 0xb28c, 0x432b, 0x4277, 0xa32e, 0x42ae, 0x41c3, 0x1cad, 0x4203, 0x40bc, 0x43c6, 0xbf78, 0xbae9, 0x4222, 0x0094, 0x4350, 0x41d9, 0x415e, 0xb2b7, 0x4088, 0xb060, 0x40bd, 0xbf6b, 0x1a14, 0xa78c, 0xb2cf, 0x4021, 0x1adf, 0xba10, 0x1bfb, 0x41fe, 0x1b0e, 0x4369, 0x40e6, 0xbfab, 0x4077, 0x4673, 0x2c2d, 0x1df1, 0xb2bd, 0x42b0, 0xbf90, 0x03a8, 0xae03, 0x40ea, 0xbf15, 0x388f, 0x43ef, 0x2e69, 0x4130, 0x40b8, 0x3597, 0x4688, 0x1a86, 0x08aa, 0x4479, 0x45ea, 0x433c, 0xbf60, 0x1e2d, 0x1a2d, 0xb001, 0x1932, 0xaf95, 0x41aa, 0x4477, 0xb050, 0x42f6, 0xb219, 0xb03e, 0xb27e, 0xb0e7, 0xbae9, 0x4189, 0x4077, 0xbfb1, 0x407f, 0x454d, 0x044d, 0x410f, 0x46fa, 0x4265, 0x43aa, 0x41e0, 0x19da, 0x3196, 0x403d, 0x435c, 0x40f5, 0x4067, 0x3122, 0x1ea4, 0x40d7, 0x40dd, 0x1cb3, 0xb241, 0xb20d, 0xae94, 0xb20c, 0x42bb, 0x41a6, 0x4084, 0xa88d, 0xbfb8, 0x42c2, 0xb260, 0xba2d, 0x4119, 0xba63, 0xb2cf, 0x2aaa, 0xa2c2, 0x32e4, 0x42eb, 0xb24c, 0x04eb, 0x43fc, 0xb2c5, 0x4158, 0xb26f, 0x4664, 0x2f2a, 0xb0f7, 0x0290, 0x40d7, 0x1955, 0x1cc8, 0x405c, 0x1d87, 0x40b5, 0xbf89, 0xa488, 0xb2db, 0x401e, 0xb25d, 0xb2c8, 0xba28, 0xb09b, 0x0813, 0x06b2, 0xba07, 0x416e, 0x2476, 0x40c1, 0x1902, 0xb0c8, 0x3d59, 0x26cd, 0xbad0, 0x3338, 0xb2d5, 0x41c1, 0x19e0, 0xbfdf, 0x1e0b, 0x4301, 0x00f0, 0xb252, 0xb2be, 0x4614, 0x1c4b, 0xb00a, 0x44b3, 0xba75, 0x416c, 0x4283, 0x0e46, 0xae89, 0xba0e, 0x4287, 0x3290, 0x4296, 0x43fe, 0xa47a, 0x4243, 0xba58, 0x4076, 0xb2d3, 0xb2ee, 0x42c8, 0xbf8a, 0x4087, 0x465d, 0x0812, 0xb0d0, 0x1b04, 0x41c3, 0xba2c, 0x461b, 0x43c2, 0x1d5b, 0x439d, 0x41d2, 0xbf62, 0x4283, 0x41d3, 0x2cd1, 0x19da, 0xba70, 0xba7d, 0xbf4c, 0x4024, 0xa8a8, 0x3533, 0x4356, 0x4360, 0x40e8, 0x1a0c, 0x4217, 0x46ad, 0x2bcf, 0x4136, 0x41ba, 0xa279, 0x25e8, 0xbfe0, 0xb2a5, 0xa2f0, 0xbf15, 0x41e7, 0xbac9, 0x1f73, 0x410f, 0x0d8a, 0x40d3, 0xab54, 0x4219, 0x1984, 0xbada, 0x4384, 0x1b68, 0x44a8, 0x11d9, 0x4048, 0xbfa6, 0xb2f9, 0x42a0, 0x4237, 0x1298, 0xb0ce, 0x42e5, 0xb2c3, 0x40ce, 0x43eb, 0x29fe, 0x437a, 0xb238, 0xb2e5, 0xa899, 0xb05c, 0xbf91, 0x1947, 0x446b, 0x2586, 0x407f, 0xb275, 0x4193, 0x40eb, 0x439a, 0x2b6e, 0x4378, 0xb2b0, 0xba74, 0x438a, 0x1949, 0xab0c, 0xb208, 0xbae5, 0x4631, 0xbfcd, 0x4165, 0xba67, 0x4038, 0xb007, 0x177e, 0x4275, 0x1b62, 0x2fff, 0x45c6, 0x31d9, 0x429d, 0x18c1, 0x46dc, 0xb2c2, 0x41a9, 0x4390, 0x4362, 0xb0a3, 0xbae3, 0x102a, 0xb08c, 0x27c5, 0xbf0d, 0x1b86, 0xadce, 0xb0bb, 0x1d65, 0x412e, 0xb0d9, 0x2bf0, 0x320b, 0x433e, 0xadb6, 0x406a, 0x20e1, 0x1c81, 0x40ba, 0x13e1, 0x19cd, 0xb2a4, 0xbf5a, 0x46aa, 0x43b8, 0xb211, 0x4770, 0xe7fe + ], + StartRegs = [0x35faf52d, 0x178d83c4, 0xd9eed1e5, 0x2d403c23, 0x142e3ba1, 0xfdb96242, 0xb8568fae, 0xd9e9fcd8, 0xdb303d2f, 0xb29babc4, 0x02ba22df, 0x57781ed2, 0x79ab341b, 0x84723a31, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000000c5, 0x000000c5, 0x000000c5, 0x0fa51006, 0x79ab341b, 0x000000c5, 0x57781ed2, 0x57781ed2, 0xfffffd5f, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x0968, 0x41a2, 0x1b65, 0xb07e, 0xba6a, 0x403d, 0x25a7, 0xba28, 0x0ab4, 0x3baf, 0xbf63, 0x300c, 0x16a4, 0x3997, 0xb26e, 0xb094, 0xb27b, 0x4184, 0x26c7, 0x4019, 0xbf84, 0x437f, 0x1beb, 0x40ff, 0x4103, 0x4642, 0x41df, 0x4310, 0xa2cb, 0xbfbf, 0x33f8, 0x4387, 0x3837, 0x41fb, 0x26da, 0xb076, 0x459d, 0x044e, 0xbf19, 0x4041, 0x021c, 0x1051, 0x17ba, 0xba72, 0xb26d, 0x4418, 0x0d16, 0x4235, 0xb299, 0x2c02, 0xb27c, 0xbaf1, 0xac4f, 0x4434, 0xb20c, 0x0a23, 0x41dc, 0xb00f, 0xbf14, 0x3ed6, 0x404c, 0x45c2, 0x3528, 0x2bdb, 0xa5c7, 0x40b6, 0xbf60, 0x4042, 0x43ae, 0xa0f5, 0xbf62, 0x1fdf, 0xba2b, 0xb2eb, 0xa7ef, 0x1c7a, 0x02de, 0x43c3, 0xbfde, 0xb247, 0xba79, 0x4010, 0x43d3, 0x41eb, 0x4211, 0x43a9, 0x238e, 0x44ec, 0x3f4b, 0xb0e7, 0x4338, 0xb2b1, 0x40d2, 0x438c, 0x409e, 0xb285, 0x191c, 0xb2f6, 0x4047, 0x1d63, 0x213a, 0x400d, 0xb2c8, 0xa8b9, 0x04ea, 0x40ca, 0x407b, 0xbfdc, 0xb295, 0x265d, 0x404a, 0x427d, 0x42d7, 0xb03e, 0x1647, 0x4325, 0x183d, 0x0b07, 0x1c1a, 0xa8e1, 0x4147, 0xae6f, 0x2492, 0x10cf, 0x1af3, 0x411e, 0xa991, 0x12a1, 0xbfa1, 0x40df, 0xa2c7, 0x4275, 0x17de, 0x0093, 0x151f, 0x427d, 0x40d9, 0x4171, 0x429b, 0x3fac, 0x4170, 0x0994, 0x4140, 0xb04b, 0xad99, 0xb257, 0x3c21, 0x4301, 0xba22, 0xbae2, 0x3a3d, 0x4290, 0xbf5a, 0x41e3, 0x424d, 0xba3a, 0xb264, 0xb2e8, 0xbfe1, 0x42b7, 0xb217, 0x42a0, 0x404d, 0xb200, 0x42fd, 0x40c3, 0x410d, 0xb231, 0x434c, 0x41a2, 0x2c01, 0x02ff, 0x432f, 0x4335, 0x42a8, 0x426c, 0x4180, 0x446b, 0xbf80, 0xa9b8, 0x4223, 0xbf45, 0x02ae, 0xb2c5, 0xb291, 0xb0a2, 0x1e0f, 0xbaca, 0x44f9, 0x2594, 0xb02c, 0x1697, 0x1a0f, 0xba47, 0xa098, 0x411b, 0xbae1, 0x45eb, 0x42c2, 0xba6b, 0x409f, 0xb02c, 0x4382, 0xba24, 0xba79, 0x2dda, 0x4141, 0x41fc, 0x462d, 0xb0bd, 0xbfa8, 0x43d8, 0x2cda, 0x43dc, 0x401c, 0xba12, 0xb228, 0x436f, 0x423b, 0xb20a, 0x2089, 0xa5eb, 0x421a, 0xb2dc, 0x406c, 0xbf71, 0x439c, 0x43d2, 0xb27d, 0x43a6, 0xaa82, 0x4195, 0x403d, 0x1811, 0x41c9, 0xbafe, 0x41a8, 0x3d5e, 0x414b, 0xbf61, 0x1955, 0x374f, 0x2d82, 0xb23b, 0xb080, 0x0c12, 0x14c7, 0xba50, 0xb25c, 0x40ab, 0x4132, 0x4270, 0x4375, 0x184b, 0xbf3e, 0xbaec, 0x3645, 0x4045, 0x40e8, 0x1939, 0x40de, 0xbf03, 0x406e, 0x4201, 0x4544, 0x40fc, 0x427d, 0x2550, 0x0046, 0xa85e, 0x39dc, 0x419f, 0x401f, 0xb0a7, 0x4299, 0x1635, 0x430f, 0x40e4, 0x4163, 0x40b5, 0x4304, 0xbf80, 0x07b0, 0x1b13, 0xb207, 0x4218, 0x437c, 0xbf86, 0x400f, 0x4334, 0xb26a, 0x288d, 0x4235, 0x4462, 0xb000, 0xa2a9, 0xba54, 0x42e0, 0xb29e, 0x4273, 0xb09b, 0x341f, 0xb281, 0x33e0, 0x38e9, 0x40da, 0x464c, 0xbf9e, 0xa1f8, 0x40a4, 0x3a31, 0x4190, 0x459d, 0x40ec, 0x2a92, 0x463e, 0xba46, 0x014a, 0x4001, 0x1903, 0x428b, 0x38c6, 0x40d0, 0xb27c, 0x4361, 0x4467, 0x411d, 0x4044, 0x4205, 0x196f, 0xbf2b, 0xb2d9, 0x4351, 0xb29b, 0xbaef, 0x15fc, 0x410a, 0x1ac1, 0xb2c9, 0x150f, 0x419a, 0xb266, 0x0f11, 0x46a2, 0x412d, 0xb2da, 0xb259, 0x42ab, 0x0bad, 0x40a5, 0x42a6, 0x42a8, 0x1d2c, 0x42d0, 0xb2a3, 0x1ac2, 0xbf0a, 0x1c92, 0xb0a7, 0xaaa2, 0xbf5a, 0x4210, 0x428a, 0x1d36, 0xbfd4, 0x42d9, 0xb25f, 0x426e, 0x4198, 0x4200, 0x01dd, 0x1a2b, 0x4216, 0x4482, 0xbadf, 0x406f, 0x1839, 0x41f5, 0x43df, 0xb28f, 0xba7f, 0x402b, 0x412b, 0xb031, 0xbf1f, 0x419c, 0x43dc, 0xa31c, 0x43de, 0xb21c, 0x07e8, 0xa414, 0x41e8, 0x190a, 0x1974, 0x43a7, 0x43ec, 0xba51, 0x42a3, 0x4174, 0x1c77, 0x1cce, 0xb217, 0x0fd5, 0xbf4a, 0x07cb, 0x403c, 0x4011, 0xb20f, 0x2d7e, 0x4049, 0x4131, 0x1a6a, 0x187a, 0x420b, 0x4395, 0x24f5, 0x4009, 0xbf44, 0x0822, 0x0457, 0x137e, 0x1dd1, 0xb093, 0x1543, 0xb2df, 0x4022, 0xb0ca, 0xbf0a, 0xba0d, 0x44f5, 0x433e, 0xb274, 0x41ce, 0xb26d, 0x413e, 0x442b, 0xb0b6, 0x405b, 0x45b9, 0xb271, 0x454f, 0x3b98, 0xb250, 0x42ea, 0xbf41, 0x3ab9, 0x18ac, 0x42c8, 0x1f9c, 0x4342, 0x456d, 0x40d6, 0x32e8, 0x1e55, 0x40af, 0x40f6, 0x406d, 0xb2b0, 0x4081, 0xba3f, 0x45c3, 0xbfc9, 0x1197, 0x46e8, 0xb25f, 0x336f, 0x0655, 0xbf47, 0x460b, 0x467f, 0xaad1, 0xb0d9, 0x3dc1, 0xba3c, 0x1986, 0xbf18, 0x410f, 0x42de, 0x18db, 0xb284, 0xb2cb, 0x433c, 0x2e9e, 0x1c28, 0x4316, 0xbf0c, 0xa396, 0x44e4, 0x043d, 0x421d, 0x24f3, 0x46d8, 0xbfdb, 0x43ba, 0xbfe0, 0x3e5d, 0x42ba, 0x4141, 0x42d3, 0xba66, 0x4113, 0xbae7, 0xbfd2, 0x209b, 0xba1f, 0x430b, 0x40da, 0x25ba, 0x4183, 0x1e9b, 0x4160, 0x4321, 0x41ab, 0x1ddb, 0x1c06, 0x41c9, 0x44e5, 0xba67, 0x2f30, 0x42ad, 0x43be, 0xa2cc, 0x41d7, 0x434e, 0x41a1, 0x3017, 0x34dd, 0xbf42, 0xb253, 0x3bb3, 0x42a0, 0x40f5, 0x1c73, 0x42d9, 0xba2a, 0x42aa, 0xb2f7, 0x424f, 0xbf61, 0x427f, 0x319f, 0x4281, 0x0e25, 0x0bf2, 0x40df, 0x4367, 0xbf16, 0x128a, 0x42b4, 0x43af, 0x1d3c, 0x20d8, 0x42d0, 0x4374, 0xb291, 0x3c17, 0x413e, 0xbf67, 0xba0e, 0xb09e, 0x432c, 0x4355, 0x422b, 0x468a, 0xba1f, 0x414c, 0x4092, 0xb24a, 0x4085, 0x0c34, 0xb0e7, 0x055e, 0x4052, 0x350c, 0x00c1, 0x1b27, 0x42ff, 0xb258, 0x46db, 0xb204, 0xbf9a, 0x204b, 0xb228, 0x4438, 0x42aa, 0x1acc, 0x43c5, 0x40ea, 0x4028, 0x1ff9, 0x0634, 0xba3c, 0x41fe, 0x4205, 0x4310, 0x18b9, 0x1c8a, 0x4390, 0x23ab, 0x4131, 0x4632, 0xbf4e, 0x4110, 0x4337, 0x3ef8, 0xa221, 0xa445, 0x3505, 0x4016, 0xb0be, 0x41ca, 0xbff0, 0x40e0, 0xaf82, 0x43d3, 0x4004, 0xbaf2, 0x44fa, 0x43d3, 0xbadb, 0x1a50, 0x42ba, 0x07db, 0xba13, 0xb230, 0xbadf, 0x43a0, 0x18c3, 0xb2a0, 0xb283, 0xbf41, 0x1d95, 0x1070, 0x2958, 0xb047, 0x42fb, 0xb21f, 0x04f0, 0x43b4, 0xba7e, 0x4200, 0x41f2, 0x42ea, 0x42d1, 0x4270, 0x1f13, 0x434b, 0xb24d, 0x2b14, 0x1577, 0x1eae, 0x4207, 0x46d4, 0x41a0, 0x41d7, 0x0088, 0x4069, 0x1ee5, 0x40a1, 0xbf44, 0x4053, 0x440d, 0x1fe8, 0x427b, 0x4048, 0x40fb, 0x4340, 0xb270, 0x25d9, 0xba7a, 0x1859, 0x393f, 0xb2b3, 0x150b, 0x4332, 0x0152, 0x0589, 0xb2e5, 0x4088, 0x20a7, 0xba4d, 0xa406, 0x37d6, 0x40b6, 0xbadd, 0xbfd7, 0x409b, 0x4116, 0x031c, 0x417b, 0x438a, 0xbff0, 0x40a8, 0x1d5e, 0x426d, 0xb2ee, 0x4380, 0xbf0d, 0xb212, 0x1b52, 0x2108, 0x1b29, 0x1b85, 0x43cb, 0x379e, 0x43b6, 0xbfb0, 0xb0ce, 0x0e2c, 0x02eb, 0x223d, 0x4185, 0x400d, 0xb200, 0x435e, 0x4205, 0xba20, 0xbf5f, 0xb06d, 0x18b9, 0x4235, 0x42e5, 0xbaf4, 0xb0fe, 0x0de1, 0x458c, 0x463b, 0x1a59, 0x1efc, 0xb2de, 0x41df, 0x1f03, 0x3cb2, 0x1c76, 0xa923, 0x462f, 0x1abc, 0xbf0d, 0x41e6, 0x42ad, 0x4625, 0x0d75, 0x45bc, 0xba5a, 0x42b3, 0xba0b, 0x4250, 0x4123, 0x1956, 0x275c, 0xbaf5, 0x3f77, 0xba2f, 0x1b93, 0x4209, 0x4370, 0xb2d5, 0x4164, 0xbfe8, 0x40c2, 0x4399, 0x40ee, 0xbacf, 0x4230, 0x4055, 0x4342, 0x428e, 0x4372, 0x1af5, 0xb0f6, 0x4096, 0x1a4a, 0x1c74, 0x1b7b, 0x27d4, 0x1dfb, 0x3d43, 0x0c87, 0x2649, 0xbaf2, 0x40dc, 0xbf70, 0xbff0, 0xb24a, 0x40f6, 0xbf62, 0x42da, 0x46d3, 0x407b, 0x432d, 0xb207, 0x427a, 0x417b, 0x4156, 0x291d, 0x41c1, 0x41c8, 0x42d8, 0xb27c, 0xb0a5, 0x42cf, 0x2f18, 0x4661, 0x426a, 0x4316, 0x3f27, 0xbade, 0x42fd, 0x43e9, 0xbf5b, 0x4172, 0xac9d, 0x429e, 0x444b, 0xa3d2, 0x19ac, 0x411e, 0x211e, 0x40dc, 0x4332, 0x405f, 0x2ae6, 0x1bc6, 0xba2b, 0x1f21, 0x4124, 0x404b, 0x42b0, 0x4217, 0xb2b4, 0xb0cc, 0x2e76, 0x1f91, 0x23f0, 0xb206, 0x0d78, 0x4323, 0x312a, 0xbf46, 0x4198, 0x42de, 0x430c, 0x433a, 0x40f4, 0x41ea, 0x1c1d, 0x447e, 0xbae1, 0xa070, 0x415a, 0x4111, 0xb026, 0x4323, 0xbf72, 0x4419, 0x410e, 0x04c5, 0x422f, 0x16fa, 0x3627, 0x24fc, 0x42b9, 0xbf6e, 0x42ef, 0x1589, 0x05b3, 0xbf84, 0x3920, 0x01a7, 0x0d74, 0x4240, 0x241c, 0x1b1f, 0x408d, 0x1f58, 0x40d2, 0xb072, 0xbf29, 0x1994, 0x16a6, 0x403f, 0x4145, 0x2d03, 0xa4f8, 0x1b74, 0x4195, 0xba79, 0x4418, 0x4037, 0x40f8, 0xba19, 0xba7c, 0x44c8, 0x435a, 0x40e3, 0x43c3, 0x431b, 0x4124, 0x409b, 0x4355, 0x42db, 0x4300, 0x17a9, 0x3dfd, 0xbf0b, 0x41eb, 0xbac5, 0x0b64, 0x1f66, 0x098c, 0xbf60, 0x456a, 0xb0c2, 0x223c, 0x4301, 0xb20e, 0x4628, 0x4062, 0x1d7d, 0x43b7, 0x4369, 0x424c, 0xbaf7, 0xbfa9, 0xbace, 0x41c5, 0x4390, 0x420e, 0x40ff, 0x41f4, 0x4186, 0x4022, 0xbfa0, 0x4151, 0xa81d, 0x4019, 0x4220, 0x41f5, 0xbfcf, 0x43b6, 0xb290, 0xbfc0, 0x4311, 0x437d, 0xbfa0, 0xb2a4, 0xba2a, 0x41e6, 0xbf81, 0x0d08, 0x1e47, 0x1cb0, 0x4370, 0x12b8, 0xb261, 0xb26a, 0x437c, 0xbafe, 0x42b8, 0x43e5, 0xb0e5, 0xba58, 0x4158, 0x42a0, 0x4311, 0x4144, 0x1fc0, 0x1dc0, 0x08a7, 0x171f, 0x4637, 0x445d, 0x0a52, 0x1f8e, 0x1a78, 0xb2e5, 0xbf42, 0xba74, 0xba51, 0x1dd6, 0x45b6, 0x4278, 0x4389, 0x4230, 0xa3e1, 0x0f67, 0x42d0, 0xba44, 0xbfb0, 0x4383, 0x4583, 0xad13, 0x404e, 0x43b2, 0x4295, 0x0b4d, 0x42e6, 0x42bf, 0x107b, 0xbfb8, 0x1fa3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x5384f6cd, 0x93b1eb86, 0x519fcf8e, 0x564cda67, 0xcde58997, 0xf3ec3c43, 0x6c08d4ea, 0x6e3c1d46, 0xe8c48cc6, 0xcea89f8e, 0x2f68758c, 0x0e162d4d, 0xc7597952, 0x77abbef9, 0x00000000, 0xa00001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0xdcbede57, 0xcea8b10a, 0x00011309, 0x0e162d4d, 0x00011309, 0xf5b62f3f, 0x00000000, 0x400001d0 }, + Instructions = [0x0968, 0x41a2, 0x1b65, 0xb07e, 0xba6a, 0x403d, 0x25a7, 0xba28, 0x0ab4, 0x3baf, 0xbf63, 0x300c, 0x16a4, 0x3997, 0xb26e, 0xb094, 0xb27b, 0x4184, 0x26c7, 0x4019, 0xbf84, 0x437f, 0x1beb, 0x40ff, 0x4103, 0x4642, 0x41df, 0x4310, 0xa2cb, 0xbfbf, 0x33f8, 0x4387, 0x3837, 0x41fb, 0x26da, 0xb076, 0x459d, 0x044e, 0xbf19, 0x4041, 0x021c, 0x1051, 0x17ba, 0xba72, 0xb26d, 0x4418, 0x0d16, 0x4235, 0xb299, 0x2c02, 0xb27c, 0xbaf1, 0xac4f, 0x4434, 0xb20c, 0x0a23, 0x41dc, 0xb00f, 0xbf14, 0x3ed6, 0x404c, 0x45c2, 0x3528, 0x2bdb, 0xa5c7, 0x40b6, 0xbf60, 0x4042, 0x43ae, 0xa0f5, 0xbf62, 0x1fdf, 0xba2b, 0xb2eb, 0xa7ef, 0x1c7a, 0x02de, 0x43c3, 0xbfde, 0xb247, 0xba79, 0x4010, 0x43d3, 0x41eb, 0x4211, 0x43a9, 0x238e, 0x44ec, 0x3f4b, 0xb0e7, 0x4338, 0xb2b1, 0x40d2, 0x438c, 0x409e, 0xb285, 0x191c, 0xb2f6, 0x4047, 0x1d63, 0x213a, 0x400d, 0xb2c8, 0xa8b9, 0x04ea, 0x40ca, 0x407b, 0xbfdc, 0xb295, 0x265d, 0x404a, 0x427d, 0x42d7, 0xb03e, 0x1647, 0x4325, 0x183d, 0x0b07, 0x1c1a, 0xa8e1, 0x4147, 0xae6f, 0x2492, 0x10cf, 0x1af3, 0x411e, 0xa991, 0x12a1, 0xbfa1, 0x40df, 0xa2c7, 0x4275, 0x17de, 0x0093, 0x151f, 0x427d, 0x40d9, 0x4171, 0x429b, 0x3fac, 0x4170, 0x0994, 0x4140, 0xb04b, 0xad99, 0xb257, 0x3c21, 0x4301, 0xba22, 0xbae2, 0x3a3d, 0x4290, 0xbf5a, 0x41e3, 0x424d, 0xba3a, 0xb264, 0xb2e8, 0xbfe1, 0x42b7, 0xb217, 0x42a0, 0x404d, 0xb200, 0x42fd, 0x40c3, 0x410d, 0xb231, 0x434c, 0x41a2, 0x2c01, 0x02ff, 0x432f, 0x4335, 0x42a8, 0x426c, 0x4180, 0x446b, 0xbf80, 0xa9b8, 0x4223, 0xbf45, 0x02ae, 0xb2c5, 0xb291, 0xb0a2, 0x1e0f, 0xbaca, 0x44f9, 0x2594, 0xb02c, 0x1697, 0x1a0f, 0xba47, 0xa098, 0x411b, 0xbae1, 0x45eb, 0x42c2, 0xba6b, 0x409f, 0xb02c, 0x4382, 0xba24, 0xba79, 0x2dda, 0x4141, 0x41fc, 0x462d, 0xb0bd, 0xbfa8, 0x43d8, 0x2cda, 0x43dc, 0x401c, 0xba12, 0xb228, 0x436f, 0x423b, 0xb20a, 0x2089, 0xa5eb, 0x421a, 0xb2dc, 0x406c, 0xbf71, 0x439c, 0x43d2, 0xb27d, 0x43a6, 0xaa82, 0x4195, 0x403d, 0x1811, 0x41c9, 0xbafe, 0x41a8, 0x3d5e, 0x414b, 0xbf61, 0x1955, 0x374f, 0x2d82, 0xb23b, 0xb080, 0x0c12, 0x14c7, 0xba50, 0xb25c, 0x40ab, 0x4132, 0x4270, 0x4375, 0x184b, 0xbf3e, 0xbaec, 0x3645, 0x4045, 0x40e8, 0x1939, 0x40de, 0xbf03, 0x406e, 0x4201, 0x4544, 0x40fc, 0x427d, 0x2550, 0x0046, 0xa85e, 0x39dc, 0x419f, 0x401f, 0xb0a7, 0x4299, 0x1635, 0x430f, 0x40e4, 0x4163, 0x40b5, 0x4304, 0xbf80, 0x07b0, 0x1b13, 0xb207, 0x4218, 0x437c, 0xbf86, 0x400f, 0x4334, 0xb26a, 0x288d, 0x4235, 0x4462, 0xb000, 0xa2a9, 0xba54, 0x42e0, 0xb29e, 0x4273, 0xb09b, 0x341f, 0xb281, 0x33e0, 0x38e9, 0x40da, 0x464c, 0xbf9e, 0xa1f8, 0x40a4, 0x3a31, 0x4190, 0x459d, 0x40ec, 0x2a92, 0x463e, 0xba46, 0x014a, 0x4001, 0x1903, 0x428b, 0x38c6, 0x40d0, 0xb27c, 0x4361, 0x4467, 0x411d, 0x4044, 0x4205, 0x196f, 0xbf2b, 0xb2d9, 0x4351, 0xb29b, 0xbaef, 0x15fc, 0x410a, 0x1ac1, 0xb2c9, 0x150f, 0x419a, 0xb266, 0x0f11, 0x46a2, 0x412d, 0xb2da, 0xb259, 0x42ab, 0x0bad, 0x40a5, 0x42a6, 0x42a8, 0x1d2c, 0x42d0, 0xb2a3, 0x1ac2, 0xbf0a, 0x1c92, 0xb0a7, 0xaaa2, 0xbf5a, 0x4210, 0x428a, 0x1d36, 0xbfd4, 0x42d9, 0xb25f, 0x426e, 0x4198, 0x4200, 0x01dd, 0x1a2b, 0x4216, 0x4482, 0xbadf, 0x406f, 0x1839, 0x41f5, 0x43df, 0xb28f, 0xba7f, 0x402b, 0x412b, 0xb031, 0xbf1f, 0x419c, 0x43dc, 0xa31c, 0x43de, 0xb21c, 0x07e8, 0xa414, 0x41e8, 0x190a, 0x1974, 0x43a7, 0x43ec, 0xba51, 0x42a3, 0x4174, 0x1c77, 0x1cce, 0xb217, 0x0fd5, 0xbf4a, 0x07cb, 0x403c, 0x4011, 0xb20f, 0x2d7e, 0x4049, 0x4131, 0x1a6a, 0x187a, 0x420b, 0x4395, 0x24f5, 0x4009, 0xbf44, 0x0822, 0x0457, 0x137e, 0x1dd1, 0xb093, 0x1543, 0xb2df, 0x4022, 0xb0ca, 0xbf0a, 0xba0d, 0x44f5, 0x433e, 0xb274, 0x41ce, 0xb26d, 0x413e, 0x442b, 0xb0b6, 0x405b, 0x45b9, 0xb271, 0x454f, 0x3b98, 0xb250, 0x42ea, 0xbf41, 0x3ab9, 0x18ac, 0x42c8, 0x1f9c, 0x4342, 0x456d, 0x40d6, 0x32e8, 0x1e55, 0x40af, 0x40f6, 0x406d, 0xb2b0, 0x4081, 0xba3f, 0x45c3, 0xbfc9, 0x1197, 0x46e8, 0xb25f, 0x336f, 0x0655, 0xbf47, 0x460b, 0x467f, 0xaad1, 0xb0d9, 0x3dc1, 0xba3c, 0x1986, 0xbf18, 0x410f, 0x42de, 0x18db, 0xb284, 0xb2cb, 0x433c, 0x2e9e, 0x1c28, 0x4316, 0xbf0c, 0xa396, 0x44e4, 0x043d, 0x421d, 0x24f3, 0x46d8, 0xbfdb, 0x43ba, 0xbfe0, 0x3e5d, 0x42ba, 0x4141, 0x42d3, 0xba66, 0x4113, 0xbae7, 0xbfd2, 0x209b, 0xba1f, 0x430b, 0x40da, 0x25ba, 0x4183, 0x1e9b, 0x4160, 0x4321, 0x41ab, 0x1ddb, 0x1c06, 0x41c9, 0x44e5, 0xba67, 0x2f30, 0x42ad, 0x43be, 0xa2cc, 0x41d7, 0x434e, 0x41a1, 0x3017, 0x34dd, 0xbf42, 0xb253, 0x3bb3, 0x42a0, 0x40f5, 0x1c73, 0x42d9, 0xba2a, 0x42aa, 0xb2f7, 0x424f, 0xbf61, 0x427f, 0x319f, 0x4281, 0x0e25, 0x0bf2, 0x40df, 0x4367, 0xbf16, 0x128a, 0x42b4, 0x43af, 0x1d3c, 0x20d8, 0x42d0, 0x4374, 0xb291, 0x3c17, 0x413e, 0xbf67, 0xba0e, 0xb09e, 0x432c, 0x4355, 0x422b, 0x468a, 0xba1f, 0x414c, 0x4092, 0xb24a, 0x4085, 0x0c34, 0xb0e7, 0x055e, 0x4052, 0x350c, 0x00c1, 0x1b27, 0x42ff, 0xb258, 0x46db, 0xb204, 0xbf9a, 0x204b, 0xb228, 0x4438, 0x42aa, 0x1acc, 0x43c5, 0x40ea, 0x4028, 0x1ff9, 0x0634, 0xba3c, 0x41fe, 0x4205, 0x4310, 0x18b9, 0x1c8a, 0x4390, 0x23ab, 0x4131, 0x4632, 0xbf4e, 0x4110, 0x4337, 0x3ef8, 0xa221, 0xa445, 0x3505, 0x4016, 0xb0be, 0x41ca, 0xbff0, 0x40e0, 0xaf82, 0x43d3, 0x4004, 0xbaf2, 0x44fa, 0x43d3, 0xbadb, 0x1a50, 0x42ba, 0x07db, 0xba13, 0xb230, 0xbadf, 0x43a0, 0x18c3, 0xb2a0, 0xb283, 0xbf41, 0x1d95, 0x1070, 0x2958, 0xb047, 0x42fb, 0xb21f, 0x04f0, 0x43b4, 0xba7e, 0x4200, 0x41f2, 0x42ea, 0x42d1, 0x4270, 0x1f13, 0x434b, 0xb24d, 0x2b14, 0x1577, 0x1eae, 0x4207, 0x46d4, 0x41a0, 0x41d7, 0x0088, 0x4069, 0x1ee5, 0x40a1, 0xbf44, 0x4053, 0x440d, 0x1fe8, 0x427b, 0x4048, 0x40fb, 0x4340, 0xb270, 0x25d9, 0xba7a, 0x1859, 0x393f, 0xb2b3, 0x150b, 0x4332, 0x0152, 0x0589, 0xb2e5, 0x4088, 0x20a7, 0xba4d, 0xa406, 0x37d6, 0x40b6, 0xbadd, 0xbfd7, 0x409b, 0x4116, 0x031c, 0x417b, 0x438a, 0xbff0, 0x40a8, 0x1d5e, 0x426d, 0xb2ee, 0x4380, 0xbf0d, 0xb212, 0x1b52, 0x2108, 0x1b29, 0x1b85, 0x43cb, 0x379e, 0x43b6, 0xbfb0, 0xb0ce, 0x0e2c, 0x02eb, 0x223d, 0x4185, 0x400d, 0xb200, 0x435e, 0x4205, 0xba20, 0xbf5f, 0xb06d, 0x18b9, 0x4235, 0x42e5, 0xbaf4, 0xb0fe, 0x0de1, 0x458c, 0x463b, 0x1a59, 0x1efc, 0xb2de, 0x41df, 0x1f03, 0x3cb2, 0x1c76, 0xa923, 0x462f, 0x1abc, 0xbf0d, 0x41e6, 0x42ad, 0x4625, 0x0d75, 0x45bc, 0xba5a, 0x42b3, 0xba0b, 0x4250, 0x4123, 0x1956, 0x275c, 0xbaf5, 0x3f77, 0xba2f, 0x1b93, 0x4209, 0x4370, 0xb2d5, 0x4164, 0xbfe8, 0x40c2, 0x4399, 0x40ee, 0xbacf, 0x4230, 0x4055, 0x4342, 0x428e, 0x4372, 0x1af5, 0xb0f6, 0x4096, 0x1a4a, 0x1c74, 0x1b7b, 0x27d4, 0x1dfb, 0x3d43, 0x0c87, 0x2649, 0xbaf2, 0x40dc, 0xbf70, 0xbff0, 0xb24a, 0x40f6, 0xbf62, 0x42da, 0x46d3, 0x407b, 0x432d, 0xb207, 0x427a, 0x417b, 0x4156, 0x291d, 0x41c1, 0x41c8, 0x42d8, 0xb27c, 0xb0a5, 0x42cf, 0x2f18, 0x4661, 0x426a, 0x4316, 0x3f27, 0xbade, 0x42fd, 0x43e9, 0xbf5b, 0x4172, 0xac9d, 0x429e, 0x444b, 0xa3d2, 0x19ac, 0x411e, 0x211e, 0x40dc, 0x4332, 0x405f, 0x2ae6, 0x1bc6, 0xba2b, 0x1f21, 0x4124, 0x404b, 0x42b0, 0x4217, 0xb2b4, 0xb0cc, 0x2e76, 0x1f91, 0x23f0, 0xb206, 0x0d78, 0x4323, 0x312a, 0xbf46, 0x4198, 0x42de, 0x430c, 0x433a, 0x40f4, 0x41ea, 0x1c1d, 0x447e, 0xbae1, 0xa070, 0x415a, 0x4111, 0xb026, 0x4323, 0xbf72, 0x4419, 0x410e, 0x04c5, 0x422f, 0x16fa, 0x3627, 0x24fc, 0x42b9, 0xbf6e, 0x42ef, 0x1589, 0x05b3, 0xbf84, 0x3920, 0x01a7, 0x0d74, 0x4240, 0x241c, 0x1b1f, 0x408d, 0x1f58, 0x40d2, 0xb072, 0xbf29, 0x1994, 0x16a6, 0x403f, 0x4145, 0x2d03, 0xa4f8, 0x1b74, 0x4195, 0xba79, 0x4418, 0x4037, 0x40f8, 0xba19, 0xba7c, 0x44c8, 0x435a, 0x40e3, 0x43c3, 0x431b, 0x4124, 0x409b, 0x4355, 0x42db, 0x4300, 0x17a9, 0x3dfd, 0xbf0b, 0x41eb, 0xbac5, 0x0b64, 0x1f66, 0x098c, 0xbf60, 0x456a, 0xb0c2, 0x223c, 0x4301, 0xb20e, 0x4628, 0x4062, 0x1d7d, 0x43b7, 0x4369, 0x424c, 0xbaf7, 0xbfa9, 0xbace, 0x41c5, 0x4390, 0x420e, 0x40ff, 0x41f4, 0x4186, 0x4022, 0xbfa0, 0x4151, 0xa81d, 0x4019, 0x4220, 0x41f5, 0xbfcf, 0x43b6, 0xb290, 0xbfc0, 0x4311, 0x437d, 0xbfa0, 0xb2a4, 0xba2a, 0x41e6, 0xbf81, 0x0d08, 0x1e47, 0x1cb0, 0x4370, 0x12b8, 0xb261, 0xb26a, 0x437c, 0xbafe, 0x42b8, 0x43e5, 0xb0e5, 0xba58, 0x4158, 0x42a0, 0x4311, 0x4144, 0x1fc0, 0x1dc0, 0x08a7, 0x171f, 0x4637, 0x445d, 0x0a52, 0x1f8e, 0x1a78, 0xb2e5, 0xbf42, 0xba74, 0xba51, 0x1dd6, 0x45b6, 0x4278, 0x4389, 0x4230, 0xa3e1, 0x0f67, 0x42d0, 0xba44, 0xbfb0, 0x4383, 0x4583, 0xad13, 0x404e, 0x43b2, 0x4295, 0x0b4d, 0x42e6, 0x42bf, 0x107b, 0xbfb8, 0x1fa3, 0x4770, 0xe7fe + ], + StartRegs = [0x5384f6cd, 0x93b1eb86, 0x519fcf8e, 0x564cda67, 0xcde58997, 0xf3ec3c43, 0x6c08d4ea, 0x6e3c1d46, 0xe8c48cc6, 0xcea89f8e, 0x2f68758c, 0x0e162d4d, 0xc7597952, 0x77abbef9, 0x00000000, 0xa00001f0 + ], + FinalRegs = [0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0xdcbede57, 0xcea8b10a, 0x00011309, 0x0e162d4d, 0x00011309, 0xf5b62f3f, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x1cdd, 0x1c98, 0xa82c, 0x22bd, 0xabb4, 0x4105, 0x3601, 0x432b, 0x406b, 0xb08c, 0xbacf, 0xb2ee, 0x382b, 0xb055, 0x4418, 0x16af, 0x4171, 0xb284, 0xb2c7, 0x4273, 0x43c5, 0xbf28, 0x4374, 0xb22c, 0xa063, 0x4242, 0x43f9, 0xba6a, 0x42a1, 0x4311, 0x4298, 0xb2b4, 0xbfcf, 0xba03, 0x41ed, 0xba7d, 0x444d, 0x1db4, 0x1de9, 0x192c, 0xbac1, 0x2cd3, 0xbfc9, 0xb224, 0xba09, 0x4098, 0x3ae8, 0x4310, 0xba6a, 0x4366, 0xb05a, 0xbf43, 0x406f, 0xb0a2, 0x0a86, 0x41c1, 0x413c, 0x1e56, 0x224c, 0xbf0e, 0xb016, 0x40d3, 0x40eb, 0x3b28, 0x4131, 0x30c8, 0xb23a, 0x40db, 0x2ff3, 0xb293, 0x1ea8, 0x4283, 0x4071, 0x40a5, 0x40db, 0x1539, 0xb2ff, 0xb0d4, 0xb2a4, 0xb2f4, 0xbf60, 0x433c, 0xbf0b, 0x3bac, 0x134e, 0xb241, 0xba6a, 0x1bf6, 0xb28b, 0xba3f, 0x43b1, 0x1f92, 0xba68, 0xb21e, 0x4272, 0x40a4, 0x2fde, 0xaec9, 0xad72, 0x42f0, 0x433f, 0xaa74, 0x1032, 0xa843, 0x19d7, 0xaf1b, 0xbf23, 0x14cb, 0x41a3, 0x1ff5, 0x40ca, 0xba1e, 0x4205, 0x4123, 0x401d, 0x1f2f, 0xbfc0, 0x3d68, 0x4368, 0x3441, 0x43e1, 0x04bf, 0x1934, 0xb299, 0x41bc, 0x4331, 0x00c2, 0xbf74, 0x4424, 0xb0de, 0x3563, 0xb2ea, 0x4325, 0x425f, 0x4331, 0x1516, 0x2bfa, 0xaa20, 0x4001, 0xb2dd, 0x1b4a, 0x435d, 0x1e15, 0x46fb, 0x1ca3, 0xb240, 0xba1e, 0x43ac, 0x04d1, 0x4288, 0xb053, 0x0649, 0x40ab, 0xbf6a, 0xa873, 0x41bd, 0x40bf, 0x0734, 0x410d, 0xbaf5, 0x431d, 0xb21d, 0x43bc, 0x1a8d, 0x43d1, 0x182f, 0xb2a7, 0xba53, 0xa1e5, 0x1f14, 0x40fa, 0x4595, 0x4373, 0x3a9e, 0x4316, 0x4382, 0x2233, 0x3f1e, 0xbfac, 0x285f, 0x435e, 0xb2e4, 0x1a0c, 0xbae3, 0x432c, 0xbf96, 0x3dd0, 0x4388, 0xb233, 0x1dd2, 0x0628, 0x40f6, 0xad19, 0xbfb0, 0xb01e, 0x3f19, 0x42fb, 0x4397, 0x42fb, 0x4380, 0x088d, 0x1c55, 0x4125, 0x41db, 0x4343, 0x285a, 0xb297, 0x0708, 0x1742, 0x438f, 0x40c9, 0x41ba, 0xb2d7, 0x42f4, 0xbf84, 0xb2be, 0x0ed1, 0xaa8e, 0x1766, 0xb2a2, 0xb23f, 0xb246, 0x42e7, 0xa98e, 0x2ed6, 0xba33, 0x4275, 0x3d19, 0xba01, 0xaf24, 0xba0e, 0x10fe, 0xbf70, 0x40ae, 0x0b85, 0x1b11, 0xba72, 0x1dbd, 0x4218, 0x420f, 0x43df, 0xba42, 0xbf27, 0xba3d, 0x4318, 0x4152, 0x431f, 0x417d, 0xbfaa, 0x1b13, 0x401f, 0x426e, 0xbfb1, 0xb098, 0x1cb5, 0xba05, 0x2f51, 0xa7e9, 0x4238, 0xb2de, 0x4374, 0x3239, 0xb0c3, 0xb2c4, 0xb2db, 0x43d1, 0x17fa, 0x1918, 0xba45, 0x4073, 0x19dc, 0x433b, 0x095c, 0x1f3f, 0x2dfd, 0x2105, 0x4120, 0x4174, 0x42cf, 0x32ac, 0xbf4a, 0xb28e, 0x401d, 0x445e, 0xbf00, 0xbf0d, 0x4353, 0xbfb0, 0x406e, 0x3f79, 0x2e94, 0xb225, 0x40fe, 0xa79f, 0x43fa, 0xb21f, 0x3c1d, 0xbaf9, 0x4178, 0xb224, 0x455b, 0x2da3, 0x36c0, 0x410b, 0xb2bd, 0x1fd4, 0x43ed, 0x4658, 0xbf45, 0xa2bb, 0xba4b, 0x1848, 0x407f, 0x0d0c, 0xb0d2, 0xbfb8, 0xb013, 0x41ff, 0xba13, 0x4246, 0x4413, 0x3ac4, 0xbf25, 0x0c28, 0xba3d, 0xbf00, 0xba77, 0x4115, 0x425e, 0xad5a, 0x44b9, 0x16b5, 0x445c, 0x4030, 0x41ba, 0x4337, 0x435f, 0x25e8, 0xbfe0, 0x43bf, 0x2e8c, 0x2603, 0x1d02, 0x339f, 0xb2da, 0xbf12, 0x4073, 0x46ed, 0x408a, 0x42a4, 0xbfa0, 0x428c, 0x3f60, 0xb264, 0x4656, 0xbf54, 0x4212, 0x1b30, 0x2cc3, 0xb2d3, 0x1c32, 0x4279, 0x2647, 0x4222, 0xba14, 0x1f8d, 0x414a, 0x4244, 0x4316, 0xa3df, 0x42d7, 0x42fc, 0xbf90, 0x4183, 0xa6b7, 0x4002, 0x2fb3, 0x4304, 0xba10, 0xbf80, 0xb21c, 0x414e, 0x1bc7, 0xbfad, 0xb2cd, 0x2f6f, 0xa397, 0x180a, 0xab69, 0xb0db, 0x0d11, 0xba35, 0xbfdb, 0x00c5, 0xa4b1, 0x400a, 0xba74, 0xa723, 0x050c, 0x4318, 0xaa07, 0x4135, 0x4181, 0xba71, 0x4090, 0x41a2, 0x412a, 0x4230, 0x4398, 0xbf18, 0x42c6, 0x441a, 0xb297, 0xb2fa, 0x41b7, 0x4134, 0xb290, 0x41c4, 0xb290, 0x195c, 0x4586, 0x433e, 0x402c, 0x34a4, 0x1add, 0x4316, 0x403b, 0xba51, 0x4257, 0x3d75, 0xba2d, 0x170f, 0x45bb, 0xbf26, 0x43ca, 0xb247, 0x427e, 0x4109, 0x1284, 0xbaf7, 0xbae0, 0xb200, 0x428b, 0x4376, 0x1cfc, 0x4091, 0x2b38, 0x1f17, 0x41c4, 0x40f0, 0xba52, 0x0c05, 0xbfaa, 0x4278, 0x41b2, 0x4334, 0x43b9, 0x42e4, 0x4338, 0x46cb, 0xaecc, 0x2b5b, 0x2407, 0xbace, 0x1ff5, 0x41ba, 0xb013, 0xb283, 0xbf94, 0x1c7b, 0x4444, 0xaf5b, 0x1e40, 0xbfe0, 0x4401, 0x40be, 0xa46a, 0x4229, 0x40a3, 0x43b4, 0x43e9, 0xb268, 0x419f, 0x41b5, 0x43b9, 0x4203, 0xbfa7, 0xb0a5, 0x46b9, 0x42ec, 0x1b9e, 0x400b, 0x06d9, 0xb0b2, 0x4230, 0xb0c6, 0x420e, 0x19d4, 0xbfe1, 0x40f8, 0x1f60, 0x19b8, 0x43c1, 0xb2a7, 0x4357, 0x4364, 0x4320, 0xba6a, 0x15cc, 0x40a4, 0x4378, 0xb0fe, 0x2e96, 0x4183, 0xba02, 0x4387, 0xb27f, 0x42cf, 0xaa6a, 0x404c, 0x4269, 0x036c, 0x42cf, 0x43df, 0x42a2, 0xbfda, 0x078b, 0x402b, 0x1d71, 0x43ee, 0x1a55, 0x1d58, 0x4077, 0x4021, 0x4165, 0xbf4a, 0x42c7, 0x4322, 0xb00e, 0x435a, 0x1fd9, 0xb227, 0x40da, 0x123a, 0x4323, 0x4353, 0xaa7b, 0xbf16, 0x40b0, 0x42df, 0x4334, 0x054d, 0x422d, 0xba0b, 0x46da, 0x44f2, 0xb214, 0x1a61, 0x20d7, 0x43b2, 0xb062, 0x369a, 0xa256, 0xb2f1, 0xb20f, 0x43ba, 0x3b86, 0x4278, 0x1b0f, 0x2c13, 0x4211, 0x46a0, 0xbf88, 0x43b1, 0x4094, 0xba06, 0x45d8, 0x410e, 0x1fc8, 0x1e0c, 0x429a, 0x3c95, 0x45ec, 0x42a6, 0xb2d2, 0x4039, 0x42c0, 0x40a9, 0x41f3, 0x1eb9, 0x04a4, 0xba5d, 0x4256, 0x4469, 0x40f4, 0x1687, 0x4244, 0x400d, 0x2eb0, 0xbf6f, 0xb018, 0xba24, 0x1911, 0x115e, 0x43c1, 0x406a, 0x4008, 0xb076, 0xba5f, 0xb0f5, 0x40a6, 0xb2f4, 0x0d52, 0xba72, 0x4172, 0xbf91, 0x1310, 0x4572, 0xad5e, 0x4399, 0x4081, 0x2c80, 0x258f, 0x1d8c, 0xb067, 0x426e, 0x40c0, 0xb2d0, 0x4544, 0xbf70, 0x4236, 0x43d2, 0x422f, 0x43e9, 0xb0a2, 0xbf3a, 0xa951, 0xb051, 0x1995, 0x42af, 0x4099, 0x40bb, 0x4221, 0x40b8, 0x4234, 0x422e, 0x444a, 0x2d03, 0x145f, 0x0cf6, 0x438c, 0x4358, 0x41e5, 0x4336, 0x0b76, 0x43e5, 0x4305, 0xb0fe, 0x412c, 0xa59e, 0x3a6d, 0xb23e, 0x4010, 0xbf23, 0x3890, 0x00ee, 0x40ec, 0x1a97, 0x1810, 0x436c, 0x43df, 0x4019, 0xb20f, 0xbfc0, 0x17e0, 0x0e47, 0xbfc8, 0x4068, 0x43bf, 0xbafa, 0x41be, 0x355a, 0xbfc3, 0x18e7, 0xbff0, 0x40e2, 0xbff0, 0x4132, 0x4207, 0xb042, 0x26ad, 0x4329, 0xb285, 0x425e, 0x46da, 0x100a, 0x070c, 0x40d9, 0xb2d3, 0xa9b2, 0x44fa, 0x3edc, 0x1d54, 0x435f, 0x3e4f, 0x2d4a, 0xbfcc, 0x4070, 0x4111, 0x42b6, 0x40f8, 0x210e, 0x3003, 0x41f4, 0x41e1, 0x1e19, 0x4152, 0xba39, 0xbaf6, 0x42aa, 0x4086, 0xa1ff, 0x42d5, 0x4294, 0x226a, 0x407c, 0x1f25, 0x3bea, 0x4158, 0x45bc, 0x445a, 0x29b5, 0xb2ed, 0xba7d, 0xbfa9, 0x41af, 0x31bf, 0x1f06, 0xb277, 0x4600, 0x40a6, 0xba24, 0x4023, 0x413b, 0xbac2, 0x1cdb, 0xba24, 0x00b5, 0x400b, 0x14e9, 0xba47, 0x42a3, 0x1eb7, 0x41b1, 0x42d2, 0x3742, 0xbfdc, 0x17d4, 0x1b82, 0x409c, 0x3640, 0x1a72, 0x4055, 0xba27, 0x4357, 0x2367, 0x43b5, 0x4607, 0xbf59, 0xb0c5, 0x1926, 0x4121, 0xba51, 0xb203, 0xbaf7, 0x066a, 0xb2b3, 0x43a6, 0x432b, 0x40b0, 0x085e, 0x0b22, 0xa46e, 0xbae7, 0xb2f0, 0x1d0e, 0xa37d, 0xba21, 0x40eb, 0x1083, 0x1bb3, 0x4223, 0x43a5, 0xb253, 0x402e, 0x4108, 0xbf37, 0xba0c, 0x43c0, 0xb079, 0x422d, 0x4081, 0x40e0, 0x45b9, 0x43b2, 0x4685, 0x189b, 0x400c, 0x0dbd, 0x425a, 0x0e61, 0xba61, 0x1ad3, 0x4335, 0x41a4, 0xbf64, 0x3714, 0x409a, 0x428d, 0x4421, 0xa9d1, 0xb298, 0x1dd4, 0xb028, 0x4600, 0x128e, 0x42da, 0x1a55, 0xb0da, 0xbf16, 0x423b, 0xba54, 0x42fa, 0x17f3, 0x0753, 0x4299, 0x414a, 0x1e9a, 0xb06c, 0x432b, 0xa23d, 0xba29, 0x4367, 0x19f0, 0x40c1, 0x1e5f, 0xb249, 0x1e21, 0x3078, 0x36fa, 0x2c53, 0xb033, 0x4362, 0x43cd, 0xa40c, 0xbf53, 0xba37, 0x4057, 0xb004, 0x411f, 0xbae2, 0x4671, 0x4276, 0x2505, 0x1044, 0x2743, 0x44cb, 0xaaed, 0x44e5, 0x04b3, 0x41bf, 0x1864, 0x4195, 0x4598, 0xb01d, 0xbf49, 0x4264, 0x4005, 0x0615, 0x43d3, 0xbf21, 0x4175, 0xb218, 0xba29, 0x4168, 0x1b8c, 0x407e, 0xbfa0, 0x4181, 0xb22d, 0x4350, 0x0803, 0x04f2, 0x1a2b, 0xba50, 0xbac6, 0xbf8d, 0x14a4, 0x459a, 0x41d1, 0xba19, 0xba51, 0x1cdb, 0xb283, 0xadd2, 0xb0a3, 0x4140, 0x1e4e, 0xb05a, 0x40ee, 0x428d, 0x37d3, 0x401b, 0x029e, 0x4351, 0x4230, 0x40ae, 0x40ab, 0x430f, 0x4121, 0x197e, 0x4307, 0x43ae, 0xb282, 0xab6a, 0xbf96, 0xb083, 0x41dc, 0x1d8b, 0x4131, 0x43f3, 0xb2af, 0x43e5, 0xb0bb, 0xb06d, 0x10ae, 0x42ef, 0x0d29, 0x4252, 0x1ef1, 0x400f, 0x4287, 0x1f0a, 0x0879, 0x38bd, 0x4306, 0x1094, 0x1b2a, 0x42ec, 0x26b2, 0x42fb, 0xbfbf, 0x1e68, 0x400f, 0x4261, 0x4248, 0x4301, 0x03a6, 0x401d, 0x43a6, 0x42ff, 0x412f, 0xb078, 0x2f4c, 0x059e, 0x404d, 0x40d0, 0x4033, 0x4067, 0x41d5, 0x40f7, 0x4044, 0xbff0, 0x4183, 0xbf23, 0xb208, 0x1922, 0x43cb, 0x2b84, 0xbf46, 0x1c9d, 0x2a1d, 0x41f7, 0x43d2, 0x4297, 0x11e1, 0x3929, 0xba74, 0x1b10, 0xb267, 0x1dc6, 0x403a, 0x420d, 0xb246, 0xb2e7, 0x0450, 0x04fc, 0xbf0e, 0x4680, 0xb015, 0x0f61, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x9761e594, 0x04a76bb3, 0xdf9b4478, 0xd3a7ec97, 0xb0bb8660, 0x52cb52ca, 0x60d713aa, 0x30959c7c, 0xca01d692, 0xd5efbf25, 0x11a77f9a, 0x39816f99, 0x60fa61fd, 0xf4de7402, 0x00000000, 0x200001f0 }, - FinalRegs = new uint[] { 0x00000000, 0xffffffd5, 0x00000000, 0x9e100020, 0x00000000, 0x9e100022, 0xffffffa5, 0x00000000, 0x00000000, 0xf4de7411, 0xd5efb38f, 0xcace1224, 0x60fa61fd, 0x60fa67ad, 0x00000000, 0x400001d0 }, + Instructions = [0x1cdd, 0x1c98, 0xa82c, 0x22bd, 0xabb4, 0x4105, 0x3601, 0x432b, 0x406b, 0xb08c, 0xbacf, 0xb2ee, 0x382b, 0xb055, 0x4418, 0x16af, 0x4171, 0xb284, 0xb2c7, 0x4273, 0x43c5, 0xbf28, 0x4374, 0xb22c, 0xa063, 0x4242, 0x43f9, 0xba6a, 0x42a1, 0x4311, 0x4298, 0xb2b4, 0xbfcf, 0xba03, 0x41ed, 0xba7d, 0x444d, 0x1db4, 0x1de9, 0x192c, 0xbac1, 0x2cd3, 0xbfc9, 0xb224, 0xba09, 0x4098, 0x3ae8, 0x4310, 0xba6a, 0x4366, 0xb05a, 0xbf43, 0x406f, 0xb0a2, 0x0a86, 0x41c1, 0x413c, 0x1e56, 0x224c, 0xbf0e, 0xb016, 0x40d3, 0x40eb, 0x3b28, 0x4131, 0x30c8, 0xb23a, 0x40db, 0x2ff3, 0xb293, 0x1ea8, 0x4283, 0x4071, 0x40a5, 0x40db, 0x1539, 0xb2ff, 0xb0d4, 0xb2a4, 0xb2f4, 0xbf60, 0x433c, 0xbf0b, 0x3bac, 0x134e, 0xb241, 0xba6a, 0x1bf6, 0xb28b, 0xba3f, 0x43b1, 0x1f92, 0xba68, 0xb21e, 0x4272, 0x40a4, 0x2fde, 0xaec9, 0xad72, 0x42f0, 0x433f, 0xaa74, 0x1032, 0xa843, 0x19d7, 0xaf1b, 0xbf23, 0x14cb, 0x41a3, 0x1ff5, 0x40ca, 0xba1e, 0x4205, 0x4123, 0x401d, 0x1f2f, 0xbfc0, 0x3d68, 0x4368, 0x3441, 0x43e1, 0x04bf, 0x1934, 0xb299, 0x41bc, 0x4331, 0x00c2, 0xbf74, 0x4424, 0xb0de, 0x3563, 0xb2ea, 0x4325, 0x425f, 0x4331, 0x1516, 0x2bfa, 0xaa20, 0x4001, 0xb2dd, 0x1b4a, 0x435d, 0x1e15, 0x46fb, 0x1ca3, 0xb240, 0xba1e, 0x43ac, 0x04d1, 0x4288, 0xb053, 0x0649, 0x40ab, 0xbf6a, 0xa873, 0x41bd, 0x40bf, 0x0734, 0x410d, 0xbaf5, 0x431d, 0xb21d, 0x43bc, 0x1a8d, 0x43d1, 0x182f, 0xb2a7, 0xba53, 0xa1e5, 0x1f14, 0x40fa, 0x4595, 0x4373, 0x3a9e, 0x4316, 0x4382, 0x2233, 0x3f1e, 0xbfac, 0x285f, 0x435e, 0xb2e4, 0x1a0c, 0xbae3, 0x432c, 0xbf96, 0x3dd0, 0x4388, 0xb233, 0x1dd2, 0x0628, 0x40f6, 0xad19, 0xbfb0, 0xb01e, 0x3f19, 0x42fb, 0x4397, 0x42fb, 0x4380, 0x088d, 0x1c55, 0x4125, 0x41db, 0x4343, 0x285a, 0xb297, 0x0708, 0x1742, 0x438f, 0x40c9, 0x41ba, 0xb2d7, 0x42f4, 0xbf84, 0xb2be, 0x0ed1, 0xaa8e, 0x1766, 0xb2a2, 0xb23f, 0xb246, 0x42e7, 0xa98e, 0x2ed6, 0xba33, 0x4275, 0x3d19, 0xba01, 0xaf24, 0xba0e, 0x10fe, 0xbf70, 0x40ae, 0x0b85, 0x1b11, 0xba72, 0x1dbd, 0x4218, 0x420f, 0x43df, 0xba42, 0xbf27, 0xba3d, 0x4318, 0x4152, 0x431f, 0x417d, 0xbfaa, 0x1b13, 0x401f, 0x426e, 0xbfb1, 0xb098, 0x1cb5, 0xba05, 0x2f51, 0xa7e9, 0x4238, 0xb2de, 0x4374, 0x3239, 0xb0c3, 0xb2c4, 0xb2db, 0x43d1, 0x17fa, 0x1918, 0xba45, 0x4073, 0x19dc, 0x433b, 0x095c, 0x1f3f, 0x2dfd, 0x2105, 0x4120, 0x4174, 0x42cf, 0x32ac, 0xbf4a, 0xb28e, 0x401d, 0x445e, 0xbf00, 0xbf0d, 0x4353, 0xbfb0, 0x406e, 0x3f79, 0x2e94, 0xb225, 0x40fe, 0xa79f, 0x43fa, 0xb21f, 0x3c1d, 0xbaf9, 0x4178, 0xb224, 0x455b, 0x2da3, 0x36c0, 0x410b, 0xb2bd, 0x1fd4, 0x43ed, 0x4658, 0xbf45, 0xa2bb, 0xba4b, 0x1848, 0x407f, 0x0d0c, 0xb0d2, 0xbfb8, 0xb013, 0x41ff, 0xba13, 0x4246, 0x4413, 0x3ac4, 0xbf25, 0x0c28, 0xba3d, 0xbf00, 0xba77, 0x4115, 0x425e, 0xad5a, 0x44b9, 0x16b5, 0x445c, 0x4030, 0x41ba, 0x4337, 0x435f, 0x25e8, 0xbfe0, 0x43bf, 0x2e8c, 0x2603, 0x1d02, 0x339f, 0xb2da, 0xbf12, 0x4073, 0x46ed, 0x408a, 0x42a4, 0xbfa0, 0x428c, 0x3f60, 0xb264, 0x4656, 0xbf54, 0x4212, 0x1b30, 0x2cc3, 0xb2d3, 0x1c32, 0x4279, 0x2647, 0x4222, 0xba14, 0x1f8d, 0x414a, 0x4244, 0x4316, 0xa3df, 0x42d7, 0x42fc, 0xbf90, 0x4183, 0xa6b7, 0x4002, 0x2fb3, 0x4304, 0xba10, 0xbf80, 0xb21c, 0x414e, 0x1bc7, 0xbfad, 0xb2cd, 0x2f6f, 0xa397, 0x180a, 0xab69, 0xb0db, 0x0d11, 0xba35, 0xbfdb, 0x00c5, 0xa4b1, 0x400a, 0xba74, 0xa723, 0x050c, 0x4318, 0xaa07, 0x4135, 0x4181, 0xba71, 0x4090, 0x41a2, 0x412a, 0x4230, 0x4398, 0xbf18, 0x42c6, 0x441a, 0xb297, 0xb2fa, 0x41b7, 0x4134, 0xb290, 0x41c4, 0xb290, 0x195c, 0x4586, 0x433e, 0x402c, 0x34a4, 0x1add, 0x4316, 0x403b, 0xba51, 0x4257, 0x3d75, 0xba2d, 0x170f, 0x45bb, 0xbf26, 0x43ca, 0xb247, 0x427e, 0x4109, 0x1284, 0xbaf7, 0xbae0, 0xb200, 0x428b, 0x4376, 0x1cfc, 0x4091, 0x2b38, 0x1f17, 0x41c4, 0x40f0, 0xba52, 0x0c05, 0xbfaa, 0x4278, 0x41b2, 0x4334, 0x43b9, 0x42e4, 0x4338, 0x46cb, 0xaecc, 0x2b5b, 0x2407, 0xbace, 0x1ff5, 0x41ba, 0xb013, 0xb283, 0xbf94, 0x1c7b, 0x4444, 0xaf5b, 0x1e40, 0xbfe0, 0x4401, 0x40be, 0xa46a, 0x4229, 0x40a3, 0x43b4, 0x43e9, 0xb268, 0x419f, 0x41b5, 0x43b9, 0x4203, 0xbfa7, 0xb0a5, 0x46b9, 0x42ec, 0x1b9e, 0x400b, 0x06d9, 0xb0b2, 0x4230, 0xb0c6, 0x420e, 0x19d4, 0xbfe1, 0x40f8, 0x1f60, 0x19b8, 0x43c1, 0xb2a7, 0x4357, 0x4364, 0x4320, 0xba6a, 0x15cc, 0x40a4, 0x4378, 0xb0fe, 0x2e96, 0x4183, 0xba02, 0x4387, 0xb27f, 0x42cf, 0xaa6a, 0x404c, 0x4269, 0x036c, 0x42cf, 0x43df, 0x42a2, 0xbfda, 0x078b, 0x402b, 0x1d71, 0x43ee, 0x1a55, 0x1d58, 0x4077, 0x4021, 0x4165, 0xbf4a, 0x42c7, 0x4322, 0xb00e, 0x435a, 0x1fd9, 0xb227, 0x40da, 0x123a, 0x4323, 0x4353, 0xaa7b, 0xbf16, 0x40b0, 0x42df, 0x4334, 0x054d, 0x422d, 0xba0b, 0x46da, 0x44f2, 0xb214, 0x1a61, 0x20d7, 0x43b2, 0xb062, 0x369a, 0xa256, 0xb2f1, 0xb20f, 0x43ba, 0x3b86, 0x4278, 0x1b0f, 0x2c13, 0x4211, 0x46a0, 0xbf88, 0x43b1, 0x4094, 0xba06, 0x45d8, 0x410e, 0x1fc8, 0x1e0c, 0x429a, 0x3c95, 0x45ec, 0x42a6, 0xb2d2, 0x4039, 0x42c0, 0x40a9, 0x41f3, 0x1eb9, 0x04a4, 0xba5d, 0x4256, 0x4469, 0x40f4, 0x1687, 0x4244, 0x400d, 0x2eb0, 0xbf6f, 0xb018, 0xba24, 0x1911, 0x115e, 0x43c1, 0x406a, 0x4008, 0xb076, 0xba5f, 0xb0f5, 0x40a6, 0xb2f4, 0x0d52, 0xba72, 0x4172, 0xbf91, 0x1310, 0x4572, 0xad5e, 0x4399, 0x4081, 0x2c80, 0x258f, 0x1d8c, 0xb067, 0x426e, 0x40c0, 0xb2d0, 0x4544, 0xbf70, 0x4236, 0x43d2, 0x422f, 0x43e9, 0xb0a2, 0xbf3a, 0xa951, 0xb051, 0x1995, 0x42af, 0x4099, 0x40bb, 0x4221, 0x40b8, 0x4234, 0x422e, 0x444a, 0x2d03, 0x145f, 0x0cf6, 0x438c, 0x4358, 0x41e5, 0x4336, 0x0b76, 0x43e5, 0x4305, 0xb0fe, 0x412c, 0xa59e, 0x3a6d, 0xb23e, 0x4010, 0xbf23, 0x3890, 0x00ee, 0x40ec, 0x1a97, 0x1810, 0x436c, 0x43df, 0x4019, 0xb20f, 0xbfc0, 0x17e0, 0x0e47, 0xbfc8, 0x4068, 0x43bf, 0xbafa, 0x41be, 0x355a, 0xbfc3, 0x18e7, 0xbff0, 0x40e2, 0xbff0, 0x4132, 0x4207, 0xb042, 0x26ad, 0x4329, 0xb285, 0x425e, 0x46da, 0x100a, 0x070c, 0x40d9, 0xb2d3, 0xa9b2, 0x44fa, 0x3edc, 0x1d54, 0x435f, 0x3e4f, 0x2d4a, 0xbfcc, 0x4070, 0x4111, 0x42b6, 0x40f8, 0x210e, 0x3003, 0x41f4, 0x41e1, 0x1e19, 0x4152, 0xba39, 0xbaf6, 0x42aa, 0x4086, 0xa1ff, 0x42d5, 0x4294, 0x226a, 0x407c, 0x1f25, 0x3bea, 0x4158, 0x45bc, 0x445a, 0x29b5, 0xb2ed, 0xba7d, 0xbfa9, 0x41af, 0x31bf, 0x1f06, 0xb277, 0x4600, 0x40a6, 0xba24, 0x4023, 0x413b, 0xbac2, 0x1cdb, 0xba24, 0x00b5, 0x400b, 0x14e9, 0xba47, 0x42a3, 0x1eb7, 0x41b1, 0x42d2, 0x3742, 0xbfdc, 0x17d4, 0x1b82, 0x409c, 0x3640, 0x1a72, 0x4055, 0xba27, 0x4357, 0x2367, 0x43b5, 0x4607, 0xbf59, 0xb0c5, 0x1926, 0x4121, 0xba51, 0xb203, 0xbaf7, 0x066a, 0xb2b3, 0x43a6, 0x432b, 0x40b0, 0x085e, 0x0b22, 0xa46e, 0xbae7, 0xb2f0, 0x1d0e, 0xa37d, 0xba21, 0x40eb, 0x1083, 0x1bb3, 0x4223, 0x43a5, 0xb253, 0x402e, 0x4108, 0xbf37, 0xba0c, 0x43c0, 0xb079, 0x422d, 0x4081, 0x40e0, 0x45b9, 0x43b2, 0x4685, 0x189b, 0x400c, 0x0dbd, 0x425a, 0x0e61, 0xba61, 0x1ad3, 0x4335, 0x41a4, 0xbf64, 0x3714, 0x409a, 0x428d, 0x4421, 0xa9d1, 0xb298, 0x1dd4, 0xb028, 0x4600, 0x128e, 0x42da, 0x1a55, 0xb0da, 0xbf16, 0x423b, 0xba54, 0x42fa, 0x17f3, 0x0753, 0x4299, 0x414a, 0x1e9a, 0xb06c, 0x432b, 0xa23d, 0xba29, 0x4367, 0x19f0, 0x40c1, 0x1e5f, 0xb249, 0x1e21, 0x3078, 0x36fa, 0x2c53, 0xb033, 0x4362, 0x43cd, 0xa40c, 0xbf53, 0xba37, 0x4057, 0xb004, 0x411f, 0xbae2, 0x4671, 0x4276, 0x2505, 0x1044, 0x2743, 0x44cb, 0xaaed, 0x44e5, 0x04b3, 0x41bf, 0x1864, 0x4195, 0x4598, 0xb01d, 0xbf49, 0x4264, 0x4005, 0x0615, 0x43d3, 0xbf21, 0x4175, 0xb218, 0xba29, 0x4168, 0x1b8c, 0x407e, 0xbfa0, 0x4181, 0xb22d, 0x4350, 0x0803, 0x04f2, 0x1a2b, 0xba50, 0xbac6, 0xbf8d, 0x14a4, 0x459a, 0x41d1, 0xba19, 0xba51, 0x1cdb, 0xb283, 0xadd2, 0xb0a3, 0x4140, 0x1e4e, 0xb05a, 0x40ee, 0x428d, 0x37d3, 0x401b, 0x029e, 0x4351, 0x4230, 0x40ae, 0x40ab, 0x430f, 0x4121, 0x197e, 0x4307, 0x43ae, 0xb282, 0xab6a, 0xbf96, 0xb083, 0x41dc, 0x1d8b, 0x4131, 0x43f3, 0xb2af, 0x43e5, 0xb0bb, 0xb06d, 0x10ae, 0x42ef, 0x0d29, 0x4252, 0x1ef1, 0x400f, 0x4287, 0x1f0a, 0x0879, 0x38bd, 0x4306, 0x1094, 0x1b2a, 0x42ec, 0x26b2, 0x42fb, 0xbfbf, 0x1e68, 0x400f, 0x4261, 0x4248, 0x4301, 0x03a6, 0x401d, 0x43a6, 0x42ff, 0x412f, 0xb078, 0x2f4c, 0x059e, 0x404d, 0x40d0, 0x4033, 0x4067, 0x41d5, 0x40f7, 0x4044, 0xbff0, 0x4183, 0xbf23, 0xb208, 0x1922, 0x43cb, 0x2b84, 0xbf46, 0x1c9d, 0x2a1d, 0x41f7, 0x43d2, 0x4297, 0x11e1, 0x3929, 0xba74, 0x1b10, 0xb267, 0x1dc6, 0x403a, 0x420d, 0xb246, 0xb2e7, 0x0450, 0x04fc, 0xbf0e, 0x4680, 0xb015, 0x0f61, 0x4770, 0xe7fe + ], + StartRegs = [0x9761e594, 0x04a76bb3, 0xdf9b4478, 0xd3a7ec97, 0xb0bb8660, 0x52cb52ca, 0x60d713aa, 0x30959c7c, 0xca01d692, 0xd5efbf25, 0x11a77f9a, 0x39816f99, 0x60fa61fd, 0xf4de7402, 0x00000000, 0x200001f0 + ], + FinalRegs = [0x00000000, 0xffffffd5, 0x00000000, 0x9e100020, 0x00000000, 0x9e100022, 0xffffffa5, 0x00000000, 0x00000000, 0xf4de7411, 0xd5efb38f, 0xcace1224, 0x60fa61fd, 0x60fa67ad, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x203c, 0x4138, 0xb29a, 0x402d, 0xbf0a, 0x4151, 0x42a8, 0x4489, 0x4091, 0xb2e9, 0xbf8d, 0xb205, 0x41e3, 0x08fb, 0x048b, 0x401f, 0xb2c6, 0x4106, 0xbf00, 0xba13, 0x391f, 0xba43, 0x4000, 0x407c, 0xba09, 0xb2bd, 0xbf25, 0x13a2, 0xb2ca, 0xaf42, 0x4327, 0xb2d4, 0xb2be, 0xaf98, 0x416c, 0x2cbd, 0x41c7, 0x401e, 0xb281, 0x4107, 0x42d2, 0xbfd2, 0x1939, 0xb248, 0xa7cd, 0x1ac5, 0xbf00, 0x2d7b, 0xb260, 0x43c6, 0xb28f, 0xb29a, 0x3844, 0x3701, 0xb08b, 0x1d56, 0xbff0, 0x42aa, 0xb2d2, 0xbfd8, 0x21a3, 0x34fc, 0x4617, 0x41a3, 0x284d, 0x447c, 0x42dc, 0xba10, 0x42ad, 0x1858, 0x1b99, 0x009e, 0xba48, 0xaf30, 0x413b, 0xbf6b, 0xba13, 0x1e8b, 0x29ae, 0x40bb, 0x1f0d, 0x1bf6, 0xb0fa, 0xb085, 0x1c93, 0xae0c, 0x44ad, 0xb294, 0x4327, 0x1ea8, 0x0fbb, 0x4172, 0x43e1, 0xb274, 0xab3a, 0x421e, 0x4003, 0x4370, 0x189a, 0x4289, 0xbf1d, 0xba66, 0x1d6f, 0xb2da, 0xbfb0, 0x4017, 0xa419, 0xba6f, 0x127d, 0x43f9, 0x0b3c, 0x1a9d, 0x1c19, 0x2d38, 0xbfa0, 0x38c1, 0x406f, 0x181c, 0x431a, 0x4069, 0x4359, 0xaa68, 0x1e23, 0x0012, 0x047a, 0xbf6e, 0x15c1, 0x4572, 0x4344, 0x0ff8, 0x46e4, 0x41db, 0x3216, 0x421c, 0x4195, 0x23cb, 0x4261, 0xa31a, 0xbad8, 0x06e8, 0x4197, 0xbf69, 0x420d, 0x228b, 0xbae0, 0x302d, 0x4046, 0x4016, 0x4137, 0xbf79, 0x2c74, 0x407b, 0xa65d, 0x401b, 0x43ea, 0x09f7, 0x41ad, 0x401d, 0x3324, 0xb2cb, 0xa421, 0x40b4, 0x43f1, 0xbfbe, 0x3ae0, 0x45c1, 0x4014, 0x41c2, 0x4596, 0xbaf1, 0xbf1f, 0x4035, 0xb29e, 0x4070, 0xb0cc, 0xbfb4, 0xbad1, 0xba09, 0x1b93, 0x414a, 0xbf43, 0x40b8, 0xb0ef, 0x41c2, 0x4157, 0x36c8, 0x42b7, 0x40dd, 0x43ab, 0x0d39, 0x32b9, 0x1cfc, 0x1c79, 0xa753, 0x4613, 0x418a, 0x40e8, 0xb25e, 0x0bf3, 0xbf9f, 0x4100, 0x3e0f, 0xb205, 0xb2d7, 0x12b8, 0x430e, 0x4032, 0x42a7, 0x18fe, 0x1ac1, 0x221c, 0xb086, 0x0cf7, 0x4367, 0x426e, 0xabea, 0x4282, 0x1da5, 0xaca3, 0x4277, 0xbf24, 0x4308, 0xb035, 0x41c0, 0x1434, 0xaf0d, 0xbfa0, 0xb20a, 0xbacd, 0xb2e8, 0x0248, 0x40cb, 0x41be, 0x43c5, 0x43a2, 0x40cb, 0x0c9a, 0x2979, 0x0138, 0x1f54, 0x4166, 0xb2de, 0x1e7e, 0x4132, 0x4194, 0xb2a8, 0xbfc3, 0x419d, 0xbadc, 0x43db, 0x4363, 0x42a6, 0xb02d, 0x40c1, 0x32dc, 0x467d, 0x43b0, 0x4581, 0x431c, 0x4232, 0x3daa, 0x436d, 0x4288, 0x40f7, 0x1554, 0x43f1, 0xbf0d, 0x0509, 0x2371, 0x4387, 0x42bc, 0x1f69, 0xb07f, 0x43e2, 0x29d5, 0x41d7, 0x297a, 0x4285, 0x09c3, 0xb2e8, 0x417d, 0xba00, 0x42d1, 0x4286, 0xb203, 0x40c7, 0x46e4, 0x4558, 0x40d4, 0x12b2, 0x3bf4, 0xb09a, 0x1a12, 0xbf48, 0xbaf4, 0x1858, 0x412f, 0x051a, 0x21cf, 0x4118, 0xbaf9, 0x1a50, 0xb245, 0xbf78, 0x43bd, 0x416a, 0x4178, 0xae37, 0x425a, 0x4038, 0xa7bb, 0x414d, 0x1bcd, 0x395a, 0x411d, 0xba0a, 0x41d4, 0xbf80, 0x059e, 0xb0bb, 0x0522, 0xb276, 0xb2f9, 0x2920, 0xa495, 0xbac2, 0xbfe4, 0xbfe0, 0x4081, 0xb0f1, 0xb258, 0x45b1, 0xa68e, 0x428f, 0xb015, 0x11ae, 0x0d68, 0xb255, 0x44e4, 0x43d2, 0x42ae, 0x310f, 0x1e7e, 0xb030, 0x2a4f, 0xbfa1, 0x1f11, 0xb213, 0x4237, 0x1e41, 0x43d5, 0xb2e0, 0x425f, 0xbf00, 0x432a, 0x0299, 0x18de, 0x434f, 0x4304, 0xb06a, 0x33aa, 0x1e4d, 0xba46, 0x42ca, 0x4115, 0x4116, 0xa597, 0x30fc, 0x10be, 0x41a3, 0xbf48, 0xa37b, 0x40eb, 0xb0e4, 0xb28b, 0x4002, 0x416c, 0x40aa, 0x461b, 0x43b9, 0x18d6, 0x4276, 0x4447, 0x4692, 0x464b, 0x427f, 0xba74, 0xba05, 0x2045, 0x1bad, 0x4097, 0xa1f9, 0x41a4, 0xb2e0, 0xbf34, 0xba77, 0x1ef1, 0xba6f, 0x435f, 0x44fb, 0xbf74, 0x4247, 0x4275, 0x1e8d, 0x40bc, 0x2747, 0x4001, 0x419c, 0x20f8, 0x428d, 0x02eb, 0xbac8, 0x0ba6, 0x44ac, 0x41ce, 0x4314, 0x0bdb, 0x1251, 0xb256, 0x423b, 0x4089, 0x4066, 0xbf63, 0x1cd3, 0x4095, 0xba21, 0x430c, 0x3453, 0x42b6, 0x0ace, 0x4181, 0x40ff, 0x4215, 0x43a8, 0x4244, 0x1aa6, 0x1a97, 0xa74d, 0x428c, 0x400a, 0xbf99, 0x1c2b, 0x2b70, 0x437c, 0x408d, 0x4367, 0xbf68, 0x3c30, 0x4382, 0x4227, 0x4266, 0x0e7d, 0xbae3, 0x1ab4, 0x43aa, 0x45f4, 0x4248, 0x15a1, 0x4152, 0xb2e6, 0x1a40, 0xa73a, 0x424e, 0x0b31, 0x1b75, 0xae32, 0xba41, 0x1b3a, 0x45d9, 0x1b7a, 0xbfd7, 0x4326, 0x46aa, 0x40b1, 0xb233, 0x42c9, 0x1a6b, 0xa894, 0x43ca, 0x433d, 0xbf45, 0x2f43, 0x421c, 0x1234, 0xb0be, 0xba6d, 0x1cc2, 0x43d3, 0xb248, 0x1f29, 0xb2e3, 0x4365, 0xbace, 0x31e2, 0xbf63, 0xa256, 0x1be2, 0x4420, 0x4339, 0xba0b, 0x1d57, 0x4694, 0xb28d, 0xbfad, 0x407f, 0xa64a, 0x4308, 0xbfd0, 0x443f, 0x05d3, 0xbfa3, 0xb27f, 0x3293, 0x40df, 0x41ff, 0x42e4, 0x4213, 0xb04d, 0x3ee4, 0x41d8, 0x1e59, 0xa2f5, 0x049c, 0xb2e5, 0x406f, 0xab82, 0x428f, 0xba3f, 0x41db, 0x415f, 0xbfe0, 0x406c, 0x46c8, 0xb29e, 0x1834, 0x067a, 0x4142, 0x433c, 0xb2d4, 0x045c, 0xbfdd, 0x43cb, 0x4105, 0x307f, 0x42a5, 0xaa0d, 0x1152, 0x4082, 0x338b, 0x1c40, 0x44a3, 0xbf67, 0xb28c, 0x1cfd, 0x1a7c, 0xb289, 0xbaca, 0x4056, 0x0316, 0x459d, 0x188c, 0x4341, 0x424e, 0xaaac, 0x0908, 0x41b4, 0xb233, 0x4150, 0xb2d1, 0x2241, 0x179d, 0xbfc7, 0x4249, 0xa363, 0x4179, 0x4125, 0x40d2, 0x429e, 0x41a1, 0xb23f, 0x386c, 0x0051, 0xba75, 0xba3d, 0xbfce, 0xb000, 0xbae5, 0x4402, 0x4366, 0x4374, 0x4546, 0x4185, 0x3555, 0xbf7b, 0x40ed, 0x39b8, 0x43f7, 0xb05d, 0x40cd, 0x4176, 0xbfd0, 0x2425, 0x1f85, 0x1b56, 0x4265, 0x403c, 0x4043, 0x4308, 0x4164, 0xb20f, 0xb2f7, 0x4336, 0x26a7, 0x026a, 0x45da, 0x236e, 0x4342, 0xa109, 0xa913, 0xbfd7, 0x2392, 0xba4b, 0xb270, 0xba5a, 0xb02f, 0xa1c0, 0xba4a, 0x41c4, 0x411e, 0x20bf, 0x4331, 0x1519, 0x1987, 0x1931, 0x44c5, 0x1546, 0xbac4, 0xbf48, 0xb2eb, 0x403f, 0x237f, 0x435e, 0xb229, 0x1cac, 0xbae2, 0xbacf, 0x42c9, 0x42d2, 0x0630, 0x22af, 0x407b, 0x43d6, 0x1a64, 0xba0e, 0x3269, 0x364a, 0xba0d, 0xae94, 0x4310, 0x357b, 0x41f1, 0xbfc9, 0xb2d1, 0x434d, 0x4223, 0x41b8, 0xb2b9, 0xbf80, 0x41af, 0x401a, 0xbf9e, 0x062f, 0x39e3, 0x4007, 0x41ff, 0x419a, 0x4379, 0x39f6, 0x43be, 0x2e46, 0xbadb, 0x1dc4, 0xa8b1, 0x1e25, 0x431d, 0x42af, 0x41f8, 0x232f, 0xba70, 0x4018, 0x4111, 0x4160, 0x40a1, 0xbfe8, 0x4001, 0x42a3, 0xab81, 0x420a, 0x41c6, 0x4366, 0x40f4, 0x3117, 0x4065, 0xba39, 0xb2f4, 0x1a3c, 0xb2e3, 0x435e, 0xb246, 0x423d, 0x43de, 0xbfcf, 0x42f2, 0x424c, 0x328b, 0xba0e, 0x1f34, 0x462b, 0x456b, 0xbadb, 0xb277, 0xbfb4, 0x40d1, 0xbafa, 0x4248, 0x127c, 0x324a, 0x1b77, 0x40c6, 0xba06, 0x42f0, 0x4043, 0x0313, 0x4542, 0x4084, 0x368e, 0xbf24, 0x4294, 0x1c3c, 0x408d, 0xb2b2, 0x314f, 0x1c72, 0x4267, 0x430a, 0xa020, 0xb0fa, 0x1aa7, 0xb229, 0x41af, 0x404a, 0x12c8, 0x4302, 0xb2b8, 0x406d, 0xbac6, 0x1a94, 0x4306, 0xb284, 0x41a1, 0xbf77, 0xb206, 0x41af, 0x3aea, 0x438f, 0xadb4, 0x1cc3, 0x11cd, 0xbac1, 0x1c4a, 0xa4b3, 0x415b, 0x3cba, 0x43e8, 0x41c0, 0xb29a, 0xb2a1, 0xa433, 0xbf73, 0x4553, 0x4198, 0x4243, 0x21e5, 0xb2a4, 0xbf90, 0x4319, 0x40e5, 0x433b, 0x423d, 0x42a7, 0x4149, 0x4346, 0x1abf, 0xba72, 0xb086, 0x40bf, 0x2f64, 0x43e8, 0x064e, 0xb2bd, 0x4617, 0xbfb5, 0xb2cf, 0x3673, 0x4608, 0xba4b, 0x1f3b, 0x1bcf, 0xbfb0, 0x42f8, 0x42d4, 0x4389, 0x40f2, 0x0335, 0x4337, 0x425b, 0xb26c, 0x422e, 0xb241, 0x42a4, 0x42c0, 0xbf01, 0x362f, 0x38e0, 0x42ee, 0x1944, 0x4312, 0xb2db, 0x12e0, 0x46f0, 0xba2e, 0xb0c2, 0x42c5, 0x1838, 0xbff0, 0x1d87, 0x462f, 0x428f, 0x411a, 0x1dc6, 0xa2d1, 0x45ea, 0x4261, 0x17a2, 0x4012, 0x400d, 0x1ae6, 0x4284, 0x1abf, 0xbf36, 0x40f0, 0x4389, 0x0c78, 0x1d1d, 0xb203, 0x407f, 0x14b5, 0xb2b3, 0x0fce, 0xba7c, 0xb2c9, 0xb25e, 0x2199, 0x419a, 0x4188, 0x430b, 0xb0ef, 0xba69, 0x4171, 0xb212, 0x41f1, 0xba4c, 0xbf8c, 0x45c4, 0xb211, 0x4266, 0x436a, 0x43de, 0xb0b4, 0x41e7, 0xb0d5, 0x424a, 0xba7f, 0xb212, 0x40c1, 0x4323, 0x4241, 0x42f0, 0x42d5, 0x4269, 0x433e, 0x1b80, 0x3715, 0xaafc, 0xba72, 0x4611, 0x1d89, 0xbfaa, 0xb0f9, 0x3a65, 0xb220, 0xb256, 0x4498, 0x40b6, 0x43af, 0x4334, 0x3daf, 0x43ee, 0xb2b8, 0x40fb, 0x3140, 0x4092, 0x412a, 0x4242, 0xaa96, 0x43b0, 0xb0b3, 0x1ccc, 0xbfe8, 0x4139, 0x4377, 0x41ad, 0x187d, 0xbfa4, 0xba15, 0x4166, 0x41a4, 0x3fb1, 0x4005, 0xb2c7, 0x413d, 0x3917, 0xbfe0, 0x41a5, 0xb211, 0x433d, 0x05fd, 0x4409, 0x4475, 0x41cc, 0x1e64, 0xbf89, 0xb28f, 0x1a04, 0xbf90, 0x42b3, 0xb2cc, 0x41a2, 0xa53c, 0xbfc0, 0x19b0, 0x4337, 0xbf48, 0xb282, 0x1f0e, 0x4370, 0x4358, 0xb21a, 0xbad7, 0x4043, 0x431f, 0x4551, 0x4685, 0x19cf, 0x4053, 0x408a, 0xb020, 0x43fd, 0x2dc1, 0x4603, 0xbf0f, 0x0b17, 0x415b, 0xac11, 0x407c, 0x4362, 0xba64, 0x4216, 0x1384, 0x09e0, 0xbad7, 0xba17, 0x426d, 0x438e, 0x33d3, 0x406d, 0x3b44, 0xb210, 0x2ec5, 0x40ab, 0x42e8, 0x195e, 0x1577, 0x425c, 0x4159, 0x42d0, 0x14ae, 0x1cb1, 0x4081, 0x1a6a, 0xbf57, 0xb2f2, 0x4301, 0x2184, 0x41b0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x67423155, 0xe3599f1a, 0xf8825cc1, 0xb4b9fc16, 0xcf447746, 0x4ebf74b8, 0x62e4bf2f, 0x5a51ed64, 0xce8f8c9f, 0x5b8b5b0d, 0xed67892d, 0xb797f36a, 0xb91b1a79, 0x89af40a1, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00000002, 0xfffffffe, 0x43e44438, 0xbc1bbbc8, 0x00000000, 0x00000000, 0x0000021f, 0xff1bffff, 0x5b8b5b0d, 0xfffffff5, 0x5738068c, 0x89af3e59, 0x21f22254, 0x00000000, 0x800001d0 }, + Instructions = [0x203c, 0x4138, 0xb29a, 0x402d, 0xbf0a, 0x4151, 0x42a8, 0x4489, 0x4091, 0xb2e9, 0xbf8d, 0xb205, 0x41e3, 0x08fb, 0x048b, 0x401f, 0xb2c6, 0x4106, 0xbf00, 0xba13, 0x391f, 0xba43, 0x4000, 0x407c, 0xba09, 0xb2bd, 0xbf25, 0x13a2, 0xb2ca, 0xaf42, 0x4327, 0xb2d4, 0xb2be, 0xaf98, 0x416c, 0x2cbd, 0x41c7, 0x401e, 0xb281, 0x4107, 0x42d2, 0xbfd2, 0x1939, 0xb248, 0xa7cd, 0x1ac5, 0xbf00, 0x2d7b, 0xb260, 0x43c6, 0xb28f, 0xb29a, 0x3844, 0x3701, 0xb08b, 0x1d56, 0xbff0, 0x42aa, 0xb2d2, 0xbfd8, 0x21a3, 0x34fc, 0x4617, 0x41a3, 0x284d, 0x447c, 0x42dc, 0xba10, 0x42ad, 0x1858, 0x1b99, 0x009e, 0xba48, 0xaf30, 0x413b, 0xbf6b, 0xba13, 0x1e8b, 0x29ae, 0x40bb, 0x1f0d, 0x1bf6, 0xb0fa, 0xb085, 0x1c93, 0xae0c, 0x44ad, 0xb294, 0x4327, 0x1ea8, 0x0fbb, 0x4172, 0x43e1, 0xb274, 0xab3a, 0x421e, 0x4003, 0x4370, 0x189a, 0x4289, 0xbf1d, 0xba66, 0x1d6f, 0xb2da, 0xbfb0, 0x4017, 0xa419, 0xba6f, 0x127d, 0x43f9, 0x0b3c, 0x1a9d, 0x1c19, 0x2d38, 0xbfa0, 0x38c1, 0x406f, 0x181c, 0x431a, 0x4069, 0x4359, 0xaa68, 0x1e23, 0x0012, 0x047a, 0xbf6e, 0x15c1, 0x4572, 0x4344, 0x0ff8, 0x46e4, 0x41db, 0x3216, 0x421c, 0x4195, 0x23cb, 0x4261, 0xa31a, 0xbad8, 0x06e8, 0x4197, 0xbf69, 0x420d, 0x228b, 0xbae0, 0x302d, 0x4046, 0x4016, 0x4137, 0xbf79, 0x2c74, 0x407b, 0xa65d, 0x401b, 0x43ea, 0x09f7, 0x41ad, 0x401d, 0x3324, 0xb2cb, 0xa421, 0x40b4, 0x43f1, 0xbfbe, 0x3ae0, 0x45c1, 0x4014, 0x41c2, 0x4596, 0xbaf1, 0xbf1f, 0x4035, 0xb29e, 0x4070, 0xb0cc, 0xbfb4, 0xbad1, 0xba09, 0x1b93, 0x414a, 0xbf43, 0x40b8, 0xb0ef, 0x41c2, 0x4157, 0x36c8, 0x42b7, 0x40dd, 0x43ab, 0x0d39, 0x32b9, 0x1cfc, 0x1c79, 0xa753, 0x4613, 0x418a, 0x40e8, 0xb25e, 0x0bf3, 0xbf9f, 0x4100, 0x3e0f, 0xb205, 0xb2d7, 0x12b8, 0x430e, 0x4032, 0x42a7, 0x18fe, 0x1ac1, 0x221c, 0xb086, 0x0cf7, 0x4367, 0x426e, 0xabea, 0x4282, 0x1da5, 0xaca3, 0x4277, 0xbf24, 0x4308, 0xb035, 0x41c0, 0x1434, 0xaf0d, 0xbfa0, 0xb20a, 0xbacd, 0xb2e8, 0x0248, 0x40cb, 0x41be, 0x43c5, 0x43a2, 0x40cb, 0x0c9a, 0x2979, 0x0138, 0x1f54, 0x4166, 0xb2de, 0x1e7e, 0x4132, 0x4194, 0xb2a8, 0xbfc3, 0x419d, 0xbadc, 0x43db, 0x4363, 0x42a6, 0xb02d, 0x40c1, 0x32dc, 0x467d, 0x43b0, 0x4581, 0x431c, 0x4232, 0x3daa, 0x436d, 0x4288, 0x40f7, 0x1554, 0x43f1, 0xbf0d, 0x0509, 0x2371, 0x4387, 0x42bc, 0x1f69, 0xb07f, 0x43e2, 0x29d5, 0x41d7, 0x297a, 0x4285, 0x09c3, 0xb2e8, 0x417d, 0xba00, 0x42d1, 0x4286, 0xb203, 0x40c7, 0x46e4, 0x4558, 0x40d4, 0x12b2, 0x3bf4, 0xb09a, 0x1a12, 0xbf48, 0xbaf4, 0x1858, 0x412f, 0x051a, 0x21cf, 0x4118, 0xbaf9, 0x1a50, 0xb245, 0xbf78, 0x43bd, 0x416a, 0x4178, 0xae37, 0x425a, 0x4038, 0xa7bb, 0x414d, 0x1bcd, 0x395a, 0x411d, 0xba0a, 0x41d4, 0xbf80, 0x059e, 0xb0bb, 0x0522, 0xb276, 0xb2f9, 0x2920, 0xa495, 0xbac2, 0xbfe4, 0xbfe0, 0x4081, 0xb0f1, 0xb258, 0x45b1, 0xa68e, 0x428f, 0xb015, 0x11ae, 0x0d68, 0xb255, 0x44e4, 0x43d2, 0x42ae, 0x310f, 0x1e7e, 0xb030, 0x2a4f, 0xbfa1, 0x1f11, 0xb213, 0x4237, 0x1e41, 0x43d5, 0xb2e0, 0x425f, 0xbf00, 0x432a, 0x0299, 0x18de, 0x434f, 0x4304, 0xb06a, 0x33aa, 0x1e4d, 0xba46, 0x42ca, 0x4115, 0x4116, 0xa597, 0x30fc, 0x10be, 0x41a3, 0xbf48, 0xa37b, 0x40eb, 0xb0e4, 0xb28b, 0x4002, 0x416c, 0x40aa, 0x461b, 0x43b9, 0x18d6, 0x4276, 0x4447, 0x4692, 0x464b, 0x427f, 0xba74, 0xba05, 0x2045, 0x1bad, 0x4097, 0xa1f9, 0x41a4, 0xb2e0, 0xbf34, 0xba77, 0x1ef1, 0xba6f, 0x435f, 0x44fb, 0xbf74, 0x4247, 0x4275, 0x1e8d, 0x40bc, 0x2747, 0x4001, 0x419c, 0x20f8, 0x428d, 0x02eb, 0xbac8, 0x0ba6, 0x44ac, 0x41ce, 0x4314, 0x0bdb, 0x1251, 0xb256, 0x423b, 0x4089, 0x4066, 0xbf63, 0x1cd3, 0x4095, 0xba21, 0x430c, 0x3453, 0x42b6, 0x0ace, 0x4181, 0x40ff, 0x4215, 0x43a8, 0x4244, 0x1aa6, 0x1a97, 0xa74d, 0x428c, 0x400a, 0xbf99, 0x1c2b, 0x2b70, 0x437c, 0x408d, 0x4367, 0xbf68, 0x3c30, 0x4382, 0x4227, 0x4266, 0x0e7d, 0xbae3, 0x1ab4, 0x43aa, 0x45f4, 0x4248, 0x15a1, 0x4152, 0xb2e6, 0x1a40, 0xa73a, 0x424e, 0x0b31, 0x1b75, 0xae32, 0xba41, 0x1b3a, 0x45d9, 0x1b7a, 0xbfd7, 0x4326, 0x46aa, 0x40b1, 0xb233, 0x42c9, 0x1a6b, 0xa894, 0x43ca, 0x433d, 0xbf45, 0x2f43, 0x421c, 0x1234, 0xb0be, 0xba6d, 0x1cc2, 0x43d3, 0xb248, 0x1f29, 0xb2e3, 0x4365, 0xbace, 0x31e2, 0xbf63, 0xa256, 0x1be2, 0x4420, 0x4339, 0xba0b, 0x1d57, 0x4694, 0xb28d, 0xbfad, 0x407f, 0xa64a, 0x4308, 0xbfd0, 0x443f, 0x05d3, 0xbfa3, 0xb27f, 0x3293, 0x40df, 0x41ff, 0x42e4, 0x4213, 0xb04d, 0x3ee4, 0x41d8, 0x1e59, 0xa2f5, 0x049c, 0xb2e5, 0x406f, 0xab82, 0x428f, 0xba3f, 0x41db, 0x415f, 0xbfe0, 0x406c, 0x46c8, 0xb29e, 0x1834, 0x067a, 0x4142, 0x433c, 0xb2d4, 0x045c, 0xbfdd, 0x43cb, 0x4105, 0x307f, 0x42a5, 0xaa0d, 0x1152, 0x4082, 0x338b, 0x1c40, 0x44a3, 0xbf67, 0xb28c, 0x1cfd, 0x1a7c, 0xb289, 0xbaca, 0x4056, 0x0316, 0x459d, 0x188c, 0x4341, 0x424e, 0xaaac, 0x0908, 0x41b4, 0xb233, 0x4150, 0xb2d1, 0x2241, 0x179d, 0xbfc7, 0x4249, 0xa363, 0x4179, 0x4125, 0x40d2, 0x429e, 0x41a1, 0xb23f, 0x386c, 0x0051, 0xba75, 0xba3d, 0xbfce, 0xb000, 0xbae5, 0x4402, 0x4366, 0x4374, 0x4546, 0x4185, 0x3555, 0xbf7b, 0x40ed, 0x39b8, 0x43f7, 0xb05d, 0x40cd, 0x4176, 0xbfd0, 0x2425, 0x1f85, 0x1b56, 0x4265, 0x403c, 0x4043, 0x4308, 0x4164, 0xb20f, 0xb2f7, 0x4336, 0x26a7, 0x026a, 0x45da, 0x236e, 0x4342, 0xa109, 0xa913, 0xbfd7, 0x2392, 0xba4b, 0xb270, 0xba5a, 0xb02f, 0xa1c0, 0xba4a, 0x41c4, 0x411e, 0x20bf, 0x4331, 0x1519, 0x1987, 0x1931, 0x44c5, 0x1546, 0xbac4, 0xbf48, 0xb2eb, 0x403f, 0x237f, 0x435e, 0xb229, 0x1cac, 0xbae2, 0xbacf, 0x42c9, 0x42d2, 0x0630, 0x22af, 0x407b, 0x43d6, 0x1a64, 0xba0e, 0x3269, 0x364a, 0xba0d, 0xae94, 0x4310, 0x357b, 0x41f1, 0xbfc9, 0xb2d1, 0x434d, 0x4223, 0x41b8, 0xb2b9, 0xbf80, 0x41af, 0x401a, 0xbf9e, 0x062f, 0x39e3, 0x4007, 0x41ff, 0x419a, 0x4379, 0x39f6, 0x43be, 0x2e46, 0xbadb, 0x1dc4, 0xa8b1, 0x1e25, 0x431d, 0x42af, 0x41f8, 0x232f, 0xba70, 0x4018, 0x4111, 0x4160, 0x40a1, 0xbfe8, 0x4001, 0x42a3, 0xab81, 0x420a, 0x41c6, 0x4366, 0x40f4, 0x3117, 0x4065, 0xba39, 0xb2f4, 0x1a3c, 0xb2e3, 0x435e, 0xb246, 0x423d, 0x43de, 0xbfcf, 0x42f2, 0x424c, 0x328b, 0xba0e, 0x1f34, 0x462b, 0x456b, 0xbadb, 0xb277, 0xbfb4, 0x40d1, 0xbafa, 0x4248, 0x127c, 0x324a, 0x1b77, 0x40c6, 0xba06, 0x42f0, 0x4043, 0x0313, 0x4542, 0x4084, 0x368e, 0xbf24, 0x4294, 0x1c3c, 0x408d, 0xb2b2, 0x314f, 0x1c72, 0x4267, 0x430a, 0xa020, 0xb0fa, 0x1aa7, 0xb229, 0x41af, 0x404a, 0x12c8, 0x4302, 0xb2b8, 0x406d, 0xbac6, 0x1a94, 0x4306, 0xb284, 0x41a1, 0xbf77, 0xb206, 0x41af, 0x3aea, 0x438f, 0xadb4, 0x1cc3, 0x11cd, 0xbac1, 0x1c4a, 0xa4b3, 0x415b, 0x3cba, 0x43e8, 0x41c0, 0xb29a, 0xb2a1, 0xa433, 0xbf73, 0x4553, 0x4198, 0x4243, 0x21e5, 0xb2a4, 0xbf90, 0x4319, 0x40e5, 0x433b, 0x423d, 0x42a7, 0x4149, 0x4346, 0x1abf, 0xba72, 0xb086, 0x40bf, 0x2f64, 0x43e8, 0x064e, 0xb2bd, 0x4617, 0xbfb5, 0xb2cf, 0x3673, 0x4608, 0xba4b, 0x1f3b, 0x1bcf, 0xbfb0, 0x42f8, 0x42d4, 0x4389, 0x40f2, 0x0335, 0x4337, 0x425b, 0xb26c, 0x422e, 0xb241, 0x42a4, 0x42c0, 0xbf01, 0x362f, 0x38e0, 0x42ee, 0x1944, 0x4312, 0xb2db, 0x12e0, 0x46f0, 0xba2e, 0xb0c2, 0x42c5, 0x1838, 0xbff0, 0x1d87, 0x462f, 0x428f, 0x411a, 0x1dc6, 0xa2d1, 0x45ea, 0x4261, 0x17a2, 0x4012, 0x400d, 0x1ae6, 0x4284, 0x1abf, 0xbf36, 0x40f0, 0x4389, 0x0c78, 0x1d1d, 0xb203, 0x407f, 0x14b5, 0xb2b3, 0x0fce, 0xba7c, 0xb2c9, 0xb25e, 0x2199, 0x419a, 0x4188, 0x430b, 0xb0ef, 0xba69, 0x4171, 0xb212, 0x41f1, 0xba4c, 0xbf8c, 0x45c4, 0xb211, 0x4266, 0x436a, 0x43de, 0xb0b4, 0x41e7, 0xb0d5, 0x424a, 0xba7f, 0xb212, 0x40c1, 0x4323, 0x4241, 0x42f0, 0x42d5, 0x4269, 0x433e, 0x1b80, 0x3715, 0xaafc, 0xba72, 0x4611, 0x1d89, 0xbfaa, 0xb0f9, 0x3a65, 0xb220, 0xb256, 0x4498, 0x40b6, 0x43af, 0x4334, 0x3daf, 0x43ee, 0xb2b8, 0x40fb, 0x3140, 0x4092, 0x412a, 0x4242, 0xaa96, 0x43b0, 0xb0b3, 0x1ccc, 0xbfe8, 0x4139, 0x4377, 0x41ad, 0x187d, 0xbfa4, 0xba15, 0x4166, 0x41a4, 0x3fb1, 0x4005, 0xb2c7, 0x413d, 0x3917, 0xbfe0, 0x41a5, 0xb211, 0x433d, 0x05fd, 0x4409, 0x4475, 0x41cc, 0x1e64, 0xbf89, 0xb28f, 0x1a04, 0xbf90, 0x42b3, 0xb2cc, 0x41a2, 0xa53c, 0xbfc0, 0x19b0, 0x4337, 0xbf48, 0xb282, 0x1f0e, 0x4370, 0x4358, 0xb21a, 0xbad7, 0x4043, 0x431f, 0x4551, 0x4685, 0x19cf, 0x4053, 0x408a, 0xb020, 0x43fd, 0x2dc1, 0x4603, 0xbf0f, 0x0b17, 0x415b, 0xac11, 0x407c, 0x4362, 0xba64, 0x4216, 0x1384, 0x09e0, 0xbad7, 0xba17, 0x426d, 0x438e, 0x33d3, 0x406d, 0x3b44, 0xb210, 0x2ec5, 0x40ab, 0x42e8, 0x195e, 0x1577, 0x425c, 0x4159, 0x42d0, 0x14ae, 0x1cb1, 0x4081, 0x1a6a, 0xbf57, 0xb2f2, 0x4301, 0x2184, 0x41b0, 0x4770, 0xe7fe + ], + StartRegs = [0x67423155, 0xe3599f1a, 0xf8825cc1, 0xb4b9fc16, 0xcf447746, 0x4ebf74b8, 0x62e4bf2f, 0x5a51ed64, 0xce8f8c9f, 0x5b8b5b0d, 0xed67892d, 0xb797f36a, 0xb91b1a79, 0x89af40a1, 0x00000000, 0x100001f0 + ], + FinalRegs = [0x00000000, 0x00000002, 0xfffffffe, 0x43e44438, 0xbc1bbbc8, 0x00000000, 0x00000000, 0x0000021f, 0xff1bffff, 0x5b8b5b0d, 0xfffffff5, 0x5738068c, 0x89af3e59, 0x21f22254, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x351e, 0xb20f, 0x43d6, 0xba50, 0x40d6, 0x40c0, 0xb0f4, 0x41e8, 0xb0e2, 0x4618, 0xb07e, 0x4103, 0xba3c, 0xbafb, 0x0552, 0x41d7, 0xbfab, 0x41e3, 0x40ae, 0xa6e2, 0x2bec, 0xb23a, 0x007d, 0x4264, 0xb07d, 0x432c, 0xbfe8, 0x4279, 0x44d1, 0x225c, 0x21f0, 0x0f23, 0x426d, 0x0b9f, 0x429c, 0x4275, 0xba66, 0x0a83, 0x4227, 0x31d8, 0x1ca1, 0xbfc5, 0x1fc2, 0xbadf, 0x4359, 0x4171, 0x4122, 0x0782, 0xbf51, 0xb06b, 0x4121, 0x408c, 0x3364, 0xb00d, 0xba44, 0x1aaa, 0x43b5, 0x4640, 0xbaf9, 0xaf1b, 0xb2eb, 0xba59, 0x423a, 0x0a7a, 0xb0fa, 0xb2cf, 0x45c8, 0x42e2, 0x2a0c, 0x1c8f, 0xbac4, 0xbf08, 0xb22e, 0x425b, 0xb08a, 0x43f2, 0xbfb7, 0x42fa, 0x4212, 0x1a85, 0x4292, 0xbacc, 0x34d2, 0xb260, 0x1fb1, 0xa08c, 0xbae8, 0x31bf, 0x40fb, 0xa24b, 0xb270, 0x4042, 0x43a4, 0x44b4, 0xb0a3, 0x26c1, 0xbf34, 0x43dc, 0x151d, 0x1be3, 0x40ec, 0xb224, 0xb280, 0x29f4, 0x1afe, 0x4248, 0xbf1a, 0x4282, 0x3389, 0xb25a, 0x1c1f, 0xbf48, 0x3fe4, 0xb25f, 0xa162, 0x2921, 0xbafa, 0x401a, 0x410b, 0xbf0b, 0x42e9, 0xb28a, 0xb270, 0x1a56, 0x2b14, 0x1d39, 0x431f, 0x1f4e, 0xb28e, 0x4177, 0x1a5f, 0xa81b, 0xa73a, 0x4392, 0x416c, 0x420b, 0x4119, 0x40ff, 0xbf65, 0x4039, 0x41cb, 0xb098, 0x41f1, 0x4126, 0xba70, 0xa037, 0x0686, 0x31f0, 0xba02, 0x2c1b, 0xa41f, 0xbf9f, 0x4037, 0x417c, 0x4371, 0x1c48, 0x39f5, 0xb0a2, 0x4271, 0xb201, 0x3107, 0xbf1b, 0x42a8, 0x42c0, 0x465b, 0xb20c, 0x2b6d, 0xbf6c, 0xb2d6, 0xb274, 0x1344, 0x4605, 0xb2a4, 0x359b, 0xba1d, 0xb2fb, 0xbf1b, 0x1dd4, 0x1d7e, 0x4679, 0x4591, 0xba75, 0xbf60, 0x42ce, 0xba57, 0x160d, 0x415e, 0x085d, 0x18d1, 0x1f0b, 0xbfd6, 0x429a, 0x411f, 0x4079, 0x4682, 0xbfbc, 0x44a4, 0x416f, 0x4029, 0x1975, 0x294b, 0xbad1, 0x43f0, 0x2017, 0x4083, 0x416e, 0x41f7, 0xbfd0, 0x45e0, 0x3c14, 0x4647, 0x44f1, 0x4681, 0xb034, 0x4433, 0x4192, 0x4281, 0xb08e, 0xba31, 0xbfb7, 0x427f, 0x4630, 0xbad4, 0x4379, 0x40c7, 0x4318, 0x3267, 0xb2e5, 0x4280, 0x42ee, 0x059f, 0x4054, 0x4585, 0x456d, 0xa855, 0x42f3, 0x0953, 0xba44, 0xb040, 0xb2af, 0x426d, 0x4635, 0x41a1, 0x405a, 0x1d67, 0x1941, 0x43fe, 0x425a, 0xbfba, 0x32e7, 0x1621, 0x41ef, 0x3fae, 0x1be4, 0x036f, 0x40d0, 0x430c, 0xb02e, 0xbace, 0x4060, 0x4299, 0xba14, 0x4557, 0xb22d, 0xbf4f, 0x4188, 0xba3a, 0xb2a1, 0x419f, 0x408e, 0x0dbf, 0xb2de, 0xaa6f, 0x401e, 0x4315, 0xb2f2, 0xbad9, 0xb0c6, 0x0710, 0xb025, 0x431e, 0x42b7, 0x1f99, 0xbf5d, 0x4273, 0x45f4, 0xb2ba, 0x410a, 0x19da, 0xb21e, 0xbafe, 0x32a4, 0xb24e, 0xbafc, 0xa511, 0x4175, 0x4209, 0x15ec, 0x4203, 0x4016, 0x4451, 0xbafd, 0x25f3, 0x409d, 0x1c68, 0xbfd7, 0x43b2, 0x41c1, 0x432d, 0x428c, 0xba10, 0x403a, 0xa089, 0x245f, 0xbf59, 0xb2a4, 0x151d, 0x38b5, 0xa654, 0x44f9, 0x44a3, 0xbfca, 0xb216, 0x1314, 0xba41, 0x289e, 0x0797, 0x40df, 0x409a, 0x430f, 0x40a5, 0x1e10, 0x40d4, 0x41a7, 0x11f6, 0x4384, 0xbf90, 0x42f6, 0x42c5, 0x403c, 0x43a9, 0xa104, 0x1d69, 0x417b, 0xa553, 0xbfe1, 0xb2e2, 0x24d6, 0x4095, 0x1fc7, 0xb243, 0x19ca, 0x419d, 0x40ca, 0x4039, 0x4145, 0xbfa0, 0xbfbb, 0xb233, 0xbf00, 0x40cf, 0x0ac0, 0xa120, 0x1f27, 0x094c, 0x4121, 0xbad4, 0x18a6, 0xbf05, 0x4333, 0xaca2, 0x19b2, 0x0f87, 0xbadf, 0x1653, 0xb251, 0x0c0e, 0xb027, 0x423d, 0x44f3, 0x43cf, 0xb06d, 0xaa68, 0x43d7, 0xaf3d, 0xaac6, 0x30bc, 0xae02, 0x0af9, 0x0a91, 0x40ba, 0x42eb, 0xb271, 0x42a8, 0xbfb8, 0x46d5, 0xa671, 0xb0ea, 0x43d2, 0x1a79, 0x35a2, 0xba41, 0x1a5a, 0x02ce, 0x4339, 0x4053, 0xbfd9, 0xa3d6, 0x2e6e, 0x416f, 0x43f7, 0xbafd, 0x427c, 0xbf76, 0xa945, 0x20fd, 0xba28, 0xb0b4, 0x4062, 0x21e7, 0xb09c, 0x4078, 0xa702, 0x41ce, 0x417a, 0xb219, 0x4196, 0xbf3d, 0xbaf7, 0x192c, 0xa208, 0x425e, 0xb2c4, 0x400a, 0x40f1, 0x4304, 0xb0e2, 0x4031, 0xb211, 0x42c3, 0x0eca, 0x46f1, 0x4072, 0x1c40, 0x40f6, 0x1b35, 0xb2f8, 0x43e3, 0x28f6, 0x43a3, 0x419a, 0x4337, 0x4311, 0x40ff, 0xbfb9, 0x312e, 0x4189, 0xa2f4, 0x45e9, 0x42f6, 0x1db4, 0x0c19, 0x44f1, 0xba6c, 0x425f, 0x4108, 0x41ba, 0x0903, 0xba53, 0x16c7, 0x4112, 0x044b, 0xb02f, 0xb21d, 0x389c, 0x420b, 0x424e, 0x309a, 0xbf87, 0x4161, 0x1fa5, 0x40cf, 0x4060, 0xbfdd, 0x4183, 0x1107, 0x3376, 0x433b, 0xa8eb, 0x352d, 0x1918, 0x0664, 0x4225, 0x401b, 0x42e0, 0xb208, 0x46a8, 0xbf38, 0xb277, 0x0fd4, 0x434e, 0x16bf, 0x43ea, 0xb2f3, 0x4124, 0x198f, 0xba5b, 0x43be, 0x1e44, 0xb2ae, 0xa745, 0xbfde, 0x405d, 0x4151, 0x41ce, 0x1c07, 0x41a7, 0x4166, 0x40fc, 0x38fe, 0x41d9, 0x4084, 0x4128, 0x1817, 0x433a, 0xbf18, 0xb269, 0x420f, 0x442e, 0xb020, 0x42e4, 0x182e, 0x2237, 0xb067, 0x4225, 0x41b4, 0x40cc, 0xbf88, 0x45d2, 0xba2b, 0x2749, 0xadb9, 0x1b34, 0x40e8, 0x0ff1, 0xb20a, 0xba70, 0x3396, 0xb261, 0x4296, 0x4387, 0x4002, 0x436b, 0x435f, 0x434c, 0xbaf7, 0x4077, 0xbfe1, 0x1f0d, 0xba30, 0xba16, 0x4085, 0xb2ad, 0x4029, 0xba54, 0x1c2f, 0xb27b, 0x0dea, 0x4233, 0xb202, 0x0952, 0xba7e, 0x31f6, 0x43fc, 0x4117, 0x45c9, 0xae39, 0xbf3f, 0x4226, 0x43b7, 0x4221, 0x44f2, 0x4157, 0x1efc, 0xbf32, 0x40ab, 0xbfc0, 0x2669, 0x4388, 0xb0a9, 0x406c, 0x28ca, 0x15e3, 0x4337, 0xba26, 0xad3c, 0x106b, 0x340e, 0xbff0, 0xba04, 0x412d, 0x415d, 0x410e, 0xbfbd, 0x427f, 0xb232, 0xac33, 0x4042, 0x40cc, 0xa690, 0x42ce, 0x2cf1, 0xbaf3, 0x40ae, 0xba6b, 0xba26, 0x0b5f, 0xb2e8, 0x4105, 0xbaf2, 0x4348, 0x4240, 0x1f5b, 0x408f, 0xbf38, 0xb282, 0x1c4d, 0x45ab, 0x43c5, 0xb253, 0xb26d, 0x1bfe, 0xbfb5, 0xb018, 0x366a, 0x4065, 0x122e, 0x408b, 0x313d, 0xba7e, 0x4002, 0xbacc, 0x4040, 0x40c3, 0x42dd, 0xb276, 0x0d1e, 0x43ab, 0xba2d, 0x190e, 0x4082, 0xb29e, 0xba38, 0x2855, 0xb074, 0x1ca5, 0x4337, 0x1d60, 0x1cfd, 0xbad9, 0x046c, 0xbfc1, 0xbfd0, 0x42d1, 0xb211, 0x1c31, 0x4694, 0xafe8, 0x43c6, 0x4303, 0x468d, 0xb214, 0x00fa, 0xb03c, 0x4280, 0x43c6, 0x4637, 0xbfde, 0x07a2, 0x4044, 0xba6b, 0xb096, 0xa983, 0x4592, 0x413a, 0x0518, 0x46e2, 0xa242, 0x25c1, 0x4103, 0xba62, 0xb001, 0x455f, 0xbf47, 0x11f2, 0xacab, 0x3992, 0xbad6, 0x439e, 0x4388, 0xb2b8, 0xba17, 0x432a, 0xb221, 0xba03, 0x1730, 0x43cf, 0x4265, 0xba50, 0x1b03, 0x428f, 0xbf2e, 0xb20c, 0x458c, 0x4390, 0x1afe, 0x42b9, 0x1d65, 0x4463, 0x42b5, 0x0dff, 0x4095, 0x42f6, 0x3496, 0x4441, 0x0c8a, 0xba61, 0x4325, 0x20f4, 0xb09c, 0x1c27, 0x420f, 0x40e0, 0xbf70, 0x21c7, 0x4240, 0x459b, 0x40a0, 0xb2ae, 0xbfd2, 0xac93, 0xb0b0, 0x31e9, 0x4131, 0x185d, 0x417c, 0xba60, 0xb24b, 0x2874, 0x40ef, 0xb206, 0xb2e9, 0x44fc, 0xb074, 0xb03b, 0x43a8, 0x426a, 0xba38, 0x43ce, 0x443f, 0xbf4b, 0x4141, 0x1f3c, 0xb2b6, 0x430b, 0xbfcf, 0x4292, 0xba52, 0x4172, 0xa9f9, 0x3050, 0x44e0, 0x43b0, 0x43e8, 0x40b3, 0x4257, 0xba6f, 0x4006, 0x4036, 0x4320, 0x46f5, 0x41f6, 0xa8e5, 0xba6a, 0x429d, 0x0a20, 0x19d7, 0x467f, 0xb20c, 0x400d, 0x4007, 0xbfaa, 0x4367, 0x21b7, 0x4142, 0x428b, 0x4369, 0x45a0, 0x2abb, 0x1af5, 0x4216, 0x1aee, 0xb02b, 0x121e, 0xb241, 0xbaee, 0x2d8b, 0x40d2, 0xbf69, 0x4117, 0x4366, 0x2bbd, 0xba10, 0xb09f, 0x4172, 0x426c, 0x23fc, 0x338e, 0xbf43, 0x4015, 0x42ee, 0xa3f1, 0x0369, 0x42e7, 0x062e, 0x1667, 0xb23b, 0x4433, 0x438e, 0xb0c9, 0x418e, 0xb0d8, 0xba4c, 0xbf13, 0x42e0, 0x1c20, 0x19f8, 0xb232, 0x4083, 0x410f, 0xad20, 0x412c, 0x3662, 0x2a58, 0x4089, 0xb275, 0x117c, 0x3b0c, 0xbf5d, 0x41c1, 0x4011, 0x4063, 0x2178, 0xab2f, 0x42a1, 0x439e, 0x2b3e, 0x45e2, 0xb084, 0xadfb, 0xa056, 0xbaf7, 0x3e15, 0x4464, 0xb046, 0xb24d, 0xb09d, 0x4202, 0x19f1, 0x4211, 0xbf5e, 0x4035, 0x400f, 0x1e45, 0x13ab, 0x40aa, 0x1ad0, 0x429f, 0xb0a4, 0xb05b, 0x0f39, 0xaa55, 0x2864, 0x437f, 0x43ca, 0xb2d1, 0x3846, 0x46e0, 0xb0d4, 0x4411, 0x1ce1, 0xb06d, 0x1246, 0x187d, 0x08ca, 0x46da, 0xbf95, 0xb273, 0xba11, 0x4211, 0x40d3, 0xb040, 0x05fd, 0x1e61, 0xa78d, 0x46f3, 0xb0e7, 0x4168, 0xba4c, 0xba0b, 0x000f, 0x41a0, 0x340c, 0x29e0, 0x2c2e, 0x42ab, 0xb01b, 0x421e, 0x2607, 0x1b58, 0xba0f, 0x442a, 0x4219, 0xb2ac, 0xbfd4, 0x414a, 0x0524, 0x3d35, 0xb0a0, 0x4343, 0x40e8, 0x40a9, 0x18f6, 0x14df, 0x41d4, 0x4542, 0x434a, 0x4306, 0x36f2, 0x1d38, 0x4595, 0x41a2, 0x42fd, 0xbf24, 0x4596, 0xa565, 0x4650, 0xb264, 0x4139, 0xb039, 0x4261, 0x41ae, 0xbaf5, 0x4112, 0x43c3, 0x0409, 0x4168, 0x40e4, 0xbfa8, 0xba31, 0xa175, 0x41ac, 0x2089, 0x423e, 0x40fe, 0x411e, 0x2535, 0x42e2, 0xa13b, 0x44c0, 0xb20f, 0xbf6e, 0x43be, 0xb2a5, 0x40bb, 0x4068, 0x19bb, 0x459d, 0x2ab5, 0x192c, 0x427e, 0x429e, 0x4286, 0x43ee, 0x415e, 0xb0cd, 0x46c3, 0x45a3, 0x4345, 0x4170, 0x064c, 0xb2bd, 0xbf19, 0xb091, 0x02aa, 0x3a96, 0xb2a8, 0x41a0, 0xb0c3, 0x4327, 0x18c6, 0x014d, 0x402a, 0xb299, 0xb207, 0x0b66, 0x3ced, 0xb2bb, 0x4188, 0x3513, 0xbaff, 0x4356, 0x437c, 0x42f2, 0xba74, 0xb239, 0xba67, 0x42b4, 0xbf3a, 0xb2d8, 0x1c3f, 0x2787, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3be9d470, 0x621bd961, 0x561548a7, 0x32c98a3d, 0x487719ff, 0x1c15d826, 0x34d9255e, 0xaae8da54, 0xf65e2145, 0x5153589f, 0x032f5367, 0xf13554cd, 0xda5c80c1, 0x8ef09f26, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0xffffffff, 0xffff8018, 0x00031000, 0x00001880, 0x00000000, 0x00031013, 0x00000000, 0x00000087, 0x00012ad4, 0x00000000, 0xf135552c, 0x00012ad4, 0x0000956a, 0xfffffd74, 0x00000000, 0x600001d0 }, + Instructions = [0x351e, 0xb20f, 0x43d6, 0xba50, 0x40d6, 0x40c0, 0xb0f4, 0x41e8, 0xb0e2, 0x4618, 0xb07e, 0x4103, 0xba3c, 0xbafb, 0x0552, 0x41d7, 0xbfab, 0x41e3, 0x40ae, 0xa6e2, 0x2bec, 0xb23a, 0x007d, 0x4264, 0xb07d, 0x432c, 0xbfe8, 0x4279, 0x44d1, 0x225c, 0x21f0, 0x0f23, 0x426d, 0x0b9f, 0x429c, 0x4275, 0xba66, 0x0a83, 0x4227, 0x31d8, 0x1ca1, 0xbfc5, 0x1fc2, 0xbadf, 0x4359, 0x4171, 0x4122, 0x0782, 0xbf51, 0xb06b, 0x4121, 0x408c, 0x3364, 0xb00d, 0xba44, 0x1aaa, 0x43b5, 0x4640, 0xbaf9, 0xaf1b, 0xb2eb, 0xba59, 0x423a, 0x0a7a, 0xb0fa, 0xb2cf, 0x45c8, 0x42e2, 0x2a0c, 0x1c8f, 0xbac4, 0xbf08, 0xb22e, 0x425b, 0xb08a, 0x43f2, 0xbfb7, 0x42fa, 0x4212, 0x1a85, 0x4292, 0xbacc, 0x34d2, 0xb260, 0x1fb1, 0xa08c, 0xbae8, 0x31bf, 0x40fb, 0xa24b, 0xb270, 0x4042, 0x43a4, 0x44b4, 0xb0a3, 0x26c1, 0xbf34, 0x43dc, 0x151d, 0x1be3, 0x40ec, 0xb224, 0xb280, 0x29f4, 0x1afe, 0x4248, 0xbf1a, 0x4282, 0x3389, 0xb25a, 0x1c1f, 0xbf48, 0x3fe4, 0xb25f, 0xa162, 0x2921, 0xbafa, 0x401a, 0x410b, 0xbf0b, 0x42e9, 0xb28a, 0xb270, 0x1a56, 0x2b14, 0x1d39, 0x431f, 0x1f4e, 0xb28e, 0x4177, 0x1a5f, 0xa81b, 0xa73a, 0x4392, 0x416c, 0x420b, 0x4119, 0x40ff, 0xbf65, 0x4039, 0x41cb, 0xb098, 0x41f1, 0x4126, 0xba70, 0xa037, 0x0686, 0x31f0, 0xba02, 0x2c1b, 0xa41f, 0xbf9f, 0x4037, 0x417c, 0x4371, 0x1c48, 0x39f5, 0xb0a2, 0x4271, 0xb201, 0x3107, 0xbf1b, 0x42a8, 0x42c0, 0x465b, 0xb20c, 0x2b6d, 0xbf6c, 0xb2d6, 0xb274, 0x1344, 0x4605, 0xb2a4, 0x359b, 0xba1d, 0xb2fb, 0xbf1b, 0x1dd4, 0x1d7e, 0x4679, 0x4591, 0xba75, 0xbf60, 0x42ce, 0xba57, 0x160d, 0x415e, 0x085d, 0x18d1, 0x1f0b, 0xbfd6, 0x429a, 0x411f, 0x4079, 0x4682, 0xbfbc, 0x44a4, 0x416f, 0x4029, 0x1975, 0x294b, 0xbad1, 0x43f0, 0x2017, 0x4083, 0x416e, 0x41f7, 0xbfd0, 0x45e0, 0x3c14, 0x4647, 0x44f1, 0x4681, 0xb034, 0x4433, 0x4192, 0x4281, 0xb08e, 0xba31, 0xbfb7, 0x427f, 0x4630, 0xbad4, 0x4379, 0x40c7, 0x4318, 0x3267, 0xb2e5, 0x4280, 0x42ee, 0x059f, 0x4054, 0x4585, 0x456d, 0xa855, 0x42f3, 0x0953, 0xba44, 0xb040, 0xb2af, 0x426d, 0x4635, 0x41a1, 0x405a, 0x1d67, 0x1941, 0x43fe, 0x425a, 0xbfba, 0x32e7, 0x1621, 0x41ef, 0x3fae, 0x1be4, 0x036f, 0x40d0, 0x430c, 0xb02e, 0xbace, 0x4060, 0x4299, 0xba14, 0x4557, 0xb22d, 0xbf4f, 0x4188, 0xba3a, 0xb2a1, 0x419f, 0x408e, 0x0dbf, 0xb2de, 0xaa6f, 0x401e, 0x4315, 0xb2f2, 0xbad9, 0xb0c6, 0x0710, 0xb025, 0x431e, 0x42b7, 0x1f99, 0xbf5d, 0x4273, 0x45f4, 0xb2ba, 0x410a, 0x19da, 0xb21e, 0xbafe, 0x32a4, 0xb24e, 0xbafc, 0xa511, 0x4175, 0x4209, 0x15ec, 0x4203, 0x4016, 0x4451, 0xbafd, 0x25f3, 0x409d, 0x1c68, 0xbfd7, 0x43b2, 0x41c1, 0x432d, 0x428c, 0xba10, 0x403a, 0xa089, 0x245f, 0xbf59, 0xb2a4, 0x151d, 0x38b5, 0xa654, 0x44f9, 0x44a3, 0xbfca, 0xb216, 0x1314, 0xba41, 0x289e, 0x0797, 0x40df, 0x409a, 0x430f, 0x40a5, 0x1e10, 0x40d4, 0x41a7, 0x11f6, 0x4384, 0xbf90, 0x42f6, 0x42c5, 0x403c, 0x43a9, 0xa104, 0x1d69, 0x417b, 0xa553, 0xbfe1, 0xb2e2, 0x24d6, 0x4095, 0x1fc7, 0xb243, 0x19ca, 0x419d, 0x40ca, 0x4039, 0x4145, 0xbfa0, 0xbfbb, 0xb233, 0xbf00, 0x40cf, 0x0ac0, 0xa120, 0x1f27, 0x094c, 0x4121, 0xbad4, 0x18a6, 0xbf05, 0x4333, 0xaca2, 0x19b2, 0x0f87, 0xbadf, 0x1653, 0xb251, 0x0c0e, 0xb027, 0x423d, 0x44f3, 0x43cf, 0xb06d, 0xaa68, 0x43d7, 0xaf3d, 0xaac6, 0x30bc, 0xae02, 0x0af9, 0x0a91, 0x40ba, 0x42eb, 0xb271, 0x42a8, 0xbfb8, 0x46d5, 0xa671, 0xb0ea, 0x43d2, 0x1a79, 0x35a2, 0xba41, 0x1a5a, 0x02ce, 0x4339, 0x4053, 0xbfd9, 0xa3d6, 0x2e6e, 0x416f, 0x43f7, 0xbafd, 0x427c, 0xbf76, 0xa945, 0x20fd, 0xba28, 0xb0b4, 0x4062, 0x21e7, 0xb09c, 0x4078, 0xa702, 0x41ce, 0x417a, 0xb219, 0x4196, 0xbf3d, 0xbaf7, 0x192c, 0xa208, 0x425e, 0xb2c4, 0x400a, 0x40f1, 0x4304, 0xb0e2, 0x4031, 0xb211, 0x42c3, 0x0eca, 0x46f1, 0x4072, 0x1c40, 0x40f6, 0x1b35, 0xb2f8, 0x43e3, 0x28f6, 0x43a3, 0x419a, 0x4337, 0x4311, 0x40ff, 0xbfb9, 0x312e, 0x4189, 0xa2f4, 0x45e9, 0x42f6, 0x1db4, 0x0c19, 0x44f1, 0xba6c, 0x425f, 0x4108, 0x41ba, 0x0903, 0xba53, 0x16c7, 0x4112, 0x044b, 0xb02f, 0xb21d, 0x389c, 0x420b, 0x424e, 0x309a, 0xbf87, 0x4161, 0x1fa5, 0x40cf, 0x4060, 0xbfdd, 0x4183, 0x1107, 0x3376, 0x433b, 0xa8eb, 0x352d, 0x1918, 0x0664, 0x4225, 0x401b, 0x42e0, 0xb208, 0x46a8, 0xbf38, 0xb277, 0x0fd4, 0x434e, 0x16bf, 0x43ea, 0xb2f3, 0x4124, 0x198f, 0xba5b, 0x43be, 0x1e44, 0xb2ae, 0xa745, 0xbfde, 0x405d, 0x4151, 0x41ce, 0x1c07, 0x41a7, 0x4166, 0x40fc, 0x38fe, 0x41d9, 0x4084, 0x4128, 0x1817, 0x433a, 0xbf18, 0xb269, 0x420f, 0x442e, 0xb020, 0x42e4, 0x182e, 0x2237, 0xb067, 0x4225, 0x41b4, 0x40cc, 0xbf88, 0x45d2, 0xba2b, 0x2749, 0xadb9, 0x1b34, 0x40e8, 0x0ff1, 0xb20a, 0xba70, 0x3396, 0xb261, 0x4296, 0x4387, 0x4002, 0x436b, 0x435f, 0x434c, 0xbaf7, 0x4077, 0xbfe1, 0x1f0d, 0xba30, 0xba16, 0x4085, 0xb2ad, 0x4029, 0xba54, 0x1c2f, 0xb27b, 0x0dea, 0x4233, 0xb202, 0x0952, 0xba7e, 0x31f6, 0x43fc, 0x4117, 0x45c9, 0xae39, 0xbf3f, 0x4226, 0x43b7, 0x4221, 0x44f2, 0x4157, 0x1efc, 0xbf32, 0x40ab, 0xbfc0, 0x2669, 0x4388, 0xb0a9, 0x406c, 0x28ca, 0x15e3, 0x4337, 0xba26, 0xad3c, 0x106b, 0x340e, 0xbff0, 0xba04, 0x412d, 0x415d, 0x410e, 0xbfbd, 0x427f, 0xb232, 0xac33, 0x4042, 0x40cc, 0xa690, 0x42ce, 0x2cf1, 0xbaf3, 0x40ae, 0xba6b, 0xba26, 0x0b5f, 0xb2e8, 0x4105, 0xbaf2, 0x4348, 0x4240, 0x1f5b, 0x408f, 0xbf38, 0xb282, 0x1c4d, 0x45ab, 0x43c5, 0xb253, 0xb26d, 0x1bfe, 0xbfb5, 0xb018, 0x366a, 0x4065, 0x122e, 0x408b, 0x313d, 0xba7e, 0x4002, 0xbacc, 0x4040, 0x40c3, 0x42dd, 0xb276, 0x0d1e, 0x43ab, 0xba2d, 0x190e, 0x4082, 0xb29e, 0xba38, 0x2855, 0xb074, 0x1ca5, 0x4337, 0x1d60, 0x1cfd, 0xbad9, 0x046c, 0xbfc1, 0xbfd0, 0x42d1, 0xb211, 0x1c31, 0x4694, 0xafe8, 0x43c6, 0x4303, 0x468d, 0xb214, 0x00fa, 0xb03c, 0x4280, 0x43c6, 0x4637, 0xbfde, 0x07a2, 0x4044, 0xba6b, 0xb096, 0xa983, 0x4592, 0x413a, 0x0518, 0x46e2, 0xa242, 0x25c1, 0x4103, 0xba62, 0xb001, 0x455f, 0xbf47, 0x11f2, 0xacab, 0x3992, 0xbad6, 0x439e, 0x4388, 0xb2b8, 0xba17, 0x432a, 0xb221, 0xba03, 0x1730, 0x43cf, 0x4265, 0xba50, 0x1b03, 0x428f, 0xbf2e, 0xb20c, 0x458c, 0x4390, 0x1afe, 0x42b9, 0x1d65, 0x4463, 0x42b5, 0x0dff, 0x4095, 0x42f6, 0x3496, 0x4441, 0x0c8a, 0xba61, 0x4325, 0x20f4, 0xb09c, 0x1c27, 0x420f, 0x40e0, 0xbf70, 0x21c7, 0x4240, 0x459b, 0x40a0, 0xb2ae, 0xbfd2, 0xac93, 0xb0b0, 0x31e9, 0x4131, 0x185d, 0x417c, 0xba60, 0xb24b, 0x2874, 0x40ef, 0xb206, 0xb2e9, 0x44fc, 0xb074, 0xb03b, 0x43a8, 0x426a, 0xba38, 0x43ce, 0x443f, 0xbf4b, 0x4141, 0x1f3c, 0xb2b6, 0x430b, 0xbfcf, 0x4292, 0xba52, 0x4172, 0xa9f9, 0x3050, 0x44e0, 0x43b0, 0x43e8, 0x40b3, 0x4257, 0xba6f, 0x4006, 0x4036, 0x4320, 0x46f5, 0x41f6, 0xa8e5, 0xba6a, 0x429d, 0x0a20, 0x19d7, 0x467f, 0xb20c, 0x400d, 0x4007, 0xbfaa, 0x4367, 0x21b7, 0x4142, 0x428b, 0x4369, 0x45a0, 0x2abb, 0x1af5, 0x4216, 0x1aee, 0xb02b, 0x121e, 0xb241, 0xbaee, 0x2d8b, 0x40d2, 0xbf69, 0x4117, 0x4366, 0x2bbd, 0xba10, 0xb09f, 0x4172, 0x426c, 0x23fc, 0x338e, 0xbf43, 0x4015, 0x42ee, 0xa3f1, 0x0369, 0x42e7, 0x062e, 0x1667, 0xb23b, 0x4433, 0x438e, 0xb0c9, 0x418e, 0xb0d8, 0xba4c, 0xbf13, 0x42e0, 0x1c20, 0x19f8, 0xb232, 0x4083, 0x410f, 0xad20, 0x412c, 0x3662, 0x2a58, 0x4089, 0xb275, 0x117c, 0x3b0c, 0xbf5d, 0x41c1, 0x4011, 0x4063, 0x2178, 0xab2f, 0x42a1, 0x439e, 0x2b3e, 0x45e2, 0xb084, 0xadfb, 0xa056, 0xbaf7, 0x3e15, 0x4464, 0xb046, 0xb24d, 0xb09d, 0x4202, 0x19f1, 0x4211, 0xbf5e, 0x4035, 0x400f, 0x1e45, 0x13ab, 0x40aa, 0x1ad0, 0x429f, 0xb0a4, 0xb05b, 0x0f39, 0xaa55, 0x2864, 0x437f, 0x43ca, 0xb2d1, 0x3846, 0x46e0, 0xb0d4, 0x4411, 0x1ce1, 0xb06d, 0x1246, 0x187d, 0x08ca, 0x46da, 0xbf95, 0xb273, 0xba11, 0x4211, 0x40d3, 0xb040, 0x05fd, 0x1e61, 0xa78d, 0x46f3, 0xb0e7, 0x4168, 0xba4c, 0xba0b, 0x000f, 0x41a0, 0x340c, 0x29e0, 0x2c2e, 0x42ab, 0xb01b, 0x421e, 0x2607, 0x1b58, 0xba0f, 0x442a, 0x4219, 0xb2ac, 0xbfd4, 0x414a, 0x0524, 0x3d35, 0xb0a0, 0x4343, 0x40e8, 0x40a9, 0x18f6, 0x14df, 0x41d4, 0x4542, 0x434a, 0x4306, 0x36f2, 0x1d38, 0x4595, 0x41a2, 0x42fd, 0xbf24, 0x4596, 0xa565, 0x4650, 0xb264, 0x4139, 0xb039, 0x4261, 0x41ae, 0xbaf5, 0x4112, 0x43c3, 0x0409, 0x4168, 0x40e4, 0xbfa8, 0xba31, 0xa175, 0x41ac, 0x2089, 0x423e, 0x40fe, 0x411e, 0x2535, 0x42e2, 0xa13b, 0x44c0, 0xb20f, 0xbf6e, 0x43be, 0xb2a5, 0x40bb, 0x4068, 0x19bb, 0x459d, 0x2ab5, 0x192c, 0x427e, 0x429e, 0x4286, 0x43ee, 0x415e, 0xb0cd, 0x46c3, 0x45a3, 0x4345, 0x4170, 0x064c, 0xb2bd, 0xbf19, 0xb091, 0x02aa, 0x3a96, 0xb2a8, 0x41a0, 0xb0c3, 0x4327, 0x18c6, 0x014d, 0x402a, 0xb299, 0xb207, 0x0b66, 0x3ced, 0xb2bb, 0x4188, 0x3513, 0xbaff, 0x4356, 0x437c, 0x42f2, 0xba74, 0xb239, 0xba67, 0x42b4, 0xbf3a, 0xb2d8, 0x1c3f, 0x2787, 0x4770, 0xe7fe + ], + StartRegs = [0x3be9d470, 0x621bd961, 0x561548a7, 0x32c98a3d, 0x487719ff, 0x1c15d826, 0x34d9255e, 0xaae8da54, 0xf65e2145, 0x5153589f, 0x032f5367, 0xf13554cd, 0xda5c80c1, 0x8ef09f26, 0x00000000, 0x900001f0 + ], + FinalRegs = [0xffffffff, 0xffff8018, 0x00031000, 0x00001880, 0x00000000, 0x00031013, 0x00000000, 0x00000087, 0x00012ad4, 0x00000000, 0xf135552c, 0x00012ad4, 0x0000956a, 0xfffffd74, 0x00000000, 0x600001d0 + ], }, new() { - Instructions = new ushort[] { 0xb2f7, 0x4028, 0x42dd, 0x4043, 0x422e, 0xbf5c, 0xa6cf, 0xb289, 0x06ce, 0xb229, 0x4065, 0x430d, 0x1986, 0x466b, 0x2c11, 0x0fcb, 0xba22, 0x412a, 0x40f3, 0xbf9d, 0x0cd5, 0x415a, 0x310f, 0xb07e, 0xb2da, 0xbf12, 0x3f1e, 0x3e0e, 0xb22c, 0x4414, 0xb0a3, 0x1a93, 0xbf15, 0x33ee, 0x1c22, 0x4184, 0x416b, 0x43cd, 0x4625, 0xba70, 0x438f, 0x4175, 0x4031, 0xbf53, 0x0d6a, 0x4234, 0x2c94, 0x4288, 0x4196, 0xb0ef, 0x3a5b, 0xb02b, 0xa285, 0x438c, 0x1914, 0xbfb0, 0xbf82, 0x4636, 0x4550, 0x23ad, 0x466e, 0xb04e, 0x4303, 0x4301, 0x1efc, 0xb267, 0xba31, 0x4247, 0xb01d, 0xbfa3, 0x4026, 0x11c3, 0x41fd, 0x40cc, 0x4150, 0x435d, 0xbf3f, 0xa514, 0xbfc0, 0x4293, 0x1e27, 0x42af, 0x405f, 0x3ad4, 0x40a2, 0x0423, 0x406a, 0x4236, 0xb2a5, 0x1ec3, 0x1f33, 0x29aa, 0x2865, 0x0b77, 0x2536, 0x1e74, 0x40a6, 0x43cb, 0x42e1, 0x402c, 0x4414, 0x25f3, 0x0c28, 0xbf7c, 0x0042, 0x4154, 0xbad1, 0x2d5b, 0x45c1, 0x4399, 0x3a0d, 0x41ea, 0x4398, 0xbfa0, 0xba3a, 0x41b8, 0x1f6c, 0xbf75, 0x1579, 0xb29c, 0x1d42, 0x18ce, 0x16f3, 0x44a3, 0x46b1, 0xbadc, 0x1943, 0xb2d6, 0x24b9, 0x4061, 0x2103, 0x1e64, 0x41c5, 0x41f9, 0xbf59, 0xba55, 0x40c0, 0x414f, 0xa5c1, 0x4189, 0x1f1d, 0x1afd, 0x41b6, 0xba58, 0xba3b, 0xb0b7, 0x2acf, 0x4370, 0x41e3, 0xb2d2, 0xb265, 0xb28b, 0x4133, 0xa98a, 0x403b, 0x3a58, 0x4271, 0x447e, 0x41fa, 0x40c7, 0xba58, 0x4319, 0x41e5, 0xb030, 0xbf49, 0x4074, 0xa3ca, 0xbfb0, 0x1928, 0x41a9, 0xba74, 0x4070, 0xb00f, 0x4225, 0xa687, 0x00f0, 0x406c, 0x4148, 0xbf83, 0x19c0, 0x4197, 0xb2da, 0x424c, 0xb2bc, 0xba23, 0x2e66, 0x4089, 0x28dd, 0xb2e4, 0x05cd, 0x4184, 0x05c6, 0x404d, 0xba2e, 0x0f8a, 0x4175, 0x412a, 0x44cc, 0xb0ef, 0xb042, 0xafe8, 0x420a, 0x4253, 0xbf83, 0x1b27, 0x4062, 0x424b, 0xae9c, 0xba7e, 0xb265, 0xb28a, 0x148f, 0xb2d3, 0x2e6d, 0x2efc, 0xba46, 0x40f7, 0x41fd, 0x411b, 0x4566, 0xb2b1, 0x4209, 0xb218, 0x0aeb, 0xb20d, 0x40c9, 0x226c, 0x429a, 0x22d3, 0xbfb0, 0xb286, 0x4275, 0x42a6, 0xbf96, 0x4235, 0x4222, 0x42e3, 0xb237, 0xb220, 0x4624, 0x1d89, 0xb031, 0x389e, 0x4196, 0xb0b4, 0x426e, 0x1ae5, 0x140f, 0x4398, 0x4667, 0x40e5, 0x0fe5, 0x14fe, 0x18e6, 0x44b2, 0x4285, 0x4044, 0x4233, 0x2a71, 0xb0c8, 0xb06f, 0xa688, 0xbfcb, 0x435e, 0x1af2, 0x1de1, 0x0607, 0xabf8, 0xbfc0, 0x42ef, 0x4220, 0xbf70, 0xb271, 0x3965, 0x4132, 0xab6b, 0x1665, 0xb2c5, 0x1fa6, 0x32f2, 0xb0aa, 0x41ca, 0x2064, 0x0cbe, 0x41a5, 0xbf60, 0x1fa4, 0xb02d, 0x4046, 0xa9a9, 0x41b7, 0xbf43, 0x4167, 0x0b2e, 0xa33a, 0x4202, 0xa8c2, 0x42c0, 0x425b, 0x3f6c, 0xbada, 0x1b7a, 0x40ae, 0x18c0, 0x4132, 0x407a, 0x40cb, 0xba02, 0xad3f, 0x4275, 0x4271, 0x1f2e, 0x1dec, 0xbfde, 0x4544, 0x0f82, 0x214e, 0xb284, 0x4089, 0x4334, 0x4251, 0x2dd9, 0x08e2, 0x431d, 0x4036, 0x09d7, 0x432b, 0x434c, 0xb203, 0xbf70, 0x3ce7, 0x3620, 0xbfa0, 0x155a, 0xbfb4, 0x198a, 0xb28e, 0xbf71, 0x047b, 0x1e2d, 0x42c4, 0xaa34, 0xba55, 0x4073, 0x2661, 0x4106, 0x3527, 0x1a73, 0x333f, 0x430d, 0xb26b, 0x3a6a, 0xb2f2, 0xbade, 0x42c5, 0x1d3a, 0xbf2f, 0xa17c, 0x4156, 0x4267, 0xb207, 0x4581, 0xb0f1, 0x4385, 0x1869, 0x4045, 0xb258, 0x0b70, 0x1f7d, 0xad43, 0x1f8d, 0x4235, 0xb24e, 0xb04c, 0xb0e0, 0x0d27, 0x3468, 0xbf9d, 0x189e, 0x1ccd, 0x43bc, 0x4060, 0xb2d5, 0x45bd, 0x1b74, 0x44dc, 0xbaf8, 0xab61, 0xb2d2, 0xb21c, 0x1e49, 0xafa9, 0x432a, 0x4374, 0x1b4d, 0xb24a, 0x4092, 0xb29b, 0xbf62, 0xb2d2, 0x36fc, 0x4131, 0x1d9b, 0x45f1, 0x0d6c, 0x398b, 0xb2f7, 0x424a, 0x4044, 0x03c7, 0xba2e, 0x1adb, 0x43eb, 0x40e2, 0x06a9, 0x07d8, 0x419c, 0xb291, 0xba06, 0xbf3e, 0xb28b, 0x268a, 0x41b9, 0x1119, 0x432f, 0xb29f, 0xab98, 0x4691, 0xb28e, 0x1c91, 0x128e, 0x4432, 0x435b, 0x1ae9, 0x418b, 0x05fb, 0x426f, 0xbfb2, 0x4306, 0x3ff6, 0x42f0, 0x40a1, 0x0abe, 0xba16, 0x0068, 0x4095, 0x09b3, 0x36a2, 0x4362, 0x4226, 0x407a, 0x2f81, 0xbfe2, 0x3c7d, 0x425b, 0x43f0, 0x218b, 0x3826, 0x00fc, 0x19cf, 0xb2a4, 0xba31, 0x4390, 0x43f4, 0x1d18, 0xb28e, 0xbaeb, 0x41a1, 0xbf80, 0x41e0, 0x1c8a, 0xba1e, 0x4212, 0x435d, 0x2bbc, 0xbf90, 0x432c, 0xbfae, 0x4211, 0xba70, 0x43f9, 0x42d5, 0x1ffa, 0x413d, 0xba40, 0xbfb2, 0x232a, 0x429c, 0x4490, 0x02b5, 0x4059, 0x404c, 0xba41, 0xa995, 0x415b, 0x40f7, 0x4041, 0x43e6, 0xba3b, 0xb2d7, 0x425d, 0x197f, 0x411d, 0xbf68, 0xba27, 0x1922, 0x1f2b, 0xbafe, 0x4454, 0x4310, 0x434c, 0xad88, 0x414d, 0xa4a5, 0xba15, 0xbfbc, 0x435d, 0x41ff, 0x41bc, 0x43fd, 0x1b7d, 0x3bc0, 0xb237, 0x1cf3, 0xba44, 0x4019, 0x439a, 0x4151, 0x4265, 0x406d, 0x4247, 0x2b08, 0x410e, 0x2a27, 0x42c5, 0xb2d0, 0xbf8c, 0x40d2, 0x42b5, 0xb075, 0x4324, 0x40d6, 0x431f, 0x40c8, 0x11fe, 0xa8ea, 0xbf5e, 0x4055, 0x1462, 0x091d, 0x194f, 0x0447, 0x045d, 0x4655, 0x37cb, 0xbf78, 0xba5e, 0x419f, 0x3835, 0x1c9d, 0x404a, 0x427e, 0x43c9, 0xbf60, 0x4276, 0x3259, 0x439b, 0x08a9, 0xb071, 0x4117, 0x44d3, 0xbad4, 0x42f7, 0xba45, 0x4469, 0x18e6, 0x42cd, 0x434f, 0x3f51, 0x433e, 0x45cb, 0xbf6d, 0xb268, 0x43ff, 0xbf90, 0x42c4, 0x40cc, 0x3fd6, 0x3d3e, 0x0b24, 0x40e1, 0xab12, 0xb2bf, 0xb0fc, 0xb05f, 0x43b7, 0x1dc3, 0xbf60, 0x44d8, 0xbf60, 0x43a2, 0xb2af, 0x4137, 0x41d8, 0x403e, 0x42ee, 0x32c0, 0x42a1, 0xba3b, 0x39e8, 0xbf01, 0x1a35, 0x43f6, 0x1e36, 0x4382, 0x40e2, 0xba04, 0x06a1, 0x1cc8, 0xa943, 0x4171, 0x415e, 0x4006, 0xba30, 0x411b, 0xbfc5, 0xac02, 0xb29c, 0xba4c, 0xb232, 0xba60, 0x4198, 0x42fc, 0x1a5e, 0x4269, 0xad0e, 0x0366, 0xa38a, 0x4045, 0x0a7b, 0x3899, 0x1bcc, 0xba2c, 0xb2b3, 0x45c5, 0x2575, 0x44ca, 0x4185, 0x06b8, 0x4185, 0x4018, 0xbfcd, 0x403f, 0x391d, 0xa99c, 0x17d1, 0xb280, 0xba7d, 0xba66, 0x1e75, 0x3ad1, 0x1304, 0xbfcb, 0x1e01, 0xbad0, 0x43cf, 0x4425, 0xb230, 0x43d8, 0xbae1, 0xbad7, 0x13f0, 0x42a0, 0x438c, 0x28f8, 0xb0a4, 0xb0a6, 0x196a, 0x1cc0, 0xbfc5, 0x0c99, 0x40e4, 0x1935, 0x45b4, 0xb011, 0x40ec, 0x40e9, 0x3f82, 0x42c8, 0x1aa3, 0x43be, 0x4034, 0xbf1d, 0xa56d, 0x44da, 0x19e3, 0xb2b1, 0xb2bb, 0x40e0, 0x40ef, 0x3c5d, 0x43f5, 0xb26e, 0xbfd5, 0x402f, 0x4023, 0xba3e, 0x38d4, 0xb255, 0x406d, 0x4244, 0xb06b, 0x42e1, 0xb045, 0x408a, 0x4382, 0x4102, 0x17cb, 0x4670, 0xbf21, 0xb28e, 0x4282, 0xb27c, 0x1f26, 0xb091, 0x42c9, 0x1e3a, 0xbad0, 0xbfe2, 0x1b74, 0x42a6, 0xba44, 0x42b2, 0x4291, 0xb21e, 0x404d, 0x4328, 0x4343, 0xad78, 0x42b3, 0x4169, 0x3557, 0x1b59, 0x4372, 0x403d, 0x41f5, 0xba79, 0x0e81, 0xa713, 0x2378, 0xba21, 0x4050, 0x40d7, 0xb050, 0xa3af, 0x417d, 0x4001, 0xbf95, 0xa8cc, 0x437c, 0x436e, 0x408e, 0x43aa, 0x3957, 0xb021, 0x4209, 0xb272, 0xba1e, 0x42a2, 0x4351, 0x467a, 0x13cc, 0x2db1, 0x466e, 0x4234, 0x43c0, 0xb0dc, 0x1fcc, 0xbf5e, 0x41e2, 0x17ab, 0x4173, 0x4110, 0x427b, 0x41b2, 0xa5af, 0x411e, 0xbaf2, 0xba49, 0x4197, 0x4448, 0xb068, 0x4283, 0x4354, 0xbfa0, 0x40f2, 0x1f52, 0x41d3, 0x4571, 0x1aab, 0xb2b5, 0xaa74, 0x4372, 0xbf26, 0xb2cd, 0x42e7, 0x18a8, 0x373f, 0xba7c, 0x40a7, 0x40ec, 0x1deb, 0x4380, 0xb072, 0x43b6, 0xab0a, 0xbf54, 0x42d3, 0xa8e9, 0x1d8b, 0x1f92, 0x4046, 0x1ae7, 0xafbf, 0x20de, 0x45cc, 0x189d, 0x42f4, 0x43e8, 0xb093, 0x292d, 0x412b, 0x430a, 0xbae8, 0x0ffa, 0x4080, 0x3294, 0x4665, 0x4284, 0x22c5, 0x25bf, 0xb27b, 0xbf3c, 0x3912, 0x2d61, 0xbadb, 0x44a3, 0xbf42, 0xb2a4, 0x411f, 0x1d60, 0x40f5, 0x21a9, 0x0250, 0x0a3c, 0x31e6, 0xbf77, 0x43ea, 0x1ff8, 0xbac4, 0xbac2, 0xb209, 0xbf1b, 0x43b9, 0x0791, 0x3579, 0x4447, 0xba5f, 0xbf92, 0x3c03, 0x4383, 0x4044, 0xa95a, 0xba71, 0xb229, 0x4303, 0x316a, 0x4389, 0x1ff4, 0x422e, 0xb2b3, 0x40e3, 0x4085, 0x3342, 0x42a2, 0x1d76, 0xb200, 0xae67, 0x45b2, 0xbf1d, 0xbadc, 0x27d9, 0x18e9, 0x41dd, 0x294b, 0xbf41, 0x0d48, 0x4137, 0x4015, 0x43f4, 0x317c, 0x42bf, 0x4391, 0x1774, 0x0d7f, 0x40b4, 0xba0f, 0x4111, 0xba30, 0x30fe, 0xb2b2, 0x438e, 0x4012, 0x460d, 0xbfc0, 0x2de0, 0xb2aa, 0x00da, 0x42bd, 0x4385, 0xbfa8, 0x1f7e, 0xb203, 0xb293, 0x2c9a, 0x1ea5, 0x2d34, 0x46aa, 0xb288, 0xbf7d, 0xba02, 0x2b0a, 0xb0a2, 0x43ae, 0x435c, 0x406e, 0xb09f, 0x1484, 0x416b, 0x46b3, 0x4314, 0x422f, 0xa751, 0x44e8, 0x43ae, 0xa901, 0xba66, 0x41ca, 0xbf0b, 0x43af, 0x1faf, 0x1fbf, 0xac1d, 0xac02, 0x235c, 0xbfc1, 0x4145, 0x1b22, 0x1c5c, 0x404a, 0xa600, 0x43b0, 0xbad1, 0xbf4b, 0x1b24, 0xa8e3, 0xba03, 0xaf8e, 0x295f, 0x1b40, 0x4178, 0xb205, 0x146f, 0x09ca, 0x2e3c, 0x43f7, 0x439b, 0x3295, 0x408a, 0xbf1a, 0x454f, 0x3bc1, 0xba5b, 0x4100, 0x40f2, 0x1af2, 0x1c9b, 0xa85c, 0xaf0f, 0xbfb0, 0xa8dc, 0x4218, 0x414a, 0xb205, 0xb2a2, 0x4160, 0xa22c, 0x00b4, 0x42e3, 0xba5b, 0xbf52, 0xba23, 0x40bd, 0xb01d, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xe4527cc5, 0xffa5922e, 0xca434c0d, 0x2c3146e6, 0x89b4f1a8, 0xd1d30b0d, 0x90e04460, 0x4d312bcd, 0xd0bf479f, 0x23e96a47, 0x987a7688, 0x7251199f, 0x0415194f, 0xea9d51e2, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0xea9d5adb, 0x00001257, 0x0000187c, 0x105e0000, 0x00005e10, 0x00005a7e, 0x00001784, 0xea9d574a, 0xc6274cdf, 0x00000000, 0xfffffffe, 0x8aff0005, 0x766633dc, 0xea9d570e, 0x00000000, 0x000001d0 }, + Instructions = [0xb2f7, 0x4028, 0x42dd, 0x4043, 0x422e, 0xbf5c, 0xa6cf, 0xb289, 0x06ce, 0xb229, 0x4065, 0x430d, 0x1986, 0x466b, 0x2c11, 0x0fcb, 0xba22, 0x412a, 0x40f3, 0xbf9d, 0x0cd5, 0x415a, 0x310f, 0xb07e, 0xb2da, 0xbf12, 0x3f1e, 0x3e0e, 0xb22c, 0x4414, 0xb0a3, 0x1a93, 0xbf15, 0x33ee, 0x1c22, 0x4184, 0x416b, 0x43cd, 0x4625, 0xba70, 0x438f, 0x4175, 0x4031, 0xbf53, 0x0d6a, 0x4234, 0x2c94, 0x4288, 0x4196, 0xb0ef, 0x3a5b, 0xb02b, 0xa285, 0x438c, 0x1914, 0xbfb0, 0xbf82, 0x4636, 0x4550, 0x23ad, 0x466e, 0xb04e, 0x4303, 0x4301, 0x1efc, 0xb267, 0xba31, 0x4247, 0xb01d, 0xbfa3, 0x4026, 0x11c3, 0x41fd, 0x40cc, 0x4150, 0x435d, 0xbf3f, 0xa514, 0xbfc0, 0x4293, 0x1e27, 0x42af, 0x405f, 0x3ad4, 0x40a2, 0x0423, 0x406a, 0x4236, 0xb2a5, 0x1ec3, 0x1f33, 0x29aa, 0x2865, 0x0b77, 0x2536, 0x1e74, 0x40a6, 0x43cb, 0x42e1, 0x402c, 0x4414, 0x25f3, 0x0c28, 0xbf7c, 0x0042, 0x4154, 0xbad1, 0x2d5b, 0x45c1, 0x4399, 0x3a0d, 0x41ea, 0x4398, 0xbfa0, 0xba3a, 0x41b8, 0x1f6c, 0xbf75, 0x1579, 0xb29c, 0x1d42, 0x18ce, 0x16f3, 0x44a3, 0x46b1, 0xbadc, 0x1943, 0xb2d6, 0x24b9, 0x4061, 0x2103, 0x1e64, 0x41c5, 0x41f9, 0xbf59, 0xba55, 0x40c0, 0x414f, 0xa5c1, 0x4189, 0x1f1d, 0x1afd, 0x41b6, 0xba58, 0xba3b, 0xb0b7, 0x2acf, 0x4370, 0x41e3, 0xb2d2, 0xb265, 0xb28b, 0x4133, 0xa98a, 0x403b, 0x3a58, 0x4271, 0x447e, 0x41fa, 0x40c7, 0xba58, 0x4319, 0x41e5, 0xb030, 0xbf49, 0x4074, 0xa3ca, 0xbfb0, 0x1928, 0x41a9, 0xba74, 0x4070, 0xb00f, 0x4225, 0xa687, 0x00f0, 0x406c, 0x4148, 0xbf83, 0x19c0, 0x4197, 0xb2da, 0x424c, 0xb2bc, 0xba23, 0x2e66, 0x4089, 0x28dd, 0xb2e4, 0x05cd, 0x4184, 0x05c6, 0x404d, 0xba2e, 0x0f8a, 0x4175, 0x412a, 0x44cc, 0xb0ef, 0xb042, 0xafe8, 0x420a, 0x4253, 0xbf83, 0x1b27, 0x4062, 0x424b, 0xae9c, 0xba7e, 0xb265, 0xb28a, 0x148f, 0xb2d3, 0x2e6d, 0x2efc, 0xba46, 0x40f7, 0x41fd, 0x411b, 0x4566, 0xb2b1, 0x4209, 0xb218, 0x0aeb, 0xb20d, 0x40c9, 0x226c, 0x429a, 0x22d3, 0xbfb0, 0xb286, 0x4275, 0x42a6, 0xbf96, 0x4235, 0x4222, 0x42e3, 0xb237, 0xb220, 0x4624, 0x1d89, 0xb031, 0x389e, 0x4196, 0xb0b4, 0x426e, 0x1ae5, 0x140f, 0x4398, 0x4667, 0x40e5, 0x0fe5, 0x14fe, 0x18e6, 0x44b2, 0x4285, 0x4044, 0x4233, 0x2a71, 0xb0c8, 0xb06f, 0xa688, 0xbfcb, 0x435e, 0x1af2, 0x1de1, 0x0607, 0xabf8, 0xbfc0, 0x42ef, 0x4220, 0xbf70, 0xb271, 0x3965, 0x4132, 0xab6b, 0x1665, 0xb2c5, 0x1fa6, 0x32f2, 0xb0aa, 0x41ca, 0x2064, 0x0cbe, 0x41a5, 0xbf60, 0x1fa4, 0xb02d, 0x4046, 0xa9a9, 0x41b7, 0xbf43, 0x4167, 0x0b2e, 0xa33a, 0x4202, 0xa8c2, 0x42c0, 0x425b, 0x3f6c, 0xbada, 0x1b7a, 0x40ae, 0x18c0, 0x4132, 0x407a, 0x40cb, 0xba02, 0xad3f, 0x4275, 0x4271, 0x1f2e, 0x1dec, 0xbfde, 0x4544, 0x0f82, 0x214e, 0xb284, 0x4089, 0x4334, 0x4251, 0x2dd9, 0x08e2, 0x431d, 0x4036, 0x09d7, 0x432b, 0x434c, 0xb203, 0xbf70, 0x3ce7, 0x3620, 0xbfa0, 0x155a, 0xbfb4, 0x198a, 0xb28e, 0xbf71, 0x047b, 0x1e2d, 0x42c4, 0xaa34, 0xba55, 0x4073, 0x2661, 0x4106, 0x3527, 0x1a73, 0x333f, 0x430d, 0xb26b, 0x3a6a, 0xb2f2, 0xbade, 0x42c5, 0x1d3a, 0xbf2f, 0xa17c, 0x4156, 0x4267, 0xb207, 0x4581, 0xb0f1, 0x4385, 0x1869, 0x4045, 0xb258, 0x0b70, 0x1f7d, 0xad43, 0x1f8d, 0x4235, 0xb24e, 0xb04c, 0xb0e0, 0x0d27, 0x3468, 0xbf9d, 0x189e, 0x1ccd, 0x43bc, 0x4060, 0xb2d5, 0x45bd, 0x1b74, 0x44dc, 0xbaf8, 0xab61, 0xb2d2, 0xb21c, 0x1e49, 0xafa9, 0x432a, 0x4374, 0x1b4d, 0xb24a, 0x4092, 0xb29b, 0xbf62, 0xb2d2, 0x36fc, 0x4131, 0x1d9b, 0x45f1, 0x0d6c, 0x398b, 0xb2f7, 0x424a, 0x4044, 0x03c7, 0xba2e, 0x1adb, 0x43eb, 0x40e2, 0x06a9, 0x07d8, 0x419c, 0xb291, 0xba06, 0xbf3e, 0xb28b, 0x268a, 0x41b9, 0x1119, 0x432f, 0xb29f, 0xab98, 0x4691, 0xb28e, 0x1c91, 0x128e, 0x4432, 0x435b, 0x1ae9, 0x418b, 0x05fb, 0x426f, 0xbfb2, 0x4306, 0x3ff6, 0x42f0, 0x40a1, 0x0abe, 0xba16, 0x0068, 0x4095, 0x09b3, 0x36a2, 0x4362, 0x4226, 0x407a, 0x2f81, 0xbfe2, 0x3c7d, 0x425b, 0x43f0, 0x218b, 0x3826, 0x00fc, 0x19cf, 0xb2a4, 0xba31, 0x4390, 0x43f4, 0x1d18, 0xb28e, 0xbaeb, 0x41a1, 0xbf80, 0x41e0, 0x1c8a, 0xba1e, 0x4212, 0x435d, 0x2bbc, 0xbf90, 0x432c, 0xbfae, 0x4211, 0xba70, 0x43f9, 0x42d5, 0x1ffa, 0x413d, 0xba40, 0xbfb2, 0x232a, 0x429c, 0x4490, 0x02b5, 0x4059, 0x404c, 0xba41, 0xa995, 0x415b, 0x40f7, 0x4041, 0x43e6, 0xba3b, 0xb2d7, 0x425d, 0x197f, 0x411d, 0xbf68, 0xba27, 0x1922, 0x1f2b, 0xbafe, 0x4454, 0x4310, 0x434c, 0xad88, 0x414d, 0xa4a5, 0xba15, 0xbfbc, 0x435d, 0x41ff, 0x41bc, 0x43fd, 0x1b7d, 0x3bc0, 0xb237, 0x1cf3, 0xba44, 0x4019, 0x439a, 0x4151, 0x4265, 0x406d, 0x4247, 0x2b08, 0x410e, 0x2a27, 0x42c5, 0xb2d0, 0xbf8c, 0x40d2, 0x42b5, 0xb075, 0x4324, 0x40d6, 0x431f, 0x40c8, 0x11fe, 0xa8ea, 0xbf5e, 0x4055, 0x1462, 0x091d, 0x194f, 0x0447, 0x045d, 0x4655, 0x37cb, 0xbf78, 0xba5e, 0x419f, 0x3835, 0x1c9d, 0x404a, 0x427e, 0x43c9, 0xbf60, 0x4276, 0x3259, 0x439b, 0x08a9, 0xb071, 0x4117, 0x44d3, 0xbad4, 0x42f7, 0xba45, 0x4469, 0x18e6, 0x42cd, 0x434f, 0x3f51, 0x433e, 0x45cb, 0xbf6d, 0xb268, 0x43ff, 0xbf90, 0x42c4, 0x40cc, 0x3fd6, 0x3d3e, 0x0b24, 0x40e1, 0xab12, 0xb2bf, 0xb0fc, 0xb05f, 0x43b7, 0x1dc3, 0xbf60, 0x44d8, 0xbf60, 0x43a2, 0xb2af, 0x4137, 0x41d8, 0x403e, 0x42ee, 0x32c0, 0x42a1, 0xba3b, 0x39e8, 0xbf01, 0x1a35, 0x43f6, 0x1e36, 0x4382, 0x40e2, 0xba04, 0x06a1, 0x1cc8, 0xa943, 0x4171, 0x415e, 0x4006, 0xba30, 0x411b, 0xbfc5, 0xac02, 0xb29c, 0xba4c, 0xb232, 0xba60, 0x4198, 0x42fc, 0x1a5e, 0x4269, 0xad0e, 0x0366, 0xa38a, 0x4045, 0x0a7b, 0x3899, 0x1bcc, 0xba2c, 0xb2b3, 0x45c5, 0x2575, 0x44ca, 0x4185, 0x06b8, 0x4185, 0x4018, 0xbfcd, 0x403f, 0x391d, 0xa99c, 0x17d1, 0xb280, 0xba7d, 0xba66, 0x1e75, 0x3ad1, 0x1304, 0xbfcb, 0x1e01, 0xbad0, 0x43cf, 0x4425, 0xb230, 0x43d8, 0xbae1, 0xbad7, 0x13f0, 0x42a0, 0x438c, 0x28f8, 0xb0a4, 0xb0a6, 0x196a, 0x1cc0, 0xbfc5, 0x0c99, 0x40e4, 0x1935, 0x45b4, 0xb011, 0x40ec, 0x40e9, 0x3f82, 0x42c8, 0x1aa3, 0x43be, 0x4034, 0xbf1d, 0xa56d, 0x44da, 0x19e3, 0xb2b1, 0xb2bb, 0x40e0, 0x40ef, 0x3c5d, 0x43f5, 0xb26e, 0xbfd5, 0x402f, 0x4023, 0xba3e, 0x38d4, 0xb255, 0x406d, 0x4244, 0xb06b, 0x42e1, 0xb045, 0x408a, 0x4382, 0x4102, 0x17cb, 0x4670, 0xbf21, 0xb28e, 0x4282, 0xb27c, 0x1f26, 0xb091, 0x42c9, 0x1e3a, 0xbad0, 0xbfe2, 0x1b74, 0x42a6, 0xba44, 0x42b2, 0x4291, 0xb21e, 0x404d, 0x4328, 0x4343, 0xad78, 0x42b3, 0x4169, 0x3557, 0x1b59, 0x4372, 0x403d, 0x41f5, 0xba79, 0x0e81, 0xa713, 0x2378, 0xba21, 0x4050, 0x40d7, 0xb050, 0xa3af, 0x417d, 0x4001, 0xbf95, 0xa8cc, 0x437c, 0x436e, 0x408e, 0x43aa, 0x3957, 0xb021, 0x4209, 0xb272, 0xba1e, 0x42a2, 0x4351, 0x467a, 0x13cc, 0x2db1, 0x466e, 0x4234, 0x43c0, 0xb0dc, 0x1fcc, 0xbf5e, 0x41e2, 0x17ab, 0x4173, 0x4110, 0x427b, 0x41b2, 0xa5af, 0x411e, 0xbaf2, 0xba49, 0x4197, 0x4448, 0xb068, 0x4283, 0x4354, 0xbfa0, 0x40f2, 0x1f52, 0x41d3, 0x4571, 0x1aab, 0xb2b5, 0xaa74, 0x4372, 0xbf26, 0xb2cd, 0x42e7, 0x18a8, 0x373f, 0xba7c, 0x40a7, 0x40ec, 0x1deb, 0x4380, 0xb072, 0x43b6, 0xab0a, 0xbf54, 0x42d3, 0xa8e9, 0x1d8b, 0x1f92, 0x4046, 0x1ae7, 0xafbf, 0x20de, 0x45cc, 0x189d, 0x42f4, 0x43e8, 0xb093, 0x292d, 0x412b, 0x430a, 0xbae8, 0x0ffa, 0x4080, 0x3294, 0x4665, 0x4284, 0x22c5, 0x25bf, 0xb27b, 0xbf3c, 0x3912, 0x2d61, 0xbadb, 0x44a3, 0xbf42, 0xb2a4, 0x411f, 0x1d60, 0x40f5, 0x21a9, 0x0250, 0x0a3c, 0x31e6, 0xbf77, 0x43ea, 0x1ff8, 0xbac4, 0xbac2, 0xb209, 0xbf1b, 0x43b9, 0x0791, 0x3579, 0x4447, 0xba5f, 0xbf92, 0x3c03, 0x4383, 0x4044, 0xa95a, 0xba71, 0xb229, 0x4303, 0x316a, 0x4389, 0x1ff4, 0x422e, 0xb2b3, 0x40e3, 0x4085, 0x3342, 0x42a2, 0x1d76, 0xb200, 0xae67, 0x45b2, 0xbf1d, 0xbadc, 0x27d9, 0x18e9, 0x41dd, 0x294b, 0xbf41, 0x0d48, 0x4137, 0x4015, 0x43f4, 0x317c, 0x42bf, 0x4391, 0x1774, 0x0d7f, 0x40b4, 0xba0f, 0x4111, 0xba30, 0x30fe, 0xb2b2, 0x438e, 0x4012, 0x460d, 0xbfc0, 0x2de0, 0xb2aa, 0x00da, 0x42bd, 0x4385, 0xbfa8, 0x1f7e, 0xb203, 0xb293, 0x2c9a, 0x1ea5, 0x2d34, 0x46aa, 0xb288, 0xbf7d, 0xba02, 0x2b0a, 0xb0a2, 0x43ae, 0x435c, 0x406e, 0xb09f, 0x1484, 0x416b, 0x46b3, 0x4314, 0x422f, 0xa751, 0x44e8, 0x43ae, 0xa901, 0xba66, 0x41ca, 0xbf0b, 0x43af, 0x1faf, 0x1fbf, 0xac1d, 0xac02, 0x235c, 0xbfc1, 0x4145, 0x1b22, 0x1c5c, 0x404a, 0xa600, 0x43b0, 0xbad1, 0xbf4b, 0x1b24, 0xa8e3, 0xba03, 0xaf8e, 0x295f, 0x1b40, 0x4178, 0xb205, 0x146f, 0x09ca, 0x2e3c, 0x43f7, 0x439b, 0x3295, 0x408a, 0xbf1a, 0x454f, 0x3bc1, 0xba5b, 0x4100, 0x40f2, 0x1af2, 0x1c9b, 0xa85c, 0xaf0f, 0xbfb0, 0xa8dc, 0x4218, 0x414a, 0xb205, 0xb2a2, 0x4160, 0xa22c, 0x00b4, 0x42e3, 0xba5b, 0xbf52, 0xba23, 0x40bd, 0xb01d, 0x4770, 0xe7fe + ], + StartRegs = [0xe4527cc5, 0xffa5922e, 0xca434c0d, 0x2c3146e6, 0x89b4f1a8, 0xd1d30b0d, 0x90e04460, 0x4d312bcd, 0xd0bf479f, 0x23e96a47, 0x987a7688, 0x7251199f, 0x0415194f, 0xea9d51e2, 0x00000000, 0x100001f0 + ], + FinalRegs = [0xea9d5adb, 0x00001257, 0x0000187c, 0x105e0000, 0x00005e10, 0x00005a7e, 0x00001784, 0xea9d574a, 0xc6274cdf, 0x00000000, 0xfffffffe, 0x8aff0005, 0x766633dc, 0xea9d570e, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x4166, 0xba66, 0x4108, 0x43d1, 0x2c5e, 0xb2fb, 0x4067, 0xafc6, 0x1915, 0x25ef, 0xaadd, 0xb016, 0xbac4, 0xba6e, 0x4415, 0x455e, 0xba35, 0xbf09, 0x4108, 0x0586, 0x42f9, 0x41e2, 0x15df, 0x279d, 0x18cb, 0x3d65, 0x40cd, 0xb0fe, 0x430b, 0xb006, 0x40a5, 0xb21d, 0x409f, 0xa0e2, 0xbf8f, 0x4328, 0x4444, 0xbf70, 0xb2be, 0x40b1, 0xb294, 0x4068, 0x414b, 0x13ae, 0x41e2, 0xb21d, 0x43ce, 0xba3d, 0xb26b, 0x1830, 0xb2b0, 0x440c, 0x29fa, 0x4290, 0xba40, 0x37eb, 0x43db, 0x422c, 0x4337, 0x30cc, 0x41cc, 0x4309, 0xb2f7, 0x401d, 0xbf1a, 0x4322, 0x43b8, 0x41b3, 0x33c5, 0x29e3, 0x0c91, 0x4240, 0x419f, 0xbf31, 0x4059, 0x407f, 0xa4cc, 0x179f, 0x42a2, 0xb28b, 0x413f, 0x40b7, 0xb276, 0x42f8, 0x416c, 0xba03, 0x287a, 0xbfa0, 0x3811, 0x4374, 0x44fd, 0x4147, 0x1d8b, 0x2828, 0x13cb, 0x4166, 0x45e0, 0xb206, 0x184e, 0x414d, 0xbfb9, 0xba1c, 0x40c7, 0x41fb, 0x41f5, 0x433c, 0x400e, 0x42da, 0x43a5, 0x1c04, 0x4202, 0x1c75, 0xb20a, 0x41d0, 0x405a, 0xba78, 0x3bb3, 0xbf19, 0xba6a, 0xb223, 0x35a6, 0x40a4, 0x0707, 0xbf61, 0xb2ac, 0x443e, 0x408c, 0x421c, 0x4128, 0x1975, 0xa7e9, 0x09d5, 0x1ffb, 0xb25d, 0x448a, 0x41e9, 0xaf03, 0x1ea5, 0x40bd, 0xb25f, 0x13f0, 0x4639, 0xba67, 0x404e, 0x1701, 0x423f, 0x3cf4, 0x1f10, 0x431e, 0xbfb6, 0xba7c, 0xb2b0, 0x1f0e, 0xba3e, 0x37c8, 0xba46, 0xba74, 0xba30, 0x41b1, 0x4291, 0x40ad, 0xb0ae, 0x4268, 0xb0a1, 0xba4e, 0x0d33, 0x3511, 0x03b1, 0x4383, 0xbf2e, 0x1a28, 0x43ce, 0x0d7a, 0x40e1, 0x4078, 0x13ce, 0xba1b, 0xb0fe, 0x2b59, 0x402c, 0xbfb6, 0xb288, 0xb25a, 0x41ee, 0x4343, 0x1c53, 0xb21d, 0x41af, 0xb2b4, 0x423d, 0xad88, 0x43cd, 0x4382, 0x40fd, 0x1376, 0x3a63, 0x4162, 0x4091, 0xb2fc, 0x43f8, 0x4247, 0x43b5, 0x4622, 0x41da, 0x1e63, 0x40e3, 0x435f, 0x4630, 0xbfd1, 0x19a2, 0x4237, 0x433c, 0x42eb, 0x3f17, 0xbf6a, 0xbacb, 0x4340, 0xb236, 0xbace, 0x43a4, 0xb20b, 0x1f3a, 0x393d, 0x42a8, 0x22da, 0x1b3d, 0x1884, 0x33e2, 0xa02b, 0xb087, 0x2942, 0xb038, 0xbad6, 0x4055, 0x418a, 0x4373, 0x411b, 0x4382, 0x4041, 0x41cf, 0x42fe, 0xbf79, 0x43bf, 0x1c07, 0xbac0, 0xb263, 0xba01, 0x429b, 0x0774, 0xb011, 0x4135, 0x42b9, 0xbf72, 0x4466, 0xbf60, 0x422b, 0x3aea, 0xbf1f, 0x1986, 0xb2f1, 0xa844, 0x41f7, 0xb029, 0x4319, 0x3b38, 0x4017, 0xbf34, 0x1bd1, 0xbfc0, 0x4014, 0x4304, 0xb2e2, 0x1824, 0xb28b, 0x430b, 0xa850, 0x2fdd, 0x1eb3, 0x46f2, 0x1974, 0x428c, 0x43c9, 0x42f1, 0xbf6a, 0x1d2a, 0x1f8c, 0x41ef, 0x440e, 0x4440, 0x40e9, 0x43a1, 0xaa22, 0x15b9, 0xbf25, 0xb2b8, 0x43f6, 0x40a6, 0x42f1, 0xb28a, 0xb23f, 0x4350, 0x418d, 0x42ea, 0xae84, 0xb062, 0xb297, 0x405c, 0x4132, 0x1943, 0x43da, 0xb012, 0x1d91, 0x3514, 0xbf6a, 0x4202, 0x00f2, 0x4243, 0xafb2, 0x414f, 0xbf11, 0x42aa, 0x40bd, 0x416f, 0x4196, 0xb061, 0x4119, 0x1225, 0x439e, 0x0de1, 0x2cc9, 0x1cdd, 0x3081, 0x431b, 0xb21e, 0x1e40, 0x3105, 0xbf98, 0xb0b5, 0xba65, 0xb2e7, 0x42d3, 0x0bab, 0x1fc2, 0xb0ca, 0x436f, 0xb296, 0x330d, 0x4078, 0xb25d, 0x4285, 0x3335, 0x2608, 0x34e2, 0x411d, 0x38b9, 0x1ab8, 0x023f, 0x10e9, 0x095b, 0x41d9, 0xbf60, 0xbf61, 0x4363, 0x1d56, 0x4658, 0x43f8, 0x41ac, 0x3b35, 0x4203, 0x204d, 0xbfb0, 0x4609, 0x413a, 0x4029, 0xba79, 0xba33, 0x456d, 0xb278, 0xa065, 0x40d8, 0x1c95, 0xb0ee, 0xb20f, 0xbf82, 0x404e, 0x4102, 0x4005, 0xafb3, 0x43ae, 0x1adb, 0x1ef9, 0x04e7, 0xb2b1, 0xbf90, 0x3eae, 0x44d4, 0x10e7, 0xbfaf, 0x42b4, 0x41b9, 0x4661, 0xb0ba, 0xbaf0, 0x4310, 0xba07, 0xadfc, 0x370b, 0x4078, 0xa86c, 0x43bf, 0x46a9, 0xb2c3, 0x438a, 0x0e58, 0x2d29, 0xb2c2, 0x0d85, 0x2025, 0x43be, 0xbf95, 0x43e2, 0x0190, 0xb03b, 0x43af, 0xba48, 0xbf60, 0x280a, 0x45c0, 0xb225, 0xbac3, 0x4171, 0x4286, 0x27a7, 0x4084, 0x1b18, 0x3e85, 0x1d9e, 0x222f, 0x2477, 0x1cd9, 0xba7e, 0xbfd1, 0x0c6e, 0x419b, 0xb284, 0x466c, 0x4076, 0x427f, 0x4657, 0x415f, 0x1d87, 0x0221, 0x346e, 0x4217, 0xbadb, 0x41f4, 0x41e9, 0xbac1, 0x42b2, 0x4177, 0x4118, 0x4128, 0x3828, 0x04a2, 0xbac4, 0xba30, 0xb0f2, 0xbf8a, 0xa678, 0x18bf, 0xb0ad, 0x40dd, 0x416e, 0x43d7, 0x44b9, 0xa0fd, 0x434b, 0xb097, 0x1f28, 0x4320, 0xb00e, 0x4377, 0x1187, 0xba24, 0x4160, 0xb027, 0xb20e, 0x43aa, 0x43cf, 0xbfd4, 0x39e1, 0x1d32, 0x40f2, 0x404a, 0xba4f, 0x00ca, 0xbaee, 0x426d, 0xb2f1, 0x16fd, 0x3012, 0x415e, 0x412c, 0x4221, 0xbf62, 0x1eaf, 0xab08, 0x40b8, 0x0851, 0x3a0d, 0x0010, 0xa39c, 0x0bbb, 0x438e, 0x115e, 0x2965, 0x43c4, 0x448a, 0x447b, 0x4389, 0x42a7, 0xba70, 0x46a5, 0x437f, 0x1a53, 0xb2d0, 0xb2b4, 0x417a, 0xb20f, 0x3ddf, 0x4213, 0xbf03, 0x419b, 0xb229, 0x1cc5, 0x42d9, 0x4307, 0xb0b0, 0x424e, 0xb0c5, 0x2b34, 0x430e, 0x42a2, 0x409c, 0x41eb, 0x4143, 0x4092, 0xbfab, 0x419d, 0x4370, 0x173a, 0xbac9, 0x44ba, 0xba24, 0x4292, 0xbf83, 0x10f4, 0x1352, 0x435f, 0x430a, 0x4113, 0x4556, 0xba04, 0x43b0, 0x43cc, 0x3369, 0xb0c6, 0x43ca, 0x42e2, 0xbf43, 0xb04a, 0xb0cf, 0xb2c0, 0xbff0, 0x436f, 0x40e7, 0xbf72, 0x1cda, 0xba12, 0xb2b6, 0x1294, 0xb083, 0x44f3, 0xbf4a, 0x4379, 0x4206, 0x4168, 0x18aa, 0x43b3, 0xb2d4, 0x442d, 0x4363, 0x4219, 0x3fba, 0xb2f9, 0x4226, 0xbff0, 0xb050, 0x1882, 0x4143, 0x4602, 0x3889, 0x19a3, 0xbf35, 0x4110, 0x429e, 0xb2dd, 0x4087, 0xba4b, 0x4303, 0x415b, 0xb031, 0xb003, 0x4062, 0x1aa9, 0x4066, 0x1ca6, 0xbf80, 0x1970, 0x0840, 0xa6a7, 0xaf8d, 0x40ea, 0x2ad2, 0xb2b7, 0x41aa, 0xbae6, 0x393e, 0x4264, 0x40ae, 0xbaf7, 0xbf6d, 0xb244, 0xba21, 0xba7b, 0x23d2, 0x400a, 0x4059, 0xba4d, 0x1505, 0x1d64, 0x42b9, 0x4197, 0x41f8, 0x4437, 0x41ac, 0x0a56, 0x1d3d, 0x4555, 0xbf8f, 0x4319, 0xbade, 0xba6e, 0x03a1, 0xb2b4, 0x40ac, 0xa7c5, 0xbf14, 0xac04, 0x221e, 0x4246, 0xb2d9, 0x4020, 0xba06, 0xbff0, 0x40d0, 0x2539, 0xba4f, 0x4283, 0x43b5, 0x42f1, 0x43a9, 0xb215, 0xba78, 0x4353, 0xb2ad, 0x0eb2, 0x40b9, 0x05f6, 0x1b03, 0x037a, 0x1922, 0x1d2d, 0x4218, 0xbf42, 0x2674, 0x44fd, 0x41e2, 0xba4d, 0x43f9, 0x10d1, 0x4121, 0x4309, 0xb25a, 0xba68, 0xb2d2, 0x402c, 0x27fb, 0x4143, 0xba48, 0xbfc6, 0x42cd, 0x438f, 0xb23a, 0x253a, 0x19ff, 0x40ed, 0x429a, 0x03f5, 0x412e, 0xba52, 0x43e5, 0xb2bf, 0x1bae, 0x43a5, 0x4389, 0x4253, 0x1bc9, 0xbf8c, 0xb20d, 0xb2be, 0x43ea, 0xa6fd, 0x3b1d, 0x40ad, 0x43d6, 0x43fd, 0x448a, 0x17ff, 0x430b, 0x41e0, 0xba42, 0xbf57, 0xaf35, 0x423c, 0x40b0, 0x43f4, 0xb245, 0x1a09, 0x04e0, 0x398e, 0x4049, 0x4389, 0x43b2, 0xbf00, 0xb0b9, 0x1f41, 0x41a5, 0x4143, 0x403e, 0xa712, 0xab59, 0xbac2, 0x422b, 0x21e4, 0xbfdd, 0xb273, 0x2b57, 0xa6e7, 0xa357, 0xa329, 0x427e, 0xb29d, 0x0b10, 0xbae1, 0xa29b, 0x2e57, 0x41dd, 0x43b3, 0xb2ff, 0xb201, 0xa480, 0x111a, 0x434f, 0x3828, 0x0c1e, 0x40bd, 0x1ddc, 0x4120, 0xbf90, 0x1f65, 0x4387, 0x4307, 0x4235, 0xbf87, 0xbff0, 0x41c6, 0x36e9, 0x4120, 0x40ca, 0x4383, 0xb211, 0x41f5, 0x4309, 0xbfd5, 0x4332, 0xb23a, 0x4227, 0x4358, 0x2229, 0x41a0, 0xb09b, 0x4162, 0x00af, 0x4017, 0xb270, 0xbf60, 0x4289, 0xba44, 0x415f, 0x3745, 0x1d25, 0xb24f, 0x415b, 0x1dde, 0x41d5, 0x421d, 0x4061, 0xb23d, 0xb0e1, 0xb231, 0xbfce, 0x4479, 0x18ae, 0x429b, 0x3aa6, 0xb031, 0xbf08, 0x4173, 0x4025, 0xbf01, 0xbf80, 0x429a, 0xa140, 0x4241, 0x4004, 0xbaf0, 0x1950, 0xbf00, 0x4069, 0xbf90, 0x42f8, 0x4149, 0x4352, 0x40ee, 0x1a2e, 0x1888, 0x2be6, 0xa75e, 0xb040, 0x42ed, 0x4158, 0xbf7a, 0x45aa, 0x0e95, 0x1014, 0x0d0c, 0x22e9, 0x1dc7, 0xbfa0, 0xb092, 0xbfb0, 0x41c7, 0x0377, 0xb2c9, 0x4260, 0x4371, 0x1ba6, 0x4273, 0x426c, 0x1a58, 0x1e6b, 0x0f52, 0x1c50, 0x3528, 0x4157, 0x4296, 0xbf43, 0x345e, 0x40f5, 0x429c, 0x42bc, 0x4312, 0xa05d, 0x1ea4, 0x40e2, 0xbf92, 0x38a7, 0x43b2, 0xbfb0, 0x1d58, 0xba54, 0xb256, 0xb255, 0x442e, 0x4293, 0xba67, 0x1804, 0xb27c, 0x425a, 0x4173, 0xba62, 0x4221, 0x41c7, 0x3475, 0xbfb8, 0x4002, 0xb0b4, 0x412c, 0x4589, 0xa77d, 0xb020, 0xbaff, 0xa2d3, 0x4344, 0xb205, 0x46b8, 0x1801, 0x1ee2, 0x4131, 0x43ef, 0x408a, 0x1107, 0x4168, 0xbf41, 0xb20c, 0x432c, 0x2c41, 0x3ee4, 0xa926, 0x40aa, 0xb0b8, 0x3a6f, 0x469a, 0x4379, 0xbf7c, 0x1f14, 0xb2c5, 0xb2bb, 0x1c36, 0xb265, 0xba1d, 0x41af, 0x374d, 0xb28e, 0x42b4, 0xbae7, 0x4258, 0x40f9, 0xa16f, 0xae72, 0x1f30, 0xbad1, 0x1e7c, 0x4319, 0xbfd9, 0xbae6, 0xb0d2, 0xb28f, 0xb29e, 0xb03f, 0x41eb, 0x416e, 0x4095, 0x3136, 0xa0cf, 0x1dd8, 0x40e6, 0x06b2, 0xb2a3, 0x0458, 0xb036, 0x435d, 0x43f2, 0x43b0, 0x315c, 0xba07, 0xb0ba, 0x439a, 0xb21d, 0x1079, 0xba14, 0xbf22, 0x433f, 0x40cd, 0xbfe0, 0xa72f, 0xbac2, 0x4134, 0xb0ed, 0xbfda, 0xb2d7, 0x41e2, 0xba61, 0x1b57, 0x406a, 0x4217, 0x4064, 0xba66, 0x3ffd, 0x41b3, 0x343a, 0xb233, 0xbfd3, 0x4111, 0x4213, 0x4093, 0x40c3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x6a1fb324, 0x37d1732c, 0x1194c5d3, 0x5a48240b, 0xf3985d54, 0xf7ed5c2f, 0xf3b4ec29, 0x13619425, 0x3b477912, 0x36e07690, 0x5d185c63, 0x32e603e4, 0xdff550bc, 0xbcb83fd1, 0x00000000, 0x300001f0 }, - FinalRegs = new uint[] { 0x1a1c0000, 0x00000e0d, 0xffff8d0e, 0x00000000, 0x0000003a, 0xffff8d0e, 0x00000000, 0x000071f5, 0x00001419, 0x868c5020, 0xffffffff, 0x32e603e4, 0xdff550bc, 0x000217f8, 0x00000000, 0x400001d0 }, + Instructions = [0x4166, 0xba66, 0x4108, 0x43d1, 0x2c5e, 0xb2fb, 0x4067, 0xafc6, 0x1915, 0x25ef, 0xaadd, 0xb016, 0xbac4, 0xba6e, 0x4415, 0x455e, 0xba35, 0xbf09, 0x4108, 0x0586, 0x42f9, 0x41e2, 0x15df, 0x279d, 0x18cb, 0x3d65, 0x40cd, 0xb0fe, 0x430b, 0xb006, 0x40a5, 0xb21d, 0x409f, 0xa0e2, 0xbf8f, 0x4328, 0x4444, 0xbf70, 0xb2be, 0x40b1, 0xb294, 0x4068, 0x414b, 0x13ae, 0x41e2, 0xb21d, 0x43ce, 0xba3d, 0xb26b, 0x1830, 0xb2b0, 0x440c, 0x29fa, 0x4290, 0xba40, 0x37eb, 0x43db, 0x422c, 0x4337, 0x30cc, 0x41cc, 0x4309, 0xb2f7, 0x401d, 0xbf1a, 0x4322, 0x43b8, 0x41b3, 0x33c5, 0x29e3, 0x0c91, 0x4240, 0x419f, 0xbf31, 0x4059, 0x407f, 0xa4cc, 0x179f, 0x42a2, 0xb28b, 0x413f, 0x40b7, 0xb276, 0x42f8, 0x416c, 0xba03, 0x287a, 0xbfa0, 0x3811, 0x4374, 0x44fd, 0x4147, 0x1d8b, 0x2828, 0x13cb, 0x4166, 0x45e0, 0xb206, 0x184e, 0x414d, 0xbfb9, 0xba1c, 0x40c7, 0x41fb, 0x41f5, 0x433c, 0x400e, 0x42da, 0x43a5, 0x1c04, 0x4202, 0x1c75, 0xb20a, 0x41d0, 0x405a, 0xba78, 0x3bb3, 0xbf19, 0xba6a, 0xb223, 0x35a6, 0x40a4, 0x0707, 0xbf61, 0xb2ac, 0x443e, 0x408c, 0x421c, 0x4128, 0x1975, 0xa7e9, 0x09d5, 0x1ffb, 0xb25d, 0x448a, 0x41e9, 0xaf03, 0x1ea5, 0x40bd, 0xb25f, 0x13f0, 0x4639, 0xba67, 0x404e, 0x1701, 0x423f, 0x3cf4, 0x1f10, 0x431e, 0xbfb6, 0xba7c, 0xb2b0, 0x1f0e, 0xba3e, 0x37c8, 0xba46, 0xba74, 0xba30, 0x41b1, 0x4291, 0x40ad, 0xb0ae, 0x4268, 0xb0a1, 0xba4e, 0x0d33, 0x3511, 0x03b1, 0x4383, 0xbf2e, 0x1a28, 0x43ce, 0x0d7a, 0x40e1, 0x4078, 0x13ce, 0xba1b, 0xb0fe, 0x2b59, 0x402c, 0xbfb6, 0xb288, 0xb25a, 0x41ee, 0x4343, 0x1c53, 0xb21d, 0x41af, 0xb2b4, 0x423d, 0xad88, 0x43cd, 0x4382, 0x40fd, 0x1376, 0x3a63, 0x4162, 0x4091, 0xb2fc, 0x43f8, 0x4247, 0x43b5, 0x4622, 0x41da, 0x1e63, 0x40e3, 0x435f, 0x4630, 0xbfd1, 0x19a2, 0x4237, 0x433c, 0x42eb, 0x3f17, 0xbf6a, 0xbacb, 0x4340, 0xb236, 0xbace, 0x43a4, 0xb20b, 0x1f3a, 0x393d, 0x42a8, 0x22da, 0x1b3d, 0x1884, 0x33e2, 0xa02b, 0xb087, 0x2942, 0xb038, 0xbad6, 0x4055, 0x418a, 0x4373, 0x411b, 0x4382, 0x4041, 0x41cf, 0x42fe, 0xbf79, 0x43bf, 0x1c07, 0xbac0, 0xb263, 0xba01, 0x429b, 0x0774, 0xb011, 0x4135, 0x42b9, 0xbf72, 0x4466, 0xbf60, 0x422b, 0x3aea, 0xbf1f, 0x1986, 0xb2f1, 0xa844, 0x41f7, 0xb029, 0x4319, 0x3b38, 0x4017, 0xbf34, 0x1bd1, 0xbfc0, 0x4014, 0x4304, 0xb2e2, 0x1824, 0xb28b, 0x430b, 0xa850, 0x2fdd, 0x1eb3, 0x46f2, 0x1974, 0x428c, 0x43c9, 0x42f1, 0xbf6a, 0x1d2a, 0x1f8c, 0x41ef, 0x440e, 0x4440, 0x40e9, 0x43a1, 0xaa22, 0x15b9, 0xbf25, 0xb2b8, 0x43f6, 0x40a6, 0x42f1, 0xb28a, 0xb23f, 0x4350, 0x418d, 0x42ea, 0xae84, 0xb062, 0xb297, 0x405c, 0x4132, 0x1943, 0x43da, 0xb012, 0x1d91, 0x3514, 0xbf6a, 0x4202, 0x00f2, 0x4243, 0xafb2, 0x414f, 0xbf11, 0x42aa, 0x40bd, 0x416f, 0x4196, 0xb061, 0x4119, 0x1225, 0x439e, 0x0de1, 0x2cc9, 0x1cdd, 0x3081, 0x431b, 0xb21e, 0x1e40, 0x3105, 0xbf98, 0xb0b5, 0xba65, 0xb2e7, 0x42d3, 0x0bab, 0x1fc2, 0xb0ca, 0x436f, 0xb296, 0x330d, 0x4078, 0xb25d, 0x4285, 0x3335, 0x2608, 0x34e2, 0x411d, 0x38b9, 0x1ab8, 0x023f, 0x10e9, 0x095b, 0x41d9, 0xbf60, 0xbf61, 0x4363, 0x1d56, 0x4658, 0x43f8, 0x41ac, 0x3b35, 0x4203, 0x204d, 0xbfb0, 0x4609, 0x413a, 0x4029, 0xba79, 0xba33, 0x456d, 0xb278, 0xa065, 0x40d8, 0x1c95, 0xb0ee, 0xb20f, 0xbf82, 0x404e, 0x4102, 0x4005, 0xafb3, 0x43ae, 0x1adb, 0x1ef9, 0x04e7, 0xb2b1, 0xbf90, 0x3eae, 0x44d4, 0x10e7, 0xbfaf, 0x42b4, 0x41b9, 0x4661, 0xb0ba, 0xbaf0, 0x4310, 0xba07, 0xadfc, 0x370b, 0x4078, 0xa86c, 0x43bf, 0x46a9, 0xb2c3, 0x438a, 0x0e58, 0x2d29, 0xb2c2, 0x0d85, 0x2025, 0x43be, 0xbf95, 0x43e2, 0x0190, 0xb03b, 0x43af, 0xba48, 0xbf60, 0x280a, 0x45c0, 0xb225, 0xbac3, 0x4171, 0x4286, 0x27a7, 0x4084, 0x1b18, 0x3e85, 0x1d9e, 0x222f, 0x2477, 0x1cd9, 0xba7e, 0xbfd1, 0x0c6e, 0x419b, 0xb284, 0x466c, 0x4076, 0x427f, 0x4657, 0x415f, 0x1d87, 0x0221, 0x346e, 0x4217, 0xbadb, 0x41f4, 0x41e9, 0xbac1, 0x42b2, 0x4177, 0x4118, 0x4128, 0x3828, 0x04a2, 0xbac4, 0xba30, 0xb0f2, 0xbf8a, 0xa678, 0x18bf, 0xb0ad, 0x40dd, 0x416e, 0x43d7, 0x44b9, 0xa0fd, 0x434b, 0xb097, 0x1f28, 0x4320, 0xb00e, 0x4377, 0x1187, 0xba24, 0x4160, 0xb027, 0xb20e, 0x43aa, 0x43cf, 0xbfd4, 0x39e1, 0x1d32, 0x40f2, 0x404a, 0xba4f, 0x00ca, 0xbaee, 0x426d, 0xb2f1, 0x16fd, 0x3012, 0x415e, 0x412c, 0x4221, 0xbf62, 0x1eaf, 0xab08, 0x40b8, 0x0851, 0x3a0d, 0x0010, 0xa39c, 0x0bbb, 0x438e, 0x115e, 0x2965, 0x43c4, 0x448a, 0x447b, 0x4389, 0x42a7, 0xba70, 0x46a5, 0x437f, 0x1a53, 0xb2d0, 0xb2b4, 0x417a, 0xb20f, 0x3ddf, 0x4213, 0xbf03, 0x419b, 0xb229, 0x1cc5, 0x42d9, 0x4307, 0xb0b0, 0x424e, 0xb0c5, 0x2b34, 0x430e, 0x42a2, 0x409c, 0x41eb, 0x4143, 0x4092, 0xbfab, 0x419d, 0x4370, 0x173a, 0xbac9, 0x44ba, 0xba24, 0x4292, 0xbf83, 0x10f4, 0x1352, 0x435f, 0x430a, 0x4113, 0x4556, 0xba04, 0x43b0, 0x43cc, 0x3369, 0xb0c6, 0x43ca, 0x42e2, 0xbf43, 0xb04a, 0xb0cf, 0xb2c0, 0xbff0, 0x436f, 0x40e7, 0xbf72, 0x1cda, 0xba12, 0xb2b6, 0x1294, 0xb083, 0x44f3, 0xbf4a, 0x4379, 0x4206, 0x4168, 0x18aa, 0x43b3, 0xb2d4, 0x442d, 0x4363, 0x4219, 0x3fba, 0xb2f9, 0x4226, 0xbff0, 0xb050, 0x1882, 0x4143, 0x4602, 0x3889, 0x19a3, 0xbf35, 0x4110, 0x429e, 0xb2dd, 0x4087, 0xba4b, 0x4303, 0x415b, 0xb031, 0xb003, 0x4062, 0x1aa9, 0x4066, 0x1ca6, 0xbf80, 0x1970, 0x0840, 0xa6a7, 0xaf8d, 0x40ea, 0x2ad2, 0xb2b7, 0x41aa, 0xbae6, 0x393e, 0x4264, 0x40ae, 0xbaf7, 0xbf6d, 0xb244, 0xba21, 0xba7b, 0x23d2, 0x400a, 0x4059, 0xba4d, 0x1505, 0x1d64, 0x42b9, 0x4197, 0x41f8, 0x4437, 0x41ac, 0x0a56, 0x1d3d, 0x4555, 0xbf8f, 0x4319, 0xbade, 0xba6e, 0x03a1, 0xb2b4, 0x40ac, 0xa7c5, 0xbf14, 0xac04, 0x221e, 0x4246, 0xb2d9, 0x4020, 0xba06, 0xbff0, 0x40d0, 0x2539, 0xba4f, 0x4283, 0x43b5, 0x42f1, 0x43a9, 0xb215, 0xba78, 0x4353, 0xb2ad, 0x0eb2, 0x40b9, 0x05f6, 0x1b03, 0x037a, 0x1922, 0x1d2d, 0x4218, 0xbf42, 0x2674, 0x44fd, 0x41e2, 0xba4d, 0x43f9, 0x10d1, 0x4121, 0x4309, 0xb25a, 0xba68, 0xb2d2, 0x402c, 0x27fb, 0x4143, 0xba48, 0xbfc6, 0x42cd, 0x438f, 0xb23a, 0x253a, 0x19ff, 0x40ed, 0x429a, 0x03f5, 0x412e, 0xba52, 0x43e5, 0xb2bf, 0x1bae, 0x43a5, 0x4389, 0x4253, 0x1bc9, 0xbf8c, 0xb20d, 0xb2be, 0x43ea, 0xa6fd, 0x3b1d, 0x40ad, 0x43d6, 0x43fd, 0x448a, 0x17ff, 0x430b, 0x41e0, 0xba42, 0xbf57, 0xaf35, 0x423c, 0x40b0, 0x43f4, 0xb245, 0x1a09, 0x04e0, 0x398e, 0x4049, 0x4389, 0x43b2, 0xbf00, 0xb0b9, 0x1f41, 0x41a5, 0x4143, 0x403e, 0xa712, 0xab59, 0xbac2, 0x422b, 0x21e4, 0xbfdd, 0xb273, 0x2b57, 0xa6e7, 0xa357, 0xa329, 0x427e, 0xb29d, 0x0b10, 0xbae1, 0xa29b, 0x2e57, 0x41dd, 0x43b3, 0xb2ff, 0xb201, 0xa480, 0x111a, 0x434f, 0x3828, 0x0c1e, 0x40bd, 0x1ddc, 0x4120, 0xbf90, 0x1f65, 0x4387, 0x4307, 0x4235, 0xbf87, 0xbff0, 0x41c6, 0x36e9, 0x4120, 0x40ca, 0x4383, 0xb211, 0x41f5, 0x4309, 0xbfd5, 0x4332, 0xb23a, 0x4227, 0x4358, 0x2229, 0x41a0, 0xb09b, 0x4162, 0x00af, 0x4017, 0xb270, 0xbf60, 0x4289, 0xba44, 0x415f, 0x3745, 0x1d25, 0xb24f, 0x415b, 0x1dde, 0x41d5, 0x421d, 0x4061, 0xb23d, 0xb0e1, 0xb231, 0xbfce, 0x4479, 0x18ae, 0x429b, 0x3aa6, 0xb031, 0xbf08, 0x4173, 0x4025, 0xbf01, 0xbf80, 0x429a, 0xa140, 0x4241, 0x4004, 0xbaf0, 0x1950, 0xbf00, 0x4069, 0xbf90, 0x42f8, 0x4149, 0x4352, 0x40ee, 0x1a2e, 0x1888, 0x2be6, 0xa75e, 0xb040, 0x42ed, 0x4158, 0xbf7a, 0x45aa, 0x0e95, 0x1014, 0x0d0c, 0x22e9, 0x1dc7, 0xbfa0, 0xb092, 0xbfb0, 0x41c7, 0x0377, 0xb2c9, 0x4260, 0x4371, 0x1ba6, 0x4273, 0x426c, 0x1a58, 0x1e6b, 0x0f52, 0x1c50, 0x3528, 0x4157, 0x4296, 0xbf43, 0x345e, 0x40f5, 0x429c, 0x42bc, 0x4312, 0xa05d, 0x1ea4, 0x40e2, 0xbf92, 0x38a7, 0x43b2, 0xbfb0, 0x1d58, 0xba54, 0xb256, 0xb255, 0x442e, 0x4293, 0xba67, 0x1804, 0xb27c, 0x425a, 0x4173, 0xba62, 0x4221, 0x41c7, 0x3475, 0xbfb8, 0x4002, 0xb0b4, 0x412c, 0x4589, 0xa77d, 0xb020, 0xbaff, 0xa2d3, 0x4344, 0xb205, 0x46b8, 0x1801, 0x1ee2, 0x4131, 0x43ef, 0x408a, 0x1107, 0x4168, 0xbf41, 0xb20c, 0x432c, 0x2c41, 0x3ee4, 0xa926, 0x40aa, 0xb0b8, 0x3a6f, 0x469a, 0x4379, 0xbf7c, 0x1f14, 0xb2c5, 0xb2bb, 0x1c36, 0xb265, 0xba1d, 0x41af, 0x374d, 0xb28e, 0x42b4, 0xbae7, 0x4258, 0x40f9, 0xa16f, 0xae72, 0x1f30, 0xbad1, 0x1e7c, 0x4319, 0xbfd9, 0xbae6, 0xb0d2, 0xb28f, 0xb29e, 0xb03f, 0x41eb, 0x416e, 0x4095, 0x3136, 0xa0cf, 0x1dd8, 0x40e6, 0x06b2, 0xb2a3, 0x0458, 0xb036, 0x435d, 0x43f2, 0x43b0, 0x315c, 0xba07, 0xb0ba, 0x439a, 0xb21d, 0x1079, 0xba14, 0xbf22, 0x433f, 0x40cd, 0xbfe0, 0xa72f, 0xbac2, 0x4134, 0xb0ed, 0xbfda, 0xb2d7, 0x41e2, 0xba61, 0x1b57, 0x406a, 0x4217, 0x4064, 0xba66, 0x3ffd, 0x41b3, 0x343a, 0xb233, 0xbfd3, 0x4111, 0x4213, 0x4093, 0x40c3, 0x4770, 0xe7fe + ], + StartRegs = [0x6a1fb324, 0x37d1732c, 0x1194c5d3, 0x5a48240b, 0xf3985d54, 0xf7ed5c2f, 0xf3b4ec29, 0x13619425, 0x3b477912, 0x36e07690, 0x5d185c63, 0x32e603e4, 0xdff550bc, 0xbcb83fd1, 0x00000000, 0x300001f0 + ], + FinalRegs = [0x1a1c0000, 0x00000e0d, 0xffff8d0e, 0x00000000, 0x0000003a, 0xffff8d0e, 0x00000000, 0x000071f5, 0x00001419, 0x868c5020, 0xffffffff, 0x32e603e4, 0xdff550bc, 0x000217f8, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0xb2dc, 0x425f, 0xb2d1, 0xb20b, 0x1b94, 0xbf39, 0x1983, 0x4350, 0x426e, 0x43a5, 0x4377, 0x1ee2, 0x1e44, 0x1b2d, 0x1ad2, 0x1cc0, 0x402d, 0xb2f6, 0x02f0, 0x3eb0, 0x4037, 0x0a3e, 0x418c, 0xbf8a, 0x405e, 0xa376, 0xb075, 0x420d, 0xb2b6, 0xb022, 0x440a, 0xb0cc, 0x46a9, 0x40e7, 0x21fc, 0xb27b, 0x437c, 0xa9bc, 0x1c9d, 0x42bd, 0x4197, 0xbf9f, 0x441e, 0xba11, 0x424e, 0xbff0, 0x41cb, 0xb21c, 0x428b, 0x1a18, 0x4007, 0x1795, 0x2000, 0x4006, 0x43b6, 0xbf3b, 0x42ec, 0x422d, 0x2e16, 0x29b0, 0x1bee, 0x407d, 0xb02d, 0x4075, 0xbf64, 0x407e, 0x4547, 0x4159, 0xb0eb, 0xb21d, 0x41f2, 0x09e7, 0x410d, 0x462b, 0x4583, 0xb2f8, 0x409e, 0x40a4, 0xbfd0, 0xb051, 0x4029, 0x3874, 0x4642, 0xbfba, 0x40d1, 0xb217, 0xb083, 0x2a1f, 0x4263, 0x468a, 0x322b, 0xba31, 0x0de5, 0x4091, 0xb243, 0xb296, 0x4259, 0xac7d, 0x2a5a, 0x4010, 0xbf98, 0x4116, 0x4166, 0x19d7, 0xba43, 0x0e2e, 0xbff0, 0x430f, 0x439b, 0xa2f3, 0x1914, 0x3b48, 0x18d2, 0x4065, 0xb07d, 0xb02c, 0xb2a7, 0xb2c8, 0x03b0, 0xa9b3, 0x45de, 0xbf00, 0xb27c, 0x4347, 0x1fc8, 0x40cc, 0x4095, 0xbf74, 0x2dfe, 0x4223, 0x42f8, 0x3a83, 0x1b47, 0x1be1, 0x1281, 0x42da, 0x03dc, 0x40f1, 0xb2c1, 0x4648, 0x44b0, 0xba72, 0xba36, 0x0d2d, 0x4001, 0xbf9b, 0x1890, 0x45d4, 0x42b6, 0x40f9, 0x420a, 0x410e, 0xaa69, 0xb263, 0xbf77, 0x00be, 0x4092, 0x40e7, 0xb2b1, 0x435a, 0x42b4, 0xb09f, 0x420d, 0xb06a, 0xba63, 0x4272, 0x42d0, 0x32b7, 0x43ce, 0x1af8, 0xb06d, 0x430c, 0x404c, 0x097a, 0xb2c9, 0xbf3c, 0x2533, 0xbadd, 0x46b0, 0x441f, 0xb0f8, 0x4384, 0x45da, 0x42fb, 0x4380, 0xbac6, 0x35c4, 0x1564, 0x0e66, 0xbfe0, 0x3645, 0xba64, 0x4229, 0xa6c0, 0xbf14, 0xb07b, 0x40fe, 0x4353, 0x1856, 0xa5a8, 0x1bb5, 0xaa8b, 0x40bf, 0xabf0, 0x4389, 0xbac0, 0xba7b, 0x43e4, 0x1ee2, 0x42ce, 0xbf0e, 0x46a0, 0x4279, 0x45ae, 0x4096, 0x0e54, 0x4106, 0xb25d, 0x40ec, 0x3483, 0x4090, 0x42cf, 0x1a7a, 0x406b, 0xb02c, 0x43b1, 0x4029, 0x2399, 0x19ce, 0xb233, 0x4303, 0xbfd0, 0x2c0c, 0x43d7, 0xb254, 0x27fa, 0x2ea7, 0x0a4b, 0x40b1, 0xbfc4, 0x1b4d, 0x420e, 0xb2b7, 0xb234, 0x4210, 0x43f8, 0x466b, 0x4134, 0xb2f1, 0x1f53, 0xb06b, 0x40a2, 0xb0f1, 0x40ea, 0xb0f5, 0x421d, 0x42df, 0x28d3, 0xba66, 0x42fc, 0xbfd5, 0xbfe0, 0xbfa0, 0xba2f, 0x45c1, 0xbae4, 0xb290, 0x4030, 0x436c, 0x466e, 0x44d9, 0xba3a, 0xba5f, 0xa987, 0x247e, 0x1273, 0x1925, 0xb240, 0xa2a8, 0x1d6a, 0xbf94, 0x42e4, 0x43e1, 0x42ff, 0xbf49, 0x454d, 0x442d, 0xb26b, 0xb054, 0x41d3, 0x402d, 0x40b2, 0x43e0, 0xbf2e, 0x0098, 0x4047, 0xb2af, 0x42e4, 0x4315, 0x41c2, 0xab7f, 0xb279, 0xb253, 0x4101, 0xb2fe, 0xa41d, 0xb2f0, 0x4357, 0x1b5e, 0x3f79, 0xb26e, 0x41bd, 0xbf69, 0x1813, 0x0a71, 0x0efc, 0x4215, 0x16f2, 0x4108, 0x4191, 0xbf2a, 0xb2a0, 0x1c23, 0xaeff, 0x21f2, 0x2a43, 0xbad6, 0xac3a, 0x43ee, 0x4226, 0xbf42, 0x412a, 0x04ce, 0x3044, 0x42fd, 0x430f, 0x3e1c, 0x4063, 0xbfac, 0x3557, 0x4258, 0x06d8, 0x4250, 0x43fa, 0xbaf8, 0x40e1, 0x11e8, 0x4000, 0x40ff, 0x1adf, 0x4693, 0x4257, 0x46d0, 0xbfba, 0xb2b9, 0xb23d, 0xba49, 0x4266, 0x4210, 0xa557, 0x1df4, 0xba45, 0x454c, 0xa556, 0x434e, 0x1a7a, 0x4380, 0xb09a, 0x4087, 0x1937, 0xb20f, 0x4067, 0xbfd3, 0x42b7, 0xb227, 0x41f9, 0xbaee, 0x4191, 0x4011, 0x2bf8, 0x41c0, 0x4599, 0x428a, 0x40ba, 0x1e9f, 0x12b1, 0x2cdc, 0xb285, 0xaa95, 0xbfbe, 0x4022, 0x466c, 0xba77, 0xb041, 0x42bc, 0x4016, 0x434b, 0x41c6, 0xba0a, 0x416d, 0x3ddc, 0xba28, 0x40f3, 0x3d50, 0x41fb, 0x437d, 0x42e3, 0x4343, 0x143b, 0xbf4b, 0x1a96, 0x43cd, 0x05a6, 0x41bf, 0x413e, 0x1de5, 0xb0c7, 0x436d, 0xbac4, 0x43cf, 0x42e9, 0x4294, 0x07b5, 0xa1ea, 0x4577, 0xbae6, 0x4387, 0x42eb, 0x2ba4, 0x4117, 0x4229, 0x4171, 0xb0b0, 0xbade, 0x4226, 0x43a4, 0xa8c8, 0x4213, 0xbf00, 0xbf88, 0xb07b, 0x4229, 0x322d, 0x2ed2, 0x42d6, 0x2426, 0x427b, 0xbf28, 0x039a, 0x4377, 0x1baf, 0x2d7d, 0x42fd, 0x4699, 0x4004, 0x4166, 0x4164, 0x0761, 0xb0da, 0xb2c5, 0x4178, 0x19b8, 0x42a1, 0xbfb9, 0x4299, 0x4192, 0x40f5, 0x42d0, 0xbf7f, 0x4353, 0x40d7, 0x4261, 0x09af, 0x1c71, 0x4492, 0x421b, 0xba64, 0x41a2, 0x4391, 0xbfe0, 0x18ad, 0x4114, 0x42ba, 0xbafa, 0xb0e0, 0xbf12, 0x3c22, 0x13d3, 0xb270, 0x1297, 0x4256, 0x4227, 0x4148, 0xbfa1, 0xbf80, 0x1863, 0x075c, 0xa63a, 0x192a, 0xb285, 0x415f, 0x371f, 0x36d4, 0x41f9, 0xb09f, 0x4246, 0xb2f3, 0xb000, 0x420d, 0x4315, 0xb2b3, 0x0bc4, 0x2021, 0x0dda, 0xb0c5, 0xbf7a, 0x432f, 0xa889, 0x4112, 0x42ea, 0x4310, 0xbf3e, 0xa3e2, 0x4291, 0x1be6, 0x43bd, 0x40b7, 0x205f, 0x4014, 0x31dc, 0xa38c, 0x4117, 0x4230, 0x4381, 0xbf66, 0x4002, 0x41df, 0x42f0, 0xbaf0, 0x4171, 0xba79, 0x1339, 0x45cb, 0x409d, 0xbf18, 0x4163, 0xb07c, 0x4172, 0x40c2, 0x2cb7, 0x4309, 0x4068, 0x1788, 0xba35, 0x42b2, 0x43a5, 0x43c5, 0x442f, 0xba0c, 0x014d, 0x432c, 0xb2d3, 0x3076, 0x4274, 0xb283, 0xa8fe, 0x1c15, 0x46d1, 0xb075, 0xbf1e, 0x42b9, 0x31df, 0xba3b, 0x414e, 0xbae5, 0xa161, 0xb2c0, 0x436c, 0xbf9c, 0x43c1, 0xbadb, 0x18b0, 0xbfe2, 0xaf82, 0x39f6, 0x41b3, 0x2696, 0x38ad, 0x42b5, 0xb043, 0x43dd, 0x40ca, 0x42f0, 0xba54, 0x4369, 0x0412, 0x4349, 0x438f, 0x4555, 0x4022, 0x412f, 0x41f4, 0x4139, 0xa343, 0x41c4, 0xba2c, 0xad94, 0xbfb4, 0x0d58, 0x3a42, 0x43a9, 0x41fb, 0xbaf7, 0x463c, 0x0151, 0x44e8, 0x43bf, 0x42b2, 0x42e1, 0x0479, 0x1801, 0xba2e, 0x1614, 0x41fe, 0x4204, 0xbad0, 0x18ad, 0x4056, 0xb0e2, 0xb2a8, 0x06e3, 0xb260, 0xbf3f, 0xba59, 0x4620, 0xba29, 0x3348, 0x45c4, 0xbaef, 0xb293, 0xbadb, 0x40d2, 0x4374, 0xba7f, 0x35fa, 0x1b6c, 0xb23b, 0x2a15, 0x1ed7, 0xa687, 0xa2c0, 0x01fc, 0xa940, 0xba6e, 0x459a, 0x4044, 0x437d, 0xb2ab, 0x3190, 0x2415, 0x2092, 0xbf87, 0x427d, 0xb271, 0x2f34, 0x21c7, 0x404d, 0xb08a, 0x1ce7, 0x30cd, 0x433c, 0x45ab, 0xb234, 0x438d, 0x3eae, 0x4062, 0xb224, 0x3c04, 0xb2ce, 0xb23a, 0x17a3, 0xbfbc, 0x1af8, 0x430c, 0x4264, 0x43d9, 0xb2b5, 0x40dc, 0xbad1, 0x1ad9, 0x41d7, 0x40b1, 0xb0e2, 0x43b9, 0x41ca, 0x352f, 0xbf70, 0x33cb, 0xac4b, 0xba11, 0xb0d1, 0x42c3, 0xbf0e, 0xb277, 0x1c5f, 0xb2f3, 0x4278, 0x4005, 0x40d3, 0xa013, 0x441a, 0x44b4, 0x089a, 0xad41, 0x1c00, 0xb238, 0x46a9, 0x40a7, 0xba4e, 0x43ab, 0x2692, 0x1f89, 0xb021, 0x41a7, 0xbfa2, 0x106c, 0x4213, 0xb251, 0x423c, 0x43fd, 0x423d, 0x406b, 0x40b7, 0x1cc0, 0xacca, 0x433f, 0x3dda, 0xba4a, 0x3137, 0x2707, 0x4167, 0x4016, 0xbf45, 0x40d7, 0xba6a, 0x403b, 0xae6b, 0x42ae, 0x4351, 0xb0bf, 0x420c, 0x2052, 0xb037, 0x1b19, 0x43cf, 0x42aa, 0x40cd, 0x4329, 0x0139, 0xbf32, 0x2fda, 0x1320, 0x256b, 0x421c, 0x41e4, 0x4080, 0x40b8, 0x07be, 0x3f93, 0x4270, 0xb2d8, 0x4295, 0x41ba, 0xb013, 0x440f, 0x4157, 0x42b1, 0x40f4, 0xb0f6, 0x1b7d, 0x408b, 0xbfe0, 0xba53, 0x433a, 0x464f, 0xbf25, 0x406e, 0xae0f, 0x1c12, 0xb230, 0xbacf, 0xbacb, 0x1fe3, 0xbf90, 0x4602, 0xbf82, 0xba73, 0x4481, 0x23b5, 0x4394, 0x4320, 0xbad1, 0x1aec, 0x27c6, 0x41bd, 0x4157, 0x1de8, 0xbfe0, 0x435e, 0x41de, 0x25df, 0x01fe, 0x40d6, 0x467f, 0xb081, 0xb0b2, 0x3885, 0x192d, 0x2974, 0x31f9, 0x458d, 0x2fc1, 0xb048, 0xbf18, 0x10c7, 0x4272, 0xb25a, 0x4198, 0xb221, 0x400f, 0xa6c2, 0x42d2, 0x1b23, 0x417b, 0x4456, 0x4465, 0x1fdf, 0x1c70, 0x4068, 0xb2d8, 0x4582, 0xb279, 0x40b9, 0xba17, 0x4243, 0x4060, 0x1936, 0xbf0f, 0xa1bc, 0xb0fa, 0x439d, 0x41e8, 0x39be, 0xb2e1, 0x4430, 0x40ff, 0x1a28, 0x42de, 0x1e90, 0x417e, 0x03bc, 0x4240, 0x435c, 0xbad7, 0x1de9, 0xa31a, 0x1135, 0x4198, 0x441f, 0x4276, 0xbf70, 0x1d98, 0xbfa4, 0x418f, 0xba2f, 0x41f1, 0x4182, 0x41e0, 0x425b, 0xb269, 0x1ff1, 0x4330, 0xb29e, 0x2039, 0x41b9, 0xa5d6, 0x42bb, 0xb2dd, 0x4025, 0x2734, 0x469b, 0x4368, 0x1c15, 0x41c3, 0xbfb1, 0x0bef, 0x4469, 0xb214, 0x3073, 0x423d, 0x1ecf, 0x437f, 0x41e6, 0xac31, 0xbf6d, 0x18aa, 0x4641, 0x2805, 0x43e1, 0xa531, 0x42a7, 0xb246, 0x1f48, 0x42a0, 0x1e10, 0x4263, 0x43eb, 0xb090, 0x4020, 0xa807, 0x4149, 0x42b1, 0xb291, 0xbf90, 0x2fbf, 0x1edd, 0x3d40, 0x433f, 0x3eb8, 0xbf5f, 0xb212, 0x4151, 0x43b7, 0x4415, 0x03b7, 0x40cb, 0xba3f, 0x438d, 0x41fd, 0x0518, 0x42cf, 0xa79a, 0xa354, 0x2ac3, 0xb25a, 0x4145, 0xa5e8, 0x400e, 0x1851, 0xbf87, 0x1c05, 0x4377, 0x405d, 0xba00, 0xb2d5, 0x4232, 0x319c, 0x4409, 0x1f3d, 0x41e6, 0x4069, 0xbfb4, 0x41d9, 0x18d0, 0x4307, 0x4567, 0x433e, 0x421c, 0x429c, 0x055c, 0x41ab, 0x40b1, 0x40f1, 0x353d, 0xaae0, 0x4237, 0xaadc, 0x23f3, 0xb0b0, 0xbf47, 0x401a, 0xaeea, 0x4077, 0xa7bd, 0x4209, 0x41a4, 0x46eb, 0x437f, 0x4226, 0xb2e2, 0xb04a, 0x4233, 0x4387, 0xbfc8, 0x46dc, 0x4381, 0xbada, 0x0d3d, 0x44cb, 0x405c, 0x4544, 0x438e, 0x419a, 0x40f9, 0x442a, 0xb000, 0xb2da, 0x1aa8, 0x1e51, 0x1dd4, 0x1319, 0xba33, 0x4176, 0x40eb, 0xbff0, 0xbf62, 0x42d7, 0x40e7, 0x413e, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xec5af9f4, 0x9436eb06, 0x9ba4ad42, 0x6f255f58, 0x3f12d10f, 0x0928b6c9, 0x415b7bf8, 0x054f2f3e, 0x41a3cd86, 0x6af229e8, 0xc9f61355, 0xeb58ff68, 0x0c0e2ab2, 0xe150fa69, 0x00000000, 0xe00001f0 }, - FinalRegs = new uint[] { 0xffffff39, 0x00000000, 0x000000f3, 0x00000000, 0x000000fa, 0x0000002c, 0x2eb370e8, 0x02c5a110, 0xe151009d, 0xe150fdb5, 0xffffffff, 0xc2a1f61a, 0xe150f865, 0xe150f98d, 0x00000000, 0x400001d0 }, + Instructions = [0xb2dc, 0x425f, 0xb2d1, 0xb20b, 0x1b94, 0xbf39, 0x1983, 0x4350, 0x426e, 0x43a5, 0x4377, 0x1ee2, 0x1e44, 0x1b2d, 0x1ad2, 0x1cc0, 0x402d, 0xb2f6, 0x02f0, 0x3eb0, 0x4037, 0x0a3e, 0x418c, 0xbf8a, 0x405e, 0xa376, 0xb075, 0x420d, 0xb2b6, 0xb022, 0x440a, 0xb0cc, 0x46a9, 0x40e7, 0x21fc, 0xb27b, 0x437c, 0xa9bc, 0x1c9d, 0x42bd, 0x4197, 0xbf9f, 0x441e, 0xba11, 0x424e, 0xbff0, 0x41cb, 0xb21c, 0x428b, 0x1a18, 0x4007, 0x1795, 0x2000, 0x4006, 0x43b6, 0xbf3b, 0x42ec, 0x422d, 0x2e16, 0x29b0, 0x1bee, 0x407d, 0xb02d, 0x4075, 0xbf64, 0x407e, 0x4547, 0x4159, 0xb0eb, 0xb21d, 0x41f2, 0x09e7, 0x410d, 0x462b, 0x4583, 0xb2f8, 0x409e, 0x40a4, 0xbfd0, 0xb051, 0x4029, 0x3874, 0x4642, 0xbfba, 0x40d1, 0xb217, 0xb083, 0x2a1f, 0x4263, 0x468a, 0x322b, 0xba31, 0x0de5, 0x4091, 0xb243, 0xb296, 0x4259, 0xac7d, 0x2a5a, 0x4010, 0xbf98, 0x4116, 0x4166, 0x19d7, 0xba43, 0x0e2e, 0xbff0, 0x430f, 0x439b, 0xa2f3, 0x1914, 0x3b48, 0x18d2, 0x4065, 0xb07d, 0xb02c, 0xb2a7, 0xb2c8, 0x03b0, 0xa9b3, 0x45de, 0xbf00, 0xb27c, 0x4347, 0x1fc8, 0x40cc, 0x4095, 0xbf74, 0x2dfe, 0x4223, 0x42f8, 0x3a83, 0x1b47, 0x1be1, 0x1281, 0x42da, 0x03dc, 0x40f1, 0xb2c1, 0x4648, 0x44b0, 0xba72, 0xba36, 0x0d2d, 0x4001, 0xbf9b, 0x1890, 0x45d4, 0x42b6, 0x40f9, 0x420a, 0x410e, 0xaa69, 0xb263, 0xbf77, 0x00be, 0x4092, 0x40e7, 0xb2b1, 0x435a, 0x42b4, 0xb09f, 0x420d, 0xb06a, 0xba63, 0x4272, 0x42d0, 0x32b7, 0x43ce, 0x1af8, 0xb06d, 0x430c, 0x404c, 0x097a, 0xb2c9, 0xbf3c, 0x2533, 0xbadd, 0x46b0, 0x441f, 0xb0f8, 0x4384, 0x45da, 0x42fb, 0x4380, 0xbac6, 0x35c4, 0x1564, 0x0e66, 0xbfe0, 0x3645, 0xba64, 0x4229, 0xa6c0, 0xbf14, 0xb07b, 0x40fe, 0x4353, 0x1856, 0xa5a8, 0x1bb5, 0xaa8b, 0x40bf, 0xabf0, 0x4389, 0xbac0, 0xba7b, 0x43e4, 0x1ee2, 0x42ce, 0xbf0e, 0x46a0, 0x4279, 0x45ae, 0x4096, 0x0e54, 0x4106, 0xb25d, 0x40ec, 0x3483, 0x4090, 0x42cf, 0x1a7a, 0x406b, 0xb02c, 0x43b1, 0x4029, 0x2399, 0x19ce, 0xb233, 0x4303, 0xbfd0, 0x2c0c, 0x43d7, 0xb254, 0x27fa, 0x2ea7, 0x0a4b, 0x40b1, 0xbfc4, 0x1b4d, 0x420e, 0xb2b7, 0xb234, 0x4210, 0x43f8, 0x466b, 0x4134, 0xb2f1, 0x1f53, 0xb06b, 0x40a2, 0xb0f1, 0x40ea, 0xb0f5, 0x421d, 0x42df, 0x28d3, 0xba66, 0x42fc, 0xbfd5, 0xbfe0, 0xbfa0, 0xba2f, 0x45c1, 0xbae4, 0xb290, 0x4030, 0x436c, 0x466e, 0x44d9, 0xba3a, 0xba5f, 0xa987, 0x247e, 0x1273, 0x1925, 0xb240, 0xa2a8, 0x1d6a, 0xbf94, 0x42e4, 0x43e1, 0x42ff, 0xbf49, 0x454d, 0x442d, 0xb26b, 0xb054, 0x41d3, 0x402d, 0x40b2, 0x43e0, 0xbf2e, 0x0098, 0x4047, 0xb2af, 0x42e4, 0x4315, 0x41c2, 0xab7f, 0xb279, 0xb253, 0x4101, 0xb2fe, 0xa41d, 0xb2f0, 0x4357, 0x1b5e, 0x3f79, 0xb26e, 0x41bd, 0xbf69, 0x1813, 0x0a71, 0x0efc, 0x4215, 0x16f2, 0x4108, 0x4191, 0xbf2a, 0xb2a0, 0x1c23, 0xaeff, 0x21f2, 0x2a43, 0xbad6, 0xac3a, 0x43ee, 0x4226, 0xbf42, 0x412a, 0x04ce, 0x3044, 0x42fd, 0x430f, 0x3e1c, 0x4063, 0xbfac, 0x3557, 0x4258, 0x06d8, 0x4250, 0x43fa, 0xbaf8, 0x40e1, 0x11e8, 0x4000, 0x40ff, 0x1adf, 0x4693, 0x4257, 0x46d0, 0xbfba, 0xb2b9, 0xb23d, 0xba49, 0x4266, 0x4210, 0xa557, 0x1df4, 0xba45, 0x454c, 0xa556, 0x434e, 0x1a7a, 0x4380, 0xb09a, 0x4087, 0x1937, 0xb20f, 0x4067, 0xbfd3, 0x42b7, 0xb227, 0x41f9, 0xbaee, 0x4191, 0x4011, 0x2bf8, 0x41c0, 0x4599, 0x428a, 0x40ba, 0x1e9f, 0x12b1, 0x2cdc, 0xb285, 0xaa95, 0xbfbe, 0x4022, 0x466c, 0xba77, 0xb041, 0x42bc, 0x4016, 0x434b, 0x41c6, 0xba0a, 0x416d, 0x3ddc, 0xba28, 0x40f3, 0x3d50, 0x41fb, 0x437d, 0x42e3, 0x4343, 0x143b, 0xbf4b, 0x1a96, 0x43cd, 0x05a6, 0x41bf, 0x413e, 0x1de5, 0xb0c7, 0x436d, 0xbac4, 0x43cf, 0x42e9, 0x4294, 0x07b5, 0xa1ea, 0x4577, 0xbae6, 0x4387, 0x42eb, 0x2ba4, 0x4117, 0x4229, 0x4171, 0xb0b0, 0xbade, 0x4226, 0x43a4, 0xa8c8, 0x4213, 0xbf00, 0xbf88, 0xb07b, 0x4229, 0x322d, 0x2ed2, 0x42d6, 0x2426, 0x427b, 0xbf28, 0x039a, 0x4377, 0x1baf, 0x2d7d, 0x42fd, 0x4699, 0x4004, 0x4166, 0x4164, 0x0761, 0xb0da, 0xb2c5, 0x4178, 0x19b8, 0x42a1, 0xbfb9, 0x4299, 0x4192, 0x40f5, 0x42d0, 0xbf7f, 0x4353, 0x40d7, 0x4261, 0x09af, 0x1c71, 0x4492, 0x421b, 0xba64, 0x41a2, 0x4391, 0xbfe0, 0x18ad, 0x4114, 0x42ba, 0xbafa, 0xb0e0, 0xbf12, 0x3c22, 0x13d3, 0xb270, 0x1297, 0x4256, 0x4227, 0x4148, 0xbfa1, 0xbf80, 0x1863, 0x075c, 0xa63a, 0x192a, 0xb285, 0x415f, 0x371f, 0x36d4, 0x41f9, 0xb09f, 0x4246, 0xb2f3, 0xb000, 0x420d, 0x4315, 0xb2b3, 0x0bc4, 0x2021, 0x0dda, 0xb0c5, 0xbf7a, 0x432f, 0xa889, 0x4112, 0x42ea, 0x4310, 0xbf3e, 0xa3e2, 0x4291, 0x1be6, 0x43bd, 0x40b7, 0x205f, 0x4014, 0x31dc, 0xa38c, 0x4117, 0x4230, 0x4381, 0xbf66, 0x4002, 0x41df, 0x42f0, 0xbaf0, 0x4171, 0xba79, 0x1339, 0x45cb, 0x409d, 0xbf18, 0x4163, 0xb07c, 0x4172, 0x40c2, 0x2cb7, 0x4309, 0x4068, 0x1788, 0xba35, 0x42b2, 0x43a5, 0x43c5, 0x442f, 0xba0c, 0x014d, 0x432c, 0xb2d3, 0x3076, 0x4274, 0xb283, 0xa8fe, 0x1c15, 0x46d1, 0xb075, 0xbf1e, 0x42b9, 0x31df, 0xba3b, 0x414e, 0xbae5, 0xa161, 0xb2c0, 0x436c, 0xbf9c, 0x43c1, 0xbadb, 0x18b0, 0xbfe2, 0xaf82, 0x39f6, 0x41b3, 0x2696, 0x38ad, 0x42b5, 0xb043, 0x43dd, 0x40ca, 0x42f0, 0xba54, 0x4369, 0x0412, 0x4349, 0x438f, 0x4555, 0x4022, 0x412f, 0x41f4, 0x4139, 0xa343, 0x41c4, 0xba2c, 0xad94, 0xbfb4, 0x0d58, 0x3a42, 0x43a9, 0x41fb, 0xbaf7, 0x463c, 0x0151, 0x44e8, 0x43bf, 0x42b2, 0x42e1, 0x0479, 0x1801, 0xba2e, 0x1614, 0x41fe, 0x4204, 0xbad0, 0x18ad, 0x4056, 0xb0e2, 0xb2a8, 0x06e3, 0xb260, 0xbf3f, 0xba59, 0x4620, 0xba29, 0x3348, 0x45c4, 0xbaef, 0xb293, 0xbadb, 0x40d2, 0x4374, 0xba7f, 0x35fa, 0x1b6c, 0xb23b, 0x2a15, 0x1ed7, 0xa687, 0xa2c0, 0x01fc, 0xa940, 0xba6e, 0x459a, 0x4044, 0x437d, 0xb2ab, 0x3190, 0x2415, 0x2092, 0xbf87, 0x427d, 0xb271, 0x2f34, 0x21c7, 0x404d, 0xb08a, 0x1ce7, 0x30cd, 0x433c, 0x45ab, 0xb234, 0x438d, 0x3eae, 0x4062, 0xb224, 0x3c04, 0xb2ce, 0xb23a, 0x17a3, 0xbfbc, 0x1af8, 0x430c, 0x4264, 0x43d9, 0xb2b5, 0x40dc, 0xbad1, 0x1ad9, 0x41d7, 0x40b1, 0xb0e2, 0x43b9, 0x41ca, 0x352f, 0xbf70, 0x33cb, 0xac4b, 0xba11, 0xb0d1, 0x42c3, 0xbf0e, 0xb277, 0x1c5f, 0xb2f3, 0x4278, 0x4005, 0x40d3, 0xa013, 0x441a, 0x44b4, 0x089a, 0xad41, 0x1c00, 0xb238, 0x46a9, 0x40a7, 0xba4e, 0x43ab, 0x2692, 0x1f89, 0xb021, 0x41a7, 0xbfa2, 0x106c, 0x4213, 0xb251, 0x423c, 0x43fd, 0x423d, 0x406b, 0x40b7, 0x1cc0, 0xacca, 0x433f, 0x3dda, 0xba4a, 0x3137, 0x2707, 0x4167, 0x4016, 0xbf45, 0x40d7, 0xba6a, 0x403b, 0xae6b, 0x42ae, 0x4351, 0xb0bf, 0x420c, 0x2052, 0xb037, 0x1b19, 0x43cf, 0x42aa, 0x40cd, 0x4329, 0x0139, 0xbf32, 0x2fda, 0x1320, 0x256b, 0x421c, 0x41e4, 0x4080, 0x40b8, 0x07be, 0x3f93, 0x4270, 0xb2d8, 0x4295, 0x41ba, 0xb013, 0x440f, 0x4157, 0x42b1, 0x40f4, 0xb0f6, 0x1b7d, 0x408b, 0xbfe0, 0xba53, 0x433a, 0x464f, 0xbf25, 0x406e, 0xae0f, 0x1c12, 0xb230, 0xbacf, 0xbacb, 0x1fe3, 0xbf90, 0x4602, 0xbf82, 0xba73, 0x4481, 0x23b5, 0x4394, 0x4320, 0xbad1, 0x1aec, 0x27c6, 0x41bd, 0x4157, 0x1de8, 0xbfe0, 0x435e, 0x41de, 0x25df, 0x01fe, 0x40d6, 0x467f, 0xb081, 0xb0b2, 0x3885, 0x192d, 0x2974, 0x31f9, 0x458d, 0x2fc1, 0xb048, 0xbf18, 0x10c7, 0x4272, 0xb25a, 0x4198, 0xb221, 0x400f, 0xa6c2, 0x42d2, 0x1b23, 0x417b, 0x4456, 0x4465, 0x1fdf, 0x1c70, 0x4068, 0xb2d8, 0x4582, 0xb279, 0x40b9, 0xba17, 0x4243, 0x4060, 0x1936, 0xbf0f, 0xa1bc, 0xb0fa, 0x439d, 0x41e8, 0x39be, 0xb2e1, 0x4430, 0x40ff, 0x1a28, 0x42de, 0x1e90, 0x417e, 0x03bc, 0x4240, 0x435c, 0xbad7, 0x1de9, 0xa31a, 0x1135, 0x4198, 0x441f, 0x4276, 0xbf70, 0x1d98, 0xbfa4, 0x418f, 0xba2f, 0x41f1, 0x4182, 0x41e0, 0x425b, 0xb269, 0x1ff1, 0x4330, 0xb29e, 0x2039, 0x41b9, 0xa5d6, 0x42bb, 0xb2dd, 0x4025, 0x2734, 0x469b, 0x4368, 0x1c15, 0x41c3, 0xbfb1, 0x0bef, 0x4469, 0xb214, 0x3073, 0x423d, 0x1ecf, 0x437f, 0x41e6, 0xac31, 0xbf6d, 0x18aa, 0x4641, 0x2805, 0x43e1, 0xa531, 0x42a7, 0xb246, 0x1f48, 0x42a0, 0x1e10, 0x4263, 0x43eb, 0xb090, 0x4020, 0xa807, 0x4149, 0x42b1, 0xb291, 0xbf90, 0x2fbf, 0x1edd, 0x3d40, 0x433f, 0x3eb8, 0xbf5f, 0xb212, 0x4151, 0x43b7, 0x4415, 0x03b7, 0x40cb, 0xba3f, 0x438d, 0x41fd, 0x0518, 0x42cf, 0xa79a, 0xa354, 0x2ac3, 0xb25a, 0x4145, 0xa5e8, 0x400e, 0x1851, 0xbf87, 0x1c05, 0x4377, 0x405d, 0xba00, 0xb2d5, 0x4232, 0x319c, 0x4409, 0x1f3d, 0x41e6, 0x4069, 0xbfb4, 0x41d9, 0x18d0, 0x4307, 0x4567, 0x433e, 0x421c, 0x429c, 0x055c, 0x41ab, 0x40b1, 0x40f1, 0x353d, 0xaae0, 0x4237, 0xaadc, 0x23f3, 0xb0b0, 0xbf47, 0x401a, 0xaeea, 0x4077, 0xa7bd, 0x4209, 0x41a4, 0x46eb, 0x437f, 0x4226, 0xb2e2, 0xb04a, 0x4233, 0x4387, 0xbfc8, 0x46dc, 0x4381, 0xbada, 0x0d3d, 0x44cb, 0x405c, 0x4544, 0x438e, 0x419a, 0x40f9, 0x442a, 0xb000, 0xb2da, 0x1aa8, 0x1e51, 0x1dd4, 0x1319, 0xba33, 0x4176, 0x40eb, 0xbff0, 0xbf62, 0x42d7, 0x40e7, 0x413e, 0x4770, 0xe7fe + ], + StartRegs = [0xec5af9f4, 0x9436eb06, 0x9ba4ad42, 0x6f255f58, 0x3f12d10f, 0x0928b6c9, 0x415b7bf8, 0x054f2f3e, 0x41a3cd86, 0x6af229e8, 0xc9f61355, 0xeb58ff68, 0x0c0e2ab2, 0xe150fa69, 0x00000000, 0xe00001f0 + ], + FinalRegs = [0xffffff39, 0x00000000, 0x000000f3, 0x00000000, 0x000000fa, 0x0000002c, 0x2eb370e8, 0x02c5a110, 0xe151009d, 0xe150fdb5, 0xffffffff, 0xc2a1f61a, 0xe150f865, 0xe150f98d, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x368f, 0x4181, 0xba43, 0x438d, 0xb2ff, 0x43b4, 0x1f09, 0xb23a, 0x4230, 0x293c, 0x4083, 0x243f, 0x2f0b, 0xba43, 0x4022, 0xbf99, 0x2d22, 0xb03a, 0xb2bd, 0x44d3, 0x08ec, 0x425e, 0xb00c, 0x407d, 0xba24, 0xafc8, 0x1de9, 0xbf70, 0x41a6, 0xbf58, 0x42e9, 0x264c, 0x45c3, 0x40bd, 0x4029, 0xba3a, 0x1fda, 0x405c, 0x4005, 0xb2cd, 0x4079, 0x3285, 0xa715, 0x411f, 0x4560, 0xbfb1, 0x406c, 0x4091, 0xa6a9, 0xb22f, 0x41d6, 0xb20e, 0x40ad, 0xbff0, 0xad3c, 0x443a, 0xbf80, 0xb256, 0x4025, 0x43b3, 0x1fd2, 0x00f7, 0x4160, 0xbf1f, 0x36b9, 0x19d7, 0xb26e, 0x4101, 0x41d5, 0x1d7a, 0xba56, 0x43a6, 0xbf83, 0xb2dc, 0x424b, 0x4124, 0xba59, 0x4307, 0xb0cf, 0x4328, 0x4065, 0xbafa, 0xb0c7, 0xb0af, 0xbf83, 0x43b6, 0xb2b8, 0x408c, 0x0730, 0xbfb4, 0xbff0, 0x02a9, 0xb286, 0x4258, 0x45b2, 0x42dd, 0x427e, 0x1faf, 0x1af5, 0x40fb, 0xb092, 0x4615, 0xbf29, 0x1b44, 0xbf60, 0xa826, 0xb250, 0x40cc, 0xb0ad, 0x23d8, 0x10b2, 0x4183, 0x426a, 0x4152, 0xbaf9, 0xacfe, 0x1cd8, 0xbfa2, 0x2419, 0x3078, 0x4083, 0xb2c7, 0x45ae, 0x38db, 0x1879, 0x40cf, 0x4220, 0xb23d, 0x20b8, 0xba32, 0x4031, 0x455b, 0x105c, 0xb295, 0x1af1, 0x12d9, 0xbfc9, 0x403c, 0x4133, 0x4261, 0x41aa, 0x4369, 0x032b, 0xb049, 0xad38, 0x27b3, 0xb20c, 0x424c, 0x4238, 0x1923, 0xb283, 0xb050, 0x424a, 0x1c55, 0x0a49, 0xb0f6, 0x43e2, 0x0e4f, 0x4219, 0x400a, 0x42ac, 0x414e, 0xa73b, 0xbf0f, 0x437b, 0x41ef, 0xa1bd, 0x4051, 0x4308, 0x16a2, 0xbfa0, 0xb26d, 0xba3c, 0x181e, 0xba7e, 0x42c2, 0xba45, 0xac7d, 0x087f, 0x4225, 0xba6c, 0x188b, 0xbf0a, 0xa98e, 0xb2da, 0x1f20, 0x19c1, 0xbf08, 0x40fe, 0x4137, 0xb23a, 0xbfb0, 0x4098, 0x1814, 0x4026, 0x2027, 0x4269, 0xb060, 0x1807, 0xb28e, 0x1ae8, 0xb2a0, 0x4308, 0x414a, 0x416e, 0x1358, 0x43c5, 0xb257, 0x4412, 0xbfc0, 0x2c84, 0x4212, 0xbf7f, 0x40b3, 0xb0cc, 0x404b, 0x0a2d, 0x1a49, 0x1eb1, 0x4342, 0x43b1, 0x1bc8, 0xa36f, 0x42b3, 0x1995, 0x43d8, 0x41c3, 0x407f, 0x410b, 0x40b9, 0x416c, 0xac31, 0x4010, 0xb08d, 0x4007, 0xb209, 0xb091, 0x4383, 0xb21e, 0x411d, 0xb02b, 0x44ad, 0xbf82, 0x18f7, 0x422a, 0xb01d, 0x3f8a, 0xb05f, 0x4589, 0x45a6, 0x4161, 0xba59, 0x41e8, 0xb280, 0x4052, 0xae0d, 0x43b8, 0x4297, 0xb2e8, 0xb260, 0x44a9, 0xbad8, 0x429b, 0x1271, 0x412a, 0x43ef, 0x403f, 0x1f4c, 0xbf7e, 0xa769, 0x40fa, 0xb2a7, 0x3cc5, 0xbf70, 0x17d1, 0x41de, 0x414f, 0xbf7f, 0xba4d, 0xa1df, 0x022b, 0xa268, 0x4237, 0x1a45, 0x40ce, 0x4324, 0x129a, 0x4087, 0x1820, 0x4287, 0x401a, 0x43a3, 0x268b, 0x1b43, 0xa18b, 0x1855, 0x4046, 0x406f, 0x43ee, 0x140b, 0xba3c, 0xb27d, 0x4227, 0xb2fc, 0xab9c, 0x418c, 0xbf2d, 0x42bc, 0x41a9, 0x02ae, 0xb203, 0x401d, 0x4250, 0x431a, 0x40b4, 0xba7c, 0x40db, 0x20f2, 0xb200, 0xa5a0, 0x31f7, 0x028e, 0xbfa0, 0xb2c0, 0x1584, 0xbadf, 0x4278, 0x43ab, 0x0582, 0x414a, 0x1a67, 0x3b4c, 0x1c8a, 0x42c3, 0x40e1, 0x4272, 0xbf41, 0xba3c, 0x42b7, 0x40fa, 0x0974, 0x42b7, 0x1c59, 0xbf17, 0x1c3b, 0x42b2, 0x42c7, 0x1feb, 0x419f, 0x24bb, 0x0932, 0x46c4, 0x42fd, 0x16d0, 0x42f3, 0xbac8, 0x125a, 0xb275, 0x18b1, 0x4432, 0x2522, 0xbf6c, 0x43e3, 0xba24, 0xb053, 0x439c, 0xa9a6, 0x1aa2, 0x3eaf, 0x402d, 0x0b2b, 0xa543, 0xbfa0, 0x4055, 0xbf12, 0x4168, 0x437e, 0x1ea7, 0x4022, 0xa4e7, 0xba4b, 0x394d, 0x195c, 0x1ab5, 0x41fd, 0x436d, 0xaa65, 0x2437, 0xbac6, 0x424a, 0xbfca, 0xba0e, 0xbaec, 0x4038, 0x1252, 0x258d, 0x4186, 0x45d2, 0x42a3, 0x45b8, 0x4160, 0xbf3e, 0x3d8d, 0xb2a1, 0xb277, 0xb2b9, 0xba2a, 0x42e5, 0x4149, 0x4345, 0xba37, 0x43a0, 0x4104, 0x20f0, 0xbac7, 0x43d0, 0x42a9, 0x4215, 0x4576, 0x0a5a, 0xb21c, 0x0657, 0xba38, 0x0f44, 0x1b98, 0x1deb, 0x43af, 0x4198, 0x40bf, 0x3af8, 0xbfd4, 0x03ec, 0x2f69, 0xb05c, 0x2d36, 0x1505, 0xb2be, 0x40ba, 0xb016, 0x40e9, 0x0007, 0xbf66, 0xb284, 0xb2fa, 0x19c8, 0x11bc, 0xba48, 0x4172, 0xa0c2, 0x41de, 0x42d9, 0xb224, 0x1e05, 0x42df, 0x1bf1, 0x272b, 0x4143, 0xbf97, 0xba04, 0x43a9, 0x16d4, 0xb2b7, 0xbafe, 0x033a, 0xba53, 0xb2a6, 0x432c, 0x425e, 0x35c4, 0x43d7, 0x43a1, 0xb209, 0x40d7, 0xbad6, 0x434c, 0x4380, 0xbf61, 0x43db, 0xa3c6, 0x4202, 0x41a0, 0x4370, 0x42d2, 0xb241, 0x0725, 0xb24a, 0x41b8, 0x1e71, 0x42dc, 0x419c, 0x1ccf, 0xb267, 0x4427, 0xb2f7, 0xb235, 0x2c94, 0x19eb, 0xb2b2, 0xbf76, 0x3401, 0x41d7, 0x4212, 0x1e3e, 0xae23, 0x3934, 0x4128, 0xb245, 0x1fcb, 0xbfcb, 0x1a32, 0x44dc, 0x41a4, 0x3ec2, 0x4381, 0x318a, 0x408b, 0x4076, 0x42be, 0x4214, 0x0530, 0x4351, 0x2735, 0xad1b, 0x436c, 0x43dc, 0xba34, 0x4276, 0x41eb, 0xb01f, 0x3246, 0x0717, 0x437e, 0x4021, 0x4043, 0xb237, 0x1876, 0x417d, 0x41d4, 0xbf57, 0xba07, 0xb2e7, 0x1f8b, 0xb28c, 0xbf21, 0x4243, 0x4157, 0x3d59, 0x40be, 0xb22b, 0xb21f, 0x2afc, 0x0525, 0x4291, 0x465e, 0x402d, 0x45ce, 0x0f5f, 0x3952, 0xaaf9, 0x414a, 0xbacc, 0x0081, 0x2e90, 0x4280, 0xbfa5, 0x404c, 0x413e, 0xb2d4, 0x38c8, 0xbf0a, 0x3124, 0x402c, 0x404e, 0x3c59, 0x41f1, 0xba4a, 0xbadc, 0x4117, 0xa1c4, 0x414e, 0x46b4, 0x40f7, 0xb251, 0x46a9, 0xa050, 0xb28c, 0x4369, 0x029c, 0x424c, 0x469b, 0x4266, 0x43b8, 0x2c0e, 0xbfbc, 0x1825, 0xadd6, 0x1b78, 0xba75, 0x10ef, 0x26bd, 0xb09b, 0x42b8, 0xba65, 0x3f0f, 0x0476, 0xb0dc, 0xb21f, 0xb02a, 0x1cb4, 0x468d, 0x3cbe, 0xbf29, 0xbad6, 0x439d, 0xb2d8, 0x1fc1, 0x4260, 0x4541, 0xb271, 0xbac0, 0x1d46, 0xb273, 0x197c, 0x4280, 0x426a, 0x1f19, 0x426c, 0xb284, 0x4230, 0xbf60, 0xb2fd, 0xb203, 0x18b1, 0xbf58, 0x39ee, 0x1ff4, 0x27de, 0xbfa0, 0xb27d, 0xbfe0, 0xb21c, 0x4165, 0x404d, 0xb2d9, 0x45c5, 0x4333, 0x1ba5, 0x4568, 0x43d8, 0xb277, 0x1ef0, 0x124f, 0xb251, 0x1d1d, 0xbf4a, 0x409b, 0xb23c, 0x4400, 0x4391, 0x293e, 0x1a99, 0x40be, 0x0314, 0x43bb, 0x41f5, 0xb28c, 0x1db7, 0x40c4, 0xb00c, 0x4175, 0x40af, 0x4291, 0x3db2, 0xa7cb, 0x4031, 0xba26, 0x43fa, 0x188c, 0x403e, 0x0de1, 0x432b, 0xb027, 0x2431, 0xbf74, 0x41e4, 0x432b, 0xb20f, 0x2b39, 0x4352, 0xaff4, 0xb2eb, 0x45ca, 0x4273, 0x4142, 0x4366, 0x40c1, 0x44fb, 0x1930, 0xb2a5, 0x1bf9, 0xb294, 0x42ec, 0x431c, 0x4345, 0xbf55, 0x0d4b, 0xb07f, 0x0095, 0x2cff, 0xb284, 0x14a1, 0x42bb, 0x4643, 0x436c, 0xb2f1, 0x44e8, 0xb23f, 0x4207, 0x2f1e, 0xb2d7, 0xa512, 0xac75, 0x3a91, 0x231d, 0x3c3d, 0x4151, 0x3341, 0x01ad, 0x44d5, 0xbf3c, 0x1763, 0xa0da, 0x41af, 0x1a77, 0x406d, 0x40fa, 0x18ed, 0x429f, 0x1a22, 0x295a, 0x2dbf, 0x4007, 0x0072, 0xbae7, 0x4343, 0x425d, 0xb2db, 0xb2d4, 0xac1e, 0x40cc, 0x1068, 0x46ca, 0x40c0, 0x417f, 0x4025, 0x4121, 0xbf1d, 0xb297, 0x1c35, 0x43f0, 0xba3f, 0x1e51, 0x43c9, 0x40de, 0x435b, 0xba05, 0x42b9, 0xb270, 0xbf05, 0x3d22, 0x4206, 0x1c39, 0xa97f, 0xba7e, 0xba1b, 0x31a6, 0x414f, 0x39ef, 0xb26a, 0xbad8, 0x2fd1, 0x1abe, 0x1f4e, 0x43a4, 0xb289, 0xb069, 0xb256, 0x4150, 0x181b, 0xbf6a, 0xa9e8, 0xb299, 0x260b, 0x1b81, 0x1356, 0x09f9, 0x16e5, 0x4353, 0x0218, 0x41e3, 0x42c2, 0x2b68, 0xba77, 0x2cc6, 0x4577, 0x42d2, 0x212f, 0x42b8, 0x4063, 0xb235, 0x195a, 0x3085, 0xbf69, 0x4208, 0x2c24, 0x0117, 0x27bc, 0x421d, 0x4165, 0x4033, 0xbf65, 0x38d0, 0x3e41, 0x46c4, 0x40d8, 0xb2d5, 0xbf60, 0x1ab8, 0x402b, 0x23ec, 0xbfc0, 0xbf21, 0xba39, 0x4176, 0x22b6, 0xa1ca, 0x4041, 0x1e24, 0x2334, 0xb079, 0x1ac9, 0x428c, 0x43a1, 0x4556, 0x1ebd, 0xa512, 0xba5c, 0x2319, 0x1ffe, 0xb25d, 0x421b, 0xbf9b, 0x4012, 0x41de, 0x41ad, 0xbaee, 0x42c6, 0x41d7, 0xb20a, 0x33f2, 0x42de, 0x41a2, 0x0d16, 0xba7a, 0x4289, 0xba26, 0xbf49, 0xb2ae, 0x129d, 0xb2eb, 0x4223, 0x1864, 0x0aad, 0xbf57, 0x412c, 0x404f, 0xaa07, 0x41c6, 0x40ef, 0x114a, 0x46f8, 0xbac8, 0x45f1, 0xa8a5, 0x4338, 0x43ab, 0x0833, 0x2140, 0x41b6, 0x2a3e, 0xb018, 0x4215, 0xbf05, 0xba24, 0xa61c, 0xbae2, 0x3218, 0x1078, 0xa5bb, 0x3cf2, 0x34b0, 0xbacd, 0xb085, 0xbf6d, 0xbac5, 0x46d2, 0x4335, 0x421e, 0xb2e6, 0x1df5, 0x412e, 0xbf08, 0x4060, 0x1c63, 0x1c85, 0xba0b, 0xb25a, 0x430b, 0xbfbe, 0xb072, 0x4307, 0x43f1, 0x436c, 0x463f, 0x0028, 0x4311, 0xa4ad, 0x4648, 0x4361, 0x4175, 0x228c, 0x42e9, 0x40e8, 0x0f81, 0x081b, 0x4146, 0xbf81, 0x42a1, 0xac30, 0x40f1, 0x4492, 0x4336, 0xb2fb, 0x1b1d, 0xb2ac, 0x23c8, 0x44ad, 0x1f91, 0x43fe, 0x42b7, 0x1bed, 0x1cb1, 0x3518, 0x0864, 0x4183, 0x42de, 0x4307, 0xb283, 0x43af, 0xb2cc, 0xba5f, 0x1411, 0xb298, 0x4071, 0xbf16, 0x40c9, 0x4637, 0x4307, 0xbf53, 0x1a70, 0x40ca, 0xb26b, 0x42e6, 0xb079, 0xa782, 0x1c70, 0x4623, 0x40b1, 0x41f2, 0x46a4, 0x2ac3, 0x4229, 0x3f2d, 0x4302, 0x030f, 0xa7bd, 0xbf81, 0x4040, 0xbafc, 0xa376, 0xb05e, 0xbf6b, 0x42ec, 0xa754, 0x41e9, 0x433d, 0x4325, 0x2462, 0x4205, 0xa968, 0xbff0, 0x00c8, 0x4378, 0x430f, 0x4136, 0x41f5, 0x2f8e, 0x44fa, 0x413c, 0xbfb9, 0xb097, 0xbaf6, 0xb03e, 0x43d0, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x8b2100eb, 0x3af85a8f, 0x0bb662e6, 0x7ac5449f, 0x6c8b9706, 0x2d86ea00, 0xd9186e8c, 0xb3755866, 0x7227be38, 0x7f97e5fb, 0xc176d2f9, 0x1ff0913a, 0xcb8e1a87, 0x6b0408ce, 0x00000000, 0x800001f0 }, - FinalRegs = new uint[] { 0xffffff72, 0xc176c228, 0x0000008d, 0x00000002, 0x00000000, 0xffffff36, 0x00000000, 0xc176db3c, 0x000016e4, 0x00000000, 0x000017e2, 0x0000206e, 0x00000002, 0xc176c180, 0x00000000, 0x400001d0 }, + Instructions = [0x368f, 0x4181, 0xba43, 0x438d, 0xb2ff, 0x43b4, 0x1f09, 0xb23a, 0x4230, 0x293c, 0x4083, 0x243f, 0x2f0b, 0xba43, 0x4022, 0xbf99, 0x2d22, 0xb03a, 0xb2bd, 0x44d3, 0x08ec, 0x425e, 0xb00c, 0x407d, 0xba24, 0xafc8, 0x1de9, 0xbf70, 0x41a6, 0xbf58, 0x42e9, 0x264c, 0x45c3, 0x40bd, 0x4029, 0xba3a, 0x1fda, 0x405c, 0x4005, 0xb2cd, 0x4079, 0x3285, 0xa715, 0x411f, 0x4560, 0xbfb1, 0x406c, 0x4091, 0xa6a9, 0xb22f, 0x41d6, 0xb20e, 0x40ad, 0xbff0, 0xad3c, 0x443a, 0xbf80, 0xb256, 0x4025, 0x43b3, 0x1fd2, 0x00f7, 0x4160, 0xbf1f, 0x36b9, 0x19d7, 0xb26e, 0x4101, 0x41d5, 0x1d7a, 0xba56, 0x43a6, 0xbf83, 0xb2dc, 0x424b, 0x4124, 0xba59, 0x4307, 0xb0cf, 0x4328, 0x4065, 0xbafa, 0xb0c7, 0xb0af, 0xbf83, 0x43b6, 0xb2b8, 0x408c, 0x0730, 0xbfb4, 0xbff0, 0x02a9, 0xb286, 0x4258, 0x45b2, 0x42dd, 0x427e, 0x1faf, 0x1af5, 0x40fb, 0xb092, 0x4615, 0xbf29, 0x1b44, 0xbf60, 0xa826, 0xb250, 0x40cc, 0xb0ad, 0x23d8, 0x10b2, 0x4183, 0x426a, 0x4152, 0xbaf9, 0xacfe, 0x1cd8, 0xbfa2, 0x2419, 0x3078, 0x4083, 0xb2c7, 0x45ae, 0x38db, 0x1879, 0x40cf, 0x4220, 0xb23d, 0x20b8, 0xba32, 0x4031, 0x455b, 0x105c, 0xb295, 0x1af1, 0x12d9, 0xbfc9, 0x403c, 0x4133, 0x4261, 0x41aa, 0x4369, 0x032b, 0xb049, 0xad38, 0x27b3, 0xb20c, 0x424c, 0x4238, 0x1923, 0xb283, 0xb050, 0x424a, 0x1c55, 0x0a49, 0xb0f6, 0x43e2, 0x0e4f, 0x4219, 0x400a, 0x42ac, 0x414e, 0xa73b, 0xbf0f, 0x437b, 0x41ef, 0xa1bd, 0x4051, 0x4308, 0x16a2, 0xbfa0, 0xb26d, 0xba3c, 0x181e, 0xba7e, 0x42c2, 0xba45, 0xac7d, 0x087f, 0x4225, 0xba6c, 0x188b, 0xbf0a, 0xa98e, 0xb2da, 0x1f20, 0x19c1, 0xbf08, 0x40fe, 0x4137, 0xb23a, 0xbfb0, 0x4098, 0x1814, 0x4026, 0x2027, 0x4269, 0xb060, 0x1807, 0xb28e, 0x1ae8, 0xb2a0, 0x4308, 0x414a, 0x416e, 0x1358, 0x43c5, 0xb257, 0x4412, 0xbfc0, 0x2c84, 0x4212, 0xbf7f, 0x40b3, 0xb0cc, 0x404b, 0x0a2d, 0x1a49, 0x1eb1, 0x4342, 0x43b1, 0x1bc8, 0xa36f, 0x42b3, 0x1995, 0x43d8, 0x41c3, 0x407f, 0x410b, 0x40b9, 0x416c, 0xac31, 0x4010, 0xb08d, 0x4007, 0xb209, 0xb091, 0x4383, 0xb21e, 0x411d, 0xb02b, 0x44ad, 0xbf82, 0x18f7, 0x422a, 0xb01d, 0x3f8a, 0xb05f, 0x4589, 0x45a6, 0x4161, 0xba59, 0x41e8, 0xb280, 0x4052, 0xae0d, 0x43b8, 0x4297, 0xb2e8, 0xb260, 0x44a9, 0xbad8, 0x429b, 0x1271, 0x412a, 0x43ef, 0x403f, 0x1f4c, 0xbf7e, 0xa769, 0x40fa, 0xb2a7, 0x3cc5, 0xbf70, 0x17d1, 0x41de, 0x414f, 0xbf7f, 0xba4d, 0xa1df, 0x022b, 0xa268, 0x4237, 0x1a45, 0x40ce, 0x4324, 0x129a, 0x4087, 0x1820, 0x4287, 0x401a, 0x43a3, 0x268b, 0x1b43, 0xa18b, 0x1855, 0x4046, 0x406f, 0x43ee, 0x140b, 0xba3c, 0xb27d, 0x4227, 0xb2fc, 0xab9c, 0x418c, 0xbf2d, 0x42bc, 0x41a9, 0x02ae, 0xb203, 0x401d, 0x4250, 0x431a, 0x40b4, 0xba7c, 0x40db, 0x20f2, 0xb200, 0xa5a0, 0x31f7, 0x028e, 0xbfa0, 0xb2c0, 0x1584, 0xbadf, 0x4278, 0x43ab, 0x0582, 0x414a, 0x1a67, 0x3b4c, 0x1c8a, 0x42c3, 0x40e1, 0x4272, 0xbf41, 0xba3c, 0x42b7, 0x40fa, 0x0974, 0x42b7, 0x1c59, 0xbf17, 0x1c3b, 0x42b2, 0x42c7, 0x1feb, 0x419f, 0x24bb, 0x0932, 0x46c4, 0x42fd, 0x16d0, 0x42f3, 0xbac8, 0x125a, 0xb275, 0x18b1, 0x4432, 0x2522, 0xbf6c, 0x43e3, 0xba24, 0xb053, 0x439c, 0xa9a6, 0x1aa2, 0x3eaf, 0x402d, 0x0b2b, 0xa543, 0xbfa0, 0x4055, 0xbf12, 0x4168, 0x437e, 0x1ea7, 0x4022, 0xa4e7, 0xba4b, 0x394d, 0x195c, 0x1ab5, 0x41fd, 0x436d, 0xaa65, 0x2437, 0xbac6, 0x424a, 0xbfca, 0xba0e, 0xbaec, 0x4038, 0x1252, 0x258d, 0x4186, 0x45d2, 0x42a3, 0x45b8, 0x4160, 0xbf3e, 0x3d8d, 0xb2a1, 0xb277, 0xb2b9, 0xba2a, 0x42e5, 0x4149, 0x4345, 0xba37, 0x43a0, 0x4104, 0x20f0, 0xbac7, 0x43d0, 0x42a9, 0x4215, 0x4576, 0x0a5a, 0xb21c, 0x0657, 0xba38, 0x0f44, 0x1b98, 0x1deb, 0x43af, 0x4198, 0x40bf, 0x3af8, 0xbfd4, 0x03ec, 0x2f69, 0xb05c, 0x2d36, 0x1505, 0xb2be, 0x40ba, 0xb016, 0x40e9, 0x0007, 0xbf66, 0xb284, 0xb2fa, 0x19c8, 0x11bc, 0xba48, 0x4172, 0xa0c2, 0x41de, 0x42d9, 0xb224, 0x1e05, 0x42df, 0x1bf1, 0x272b, 0x4143, 0xbf97, 0xba04, 0x43a9, 0x16d4, 0xb2b7, 0xbafe, 0x033a, 0xba53, 0xb2a6, 0x432c, 0x425e, 0x35c4, 0x43d7, 0x43a1, 0xb209, 0x40d7, 0xbad6, 0x434c, 0x4380, 0xbf61, 0x43db, 0xa3c6, 0x4202, 0x41a0, 0x4370, 0x42d2, 0xb241, 0x0725, 0xb24a, 0x41b8, 0x1e71, 0x42dc, 0x419c, 0x1ccf, 0xb267, 0x4427, 0xb2f7, 0xb235, 0x2c94, 0x19eb, 0xb2b2, 0xbf76, 0x3401, 0x41d7, 0x4212, 0x1e3e, 0xae23, 0x3934, 0x4128, 0xb245, 0x1fcb, 0xbfcb, 0x1a32, 0x44dc, 0x41a4, 0x3ec2, 0x4381, 0x318a, 0x408b, 0x4076, 0x42be, 0x4214, 0x0530, 0x4351, 0x2735, 0xad1b, 0x436c, 0x43dc, 0xba34, 0x4276, 0x41eb, 0xb01f, 0x3246, 0x0717, 0x437e, 0x4021, 0x4043, 0xb237, 0x1876, 0x417d, 0x41d4, 0xbf57, 0xba07, 0xb2e7, 0x1f8b, 0xb28c, 0xbf21, 0x4243, 0x4157, 0x3d59, 0x40be, 0xb22b, 0xb21f, 0x2afc, 0x0525, 0x4291, 0x465e, 0x402d, 0x45ce, 0x0f5f, 0x3952, 0xaaf9, 0x414a, 0xbacc, 0x0081, 0x2e90, 0x4280, 0xbfa5, 0x404c, 0x413e, 0xb2d4, 0x38c8, 0xbf0a, 0x3124, 0x402c, 0x404e, 0x3c59, 0x41f1, 0xba4a, 0xbadc, 0x4117, 0xa1c4, 0x414e, 0x46b4, 0x40f7, 0xb251, 0x46a9, 0xa050, 0xb28c, 0x4369, 0x029c, 0x424c, 0x469b, 0x4266, 0x43b8, 0x2c0e, 0xbfbc, 0x1825, 0xadd6, 0x1b78, 0xba75, 0x10ef, 0x26bd, 0xb09b, 0x42b8, 0xba65, 0x3f0f, 0x0476, 0xb0dc, 0xb21f, 0xb02a, 0x1cb4, 0x468d, 0x3cbe, 0xbf29, 0xbad6, 0x439d, 0xb2d8, 0x1fc1, 0x4260, 0x4541, 0xb271, 0xbac0, 0x1d46, 0xb273, 0x197c, 0x4280, 0x426a, 0x1f19, 0x426c, 0xb284, 0x4230, 0xbf60, 0xb2fd, 0xb203, 0x18b1, 0xbf58, 0x39ee, 0x1ff4, 0x27de, 0xbfa0, 0xb27d, 0xbfe0, 0xb21c, 0x4165, 0x404d, 0xb2d9, 0x45c5, 0x4333, 0x1ba5, 0x4568, 0x43d8, 0xb277, 0x1ef0, 0x124f, 0xb251, 0x1d1d, 0xbf4a, 0x409b, 0xb23c, 0x4400, 0x4391, 0x293e, 0x1a99, 0x40be, 0x0314, 0x43bb, 0x41f5, 0xb28c, 0x1db7, 0x40c4, 0xb00c, 0x4175, 0x40af, 0x4291, 0x3db2, 0xa7cb, 0x4031, 0xba26, 0x43fa, 0x188c, 0x403e, 0x0de1, 0x432b, 0xb027, 0x2431, 0xbf74, 0x41e4, 0x432b, 0xb20f, 0x2b39, 0x4352, 0xaff4, 0xb2eb, 0x45ca, 0x4273, 0x4142, 0x4366, 0x40c1, 0x44fb, 0x1930, 0xb2a5, 0x1bf9, 0xb294, 0x42ec, 0x431c, 0x4345, 0xbf55, 0x0d4b, 0xb07f, 0x0095, 0x2cff, 0xb284, 0x14a1, 0x42bb, 0x4643, 0x436c, 0xb2f1, 0x44e8, 0xb23f, 0x4207, 0x2f1e, 0xb2d7, 0xa512, 0xac75, 0x3a91, 0x231d, 0x3c3d, 0x4151, 0x3341, 0x01ad, 0x44d5, 0xbf3c, 0x1763, 0xa0da, 0x41af, 0x1a77, 0x406d, 0x40fa, 0x18ed, 0x429f, 0x1a22, 0x295a, 0x2dbf, 0x4007, 0x0072, 0xbae7, 0x4343, 0x425d, 0xb2db, 0xb2d4, 0xac1e, 0x40cc, 0x1068, 0x46ca, 0x40c0, 0x417f, 0x4025, 0x4121, 0xbf1d, 0xb297, 0x1c35, 0x43f0, 0xba3f, 0x1e51, 0x43c9, 0x40de, 0x435b, 0xba05, 0x42b9, 0xb270, 0xbf05, 0x3d22, 0x4206, 0x1c39, 0xa97f, 0xba7e, 0xba1b, 0x31a6, 0x414f, 0x39ef, 0xb26a, 0xbad8, 0x2fd1, 0x1abe, 0x1f4e, 0x43a4, 0xb289, 0xb069, 0xb256, 0x4150, 0x181b, 0xbf6a, 0xa9e8, 0xb299, 0x260b, 0x1b81, 0x1356, 0x09f9, 0x16e5, 0x4353, 0x0218, 0x41e3, 0x42c2, 0x2b68, 0xba77, 0x2cc6, 0x4577, 0x42d2, 0x212f, 0x42b8, 0x4063, 0xb235, 0x195a, 0x3085, 0xbf69, 0x4208, 0x2c24, 0x0117, 0x27bc, 0x421d, 0x4165, 0x4033, 0xbf65, 0x38d0, 0x3e41, 0x46c4, 0x40d8, 0xb2d5, 0xbf60, 0x1ab8, 0x402b, 0x23ec, 0xbfc0, 0xbf21, 0xba39, 0x4176, 0x22b6, 0xa1ca, 0x4041, 0x1e24, 0x2334, 0xb079, 0x1ac9, 0x428c, 0x43a1, 0x4556, 0x1ebd, 0xa512, 0xba5c, 0x2319, 0x1ffe, 0xb25d, 0x421b, 0xbf9b, 0x4012, 0x41de, 0x41ad, 0xbaee, 0x42c6, 0x41d7, 0xb20a, 0x33f2, 0x42de, 0x41a2, 0x0d16, 0xba7a, 0x4289, 0xba26, 0xbf49, 0xb2ae, 0x129d, 0xb2eb, 0x4223, 0x1864, 0x0aad, 0xbf57, 0x412c, 0x404f, 0xaa07, 0x41c6, 0x40ef, 0x114a, 0x46f8, 0xbac8, 0x45f1, 0xa8a5, 0x4338, 0x43ab, 0x0833, 0x2140, 0x41b6, 0x2a3e, 0xb018, 0x4215, 0xbf05, 0xba24, 0xa61c, 0xbae2, 0x3218, 0x1078, 0xa5bb, 0x3cf2, 0x34b0, 0xbacd, 0xb085, 0xbf6d, 0xbac5, 0x46d2, 0x4335, 0x421e, 0xb2e6, 0x1df5, 0x412e, 0xbf08, 0x4060, 0x1c63, 0x1c85, 0xba0b, 0xb25a, 0x430b, 0xbfbe, 0xb072, 0x4307, 0x43f1, 0x436c, 0x463f, 0x0028, 0x4311, 0xa4ad, 0x4648, 0x4361, 0x4175, 0x228c, 0x42e9, 0x40e8, 0x0f81, 0x081b, 0x4146, 0xbf81, 0x42a1, 0xac30, 0x40f1, 0x4492, 0x4336, 0xb2fb, 0x1b1d, 0xb2ac, 0x23c8, 0x44ad, 0x1f91, 0x43fe, 0x42b7, 0x1bed, 0x1cb1, 0x3518, 0x0864, 0x4183, 0x42de, 0x4307, 0xb283, 0x43af, 0xb2cc, 0xba5f, 0x1411, 0xb298, 0x4071, 0xbf16, 0x40c9, 0x4637, 0x4307, 0xbf53, 0x1a70, 0x40ca, 0xb26b, 0x42e6, 0xb079, 0xa782, 0x1c70, 0x4623, 0x40b1, 0x41f2, 0x46a4, 0x2ac3, 0x4229, 0x3f2d, 0x4302, 0x030f, 0xa7bd, 0xbf81, 0x4040, 0xbafc, 0xa376, 0xb05e, 0xbf6b, 0x42ec, 0xa754, 0x41e9, 0x433d, 0x4325, 0x2462, 0x4205, 0xa968, 0xbff0, 0x00c8, 0x4378, 0x430f, 0x4136, 0x41f5, 0x2f8e, 0x44fa, 0x413c, 0xbfb9, 0xb097, 0xbaf6, 0xb03e, 0x43d0, 0x4770, 0xe7fe + ], + StartRegs = [0x8b2100eb, 0x3af85a8f, 0x0bb662e6, 0x7ac5449f, 0x6c8b9706, 0x2d86ea00, 0xd9186e8c, 0xb3755866, 0x7227be38, 0x7f97e5fb, 0xc176d2f9, 0x1ff0913a, 0xcb8e1a87, 0x6b0408ce, 0x00000000, 0x800001f0 + ], + FinalRegs = [0xffffff72, 0xc176c228, 0x0000008d, 0x00000002, 0x00000000, 0xffffff36, 0x00000000, 0xc176db3c, 0x000016e4, 0x00000000, 0x000017e2, 0x0000206e, 0x00000002, 0xc176c180, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0xbac5, 0x426b, 0x16bc, 0x2d44, 0x43aa, 0xbf7b, 0x43f8, 0x42b9, 0x458b, 0x1f7e, 0xb0ac, 0xb292, 0x42e3, 0xb251, 0xb2dd, 0x1b86, 0x35fd, 0x410c, 0xac53, 0x3357, 0x35fb, 0x4355, 0x413e, 0xb2b9, 0x42f8, 0xbfa3, 0x408f, 0x1d27, 0xb0dd, 0xbf70, 0x2c41, 0x1bb6, 0xbf0d, 0xb208, 0x2cad, 0xb296, 0x4132, 0x4119, 0x411d, 0x403a, 0x4332, 0xb2cb, 0xbac4, 0x4074, 0x403d, 0x18a4, 0x45ae, 0x42c9, 0xb043, 0xb0b4, 0x40c4, 0xba53, 0x409b, 0xbf63, 0x1a75, 0xb040, 0x4166, 0x3f7e, 0xa55e, 0x428d, 0x4235, 0x459c, 0x42d5, 0x4111, 0x42dc, 0x43ca, 0x4049, 0x4091, 0x29d5, 0xbf61, 0x40cd, 0x422d, 0x4170, 0x4541, 0x1062, 0x1cf3, 0x4248, 0x422e, 0x1cdc, 0xabfc, 0xa3f2, 0x0677, 0x28d6, 0x143c, 0xb2d6, 0xba55, 0xb261, 0x41f7, 0x439c, 0x2b7b, 0x1c82, 0xb008, 0x2432, 0xbf62, 0xa8ee, 0x37a9, 0x1e86, 0xa85b, 0xb25c, 0x434c, 0xbf96, 0x423e, 0x4093, 0x44e1, 0x42ff, 0x41bf, 0xa8c3, 0x43cb, 0x3a77, 0x2b99, 0x0976, 0x3160, 0x4030, 0xb2db, 0xba36, 0x3ef4, 0x4617, 0x1ab5, 0x02d3, 0xb018, 0x43ad, 0x40cd, 0xbf89, 0x4390, 0x15d6, 0x4255, 0x46dc, 0xac0e, 0x11b4, 0xbf05, 0xac46, 0x4392, 0xbac5, 0x1842, 0x40df, 0x4113, 0x4126, 0x1cac, 0x3e49, 0x4051, 0xb2cf, 0x43b7, 0xbf78, 0x07e7, 0xb210, 0xb26b, 0x1f7b, 0x03b0, 0x42db, 0x2d35, 0x43eb, 0xb23a, 0x418a, 0xaddb, 0x1c63, 0xbf33, 0x35a5, 0x4349, 0x0da2, 0x428e, 0x4132, 0x40f8, 0xba40, 0x41e8, 0x40e8, 0x2f5d, 0x417c, 0x1bc0, 0x41b3, 0xaa64, 0x1b12, 0x0f9c, 0x435b, 0x2204, 0x42d7, 0x19ce, 0x4059, 0x40b3, 0xad3a, 0x43a1, 0x44b9, 0x42f0, 0xb2d8, 0x2938, 0xbf8c, 0x0c53, 0x41c7, 0x4177, 0xbaca, 0x40a7, 0x4607, 0x4238, 0x4100, 0x14e5, 0x4271, 0x4148, 0x24b6, 0x108d, 0xb234, 0xafb1, 0x20a6, 0xbf2e, 0x1ff8, 0xba48, 0x42a8, 0x43a6, 0x40f7, 0x3723, 0x1e21, 0x4004, 0x14b3, 0xbae8, 0x43f2, 0x4223, 0xa5a7, 0x4021, 0xbf60, 0xb2dd, 0xb2fa, 0x4144, 0xb284, 0x135c, 0xbf8b, 0x40a8, 0x4238, 0xb26e, 0x42b4, 0x43c5, 0x3a5f, 0x43e5, 0x2fe1, 0xbf5e, 0x039d, 0x3102, 0x4076, 0x40ec, 0x1e43, 0xbfc1, 0x1f10, 0x212d, 0xa889, 0xb2af, 0x1ccd, 0xb22b, 0x4373, 0x09c1, 0xbf49, 0x40ab, 0xb2f7, 0x4037, 0xb28e, 0x41fd, 0x0334, 0x1a33, 0x41ce, 0x462f, 0x41a4, 0x4181, 0x1ac3, 0xbf46, 0xb054, 0xaf5f, 0x41f6, 0x3343, 0x42e6, 0x4281, 0x0710, 0x0255, 0x41fa, 0x43ca, 0x1bf1, 0x4138, 0x2a43, 0x4388, 0xb0b1, 0xb2d3, 0x41ef, 0x43f1, 0x4090, 0x4195, 0x4151, 0x15b9, 0x1eb1, 0x1923, 0x1b16, 0x4352, 0xbfde, 0x42e7, 0x4130, 0xb248, 0x43a6, 0x460a, 0xbf39, 0x1a10, 0x4375, 0x4089, 0xbacc, 0x26f9, 0x4582, 0xbf6d, 0xb20a, 0xba36, 0x41c7, 0xb22a, 0xb05e, 0xba3f, 0x1ffe, 0x34c2, 0xb244, 0x2181, 0xb2f0, 0x3c08, 0x08a6, 0xba2d, 0x4221, 0x33fb, 0x4162, 0x439d, 0x43e9, 0x1eb8, 0x430e, 0x1f07, 0xbadb, 0xba6e, 0x02d2, 0xbf4e, 0xb294, 0xb2a7, 0xba6c, 0x41a4, 0x4647, 0xb231, 0x41c2, 0xb29e, 0x0648, 0x0ca8, 0x4273, 0x425d, 0xbf33, 0xa38e, 0xba5e, 0x407a, 0x1415, 0x3523, 0x4023, 0x2600, 0x4029, 0x426a, 0xb25a, 0xb2c1, 0x1b6e, 0x42aa, 0x4040, 0xb2bd, 0xab1b, 0x40de, 0xb05c, 0x427f, 0xbf2e, 0xb004, 0xba52, 0x1b44, 0x413d, 0x4147, 0x41a7, 0xbac9, 0xb27d, 0x1c52, 0x42aa, 0x1c6e, 0x43d7, 0xb04a, 0x4676, 0x1f18, 0x41fe, 0x42db, 0x4252, 0xbf4d, 0xb098, 0x3625, 0xb29f, 0x43c0, 0xa08e, 0xbf8c, 0x4317, 0xba78, 0x40ae, 0x3641, 0x42c7, 0xaf31, 0x40ae, 0x4360, 0x4066, 0x1a32, 0x4138, 0xba1f, 0xba21, 0x23aa, 0xba5f, 0x45e9, 0xba0c, 0xbfc6, 0xb2ad, 0x4389, 0x0aea, 0x0da6, 0x17ad, 0x1de4, 0x4247, 0x4040, 0xb2e0, 0x43d1, 0x1a71, 0xb088, 0xba62, 0x4034, 0x4077, 0x40dc, 0x1a7b, 0x05a4, 0xba3d, 0x4424, 0xbf55, 0xbfb0, 0x1408, 0x408c, 0x43c3, 0x42dd, 0x4464, 0xa818, 0x1161, 0x19ea, 0xb0ce, 0x24ce, 0xb2af, 0x15fa, 0x027b, 0xba01, 0xa369, 0x014f, 0x4036, 0x43ed, 0x40e5, 0x320e, 0x4214, 0xbaed, 0x275f, 0x400c, 0xba13, 0xa866, 0xbfb0, 0x41b7, 0xbfcd, 0x2c19, 0xbaea, 0x421e, 0xb296, 0xbf42, 0x42cc, 0x1726, 0xb08d, 0x4314, 0xbf87, 0x4107, 0x0425, 0x4586, 0x3b4d, 0x40c1, 0xbafc, 0xb0d5, 0xbf1e, 0x0b9a, 0xba4c, 0xb0e4, 0x3056, 0xbf80, 0xafd4, 0xb2fb, 0x4395, 0x4669, 0xb296, 0x1914, 0x4009, 0x2ac8, 0x4102, 0x4116, 0x40c1, 0x4130, 0x4493, 0x1bc0, 0xb250, 0x463b, 0x0469, 0x424b, 0x1b6b, 0x3e46, 0xb2fa, 0x4151, 0xbfac, 0x44d9, 0x1c7a, 0x1a00, 0x420b, 0xbaf5, 0x407e, 0xb21e, 0xad7b, 0x425c, 0xbf7a, 0x1db5, 0xae92, 0x1b35, 0x1ea1, 0x2cf5, 0x1af1, 0x4210, 0xbaf4, 0x42a0, 0x4124, 0x41dd, 0x4215, 0x13b4, 0x43e6, 0xbfa4, 0x416b, 0x1e6a, 0xbfc0, 0x0d58, 0x40c0, 0x454e, 0x0202, 0x40b5, 0xb276, 0x4333, 0x4574, 0xa2ac, 0x2a76, 0x425d, 0x40fc, 0x40da, 0xba47, 0x2428, 0xbf19, 0xb2a3, 0xb269, 0x2843, 0x3a89, 0x1f48, 0xbf7f, 0x416c, 0x4208, 0x4356, 0x43f2, 0xbae5, 0xb274, 0x4037, 0xb237, 0xaa79, 0x42d2, 0x1d34, 0x426f, 0xb236, 0x43a3, 0x4200, 0xbf60, 0x18b8, 0x1d7f, 0xbf8d, 0xb273, 0x4190, 0x3d1e, 0x415c, 0xba38, 0xbfc0, 0x13f8, 0x4117, 0xba3e, 0xb274, 0xbfb5, 0x4077, 0xb279, 0x4009, 0x3ac8, 0xaa7c, 0x0983, 0xbf8b, 0xba24, 0xb27b, 0x1e7e, 0xb0d1, 0x42c2, 0xaba6, 0xba50, 0x1eea, 0x056b, 0xa171, 0x43b3, 0x35ca, 0xb0e3, 0xb0c5, 0x08e0, 0xb22e, 0x414b, 0x41e6, 0x40bc, 0x2800, 0x402f, 0x409f, 0x164c, 0x44b3, 0x4154, 0x4158, 0x418a, 0x4028, 0xbf94, 0xb28b, 0xaff1, 0x41ec, 0x0d8d, 0x41a2, 0x1b3b, 0xaf95, 0xba4a, 0x1ee5, 0x40cd, 0x1840, 0xae03, 0xb0bc, 0x4643, 0x434f, 0x0c96, 0xba07, 0x3748, 0x46d8, 0xbf26, 0x4195, 0x0b00, 0x41ab, 0x4315, 0x405a, 0x4145, 0x14f4, 0xa261, 0x42dc, 0x3318, 0x424c, 0x1fdc, 0x0500, 0x1acf, 0xba4d, 0x1f49, 0x40c1, 0x1825, 0x42cf, 0x4175, 0x4097, 0x293b, 0xba0d, 0x4014, 0x207a, 0x407d, 0x4361, 0x437a, 0xbf4b, 0x4086, 0x41a0, 0x3c12, 0xb0ca, 0x460c, 0x4162, 0xb24d, 0x425e, 0xb2cd, 0x0dcb, 0x13ba, 0x40c2, 0x41af, 0x29cb, 0x0956, 0x41aa, 0xb216, 0x4112, 0x4349, 0x4431, 0x2734, 0x422e, 0xbf2a, 0x40b8, 0x4649, 0xb068, 0x438c, 0x426d, 0xabc5, 0xb0a7, 0xbf9c, 0x4671, 0x42e1, 0x43ee, 0xb02a, 0x4217, 0xb0ce, 0x4026, 0x4269, 0x4374, 0x3931, 0x02f5, 0x42c6, 0x43aa, 0x2532, 0x2c53, 0x4231, 0xb2dd, 0x43a9, 0x1c6d, 0x4274, 0x2948, 0x4162, 0xbfa3, 0x427f, 0xb01c, 0x0396, 0x4174, 0x1327, 0x36ab, 0x41f4, 0x41b6, 0x3fda, 0x4648, 0x4095, 0x1c98, 0x41a0, 0xbf56, 0x4144, 0xb0dd, 0xb28c, 0x42d5, 0x4280, 0xbf81, 0xaccd, 0x45ee, 0x4145, 0x4342, 0xbfb7, 0x4261, 0xba45, 0xb01f, 0x418a, 0x439f, 0x42bf, 0x43fc, 0xba22, 0xbfe0, 0x2446, 0xbfde, 0x1c19, 0xb0f5, 0xba68, 0x1b4a, 0x00d7, 0x4377, 0x425d, 0x46db, 0x411e, 0xb2b8, 0x406a, 0x1945, 0x43b9, 0xa423, 0x42af, 0xbf76, 0x412e, 0x1fa8, 0xb25f, 0x4591, 0xb27f, 0x461b, 0x41e3, 0x0cc4, 0x0236, 0x4157, 0x288b, 0x05d7, 0xbf87, 0xba66, 0x43bf, 0xba33, 0x18c4, 0x416c, 0xbacb, 0x0077, 0x398d, 0x414d, 0x1fc4, 0x447d, 0xbaef, 0xb2a8, 0x1833, 0xba42, 0xbf51, 0x41c6, 0x43ae, 0x420b, 0x2a87, 0x437e, 0x4206, 0x42ff, 0x4221, 0xa594, 0x2023, 0x4311, 0xb241, 0x416f, 0x40e2, 0x0418, 0x422b, 0x43c2, 0x4385, 0xbf81, 0xb284, 0x408d, 0x40ee, 0x4377, 0x43b3, 0x416d, 0x4353, 0x432b, 0x44a1, 0x43d3, 0xbf81, 0xbaf1, 0x40a6, 0x42c2, 0x0cf8, 0x4068, 0x1ff8, 0xb231, 0x41f9, 0x430f, 0x43a0, 0x1705, 0x0110, 0x09ac, 0xbace, 0x4230, 0x46d4, 0xaec3, 0x4353, 0x416e, 0xb20e, 0x43fc, 0xba7d, 0xbf17, 0x41b0, 0x33b5, 0xba1c, 0x4046, 0x400a, 0xbf8f, 0xb0bd, 0x42d2, 0xacb0, 0x1ddc, 0xb2f1, 0x40a3, 0x4082, 0x4318, 0x2d71, 0x19ec, 0xb0fd, 0x4336, 0xb2cd, 0x40cc, 0xaba4, 0x1a86, 0x42f0, 0x4668, 0x38ff, 0x1e05, 0x4040, 0x184a, 0x4015, 0xbf38, 0x4242, 0x4626, 0xad8d, 0x43c2, 0xb277, 0x4030, 0xbae2, 0x41a5, 0x4215, 0x1513, 0xbf6a, 0x4142, 0x43ba, 0x44f0, 0x4178, 0x2703, 0x428d, 0x42c0, 0x2ffb, 0x438b, 0x42cd, 0x40b5, 0x4435, 0x445d, 0xa385, 0x4082, 0x4148, 0xb2eb, 0x022f, 0x423b, 0x42f5, 0xbf5f, 0x04f0, 0xb098, 0x40a5, 0xba1f, 0x44c1, 0x3b57, 0x4094, 0x41ed, 0xb208, 0x3d9b, 0x0060, 0xb0d1, 0x4352, 0x2507, 0x4282, 0x4273, 0xa9fa, 0xa561, 0xb2b5, 0x3a86, 0x4076, 0xa2e9, 0xbfc3, 0x2a84, 0xbad6, 0xba74, 0x4361, 0x074c, 0x4169, 0xba42, 0xb086, 0xb070, 0xb23e, 0x3b35, 0x387f, 0x4303, 0x1fb5, 0x4267, 0xba3a, 0xbade, 0xbfa8, 0x41aa, 0x41e6, 0xbf80, 0x43fb, 0xbf90, 0x1deb, 0x43bc, 0x4019, 0xb21d, 0x409f, 0xb24c, 0x197a, 0x4264, 0xb2c1, 0xba06, 0xba7d, 0xb00e, 0x43e2, 0x4624, 0xabe7, 0x4348, 0x42b3, 0xbfc5, 0xb209, 0x40ef, 0x43e5, 0x3ada, 0x3431, 0x414a, 0x41de, 0x136c, 0xb01d, 0x413b, 0xba68, 0xbfa0, 0x1ecb, 0x402f, 0x43df, 0x43ca, 0x1de1, 0xbf34, 0x1d54, 0x2ffe, 0x43bf, 0x1dcb, 0x41fd, 0x438d, 0xb2c1, 0xbf8c, 0xaf57, 0x46d3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x83fd023f, 0x982a2ada, 0x932883b1, 0x8b07a16b, 0x6509d713, 0x387a315c, 0x306e7acf, 0x817d06d5, 0xc0872b3a, 0x0acac3f9, 0x3a05fe03, 0x78554f05, 0x868e89dd, 0x6a74d709, 0x00000000, 0x400001f0 }, - FinalRegs = new uint[] { 0x80000000, 0x00000000, 0xffffff4a, 0x0000040e, 0xffffff4f, 0x00800000, 0x5a9b0180, 0x00000000, 0x78554db0, 0x8204e12c, 0x3a05fe03, 0x3a05fe03, 0x3a05fe03, 0x6a74d1d9, 0x00000000, 0x000001d0 }, + Instructions = [0xbac5, 0x426b, 0x16bc, 0x2d44, 0x43aa, 0xbf7b, 0x43f8, 0x42b9, 0x458b, 0x1f7e, 0xb0ac, 0xb292, 0x42e3, 0xb251, 0xb2dd, 0x1b86, 0x35fd, 0x410c, 0xac53, 0x3357, 0x35fb, 0x4355, 0x413e, 0xb2b9, 0x42f8, 0xbfa3, 0x408f, 0x1d27, 0xb0dd, 0xbf70, 0x2c41, 0x1bb6, 0xbf0d, 0xb208, 0x2cad, 0xb296, 0x4132, 0x4119, 0x411d, 0x403a, 0x4332, 0xb2cb, 0xbac4, 0x4074, 0x403d, 0x18a4, 0x45ae, 0x42c9, 0xb043, 0xb0b4, 0x40c4, 0xba53, 0x409b, 0xbf63, 0x1a75, 0xb040, 0x4166, 0x3f7e, 0xa55e, 0x428d, 0x4235, 0x459c, 0x42d5, 0x4111, 0x42dc, 0x43ca, 0x4049, 0x4091, 0x29d5, 0xbf61, 0x40cd, 0x422d, 0x4170, 0x4541, 0x1062, 0x1cf3, 0x4248, 0x422e, 0x1cdc, 0xabfc, 0xa3f2, 0x0677, 0x28d6, 0x143c, 0xb2d6, 0xba55, 0xb261, 0x41f7, 0x439c, 0x2b7b, 0x1c82, 0xb008, 0x2432, 0xbf62, 0xa8ee, 0x37a9, 0x1e86, 0xa85b, 0xb25c, 0x434c, 0xbf96, 0x423e, 0x4093, 0x44e1, 0x42ff, 0x41bf, 0xa8c3, 0x43cb, 0x3a77, 0x2b99, 0x0976, 0x3160, 0x4030, 0xb2db, 0xba36, 0x3ef4, 0x4617, 0x1ab5, 0x02d3, 0xb018, 0x43ad, 0x40cd, 0xbf89, 0x4390, 0x15d6, 0x4255, 0x46dc, 0xac0e, 0x11b4, 0xbf05, 0xac46, 0x4392, 0xbac5, 0x1842, 0x40df, 0x4113, 0x4126, 0x1cac, 0x3e49, 0x4051, 0xb2cf, 0x43b7, 0xbf78, 0x07e7, 0xb210, 0xb26b, 0x1f7b, 0x03b0, 0x42db, 0x2d35, 0x43eb, 0xb23a, 0x418a, 0xaddb, 0x1c63, 0xbf33, 0x35a5, 0x4349, 0x0da2, 0x428e, 0x4132, 0x40f8, 0xba40, 0x41e8, 0x40e8, 0x2f5d, 0x417c, 0x1bc0, 0x41b3, 0xaa64, 0x1b12, 0x0f9c, 0x435b, 0x2204, 0x42d7, 0x19ce, 0x4059, 0x40b3, 0xad3a, 0x43a1, 0x44b9, 0x42f0, 0xb2d8, 0x2938, 0xbf8c, 0x0c53, 0x41c7, 0x4177, 0xbaca, 0x40a7, 0x4607, 0x4238, 0x4100, 0x14e5, 0x4271, 0x4148, 0x24b6, 0x108d, 0xb234, 0xafb1, 0x20a6, 0xbf2e, 0x1ff8, 0xba48, 0x42a8, 0x43a6, 0x40f7, 0x3723, 0x1e21, 0x4004, 0x14b3, 0xbae8, 0x43f2, 0x4223, 0xa5a7, 0x4021, 0xbf60, 0xb2dd, 0xb2fa, 0x4144, 0xb284, 0x135c, 0xbf8b, 0x40a8, 0x4238, 0xb26e, 0x42b4, 0x43c5, 0x3a5f, 0x43e5, 0x2fe1, 0xbf5e, 0x039d, 0x3102, 0x4076, 0x40ec, 0x1e43, 0xbfc1, 0x1f10, 0x212d, 0xa889, 0xb2af, 0x1ccd, 0xb22b, 0x4373, 0x09c1, 0xbf49, 0x40ab, 0xb2f7, 0x4037, 0xb28e, 0x41fd, 0x0334, 0x1a33, 0x41ce, 0x462f, 0x41a4, 0x4181, 0x1ac3, 0xbf46, 0xb054, 0xaf5f, 0x41f6, 0x3343, 0x42e6, 0x4281, 0x0710, 0x0255, 0x41fa, 0x43ca, 0x1bf1, 0x4138, 0x2a43, 0x4388, 0xb0b1, 0xb2d3, 0x41ef, 0x43f1, 0x4090, 0x4195, 0x4151, 0x15b9, 0x1eb1, 0x1923, 0x1b16, 0x4352, 0xbfde, 0x42e7, 0x4130, 0xb248, 0x43a6, 0x460a, 0xbf39, 0x1a10, 0x4375, 0x4089, 0xbacc, 0x26f9, 0x4582, 0xbf6d, 0xb20a, 0xba36, 0x41c7, 0xb22a, 0xb05e, 0xba3f, 0x1ffe, 0x34c2, 0xb244, 0x2181, 0xb2f0, 0x3c08, 0x08a6, 0xba2d, 0x4221, 0x33fb, 0x4162, 0x439d, 0x43e9, 0x1eb8, 0x430e, 0x1f07, 0xbadb, 0xba6e, 0x02d2, 0xbf4e, 0xb294, 0xb2a7, 0xba6c, 0x41a4, 0x4647, 0xb231, 0x41c2, 0xb29e, 0x0648, 0x0ca8, 0x4273, 0x425d, 0xbf33, 0xa38e, 0xba5e, 0x407a, 0x1415, 0x3523, 0x4023, 0x2600, 0x4029, 0x426a, 0xb25a, 0xb2c1, 0x1b6e, 0x42aa, 0x4040, 0xb2bd, 0xab1b, 0x40de, 0xb05c, 0x427f, 0xbf2e, 0xb004, 0xba52, 0x1b44, 0x413d, 0x4147, 0x41a7, 0xbac9, 0xb27d, 0x1c52, 0x42aa, 0x1c6e, 0x43d7, 0xb04a, 0x4676, 0x1f18, 0x41fe, 0x42db, 0x4252, 0xbf4d, 0xb098, 0x3625, 0xb29f, 0x43c0, 0xa08e, 0xbf8c, 0x4317, 0xba78, 0x40ae, 0x3641, 0x42c7, 0xaf31, 0x40ae, 0x4360, 0x4066, 0x1a32, 0x4138, 0xba1f, 0xba21, 0x23aa, 0xba5f, 0x45e9, 0xba0c, 0xbfc6, 0xb2ad, 0x4389, 0x0aea, 0x0da6, 0x17ad, 0x1de4, 0x4247, 0x4040, 0xb2e0, 0x43d1, 0x1a71, 0xb088, 0xba62, 0x4034, 0x4077, 0x40dc, 0x1a7b, 0x05a4, 0xba3d, 0x4424, 0xbf55, 0xbfb0, 0x1408, 0x408c, 0x43c3, 0x42dd, 0x4464, 0xa818, 0x1161, 0x19ea, 0xb0ce, 0x24ce, 0xb2af, 0x15fa, 0x027b, 0xba01, 0xa369, 0x014f, 0x4036, 0x43ed, 0x40e5, 0x320e, 0x4214, 0xbaed, 0x275f, 0x400c, 0xba13, 0xa866, 0xbfb0, 0x41b7, 0xbfcd, 0x2c19, 0xbaea, 0x421e, 0xb296, 0xbf42, 0x42cc, 0x1726, 0xb08d, 0x4314, 0xbf87, 0x4107, 0x0425, 0x4586, 0x3b4d, 0x40c1, 0xbafc, 0xb0d5, 0xbf1e, 0x0b9a, 0xba4c, 0xb0e4, 0x3056, 0xbf80, 0xafd4, 0xb2fb, 0x4395, 0x4669, 0xb296, 0x1914, 0x4009, 0x2ac8, 0x4102, 0x4116, 0x40c1, 0x4130, 0x4493, 0x1bc0, 0xb250, 0x463b, 0x0469, 0x424b, 0x1b6b, 0x3e46, 0xb2fa, 0x4151, 0xbfac, 0x44d9, 0x1c7a, 0x1a00, 0x420b, 0xbaf5, 0x407e, 0xb21e, 0xad7b, 0x425c, 0xbf7a, 0x1db5, 0xae92, 0x1b35, 0x1ea1, 0x2cf5, 0x1af1, 0x4210, 0xbaf4, 0x42a0, 0x4124, 0x41dd, 0x4215, 0x13b4, 0x43e6, 0xbfa4, 0x416b, 0x1e6a, 0xbfc0, 0x0d58, 0x40c0, 0x454e, 0x0202, 0x40b5, 0xb276, 0x4333, 0x4574, 0xa2ac, 0x2a76, 0x425d, 0x40fc, 0x40da, 0xba47, 0x2428, 0xbf19, 0xb2a3, 0xb269, 0x2843, 0x3a89, 0x1f48, 0xbf7f, 0x416c, 0x4208, 0x4356, 0x43f2, 0xbae5, 0xb274, 0x4037, 0xb237, 0xaa79, 0x42d2, 0x1d34, 0x426f, 0xb236, 0x43a3, 0x4200, 0xbf60, 0x18b8, 0x1d7f, 0xbf8d, 0xb273, 0x4190, 0x3d1e, 0x415c, 0xba38, 0xbfc0, 0x13f8, 0x4117, 0xba3e, 0xb274, 0xbfb5, 0x4077, 0xb279, 0x4009, 0x3ac8, 0xaa7c, 0x0983, 0xbf8b, 0xba24, 0xb27b, 0x1e7e, 0xb0d1, 0x42c2, 0xaba6, 0xba50, 0x1eea, 0x056b, 0xa171, 0x43b3, 0x35ca, 0xb0e3, 0xb0c5, 0x08e0, 0xb22e, 0x414b, 0x41e6, 0x40bc, 0x2800, 0x402f, 0x409f, 0x164c, 0x44b3, 0x4154, 0x4158, 0x418a, 0x4028, 0xbf94, 0xb28b, 0xaff1, 0x41ec, 0x0d8d, 0x41a2, 0x1b3b, 0xaf95, 0xba4a, 0x1ee5, 0x40cd, 0x1840, 0xae03, 0xb0bc, 0x4643, 0x434f, 0x0c96, 0xba07, 0x3748, 0x46d8, 0xbf26, 0x4195, 0x0b00, 0x41ab, 0x4315, 0x405a, 0x4145, 0x14f4, 0xa261, 0x42dc, 0x3318, 0x424c, 0x1fdc, 0x0500, 0x1acf, 0xba4d, 0x1f49, 0x40c1, 0x1825, 0x42cf, 0x4175, 0x4097, 0x293b, 0xba0d, 0x4014, 0x207a, 0x407d, 0x4361, 0x437a, 0xbf4b, 0x4086, 0x41a0, 0x3c12, 0xb0ca, 0x460c, 0x4162, 0xb24d, 0x425e, 0xb2cd, 0x0dcb, 0x13ba, 0x40c2, 0x41af, 0x29cb, 0x0956, 0x41aa, 0xb216, 0x4112, 0x4349, 0x4431, 0x2734, 0x422e, 0xbf2a, 0x40b8, 0x4649, 0xb068, 0x438c, 0x426d, 0xabc5, 0xb0a7, 0xbf9c, 0x4671, 0x42e1, 0x43ee, 0xb02a, 0x4217, 0xb0ce, 0x4026, 0x4269, 0x4374, 0x3931, 0x02f5, 0x42c6, 0x43aa, 0x2532, 0x2c53, 0x4231, 0xb2dd, 0x43a9, 0x1c6d, 0x4274, 0x2948, 0x4162, 0xbfa3, 0x427f, 0xb01c, 0x0396, 0x4174, 0x1327, 0x36ab, 0x41f4, 0x41b6, 0x3fda, 0x4648, 0x4095, 0x1c98, 0x41a0, 0xbf56, 0x4144, 0xb0dd, 0xb28c, 0x42d5, 0x4280, 0xbf81, 0xaccd, 0x45ee, 0x4145, 0x4342, 0xbfb7, 0x4261, 0xba45, 0xb01f, 0x418a, 0x439f, 0x42bf, 0x43fc, 0xba22, 0xbfe0, 0x2446, 0xbfde, 0x1c19, 0xb0f5, 0xba68, 0x1b4a, 0x00d7, 0x4377, 0x425d, 0x46db, 0x411e, 0xb2b8, 0x406a, 0x1945, 0x43b9, 0xa423, 0x42af, 0xbf76, 0x412e, 0x1fa8, 0xb25f, 0x4591, 0xb27f, 0x461b, 0x41e3, 0x0cc4, 0x0236, 0x4157, 0x288b, 0x05d7, 0xbf87, 0xba66, 0x43bf, 0xba33, 0x18c4, 0x416c, 0xbacb, 0x0077, 0x398d, 0x414d, 0x1fc4, 0x447d, 0xbaef, 0xb2a8, 0x1833, 0xba42, 0xbf51, 0x41c6, 0x43ae, 0x420b, 0x2a87, 0x437e, 0x4206, 0x42ff, 0x4221, 0xa594, 0x2023, 0x4311, 0xb241, 0x416f, 0x40e2, 0x0418, 0x422b, 0x43c2, 0x4385, 0xbf81, 0xb284, 0x408d, 0x40ee, 0x4377, 0x43b3, 0x416d, 0x4353, 0x432b, 0x44a1, 0x43d3, 0xbf81, 0xbaf1, 0x40a6, 0x42c2, 0x0cf8, 0x4068, 0x1ff8, 0xb231, 0x41f9, 0x430f, 0x43a0, 0x1705, 0x0110, 0x09ac, 0xbace, 0x4230, 0x46d4, 0xaec3, 0x4353, 0x416e, 0xb20e, 0x43fc, 0xba7d, 0xbf17, 0x41b0, 0x33b5, 0xba1c, 0x4046, 0x400a, 0xbf8f, 0xb0bd, 0x42d2, 0xacb0, 0x1ddc, 0xb2f1, 0x40a3, 0x4082, 0x4318, 0x2d71, 0x19ec, 0xb0fd, 0x4336, 0xb2cd, 0x40cc, 0xaba4, 0x1a86, 0x42f0, 0x4668, 0x38ff, 0x1e05, 0x4040, 0x184a, 0x4015, 0xbf38, 0x4242, 0x4626, 0xad8d, 0x43c2, 0xb277, 0x4030, 0xbae2, 0x41a5, 0x4215, 0x1513, 0xbf6a, 0x4142, 0x43ba, 0x44f0, 0x4178, 0x2703, 0x428d, 0x42c0, 0x2ffb, 0x438b, 0x42cd, 0x40b5, 0x4435, 0x445d, 0xa385, 0x4082, 0x4148, 0xb2eb, 0x022f, 0x423b, 0x42f5, 0xbf5f, 0x04f0, 0xb098, 0x40a5, 0xba1f, 0x44c1, 0x3b57, 0x4094, 0x41ed, 0xb208, 0x3d9b, 0x0060, 0xb0d1, 0x4352, 0x2507, 0x4282, 0x4273, 0xa9fa, 0xa561, 0xb2b5, 0x3a86, 0x4076, 0xa2e9, 0xbfc3, 0x2a84, 0xbad6, 0xba74, 0x4361, 0x074c, 0x4169, 0xba42, 0xb086, 0xb070, 0xb23e, 0x3b35, 0x387f, 0x4303, 0x1fb5, 0x4267, 0xba3a, 0xbade, 0xbfa8, 0x41aa, 0x41e6, 0xbf80, 0x43fb, 0xbf90, 0x1deb, 0x43bc, 0x4019, 0xb21d, 0x409f, 0xb24c, 0x197a, 0x4264, 0xb2c1, 0xba06, 0xba7d, 0xb00e, 0x43e2, 0x4624, 0xabe7, 0x4348, 0x42b3, 0xbfc5, 0xb209, 0x40ef, 0x43e5, 0x3ada, 0x3431, 0x414a, 0x41de, 0x136c, 0xb01d, 0x413b, 0xba68, 0xbfa0, 0x1ecb, 0x402f, 0x43df, 0x43ca, 0x1de1, 0xbf34, 0x1d54, 0x2ffe, 0x43bf, 0x1dcb, 0x41fd, 0x438d, 0xb2c1, 0xbf8c, 0xaf57, 0x46d3, 0x4770, 0xe7fe + ], + StartRegs = [0x83fd023f, 0x982a2ada, 0x932883b1, 0x8b07a16b, 0x6509d713, 0x387a315c, 0x306e7acf, 0x817d06d5, 0xc0872b3a, 0x0acac3f9, 0x3a05fe03, 0x78554f05, 0x868e89dd, 0x6a74d709, 0x00000000, 0x400001f0 + ], + FinalRegs = [0x80000000, 0x00000000, 0xffffff4a, 0x0000040e, 0xffffff4f, 0x00800000, 0x5a9b0180, 0x00000000, 0x78554db0, 0x8204e12c, 0x3a05fe03, 0x3a05fe03, 0x3a05fe03, 0x6a74d1d9, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x3ec5, 0x42d3, 0x06b4, 0xbf80, 0x430d, 0x40b3, 0x3a02, 0x43fd, 0x1ef3, 0x4051, 0x426b, 0xa108, 0xbf48, 0xba7c, 0xba08, 0x2831, 0xb055, 0xbad1, 0xb278, 0x0b30, 0xbff0, 0xa224, 0x1beb, 0x24d4, 0x1873, 0xb2c9, 0x44d9, 0x1eb9, 0x4086, 0xb2b6, 0x4172, 0x40e2, 0x1f7c, 0x403a, 0xbf9c, 0xa542, 0x19da, 0x429c, 0x42c9, 0x431d, 0x1d07, 0xb059, 0x3791, 0x306d, 0xa7cc, 0xb28a, 0x43c8, 0xbf62, 0xb02d, 0xba06, 0x1b78, 0x21ea, 0x41b6, 0xbfae, 0x0ca8, 0x1ae7, 0x4307, 0x39e3, 0x1e5e, 0x03f8, 0x04c8, 0x427d, 0x0676, 0x3256, 0x1b57, 0xb080, 0xb2cb, 0x418d, 0xb2ae, 0xbf51, 0x412f, 0xba3c, 0x1916, 0x4198, 0x40da, 0x3425, 0x43bb, 0x4339, 0xbf59, 0x42ff, 0x3058, 0x4108, 0xba09, 0x1c3b, 0x1f5b, 0x3703, 0x404a, 0x4259, 0x40b3, 0x40a8, 0x3e59, 0xa7ab, 0xbf66, 0x404f, 0x42bc, 0xbaf0, 0x22c3, 0xbfc0, 0xb03d, 0x4018, 0x1a56, 0x4383, 0x4446, 0x42c1, 0xb292, 0x246e, 0x4426, 0x1aec, 0x1fa7, 0xbf07, 0x3231, 0x4116, 0x1177, 0x45c6, 0x3f2b, 0xa87c, 0x4170, 0xba41, 0x436e, 0x4012, 0x4553, 0xadc9, 0xae57, 0x4034, 0xbaf0, 0xa094, 0x293a, 0x412d, 0x4145, 0xbfc7, 0xb0ed, 0x164e, 0x2376, 0x19ae, 0x404e, 0x338a, 0x42a5, 0xbad0, 0xb275, 0x4217, 0x40c3, 0x40a8, 0x4015, 0x1ce6, 0xb2f5, 0x435d, 0x403b, 0xaaed, 0x41e0, 0x1b07, 0x4390, 0x08eb, 0x2e05, 0x41c0, 0x193f, 0x421f, 0x2648, 0x4074, 0xa3c0, 0xbf0d, 0x0eb2, 0x29cd, 0x403b, 0xafe2, 0xba0a, 0xbff0, 0x40db, 0x1f18, 0xba01, 0xbf90, 0xb0e6, 0xb096, 0xbaf6, 0xbf90, 0x18a5, 0xbfbb, 0x40eb, 0x1d3b, 0x4150, 0x1993, 0xbf9d, 0x413c, 0xb2e0, 0x1b5d, 0x415a, 0xb244, 0x0152, 0xb2ed, 0x19ce, 0xba30, 0xba2e, 0xb277, 0xb271, 0x0387, 0xa74d, 0x4088, 0x4141, 0x4226, 0xbf5c, 0x46e2, 0x0897, 0x41c1, 0x428a, 0xb272, 0x1e00, 0x42d3, 0xb297, 0xba46, 0x40e1, 0x18fb, 0xbf0b, 0xba08, 0xb222, 0xbfb0, 0xbacf, 0x1a87, 0x428a, 0x42ee, 0x414c, 0x4606, 0x4375, 0x45db, 0x4171, 0x40f1, 0xb297, 0x4133, 0x3d66, 0x4206, 0x43ec, 0x43f8, 0xbf2e, 0xbfc0, 0xba27, 0x43ef, 0x407f, 0xbaef, 0x4306, 0x4350, 0x1e3c, 0x4085, 0xb25f, 0x4039, 0xb2dd, 0x40e1, 0x462b, 0x4633, 0x4048, 0x17ca, 0xba44, 0xbfa3, 0x4208, 0xb282, 0xba26, 0xb2da, 0x00d2, 0x4151, 0x40f7, 0x42e9, 0x4203, 0xba5a, 0x203f, 0x465b, 0xb20a, 0xbfdc, 0xa24b, 0x2188, 0x144b, 0xbfc0, 0x4001, 0xbf74, 0x41c4, 0x15cf, 0x42fc, 0x4269, 0xaad7, 0x4353, 0x308d, 0xb27f, 0x4242, 0x4276, 0x43b6, 0x4243, 0xa999, 0xba34, 0xa8cb, 0xbfe8, 0xb0e3, 0x40c0, 0x402e, 0xb22d, 0xb06b, 0x1b53, 0xb0bb, 0x447f, 0x459a, 0x4083, 0x31f0, 0xb018, 0x3814, 0x43e1, 0x1c61, 0x417d, 0xa3ab, 0xbac9, 0x0d83, 0xa3e9, 0xbfcb, 0x1c34, 0x0847, 0x012c, 0x34c5, 0x412f, 0xb21c, 0x4286, 0xb24c, 0x40eb, 0x1dc0, 0x4006, 0x437d, 0xb01b, 0xbf45, 0x38bb, 0x4092, 0x41ab, 0xb283, 0x424c, 0xb036, 0xa4ec, 0x1f66, 0x1f00, 0xbac8, 0xbf8a, 0x42d7, 0x42aa, 0x4140, 0x09ec, 0x183a, 0x1e06, 0x405c, 0xb05b, 0xb0ef, 0x1d87, 0x1807, 0x41bf, 0x411c, 0x4168, 0xbf19, 0xb050, 0xad8f, 0x1cd4, 0x0d12, 0x411f, 0x4071, 0x187d, 0xa451, 0x4354, 0x4170, 0x17d0, 0x419b, 0x41ca, 0x4293, 0x1d2e, 0x41e0, 0x4131, 0xba25, 0xbf4c, 0x4313, 0x22f1, 0xbf91, 0x4601, 0xb2d8, 0x39d6, 0xb2d3, 0x1e51, 0x46c0, 0xba66, 0x2408, 0xb0aa, 0xb0b7, 0xbf5d, 0xbfc0, 0x438d, 0x24bb, 0x23a9, 0x4285, 0x1d19, 0x431b, 0xa1e4, 0x43b2, 0x1015, 0xbad8, 0x408d, 0x40c5, 0x401d, 0xbf77, 0xb0a3, 0x40d9, 0x3dd4, 0x4291, 0xb2ad, 0x4611, 0x4243, 0x42d3, 0x4274, 0x430f, 0x1f8f, 0x4458, 0xbf43, 0xbaf1, 0xb05f, 0xba34, 0xb2bd, 0xb2f2, 0xa7ef, 0x4368, 0xb2b9, 0xbfae, 0xbf00, 0xbad8, 0xbaf8, 0x40f2, 0x403e, 0xbf3d, 0xbaff, 0x4352, 0xb0b8, 0x414a, 0xa4e6, 0x1278, 0x419d, 0x41be, 0x1ef6, 0x4611, 0xb240, 0x4300, 0x4151, 0xba3a, 0x2800, 0x40c0, 0x40f1, 0x433b, 0x1e6b, 0xbf83, 0x40e0, 0x43cc, 0xb089, 0x42ff, 0xafd5, 0x4288, 0x1bd6, 0xbfc0, 0xb2e9, 0x403b, 0x40e1, 0x1ff6, 0x408d, 0xb284, 0x40f6, 0x41eb, 0x1c1c, 0x411c, 0x439d, 0x4546, 0x418d, 0xb288, 0x4026, 0x31bb, 0xbfb9, 0xb032, 0x421e, 0x0492, 0x4349, 0xac8e, 0xb272, 0x40d2, 0x4017, 0xbf90, 0xbf00, 0x2e71, 0xba43, 0x421b, 0x4094, 0x4223, 0xbf49, 0xb2a3, 0xb286, 0x02b5, 0x424a, 0x426f, 0xb21c, 0xb277, 0x4137, 0x43fe, 0xbf4d, 0x418a, 0xba41, 0x05a2, 0x4005, 0xbf34, 0x4591, 0xb209, 0xba3e, 0x418c, 0x4190, 0xb2ab, 0x4243, 0x04ac, 0x40b1, 0x3fd9, 0xbfcf, 0x1bd4, 0xb2b3, 0x42ba, 0xb0e0, 0x1cf2, 0x3fc6, 0x042d, 0xbf26, 0xba72, 0xa972, 0x018f, 0x42e3, 0xab4b, 0xb253, 0x40a4, 0x43bc, 0xbad4, 0x444a, 0xb298, 0x4095, 0x05a4, 0x3e20, 0x41dc, 0xba4d, 0xb29a, 0x4210, 0xba2d, 0x40e4, 0x3b94, 0xbfe0, 0x405d, 0x43cc, 0x4282, 0xbfca, 0x4296, 0x41d1, 0x4319, 0xba33, 0x417f, 0xbfd9, 0xb24d, 0xa08c, 0x405c, 0x4397, 0x4201, 0xb2ff, 0x2561, 0x00f1, 0x3ee1, 0x43d3, 0x4177, 0xb289, 0x407f, 0xbacb, 0x30e3, 0x37a9, 0xba34, 0x432c, 0x43d7, 0x4017, 0x428b, 0xa7e4, 0x42be, 0xbf3c, 0xba26, 0xb25c, 0x414c, 0x3494, 0xaeb7, 0x42f3, 0x1325, 0xbf96, 0x089b, 0xbf60, 0x4147, 0x0189, 0x42fc, 0xbfa4, 0x4137, 0xbac5, 0x1f1c, 0x42ea, 0xb2a0, 0x39d2, 0x1068, 0xb2a7, 0x4371, 0x4086, 0xbad1, 0x418e, 0x211d, 0x1284, 0x0ab4, 0x359e, 0x4161, 0x1eab, 0x0245, 0x430b, 0x42ea, 0xba51, 0x4082, 0x43a9, 0x03f5, 0xa5cb, 0x1316, 0xbf36, 0x4611, 0xbaee, 0xba0a, 0xbfd2, 0x409c, 0xb091, 0x43b3, 0x4248, 0x426e, 0xba02, 0x0db8, 0x1a5b, 0xbfb5, 0x43b0, 0xb2ad, 0x09aa, 0x1205, 0xb266, 0x415b, 0x434d, 0x1fe3, 0xb0a3, 0xbf93, 0x4559, 0x4439, 0x212b, 0x3af6, 0x189c, 0x1be0, 0x4248, 0xb285, 0xbf96, 0x41c3, 0xb254, 0x0c55, 0x4274, 0x3ed3, 0x431c, 0x407a, 0x43fe, 0x1e2d, 0x18a3, 0x4126, 0x42ad, 0x06fe, 0x29b3, 0x144b, 0x4051, 0x4114, 0x1f76, 0x1e83, 0x1855, 0xbadb, 0xbf34, 0xb291, 0xb2d4, 0xb253, 0x414e, 0xb282, 0xba7a, 0x41f3, 0xba13, 0xb20a, 0xbf36, 0x428d, 0x1d7b, 0xbad0, 0xb2bf, 0xb254, 0xb0a6, 0xb078, 0x4053, 0x43d9, 0x4162, 0xb274, 0x41fd, 0x184a, 0x4399, 0x2dd4, 0x4307, 0x40f4, 0xba36, 0x43c2, 0x4197, 0x436c, 0x4203, 0x1fbe, 0xbf31, 0x408d, 0xb2ee, 0x4226, 0x414e, 0xbf3a, 0x23bf, 0x46c9, 0x3892, 0xba42, 0x41b5, 0x1b55, 0x4282, 0x401d, 0x1d0c, 0x1a9c, 0x257a, 0xb2b4, 0x42c1, 0x4201, 0xb23b, 0x43a1, 0x43bd, 0x407e, 0x43d6, 0x1b28, 0x13fb, 0x4064, 0x1cb2, 0x314e, 0x2ae2, 0xba18, 0xbf0b, 0xa9ec, 0x4165, 0x43d1, 0xb2ab, 0x1879, 0xb0fe, 0xb290, 0x380d, 0xb22c, 0x1d2e, 0x17c1, 0x4011, 0x43f2, 0xbf87, 0xba26, 0xb293, 0x1854, 0x34a5, 0xb2f5, 0x43c1, 0x2ea9, 0xa962, 0xb266, 0x0e46, 0xb055, 0x412d, 0x43e8, 0x419a, 0xb23e, 0x1b36, 0x180b, 0x434f, 0x1a50, 0xbac0, 0xbaf0, 0x09f6, 0x18d9, 0xba51, 0xb2ee, 0x32fe, 0x403b, 0x1db0, 0x0fa6, 0xbf97, 0xb26b, 0x4315, 0x42a2, 0xba2a, 0x431b, 0x1a42, 0x1f3a, 0xbf4e, 0x40cc, 0x41da, 0x4109, 0x422d, 0x1bd6, 0x439f, 0xb203, 0xbfd1, 0x462d, 0x404b, 0x420b, 0x4298, 0x153f, 0xb0c7, 0xba66, 0xb258, 0xb27a, 0x417e, 0x1ca0, 0x46f9, 0x0c87, 0x401d, 0x42e3, 0xbacc, 0x2a1c, 0x21ff, 0x4187, 0xb001, 0x4054, 0xbae9, 0xbf98, 0x411c, 0xb27f, 0x2f39, 0x42cc, 0x4602, 0xb07f, 0xb21b, 0x418b, 0x03f0, 0xb021, 0xb03f, 0xbf5a, 0x410c, 0x40ac, 0xa162, 0x4021, 0xba5b, 0xa977, 0x204c, 0x43f6, 0x40a9, 0x1e9c, 0x4283, 0xbf2d, 0x2abd, 0x4249, 0xba02, 0xa9c6, 0x4008, 0x4424, 0x2c94, 0xbf61, 0x18ae, 0xb07d, 0x46c3, 0x185f, 0xb286, 0xb2b7, 0x1ada, 0x4147, 0x403a, 0x2702, 0x4065, 0x404c, 0x4274, 0x42aa, 0x434f, 0xb0a5, 0x4315, 0x0ac8, 0x19eb, 0xa9ea, 0x2541, 0x460f, 0x4634, 0xbf25, 0x436c, 0x42a5, 0xb256, 0x425f, 0xb20d, 0x4225, 0x4669, 0x23f8, 0xab09, 0x43c7, 0x34cf, 0x0f49, 0x415d, 0xba25, 0x4230, 0xac19, 0xb243, 0x42d7, 0x42e5, 0x182d, 0x424d, 0x4213, 0xba2c, 0x1ad0, 0x4301, 0x2446, 0x2b9e, 0xabb5, 0x426d, 0xbfad, 0xa4d2, 0x41c1, 0x1de8, 0x28af, 0xb252, 0x18f0, 0x342f, 0x2d6e, 0xb240, 0x427e, 0xbf5a, 0x41c0, 0x446a, 0x1a36, 0xb223, 0x1b1a, 0x4319, 0xba13, 0x4332, 0x4293, 0x1cc3, 0xb092, 0x4339, 0x41b6, 0x21e9, 0xb237, 0xbaeb, 0xbf06, 0x1d64, 0xa016, 0x41ec, 0x413a, 0x1abc, 0x42fc, 0xb274, 0xb0bc, 0x4016, 0x42d6, 0xb220, 0x43b0, 0x44fa, 0x44cb, 0xbf1c, 0x1ed5, 0x4229, 0x45f4, 0xbf67, 0x4142, 0x1e8e, 0x434c, 0x418e, 0xb0fb, 0x4369, 0x46b2, 0xae1c, 0xbfa6, 0xb294, 0xba4c, 0x0ff8, 0x149e, 0x4201, 0xba72, 0x44a9, 0x465f, 0x42c9, 0xbad2, 0x3fc6, 0x4379, 0x1969, 0x417e, 0x409b, 0x46e8, 0x40a2, 0xba58, 0x1c75, 0x42f0, 0x40ba, 0x12ae, 0x32c5, 0x348d, 0x402a, 0x2812, 0x40e9, 0x41b1, 0xbf89, 0x1914, 0x41ac, 0x07c5, 0x406e, 0x43a2, 0x42f0, 0x1150, 0x3395, 0x3055, 0xbfb6, 0x00f6, 0x40d4, 0x1c99, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x12c1cca9, 0x2d72bbb5, 0x1bcf8ad0, 0x4c840915, 0x42730230, 0xb7a8e9c4, 0xcb0a2f1b, 0xf9eb0e6a, 0x3ce2afc4, 0x2182885a, 0x1ed96c99, 0x0cf55f95, 0xb8e6e008, 0xecaa7d5b, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0x00000055, 0xfffcc2a2, 0x00000001, 0x00000795, 0x79854540, 0x0cf57523, 0x00033d5d, 0x0cf57521, 0xecaa795b, 0x0000164f, 0xffffff17, 0x0cf575e7, 0xb8e6e008, 0xecaa795b, 0x00000000, 0x000001d0 }, + Instructions = [0x3ec5, 0x42d3, 0x06b4, 0xbf80, 0x430d, 0x40b3, 0x3a02, 0x43fd, 0x1ef3, 0x4051, 0x426b, 0xa108, 0xbf48, 0xba7c, 0xba08, 0x2831, 0xb055, 0xbad1, 0xb278, 0x0b30, 0xbff0, 0xa224, 0x1beb, 0x24d4, 0x1873, 0xb2c9, 0x44d9, 0x1eb9, 0x4086, 0xb2b6, 0x4172, 0x40e2, 0x1f7c, 0x403a, 0xbf9c, 0xa542, 0x19da, 0x429c, 0x42c9, 0x431d, 0x1d07, 0xb059, 0x3791, 0x306d, 0xa7cc, 0xb28a, 0x43c8, 0xbf62, 0xb02d, 0xba06, 0x1b78, 0x21ea, 0x41b6, 0xbfae, 0x0ca8, 0x1ae7, 0x4307, 0x39e3, 0x1e5e, 0x03f8, 0x04c8, 0x427d, 0x0676, 0x3256, 0x1b57, 0xb080, 0xb2cb, 0x418d, 0xb2ae, 0xbf51, 0x412f, 0xba3c, 0x1916, 0x4198, 0x40da, 0x3425, 0x43bb, 0x4339, 0xbf59, 0x42ff, 0x3058, 0x4108, 0xba09, 0x1c3b, 0x1f5b, 0x3703, 0x404a, 0x4259, 0x40b3, 0x40a8, 0x3e59, 0xa7ab, 0xbf66, 0x404f, 0x42bc, 0xbaf0, 0x22c3, 0xbfc0, 0xb03d, 0x4018, 0x1a56, 0x4383, 0x4446, 0x42c1, 0xb292, 0x246e, 0x4426, 0x1aec, 0x1fa7, 0xbf07, 0x3231, 0x4116, 0x1177, 0x45c6, 0x3f2b, 0xa87c, 0x4170, 0xba41, 0x436e, 0x4012, 0x4553, 0xadc9, 0xae57, 0x4034, 0xbaf0, 0xa094, 0x293a, 0x412d, 0x4145, 0xbfc7, 0xb0ed, 0x164e, 0x2376, 0x19ae, 0x404e, 0x338a, 0x42a5, 0xbad0, 0xb275, 0x4217, 0x40c3, 0x40a8, 0x4015, 0x1ce6, 0xb2f5, 0x435d, 0x403b, 0xaaed, 0x41e0, 0x1b07, 0x4390, 0x08eb, 0x2e05, 0x41c0, 0x193f, 0x421f, 0x2648, 0x4074, 0xa3c0, 0xbf0d, 0x0eb2, 0x29cd, 0x403b, 0xafe2, 0xba0a, 0xbff0, 0x40db, 0x1f18, 0xba01, 0xbf90, 0xb0e6, 0xb096, 0xbaf6, 0xbf90, 0x18a5, 0xbfbb, 0x40eb, 0x1d3b, 0x4150, 0x1993, 0xbf9d, 0x413c, 0xb2e0, 0x1b5d, 0x415a, 0xb244, 0x0152, 0xb2ed, 0x19ce, 0xba30, 0xba2e, 0xb277, 0xb271, 0x0387, 0xa74d, 0x4088, 0x4141, 0x4226, 0xbf5c, 0x46e2, 0x0897, 0x41c1, 0x428a, 0xb272, 0x1e00, 0x42d3, 0xb297, 0xba46, 0x40e1, 0x18fb, 0xbf0b, 0xba08, 0xb222, 0xbfb0, 0xbacf, 0x1a87, 0x428a, 0x42ee, 0x414c, 0x4606, 0x4375, 0x45db, 0x4171, 0x40f1, 0xb297, 0x4133, 0x3d66, 0x4206, 0x43ec, 0x43f8, 0xbf2e, 0xbfc0, 0xba27, 0x43ef, 0x407f, 0xbaef, 0x4306, 0x4350, 0x1e3c, 0x4085, 0xb25f, 0x4039, 0xb2dd, 0x40e1, 0x462b, 0x4633, 0x4048, 0x17ca, 0xba44, 0xbfa3, 0x4208, 0xb282, 0xba26, 0xb2da, 0x00d2, 0x4151, 0x40f7, 0x42e9, 0x4203, 0xba5a, 0x203f, 0x465b, 0xb20a, 0xbfdc, 0xa24b, 0x2188, 0x144b, 0xbfc0, 0x4001, 0xbf74, 0x41c4, 0x15cf, 0x42fc, 0x4269, 0xaad7, 0x4353, 0x308d, 0xb27f, 0x4242, 0x4276, 0x43b6, 0x4243, 0xa999, 0xba34, 0xa8cb, 0xbfe8, 0xb0e3, 0x40c0, 0x402e, 0xb22d, 0xb06b, 0x1b53, 0xb0bb, 0x447f, 0x459a, 0x4083, 0x31f0, 0xb018, 0x3814, 0x43e1, 0x1c61, 0x417d, 0xa3ab, 0xbac9, 0x0d83, 0xa3e9, 0xbfcb, 0x1c34, 0x0847, 0x012c, 0x34c5, 0x412f, 0xb21c, 0x4286, 0xb24c, 0x40eb, 0x1dc0, 0x4006, 0x437d, 0xb01b, 0xbf45, 0x38bb, 0x4092, 0x41ab, 0xb283, 0x424c, 0xb036, 0xa4ec, 0x1f66, 0x1f00, 0xbac8, 0xbf8a, 0x42d7, 0x42aa, 0x4140, 0x09ec, 0x183a, 0x1e06, 0x405c, 0xb05b, 0xb0ef, 0x1d87, 0x1807, 0x41bf, 0x411c, 0x4168, 0xbf19, 0xb050, 0xad8f, 0x1cd4, 0x0d12, 0x411f, 0x4071, 0x187d, 0xa451, 0x4354, 0x4170, 0x17d0, 0x419b, 0x41ca, 0x4293, 0x1d2e, 0x41e0, 0x4131, 0xba25, 0xbf4c, 0x4313, 0x22f1, 0xbf91, 0x4601, 0xb2d8, 0x39d6, 0xb2d3, 0x1e51, 0x46c0, 0xba66, 0x2408, 0xb0aa, 0xb0b7, 0xbf5d, 0xbfc0, 0x438d, 0x24bb, 0x23a9, 0x4285, 0x1d19, 0x431b, 0xa1e4, 0x43b2, 0x1015, 0xbad8, 0x408d, 0x40c5, 0x401d, 0xbf77, 0xb0a3, 0x40d9, 0x3dd4, 0x4291, 0xb2ad, 0x4611, 0x4243, 0x42d3, 0x4274, 0x430f, 0x1f8f, 0x4458, 0xbf43, 0xbaf1, 0xb05f, 0xba34, 0xb2bd, 0xb2f2, 0xa7ef, 0x4368, 0xb2b9, 0xbfae, 0xbf00, 0xbad8, 0xbaf8, 0x40f2, 0x403e, 0xbf3d, 0xbaff, 0x4352, 0xb0b8, 0x414a, 0xa4e6, 0x1278, 0x419d, 0x41be, 0x1ef6, 0x4611, 0xb240, 0x4300, 0x4151, 0xba3a, 0x2800, 0x40c0, 0x40f1, 0x433b, 0x1e6b, 0xbf83, 0x40e0, 0x43cc, 0xb089, 0x42ff, 0xafd5, 0x4288, 0x1bd6, 0xbfc0, 0xb2e9, 0x403b, 0x40e1, 0x1ff6, 0x408d, 0xb284, 0x40f6, 0x41eb, 0x1c1c, 0x411c, 0x439d, 0x4546, 0x418d, 0xb288, 0x4026, 0x31bb, 0xbfb9, 0xb032, 0x421e, 0x0492, 0x4349, 0xac8e, 0xb272, 0x40d2, 0x4017, 0xbf90, 0xbf00, 0x2e71, 0xba43, 0x421b, 0x4094, 0x4223, 0xbf49, 0xb2a3, 0xb286, 0x02b5, 0x424a, 0x426f, 0xb21c, 0xb277, 0x4137, 0x43fe, 0xbf4d, 0x418a, 0xba41, 0x05a2, 0x4005, 0xbf34, 0x4591, 0xb209, 0xba3e, 0x418c, 0x4190, 0xb2ab, 0x4243, 0x04ac, 0x40b1, 0x3fd9, 0xbfcf, 0x1bd4, 0xb2b3, 0x42ba, 0xb0e0, 0x1cf2, 0x3fc6, 0x042d, 0xbf26, 0xba72, 0xa972, 0x018f, 0x42e3, 0xab4b, 0xb253, 0x40a4, 0x43bc, 0xbad4, 0x444a, 0xb298, 0x4095, 0x05a4, 0x3e20, 0x41dc, 0xba4d, 0xb29a, 0x4210, 0xba2d, 0x40e4, 0x3b94, 0xbfe0, 0x405d, 0x43cc, 0x4282, 0xbfca, 0x4296, 0x41d1, 0x4319, 0xba33, 0x417f, 0xbfd9, 0xb24d, 0xa08c, 0x405c, 0x4397, 0x4201, 0xb2ff, 0x2561, 0x00f1, 0x3ee1, 0x43d3, 0x4177, 0xb289, 0x407f, 0xbacb, 0x30e3, 0x37a9, 0xba34, 0x432c, 0x43d7, 0x4017, 0x428b, 0xa7e4, 0x42be, 0xbf3c, 0xba26, 0xb25c, 0x414c, 0x3494, 0xaeb7, 0x42f3, 0x1325, 0xbf96, 0x089b, 0xbf60, 0x4147, 0x0189, 0x42fc, 0xbfa4, 0x4137, 0xbac5, 0x1f1c, 0x42ea, 0xb2a0, 0x39d2, 0x1068, 0xb2a7, 0x4371, 0x4086, 0xbad1, 0x418e, 0x211d, 0x1284, 0x0ab4, 0x359e, 0x4161, 0x1eab, 0x0245, 0x430b, 0x42ea, 0xba51, 0x4082, 0x43a9, 0x03f5, 0xa5cb, 0x1316, 0xbf36, 0x4611, 0xbaee, 0xba0a, 0xbfd2, 0x409c, 0xb091, 0x43b3, 0x4248, 0x426e, 0xba02, 0x0db8, 0x1a5b, 0xbfb5, 0x43b0, 0xb2ad, 0x09aa, 0x1205, 0xb266, 0x415b, 0x434d, 0x1fe3, 0xb0a3, 0xbf93, 0x4559, 0x4439, 0x212b, 0x3af6, 0x189c, 0x1be0, 0x4248, 0xb285, 0xbf96, 0x41c3, 0xb254, 0x0c55, 0x4274, 0x3ed3, 0x431c, 0x407a, 0x43fe, 0x1e2d, 0x18a3, 0x4126, 0x42ad, 0x06fe, 0x29b3, 0x144b, 0x4051, 0x4114, 0x1f76, 0x1e83, 0x1855, 0xbadb, 0xbf34, 0xb291, 0xb2d4, 0xb253, 0x414e, 0xb282, 0xba7a, 0x41f3, 0xba13, 0xb20a, 0xbf36, 0x428d, 0x1d7b, 0xbad0, 0xb2bf, 0xb254, 0xb0a6, 0xb078, 0x4053, 0x43d9, 0x4162, 0xb274, 0x41fd, 0x184a, 0x4399, 0x2dd4, 0x4307, 0x40f4, 0xba36, 0x43c2, 0x4197, 0x436c, 0x4203, 0x1fbe, 0xbf31, 0x408d, 0xb2ee, 0x4226, 0x414e, 0xbf3a, 0x23bf, 0x46c9, 0x3892, 0xba42, 0x41b5, 0x1b55, 0x4282, 0x401d, 0x1d0c, 0x1a9c, 0x257a, 0xb2b4, 0x42c1, 0x4201, 0xb23b, 0x43a1, 0x43bd, 0x407e, 0x43d6, 0x1b28, 0x13fb, 0x4064, 0x1cb2, 0x314e, 0x2ae2, 0xba18, 0xbf0b, 0xa9ec, 0x4165, 0x43d1, 0xb2ab, 0x1879, 0xb0fe, 0xb290, 0x380d, 0xb22c, 0x1d2e, 0x17c1, 0x4011, 0x43f2, 0xbf87, 0xba26, 0xb293, 0x1854, 0x34a5, 0xb2f5, 0x43c1, 0x2ea9, 0xa962, 0xb266, 0x0e46, 0xb055, 0x412d, 0x43e8, 0x419a, 0xb23e, 0x1b36, 0x180b, 0x434f, 0x1a50, 0xbac0, 0xbaf0, 0x09f6, 0x18d9, 0xba51, 0xb2ee, 0x32fe, 0x403b, 0x1db0, 0x0fa6, 0xbf97, 0xb26b, 0x4315, 0x42a2, 0xba2a, 0x431b, 0x1a42, 0x1f3a, 0xbf4e, 0x40cc, 0x41da, 0x4109, 0x422d, 0x1bd6, 0x439f, 0xb203, 0xbfd1, 0x462d, 0x404b, 0x420b, 0x4298, 0x153f, 0xb0c7, 0xba66, 0xb258, 0xb27a, 0x417e, 0x1ca0, 0x46f9, 0x0c87, 0x401d, 0x42e3, 0xbacc, 0x2a1c, 0x21ff, 0x4187, 0xb001, 0x4054, 0xbae9, 0xbf98, 0x411c, 0xb27f, 0x2f39, 0x42cc, 0x4602, 0xb07f, 0xb21b, 0x418b, 0x03f0, 0xb021, 0xb03f, 0xbf5a, 0x410c, 0x40ac, 0xa162, 0x4021, 0xba5b, 0xa977, 0x204c, 0x43f6, 0x40a9, 0x1e9c, 0x4283, 0xbf2d, 0x2abd, 0x4249, 0xba02, 0xa9c6, 0x4008, 0x4424, 0x2c94, 0xbf61, 0x18ae, 0xb07d, 0x46c3, 0x185f, 0xb286, 0xb2b7, 0x1ada, 0x4147, 0x403a, 0x2702, 0x4065, 0x404c, 0x4274, 0x42aa, 0x434f, 0xb0a5, 0x4315, 0x0ac8, 0x19eb, 0xa9ea, 0x2541, 0x460f, 0x4634, 0xbf25, 0x436c, 0x42a5, 0xb256, 0x425f, 0xb20d, 0x4225, 0x4669, 0x23f8, 0xab09, 0x43c7, 0x34cf, 0x0f49, 0x415d, 0xba25, 0x4230, 0xac19, 0xb243, 0x42d7, 0x42e5, 0x182d, 0x424d, 0x4213, 0xba2c, 0x1ad0, 0x4301, 0x2446, 0x2b9e, 0xabb5, 0x426d, 0xbfad, 0xa4d2, 0x41c1, 0x1de8, 0x28af, 0xb252, 0x18f0, 0x342f, 0x2d6e, 0xb240, 0x427e, 0xbf5a, 0x41c0, 0x446a, 0x1a36, 0xb223, 0x1b1a, 0x4319, 0xba13, 0x4332, 0x4293, 0x1cc3, 0xb092, 0x4339, 0x41b6, 0x21e9, 0xb237, 0xbaeb, 0xbf06, 0x1d64, 0xa016, 0x41ec, 0x413a, 0x1abc, 0x42fc, 0xb274, 0xb0bc, 0x4016, 0x42d6, 0xb220, 0x43b0, 0x44fa, 0x44cb, 0xbf1c, 0x1ed5, 0x4229, 0x45f4, 0xbf67, 0x4142, 0x1e8e, 0x434c, 0x418e, 0xb0fb, 0x4369, 0x46b2, 0xae1c, 0xbfa6, 0xb294, 0xba4c, 0x0ff8, 0x149e, 0x4201, 0xba72, 0x44a9, 0x465f, 0x42c9, 0xbad2, 0x3fc6, 0x4379, 0x1969, 0x417e, 0x409b, 0x46e8, 0x40a2, 0xba58, 0x1c75, 0x42f0, 0x40ba, 0x12ae, 0x32c5, 0x348d, 0x402a, 0x2812, 0x40e9, 0x41b1, 0xbf89, 0x1914, 0x41ac, 0x07c5, 0x406e, 0x43a2, 0x42f0, 0x1150, 0x3395, 0x3055, 0xbfb6, 0x00f6, 0x40d4, 0x1c99, 0x4770, 0xe7fe + ], + StartRegs = [0x12c1cca9, 0x2d72bbb5, 0x1bcf8ad0, 0x4c840915, 0x42730230, 0xb7a8e9c4, 0xcb0a2f1b, 0xf9eb0e6a, 0x3ce2afc4, 0x2182885a, 0x1ed96c99, 0x0cf55f95, 0xb8e6e008, 0xecaa7d5b, 0x00000000, 0x100001f0 + ], + FinalRegs = [0x00000055, 0xfffcc2a2, 0x00000001, 0x00000795, 0x79854540, 0x0cf57523, 0x00033d5d, 0x0cf57521, 0xecaa795b, 0x0000164f, 0xffffff17, 0x0cf575e7, 0xb8e6e008, 0xecaa795b, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x4393, 0x413f, 0x4166, 0xa433, 0x409c, 0xb2e8, 0x1cc5, 0xba5a, 0xaf1d, 0x4249, 0x158a, 0x400c, 0xbf02, 0xba4d, 0x1b2a, 0x0683, 0x409b, 0x4033, 0x2766, 0xbf00, 0x43bc, 0x4593, 0x4623, 0x40f0, 0xba2d, 0x433c, 0xbfcc, 0x0712, 0xa0ee, 0x301a, 0x400e, 0x4218, 0x428a, 0xa5a0, 0x4362, 0xb28f, 0x4270, 0x3fd6, 0x40b4, 0x2c32, 0x4494, 0xb0e0, 0xba73, 0x2cfd, 0x4118, 0xba2a, 0xb24c, 0x2d2c, 0x1a18, 0x00d8, 0xbacb, 0x4396, 0xbf0b, 0xb244, 0x1eb5, 0x4154, 0xbacc, 0xb258, 0x1b71, 0xbfb7, 0xb2f8, 0xb0c5, 0x01d6, 0xbad7, 0x240f, 0x1dd7, 0x42f5, 0x4691, 0xbfb0, 0x1ca2, 0x15b5, 0x3be3, 0x4127, 0x4122, 0x403e, 0x4065, 0x4314, 0x1a38, 0x1e93, 0xba0d, 0x1ea0, 0xbaf7, 0xa3e8, 0x42c5, 0x1f42, 0xbf1b, 0x40c5, 0x461d, 0xb013, 0x40a2, 0x1903, 0x4388, 0xb090, 0xbfc1, 0x42fe, 0x42a9, 0x4353, 0x41c2, 0xba5c, 0x406b, 0x4351, 0x41ba, 0xbfe0, 0xb254, 0x1057, 0x41ba, 0xba06, 0xb259, 0x067d, 0x40f4, 0xba18, 0x45b0, 0x3200, 0x405a, 0xba03, 0xbfde, 0x4127, 0x4379, 0x400c, 0xb20e, 0x0f5d, 0x41b4, 0x1f75, 0x416d, 0x413c, 0x1d18, 0x3c86, 0x41e6, 0x1d1e, 0xb281, 0x1f3c, 0x4218, 0x40f8, 0xbf29, 0x286f, 0xa620, 0xb2bb, 0x0150, 0xbac4, 0xac02, 0x439c, 0xb0fa, 0x40df, 0x1f98, 0x4316, 0x3d6d, 0x414e, 0x4159, 0xba17, 0xbfb1, 0x1a85, 0x4214, 0x423d, 0x0134, 0x4669, 0xb254, 0xbf95, 0xb2ed, 0x428b, 0x4328, 0x4256, 0x12d9, 0x40cc, 0xb23e, 0xb025, 0x42fe, 0x4022, 0xb0da, 0x42a9, 0xad61, 0x1f53, 0x46f9, 0x4462, 0xba7b, 0x3985, 0x4142, 0xa656, 0x21c4, 0x4255, 0xba64, 0xb20b, 0xa593, 0x43be, 0xbf8f, 0x463b, 0xb038, 0xb030, 0x4055, 0x17ca, 0xbacb, 0x1f67, 0x4055, 0x1923, 0x1a46, 0xb2a0, 0x41af, 0x4285, 0xbfa4, 0x3160, 0x42c8, 0x29ec, 0x1c50, 0x412c, 0xbaec, 0xb225, 0x44d4, 0xba56, 0xb23d, 0xbfdb, 0x275b, 0x415f, 0xb0ea, 0x21fb, 0x40d9, 0x4325, 0xb20c, 0x43d8, 0xa916, 0x4239, 0x438b, 0x418f, 0x4275, 0xb25f, 0x2252, 0xb262, 0x4688, 0x1c27, 0xb234, 0x19e4, 0x41b6, 0xbfb4, 0x3226, 0xa8bd, 0x40b1, 0xb24f, 0x1848, 0x436f, 0x4372, 0x436f, 0x426f, 0xb2b6, 0xba5a, 0xb2c6, 0x2bac, 0x4160, 0x4002, 0x40b0, 0xba46, 0x319b, 0xb251, 0x2a9a, 0x428b, 0x4239, 0x28d5, 0x46e9, 0x4030, 0x4167, 0xbf2e, 0xbf00, 0x41cc, 0xb2e1, 0xba20, 0x4080, 0x1179, 0x4484, 0xbaf4, 0xbf48, 0xb2f8, 0x4320, 0x426b, 0xb2ee, 0x350c, 0xb241, 0x4386, 0x3af4, 0x42b4, 0xa8e5, 0x4369, 0x4315, 0x4110, 0x407b, 0xbaff, 0x419e, 0xbf52, 0x40f2, 0x45b5, 0x41ec, 0x402a, 0xb21b, 0xbf6c, 0xb0ad, 0x40cd, 0x4094, 0xb07c, 0x1fbb, 0x286b, 0x422d, 0x1f2b, 0x401a, 0x42aa, 0x406b, 0x4473, 0x41d8, 0xb08d, 0xba59, 0xb03e, 0x1d7d, 0xaf13, 0x45e8, 0x4169, 0x418a, 0x4366, 0xb001, 0x3913, 0x40ef, 0x40fa, 0xbf74, 0x1bcd, 0x42e7, 0x40cf, 0x1959, 0xb20a, 0xb2ec, 0x1261, 0x40ab, 0x4062, 0x34eb, 0x40fb, 0x4255, 0xb052, 0x40e4, 0x414f, 0x4241, 0xb21f, 0xb2f9, 0x2894, 0x4546, 0x2e67, 0xbf0a, 0x2dcd, 0x3df4, 0x1431, 0x426d, 0x162d, 0xbfd8, 0x4255, 0xbaf2, 0x4263, 0xa5ca, 0x43e9, 0xb06b, 0x2b34, 0xba1b, 0xbf60, 0x42bc, 0x0a25, 0x4584, 0x40f2, 0xb07f, 0x3185, 0xb0b6, 0xbaf2, 0xbf86, 0xafbf, 0xb2a6, 0x10ea, 0x4379, 0x43ec, 0x4291, 0x2f80, 0xb2a8, 0x400b, 0xb2a7, 0x4007, 0xb23c, 0x454b, 0x40ab, 0xbad0, 0xbf84, 0x43ab, 0x4252, 0x40c8, 0x400f, 0x43ae, 0xa451, 0x458e, 0xbae0, 0x4683, 0x412d, 0x3ea7, 0x2233, 0x4564, 0x3aa8, 0x421a, 0x1fc8, 0xa2ab, 0xba49, 0x18b2, 0x2a32, 0x40b7, 0xb25e, 0xba1f, 0xb025, 0xb2d7, 0x41f2, 0xbfe1, 0x1fa1, 0xb0a2, 0x43bd, 0x1812, 0x0fdf, 0xba2f, 0x42e5, 0xb238, 0x197b, 0x1d3f, 0xbfa1, 0x1def, 0x1a08, 0x41f5, 0x352c, 0xb021, 0x1891, 0x004f, 0x427c, 0x402a, 0x41fb, 0x4303, 0x4396, 0x3d52, 0xbac4, 0xba78, 0x40b0, 0x1d86, 0xb249, 0x40c1, 0x4030, 0xbac9, 0xbf3a, 0x412d, 0x4335, 0x3fe3, 0xb2f3, 0x0403, 0xb24c, 0x4194, 0x402f, 0x4245, 0x43a7, 0x4298, 0x2c2c, 0x1d25, 0x0a9b, 0xba72, 0x41f4, 0x4083, 0x1161, 0xba17, 0xac8c, 0x4595, 0x42b2, 0x4457, 0x2b24, 0xba1b, 0x4135, 0xb0ba, 0xbf14, 0x41e8, 0x2741, 0x1bcb, 0x3afa, 0x438c, 0xbf36, 0x4028, 0x40d6, 0x42dd, 0xb2cf, 0x4334, 0x4390, 0x41f0, 0xbf8d, 0x4576, 0x2bc5, 0x46b2, 0xa44d, 0x438e, 0x2439, 0xb2c1, 0x181c, 0xa1d4, 0x4448, 0xbf67, 0x4360, 0xb00a, 0xbfa0, 0x423f, 0x32f8, 0x3dbe, 0x4301, 0x43aa, 0x1ba3, 0x4258, 0xbf80, 0x41df, 0xb242, 0x1e9a, 0x0f0a, 0x389a, 0xb2fa, 0x4220, 0x401f, 0x4561, 0x1a77, 0xbf5b, 0xb2e7, 0x1879, 0x4132, 0x46db, 0xb2e1, 0x1aa2, 0x4100, 0x25d0, 0x403b, 0x13ba, 0xbf69, 0x4238, 0xba3f, 0xa5ad, 0x1b87, 0x4406, 0xa157, 0x006d, 0xbfc0, 0x4349, 0x16fb, 0x18ca, 0x406f, 0xb049, 0x43cb, 0x435e, 0xabbe, 0xba66, 0xbf8f, 0x29de, 0xbfe0, 0x35d1, 0x21e8, 0xb2b1, 0x4019, 0x1f16, 0xb07f, 0x4124, 0x437b, 0x324a, 0x4641, 0x4192, 0x40cb, 0xbf5b, 0xb257, 0x1a8b, 0x0f49, 0x0eeb, 0x4244, 0x4038, 0x4499, 0x43ce, 0xbf18, 0x1b06, 0x1fb0, 0xbfa0, 0x2f5c, 0x44dd, 0x4381, 0x4245, 0xb223, 0x4260, 0x1c09, 0x12f5, 0x0433, 0x4285, 0xbf48, 0x43fa, 0x05a8, 0x3557, 0x42ed, 0xb03e, 0xba76, 0x4124, 0x1ab2, 0xbf95, 0x4010, 0x4581, 0x459a, 0xb229, 0x0b3c, 0x4452, 0xa755, 0x4476, 0xb066, 0x13df, 0xb0b4, 0x41f9, 0xb2ac, 0x432a, 0x409f, 0x2410, 0xba48, 0xbade, 0x4291, 0x085f, 0xb2dd, 0x4346, 0xbfc6, 0x4069, 0x408a, 0x45ed, 0x4370, 0x2b4f, 0x463d, 0x1f7a, 0xba33, 0x4119, 0x4119, 0x4277, 0x08b3, 0x24d8, 0x018b, 0x1dd1, 0x4190, 0xb259, 0x408e, 0xb094, 0x434b, 0xa16e, 0x417b, 0xb28c, 0xbf92, 0x1ae1, 0x14f3, 0x1b4a, 0x4549, 0xbf48, 0x3edd, 0x0f59, 0x3f27, 0x18da, 0xb2ee, 0x412b, 0xa606, 0xba3a, 0xb236, 0x41c3, 0xb024, 0xb0d3, 0x40f2, 0x4301, 0xb0eb, 0x40a1, 0x284b, 0x40bd, 0x1e28, 0x41d3, 0x4243, 0xbfca, 0xa24e, 0x4105, 0x0a58, 0x1fd6, 0x41f4, 0xbfc8, 0xb268, 0x42ac, 0x413b, 0xb285, 0xb0d4, 0x400b, 0x43e2, 0x3133, 0x4316, 0x4319, 0x4398, 0xb27b, 0x2780, 0x4343, 0x17d6, 0xb242, 0x1282, 0x1f3e, 0x4285, 0x42a2, 0xb0ed, 0x40a5, 0x439a, 0x1c5f, 0x1d3b, 0xb032, 0xbfbd, 0xb26f, 0x42e2, 0x4350, 0x4353, 0x1d6d, 0xb2af, 0x40ad, 0x41e6, 0x4080, 0x43b6, 0x4064, 0x4007, 0x40a8, 0x4302, 0x11e1, 0x41dd, 0xb2cd, 0x4350, 0xba24, 0x4208, 0xb24d, 0x1c89, 0x4262, 0xba71, 0xbf89, 0x4357, 0x42ef, 0xb2d6, 0xb26e, 0xb208, 0xb275, 0xbf1d, 0xb2ee, 0x1944, 0xb2ce, 0xba7f, 0x36b1, 0x388f, 0x40ce, 0x4368, 0x19b9, 0x01c7, 0x24f5, 0xba7b, 0x4267, 0x4143, 0xbf32, 0x4205, 0xba59, 0x40c0, 0x3dbe, 0x46d5, 0x1ac7, 0x4195, 0x41db, 0xb2bb, 0x43c4, 0x1fcd, 0x42f1, 0x42d8, 0x1df1, 0xb2fa, 0x41d5, 0xbf0c, 0x41a8, 0x4201, 0xa7e8, 0xbf02, 0x42d1, 0x4116, 0x1c10, 0x43f6, 0x40df, 0x0a6b, 0x41ac, 0x42f3, 0xb2b6, 0x43bb, 0x1010, 0xba5d, 0x43c6, 0xb022, 0x3144, 0x41f9, 0xac9e, 0x43b2, 0x3daf, 0xa1b3, 0x19fa, 0xbfae, 0x42b3, 0x467d, 0x4000, 0xaa59, 0xba2c, 0x090f, 0x1860, 0xb022, 0x2209, 0x1d3a, 0xba15, 0x4138, 0x43fb, 0x424b, 0xbaf1, 0x41fd, 0xba49, 0x461b, 0x41b4, 0xae22, 0xa412, 0x1d38, 0xbf4a, 0x4239, 0xb25f, 0x258a, 0xab14, 0x4021, 0x33b7, 0x400d, 0x44eb, 0x439c, 0x1ff6, 0x4056, 0x414b, 0x18e1, 0x34b5, 0xb23e, 0x465d, 0xa16f, 0x41a9, 0x1047, 0x2a0d, 0x290c, 0xa552, 0x403b, 0xbf43, 0x46d2, 0xb07c, 0x42ca, 0xb007, 0xbae7, 0x45e5, 0x41aa, 0xa900, 0x4148, 0xb203, 0x411a, 0x44d0, 0xb236, 0x40bf, 0x2b7a, 0xbfd1, 0x423c, 0x4323, 0xba6d, 0x4325, 0x45b0, 0x4173, 0xbf46, 0xbada, 0x430e, 0x42d7, 0x415f, 0x4335, 0x445e, 0x4038, 0x4170, 0x4041, 0x422f, 0x4206, 0x4306, 0xba01, 0xb080, 0x0116, 0x1e6f, 0x31c7, 0xb210, 0xba4a, 0xb26a, 0xb2a4, 0x3127, 0x4140, 0xafb4, 0xb28c, 0xb279, 0xbf31, 0x4456, 0x40c0, 0x344c, 0x43eb, 0x0763, 0x042b, 0x4160, 0x0f4f, 0x4484, 0xa6f6, 0x4115, 0x436f, 0x3b87, 0xb283, 0x39a6, 0x4013, 0x2aca, 0x414d, 0x4008, 0xb29b, 0xbfe4, 0x466c, 0x43db, 0x42c5, 0xbac7, 0x22cb, 0x4678, 0x4017, 0xb218, 0x1bfe, 0x43a6, 0xb2e2, 0x1b61, 0x4423, 0x2a87, 0x430c, 0x1d9a, 0xb206, 0x425d, 0xb21c, 0xbaeb, 0x1d87, 0x4123, 0xb030, 0xbfc8, 0xb25a, 0xa621, 0x16b0, 0xba19, 0x411f, 0x43b7, 0x26fe, 0x41c8, 0x419f, 0x40cc, 0xa286, 0xba7d, 0xbf4e, 0xb2a6, 0xb21e, 0x19e8, 0x22f9, 0x43e2, 0x1b9a, 0xb0d5, 0xbae9, 0x403a, 0xb2d7, 0x420a, 0x4345, 0xbfd8, 0x434e, 0x2382, 0x40dc, 0xb2dc, 0x1efb, 0xbfaf, 0xbfb0, 0xbaed, 0xbaea, 0x4249, 0x1806, 0x4459, 0xba0d, 0x1be8, 0xb2c6, 0x4346, 0x4302, 0x1483, 0x36d3, 0xb25d, 0x1e58, 0x0383, 0x42e7, 0xb0c2, 0x2be8, 0x1172, 0x1f26, 0x40d3, 0x1c1f, 0x42f0, 0x0b5c, 0xbf41, 0xa6e6, 0x4318, 0x3b45, 0x3690, 0x43c9, 0x40c7, 0x43c9, 0xbf38, 0x44f5, 0xbf00, 0x1d4e, 0xb055, 0x40d0, 0x298a, 0x4352, 0xba74, 0xa308, 0x1c72, 0x44f4, 0xb28c, 0xba4a, 0x438c, 0x4208, 0x1ce7, 0x4581, 0xbf93, 0x445f, 0x4041, 0xb06f, 0x40e4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xd71e5741, 0xc26ca9a0, 0xc815b4b8, 0x2e87799c, 0xd6d7ab03, 0x28643399, 0xee47b812, 0x4d2e6ed2, 0xb0352da7, 0xaedffe24, 0x03886f34, 0xf8a78ddb, 0x3400fdbb, 0x65c78639, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x0388d025, 0x880325d0, 0x000017f8, 0x00000000, 0x00000074, 0x0388d02a, 0x00000003, 0x694ff1d5, 0x65c78249, 0x03886f34, 0x0388b858, 0x7789f72c, 0x038871d4, 0x00000000, 0x200001d0 }, + Instructions = [0x4393, 0x413f, 0x4166, 0xa433, 0x409c, 0xb2e8, 0x1cc5, 0xba5a, 0xaf1d, 0x4249, 0x158a, 0x400c, 0xbf02, 0xba4d, 0x1b2a, 0x0683, 0x409b, 0x4033, 0x2766, 0xbf00, 0x43bc, 0x4593, 0x4623, 0x40f0, 0xba2d, 0x433c, 0xbfcc, 0x0712, 0xa0ee, 0x301a, 0x400e, 0x4218, 0x428a, 0xa5a0, 0x4362, 0xb28f, 0x4270, 0x3fd6, 0x40b4, 0x2c32, 0x4494, 0xb0e0, 0xba73, 0x2cfd, 0x4118, 0xba2a, 0xb24c, 0x2d2c, 0x1a18, 0x00d8, 0xbacb, 0x4396, 0xbf0b, 0xb244, 0x1eb5, 0x4154, 0xbacc, 0xb258, 0x1b71, 0xbfb7, 0xb2f8, 0xb0c5, 0x01d6, 0xbad7, 0x240f, 0x1dd7, 0x42f5, 0x4691, 0xbfb0, 0x1ca2, 0x15b5, 0x3be3, 0x4127, 0x4122, 0x403e, 0x4065, 0x4314, 0x1a38, 0x1e93, 0xba0d, 0x1ea0, 0xbaf7, 0xa3e8, 0x42c5, 0x1f42, 0xbf1b, 0x40c5, 0x461d, 0xb013, 0x40a2, 0x1903, 0x4388, 0xb090, 0xbfc1, 0x42fe, 0x42a9, 0x4353, 0x41c2, 0xba5c, 0x406b, 0x4351, 0x41ba, 0xbfe0, 0xb254, 0x1057, 0x41ba, 0xba06, 0xb259, 0x067d, 0x40f4, 0xba18, 0x45b0, 0x3200, 0x405a, 0xba03, 0xbfde, 0x4127, 0x4379, 0x400c, 0xb20e, 0x0f5d, 0x41b4, 0x1f75, 0x416d, 0x413c, 0x1d18, 0x3c86, 0x41e6, 0x1d1e, 0xb281, 0x1f3c, 0x4218, 0x40f8, 0xbf29, 0x286f, 0xa620, 0xb2bb, 0x0150, 0xbac4, 0xac02, 0x439c, 0xb0fa, 0x40df, 0x1f98, 0x4316, 0x3d6d, 0x414e, 0x4159, 0xba17, 0xbfb1, 0x1a85, 0x4214, 0x423d, 0x0134, 0x4669, 0xb254, 0xbf95, 0xb2ed, 0x428b, 0x4328, 0x4256, 0x12d9, 0x40cc, 0xb23e, 0xb025, 0x42fe, 0x4022, 0xb0da, 0x42a9, 0xad61, 0x1f53, 0x46f9, 0x4462, 0xba7b, 0x3985, 0x4142, 0xa656, 0x21c4, 0x4255, 0xba64, 0xb20b, 0xa593, 0x43be, 0xbf8f, 0x463b, 0xb038, 0xb030, 0x4055, 0x17ca, 0xbacb, 0x1f67, 0x4055, 0x1923, 0x1a46, 0xb2a0, 0x41af, 0x4285, 0xbfa4, 0x3160, 0x42c8, 0x29ec, 0x1c50, 0x412c, 0xbaec, 0xb225, 0x44d4, 0xba56, 0xb23d, 0xbfdb, 0x275b, 0x415f, 0xb0ea, 0x21fb, 0x40d9, 0x4325, 0xb20c, 0x43d8, 0xa916, 0x4239, 0x438b, 0x418f, 0x4275, 0xb25f, 0x2252, 0xb262, 0x4688, 0x1c27, 0xb234, 0x19e4, 0x41b6, 0xbfb4, 0x3226, 0xa8bd, 0x40b1, 0xb24f, 0x1848, 0x436f, 0x4372, 0x436f, 0x426f, 0xb2b6, 0xba5a, 0xb2c6, 0x2bac, 0x4160, 0x4002, 0x40b0, 0xba46, 0x319b, 0xb251, 0x2a9a, 0x428b, 0x4239, 0x28d5, 0x46e9, 0x4030, 0x4167, 0xbf2e, 0xbf00, 0x41cc, 0xb2e1, 0xba20, 0x4080, 0x1179, 0x4484, 0xbaf4, 0xbf48, 0xb2f8, 0x4320, 0x426b, 0xb2ee, 0x350c, 0xb241, 0x4386, 0x3af4, 0x42b4, 0xa8e5, 0x4369, 0x4315, 0x4110, 0x407b, 0xbaff, 0x419e, 0xbf52, 0x40f2, 0x45b5, 0x41ec, 0x402a, 0xb21b, 0xbf6c, 0xb0ad, 0x40cd, 0x4094, 0xb07c, 0x1fbb, 0x286b, 0x422d, 0x1f2b, 0x401a, 0x42aa, 0x406b, 0x4473, 0x41d8, 0xb08d, 0xba59, 0xb03e, 0x1d7d, 0xaf13, 0x45e8, 0x4169, 0x418a, 0x4366, 0xb001, 0x3913, 0x40ef, 0x40fa, 0xbf74, 0x1bcd, 0x42e7, 0x40cf, 0x1959, 0xb20a, 0xb2ec, 0x1261, 0x40ab, 0x4062, 0x34eb, 0x40fb, 0x4255, 0xb052, 0x40e4, 0x414f, 0x4241, 0xb21f, 0xb2f9, 0x2894, 0x4546, 0x2e67, 0xbf0a, 0x2dcd, 0x3df4, 0x1431, 0x426d, 0x162d, 0xbfd8, 0x4255, 0xbaf2, 0x4263, 0xa5ca, 0x43e9, 0xb06b, 0x2b34, 0xba1b, 0xbf60, 0x42bc, 0x0a25, 0x4584, 0x40f2, 0xb07f, 0x3185, 0xb0b6, 0xbaf2, 0xbf86, 0xafbf, 0xb2a6, 0x10ea, 0x4379, 0x43ec, 0x4291, 0x2f80, 0xb2a8, 0x400b, 0xb2a7, 0x4007, 0xb23c, 0x454b, 0x40ab, 0xbad0, 0xbf84, 0x43ab, 0x4252, 0x40c8, 0x400f, 0x43ae, 0xa451, 0x458e, 0xbae0, 0x4683, 0x412d, 0x3ea7, 0x2233, 0x4564, 0x3aa8, 0x421a, 0x1fc8, 0xa2ab, 0xba49, 0x18b2, 0x2a32, 0x40b7, 0xb25e, 0xba1f, 0xb025, 0xb2d7, 0x41f2, 0xbfe1, 0x1fa1, 0xb0a2, 0x43bd, 0x1812, 0x0fdf, 0xba2f, 0x42e5, 0xb238, 0x197b, 0x1d3f, 0xbfa1, 0x1def, 0x1a08, 0x41f5, 0x352c, 0xb021, 0x1891, 0x004f, 0x427c, 0x402a, 0x41fb, 0x4303, 0x4396, 0x3d52, 0xbac4, 0xba78, 0x40b0, 0x1d86, 0xb249, 0x40c1, 0x4030, 0xbac9, 0xbf3a, 0x412d, 0x4335, 0x3fe3, 0xb2f3, 0x0403, 0xb24c, 0x4194, 0x402f, 0x4245, 0x43a7, 0x4298, 0x2c2c, 0x1d25, 0x0a9b, 0xba72, 0x41f4, 0x4083, 0x1161, 0xba17, 0xac8c, 0x4595, 0x42b2, 0x4457, 0x2b24, 0xba1b, 0x4135, 0xb0ba, 0xbf14, 0x41e8, 0x2741, 0x1bcb, 0x3afa, 0x438c, 0xbf36, 0x4028, 0x40d6, 0x42dd, 0xb2cf, 0x4334, 0x4390, 0x41f0, 0xbf8d, 0x4576, 0x2bc5, 0x46b2, 0xa44d, 0x438e, 0x2439, 0xb2c1, 0x181c, 0xa1d4, 0x4448, 0xbf67, 0x4360, 0xb00a, 0xbfa0, 0x423f, 0x32f8, 0x3dbe, 0x4301, 0x43aa, 0x1ba3, 0x4258, 0xbf80, 0x41df, 0xb242, 0x1e9a, 0x0f0a, 0x389a, 0xb2fa, 0x4220, 0x401f, 0x4561, 0x1a77, 0xbf5b, 0xb2e7, 0x1879, 0x4132, 0x46db, 0xb2e1, 0x1aa2, 0x4100, 0x25d0, 0x403b, 0x13ba, 0xbf69, 0x4238, 0xba3f, 0xa5ad, 0x1b87, 0x4406, 0xa157, 0x006d, 0xbfc0, 0x4349, 0x16fb, 0x18ca, 0x406f, 0xb049, 0x43cb, 0x435e, 0xabbe, 0xba66, 0xbf8f, 0x29de, 0xbfe0, 0x35d1, 0x21e8, 0xb2b1, 0x4019, 0x1f16, 0xb07f, 0x4124, 0x437b, 0x324a, 0x4641, 0x4192, 0x40cb, 0xbf5b, 0xb257, 0x1a8b, 0x0f49, 0x0eeb, 0x4244, 0x4038, 0x4499, 0x43ce, 0xbf18, 0x1b06, 0x1fb0, 0xbfa0, 0x2f5c, 0x44dd, 0x4381, 0x4245, 0xb223, 0x4260, 0x1c09, 0x12f5, 0x0433, 0x4285, 0xbf48, 0x43fa, 0x05a8, 0x3557, 0x42ed, 0xb03e, 0xba76, 0x4124, 0x1ab2, 0xbf95, 0x4010, 0x4581, 0x459a, 0xb229, 0x0b3c, 0x4452, 0xa755, 0x4476, 0xb066, 0x13df, 0xb0b4, 0x41f9, 0xb2ac, 0x432a, 0x409f, 0x2410, 0xba48, 0xbade, 0x4291, 0x085f, 0xb2dd, 0x4346, 0xbfc6, 0x4069, 0x408a, 0x45ed, 0x4370, 0x2b4f, 0x463d, 0x1f7a, 0xba33, 0x4119, 0x4119, 0x4277, 0x08b3, 0x24d8, 0x018b, 0x1dd1, 0x4190, 0xb259, 0x408e, 0xb094, 0x434b, 0xa16e, 0x417b, 0xb28c, 0xbf92, 0x1ae1, 0x14f3, 0x1b4a, 0x4549, 0xbf48, 0x3edd, 0x0f59, 0x3f27, 0x18da, 0xb2ee, 0x412b, 0xa606, 0xba3a, 0xb236, 0x41c3, 0xb024, 0xb0d3, 0x40f2, 0x4301, 0xb0eb, 0x40a1, 0x284b, 0x40bd, 0x1e28, 0x41d3, 0x4243, 0xbfca, 0xa24e, 0x4105, 0x0a58, 0x1fd6, 0x41f4, 0xbfc8, 0xb268, 0x42ac, 0x413b, 0xb285, 0xb0d4, 0x400b, 0x43e2, 0x3133, 0x4316, 0x4319, 0x4398, 0xb27b, 0x2780, 0x4343, 0x17d6, 0xb242, 0x1282, 0x1f3e, 0x4285, 0x42a2, 0xb0ed, 0x40a5, 0x439a, 0x1c5f, 0x1d3b, 0xb032, 0xbfbd, 0xb26f, 0x42e2, 0x4350, 0x4353, 0x1d6d, 0xb2af, 0x40ad, 0x41e6, 0x4080, 0x43b6, 0x4064, 0x4007, 0x40a8, 0x4302, 0x11e1, 0x41dd, 0xb2cd, 0x4350, 0xba24, 0x4208, 0xb24d, 0x1c89, 0x4262, 0xba71, 0xbf89, 0x4357, 0x42ef, 0xb2d6, 0xb26e, 0xb208, 0xb275, 0xbf1d, 0xb2ee, 0x1944, 0xb2ce, 0xba7f, 0x36b1, 0x388f, 0x40ce, 0x4368, 0x19b9, 0x01c7, 0x24f5, 0xba7b, 0x4267, 0x4143, 0xbf32, 0x4205, 0xba59, 0x40c0, 0x3dbe, 0x46d5, 0x1ac7, 0x4195, 0x41db, 0xb2bb, 0x43c4, 0x1fcd, 0x42f1, 0x42d8, 0x1df1, 0xb2fa, 0x41d5, 0xbf0c, 0x41a8, 0x4201, 0xa7e8, 0xbf02, 0x42d1, 0x4116, 0x1c10, 0x43f6, 0x40df, 0x0a6b, 0x41ac, 0x42f3, 0xb2b6, 0x43bb, 0x1010, 0xba5d, 0x43c6, 0xb022, 0x3144, 0x41f9, 0xac9e, 0x43b2, 0x3daf, 0xa1b3, 0x19fa, 0xbfae, 0x42b3, 0x467d, 0x4000, 0xaa59, 0xba2c, 0x090f, 0x1860, 0xb022, 0x2209, 0x1d3a, 0xba15, 0x4138, 0x43fb, 0x424b, 0xbaf1, 0x41fd, 0xba49, 0x461b, 0x41b4, 0xae22, 0xa412, 0x1d38, 0xbf4a, 0x4239, 0xb25f, 0x258a, 0xab14, 0x4021, 0x33b7, 0x400d, 0x44eb, 0x439c, 0x1ff6, 0x4056, 0x414b, 0x18e1, 0x34b5, 0xb23e, 0x465d, 0xa16f, 0x41a9, 0x1047, 0x2a0d, 0x290c, 0xa552, 0x403b, 0xbf43, 0x46d2, 0xb07c, 0x42ca, 0xb007, 0xbae7, 0x45e5, 0x41aa, 0xa900, 0x4148, 0xb203, 0x411a, 0x44d0, 0xb236, 0x40bf, 0x2b7a, 0xbfd1, 0x423c, 0x4323, 0xba6d, 0x4325, 0x45b0, 0x4173, 0xbf46, 0xbada, 0x430e, 0x42d7, 0x415f, 0x4335, 0x445e, 0x4038, 0x4170, 0x4041, 0x422f, 0x4206, 0x4306, 0xba01, 0xb080, 0x0116, 0x1e6f, 0x31c7, 0xb210, 0xba4a, 0xb26a, 0xb2a4, 0x3127, 0x4140, 0xafb4, 0xb28c, 0xb279, 0xbf31, 0x4456, 0x40c0, 0x344c, 0x43eb, 0x0763, 0x042b, 0x4160, 0x0f4f, 0x4484, 0xa6f6, 0x4115, 0x436f, 0x3b87, 0xb283, 0x39a6, 0x4013, 0x2aca, 0x414d, 0x4008, 0xb29b, 0xbfe4, 0x466c, 0x43db, 0x42c5, 0xbac7, 0x22cb, 0x4678, 0x4017, 0xb218, 0x1bfe, 0x43a6, 0xb2e2, 0x1b61, 0x4423, 0x2a87, 0x430c, 0x1d9a, 0xb206, 0x425d, 0xb21c, 0xbaeb, 0x1d87, 0x4123, 0xb030, 0xbfc8, 0xb25a, 0xa621, 0x16b0, 0xba19, 0x411f, 0x43b7, 0x26fe, 0x41c8, 0x419f, 0x40cc, 0xa286, 0xba7d, 0xbf4e, 0xb2a6, 0xb21e, 0x19e8, 0x22f9, 0x43e2, 0x1b9a, 0xb0d5, 0xbae9, 0x403a, 0xb2d7, 0x420a, 0x4345, 0xbfd8, 0x434e, 0x2382, 0x40dc, 0xb2dc, 0x1efb, 0xbfaf, 0xbfb0, 0xbaed, 0xbaea, 0x4249, 0x1806, 0x4459, 0xba0d, 0x1be8, 0xb2c6, 0x4346, 0x4302, 0x1483, 0x36d3, 0xb25d, 0x1e58, 0x0383, 0x42e7, 0xb0c2, 0x2be8, 0x1172, 0x1f26, 0x40d3, 0x1c1f, 0x42f0, 0x0b5c, 0xbf41, 0xa6e6, 0x4318, 0x3b45, 0x3690, 0x43c9, 0x40c7, 0x43c9, 0xbf38, 0x44f5, 0xbf00, 0x1d4e, 0xb055, 0x40d0, 0x298a, 0x4352, 0xba74, 0xa308, 0x1c72, 0x44f4, 0xb28c, 0xba4a, 0x438c, 0x4208, 0x1ce7, 0x4581, 0xbf93, 0x445f, 0x4041, 0xb06f, 0x40e4, 0x4770, 0xe7fe + ], + StartRegs = [0xd71e5741, 0xc26ca9a0, 0xc815b4b8, 0x2e87799c, 0xd6d7ab03, 0x28643399, 0xee47b812, 0x4d2e6ed2, 0xb0352da7, 0xaedffe24, 0x03886f34, 0xf8a78ddb, 0x3400fdbb, 0x65c78639, 0x00000000, 0x700001f0 + ], + FinalRegs = [0x00000000, 0x0388d025, 0x880325d0, 0x000017f8, 0x00000000, 0x00000074, 0x0388d02a, 0x00000003, 0x694ff1d5, 0x65c78249, 0x03886f34, 0x0388b858, 0x7789f72c, 0x038871d4, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x45a4, 0x08a7, 0xa344, 0xba0d, 0xba6a, 0x18aa, 0xb2ed, 0x027f, 0x414e, 0x3b58, 0xb06c, 0x4019, 0x443a, 0x43d5, 0x43d9, 0x3988, 0xb2fb, 0x3731, 0x42e1, 0x4198, 0xbade, 0x1852, 0x414d, 0xb2bf, 0xb272, 0xbfb3, 0x4083, 0x42cb, 0x4084, 0x023d, 0x4218, 0xba3e, 0x434c, 0xb2bb, 0x41ee, 0x1d8f, 0xbf08, 0xb2d7, 0x1ade, 0x20d7, 0x0a8f, 0x4679, 0xba77, 0x4156, 0x44c8, 0xbf0f, 0xba07, 0xb234, 0x4326, 0xb018, 0xb28c, 0x159a, 0xb050, 0x442f, 0xa0b3, 0xb0b2, 0x1cae, 0xbfc3, 0x42bf, 0xb23d, 0x4296, 0x409b, 0x46fa, 0x40c7, 0x41a1, 0xbf0f, 0x44f9, 0x28e2, 0x3304, 0x41f9, 0xbf00, 0x462c, 0x4233, 0x1f2f, 0xbad2, 0x2961, 0x2bad, 0xb0ab, 0xbf60, 0x40d6, 0x1633, 0x4280, 0xbf8f, 0x445a, 0x4398, 0x42e2, 0x40f3, 0xb05e, 0x1e98, 0x467e, 0x11ff, 0x1a98, 0x42c5, 0x4038, 0xb223, 0x1e66, 0xbae3, 0x1dcf, 0x23d7, 0xbfd1, 0x4431, 0x43ee, 0x2d7b, 0x4275, 0x07dc, 0x4320, 0x41ea, 0xb25b, 0x0fe5, 0x4131, 0x4108, 0x4338, 0xba61, 0x42d0, 0x0f3d, 0x1a3d, 0x1c5e, 0x4244, 0x40e1, 0xb094, 0xb207, 0x4499, 0xbf6e, 0xb209, 0x41a2, 0x37d8, 0xb018, 0xa0e3, 0xb217, 0x4626, 0x4466, 0x15ef, 0x433b, 0x1cf5, 0x0846, 0x191b, 0xb203, 0x4396, 0x4217, 0xbf69, 0xb090, 0x436a, 0x1b63, 0x426f, 0x0022, 0x4110, 0x2019, 0xb26d, 0x2962, 0xaf0d, 0x43d9, 0xb246, 0x085b, 0xb049, 0x43df, 0x412e, 0x42a5, 0x027f, 0xbf89, 0xb237, 0x42ae, 0x42a7, 0x36db, 0xb25a, 0x43cf, 0x1d28, 0xb0ca, 0x404e, 0xb2a9, 0x402d, 0x4268, 0xad94, 0xbf32, 0x2cef, 0x40c2, 0xba2e, 0x43fd, 0x4168, 0x43d1, 0xb2a8, 0xba30, 0x1b80, 0x40dc, 0x4035, 0x4676, 0xb08c, 0x4267, 0x409b, 0x462f, 0x408d, 0x3b28, 0x18fc, 0x4344, 0x4016, 0x42b4, 0x41a1, 0xbfdb, 0x4156, 0xa1fb, 0xb2b5, 0x1860, 0xb2aa, 0x033d, 0x42cf, 0x4399, 0x430f, 0x410f, 0xba6d, 0xbf51, 0x41fe, 0x2855, 0x45c1, 0x1740, 0x4321, 0xa3e5, 0x422e, 0x4289, 0x01e5, 0x14b8, 0xaef7, 0x4012, 0x1c72, 0x4261, 0xa856, 0x069e, 0xba61, 0x40c1, 0x0edc, 0x4040, 0xba69, 0x4012, 0x4157, 0xba5b, 0x45d6, 0xba32, 0xb000, 0x1efb, 0x4351, 0xbf36, 0x4548, 0xb0b2, 0x344a, 0xba1b, 0x1ff8, 0x4104, 0x43c9, 0xac71, 0x3da1, 0xb095, 0x423a, 0x410a, 0x43c1, 0x10b8, 0x431c, 0x42c6, 0x4100, 0xbfda, 0x3ae2, 0x46d0, 0x4241, 0xbae3, 0x0dba, 0x4297, 0xaa48, 0x286a, 0x42b0, 0x43d8, 0x00e7, 0x10ae, 0x0281, 0xb013, 0x4556, 0x1b24, 0x4093, 0x2ab6, 0x40cd, 0x41aa, 0x193f, 0x2446, 0x4344, 0x4161, 0xb2e5, 0x42e9, 0xbfb4, 0x25e1, 0x40c6, 0x4320, 0x4214, 0x4185, 0x076d, 0xb273, 0x4149, 0x0f14, 0x43bd, 0x109a, 0x4636, 0x411c, 0x43f5, 0xbfe1, 0x1ed8, 0x437e, 0x40b7, 0x0795, 0x1f94, 0x4678, 0x00c4, 0x0040, 0x1f3a, 0xbaef, 0x096f, 0x3ce4, 0x4061, 0x4241, 0x42ca, 0xb250, 0x458e, 0x308f, 0x45ba, 0x41f6, 0xb22d, 0xb0a2, 0xbaf1, 0xbfb6, 0x0318, 0x0f57, 0xac8a, 0xb2bf, 0xbfd0, 0x438d, 0x1a76, 0x4447, 0x42c0, 0xbfae, 0x182a, 0x1469, 0xa377, 0x1b30, 0xb2f1, 0x1354, 0x42e2, 0xaf4d, 0xa156, 0x40f8, 0xb26a, 0x416e, 0x2cdc, 0x2741, 0xb06b, 0x4322, 0x4689, 0x41d1, 0x462a, 0x1f1d, 0xb297, 0x415d, 0x26de, 0x4089, 0xbf78, 0x4359, 0x42f6, 0xa6c6, 0x19f5, 0x29df, 0x4285, 0x459e, 0xb297, 0x2047, 0xbf4c, 0x0551, 0x1b21, 0xb27c, 0x413a, 0x4369, 0x4052, 0xbaeb, 0x3da1, 0x06a6, 0x40de, 0x4154, 0x18f7, 0x45ea, 0x44e4, 0x43e9, 0xba2e, 0x30a4, 0xaf60, 0x430e, 0xbac3, 0x1af2, 0x4158, 0xb21a, 0xbf2b, 0xbadf, 0x4055, 0x41d9, 0x4018, 0x44cd, 0xbfd0, 0x3e73, 0xa07c, 0xbad5, 0xb2a1, 0x1a51, 0x41e0, 0xbfe0, 0x462f, 0x409f, 0x4095, 0xba69, 0x04c2, 0x426e, 0xbf00, 0x40ae, 0x409d, 0x4312, 0x417f, 0x4312, 0x098f, 0xb0e9, 0xbfa4, 0x416a, 0xb074, 0x44f1, 0x421b, 0xb02c, 0x3394, 0xaced, 0x4636, 0x43b6, 0x2b1c, 0x1f46, 0x1ab5, 0x4235, 0x4030, 0x40e0, 0xba47, 0xb207, 0xb25c, 0x1786, 0xbaf3, 0x25bc, 0x430b, 0x4179, 0x436c, 0xbf7b, 0x4616, 0xb033, 0xa35a, 0x0a2f, 0x433c, 0x434f, 0xb254, 0xb2b7, 0x40a2, 0x140c, 0x1d7a, 0xb0df, 0xbf9b, 0x1396, 0x4323, 0x04ee, 0x1ad3, 0x1df6, 0x4001, 0x0825, 0xa444, 0x4221, 0x2085, 0xbfb0, 0x42fc, 0xa67e, 0x419c, 0xba0a, 0xa828, 0x40ec, 0x28b6, 0x4364, 0x4362, 0x2892, 0x419c, 0xb206, 0xb2f1, 0x1795, 0xbf6d, 0x0f94, 0x43e5, 0x1e8c, 0xa665, 0xb0e9, 0x06c5, 0xb22e, 0xbac4, 0x1f02, 0xba21, 0x0048, 0x43f7, 0x402f, 0xbf69, 0x43e2, 0x39d0, 0x1c2b, 0x0c3d, 0x41f5, 0x40a7, 0x4254, 0x4303, 0xa98f, 0x19bb, 0x27cd, 0x43bc, 0xb219, 0x4208, 0x43db, 0xb0e1, 0x42ac, 0x43c3, 0x400d, 0x4151, 0x45e1, 0x4097, 0xba76, 0x0cb1, 0x420d, 0x42eb, 0x466a, 0xbf9b, 0x409e, 0x46c0, 0x4168, 0xaba2, 0x01b0, 0x358b, 0x42e1, 0xbad1, 0x43e7, 0x415f, 0x42bf, 0xb09d, 0x1b7c, 0x38eb, 0xb212, 0xb298, 0x1b3e, 0x3148, 0xbfbd, 0xb038, 0xb003, 0x40b0, 0x1604, 0xbf5b, 0x45a4, 0x1e35, 0x2f5a, 0x0a27, 0x40ff, 0x42d9, 0x4196, 0x0bf3, 0xb0cf, 0x43c3, 0x14c9, 0x41c2, 0x419c, 0xb05f, 0xba3d, 0x407e, 0x4118, 0xbaed, 0x2f0a, 0x066f, 0x409c, 0x4132, 0x40c5, 0xbff0, 0x4592, 0xbf26, 0x1bfb, 0x1004, 0x439a, 0x41bb, 0xbf5e, 0x4543, 0x4243, 0x1faa, 0x4099, 0xb2c4, 0x1c03, 0xb2a7, 0xb200, 0x42e0, 0x01fa, 0x4083, 0x40dd, 0x19d7, 0xb2a3, 0xb2e3, 0xbf8a, 0x19a1, 0xa995, 0x40ad, 0x4564, 0x1a6c, 0x44b1, 0xbf82, 0x29f0, 0x407f, 0x4032, 0x0d94, 0x43c7, 0x1cd1, 0xbfdc, 0xb02a, 0xba7c, 0xa53e, 0x191e, 0x3274, 0x06ff, 0xbf0d, 0xa643, 0x19ed, 0x1ab6, 0x4292, 0xade2, 0x4138, 0x35a7, 0x42a6, 0x2df3, 0xbfc8, 0x410c, 0x194b, 0x40d9, 0x4350, 0xbac2, 0x42b8, 0xba17, 0x408f, 0x430c, 0xb2b4, 0x425b, 0x4319, 0x423d, 0x42c0, 0xb2cf, 0xb233, 0x4601, 0xba6b, 0x448d, 0x435f, 0x4133, 0x421b, 0xbfd7, 0xb263, 0xba08, 0x4386, 0x40c0, 0xba74, 0xb283, 0x4275, 0x405a, 0xa597, 0x3eab, 0xa03e, 0x4317, 0x4194, 0x46d5, 0x40d6, 0x4626, 0x407a, 0x4618, 0xba4b, 0x4185, 0x1fd4, 0xbac4, 0x4676, 0xbad6, 0xbade, 0x42a0, 0x425b, 0x43ee, 0xbf5a, 0x4137, 0xba4e, 0x40aa, 0x43e6, 0xb283, 0x4295, 0xa6de, 0x418f, 0x4314, 0x0bb1, 0x4278, 0xbaea, 0xb256, 0xb0c2, 0x0164, 0x218f, 0xbfb1, 0x40d5, 0x40d7, 0x19d6, 0x4197, 0x4255, 0x42cf, 0x4220, 0x41f8, 0x455e, 0x42fc, 0x42b1, 0x40e2, 0xb01b, 0xb207, 0x4362, 0x0dc2, 0x2f3b, 0x2d06, 0xb259, 0x46ec, 0x46c9, 0xba27, 0x400c, 0xba15, 0xba27, 0x28db, 0x416d, 0x1f98, 0xbf66, 0x4101, 0x4379, 0x4008, 0x26ab, 0x2a72, 0x14da, 0x4675, 0x40b5, 0xbaf2, 0xb2a0, 0x26d3, 0x44c5, 0x094c, 0x41cc, 0xbad0, 0xb255, 0x40f8, 0xbaf0, 0x41d1, 0x1a2c, 0x19e9, 0xb213, 0x263a, 0x429b, 0x4443, 0x1d60, 0x401d, 0xb2b7, 0xbf25, 0x1edf, 0x437a, 0xb0e0, 0x1fdb, 0x1eff, 0xbf08, 0x40c6, 0x418d, 0xac60, 0x41c8, 0x4311, 0xb056, 0x43fd, 0xba3a, 0x1e0a, 0x1c07, 0x4110, 0xba6f, 0xba05, 0x465e, 0x198e, 0xba67, 0x40eb, 0xbfae, 0xb2af, 0x4272, 0xa551, 0xb29a, 0x43dc, 0x42df, 0xba5c, 0x400b, 0x1e9c, 0xae12, 0x447c, 0x429a, 0x456d, 0x41f1, 0x4650, 0xba05, 0x40b7, 0x4385, 0xb2de, 0x4067, 0xbf2a, 0x4065, 0xb20c, 0xbf80, 0x26f3, 0x4060, 0xb27a, 0xba1e, 0xb2e5, 0x1006, 0xbfd0, 0xb226, 0xb225, 0x430a, 0x412a, 0xbf83, 0x1af2, 0x1ce9, 0x413e, 0xa670, 0x43ef, 0x43c2, 0x24d3, 0x1cdf, 0xba14, 0xbf07, 0x4635, 0x432c, 0x2b26, 0x0b9d, 0x443a, 0x1dff, 0x1813, 0xb232, 0xbf77, 0x4308, 0x0d17, 0x1c3f, 0xba68, 0x1bac, 0x445e, 0xb228, 0x43a3, 0x1d1d, 0x1fa3, 0x0765, 0x421b, 0x4133, 0x422d, 0x4113, 0x4169, 0xba43, 0x404c, 0x416f, 0x423d, 0x442f, 0xba0a, 0xbacb, 0x201f, 0xb2d1, 0x42ec, 0x32d0, 0x419e, 0xbf83, 0xbac6, 0x41a1, 0x09d4, 0x1866, 0x422b, 0x4190, 0x422c, 0x4120, 0x1b77, 0x1aa2, 0x43b8, 0x400c, 0x43c2, 0x20d1, 0xb283, 0x421d, 0x1c4a, 0x4105, 0xba4e, 0xb2d5, 0xb257, 0x420e, 0x1800, 0x434b, 0xb256, 0x4365, 0xbf33, 0x412e, 0x1fb4, 0x18f4, 0x4175, 0x4122, 0x1309, 0x41dd, 0xb2a7, 0x4093, 0x2718, 0x223b, 0xb2cd, 0xba41, 0xbf57, 0x435c, 0xa9d4, 0x40c6, 0x4628, 0xa687, 0x1abd, 0xba66, 0x42ef, 0x1edb, 0xb2a1, 0x4174, 0xac29, 0x1832, 0x3f4b, 0x40c1, 0xba29, 0x428f, 0xa663, 0xbf29, 0x437a, 0x44d5, 0x3e25, 0x1e7c, 0x46d4, 0x42d5, 0x0605, 0x3dfc, 0xb25f, 0x415b, 0xbfc3, 0x26e3, 0x3d32, 0x43a2, 0xb063, 0x4216, 0xba27, 0x4147, 0xbfc1, 0xb203, 0x40bf, 0x404c, 0x4498, 0x28ea, 0xba56, 0x456c, 0xb0f5, 0xbf80, 0x230a, 0xb21b, 0x1e7c, 0x3ee1, 0x435f, 0x1e9a, 0x417d, 0x404c, 0xbf0a, 0xba00, 0x41c0, 0xb21d, 0x4261, 0x1f4a, 0x4043, 0x41ec, 0x438f, 0xb0f5, 0xb275, 0xbfc6, 0xb0e6, 0x2fb0, 0x430d, 0x06b2, 0x435a, 0xa453, 0x46a8, 0x4074, 0x43a7, 0x0363, 0x404d, 0xbaf1, 0xba12, 0x1a9d, 0x420c, 0x447c, 0x41f8, 0x434c, 0xb292, 0xbf18, 0xb2c0, 0x4294, 0x4258, 0x4060, 0xbf9f, 0xb2b3, 0x3a02, 0xae29, 0xba20, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3cccdcbb, 0xb8b42a16, 0x5515dd66, 0x79ed5e7e, 0x48648228, 0x836897c4, 0x72bc80f9, 0xe9ea3611, 0xd38985d1, 0x943bed5a, 0x921c041b, 0x24eee228, 0x42062aa5, 0xb425effb, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0x5058e007, 0x00001f30, 0x000000d6, 0x0000301f, 0x07e05850, 0x051ddf28, 0x00001ba0, 0x01000000, 0x0000001f, 0x000010d8, 0x00001080, 0x24eee228, 0x00001080, 0x00001afc, 0x00000000, 0x800001d0 }, + Instructions = [0x45a4, 0x08a7, 0xa344, 0xba0d, 0xba6a, 0x18aa, 0xb2ed, 0x027f, 0x414e, 0x3b58, 0xb06c, 0x4019, 0x443a, 0x43d5, 0x43d9, 0x3988, 0xb2fb, 0x3731, 0x42e1, 0x4198, 0xbade, 0x1852, 0x414d, 0xb2bf, 0xb272, 0xbfb3, 0x4083, 0x42cb, 0x4084, 0x023d, 0x4218, 0xba3e, 0x434c, 0xb2bb, 0x41ee, 0x1d8f, 0xbf08, 0xb2d7, 0x1ade, 0x20d7, 0x0a8f, 0x4679, 0xba77, 0x4156, 0x44c8, 0xbf0f, 0xba07, 0xb234, 0x4326, 0xb018, 0xb28c, 0x159a, 0xb050, 0x442f, 0xa0b3, 0xb0b2, 0x1cae, 0xbfc3, 0x42bf, 0xb23d, 0x4296, 0x409b, 0x46fa, 0x40c7, 0x41a1, 0xbf0f, 0x44f9, 0x28e2, 0x3304, 0x41f9, 0xbf00, 0x462c, 0x4233, 0x1f2f, 0xbad2, 0x2961, 0x2bad, 0xb0ab, 0xbf60, 0x40d6, 0x1633, 0x4280, 0xbf8f, 0x445a, 0x4398, 0x42e2, 0x40f3, 0xb05e, 0x1e98, 0x467e, 0x11ff, 0x1a98, 0x42c5, 0x4038, 0xb223, 0x1e66, 0xbae3, 0x1dcf, 0x23d7, 0xbfd1, 0x4431, 0x43ee, 0x2d7b, 0x4275, 0x07dc, 0x4320, 0x41ea, 0xb25b, 0x0fe5, 0x4131, 0x4108, 0x4338, 0xba61, 0x42d0, 0x0f3d, 0x1a3d, 0x1c5e, 0x4244, 0x40e1, 0xb094, 0xb207, 0x4499, 0xbf6e, 0xb209, 0x41a2, 0x37d8, 0xb018, 0xa0e3, 0xb217, 0x4626, 0x4466, 0x15ef, 0x433b, 0x1cf5, 0x0846, 0x191b, 0xb203, 0x4396, 0x4217, 0xbf69, 0xb090, 0x436a, 0x1b63, 0x426f, 0x0022, 0x4110, 0x2019, 0xb26d, 0x2962, 0xaf0d, 0x43d9, 0xb246, 0x085b, 0xb049, 0x43df, 0x412e, 0x42a5, 0x027f, 0xbf89, 0xb237, 0x42ae, 0x42a7, 0x36db, 0xb25a, 0x43cf, 0x1d28, 0xb0ca, 0x404e, 0xb2a9, 0x402d, 0x4268, 0xad94, 0xbf32, 0x2cef, 0x40c2, 0xba2e, 0x43fd, 0x4168, 0x43d1, 0xb2a8, 0xba30, 0x1b80, 0x40dc, 0x4035, 0x4676, 0xb08c, 0x4267, 0x409b, 0x462f, 0x408d, 0x3b28, 0x18fc, 0x4344, 0x4016, 0x42b4, 0x41a1, 0xbfdb, 0x4156, 0xa1fb, 0xb2b5, 0x1860, 0xb2aa, 0x033d, 0x42cf, 0x4399, 0x430f, 0x410f, 0xba6d, 0xbf51, 0x41fe, 0x2855, 0x45c1, 0x1740, 0x4321, 0xa3e5, 0x422e, 0x4289, 0x01e5, 0x14b8, 0xaef7, 0x4012, 0x1c72, 0x4261, 0xa856, 0x069e, 0xba61, 0x40c1, 0x0edc, 0x4040, 0xba69, 0x4012, 0x4157, 0xba5b, 0x45d6, 0xba32, 0xb000, 0x1efb, 0x4351, 0xbf36, 0x4548, 0xb0b2, 0x344a, 0xba1b, 0x1ff8, 0x4104, 0x43c9, 0xac71, 0x3da1, 0xb095, 0x423a, 0x410a, 0x43c1, 0x10b8, 0x431c, 0x42c6, 0x4100, 0xbfda, 0x3ae2, 0x46d0, 0x4241, 0xbae3, 0x0dba, 0x4297, 0xaa48, 0x286a, 0x42b0, 0x43d8, 0x00e7, 0x10ae, 0x0281, 0xb013, 0x4556, 0x1b24, 0x4093, 0x2ab6, 0x40cd, 0x41aa, 0x193f, 0x2446, 0x4344, 0x4161, 0xb2e5, 0x42e9, 0xbfb4, 0x25e1, 0x40c6, 0x4320, 0x4214, 0x4185, 0x076d, 0xb273, 0x4149, 0x0f14, 0x43bd, 0x109a, 0x4636, 0x411c, 0x43f5, 0xbfe1, 0x1ed8, 0x437e, 0x40b7, 0x0795, 0x1f94, 0x4678, 0x00c4, 0x0040, 0x1f3a, 0xbaef, 0x096f, 0x3ce4, 0x4061, 0x4241, 0x42ca, 0xb250, 0x458e, 0x308f, 0x45ba, 0x41f6, 0xb22d, 0xb0a2, 0xbaf1, 0xbfb6, 0x0318, 0x0f57, 0xac8a, 0xb2bf, 0xbfd0, 0x438d, 0x1a76, 0x4447, 0x42c0, 0xbfae, 0x182a, 0x1469, 0xa377, 0x1b30, 0xb2f1, 0x1354, 0x42e2, 0xaf4d, 0xa156, 0x40f8, 0xb26a, 0x416e, 0x2cdc, 0x2741, 0xb06b, 0x4322, 0x4689, 0x41d1, 0x462a, 0x1f1d, 0xb297, 0x415d, 0x26de, 0x4089, 0xbf78, 0x4359, 0x42f6, 0xa6c6, 0x19f5, 0x29df, 0x4285, 0x459e, 0xb297, 0x2047, 0xbf4c, 0x0551, 0x1b21, 0xb27c, 0x413a, 0x4369, 0x4052, 0xbaeb, 0x3da1, 0x06a6, 0x40de, 0x4154, 0x18f7, 0x45ea, 0x44e4, 0x43e9, 0xba2e, 0x30a4, 0xaf60, 0x430e, 0xbac3, 0x1af2, 0x4158, 0xb21a, 0xbf2b, 0xbadf, 0x4055, 0x41d9, 0x4018, 0x44cd, 0xbfd0, 0x3e73, 0xa07c, 0xbad5, 0xb2a1, 0x1a51, 0x41e0, 0xbfe0, 0x462f, 0x409f, 0x4095, 0xba69, 0x04c2, 0x426e, 0xbf00, 0x40ae, 0x409d, 0x4312, 0x417f, 0x4312, 0x098f, 0xb0e9, 0xbfa4, 0x416a, 0xb074, 0x44f1, 0x421b, 0xb02c, 0x3394, 0xaced, 0x4636, 0x43b6, 0x2b1c, 0x1f46, 0x1ab5, 0x4235, 0x4030, 0x40e0, 0xba47, 0xb207, 0xb25c, 0x1786, 0xbaf3, 0x25bc, 0x430b, 0x4179, 0x436c, 0xbf7b, 0x4616, 0xb033, 0xa35a, 0x0a2f, 0x433c, 0x434f, 0xb254, 0xb2b7, 0x40a2, 0x140c, 0x1d7a, 0xb0df, 0xbf9b, 0x1396, 0x4323, 0x04ee, 0x1ad3, 0x1df6, 0x4001, 0x0825, 0xa444, 0x4221, 0x2085, 0xbfb0, 0x42fc, 0xa67e, 0x419c, 0xba0a, 0xa828, 0x40ec, 0x28b6, 0x4364, 0x4362, 0x2892, 0x419c, 0xb206, 0xb2f1, 0x1795, 0xbf6d, 0x0f94, 0x43e5, 0x1e8c, 0xa665, 0xb0e9, 0x06c5, 0xb22e, 0xbac4, 0x1f02, 0xba21, 0x0048, 0x43f7, 0x402f, 0xbf69, 0x43e2, 0x39d0, 0x1c2b, 0x0c3d, 0x41f5, 0x40a7, 0x4254, 0x4303, 0xa98f, 0x19bb, 0x27cd, 0x43bc, 0xb219, 0x4208, 0x43db, 0xb0e1, 0x42ac, 0x43c3, 0x400d, 0x4151, 0x45e1, 0x4097, 0xba76, 0x0cb1, 0x420d, 0x42eb, 0x466a, 0xbf9b, 0x409e, 0x46c0, 0x4168, 0xaba2, 0x01b0, 0x358b, 0x42e1, 0xbad1, 0x43e7, 0x415f, 0x42bf, 0xb09d, 0x1b7c, 0x38eb, 0xb212, 0xb298, 0x1b3e, 0x3148, 0xbfbd, 0xb038, 0xb003, 0x40b0, 0x1604, 0xbf5b, 0x45a4, 0x1e35, 0x2f5a, 0x0a27, 0x40ff, 0x42d9, 0x4196, 0x0bf3, 0xb0cf, 0x43c3, 0x14c9, 0x41c2, 0x419c, 0xb05f, 0xba3d, 0x407e, 0x4118, 0xbaed, 0x2f0a, 0x066f, 0x409c, 0x4132, 0x40c5, 0xbff0, 0x4592, 0xbf26, 0x1bfb, 0x1004, 0x439a, 0x41bb, 0xbf5e, 0x4543, 0x4243, 0x1faa, 0x4099, 0xb2c4, 0x1c03, 0xb2a7, 0xb200, 0x42e0, 0x01fa, 0x4083, 0x40dd, 0x19d7, 0xb2a3, 0xb2e3, 0xbf8a, 0x19a1, 0xa995, 0x40ad, 0x4564, 0x1a6c, 0x44b1, 0xbf82, 0x29f0, 0x407f, 0x4032, 0x0d94, 0x43c7, 0x1cd1, 0xbfdc, 0xb02a, 0xba7c, 0xa53e, 0x191e, 0x3274, 0x06ff, 0xbf0d, 0xa643, 0x19ed, 0x1ab6, 0x4292, 0xade2, 0x4138, 0x35a7, 0x42a6, 0x2df3, 0xbfc8, 0x410c, 0x194b, 0x40d9, 0x4350, 0xbac2, 0x42b8, 0xba17, 0x408f, 0x430c, 0xb2b4, 0x425b, 0x4319, 0x423d, 0x42c0, 0xb2cf, 0xb233, 0x4601, 0xba6b, 0x448d, 0x435f, 0x4133, 0x421b, 0xbfd7, 0xb263, 0xba08, 0x4386, 0x40c0, 0xba74, 0xb283, 0x4275, 0x405a, 0xa597, 0x3eab, 0xa03e, 0x4317, 0x4194, 0x46d5, 0x40d6, 0x4626, 0x407a, 0x4618, 0xba4b, 0x4185, 0x1fd4, 0xbac4, 0x4676, 0xbad6, 0xbade, 0x42a0, 0x425b, 0x43ee, 0xbf5a, 0x4137, 0xba4e, 0x40aa, 0x43e6, 0xb283, 0x4295, 0xa6de, 0x418f, 0x4314, 0x0bb1, 0x4278, 0xbaea, 0xb256, 0xb0c2, 0x0164, 0x218f, 0xbfb1, 0x40d5, 0x40d7, 0x19d6, 0x4197, 0x4255, 0x42cf, 0x4220, 0x41f8, 0x455e, 0x42fc, 0x42b1, 0x40e2, 0xb01b, 0xb207, 0x4362, 0x0dc2, 0x2f3b, 0x2d06, 0xb259, 0x46ec, 0x46c9, 0xba27, 0x400c, 0xba15, 0xba27, 0x28db, 0x416d, 0x1f98, 0xbf66, 0x4101, 0x4379, 0x4008, 0x26ab, 0x2a72, 0x14da, 0x4675, 0x40b5, 0xbaf2, 0xb2a0, 0x26d3, 0x44c5, 0x094c, 0x41cc, 0xbad0, 0xb255, 0x40f8, 0xbaf0, 0x41d1, 0x1a2c, 0x19e9, 0xb213, 0x263a, 0x429b, 0x4443, 0x1d60, 0x401d, 0xb2b7, 0xbf25, 0x1edf, 0x437a, 0xb0e0, 0x1fdb, 0x1eff, 0xbf08, 0x40c6, 0x418d, 0xac60, 0x41c8, 0x4311, 0xb056, 0x43fd, 0xba3a, 0x1e0a, 0x1c07, 0x4110, 0xba6f, 0xba05, 0x465e, 0x198e, 0xba67, 0x40eb, 0xbfae, 0xb2af, 0x4272, 0xa551, 0xb29a, 0x43dc, 0x42df, 0xba5c, 0x400b, 0x1e9c, 0xae12, 0x447c, 0x429a, 0x456d, 0x41f1, 0x4650, 0xba05, 0x40b7, 0x4385, 0xb2de, 0x4067, 0xbf2a, 0x4065, 0xb20c, 0xbf80, 0x26f3, 0x4060, 0xb27a, 0xba1e, 0xb2e5, 0x1006, 0xbfd0, 0xb226, 0xb225, 0x430a, 0x412a, 0xbf83, 0x1af2, 0x1ce9, 0x413e, 0xa670, 0x43ef, 0x43c2, 0x24d3, 0x1cdf, 0xba14, 0xbf07, 0x4635, 0x432c, 0x2b26, 0x0b9d, 0x443a, 0x1dff, 0x1813, 0xb232, 0xbf77, 0x4308, 0x0d17, 0x1c3f, 0xba68, 0x1bac, 0x445e, 0xb228, 0x43a3, 0x1d1d, 0x1fa3, 0x0765, 0x421b, 0x4133, 0x422d, 0x4113, 0x4169, 0xba43, 0x404c, 0x416f, 0x423d, 0x442f, 0xba0a, 0xbacb, 0x201f, 0xb2d1, 0x42ec, 0x32d0, 0x419e, 0xbf83, 0xbac6, 0x41a1, 0x09d4, 0x1866, 0x422b, 0x4190, 0x422c, 0x4120, 0x1b77, 0x1aa2, 0x43b8, 0x400c, 0x43c2, 0x20d1, 0xb283, 0x421d, 0x1c4a, 0x4105, 0xba4e, 0xb2d5, 0xb257, 0x420e, 0x1800, 0x434b, 0xb256, 0x4365, 0xbf33, 0x412e, 0x1fb4, 0x18f4, 0x4175, 0x4122, 0x1309, 0x41dd, 0xb2a7, 0x4093, 0x2718, 0x223b, 0xb2cd, 0xba41, 0xbf57, 0x435c, 0xa9d4, 0x40c6, 0x4628, 0xa687, 0x1abd, 0xba66, 0x42ef, 0x1edb, 0xb2a1, 0x4174, 0xac29, 0x1832, 0x3f4b, 0x40c1, 0xba29, 0x428f, 0xa663, 0xbf29, 0x437a, 0x44d5, 0x3e25, 0x1e7c, 0x46d4, 0x42d5, 0x0605, 0x3dfc, 0xb25f, 0x415b, 0xbfc3, 0x26e3, 0x3d32, 0x43a2, 0xb063, 0x4216, 0xba27, 0x4147, 0xbfc1, 0xb203, 0x40bf, 0x404c, 0x4498, 0x28ea, 0xba56, 0x456c, 0xb0f5, 0xbf80, 0x230a, 0xb21b, 0x1e7c, 0x3ee1, 0x435f, 0x1e9a, 0x417d, 0x404c, 0xbf0a, 0xba00, 0x41c0, 0xb21d, 0x4261, 0x1f4a, 0x4043, 0x41ec, 0x438f, 0xb0f5, 0xb275, 0xbfc6, 0xb0e6, 0x2fb0, 0x430d, 0x06b2, 0x435a, 0xa453, 0x46a8, 0x4074, 0x43a7, 0x0363, 0x404d, 0xbaf1, 0xba12, 0x1a9d, 0x420c, 0x447c, 0x41f8, 0x434c, 0xb292, 0xbf18, 0xb2c0, 0x4294, 0x4258, 0x4060, 0xbf9f, 0xb2b3, 0x3a02, 0xae29, 0xba20, 0x4770, 0xe7fe + ], + StartRegs = [0x3cccdcbb, 0xb8b42a16, 0x5515dd66, 0x79ed5e7e, 0x48648228, 0x836897c4, 0x72bc80f9, 0xe9ea3611, 0xd38985d1, 0x943bed5a, 0x921c041b, 0x24eee228, 0x42062aa5, 0xb425effb, 0x00000000, 0x700001f0 + ], + FinalRegs = [0x5058e007, 0x00001f30, 0x000000d6, 0x0000301f, 0x07e05850, 0x051ddf28, 0x00001ba0, 0x01000000, 0x0000001f, 0x000010d8, 0x00001080, 0x24eee228, 0x00001080, 0x00001afc, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x4037, 0x4485, 0x422f, 0x1977, 0x42be, 0x400d, 0x43d8, 0x4058, 0x423d, 0x2582, 0x1864, 0xbfc1, 0x4207, 0x4056, 0x1ff5, 0xb2e1, 0x4389, 0xac7e, 0x45ac, 0x41ad, 0x408a, 0x429a, 0x1539, 0xba4c, 0xa1e6, 0xba01, 0xba09, 0xba5e, 0x421d, 0x4005, 0x247d, 0x40f4, 0xbf52, 0x42ac, 0xb214, 0xba5d, 0x100c, 0x448b, 0x080c, 0x4371, 0xbac9, 0xb2db, 0x4319, 0x43a1, 0x4219, 0x43fe, 0x422b, 0x3cd5, 0xb080, 0x4107, 0x403e, 0x4196, 0x0c01, 0xb2a8, 0x2e67, 0xb242, 0x439e, 0x42c0, 0x047e, 0xbfaf, 0x1b5d, 0x43ec, 0x406f, 0x11e0, 0xb2c9, 0x2097, 0xba48, 0x43a2, 0xbf23, 0xb213, 0x43d8, 0xba5c, 0x0e20, 0x43e3, 0x4052, 0x43ad, 0x2a92, 0x1b79, 0x421d, 0xba10, 0x4612, 0x4408, 0xba35, 0x411e, 0xb273, 0xb241, 0x43ec, 0xb017, 0x2b0d, 0x41fb, 0x3ce9, 0xb2b0, 0x40b7, 0xbff0, 0x4191, 0xb226, 0x2331, 0xbf3f, 0xb0e7, 0xba0c, 0xb016, 0xba4c, 0x4323, 0x4241, 0x40ad, 0xbf23, 0x426d, 0x4083, 0x1bd2, 0xa309, 0x1e36, 0xa492, 0xb0c1, 0x1ba7, 0xba32, 0xb2e5, 0x4340, 0x43a3, 0x41af, 0x1493, 0x11be, 0xba11, 0x4274, 0xba14, 0xb056, 0x1c8c, 0x2879, 0x4028, 0x077b, 0x406e, 0x3ff9, 0xbf85, 0x4284, 0x46b9, 0xb247, 0xa8d2, 0x409f, 0xb2c5, 0xba69, 0x050c, 0x1b37, 0x1086, 0x4247, 0x40d0, 0xac04, 0x41e5, 0x41b2, 0x40ff, 0xac10, 0x431d, 0xa41c, 0x4147, 0x44c9, 0xb2b5, 0x4333, 0xbf51, 0x46a9, 0x4598, 0x4110, 0x403c, 0xb26d, 0xb0aa, 0x2212, 0x449a, 0x2adb, 0x1f40, 0xb0c6, 0xba43, 0x3c79, 0x4152, 0xba29, 0x414a, 0x4285, 0x01b1, 0x3d68, 0x1ff0, 0x43ae, 0x410e, 0xbf6f, 0xba00, 0xa19f, 0xb071, 0x4007, 0x41f6, 0xb28f, 0x435e, 0x0d65, 0xa66a, 0x41db, 0x42d0, 0xb006, 0xb246, 0x4142, 0xbf00, 0xb28b, 0x0d98, 0xb297, 0xbf24, 0x409d, 0x4090, 0x434a, 0x4085, 0x42df, 0x40f4, 0x4009, 0x41af, 0x4157, 0x416f, 0x423d, 0x4281, 0xb05e, 0x4370, 0xba4f, 0x19da, 0xb206, 0xba78, 0xba32, 0xbfa5, 0x43f3, 0x2473, 0x28a5, 0x42ca, 0xbf78, 0xb229, 0xbaee, 0xba52, 0x4157, 0x40e9, 0xaa96, 0x409d, 0x4090, 0xb269, 0x4361, 0x466d, 0x434c, 0x43ab, 0x45b9, 0xba6b, 0x1c45, 0x18f8, 0xbfc7, 0x0236, 0x42ff, 0x35f7, 0x1e55, 0x4148, 0xb2f9, 0x16a8, 0x417e, 0x402d, 0x40cd, 0xb0a4, 0x313e, 0x225a, 0x1136, 0xa497, 0x45f4, 0xbfb6, 0x418e, 0x4639, 0x1c68, 0x419e, 0x3bee, 0x1b1a, 0xb030, 0x0ae1, 0x40bd, 0x41c8, 0xa186, 0xbf13, 0x35f5, 0x4172, 0xb2a5, 0x433d, 0x41de, 0xba70, 0x4194, 0x4157, 0x1c65, 0x2daa, 0xbfd0, 0xbf07, 0x4303, 0x4226, 0xba1d, 0xb0ad, 0xbf4c, 0x40b3, 0xbad6, 0xafc9, 0x13c7, 0x0dfe, 0xbad5, 0x4008, 0x1b04, 0x1317, 0xba12, 0x40a5, 0x43c5, 0xb045, 0x18e6, 0x414c, 0x0165, 0xb23a, 0x1c08, 0x305f, 0x3885, 0x4310, 0x4179, 0x4093, 0xb236, 0x407c, 0xb096, 0x405f, 0xbf4e, 0x1d98, 0x17f0, 0x41d5, 0x404c, 0x466b, 0x41e0, 0x41c7, 0xbfd0, 0x4302, 0xba29, 0x428b, 0x429c, 0xb01c, 0x2dec, 0x415c, 0x43d0, 0xb29e, 0x0b28, 0x2572, 0x41c2, 0xb23e, 0xbfb3, 0x1fcc, 0xb23b, 0xb29b, 0xb253, 0x4133, 0x42f0, 0x4555, 0xb00e, 0x3f9e, 0x4352, 0xba62, 0x458a, 0xbf0a, 0xb21b, 0xb2f8, 0x2bd1, 0x4347, 0xbfa8, 0x4140, 0x09a8, 0x16d2, 0x42ad, 0x40a0, 0xb29b, 0x056b, 0xa54c, 0x4224, 0xb2d8, 0x4360, 0xba52, 0x4606, 0x1ea5, 0xb20d, 0xb26c, 0x273f, 0x4062, 0x409c, 0x454c, 0xbf7f, 0x2edf, 0x4290, 0xb06e, 0x422c, 0x4244, 0x1f4d, 0xbf64, 0x432a, 0x1595, 0x413c, 0xbf2d, 0xb0c2, 0x4133, 0x41f7, 0x412b, 0x4482, 0x4347, 0xae85, 0x434d, 0x41a1, 0x42e2, 0xbae1, 0x42ed, 0xb29b, 0x4330, 0x42ba, 0x40df, 0x41eb, 0x3c9f, 0x43a2, 0x3e6f, 0x41e3, 0x229a, 0x41e4, 0x1d5e, 0xbfb6, 0x402f, 0xb201, 0x4024, 0xb030, 0x195a, 0xba4d, 0x464b, 0x4025, 0x0420, 0x1a5a, 0xb25e, 0x1a8d, 0x4133, 0x3e2c, 0x15ef, 0x45be, 0x1cb5, 0x0ec0, 0x1d99, 0x1419, 0x430b, 0x4009, 0x0d89, 0x0030, 0xb22e, 0xbfb3, 0xa6c3, 0x1c87, 0x2728, 0x2023, 0xbfb8, 0x1ee3, 0x413e, 0x41c4, 0x4384, 0x4433, 0xb04b, 0x28c5, 0xb003, 0xbf49, 0x0673, 0x1a62, 0xb2e5, 0x316f, 0xb2bb, 0xb2fe, 0x2ed3, 0x1c7c, 0x1b45, 0x41a2, 0xb29d, 0x16cb, 0x4267, 0xb284, 0x4235, 0x42d2, 0x1dff, 0x1d0a, 0x1ca3, 0x414b, 0xadb4, 0x43cd, 0x3db7, 0x410a, 0xb082, 0x1d92, 0x0461, 0xa273, 0x29f0, 0xbf77, 0x0edf, 0x1957, 0x1d7e, 0x4676, 0x4085, 0x43aa, 0xbff0, 0xb0f1, 0x4249, 0x4045, 0xb2ab, 0xad44, 0x41b4, 0x4129, 0xba75, 0x1dda, 0xaf01, 0x1aa6, 0x1e4d, 0xb27c, 0xb2eb, 0xaf98, 0x35e7, 0xbf07, 0x2f6f, 0x44f9, 0xb2b3, 0x1ed8, 0x3699, 0xbae5, 0x2d3b, 0x4017, 0x26dc, 0x2d2b, 0xba0e, 0xbf60, 0x1718, 0xbf00, 0x2c1a, 0x411e, 0x1a13, 0xb2b4, 0x219d, 0xbf07, 0x424b, 0x43bf, 0x4252, 0x098e, 0x4302, 0x250d, 0x4064, 0xb017, 0x3af3, 0x4222, 0xadfc, 0x41e5, 0xbad6, 0xa529, 0x4085, 0x41e1, 0xba1c, 0x4279, 0x43ba, 0x03fb, 0x2279, 0xb224, 0xb28e, 0x2e71, 0xb230, 0x3733, 0xb085, 0x41cb, 0xb2a8, 0xbf77, 0x4113, 0xa77d, 0x403b, 0x1d4f, 0x3e00, 0xa3df, 0xb243, 0xb2b5, 0x4396, 0x19ea, 0xba1c, 0xbfbc, 0xb23e, 0x410e, 0xba2e, 0x405f, 0x1df6, 0x1b93, 0x4148, 0x401a, 0x41ec, 0xb06d, 0x4277, 0x0f45, 0xb2c0, 0x42b2, 0x4326, 0x1426, 0x2c0d, 0xbf47, 0xba26, 0xb296, 0x1907, 0x43a4, 0x407c, 0x406f, 0x4332, 0x2146, 0x403c, 0x4173, 0x43c5, 0x1463, 0x3d72, 0xa539, 0x02d3, 0xbf85, 0xb2e9, 0x080e, 0x3996, 0xb0c8, 0x3133, 0x422c, 0xbaf6, 0x1e96, 0x414d, 0xb236, 0x4071, 0x1b45, 0x41a3, 0x1b5a, 0x04f2, 0xaaed, 0x43d5, 0x40c1, 0x43ee, 0x4631, 0xb0c0, 0x4616, 0x432f, 0x06c9, 0x1dca, 0xbfe1, 0x2a04, 0x106d, 0x40fd, 0x4417, 0xb245, 0x40c4, 0x4279, 0x1ab5, 0x424d, 0x1c8c, 0x2adf, 0xb215, 0x41fb, 0x1014, 0x41bc, 0x43a2, 0x428a, 0xba77, 0x2e89, 0xba5f, 0xb285, 0xb26f, 0x4071, 0x3346, 0xb22b, 0x4350, 0xbf01, 0x403f, 0x42ef, 0x2d94, 0xba29, 0x421b, 0xbf5c, 0x4164, 0x4616, 0x2ad2, 0xb22d, 0x1fea, 0xbf70, 0x42be, 0x409e, 0x42ef, 0x42fa, 0xb28e, 0xba3b, 0xba70, 0xb25a, 0x07ec, 0x405c, 0x40bf, 0x404e, 0x1bc1, 0xba1a, 0xba63, 0xb2e8, 0x3845, 0x4072, 0x1cc5, 0xbf6f, 0x1fd3, 0x1fd9, 0xb2f7, 0x4077, 0x423b, 0x402d, 0x1abd, 0xbf99, 0x4192, 0xbaf0, 0x3122, 0x2e08, 0x4029, 0xbafe, 0xb263, 0x42e5, 0x38e5, 0x43b0, 0xa37a, 0x3088, 0x421d, 0x2339, 0x1d50, 0xb232, 0x2ba9, 0x0059, 0x442f, 0x1e1a, 0x403d, 0x4223, 0x406b, 0xb005, 0xb2e7, 0xbf21, 0x4391, 0xbad2, 0x40bb, 0x04c5, 0x1e4a, 0x424a, 0x415e, 0x0467, 0xbad2, 0x40c5, 0xa1c5, 0x45d3, 0x43d3, 0xb24f, 0x3261, 0xb05b, 0x4364, 0x420b, 0x19f9, 0x2464, 0xbfd7, 0x240f, 0x411a, 0x0a1e, 0xbaf0, 0xb0bb, 0x40fa, 0xb232, 0x4480, 0x401a, 0x40ea, 0xaa93, 0xbff0, 0x0dd7, 0x43ce, 0x4279, 0xba2c, 0xb20b, 0x3d38, 0xbae1, 0xa965, 0x4201, 0x425a, 0x4217, 0x4469, 0x03f7, 0xbf3e, 0xb0d5, 0xb297, 0x42c4, 0x42b9, 0x42d7, 0x417f, 0x194b, 0x3e69, 0x409f, 0xbf60, 0x4219, 0xa318, 0x3a6a, 0xbf29, 0xb2a3, 0x4649, 0x467b, 0x1528, 0xb0b6, 0x40d0, 0xa445, 0xa6a6, 0x4153, 0x15db, 0x0d2b, 0xa059, 0x3ca7, 0x0813, 0x43fe, 0x199d, 0xbfd4, 0x4138, 0xb00a, 0x1936, 0x4111, 0xa06a, 0x43f8, 0x4041, 0xb2f4, 0x4293, 0xba58, 0x437f, 0x155d, 0x0878, 0xbad2, 0xb0cb, 0x1c3e, 0xbf19, 0x427a, 0x1a09, 0x17be, 0x1742, 0x1f52, 0xb282, 0x404e, 0xb263, 0xba0d, 0x425c, 0xb095, 0x41cd, 0x1d19, 0x0352, 0x1841, 0x26ff, 0xbf7c, 0xbadf, 0x1407, 0x42a3, 0x4025, 0x4330, 0xbaf6, 0xbf91, 0xa711, 0x4002, 0xa488, 0x1a65, 0x4052, 0x19a3, 0x1819, 0x43e7, 0xb239, 0x40a4, 0x31d2, 0xa11f, 0x42e6, 0x43d7, 0x4110, 0x4012, 0x2c2f, 0x43b5, 0x45a1, 0xb2dc, 0x12f9, 0x268b, 0x1993, 0x4228, 0xb20b, 0x419b, 0xb27b, 0x42bb, 0x46a2, 0xbfa9, 0x24ed, 0x41a1, 0x0d0a, 0x1559, 0x4114, 0x42f0, 0xa900, 0x4413, 0x4008, 0xa9f6, 0x05d6, 0xb2a4, 0x42e2, 0x3bdb, 0x435c, 0x1d9f, 0x183f, 0x4063, 0x0c6b, 0x30e3, 0xbf7c, 0x430f, 0x1169, 0xb20a, 0x1ce1, 0x3691, 0xa65e, 0xb20f, 0x40d9, 0x28c6, 0xba56, 0x403d, 0x43e8, 0x1e4e, 0xa2a3, 0xb21f, 0xa649, 0x4428, 0xa8cf, 0x4068, 0xb0f4, 0xb2b0, 0xbfcb, 0xb275, 0x1a56, 0x409b, 0x1ed9, 0x3908, 0x41ca, 0xb0d0, 0x1a06, 0x4230, 0x1f36, 0xbf90, 0xba26, 0x4020, 0xbf78, 0x42fe, 0x46b9, 0x3e8c, 0xa5e7, 0x4272, 0x0d53, 0x4159, 0x41b4, 0x4484, 0xbfc0, 0x4281, 0x414a, 0xad25, 0x195b, 0x43b8, 0x1f77, 0xbf67, 0x404e, 0xba33, 0xa665, 0x45ba, 0xb0ec, 0x41dd, 0x3f03, 0x343b, 0x43a5, 0xa8f0, 0x0ac1, 0x46ab, 0x4223, 0xb060, 0x4240, 0x41fc, 0x0d95, 0x1df4, 0x4299, 0xbff0, 0x0e19, 0xbaf4, 0x4137, 0x40e0, 0x4317, 0x3f08, 0xbf49, 0x1ad3, 0x1977, 0x1e1b, 0x434f, 0xb2ab, 0x22ae, 0xbfcc, 0x4435, 0x0e38, 0x414b, 0x2b42, 0x400f, 0x36e1, 0x41dd, 0xbade, 0x4190, 0xbf6f, 0xa805, 0x4073, 0x41bd, 0x05d3, 0x41b6, 0x1a96, 0x4075, 0x35a1, 0x3336, 0xa35c, 0x4332, 0x431f, 0x26bc, 0xb228, 0x0f68, 0x41ff, 0x438a, 0xb227, 0xbac0, 0xba78, 0xb073, 0x4083, 0x1d03, 0xbf41, 0x4159, 0x2f5c, 0x4081, 0x4337, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x3a4c2871, 0xacd9f7e9, 0x7bcd3cce, 0xadebfcc6, 0xde673e7c, 0x7dd2cf41, 0x7006af38, 0x2bb0bab5, 0xe2b978ed, 0x142f0bcb, 0x8bc78472, 0x492faf1e, 0x7421150a, 0x1ef52200, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0xffff18fc, 0x00000000, 0x000000a6, 0xffff1900, 0xfffffc18, 0x00063f47, 0x000000bc, 0xfffffcbc, 0xe2b978f1, 0x00000000, 0x000000b8, 0xaca0a530, 0x7421150a, 0x59414be9, 0x00000000, 0xa00001d0 }, + Instructions = [0x4037, 0x4485, 0x422f, 0x1977, 0x42be, 0x400d, 0x43d8, 0x4058, 0x423d, 0x2582, 0x1864, 0xbfc1, 0x4207, 0x4056, 0x1ff5, 0xb2e1, 0x4389, 0xac7e, 0x45ac, 0x41ad, 0x408a, 0x429a, 0x1539, 0xba4c, 0xa1e6, 0xba01, 0xba09, 0xba5e, 0x421d, 0x4005, 0x247d, 0x40f4, 0xbf52, 0x42ac, 0xb214, 0xba5d, 0x100c, 0x448b, 0x080c, 0x4371, 0xbac9, 0xb2db, 0x4319, 0x43a1, 0x4219, 0x43fe, 0x422b, 0x3cd5, 0xb080, 0x4107, 0x403e, 0x4196, 0x0c01, 0xb2a8, 0x2e67, 0xb242, 0x439e, 0x42c0, 0x047e, 0xbfaf, 0x1b5d, 0x43ec, 0x406f, 0x11e0, 0xb2c9, 0x2097, 0xba48, 0x43a2, 0xbf23, 0xb213, 0x43d8, 0xba5c, 0x0e20, 0x43e3, 0x4052, 0x43ad, 0x2a92, 0x1b79, 0x421d, 0xba10, 0x4612, 0x4408, 0xba35, 0x411e, 0xb273, 0xb241, 0x43ec, 0xb017, 0x2b0d, 0x41fb, 0x3ce9, 0xb2b0, 0x40b7, 0xbff0, 0x4191, 0xb226, 0x2331, 0xbf3f, 0xb0e7, 0xba0c, 0xb016, 0xba4c, 0x4323, 0x4241, 0x40ad, 0xbf23, 0x426d, 0x4083, 0x1bd2, 0xa309, 0x1e36, 0xa492, 0xb0c1, 0x1ba7, 0xba32, 0xb2e5, 0x4340, 0x43a3, 0x41af, 0x1493, 0x11be, 0xba11, 0x4274, 0xba14, 0xb056, 0x1c8c, 0x2879, 0x4028, 0x077b, 0x406e, 0x3ff9, 0xbf85, 0x4284, 0x46b9, 0xb247, 0xa8d2, 0x409f, 0xb2c5, 0xba69, 0x050c, 0x1b37, 0x1086, 0x4247, 0x40d0, 0xac04, 0x41e5, 0x41b2, 0x40ff, 0xac10, 0x431d, 0xa41c, 0x4147, 0x44c9, 0xb2b5, 0x4333, 0xbf51, 0x46a9, 0x4598, 0x4110, 0x403c, 0xb26d, 0xb0aa, 0x2212, 0x449a, 0x2adb, 0x1f40, 0xb0c6, 0xba43, 0x3c79, 0x4152, 0xba29, 0x414a, 0x4285, 0x01b1, 0x3d68, 0x1ff0, 0x43ae, 0x410e, 0xbf6f, 0xba00, 0xa19f, 0xb071, 0x4007, 0x41f6, 0xb28f, 0x435e, 0x0d65, 0xa66a, 0x41db, 0x42d0, 0xb006, 0xb246, 0x4142, 0xbf00, 0xb28b, 0x0d98, 0xb297, 0xbf24, 0x409d, 0x4090, 0x434a, 0x4085, 0x42df, 0x40f4, 0x4009, 0x41af, 0x4157, 0x416f, 0x423d, 0x4281, 0xb05e, 0x4370, 0xba4f, 0x19da, 0xb206, 0xba78, 0xba32, 0xbfa5, 0x43f3, 0x2473, 0x28a5, 0x42ca, 0xbf78, 0xb229, 0xbaee, 0xba52, 0x4157, 0x40e9, 0xaa96, 0x409d, 0x4090, 0xb269, 0x4361, 0x466d, 0x434c, 0x43ab, 0x45b9, 0xba6b, 0x1c45, 0x18f8, 0xbfc7, 0x0236, 0x42ff, 0x35f7, 0x1e55, 0x4148, 0xb2f9, 0x16a8, 0x417e, 0x402d, 0x40cd, 0xb0a4, 0x313e, 0x225a, 0x1136, 0xa497, 0x45f4, 0xbfb6, 0x418e, 0x4639, 0x1c68, 0x419e, 0x3bee, 0x1b1a, 0xb030, 0x0ae1, 0x40bd, 0x41c8, 0xa186, 0xbf13, 0x35f5, 0x4172, 0xb2a5, 0x433d, 0x41de, 0xba70, 0x4194, 0x4157, 0x1c65, 0x2daa, 0xbfd0, 0xbf07, 0x4303, 0x4226, 0xba1d, 0xb0ad, 0xbf4c, 0x40b3, 0xbad6, 0xafc9, 0x13c7, 0x0dfe, 0xbad5, 0x4008, 0x1b04, 0x1317, 0xba12, 0x40a5, 0x43c5, 0xb045, 0x18e6, 0x414c, 0x0165, 0xb23a, 0x1c08, 0x305f, 0x3885, 0x4310, 0x4179, 0x4093, 0xb236, 0x407c, 0xb096, 0x405f, 0xbf4e, 0x1d98, 0x17f0, 0x41d5, 0x404c, 0x466b, 0x41e0, 0x41c7, 0xbfd0, 0x4302, 0xba29, 0x428b, 0x429c, 0xb01c, 0x2dec, 0x415c, 0x43d0, 0xb29e, 0x0b28, 0x2572, 0x41c2, 0xb23e, 0xbfb3, 0x1fcc, 0xb23b, 0xb29b, 0xb253, 0x4133, 0x42f0, 0x4555, 0xb00e, 0x3f9e, 0x4352, 0xba62, 0x458a, 0xbf0a, 0xb21b, 0xb2f8, 0x2bd1, 0x4347, 0xbfa8, 0x4140, 0x09a8, 0x16d2, 0x42ad, 0x40a0, 0xb29b, 0x056b, 0xa54c, 0x4224, 0xb2d8, 0x4360, 0xba52, 0x4606, 0x1ea5, 0xb20d, 0xb26c, 0x273f, 0x4062, 0x409c, 0x454c, 0xbf7f, 0x2edf, 0x4290, 0xb06e, 0x422c, 0x4244, 0x1f4d, 0xbf64, 0x432a, 0x1595, 0x413c, 0xbf2d, 0xb0c2, 0x4133, 0x41f7, 0x412b, 0x4482, 0x4347, 0xae85, 0x434d, 0x41a1, 0x42e2, 0xbae1, 0x42ed, 0xb29b, 0x4330, 0x42ba, 0x40df, 0x41eb, 0x3c9f, 0x43a2, 0x3e6f, 0x41e3, 0x229a, 0x41e4, 0x1d5e, 0xbfb6, 0x402f, 0xb201, 0x4024, 0xb030, 0x195a, 0xba4d, 0x464b, 0x4025, 0x0420, 0x1a5a, 0xb25e, 0x1a8d, 0x4133, 0x3e2c, 0x15ef, 0x45be, 0x1cb5, 0x0ec0, 0x1d99, 0x1419, 0x430b, 0x4009, 0x0d89, 0x0030, 0xb22e, 0xbfb3, 0xa6c3, 0x1c87, 0x2728, 0x2023, 0xbfb8, 0x1ee3, 0x413e, 0x41c4, 0x4384, 0x4433, 0xb04b, 0x28c5, 0xb003, 0xbf49, 0x0673, 0x1a62, 0xb2e5, 0x316f, 0xb2bb, 0xb2fe, 0x2ed3, 0x1c7c, 0x1b45, 0x41a2, 0xb29d, 0x16cb, 0x4267, 0xb284, 0x4235, 0x42d2, 0x1dff, 0x1d0a, 0x1ca3, 0x414b, 0xadb4, 0x43cd, 0x3db7, 0x410a, 0xb082, 0x1d92, 0x0461, 0xa273, 0x29f0, 0xbf77, 0x0edf, 0x1957, 0x1d7e, 0x4676, 0x4085, 0x43aa, 0xbff0, 0xb0f1, 0x4249, 0x4045, 0xb2ab, 0xad44, 0x41b4, 0x4129, 0xba75, 0x1dda, 0xaf01, 0x1aa6, 0x1e4d, 0xb27c, 0xb2eb, 0xaf98, 0x35e7, 0xbf07, 0x2f6f, 0x44f9, 0xb2b3, 0x1ed8, 0x3699, 0xbae5, 0x2d3b, 0x4017, 0x26dc, 0x2d2b, 0xba0e, 0xbf60, 0x1718, 0xbf00, 0x2c1a, 0x411e, 0x1a13, 0xb2b4, 0x219d, 0xbf07, 0x424b, 0x43bf, 0x4252, 0x098e, 0x4302, 0x250d, 0x4064, 0xb017, 0x3af3, 0x4222, 0xadfc, 0x41e5, 0xbad6, 0xa529, 0x4085, 0x41e1, 0xba1c, 0x4279, 0x43ba, 0x03fb, 0x2279, 0xb224, 0xb28e, 0x2e71, 0xb230, 0x3733, 0xb085, 0x41cb, 0xb2a8, 0xbf77, 0x4113, 0xa77d, 0x403b, 0x1d4f, 0x3e00, 0xa3df, 0xb243, 0xb2b5, 0x4396, 0x19ea, 0xba1c, 0xbfbc, 0xb23e, 0x410e, 0xba2e, 0x405f, 0x1df6, 0x1b93, 0x4148, 0x401a, 0x41ec, 0xb06d, 0x4277, 0x0f45, 0xb2c0, 0x42b2, 0x4326, 0x1426, 0x2c0d, 0xbf47, 0xba26, 0xb296, 0x1907, 0x43a4, 0x407c, 0x406f, 0x4332, 0x2146, 0x403c, 0x4173, 0x43c5, 0x1463, 0x3d72, 0xa539, 0x02d3, 0xbf85, 0xb2e9, 0x080e, 0x3996, 0xb0c8, 0x3133, 0x422c, 0xbaf6, 0x1e96, 0x414d, 0xb236, 0x4071, 0x1b45, 0x41a3, 0x1b5a, 0x04f2, 0xaaed, 0x43d5, 0x40c1, 0x43ee, 0x4631, 0xb0c0, 0x4616, 0x432f, 0x06c9, 0x1dca, 0xbfe1, 0x2a04, 0x106d, 0x40fd, 0x4417, 0xb245, 0x40c4, 0x4279, 0x1ab5, 0x424d, 0x1c8c, 0x2adf, 0xb215, 0x41fb, 0x1014, 0x41bc, 0x43a2, 0x428a, 0xba77, 0x2e89, 0xba5f, 0xb285, 0xb26f, 0x4071, 0x3346, 0xb22b, 0x4350, 0xbf01, 0x403f, 0x42ef, 0x2d94, 0xba29, 0x421b, 0xbf5c, 0x4164, 0x4616, 0x2ad2, 0xb22d, 0x1fea, 0xbf70, 0x42be, 0x409e, 0x42ef, 0x42fa, 0xb28e, 0xba3b, 0xba70, 0xb25a, 0x07ec, 0x405c, 0x40bf, 0x404e, 0x1bc1, 0xba1a, 0xba63, 0xb2e8, 0x3845, 0x4072, 0x1cc5, 0xbf6f, 0x1fd3, 0x1fd9, 0xb2f7, 0x4077, 0x423b, 0x402d, 0x1abd, 0xbf99, 0x4192, 0xbaf0, 0x3122, 0x2e08, 0x4029, 0xbafe, 0xb263, 0x42e5, 0x38e5, 0x43b0, 0xa37a, 0x3088, 0x421d, 0x2339, 0x1d50, 0xb232, 0x2ba9, 0x0059, 0x442f, 0x1e1a, 0x403d, 0x4223, 0x406b, 0xb005, 0xb2e7, 0xbf21, 0x4391, 0xbad2, 0x40bb, 0x04c5, 0x1e4a, 0x424a, 0x415e, 0x0467, 0xbad2, 0x40c5, 0xa1c5, 0x45d3, 0x43d3, 0xb24f, 0x3261, 0xb05b, 0x4364, 0x420b, 0x19f9, 0x2464, 0xbfd7, 0x240f, 0x411a, 0x0a1e, 0xbaf0, 0xb0bb, 0x40fa, 0xb232, 0x4480, 0x401a, 0x40ea, 0xaa93, 0xbff0, 0x0dd7, 0x43ce, 0x4279, 0xba2c, 0xb20b, 0x3d38, 0xbae1, 0xa965, 0x4201, 0x425a, 0x4217, 0x4469, 0x03f7, 0xbf3e, 0xb0d5, 0xb297, 0x42c4, 0x42b9, 0x42d7, 0x417f, 0x194b, 0x3e69, 0x409f, 0xbf60, 0x4219, 0xa318, 0x3a6a, 0xbf29, 0xb2a3, 0x4649, 0x467b, 0x1528, 0xb0b6, 0x40d0, 0xa445, 0xa6a6, 0x4153, 0x15db, 0x0d2b, 0xa059, 0x3ca7, 0x0813, 0x43fe, 0x199d, 0xbfd4, 0x4138, 0xb00a, 0x1936, 0x4111, 0xa06a, 0x43f8, 0x4041, 0xb2f4, 0x4293, 0xba58, 0x437f, 0x155d, 0x0878, 0xbad2, 0xb0cb, 0x1c3e, 0xbf19, 0x427a, 0x1a09, 0x17be, 0x1742, 0x1f52, 0xb282, 0x404e, 0xb263, 0xba0d, 0x425c, 0xb095, 0x41cd, 0x1d19, 0x0352, 0x1841, 0x26ff, 0xbf7c, 0xbadf, 0x1407, 0x42a3, 0x4025, 0x4330, 0xbaf6, 0xbf91, 0xa711, 0x4002, 0xa488, 0x1a65, 0x4052, 0x19a3, 0x1819, 0x43e7, 0xb239, 0x40a4, 0x31d2, 0xa11f, 0x42e6, 0x43d7, 0x4110, 0x4012, 0x2c2f, 0x43b5, 0x45a1, 0xb2dc, 0x12f9, 0x268b, 0x1993, 0x4228, 0xb20b, 0x419b, 0xb27b, 0x42bb, 0x46a2, 0xbfa9, 0x24ed, 0x41a1, 0x0d0a, 0x1559, 0x4114, 0x42f0, 0xa900, 0x4413, 0x4008, 0xa9f6, 0x05d6, 0xb2a4, 0x42e2, 0x3bdb, 0x435c, 0x1d9f, 0x183f, 0x4063, 0x0c6b, 0x30e3, 0xbf7c, 0x430f, 0x1169, 0xb20a, 0x1ce1, 0x3691, 0xa65e, 0xb20f, 0x40d9, 0x28c6, 0xba56, 0x403d, 0x43e8, 0x1e4e, 0xa2a3, 0xb21f, 0xa649, 0x4428, 0xa8cf, 0x4068, 0xb0f4, 0xb2b0, 0xbfcb, 0xb275, 0x1a56, 0x409b, 0x1ed9, 0x3908, 0x41ca, 0xb0d0, 0x1a06, 0x4230, 0x1f36, 0xbf90, 0xba26, 0x4020, 0xbf78, 0x42fe, 0x46b9, 0x3e8c, 0xa5e7, 0x4272, 0x0d53, 0x4159, 0x41b4, 0x4484, 0xbfc0, 0x4281, 0x414a, 0xad25, 0x195b, 0x43b8, 0x1f77, 0xbf67, 0x404e, 0xba33, 0xa665, 0x45ba, 0xb0ec, 0x41dd, 0x3f03, 0x343b, 0x43a5, 0xa8f0, 0x0ac1, 0x46ab, 0x4223, 0xb060, 0x4240, 0x41fc, 0x0d95, 0x1df4, 0x4299, 0xbff0, 0x0e19, 0xbaf4, 0x4137, 0x40e0, 0x4317, 0x3f08, 0xbf49, 0x1ad3, 0x1977, 0x1e1b, 0x434f, 0xb2ab, 0x22ae, 0xbfcc, 0x4435, 0x0e38, 0x414b, 0x2b42, 0x400f, 0x36e1, 0x41dd, 0xbade, 0x4190, 0xbf6f, 0xa805, 0x4073, 0x41bd, 0x05d3, 0x41b6, 0x1a96, 0x4075, 0x35a1, 0x3336, 0xa35c, 0x4332, 0x431f, 0x26bc, 0xb228, 0x0f68, 0x41ff, 0x438a, 0xb227, 0xbac0, 0xba78, 0xb073, 0x4083, 0x1d03, 0xbf41, 0x4159, 0x2f5c, 0x4081, 0x4337, 0x4770, 0xe7fe + ], + StartRegs = [0x3a4c2871, 0xacd9f7e9, 0x7bcd3cce, 0xadebfcc6, 0xde673e7c, 0x7dd2cf41, 0x7006af38, 0x2bb0bab5, 0xe2b978ed, 0x142f0bcb, 0x8bc78472, 0x492faf1e, 0x7421150a, 0x1ef52200, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0xffff18fc, 0x00000000, 0x000000a6, 0xffff1900, 0xfffffc18, 0x00063f47, 0x000000bc, 0xfffffcbc, 0xe2b978f1, 0x00000000, 0x000000b8, 0xaca0a530, 0x7421150a, 0x59414be9, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0xb25e, 0x4201, 0xb0f6, 0x437b, 0xbf28, 0x1a61, 0x41f3, 0xb2af, 0xba52, 0xb0be, 0x0ee9, 0x18cb, 0x2ddc, 0x3e47, 0x4216, 0xb2e8, 0x40c7, 0x33d7, 0x42a9, 0x412a, 0x4322, 0x4313, 0x42b0, 0xbfbc, 0x42d1, 0x4309, 0xb2bc, 0xa626, 0xbfaf, 0x41e6, 0x4026, 0x4028, 0xa235, 0x40c3, 0xb030, 0xbfa0, 0x4331, 0xacd4, 0x2a6c, 0x4058, 0x353b, 0x42eb, 0x199e, 0x1a78, 0x1e98, 0x1222, 0x4677, 0x180d, 0x1b21, 0x36a8, 0x1d5e, 0xba01, 0x42b0, 0x4110, 0x416f, 0x4007, 0x1bb0, 0xab34, 0xbf31, 0x40f0, 0x46d4, 0x422e, 0xb2db, 0xa831, 0x2443, 0x40a8, 0xb002, 0xba2f, 0x41df, 0x4363, 0xa95d, 0xba57, 0xb2bf, 0x43b9, 0x427a, 0x4550, 0x1af8, 0xbad9, 0xb2cf, 0xbfb0, 0x4300, 0x4301, 0xbf4f, 0x42f3, 0xb2c5, 0xba77, 0x4157, 0xb2cc, 0x12ef, 0x187c, 0x46d9, 0xa1ec, 0x1c3f, 0xa4c0, 0x34a8, 0xa8ec, 0xb25d, 0x4253, 0x40d1, 0x4122, 0xbafd, 0x42fe, 0x19fb, 0x4566, 0xba75, 0x3820, 0x4115, 0x412e, 0x1f3f, 0xbf8d, 0x10fe, 0x4231, 0x40d3, 0xb054, 0x1750, 0xb07a, 0x1be5, 0x41a9, 0xb227, 0x431e, 0x41a3, 0xbae7, 0x43c0, 0x2338, 0x41c9, 0x4026, 0x4368, 0x4371, 0x42ad, 0xb2be, 0x1d31, 0x1cfb, 0x41f2, 0x3242, 0xbf33, 0x3a13, 0xbae1, 0xb03a, 0x4698, 0x4130, 0x44e0, 0xb238, 0x417b, 0x40f2, 0xbfbe, 0x4233, 0x4115, 0x45a8, 0x41cb, 0x46c3, 0x30b0, 0x42df, 0xa26e, 0xb2b7, 0x4205, 0xbf5b, 0xba12, 0xa0ae, 0x4247, 0x46e0, 0xb2c5, 0x41ed, 0x4068, 0x41e9, 0x19fd, 0x435a, 0x41e7, 0xb2f1, 0xb2b0, 0x41a1, 0x43c4, 0x45dc, 0x4387, 0x40b8, 0x2a85, 0x19fc, 0x4360, 0x4545, 0x1930, 0x41b3, 0x24ec, 0xbfa0, 0x42bc, 0x403f, 0xbf7d, 0xaf68, 0xb2d1, 0x4238, 0xb2a9, 0x4346, 0xb09b, 0xa482, 0x41d9, 0xba36, 0x4108, 0xb281, 0xba17, 0x28a4, 0x16f0, 0x10b0, 0x22f2, 0x467d, 0xac2a, 0x133e, 0x4195, 0x0338, 0x41dc, 0xbf03, 0x41c7, 0x4375, 0x41db, 0x4608, 0x45a0, 0x401a, 0x1b82, 0x42ca, 0xb01b, 0x206b, 0x4610, 0x1db7, 0x44dd, 0xa4e6, 0x0c75, 0x4064, 0x41ec, 0x27c6, 0x4371, 0x42f1, 0x418f, 0xb2d6, 0x237a, 0x209a, 0x364f, 0x4183, 0x4252, 0xbac8, 0xbf48, 0x32a8, 0x1805, 0x42d8, 0x1fab, 0x18b3, 0x41fa, 0x04ab, 0xbf80, 0x19b6, 0x1a4d, 0x41c2, 0x1b8f, 0xb23a, 0x40a9, 0xbaff, 0x40ec, 0x4313, 0x40d2, 0xb09a, 0xb218, 0x42da, 0x1f49, 0x41ab, 0xb22b, 0xbf58, 0xba62, 0x4020, 0x1f31, 0xb293, 0x4136, 0x24c0, 0x088e, 0x4252, 0x2136, 0x3252, 0x2efa, 0xa1bf, 0x04ad, 0x1c79, 0xb01c, 0x43f7, 0x42e6, 0x426d, 0x4364, 0x4236, 0xb298, 0xbf24, 0x26e7, 0xb27d, 0xae82, 0x414b, 0xa71c, 0x44f0, 0x4395, 0x421c, 0xb29b, 0x409f, 0xbfd9, 0xb206, 0x43c8, 0x19f8, 0xb24d, 0x4265, 0x419f, 0x414d, 0x429b, 0x45c5, 0x435a, 0x11d9, 0xb259, 0x4188, 0xba06, 0x204d, 0x1b38, 0x4296, 0xa47f, 0xbf03, 0x45ad, 0x167f, 0x23eb, 0xb237, 0xb289, 0x1c1c, 0x43ef, 0x42ad, 0xa496, 0x438e, 0xb0a6, 0x3afb, 0xb229, 0x2661, 0x4159, 0x4384, 0x3b07, 0x45b8, 0x09ae, 0x3811, 0xbfa1, 0x3db5, 0xb217, 0x2dff, 0x43a2, 0xb28a, 0xbfa3, 0xba3f, 0xb2ec, 0xb2e0, 0xb067, 0x0a10, 0xb20a, 0xa2ad, 0x446b, 0xb27d, 0x05f3, 0x4248, 0xb02b, 0x43be, 0xba20, 0xbf90, 0x2133, 0x0c37, 0x254d, 0x4144, 0xb213, 0x403f, 0x1356, 0xa35e, 0x4219, 0x438d, 0xb211, 0x42ae, 0xbfbd, 0x1e52, 0x3cf3, 0x1d3c, 0xb287, 0x0781, 0x405e, 0x41a9, 0x436e, 0x1ebf, 0xbf01, 0x0041, 0x29a5, 0x422e, 0xba5a, 0xb0f3, 0x4355, 0x41b5, 0x421c, 0x4191, 0x4276, 0x43cb, 0xbae3, 0x42d1, 0xba32, 0xbfc0, 0xb232, 0xbf6a, 0x4013, 0x4256, 0xba73, 0x40a9, 0xba05, 0x1de9, 0xbf04, 0x4170, 0x42da, 0x40a6, 0x13a4, 0x4084, 0x42da, 0xbfa0, 0x4081, 0xbfd9, 0x220b, 0xb26f, 0x41ee, 0xba5b, 0xba52, 0x43e1, 0xb2b4, 0x1ffd, 0xbf6b, 0xb278, 0x4690, 0x4370, 0x3669, 0xb21e, 0xb017, 0x375d, 0x4131, 0x407e, 0x40e7, 0x4638, 0x0d44, 0x4254, 0x3476, 0x41ec, 0x42fd, 0x1ccd, 0xb295, 0xbfd0, 0x401c, 0x3235, 0x4645, 0x155b, 0x0311, 0x41db, 0x40c0, 0x396d, 0x0ba6, 0xbfaf, 0x0e6d, 0x43fd, 0xa6bc, 0x401a, 0xbafc, 0x421e, 0xbf18, 0x1886, 0x4106, 0xbf27, 0x12cb, 0x43c8, 0xba28, 0x4011, 0xba7f, 0x1103, 0xbac5, 0x193b, 0x466d, 0x42c5, 0x184a, 0x0d38, 0xbf62, 0x3f92, 0x43e9, 0xaa66, 0xb093, 0x334d, 0xba06, 0x1ebb, 0xb2ff, 0x465e, 0xb24e, 0xbade, 0xbfa3, 0x2abf, 0x3186, 0x430a, 0x448a, 0x434f, 0xb291, 0x4215, 0x1952, 0xb003, 0x41ec, 0x44ed, 0x438f, 0x42f3, 0x424c, 0x4025, 0xb0d7, 0x18f0, 0xb25d, 0x416e, 0x4120, 0x45a9, 0xb0f9, 0xb2fd, 0xbaed, 0xba7d, 0xbfd3, 0x41ec, 0xb22b, 0x428a, 0x42e5, 0xb02c, 0x1b7c, 0x37e0, 0x430a, 0x190a, 0x25db, 0x2eff, 0xb276, 0x0b11, 0xbfe2, 0xab47, 0x251c, 0xb223, 0x31c7, 0xbaf2, 0xb001, 0xb212, 0x30f1, 0xa44c, 0x41ae, 0x418d, 0x40a4, 0xb0b6, 0x4331, 0x425a, 0x4040, 0x1849, 0xb03a, 0x1959, 0xb092, 0x429d, 0x4188, 0xbf12, 0x4619, 0xba68, 0xbf60, 0xbf80, 0x42b8, 0x0a84, 0xb2fe, 0x456c, 0xb0f3, 0x4194, 0xb272, 0xb0d7, 0xb2de, 0x4353, 0x0e33, 0x1c0a, 0xbac8, 0x42c6, 0x19ff, 0x43af, 0x4089, 0xbfb8, 0x3b9b, 0x096d, 0x31ac, 0x0234, 0x40cf, 0x24b8, 0x4278, 0x417a, 0x4309, 0x427e, 0xb070, 0x42cf, 0x40a9, 0x433b, 0x418d, 0xb2be, 0x1969, 0x429e, 0x43af, 0xbf1f, 0x0b1a, 0x4286, 0x41ce, 0x426d, 0x4136, 0x1ec7, 0x3425, 0xa663, 0x4457, 0xb2a4, 0x43b1, 0x41e0, 0xb2cc, 0x26cc, 0xbad6, 0xbacc, 0xb2e0, 0x4018, 0x3a50, 0xb2bf, 0xba3b, 0xbadb, 0xb0c4, 0xbf09, 0x1167, 0x4099, 0x044b, 0xba75, 0x43d6, 0xba3a, 0x43f5, 0x2c1c, 0xba5a, 0x43bc, 0x42a9, 0x1c95, 0xad4c, 0x43e4, 0x46cc, 0x42cc, 0x2605, 0x4009, 0x1871, 0x4069, 0xba37, 0x411d, 0x1807, 0x426d, 0x423b, 0x0fab, 0x4159, 0xbf83, 0x4290, 0x1d71, 0x3601, 0xa5d0, 0xb23a, 0x1cfb, 0x42fc, 0x435f, 0x4003, 0xa2b5, 0x4163, 0x4185, 0x403c, 0xb0d0, 0x1ae1, 0xb271, 0xafbc, 0x40cb, 0x4174, 0xbf69, 0xb258, 0xb2ec, 0x42c0, 0x41dd, 0x197d, 0xbf14, 0xa735, 0x38c4, 0x4188, 0xbfb0, 0xbf0d, 0x4117, 0x41ae, 0xb0e8, 0x411b, 0x4155, 0x43bb, 0xba44, 0x4198, 0xb2cd, 0xbfc7, 0xbae2, 0xb2c4, 0x43d7, 0x1e4d, 0x34ca, 0xb223, 0x439c, 0xb294, 0xbae1, 0x1d72, 0xbfe0, 0xb2ef, 0x4363, 0xbfb9, 0x413e, 0x408b, 0xa5be, 0x2675, 0x42d3, 0xb204, 0x1ff1, 0x096f, 0x41dd, 0x3c1e, 0xb2bd, 0x40c6, 0x2575, 0xb2b1, 0x1910, 0x4607, 0x42b8, 0x43dd, 0x4329, 0x4112, 0x1ea0, 0x1b9b, 0xa27c, 0xbadf, 0xbf81, 0x4088, 0x41a7, 0xada0, 0x0db4, 0xb2fe, 0x408a, 0x18da, 0xb026, 0xb0b3, 0x43f1, 0x4467, 0xbfaf, 0x4367, 0xbad4, 0x405f, 0x4286, 0x1a0d, 0xb2b7, 0x4571, 0x183e, 0x43cf, 0x1a0d, 0x4036, 0x424f, 0x41a4, 0x410f, 0x46a2, 0xaf85, 0xa17c, 0x433b, 0xbf0e, 0x4022, 0x43f0, 0x11a4, 0x40c4, 0xba2c, 0x18a6, 0x1a93, 0x41d1, 0xa8a3, 0xbaf8, 0x4584, 0xbff0, 0xb23a, 0x4385, 0x43d8, 0xb29b, 0x4362, 0xb20f, 0xb0a7, 0xad67, 0xb252, 0xbf8a, 0x1cb1, 0xb215, 0x41a4, 0x40b3, 0x2a7b, 0x0d23, 0x4199, 0x18ce, 0x4618, 0x144a, 0x3082, 0x1c3e, 0xbf57, 0x32de, 0x412d, 0xb298, 0x4648, 0x1c4d, 0x1df9, 0x3e54, 0xbf8e, 0x4488, 0x4092, 0xb200, 0xba13, 0x41a1, 0xba23, 0x1d7d, 0xba09, 0x2b1c, 0x4691, 0x397f, 0x4032, 0xbf0e, 0xba67, 0x40e5, 0xb2f3, 0xbff0, 0xba04, 0x3ec6, 0x1a0f, 0x408b, 0xb2e2, 0xbfe2, 0x4224, 0x195a, 0x3204, 0x430d, 0x39cb, 0x1c36, 0xb23f, 0x1977, 0xb030, 0x46f4, 0xb2fe, 0xba77, 0x4141, 0xb276, 0x4217, 0xbf60, 0xb223, 0xb2ca, 0x43bd, 0x4204, 0x41d0, 0xa049, 0x4352, 0xb035, 0xbf05, 0x4396, 0x429b, 0xa066, 0x0975, 0x409b, 0x46bd, 0x2aa5, 0xb2b9, 0xba09, 0xb05e, 0x422d, 0x1d65, 0x42c5, 0x42d4, 0x0533, 0x221b, 0x42c2, 0xa9dd, 0x2ac2, 0xad89, 0x4263, 0x4378, 0x40ff, 0x429b, 0x4282, 0x421f, 0xb0c4, 0xbf56, 0xb0c4, 0xb070, 0xbac9, 0x43ff, 0x1bd4, 0x418f, 0x09b8, 0xb0a8, 0xbfc7, 0x455a, 0x04bf, 0xba69, 0x4283, 0x404a, 0x43a2, 0x449b, 0x1e46, 0x4130, 0x4305, 0xb272, 0x1203, 0x43f4, 0x437e, 0xb066, 0x4273, 0x0f4c, 0x4612, 0xaa6e, 0x08d1, 0x437c, 0x461d, 0x44ac, 0xa824, 0xb2cd, 0xb01f, 0xbf53, 0xbfa0, 0xb283, 0x4151, 0xb284, 0x41f4, 0x406e, 0xb038, 0x4330, 0x420d, 0x44b5, 0xb2b2, 0xa730, 0xb2e0, 0x2b11, 0x4698, 0x4142, 0xb2f9, 0x42ec, 0xb08e, 0x3c8b, 0x42bc, 0xb22e, 0x4226, 0x400b, 0xb219, 0xbf25, 0x43c3, 0xbf00, 0x4345, 0x40aa, 0xb0a0, 0x1a70, 0x429e, 0x4074, 0x41af, 0xb272, 0xb0af, 0xb0f4, 0x42ff, 0xba34, 0x4342, 0x399a, 0x46cd, 0x19e4, 0x3c64, 0xbfcf, 0x40e9, 0x40c2, 0x3ac5, 0x323c, 0x307e, 0xba37, 0xba17, 0xb2f7, 0x207f, 0x431e, 0xac1e, 0xb0c8, 0x41b1, 0x436b, 0x40d1, 0xb02b, 0xbfe8, 0x4335, 0x41ba, 0x1cad, 0xa482, 0xbacd, 0xb285, 0x401c, 0xa85b, 0x4199, 0x4392, 0xbfbb, 0xb045, 0x0935, 0x30e0, 0x4226, 0xb22e, 0x282a, 0xb2e5, 0x40c8, 0x4326, 0x2bf9, 0x4197, 0xbf16, 0x4371, 0xb2ea, 0x40c4, 0x3f3c, 0xb285, 0x4170, 0x40ce, 0x2706, 0x308f, 0xbfbe, 0x4113, 0x0553, 0xbad5, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x9b4ed9e3, 0xfb4d9b4f, 0xf2becf95, 0xee40ea2c, 0x9b566ffa, 0x1e8d47a2, 0xeeda6eed, 0x8e4fe94e, 0x87b89292, 0x5bc99f48, 0xcdbc076e, 0x49f2a792, 0x65012e66, 0x2d75e18d, 0x00000000, 0xa00001f0 }, - FinalRegs = new uint[] { 0x40001b7a, 0x000019ff, 0x00000000, 0xffffffff, 0x00000000, 0x000000ec, 0x00000000, 0x00000006, 0xef680aac, 0x80000000, 0xffffffff, 0xc2cc9a01, 0xef680aac, 0x7fffff8c, 0x00000000, 0x000001d0 }, + Instructions = [0xb25e, 0x4201, 0xb0f6, 0x437b, 0xbf28, 0x1a61, 0x41f3, 0xb2af, 0xba52, 0xb0be, 0x0ee9, 0x18cb, 0x2ddc, 0x3e47, 0x4216, 0xb2e8, 0x40c7, 0x33d7, 0x42a9, 0x412a, 0x4322, 0x4313, 0x42b0, 0xbfbc, 0x42d1, 0x4309, 0xb2bc, 0xa626, 0xbfaf, 0x41e6, 0x4026, 0x4028, 0xa235, 0x40c3, 0xb030, 0xbfa0, 0x4331, 0xacd4, 0x2a6c, 0x4058, 0x353b, 0x42eb, 0x199e, 0x1a78, 0x1e98, 0x1222, 0x4677, 0x180d, 0x1b21, 0x36a8, 0x1d5e, 0xba01, 0x42b0, 0x4110, 0x416f, 0x4007, 0x1bb0, 0xab34, 0xbf31, 0x40f0, 0x46d4, 0x422e, 0xb2db, 0xa831, 0x2443, 0x40a8, 0xb002, 0xba2f, 0x41df, 0x4363, 0xa95d, 0xba57, 0xb2bf, 0x43b9, 0x427a, 0x4550, 0x1af8, 0xbad9, 0xb2cf, 0xbfb0, 0x4300, 0x4301, 0xbf4f, 0x42f3, 0xb2c5, 0xba77, 0x4157, 0xb2cc, 0x12ef, 0x187c, 0x46d9, 0xa1ec, 0x1c3f, 0xa4c0, 0x34a8, 0xa8ec, 0xb25d, 0x4253, 0x40d1, 0x4122, 0xbafd, 0x42fe, 0x19fb, 0x4566, 0xba75, 0x3820, 0x4115, 0x412e, 0x1f3f, 0xbf8d, 0x10fe, 0x4231, 0x40d3, 0xb054, 0x1750, 0xb07a, 0x1be5, 0x41a9, 0xb227, 0x431e, 0x41a3, 0xbae7, 0x43c0, 0x2338, 0x41c9, 0x4026, 0x4368, 0x4371, 0x42ad, 0xb2be, 0x1d31, 0x1cfb, 0x41f2, 0x3242, 0xbf33, 0x3a13, 0xbae1, 0xb03a, 0x4698, 0x4130, 0x44e0, 0xb238, 0x417b, 0x40f2, 0xbfbe, 0x4233, 0x4115, 0x45a8, 0x41cb, 0x46c3, 0x30b0, 0x42df, 0xa26e, 0xb2b7, 0x4205, 0xbf5b, 0xba12, 0xa0ae, 0x4247, 0x46e0, 0xb2c5, 0x41ed, 0x4068, 0x41e9, 0x19fd, 0x435a, 0x41e7, 0xb2f1, 0xb2b0, 0x41a1, 0x43c4, 0x45dc, 0x4387, 0x40b8, 0x2a85, 0x19fc, 0x4360, 0x4545, 0x1930, 0x41b3, 0x24ec, 0xbfa0, 0x42bc, 0x403f, 0xbf7d, 0xaf68, 0xb2d1, 0x4238, 0xb2a9, 0x4346, 0xb09b, 0xa482, 0x41d9, 0xba36, 0x4108, 0xb281, 0xba17, 0x28a4, 0x16f0, 0x10b0, 0x22f2, 0x467d, 0xac2a, 0x133e, 0x4195, 0x0338, 0x41dc, 0xbf03, 0x41c7, 0x4375, 0x41db, 0x4608, 0x45a0, 0x401a, 0x1b82, 0x42ca, 0xb01b, 0x206b, 0x4610, 0x1db7, 0x44dd, 0xa4e6, 0x0c75, 0x4064, 0x41ec, 0x27c6, 0x4371, 0x42f1, 0x418f, 0xb2d6, 0x237a, 0x209a, 0x364f, 0x4183, 0x4252, 0xbac8, 0xbf48, 0x32a8, 0x1805, 0x42d8, 0x1fab, 0x18b3, 0x41fa, 0x04ab, 0xbf80, 0x19b6, 0x1a4d, 0x41c2, 0x1b8f, 0xb23a, 0x40a9, 0xbaff, 0x40ec, 0x4313, 0x40d2, 0xb09a, 0xb218, 0x42da, 0x1f49, 0x41ab, 0xb22b, 0xbf58, 0xba62, 0x4020, 0x1f31, 0xb293, 0x4136, 0x24c0, 0x088e, 0x4252, 0x2136, 0x3252, 0x2efa, 0xa1bf, 0x04ad, 0x1c79, 0xb01c, 0x43f7, 0x42e6, 0x426d, 0x4364, 0x4236, 0xb298, 0xbf24, 0x26e7, 0xb27d, 0xae82, 0x414b, 0xa71c, 0x44f0, 0x4395, 0x421c, 0xb29b, 0x409f, 0xbfd9, 0xb206, 0x43c8, 0x19f8, 0xb24d, 0x4265, 0x419f, 0x414d, 0x429b, 0x45c5, 0x435a, 0x11d9, 0xb259, 0x4188, 0xba06, 0x204d, 0x1b38, 0x4296, 0xa47f, 0xbf03, 0x45ad, 0x167f, 0x23eb, 0xb237, 0xb289, 0x1c1c, 0x43ef, 0x42ad, 0xa496, 0x438e, 0xb0a6, 0x3afb, 0xb229, 0x2661, 0x4159, 0x4384, 0x3b07, 0x45b8, 0x09ae, 0x3811, 0xbfa1, 0x3db5, 0xb217, 0x2dff, 0x43a2, 0xb28a, 0xbfa3, 0xba3f, 0xb2ec, 0xb2e0, 0xb067, 0x0a10, 0xb20a, 0xa2ad, 0x446b, 0xb27d, 0x05f3, 0x4248, 0xb02b, 0x43be, 0xba20, 0xbf90, 0x2133, 0x0c37, 0x254d, 0x4144, 0xb213, 0x403f, 0x1356, 0xa35e, 0x4219, 0x438d, 0xb211, 0x42ae, 0xbfbd, 0x1e52, 0x3cf3, 0x1d3c, 0xb287, 0x0781, 0x405e, 0x41a9, 0x436e, 0x1ebf, 0xbf01, 0x0041, 0x29a5, 0x422e, 0xba5a, 0xb0f3, 0x4355, 0x41b5, 0x421c, 0x4191, 0x4276, 0x43cb, 0xbae3, 0x42d1, 0xba32, 0xbfc0, 0xb232, 0xbf6a, 0x4013, 0x4256, 0xba73, 0x40a9, 0xba05, 0x1de9, 0xbf04, 0x4170, 0x42da, 0x40a6, 0x13a4, 0x4084, 0x42da, 0xbfa0, 0x4081, 0xbfd9, 0x220b, 0xb26f, 0x41ee, 0xba5b, 0xba52, 0x43e1, 0xb2b4, 0x1ffd, 0xbf6b, 0xb278, 0x4690, 0x4370, 0x3669, 0xb21e, 0xb017, 0x375d, 0x4131, 0x407e, 0x40e7, 0x4638, 0x0d44, 0x4254, 0x3476, 0x41ec, 0x42fd, 0x1ccd, 0xb295, 0xbfd0, 0x401c, 0x3235, 0x4645, 0x155b, 0x0311, 0x41db, 0x40c0, 0x396d, 0x0ba6, 0xbfaf, 0x0e6d, 0x43fd, 0xa6bc, 0x401a, 0xbafc, 0x421e, 0xbf18, 0x1886, 0x4106, 0xbf27, 0x12cb, 0x43c8, 0xba28, 0x4011, 0xba7f, 0x1103, 0xbac5, 0x193b, 0x466d, 0x42c5, 0x184a, 0x0d38, 0xbf62, 0x3f92, 0x43e9, 0xaa66, 0xb093, 0x334d, 0xba06, 0x1ebb, 0xb2ff, 0x465e, 0xb24e, 0xbade, 0xbfa3, 0x2abf, 0x3186, 0x430a, 0x448a, 0x434f, 0xb291, 0x4215, 0x1952, 0xb003, 0x41ec, 0x44ed, 0x438f, 0x42f3, 0x424c, 0x4025, 0xb0d7, 0x18f0, 0xb25d, 0x416e, 0x4120, 0x45a9, 0xb0f9, 0xb2fd, 0xbaed, 0xba7d, 0xbfd3, 0x41ec, 0xb22b, 0x428a, 0x42e5, 0xb02c, 0x1b7c, 0x37e0, 0x430a, 0x190a, 0x25db, 0x2eff, 0xb276, 0x0b11, 0xbfe2, 0xab47, 0x251c, 0xb223, 0x31c7, 0xbaf2, 0xb001, 0xb212, 0x30f1, 0xa44c, 0x41ae, 0x418d, 0x40a4, 0xb0b6, 0x4331, 0x425a, 0x4040, 0x1849, 0xb03a, 0x1959, 0xb092, 0x429d, 0x4188, 0xbf12, 0x4619, 0xba68, 0xbf60, 0xbf80, 0x42b8, 0x0a84, 0xb2fe, 0x456c, 0xb0f3, 0x4194, 0xb272, 0xb0d7, 0xb2de, 0x4353, 0x0e33, 0x1c0a, 0xbac8, 0x42c6, 0x19ff, 0x43af, 0x4089, 0xbfb8, 0x3b9b, 0x096d, 0x31ac, 0x0234, 0x40cf, 0x24b8, 0x4278, 0x417a, 0x4309, 0x427e, 0xb070, 0x42cf, 0x40a9, 0x433b, 0x418d, 0xb2be, 0x1969, 0x429e, 0x43af, 0xbf1f, 0x0b1a, 0x4286, 0x41ce, 0x426d, 0x4136, 0x1ec7, 0x3425, 0xa663, 0x4457, 0xb2a4, 0x43b1, 0x41e0, 0xb2cc, 0x26cc, 0xbad6, 0xbacc, 0xb2e0, 0x4018, 0x3a50, 0xb2bf, 0xba3b, 0xbadb, 0xb0c4, 0xbf09, 0x1167, 0x4099, 0x044b, 0xba75, 0x43d6, 0xba3a, 0x43f5, 0x2c1c, 0xba5a, 0x43bc, 0x42a9, 0x1c95, 0xad4c, 0x43e4, 0x46cc, 0x42cc, 0x2605, 0x4009, 0x1871, 0x4069, 0xba37, 0x411d, 0x1807, 0x426d, 0x423b, 0x0fab, 0x4159, 0xbf83, 0x4290, 0x1d71, 0x3601, 0xa5d0, 0xb23a, 0x1cfb, 0x42fc, 0x435f, 0x4003, 0xa2b5, 0x4163, 0x4185, 0x403c, 0xb0d0, 0x1ae1, 0xb271, 0xafbc, 0x40cb, 0x4174, 0xbf69, 0xb258, 0xb2ec, 0x42c0, 0x41dd, 0x197d, 0xbf14, 0xa735, 0x38c4, 0x4188, 0xbfb0, 0xbf0d, 0x4117, 0x41ae, 0xb0e8, 0x411b, 0x4155, 0x43bb, 0xba44, 0x4198, 0xb2cd, 0xbfc7, 0xbae2, 0xb2c4, 0x43d7, 0x1e4d, 0x34ca, 0xb223, 0x439c, 0xb294, 0xbae1, 0x1d72, 0xbfe0, 0xb2ef, 0x4363, 0xbfb9, 0x413e, 0x408b, 0xa5be, 0x2675, 0x42d3, 0xb204, 0x1ff1, 0x096f, 0x41dd, 0x3c1e, 0xb2bd, 0x40c6, 0x2575, 0xb2b1, 0x1910, 0x4607, 0x42b8, 0x43dd, 0x4329, 0x4112, 0x1ea0, 0x1b9b, 0xa27c, 0xbadf, 0xbf81, 0x4088, 0x41a7, 0xada0, 0x0db4, 0xb2fe, 0x408a, 0x18da, 0xb026, 0xb0b3, 0x43f1, 0x4467, 0xbfaf, 0x4367, 0xbad4, 0x405f, 0x4286, 0x1a0d, 0xb2b7, 0x4571, 0x183e, 0x43cf, 0x1a0d, 0x4036, 0x424f, 0x41a4, 0x410f, 0x46a2, 0xaf85, 0xa17c, 0x433b, 0xbf0e, 0x4022, 0x43f0, 0x11a4, 0x40c4, 0xba2c, 0x18a6, 0x1a93, 0x41d1, 0xa8a3, 0xbaf8, 0x4584, 0xbff0, 0xb23a, 0x4385, 0x43d8, 0xb29b, 0x4362, 0xb20f, 0xb0a7, 0xad67, 0xb252, 0xbf8a, 0x1cb1, 0xb215, 0x41a4, 0x40b3, 0x2a7b, 0x0d23, 0x4199, 0x18ce, 0x4618, 0x144a, 0x3082, 0x1c3e, 0xbf57, 0x32de, 0x412d, 0xb298, 0x4648, 0x1c4d, 0x1df9, 0x3e54, 0xbf8e, 0x4488, 0x4092, 0xb200, 0xba13, 0x41a1, 0xba23, 0x1d7d, 0xba09, 0x2b1c, 0x4691, 0x397f, 0x4032, 0xbf0e, 0xba67, 0x40e5, 0xb2f3, 0xbff0, 0xba04, 0x3ec6, 0x1a0f, 0x408b, 0xb2e2, 0xbfe2, 0x4224, 0x195a, 0x3204, 0x430d, 0x39cb, 0x1c36, 0xb23f, 0x1977, 0xb030, 0x46f4, 0xb2fe, 0xba77, 0x4141, 0xb276, 0x4217, 0xbf60, 0xb223, 0xb2ca, 0x43bd, 0x4204, 0x41d0, 0xa049, 0x4352, 0xb035, 0xbf05, 0x4396, 0x429b, 0xa066, 0x0975, 0x409b, 0x46bd, 0x2aa5, 0xb2b9, 0xba09, 0xb05e, 0x422d, 0x1d65, 0x42c5, 0x42d4, 0x0533, 0x221b, 0x42c2, 0xa9dd, 0x2ac2, 0xad89, 0x4263, 0x4378, 0x40ff, 0x429b, 0x4282, 0x421f, 0xb0c4, 0xbf56, 0xb0c4, 0xb070, 0xbac9, 0x43ff, 0x1bd4, 0x418f, 0x09b8, 0xb0a8, 0xbfc7, 0x455a, 0x04bf, 0xba69, 0x4283, 0x404a, 0x43a2, 0x449b, 0x1e46, 0x4130, 0x4305, 0xb272, 0x1203, 0x43f4, 0x437e, 0xb066, 0x4273, 0x0f4c, 0x4612, 0xaa6e, 0x08d1, 0x437c, 0x461d, 0x44ac, 0xa824, 0xb2cd, 0xb01f, 0xbf53, 0xbfa0, 0xb283, 0x4151, 0xb284, 0x41f4, 0x406e, 0xb038, 0x4330, 0x420d, 0x44b5, 0xb2b2, 0xa730, 0xb2e0, 0x2b11, 0x4698, 0x4142, 0xb2f9, 0x42ec, 0xb08e, 0x3c8b, 0x42bc, 0xb22e, 0x4226, 0x400b, 0xb219, 0xbf25, 0x43c3, 0xbf00, 0x4345, 0x40aa, 0xb0a0, 0x1a70, 0x429e, 0x4074, 0x41af, 0xb272, 0xb0af, 0xb0f4, 0x42ff, 0xba34, 0x4342, 0x399a, 0x46cd, 0x19e4, 0x3c64, 0xbfcf, 0x40e9, 0x40c2, 0x3ac5, 0x323c, 0x307e, 0xba37, 0xba17, 0xb2f7, 0x207f, 0x431e, 0xac1e, 0xb0c8, 0x41b1, 0x436b, 0x40d1, 0xb02b, 0xbfe8, 0x4335, 0x41ba, 0x1cad, 0xa482, 0xbacd, 0xb285, 0x401c, 0xa85b, 0x4199, 0x4392, 0xbfbb, 0xb045, 0x0935, 0x30e0, 0x4226, 0xb22e, 0x282a, 0xb2e5, 0x40c8, 0x4326, 0x2bf9, 0x4197, 0xbf16, 0x4371, 0xb2ea, 0x40c4, 0x3f3c, 0xb285, 0x4170, 0x40ce, 0x2706, 0x308f, 0xbfbe, 0x4113, 0x0553, 0xbad5, 0x4770, 0xe7fe + ], + StartRegs = [0x9b4ed9e3, 0xfb4d9b4f, 0xf2becf95, 0xee40ea2c, 0x9b566ffa, 0x1e8d47a2, 0xeeda6eed, 0x8e4fe94e, 0x87b89292, 0x5bc99f48, 0xcdbc076e, 0x49f2a792, 0x65012e66, 0x2d75e18d, 0x00000000, 0xa00001f0 + ], + FinalRegs = [0x40001b7a, 0x000019ff, 0x00000000, 0xffffffff, 0x00000000, 0x000000ec, 0x00000000, 0x00000006, 0xef680aac, 0x80000000, 0xffffffff, 0xc2cc9a01, 0xef680aac, 0x7fffff8c, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xba64, 0xba1a, 0x40a5, 0xba40, 0x1307, 0xb2a5, 0xb24d, 0x4102, 0xbfc0, 0xa0b9, 0xb20f, 0x181b, 0x439c, 0xa7dd, 0x1c89, 0xb011, 0x43c1, 0x1c4a, 0x418e, 0x1924, 0xa84d, 0xb235, 0x1f2a, 0x422d, 0xbf81, 0xb23e, 0x4057, 0x4036, 0xb2a5, 0xbf48, 0xb013, 0x42cf, 0x432a, 0xbfb6, 0x437b, 0x436d, 0x418a, 0x41cb, 0x2910, 0x1797, 0x424a, 0xa593, 0xb0aa, 0x429d, 0x40e6, 0x45c0, 0xb201, 0x4317, 0x4349, 0xb0a8, 0x4148, 0x19d4, 0x4255, 0x412a, 0xa20f, 0x1e2b, 0xbf1d, 0x403e, 0x42b4, 0x1a38, 0x4476, 0x436a, 0xab06, 0xb0e1, 0xbf82, 0x410d, 0xb2d0, 0x401a, 0x4356, 0xba0e, 0x40cc, 0x43e6, 0xba47, 0x408c, 0x43ae, 0xbf4a, 0x42cd, 0x1b95, 0x4046, 0x4299, 0x4380, 0x27bd, 0x431c, 0x4129, 0xbacc, 0x18be, 0x4380, 0xbf7c, 0x41ec, 0x19d7, 0xbf22, 0x40e2, 0x24c3, 0xb294, 0x4430, 0xb27b, 0x4648, 0x4360, 0xb24b, 0xb003, 0x4051, 0x42e7, 0x43d3, 0x41d4, 0x1bf1, 0xb035, 0xb2d4, 0xb2e9, 0x40e4, 0x435d, 0x3083, 0x464b, 0x41dd, 0x1b19, 0xb27e, 0x4224, 0x2dc0, 0x4181, 0x1624, 0xbf7d, 0xbae9, 0x4317, 0xabcc, 0x43d7, 0x438e, 0x4254, 0xb287, 0x40d0, 0xbf4e, 0xbaf3, 0x43f9, 0x4350, 0xa956, 0x1fc1, 0x4374, 0x44e5, 0xa792, 0xb2f3, 0x412b, 0xb201, 0xb241, 0xb2d3, 0xbfc0, 0xba76, 0x4246, 0xb019, 0x40e3, 0x198a, 0x2b9a, 0x3b90, 0x46d9, 0x072a, 0xba25, 0x3d43, 0x4097, 0x41e1, 0xbfc6, 0x4205, 0x04d8, 0x40f9, 0x1cd1, 0x1f55, 0x1f1e, 0xaa31, 0xb23e, 0x4598, 0x13f6, 0x4179, 0xaf2e, 0xbfae, 0x4357, 0x1374, 0x1ad4, 0xad33, 0x4156, 0x427e, 0xbfe4, 0x44e0, 0x4331, 0x43f4, 0x42c9, 0xbf85, 0x1a24, 0xa2f6, 0x41f2, 0xa107, 0x4232, 0xbf90, 0xa2a0, 0xb23e, 0x1f9e, 0x4187, 0x1bb0, 0xb26d, 0x426f, 0xb223, 0x4088, 0xacf5, 0x405e, 0x309e, 0x41ef, 0x22b8, 0xbfaa, 0x41bd, 0xbac2, 0x1c97, 0x4673, 0xb257, 0x41bf, 0x4055, 0xb287, 0x1bef, 0x44d5, 0x1b5a, 0xb06d, 0x42f0, 0x3c79, 0x420f, 0x1cc2, 0xbf2f, 0x44ca, 0x40ec, 0x41e5, 0xba3c, 0x4118, 0xba6d, 0xa231, 0xb266, 0xae71, 0xba56, 0xa854, 0x21c1, 0x39da, 0x18f7, 0x162a, 0x0af5, 0x4246, 0x43c3, 0x1839, 0xb0f9, 0x40d0, 0x1f0f, 0x46ac, 0x186e, 0x44a1, 0x40aa, 0xbfd1, 0x404c, 0x2780, 0x43f3, 0x4391, 0xbfc0, 0x439d, 0x0446, 0xba07, 0x411e, 0x4358, 0x40a1, 0x42eb, 0x408f, 0xa392, 0x25c7, 0x4289, 0xb203, 0x4220, 0xbfe0, 0xba43, 0xa384, 0x10d1, 0xbf4c, 0xba61, 0xbf90, 0x2fe4, 0x4339, 0x419e, 0xa2e4, 0xbf90, 0xa1b8, 0xb2ca, 0x431e, 0xa96f, 0xbaeb, 0x0eab, 0xba3f, 0x42da, 0x4092, 0xba50, 0x419f, 0x42ae, 0x428f, 0xbf7e, 0x43b6, 0x3644, 0xb0e6, 0xa3fd, 0x46c8, 0x4049, 0xb22e, 0x434c, 0x1dec, 0xb233, 0xb2de, 0x42f1, 0xb2d6, 0xb2ed, 0x3db5, 0x4326, 0x4279, 0x22e0, 0x2801, 0x42ac, 0x4331, 0x4192, 0x2136, 0xbf80, 0x4358, 0xbf48, 0xb09e, 0x0395, 0xb232, 0x41d8, 0xbfb0, 0x18fd, 0xba3e, 0x1da0, 0x45d5, 0x43a3, 0x41c0, 0x4028, 0x446a, 0x00dc, 0xbfa8, 0x2ac3, 0x292e, 0x439b, 0x421c, 0x1924, 0xb25b, 0x464b, 0x427e, 0x40a9, 0xbae4, 0x42ed, 0xb0be, 0x4650, 0x4205, 0x4062, 0x400c, 0xb283, 0x40a1, 0xb26e, 0x4438, 0x4210, 0xaf94, 0xb270, 0x18ad, 0xbf3c, 0x3d88, 0x41c3, 0x42eb, 0xbf51, 0x40f4, 0xba01, 0x4119, 0x42b6, 0x13e7, 0x2c7e, 0xb248, 0x3088, 0x2d04, 0xb22c, 0x45ce, 0x006d, 0x446f, 0x1a24, 0x4059, 0x40f6, 0x4360, 0xa82e, 0xb240, 0x42e0, 0xba21, 0x2130, 0x42b4, 0xb033, 0xbf04, 0x4020, 0x4093, 0x409d, 0x0fb2, 0x455f, 0x40d7, 0x168b, 0xba34, 0x2d4c, 0x426e, 0xba7b, 0x1b47, 0xb0a4, 0x4252, 0x38dd, 0x3e12, 0xb034, 0x429f, 0x4195, 0xbfd9, 0xb2f8, 0x427a, 0x3ecb, 0xaba8, 0xb27d, 0x44a4, 0xb2d5, 0x42cc, 0x43f0, 0x4369, 0x4281, 0x2b77, 0xbaf3, 0x1827, 0x3984, 0xb008, 0xba71, 0xbaeb, 0xbf68, 0xba04, 0xbf48, 0x40da, 0xb025, 0x324b, 0x41b9, 0xb0a9, 0xb02e, 0x45dc, 0x2fa9, 0x435c, 0x1b90, 0xbf7a, 0x41da, 0x1990, 0xba5a, 0xb206, 0x40c1, 0x4188, 0x4063, 0x4182, 0xb2d3, 0xba04, 0xbad2, 0x1f08, 0x031c, 0x179d, 0x1dcc, 0x1ed3, 0xa42e, 0x416d, 0x2dae, 0x05e5, 0x3b23, 0x09b7, 0x40c8, 0x1aa2, 0xb247, 0x1462, 0x40d1, 0x4049, 0xbf77, 0xb277, 0x1eee, 0xb298, 0xbf00, 0x42bb, 0x1f09, 0x423a, 0xba7f, 0x4217, 0xbaf5, 0xba2f, 0x3e9d, 0xbf3e, 0x40c8, 0x2bf6, 0xba24, 0xba43, 0x31ec, 0x2cae, 0x4211, 0xbf21, 0x1433, 0x467f, 0x1eab, 0xb2f5, 0x437e, 0x4143, 0xba44, 0xafe7, 0x4173, 0x418d, 0xad21, 0x0b5f, 0xa2f0, 0xba57, 0xbfaf, 0xb2ef, 0x3b63, 0x4155, 0xba08, 0xb20c, 0x4565, 0x407e, 0x4006, 0x27ce, 0xba15, 0xb2f7, 0x403e, 0xbafe, 0x4385, 0xb263, 0x4092, 0x43ba, 0xb2a9, 0x43bd, 0x424f, 0x4101, 0x45e3, 0x3773, 0xbfba, 0x1dbc, 0xb2ea, 0xb242, 0x40c7, 0xb057, 0xb2ee, 0x41d9, 0xb20d, 0x4052, 0x4391, 0xa641, 0xa730, 0xb20d, 0x3c10, 0x4477, 0x3eab, 0xa994, 0x2ce4, 0xbaf4, 0xbf62, 0xb252, 0xb2d1, 0x14c9, 0xbfc2, 0x4064, 0x4185, 0x1baf, 0x4298, 0xb2ab, 0xa44e, 0x40ea, 0xa273, 0x439d, 0x44d5, 0xba28, 0x41b2, 0x0318, 0x1e74, 0x4310, 0xbf0d, 0x1b3e, 0xba2c, 0x3286, 0x412d, 0x199a, 0xa2d6, 0x41de, 0xbfb0, 0x43e6, 0xa815, 0x162b, 0x16a3, 0x429e, 0xb210, 0x130d, 0xba4b, 0xba20, 0xbfbd, 0x2828, 0x00c1, 0x425e, 0x0047, 0x4324, 0x41af, 0x2141, 0x42c6, 0x42a2, 0xad20, 0x163f, 0x4385, 0x288d, 0xb0ad, 0x40a2, 0xba7a, 0xba4b, 0xb0ba, 0x4044, 0x0501, 0x33f5, 0x1845, 0xa3c5, 0xa7d3, 0x4274, 0xb270, 0xbafc, 0x4485, 0xbf35, 0x421e, 0x41a2, 0x4250, 0x421b, 0x04da, 0xb222, 0x1cd3, 0x0958, 0x4085, 0xa75d, 0x1d39, 0x059a, 0x43cb, 0xba2c, 0x40e8, 0x41e4, 0x4664, 0x40d9, 0xbf18, 0x43f1, 0x4350, 0x4267, 0x4027, 0xbf21, 0x1afb, 0x1264, 0xb258, 0x4575, 0x4124, 0xb215, 0x466d, 0x1870, 0x4319, 0xaa64, 0xbfc1, 0x4376, 0xb2fb, 0x437b, 0x438f, 0xb011, 0x2417, 0xb206, 0xbf00, 0xbaf8, 0xbfc5, 0xba1e, 0xa11d, 0xb27d, 0xadf2, 0x1b0f, 0x40c8, 0xbf05, 0x46d4, 0x43b0, 0x43e4, 0x4008, 0x426d, 0x1f5a, 0x423b, 0x1b37, 0x1df6, 0x2bde, 0xbadc, 0x1ff8, 0xbf3b, 0x43a8, 0x41de, 0x4239, 0x1def, 0x4184, 0x43ee, 0x431b, 0x41f0, 0x43f5, 0x4290, 0x422c, 0x3066, 0x19fd, 0xaeba, 0x409f, 0x1f41, 0x2c3e, 0x1f68, 0x40c7, 0x4146, 0x2ff8, 0xb2f6, 0xb026, 0xba41, 0xb220, 0x443f, 0x205a, 0xb2e6, 0x44cb, 0xbf3b, 0xbf90, 0xb2de, 0x0b90, 0x0e8f, 0xba26, 0x06c0, 0xbaed, 0x0acd, 0x408e, 0x31fb, 0x048f, 0x4577, 0x40db, 0xbfd5, 0x4181, 0xaa2b, 0x16a1, 0x401d, 0xbf19, 0x2bed, 0x4053, 0x3875, 0xb265, 0xad06, 0x4044, 0x11f9, 0xb289, 0x4602, 0xb0da, 0x461b, 0x40a1, 0xba3d, 0x13fd, 0x41a4, 0x41b3, 0x41eb, 0xb000, 0x4385, 0x46ec, 0x2780, 0x45be, 0x33bd, 0xbf34, 0x1963, 0x4266, 0x422e, 0x1c54, 0x1b2a, 0xa37d, 0xba7c, 0xba54, 0x4221, 0xba78, 0x1ef2, 0x425a, 0x40c8, 0x24fa, 0xbfcb, 0xb237, 0x420a, 0xb0bb, 0x1eeb, 0x40c3, 0x0071, 0x0ce2, 0xbf2e, 0x4297, 0x4227, 0x432c, 0xb01b, 0xae0a, 0xa328, 0x09dc, 0xb2cb, 0x4014, 0x1897, 0xbf54, 0xb07e, 0x234a, 0x284d, 0x44b1, 0x46fb, 0xb26b, 0x0044, 0xaf0c, 0xa318, 0x43b4, 0xa43d, 0xb2b1, 0x4082, 0x42ab, 0x108f, 0x41d8, 0xba0c, 0x4318, 0xbf12, 0x31db, 0x4296, 0x4376, 0x466e, 0x1702, 0xb08c, 0x1446, 0xb2c3, 0xb262, 0xb06b, 0x33ac, 0xb285, 0x1c39, 0x0554, 0xb254, 0x4010, 0x0807, 0x406d, 0x3fd4, 0xb2f0, 0x41d8, 0xb03d, 0xbf31, 0x0072, 0x4300, 0xabf2, 0x3778, 0x41ce, 0x425d, 0xa931, 0xb088, 0x104d, 0x1902, 0xb237, 0x1adb, 0x40fb, 0x4310, 0x03b3, 0x409c, 0xb0af, 0xb2e6, 0x06ba, 0x439d, 0x41c4, 0xbfc5, 0x4290, 0xb086, 0xb274, 0x1ff7, 0xbfca, 0x179a, 0x24c7, 0x407e, 0xba61, 0xbf1f, 0xb281, 0x41b6, 0x2aec, 0x41f5, 0x40fe, 0x27f0, 0x03f3, 0x1a45, 0x2020, 0x0c37, 0x18c6, 0x4420, 0xb225, 0x42fd, 0xbf87, 0x429e, 0x3085, 0x4240, 0x18df, 0x3b5f, 0x3e59, 0x42ba, 0x4369, 0x093c, 0x43df, 0xb2a3, 0x1f17, 0x427c, 0x1c1f, 0x17ae, 0x188a, 0x418f, 0xa2c1, 0x1b58, 0x4160, 0xbff0, 0x404f, 0x1985, 0xbf90, 0x1915, 0x434c, 0xbf11, 0x4177, 0x408b, 0x0d62, 0x186b, 0x1168, 0x18e3, 0xb235, 0x3037, 0x4695, 0xba1b, 0xa33d, 0xba31, 0xb2c3, 0x40f3, 0xb0c4, 0x08b1, 0x4207, 0x4398, 0x41d5, 0x2398, 0x440a, 0x2c54, 0xba66, 0x1c94, 0xbaf5, 0xbf9c, 0x437b, 0xb2f5, 0x4674, 0x40c3, 0x435f, 0x41d5, 0x4233, 0xac76, 0xbae1, 0xba0c, 0xba07, 0x46ba, 0xb220, 0x22a5, 0xb25d, 0xb204, 0x41f3, 0x04e6, 0x46b9, 0x43a2, 0x41bd, 0x40b6, 0x1d71, 0xbfb1, 0x41cf, 0x32a2, 0x1e0c, 0x43e4, 0xb05c, 0xbf8c, 0xb273, 0x4072, 0x462b, 0x2863, 0x415a, 0x4000, 0xb22a, 0x42f5, 0x41c1, 0xa19b, 0x436f, 0xa5ad, 0x0a9d, 0x40e3, 0x4066, 0xa244, 0x41c8, 0x40a8, 0x43e4, 0x4301, 0xbf64, 0x36fb, 0x3220, 0x45e5, 0xa505, 0xb222, 0xb2a2, 0xb09c, 0x4418, 0xb02c, 0x1dcc, 0x40ad, 0x0709, 0xa73b, 0x4374, 0x33ea, 0xbad1, 0xbfa2, 0x4021, 0x4082, 0x4449, 0x41b6, 0x1df3, 0x42a8, 0x0838, 0x41e1, 0x4104, 0x218c, 0x4384, 0x2d58, 0x006d, 0x4561, 0x4374, 0xb299, 0x4177, 0x4064, 0xa457, 0x3187, 0x1b34, 0xbf63, 0x4261, 0x4158, 0x2bf6, 0x435e, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xddc07271, 0x377926ce, 0x9a93827d, 0xcbef0283, 0x5bc182ba, 0xa9bfdede, 0x4f15e679, 0xd23d8725, 0x59c353e8, 0x9a2b180a, 0x2b318b54, 0xd61dea1b, 0x8cc70559, 0xca220005, 0x00000000, 0x300001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x0000008d, 0x00000000, 0x00000006, 0xffffe6b3, 0x00000000, 0xfffffffa, 0x000018ab, 0xc35cf61b, 0x00010000, 0x00010000, 0x00001630, 0xad4c19c4, 0x00001aa0, 0x00000000, 0xa00001d0 }, + Instructions = [0xba64, 0xba1a, 0x40a5, 0xba40, 0x1307, 0xb2a5, 0xb24d, 0x4102, 0xbfc0, 0xa0b9, 0xb20f, 0x181b, 0x439c, 0xa7dd, 0x1c89, 0xb011, 0x43c1, 0x1c4a, 0x418e, 0x1924, 0xa84d, 0xb235, 0x1f2a, 0x422d, 0xbf81, 0xb23e, 0x4057, 0x4036, 0xb2a5, 0xbf48, 0xb013, 0x42cf, 0x432a, 0xbfb6, 0x437b, 0x436d, 0x418a, 0x41cb, 0x2910, 0x1797, 0x424a, 0xa593, 0xb0aa, 0x429d, 0x40e6, 0x45c0, 0xb201, 0x4317, 0x4349, 0xb0a8, 0x4148, 0x19d4, 0x4255, 0x412a, 0xa20f, 0x1e2b, 0xbf1d, 0x403e, 0x42b4, 0x1a38, 0x4476, 0x436a, 0xab06, 0xb0e1, 0xbf82, 0x410d, 0xb2d0, 0x401a, 0x4356, 0xba0e, 0x40cc, 0x43e6, 0xba47, 0x408c, 0x43ae, 0xbf4a, 0x42cd, 0x1b95, 0x4046, 0x4299, 0x4380, 0x27bd, 0x431c, 0x4129, 0xbacc, 0x18be, 0x4380, 0xbf7c, 0x41ec, 0x19d7, 0xbf22, 0x40e2, 0x24c3, 0xb294, 0x4430, 0xb27b, 0x4648, 0x4360, 0xb24b, 0xb003, 0x4051, 0x42e7, 0x43d3, 0x41d4, 0x1bf1, 0xb035, 0xb2d4, 0xb2e9, 0x40e4, 0x435d, 0x3083, 0x464b, 0x41dd, 0x1b19, 0xb27e, 0x4224, 0x2dc0, 0x4181, 0x1624, 0xbf7d, 0xbae9, 0x4317, 0xabcc, 0x43d7, 0x438e, 0x4254, 0xb287, 0x40d0, 0xbf4e, 0xbaf3, 0x43f9, 0x4350, 0xa956, 0x1fc1, 0x4374, 0x44e5, 0xa792, 0xb2f3, 0x412b, 0xb201, 0xb241, 0xb2d3, 0xbfc0, 0xba76, 0x4246, 0xb019, 0x40e3, 0x198a, 0x2b9a, 0x3b90, 0x46d9, 0x072a, 0xba25, 0x3d43, 0x4097, 0x41e1, 0xbfc6, 0x4205, 0x04d8, 0x40f9, 0x1cd1, 0x1f55, 0x1f1e, 0xaa31, 0xb23e, 0x4598, 0x13f6, 0x4179, 0xaf2e, 0xbfae, 0x4357, 0x1374, 0x1ad4, 0xad33, 0x4156, 0x427e, 0xbfe4, 0x44e0, 0x4331, 0x43f4, 0x42c9, 0xbf85, 0x1a24, 0xa2f6, 0x41f2, 0xa107, 0x4232, 0xbf90, 0xa2a0, 0xb23e, 0x1f9e, 0x4187, 0x1bb0, 0xb26d, 0x426f, 0xb223, 0x4088, 0xacf5, 0x405e, 0x309e, 0x41ef, 0x22b8, 0xbfaa, 0x41bd, 0xbac2, 0x1c97, 0x4673, 0xb257, 0x41bf, 0x4055, 0xb287, 0x1bef, 0x44d5, 0x1b5a, 0xb06d, 0x42f0, 0x3c79, 0x420f, 0x1cc2, 0xbf2f, 0x44ca, 0x40ec, 0x41e5, 0xba3c, 0x4118, 0xba6d, 0xa231, 0xb266, 0xae71, 0xba56, 0xa854, 0x21c1, 0x39da, 0x18f7, 0x162a, 0x0af5, 0x4246, 0x43c3, 0x1839, 0xb0f9, 0x40d0, 0x1f0f, 0x46ac, 0x186e, 0x44a1, 0x40aa, 0xbfd1, 0x404c, 0x2780, 0x43f3, 0x4391, 0xbfc0, 0x439d, 0x0446, 0xba07, 0x411e, 0x4358, 0x40a1, 0x42eb, 0x408f, 0xa392, 0x25c7, 0x4289, 0xb203, 0x4220, 0xbfe0, 0xba43, 0xa384, 0x10d1, 0xbf4c, 0xba61, 0xbf90, 0x2fe4, 0x4339, 0x419e, 0xa2e4, 0xbf90, 0xa1b8, 0xb2ca, 0x431e, 0xa96f, 0xbaeb, 0x0eab, 0xba3f, 0x42da, 0x4092, 0xba50, 0x419f, 0x42ae, 0x428f, 0xbf7e, 0x43b6, 0x3644, 0xb0e6, 0xa3fd, 0x46c8, 0x4049, 0xb22e, 0x434c, 0x1dec, 0xb233, 0xb2de, 0x42f1, 0xb2d6, 0xb2ed, 0x3db5, 0x4326, 0x4279, 0x22e0, 0x2801, 0x42ac, 0x4331, 0x4192, 0x2136, 0xbf80, 0x4358, 0xbf48, 0xb09e, 0x0395, 0xb232, 0x41d8, 0xbfb0, 0x18fd, 0xba3e, 0x1da0, 0x45d5, 0x43a3, 0x41c0, 0x4028, 0x446a, 0x00dc, 0xbfa8, 0x2ac3, 0x292e, 0x439b, 0x421c, 0x1924, 0xb25b, 0x464b, 0x427e, 0x40a9, 0xbae4, 0x42ed, 0xb0be, 0x4650, 0x4205, 0x4062, 0x400c, 0xb283, 0x40a1, 0xb26e, 0x4438, 0x4210, 0xaf94, 0xb270, 0x18ad, 0xbf3c, 0x3d88, 0x41c3, 0x42eb, 0xbf51, 0x40f4, 0xba01, 0x4119, 0x42b6, 0x13e7, 0x2c7e, 0xb248, 0x3088, 0x2d04, 0xb22c, 0x45ce, 0x006d, 0x446f, 0x1a24, 0x4059, 0x40f6, 0x4360, 0xa82e, 0xb240, 0x42e0, 0xba21, 0x2130, 0x42b4, 0xb033, 0xbf04, 0x4020, 0x4093, 0x409d, 0x0fb2, 0x455f, 0x40d7, 0x168b, 0xba34, 0x2d4c, 0x426e, 0xba7b, 0x1b47, 0xb0a4, 0x4252, 0x38dd, 0x3e12, 0xb034, 0x429f, 0x4195, 0xbfd9, 0xb2f8, 0x427a, 0x3ecb, 0xaba8, 0xb27d, 0x44a4, 0xb2d5, 0x42cc, 0x43f0, 0x4369, 0x4281, 0x2b77, 0xbaf3, 0x1827, 0x3984, 0xb008, 0xba71, 0xbaeb, 0xbf68, 0xba04, 0xbf48, 0x40da, 0xb025, 0x324b, 0x41b9, 0xb0a9, 0xb02e, 0x45dc, 0x2fa9, 0x435c, 0x1b90, 0xbf7a, 0x41da, 0x1990, 0xba5a, 0xb206, 0x40c1, 0x4188, 0x4063, 0x4182, 0xb2d3, 0xba04, 0xbad2, 0x1f08, 0x031c, 0x179d, 0x1dcc, 0x1ed3, 0xa42e, 0x416d, 0x2dae, 0x05e5, 0x3b23, 0x09b7, 0x40c8, 0x1aa2, 0xb247, 0x1462, 0x40d1, 0x4049, 0xbf77, 0xb277, 0x1eee, 0xb298, 0xbf00, 0x42bb, 0x1f09, 0x423a, 0xba7f, 0x4217, 0xbaf5, 0xba2f, 0x3e9d, 0xbf3e, 0x40c8, 0x2bf6, 0xba24, 0xba43, 0x31ec, 0x2cae, 0x4211, 0xbf21, 0x1433, 0x467f, 0x1eab, 0xb2f5, 0x437e, 0x4143, 0xba44, 0xafe7, 0x4173, 0x418d, 0xad21, 0x0b5f, 0xa2f0, 0xba57, 0xbfaf, 0xb2ef, 0x3b63, 0x4155, 0xba08, 0xb20c, 0x4565, 0x407e, 0x4006, 0x27ce, 0xba15, 0xb2f7, 0x403e, 0xbafe, 0x4385, 0xb263, 0x4092, 0x43ba, 0xb2a9, 0x43bd, 0x424f, 0x4101, 0x45e3, 0x3773, 0xbfba, 0x1dbc, 0xb2ea, 0xb242, 0x40c7, 0xb057, 0xb2ee, 0x41d9, 0xb20d, 0x4052, 0x4391, 0xa641, 0xa730, 0xb20d, 0x3c10, 0x4477, 0x3eab, 0xa994, 0x2ce4, 0xbaf4, 0xbf62, 0xb252, 0xb2d1, 0x14c9, 0xbfc2, 0x4064, 0x4185, 0x1baf, 0x4298, 0xb2ab, 0xa44e, 0x40ea, 0xa273, 0x439d, 0x44d5, 0xba28, 0x41b2, 0x0318, 0x1e74, 0x4310, 0xbf0d, 0x1b3e, 0xba2c, 0x3286, 0x412d, 0x199a, 0xa2d6, 0x41de, 0xbfb0, 0x43e6, 0xa815, 0x162b, 0x16a3, 0x429e, 0xb210, 0x130d, 0xba4b, 0xba20, 0xbfbd, 0x2828, 0x00c1, 0x425e, 0x0047, 0x4324, 0x41af, 0x2141, 0x42c6, 0x42a2, 0xad20, 0x163f, 0x4385, 0x288d, 0xb0ad, 0x40a2, 0xba7a, 0xba4b, 0xb0ba, 0x4044, 0x0501, 0x33f5, 0x1845, 0xa3c5, 0xa7d3, 0x4274, 0xb270, 0xbafc, 0x4485, 0xbf35, 0x421e, 0x41a2, 0x4250, 0x421b, 0x04da, 0xb222, 0x1cd3, 0x0958, 0x4085, 0xa75d, 0x1d39, 0x059a, 0x43cb, 0xba2c, 0x40e8, 0x41e4, 0x4664, 0x40d9, 0xbf18, 0x43f1, 0x4350, 0x4267, 0x4027, 0xbf21, 0x1afb, 0x1264, 0xb258, 0x4575, 0x4124, 0xb215, 0x466d, 0x1870, 0x4319, 0xaa64, 0xbfc1, 0x4376, 0xb2fb, 0x437b, 0x438f, 0xb011, 0x2417, 0xb206, 0xbf00, 0xbaf8, 0xbfc5, 0xba1e, 0xa11d, 0xb27d, 0xadf2, 0x1b0f, 0x40c8, 0xbf05, 0x46d4, 0x43b0, 0x43e4, 0x4008, 0x426d, 0x1f5a, 0x423b, 0x1b37, 0x1df6, 0x2bde, 0xbadc, 0x1ff8, 0xbf3b, 0x43a8, 0x41de, 0x4239, 0x1def, 0x4184, 0x43ee, 0x431b, 0x41f0, 0x43f5, 0x4290, 0x422c, 0x3066, 0x19fd, 0xaeba, 0x409f, 0x1f41, 0x2c3e, 0x1f68, 0x40c7, 0x4146, 0x2ff8, 0xb2f6, 0xb026, 0xba41, 0xb220, 0x443f, 0x205a, 0xb2e6, 0x44cb, 0xbf3b, 0xbf90, 0xb2de, 0x0b90, 0x0e8f, 0xba26, 0x06c0, 0xbaed, 0x0acd, 0x408e, 0x31fb, 0x048f, 0x4577, 0x40db, 0xbfd5, 0x4181, 0xaa2b, 0x16a1, 0x401d, 0xbf19, 0x2bed, 0x4053, 0x3875, 0xb265, 0xad06, 0x4044, 0x11f9, 0xb289, 0x4602, 0xb0da, 0x461b, 0x40a1, 0xba3d, 0x13fd, 0x41a4, 0x41b3, 0x41eb, 0xb000, 0x4385, 0x46ec, 0x2780, 0x45be, 0x33bd, 0xbf34, 0x1963, 0x4266, 0x422e, 0x1c54, 0x1b2a, 0xa37d, 0xba7c, 0xba54, 0x4221, 0xba78, 0x1ef2, 0x425a, 0x40c8, 0x24fa, 0xbfcb, 0xb237, 0x420a, 0xb0bb, 0x1eeb, 0x40c3, 0x0071, 0x0ce2, 0xbf2e, 0x4297, 0x4227, 0x432c, 0xb01b, 0xae0a, 0xa328, 0x09dc, 0xb2cb, 0x4014, 0x1897, 0xbf54, 0xb07e, 0x234a, 0x284d, 0x44b1, 0x46fb, 0xb26b, 0x0044, 0xaf0c, 0xa318, 0x43b4, 0xa43d, 0xb2b1, 0x4082, 0x42ab, 0x108f, 0x41d8, 0xba0c, 0x4318, 0xbf12, 0x31db, 0x4296, 0x4376, 0x466e, 0x1702, 0xb08c, 0x1446, 0xb2c3, 0xb262, 0xb06b, 0x33ac, 0xb285, 0x1c39, 0x0554, 0xb254, 0x4010, 0x0807, 0x406d, 0x3fd4, 0xb2f0, 0x41d8, 0xb03d, 0xbf31, 0x0072, 0x4300, 0xabf2, 0x3778, 0x41ce, 0x425d, 0xa931, 0xb088, 0x104d, 0x1902, 0xb237, 0x1adb, 0x40fb, 0x4310, 0x03b3, 0x409c, 0xb0af, 0xb2e6, 0x06ba, 0x439d, 0x41c4, 0xbfc5, 0x4290, 0xb086, 0xb274, 0x1ff7, 0xbfca, 0x179a, 0x24c7, 0x407e, 0xba61, 0xbf1f, 0xb281, 0x41b6, 0x2aec, 0x41f5, 0x40fe, 0x27f0, 0x03f3, 0x1a45, 0x2020, 0x0c37, 0x18c6, 0x4420, 0xb225, 0x42fd, 0xbf87, 0x429e, 0x3085, 0x4240, 0x18df, 0x3b5f, 0x3e59, 0x42ba, 0x4369, 0x093c, 0x43df, 0xb2a3, 0x1f17, 0x427c, 0x1c1f, 0x17ae, 0x188a, 0x418f, 0xa2c1, 0x1b58, 0x4160, 0xbff0, 0x404f, 0x1985, 0xbf90, 0x1915, 0x434c, 0xbf11, 0x4177, 0x408b, 0x0d62, 0x186b, 0x1168, 0x18e3, 0xb235, 0x3037, 0x4695, 0xba1b, 0xa33d, 0xba31, 0xb2c3, 0x40f3, 0xb0c4, 0x08b1, 0x4207, 0x4398, 0x41d5, 0x2398, 0x440a, 0x2c54, 0xba66, 0x1c94, 0xbaf5, 0xbf9c, 0x437b, 0xb2f5, 0x4674, 0x40c3, 0x435f, 0x41d5, 0x4233, 0xac76, 0xbae1, 0xba0c, 0xba07, 0x46ba, 0xb220, 0x22a5, 0xb25d, 0xb204, 0x41f3, 0x04e6, 0x46b9, 0x43a2, 0x41bd, 0x40b6, 0x1d71, 0xbfb1, 0x41cf, 0x32a2, 0x1e0c, 0x43e4, 0xb05c, 0xbf8c, 0xb273, 0x4072, 0x462b, 0x2863, 0x415a, 0x4000, 0xb22a, 0x42f5, 0x41c1, 0xa19b, 0x436f, 0xa5ad, 0x0a9d, 0x40e3, 0x4066, 0xa244, 0x41c8, 0x40a8, 0x43e4, 0x4301, 0xbf64, 0x36fb, 0x3220, 0x45e5, 0xa505, 0xb222, 0xb2a2, 0xb09c, 0x4418, 0xb02c, 0x1dcc, 0x40ad, 0x0709, 0xa73b, 0x4374, 0x33ea, 0xbad1, 0xbfa2, 0x4021, 0x4082, 0x4449, 0x41b6, 0x1df3, 0x42a8, 0x0838, 0x41e1, 0x4104, 0x218c, 0x4384, 0x2d58, 0x006d, 0x4561, 0x4374, 0xb299, 0x4177, 0x4064, 0xa457, 0x3187, 0x1b34, 0xbf63, 0x4261, 0x4158, 0x2bf6, 0x435e, 0x4770, 0xe7fe + ], + StartRegs = [0xddc07271, 0x377926ce, 0x9a93827d, 0xcbef0283, 0x5bc182ba, 0xa9bfdede, 0x4f15e679, 0xd23d8725, 0x59c353e8, 0x9a2b180a, 0x2b318b54, 0xd61dea1b, 0x8cc70559, 0xca220005, 0x00000000, 0x300001f0 + ], + FinalRegs = [0x00000000, 0x0000008d, 0x00000000, 0x00000006, 0xffffe6b3, 0x00000000, 0xfffffffa, 0x000018ab, 0xc35cf61b, 0x00010000, 0x00010000, 0x00001630, 0xad4c19c4, 0x00001aa0, 0x00000000, 0xa00001d0 + ], }, new() { - Instructions = new ushort[] { 0x418a, 0x18b4, 0xb262, 0x1dbf, 0xb028, 0x2f39, 0xba6e, 0x1e05, 0x41b8, 0x1a37, 0xbfc2, 0x3a0d, 0xaacb, 0x435a, 0x411a, 0x43c3, 0xbfc1, 0x4241, 0x1c8d, 0x46db, 0x2c85, 0x420a, 0xb29c, 0x35a9, 0xad4a, 0xb007, 0x433d, 0x42a9, 0x2e9d, 0x42dc, 0xba41, 0xba2b, 0xb236, 0x40ad, 0x2a1f, 0xa550, 0xb2ae, 0x0dd7, 0xbaea, 0x456a, 0x4299, 0x40d9, 0xa992, 0xbf0a, 0xbaff, 0xbad1, 0x4667, 0xaf90, 0x4281, 0x4310, 0xba51, 0xbf7c, 0x30f1, 0x43ff, 0x41c9, 0xb2f2, 0x412e, 0x43f1, 0xba1d, 0x45da, 0x275c, 0xb2d2, 0x337c, 0x4200, 0xbfb5, 0xb292, 0xba70, 0x4174, 0x40b0, 0x41e1, 0x42ed, 0x41e6, 0x439f, 0x224e, 0xba2c, 0x12e8, 0x411c, 0x1dea, 0x40f4, 0x4199, 0x43ac, 0x40fb, 0xb23b, 0x0f39, 0x4093, 0x45cb, 0x431a, 0x13c1, 0xbf73, 0xb271, 0x398f, 0xb018, 0x402a, 0xb002, 0xaac0, 0x1bc9, 0x2243, 0x0ec2, 0x3f51, 0xbf1b, 0x408c, 0xb0d0, 0x1c15, 0x03fc, 0x39ff, 0xb2a6, 0x02ca, 0x46ba, 0x3b17, 0x19ea, 0x40ef, 0x064f, 0x43f8, 0xbfda, 0x4268, 0x4074, 0x35bd, 0x44fa, 0x1ceb, 0xbf2d, 0x4325, 0x4157, 0x415c, 0x431a, 0xbaf1, 0xa1b0, 0x1b83, 0x01c9, 0x4306, 0x42e5, 0x172c, 0x0b7d, 0x405a, 0x4140, 0x4393, 0x4056, 0x1e6e, 0x414e, 0x40f4, 0x43a2, 0xb292, 0xbf3f, 0x4445, 0x190a, 0x431b, 0x1b32, 0xbf59, 0x4625, 0xad4e, 0x45bb, 0x446d, 0x44cc, 0x195c, 0x4619, 0xafd9, 0x0a89, 0x23e7, 0xa8ec, 0x425c, 0x41d0, 0x362d, 0x4257, 0xb036, 0xbf39, 0x44ec, 0xb00c, 0xb214, 0x1f74, 0xba33, 0x4574, 0x44f9, 0x41aa, 0x3e33, 0xbf7e, 0xb089, 0x4260, 0x44fd, 0xbfa8, 0x4262, 0x4348, 0xa90d, 0xaee0, 0xbf97, 0xba70, 0xba28, 0x4370, 0xb2c6, 0x41d4, 0xb21b, 0xb281, 0x43fc, 0xbfd3, 0x1a9f, 0xbac9, 0xbf60, 0x3f4b, 0x25a2, 0x4149, 0xbaeb, 0x4009, 0x238f, 0xba6d, 0xba55, 0xbfa0, 0x3191, 0x22ce, 0x3c36, 0xa50f, 0xaba5, 0xb0dc, 0x4216, 0xb2ff, 0x4322, 0x40fa, 0x418f, 0xba57, 0x4553, 0x1f57, 0xbf89, 0x0fe2, 0x3db5, 0xb201, 0x4111, 0xa77b, 0x42f0, 0x18c1, 0xbfa1, 0x1797, 0xbf80, 0x415c, 0xa873, 0x1a6f, 0x43c4, 0x41dc, 0x42d8, 0x4107, 0x40fa, 0x44d3, 0x401b, 0x0e14, 0xbfe0, 0xbacb, 0x0018, 0xb029, 0x403e, 0x4259, 0x408c, 0xb021, 0x0d72, 0x409f, 0x3e97, 0x0710, 0x422a, 0xbf23, 0xb08d, 0x1777, 0x2940, 0x40b2, 0xbae8, 0x1d10, 0x2a49, 0x24f4, 0x4297, 0x44d2, 0x405b, 0xbfb4, 0x4036, 0x3cc2, 0xbac2, 0x4287, 0x408f, 0x04cf, 0x4402, 0xbf36, 0x18a3, 0x1153, 0x4222, 0xb058, 0x403b, 0x424e, 0x1f0a, 0x419f, 0x43cd, 0xba14, 0x403f, 0xbae3, 0x1a87, 0xb275, 0x4053, 0x433d, 0xb2b7, 0x20a2, 0x40ed, 0x425c, 0x405e, 0xb2f0, 0x169c, 0x43de, 0xb2b4, 0xb030, 0x401e, 0xbf75, 0x4329, 0x1f63, 0x40ed, 0xb2e5, 0xb21e, 0x2dae, 0x13ff, 0xb246, 0x19fb, 0x43a2, 0x4179, 0x4304, 0x25a9, 0x1d4e, 0x1804, 0xb2d8, 0x41ba, 0xb28c, 0x4264, 0x4237, 0x27ff, 0x400a, 0xb00e, 0xb0c7, 0x42af, 0x33d3, 0x0b19, 0x42f9, 0xbf29, 0x41be, 0xb20e, 0xba0a, 0x25c7, 0x4215, 0x1b76, 0x16d0, 0xb08c, 0xb299, 0x4305, 0xbf94, 0xa65b, 0x02f3, 0xb226, 0x40c5, 0x185a, 0x42a4, 0xbf92, 0x1a1f, 0xb29b, 0x40d5, 0xba22, 0xb27b, 0xb0ac, 0x2ee1, 0x424e, 0xb2f8, 0x4299, 0xb26d, 0x0c8c, 0x4350, 0x4191, 0x1a7a, 0x439f, 0x1f7b, 0xb0f6, 0x442d, 0x0997, 0xbf36, 0x418d, 0xba3f, 0xb096, 0x0faa, 0xb201, 0x4302, 0x1919, 0x1d75, 0xb2f2, 0x4288, 0xbf00, 0xb203, 0x413f, 0x40ea, 0xbfd0, 0x198b, 0x4117, 0x439c, 0x09e7, 0xb277, 0x0cce, 0x43a1, 0xba4e, 0x466d, 0x18cf, 0x1e3e, 0xba56, 0xad9d, 0xbf71, 0x428e, 0x0a44, 0x434f, 0x4335, 0x401c, 0x403a, 0xbac5, 0xb0eb, 0xb075, 0x1ee0, 0x300b, 0x419a, 0x4152, 0x1833, 0x412f, 0x42cd, 0x42b6, 0x0e30, 0xa3fc, 0x40d4, 0xb226, 0x409d, 0x0a68, 0x3bb8, 0x1b5d, 0x1a26, 0xb2bb, 0xb290, 0x4294, 0xbfb8, 0x1d4a, 0x431a, 0xb071, 0x41f8, 0x42d3, 0x23e3, 0xb2c7, 0xb217, 0x436d, 0xba56, 0xb2c6, 0x417d, 0x1b54, 0xba72, 0x40eb, 0x0b91, 0xbf2f, 0xb242, 0xa679, 0x41bd, 0xba15, 0x4394, 0x419e, 0x42ad, 0x2bbf, 0x405e, 0x4128, 0x3858, 0x46cb, 0xbf79, 0x40e6, 0x42e0, 0x411c, 0x23b9, 0x42c2, 0x42f9, 0x00d5, 0x435b, 0x08e8, 0x2279, 0xbf94, 0xad4a, 0x4014, 0x40b4, 0x21dc, 0x435a, 0x46b9, 0xb2c5, 0xa749, 0x43b4, 0x40d2, 0x4408, 0x43d5, 0xbf60, 0x43d3, 0x408f, 0x2e00, 0x1ec6, 0x4186, 0xa036, 0x4147, 0xb227, 0xbf9d, 0x1a4b, 0x418f, 0x44b2, 0x40d9, 0xbf37, 0xb2ac, 0x1173, 0xb0e2, 0x409d, 0xb23e, 0xb230, 0x42da, 0x4081, 0x413d, 0xafe1, 0x1d08, 0x408b, 0x412a, 0x334a, 0x4023, 0x4028, 0xb014, 0xba0d, 0x05a5, 0x118a, 0x4090, 0x40cc, 0xb2da, 0x2c35, 0x4057, 0x40ee, 0x408c, 0xb259, 0x3bb3, 0xbf3d, 0x4323, 0x4384, 0xb286, 0x43a6, 0x41e6, 0x2ac2, 0x434b, 0x2a9c, 0x40bc, 0x43c4, 0x1f48, 0x2920, 0xab0a, 0x439e, 0xb0c9, 0xbf7a, 0x4081, 0xba67, 0xbf70, 0x42bc, 0x2f3c, 0x41b1, 0xa46f, 0xbace, 0x3c3d, 0xb2f1, 0x43c7, 0x4049, 0x11d4, 0xbf45, 0x4042, 0x1115, 0x4113, 0xba1b, 0xa069, 0x4571, 0xbacd, 0x1aee, 0x4499, 0xb06a, 0x42ac, 0x4069, 0xa4cd, 0x402a, 0x416b, 0x429c, 0x4362, 0x1314, 0x38c5, 0x400a, 0x4122, 0x3473, 0x413a, 0xba66, 0x27a8, 0x42ca, 0x4369, 0xbfce, 0x4268, 0xa867, 0x4072, 0x04f5, 0xba27, 0x43b5, 0x3c3f, 0xbf25, 0xba45, 0x439c, 0x1cd7, 0xb203, 0x45a3, 0xba2b, 0x41bd, 0x4013, 0x41a0, 0x43cd, 0xb2c4, 0xba18, 0x4097, 0x1507, 0xba2e, 0xaa23, 0x417a, 0x42fc, 0x1df3, 0x40c1, 0xba68, 0x41b6, 0xa65b, 0x438f, 0x1cbe, 0x01aa, 0xbf5d, 0x42a5, 0x070b, 0x423f, 0x465f, 0x4350, 0xa044, 0xb287, 0xb289, 0x42ad, 0x40fc, 0xafbe, 0x0b8c, 0xb2aa, 0x40d3, 0x463c, 0x4314, 0x1d39, 0x40e1, 0x1d12, 0x0eb4, 0xbf23, 0x43b0, 0xb2ca, 0x1b06, 0x414d, 0x1813, 0xb2f0, 0x1cec, 0xa02b, 0x454e, 0x4111, 0x19e3, 0x41f2, 0x4228, 0xbada, 0xb20f, 0x4342, 0x418c, 0x435d, 0x2d58, 0xb2af, 0x429b, 0x4020, 0xb2ae, 0x198b, 0x4256, 0xbf7c, 0xbaf9, 0xa179, 0xb012, 0xb2ed, 0x466e, 0x42b8, 0xb003, 0xb0c2, 0x429c, 0xb2fe, 0x00cb, 0x4440, 0x428e, 0xb033, 0x467e, 0x419e, 0x4396, 0xb261, 0x29a3, 0x434c, 0x1f85, 0x2734, 0x4068, 0xbf52, 0x44cb, 0xbac6, 0x4374, 0xb013, 0x42b7, 0x3f89, 0x163d, 0x1db9, 0xbf19, 0x430c, 0x4326, 0x440e, 0xba28, 0xba31, 0x43e2, 0x41b9, 0xad58, 0x4108, 0x1ad5, 0x428b, 0x1393, 0x4290, 0xb2b9, 0x403d, 0xb23d, 0xb00e, 0xaf72, 0x420e, 0x438e, 0x1298, 0x40db, 0x41ce, 0x40b8, 0x1da4, 0xb085, 0x420b, 0xbf18, 0x025d, 0x1b8b, 0x1038, 0x4191, 0x1e3f, 0x3912, 0x4015, 0x1b40, 0xba0a, 0xb0a5, 0x2dfa, 0x405a, 0xb2dc, 0x419f, 0x020d, 0xbf03, 0x420b, 0x4185, 0xbaca, 0xb0a1, 0x32e6, 0xbae1, 0x40ad, 0x0c4c, 0x426a, 0x442d, 0x0cbc, 0x3f03, 0x4220, 0xb025, 0xb05d, 0x0a54, 0x4253, 0x40e4, 0x0628, 0xba74, 0x4130, 0xb201, 0x3d5a, 0x1f92, 0x42fb, 0x2807, 0x3fd0, 0x434e, 0xbfd5, 0x433e, 0x4171, 0xb0c9, 0x4389, 0x0633, 0xbadd, 0x4468, 0xae94, 0x1efb, 0xb0ba, 0x4066, 0x18b4, 0xbf9b, 0x0986, 0x4373, 0x3dfe, 0xb2cf, 0x4276, 0x37fc, 0x4154, 0xb03b, 0x34e0, 0x1e93, 0x4394, 0x4261, 0x43ce, 0xb0b7, 0xb234, 0xb242, 0x406a, 0x42e3, 0x2ae2, 0x1b93, 0xbf96, 0xb07a, 0x4317, 0x1e51, 0x42e5, 0x430d, 0x324b, 0x4354, 0x410d, 0x41b8, 0x1eb2, 0x4035, 0x06cb, 0x4353, 0x43ca, 0xa102, 0x203d, 0x414e, 0xba16, 0x1b5a, 0xb2d4, 0xb292, 0xbf2d, 0x411e, 0xba6a, 0xb29e, 0x430b, 0x418f, 0xb017, 0x3d40, 0x4271, 0x43ca, 0xb20d, 0x42d1, 0x1ae9, 0x419d, 0x4021, 0x466a, 0x2bb4, 0x1ef8, 0x24be, 0x4146, 0xbf77, 0x423e, 0x4075, 0x4145, 0xb23b, 0xbae8, 0x0db2, 0xb20b, 0xb2bf, 0x0cbf, 0x183f, 0x0f19, 0x21e3, 0x4231, 0x46f9, 0x400b, 0xb0bf, 0x405f, 0xb047, 0x3f77, 0x1c33, 0x3d13, 0x3476, 0xb218, 0xbf7c, 0x4060, 0x43b8, 0xbf80, 0xb0c4, 0x40e7, 0x421c, 0xbf64, 0xb0de, 0x436e, 0x41b5, 0xb0bc, 0x4065, 0x40f4, 0x2bb9, 0xaf92, 0x4624, 0x1e4c, 0x4318, 0x41e2, 0x0adf, 0xb2d4, 0x1e99, 0x1e3b, 0x46f0, 0xa8b3, 0xbf7e, 0x32ac, 0x2b7a, 0x41fb, 0x40fd, 0xba62, 0xbf21, 0x0d64, 0x42b0, 0x3a8c, 0x4270, 0x1e40, 0xbfd4, 0xb298, 0x4084, 0x43e2, 0xbaf3, 0xb256, 0x422d, 0x2965, 0xb29d, 0xb260, 0x41ec, 0x41fb, 0x071c, 0xbf4e, 0x403a, 0x41c6, 0xbad3, 0x41b6, 0x4651, 0xb2c7, 0x44e2, 0x43fd, 0x421f, 0x09c3, 0x4018, 0xbaf3, 0xbff0, 0x106b, 0x40bc, 0x46bc, 0x41ba, 0x41be, 0xb297, 0x4270, 0x4369, 0xbf6c, 0x46b4, 0xb21a, 0x0857, 0x37bc, 0x41c4, 0x1cc5, 0xaddc, 0xb014, 0xb2e3, 0xb0fb, 0x1f42, 0x06c9, 0x412d, 0xa6cd, 0xb2bc, 0x40a6, 0xb0e1, 0x4174, 0xb29f, 0x4200, 0xbf55, 0xba34, 0x4080, 0x434f, 0xb249, 0x43f7, 0x44e1, 0xa252, 0x409d, 0x42bc, 0x4195, 0x4274, 0xba0f, 0x41ce, 0x43e9, 0x45e3, 0xb21b, 0x2ffd, 0xa5c2, 0xba7b, 0x4068, 0x4062, 0x0ea1, 0xbf68, 0x0330, 0x4041, 0x2f6d, 0x0761, 0x4354, 0x3531, 0x40c5, 0xac1f, 0x0a0d, 0x4104, 0x4338, 0x428a, 0x4293, 0xba73, 0x0b8b, 0x0958, 0xbfa3, 0x00ff, 0x43b3, 0x1bca, 0x4146, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xca173107, 0x59131982, 0xd9386e54, 0x24fdf592, 0x3f36eb46, 0x7926dfe1, 0x64131655, 0x72501df8, 0xd923625a, 0xfe222377, 0xf0f7cf65, 0x2d44a91d, 0x61d44f3a, 0x2f3c5836, 0x00000000, 0x300001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00000000, 0xffffffc0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x000016c0, 0x8f32eca2, 0xfe2234ce, 0x00000000, 0x2f3c6602, 0x00000000, 0x400001d0 }, + Instructions = [0x418a, 0x18b4, 0xb262, 0x1dbf, 0xb028, 0x2f39, 0xba6e, 0x1e05, 0x41b8, 0x1a37, 0xbfc2, 0x3a0d, 0xaacb, 0x435a, 0x411a, 0x43c3, 0xbfc1, 0x4241, 0x1c8d, 0x46db, 0x2c85, 0x420a, 0xb29c, 0x35a9, 0xad4a, 0xb007, 0x433d, 0x42a9, 0x2e9d, 0x42dc, 0xba41, 0xba2b, 0xb236, 0x40ad, 0x2a1f, 0xa550, 0xb2ae, 0x0dd7, 0xbaea, 0x456a, 0x4299, 0x40d9, 0xa992, 0xbf0a, 0xbaff, 0xbad1, 0x4667, 0xaf90, 0x4281, 0x4310, 0xba51, 0xbf7c, 0x30f1, 0x43ff, 0x41c9, 0xb2f2, 0x412e, 0x43f1, 0xba1d, 0x45da, 0x275c, 0xb2d2, 0x337c, 0x4200, 0xbfb5, 0xb292, 0xba70, 0x4174, 0x40b0, 0x41e1, 0x42ed, 0x41e6, 0x439f, 0x224e, 0xba2c, 0x12e8, 0x411c, 0x1dea, 0x40f4, 0x4199, 0x43ac, 0x40fb, 0xb23b, 0x0f39, 0x4093, 0x45cb, 0x431a, 0x13c1, 0xbf73, 0xb271, 0x398f, 0xb018, 0x402a, 0xb002, 0xaac0, 0x1bc9, 0x2243, 0x0ec2, 0x3f51, 0xbf1b, 0x408c, 0xb0d0, 0x1c15, 0x03fc, 0x39ff, 0xb2a6, 0x02ca, 0x46ba, 0x3b17, 0x19ea, 0x40ef, 0x064f, 0x43f8, 0xbfda, 0x4268, 0x4074, 0x35bd, 0x44fa, 0x1ceb, 0xbf2d, 0x4325, 0x4157, 0x415c, 0x431a, 0xbaf1, 0xa1b0, 0x1b83, 0x01c9, 0x4306, 0x42e5, 0x172c, 0x0b7d, 0x405a, 0x4140, 0x4393, 0x4056, 0x1e6e, 0x414e, 0x40f4, 0x43a2, 0xb292, 0xbf3f, 0x4445, 0x190a, 0x431b, 0x1b32, 0xbf59, 0x4625, 0xad4e, 0x45bb, 0x446d, 0x44cc, 0x195c, 0x4619, 0xafd9, 0x0a89, 0x23e7, 0xa8ec, 0x425c, 0x41d0, 0x362d, 0x4257, 0xb036, 0xbf39, 0x44ec, 0xb00c, 0xb214, 0x1f74, 0xba33, 0x4574, 0x44f9, 0x41aa, 0x3e33, 0xbf7e, 0xb089, 0x4260, 0x44fd, 0xbfa8, 0x4262, 0x4348, 0xa90d, 0xaee0, 0xbf97, 0xba70, 0xba28, 0x4370, 0xb2c6, 0x41d4, 0xb21b, 0xb281, 0x43fc, 0xbfd3, 0x1a9f, 0xbac9, 0xbf60, 0x3f4b, 0x25a2, 0x4149, 0xbaeb, 0x4009, 0x238f, 0xba6d, 0xba55, 0xbfa0, 0x3191, 0x22ce, 0x3c36, 0xa50f, 0xaba5, 0xb0dc, 0x4216, 0xb2ff, 0x4322, 0x40fa, 0x418f, 0xba57, 0x4553, 0x1f57, 0xbf89, 0x0fe2, 0x3db5, 0xb201, 0x4111, 0xa77b, 0x42f0, 0x18c1, 0xbfa1, 0x1797, 0xbf80, 0x415c, 0xa873, 0x1a6f, 0x43c4, 0x41dc, 0x42d8, 0x4107, 0x40fa, 0x44d3, 0x401b, 0x0e14, 0xbfe0, 0xbacb, 0x0018, 0xb029, 0x403e, 0x4259, 0x408c, 0xb021, 0x0d72, 0x409f, 0x3e97, 0x0710, 0x422a, 0xbf23, 0xb08d, 0x1777, 0x2940, 0x40b2, 0xbae8, 0x1d10, 0x2a49, 0x24f4, 0x4297, 0x44d2, 0x405b, 0xbfb4, 0x4036, 0x3cc2, 0xbac2, 0x4287, 0x408f, 0x04cf, 0x4402, 0xbf36, 0x18a3, 0x1153, 0x4222, 0xb058, 0x403b, 0x424e, 0x1f0a, 0x419f, 0x43cd, 0xba14, 0x403f, 0xbae3, 0x1a87, 0xb275, 0x4053, 0x433d, 0xb2b7, 0x20a2, 0x40ed, 0x425c, 0x405e, 0xb2f0, 0x169c, 0x43de, 0xb2b4, 0xb030, 0x401e, 0xbf75, 0x4329, 0x1f63, 0x40ed, 0xb2e5, 0xb21e, 0x2dae, 0x13ff, 0xb246, 0x19fb, 0x43a2, 0x4179, 0x4304, 0x25a9, 0x1d4e, 0x1804, 0xb2d8, 0x41ba, 0xb28c, 0x4264, 0x4237, 0x27ff, 0x400a, 0xb00e, 0xb0c7, 0x42af, 0x33d3, 0x0b19, 0x42f9, 0xbf29, 0x41be, 0xb20e, 0xba0a, 0x25c7, 0x4215, 0x1b76, 0x16d0, 0xb08c, 0xb299, 0x4305, 0xbf94, 0xa65b, 0x02f3, 0xb226, 0x40c5, 0x185a, 0x42a4, 0xbf92, 0x1a1f, 0xb29b, 0x40d5, 0xba22, 0xb27b, 0xb0ac, 0x2ee1, 0x424e, 0xb2f8, 0x4299, 0xb26d, 0x0c8c, 0x4350, 0x4191, 0x1a7a, 0x439f, 0x1f7b, 0xb0f6, 0x442d, 0x0997, 0xbf36, 0x418d, 0xba3f, 0xb096, 0x0faa, 0xb201, 0x4302, 0x1919, 0x1d75, 0xb2f2, 0x4288, 0xbf00, 0xb203, 0x413f, 0x40ea, 0xbfd0, 0x198b, 0x4117, 0x439c, 0x09e7, 0xb277, 0x0cce, 0x43a1, 0xba4e, 0x466d, 0x18cf, 0x1e3e, 0xba56, 0xad9d, 0xbf71, 0x428e, 0x0a44, 0x434f, 0x4335, 0x401c, 0x403a, 0xbac5, 0xb0eb, 0xb075, 0x1ee0, 0x300b, 0x419a, 0x4152, 0x1833, 0x412f, 0x42cd, 0x42b6, 0x0e30, 0xa3fc, 0x40d4, 0xb226, 0x409d, 0x0a68, 0x3bb8, 0x1b5d, 0x1a26, 0xb2bb, 0xb290, 0x4294, 0xbfb8, 0x1d4a, 0x431a, 0xb071, 0x41f8, 0x42d3, 0x23e3, 0xb2c7, 0xb217, 0x436d, 0xba56, 0xb2c6, 0x417d, 0x1b54, 0xba72, 0x40eb, 0x0b91, 0xbf2f, 0xb242, 0xa679, 0x41bd, 0xba15, 0x4394, 0x419e, 0x42ad, 0x2bbf, 0x405e, 0x4128, 0x3858, 0x46cb, 0xbf79, 0x40e6, 0x42e0, 0x411c, 0x23b9, 0x42c2, 0x42f9, 0x00d5, 0x435b, 0x08e8, 0x2279, 0xbf94, 0xad4a, 0x4014, 0x40b4, 0x21dc, 0x435a, 0x46b9, 0xb2c5, 0xa749, 0x43b4, 0x40d2, 0x4408, 0x43d5, 0xbf60, 0x43d3, 0x408f, 0x2e00, 0x1ec6, 0x4186, 0xa036, 0x4147, 0xb227, 0xbf9d, 0x1a4b, 0x418f, 0x44b2, 0x40d9, 0xbf37, 0xb2ac, 0x1173, 0xb0e2, 0x409d, 0xb23e, 0xb230, 0x42da, 0x4081, 0x413d, 0xafe1, 0x1d08, 0x408b, 0x412a, 0x334a, 0x4023, 0x4028, 0xb014, 0xba0d, 0x05a5, 0x118a, 0x4090, 0x40cc, 0xb2da, 0x2c35, 0x4057, 0x40ee, 0x408c, 0xb259, 0x3bb3, 0xbf3d, 0x4323, 0x4384, 0xb286, 0x43a6, 0x41e6, 0x2ac2, 0x434b, 0x2a9c, 0x40bc, 0x43c4, 0x1f48, 0x2920, 0xab0a, 0x439e, 0xb0c9, 0xbf7a, 0x4081, 0xba67, 0xbf70, 0x42bc, 0x2f3c, 0x41b1, 0xa46f, 0xbace, 0x3c3d, 0xb2f1, 0x43c7, 0x4049, 0x11d4, 0xbf45, 0x4042, 0x1115, 0x4113, 0xba1b, 0xa069, 0x4571, 0xbacd, 0x1aee, 0x4499, 0xb06a, 0x42ac, 0x4069, 0xa4cd, 0x402a, 0x416b, 0x429c, 0x4362, 0x1314, 0x38c5, 0x400a, 0x4122, 0x3473, 0x413a, 0xba66, 0x27a8, 0x42ca, 0x4369, 0xbfce, 0x4268, 0xa867, 0x4072, 0x04f5, 0xba27, 0x43b5, 0x3c3f, 0xbf25, 0xba45, 0x439c, 0x1cd7, 0xb203, 0x45a3, 0xba2b, 0x41bd, 0x4013, 0x41a0, 0x43cd, 0xb2c4, 0xba18, 0x4097, 0x1507, 0xba2e, 0xaa23, 0x417a, 0x42fc, 0x1df3, 0x40c1, 0xba68, 0x41b6, 0xa65b, 0x438f, 0x1cbe, 0x01aa, 0xbf5d, 0x42a5, 0x070b, 0x423f, 0x465f, 0x4350, 0xa044, 0xb287, 0xb289, 0x42ad, 0x40fc, 0xafbe, 0x0b8c, 0xb2aa, 0x40d3, 0x463c, 0x4314, 0x1d39, 0x40e1, 0x1d12, 0x0eb4, 0xbf23, 0x43b0, 0xb2ca, 0x1b06, 0x414d, 0x1813, 0xb2f0, 0x1cec, 0xa02b, 0x454e, 0x4111, 0x19e3, 0x41f2, 0x4228, 0xbada, 0xb20f, 0x4342, 0x418c, 0x435d, 0x2d58, 0xb2af, 0x429b, 0x4020, 0xb2ae, 0x198b, 0x4256, 0xbf7c, 0xbaf9, 0xa179, 0xb012, 0xb2ed, 0x466e, 0x42b8, 0xb003, 0xb0c2, 0x429c, 0xb2fe, 0x00cb, 0x4440, 0x428e, 0xb033, 0x467e, 0x419e, 0x4396, 0xb261, 0x29a3, 0x434c, 0x1f85, 0x2734, 0x4068, 0xbf52, 0x44cb, 0xbac6, 0x4374, 0xb013, 0x42b7, 0x3f89, 0x163d, 0x1db9, 0xbf19, 0x430c, 0x4326, 0x440e, 0xba28, 0xba31, 0x43e2, 0x41b9, 0xad58, 0x4108, 0x1ad5, 0x428b, 0x1393, 0x4290, 0xb2b9, 0x403d, 0xb23d, 0xb00e, 0xaf72, 0x420e, 0x438e, 0x1298, 0x40db, 0x41ce, 0x40b8, 0x1da4, 0xb085, 0x420b, 0xbf18, 0x025d, 0x1b8b, 0x1038, 0x4191, 0x1e3f, 0x3912, 0x4015, 0x1b40, 0xba0a, 0xb0a5, 0x2dfa, 0x405a, 0xb2dc, 0x419f, 0x020d, 0xbf03, 0x420b, 0x4185, 0xbaca, 0xb0a1, 0x32e6, 0xbae1, 0x40ad, 0x0c4c, 0x426a, 0x442d, 0x0cbc, 0x3f03, 0x4220, 0xb025, 0xb05d, 0x0a54, 0x4253, 0x40e4, 0x0628, 0xba74, 0x4130, 0xb201, 0x3d5a, 0x1f92, 0x42fb, 0x2807, 0x3fd0, 0x434e, 0xbfd5, 0x433e, 0x4171, 0xb0c9, 0x4389, 0x0633, 0xbadd, 0x4468, 0xae94, 0x1efb, 0xb0ba, 0x4066, 0x18b4, 0xbf9b, 0x0986, 0x4373, 0x3dfe, 0xb2cf, 0x4276, 0x37fc, 0x4154, 0xb03b, 0x34e0, 0x1e93, 0x4394, 0x4261, 0x43ce, 0xb0b7, 0xb234, 0xb242, 0x406a, 0x42e3, 0x2ae2, 0x1b93, 0xbf96, 0xb07a, 0x4317, 0x1e51, 0x42e5, 0x430d, 0x324b, 0x4354, 0x410d, 0x41b8, 0x1eb2, 0x4035, 0x06cb, 0x4353, 0x43ca, 0xa102, 0x203d, 0x414e, 0xba16, 0x1b5a, 0xb2d4, 0xb292, 0xbf2d, 0x411e, 0xba6a, 0xb29e, 0x430b, 0x418f, 0xb017, 0x3d40, 0x4271, 0x43ca, 0xb20d, 0x42d1, 0x1ae9, 0x419d, 0x4021, 0x466a, 0x2bb4, 0x1ef8, 0x24be, 0x4146, 0xbf77, 0x423e, 0x4075, 0x4145, 0xb23b, 0xbae8, 0x0db2, 0xb20b, 0xb2bf, 0x0cbf, 0x183f, 0x0f19, 0x21e3, 0x4231, 0x46f9, 0x400b, 0xb0bf, 0x405f, 0xb047, 0x3f77, 0x1c33, 0x3d13, 0x3476, 0xb218, 0xbf7c, 0x4060, 0x43b8, 0xbf80, 0xb0c4, 0x40e7, 0x421c, 0xbf64, 0xb0de, 0x436e, 0x41b5, 0xb0bc, 0x4065, 0x40f4, 0x2bb9, 0xaf92, 0x4624, 0x1e4c, 0x4318, 0x41e2, 0x0adf, 0xb2d4, 0x1e99, 0x1e3b, 0x46f0, 0xa8b3, 0xbf7e, 0x32ac, 0x2b7a, 0x41fb, 0x40fd, 0xba62, 0xbf21, 0x0d64, 0x42b0, 0x3a8c, 0x4270, 0x1e40, 0xbfd4, 0xb298, 0x4084, 0x43e2, 0xbaf3, 0xb256, 0x422d, 0x2965, 0xb29d, 0xb260, 0x41ec, 0x41fb, 0x071c, 0xbf4e, 0x403a, 0x41c6, 0xbad3, 0x41b6, 0x4651, 0xb2c7, 0x44e2, 0x43fd, 0x421f, 0x09c3, 0x4018, 0xbaf3, 0xbff0, 0x106b, 0x40bc, 0x46bc, 0x41ba, 0x41be, 0xb297, 0x4270, 0x4369, 0xbf6c, 0x46b4, 0xb21a, 0x0857, 0x37bc, 0x41c4, 0x1cc5, 0xaddc, 0xb014, 0xb2e3, 0xb0fb, 0x1f42, 0x06c9, 0x412d, 0xa6cd, 0xb2bc, 0x40a6, 0xb0e1, 0x4174, 0xb29f, 0x4200, 0xbf55, 0xba34, 0x4080, 0x434f, 0xb249, 0x43f7, 0x44e1, 0xa252, 0x409d, 0x42bc, 0x4195, 0x4274, 0xba0f, 0x41ce, 0x43e9, 0x45e3, 0xb21b, 0x2ffd, 0xa5c2, 0xba7b, 0x4068, 0x4062, 0x0ea1, 0xbf68, 0x0330, 0x4041, 0x2f6d, 0x0761, 0x4354, 0x3531, 0x40c5, 0xac1f, 0x0a0d, 0x4104, 0x4338, 0x428a, 0x4293, 0xba73, 0x0b8b, 0x0958, 0xbfa3, 0x00ff, 0x43b3, 0x1bca, 0x4146, 0x4770, 0xe7fe + ], + StartRegs = [0xca173107, 0x59131982, 0xd9386e54, 0x24fdf592, 0x3f36eb46, 0x7926dfe1, 0x64131655, 0x72501df8, 0xd923625a, 0xfe222377, 0xf0f7cf65, 0x2d44a91d, 0x61d44f3a, 0x2f3c5836, 0x00000000, 0x300001f0 + ], + FinalRegs = [0x00000000, 0x00000000, 0xffffffc0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x000016c0, 0x8f32eca2, 0xfe2234ce, 0x00000000, 0x2f3c6602, 0x00000000, 0x400001d0 + ], }, new() { - Instructions = new ushort[] { 0x23f8, 0xbfae, 0x415e, 0xbf00, 0x00dd, 0x1949, 0xb2d0, 0x45e8, 0x4179, 0x1814, 0xb001, 0xb239, 0x2993, 0xbfd8, 0x42ec, 0x3367, 0xbf7c, 0xb2a5, 0x3158, 0x4273, 0xbf16, 0x4099, 0x2952, 0x1ff7, 0xbfa8, 0x4059, 0xac74, 0x413a, 0xb03e, 0x1e71, 0x2513, 0x4293, 0x1e93, 0x4321, 0x16a0, 0x410e, 0x1d63, 0xb048, 0x43eb, 0x417c, 0xbf7f, 0xab52, 0xaa4f, 0x4267, 0xb2bd, 0xb227, 0x40ce, 0x0c3d, 0x09b8, 0x4218, 0xa803, 0x1b80, 0x4037, 0x185b, 0x3a2a, 0xbfdc, 0x4345, 0x42e2, 0x2885, 0xb0f7, 0xb2ca, 0x46aa, 0x2e1d, 0x436c, 0xba12, 0x4227, 0x0c58, 0xb075, 0x08a1, 0xba6b, 0xada7, 0xb034, 0xa86d, 0x426e, 0x428f, 0x4218, 0x4389, 0x1a12, 0xaab7, 0xbfe0, 0xb299, 0xbf3e, 0x41c7, 0x4200, 0x40cd, 0x4073, 0xb00b, 0x1122, 0x4270, 0x1516, 0xb0fe, 0x306c, 0x412d, 0x40ce, 0x3c5c, 0x1fab, 0x43bb, 0x4446, 0x405e, 0x40c6, 0xb03b, 0xba37, 0x403e, 0x46fc, 0xbf15, 0xb262, 0x1b66, 0xb26f, 0x4461, 0x22a8, 0x4276, 0x4289, 0x42e4, 0xbaf7, 0x404b, 0x166d, 0x44d9, 0x43fe, 0xb0eb, 0x43d9, 0xaa3b, 0x0b0e, 0xbf0a, 0x332e, 0xba4f, 0x1f48, 0x446d, 0x2fcc, 0x4009, 0x431a, 0x4006, 0x1f9b, 0x42c6, 0xb01d, 0x17a0, 0x4369, 0xbfc0, 0x07be, 0x4026, 0xb00f, 0x4412, 0x30d4, 0x4089, 0x461c, 0x432e, 0xbf36, 0xba17, 0x40ab, 0x432a, 0xa280, 0x1f32, 0xb0e4, 0x23c0, 0x1a9e, 0x4080, 0xba1f, 0xba5e, 0x2887, 0xad8b, 0x282d, 0x1882, 0x41ab, 0xb2e0, 0xb2e7, 0x4373, 0x41c2, 0x41ed, 0x45eb, 0xb00f, 0xb07f, 0xba27, 0xbf63, 0x1bcc, 0x4098, 0xa2a7, 0x189c, 0x4338, 0x4308, 0xbace, 0x1ff4, 0x40fd, 0x4279, 0x0ae8, 0x3b6d, 0x4315, 0x4654, 0x00d0, 0x425e, 0x40ef, 0x4357, 0x192b, 0xbf94, 0x43ce, 0x37fa, 0x1c40, 0x2cbf, 0x26f3, 0x1fe8, 0xb227, 0xabe3, 0x401e, 0x310b, 0x40ce, 0x4223, 0xbf65, 0xba30, 0x4352, 0x4241, 0x0f84, 0x1941, 0x4098, 0x40f7, 0x409a, 0x4081, 0x400c, 0x41da, 0xb256, 0x45cd, 0x1f42, 0x42f2, 0xbaef, 0x0335, 0xa8e0, 0x429a, 0xba0e, 0x40a3, 0x3d57, 0x439d, 0x406f, 0xbae3, 0xbfc6, 0x2f1b, 0xb2f5, 0xa396, 0x41ff, 0x40e4, 0x4401, 0x43f9, 0x4169, 0x40cb, 0x1f8b, 0x4335, 0xb25a, 0x4407, 0xba60, 0x4286, 0xa2ee, 0x4027, 0xbf3f, 0x1c86, 0x435c, 0x40bc, 0x41cc, 0x1bda, 0x2ad1, 0x1c02, 0xb04d, 0x42cb, 0x4084, 0x1dd2, 0xb2fd, 0xb0ac, 0xb280, 0x1dad, 0xb06c, 0x43a1, 0x4310, 0x40e4, 0x435f, 0xb2be, 0x4201, 0xbf7b, 0x1e70, 0x0de8, 0x02bf, 0x407d, 0x45d2, 0x1d92, 0x43c8, 0xbfa4, 0x401d, 0x431e, 0x4030, 0x40a1, 0x1fb9, 0x2bdc, 0xbf44, 0x423c, 0x41f8, 0x0525, 0xbf03, 0xbae5, 0x4316, 0x2fa1, 0xb042, 0x438d, 0x3f53, 0x424a, 0xa7ee, 0x4470, 0x0dc7, 0x4408, 0x18e7, 0xb2f9, 0xb01f, 0xa1af, 0xbf28, 0xbfc0, 0xb26b, 0xa1cc, 0xbf6c, 0x0855, 0x3e49, 0x45e1, 0x41a7, 0xba1b, 0x2d90, 0x4216, 0xb215, 0xb224, 0x4136, 0xb0fb, 0x4676, 0x1127, 0x4151, 0xba11, 0xb287, 0xb2e4, 0x4074, 0x4313, 0x060e, 0x1dc1, 0xb213, 0x4000, 0x42ca, 0x4085, 0x264b, 0xbf84, 0xa3c4, 0xb045, 0x0f04, 0x425a, 0xba22, 0x414a, 0x4155, 0x40ae, 0x12ca, 0x3ed5, 0xb0e1, 0x4080, 0xba16, 0xb04b, 0xba70, 0xbfa0, 0x40d5, 0x402b, 0xbaf1, 0x46b8, 0x1f45, 0xbf60, 0x423d, 0xb2ee, 0x2b14, 0x1e82, 0xbfc9, 0x1e6e, 0x415b, 0xba48, 0x2cf4, 0x43ee, 0x4322, 0xba57, 0xba68, 0x434d, 0xba0d, 0x31f2, 0xbf86, 0xa72b, 0x43d1, 0xb22c, 0xb29a, 0x3a3a, 0x433b, 0x41ad, 0x401a, 0x1df5, 0x0084, 0xa1db, 0xbfe0, 0x4091, 0xb294, 0x43f7, 0xbfde, 0x1d6a, 0x40c1, 0x4052, 0x14ba, 0x4315, 0x1b64, 0x4370, 0x1ef0, 0x0bf2, 0xb09b, 0xbf2e, 0x4260, 0xba0d, 0x0a68, 0xbfd0, 0x4197, 0x1e0a, 0xb204, 0x4282, 0x1afb, 0x4369, 0x438d, 0x41b4, 0x40e6, 0xba10, 0xb2e6, 0x436f, 0x40f8, 0x4207, 0x1986, 0x4342, 0xa33e, 0xb2e6, 0x1fe0, 0x402c, 0xbf48, 0xb03e, 0x40df, 0x0251, 0x1e47, 0x42dd, 0xb2d3, 0x1c88, 0xbf42, 0x36f1, 0xbaf1, 0x15ed, 0x433c, 0xbac4, 0xb0aa, 0x4315, 0xb242, 0x1fcd, 0x40b2, 0x420b, 0xb0e1, 0xba7c, 0xa872, 0x2966, 0xba76, 0x4635, 0x438b, 0x40b4, 0xbf80, 0xba5a, 0xbf80, 0x4350, 0xbfcf, 0x3a60, 0x45f4, 0x21f6, 0x2fc8, 0x425f, 0x2511, 0x42cf, 0x1945, 0x2264, 0x40ab, 0xbf8e, 0xb27e, 0xba02, 0x415f, 0xbfd7, 0x1026, 0x40a9, 0x1a50, 0xaca5, 0x4569, 0x1a72, 0x1ca3, 0x407a, 0xbac3, 0x402a, 0x1d13, 0x1ba5, 0x43bb, 0xb2fa, 0x3dc5, 0xb25f, 0xb2cd, 0x1eda, 0xba67, 0x39d3, 0x16ad, 0x1c10, 0x0b53, 0xb225, 0xbf55, 0xb20a, 0x29be, 0xb2cc, 0x43f5, 0x0c83, 0xb21f, 0x439e, 0x45d1, 0xb2b1, 0x0286, 0x441f, 0x0eb2, 0xbae9, 0xba76, 0xb2c4, 0x18f1, 0x40f6, 0xb2c9, 0x052d, 0xbaf3, 0x427f, 0x0215, 0x43ba, 0x4561, 0x14e4, 0xba1e, 0x41b5, 0xaf51, 0x42a3, 0xbf52, 0x4037, 0x410b, 0xba44, 0xbf70, 0x2dee, 0x005e, 0x4181, 0x1d78, 0x0559, 0xbf48, 0xb0ef, 0x40d1, 0x1bc3, 0x4012, 0x4613, 0x0053, 0x4351, 0xb2bd, 0x4381, 0x1a6a, 0x45c6, 0xb200, 0x4443, 0x08ef, 0xbfaf, 0x425e, 0x42e9, 0x437d, 0x10d0, 0xb25b, 0x441c, 0xbad8, 0x4263, 0x2561, 0xb02c, 0xbaf6, 0x428d, 0xb2d5, 0x406d, 0x4015, 0xb0dd, 0x45ac, 0x43d0, 0x365f, 0xb0df, 0xb2c3, 0x1829, 0xb0b3, 0x42e6, 0x02a5, 0x46d2, 0xbf0c, 0x4132, 0x409e, 0x30b6, 0xb25a, 0x42ef, 0x42f1, 0x0405, 0x41b2, 0x41e6, 0xb254, 0x4107, 0x40c6, 0x41a8, 0x0bec, 0x4134, 0xa686, 0xa857, 0xbf04, 0xab3f, 0xbfb0, 0xbf16, 0x4240, 0x42f4, 0xb2fb, 0xb2db, 0xb0f2, 0x197c, 0x0476, 0x406d, 0xb265, 0x40a1, 0x4389, 0x433e, 0xba5f, 0x41e8, 0x0e2f, 0x42f7, 0x4088, 0x3609, 0x24cb, 0x06bb, 0x428c, 0x1544, 0xbf19, 0xba5b, 0xba74, 0x4317, 0x42cc, 0xb261, 0xab8d, 0xa8bf, 0x003f, 0xa63e, 0xba06, 0x4061, 0x1a1d, 0x1baa, 0xbfb5, 0x42e0, 0x4273, 0xba55, 0xa83f, 0x46e0, 0x4324, 0x4556, 0x40e0, 0x421d, 0x2fcd, 0x42b4, 0x3700, 0xbae7, 0x19a2, 0xba1c, 0xba30, 0xb269, 0x1717, 0x413f, 0x1d62, 0x412e, 0x1196, 0x1c42, 0xbf66, 0x4017, 0x4238, 0x4351, 0x405a, 0x28e5, 0x29e7, 0x4555, 0x4052, 0x4356, 0x42bb, 0x079e, 0x42cc, 0xb245, 0xba69, 0x41c6, 0x4158, 0x3c55, 0x1ea8, 0xb25d, 0xbfdb, 0xbae1, 0x2de6, 0x19fe, 0x1b24, 0x4076, 0x46f1, 0xb020, 0xbadf, 0x4373, 0x4332, 0xacca, 0xb072, 0x440d, 0x445c, 0x192d, 0x317a, 0xbf48, 0x2038, 0x08bd, 0xaf9f, 0x0031, 0x4336, 0x15e1, 0xbfb5, 0x4387, 0xbacb, 0x4379, 0xb215, 0xb254, 0xbf7c, 0x19bc, 0x04e4, 0x4574, 0x432f, 0xb279, 0xbf6b, 0xbfd0, 0x2ec6, 0x41a4, 0x2665, 0xb0d5, 0x40e9, 0x435a, 0x4064, 0x1f9b, 0xb2ca, 0x0bee, 0x3d64, 0x3530, 0xbada, 0xa670, 0x42d5, 0x4200, 0x42f5, 0x42b8, 0xbad3, 0xba31, 0xbf71, 0x1cb2, 0xb205, 0x41eb, 0xba50, 0x4126, 0xbfad, 0xb0d7, 0x0788, 0xba09, 0x4246, 0x464a, 0x07d1, 0x438e, 0x4336, 0x2594, 0x3309, 0x4373, 0x4324, 0xb097, 0x428b, 0xbf90, 0x40e8, 0xa8ec, 0xbf3a, 0x0a6a, 0x2d9b, 0x04d6, 0x407d, 0xb233, 0x10b7, 0x40e0, 0x42a7, 0x43fd, 0xa709, 0x19a8, 0x40c3, 0x1b39, 0x19ea, 0x4492, 0x4046, 0xbae9, 0xba67, 0xaee3, 0x435c, 0x43ef, 0x409e, 0x4397, 0x3a1d, 0xbfa0, 0x4158, 0x4135, 0x1f07, 0xbf25, 0xb24f, 0x428f, 0xb2c9, 0x411e, 0xbf00, 0xba6c, 0x26ae, 0xb00f, 0x35f8, 0x419c, 0x1ea4, 0x42d4, 0xb207, 0x1611, 0x4399, 0xbf5c, 0x4283, 0x07d5, 0x10a8, 0x4387, 0x42db, 0xb259, 0xbf04, 0x1f26, 0x413c, 0x40b0, 0x4389, 0x1526, 0x212f, 0xbf63, 0xb0d6, 0xbad7, 0x33b4, 0x4322, 0x4317, 0x4188, 0x43eb, 0x40ea, 0xbfe4, 0x0285, 0x22a7, 0x4291, 0xbaf8, 0xb0ef, 0x438a, 0x1dd5, 0x4344, 0x266e, 0x41ca, 0x4155, 0x430a, 0xb2b7, 0x3f6f, 0xba27, 0x4372, 0xba32, 0x291c, 0x129c, 0xbfb2, 0xac6e, 0x4046, 0x4248, 0x4338, 0x12c1, 0xb227, 0x4168, 0x0f8e, 0x4038, 0x3caa, 0x43b0, 0x1a4b, 0xbf33, 0x21dd, 0xbae6, 0x1bab, 0x43a6, 0xbada, 0x1c96, 0x40a7, 0x4065, 0xb264, 0x1b34, 0x103f, 0x10e0, 0x007e, 0x0742, 0x405b, 0xbada, 0x466f, 0x438a, 0x40f5, 0xb287, 0x43a5, 0xb237, 0x4350, 0x44e5, 0x4222, 0x4067, 0x405e, 0xbfc6, 0x411e, 0x4222, 0x289f, 0xba0c, 0x2535, 0xb29e, 0xba3c, 0xb2a9, 0x1d5c, 0x1afb, 0x4033, 0x1ea6, 0xa772, 0x2d80, 0xa777, 0x43e4, 0x40c9, 0x401f, 0x315d, 0xba55, 0x4595, 0xb2a3, 0x409a, 0xbfaf, 0x46db, 0x4328, 0x4373, 0xb23b, 0xb0a6, 0x4093, 0xa89e, 0xb248, 0x43c9, 0x1643, 0xb04f, 0xb21b, 0x4365, 0xb2d3, 0x4660, 0x42b9, 0xb273, 0x0942, 0x4335, 0x1def, 0xab0c, 0xbf0e, 0x43af, 0x317b, 0x407e, 0x435d, 0x361a, 0x454c, 0x4304, 0x3b0b, 0x4046, 0xbf76, 0x4368, 0xb0fc, 0x4277, 0xa54e, 0x15dd, 0x43ef, 0x42ba, 0x436a, 0x3be5, 0x410e, 0x2870, 0xbf7e, 0x1890, 0x18a3, 0x4203, 0x4384, 0x4371, 0x0e8e, 0x42a8, 0x288f, 0x1920, 0x447b, 0xba58, 0x41e2, 0xb296, 0x42a4, 0x4151, 0xae23, 0x4268, 0x42ea, 0xb2dc, 0x42b5, 0x1ac1, 0x43af, 0xba4d, 0xbf3e, 0xb238, 0x4208, 0x2d85, 0xb284, 0x183c, 0x40c6, 0xa6b9, 0x429f, 0x0428, 0xb080, 0x23ff, 0x4191, 0xb286, 0xab3d, 0xbf23, 0xb2ab, 0x4101, 0xba54, 0x42ae, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xe99b8527, 0x3e866f78, 0xbb8f4079, 0xc9ef19b8, 0xaaf5b29d, 0x98cec417, 0x79e91cc3, 0x8e2e7557, 0xc691e551, 0x2095f998, 0xe3609aa0, 0xb521524b, 0xcc39afbb, 0xcf08047d, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0x161c0000, 0x0cd2dc16, 0xf32d3fff, 0xcf08105b, 0x000000c2, 0x0000161c, 0x00000000, 0x00000061, 0x000010d2, 0x00000000, 0x00001643, 0xb521524b, 0x000010d2, 0xcf080f67, 0x00000000, 0x800001d0 }, + Instructions = [0x23f8, 0xbfae, 0x415e, 0xbf00, 0x00dd, 0x1949, 0xb2d0, 0x45e8, 0x4179, 0x1814, 0xb001, 0xb239, 0x2993, 0xbfd8, 0x42ec, 0x3367, 0xbf7c, 0xb2a5, 0x3158, 0x4273, 0xbf16, 0x4099, 0x2952, 0x1ff7, 0xbfa8, 0x4059, 0xac74, 0x413a, 0xb03e, 0x1e71, 0x2513, 0x4293, 0x1e93, 0x4321, 0x16a0, 0x410e, 0x1d63, 0xb048, 0x43eb, 0x417c, 0xbf7f, 0xab52, 0xaa4f, 0x4267, 0xb2bd, 0xb227, 0x40ce, 0x0c3d, 0x09b8, 0x4218, 0xa803, 0x1b80, 0x4037, 0x185b, 0x3a2a, 0xbfdc, 0x4345, 0x42e2, 0x2885, 0xb0f7, 0xb2ca, 0x46aa, 0x2e1d, 0x436c, 0xba12, 0x4227, 0x0c58, 0xb075, 0x08a1, 0xba6b, 0xada7, 0xb034, 0xa86d, 0x426e, 0x428f, 0x4218, 0x4389, 0x1a12, 0xaab7, 0xbfe0, 0xb299, 0xbf3e, 0x41c7, 0x4200, 0x40cd, 0x4073, 0xb00b, 0x1122, 0x4270, 0x1516, 0xb0fe, 0x306c, 0x412d, 0x40ce, 0x3c5c, 0x1fab, 0x43bb, 0x4446, 0x405e, 0x40c6, 0xb03b, 0xba37, 0x403e, 0x46fc, 0xbf15, 0xb262, 0x1b66, 0xb26f, 0x4461, 0x22a8, 0x4276, 0x4289, 0x42e4, 0xbaf7, 0x404b, 0x166d, 0x44d9, 0x43fe, 0xb0eb, 0x43d9, 0xaa3b, 0x0b0e, 0xbf0a, 0x332e, 0xba4f, 0x1f48, 0x446d, 0x2fcc, 0x4009, 0x431a, 0x4006, 0x1f9b, 0x42c6, 0xb01d, 0x17a0, 0x4369, 0xbfc0, 0x07be, 0x4026, 0xb00f, 0x4412, 0x30d4, 0x4089, 0x461c, 0x432e, 0xbf36, 0xba17, 0x40ab, 0x432a, 0xa280, 0x1f32, 0xb0e4, 0x23c0, 0x1a9e, 0x4080, 0xba1f, 0xba5e, 0x2887, 0xad8b, 0x282d, 0x1882, 0x41ab, 0xb2e0, 0xb2e7, 0x4373, 0x41c2, 0x41ed, 0x45eb, 0xb00f, 0xb07f, 0xba27, 0xbf63, 0x1bcc, 0x4098, 0xa2a7, 0x189c, 0x4338, 0x4308, 0xbace, 0x1ff4, 0x40fd, 0x4279, 0x0ae8, 0x3b6d, 0x4315, 0x4654, 0x00d0, 0x425e, 0x40ef, 0x4357, 0x192b, 0xbf94, 0x43ce, 0x37fa, 0x1c40, 0x2cbf, 0x26f3, 0x1fe8, 0xb227, 0xabe3, 0x401e, 0x310b, 0x40ce, 0x4223, 0xbf65, 0xba30, 0x4352, 0x4241, 0x0f84, 0x1941, 0x4098, 0x40f7, 0x409a, 0x4081, 0x400c, 0x41da, 0xb256, 0x45cd, 0x1f42, 0x42f2, 0xbaef, 0x0335, 0xa8e0, 0x429a, 0xba0e, 0x40a3, 0x3d57, 0x439d, 0x406f, 0xbae3, 0xbfc6, 0x2f1b, 0xb2f5, 0xa396, 0x41ff, 0x40e4, 0x4401, 0x43f9, 0x4169, 0x40cb, 0x1f8b, 0x4335, 0xb25a, 0x4407, 0xba60, 0x4286, 0xa2ee, 0x4027, 0xbf3f, 0x1c86, 0x435c, 0x40bc, 0x41cc, 0x1bda, 0x2ad1, 0x1c02, 0xb04d, 0x42cb, 0x4084, 0x1dd2, 0xb2fd, 0xb0ac, 0xb280, 0x1dad, 0xb06c, 0x43a1, 0x4310, 0x40e4, 0x435f, 0xb2be, 0x4201, 0xbf7b, 0x1e70, 0x0de8, 0x02bf, 0x407d, 0x45d2, 0x1d92, 0x43c8, 0xbfa4, 0x401d, 0x431e, 0x4030, 0x40a1, 0x1fb9, 0x2bdc, 0xbf44, 0x423c, 0x41f8, 0x0525, 0xbf03, 0xbae5, 0x4316, 0x2fa1, 0xb042, 0x438d, 0x3f53, 0x424a, 0xa7ee, 0x4470, 0x0dc7, 0x4408, 0x18e7, 0xb2f9, 0xb01f, 0xa1af, 0xbf28, 0xbfc0, 0xb26b, 0xa1cc, 0xbf6c, 0x0855, 0x3e49, 0x45e1, 0x41a7, 0xba1b, 0x2d90, 0x4216, 0xb215, 0xb224, 0x4136, 0xb0fb, 0x4676, 0x1127, 0x4151, 0xba11, 0xb287, 0xb2e4, 0x4074, 0x4313, 0x060e, 0x1dc1, 0xb213, 0x4000, 0x42ca, 0x4085, 0x264b, 0xbf84, 0xa3c4, 0xb045, 0x0f04, 0x425a, 0xba22, 0x414a, 0x4155, 0x40ae, 0x12ca, 0x3ed5, 0xb0e1, 0x4080, 0xba16, 0xb04b, 0xba70, 0xbfa0, 0x40d5, 0x402b, 0xbaf1, 0x46b8, 0x1f45, 0xbf60, 0x423d, 0xb2ee, 0x2b14, 0x1e82, 0xbfc9, 0x1e6e, 0x415b, 0xba48, 0x2cf4, 0x43ee, 0x4322, 0xba57, 0xba68, 0x434d, 0xba0d, 0x31f2, 0xbf86, 0xa72b, 0x43d1, 0xb22c, 0xb29a, 0x3a3a, 0x433b, 0x41ad, 0x401a, 0x1df5, 0x0084, 0xa1db, 0xbfe0, 0x4091, 0xb294, 0x43f7, 0xbfde, 0x1d6a, 0x40c1, 0x4052, 0x14ba, 0x4315, 0x1b64, 0x4370, 0x1ef0, 0x0bf2, 0xb09b, 0xbf2e, 0x4260, 0xba0d, 0x0a68, 0xbfd0, 0x4197, 0x1e0a, 0xb204, 0x4282, 0x1afb, 0x4369, 0x438d, 0x41b4, 0x40e6, 0xba10, 0xb2e6, 0x436f, 0x40f8, 0x4207, 0x1986, 0x4342, 0xa33e, 0xb2e6, 0x1fe0, 0x402c, 0xbf48, 0xb03e, 0x40df, 0x0251, 0x1e47, 0x42dd, 0xb2d3, 0x1c88, 0xbf42, 0x36f1, 0xbaf1, 0x15ed, 0x433c, 0xbac4, 0xb0aa, 0x4315, 0xb242, 0x1fcd, 0x40b2, 0x420b, 0xb0e1, 0xba7c, 0xa872, 0x2966, 0xba76, 0x4635, 0x438b, 0x40b4, 0xbf80, 0xba5a, 0xbf80, 0x4350, 0xbfcf, 0x3a60, 0x45f4, 0x21f6, 0x2fc8, 0x425f, 0x2511, 0x42cf, 0x1945, 0x2264, 0x40ab, 0xbf8e, 0xb27e, 0xba02, 0x415f, 0xbfd7, 0x1026, 0x40a9, 0x1a50, 0xaca5, 0x4569, 0x1a72, 0x1ca3, 0x407a, 0xbac3, 0x402a, 0x1d13, 0x1ba5, 0x43bb, 0xb2fa, 0x3dc5, 0xb25f, 0xb2cd, 0x1eda, 0xba67, 0x39d3, 0x16ad, 0x1c10, 0x0b53, 0xb225, 0xbf55, 0xb20a, 0x29be, 0xb2cc, 0x43f5, 0x0c83, 0xb21f, 0x439e, 0x45d1, 0xb2b1, 0x0286, 0x441f, 0x0eb2, 0xbae9, 0xba76, 0xb2c4, 0x18f1, 0x40f6, 0xb2c9, 0x052d, 0xbaf3, 0x427f, 0x0215, 0x43ba, 0x4561, 0x14e4, 0xba1e, 0x41b5, 0xaf51, 0x42a3, 0xbf52, 0x4037, 0x410b, 0xba44, 0xbf70, 0x2dee, 0x005e, 0x4181, 0x1d78, 0x0559, 0xbf48, 0xb0ef, 0x40d1, 0x1bc3, 0x4012, 0x4613, 0x0053, 0x4351, 0xb2bd, 0x4381, 0x1a6a, 0x45c6, 0xb200, 0x4443, 0x08ef, 0xbfaf, 0x425e, 0x42e9, 0x437d, 0x10d0, 0xb25b, 0x441c, 0xbad8, 0x4263, 0x2561, 0xb02c, 0xbaf6, 0x428d, 0xb2d5, 0x406d, 0x4015, 0xb0dd, 0x45ac, 0x43d0, 0x365f, 0xb0df, 0xb2c3, 0x1829, 0xb0b3, 0x42e6, 0x02a5, 0x46d2, 0xbf0c, 0x4132, 0x409e, 0x30b6, 0xb25a, 0x42ef, 0x42f1, 0x0405, 0x41b2, 0x41e6, 0xb254, 0x4107, 0x40c6, 0x41a8, 0x0bec, 0x4134, 0xa686, 0xa857, 0xbf04, 0xab3f, 0xbfb0, 0xbf16, 0x4240, 0x42f4, 0xb2fb, 0xb2db, 0xb0f2, 0x197c, 0x0476, 0x406d, 0xb265, 0x40a1, 0x4389, 0x433e, 0xba5f, 0x41e8, 0x0e2f, 0x42f7, 0x4088, 0x3609, 0x24cb, 0x06bb, 0x428c, 0x1544, 0xbf19, 0xba5b, 0xba74, 0x4317, 0x42cc, 0xb261, 0xab8d, 0xa8bf, 0x003f, 0xa63e, 0xba06, 0x4061, 0x1a1d, 0x1baa, 0xbfb5, 0x42e0, 0x4273, 0xba55, 0xa83f, 0x46e0, 0x4324, 0x4556, 0x40e0, 0x421d, 0x2fcd, 0x42b4, 0x3700, 0xbae7, 0x19a2, 0xba1c, 0xba30, 0xb269, 0x1717, 0x413f, 0x1d62, 0x412e, 0x1196, 0x1c42, 0xbf66, 0x4017, 0x4238, 0x4351, 0x405a, 0x28e5, 0x29e7, 0x4555, 0x4052, 0x4356, 0x42bb, 0x079e, 0x42cc, 0xb245, 0xba69, 0x41c6, 0x4158, 0x3c55, 0x1ea8, 0xb25d, 0xbfdb, 0xbae1, 0x2de6, 0x19fe, 0x1b24, 0x4076, 0x46f1, 0xb020, 0xbadf, 0x4373, 0x4332, 0xacca, 0xb072, 0x440d, 0x445c, 0x192d, 0x317a, 0xbf48, 0x2038, 0x08bd, 0xaf9f, 0x0031, 0x4336, 0x15e1, 0xbfb5, 0x4387, 0xbacb, 0x4379, 0xb215, 0xb254, 0xbf7c, 0x19bc, 0x04e4, 0x4574, 0x432f, 0xb279, 0xbf6b, 0xbfd0, 0x2ec6, 0x41a4, 0x2665, 0xb0d5, 0x40e9, 0x435a, 0x4064, 0x1f9b, 0xb2ca, 0x0bee, 0x3d64, 0x3530, 0xbada, 0xa670, 0x42d5, 0x4200, 0x42f5, 0x42b8, 0xbad3, 0xba31, 0xbf71, 0x1cb2, 0xb205, 0x41eb, 0xba50, 0x4126, 0xbfad, 0xb0d7, 0x0788, 0xba09, 0x4246, 0x464a, 0x07d1, 0x438e, 0x4336, 0x2594, 0x3309, 0x4373, 0x4324, 0xb097, 0x428b, 0xbf90, 0x40e8, 0xa8ec, 0xbf3a, 0x0a6a, 0x2d9b, 0x04d6, 0x407d, 0xb233, 0x10b7, 0x40e0, 0x42a7, 0x43fd, 0xa709, 0x19a8, 0x40c3, 0x1b39, 0x19ea, 0x4492, 0x4046, 0xbae9, 0xba67, 0xaee3, 0x435c, 0x43ef, 0x409e, 0x4397, 0x3a1d, 0xbfa0, 0x4158, 0x4135, 0x1f07, 0xbf25, 0xb24f, 0x428f, 0xb2c9, 0x411e, 0xbf00, 0xba6c, 0x26ae, 0xb00f, 0x35f8, 0x419c, 0x1ea4, 0x42d4, 0xb207, 0x1611, 0x4399, 0xbf5c, 0x4283, 0x07d5, 0x10a8, 0x4387, 0x42db, 0xb259, 0xbf04, 0x1f26, 0x413c, 0x40b0, 0x4389, 0x1526, 0x212f, 0xbf63, 0xb0d6, 0xbad7, 0x33b4, 0x4322, 0x4317, 0x4188, 0x43eb, 0x40ea, 0xbfe4, 0x0285, 0x22a7, 0x4291, 0xbaf8, 0xb0ef, 0x438a, 0x1dd5, 0x4344, 0x266e, 0x41ca, 0x4155, 0x430a, 0xb2b7, 0x3f6f, 0xba27, 0x4372, 0xba32, 0x291c, 0x129c, 0xbfb2, 0xac6e, 0x4046, 0x4248, 0x4338, 0x12c1, 0xb227, 0x4168, 0x0f8e, 0x4038, 0x3caa, 0x43b0, 0x1a4b, 0xbf33, 0x21dd, 0xbae6, 0x1bab, 0x43a6, 0xbada, 0x1c96, 0x40a7, 0x4065, 0xb264, 0x1b34, 0x103f, 0x10e0, 0x007e, 0x0742, 0x405b, 0xbada, 0x466f, 0x438a, 0x40f5, 0xb287, 0x43a5, 0xb237, 0x4350, 0x44e5, 0x4222, 0x4067, 0x405e, 0xbfc6, 0x411e, 0x4222, 0x289f, 0xba0c, 0x2535, 0xb29e, 0xba3c, 0xb2a9, 0x1d5c, 0x1afb, 0x4033, 0x1ea6, 0xa772, 0x2d80, 0xa777, 0x43e4, 0x40c9, 0x401f, 0x315d, 0xba55, 0x4595, 0xb2a3, 0x409a, 0xbfaf, 0x46db, 0x4328, 0x4373, 0xb23b, 0xb0a6, 0x4093, 0xa89e, 0xb248, 0x43c9, 0x1643, 0xb04f, 0xb21b, 0x4365, 0xb2d3, 0x4660, 0x42b9, 0xb273, 0x0942, 0x4335, 0x1def, 0xab0c, 0xbf0e, 0x43af, 0x317b, 0x407e, 0x435d, 0x361a, 0x454c, 0x4304, 0x3b0b, 0x4046, 0xbf76, 0x4368, 0xb0fc, 0x4277, 0xa54e, 0x15dd, 0x43ef, 0x42ba, 0x436a, 0x3be5, 0x410e, 0x2870, 0xbf7e, 0x1890, 0x18a3, 0x4203, 0x4384, 0x4371, 0x0e8e, 0x42a8, 0x288f, 0x1920, 0x447b, 0xba58, 0x41e2, 0xb296, 0x42a4, 0x4151, 0xae23, 0x4268, 0x42ea, 0xb2dc, 0x42b5, 0x1ac1, 0x43af, 0xba4d, 0xbf3e, 0xb238, 0x4208, 0x2d85, 0xb284, 0x183c, 0x40c6, 0xa6b9, 0x429f, 0x0428, 0xb080, 0x23ff, 0x4191, 0xb286, 0xab3d, 0xbf23, 0xb2ab, 0x4101, 0xba54, 0x42ae, 0x4770, 0xe7fe + ], + StartRegs = [0xe99b8527, 0x3e866f78, 0xbb8f4079, 0xc9ef19b8, 0xaaf5b29d, 0x98cec417, 0x79e91cc3, 0x8e2e7557, 0xc691e551, 0x2095f998, 0xe3609aa0, 0xb521524b, 0xcc39afbb, 0xcf08047d, 0x00000000, 0x100001f0 + ], + FinalRegs = [0x161c0000, 0x0cd2dc16, 0xf32d3fff, 0xcf08105b, 0x000000c2, 0x0000161c, 0x00000000, 0x00000061, 0x000010d2, 0x00000000, 0x00001643, 0xb521524b, 0x000010d2, 0xcf080f67, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0xbf78, 0xb251, 0x1eb2, 0x15c1, 0x1b9e, 0xb26c, 0x46ba, 0x4392, 0x42d2, 0x42bd, 0x40e0, 0x1474, 0xba55, 0x4199, 0xb255, 0xbf64, 0x4214, 0x44fb, 0x437e, 0x426f, 0x4258, 0x4079, 0x409b, 0x4240, 0x42da, 0x02ff, 0x41f7, 0x1e1c, 0xbafd, 0x4108, 0x1976, 0x4304, 0x4363, 0x4376, 0x422f, 0x4448, 0x4164, 0x41f6, 0xaada, 0xbf0d, 0x43b8, 0xb0ab, 0x43c9, 0xb084, 0x0010, 0x419f, 0x4158, 0xb241, 0x4008, 0x44a8, 0x41dc, 0x42f1, 0x4083, 0x2913, 0x43e7, 0x4226, 0x1f85, 0xbf57, 0x40f3, 0xbac0, 0x43e2, 0x17b4, 0x401b, 0xa764, 0x19f8, 0xa5d3, 0xba04, 0x42c5, 0x410c, 0x0045, 0x40df, 0x45c4, 0x4370, 0xb0e6, 0x40f9, 0x1994, 0x42ea, 0xa907, 0xbf67, 0x4016, 0x1d1c, 0x0fd3, 0xb022, 0x1d1e, 0x4688, 0x44a4, 0x4357, 0x18dd, 0x3d71, 0x1ab6, 0x19b6, 0x1f8f, 0xaaf6, 0xb23a, 0x1b6a, 0x4137, 0x40a8, 0xbfe8, 0x4388, 0x422d, 0x434b, 0x0732, 0x4068, 0x42d5, 0x42f3, 0x41ad, 0xb20a, 0x4091, 0x411a, 0xba44, 0xa7d9, 0x1688, 0xb09c, 0x1d2f, 0x1cf1, 0xb2ca, 0x409c, 0x0873, 0x19b1, 0x409d, 0xb2e0, 0x4071, 0x425a, 0x04b0, 0xbf3a, 0x412f, 0x44e1, 0x3786, 0x412e, 0x419b, 0x4012, 0x4547, 0x19fb, 0xb0be, 0x4209, 0x4001, 0x43af, 0x429b, 0x20fd, 0x43d4, 0xbfa0, 0x40ee, 0x1a3d, 0xbfc0, 0x4418, 0xb2f9, 0x0a05, 0x2b88, 0xb23b, 0xbf5c, 0x183d, 0x4122, 0x463b, 0x3ed8, 0xbf70, 0x4381, 0xba5f, 0xba7d, 0x41ec, 0xba39, 0xbf70, 0x4596, 0x1660, 0x1e85, 0x4278, 0x43a4, 0xad91, 0x4046, 0x41fd, 0xba79, 0x408b, 0xbf4e, 0x0e75, 0xb22b, 0x1ee0, 0x4195, 0x1e6c, 0xb040, 0x43e2, 0x3745, 0xba65, 0x40e0, 0xa8ab, 0x4126, 0xbf41, 0xb20d, 0x4235, 0x0483, 0x43c5, 0x36d5, 0xaf62, 0xb0c7, 0x1e22, 0xbfa1, 0xb2e7, 0x17de, 0x3fa1, 0x2a2d, 0xb035, 0x4308, 0xa38f, 0x4115, 0xb001, 0xba31, 0x1d3f, 0x4093, 0xad99, 0x425f, 0x187a, 0x4206, 0xaaec, 0x41c2, 0x1b58, 0x4299, 0x419f, 0xbf59, 0x4252, 0xb275, 0x4157, 0x4314, 0x40c5, 0x4002, 0x4156, 0x4040, 0x1c34, 0xba34, 0x0b6f, 0x19d4, 0xba24, 0x40fd, 0x41cb, 0x4141, 0x3190, 0x19c1, 0xbad9, 0x1fdb, 0xbfab, 0x41ed, 0x43de, 0x4080, 0x3d58, 0x2532, 0x466a, 0xbfc0, 0xb049, 0x412a, 0xa8ca, 0xb2af, 0x420f, 0xbacd, 0x432a, 0xbfde, 0xb0e2, 0x43ea, 0x4100, 0x404d, 0x426e, 0xbf71, 0x124a, 0xb259, 0x407a, 0x43f7, 0x4215, 0x416f, 0x34fa, 0x4367, 0x40b1, 0xb239, 0x419f, 0xba28, 0xae76, 0x1a0e, 0xbf82, 0x4174, 0xb27d, 0xa2f6, 0x422b, 0x401c, 0x439a, 0xba51, 0x2d8f, 0xb063, 0x1d7c, 0x40f6, 0xb0f9, 0xb2aa, 0xbfaf, 0xaaaf, 0x40e9, 0x41a9, 0x16c4, 0xbad8, 0x1dda, 0x17ae, 0x26f9, 0xba47, 0xbad9, 0x41eb, 0x4086, 0x424f, 0x4234, 0xb290, 0x4236, 0xa8ce, 0x40fd, 0x18c3, 0x4291, 0xb2e9, 0x4240, 0xbf88, 0xbad6, 0x02a2, 0x439e, 0x1c1b, 0x1e78, 0xabba, 0x40c4, 0x42e9, 0xa4b2, 0x21f3, 0x1f64, 0x1c05, 0xbf6a, 0xb20b, 0x4034, 0x20f5, 0xbaf9, 0xac9b, 0xbfb0, 0xb02d, 0x43c9, 0x4020, 0x41f1, 0xb26e, 0x1c9d, 0xba7e, 0x4047, 0x41f4, 0x1bce, 0x412c, 0x4378, 0x3857, 0x43da, 0x419f, 0x4296, 0xba50, 0xbafd, 0x1f01, 0xbaf8, 0xa978, 0xbfb2, 0xb291, 0x42df, 0x410c, 0x40d3, 0x469b, 0x4388, 0x41eb, 0xbad7, 0x4367, 0x1aed, 0x411f, 0xba27, 0xb220, 0x417a, 0x1839, 0xb256, 0xb22e, 0xaeb8, 0xad5b, 0x0842, 0x2af8, 0x423d, 0xba02, 0xb256, 0xb093, 0xbfb5, 0x431d, 0xb01b, 0xb2cd, 0xba7c, 0x19f9, 0xbfa9, 0x1c2b, 0x40b2, 0xb024, 0xaf9c, 0xad91, 0x0191, 0x4152, 0x40b1, 0xbacb, 0xa5d4, 0x42e8, 0xb0b6, 0x080a, 0x41da, 0x4195, 0x40f4, 0x4329, 0xaa3c, 0x4602, 0x40f8, 0x1d9f, 0xbf86, 0x1d1d, 0xb041, 0x4294, 0xb215, 0x41a0, 0x4336, 0xb07c, 0xba73, 0x1537, 0xa583, 0x4332, 0xbfa3, 0xb03a, 0x2082, 0x405f, 0xb0e5, 0x4083, 0x3b48, 0x1fdd, 0x4399, 0x38f1, 0x41d9, 0xb09f, 0x1377, 0xb076, 0x195c, 0x4341, 0x1faa, 0x1a14, 0x1c98, 0x4177, 0xbf64, 0xbff0, 0x4341, 0x199c, 0xba2d, 0x4001, 0x4294, 0x271a, 0xbf49, 0xb2eb, 0x4625, 0xb2c7, 0x4282, 0x42c2, 0xbf90, 0x42cf, 0x4057, 0xbaef, 0x414a, 0xbf2b, 0x4196, 0x1071, 0x02c2, 0xa540, 0x424a, 0x032e, 0xb21b, 0x4331, 0x4049, 0x4673, 0xbfd2, 0x421f, 0x42ee, 0x417e, 0xa3ed, 0xb21e, 0xb0ba, 0xbac9, 0x4071, 0x3b78, 0x436b, 0xa792, 0xb0ea, 0xb271, 0xa5df, 0x1a45, 0x2020, 0x43ff, 0xb282, 0xb24f, 0xbfb6, 0x022c, 0xbae8, 0x3ac4, 0xb016, 0xba5a, 0x41e5, 0x407b, 0x0f5d, 0xb245, 0x1f55, 0x41ae, 0x43ba, 0x0399, 0x42df, 0x0d93, 0x4355, 0xba29, 0x4670, 0x4558, 0x047d, 0xbf86, 0x29a9, 0x19d7, 0x1f16, 0xb0fe, 0xbaf9, 0x21a5, 0x46fc, 0x2750, 0x1398, 0x2284, 0x0309, 0x461b, 0xb2cd, 0x29de, 0xbf0a, 0xba3f, 0x119d, 0xb24a, 0xa8e5, 0x4069, 0x148f, 0xb04d, 0xb264, 0xa8c6, 0x1dd3, 0x46b4, 0x18c7, 0x43bc, 0x40e3, 0xba4e, 0x405b, 0x4101, 0x1d87, 0x3d58, 0x43e6, 0x2199, 0xb21f, 0x1a00, 0x4301, 0x2a14, 0x02f4, 0xbfb7, 0x4441, 0xa4bf, 0x40bf, 0xb2d4, 0x4117, 0x11d9, 0x1f4a, 0x1923, 0x02f0, 0x4350, 0x1f6a, 0x4176, 0xb2f9, 0xb233, 0x31f5, 0x4012, 0xbfdd, 0x4297, 0x4575, 0x40ae, 0xba01, 0x42b1, 0xbacd, 0x40fa, 0x3d82, 0x4338, 0xba51, 0x411c, 0x4153, 0x2556, 0x4398, 0x1d63, 0x4305, 0x28c7, 0xbf0a, 0x4309, 0xb051, 0x42e7, 0x37b1, 0xb28c, 0x41f8, 0xb263, 0xbf60, 0x1f06, 0x421f, 0x4294, 0x401c, 0x43d3, 0xb2b3, 0x1a06, 0x428e, 0x42fe, 0xb246, 0xb27b, 0x43e7, 0x4135, 0x2f59, 0xbf6e, 0xac94, 0xbaf0, 0x12fd, 0x41da, 0x4337, 0xb294, 0xb06f, 0x4156, 0x42d8, 0x2309, 0x1de4, 0xb021, 0x0d01, 0x42fd, 0x1957, 0x44e1, 0x0a23, 0xb21d, 0xba2e, 0x2c2f, 0xa0c8, 0x40f8, 0x41f6, 0xbaed, 0x4224, 0xada8, 0x42ff, 0x4227, 0xbfc1, 0x2336, 0xbad7, 0xba01, 0xba5b, 0x1eec, 0xba44, 0x43d7, 0xbae3, 0xba1f, 0x417f, 0x3fbb, 0xb2aa, 0xb202, 0x07f6, 0xb249, 0x414f, 0x4144, 0xb25e, 0xba30, 0x413d, 0xb2c9, 0xb0a8, 0x029f, 0x19a0, 0xbf58, 0x4140, 0xb260, 0x0f52, 0xb23b, 0x42c4, 0x43db, 0xad0e, 0x43f0, 0x028d, 0xbf24, 0xbac3, 0x1c7e, 0x1094, 0xbff0, 0x41b1, 0x30a0, 0x01a0, 0x094c, 0x149b, 0xbfdf, 0x32f6, 0x41b3, 0x43d5, 0x35b7, 0x468c, 0x2936, 0x1877, 0x2db5, 0x436e, 0x18bc, 0x1c4b, 0xbf00, 0xb276, 0xbf00, 0xb262, 0xba52, 0x240e, 0x4281, 0x410b, 0xbfa2, 0x4173, 0x2aba, 0x43de, 0x2801, 0x432c, 0x40b4, 0x4119, 0xb2da, 0xaa5d, 0x43dd, 0x1c35, 0x4357, 0x4237, 0x191a, 0xba06, 0x3b92, 0x4018, 0xb299, 0x46c2, 0x1f3c, 0xba7a, 0x438e, 0x44b9, 0xba71, 0x401f, 0xbfd7, 0xbaf6, 0x41b4, 0x0e92, 0x4151, 0xb225, 0xb08b, 0x4035, 0x428c, 0x42b2, 0x41cb, 0xb2a3, 0xbae6, 0x41cd, 0xb2b9, 0xba59, 0x4022, 0xba11, 0x4246, 0x4625, 0x1b37, 0xad1c, 0x108d, 0x2de7, 0x1a8b, 0xbf9d, 0x1bc9, 0x43c4, 0x432a, 0x1a06, 0x4196, 0x3937, 0xb08f, 0xbad4, 0x18f6, 0x3f38, 0xbfc6, 0xb2d1, 0xb03a, 0x4246, 0x3ea1, 0x42bb, 0xb259, 0x43b0, 0xb2bb, 0xba47, 0xb28d, 0x1907, 0xbf6a, 0xb089, 0x4372, 0x4469, 0x182d, 0xb03d, 0xbf90, 0x4399, 0x4237, 0xb223, 0x36ba, 0x4173, 0x4233, 0x4616, 0x21de, 0x25e2, 0x4287, 0xb20a, 0x4612, 0x409c, 0xb24c, 0x40d6, 0x400f, 0xbad9, 0xbf01, 0x4324, 0x4374, 0xb0d1, 0xb21a, 0x1e51, 0xb2e8, 0x41ed, 0xbf60, 0x4664, 0x4043, 0x463a, 0xb21d, 0x430d, 0xbf19, 0x4203, 0x4339, 0x4549, 0xa026, 0x1ca7, 0xbaf4, 0xaaac, 0x4360, 0x2a0a, 0x125d, 0xb2de, 0x313b, 0x4025, 0xb221, 0xba16, 0x42e4, 0x4087, 0xba4e, 0x1f06, 0x31b6, 0x1af5, 0xbf3b, 0xb217, 0xb227, 0x3022, 0xba71, 0xbf11, 0x40db, 0x40a6, 0x4219, 0x4274, 0x4349, 0x4168, 0xbfb1, 0x4219, 0xb27f, 0x415d, 0x0685, 0x42f3, 0x4321, 0x400e, 0x4041, 0x3c1d, 0x41c8, 0xbacf, 0xa885, 0x425b, 0xa833, 0xb0ed, 0x4111, 0x408a, 0xbf60, 0x4048, 0xb2e6, 0x314a, 0xb21c, 0x2119, 0x4349, 0x1d8f, 0x43e4, 0x1ce5, 0xb2db, 0x4281, 0xbf3c, 0x1907, 0x431e, 0x41f2, 0x4309, 0x413f, 0x3c15, 0x1e57, 0x1875, 0x2a86, 0x1cde, 0x444d, 0xb26f, 0x40ad, 0x3408, 0x05f4, 0x42b4, 0x418f, 0x1bdb, 0x437c, 0xb29e, 0xa7c4, 0x44b8, 0x4254, 0x4198, 0x4568, 0xbf29, 0xba58, 0x42e5, 0x413d, 0xbae2, 0x42d2, 0x44a0, 0xb2b6, 0x431a, 0x3165, 0x1d28, 0x0b29, 0xb234, 0x409b, 0xb296, 0xbf5d, 0x13ee, 0x4310, 0x4015, 0x42b6, 0x1919, 0x21c3, 0xb249, 0x43dc, 0x459d, 0xbfc0, 0x4073, 0x4251, 0x428e, 0x42a6, 0xb212, 0xb20d, 0xbfc0, 0x40b8, 0xba7e, 0x42d8, 0xb234, 0x05c8, 0x4120, 0x1a7d, 0xb05f, 0x4608, 0x411a, 0xbf47, 0xba36, 0x19e1, 0x4019, 0x0eb2, 0x4090, 0x43f4, 0x42a7, 0xba3a, 0x0080, 0x42b9, 0xba72, 0xbf90, 0xb0ff, 0xb295, 0xa5d3, 0x4215, 0x36ac, 0x40be, 0x1a4a, 0xbad4, 0x09b5, 0xba41, 0x465c, 0xba6f, 0xb25f, 0xbfa2, 0x14b7, 0x09c9, 0x1ee3, 0x4397, 0x280b, 0xbf53, 0xb230, 0x42c9, 0x1896, 0x4454, 0xbafa, 0x0535, 0x42f0, 0x395d, 0x1d22, 0x4191, 0x4481, 0x1b2e, 0xba36, 0x4103, 0x1a29, 0x2b7c, 0x326a, 0x407a, 0x42a4, 0x0308, 0x4673, 0xbfd0, 0xb24d, 0x184f, 0x439d, 0xba62, 0x42f7, 0xbf93, 0x24a2, 0xb2d0, 0xb0f4, 0x13d7, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x7f786d81, 0xed0589af, 0xd3e5419b, 0x0129696d, 0xe25706db, 0x2c5ca927, 0x6d81e353, 0x64845d90, 0x7114f20e, 0x7890cd21, 0xe05b5922, 0xe345d064, 0xda1b31e1, 0xa9b62e07, 0x00000000, 0x000001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x00000000, 0xb6a9df2b, 0x00000000, 0x000000a2, 0x00000000, 0x21d44956, 0xffff6d53, 0x347f7fc7, 0x188dd287, 0xa9b62bdf, 0x00000000, 0xffffffff, 0xa9b62c9f, 0x00000000, 0x000001d0 }, + Instructions = [0xbf78, 0xb251, 0x1eb2, 0x15c1, 0x1b9e, 0xb26c, 0x46ba, 0x4392, 0x42d2, 0x42bd, 0x40e0, 0x1474, 0xba55, 0x4199, 0xb255, 0xbf64, 0x4214, 0x44fb, 0x437e, 0x426f, 0x4258, 0x4079, 0x409b, 0x4240, 0x42da, 0x02ff, 0x41f7, 0x1e1c, 0xbafd, 0x4108, 0x1976, 0x4304, 0x4363, 0x4376, 0x422f, 0x4448, 0x4164, 0x41f6, 0xaada, 0xbf0d, 0x43b8, 0xb0ab, 0x43c9, 0xb084, 0x0010, 0x419f, 0x4158, 0xb241, 0x4008, 0x44a8, 0x41dc, 0x42f1, 0x4083, 0x2913, 0x43e7, 0x4226, 0x1f85, 0xbf57, 0x40f3, 0xbac0, 0x43e2, 0x17b4, 0x401b, 0xa764, 0x19f8, 0xa5d3, 0xba04, 0x42c5, 0x410c, 0x0045, 0x40df, 0x45c4, 0x4370, 0xb0e6, 0x40f9, 0x1994, 0x42ea, 0xa907, 0xbf67, 0x4016, 0x1d1c, 0x0fd3, 0xb022, 0x1d1e, 0x4688, 0x44a4, 0x4357, 0x18dd, 0x3d71, 0x1ab6, 0x19b6, 0x1f8f, 0xaaf6, 0xb23a, 0x1b6a, 0x4137, 0x40a8, 0xbfe8, 0x4388, 0x422d, 0x434b, 0x0732, 0x4068, 0x42d5, 0x42f3, 0x41ad, 0xb20a, 0x4091, 0x411a, 0xba44, 0xa7d9, 0x1688, 0xb09c, 0x1d2f, 0x1cf1, 0xb2ca, 0x409c, 0x0873, 0x19b1, 0x409d, 0xb2e0, 0x4071, 0x425a, 0x04b0, 0xbf3a, 0x412f, 0x44e1, 0x3786, 0x412e, 0x419b, 0x4012, 0x4547, 0x19fb, 0xb0be, 0x4209, 0x4001, 0x43af, 0x429b, 0x20fd, 0x43d4, 0xbfa0, 0x40ee, 0x1a3d, 0xbfc0, 0x4418, 0xb2f9, 0x0a05, 0x2b88, 0xb23b, 0xbf5c, 0x183d, 0x4122, 0x463b, 0x3ed8, 0xbf70, 0x4381, 0xba5f, 0xba7d, 0x41ec, 0xba39, 0xbf70, 0x4596, 0x1660, 0x1e85, 0x4278, 0x43a4, 0xad91, 0x4046, 0x41fd, 0xba79, 0x408b, 0xbf4e, 0x0e75, 0xb22b, 0x1ee0, 0x4195, 0x1e6c, 0xb040, 0x43e2, 0x3745, 0xba65, 0x40e0, 0xa8ab, 0x4126, 0xbf41, 0xb20d, 0x4235, 0x0483, 0x43c5, 0x36d5, 0xaf62, 0xb0c7, 0x1e22, 0xbfa1, 0xb2e7, 0x17de, 0x3fa1, 0x2a2d, 0xb035, 0x4308, 0xa38f, 0x4115, 0xb001, 0xba31, 0x1d3f, 0x4093, 0xad99, 0x425f, 0x187a, 0x4206, 0xaaec, 0x41c2, 0x1b58, 0x4299, 0x419f, 0xbf59, 0x4252, 0xb275, 0x4157, 0x4314, 0x40c5, 0x4002, 0x4156, 0x4040, 0x1c34, 0xba34, 0x0b6f, 0x19d4, 0xba24, 0x40fd, 0x41cb, 0x4141, 0x3190, 0x19c1, 0xbad9, 0x1fdb, 0xbfab, 0x41ed, 0x43de, 0x4080, 0x3d58, 0x2532, 0x466a, 0xbfc0, 0xb049, 0x412a, 0xa8ca, 0xb2af, 0x420f, 0xbacd, 0x432a, 0xbfde, 0xb0e2, 0x43ea, 0x4100, 0x404d, 0x426e, 0xbf71, 0x124a, 0xb259, 0x407a, 0x43f7, 0x4215, 0x416f, 0x34fa, 0x4367, 0x40b1, 0xb239, 0x419f, 0xba28, 0xae76, 0x1a0e, 0xbf82, 0x4174, 0xb27d, 0xa2f6, 0x422b, 0x401c, 0x439a, 0xba51, 0x2d8f, 0xb063, 0x1d7c, 0x40f6, 0xb0f9, 0xb2aa, 0xbfaf, 0xaaaf, 0x40e9, 0x41a9, 0x16c4, 0xbad8, 0x1dda, 0x17ae, 0x26f9, 0xba47, 0xbad9, 0x41eb, 0x4086, 0x424f, 0x4234, 0xb290, 0x4236, 0xa8ce, 0x40fd, 0x18c3, 0x4291, 0xb2e9, 0x4240, 0xbf88, 0xbad6, 0x02a2, 0x439e, 0x1c1b, 0x1e78, 0xabba, 0x40c4, 0x42e9, 0xa4b2, 0x21f3, 0x1f64, 0x1c05, 0xbf6a, 0xb20b, 0x4034, 0x20f5, 0xbaf9, 0xac9b, 0xbfb0, 0xb02d, 0x43c9, 0x4020, 0x41f1, 0xb26e, 0x1c9d, 0xba7e, 0x4047, 0x41f4, 0x1bce, 0x412c, 0x4378, 0x3857, 0x43da, 0x419f, 0x4296, 0xba50, 0xbafd, 0x1f01, 0xbaf8, 0xa978, 0xbfb2, 0xb291, 0x42df, 0x410c, 0x40d3, 0x469b, 0x4388, 0x41eb, 0xbad7, 0x4367, 0x1aed, 0x411f, 0xba27, 0xb220, 0x417a, 0x1839, 0xb256, 0xb22e, 0xaeb8, 0xad5b, 0x0842, 0x2af8, 0x423d, 0xba02, 0xb256, 0xb093, 0xbfb5, 0x431d, 0xb01b, 0xb2cd, 0xba7c, 0x19f9, 0xbfa9, 0x1c2b, 0x40b2, 0xb024, 0xaf9c, 0xad91, 0x0191, 0x4152, 0x40b1, 0xbacb, 0xa5d4, 0x42e8, 0xb0b6, 0x080a, 0x41da, 0x4195, 0x40f4, 0x4329, 0xaa3c, 0x4602, 0x40f8, 0x1d9f, 0xbf86, 0x1d1d, 0xb041, 0x4294, 0xb215, 0x41a0, 0x4336, 0xb07c, 0xba73, 0x1537, 0xa583, 0x4332, 0xbfa3, 0xb03a, 0x2082, 0x405f, 0xb0e5, 0x4083, 0x3b48, 0x1fdd, 0x4399, 0x38f1, 0x41d9, 0xb09f, 0x1377, 0xb076, 0x195c, 0x4341, 0x1faa, 0x1a14, 0x1c98, 0x4177, 0xbf64, 0xbff0, 0x4341, 0x199c, 0xba2d, 0x4001, 0x4294, 0x271a, 0xbf49, 0xb2eb, 0x4625, 0xb2c7, 0x4282, 0x42c2, 0xbf90, 0x42cf, 0x4057, 0xbaef, 0x414a, 0xbf2b, 0x4196, 0x1071, 0x02c2, 0xa540, 0x424a, 0x032e, 0xb21b, 0x4331, 0x4049, 0x4673, 0xbfd2, 0x421f, 0x42ee, 0x417e, 0xa3ed, 0xb21e, 0xb0ba, 0xbac9, 0x4071, 0x3b78, 0x436b, 0xa792, 0xb0ea, 0xb271, 0xa5df, 0x1a45, 0x2020, 0x43ff, 0xb282, 0xb24f, 0xbfb6, 0x022c, 0xbae8, 0x3ac4, 0xb016, 0xba5a, 0x41e5, 0x407b, 0x0f5d, 0xb245, 0x1f55, 0x41ae, 0x43ba, 0x0399, 0x42df, 0x0d93, 0x4355, 0xba29, 0x4670, 0x4558, 0x047d, 0xbf86, 0x29a9, 0x19d7, 0x1f16, 0xb0fe, 0xbaf9, 0x21a5, 0x46fc, 0x2750, 0x1398, 0x2284, 0x0309, 0x461b, 0xb2cd, 0x29de, 0xbf0a, 0xba3f, 0x119d, 0xb24a, 0xa8e5, 0x4069, 0x148f, 0xb04d, 0xb264, 0xa8c6, 0x1dd3, 0x46b4, 0x18c7, 0x43bc, 0x40e3, 0xba4e, 0x405b, 0x4101, 0x1d87, 0x3d58, 0x43e6, 0x2199, 0xb21f, 0x1a00, 0x4301, 0x2a14, 0x02f4, 0xbfb7, 0x4441, 0xa4bf, 0x40bf, 0xb2d4, 0x4117, 0x11d9, 0x1f4a, 0x1923, 0x02f0, 0x4350, 0x1f6a, 0x4176, 0xb2f9, 0xb233, 0x31f5, 0x4012, 0xbfdd, 0x4297, 0x4575, 0x40ae, 0xba01, 0x42b1, 0xbacd, 0x40fa, 0x3d82, 0x4338, 0xba51, 0x411c, 0x4153, 0x2556, 0x4398, 0x1d63, 0x4305, 0x28c7, 0xbf0a, 0x4309, 0xb051, 0x42e7, 0x37b1, 0xb28c, 0x41f8, 0xb263, 0xbf60, 0x1f06, 0x421f, 0x4294, 0x401c, 0x43d3, 0xb2b3, 0x1a06, 0x428e, 0x42fe, 0xb246, 0xb27b, 0x43e7, 0x4135, 0x2f59, 0xbf6e, 0xac94, 0xbaf0, 0x12fd, 0x41da, 0x4337, 0xb294, 0xb06f, 0x4156, 0x42d8, 0x2309, 0x1de4, 0xb021, 0x0d01, 0x42fd, 0x1957, 0x44e1, 0x0a23, 0xb21d, 0xba2e, 0x2c2f, 0xa0c8, 0x40f8, 0x41f6, 0xbaed, 0x4224, 0xada8, 0x42ff, 0x4227, 0xbfc1, 0x2336, 0xbad7, 0xba01, 0xba5b, 0x1eec, 0xba44, 0x43d7, 0xbae3, 0xba1f, 0x417f, 0x3fbb, 0xb2aa, 0xb202, 0x07f6, 0xb249, 0x414f, 0x4144, 0xb25e, 0xba30, 0x413d, 0xb2c9, 0xb0a8, 0x029f, 0x19a0, 0xbf58, 0x4140, 0xb260, 0x0f52, 0xb23b, 0x42c4, 0x43db, 0xad0e, 0x43f0, 0x028d, 0xbf24, 0xbac3, 0x1c7e, 0x1094, 0xbff0, 0x41b1, 0x30a0, 0x01a0, 0x094c, 0x149b, 0xbfdf, 0x32f6, 0x41b3, 0x43d5, 0x35b7, 0x468c, 0x2936, 0x1877, 0x2db5, 0x436e, 0x18bc, 0x1c4b, 0xbf00, 0xb276, 0xbf00, 0xb262, 0xba52, 0x240e, 0x4281, 0x410b, 0xbfa2, 0x4173, 0x2aba, 0x43de, 0x2801, 0x432c, 0x40b4, 0x4119, 0xb2da, 0xaa5d, 0x43dd, 0x1c35, 0x4357, 0x4237, 0x191a, 0xba06, 0x3b92, 0x4018, 0xb299, 0x46c2, 0x1f3c, 0xba7a, 0x438e, 0x44b9, 0xba71, 0x401f, 0xbfd7, 0xbaf6, 0x41b4, 0x0e92, 0x4151, 0xb225, 0xb08b, 0x4035, 0x428c, 0x42b2, 0x41cb, 0xb2a3, 0xbae6, 0x41cd, 0xb2b9, 0xba59, 0x4022, 0xba11, 0x4246, 0x4625, 0x1b37, 0xad1c, 0x108d, 0x2de7, 0x1a8b, 0xbf9d, 0x1bc9, 0x43c4, 0x432a, 0x1a06, 0x4196, 0x3937, 0xb08f, 0xbad4, 0x18f6, 0x3f38, 0xbfc6, 0xb2d1, 0xb03a, 0x4246, 0x3ea1, 0x42bb, 0xb259, 0x43b0, 0xb2bb, 0xba47, 0xb28d, 0x1907, 0xbf6a, 0xb089, 0x4372, 0x4469, 0x182d, 0xb03d, 0xbf90, 0x4399, 0x4237, 0xb223, 0x36ba, 0x4173, 0x4233, 0x4616, 0x21de, 0x25e2, 0x4287, 0xb20a, 0x4612, 0x409c, 0xb24c, 0x40d6, 0x400f, 0xbad9, 0xbf01, 0x4324, 0x4374, 0xb0d1, 0xb21a, 0x1e51, 0xb2e8, 0x41ed, 0xbf60, 0x4664, 0x4043, 0x463a, 0xb21d, 0x430d, 0xbf19, 0x4203, 0x4339, 0x4549, 0xa026, 0x1ca7, 0xbaf4, 0xaaac, 0x4360, 0x2a0a, 0x125d, 0xb2de, 0x313b, 0x4025, 0xb221, 0xba16, 0x42e4, 0x4087, 0xba4e, 0x1f06, 0x31b6, 0x1af5, 0xbf3b, 0xb217, 0xb227, 0x3022, 0xba71, 0xbf11, 0x40db, 0x40a6, 0x4219, 0x4274, 0x4349, 0x4168, 0xbfb1, 0x4219, 0xb27f, 0x415d, 0x0685, 0x42f3, 0x4321, 0x400e, 0x4041, 0x3c1d, 0x41c8, 0xbacf, 0xa885, 0x425b, 0xa833, 0xb0ed, 0x4111, 0x408a, 0xbf60, 0x4048, 0xb2e6, 0x314a, 0xb21c, 0x2119, 0x4349, 0x1d8f, 0x43e4, 0x1ce5, 0xb2db, 0x4281, 0xbf3c, 0x1907, 0x431e, 0x41f2, 0x4309, 0x413f, 0x3c15, 0x1e57, 0x1875, 0x2a86, 0x1cde, 0x444d, 0xb26f, 0x40ad, 0x3408, 0x05f4, 0x42b4, 0x418f, 0x1bdb, 0x437c, 0xb29e, 0xa7c4, 0x44b8, 0x4254, 0x4198, 0x4568, 0xbf29, 0xba58, 0x42e5, 0x413d, 0xbae2, 0x42d2, 0x44a0, 0xb2b6, 0x431a, 0x3165, 0x1d28, 0x0b29, 0xb234, 0x409b, 0xb296, 0xbf5d, 0x13ee, 0x4310, 0x4015, 0x42b6, 0x1919, 0x21c3, 0xb249, 0x43dc, 0x459d, 0xbfc0, 0x4073, 0x4251, 0x428e, 0x42a6, 0xb212, 0xb20d, 0xbfc0, 0x40b8, 0xba7e, 0x42d8, 0xb234, 0x05c8, 0x4120, 0x1a7d, 0xb05f, 0x4608, 0x411a, 0xbf47, 0xba36, 0x19e1, 0x4019, 0x0eb2, 0x4090, 0x43f4, 0x42a7, 0xba3a, 0x0080, 0x42b9, 0xba72, 0xbf90, 0xb0ff, 0xb295, 0xa5d3, 0x4215, 0x36ac, 0x40be, 0x1a4a, 0xbad4, 0x09b5, 0xba41, 0x465c, 0xba6f, 0xb25f, 0xbfa2, 0x14b7, 0x09c9, 0x1ee3, 0x4397, 0x280b, 0xbf53, 0xb230, 0x42c9, 0x1896, 0x4454, 0xbafa, 0x0535, 0x42f0, 0x395d, 0x1d22, 0x4191, 0x4481, 0x1b2e, 0xba36, 0x4103, 0x1a29, 0x2b7c, 0x326a, 0x407a, 0x42a4, 0x0308, 0x4673, 0xbfd0, 0xb24d, 0x184f, 0x439d, 0xba62, 0x42f7, 0xbf93, 0x24a2, 0xb2d0, 0xb0f4, 0x13d7, 0x4770, 0xe7fe + ], + StartRegs = [0x7f786d81, 0xed0589af, 0xd3e5419b, 0x0129696d, 0xe25706db, 0x2c5ca927, 0x6d81e353, 0x64845d90, 0x7114f20e, 0x7890cd21, 0xe05b5922, 0xe345d064, 0xda1b31e1, 0xa9b62e07, 0x00000000, 0x000001f0 + ], + FinalRegs = [0x00000000, 0x00000000, 0xb6a9df2b, 0x00000000, 0x000000a2, 0x00000000, 0x21d44956, 0xffff6d53, 0x347f7fc7, 0x188dd287, 0xa9b62bdf, 0x00000000, 0xffffffff, 0xa9b62c9f, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x1e54, 0x40d8, 0x2f66, 0x276c, 0x416f, 0x1987, 0xb06a, 0x45ec, 0xba67, 0x408a, 0xba2f, 0xacd5, 0x29cf, 0x1872, 0x111e, 0x1b04, 0xbafd, 0x41a5, 0xbf97, 0x43df, 0xb06f, 0x1c82, 0x268b, 0xb2ba, 0xb08a, 0x407f, 0xbaea, 0x1d52, 0x06cb, 0x41e7, 0x4475, 0x43b8, 0xba6b, 0x1fb1, 0xbf3e, 0x4241, 0x3d38, 0x4120, 0x2a6b, 0xb217, 0xbfb8, 0x1f4e, 0xb218, 0xb2cc, 0x1ad6, 0x4128, 0x169b, 0xaa87, 0xaf67, 0xb2aa, 0xbfc0, 0xb0e8, 0x33a9, 0x43fb, 0x195b, 0x4091, 0x3613, 0x00c8, 0xbf09, 0xbff0, 0x0ab2, 0x4211, 0xbadc, 0x4100, 0xba4d, 0x0f34, 0xba3f, 0xb250, 0x1425, 0x1ad6, 0x1f20, 0xb0e6, 0xae48, 0x41f4, 0x4117, 0xb0d0, 0xba25, 0xb2f9, 0xba7d, 0x4063, 0x1e53, 0x40ef, 0x401c, 0x1b23, 0x059d, 0x4021, 0x4126, 0xbf0c, 0x3318, 0x4087, 0x4135, 0x430e, 0xbf69, 0x18c0, 0xb285, 0x4164, 0xbf90, 0x40e9, 0x43bf, 0xba12, 0x2a34, 0x4009, 0x4593, 0xbf06, 0x07c3, 0xb295, 0x369a, 0x41f4, 0x434a, 0xb01e, 0x42a5, 0x0343, 0x2ad7, 0x1be0, 0xbfce, 0x1bdd, 0x4484, 0x439c, 0x461b, 0x10f4, 0x2207, 0x0503, 0x40ab, 0xbf60, 0x4108, 0x4271, 0x1c07, 0x40d7, 0x1820, 0x01a5, 0x3519, 0xb283, 0xb0c1, 0xb28f, 0xb241, 0x238f, 0x43da, 0x2f61, 0xbfb2, 0xa2bd, 0xbae8, 0x410c, 0x46e2, 0xb012, 0x1e36, 0xb236, 0x45ba, 0xb23b, 0x2e93, 0x4369, 0x18a6, 0xb257, 0x4340, 0xba50, 0x4240, 0x4181, 0x1a86, 0xba64, 0x0cb1, 0x4065, 0xb21a, 0x1b54, 0xbf70, 0x462e, 0xb236, 0x01af, 0x41c3, 0xbf89, 0x4324, 0x4357, 0x41ae, 0x4654, 0x408c, 0x1c4d, 0x43ca, 0x405e, 0x19cc, 0x429b, 0xb026, 0x4337, 0x404b, 0x1c2f, 0xba75, 0x42f1, 0x1e97, 0xb27f, 0x425d, 0x049c, 0xb2e2, 0x1385, 0xb270, 0x1eb3, 0xa556, 0xbade, 0x4064, 0x22e3, 0xbfd1, 0x1cf0, 0x0f0c, 0x4266, 0xb0e2, 0x02c3, 0xb092, 0x1212, 0x3b16, 0x4349, 0x458d, 0x317f, 0x4263, 0x19ee, 0x3fde, 0x085c, 0x0f9e, 0x21c4, 0x41e8, 0xb27f, 0x1ae4, 0x425c, 0x2207, 0x43b9, 0xba3e, 0xb24a, 0xbfcc, 0x40b9, 0x40df, 0x4026, 0x415a, 0xb2db, 0x41e2, 0xbae2, 0x410a, 0x420e, 0xbfa5, 0x43d6, 0xb237, 0x40a9, 0x407f, 0x4075, 0xb23b, 0x1dbb, 0x4021, 0x16c5, 0x430d, 0xb258, 0x1fee, 0x44a5, 0xb03f, 0x4367, 0x43e4, 0x435a, 0x37aa, 0x1bd9, 0xbf08, 0x4143, 0xaea3, 0x2a14, 0x41ef, 0xb076, 0x1e69, 0x4644, 0x1971, 0x2fe4, 0x0aef, 0x3651, 0x43e0, 0x4171, 0x1c89, 0x417b, 0x4354, 0x43fa, 0x418d, 0x411b, 0x425a, 0xbf3a, 0x42b3, 0xa73a, 0x4396, 0xbfc0, 0xb258, 0x429c, 0x44c8, 0x4195, 0xba65, 0x46ed, 0xb0ec, 0x18f8, 0x43b9, 0xb246, 0x4306, 0x465f, 0xb2d4, 0xbf7e, 0x37f6, 0x4173, 0x4685, 0x0536, 0x3e40, 0x0691, 0x2372, 0xbf2e, 0xb213, 0xba2c, 0x1c23, 0x41e6, 0x30e0, 0x4062, 0x4030, 0xb229, 0x43d9, 0x2e16, 0x25b3, 0xb2ae, 0x439f, 0x18bb, 0x16b6, 0x4048, 0x4418, 0x42f7, 0xa615, 0xb008, 0xb2d6, 0x1958, 0x1b00, 0xb0d0, 0x4281, 0xb225, 0xab07, 0xbf82, 0x4276, 0x2565, 0x4156, 0x43eb, 0xb2fe, 0xba25, 0x4143, 0x435c, 0x41cf, 0x428c, 0xb2b4, 0x1772, 0x4398, 0x1b8d, 0xb016, 0x435d, 0xba5c, 0xbf63, 0xba66, 0x4100, 0xba5f, 0x43ac, 0xbfb1, 0x41c5, 0x3555, 0x3b44, 0x4305, 0x3e89, 0xba59, 0x1f34, 0x1828, 0x3d4b, 0xa344, 0xb2c2, 0x3ca8, 0x42ea, 0xbf88, 0x4250, 0xb2ac, 0x43fd, 0xb02a, 0x30bb, 0x0fba, 0x43b6, 0x4336, 0x432b, 0xb256, 0x432f, 0xb0bf, 0x4353, 0x4069, 0x095a, 0xa6cb, 0xbf47, 0x3074, 0x165b, 0x1fe4, 0x2ed8, 0xb272, 0x43d0, 0x43a8, 0x2770, 0xb05c, 0x4279, 0x4055, 0xbfd0, 0xbf84, 0x41aa, 0x43ec, 0x1daf, 0x4663, 0x40c5, 0x34e8, 0x447f, 0xa971, 0x145d, 0x00c3, 0x4281, 0x4392, 0xba2d, 0x3677, 0x42eb, 0x42d3, 0x28df, 0xb2c4, 0x4004, 0xa6ed, 0x40fb, 0x1947, 0xbf33, 0xbaee, 0x446b, 0x40b7, 0x402b, 0x460f, 0x1ef9, 0x4130, 0x28f6, 0xad23, 0x4042, 0x2583, 0x45b5, 0x41c8, 0x462e, 0x19f1, 0x4008, 0x4144, 0x421d, 0x4305, 0xba2b, 0x4103, 0xb2fd, 0xb239, 0x4365, 0xbf9a, 0xb219, 0x4461, 0x41a7, 0x43ac, 0xb2a4, 0x416a, 0xbfe0, 0xb09b, 0x4214, 0xae01, 0x2c45, 0x0c53, 0x4107, 0x43b4, 0x4005, 0xb22f, 0x1966, 0xbf60, 0x182c, 0x4011, 0x430e, 0x4291, 0x34de, 0xbfcc, 0xabcf, 0x4255, 0xba1e, 0xba3b, 0x4556, 0x0971, 0x1926, 0xb2ff, 0xaffe, 0x0c75, 0x401a, 0xbf69, 0x4026, 0x402a, 0x4406, 0x4213, 0xba16, 0x41da, 0x43f0, 0x41d3, 0x4312, 0x4228, 0x43fb, 0x44a8, 0x413c, 0x1e14, 0x1924, 0x435d, 0x409c, 0xb27c, 0x4113, 0x405c, 0x4180, 0xba02, 0x42c0, 0xba36, 0x4197, 0x4359, 0x319f, 0xbf82, 0x4092, 0x1fec, 0x1ee0, 0x43fa, 0x4170, 0x45b4, 0x1e51, 0x4109, 0x40e2, 0x2867, 0x30ff, 0x41f8, 0xbf69, 0x17f9, 0x0d33, 0x06dd, 0x1990, 0xa9a2, 0x3666, 0x1d0f, 0xa2cf, 0x4150, 0x4073, 0x217c, 0x1c58, 0x3267, 0x42d9, 0xb217, 0x439f, 0xbafd, 0x4054, 0x1a4c, 0x42e3, 0xbfc9, 0x2489, 0x4620, 0x00d9, 0x41c0, 0xbf90, 0xb23e, 0xb2a1, 0x27f9, 0x423a, 0x417f, 0x2922, 0xbac3, 0x1a8e, 0x1ff5, 0xb220, 0x421f, 0x4378, 0x433e, 0xa84c, 0xb081, 0x1a72, 0x4684, 0xb280, 0x1acb, 0x1d52, 0x43cb, 0x4125, 0x1b4d, 0xbf1b, 0x4190, 0x192c, 0x42fc, 0xaf1e, 0xbf3f, 0x42a6, 0x1ef6, 0x1a9b, 0xb076, 0x30ec, 0xb25b, 0x19f6, 0x29fb, 0x43f2, 0xb2b7, 0x40af, 0x438e, 0x1bbe, 0xb20b, 0x4166, 0x1a51, 0x4140, 0xb250, 0x23de, 0x4062, 0x39c9, 0xbf0d, 0x1ff7, 0xb04e, 0x4670, 0xb233, 0x40ca, 0x4280, 0x17e1, 0x4572, 0x435a, 0xb248, 0x198a, 0x427a, 0x21aa, 0x412d, 0x0d38, 0x1b5c, 0x1cda, 0x40ad, 0x081c, 0xb2ab, 0xbf98, 0x05b0, 0x157a, 0x42ad, 0x43dc, 0x09b2, 0xa299, 0x1def, 0x41dd, 0x2faa, 0x4089, 0x4161, 0x40eb, 0x400d, 0x42e7, 0xbf70, 0x408f, 0x439c, 0x11bc, 0x40c6, 0x1277, 0x2045, 0x426e, 0x420f, 0xbf70, 0xba1a, 0xbfc4, 0x088e, 0x4437, 0x19aa, 0xb095, 0xba24, 0x1d2b, 0x19d9, 0xb200, 0xb26c, 0xbac0, 0x42c3, 0xbf19, 0x3ab5, 0x185a, 0x1e03, 0x42bd, 0xb040, 0x456d, 0x0e83, 0x4244, 0x4001, 0xb257, 0xb255, 0x4016, 0x21f4, 0x134a, 0x1c09, 0xb2eb, 0xb2d5, 0x103c, 0x412f, 0xb2f8, 0x4645, 0x41ca, 0xbad7, 0x3c4c, 0x43f2, 0x4469, 0xbf7f, 0xb096, 0x404c, 0xb20e, 0x408f, 0xb293, 0x44f4, 0xb2ac, 0x4300, 0xb0d5, 0xb044, 0xb298, 0x401d, 0x40a5, 0x0257, 0xb2bd, 0x427d, 0x42d6, 0x432a, 0x41e0, 0xbf48, 0x3377, 0xb282, 0xabfc, 0xb0a9, 0xb2cf, 0x1ba6, 0x45c8, 0x4080, 0x1e90, 0xb0f0, 0x462e, 0xb229, 0x02cf, 0x41ba, 0x41b8, 0x4210, 0x3f35, 0x398c, 0xba39, 0x413b, 0xbf64, 0x21a7, 0x40b8, 0x0509, 0x4388, 0x20cc, 0xba62, 0x41b9, 0x1efd, 0x41c7, 0x413e, 0x40a3, 0x4136, 0x1b72, 0x4366, 0xba01, 0xb2e0, 0x428b, 0x438e, 0xa279, 0x43d2, 0x1b4e, 0x43ac, 0xbf99, 0x0ff8, 0x36ad, 0x46c3, 0x43e4, 0x42ae, 0xba6e, 0x368c, 0x12b7, 0x43cf, 0x405e, 0x1e52, 0xb28e, 0x0282, 0x280c, 0x4294, 0x2cf6, 0xbfd8, 0x418c, 0xa006, 0x4179, 0xb2b4, 0x415d, 0x0cba, 0x1502, 0x46da, 0x43cf, 0x42bd, 0x411a, 0x4037, 0x4265, 0x4268, 0xbfa9, 0xa149, 0x1de5, 0xb2d1, 0x416a, 0xb0af, 0x4390, 0x4302, 0xbf37, 0x36bf, 0x40ef, 0xaa8e, 0x1731, 0x2537, 0xaa7a, 0x439d, 0xbfdd, 0x416c, 0xb271, 0xb0a0, 0xb0cb, 0x462a, 0xa0ff, 0xaf7c, 0x4338, 0x41c6, 0x40e4, 0x430f, 0xbfae, 0x24ea, 0x41d3, 0x1baf, 0xbf0a, 0xb2b5, 0x415b, 0x4574, 0x42dd, 0x1886, 0xb298, 0x40e3, 0x23f6, 0x43b1, 0x4179, 0x421d, 0x00f3, 0x44fb, 0x43f2, 0xb2da, 0xbf43, 0x329d, 0x40df, 0x41f5, 0x43a4, 0x410f, 0xb070, 0x40c3, 0x0290, 0xba76, 0x40c0, 0x03b8, 0x449a, 0x1b97, 0x0f78, 0x419b, 0x422e, 0x179f, 0x4123, 0xa591, 0x1e2b, 0x1fda, 0x24bb, 0x412f, 0x4204, 0x4331, 0x40cc, 0x3aa9, 0xbfd7, 0x443b, 0x43ac, 0x130f, 0x4328, 0x2575, 0xba56, 0xb246, 0xa7fe, 0x46ac, 0x3801, 0x43dd, 0xba2b, 0x39e7, 0x0bd0, 0x42b3, 0x4038, 0x41f9, 0x4393, 0x4102, 0xb203, 0xb2f8, 0xa22e, 0xa526, 0xb08e, 0x2e59, 0x2b55, 0xb25f, 0x4663, 0xbf3e, 0x4005, 0x43c8, 0xb034, 0x3d71, 0x3d1d, 0xb258, 0x4322, 0x43a8, 0x4052, 0x2a11, 0x434d, 0xba44, 0xb283, 0x0014, 0x18b3, 0xbf85, 0x4236, 0x370f, 0xa4a4, 0x4081, 0xbfae, 0x3107, 0x4246, 0x4159, 0x40f4, 0xb262, 0x1bd6, 0xb275, 0x41ea, 0xbf8e, 0x40f6, 0x4004, 0xba73, 0xbf01, 0x42a3, 0x419b, 0x418a, 0x4309, 0x4300, 0x4053, 0xa24b, 0x43b2, 0x4105, 0x417a, 0x42ee, 0x3a99, 0x41b6, 0x1c97, 0x43e8, 0xbf95, 0x421b, 0xb22f, 0x468c, 0xba30, 0x171d, 0x42e5, 0x4283, 0xbf78, 0x1e0f, 0xb02e, 0x3bce, 0x46f2, 0xbaeb, 0x1a73, 0x1d12, 0xba2a, 0xa2cb, 0xb23a, 0x42a8, 0xa26b, 0x3c45, 0x0a4d, 0x1ce2, 0x1a89, 0xbfa3, 0x462f, 0x45f1, 0x0ccd, 0x19fc, 0x4432, 0xba68, 0x402c, 0x43bd, 0x4106, 0x2d24, 0x08ae, 0x41ee, 0x4395, 0x438a, 0x410d, 0x414e, 0x40c1, 0x41f5, 0xbae6, 0x2a67, 0x0307, 0x1b7c, 0x42fa, 0xba7a, 0x40e7, 0xbad0, 0xb218, 0x4551, 0xbfbc, 0xbfc0, 0x44e1, 0x19e1, 0xb2fc, 0x423b, 0xbf07, 0xb295, 0xb295, 0x4409, 0x42c5, 0xb285, 0x3d52, 0xbf66, 0xbf70, 0x4244, 0xba58, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x35dcd53f, 0x329b21b1, 0x5b679e3c, 0x95697b24, 0xded610ce, 0x5fb2bf66, 0xe3f3845c, 0xe4e7d67e, 0xb27d6955, 0x52a7f817, 0xf1c67637, 0xa8f2cd39, 0x50a9900e, 0xbf067896, 0x00000000, 0xb00001f0 }, - FinalRegs = new uint[] { 0xe8fef8ea, 0x08800000, 0x20020000, 0xfee8eaf8, 0x00000000, 0x0000eaa6, 0x00000000, 0x02200000, 0x0525616d, 0x52a7f817, 0x00000000, 0x052577df, 0x01171508, 0x00011300, 0x00000000, 0x200001d0 }, + Instructions = [0x1e54, 0x40d8, 0x2f66, 0x276c, 0x416f, 0x1987, 0xb06a, 0x45ec, 0xba67, 0x408a, 0xba2f, 0xacd5, 0x29cf, 0x1872, 0x111e, 0x1b04, 0xbafd, 0x41a5, 0xbf97, 0x43df, 0xb06f, 0x1c82, 0x268b, 0xb2ba, 0xb08a, 0x407f, 0xbaea, 0x1d52, 0x06cb, 0x41e7, 0x4475, 0x43b8, 0xba6b, 0x1fb1, 0xbf3e, 0x4241, 0x3d38, 0x4120, 0x2a6b, 0xb217, 0xbfb8, 0x1f4e, 0xb218, 0xb2cc, 0x1ad6, 0x4128, 0x169b, 0xaa87, 0xaf67, 0xb2aa, 0xbfc0, 0xb0e8, 0x33a9, 0x43fb, 0x195b, 0x4091, 0x3613, 0x00c8, 0xbf09, 0xbff0, 0x0ab2, 0x4211, 0xbadc, 0x4100, 0xba4d, 0x0f34, 0xba3f, 0xb250, 0x1425, 0x1ad6, 0x1f20, 0xb0e6, 0xae48, 0x41f4, 0x4117, 0xb0d0, 0xba25, 0xb2f9, 0xba7d, 0x4063, 0x1e53, 0x40ef, 0x401c, 0x1b23, 0x059d, 0x4021, 0x4126, 0xbf0c, 0x3318, 0x4087, 0x4135, 0x430e, 0xbf69, 0x18c0, 0xb285, 0x4164, 0xbf90, 0x40e9, 0x43bf, 0xba12, 0x2a34, 0x4009, 0x4593, 0xbf06, 0x07c3, 0xb295, 0x369a, 0x41f4, 0x434a, 0xb01e, 0x42a5, 0x0343, 0x2ad7, 0x1be0, 0xbfce, 0x1bdd, 0x4484, 0x439c, 0x461b, 0x10f4, 0x2207, 0x0503, 0x40ab, 0xbf60, 0x4108, 0x4271, 0x1c07, 0x40d7, 0x1820, 0x01a5, 0x3519, 0xb283, 0xb0c1, 0xb28f, 0xb241, 0x238f, 0x43da, 0x2f61, 0xbfb2, 0xa2bd, 0xbae8, 0x410c, 0x46e2, 0xb012, 0x1e36, 0xb236, 0x45ba, 0xb23b, 0x2e93, 0x4369, 0x18a6, 0xb257, 0x4340, 0xba50, 0x4240, 0x4181, 0x1a86, 0xba64, 0x0cb1, 0x4065, 0xb21a, 0x1b54, 0xbf70, 0x462e, 0xb236, 0x01af, 0x41c3, 0xbf89, 0x4324, 0x4357, 0x41ae, 0x4654, 0x408c, 0x1c4d, 0x43ca, 0x405e, 0x19cc, 0x429b, 0xb026, 0x4337, 0x404b, 0x1c2f, 0xba75, 0x42f1, 0x1e97, 0xb27f, 0x425d, 0x049c, 0xb2e2, 0x1385, 0xb270, 0x1eb3, 0xa556, 0xbade, 0x4064, 0x22e3, 0xbfd1, 0x1cf0, 0x0f0c, 0x4266, 0xb0e2, 0x02c3, 0xb092, 0x1212, 0x3b16, 0x4349, 0x458d, 0x317f, 0x4263, 0x19ee, 0x3fde, 0x085c, 0x0f9e, 0x21c4, 0x41e8, 0xb27f, 0x1ae4, 0x425c, 0x2207, 0x43b9, 0xba3e, 0xb24a, 0xbfcc, 0x40b9, 0x40df, 0x4026, 0x415a, 0xb2db, 0x41e2, 0xbae2, 0x410a, 0x420e, 0xbfa5, 0x43d6, 0xb237, 0x40a9, 0x407f, 0x4075, 0xb23b, 0x1dbb, 0x4021, 0x16c5, 0x430d, 0xb258, 0x1fee, 0x44a5, 0xb03f, 0x4367, 0x43e4, 0x435a, 0x37aa, 0x1bd9, 0xbf08, 0x4143, 0xaea3, 0x2a14, 0x41ef, 0xb076, 0x1e69, 0x4644, 0x1971, 0x2fe4, 0x0aef, 0x3651, 0x43e0, 0x4171, 0x1c89, 0x417b, 0x4354, 0x43fa, 0x418d, 0x411b, 0x425a, 0xbf3a, 0x42b3, 0xa73a, 0x4396, 0xbfc0, 0xb258, 0x429c, 0x44c8, 0x4195, 0xba65, 0x46ed, 0xb0ec, 0x18f8, 0x43b9, 0xb246, 0x4306, 0x465f, 0xb2d4, 0xbf7e, 0x37f6, 0x4173, 0x4685, 0x0536, 0x3e40, 0x0691, 0x2372, 0xbf2e, 0xb213, 0xba2c, 0x1c23, 0x41e6, 0x30e0, 0x4062, 0x4030, 0xb229, 0x43d9, 0x2e16, 0x25b3, 0xb2ae, 0x439f, 0x18bb, 0x16b6, 0x4048, 0x4418, 0x42f7, 0xa615, 0xb008, 0xb2d6, 0x1958, 0x1b00, 0xb0d0, 0x4281, 0xb225, 0xab07, 0xbf82, 0x4276, 0x2565, 0x4156, 0x43eb, 0xb2fe, 0xba25, 0x4143, 0x435c, 0x41cf, 0x428c, 0xb2b4, 0x1772, 0x4398, 0x1b8d, 0xb016, 0x435d, 0xba5c, 0xbf63, 0xba66, 0x4100, 0xba5f, 0x43ac, 0xbfb1, 0x41c5, 0x3555, 0x3b44, 0x4305, 0x3e89, 0xba59, 0x1f34, 0x1828, 0x3d4b, 0xa344, 0xb2c2, 0x3ca8, 0x42ea, 0xbf88, 0x4250, 0xb2ac, 0x43fd, 0xb02a, 0x30bb, 0x0fba, 0x43b6, 0x4336, 0x432b, 0xb256, 0x432f, 0xb0bf, 0x4353, 0x4069, 0x095a, 0xa6cb, 0xbf47, 0x3074, 0x165b, 0x1fe4, 0x2ed8, 0xb272, 0x43d0, 0x43a8, 0x2770, 0xb05c, 0x4279, 0x4055, 0xbfd0, 0xbf84, 0x41aa, 0x43ec, 0x1daf, 0x4663, 0x40c5, 0x34e8, 0x447f, 0xa971, 0x145d, 0x00c3, 0x4281, 0x4392, 0xba2d, 0x3677, 0x42eb, 0x42d3, 0x28df, 0xb2c4, 0x4004, 0xa6ed, 0x40fb, 0x1947, 0xbf33, 0xbaee, 0x446b, 0x40b7, 0x402b, 0x460f, 0x1ef9, 0x4130, 0x28f6, 0xad23, 0x4042, 0x2583, 0x45b5, 0x41c8, 0x462e, 0x19f1, 0x4008, 0x4144, 0x421d, 0x4305, 0xba2b, 0x4103, 0xb2fd, 0xb239, 0x4365, 0xbf9a, 0xb219, 0x4461, 0x41a7, 0x43ac, 0xb2a4, 0x416a, 0xbfe0, 0xb09b, 0x4214, 0xae01, 0x2c45, 0x0c53, 0x4107, 0x43b4, 0x4005, 0xb22f, 0x1966, 0xbf60, 0x182c, 0x4011, 0x430e, 0x4291, 0x34de, 0xbfcc, 0xabcf, 0x4255, 0xba1e, 0xba3b, 0x4556, 0x0971, 0x1926, 0xb2ff, 0xaffe, 0x0c75, 0x401a, 0xbf69, 0x4026, 0x402a, 0x4406, 0x4213, 0xba16, 0x41da, 0x43f0, 0x41d3, 0x4312, 0x4228, 0x43fb, 0x44a8, 0x413c, 0x1e14, 0x1924, 0x435d, 0x409c, 0xb27c, 0x4113, 0x405c, 0x4180, 0xba02, 0x42c0, 0xba36, 0x4197, 0x4359, 0x319f, 0xbf82, 0x4092, 0x1fec, 0x1ee0, 0x43fa, 0x4170, 0x45b4, 0x1e51, 0x4109, 0x40e2, 0x2867, 0x30ff, 0x41f8, 0xbf69, 0x17f9, 0x0d33, 0x06dd, 0x1990, 0xa9a2, 0x3666, 0x1d0f, 0xa2cf, 0x4150, 0x4073, 0x217c, 0x1c58, 0x3267, 0x42d9, 0xb217, 0x439f, 0xbafd, 0x4054, 0x1a4c, 0x42e3, 0xbfc9, 0x2489, 0x4620, 0x00d9, 0x41c0, 0xbf90, 0xb23e, 0xb2a1, 0x27f9, 0x423a, 0x417f, 0x2922, 0xbac3, 0x1a8e, 0x1ff5, 0xb220, 0x421f, 0x4378, 0x433e, 0xa84c, 0xb081, 0x1a72, 0x4684, 0xb280, 0x1acb, 0x1d52, 0x43cb, 0x4125, 0x1b4d, 0xbf1b, 0x4190, 0x192c, 0x42fc, 0xaf1e, 0xbf3f, 0x42a6, 0x1ef6, 0x1a9b, 0xb076, 0x30ec, 0xb25b, 0x19f6, 0x29fb, 0x43f2, 0xb2b7, 0x40af, 0x438e, 0x1bbe, 0xb20b, 0x4166, 0x1a51, 0x4140, 0xb250, 0x23de, 0x4062, 0x39c9, 0xbf0d, 0x1ff7, 0xb04e, 0x4670, 0xb233, 0x40ca, 0x4280, 0x17e1, 0x4572, 0x435a, 0xb248, 0x198a, 0x427a, 0x21aa, 0x412d, 0x0d38, 0x1b5c, 0x1cda, 0x40ad, 0x081c, 0xb2ab, 0xbf98, 0x05b0, 0x157a, 0x42ad, 0x43dc, 0x09b2, 0xa299, 0x1def, 0x41dd, 0x2faa, 0x4089, 0x4161, 0x40eb, 0x400d, 0x42e7, 0xbf70, 0x408f, 0x439c, 0x11bc, 0x40c6, 0x1277, 0x2045, 0x426e, 0x420f, 0xbf70, 0xba1a, 0xbfc4, 0x088e, 0x4437, 0x19aa, 0xb095, 0xba24, 0x1d2b, 0x19d9, 0xb200, 0xb26c, 0xbac0, 0x42c3, 0xbf19, 0x3ab5, 0x185a, 0x1e03, 0x42bd, 0xb040, 0x456d, 0x0e83, 0x4244, 0x4001, 0xb257, 0xb255, 0x4016, 0x21f4, 0x134a, 0x1c09, 0xb2eb, 0xb2d5, 0x103c, 0x412f, 0xb2f8, 0x4645, 0x41ca, 0xbad7, 0x3c4c, 0x43f2, 0x4469, 0xbf7f, 0xb096, 0x404c, 0xb20e, 0x408f, 0xb293, 0x44f4, 0xb2ac, 0x4300, 0xb0d5, 0xb044, 0xb298, 0x401d, 0x40a5, 0x0257, 0xb2bd, 0x427d, 0x42d6, 0x432a, 0x41e0, 0xbf48, 0x3377, 0xb282, 0xabfc, 0xb0a9, 0xb2cf, 0x1ba6, 0x45c8, 0x4080, 0x1e90, 0xb0f0, 0x462e, 0xb229, 0x02cf, 0x41ba, 0x41b8, 0x4210, 0x3f35, 0x398c, 0xba39, 0x413b, 0xbf64, 0x21a7, 0x40b8, 0x0509, 0x4388, 0x20cc, 0xba62, 0x41b9, 0x1efd, 0x41c7, 0x413e, 0x40a3, 0x4136, 0x1b72, 0x4366, 0xba01, 0xb2e0, 0x428b, 0x438e, 0xa279, 0x43d2, 0x1b4e, 0x43ac, 0xbf99, 0x0ff8, 0x36ad, 0x46c3, 0x43e4, 0x42ae, 0xba6e, 0x368c, 0x12b7, 0x43cf, 0x405e, 0x1e52, 0xb28e, 0x0282, 0x280c, 0x4294, 0x2cf6, 0xbfd8, 0x418c, 0xa006, 0x4179, 0xb2b4, 0x415d, 0x0cba, 0x1502, 0x46da, 0x43cf, 0x42bd, 0x411a, 0x4037, 0x4265, 0x4268, 0xbfa9, 0xa149, 0x1de5, 0xb2d1, 0x416a, 0xb0af, 0x4390, 0x4302, 0xbf37, 0x36bf, 0x40ef, 0xaa8e, 0x1731, 0x2537, 0xaa7a, 0x439d, 0xbfdd, 0x416c, 0xb271, 0xb0a0, 0xb0cb, 0x462a, 0xa0ff, 0xaf7c, 0x4338, 0x41c6, 0x40e4, 0x430f, 0xbfae, 0x24ea, 0x41d3, 0x1baf, 0xbf0a, 0xb2b5, 0x415b, 0x4574, 0x42dd, 0x1886, 0xb298, 0x40e3, 0x23f6, 0x43b1, 0x4179, 0x421d, 0x00f3, 0x44fb, 0x43f2, 0xb2da, 0xbf43, 0x329d, 0x40df, 0x41f5, 0x43a4, 0x410f, 0xb070, 0x40c3, 0x0290, 0xba76, 0x40c0, 0x03b8, 0x449a, 0x1b97, 0x0f78, 0x419b, 0x422e, 0x179f, 0x4123, 0xa591, 0x1e2b, 0x1fda, 0x24bb, 0x412f, 0x4204, 0x4331, 0x40cc, 0x3aa9, 0xbfd7, 0x443b, 0x43ac, 0x130f, 0x4328, 0x2575, 0xba56, 0xb246, 0xa7fe, 0x46ac, 0x3801, 0x43dd, 0xba2b, 0x39e7, 0x0bd0, 0x42b3, 0x4038, 0x41f9, 0x4393, 0x4102, 0xb203, 0xb2f8, 0xa22e, 0xa526, 0xb08e, 0x2e59, 0x2b55, 0xb25f, 0x4663, 0xbf3e, 0x4005, 0x43c8, 0xb034, 0x3d71, 0x3d1d, 0xb258, 0x4322, 0x43a8, 0x4052, 0x2a11, 0x434d, 0xba44, 0xb283, 0x0014, 0x18b3, 0xbf85, 0x4236, 0x370f, 0xa4a4, 0x4081, 0xbfae, 0x3107, 0x4246, 0x4159, 0x40f4, 0xb262, 0x1bd6, 0xb275, 0x41ea, 0xbf8e, 0x40f6, 0x4004, 0xba73, 0xbf01, 0x42a3, 0x419b, 0x418a, 0x4309, 0x4300, 0x4053, 0xa24b, 0x43b2, 0x4105, 0x417a, 0x42ee, 0x3a99, 0x41b6, 0x1c97, 0x43e8, 0xbf95, 0x421b, 0xb22f, 0x468c, 0xba30, 0x171d, 0x42e5, 0x4283, 0xbf78, 0x1e0f, 0xb02e, 0x3bce, 0x46f2, 0xbaeb, 0x1a73, 0x1d12, 0xba2a, 0xa2cb, 0xb23a, 0x42a8, 0xa26b, 0x3c45, 0x0a4d, 0x1ce2, 0x1a89, 0xbfa3, 0x462f, 0x45f1, 0x0ccd, 0x19fc, 0x4432, 0xba68, 0x402c, 0x43bd, 0x4106, 0x2d24, 0x08ae, 0x41ee, 0x4395, 0x438a, 0x410d, 0x414e, 0x40c1, 0x41f5, 0xbae6, 0x2a67, 0x0307, 0x1b7c, 0x42fa, 0xba7a, 0x40e7, 0xbad0, 0xb218, 0x4551, 0xbfbc, 0xbfc0, 0x44e1, 0x19e1, 0xb2fc, 0x423b, 0xbf07, 0xb295, 0xb295, 0x4409, 0x42c5, 0xb285, 0x3d52, 0xbf66, 0xbf70, 0x4244, 0xba58, 0x4770, 0xe7fe + ], + StartRegs = [0x35dcd53f, 0x329b21b1, 0x5b679e3c, 0x95697b24, 0xded610ce, 0x5fb2bf66, 0xe3f3845c, 0xe4e7d67e, 0xb27d6955, 0x52a7f817, 0xf1c67637, 0xa8f2cd39, 0x50a9900e, 0xbf067896, 0x00000000, 0xb00001f0 + ], + FinalRegs = [0xe8fef8ea, 0x08800000, 0x20020000, 0xfee8eaf8, 0x00000000, 0x0000eaa6, 0x00000000, 0x02200000, 0x0525616d, 0x52a7f817, 0x00000000, 0x052577df, 0x01171508, 0x00011300, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x2155, 0x1e10, 0x3dda, 0xa4a1, 0x40e5, 0xba3b, 0x40e6, 0x1cbe, 0xbf21, 0x3982, 0x403a, 0x3b83, 0x40d0, 0x1dbd, 0x4633, 0xbf27, 0x40fa, 0x4217, 0xba03, 0xa0e8, 0x4051, 0x43d7, 0xb2ad, 0xb23a, 0x4456, 0x40ca, 0xb28a, 0x4598, 0x414f, 0x183b, 0xbf47, 0xb04c, 0x2d55, 0xb200, 0x410d, 0x423c, 0x427c, 0x43e2, 0xbf75, 0x438e, 0x420c, 0xb040, 0x431f, 0xaaec, 0x1ea1, 0x4219, 0x0e67, 0x4107, 0x258a, 0x4363, 0x4209, 0xbfa0, 0x4244, 0x1fed, 0x082e, 0xa5ef, 0xba10, 0xb215, 0xbf60, 0xbadd, 0x441f, 0x4360, 0x4416, 0x0ced, 0x4396, 0xb2a5, 0xbfbd, 0x020b, 0x10f7, 0x40bc, 0x43fa, 0xba04, 0xb203, 0x424b, 0x3ef2, 0xb21f, 0xb2db, 0x18b7, 0x41eb, 0x32b6, 0x4415, 0x405d, 0x19be, 0x124d, 0xb067, 0x4048, 0xbf7e, 0x4163, 0x4494, 0x2c27, 0x41a4, 0x4094, 0x417b, 0xbadb, 0xb221, 0xac56, 0x4045, 0xbf00, 0xbf9e, 0xb02c, 0x1467, 0xa9eb, 0xb28c, 0x42f0, 0x42f1, 0x2b99, 0x10b3, 0x4181, 0x4565, 0x16bf, 0xbaf0, 0x3ce0, 0x0fdb, 0x182c, 0x4008, 0xb253, 0x405c, 0x4291, 0x427d, 0x1b26, 0x4275, 0x424d, 0x400e, 0xbf97, 0x24cc, 0xb0ac, 0x00e5, 0x4646, 0x2dad, 0xbfd5, 0x416b, 0x43dc, 0x15af, 0x405f, 0x42ae, 0xaffc, 0x435c, 0x407e, 0x25a2, 0xb0a1, 0x26af, 0x4440, 0x2f9f, 0x0c00, 0x44e2, 0x4079, 0x0965, 0xb21f, 0x43b0, 0x081f, 0x441c, 0xbf5c, 0x4350, 0x1b32, 0x41d9, 0x46d8, 0xba76, 0x42cf, 0x426e, 0x438e, 0x0cf5, 0xb00b, 0x414f, 0xba7f, 0x2ea0, 0x4601, 0x43de, 0x2e67, 0x0090, 0xb095, 0x43b4, 0x1edf, 0x4695, 0xb264, 0x0acf, 0xbf11, 0x42f8, 0xa71c, 0x42c7, 0xb29e, 0xb223, 0x08a7, 0x4425, 0x40c5, 0x4342, 0x466f, 0x1e7a, 0x425e, 0xba7c, 0xbaef, 0x4195, 0x40f0, 0x4105, 0x182a, 0xb249, 0x01b6, 0x43db, 0x33cd, 0xb098, 0x22ef, 0x4670, 0x1c06, 0x4143, 0xb2ad, 0xbfdd, 0x44ea, 0xba3e, 0x43d7, 0xb251, 0xba39, 0xba0d, 0x40bf, 0x46a2, 0x20a1, 0x41ab, 0x3578, 0xafc6, 0x19e4, 0x4127, 0xb06d, 0xacfe, 0x1d9e, 0xbf31, 0x43da, 0x0408, 0x42e6, 0xb2ca, 0x400e, 0xa0f7, 0x42c4, 0xb24e, 0x401f, 0xb220, 0x4494, 0x4410, 0xbf15, 0x417b, 0x42eb, 0x151d, 0x4295, 0x4188, 0xbae2, 0x40d5, 0x40c3, 0x1d6c, 0xa78d, 0x4059, 0x46ad, 0x1903, 0x1b14, 0x407f, 0xb249, 0x43cf, 0x415f, 0x4423, 0x410e, 0xba10, 0x0aac, 0x40ae, 0xa148, 0x0bda, 0xbfb6, 0x4161, 0xb0c0, 0xb2b3, 0xacde, 0x43b8, 0x40c4, 0xb2b5, 0x4476, 0x41cf, 0x4245, 0xbf2a, 0x1c2a, 0x34fe, 0x089d, 0x1943, 0xa5a5, 0x4611, 0x4013, 0x305a, 0x1a16, 0x43f1, 0x4118, 0xb2a5, 0x44a3, 0x1aa6, 0x4055, 0x412d, 0xb2c1, 0x43cf, 0x0ae2, 0xbf28, 0x4299, 0x42ac, 0xb203, 0xa899, 0x4160, 0xbf56, 0xbafe, 0x40d0, 0xb2ea, 0xb2b1, 0x1f3a, 0x1cf9, 0x43fd, 0xbf76, 0xba48, 0xbaca, 0xb2d1, 0x4268, 0x43a9, 0x465a, 0x1f70, 0xb0a5, 0xb021, 0x4016, 0xae2f, 0x4012, 0x3ad1, 0x402f, 0x3c2d, 0x425e, 0x40a7, 0xba78, 0xbf2f, 0x226a, 0x44a0, 0x417a, 0x040e, 0x0659, 0xb288, 0x41b4, 0xba78, 0x0a09, 0x4165, 0x2bfb, 0xbf05, 0x4222, 0x1bfa, 0xa40a, 0x43ab, 0x41db, 0x43e3, 0x419f, 0x4694, 0x43d0, 0x35e8, 0x1f83, 0x4116, 0x4206, 0xac92, 0x4034, 0x220e, 0x413e, 0xad23, 0x4116, 0x4430, 0xbf60, 0x0e3f, 0x1c57, 0xac22, 0x3c5b, 0xb208, 0x098b, 0xbf0c, 0x42db, 0x3b41, 0x435e, 0x4302, 0xbf19, 0x3fc7, 0x4222, 0xbac3, 0x1528, 0x427e, 0x428a, 0xb2ce, 0xb09d, 0x41f4, 0x435c, 0xba54, 0xbf3f, 0x2dc4, 0x1526, 0x4335, 0xba05, 0xbf5f, 0xb252, 0x4431, 0x2474, 0x4260, 0x4278, 0x41eb, 0x43f7, 0x41bc, 0x4274, 0x2a23, 0x1ea8, 0xb024, 0x163b, 0x4365, 0x3c89, 0x424f, 0xba1c, 0x43d1, 0x42ac, 0xbac7, 0x405a, 0xb2d1, 0x1d69, 0xb2a2, 0x41bf, 0x412b, 0x42f5, 0x141d, 0xbf5b, 0x43f7, 0x0b65, 0x4124, 0xbacc, 0x414a, 0x39dc, 0x4290, 0x160f, 0xb2c6, 0x46b2, 0x43b8, 0xbf90, 0x417c, 0x41ea, 0x4280, 0x438c, 0x40b9, 0x1fc0, 0x0291, 0x46e2, 0x432a, 0x4206, 0x2149, 0x06e2, 0xb218, 0xba0d, 0x3fc3, 0xbf68, 0x46c8, 0x4166, 0x437d, 0x41a0, 0xb00f, 0x26f5, 0x42b6, 0x466c, 0xaf14, 0xba28, 0x0364, 0x0f78, 0xa3a4, 0xbf6e, 0x4572, 0xb2fe, 0xb046, 0x413c, 0xbaf3, 0x4370, 0x4005, 0x2268, 0x42af, 0x4278, 0x4089, 0x439f, 0xbfd6, 0xaed2, 0x4305, 0xb2e2, 0xb2f6, 0xbf18, 0x42a3, 0x1ee9, 0x41bc, 0x1d48, 0x4313, 0xa6e2, 0x407a, 0xb09e, 0x459c, 0xb24b, 0xb015, 0xaa03, 0x18b9, 0xacea, 0x1e86, 0x4169, 0xbfc8, 0x1f6a, 0x4396, 0x347f, 0x182d, 0x3184, 0xba54, 0x221f, 0x40d0, 0x337e, 0x4272, 0x40c0, 0xb0de, 0x430d, 0x4105, 0x315e, 0x11cc, 0xbf90, 0x228a, 0x4273, 0xbada, 0x006d, 0xbf2a, 0x4334, 0x18c8, 0xb2d9, 0x1cf8, 0xba7c, 0xbaef, 0x4461, 0x2973, 0x2d26, 0x4042, 0xaba4, 0x4186, 0xb05c, 0xbfd4, 0x4254, 0x1e78, 0x4643, 0xb29a, 0x427a, 0x4370, 0x1f71, 0x419a, 0xa4c1, 0x07c9, 0xbf80, 0x3f05, 0x405f, 0x3150, 0xbf37, 0x40ce, 0xba27, 0xb2a0, 0x2398, 0xbfca, 0x43e4, 0xaa17, 0xba74, 0xb0d6, 0xb08f, 0x42c9, 0x42cd, 0xb224, 0x1ccf, 0xafbc, 0x4060, 0xb0f5, 0x423d, 0x43c4, 0xb2fc, 0xbac2, 0x4017, 0xb265, 0x431a, 0xbfca, 0x43a8, 0x415f, 0x40ff, 0xb0d7, 0xbae4, 0x1b93, 0xb2e9, 0x1a43, 0x28ac, 0x427c, 0xb215, 0x4017, 0xbf3d, 0xb2d0, 0x42be, 0x1d8f, 0x447c, 0x40ec, 0xba4e, 0x1910, 0xb041, 0x1fdd, 0x41b7, 0x40c9, 0x42c8, 0xbf60, 0x404f, 0xb27d, 0x4661, 0x4399, 0x43eb, 0xb20a, 0x460b, 0x1c22, 0xb26f, 0xbae0, 0xbff0, 0x421f, 0x1f27, 0x4264, 0x4290, 0xbf93, 0xb2a4, 0xb2a7, 0xbaff, 0xad42, 0x4391, 0xba27, 0x40f4, 0xbfd6, 0x42f8, 0x429f, 0x03c8, 0x40c6, 0x32d1, 0x40c8, 0xaf82, 0x02cf, 0x046b, 0x4285, 0x4291, 0xba45, 0xbadd, 0x40f2, 0x33e6, 0xba09, 0xba1e, 0x4607, 0x45d9, 0x4453, 0xb00d, 0x4222, 0x40b0, 0xbf19, 0xb20c, 0x1ab7, 0x41dc, 0x439e, 0x4221, 0x1f89, 0x400c, 0xb288, 0x42f2, 0x4543, 0x3d97, 0x43e3, 0xba58, 0xaa3d, 0x42d0, 0x1870, 0x26b1, 0xbfab, 0x4112, 0x42d9, 0x467c, 0x4052, 0x4631, 0xb286, 0xbf5e, 0x43c5, 0x44d0, 0x2fb1, 0x43b3, 0xb2ea, 0x1d46, 0x4076, 0x415a, 0x3bbe, 0xbf03, 0x0812, 0x2d4f, 0x1f62, 0x4322, 0x0a58, 0x40e4, 0x1fcd, 0xba52, 0x15b6, 0x43b0, 0x43a0, 0x400a, 0x4303, 0x4297, 0x40e7, 0xb0cf, 0x43e8, 0x15c1, 0x4134, 0x4248, 0x4576, 0x0870, 0x01c4, 0xbf63, 0xbac5, 0x42cd, 0x437d, 0x43e7, 0xb261, 0x42e2, 0xbf18, 0xbac0, 0x4037, 0x40d0, 0x1c84, 0x4149, 0xbf80, 0xb2c6, 0xbfe0, 0x30f1, 0xa467, 0x2e0e, 0xbf6b, 0x46e2, 0x4216, 0x43df, 0x1ab8, 0xbf23, 0x46d3, 0xba71, 0xb208, 0x099f, 0xbf60, 0xba1f, 0x40a5, 0x42d4, 0x21cb, 0x1ffd, 0x40c9, 0x42dc, 0x15f1, 0x279d, 0x2437, 0x0cea, 0xbfdd, 0xbae4, 0x438b, 0x4378, 0x463c, 0x0a74, 0x4005, 0xba1e, 0x41d7, 0x4481, 0x4274, 0x45da, 0xbf46, 0xb0e9, 0x3f19, 0x1bb1, 0x4581, 0x42ce, 0xb2df, 0xba6f, 0xb22f, 0x343f, 0x40d8, 0xae4d, 0x4225, 0x404d, 0x3748, 0x4641, 0x1924, 0xba34, 0xbf27, 0x42ba, 0x1e38, 0x40c4, 0x1e29, 0xbfb8, 0xa804, 0xbaf2, 0xbaec, 0x411a, 0x42e3, 0x402b, 0x404a, 0x4654, 0x403c, 0x229e, 0x4343, 0x4278, 0x420e, 0x414e, 0x1b28, 0x1ec8, 0x4137, 0xbf74, 0x4132, 0x40db, 0xba2b, 0x424e, 0x400f, 0x4342, 0xa268, 0x45cc, 0x41a1, 0xb210, 0x1e13, 0xba32, 0x405f, 0x4070, 0x40a8, 0x4495, 0xaf59, 0x1a8a, 0x4335, 0x1aaf, 0xa0de, 0x4557, 0x429b, 0xbf2b, 0x1a1f, 0xb24a, 0x20ba, 0x4026, 0x4426, 0x415d, 0xba49, 0x1a0f, 0xa6ba, 0x408e, 0xba37, 0xb067, 0xa1be, 0x43f0, 0xb26f, 0x06e2, 0x4101, 0x424b, 0xb004, 0x17fe, 0x417d, 0x4053, 0x133e, 0xbfa1, 0xa51b, 0xaf80, 0x43e6, 0x4031, 0x0893, 0x42a2, 0x113a, 0xbf86, 0xb211, 0xb2e9, 0x1955, 0xb2e0, 0x4249, 0x1fee, 0x43bf, 0x1f72, 0xb29c, 0x41ce, 0x1c6c, 0x1ac1, 0x4216, 0x4309, 0xbf90, 0x4176, 0x4114, 0x0c13, 0xb22a, 0x10be, 0x4293, 0x1255, 0x40dd, 0x1f80, 0xba69, 0xb298, 0x430c, 0x3114, 0xbfc2, 0x4209, 0x4682, 0x4160, 0x461f, 0x4003, 0x4104, 0x27e8, 0xb27f, 0x13b2, 0x4034, 0x061d, 0xb093, 0x30b2, 0x4252, 0xa0b3, 0xa03e, 0x4489, 0x4458, 0xbad3, 0xbf2e, 0x4301, 0x401f, 0x40ed, 0xba6c, 0x41bf, 0xb017, 0xbf5b, 0x4549, 0x4316, 0xb2ac, 0x2a29, 0x19a6, 0x437d, 0xaba0, 0x3226, 0xa26e, 0x1bde, 0x4143, 0x40a4, 0x46ac, 0x420e, 0x43d6, 0x40d2, 0x40e5, 0x059e, 0x41eb, 0xbfb2, 0xaf76, 0x4194, 0x425c, 0x3ca9, 0xbafa, 0x1cd4, 0x40b9, 0xb29b, 0x439a, 0x3586, 0xb28f, 0x43a5, 0x438b, 0x45ad, 0xb200, 0xbf90, 0x387c, 0x1693, 0x40a5, 0x43c8, 0x065e, 0x37af, 0xbf55, 0x4319, 0x41ee, 0x1ee5, 0x1d3e, 0x43f1, 0x1d52, 0x462d, 0x0129, 0xbae8, 0x4613, 0x1d81, 0x2a54, 0xba46, 0x432c, 0x101c, 0xb29a, 0x42c2, 0xbfd0, 0x2520, 0x32e6, 0xba32, 0xba5a, 0x40ef, 0xbf70, 0xa438, 0xbf48, 0x42cf, 0x4220, 0x40f8, 0x0b4e, 0x434e, 0x1909, 0x417e, 0x42ee, 0xbf02, 0xbfd0, 0x157f, 0x408d, 0x42dc, 0xba68, 0xb219, 0xb075, 0xbfa5, 0x2f93, 0x1fb8, 0x40f1, 0xb240, 0xb2b3, 0x2097, 0x42f4, 0x188b, 0xb0e8, 0x4326, 0x4157, 0x2694, 0x404c, 0xbaf8, 0x431a, 0x4308, 0x2760, 0x359d, 0xb290, 0x1cc4, 0x4133, 0x1771, 0x408f, 0x4159, 0xba63, 0x4222, 0xbf7d, 0x44f8, 0x4088, 0xbad6, 0x0287, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x8f725d16, 0x8f2d1fe5, 0xd2b28a66, 0x47a47346, 0xc0b4401b, 0xf8e7fb12, 0x4ba63b76, 0xa9e6ad4c, 0xa1d2cdf2, 0x35a0c989, 0xc174909a, 0x846af94c, 0xe89071ad, 0x3db39c20, 0x00000000, 0x000001f0 }, - FinalRegs = new uint[] { 0x0000414c, 0x00000000, 0x0000414c, 0x00004f41, 0x0000414f, 0x000000bd, 0x00004c41, 0x00000060, 0x08d61086, 0x35a0d48c, 0x00000000, 0x846afcc2, 0x00000000, 0x17fffbb8, 0x00000000, 0x000001d0 }, + Instructions = [0x2155, 0x1e10, 0x3dda, 0xa4a1, 0x40e5, 0xba3b, 0x40e6, 0x1cbe, 0xbf21, 0x3982, 0x403a, 0x3b83, 0x40d0, 0x1dbd, 0x4633, 0xbf27, 0x40fa, 0x4217, 0xba03, 0xa0e8, 0x4051, 0x43d7, 0xb2ad, 0xb23a, 0x4456, 0x40ca, 0xb28a, 0x4598, 0x414f, 0x183b, 0xbf47, 0xb04c, 0x2d55, 0xb200, 0x410d, 0x423c, 0x427c, 0x43e2, 0xbf75, 0x438e, 0x420c, 0xb040, 0x431f, 0xaaec, 0x1ea1, 0x4219, 0x0e67, 0x4107, 0x258a, 0x4363, 0x4209, 0xbfa0, 0x4244, 0x1fed, 0x082e, 0xa5ef, 0xba10, 0xb215, 0xbf60, 0xbadd, 0x441f, 0x4360, 0x4416, 0x0ced, 0x4396, 0xb2a5, 0xbfbd, 0x020b, 0x10f7, 0x40bc, 0x43fa, 0xba04, 0xb203, 0x424b, 0x3ef2, 0xb21f, 0xb2db, 0x18b7, 0x41eb, 0x32b6, 0x4415, 0x405d, 0x19be, 0x124d, 0xb067, 0x4048, 0xbf7e, 0x4163, 0x4494, 0x2c27, 0x41a4, 0x4094, 0x417b, 0xbadb, 0xb221, 0xac56, 0x4045, 0xbf00, 0xbf9e, 0xb02c, 0x1467, 0xa9eb, 0xb28c, 0x42f0, 0x42f1, 0x2b99, 0x10b3, 0x4181, 0x4565, 0x16bf, 0xbaf0, 0x3ce0, 0x0fdb, 0x182c, 0x4008, 0xb253, 0x405c, 0x4291, 0x427d, 0x1b26, 0x4275, 0x424d, 0x400e, 0xbf97, 0x24cc, 0xb0ac, 0x00e5, 0x4646, 0x2dad, 0xbfd5, 0x416b, 0x43dc, 0x15af, 0x405f, 0x42ae, 0xaffc, 0x435c, 0x407e, 0x25a2, 0xb0a1, 0x26af, 0x4440, 0x2f9f, 0x0c00, 0x44e2, 0x4079, 0x0965, 0xb21f, 0x43b0, 0x081f, 0x441c, 0xbf5c, 0x4350, 0x1b32, 0x41d9, 0x46d8, 0xba76, 0x42cf, 0x426e, 0x438e, 0x0cf5, 0xb00b, 0x414f, 0xba7f, 0x2ea0, 0x4601, 0x43de, 0x2e67, 0x0090, 0xb095, 0x43b4, 0x1edf, 0x4695, 0xb264, 0x0acf, 0xbf11, 0x42f8, 0xa71c, 0x42c7, 0xb29e, 0xb223, 0x08a7, 0x4425, 0x40c5, 0x4342, 0x466f, 0x1e7a, 0x425e, 0xba7c, 0xbaef, 0x4195, 0x40f0, 0x4105, 0x182a, 0xb249, 0x01b6, 0x43db, 0x33cd, 0xb098, 0x22ef, 0x4670, 0x1c06, 0x4143, 0xb2ad, 0xbfdd, 0x44ea, 0xba3e, 0x43d7, 0xb251, 0xba39, 0xba0d, 0x40bf, 0x46a2, 0x20a1, 0x41ab, 0x3578, 0xafc6, 0x19e4, 0x4127, 0xb06d, 0xacfe, 0x1d9e, 0xbf31, 0x43da, 0x0408, 0x42e6, 0xb2ca, 0x400e, 0xa0f7, 0x42c4, 0xb24e, 0x401f, 0xb220, 0x4494, 0x4410, 0xbf15, 0x417b, 0x42eb, 0x151d, 0x4295, 0x4188, 0xbae2, 0x40d5, 0x40c3, 0x1d6c, 0xa78d, 0x4059, 0x46ad, 0x1903, 0x1b14, 0x407f, 0xb249, 0x43cf, 0x415f, 0x4423, 0x410e, 0xba10, 0x0aac, 0x40ae, 0xa148, 0x0bda, 0xbfb6, 0x4161, 0xb0c0, 0xb2b3, 0xacde, 0x43b8, 0x40c4, 0xb2b5, 0x4476, 0x41cf, 0x4245, 0xbf2a, 0x1c2a, 0x34fe, 0x089d, 0x1943, 0xa5a5, 0x4611, 0x4013, 0x305a, 0x1a16, 0x43f1, 0x4118, 0xb2a5, 0x44a3, 0x1aa6, 0x4055, 0x412d, 0xb2c1, 0x43cf, 0x0ae2, 0xbf28, 0x4299, 0x42ac, 0xb203, 0xa899, 0x4160, 0xbf56, 0xbafe, 0x40d0, 0xb2ea, 0xb2b1, 0x1f3a, 0x1cf9, 0x43fd, 0xbf76, 0xba48, 0xbaca, 0xb2d1, 0x4268, 0x43a9, 0x465a, 0x1f70, 0xb0a5, 0xb021, 0x4016, 0xae2f, 0x4012, 0x3ad1, 0x402f, 0x3c2d, 0x425e, 0x40a7, 0xba78, 0xbf2f, 0x226a, 0x44a0, 0x417a, 0x040e, 0x0659, 0xb288, 0x41b4, 0xba78, 0x0a09, 0x4165, 0x2bfb, 0xbf05, 0x4222, 0x1bfa, 0xa40a, 0x43ab, 0x41db, 0x43e3, 0x419f, 0x4694, 0x43d0, 0x35e8, 0x1f83, 0x4116, 0x4206, 0xac92, 0x4034, 0x220e, 0x413e, 0xad23, 0x4116, 0x4430, 0xbf60, 0x0e3f, 0x1c57, 0xac22, 0x3c5b, 0xb208, 0x098b, 0xbf0c, 0x42db, 0x3b41, 0x435e, 0x4302, 0xbf19, 0x3fc7, 0x4222, 0xbac3, 0x1528, 0x427e, 0x428a, 0xb2ce, 0xb09d, 0x41f4, 0x435c, 0xba54, 0xbf3f, 0x2dc4, 0x1526, 0x4335, 0xba05, 0xbf5f, 0xb252, 0x4431, 0x2474, 0x4260, 0x4278, 0x41eb, 0x43f7, 0x41bc, 0x4274, 0x2a23, 0x1ea8, 0xb024, 0x163b, 0x4365, 0x3c89, 0x424f, 0xba1c, 0x43d1, 0x42ac, 0xbac7, 0x405a, 0xb2d1, 0x1d69, 0xb2a2, 0x41bf, 0x412b, 0x42f5, 0x141d, 0xbf5b, 0x43f7, 0x0b65, 0x4124, 0xbacc, 0x414a, 0x39dc, 0x4290, 0x160f, 0xb2c6, 0x46b2, 0x43b8, 0xbf90, 0x417c, 0x41ea, 0x4280, 0x438c, 0x40b9, 0x1fc0, 0x0291, 0x46e2, 0x432a, 0x4206, 0x2149, 0x06e2, 0xb218, 0xba0d, 0x3fc3, 0xbf68, 0x46c8, 0x4166, 0x437d, 0x41a0, 0xb00f, 0x26f5, 0x42b6, 0x466c, 0xaf14, 0xba28, 0x0364, 0x0f78, 0xa3a4, 0xbf6e, 0x4572, 0xb2fe, 0xb046, 0x413c, 0xbaf3, 0x4370, 0x4005, 0x2268, 0x42af, 0x4278, 0x4089, 0x439f, 0xbfd6, 0xaed2, 0x4305, 0xb2e2, 0xb2f6, 0xbf18, 0x42a3, 0x1ee9, 0x41bc, 0x1d48, 0x4313, 0xa6e2, 0x407a, 0xb09e, 0x459c, 0xb24b, 0xb015, 0xaa03, 0x18b9, 0xacea, 0x1e86, 0x4169, 0xbfc8, 0x1f6a, 0x4396, 0x347f, 0x182d, 0x3184, 0xba54, 0x221f, 0x40d0, 0x337e, 0x4272, 0x40c0, 0xb0de, 0x430d, 0x4105, 0x315e, 0x11cc, 0xbf90, 0x228a, 0x4273, 0xbada, 0x006d, 0xbf2a, 0x4334, 0x18c8, 0xb2d9, 0x1cf8, 0xba7c, 0xbaef, 0x4461, 0x2973, 0x2d26, 0x4042, 0xaba4, 0x4186, 0xb05c, 0xbfd4, 0x4254, 0x1e78, 0x4643, 0xb29a, 0x427a, 0x4370, 0x1f71, 0x419a, 0xa4c1, 0x07c9, 0xbf80, 0x3f05, 0x405f, 0x3150, 0xbf37, 0x40ce, 0xba27, 0xb2a0, 0x2398, 0xbfca, 0x43e4, 0xaa17, 0xba74, 0xb0d6, 0xb08f, 0x42c9, 0x42cd, 0xb224, 0x1ccf, 0xafbc, 0x4060, 0xb0f5, 0x423d, 0x43c4, 0xb2fc, 0xbac2, 0x4017, 0xb265, 0x431a, 0xbfca, 0x43a8, 0x415f, 0x40ff, 0xb0d7, 0xbae4, 0x1b93, 0xb2e9, 0x1a43, 0x28ac, 0x427c, 0xb215, 0x4017, 0xbf3d, 0xb2d0, 0x42be, 0x1d8f, 0x447c, 0x40ec, 0xba4e, 0x1910, 0xb041, 0x1fdd, 0x41b7, 0x40c9, 0x42c8, 0xbf60, 0x404f, 0xb27d, 0x4661, 0x4399, 0x43eb, 0xb20a, 0x460b, 0x1c22, 0xb26f, 0xbae0, 0xbff0, 0x421f, 0x1f27, 0x4264, 0x4290, 0xbf93, 0xb2a4, 0xb2a7, 0xbaff, 0xad42, 0x4391, 0xba27, 0x40f4, 0xbfd6, 0x42f8, 0x429f, 0x03c8, 0x40c6, 0x32d1, 0x40c8, 0xaf82, 0x02cf, 0x046b, 0x4285, 0x4291, 0xba45, 0xbadd, 0x40f2, 0x33e6, 0xba09, 0xba1e, 0x4607, 0x45d9, 0x4453, 0xb00d, 0x4222, 0x40b0, 0xbf19, 0xb20c, 0x1ab7, 0x41dc, 0x439e, 0x4221, 0x1f89, 0x400c, 0xb288, 0x42f2, 0x4543, 0x3d97, 0x43e3, 0xba58, 0xaa3d, 0x42d0, 0x1870, 0x26b1, 0xbfab, 0x4112, 0x42d9, 0x467c, 0x4052, 0x4631, 0xb286, 0xbf5e, 0x43c5, 0x44d0, 0x2fb1, 0x43b3, 0xb2ea, 0x1d46, 0x4076, 0x415a, 0x3bbe, 0xbf03, 0x0812, 0x2d4f, 0x1f62, 0x4322, 0x0a58, 0x40e4, 0x1fcd, 0xba52, 0x15b6, 0x43b0, 0x43a0, 0x400a, 0x4303, 0x4297, 0x40e7, 0xb0cf, 0x43e8, 0x15c1, 0x4134, 0x4248, 0x4576, 0x0870, 0x01c4, 0xbf63, 0xbac5, 0x42cd, 0x437d, 0x43e7, 0xb261, 0x42e2, 0xbf18, 0xbac0, 0x4037, 0x40d0, 0x1c84, 0x4149, 0xbf80, 0xb2c6, 0xbfe0, 0x30f1, 0xa467, 0x2e0e, 0xbf6b, 0x46e2, 0x4216, 0x43df, 0x1ab8, 0xbf23, 0x46d3, 0xba71, 0xb208, 0x099f, 0xbf60, 0xba1f, 0x40a5, 0x42d4, 0x21cb, 0x1ffd, 0x40c9, 0x42dc, 0x15f1, 0x279d, 0x2437, 0x0cea, 0xbfdd, 0xbae4, 0x438b, 0x4378, 0x463c, 0x0a74, 0x4005, 0xba1e, 0x41d7, 0x4481, 0x4274, 0x45da, 0xbf46, 0xb0e9, 0x3f19, 0x1bb1, 0x4581, 0x42ce, 0xb2df, 0xba6f, 0xb22f, 0x343f, 0x40d8, 0xae4d, 0x4225, 0x404d, 0x3748, 0x4641, 0x1924, 0xba34, 0xbf27, 0x42ba, 0x1e38, 0x40c4, 0x1e29, 0xbfb8, 0xa804, 0xbaf2, 0xbaec, 0x411a, 0x42e3, 0x402b, 0x404a, 0x4654, 0x403c, 0x229e, 0x4343, 0x4278, 0x420e, 0x414e, 0x1b28, 0x1ec8, 0x4137, 0xbf74, 0x4132, 0x40db, 0xba2b, 0x424e, 0x400f, 0x4342, 0xa268, 0x45cc, 0x41a1, 0xb210, 0x1e13, 0xba32, 0x405f, 0x4070, 0x40a8, 0x4495, 0xaf59, 0x1a8a, 0x4335, 0x1aaf, 0xa0de, 0x4557, 0x429b, 0xbf2b, 0x1a1f, 0xb24a, 0x20ba, 0x4026, 0x4426, 0x415d, 0xba49, 0x1a0f, 0xa6ba, 0x408e, 0xba37, 0xb067, 0xa1be, 0x43f0, 0xb26f, 0x06e2, 0x4101, 0x424b, 0xb004, 0x17fe, 0x417d, 0x4053, 0x133e, 0xbfa1, 0xa51b, 0xaf80, 0x43e6, 0x4031, 0x0893, 0x42a2, 0x113a, 0xbf86, 0xb211, 0xb2e9, 0x1955, 0xb2e0, 0x4249, 0x1fee, 0x43bf, 0x1f72, 0xb29c, 0x41ce, 0x1c6c, 0x1ac1, 0x4216, 0x4309, 0xbf90, 0x4176, 0x4114, 0x0c13, 0xb22a, 0x10be, 0x4293, 0x1255, 0x40dd, 0x1f80, 0xba69, 0xb298, 0x430c, 0x3114, 0xbfc2, 0x4209, 0x4682, 0x4160, 0x461f, 0x4003, 0x4104, 0x27e8, 0xb27f, 0x13b2, 0x4034, 0x061d, 0xb093, 0x30b2, 0x4252, 0xa0b3, 0xa03e, 0x4489, 0x4458, 0xbad3, 0xbf2e, 0x4301, 0x401f, 0x40ed, 0xba6c, 0x41bf, 0xb017, 0xbf5b, 0x4549, 0x4316, 0xb2ac, 0x2a29, 0x19a6, 0x437d, 0xaba0, 0x3226, 0xa26e, 0x1bde, 0x4143, 0x40a4, 0x46ac, 0x420e, 0x43d6, 0x40d2, 0x40e5, 0x059e, 0x41eb, 0xbfb2, 0xaf76, 0x4194, 0x425c, 0x3ca9, 0xbafa, 0x1cd4, 0x40b9, 0xb29b, 0x439a, 0x3586, 0xb28f, 0x43a5, 0x438b, 0x45ad, 0xb200, 0xbf90, 0x387c, 0x1693, 0x40a5, 0x43c8, 0x065e, 0x37af, 0xbf55, 0x4319, 0x41ee, 0x1ee5, 0x1d3e, 0x43f1, 0x1d52, 0x462d, 0x0129, 0xbae8, 0x4613, 0x1d81, 0x2a54, 0xba46, 0x432c, 0x101c, 0xb29a, 0x42c2, 0xbfd0, 0x2520, 0x32e6, 0xba32, 0xba5a, 0x40ef, 0xbf70, 0xa438, 0xbf48, 0x42cf, 0x4220, 0x40f8, 0x0b4e, 0x434e, 0x1909, 0x417e, 0x42ee, 0xbf02, 0xbfd0, 0x157f, 0x408d, 0x42dc, 0xba68, 0xb219, 0xb075, 0xbfa5, 0x2f93, 0x1fb8, 0x40f1, 0xb240, 0xb2b3, 0x2097, 0x42f4, 0x188b, 0xb0e8, 0x4326, 0x4157, 0x2694, 0x404c, 0xbaf8, 0x431a, 0x4308, 0x2760, 0x359d, 0xb290, 0x1cc4, 0x4133, 0x1771, 0x408f, 0x4159, 0xba63, 0x4222, 0xbf7d, 0x44f8, 0x4088, 0xbad6, 0x0287, 0x4770, 0xe7fe + ], + StartRegs = [0x8f725d16, 0x8f2d1fe5, 0xd2b28a66, 0x47a47346, 0xc0b4401b, 0xf8e7fb12, 0x4ba63b76, 0xa9e6ad4c, 0xa1d2cdf2, 0x35a0c989, 0xc174909a, 0x846af94c, 0xe89071ad, 0x3db39c20, 0x00000000, 0x000001f0 + ], + FinalRegs = [0x0000414c, 0x00000000, 0x0000414c, 0x00004f41, 0x0000414f, 0x000000bd, 0x00004c41, 0x00000060, 0x08d61086, 0x35a0d48c, 0x00000000, 0x846afcc2, 0x00000000, 0x17fffbb8, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xbafe, 0xb286, 0x0988, 0xb25a, 0x4061, 0x1ed9, 0x4663, 0x430f, 0xb280, 0x2590, 0xb0a2, 0x43b0, 0x0a42, 0xa6b5, 0x4171, 0x3320, 0x4145, 0xb286, 0xba32, 0x1307, 0xbf7c, 0x435e, 0x1bc9, 0x41ff, 0x1e42, 0xb09a, 0x444e, 0x40b1, 0x4016, 0xbaca, 0x411c, 0x2fb8, 0x431a, 0xbf01, 0x4360, 0x41d8, 0x1e44, 0x1331, 0x3c8c, 0xb04e, 0x4296, 0x4548, 0xbf2e, 0x2139, 0x403d, 0x197a, 0xbf90, 0x1c14, 0x4472, 0x3fa6, 0x0f32, 0x21ac, 0x407e, 0xbaf8, 0xb255, 0xba53, 0x1b89, 0xbf65, 0x18ef, 0xba18, 0x405b, 0xb0bd, 0x0ebd, 0xb204, 0xba30, 0x413b, 0x4143, 0x4316, 0x41e9, 0x4367, 0x41c5, 0x1673, 0x103e, 0x09a5, 0x2ef0, 0xb263, 0x43e6, 0x42ec, 0x1c44, 0x082b, 0x45c5, 0x439b, 0xb2e9, 0xa969, 0xbf7b, 0xbfd0, 0x438b, 0x4132, 0xb0ec, 0x431b, 0x34ab, 0x0f49, 0xa401, 0x4124, 0xacc3, 0x4314, 0x1cf2, 0x3c2e, 0x309c, 0xb0be, 0xb0a3, 0x40e6, 0x4314, 0x41ab, 0x122b, 0xb2c2, 0x13c9, 0x423d, 0x423e, 0xbfce, 0x4175, 0xaa5d, 0x0876, 0x1c1c, 0xbad3, 0x4248, 0xb298, 0x0069, 0x16ba, 0x40c0, 0xbfc1, 0x43c4, 0x17a8, 0xa13f, 0x41a8, 0x40d6, 0x4680, 0x4319, 0xba2a, 0x44b8, 0x4470, 0xb0c8, 0xbf6d, 0x4303, 0x1c1a, 0x439b, 0xb271, 0xba0b, 0xb236, 0x41a2, 0x4071, 0x431e, 0x395c, 0xadd7, 0xba48, 0x4163, 0x40ee, 0x4195, 0x2da0, 0x19e4, 0x32b4, 0xb2ca, 0xb0b7, 0x45f5, 0xbfbd, 0x3c50, 0x23c9, 0x2092, 0x4424, 0x410a, 0x40d8, 0x43ee, 0xb2a8, 0x1d9f, 0x416e, 0x418c, 0x3fb8, 0x1557, 0xbac8, 0x4659, 0x4131, 0x0f9d, 0x434f, 0xb2a4, 0x41b5, 0xb2a8, 0xbf6c, 0x415e, 0xbacf, 0xb2f5, 0xb20a, 0xb059, 0xbaf2, 0x4003, 0x0bf5, 0x40b9, 0x4480, 0x0151, 0x0a9f, 0x4269, 0x439f, 0xb029, 0x4224, 0x04a3, 0x4365, 0x4071, 0x4630, 0x2d00, 0x4436, 0x1904, 0x3861, 0xbf71, 0x198a, 0xb2ad, 0x0641, 0x3aad, 0x425e, 0xb2e0, 0x00d3, 0xb030, 0xbf78, 0x4089, 0xba44, 0x1789, 0x0fb3, 0x45ba, 0xb2dc, 0xbf3a, 0x186d, 0x42c9, 0x432b, 0xb2ea, 0xb0cf, 0x42d5, 0xb22c, 0xb21e, 0x2355, 0xba01, 0xa56e, 0x41fd, 0xbad1, 0x2bcf, 0x1b37, 0xb2a4, 0x411f, 0x4018, 0x4342, 0x20f4, 0x43c4, 0x43be, 0xbfa1, 0x4139, 0x468b, 0x42c4, 0x1b6e, 0x21aa, 0x42a3, 0xb0cd, 0xb0d2, 0x431e, 0x431d, 0xbfa0, 0x428d, 0x35d6, 0xbf32, 0xae52, 0x431c, 0x1e62, 0xbaf6, 0x4099, 0xb015, 0x4122, 0x19f9, 0x01c1, 0xb2ef, 0xa849, 0x2614, 0xb24a, 0x02c0, 0x43ec, 0x0216, 0x42a0, 0x42c1, 0x43e2, 0x43d9, 0x1ae7, 0x1285, 0xb23e, 0x1d33, 0x187a, 0x3872, 0x4661, 0x3d9c, 0xbfaa, 0x4033, 0x4089, 0x41c3, 0x328b, 0x43d5, 0xb2ab, 0x06f1, 0xbaf9, 0x432e, 0x3160, 0x416a, 0x2c76, 0x4232, 0xbfe8, 0xbf70, 0xbf4f, 0xb20a, 0xb29a, 0x16b0, 0xb2f3, 0xb02f, 0x1ed3, 0x42e1, 0x44f8, 0xb279, 0xba78, 0xbff0, 0xb2ae, 0x433e, 0x388b, 0x3cac, 0xbf3f, 0xb2ab, 0x31d8, 0x34a0, 0xaa1a, 0xb22d, 0x3df9, 0xb28a, 0x43d6, 0x37ab, 0xb228, 0xbf1b, 0x41d9, 0x062a, 0xb256, 0x1c7f, 0xa48c, 0x441d, 0x403b, 0x20fc, 0x1841, 0x4260, 0xb280, 0xbfb0, 0x41ee, 0x4340, 0xb0dc, 0x415d, 0x41c7, 0x41c2, 0x4565, 0xb239, 0xba36, 0x435e, 0xb2c3, 0x0432, 0x434a, 0xbfd7, 0x4127, 0x26c1, 0x38e4, 0x4210, 0x400c, 0xb0ac, 0x46f9, 0xba4d, 0x4331, 0x2faf, 0x4088, 0x4014, 0x2e91, 0x42e5, 0xb0dc, 0xbfb3, 0x0e14, 0x42b4, 0xb251, 0x45a4, 0xbf13, 0x4460, 0xba07, 0x2702, 0x406e, 0xbfc0, 0x40d8, 0x3d8d, 0xb231, 0xb067, 0xb0cf, 0xba32, 0x4334, 0x29fc, 0x4051, 0x4068, 0x4617, 0x361f, 0x4013, 0x42c3, 0x1ff9, 0x437f, 0xba51, 0xb24f, 0x4150, 0xbf4f, 0xb2b8, 0x1a70, 0xaf84, 0x410e, 0xb207, 0x4041, 0x42f2, 0x4637, 0x00ae, 0x41b1, 0x411f, 0x4333, 0x41ae, 0x1d1b, 0xbf5b, 0x4313, 0x393e, 0xb277, 0xbfc0, 0x4103, 0x18c6, 0xae36, 0x429a, 0x42c7, 0x464b, 0x1569, 0x035a, 0x41c4, 0x3350, 0x209f, 0x43c8, 0x416e, 0x4305, 0x1daa, 0x43a6, 0x4325, 0x4248, 0x3079, 0xbf01, 0x4072, 0xafc0, 0xb299, 0x42a7, 0x422d, 0x40f4, 0xb2d7, 0xb2d8, 0xb006, 0x4318, 0xbf61, 0xb2c3, 0x2017, 0x4172, 0xa800, 0x43b6, 0xba42, 0x4367, 0x43a3, 0xb08f, 0x4267, 0x43c8, 0xb0f0, 0x0970, 0xbacc, 0x1b86, 0x4177, 0x439a, 0x41ce, 0x4053, 0x4307, 0xb29b, 0x3708, 0xb29f, 0x25a5, 0xb279, 0x4329, 0xb2df, 0xbf3c, 0x40c9, 0x435c, 0xbfd9, 0x4180, 0x01f8, 0x37cd, 0x4087, 0xbf80, 0x41fb, 0x43c3, 0xba0f, 0xb214, 0x1f01, 0x43e2, 0xbf28, 0xb2ce, 0x4181, 0x19db, 0x4124, 0xbff0, 0x170e, 0xb078, 0x41d6, 0x4325, 0x4033, 0xba21, 0x42b9, 0x15d9, 0x42c2, 0x0491, 0x42b1, 0x40c8, 0xba19, 0x4411, 0xbae6, 0xbac3, 0xbf61, 0x427b, 0x4341, 0xb2ba, 0xb233, 0xb2fa, 0x40c7, 0xb0b5, 0xb2b9, 0xb23a, 0x433a, 0x418e, 0xb240, 0xbf3d, 0x12df, 0x405d, 0x0bfe, 0x1c0d, 0xbff0, 0xb2a2, 0x42dc, 0x08fb, 0x42c4, 0x4129, 0x1eee, 0xba63, 0x41f4, 0xbfdd, 0x4239, 0xa32e, 0xbac6, 0x41dc, 0x1a05, 0x41dc, 0x3616, 0x4401, 0x40da, 0x4278, 0x15fd, 0x19be, 0xafdf, 0xada3, 0xbf22, 0x0b84, 0xbf90, 0x4558, 0x425f, 0x12b9, 0x42de, 0x43a1, 0x31dc, 0x1fb3, 0x1f66, 0x4313, 0x0dee, 0xa10b, 0x4272, 0x0ff7, 0x40cf, 0xbfb0, 0x4614, 0x4263, 0xbfd7, 0xa80c, 0x43d9, 0x4690, 0xba05, 0x40b9, 0x1a89, 0x3326, 0x43eb, 0x0377, 0x43f4, 0x4182, 0xb066, 0x25ac, 0x4076, 0x1848, 0x02ff, 0xbf2b, 0xb291, 0x4646, 0xa320, 0xb077, 0x41b0, 0x412b, 0x422b, 0x0c68, 0xbf62, 0x4139, 0x413d, 0x2f7a, 0x41a3, 0x417e, 0xb0c1, 0x3b6a, 0xb0d5, 0xb2a6, 0x43ef, 0x1a5e, 0x1de5, 0x4215, 0x211f, 0xbfd5, 0x1f96, 0x4694, 0x05d2, 0x2a85, 0x4460, 0x4180, 0x41bc, 0x30a7, 0x419a, 0x401d, 0x26d1, 0xb009, 0x4267, 0x40f1, 0x413e, 0xae3b, 0x4351, 0xa082, 0x3aec, 0xbf49, 0x42b4, 0x3cdf, 0xb031, 0xb225, 0xbf90, 0xb21e, 0xa23e, 0x3d65, 0x2014, 0xa8dc, 0xba0c, 0x4217, 0x17df, 0x4234, 0x18ea, 0x41f5, 0x0639, 0x45e4, 0x34d4, 0x4207, 0x0eb1, 0x421c, 0x408c, 0x405e, 0xa02e, 0xb273, 0x4109, 0x0240, 0x42a9, 0xbfcf, 0x0d28, 0x43ce, 0x2281, 0x430e, 0x2cde, 0xb08c, 0x4013, 0x165a, 0xb0db, 0xad8f, 0x3ed1, 0x111b, 0x461d, 0x08fb, 0x4074, 0x4076, 0x4030, 0x41a4, 0xb210, 0x144d, 0x24dc, 0x4063, 0x1890, 0x4313, 0x38c2, 0x416f, 0xbfc9, 0x270d, 0xb276, 0x4308, 0x1f80, 0x2858, 0x3b1a, 0x397f, 0x3b6e, 0x19f9, 0x43b3, 0x4249, 0xb2c7, 0x1f5a, 0xba0f, 0x42f8, 0xbfc3, 0xb09c, 0x1cc4, 0xa140, 0x4315, 0x4080, 0xb22d, 0x437d, 0x461f, 0xbada, 0x41af, 0xbf3c, 0x306b, 0x43ce, 0xb244, 0xba73, 0x4193, 0x400a, 0x1af3, 0x403f, 0xb26e, 0x1bee, 0x43a8, 0xba08, 0x400d, 0x4215, 0x3529, 0xba5b, 0x2623, 0xba16, 0x4025, 0x40d8, 0x43e9, 0x4225, 0x4112, 0xb2f4, 0x41db, 0x1c09, 0x1ece, 0xbf27, 0x1ac8, 0x4338, 0x4015, 0x4299, 0x4094, 0x4662, 0xba14, 0x43bd, 0x4082, 0x0e05, 0x40c2, 0x413e, 0x43bb, 0x42a6, 0x4146, 0x0cc0, 0x1a0b, 0x1c27, 0x4104, 0xbf93, 0x2799, 0x46ed, 0x1c30, 0xbfc0, 0x422b, 0xa622, 0x1866, 0x15a6, 0xbf80, 0x4334, 0x4060, 0x07a4, 0x14d3, 0xa26f, 0xbae9, 0xbf44, 0x4033, 0xba7e, 0xad85, 0x4045, 0x1bc4, 0x43b8, 0x43ed, 0x10c5, 0x4200, 0x4330, 0x44cd, 0x36e3, 0x4004, 0x4114, 0x438e, 0xba11, 0x4297, 0x19b2, 0x4222, 0xa7bb, 0xbfb4, 0xb0db, 0xba70, 0x430d, 0x4017, 0x1848, 0x1390, 0x4078, 0x4204, 0x42df, 0xba34, 0x414f, 0x4353, 0x4205, 0x01ea, 0xb249, 0xbf17, 0x4208, 0x42a3, 0x456e, 0xba29, 0xbf32, 0x430b, 0x19a9, 0xb09a, 0x41e6, 0xb0a6, 0x401f, 0xa293, 0x40bc, 0x1df0, 0x40df, 0x3ec9, 0x063a, 0x4255, 0xba51, 0xbf34, 0x405f, 0xb0d1, 0x3863, 0x0052, 0x1541, 0xa37a, 0x429d, 0x4285, 0x2a8b, 0xbf8b, 0x429e, 0x1dc2, 0x4193, 0xb249, 0xb0fe, 0x4135, 0x1864, 0xa8fd, 0xbfc0, 0x23fa, 0x4029, 0xb2b7, 0x4319, 0x408a, 0x4315, 0x4221, 0x1257, 0xb041, 0x0dcb, 0xbfb3, 0x4262, 0xb293, 0xbac4, 0xb20c, 0xa4ca, 0xbad8, 0x4215, 0x4188, 0x401a, 0x1a27, 0x41ce, 0xb282, 0x0e98, 0x4075, 0x40a9, 0xbafe, 0x3362, 0xb25e, 0x4165, 0x1cb7, 0x4025, 0x374e, 0xb2ac, 0x1b9c, 0xb28a, 0xbacb, 0xbf57, 0x2d7c, 0xb010, 0xa274, 0x3dab, 0x41a6, 0x44b9, 0x3456, 0xa547, 0x4304, 0x4056, 0x4359, 0x1e93, 0x416e, 0x4009, 0xba31, 0xbf6f, 0x410e, 0x40ac, 0x1854, 0xb0c6, 0xba4c, 0xa9db, 0xb2c3, 0x1cc0, 0x053b, 0xbf51, 0x04d7, 0x44f3, 0x4598, 0x4157, 0x4483, 0xb2f7, 0xbf5a, 0x40f9, 0x4075, 0xa00f, 0xbae4, 0xb0d9, 0x3a47, 0xbaec, 0x43b8, 0xb28f, 0x4308, 0xa8af, 0x4159, 0xb2c7, 0x4025, 0x2d96, 0x406f, 0xb28e, 0xb0e9, 0xbf44, 0xb2ba, 0x4236, 0x0e9d, 0x43cf, 0x420d, 0xb2f9, 0xb228, 0xb038, 0x42de, 0xb283, 0x43a7, 0x013a, 0xba3d, 0xb208, 0xa6da, 0x44fa, 0xb2cf, 0x3eb1, 0x1b4e, 0x404b, 0xbf60, 0xb2ae, 0x43a6, 0x44cb, 0x4297, 0xa637, 0x403f, 0xbfd8, 0xbfe0, 0x40ee, 0x41ed, 0x407c, 0x1927, 0x1c96, 0x4239, 0x19b4, 0xb25c, 0xbf3d, 0x20cf, 0xb025, 0xb2a8, 0x1849, 0x297d, 0x427e, 0x15b8, 0x42df, 0x4050, 0xb2fa, 0x4151, 0xbf3d, 0x267a, 0xb23f, 0x4098, 0x42cf, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xc83b3c92, 0xbd911bb4, 0xd5a5a9bb, 0xeab26e45, 0xe6aa6cea, 0xa200e8c6, 0x4e453677, 0x79cc53e1, 0x299e08fa, 0xe4a48c55, 0x96623e63, 0x103ae3c6, 0x15c81382, 0xac554abf, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0x00000000, 0x000001fd, 0x000000fe, 0x000000fd, 0xfffffffd, 0xff5e0000, 0x0000007a, 0x000043fe, 0xbfc51110, 0x00001384, 0x966255f3, 0x00004087, 0xfffffea7, 0xac554d4d, 0x00000000, 0x000001d0 }, + Instructions = [0xbafe, 0xb286, 0x0988, 0xb25a, 0x4061, 0x1ed9, 0x4663, 0x430f, 0xb280, 0x2590, 0xb0a2, 0x43b0, 0x0a42, 0xa6b5, 0x4171, 0x3320, 0x4145, 0xb286, 0xba32, 0x1307, 0xbf7c, 0x435e, 0x1bc9, 0x41ff, 0x1e42, 0xb09a, 0x444e, 0x40b1, 0x4016, 0xbaca, 0x411c, 0x2fb8, 0x431a, 0xbf01, 0x4360, 0x41d8, 0x1e44, 0x1331, 0x3c8c, 0xb04e, 0x4296, 0x4548, 0xbf2e, 0x2139, 0x403d, 0x197a, 0xbf90, 0x1c14, 0x4472, 0x3fa6, 0x0f32, 0x21ac, 0x407e, 0xbaf8, 0xb255, 0xba53, 0x1b89, 0xbf65, 0x18ef, 0xba18, 0x405b, 0xb0bd, 0x0ebd, 0xb204, 0xba30, 0x413b, 0x4143, 0x4316, 0x41e9, 0x4367, 0x41c5, 0x1673, 0x103e, 0x09a5, 0x2ef0, 0xb263, 0x43e6, 0x42ec, 0x1c44, 0x082b, 0x45c5, 0x439b, 0xb2e9, 0xa969, 0xbf7b, 0xbfd0, 0x438b, 0x4132, 0xb0ec, 0x431b, 0x34ab, 0x0f49, 0xa401, 0x4124, 0xacc3, 0x4314, 0x1cf2, 0x3c2e, 0x309c, 0xb0be, 0xb0a3, 0x40e6, 0x4314, 0x41ab, 0x122b, 0xb2c2, 0x13c9, 0x423d, 0x423e, 0xbfce, 0x4175, 0xaa5d, 0x0876, 0x1c1c, 0xbad3, 0x4248, 0xb298, 0x0069, 0x16ba, 0x40c0, 0xbfc1, 0x43c4, 0x17a8, 0xa13f, 0x41a8, 0x40d6, 0x4680, 0x4319, 0xba2a, 0x44b8, 0x4470, 0xb0c8, 0xbf6d, 0x4303, 0x1c1a, 0x439b, 0xb271, 0xba0b, 0xb236, 0x41a2, 0x4071, 0x431e, 0x395c, 0xadd7, 0xba48, 0x4163, 0x40ee, 0x4195, 0x2da0, 0x19e4, 0x32b4, 0xb2ca, 0xb0b7, 0x45f5, 0xbfbd, 0x3c50, 0x23c9, 0x2092, 0x4424, 0x410a, 0x40d8, 0x43ee, 0xb2a8, 0x1d9f, 0x416e, 0x418c, 0x3fb8, 0x1557, 0xbac8, 0x4659, 0x4131, 0x0f9d, 0x434f, 0xb2a4, 0x41b5, 0xb2a8, 0xbf6c, 0x415e, 0xbacf, 0xb2f5, 0xb20a, 0xb059, 0xbaf2, 0x4003, 0x0bf5, 0x40b9, 0x4480, 0x0151, 0x0a9f, 0x4269, 0x439f, 0xb029, 0x4224, 0x04a3, 0x4365, 0x4071, 0x4630, 0x2d00, 0x4436, 0x1904, 0x3861, 0xbf71, 0x198a, 0xb2ad, 0x0641, 0x3aad, 0x425e, 0xb2e0, 0x00d3, 0xb030, 0xbf78, 0x4089, 0xba44, 0x1789, 0x0fb3, 0x45ba, 0xb2dc, 0xbf3a, 0x186d, 0x42c9, 0x432b, 0xb2ea, 0xb0cf, 0x42d5, 0xb22c, 0xb21e, 0x2355, 0xba01, 0xa56e, 0x41fd, 0xbad1, 0x2bcf, 0x1b37, 0xb2a4, 0x411f, 0x4018, 0x4342, 0x20f4, 0x43c4, 0x43be, 0xbfa1, 0x4139, 0x468b, 0x42c4, 0x1b6e, 0x21aa, 0x42a3, 0xb0cd, 0xb0d2, 0x431e, 0x431d, 0xbfa0, 0x428d, 0x35d6, 0xbf32, 0xae52, 0x431c, 0x1e62, 0xbaf6, 0x4099, 0xb015, 0x4122, 0x19f9, 0x01c1, 0xb2ef, 0xa849, 0x2614, 0xb24a, 0x02c0, 0x43ec, 0x0216, 0x42a0, 0x42c1, 0x43e2, 0x43d9, 0x1ae7, 0x1285, 0xb23e, 0x1d33, 0x187a, 0x3872, 0x4661, 0x3d9c, 0xbfaa, 0x4033, 0x4089, 0x41c3, 0x328b, 0x43d5, 0xb2ab, 0x06f1, 0xbaf9, 0x432e, 0x3160, 0x416a, 0x2c76, 0x4232, 0xbfe8, 0xbf70, 0xbf4f, 0xb20a, 0xb29a, 0x16b0, 0xb2f3, 0xb02f, 0x1ed3, 0x42e1, 0x44f8, 0xb279, 0xba78, 0xbff0, 0xb2ae, 0x433e, 0x388b, 0x3cac, 0xbf3f, 0xb2ab, 0x31d8, 0x34a0, 0xaa1a, 0xb22d, 0x3df9, 0xb28a, 0x43d6, 0x37ab, 0xb228, 0xbf1b, 0x41d9, 0x062a, 0xb256, 0x1c7f, 0xa48c, 0x441d, 0x403b, 0x20fc, 0x1841, 0x4260, 0xb280, 0xbfb0, 0x41ee, 0x4340, 0xb0dc, 0x415d, 0x41c7, 0x41c2, 0x4565, 0xb239, 0xba36, 0x435e, 0xb2c3, 0x0432, 0x434a, 0xbfd7, 0x4127, 0x26c1, 0x38e4, 0x4210, 0x400c, 0xb0ac, 0x46f9, 0xba4d, 0x4331, 0x2faf, 0x4088, 0x4014, 0x2e91, 0x42e5, 0xb0dc, 0xbfb3, 0x0e14, 0x42b4, 0xb251, 0x45a4, 0xbf13, 0x4460, 0xba07, 0x2702, 0x406e, 0xbfc0, 0x40d8, 0x3d8d, 0xb231, 0xb067, 0xb0cf, 0xba32, 0x4334, 0x29fc, 0x4051, 0x4068, 0x4617, 0x361f, 0x4013, 0x42c3, 0x1ff9, 0x437f, 0xba51, 0xb24f, 0x4150, 0xbf4f, 0xb2b8, 0x1a70, 0xaf84, 0x410e, 0xb207, 0x4041, 0x42f2, 0x4637, 0x00ae, 0x41b1, 0x411f, 0x4333, 0x41ae, 0x1d1b, 0xbf5b, 0x4313, 0x393e, 0xb277, 0xbfc0, 0x4103, 0x18c6, 0xae36, 0x429a, 0x42c7, 0x464b, 0x1569, 0x035a, 0x41c4, 0x3350, 0x209f, 0x43c8, 0x416e, 0x4305, 0x1daa, 0x43a6, 0x4325, 0x4248, 0x3079, 0xbf01, 0x4072, 0xafc0, 0xb299, 0x42a7, 0x422d, 0x40f4, 0xb2d7, 0xb2d8, 0xb006, 0x4318, 0xbf61, 0xb2c3, 0x2017, 0x4172, 0xa800, 0x43b6, 0xba42, 0x4367, 0x43a3, 0xb08f, 0x4267, 0x43c8, 0xb0f0, 0x0970, 0xbacc, 0x1b86, 0x4177, 0x439a, 0x41ce, 0x4053, 0x4307, 0xb29b, 0x3708, 0xb29f, 0x25a5, 0xb279, 0x4329, 0xb2df, 0xbf3c, 0x40c9, 0x435c, 0xbfd9, 0x4180, 0x01f8, 0x37cd, 0x4087, 0xbf80, 0x41fb, 0x43c3, 0xba0f, 0xb214, 0x1f01, 0x43e2, 0xbf28, 0xb2ce, 0x4181, 0x19db, 0x4124, 0xbff0, 0x170e, 0xb078, 0x41d6, 0x4325, 0x4033, 0xba21, 0x42b9, 0x15d9, 0x42c2, 0x0491, 0x42b1, 0x40c8, 0xba19, 0x4411, 0xbae6, 0xbac3, 0xbf61, 0x427b, 0x4341, 0xb2ba, 0xb233, 0xb2fa, 0x40c7, 0xb0b5, 0xb2b9, 0xb23a, 0x433a, 0x418e, 0xb240, 0xbf3d, 0x12df, 0x405d, 0x0bfe, 0x1c0d, 0xbff0, 0xb2a2, 0x42dc, 0x08fb, 0x42c4, 0x4129, 0x1eee, 0xba63, 0x41f4, 0xbfdd, 0x4239, 0xa32e, 0xbac6, 0x41dc, 0x1a05, 0x41dc, 0x3616, 0x4401, 0x40da, 0x4278, 0x15fd, 0x19be, 0xafdf, 0xada3, 0xbf22, 0x0b84, 0xbf90, 0x4558, 0x425f, 0x12b9, 0x42de, 0x43a1, 0x31dc, 0x1fb3, 0x1f66, 0x4313, 0x0dee, 0xa10b, 0x4272, 0x0ff7, 0x40cf, 0xbfb0, 0x4614, 0x4263, 0xbfd7, 0xa80c, 0x43d9, 0x4690, 0xba05, 0x40b9, 0x1a89, 0x3326, 0x43eb, 0x0377, 0x43f4, 0x4182, 0xb066, 0x25ac, 0x4076, 0x1848, 0x02ff, 0xbf2b, 0xb291, 0x4646, 0xa320, 0xb077, 0x41b0, 0x412b, 0x422b, 0x0c68, 0xbf62, 0x4139, 0x413d, 0x2f7a, 0x41a3, 0x417e, 0xb0c1, 0x3b6a, 0xb0d5, 0xb2a6, 0x43ef, 0x1a5e, 0x1de5, 0x4215, 0x211f, 0xbfd5, 0x1f96, 0x4694, 0x05d2, 0x2a85, 0x4460, 0x4180, 0x41bc, 0x30a7, 0x419a, 0x401d, 0x26d1, 0xb009, 0x4267, 0x40f1, 0x413e, 0xae3b, 0x4351, 0xa082, 0x3aec, 0xbf49, 0x42b4, 0x3cdf, 0xb031, 0xb225, 0xbf90, 0xb21e, 0xa23e, 0x3d65, 0x2014, 0xa8dc, 0xba0c, 0x4217, 0x17df, 0x4234, 0x18ea, 0x41f5, 0x0639, 0x45e4, 0x34d4, 0x4207, 0x0eb1, 0x421c, 0x408c, 0x405e, 0xa02e, 0xb273, 0x4109, 0x0240, 0x42a9, 0xbfcf, 0x0d28, 0x43ce, 0x2281, 0x430e, 0x2cde, 0xb08c, 0x4013, 0x165a, 0xb0db, 0xad8f, 0x3ed1, 0x111b, 0x461d, 0x08fb, 0x4074, 0x4076, 0x4030, 0x41a4, 0xb210, 0x144d, 0x24dc, 0x4063, 0x1890, 0x4313, 0x38c2, 0x416f, 0xbfc9, 0x270d, 0xb276, 0x4308, 0x1f80, 0x2858, 0x3b1a, 0x397f, 0x3b6e, 0x19f9, 0x43b3, 0x4249, 0xb2c7, 0x1f5a, 0xba0f, 0x42f8, 0xbfc3, 0xb09c, 0x1cc4, 0xa140, 0x4315, 0x4080, 0xb22d, 0x437d, 0x461f, 0xbada, 0x41af, 0xbf3c, 0x306b, 0x43ce, 0xb244, 0xba73, 0x4193, 0x400a, 0x1af3, 0x403f, 0xb26e, 0x1bee, 0x43a8, 0xba08, 0x400d, 0x4215, 0x3529, 0xba5b, 0x2623, 0xba16, 0x4025, 0x40d8, 0x43e9, 0x4225, 0x4112, 0xb2f4, 0x41db, 0x1c09, 0x1ece, 0xbf27, 0x1ac8, 0x4338, 0x4015, 0x4299, 0x4094, 0x4662, 0xba14, 0x43bd, 0x4082, 0x0e05, 0x40c2, 0x413e, 0x43bb, 0x42a6, 0x4146, 0x0cc0, 0x1a0b, 0x1c27, 0x4104, 0xbf93, 0x2799, 0x46ed, 0x1c30, 0xbfc0, 0x422b, 0xa622, 0x1866, 0x15a6, 0xbf80, 0x4334, 0x4060, 0x07a4, 0x14d3, 0xa26f, 0xbae9, 0xbf44, 0x4033, 0xba7e, 0xad85, 0x4045, 0x1bc4, 0x43b8, 0x43ed, 0x10c5, 0x4200, 0x4330, 0x44cd, 0x36e3, 0x4004, 0x4114, 0x438e, 0xba11, 0x4297, 0x19b2, 0x4222, 0xa7bb, 0xbfb4, 0xb0db, 0xba70, 0x430d, 0x4017, 0x1848, 0x1390, 0x4078, 0x4204, 0x42df, 0xba34, 0x414f, 0x4353, 0x4205, 0x01ea, 0xb249, 0xbf17, 0x4208, 0x42a3, 0x456e, 0xba29, 0xbf32, 0x430b, 0x19a9, 0xb09a, 0x41e6, 0xb0a6, 0x401f, 0xa293, 0x40bc, 0x1df0, 0x40df, 0x3ec9, 0x063a, 0x4255, 0xba51, 0xbf34, 0x405f, 0xb0d1, 0x3863, 0x0052, 0x1541, 0xa37a, 0x429d, 0x4285, 0x2a8b, 0xbf8b, 0x429e, 0x1dc2, 0x4193, 0xb249, 0xb0fe, 0x4135, 0x1864, 0xa8fd, 0xbfc0, 0x23fa, 0x4029, 0xb2b7, 0x4319, 0x408a, 0x4315, 0x4221, 0x1257, 0xb041, 0x0dcb, 0xbfb3, 0x4262, 0xb293, 0xbac4, 0xb20c, 0xa4ca, 0xbad8, 0x4215, 0x4188, 0x401a, 0x1a27, 0x41ce, 0xb282, 0x0e98, 0x4075, 0x40a9, 0xbafe, 0x3362, 0xb25e, 0x4165, 0x1cb7, 0x4025, 0x374e, 0xb2ac, 0x1b9c, 0xb28a, 0xbacb, 0xbf57, 0x2d7c, 0xb010, 0xa274, 0x3dab, 0x41a6, 0x44b9, 0x3456, 0xa547, 0x4304, 0x4056, 0x4359, 0x1e93, 0x416e, 0x4009, 0xba31, 0xbf6f, 0x410e, 0x40ac, 0x1854, 0xb0c6, 0xba4c, 0xa9db, 0xb2c3, 0x1cc0, 0x053b, 0xbf51, 0x04d7, 0x44f3, 0x4598, 0x4157, 0x4483, 0xb2f7, 0xbf5a, 0x40f9, 0x4075, 0xa00f, 0xbae4, 0xb0d9, 0x3a47, 0xbaec, 0x43b8, 0xb28f, 0x4308, 0xa8af, 0x4159, 0xb2c7, 0x4025, 0x2d96, 0x406f, 0xb28e, 0xb0e9, 0xbf44, 0xb2ba, 0x4236, 0x0e9d, 0x43cf, 0x420d, 0xb2f9, 0xb228, 0xb038, 0x42de, 0xb283, 0x43a7, 0x013a, 0xba3d, 0xb208, 0xa6da, 0x44fa, 0xb2cf, 0x3eb1, 0x1b4e, 0x404b, 0xbf60, 0xb2ae, 0x43a6, 0x44cb, 0x4297, 0xa637, 0x403f, 0xbfd8, 0xbfe0, 0x40ee, 0x41ed, 0x407c, 0x1927, 0x1c96, 0x4239, 0x19b4, 0xb25c, 0xbf3d, 0x20cf, 0xb025, 0xb2a8, 0x1849, 0x297d, 0x427e, 0x15b8, 0x42df, 0x4050, 0xb2fa, 0x4151, 0xbf3d, 0x267a, 0xb23f, 0x4098, 0x42cf, 0x4770, 0xe7fe + ], + StartRegs = [0xc83b3c92, 0xbd911bb4, 0xd5a5a9bb, 0xeab26e45, 0xe6aa6cea, 0xa200e8c6, 0x4e453677, 0x79cc53e1, 0x299e08fa, 0xe4a48c55, 0x96623e63, 0x103ae3c6, 0x15c81382, 0xac554abf, 0x00000000, 0x900001f0 + ], + FinalRegs = [0x00000000, 0x000001fd, 0x000000fe, 0x000000fd, 0xfffffffd, 0xff5e0000, 0x0000007a, 0x000043fe, 0xbfc51110, 0x00001384, 0x966255f3, 0x00004087, 0xfffffea7, 0xac554d4d, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0xba07, 0x1e95, 0x30c3, 0x4194, 0x2be0, 0x1a8a, 0x404b, 0x4110, 0x4339, 0x444c, 0x46ec, 0xb2bb, 0xba43, 0x2218, 0x4228, 0x40af, 0xa05c, 0xb02b, 0xb297, 0xb2a6, 0x41fe, 0xbf38, 0x43f7, 0x43a4, 0x06aa, 0x41ce, 0x4586, 0x42ed, 0xbafd, 0xb020, 0x4274, 0xa264, 0x356c, 0x43f1, 0x3264, 0xac1d, 0xb252, 0x430b, 0xab27, 0xb2e9, 0xbf90, 0x1aea, 0xbfdb, 0x193b, 0x4338, 0x1bee, 0xb2c8, 0xbac2, 0x420f, 0xbf0d, 0x4206, 0xb266, 0x2a23, 0xbae6, 0x40ff, 0xbfb0, 0xb06e, 0x1a93, 0x1bfa, 0x3b77, 0x4167, 0x420b, 0xba05, 0x2a9d, 0xba3d, 0x431f, 0xba6f, 0x41e5, 0x406a, 0x307a, 0x4298, 0x41cc, 0xb202, 0xb0a0, 0xafbe, 0xbfde, 0x4625, 0x43f4, 0x1b22, 0x41c9, 0x0924, 0xbac1, 0x424e, 0x4024, 0xbf28, 0x4128, 0xb2f2, 0xa079, 0xb078, 0xb252, 0x2be8, 0x41f0, 0x4207, 0x035e, 0x42cc, 0x3a3d, 0x43d3, 0xb2ac, 0xb2e1, 0x40ec, 0xa1c3, 0xb0ae, 0xb226, 0x4084, 0xb0b4, 0xae1e, 0xb206, 0xbf2c, 0x3a9c, 0x42e1, 0x40a8, 0x0650, 0xbfe0, 0x1d2d, 0x1ddf, 0x40fe, 0xbaf2, 0x400a, 0x01fa, 0x1bc9, 0x45bc, 0x4111, 0x467b, 0x1255, 0xa90c, 0x422e, 0x1d2f, 0x00a2, 0x434f, 0x383d, 0x3bbd, 0x41b1, 0x42c7, 0xb2d2, 0x0a93, 0xbf73, 0x403d, 0xba68, 0x428b, 0xb087, 0x1943, 0x1ea1, 0x1cfe, 0x43b4, 0x1c92, 0xb215, 0x1ffa, 0xb20e, 0x40a8, 0x0631, 0xb2fe, 0x42fb, 0x4690, 0xb2e8, 0x411b, 0xa461, 0x415d, 0xb0dd, 0xbfdc, 0xbac6, 0x40b3, 0xb269, 0xb2c0, 0x10c9, 0xbac9, 0xba5d, 0x40c1, 0xbf6e, 0xa5fa, 0x1681, 0xb0da, 0x1f93, 0xb20c, 0x4624, 0xb067, 0x414c, 0x179d, 0xba2a, 0x41f6, 0x4320, 0xbf90, 0x430e, 0x45b1, 0x4008, 0x4273, 0x1619, 0xbf18, 0x093d, 0x42f5, 0x101c, 0x408e, 0xb2a8, 0x4068, 0xba64, 0x1b43, 0x445e, 0x4130, 0x424f, 0x1af2, 0xb2a9, 0xb2c7, 0x1aeb, 0x0e84, 0xb2fc, 0x42a0, 0x06a4, 0x408a, 0xbf8f, 0x40e0, 0xbf70, 0x4673, 0x3809, 0x432d, 0x4011, 0x41de, 0xb03e, 0x42e6, 0xbaf3, 0xb0ef, 0x40e5, 0x4616, 0x40e3, 0x445b, 0xbf60, 0x46d3, 0x41a9, 0x4012, 0x189d, 0xba3b, 0x42ea, 0x418b, 0xbfba, 0x4306, 0x4106, 0x4177, 0x1a98, 0x1fa5, 0x4220, 0x466e, 0xb272, 0x42ab, 0xae2c, 0x41d9, 0x4335, 0x400a, 0xbf80, 0x34cf, 0x060e, 0xb233, 0xba1c, 0x2797, 0xb0a7, 0x446d, 0xb265, 0xadc0, 0xaf88, 0xbf5b, 0x418b, 0x40b3, 0xa037, 0x40fc, 0x4186, 0x4294, 0x43d1, 0x415d, 0x43a0, 0x438f, 0xbf9e, 0x461d, 0x198d, 0x388a, 0xada6, 0x41f7, 0x4335, 0xb24f, 0x2507, 0x1d8e, 0xb29a, 0x1f43, 0x42d2, 0xbae6, 0x42de, 0xa28d, 0x1aeb, 0x43dd, 0x40f9, 0x4253, 0x22a2, 0xa9b0, 0xb232, 0xbacb, 0xba56, 0xa533, 0xba38, 0x4154, 0xba5c, 0xbf15, 0x35e5, 0xb2c0, 0x43ce, 0x0e9c, 0x46eb, 0xbfc0, 0x40eb, 0x44fc, 0x42f3, 0x4337, 0x439c, 0x1aa7, 0x435e, 0x4215, 0x0762, 0x4186, 0x403d, 0x41b2, 0xbf5a, 0x42dc, 0x4097, 0x40f6, 0xb284, 0xba73, 0x4648, 0x408f, 0x407a, 0x1cd9, 0x4446, 0x43aa, 0xbf12, 0x11a8, 0x4164, 0x11f9, 0xae18, 0xb0c6, 0xb0de, 0x43af, 0x405a, 0x4328, 0x4236, 0xace1, 0xa3a0, 0xa0ac, 0x1c62, 0x1dc2, 0x431e, 0xba78, 0x433c, 0x42f8, 0x467f, 0x102a, 0xba5f, 0x422f, 0x4168, 0x431e, 0xa297, 0xbf41, 0x1ac0, 0xb0c8, 0xb2b8, 0x4290, 0x1a1a, 0x2d4d, 0x409e, 0x1b2d, 0x430c, 0xbfe1, 0x41e9, 0xba38, 0x1dc3, 0x400f, 0xba5e, 0x4158, 0xb011, 0x43bb, 0x40f6, 0x1d74, 0xba3c, 0x1af3, 0x4607, 0x2a9a, 0x44c8, 0x40cd, 0x43cd, 0x4253, 0x0b40, 0x419c, 0x1afb, 0x405f, 0x1664, 0xb076, 0x3250, 0x3abc, 0x4282, 0x425d, 0xbf8a, 0xb0dc, 0x2556, 0x41d1, 0x4251, 0x4046, 0x14af, 0x1b2e, 0xb22f, 0x1cbc, 0xb21d, 0x401d, 0x18e1, 0x436a, 0xbfd3, 0x07d1, 0xb2df, 0x24c2, 0x416b, 0x1bd4, 0x1d69, 0x4172, 0x4049, 0x3a4d, 0xacb4, 0x19c2, 0x45a5, 0x1236, 0x2647, 0x3ed1, 0xb03f, 0x43f8, 0xac19, 0x41b9, 0xbf34, 0xba5f, 0xb23c, 0x238f, 0xba3e, 0x4630, 0x4376, 0xb263, 0xb261, 0x431e, 0x4069, 0x1a93, 0x407f, 0x4000, 0x40a3, 0x42c8, 0xbfd4, 0x4322, 0xb2e4, 0xb0ad, 0xb2e1, 0xb273, 0xb203, 0x4064, 0x43b4, 0x144b, 0x41a3, 0x4143, 0xacf2, 0xa4dc, 0xbfe2, 0x4101, 0x406d, 0x4075, 0xba34, 0xb0e0, 0x4010, 0xb247, 0x437a, 0x2989, 0x4375, 0x290c, 0x464a, 0x43b0, 0xb201, 0x4320, 0x4097, 0x2155, 0xaa34, 0x1967, 0xb211, 0x3a11, 0x1522, 0xba36, 0x1b4a, 0xbf6d, 0xb216, 0xb2e3, 0x1c04, 0xa4c9, 0x1b2f, 0xbfe0, 0x43bb, 0xb2af, 0xa800, 0xbf90, 0x4016, 0xba5e, 0xbf7c, 0x4193, 0x19a4, 0x1235, 0x0b1f, 0x429d, 0x2f62, 0x43d7, 0x4341, 0x2659, 0xba31, 0x094f, 0x44db, 0x4034, 0x418e, 0x1f48, 0x46a2, 0xba6a, 0xbf4d, 0xb23d, 0x404d, 0x4111, 0x0d4b, 0x40fd, 0x41d2, 0x403e, 0x30ee, 0xb26f, 0x1ebb, 0x4201, 0xa2a4, 0x402e, 0x40df, 0x2596, 0x4395, 0x2ab3, 0xb276, 0x4287, 0x14a6, 0x4313, 0xbf85, 0x1cc0, 0x46cc, 0x440b, 0x243b, 0x4123, 0x15af, 0x40ae, 0x4336, 0x41b3, 0xb207, 0x40b7, 0x40ea, 0x4288, 0xa9af, 0x40ae, 0x4173, 0x4293, 0x40a2, 0x2d32, 0x12f0, 0x4265, 0x339c, 0x2d1d, 0x4273, 0x4033, 0xb273, 0xa8dd, 0x4088, 0x4393, 0xbf85, 0x200b, 0xbfc0, 0x4370, 0x416a, 0xba73, 0xbafc, 0x40d6, 0xb20a, 0x09bc, 0x366a, 0x3509, 0xbf84, 0x2e0f, 0x419a, 0xb06a, 0x41cd, 0x4115, 0x433e, 0x1cdb, 0x42d0, 0x46f3, 0xb06c, 0x388e, 0x43b6, 0x41ed, 0x190c, 0x43ab, 0x1654, 0x4043, 0x427d, 0x0edd, 0x4022, 0xbaca, 0x0775, 0x18b0, 0xa255, 0xbfb9, 0x1cb8, 0x41c3, 0xb245, 0xa4a7, 0x07dd, 0x37c1, 0x41fb, 0x42d0, 0x349d, 0x42db, 0xbf9b, 0xba23, 0x40a2, 0x43f6, 0x43d2, 0xba6f, 0x368e, 0x4004, 0x1d3f, 0x43ee, 0x4127, 0xbf80, 0xbaec, 0x410a, 0x2bd6, 0x2a9f, 0x40cc, 0x40dc, 0xba0b, 0x43c4, 0x4554, 0x1afc, 0xa651, 0x1ebe, 0x41aa, 0xbf60, 0xb23f, 0xa420, 0xbf4b, 0x4412, 0x4168, 0xb200, 0x42bd, 0x4439, 0x188c, 0x0cce, 0x43a1, 0x1936, 0x36b8, 0x41a5, 0x1fd1, 0x193d, 0x44c9, 0x38d3, 0x40d8, 0xb22e, 0xbfac, 0x1893, 0x2638, 0x17ae, 0x404a, 0x44c8, 0xb257, 0x4097, 0x4328, 0x414e, 0x1e25, 0x424e, 0x41f0, 0x08f4, 0xbfd0, 0xb081, 0x4348, 0x4062, 0x43af, 0xb2fa, 0xbfdf, 0xad9a, 0x14a9, 0x1b10, 0x40c4, 0x430b, 0xba6c, 0xbaee, 0x4670, 0x40cf, 0x415c, 0xb29c, 0x4095, 0xa03c, 0x45f3, 0xbfa0, 0x1b48, 0xbf53, 0xad0c, 0x1f88, 0x3697, 0x42a2, 0x2c12, 0x2442, 0xbad7, 0xa0c2, 0xb277, 0xb0d9, 0x43e8, 0xa0c3, 0x4006, 0x4399, 0xbfca, 0x0cbc, 0xb261, 0x2cc7, 0x417e, 0x40d9, 0x43f3, 0xb27c, 0x09c8, 0xb0b9, 0x125f, 0x429f, 0xbfc3, 0x3d9c, 0x0f46, 0x0047, 0x4258, 0x4081, 0x1968, 0x45a1, 0x292c, 0x4002, 0x4463, 0x1a41, 0x414a, 0xba3f, 0x3ebb, 0x152e, 0x41f9, 0xb25f, 0x4005, 0x36c5, 0x22ec, 0xba69, 0x1ab9, 0x32de, 0xba32, 0x1867, 0xb296, 0xb2c2, 0x06f3, 0xb2e9, 0xbf8d, 0x1ea4, 0x406a, 0x46ad, 0xbacc, 0x4677, 0x4097, 0xbfa0, 0x2090, 0x0a7d, 0x400a, 0x42b6, 0xba75, 0xbaf3, 0x43e5, 0xa474, 0x419e, 0x4425, 0x3cd2, 0x46fc, 0x4043, 0xbfc5, 0x32fe, 0xaf8a, 0x1802, 0x1dfe, 0x432f, 0xb002, 0x42ef, 0xba54, 0x363d, 0x1fc4, 0x4619, 0x4206, 0x4247, 0xb0ef, 0xac69, 0xb276, 0x45b6, 0x4322, 0x3c86, 0x42fd, 0xbf5c, 0x1e9d, 0x0ef5, 0x4118, 0xb037, 0x315b, 0x42a2, 0xb083, 0x4245, 0xba51, 0x46f9, 0xbf70, 0x34d3, 0xb281, 0x43b7, 0xba6b, 0xb0d4, 0xba17, 0x431b, 0x4084, 0x425a, 0x0967, 0x40e1, 0x4571, 0x4429, 0xbf87, 0xb265, 0x4011, 0x4066, 0xba0f, 0xb0f6, 0x4334, 0x1a54, 0x0d0c, 0xb271, 0x4394, 0xbf48, 0x1fae, 0xac17, 0x1fea, 0xb2d6, 0x2631, 0x3ebb, 0x1d7f, 0x46c4, 0xba4f, 0xbf7b, 0x45aa, 0x4240, 0x3de4, 0xbafa, 0x41c2, 0x45b5, 0xba4c, 0x4129, 0x4202, 0x4489, 0x4220, 0x43f3, 0xbfd0, 0x421e, 0xbfa0, 0x0784, 0x4181, 0x42f5, 0x42ae, 0xbfb6, 0x40f3, 0xbaf7, 0x030d, 0x430c, 0xb024, 0x4162, 0x4055, 0x444b, 0x4278, 0xb2f9, 0xbfc5, 0x2d34, 0x41c2, 0x4260, 0xa8c5, 0x0235, 0xb0a5, 0x44b0, 0x2efc, 0x1bbd, 0x41d0, 0x062f, 0xbfba, 0xb25a, 0xb023, 0x46fa, 0xbac7, 0xbfd0, 0x0a43, 0xbf14, 0x3ff5, 0x4073, 0x4130, 0x41a7, 0x2bd7, 0xbf90, 0xb2e5, 0x4030, 0x41bb, 0x4262, 0x2062, 0x4021, 0xb266, 0x1a01, 0x4264, 0xb234, 0x40cb, 0x425d, 0x25e2, 0x414a, 0x3c20, 0xb0ea, 0xa1c7, 0x14e0, 0xbfb7, 0x4170, 0x42fc, 0x43d7, 0x4580, 0xb26d, 0x1a13, 0x44dc, 0xb244, 0x00e2, 0xb088, 0x422a, 0xb203, 0x1ac1, 0xba09, 0xa3ad, 0xbfd0, 0x1c62, 0xbf26, 0x02ce, 0x167e, 0x4108, 0x1b88, 0x4351, 0x4259, 0xb05d, 0x40e7, 0xbf00, 0x42aa, 0x1aac, 0xb201, 0xb036, 0xba1c, 0x429f, 0x033c, 0x462b, 0xa687, 0xbf60, 0x4216, 0xb2b0, 0xb24c, 0x4381, 0xbf75, 0x3c94, 0x4360, 0x143b, 0x40a5, 0xbaca, 0x32ca, 0x109f, 0x353e, 0x1e88, 0x4123, 0x1418, 0x4040, 0x40ae, 0x4332, 0x134c, 0x4211, 0x4271, 0x1ddd, 0x2885, 0x431f, 0xbfc5, 0x1dc1, 0x4296, 0xb2af, 0xb2b3, 0xb2d0, 0x2abd, 0x296b, 0x3323, 0x418f, 0x438a, 0xa4d6, 0x1ae8, 0x0ab5, 0x4173, 0xb095, 0x42db, 0xb226, 0xb03d, 0xbf2f, 0xb210, 0xb247, 0x437f, 0xb2f5, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x804206f6, 0x99583a3f, 0xad754391, 0x26941fad, 0x139e5e23, 0x688cb146, 0x1ba6feec, 0x7e394ee6, 0x68aeb641, 0x77239003, 0x176ac985, 0x4d825eb1, 0xa99614a6, 0x1716467f, 0x00000000, 0x900001f0 }, - FinalRegs = new uint[] { 0xffffffe4, 0x00000000, 0x000021b0, 0x00000023, 0x00001b18, 0x00000018, 0x00001b18, 0x00000310, 0x4a3eb53f, 0x0000169f, 0x00000010, 0x00000000, 0x4a3eb5c9, 0x0603ff82, 0x00000000, 0x000001d0 }, + Instructions = [0xba07, 0x1e95, 0x30c3, 0x4194, 0x2be0, 0x1a8a, 0x404b, 0x4110, 0x4339, 0x444c, 0x46ec, 0xb2bb, 0xba43, 0x2218, 0x4228, 0x40af, 0xa05c, 0xb02b, 0xb297, 0xb2a6, 0x41fe, 0xbf38, 0x43f7, 0x43a4, 0x06aa, 0x41ce, 0x4586, 0x42ed, 0xbafd, 0xb020, 0x4274, 0xa264, 0x356c, 0x43f1, 0x3264, 0xac1d, 0xb252, 0x430b, 0xab27, 0xb2e9, 0xbf90, 0x1aea, 0xbfdb, 0x193b, 0x4338, 0x1bee, 0xb2c8, 0xbac2, 0x420f, 0xbf0d, 0x4206, 0xb266, 0x2a23, 0xbae6, 0x40ff, 0xbfb0, 0xb06e, 0x1a93, 0x1bfa, 0x3b77, 0x4167, 0x420b, 0xba05, 0x2a9d, 0xba3d, 0x431f, 0xba6f, 0x41e5, 0x406a, 0x307a, 0x4298, 0x41cc, 0xb202, 0xb0a0, 0xafbe, 0xbfde, 0x4625, 0x43f4, 0x1b22, 0x41c9, 0x0924, 0xbac1, 0x424e, 0x4024, 0xbf28, 0x4128, 0xb2f2, 0xa079, 0xb078, 0xb252, 0x2be8, 0x41f0, 0x4207, 0x035e, 0x42cc, 0x3a3d, 0x43d3, 0xb2ac, 0xb2e1, 0x40ec, 0xa1c3, 0xb0ae, 0xb226, 0x4084, 0xb0b4, 0xae1e, 0xb206, 0xbf2c, 0x3a9c, 0x42e1, 0x40a8, 0x0650, 0xbfe0, 0x1d2d, 0x1ddf, 0x40fe, 0xbaf2, 0x400a, 0x01fa, 0x1bc9, 0x45bc, 0x4111, 0x467b, 0x1255, 0xa90c, 0x422e, 0x1d2f, 0x00a2, 0x434f, 0x383d, 0x3bbd, 0x41b1, 0x42c7, 0xb2d2, 0x0a93, 0xbf73, 0x403d, 0xba68, 0x428b, 0xb087, 0x1943, 0x1ea1, 0x1cfe, 0x43b4, 0x1c92, 0xb215, 0x1ffa, 0xb20e, 0x40a8, 0x0631, 0xb2fe, 0x42fb, 0x4690, 0xb2e8, 0x411b, 0xa461, 0x415d, 0xb0dd, 0xbfdc, 0xbac6, 0x40b3, 0xb269, 0xb2c0, 0x10c9, 0xbac9, 0xba5d, 0x40c1, 0xbf6e, 0xa5fa, 0x1681, 0xb0da, 0x1f93, 0xb20c, 0x4624, 0xb067, 0x414c, 0x179d, 0xba2a, 0x41f6, 0x4320, 0xbf90, 0x430e, 0x45b1, 0x4008, 0x4273, 0x1619, 0xbf18, 0x093d, 0x42f5, 0x101c, 0x408e, 0xb2a8, 0x4068, 0xba64, 0x1b43, 0x445e, 0x4130, 0x424f, 0x1af2, 0xb2a9, 0xb2c7, 0x1aeb, 0x0e84, 0xb2fc, 0x42a0, 0x06a4, 0x408a, 0xbf8f, 0x40e0, 0xbf70, 0x4673, 0x3809, 0x432d, 0x4011, 0x41de, 0xb03e, 0x42e6, 0xbaf3, 0xb0ef, 0x40e5, 0x4616, 0x40e3, 0x445b, 0xbf60, 0x46d3, 0x41a9, 0x4012, 0x189d, 0xba3b, 0x42ea, 0x418b, 0xbfba, 0x4306, 0x4106, 0x4177, 0x1a98, 0x1fa5, 0x4220, 0x466e, 0xb272, 0x42ab, 0xae2c, 0x41d9, 0x4335, 0x400a, 0xbf80, 0x34cf, 0x060e, 0xb233, 0xba1c, 0x2797, 0xb0a7, 0x446d, 0xb265, 0xadc0, 0xaf88, 0xbf5b, 0x418b, 0x40b3, 0xa037, 0x40fc, 0x4186, 0x4294, 0x43d1, 0x415d, 0x43a0, 0x438f, 0xbf9e, 0x461d, 0x198d, 0x388a, 0xada6, 0x41f7, 0x4335, 0xb24f, 0x2507, 0x1d8e, 0xb29a, 0x1f43, 0x42d2, 0xbae6, 0x42de, 0xa28d, 0x1aeb, 0x43dd, 0x40f9, 0x4253, 0x22a2, 0xa9b0, 0xb232, 0xbacb, 0xba56, 0xa533, 0xba38, 0x4154, 0xba5c, 0xbf15, 0x35e5, 0xb2c0, 0x43ce, 0x0e9c, 0x46eb, 0xbfc0, 0x40eb, 0x44fc, 0x42f3, 0x4337, 0x439c, 0x1aa7, 0x435e, 0x4215, 0x0762, 0x4186, 0x403d, 0x41b2, 0xbf5a, 0x42dc, 0x4097, 0x40f6, 0xb284, 0xba73, 0x4648, 0x408f, 0x407a, 0x1cd9, 0x4446, 0x43aa, 0xbf12, 0x11a8, 0x4164, 0x11f9, 0xae18, 0xb0c6, 0xb0de, 0x43af, 0x405a, 0x4328, 0x4236, 0xace1, 0xa3a0, 0xa0ac, 0x1c62, 0x1dc2, 0x431e, 0xba78, 0x433c, 0x42f8, 0x467f, 0x102a, 0xba5f, 0x422f, 0x4168, 0x431e, 0xa297, 0xbf41, 0x1ac0, 0xb0c8, 0xb2b8, 0x4290, 0x1a1a, 0x2d4d, 0x409e, 0x1b2d, 0x430c, 0xbfe1, 0x41e9, 0xba38, 0x1dc3, 0x400f, 0xba5e, 0x4158, 0xb011, 0x43bb, 0x40f6, 0x1d74, 0xba3c, 0x1af3, 0x4607, 0x2a9a, 0x44c8, 0x40cd, 0x43cd, 0x4253, 0x0b40, 0x419c, 0x1afb, 0x405f, 0x1664, 0xb076, 0x3250, 0x3abc, 0x4282, 0x425d, 0xbf8a, 0xb0dc, 0x2556, 0x41d1, 0x4251, 0x4046, 0x14af, 0x1b2e, 0xb22f, 0x1cbc, 0xb21d, 0x401d, 0x18e1, 0x436a, 0xbfd3, 0x07d1, 0xb2df, 0x24c2, 0x416b, 0x1bd4, 0x1d69, 0x4172, 0x4049, 0x3a4d, 0xacb4, 0x19c2, 0x45a5, 0x1236, 0x2647, 0x3ed1, 0xb03f, 0x43f8, 0xac19, 0x41b9, 0xbf34, 0xba5f, 0xb23c, 0x238f, 0xba3e, 0x4630, 0x4376, 0xb263, 0xb261, 0x431e, 0x4069, 0x1a93, 0x407f, 0x4000, 0x40a3, 0x42c8, 0xbfd4, 0x4322, 0xb2e4, 0xb0ad, 0xb2e1, 0xb273, 0xb203, 0x4064, 0x43b4, 0x144b, 0x41a3, 0x4143, 0xacf2, 0xa4dc, 0xbfe2, 0x4101, 0x406d, 0x4075, 0xba34, 0xb0e0, 0x4010, 0xb247, 0x437a, 0x2989, 0x4375, 0x290c, 0x464a, 0x43b0, 0xb201, 0x4320, 0x4097, 0x2155, 0xaa34, 0x1967, 0xb211, 0x3a11, 0x1522, 0xba36, 0x1b4a, 0xbf6d, 0xb216, 0xb2e3, 0x1c04, 0xa4c9, 0x1b2f, 0xbfe0, 0x43bb, 0xb2af, 0xa800, 0xbf90, 0x4016, 0xba5e, 0xbf7c, 0x4193, 0x19a4, 0x1235, 0x0b1f, 0x429d, 0x2f62, 0x43d7, 0x4341, 0x2659, 0xba31, 0x094f, 0x44db, 0x4034, 0x418e, 0x1f48, 0x46a2, 0xba6a, 0xbf4d, 0xb23d, 0x404d, 0x4111, 0x0d4b, 0x40fd, 0x41d2, 0x403e, 0x30ee, 0xb26f, 0x1ebb, 0x4201, 0xa2a4, 0x402e, 0x40df, 0x2596, 0x4395, 0x2ab3, 0xb276, 0x4287, 0x14a6, 0x4313, 0xbf85, 0x1cc0, 0x46cc, 0x440b, 0x243b, 0x4123, 0x15af, 0x40ae, 0x4336, 0x41b3, 0xb207, 0x40b7, 0x40ea, 0x4288, 0xa9af, 0x40ae, 0x4173, 0x4293, 0x40a2, 0x2d32, 0x12f0, 0x4265, 0x339c, 0x2d1d, 0x4273, 0x4033, 0xb273, 0xa8dd, 0x4088, 0x4393, 0xbf85, 0x200b, 0xbfc0, 0x4370, 0x416a, 0xba73, 0xbafc, 0x40d6, 0xb20a, 0x09bc, 0x366a, 0x3509, 0xbf84, 0x2e0f, 0x419a, 0xb06a, 0x41cd, 0x4115, 0x433e, 0x1cdb, 0x42d0, 0x46f3, 0xb06c, 0x388e, 0x43b6, 0x41ed, 0x190c, 0x43ab, 0x1654, 0x4043, 0x427d, 0x0edd, 0x4022, 0xbaca, 0x0775, 0x18b0, 0xa255, 0xbfb9, 0x1cb8, 0x41c3, 0xb245, 0xa4a7, 0x07dd, 0x37c1, 0x41fb, 0x42d0, 0x349d, 0x42db, 0xbf9b, 0xba23, 0x40a2, 0x43f6, 0x43d2, 0xba6f, 0x368e, 0x4004, 0x1d3f, 0x43ee, 0x4127, 0xbf80, 0xbaec, 0x410a, 0x2bd6, 0x2a9f, 0x40cc, 0x40dc, 0xba0b, 0x43c4, 0x4554, 0x1afc, 0xa651, 0x1ebe, 0x41aa, 0xbf60, 0xb23f, 0xa420, 0xbf4b, 0x4412, 0x4168, 0xb200, 0x42bd, 0x4439, 0x188c, 0x0cce, 0x43a1, 0x1936, 0x36b8, 0x41a5, 0x1fd1, 0x193d, 0x44c9, 0x38d3, 0x40d8, 0xb22e, 0xbfac, 0x1893, 0x2638, 0x17ae, 0x404a, 0x44c8, 0xb257, 0x4097, 0x4328, 0x414e, 0x1e25, 0x424e, 0x41f0, 0x08f4, 0xbfd0, 0xb081, 0x4348, 0x4062, 0x43af, 0xb2fa, 0xbfdf, 0xad9a, 0x14a9, 0x1b10, 0x40c4, 0x430b, 0xba6c, 0xbaee, 0x4670, 0x40cf, 0x415c, 0xb29c, 0x4095, 0xa03c, 0x45f3, 0xbfa0, 0x1b48, 0xbf53, 0xad0c, 0x1f88, 0x3697, 0x42a2, 0x2c12, 0x2442, 0xbad7, 0xa0c2, 0xb277, 0xb0d9, 0x43e8, 0xa0c3, 0x4006, 0x4399, 0xbfca, 0x0cbc, 0xb261, 0x2cc7, 0x417e, 0x40d9, 0x43f3, 0xb27c, 0x09c8, 0xb0b9, 0x125f, 0x429f, 0xbfc3, 0x3d9c, 0x0f46, 0x0047, 0x4258, 0x4081, 0x1968, 0x45a1, 0x292c, 0x4002, 0x4463, 0x1a41, 0x414a, 0xba3f, 0x3ebb, 0x152e, 0x41f9, 0xb25f, 0x4005, 0x36c5, 0x22ec, 0xba69, 0x1ab9, 0x32de, 0xba32, 0x1867, 0xb296, 0xb2c2, 0x06f3, 0xb2e9, 0xbf8d, 0x1ea4, 0x406a, 0x46ad, 0xbacc, 0x4677, 0x4097, 0xbfa0, 0x2090, 0x0a7d, 0x400a, 0x42b6, 0xba75, 0xbaf3, 0x43e5, 0xa474, 0x419e, 0x4425, 0x3cd2, 0x46fc, 0x4043, 0xbfc5, 0x32fe, 0xaf8a, 0x1802, 0x1dfe, 0x432f, 0xb002, 0x42ef, 0xba54, 0x363d, 0x1fc4, 0x4619, 0x4206, 0x4247, 0xb0ef, 0xac69, 0xb276, 0x45b6, 0x4322, 0x3c86, 0x42fd, 0xbf5c, 0x1e9d, 0x0ef5, 0x4118, 0xb037, 0x315b, 0x42a2, 0xb083, 0x4245, 0xba51, 0x46f9, 0xbf70, 0x34d3, 0xb281, 0x43b7, 0xba6b, 0xb0d4, 0xba17, 0x431b, 0x4084, 0x425a, 0x0967, 0x40e1, 0x4571, 0x4429, 0xbf87, 0xb265, 0x4011, 0x4066, 0xba0f, 0xb0f6, 0x4334, 0x1a54, 0x0d0c, 0xb271, 0x4394, 0xbf48, 0x1fae, 0xac17, 0x1fea, 0xb2d6, 0x2631, 0x3ebb, 0x1d7f, 0x46c4, 0xba4f, 0xbf7b, 0x45aa, 0x4240, 0x3de4, 0xbafa, 0x41c2, 0x45b5, 0xba4c, 0x4129, 0x4202, 0x4489, 0x4220, 0x43f3, 0xbfd0, 0x421e, 0xbfa0, 0x0784, 0x4181, 0x42f5, 0x42ae, 0xbfb6, 0x40f3, 0xbaf7, 0x030d, 0x430c, 0xb024, 0x4162, 0x4055, 0x444b, 0x4278, 0xb2f9, 0xbfc5, 0x2d34, 0x41c2, 0x4260, 0xa8c5, 0x0235, 0xb0a5, 0x44b0, 0x2efc, 0x1bbd, 0x41d0, 0x062f, 0xbfba, 0xb25a, 0xb023, 0x46fa, 0xbac7, 0xbfd0, 0x0a43, 0xbf14, 0x3ff5, 0x4073, 0x4130, 0x41a7, 0x2bd7, 0xbf90, 0xb2e5, 0x4030, 0x41bb, 0x4262, 0x2062, 0x4021, 0xb266, 0x1a01, 0x4264, 0xb234, 0x40cb, 0x425d, 0x25e2, 0x414a, 0x3c20, 0xb0ea, 0xa1c7, 0x14e0, 0xbfb7, 0x4170, 0x42fc, 0x43d7, 0x4580, 0xb26d, 0x1a13, 0x44dc, 0xb244, 0x00e2, 0xb088, 0x422a, 0xb203, 0x1ac1, 0xba09, 0xa3ad, 0xbfd0, 0x1c62, 0xbf26, 0x02ce, 0x167e, 0x4108, 0x1b88, 0x4351, 0x4259, 0xb05d, 0x40e7, 0xbf00, 0x42aa, 0x1aac, 0xb201, 0xb036, 0xba1c, 0x429f, 0x033c, 0x462b, 0xa687, 0xbf60, 0x4216, 0xb2b0, 0xb24c, 0x4381, 0xbf75, 0x3c94, 0x4360, 0x143b, 0x40a5, 0xbaca, 0x32ca, 0x109f, 0x353e, 0x1e88, 0x4123, 0x1418, 0x4040, 0x40ae, 0x4332, 0x134c, 0x4211, 0x4271, 0x1ddd, 0x2885, 0x431f, 0xbfc5, 0x1dc1, 0x4296, 0xb2af, 0xb2b3, 0xb2d0, 0x2abd, 0x296b, 0x3323, 0x418f, 0x438a, 0xa4d6, 0x1ae8, 0x0ab5, 0x4173, 0xb095, 0x42db, 0xb226, 0xb03d, 0xbf2f, 0xb210, 0xb247, 0x437f, 0xb2f5, 0x4770, 0xe7fe + ], + StartRegs = [0x804206f6, 0x99583a3f, 0xad754391, 0x26941fad, 0x139e5e23, 0x688cb146, 0x1ba6feec, 0x7e394ee6, 0x68aeb641, 0x77239003, 0x176ac985, 0x4d825eb1, 0xa99614a6, 0x1716467f, 0x00000000, 0x900001f0 + ], + FinalRegs = [0xffffffe4, 0x00000000, 0x000021b0, 0x00000023, 0x00001b18, 0x00000018, 0x00001b18, 0x00000310, 0x4a3eb53f, 0x0000169f, 0x00000010, 0x00000000, 0x4a3eb5c9, 0x0603ff82, 0x00000000, 0x000001d0 + ], }, new() { - Instructions = new ushort[] { 0x42b1, 0x434a, 0x1868, 0x1910, 0x4205, 0x3246, 0x2096, 0x439d, 0xba7d, 0xba78, 0x180e, 0xa168, 0xafc3, 0x40e6, 0xb2c6, 0xbf60, 0xbf80, 0x46ca, 0x2a71, 0xa766, 0xb269, 0x1f80, 0x14d9, 0x4050, 0xb209, 0xbf72, 0x0b06, 0x4024, 0x41fe, 0xa917, 0xba63, 0xb282, 0x41f2, 0x4171, 0x4288, 0x23f7, 0x032e, 0x4043, 0xb23d, 0xbf12, 0x430e, 0x1c8f, 0x1851, 0x4341, 0x0360, 0x4090, 0x2675, 0x4281, 0x411e, 0x4255, 0xba5b, 0xb283, 0x1af5, 0xb28d, 0xbf33, 0x41ed, 0xb07c, 0xae17, 0x1e11, 0x19ce, 0xb296, 0x33f9, 0x4392, 0xbaf3, 0x40bd, 0x433e, 0x40f9, 0xa383, 0x1b86, 0x1c9f, 0xb096, 0xbf00, 0x4369, 0x42ce, 0x1708, 0x37f1, 0xbf11, 0x431e, 0x28cb, 0x245a, 0x434f, 0x4298, 0x0366, 0x1b85, 0x22a8, 0x4214, 0x42fc, 0x43ca, 0x33ae, 0x42da, 0x1828, 0xabe1, 0x40e4, 0x39be, 0x1a59, 0xb01f, 0xbfb8, 0xb20e, 0x41cc, 0xb2ce, 0x4122, 0xac37, 0x435d, 0xbfc3, 0x4261, 0xb071, 0x24ed, 0xbadd, 0xba07, 0x19a6, 0x1e22, 0x4241, 0x4265, 0xb2f8, 0x401a, 0xb043, 0x4034, 0xb236, 0xb28b, 0x3189, 0xb085, 0xb239, 0x4409, 0x429d, 0x41c2, 0x30cc, 0xbfdf, 0xbaea, 0x40da, 0xb247, 0x1e98, 0xb20e, 0xbad2, 0x4136, 0x1f95, 0xaf3a, 0x2cae, 0x427a, 0x4015, 0x409f, 0x025c, 0xafcb, 0xb20f, 0x43a1, 0x1b77, 0x4222, 0x400b, 0x42c5, 0x1f2f, 0xbfc7, 0xb2ce, 0x4608, 0x4694, 0x42cb, 0x2963, 0x3619, 0x41dd, 0x43ac, 0xb204, 0x3c86, 0xbf05, 0xbac9, 0x1f7c, 0xba2e, 0x0be5, 0x38aa, 0x41aa, 0xa6f7, 0x432b, 0x4124, 0x43fa, 0x1d2d, 0x42d4, 0x1acf, 0x465e, 0x1aa0, 0x32b0, 0x410a, 0x4205, 0xb0b0, 0xbf9c, 0x409d, 0x3b35, 0x1b4f, 0x43eb, 0x189c, 0xbfb3, 0x43f9, 0x42a9, 0x19b1, 0x45cc, 0x1f2f, 0x2d27, 0x1f79, 0x41aa, 0xb20a, 0x420d, 0x45e0, 0xbf1e, 0xb008, 0x4254, 0x2b5d, 0x2382, 0xbf6a, 0x416f, 0xba16, 0x11bf, 0x40de, 0x1a5a, 0x182a, 0x4051, 0x40a8, 0xbf92, 0x41bc, 0xa479, 0x44ed, 0xa6bd, 0x449d, 0x35e7, 0xa2eb, 0x3f57, 0xb0a6, 0x191c, 0x401b, 0xb265, 0x4155, 0x4227, 0x42a1, 0x3f24, 0x1de3, 0x4312, 0x434f, 0x467f, 0xbfce, 0x4054, 0x42c8, 0x18a8, 0x4355, 0x42ad, 0x4139, 0x0b84, 0x2b9b, 0x3f55, 0x42ba, 0xbfc5, 0xa96c, 0x33cc, 0x41c6, 0xba77, 0x405f, 0x4009, 0x4106, 0x1ace, 0x0146, 0xbf1a, 0x1e1b, 0x41fb, 0x42b8, 0xbf82, 0x3dac, 0xaba4, 0xa622, 0x42d3, 0xb060, 0xba3f, 0xbaf0, 0x41b1, 0x4030, 0x410b, 0x1f0b, 0x03e5, 0x42a7, 0x2640, 0x416b, 0xb261, 0x1eaa, 0x4118, 0xba72, 0x4083, 0xbf31, 0x3606, 0xbac0, 0x25ff, 0xa90b, 0xa970, 0x4680, 0xb219, 0x4312, 0xb2b2, 0x4400, 0x1f32, 0xba03, 0x4371, 0x420f, 0x424b, 0xba02, 0x41f4, 0x46c1, 0x3158, 0xab7d, 0xba0b, 0xba2b, 0x42a4, 0x3e0b, 0x02c5, 0x4039, 0x4111, 0xb2f1, 0x0250, 0xbf5d, 0xbaf8, 0x464c, 0x43e7, 0x1baf, 0x41a3, 0x45c1, 0x4369, 0x4113, 0x415e, 0xbff0, 0x2a72, 0x1e9d, 0xba79, 0x083f, 0x41fe, 0x418c, 0x467e, 0x4472, 0x4484, 0xbf62, 0x4671, 0x4698, 0x4141, 0x41d0, 0x29ea, 0x1d92, 0xba36, 0xba01, 0x188a, 0x3f58, 0x43ec, 0x4396, 0xa1b9, 0x4266, 0x40ba, 0x4122, 0x43a4, 0xb269, 0x401f, 0x18f0, 0xb241, 0x4119, 0xb07a, 0xbf95, 0x08c9, 0x37d4, 0x21c0, 0x43e4, 0x4165, 0x468a, 0x40b6, 0xba3b, 0x0e8d, 0xba2f, 0xb287, 0x4223, 0x1bab, 0xb2e8, 0x41dd, 0x4065, 0xbf6c, 0xb23f, 0x2e6d, 0xb2fa, 0x4252, 0x0c56, 0xa14e, 0x4313, 0x42c3, 0x427c, 0x41ca, 0x430f, 0x4187, 0x11c1, 0x17df, 0x40ac, 0xb2c7, 0xb23e, 0xb0b3, 0xa0f6, 0x430f, 0xb25b, 0xbf81, 0xa50d, 0xb258, 0x217d, 0x40a7, 0x1bd7, 0xa080, 0x4248, 0x2643, 0xba66, 0xba2b, 0x4349, 0x1edb, 0x428e, 0x40a9, 0x2b5e, 0x439b, 0x417e, 0x402e, 0x12a6, 0x0e8d, 0xbfbb, 0x424f, 0xb06e, 0x4032, 0xa1c4, 0x4271, 0xb2e8, 0x4674, 0xb0cc, 0x427d, 0x42ac, 0x469b, 0x416b, 0xb201, 0xb2d2, 0x401a, 0x42b5, 0x4397, 0x4299, 0xb238, 0x4664, 0x40a4, 0xbafc, 0xbf7b, 0x1f88, 0x4334, 0x414b, 0x4365, 0x3112, 0x1aa7, 0x1ea7, 0x40f3, 0x1197, 0x45da, 0x411f, 0xbfdb, 0xb020, 0xba4b, 0x1e98, 0x42ea, 0x4388, 0x4344, 0x1956, 0x4225, 0x45c5, 0xb2b9, 0x435c, 0x1e1b, 0x40b7, 0x1bb0, 0x0400, 0x40d0, 0x43e1, 0x4071, 0x40ea, 0xb0b7, 0x122c, 0xb27d, 0x40d4, 0x4470, 0xbfc8, 0x4002, 0x408c, 0x0287, 0xb201, 0x4221, 0x408d, 0x42f2, 0x4009, 0xb2dd, 0x43ae, 0xba01, 0xbf17, 0xb2fb, 0xb271, 0x209a, 0x4201, 0xb203, 0x4202, 0x43e9, 0x2338, 0x40af, 0x2f11, 0x40c6, 0xbf70, 0x0018, 0xa318, 0xbae2, 0xb063, 0x1bbf, 0xba6f, 0xbf60, 0xb2fa, 0xb2c2, 0x40f1, 0xba51, 0xa87a, 0xbf1b, 0x43fe, 0x408f, 0x42b4, 0x09d9, 0xb2a1, 0xbae5, 0xbf32, 0x41fe, 0xa3c9, 0x42ec, 0x1bf6, 0x4151, 0xb2ac, 0xb26c, 0xa3e7, 0x1c0c, 0x4298, 0xb291, 0x41c3, 0x428b, 0xb278, 0xb062, 0x4054, 0xb232, 0x40c4, 0x1067, 0x43ea, 0x4261, 0x43c9, 0x1dca, 0xb044, 0xbfd4, 0xb2e7, 0xb221, 0xabdc, 0x42e2, 0x417e, 0x43fa, 0x42f2, 0xbaf1, 0xb237, 0x46b1, 0xbf70, 0x1b90, 0x1baf, 0x4029, 0xba6d, 0x4112, 0x4305, 0x2569, 0xb0c6, 0xbf2a, 0x430a, 0x434e, 0x411a, 0x4233, 0x41a0, 0x175a, 0x41c1, 0x4235, 0x404a, 0xb090, 0x40f4, 0xb25c, 0xb2b1, 0x41cb, 0xba1a, 0x4064, 0x1f35, 0x423d, 0x4124, 0x4264, 0x4344, 0xbf6b, 0xb0d3, 0x0de7, 0x40c9, 0xb204, 0xb257, 0x1d42, 0x4340, 0xba64, 0x2cc3, 0x23ec, 0xb223, 0x1ea1, 0x3050, 0x402c, 0x43e3, 0x2354, 0x4044, 0xbac8, 0xb262, 0x42c0, 0xb2c2, 0x40d2, 0x42e3, 0x45a2, 0x4176, 0x40c3, 0xbf45, 0xb069, 0x467a, 0xb00e, 0x4571, 0x412b, 0xbfb0, 0x42ab, 0x2c01, 0x461d, 0x33c4, 0x4124, 0x2d04, 0xbac0, 0xba2d, 0xb04a, 0x431c, 0xbf05, 0xb220, 0xb057, 0x2eb8, 0xba23, 0xbace, 0x38d4, 0xbfe0, 0x4076, 0xb2b3, 0x429a, 0xb041, 0x43c3, 0x3b35, 0x43f0, 0xb203, 0xa113, 0x2d45, 0xbff0, 0x1f05, 0xbf67, 0x422b, 0xba7c, 0x2794, 0x40c5, 0xbfba, 0x41a3, 0x43be, 0xbff0, 0xb27b, 0xb23c, 0x2e8b, 0x3d1e, 0x0282, 0x425e, 0xbad1, 0x4005, 0xbad3, 0xb0e5, 0x4227, 0xb010, 0x4381, 0xb2b3, 0xbf46, 0xb2ce, 0x1f53, 0x44ea, 0xa888, 0xae43, 0x424c, 0x1e4e, 0x18c7, 0x4424, 0xb0ff, 0xb274, 0x4294, 0x341d, 0x40bb, 0xa1b2, 0x4564, 0xba76, 0xbad6, 0x4177, 0xb000, 0xbae7, 0xbf8c, 0xb24e, 0x0516, 0x178a, 0xa2d3, 0x42bc, 0xbf32, 0x2fc5, 0x3c82, 0x188b, 0xb265, 0x4087, 0xb2c3, 0x293d, 0xba08, 0x438a, 0x0d71, 0x22c9, 0xb09a, 0xb2c6, 0xb259, 0x3f8c, 0x43bf, 0xbfd0, 0xbfc4, 0xb28a, 0x1f75, 0xb0dc, 0x418f, 0xae2d, 0x193f, 0xbadd, 0x31f3, 0x403c, 0x1537, 0xbaf9, 0xb299, 0x27eb, 0x4330, 0xb2df, 0xbf1d, 0xb253, 0xa5e3, 0x1b97, 0x40e3, 0x229a, 0xb0e9, 0x204d, 0x1e6b, 0x4217, 0xb056, 0x3e7d, 0x4347, 0x4151, 0x24fa, 0x231c, 0x4151, 0xb0bf, 0x4261, 0x4294, 0x1499, 0xa071, 0x4389, 0x40f0, 0xbf24, 0x43f0, 0xa34e, 0x3d28, 0x40fc, 0xba75, 0x42b5, 0xb235, 0x276f, 0xa13d, 0x4045, 0xae0d, 0x4339, 0xba7f, 0x46e0, 0x3011, 0xb222, 0x106e, 0x421e, 0x43fc, 0x306e, 0xbf6e, 0xb293, 0x410b, 0x1cf9, 0x4073, 0x38a8, 0xba4f, 0x0e8e, 0xba5a, 0x46e5, 0x0c13, 0x438c, 0x0dc5, 0xbf00, 0x42e2, 0x4098, 0x3453, 0x1904, 0xba61, 0x4475, 0xbf3c, 0x4280, 0x431e, 0x4411, 0x12e6, 0x3dce, 0x1d7d, 0x41f3, 0xb204, 0x1e51, 0x1e1c, 0x4082, 0x4220, 0x0544, 0x40eb, 0x40f7, 0x4161, 0x1ae9, 0x43e3, 0x4071, 0x2ecb, 0x401e, 0x44b5, 0xb2b8, 0xbf9a, 0x41ec, 0x324e, 0x19af, 0x44f2, 0xb2ce, 0xb248, 0x42dc, 0xba09, 0x3d53, 0x1a5c, 0xa24d, 0xa580, 0x08df, 0xba14, 0x4695, 0x4409, 0x4212, 0x0169, 0x41b5, 0xb2ae, 0x2638, 0x42b9, 0xbfcf, 0xb292, 0x441a, 0x19f3, 0x1831, 0xb200, 0xb2b0, 0xb2f8, 0xba7e, 0x43bf, 0x108a, 0x4113, 0xab7b, 0x42e2, 0x43bb, 0x406e, 0x44fa, 0x4225, 0xb2bb, 0x4416, 0x32c6, 0x41d4, 0x033a, 0x40f5, 0xba4d, 0xbfdb, 0xbf90, 0x3054, 0x1bc7, 0x2374, 0x40b9, 0xb2a7, 0x2123, 0x42c4, 0x2200, 0xb24b, 0xb096, 0xa563, 0x415a, 0x099a, 0x1bdd, 0x4279, 0x3b38, 0x421b, 0x3c50, 0x1efa, 0xb2ed, 0xb0ab, 0x1914, 0x34d6, 0x2af8, 0xba20, 0x056e, 0xbf52, 0x427b, 0x41dc, 0xbfc0, 0x0e3c, 0x4107, 0x439d, 0xb260, 0xb25d, 0x429c, 0x46b3, 0x179c, 0xbfc7, 0x43c5, 0xb27f, 0x197b, 0x402d, 0xb264, 0x4117, 0x2330, 0xbf70, 0x4073, 0xbf00, 0xbad5, 0xb069, 0x42ef, 0xaf7f, 0x4002, 0x436d, 0x4121, 0x1410, 0x1f1a, 0x042f, 0x423d, 0x3abd, 0xbf33, 0xb0cc, 0x425d, 0xb0ec, 0x41da, 0x4335, 0x4263, 0xb2b0, 0x047c, 0x0a77, 0x4326, 0xbac0, 0xabe5, 0x417c, 0x4141, 0xadbf, 0xbf62, 0xb051, 0x2cbe, 0x1cfa, 0x428d, 0x10c9, 0xa7b6, 0xba01, 0xbfd0, 0x4247, 0x43fe, 0x441a, 0x2a92, 0xab72, 0x406b, 0x2f61, 0xbfcc, 0x189e, 0x0ed2, 0x4337, 0x41fa, 0x4049, 0xb207, 0xa86f, 0x439d, 0xa2fa, 0xbf93, 0x1b7d, 0xb0b2, 0x2ea1, 0xaf72, 0xae7d, 0x436a, 0x415b, 0x412c, 0x1964, 0x1660, 0x3250, 0x40bb, 0x41b4, 0xa262, 0x430c, 0xbf22, 0xabab, 0x3c05, 0xb04a, 0x4322, 0x410c, 0xb23a, 0x26f1, 0x43db, 0xba7c, 0x42f8, 0x1fa5, 0x43f5, 0xad41, 0x4276, 0xbf85, 0x42e1, 0xb06d, 0x0bee, 0x43e4, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xe4628e3c, 0xb130dc40, 0x301f3068, 0x711e026e, 0x29a5a394, 0xa6eb85b1, 0xcd2f7a79, 0x2ec8b90f, 0xd90284cf, 0xe8b9b1aa, 0xa23589aa, 0x4701154b, 0x09e98069, 0x05583b86, 0x00000000, 0x000001f0 }, - FinalRegs = new uint[] { 0xffffffff, 0x00000000, 0x00001870, 0xffffe6ab, 0x00007018, 0x000018d4, 0x00000000, 0x00001870, 0x09e98068, 0xffffffff, 0x05585795, 0x0c600000, 0x09e98068, 0x000017d0, 0x00000000, 0x800001d0 }, + Instructions = [0x42b1, 0x434a, 0x1868, 0x1910, 0x4205, 0x3246, 0x2096, 0x439d, 0xba7d, 0xba78, 0x180e, 0xa168, 0xafc3, 0x40e6, 0xb2c6, 0xbf60, 0xbf80, 0x46ca, 0x2a71, 0xa766, 0xb269, 0x1f80, 0x14d9, 0x4050, 0xb209, 0xbf72, 0x0b06, 0x4024, 0x41fe, 0xa917, 0xba63, 0xb282, 0x41f2, 0x4171, 0x4288, 0x23f7, 0x032e, 0x4043, 0xb23d, 0xbf12, 0x430e, 0x1c8f, 0x1851, 0x4341, 0x0360, 0x4090, 0x2675, 0x4281, 0x411e, 0x4255, 0xba5b, 0xb283, 0x1af5, 0xb28d, 0xbf33, 0x41ed, 0xb07c, 0xae17, 0x1e11, 0x19ce, 0xb296, 0x33f9, 0x4392, 0xbaf3, 0x40bd, 0x433e, 0x40f9, 0xa383, 0x1b86, 0x1c9f, 0xb096, 0xbf00, 0x4369, 0x42ce, 0x1708, 0x37f1, 0xbf11, 0x431e, 0x28cb, 0x245a, 0x434f, 0x4298, 0x0366, 0x1b85, 0x22a8, 0x4214, 0x42fc, 0x43ca, 0x33ae, 0x42da, 0x1828, 0xabe1, 0x40e4, 0x39be, 0x1a59, 0xb01f, 0xbfb8, 0xb20e, 0x41cc, 0xb2ce, 0x4122, 0xac37, 0x435d, 0xbfc3, 0x4261, 0xb071, 0x24ed, 0xbadd, 0xba07, 0x19a6, 0x1e22, 0x4241, 0x4265, 0xb2f8, 0x401a, 0xb043, 0x4034, 0xb236, 0xb28b, 0x3189, 0xb085, 0xb239, 0x4409, 0x429d, 0x41c2, 0x30cc, 0xbfdf, 0xbaea, 0x40da, 0xb247, 0x1e98, 0xb20e, 0xbad2, 0x4136, 0x1f95, 0xaf3a, 0x2cae, 0x427a, 0x4015, 0x409f, 0x025c, 0xafcb, 0xb20f, 0x43a1, 0x1b77, 0x4222, 0x400b, 0x42c5, 0x1f2f, 0xbfc7, 0xb2ce, 0x4608, 0x4694, 0x42cb, 0x2963, 0x3619, 0x41dd, 0x43ac, 0xb204, 0x3c86, 0xbf05, 0xbac9, 0x1f7c, 0xba2e, 0x0be5, 0x38aa, 0x41aa, 0xa6f7, 0x432b, 0x4124, 0x43fa, 0x1d2d, 0x42d4, 0x1acf, 0x465e, 0x1aa0, 0x32b0, 0x410a, 0x4205, 0xb0b0, 0xbf9c, 0x409d, 0x3b35, 0x1b4f, 0x43eb, 0x189c, 0xbfb3, 0x43f9, 0x42a9, 0x19b1, 0x45cc, 0x1f2f, 0x2d27, 0x1f79, 0x41aa, 0xb20a, 0x420d, 0x45e0, 0xbf1e, 0xb008, 0x4254, 0x2b5d, 0x2382, 0xbf6a, 0x416f, 0xba16, 0x11bf, 0x40de, 0x1a5a, 0x182a, 0x4051, 0x40a8, 0xbf92, 0x41bc, 0xa479, 0x44ed, 0xa6bd, 0x449d, 0x35e7, 0xa2eb, 0x3f57, 0xb0a6, 0x191c, 0x401b, 0xb265, 0x4155, 0x4227, 0x42a1, 0x3f24, 0x1de3, 0x4312, 0x434f, 0x467f, 0xbfce, 0x4054, 0x42c8, 0x18a8, 0x4355, 0x42ad, 0x4139, 0x0b84, 0x2b9b, 0x3f55, 0x42ba, 0xbfc5, 0xa96c, 0x33cc, 0x41c6, 0xba77, 0x405f, 0x4009, 0x4106, 0x1ace, 0x0146, 0xbf1a, 0x1e1b, 0x41fb, 0x42b8, 0xbf82, 0x3dac, 0xaba4, 0xa622, 0x42d3, 0xb060, 0xba3f, 0xbaf0, 0x41b1, 0x4030, 0x410b, 0x1f0b, 0x03e5, 0x42a7, 0x2640, 0x416b, 0xb261, 0x1eaa, 0x4118, 0xba72, 0x4083, 0xbf31, 0x3606, 0xbac0, 0x25ff, 0xa90b, 0xa970, 0x4680, 0xb219, 0x4312, 0xb2b2, 0x4400, 0x1f32, 0xba03, 0x4371, 0x420f, 0x424b, 0xba02, 0x41f4, 0x46c1, 0x3158, 0xab7d, 0xba0b, 0xba2b, 0x42a4, 0x3e0b, 0x02c5, 0x4039, 0x4111, 0xb2f1, 0x0250, 0xbf5d, 0xbaf8, 0x464c, 0x43e7, 0x1baf, 0x41a3, 0x45c1, 0x4369, 0x4113, 0x415e, 0xbff0, 0x2a72, 0x1e9d, 0xba79, 0x083f, 0x41fe, 0x418c, 0x467e, 0x4472, 0x4484, 0xbf62, 0x4671, 0x4698, 0x4141, 0x41d0, 0x29ea, 0x1d92, 0xba36, 0xba01, 0x188a, 0x3f58, 0x43ec, 0x4396, 0xa1b9, 0x4266, 0x40ba, 0x4122, 0x43a4, 0xb269, 0x401f, 0x18f0, 0xb241, 0x4119, 0xb07a, 0xbf95, 0x08c9, 0x37d4, 0x21c0, 0x43e4, 0x4165, 0x468a, 0x40b6, 0xba3b, 0x0e8d, 0xba2f, 0xb287, 0x4223, 0x1bab, 0xb2e8, 0x41dd, 0x4065, 0xbf6c, 0xb23f, 0x2e6d, 0xb2fa, 0x4252, 0x0c56, 0xa14e, 0x4313, 0x42c3, 0x427c, 0x41ca, 0x430f, 0x4187, 0x11c1, 0x17df, 0x40ac, 0xb2c7, 0xb23e, 0xb0b3, 0xa0f6, 0x430f, 0xb25b, 0xbf81, 0xa50d, 0xb258, 0x217d, 0x40a7, 0x1bd7, 0xa080, 0x4248, 0x2643, 0xba66, 0xba2b, 0x4349, 0x1edb, 0x428e, 0x40a9, 0x2b5e, 0x439b, 0x417e, 0x402e, 0x12a6, 0x0e8d, 0xbfbb, 0x424f, 0xb06e, 0x4032, 0xa1c4, 0x4271, 0xb2e8, 0x4674, 0xb0cc, 0x427d, 0x42ac, 0x469b, 0x416b, 0xb201, 0xb2d2, 0x401a, 0x42b5, 0x4397, 0x4299, 0xb238, 0x4664, 0x40a4, 0xbafc, 0xbf7b, 0x1f88, 0x4334, 0x414b, 0x4365, 0x3112, 0x1aa7, 0x1ea7, 0x40f3, 0x1197, 0x45da, 0x411f, 0xbfdb, 0xb020, 0xba4b, 0x1e98, 0x42ea, 0x4388, 0x4344, 0x1956, 0x4225, 0x45c5, 0xb2b9, 0x435c, 0x1e1b, 0x40b7, 0x1bb0, 0x0400, 0x40d0, 0x43e1, 0x4071, 0x40ea, 0xb0b7, 0x122c, 0xb27d, 0x40d4, 0x4470, 0xbfc8, 0x4002, 0x408c, 0x0287, 0xb201, 0x4221, 0x408d, 0x42f2, 0x4009, 0xb2dd, 0x43ae, 0xba01, 0xbf17, 0xb2fb, 0xb271, 0x209a, 0x4201, 0xb203, 0x4202, 0x43e9, 0x2338, 0x40af, 0x2f11, 0x40c6, 0xbf70, 0x0018, 0xa318, 0xbae2, 0xb063, 0x1bbf, 0xba6f, 0xbf60, 0xb2fa, 0xb2c2, 0x40f1, 0xba51, 0xa87a, 0xbf1b, 0x43fe, 0x408f, 0x42b4, 0x09d9, 0xb2a1, 0xbae5, 0xbf32, 0x41fe, 0xa3c9, 0x42ec, 0x1bf6, 0x4151, 0xb2ac, 0xb26c, 0xa3e7, 0x1c0c, 0x4298, 0xb291, 0x41c3, 0x428b, 0xb278, 0xb062, 0x4054, 0xb232, 0x40c4, 0x1067, 0x43ea, 0x4261, 0x43c9, 0x1dca, 0xb044, 0xbfd4, 0xb2e7, 0xb221, 0xabdc, 0x42e2, 0x417e, 0x43fa, 0x42f2, 0xbaf1, 0xb237, 0x46b1, 0xbf70, 0x1b90, 0x1baf, 0x4029, 0xba6d, 0x4112, 0x4305, 0x2569, 0xb0c6, 0xbf2a, 0x430a, 0x434e, 0x411a, 0x4233, 0x41a0, 0x175a, 0x41c1, 0x4235, 0x404a, 0xb090, 0x40f4, 0xb25c, 0xb2b1, 0x41cb, 0xba1a, 0x4064, 0x1f35, 0x423d, 0x4124, 0x4264, 0x4344, 0xbf6b, 0xb0d3, 0x0de7, 0x40c9, 0xb204, 0xb257, 0x1d42, 0x4340, 0xba64, 0x2cc3, 0x23ec, 0xb223, 0x1ea1, 0x3050, 0x402c, 0x43e3, 0x2354, 0x4044, 0xbac8, 0xb262, 0x42c0, 0xb2c2, 0x40d2, 0x42e3, 0x45a2, 0x4176, 0x40c3, 0xbf45, 0xb069, 0x467a, 0xb00e, 0x4571, 0x412b, 0xbfb0, 0x42ab, 0x2c01, 0x461d, 0x33c4, 0x4124, 0x2d04, 0xbac0, 0xba2d, 0xb04a, 0x431c, 0xbf05, 0xb220, 0xb057, 0x2eb8, 0xba23, 0xbace, 0x38d4, 0xbfe0, 0x4076, 0xb2b3, 0x429a, 0xb041, 0x43c3, 0x3b35, 0x43f0, 0xb203, 0xa113, 0x2d45, 0xbff0, 0x1f05, 0xbf67, 0x422b, 0xba7c, 0x2794, 0x40c5, 0xbfba, 0x41a3, 0x43be, 0xbff0, 0xb27b, 0xb23c, 0x2e8b, 0x3d1e, 0x0282, 0x425e, 0xbad1, 0x4005, 0xbad3, 0xb0e5, 0x4227, 0xb010, 0x4381, 0xb2b3, 0xbf46, 0xb2ce, 0x1f53, 0x44ea, 0xa888, 0xae43, 0x424c, 0x1e4e, 0x18c7, 0x4424, 0xb0ff, 0xb274, 0x4294, 0x341d, 0x40bb, 0xa1b2, 0x4564, 0xba76, 0xbad6, 0x4177, 0xb000, 0xbae7, 0xbf8c, 0xb24e, 0x0516, 0x178a, 0xa2d3, 0x42bc, 0xbf32, 0x2fc5, 0x3c82, 0x188b, 0xb265, 0x4087, 0xb2c3, 0x293d, 0xba08, 0x438a, 0x0d71, 0x22c9, 0xb09a, 0xb2c6, 0xb259, 0x3f8c, 0x43bf, 0xbfd0, 0xbfc4, 0xb28a, 0x1f75, 0xb0dc, 0x418f, 0xae2d, 0x193f, 0xbadd, 0x31f3, 0x403c, 0x1537, 0xbaf9, 0xb299, 0x27eb, 0x4330, 0xb2df, 0xbf1d, 0xb253, 0xa5e3, 0x1b97, 0x40e3, 0x229a, 0xb0e9, 0x204d, 0x1e6b, 0x4217, 0xb056, 0x3e7d, 0x4347, 0x4151, 0x24fa, 0x231c, 0x4151, 0xb0bf, 0x4261, 0x4294, 0x1499, 0xa071, 0x4389, 0x40f0, 0xbf24, 0x43f0, 0xa34e, 0x3d28, 0x40fc, 0xba75, 0x42b5, 0xb235, 0x276f, 0xa13d, 0x4045, 0xae0d, 0x4339, 0xba7f, 0x46e0, 0x3011, 0xb222, 0x106e, 0x421e, 0x43fc, 0x306e, 0xbf6e, 0xb293, 0x410b, 0x1cf9, 0x4073, 0x38a8, 0xba4f, 0x0e8e, 0xba5a, 0x46e5, 0x0c13, 0x438c, 0x0dc5, 0xbf00, 0x42e2, 0x4098, 0x3453, 0x1904, 0xba61, 0x4475, 0xbf3c, 0x4280, 0x431e, 0x4411, 0x12e6, 0x3dce, 0x1d7d, 0x41f3, 0xb204, 0x1e51, 0x1e1c, 0x4082, 0x4220, 0x0544, 0x40eb, 0x40f7, 0x4161, 0x1ae9, 0x43e3, 0x4071, 0x2ecb, 0x401e, 0x44b5, 0xb2b8, 0xbf9a, 0x41ec, 0x324e, 0x19af, 0x44f2, 0xb2ce, 0xb248, 0x42dc, 0xba09, 0x3d53, 0x1a5c, 0xa24d, 0xa580, 0x08df, 0xba14, 0x4695, 0x4409, 0x4212, 0x0169, 0x41b5, 0xb2ae, 0x2638, 0x42b9, 0xbfcf, 0xb292, 0x441a, 0x19f3, 0x1831, 0xb200, 0xb2b0, 0xb2f8, 0xba7e, 0x43bf, 0x108a, 0x4113, 0xab7b, 0x42e2, 0x43bb, 0x406e, 0x44fa, 0x4225, 0xb2bb, 0x4416, 0x32c6, 0x41d4, 0x033a, 0x40f5, 0xba4d, 0xbfdb, 0xbf90, 0x3054, 0x1bc7, 0x2374, 0x40b9, 0xb2a7, 0x2123, 0x42c4, 0x2200, 0xb24b, 0xb096, 0xa563, 0x415a, 0x099a, 0x1bdd, 0x4279, 0x3b38, 0x421b, 0x3c50, 0x1efa, 0xb2ed, 0xb0ab, 0x1914, 0x34d6, 0x2af8, 0xba20, 0x056e, 0xbf52, 0x427b, 0x41dc, 0xbfc0, 0x0e3c, 0x4107, 0x439d, 0xb260, 0xb25d, 0x429c, 0x46b3, 0x179c, 0xbfc7, 0x43c5, 0xb27f, 0x197b, 0x402d, 0xb264, 0x4117, 0x2330, 0xbf70, 0x4073, 0xbf00, 0xbad5, 0xb069, 0x42ef, 0xaf7f, 0x4002, 0x436d, 0x4121, 0x1410, 0x1f1a, 0x042f, 0x423d, 0x3abd, 0xbf33, 0xb0cc, 0x425d, 0xb0ec, 0x41da, 0x4335, 0x4263, 0xb2b0, 0x047c, 0x0a77, 0x4326, 0xbac0, 0xabe5, 0x417c, 0x4141, 0xadbf, 0xbf62, 0xb051, 0x2cbe, 0x1cfa, 0x428d, 0x10c9, 0xa7b6, 0xba01, 0xbfd0, 0x4247, 0x43fe, 0x441a, 0x2a92, 0xab72, 0x406b, 0x2f61, 0xbfcc, 0x189e, 0x0ed2, 0x4337, 0x41fa, 0x4049, 0xb207, 0xa86f, 0x439d, 0xa2fa, 0xbf93, 0x1b7d, 0xb0b2, 0x2ea1, 0xaf72, 0xae7d, 0x436a, 0x415b, 0x412c, 0x1964, 0x1660, 0x3250, 0x40bb, 0x41b4, 0xa262, 0x430c, 0xbf22, 0xabab, 0x3c05, 0xb04a, 0x4322, 0x410c, 0xb23a, 0x26f1, 0x43db, 0xba7c, 0x42f8, 0x1fa5, 0x43f5, 0xad41, 0x4276, 0xbf85, 0x42e1, 0xb06d, 0x0bee, 0x43e4, 0x4770, 0xe7fe + ], + StartRegs = [0xe4628e3c, 0xb130dc40, 0x301f3068, 0x711e026e, 0x29a5a394, 0xa6eb85b1, 0xcd2f7a79, 0x2ec8b90f, 0xd90284cf, 0xe8b9b1aa, 0xa23589aa, 0x4701154b, 0x09e98069, 0x05583b86, 0x00000000, 0x000001f0 + ], + FinalRegs = [0xffffffff, 0x00000000, 0x00001870, 0xffffe6ab, 0x00007018, 0x000018d4, 0x00000000, 0x00001870, 0x09e98068, 0xffffffff, 0x05585795, 0x0c600000, 0x09e98068, 0x000017d0, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0x190c, 0x41dd, 0xb2fe, 0x408e, 0x4222, 0x32ca, 0x40b9, 0x3388, 0xba3b, 0x455c, 0xbfd0, 0x0a17, 0x40b6, 0x1dc6, 0x316f, 0x1fe4, 0x1ddd, 0x4312, 0x1f2e, 0x41c8, 0x4142, 0x43e6, 0xbf64, 0x4407, 0x4230, 0x46a5, 0x43bc, 0x422b, 0x43b7, 0x4111, 0x4125, 0x42fc, 0xb0eb, 0xba23, 0x4375, 0xb002, 0xba10, 0x4272, 0xb282, 0xb0f4, 0x2703, 0x4192, 0xb2c8, 0xbf3a, 0x415a, 0x41dc, 0x2e6f, 0x4326, 0xa155, 0x1c7e, 0x43a5, 0x3588, 0xbf33, 0x434c, 0x3d8b, 0xa455, 0x4028, 0x42b9, 0x42e8, 0x4117, 0x12c6, 0xb2ea, 0x0555, 0x39c4, 0x4674, 0x4339, 0xb2fd, 0xb241, 0xba30, 0x42f0, 0x2e82, 0x418f, 0xbad0, 0x4253, 0x075f, 0x4412, 0x1dbd, 0xb229, 0x43c2, 0xbfae, 0xb085, 0xb2f3, 0xb0e9, 0x1b1f, 0x1f0e, 0x281f, 0x18e7, 0x30b9, 0xbadf, 0xba64, 0x42ec, 0x4208, 0x2e04, 0x2730, 0x430e, 0xb2aa, 0xb244, 0x4103, 0x1eb8, 0x4229, 0x1e5c, 0x40b5, 0x3def, 0xa5b2, 0x33b8, 0x4389, 0x42a1, 0xba14, 0xbf98, 0xa852, 0x4343, 0x40e5, 0xbaf5, 0x188e, 0x1ac6, 0x4073, 0x0c0c, 0xbfc2, 0x4028, 0x404d, 0x1860, 0x442f, 0xb0f6, 0xbf61, 0x3c74, 0xbf60, 0x41a0, 0x1c6a, 0xba14, 0x12cd, 0x40bb, 0xbf70, 0x4034, 0xbfc2, 0xbf00, 0x40d4, 0xb2f2, 0x433a, 0x001a, 0xac53, 0x0ab7, 0x428d, 0x443b, 0x4335, 0x27cc, 0x1e0a, 0x40e1, 0x17e2, 0xbad0, 0xb297, 0x405b, 0xb270, 0x429a, 0xbad7, 0x41de, 0x4210, 0x1acf, 0x42a3, 0x443b, 0x1d64, 0x460d, 0xbf06, 0xbad0, 0xb2b7, 0x4092, 0xba0f, 0x438c, 0x439f, 0x291d, 0x2fba, 0xb2b8, 0x435c, 0xbf9b, 0xac65, 0x4277, 0x4171, 0x2bd5, 0x0832, 0x46c5, 0xb275, 0xb292, 0x4012, 0x1396, 0x4014, 0xb046, 0xba1d, 0xb2a1, 0x067f, 0xb26b, 0x432a, 0x1630, 0x2119, 0xb202, 0x42cc, 0xbf54, 0xb004, 0x43df, 0xaad2, 0xa411, 0x1ea9, 0x40d3, 0x1fe2, 0xaf6c, 0xb068, 0x40ab, 0x2124, 0x39a3, 0x1a23, 0xba65, 0xb2eb, 0xbfa4, 0xb035, 0xba7c, 0x40b7, 0x4013, 0xb292, 0x444c, 0xb0d2, 0x401e, 0xba6a, 0xba5b, 0x4368, 0x46ec, 0x4493, 0x4016, 0x4601, 0x4049, 0x15b2, 0xb298, 0x18e4, 0xb22a, 0x1f07, 0x101f, 0x1908, 0xbfaf, 0x434e, 0x1125, 0x41d5, 0x1322, 0x41d0, 0xbfa2, 0x4349, 0x1fa5, 0x4289, 0x1ebd, 0x10be, 0x4328, 0x4084, 0x4076, 0xa326, 0x4262, 0xba59, 0xb017, 0x1eb2, 0x43e8, 0x43a9, 0xb014, 0x089a, 0xb22b, 0x1cf0, 0x4490, 0x1529, 0x4371, 0xbfa0, 0x43cc, 0x4127, 0xbfb7, 0xba00, 0xba0d, 0x41f4, 0xb0ea, 0x1e04, 0xbacd, 0x40bf, 0x46bc, 0x403b, 0x2642, 0x400b, 0x1d25, 0x4339, 0x4124, 0x43fb, 0x4203, 0x40f2, 0xb0f1, 0xac2d, 0xbfc0, 0x1f1c, 0x3447, 0x40b2, 0xbfa8, 0xbfb0, 0xbfb2, 0x4373, 0xabab, 0x428b, 0x400a, 0xaa61, 0xbff0, 0x46c0, 0x45e8, 0x1f40, 0xbae0, 0x2815, 0x4130, 0x39ef, 0xbace, 0x3978, 0x1c85, 0x4023, 0x1fbc, 0xbf01, 0x413b, 0x1f38, 0x4248, 0xa2f5, 0x1354, 0xa20b, 0x4287, 0x2088, 0x377f, 0x4029, 0x41a5, 0x0b8a, 0xb2ff, 0x419e, 0x003c, 0xb28e, 0xbf2a, 0xbad0, 0x3fea, 0x4138, 0x434b, 0x41c3, 0x4371, 0xb08c, 0xb240, 0x41d3, 0x42c1, 0x43ee, 0x42ae, 0x41e0, 0xb287, 0x1c7c, 0x41fc, 0x4130, 0x46e1, 0x4391, 0x1d6d, 0x401f, 0x189e, 0xbf24, 0x206b, 0xb27e, 0xb2e3, 0x432a, 0xba3f, 0x43b6, 0x1e9c, 0x41e6, 0x1943, 0x411a, 0x40d7, 0x4367, 0xa70f, 0x1088, 0x422f, 0x1d6e, 0x197a, 0x42ae, 0x3fb9, 0x01b5, 0xb226, 0x40c7, 0x3246, 0xbf58, 0xb07e, 0x4250, 0xba4e, 0xa4d2, 0xa9fa, 0x2365, 0xb28d, 0xa57c, 0xbaf7, 0xba5b, 0xb010, 0xba53, 0xbadf, 0x4122, 0xbf57, 0xb010, 0x4374, 0xbae0, 0xb2fb, 0x1fda, 0x41c7, 0x432a, 0xaa9f, 0x19da, 0x1f13, 0xb2e1, 0x1d38, 0x44a4, 0xbfb7, 0x438e, 0x054a, 0x425a, 0x3229, 0xbac4, 0x40a6, 0x404f, 0x4348, 0x41da, 0x40db, 0xafa8, 0xb0ba, 0x4004, 0x432c, 0xb058, 0x4324, 0x1daf, 0x4309, 0x42bd, 0x18cf, 0xbf6e, 0x42ee, 0x418a, 0xb270, 0xb287, 0xb209, 0x4271, 0xb0e0, 0x3c45, 0x1a47, 0xb284, 0xb224, 0x410f, 0x4230, 0xb239, 0x41d8, 0xb09f, 0x4125, 0xba3f, 0x18ea, 0x1a7b, 0x3bb4, 0xb018, 0xbf4a, 0x2a5f, 0x31f9, 0x411f, 0x4142, 0x423b, 0x4573, 0xbfb0, 0xba72, 0x1940, 0xb032, 0xbae0, 0x43e3, 0xba0c, 0x2537, 0x4081, 0xb211, 0x15fa, 0x41fa, 0xbfa0, 0xab62, 0xb0d6, 0xba2d, 0xbf51, 0x400b, 0x30b2, 0x4036, 0xaea0, 0xbf00, 0x42e8, 0x2b15, 0x1f0d, 0x381f, 0x4103, 0x4097, 0x41be, 0x235b, 0x4091, 0xbaf5, 0xb296, 0x455e, 0xb252, 0x4223, 0xba21, 0xbf90, 0x2bb5, 0x4153, 0xbf31, 0xa17a, 0x1938, 0x4210, 0x4274, 0x2b0c, 0x43b2, 0x411d, 0x1a71, 0x40e4, 0x2d1a, 0x4041, 0x4091, 0x40c5, 0x4082, 0xb256, 0x43a8, 0x4365, 0x426f, 0x42fc, 0xb058, 0xb098, 0x4077, 0xb074, 0x426f, 0x2362, 0x40fd, 0xbf22, 0xb2ba, 0xbf60, 0x438c, 0x4005, 0x4240, 0xbfd6, 0x4120, 0x42ab, 0xb0fa, 0x4674, 0x40ef, 0xbfce, 0x42fb, 0xb03e, 0x426b, 0x4116, 0x426b, 0xb29c, 0x419f, 0x4106, 0x437d, 0x43f6, 0x4625, 0x0a71, 0x424b, 0xb287, 0xa587, 0x40c2, 0xa389, 0x4043, 0xb23a, 0x0f83, 0x0e74, 0xbfa3, 0x42c8, 0x1837, 0xb04a, 0xb215, 0x1f63, 0x409b, 0x466f, 0x4020, 0x40cb, 0x1fc4, 0x424a, 0x4041, 0xab3f, 0x2513, 0xba39, 0x2761, 0x08ef, 0xb01c, 0x40ec, 0x4344, 0x432a, 0x423a, 0xbac6, 0x008b, 0x43cc, 0x1f37, 0x0f45, 0xbf11, 0x4088, 0x4359, 0x42cc, 0x1c92, 0xbacb, 0xb06c, 0xaf25, 0xb299, 0xbfde, 0x4184, 0x3ea1, 0xaab7, 0xbfc0, 0x2538, 0xbfd4, 0x4100, 0x2625, 0x419a, 0xb210, 0x231f, 0x40b5, 0xbfd9, 0x1dd1, 0x1c34, 0x41a3, 0x1c6a, 0xa756, 0xbf70, 0x430f, 0x42c1, 0x4077, 0x404f, 0x41fc, 0x4245, 0xbff0, 0x42cb, 0x3c1f, 0x1c6b, 0xab3a, 0x4083, 0x4131, 0x4234, 0x41a8, 0x41fe, 0x435e, 0x4086, 0xbf98, 0xb2c8, 0xbae1, 0x3ccd, 0x441d, 0xb29c, 0x4047, 0xbf92, 0x42ea, 0x4077, 0x1f00, 0x2d3c, 0x434f, 0x1d83, 0x2a97, 0x4238, 0x43d0, 0xb274, 0x4000, 0x438d, 0x407a, 0x199e, 0x1ec9, 0x4041, 0x4133, 0x0b38, 0x437e, 0xbadb, 0x0c6c, 0x43c9, 0x436d, 0xb2b7, 0x1b76, 0x1207, 0x403a, 0xbfa2, 0x0e8e, 0x1b82, 0x2840, 0x4018, 0xbfa5, 0x2ffa, 0x4493, 0x1cf6, 0xbfe0, 0x243e, 0x4113, 0xb28a, 0x4057, 0xb2d6, 0x43a2, 0xb2ac, 0x40d0, 0x4198, 0xae4e, 0x42f7, 0x3681, 0x4231, 0x4455, 0x35d7, 0x1e5f, 0x411e, 0xb2dc, 0x422d, 0x1edd, 0x4164, 0x2df7, 0xa616, 0x1734, 0xbf53, 0x404c, 0x4061, 0x44c8, 0x43d0, 0xbfdb, 0x415f, 0x1c73, 0xb2de, 0x40bf, 0x462e, 0x4218, 0x1dcc, 0xba45, 0xaef1, 0x425a, 0xa89f, 0xb25a, 0xa25f, 0x1fa5, 0x417a, 0xba13, 0x418e, 0x42a4, 0x35d6, 0x1b4b, 0xba13, 0xba40, 0x1b23, 0x0b14, 0xb20c, 0x2bba, 0xba45, 0x3b65, 0x256f, 0xbfd7, 0xba0d, 0xb2d5, 0x4267, 0x24e6, 0x2d6d, 0x11bc, 0x42b6, 0xbf15, 0xb217, 0xb2d8, 0x405f, 0x4143, 0xa6e6, 0xa92f, 0x42fb, 0x42bd, 0x438b, 0x458a, 0x43c3, 0x420c, 0x43bb, 0x4068, 0x43d4, 0x3fa0, 0x1968, 0x03e1, 0xb291, 0xbf90, 0x2968, 0x4029, 0x38bc, 0x431d, 0x43af, 0x1b23, 0x41a3, 0xbfd9, 0x43f3, 0x229b, 0x0925, 0xb295, 0x15ec, 0xb223, 0x19d3, 0xba1c, 0xb080, 0xb27a, 0xbf7e, 0xba7d, 0xb236, 0x4365, 0x4273, 0x1c90, 0x21b5, 0x42cf, 0x40d6, 0x18c8, 0x0777, 0x281d, 0xbfc0, 0x40ca, 0x1b92, 0x412d, 0xa3aa, 0x44c3, 0x4220, 0x4087, 0x4110, 0x43b0, 0x1aad, 0x3f60, 0x1515, 0xb2fd, 0x40ea, 0xbf0c, 0x19d3, 0x41ba, 0x4003, 0x4040, 0xb239, 0x4057, 0xbfd0, 0x439d, 0x41c6, 0x4382, 0x4122, 0x30b4, 0xbff0, 0x4285, 0x4112, 0x0eec, 0x41f2, 0x4165, 0xba79, 0xbfc0, 0xbac0, 0x43bc, 0x1fa0, 0xbf3b, 0x17fb, 0xba32, 0xba37, 0xb218, 0x4397, 0x40c6, 0xb2e3, 0xbfe4, 0xb23e, 0xb07d, 0x42cb, 0x424e, 0x4269, 0x41e7, 0x4323, 0x40f6, 0x3575, 0x4110, 0x41bc, 0xb2e8, 0x4228, 0xb242, 0x403a, 0x4262, 0xba27, 0x153a, 0xba00, 0xba70, 0x2dde, 0xb290, 0xbf91, 0x40bd, 0x427b, 0x0a83, 0x2605, 0x40ca, 0xa13e, 0x408a, 0x2078, 0xa34c, 0xbfc0, 0x4671, 0x1ae9, 0xbaed, 0x2113, 0xb27b, 0x4138, 0xb268, 0x0f57, 0xbfa5, 0xaeb6, 0xbac7, 0x4304, 0xb03a, 0x1524, 0x4439, 0xb2cf, 0xbfb0, 0xb252, 0xb083, 0x1b1f, 0x4297, 0xa384, 0x4077, 0x1b4d, 0x4386, 0x41da, 0x29a1, 0xbfc0, 0x1f1a, 0x3f17, 0x4007, 0x42f5, 0x4192, 0xbfe8, 0x2373, 0x40b8, 0x4160, 0x4621, 0xb02b, 0xae8c, 0x13f9, 0xba3d, 0x25d3, 0x3d46, 0x41df, 0x4481, 0x1289, 0xa8ac, 0x4257, 0x1157, 0x423d, 0xbff0, 0xb2f2, 0xab13, 0xbfde, 0x412c, 0xb09e, 0x40ba, 0xb0a4, 0x4356, 0x43fe, 0x4209, 0xbf3a, 0x40f3, 0x43df, 0x39a1, 0xb0c3, 0x0992, 0x46ca, 0x4269, 0x417e, 0xb200, 0x46bb, 0x41d6, 0xba1c, 0xbfe0, 0x42a5, 0x3e74, 0x4651, 0x4371, 0x435c, 0x437a, 0x23a1, 0xb217, 0x1bd7, 0x1920, 0x449b, 0xb24c, 0xbf26, 0x4551, 0x41d7, 0x43d9, 0xae4b, 0x4008, 0x403d, 0xba74, 0x43e3, 0x185b, 0xba5c, 0xbf16, 0xba06, 0xbff0, 0x4118, 0x2b3b, 0x435a, 0x409b, 0x4085, 0x434b, 0xa0a7, 0xbf02, 0x1b80, 0xb2a7, 0x1fb5, 0x2ab4, 0x4102, 0x40ec, 0x2d72, 0xba16, 0x4076, 0x23fd, 0xab93, 0xba7e, 0xbf5d, 0x41a0, 0x1d5c, 0x43cc, 0x3cb3, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x96070e06, 0x60f8a631, 0x6d122e21, 0xad567bfc, 0x291715df, 0x4658e055, 0x3efa71b8, 0x42812292, 0x84889393, 0xde7eb11f, 0x47c9ca7e, 0x0ba82b44, 0x8ffeeee8, 0x71d424e5, 0x00000000, 0x100001f0 }, - FinalRegs = new uint[] { 0xb75339fa, 0xfffcaf4b, 0x00000000, 0x8488a09f, 0x000350b4, 0x48ace04c, 0x00002fab, 0x0000ab2f, 0x84889836, 0x00000741, 0x00000741, 0x000000a0, 0x00001640, 0x84889e53, 0x00000000, 0x200001d0 }, + Instructions = [0x190c, 0x41dd, 0xb2fe, 0x408e, 0x4222, 0x32ca, 0x40b9, 0x3388, 0xba3b, 0x455c, 0xbfd0, 0x0a17, 0x40b6, 0x1dc6, 0x316f, 0x1fe4, 0x1ddd, 0x4312, 0x1f2e, 0x41c8, 0x4142, 0x43e6, 0xbf64, 0x4407, 0x4230, 0x46a5, 0x43bc, 0x422b, 0x43b7, 0x4111, 0x4125, 0x42fc, 0xb0eb, 0xba23, 0x4375, 0xb002, 0xba10, 0x4272, 0xb282, 0xb0f4, 0x2703, 0x4192, 0xb2c8, 0xbf3a, 0x415a, 0x41dc, 0x2e6f, 0x4326, 0xa155, 0x1c7e, 0x43a5, 0x3588, 0xbf33, 0x434c, 0x3d8b, 0xa455, 0x4028, 0x42b9, 0x42e8, 0x4117, 0x12c6, 0xb2ea, 0x0555, 0x39c4, 0x4674, 0x4339, 0xb2fd, 0xb241, 0xba30, 0x42f0, 0x2e82, 0x418f, 0xbad0, 0x4253, 0x075f, 0x4412, 0x1dbd, 0xb229, 0x43c2, 0xbfae, 0xb085, 0xb2f3, 0xb0e9, 0x1b1f, 0x1f0e, 0x281f, 0x18e7, 0x30b9, 0xbadf, 0xba64, 0x42ec, 0x4208, 0x2e04, 0x2730, 0x430e, 0xb2aa, 0xb244, 0x4103, 0x1eb8, 0x4229, 0x1e5c, 0x40b5, 0x3def, 0xa5b2, 0x33b8, 0x4389, 0x42a1, 0xba14, 0xbf98, 0xa852, 0x4343, 0x40e5, 0xbaf5, 0x188e, 0x1ac6, 0x4073, 0x0c0c, 0xbfc2, 0x4028, 0x404d, 0x1860, 0x442f, 0xb0f6, 0xbf61, 0x3c74, 0xbf60, 0x41a0, 0x1c6a, 0xba14, 0x12cd, 0x40bb, 0xbf70, 0x4034, 0xbfc2, 0xbf00, 0x40d4, 0xb2f2, 0x433a, 0x001a, 0xac53, 0x0ab7, 0x428d, 0x443b, 0x4335, 0x27cc, 0x1e0a, 0x40e1, 0x17e2, 0xbad0, 0xb297, 0x405b, 0xb270, 0x429a, 0xbad7, 0x41de, 0x4210, 0x1acf, 0x42a3, 0x443b, 0x1d64, 0x460d, 0xbf06, 0xbad0, 0xb2b7, 0x4092, 0xba0f, 0x438c, 0x439f, 0x291d, 0x2fba, 0xb2b8, 0x435c, 0xbf9b, 0xac65, 0x4277, 0x4171, 0x2bd5, 0x0832, 0x46c5, 0xb275, 0xb292, 0x4012, 0x1396, 0x4014, 0xb046, 0xba1d, 0xb2a1, 0x067f, 0xb26b, 0x432a, 0x1630, 0x2119, 0xb202, 0x42cc, 0xbf54, 0xb004, 0x43df, 0xaad2, 0xa411, 0x1ea9, 0x40d3, 0x1fe2, 0xaf6c, 0xb068, 0x40ab, 0x2124, 0x39a3, 0x1a23, 0xba65, 0xb2eb, 0xbfa4, 0xb035, 0xba7c, 0x40b7, 0x4013, 0xb292, 0x444c, 0xb0d2, 0x401e, 0xba6a, 0xba5b, 0x4368, 0x46ec, 0x4493, 0x4016, 0x4601, 0x4049, 0x15b2, 0xb298, 0x18e4, 0xb22a, 0x1f07, 0x101f, 0x1908, 0xbfaf, 0x434e, 0x1125, 0x41d5, 0x1322, 0x41d0, 0xbfa2, 0x4349, 0x1fa5, 0x4289, 0x1ebd, 0x10be, 0x4328, 0x4084, 0x4076, 0xa326, 0x4262, 0xba59, 0xb017, 0x1eb2, 0x43e8, 0x43a9, 0xb014, 0x089a, 0xb22b, 0x1cf0, 0x4490, 0x1529, 0x4371, 0xbfa0, 0x43cc, 0x4127, 0xbfb7, 0xba00, 0xba0d, 0x41f4, 0xb0ea, 0x1e04, 0xbacd, 0x40bf, 0x46bc, 0x403b, 0x2642, 0x400b, 0x1d25, 0x4339, 0x4124, 0x43fb, 0x4203, 0x40f2, 0xb0f1, 0xac2d, 0xbfc0, 0x1f1c, 0x3447, 0x40b2, 0xbfa8, 0xbfb0, 0xbfb2, 0x4373, 0xabab, 0x428b, 0x400a, 0xaa61, 0xbff0, 0x46c0, 0x45e8, 0x1f40, 0xbae0, 0x2815, 0x4130, 0x39ef, 0xbace, 0x3978, 0x1c85, 0x4023, 0x1fbc, 0xbf01, 0x413b, 0x1f38, 0x4248, 0xa2f5, 0x1354, 0xa20b, 0x4287, 0x2088, 0x377f, 0x4029, 0x41a5, 0x0b8a, 0xb2ff, 0x419e, 0x003c, 0xb28e, 0xbf2a, 0xbad0, 0x3fea, 0x4138, 0x434b, 0x41c3, 0x4371, 0xb08c, 0xb240, 0x41d3, 0x42c1, 0x43ee, 0x42ae, 0x41e0, 0xb287, 0x1c7c, 0x41fc, 0x4130, 0x46e1, 0x4391, 0x1d6d, 0x401f, 0x189e, 0xbf24, 0x206b, 0xb27e, 0xb2e3, 0x432a, 0xba3f, 0x43b6, 0x1e9c, 0x41e6, 0x1943, 0x411a, 0x40d7, 0x4367, 0xa70f, 0x1088, 0x422f, 0x1d6e, 0x197a, 0x42ae, 0x3fb9, 0x01b5, 0xb226, 0x40c7, 0x3246, 0xbf58, 0xb07e, 0x4250, 0xba4e, 0xa4d2, 0xa9fa, 0x2365, 0xb28d, 0xa57c, 0xbaf7, 0xba5b, 0xb010, 0xba53, 0xbadf, 0x4122, 0xbf57, 0xb010, 0x4374, 0xbae0, 0xb2fb, 0x1fda, 0x41c7, 0x432a, 0xaa9f, 0x19da, 0x1f13, 0xb2e1, 0x1d38, 0x44a4, 0xbfb7, 0x438e, 0x054a, 0x425a, 0x3229, 0xbac4, 0x40a6, 0x404f, 0x4348, 0x41da, 0x40db, 0xafa8, 0xb0ba, 0x4004, 0x432c, 0xb058, 0x4324, 0x1daf, 0x4309, 0x42bd, 0x18cf, 0xbf6e, 0x42ee, 0x418a, 0xb270, 0xb287, 0xb209, 0x4271, 0xb0e0, 0x3c45, 0x1a47, 0xb284, 0xb224, 0x410f, 0x4230, 0xb239, 0x41d8, 0xb09f, 0x4125, 0xba3f, 0x18ea, 0x1a7b, 0x3bb4, 0xb018, 0xbf4a, 0x2a5f, 0x31f9, 0x411f, 0x4142, 0x423b, 0x4573, 0xbfb0, 0xba72, 0x1940, 0xb032, 0xbae0, 0x43e3, 0xba0c, 0x2537, 0x4081, 0xb211, 0x15fa, 0x41fa, 0xbfa0, 0xab62, 0xb0d6, 0xba2d, 0xbf51, 0x400b, 0x30b2, 0x4036, 0xaea0, 0xbf00, 0x42e8, 0x2b15, 0x1f0d, 0x381f, 0x4103, 0x4097, 0x41be, 0x235b, 0x4091, 0xbaf5, 0xb296, 0x455e, 0xb252, 0x4223, 0xba21, 0xbf90, 0x2bb5, 0x4153, 0xbf31, 0xa17a, 0x1938, 0x4210, 0x4274, 0x2b0c, 0x43b2, 0x411d, 0x1a71, 0x40e4, 0x2d1a, 0x4041, 0x4091, 0x40c5, 0x4082, 0xb256, 0x43a8, 0x4365, 0x426f, 0x42fc, 0xb058, 0xb098, 0x4077, 0xb074, 0x426f, 0x2362, 0x40fd, 0xbf22, 0xb2ba, 0xbf60, 0x438c, 0x4005, 0x4240, 0xbfd6, 0x4120, 0x42ab, 0xb0fa, 0x4674, 0x40ef, 0xbfce, 0x42fb, 0xb03e, 0x426b, 0x4116, 0x426b, 0xb29c, 0x419f, 0x4106, 0x437d, 0x43f6, 0x4625, 0x0a71, 0x424b, 0xb287, 0xa587, 0x40c2, 0xa389, 0x4043, 0xb23a, 0x0f83, 0x0e74, 0xbfa3, 0x42c8, 0x1837, 0xb04a, 0xb215, 0x1f63, 0x409b, 0x466f, 0x4020, 0x40cb, 0x1fc4, 0x424a, 0x4041, 0xab3f, 0x2513, 0xba39, 0x2761, 0x08ef, 0xb01c, 0x40ec, 0x4344, 0x432a, 0x423a, 0xbac6, 0x008b, 0x43cc, 0x1f37, 0x0f45, 0xbf11, 0x4088, 0x4359, 0x42cc, 0x1c92, 0xbacb, 0xb06c, 0xaf25, 0xb299, 0xbfde, 0x4184, 0x3ea1, 0xaab7, 0xbfc0, 0x2538, 0xbfd4, 0x4100, 0x2625, 0x419a, 0xb210, 0x231f, 0x40b5, 0xbfd9, 0x1dd1, 0x1c34, 0x41a3, 0x1c6a, 0xa756, 0xbf70, 0x430f, 0x42c1, 0x4077, 0x404f, 0x41fc, 0x4245, 0xbff0, 0x42cb, 0x3c1f, 0x1c6b, 0xab3a, 0x4083, 0x4131, 0x4234, 0x41a8, 0x41fe, 0x435e, 0x4086, 0xbf98, 0xb2c8, 0xbae1, 0x3ccd, 0x441d, 0xb29c, 0x4047, 0xbf92, 0x42ea, 0x4077, 0x1f00, 0x2d3c, 0x434f, 0x1d83, 0x2a97, 0x4238, 0x43d0, 0xb274, 0x4000, 0x438d, 0x407a, 0x199e, 0x1ec9, 0x4041, 0x4133, 0x0b38, 0x437e, 0xbadb, 0x0c6c, 0x43c9, 0x436d, 0xb2b7, 0x1b76, 0x1207, 0x403a, 0xbfa2, 0x0e8e, 0x1b82, 0x2840, 0x4018, 0xbfa5, 0x2ffa, 0x4493, 0x1cf6, 0xbfe0, 0x243e, 0x4113, 0xb28a, 0x4057, 0xb2d6, 0x43a2, 0xb2ac, 0x40d0, 0x4198, 0xae4e, 0x42f7, 0x3681, 0x4231, 0x4455, 0x35d7, 0x1e5f, 0x411e, 0xb2dc, 0x422d, 0x1edd, 0x4164, 0x2df7, 0xa616, 0x1734, 0xbf53, 0x404c, 0x4061, 0x44c8, 0x43d0, 0xbfdb, 0x415f, 0x1c73, 0xb2de, 0x40bf, 0x462e, 0x4218, 0x1dcc, 0xba45, 0xaef1, 0x425a, 0xa89f, 0xb25a, 0xa25f, 0x1fa5, 0x417a, 0xba13, 0x418e, 0x42a4, 0x35d6, 0x1b4b, 0xba13, 0xba40, 0x1b23, 0x0b14, 0xb20c, 0x2bba, 0xba45, 0x3b65, 0x256f, 0xbfd7, 0xba0d, 0xb2d5, 0x4267, 0x24e6, 0x2d6d, 0x11bc, 0x42b6, 0xbf15, 0xb217, 0xb2d8, 0x405f, 0x4143, 0xa6e6, 0xa92f, 0x42fb, 0x42bd, 0x438b, 0x458a, 0x43c3, 0x420c, 0x43bb, 0x4068, 0x43d4, 0x3fa0, 0x1968, 0x03e1, 0xb291, 0xbf90, 0x2968, 0x4029, 0x38bc, 0x431d, 0x43af, 0x1b23, 0x41a3, 0xbfd9, 0x43f3, 0x229b, 0x0925, 0xb295, 0x15ec, 0xb223, 0x19d3, 0xba1c, 0xb080, 0xb27a, 0xbf7e, 0xba7d, 0xb236, 0x4365, 0x4273, 0x1c90, 0x21b5, 0x42cf, 0x40d6, 0x18c8, 0x0777, 0x281d, 0xbfc0, 0x40ca, 0x1b92, 0x412d, 0xa3aa, 0x44c3, 0x4220, 0x4087, 0x4110, 0x43b0, 0x1aad, 0x3f60, 0x1515, 0xb2fd, 0x40ea, 0xbf0c, 0x19d3, 0x41ba, 0x4003, 0x4040, 0xb239, 0x4057, 0xbfd0, 0x439d, 0x41c6, 0x4382, 0x4122, 0x30b4, 0xbff0, 0x4285, 0x4112, 0x0eec, 0x41f2, 0x4165, 0xba79, 0xbfc0, 0xbac0, 0x43bc, 0x1fa0, 0xbf3b, 0x17fb, 0xba32, 0xba37, 0xb218, 0x4397, 0x40c6, 0xb2e3, 0xbfe4, 0xb23e, 0xb07d, 0x42cb, 0x424e, 0x4269, 0x41e7, 0x4323, 0x40f6, 0x3575, 0x4110, 0x41bc, 0xb2e8, 0x4228, 0xb242, 0x403a, 0x4262, 0xba27, 0x153a, 0xba00, 0xba70, 0x2dde, 0xb290, 0xbf91, 0x40bd, 0x427b, 0x0a83, 0x2605, 0x40ca, 0xa13e, 0x408a, 0x2078, 0xa34c, 0xbfc0, 0x4671, 0x1ae9, 0xbaed, 0x2113, 0xb27b, 0x4138, 0xb268, 0x0f57, 0xbfa5, 0xaeb6, 0xbac7, 0x4304, 0xb03a, 0x1524, 0x4439, 0xb2cf, 0xbfb0, 0xb252, 0xb083, 0x1b1f, 0x4297, 0xa384, 0x4077, 0x1b4d, 0x4386, 0x41da, 0x29a1, 0xbfc0, 0x1f1a, 0x3f17, 0x4007, 0x42f5, 0x4192, 0xbfe8, 0x2373, 0x40b8, 0x4160, 0x4621, 0xb02b, 0xae8c, 0x13f9, 0xba3d, 0x25d3, 0x3d46, 0x41df, 0x4481, 0x1289, 0xa8ac, 0x4257, 0x1157, 0x423d, 0xbff0, 0xb2f2, 0xab13, 0xbfde, 0x412c, 0xb09e, 0x40ba, 0xb0a4, 0x4356, 0x43fe, 0x4209, 0xbf3a, 0x40f3, 0x43df, 0x39a1, 0xb0c3, 0x0992, 0x46ca, 0x4269, 0x417e, 0xb200, 0x46bb, 0x41d6, 0xba1c, 0xbfe0, 0x42a5, 0x3e74, 0x4651, 0x4371, 0x435c, 0x437a, 0x23a1, 0xb217, 0x1bd7, 0x1920, 0x449b, 0xb24c, 0xbf26, 0x4551, 0x41d7, 0x43d9, 0xae4b, 0x4008, 0x403d, 0xba74, 0x43e3, 0x185b, 0xba5c, 0xbf16, 0xba06, 0xbff0, 0x4118, 0x2b3b, 0x435a, 0x409b, 0x4085, 0x434b, 0xa0a7, 0xbf02, 0x1b80, 0xb2a7, 0x1fb5, 0x2ab4, 0x4102, 0x40ec, 0x2d72, 0xba16, 0x4076, 0x23fd, 0xab93, 0xba7e, 0xbf5d, 0x41a0, 0x1d5c, 0x43cc, 0x3cb3, 0x4770, 0xe7fe + ], + StartRegs = [0x96070e06, 0x60f8a631, 0x6d122e21, 0xad567bfc, 0x291715df, 0x4658e055, 0x3efa71b8, 0x42812292, 0x84889393, 0xde7eb11f, 0x47c9ca7e, 0x0ba82b44, 0x8ffeeee8, 0x71d424e5, 0x00000000, 0x100001f0 + ], + FinalRegs = [0xb75339fa, 0xfffcaf4b, 0x00000000, 0x8488a09f, 0x000350b4, 0x48ace04c, 0x00002fab, 0x0000ab2f, 0x84889836, 0x00000741, 0x00000741, 0x000000a0, 0x00001640, 0x84889e53, 0x00000000, 0x200001d0 + ], }, new() { - Instructions = new ushort[] { 0x4361, 0xb2d9, 0x43f4, 0x2def, 0x1e99, 0x1afe, 0xbfc7, 0x43d0, 0x404f, 0xafd3, 0x4601, 0x4586, 0x4143, 0x42bd, 0x4118, 0x4128, 0x431b, 0xa978, 0x2d56, 0x4607, 0x4124, 0x401b, 0x40a2, 0x430f, 0xba2a, 0xae2f, 0xb035, 0x3079, 0xa7cc, 0x4374, 0x2f83, 0xb20d, 0xbf6c, 0xacbf, 0x40e3, 0xb23c, 0x02c5, 0x433b, 0x40fe, 0x284b, 0x4208, 0x4616, 0x444a, 0xbfc8, 0x3a02, 0x4427, 0x3cd7, 0xa66c, 0x3bf0, 0x4176, 0xb277, 0x0c72, 0x033a, 0x4374, 0x3b46, 0x4039, 0x4646, 0xbaef, 0x4694, 0x43d8, 0xbff0, 0x18d4, 0x191f, 0x1ba0, 0x34cd, 0x09c2, 0x41f8, 0x08e6, 0x22f3, 0xbf76, 0xb0c1, 0x4267, 0xba61, 0xb2cc, 0x412e, 0x41fc, 0x2b38, 0xba61, 0x4130, 0x3f3b, 0x19f1, 0xb2e9, 0x43d3, 0x429d, 0x3b51, 0x42a9, 0x3dcd, 0x06c6, 0x42e0, 0x404e, 0xbf2b, 0xa69c, 0xb26a, 0x4013, 0x2ddf, 0xba2c, 0xafc1, 0xb0c8, 0xb0e1, 0x0dbf, 0x42e7, 0x4102, 0xbf90, 0x4034, 0xb013, 0x1c3c, 0x41fb, 0x1961, 0xb26d, 0x45d2, 0xb07e, 0xbf87, 0x4085, 0x1cf2, 0xbfc0, 0x42ff, 0xa589, 0x43c3, 0xb24f, 0x418e, 0x4261, 0xab43, 0x1b92, 0xbf05, 0x4388, 0x43bb, 0x4038, 0x4393, 0x4187, 0xa081, 0xb0d2, 0x42e2, 0xbf00, 0x2535, 0x43fe, 0x42c1, 0xb24a, 0x408a, 0x1f7d, 0xbf92, 0x1bcb, 0x1b0c, 0x3141, 0xb262, 0xbf86, 0x08aa, 0xb2f5, 0x4262, 0xbfdf, 0x42ea, 0x460c, 0x424f, 0x1ada, 0x42f2, 0xa012, 0x081b, 0x4046, 0x42b5, 0xb008, 0xb231, 0xb0e8, 0x42c3, 0x4187, 0x464b, 0x4016, 0x1abe, 0x098f, 0x1e7f, 0xba68, 0x2a45, 0x1b1a, 0xbf96, 0x402f, 0x1350, 0x3bc2, 0x411b, 0x04a8, 0xb076, 0xb03b, 0x4550, 0xba39, 0xb22a, 0x42f4, 0x4334, 0x4249, 0xb268, 0x12a7, 0x414b, 0x45b1, 0x2e3a, 0xb021, 0x10fa, 0x4249, 0x40b0, 0xbf71, 0x422f, 0x1c42, 0xba7b, 0x41f7, 0xbacd, 0x3d7d, 0xba1d, 0x44d8, 0x45e3, 0x4021, 0x1933, 0xbac1, 0x386d, 0x2777, 0x2151, 0x425a, 0xb251, 0x4376, 0xb008, 0xb2fd, 0xbf42, 0x4191, 0x1724, 0x41da, 0x418a, 0x1a0b, 0x3c2d, 0x345d, 0x0f74, 0xa44e, 0x461c, 0x18d4, 0xa030, 0xb2e0, 0xba75, 0x3710, 0xbf81, 0xba2d, 0x2b8b, 0x1c31, 0x44e1, 0xbfbc, 0x40f3, 0x398e, 0xb260, 0x4567, 0x46e8, 0xb240, 0x1c35, 0xba1b, 0x46c1, 0x4109, 0x43b7, 0xb094, 0x1676, 0x4143, 0x43f1, 0xbf87, 0x136c, 0x4058, 0x1e68, 0x4234, 0x059a, 0x430d, 0x1631, 0x41fe, 0x43b6, 0xb2ed, 0xbff0, 0x4024, 0x406d, 0x4367, 0x418a, 0x4307, 0xbfaf, 0x4374, 0xbae2, 0x4097, 0x3185, 0xb0ec, 0xb051, 0x4052, 0xba60, 0x433d, 0xb210, 0x4347, 0x402e, 0x43d1, 0x412f, 0xb0f2, 0x2310, 0xbfac, 0x4191, 0xb2fd, 0x1db4, 0x4559, 0xb08f, 0xb2aa, 0x4182, 0x42ae, 0x4036, 0xaf83, 0xb234, 0x418d, 0xbf8c, 0x407b, 0xba34, 0x41cf, 0x4351, 0x41c5, 0xba77, 0x1cfd, 0xa0cd, 0xbac7, 0xbf43, 0xba21, 0x425d, 0xba4c, 0xba13, 0x413c, 0x4095, 0xa127, 0x4198, 0xb2f3, 0x1f4e, 0x40e9, 0x19cc, 0xba4c, 0xb2e0, 0x4241, 0xbf90, 0xb214, 0x4224, 0x40f4, 0x3c7c, 0x07b9, 0x43e1, 0x41c7, 0x4339, 0x4181, 0xba11, 0x0bcc, 0xbf29, 0x4051, 0x1dbf, 0xb25a, 0x07c0, 0xba76, 0x413e, 0x417f, 0x1d87, 0xa388, 0x1d2e, 0x40e6, 0x4165, 0x432e, 0x050e, 0xb0fd, 0x43f4, 0x1895, 0xbf32, 0xb090, 0x40ba, 0x1e9a, 0x1f13, 0x45d2, 0x4044, 0x1f04, 0xb2ea, 0x43fa, 0x4197, 0x43d6, 0x1de6, 0x4671, 0x402d, 0x4058, 0x1aca, 0x43c5, 0xadd4, 0x41e8, 0xba3b, 0xb273, 0xbf9c, 0x197a, 0xbaf6, 0xbfb0, 0xba0e, 0x45d1, 0x1f11, 0x4379, 0xaf6e, 0xbff0, 0xb019, 0xa676, 0xbf4e, 0x4264, 0x4351, 0xb051, 0xbae2, 0x415e, 0x4355, 0x4016, 0x437f, 0xbfca, 0x408e, 0x42ef, 0xb240, 0x40cc, 0x311b, 0x435a, 0xab55, 0x43de, 0xaeae, 0x20fa, 0xbacb, 0x4301, 0x43bd, 0x42b6, 0xbfb0, 0x403c, 0xaf7d, 0x1941, 0xbf05, 0xba02, 0x0c49, 0x42cc, 0x1e9d, 0x1efc, 0x0a69, 0x42a6, 0x42e6, 0x1ae2, 0xba55, 0xbfd0, 0x407b, 0xbaf9, 0xa02b, 0xba5d, 0xbf16, 0xb239, 0xbfa0, 0xba47, 0x418f, 0x41e9, 0xafc4, 0x23c8, 0xb04e, 0x42fb, 0xaf00, 0x402a, 0x4270, 0x4380, 0x4214, 0x4466, 0x2297, 0x441a, 0xbf6d, 0x4298, 0x1836, 0x1918, 0x3cff, 0x42ec, 0x4363, 0xbf60, 0x4311, 0xbfa3, 0x4004, 0x0c27, 0x41fe, 0x4346, 0xb0f2, 0x1544, 0x43b7, 0x412d, 0xab14, 0x1f41, 0xb2ab, 0x190f, 0x218f, 0xb2d9, 0x0e76, 0x40b8, 0xb2d0, 0x41da, 0xbf09, 0x1a5e, 0x4340, 0x4004, 0x0884, 0x437a, 0xbf90, 0x428a, 0x19e6, 0x4283, 0x439b, 0xbfb8, 0x43d1, 0xba5f, 0x4366, 0x06b4, 0x4390, 0xb20c, 0x2116, 0x10b5, 0x4266, 0x43d3, 0x17f9, 0x42d4, 0xbac7, 0x437c, 0x434e, 0x410d, 0xaef0, 0xad99, 0x231d, 0x41a0, 0xb2ac, 0x0716, 0x3728, 0x1cbc, 0xbac7, 0x42d9, 0xbf05, 0xb2fb, 0x438a, 0x08e7, 0x42f7, 0xa411, 0x35d7, 0x4631, 0x46f2, 0xa304, 0x4650, 0x4055, 0x416c, 0x4336, 0x0e29, 0x41cb, 0x40e5, 0xb2e9, 0x0e4d, 0x4172, 0x1d2c, 0x3f5c, 0x301e, 0x4245, 0xba5e, 0x0d11, 0xbf99, 0x4155, 0x02c2, 0xbfb0, 0x40ec, 0xb0a7, 0xb20a, 0xba21, 0xba5e, 0x41b8, 0x42cf, 0x41ab, 0xbfe2, 0xbae1, 0x3b4b, 0xb01c, 0x46cd, 0x43db, 0xb2c6, 0x46f0, 0x4141, 0x1c08, 0x41e4, 0xba11, 0x4127, 0xb220, 0xba75, 0x1846, 0xbf43, 0x1be2, 0x4073, 0x418f, 0x37e6, 0x2c57, 0xaf36, 0xb23b, 0x4095, 0x412e, 0x0e71, 0x42ba, 0x19ec, 0xb0ab, 0x19d9, 0xa24a, 0x362e, 0x408b, 0x1094, 0xb21f, 0x40c9, 0x42be, 0xb2c7, 0x409e, 0xbf15, 0xb0cf, 0xb00b, 0x415c, 0x4009, 0x4186, 0xb0c7, 0x4257, 0x1992, 0x40c9, 0xbf00, 0xb2d0, 0x4168, 0xbf9d, 0x43c4, 0xbaf8, 0xba68, 0xba26, 0x45bc, 0x4214, 0x1231, 0xbfd4, 0x4009, 0xba00, 0x3e72, 0xbf1e, 0xb29b, 0xbacb, 0xbaf9, 0x4352, 0x4105, 0x42e7, 0xaa0f, 0xb2b3, 0x43a6, 0x4699, 0x2170, 0x0c8e, 0xae4a, 0xbfe0, 0xb004, 0xb237, 0x1a88, 0xbf41, 0xb2ad, 0xbf00, 0x13a8, 0x42a5, 0x00cb, 0xa3f6, 0x1bd6, 0x44d1, 0xba06, 0x4278, 0xba65, 0xbfc0, 0x098f, 0x029d, 0x2a7b, 0xb2df, 0x07a7, 0x0105, 0xad3c, 0x43ac, 0x40bf, 0x428f, 0x339a, 0x40fb, 0x43b9, 0x446d, 0x42ac, 0x1083, 0xad05, 0xbf8c, 0x4264, 0x42e4, 0xbaf2, 0xbad8, 0xb21f, 0x4244, 0x25d1, 0xb282, 0x405c, 0x1a04, 0x4399, 0x414d, 0xb2fa, 0xba6b, 0xb216, 0xb250, 0x438b, 0x2b3c, 0x40b0, 0x425b, 0x412e, 0xb220, 0xb25f, 0xb2c2, 0x2ec8, 0xbf3a, 0xba70, 0x43bc, 0xb299, 0x4284, 0x369c, 0xbaff, 0x058f, 0xba2c, 0x1699, 0x42e3, 0x41ce, 0xabfc, 0xb2cc, 0x2a1e, 0xb201, 0x19d3, 0xb099, 0xbf34, 0x332f, 0x0535, 0x4422, 0x42b9, 0xbfdf, 0xb270, 0x400a, 0x40d7, 0x4024, 0x1f9e, 0x196d, 0x434c, 0x1dd6, 0x41df, 0xb219, 0x405d, 0x4022, 0x1e04, 0x41dc, 0x4296, 0x43c4, 0xba25, 0x145b, 0x42a6, 0x4154, 0xbf0a, 0x4061, 0x28b4, 0x1c9f, 0x4310, 0x274b, 0x4191, 0x4034, 0xbf7f, 0x439a, 0x42d8, 0xb0eb, 0xba0f, 0xba5a, 0x41a7, 0x43c1, 0x0538, 0x41ad, 0x42a1, 0x43ce, 0xbf04, 0xa79a, 0x1b98, 0xb018, 0xb0e0, 0x42f5, 0x4476, 0xaf71, 0x433b, 0xb212, 0xbf73, 0x0a7e, 0x2b1f, 0xbafb, 0xba4e, 0x0425, 0x420d, 0x43e2, 0x43e0, 0x4065, 0x4117, 0xba07, 0x2562, 0xa532, 0x43b3, 0xba29, 0x2779, 0x4353, 0x440b, 0x4140, 0xbf58, 0x27dc, 0x4286, 0xa57a, 0x42b2, 0x425d, 0xb2a9, 0xba52, 0x43de, 0x41ee, 0x0796, 0x1fa7, 0x2c5f, 0x2a61, 0x1c25, 0x425a, 0x40b7, 0x42f8, 0x4180, 0x40b4, 0xbfc5, 0x428e, 0x4205, 0xba23, 0x4003, 0x1f55, 0x3e3c, 0x416c, 0x42e0, 0xb234, 0x1d80, 0x432c, 0x417f, 0x4079, 0x3538, 0x1eff, 0x4475, 0xbf34, 0xb277, 0x43b6, 0x4355, 0x40d3, 0xb023, 0x17b5, 0x1d0a, 0x2b3a, 0x4455, 0x0615, 0xbf0b, 0x4045, 0x40ad, 0x2759, 0xb068, 0x40aa, 0x1f85, 0x436b, 0x4268, 0xb282, 0x40d6, 0xb0ed, 0xb01d, 0x422d, 0x4104, 0x4114, 0x1d54, 0xbf70, 0x1d50, 0xbf98, 0x432f, 0x403a, 0x417f, 0x4622, 0xb08c, 0x1bf4, 0x3219, 0x4079, 0x23f2, 0xba10, 0x29d4, 0x4224, 0x431b, 0x41ea, 0x4440, 0x41f5, 0x40c6, 0x1e5e, 0x01c4, 0x34a9, 0x1bde, 0x43b6, 0xb2e9, 0xbf24, 0x3fa4, 0xb2c1, 0x41d5, 0x4002, 0x4215, 0x185d, 0x1a17, 0xb27f, 0xb23a, 0x1397, 0x1e78, 0xb03b, 0x1cad, 0xba6a, 0x2a81, 0x0ee6, 0x4351, 0xbfbe, 0xb2fa, 0x225e, 0x429d, 0x410b, 0x4080, 0xba53, 0x4196, 0x40a2, 0x437b, 0x0a59, 0xb2aa, 0xbae9, 0x0534, 0x40a9, 0x465a, 0x448c, 0xb26a, 0xb213, 0x41c5, 0x424c, 0x18e1, 0x30fe, 0x4046, 0x40d8, 0xbf39, 0x1f57, 0x1865, 0x4059, 0x4376, 0x4564, 0x4438, 0x41e0, 0x12d8, 0xb06b, 0x4329, 0x42b6, 0x40f5, 0x41e4, 0xbac3, 0xb265, 0x4570, 0x42f8, 0x2fb0, 0x432d, 0x438e, 0x4222, 0x438f, 0xbf02, 0x43d6, 0x4179, 0x278d, 0x25df, 0xbafc, 0x251e, 0x1cfc, 0xba69, 0xbf31, 0x0ac3, 0xb0ad, 0x4205, 0x441e, 0x410c, 0xb273, 0x42be, 0x1e0d, 0xbf07, 0x468c, 0x4016, 0xa105, 0x437e, 0x416e, 0xbaf0, 0x418d, 0x3851, 0x2464, 0x43b8, 0x43e5, 0xbac0, 0x4146, 0x3c61, 0x2797, 0x4094, 0x41fb, 0x181a, 0x4437, 0xb273, 0x4365, 0x4321, 0x1fe4, 0x4199, 0x269e, 0x1c0a, 0xbf77, 0x40b0, 0x3eaf, 0x1f30, 0xa473, 0x26a3, 0x42f4, 0xb0a2, 0x4280, 0xb2d0, 0x2fb3, 0xb017, 0xb07d, 0x43f7, 0x439e, 0x43f1, 0xbfe0, 0x459e, 0x3cb3, 0xbfd6, 0x1244, 0x2ba2, 0x4391, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0xfaefb3b8, 0x78bd4750, 0x110d5992, 0x6de9a720, 0x42910210, 0xa47797d3, 0xb17bbffb, 0x69ee994d, 0xbfeace8e, 0x33a9e570, 0x6e9aadf6, 0xc053407f, 0x87f3e955, 0x34a56210, 0x00000000, 0x700001f0 }, - FinalRegs = new uint[] { 0x000000a1, 0xffffe85e, 0x000017a1, 0x00000002, 0x000018e1, 0x00000000, 0x000000a1, 0xffffff5c, 0x00000000, 0x0000ffbc, 0x00000000, 0xc053407f, 0x00021000, 0x34a56118, 0x00000000, 0x800001d0 }, + Instructions = [0x4361, 0xb2d9, 0x43f4, 0x2def, 0x1e99, 0x1afe, 0xbfc7, 0x43d0, 0x404f, 0xafd3, 0x4601, 0x4586, 0x4143, 0x42bd, 0x4118, 0x4128, 0x431b, 0xa978, 0x2d56, 0x4607, 0x4124, 0x401b, 0x40a2, 0x430f, 0xba2a, 0xae2f, 0xb035, 0x3079, 0xa7cc, 0x4374, 0x2f83, 0xb20d, 0xbf6c, 0xacbf, 0x40e3, 0xb23c, 0x02c5, 0x433b, 0x40fe, 0x284b, 0x4208, 0x4616, 0x444a, 0xbfc8, 0x3a02, 0x4427, 0x3cd7, 0xa66c, 0x3bf0, 0x4176, 0xb277, 0x0c72, 0x033a, 0x4374, 0x3b46, 0x4039, 0x4646, 0xbaef, 0x4694, 0x43d8, 0xbff0, 0x18d4, 0x191f, 0x1ba0, 0x34cd, 0x09c2, 0x41f8, 0x08e6, 0x22f3, 0xbf76, 0xb0c1, 0x4267, 0xba61, 0xb2cc, 0x412e, 0x41fc, 0x2b38, 0xba61, 0x4130, 0x3f3b, 0x19f1, 0xb2e9, 0x43d3, 0x429d, 0x3b51, 0x42a9, 0x3dcd, 0x06c6, 0x42e0, 0x404e, 0xbf2b, 0xa69c, 0xb26a, 0x4013, 0x2ddf, 0xba2c, 0xafc1, 0xb0c8, 0xb0e1, 0x0dbf, 0x42e7, 0x4102, 0xbf90, 0x4034, 0xb013, 0x1c3c, 0x41fb, 0x1961, 0xb26d, 0x45d2, 0xb07e, 0xbf87, 0x4085, 0x1cf2, 0xbfc0, 0x42ff, 0xa589, 0x43c3, 0xb24f, 0x418e, 0x4261, 0xab43, 0x1b92, 0xbf05, 0x4388, 0x43bb, 0x4038, 0x4393, 0x4187, 0xa081, 0xb0d2, 0x42e2, 0xbf00, 0x2535, 0x43fe, 0x42c1, 0xb24a, 0x408a, 0x1f7d, 0xbf92, 0x1bcb, 0x1b0c, 0x3141, 0xb262, 0xbf86, 0x08aa, 0xb2f5, 0x4262, 0xbfdf, 0x42ea, 0x460c, 0x424f, 0x1ada, 0x42f2, 0xa012, 0x081b, 0x4046, 0x42b5, 0xb008, 0xb231, 0xb0e8, 0x42c3, 0x4187, 0x464b, 0x4016, 0x1abe, 0x098f, 0x1e7f, 0xba68, 0x2a45, 0x1b1a, 0xbf96, 0x402f, 0x1350, 0x3bc2, 0x411b, 0x04a8, 0xb076, 0xb03b, 0x4550, 0xba39, 0xb22a, 0x42f4, 0x4334, 0x4249, 0xb268, 0x12a7, 0x414b, 0x45b1, 0x2e3a, 0xb021, 0x10fa, 0x4249, 0x40b0, 0xbf71, 0x422f, 0x1c42, 0xba7b, 0x41f7, 0xbacd, 0x3d7d, 0xba1d, 0x44d8, 0x45e3, 0x4021, 0x1933, 0xbac1, 0x386d, 0x2777, 0x2151, 0x425a, 0xb251, 0x4376, 0xb008, 0xb2fd, 0xbf42, 0x4191, 0x1724, 0x41da, 0x418a, 0x1a0b, 0x3c2d, 0x345d, 0x0f74, 0xa44e, 0x461c, 0x18d4, 0xa030, 0xb2e0, 0xba75, 0x3710, 0xbf81, 0xba2d, 0x2b8b, 0x1c31, 0x44e1, 0xbfbc, 0x40f3, 0x398e, 0xb260, 0x4567, 0x46e8, 0xb240, 0x1c35, 0xba1b, 0x46c1, 0x4109, 0x43b7, 0xb094, 0x1676, 0x4143, 0x43f1, 0xbf87, 0x136c, 0x4058, 0x1e68, 0x4234, 0x059a, 0x430d, 0x1631, 0x41fe, 0x43b6, 0xb2ed, 0xbff0, 0x4024, 0x406d, 0x4367, 0x418a, 0x4307, 0xbfaf, 0x4374, 0xbae2, 0x4097, 0x3185, 0xb0ec, 0xb051, 0x4052, 0xba60, 0x433d, 0xb210, 0x4347, 0x402e, 0x43d1, 0x412f, 0xb0f2, 0x2310, 0xbfac, 0x4191, 0xb2fd, 0x1db4, 0x4559, 0xb08f, 0xb2aa, 0x4182, 0x42ae, 0x4036, 0xaf83, 0xb234, 0x418d, 0xbf8c, 0x407b, 0xba34, 0x41cf, 0x4351, 0x41c5, 0xba77, 0x1cfd, 0xa0cd, 0xbac7, 0xbf43, 0xba21, 0x425d, 0xba4c, 0xba13, 0x413c, 0x4095, 0xa127, 0x4198, 0xb2f3, 0x1f4e, 0x40e9, 0x19cc, 0xba4c, 0xb2e0, 0x4241, 0xbf90, 0xb214, 0x4224, 0x40f4, 0x3c7c, 0x07b9, 0x43e1, 0x41c7, 0x4339, 0x4181, 0xba11, 0x0bcc, 0xbf29, 0x4051, 0x1dbf, 0xb25a, 0x07c0, 0xba76, 0x413e, 0x417f, 0x1d87, 0xa388, 0x1d2e, 0x40e6, 0x4165, 0x432e, 0x050e, 0xb0fd, 0x43f4, 0x1895, 0xbf32, 0xb090, 0x40ba, 0x1e9a, 0x1f13, 0x45d2, 0x4044, 0x1f04, 0xb2ea, 0x43fa, 0x4197, 0x43d6, 0x1de6, 0x4671, 0x402d, 0x4058, 0x1aca, 0x43c5, 0xadd4, 0x41e8, 0xba3b, 0xb273, 0xbf9c, 0x197a, 0xbaf6, 0xbfb0, 0xba0e, 0x45d1, 0x1f11, 0x4379, 0xaf6e, 0xbff0, 0xb019, 0xa676, 0xbf4e, 0x4264, 0x4351, 0xb051, 0xbae2, 0x415e, 0x4355, 0x4016, 0x437f, 0xbfca, 0x408e, 0x42ef, 0xb240, 0x40cc, 0x311b, 0x435a, 0xab55, 0x43de, 0xaeae, 0x20fa, 0xbacb, 0x4301, 0x43bd, 0x42b6, 0xbfb0, 0x403c, 0xaf7d, 0x1941, 0xbf05, 0xba02, 0x0c49, 0x42cc, 0x1e9d, 0x1efc, 0x0a69, 0x42a6, 0x42e6, 0x1ae2, 0xba55, 0xbfd0, 0x407b, 0xbaf9, 0xa02b, 0xba5d, 0xbf16, 0xb239, 0xbfa0, 0xba47, 0x418f, 0x41e9, 0xafc4, 0x23c8, 0xb04e, 0x42fb, 0xaf00, 0x402a, 0x4270, 0x4380, 0x4214, 0x4466, 0x2297, 0x441a, 0xbf6d, 0x4298, 0x1836, 0x1918, 0x3cff, 0x42ec, 0x4363, 0xbf60, 0x4311, 0xbfa3, 0x4004, 0x0c27, 0x41fe, 0x4346, 0xb0f2, 0x1544, 0x43b7, 0x412d, 0xab14, 0x1f41, 0xb2ab, 0x190f, 0x218f, 0xb2d9, 0x0e76, 0x40b8, 0xb2d0, 0x41da, 0xbf09, 0x1a5e, 0x4340, 0x4004, 0x0884, 0x437a, 0xbf90, 0x428a, 0x19e6, 0x4283, 0x439b, 0xbfb8, 0x43d1, 0xba5f, 0x4366, 0x06b4, 0x4390, 0xb20c, 0x2116, 0x10b5, 0x4266, 0x43d3, 0x17f9, 0x42d4, 0xbac7, 0x437c, 0x434e, 0x410d, 0xaef0, 0xad99, 0x231d, 0x41a0, 0xb2ac, 0x0716, 0x3728, 0x1cbc, 0xbac7, 0x42d9, 0xbf05, 0xb2fb, 0x438a, 0x08e7, 0x42f7, 0xa411, 0x35d7, 0x4631, 0x46f2, 0xa304, 0x4650, 0x4055, 0x416c, 0x4336, 0x0e29, 0x41cb, 0x40e5, 0xb2e9, 0x0e4d, 0x4172, 0x1d2c, 0x3f5c, 0x301e, 0x4245, 0xba5e, 0x0d11, 0xbf99, 0x4155, 0x02c2, 0xbfb0, 0x40ec, 0xb0a7, 0xb20a, 0xba21, 0xba5e, 0x41b8, 0x42cf, 0x41ab, 0xbfe2, 0xbae1, 0x3b4b, 0xb01c, 0x46cd, 0x43db, 0xb2c6, 0x46f0, 0x4141, 0x1c08, 0x41e4, 0xba11, 0x4127, 0xb220, 0xba75, 0x1846, 0xbf43, 0x1be2, 0x4073, 0x418f, 0x37e6, 0x2c57, 0xaf36, 0xb23b, 0x4095, 0x412e, 0x0e71, 0x42ba, 0x19ec, 0xb0ab, 0x19d9, 0xa24a, 0x362e, 0x408b, 0x1094, 0xb21f, 0x40c9, 0x42be, 0xb2c7, 0x409e, 0xbf15, 0xb0cf, 0xb00b, 0x415c, 0x4009, 0x4186, 0xb0c7, 0x4257, 0x1992, 0x40c9, 0xbf00, 0xb2d0, 0x4168, 0xbf9d, 0x43c4, 0xbaf8, 0xba68, 0xba26, 0x45bc, 0x4214, 0x1231, 0xbfd4, 0x4009, 0xba00, 0x3e72, 0xbf1e, 0xb29b, 0xbacb, 0xbaf9, 0x4352, 0x4105, 0x42e7, 0xaa0f, 0xb2b3, 0x43a6, 0x4699, 0x2170, 0x0c8e, 0xae4a, 0xbfe0, 0xb004, 0xb237, 0x1a88, 0xbf41, 0xb2ad, 0xbf00, 0x13a8, 0x42a5, 0x00cb, 0xa3f6, 0x1bd6, 0x44d1, 0xba06, 0x4278, 0xba65, 0xbfc0, 0x098f, 0x029d, 0x2a7b, 0xb2df, 0x07a7, 0x0105, 0xad3c, 0x43ac, 0x40bf, 0x428f, 0x339a, 0x40fb, 0x43b9, 0x446d, 0x42ac, 0x1083, 0xad05, 0xbf8c, 0x4264, 0x42e4, 0xbaf2, 0xbad8, 0xb21f, 0x4244, 0x25d1, 0xb282, 0x405c, 0x1a04, 0x4399, 0x414d, 0xb2fa, 0xba6b, 0xb216, 0xb250, 0x438b, 0x2b3c, 0x40b0, 0x425b, 0x412e, 0xb220, 0xb25f, 0xb2c2, 0x2ec8, 0xbf3a, 0xba70, 0x43bc, 0xb299, 0x4284, 0x369c, 0xbaff, 0x058f, 0xba2c, 0x1699, 0x42e3, 0x41ce, 0xabfc, 0xb2cc, 0x2a1e, 0xb201, 0x19d3, 0xb099, 0xbf34, 0x332f, 0x0535, 0x4422, 0x42b9, 0xbfdf, 0xb270, 0x400a, 0x40d7, 0x4024, 0x1f9e, 0x196d, 0x434c, 0x1dd6, 0x41df, 0xb219, 0x405d, 0x4022, 0x1e04, 0x41dc, 0x4296, 0x43c4, 0xba25, 0x145b, 0x42a6, 0x4154, 0xbf0a, 0x4061, 0x28b4, 0x1c9f, 0x4310, 0x274b, 0x4191, 0x4034, 0xbf7f, 0x439a, 0x42d8, 0xb0eb, 0xba0f, 0xba5a, 0x41a7, 0x43c1, 0x0538, 0x41ad, 0x42a1, 0x43ce, 0xbf04, 0xa79a, 0x1b98, 0xb018, 0xb0e0, 0x42f5, 0x4476, 0xaf71, 0x433b, 0xb212, 0xbf73, 0x0a7e, 0x2b1f, 0xbafb, 0xba4e, 0x0425, 0x420d, 0x43e2, 0x43e0, 0x4065, 0x4117, 0xba07, 0x2562, 0xa532, 0x43b3, 0xba29, 0x2779, 0x4353, 0x440b, 0x4140, 0xbf58, 0x27dc, 0x4286, 0xa57a, 0x42b2, 0x425d, 0xb2a9, 0xba52, 0x43de, 0x41ee, 0x0796, 0x1fa7, 0x2c5f, 0x2a61, 0x1c25, 0x425a, 0x40b7, 0x42f8, 0x4180, 0x40b4, 0xbfc5, 0x428e, 0x4205, 0xba23, 0x4003, 0x1f55, 0x3e3c, 0x416c, 0x42e0, 0xb234, 0x1d80, 0x432c, 0x417f, 0x4079, 0x3538, 0x1eff, 0x4475, 0xbf34, 0xb277, 0x43b6, 0x4355, 0x40d3, 0xb023, 0x17b5, 0x1d0a, 0x2b3a, 0x4455, 0x0615, 0xbf0b, 0x4045, 0x40ad, 0x2759, 0xb068, 0x40aa, 0x1f85, 0x436b, 0x4268, 0xb282, 0x40d6, 0xb0ed, 0xb01d, 0x422d, 0x4104, 0x4114, 0x1d54, 0xbf70, 0x1d50, 0xbf98, 0x432f, 0x403a, 0x417f, 0x4622, 0xb08c, 0x1bf4, 0x3219, 0x4079, 0x23f2, 0xba10, 0x29d4, 0x4224, 0x431b, 0x41ea, 0x4440, 0x41f5, 0x40c6, 0x1e5e, 0x01c4, 0x34a9, 0x1bde, 0x43b6, 0xb2e9, 0xbf24, 0x3fa4, 0xb2c1, 0x41d5, 0x4002, 0x4215, 0x185d, 0x1a17, 0xb27f, 0xb23a, 0x1397, 0x1e78, 0xb03b, 0x1cad, 0xba6a, 0x2a81, 0x0ee6, 0x4351, 0xbfbe, 0xb2fa, 0x225e, 0x429d, 0x410b, 0x4080, 0xba53, 0x4196, 0x40a2, 0x437b, 0x0a59, 0xb2aa, 0xbae9, 0x0534, 0x40a9, 0x465a, 0x448c, 0xb26a, 0xb213, 0x41c5, 0x424c, 0x18e1, 0x30fe, 0x4046, 0x40d8, 0xbf39, 0x1f57, 0x1865, 0x4059, 0x4376, 0x4564, 0x4438, 0x41e0, 0x12d8, 0xb06b, 0x4329, 0x42b6, 0x40f5, 0x41e4, 0xbac3, 0xb265, 0x4570, 0x42f8, 0x2fb0, 0x432d, 0x438e, 0x4222, 0x438f, 0xbf02, 0x43d6, 0x4179, 0x278d, 0x25df, 0xbafc, 0x251e, 0x1cfc, 0xba69, 0xbf31, 0x0ac3, 0xb0ad, 0x4205, 0x441e, 0x410c, 0xb273, 0x42be, 0x1e0d, 0xbf07, 0x468c, 0x4016, 0xa105, 0x437e, 0x416e, 0xbaf0, 0x418d, 0x3851, 0x2464, 0x43b8, 0x43e5, 0xbac0, 0x4146, 0x3c61, 0x2797, 0x4094, 0x41fb, 0x181a, 0x4437, 0xb273, 0x4365, 0x4321, 0x1fe4, 0x4199, 0x269e, 0x1c0a, 0xbf77, 0x40b0, 0x3eaf, 0x1f30, 0xa473, 0x26a3, 0x42f4, 0xb0a2, 0x4280, 0xb2d0, 0x2fb3, 0xb017, 0xb07d, 0x43f7, 0x439e, 0x43f1, 0xbfe0, 0x459e, 0x3cb3, 0xbfd6, 0x1244, 0x2ba2, 0x4391, 0x4770, 0xe7fe + ], + StartRegs = [0xfaefb3b8, 0x78bd4750, 0x110d5992, 0x6de9a720, 0x42910210, 0xa47797d3, 0xb17bbffb, 0x69ee994d, 0xbfeace8e, 0x33a9e570, 0x6e9aadf6, 0xc053407f, 0x87f3e955, 0x34a56210, 0x00000000, 0x700001f0 + ], + FinalRegs = [0x000000a1, 0xffffe85e, 0x000017a1, 0x00000002, 0x000018e1, 0x00000000, 0x000000a1, 0xffffff5c, 0x00000000, 0x0000ffbc, 0x00000000, 0xc053407f, 0x00021000, 0x34a56118, 0x00000000, 0x800001d0 + ], }, new() { - Instructions = new ushort[] { 0xba27, 0x42db, 0x40d3, 0x4362, 0x409f, 0x1812, 0xbac7, 0xa7df, 0x34cd, 0xa70f, 0x4280, 0x40b0, 0xb0ee, 0x01be, 0xb211, 0x4052, 0xb2a7, 0x4063, 0x406f, 0x4654, 0x434e, 0x42fb, 0xbf25, 0x4269, 0x1119, 0xb264, 0x4301, 0xba63, 0x1a18, 0xb2fb, 0x1887, 0x2f9b, 0xb233, 0x440e, 0x4206, 0xbad1, 0xb09d, 0x262b, 0xb2d3, 0xba06, 0xab5c, 0x2ee6, 0x4419, 0x339c, 0xb2d1, 0x4192, 0xbf72, 0xbae1, 0x410e, 0x41fe, 0x4193, 0xbf00, 0xba7d, 0xb2b6, 0x4318, 0x1eee, 0xb2f0, 0x413c, 0xba4b, 0x41e0, 0xb02d, 0x4287, 0x4467, 0xba35, 0x46d4, 0xa117, 0xbf5c, 0x40b4, 0xa074, 0x2102, 0x4230, 0x0167, 0x44e9, 0x0471, 0x4106, 0x42b1, 0x00af, 0x1a8c, 0x1ae2, 0xabbf, 0x42c5, 0x1b0b, 0x123f, 0x406d, 0xbf91, 0xb09b, 0xb276, 0xb07c, 0x4383, 0x18ab, 0x4156, 0xb2aa, 0xbf7b, 0x191b, 0xb228, 0xb263, 0x0dda, 0x4062, 0x46fa, 0x3720, 0x1f98, 0xb045, 0xb235, 0x1fa8, 0x4276, 0xb27a, 0xa3a8, 0x434b, 0x2044, 0x1f00, 0x169e, 0xbae6, 0xadf8, 0x4272, 0x4004, 0x42de, 0x2bee, 0xba2c, 0xbfb6, 0xb043, 0x415d, 0xb27f, 0x4213, 0x1ebb, 0x4077, 0xb284, 0xa9ab, 0x40a5, 0xb2a9, 0xb254, 0x4593, 0xa036, 0xb058, 0xb2ab, 0x3458, 0x1fa6, 0x3798, 0x4180, 0x41c0, 0x46cd, 0x1155, 0x42cd, 0xbf58, 0xba33, 0xa87e, 0xb012, 0x43eb, 0x2dc8, 0x42f8, 0x1e62, 0xb24f, 0x413d, 0x412d, 0x4335, 0x1915, 0x1ecf, 0x1358, 0x4419, 0x40ec, 0x438f, 0x2cb3, 0x360d, 0x2b61, 0x1cea, 0x0ed4, 0xb2e1, 0xb206, 0xb255, 0xbfa1, 0x1bc7, 0xb011, 0x4306, 0x3b69, 0xa9a9, 0xb20b, 0xad51, 0x420f, 0x1493, 0x4140, 0x405f, 0xb03f, 0x4107, 0x422c, 0x186c, 0xb285, 0x4350, 0x4115, 0x196d, 0xba29, 0xbaeb, 0x4340, 0x404c, 0x4195, 0xba1d, 0x4156, 0x4257, 0xbf45, 0x19bf, 0x4356, 0x3366, 0x40fa, 0x4022, 0x40e4, 0xa663, 0x284c, 0xbf4a, 0x415c, 0x0de3, 0x411d, 0x4268, 0x36e8, 0xbafe, 0xb0b5, 0x40b6, 0x406c, 0x4131, 0xb01b, 0x4281, 0x174c, 0xb06b, 0x421d, 0x412e, 0x4159, 0x4346, 0x01c4, 0x2f52, 0xbfd7, 0xb0f4, 0xb0b7, 0x4053, 0x1ce2, 0xbfdd, 0x40ae, 0xb286, 0x41d1, 0x4156, 0x1b8d, 0x41e1, 0x4281, 0x1844, 0xb297, 0x1c04, 0x405e, 0x1841, 0x412a, 0x414d, 0x45c8, 0xba0a, 0xb25d, 0xadc5, 0xa7eb, 0xbfad, 0x45e0, 0x41ce, 0x4230, 0x4232, 0x41e4, 0x42f1, 0x4566, 0x46d3, 0x1f16, 0x419c, 0x2db3, 0x4312, 0x30ff, 0x28e3, 0xbfd2, 0x4277, 0xa610, 0x41b8, 0xbad9, 0x42db, 0x1ff4, 0x088c, 0x41e5, 0x4104, 0xbf60, 0x0a11, 0x380e, 0xb24f, 0xb287, 0x42a9, 0xb006, 0xba45, 0x408d, 0x414f, 0x1d4e, 0xbf03, 0x3191, 0x41f3, 0xb260, 0x1f59, 0x4347, 0x42f8, 0x412d, 0x43f0, 0x1d4e, 0x42ba, 0xab0a, 0x1f8d, 0x432c, 0xaf72, 0x1bbd, 0x4130, 0x43ab, 0x41ba, 0x0066, 0xbf01, 0x1477, 0x410f, 0x40f3, 0x415c, 0x197b, 0x2fe1, 0x4542, 0xbf31, 0x4020, 0x420c, 0xa16c, 0xb231, 0xba34, 0x420e, 0x46f5, 0x0851, 0x4374, 0xbf22, 0xba20, 0x1df1, 0xb2fb, 0xb090, 0x431f, 0x44cc, 0x411a, 0xb2dd, 0x46b3, 0xba7b, 0x42b1, 0xb267, 0x41e5, 0x41c9, 0x414b, 0x40df, 0xa37b, 0xb2ef, 0x411d, 0xb29b, 0x1380, 0xbf2a, 0x41f5, 0xb280, 0xb2f2, 0x0ed2, 0x4329, 0xb248, 0x0969, 0x4631, 0x40f3, 0x43d0, 0xb093, 0xbf5f, 0xb204, 0x4463, 0x1d6d, 0x4382, 0x41a4, 0x40dc, 0x43f2, 0x460d, 0x42a1, 0x0a18, 0xb097, 0x23aa, 0x1acb, 0x1ff4, 0xb270, 0x0311, 0x0baa, 0x338c, 0xbf01, 0xb22a, 0x422c, 0xb2ae, 0x4369, 0x43d4, 0xba01, 0x41c8, 0xbafb, 0xb034, 0x0c66, 0xb221, 0x432c, 0x1b48, 0x413f, 0x4014, 0xa721, 0xbae1, 0xbae8, 0x192f, 0xba20, 0x416b, 0xb2cd, 0x408f, 0xbf61, 0x42a8, 0x3999, 0xbaff, 0x43a6, 0x416a, 0x4148, 0xb00e, 0x10c7, 0x1a90, 0xba63, 0xbf81, 0xb03e, 0xbaf7, 0x4046, 0x40a1, 0x439d, 0x4141, 0x2c5c, 0x29a6, 0x2b42, 0x0a7a, 0x3b4a, 0x42d6, 0x249b, 0x3240, 0x2ca8, 0xb2e1, 0xbfb8, 0x4059, 0x19ad, 0xb27c, 0xba73, 0x4270, 0x171d, 0x4183, 0xbac4, 0x43bf, 0x4418, 0x4169, 0x422e, 0x41e2, 0x43c2, 0xbf6d, 0x40de, 0xb283, 0x432a, 0x437e, 0xb2b8, 0x4277, 0x4338, 0x40d1, 0x42f7, 0xb2b2, 0xbaef, 0x16a7, 0x4124, 0x4341, 0xbf80, 0xb262, 0x021b, 0xb042, 0x18df, 0x1038, 0xb292, 0x1d14, 0xb0ee, 0x429e, 0x4019, 0xb293, 0x4216, 0xbf62, 0x07a6, 0xb281, 0x1f1b, 0x4660, 0x4568, 0x279d, 0x43e9, 0x45e1, 0xb27b, 0x40fe, 0xb242, 0x42d7, 0x2b9f, 0xb28d, 0xbfb1, 0xb2d4, 0x40ed, 0x43f7, 0xb05a, 0x34cd, 0xb2cc, 0x426d, 0x1c09, 0x414c, 0x4146, 0xb0ac, 0x434e, 0xb2f2, 0xba3c, 0xa981, 0x224b, 0xba0d, 0xb239, 0xbf8a, 0x3ae8, 0x40aa, 0x3459, 0xbf90, 0x4491, 0xb2e0, 0xba62, 0x425b, 0x41b8, 0x427e, 0xb24e, 0x4117, 0xbfc8, 0xa2f2, 0x1c4d, 0xaae2, 0x2776, 0xba4b, 0xbf03, 0x1f0e, 0x41ff, 0xa3a7, 0x21d9, 0x1520, 0xb2d1, 0x4344, 0x4669, 0x42b5, 0xba0a, 0x3274, 0xb23b, 0x1a2d, 0xbf60, 0x4424, 0x43e3, 0x4236, 0xbfa1, 0x4335, 0x41d8, 0xb2fa, 0xba3b, 0x3433, 0xb099, 0xbf26, 0x415a, 0x149b, 0x1e17, 0x2be1, 0x41c8, 0x26ac, 0x18c2, 0xbfe4, 0x27e9, 0x2413, 0x41c9, 0x29b1, 0xa042, 0xba56, 0xba44, 0x1c5f, 0xba32, 0xba60, 0xbac1, 0xa246, 0x1a6e, 0x41dc, 0xb2f1, 0x18f1, 0x1b38, 0x331a, 0x2a6f, 0x40e4, 0x0350, 0x1ff6, 0x43fb, 0xbf77, 0x2b4e, 0x1f7b, 0xa24e, 0xb05b, 0xbf51, 0x1b2f, 0xbaf4, 0x0756, 0x4238, 0x1c0d, 0x2351, 0xb03c, 0x2234, 0xb2c8, 0xb073, 0x1a1e, 0x4171, 0x3256, 0x0169, 0xa84a, 0x43f6, 0x2cb9, 0x429b, 0xba22, 0xbf9a, 0x43ba, 0x46cd, 0x30ba, 0x02fa, 0x42c5, 0x0ca2, 0x326a, 0x428b, 0x43be, 0x114e, 0xbf2c, 0x0816, 0x0903, 0x1a3d, 0xb291, 0x4025, 0xab9a, 0xa63e, 0x426f, 0x42f1, 0x1d96, 0x1e6c, 0x4117, 0x403d, 0x1ecb, 0x438c, 0xbfc4, 0x4110, 0xba01, 0x458c, 0x442e, 0xb07a, 0xb2fb, 0x43dc, 0xb2d4, 0x1bec, 0x407a, 0x19ff, 0x0fd7, 0x4321, 0x1e0c, 0x2ff7, 0xbf91, 0x4266, 0x1dd1, 0x42de, 0xbf90, 0xb208, 0x40a4, 0x1ff9, 0x41c7, 0xb276, 0x408b, 0xbfaf, 0xb2f4, 0x4056, 0xa933, 0x42c6, 0x4198, 0x42ee, 0xbad7, 0xb288, 0xb28f, 0x42b7, 0x43f8, 0xb27b, 0xaa4e, 0x4066, 0x30f5, 0x4242, 0x41e1, 0xba7e, 0xa066, 0x4038, 0x1c69, 0xba0c, 0x4372, 0xb08a, 0xbaef, 0x4314, 0x41c4, 0xbf9f, 0x4355, 0xb2be, 0xb096, 0x402d, 0xb206, 0xb2d6, 0x3674, 0x159d, 0x4093, 0x41dd, 0x427c, 0x40a7, 0xb0ca, 0xb214, 0xb25c, 0xbf1e, 0x4043, 0xa1bb, 0x41c7, 0x4655, 0x1805, 0x4313, 0xba4b, 0xb03c, 0xb2d9, 0xa67b, 0x291b, 0x0eb7, 0x425b, 0xb007, 0x4669, 0xb2aa, 0x41e8, 0x41b0, 0x4015, 0xa496, 0x3460, 0x43cd, 0x44f4, 0xbf01, 0x41cd, 0x4393, 0xad38, 0xba1a, 0xbf4b, 0x2960, 0x43a0, 0xba2d, 0x4559, 0xb0c7, 0x173a, 0x263a, 0xb23e, 0x43c1, 0x43aa, 0xa3b5, 0xba78, 0x0bf1, 0x4126, 0x067a, 0x42fc, 0x446f, 0x0b51, 0x2b2a, 0x439e, 0xb23c, 0xbf23, 0xb078, 0xbae6, 0x0398, 0xa8d3, 0x42ec, 0x431c, 0x41ed, 0x40d1, 0xba3d, 0x2317, 0xbac5, 0x42e1, 0x4268, 0x361b, 0x4235, 0x4151, 0x4596, 0x1ac6, 0x4215, 0xbfbc, 0xb0c0, 0x4296, 0x2525, 0x4287, 0xbf69, 0x24a2, 0x425c, 0xb258, 0xb01f, 0xbf3d, 0xb246, 0xb2cb, 0xbae2, 0xb284, 0xbac2, 0x4339, 0x4580, 0x3c52, 0x40f7, 0x04a0, 0xa9ab, 0x416b, 0xadba, 0x429d, 0x4270, 0x3def, 0x1a98, 0xbf65, 0x4286, 0x4056, 0x3ef0, 0xb287, 0x0bfb, 0x45e1, 0xb270, 0x0e86, 0x4006, 0x4593, 0xaf1d, 0x403a, 0x4113, 0x401e, 0x4209, 0x4018, 0x4130, 0x41ac, 0x425d, 0x42ba, 0xa052, 0x43de, 0x073f, 0x4018, 0xba5b, 0xb2e8, 0x1b83, 0x424a, 0x4000, 0xbf61, 0x1f92, 0x4086, 0x404a, 0x2004, 0x45e1, 0x4221, 0x4257, 0xbf9a, 0x1c3a, 0x20b9, 0x41b2, 0x429b, 0x4097, 0x40cb, 0xbfdb, 0x41de, 0x4107, 0xa45c, 0x426d, 0xafd3, 0x412f, 0x199b, 0x42ac, 0x4389, 0xbf41, 0xb20a, 0xa51d, 0x439f, 0x41ff, 0x4215, 0x3e5e, 0xba14, 0x18f3, 0x428a, 0x43fd, 0x438e, 0x4272, 0x1b74, 0x42ad, 0x417d, 0x1ff0, 0x1b9c, 0x41b7, 0x41b6, 0x405f, 0x17e5, 0xb2a3, 0x07dc, 0xbf22, 0xb08c, 0x409e, 0xb23e, 0xb2b4, 0x29f8, 0x44e8, 0x41ad, 0xba65, 0x4200, 0x41b5, 0xbf8c, 0x1ee4, 0x41ff, 0x40f0, 0xb2b3, 0x45dd, 0xba63, 0x1e16, 0xbfe2, 0x1ee9, 0xa4e7, 0xb07c, 0xae9f, 0xba20, 0x403a, 0x4260, 0x439a, 0x444f, 0x40bb, 0x430f, 0xbf57, 0x18d5, 0x43ba, 0x0350, 0x2a39, 0xaade, 0x0a7a, 0xb239, 0xb2c2, 0xb0a4, 0x0999, 0x4270, 0x4390, 0xbfb6, 0x4048, 0xbfa0, 0xb20d, 0x4026, 0xba4e, 0x430e, 0x4375, 0x4171, 0xb278, 0x4256, 0x40bd, 0x42e4, 0x1c1e, 0xb2de, 0xbf58, 0x059b, 0xb243, 0x197d, 0x4084, 0xa945, 0xb03f, 0x4430, 0x1c82, 0xa4a0, 0x43c7, 0x41e8, 0x41a5, 0xba57, 0x0ecc, 0x2e03, 0xba50, 0x42f7, 0xb017, 0x42b2, 0xbac1, 0xbfbc, 0x408a, 0x0c66, 0xa768, 0xb223, 0x427c, 0x448d, 0x445f, 0x437d, 0x405e, 0x42a3, 0x257d, 0x4485, 0x44ec, 0xba2b, 0x4177, 0x42ea, 0x42f5, 0x43cc, 0x4681, 0x4211, 0x416c, 0xb038, 0xba19, 0x4669, 0xbfbb, 0x08f8, 0x4338, 0xb2cf, 0x4653, 0xa218, 0xb2f6, 0x1894, 0xbaed, 0xb2c1, 0x19ae, 0x1138, 0x1b80, 0x4158, 0x41ea, 0xb083, 0xbfe2, 0xacb0, 0x1d95, 0xa07c, 0x4770, 0xe7fe }, - StartRegs = new uint[] { 0x53e412bb, 0xf8075b4a, 0xc06d1392, 0xad332bbd, 0x27e72f7d, 0xac8f8bd5, 0x3a5b2232, 0xc5e2c8ec, 0xe032a7a7, 0x2b035634, 0x4a720b19, 0x0f87e928, 0x73db65d8, 0x6c7bc94f, 0x00000000, 0xf00001f0 }, - FinalRegs = new uint[] { 0x000019d4, 0x00000000, 0x00001828, 0x7d000000, 0x977f681b, 0x0000182e, 0x00007d12, 0x00000067, 0x77b1c835, 0x00004100, 0x000010c8, 0x0000000e, 0x79708dab, 0x977f655b, 0x00000000, 0x200001d0 }, - }, - }; + Instructions = [0xba27, 0x42db, 0x40d3, 0x4362, 0x409f, 0x1812, 0xbac7, 0xa7df, 0x34cd, 0xa70f, 0x4280, 0x40b0, 0xb0ee, 0x01be, 0xb211, 0x4052, 0xb2a7, 0x4063, 0x406f, 0x4654, 0x434e, 0x42fb, 0xbf25, 0x4269, 0x1119, 0xb264, 0x4301, 0xba63, 0x1a18, 0xb2fb, 0x1887, 0x2f9b, 0xb233, 0x440e, 0x4206, 0xbad1, 0xb09d, 0x262b, 0xb2d3, 0xba06, 0xab5c, 0x2ee6, 0x4419, 0x339c, 0xb2d1, 0x4192, 0xbf72, 0xbae1, 0x410e, 0x41fe, 0x4193, 0xbf00, 0xba7d, 0xb2b6, 0x4318, 0x1eee, 0xb2f0, 0x413c, 0xba4b, 0x41e0, 0xb02d, 0x4287, 0x4467, 0xba35, 0x46d4, 0xa117, 0xbf5c, 0x40b4, 0xa074, 0x2102, 0x4230, 0x0167, 0x44e9, 0x0471, 0x4106, 0x42b1, 0x00af, 0x1a8c, 0x1ae2, 0xabbf, 0x42c5, 0x1b0b, 0x123f, 0x406d, 0xbf91, 0xb09b, 0xb276, 0xb07c, 0x4383, 0x18ab, 0x4156, 0xb2aa, 0xbf7b, 0x191b, 0xb228, 0xb263, 0x0dda, 0x4062, 0x46fa, 0x3720, 0x1f98, 0xb045, 0xb235, 0x1fa8, 0x4276, 0xb27a, 0xa3a8, 0x434b, 0x2044, 0x1f00, 0x169e, 0xbae6, 0xadf8, 0x4272, 0x4004, 0x42de, 0x2bee, 0xba2c, 0xbfb6, 0xb043, 0x415d, 0xb27f, 0x4213, 0x1ebb, 0x4077, 0xb284, 0xa9ab, 0x40a5, 0xb2a9, 0xb254, 0x4593, 0xa036, 0xb058, 0xb2ab, 0x3458, 0x1fa6, 0x3798, 0x4180, 0x41c0, 0x46cd, 0x1155, 0x42cd, 0xbf58, 0xba33, 0xa87e, 0xb012, 0x43eb, 0x2dc8, 0x42f8, 0x1e62, 0xb24f, 0x413d, 0x412d, 0x4335, 0x1915, 0x1ecf, 0x1358, 0x4419, 0x40ec, 0x438f, 0x2cb3, 0x360d, 0x2b61, 0x1cea, 0x0ed4, 0xb2e1, 0xb206, 0xb255, 0xbfa1, 0x1bc7, 0xb011, 0x4306, 0x3b69, 0xa9a9, 0xb20b, 0xad51, 0x420f, 0x1493, 0x4140, 0x405f, 0xb03f, 0x4107, 0x422c, 0x186c, 0xb285, 0x4350, 0x4115, 0x196d, 0xba29, 0xbaeb, 0x4340, 0x404c, 0x4195, 0xba1d, 0x4156, 0x4257, 0xbf45, 0x19bf, 0x4356, 0x3366, 0x40fa, 0x4022, 0x40e4, 0xa663, 0x284c, 0xbf4a, 0x415c, 0x0de3, 0x411d, 0x4268, 0x36e8, 0xbafe, 0xb0b5, 0x40b6, 0x406c, 0x4131, 0xb01b, 0x4281, 0x174c, 0xb06b, 0x421d, 0x412e, 0x4159, 0x4346, 0x01c4, 0x2f52, 0xbfd7, 0xb0f4, 0xb0b7, 0x4053, 0x1ce2, 0xbfdd, 0x40ae, 0xb286, 0x41d1, 0x4156, 0x1b8d, 0x41e1, 0x4281, 0x1844, 0xb297, 0x1c04, 0x405e, 0x1841, 0x412a, 0x414d, 0x45c8, 0xba0a, 0xb25d, 0xadc5, 0xa7eb, 0xbfad, 0x45e0, 0x41ce, 0x4230, 0x4232, 0x41e4, 0x42f1, 0x4566, 0x46d3, 0x1f16, 0x419c, 0x2db3, 0x4312, 0x30ff, 0x28e3, 0xbfd2, 0x4277, 0xa610, 0x41b8, 0xbad9, 0x42db, 0x1ff4, 0x088c, 0x41e5, 0x4104, 0xbf60, 0x0a11, 0x380e, 0xb24f, 0xb287, 0x42a9, 0xb006, 0xba45, 0x408d, 0x414f, 0x1d4e, 0xbf03, 0x3191, 0x41f3, 0xb260, 0x1f59, 0x4347, 0x42f8, 0x412d, 0x43f0, 0x1d4e, 0x42ba, 0xab0a, 0x1f8d, 0x432c, 0xaf72, 0x1bbd, 0x4130, 0x43ab, 0x41ba, 0x0066, 0xbf01, 0x1477, 0x410f, 0x40f3, 0x415c, 0x197b, 0x2fe1, 0x4542, 0xbf31, 0x4020, 0x420c, 0xa16c, 0xb231, 0xba34, 0x420e, 0x46f5, 0x0851, 0x4374, 0xbf22, 0xba20, 0x1df1, 0xb2fb, 0xb090, 0x431f, 0x44cc, 0x411a, 0xb2dd, 0x46b3, 0xba7b, 0x42b1, 0xb267, 0x41e5, 0x41c9, 0x414b, 0x40df, 0xa37b, 0xb2ef, 0x411d, 0xb29b, 0x1380, 0xbf2a, 0x41f5, 0xb280, 0xb2f2, 0x0ed2, 0x4329, 0xb248, 0x0969, 0x4631, 0x40f3, 0x43d0, 0xb093, 0xbf5f, 0xb204, 0x4463, 0x1d6d, 0x4382, 0x41a4, 0x40dc, 0x43f2, 0x460d, 0x42a1, 0x0a18, 0xb097, 0x23aa, 0x1acb, 0x1ff4, 0xb270, 0x0311, 0x0baa, 0x338c, 0xbf01, 0xb22a, 0x422c, 0xb2ae, 0x4369, 0x43d4, 0xba01, 0x41c8, 0xbafb, 0xb034, 0x0c66, 0xb221, 0x432c, 0x1b48, 0x413f, 0x4014, 0xa721, 0xbae1, 0xbae8, 0x192f, 0xba20, 0x416b, 0xb2cd, 0x408f, 0xbf61, 0x42a8, 0x3999, 0xbaff, 0x43a6, 0x416a, 0x4148, 0xb00e, 0x10c7, 0x1a90, 0xba63, 0xbf81, 0xb03e, 0xbaf7, 0x4046, 0x40a1, 0x439d, 0x4141, 0x2c5c, 0x29a6, 0x2b42, 0x0a7a, 0x3b4a, 0x42d6, 0x249b, 0x3240, 0x2ca8, 0xb2e1, 0xbfb8, 0x4059, 0x19ad, 0xb27c, 0xba73, 0x4270, 0x171d, 0x4183, 0xbac4, 0x43bf, 0x4418, 0x4169, 0x422e, 0x41e2, 0x43c2, 0xbf6d, 0x40de, 0xb283, 0x432a, 0x437e, 0xb2b8, 0x4277, 0x4338, 0x40d1, 0x42f7, 0xb2b2, 0xbaef, 0x16a7, 0x4124, 0x4341, 0xbf80, 0xb262, 0x021b, 0xb042, 0x18df, 0x1038, 0xb292, 0x1d14, 0xb0ee, 0x429e, 0x4019, 0xb293, 0x4216, 0xbf62, 0x07a6, 0xb281, 0x1f1b, 0x4660, 0x4568, 0x279d, 0x43e9, 0x45e1, 0xb27b, 0x40fe, 0xb242, 0x42d7, 0x2b9f, 0xb28d, 0xbfb1, 0xb2d4, 0x40ed, 0x43f7, 0xb05a, 0x34cd, 0xb2cc, 0x426d, 0x1c09, 0x414c, 0x4146, 0xb0ac, 0x434e, 0xb2f2, 0xba3c, 0xa981, 0x224b, 0xba0d, 0xb239, 0xbf8a, 0x3ae8, 0x40aa, 0x3459, 0xbf90, 0x4491, 0xb2e0, 0xba62, 0x425b, 0x41b8, 0x427e, 0xb24e, 0x4117, 0xbfc8, 0xa2f2, 0x1c4d, 0xaae2, 0x2776, 0xba4b, 0xbf03, 0x1f0e, 0x41ff, 0xa3a7, 0x21d9, 0x1520, 0xb2d1, 0x4344, 0x4669, 0x42b5, 0xba0a, 0x3274, 0xb23b, 0x1a2d, 0xbf60, 0x4424, 0x43e3, 0x4236, 0xbfa1, 0x4335, 0x41d8, 0xb2fa, 0xba3b, 0x3433, 0xb099, 0xbf26, 0x415a, 0x149b, 0x1e17, 0x2be1, 0x41c8, 0x26ac, 0x18c2, 0xbfe4, 0x27e9, 0x2413, 0x41c9, 0x29b1, 0xa042, 0xba56, 0xba44, 0x1c5f, 0xba32, 0xba60, 0xbac1, 0xa246, 0x1a6e, 0x41dc, 0xb2f1, 0x18f1, 0x1b38, 0x331a, 0x2a6f, 0x40e4, 0x0350, 0x1ff6, 0x43fb, 0xbf77, 0x2b4e, 0x1f7b, 0xa24e, 0xb05b, 0xbf51, 0x1b2f, 0xbaf4, 0x0756, 0x4238, 0x1c0d, 0x2351, 0xb03c, 0x2234, 0xb2c8, 0xb073, 0x1a1e, 0x4171, 0x3256, 0x0169, 0xa84a, 0x43f6, 0x2cb9, 0x429b, 0xba22, 0xbf9a, 0x43ba, 0x46cd, 0x30ba, 0x02fa, 0x42c5, 0x0ca2, 0x326a, 0x428b, 0x43be, 0x114e, 0xbf2c, 0x0816, 0x0903, 0x1a3d, 0xb291, 0x4025, 0xab9a, 0xa63e, 0x426f, 0x42f1, 0x1d96, 0x1e6c, 0x4117, 0x403d, 0x1ecb, 0x438c, 0xbfc4, 0x4110, 0xba01, 0x458c, 0x442e, 0xb07a, 0xb2fb, 0x43dc, 0xb2d4, 0x1bec, 0x407a, 0x19ff, 0x0fd7, 0x4321, 0x1e0c, 0x2ff7, 0xbf91, 0x4266, 0x1dd1, 0x42de, 0xbf90, 0xb208, 0x40a4, 0x1ff9, 0x41c7, 0xb276, 0x408b, 0xbfaf, 0xb2f4, 0x4056, 0xa933, 0x42c6, 0x4198, 0x42ee, 0xbad7, 0xb288, 0xb28f, 0x42b7, 0x43f8, 0xb27b, 0xaa4e, 0x4066, 0x30f5, 0x4242, 0x41e1, 0xba7e, 0xa066, 0x4038, 0x1c69, 0xba0c, 0x4372, 0xb08a, 0xbaef, 0x4314, 0x41c4, 0xbf9f, 0x4355, 0xb2be, 0xb096, 0x402d, 0xb206, 0xb2d6, 0x3674, 0x159d, 0x4093, 0x41dd, 0x427c, 0x40a7, 0xb0ca, 0xb214, 0xb25c, 0xbf1e, 0x4043, 0xa1bb, 0x41c7, 0x4655, 0x1805, 0x4313, 0xba4b, 0xb03c, 0xb2d9, 0xa67b, 0x291b, 0x0eb7, 0x425b, 0xb007, 0x4669, 0xb2aa, 0x41e8, 0x41b0, 0x4015, 0xa496, 0x3460, 0x43cd, 0x44f4, 0xbf01, 0x41cd, 0x4393, 0xad38, 0xba1a, 0xbf4b, 0x2960, 0x43a0, 0xba2d, 0x4559, 0xb0c7, 0x173a, 0x263a, 0xb23e, 0x43c1, 0x43aa, 0xa3b5, 0xba78, 0x0bf1, 0x4126, 0x067a, 0x42fc, 0x446f, 0x0b51, 0x2b2a, 0x439e, 0xb23c, 0xbf23, 0xb078, 0xbae6, 0x0398, 0xa8d3, 0x42ec, 0x431c, 0x41ed, 0x40d1, 0xba3d, 0x2317, 0xbac5, 0x42e1, 0x4268, 0x361b, 0x4235, 0x4151, 0x4596, 0x1ac6, 0x4215, 0xbfbc, 0xb0c0, 0x4296, 0x2525, 0x4287, 0xbf69, 0x24a2, 0x425c, 0xb258, 0xb01f, 0xbf3d, 0xb246, 0xb2cb, 0xbae2, 0xb284, 0xbac2, 0x4339, 0x4580, 0x3c52, 0x40f7, 0x04a0, 0xa9ab, 0x416b, 0xadba, 0x429d, 0x4270, 0x3def, 0x1a98, 0xbf65, 0x4286, 0x4056, 0x3ef0, 0xb287, 0x0bfb, 0x45e1, 0xb270, 0x0e86, 0x4006, 0x4593, 0xaf1d, 0x403a, 0x4113, 0x401e, 0x4209, 0x4018, 0x4130, 0x41ac, 0x425d, 0x42ba, 0xa052, 0x43de, 0x073f, 0x4018, 0xba5b, 0xb2e8, 0x1b83, 0x424a, 0x4000, 0xbf61, 0x1f92, 0x4086, 0x404a, 0x2004, 0x45e1, 0x4221, 0x4257, 0xbf9a, 0x1c3a, 0x20b9, 0x41b2, 0x429b, 0x4097, 0x40cb, 0xbfdb, 0x41de, 0x4107, 0xa45c, 0x426d, 0xafd3, 0x412f, 0x199b, 0x42ac, 0x4389, 0xbf41, 0xb20a, 0xa51d, 0x439f, 0x41ff, 0x4215, 0x3e5e, 0xba14, 0x18f3, 0x428a, 0x43fd, 0x438e, 0x4272, 0x1b74, 0x42ad, 0x417d, 0x1ff0, 0x1b9c, 0x41b7, 0x41b6, 0x405f, 0x17e5, 0xb2a3, 0x07dc, 0xbf22, 0xb08c, 0x409e, 0xb23e, 0xb2b4, 0x29f8, 0x44e8, 0x41ad, 0xba65, 0x4200, 0x41b5, 0xbf8c, 0x1ee4, 0x41ff, 0x40f0, 0xb2b3, 0x45dd, 0xba63, 0x1e16, 0xbfe2, 0x1ee9, 0xa4e7, 0xb07c, 0xae9f, 0xba20, 0x403a, 0x4260, 0x439a, 0x444f, 0x40bb, 0x430f, 0xbf57, 0x18d5, 0x43ba, 0x0350, 0x2a39, 0xaade, 0x0a7a, 0xb239, 0xb2c2, 0xb0a4, 0x0999, 0x4270, 0x4390, 0xbfb6, 0x4048, 0xbfa0, 0xb20d, 0x4026, 0xba4e, 0x430e, 0x4375, 0x4171, 0xb278, 0x4256, 0x40bd, 0x42e4, 0x1c1e, 0xb2de, 0xbf58, 0x059b, 0xb243, 0x197d, 0x4084, 0xa945, 0xb03f, 0x4430, 0x1c82, 0xa4a0, 0x43c7, 0x41e8, 0x41a5, 0xba57, 0x0ecc, 0x2e03, 0xba50, 0x42f7, 0xb017, 0x42b2, 0xbac1, 0xbfbc, 0x408a, 0x0c66, 0xa768, 0xb223, 0x427c, 0x448d, 0x445f, 0x437d, 0x405e, 0x42a3, 0x257d, 0x4485, 0x44ec, 0xba2b, 0x4177, 0x42ea, 0x42f5, 0x43cc, 0x4681, 0x4211, 0x416c, 0xb038, 0xba19, 0x4669, 0xbfbb, 0x08f8, 0x4338, 0xb2cf, 0x4653, 0xa218, 0xb2f6, 0x1894, 0xbaed, 0xb2c1, 0x19ae, 0x1138, 0x1b80, 0x4158, 0x41ea, 0xb083, 0xbfe2, 0xacb0, 0x1d95, 0xa07c, 0x4770, 0xe7fe + ], + StartRegs = [0x53e412bb, 0xf8075b4a, 0xc06d1392, 0xad332bbd, 0x27e72f7d, 0xac8f8bd5, 0x3a5b2232, 0xc5e2c8ec, 0xe032a7a7, 0x2b035634, 0x4a720b19, 0x0f87e928, 0x73db65d8, 0x6c7bc94f, 0x00000000, 0xf00001f0 + ], + FinalRegs = [0x000019d4, 0x00000000, 0x00001828, 0x7d000000, 0x977f681b, 0x0000182e, 0x00007d12, 0x00000067, 0x77b1c835, 0x00004100, 0x000010c8, 0x0000000e, 0x79708dab, 0x977f655b, 0x00000000, 0x200001d0 + ], + } + ]; } } diff --git a/src/Ryujinx.Tests/Cpu/EnvironmentTests.cs b/src/Ryujinx.Tests/Cpu/EnvironmentTests.cs index 43c84c193..d67f22160 100644 --- a/src/Ryujinx.Tests/Cpu/EnvironmentTests.cs +++ b/src/Ryujinx.Tests/Cpu/EnvironmentTests.cs @@ -12,15 +12,13 @@ namespace Ryujinx.Tests.Cpu { internal class EnvironmentTests { -#pragma warning disable IDE0052 // Remove unread private member private static Translator _translator; -#pragma warning restore IDE0052 private static void EnsureTranslator() { // Create a translator, as one is needed to register the signal handler or emit methods. _translator ??= new Translator( - new JitMemoryAllocator(), + new JitMemoryAllocator(), new MockMemoryManager(), AddressTable.CreateForArm(true, MemoryManagerType.SoftwarePageTable)); } @@ -53,7 +51,7 @@ namespace Ryujinx.Tests.Cpu bool methodCalled = false; bool isFz = false; - var method = TranslatorTestMethods.GenerateFpFlagsPInvokeTest(); + TranslatorTestMethods.FpFlagsPInvokeTest method = TranslatorTestMethods.GenerateFpFlagsPInvokeTest(); // This method sets flush-to-zero and then calls the managed method. // Before and after setting the flags, it ensures subnormal addition works as expected. diff --git a/src/Ryujinx.Tests/HLE/SoftwareKeyboardTests.cs b/src/Ryujinx.Tests/HLE/SoftwareKeyboardTests.cs index 79ca2d480..89b558597 100644 --- a/src/Ryujinx.Tests/HLE/SoftwareKeyboardTests.cs +++ b/src/Ryujinx.Tests/HLE/SoftwareKeyboardTests.cs @@ -21,7 +21,8 @@ namespace Ryujinx.Tests.HLE [Test] public void StripUnicodeControlCodes_Passthrough() { - string[] prompts = { + string[] prompts = + [ "Please name him.", "Name her, too.", "Name your friend.", @@ -29,8 +30,8 @@ namespace Ryujinx.Tests.HLE "Name your pet.", "Favorite homemade food?", "What’s your favorite thing?", - "Are you sure?", - }; + "Are you sure?" + ]; foreach (string prompt in prompts) { diff --git a/src/Ryujinx.Tests/Memory/PartialUnmaps.cs b/src/Ryujinx.Tests/Memory/PartialUnmaps.cs index 3e5b47423..92b994279 100644 --- a/src/Ryujinx.Tests/Memory/PartialUnmaps.cs +++ b/src/Ryujinx.Tests/Memory/PartialUnmaps.cs @@ -3,6 +3,7 @@ using ARMeilleure.Memory; using ARMeilleure.Signal; using ARMeilleure.Translation; using NUnit.Framework; +using Ryujinx.Common.Memory; using Ryujinx.Common.Memory.PartialUnmaps; using Ryujinx.Cpu; using Ryujinx.Cpu.Jit; @@ -13,6 +14,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Runtime.Versioning; using System.Threading; namespace Ryujinx.Tests.Memory @@ -26,11 +28,11 @@ namespace Ryujinx.Tests.Memory { MemoryAllocationFlags asFlags = MemoryAllocationFlags.Reserve | MemoryAllocationFlags.ViewCompatible; - var addressSpace = new MemoryBlock(asSize, asFlags); - var addressSpaceMirror = new MemoryBlock(asSize, asFlags); + MemoryBlock addressSpace = new(asSize, asFlags); + MemoryBlock addressSpaceMirror = new(asSize, asFlags); - var tracking = new MemoryTracking(new MockVirtualMemoryManager(asSize, 0x1000), 0x1000); - var exceptionHandler = new MemoryEhMeilleure(addressSpace, addressSpaceMirror, tracking); + MemoryTracking tracking = new(new MockVirtualMemoryManager(asSize, 0x1000), 0x1000); + MemoryEhMeilleure exceptionHandler = new(addressSpace, addressSpaceMirror, tracking); return (addressSpace, addressSpaceMirror, exceptionHandler); } @@ -39,7 +41,7 @@ namespace Ryujinx.Tests.Memory { int count = 0; - ref var ids = ref state.LocalCounts.ThreadIds; + ref Array20 ids = ref state.LocalCounts.ThreadIds; for (int i = 0; i < ids.Length; i++) { @@ -56,8 +58,8 @@ namespace Ryujinx.Tests.Memory { // Create a translator, as one is needed to register the signal handler or emit methods. _translator ??= new Translator( - new JitMemoryAllocator(), - new MockMemoryManager(), + new JitMemoryAllocator(), + new MockMemoryManager(), AddressTable.CreateForArm(true, MemoryManagerType.SoftwarePageTable)); } @@ -71,13 +73,13 @@ namespace Ryujinx.Tests.Memory ulong vaSize = 0x100000; // The first 0x100000 is mapped to start. It is replaced from the center with the 0x200000 mapping. - var backing = new MemoryBlock(vaSize * 2, MemoryAllocationFlags.Mirrorable); + MemoryBlock backing = new(vaSize * 2, MemoryAllocationFlags.Mirrorable); (MemoryBlock unusedMainMemory, MemoryBlock memory, MemoryEhMeilleure exceptionHandler) = GetVirtual(vaSize * 2); EnsureTranslator(); - ref var state = ref PartialUnmapState.GetRef(); + ref PartialUnmapState state = ref PartialUnmapState.GetRef(); Thread testThread = null; bool shouldAccess = true; @@ -216,17 +218,17 @@ namespace Ryujinx.Tests.Memory ulong vaSize = 0x100000; // The first 0x100000 is mapped to start. It is replaced from the center with the 0x200000 mapping. - var backing = new MemoryBlock(vaSize * 2, MemoryAllocationFlags.Mirrorable); + MemoryBlock backing = new(vaSize * 2, MemoryAllocationFlags.Mirrorable); (MemoryBlock mainMemory, MemoryBlock unusedMirror, MemoryEhMeilleure exceptionHandler) = GetVirtual(vaSize * 2); EnsureTranslator(); - ref var state = ref PartialUnmapState.GetRef(); + ref PartialUnmapState state = ref PartialUnmapState.GetRef(); // Create some state to be used for managing the native writing loop. int stateSize = Unsafe.SizeOf(); - var statePtr = Marshal.AllocHGlobal(stateSize); + IntPtr statePtr = Marshal.AllocHGlobal(stateSize); Unsafe.InitBlockUnaligned((void*)statePtr, 0, (uint)stateSize); ref NativeWriteLoopState writeLoopState = ref Unsafe.AsRef((void*)statePtr); @@ -241,7 +243,7 @@ namespace Ryujinx.Tests.Memory // Create a large mapping. mainMemory.MapView(backing, 0, 0, vaSize); - var writeFunc = TestMethods.GenerateDebugNativeWriteLoop(); + TestMethods.DebugNativeWriteLoop writeFunc = TestMethods.GenerateDebugNativeWriteLoop(); nint writePtr = mainMemory.GetPointer(vaSize - 0x1000, 4); Thread testThread = new(() => @@ -288,14 +290,14 @@ namespace Ryujinx.Tests.Memory [Test] // Only test in Windows, as this is only used on Windows and uses Windows APIs for trimming. [Platform("Win")] - [SuppressMessage("Interoperability", "CA1416: Validate platform compatibility")] + [SupportedOSPlatform("windows")] public void ThreadLocalMap() { PartialUnmapState.Reset(); - ref var state = ref PartialUnmapState.GetRef(); + ref PartialUnmapState state = ref PartialUnmapState.GetRef(); bool running = true; - var testThread = new Thread(() => + Thread testThread = new(() => { PartialUnmapState.GetRef().RetryFromAccessViolation(); while (running) @@ -331,11 +333,11 @@ namespace Ryujinx.Tests.Memory PartialUnmapState.Reset(); - ref var state = ref PartialUnmapState.GetRef(); + ref PartialUnmapState state = ref PartialUnmapState.GetRef(); fixed (void* localMap = &state.LocalCounts) { - var getOrReserve = TestMethods.GenerateDebugThreadLocalMapGetOrReserve((nint)localMap); + TestMethods.DebugThreadLocalMapGetOrReserve getOrReserve = TestMethods.GenerateDebugThreadLocalMapGetOrReserve((nint)localMap); for (int i = 0; i < ThreadLocalMap.MapSize; i++) { @@ -375,8 +377,8 @@ namespace Ryujinx.Tests.Memory [Test] public void NativeReaderWriterLock() { - var rwLock = new NativeReaderWriterLock(); - var threads = new List(); + NativeReaderWriterLock rwLock = new(); + List threads = []; int value = 0; @@ -386,7 +388,7 @@ namespace Ryujinx.Tests.Memory for (int i = 0; i < 5; i++) { - var readThread = new Thread(() => + Thread readThread = new(() => { int count = 0; while (running) @@ -423,7 +425,7 @@ namespace Ryujinx.Tests.Memory for (int i = 0; i < 2; i++) { - var writeThread = new Thread(() => + Thread writeThread = new(() => { int count = 0; while (running) @@ -453,7 +455,7 @@ namespace Ryujinx.Tests.Memory threads.Add(writeThread); } - foreach (var thread in threads) + foreach (Thread thread in threads) { thread.Start(); } @@ -462,7 +464,7 @@ namespace Ryujinx.Tests.Memory running = false; - foreach (var thread in threads) + foreach (Thread thread in threads) { thread.Join(); } diff --git a/src/Ryujinx.Tests/Ryujinx.Tests.csproj b/src/Ryujinx.Tests/Ryujinx.Tests.csproj index 0480c206e..2ac6410ef 100644 --- a/src/Ryujinx.Tests/Ryujinx.Tests.csproj +++ b/src/Ryujinx.Tests/Ryujinx.Tests.csproj @@ -1,7 +1,6 @@ - + - net8.0 Exe false @@ -14,7 +13,7 @@ - false + true True diff --git a/src/Ryujinx.Tests/TreeDictionaryTests.cs b/src/Ryujinx.Tests/TreeDictionaryTests.cs index ea9fb0731..61ea88d7c 100644 --- a/src/Ryujinx.Tests/TreeDictionaryTests.cs +++ b/src/Ryujinx.Tests/TreeDictionaryTests.cs @@ -84,6 +84,7 @@ namespace Ryujinx.Tests.Collections { Console.WriteLine($"{node.Key} -> {node.Value}"); } + Assert.AreEqual(list.Count, dictionary.Count); Assert.AreEqual(list[0].Key, 4); Assert.AreEqual(list[1].Key, 2); @@ -118,6 +119,7 @@ namespace Ryujinx.Tests.Collections { Console.WriteLine($"{node.Key} -> {node.Value}"); } + Assert.AreEqual(list[0].Key, 4); Assert.AreEqual(list[1].Key, 2); Assert.AreEqual(list[2].Key, 10); @@ -149,6 +151,7 @@ namespace Ryujinx.Tests.Collections { Console.WriteLine($"{node.Key} -> {node.Value}"); } + Assert.AreEqual(list[0].Key, 4); Assert.AreEqual(list[1].Key, 2); Assert.AreEqual(list[2].Key, 9); @@ -224,7 +227,6 @@ namespace Ryujinx.Tests.Collections Assert.AreEqual(list[4].Value, 4); - // Assure that none of the nodes locations have been modified. Assert.AreEqual(list[0].Key, 4); Assert.AreEqual(list[1].Key, 2); diff --git a/src/Ryujinx.UI.Common/App/LdnGameData.cs b/src/Ryujinx.UI.Common/App/LdnGameData.cs deleted file mode 100644 index 6c784c991..000000000 --- a/src/Ryujinx.UI.Common/App/LdnGameData.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Collections.Generic; - -namespace Ryujinx.UI.App.Common -{ - public struct LdnGameData - { - public string Id { get; set; } - public int PlayerCount { get; set; } - public int MaxPlayerCount { get; set; } - public string GameName { get; set; } - public string TitleId { get; set; } - public string Mode { get; set; } - public string Status { get; set; } - public IEnumerable Players { get; set; } - } -} diff --git a/src/Ryujinx.UI.Common/App/LdnGameDataReceivedEventArgs.cs b/src/Ryujinx.UI.Common/App/LdnGameDataReceivedEventArgs.cs deleted file mode 100644 index 7c7454411..000000000 --- a/src/Ryujinx.UI.Common/App/LdnGameDataReceivedEventArgs.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Ryujinx.UI.App.Common -{ - public class LdnGameDataReceivedEventArgs : EventArgs - { - public IEnumerable LdnData { get; set; } - } -} diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Migration.cs deleted file mode 100644 index a41ea2cd7..000000000 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Migration.cs +++ /dev/null @@ -1,747 +0,0 @@ -using Ryujinx.Common.Configuration; -using Ryujinx.Common.Configuration.Hid; -using Ryujinx.Common.Configuration.Hid.Controller; -using Ryujinx.Common.Configuration.Hid.Keyboard; -using Ryujinx.Common.Configuration.Multiplayer; -using Ryujinx.Common.Logging; -using Ryujinx.HLE; -using Ryujinx.UI.Common.Configuration.System; -using Ryujinx.UI.Common.Configuration.UI; -using System; -using System.Collections.Generic; - -namespace Ryujinx.UI.Common.Configuration -{ - public partial class ConfigurationState - { - public void Load(ConfigurationFileFormat configurationFileFormat, string configurationFilePath) - { - bool configurationFileUpdated = false; - - if (configurationFileFormat.Version is < 0 or > ConfigurationFileFormat.CurrentVersion) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Unsupported configuration version {configurationFileFormat.Version}, loading default."); - - LoadDefault(); - } - - if (configurationFileFormat.Version < 2) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 2."); - - configurationFileFormat.SystemRegion = Region.USA; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 3) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 3."); - - configurationFileFormat.SystemTimeZone = "UTC"; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 4) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 4."); - - configurationFileFormat.MaxAnisotropy = -1; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 5) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 5."); - - configurationFileFormat.SystemTimeOffset = 0; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 8) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 8."); - - configurationFileFormat.EnablePtc = true; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 9) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 9."); - - configurationFileFormat.ColumnSort = new ColumnSort - { - SortColumnId = 0, - SortAscending = false, - }; - - configurationFileFormat.Hotkeys = new KeyboardHotkeys - { - ToggleVSyncMode = Key.F1, - }; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 10) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 10."); - - configurationFileFormat.AudioBackend = AudioBackend.OpenAl; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 11) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 11."); - - configurationFileFormat.ResScale = 1; - configurationFileFormat.ResScaleCustom = 1.0f; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 12) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 12."); - - configurationFileFormat.LoggingGraphicsDebugLevel = GraphicsDebugLevel.None; - - configurationFileUpdated = true; - } - - // configurationFileFormat.Version == 13 -> LDN1 - - if (configurationFileFormat.Version < 14) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 14."); - - configurationFileFormat.CheckUpdatesOnStart = true; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 16) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 16."); - - configurationFileFormat.EnableShaderCache = true; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 17) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 17."); - - configurationFileFormat.StartFullscreen = false; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 18) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 18."); - - configurationFileFormat.AspectRatio = AspectRatio.Fixed16x9; - - configurationFileUpdated = true; - } - - // configurationFileFormat.Version == 19 -> LDN2 - - if (configurationFileFormat.Version < 20) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 20."); - - configurationFileFormat.ShowConfirmExit = true; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 21) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 21."); - - // Initialize network config. - - configurationFileFormat.MultiplayerMode = MultiplayerMode.Disabled; - configurationFileFormat.MultiplayerLanInterfaceId = "0"; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 22) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 22."); - - configurationFileFormat.HideCursor = HideCursorMode.Never; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 24) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 24."); - - configurationFileFormat.InputConfig = new List - { - new StandardKeyboardInputConfig - { - Version = InputConfig.CurrentVersion, - Backend = InputBackendType.WindowKeyboard, - Id = "0", - PlayerIndex = PlayerIndex.Player1, - ControllerType = ControllerType.ProController, - LeftJoycon = new LeftJoyconCommonConfig - { - DpadUp = Key.Up, - DpadDown = Key.Down, - DpadLeft = Key.Left, - DpadRight = Key.Right, - ButtonMinus = Key.Minus, - ButtonL = Key.E, - ButtonZl = Key.Q, - ButtonSl = Key.Unbound, - ButtonSr = Key.Unbound, - }, - LeftJoyconStick = new JoyconConfigKeyboardStick - { - StickUp = Key.W, - StickDown = Key.S, - StickLeft = Key.A, - StickRight = Key.D, - StickButton = Key.F, - }, - RightJoycon = new RightJoyconCommonConfig - { - ButtonA = Key.Z, - ButtonB = Key.X, - ButtonX = Key.C, - ButtonY = Key.V, - ButtonPlus = Key.Plus, - ButtonR = Key.U, - ButtonZr = Key.O, - ButtonSl = Key.Unbound, - ButtonSr = Key.Unbound, - }, - RightJoyconStick = new JoyconConfigKeyboardStick - { - StickUp = Key.I, - StickDown = Key.K, - StickLeft = Key.J, - StickRight = Key.L, - StickButton = Key.H, - }, - }, - }; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 25) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 25."); - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 26) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 26."); - - configurationFileFormat.MemoryManagerMode = MemoryManagerMode.HostMappedUnsafe; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 27) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 27."); - - configurationFileFormat.EnableMouse = false; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 28) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 28."); - - configurationFileFormat.Hotkeys = new KeyboardHotkeys - { - ToggleVSyncMode = Key.F1, - Screenshot = Key.F8, - }; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 29) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 29."); - - configurationFileFormat.Hotkeys = new KeyboardHotkeys - { - ToggleVSyncMode = Key.F1, - Screenshot = Key.F8, - ShowUI = Key.F4, - }; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 30) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 30."); - - foreach (InputConfig config in configurationFileFormat.InputConfig) - { - if (config is StandardControllerInputConfig controllerConfig) - { - controllerConfig.Rumble = new RumbleConfigController - { - EnableRumble = false, - StrongRumble = 1f, - WeakRumble = 1f, - }; - } - } - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 31) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 31."); - - configurationFileFormat.BackendThreading = BackendThreading.Auto; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 32) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 32."); - - configurationFileFormat.Hotkeys = new KeyboardHotkeys - { - ToggleVSyncMode = configurationFileFormat.Hotkeys.ToggleVSyncMode, - Screenshot = configurationFileFormat.Hotkeys.Screenshot, - ShowUI = configurationFileFormat.Hotkeys.ShowUI, - Pause = Key.F5, - }; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 33) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 33."); - - configurationFileFormat.Hotkeys = new KeyboardHotkeys - { - ToggleVSyncMode = configurationFileFormat.Hotkeys.ToggleVSyncMode, - Screenshot = configurationFileFormat.Hotkeys.Screenshot, - ShowUI = configurationFileFormat.Hotkeys.ShowUI, - Pause = configurationFileFormat.Hotkeys.Pause, - ToggleMute = Key.F2, - }; - - configurationFileFormat.AudioVolume = 1; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 34) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 34."); - - configurationFileFormat.EnableInternetAccess = false; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 35) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 35."); - - foreach (InputConfig config in configurationFileFormat.InputConfig) - { - if (config is StandardControllerInputConfig controllerConfig) - { - controllerConfig.RangeLeft = 1.0f; - controllerConfig.RangeRight = 1.0f; - } - } - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 36) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 36."); - - configurationFileFormat.LoggingEnableTrace = false; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 37) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 37."); - - configurationFileFormat.ShowConsole = true; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 38) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 38."); - - configurationFileFormat.BaseStyle = "Dark"; - configurationFileFormat.GameListViewMode = 0; - configurationFileFormat.ShowNames = true; - configurationFileFormat.GridSize = 2; - configurationFileFormat.LanguageCode = "en_US"; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 39) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 39."); - - configurationFileFormat.Hotkeys = new KeyboardHotkeys - { - ToggleVSyncMode = configurationFileFormat.Hotkeys.ToggleVSyncMode, - Screenshot = configurationFileFormat.Hotkeys.Screenshot, - ShowUI = configurationFileFormat.Hotkeys.ShowUI, - Pause = configurationFileFormat.Hotkeys.Pause, - ToggleMute = configurationFileFormat.Hotkeys.ToggleMute, - ResScaleUp = Key.Unbound, - ResScaleDown = Key.Unbound, - }; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 40) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 40."); - - configurationFileFormat.GraphicsBackend = GraphicsBackend.OpenGl; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 41) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 41."); - - configurationFileFormat.Hotkeys = new KeyboardHotkeys - { - ToggleVSyncMode = configurationFileFormat.Hotkeys.ToggleVSyncMode, - Screenshot = configurationFileFormat.Hotkeys.Screenshot, - ShowUI = configurationFileFormat.Hotkeys.ShowUI, - Pause = configurationFileFormat.Hotkeys.Pause, - ToggleMute = configurationFileFormat.Hotkeys.ToggleMute, - ResScaleUp = configurationFileFormat.Hotkeys.ResScaleUp, - ResScaleDown = configurationFileFormat.Hotkeys.ResScaleDown, - VolumeUp = Key.Unbound, - VolumeDown = Key.Unbound, - }; - } - - if (configurationFileFormat.Version < 42) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 42."); - - configurationFileFormat.EnableMacroHLE = true; - } - - if (configurationFileFormat.Version < 43) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 43."); - - configurationFileFormat.UseHypervisor = true; - } - - if (configurationFileFormat.Version < 44) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 44."); - - configurationFileFormat.AntiAliasing = AntiAliasing.None; - configurationFileFormat.ScalingFilter = ScalingFilter.Bilinear; - configurationFileFormat.ScalingFilterLevel = 80; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 45) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 45."); - - configurationFileFormat.ShownFileTypes = new ShownFileTypes - { - NSP = true, - PFS0 = true, - XCI = true, - NCA = true, - NRO = true, - NSO = true, - }; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 46) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 46."); - - configurationFileFormat.MultiplayerLanInterfaceId = "0"; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 47) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 47."); - - configurationFileFormat.WindowStartup = new WindowStartup - { - WindowPositionX = 0, - WindowPositionY = 0, - WindowSizeHeight = 760, - WindowSizeWidth = 1280, - WindowMaximized = false, - }; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 48) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 48."); - - configurationFileFormat.EnableColorSpacePassthrough = false; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 49) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 49."); - - if (OperatingSystem.IsMacOS()) - { - AppDataManager.FixMacOSConfigurationFolders(); - } - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 50) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 50."); - - configurationFileFormat.EnableHardwareAcceleration = true; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 51) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 51."); - - configurationFileFormat.RememberWindowState = true; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 52) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 52."); - - configurationFileFormat.AutoloadDirs = []; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 53) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 53."); - - configurationFileFormat.EnableLowPowerPtc = false; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 54) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 54."); - - configurationFileFormat.DramSize = MemoryConfiguration.MemoryConfiguration4GiB; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 55) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 55."); - - configurationFileFormat.IgnoreApplet = false; - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 56) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 56."); - - configurationFileFormat.ShowTitleBar = !OperatingSystem.IsWindows(); - - configurationFileUpdated = true; - } - - if (configurationFileFormat.Version < 57) - { - Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 57."); - - configurationFileFormat.VSyncMode = VSyncMode.Switch; - configurationFileFormat.EnableCustomVSyncInterval = false; - - configurationFileFormat.Hotkeys = new KeyboardHotkeys - { - ToggleVSyncMode = Key.F1, - Screenshot = configurationFileFormat.Hotkeys.Screenshot, - ShowUI = configurationFileFormat.Hotkeys.ShowUI, - Pause = configurationFileFormat.Hotkeys.Pause, - ToggleMute = configurationFileFormat.Hotkeys.ToggleMute, - ResScaleUp = configurationFileFormat.Hotkeys.ResScaleUp, - ResScaleDown = configurationFileFormat.Hotkeys.ResScaleDown, - VolumeUp = configurationFileFormat.Hotkeys.VolumeUp, - VolumeDown = configurationFileFormat.Hotkeys.VolumeDown, - CustomVSyncIntervalIncrement = Key.Unbound, - CustomVSyncIntervalDecrement = Key.Unbound, - }; - - configurationFileFormat.CustomVSyncInterval = 120; - - configurationFileUpdated = true; - } - - Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog; - Graphics.ResScale.Value = configurationFileFormat.ResScale; - Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom; - Graphics.MaxAnisotropy.Value = configurationFileFormat.MaxAnisotropy; - Graphics.AspectRatio.Value = configurationFileFormat.AspectRatio; - Graphics.ShadersDumpPath.Value = configurationFileFormat.GraphicsShadersDumpPath; - Graphics.BackendThreading.Value = configurationFileFormat.BackendThreading; - Graphics.GraphicsBackend.Value = configurationFileFormat.GraphicsBackend; - Graphics.PreferredGpu.Value = configurationFileFormat.PreferredGpu; - Graphics.AntiAliasing.Value = configurationFileFormat.AntiAliasing; - Graphics.ScalingFilter.Value = configurationFileFormat.ScalingFilter; - Graphics.ScalingFilterLevel.Value = configurationFileFormat.ScalingFilterLevel; - Logger.EnableDebug.Value = configurationFileFormat.LoggingEnableDebug; - Logger.EnableStub.Value = configurationFileFormat.LoggingEnableStub; - Logger.EnableInfo.Value = configurationFileFormat.LoggingEnableInfo; - Logger.EnableWarn.Value = configurationFileFormat.LoggingEnableWarn; - Logger.EnableError.Value = configurationFileFormat.LoggingEnableError; - Logger.EnableTrace.Value = configurationFileFormat.LoggingEnableTrace; - Logger.EnableGuest.Value = configurationFileFormat.LoggingEnableGuest; - Logger.EnableFsAccessLog.Value = configurationFileFormat.LoggingEnableFsAccessLog; - Logger.FilteredClasses.Value = configurationFileFormat.LoggingFilteredClasses; - Logger.GraphicsDebugLevel.Value = configurationFileFormat.LoggingGraphicsDebugLevel; - System.Language.Value = configurationFileFormat.SystemLanguage; - System.Region.Value = configurationFileFormat.SystemRegion; - System.TimeZone.Value = configurationFileFormat.SystemTimeZone; - System.SystemTimeOffset.Value = configurationFileFormat.SystemTimeOffset; - System.EnableDockedMode.Value = configurationFileFormat.DockedMode; - EnableDiscordIntegration.Value = configurationFileFormat.EnableDiscordIntegration; - CheckUpdatesOnStart.Value = configurationFileFormat.CheckUpdatesOnStart; - ShowConfirmExit.Value = configurationFileFormat.ShowConfirmExit; - IgnoreApplet.Value = configurationFileFormat.IgnoreApplet; - RememberWindowState.Value = configurationFileFormat.RememberWindowState; - ShowTitleBar.Value = configurationFileFormat.ShowTitleBar; - EnableHardwareAcceleration.Value = configurationFileFormat.EnableHardwareAcceleration; - HideCursor.Value = configurationFileFormat.HideCursor; - Graphics.VSyncMode.Value = configurationFileFormat.VSyncMode; - Graphics.EnableCustomVSyncInterval.Value = configurationFileFormat.EnableCustomVSyncInterval; - Graphics.CustomVSyncInterval.Value = configurationFileFormat.CustomVSyncInterval; - Graphics.EnableShaderCache.Value = configurationFileFormat.EnableShaderCache; - Graphics.EnableTextureRecompression.Value = configurationFileFormat.EnableTextureRecompression; - Graphics.EnableMacroHLE.Value = configurationFileFormat.EnableMacroHLE; - Graphics.EnableColorSpacePassthrough.Value = configurationFileFormat.EnableColorSpacePassthrough; - System.EnablePtc.Value = configurationFileFormat.EnablePtc; - System.EnableLowPowerPtc.Value = configurationFileFormat.EnableLowPowerPtc; - System.EnableInternetAccess.Value = configurationFileFormat.EnableInternetAccess; - System.EnableFsIntegrityChecks.Value = configurationFileFormat.EnableFsIntegrityChecks; - System.FsGlobalAccessLogMode.Value = configurationFileFormat.FsGlobalAccessLogMode; - System.AudioBackend.Value = configurationFileFormat.AudioBackend; - System.AudioVolume.Value = configurationFileFormat.AudioVolume; - System.MemoryManagerMode.Value = configurationFileFormat.MemoryManagerMode; - System.DramSize.Value = configurationFileFormat.DramSize; - System.IgnoreMissingServices.Value = configurationFileFormat.IgnoreMissingServices; - System.UseHypervisor.Value = configurationFileFormat.UseHypervisor; - UI.GuiColumns.FavColumn.Value = configurationFileFormat.GuiColumns.FavColumn; - UI.GuiColumns.IconColumn.Value = configurationFileFormat.GuiColumns.IconColumn; - UI.GuiColumns.AppColumn.Value = configurationFileFormat.GuiColumns.AppColumn; - UI.GuiColumns.DevColumn.Value = configurationFileFormat.GuiColumns.DevColumn; - UI.GuiColumns.VersionColumn.Value = configurationFileFormat.GuiColumns.VersionColumn; - UI.GuiColumns.TimePlayedColumn.Value = configurationFileFormat.GuiColumns.TimePlayedColumn; - UI.GuiColumns.LastPlayedColumn.Value = configurationFileFormat.GuiColumns.LastPlayedColumn; - UI.GuiColumns.FileExtColumn.Value = configurationFileFormat.GuiColumns.FileExtColumn; - UI.GuiColumns.FileSizeColumn.Value = configurationFileFormat.GuiColumns.FileSizeColumn; - UI.GuiColumns.PathColumn.Value = configurationFileFormat.GuiColumns.PathColumn; - UI.ColumnSort.SortColumnId.Value = configurationFileFormat.ColumnSort.SortColumnId; - UI.ColumnSort.SortAscending.Value = configurationFileFormat.ColumnSort.SortAscending; - UI.GameDirs.Value = configurationFileFormat.GameDirs; - UI.AutoloadDirs.Value = configurationFileFormat.AutoloadDirs ?? []; - UI.ShownFileTypes.NSP.Value = configurationFileFormat.ShownFileTypes.NSP; - UI.ShownFileTypes.PFS0.Value = configurationFileFormat.ShownFileTypes.PFS0; - UI.ShownFileTypes.XCI.Value = configurationFileFormat.ShownFileTypes.XCI; - UI.ShownFileTypes.NCA.Value = configurationFileFormat.ShownFileTypes.NCA; - UI.ShownFileTypes.NRO.Value = configurationFileFormat.ShownFileTypes.NRO; - UI.ShownFileTypes.NSO.Value = configurationFileFormat.ShownFileTypes.NSO; - UI.LanguageCode.Value = configurationFileFormat.LanguageCode; - UI.BaseStyle.Value = configurationFileFormat.BaseStyle; - UI.GameListViewMode.Value = configurationFileFormat.GameListViewMode; - UI.ShowNames.Value = configurationFileFormat.ShowNames; - UI.IsAscendingOrder.Value = configurationFileFormat.IsAscendingOrder; - UI.GridSize.Value = configurationFileFormat.GridSize; - UI.ApplicationSort.Value = configurationFileFormat.ApplicationSort; - UI.StartFullscreen.Value = configurationFileFormat.StartFullscreen; - UI.ShowConsole.Value = configurationFileFormat.ShowConsole; - UI.WindowStartup.WindowSizeWidth.Value = configurationFileFormat.WindowStartup.WindowSizeWidth; - UI.WindowStartup.WindowSizeHeight.Value = configurationFileFormat.WindowStartup.WindowSizeHeight; - UI.WindowStartup.WindowPositionX.Value = configurationFileFormat.WindowStartup.WindowPositionX; - UI.WindowStartup.WindowPositionY.Value = configurationFileFormat.WindowStartup.WindowPositionY; - UI.WindowStartup.WindowMaximized.Value = configurationFileFormat.WindowStartup.WindowMaximized; - Hid.EnableKeyboard.Value = configurationFileFormat.EnableKeyboard; - Hid.EnableMouse.Value = configurationFileFormat.EnableMouse; - Hid.Hotkeys.Value = configurationFileFormat.Hotkeys; - Hid.InputConfig.Value = configurationFileFormat.InputConfig ?? []; - - Multiplayer.LanInterfaceId.Value = configurationFileFormat.MultiplayerLanInterfaceId; - Multiplayer.Mode.Value = configurationFileFormat.MultiplayerMode; - Multiplayer.DisableP2p.Value = configurationFileFormat.MultiplayerDisableP2p; - Multiplayer.LdnPassphrase.Value = configurationFileFormat.MultiplayerLdnPassphrase; - Multiplayer.LdnServer.Value = configurationFileFormat.LdnServer; - - if (configurationFileUpdated) - { - ToFileFormat().SaveConfig(configurationFilePath); - - Ryujinx.Common.Logging.Logger.Notice.Print(LogClass.Application, $"Configuration file updated to version {ConfigurationFileFormat.CurrentVersion}"); - } - } - } -} diff --git a/src/Ryujinx.UI.Common/Configuration/FileTypes.cs b/src/Ryujinx.UI.Common/Configuration/FileTypes.cs deleted file mode 100644 index 1974207b6..000000000 --- a/src/Ryujinx.UI.Common/Configuration/FileTypes.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Ryujinx.UI.Common -{ - public enum FileTypes - { - NSP, - PFS0, - XCI, - NCA, - NRO, - NSO - } -} diff --git a/src/Ryujinx.UI.Common/Configuration/System/Region.cs b/src/Ryujinx.UI.Common/Configuration/System/Region.cs deleted file mode 100644 index 6087c70e5..000000000 --- a/src/Ryujinx.UI.Common/Configuration/System/Region.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Ryujinx.Common.Utilities; -using System.Text.Json.Serialization; - -namespace Ryujinx.UI.Common.Configuration.System -{ - [JsonConverter(typeof(TypedStringEnumConverter))] - public enum Region - { - Japan, - USA, - Europe, - Australia, - China, - Korea, - Taiwan, - } -} diff --git a/src/Ryujinx.UI.Common/Models/Github/GithubReleaseAssetJsonResponse.cs b/src/Ryujinx.UI.Common/Models/Github/GithubReleaseAssetJsonResponse.cs deleted file mode 100644 index 8f528dc0b..000000000 --- a/src/Ryujinx.UI.Common/Models/Github/GithubReleaseAssetJsonResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Ryujinx.UI.Common.Models.Github -{ - public class GithubReleaseAssetJsonResponse - { - public string Name { get; set; } - public string State { get; set; } - public string BrowserDownloadUrl { get; set; } - } -} diff --git a/src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonResponse.cs b/src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonResponse.cs deleted file mode 100644 index 7bec1bcdc..000000000 --- a/src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonResponse.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections.Generic; - -namespace Ryujinx.UI.Common.Models.Github -{ - public class GithubReleasesJsonResponse - { - public string Name { get; set; } - - public string TagName { get; set; } - public List Assets { get; set; } - } -} diff --git a/src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonSerializerContext.cs b/src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonSerializerContext.cs deleted file mode 100644 index 71864257c..000000000 --- a/src/Ryujinx.UI.Common/Models/Github/GithubReleasesJsonSerializerContext.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Text.Json.Serialization; - -namespace Ryujinx.UI.Common.Models.Github -{ - [JsonSerializable(typeof(GithubReleasesJsonResponse), GenerationMode = JsonSourceGenerationMode.Metadata)] - public partial class GithubReleasesJsonSerializerContext : JsonSerializerContext - { - } -} diff --git a/src/Ryujinx.UI.Common/Resources/Controller_JoyConLeft.svg b/src/Ryujinx.UI.Common/Resources/Controller_JoyConLeft.svg deleted file mode 100644 index 03585e656..000000000 --- a/src/Ryujinx.UI.Common/Resources/Controller_JoyConLeft.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Ryujinx.UI.Common/Resources/Controller_JoyConPair.svg b/src/Ryujinx.UI.Common/Resources/Controller_JoyConPair.svg deleted file mode 100644 index c073c9c0c..000000000 --- a/src/Ryujinx.UI.Common/Resources/Controller_JoyConPair.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Ryujinx.UI.Common/Resources/Controller_JoyConRight.svg b/src/Ryujinx.UI.Common/Resources/Controller_JoyConRight.svg deleted file mode 100644 index f4f125148..000000000 --- a/src/Ryujinx.UI.Common/Resources/Controller_JoyConRight.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Ryujinx.UI.Common/Resources/Controller_ProCon.svg b/src/Ryujinx.UI.Common/Resources/Controller_ProCon.svg deleted file mode 100644 index f5380f3ad..000000000 --- a/src/Ryujinx.UI.Common/Resources/Controller_ProCon.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A - - - - X - - - - Y - - - - B - - - - - - - - - - ZL - - - - - ZR - - - - R - - - - - L - - - diff --git a/src/Ryujinx.UI.Common/Resources/Logo_GitHub_Dark.png b/src/Ryujinx.UI.Common/Resources/Logo_GitHub_Dark.png deleted file mode 100644 index 50b817522..000000000 Binary files a/src/Ryujinx.UI.Common/Resources/Logo_GitHub_Dark.png and /dev/null differ diff --git a/src/Ryujinx.UI.Common/Resources/Logo_GitHub_Light.png b/src/Ryujinx.UI.Common/Resources/Logo_GitHub_Light.png deleted file mode 100644 index 95bc742bb..000000000 Binary files a/src/Ryujinx.UI.Common/Resources/Logo_GitHub_Light.png and /dev/null differ diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png b/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png deleted file mode 100644 index 28067e908..000000000 Binary files a/src/Ryujinx.UI.Common/Resources/Logo_Ryujinx.png and /dev/null differ diff --git a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj deleted file mode 100644 index 7f57c7bf5..000000000 --- a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj +++ /dev/null @@ -1,64 +0,0 @@ - - - - net8.0 - true - $(DefaultItemExcludes);._* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Ryujinx.UI.LocaleGenerator/LocaleGenerator.cs b/src/Ryujinx.UI.LocaleGenerator/LocaleGenerator.cs index 729a166b6..4de92ee4a 100644 --- a/src/Ryujinx.UI.LocaleGenerator/LocaleGenerator.cs +++ b/src/Ryujinx.UI.LocaleGenerator/LocaleGenerator.cs @@ -1,4 +1,5 @@ using Microsoft.CodeAnalysis; +using System.Collections.Generic; using System.Linq; using System.Text; @@ -9,21 +10,23 @@ namespace Ryujinx.UI.LocaleGenerator { public void Initialize(IncrementalGeneratorInitializationContext context) { - var englishLocaleFile = context.AdditionalTextsProvider.Where(static x => x.Path.EndsWith("en_US.json")); + IncrementalValuesProvider localeFile = context.AdditionalTextsProvider.Where(static x => x.Path.EndsWith("locales.json")); - IncrementalValuesProvider contents = englishLocaleFile.Select((text, cancellationToken) => text.GetText(cancellationToken)!.ToString()); + IncrementalValuesProvider contents = localeFile.Select((text, cancellationToken) => text.GetText(cancellationToken)!.ToString()); context.RegisterSourceOutput(contents, (spc, content) => { - var lines = content.Split('\n').Where(x => x.Trim().StartsWith("\"")).Select(x => x.Split(':')[0].Trim().Replace("\"", string.Empty)); + IEnumerable lines = content.Split('\n').Where(x => x.Trim().StartsWith("\"ID\":")).Select(x => x.Split(':')[1].Trim().Replace("\"", string.Empty).Replace(",", string.Empty)); + StringBuilder enumSourceBuilder = new(); enumSourceBuilder.AppendLine("namespace Ryujinx.Ava.Common.Locale;"); - enumSourceBuilder.AppendLine("internal enum LocaleKeys"); + enumSourceBuilder.AppendLine("public enum LocaleKeys"); enumSourceBuilder.AppendLine("{"); - foreach (var line in lines) + foreach (string? line in lines) { enumSourceBuilder.AppendLine($" {line},"); } + enumSourceBuilder.AppendLine("}"); spc.AddSource("LocaleKeys", enumSourceBuilder.ToString()); diff --git a/src/Ryujinx.UI.LocaleGenerator/Ryujinx.UI.LocaleGenerator.csproj b/src/Ryujinx.UI.LocaleGenerator/Ryujinx.UI.LocaleGenerator.csproj index e4e627072..49cb39713 100644 --- a/src/Ryujinx.UI.LocaleGenerator/Ryujinx.UI.LocaleGenerator.csproj +++ b/src/Ryujinx.UI.LocaleGenerator/Ryujinx.UI.LocaleGenerator.csproj @@ -3,7 +3,6 @@ netstandard2.0 enable - latest true $(DefaultItemExcludes);._* diff --git a/src/Ryujinx/Assets/Fonts/Mono/AUTHORS.txt b/src/Ryujinx/Assets/Fonts/Mono/AUTHORS.txt new file mode 100644 index 000000000..881494169 --- /dev/null +++ b/src/Ryujinx/Assets/Fonts/Mono/AUTHORS.txt @@ -0,0 +1,10 @@ +# This is the official list of project authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS.txt file. +# See the latter for an explanation. +# +# Names should be added to this file as: +# Name or Organization + +JetBrains <> +Philipp Nurullin +Konstantin Bulenkov diff --git a/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Bold.ttf b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Bold.ttf new file mode 100644 index 000000000..f78f84fb4 Binary files /dev/null and b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Bold.ttf differ diff --git a/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-BoldItalic.ttf b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-BoldItalic.ttf new file mode 100644 index 000000000..9fb8c8325 Binary files /dev/null and b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-BoldItalic.ttf differ diff --git a/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Italic.ttf b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Italic.ttf new file mode 100644 index 000000000..4e9c3802d Binary files /dev/null and b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Italic.ttf differ diff --git a/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Regular.ttf b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Regular.ttf new file mode 100644 index 000000000..70d2ec9e2 Binary files /dev/null and b/src/Ryujinx/Assets/Fonts/Mono/JetBrainsMonoNL-Regular.ttf differ diff --git a/src/Ryujinx/Assets/Fonts/Mono/OFL.txt b/src/Ryujinx/Assets/Fonts/Mono/OFL.txt new file mode 100644 index 000000000..8bee4148c --- /dev/null +++ b/src/Ryujinx/Assets/Fonts/Mono/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/src/Ryujinx/Assets/Locales/ar_SA.json b/src/Ryujinx/Assets/Locales/ar_SA.json deleted file mode 100644 index 412695af6..000000000 --- a/src/Ryujinx/Assets/Locales/ar_SA.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "اَلْعَرَبِيَّةُ", - "MenuBarFileOpenApplet": "فتح التطبيق المصغر", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "‫افتح تطبيق تحرير Mii في الوضع المستقل", - "SettingsTabInputDirectMouseAccess": "الوصول المباشر للفأرة", - "SettingsTabSystemMemoryManagerMode": "وضع إدارة الذاكرة:", - "SettingsTabSystemMemoryManagerModeSoftware": "البرنامج", - "SettingsTabSystemMemoryManagerModeHost": "المُضيف (سريع)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "المضيف (غير مفحوص) (أسرع، غير آمن)", - "SettingsTabSystemUseHypervisor": "استخدم مراقب الأجهزة الافتراضية", - "MenuBarFile": "_ملف", - "MenuBarFileOpenFromFile": "_تحميل تطبيق من ملف", - "MenuBarFileOpenFromFileError": "No applications found in selected file.", - "MenuBarFileOpenUnpacked": "تحميل لُعْبَة غير محزومة", - "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder", - "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder", - "MenuBarFileOpenEmuFolder": "‫فتح مجلد Ryujinx", - "MenuBarFileOpenLogsFolder": "فتح مجلد السجلات", - "MenuBarFileExit": "_خروج", - "MenuBarOptions": "_خيارات", - "MenuBarOptionsToggleFullscreen": "التبديل إلى وضع ملء الشاشة", - "MenuBarOptionsStartGamesInFullscreen": "ابدأ الألعاب في وضع ملء الشاشة", - "MenuBarOptionsStopEmulation": "إيقاف المحاكاة", - "MenuBarOptionsSettings": "_الإعدادات", - "MenuBarOptionsManageUserProfiles": "_إدارة الملفات الشخصية للمستخدم", - "MenuBarActions": "_الإجراءات", - "MenuBarOptionsSimulateWakeUpMessage": "محاكاة رسالة الاستيقاظ", - "MenuBarActionsScanAmiibo": "‫فحص Amiibo", - "MenuBarTools": "_الأدوات", - "MenuBarToolsInstallFirmware": "تثبيت البرنامج الثابت", - "MenuBarFileToolsInstallFirmwareFromFile": "تثبيت برنامج ثابت من XCI أو ZIP", - "MenuBarFileToolsInstallFirmwareFromDirectory": "تثبيت برنامج ثابت من مجلد", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "إدارة أنواع الملفات", - "MenuBarToolsInstallFileTypes": "تثبيت أنواع الملفات", - "MenuBarToolsUninstallFileTypes": "إزالة أنواع الملفات", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_عرض", - "MenuBarViewWindow": "حجم النافذة", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_مساعدة", - "MenuBarHelpCheckForUpdates": "تحقق من التحديثات", - "MenuBarHelpAbout": "حول", - "MenuSearch": "بحث...", - "GameListHeaderFavorite": "مفضلة", - "GameListHeaderIcon": "الأيقونة", - "GameListHeaderApplication": "الاسم", - "GameListHeaderDeveloper": "المطور", - "GameListHeaderVersion": "الإصدار", - "GameListHeaderTimePlayed": "وقت اللعب", - "GameListHeaderLastPlayed": "آخر مرة لُعبت", - "GameListHeaderFileExtension": "صيغة الملف", - "GameListHeaderFileSize": "حجم الملف", - "GameListHeaderPath": "المسار", - "GameListContextMenuOpenUserSaveDirectory": "فتح مجلد حفظ المستخدم", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "يفتح المجلد الذي يحتوي على حفظ المستخدم للتطبيق", - "GameListContextMenuOpenDeviceSaveDirectory": "فتح مجلد حفظ الجهاز", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "يفتح المجلد الذي يحتوي على حفظ الجهاز للتطبيق", - "GameListContextMenuOpenBcatSaveDirectory": "‫فتح مجلد حفظ الـBCAT", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "‫يفتح المجلد الذي يحتوي على حفظ الـBCAT للتطبيق", - "GameListContextMenuManageTitleUpdates": "إدارة تحديثات اللُعبة", - "GameListContextMenuManageTitleUpdatesToolTip": "يفتح نافذة إدارة تحديث اللُعبة", - "GameListContextMenuManageDlc": "إدارة المحتوي الإضافي", - "GameListContextMenuManageDlcToolTip": "يفتح نافذة إدارة المحتوي الإضافي", - "GameListContextMenuCacheManagement": "إدارة ذاكرة التخزين المؤقت", - "GameListContextMenuCacheManagementPurgePptc": "قائمة انتظار إعادة بناء الـ‫PPTC", - "GameListContextMenuCacheManagementPurgePptcToolTip": "تنشيط ‫PPTC لإعادة البناء في وقت الإقلاع عند بدء تشغيل اللعبة التالي", - "GameListContextMenuCacheManagementPurgeShaderCache": "تنظيف ذاكرة مرشحات الفيديو المؤقتة", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "يحذف ذاكرة مرشحات الفيديو المؤقتة الخاصة بالتطبيق", - "GameListContextMenuCacheManagementOpenPptcDirectory": "‫فتح مجلد PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "‫‫يفتح المجلد الذي يحتوي على ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) للتطبيق", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "فتح مجلد الذاكرة المؤقتة لمرشحات الفيديو ", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "يفتح المجلد الذي يحتوي على ذاكرة المظللات المؤقتة للتطبيق", - "GameListContextMenuExtractData": "استخراج البيانات", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "‫‫ استخراج قسم نظام الملفات القابل للتنفيذ (ExeFS) من الإعدادات الحالية للتطبيقات (يتضمن التحديثات)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "استخراج قسم RomFS من الإعدادات الحالية للتطبيقات (يتضمن التحديثات)", - "GameListContextMenuExtractDataLogo": "شعار", - "GameListContextMenuExtractDataLogoToolTip": "استخراج قسم الشعار من الإعدادات الحالية للتطبيقات (يتضمن التحديثات)", - "GameListContextMenuCreateShortcut": "إنشاء اختصار للتطبيق", - "GameListContextMenuCreateShortcutToolTip": "أنشئ اختصار سطح مكتب لتشغيل التطبيق المحدد", - "GameListContextMenuCreateShortcutToolTipMacOS": "أنشئ اختصار يُشغل التطبيق المحدد في مجلد تطبيقات ‫macOS", - "GameListContextMenuOpenModsDirectory": "‫فتح مجلد التعديلات (Mods)", - "GameListContextMenuOpenModsDirectoryToolTip": "يفتح المجلد الذي يحتوي على تعديلات‫(mods) التطبيق", - "GameListContextMenuOpenSdModsDirectory": "فتح مجلد تعديلات‫(mods) أتموسفير", - "GameListContextMenuOpenSdModsDirectoryToolTip": "يفتح مجلد أتموسفير لبطاقة SD البديلة الذي يحتوي على تعديلات التطبيق. مفيد للتعديلات التي تم تعبئتها للأجهزة الحقيقية.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} لعبة تم تحميلها", - "StatusBarSystemVersion": "إصدار النظام: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "الحد الأدنى لتعيينات الذاكرة المكتشفة", - "LinuxVmMaxMapCountDialogTextPrimary": "هل ترغب في زيادة قيمة vm.max_map_count إلى {0}", - "LinuxVmMaxMapCountDialogTextSecondary": "قد تحاول بعض الألعاب إنشاء المزيد من تعيينات الذاكرة أكثر مما هو مسموح به حاليا. سيغلق ريوجينكس بمجرد تجاوز هذا الحد.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "نعم، حتى إعادة التشغيل التالية", - "LinuxVmMaxMapCountDialogButtonPersistent": "نعم، دائمًا", - "LinuxVmMaxMapCountWarningTextPrimary": "الحد الأقصى لمقدار تعيينات الذاكرة أقل من الموصى به.", - "LinuxVmMaxMapCountWarningTextSecondary": "القيمة الحالية لـ vm.max_map_count ({0}) أقل من {1}. قد تحاول بعض الألعاب إنشاء المزيد من تعيينات الذاكرة أكثر مما هو مسموح به حاليا. سيغلق ريوجينكس بمجرد تجاوز هذا الحد.\n\nقد ترغب إما في زيادة الحد يدويا أو تثبيت pkexec، مما يسمح لـ ريوجينكس بالمساعدة في ذلك.", - "Settings": "إعدادات", - "SettingsTabGeneral": "واجهة المستخدم", - "SettingsTabGeneralGeneral": "عام", - "SettingsTabGeneralEnableDiscordRichPresence": "تمكين وجود ديسكورد الغني", - "SettingsTabGeneralCheckUpdatesOnLaunch": "التحقق من وجود تحديثات عند التشغيل", - "SettingsTabGeneralShowConfirmExitDialog": "إظهار مربع حوار \"تأكيد الخروج\"", - "SettingsTabGeneralRememberWindowState": "تذكر حجم/موضع النافذة", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "إخفاء المؤشر:", - "SettingsTabGeneralHideCursorNever": "مطلقا", - "SettingsTabGeneralHideCursorOnIdle": "عند الخمول", - "SettingsTabGeneralHideCursorAlways": "دائما", - "SettingsTabGeneralGameDirectories": "مجلدات الألعاب", - "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "إضافة", - "SettingsTabGeneralRemove": "إزالة", - "SettingsTabSystem": "النظام", - "SettingsTabSystemCore": "النواة", - "SettingsTabSystemSystemRegion": "منطقة النظام:", - "SettingsTabSystemSystemRegionJapan": "اليابان", - "SettingsTabSystemSystemRegionUSA": "الولايات المتحدة الأمريكية", - "SettingsTabSystemSystemRegionEurope": "أوروبا", - "SettingsTabSystemSystemRegionAustralia": "أستراليا", - "SettingsTabSystemSystemRegionChina": "الصين", - "SettingsTabSystemSystemRegionKorea": "كوريا", - "SettingsTabSystemSystemRegionTaiwan": "تايوان", - "SettingsTabSystemSystemLanguage": "لغة النظام:", - "SettingsTabSystemSystemLanguageJapanese": "اليابانية", - "SettingsTabSystemSystemLanguageAmericanEnglish": "الإنجليزية الأمريكية", - "SettingsTabSystemSystemLanguageFrench": "الفرنسية", - "SettingsTabSystemSystemLanguageGerman": "الألمانية", - "SettingsTabSystemSystemLanguageItalian": "الإيطالية", - "SettingsTabSystemSystemLanguageSpanish": "الإسبانية", - "SettingsTabSystemSystemLanguageChinese": "الصينية", - "SettingsTabSystemSystemLanguageKorean": "الكورية", - "SettingsTabSystemSystemLanguageDutch": "الهولندية", - "SettingsTabSystemSystemLanguagePortuguese": "البرتغالية", - "SettingsTabSystemSystemLanguageRussian": "الروسية", - "SettingsTabSystemSystemLanguageTaiwanese": "التايوانية", - "SettingsTabSystemSystemLanguageBritishEnglish": "الإنجليزية البريطانية", - "SettingsTabSystemSystemLanguageCanadianFrench": "الفرنسية الكندية", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "إسبانية أمريكا اللاتينية", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "الصينية المبسطة", - "SettingsTabSystemSystemLanguageTraditionalChinese": "الصينية التقليدية", - "SettingsTabSystemSystemTimeZone": "النطاق الزمني للنظام:", - "SettingsTabSystemSystemTime": "توقيت النظام:", - "SettingsTabSystemEnableVsync": "VSync", - "SettingsTabSystemEnablePptc": "PPTC (ذاكرة التخزين المؤقت للترجمة المستمرة)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "التحقق من سلامة نظام الملفات", - "SettingsTabSystemAudioBackend": "خلفية الصوت:", - "SettingsTabSystemAudioBackendDummy": "زائف", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "هاكات", - "SettingsTabSystemHacksNote": "قد يتسبب في عدم الاستقرار", - "SettingsTabSystemDramSize": "استخدام تخطيط الذاكرة البديل (المطورين)", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "تجاهل الخدمات المفقودة", - "SettingsTabSystemIgnoreApplet": "Ignore Applet", - "SettingsTabGraphics": "الرسومات", - "SettingsTabGraphicsAPI": "API الرسومات ", - "SettingsTabGraphicsEnableShaderCache": "تفعيل ذاكرة المظللات المؤقتة", - "SettingsTabGraphicsAnisotropicFiltering": "تصفية:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "تلقائي", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4×", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "مقياس الدقة", - "SettingsTabGraphicsResolutionScaleCustom": "مخصص (لا ينصح به)", - "SettingsTabGraphicsResolutionScaleNative": "الأصل ‫(720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (لا ينصح به)", - "SettingsTabGraphicsAspectRatio": "نسبة الارتفاع إلى العرض:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "تمديد لتناسب النافذة", - "SettingsTabGraphicsDeveloperOptions": "خيارات المطور", - "SettingsTabGraphicsShaderDumpPath": "مسار تفريغ المظللات:", - "SettingsTabLogging": "تسجيل", - "SettingsTabLoggingLogging": "تسجيل", - "SettingsTabLoggingEnableLoggingToFile": "تفعيل التسجيل إلى ملف", - "SettingsTabLoggingEnableStubLogs": "تفعيل سجلات الـStub", - "SettingsTabLoggingEnableInfoLogs": "تفعيل سجلات المعلومات", - "SettingsTabLoggingEnableWarningLogs": "تفعيل سجلات التحذير", - "SettingsTabLoggingEnableErrorLogs": "تفعيل سجلات الأخطاء", - "SettingsTabLoggingEnableTraceLogs": "تفعيل سجلات التتبع", - "SettingsTabLoggingEnableGuestLogs": "تفعيل سجلات الضيوف", - "SettingsTabLoggingEnableFsAccessLogs": "تمكين سجلات الوصول إلى نظام الملفات", - "SettingsTabLoggingFsGlobalAccessLogMode": "وضع سجل الوصول العالمي لنظام الملفات:", - "SettingsTabLoggingDeveloperOptions": "خيارات المطور", - "SettingsTabLoggingDeveloperOptionsNote": "تحذير: سوف يقلل من الأداء", - "SettingsTabLoggingGraphicsBackendLogLevel": "مستوى سجل خلفية الرسومات:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "لا شيء", - "SettingsTabLoggingGraphicsBackendLogLevelError": "خطأ", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "تباطؤ", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "الكل", - "SettingsTabLoggingEnableDebugLogs": "تمكين سجلات التصحيح", - "SettingsTabInput": "الإدخال", - "SettingsTabInputEnableDockedMode": "تركيب بالمنصة", - "SettingsTabInputDirectKeyboardAccess": "الوصول المباشر للوحة المفاتيح", - "SettingsButtonSave": "حفظ", - "SettingsButtonClose": "إغلاق", - "SettingsButtonOk": "موافق", - "SettingsButtonCancel": "إلغاء", - "SettingsButtonApply": "تطبيق", - "ControllerSettingsPlayer": "اللاعب", - "ControllerSettingsPlayer1": "اللاعب 1", - "ControllerSettingsPlayer2": "اللاعب 2", - "ControllerSettingsPlayer3": "اللاعب 3", - "ControllerSettingsPlayer4": "اللاعب 4", - "ControllerSettingsPlayer5": "اللاعب 5", - "ControllerSettingsPlayer6": "اللاعب 6", - "ControllerSettingsPlayer7": "اللاعب 7", - "ControllerSettingsPlayer8": "اللاعب 8", - "ControllerSettingsHandheld": "محمول", - "ControllerSettingsInputDevice": "جهاز الإدخال", - "ControllerSettingsRefresh": "تحديث", - "ControllerSettingsDeviceDisabled": "معطل", - "ControllerSettingsControllerType": "نوع وحدة التحكم", - "ControllerSettingsControllerTypeHandheld": "محمول", - "ControllerSettingsControllerTypeProController": "وحدة تحكم برو", - "ControllerSettingsControllerTypeJoyConPair": "زوج جوي كون", - "ControllerSettingsControllerTypeJoyConLeft": "جوي كون اليسار ", - "ControllerSettingsControllerTypeJoyConRight": " جوي كون اليمين", - "ControllerSettingsProfile": "الملف الشخصي", - "ControllerSettingsProfileDefault": "افتراضي", - "ControllerSettingsLoad": "تحميل", - "ControllerSettingsAdd": "إضافة", - "ControllerSettingsRemove": "إزالة", - "ControllerSettingsButtons": "الأزرار", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "أسهم الاتجاهات", - "ControllerSettingsDPadUp": "اعلى", - "ControllerSettingsDPadDown": "أسفل", - "ControllerSettingsDPadLeft": "يسار", - "ControllerSettingsDPadRight": "يمين", - "ControllerSettingsStickButton": "زر", - "ControllerSettingsStickUp": "فوق", - "ControllerSettingsStickDown": "أسفل", - "ControllerSettingsStickLeft": "يسار", - "ControllerSettingsStickRight": "يمين", - "ControllerSettingsStickStick": "عصا", - "ControllerSettingsStickInvertXAxis": "عكس عرض العصا", - "ControllerSettingsStickInvertYAxis": "عكس أفق العصا", - "ControllerSettingsStickDeadzone": "المنطقة الميتة:", - "ControllerSettingsLStick": "العصا اليسرى", - "ControllerSettingsRStick": "العصا اليمنى", - "ControllerSettingsTriggersLeft": "الأزندة اليسرى", - "ControllerSettingsTriggersRight": "الأزندة اليمني", - "ControllerSettingsTriggersButtonsLeft": "أزرار الزناد اليسرى", - "ControllerSettingsTriggersButtonsRight": "أزرار الزناد اليمنى", - "ControllerSettingsTriggers": "أزندة", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "الأزرار اليسار", - "ControllerSettingsExtraButtonsRight": "الأزرار اليمين", - "ControllerSettingsMisc": "إعدادات إضافية", - "ControllerSettingsTriggerThreshold": "قوة التحفيز:", - "ControllerSettingsMotion": "الحركة", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "استخدام الحركة المتوافقة مع CemuHook", - "ControllerSettingsMotionControllerSlot": "خانة وحدة التحكم:", - "ControllerSettingsMotionMirrorInput": "إعادة الإدخال", - "ControllerSettingsMotionRightJoyConSlot": "خانة جويكون اليمين :", - "ControllerSettingsMotionServerHost": "مضيف الخادم:", - "ControllerSettingsMotionGyroSensitivity": "حساسية مستشعر الحركة:", - "ControllerSettingsMotionGyroDeadzone": "منطقة مستشعر الحركة الميتة:", - "ControllerSettingsSave": "حفظ", - "ControllerSettingsClose": "إغلاق", - "KeyUnknown": "مجهول", - "KeyShiftLeft": "زر ‫Shift الأيسر", - "KeyShiftRight": "زر ‫Shift الأيمن", - "KeyControlLeft": "زر ‫Ctrl الأيسر", - "KeyMacControlLeft": "زر ⌃ الأيسر", - "KeyControlRight": "زر ‫Ctrl الأيمن", - "KeyMacControlRight": "زر ⌃ الأيمن", - "KeyAltLeft": "زر ‫Alt الأيسر", - "KeyMacAltLeft": "زر ⌥ الأيسر", - "KeyAltRight": "زر ‫Alt الأيمن", - "KeyMacAltRight": "زر ⌥ الأيمن", - "KeyWinLeft": "زر ⊞ الأيسر", - "KeyMacWinLeft": "زر ⌘ الأيسر", - "KeyWinRight": "زر ⊞ الأيمن", - "KeyMacWinRight": "زر ⌘ الأيمن", - "KeyMenu": "زر القائمة", - "KeyUp": "فوق", - "KeyDown": "اسفل", - "KeyLeft": "يسار", - "KeyRight": "يمين", - "KeyEnter": "مفتاح الإدخال", - "KeyEscape": "زر ‫Escape", - "KeySpace": "مسافة", - "KeyTab": "زر ‫Tab", - "KeyBackSpace": "زر المسح للخلف", - "KeyInsert": "زر Insert", - "KeyDelete": "زر الحذف", - "KeyPageUp": "زر ‫Page Up", - "KeyPageDown": "زر ‫Page Down", - "KeyHome": "زر ‫Home", - "KeyEnd": "زر ‫End", - "KeyCapsLock": "زر الحروف الكبيرة", - "KeyScrollLock": "زر ‫Scroll Lock", - "KeyPrintScreen": "زر ‫Print Screen", - "KeyPause": "زر Pause", - "KeyNumLock": "زر Num Lock", - "KeyClear": "زر Clear", - "KeyKeypad0": "لوحة الأرقام 0", - "KeyKeypad1": "لوحة الأرقام 1", - "KeyKeypad2": "لوحة الأرقام 2", - "KeyKeypad3": "لوحة الأرقام 3", - "KeyKeypad4": "لوحة الأرقام 4", - "KeyKeypad5": "لوحة الأرقام 5", - "KeyKeypad6": "لوحة الأرقام 6", - "KeyKeypad7": "لوحة الأرقام 7", - "KeyKeypad8": "لوحة الأرقام 8", - "KeyKeypad9": "لوحة الأرقام 9", - "KeyKeypadDivide": "لوحة الأرقام علامة القسمة", - "KeyKeypadMultiply": "لوحة الأرقام علامة الضرب", - "KeyKeypadSubtract": "لوحة الأرقام علامة الطرح\n", - "KeyKeypadAdd": "لوحة الأرقام علامة الزائد", - "KeyKeypadDecimal": "لوحة الأرقام الفاصلة العشرية", - "KeyKeypadEnter": "لوحة الأرقام زر الإدخال", - "KeyNumber0": "٠", - "KeyNumber1": "١", - "KeyNumber2": "٢", - "KeyNumber3": "٣", - "KeyNumber4": "٤", - "KeyNumber5": "٥", - "KeyNumber6": "٦", - "KeyNumber7": "٧", - "KeyNumber8": "٨", - "KeyNumber9": "٩", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "غير مرتبط", - "GamepadLeftStick": "زر عصا التحكم اليسرى", - "GamepadRightStick": "زر عصا التحكم اليمنى", - "GamepadLeftShoulder": "زر الكتف الأيسر‫ L", - "GamepadRightShoulder": "زر الكتف الأيمن‫ R", - "GamepadLeftTrigger": "زر الزناد الأيسر‫ (ZL)", - "GamepadRightTrigger": "زر الزناد الأيمن‫ (ZR)", - "GamepadDpadUp": "فوق", - "GamepadDpadDown": "اسفل", - "GamepadDpadLeft": "يسار", - "GamepadDpadRight": "يمين", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "دليل", - "GamepadMisc1": "متنوع", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "لوحة اللمس", - "GamepadSingleLeftTrigger0": "زر الزناد الأيسر 0", - "GamepadSingleRightTrigger0": "زر الزناد الأيمن 0", - "GamepadSingleLeftTrigger1": "زر الزناد الأيسر 1", - "GamepadSingleRightTrigger1": "زر الزناد الأيمن 1", - "StickLeft": "عصا التحكم اليسرى", - "StickRight": "عصا التحكم اليمنى", - "UserProfilesSelectedUserProfile": "الملف الشخصي المحدد للمستخدم:", - "UserProfilesSaveProfileName": "حفظ اسم الملف الشخصي", - "UserProfilesChangeProfileImage": "تغيير صورة الملف الشخصي", - "UserProfilesAvailableUserProfiles": "الملفات الشخصية للمستخدم المتاحة:", - "UserProfilesAddNewProfile": "إنشاء ملف الشخصي", - "UserProfilesDelete": "حذف", - "UserProfilesClose": "إغلاق", - "ProfileNameSelectionWatermark": "اختر اسم مستعار", - "ProfileImageSelectionTitle": "تحديد صورة الملف الشخصي", - "ProfileImageSelectionHeader": "اختر صورة الملف الشخصي", - "ProfileImageSelectionNote": "يمكنك استيراد صورة ملف شخصي مخصصة، أو تحديد صورة رمزية من البرامج الثابتة للنظام", - "ProfileImageSelectionImportImage": "استيراد ملف الصورة", - "ProfileImageSelectionSelectAvatar": "حدد الصورة الرمزية من البرنامج الثابتة", - "InputDialogTitle": "حوار الإدخال", - "InputDialogOk": "موافق", - "InputDialogCancel": "إلغاء", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "اختر اسم الملف الشخصي", - "InputDialogAddNewProfileHeader": "الرجاء إدخال اسم الملف الشخصي", - "InputDialogAddNewProfileSubtext": "(الطول الأقصى: {0})", - "AvatarChoose": "اختر الصورة الرمزية", - "AvatarSetBackgroundColor": "تعيين لون الخلفية", - "AvatarClose": "إغلاق", - "ControllerSettingsLoadProfileToolTip": "تحميل الملف الشخصي", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "إضافة ملف شخصي", - "ControllerSettingsRemoveProfileToolTip": "إزالة الملف الشخصي", - "ControllerSettingsSaveProfileToolTip": "حفظ الملف الشخصي", - "MenuBarFileToolsTakeScreenshot": "أخذ لقطة للشاشة", - "MenuBarFileToolsHideUi": "إخفاء واجهة المستخدم", - "GameListContextMenuRunApplication": "تشغيل التطبيق", - "GameListContextMenuToggleFavorite": "تعيين كمفضل", - "GameListContextMenuToggleFavoriteToolTip": "تبديل الحالة المفضلة للعبة", - "SettingsTabGeneralTheme": "السمة:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "داكن", - "SettingsTabGeneralThemeLight": "فاتح", - "ControllerSettingsConfigureGeneral": "ضبط", - "ControllerSettingsRumble": "الاهتزاز", - "ControllerSettingsRumbleStrongMultiplier": "مضاعف اهتزاز قوي", - "ControllerSettingsRumbleWeakMultiplier": "مضاعف اهتزاز ضعيف", - "DialogMessageSaveNotAvailableMessage": "لا توجد بيانات الحفظ لـ {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "هل ترغب في إنشاء بيانات الحفظ لهذه اللعبة؟", - "DialogConfirmationTitle": "ريوجينكس - تأكيد", - "DialogUpdaterTitle": "ريوجينكس - المحدث", - "DialogErrorTitle": "ريوجينكس - خطأ", - "DialogWarningTitle": "ريوجينكس - تحذير", - "DialogExitTitle": "ريوجينكس - الخروج", - "DialogErrorMessage": "واجه ريوجينكس خطأ", - "DialogExitMessage": "هل أنت متأكد من أنك تريد إغلاق ريوجينكس؟", - "DialogExitSubMessage": "سيتم فقدان كافة البيانات غير المحفوظة!", - "DialogMessageCreateSaveErrorMessage": "حدث خطأ أثناء إنشاء بيانات الحفظ المحددة: {0}", - "DialogMessageFindSaveErrorMessage": "حدث خطأ أثناء البحث عن بيانات الحفظ المحددة: {0}", - "FolderDialogExtractTitle": "اختر المجلد الذي تريد الاستخراج إليه", - "DialogNcaExtractionMessage": "استخراج قسم {0} من {1}...", - "DialogNcaExtractionTitle": "مستخرج قسم NCA", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "فشل الاستخراج. لم يكن NCA الرئيسي موجودا في الملف المحدد.", - "DialogNcaExtractionCheckLogErrorMessage": "فشل الاستخراج. اقرأ ملف التسجيل لمزيد من المعلومات.", - "DialogNcaExtractionSuccessMessage": "تم الاستخراج بنجاح.", - "DialogUpdaterConvertFailedMessage": "فشل تحويل إصدار ريوجينكس الحالي.", - "DialogUpdaterCancelUpdateMessage": "إلغاء التحديث", - "DialogUpdaterAlreadyOnLatestVersionMessage": "أنت تستخدم بالفعل أحدث إصدار من ريوجينكس!", - "DialogUpdaterFailedToGetVersionMessage": "حدث خطأ أثناء محاولة الحصول على معلومات الإصدار من إصدار غيت هاب. يمكن أن يحدث هذا إذا تم تجميع إصدار جديد بواسطة إجراءات غيت هاب. جرب مجددا بعد دقائق.", - "DialogUpdaterConvertFailedGithubMessage": "فشل تحويل إصدار ريوجينكس المستلم من إصدار غيت هاب.", - "DialogUpdaterDownloadingMessage": "جاري تنزيل التحديث...", - "DialogUpdaterExtractionMessage": "جاري استخراج التحديث...", - "DialogUpdaterRenamingMessage": "إعادة تسمية التحديث...", - "DialogUpdaterAddingFilesMessage": "إضافة تحديث جديد...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "اكتمل التحديث", - "DialogUpdaterRestartMessage": "هل تريد إعادة تشغيل ريوجينكس الآن؟", - "DialogUpdaterNoInternetMessage": "أنت غير متصل بالإنترنت.", - "DialogUpdaterNoInternetSubMessage": "يرجى التحقق من أن لديك اتصال إنترنت فعال!", - "DialogUpdaterDirtyBuildMessage": "لا يمكنك تحديث نسخة القذرة من ريوجينكس!", - "DialogUpdaterDirtyBuildSubMessage": "الرجاء تحميل ريوجينكس من https://ryujinx.app/download إذا كنت تبحث عن إصدار مدعوم.", - "DialogRestartRequiredMessage": "يتطلب إعادة التشغيل", - "DialogThemeRestartMessage": "تم حفظ السمة. إعادة التشغيل مطلوبة لتطبيق السمة.", - "DialogThemeRestartSubMessage": "هل تريد إعادة التشغيل", - "DialogFirmwareInstallEmbeddedMessage": "هل ترغب في تثبيت البرنامج الثابت المدمج في هذه اللعبة؟ (البرنامج الثابت {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "لم يتم العثور على أي برنامج ثابت مثبت ولكن ريوجينكس كان قادرا على تثبيت البرنامج الثابت {0} من اللعبة المقدمة.\nسيبدأ المحاكي الآن.", - "DialogFirmwareNoFirmwareInstalledMessage": "لا يوجد برنامج ثابت مثبت", - "DialogFirmwareInstalledMessage": "تم تثبيت البرنامج الثابت {0}", - "DialogInstallFileTypesSuccessMessage": "تم تثبيت أنواع الملفات بنجاح!", - "DialogInstallFileTypesErrorMessage": "فشل تثبيت أنواع الملفات.", - "DialogUninstallFileTypesSuccessMessage": "تم إلغاء تثبيت أنواع الملفات بنجاح!", - "DialogUninstallFileTypesErrorMessage": "فشل إلغاء تثبيت أنواع الملفات.", - "DialogOpenSettingsWindowLabel": "فتح نافذة الإعدادات", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "تطبيق وحدة التحكم المصغر", - "DialogMessageDialogErrorExceptionMessage": "خطأ في عرض مربع حوار الرسالة: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "خطأ في عرض لوحة مفاتيح البرامج: {0}", - "DialogErrorAppletErrorExceptionMessage": "خطأ في عرض مربع حوار خطأ التطبيق المصغر: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "لمزيد من المعلومات حول كيفية إصلاح هذا الخطأ، اتبع دليل الإعداد الخاص بنا.", - "DialogUserErrorDialogTitle": "خطأ ريوجينكس ({0})", - "DialogAmiiboApiTitle": "أميبو API", - "DialogAmiiboApiFailFetchMessage": "حدث خطأ أثناء جلب المعلومات من API.", - "DialogAmiiboApiConnectErrorMessage": "غير قادر على الاتصال بخادم API أميبو. قد تكون الخدمة معطلة أو قد تحتاج إلى التحقق من اتصالك بالإنترنت.", - "DialogProfileInvalidProfileErrorMessage": "الملف الشخصي {0} غير متوافق مع نظام تكوين الإدخال الحالي.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "لا يمكن الكتابة فوق الملف الشخصي الافتراضي", - "DialogProfileDeleteProfileTitle": "حذف الملف الشخصي", - "DialogProfileDeleteProfileMessage": "هذا الإجراء لا رجعة فيه، هل أنت متأكد من أنك تريد المتابعة؟", - "DialogWarning": "تحذير", - "DialogPPTCDeletionMessage": "أنت على وشك الإنتظار لإعادة بناء ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) عند الإقلاع التالي لـ:\n\n{0}\n\nأمتأكد من رغبتك في المتابعة؟", - "DialogPPTCDeletionErrorMessage": "خطأ خلال تنظيف ذاكرة التخزين المؤقت للترجمة المستمرة (PPTC) في {0}: {1}", - "DialogShaderDeletionMessage": "أنت على وشك حذف ذاكرة المظللات المؤقتة ل:\n\n{0}\n\nهل انت متأكد انك تريد المتابعة؟", - "DialogShaderDeletionErrorMessage": "حدث خطأ أثناء تنظيف ذاكرة المظللات المؤقتة في {0}: {1}", - "DialogRyujinxErrorMessage": "واجه ريوجينكس خطأ", - "DialogInvalidTitleIdErrorMessage": "خطأ في واجهة المستخدم: اللعبة المحددة لم يكن لديها معرف عنوان صالح", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "لم يتم العثور على برنامج ثابت للنظام صالح في {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "تثبيت البرنامج الثابت {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "سيتم تثبيت إصدار النظام {0}.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nهذا سيحل محل إصدار النظام الحالي {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\nهل تريد المتابعة؟", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "تثبيت البرنامج الثابت...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "تم تثبيت إصدار النظام {0} بنجاح.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "لن تكون هناك ملفات الشخصية أخرى لفتحها إذا تم حذف الملف الشخصي المحدد", - "DialogUserProfileDeletionConfirmMessage": "هل تريد حذف الملف الشخصي المحدد", - "DialogUserProfileUnsavedChangesTitle": "تحذير - التغييرات غير محفوظة", - "DialogUserProfileUnsavedChangesMessage": "لقد قمت بإجراء تغييرات على الملف الشخصي لهذا المستخدم هذا ولم يتم حفظها.", - "DialogUserProfileUnsavedChangesSubMessage": "هل تريد تجاهل التغييرات؟", - "DialogControllerSettingsModifiedConfirmMessage": "تم تحديث إعدادات وحدة التحكم الحالية.", - "DialogControllerSettingsModifiedConfirmSubMessage": "هل تريد الحفظ ؟", - "DialogLoadFileErrorMessage": "{0}. ملف خاطئ: {1}", - "DialogModAlreadyExistsMessage": "التعديل موجود بالفعل", - "DialogModInvalidMessage": "المجلد المحدد لا يحتوي على تعديل!", - "DialogModDeleteNoParentMessage": "فشل الحذف: لم يمكن العثور على المجلد الرئيسي للتعديل\"{0}\"!", - "DialogDlcNoDlcErrorMessage": "الملف المحدد لا يحتوي على محتوى إضافي للعنوان المحدد!", - "DialogPerformanceCheckLoggingEnabledMessage": "لقد تم تمكين تسجيل التتبع، والذي تم تصميمه ليتم استخدامه من قبل المطورين فقط.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "للحصول على الأداء الأمثل، يوصى بتعطيل تسجيل التتبع. هل ترغب في تعطيل تسجيل التتبع الآن؟", - "DialogPerformanceCheckShaderDumpEnabledMessage": "لقد قمت بتمكين تفريغ المظللات، والذي تم تصميمه ليستخدمه المطورون فقط.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "للحصول على الأداء الأمثل، يوصى بتعطيل تفريغ المظللات. هل ترغب في تعطيل تفريغ المظللات الآن؟", - "DialogLoadAppGameAlreadyLoadedMessage": "تم تحميل لعبة بالفعل", - "DialogLoadAppGameAlreadyLoadedSubMessage": "الرجاء إيقاف المحاكاة أو إغلاق المحاكي قبل بدء لعبة أخرى.", - "DialogUpdateAddUpdateErrorMessage": "الملف المحدد لا يحتوي على تحديث للعنوان المحدد!", - "DialogSettingsBackendThreadingWarningTitle": "تحذير - خلفية متعددة المسارات", - "DialogSettingsBackendThreadingWarningMessage": "يجب إعادة تشغيل ريوجينكس بعد تغيير هذا الخيار حتى يتم تطبيقه بالكامل. اعتمادا على النظام الأساسي الخاص بك، قد تحتاج إلى تعطيل تعدد المسارات الخاص ببرنامج الرسومات التشغيل الخاص بك يدويًا عند استخدام الخاص بريوجينكس.", - "DialogModManagerDeletionWarningMessage": "أنت على وشك حذف التعديل: {0}\n\nهل انت متأكد انك تريد المتابعة؟", - "DialogModManagerDeletionAllWarningMessage": "أنت على وشك حذف كافة التعديلات لهذا العنوان.\n\nهل انت متأكد انك تريد المتابعة؟", - "SettingsTabGraphicsFeaturesOptions": "المميزات", - "SettingsTabGraphicsBackendMultithreading": "تعدد المسارات لخلفية الرسومات:", - "CommonAuto": "تلقائي", - "CommonOff": "معطل", - "CommonOn": "تشغيل", - "InputDialogYes": "نعم", - "InputDialogNo": "لا", - "DialogProfileInvalidProfileNameErrorMessage": "يحتوي اسم الملف على أحرف غير صالحة. يرجى المحاولة مرة أخرى.", - "MenuBarOptionsPauseEmulation": "إيقاف مؤقت", - "MenuBarOptionsResumeEmulation": "استئناف", - "AboutUrlTooltipMessage": "انقر لفتح موقع ريوجينكس في متصفحك الافتراضي.", - "AboutDisclaimerMessage": "ريوجينكس لا ينتمي إلى نينتندو™،\nأو أي من شركائها بأي شكل من الأشكال.", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) يتم \nاستخدامه في محاكاة أمبيو لدينا.", - "AboutPatreonUrlTooltipMessage": "انقر لفتح صفحة ريوجينكس في باتريون في متصفحك الافتراضي.", - "AboutGithubUrlTooltipMessage": "انقر لفتح صفحة ريوجينكس في غيت هاب في متصفحك الافتراضي.", - "AboutDiscordUrlTooltipMessage": "انقر لفتح دعوة إلى خادم ريوجينكس في ديكسورد في متصفحك الافتراضي.", - "AboutTwitterUrlTooltipMessage": "انقر لفتح صفحة ريوجينكس في تويتر في متصفحك الافتراضي.", - "AboutRyujinxAboutTitle": "حول:", - "AboutRyujinxAboutContent": "ريوجينكس هو محاكي لجهاز نينتندو سويتش™.\nمن فضلك ادعمنا على باتريون.\nاحصل على آخر الأخبار على تويتر أو ديسكورد.\nيمكن للمطورين المهتمين بالمساهمة معرفة المزيد على غيت هاب أو ديسكورد.", - "AboutRyujinxMaintainersTitle": "تتم صيانته بواسطة:", - "AboutRyujinxMaintainersContentTooltipMessage": "انقر لفتح صفحة المساهمين في متصفحك الافتراضي.", - "AboutRyujinxSupprtersTitle": "مدعوم على باتريون بواسطة:", - "AmiiboSeriesLabel": "مجموعة أميبو", - "AmiiboCharacterLabel": "شخصية", - "AmiiboScanButtonLabel": "فحصه", - "AmiiboOptionsShowAllLabel": "إظهار كل أميبو", - "AmiiboOptionsUsRandomTagLabel": "هاك: استخدم علامة Uuid عشوائية ", - "DlcManagerTableHeadingEnabledLabel": "مفعل", - "DlcManagerTableHeadingTitleIdLabel": "معرف العنوان", - "DlcManagerTableHeadingContainerPathLabel": "مسار الحاوية", - "DlcManagerTableHeadingFullPathLabel": "المسار كاملا", - "DlcManagerRemoveAllButton": "حذف الكل", - "DlcManagerEnableAllButton": "تشغيل الكل", - "DlcManagerDisableAllButton": "تعطيل الكل", - "ModManagerDeleteAllButton": "حذف الكل", - "MenuBarOptionsChangeLanguage": "تغيير اللغة", - "MenuBarShowFileTypes": "إظهار أنواع الملفات", - "CommonSort": "فرز", - "CommonShowNames": "عرض الأسماء", - "CommonFavorite": "المفضلة", - "OrderAscending": "تصاعدي", - "OrderDescending": "تنازلي", - "SettingsTabGraphicsFeatures": "الميزات والتحسينات", - "ErrorWindowTitle": "نافذة الخطأ", - "ToggleDiscordTooltip": "اختر ما إذا كنت تريد عرض ريوجينكس في نشاط ديسكورد \"يتم تشغيله حاليا\" أم لا", - "AddGameDirBoxTooltip": "أدخل مجلد اللعبة لإضافته إلى القائمة", - "AddGameDirTooltip": "إضافة مجلد اللعبة إلى القائمة", - "RemoveGameDirTooltip": "إزالة مجلد اللعبة المحدد", - "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list", - "AddAutoloadDirTooltip": "Add an autoload directory to the list", - "RemoveAutoloadDirTooltip": "Remove selected autoload directory", - "CustomThemeCheckTooltip": "استخدم سمة أفالونيا المخصصة لواجهة المستخدم الرسومية لتغيير مظهر قوائم المحاكي", - "CustomThemePathTooltip": "مسار سمة واجهة المستخدم المخصصة", - "CustomThemeBrowseTooltip": "تصفح للحصول على سمة واجهة المستخدم المخصصة", - "DockModeToggleTooltip": "يجعل وضع تركيب بالمنصة النظام الذي تمت محاكاته بمثابة جهاز نينتندو سويتش الذي تم تركيبه بالمنصة. يؤدي هذا إلى تحسين الدقة الرسومية في معظم الألعاب. على العكس من ذلك، سيؤدي تعطيل هذا إلى جعل النظام الذي تمت محاكاته يعمل كجهاز نينتندو سويتش محمول، مما يقلل من جودة الرسومات.\n\nقم بتكوين عناصر تحكم اللاعب 1 إذا كنت تخطط لاستخدام وضع تركيب بالمنصة؛ قم بتكوين عناصر التحكم المحمولة إذا كنت تخطط لاستخدام الوضع المحمول.\n\nاتركه مشغل إذا لم تكن متأكدا.", - "DirectKeyboardTooltip": "دعم الوصول المباشر للوحة المفاتيح (HID). يوفر وصول الألعاب إلى لوحة المفاتيح الخاصة بك كجهاز لإدخال النص.\n\nيعمل فقط مع الألعاب التي تدعم استخدام لوحة المفاتيح في الأصل على أجهزة سويتش.\n\nاتركه معطلا إذا كنت غير متأكد.", - "DirectMouseTooltip": "دعم الوصول المباشر للوحة المفاتيح (HID). يوفر وصول الألعاب إلى لوحة المفاتيح الخاصة بك كجهاز لإدخال النص.\n\nيعمل فقط مع الألعاب التي تدعم استخدام لوحة المفاتيح في الأصل على أجهزة سويتش.\n\nاتركه معطلا إذا كنت غير متأكد.", - "RegionTooltip": "تغيير منطقة النظام", - "LanguageTooltip": "تغيير لغة النظام", - "TimezoneTooltip": "تغيير النطاق الزمني للنظام", - "TimeTooltip": "تغيير وقت النظام", - "VSyncToggleTooltip": "محاكاة المزامنة العمودية للجهاز. في الأساس محدد الإطار لغالبية الألعاب؛ قد يؤدي تعطيله إلى تشغيل الألعاب بسرعة أعلى أو جعل شاشات التحميل تستغرق وقتا أطول أو تتعطل.\n\nيمكن تبديله داخل اللعبة باستخدام مفتاح التشغيل السريع الذي تفضله (F1 افتراضيا). نوصي بالقيام بذلك إذا كنت تخطط لتعطيله.\n\nاتركه ممكنا إذا لم تكن متأكدا.", - "PptcToggleTooltip": "يحفظ وظائف JIT المترجمة بحيث لا تحتاج إلى ترجمتها في كل مرة يتم فيها تحميل اللعبة.\n\nيقلل من التقطيع ويسرع بشكل ملحوظ أوقات التشغيل بعد التشغيل الأول للعبة.\n\nاتركه ممكنا إذا لم تكن متأكدا.", - "LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", - "FsIntegrityToggleTooltip": "يتحقق من وجود ملفات تالفة عند تشغيل لعبة ما، وإذا تم اكتشاف ملفات تالفة، فسيتم عرض خطأ تجزئة في السجل.\n\nليس له أي تأثير على الأداء ويهدف إلى المساعدة في استكشاف الأخطاء وإصلاحها.\n\nاتركه مفعلا إذا كنت غير متأكد.", - "AudioBackendTooltip": "يغير الواجهة الخلفية المستخدمة لتقديم الصوت.\n\nSDL2 هو الخيار المفضل، بينما يتم استخدام OpenAL وSoundIO كبديلين. زائف لن يكون لها صوت.\n\nاضبط على SDL2 إذا لم تكن متأكدا.", - "MemoryManagerTooltip": "تغيير كيفية تعيين ذاكرة الضيف والوصول إليها. يؤثر بشكل كبير على أداء وحدة المعالجة المركزية التي تمت محاكاتها.\n\nاضبط على المضيف غير محدد إذا لم تكن متأكدا.", - "MemoryManagerSoftwareTooltip": "استخدام جدول الصفحات البرمجي لترجمة العناوين. أعلى دقة ولكن أبطأ أداء.", - "MemoryManagerHostTooltip": "تعيين الذاكرة مباشرة في مساحة عنوان المضيف. تجميع وتنفيذ JIT أسرع بكثير.", - "MemoryManagerUnsafeTooltip": "تعيين الذاكرة مباشرة، ولكن لا تخفي العنوان داخل مساحة عنوان الضيف قبل الوصول. أسرع، ولكن على حساب السلامة. يمكن لتطبيق الضيف الوصول إلى الذاكرة من أي مكان في ريوجينكس، لذا قم بتشغيل البرامج التي تثق بها فقط مع هذا الوضع.", - "UseHypervisorTooltip": "استخدم هايبرڤايزور بدلا من JIT. يعمل على تحسين الأداء بشكل كبير عند توفره، ولكنه قد يكون غير مستقر في حالته الحالية.", - "DRamTooltip": "يستخدم تخطيط وضع الذاكرة البديل لتقليد نموذج سويتش المطورين.\n\nيعد هذا مفيدا فقط لحزم النسيج عالية الدقة أو تعديلات دقة 4K. لا يحسن الأداء.\n\nاتركه معطلا إذا لم تكن متأكدا.", - "IgnoreMissingServicesTooltip": "يتجاهل خدمات نظام هوريزون غير المنفذة. قد يساعد هذا في تجاوز الأعطال عند تشغيل ألعاب معينة.\n\nاتركه معطلا إذا كنت غير متأكد.", - "IgnoreAppletTooltip": "لن يظهر مربع الحوار الخارجي \"تطبيق وحدة التحكم\" إذا تم فصل لوحة الألعاب أثناء اللعب. ولن تظهر مطالبة بإغلاق مربع الحوار أو إعداد وحدة تحكم جديدة. وبمجرد إعادة توصيل وحدة التحكم التي تم فصلها سابقًا، ستستأنف اللعبة تلقائيًا.", - "GraphicsBackendThreadingTooltip": "ينفذ أوامر الواجهة الخلفية للرسومات على مسار ثاني.\n\nيعمل على تسريع عملية تجميع المظللات وتقليل التقطيع وتحسين الأداء على برامج تشغيل وحدة الرسوميات دون دعم المسارات المتعددة الخاصة بهم. أداء أفضل قليلا على برامج التشغيل ذات المسارات المتعددة.\n\nاضبط على تلقائي إذا لم تكن متأكدا.", - "GalThreadingTooltip": "ينفذ أوامر الواجهة الخلفية للرسومات على مسار ثاني.\n\nيعمل على تسريع عملية تجميع المظللات وتقليل التقطيع وتحسين الأداء على برامج تشغيل وحدة الرسوميات دون دعم المسارات المتعددة الخاصة بهم. أداء أفضل قليلا على برامج التشغيل ذات المسارات المتعددة.\n\nاضبط على تلقائي إذا لم تكن متأكدا.", - "ShaderCacheToggleTooltip": "يحفظ ذاكرة المظللات المؤقتة على القرص مما يقلل من التقطيع في عمليات التشغيل اللاحقة.\n\nاتركه مفعلا إذا لم تكن متأكدا.", - "ResolutionScaleTooltip": "يضاعف دقة عرض اللعبة.\n\nقد لا تعمل بعض الألعاب مع هذا وتبدو منقطة حتى عند زيادة الدقة؛ بالنسبة لهذه الألعاب، قد تحتاج إلى العثور على تعديلات تزيل تنعيم الحواف أو تزيد من دقة العرض الداخلي. لاستخدام الأخير، من المحتمل أن ترغب في تحديد أصلي.\n\nيمكن تغيير هذا الخيار أثناء تشغيل اللعبة بالنقر فوق \"تطبيق\" أدناه؛ يمكنك ببساطة تحريك نافذة الإعدادات جانبًا والتجربة حتى تجد المظهر المفضل للعبة.\n\nضع في اعتبارك أن 4x مبالغة في أي إعداد تقريبًا.", - "ResolutionScaleEntryTooltip": "مقياس دقة النقطة العائمة، مثل 1.5. من المرجح أن تتسبب المقاييس غير المتكاملة في حدوث مشكلات أو تعطل.", - "AnisotropyTooltip": "مستوى تصفية. اضبط على تلقائي لاستخدام القيمة التي تطلبها اللعبة.", - "AspectRatioTooltip": "يتم تطبيق نسبة العرض إلى الارتفاع على نافذة العارض.\n\nقم بتغيير هذا فقط إذا كنت تستخدم تعديل نسبة العرض إلى الارتفاع للعبتك، وإلا سيتم تمديد الرسومات.\n\nاتركه16:9 إذا لم تكن متأكدا.", - "ShaderDumpPathTooltip": "مسار تفريغ المظللات", - "FileLogTooltip": "حفظ تسجيل وحدة التحكم إلى ملف سجل على القرص. لا يؤثر على الأداء.", - "StubLogTooltip": "طباعة رسائل سجل stub في وحدة التحكم. لا يؤثر على الأداء.", - "InfoLogTooltip": "طباعة رسائل سجل المعلومات في وحدة التحكم. لا يؤثر على الأداء.", - "WarnLogTooltip": "طباعة رسائل سجل التحذير في وحدة التحكم. لا يؤثر على الأداء.", - "ErrorLogTooltip": "طباعة رسائل سجل الأخطاء في وحدة التحكم. لا يؤثر على الأداء.", - "TraceLogTooltip": "طباعة رسائل سجل التتبع في وحدة التحكم. لا يؤثر على الأداء.", - "GuestLogTooltip": "طباعة رسائل سجل الضيف في وحدة التحكم. لا يؤثر على الأداء.", - "FileAccessLogTooltip": "طباعة رسائل سجل الوصول إلى الملفات في وحدة التحكم.", - "FSAccessLogModeTooltip": "تمكين إخراج سجل الوصول إلى نظام الملفات إلى وحدة التحكم. الأوضاع الممكنة هي 0-3", - "DeveloperOptionTooltip": "استخدمه بعناية", - "OpenGlLogLevel": "يتطلب تمكين مستويات السجل المناسبة", - "DebugLogTooltip": "طباعة رسائل سجل التصحيح في وحدة التحكم.\n\nاستخدم هذا فقط إذا طلب منك أحد الموظفين تحديدًا ذلك، لأنه سيجعل من الصعب قراءة السجلات وسيؤدي إلى تدهور أداء المحاكي.", - "LoadApplicationFileTooltip": "افتح مستكشف الملفات لاختيار ملف متوافق مع سويتش لتحميله", - "LoadApplicationFolderTooltip": "افتح مستكشف الملفات لاختيار تطبيق متوافق مع سويتش للتحميل", - "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from", - "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from", - "OpenRyujinxFolderTooltip": "فتح مجلد نظام ملفات ريوجينكس", - "OpenRyujinxLogsTooltip": "يفتح المجلد الذي تتم كتابة السجلات إليه", - "ExitTooltip": "الخروج من ريوجينكس", - "OpenSettingsTooltip": "فتح نافذة الإعدادات", - "OpenProfileManagerTooltip": "فتح نافذة إدارة الملفات الشخصية للمستخدمين", - "StopEmulationTooltip": "إيقاف محاكاة اللعبة الحالية والعودة إلى اختيار اللعبة", - "CheckUpdatesTooltip": "التحقق من وجود تحديثات لريوجينكس", - "OpenAboutTooltip": "فتح حول النافذة", - "GridSize": "حجم الشبكة", - "GridSizeTooltip": "تغيير حجم عناصر الشبكة", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "البرتغالية البرازيلية", - "AboutRyujinxContributorsButtonHeader": "رؤية جميع المساهمين", - "SettingsTabSystemAudioVolume": "مستوى الصوت:", - "AudioVolumeTooltip": "تغيير مستوى الصوت", - "SettingsTabSystemEnableInternetAccess": "الوصول إلى إنترنت كضيف/وضع LAN", - "EnableInternetAccessTooltip": "للسماح للتطبيق الذي تمت محاكاته بالاتصال بالإنترنت.\n\nيمكن للألعاب التي تحتوي على وضع LAN الاتصال ببعضها البعض عند تمكين ذلك وتوصيل الأنظمة بنفس نقطة الوصول. وهذا يشمل الأجهزة الحقيقية أيضا.\n\nلا يسمح بالاتصال بخوادم نينتندو. قد يتسبب في حدوث عطل في بعض الألعاب التي تحاول الاتصال بالإنترنت.\n\nاتركه معطلا إذا لم تكن متأكدا.", - "GameListContextMenuManageCheatToolTip": "إدارة الغش", - "GameListContextMenuManageCheat": "إدارة الغش", - "GameListContextMenuManageModToolTip": "إدارة التعديلات", - "GameListContextMenuManageMod": "إدارة التعديلات", - "ControllerSettingsStickRange": "نطاق:", - "DialogStopEmulationTitle": "ريوجينكس - إيقاف المحاكاة", - "DialogStopEmulationMessage": "هل أنت متأكد أنك تريد إيقاف المحاكاة؟", - "SettingsTabCpu": "المعالج", - "SettingsTabAudio": "الصوت", - "SettingsTabNetwork": "الشبكة", - "SettingsTabNetworkConnection": "اتصال الشبكة", - "SettingsTabCpuCache": "ذاكرة المعالج المؤقت", - "SettingsTabCpuMemory": "وضع المعالج", - "DialogUpdaterFlatpakNotSupportedMessage": "الرجاء تحديث ريوجينكس عبر فلات هاب.", - "UpdaterDisabledWarningTitle": "المحدث معطل!", - "ControllerSettingsRotate90": "تدوير 90 درجة في اتجاه عقارب الساعة", - "IconSize": "حجم الأيقونة", - "IconSizeTooltip": "تغيير حجم أيقونات اللعبة", - "MenuBarOptionsShowConsole": "عرض وحدة التحكم", - "ShaderCachePurgeError": "حدث خطأ أثناء تنظيف ذاكرة المظللات المؤقتة في {0}: {1}", - "UserErrorNoKeys": "المفاتيح غير موجودة", - "UserErrorNoFirmware": "لم يتم العثور على البرنامج الثابت", - "UserErrorFirmwareParsingFailed": "خطأ في تحليل البرنامج الثابت", - "UserErrorApplicationNotFound": "التطبيق غير موجود", - "UserErrorUnknown": "خطأ غير معروف", - "UserErrorUndefined": "خطأ غير محدد", - "UserErrorNoKeysDescription": "لم يتمكن ريوجينكس من العثور على ملف 'prod.keys' الخاص بك", - "UserErrorNoFirmwareDescription": "لم يتمكن ريوجينكس من العثور على أية برامج ثابتة مثبتة", - "UserErrorFirmwareParsingFailedDescription": "لم يتمكن ريوجينكس من تحليل البرامج الثابتة المتوفرة. يحدث هذا عادة بسبب المفاتيح القديمة.", - "UserErrorApplicationNotFoundDescription": "تعذر على ريوجينكس العثور على تطبيق صالح في المسار المحدد.", - "UserErrorUnknownDescription": "حدث خطأ غير معروف!", - "UserErrorUndefinedDescription": "حدث خطأ غير محدد! لا ينبغي أن يحدث هذا، يرجى الاتصال بمطور!", - "OpenSetupGuideMessage": "فتح دليل الإعداد", - "NoUpdate": "لا يوجد تحديث", - "TitleUpdateVersionLabel": "الإصدار: {0}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "ريوجينكس - معلومات", - "RyujinxConfirm": "ريوجينكس - تأكيد", - "FileDialogAllTypes": "كل الأنواع", - "Never": "مطلقا", - "SwkbdMinCharacters": "يجب أن يبلغ طوله {0} حرفا على الأقل", - "SwkbdMinRangeCharacters": "يجب أن يتكون من {0}-{1} حرفا", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "لوحة المفاتيح البرمجية", - "SoftwareKeyboardModeNumeric": "يجب أن يكون 0-9 أو '.' فقط", - "SoftwareKeyboardModeAlphabet": "يجب أن تكون الأحرف غير CJK فقط", - "SoftwareKeyboardModeASCII": "يجب أن يكون نص ASCII فقط", - "ControllerAppletControllers": "وحدات التحكم المدعومة:", - "ControllerAppletPlayers": "اللاعبين:", - "ControllerAppletDescription": "الإعدادات الحالية غير صالحة. افتح الإعدادات وأعد تكوين المدخلات الخاصة بك.", - "ControllerAppletDocked": "تم ضبط وضع تركيب بالمنصة. يجب تعطيل التحكم المحمول.", - "UpdaterRenaming": "إعادة تسمية الملفات القديمة...", - "UpdaterRenameFailed": "المحدث غير قادر على إعادة تسمية الملف: {0}", - "UpdaterAddingFiles": "إضافة ملفات جديدة...", - "UpdaterExtracting": "استخراج التحديث...", - "UpdaterDownloading": "تحميل التحديث...", - "Docked": "تركيب بالمنصة", - "Handheld": "محمول", - "ConnectionError": "خطأ في الاتصال", - "AboutPageDeveloperListMore": "{0} والمزيد...", - "ApiError": "خطأ في API.", - "LoadingHeading": "جاري تحميل {0}", - "CompilingPPTC": "تجميع الـ‫(PPTC)", - "CompilingShaders": "تجميع المظللات", - "AllKeyboards": "كل لوحات المفاتيح", - "OpenFileDialogTitle": "حدد ملف مدعوم لفتحه", - "OpenFolderDialogTitle": "حدد مجلدا يحتوي على لعبة غير مضغوطة", - "AllSupportedFormats": "كل التنسيقات المدعومة", - "RyujinxUpdater": "محدث ريوجينكس", - "SettingsTabHotkeys": "مفاتيح الاختصار في لوحة المفاتيح", - "SettingsTabHotkeysHotkeys": "مفاتيح الاختصار في لوحة المفاتيح", - "SettingsTabHotkeysToggleVsyncHotkey": "تبديل المزامنة العمودية:", - "SettingsTabHotkeysScreenshotHotkey": "لقطة الشاشة:", - "SettingsTabHotkeysShowUiHotkey": "عرض واجهة المستخدم:", - "SettingsTabHotkeysPauseHotkey": "إيقاف مؤقت:", - "SettingsTabHotkeysToggleMuteHotkey": "كتم:", - "ControllerMotionTitle": "إعدادات التحكم بالحركة", - "ControllerRumbleTitle": "إعدادات الهزاز", - "SettingsSelectThemeFileDialogTitle": "حدد ملف السمة", - "SettingsXamlThemeFile": "ملف سمة Xaml", - "AvatarWindowTitle": "إدارة الحسابات - الصورة الرمزية", - "Amiibo": "أميبو", - "Unknown": "غير معروف", - "Usage": "الاستخدام", - "Writable": "قابل للكتابة", - "SelectDlcDialogTitle": "حدد ملفات المحتوي الإضافي", - "SelectUpdateDialogTitle": "حدد ملفات التحديث", - "SelectModDialogTitle": "حدد مجلد التعديل", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "مدير الملفات الشخصية للمستخدمين", - "CheatWindowTitle": "مدير الغش", - "DlcWindowTitle": "إدارة المحتوى القابل للتنزيل لـ {0} ({1})", - "ModWindowTitle": "إدارة التعديلات لـ {0} ({1})", - "UpdateWindowTitle": "مدير تحديث العنوان", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} new update(s) added", - "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.", - "CheatWindowHeading": "الغش متوفر لـ {0} [{1}]", - "BuildId": "معرف البناء:", - "DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.", - "DlcWindowHeading": "المحتويات القابلة للتنزيل {0}", - "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} new update(s) added", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "{0} تعديل", - "UserProfilesEditProfile": "تعديل المحدد", - "Continue": "Continue", - "Cancel": "إلغاء", - "Save": "حفظ", - "Discard": "تجاهل", - "Paused": "متوقف مؤقتا", - "UserProfilesSetProfileImage": "تعيين صورة الملف الشخصي", - "UserProfileEmptyNameError": "الاسم مطلوب", - "UserProfileNoImageError": "يجب تعيين صورة الملف الشخصي", - "GameUpdateWindowHeading": "إدارة التحديثات لـ {0} ({1})", - "SettingsTabHotkeysResScaleUpHotkey": "زيادة الدقة:", - "SettingsTabHotkeysResScaleDownHotkey": "خفض الدقة:", - "UserProfilesName": "الاسم:", - "UserProfilesUserId": "معرف المستخدم:", - "SettingsTabGraphicsBackend": "خلفية الرسومات", - "SettingsTabGraphicsBackendTooltip": "حدد الواجهة الخلفية للرسومات التي سيتم استخدامها في المحاكي.\n\nيعد برنامج فولكان أفضل بشكل عام لجميع بطاقات الرسومات الحديثة، طالما أن برامج التشغيل الخاصة بها محدثة. يتميز فولكان أيضا بتجميع مظللات أسرع (أقل تقطيعا) على جميع بائعي وحدات معالجة الرسومات.\n\nقد يحقق أوبن جي أل نتائج أفضل على وحدات معالجة الرسومات إنفيديا القديمة، أو على وحدات معالجة الرسومات إي إم دي القديمة على لينكس، أو على وحدات معالجة الرسومات ذات ذاكرة الوصول العشوائي للفيديوالأقل، على الرغم من أن تعثرات تجميع المظللات ستكون أكبر.\n\nاضبط على فولكان إذا لم تكن متأكدا. اضبط على أوبن جي أل إذا كانت وحدة معالجة الرسومات الخاصة بك لا تدعم فولكان حتى مع أحدث برامج تشغيل الرسومات.", - "SettingsEnableTextureRecompression": "تمكين إعادة ضغط التكستر", - "SettingsEnableTextureRecompressionTooltip": "يضغط تكستر ASTC من أجل تقليل استخدام ذاكرة الوصول العشوائي للفيديو.\n\nتتضمن الألعاب التي تستخدم تنسيق النسيج هذا Astral Chain وBayonetta 3 وFire Emblem Engage وMetroid Prime Remastered وSuper Mario Bros. Wonder وThe Legend of Zelda: Tears of the Kingdom.\n\nمن المحتمل أن تتعطل بطاقات الرسومات التي تحتوي على 4 جيجا بايت من ذاكرة الوصول العشوائي للفيديو أو أقل في مرحلة ما أثناء تشغيل هذه الألعاب.\n\nقم بالتمكين فقط في حالة نفاد ذاكرة الوصول العشوائي للفيديو في الألعاب المذكورة أعلاه. اتركه معطلا إذا لم تكن متأكدا.", - "SettingsTabGraphicsPreferredGpu": "وحدة معالجة الرسوميات المفضلة", - "SettingsTabGraphicsPreferredGpuTooltip": "حدد بطاقة الرسومات التي سيتم استخدامها مع الواجهة الخلفية لرسومات فولكان.\n\nلا يؤثر على وحدة معالجة الرسومات التي سيستخدمها أوبن جي أل.\n\nاضبط على وحدة معالجة الرسومات التي تم وضع علامة عليها كـ \"dGPU\" إذا لم تكن متأكدًا. إذا لم يكن هناك واحد، اتركه.", - "SettingsAppRequiredRestartMessage": "مطلوب إعادة تشغيل ريوجينكس", - "SettingsGpuBackendRestartMessage": "تم تعديل إعدادات الواجهة الخلفية للرسومات أو وحدة معالجة الرسومات. سيتطلب هذا إعادة التشغيل ليتم تطبيقه", - "SettingsGpuBackendRestartSubMessage": "\n\nهل تريد إعادة التشغيل الآن؟", - "RyujinxUpdaterMessage": "هل تريد تحديث ريوجينكس إلى أحدث إصدار؟", - "SettingsTabHotkeysVolumeUpHotkey": "زيادة مستوى الصوت:", - "SettingsTabHotkeysVolumeDownHotkey": "خفض مستوى الصوت:", - "SettingsEnableMacroHLE": "تمكين Maro HLE", - "SettingsEnableMacroHLETooltip": "محاكاة عالية المستوى لكود مايكرو وحدة معالجة الرسوميات.\n\nيعمل على تحسين الأداء، ولكنه قد يسبب خللا رسوميا في بعض الألعاب.\n\nاتركه مفعلا إذا لم تكن متأكدا.", - "SettingsEnableColorSpacePassthrough": "عبور مساحة اللون", - "SettingsEnableColorSpacePassthroughTooltip": "يوجه واجهة فولكان الخلفية لتمرير معلومات الألوان دون تحديد مساحة اللون. بالنسبة للمستخدمين الذين لديهم شاشات ذات نطاق واسع، قد يؤدي ذلك إلى الحصول على ألوان أكثر حيوية، على حساب صحة الألوان.", - "VolumeShort": "مستوى", - "UserProfilesManageSaves": "إدارة الحفظ", - "DeleteUserSave": "هل تريد حذف حفظ المستخدم لهذه اللعبة؟", - "IrreversibleActionNote": "هذا الإجراء لا يمكن التراجع عنه.", - "SaveManagerHeading": "إدارة الحفظ لـ {0} ({1})", - "SaveManagerTitle": "مدير الحفظ", - "Name": "الاسم", - "Size": "الحجم", - "Search": "بحث", - "UserProfilesRecoverLostAccounts": "استعادة الحسابات المفقودة", - "Recover": "استعادة", - "UserProfilesRecoverHeading": "تم العثور على حفظ للحسابات التالية", - "UserProfilesRecoverEmptyList": "لا توجد ملفات شخصية لاستردادها", - "GraphicsAATooltip": "يتم تطبيق تنعيم الحواف على عرض اللعبة.\n\nسوف يقوم FXAA بتعتيم معظم الصورة، بينما سيحاول SMAA العثور على حواف خشنة وتنعيمها.\n\nلا ينصح باستخدامه مع فلتر FSR لتكبير.\n\nيمكن تغيير هذا الخيار أثناء تشغيل اللعبة بالنقر فوق \"تطبيق\" أدناه؛ يمكنك ببساطة تحريك نافذة الإعدادات جانبا والتجربة حتى تجد المظهر المفضل للعبة.\n\nاتركه على لا شيء إذا لم تكن متأكدا.", - "GraphicsAALabel": "تنعيم الحواف:", - "GraphicsScalingFilterLabel": "فلتر التكبير:", - "GraphicsScalingFilterTooltip": "اختر فلتر التكبير الذي سيتم تطبيقه عند استخدام مقياس الدقة.\n\nيعمل Bilinear بشكل جيد مع الألعاب ثلاثية الأبعاد وهو خيار افتراضي آمن.\n\nيوصى باستخدام Nearest لألعاب البكسل الفنية.\n\nFSR 1.0 هو مجرد مرشح توضيحي، ولا ينصح باستخدامه مع FXAA أو SMAA.\n\nيمكن تغيير هذا الخيار أثناء تشغيل اللعبة بالنقر فوق \"تطبيق\" أدناه؛ يمكنك ببساطة تحريك نافذة الإعدادات جانبا والتجربة حتى تجد المظهر المفضل للعبة.\n\nاتركه على Bilinear إذا لم تكن متأكدا.", - "GraphicsScalingFilterBilinear": "Bilinear", - "GraphicsScalingFilterNearest": "Nearest", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "المستوى", - "GraphicsScalingFilterLevelTooltip": "اضبط مستوى وضوح FSR 1.0. الأعلى هو أكثر وضوحا.", - "SmaaLow": "SMAA منخفض", - "SmaaMedium": "SMAA متوسط", - "SmaaHigh": "SMAA عالي", - "SmaaUltra": "SMAA فائق", - "UserEditorTitle": "تعديل المستخدم", - "UserEditorTitleCreate": "إنشاء مستخدم", - "SettingsTabNetworkInterface": "واجهة الشبكة:", - "NetworkInterfaceTooltip": "واجهة الشبكة مستخدمة لميزات LAN/LDN.\n\nبالاشتراك مع VPN أو XLink Kai ولعبة تدعم LAN، يمكن استخدامها لتزييف اتصال الشبكة نفسها عبر الإنترنت.\n\nاتركه على الافتراضي إذا لم تكن متأكدا.", - "NetworkInterfaceDefault": "افتراضي", - "PackagingShaders": "تعبئة المظللات", - "AboutChangelogButton": "عرض سجل التغييرات على غيت هاب", - "AboutChangelogButtonTooltipMessage": "انقر لفتح سجل التغيير لهذا الإصدار في متصفحك الافتراضي.", - "SettingsTabNetworkMultiplayer": "لعب جماعي", - "MultiplayerMode": "الوضع:", - "MultiplayerModeTooltip": "تغيير وضع LDN متعدد اللاعبين.\n\nسوف يقوم LdnMitm بتعديل وظيفة اللعب المحلية/اللاسلكية المحلية في الألعاب لتعمل كما لو كانت شبكة LAN، مما يسمح باتصالات الشبكة المحلية نفسها مع محاكيات ريوجينكس الأخرى وأجهزة نينتندو سويتش المخترقة التي تم تثبيت وحدة ldn_mitm عليها.\n\nيتطلب وضع اللاعبين المتعددين أن يكون جميع اللاعبين على نفس إصدار اللعبة (على سبيل المثال، يتعذر على الإصدار 13.0.1 من سوبر سماش برذرز ألتميت الاتصال بالإصدار 13.0.0).\n\nاتركه معطلا إذا لم تكن متأكدا.", - "MultiplayerModeDisabled": "معطل", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/de_DE.json b/src/Ryujinx/Assets/Locales/de_DE.json deleted file mode 100644 index 76e8dfadd..000000000 --- a/src/Ryujinx/Assets/Locales/de_DE.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "Deutsch", - "MenuBarFileOpenApplet": "Öffne Anwendung", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Öffnet das Mii-Editor-Applet im Standalone-Modus", - "SettingsTabInputDirectMouseAccess": "Direkter Mauszugriff", - "SettingsTabSystemMemoryManagerMode": "Speichermanagermodus:", - "SettingsTabSystemMemoryManagerModeSoftware": "Software", - "SettingsTabSystemMemoryManagerModeHost": "Host (schnell)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Host ungeprüft (am schnellsten, unsicher)", - "SettingsTabSystemUseHypervisor": "Hypervisor verwenden", - "MenuBarFile": "_Datei", - "MenuBarFileOpenFromFile": "Datei _öffnen", - "MenuBarFileOpenFromFileError": "No applications found in selected file.", - "MenuBarFileOpenUnpacked": "_Entpacktes Spiel öffnen", - "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder", - "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder", - "MenuBarFileOpenEmuFolder": "Ryujinx-Ordner öffnen", - "MenuBarFileOpenLogsFolder": "Logs-Ordner öffnen", - "MenuBarFileExit": "_Beenden", - "MenuBarOptions": "_Optionen", - "MenuBarOptionsToggleFullscreen": "Vollbild", - "MenuBarOptionsStartGamesInFullscreen": "Spiele im Vollbildmodus starten", - "MenuBarOptionsStopEmulation": "Emulation beenden", - "MenuBarOptionsSettings": "_Einstellungen", - "MenuBarOptionsManageUserProfiles": "_Benutzerprofile verwalten", - "MenuBarActions": "_Aktionen", - "MenuBarOptionsSimulateWakeUpMessage": "Aufwachnachricht simulieren", - "MenuBarActionsScanAmiibo": "Amiibo scannen", - "MenuBarTools": "_Tools", - "MenuBarToolsInstallFirmware": "Firmware installieren", - "MenuBarFileToolsInstallFirmwareFromFile": "Firmware von einer XCI- oder einer ZIP-Datei installieren", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Firmware aus einem Verzeichnis installieren", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "Dateitypen verwalten", - "MenuBarToolsInstallFileTypes": "Dateitypen installieren", - "MenuBarToolsUninstallFileTypes": "Dateitypen deinstallieren", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_Ansicht", - "MenuBarViewWindow": "Fenstergröße", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Hilfe", - "MenuBarHelpCheckForUpdates": "Nach Updates suchen", - "MenuBarHelpAbout": "Über Ryujinx", - "MenuSearch": "Suchen...", - "GameListHeaderFavorite": "Favorit", - "GameListHeaderIcon": "Icon", - "GameListHeaderApplication": "Name", - "GameListHeaderDeveloper": "Entwickler", - "GameListHeaderVersion": "Version", - "GameListHeaderTimePlayed": "Spielzeit", - "GameListHeaderLastPlayed": "Zuletzt gespielt", - "GameListHeaderFileExtension": "Dateiformat", - "GameListHeaderFileSize": "Dateigröße", - "GameListHeaderPath": "Pfad", - "GameListContextMenuOpenUserSaveDirectory": "Spielstand-Verzeichnis öffnen", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Öffnet das Verzeichnis, welches den Benutzer-Spielstand beinhaltet", - "GameListContextMenuOpenDeviceSaveDirectory": "Benutzer-Geräte-Verzeichnis öffnen", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Öffnet das Verzeichnis, welches den Geräte-Spielstände beinhaltet", - "GameListContextMenuOpenBcatSaveDirectory": "Benutzer-BCAT-Vezeichnis öffnen", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Öffnet das Verzeichnis, welches den BCAT-Cache des Spiels beinhaltet", - "GameListContextMenuManageTitleUpdates": "Verwalte Spiel-Updates", - "GameListContextMenuManageTitleUpdatesToolTip": "Öffnet den Spiel-Update-Manager", - "GameListContextMenuManageDlc": "Verwalten von DLC", - "GameListContextMenuManageDlcToolTip": "Öffnet den DLC-Manager", - "GameListContextMenuCacheManagement": "Cache-Verwaltung", - "GameListContextMenuCacheManagementPurgePptc": "PPTC als ungültig markieren", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Markiert den PPTC als ungültig, sodass dieser beim nächsten Spielstart neu erstellt wird", - "GameListContextMenuCacheManagementPurgeShaderCache": "Shader Cache löschen", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Löscht den Shader-Cache der Anwendung", - "GameListContextMenuCacheManagementOpenPptcDirectory": "PPTC-Verzeichnis öffnen", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Öffnet das Verzeichnis, das den PPTC-Cache der Anwendung beinhaltet", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Shader-Cache-Verzeichnis öffnen", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Öffnet das Verzeichnis, das den Shader Cache der Anwendung beinhaltet", - "GameListContextMenuExtractData": "Daten extrahieren", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Extrahiert das ExeFS aus der aktuellen Anwendungskonfiguration (einschließlich Updates)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Extrahiert das RomFS aus der aktuellen Anwendungskonfiguration (einschließlich Updates)", - "GameListContextMenuExtractDataLogo": "Logo", - "GameListContextMenuExtractDataLogoToolTip": "Extrahiert das Logo aus der aktuellen Anwendungskonfiguration (einschließlich Updates)", - "GameListContextMenuCreateShortcut": "Erstelle Anwendungsverknüpfung", - "GameListContextMenuCreateShortcutToolTip": "Erstelle eine Desktop-Verknüpfung die die gewählte Anwendung startet", - "GameListContextMenuCreateShortcutToolTipMacOS": "Erstellen Sie eine Verknüpfung im MacOS-Programme-Ordner, die die ausgewählte Anwendung startet", - "GameListContextMenuOpenModsDirectory": "Mod-Verzeichnis öffnen", - "GameListContextMenuOpenModsDirectoryToolTip": "Öffnet das Verzeichnis, welches Mods für die Spiele beinhaltet", - "GameListContextMenuOpenSdModsDirectory": "Atmosphere-Mod-Verzeichnis öffnen", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Öffnet das alternative SD-Karten-Atmosphere-Verzeichnis, das die Mods der Anwendung enthält. Dieser Ordner ist nützlich für Mods, die für echte Hardware erstellt worden sind.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} Spiele geladen", - "StatusBarSystemVersion": "Systemversion: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Niedriges Limit für Speicherzuordnungen erkannt", - "LinuxVmMaxMapCountDialogTextPrimary": "Möchtest Du den Wert von vm.max_map_count auf {0} erhöhen", - "LinuxVmMaxMapCountDialogTextSecondary": "Einige Spiele könnten versuchen, mehr Speicherzuordnungen zu erstellen, als derzeit erlaubt. Ryujinx wird abstürzen, sobald dieses Limit überschritten wird.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Ja, bis zum nächsten Neustart", - "LinuxVmMaxMapCountDialogButtonPersistent": "Ja, permanent", - "LinuxVmMaxMapCountWarningTextPrimary": "Maximale Anzahl an Speicherzuordnungen ist niedriger als empfohlen.", - "LinuxVmMaxMapCountWarningTextSecondary": "Der aktuelle Wert von vm.max_map_count ({0}) ist kleiner als {1}. Einige Spiele könnten versuchen, mehr Speicherzuordnungen zu erstellen, als derzeit erlaubt. Ryujinx wird abstürzen, sobald dieses Limit überschritten wird.\n\nDu kannst das Limit entweder manuell erhöhen oder pkexec installieren, damit Ryujinx Dir dabei hilft.", - "Settings": "Einstellungen", - "SettingsTabGeneral": "Oberfläche", - "SettingsTabGeneralGeneral": "Allgemein", - "SettingsTabGeneralEnableDiscordRichPresence": "Aktiviere die Statusanzeige für Discord", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Beim Start nach Updates suchen", - "SettingsTabGeneralShowConfirmExitDialog": "Zeige den \"Beenden bestätigen\"-Dialog", - "SettingsTabGeneralRememberWindowState": "Fenstergröße/-position merken", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "Mauszeiger ausblenden", - "SettingsTabGeneralHideCursorNever": "Niemals", - "SettingsTabGeneralHideCursorOnIdle": "Mauszeiger bei Inaktivität ausblenden", - "SettingsTabGeneralHideCursorAlways": "Immer", - "SettingsTabGeneralGameDirectories": "Spielverzeichnisse", - "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "Hinzufügen", - "SettingsTabGeneralRemove": "Entfernen", - "SettingsTabSystem": "System", - "SettingsTabSystemCore": "Kern", - "SettingsTabSystemSystemRegion": "Systemregion:", - "SettingsTabSystemSystemRegionJapan": "Japan", - "SettingsTabSystemSystemRegionUSA": "USA", - "SettingsTabSystemSystemRegionEurope": "Europa", - "SettingsTabSystemSystemRegionAustralia": "Australien", - "SettingsTabSystemSystemRegionChina": "China", - "SettingsTabSystemSystemRegionKorea": "Korea", - "SettingsTabSystemSystemRegionTaiwan": "Taiwan", - "SettingsTabSystemSystemLanguage": "Systemsprache:", - "SettingsTabSystemSystemLanguageJapanese": "Japanisch", - "SettingsTabSystemSystemLanguageAmericanEnglish": "Amerikanisches Englisch", - "SettingsTabSystemSystemLanguageFrench": "Französisch", - "SettingsTabSystemSystemLanguageGerman": "Deutsch", - "SettingsTabSystemSystemLanguageItalian": "Italienisch", - "SettingsTabSystemSystemLanguageSpanish": "Spanisch", - "SettingsTabSystemSystemLanguageChinese": "Chinesisch", - "SettingsTabSystemSystemLanguageKorean": "Koreanisch", - "SettingsTabSystemSystemLanguageDutch": "Niederländisch", - "SettingsTabSystemSystemLanguagePortuguese": "Portugiesisch", - "SettingsTabSystemSystemLanguageRussian": "Russisch", - "SettingsTabSystemSystemLanguageTaiwanese": "Taiwanesisch", - "SettingsTabSystemSystemLanguageBritishEnglish": "Britisches Englisch", - "SettingsTabSystemSystemLanguageCanadianFrench": "Kanadisches Französisch", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Lateinamerikanisches Spanisch", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Vereinfachtes Chinesisch", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Traditionelles Chinesisch", - "SettingsTabSystemSystemTimeZone": "System-Zeitzone:", - "SettingsTabSystemSystemTime": "Systemzeit:", - "SettingsTabSystemEnableVsync": "VSync", - "SettingsTabSystemEnablePptc": "PPTC (Profiled Persistent Translation Cache)", - "SettingsTabSystemEnableLowPowerPptc": "Kleinleistungs-PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "FS Integritätsprüfung", - "SettingsTabSystemAudioBackend": "Audio-Backend:", - "SettingsTabSystemAudioBackendDummy": "Ohne Funktion", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "Hacks", - "SettingsTabSystemHacksNote": " (Kann Fehler verursachen)", - "SettingsTabSystemDramSize": "DRAM Größe:", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "Ignoriere fehlende Dienste", - "SettingsTabSystemIgnoreApplet": "Applet ignorieren", - "SettingsTabGraphics": "Grafik", - "SettingsTabGraphicsAPI": "Grafik-API", - "SettingsTabGraphicsEnableShaderCache": "Shader-Cache aktivieren", - "SettingsTabGraphicsAnisotropicFiltering": "Anisotrope Filterung:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Auto", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "Auflösungsskalierung:", - "SettingsTabGraphicsResolutionScaleCustom": "Benutzerdefiniert (nicht empfohlen)", - "SettingsTabGraphicsResolutionScaleNative": "Nativ (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Nicht empfohlen)", - "SettingsTabGraphicsAspectRatio": "Bildseitenverhältnis:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "An Fenster anpassen", - "SettingsTabGraphicsDeveloperOptions": "Optionen für Entwickler", - "SettingsTabGraphicsShaderDumpPath": "Grafik-Shader-Dump-Pfad:", - "SettingsTabLogging": "Logs", - "SettingsTabLoggingLogging": "Logs", - "SettingsTabLoggingEnableLoggingToFile": "Protokollierung in Datei aktivieren", - "SettingsTabLoggingEnableStubLogs": "Aktiviere Stub-Logs", - "SettingsTabLoggingEnableInfoLogs": "Aktiviere Info-Logs", - "SettingsTabLoggingEnableWarningLogs": "Aktiviere Warn-Logs", - "SettingsTabLoggingEnableErrorLogs": "Aktiviere Fehler-Logs", - "SettingsTabLoggingEnableTraceLogs": "Aktiviere Trace-Logs", - "SettingsTabLoggingEnableGuestLogs": "Aktiviere Gast-Logs", - "SettingsTabLoggingEnableFsAccessLogs": "Aktiviere Fs Zugriff-Logs", - "SettingsTabLoggingFsGlobalAccessLogMode": "Fs Globaler Zugriff-Log-Modus:", - "SettingsTabLoggingDeveloperOptions": "Entwickleroptionen", - "SettingsTabLoggingDeveloperOptionsNote": "ACHTUNG: Wird die Leistung reduzieren", - "SettingsTabLoggingGraphicsBackendLogLevel": "Protokollstufe des Grafik-Backends:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "Keine", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Fehler", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Verlangsamungen", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "Alle", - "SettingsTabLoggingEnableDebugLogs": "Aktiviere Debug-Log", - "SettingsTabInput": "Eingabe", - "SettingsTabInputEnableDockedMode": "Angedockter Modus", - "SettingsTabInputDirectKeyboardAccess": "Direkter Tastaturzugriff", - "SettingsButtonSave": "Speichern", - "SettingsButtonClose": "Schließen", - "SettingsButtonOk": "OK", - "SettingsButtonCancel": "Abbrechen", - "SettingsButtonApply": "Übernehmen", - "ControllerSettingsPlayer": "Spieler", - "ControllerSettingsPlayer1": "Spieler 1", - "ControllerSettingsPlayer2": "Spieler 2", - "ControllerSettingsPlayer3": "Spieler 3", - "ControllerSettingsPlayer4": "Spieler 4", - "ControllerSettingsPlayer5": "Spieler 5", - "ControllerSettingsPlayer6": "Spieler 6", - "ControllerSettingsPlayer7": "Spieler 7", - "ControllerSettingsPlayer8": "Spieler 8", - "ControllerSettingsHandheld": "Handheld", - "ControllerSettingsInputDevice": "Eingabegerät", - "ControllerSettingsRefresh": "Aktualisieren", - "ControllerSettingsDeviceDisabled": "Deaktiviert", - "ControllerSettingsControllerType": "Controller-Typ", - "ControllerSettingsControllerTypeHandheld": "Handheld", - "ControllerSettingsControllerTypeProController": "Pro Controller", - "ControllerSettingsControllerTypeJoyConPair": "Joy-Con-Paar", - "ControllerSettingsControllerTypeJoyConLeft": "Linker Joy-Con", - "ControllerSettingsControllerTypeJoyConRight": "Rechter Joy-Con", - "ControllerSettingsProfile": "Profil", - "ControllerSettingsProfileDefault": "Standard", - "ControllerSettingsLoad": "Laden", - "ControllerSettingsAdd": "Hinzufügen", - "ControllerSettingsRemove": "Entfernen", - "ControllerSettingsButtons": "Aktionstasten", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Steuerkreuz", - "ControllerSettingsDPadUp": "Hoch", - "ControllerSettingsDPadDown": "Runter", - "ControllerSettingsDPadLeft": "Links", - "ControllerSettingsDPadRight": "Rechts", - "ControllerSettingsStickButton": "Button", - "ControllerSettingsStickUp": "Hoch", - "ControllerSettingsStickDown": "Runter", - "ControllerSettingsStickLeft": "Links", - "ControllerSettingsStickRight": "Rechts", - "ControllerSettingsStickStick": "Stick", - "ControllerSettingsStickInvertXAxis": "X-Achse invertieren", - "ControllerSettingsStickInvertYAxis": "Y-Achse invertieren", - "ControllerSettingsStickDeadzone": "Deadzone:", - "ControllerSettingsLStick": "Linker Analogstick", - "ControllerSettingsRStick": "Rechter Analogstick", - "ControllerSettingsTriggersLeft": "Linker Trigger", - "ControllerSettingsTriggersRight": "Rechter Trigger", - "ControllerSettingsTriggersButtonsLeft": "Linke Schultertaste", - "ControllerSettingsTriggersButtonsRight": "Rechte Schultertaste", - "ControllerSettingsTriggers": "Trigger", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Linke Aktionstasten", - "ControllerSettingsExtraButtonsRight": "Rechte Aktionstasten", - "ControllerSettingsMisc": "Verschiedenes", - "ControllerSettingsTriggerThreshold": "Empfindlichkeit:", - "ControllerSettingsMotion": "Bewegung", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "CemuHook kompatible Bewegungssteuerung", - "ControllerSettingsMotionControllerSlot": "Controller-Slot:", - "ControllerSettingsMotionMirrorInput": "Eingabe spiegeln", - "ControllerSettingsMotionRightJoyConSlot": "Rechter Joy-Con-Slot:", - "ControllerSettingsMotionServerHost": "Server Host:", - "ControllerSettingsMotionGyroSensitivity": "Gyro-Empfindlichkeit:", - "ControllerSettingsMotionGyroDeadzone": "Gyro-Deadzone:", - "ControllerSettingsSave": "Speichern", - "ControllerSettingsClose": "Schließen", - "KeyUnknown": "Unbekannt", - "KeyShiftLeft": "Shift Left", - "KeyShiftRight": "Shift Right", - "KeyControlLeft": "Ctrl Left", - "KeyMacControlLeft": "⌃ Left", - "KeyControlRight": "Ctrl Right", - "KeyMacControlRight": "⌃ Right", - "KeyAltLeft": "Alt Left", - "KeyMacAltLeft": "⌥ Left", - "KeyAltRight": "Alt Right", - "KeyMacAltRight": "⌥ Right", - "KeyWinLeft": "⊞ Left", - "KeyMacWinLeft": "⌘ Left", - "KeyWinRight": "⊞ Right", - "KeyMacWinRight": "⌘ Right", - "KeyMenu": "Menu", - "KeyUp": "Up", - "KeyDown": "Down", - "KeyLeft": "Left", - "KeyRight": "Right", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Right", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Left Trigger 0", - "GamepadSingleRightTrigger0": "Right Trigger 0", - "GamepadSingleLeftTrigger1": "Left Trigger 1", - "GamepadSingleRightTrigger1": "Right Trigger 1", - "StickLeft": "Left Stick", - "StickRight": "Right Stick", - "UserProfilesSelectedUserProfile": "Ausgewähltes Profil:", - "UserProfilesSaveProfileName": "Profilname speichern", - "UserProfilesChangeProfileImage": "Profilbild ändern", - "UserProfilesAvailableUserProfiles": "Verfügbare Profile:", - "UserProfilesAddNewProfile": "Neues Profil", - "UserProfilesDelete": "Löschen", - "UserProfilesClose": "Schließen", - "ProfileNameSelectionWatermark": "Wähle einen Spitznamen", - "ProfileImageSelectionTitle": "Auswahl des Profilbildes", - "ProfileImageSelectionHeader": "Wähle ein Profilbild aus", - "ProfileImageSelectionNote": "Es kann ein eigenes Profilbild importiert werden oder ein Avatar aus der System-Firmware", - "ProfileImageSelectionImportImage": "Bilddatei importieren", - "ProfileImageSelectionSelectAvatar": "Firmware-Avatar auswählen", - "InputDialogTitle": "Eingabe-Dialog", - "InputDialogOk": "OK", - "InputDialogCancel": "Abbrechen", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "Wähle den Profilnamen", - "InputDialogAddNewProfileHeader": "Bitte gebe einen Profilnamen ein", - "InputDialogAddNewProfileSubtext": "(Maximale Länge: {0})", - "AvatarChoose": "Bestätigen", - "AvatarSetBackgroundColor": "Hintergrundfarbe auswählen", - "AvatarClose": "Schließen", - "ControllerSettingsLoadProfileToolTip": "Lädt ein Profil", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "Fügt ein Profil hinzu", - "ControllerSettingsRemoveProfileToolTip": "Entfernt ein Profil", - "ControllerSettingsSaveProfileToolTip": "Speichert ein Profil", - "MenuBarFileToolsTakeScreenshot": "Screenshot aufnehmen", - "MenuBarFileToolsHideUi": "Oberfläche ausblenden", - "GameListContextMenuRunApplication": "Anwendung ausführen", - "GameListContextMenuToggleFavorite": "Als Favoriten hinzufügen/entfernen", - "GameListContextMenuToggleFavoriteToolTip": "Aktiviert den Favoriten-Status des Spiels", - "SettingsTabGeneralTheme": "Design:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "Dunkel", - "SettingsTabGeneralThemeLight": "Hell", - "ControllerSettingsConfigureGeneral": "Konfigurieren", - "ControllerSettingsRumble": "Vibration", - "ControllerSettingsRumbleStrongMultiplier": "Starker Vibrations-Multiplikator", - "ControllerSettingsRumbleWeakMultiplier": "Schwacher Vibrations-Multiplikator", - "DialogMessageSaveNotAvailableMessage": "Es existieren keine Speicherdaten für {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "Sollen Speicherdaten für dieses Spiel erstellt werden?", - "DialogConfirmationTitle": "Ryujinx - Bestätigung", - "DialogUpdaterTitle": "Ryujinx - Updater", - "DialogErrorTitle": "Ryujinx - Fehler", - "DialogWarningTitle": "Ryujinx - Warnung", - "DialogExitTitle": "Ryujinx - Beenden", - "DialogErrorMessage": "Ein Fehler ist aufgetreten", - "DialogExitMessage": "Ryujinx wirklich schließen?", - "DialogExitSubMessage": "Alle nicht gespeicherten Daten gehen verloren!", - "DialogMessageCreateSaveErrorMessage": "Es ist ein Fehler bei der Erstellung der angegebenen Speicherdaten aufgetreten: {0}", - "DialogMessageFindSaveErrorMessage": "Es ist ein Fehler beim Suchen der angegebenen Speicherdaten aufgetreten: {0}", - "FolderDialogExtractTitle": "Wähle den Ordner, in welchen die Dateien entpackt werden sollen", - "DialogNcaExtractionMessage": "Extrahiert {0} abschnitt von {1}...", - "DialogNcaExtractionTitle": "NCA-Abschnitt-Extraktor", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Extraktion fehlgeschlagen. Der Hauptheader der NCA war in der ausgewählten Datei nicht vorhanden.", - "DialogNcaExtractionCheckLogErrorMessage": "Extraktion fehlgeschlagen. Überprüfe die Logs für weitere Informationen.", - "DialogNcaExtractionSuccessMessage": "Extraktion erfolgreich abgeschlossen.", - "DialogUpdaterConvertFailedMessage": "Die Konvertierung der aktuellen Ryujinx-Version ist fehlgeschlagen.", - "DialogUpdaterCancelUpdateMessage": "Update wird abgebrochen!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "Es wird bereits die aktuellste Version von Ryujinx benutzt", - "DialogUpdaterFailedToGetVersionMessage": "Beim Versuch, Veröffentlichungs-Info von GitHub Release zu erhalten, ist ein Fehler aufgetreten. Dies kann aufgrund einer neuen Veröffentlichung, die gerade von GitHub Actions kompiliert wird, verursacht werden.", - "DialogUpdaterConvertFailedGithubMessage": "Fehler beim Konvertieren der erhaltenen Ryujinx-Version von GitHub Release.", - "DialogUpdaterDownloadingMessage": "Update wird heruntergeladen...", - "DialogUpdaterExtractionMessage": "Update wird entpackt...", - "DialogUpdaterRenamingMessage": "Update wird umbenannt...", - "DialogUpdaterAddingFilesMessage": "Update wird hinzugefügt...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "Update abgeschlossen!", - "DialogUpdaterRestartMessage": "Ryujinx jetzt neu starten?", - "DialogUpdaterNoInternetMessage": "Es besteht keine Verbindung mit dem Internet!", - "DialogUpdaterNoInternetSubMessage": "Bitte vergewissern, dass eine funktionierende Internetverbindung existiert!", - "DialogUpdaterDirtyBuildMessage": "Inoffizielle Versionen von Ryujinx können nicht aktualisiert werden", - "DialogUpdaterDirtyBuildSubMessage": "Lade Ryujinx bitte von hier herunter, um eine unterstützte Version zu erhalten: https://ryujinx.app/download", - "DialogRestartRequiredMessage": "Neustart erforderlich", - "DialogThemeRestartMessage": "Das Design wurde gespeichert. Ein Neustart ist erforderlich, um das Design anzuwenden.", - "DialogThemeRestartSubMessage": "Jetzt neu starten?", - "DialogFirmwareInstallEmbeddedMessage": "Die in diesem Spiel enthaltene Firmware installieren? (Firmware {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "Es wurde keine installierte Firmware gefunden, aber Ryujinx konnte die Firmware {0} aus dem bereitgestellten Spiel installieren.\nRyujinx wird nun gestartet.", - "DialogFirmwareNoFirmwareInstalledMessage": "Keine Firmware installiert", - "DialogFirmwareInstalledMessage": "Firmware {0} wurde installiert", - "DialogInstallFileTypesSuccessMessage": "Dateitypen erfolgreich installiert!", - "DialogInstallFileTypesErrorMessage": "Dateitypen konnten nicht installiert werden.", - "DialogUninstallFileTypesSuccessMessage": "Dateitypen erfolgreich deinstalliert!", - "DialogUninstallFileTypesErrorMessage": "Deinstallation der Dateitypen fehlgeschlagen.", - "DialogOpenSettingsWindowLabel": "Fenster-Einstellungen öffnen", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "Controller-Applet", - "DialogMessageDialogErrorExceptionMessage": "Fehler bei der Anzeige des Meldungs-Dialogs: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Fehler bei der Anzeige der Software-Tastatur: {0}", - "DialogErrorAppletErrorExceptionMessage": "Fehler beim Anzeigen des ErrorApplet-Dialogs: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nWeitere Informationen zur Behebung dieses Fehlers können in unserem Setup-Guide gefunden werden.", - "DialogUserErrorDialogTitle": "Ryujinx Fehler ({0})", - "DialogAmiiboApiTitle": "Amiibo-API", - "DialogAmiiboApiFailFetchMessage": "Beim Abrufen von Informationen aus der API ist ein Fehler aufgetreten.", - "DialogAmiiboApiConnectErrorMessage": "Verbindung zum Amiibo API Server kann nicht hergestellt werden. Der Dienst ist möglicherweise nicht verfügbar oder es existiert keine Internetverbindung.", - "DialogProfileInvalidProfileErrorMessage": "Das Profil {0} ist mit dem aktuellen Eingabekonfigurationssystem nicht kompatibel.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "Das Standardprofil kann nicht überschrieben werden", - "DialogProfileDeleteProfileTitle": "Profil löschen", - "DialogProfileDeleteProfileMessage": "Diese Aktion kann nicht rückgängig gemacht werden. Wirklich fortfahren?", - "DialogWarning": "Warnung", - "DialogPPTCDeletionMessage": "Du bist dabei den PPTC für das folgende Spiel als ungültig zu markieren:\n\n{0}\n\nWirklich fortfahren?", - "DialogPPTCDeletionErrorMessage": "Fehler bei der Löschung des PPTC Caches bei {0}: {1}", - "DialogShaderDeletionMessage": "Du bist dabei, den Shader Cache zu löschen für :\n\n{0}\n\nWirklich fortfahren?", - "DialogShaderDeletionErrorMessage": "Es ist ein Fehler bei der Löschung des Shader Caches bei {0}: {1} aufgetreten", - "DialogRyujinxErrorMessage": "Ein Fehler ist aufgetreten", - "DialogInvalidTitleIdErrorMessage": "UI Fehler: Das ausgewählte Spiel hat keine gültige Titel-ID", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Es wurde keine gültige System-Firmware gefunden in {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Installiere Firmware {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "Systemversion {0} wird jetzt installiert.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nDies wird die aktuelle Systemversion {0} ersetzen.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nMöchtest du fortfahren?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Firmware wird installiert...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Systemversion {0} wurde erfolgreich installiert.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "Es können keine anderen Profile geöffnet werden, wenn das ausgewählte Profil gelöscht wird.", - "DialogUserProfileDeletionConfirmMessage": "Möchtest du das ausgewählte Profil löschen?", - "DialogUserProfileUnsavedChangesTitle": "Warnung - Nicht gespeicherte Änderungen", - "DialogUserProfileUnsavedChangesMessage": "Sie haben Änderungen an diesem Nutzerprofil vorgenommen, die nicht gespeichert wurden.", - "DialogUserProfileUnsavedChangesSubMessage": "Möchten Sie Ihre Änderungen wirklich verwerfen?", - "DialogControllerSettingsModifiedConfirmMessage": "Die aktuellen Controller-Einstellungen wurden aktualisiert.", - "DialogControllerSettingsModifiedConfirmSubMessage": "Controller-Einstellungen speichern?", - "DialogLoadFileErrorMessage": "{0}. Fehlerhafte Datei: {1}", - "DialogModAlreadyExistsMessage": "Mod ist bereits vorhanden", - "DialogModInvalidMessage": "Das angegebene Verzeichnis enthält keine Mods!", - "DialogModDeleteNoParentMessage": "Löschen fehlgeschlagen: Das übergeordnete Verzeichnis für den Mod \"{0}\" konnte nicht gefunden werden!", - "DialogDlcNoDlcErrorMessage": "Die angegebene Datei enthält keinen DLC für den ausgewählten Titel!", - "DialogPerformanceCheckLoggingEnabledMessage": "Es wurde die Debug Protokollierung aktiviert", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "Um eine optimale Leistung zu erzielen, wird empfohlen, die Debug Protokollierung zu deaktivieren. Debug Protokollierung jetzt deaktivieren?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "Es wurde das Shader Dumping aktiviert, das nur von Entwicklern verwendet werden soll.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Für eine optimale Leistung wird empfohlen, das Shader Dumping zu deaktivieren. Shader Dumping jetzt deaktivieren?", - "DialogLoadAppGameAlreadyLoadedMessage": "Es wurde bereits ein Spiel gestartet", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Bitte beende die Emulation oder schließe den Emulator, vor dem Starten eines neuen Spiels", - "DialogUpdateAddUpdateErrorMessage": "Die angegebene Datei enthält keine Updates für den ausgewählten Titel!", - "DialogSettingsBackendThreadingWarningTitle": "Warnung - Render Threading", - "DialogSettingsBackendThreadingWarningMessage": "Ryujinx muss muss neu gestartet werden, damit die Änderungen wirksam werden. Abhängig von dem Betriebssystem muss möglicherweise das Multithreading des Treibers manuell deaktiviert werden, wenn Ryujinx verwendet wird.", - "DialogModManagerDeletionWarningMessage": "Du bist dabei, diesen Mod zu lösche. {0}\n\nMöchtest du wirklich fortfahren?", - "DialogModManagerDeletionAllWarningMessage": "Du bist dabei, alle Mods für diesen Titel zu löschen.\n\nMöchtest du wirklich fortfahren?", - "SettingsTabGraphicsFeaturesOptions": "Erweiterungen", - "SettingsTabGraphicsBackendMultithreading": "Grafik-Backend Multithreading:", - "CommonAuto": "Auto", - "CommonOff": "Aus", - "CommonOn": "An", - "InputDialogYes": "Ja", - "InputDialogNo": "Nein", - "DialogProfileInvalidProfileNameErrorMessage": "Der Dateiname enthält ungültige Zeichen. Bitte erneut versuchen.", - "MenuBarOptionsPauseEmulation": "Pause", - "MenuBarOptionsResumeEmulation": "Fortsetzen", - "AboutUrlTooltipMessage": "Klicke hier, um die Ryujinx Website im Standardbrowser zu öffnen.", - "AboutDisclaimerMessage": "Ryujinx ist in keinster Weise weder mit Nintendo™, \nnoch mit deren Partnern verbunden.", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) wird in unserer Amiibo \nEmulation benutzt.", - "AboutPatreonUrlTooltipMessage": "Klicke hier, um die Ryujinx Patreon Seite im Standardbrowser zu öffnen.", - "AboutGithubUrlTooltipMessage": "Klicke hier, um die Ryujinx GitHub Seite im Standardbrowser zu öffnen.", - "AboutDiscordUrlTooltipMessage": "Klicke hier, um eine Einladung zum Ryujinx Discord Server im Standardbrowser zu öffnen.", - "AboutTwitterUrlTooltipMessage": "Klicke hier, um die Ryujinx Twitter Seite im Standardbrowser zu öffnen.", - "AboutRyujinxAboutTitle": "Über:", - "AboutRyujinxAboutContent": "Ryujinx ist ein Nintendo Switch™ Emulator.\nBitte unterstütze uns auf Patreon.\nAuf Twitter oder Discord erfährst du alle Neuigkeiten.\nEntwickler, die an einer Mitarbeit interessiert sind, können auf GitHub oder Discord mehr erfahren.", - "AboutRyujinxMaintainersTitle": "Entwickelt von:", - "AboutRyujinxMaintainersContentTooltipMessage": "Klicke hier, um die Liste der Mitwirkenden im Standardbrowser zu öffnen.", - "AboutRyujinxSupprtersTitle": "Unterstützt auf Patreon von:", - "AmiiboSeriesLabel": "Amiibo-Serie", - "AmiiboCharacterLabel": "Charakter", - "AmiiboScanButtonLabel": "Einscannen", - "AmiiboOptionsShowAllLabel": "Zeige alle Amiibos", - "AmiiboOptionsUsRandomTagLabel": "Hack: Benutze zufällige Tag-UUID", - "DlcManagerTableHeadingEnabledLabel": "Aktiviert", - "DlcManagerTableHeadingTitleIdLabel": "Title-ID", - "DlcManagerTableHeadingContainerPathLabel": "Container-Pfad", - "DlcManagerTableHeadingFullPathLabel": "Vollständiger-Pfad", - "DlcManagerRemoveAllButton": "Entferne alle", - "DlcManagerEnableAllButton": "Alle aktivieren", - "DlcManagerDisableAllButton": "Alle deaktivieren", - "ModManagerDeleteAllButton": "Alle löschen", - "MenuBarOptionsChangeLanguage": "Sprache ändern", - "MenuBarShowFileTypes": "Dateitypen anzeigen", - "CommonSort": "Sortieren", - "CommonShowNames": "Spiel-Namen anzeigen", - "CommonFavorite": "Favoriten", - "OrderAscending": "Aufsteigend", - "OrderDescending": "Absteigend", - "SettingsTabGraphicsFeatures": "Erweiterungen", - "ErrorWindowTitle": "Fehler-Fenster", - "ToggleDiscordTooltip": "Zeige momentanes Spiel auf Discord", - "AddGameDirBoxTooltip": "Gibt das Spielverzeichnis an, das der Liste hinzuzufügt wird", - "AddGameDirTooltip": "Fügt ein neues Spielverzeichnis hinzu", - "RemoveGameDirTooltip": "Entfernt das ausgewähltes Spielverzeichnis", - "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list", - "AddAutoloadDirTooltip": "Add an autoload directory to the list", - "RemoveAutoloadDirTooltip": "Remove selected autoload directory", - "CustomThemeCheckTooltip": "Verwende ein eigenes Design für die Emulator-Benutzeroberfläche", - "CustomThemePathTooltip": "Gibt den Pfad zum Design für die Emulator-Benutzeroberfläche an", - "CustomThemeBrowseTooltip": "Ermöglicht die Suche nach einem benutzerdefinierten Design für die Emulator-Benutzeroberfläche", - "DockModeToggleTooltip": "Im gedockten Modus verhält sich das emulierte System wie eine Nintendo Switch im TV Modus. Dies verbessert die grafische Qualität der meisten Spiele. Umgekehrt führt die Deaktivierung dazu, dass sich das emulierte System wie eine Nintendo Switch im Handheld Modus verhält, was die Grafikqualität beeinträchtigt.\n\nKonfiguriere das Eingabegerät für Spieler 1, um im Docked Modus zu spielen; konfiguriere das Controllerprofil via der Handheld Option, wenn geplant wird den Handheld Modus zu nutzen.\n\nIm Zweifelsfall AN lassen.", - "DirectKeyboardTooltip": "Direkter Zugriff auf die Tastatur (HID). Bietet Spielen Zugriff auf Ihre Tastatur als Texteingabegerät.\n\nFunktioniert nur mit Spielen, die die Tastaturnutzung auf Switch-Hardware nativ unterstützen.\n\nAus lassen, wenn unsicher.", - "DirectMouseTooltip": "Unterstützt den direkten Mauszugriff (HID). Bietet Spielen Zugriff auf Ihre Maus als Zeigegerät.\n\nFunktioniert nur mit Spielen, die nativ die Steuerung mit der Maus auf Switch-Hardware unterstützen (nur sehr wenige).\n\nTouchscreen-Funktionalität ist möglicherweise eingeschränkt, wenn dies aktiviert ist.\n\n Aus lassen, wenn unsicher.", - "RegionTooltip": "Ändert die Systemregion", - "LanguageTooltip": "Ändert die Systemsprache", - "TimezoneTooltip": "Ändert die Systemzeitzone", - "TimeTooltip": "Ändert die Systemzeit", - "VSyncToggleTooltip": "Vertikale Synchronisierung der emulierten Konsole. Diese Option ist quasi ein Frame-Limiter für die meisten Spiele; die Deaktivierung kann dazu führen, dass Spiele mit höherer Geschwindigkeit laufen oder Ladebildschirme länger benötigen/hängen bleiben.\n\nKann beim Spielen mit einem frei wählbaren Hotkey ein- und ausgeschaltet werden (standardmäßig F1). \n\nIm Zweifelsfall AN lassen.", - "PptcToggleTooltip": "Speichert übersetzte JIT-Funktionen, sodass jene nicht jedes Mal übersetzt werden müssen, wenn das Spiel geladen wird.\n\nVerringert Stottern und die Zeit beim zweiten und den darauffolgenden Startvorgängen eines Spiels erheblich.\n\nIm Zweifelsfall AN lassen.", - "LowPowerPptcToggleTooltip": "Lädt den PPTC mit einem Drittel der verfügbaren Prozessorkernen", - "FsIntegrityToggleTooltip": "Prüft beim Startvorgang auf beschädigte Dateien und zeigt bei beschädigten Dateien einen Hash-Fehler (Hash Error) im Log an.\n\nDiese Einstellung hat keinen Einfluss auf die Leistung und hilft bei der Fehlersuche.\n\nIm Zweifelsfall AN lassen.", - "AudioBackendTooltip": "Ändert das Backend, das zum Rendern von Audio verwendet wird.\n\nSDL2 ist das bevorzugte Audio-Backend, OpenAL und SoundIO sind als Alternativen vorhanden. Dummy wird keinen Audio-Output haben.\n\nIm Zweifelsfall SDL2 auswählen.", - "MemoryManagerTooltip": "Ändert wie der Gastspeicher abgebildet wird und wie auf ihn zugegriffen wird. Beinflusst die Leistung der emulierten CPU erheblich.\n\nIm Zweifelsfall Host ungeprüft auswählen.", - "MemoryManagerSoftwareTooltip": "Verwendung einer Software-Seitentabelle für die Adressumsetzung. Höchste Genauigkeit, aber langsamste Leistung.", - "MemoryManagerHostTooltip": "Direkte Zuordnung von Speicher im Host-Adressraum. Viel schnellere JIT-Kompilierung und Ausführung.", - "MemoryManagerUnsafeTooltip": "Direkte Zuordnung des Speichers, aber keine Maskierung der Adresse innerhalb des Gastadressraums vor dem Zugriff. Schneller, aber auf Kosten der Sicherheit. Die Gastanwendung kann von überall in Ryujinx auf den Speicher zugreifen, daher sollte in diesem Modus nur Programme ausgeführt werden denen vertraut wird.", - "UseHypervisorTooltip": "Verwende Hypervisor anstelle von JIT. Verbessert die Leistung stark, falls vorhanden, kann jedoch in seinem aktuellen Zustand instabil sein.", - "DRamTooltip": "Erhöht den Arbeitsspeicher des emulierten Systems von 4 GiB auf 6 GiB.\n\nDies ist nur für Texturenpakete mit höherer Auflösung oder Mods mit 4K-Auflösung nützlich. Diese Option verbessert NICHT die Leistung.\n\nIm Zweifelsfall AUS lassen.", - "IgnoreMissingServicesTooltip": "Durch diese Option werden nicht implementierte Dienste der Switch-Firmware ignoriert. Dies kann dabei helfen, Abstürze beim Starten bestimmter Spiele zu umgehen.\n\nIm Zweifelsfall AUS lassen.", - "IgnoreAppletTooltip": "Der externe Dialog \"Controller-Applet\" wird nicht angezeigt, wenn das Gamepad während des Spiels getrennt wird. Es erfolgt keine Aufforderung, den Dialog zu schließen oder einen neuen Controller einzurichten. Sobald der zuvor getrennte Controller wieder angeschlossen wird, wird das Spiel automatisch fortgesetzt.", - "GraphicsBackendThreadingTooltip": "Führt Grafik-Backend Befehle auf einem zweiten Thread aus.\n\nDies beschleunigt die Shader-Kompilierung, reduziert Stottern und verbessert die Leistung auf GPU-Treibern ohne eigene Multithreading-Unterstützung. Geringfügig bessere Leistung bei Treibern mit Multithreading.\n\nIm Zweifelsfall auf AUTO stellen.", - "GalThreadingTooltip": "Führt Grafik-Backend Befehle auf einem zweiten Thread aus.\n\nDies Beschleunigt die Shader-Kompilierung, reduziert Stottern und verbessert die Leistung auf GPU-Treibern ohne eigene Multithreading-Unterstützung. Geringfügig bessere Leistung bei Treibern mit Multithreading.\n\nIm Zweifelsfall auf auf AUTO stellen.", - "ShaderCacheToggleTooltip": "Speichert einen persistenten Shader Cache, der das Stottern bei nachfolgenden Durchläufen reduziert.\n\nIm Zweifelsfall AN lassen.", - "ResolutionScaleTooltip": "Multipliziert die Rendering-Auflösung des Spiels.\n\nEinige wenige Spiele funktionieren damit nicht und sehen auch bei höherer Auflösung pixelig aus; für diese Spiele müssen Sie möglicherweise Mods finden, die Anti-Aliasing entfernen oder die interne Rendering-Auflösung erhöhen. Für die Verwendung von Letzterem sollten Sie Native wählen.\n\nSie können diese Option ändern, während ein Spiel läuft, indem Sie unten auf \"Übernehmen\" klicken; Sie können das Einstellungsfenster einfach zur Seite schieben und experimentieren, bis Sie Ihr bevorzugtes Aussehen für ein Spiel gefunden haben.\n\nDenken Sie daran, dass 4x für praktisch jedes Setup Overkill ist.", - "ResolutionScaleEntryTooltip": "Fließkomma Auflösungsskalierung, wie 1,5.\n Bei nicht ganzzahligen Werten ist die Wahrscheinlichkeit größer, dass Probleme entstehen, die auch zum Absturz führen können.", - "AnisotropyTooltip": "Stufe der Anisotropen Filterung. Auf Auto setzen, um den vom Spiel geforderten Wert zu verwenden.", - "AspectRatioTooltip": "Seitenverhältnis, das auf das Renderer-Fenster angewendet wird.\n\nÄndern Sie dies nur, wenn Sie einen Seitenverhältnis-Mod für Ihr Spiel verwenden, da sonst die Grafik gestreckt wird.\n\nLassen Sie es auf 16:9, wenn Sie unsicher sind.", - "ShaderDumpPathTooltip": "Grafik-Shader-Dump-Pfad", - "FileLogTooltip": "Speichert die Konsolenausgabe in einer Log-Datei auf der Festplatte. Hat keinen Einfluss auf die Leistung.", - "StubLogTooltip": "Ausgabe von Stub-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.", - "InfoLogTooltip": "Ausgabe von Info-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.", - "WarnLogTooltip": "Ausgabe von Warn-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.", - "ErrorLogTooltip": "Ausgabe von Fehler-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.", - "TraceLogTooltip": "Ausgabe von Trace-Log in der Konsole. Hat keinen Einfluss auf die Leistung.", - "GuestLogTooltip": "Ausgabe von Gast-Logs in der Konsole. Hat keinen Einfluss auf die Leistung.", - "FileAccessLogTooltip": "Ausgabe von FS-Zugriff-Logs in der Konsole.", - "FSAccessLogModeTooltip": "Aktiviert die Ausgabe des FS-Zugriff-Logs in der Konsole. Mögliche Modi sind 0-3", - "DeveloperOptionTooltip": "Mit Vorsicht verwenden", - "OpenGlLogLevel": "Erfordert die Aktivierung der entsprechenden Log-Level", - "DebugLogTooltip": "Ausgabe von Debug-Logs in der Konsole.\n\nVerwende diese Option nur auf ausdrückliche Anweisung von Ryujinx Entwicklern, da sie das Lesen der Protokolle erschwert und die Leistung des Emulators verschlechtert.", - "LoadApplicationFileTooltip": "Öffnet die Dateiauswahl um Datei zu laden, welche mit der Switch kompatibel ist", - "LoadApplicationFolderTooltip": "Öffnet die Dateiauswahl um ein Spiel zu laden, welches mit der Switch kompatibel ist", - "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from", - "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from", - "OpenRyujinxFolderTooltip": "Öffnet den Ordner, der das Ryujinx Dateisystem enthält", - "OpenRyujinxLogsTooltip": "Öffnet den Ordner, in welchem die Logs gespeichert werden", - "ExitTooltip": "Beendet Ryujinx", - "OpenSettingsTooltip": "Öffnet das Einstellungsfenster", - "OpenProfileManagerTooltip": "Öffnet das Profilverwaltungsfenster", - "StopEmulationTooltip": "Beendet die Emulation des derzeitigen Spiels und kehrt zu der Spielauswahl zurück", - "CheckUpdatesTooltip": "Sucht nach Updates für Ryujinx", - "OpenAboutTooltip": "Öffnet das 'Über Ryujinx'-Fenster", - "GridSize": "Rastergröße", - "GridSizeTooltip": "Ändert die Größe der Rasterelemente", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Brasilianisches Portugiesisch", - "AboutRyujinxContributorsButtonHeader": "Alle Mitwirkenden anzeigen", - "SettingsTabSystemAudioVolume": "Lautstärke: ", - "AudioVolumeTooltip": "Ändert die Lautstärke", - "SettingsTabSystemEnableInternetAccess": "Gast-Internet-Zugang/LAN Modus", - "EnableInternetAccessTooltip": "Erlaubt es der emulierten Anwendung sich mit dem Internet zu verbinden.\n\nSpiele die den LAN-Modus unterstützen, ermöglichen es Ryujinx sich sowohl mit anderen Ryujinx-Systemen, als auch mit offiziellen Nintendo Switch Konsolen zu verbinden. Allerdings nur, wenn diese Option aktiviert ist und die Systeme mit demselben lokalen Netzwerk verbunden sind.\n\nDies erlaubt KEINE Verbindung zu Nintendo-Servern. Kann bei bestimmten Spielen die versuchen sich mit dem Internet zu verbinden zum Absturz führen.\n\nIm Zweifelsfall AUS lassen", - "GameListContextMenuManageCheatToolTip": "Öffnet den Cheat-Manager", - "GameListContextMenuManageCheat": "Cheats verwalten", - "GameListContextMenuManageModToolTip": "Mods verwalten", - "GameListContextMenuManageMod": "Mods verwalten", - "ControllerSettingsStickRange": "Bereich:", - "DialogStopEmulationTitle": "Ryujinx - Beende Emulation", - "DialogStopEmulationMessage": "Emulation wirklich beenden?", - "SettingsTabCpu": "CPU", - "SettingsTabAudio": "Audio", - "SettingsTabNetwork": "Netzwerk", - "SettingsTabNetworkConnection": "Netwerkverbindung", - "SettingsTabCpuCache": "CPU-Cache", - "SettingsTabCpuMemory": "CPU-Speicher", - "DialogUpdaterFlatpakNotSupportedMessage": "Bitte aktualisiere Ryujinx über FlatHub", - "UpdaterDisabledWarningTitle": "Updater deaktiviert!", - "ControllerSettingsRotate90": "Um 90° rotieren", - "IconSize": "Cover Größe", - "IconSizeTooltip": "Ändert die Größe der Spiel-Cover", - "MenuBarOptionsShowConsole": "Zeige Konsole", - "ShaderCachePurgeError": "Es ist ein Fehler beim löschen des Shader Caches aufgetreten bei {0}: {1}", - "UserErrorNoKeys": "Keys nicht gefunden", - "UserErrorNoFirmware": "Firmware nicht gefunden", - "UserErrorFirmwareParsingFailed": "Firmware-Analysierung-Fehler", - "UserErrorApplicationNotFound": "Anwendung nicht gefunden", - "UserErrorUnknown": "Unbekannter Fehler", - "UserErrorUndefined": "Undefinierter Fehler", - "UserErrorNoKeysDescription": "Ryujinx konnte deine 'prod.keys' Datei nicht finden", - "UserErrorNoFirmwareDescription": "Ryujinx konnte keine installierte Firmware finden!", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx konnte die zu verfügung gestellte Firmware nicht analysieren. Ein möglicher Grund dafür sind veraltete keys.", - "UserErrorApplicationNotFoundDescription": "Ryujinx konnte keine valide Anwendung an dem gegeben Pfad finden.", - "UserErrorUnknownDescription": "Ein unbekannter Fehler ist aufgetreten!", - "UserErrorUndefinedDescription": "Ein undefinierter Fehler ist aufgetreten! Dies sollte nicht passieren. Bitte kontaktiere einen Entwickler!", - "OpenSetupGuideMessage": "Öffne den 'Setup Guide'", - "NoUpdate": "Kein Update", - "TitleUpdateVersionLabel": "Version {0} - {1}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - Info", - "RyujinxConfirm": "Ryujinx - Bestätigung", - "FileDialogAllTypes": "Alle Typen", - "Never": "Niemals", - "SwkbdMinCharacters": "Muss mindestens {0} Zeichen lang sein", - "SwkbdMinRangeCharacters": "Muss {0}-{1} Zeichen lang sein", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Software-Tastatur", - "SoftwareKeyboardModeNumeric": "Darf nur 0-9 oder \".\" sein", - "SoftwareKeyboardModeAlphabet": "Keine CJK-Zeichen", - "SoftwareKeyboardModeASCII": "Nur ASCII-Text", - "ControllerAppletControllers": "Unterstützte Controller:", - "ControllerAppletPlayers": "Spieler:", - "ControllerAppletDescription": "Ihre aktuelle Konfiguration ist ungültig. Öffnen Sie die Einstellungen und konfigurieren Sie Ihre Eingaben neu.", - "ControllerAppletDocked": "Andockmodus gesetzt. Handheld-Steuerung sollte deaktiviert worden sein.", - "UpdaterRenaming": "Alte Dateien umbenennen...", - "UpdaterRenameFailed": "Der Updater konnte die folgende Datei nicht umbenennen: {0}", - "UpdaterAddingFiles": "Neue Dateien hinzufügen...", - "UpdaterExtracting": "Update extrahieren...", - "UpdaterDownloading": "Update herunterladen...", - "Docked": "Docked", - "Handheld": "Handheld", - "ConnectionError": "Verbindungsfehler.", - "AboutPageDeveloperListMore": "{0} und mehr...", - "ApiError": "API Fehler.", - "LoadingHeading": "{0} wird gestartet", - "CompilingPPTC": "PTC wird kompiliert", - "CompilingShaders": "Shader werden kompiliert", - "AllKeyboards": "Alle Tastaturen", - "OpenFileDialogTitle": "Wähle eine unterstützte Datei", - "OpenFolderDialogTitle": "Wähle einen Ordner mit einem entpackten Spiel", - "AllSupportedFormats": "Alle unterstützten Formate", - "RyujinxUpdater": "Ryujinx - Updater", - "SettingsTabHotkeys": "Tastatur-Hotkeys", - "SettingsTabHotkeysHotkeys": "Tastatur-Hotkeys", - "SettingsTabHotkeysToggleVsyncHotkey": "VSync:", - "SettingsTabHotkeysScreenshotHotkey": "Screenshot:", - "SettingsTabHotkeysShowUiHotkey": "Zeige UI:", - "SettingsTabHotkeysPauseHotkey": "Pausieren:", - "SettingsTabHotkeysToggleMuteHotkey": "Stummschalten:", - "ControllerMotionTitle": "Bewegungssteuerung - Einstellungen", - "ControllerRumbleTitle": "Vibration - Einstellungen", - "SettingsSelectThemeFileDialogTitle": "Wähle ein Design für die Emulator-Benutzeroberfläche", - "SettingsXamlThemeFile": "Xaml Design-Datei", - "AvatarWindowTitle": "Profile verwalten - Avatar", - "Amiibo": "Amiibo", - "Unknown": "Unbekannt", - "Usage": "Nutzung", - "Writable": "Beschreibbar", - "SelectDlcDialogTitle": "DLC-Dateien auswählen", - "SelectUpdateDialogTitle": "Update-Datei auswählen", - "SelectModDialogTitle": "Mod-Ordner auswählen", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "Benutzerprofile verwalten", - "CheatWindowTitle": "Spiel-Cheats verwalten", - "DlcWindowTitle": "Spiel-DLC verwalten", - "ModWindowTitle": "Manage Mods for {0} ({1})", - "UpdateWindowTitle": "Spiel-Updates verwalten", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} new update(s) added", - "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.", - "CheatWindowHeading": "Cheats verfügbar für {0} [{1}]", - "DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.", - "BuildId": "BuildId:", - "DlcWindowHeading": "DLC verfügbar für {0} [{1}]", - "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} new update(s) added", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "{0} Mod(s)", - "UserProfilesEditProfile": "Profil bearbeiten", - "Continue": "Continue", - "Cancel": "Abbrechen", - "Save": "Speichern", - "Discard": "Verwerfen", - "Paused": "Pausiert", - "UserProfilesSetProfileImage": "Profilbild einrichten", - "UserProfileEmptyNameError": "Name ist erforderlich", - "UserProfileNoImageError": "Bitte ein Profilbild auswählen", - "GameUpdateWindowHeading": "Update verfügbar für {0} [{1}]", - "SettingsTabHotkeysResScaleUpHotkey": "Auflösung erhöhen:", - "SettingsTabHotkeysResScaleDownHotkey": "Auflösung verringern:", - "UserProfilesName": "Name:", - "UserProfilesUserId": "Benutzer-ID:", - "SettingsTabGraphicsBackend": "Grafik-Backend:", - "SettingsTabGraphicsBackendTooltip": "Wählen Sie das Grafik-Backend, das im Emulator verwendet werden soll.\n\nVulkan ist insgesamt besser für alle modernen Grafikkarten geeignet, sofern deren Treiber auf dem neuesten Stand sind. Vulkan bietet auch eine schnellere Shader-Kompilierung (weniger Stottern) auf allen GPU-Anbietern.\n\nOpenGL kann auf alten Nvidia-GPUs, alten AMD-GPUs unter Linux oder auf GPUs mit geringerem VRAM bessere Ergebnisse erzielen, obwohl die Shader-Kompilierung stärker stottert.\n\nSetzen Sie auf Vulkan, wenn Sie unsicher sind. Stellen Sie OpenGL ein, wenn Ihr Grafikprozessor selbst mit den neuesten Grafiktreibern Vulkan nicht unterstützt.", - "SettingsEnableTextureRecompression": "Textur-Rekompression", - "SettingsEnableTextureRecompressionTooltip": "Komprimiert ASTC-Texturen, um die VRAM-Nutzung zu reduzieren.\n\nZu den Spielen, die dieses Texturformat verwenden, gehören Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder und The Legend of Zelda: Tears of the Kingdom.\n\nGrafikkarten mit 4GiB VRAM oder weniger werden beim Ausführen dieser Spiele wahrscheinlich irgendwann abstürzen.\n\nAktivieren Sie diese Option nur, wenn Ihnen bei den oben genannten Spielen der VRAM ausgeht. Lassen Sie es aus, wenn Sie unsicher sind.", - "SettingsTabGraphicsPreferredGpu": "Bevorzugte GPU:", - "SettingsTabGraphicsPreferredGpuTooltip": "Wähle die Grafikkarte aus, die mit dem Vulkan Grafik-Backend verwendet werden soll.\n\nDies hat keinen Einfluss auf die GPU die OpenGL verwendet.\n\nIm Zweifelsfall die als \"dGPU\" gekennzeichnete GPU auswählen. Diese Einstellung unberührt lassen, wenn keine zur Auswahl steht.", - "SettingsAppRequiredRestartMessage": "Ein Neustart von Ryujinx ist erforderlich", - "SettingsGpuBackendRestartMessage": "Das Grafik-Backend oder die Grafikkarteneinstellungen wurden geändert. Ein Neustart ist erforderlich um diese Einstellungen anzuwenden.", - "SettingsGpuBackendRestartSubMessage": "Ryujinx jetzt neu starten?", - "RyujinxUpdaterMessage": "Möchtest du Ryujinx auf die neueste Version aktualisieren?", - "SettingsTabHotkeysVolumeUpHotkey": "Lautstärke erhöhen:", - "SettingsTabHotkeysVolumeDownHotkey": "Lautstärke verringern:", - "SettingsEnableMacroHLE": "HLE Makros aktivieren", - "SettingsEnableMacroHLETooltip": "High-Level-Emulation von GPU-Makrocode.\n\nVerbessert die Leistung, kann aber in einigen Spielen zu Grafikfehlern führen.\n\nBei Unsicherheit AKTIVIEREN.", - "SettingsEnableColorSpacePassthrough": "Farbraum Passthrough", - "SettingsEnableColorSpacePassthroughTooltip": "Weist das Vulkan-Backend an, Farbinformationen ohne Angabe eines Farbraums weiterzuleiten. Für Benutzer mit Wide-Gamut-Displays kann dies zu lebendigeren Farben führen, allerdings auf Kosten der Farbkorrektheit.", - "VolumeShort": "Vol", - "UserProfilesManageSaves": "Speicherstände verwalten", - "DeleteUserSave": "Möchtest du den Spielerstand für dieses Spiel löschen?", - "IrreversibleActionNote": "Diese Option kann nicht rückgängig gemacht werden.", - "SaveManagerHeading": "Spielstände für {0} verwalten", - "SaveManagerTitle": "Speicherdaten Manager", - "Name": "Name", - "Size": "Größe", - "Search": "Suche", - "UserProfilesRecoverLostAccounts": "Konto wiederherstellen", - "Recover": "Wiederherstellen", - "UserProfilesRecoverHeading": "Speicherstände wurden für die folgenden Konten gefunden", - "UserProfilesRecoverEmptyList": "Keine Profile zum Wiederherstellen", - "GraphicsAATooltip": "Wendet Anti-Aliasing auf das Rendering des Spiels an.\n\nFXAA verwischt den größten Teil des Bildes, während SMAA versucht, gezackte Kanten zu finden und sie zu glätten.\n\nEs wird nicht empfohlen, diese Option in Verbindung mit dem FSR-Skalierungsfilter zu verwenden.\n\nDiese Option kann geändert werden, während ein Spiel läuft, indem Sie unten auf \"Anwenden\" klicken; Sie können das Einstellungsfenster einfach zur Seite schieben und experimentieren, bis Sie Ihr bevorzugtes Aussehen für ein Spiel gefunden haben.\n\nLassen Sie die Option auf NONE, wenn Sie unsicher sind.", - "GraphicsAALabel": "Antialiasing:", - "GraphicsScalingFilterLabel": "Skalierungsfilter:", - "GraphicsScalingFilterTooltip": "Wählen Sie den Skalierungsfilter, der bei der Auflösungsskalierung angewendet werden soll.\n\nBilinear eignet sich gut für 3D-Spiele und ist eine sichere Standardoption.\n\nNearest wird für Pixel-Art-Spiele empfohlen.\n\nFSR 1.0 ist lediglich ein Schärfungsfilter und wird nicht für die Verwendung mit FXAA oder SMAA empfohlen.\n\nDiese Option kann geändert werden, während ein Spiel läuft, indem Sie unten auf \"Anwenden\" klicken; Sie können das Einstellungsfenster einfach zur Seite schieben und experimentieren, bis Sie Ihr bevorzugtes Aussehen für ein Spiel gefunden haben.\n\nBleiben Sie auf BILINEAR, wenn Sie unsicher sind.", - "GraphicsScalingFilterBilinear": "Bilinear", - "GraphicsScalingFilterNearest": "Nächstes", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "Stufe", - "GraphicsScalingFilterLevelTooltip": "FSR 1.0 Schärfelevel festlegen. Höher ist schärfer.", - "SmaaLow": "SMAA Niedrig", - "SmaaMedium": "SMAA Mittel", - "SmaaHigh": "SMAA Hoch", - "SmaaUltra": "SMAA Ultra", - "UserEditorTitle": "Nutzer bearbeiten", - "UserEditorTitleCreate": "Nutzer erstellen", - "SettingsTabNetworkInterface": "Netzwerkschnittstelle:", - "NetworkInterfaceTooltip": "Die für LAN/LDN-Funktionen verwendete Netzwerkschnittstelle.\n\nIn Verbindung mit einem VPN oder XLink Kai und einem Spiel mit LAN-Unterstützung kann eine Verbindung mit demselben Netzwerk über das Internet vorgetäuscht werden.\n\nIm Zweifelsfall auf DEFAULT belassen.", - "NetworkInterfaceDefault": "Standard", - "PackagingShaders": "Verpackt Shader", - "AboutChangelogButton": "Changelog in GitHub öffnen", - "AboutChangelogButtonTooltipMessage": "Klicke hier, um das Changelog für diese Version in Ihrem Standardbrowser zu öffnen.", - "SettingsTabNetworkMultiplayer": "Mehrspieler", - "MultiplayerMode": "Modus:", - "MultiplayerModeTooltip": "Ändert den LDN-Mehrspielermodus.\n\nLdnMitm ändert die lokale drahtlose/lokale Spielfunktionalität in Spielen so, dass sie wie ein LAN funktioniert und lokale, netzwerkgleiche Verbindungen mit anderen Ryujinx-Instanzen und gehackten Nintendo Switch-Konsolen ermöglicht, auf denen das ldn_mitm-Modul installiert ist.\n\nMultiplayer erfordert, dass alle Spieler die gleiche Spielversion verwenden (d.h. Super Smash Bros. Ultimate v13.0.1 kann sich nicht mit v13.0.0 verbinden).\n\nIm Zweifelsfall auf DISABLED lassen.", - "MultiplayerModeDisabled": "Deaktiviert", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/el_GR.json b/src/Ryujinx/Assets/Locales/el_GR.json deleted file mode 100644 index 0409297ac..000000000 --- a/src/Ryujinx/Assets/Locales/el_GR.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "Ελληνικά", - "MenuBarFileOpenApplet": "Άνοιγμα Applet", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Άνοιγμα του Mii Editor Applet σε Αυτόνομη λειτουργία", - "SettingsTabInputDirectMouseAccess": "Άμεση Πρόσβαση Ποντικιού", - "SettingsTabSystemMemoryManagerMode": "Λειτουργία Διαχείρισης Μνήμης:", - "SettingsTabSystemMemoryManagerModeSoftware": "Λογισμικό", - "SettingsTabSystemMemoryManagerModeHost": "Υπολογιστής (γρήγορο)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Χωρίς Ελέγχους (γρηγορότερο, μη ασφαλές)", - "SettingsTabSystemUseHypervisor": "Χρήση Hypervisor", - "MenuBarFile": "_Αρχείο", - "MenuBarFileOpenFromFile": "_Φόρτωση Αρχείου Εφαρμογής", - "MenuBarFileOpenFromFileError": "No applications found in selected file.", - "MenuBarFileOpenUnpacked": "Φόρτωση Απακετάριστου _Παιχνιδιού", - "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder", - "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder", - "MenuBarFileOpenEmuFolder": "Άνοιγμα Φακέλου Ryujinx", - "MenuBarFileOpenLogsFolder": "Άνοιγμα Φακέλου Καταγραφής", - "MenuBarFileExit": "_Έξοδος", - "MenuBarOptions": "_Επιλογές", - "MenuBarOptionsToggleFullscreen": "Λειτουργία Πλήρους Οθόνης", - "MenuBarOptionsStartGamesInFullscreen": "Εκκίνηση Παιχνιδιών σε Πλήρη Οθόνη", - "MenuBarOptionsStopEmulation": "Διακοπή Εξομοίωσης", - "MenuBarOptionsSettings": "_Ρυθμίσεις", - "MenuBarOptionsManageUserProfiles": "Διαχείριση Προφίλ _Χρηστών", - "MenuBarActions": "_Δράσεις", - "MenuBarOptionsSimulateWakeUpMessage": "Προσομοίωση Μηνύματος Αφύπνισης", - "MenuBarActionsScanAmiibo": "Σάρωση Amiibo", - "MenuBarTools": "_Εργαλεία", - "MenuBarToolsInstallFirmware": "Εγκατάσταση Firmware", - "MenuBarFileToolsInstallFirmwareFromFile": "Εγκατάσταση Firmware από XCI ή ZIP", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Εγκατάσταση Firmware από τοποθεσία", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "Διαχείριση τύπων αρχείων", - "MenuBarToolsInstallFileTypes": "Εγκαταστήσετε τύπους αρχείων.", - "MenuBarToolsUninstallFileTypes": "Απεγκαταστήσετε τύπους αρχείων", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_View", - "MenuBarViewWindow": "Window Size", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Βοήθεια", - "MenuBarHelpCheckForUpdates": "Έλεγχος για Ενημερώσεις", - "MenuBarHelpAbout": "Σχετικά με", - "MenuSearch": "Αναζήτηση...", - "GameListHeaderFavorite": "Αγαπημένο", - "GameListHeaderIcon": "Εικονίδιο", - "GameListHeaderApplication": "Όνομα", - "GameListHeaderDeveloper": "Προγραμματιστής", - "GameListHeaderVersion": "Έκδοση", - "GameListHeaderTimePlayed": "Χρόνος", - "GameListHeaderLastPlayed": "Παίχτηκε", - "GameListHeaderFileExtension": "Κατάληξη", - "GameListHeaderFileSize": "Μέγεθος Αρχείου", - "GameListHeaderPath": "Τοποθεσία", - "GameListContextMenuOpenUserSaveDirectory": "Άνοιγμα Τοποθεσίας Αποθήκευσης Χρήστη", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Ανοίγει την τοποθεσία που περιέχει την Αποθήκευση Χρήστη της εφαρμογής", - "GameListContextMenuOpenDeviceSaveDirectory": "Άνοιγμα Τοποθεσίας Συσκευής Χρήστη", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Ανοίγει την τοποθεσία που περιέχει την Αποθήκευση Συσκευής της εφαρμογής", - "GameListContextMenuOpenBcatSaveDirectory": "Άνοιγμα Τοποθεσίας BCAT", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Ανοίγει την τοποθεσία που περιέχει την Αποθήκευση BCAT της εφαρμογής", - "GameListContextMenuManageTitleUpdates": "Διαχείριση Ενημερώσεων Παιχνιδιού", - "GameListContextMenuManageTitleUpdatesToolTip": "Ανοίγει το παράθυρο διαχείρισης Ενημερώσεων Παιχνιδιού", - "GameListContextMenuManageDlc": "Διαχείριση DLC", - "GameListContextMenuManageDlcToolTip": "Ανοίγει το παράθυρο διαχείρισης DLC", - "GameListContextMenuCacheManagement": "Διαχείριση Προσωρινής Μνήμης", - "GameListContextMenuCacheManagementPurgePptc": "Εκκαθάριση Προσωρινής Μνήμης PPTC", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Διαγράφει την προσωρινή μνήμη PPTC της εφαρμογής", - "GameListContextMenuCacheManagementPurgeShaderCache": "Εκκαθάριση Προσωρινής Μνήμης Shader", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Διαγράφει την προσωρινή μνήμη Shader της εφαρμογής", - "GameListContextMenuCacheManagementOpenPptcDirectory": "Άνοιγμα Τοποθεσίας PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Ανοίγει την τοποθεσία που περιέχει τη προσωρινή μνήμη PPTC της εφαρμογής", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Άνοιγμα τοποθεσίας προσωρινής μνήμης Shader", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Ανοίγει την τοποθεσία που περιέχει την προσωρινή μνήμη Shader της εφαρμογής", - "GameListContextMenuExtractData": "Εξαγωγή Δεδομένων", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Εξαγωγή της ενότητας ExeFS από την τρέχουσα διαμόρφωση της εφαρμογής (συμπεριλαμβανομένου ενημερώσεων)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Εξαγωγή της ενότητας RomFS από την τρέχουσα διαμόρφωση της εφαρμογής (συμπεριλαμβανομένου ενημερώσεων)", - "GameListContextMenuExtractDataLogo": "Λογότυπο", - "GameListContextMenuExtractDataLogoToolTip": "Εξαγωγή της ενότητας Logo από την τρέχουσα διαμόρφωση της εφαρμογής (συμπεριλαμβανομένου ενημερώσεων)", - "GameListContextMenuCreateShortcut": "Δημιουργία Συντόμευσης Εφαρμογής", - "GameListContextMenuCreateShortcutToolTip": "Δημιουργία συντόμευσης επιφάνειας εργασίας που ανοίγει την επιλεγμένη εφαρμογή", - "GameListContextMenuCreateShortcutToolTipMacOS": "Create a shortcut in macOS's Applications folder that launches the selected Application", - "GameListContextMenuOpenModsDirectory": "Open Mods Directory", - "GameListContextMenuOpenModsDirectoryToolTip": "Opens the directory which contains Application's Mods", - "GameListContextMenuOpenSdModsDirectory": "Open Atmosphere Mods Directory", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} Φορτωμένα Παιχνίδια", - "StatusBarSystemVersion": "Έκδοση Συστήματος: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Εντοπίστηκε χαμηλό όριο για αντιστοιχίσεις μνήμης", - "LinuxVmMaxMapCountDialogTextPrimary": "Θα θέλατε να αυξήσετε την τιμή του vm.max_map_count σε {0}", - "LinuxVmMaxMapCountDialogTextSecondary": "Μερικά παιχνίδια μπορεί να προσπαθήσουν να δημιουργήσουν περισσότερες αντιστοιχίσεις μνήμης από αυτές που επιτρέπονται τώρα. Ο Ryujinx θα καταρρεύσει μόλις ξεπεραστεί αυτό το όριο.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Ναι, μέχρι την επόμενη επανεκκίνηση", - "LinuxVmMaxMapCountDialogButtonPersistent": "Ναι, μόνιμα", - "LinuxVmMaxMapCountWarningTextPrimary": "Ο μέγιστος αριθμός αντιστοιχίσεων μνήμης είναι μικρότερος από τον συνιστώμενο.", - "LinuxVmMaxMapCountWarningTextSecondary": "Η τρέχουσα τιμή του vm.max_map_count ({0}) είναι χαμηλότερη από {1}. Ορισμένα παιχνίδια μπορεί να προσπαθήσουν να δημιουργήσουν περισσότερες αντιστοιχίσεις μνήμης από αυτές που επιτρέπονται τώρα. Ο Ryujinx θα συντριβεί μόλις ξεπεραστεί το όριο.\n\nΜπορεί να θέλετε είτε να αυξήσετε χειροκίνητα το όριο ή να εγκαταστήσετε το pkexec, το οποίο επιτρέπει Ryujinx να βοηθήσει με αυτό.", - "Settings": "Ρυθμίσεις", - "SettingsTabGeneral": "Εμφάνιση", - "SettingsTabGeneralGeneral": "Γενικά", - "SettingsTabGeneralEnableDiscordRichPresence": "Ενεργοποίηση Εμπλουτισμένης Παρουσίας Discord", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Έλεγχος για Ενημερώσεις στην Εκκίνηση", - "SettingsTabGeneralShowConfirmExitDialog": "Εμφάνιση διαλόγου \"Επιβεβαίωση Εξόδου\".", - "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "Απόκρυψη Κέρσορα:", - "SettingsTabGeneralHideCursorNever": "Ποτέ", - "SettingsTabGeneralHideCursorOnIdle": "Απόκρυψη Δρομέα στην Αδράνεια", - "SettingsTabGeneralHideCursorAlways": "Πάντα", - "SettingsTabGeneralGameDirectories": "Τοποθεσίες παιχνιδιών", - "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "Προσθήκη", - "SettingsTabGeneralRemove": "Αφαίρεση", - "SettingsTabSystem": "Σύστημα", - "SettingsTabSystemCore": "Πυρήνας", - "SettingsTabSystemSystemRegion": "Περιοχή Συστήματος:", - "SettingsTabSystemSystemRegionJapan": "Ιαπωνία", - "SettingsTabSystemSystemRegionUSA": "ΗΠΑ", - "SettingsTabSystemSystemRegionEurope": "Ευρώπη", - "SettingsTabSystemSystemRegionAustralia": "Αυστραλία", - "SettingsTabSystemSystemRegionChina": "Κίνα", - "SettingsTabSystemSystemRegionKorea": "Κορέα", - "SettingsTabSystemSystemRegionTaiwan": "Ταϊβάν", - "SettingsTabSystemSystemLanguage": "Γλώσσα Συστήματος:", - "SettingsTabSystemSystemLanguageJapanese": "Ιαπωνικά", - "SettingsTabSystemSystemLanguageAmericanEnglish": "Αμερικάνικα Αγγλικά", - "SettingsTabSystemSystemLanguageFrench": "Γαλλικά", - "SettingsTabSystemSystemLanguageGerman": "Γερμανικά", - "SettingsTabSystemSystemLanguageItalian": "Ιταλικά", - "SettingsTabSystemSystemLanguageSpanish": "Ισπανικά", - "SettingsTabSystemSystemLanguageChinese": "Κινέζικα", - "SettingsTabSystemSystemLanguageKorean": "Κορεάτικα", - "SettingsTabSystemSystemLanguageDutch": "Ολλανδικά", - "SettingsTabSystemSystemLanguagePortuguese": "Πορτογαλικά", - "SettingsTabSystemSystemLanguageRussian": "Ρώσικα", - "SettingsTabSystemSystemLanguageTaiwanese": "Ταϊβανέζικα", - "SettingsTabSystemSystemLanguageBritishEnglish": "Βρετανικά Αγγλικά", - "SettingsTabSystemSystemLanguageCanadianFrench": "Καναδικά Γαλλικά", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Λατινοαμερικάνικα Ισπανικά", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Απλοποιημένα Κινέζικα", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Παραδοσιακά Κινεζικά", - "SettingsTabSystemSystemTimeZone": "Ζώνη Ώρας Συστήματος:", - "SettingsTabSystemSystemTime": "Ώρα Συστήματος:", - "SettingsTabSystemEnableVsync": "Ενεργοποίηση Κατακόρυφου Συγχρονισμού", - "SettingsTabSystemEnablePptc": "Ενεργοποίηση PPTC (Profiled Persistent Translation Cache)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "Ενεργοποίηση Ελέγχων Ακεραιότητας FS", - "SettingsTabSystemAudioBackend": "Backend Ήχου:", - "SettingsTabSystemAudioBackendDummy": "Απενεργοποιημένο", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "Μικροδιορθώσεις", - "SettingsTabSystemHacksNote": " (Μπορεί να προκαλέσουν αστάθεια)", - "SettingsTabSystemDramSize": "Μέγεθος DRAM:", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "Αγνόηση υπηρεσιών που λείπουν", - "SettingsTabSystemIgnoreApplet": "Αγνοήστε το Applet", - "SettingsTabGraphics": "Γραφικά", - "SettingsTabGraphicsAPI": "API Γραφικά", - "SettingsTabGraphicsEnableShaderCache": "Ενεργοποίηση Προσωρινής Μνήμης Shader", - "SettingsTabGraphicsAnisotropicFiltering": "Ανισότροπο Φιλτράρισμα:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Αυτόματο", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "Κλίμακα Ανάλυσης:", - "SettingsTabGraphicsResolutionScaleCustom": "Προσαρμοσμένο (Δεν συνιστάται)", - "SettingsTabGraphicsResolutionScaleNative": "Εγγενής (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Not recommended)", - "SettingsTabGraphicsAspectRatio": "Αναλογία Απεικόνισης:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "Έκταση σε όλο το παράθυρο", - "SettingsTabGraphicsDeveloperOptions": "Επιλογές Προγραμματιστή", - "SettingsTabGraphicsShaderDumpPath": "Τοποθεσία Shaders Γραφικών:", - "SettingsTabLogging": "Καταγραφή", - "SettingsTabLoggingLogging": "Καταγραφή", - "SettingsTabLoggingEnableLoggingToFile": "Ενεργοποίηση Καταγραφής Αρχείου", - "SettingsTabLoggingEnableStubLogs": "Ενεργοποίηση Καταγραφής Stub", - "SettingsTabLoggingEnableInfoLogs": "Ενεργοποίηση Καταγραφής Πληροφοριών", - "SettingsTabLoggingEnableWarningLogs": "Ενεργοποίηση Καταγραφής Προειδοποίησης", - "SettingsTabLoggingEnableErrorLogs": "Ενεργοποίηση Καταγραφής Σφαλμάτων", - "SettingsTabLoggingEnableTraceLogs": "Ενεργοποίηση Καταγραφής Ιχνών", - "SettingsTabLoggingEnableGuestLogs": "Ενεργοποίηση Καταγραφής Επισκεπτών", - "SettingsTabLoggingEnableFsAccessLogs": "Ενεργοποίηση Καταγραφής Πρόσβασης FS", - "SettingsTabLoggingFsGlobalAccessLogMode": "Λειτουργία Καταγραφής Καθολικής Πρόσβασης FS:", - "SettingsTabLoggingDeveloperOptions": "Επιλογές Προγραμματιστή (ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η απόδοση Θα μειωθεί)", - "SettingsTabLoggingDeveloperOptionsNote": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Θα μειώσει την απόδοση", - "SettingsTabLoggingGraphicsBackendLogLevel": "Επίπεδο Καταγραφής Διεπαφής Γραφικών:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "Κανένα", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Σφάλμα", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Επιβραδύνσεις", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "Όλα", - "SettingsTabLoggingEnableDebugLogs": "Ενεργοποίηση Αρχείων Καταγραφής Εντοπισμού Σφαλμάτων", - "SettingsTabInput": "Χειρισμός", - "SettingsTabInputEnableDockedMode": "Ενεργοποίηση Docked Mode", - "SettingsTabInputDirectKeyboardAccess": "Άμεση Πρόσβαση στο Πληκτρολόγιο", - "SettingsButtonSave": "Αποθήκευση", - "SettingsButtonClose": "Κλείσιμο", - "SettingsButtonOk": "ΟΚ", - "SettingsButtonCancel": "Ακύρωση", - "SettingsButtonApply": "Εφαρμογή", - "ControllerSettingsPlayer": "Παίχτης", - "ControllerSettingsPlayer1": "Παίχτης 1", - "ControllerSettingsPlayer2": "Παίχτης 2", - "ControllerSettingsPlayer3": "Παίχτης 3", - "ControllerSettingsPlayer4": "Παίχτης 4", - "ControllerSettingsPlayer5": "Παίχτης 5", - "ControllerSettingsPlayer6": "Παίχτης 6", - "ControllerSettingsPlayer7": "Παίχτης 7", - "ControllerSettingsPlayer8": "Παίχτης 8", - "ControllerSettingsHandheld": "Χειροκίνητο", - "ControllerSettingsInputDevice": "Συσκευή Χειρισμού", - "ControllerSettingsRefresh": "Ανανέωση", - "ControllerSettingsDeviceDisabled": "Απενεργοποιημένο", - "ControllerSettingsControllerType": "Τύπος Χειριστηρίου", - "ControllerSettingsControllerTypeHandheld": "Φορητό", - "ControllerSettingsControllerTypeProController": "Pro Controller", - "ControllerSettingsControllerTypeJoyConPair": "Ζεύγος JoyCon", - "ControllerSettingsControllerTypeJoyConLeft": "Αριστερό JoyCon", - "ControllerSettingsControllerTypeJoyConRight": "Δεξί JoyCon", - "ControllerSettingsProfile": "Προφίλ", - "ControllerSettingsProfileDefault": "Προκαθορισμένο", - "ControllerSettingsLoad": "Φόρτωση", - "ControllerSettingsAdd": "Προσθήκη", - "ControllerSettingsRemove": "Αφαίρεση", - "ControllerSettingsButtons": "Κουμπιά", - "ControllerSettingsButtonA": "Α", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Κατευθυντικό Pad", - "ControllerSettingsDPadUp": "Πάνω", - "ControllerSettingsDPadDown": "Κάτω", - "ControllerSettingsDPadLeft": "Αριστερά", - "ControllerSettingsDPadRight": "Δεξιά", - "ControllerSettingsStickButton": "Κουμπί", - "ControllerSettingsStickUp": "Πάνω", - "ControllerSettingsStickDown": "Κάτω", - "ControllerSettingsStickLeft": "Αριστερά", - "ControllerSettingsStickRight": "Δεξιά", - "ControllerSettingsStickStick": "Μοχλός", - "ControllerSettingsStickInvertXAxis": "Αντιστροφή Μοχλού X", - "ControllerSettingsStickInvertYAxis": "Αντιστροφή Μοχλού Y", - "ControllerSettingsStickDeadzone": "Νεκρή Ζώνη:", - "ControllerSettingsLStick": "Αριστερός Μοχλός", - "ControllerSettingsRStick": "Δεξιός Μοχλός", - "ControllerSettingsTriggersLeft": "Αριστερή Σκανδάλη", - "ControllerSettingsTriggersRight": "Δεξιά Σκανδάλη", - "ControllerSettingsTriggersButtonsLeft": "Αριστερά Κουμπιά Σκανδάλης", - "ControllerSettingsTriggersButtonsRight": "Δεξιά Κουμπιά Σκανδάλης", - "ControllerSettingsTriggers": "Σκανδάλες", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Αριστερά Κουμπιά", - "ControllerSettingsExtraButtonsRight": "Δεξιά Κουμπιά", - "ControllerSettingsMisc": "Διάφορα", - "ControllerSettingsTriggerThreshold": "Κατώφλι Σκανδάλης:", - "ControllerSettingsMotion": "Κίνηση", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Κίνηση συμβατή με CemuHook", - "ControllerSettingsMotionControllerSlot": "Υποδοχή Χειριστηρίου:", - "ControllerSettingsMotionMirrorInput": "Καθρεπτισμός Χειρισμού", - "ControllerSettingsMotionRightJoyConSlot": "Δεξιά Υποδοχή JoyCon:", - "ControllerSettingsMotionServerHost": "Κεντρικός Υπολογιστής Διακομιστή:", - "ControllerSettingsMotionGyroSensitivity": "Ευαισθησία Γυροσκοπίου:", - "ControllerSettingsMotionGyroDeadzone": "Νεκρή Ζώνη Γυροσκοπίου:", - "ControllerSettingsSave": "Αποθήκευση", - "ControllerSettingsClose": "Κλείσιμο", - "KeyUnknown": "Unknown", - "KeyShiftLeft": "Shift Left", - "KeyShiftRight": "Shift Right", - "KeyControlLeft": "Ctrl Left", - "KeyMacControlLeft": "⌃ Left", - "KeyControlRight": "Ctrl Right", - "KeyMacControlRight": "⌃ Right", - "KeyAltLeft": "Alt Left", - "KeyMacAltLeft": "⌥ Left", - "KeyAltRight": "Alt Right", - "KeyMacAltRight": "⌥ Right", - "KeyWinLeft": "⊞ Left", - "KeyMacWinLeft": "⌘ Left", - "KeyWinRight": "⊞ Right", - "KeyMacWinRight": "⌘ Right", - "KeyMenu": "Menu", - "KeyUp": "Up", - "KeyDown": "Down", - "KeyLeft": "Left", - "KeyRight": "Right", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Right", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Left Trigger 0", - "GamepadSingleRightTrigger0": "Right Trigger 0", - "GamepadSingleLeftTrigger1": "Left Trigger 1", - "GamepadSingleRightTrigger1": "Right Trigger 1", - "StickLeft": "Left Stick", - "StickRight": "Right Stick", - "UserProfilesSelectedUserProfile": "Επιλεγμένο Προφίλ Χρήστη:", - "UserProfilesSaveProfileName": "Αποθήκευση Ονόματος Προφίλ", - "UserProfilesChangeProfileImage": "Αλλαγή Εικόνας Προφίλ", - "UserProfilesAvailableUserProfiles": "Διαθέσιμα Προφίλ Χρηστών:", - "UserProfilesAddNewProfile": "Προσθήκη Νέου Προφίλ", - "UserProfilesDelete": "Διαγράφω", - "UserProfilesClose": "Κλείσιμο", - "ProfileNameSelectionWatermark": "Επιλέξτε ψευδώνυμο", - "ProfileImageSelectionTitle": "Επιλογή Εικόνας Προφίλ", - "ProfileImageSelectionHeader": "Επιλέξτε μία Εικόνα Προφίλ", - "ProfileImageSelectionNote": "Μπορείτε να εισαγάγετε μία προσαρμοσμένη εικόνα προφίλ ή να επιλέξετε ένα avatar από το Firmware", - "ProfileImageSelectionImportImage": "Εισαγωγή Αρχείου Εικόνας", - "ProfileImageSelectionSelectAvatar": "Επιλέξτε Avatar από Firmware", - "InputDialogTitle": "Διάλογος Εισαγωγής", - "InputDialogOk": "ΟΚ", - "InputDialogCancel": "Ακύρωση", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "Επιλογή Ονόματος Προφίλ", - "InputDialogAddNewProfileHeader": "Εισαγωγή Ονόματος Προφίλ", - "InputDialogAddNewProfileSubtext": "(Σύνολο Χαρακτήρων: {0})", - "AvatarChoose": "Επιλογή", - "AvatarSetBackgroundColor": "Ορισμός Χρώματος Φόντου", - "AvatarClose": "Κλείσιμο", - "ControllerSettingsLoadProfileToolTip": "Φόρτωση Προφίλ", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "Προσθήκη Προφίλ", - "ControllerSettingsRemoveProfileToolTip": "Κατάργηση Προφίλ", - "ControllerSettingsSaveProfileToolTip": "Αποθήκευση Προφίλ", - "MenuBarFileToolsTakeScreenshot": "Λήψη Στιγμιότυπου", - "MenuBarFileToolsHideUi": "Απόκρυψη UI", - "GameListContextMenuRunApplication": "Εκτέλεση Εφαρμογής", - "GameListContextMenuToggleFavorite": "Εναλλαγή Αγαπημένου", - "GameListContextMenuToggleFavoriteToolTip": "Εναλλαγή της Κατάστασης Αγαπημένο του Παιχνιδιού", - "SettingsTabGeneralTheme": "Theme:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "Dark", - "SettingsTabGeneralThemeLight": "Light", - "ControllerSettingsConfigureGeneral": "Παραμέτρων", - "ControllerSettingsRumble": "Δόνηση", - "ControllerSettingsRumbleStrongMultiplier": "Ισχυρός Πολλαπλασιαστής Δόνησης", - "ControllerSettingsRumbleWeakMultiplier": "Αδύναμος Πολλαπλασιαστής Δόνησης", - "DialogMessageSaveNotAvailableMessage": "Δεν υπάρχουν αποθηκευμένα δεδομένα για το {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "Θέλετε να αποθηκεύσετε δεδομένα για αυτό το παιχνίδι;", - "DialogConfirmationTitle": "Ryujinx - Επιβεβαίωση", - "DialogUpdaterTitle": "Ryujinx - Ενημερωτής", - "DialogErrorTitle": "Ryujinx - Σφάλμα", - "DialogWarningTitle": "Ryujinx - Προειδοποίηση", - "DialogExitTitle": "Ryujinx - Έξοδος", - "DialogErrorMessage": "Το Ryujinx αντιμετώπισε σφάλμα", - "DialogExitMessage": "Είστε βέβαιοι ότι θέλετε να κλείσετε το Ryujinx;", - "DialogExitSubMessage": "Όλα τα μη αποθηκευμένα δεδομένα θα χαθούν!", - "DialogMessageCreateSaveErrorMessage": "Σφάλμα κατά τη δημιουργία των αποθηκευμένων δεδομένων: {0}", - "DialogMessageFindSaveErrorMessage": "Σφάλμα κατά την εύρεση των αποθηκευμένων δεδομένων: {0}", - "FolderDialogExtractTitle": "Επιλέξτε τον φάκελο στον οποίο θέλετε να εξαγάγετε", - "DialogNcaExtractionMessage": "Εξαγωγή ενότητας {0} από {1}...", - "DialogNcaExtractionTitle": "NCA Εξαγωγέας Τμημάτων", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Αποτυχία εξαγωγής. Η κύρια NCA δεν υπήρχε στο επιλεγμένο αρχείο.", - "DialogNcaExtractionCheckLogErrorMessage": "Αποτυχία εξαγωγής. Διαβάστε το αρχείο καταγραφής για περισσότερες πληροφορίες.", - "DialogNcaExtractionSuccessMessage": "Η εξαγωγή ολοκληρώθηκε με επιτυχία.", - "DialogUpdaterConvertFailedMessage": "Αποτυχία μετατροπής της τρέχουσας έκδοσης Ryujinx.", - "DialogUpdaterCancelUpdateMessage": "Ακύρωση Ενημέρωσης!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "Χρησιμοποιείτε ήδη την πιο ενημερωμένη έκδοση του Ryujinx!", - "DialogUpdaterFailedToGetVersionMessage": "Προέκυψε ένα σφάλμα στη λήψη πληροφοριών έκδοσης από τα GitHub Releases. Αυτό δύναται να συμβεί αν μία έκδοση χτίζεται αυτή τη στιγμή στα GitHub Actions. Παρακαλούμε προσπαθήστε αργότερα.", - "DialogUpdaterConvertFailedGithubMessage": "Αποτυχία μετατροπής της ληφθείσας έκδοσης Ryujinx από την έκδοση GitHub.", - "DialogUpdaterDownloadingMessage": "Λήψη Ενημέρωσης...", - "DialogUpdaterExtractionMessage": "Εξαγωγή Ενημέρωσης...", - "DialogUpdaterRenamingMessage": "Μετονομασία Ενημέρωσης...", - "DialogUpdaterAddingFilesMessage": "Προσθήκη Νέας Ενημέρωσης...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "Η Ενημέρωση Ολοκληρώθηκε!", - "DialogUpdaterRestartMessage": "Θέλετε να επανεκκινήσετε το Ryujinx τώρα;", - "DialogUpdaterNoInternetMessage": "Δεν είστε συνδεδεμένοι στο Διαδίκτυο!", - "DialogUpdaterNoInternetSubMessage": "Επαληθεύστε ότι έχετε σύνδεση στο Διαδίκτυο που λειτουργεί!", - "DialogUpdaterDirtyBuildMessage": "Δεν μπορείτε να ενημερώσετε μία Πρόχειρη Έκδοση του Ryujinx!", - "DialogUpdaterDirtyBuildSubMessage": "Κάντε λήψη του Ryujinx στη διεύθυνση https://ryujinx.app/download εάν αναζητάτε μία υποστηριζόμενη έκδοση.", - "DialogRestartRequiredMessage": "Απαιτείται Επανεκκίνηση", - "DialogThemeRestartMessage": "Το θέμα έχει αποθηκευτεί. Απαιτείται επανεκκίνηση για την εφαρμογή του θέματος.", - "DialogThemeRestartSubMessage": "Θέλετε να κάνετε επανεκκίνηση", - "DialogFirmwareInstallEmbeddedMessage": "Θα θέλατε να εγκαταστήσετε το Firmware που είναι ενσωματωμένο σε αυτό το παιχνίδι; (Firmware {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.", - "DialogFirmwareNoFirmwareInstalledMessage": "Δεν έχει εγκατασταθεί Firmware", - "DialogFirmwareInstalledMessage": "Το Firmware {0} εγκαταστάθηκε", - "DialogInstallFileTypesSuccessMessage": "Επιτυχής εγκατάσταση τύπων αρχείων!", - "DialogInstallFileTypesErrorMessage": "Απέτυχε η εγκατάσταση τύπων αρχείων.", - "DialogUninstallFileTypesSuccessMessage": "Επιτυχής απεγκατάσταση τύπων αρχείων!", - "DialogUninstallFileTypesErrorMessage": "Αποτυχία απεγκατάστασης τύπων αρχείων.", - "DialogOpenSettingsWindowLabel": "Άνοιγμα Παραθύρου Ρυθμίσεων", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "Applet Χειρισμού", - "DialogMessageDialogErrorExceptionMessage": "Σφάλμα εμφάνισης του διαλόγου Μηνυμάτων: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Σφάλμα εμφάνισης Λογισμικού Πληκτρολογίου: {0}", - "DialogErrorAppletErrorExceptionMessage": "Σφάλμα εμφάνισης του διαλόγου ErrorApplet: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nΓια πληροφορίες σχετικά με τον τρόπο διόρθωσης του σφάλματος, ακολουθήστε τον Οδηγό Εγκατάστασης.", - "DialogUserErrorDialogTitle": "Σφάλμα Ryujinx ({0})", - "DialogAmiiboApiTitle": "API για Amiibo.", - "DialogAmiiboApiFailFetchMessage": "Παρουσιάστηκε σφάλμα κατά την ανάκτηση πληροφοριών από το API.", - "DialogAmiiboApiConnectErrorMessage": "Δεν είναι δυνατή η σύνδεση με τον διακομιστή Amiibo API. Η υπηρεσία μπορεί να είναι εκτός λειτουργίας ή μπορεί να χρειαστεί να επαληθεύσετε ότι έχετε ενεργή σύνδεσή στο Διαδίκτυο.", - "DialogProfileInvalidProfileErrorMessage": "Το προφίλ {0} δεν είναι συμβατό με το τρέχον σύστημα χειρισμού.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "Το προεπιλεγμένο προφίλ δεν μπορεί να αντικατασταθεί", - "DialogProfileDeleteProfileTitle": "Διαγραφή Προφίλ", - "DialogProfileDeleteProfileMessage": "Αυτή η ενέργεια είναι μη αναστρέψιμη, είστε βέβαιοι ότι θέλετε να συνεχίσετε;", - "DialogWarning": "Προειδοποίηση", - "DialogPPTCDeletionMessage": "Πρόκειται να διαγράψετε την προσωρινή μνήμη PPTC για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;", - "DialogPPTCDeletionErrorMessage": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης PPTC στο {0}: {1}", - "DialogShaderDeletionMessage": "Πρόκειται να διαγράψετε την προσωρινή μνήμη Shader για :\n\n{0}\n\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;", - "DialogShaderDeletionErrorMessage": "Σφάλμα κατά την εκκαθάριση προσωρινής μνήμης Shader στο {0}: {1}", - "DialogRyujinxErrorMessage": "Το Ryujinx αντιμετώπισε σφάλμα", - "DialogInvalidTitleIdErrorMessage": "Σφάλμα UI: Το επιλεγμένο παιχνίδι δεν έχει έγκυρο αναγνωριστικό τίτλου", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Δεν βρέθηκε έγκυρο Firmware συστήματος στο {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Εγκατάσταση Firmware {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "Θα εγκατασταθεί η έκδοση συστήματος {0}.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nΑυτό θα αντικαταστήσει την τρέχουσα έκδοση συστήματος {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nΘέλετε να συνεχίσετε;", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Εγκατάσταση Firmware...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Η έκδοση συστήματος {0} εγκαταστάθηκε με επιτυχία.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "Δεν θα υπάρχουν άλλα προφίλ εάν διαγραφεί το επιλεγμένο", - "DialogUserProfileDeletionConfirmMessage": "Θέλετε να διαγράψετε το επιλεγμένο προφίλ", - "DialogUserProfileUnsavedChangesTitle": "Προσοχή - Μην Αποθηκευμένες Αλλαγές.", - "DialogUserProfileUnsavedChangesMessage": "Έχετε κάνει αλλαγές σε αυτό το προφίλ χρήστη που δεν έχουν αποθηκευτεί.", - "DialogUserProfileUnsavedChangesSubMessage": "Θέλετε να απορρίψετε τις αλλαγές σας;", - "DialogControllerSettingsModifiedConfirmMessage": "Οι τρέχουσες ρυθμίσεις χειρισμού έχουν ενημερωθεί.", - "DialogControllerSettingsModifiedConfirmSubMessage": "Θέλετε να αποθηκεύσετε;", - "DialogLoadFileErrorMessage": "{0}. Errored File: {1}", - "DialogModAlreadyExistsMessage": "Mod already exists", - "DialogModInvalidMessage": "The specified directory does not contain a mod!", - "DialogModDeleteNoParentMessage": "Failed to Delete: Could not find the parent directory for mod \"{0}\"!", - "DialogDlcNoDlcErrorMessage": "Το αρχείο δεν περιέχει DLC για τον επιλεγμένο τίτλο!", - "DialogPerformanceCheckLoggingEnabledMessage": "Έχετε ενεργοποιημένη την καταγραφή εντοπισμού σφαλμάτων, η οποία έχει σχεδιαστεί για χρήση μόνο από προγραμματιστές.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "Για βέλτιστη απόδοση, συνιστάται η απενεργοποίηση καταγραφής εντοπισμού σφαλμάτων. Θέλετε να απενεργοποιήσετε την καταγραφή τώρα;", - "DialogPerformanceCheckShaderDumpEnabledMessage": "Έχετε ενεργοποιήσει το Shader Dumping, το οποίο έχει σχεδιαστεί για χρήση μόνο από προγραμματιστές.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Για βέλτιστη απόδοση, συνιστάται να απενεργοποιήσετε το Shader Dumping. Θέλετε να απενεργοποιήσετε τώρα το Shader Dumping;", - "DialogLoadAppGameAlreadyLoadedMessage": "Ένα παιχνίδι έχει ήδη φορτωθεί", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Σταματήστε την εξομοίωση ή κλείστε τον εξομοιωτή πριν ξεκινήσετε ένα άλλο παιχνίδι.", - "DialogUpdateAddUpdateErrorMessage": "Το αρχείο δεν περιέχει ενημέρωση για τον επιλεγμένο τίτλο!", - "DialogSettingsBackendThreadingWarningTitle": "Προειδοποίηση - Backend Threading", - "DialogSettingsBackendThreadingWarningMessage": "Το Ryujinx πρέπει να επανεκκινηθεί αφού αλλάξει αυτή η επιλογή για να εφαρμοστεί πλήρως. Ανάλογα με την πλατφόρμα σας, μπορεί να χρειαστεί να απενεργοποιήσετε με μη αυτόματο τρόπο το multithreading του ίδιου του προγράμματος οδήγησης όταν χρησιμοποιείτε το Ryujinx.", - "DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?", - "DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?", - "SettingsTabGraphicsFeaturesOptions": "Χαρακτηριστικά", - "SettingsTabGraphicsBackendMultithreading": "Πολυνηματική Επεξεργασία Γραφικών:", - "CommonAuto": "Αυτόματο", - "CommonOff": "Ανενεργό", - "CommonOn": "Ενεργό", - "InputDialogYes": "Ναι", - "InputDialogNo": "Όχι", - "DialogProfileInvalidProfileNameErrorMessage": "Το όνομα αρχείου περιέχει μη έγκυρους χαρακτήρες. Παρακαλώ προσπαθήστε ξανά.", - "MenuBarOptionsPauseEmulation": "Παύση", - "MenuBarOptionsResumeEmulation": "Συνέχιση", - "AboutUrlTooltipMessage": "Κάντε κλικ για να ανοίξετε τον ιστότοπο Ryujinx στο προεπιλεγμένο πρόγραμμα περιήγησης.", - "AboutDisclaimerMessage": "Το Ryujinx δεν είναι συνδεδεμένο με τη Nintendo™,\nούτε με κανέναν από τους συνεργάτες της, με οποιονδήποτε τρόπο.", - "AboutAmiiboDisclaimerMessage": "Το AmiiboAPI (www.amiiboapi.com) χρησιμοποιείται\nστην προσομοίωση Amiibo.", - "AboutPatreonUrlTooltipMessage": "Κάντε κλικ για να ανοίξετε τη σελίδα Ryujinx Patreon στο προεπιλεγμένο πρόγραμμα περιήγησης.", - "AboutGithubUrlTooltipMessage": "Κάντε κλικ για να ανοίξετε τη σελίδα Ryujinx GitHub στο προεπιλεγμένο πρόγραμμα περιήγησης.", - "AboutDiscordUrlTooltipMessage": "Κάντε κλικ για να ανοίξετε μία πρόσκληση στον διακομιστή Ryujinx Discord στο προεπιλεγμένο πρόγραμμα περιήγησης.", - "AboutTwitterUrlTooltipMessage": "Κάντε κλικ για να ανοίξετε τη σελίδα Ryujinx Twitter στο προεπιλεγμένο πρόγραμμα περιήγησης.", - "AboutRyujinxAboutTitle": "Σχετικά με:", - "AboutRyujinxAboutContent": "Το Ryujinx είναι ένας εξομοιωτής για το Nintendo Switch™.\nΥποστηρίξτε μας στο Patreon.\nΛάβετε όλα τα τελευταία νέα στο Twitter ή στο Discord.\nΟι προγραμματιστές που ενδιαφέρονται να συνεισφέρουν μπορούν να μάθουν περισσότερα στο GitHub ή στο Discord μας.", - "AboutRyujinxMaintainersTitle": "Συντηρείται από:", - "AboutRyujinxMaintainersContentTooltipMessage": "Κάντε κλικ για να ανοίξετε τη σελίδα Συνεισφέροντες στο προεπιλεγμένο πρόγραμμα περιήγησης.", - "AboutRyujinxSupprtersTitle": "Υποστηρίζεται στο Patreon από:", - "AmiiboSeriesLabel": "Σειρά Amiibo", - "AmiiboCharacterLabel": "Χαρακτήρας", - "AmiiboScanButtonLabel": "Σαρώστε το", - "AmiiboOptionsShowAllLabel": "Εμφάνιση όλων των Amiibo", - "AmiiboOptionsUsRandomTagLabel": "Hack: Χρησιμοποιήστε τυχαίο αναγνωριστικό UUID", - "DlcManagerTableHeadingEnabledLabel": "Ενεργοποιημένο", - "DlcManagerTableHeadingTitleIdLabel": "Αναγνωριστικό τίτλου", - "DlcManagerTableHeadingContainerPathLabel": "Τοποθεσία DLC", - "DlcManagerTableHeadingFullPathLabel": "Πλήρης τοποθεσία", - "DlcManagerRemoveAllButton": "Αφαίρεση όλων", - "DlcManagerEnableAllButton": "Ενεργοποίηση Όλων", - "DlcManagerDisableAllButton": "Απενεργοποίηση Όλων", - "ModManagerDeleteAllButton": "Delete All", - "MenuBarOptionsChangeLanguage": "Αλλαξε γλώσσα", - "MenuBarShowFileTypes": "Εμφάνιση Τύπων Αρχείων", - "CommonSort": "Κατάταξη", - "CommonShowNames": "Εμφάνιση ονομάτων", - "CommonFavorite": "Αγαπημένα", - "OrderAscending": "Αύξουσα", - "OrderDescending": "Φθίνουσα", - "SettingsTabGraphicsFeatures": "Χαρακτηριστικά & Βελτιώσεις", - "ErrorWindowTitle": "Παράθυρο σφάλματος", - "ToggleDiscordTooltip": "Ενεργοποιεί ή απενεργοποιεί την Εμπλουτισμένη Παρουσία σας στο Discord", - "AddGameDirBoxTooltip": "Εισαγάγετε μία τοποθεσία παιχνιδιών για προσθήκη στη λίστα", - "AddGameDirTooltip": "Προσθέστε μία τοποθεσία παιχνιδιών στη λίστα", - "RemoveGameDirTooltip": "Αφαιρέστε την επιλεγμένη τοποθεσία παιχνιδιών", - "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list", - "AddAutoloadDirTooltip": "Add an autoload directory to the list", - "RemoveAutoloadDirTooltip": "Remove selected autoload directory", - "CustomThemeCheckTooltip": "Ενεργοποίηση ή απενεργοποίηση προσαρμοσμένων θεμάτων στο GUI", - "CustomThemePathTooltip": "Διαδρομή προς το προσαρμοσμένο θέμα GUI", - "CustomThemeBrowseTooltip": "Αναζητήστε ένα προσαρμοσμένο θέμα GUI", - "DockModeToggleTooltip": "Ενεργοποιήστε ή απενεργοποιήστε τη λειτουργία σύνδεσης", - "DirectKeyboardTooltip": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.", - "DirectMouseTooltip": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.", - "RegionTooltip": "Αλλαγή Περιοχής Συστήματος", - "LanguageTooltip": "Αλλαγή Γλώσσας Συστήματος", - "TimezoneTooltip": "Αλλαγή Ζώνης Ώρας Συστήματος", - "TimeTooltip": "Αλλαγή Ώρας Συστήματος", - "VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.", - "PptcToggleTooltip": "Ενεργοποιεί ή απενεργοποιεί το PPTC", - "LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", - "FsIntegrityToggleTooltip": "Ενεργοποιεί τους ελέγχους ακεραιότητας σε αρχεία περιεχομένου παιχνιδιού", - "AudioBackendTooltip": "Αλλαγή ήχου υποστήριξης", - "MemoryManagerTooltip": "Αλλάξτε τον τρόπο αντιστοίχισης και πρόσβασης στη μνήμη επισκέπτη. Επηρεάζει σε μεγάλο βαθμό την απόδοση της προσομοίωσης της CPU.", - "MemoryManagerSoftwareTooltip": "Χρησιμοποιήστε έναν πίνακα σελίδων λογισμικού για τη μετάφραση διευθύνσεων. Υψηλότερη ακρίβεια αλλά πιο αργή απόδοση.", - "MemoryManagerHostTooltip": "Απευθείας αντιστοίχιση της μνήμης στον χώρο διευθύνσεων υπολογιστή υποδοχής. Πολύ πιο γρήγορη μεταγλώττιση και εκτέλεση JIT.", - "MemoryManagerUnsafeTooltip": "Απευθείας χαρτογράφηση της μνήμης, αλλά μην καλύπτετε τη διεύθυνση εντός του χώρου διευθύνσεων επισκέπτη πριν από την πρόσβαση. Πιο γρήγορα, αλλά με κόστος ασφάλειας. Η εφαρμογή μπορεί να έχει πρόσβαση στη μνήμη από οπουδήποτε στο Ryujinx, επομένως εκτελείτε μόνο προγράμματα που εμπιστεύεστε με αυτήν τη λειτουργία.", - "UseHypervisorTooltip": "Χρησιμοποιήστε Hypervisor αντί για JIT. Βελτιώνει σημαντικά την απόδοση όταν διατίθεται, αλλά μπορεί να είναι ασταθής στην τρέχουσα κατάστασή του.", - "DRamTooltip": "Επεκτείνει την ποσότητα της μνήμης στο εξομοιούμενο σύστημα από 4 GiB σε 6 GiB", - "IgnoreMissingServicesTooltip": "Ενεργοποίηση ή απενεργοποίηση της αγνοώησης για υπηρεσίες που λείπουν", - "IgnoreAppletTooltip": "Το εξωτερικό παράθυρο διαλόγου \"Ελεγκτής μικροεφαρμογής\" δεν θα εμφανιστεί εάν το gamepad αποσυνδεθεί κατά τη διάρκεια του παιχνιδιού. Δεν θα σας ζητηθεί να κλείσετε το παράθυρο διαλόγου ή να ρυθμίσετε έναν νέο ελεγκτή. Μόλις επανασυνδεθεί το χειριστήριο που είχε αποσυνδεθεί προηγουμένως, το παιχνίδι θα συνεχιστεί αυτόματα.", - "GraphicsBackendThreadingTooltip": "Ενεργοποίηση Πολυνηματικής Επεξεργασίας Γραφικών", - "GalThreadingTooltip": "Εκτελεί εντολές γραφικών σε ένα δεύτερο νήμα. Επιτρέπει την πολυνηματική μεταγλώττιση Shader σε χρόνο εκτέλεσης, μειώνει το τρεμόπαιγμα και βελτιώνει την απόδοση των προγραμμάτων οδήγησης χωρίς τη δική τους υποστήριξη πολλαπλών νημάτων. Ποικίλες κορυφαίες επιδόσεις σε προγράμματα οδήγησης με multithreading. Μπορεί να χρειαστεί επανεκκίνηση του Ryujinx για να απενεργοποιήσετε σωστά την ενσωματωμένη λειτουργία πολλαπλών νημάτων του προγράμματος οδήγησης ή ίσως χρειαστεί να το κάνετε χειροκίνητα για να έχετε την καλύτερη απόδοση.", - "ShaderCacheToggleTooltip": "Ενεργοποιεί ή απενεργοποιεί την Προσωρινή Μνήμη Shader", - "ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.", - "ResolutionScaleEntryTooltip": "Κλίμακα ανάλυσης κινητής υποδιαστολής, όπως 1,5. Οι μη αναπόσπαστες τιμές είναι πιθανό να προκαλέσουν προβλήματα ή σφάλματα.", - "AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.", - "AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.", - "ShaderDumpPathTooltip": "Τοποθεσία Εναπόθεσης Προσωρινής Μνήμης Shaders", - "FileLogTooltip": "Ενεργοποιεί ή απενεργοποιεί την καταγραφή σε ένα αρχείο στο δίσκο", - "StubLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων καταγραφής ατελειών", - "InfoLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής πληροφοριών", - "WarnLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων καταγραφής προειδοποιήσεων", - "ErrorLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής σφαλμάτων", - "TraceLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής ιχνών", - "GuestLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων καταγραφής επισκεπτών", - "FileAccessLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής πρόσβασης", - "FSAccessLogModeTooltip": "Ενεργοποιεί την έξοδο καταγραφής πρόσβασης FS στην κονσόλα. Οι πιθανοί τρόποι λειτουργίας είναι 0-3", - "DeveloperOptionTooltip": "Χρησιμοποιήστε με προσοχή", - "OpenGlLogLevel": "Απαιτεί τα κατάλληλα επίπεδα καταγραφής ενεργοποιημένα", - "DebugLogTooltip": "Ενεργοποιεί την εκτύπωση μηνυμάτων αρχείου καταγραφής εντοπισμού σφαλμάτων", - "LoadApplicationFileTooltip": "Ανοίξτε έναν επιλογέα αρχείων για να επιλέξετε ένα αρχείο συμβατό με το Switch για φόρτωση", - "LoadApplicationFolderTooltip": "Ανοίξτε έναν επιλογέα αρχείων για να επιλέξετε μία μη συσκευασμένη εφαρμογή, συμβατή με το Switch για φόρτωση", - "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from", - "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from", - "OpenRyujinxFolderTooltip": "Ανοίξτε το φάκελο συστήματος αρχείων Ryujinx", - "OpenRyujinxLogsTooltip": "Ανοίξτε το φάκελο στον οποίο διατηρούνται τα αρχεία καταγραφής", - "ExitTooltip": "Έξοδος από το Ryujinx", - "OpenSettingsTooltip": "Ανοίξτε το παράθυρο Ρυθμίσεων", - "OpenProfileManagerTooltip": "Ανοίξτε το παράθυρο Διαχείρισης Προφίλ Χρήστη", - "StopEmulationTooltip": "Σταματήστε την εξομοίωση του τρέχοντος παιχνιδιού και επιστρέψτε στην επιλογή παιχνιδιού", - "CheckUpdatesTooltip": "Ελέγξτε για ενημερώσεις του Ryujinx", - "OpenAboutTooltip": "Ανοίξτε το Παράθυρο Σχετικά", - "GridSize": "Μέγεθος Πλέγματος", - "GridSizeTooltip": "Αλλαγή μεγέθους στοιχείων πλέγματος", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Πορτογαλικά Βραζιλίας", - "AboutRyujinxContributorsButtonHeader": "Δείτε Όλους τους Συντελεστές", - "SettingsTabSystemAudioVolume": "Ενταση Ήχου: ", - "AudioVolumeTooltip": "Αλλαγή Έντασης Ήχου", - "SettingsTabSystemEnableInternetAccess": "Ενεργοποίηση πρόσβασης επισκέπτη στο Διαδίκτυο", - "EnableInternetAccessTooltip": "Επιτρέπει την πρόσβαση επισκέπτη στο Διαδίκτυο. Εάν ενεργοποιηθεί, η εξομοιωμένη κονσόλα Switch θα συμπεριφέρεται σαν να είναι συνδεδεμένη στο Διαδίκτυο. Λάβετε υπόψη ότι σε ορισμένες περιπτώσεις, οι εφαρμογές ενδέχεται να εξακολουθούν να έχουν πρόσβαση στο Διαδίκτυο, ακόμη και όταν αυτή η επιλογή είναι απενεργοποιημένη", - "GameListContextMenuManageCheatToolTip": "Διαχείριση Κόλπων", - "GameListContextMenuManageCheat": "Διαχείριση Κόλπων", - "GameListContextMenuManageModToolTip": "Manage Mods", - "GameListContextMenuManageMod": "Manage Mods", - "ControllerSettingsStickRange": "Εύρος:", - "DialogStopEmulationTitle": "Ryujinx - Διακοπή εξομοίωσης", - "DialogStopEmulationMessage": "Είστε βέβαιοι ότι θέλετε να σταματήσετε την εξομοίωση;", - "SettingsTabCpu": "Επεξεργαστής", - "SettingsTabAudio": "Ήχος", - "SettingsTabNetwork": "Δίκτυο", - "SettingsTabNetworkConnection": "Σύνδεση δικτύου", - "SettingsTabCpuCache": "Προσωρινή Μνήμη CPU", - "SettingsTabCpuMemory": "Μνήμη CPU", - "DialogUpdaterFlatpakNotSupportedMessage": "Παρακαλούμε ενημερώστε το Ryujinx μέσω FlatHub.", - "UpdaterDisabledWarningTitle": "Ο Διαχειριστής Ενημερώσεων Είναι Απενεργοποιημένος!", - "ControllerSettingsRotate90": "Περιστροφή 90° Δεξιόστροφα", - "IconSize": "Μέγεθος Εικονιδίου", - "IconSizeTooltip": "Αλλάξτε μέγεθος εικονιδίων των παιχνιδιών", - "MenuBarOptionsShowConsole": "Εμφάνιση Κονσόλας", - "ShaderCachePurgeError": "Σφάλμα κατά την εκκαθάριση του shader cache στο {0}: {1}", - "UserErrorNoKeys": "Τα κλειδιά δεν βρέθηκαν", - "UserErrorNoFirmware": "Το firmware δε βρέθηκε", - "UserErrorFirmwareParsingFailed": "Σφάλμα ανάλυσης firmware", - "UserErrorApplicationNotFound": "Η εφαρμογή δε βρέθηκε", - "UserErrorUnknown": "Άγνωστο σφάλμα", - "UserErrorUndefined": "Αόριστο σφάλμα", - "UserErrorNoKeysDescription": "Το Ryujinx δεν κατάφερε να εντοπίσει το αρχείο 'prod.keys'", - "UserErrorNoFirmwareDescription": "Το Ryujinx δεν κατάφερε να εντοπίσει κανένα εγκατεστημένο firmware", - "UserErrorFirmwareParsingFailedDescription": "Το Ryujinx δεν κατάφερε να αναλύσει το συγκεκριμένο firmware. Αυτό συνήθως οφείλετε σε ξεπερασμένα/παλιά κλειδιά.", - "UserErrorApplicationNotFoundDescription": "Το Ryujinx δεν κατάφερε να εντοπίσει έγκυρη εφαρμογή στη συγκεκριμένη διαδρομή.", - "UserErrorUnknownDescription": "Παρουσιάστηκε άγνωστο σφάλμα.", - "UserErrorUndefinedDescription": "Παρουσιάστηκε ένα άγνωστο σφάλμα! Αυτό δεν πρέπει να συμβεί, παρακαλώ επικοινωνήστε με έναν προγραμματιστή!", - "OpenSetupGuideMessage": "Ανοίξτε τον Οδηγό Εγκατάστασης.", - "NoUpdate": "Καμία Eνημέρωση", - "TitleUpdateVersionLabel": "Version {0} - {1}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - Πληροφορίες", - "RyujinxConfirm": "Ryujinx - Επιβεβαίωση", - "FileDialogAllTypes": "Όλοι οι τύποι", - "Never": "Ποτέ", - "SwkbdMinCharacters": "Πρέπει να έχει μήκος τουλάχιστον {0} χαρακτήρες", - "SwkbdMinRangeCharacters": "Πρέπει να έχει μήκος {0}-{1} χαρακτήρες", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Εικονικό Πληκτρολόγιο", - "SoftwareKeyboardModeNumeric": "Πρέπει να είναι 0-9 ή '.' μόνο", - "SoftwareKeyboardModeAlphabet": "Πρέπει να μην είναι μόνο χαρακτήρες CJK", - "SoftwareKeyboardModeASCII": "Πρέπει να είναι μόνο κείμενο ASCII", - "ControllerAppletControllers": "Supported Controllers:", - "ControllerAppletPlayers": "Players:", - "ControllerAppletDescription": "Your current configuration is invalid. Open settings and reconfigure your inputs.", - "ControllerAppletDocked": "Docked mode set. Handheld control should be disabled.", - "UpdaterRenaming": "Μετονομασία Παλαιών Αρχείων...", - "UpdaterRenameFailed": "Δεν ήταν δυνατή η μετονομασία του αρχείου: {0}", - "UpdaterAddingFiles": "Προσθήκη Νέων Αρχείων...", - "UpdaterExtracting": "Εξαγωγή Ενημέρωσης...", - "UpdaterDownloading": "Λήψη Ενημέρωσης...", - "Docked": "Προσκολλημένο", - "Handheld": "Χειροκίνητο", - "ConnectionError": "Σφάλμα Σύνδεσης.", - "AboutPageDeveloperListMore": "{0} και περισσότερα...", - "ApiError": "Σφάλμα API.", - "LoadingHeading": "Φόρτωση {0}", - "CompilingPPTC": "Μεταγλώττιση του PTC", - "CompilingShaders": "Σύνταξη των Shaders", - "AllKeyboards": "Όλα τα πληκτρολόγια", - "OpenFileDialogTitle": "Επιλέξτε ένα υποστηριζόμενο αρχείο για άνοιγμα", - "OpenFolderDialogTitle": "Επιλέξτε ένα φάκελο με ένα αποσυμπιεσμένο παιχνίδι", - "AllSupportedFormats": "Όλες Οι Υποστηριζόμενες Μορφές", - "RyujinxUpdater": "Ryujinx Ενημερωτής", - "SettingsTabHotkeys": "Συντομεύσεις Πληκτρολογίου", - "SettingsTabHotkeysHotkeys": "Συντομεύσεις Πληκτρολογίου", - "SettingsTabHotkeysToggleVsyncHotkey": "Εναλλαγή VSync:", - "SettingsTabHotkeysScreenshotHotkey": "Στιγμιότυπο Οθόνης:", - "SettingsTabHotkeysShowUiHotkey": "Εμφάνιση Διεπαφής Χρήστη:", - "SettingsTabHotkeysPauseHotkey": "Παύση:", - "SettingsTabHotkeysToggleMuteHotkey": "Σίγαση:", - "ControllerMotionTitle": "Ρυθμίσεις Ελέγχου Κίνησης", - "ControllerRumbleTitle": "Ρυθμίσεις Δόνησης", - "SettingsSelectThemeFileDialogTitle": "Επιλογή Αρχείου Θέματος", - "SettingsXamlThemeFile": "Αρχείο Θέματος Xaml", - "AvatarWindowTitle": "Διαχείριση Λογαριασμών - Avatar", - "Amiibo": "Amiibo", - "Unknown": "Άγνωστο", - "Usage": "Χρήση", - "Writable": "Εγγράψιμο", - "SelectDlcDialogTitle": "Επιλογή αρχείων DLC", - "SelectUpdateDialogTitle": "Επιλογή αρχείων ενημέρωσης", - "SelectModDialogTitle": "Select mod directory", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "Διαχειριστής Προφίλ Χρήστη", - "CheatWindowTitle": "Διαχειριστής των Cheats", - "DlcWindowTitle": "Downloadable Content Manager", - "ModWindowTitle": "Manage Mods for {0} ({1})", - "UpdateWindowTitle": "Διαχειριστής Ενημερώσεων Τίτλου", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} new update(s) added", - "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.", - "CheatWindowHeading": "Διαθέσιμα Cheats για {0} [{1}]", - "BuildId": "BuildId:", - "DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.", - "DlcWindowHeading": "{0} Downloadable Content(s) available for {1} ({2})", - "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} new update(s) added", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "{0} Mod(s)", - "UserProfilesEditProfile": "Επεξεργασία Επιλεγμένων", - "Continue": "Continue", - "Cancel": "Ακύρωση", - "Save": "Αποθήκευση", - "Discard": "Απόρριψη", - "Paused": "Σε παύση", - "UserProfilesSetProfileImage": "Ορισμός Εικόνας Προφίλ", - "UserProfileEmptyNameError": "Απαιτείται όνομα", - "UserProfileNoImageError": "Η εικόνα προφίλ πρέπει να οριστεί", - "GameUpdateWindowHeading": "{0} Update(s) available for {1} ({2})", - "SettingsTabHotkeysResScaleUpHotkey": "Αύξηση της ανάλυσης:", - "SettingsTabHotkeysResScaleDownHotkey": "Μείωση της ανάλυσης:", - "UserProfilesName": "Όνομα:", - "UserProfilesUserId": "User Id:", - "SettingsTabGraphicsBackend": "Σύστημα Υποστήριξης Γραφικών", - "SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.", - "SettingsEnableTextureRecompression": "Ενεργοποίηση Επανασυμπίεσης Των Texture", - "SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.", - "SettingsTabGraphicsPreferredGpu": "Προτιμώμενη GPU", - "SettingsTabGraphicsPreferredGpuTooltip": "Επιλέξτε την κάρτα γραφικών η οποία θα χρησιμοποιηθεί από το Vulkan.\n\nΔεν επηρεάζει το OpenGL.\n\nΔιαλέξτε την GPU που διαθέτει την υπόδειξη \"dGPU\" αν δεν είστε βέβαιοι. Αν δεν υπάρχει κάποιαν, το πειράξετε", - "SettingsAppRequiredRestartMessage": "Απαιτείται Επανεκκίνηση Του Ryujinx", - "SettingsGpuBackendRestartMessage": "Οι ρυθμίσεις GPU έχουν αλλαχτεί. Θα χρειαστεί επανεκκίνηση του Ryujinx για να τεθούν σε ισχύ.", - "SettingsGpuBackendRestartSubMessage": "Θέλετε να κάνετε επανεκκίνηση τώρα;", - "RyujinxUpdaterMessage": "Θέλετε να ενημερώσετε το Ryujinx στην πιο πρόσφατη έκδοση:", - "SettingsTabHotkeysVolumeUpHotkey": "Αύξηση Έντασης:", - "SettingsTabHotkeysVolumeDownHotkey": "Μείωση Έντασης:", - "SettingsEnableMacroHLE": "Ενεργοποίηση του Macro HLE", - "SettingsEnableMacroHLETooltip": "Προσομοίωση του κώδικα GPU Macro .\n\nΒελτιώνει την απόδοση, αλλά μπορεί να προκαλέσει γραφικά προβλήματα σε μερικά παιχνίδια.\n\nΑφήστε ΕΝΕΡΓΟ αν δεν είστε σίγουροι.", - "SettingsEnableColorSpacePassthrough": "Διέλευση Χρωματικού Χώρου", - "SettingsEnableColorSpacePassthroughTooltip": "Σκηνοθετεί το σύστημα υποστήριξης του Vulkan για να περάσει από πληροφορίες χρώματος χωρίς να καθορίσει έναν χρωματικό χώρο. Για χρήστες με ευρείες οθόνες γκάμας, αυτό μπορεί να οδηγήσει σε πιο ζωηρά χρώματα, με κόστος την ορθότητα του χρώματος.", - "VolumeShort": "Έντ.", - "UserProfilesManageSaves": "Διαχείριση Των Save", - "DeleteUserSave": "Επιθυμείτε να διαγράψετε το save χρήστη για το συγκεκριμένο παιχνίδι;", - "IrreversibleActionNote": "Αυτή η ενέργεια είναι μη αναστρέψιμη.", - "SaveManagerHeading": "Manage Saves for {0}", - "SaveManagerTitle": "Διαχειριστής Save", - "Name": "Όνομα", - "Size": "Μέγεθος", - "Search": "Αναζήτηση", - "UserProfilesRecoverLostAccounts": "Ανάκτηση Χαμένων Λογαριασμών", - "Recover": "Ανάκτηση", - "UserProfilesRecoverHeading": "Βρέθηκαν save για τους ακόλουθους λογαριασμούς", - "UserProfilesRecoverEmptyList": "Δεν υπάρχουν προφίλ για ανάκτηση", - "GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.", - "GraphicsAALabel": "Anti-Aliasing", - "GraphicsScalingFilterLabel": "Φίλτρο Κλιμάκωσης:", - "GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", - "GraphicsScalingFilterBilinear": "Bilinear", - "GraphicsScalingFilterNearest": "Nearest", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "Επίπεδο", - "GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.", - "SmaaLow": "Χαμηλό SMAA", - "SmaaMedium": " Μεσαίο SMAA", - "SmaaHigh": "Υψηλό SMAA", - "SmaaUltra": "Oύλτρα SMAA", - "UserEditorTitle": "Επεξεργασία Χρήστη", - "UserEditorTitleCreate": "Δημιουργία Χρήστη", - "SettingsTabNetworkInterface": "Διεπαφή Δικτύου", - "NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.", - "NetworkInterfaceDefault": "Προεπιλογή", - "PackagingShaders": "Shaders Συσκευασίας", - "AboutChangelogButton": "Προβολή αρχείου αλλαγών στο GitHub", - "AboutChangelogButtonTooltipMessage": "Κάντε κλικ για να ανοίξετε το αρχείο αλλαγών για αυτήν την έκδοση στο προεπιλεγμένο πρόγραμμα περιήγησης σας.", - "SettingsTabNetworkMultiplayer": "Πολλαπλοί παίκτες", - "MultiplayerMode": "Λειτουργία:", - "MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.", - "MultiplayerModeDisabled": "Disabled", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/en_US.json b/src/Ryujinx/Assets/Locales/en_US.json deleted file mode 100644 index ba183c8bd..000000000 --- a/src/Ryujinx/Assets/Locales/en_US.json +++ /dev/null @@ -1,894 +0,0 @@ -{ - "Language": "English (US)", - "MenuBarFileOpenApplet": "Open Applet", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Open Mii Editor Applet in Standalone mode", - "SettingsTabInputDirectMouseAccess": "Direct Mouse Access", - "SettingsTabSystemMemoryManagerMode": "Memory Manager Mode:", - "SettingsTabSystemMemoryManagerModeSoftware": "Software", - "SettingsTabSystemMemoryManagerModeHost": "Host (fast)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Host Unchecked (fastest, unsafe)", - "SettingsTabSystemUseHypervisor": "Use Hypervisor", - "MenuBarFile": "_File", - "MenuBarFileOpenFromFile": "_Load Application From File", - "MenuBarFileOpenFromFileError": "No applications found in selected file.", - "MenuBarFileOpenUnpacked": "Load _Unpacked Game", - "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder", - "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder", - "MenuBarFileOpenEmuFolder": "Open Ryujinx Folder", - "MenuBarFileOpenLogsFolder": "Open Logs Folder", - "MenuBarFileExit": "_Exit", - "MenuBarOptions": "_Options", - "MenuBarOptionsToggleFullscreen": "Toggle Fullscreen", - "MenuBarOptionsStartGamesInFullscreen": "Start Games in Fullscreen Mode", - "MenuBarOptionsStopEmulation": "Stop Emulation", - "MenuBarOptionsSettings": "_Settings", - "MenuBarOptionsManageUserProfiles": "_Manage User Profiles", - "MenuBarActions": "_Actions", - "MenuBarOptionsSimulateWakeUpMessage": "Simulate Wake-up message", - "MenuBarActionsScanAmiibo": "Scan An Amiibo", - "MenuBarTools": "_Tools", - "MenuBarToolsInstallFirmware": "Install Firmware", - "MenuBarFileToolsInstallFirmwareFromFile": "Install a firmware from XCI or ZIP", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Install a firmware from a directory", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "Manage file types", - "MenuBarToolsInstallFileTypes": "Install file types", - "MenuBarToolsUninstallFileTypes": "Uninstall file types", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_View", - "MenuBarViewWindow": "Window Size", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Help", - "MenuBarHelpCheckForUpdates": "Check for Updates", - "MenuBarHelpAbout": "About", - "MenuSearch": "Search...", - "GameListHeaderFavorite": "Fav", - "GameListHeaderIcon": "Icon", - "GameListHeaderApplication": "Name", - "GameListHeaderDeveloper": "Developer", - "GameListHeaderVersion": "Version", - "GameListHeaderTimePlayed": "Play Time", - "GameListHeaderLastPlayed": "Last Played", - "GameListHeaderFileExtension": "File Ext", - "GameListHeaderFileSize": "File Size", - "GameListHeaderPath": "Path", - "GameListContextMenuOpenUserSaveDirectory": "Open User Save Directory", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Opens the directory which contains Application's User Save", - "GameListContextMenuOpenDeviceSaveDirectory": "Open Device Save Directory", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Opens the directory which contains Application's Device Save", - "GameListContextMenuOpenBcatSaveDirectory": "Open BCAT Save Directory", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Opens the directory which contains Application's BCAT Save", - "GameListContextMenuManageTitleUpdates": "Manage Title Updates", - "GameListContextMenuManageTitleUpdatesToolTip": "Opens the Title Update management window", - "GameListContextMenuManageDlc": "Manage DLC", - "GameListContextMenuManageDlcToolTip": "Opens the DLC management window", - "GameListContextMenuCacheManagement": "Cache Management", - "GameListContextMenuCacheManagementPurgePptc": "Queue PPTC Rebuild", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Trigger PPTC to rebuild at boot time on the next game launch", - "GameListContextMenuCacheManagementPurgeShaderCache": "Purge Shader Cache", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Deletes Application's shader cache", - "GameListContextMenuCacheManagementOpenPptcDirectory": "Open PPTC Directory", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Opens the directory which contains Application's PPTC cache", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Open Shader Cache Directory", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Opens the directory which contains Application's shader cache", - "GameListContextMenuExtractData": "Extract Data", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Extract the ExeFS section from Application's current config (including updates)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Extract the RomFS section from Application's current config (including updates)", - "GameListContextMenuExtractDataLogo": "Logo", - "GameListContextMenuExtractDataLogoToolTip": "Extract the Logo section from Application's current config (including updates)", - "GameListContextMenuCreateShortcut": "Create Application Shortcut", - "GameListContextMenuCreateShortcutToolTip": "Create a Desktop Shortcut that launches the selected Application", - "GameListContextMenuCreateShortcutToolTipMacOS": "Create a shortcut in macOS's Applications folder that launches the selected Application", - "GameListContextMenuOpenModsDirectory": "Open Mods Directory", - "GameListContextMenuOpenModsDirectoryToolTip": "Opens the directory which contains Application's Mods", - "GameListContextMenuOpenSdModsDirectory": "Open Atmosphere Mods Directory", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} Games Loaded", - "StatusBarSystemVersion": "System Version: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Low limit for memory mappings detected", - "LinuxVmMaxMapCountDialogTextPrimary": "Would you like to increase the value of vm.max_map_count to {0}", - "LinuxVmMaxMapCountDialogTextSecondary": "Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Yes, until the next restart", - "LinuxVmMaxMapCountDialogButtonPersistent": "Yes, permanently", - "LinuxVmMaxMapCountWarningTextPrimary": "Max amount of memory mappings is lower than recommended.", - "LinuxVmMaxMapCountWarningTextSecondary": "The current value of vm.max_map_count ({0}) is lower than {1}. Some games might try to create more memory mappings than currently allowed. Ryujinx will crash as soon as this limit gets exceeded.\n\nYou might want to either manually increase the limit or install pkexec, which allows Ryujinx to assist with that.", - "Settings": "Settings", - "SettingsTabGeneral": "User Interface", - "SettingsTabGeneralGeneral": "General", - "SettingsTabGeneralEnableDiscordRichPresence": "Enable Discord Rich Presence", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Check for Updates on Launch", - "SettingsTabGeneralShowConfirmExitDialog": "Show \"Confirm Exit\" Dialog", - "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "Hide Cursor:", - "SettingsTabGeneralHideCursorNever": "Never", - "SettingsTabGeneralHideCursorOnIdle": "On Idle", - "SettingsTabGeneralHideCursorAlways": "Always", - "SettingsTabGeneralGameDirectories": "Game Directories", - "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "Add", - "SettingsTabGeneralRemove": "Remove", - "SettingsTabSystem": "System", - "SettingsTabSystemCore": "Core", - "SettingsTabSystemSystemRegion": "System Region:", - "SettingsTabSystemSystemRegionJapan": "Japan", - "SettingsTabSystemSystemRegionUSA": "USA", - "SettingsTabSystemSystemRegionEurope": "Europe", - "SettingsTabSystemSystemRegionAustralia": "Australia", - "SettingsTabSystemSystemRegionChina": "China", - "SettingsTabSystemSystemRegionKorea": "Korea", - "SettingsTabSystemSystemRegionTaiwan": "Taiwan", - "SettingsTabSystemSystemLanguage": "System Language:", - "SettingsTabSystemSystemLanguageJapanese": "Japanese", - "SettingsTabSystemSystemLanguageAmericanEnglish": "American English", - "SettingsTabSystemSystemLanguageFrench": "French", - "SettingsTabSystemSystemLanguageGerman": "German", - "SettingsTabSystemSystemLanguageItalian": "Italian", - "SettingsTabSystemSystemLanguageSpanish": "Spanish", - "SettingsTabSystemSystemLanguageChinese": "Chinese", - "SettingsTabSystemSystemLanguageKorean": "Korean", - "SettingsTabSystemSystemLanguageDutch": "Dutch", - "SettingsTabSystemSystemLanguagePortuguese": "Portuguese", - "SettingsTabSystemSystemLanguageRussian": "Russian", - "SettingsTabSystemSystemLanguageTaiwanese": "Taiwanese", - "SettingsTabSystemSystemLanguageBritishEnglish": "British English", - "SettingsTabSystemSystemLanguageCanadianFrench": "Canadian French", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Latin American Spanish", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Simplified Chinese", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Traditional Chinese", - "SettingsTabSystemSystemTimeZone": "System Time Zone:", - "SettingsTabSystemSystemTime": "System Time:", - "SettingsTabSystemVSyncMode": "VSync:", - "SettingsTabSystemEnableCustomVSyncInterval": "Enable custom refresh rate (Experimental)", - "SettingsTabSystemVSyncModeSwitch": "Switch", - "SettingsTabSystemVSyncModeUnbounded": "Unbounded", - "SettingsTabSystemVSyncModeCustom": "Custom Refresh Rate", - "SettingsTabSystemVSyncModeTooltip": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate.", - "SettingsTabSystemVSyncModeTooltipCustom": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate. 'Custom' emulates the specified custom refresh rate.", - "SettingsTabSystemEnableCustomVSyncIntervalTooltip": "Allows the user to specify an emulated refresh rate. In some titles, this may speed up or slow down the rate of gameplay logic. In other titles, it may allow for capping FPS at some multiple of the refresh rate, or lead to unpredictable behavior. This is an experimental feature, with no guarantees for how gameplay will be affected. \n\nLeave OFF if unsure.", - "SettingsTabSystemCustomVSyncIntervalValueTooltip": "The custom refresh rate target value.", - "SettingsTabSystemCustomVSyncIntervalSliderTooltip": "The custom refresh rate, as a percentage of the normal Switch refresh rate.", - "SettingsTabSystemCustomVSyncIntervalPercentage": "Custom Refresh Rate %:", - "SettingsTabSystemCustomVSyncIntervalValue": "Custom Refresh Rate Value:", - "SettingsTabSystemEnablePptc": "PPTC (Profiled Persistent Translation Cache)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC cache", - "SettingsTabSystemEnableFsIntegrityChecks": "FS Integrity Checks", - "SettingsTabSystemAudioBackend": "Audio Backend:", - "SettingsTabSystemAudioBackendDummy": "Dummy", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemCustomVSyncInterval": "Interval", - "SettingsTabSystemHacks": "Hacks", - "SettingsTabSystemHacksNote": "May cause instability", - "SettingsTabSystemDramSize": "DRAM size:", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "Ignore Missing Services", - "SettingsTabSystemIgnoreApplet": "Ignore Applet", - "SettingsTabGraphics": "Graphics", - "SettingsTabGraphicsAPI": "Graphics API", - "SettingsTabGraphicsEnableShaderCache": "Enable Shader Cache", - "SettingsTabGraphicsAnisotropicFiltering": "Anisotropic Filtering:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Auto", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "Resolution Scale:", - "SettingsTabGraphicsResolutionScaleCustom": "Custom (Not recommended)", - "SettingsTabGraphicsResolutionScaleNative": "Native (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Not recommended)", - "SettingsTabGraphicsAspectRatio": "Aspect Ratio:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "Stretch to Fit Window", - "SettingsTabGraphicsDeveloperOptions": "Developer Options", - "SettingsTabGraphicsShaderDumpPath": "Graphics Shader Dump Path:", - "SettingsTabLogging": "Logging", - "SettingsTabLoggingLogging": "Logging", - "SettingsTabLoggingEnableLoggingToFile": "Enable Logging to File", - "SettingsTabLoggingEnableStubLogs": "Enable Stub Logs", - "SettingsTabLoggingEnableInfoLogs": "Enable Info Logs", - "SettingsTabLoggingEnableWarningLogs": "Enable Warning Logs", - "SettingsTabLoggingEnableErrorLogs": "Enable Error Logs", - "SettingsTabLoggingEnableTraceLogs": "Enable Trace Logs", - "SettingsTabLoggingEnableGuestLogs": "Enable Guest Logs", - "SettingsTabLoggingEnableFsAccessLogs": "Enable Fs Access Logs", - "SettingsTabLoggingFsGlobalAccessLogMode": "Fs Global Access Log Mode:", - "SettingsTabLoggingDeveloperOptions": "Developer Options", - "SettingsTabLoggingDeveloperOptionsNote": "WARNING: Will reduce performance", - "SettingsTabLoggingGraphicsBackendLogLevel": "Graphics Backend Log Level:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "None", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Error", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Slowdowns", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "All", - "SettingsTabLoggingEnableDebugLogs": "Enable Debug Logs", - "SettingsTabInput": "Input", - "SettingsTabInputEnableDockedMode": "Docked Mode", - "SettingsTabInputDirectKeyboardAccess": "Direct Keyboard Access", - "SettingsButtonSave": "Save", - "SettingsButtonClose": "Close", - "SettingsButtonOk": "OK", - "SettingsButtonCancel": "Cancel", - "SettingsButtonApply": "Apply", - "ControllerSettingsPlayer": "Player", - "ControllerSettingsPlayer1": "Player 1", - "ControllerSettingsPlayer2": "Player 2", - "ControllerSettingsPlayer3": "Player 3", - "ControllerSettingsPlayer4": "Player 4", - "ControllerSettingsPlayer5": "Player 5", - "ControllerSettingsPlayer6": "Player 6", - "ControllerSettingsPlayer7": "Player 7", - "ControllerSettingsPlayer8": "Player 8", - "ControllerSettingsHandheld": "Handheld", - "ControllerSettingsInputDevice": "Input Device", - "ControllerSettingsRefresh": "Refresh", - "ControllerSettingsDeviceDisabled": "Disabled", - "ControllerSettingsControllerType": "Controller Type", - "ControllerSettingsControllerTypeHandheld": "Handheld", - "ControllerSettingsControllerTypeProController": "Pro Controller", - "ControllerSettingsControllerTypeJoyConPair": "JoyCon Pair", - "ControllerSettingsControllerTypeJoyConLeft": "JoyCon Left", - "ControllerSettingsControllerTypeJoyConRight": "JoyCon Right", - "ControllerSettingsProfile": "Profile", - "ControllerSettingsProfileDefault": "Default", - "ControllerSettingsLoad": "Load", - "ControllerSettingsAdd": "Add", - "ControllerSettingsRemove": "Remove", - "ControllerSettingsButtons": "Buttons", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Directional Pad", - "ControllerSettingsDPadUp": "Up", - "ControllerSettingsDPadDown": "Down", - "ControllerSettingsDPadLeft": "Left", - "ControllerSettingsDPadRight": "Right", - "ControllerSettingsStickButton": "Button", - "ControllerSettingsStickUp": "Up", - "ControllerSettingsStickDown": "Down", - "ControllerSettingsStickLeft": "Left", - "ControllerSettingsStickRight": "Right", - "ControllerSettingsStickStick": "Stick", - "ControllerSettingsStickInvertXAxis": "Invert Stick X", - "ControllerSettingsStickInvertYAxis": "Invert Stick Y", - "ControllerSettingsStickDeadzone": "Deadzone:", - "ControllerSettingsLStick": "Left Stick", - "ControllerSettingsRStick": "Right Stick", - "ControllerSettingsTriggersLeft": "Triggers Left", - "ControllerSettingsTriggersRight": "Triggers Right", - "ControllerSettingsTriggersButtonsLeft": "Trigger Buttons Left", - "ControllerSettingsTriggersButtonsRight": "Trigger Buttons Right", - "ControllerSettingsTriggers": "Triggers", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Buttons Left", - "ControllerSettingsExtraButtonsRight": "Buttons Right", - "ControllerSettingsMisc": "Miscellaneous", - "ControllerSettingsTriggerThreshold": "Trigger Threshold:", - "ControllerSettingsMotion": "Motion", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Use CemuHook compatible motion", - "ControllerSettingsMotionControllerSlot": "Controller Slot:", - "ControllerSettingsMotionMirrorInput": "Mirror Input", - "ControllerSettingsMotionRightJoyConSlot": "Right JoyCon Slot:", - "ControllerSettingsMotionServerHost": "Server Host:", - "ControllerSettingsMotionGyroSensitivity": "Gyro Sensitivity:", - "ControllerSettingsMotionGyroDeadzone": "Gyro Deadzone:", - "ControllerSettingsSave": "Save", - "ControllerSettingsClose": "Close", - "KeyUnknown": "Unknown", - "KeyShiftLeft": "Shift Left", - "KeyShiftRight": "Shift Right", - "KeyControlLeft": "Ctrl Left", - "KeyMacControlLeft": "⌃ Left", - "KeyControlRight": "Ctrl Right", - "KeyMacControlRight": "⌃ Right", - "KeyAltLeft": "Alt Left", - "KeyMacAltLeft": "⌥ Left", - "KeyAltRight": "Alt Right", - "KeyMacAltRight": "⌥ Right", - "KeyWinLeft": "⊞ Left", - "KeyMacWinLeft": "⌘ Left", - "KeyWinRight": "⊞ Right", - "KeyMacWinRight": "⌘ Right", - "KeyMenu": "Menu", - "KeyUp": "Up", - "KeyDown": "Down", - "KeyLeft": "Left", - "KeyRight": "Right", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Right", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Left Trigger 0", - "GamepadSingleRightTrigger0": "Right Trigger 0", - "GamepadSingleLeftTrigger1": "Left Trigger 1", - "GamepadSingleRightTrigger1": "Right Trigger 1", - "StickLeft": "Left Stick", - "StickRight": "Right Stick", - "UserProfilesSelectedUserProfile": "Selected User Profile:", - "UserProfilesSaveProfileName": "Save Profile Name", - "UserProfilesChangeProfileImage": "Change Profile Image", - "UserProfilesAvailableUserProfiles": "Available User Profiles:", - "UserProfilesAddNewProfile": "Create Profile", - "UserProfilesDelete": "Delete", - "UserProfilesClose": "Close", - "ProfileNameSelectionWatermark": "Choose a nickname", - "ProfileImageSelectionTitle": "Profile Image Selection", - "ProfileImageSelectionHeader": "Choose a profile Image", - "ProfileImageSelectionNote": "You may import a custom profile image, or select an avatar from system firmware", - "ProfileImageSelectionImportImage": "Import Image File", - "ProfileImageSelectionSelectAvatar": "Select Firmware Avatar", - "InputDialogTitle": "Input Dialog", - "InputDialogOk": "OK", - "InputDialogCancel": "Cancel", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "Choose the Profile Name", - "InputDialogAddNewProfileHeader": "Please Enter a Profile Name", - "InputDialogAddNewProfileSubtext": "(Max Length: {0})", - "AvatarChoose": "Choose Avatar", - "AvatarSetBackgroundColor": "Set Background Color", - "AvatarClose": "Close", - "ControllerSettingsLoadProfileToolTip": "Load Profile", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "Add Profile", - "ControllerSettingsRemoveProfileToolTip": "Remove Profile", - "ControllerSettingsSaveProfileToolTip": "Save Profile", - "MenuBarFileToolsTakeScreenshot": "Take Screenshot", - "MenuBarFileToolsHideUi": "Hide UI", - "GameListContextMenuRunApplication": "Run Application", - "GameListContextMenuToggleFavorite": "Toggle Favorite", - "GameListContextMenuToggleFavoriteToolTip": "Toggle Favorite status of Game", - "SettingsTabGeneralTheme": "Theme:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "Dark", - "SettingsTabGeneralThemeLight": "Light", - "ControllerSettingsConfigureGeneral": "Configure", - "ControllerSettingsRumble": "Rumble", - "ControllerSettingsRumbleStrongMultiplier": "Strong Rumble Multiplier", - "ControllerSettingsRumbleWeakMultiplier": "Weak Rumble Multiplier", - "DialogMessageSaveNotAvailableMessage": "There is no savedata for {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "Would you like to create savedata for this game?", - "DialogConfirmationTitle": "Ryujinx - Confirmation", - "DialogUpdaterTitle": "Ryujinx - Updater", - "DialogErrorTitle": "Ryujinx - Error", - "DialogWarningTitle": "Ryujinx - Warning", - "DialogExitTitle": "Ryujinx - Exit", - "DialogErrorMessage": "Ryujinx has encountered an error", - "DialogExitMessage": "Are you sure you want to close Ryujinx?", - "DialogExitSubMessage": "All unsaved data will be lost!", - "DialogMessageCreateSaveErrorMessage": "There was an error creating the specified savedata: {0}", - "DialogMessageFindSaveErrorMessage": "There was an error finding the specified savedata: {0}", - "FolderDialogExtractTitle": "Choose the folder to extract into", - "DialogNcaExtractionMessage": "Extracting {0} section from {1}...", - "DialogNcaExtractionTitle": "NCA Section Extractor", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Extraction failure. The main NCA was not present in the selected file.", - "DialogNcaExtractionCheckLogErrorMessage": "Extraction failed. Please check the log file for more details.", - "DialogNcaExtractionSuccessMessage": "Extraction completed successfully.", - "DialogUpdaterConvertFailedMessage": "Unable to convert the current Ryujinx version.", - "DialogUpdaterCancelUpdateMessage": "Update canceled!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "You are already using the latest version of Ryujinx!", - "DialogUpdaterFailedToGetVersionMessage": "An error occurred while trying to retrieve release information from GitHub. This may happen if a new release is currently being compiled by GitHub Actions. Please try again in a few minutes.", - "DialogUpdaterConvertFailedGithubMessage": "Failed to convert the Ryujinx version received from GitHub.", - "DialogUpdaterDownloadingMessage": "Downloading Update...", - "DialogUpdaterExtractionMessage": "Extracting Update...", - "DialogUpdaterRenamingMessage": "Renaming Update...", - "DialogUpdaterAddingFilesMessage": "Adding New Update...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "Update Complete!", - "DialogUpdaterRestartMessage": "Do you want to restart Ryujinx now?", - "DialogUpdaterNoInternetMessage": "You are not connected to the Internet!", - "DialogUpdaterNoInternetSubMessage": "Please verify that you have a working Internet connection!", - "DialogUpdaterDirtyBuildMessage": "You cannot update a Dirty build of Ryujinx!", - "DialogUpdaterDirtyBuildSubMessage": "Please download Ryujinx at https://ryujinx.app/download if you are looking for a supported version.", - "DialogRestartRequiredMessage": "Restart Required", - "DialogThemeRestartMessage": "Theme has been saved. A restart is needed to apply the theme.", - "DialogThemeRestartSubMessage": "Do you want to restart", - "DialogFirmwareInstallEmbeddedMessage": "Would you like to install the firmware embedded in this game? (Firmware {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.", - "DialogFirmwareNoFirmwareInstalledMessage": "No Firmware Installed", - "DialogFirmwareInstalledMessage": "Firmware {0} was installed", - "DialogInstallFileTypesSuccessMessage": "Successfully installed file types!", - "DialogInstallFileTypesErrorMessage": "Failed to install file types.", - "DialogUninstallFileTypesSuccessMessage": "Successfully uninstalled file types!", - "DialogUninstallFileTypesErrorMessage": "Failed to uninstall file types.", - "DialogOpenSettingsWindowLabel": "Open Settings Window", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "Controller Applet", - "DialogMessageDialogErrorExceptionMessage": "Error displaying Message Dialog: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Error displaying Software Keyboard: {0}", - "DialogErrorAppletErrorExceptionMessage": "Error displaying ErrorApplet Dialog: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nFor more information on how to fix this error, follow our Setup Guide.", - "DialogUserErrorDialogTitle": "Ryujinx Error ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "An error occured while fetching information from the API.", - "DialogAmiiboApiConnectErrorMessage": "Unable to connect to Amiibo API server. The service may be down or you may need to verify your internet connection is online.", - "DialogProfileInvalidProfileErrorMessage": "Profile {0} is incompatible with the current input configuration system.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "Default Profile can not be overwritten", - "DialogProfileDeleteProfileTitle": "Deleting Profile", - "DialogProfileDeleteProfileMessage": "This action is irreversible, are you sure you want to continue?", - "DialogWarning": "Warning", - "DialogPPTCDeletionMessage": "You are about to queue a PPTC rebuild on the next boot of:\n\n{0}\n\nAre you sure you want to proceed?", - "DialogPPTCDeletionErrorMessage": "Error purging PPTC cache at {0}: {1}", - "DialogShaderDeletionMessage": "You are about to delete the Shader cache for :\n\n{0}\n\nAre you sure you want to proceed?", - "DialogShaderDeletionErrorMessage": "Error purging Shader cache at {0}: {1}", - "DialogRyujinxErrorMessage": "Ryujinx has encountered an error", - "DialogInvalidTitleIdErrorMessage": "UI error: The selected game did not have a valid title ID", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "A valid system firmware was not found in {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Install Firmware {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "System version {0} will be installed.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nThis will replace the current system version {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installing firmware...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "System version {0} successfully installed.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "There would be no other profiles to be opened if selected profile is deleted", - "DialogUserProfileDeletionConfirmMessage": "Do you want to delete the selected profile", - "DialogUserProfileUnsavedChangesTitle": "Warning - Unsaved Changes", - "DialogUserProfileUnsavedChangesMessage": "You have made changes to this user profile that have not been saved.", - "DialogUserProfileUnsavedChangesSubMessage": "Do you want to discard your changes?", - "DialogControllerSettingsModifiedConfirmMessage": "The current controller settings has been updated.", - "DialogControllerSettingsModifiedConfirmSubMessage": "Do you want to save?", - "DialogLoadFileErrorMessage": "{0}. Errored File: {1}", - "DialogModAlreadyExistsMessage": "Mod already exists", - "DialogModInvalidMessage": "The specified directory does not contain a mod!", - "DialogModDeleteNoParentMessage": "Failed to Delete: Could not find the parent directory for mod \"{0}\"!", - "DialogDlcNoDlcErrorMessage": "The specified file does not contain a DLC for the selected title!", - "DialogPerformanceCheckLoggingEnabledMessage": "You have trace logging enabled, which is designed to be used by developers only.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "For optimal performance, it's recommended to disable trace logging. Would you like to disable trace logging now?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "You have shader dumping enabled, which is designed to be used by developers only.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "For optimal performance, it's recommended to disable shader dumping. Would you like to disable shader dumping now?", - "DialogLoadAppGameAlreadyLoadedMessage": "A game has already been loaded", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Please stop emulation or close the emulator before launching another game.", - "DialogUpdateAddUpdateErrorMessage": "The specified file does not contain an update for the selected title!", - "DialogSettingsBackendThreadingWarningTitle": "Warning - Backend Threading", - "DialogSettingsBackendThreadingWarningMessage": "Ryujinx must be restarted after changing this option for it to apply fully. Depending on your platform, you may need to manually disable your driver's own multithreading when using Ryujinx's.", - "DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?", - "DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?", - "SettingsTabGraphicsFeaturesOptions": "Features", - "SettingsTabGraphicsBackendMultithreading": "Graphics Backend Multithreading:", - "CommonAuto": "Auto", - "CommonOff": "Off", - "CommonOn": "On", - "InputDialogYes": "Yes", - "InputDialogNo": "No", - "DialogProfileInvalidProfileNameErrorMessage": "The file name contains invalid characters. Please try again.", - "MenuBarOptionsPauseEmulation": "Pause", - "MenuBarOptionsResumeEmulation": "Resume", - "AboutUrlTooltipMessage": "Click to open the Ryujinx website in your default browser.", - "AboutDisclaimerMessage": "Ryujinx is not affiliated with Nintendo™,\nor any of its partners, in any way.", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) is used\nin our Amiibo emulation.", - "AboutPatreonUrlTooltipMessage": "Click to open the Ryujinx Patreon page in your default browser.", - "AboutGithubUrlTooltipMessage": "Click to open the Ryujinx GitHub page in your default browser.", - "AboutDiscordUrlTooltipMessage": "Click to open an invite to the Ryujinx Discord server in your default browser.", - "AboutTwitterUrlTooltipMessage": "Click to open the Ryujinx Twitter page in your default browser.", - "AboutRyujinxAboutTitle": "About:", - "AboutRyujinxAboutContent": "Ryujinx is an emulator for the Nintendo Switch™.\nPlease support us on Patreon.\nGet all the latest news on our Twitter or Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.", - "AboutRyujinxMaintainersTitle": "Maintained By:", - "AboutRyujinxMaintainersContentTooltipMessage": "Click to open the Contributors page in your default browser.", - "AboutRyujinxSupprtersTitle": "Supported on Patreon By:", - "AmiiboSeriesLabel": "Amiibo Series", - "AmiiboCharacterLabel": "Character", - "AmiiboScanButtonLabel": "Scan It", - "AmiiboOptionsShowAllLabel": "Show All Amiibo", - "AmiiboOptionsUsRandomTagLabel": "Hack: Use Random tag Uuid", - "DlcManagerTableHeadingEnabledLabel": "Enabled", - "DlcManagerTableHeadingTitleIdLabel": "Title ID", - "DlcManagerTableHeadingContainerPathLabel": "Container Path", - "DlcManagerTableHeadingFullPathLabel": "Full Path", - "DlcManagerRemoveAllButton": "Remove All", - "DlcManagerEnableAllButton": "Enable All", - "DlcManagerDisableAllButton": "Disable All", - "ModManagerDeleteAllButton": "Delete All", - "MenuBarOptionsChangeLanguage": "Change Language", - "MenuBarShowFileTypes": "Show File Types", - "CommonSort": "Sort", - "CommonShowNames": "Show Names", - "CommonFavorite": "Favorite", - "OrderAscending": "Ascending", - "OrderDescending": "Descending", - "SettingsTabGraphicsFeatures": "Features & Enhancements", - "ErrorWindowTitle": "Error Window", - "ToggleDiscordTooltip": "Choose whether or not to display Ryujinx on your \"currently playing\" Discord activity", - "AddGameDirBoxTooltip": "Enter a game directory to add to the list", - "AddGameDirTooltip": "Add a game directory to the list", - "RemoveGameDirTooltip": "Remove selected game directory", - "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list", - "AddAutoloadDirTooltip": "Add an autoload directory to the list", - "RemoveAutoloadDirTooltip": "Remove selected autoload directory", - "CustomThemeCheckTooltip": "Use a custom Avalonia theme for the GUI to change the appearance of the emulator menus", - "CustomThemePathTooltip": "Path to custom GUI theme", - "CustomThemeBrowseTooltip": "Browse for a custom GUI theme", - "DockModeToggleTooltip": "Docked mode makes the emulated system behave as a docked Nintendo Switch. This improves graphical fidelity in most games. Conversely, disabling this will make the emulated system behave as a handheld Nintendo Switch, reducing graphics quality.\n\nConfigure player 1 controls if planning to use docked mode; configure handheld controls if planning to use handheld mode.\n\nLeave ON if unsure.", - "DirectKeyboardTooltip": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.", - "DirectMouseTooltip": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.", - "RegionTooltip": "Change System Region", - "LanguageTooltip": "Change System Language", - "TimezoneTooltip": "Change System TimeZone", - "TimeTooltip": "Change System Time", - "VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.", - "PptcToggleTooltip": "Saves translated JIT functions so that they do not need to be translated every time the game loads.\n\nReduces stuttering and significantly speeds up boot times after the first boot of a game.\n\nLeave ON if unsure.", - "LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", - "FsIntegrityToggleTooltip": "Checks for corrupt files when booting a game, and if corrupt files are detected, displays a hash error in the log.\n\nHas no impact on performance and is meant to help troubleshooting.\n\nLeave ON if unsure.", - "AudioBackendTooltip": "Changes the backend used to render audio.\n\nSDL2 is the preferred one, while OpenAL and SoundIO are used as fallbacks. Dummy will have no sound.\n\nSet to SDL2 if unsure.", - "MemoryManagerTooltip": "Change how guest memory is mapped and accessed. Greatly affects emulated CPU performance.\n\nSet to HOST UNCHECKED if unsure.", - "MemoryManagerSoftwareTooltip": "Use a software page table for address translation. Highest accuracy but slowest performance.", - "MemoryManagerHostTooltip": "Directly map memory in the host address space. Much faster JIT compilation and execution.", - "MemoryManagerUnsafeTooltip": "Directly map memory, but do not mask the address within the guest address space before access. Faster, but at the cost of safety. The guest application can access memory from anywhere in Ryujinx, so only run programs you trust with this mode.", - "UseHypervisorTooltip": "Use Hypervisor instead of JIT. Greatly improves performance when available, but can be unstable in its current state.", - "DRamTooltip": "Utilizes an alternative memory mode with 8GiB of DRAM to mimic a Switch development model.\n\nThis is only useful for higher-resolution texture packs or 4k resolution mods. Does NOT improve performance.\n\nLeave OFF if unsure.", - "IgnoreMissingServicesTooltip": "Ignores unimplemented Horizon OS services. This may help in bypassing crashes when booting certain games.\n\nLeave OFF if unsure.", - "IgnoreAppletTooltip": "The external dialog \"Controller Applet\" will not appear if the gamepad is disconnected during gameplay. There will be no prompt to close the dialog or set up a new controller. Once the previously disconnected controller is reconnected, the game will automatically resume.", - "GraphicsBackendThreadingTooltip": "Executes graphics backend commands on a second thread.\n\nSpeeds up shader compilation, reduces stuttering, and improves performance on GPU drivers without multithreading support of their own. Slightly better performance on drivers with multithreading.\n\nSet to AUTO if unsure.", - "GalThreadingTooltip": "Executes graphics backend commands on a second thread.\n\nSpeeds up shader compilation, reduces stuttering, and improves performance on GPU drivers without multithreading support of their own. Slightly better performance on drivers with multithreading.\n\nSet to AUTO if unsure.", - "ShaderCacheToggleTooltip": "Saves a disk shader cache which reduces stuttering in subsequent runs.\n\nLeave ON if unsure.", - "ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.", - "ResolutionScaleEntryTooltip": "Floating point resolution scale, such as 1.5. Non-integral scales are more likely to cause issues or crash.", - "AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.", - "AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.", - "ShaderDumpPathTooltip": "Graphics Shaders Dump Path", - "FileLogTooltip": "Saves console logging to a log file on disk. Does not affect performance.", - "StubLogTooltip": "Prints stub log messages in the console. Does not affect performance.", - "InfoLogTooltip": "Prints info log messages in the console. Does not affect performance.", - "WarnLogTooltip": "Prints warning log messages in the console. Does not affect performance.", - "ErrorLogTooltip": "Prints error log messages in the console. Does not affect performance.", - "TraceLogTooltip": "Prints trace log messages in the console. Does not affect performance.", - "GuestLogTooltip": "Prints guest log messages in the console. Does not affect performance.", - "FileAccessLogTooltip": "Prints file access log messages in the console.", - "FSAccessLogModeTooltip": "Enables FS access log output to the console. Possible modes are 0-3", - "DeveloperOptionTooltip": "Use with care", - "OpenGlLogLevel": "Requires appropriate log levels enabled", - "DebugLogTooltip": "Prints debug log messages in the console.\n\nOnly use this if specifically instructed by a staff member, as it will make logs difficult to read and worsen emulator performance.", - "LoadApplicationFileTooltip": "Open a file explorer to choose a Switch compatible file to load", - "LoadApplicationFolderTooltip": "Open a file explorer to choose a Switch compatible, unpacked application to load", - "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from", - "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from", - "OpenRyujinxFolderTooltip": "Open Ryujinx filesystem folder", - "OpenRyujinxLogsTooltip": "Opens the folder where logs are written to", - "ExitTooltip": "Exit Ryujinx", - "OpenSettingsTooltip": "Open settings window", - "OpenProfileManagerTooltip": "Open User Profiles Manager window", - "StopEmulationTooltip": "Stop emulation of the current game and return to game selection", - "CheckUpdatesTooltip": "Check for updates to Ryujinx", - "OpenAboutTooltip": "Open About Window", - "GridSize": "Grid Size", - "GridSizeTooltip": "Change the size of grid items", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Brazilian Portuguese", - "AboutRyujinxContributorsButtonHeader": "See All Contributors", - "SettingsTabSystemAudioVolume": "Volume: ", - "AudioVolumeTooltip": "Change Audio Volume", - "SettingsTabSystemEnableInternetAccess": "Guest Internet Access/LAN Mode", - "EnableInternetAccessTooltip": "Allows the emulated application to connect to the Internet.\n\nGames with a LAN mode can connect to each other when this is enabled and the systems are connected to the same access point. This includes real consoles as well.\n\nDoes NOT allow connecting to Nintendo servers. May cause crashing in certain games that try to connect to the Internet.\n\nLeave OFF if unsure.", - "GameListContextMenuManageCheatToolTip": "Manage Cheats", - "GameListContextMenuManageCheat": "Manage Cheats", - "GameListContextMenuManageModToolTip": "Manage Mods", - "GameListContextMenuManageMod": "Manage Mods", - "ControllerSettingsStickRange": "Range:", - "DialogStopEmulationTitle": "Ryujinx - Stop Emulation", - "DialogStopEmulationMessage": "Are you sure you want to stop emulation?", - "SettingsTabCpu": "CPU", - "SettingsTabAudio": "Audio", - "SettingsTabNetwork": "Network", - "SettingsTabNetworkConnection": "Network Connection", - "SettingsTabCpuCache": "CPU Cache", - "SettingsTabCpuMemory": "CPU Mode", - "DialogUpdaterFlatpakNotSupportedMessage": "Please update Ryujinx via FlatHub.", - "UpdaterDisabledWarningTitle": "Updater Disabled!", - "ControllerSettingsRotate90": "Rotate 90° Clockwise", - "IconSize": "Icon Size", - "IconSizeTooltip": "Change the size of game icons", - "MenuBarOptionsShowConsole": "Show Console", - "ShaderCachePurgeError": "Error purging shader cache at {0}: {1}", - "UserErrorNoKeys": "Keys not found", - "UserErrorNoFirmware": "Firmware not found", - "UserErrorFirmwareParsingFailed": "Firmware parsing error", - "UserErrorApplicationNotFound": "Application not found", - "UserErrorUnknown": "Unknown error", - "UserErrorUndefined": "Undefined error", - "UserErrorNoKeysDescription": "Ryujinx was unable to find your 'prod.keys' file", - "UserErrorNoFirmwareDescription": "Ryujinx was unable to find any firmwares installed", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx was unable to parse the provided firmware. This is usually caused by outdated keys.", - "UserErrorApplicationNotFoundDescription": "Ryujinx couldn't find a valid application at the given path.", - "UserErrorUnknownDescription": "An unknown error occured!", - "UserErrorUndefinedDescription": "An undefined error occured! This shouldn't happen, please contact a dev!", - "OpenSetupGuideMessage": "Open the Setup Guide", - "NoUpdate": "No Update", - "TitleUpdateVersionLabel": "Version {0}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - Info", - "RyujinxConfirm": "Ryujinx - Confirmation", - "FileDialogAllTypes": "All types", - "Never": "Never", - "SwkbdMinCharacters": "Must be at least {0} characters long", - "SwkbdMinRangeCharacters": "Must be {0}-{1} characters long", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Software Keyboard", - "SoftwareKeyboardModeNumeric": "Must be 0-9 or '.' only", - "SoftwareKeyboardModeAlphabet": "Must be non CJK-characters only", - "SoftwareKeyboardModeASCII": "Must be ASCII text only", - "ControllerAppletControllers": "Supported Controllers:", - "ControllerAppletPlayers": "Players:", - "ControllerAppletDescription": "Your current configuration is invalid. Open settings and reconfigure your inputs.", - "ControllerAppletDocked": "Docked mode set. Handheld control should be disabled.", - "UpdaterRenaming": "Renaming Old Files...", - "UpdaterRenameFailed": "Updater was unable to rename file: {0}", - "UpdaterAddingFiles": "Adding New Files...", - "UpdaterExtracting": "Extracting Update...", - "UpdaterDownloading": "Downloading Update...", - "Docked": "Docked", - "Handheld": "Handheld", - "ConnectionError": "Connection Error.", - "AboutPageDeveloperListMore": "{0} and more...", - "ApiError": "API Error.", - "LoadingHeading": "Loading {0}", - "CompilingPPTC": "Compiling PTC", - "CompilingShaders": "Compiling Shaders", - "AllKeyboards": "All keyboards", - "OpenFileDialogTitle": "Select a supported file to open", - "OpenFolderDialogTitle": "Select a folder with an unpacked game", - "AllSupportedFormats": "All Supported Formats", - "RyujinxUpdater": "Ryujinx Updater", - "SettingsTabHotkeys": "Keyboard Hotkeys", - "SettingsTabHotkeysHotkeys": "Keyboard Hotkeys", - "SettingsTabHotkeysToggleVSyncModeHotkey": "Toggle VSync mode:", - "SettingsTabHotkeysScreenshotHotkey": "Screenshot:", - "SettingsTabHotkeysShowUiHotkey": "Show UI:", - "SettingsTabHotkeysPauseHotkey": "Pause:", - "SettingsTabHotkeysToggleMuteHotkey": "Mute:", - "SettingsTabHotkeysIncrementCustomVSyncIntervalHotkey": "Raise custom refresh rate", - "SettingsTabHotkeysDecrementCustomVSyncIntervalHotkey": "Lower custom refresh rate", - "ControllerMotionTitle": "Motion Control Settings", - "ControllerRumbleTitle": "Rumble Settings", - "SettingsSelectThemeFileDialogTitle": "Select Theme File", - "SettingsXamlThemeFile": "Xaml Theme File", - "AvatarWindowTitle": "Manage Accounts - Avatar", - "Amiibo": "Amiibo", - "Unknown": "Unknown", - "Usage": "Usage", - "Writable": "Writable", - "SelectDlcDialogTitle": "Select DLC files", - "SelectUpdateDialogTitle": "Select update files", - "SelectModDialogTitle": "Select mod directory", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "User Profiles Manager", - "CheatWindowTitle": "Cheats Manager", - "DlcWindowTitle": "Manage Downloadable Content for {0} ({1})", - "ModWindowTitle": "Manage Mods for {0} ({1})", - "UpdateWindowTitle": "Title Update Manager", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} new update(s) added", - "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.", - "CheatWindowHeading": "Cheats Available for {0} [{1}]", - "BuildId": "BuildId:", - "DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.", - "DlcWindowHeading": "{0} Downloadable Content(s) available for {1} ({2})", - "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} new update(s) added", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "{0} Mod(s)", - "UserProfilesEditProfile": "Edit Selected", - "Continue": "Continue", - "Cancel": "Cancel", - "Save": "Save", - "Discard": "Discard", - "Paused": "Paused", - "UserProfilesSetProfileImage": "Set Profile Image", - "UserProfileEmptyNameError": "Name is required", - "UserProfileNoImageError": "Profile image must be set", - "GameUpdateWindowHeading": "Manage Updates for {0} ({1})", - "SettingsTabHotkeysResScaleUpHotkey": "Increase resolution:", - "SettingsTabHotkeysResScaleDownHotkey": "Decrease resolution:", - "UserProfilesName": "Name:", - "UserProfilesUserId": "User ID:", - "SettingsTabGraphicsBackend": "Graphics Backend", - "SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.", - "SettingsEnableTextureRecompression": "Enable Texture Recompression", - "SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.", - "SettingsTabGraphicsPreferredGpu": "Preferred GPU", - "SettingsTabGraphicsPreferredGpuTooltip": "Select the graphics card that will be used with the Vulkan graphics backend.\n\nDoes not affect the GPU that OpenGL will use.\n\nSet to the GPU flagged as \"dGPU\" if unsure. If there isn't one, leave untouched.", - "SettingsAppRequiredRestartMessage": "Ryujinx Restart Required", - "SettingsGpuBackendRestartMessage": "Graphics Backend or GPU settings have been modified. This will require a restart to be applied", - "SettingsGpuBackendRestartSubMessage": "Do you want to restart now?", - "RyujinxUpdaterMessage": "Do you want to update Ryujinx to the latest version?", - "SettingsTabHotkeysVolumeUpHotkey": "Increase Volume:", - "SettingsTabHotkeysVolumeDownHotkey": "Decrease Volume:", - "SettingsEnableMacroHLE": "Enable Macro HLE", - "SettingsEnableMacroHLETooltip": "High-level emulation of GPU Macro code.\n\nImproves performance, but may cause graphical glitches in some games.\n\nLeave ON if unsure.", - "SettingsEnableColorSpacePassthrough": "Color Space Passthrough", - "SettingsEnableColorSpacePassthroughTooltip": "Directs the Vulkan backend to pass through color information without specifying a color space. For users with wide gamut displays, this may result in more vibrant colors, at the cost of color correctness.", - "VolumeShort": "Vol", - "UserProfilesManageSaves": "Manage Saves", - "DeleteUserSave": "Do you want to delete user save for this game?", - "IrreversibleActionNote": "This action is not reversible.", - "SaveManagerHeading": "Manage Saves for {0} ({1})", - "SaveManagerTitle": "Save Manager", - "Name": "Name", - "Size": "Size", - "Search": "Search", - "UserProfilesRecoverLostAccounts": "Recover Lost Accounts", - "Recover": "Recover", - "UserProfilesRecoverHeading": "Saves were found for the following accounts", - "UserProfilesRecoverEmptyList": "No profiles to recover", - "GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.", - "GraphicsAALabel": "Anti-Aliasing:", - "GraphicsScalingFilterLabel": "Scaling Filter:", - "GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nArea scaling is recommended when downscaling resolutions that are larger than the output window. It can be used to achieve a supersampled anti-aliasing effect when downscaling by more than 2x.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", - "GraphicsScalingFilterBilinear": "Bilinear", - "GraphicsScalingFilterNearest": "Nearest", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "Level", - "GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.", - "SmaaLow": "SMAA Low", - "SmaaMedium": "SMAA Medium", - "SmaaHigh": "SMAA High", - "SmaaUltra": "SMAA Ultra", - "UserEditorTitle": "Edit User", - "UserEditorTitleCreate": "Create User", - "SettingsTabNetworkInterface": "Network Interface:", - "NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.", - "NetworkInterfaceDefault": "Default", - "PackagingShaders": "Packaging Shaders", - "AboutChangelogButton": "View Changelog on GitHub", - "AboutChangelogButtonTooltipMessage": "Click to open the changelog for this version in your default browser.", - "SettingsTabNetworkMultiplayer": "Multiplayer", - "MultiplayerMode": "Mode:", - "MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.", - "MultiplayerModeDisabled": "Disabled", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/es_ES.json b/src/Ryujinx/Assets/Locales/es_ES.json deleted file mode 100644 index b473b1197..000000000 --- a/src/Ryujinx/Assets/Locales/es_ES.json +++ /dev/null @@ -1,879 +0,0 @@ -{ - "Language": "Español (ES)", - "MenuBarFileOpenApplet": "Abrir applet", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Abre el editor de Mii en modo autónomo", - "SettingsTabInputDirectMouseAccess": "Acceso directo al ratón", - "SettingsTabSystemMemoryManagerMode": "Modo del administrador de memoria:", - "SettingsTabSystemMemoryManagerModeSoftware": "Software", - "SettingsTabSystemMemoryManagerModeHost": "Host (rápido)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Host sin verificación (más rápido, inseguro)", - "SettingsTabSystemUseHypervisor": "Usar hipervisor", - "MenuBarFile": "_Archivo", - "MenuBarFileOpenFromFile": "_Cargar aplicación desde un archivo", - "MenuBarFileOpenFromFileError": "No se encontraron aplicaciones en el archivo seleccionado.", - "MenuBarFileOpenUnpacked": "Cargar juego _desempaquetado", - "MenuBarFileLoadDlcFromFolder": "Cargar DLC Desde Carpeta", - "MenuBarFileLoadTitleUpdatesFromFolder": "Cargar Actualizaciones de Títulos Desde Carpeta", - "MenuBarFileOpenEmuFolder": "Abrir carpeta de Ryujinx", - "MenuBarFileOpenLogsFolder": "Abrir carpeta de registros", - "MenuBarFileExit": "_Salir", - "MenuBarOptions": "_Opciones", - "MenuBarOptionsToggleFullscreen": "Cambiar a pantalla completa.", - "MenuBarOptionsStartGamesInFullscreen": "Iniciar juegos en pantalla completa", - "MenuBarOptionsStopEmulation": "Detener emulación", - "MenuBarOptionsSettings": "_Configuración", - "MenuBarOptionsManageUserProfiles": "_Gestionar perfiles de usuario", - "MenuBarActions": "_Acciones", - "MenuBarOptionsSimulateWakeUpMessage": "Simular mensaje de reactivación", - "MenuBarActionsScanAmiibo": "Escanear Amiibo", - "MenuBarTools": "_Herramientas", - "MenuBarToolsInstallFirmware": "Instalar firmware", - "MenuBarFileToolsInstallFirmwareFromFile": "Instalar firmware desde un archivo XCI o ZIP", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Instalar firmware desde una carpeta", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "Administrar tipos de archivo", - "MenuBarToolsInstallFileTypes": "Instalar tipos de archivo", - "MenuBarToolsUninstallFileTypes": "Desinstalar tipos de archivo", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_View", - "MenuBarViewWindow": "Tamaño Ventana", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Ayuda", - "MenuBarHelpCheckForUpdates": "Buscar actualizaciones", - "MenuBarHelpAbout": "Acerca de", - "MenuSearch": "Buscar...", - "GameListHeaderFavorite": "Favoritos", - "GameListHeaderIcon": "Icono", - "GameListHeaderApplication": "Nombre", - "GameListHeaderDeveloper": "Desarrollador", - "GameListHeaderVersion": "Versión", - "GameListHeaderTimePlayed": "Tiempo jugado", - "GameListHeaderLastPlayed": "Jugado por última vez", - "GameListHeaderFileExtension": "Extensión", - "GameListHeaderFileSize": "Tamaño del archivo", - "GameListHeaderPath": "Directorio", - "GameListContextMenuOpenUserSaveDirectory": "Abrir carpeta de guardado de este usuario", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Abre la carpeta que contiene la partida guardada del usuario para esta aplicación", - "GameListContextMenuOpenDeviceSaveDirectory": "Abrir carpeta de guardado del sistema para el usuario actual", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Abre la carpeta que contiene la partida guardada del sistema para esta aplicación", - "GameListContextMenuOpenBcatSaveDirectory": "Abrir carpeta de guardado BCAT del usuario", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Abrir la carpeta que contiene el guardado BCAT de esta aplicación", - "GameListContextMenuManageTitleUpdates": "Gestionar actualizaciones del juego", - "GameListContextMenuManageTitleUpdatesToolTip": "Abrir la ventana de gestión de actualizaciones de esta aplicación", - "GameListContextMenuManageDlc": "Gestionar DLC", - "GameListContextMenuManageDlcToolTip": "Abrir la ventana de gestión del DLC", - "GameListContextMenuCacheManagement": "Gestión de caché ", - "GameListContextMenuCacheManagementPurgePptc": "Reconstruir PPTC en cola", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Elimina la caché de PPTC de esta aplicación", - "GameListContextMenuCacheManagementPurgeShaderCache": "Limpiar caché de sombreadores", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Eliminar la caché de sombreadores de esta aplicación", - "GameListContextMenuCacheManagementOpenPptcDirectory": "Abrir carpeta de PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Abrir la carpeta que contiene la caché de PPTC de esta aplicación", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Abrir carpeta de caché de sombreadores", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Abrir la carpeta que contiene la caché de sombreadores de esta aplicación", - "GameListContextMenuExtractData": "Extraer datos", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Extraer la sección ExeFS de la configuración actual de la aplicación (incluyendo actualizaciones)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Extraer la sección RomFS de la configuración actual de la aplicación (incluyendo actualizaciones)", - "GameListContextMenuExtractDataLogo": "Logotipo", - "GameListContextMenuExtractDataLogoToolTip": "Extraer la sección Logo de la configuración actual de la aplicación (incluyendo actualizaciones)", - "GameListContextMenuCreateShortcut": "Crear acceso directo de aplicación", - "GameListContextMenuCreateShortcutToolTip": "Crear un acceso directo en el escritorio que lance la aplicación seleccionada", - "GameListContextMenuCreateShortcutToolTipMacOS": "Crea un acceso directo en la carpeta de Aplicaciones de macOS que inicie la Aplicación seleccionada", - "GameListContextMenuOpenModsDirectory": "Abrir Directorio de Mods", - "GameListContextMenuOpenModsDirectoryToolTip": "Abre el directorio que contiene los Mods de la Aplicación.", - "GameListContextMenuOpenSdModsDirectory": "Abrir Directorio de Mods de Atmosphere\n\n\n\n\n\n", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Abre el directorio alternativo de la tarjeta SD de Atmosphere que contiene los Mods de la Aplicación. Útil para los mods que están empaquetados para el hardware real.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} juegos cargados", - "StatusBarSystemVersion": "Versión del sistema: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Límite inferior para mapeos de memoria detectado", - "LinuxVmMaxMapCountDialogTextPrimary": "¿Quieres aumentar el valor de vm.max_map_count a {0}?", - "LinuxVmMaxMapCountDialogTextSecondary": "Algunos juegos podrían intentar crear más mapeos de memoria de los permitidos. Ryujinx se bloqueará tan pronto como se supere este límite.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Sí, hasta el próximo reinicio", - "LinuxVmMaxMapCountDialogButtonPersistent": "Si, permanentemente", - "LinuxVmMaxMapCountWarningTextPrimary": "La cantidad máxima de mapeos de memoria es menor de lo recomendado.", - "LinuxVmMaxMapCountWarningTextSecondary": "El valor actual de vm.max_map_count ({0}) es menor que {1}. Algunos juegos podrían intentar crear más mapeos de memoria de los permitidos actualmente. Ryujinx se bloqueará tan pronto como se supere este límite.\n\nPuede que desee aumentar manualmente el límite o instalar pkexec, lo que permite a Ryujinx ayudar con eso.", - "Settings": "Configuración", - "SettingsTabGeneral": "Interfaz de usuario", - "SettingsTabGeneralGeneral": "General", - "SettingsTabGeneralEnableDiscordRichPresence": "Habilitar estado en Discord", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Buscar actualizaciones al iniciar", - "SettingsTabGeneralShowConfirmExitDialog": "Mostrar diálogo de confirmación al cerrar", - "SettingsTabGeneralRememberWindowState": "Recordar Tamaño/Posición de la Ventana", - "SettingsTabGeneralShowTitleBar": "Mostrar Barra de Título (Requiere reinicio)", - "SettingsTabGeneralHideCursor": "Esconder el cursor:", - "SettingsTabGeneralHideCursorNever": "Nunca", - "SettingsTabGeneralHideCursorOnIdle": "Ocultar cursor cuando esté inactivo", - "SettingsTabGeneralHideCursorAlways": "Siempre", - "SettingsTabGeneralGameDirectories": "Carpetas de juegos", - "SettingsTabGeneralAutoloadDirectories": "Carpetas de DLC/Actualizaciones para Carga Automática", - "SettingsTabGeneralAutoloadNote": "DLC y Actualizaciones que hacen referencia a archivos ausentes serán desactivado automáticamente", - "SettingsTabGeneralAdd": "Agregar", - "SettingsTabGeneralRemove": "Quitar", - "SettingsTabSystem": "Sistema", - "SettingsTabSystemCore": "Núcleo", - "SettingsTabSystemSystemRegion": "Región del sistema:", - "SettingsTabSystemSystemRegionJapan": "Japón", - "SettingsTabSystemSystemRegionUSA": "EEUU", - "SettingsTabSystemSystemRegionEurope": "Europa", - "SettingsTabSystemSystemRegionAustralia": "Australia", - "SettingsTabSystemSystemRegionChina": "China", - "SettingsTabSystemSystemRegionKorea": "Corea", - "SettingsTabSystemSystemRegionTaiwan": "Taiwán", - "SettingsTabSystemSystemLanguage": "Idioma del sistema:", - "SettingsTabSystemSystemLanguageJapanese": "Japonés", - "SettingsTabSystemSystemLanguageAmericanEnglish": "Inglés americano", - "SettingsTabSystemSystemLanguageFrench": "Francés", - "SettingsTabSystemSystemLanguageGerman": "Alemán", - "SettingsTabSystemSystemLanguageItalian": "Italiano", - "SettingsTabSystemSystemLanguageSpanish": "Español", - "SettingsTabSystemSystemLanguageChinese": "Chino", - "SettingsTabSystemSystemLanguageKorean": "Coreano", - "SettingsTabSystemSystemLanguageDutch": "Neerlandés/Holandés", - "SettingsTabSystemSystemLanguagePortuguese": "Portugués", - "SettingsTabSystemSystemLanguageRussian": "Ruso", - "SettingsTabSystemSystemLanguageTaiwanese": "Taiwanés", - "SettingsTabSystemSystemLanguageBritishEnglish": "Inglés británico", - "SettingsTabSystemSystemLanguageCanadianFrench": "Francés canadiense", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Español latinoamericano", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Chino simplificado", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Chino tradicional", - "SettingsTabSystemSystemTimeZone": "Zona horaria del sistema:", - "SettingsTabSystemSystemTime": "Hora del sistema:", - "SettingsTabSystemEnableVsync": "Sincronización vertical", - "SettingsTabSystemEnablePptc": "PPTC (Cache de Traducción de Perfil Persistente)", - "SettingsTabSystemEnableLowPowerPptc": "Cache PPTC de bajo consumo", - "SettingsTabSystemEnableFsIntegrityChecks": "Comprobar integridad de los archivos", - "SettingsTabSystemAudioBackend": "Motor de audio:", - "SettingsTabSystemAudioBackendDummy": "Vacío", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "Hacks", - "SettingsTabSystemHacksNote": " (Pueden causar inestabilidad)", - "SettingsTabSystemDramSize": "Tamaño DRAM:", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "Ignorar servicios no implementados", - "SettingsTabSystemIgnoreApplet": "Ignorar el Applet", - "SettingsTabGraphics": "Gráficos", - "SettingsTabGraphicsAPI": "API de gráficos", - "SettingsTabGraphicsEnableShaderCache": "Habilitar caché de sombreadores", - "SettingsTabGraphicsAnisotropicFiltering": "Filtro anisotrópico:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Automático", - "SettingsTabGraphicsAnisotropicFiltering2x": "x2", - "SettingsTabGraphicsAnisotropicFiltering4x": "x4", - "SettingsTabGraphicsAnisotropicFiltering8x": "x8", - "SettingsTabGraphicsAnisotropicFiltering16x": "x16", - "SettingsTabGraphicsResolutionScale": "Escala de resolución:", - "SettingsTabGraphicsResolutionScaleCustom": "Personalizada (no recomendado)", - "SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "x3 (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (no recomendado)", - "SettingsTabGraphicsAspectRatio": "Relación de aspecto:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "Estirar a la ventana", - "SettingsTabGraphicsDeveloperOptions": "Opciones de desarrollador", - "SettingsTabGraphicsShaderDumpPath": "Directorio de volcado de sombreadores:", - "SettingsTabLogging": "Registros", - "SettingsTabLoggingLogging": "Registros", - "SettingsTabLoggingEnableLoggingToFile": "Habilitar registro a archivo", - "SettingsTabLoggingEnableStubLogs": "Habilitar registros de Stub", - "SettingsTabLoggingEnableInfoLogs": "Habilitar registros de Info", - "SettingsTabLoggingEnableWarningLogs": "Habilitar registros de Advertencia", - "SettingsTabLoggingEnableErrorLogs": "Habilitar registros de Error", - "SettingsTabLoggingEnableTraceLogs": "Habilitar registros de Rastro", - "SettingsTabLoggingEnableGuestLogs": "Habilitar registros de Guest", - "SettingsTabLoggingEnableFsAccessLogs": "Habilitar registros de Fs Access", - "SettingsTabLoggingFsGlobalAccessLogMode": "Modo de registros Fs Global Access:", - "SettingsTabLoggingDeveloperOptions": "Opciones de desarrollador (ADVERTENCIA: empeorarán el rendimiento)", - "SettingsTabLoggingDeveloperOptionsNote": "ADVERTENCIA: Reducirá el rendimiento", - "SettingsTabLoggingGraphicsBackendLogLevel": "Nivel de registro de backend gráficos:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "Nada", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Errores", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Ralentizaciones", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "Todo", - "SettingsTabLoggingEnableDebugLogs": "Habilitar registros de debug", - "SettingsTabInput": "Entrada", - "SettingsTabInputEnableDockedMode": "Modo dock/TV", - "SettingsTabInputDirectKeyboardAccess": "Acceso directo al teclado", - "SettingsButtonSave": "Guardar", - "SettingsButtonClose": "Cerrar", - "SettingsButtonOk": "Aceptar", - "SettingsButtonCancel": "Cancelar", - "SettingsButtonApply": "Aplicar", - "ControllerSettingsPlayer": "Jugador", - "ControllerSettingsPlayer1": "Jugador 1", - "ControllerSettingsPlayer2": "Jugador 2", - "ControllerSettingsPlayer3": "Jugador 3", - "ControllerSettingsPlayer4": "Jugador 4", - "ControllerSettingsPlayer5": "Jugador 5", - "ControllerSettingsPlayer6": "Jugador 6", - "ControllerSettingsPlayer7": "Jugador 7", - "ControllerSettingsPlayer8": "Jugador 8", - "ControllerSettingsHandheld": "Portátil", - "ControllerSettingsInputDevice": "Dispositivo de entrada", - "ControllerSettingsRefresh": "Actualizar", - "ControllerSettingsDeviceDisabled": "Deshabilitado", - "ControllerSettingsControllerType": "Tipo de Mando", - "ControllerSettingsControllerTypeHandheld": "Portátil", - "ControllerSettingsControllerTypeProController": "Mando Pro", - "ControllerSettingsControllerTypeJoyConPair": "Doble Joy-Con", - "ControllerSettingsControllerTypeJoyConLeft": "Joy-Con Izquierdo", - "ControllerSettingsControllerTypeJoyConRight": "Joy-Con Derecho", - "ControllerSettingsProfile": "Perfil", - "ControllerSettingsProfileDefault": "Predeterminado", - "ControllerSettingsLoad": "Cargar", - "ControllerSettingsAdd": "Agregar", - "ControllerSettingsRemove": "Quitar", - "ControllerSettingsButtons": "Botones", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Pad direccional", - "ControllerSettingsDPadUp": "Arriba", - "ControllerSettingsDPadDown": "Abajo", - "ControllerSettingsDPadLeft": "Izquierda", - "ControllerSettingsDPadRight": "Derecha", - "ControllerSettingsStickButton": "Botón", - "ControllerSettingsStickUp": "Arriba", - "ControllerSettingsStickDown": "Abajo", - "ControllerSettingsStickLeft": "Izquierda", - "ControllerSettingsStickRight": "Derecha", - "ControllerSettingsStickStick": "Palanca", - "ControllerSettingsStickInvertXAxis": "Invertir eje X", - "ControllerSettingsStickInvertYAxis": "Invertir eje Y", - "ControllerSettingsStickDeadzone": "Zona muerta:", - "ControllerSettingsLStick": "Palanca izquierda", - "ControllerSettingsRStick": "Palanca derecha", - "ControllerSettingsTriggersLeft": "Gatillos izquierdos", - "ControllerSettingsTriggersRight": "Gatillos derechos", - "ControllerSettingsTriggersButtonsLeft": "Botones de gatillo izquierdos", - "ControllerSettingsTriggersButtonsRight": "Botones de gatillo derechos", - "ControllerSettingsTriggers": "Gatillos", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Botones izquierdos", - "ControllerSettingsExtraButtonsRight": "Botones derechos", - "ControllerSettingsMisc": "Misceláneo", - "ControllerSettingsTriggerThreshold": "Límite de gatillos:", - "ControllerSettingsMotion": "Movimiento", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Usar movimiento compatible con CemuHook", - "ControllerSettingsMotionControllerSlot": "Puerto del mando:", - "ControllerSettingsMotionMirrorInput": "Paralelizar derecho e izquierdo", - "ControllerSettingsMotionRightJoyConSlot": "Puerto del Joy-Con derecho:", - "ControllerSettingsMotionServerHost": "Host del servidor:", - "ControllerSettingsMotionGyroSensitivity": "Sensibilidad de Gyro:", - "ControllerSettingsMotionGyroDeadzone": "Zona muerta de Gyro:", - "ControllerSettingsSave": "Guardar", - "ControllerSettingsClose": "Cerrar", - "KeyUnknown": "Desconocido", - "KeyShiftLeft": "Shift Left", - "KeyShiftRight": "Shift Right", - "KeyControlLeft": "Ctrl Left", - "KeyMacControlLeft": "⌃ Left", - "KeyControlRight": "Ctrl Right", - "KeyMacControlRight": "⌃ Right", - "KeyAltLeft": "Alt Left", - "KeyMacAltLeft": "⌥ Left", - "KeyAltRight": "Alt Right", - "KeyMacAltRight": "⌥ Right", - "KeyWinLeft": "⊞ Left", - "KeyMacWinLeft": "⌘ Left", - "KeyWinRight": "⊞ Right", - "KeyMacWinRight": "⌘ Right", - "KeyMenu": "Menu", - "KeyUp": "Up", - "KeyDown": "Down", - "KeyLeft": "Left", - "KeyRight": "Right", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Right", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Left Trigger 0", - "GamepadSingleRightTrigger0": "Right Trigger 0", - "GamepadSingleLeftTrigger1": "Left Trigger 1", - "GamepadSingleRightTrigger1": "Right Trigger 1", - "StickLeft": "Left Stick", - "StickRight": "Right Stick", - "UserProfilesSelectedUserProfile": "Perfil de usuario seleccionado:", - "UserProfilesSaveProfileName": "Guardar nombre de perfil", - "UserProfilesChangeProfileImage": "Cambiar imagen de perfil", - "UserProfilesAvailableUserProfiles": "Perfiles de usuario disponibles:", - "UserProfilesAddNewProfile": "Añadir nuevo perfil", - "UserProfilesDelete": "Eliminar", - "UserProfilesClose": "Cerrar", - "ProfileNameSelectionWatermark": "Escoge un apodo", - "ProfileImageSelectionTitle": "Selección de imagen de perfil", - "ProfileImageSelectionHeader": "Elige una imagen de perfil", - "ProfileImageSelectionNote": "Puedes importar una imagen de perfil personalizada, o seleccionar un avatar del firmware de sistema", - "ProfileImageSelectionImportImage": "Importar imagen", - "ProfileImageSelectionSelectAvatar": "Seleccionar avatar del firmware", - "InputDialogTitle": "Cuadro de diálogo de entrada", - "InputDialogOk": "Aceptar", - "InputDialogCancel": "Cancelar", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "Introducir nombre de perfil", - "InputDialogAddNewProfileHeader": "Por favor elige un nombre de usuario", - "InputDialogAddNewProfileSubtext": "(Máximo de caracteres: {0})", - "AvatarChoose": "Escoger", - "AvatarSetBackgroundColor": "Establecer color de fondo", - "AvatarClose": "Cerrar", - "ControllerSettingsLoadProfileToolTip": "Cargar perfil", - "ControllerSettingsViewProfileToolTip": "Ver perfil", - "ControllerSettingsAddProfileToolTip": "Agregar perfil", - "ControllerSettingsRemoveProfileToolTip": "Eliminar perfil", - "ControllerSettingsSaveProfileToolTip": "Guardar perfil", - "MenuBarFileToolsTakeScreenshot": "Captura de pantalla", - "MenuBarFileToolsHideUi": "Ocultar interfaz", - "GameListContextMenuRunApplication": "Ejecutar aplicación", - "GameListContextMenuToggleFavorite": "Marcar favorito", - "GameListContextMenuToggleFavoriteToolTip": "Marca o desmarca el juego como favorito", - "SettingsTabGeneralTheme": "Tema:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "Oscuro", - "SettingsTabGeneralThemeLight": "Claro", - "ControllerSettingsConfigureGeneral": "Configurar", - "ControllerSettingsRumble": "Vibración", - "ControllerSettingsRumbleStrongMultiplier": "Multiplicador de vibraciones fuertes", - "ControllerSettingsRumbleWeakMultiplier": "Multiplicador de vibraciones débiles", - "DialogMessageSaveNotAvailableMessage": "No hay datos de guardado para {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "¿Quieres crear datos de guardado para este juego?", - "DialogConfirmationTitle": "Ryujinx - Confirmación", - "DialogUpdaterTitle": "Ryujinx - Actualizador", - "DialogErrorTitle": "Ryujinx - Error", - "DialogWarningTitle": "Ryujinx - Advertencia", - "DialogExitTitle": "Ryujinx - Salir", - "DialogErrorMessage": "Ryujinx encontró un error", - "DialogExitMessage": "¿Seguro que quieres cerrar Ryujinx?", - "DialogExitSubMessage": "¡Se perderán los datos no guardados!", - "DialogMessageCreateSaveErrorMessage": "Hubo un error al crear los datos de guardado especificados: {0}", - "DialogMessageFindSaveErrorMessage": "Hubo un error encontrando los datos de guardado especificados: {0}", - "FolderDialogExtractTitle": "Elige la carpeta en la que deseas extraer", - "DialogNcaExtractionMessage": "Extrayendo {0} sección de {1}...", - "DialogNcaExtractionTitle": "Extractor de sección NCA", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Fallo de extracción. El NCA principal no estaba presente en el archivo seleccionado.", - "DialogNcaExtractionCheckLogErrorMessage": "Fallo de extracción. Lee el registro para más información.", - "DialogNcaExtractionSuccessMessage": "Se completó la extracción con éxito.", - "DialogUpdaterConvertFailedMessage": "No se pudo convertir la versión actual de Ryujinx.", - "DialogUpdaterCancelUpdateMessage": "¡Cancelando actualización!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "¡Ya tienes la versión más reciente de Ryujinx!", - "DialogUpdaterFailedToGetVersionMessage": "Se ha producido un error al intentar obtener información de liberación de GitHub Release. Esto puede ser causado si una nueva versión está siendo compilada por GitHub Actions. Inténtalo de nuevo en unos minutos.", - "DialogUpdaterConvertFailedGithubMessage": "No se pudo convertir la versión de Ryujinx recibida de GitHub Release.", - "DialogUpdaterDownloadingMessage": "Descargando actualización...", - "DialogUpdaterExtractionMessage": "Extrayendo actualización...", - "DialogUpdaterRenamingMessage": "Renombrando actualización...", - "DialogUpdaterAddingFilesMessage": "Aplicando actualización...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "¡Actualización completa!", - "DialogUpdaterRestartMessage": "¿Quieres reiniciar Ryujinx?", - "DialogUpdaterNoInternetMessage": "¡No estás conectado a internet!", - "DialogUpdaterNoInternetSubMessage": "¡Por favor, verifica que tu conexión a Internet funciona!", - "DialogUpdaterDirtyBuildMessage": "¡No puedes actualizar una versión \"dirty\" de Ryujinx!", - "DialogUpdaterDirtyBuildSubMessage": "Por favor, descarga Ryujinx en https://ryujinx.app/download si buscas una versión con soporte.", - "DialogRestartRequiredMessage": "Se necesita reiniciar", - "DialogThemeRestartMessage": "Tema guardado. Se necesita reiniciar para aplicar el tema.", - "DialogThemeRestartSubMessage": "¿Quieres reiniciar?", - "DialogFirmwareInstallEmbeddedMessage": "¿Quieres instalar el firmware incluido en este juego? (Firmware versión {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "No se encontró ning{un firmware instalado pero Ryujinx pudo instalar firmware {0} del juego proporcionado.\nEl emulador iniciará.", - "DialogFirmwareNoFirmwareInstalledMessage": "No hay firmware instalado", - "DialogFirmwareInstalledMessage": "Se instaló el firmware {0}", - "DialogInstallFileTypesSuccessMessage": "¡Tipos de archivos instalados con éxito!", - "DialogInstallFileTypesErrorMessage": "No se pudo desinstalar los tipos de archivo.", - "DialogUninstallFileTypesSuccessMessage": "¡Tipos de archivos desinstalados con éxito!", - "DialogUninstallFileTypesErrorMessage": "No se pudo desinstalar los tipos de archivo.", - "DialogOpenSettingsWindowLabel": "Abrir ventana de opciones", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "Applet de mandos", - "DialogMessageDialogErrorExceptionMessage": "Error al mostrar cuadro de diálogo: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Error al mostrar teclado de software: {0}", - "DialogErrorAppletErrorExceptionMessage": "Error al mostrar díalogo ErrorApplet: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nPara más información sobre cómo arreglar este error, sigue nuestra Guía de Instalación.", - "DialogUserErrorDialogTitle": "Ryujinx Error ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "Ocurrió un error al recibir información de la API.", - "DialogAmiiboApiConnectErrorMessage": "No se pudo conectar al servidor de la API Amiibo. El servicio puede estar caído o tu conexión a internet puede haberse desconectado.", - "DialogProfileInvalidProfileErrorMessage": "El perfil {0} no es compatible con el sistema actual de configuración de entrada.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "El perfil predeterminado no se puede sobreescribir", - "DialogProfileDeleteProfileTitle": "Eliminando perfil", - "DialogProfileDeleteProfileMessage": "Esta acción es irreversible, ¿estás seguro de querer continuar?", - "DialogWarning": "Advertencia", - "DialogPPTCDeletionMessage": "Vas a borrar la caché de PPTC para:\n\n{0}\n\n¿Estás seguro de querer continuar?", - "DialogPPTCDeletionErrorMessage": "Error purgando la caché de PPTC en {0}: {1}", - "DialogShaderDeletionMessage": "Vas a borrar la caché de sombreadores para:\n\n{0}\n\n¿Estás seguro de querer continuar?", - "DialogShaderDeletionErrorMessage": "Error purgando la caché de sombreadores en {0}: {1}", - "DialogRyujinxErrorMessage": "Ryujinx ha encontrado un error", - "DialogInvalidTitleIdErrorMessage": "Error de interfaz: El juego seleccionado no tiene una ID válida", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "No se pudo encontrar un firmware válido en {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Instalar firmware {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "Se instalará la versión de sistema {0}.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nEsto reemplazará la versión de sistema actual, {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n¿Continuar?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Instalando firmware...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Versión de sistema {0} instalada con éxito.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "Si eliminas el perfil seleccionado no quedará ningún otro perfil", - "DialogUserProfileDeletionConfirmMessage": "¿Quieres eliminar el perfil seleccionado?", - "DialogUserProfileUnsavedChangesTitle": "Advertencia - Cambios sin guardar", - "DialogUserProfileUnsavedChangesMessage": "Ha realizado cambios en este perfil de usuario que no han sido guardados.", - "DialogUserProfileUnsavedChangesSubMessage": "¿Quieres descartar los cambios realizados?", - "DialogControllerSettingsModifiedConfirmMessage": "Se ha actualizado la configuración del mando actual.", - "DialogControllerSettingsModifiedConfirmSubMessage": "¿Guardar cambios?", - "DialogLoadFileErrorMessage": "{0}. Archivo con error: {1}", - "DialogModAlreadyExistsMessage": "El mod ya existe", - "DialogModInvalidMessage": "¡El directorio especificado no contiene un mod!", - "DialogModDeleteNoParentMessage": "Error al eliminar: ¡No se pudo encontrar el directorio principal para el mod \"{0}\"!", - "DialogDlcNoDlcErrorMessage": "¡Ese archivo no contiene contenido descargable para el título seleccionado!", - "DialogPerformanceCheckLoggingEnabledMessage": "Has habilitado los registros debug, diseñados solo para uso de los desarrolladores.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "Para un rendimiento óptimo, se recomienda deshabilitar los registros debug. ¿Quieres deshabilitarlos ahora?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "Has habilitado el volcado de sombreadores, diseñado solo para uso de los desarrolladores.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Para un rendimiento óptimo, se recomienda deshabilitar el volcado de sombreadores. ¿Quieres deshabilitarlo ahora?", - "DialogLoadAppGameAlreadyLoadedMessage": "Ya has cargado un juego", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Por favor, detén la emulación o cierra el emulador antes de iniciar otro juego.", - "DialogUpdateAddUpdateErrorMessage": "¡Ese archivo no contiene una actualización para el título seleccionado!", - "DialogSettingsBackendThreadingWarningTitle": "Advertencia - multihilado de gráficos", - "DialogSettingsBackendThreadingWarningMessage": "Ryujinx debe reiniciarse para aplicar este cambio. Dependiendo de tu plataforma, puede que tengas que desactivar manualmente la optimización enlazada de tus controladores gráficos para usar el multihilo de Ryujinx.", - "DialogModManagerDeletionWarningMessage": "Estás a punto de eliminar el mod: {0}\n\n¿Estás seguro de que quieres continuar?", - "DialogModManagerDeletionAllWarningMessage": "Estás a punto de eliminar todos los Mods para este título.\n\n¿Estás seguro de que quieres continuar?", - "SettingsTabGraphicsFeaturesOptions": "Funcionalidades", - "SettingsTabGraphicsBackendMultithreading": "Multihilado del motor gráfico:", - "CommonAuto": "Automático", - "CommonOff": "Desactivado", - "CommonOn": "Activado", - "InputDialogYes": "Sí", - "InputDialogNo": "No", - "DialogProfileInvalidProfileNameErrorMessage": "El nombre de archivo contiene caracteres inválidos. Por favor, inténtalo de nuevo.", - "MenuBarOptionsPauseEmulation": "Pausar", - "MenuBarOptionsResumeEmulation": "Reanudar", - "AboutUrlTooltipMessage": "Haz clic para abrir el sitio web de Ryujinx en tu navegador predeterminado.", - "AboutDisclaimerMessage": "Ryujinx no tiene afiliación alguna con Nintendo™,\nni con ninguno de sus socios.", - "AboutAmiiboDisclaimerMessage": "Utilizamos AmiiboAPI (www.amiiboapi.com)\nen nuestra emulación de Amiibo.", - "AboutPatreonUrlTooltipMessage": "Haz clic para abrir el Patreon de Ryujinx en tu navegador predeterminado.", - "AboutGithubUrlTooltipMessage": "Haz clic para abrir el GitHub de Ryujinx en tu navegador predeterminado.", - "AboutDiscordUrlTooltipMessage": "Haz clic para recibir una invitación al Discord de Ryujinx en tu navegador predeterminado.", - "AboutTwitterUrlTooltipMessage": "Haz clic para abrir el Twitter de Ryujinx en tu navegador predeterminado.", - "AboutRyujinxAboutTitle": "Acerca de:", - "AboutRyujinxAboutContent": "Ryujinx es un emulador para Nintendo Switch™.\nPor favor, apóyanos en Patreon.\nEncuentra las noticias más recientes en nuestro Twitter o Discord.\nDesarrolladores interesados en contribuir pueden encontrar más información en GitHub o Discord.", - "AboutRyujinxMaintainersTitle": "Mantenido por:", - "AboutRyujinxMaintainersContentTooltipMessage": "Haz clic para abrir la página de contribuidores en tu navegador predeterminado.", - "AboutRyujinxSupprtersTitle": "Apoyado en Patreon Por:", - "AmiiboSeriesLabel": "Serie de Amiibo", - "AmiiboCharacterLabel": "Personaje", - "AmiiboScanButtonLabel": "Escanear", - "AmiiboOptionsShowAllLabel": "Mostrar todos los Amiibo", - "AmiiboOptionsUsRandomTagLabel": "Hack: usar etiqueta aleatoria Uuid", - "DlcManagerTableHeadingEnabledLabel": "Habilitado", - "DlcManagerTableHeadingTitleIdLabel": "ID de título", - "DlcManagerTableHeadingContainerPathLabel": "Directorio del contenedor", - "DlcManagerTableHeadingFullPathLabel": "Directorio completo", - "DlcManagerRemoveAllButton": "Quitar todo", - "DlcManagerEnableAllButton": "Activar todas", - "DlcManagerDisableAllButton": "Desactivar todos", - "ModManagerDeleteAllButton": "Eliminar Todo", - "MenuBarOptionsChangeLanguage": "Cambiar idioma", - "MenuBarShowFileTypes": "Mostrar tipos de archivo", - "CommonSort": "Orden", - "CommonShowNames": "Mostrar nombres", - "CommonFavorite": "Favorito", - "OrderAscending": "Ascendente", - "OrderDescending": "Descendente", - "SettingsTabGraphicsFeatures": "Funcionalidades Y Mejoras", - "ErrorWindowTitle": "Ventana de error", - "ToggleDiscordTooltip": "Elige si muestras Ryujinx o no en tu actividad de Discord cuando lo estés usando", - "AddGameDirBoxTooltip": "Elige un directorio de juegos para mostrar en la ventana principal", - "AddGameDirTooltip": "Agrega un directorio de juegos a la lista", - "RemoveGameDirTooltip": "Quita el directorio seleccionado de la lista", - "AddAutoloadDirBoxTooltip": "Elige un directorio de carga automática para agregar a la lista", - "AddAutoloadDirTooltip": "Agregar un directorio de carga automática a la lista", - "RemoveAutoloadDirTooltip": "Eliminar el directorio de carga automática seleccionado", - "CustomThemeCheckTooltip": "Activa o desactiva los temas personalizados para la interfaz", - "CustomThemePathTooltip": "Carpeta que contiene los temas personalizados para la interfaz", - "CustomThemeBrowseTooltip": "Busca un tema personalizado para la interfaz", - "DockModeToggleTooltip": "El modo dock o modo TV hace que la consola emulada se comporte como una Nintendo Switch en su dock. Esto mejora la calidad gráfica en la mayoría de los juegos. Del mismo modo, si lo desactivas, el sistema emulado se comportará como una Nintendo Switch en modo portátil, reduciendo la cálidad de los gráficos.\n\nConfigura los controles de \"Jugador\" 1 si planeas jugar en modo dock/TV; configura los controles de \"Portátil\" si planeas jugar en modo portátil.\n\nActívalo si no sabes qué hacer.", - "DirectKeyboardTooltip": "Soporte de acceso directo al teclado (HID). Proporciona a los juegos acceso a su teclado como dispositivo de entrada de texto.\n\nSolo funciona con juegos que permiten de forma nativa el uso del teclado en el hardware de Switch.\n\nDesactívalo si no sabes qué hacer.", - "DirectMouseTooltip": "Soporte de acceso directo al mouse (HID). Proporciona a los juegos acceso a su mouse como puntero.\n\nSolo funciona con juegos que permiten de forma nativa el uso de controles con mouse en el hardware de switch, lo cual son pocos.\n\nCuando esté activado, la funcionalidad de pantalla táctil puede no funcionar.\n\nDesactívalo si no sabes qué hacer.", - "RegionTooltip": "Cambia la región del sistema", - "LanguageTooltip": "Cambia el idioma del sistema", - "TimezoneTooltip": "Cambia la zona horaria del sistema", - "TimeTooltip": "Cambia la hora del sistema", - "VSyncToggleTooltip": "Sincronización vertical de la consola emulada. En práctica un limitador del framerate para la mayoría de los juegos; desactivando puede causar que juegos corran a mayor velocidad o que las pantallas de carga tarden más o queden atascados.\n\nSe puede alternar en juego utilizando una tecla de acceso rápido configurable (F1 by default). Recomendamos hacer esto en caso de querer desactivar sincroniziación vertical.\n\nDesactívalo si no sabes qué hacer.", - "PptcToggleTooltip": "Guarda funciones de JIT traducidas para que no sea necesario traducirlas cada vez que el juego carga.\n\nReduce los tirones y acelera significativamente el tiempo de inicio de los juegos después de haberlos ejecutado al menos una vez.\n\nActívalo si no sabes qué hacer.", - "LowPowerPptcToggleTooltip": "Cargue el PPTC utilizando un tercio de la cantidad de núcleos.", - "FsIntegrityToggleTooltip": "Comprueba si hay archivos corruptos en los juegos que ejecutes al abrirlos, y si detecta archivos corruptos, muestra un error de Hash en los registros.\n\nEsto no tiene impacto alguno en el rendimiento y está pensado para ayudar a resolver problemas.\n\nActívalo si no sabes qué hacer.", - "AudioBackendTooltip": "Cambia el motor usado para renderizar audio.\n\nSDL2 es el preferido, mientras que OpenAL y SoundIO se usan si hay problemas con este. Dummy no produce audio.\n\nSelecciona SDL2 si no sabes qué hacer.", - "MemoryManagerTooltip": "Cambia la forma de mapear y acceder a la memoria del guest. Afecta en gran medida al rendimiento de la CPU emulada.\n\nSelecciona \"Host sin verificación\" si no sabes qué hacer.", - "MemoryManagerSoftwareTooltip": "Usa una tabla de paginación de software para traducir direcciones. Ofrece la precisión más exacta pero el rendimiento más lento.", - "MemoryManagerHostTooltip": "Mapea la memoria directamente en la dirección de espacio del host. Compilación y ejecución JIT mucho más rápida.", - "MemoryManagerUnsafeTooltip": "Mapea la memoria directamente, pero no enmascara la dirección dentro del espacio de dirección del guest antes del acceso. El modo más rápido, pero a costa de seguridad. La aplicación guest puede acceder a la memoria desde cualquier parte en Ryujinx, así que ejecuta solo programas en los que confíes cuando uses este modo.", - "UseHypervisorTooltip": "Usar Hypervisor en lugar de JIT. Mejora enormemente el rendimiento cuando está disponible, pero puede ser inestable en su estado actual.", - "DRamTooltip": "Expande la memoria DRAM del sistema emulado de 4GiB a 6GiB.\n\nUtilizar solo con packs de texturas HD o mods de resolución 4K. NO mejora el rendimiento.\n\nDesactívalo si no sabes qué hacer.", - "IgnoreMissingServicesTooltip": "Hack para ignorar servicios no implementados del Horizon OS. Esto puede ayudar a sobrepasar crasheos cuando inicies ciertos juegos.\n\nDesactívalo si no sabes qué hacer.", - "IgnoreAppletTooltip": "El cuadro de diálogo externo \"Applet del controlador\" no aparecerá si el gamepad se desconecta durante el juego. No aparecerá ningún mensaje para cerrar el cuadro de diálogo o configurar un nuevo controlador. Una vez que se vuelva a conectar el controlador que se había desconectado anteriormente, el juego se reanudará automáticamente.", - "GraphicsBackendThreadingTooltip": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio procesamiento con múltiples hilos. Rendimiento ligeramente superior en controladores gráficos que soporten múltiples hilos.\n\nSelecciona \"Auto\" si no sabes qué hacer.", - "GalThreadingTooltip": "Ejecuta los comandos del motor gráfico en un segundo hilo. Acelera la compilación de sombreadores, reduce los tirones, y mejora el rendimiento en controladores gráficos que no realicen su propio procesamiento con múltiples hilos. Rendimiento ligeramente superior en controladores gráficos que soporten múltiples hilos.\n\nSelecciona \"Auto\" si no sabes qué hacer.", - "ShaderCacheToggleTooltip": "Guarda una caché de sombreadores en disco, la cual reduce los tirones a medida que vas jugando.\n\nActívalo si no sabes qué hacer.", - "ResolutionScaleTooltip": "Multiplica la resolución de rendereo del juego.\n\nAlgunos juegos podrían no funcionar con esto y verse pixelado al aumentar la resolución; en esos casos, quizás sería necesario buscar mods que de anti-aliasing o que aumenten la resolución interna. Para usar este último, probablemente necesitarás seleccionar Nativa.\n\nEsta opción puede ser modificada mientras que un juego este corriendo haciendo click en \"Aplicar\" más abajo; simplemente puedes mover la ventana de configuración a un lado y experimentar hasta que encuentres tu estilo preferido para un juego.\n\nTener en cuenta que 4x es excesivo para prácticamente cualquier configuración.", - "ResolutionScaleEntryTooltip": "Escalado de resolución de coma flotante, como por ejemplo 1,5. Los valores no íntegros pueden causar errores gráficos o crashes.", - "AnisotropyTooltip": "Nivel de filtrado anisotrópico. Setear en Auto para utilizar el valor solicitado por el juego.", - "AspectRatioTooltip": "Relación de aspecto aplicada a la ventana del renderizador.\n\nSolamente modificar esto si estás utilizando un mod de relación de aspecto para su juego, en cualquier otro caso los gráficos se estirarán.\n\nDejar en 16:9 si no sabe que hacer.", - "ShaderDumpPathTooltip": "Directorio en el cual se volcarán los sombreadores de los gráficos", - "FileLogTooltip": "Guarda los registros de la consola en archivos en disco. No afectan al rendimiento.", - "StubLogTooltip": "Escribe mensajes de Stub en la consola. No afectan al rendimiento.", - "InfoLogTooltip": "Escribe mensajes de Info en la consola. No afectan al rendimiento.", - "WarnLogTooltip": "Escribe mensajes de Advertencia en la consola. No afectan al rendimiento.", - "ErrorLogTooltip": "Escribe mensajes de Error en la consola. No afectan al rendimiento.", - "TraceLogTooltip": "Escribe mensajes de Rastro en la consola. No afectan al rendimiento.", - "GuestLogTooltip": "Escribe mensajes de Guest en la consola. No afectan al rendimiento.", - "FileAccessLogTooltip": "Activa mensajes de acceso a archivo en la consola", - "FSAccessLogModeTooltip": "Activa registros FS Access en la consola. Los modos posibles son entre 0 y 3", - "DeveloperOptionTooltip": "Usar con cuidado", - "OpenGlLogLevel": "Requiere activar los niveles de registro apropiados", - "DebugLogTooltip": "Escribe mensajes de debug en la consola\n\nActiva esto solo si un miembro del equipo te lo pide expresamente, pues hará que el registro sea difícil de leer y empeorará el rendimiento del emulador.", - "LoadApplicationFileTooltip": "Abre el explorador de archivos para elegir un archivo compatible con Switch para cargar", - "LoadApplicationFolderTooltip": "Abre el explorador de archivos para elegir un archivo desempaquetado y compatible con Switch para cargar", - "LoadDlcFromFolderTooltip": "Abrir un explorador de archivos para seleccionar una o más carpetas para cargar DLC de forma masiva", - "LoadTitleUpdatesFromFolderTooltip": "Abrir un explorador de archivos para seleccionar una o más carpetas para cargar actualizaciones de título de forma masiva", - "OpenRyujinxFolderTooltip": "Abre la carpeta de sistema de Ryujinx", - "OpenRyujinxLogsTooltip": "Abre la carpeta en la que se guardan los registros", - "ExitTooltip": "Cierra Ryujinx", - "OpenSettingsTooltip": "Abre la ventana de configuración", - "OpenProfileManagerTooltip": "Abre la ventana para gestionar los perfiles de usuario", - "StopEmulationTooltip": "Detiene la emulación del juego actual y regresa a la selección de juegos", - "CheckUpdatesTooltip": "Busca actualizaciones para Ryujinx", - "OpenAboutTooltip": "Abre la ventana \"Acerca de\"", - "GridSize": "Tamaño de cuadrícula", - "GridSizeTooltip": "Cambia el tamaño de los objetos en la cuadrícula", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Portugués brasileño", - "AboutRyujinxContributorsButtonHeader": "Ver todos los contribuidores", - "SettingsTabSystemAudioVolume": "Volumen: ", - "AudioVolumeTooltip": "Ajusta el nivel de volumen", - "SettingsTabSystemEnableInternetAccess": "Conectar guest a Internet/Modo LAN", - "EnableInternetAccessTooltip": "Permite a la aplicación emulada conectarse a Internet.\n\nLos juegos que tengan modo LAN podrán conectarse entre sí habilitando esta opción y estando conectados al mismo módem. Asimismo, esto permite conexiones con consolas reales.\n\nNO permite conectar con los servidores de Nintendo Online. Puede causar que ciertos juegos crasheen al intentar conectarse a sus servidores.\n\nDesactívalo si no estás seguro.", - "GameListContextMenuManageCheatToolTip": "Activa o desactiva los cheats", - "GameListContextMenuManageCheat": "Administrar cheats", - "GameListContextMenuManageModToolTip": "Gestionar Mods", - "GameListContextMenuManageMod": "Gestionar Mods", - "ControllerSettingsStickRange": "Alcance:", - "DialogStopEmulationTitle": "Ryujinx - Detener emulación", - "DialogStopEmulationMessage": "¿Seguro que quieres detener la emulación actual?", - "SettingsTabCpu": "CPU", - "SettingsTabAudio": "Sonido", - "SettingsTabNetwork": "Red", - "SettingsTabNetworkConnection": "Conexión de red", - "SettingsTabCpuCache": "Caché de CPU", - "SettingsTabCpuMemory": "Memoria de CPU", - "DialogUpdaterFlatpakNotSupportedMessage": "Por favor, actualiza Ryujinx a través de FlatHub.", - "UpdaterDisabledWarningTitle": "¡Actualizador deshabilitado!", - "ControllerSettingsRotate90": "Rotar 90° en el sentido de las agujas del reloj", - "IconSize": "Tamaño de iconos", - "IconSizeTooltip": "Cambia el tamaño de los iconos de juegos", - "MenuBarOptionsShowConsole": "Mostrar consola", - "ShaderCachePurgeError": "Error al eliminar la caché de sombreadores en {0}: {1}", - "UserErrorNoKeys": "No se encontraron keys", - "UserErrorNoFirmware": "No se encontró firmware", - "UserErrorFirmwareParsingFailed": "Error al analizar el firmware", - "UserErrorApplicationNotFound": "No se encontró la aplicación", - "UserErrorUnknown": "Error desconocido", - "UserErrorUndefined": "Error indefinido", - "UserErrorNoKeysDescription": "Ryujinx no pudo encontrar tus 'prod.keys'.", - "UserErrorNoFirmwareDescription": "Ryujinx no pudo encontrar un firmware instalado.", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx no pudo analizar el firmware. Normalmente esto ocurre debido a keys desfasadas.", - "UserErrorApplicationNotFoundDescription": "Ryujinx no pudo encontrar una aplicación válida en ese camino.", - "UserErrorUnknownDescription": "¡Ocurrió un error desconocido!", - "UserErrorUndefinedDescription": "¡Ocurrió un error indefinido! Esto no debería pasar, por favor, ¡contacta con un desarrollador!", - "OpenSetupGuideMessage": "Abrir la guía de instalación", - "NoUpdate": "No actualizado", - "TitleUpdateVersionLabel": "Versión {0} - {1}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - Info", - "RyujinxConfirm": "Ryujinx - Confirmación", - "FileDialogAllTypes": "Todos los tipos", - "Never": "Nunca", - "SwkbdMinCharacters": "Debe tener al menos {0} caracteres", - "SwkbdMinRangeCharacters": "Debe tener {0}-{1} caracteres", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Teclado de software", - "SoftwareKeyboardModeNumeric": "Debe ser sólo 0-9 o '.'", - "SoftwareKeyboardModeAlphabet": "Solo deben ser caracteres no CJK", - "SoftwareKeyboardModeASCII": "Solo deben ser texto ASCII", - "ControllerAppletControllers": "Controladores Compatibles:", - "ControllerAppletPlayers": "Jugadores:", - "ControllerAppletDescription": "Tu configuración actual no es válida. Abre la configuración y vuelve a configurar tus entradas", - "ControllerAppletDocked": "Modo acoplado activado. El modo portátil debería estar desactivado.", - "UpdaterRenaming": "Renombrando archivos viejos...", - "UpdaterRenameFailed": "El actualizador no pudo renombrar el archivo: {0}", - "UpdaterAddingFiles": "Añadiendo nuevos archivos...", - "UpdaterExtracting": "Extrayendo actualización...", - "UpdaterDownloading": "Descargando actualización...", - "Docked": "Dock/TV", - "Handheld": "Portátil", - "ConnectionError": "Error de conexión.", - "AboutPageDeveloperListMore": "{0} y más...", - "ApiError": "Error de API.", - "LoadingHeading": "Cargando {0}", - "CompilingPPTC": "Compilando PTC", - "CompilingShaders": "Compilando sombreadores", - "AllKeyboards": "Todos los teclados", - "OpenFileDialogTitle": "Selecciona un archivo soportado para cargar", - "OpenFolderDialogTitle": "Selecciona una carpeta con un juego desempaquetado", - "AllSupportedFormats": "Todos los formatos soportados", - "RyujinxUpdater": "Actualizador de Ryujinx", - "SettingsTabHotkeys": "Atajos de teclado", - "SettingsTabHotkeysHotkeys": "Atajos de teclado", - "SettingsTabHotkeysToggleVsyncHotkey": "Alternar la sincronización vertical:", - "SettingsTabHotkeysScreenshotHotkey": "Captura de pantalla:", - "SettingsTabHotkeysShowUiHotkey": "Mostrar interfaz:", - "SettingsTabHotkeysPauseHotkey": "Pausar:", - "SettingsTabHotkeysToggleMuteHotkey": "Silenciar:", - "ControllerMotionTitle": "Opciones de controles de movimiento", - "ControllerRumbleTitle": "Opciones de vibración", - "SettingsSelectThemeFileDialogTitle": "Selecciona un archivo de tema", - "SettingsXamlThemeFile": "Archivo de tema Xaml", - "AvatarWindowTitle": "Administrar cuentas - Avatar", - "Amiibo": "Amiibo", - "Unknown": "Desconocido", - "Usage": "Uso", - "Writable": "Escribible", - "SelectDlcDialogTitle": "Selecciona archivo(s) de DLC", - "SelectUpdateDialogTitle": "Selecciona archivo(s) de actualización", - "SelectModDialogTitle": "Seleccionar un directorio de Mods", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "Administrar perfiles de usuario", - "CheatWindowTitle": "Administrar cheats", - "DlcWindowTitle": "Administrar contenido descargable", - "ModWindowTitle": "Administrar Mods para {0} ({1})", - "UpdateWindowTitle": "Administrar actualizaciones", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} nueva(s) actualización(es) agregada(s)", - "UpdateWindowBundledContentNotice": "Las actualizaciones agrupadas no pueden ser eliminadas, solamente deshabilitadas.", - "CheatWindowHeading": "Cheats disponibles para {0} [{1}]", - "BuildId": "Id de compilación:", - "DlcWindowHeading": "Contenido descargable disponible para {0} [{1}]", - "DlcWindowDlcAddedMessage": "Se agregaron {0} nuevo(s) contenido(s) descargable(s)", - "AutoloadDlcAddedMessage": "Se agregaron {0} nuevo(s) contenido(s) descargable(s)", - "AutoloadDlcRemovedMessage": "Se eliminaron {0} contenido(s) descargable(s) faltantes", - "AutoloadUpdateAddedMessage": "Se agregaron {0} nueva(s) actualización(es)", - "AutoloadUpdateRemovedMessage": "Se eliminaron {0} actualización(es) faltantes", - "ModWindowHeading": "{0} Mod(s)", - "UserProfilesEditProfile": "Editar selección", - "Continue": "Continue", - "Cancel": "Cancelar", - "Save": "Guardar", - "Discard": "Descartar", - "Paused": "Pausado", - "UserProfilesSetProfileImage": "Elegir Imagen de Perfil ", - "UserProfileEmptyNameError": "El nombre es obligatorio", - "UserProfileNoImageError": "Debe establecerse la imagen de perfil", - "GameUpdateWindowHeading": "Actualizaciones disponibles para {0} [{1}]", - "SettingsTabHotkeysResScaleUpHotkey": "Aumentar la resolución:", - "SettingsTabHotkeysResScaleDownHotkey": "Disminuir la resolución:", - "UserProfilesName": "Nombre:", - "UserProfilesUserId": "Id de Usuario:", - "SettingsTabGraphicsBackend": "Fondo de gráficos", - "SettingsTabGraphicsBackendTooltip": "Seleccione el backend gráfico que utilizará el emulador.\n\nVulkan, en general, es mejor para todas las tarjetas gráficas modernas, mientras que sus controladores estén actualizados. Vulkan también cuenta con complicación más rápida de sombreadores (menos tirones) en todos los proveredores de GPU.\n\nOpenGL puede lograr mejores resultados en GPU Nvidia antiguas, GPU AMD antiguas en Linux o en GPUs con menor VRAM, aunque tirones de compilación de sombreadores serán mayores.\n\nSetear en Vulkan si no sabe que hacer. Setear en OpenGL si su GPU no tiene soporte para Vulkan aún con los últimos controladores gráficos.", - "SettingsEnableTextureRecompression": "Activar recompresión de texturas", - "SettingsEnableTextureRecompressionTooltip": "Comprimir texturas ASTC para reducir uso de VRAM.\n\nJuegos que utilizan este formato de textura incluyen Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder y The Legend of Zelda: Tears of the Kingdom.\n\nTarjetas gráficas con 4GiB de VRAM o menos probalemente se caeran en algún momento mientras que estén corriendo estos juegos.\n\nActivar solo si está quedan sin VRAM en los juegos antes mencionados. Desactívalo si no sabes qué hacer.", - "SettingsTabGraphicsPreferredGpu": "GPU preferida", - "SettingsTabGraphicsPreferredGpuTooltip": "Selecciona la tarjeta gráfica que se utilizará con los back-end de gráficos Vulkan.\n\nNo afecta la GPU que utilizará OpenGL.\n\nFije a la GPU marcada como \"dGUP\" ante dudas. Si no hay una, no haga modificaciones.", - "SettingsAppRequiredRestartMessage": "Reinicio de Ryujinx requerido.", - "SettingsGpuBackendRestartMessage": "La configuración de la GPU o del back-end de los gráficos fue modificada. Es necesario reiniciar para que se aplique.", - "SettingsGpuBackendRestartSubMessage": "¿Quieres reiniciar ahora?", - "RyujinxUpdaterMessage": "¿Quieres actualizar Ryujinx a la última versión?", - "SettingsTabHotkeysVolumeUpHotkey": "Aumentar volumen:", - "SettingsTabHotkeysVolumeDownHotkey": "Disminuir volumen:", - "SettingsEnableMacroHLE": "Activar Macros HLE", - "SettingsEnableMacroHLETooltip": "Emulación alto-nivel del código de Macros de GPU\n\nIncrementa el rendimiento, pero puede causar errores gráficos en algunos juegos.\n\nDeja esta opción activada si no estás seguro.", - "SettingsEnableColorSpacePassthrough": "Paso de espacio de color", - "SettingsEnableColorSpacePassthroughTooltip": "Dirige el backend de Vulkan a pasar a través de la información del color sin especificar un espacio de color. Para los usuarios con pantallas de gran gama, esto puede resultar en colores más vibrantes, a costa de la corrección del color.", - "VolumeShort": "Volumen", - "UserProfilesManageSaves": "Administrar mis partidas guardadas", - "DeleteUserSave": "¿Quieres borrar los datos de usuario de este juego?", - "IrreversibleActionNote": "Esta acción no es reversible.", - "SaveManagerHeading": "Administrar partidas guardadas para {0}", - "SaveManagerTitle": "Administrador de datos de guardado.", - "Name": "Nombre", - "Size": "Tamaño", - "Search": "Buscar", - "UserProfilesRecoverLostAccounts": "Recuperar cuentas perdidas", - "Recover": "Recuperar", - "UserProfilesRecoverHeading": "Datos de guardado fueron encontrados para las siguientes cuentas", - "UserProfilesRecoverEmptyList": "No hay perfiles a recuperar", - "GraphicsAATooltip": "Aplica antia-aliasing al rendereo del juego.\n\nFXAA desenfocará la mayor parte del la iamgen, mientras que SMAA intentará encontrar bordes irregulares y suavizarlos.\n\nNo se recomienda usar en conjunto con filtro de escala FSR.\n\nEsta opción puede ser modificada mientras que esté corriendo el juego haciendo click en \"Aplicar\" más abajo; simplemente puedes mover la ventana de configuración a un lado y experimentar hasta que encuentres tu estilo preferido para un juego.\n\nDejar en NADA si no está seguro.", - "GraphicsAALabel": "Suavizado de bordes:", - "GraphicsScalingFilterLabel": "Filtro de escalado:", - "GraphicsScalingFilterTooltip": "Elija el filtro de escala que se aplicará al utilizar la escala de resolución.\n\nBilinear funciona bien para juegos 3D y es una opción predeterminada segura.\n\nSe recomienda el bilinear para juegos de pixel art.\n\nFSR 1.0 es simplemente un filtro de afilado, no se recomienda su uso con FXAA o SMAA.\n\nEsta opción se puede cambiar mientras se ejecuta un juego haciendo clic en \"Aplicar\" a continuación; simplemente puedes mover la ventana de configuración a un lado y experimentar hasta que encuentres tu estilo preferido para un juego.\n\nDéjelo en BILINEAR si no está seguro.", - "GraphicsScalingFilterBilinear": "Bilinear", - "GraphicsScalingFilterNearest": "Cercano", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "Nivel", - "GraphicsScalingFilterLevelTooltip": "Ajuste el nivel de nitidez FSR 1.0. Mayor es más nítido.", - "SmaaLow": "SMAA Bajo", - "SmaaMedium": "SMAA Medio", - "SmaaHigh": "SMAA Alto", - "SmaaUltra": "SMAA Ultra", - "UserEditorTitle": "Editar usuario", - "UserEditorTitleCreate": "Crear Usuario", - "SettingsTabNetworkInterface": "Interfaz de Red", - "NetworkInterfaceTooltip": "Interfaz de red usada para características LAN/LDN.\n\njunto con una VPN o XLink Kai y un juego con soporte LAN, puede usarse para suplantar una conexión de la misma red a través de Internet.\n\nDeje en DEFAULT si no está seguro.", - "NetworkInterfaceDefault": "Predeterminado", - "PackagingShaders": "Empaquetando sombreadores", - "AboutChangelogButton": "Ver registro de cambios en GitHub", - "AboutChangelogButtonTooltipMessage": "Haga clic para abrir el registro de cambios para esta versión en su navegador predeterminado.", - "SettingsTabNetworkMultiplayer": "Multijugador", - "MultiplayerMode": "Modo:", - "MultiplayerModeTooltip": "Cambiar modo LDN multijugador.\n\nLdnMitm modificará la funcionalidad local de juego inalámbrico para funcionar como si fuera LAN, permitiendo locales conexiones de la misma red con otras instancias de Ryujinx y consolas hackeadas de Nintendo Switch que tienen instalado el módulo ldn_mitm.\n\nMultijugador requiere que todos los jugadores estén en la misma versión del juego (por ejemplo, Super Smash Bros. Ultimate v13.0.1 no se puede conectar a v13.0.0).\n\nDejar DESACTIVADO si no está seguro.", - "MultiplayerModeDisabled": "Deshabilitado", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Desactivar El Hosteo De Red P2P (puede aumentar latencia)", - "MultiplayerDisableP2PTooltip": "Desactivar el hosteo de red P2P, pares se conectarán a través del servidor maestro en lugar de conectarse directamente contigo.", - "LdnPassphrase": "Frase de contraseña de la Red:", - "LdnPassphraseTooltip": "Solo podrás ver los juegos hosteados con la misma frase de contraseña que tú.", - "LdnPassphraseInputTooltip": "Ingresar una frase de contraseña en formato Ryujinx-<8 caracteres hexadecimales>. Solamente podrás ver juegos hosteados con la misma frase de contraseña que tú.", - "LdnPassphraseInputPublic": "(público)", - "GenLdnPass": "Generar aleatorio", - "GenLdnPassTooltip": "Genera una nueva frase de contraseña, que puede ser compartida con otros jugadores.", - "ClearLdnPass": "Borrar", - "ClearLdnPassTooltip": "Borra la frase de contraseña actual, regresando a la red pública.", - "InvalidLdnPassphrase": "Frase de Contraseña Inválida! Debe ser en formato \"Ryujinx-<8 caracteres hexadecimales>\"" -} diff --git a/src/Ryujinx/Assets/Locales/fr_FR.json b/src/Ryujinx/Assets/Locales/fr_FR.json deleted file mode 100644 index 0223e322e..000000000 --- a/src/Ryujinx/Assets/Locales/fr_FR.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "Français", - "MenuBarFileOpenApplet": "Ouvrir un programme", - "MenuBarFileOpenAppletOpenMiiApplet": "Éditeur de Mii", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Ouvrir l'éditeur Mii en mode Standalone", - "SettingsTabInputDirectMouseAccess": "Accès direct à la souris", - "SettingsTabSystemMemoryManagerMode": "Mode de gestion de la mémoire :", - "SettingsTabSystemMemoryManagerModeSoftware": "Logiciel", - "SettingsTabSystemMemoryManagerModeHost": "Hôte (rapide)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Hôte non vérifié (plus rapide, non sécurisé)", - "SettingsTabSystemUseHypervisor": "Utiliser l'Hyperviseur", - "MenuBarFile": "_Fichier", - "MenuBarFileOpenFromFile": "_Charger un jeu depuis un fichier", - "MenuBarFileOpenFromFileError": "Aucun jeu trouvé dans le fichier sélectionné", - "MenuBarFileOpenUnpacked": "Charger un jeu extrait", - "MenuBarFileLoadDlcFromFolder": "Charger les DLC depuis le dossier des DLC", - "MenuBarFileLoadTitleUpdatesFromFolder": "Charger les mises à jour depuis le dossier des mises à jour", - "MenuBarFileOpenEmuFolder": "Ouvrir le dossier Ryujinx", - "MenuBarFileOpenLogsFolder": "Ouvrir le dossier des journaux", - "MenuBarFileExit": "_Quitter", - "MenuBarOptions": "_Options", - "MenuBarOptionsToggleFullscreen": "Basculer en plein écran", - "MenuBarOptionsStartGamesInFullscreen": "Démarrer le jeu en plein écran", - "MenuBarOptionsStopEmulation": "Arrêter l'émulation", - "MenuBarOptionsSettings": "_Paramètres", - "MenuBarOptionsManageUserProfiles": "_Gérer les profils d'utilisateurs", - "MenuBarActions": "_Actions", - "MenuBarOptionsSimulateWakeUpMessage": "Simuler un message de réveil", - "MenuBarActionsScanAmiibo": "Scanner un Amiibo", - "MenuBarTools": "_Outils", - "MenuBarToolsInstallFirmware": "Installer un firmware", - "MenuBarFileToolsInstallFirmwareFromFile": "Installer un firmware depuis un fichier XCI ou ZIP", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Installer un firmware depuis un dossier", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "Gérer les types de fichiers", - "MenuBarToolsInstallFileTypes": "Installer les types de fichiers", - "MenuBarToolsUninstallFileTypes": "Désinstaller les types de fichiers", - "MenuBarToolsXCITrimmer": "Réduire les fichiers XCI", - "MenuBarView": "_Fenêtre", - "MenuBarViewWindow": "Taille de la fenêtre", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Aide", - "MenuBarHelpCheckForUpdates": "Vérifier les mises à jour", - "MenuBarHelpAbout": "À propos", - "MenuSearch": "Rechercher...", - "GameListHeaderFavorite": "Favoris", - "GameListHeaderIcon": "Icône", - "GameListHeaderApplication": "Nom", - "GameListHeaderDeveloper": "Développeur", - "GameListHeaderVersion": "Version", - "GameListHeaderTimePlayed": "Temps de jeu", - "GameListHeaderLastPlayed": "Dernière partie jouée", - "GameListHeaderFileExtension": "Extension du Fichier", - "GameListHeaderFileSize": "Taille du Fichier", - "GameListHeaderPath": "Chemin", - "GameListContextMenuOpenUserSaveDirectory": "Ouvrir le dossier de sauvegarde utilisateur", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Ouvre le dossier contenant la sauvegarde utilisateur du jeu", - "GameListContextMenuOpenDeviceSaveDirectory": "Ouvrir le dossier de sauvegarde console", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Ouvre le dossier contenant la sauvegarde console du jeu", - "GameListContextMenuOpenBcatSaveDirectory": "Ouvrir le dossier de sauvegarde BCAT", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Ouvre le dossier contenant la sauvegarde BCAT du jeu", - "GameListContextMenuManageTitleUpdates": "Gérer les mises à jour", - "GameListContextMenuManageTitleUpdatesToolTip": "Ouvre la fenêtre de gestion des mises à jour du jeu", - "GameListContextMenuManageDlc": "Gérer les DLC", - "GameListContextMenuManageDlcToolTip": "Ouvre la fenêtre de gestion des DLC", - "GameListContextMenuCacheManagement": "Gestion des caches", - "GameListContextMenuCacheManagementPurgePptc": "Reconstruction du PPTC", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Effectuer une reconstruction du PPTC au prochain démarrage du jeu", - "GameListContextMenuCacheManagementPurgeShaderCache": "Purger les shaders", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Supprime les shaders du jeu", - "GameListContextMenuCacheManagementOpenPptcDirectory": "Ouvrir le dossier du PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Ouvre le dossier contenant le PPTC du jeu", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Ouvrir le dossier des shaders", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Ouvre le dossier contenant les shaders du jeu", - "GameListContextMenuExtractData": "Extraire les données", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Extrait la section ExeFS du jeu (mise à jour incluse)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Extrait la section RomFS du jeu (mise à jour incluse)", - "GameListContextMenuExtractDataLogo": "Logo", - "GameListContextMenuExtractDataLogoToolTip": "Extrait la section Logo du jeu (mise à jour incluse)", - "GameListContextMenuCreateShortcut": "Créer un raccourci", - "GameListContextMenuCreateShortcutToolTip": "Créer un raccourci sur le bureau qui lance le jeu sélectionné", - "GameListContextMenuCreateShortcutToolTipMacOS": "Créer un raccourci dans le dossier Applications de macOS qui lance le jeu sélectionné", - "GameListContextMenuOpenModsDirectory": "Ouvrir le dossier des mods", - "GameListContextMenuOpenModsDirectoryToolTip": "Ouvre le dossier contenant les mods du jeu", - "GameListContextMenuOpenSdModsDirectory": "Ouvrir le dossier des mods Atmosphère", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Ouvre le dossier alternatif de la carte SD Atmosphère qui contient les mods de l'application. Utile pour les mods conçus pour console.", - "GameListContextMenuTrimXCI": "Vérifier et réduire les fichiers XCI", - "GameListContextMenuTrimXCIToolTip": "Vérifier et réduire les fichiers XCI pour économiser de l'espace", - "StatusBarGamesLoaded": "{0}/{1} Jeux chargés", - "StatusBarSystemVersion": "Version du Firmware: {0}", - "StatusBarXCIFileTrimming": "Réduction du fichier XCI '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Limite basse pour les mappings mémoire détectée", - "LinuxVmMaxMapCountDialogTextPrimary": "Voulez-vous augmenter la valeur de vm.max_map_count à {0}", - "LinuxVmMaxMapCountDialogTextSecondary": "Certains jeux peuvent essayer de créer plus de mappings mémoire que ce qui est actuellement autorisé. Ryujinx plantera dès que cette limite sera dépassée.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Oui, jusqu'au prochain redémarrage", - "LinuxVmMaxMapCountDialogButtonPersistent": "Oui, en permanence", - "LinuxVmMaxMapCountWarningTextPrimary": "La quantité maximale de mappings mémoire est inférieure à la valeur recommandée.", - "LinuxVmMaxMapCountWarningTextSecondary": "La valeur actuelle de vm.max_map_count ({0}) est inférieure à {1}. Certains jeux peuvent essayer de créer plus de mappings mémoire que ceux actuellement autorisés. Ryujinx plantera dès que cette limite sera dépassée.\n\nVous pouvez soit augmenter manuellement la limite, soit installer pkexec, ce qui permet à Ryujinx de l'aider.", - "Settings": "Paramètres", - "SettingsTabGeneral": "Interface Utilisateur", - "SettingsTabGeneralGeneral": "Général", - "SettingsTabGeneralEnableDiscordRichPresence": "Activer Discord Rich Presence", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Vérifier les mises à jour au démarrage", - "SettingsTabGeneralShowConfirmExitDialog": "Afficher le message de \"Confirmation de sortie\"", - "SettingsTabGeneralRememberWindowState": "Mémoriser la taille/position de la fenêtre", - "SettingsTabGeneralShowTitleBar": "Afficher Barre de Titre (Nécessite redémarrage)", - "SettingsTabGeneralHideCursor": "Masquer le Curseur :", - "SettingsTabGeneralHideCursorNever": "Jamais", - "SettingsTabGeneralHideCursorOnIdle": "Masquer le curseur si inactif", - "SettingsTabGeneralHideCursorAlways": "Toujours", - "SettingsTabGeneralGameDirectories": "Dossiers des jeux", - "SettingsTabGeneralAutoloadDirectories": "Dossiers des mises à jour/DLC", - "SettingsTabGeneralAutoloadNote": "Les DLC et les mises à jour faisant référence aux fichiers manquants seront automatiquement déchargés.", - "SettingsTabGeneralAdd": "Ajouter", - "SettingsTabGeneralRemove": "Retirer", - "SettingsTabSystem": "Système", - "SettingsTabSystemCore": "Cœur", - "SettingsTabSystemSystemRegion": "Région du système :", - "SettingsTabSystemSystemRegionJapan": "Japon", - "SettingsTabSystemSystemRegionUSA": "USA", - "SettingsTabSystemSystemRegionEurope": "Europe", - "SettingsTabSystemSystemRegionAustralia": "Australie", - "SettingsTabSystemSystemRegionChina": "Chine", - "SettingsTabSystemSystemRegionKorea": "Corée", - "SettingsTabSystemSystemRegionTaiwan": "Taïwan", - "SettingsTabSystemSystemLanguage": "Langue du système :", - "SettingsTabSystemSystemLanguageJapanese": "Japonais", - "SettingsTabSystemSystemLanguageAmericanEnglish": "Anglais Américain", - "SettingsTabSystemSystemLanguageFrench": "Français", - "SettingsTabSystemSystemLanguageGerman": "Allemand", - "SettingsTabSystemSystemLanguageItalian": "Italien", - "SettingsTabSystemSystemLanguageSpanish": "Espagnol", - "SettingsTabSystemSystemLanguageChinese": "Chinois", - "SettingsTabSystemSystemLanguageKorean": "Coréen", - "SettingsTabSystemSystemLanguageDutch": "Néerlandais", - "SettingsTabSystemSystemLanguagePortuguese": "Portugais", - "SettingsTabSystemSystemLanguageRussian": "Russe", - "SettingsTabSystemSystemLanguageTaiwanese": "Taïwanais", - "SettingsTabSystemSystemLanguageBritishEnglish": "Anglais Britannique ", - "SettingsTabSystemSystemLanguageCanadianFrench": "Français Canadien", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Espagnol Latino-Américain", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Chinois simplifié", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Chinois traditionnel", - "SettingsTabSystemSystemTimeZone": "Fuseau horaire du système :", - "SettingsTabSystemSystemTime": "Heure du système :", - "SettingsTabSystemEnableVsync": "Synchronisation verticale (VSync)", - "SettingsTabSystemEnablePptc": "Activer le PPTC (Profiled Persistent Translation Cache)", - "SettingsTabSystemEnableLowPowerPptc": "PPTC à faible puissance", - "SettingsTabSystemEnableFsIntegrityChecks": "Activer la vérification de l'intégrité du système de fichiers", - "SettingsTabSystemAudioBackend": "Bibliothèque Audio :", - "SettingsTabSystemAudioBackendDummy": "Désactivée", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "Hacks", - "SettingsTabSystemHacksNote": "Cela peut causer des instabilités", - "SettingsTabSystemDramSize": "Taille de la DRAM :", - "SettingsTabSystemDramSize4GiB": "4GiO", - "SettingsTabSystemDramSize6GiB": "6GiO", - "SettingsTabSystemDramSize8GiB": "8GiO", - "SettingsTabSystemDramSize12GiB": "12GiO", - "SettingsTabSystemIgnoreMissingServices": "Ignorer les services manquants", - "SettingsTabSystemIgnoreApplet": "Ignorer la déconnexion de la manette", - "SettingsTabGraphics": "Graphismes", - "SettingsTabGraphicsAPI": "API Graphique", - "SettingsTabGraphicsEnableShaderCache": "Activer le cache des shaders", - "SettingsTabGraphicsAnisotropicFiltering": "Filtrage anisotrope :", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Auto", - "SettingsTabGraphicsAnisotropicFiltering2x": "x2", - "SettingsTabGraphicsAnisotropicFiltering4x": "x4", - "SettingsTabGraphicsAnisotropicFiltering8x": "x8", - "SettingsTabGraphicsAnisotropicFiltering16x": "x16", - "SettingsTabGraphicsResolutionScale": "Échelle de résolution :", - "SettingsTabGraphicsResolutionScaleCustom": "Personnalisée (Non recommandée)", - "SettingsTabGraphicsResolutionScaleNative": "Natif (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "x2 (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "x3 (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Non recommandé)", - "SettingsTabGraphicsAspectRatio": "Format d'affichage :", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "Étirer pour remplir la fenêtre", - "SettingsTabGraphicsDeveloperOptions": "Options développeur", - "SettingsTabGraphicsShaderDumpPath": "Chemin du dossier de copie des shaders :", - "SettingsTabLogging": "Journaux", - "SettingsTabLoggingLogging": "Journaux", - "SettingsTabLoggingEnableLoggingToFile": "Activer la sauvegarde des journaux vers un fichier", - "SettingsTabLoggingEnableStubLogs": "Activer les journaux stub", - "SettingsTabLoggingEnableInfoLogs": "Activer les journaux d'informations", - "SettingsTabLoggingEnableWarningLogs": "Activer les journaux d'avertissements", - "SettingsTabLoggingEnableErrorLogs": "Activer les journaux d'erreurs", - "SettingsTabLoggingEnableTraceLogs": "Activer les journaux d'erreurs Trace", - "SettingsTabLoggingEnableGuestLogs": "Activer les journaux du programme simulé", - "SettingsTabLoggingEnableFsAccessLogs": "Activer les journaux d'accès au système de fichiers", - "SettingsTabLoggingFsGlobalAccessLogMode": "Niveau des journaux d'accès au système de fichiers :", - "SettingsTabLoggingDeveloperOptions": "Options développeur", - "SettingsTabLoggingDeveloperOptionsNote": "ATTENTION : Réduira les performances", - "SettingsTabLoggingGraphicsBackendLogLevel": "Niveau du journal du backend graphique :", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "Aucun", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Erreur", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Ralentissements", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "Tout", - "SettingsTabLoggingEnableDebugLogs": "Activer les journaux de debug", - "SettingsTabInput": "Contrôles", - "SettingsTabInputEnableDockedMode": "Active le mode station d'accueil", - "SettingsTabInputDirectKeyboardAccess": "Accès direct au clavier", - "SettingsButtonSave": "Enregistrer", - "SettingsButtonClose": "Fermer", - "SettingsButtonOk": "OK", - "SettingsButtonCancel": "Annuler", - "SettingsButtonApply": "Appliquer", - "ControllerSettingsPlayer": "Joueur", - "ControllerSettingsPlayer1": "Joueur 1", - "ControllerSettingsPlayer2": "Joueur 2", - "ControllerSettingsPlayer3": "Joueur 3", - "ControllerSettingsPlayer4": "Joueur 4", - "ControllerSettingsPlayer5": "Joueur 5", - "ControllerSettingsPlayer6": "Joueur 6", - "ControllerSettingsPlayer7": "Joueur 7", - "ControllerSettingsPlayer8": "Joueur 8", - "ControllerSettingsHandheld": "Portable", - "ControllerSettingsInputDevice": "Périphériques", - "ControllerSettingsRefresh": "Actualiser", - "ControllerSettingsDeviceDisabled": "Désactivé", - "ControllerSettingsControllerType": "Type de manette", - "ControllerSettingsControllerTypeHandheld": "Portable", - "ControllerSettingsControllerTypeProController": "Manette Switch Pro", - "ControllerSettingsControllerTypeJoyConPair": "JoyCon Joints", - "ControllerSettingsControllerTypeJoyConLeft": "JoyCon Gauche", - "ControllerSettingsControllerTypeJoyConRight": "JoyCon Droite", - "ControllerSettingsProfile": "Profil", - "ControllerSettingsProfileDefault": "Défaut", - "ControllerSettingsLoad": "Charger", - "ControllerSettingsAdd": "Ajouter", - "ControllerSettingsRemove": "Supprimer", - "ControllerSettingsButtons": "Boutons", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Croix directionnelle", - "ControllerSettingsDPadUp": "Haut", - "ControllerSettingsDPadDown": "Bas", - "ControllerSettingsDPadLeft": "Gauche", - "ControllerSettingsDPadRight": "Droite", - "ControllerSettingsStickButton": "Bouton", - "ControllerSettingsStickUp": "Haut", - "ControllerSettingsStickDown": "Bas", - "ControllerSettingsStickLeft": "Gauche", - "ControllerSettingsStickRight": "Droite", - "ControllerSettingsStickStick": "Joystick", - "ControllerSettingsStickInvertXAxis": "Inverser l'axe X", - "ControllerSettingsStickInvertYAxis": "Inverser l'axe Y", - "ControllerSettingsStickDeadzone": "Zone morte :", - "ControllerSettingsLStick": "Joystick Gauche", - "ControllerSettingsRStick": "Joystick Droit", - "ControllerSettingsTriggersLeft": "Gachettes Gauche", - "ControllerSettingsTriggersRight": "Gachettes Droite", - "ControllerSettingsTriggersButtonsLeft": "Boutons Gachettes Gauche", - "ControllerSettingsTriggersButtonsRight": "Boutons Gachettes Droite", - "ControllerSettingsTriggers": "Gachettes", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Boutons Gauche", - "ControllerSettingsExtraButtonsRight": "Boutons Droite", - "ControllerSettingsMisc": "Divers", - "ControllerSettingsTriggerThreshold": "Seuil de gachettes :", - "ControllerSettingsMotion": "Mouvements", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Utiliser un capteur de mouvements CemuHook", - "ControllerSettingsMotionControllerSlot": "Contrôleur ID :", - "ControllerSettingsMotionMirrorInput": "Inverser les contrôles", - "ControllerSettingsMotionRightJoyConSlot": "JoyCon Droit ID :", - "ControllerSettingsMotionServerHost": "Serveur d'hébergement :", - "ControllerSettingsMotionGyroSensitivity": "Sensibilitée du gyroscope :", - "ControllerSettingsMotionGyroDeadzone": "Zone morte du gyroscope :", - "ControllerSettingsSave": "Enregistrer", - "ControllerSettingsClose": "Fermer", - "KeyUnknown": "Touche inconnue", - "KeyShiftLeft": "Maj Gauche", - "KeyShiftRight": "Maj Droite", - "KeyControlLeft": "Ctrl Gauche", - "KeyMacControlLeft": "⌃ Gauche", - "KeyControlRight": "Ctrl Droite", - "KeyMacControlRight": "⌃ Droite", - "KeyAltLeft": "Alt Gauche", - "KeyMacAltLeft": "⌥ Gauche", - "KeyAltRight": "Alt Droite", - "KeyMacAltRight": "⌥ Droite", - "KeyWinLeft": "⊞ Gauche", - "KeyMacWinLeft": "⌘ Gauche", - "KeyWinRight": "⊞ Droite", - "KeyMacWinRight": "⌘ Droite", - "KeyMenu": "Menu", - "KeyUp": "Haut", - "KeyDown": "Bas", - "KeyLeft": "Gauche", - "KeyRight": "Droite", - "KeyEnter": "Entrée", - "KeyEscape": "Esc", - "KeySpace": "Espace", - "KeyTab": "Tab", - "KeyBackSpace": "Supprimer", - "KeyInsert": "Ins", - "KeyDelete": "Sup", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "Fin", - "KeyCapsLock": "Verr. Maj", - "KeyScrollLock": "Arr. Déf.", - "KeyPrintScreen": "Imp. Écran", - "KeyPause": "Pause", - "KeyNumLock": "Verr. Num", - "KeyClear": "Clear", - "KeyKeypad0": "Num. 0", - "KeyKeypad1": "Num. 1", - "KeyKeypad2": "Num. 2", - "KeyKeypad3": "Num. 3", - "KeyKeypad4": "Num. 4", - "KeyKeypad5": "Num. 5", - "KeyKeypad6": "Num. 6", - "KeyKeypad7": "Num. 7", - "KeyKeypad8": "Num. 8", - "KeyKeypad9": "Num. 9", - "KeyKeypadDivide": "Num. Diviser", - "KeyKeypadMultiply": "Num. Multiplier", - "KeyKeypadSubtract": "Num. Soustraire", - "KeyKeypadAdd": "Num. Ajouter", - "KeyKeypadDecimal": "Num. Point", - "KeyKeypadEnter": "Num. Ent", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Pas Attribuée", - "GamepadLeftStick": "Bouton Joystick G.", - "GamepadRightStick": "Bouton Joystick D.", - "GamepadLeftShoulder": "Bouton Gachette G.", - "GamepadRightShoulder": "Bouton Gachette D.", - "GamepadLeftTrigger": "Gachette Gauche", - "GamepadRightTrigger": "Gachette Droite", - "GamepadDpadUp": "Haut", - "GamepadDpadDown": "Bas", - "GamepadDpadLeft": "Gauche", - "GamepadDpadRight": "Droite", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Autre", - "GamepadPaddle1": "Palette 1", - "GamepadPaddle2": "Palette 2", - "GamepadPaddle3": "Palette 3", - "GamepadPaddle4": "Palette 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Gachette Gauche 0", - "GamepadSingleRightTrigger0": "Gachette Droite 0", - "GamepadSingleLeftTrigger1": "Gachette Gauche 1", - "GamepadSingleRightTrigger1": "Gachette Droite 1", - "StickLeft": "Joystick Gauche", - "StickRight": "Joystick Droite", - "UserProfilesSelectedUserProfile": "Profil utilisateur sélectionné :", - "UserProfilesSaveProfileName": "Enregistrer le nom du profil", - "UserProfilesChangeProfileImage": "Changer l'image du profil", - "UserProfilesAvailableUserProfiles": "Profils utilisateurs disponibles :", - "UserProfilesAddNewProfile": "Créer un profil", - "UserProfilesDelete": "Supprimer", - "UserProfilesClose": "Fermer", - "ProfileNameSelectionWatermark": "Choisir un pseudo", - "ProfileImageSelectionTitle": "Sélection de l'image du profil", - "ProfileImageSelectionHeader": "Choisir l'image du profil", - "ProfileImageSelectionNote": "Vous pouvez importer une image de profil personnalisée ou sélectionner un avatar à partir du firmware", - "ProfileImageSelectionImportImage": "Importer une image", - "ProfileImageSelectionSelectAvatar": "Choisir un avatar du firmware", - "InputDialogTitle": "Fenêtre d'entrée de texte", - "InputDialogOk": "OK", - "InputDialogCancel": "Annuler", - "InputDialogCancelling": "Annulation en cours", - "InputDialogClose": "Fermer", - "InputDialogAddNewProfileTitle": "Choisir un nom de profil", - "InputDialogAddNewProfileHeader": "Merci d'entrer un nom de profil", - "InputDialogAddNewProfileSubtext": "(Longueur max.: {0})", - "AvatarChoose": "Choisir un avatar", - "AvatarSetBackgroundColor": "Choisir une couleur de fond", - "AvatarClose": "Fermer", - "ControllerSettingsLoadProfileToolTip": "Charger un profil", - "ControllerSettingsAddProfileToolTip": "Ajouter un profil", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsRemoveProfileToolTip": "Supprimer un profil", - "ControllerSettingsSaveProfileToolTip": "Enregistrer un profil", - "MenuBarFileToolsTakeScreenshot": "Prendre une capture d'écran", - "MenuBarFileToolsHideUi": "Masquer l'interface utilisateur", - "GameListContextMenuRunApplication": "Démarrer l'application", - "GameListContextMenuToggleFavorite": "Ajouter/Retirer des favoris", - "GameListContextMenuToggleFavoriteToolTip": "Définis un jeu comme faisant parti des favoris ou non", - "SettingsTabGeneralTheme": "Thème :", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "Sombre", - "SettingsTabGeneralThemeLight": "Clair", - "ControllerSettingsConfigureGeneral": "Configurer", - "ControllerSettingsRumble": "Vibreur", - "ControllerSettingsRumbleStrongMultiplier": "Multiplicateur de vibrations fortes", - "ControllerSettingsRumbleWeakMultiplier": "Multiplicateur de vibrations faibles", - "DialogMessageSaveNotAvailableMessage": "Il n'y a aucune sauvegarde pour {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "Voulez-vous créer une sauvegarde pour ce jeu ?", - "DialogConfirmationTitle": "Ryujinx - Confirmation", - "DialogUpdaterTitle": "Ryujinx - Mise à Jour", - "DialogErrorTitle": "Ryujinx - Erreur", - "DialogWarningTitle": "Ryujinx - Avertissement", - "DialogExitTitle": "Ryujinx - Quitter", - "DialogErrorMessage": "Ryujinx a rencontré une erreur", - "DialogExitMessage": "Êtes-vous sûr de vouloir fermer Ryujinx ?", - "DialogExitSubMessage": "Toutes les données non enregistrées seront perdues !", - "DialogMessageCreateSaveErrorMessage": "Une erreur s'est produite lors de la création de la sauvegarde spécifiée : {0}", - "DialogMessageFindSaveErrorMessage": "Une erreur s'est produite lors de la recherche de la sauvegarde spécifiée : {0}", - "FolderDialogExtractTitle": "Choisissez le dossier dans lequel extraire", - "DialogNcaExtractionMessage": "Extraction de la section {0} depuis {1}...", - "DialogNcaExtractionTitle": "Extracteur de la section NCA", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Échec de l'extraction. Le NCA principal n'était pas présent dans le fichier sélectionné.", - "DialogNcaExtractionCheckLogErrorMessage": "Échec de l'extraction. Lisez le fichier journal pour plus d'informations.", - "DialogNcaExtractionSuccessMessage": "Extraction terminée avec succès.", - "DialogUpdaterConvertFailedMessage": "Échec de la conversion de la version actuelle de Ryujinx.", - "DialogUpdaterCancelUpdateMessage": "Annuler la mise à jour !", - "DialogUpdaterAlreadyOnLatestVersionMessage": "Vous utilisez déjà la version la plus récente de Ryujinx !", - "DialogUpdaterFailedToGetVersionMessage": "Une erreur s'est produite lors de la tentative d'obtention des informations de publication de la version GitHub. Cela peut survenir lorsqu'une nouvelle version est en cours de compilation par GitHub Actions. Réessayez dans quelques minutes.", - "DialogUpdaterConvertFailedGithubMessage": "Impossible de convertir la version reçue de Ryujinx depuis Github Release.", - "DialogUpdaterDownloadingMessage": "Téléchargement de la mise à jour...", - "DialogUpdaterExtractionMessage": "Extraction de la mise à jour…", - "DialogUpdaterRenamingMessage": "Renommage de la mise à jour...", - "DialogUpdaterAddingFilesMessage": "Ajout d'une nouvelle mise à jour...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "Mise à jour terminée !", - "DialogUpdaterRestartMessage": "Voulez-vous redémarrer Ryujinx maintenant ?", - "DialogUpdaterNoInternetMessage": "Vous n'êtes pas connecté à Internet !", - "DialogUpdaterNoInternetSubMessage": "Veuillez vérifier que vous disposez d'une connexion Internet fonctionnelle !", - "DialogUpdaterDirtyBuildMessage": "Vous ne pouvez pas mettre à jour une version Dirty de Ryujinx !", - "DialogUpdaterDirtyBuildSubMessage": "Veuillez télécharger Ryujinx sur https://ryujinx.app/download si vous recherchez une version prise en charge.", - "DialogRestartRequiredMessage": "Redémarrage requis", - "DialogThemeRestartMessage": "Le thème a été enregistré. Un redémarrage est requis pour appliquer le thème.", - "DialogThemeRestartSubMessage": "Voulez-vous redémarrer", - "DialogFirmwareInstallEmbeddedMessage": "Voulez-vous installer le firmware intégré dans ce jeu ? (Firmware {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "Aucun firmware installé n'a été trouvé mais Ryujinx a pu installer le firmware {0} à partir du jeu fourni.\nL'émulateur va maintenant démarrer.", - "DialogFirmwareNoFirmwareInstalledMessage": "Aucun Firmware installé", - "DialogFirmwareInstalledMessage": "Le firmware {0} a été installé", - "DialogInstallFileTypesSuccessMessage": "Types de fichiers installés avec succès!", - "DialogInstallFileTypesErrorMessage": "Échec de l'installation des types de fichiers.", - "DialogUninstallFileTypesSuccessMessage": "Types de fichiers désinstallés avec succès!", - "DialogUninstallFileTypesErrorMessage": "Échec de la désinstallation des types de fichiers.", - "DialogOpenSettingsWindowLabel": "Ouvrir la fenêtre de configuration", - "DialogOpenXCITrimmerWindowLabel": "Fenêtre de réduction de fichiers XCI", - "DialogControllerAppletTitle": "Programme Manette", - "DialogMessageDialogErrorExceptionMessage": "Erreur lors de l'affichage de la boîte de dialogue : {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Erreur lors de l'affichage du clavier logiciel: {0}", - "DialogErrorAppletErrorExceptionMessage": "Erreur lors de l'affichage de la boîte de dialogue ErrorApplet: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nPour plus d'informations sur la manière de corriger cette erreur, suivez notre Guide d'Installation.", - "DialogUserErrorDialogTitle": "Erreur Ryujinx ({0})", - "DialogAmiiboApiTitle": "API Amiibo", - "DialogAmiiboApiFailFetchMessage": "Une erreur est survenue lors de la récupération des informations de l'API.", - "DialogAmiiboApiConnectErrorMessage": "Impossible de se connecter au serveur API Amiibo. Le service est peut-être hors service ou vous devriez peut-être vérifier que votre connexion internet est connectée.", - "DialogProfileInvalidProfileErrorMessage": "Le profil {0} est incompatible avec le système de configuration de manette actuel.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "Le profil par défaut ne peut pas être écrasé", - "DialogProfileDeleteProfileTitle": "Supprimer le profil", - "DialogProfileDeleteProfileMessage": "Cette action est irréversible, êtes-vous sûr de vouloir continuer ?", - "DialogWarning": "Avertissement", - "DialogPPTCDeletionMessage": "Vous êtes sur le point de mettre en file d'attente une reconstruction PPTC au prochain démarrage de :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?", - "DialogPPTCDeletionErrorMessage": "Erreur lors de la purge du cache PPTC à {0}: {1}", - "DialogShaderDeletionMessage": "Vous êtes sur le point de supprimer le cache du Shader pour :\n\n{0}\n\nÊtes-vous sûr de vouloir continuer ?", - "DialogShaderDeletionErrorMessage": "Erreur lors de la purge du cache du Shader à {0}: {1}", - "DialogRyujinxErrorMessage": "Ryujinx a rencontré une erreur", - "DialogInvalidTitleIdErrorMessage": "Erreur d'UI : le jeu sélectionné n'a pas d'ID de titre valide", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Un firmware valide n'a pas été trouvé dans {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Installer le Firmware {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "La version {0} du système sera installée.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nCela remplacera la version actuelle du système {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nVoulez-vous continuer ?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installation du firmware...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Version du système {0} installée avec succès.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "Il n'y aurait aucun autre profil à ouvrir si le profil sélectionné est supprimé", - "DialogUserProfileDeletionConfirmMessage": "Voulez-vous supprimer le profil sélectionné ?", - "DialogUserProfileUnsavedChangesTitle": "Avertissement - Modifications non enregistrées", - "DialogUserProfileUnsavedChangesMessage": "Vous avez effectué des modifications sur ce profil d'utilisateur qui n'ont pas été enregistrées.", - "DialogUserProfileUnsavedChangesSubMessage": "Voulez-vous annuler les modifications ?", - "DialogControllerSettingsModifiedConfirmMessage": "Les paramètres actuels de la manette ont été mis à jour.", - "DialogControllerSettingsModifiedConfirmSubMessage": "Voulez-vous sauvegarder ?", - "DialogLoadFileErrorMessage": "{0}. Fichier erroné : {1}", - "DialogModAlreadyExistsMessage": "Le mod existe déjà", - "DialogModInvalidMessage": "Le répertoire spécifié ne contient pas de mod !", - "DialogModDeleteNoParentMessage": "Impossible de supprimer : impossible de trouver le répertoire parent pour le mod \"{0} \" !", - "DialogDlcNoDlcErrorMessage": "Le fichier spécifié ne contient pas de DLC pour le titre sélectionné !", - "DialogPerformanceCheckLoggingEnabledMessage": "Vous avez activé la journalisation des traces, conçue pour être utilisée uniquement par les développeurs.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "Pour des performances optimales, il est recommandé de désactiver la journalisation des traces. Souhaitez-vous désactiver la journalisation des traces maintenant ?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "Vous avez activé l'extraction des shaders, qui est conçu pour être utilisé par les développeurs uniquement.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Pour des performances optimales, il est recommandé de désactiver l'extraction des shaders. Souhaitez-vous désactiver l'extraction des shaders maintenant ?", - "DialogLoadAppGameAlreadyLoadedMessage": "Un jeu a déjà été chargé", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Veuillez arrêter l'émulation ou fermer l'émulateur avant de lancer un autre jeu.", - "DialogUpdateAddUpdateErrorMessage": "Le fichier spécifié ne contient pas de mise à jour pour le titre sélectionné !", - "DialogSettingsBackendThreadingWarningTitle": "Avertissement - Backend Threading ", - "DialogSettingsBackendThreadingWarningMessage": "Ryujinx doit être redémarré après avoir changé cette option pour qu'elle s'applique complètement. Selon votre plate-forme, vous devrez peut-être désactiver manuellement le multithreading de votre pilote lorsque vous utilisez Ryujinx.", - "DialogModManagerDeletionWarningMessage": "Vous êtes sur le point de supprimer le mod : {0}\n\nÊtes-vous sûr de vouloir continuer ?", - "DialogModManagerDeletionAllWarningMessage": "Vous êtes sur le point de supprimer tous les mods pour ce titre.\n\nÊtes-vous sûr de vouloir continuer ?", - "SettingsTabGraphicsFeaturesOptions": "Fonctionnalités", - "SettingsTabGraphicsBackendMultithreading": "Interface graphique multithread :", - "CommonAuto": "Auto", - "CommonOff": "Désactivé", - "CommonOn": "Activé", - "InputDialogYes": "Oui", - "InputDialogNo": "Non", - "DialogProfileInvalidProfileNameErrorMessage": "Le nom du fichier contient des caractères invalides. Veuillez réessayer.", - "MenuBarOptionsPauseEmulation": "Suspendre", - "MenuBarOptionsResumeEmulation": "Reprendre", - "AboutUrlTooltipMessage": "Cliquez pour ouvrir le site de Ryujinx dans votre navigateur par défaut.", - "AboutDisclaimerMessage": "Ryujinx n'est pas affilié à Nintendo™,\nou à aucun de ses partenaires, de quelque manière que ce soit.", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) est utilisé\ndans notre émulation Amiibo.", - "AboutPatreonUrlTooltipMessage": "Cliquez pour ouvrir la page Patreon de Ryujinx dans votre navigateur par défaut.", - "AboutGithubUrlTooltipMessage": "Cliquez pour ouvrir la page GitHub de Ryujinx dans votre navigateur par défaut.", - "AboutDiscordUrlTooltipMessage": "Cliquez pour ouvrir une invitation au serveur Discord de Ryujinx dans votre navigateur par défaut.", - "AboutTwitterUrlTooltipMessage": "Cliquez pour ouvrir la page Twitter de Ryujinx dans votre navigateur par défaut.", - "AboutRyujinxAboutTitle": "À propos :", - "AboutRyujinxAboutContent": "Ryujinx est un émulateur pour la Nintendo Switch™.\nMerci de nous soutenir sur Patreon.\nObtenez toutes les dernières actualités sur notre Twitter ou notre Discord.\nLes développeurs intéressés à contribuer peuvent en savoir plus sur notre GitHub ou notre Discord.", - "AboutRyujinxMaintainersTitle": "Maintenu par :", - "AboutRyujinxMaintainersContentTooltipMessage": "Cliquez pour ouvrir la page Contributeurs dans votre navigateur par défaut.", - "AboutRyujinxSupprtersTitle": "Supporté sur Patreon par :", - "AmiiboSeriesLabel": "Séries Amiibo", - "AmiiboCharacterLabel": "Personnage", - "AmiiboScanButtonLabel": "Scanner", - "AmiiboOptionsShowAllLabel": "Afficher tous les Amiibo", - "AmiiboOptionsUsRandomTagLabel": "Hack : Utiliser un tag Uuid aléatoire", - "DlcManagerTableHeadingEnabledLabel": "Activé", - "DlcManagerTableHeadingTitleIdLabel": "ID du titre", - "DlcManagerTableHeadingContainerPathLabel": "Chemin du conteneur", - "DlcManagerTableHeadingFullPathLabel": "Chemin complet", - "DlcManagerRemoveAllButton": "Tout supprimer", - "DlcManagerEnableAllButton": "Tout activer", - "DlcManagerDisableAllButton": "Tout désactiver", - "ModManagerDeleteAllButton": "Tout supprimer", - "MenuBarOptionsChangeLanguage": "Changer la langue", - "MenuBarShowFileTypes": "Afficher les types de fichiers", - "CommonSort": "Trier", - "CommonShowNames": "Afficher les noms", - "CommonFavorite": "Favoris", - "OrderAscending": "Croissant", - "OrderDescending": "Décroissant", - "SettingsTabGraphicsFeatures": "Fonctionnalités & Améliorations", - "ErrorWindowTitle": "Fenêtre d'erreur", - "ToggleDiscordTooltip": "Choisissez d'afficher ou non Ryujinx sur votre activité « en cours de jeu » Discord", - "AddGameDirBoxTooltip": "Entrez un répertoire de jeux à ajouter à la liste", - "AddGameDirTooltip": "Ajouter un répertoire de jeux à la liste", - "RemoveGameDirTooltip": "Supprimer le répertoire de jeu sélectionné", - "AddAutoloadDirBoxTooltip": "Entrez un répertoire de mises à jour/DLC à ajouter à la liste", - "AddAutoloadDirTooltip": "Ajouter un répertoire de mises à jour/DLC à la liste", - "RemoveAutoloadDirTooltip": "Supprimer le répertoire de mises à jour/DLC sélectionné", - "CustomThemeCheckTooltip": "Utilisez un thème personnalisé Avalonia pour modifier l'apparence des menus de l'émulateur", - "CustomThemePathTooltip": "Chemin vers le thème personnalisé de l'interface utilisateur", - "CustomThemeBrowseTooltip": "Parcourir vers un thème personnalisé pour l'interface utilisateur", - "DockModeToggleTooltip": "Le mode station d'accueil permet à la console émulée de se comporter comme une Nintendo Switch en mode station d'accueil, ce qui améliore la fidélité graphique dans la plupart des jeux. Inversement, la désactivation de cette option rendra la console émulée comme une console Nintendo Switch portable, réduisant la qualité graphique.\n\nConfigurer les controles du joueur 1 si vous prévoyez d'utiliser le mode station d'accueil; configurez les commandes portable si vous prévoyez d'utiliser le mode portable.\n\nLaissez ACTIVER si vous n'êtes pas sûr.", - "DirectKeyboardTooltip": "Prise en charge de l'accès direct au clavier (HID). Permet aux jeux d'accéder à votre clavier comme périphérique de saisie de texte.\n\nFonctionne uniquement avec les jeux prenant en charge nativement l'utilisation du clavier sur le matériel Switch.\n\nLaissez OFF si vous n'êtes pas sûr.", - "DirectMouseTooltip": "Prise en charge de l'accès direct à la souris (HID). Permet aux jeux d'accéder à votre souris en tant que dispositif de pointage.\n\nFonctionne uniquement avec les jeux qui prennent en charge nativement les contrôles de souris sur le matériel Switch, ce qui est rare.\n\nLorsqu'il est activé, la fonctionnalité de l'écran tactile peut ne pas fonctionner.\n\nLaissez sur OFF si vous n'êtes pas sûr.", - "RegionTooltip": "Changer la région du système", - "LanguageTooltip": "Changer la langue du système", - "TimezoneTooltip": "Changer le fuseau horaire du système", - "TimeTooltip": "Changer l'heure du système", - "VSyncToggleTooltip": "La synchronisation verticale de la console émulée. Essentiellement un limiteur de trame pour la majorité des jeux ; le désactiver peut entraîner un fonctionnement plus rapide des jeux ou prolonger ou bloquer les écrans de chargement.\n\nPeut être activé ou désactivé en jeu avec un raccourci clavier de votre choix (F1 par défaut). Nous recommandons de le faire si vous envisagez de le désactiver.\n\nLaissez activé si vous n'êtes pas sûr.", - "PptcToggleTooltip": "Sauvegarde les fonctions JIT afin qu'elles n'aient pas besoin d'être à chaque fois recompiler lorsque le jeu se charge.\n\nRéduit les lags et accélère considérablement le temps de chargement après le premier lancement d'un jeu.\n\nLaissez par défaut si vous n'êtes pas sûr.", - "LowPowerPptcToggleTooltip": "Charger le PPTC en utilisant un tiers des coeurs.", - "FsIntegrityToggleTooltip": "Vérifie si des fichiers sont corrompus lors du lancement d'un jeu, et si des fichiers corrompus sont détectés, affiche une erreur de hachage dans la console.\n\nN'a aucun impact sur les performances et est destiné à aider le dépannage.\n\nLaissez activé en cas d'incertitude.", - "AudioBackendTooltip": "Modifie le backend utilisé pour donnée un rendu audio.\n\nSDL2 est recommandé, tandis que OpenAL et SoundIO sont utilisés comme backend secondaire. Le backend Dummy (Désactivé) ne rend aucun son.\n\nLaissez sur SDL2 si vous n'êtes pas sûr.", - "MemoryManagerTooltip": "Change la façon dont la mémoire émulée est mappée et utilisée. Cela affecte grandement les performances du processeur.\n\nRéglez sur Hôte non vérifié en cas d'incertitude.", - "MemoryManagerSoftwareTooltip": "Utilisez une table logicielle pour la traduction d'adresses. La plus grande précision est fournie, mais les performances en seront impactées.", - "MemoryManagerHostTooltip": "Mappez directement la mémoire dans l'espace d'adresses de l'hôte. Compilation et exécution JIT beaucoup plus rapides.", - "MemoryManagerUnsafeTooltip": "Mapper directement la mémoire dans la carte, mais ne pas masquer l'adresse dans l'espace d'adressage du client avant l'accès. Plus rapide, mais la sécurité sera négligée. L'application peut accéder à la mémoire depuis n'importe où dans Ryujinx, donc exécutez uniquement les programmes en qui vous avez confiance avec ce mode.", - "UseHypervisorTooltip": "Utiliser l'Hyperviseur au lieu du JIT. Améliore considérablement les performances lorsqu'il est disponible, mais peut être instable dans son état actuel.", - "DRamTooltip": "Change le montant de DRAM qui est alloué.\n\nActivez cette option pour les packs de textures 4k ou les mods à résolution 4k.\nN'améliore pas les performances.\n\nLaissez à 4GiO en cas de doute.", - "IgnoreMissingServicesTooltip": "Ignore les services Horizon OS non-intégrés. Cela peut aider à contourner les plantages lors du démarrage de certains jeux.\n\nLaissez désactivé en cas d'incertitude.", - "IgnoreAppletTooltip": "La boîte de dialogue externe \"Programme Manette\" n'apparaîtra pas si la manette est déconnectée en jeu. Il n'y aura aucune boîte de dialogue ouverte pour configurer une nouvelle manette. Une fois que la manette précédemment déconnectée est reconnectée, le jeu reprendra automatiquement. \n\nLaissez désactivé en cas d'incertitude.", - "GraphicsBackendThreadingTooltip": "Exécute des commandes du backend graphiques sur un second thread.\n\nAccélère la compilation des shaders, réduit les crashs et les lags, améliore les performances sur les pilotes GPU sans support de multithreading. Légère augementation des performances sur les pilotes avec multithreading intégrer.\n\nRéglez sur Auto en cas d'incertitude.", - "GalThreadingTooltip": "Exécute des commandes du backend graphiques sur un second thread.\n\nAccélère la compilation des shaders, réduit les crashs et les lags, améliore les performances sur les pilotes GPU sans support de multithreading. Légère augementation des performances sur les pilotes avec multithreading intégrer.\n\nRéglez sur Auto en cas d'incertitude.", - "ShaderCacheToggleTooltip": "Enregistre un cache de shaders sur le disque dur, réduit le lag lors de multiples exécutions.\n\nLaissez activé si vous n'êtes pas sûr.", - "ResolutionScaleTooltip": "Multiplie la résolution de rendu du jeu.\n\nQuelques jeux peuvent ne pas fonctionner avec cette fonctionnalité et sembler pixelisés même lorsque la résolution est augmentée ; pour ces jeux, vous devrez peut-être trouver des mods qui suppriment l'anti-aliasing ou qui augmentent leur résolution de rendu interne. Pour utiliser cette dernière option, vous voudrez probablement sélectionner \"Natif\".\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres sur le côté et expérimenter jusqu'à ce que vous trouviez l'apparence souhaitée pour un jeu.\n\nGardez à l'esprit que 4x est excessif pour pratiquement n'importe quelle configuration.", - "ResolutionScaleEntryTooltip": "Échelle de résolution à virgule, telle que : 1.5. Les échelles non intégrales sont plus susceptibles de causer des problèmes ou des crashs.", - "AnisotropyTooltip": "Niveau de filtrage anisotrope. Réglez sur Auto pour utiliser la valeur demandée par le jeu.", - "AspectRatioTooltip": "Format d'affichage appliqué à la fenêtre du moteur de rendu.\n\nChangez cela uniquement si vous utilisez un mod changeant le format d'affichage pour votre jeu, sinon les graphismes seront étirés.\n\nLaissez sur 16:9 si vous n'êtes pas sûr.", - "ShaderDumpPathTooltip": "Chemin de copie des Shaders :", - "FileLogTooltip": "Sauvegarde le journal de la console dans un fichier journal sur le disque. Cela n'affecte pas les performances.", - "StubLogTooltip": "Affiche les messages de journaux dans la console. N'affecte pas les performances.", - "InfoLogTooltip": "Affiche les messages de journaux d'informations dans la console. N'affecte pas les performances.", - "WarnLogTooltip": "Affiche les messages d'avertissement dans la console. N'affecte pas les performances.", - "ErrorLogTooltip": "Affiche les messages de journaux d'erreur dans la console. N'affecte pas les performances.", - "TraceLogTooltip": "Affiche la trace des messages de journaux dans la console. N'affecte pas les performances.", - "GuestLogTooltip": "Affiche les messages de journaux des invités dans la console. N'affecte pas les performances.", - "FileAccessLogTooltip": "Affiche les messages de journaux d'accès aux fichiers dans la console.", - "FSAccessLogModeTooltip": "Active la sortie du journal d'accès FS de la console. Les modes possibles sont 0-3", - "DeveloperOptionTooltip": "À utiliser avec précaution", - "OpenGlLogLevel": "Nécessite l'activation des niveaux de journalisation appropriés", - "DebugLogTooltip": "Affiche les messages de débogage dans la console.\n\nN'utilisez ceci que si un développeur le demande, car cela rendra les logs difficiles à lire et réduit les performances de l'émulateur.", - "LoadApplicationFileTooltip": "Ouvre l'explorateur de fichiers pour choisir un fichier compatible Switch à charger", - "LoadApplicationFolderTooltip": "Ouvre l'explorateur de fichiers pour choisir une application Switch compatible et décompressée à charger", - "LoadDlcFromFolderTooltip": "Ouvre l'explorateur de fichier pour choisir un ou plusieurs dossiers duquel charger les DLC", - "LoadTitleUpdatesFromFolderTooltip": "Ouvre l'explorateur de fichier pour choisir un ou plusieurs dossiers duquel charger les mises à jour", - "OpenRyujinxFolderTooltip": "Ouvrir le dossier du système de fichiers Ryujinx", - "OpenRyujinxLogsTooltip": "Ouvre le dossier dans lequel les journaux sont écrits", - "ExitTooltip": "Quitter Ryujinx", - "OpenSettingsTooltip": "Ouvrir la fenêtre de configuration", - "OpenProfileManagerTooltip": "Ouvrir la fenêtre du gestionnaire de profils d'utilisateurs", - "StopEmulationTooltip": "Arrêter l'émulation du jeu en cours et revenir à la sélection des jeux", - "CheckUpdatesTooltip": "Vérifier les mises à jour de Ryujinx", - "OpenAboutTooltip": "Ouvrir la fenêtre À Propos", - "GridSize": "Taille de la grille", - "GridSizeTooltip": "Modifier la taille des éléments de la grille", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Portugais Brésilien", - "AboutRyujinxContributorsButtonHeader": "Voir tous les contributeurs", - "SettingsTabSystemAudioVolume": "Volume :", - "AudioVolumeTooltip": "Modifier le volume audio", - "SettingsTabSystemEnableInternetAccess": "Accès Internet Invité/Mode LAN", - "EnableInternetAccessTooltip": "Permet à l'application émulée de se connecter à Internet.\n\nLes jeux avec un mode LAN peuvent se connecter les uns aux autres lorsque cette option est cochée et que les systèmes sont connectés au même point d'accès. Cela inclut également les vrais consoles.\n\nCette option n'autorise PAS la connexion aux serveurs Nintendo. Elle peut faire planter certains jeux qui essaient de se connecter à l'Internet.\n\nLaissez DÉSACTIVÉ si vous n'êtes pas sûr.", - "GameListContextMenuManageCheatToolTip": "Gérer les cheats", - "GameListContextMenuManageCheat": "Gérer les cheats", - "GameListContextMenuManageModToolTip": "Gérer les mods", - "GameListContextMenuManageMod": "Gérer les mods", - "ControllerSettingsStickRange": "Intervalle :", - "DialogStopEmulationTitle": "Ryujinx - Arrêt de l'émulation", - "DialogStopEmulationMessage": "Êtes-vous sûr de vouloir arrêter l'émulation ?", - "SettingsTabCpu": "Processeur", - "SettingsTabAudio": "Audio", - "SettingsTabNetwork": "Réseau", - "SettingsTabNetworkConnection": "Connexion réseau", - "SettingsTabCpuCache": "Cache Processeur", - "SettingsTabCpuMemory": "Mémoire Processeur", - "DialogUpdaterFlatpakNotSupportedMessage": "Merci de mettre à jour Ryujinx via FlatHub.", - "UpdaterDisabledWarningTitle": "Mises à jour désactivées !", - "ControllerSettingsRotate90": "Faire pivoter de 90° à droite", - "IconSize": "Taille d'icône", - "IconSizeTooltip": "Changer la taille des icônes de jeu", - "MenuBarOptionsShowConsole": "Afficher la console", - "ShaderCachePurgeError": "Erreur lors de la purge des Shaders à {0}: {1}", - "UserErrorNoKeys": "Clés introuvables", - "UserErrorNoFirmware": "Firmware introuvable", - "UserErrorFirmwareParsingFailed": "Erreur d'analyse du firmware", - "UserErrorApplicationNotFound": " Application introuvable", - "UserErrorUnknown": "Erreur inconnue", - "UserErrorUndefined": "Erreur non définie", - "UserErrorNoKeysDescription": "Ryujinx n'a pas pu trouver votre fichier 'prod.keys'", - "UserErrorNoFirmwareDescription": "Ryujinx n'a pas trouvé de firmware installé", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx n'a pas pu analyser le firmware fourni. Cela est généralement dû à des clés obsolètes.", - "UserErrorApplicationNotFoundDescription": "Ryujinx n'a pas pu trouver une application valide dans le chemin indiqué.", - "UserErrorUnknownDescription": "Une erreur inconnue est survenue !", - "UserErrorUndefinedDescription": "Une erreur inconnue est survenue ! Cela ne devrait pas se produire, merci de contacter un développeur !", - "OpenSetupGuideMessage": "Ouvrir le guide d'installation", - "NoUpdate": "Aucune mise à jour", - "TitleUpdateVersionLabel": "Version {0}", - "TitleBundledUpdateVersionLabel": "Inclus avec le jeu: Version {0}", - "TitleBundledDlcLabel": "Inclus avec le jeu :", - "TitleXCIStatusPartialLabel": "Partiel", - "TitleXCIStatusTrimmableLabel": "Non réduit", - "TitleXCIStatusUntrimmableLabel": "Réduit", - "TitleXCIStatusFailedLabel": "(Échoué)", - "TitleXCICanSaveLabel": "Sauvegarde de {0:n0} Mo", - "TitleXCISavingLabel": "Sauvegardé {0:n0} Mo", - "RyujinxInfo": "Ryujinx - Info", - "RyujinxConfirm": "Ryujinx - Confirmation", - "FileDialogAllTypes": "Tous les types", - "Never": "Jamais", - "SwkbdMinCharacters": "Doit comporter au moins {0} caractères", - "SwkbdMinRangeCharacters": "Doit comporter entre {0} et {1} caractères", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Clavier logiciel", - "SoftwareKeyboardModeNumeric": "Doit être 0-9 ou '.' uniquement", - "SoftwareKeyboardModeAlphabet": "Doit être uniquement des caractères non CJK", - "SoftwareKeyboardModeASCII": "Doit être uniquement du texte ASCII", - "ControllerAppletControllers": "Contrôleurs pris en charge :", - "ControllerAppletPlayers": "Joueurs :", - "ControllerAppletDescription": "Votre configuration actuelle n'est pas valide. Ouvrez les paramètres et reconfigurez vos contrôles.", - "ControllerAppletDocked": "Mode station d'accueil défini. Le mode contrôle portable doit être désactivé.", - "UpdaterRenaming": "Renommage des anciens fichiers...", - "UpdaterRenameFailed": "Impossible de renommer le fichier : {0}", - "UpdaterAddingFiles": "Ajout des nouveaux fichiers...", - "UpdaterExtracting": "Extraction de la mise à jour…", - "UpdaterDownloading": "Téléchargement de la mise à jour...", - "Docked": "Mode station d'accueil", - "Handheld": "Mode Portable", - "ConnectionError": "Erreur de connexion.", - "AboutPageDeveloperListMore": "{0} et plus...", - "ApiError": "Erreur API.", - "LoadingHeading": "Chargement {0}", - "CompilingPPTC": "Compilation PTC", - "CompilingShaders": "Compilation des shaders", - "AllKeyboards": "Tous les claviers", - "OpenFileDialogTitle": "Sélectionnez un fichier supporté à ouvrir", - "OpenFolderDialogTitle": "Sélectionnez un dossier avec un jeu décompressé", - "AllSupportedFormats": "Tous les formats supportés", - "RyujinxUpdater": "Mise à jour de Ryujinx", - "SettingsTabHotkeys": "Raccourcis clavier", - "SettingsTabHotkeysHotkeys": "Raccourcis clavier", - "SettingsTabHotkeysToggleVsyncHotkey": "Activer/désactiver la VSync :", - "SettingsTabHotkeysScreenshotHotkey": "Capture d'écran :", - "SettingsTabHotkeysShowUiHotkey": "Afficher UI :", - "SettingsTabHotkeysPauseHotkey": "Suspendre :", - "SettingsTabHotkeysToggleMuteHotkey": "Couper le son :", - "ControllerMotionTitle": "Réglages des contrôles par mouvement", - "ControllerRumbleTitle": "Paramètres de vibration", - "SettingsSelectThemeFileDialogTitle": "Sélectionner un fichier de thème", - "SettingsXamlThemeFile": "Fichier thème Xaml", - "AvatarWindowTitle": "Gérer les Comptes - Avatar", - "Amiibo": "Amiibo", - "Unknown": "Inconnu", - "Usage": "Utilisation", - "Writable": "Ecriture possible", - "SelectDlcDialogTitle": "Sélectionner les fichiers DLC", - "SelectUpdateDialogTitle": "Sélectionner les fichiers de mise à jour", - "SelectModDialogTitle": "Sélectionner le répertoire du mod", - "TrimXCIFileDialogTitle": "Vérifier et Réduire le fichier XCI", - "TrimXCIFileDialogPrimaryText": "Cette fonction va vérifier l'espace vide, puis réduire le fichier XCI pour économiser de l'espace de disque dur.", - "TrimXCIFileDialogSecondaryText": "Taille actuelle du fichier: {0:n} MB\nTaille des données de jeux: {1:n} MB\nÉconomie d'espaces sur le disque: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "Fichier XCI n'a pas besoin d'être réduit. Regarder les journaux pour plus de détails", - "TrimXCIFileNoUntrimPossible": "Fichier XCI ne peut pas être dé-réduit. Regarder les journaux pour plus de détails", - "TrimXCIFileReadOnlyFileCannotFix": "Fichier XCI est en Lecture Seule et n'a pas pu être rendu accessible en écriture. Regarder les journaux pour plus de détails", - "TrimXCIFileFileSizeChanged": "Fichier XCI a changé en taille depuis qu'il a été scanné. Vérifier que le fichier n'est pas en cours d'écriture et réessayer.", - "TrimXCIFileFreeSpaceCheckFailed": "Fichier XCI a des données dans la zone d'espace libre, ce n'est pas sûr de réduire", - "TrimXCIFileInvalidXCIFile": "Fichier XCI contient des données invalides. Regarder les journaux pour plus de détails", - "TrimXCIFileFileIOWriteError": "Fichier XCI n'a pas pu été ouvert pour écriture. Regarder les journaux pour plus de détails", - "TrimXCIFileFailedPrimaryText": "Réduction du fichier XCI a échoué", - "TrimXCIFileCancelled": "L'opération a été annulée", - "TrimXCIFileFileUndertermined": "Aucune opération a été faite", - "UserProfileWindowTitle": "Gestionnaire de profils utilisateur", - "CheatWindowTitle": "Gestionnaire de cheats", - "DlcWindowTitle": "Gérer le contenu téléchargeable pour {0} ({1})", - "ModWindowTitle": "Gérer les mods pour {0} ({1})", - "UpdateWindowTitle": "Gestionnaire de mises à jour", - "XCITrimmerWindowTitle": "Rogneur de fichier XCI", - "XCITrimmerTitleStatusCount": "{0} sur {1} Fichier(s) Sélectionnés", - "XCITrimmerTitleStatusCountWithFilter": "{0} sur {1} Fichier(s) Sélectionnés ({2} affiché(s)", - "XCITrimmerTitleStatusTrimming": "Réduction de {0} Fichier(s)...", - "XCITrimmerTitleStatusUntrimming": "Dé-Réduction de {0} Fichier(s)...", - "XCITrimmerTitleStatusFailed": "Échoué", - "XCITrimmerPotentialSavings": "Économies potentielles d'espace de disque dur", - "XCITrimmerActualSavings": "Économies actualles d'espace de disque dur", - "XCITrimmerSavingsMb": "{0:n0} Mo", - "XCITrimmerSelectDisplayed": "Sélectionner Affiché", - "XCITrimmerDeselectDisplayed": "Désélectionner Affiché", - "XCITrimmerSortName": "Titre", - "XCITrimmerSortSaved": "Économies de disque dur", - "XCITrimmerTrim": "Réduire", - "XCITrimmerUntrim": "Dé-Réduire", - "UpdateWindowUpdateAddedMessage": "{0} nouvelle(s) mise(s) à jour ajoutée(s)", - "UpdateWindowBundledContentNotice": "Les mises à jour incluses avec le jeu ne peuvent pas être supprimées mais peuvent être désactivées.", - "CheatWindowHeading": "Cheats disponibles pour {0} [{1}]", - "BuildId": "BuildId :", - "DlcWindowBundledContentNotice": "Les DLC inclus avec le jeu ne peuvent pas être supprimés mais peuvent être désactivés.", - "DlcWindowHeading": "{0} Contenu(s) téléchargeable(s)", - "DlcWindowDlcAddedMessage": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)", - "AutoloadDlcAddedMessage": "{0} nouveau(x) contenu(s) téléchargeable(s) ajouté(s)", - "AutoloadDlcRemovedMessage": "{0} contenu(s) téléchargeable(s) manquant(s) supprimé(s)", - "AutoloadUpdateAddedMessage": "{0} nouvelle(s) mise(s) à jour ajoutée(s)", - "AutoloadUpdateRemovedMessage": "{0} mises à jour manquantes supprimées", - "ModWindowHeading": "{0} Mod(s)", - "UserProfilesEditProfile": "Éditer la sélection", - "Continue": "Continuer", - "Cancel": "Annuler", - "Save": "Enregistrer", - "Discard": "Abandonner", - "Paused": "Suspendu", - "UserProfilesSetProfileImage": "Définir l'image de profil", - "UserProfileEmptyNameError": "Le nom est requis", - "UserProfileNoImageError": "L'image du profil doit être définie", - "GameUpdateWindowHeading": "Gérer les mises à jour pour {0} ({1})", - "SettingsTabHotkeysResScaleUpHotkey": "Augmenter la résolution :", - "SettingsTabHotkeysResScaleDownHotkey": "Diminuer la résolution :", - "UserProfilesName": "Nom :", - "UserProfilesUserId": "Identifiant de l'utilisateur :", - "SettingsTabGraphicsBackend": "API de Rendu", - "SettingsTabGraphicsBackendTooltip": "Sélectionnez le moteur graphique qui sera utilisé dans l'émulateur.\n\nVulkan est globalement meilleur pour toutes les cartes graphiques modernes, tant que leurs pilotes sont à jour. Vulkan offre également une compilation de shaders plus rapide (moins de saccades) sur tous les fournisseurs de GPU.\n\nOpenGL peut obtenir de meilleurs résultats sur d'anciennes cartes graphiques Nvidia, sur d'anciennes cartes graphiques AMD sous Linux, ou sur des GPU avec moins de VRAM, bien que les saccades dues à la compilation des shaders soient plus importantes.\n\nRéglez sur Vulkan si vous n'êtes pas sûr. Réglez sur OpenGL si votre GPU ne prend pas en charge Vulkan même avec les derniers pilotes graphiques.", - "SettingsEnableTextureRecompression": "Activer la recompression des textures", - "SettingsEnableTextureRecompressionTooltip": "Les jeux utilisant ce format de texture incluent Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder et The Legend of Zelda: Tears of the Kingdom.\n\nLes cartes graphiques avec 4 Go ou moins de VRAM risquent probablement de planter à un moment donné lors de l'exécution de ces jeux.\n\nActivez uniquement si vous manquez de VRAM sur les jeux mentionnés ci-dessus. Laissez DÉSACTIVÉ si vous n'êtes pas sûr.", - "SettingsTabGraphicsPreferredGpu": "GPU préféré", - "SettingsTabGraphicsPreferredGpuTooltip": "Sélectionnez la carte graphique qui sera utilisée avec l'interface graphique Vulkan.\n\nCela ne change pas le GPU qu'OpenGL utilisera.\n\nChoisissez le GPU noté \"dGPU\" si vous n'êtes pas sûr. S'il n'y en a pas, ne pas modifier.", - "SettingsAppRequiredRestartMessage": "Redémarrage de Ryujinx requis", - "SettingsGpuBackendRestartMessage": "Les paramètres de l'interface graphique ou du GPU ont été modifiés. Cela nécessitera un redémarrage pour être appliqué", - "SettingsGpuBackendRestartSubMessage": "\n\nVoulez-vous redémarrer maintenant ?", - "RyujinxUpdaterMessage": "Voulez-vous mettre à jour Ryujinx vers la dernière version ?", - "SettingsTabHotkeysVolumeUpHotkey": "Augmenter le volume :", - "SettingsTabHotkeysVolumeDownHotkey": "Diminuer le volume :", - "SettingsEnableMacroHLE": "Activer les macros HLE", - "SettingsEnableMacroHLETooltip": "Émulation de haut niveau du code de Macro GPU.\n\nAméliore les performances, mais peut causer des artefacts graphiques dans certains jeux.\n\nLaissez ACTIVÉ si vous n'êtes pas sûr.", - "SettingsEnableColorSpacePassthrough": "Traversée de l'espace colorimétrique", - "SettingsEnableColorSpacePassthroughTooltip": "Dirige l'interface graphique Vulkan pour qu'il transmette les informations de couleur sans spécifier d'espace colorimétrique. Pour les utilisateurs possédant des écrans Wide Color Gamut, cela peut entraîner des couleurs plus vives, au détriment de l'exactitude des couleurs.", - "VolumeShort": "Vol", - "UserProfilesManageSaves": "Gérer les sauvegardes", - "DeleteUserSave": "Voulez-vous supprimer la sauvegarde de l'utilisateur pour ce jeu ?", - "IrreversibleActionNote": "Cette action n'est pas réversible.", - "SaveManagerHeading": "Gérer les sauvegardes pour {0} ({1})", - "SaveManagerTitle": "Gestionnaire de sauvegarde", - "Name": "Nom ", - "Size": "Taille", - "Search": "Rechercher", - "UserProfilesRecoverLostAccounts": "Récupérer les profils perdus", - "Recover": "Récupérer", - "UserProfilesRecoverHeading": "Des sauvegardes ont été trouvées pour les profils suivants", - "UserProfilesRecoverEmptyList": "Aucun profil à restaurer", - "GraphicsAATooltip": "FXAA floute la plupart de l'image, tandis que SMAA tente de détecter les contours dentelés et de les lisser.\n\nIl n'est pas recommandé de l'utiliser en conjonction avec le filtre de mise à l'échelle FSR.\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres sur le côté et expérimenter jusqu'à ce que vous trouviez l'apparence souhaitée pour un jeu.\n\nLaissez sur AUCUN si vous n'êtes pas sûr.", - "GraphicsAALabel": "Anticrénelage :", - "GraphicsScalingFilterLabel": "Filtre de mise à l'échelle :", - "GraphicsScalingFilterTooltip": "Choisissez le filtre de mise à l'échelle qui sera appliqué lors de l'utilisation de la mise à l'échelle de la résolution.\n\nLe filtre bilinéaire fonctionne bien pour les jeux en 3D et constitue une option par défaut sûre.\n\nLe filtre le plus proche est recommandé pour les jeux de pixel art.\n\nFSR 1.0 est simplement un filtre de netteté, non recommandé pour une utilisation avec FXAA ou SMAA.\n\nCette option peut être modifiée pendant qu'un jeu est en cours d'exécution en cliquant sur \"Appliquer\" ci-dessous ; vous pouvez simplement déplacer la fenêtre des paramètres de côté et expérimenter jusqu'à ce que vous trouviez l'aspect souhaité pour un jeu.\n\nLaissez sur BILINÉAIRE si vous n'êtes pas sûr.", - "GraphicsScalingFilterBilinear": "Bilinéaire", - "GraphicsScalingFilterNearest": "Le plus proche", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Zone", - "GraphicsScalingFilterLevelLabel": "Niveau ", - "GraphicsScalingFilterLevelTooltip": "Définissez le niveau de netteté FSR 1.0. Plus élevé signifie plus net.", - "SmaaLow": "SMAA Faible", - "SmaaMedium": "SMAA moyen", - "SmaaHigh": "SMAA Élevé", - "SmaaUltra": "SMAA Ultra", - "UserEditorTitle": "Modifier Utilisateur", - "UserEditorTitleCreate": "Créer Utilisateur", - "SettingsTabNetworkInterface": "Interface Réseau :", - "NetworkInterfaceTooltip": "L'interface réseau utilisée pour les fonctionnalités LAN/LDN.\n\nEn conjonction avec un VPN ou XLink Kai et un jeu prenant en charge le LAN, peut être utilisée pour simuler une connexion sur le même réseau via Internet.\n\nLaissez sur PAR DÉFAUT si vous n'êtes pas sûr.", - "NetworkInterfaceDefault": "Par défaut", - "PackagingShaders": "Empaquetage des Shaders", - "AboutChangelogButton": "Voir le Changelog sur GitHub", - "AboutChangelogButtonTooltipMessage": "Cliquez pour ouvrir le changelog de cette version dans votre navigateur par défaut.", - "SettingsTabNetworkMultiplayer": "Multijoueur", - "MultiplayerMode": "Mode :", - "MultiplayerModeTooltip": "Changer le mode multijoueur LDN.\n\nLdnMitm modifiera la fonctionnalité de jeu sans fil local/jeu local dans les jeux pour fonctionner comme s'il s'agissait d'un LAN, permettant des connexions locales sur le même réseau avec d'autres instances de Ryujinx et des consoles Nintendo Switch piratées ayant le module ldn_mitm installé.\n\nLe multijoueur nécessite que tous les joueurs soient sur la même version du jeu (par exemple, Super Smash Bros. Ultimate v13.0.1 ne peut pas se connecter à v13.0.0).\n\nLaissez DÉSACTIVÉ si vous n'êtes pas sûr.", - "MultiplayerModeDisabled": "Désactivé", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Désactiver PàP Hébergement de Réseau (pourrait augmenter la latence)", - "MultiplayerDisableP2PTooltip": "Désactiver PàP hébergement de réseau, les postes vont proxy avec le serveur principal au lieu de se connecter directement à vous.", - "LdnPassphrase": "Mot de passe Réseau :", - "LdnPassphraseTooltip": "Vous pourez seulement voir les jeux hébergé avec le même mot de passe que vous.", - "LdnPassphraseInputTooltip": "Entrer un mot de passe dans le format Ryujinx-<8 hex chars>. Vous pourez seulement voir les jeux hébergé avec le même mot de passe que vous.", - "LdnPassphraseInputPublic": "(publique)", - "GenLdnPass": "Générer Aléatoire", - "GenLdnPassTooltip": "Génére un nouveau mot de passe, qui peut être partagé avec les autres.", - "ClearLdnPass": "Supprimer", - "ClearLdnPassTooltip": "Supprime le mot de passe actuel, ce qui vous remet sur le réseau public.", - "InvalidLdnPassphrase": "Mot de passe invalide! Il doit être dans le format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/he_IL.json b/src/Ryujinx/Assets/Locales/he_IL.json deleted file mode 100644 index 318068bf3..000000000 --- a/src/Ryujinx/Assets/Locales/he_IL.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "עִברִית", - "MenuBarFileOpenApplet": "פתח יישומון", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "פתח את יישומון עורך ה- Mii במצב עצמאי", - "SettingsTabInputDirectMouseAccess": "גישה ישירה לעכבר", - "SettingsTabSystemMemoryManagerMode": "מצב מנהל זיכרון:", - "SettingsTabSystemMemoryManagerModeSoftware": "תוכנה", - "SettingsTabSystemMemoryManagerModeHost": "מארח (מהיר)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "מארח לא מבוקר (המהיר ביותר, לא בטוח)", - "SettingsTabSystemUseHypervisor": "השתמש ב Hypervisor", - "MenuBarFile": "_קובץ", - "MenuBarFileOpenFromFile": "_טען יישום מקובץ", - "MenuBarFileOpenFromFileError": "No applications found in selected file.", - "MenuBarFileOpenUnpacked": "טען משחק _שאינו ארוז", - "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder", - "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder", - "MenuBarFileOpenEmuFolder": "פתח את תיקיית ריוג'ינקס", - "MenuBarFileOpenLogsFolder": "פתח את תיקיית קבצי הלוג", - "MenuBarFileExit": "_יציאה", - "MenuBarOptions": "_אפשרויות", - "MenuBarOptionsToggleFullscreen": "שנה מצב- מסך מלא", - "MenuBarOptionsStartGamesInFullscreen": "התחל משחקים במסך מלא", - "MenuBarOptionsStopEmulation": "עצור אמולציה", - "MenuBarOptionsSettings": "_הגדרות", - "MenuBarOptionsManageUserProfiles": "_נהל פרופילי משתמש", - "MenuBarActions": "_פעולות", - "MenuBarOptionsSimulateWakeUpMessage": "דמה הודעת השכמה", - "MenuBarActionsScanAmiibo": "סרוק אמיבו", - "MenuBarTools": "_כלים", - "MenuBarToolsInstallFirmware": "התקן קושחה", - "MenuBarFileToolsInstallFirmwareFromFile": "התקן קושחה מקובץ- ZIP/XCI", - "MenuBarFileToolsInstallFirmwareFromDirectory": "התקן קושחה מתוך תקייה", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "ניהול סוגי קבצים", - "MenuBarToolsInstallFileTypes": "סוגי קבצי התקנה", - "MenuBarToolsUninstallFileTypes": "סוגי קבצי הסרה", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_View", - "MenuBarViewWindow": "Window Size", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_עזרה", - "MenuBarHelpCheckForUpdates": "חפש עדכונים", - "MenuBarHelpAbout": "אודות", - "MenuSearch": "חפש...", - "GameListHeaderFavorite": "אהוב", - "GameListHeaderIcon": "סמל", - "GameListHeaderApplication": "שם", - "GameListHeaderDeveloper": "מפתח", - "GameListHeaderVersion": "גרסה", - "GameListHeaderTimePlayed": "זמן משחק", - "GameListHeaderLastPlayed": "שוחק לאחרונה", - "GameListHeaderFileExtension": "סיומת קובץ", - "GameListHeaderFileSize": "גודל הקובץ", - "GameListHeaderPath": "נתיב", - "GameListContextMenuOpenUserSaveDirectory": "פתח את תקיית השמור של המשתמש", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "פותח את תקיית השמור של המשתמש ביישום הנוכחי", - "GameListContextMenuOpenDeviceSaveDirectory": "פתח את תקיית השמור של המכשיר", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "פותח את הספרייה המכילה את שמור המכשיר של היישום", - "GameListContextMenuOpenBcatSaveDirectory": "פתח את תקיית השמור של ה-BCAT", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "פותח את תקיית שמור ה-BCAT של היישום", - "GameListContextMenuManageTitleUpdates": "מנהל עדכוני משחקים", - "GameListContextMenuManageTitleUpdatesToolTip": "פותח את חלון מנהל עדכוני המשחקים", - "GameListContextMenuManageDlc": "מנהל הרחבות", - "GameListContextMenuManageDlcToolTip": "פותח את חלון מנהל הרחבות המשחקים", - "GameListContextMenuCacheManagement": "ניהול מטמון", - "GameListContextMenuCacheManagementPurgePptc": "הוסף PPTC לתור בנייה מחדש", - "GameListContextMenuCacheManagementPurgePptcToolTip": "גרום ל-PPTC להבנות מחדש בפתיחה הבאה של המשחק", - "GameListContextMenuCacheManagementPurgeShaderCache": "ניקוי מטמון הצללות", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "מוחק את מטמון ההצללות של היישום", - "GameListContextMenuCacheManagementOpenPptcDirectory": "פתח את תקיית PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "פותח את התקייה של מטמון ה-PPTC של האפליקציה", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "פתח את תקיית המטמון של ההצללות", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "פותח את תקיית מטמון ההצללות של היישום", - "GameListContextMenuExtractData": "חילוץ נתונים", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "חלץ את קטע ה-ExeFS מתצורת היישום הנוכחית (כולל עדכונים)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "חלץ את קטע ה-RomFS מתצורת היישום הנוכחית (כולל עדכונים)", - "GameListContextMenuExtractDataLogo": "Logo", - "GameListContextMenuExtractDataLogoToolTip": "חלץ את קטע ה-Logo מתצורת היישום הנוכחית (כולל עדכונים)", - "GameListContextMenuCreateShortcut": "ליצור קיצור דרך לאפליקציה", - "GameListContextMenuCreateShortcutToolTip": "ליצור קיצור דרך בשולחן העבודה שיפתח את אפליקציה זו", - "GameListContextMenuCreateShortcutToolTipMacOS": "ליצור קיצור דרך בתיקיית האפליקציות של macOS שיפתח את אפליקציה זו", - "GameListContextMenuOpenModsDirectory": "פתח תיקיית מודים", - "GameListContextMenuOpenModsDirectoryToolTip": "פותח את התיקייה שמכילה מודים של האפליקציה", - "GameListContextMenuOpenSdModsDirectory": "פתח תיקיית מודים של Atmosphere", - "GameListContextMenuOpenSdModsDirectoryToolTip": "פותח את תיקיית כרטיס ה-SD החלופית של Atmosphere המכילה את המודים של האפליקציה. שימושי עבור מודים שארוזים עבור חומרה אמיתית.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{1}/{0} משחקים נטענו", - "StatusBarSystemVersion": "גרסת מערכת: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "זוהתה מגבלה נמוכה עבור מיפויי זיכרון", - "LinuxVmMaxMapCountDialogTextPrimary": "האם תרצה להגביר את הערך של vm.max_map_count ל{0}", - "LinuxVmMaxMapCountDialogTextSecondary": "משחקים מסוימים עלולים לייצר עוד מיפויי זיכרון ממה שמתאפשר. Ryujinx יקרוס ברגע שהמגבלה תחרוג.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "כן, עד האתחול הבא", - "LinuxVmMaxMapCountDialogButtonPersistent": "כן, לצמיתות", - "LinuxVmMaxMapCountWarningTextPrimary": "הכמות המירבית של מיפויי הזיכרון נמוכה מהמומלץ.", - "LinuxVmMaxMapCountWarningTextSecondary": "הערך הנוכחי של vm.max_map_count {0} נמוך מ{1}. משחקים מסוימים עלולים לייצר עוד מיפוי זיכרון ממה שמתאפשר.Ryujinx יקרוס ברגע שהמגבלה תחרוג.\n\nיתכן ותרצה להעלות את המגבלה הנוכחית או להתקין את pkexec, אשר יאפשר לRyujinx לסייע בכך.", - "Settings": "הגדרות", - "SettingsTabGeneral": "ממשק משתמש", - "SettingsTabGeneralGeneral": "כללי", - "SettingsTabGeneralEnableDiscordRichPresence": "הפעלת תצוגה עשירה בדיסקורד", - "SettingsTabGeneralCheckUpdatesOnLaunch": "בדוק אם קיימים עדכונים בהפעלה", - "SettingsTabGeneralShowConfirmExitDialog": "הראה דיאלוג \"אשר יציאה\"", - "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "הסתר את הסמן", - "SettingsTabGeneralHideCursorNever": "אף פעם", - "SettingsTabGeneralHideCursorOnIdle": "במצב סרק", - "SettingsTabGeneralHideCursorAlways": "תמיד", - "SettingsTabGeneralGameDirectories": "תקיות משחקים", - "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "הוסף", - "SettingsTabGeneralRemove": "הסר", - "SettingsTabSystem": "מערכת", - "SettingsTabSystemCore": "ליבה", - "SettingsTabSystemSystemRegion": "אזור מערכת:", - "SettingsTabSystemSystemRegionJapan": "יפן", - "SettingsTabSystemSystemRegionUSA": "ארה\"ב", - "SettingsTabSystemSystemRegionEurope": "אירופה", - "SettingsTabSystemSystemRegionAustralia": "אוסטרליה", - "SettingsTabSystemSystemRegionChina": "סין", - "SettingsTabSystemSystemRegionKorea": "קוריאה", - "SettingsTabSystemSystemRegionTaiwan": "טייוואן", - "SettingsTabSystemSystemLanguage": "שפת המערכת:", - "SettingsTabSystemSystemLanguageJapanese": "יפנית", - "SettingsTabSystemSystemLanguageAmericanEnglish": "אנגלית אמריקאית", - "SettingsTabSystemSystemLanguageFrench": "צרפתית", - "SettingsTabSystemSystemLanguageGerman": "גרמנית", - "SettingsTabSystemSystemLanguageItalian": "איטלקית", - "SettingsTabSystemSystemLanguageSpanish": "ספרדית", - "SettingsTabSystemSystemLanguageChinese": "סינית", - "SettingsTabSystemSystemLanguageKorean": "קוריאנית", - "SettingsTabSystemSystemLanguageDutch": "הולנדית", - "SettingsTabSystemSystemLanguagePortuguese": "פורטוגזית", - "SettingsTabSystemSystemLanguageRussian": "רוסית", - "SettingsTabSystemSystemLanguageTaiwanese": "טייוואנית", - "SettingsTabSystemSystemLanguageBritishEnglish": "אנגלית בריטית", - "SettingsTabSystemSystemLanguageCanadianFrench": "צרפתית קנדית", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "ספרדית אמריקה הלטינית", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "סינית פשוטה", - "SettingsTabSystemSystemLanguageTraditionalChinese": "סינית מסורתית", - "SettingsTabSystemSystemTimeZone": "אזור זמן מערכת:", - "SettingsTabSystemSystemTime": "זמן מערכת:", - "SettingsTabSystemEnableVsync": "VSync", - "SettingsTabSystemEnablePptc": "PPTC (Profiled Persistent Translation Cache)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "FS בדיקות תקינות", - "SettingsTabSystemAudioBackend": "אחראי שמע:", - "SettingsTabSystemAudioBackendDummy": "גולם", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "האצות", - "SettingsTabSystemHacksNote": "עלול לגרום לאי יציבות", - "SettingsTabSystemDramSize": "השתמש בפריסת זיכרון חלופית (נועד למפתחים)", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "התעלם משירותים חסרים", - "SettingsTabSystemIgnoreApplet": "Ignore Applet", - "SettingsTabGraphics": "גרפיקה", - "SettingsTabGraphicsAPI": "ממשק גראפי", - "SettingsTabGraphicsEnableShaderCache": "הפעל מטמון הצללות", - "SettingsTabGraphicsAnisotropicFiltering": "סינון אניסוטרופי:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "אוטומטי", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "קנה מידה של רזולוציה:", - "SettingsTabGraphicsResolutionScaleCustom": "מותאם אישית (לא מומלץ)", - "SettingsTabGraphicsResolutionScaleNative": "מקורי (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (לא מומלץ)", - "SettingsTabGraphicsAspectRatio": "יחס גובה-רוחב:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "מתח לגודל חלון", - "SettingsTabGraphicsDeveloperOptions": "אפשרויות מפתח", - "SettingsTabGraphicsShaderDumpPath": "Graphics Shader Dump Path:", - "SettingsTabLogging": "רישום", - "SettingsTabLoggingLogging": "רישום", - "SettingsTabLoggingEnableLoggingToFile": "אפשר רישום לקובץ", - "SettingsTabLoggingEnableStubLogs": "אפשר רישום בדל", - "SettingsTabLoggingEnableInfoLogs": "אפשר רישום מידע", - "SettingsTabLoggingEnableWarningLogs": "אפשר רישום אזהרות", - "SettingsTabLoggingEnableErrorLogs": "אפשר רישום שגיאות", - "SettingsTabLoggingEnableTraceLogs": "הפעל רישום מעקבי", - "SettingsTabLoggingEnableGuestLogs": "הפעל רישום מארח", - "SettingsTabLoggingEnableFsAccessLogs": "אפשר רישום גישת קבצי מערכת", - "SettingsTabLoggingFsGlobalAccessLogMode": "מצב רישום גלובלי של גישת קבצי מערכת", - "SettingsTabLoggingDeveloperOptions": "אפשרויות מפתח", - "SettingsTabLoggingDeveloperOptionsNote": "אזהרה: יפחית ביצועים", - "SettingsTabLoggingGraphicsBackendLogLevel": "רישום גרפיקת קצה אחורי:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "כלום", - "SettingsTabLoggingGraphicsBackendLogLevelError": "שגיאה", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "האטות", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "הכל", - "SettingsTabLoggingEnableDebugLogs": "אפשר רישום ניפוי באגים", - "SettingsTabInput": "קלט", - "SettingsTabInputEnableDockedMode": "מצב עגינה", - "SettingsTabInputDirectKeyboardAccess": "גישה ישירה למקלדת", - "SettingsButtonSave": "שמירה", - "SettingsButtonClose": "סגירה", - "SettingsButtonOk": "אישור", - "SettingsButtonCancel": "ביטול", - "SettingsButtonApply": "החל", - "ControllerSettingsPlayer": "שחקן/ית", - "ControllerSettingsPlayer1": "שחקן/ית 1", - "ControllerSettingsPlayer2": "שחקן/ית 2", - "ControllerSettingsPlayer3": "שחקן/ית 3", - "ControllerSettingsPlayer4": "שחקן/ית 4", - "ControllerSettingsPlayer5": "שחקן/ית 5", - "ControllerSettingsPlayer6": "שחקן/ית 6", - "ControllerSettingsPlayer7": "שחקן/ית 7", - "ControllerSettingsPlayer8": "שחקן/ית 8", - "ControllerSettingsHandheld": "נייד", - "ControllerSettingsInputDevice": "מכשיר קלט", - "ControllerSettingsRefresh": "רענון", - "ControllerSettingsDeviceDisabled": "מושבת", - "ControllerSettingsControllerType": "סוג שלט", - "ControllerSettingsControllerTypeHandheld": "נייד", - "ControllerSettingsControllerTypeProController": "שלט פרו ", - "ControllerSettingsControllerTypeJoyConPair": "ג'ויקון הותאם", - "ControllerSettingsControllerTypeJoyConLeft": "ג'ויקון שמאלי ", - "ControllerSettingsControllerTypeJoyConRight": "ג'ויקון ימני", - "ControllerSettingsProfile": "פרופיל", - "ControllerSettingsProfileDefault": "ברירת המחדל", - "ControllerSettingsLoad": "טעינה", - "ControllerSettingsAdd": "הוספה", - "ControllerSettingsRemove": "הסר", - "ControllerSettingsButtons": "כפתורים", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "כפתורי כיוונים", - "ControllerSettingsDPadUp": "מעלה", - "ControllerSettingsDPadDown": "מטה", - "ControllerSettingsDPadLeft": "שמאלה", - "ControllerSettingsDPadRight": "ימינה", - "ControllerSettingsStickButton": "כפתור", - "ControllerSettingsStickUp": "למעלה", - "ControllerSettingsStickDown": "למטה", - "ControllerSettingsStickLeft": "שמאלה", - "ControllerSettingsStickRight": "ימינה", - "ControllerSettingsStickStick": "סטיק", - "ControllerSettingsStickInvertXAxis": "הפיכת הX של הסטיק", - "ControllerSettingsStickInvertYAxis": "הפיכת הY של הסטיק", - "ControllerSettingsStickDeadzone": "שטח מת:", - "ControllerSettingsLStick": "מקל שמאלי", - "ControllerSettingsRStick": "מקל ימני", - "ControllerSettingsTriggersLeft": "הדק שמאלי", - "ControllerSettingsTriggersRight": "הדק ימני", - "ControllerSettingsTriggersButtonsLeft": "כפתור הדק שמאלי", - "ControllerSettingsTriggersButtonsRight": "כפתור הדק ימני", - "ControllerSettingsTriggers": "הדקים", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "כפתורים משמאל", - "ControllerSettingsExtraButtonsRight": "כפתורים מימין", - "ControllerSettingsMisc": "שונות", - "ControllerSettingsTriggerThreshold": "סף הדק:", - "ControllerSettingsMotion": "תנועה", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "השתמש בתנועת CemuHook תואמת ", - "ControllerSettingsMotionControllerSlot": "מיקום שלט", - "ControllerSettingsMotionMirrorInput": "קלט מראה", - "ControllerSettingsMotionRightJoyConSlot": "מיקום ג'ויקון ימני", - "ControllerSettingsMotionServerHost": "מארח השרת:", - "ControllerSettingsMotionGyroSensitivity": "רגישות ג'ירוסקופ:", - "ControllerSettingsMotionGyroDeadzone": "שטח מת של הג'ירוסקופ:", - "ControllerSettingsSave": "שמירה", - "ControllerSettingsClose": "סגירה", - "KeyUnknown": "Unknown", - "KeyShiftLeft": "Shift Left", - "KeyShiftRight": "Shift Right", - "KeyControlLeft": "Ctrl Left", - "KeyMacControlLeft": "⌃ Left", - "KeyControlRight": "Ctrl Right", - "KeyMacControlRight": "⌃ Right", - "KeyAltLeft": "Alt Left", - "KeyMacAltLeft": "⌥ Left", - "KeyAltRight": "Alt Right", - "KeyMacAltRight": "⌥ Right", - "KeyWinLeft": "⊞ Left", - "KeyMacWinLeft": "⌘ Left", - "KeyWinRight": "⊞ Right", - "KeyMacWinRight": "⌘ Right", - "KeyMenu": "Menu", - "KeyUp": "Up", - "KeyDown": "Down", - "KeyLeft": "Left", - "KeyRight": "Right", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Right", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Left Trigger 0", - "GamepadSingleRightTrigger0": "Right Trigger 0", - "GamepadSingleLeftTrigger1": "Left Trigger 1", - "GamepadSingleRightTrigger1": "Right Trigger 1", - "StickLeft": "Left Stick", - "StickRight": "Right Stick", - "UserProfilesSelectedUserProfile": "פרופיל המשתמש הנבחר:", - "UserProfilesSaveProfileName": "שמור שם פרופיל", - "UserProfilesChangeProfileImage": "שנה תמונת פרופיל", - "UserProfilesAvailableUserProfiles": "פרופילי משתמש זמינים:", - "UserProfilesAddNewProfile": "צור פרופיל", - "UserProfilesDelete": "מחיקה", - "UserProfilesClose": "סגור", - "ProfileNameSelectionWatermark": "בחרו כינוי", - "ProfileImageSelectionTitle": "בחירת תמונת פרופיל", - "ProfileImageSelectionHeader": "בחרו תמונת פרופיל", - "ProfileImageSelectionNote": "אתם יכולים לייבא תמונת פרופיל מותאמת אישית, או לבחור אווטאר מקושחת המערכת", - "ProfileImageSelectionImportImage": "ייבוא קובץ תמונה", - "ProfileImageSelectionSelectAvatar": "בחרו אוואטר קושחה", - "InputDialogTitle": "דיאלוג קלט", - "InputDialogOk": "בסדר", - "InputDialogCancel": "ביטול", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "בחרו את שם הפרופיל", - "InputDialogAddNewProfileHeader": "אנא הזינו שם לפרופיל", - "InputDialogAddNewProfileSubtext": "(אורך מרבי: {0})", - "AvatarChoose": "בחרו דמות", - "AvatarSetBackgroundColor": "הגדר צבע רקע", - "AvatarClose": "סגור", - "ControllerSettingsLoadProfileToolTip": "טען פרופיל", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "הוסף פרופיל", - "ControllerSettingsRemoveProfileToolTip": "הסר פרופיל", - "ControllerSettingsSaveProfileToolTip": "שמור פרופיל", - "MenuBarFileToolsTakeScreenshot": "צלם מסך", - "MenuBarFileToolsHideUi": "הסתר ממשק משתמש ", - "GameListContextMenuRunApplication": "הרץ יישום", - "GameListContextMenuToggleFavorite": "למתג העדפה", - "GameListContextMenuToggleFavoriteToolTip": "למתג סטטוס העדפה של משחק", - "SettingsTabGeneralTheme": "ערכת נושא:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "כהה", - "SettingsTabGeneralThemeLight": "בהיר", - "ControllerSettingsConfigureGeneral": "הגדר", - "ControllerSettingsRumble": "רטט", - "ControllerSettingsRumbleStrongMultiplier": "העצמת רטט חזק", - "ControllerSettingsRumbleWeakMultiplier": "מכפיל רטט חלש", - "DialogMessageSaveNotAvailableMessage": "אין שמור משחק עבור [{1:x16}] {0}", - "DialogMessageSaveNotAvailableCreateSaveMessage": "האם תרצה ליצור שמור משחק עבור המשחק הזה?", - "DialogConfirmationTitle": "ריוג'ינקס - אישור", - "DialogUpdaterTitle": "ריוג'ינקס - מעדכן", - "DialogErrorTitle": "ריוג'ינקס - שגיאה", - "DialogWarningTitle": "ריוג'ינקס - אזהרה", - "DialogExitTitle": "ריוג'ינקס - יציאה", - "DialogErrorMessage": "ריוג'ינקס נתקל בשגיאה", - "DialogExitMessage": "האם אתם בטוחים שאתם רוצים לסגור את ריוג'ינקס?", - "DialogExitSubMessage": "כל הנתונים שלא נשמרו יאבדו!", - "DialogMessageCreateSaveErrorMessage": "אירעה שגיאה ביצירת שמור המשחק שצויין: {0}", - "DialogMessageFindSaveErrorMessage": "אירעה שגיאה במציאת שמור המשחק שצויין: {0}", - "FolderDialogExtractTitle": "בחרו את התיקייה לחילוץ", - "DialogNcaExtractionMessage": "מלחץ {0} ממקטע {1}...", - "DialogNcaExtractionTitle": "מחלץ מקטע NCA", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "כשל בחילוץ. ה-NCA הראשי לא היה קיים בקובץ שנבחר.", - "DialogNcaExtractionCheckLogErrorMessage": "כשל בחילוץ. קרא את קובץ הרישום למידע נוסף.", - "DialogNcaExtractionSuccessMessage": "החילוץ הושלם בהצלחה.", - "DialogUpdaterConvertFailedMessage": "המרת הגרסה הנוכחית של ריוג'ינקס נכשלה.", - "DialogUpdaterCancelUpdateMessage": "מבטל עדכון!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "אתם כבר משתמשים בגרסה המעודכנת ביותר של ריוג'ינקס!", - "DialogUpdaterFailedToGetVersionMessage": "אירעה שגיאה בעת ניסיון לקבל עדכונים מ-גיטהב. זה יכול להיגרם אם הגרסה המעודכנת האחרונה נוצרה על ידי פעולות של גיטהב. נסה שוב בעוד מספר דקות.", - "DialogUpdaterConvertFailedGithubMessage": "המרת גרסת ריוג'ינקס שהתקבלה מ-עדכון הגרסאות של גיטהב נכשלה.", - "DialogUpdaterDownloadingMessage": "מוריד עדכון...", - "DialogUpdaterExtractionMessage": "מחלץ עדכון...", - "DialogUpdaterRenamingMessage": "משנה את שם העדכון...", - "DialogUpdaterAddingFilesMessage": "מוסיף עדכון חדש...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "העדכון הושלם!", - "DialogUpdaterRestartMessage": "האם אתם רוצים להפעיל מחדש את ריוג'ינקס עכשיו?", - "DialogUpdaterNoInternetMessage": "אתם לא מחוברים לאינטרנט!", - "DialogUpdaterNoInternetSubMessage": "אנא ודא שיש לך חיבור אינטרנט תקין!", - "DialogUpdaterDirtyBuildMessage": "אתם לא יכולים לעדכן מבנה מלוכלך של ריוג'ינקס!", - "DialogUpdaterDirtyBuildSubMessage": "אם אתם מחפשים גרסא נתמכת, אנא הורידו את ריוג'ינקס בכתובת https://ryujinx.app/download", - "DialogRestartRequiredMessage": "אתחול נדרש", - "DialogThemeRestartMessage": "ערכת הנושא נשמרה. יש צורך בהפעלה מחדש כדי להחיל את ערכת הנושא.", - "DialogThemeRestartSubMessage": "האם ברצונך להפעיל מחדש?", - "DialogFirmwareInstallEmbeddedMessage": "האם תרצו להתקין את הקושחה המוטמעת במשחק הזה? (קושחה {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "לא נמצאה קושחה מותקנת אבל ריוג'ינקס הצליח להתקין קושחה {0} מהמשחק שסופק. \nהאמולטור יופעל כעת.", - "DialogFirmwareNoFirmwareInstalledMessage": "לא מותקנת קושחה", - "DialogFirmwareInstalledMessage": "הקושחה {0} הותקנה", - "DialogInstallFileTypesSuccessMessage": "סוגי קבצים הותקנו בהצלחה!", - "DialogInstallFileTypesErrorMessage": "נכשל בהתקנת סוגי קבצים.", - "DialogUninstallFileTypesSuccessMessage": "סוגי קבצים הוסרו בהצלחה!", - "DialogUninstallFileTypesErrorMessage": "נכשל בהסרת סוגי קבצים.", - "DialogOpenSettingsWindowLabel": "פתח את חלון ההגדרות", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "יישומון בקר", - "DialogMessageDialogErrorExceptionMessage": "שגיאה בהצגת דיאלוג ההודעה: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "שגיאה בהצגת תוכנת המקלדת: {0}", - "DialogErrorAppletErrorExceptionMessage": "שגיאה בהצגת דיאלוג ErrorApplet: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nלמידע נוסף על איך לתקן שגיאה זו, עקוב אחר מדריך ההתקנה שלנו.", - "DialogUserErrorDialogTitle": "שגיאת Ryujinx ({0})", - "DialogAmiiboApiTitle": "ממשק תכנות אמיבו", - "DialogAmiiboApiFailFetchMessage": "אירעה שגיאה בעת שליפת מידע מהממשק.", - "DialogAmiiboApiConnectErrorMessage": "לא ניתן להתחבר לממשק שרת האמיבו. ייתכן שהשירות מושבת או שתצטרך לוודא שהחיבור לאינטרנט שלך מקוון.", - "DialogProfileInvalidProfileErrorMessage": "הפרופיל {0} אינו תואם למערכת תצורת הקלט הנוכחית.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "לא ניתן להחליף את פרופיל ברירת המחדל", - "DialogProfileDeleteProfileTitle": "מוחק פרופיל", - "DialogProfileDeleteProfileMessage": "פעולה זו היא בלתי הפיכה, האם אתם בטוחים שברצונכם להמשיך?", - "DialogWarning": "אזהרה", - "DialogPPTCDeletionMessage": "אם תמשיכו אתם עומדים לגרום לבנייה מחדש של מטמון ה-PPTC עבור:\n\n{0}", - "DialogPPTCDeletionErrorMessage": "שגיאה בטיהור מטמון PPTC ב-{0}: {1}", - "DialogShaderDeletionMessage": "אם תמשיכו אתם עומדים למחוק את מטמון ההצללות עבור:\n\n{0}", - "DialogShaderDeletionErrorMessage": "שגיאה בניקוי מטמון ההצללות ב-{0}: {1}", - "DialogRyujinxErrorMessage": "ריוג'ינקס נתקלה בשגיאה", - "DialogInvalidTitleIdErrorMessage": "שגיאת ממשק משתמש: למשחק שנבחר לא קיים מזהה משחק", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "לא נמצאה קושחת מערכת תקפה ב-{0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "התקן קושחה {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "גירסת המערכת {0} תותקן.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nזה יחליף את גרסת המערכת הנוכחית {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nהאם ברצונך להמשיך?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "מתקין קושחה...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "גרסת המערכת {0} הותקנה בהצלחה.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "לא יהיו פרופילים אחרים שייפתחו אם הפרופיל שנבחר יימחק", - "DialogUserProfileDeletionConfirmMessage": "האם ברצונך למחוק את הפרופיל שנבחר", - "DialogUserProfileUnsavedChangesTitle": "אזהרה - שינויים לא שמורים", - "DialogUserProfileUnsavedChangesMessage": "ביצעת שינויים בפרופיל משתמש זה שלא נשמרו.", - "DialogUserProfileUnsavedChangesSubMessage": "האם ברצונך למחוק את השינויים האחרונים?", - "DialogControllerSettingsModifiedConfirmMessage": "הגדרות השלט הנוכחי עודכנו.", - "DialogControllerSettingsModifiedConfirmSubMessage": "האם ברצונך לשמור?", - "DialogLoadFileErrorMessage": "{0}. קובץ שגוי: {1}", - "DialogModAlreadyExistsMessage": "מוד כבר קיים", - "DialogModInvalidMessage": "התיקייה שצוינה אינה מכילה מוד", - "DialogModDeleteNoParentMessage": "נכשל למחוק: לא היה ניתן למצוא את תיקיית האב למוד \"{0}\"!\n", - "DialogDlcNoDlcErrorMessage": "הקובץ שצוין אינו מכיל DLC עבור המשחק שנבחר!", - "DialogPerformanceCheckLoggingEnabledMessage": "הפעלת רישום מעקב, אשר נועד לשמש מפתחים בלבד.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "לביצועים מיטביים, מומלץ להשבית את רישום המעקב. האם ברצונך להשבית את רישום המעקב כעת?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "הפעלת השלכת הצללה, שנועדה לשמש מפתחים בלבד.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "לביצועים מיטביים, מומלץ להשבית את השלכת הצללה. האם ברצונך להשבית את השלכת הצללה עכשיו?", - "DialogLoadAppGameAlreadyLoadedMessage": "ישנו משחק שכבר רץ כעת", - "DialogLoadAppGameAlreadyLoadedSubMessage": "אנא הפסק את האמולציה או סגור את האמולטור לפני הפעלת משחק אחר.", - "DialogUpdateAddUpdateErrorMessage": "הקובץ שצוין אינו מכיל עדכון עבור המשחק שנבחר!", - "DialogSettingsBackendThreadingWarningTitle": "אזהרה - ריבוי תהליכי רקע", - "DialogSettingsBackendThreadingWarningMessage": "יש להפעיל מחדש את ריוג'ינקס לאחר שינוי אפשרות זו כדי שהיא תחול במלואה. בהתאם לפלטפורמה שלך, ייתכן שיהיה עליך להשבית ידנית את ריבוי ההליכים של ההתקן שלך בעת השימוש ב-ריוג'ינקס.", - "DialogModManagerDeletionWarningMessage": "אתה עומד למחוק את המוד: {0}\nהאם אתה בטוח שאתה רוצה להמשיך?", - "DialogModManagerDeletionAllWarningMessage": "אתה עומד למחוק את כל המודים בשביל משחק זה.\n\nהאם אתה בטוח שאתה רוצה להמשיך?", - "SettingsTabGraphicsFeaturesOptions": "אפשרויות", - "SettingsTabGraphicsBackendMultithreading": "אחראי גרפיקה רב-תהליכי:", - "CommonAuto": "אוטומטי", - "CommonOff": "כבוי", - "CommonOn": "דלוק", - "InputDialogYes": "כן", - "InputDialogNo": "לא", - "DialogProfileInvalidProfileNameErrorMessage": "שם הקובץ מכיל תווים לא חוקיים. אנא נסה שוב.", - "MenuBarOptionsPauseEmulation": "הפסק", - "MenuBarOptionsResumeEmulation": "המשך", - "AboutUrlTooltipMessage": "לחץ כדי לפתוח את אתר ריוג'ינקס בדפדפן ברירת המחדל שלך.", - "AboutDisclaimerMessage": "ריוג'ינקס אינה מזוהת עם נינטנדו,\nאו שוטפייה בכל דרך שהיא.", - "AboutAmiiboDisclaimerMessage": "ממשק אמיבו (www.amiiboapi.com) משומש בהדמיית האמיבו שלנו.", - "AboutPatreonUrlTooltipMessage": "לחץ כדי לפתוח את דף הפטראון של ריוג'ינקס בדפדפן ברירת המחדל שלך.", - "AboutGithubUrlTooltipMessage": "לחץ כדי לפתוח את דף הגיטהב של ריוג'ינקס בדפדפן ברירת המחדל שלך.", - "AboutDiscordUrlTooltipMessage": "לחץ כדי לפתוח הזמנה לשרת הדיסקורד של ריוג'ינקס בדפדפן ברירת המחדל שלך.", - "AboutTwitterUrlTooltipMessage": "לחץ כדי לפתוח את דף הטוויטר של Ryujinx בדפדפן ברירת המחדל שלך.", - "AboutRyujinxAboutTitle": "אודות:", - "AboutRyujinxAboutContent": "ריוג'ינקס הוא אמולטור עבור הנינטנדו סוויץ' (כל הזכויות שמורות).\nבבקשה תתמכו בנו בפטראון.\nקבל את כל החדשות האחרונות בטוויטר או בדיסקורד שלנו.\nמפתחים המעוניינים לתרום יכולים לקבל מידע נוסף ב-גיטהאב או ב-דיסקורד שלנו.", - "AboutRyujinxMaintainersTitle": "מתוחזק על ידי:", - "AboutRyujinxMaintainersContentTooltipMessage": "לחץ כדי לפתוח את דף התורמים בדפדפן ברירת המחדל שלך.", - "AboutRyujinxSupprtersTitle": "תמוך באמצעות Patreon", - "AmiiboSeriesLabel": "סדרת אמיבו", - "AmiiboCharacterLabel": "דמות", - "AmiiboScanButtonLabel": "סרוק את זה", - "AmiiboOptionsShowAllLabel": "הצג את כל האמיבואים", - "AmiiboOptionsUsRandomTagLabel": "האצה: השתמש בתג Uuid אקראי", - "DlcManagerTableHeadingEnabledLabel": "מאופשר", - "DlcManagerTableHeadingTitleIdLabel": "מזהה משחק", - "DlcManagerTableHeadingContainerPathLabel": "נתיב מכיל", - "DlcManagerTableHeadingFullPathLabel": "נתיב מלא", - "DlcManagerRemoveAllButton": "מחק הכל", - "DlcManagerEnableAllButton": "אפשר הכל", - "DlcManagerDisableAllButton": "השבת הכל", - "ModManagerDeleteAllButton": "מחק הכל", - "MenuBarOptionsChangeLanguage": "החלף שפה", - "MenuBarShowFileTypes": "הצג מזהה סוג קובץ", - "CommonSort": "מיין", - "CommonShowNames": "הצג שמות", - "CommonFavorite": "מועדף", - "OrderAscending": "סדר עולה", - "OrderDescending": "סדר יורד", - "SettingsTabGraphicsFeatures": "תכונות ושיפורים", - "ErrorWindowTitle": "חלון שגיאה", - "ToggleDiscordTooltip": "בחרו להציג את ריוג'ינקס או לא בפעילות הדיסקורד שלכם \"משוחק כרגע\".", - "AddGameDirBoxTooltip": "הזן תקיית משחקים כדי להוסיף לרשימה", - "AddGameDirTooltip": "הוסף תקיית משחקים לרשימה", - "RemoveGameDirTooltip": "הסר את תקיית המשחקים שנבחרה", - "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list", - "AddAutoloadDirTooltip": "Add an autoload directory to the list", - "RemoveAutoloadDirTooltip": "Remove selected autoload directory", - "CustomThemeCheckTooltip": "השתמש בעיצוב מותאם אישית של אבלוניה עבור ה-ממשק הגראפי כדי לשנות את המראה של תפריטי האמולטור", - "CustomThemePathTooltip": "נתיב לערכת נושא לממשק גראפי מותאם אישית", - "CustomThemeBrowseTooltip": "חפש עיצוב ממשק גראפי מותאם אישית", - "DockModeToggleTooltip": "מצב עגינה גורם למערכת המדומה להתנהג כ-נינטנדו סוויץ' בתחנת עגינתו. זה משפר את הנאמנות הגרפית ברוב המשחקים.\n לעומת זאת, השבתה של תכונה זו תגרום למערכת המדומה להתנהג כ- נינטנדו סוויץ' נייד, ולהפחית את איכות הגרפיקה.\n\nהגדירו את שלט שחקן 1 אם אתם מתכננים להשתמש במצב עגינה; הגדירו את פקדי כף היד אם אתם מתכננים להשתמש במצב נייד.\n\nמוטב להשאיר דלוק אם אתם לא בטוחים.", - "DirectKeyboardTooltip": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.", - "DirectMouseTooltip": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.", - "RegionTooltip": "שנה אזור מערכת", - "LanguageTooltip": "שנה שפת מערכת", - "TimezoneTooltip": "שנה את אזור הזמן של המערכת", - "TimeTooltip": "שנה זמן מערכת", - "VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.", - "PptcToggleTooltip": "שומר את פונקציות ה-JIT המתורגמות כך שלא יצטרכו לעבור תרגום שוב כאשר משחק עולה.\n\nמפחית תקיעות ומשפר מהירות עלייה של המערכת אחרי הפתיחה הראשונה של המשחק.\n\nמוטב להשאיר דלוק אם לא בטוחים.", - "LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", - "FsIntegrityToggleTooltip": "בודק לקבצים שגויים כאשר משחק עולה, ואם מתגלים כאלו, מציג את מזהה השגיאה שלהם לקובץ הלוג.\n\nאין לכך השפעה על הביצועים ונועד לעזור לבדיקה וניפוי שגיאות של האמולטור.\n\nמוטב להשאיר דלוק אם לא בטוחים.", - "AudioBackendTooltip": "משנה את אחראי השמע.\n\nSDL2 הוא הנבחר, למראת שOpenAL וגם SoundIO משומשים כאפשרויות חלופיות. אפשרות הDummy לא תשמיע קול כלל.\n\nמוטב להשאיר על SDL2 אם לא בטוחים.", - "MemoryManagerTooltip": "שנה איך שזיכרון מארח מיוחד ומונגד. משפיע מאוד על ביצועי המעבד המדומה.\n\nמוטב להשאיר על מארח לא מבוקר אם לא בטוחים.", - "MemoryManagerSoftwareTooltip": "השתמש בתוכנת ה-page table בכדי להתייחס לתרגומים. דיוק מרבי לקונסולה אך המימוש הכי איטי.", - "MemoryManagerHostTooltip": "ממפה זיכרון ישירות לכתובת המארח. מהיר בהרבה ביכולות קימפול ה-JIT והריצה.", - "MemoryManagerUnsafeTooltip": "ממפה זיכרון ישירות, אך לא ממסך את הכתובת בתוך כתובת המארח לפני הגישה. מהיר, אך במחיר של הגנה. יישום המארח בעל גישה לזיכרון מכל מקום בריוג'ינקס, לכן הריצו איתו רק קבצים שאתם סומכים עליהם.", - "UseHypervisorTooltip": "השתמש ב- Hypervisor במקום JIT. משפר מאוד ביצועים כשניתן, אבל יכול להיות לא יציב במצבו הנוכחי.", - "DRamTooltip": "מנצל תצורת מצב-זיכרון חלופית לחכות את מכשיר הפיתוח של הסוויץ'.\n\nזה שימושי להחלפת חבילות מרקמים באיכותיים יותר או כאלו ברזולוציית 4k. לא משפר ביצועים.\n\nמוטב להשאיר כבוי אם לא בטוחים.", - "IgnoreMissingServicesTooltip": "מתעלם מפעולות שלא קיבלו מימוש במערכת ההפעלה Horizon OS. זה עלול לעזור לעקוף קריסות של היישום במשחקים מסויימים.\n\nמוטב להשאיר כבוי אם לא בטוחים.", - "IgnoreAppletTooltip": "תיבת הדו-שיח החיצונית \"Controller Applet\" לא תופיע אם ה-Gamepad מנותק במהלך המשחק. לא תהיה הנחיה לסגור את תיבת הדו-שיח או להגדיר בקר חדש. ברגע שהבקר שנותק בעבר יתחבר מחדש, המשחק יתחדש אוטומטית.", - "GraphicsBackendThreadingTooltip": "מריץ פקודות גראפיקה בתהליך שני נפרד.\n\nמאיץ עיבוד הצללות, מפחית תקיעות ומשפר ביצועים של דרייבר כרטיסי מסך אשר לא תומכים בהרצה רב-תהליכית.\n\nמוטב להשאיר על אוטומטי אם לא בטוחים.", - "GalThreadingTooltip": "מריץ פקודות גראפיקה בתהליך שני נפרד.\n\nמאיץ עיבוד הצללות, מפחית תקיעות ומשפר ביצועים של דרייבר כרטיסי מסך אשר לא תומכים בהרצה רב-תהליכית.\n\nמוטב להשאיר על אוטומטי אם לא בטוחים.", - "ShaderCacheToggleTooltip": "שומר זכרון מטמון של הצללות, דבר שמפחית תקיעות בריצות מסוימות.\n\nמוטב להשאיר דלוק אם לא בטוחים.", - "ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.", - "ResolutionScaleEntryTooltip": "שיפור רזולוציית נקודה צפה, כגון 1.5. הוא שיפור לא אינטגרלי הנוטה לגרום יותר בעיות או להקריס.", - "AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.", - "AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.", - "ShaderDumpPathTooltip": "נתיב השלכת הצללות גראפיות", - "FileLogTooltip": "שומר את רישומי שורת הפקודות לזיכרון, לא משפיע על ביצועי היישום.", - "StubLogTooltip": "מדפיס רישומים כושלים לשורת הפקודות. לא משפיע על ביצועי היישום.", - "InfoLogTooltip": "מדפיק רישומי מידע לשורת הפקודות. לא משפיע על ביצועי היישום.", - "WarnLogTooltip": "מדפיק רישומי הערות לשורת הפקודות. לא משפיע על ביצועי היישום.", - "ErrorLogTooltip": "מדפיס רישומי שגיאות לשורת הפקודות. לא משפיע על ביצועי היישום.", - "TraceLogTooltip": "מדפיק רישומי זיכרון לשורת הפקודות. לא משפיע על ביצועי היישום.", - "GuestLogTooltip": "מדפיס רישומי אורח לשורת הפקודות. לא משפיע על ביצועי היישום.", - "FileAccessLogTooltip": "מדפיס גישות לקבצי רישום לשורת הפקודות.", - "FSAccessLogModeTooltip": "מאפשר גישה לרישומי FS ליציאת שורת הפקודות. האפשרויות הינן 0-3.", - "DeveloperOptionTooltip": "השתמש בזהירות", - "OpenGlLogLevel": "דורש הפעלת רמות רישום מתאימות", - "DebugLogTooltip": "מדפיס הודעות יומן ניפוי באגים בשורת הפקודות.", - "LoadApplicationFileTooltip": "פתח סייר קבצים כדי לבחור קובץ תואם סוויץ' לטעינה", - "LoadApplicationFolderTooltip": "פתח סייר קבצים כדי לבחור יישום תואם סוויץ', לא ארוז לטעינה.", - "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from", - "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from", - "OpenRyujinxFolderTooltip": "פתח את תיקיית מערכת הקבצים ריוג'ינקס", - "OpenRyujinxLogsTooltip": "פותח את התיקיה שאליה נכתבים רישומים", - "ExitTooltip": "צא מריוג'ינקס", - "OpenSettingsTooltip": "פתח את חלון ההגדרות", - "OpenProfileManagerTooltip": "פתח את חלון מנהל פרופילי המשתמש", - "StopEmulationTooltip": "הפסק את הדמייה של המשחק הנוכחי וחזור למסך בחירת המשחק", - "CheckUpdatesTooltip": "בדוק אם קיימים עדכונים לריוג'ינקס", - "OpenAboutTooltip": "פתח את חלון אודות היישום", - "GridSize": "גודל רשת", - "GridSizeTooltip": "שנה את גודל המוצרים על הרשת.", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "פורטוגלית ברזילאית", - "AboutRyujinxContributorsButtonHeader": "צפה בכל התורמים", - "SettingsTabSystemAudioVolume": "עוצמת קול: ", - "AudioVolumeTooltip": "שנה עוצמת קול", - "SettingsTabSystemEnableInternetAccess": "אפשר גישה לאינטרנט בתור אורח/חיבור לאן", - "EnableInternetAccessTooltip": "מאפשר ליישומים באמולצייה להתחבר לאינטרנט.\n\nמשחקים עם חיבור לאן יכולים להתחבר אחד לשני כשאופצייה זו מופעלת והמערכות מתחברות לאותה נקודת גישה. כמו כן זה כולל שורות פקודות אמיתיות גם.\n\nאופצייה זו לא מאפשרת חיבור לשרתי נינטנדו. כשהאופצייה דלוקה היא עלולה לגרום לקריסת היישום במשחקים מסויימים שמנסים להתחבר לאינטרנט.\n\nמוטב להשאיר כבוי אם לא בטוחים.", - "GameListContextMenuManageCheatToolTip": "נהל צ'יטים", - "GameListContextMenuManageCheat": "נהל צ'יטים", - "GameListContextMenuManageModToolTip": "נהל מודים", - "GameListContextMenuManageMod": "נהל מודים", - "ControllerSettingsStickRange": "טווח:", - "DialogStopEmulationTitle": "ריוג'ינקס - עצור אמולציה", - "DialogStopEmulationMessage": "האם אתם בטוחים שאתם רוצים לסגור את האמולצייה?", - "SettingsTabCpu": "מעבד", - "SettingsTabAudio": "שמע", - "SettingsTabNetwork": "רשת", - "SettingsTabNetworkConnection": "חיבור רשת", - "SettingsTabCpuCache": "מטמון מעבד", - "SettingsTabCpuMemory": "מצב מעבד", - "DialogUpdaterFlatpakNotSupportedMessage": "בבקשה עדכן את ריוג'ינקס דרך פלאטהב.", - "UpdaterDisabledWarningTitle": "מעדכן מושבת!", - "ControllerSettingsRotate90": "סובב 90° עם בכיוון השעון", - "IconSize": "גודל הסמל", - "IconSizeTooltip": "שנה את גודל הסמלים של משחקים", - "MenuBarOptionsShowConsole": "הצג שורת פקודות", - "ShaderCachePurgeError": "שגיאה בניקוי מטמון ההצללות ב-{0}: {1}", - "UserErrorNoKeys": "המפתחות לא נמצאו", - "UserErrorNoFirmware": "קושחה לא נמצאה", - "UserErrorFirmwareParsingFailed": "שגיאת ניתוח קושחה", - "UserErrorApplicationNotFound": "יישום לא נמצא", - "UserErrorUnknown": "שגיאה לא ידועה", - "UserErrorUndefined": "שגיאה לא מוגדרת", - "UserErrorNoKeysDescription": "ריוג'ינקס לא הצליח למצוא את קובץ ה-'prod.keys' שלך", - "UserErrorNoFirmwareDescription": "ריוג'ינקס לא הצליחה למצוא קושחה מותקנת", - "UserErrorFirmwareParsingFailedDescription": "ריוג'ינקס לא הצליחה לנתח את הקושחה שסופקה. זה נגרם בדרך כלל על ידי מפתחות לא עדכניים.", - "UserErrorApplicationNotFoundDescription": "ריוג'ינקס לא מצאה יישום תקין בנתיב הנתון", - "UserErrorUnknownDescription": "קרתה שגיאה לא ידועה!", - "UserErrorUndefinedDescription": "קרתה שגיאה לא מוגדרת! זה לא אמור לקרות, אנא צרו קשר עם מפתח!", - "OpenSetupGuideMessage": "פתח מדריך התקנה", - "NoUpdate": "אין עדכון", - "TitleUpdateVersionLabel": "גרסה {0}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "ריוג'ינקס - מידע", - "RyujinxConfirm": "ריוג'ינקס - אישור", - "FileDialogAllTypes": "כל הסוגים", - "Never": "אף פעם", - "SwkbdMinCharacters": "לפחות {0} תווים", - "SwkbdMinRangeCharacters": "באורך {0}-{1} תווים", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "מקלדת וירטואלית", - "SoftwareKeyboardModeNumeric": "חייב להיות בין 0-9 או '.' בלבד", - "SoftwareKeyboardModeAlphabet": "מחויב להיות ללא אותיות CJK", - "SoftwareKeyboardModeASCII": "מחויב להיות טקסט אסקיי", - "ControllerAppletControllers": "בקרים נתמכים:", - "ControllerAppletPlayers": "שחקנים:", - "ControllerAppletDescription": "התצורה הנוכחית אינה תקינה. פתח הגדרות והגדר מחדש את הקלטים שלך.", - "ControllerAppletDocked": "מצב עגינה מוגדר. כדאי ששליטה ניידת תהיה מושבתת.", - "UpdaterRenaming": "משנה שמות של קבצים ישנים...", - "UpdaterRenameFailed": "המעדכן לא הצליח לשנות את שם הקובץ: {0}", - "UpdaterAddingFiles": "מוסיף קבצים חדשים...", - "UpdaterExtracting": "מחלץ עדכון...", - "UpdaterDownloading": "מוריד עדכון...", - "Docked": "בתחנת עגינה", - "Handheld": "נייד", - "ConnectionError": "שגיאת חיבור", - "AboutPageDeveloperListMore": "{0} ועוד...", - "ApiError": "שגיאת ממשק.", - "LoadingHeading": "טוען {0}", - "CompilingPPTC": "קימפול PTC", - "CompilingShaders": "קימפול הצללות", - "AllKeyboards": "כל המקלדות", - "OpenFileDialogTitle": "בחר קובץ נתמך לפתיחה", - "OpenFolderDialogTitle": "בחר תיקיה עם משחק לא ארוז", - "AllSupportedFormats": "כל הפורמטים הנתמכים", - "RyujinxUpdater": "מעדכן ריוג'ינקס", - "SettingsTabHotkeys": "מקשי קיצור במקלדת", - "SettingsTabHotkeysHotkeys": "מקשי קיצור במקלדת", - "SettingsTabHotkeysToggleVsyncHotkey": "שנה סינכרון אנכי:", - "SettingsTabHotkeysScreenshotHotkey": "צילום מסך:", - "SettingsTabHotkeysShowUiHotkey": "הצג ממשק משתמש:", - "SettingsTabHotkeysPauseHotkey": "הפסק:", - "SettingsTabHotkeysToggleMuteHotkey": "השתק:", - "ControllerMotionTitle": "הגדרות שליטת תנועות ג'ירוסקופ", - "ControllerRumbleTitle": "הגדרות רטט", - "SettingsSelectThemeFileDialogTitle": "בחרו קובץ ערכת נושא", - "SettingsXamlThemeFile": "קובץ ערכת נושא Xaml", - "AvatarWindowTitle": "ניהול חשבונות - אוואטר", - "Amiibo": "אמיבו", - "Unknown": "לא ידוע", - "Usage": "שימוש", - "Writable": "ניתן לכתיבה", - "SelectDlcDialogTitle": "בחרו קבצי הרחבות משחק", - "SelectUpdateDialogTitle": "בחרו קבצי עדכון", - "SelectModDialogTitle": "בחר תיקיית מודים", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "ניהול פרופילי משתמש", - "CheatWindowTitle": "נהל צ'יטים למשחק", - "DlcWindowTitle": "נהל הרחבות משחק עבור {0} ({1})", - "ModWindowTitle": "Manage Mods for {0} ({1})", - "UpdateWindowTitle": "נהל עדכוני משחקים", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} new update(s) added", - "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.", - "CheatWindowHeading": "צ'יטים זמינים עבור {0} [{1}]", - "BuildId": "מזהה בניה:", - "DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.", - "DlcWindowHeading": "{0} הרחבות משחק", - "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} new update(s) added", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "{0} מוד(ים)", - "UserProfilesEditProfile": "ערוך נבחר/ים", - "Continue": "Continue", - "Cancel": "בטל", - "Save": "שמור", - "Discard": "השלך", - "Paused": "מושהה", - "UserProfilesSetProfileImage": "הגדר תמונת פרופיל", - "UserProfileEmptyNameError": "נדרש שם", - "UserProfileNoImageError": "נדרשת תמונת פרופיל", - "GameUpdateWindowHeading": "נהל עדכונים עבור {0} ({1})", - "SettingsTabHotkeysResScaleUpHotkey": "שפר רזולוציה:", - "SettingsTabHotkeysResScaleDownHotkey": "הפחת רזולוציה:", - "UserProfilesName": "שם:", - "UserProfilesUserId": "מזהה משתמש:", - "SettingsTabGraphicsBackend": "אחראי גראפיקה", - "SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.", - "SettingsEnableTextureRecompression": "אפשר דחיסה מחדש של המרקם", - "SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.", - "SettingsTabGraphicsPreferredGpu": "כרטיס גראפי מועדף", - "SettingsTabGraphicsPreferredGpuTooltip": "בחר את הכרטיס הגראפי שישומש עם הגראפיקה של וולקאן.\n\nדבר זה לא משפיע על הכרטיס הגראפי שישומש עם OpenGL.\n\nמוטב לבחור את ה-GPU המסומן כ-\"dGPU\" אם אינכם בטוחים, אם זו לא אופצייה, אל תשנו דבר.", - "SettingsAppRequiredRestartMessage": "ריוג'ינקס דורש אתחול מחדש", - "SettingsGpuBackendRestartMessage": "הגדרות אחראי גרפיקה או כרטיס גראפי שונו. זה ידרוש הפעלה מחדש כדי להחיל שינויים", - "SettingsGpuBackendRestartSubMessage": "האם ברצונך להפעיל מחדש כעט?", - "RyujinxUpdaterMessage": "האם ברצונך לעדכן את ריוג'ינקס לגרסא האחרונה?", - "SettingsTabHotkeysVolumeUpHotkey": "הגבר את עוצמת הקול:", - "SettingsTabHotkeysVolumeDownHotkey": "הנמך את עוצמת הקול:", - "SettingsEnableMacroHLE": "Enable Macro HLE", - "SettingsEnableMacroHLETooltip": "אמולצייה ברמה גבוהה של כרטיס גראפי עם קוד מקרו.\n\nמשפר את ביצועי היישום אך עלול לגרום לגליצ'ים חזותיים במשחקים מסויימים.\n\nמוטב להשאיר דלוק אם אינך בטוח.", - "SettingsEnableColorSpacePassthrough": "שקיפות מרחב צבע", - "SettingsEnableColorSpacePassthroughTooltip": "מנחה את המנוע Vulkan להעביר שקיפות בצבעים מבלי לציין מרחב צבע. עבור משתמשים עם מסכים רחבים, הדבר עשוי לגרום לצבעים מרהיבים יותר, בחוסר דיוק בצבעים האמתיים.", - "VolumeShort": "שמע", - "UserProfilesManageSaves": "נהל שמורים", - "DeleteUserSave": "האם ברצונך למחוק את תקיית השמור למשחק זה?", - "IrreversibleActionNote": "הפעולה הזו בלתי הפיכה.", - "SaveManagerHeading": "נהל שמורי משחק עבור {0} ({1})", - "SaveManagerTitle": "מנהל שמירות", - "Name": "שם", - "Size": "גודל", - "Search": "חפש", - "UserProfilesRecoverLostAccounts": "שחזר חשבון שאבד", - "Recover": "שחזר", - "UserProfilesRecoverHeading": "שמורים נמצאו לחשבונות הבאים", - "UserProfilesRecoverEmptyList": "אין פרופילים לשחזור", - "GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.", - "GraphicsAALabel": "החלקת-עקומות:", - "GraphicsScalingFilterLabel": "מסנן מידת איכות:", - "GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", - "GraphicsScalingFilterBilinear": "Bilinear", - "GraphicsScalingFilterNearest": "Nearest", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "רמה", - "GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.", - "SmaaLow": "SMAA נמוך", - "SmaaMedium": "SMAA בינוני", - "SmaaHigh": "SMAA גבוהה", - "SmaaUltra": "SMAA אולטרה", - "UserEditorTitle": "ערוך משתמש", - "UserEditorTitleCreate": "צור משתמש", - "SettingsTabNetworkInterface": "ממשק רשת", - "NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.", - "NetworkInterfaceDefault": "ברירת המחדל", - "PackagingShaders": "אורז הצללות", - "AboutChangelogButton": "צפה במידע אודות שינויים בגיטהב", - "AboutChangelogButtonTooltipMessage": "לחץ כדי לפתוח את יומן השינויים עבור גרסה זו בדפדפן ברירת המחדל שלך.", - "SettingsTabNetworkMultiplayer": "רב משתתפים", - "MultiplayerMode": "מצב:", - "MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.", - "MultiplayerModeDisabled": "Disabled", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/it_IT.json b/src/Ryujinx/Assets/Locales/it_IT.json deleted file mode 100644 index 5ca17bc2e..000000000 --- a/src/Ryujinx/Assets/Locales/it_IT.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "Italiano", - "MenuBarFileOpenApplet": "Apri applet", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Apri l'applet Mii Editor in modalità Standalone", - "SettingsTabInputDirectMouseAccess": "Accesso diretto al mouse", - "SettingsTabSystemMemoryManagerMode": "Modalità di gestione della memoria:", - "SettingsTabSystemMemoryManagerModeSoftware": "Software", - "SettingsTabSystemMemoryManagerModeHost": "Host (veloce)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Host Unchecked (più veloce, non sicura)", - "SettingsTabSystemUseHypervisor": "Usa Hypervisor", - "MenuBarFile": "_File", - "MenuBarFileOpenFromFile": "_Carica applicazione da un file", - "MenuBarFileOpenUnpacked": "Carica _gioco estratto", - "MenuBarFileOpenEmuFolder": "Apri cartella di Ryujinx", - "MenuBarFileOpenLogsFolder": "Apri cartella dei log", - "MenuBarFileExit": "_Esci", - "MenuBarOptions": "_Opzioni", - "MenuBarOptionsToggleFullscreen": "Schermo intero", - "MenuBarOptionsStartGamesInFullscreen": "Avvia i giochi a schermo intero", - "MenuBarOptionsStopEmulation": "Ferma emulazione", - "MenuBarOptionsSettings": "_Impostazioni", - "MenuBarOptionsManageUserProfiles": "_Gestisci i profili utente", - "MenuBarActions": "_Azioni", - "MenuBarOptionsSimulateWakeUpMessage": "Simula messaggio Wake-up", - "MenuBarActionsScanAmiibo": "Scansiona un Amiibo", - "MenuBarTools": "_Strumenti", - "MenuBarToolsInstallFirmware": "Installa firmware", - "MenuBarFileToolsInstallFirmwareFromFile": "Installa un firmware da file XCI o ZIP", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Installa un firmare da una cartella", - "MenuBarToolsInstallKeys": "Installa Chiavi", - "MenuBarFileToolsInstallKeysFromFile": "Installa Chiavi da file KEYS o ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Installa Chiavi da una Cartella", - "MenuBarToolsManageFileTypes": "Gestisci i tipi di file", - "MenuBarToolsInstallFileTypes": "Installa i tipi di file", - "MenuBarToolsUninstallFileTypes": "Disinstalla i tipi di file", - "MenuBarFileLoadDlcFromFolder": "Carica DLC Da una Cartella", - "MenuBarFileLoadTitleUpdatesFromFolder": "Carica Aggiornamenti Da una Cartella", - "MenuBarFileOpenFromFileError": "Nessuna applicazione trovata nel file selezionato", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_Vista", - "MenuBarViewWindow": "Dimensione Finestra", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Aiuto", - "MenuBarHelpCheckForUpdates": "Controlla aggiornamenti", - "MenuBarHelpAbout": "Informazioni", - "MenuSearch": "Cerca...", - "GameListHeaderFavorite": "Preferito", - "GameListHeaderIcon": "Icona", - "GameListHeaderApplication": "Nome", - "GameListHeaderDeveloper": "Sviluppatore", - "GameListHeaderVersion": "Versione", - "GameListHeaderTimePlayed": "Tempo di gioco", - "GameListHeaderLastPlayed": "Ultima partita", - "GameListHeaderFileExtension": "Estensione", - "GameListHeaderFileSize": "Dimensione file", - "GameListHeaderPath": "Percorso", - "GameListContextMenuOpenUserSaveDirectory": "Apri la cartella dei salvataggi dell'utente", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Apre la cartella che contiene i dati di salvataggio dell'utente", - "GameListContextMenuOpenDeviceSaveDirectory": "Apri la cartella dei salvataggi del dispositivo", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Apre la cartella che contiene i dati di salvataggio del dispositivo", - "GameListContextMenuOpenBcatSaveDirectory": "Apri la cartella del salvataggio BCAT", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Apre la cartella che contiene il salvataggio BCAT dell'applicazione", - "GameListContextMenuManageTitleUpdates": "Gestisci aggiornamenti del gioco", - "GameListContextMenuManageTitleUpdatesToolTip": "Apre la finestra di gestione aggiornamenti del gioco", - "GameListContextMenuManageDlc": "Gestisci DLC", - "GameListContextMenuManageDlcToolTip": "Apre la finestra di gestione dei DLC", - "GameListContextMenuCacheManagement": "Gestione della cache", - "GameListContextMenuCacheManagementPurgePptc": "Accoda rigenerazione della cache PPTC", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Esegue la rigenerazione della cache PPTC al prossimo avvio del gioco", - "GameListContextMenuCacheManagementPurgeShaderCache": "Elimina la cache degli shader", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Elimina la cache degli shader dell'applicazione", - "GameListContextMenuCacheManagementOpenPptcDirectory": "Apri la cartella della cache PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Apre la cartella che contiene la cache PPTC dell'applicazione", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Apri la cartella della cache degli shader", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Apre la cartella che contiene la cache degli shader dell'applicazione", - "GameListContextMenuExtractData": "Estrai dati", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Estrae la sezione ExeFS dall'attuale configurazione dell'applicazione (includendo aggiornamenti)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Estrae la sezione RomFS dall'attuale configurazione dell'applicazione (includendo aggiornamenti)", - "GameListContextMenuExtractDataLogo": "Logo", - "GameListContextMenuExtractDataLogoToolTip": "Estrae la sezione Logo dall'attuale configurazione dell'applicazione (includendo aggiornamenti)", - "GameListContextMenuCreateShortcut": "Crea collegamento", - "GameListContextMenuCreateShortcutToolTip": "Crea un collegamento sul desktop che avvia l'applicazione selezionata", - "GameListContextMenuCreateShortcutToolTipMacOS": "Crea un collegamento nella cartella Applicazioni di macOS che avvia l'applicazione selezionata", - "GameListContextMenuOpenModsDirectory": "Apri la cartella delle mod", - "GameListContextMenuOpenModsDirectoryToolTip": "Apre la cartella che contiene le mod dell'applicazione", - "GameListContextMenuOpenSdModsDirectory": "Apri la cartella delle mod Atmosphere", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Apre la cartella alternativa di Atmosphere sulla scheda SD che contiene le mod dell'applicazione. Utile per le mod create per funzionare sull'hardware reale.", - "GameListContextMenuTrimXCI": "Controlla e Trimma i file XCI", - "GameListContextMenuTrimXCIToolTip": "Controlla e Trimma i file XCI da Salvare Sullo Spazio del Disco", - "StatusBarGamesLoaded": "{0}/{1} Giochi Caricati", - "StatusBarSystemVersion": "Versione di sistema: {0}", - "StatusBarXCIFileTrimming": "Trimmando i file XCI '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Rilevato limite basso per le mappature di memoria", - "LinuxVmMaxMapCountDialogTextPrimary": "Vuoi aumentare il valore di vm.max_map_count a {0}?", - "LinuxVmMaxMapCountDialogTextSecondary": "Alcuni giochi potrebbero provare a creare più mappature di memoria di quanto sia attualmente consentito. Ryujinx si bloccherà non appena questo limite viene superato.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Sì, fino al prossimo riavvio", - "LinuxVmMaxMapCountDialogButtonPersistent": "Sì, in modo permanente", - "LinuxVmMaxMapCountWarningTextPrimary": "La quantità massima di mappature di memoria è inferiore a quella consigliata.", - "LinuxVmMaxMapCountWarningTextSecondary": "Il valore corrente di vm.max_map_count ({0}) è inferiore a {1}. Alcuni giochi potrebbero provare a creare più mappature di memoria di quanto sia attualmente consentito. Ryujinx si bloccherà non appena questo limite viene superato.\n\nPotresti voler aumentare manualmente il limite o installare pkexec, il che permette a Ryujinx di assisterlo.", - "Settings": "Impostazioni", - "SettingsTabGeneral": "Interfaccia utente", - "SettingsTabGeneralGeneral": "Generali", - "SettingsTabGeneralEnableDiscordRichPresence": "Attiva Discord Rich Presence", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Controlla aggiornamenti all'avvio", - "SettingsTabGeneralShowConfirmExitDialog": "Mostra dialogo \"Conferma Uscita\"", - "SettingsTabGeneralRememberWindowState": "Ricorda Dimensione/Posizione Finestra", - "SettingsTabGeneralShowTitleBar": "Mostra barra del titolo (Richiede il riavvio)", - "SettingsTabGeneralHideCursor": "Nascondi il cursore:", - "SettingsTabGeneralHideCursorNever": "Mai", - "SettingsTabGeneralHideCursorOnIdle": "Quando è inattivo", - "SettingsTabGeneralHideCursorAlways": "Sempre", - "SettingsTabGeneralGameDirectories": "Cartelle dei giochi", - "SettingsTabGeneralAdd": "Aggiungi", - "SettingsTabGeneralRemove": "Rimuovi", - "SettingsTabSystem": "Sistema", - "SettingsTabSystemCore": "Principale", - "SettingsTabSystemSystemRegion": "Regione del sistema:", - "SettingsTabSystemSystemRegionJapan": "Giappone", - "SettingsTabSystemSystemRegionUSA": "Stati Uniti d'America", - "SettingsTabSystemSystemRegionEurope": "Europa", - "SettingsTabGeneralAutoloadDirectories": "Directory di Caricamento Automatico per DLC/Aggiornamenti", - "SettingsTabGeneralAutoloadNote": "Aggiornamenti e DLC che collegano a file mancanti verranno disabilitati automaticamente", - "SettingsTabSystemSystemRegionAustralia": "Australia", - "SettingsTabSystemSystemRegionChina": "Cina", - "SettingsTabSystemSystemRegionKorea": "Corea", - "SettingsTabSystemSystemRegionTaiwan": "Taiwan", - "SettingsTabSystemSystemLanguage": "Lingua del sistema:", - "SettingsTabSystemSystemLanguageJapanese": "Giapponese", - "SettingsTabSystemSystemLanguageAmericanEnglish": "Inglese americano", - "SettingsTabSystemSystemLanguageFrench": "Francese", - "SettingsTabSystemSystemLanguageGerman": "Tedesco", - "SettingsTabSystemSystemLanguageItalian": "Italiano", - "SettingsTabSystemSystemLanguageSpanish": "Spagnolo", - "SettingsTabSystemSystemLanguageChinese": "Cinese", - "SettingsTabSystemSystemLanguageKorean": "Coreano", - "SettingsTabSystemSystemLanguageDutch": "Olandese", - "SettingsTabSystemSystemLanguagePortuguese": "Portoghese", - "SettingsTabSystemSystemLanguageRussian": "Russo", - "SettingsTabSystemSystemLanguageTaiwanese": "Taiwanese", - "SettingsTabSystemSystemLanguageBritishEnglish": "Inglese britannico", - "SettingsTabSystemSystemLanguageCanadianFrench": "Francese canadese", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Spagnolo latino americano", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Cinese semplificato", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Cinese tradizionale", - "SettingsTabSystemSystemTimeZone": "Fuso orario del sistema:", - "SettingsTabSystemSystemTime": "Data e ora del sistema:", - "SettingsTabSystemEnableVsync": "Attiva VSync", - "SettingsTabSystemEnablePptc": "Attiva PPTC (Profiled Persistent Translation Cache)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "Attiva controlli d'integrità FS", - "SettingsTabSystemAudioBackend": "Backend audio:", - "SettingsTabSystemAudioBackendDummy": "Dummy", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "Espedienti", - "SettingsTabSystemHacksNote": "Possono causare instabilità", - "SettingsTabSystemDramSize": "Usa layout di memoria alternativo (per sviluppatori)", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "Ignora servizi mancanti", - "SettingsTabSystemIgnoreApplet": "Ignora l'applet", - "SettingsTabGraphics": "Grafica", - "SettingsTabGraphicsAPI": "API grafica", - "SettingsTabGraphicsEnableShaderCache": "Attiva la cache degli shader", - "SettingsTabGraphicsAnisotropicFiltering": "Filtro anisotropico:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Auto", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "Scala della risoluzione:", - "SettingsTabGraphicsResolutionScaleCustom": "Personalizzata (Non raccomandata)", - "SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Non consigliato)", - "SettingsTabGraphicsAspectRatio": "Rapporto d'aspetto:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "Adatta alla finestra", - "SettingsTabGraphicsDeveloperOptions": "Opzioni per sviluppatori", - "SettingsTabGraphicsShaderDumpPath": "Percorso di dump degli shader:", - "SettingsTabLogging": "Log", - "SettingsTabLoggingLogging": "Log", - "SettingsTabLoggingEnableLoggingToFile": "Salva i log su file", - "SettingsTabLoggingEnableStubLogs": "Attiva log di stub", - "SettingsTabLoggingEnableInfoLogs": "Attiva log di informazioni", - "SettingsTabLoggingEnableWarningLogs": "Attiva log di avviso", - "SettingsTabLoggingEnableErrorLogs": "Attiva log di errore", - "SettingsTabLoggingEnableTraceLogs": "Attiva log di trace", - "SettingsTabLoggingEnableGuestLogs": "Attiva log del guest", - "SettingsTabLoggingEnableFsAccessLogs": "Attiva log di accesso FS", - "SettingsTabLoggingFsGlobalAccessLogMode": "Modalità log di accesso globale FS:", - "SettingsTabLoggingDeveloperOptions": "Opzioni per sviluppatori", - "SettingsTabLoggingDeveloperOptionsNote": "ATTENZIONE: ridurrà le prestazioni", - "SettingsTabLoggingGraphicsBackendLogLevel": "Livello di log del backend grafico:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "Nessuno", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Errore", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Rallentamenti", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "Tutto", - "SettingsTabLoggingEnableDebugLogs": "Attiva log di debug", - "SettingsTabInput": "Input", - "SettingsTabInputEnableDockedMode": "Attiva modalità TV", - "SettingsTabInputDirectKeyboardAccess": "Accesso diretto alla tastiera", - "SettingsButtonSave": "Salva", - "SettingsButtonClose": "Chiudi", - "SettingsButtonOk": "OK", - "SettingsButtonCancel": "Annulla", - "SettingsButtonApply": "Applica", - "ControllerSettingsPlayer": "Giocatore", - "ControllerSettingsPlayer1": "Giocatore 1", - "ControllerSettingsPlayer2": "Giocatore 2", - "ControllerSettingsPlayer3": "Giocatore 3", - "ControllerSettingsPlayer4": "Giocatore 4", - "ControllerSettingsPlayer5": "Giocatore 5", - "ControllerSettingsPlayer6": "Giocatore 6", - "ControllerSettingsPlayer7": "Giocatore 7", - "ControllerSettingsPlayer8": "Giocatore 8", - "ControllerSettingsHandheld": "Portatile", - "ControllerSettingsInputDevice": "Dispositivo di input", - "ControllerSettingsRefresh": "Ricarica", - "ControllerSettingsDeviceDisabled": "Disabilitato", - "ControllerSettingsControllerType": "Tipo di controller", - "ControllerSettingsControllerTypeHandheld": "Portatile", - "ControllerSettingsControllerTypeProController": "Pro Controller", - "ControllerSettingsControllerTypeJoyConPair": "Coppia di JoyCon", - "ControllerSettingsControllerTypeJoyConLeft": "JoyCon sinistro", - "ControllerSettingsControllerTypeJoyConRight": "JoyCon destro", - "ControllerSettingsProfile": "Profilo", - "ControllerSettingsProfileDefault": "Predefinito", - "ControllerSettingsLoad": "Carica", - "ControllerSettingsAdd": "Aggiungi", - "ControllerSettingsRemove": "Rimuovi", - "ControllerSettingsButtons": "Pulsanti", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Croce direzionale", - "ControllerSettingsDPadUp": "Su", - "ControllerSettingsDPadDown": "Giù", - "ControllerSettingsDPadLeft": "Sinistra", - "ControllerSettingsDPadRight": "Destra", - "ControllerSettingsStickButton": "Pulsante", - "ControllerSettingsStickUp": "Su", - "ControllerSettingsStickDown": "Giù", - "ControllerSettingsStickLeft": "Sinistra", - "ControllerSettingsStickRight": "Destra", - "ControllerSettingsStickStick": "Levetta", - "ControllerSettingsStickInvertXAxis": "Inverti levetta X", - "ControllerSettingsStickInvertYAxis": "Inverti levetta Y", - "ControllerSettingsStickDeadzone": "Zona morta:", - "ControllerSettingsLStick": "Levetta sinistra", - "ControllerSettingsRStick": "Levetta destra", - "ControllerSettingsTriggersLeft": "Grilletto sinistro", - "ControllerSettingsTriggersRight": "Grilletto destro", - "ControllerSettingsTriggersButtonsLeft": "Pulsante dorsale sinistro", - "ControllerSettingsTriggersButtonsRight": "Pulsante dorsale destro", - "ControllerSettingsTriggers": "Grilletti", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Tasto sinistro", - "ControllerSettingsExtraButtonsRight": "Tasto destro", - "ControllerSettingsMisc": "Varie", - "ControllerSettingsTriggerThreshold": "Sensibilità dei grilletti:", - "ControllerSettingsMotion": "Movimento", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Usa sensore compatibile con CemuHook", - "ControllerSettingsMotionControllerSlot": "Slot del controller:", - "ControllerSettingsMotionMirrorInput": "Input specchiato", - "ControllerSettingsMotionRightJoyConSlot": "Slot JoyCon destro:", - "ControllerSettingsMotionServerHost": "Server:", - "ControllerSettingsMotionGyroSensitivity": "Sensibilità del giroscopio:", - "ControllerSettingsMotionGyroDeadzone": "Zona morta del giroscopio:", - "ControllerSettingsSave": "Salva", - "ControllerSettingsClose": "Chiudi", - "KeyUnknown": "Sconosciuto", - "KeyShiftLeft": "Maiusc sinistro", - "KeyShiftRight": "Maiusc destro", - "KeyControlLeft": "Ctrl sinistro", - "KeyMacControlLeft": "⌃ sinistro", - "KeyControlRight": "Ctrl destro", - "KeyMacControlRight": "⌃ destro", - "KeyAltLeft": "Alt sinistro", - "KeyMacAltLeft": "⌥ sinistro", - "KeyAltRight": "Alt destro", - "KeyMacAltRight": "⌥ destro", - "KeyWinLeft": "⊞ sinistro", - "KeyMacWinLeft": "⌘ sinistro", - "KeyWinRight": "⊞ destro", - "KeyMacWinRight": "⌘ destro", - "KeyMenu": "Menù", - "KeyUp": "Su", - "KeyDown": "Giù", - "KeyLeft": "Sinistra", - "KeyRight": "Destra", - "KeyEnter": "Invio", - "KeyEscape": "Esc", - "KeySpace": "Spazio", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Ins", - "KeyDelete": "Canc", - "KeyPageUp": "Pag. Su", - "KeyPageDown": "Pag. Giù", - "KeyHome": "Inizio", - "KeyEnd": "Fine", - "KeyCapsLock": "Bloc Maiusc", - "KeyScrollLock": "Bloc Scorr", - "KeyPrintScreen": "Stamp", - "KeyPause": "Pausa", - "KeyNumLock": "Bloc Num", - "KeyClear": "Clear", - "KeyKeypad0": "Tast. num. 0", - "KeyKeypad1": "Tast. num. 1", - "KeyKeypad2": "Tast. num. 2", - "KeyKeypad3": "Tast. num. 3", - "KeyKeypad4": "Tast. num. 4", - "KeyKeypad5": "Tast. num. 5", - "KeyKeypad6": "Tast. num. 6", - "KeyKeypad7": "Tast. num. 7", - "KeyKeypad8": "Tast. num. 8", - "KeyKeypad9": "Tast. num. 9", - "KeyKeypadDivide": "Tast. num. /", - "KeyKeypadMultiply": "Tast. num. *", - "KeyKeypadSubtract": "Tast. num. -", - "KeyKeypadAdd": "Tast. num. +", - "KeyKeypadDecimal": "Tast. num. sep. decimale", - "KeyKeypadEnter": "Tast. num. Invio", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "ò", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "'", - "KeyBracketRight": "ì", - "KeySemicolon": "è", - "KeyQuote": "à", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "ù", - "KeyBackSlash": "<", - "KeyUnbound": "Non assegnato", - "GamepadLeftStick": "Pulsante levetta sinistra", - "GamepadRightStick": "Pulsante levetta destra", - "GamepadLeftShoulder": "Pulsante dorsale sinistro", - "GamepadRightShoulder": "Pulsante dorsale destro", - "GamepadLeftTrigger": "Grilletto sinistro", - "GamepadRightTrigger": "Grilletto destro", - "GamepadDpadUp": "Su", - "GamepadDpadDown": "Giù", - "GamepadDpadLeft": "Sinistra", - "GamepadDpadRight": "Destra", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Grilletto sinistro 0", - "GamepadSingleRightTrigger0": "Grilletto destro 0", - "GamepadSingleLeftTrigger1": "Grilletto sinistro 1", - "GamepadSingleRightTrigger1": "Grilletto destro 1", - "StickLeft": "Levetta sinistra", - "StickRight": "Levetta destra", - "UserProfilesSelectedUserProfile": "Profilo utente selezionato:", - "UserProfilesSaveProfileName": "Salva nome del profilo", - "UserProfilesChangeProfileImage": "Cambia immagine profilo", - "UserProfilesAvailableUserProfiles": "Profili utente disponibili:", - "UserProfilesAddNewProfile": "Aggiungi nuovo profilo", - "UserProfilesDelete": "Elimina", - "UserProfilesClose": "Chiudi", - "ProfileNameSelectionWatermark": "Scegli un soprannome", - "ProfileImageSelectionTitle": "Selezione dell'immagine profilo", - "ProfileImageSelectionHeader": "Scegli un'immagine profilo", - "ProfileImageSelectionNote": "Puoi importare un'immagine profilo personalizzata o selezionare un avatar dal firmware del sistema", - "ProfileImageSelectionImportImage": "Importa file immagine", - "ProfileImageSelectionSelectAvatar": "Seleziona avatar dal firmware", - "InputDialogTitle": "Finestra di input", - "InputDialogOk": "OK", - "InputDialogCancel": "Annulla", - "InputDialogCancelling": "Cancellando", - "InputDialogClose": "Chiudi", - "InputDialogAddNewProfileTitle": "Scegli il nome del profilo", - "InputDialogAddNewProfileHeader": "Digita un nome profilo", - "InputDialogAddNewProfileSubtext": "(Lunghezza massima: {0})", - "AvatarChoose": "Scegli", - "AvatarSetBackgroundColor": "Imposta colore di sfondo", - "AvatarClose": "Chiudi", - "ControllerSettingsLoadProfileToolTip": "Carica profilo", - "ControllerSettingsViewProfileToolTip": "Visualizza profilo", - "ControllerSettingsAddProfileToolTip": "Aggiungi profilo", - "ControllerSettingsRemoveProfileToolTip": "Rimuovi profilo", - "ControllerSettingsSaveProfileToolTip": "Salva profilo", - "MenuBarFileToolsTakeScreenshot": "Cattura uno screenshot", - "MenuBarFileToolsHideUi": "Nascondi l'interfaccia", - "GameListContextMenuRunApplication": "Esegui applicazione", - "GameListContextMenuToggleFavorite": "Preferito", - "GameListContextMenuToggleFavoriteToolTip": "Segna il gioco come preferito", - "SettingsTabGeneralTheme": "Tema:", - "SettingsTabGeneralThemeAuto": "Automatico", - "SettingsTabGeneralThemeDark": "Scuro", - "SettingsTabGeneralThemeLight": "Chiaro", - "ControllerSettingsConfigureGeneral": "Configura", - "ControllerSettingsRumble": "Vibrazione", - "ControllerSettingsRumbleStrongMultiplier": "Moltiplicatore vibrazione forte", - "ControllerSettingsRumbleWeakMultiplier": "Moltiplicatore vibrazione debole", - "DialogMessageSaveNotAvailableMessage": "Non ci sono dati di salvataggio per {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "Vuoi creare dei dati di salvataggio per questo gioco?", - "DialogConfirmationTitle": "Ryujinx - Conferma", - "DialogUpdaterTitle": "Ryujinx - Aggiornamento", - "DialogErrorTitle": "Ryujinx - Errore", - "DialogWarningTitle": "Ryujinx - Avviso", - "DialogExitTitle": "Ryujinx - Esci", - "DialogErrorMessage": "Ryujinx ha riscontrato un problema", - "DialogExitMessage": "Sei sicuro di voler chiudere Ryujinx?", - "DialogExitSubMessage": "Tutti i dati non salvati andranno persi!", - "DialogMessageCreateSaveErrorMessage": "C'è stato un errore durante la creazione dei dati di salvataggio: {0}", - "DialogMessageFindSaveErrorMessage": "C'è stato un errore durante la ricerca dei dati di salvataggio: {0}", - "FolderDialogExtractTitle": "Scegli una cartella in cui estrarre", - "DialogNcaExtractionMessage": "Estrazione della sezione {0} da {1}...", - "DialogNcaExtractionTitle": "Estrazione sezione NCA", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "L'estrazione è fallita. L'NCA principale non era presente nel file selezionato.", - "DialogNcaExtractionCheckLogErrorMessage": "L'estrazione è fallita. Consulta il file di log per maggiori informazioni.", - "DialogNcaExtractionSuccessMessage": "Estrazione completata con successo.", - "DialogUpdaterConvertFailedMessage": "La conversione dell'attuale versione di Ryujinx è fallita.", - "DialogUpdaterCancelUpdateMessage": "Annullamento dell'aggiornamento in corso!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "Stai già usando la versione più recente di Ryujinx!", - "DialogUpdaterFailedToGetVersionMessage": "Si è verificato un errore durante il tentativo di recuperare le informazioni sulla versione da GitHub Release. Ciò può verificarsi se una nuova versione è in fase di compilazione da GitHub Actions. Riprova tra qualche minuto.", - "DialogUpdaterConvertFailedGithubMessage": "La conversione della versione di Ryujinx ricevuta da Github Release è fallita.", - "DialogUpdaterDownloadingMessage": "Download dell'aggiornamento...", - "DialogUpdaterExtractionMessage": "Estrazione dell'aggiornamento...", - "DialogUpdaterRenamingMessage": "Rinominazione dell'aggiornamento...", - "DialogUpdaterAddingFilesMessage": "Aggiunta del nuovo aggiornamento...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "Aggiornamento completato!", - "DialogUpdaterRestartMessage": "Vuoi riavviare Ryujinx adesso?", - "DialogUpdaterNoInternetMessage": "Non sei connesso ad Internet!", - "DialogUpdaterNoInternetSubMessage": "Verifica di avere una connessione ad Internet funzionante!", - "DialogUpdaterDirtyBuildMessage": "Non puoi aggiornare una Dirty build di Ryujinx!", - "DialogUpdaterDirtyBuildSubMessage": "Scarica Ryujinx da https://ryujinx.app/download se stai cercando una versione supportata.", - "DialogRestartRequiredMessage": "Riavvio richiesto", - "DialogThemeRestartMessage": "Il tema è stato salvato. È richiesto un riavvio per applicare il tema.", - "DialogThemeRestartSubMessage": "Vuoi riavviare?", - "DialogFirmwareInstallEmbeddedMessage": "Vuoi installare il firmware incorporato in questo gioco? (Firmware {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "Non è stato trovato alcun firmware installato, ma Ryujinx è riuscito ad installare il firmware {0} dal gioco fornito.\nL'emulatore si avvierà adesso.", - "DialogFirmwareNoFirmwareInstalledMessage": "Nessun firmware installato", - "DialogFirmwareInstalledMessage": "Il firmware {0} è stato installato", - "DialogInstallFileTypesSuccessMessage": "Tipi di file installati con successo!", - "DialogInstallFileTypesErrorMessage": "Impossibile installare i tipi di file.", - "DialogUninstallFileTypesSuccessMessage": "Tipi di file disinstallati con successo!", - "DialogUninstallFileTypesErrorMessage": "Disinstallazione dei tipi di file non riuscita.", - "DialogOpenSettingsWindowLabel": "Apri finestra delle impostazioni", - "DialogOpenXCITrimmerWindowLabel": "Finestra XCI Trimmer", - "DialogControllerAppletTitle": "Applet del controller", - "DialogMessageDialogErrorExceptionMessage": "Errore nella visualizzazione del Message Dialog: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Errore nella visualizzazione della tastiera software: {0}", - "DialogErrorAppletErrorExceptionMessage": "Errore nella visualizzazione dell'ErrorApplet Dialog: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nPer maggiori informazioni su come risolvere questo errore, segui la nostra guida all'installazione.", - "DialogUserErrorDialogTitle": "Errore di Ryujinx ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "Si è verificato un errore durante il recupero delle informazioni dall'API.", - "DialogAmiiboApiConnectErrorMessage": "Impossibile connettersi al server Amiibo API. Il servizio potrebbe essere fuori uso o potresti dover verificare che la tua connessione internet sia online.", - "DialogProfileInvalidProfileErrorMessage": "Il profilo {0} è incompatibile con l'attuale sistema di configurazione input.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "Il profilo predefinito non può essere sovrascritto", - "DialogProfileDeleteProfileTitle": "Eliminazione profilo", - "DialogProfileDeleteProfileMessage": "Quest'azione è irreversibile, sei sicuro di voler continuare?", - "DialogWarning": "Avviso", - "DialogPPTCDeletionMessage": "Stai per accodare la rigenerazione della cache PPTC al prossimo avvio per:\n\n{0}\n\nSei sicuro di voler proseguire?", - "DialogPPTCDeletionErrorMessage": "Errore nell'eliminazione della cache PPTC a {0}: {1}", - "DialogShaderDeletionMessage": "Stai per eliminare la cache degli shader per:\n\n{0}\n\nSei sicuro di voler proseguire?", - "DialogShaderDeletionErrorMessage": "Errore nell'eliminazione della cache degli shader a {0}: {1}", - "DialogRyujinxErrorMessage": "Ryujinx ha incontrato un errore", - "DialogInvalidTitleIdErrorMessage": "Errore UI: Il gioco selezionato non ha un ID titolo valido", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Un firmware del sistema valido non è stato trovato in {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Installa firmware {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "La versione del sistema {0} sarà installata.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nQuesta sostituirà l'attuale versione di sistema {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nVuoi continuare?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installazione del firmware...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "La versione del sistema {0} è stata installata.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "E' stato trovato un file di chiavi invalido ' {0}", - "DialogKeysInstallerKeysInstallTitle": "Installa Chavi", - "DialogKeysInstallerKeysInstallMessage": "Un nuovo file di Chiavi sarà intallato.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nQuesto potrebbe sovrascrivere alcune delle Chiavi già installate.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nVuoi continuare?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installando le chiavi...", - "DialogKeysInstallerKeysInstallSuccessMessage": "Nuovo file di chiavi installato con successo.", - "DialogUserProfileDeletionWarningMessage": "Non ci sarebbero altri profili da aprire se il profilo selezionato viene cancellato", - "DialogUserProfileDeletionConfirmMessage": "Vuoi eliminare il profilo selezionato?", - "DialogUserProfileUnsavedChangesTitle": "Attenzione - Modifiche Non Salvate", - "DialogUserProfileUnsavedChangesMessage": "Hai apportato modifiche a questo profilo utente che non sono state salvate.", - "DialogUserProfileUnsavedChangesSubMessage": "Vuoi scartare le modifiche?", - "DialogControllerSettingsModifiedConfirmMessage": "Le attuali impostazioni del controller sono state aggiornate.", - "DialogControllerSettingsModifiedConfirmSubMessage": "Vuoi salvare?", - "DialogLoadFileErrorMessage": "{0}. Errore File: {1}", - "DialogModAlreadyExistsMessage": "La mod risulta già installata", - "DialogModInvalidMessage": "La cartella specificata non contiene nessuna mod!", - "DialogModDeleteNoParentMessage": "Eliminazione non riuscita: impossibile trovare la directory superiore per la mod \"{0}\"!", - "DialogDlcNoDlcErrorMessage": "Il file specificato non contiene un DLC per il titolo selezionato!", - "DialogPerformanceCheckLoggingEnabledMessage": "Hai abilitato il trace logging, che è progettato per essere usato solo dagli sviluppatori.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "Per prestazioni ottimali, si raccomanda di disabilitare il trace logging. Vuoi disabilitarlo adesso?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "Hai abilitato il dump degli shader, che è progettato per essere usato solo dagli sviluppatori.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Per prestazioni ottimali, si raccomanda di disabilitare il dump degli shader. Vuoi disabilitarlo adesso?", - "DialogLoadAppGameAlreadyLoadedMessage": "Un gioco è già stato caricato", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Ferma l'emulazione o chiudi l'emulatore prima di avviare un altro gioco.", - "DialogUpdateAddUpdateErrorMessage": "Il file specificato non contiene un aggiornamento per il titolo selezionato!", - "DialogSettingsBackendThreadingWarningTitle": "Avviso - Backend Threading", - "DialogSettingsBackendThreadingWarningMessage": "Ryujinx deve essere riavviato dopo aver cambiato questa opzione per applicarla completamente. A seconda della tua piattaforma, potrebbe essere necessario disabilitare manualmente il multithreading del driver quando usi quello di Ryujinx.", - "DialogModManagerDeletionWarningMessage": "Stai per eliminare la mod: {0}\n\nConfermi di voler procedere?", - "DialogModManagerDeletionAllWarningMessage": "Stai per eliminare tutte le mod per questo titolo.\n\nVuoi davvero procedere?", - "SettingsTabGraphicsFeaturesOptions": "Funzionalità", - "SettingsTabGraphicsBackendMultithreading": "Multithreading del backend grafico:", - "CommonAuto": "Automatico", - "CommonOff": "Disattivato", - "CommonOn": "Attivo", - "InputDialogYes": "Sì", - "InputDialogNo": "No", - "DialogProfileInvalidProfileNameErrorMessage": "Il nome del file contiene dei caratteri non validi. Riprova.", - "MenuBarOptionsPauseEmulation": "Metti in pausa", - "MenuBarOptionsResumeEmulation": "Riprendi", - "AboutUrlTooltipMessage": "Clicca per aprire il sito web di Ryujinx nel tuo browser predefinito.", - "AboutDisclaimerMessage": "Ryujinx non è affiliato con Nintendo™,\no i suoi partner, in alcun modo.", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) è usata\nnella nostra emulazione Amiibo.", - "AboutPatreonUrlTooltipMessage": "Clicca per aprire la pagina Patreon di Ryujinx nel tuo browser predefinito.", - "AboutGithubUrlTooltipMessage": "Clicca per aprire la pagina GitHub di Ryujinx nel tuo browser predefinito.", - "AboutDiscordUrlTooltipMessage": "Clicca per aprire un invito al server Discord di Ryujinx nel tuo browser predefinito.", - "AboutTwitterUrlTooltipMessage": "Clicca per aprire la pagina Twitter di Ryujinx nel tuo browser predefinito.", - "AboutRyujinxAboutTitle": "Informazioni:", - "AboutRyujinxAboutContent": "Ryujinx è un emulatore per la console Nintendo Switch™.\nSostienici su Patreon.\nRicevi tutte le ultime notizie sul nostro Twitter o su Discord.\nGli sviluppatori interessati a contribuire possono trovare più informazioni sul nostro GitHub o Discord.", - "AboutRyujinxMaintainersTitle": "Mantenuto da:", - "AboutRyujinxMaintainersContentTooltipMessage": "Clicca per aprire la pagina dei contributori nel tuo browser predefinito.", - "AboutRyujinxSupprtersTitle": "Supportato su Patreon da:", - "AmiiboSeriesLabel": "Serie Amiibo", - "AmiiboCharacterLabel": "Personaggio", - "AmiiboScanButtonLabel": "Scansiona", - "AmiiboOptionsShowAllLabel": "Mostra tutti gli amiibo", - "AmiiboOptionsUsRandomTagLabel": "Espediente: Usa un UUID del tag casuale", - "DlcManagerTableHeadingEnabledLabel": "Abilitato", - "DlcManagerTableHeadingTitleIdLabel": "ID Titolo", - "DlcManagerTableHeadingContainerPathLabel": "Percorso del contenitore", - "DlcManagerTableHeadingFullPathLabel": "Percorso completo", - "DlcManagerRemoveAllButton": "Rimuovi tutti", - "DlcManagerEnableAllButton": "Abilita tutto", - "DlcManagerDisableAllButton": "Disabilita tutto", - "ModManagerDeleteAllButton": "Elimina tutto", - "MenuBarOptionsChangeLanguage": "Cambia lingua", - "MenuBarShowFileTypes": "Mostra tipi di file", - "CommonSort": "Ordina", - "CommonShowNames": "Mostra nomi", - "CommonFavorite": "Preferito", - "OrderAscending": "Crescente", - "OrderDescending": "Decrescente", - "SettingsTabGraphicsFeatures": "Funzionalità e miglioramenti", - "ErrorWindowTitle": "Finestra di errore", - "ToggleDiscordTooltip": "Scegli se mostrare o meno Ryujinx nella tua attività su Discord", - "AddGameDirBoxTooltip": "Inserisci una cartella dei giochi per aggiungerla alla lista", - "AddGameDirTooltip": "Aggiungi una cartella dei giochi alla lista", - "RemoveGameDirTooltip": "Rimuovi la cartella dei giochi selezionata", - "CustomThemeCheckTooltip": "Attiva o disattiva temi personalizzati nella GUI", - "CustomThemePathTooltip": "Percorso al tema GUI personalizzato", - "CustomThemeBrowseTooltip": "Sfoglia per cercare un tema GUI personalizzato", - "RemoveAutoloadDirTooltip": "Rimuovi la directory di autoload selezionata", - "DockModeToggleTooltip": "La modalità TV fa sì che il sistema emulato si comporti come una Nintendo Switch posizionata nella sua base. Ciò migliora la qualità grafica nella maggior parte dei giochi. Al contrario, disabilitandola il sistema emulato si comporterà come una Nintendo Switch in modalità portatile, riducendo la qualità grafica.\n\nConfigura i controlli del giocatore 1 se intendi usare la modalità TV; configura i controlli della modalità portatile se intendi usare quest'ultima.\n\nNel dubbio, lascia l'opzione attiva.", - "DirectKeyboardTooltip": "Supporto per l'accesso diretto alla tastiera (HID). Fornisce ai giochi l'accesso alla tastiera come dispositivo di inserimento del testo.\n\nFunziona solo con i giochi che supportano nativamente l'utilizzo della tastiera su hardware Switch.\n\nNel dubbio, lascia l'opzione disattivata.", - "DirectMouseTooltip": "Supporto per l'accesso diretto al mouse (HID). Fornisce ai giochi l'accesso al mouse come dispositivo di puntamento.\n\nFunziona solo con i rari giochi che supportano nativamente l'utilizzo del mouse su hardware Switch.\n\nQuando questa opzione è attivata, il touchscreen potrebbe non funzionare.\n\nNel dubbio, lascia l'opzione disattivata.", - "RegionTooltip": "Cambia regione di sistema", - "LanguageTooltip": "Cambia lingua di sistema", - "TimezoneTooltip": "Cambia fuso orario di sistema", - "TimeTooltip": "Cambia data e ora di sistema", - "VSyncToggleTooltip": "Sincronizzazione verticale della console Emulata. Essenzialmente un limitatore di frame per la maggior parte dei giochi; disabilitarlo può far girare giochi a velocità più alta, allungare le schermate di caricamento o farle bloccare.\n\nPuò essere attivata in gioco con un tasto di scelta rapida (F1 per impostazione predefinita). Ti consigliamo di farlo se hai intenzione di disabilitarlo.\n\nLascia ON se non sei sicuro.", - "PptcToggleTooltip": "Salva le funzioni JIT tradotte in modo che non debbano essere tradotte tutte le volte che si avvia un determinato gioco.\n\nRiduce i fenomeni di stuttering e velocizza sensibilmente gli avvii successivi del gioco.\n\nNel dubbio, lascia l'opzione attiva.", - "AddAutoloadDirBoxTooltip": "Inserisci una directory di \"autoload\" da aggiungere alla lista", - "AddAutoloadDirTooltip": "Aggiungi una directory di \"autoload\" alla lista", - "LowPowerPptcToggleTooltip": "Carica il PPTC usando un terzo dei core.", - "FsIntegrityToggleTooltip": "Controlla la presenza di file corrotti quando si avvia un gioco. Se vengono rilevati dei file corrotti, verrà mostrato un errore di hash nel log.\n\nQuesta opzione non influisce sulle prestazioni ed è pensata per facilitare la risoluzione dei problemi.\n\nNel dubbio, lascia l'opzione attiva.", - "AudioBackendTooltip": "Cambia il backend usato per riprodurre l'audio.\n\nSDL2 è quello preferito, mentre OpenAL e SoundIO sono usati come ripiego. Dummy non riprodurrà alcun suono.\n\nNel dubbio, imposta l'opzione su SDL2.", - "MemoryManagerTooltip": "Cambia il modo in cui la memoria guest è mappata e vi si accede. Influisce notevolmente sulle prestazioni della CPU emulata.\n\nNel dubbio, imposta l'opzione su Host Unchecked.", - "MemoryManagerSoftwareTooltip": "Usa una software page table per la traduzione degli indirizzi. Massima precisione ma prestazioni più lente.", - "MemoryManagerHostTooltip": "Mappa direttamente la memoria nello spazio degli indirizzi dell'host. Compilazione ed esecuzione JIT molto più veloce.", - "MemoryManagerUnsafeTooltip": "Mappa direttamente la memoria, ma non maschera l'indirizzo all'interno dello spazio degli indirizzi guest prima dell'accesso. Più veloce, ma a costo della sicurezza. L'applicazione guest può accedere alla memoria da qualsiasi punto di Ryujinx, quindi esegui solo programmi di cui ti fidi con questa modalità.", - "UseHypervisorTooltip": "Usa Hypervisor invece di JIT. Migliora notevolmente le prestazioni quando disponibile, ma può essere instabile nel suo stato attuale.", - "DRamTooltip": "Utilizza un layout di memoria alternativo per imitare un'unità di sviluppo di Switch.\n\nQuesta opzione è utile soltanto per i pacchetti di texture ad alta risoluzione o per le mod che aumentano la risoluzione a 4K. NON migliora le prestazioni.\n\nNel dubbio, lascia l'opzione disattivata.", - "IgnoreMissingServicesTooltip": "Ignora i servizi non implementati del sistema operativo Horizon. Può aiutare ad aggirare gli arresti anomali che si verificano avviando alcuni giochi.\n\nNel dubbio, lascia l'opzione disattivata.", - "IgnoreAppletTooltip": "La finestra di dialogo esterna \"Controller Applet\" non apparirà se il gamepad viene disconnesso durante il gioco. Non ci sarà alcun prompt per chiudere la finestra di dialogo o impostare un nuovo controller. Una volta che il controller disconnesso in precedenza viene ricollegato, il gioco riprenderà automaticamente.", - "GraphicsBackendThreadingTooltip": "Esegue i comandi del backend grafico su un secondo thread.\n\nVelocizza la compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver grafici senza il supporto integrato al multithreading. Migliora leggermente le prestazioni sui driver che supportano il multithreading.\n\nNel dubbio, imposta l'opzione su Auto.", - "GalThreadingTooltip": "Esegue i comandi del backend grafico su un secondo thread.\n\nVelocizza la compilazione degli shader, riduce lo stuttering e migliora le prestazioni sui driver grafici senza il supporto integrato al multithreading. Migliora leggermente le prestazioni sui driver che supportano il multithreading.\n\nNel dubbio, imposta l'opzione su Auto.", - "ShaderCacheToggleTooltip": "Salva una cache degli shader su disco che riduce i fenomeni di stuttering nelle esecuzioni successive.\n\nNel dubbio, lascia l'opzione attiva.", - "ResolutionScaleTooltip": "Moltiplica la risoluzione di rendering del gioco.\n\nAlcuni giochi potrebbero non funzionare con questa opzione e sembrare pixelati anche quando la risoluzione è aumentata; per quei giochi, potrebbe essere necessario trovare mod che rimuovono l'anti-aliasing o che aumentano la risoluzione di rendering interna. Per quest'ultimo caso, probabilmente dovrai selezionare Nativo (1x).\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nTenete a mente che 4x è troppo per praticamente qualsiasi configurazione.", - "ResolutionScaleEntryTooltip": "Scala della risoluzione in virgola mobile, come 1,5. Le scale non integrali hanno maggiori probabilità di causare problemi o crash.", - "AnisotropyTooltip": "Livello del filtro anisotropico. Imposta su Auto per usare il valore richiesto dal gioco.", - "AspectRatioTooltip": "Proporzioni dello schermo applicate alla finestra di renderizzazione.\n\nCambialo solo se stai usando una mod di proporzioni per il tuo gioco, altrimenti la grafica verrà allungata.\n\nLasciare il 16:9 se incerto.", - "ShaderDumpPathTooltip": "Percorso di dump degli shader", - "FileLogTooltip": "Salva il log della console in un file su disco. Non influisce sulle prestazioni.", - "StubLogTooltip": "Stampa i messaggi di log relativi alle stub nella console. Non influisce sulle prestazioni.", - "InfoLogTooltip": "Stampa i messaggi di log informativi nella console. Non influisce sulle prestazioni.", - "WarnLogTooltip": "Stampa i messaggi di log relativi agli avvisi nella console. Non influisce sulle prestazioni.", - "ErrorLogTooltip": "Stampa i messaggi di log relativi agli errori nella console. Non influisce sulle prestazioni.", - "TraceLogTooltip": "Stampa i messaggi di log relativi al trace nella console. Non influisce sulle prestazioni.", - "GuestLogTooltip": "Stampa i messaggi di log del guest nella console. Non influisce sulle prestazioni.", - "FileAccessLogTooltip": "Stampa i messaggi di log relativi all'accesso ai file nella console.", - "FSAccessLogModeTooltip": "Attiva l'output dei log di accesso FS nella console. Le modalità possibili vanno da 0 a 3", - "DeveloperOptionTooltip": "Usa con attenzione", - "OpenGlLogLevel": "Richiede che i livelli di log appropriati siano abilitati", - "DebugLogTooltip": "Stampa i messaggi di log per il debug nella console.\n\nUsa questa opzione solo se specificatamente richiesto da un membro del team, dal momento che rende i log difficili da leggere e riduce le prestazioni dell'emulatore.", - "LoadApplicationFileTooltip": "Apri un file explorer per scegliere un file compatibile Switch da caricare", - "LoadApplicationFolderTooltip": "Apri un file explorer per scegliere un file compatibile Switch, applicazione sfusa da caricare", - "OpenRyujinxFolderTooltip": "Apri la cartella del filesystem di Ryujinx", - "OpenRyujinxLogsTooltip": "Apre la cartella dove vengono salvati i log", - "ExitTooltip": "Esci da Ryujinx", - "OpenSettingsTooltip": "Apri la finestra delle impostazioni", - "OpenProfileManagerTooltip": "Apri la finestra di gestione dei profili utente", - "StopEmulationTooltip": "Ferma l'emulazione del gioco attuale e torna alla selezione dei giochi", - "CheckUpdatesTooltip": "Controlla la presenza di aggiornamenti di Ryujinx", - "OpenAboutTooltip": "Apri la finestra delle informazioni", - "GridSize": "Dimensione griglia", - "GridSizeTooltip": "Cambia la dimensione dei riquadri della griglia", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Portoghese brasiliano", - "AboutRyujinxContributorsButtonHeader": "Mostra tutti i contributori", - "LoadDlcFromFolderTooltip": "Apri un esploratore file per scegliere una o più cartelle dalle quali caricare DLC in massa", - "LoadTitleUpdatesFromFolderTooltip": "Apri un esploratore file per scegliere una o più cartelle dalle quali caricare aggiornamenti in massa", - "SettingsTabSystemAudioVolume": "Volume: ", - "AudioVolumeTooltip": "Cambia volume audio", - "SettingsTabSystemEnableInternetAccess": "Attiva l'accesso a Internet da parte del guest/Modalità LAN", - "EnableInternetAccessTooltip": "Consente all'applicazione emulata di connettersi a Internet.\n\nI giochi che dispongono di una modalità LAN possono connettersi tra di loro quando questa opzione è abilitata e sono connessi alla stessa rete, comprese le console reali.\n\nQuesta opzione NON consente la connessione ai server di Nintendo. Potrebbe causare arresti anomali in alcuni giochi che provano a connettersi a Internet.\n\nNel dubbio, lascia l'opzione disattivata.", - "GameListContextMenuManageCheatToolTip": "Gestisci trucchi", - "GameListContextMenuManageCheat": "Gestisci trucchi", - "GameListContextMenuManageModToolTip": "Gestisci mod", - "GameListContextMenuManageMod": "Gestisci mod", - "ControllerSettingsStickRange": "Raggio:", - "DialogStopEmulationTitle": "Ryujinx - Ferma emulazione", - "DialogStopEmulationMessage": "Sei sicuro di voler fermare l'emulazione?", - "SettingsTabCpu": "CPU", - "SettingsTabAudio": "Audio", - "SettingsTabNetwork": "Rete", - "SettingsTabNetworkConnection": "Connessione di rete", - "SettingsTabCpuCache": "Cache CPU", - "SettingsTabCpuMemory": "Modalità CPU", - "DialogUpdaterFlatpakNotSupportedMessage": "Aggiorna Ryujinx tramite FlatHub.", - "UpdaterDisabledWarningTitle": "Updater disabilitato!", - "ControllerSettingsRotate90": "Ruota in senso orario di 90°", - "IconSize": "Dimensioni icone", - "IconSizeTooltip": "Cambia le dimensioni delle icone dei giochi", - "MenuBarOptionsShowConsole": "Mostra console", - "ShaderCachePurgeError": "Errore nell'eliminazione della cache degli shader a {0}: {1}", - "UserErrorNoKeys": "Chiavi non trovate", - "UserErrorNoFirmware": "Firmware non trovato", - "UserErrorFirmwareParsingFailed": "Errori di analisi del firmware", - "UserErrorApplicationNotFound": "Applicazione non trovata", - "UserErrorUnknown": "Errore sconosciuto", - "UserErrorUndefined": "Errore non definito", - "UserErrorNoKeysDescription": "Ryujinx non è riuscito a trovare il file 'prod.keys'", - "UserErrorNoFirmwareDescription": "Ryujinx non è riuscito a trovare alcun firmware installato", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx non è riuscito ad analizzare il firmware. Questo di solito è causato da chiavi non aggiornate.", - "UserErrorApplicationNotFoundDescription": "Ryujinx non è riuscito a trovare un'applicazione valida nel percorso specificato.", - "UserErrorUnknownDescription": "Si è verificato un errore sconosciuto!", - "UserErrorUndefinedDescription": "Si è verificato un errore sconosciuto! Ciò non dovrebbe accadere, contatta uno sviluppatore!", - "OpenSetupGuideMessage": "Apri la guida all'installazione", - "NoUpdate": "Nessun aggiornamento", - "TitleUpdateVersionLabel": "Versione {0}", - "TitleBundledUpdateVersionLabel": "In bundle: Versione {0}", - "TitleBundledDlcLabel": "In bundle:", - "TitleXCIStatusPartialLabel": "Parziale", - "TitleXCIStatusTrimmableLabel": "Non Trimmato", - "TitleXCIStatusUntrimmableLabel": "Trimmato", - "TitleXCIStatusFailedLabel": "(Fallito)", - "TitleXCICanSaveLabel": "Salva {0:n0} Mb", - "TitleXCISavingLabel": "Salva {0:n0} Mb", - "RyujinxInfo": "Ryujinx - Informazioni", - "RyujinxConfirm": "Ryujinx - Conferma", - "FileDialogAllTypes": "Tutti i tipi", - "Never": "Mai", - "SwkbdMinCharacters": "Non può avere meno di {0} caratteri", - "SwkbdMinRangeCharacters": "Può avere da {0} a {1} caratteri", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Tastiera software", - "SoftwareKeyboardModeNumeric": "Deve essere solo 0-9 o '.'", - "SoftwareKeyboardModeAlphabet": "Deve essere solo caratteri non CJK", - "SoftwareKeyboardModeASCII": "Deve essere solo testo ASCII", - "ControllerAppletControllers": "Controller supportati:", - "ControllerAppletPlayers": "Giocatori:", - "ControllerAppletDescription": "La configurazione corrente non è valida. Aprire le impostazioni e riconfigurare gli input.", - "ControllerAppletDocked": "Modalità TV attivata. Gli input della modalità portatile dovrebbero essere disabilitati.", - "UpdaterRenaming": "Rinominazione dei vecchi files...", - "UpdaterRenameFailed": "Non è stato possibile rinominare il file: {0}", - "UpdaterAddingFiles": "Aggiunta dei nuovi file...", - "UpdaterExtracting": "Estrazione dell'aggiornamento...", - "UpdaterDownloading": "Download dell'aggiornamento...", - "Docked": "TV", - "Handheld": "Portatile", - "ConnectionError": "Errore di connessione.", - "AboutPageDeveloperListMore": "{0} e altri ancora...", - "ApiError": "Errore dell'API.", - "LoadingHeading": "Caricamento di {0}", - "CompilingPPTC": "Compilazione PPTC", - "CompilingShaders": "Compilazione degli shader", - "AllKeyboards": "Tutte le tastiere", - "OpenFileDialogTitle": "Seleziona un file supportato da aprire", - "OpenFolderDialogTitle": "Seleziona una cartella con un gioco estratto", - "AllSupportedFormats": "Tutti i formati supportati", - "RyujinxUpdater": "Aggiornamento di Ryujinx", - "SettingsTabHotkeys": "Tasti di scelta rapida", - "SettingsTabHotkeysHotkeys": "Tasti di scelta rapida", - "SettingsTabHotkeysToggleVsyncHotkey": "Attiva/disattiva VSync:", - "SettingsTabHotkeysScreenshotHotkey": "Cattura uno screenshot:", - "SettingsTabHotkeysShowUiHotkey": "Mostra l'interfaccia:", - "SettingsTabHotkeysPauseHotkey": "Metti in pausa:", - "SettingsTabHotkeysToggleMuteHotkey": "Disattiva l'audio:", - "ControllerMotionTitle": "Impostazioni dei sensori di movimento", - "ControllerRumbleTitle": "Impostazioni di vibrazione", - "SettingsSelectThemeFileDialogTitle": "Seleziona file del tema", - "SettingsXamlThemeFile": "File del tema xaml", - "AvatarWindowTitle": "Gestisci account - Avatar", - "Amiibo": "Amiibo", - "Unknown": "Sconosciuto", - "Usage": "Utilizzo", - "Writable": "Scrivibile", - "SelectDlcDialogTitle": "Seleziona file dei DLC", - "SelectUpdateDialogTitle": "Seleziona file di aggiornamento", - "SelectModDialogTitle": "Seleziona cartella delle mod", - "TrimXCIFileDialogTitle": "Controlla e Trimma i file XCI ", - "TrimXCIFileDialogPrimaryText": "Questa funzionalita controllerà prima lo spazio libero e poi trimmerà il file XCI per liberare dello spazio.", - "TrimXCIFileDialogSecondaryText": "Dimensioni Attuali File: {0:n} MB\nDimensioni Dati Gioco: {1:n} MB\nRisparimio Spazio Disco: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "Il file XCI non deve essere trimmato. Controlla i log per ulteriori dettagli", - "TrimXCIFileNoUntrimPossible": "Il file XCI non può essere untrimmato. Controlla i log per ulteriori dettagli", - "TrimXCIFileReadOnlyFileCannotFix": "Il file XCI è in sola lettura e non può essere reso Scrivibile. Controlla i log per ulteriori dettagli", - "TrimXCIFileFileSizeChanged": "Il file XCI ha cambiato dimensioni da quando è stato scansionato. Controlla che il file non stia venendo scritto da qualche altro programma e poi riprova.", - "TrimXCIFileFreeSpaceCheckFailed": "Il file XCI ha dati nello spazio libero, non è sicuro effettuare il trimming", - "TrimXCIFileInvalidXCIFile": "Il file XCI contiene dati invlidi. Controlla i log per ulteriori dettagli", - "TrimXCIFileFileIOWriteError": "Il file XCI non può essere aperto per essere scritto. Controlla i log per ulteriori dettagli", - "TrimXCIFileFailedPrimaryText": "Trimming del file XCI fallito", - "TrimXCIFileCancelled": "Operazione Cancellata", - "TrimXCIFileFileUndertermined": "Nessuna operazione è stata effettuata", - "UserProfileWindowTitle": "Gestione profili utente", - "CheatWindowTitle": "Gestione trucchi", - "DlcWindowTitle": "Gestisci DLC per {0} ({1})", - "ModWindowTitle": "Gestisci mod per {0} ({1})", - "UpdateWindowTitle": "Gestione aggiornamenti", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} di {1} Titolo(i) Selezionati", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Titolo(i) Selezionati ({2} visualizzato)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Titolo(i)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Titolo(i)...", - "XCITrimmerTitleStatusFailed": "Fallito", - "XCITrimmerPotentialSavings": "Potenziali Salvataggi", - "XCITrimmerActualSavings": "Effettivi Salvataggi", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Seleziona Visualizzati", - "XCITrimmerDeselectDisplayed": "Deselziona Visualizzati", - "XCITrimmerSortName": "Titolo", - "XCITrimmerSortSaved": "Salvataggio Spazio", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} aggiornamento/i aggiunto/i", - "UpdateWindowBundledContentNotice": "Gli aggiornamenti inclusi non possono essere eliminati, ma solo disattivati", - "CheatWindowHeading": "Trucchi disponibili per {0} [{1}]", - "BuildId": "ID Build", - "DlcWindowBundledContentNotice": "i DLC \"impacchettati\" non possono essere rimossi, ma solo disabilitati.", - "DlcWindowHeading": "DLC disponibili per {0} [{1}]", - "DlcWindowDlcAddedMessage": "{0} nuovo/i contenuto/i scaricabile/i aggiunto/i", - "AutoloadDlcAddedMessage": "{0} contenuto/i scaricabile/i aggiunto/i", - "AutoloadDlcRemovedMessage": "{0} contenuto/i scaricabile/i mancante/i rimosso/i", - "AutoloadUpdateAddedMessage": "{0} aggiornamento/i aggiunto/i", - "AutoloadUpdateRemovedMessage": "{0} aggiornamento/i mancante/i rimosso/i", - "ModWindowHeading": "{0} mod", - "UserProfilesEditProfile": "Modifica selezionati", - "Continue": "Continua", - "Cancel": "Annulla", - "Save": "Salva", - "Discard": "Scarta", - "Paused": "In pausa", - "UserProfilesSetProfileImage": "Imposta immagine profilo", - "UserProfileEmptyNameError": "Il nome è obbligatorio", - "UserProfileNoImageError": "Dev'essere impostata un'immagine profilo", - "GameUpdateWindowHeading": "Gestisci aggiornamenti per {0} ({1})", - "SettingsTabHotkeysResScaleUpHotkey": "Aumenta la risoluzione:", - "SettingsTabHotkeysResScaleDownHotkey": "Riduci la risoluzione:", - "UserProfilesName": "Nome:", - "UserProfilesUserId": "ID utente:", - "SettingsTabGraphicsBackend": "Backend grafico", - "SettingsTabGraphicsBackendTooltip": "Seleziona il backend grafico che verrà utilizzato nell'emulatore.\n\nVulkan è nel complesso migliore per tutte le schede grafiche moderne, a condizione che i relativi driver siano aggiornati. Vulkan dispone anche di una compilazione degli shader più veloce (con minore stuttering) su tutte le marche di GPU.\n\nOpenGL può ottenere risultati migliori su vecchie GPU Nvidia, su vecchie GPU AMD su Linux, o su GPU con poca VRAM, anche se lo stuttering dovuto alla compilazione degli shader sarà maggiore.\n\nNel dubbio, scegli Vulkan. Seleziona OpenGL se la GPU non supporta Vulkan nemmeno con i driver grafici più recenti.", - "SettingsEnableTextureRecompression": "Attiva la ricompressione delle texture", - "SettingsEnableTextureRecompressionTooltip": "Comprime le texture ASTC per ridurre l'utilizzo di VRAM.\n\nI giochi che utilizzano questo formato di texture includono Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder e The Legend of Zelda: Tears of the Kingdom.\n\nLe schede grafiche con 4GiB o meno di VRAM probabilmente si bloccheranno ad un certo punto durante l'esecuzione di questi giochi.\n\nAttiva questa opzione solo se sei a corto di VRAM nei giochi sopra menzionati. Nel dubbio, lascia l'opzione disattivata.", - "SettingsTabGraphicsPreferredGpu": "GPU preferita", - "SettingsTabGraphicsPreferredGpuTooltip": "Seleziona la scheda grafica che verrà usata con la backend grafica Vulkan.\n\nNon influenza la GPU che userà OpenGL.\n\nImposta la GPU contrassegnata come \"dGPU\" se non sei sicuro. Se non ce n'è una, lascia intatta quest'impostazione.", - "SettingsAppRequiredRestartMessage": "È richiesto un riavvio di Ryujinx", - "SettingsGpuBackendRestartMessage": "Le impostazioni della backend grafica o della GPU sono state modificate. Questo richiederà un riavvio perché le modifiche siano applicate", - "SettingsGpuBackendRestartSubMessage": "Vuoi riavviare ora?", - "RyujinxUpdaterMessage": "Vuoi aggiornare Ryujinx all'ultima versione?", - "SettingsTabHotkeysVolumeUpHotkey": "Alza il volume:", - "SettingsTabHotkeysVolumeDownHotkey": "Abbassa il volume:", - "SettingsEnableMacroHLE": "Attiva HLE macro", - "SettingsEnableMacroHLETooltip": "Emulazione di alto livello del codice macro della GPU.\n\nMigliora le prestazioni, ma può causare anomalie grafiche in alcuni giochi.\n\nNel dubbio, lascia l'opzione attiva.", - "SettingsEnableColorSpacePassthrough": "Passthrough dello spazio dei colori", - "SettingsEnableColorSpacePassthroughTooltip": "Indica al backend Vulkan di passare le informazioni sul colore senza specificare uno spazio dei colori. Per gli utenti con schermi ad ampia gamma, ciò può rendere i colori più vivaci, sacrificando la correttezza del colore.", - "VolumeShort": "Vol", - "UserProfilesManageSaves": "Gestisci i salvataggi", - "DeleteUserSave": "Vuoi eliminare il salvataggio utente per questo gioco?", - "IrreversibleActionNote": "Questa azione non è reversibile.", - "SaveManagerHeading": "Gestisci salvataggi per {0} ({1})", - "SaveManagerTitle": "Gestione salvataggi", - "Name": "Nome", - "Size": "Dimensione", - "Search": "Cerca", - "UserProfilesRecoverLostAccounts": "Recupera account persi", - "Recover": "Recupera", - "UserProfilesRecoverHeading": "Sono stati trovati dei salvataggi per i seguenti account", - "UserProfilesRecoverEmptyList": "Nessun profilo da recuperare", - "GraphicsAATooltip": "Applica anti-aliasing al rendering del gioco.\n\nFXAA sfocerà la maggior parte dell'immagine, mentre SMAA tenterà di trovare bordi frastagliati e lisciarli.\n\nNon si consiglia di usarlo in combinazione con il filtro di scala FSR.\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nLasciare su Nessuno se incerto.", - "GraphicsAALabel": "Anti-Aliasing:", - "GraphicsScalingFilterLabel": "Filtro di scala:", - "GraphicsScalingFilterTooltip": "Scegli il filtro di scaling che verrà applicato quando si utilizza o scaling di risoluzione.\n\nBilineare funziona bene per i giochi 3D ed è un'opzione predefinita affidabile.\n\nNearest è consigliato per i giochi in pixel art.\n\nFSR 1.0 è solo un filtro di nitidezza, non raccomandato per l'uso con FXAA o SMAA.\n\nQuesta opzione può essere modificata mentre un gioco è in esecuzione facendo clic su \"Applica\" qui sotto; puoi semplicemente spostare la finestra delle impostazioni da parte e sperimentare fino a quando non trovi il tuo look preferito per un gioco.\n\nLasciare su Bilineare se incerto.", - "GraphicsScalingFilterBilinear": "Bilineare", - "GraphicsScalingFilterNearest": "Nearest", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "Livello", - "GraphicsScalingFilterLevelTooltip": "Imposta il livello di nitidezza di FSR 1.0. Valori più alti comportano una maggiore nitidezza.", - "SmaaLow": "SMAA Basso", - "SmaaMedium": "SMAA Medio", - "SmaaHigh": "SMAA Alto", - "SmaaUltra": "SMAA Ultra", - "UserEditorTitle": "Modificare L'Utente", - "UserEditorTitleCreate": "Crea Un Utente", - "SettingsTabNetworkInterface": "Interfaccia di rete:", - "NetworkInterfaceTooltip": "L'interfaccia di rete utilizzata per le funzionalità LAN/LDN.\n\nIn combinazione con una VPN o XLink Kai e un gioco che supporta la modalità LAN, questa opzione può essere usata per simulare la connessione alla stessa rete attraverso Internet.\n\nNel dubbio, lascia l'opzione su Predefinito.", - "NetworkInterfaceDefault": "Predefinito", - "PackagingShaders": "Salvataggio degli shader", - "AboutChangelogButton": "Visualizza changelog su GitHub", - "AboutChangelogButtonTooltipMessage": "Clicca per aprire il changelog per questa versione nel tuo browser predefinito.", - "SettingsTabNetworkMultiplayer": "Multigiocatore", - "MultiplayerMode": "Modalità:", - "MultiplayerModeTooltip": "Cambia la modalità multigiocatore LDN.\n\nLdnMitm modificherà la funzionalità locale wireless/local play nei giochi per funzionare come se fosse in modalità LAN, consentendo connessioni locali sulla stessa rete con altre istanze di Ryujinx e console Nintendo Switch modificate che hanno il modulo ldn_mitm installato.\n\nLa modalità multigiocatore richiede che tutti i giocatori usino la stessa versione del gioco (es. Super Smash Bros. Ultimate v13.0.1 non può connettersi con la v13.0.0).\n\nNel dubbio, lascia l'opzione su Disabilitato.", - "MultiplayerModeDisabled": "Disabilitato", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/ja_JP.json b/src/Ryujinx/Assets/Locales/ja_JP.json deleted file mode 100644 index ffa768c13..000000000 --- a/src/Ryujinx/Assets/Locales/ja_JP.json +++ /dev/null @@ -1,879 +0,0 @@ -{ - "Language": "日本語", - "MenuBarFileOpenApplet": "アプレットを開く", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "スタンドアロンモードで Mii エディタアプレットを開きます", - "SettingsTabInputDirectMouseAccess": "マウス直接アクセス", - "SettingsTabSystemMemoryManagerMode": "メモリ管理モード:", - "SettingsTabSystemMemoryManagerModeSoftware": "ソフトウェア", - "SettingsTabSystemMemoryManagerModeHost": "ホスト (高速)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "ホスト, チェックなし (最高速, 安全でない)", - "SettingsTabSystemUseHypervisor": "ハイパーバイザーを使用", - "MenuBarFile": "ファイル(_F)", - "MenuBarFileOpenFromFile": "ファイルからアプリケーションをロード(_L)", - "MenuBarFileOpenFromFileError": "No applications found in selected file.", - "MenuBarFileOpenUnpacked": "展開されたゲームをロード", - "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder", - "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder", - "MenuBarFileOpenEmuFolder": "Ryujinx フォルダを開く", - "MenuBarFileOpenLogsFolder": "ログフォルダを開く", - "MenuBarFileExit": "終了(_E)", - "MenuBarOptions": "オプション(_O)", - "MenuBarOptionsToggleFullscreen": "全画面切り替え", - "MenuBarOptionsStartGamesInFullscreen": "全画面モードでゲームを開始", - "MenuBarOptionsStopEmulation": "エミュレーションを中止", - "MenuBarOptionsSettings": "設定(_S)", - "MenuBarOptionsManageUserProfiles": "ユーザプロファイルを管理(_M)", - "MenuBarActions": "アクション(_A)", - "MenuBarOptionsSimulateWakeUpMessage": "スリープ復帰メッセージをシミュレート", - "MenuBarActionsScanAmiibo": "Amiibo をスキャン", - "MenuBarTools": "ツール(_T)", - "MenuBarToolsInstallFirmware": "ファームウェアをインストール", - "MenuBarFileToolsInstallFirmwareFromFile": "XCI または ZIP からファームウェアをインストール", - "MenuBarFileToolsInstallFirmwareFromDirectory": "ディレクトリからファームウェアをインストール", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "ファイル形式を管理", - "MenuBarToolsInstallFileTypes": "ファイル形式をインストール", - "MenuBarToolsUninstallFileTypes": "ファイル形式をアンインストール", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_View", - "MenuBarViewWindow": "Window Size", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "ヘルプ(_H)", - "MenuBarHelpCheckForUpdates": "アップデートを確認", - "MenuBarHelpAbout": "Ryujinx について", - "MenuSearch": "検索...", - "GameListHeaderFavorite": "お気に入り", - "GameListHeaderIcon": "アイコン", - "GameListHeaderApplication": "名称", - "GameListHeaderDeveloper": "開発元", - "GameListHeaderVersion": "バージョン", - "GameListHeaderTimePlayed": "プレイ時間", - "GameListHeaderLastPlayed": "最終プレイ日時", - "GameListHeaderFileExtension": "ファイル拡張子", - "GameListHeaderFileSize": "ファイルサイズ", - "GameListHeaderPath": "パス", - "GameListContextMenuOpenUserSaveDirectory": "セーブディレクトリを開く", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "アプリケーションのユーザセーブデータを格納するディレクトリを開きます", - "GameListContextMenuOpenDeviceSaveDirectory": "デバイスディレクトリを開く", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "アプリケーションのデバイスセーブデータを格納するディレクトリを開きます", - "GameListContextMenuOpenBcatSaveDirectory": "BCATディレクトリを開く", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "アプリケーションの BCAT セーブデータを格納するディレクトリを開きます", - "GameListContextMenuManageTitleUpdates": "アップデートを管理", - "GameListContextMenuManageTitleUpdatesToolTip": "タイトルのアップデート管理ウインドウを開きます", - "GameListContextMenuManageDlc": "DLCを管理", - "GameListContextMenuManageDlcToolTip": "DLC管理ウインドウを開きます", - "GameListContextMenuCacheManagement": "キャッシュ管理", - "GameListContextMenuCacheManagementPurgePptc": "PPTC を再構築", - "GameListContextMenuCacheManagementPurgePptcToolTip": "次回のゲーム起動時に PPTC を再構築します", - "GameListContextMenuCacheManagementPurgeShaderCache": "シェーダーキャッシュを破棄", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "アプリケーションのシェーダーキャッシュを破棄します", - "GameListContextMenuCacheManagementOpenPptcDirectory": "PPTC ディレクトリを開く", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "アプリケーションの PPTC キャッシュを格納するディレクトリを開きます", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "シェーダーキャッシュディレクトリを開く", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "アプリケーションのシェーダーキャッシュを格納するディレクトリを開きます", - "GameListContextMenuExtractData": "データを展開", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "現在のアプリケーション設定(アップデート含む)から ExeFS セクションを展開します", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "現在のアプリケーション設定(アップデート含む)から RomFS セクションを展開します", - "GameListContextMenuExtractDataLogo": "ロゴ", - "GameListContextMenuExtractDataLogoToolTip": "現在のアプリケーション設定(アップデート含む)からロゴセクションを展開します", - "GameListContextMenuCreateShortcut": "アプリケーションのショートカットを作成", - "GameListContextMenuCreateShortcutToolTip": "選択したアプリケーションを起動するデスクトップショートカットを作成します", - "GameListContextMenuCreateShortcutToolTipMacOS": "選択したアプリケーションを起動する ショートカットを macOS の Applications フォルダに作成します", - "GameListContextMenuOpenModsDirectory": "Modディレクトリを開く", - "GameListContextMenuOpenModsDirectoryToolTip": "アプリケーションの Mod データを格納するディレクトリを開きます", - "GameListContextMenuOpenSdModsDirectory": "Atmosphere Mods ディレクトリを開く", - "GameListContextMenuOpenSdModsDirectoryToolTip": "アプリケーションの Mod データを格納する SD カードの Atmosphere ディレクトリを開きます. 実際のハードウェア用に作成された Mod データに有用です.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} ゲーム", - "StatusBarSystemVersion": "システムバージョン: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "メモリマッピング上限値が小さすぎます", - "LinuxVmMaxMapCountDialogTextPrimary": "vm.max_map_count の値を {0}に増やしますか?", - "LinuxVmMaxMapCountDialogTextSecondary": "ゲームによっては, 現在許可されているサイズより大きなメモリマッピングを作成しようとすることがあります. この制限を超えると, Ryjinx はすぐにクラッシュします.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "はい, 次回再起動まで", - "LinuxVmMaxMapCountDialogButtonPersistent": "はい, 恒久的に", - "LinuxVmMaxMapCountWarningTextPrimary": "メモリマッピングの最大量が推奨値よりも小さいです.", - "LinuxVmMaxMapCountWarningTextSecondary": "vm.max_map_count の現在値 {0} は {1} よりも小さいです. ゲームによっては現在許可されている値よりも大きなメモリマッピングを作成しようとする場合があります. 上限を越えた場合, Ryujinx はクラッシュします.", - "Settings": "設定", - "SettingsTabGeneral": "ユーザインタフェース", - "SettingsTabGeneralGeneral": "一般", - "SettingsTabGeneralEnableDiscordRichPresence": "Discord リッチプレゼンスを有効にする", - "SettingsTabGeneralCheckUpdatesOnLaunch": "起動時にアップデートを確認する", - "SettingsTabGeneralShowConfirmExitDialog": "\"終了を確認\" ダイアログを表示する", - "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "マウスカーソルを非表示", - "SettingsTabGeneralHideCursorNever": "決して", - "SettingsTabGeneralHideCursorOnIdle": "アイドル時", - "SettingsTabGeneralHideCursorAlways": "常時", - "SettingsTabGeneralGameDirectories": "ゲームディレクトリ", - "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "追加", - "SettingsTabGeneralRemove": "削除", - "SettingsTabSystem": "システム", - "SettingsTabSystemCore": "コア", - "SettingsTabSystemSystemRegion": "地域:", - "SettingsTabSystemSystemRegionJapan": "日本", - "SettingsTabSystemSystemRegionUSA": "アメリカ", - "SettingsTabSystemSystemRegionEurope": "ヨーロッパ", - "SettingsTabSystemSystemRegionAustralia": "オーストラリア", - "SettingsTabSystemSystemRegionChina": "中国", - "SettingsTabSystemSystemRegionKorea": "韓国", - "SettingsTabSystemSystemRegionTaiwan": "台湾", - "SettingsTabSystemSystemLanguage": "言語:", - "SettingsTabSystemSystemLanguageJapanese": "日本語", - "SettingsTabSystemSystemLanguageAmericanEnglish": "英語(アメリカ)", - "SettingsTabSystemSystemLanguageFrench": "フランス語", - "SettingsTabSystemSystemLanguageGerman": "ドイツ語", - "SettingsTabSystemSystemLanguageItalian": "イタリア語", - "SettingsTabSystemSystemLanguageSpanish": "スペイン語", - "SettingsTabSystemSystemLanguageChinese": "中国語", - "SettingsTabSystemSystemLanguageKorean": "韓国語", - "SettingsTabSystemSystemLanguageDutch": "オランダ語", - "SettingsTabSystemSystemLanguagePortuguese": "ポルトガル語", - "SettingsTabSystemSystemLanguageRussian": "ロシア語", - "SettingsTabSystemSystemLanguageTaiwanese": "台湾語", - "SettingsTabSystemSystemLanguageBritishEnglish": "英語(イギリス)", - "SettingsTabSystemSystemLanguageCanadianFrench": "フランス語(カナダ)", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "スペイン語(ラテンアメリカ)", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "中国語", - "SettingsTabSystemSystemLanguageTraditionalChinese": "台湾語", - "SettingsTabSystemSystemTimeZone": "タイムゾーン:", - "SettingsTabSystemSystemTime": "時刻:", - "SettingsTabSystemEnableVsync": "VSync", - "SettingsTabSystemEnablePptc": "PPTC (Profiled Persistent Translation Cache)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "ファイルシステム整合性チェック", - "SettingsTabSystemAudioBackend": "音声バックエンド:", - "SettingsTabSystemAudioBackendDummy": "ダミー", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "ハック", - "SettingsTabSystemHacksNote": " (挙動が不安定になる可能性があります)", - "SettingsTabSystemDramSize": "DRAMサイズ:", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "未実装サービスを無視する", - "SettingsTabSystemIgnoreApplet": "アプレットを無視する", - "SettingsTabGraphics": "グラフィックス", - "SettingsTabGraphicsAPI": "グラフィックスAPI", - "SettingsTabGraphicsEnableShaderCache": "シェーダーキャッシュを有効にする", - "SettingsTabGraphicsAnisotropicFiltering": "異方性フィルタリング:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "自動", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "解像度:", - "SettingsTabGraphicsResolutionScaleCustom": "カスタム (非推奨)", - "SettingsTabGraphicsResolutionScaleNative": "ネイティブ (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (非推奨)", - "SettingsTabGraphicsAspectRatio": "アスペクト比:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "ウインドウサイズに合わせる", - "SettingsTabGraphicsDeveloperOptions": "開発者向けオプション", - "SettingsTabGraphicsShaderDumpPath": "グラフィックス シェーダー ダンプパス:", - "SettingsTabLogging": "ロギング", - "SettingsTabLoggingLogging": "ロギング", - "SettingsTabLoggingEnableLoggingToFile": "ファイルへのロギングを有効にする", - "SettingsTabLoggingEnableStubLogs": "Stub ログを有効にする", - "SettingsTabLoggingEnableInfoLogs": "Info ログを有効にする", - "SettingsTabLoggingEnableWarningLogs": "Warning ログを有効にする", - "SettingsTabLoggingEnableErrorLogs": "Error ログを有効にする", - "SettingsTabLoggingEnableTraceLogs": "Trace ログを有効にする", - "SettingsTabLoggingEnableGuestLogs": "Guest ログを有効にする", - "SettingsTabLoggingEnableFsAccessLogs": "Fs アクセスログを有効にする", - "SettingsTabLoggingFsGlobalAccessLogMode": "Fs グローバルアクセスログモード:", - "SettingsTabLoggingDeveloperOptions": "開発者オプション", - "SettingsTabLoggingDeveloperOptionsNote": "警告: パフォーマンスを低下させます", - "SettingsTabLoggingGraphicsBackendLogLevel": "グラフィックスバックエンド ログレベル:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "なし", - "SettingsTabLoggingGraphicsBackendLogLevelError": "エラー", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "パフォーマンス低下", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "すべて", - "SettingsTabLoggingEnableDebugLogs": "デバッグログを有効にする", - "SettingsTabInput": "入力", - "SettingsTabInputEnableDockedMode": "ドッキングモード", - "SettingsTabInputDirectKeyboardAccess": "キーボード直接アクセス", - "SettingsButtonSave": "セーブ", - "SettingsButtonClose": "閉じる", - "SettingsButtonOk": "OK", - "SettingsButtonCancel": "キャンセル", - "SettingsButtonApply": "適用", - "ControllerSettingsPlayer": "プレイヤー", - "ControllerSettingsPlayer1": "プレイヤー 1", - "ControllerSettingsPlayer2": "プレイヤー 2", - "ControllerSettingsPlayer3": "プレイヤー 3", - "ControllerSettingsPlayer4": "プレイヤー 4", - "ControllerSettingsPlayer5": "プレイヤー 5", - "ControllerSettingsPlayer6": "プレイヤー 6", - "ControllerSettingsPlayer7": "プレイヤー 7", - "ControllerSettingsPlayer8": "プレイヤー 8", - "ControllerSettingsHandheld": "携帯", - "ControllerSettingsInputDevice": "入力デバイス", - "ControllerSettingsRefresh": "更新", - "ControllerSettingsDeviceDisabled": "無効", - "ControllerSettingsControllerType": "コントローラ種別", - "ControllerSettingsControllerTypeHandheld": "携帯", - "ControllerSettingsControllerTypeProController": "Pro コントローラ", - "ControllerSettingsControllerTypeJoyConPair": "JoyCon ペア", - "ControllerSettingsControllerTypeJoyConLeft": "JoyCon 左", - "ControllerSettingsControllerTypeJoyConRight": "JoyCon 右", - "ControllerSettingsProfile": "プロファイル", - "ControllerSettingsProfileDefault": "デフォルト", - "ControllerSettingsLoad": "ロード", - "ControllerSettingsAdd": "追加", - "ControllerSettingsRemove": "削除", - "ControllerSettingsButtons": "ボタン", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "十字キー", - "ControllerSettingsDPadUp": "上", - "ControllerSettingsDPadDown": "下", - "ControllerSettingsDPadLeft": "左", - "ControllerSettingsDPadRight": "右", - "ControllerSettingsStickButton": "ボタン", - "ControllerSettingsStickUp": "上", - "ControllerSettingsStickDown": "下", - "ControllerSettingsStickLeft": "左", - "ControllerSettingsStickRight": "右", - "ControllerSettingsStickStick": "スティック", - "ControllerSettingsStickInvertXAxis": "X軸を反転", - "ControllerSettingsStickInvertYAxis": "Y軸を反転", - "ControllerSettingsStickDeadzone": "遊び:", - "ControllerSettingsLStick": "左スティック", - "ControllerSettingsRStick": "右スティック", - "ControllerSettingsTriggersLeft": "左トリガー", - "ControllerSettingsTriggersRight": "右トリガー", - "ControllerSettingsTriggersButtonsLeft": "左トリガーボタン", - "ControllerSettingsTriggersButtonsRight": "右トリガーボタン", - "ControllerSettingsTriggers": "トリガー", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "左ボタン", - "ControllerSettingsExtraButtonsRight": "右ボタン", - "ControllerSettingsMisc": "その他", - "ControllerSettingsTriggerThreshold": "トリガーしきい値:", - "ControllerSettingsMotion": "モーション", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "CemuHook 互換モーションを使用", - "ControllerSettingsMotionControllerSlot": "コントローラ スロット:", - "ControllerSettingsMotionMirrorInput": "入力反転", - "ControllerSettingsMotionRightJoyConSlot": "JoyCon 右 スロット:", - "ControllerSettingsMotionServerHost": "サーバ:", - "ControllerSettingsMotionGyroSensitivity": "ジャイロ感度:", - "ControllerSettingsMotionGyroDeadzone": "ジャイロ遊び:", - "ControllerSettingsSave": "セーブ", - "ControllerSettingsClose": "閉じる", - "KeyUnknown": "Unknown", - "KeyShiftLeft": "Shift Left", - "KeyShiftRight": "Shift Right", - "KeyControlLeft": "Ctrl Left", - "KeyMacControlLeft": "⌃ Left", - "KeyControlRight": "Ctrl Right", - "KeyMacControlRight": "⌃ Right", - "KeyAltLeft": "Alt Left", - "KeyMacAltLeft": "⌥ Left", - "KeyAltRight": "Alt Right", - "KeyMacAltRight": "⌥ Right", - "KeyWinLeft": "⊞ Left", - "KeyMacWinLeft": "⌘ Left", - "KeyWinRight": "⊞ Right", - "KeyMacWinRight": "⌘ Right", - "KeyMenu": "Menu", - "KeyUp": "Up", - "KeyDown": "Down", - "KeyLeft": "Left", - "KeyRight": "Right", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Right", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Left Trigger 0", - "GamepadSingleRightTrigger0": "Right Trigger 0", - "GamepadSingleLeftTrigger1": "Left Trigger 1", - "GamepadSingleRightTrigger1": "Right Trigger 1", - "StickLeft": "Left Stick", - "StickRight": "Right Stick", - "UserProfilesSelectedUserProfile": "選択されたユーザプロファイル:", - "UserProfilesSaveProfileName": "プロファイル名をセーブ", - "UserProfilesChangeProfileImage": "プロファイル画像を変更", - "UserProfilesAvailableUserProfiles": "利用可能なユーザプロファイル:", - "UserProfilesAddNewProfile": "プロファイルを作成", - "UserProfilesDelete": "削除", - "UserProfilesClose": "閉じる", - "ProfileNameSelectionWatermark": "ニックネームを選択", - "ProfileImageSelectionTitle": "プロファイル画像選択", - "ProfileImageSelectionHeader": "プロファイル画像を選択", - "ProfileImageSelectionNote": "カスタム画像をインポート, またはファームウェア内のアバターを選択できます", - "ProfileImageSelectionImportImage": "画像ファイルをインポート", - "ProfileImageSelectionSelectAvatar": "ファームウェア内のアバターを選択", - "InputDialogTitle": "入力ダイアログ", - "InputDialogOk": "OK", - "InputDialogCancel": "キャンセル", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "プロファイル名を選択", - "InputDialogAddNewProfileHeader": "プロファイル名を入力してください", - "InputDialogAddNewProfileSubtext": "(最大長: {0})", - "AvatarChoose": "選択", - "AvatarSetBackgroundColor": "背景色を指定", - "AvatarClose": "閉じる", - "ControllerSettingsLoadProfileToolTip": "プロファイルをロード", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "プロファイルを追加", - "ControllerSettingsRemoveProfileToolTip": "プロファイルを削除", - "ControllerSettingsSaveProfileToolTip": "プロファイルをセーブ", - "MenuBarFileToolsTakeScreenshot": "スクリーンショットを撮影", - "MenuBarFileToolsHideUi": "UIを隠す", - "GameListContextMenuRunApplication": "アプリケーションを実行", - "GameListContextMenuToggleFavorite": "お気に入りを切り替え", - "GameListContextMenuToggleFavoriteToolTip": "ゲームをお気に入りに含めるかどうかを切り替えます", - "SettingsTabGeneralTheme": "テーマ:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "ダーク", - "SettingsTabGeneralThemeLight": "ライト", - "ControllerSettingsConfigureGeneral": "設定", - "ControllerSettingsRumble": "振動", - "ControllerSettingsRumbleStrongMultiplier": "強振動の補正値", - "ControllerSettingsRumbleWeakMultiplier": "弱振動の補正値", - "DialogMessageSaveNotAvailableMessage": "{0} [{1:x16}] のセーブデータはありません", - "DialogMessageSaveNotAvailableCreateSaveMessage": "このゲームのセーブデータを作成してよろしいですか?", - "DialogConfirmationTitle": "Ryujinx - 確認", - "DialogUpdaterTitle": "Ryujinx - アップデータ", - "DialogErrorTitle": "Ryujinx - エラー", - "DialogWarningTitle": "Ryujinx - 警告", - "DialogExitTitle": "Ryujinx - 終了", - "DialogErrorMessage": "エラーが発生しました", - "DialogExitMessage": "Ryujinx を閉じてよろしいですか?", - "DialogExitSubMessage": "セーブされていないデータはすべて失われます!", - "DialogMessageCreateSaveErrorMessage": "セーブデータ: {0} の作成中にエラーが発生しました", - "DialogMessageFindSaveErrorMessage": "セーブデータ: {0} の検索中にエラーが発生しました", - "FolderDialogExtractTitle": "展開フォルダを選択", - "DialogNcaExtractionMessage": "{1} から {0} セクションを展開中...", - "DialogNcaExtractionTitle": "NCA セクション展開", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "展開に失敗しました. 選択されたファイルにはメイン NCA が存在しません.", - "DialogNcaExtractionCheckLogErrorMessage": "展開に失敗しました. 詳細はログを確認してください.", - "DialogNcaExtractionSuccessMessage": "展開が正常終了しました", - "DialogUpdaterConvertFailedMessage": "現在の Ryujinx バージョンの変換に失敗しました.", - "DialogUpdaterCancelUpdateMessage": "アップデータをキャンセル中!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "最新バージョンの Ryujinx を使用中です!", - "DialogUpdaterFailedToGetVersionMessage": "Github からのリリース情報取得時にエラーが発生しました. Github Actions でリリースファイルを作成中かもしれません. 後ほどもう一度試してみてください.", - "DialogUpdaterConvertFailedGithubMessage": "Github から取得した Ryujinx バージョンの変換に失敗しました.", - "DialogUpdaterDownloadingMessage": "アップデートをダウンロード中...", - "DialogUpdaterExtractionMessage": "アップデートを展開中...", - "DialogUpdaterRenamingMessage": "アップデートをリネーム中...", - "DialogUpdaterAddingFilesMessage": "新規アップデートを追加中...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "アップデート完了!", - "DialogUpdaterRestartMessage": "すぐに Ryujinx を再起動しますか?", - "DialogUpdaterNoInternetMessage": "インターネットに接続されていません!", - "DialogUpdaterNoInternetSubMessage": "インターネット接続が正常動作しているか確認してください!", - "DialogUpdaterDirtyBuildMessage": "Dirty ビルドの Ryujinx はアップデートできません!", - "DialogUpdaterDirtyBuildSubMessage": "サポートされているバージョンをお探しなら, https://ryujinx.app/download で Ryujinx をダウンロードしてください.", - "DialogRestartRequiredMessage": "再起動が必要", - "DialogThemeRestartMessage": "テーマがセーブされました. テーマを適用するには再起動が必要です.", - "DialogThemeRestartSubMessage": "再起動しますか", - "DialogFirmwareInstallEmbeddedMessage": "このゲームに含まれるファームウェアをインストールしてよろしいですか? (ファームウェア {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "ファームウェアがインストールされていませんが, ゲームに含まれるファームウェア {0} をインストールできます.\nエミュレータが開始します.", - "DialogFirmwareNoFirmwareInstalledMessage": "ファームウェアがインストールされていません", - "DialogFirmwareInstalledMessage": "ファームウェア {0} がインストールされました", - "DialogInstallFileTypesSuccessMessage": "ファイル形式のインストールに成功しました!", - "DialogInstallFileTypesErrorMessage": "ファイル形式のインストールに失敗しました.", - "DialogUninstallFileTypesSuccessMessage": "ファイル形式のアンインストールに成功しました!", - "DialogUninstallFileTypesErrorMessage": "ファイル形式のアンインストールに失敗しました.", - "DialogOpenSettingsWindowLabel": "設定ウインドウを開く", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "コントローラアプレット", - "DialogMessageDialogErrorExceptionMessage": "メッセージダイアログ表示エラー: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "ソフトウェアキーボード表示エラー: {0}", - "DialogErrorAppletErrorExceptionMessage": "エラーアプレットダイアログ表示エラー: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nこのエラーへの対処方法については, セットアップガイドを参照してください.", - "DialogUserErrorDialogTitle": "Ryujinx エラー ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "API からの情報取得中にエラーが発生しました.", - "DialogAmiiboApiConnectErrorMessage": "Amiibo API サーバに接続できませんでした. サーバがダウンしているか, インターネット接続に問題があるかもしれません.", - "DialogProfileInvalidProfileErrorMessage": "プロファイル {0} は現在の入力設定システムと互換性がありません.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "デフォルトのプロファイルは上書きできません", - "DialogProfileDeleteProfileTitle": "プロファイルを削除中", - "DialogProfileDeleteProfileMessage": "このアクションは元に戻せません. 本当に続けてよろしいですか?", - "DialogWarning": "警告", - "DialogPPTCDeletionMessage": "次回起動時に PPTC を再構築します:\n\n{0}\n\n実行してよろしいですか?", - "DialogPPTCDeletionErrorMessage": "PPTC キャッシュ破棄エラー {0}: {1}", - "DialogShaderDeletionMessage": "シェーダーキャッシュを破棄しようとしています:\n\n{0}\n\n実行してよろしいですか?", - "DialogShaderDeletionErrorMessage": "シェーダーキャッシュ破棄エラー {0}: {1}", - "DialogRyujinxErrorMessage": "エラーが発生しました", - "DialogInvalidTitleIdErrorMessage": "UI エラー: 選択されたゲームは有効なタイトル ID を保持していません", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "{0} には有効なシステムファームウェアがありません.", - "DialogFirmwareInstallerFirmwareInstallTitle": "ファームウェア {0} をインストール", - "DialogFirmwareInstallerFirmwareInstallMessage": "システムバージョン {0} がインストールされます.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\n現在のシステムバージョン {0} を置き換えます.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n続けてよろしいですか?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "ファームウェアをインストール中...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "システムバージョン {0} が正常にインストールされました.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "選択されたプロファイルを削除すると,プロファイルがひとつも存在しなくなります", - "DialogUserProfileDeletionConfirmMessage": "選択されたプロファイルを削除しますか", - "DialogUserProfileUnsavedChangesTitle": "警告 - 保存されていない変更", - "DialogUserProfileUnsavedChangesMessage": "保存されていないユーザプロファイルを変更しました.", - "DialogUserProfileUnsavedChangesSubMessage": "変更を破棄しますか?", - "DialogControllerSettingsModifiedConfirmMessage": "現在のコントローラ設定が更新されました.", - "DialogControllerSettingsModifiedConfirmSubMessage": "セーブしますか?", - "DialogLoadFileErrorMessage": "{0}. エラー発生ファイル: {1}", - "DialogModAlreadyExistsMessage": "Modはすでに存在します", - "DialogModInvalidMessage": "指定したディレクトリにはmodが含まれていません!", - "DialogModDeleteNoParentMessage": "削除に失敗しました: Mod \"{0}\" の親ディレクトリが見つかりませんでした!", - "DialogDlcNoDlcErrorMessage": "選択されたファイルはこのタイトル用の DLC ではありません!", - "DialogPerformanceCheckLoggingEnabledMessage": "トレースロギングを有効にします. これは開発者のみに有用な機能です.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "パフォーマンス最適化のためには,トレースロギングを無効にすることを推奨します. トレースロギングを無効にしてよろしいですか?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "シェーダーダンプを有効にします. これは開発者のみに有用な機能です.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "パフォーマンス最適化のためには, シェーダーダンプを無効にすることを推奨します. シェーダーダンプを無効にしてよろしいですか?", - "DialogLoadAppGameAlreadyLoadedMessage": "ゲームはすでにロード済みです", - "DialogLoadAppGameAlreadyLoadedSubMessage": "別のゲームを起動する前に, エミュレーションを中止またはエミュレータを閉じてください.", - "DialogUpdateAddUpdateErrorMessage": "選択されたファイルはこのタイトル用のアップデートではありません!", - "DialogSettingsBackendThreadingWarningTitle": "警告 - バックエンドスレッディング", - "DialogSettingsBackendThreadingWarningMessage": "このオプションの変更を完全に適用するには Ryujinx の再起動が必要です. プラットフォームによっては, Ryujinx のものを使用する前に手動でドライバ自身のマルチスレッディングを無効にする必要があるかもしれません.", - "DialogModManagerDeletionWarningMessage": "以下のModを削除しようとしています: {0}\n\n続行してもよろしいですか?", - "DialogModManagerDeletionAllWarningMessage": "このタイトルの Mod をすべて削除しようとしています.\n\n続行してもよろしいですか?", - "SettingsTabGraphicsFeaturesOptions": "機能", - "SettingsTabGraphicsBackendMultithreading": "グラフィックスバックエンドのマルチスレッド実行:", - "CommonAuto": "自動", - "CommonOff": "オフ", - "CommonOn": "オン", - "InputDialogYes": "はい", - "InputDialogNo": "いいえ", - "DialogProfileInvalidProfileNameErrorMessage": "プロファイル名に無効な文字が含まれています. 再度試してみてください.", - "MenuBarOptionsPauseEmulation": "一時停止", - "MenuBarOptionsResumeEmulation": "再開", - "AboutUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx のウェブサイトを開きます.", - "AboutDisclaimerMessage": "Ryujinx は Nintendo™ および\nそのパートナー企業とは一切関係ありません.", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) は\nAmiibo エミュレーションに使用されています.", - "AboutPatreonUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx の Patreon ページを開きます.", - "AboutGithubUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx の Github ページを開きます.", - "AboutDiscordUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx の Discord サーバを開きます.", - "AboutTwitterUrlTooltipMessage": "クリックするとデフォルトのブラウザで Ryujinx の Twitter ページを開きます.", - "AboutRyujinxAboutTitle": "Ryujinx について:", - "AboutRyujinxAboutContent": "Ryujinx は Nintendo Switch™ のエミュレータです.\nPatreon で私達の活動を支援してください.\n最新の情報は Twitter または Discord から取得できます.\n貢献したい開発者の方は GitHub または Discord で詳細をご確認ください.", - "AboutRyujinxMaintainersTitle": "開発者:", - "AboutRyujinxMaintainersContentTooltipMessage": "クリックするとデフォルトのブラウザで 貢献者のページを開きます.", - "AboutRyujinxSupprtersTitle": "Patreon での支援者:", - "AmiiboSeriesLabel": "Amiibo シリーズ", - "AmiiboCharacterLabel": "キャラクタ", - "AmiiboScanButtonLabel": "スキャン", - "AmiiboOptionsShowAllLabel": "すべての Amiibo を表示", - "AmiiboOptionsUsRandomTagLabel": "ハック: ランダムな Uuid を使用", - "DlcManagerTableHeadingEnabledLabel": "有効", - "DlcManagerTableHeadingTitleIdLabel": "タイトルID", - "DlcManagerTableHeadingContainerPathLabel": "コンテナパス", - "DlcManagerTableHeadingFullPathLabel": "フルパス", - "DlcManagerRemoveAllButton": "すべて削除", - "DlcManagerEnableAllButton": "すべて有効", - "DlcManagerDisableAllButton": "すべて無効", - "ModManagerDeleteAllButton": "すべて削除", - "MenuBarOptionsChangeLanguage": "言語を変更", - "MenuBarShowFileTypes": "ファイル形式を表示", - "CommonSort": "並べ替え", - "CommonShowNames": "名称を表示", - "CommonFavorite": "お気に入り", - "OrderAscending": "昇順", - "OrderDescending": "降順", - "SettingsTabGraphicsFeatures": "機能", - "ErrorWindowTitle": "エラーウインドウ", - "ToggleDiscordTooltip": "Discord の \"現在プレイ中\" アクティビティに Ryujinx を表示するかどうかを選択します", - "AddGameDirBoxTooltip": "リストに追加するゲームディレクトリを入力します", - "AddGameDirTooltip": "リストにゲームディレクトリを追加します", - "RemoveGameDirTooltip": "選択したゲームディレクトリを削除します", - "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list", - "AddAutoloadDirTooltip": "Add an autoload directory to the list", - "RemoveAutoloadDirTooltip": "Remove selected autoload directory", - "CustomThemeCheckTooltip": "エミュレータのメニュー外観を変更するためカスタム Avalonia テーマを使用します", - "CustomThemePathTooltip": "カスタム GUI テーマのパスです", - "CustomThemeBrowseTooltip": "カスタム GUI テーマを参照します", - "DockModeToggleTooltip": "有効にすると,ドッキングされた Nintendo Switch をエミュレートします.多くのゲームではグラフィックス品質が向上します.\n無効にすると,携帯モードの Nintendo Switch をエミュレートします.グラフィックスの品質は低下します.\n\nドッキングモード有効ならプレイヤー1の,無効なら携帯の入力を設定してください.\n\nよくわからない場合はオンのままにしてください.", - "DirectKeyboardTooltip": "直接キーボード アクセス (HID) のサポートです. テキスト入力デバイスとしてキーボードへのゲームアクセスを提供します.\n\nSwitchハードウェアでキーボードの使用をネイティブにサポートしているゲームでのみ動作します.\n\nわからない場合はオフのままにしてください.", - "DirectMouseTooltip": "直接マウスアクセス (HID) のサポートです. ポインティングデバイスとしてマウスへのゲームアクセスを提供します.\n\nSwitchハードウェアでマウスの使用をネイティブにサポートしているゲームでのみ動作します.\n\n有効にしている場合, タッチスクリーン機能は動作しない場合があります.\n\nわからない場合はオフのままにしてください.", - "RegionTooltip": "システムの地域を変更します", - "LanguageTooltip": "システムの言語を変更します", - "TimezoneTooltip": "システムのタイムゾーンを変更します", - "TimeTooltip": "システムの時刻を変更します", - "VSyncToggleTooltip": "エミュレートされたゲーム機の垂直同期です. 多くのゲームにおいて, フレームリミッタとして機能します. 無効にすると, ゲームが高速で実行されたり, ロード中に時間がかかったり, 止まったりすることがあります.\n\n設定したホットキー(デフォルトではF1)で, ゲーム内で切り替え可能です. 無効にする場合は, この操作を行うことをおすすめします.\n\nよくわからない場合はオンのままにしてください.", - "PptcToggleTooltip": "翻訳されたJIT関数をセーブすることで, ゲームをロードするたびに毎回翻訳する処理を不要とします.\n\n一度ゲームを起動すれば,二度目以降の起動時遅延を大きく軽減できます.\n\nよくわからない場合はオンのままにしてください.", - "LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", - "FsIntegrityToggleTooltip": "ゲーム起動時にファイル破損をチェックし,破損が検出されたらログにハッシュエラーを表示します..\n\nパフォーマンスには影響なく, トラブルシューティングに役立ちます.\n\nよくわからない場合はオンのままにしてください.", - "AudioBackendTooltip": "音声レンダリングに使用するバックエンドを変更します.\n\nSDL2 が優先され, OpenAL と SoundIO はフォールバックとして使用されます. ダミーは音声出力しません.\n\nよくわからない場合は SDL2 を設定してください.", - "MemoryManagerTooltip": "ゲストメモリのマップ/アクセス方式を変更します. エミュレートされるCPUのパフォーマンスに大きな影響を与えます.\n\nよくわからない場合は「ホスト,チェックなし」を設定してください.", - "MemoryManagerSoftwareTooltip": "アドレス変換にソフトウェアページテーブルを使用します. 非常に正確ですがパフォーマンスが大きく低下します.", - "MemoryManagerHostTooltip": "ホストのアドレス空間にメモリを直接マップします.JITのコンパイルと実行速度が大きく向上します.", - "MemoryManagerUnsafeTooltip": "メモリを直接マップしますが, アクセス前にゲストのアドレス空間内のアドレスをマスクしません. より高速になりますが, 安全性が犠牲になります. ゲストアプリケーションは Ryujinx のどこからでもメモリにアクセスできるので,このモードでは信頼できるプログラムだけを実行するようにしてください.", - "UseHypervisorTooltip": "JIT の代わりにハイパーバイザーを使用します. 利用可能な場合, パフォーマンスが大幅に向上しますが, 現在の状態では不安定になる可能性があります.", - "DRamTooltip": "エミュレートされたシステムのメモリ容量を 4GiB から 6GiB に増加します.\n\n高解像度のテクスチャパックや 4K解像度の mod を使用する場合に有用です. パフォーマンスを改善するものではありません.\n\nよくわからない場合はオフのままにしてください.", - "IgnoreMissingServicesTooltip": "未実装の Horizon OS サービスを無視します. 特定のゲームにおいて起動時のクラッシュを回避できる場合があります.\n\nよくわからない場合はオフのままにしてください.", - "IgnoreAppletTooltip": "ゲームプレイ中にゲームパッドが切断された場合、外部ダイアログ「コントローラーアプレット」は表示されません。このダイアログを閉じるか、新しいコントローラーを設定するように求めるプロンプトは表示されません。以前に切断されたコントローラーが再接続されると、ゲームは自動的に再開されます。", - "GraphicsBackendThreadingTooltip": "グラフィックスバックエンドのコマンドを別スレッドで実行します.\n\nシェーダのコンパイルを高速化し, 遅延を軽減し, マルチスレッド非対応の GPU ドライバにおいてパフォーマンスを改善します. マルチスレッド対応のドライバでも若干パフォーマンス改善が見られます.\n\nよくわからない場合は自動に設定してください.", - "GalThreadingTooltip": "グラフィックスバックエンドのコマンドを別スレッドで実行します.\n\nシェーダのコンパイルを高速化し, 遅延を軽減し, マルチスレッド非対応の GPU ドライバにおいてパフォーマンスを改善します. マルチスレッド対応のドライバでも若干パフォーマンス改善が見られます.\n\nよくわからない場合は自動に設定してください.", - "ShaderCacheToggleTooltip": "ディスクシェーダーキャッシュをセーブし,次回以降の実行時遅延を軽減します.\n\nよくわからない場合はオンのままにしてください.", - "ResolutionScaleTooltip": "ゲームのレンダリング解像度倍率を設定します.\n\n解像度を上げてもピクセルのように見えるゲームもあります. そのようなゲームでは, アンチエイリアスを削除するか, 内部レンダリング解像度を上げる mod を見つける必要があるかもしれません. その場合, ようなゲームでは、ネイティブを選択してください.\n\nこのオプションはゲーム実行中に下の「適用」をクリックすることで変更できます. 設定ウィンドウを脇に移動して, ゲームが好みの表示になるよう試してみてください.\n\nどのような設定でも, \"4x\" はやり過ぎであることを覚えておいてください.", - "ResolutionScaleEntryTooltip": "1.5 のような整数でない倍率を指定すると,問題が発生したりクラッシュしたりする場合があります.", - "AnisotropyTooltip": "異方性フィルタリングのレベルです. ゲームが要求する値を使用する場合は「自動」を設定してください.", - "AspectRatioTooltip": "レンダリングウインドウに適用するアスペクト比です.\n\nゲームにアスペクト比を変更する mod を使用している場合のみ変更してください.\n\nわからない場合は16:9のままにしておいてください.\n", - "ShaderDumpPathTooltip": "グラフィックス シェーダー ダンプのパスです", - "FileLogTooltip": "コンソール出力されるログをディスク上のログファイルにセーブします. パフォーマンスには影響を与えません.", - "StubLogTooltip": "stub ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", - "InfoLogTooltip": "info ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", - "WarnLogTooltip": "warning ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", - "ErrorLogTooltip": "error ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", - "TraceLogTooltip": "trace ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", - "GuestLogTooltip": "guest ログメッセージをコンソールに出力します. パフォーマンスには影響を与えません.", - "FileAccessLogTooltip": "ファイルアクセスログメッセージをコンソールに出力します.", - "FSAccessLogModeTooltip": "コンソールへのファイルシステムアクセスログ出力を有効にします.0-3 のモードが有効です", - "DeveloperOptionTooltip": "使用上の注意", - "OpenGlLogLevel": "適切なログレベルを有効にする必要があります", - "DebugLogTooltip": "デバッグログメッセージをコンソールに出力します.\n\nログが読みづらくなり,エミュレータのパフォーマンスが低下するため,開発者から特別な指示がある場合のみ使用してください.", - "LoadApplicationFileTooltip": "ロードする Switch 互換のファイルを選択するためファイルエクスプローラを開きます", - "LoadApplicationFolderTooltip": "ロードする Switch 互換の展開済みアプリケーションを選択するためファイルエクスプローラを開きます", - "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from", - "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from", - "OpenRyujinxFolderTooltip": "Ryujinx ファイルシステムフォルダを開きます", - "OpenRyujinxLogsTooltip": "ログが格納されるフォルダを開きます", - "ExitTooltip": "Ryujinx を終了します", - "OpenSettingsTooltip": "設定ウインドウを開きます", - "OpenProfileManagerTooltip": "ユーザプロファイル管理ウインドウを開きます", - "StopEmulationTooltip": "ゲームのエミュレーションを中止してゲーム選択画面に戻ります", - "CheckUpdatesTooltip": "Ryujinx のアップデートを確認します", - "OpenAboutTooltip": "Ryujinx についてのウインドウを開きます", - "GridSize": "グリッドサイズ", - "GridSizeTooltip": "グリッドサイズを変更します", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "ポルトガル語(ブラジル)", - "AboutRyujinxContributorsButtonHeader": "すべての貢献者を確認", - "SettingsTabSystemAudioVolume": "音量: ", - "AudioVolumeTooltip": "音量を変更します", - "SettingsTabSystemEnableInternetAccess": "ゲストインターネットアクセス / LAN モード", - "EnableInternetAccessTooltip": "エミュレートしたアプリケーションをインターネットに接続できるようにします.\n\nLAN モードを持つゲーム同士は,この機能を有効にして同じアクセスポイントに接続すると接続できます. 実機も含まれます.\n\n任天堂のサーバーには接続できません. インターネットに接続しようとすると,特定のゲームでクラッシュすることがあります.\n\nよくわからない場合はオフのままにしてください.", - "GameListContextMenuManageCheatToolTip": "チートを管理します", - "GameListContextMenuManageCheat": "チートを管理", - "GameListContextMenuManageModToolTip": "Modを管理します", - "GameListContextMenuManageMod": "Manage Mods", - "ControllerSettingsStickRange": "範囲:", - "DialogStopEmulationTitle": "Ryujinx - エミュレーションを中止", - "DialogStopEmulationMessage": "エミュレーションを中止してよろしいですか?", - "SettingsTabCpu": "CPU", - "SettingsTabAudio": "音声", - "SettingsTabNetwork": "ネットワーク", - "SettingsTabNetworkConnection": "ネットワーク接続", - "SettingsTabCpuCache": "CPU キャッシュ", - "SettingsTabCpuMemory": "CPU メモリ", - "DialogUpdaterFlatpakNotSupportedMessage": "FlatHub を使用して Ryujinx をアップデートしてください.", - "UpdaterDisabledWarningTitle": "アップデータは無効です!", - "ControllerSettingsRotate90": "時計回りに 90° 回転", - "IconSize": "アイコンサイズ", - "IconSizeTooltip": "ゲームアイコンのサイズを変更します", - "MenuBarOptionsShowConsole": "コンソールを表示", - "ShaderCachePurgeError": "シェーダーキャッシュの破棄エラー {0}: {1}", - "UserErrorNoKeys": "Keys がありません", - "UserErrorNoFirmware": "ファームウェアがありません", - "UserErrorFirmwareParsingFailed": "ファームウェアのパーズエラー", - "UserErrorApplicationNotFound": "アプリケーションがありません", - "UserErrorUnknown": "不明なエラー", - "UserErrorUndefined": "未定義エラー", - "UserErrorNoKeysDescription": "'prod.keys' が見つかりませんでした", - "UserErrorNoFirmwareDescription": "インストールされたファームウェアが見つかりませんでした", - "UserErrorFirmwareParsingFailedDescription": "ファームウェアをパーズできませんでした.通常,古いキーが原因です.", - "UserErrorApplicationNotFoundDescription": "指定されたパスに有効なアプリケーションがありませんでした.", - "UserErrorUnknownDescription": "不明なエラーが発生しました!", - "UserErrorUndefinedDescription": "未定義のエラーが発生しました! 発生すべきものではないので,開発者にご連絡ください!", - "OpenSetupGuideMessage": "セットアップガイドを開く", - "NoUpdate": "アップデートなし", - "TitleUpdateVersionLabel": "バージョン {0} - {1}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - 情報", - "RyujinxConfirm": "Ryujinx - 確認", - "FileDialogAllTypes": "すべての種別", - "Never": "決して", - "SwkbdMinCharacters": "最低 {0} 文字必要です", - "SwkbdMinRangeCharacters": "{0}-{1} 文字にしてください", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "ソフトウェアキーボード", - "SoftwareKeyboardModeNumeric": "0-9 または '.' のみでなければなりません", - "SoftwareKeyboardModeAlphabet": "CJK文字以外のみ", - "SoftwareKeyboardModeASCII": "ASCII文字列のみ", - "ControllerAppletControllers": "サポートされているコントローラ:", - "ControllerAppletPlayers": "プレイヤー:", - "ControllerAppletDescription": "現在の設定は無効です. 設定を開いて入力を再設定してください.", - "ControllerAppletDocked": "ドッキングモードが設定されています. 携帯コントロールは無効にする必要があります.", - "UpdaterRenaming": "古いファイルをリネーム中...", - "UpdaterRenameFailed": "ファイルをリネームできませんでした: {0}", - "UpdaterAddingFiles": "新規ファイルを追加中...", - "UpdaterExtracting": "アップデートを展開中...", - "UpdaterDownloading": "アップデートをダウンロード中...", - "Docked": "ドッキング", - "Handheld": "携帯", - "ConnectionError": "接続エラー.", - "AboutPageDeveloperListMore": "{0}, その他大勢...", - "ApiError": "API エラー.", - "LoadingHeading": "ロード中: {0}", - "CompilingPPTC": "PTC をコンパイル中", - "CompilingShaders": "シェーダーをコンパイル中", - "AllKeyboards": "すべてのキーボード", - "OpenFileDialogTitle": "開くファイルを選択", - "OpenFolderDialogTitle": "展開されたゲームフォルダを選択", - "AllSupportedFormats": "すべての対応フォーマット", - "RyujinxUpdater": "Ryujinx アップデータ", - "SettingsTabHotkeys": "キーボード ホットキー", - "SettingsTabHotkeysHotkeys": "キーボード ホットキー", - "SettingsTabHotkeysToggleVsyncHotkey": "VSync 切り替え:", - "SettingsTabHotkeysScreenshotHotkey": "スクリーンショット:", - "SettingsTabHotkeysShowUiHotkey": "UI表示:", - "SettingsTabHotkeysPauseHotkey": "一時停止:", - "SettingsTabHotkeysToggleMuteHotkey": "ミュート:", - "ControllerMotionTitle": "モーションコントロール設定", - "ControllerRumbleTitle": "振動設定", - "SettingsSelectThemeFileDialogTitle": "テーマファイルを選択", - "SettingsXamlThemeFile": "Xaml テーマファイル", - "AvatarWindowTitle": "アカウント - アバター管理", - "Amiibo": "Amiibo", - "Unknown": "不明", - "Usage": "使用法", - "Writable": "書き込み可能", - "SelectDlcDialogTitle": "DLC ファイルを選択", - "SelectUpdateDialogTitle": "アップデートファイルを選択", - "SelectModDialogTitle": "modディレクトリを選択", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "ユーザプロファイルを管理", - "CheatWindowTitle": "チート管理", - "DlcWindowTitle": "DLC 管理", - "ModWindowTitle": "Manage Mods for {0} ({1})", - "UpdateWindowTitle": "アップデート管理", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} new update(s) added", - "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.", - "CheatWindowHeading": "利用可能なチート {0} [{1}]", - "BuildId": "ビルドID:", - "DlcWindowHeading": "利用可能な DLC {0} [{1}]", - "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} new update(s) added", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "{0} Mod(s)", - "UserProfilesEditProfile": "編集", - "Continue": "Continue", - "Cancel": "キャンセル", - "Save": "セーブ", - "Discard": "破棄", - "Paused": "一時停止中", - "UserProfilesSetProfileImage": "プロファイル画像を設定", - "UserProfileEmptyNameError": "名称が必要です", - "UserProfileNoImageError": "プロファイル画像が必要です", - "GameUpdateWindowHeading": "利用可能なアップデート {0} [{1}]", - "SettingsTabHotkeysResScaleUpHotkey": "解像度を上げる:", - "SettingsTabHotkeysResScaleDownHotkey": "解像度を下げる:", - "UserProfilesName": "名称:", - "UserProfilesUserId": "ユーザID:", - "SettingsTabGraphicsBackend": "グラフィックスバックエンド", - "SettingsTabGraphicsBackendTooltip": "エミュレーションに使用するグラフィックスバックエンドを選択します.\n\nVulkanは, 最近のグラフィックカードでドライバが最新であれば, 全体的に優れています. すべてのGPUベンダーで, シェーダーコンパイルがより高速で, スタッタリングが少ないのが特徴です.\n\n古いNvidia GPU, Linuxでの古いAMD GPU, VRAMの少ないGPUなどでは, OpenGLの方が良い結果が得られるかもしれません. ですが, シェーダーコンパイルのスタッターは大きくなります.\n\n不明な場合はVulkanに設定してください。最新のグラフィックドライバでもVulkanをサポートしていないGPUの場合は, OpenGLに設定してください.", - "SettingsEnableTextureRecompression": "テクスチャの再圧縮を有効にする", - "SettingsEnableTextureRecompressionTooltip": "VRAM使用量を減らすためにASTCテクスチャを圧縮します.\n\nこのテクスチャフォーマットを使用するゲームには, Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder, The Legend of Zelda: Tears of the Kingdomが含まれます.\n\nVRAMが4GB以下のグラフィックカードでは, これらのゲームを実行中にクラッシュする可能性があります.\n\n前述のゲームでVRAMが不足している場合のみ有効にしてください. 不明な場合はオフにしてください.", - "SettingsTabGraphicsPreferredGpu": "優先使用するGPU", - "SettingsTabGraphicsPreferredGpuTooltip": "Vulkanグラフィックスバックエンドで使用されるグラフィックスカードを選択します.\n\nOpenGLが使用するGPUには影響しません.\n\n不明な場合は, \"dGPU\" としてフラグが立っているGPUに設定します. ない場合はそのままにします.", - "SettingsAppRequiredRestartMessage": "Ryujinx の再起動が必要です", - "SettingsGpuBackendRestartMessage": "グラフィックスバックエンドまたはGPUの設定が変更されました. 変更を適用するには再起動する必要があります", - "SettingsGpuBackendRestartSubMessage": "今すぐ再起動しますか?", - "RyujinxUpdaterMessage": "Ryujinx を最新版にアップデートしますか?", - "SettingsTabHotkeysVolumeUpHotkey": "音量を上げる:", - "SettingsTabHotkeysVolumeDownHotkey": "音量を下げる:", - "SettingsEnableMacroHLE": "マクロの高レベルエミュレーション (HLE) を有効にする", - "SettingsEnableMacroHLETooltip": "GPU マクロコードの高レベルエミュレーションです.\n\nパフォーマンスを向上させますが, 一部のゲームでグラフィックに不具合が発生する可能性があります.\n\nよくわからない場合はオンのままにしてください.", - "SettingsEnableColorSpacePassthrough": "色空間をパススルー", - "SettingsEnableColorSpacePassthroughTooltip": "Vulkan バックエンドに対して, 色空間を指定せずに色情報を渡します. 高色域ディスプレイを使用する場合, 正確ではないですがより鮮やかな色になる可能性があります.", - "VolumeShort": "音量", - "UserProfilesManageSaves": "セーブデータの管理", - "DeleteUserSave": "このゲームのユーザセーブデータを削除しますか?", - "IrreversibleActionNote": "この操作は元に戻せません.", - "SaveManagerHeading": "{0} のセーブデータを管理", - "SaveManagerTitle": "セーブデータマネージャ", - "Name": "名称", - "Size": "サイズ", - "Search": "検索", - "UserProfilesRecoverLostAccounts": "アカウントの復旧", - "Recover": "復旧", - "UserProfilesRecoverHeading": "以下のアカウントのセーブデータが見つかりました", - "UserProfilesRecoverEmptyList": "復元するプロファイルはありません", - "GraphicsAATooltip": "ゲームレンダリングにアンチエイリアスを適用します.\n\nFXAAは画像の大部分をぼかし, SMAAはギザギザのエッジを見つけて滑らかにします.\n\nFSRスケーリングフィルタとの併用は推奨しません.\n\nこのオプションは, ゲーム実行中に下の「適用」をクリックして変更できます. 設定ウィンドウを脇に移動し, ゲームが好みの表示になるように試してみてください.\n\n不明な場合は「なし」のままにしておいてください.", - "GraphicsAALabel": "アンチエイリアス:", - "GraphicsScalingFilterLabel": "スケーリングフィルタ:", - "GraphicsScalingFilterTooltip": "解像度変更時に適用されるスケーリングフィルタを選択します.\n\nBilinearは3Dゲームに適しており, 安全なデフォルトオプションです.\n\nピクセルアートゲームにはNearestを推奨します.\n\nFSR 1.0は単なるシャープニングフィルタであり, FXAAやSMAAとの併用は推奨されません.\n\nこのオプションは, ゲーム実行中に下の「適用」をクリックすることで変更できます. 設定ウィンドウを脇に移動し, ゲームが好みの表示になるように試してみてください.\n\n不明な場合はBilinearのままにしておいてください.", - "GraphicsScalingFilterBilinear": "Bilinear", - "GraphicsScalingFilterNearest": "Nearest", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "レベル", - "GraphicsScalingFilterLevelTooltip": "FSR 1.0のシャープ化レベルを設定します. 高い値ほどシャープになります.", - "SmaaLow": "SMAA Low", - "SmaaMedium": "SMAA Medium", - "SmaaHigh": "SMAA High", - "SmaaUltra": "SMAA Ultra", - "UserEditorTitle": "ユーザを編集", - "UserEditorTitleCreate": "ユーザを作成", - "SettingsTabNetworkInterface": "ネットワークインタフェース:", - "NetworkInterfaceTooltip": "LAN/LDN機能に使用されるネットワークインタフェースです.\n\nVPNやXLink Kai、LAN対応のゲームと併用することで, インターネット上の同一ネットワーク接続になりすますことができます.\n\n不明な場合はデフォルトのままにしてください.", - "NetworkInterfaceDefault": "デフォルト", - "PackagingShaders": "シェーダーを構築中", - "AboutChangelogButton": "GitHub で更新履歴を表示", - "AboutChangelogButtonTooltipMessage": "クリックして, このバージョンの更新履歴をデフォルトのブラウザで開きます.", - "SettingsTabNetworkMultiplayer": "マルチプレイヤー", - "MultiplayerMode": "モード:", - "MultiplayerModeTooltip": "LDNマルチプレイヤーモードを変更します.\n\nldn_mitmモジュールがインストールされた, 他のRyujinxインスタンスや,ハックされたNintendo Switchコンソールとのローカル/同一ネットワーク接続を可能にします.\n\nマルチプレイでは, すべてのプレイヤーが同じゲームバージョンである必要があります(例:Super Smash Bros. Ultimate v13.0.1はv13.0.0に接続できません).\n\n不明な場合は「無効」のままにしてください.", - "MultiplayerModeDisabled": "無効", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/ko_KR.json b/src/Ryujinx/Assets/Locales/ko_KR.json deleted file mode 100644 index 8731c8662..000000000 --- a/src/Ryujinx/Assets/Locales/ko_KR.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "한국어", - "MenuBarFileOpenApplet": "애플릿 열기", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii 편집 애플릿", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "독립 실행형 모드로 Mii 편집기 애플릿 열기", - "SettingsTabInputDirectMouseAccess": "마우스 직접 접근", - "SettingsTabSystemMemoryManagerMode": "메모리 관리자 모드 :", - "SettingsTabSystemMemoryManagerModeSoftware": "소프트웨어", - "SettingsTabSystemMemoryManagerModeHost": "호스트(빠름)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "호스트 확인 안함(가장 빠르나 위험)", - "SettingsTabSystemUseHypervisor": "하이퍼바이저 사용", - "MenuBarFile": "파일(_F)", - "MenuBarFileOpenFromFile": "파일에서 앱 불러오기(_L)", - "MenuBarFileOpenFromFileError": "선택한 파일에서 앱을 찾을 수 없습니다.", - "MenuBarFileOpenUnpacked": "압축 푼 게임 불러오기(_U)", - "MenuBarFileLoadDlcFromFolder": "폴더에서 DLC 불러오기", - "MenuBarFileLoadTitleUpdatesFromFolder": "폴더에서 타이틀 업데이트 불러오기", - "MenuBarFileOpenEmuFolder": "Ryujinx 폴더 열기", - "MenuBarFileOpenLogsFolder": "로그 폴더 열기", - "MenuBarFileExit": "종료(_E)", - "MenuBarOptions": "옵션(_O)", - "MenuBarOptionsToggleFullscreen": "전체 화면 전환", - "MenuBarOptionsStartGamesInFullscreen": "전체 화면 모드로 게임 시작", - "MenuBarOptionsStopEmulation": "에뮬레이션 중지", - "MenuBarOptionsSettings": "설정(_S)", - "MenuBarOptionsManageUserProfiles": "사용자 프로필 관리(_M)", - "MenuBarActions": "동작(_A)", - "MenuBarOptionsSimulateWakeUpMessage": "웨이크업 메시지 시뮬레이션", - "MenuBarActionsScanAmiibo": "Amiibo 스캔", - "MenuBarTools": "도구(_T)", - "MenuBarToolsInstallFirmware": "펌웨어 설치", - "MenuBarFileToolsInstallFirmwareFromFile": "XCI 또는 ZIP으로 펌웨어 설치", - "MenuBarFileToolsInstallFirmwareFromDirectory": "디렉터리에서 펌웨어 설치", - "MenuBarToolsInstallKeys": "설치 키", - "MenuBarFileToolsInstallKeysFromFile": "키나 ZIP에서 키 설치", - "MenuBarFileToolsInstallKeysFromFolder": "디렉터리에서 키 설치", - "MenuBarToolsManageFileTypes": "파일 형식 관리", - "MenuBarToolsInstallFileTypes": "파일 형식 설치", - "MenuBarToolsUninstallFileTypes": "파일 형식 제거", - "MenuBarToolsXCITrimmer": "XCI 파일 트리머", - "MenuBarView": "보기(_V)", - "MenuBarViewWindow": "윈도 창", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "도움말(_H)", - "MenuBarHelpCheckForUpdates": "업데이트 확인", - "MenuBarHelpAbout": "정보", - "MenuSearch": "찾기...", - "GameListHeaderFavorite": "즐겨찾기", - "GameListHeaderIcon": "아이콘", - "GameListHeaderApplication": "이름", - "GameListHeaderDeveloper": "개발자", - "GameListHeaderVersion": "버전", - "GameListHeaderTimePlayed": "플레이 타임", - "GameListHeaderLastPlayed": "마지막 플레이", - "GameListHeaderFileExtension": "파일 확장자", - "GameListHeaderFileSize": "파일 크기", - "GameListHeaderPath": "경로", - "GameListContextMenuOpenUserSaveDirectory": "사용자 저장 디렉터리 열기", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "앱의 사용자 저장이 포함된 디렉터리 열기", - "GameListContextMenuOpenDeviceSaveDirectory": "기기 저장 디렉터리 열기", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "앱의 장치 저장이 포함된 디렉터리 열기", - "GameListContextMenuOpenBcatSaveDirectory": "BCAT 저장 디렉터리 열기", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "앱의 BCAT 저장이 포함된 디렉터리 열기", - "GameListContextMenuManageTitleUpdates": "타이틀 업데이트 관리", - "GameListContextMenuManageTitleUpdatesToolTip": "타이틀 업데이트 관리 창 열기", - "GameListContextMenuManageDlc": "DLC 관리", - "GameListContextMenuManageDlcToolTip": "DLC 관리 창 열기", - "GameListContextMenuCacheManagement": "캐시 관리", - "GameListContextMenuCacheManagementPurgePptc": "대기열 PPTC 재구성", - "GameListContextMenuCacheManagementPurgePptcToolTip": "다음 게임 실행 부팅 시, PPTC를 트리거하여 다시 구성", - "GameListContextMenuCacheManagementPurgeShaderCache": "퍼지 셰이더 캐시", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "앱의 셰이더 캐시 삭제", - "GameListContextMenuCacheManagementOpenPptcDirectory": "PPTC 디렉터리 열기", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "앱의 PPTC 캐시가 포함된 디렉터리 열기", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "셰이더 캐시 디렉터리 열기", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "앱의 셰이더 캐시가 포함된 디렉터리 열기", - "GameListContextMenuExtractData": "데이터 추출", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "앱의 현재 구성에서 ExeFS 추출(업데이트 포함)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "앱의 현재 구성에서 RomFS 추출(업데이트 포함)", - "GameListContextMenuExtractDataLogo": "로고", - "GameListContextMenuExtractDataLogoToolTip": "앱의 현재 구성에서 로고 섹션 추출 (업데이트 포함)", - "GameListContextMenuCreateShortcut": "바로 가기 만들기", - "GameListContextMenuCreateShortcutToolTip": "선택한 앱을 실행하는 바탕 화면에 바로 가기를 생성", - "GameListContextMenuCreateShortcutToolTipMacOS": "선택한 앱을 실행하는 macOS 앱 폴더에 바로 가기 만들기", - "GameListContextMenuOpenModsDirectory": "모드 디렉터리 열기", - "GameListContextMenuOpenModsDirectoryToolTip": "앱의 모드가 포함된 디렉터리 열기", - "GameListContextMenuOpenSdModsDirectory": "Atmosphere 모드 디렉터리 열기", - "GameListContextMenuOpenSdModsDirectoryToolTip": "해당 게임의 모드가 포함된 대체 SD 카드 Atmosphere 디렉터리를 엽니다. 실제 하드웨어용으로 패키징된 모드에 유용합니다.", - "GameListContextMenuTrimXCI": "XCI 파일 확인 및 트림", - "GameListContextMenuTrimXCIToolTip": "디스크 공간을 절약하기 위해 XCI 파일 확인 및 트림", - "StatusBarGamesLoaded": "{0}/{1}개의 게임 불러옴", - "StatusBarSystemVersion": "시스템 버전 : {0}", - "StatusBarXCIFileTrimming": "XCI 파일 '{0}' 트리밍", - "LinuxVmMaxMapCountDialogTitle": "메모리 매핑 한계 감지", - "LinuxVmMaxMapCountDialogTextPrimary": "vm.max_map_count의 값을 {0}으로 늘리시겠습니까?", - "LinuxVmMaxMapCountDialogTextSecondary": "일부 게임은 현재 허용된 것보다 더 많은 메모리 매핑을 만들려고 할 수 있습니다. 이 제한을 초과하면 Ryujinx가 충돌이 발생할 수 있습니다.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "예, 다음에 다시 시작할 때까지", - "LinuxVmMaxMapCountDialogButtonPersistent": "예, 영구적으로", - "LinuxVmMaxMapCountWarningTextPrimary": "메모리 매핑의 최대 용량이 권장 용량보다 부족합니다.", - "LinuxVmMaxMapCountWarningTextSecondary": "vm.max_map_count({0})의 현재 값은 {1}보다 낮습니다. 일부 게임은 현재 허용된 것보다 더 많은 메모리 매핑을 만들려고 할 수 있습니다. Ryujinx는 이 제한을 초과하자마자 충돌할 것입니다.\n\n제한을 수동으로 늘리거나 Ryujinx가 이를 지원할 수 있도록 pkexec를 설치하는 것을 추천합니다.", - "Settings": "설정", - "SettingsTabGeneral": "사용자 인터페이스", - "SettingsTabGeneralGeneral": "일반", - "SettingsTabGeneralEnableDiscordRichPresence": "디스코드 활동 상태 활성화", - "SettingsTabGeneralCheckUpdatesOnLaunch": "시작 시, 업데이트 확인", - "SettingsTabGeneralShowConfirmExitDialog": "\"종료 확인\" 대화 상자 표시", - "SettingsTabGeneralRememberWindowState": "창 크기/위치 기억", - "SettingsTabGeneralShowTitleBar": "제목 표시줄 표시(다시 시작해야 함)", - "SettingsTabGeneralHideCursor": "커서 숨기기 :", - "SettingsTabGeneralHideCursorNever": "절대 안 함", - "SettingsTabGeneralHideCursorOnIdle": "유휴 상태", - "SettingsTabGeneralHideCursorAlways": "항상", - "SettingsTabGeneralGameDirectories": "게임 데릭터리", - "SettingsTabGeneralAutoloadDirectories": "DLC/업데이트 디렉터리 자동 불러오기", - "SettingsTabGeneralAutoloadNote": "누락된 파일을 참조하는 DLC 및 업데이트가 자동으로 언로드", - "SettingsTabGeneralAdd": "추가", - "SettingsTabGeneralRemove": "제거", - "SettingsTabSystem": "시스템", - "SettingsTabSystemCore": "코어", - "SettingsTabSystemSystemRegion": "시스템 지역 :", - "SettingsTabSystemSystemRegionJapan": "일본", - "SettingsTabSystemSystemRegionUSA": "미국", - "SettingsTabSystemSystemRegionEurope": "유럽", - "SettingsTabSystemSystemRegionAustralia": "호주", - "SettingsTabSystemSystemRegionChina": "중국", - "SettingsTabSystemSystemRegionKorea": "한국", - "SettingsTabSystemSystemRegionTaiwan": "대만", - "SettingsTabSystemSystemLanguage": "시스템 언어 :", - "SettingsTabSystemSystemLanguageJapanese": "일본어", - "SettingsTabSystemSystemLanguageAmericanEnglish": "미국 영어", - "SettingsTabSystemSystemLanguageFrench": "프랑스어", - "SettingsTabSystemSystemLanguageGerman": "독일어", - "SettingsTabSystemSystemLanguageItalian": "이탈리아어", - "SettingsTabSystemSystemLanguageSpanish": "스페인어", - "SettingsTabSystemSystemLanguageChinese": "중국어", - "SettingsTabSystemSystemLanguageKorean": "한국어", - "SettingsTabSystemSystemLanguageDutch": "네덜란드어", - "SettingsTabSystemSystemLanguagePortuguese": "포르투갈어", - "SettingsTabSystemSystemLanguageRussian": "러시아어", - "SettingsTabSystemSystemLanguageTaiwanese": "대만어", - "SettingsTabSystemSystemLanguageBritishEnglish": "영국 영어", - "SettingsTabSystemSystemLanguageCanadianFrench": "캐나다 프랑스어", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "남미 스페인어", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "중국어 간체", - "SettingsTabSystemSystemLanguageTraditionalChinese": "중국어 번체", - "SettingsTabSystemSystemTimeZone": "시스템 시간대 :", - "SettingsTabSystemSystemTime": "시스템 시간 :", - "SettingsTabSystemEnableVsync": "수직 동기화", - "SettingsTabSystemEnablePptc": "PPTC(프로파일된 영구 번역 캐시)", - "SettingsTabSystemEnableLowPowerPptc": "저전력 PPTC 캐시", - "SettingsTabSystemEnableFsIntegrityChecks": "파일 시스템 무결성 검사", - "SettingsTabSystemAudioBackend": "음향 후단부 :", - "SettingsTabSystemAudioBackendDummy": "더미", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "핵", - "SettingsTabSystemHacksNote": "불안정성을 유발할 수 있음", - "SettingsTabSystemDramSize": "DRAM 크기 :", - "SettingsTabSystemDramSize4GiB": "4GB", - "SettingsTabSystemDramSize6GiB": "6GB", - "SettingsTabSystemDramSize8GiB": "8GB", - "SettingsTabSystemDramSize12GiB": "12GB", - "SettingsTabSystemIgnoreMissingServices": "누락된 서비스 무시", - "SettingsTabSystemIgnoreApplet": "애플릿 무시", - "SettingsTabGraphics": "그래픽", - "SettingsTabGraphicsAPI": "그래픽 API", - "SettingsTabGraphicsEnableShaderCache": "셰이더 캐시 활성화", - "SettingsTabGraphicsAnisotropicFiltering": "이방성 필터링 :", - "SettingsTabGraphicsAnisotropicFilteringAuto": "자동", - "SettingsTabGraphicsAnisotropicFiltering2x": "2배", - "SettingsTabGraphicsAnisotropicFiltering4x": "4배", - "SettingsTabGraphicsAnisotropicFiltering8x": "8배", - "SettingsTabGraphicsAnisotropicFiltering16x": "16배", - "SettingsTabGraphicsResolutionScale": "해상도 배율 :", - "SettingsTabGraphicsResolutionScaleCustom": "사용자 정의(권장하지 않음)", - "SettingsTabGraphicsResolutionScaleNative": "원본(720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2배(1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3배(2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4배(2880p/4320p) (권장하지 않음)", - "SettingsTabGraphicsAspectRatio": "종횡비 :", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "창에 맞춰 늘리기", - "SettingsTabGraphicsDeveloperOptions": "개발자 옵션", - "SettingsTabGraphicsShaderDumpPath": "그래픽 셰이더 덤프 경로 :", - "SettingsTabLogging": "로그 기록", - "SettingsTabLoggingLogging": "로그 기록", - "SettingsTabLoggingEnableLoggingToFile": "파일에 로그 기록 활성화", - "SettingsTabLoggingEnableStubLogs": "조각 기록 활성화", - "SettingsTabLoggingEnableInfoLogs": "정보 기록 활성화", - "SettingsTabLoggingEnableWarningLogs": "경고 기록 활성화", - "SettingsTabLoggingEnableErrorLogs": "오류 기록 활성화", - "SettingsTabLoggingEnableTraceLogs": "추적 기록 활성화", - "SettingsTabLoggingEnableGuestLogs": "방문 기록 활성화", - "SettingsTabLoggingEnableFsAccessLogs": "파일 시스템 접속 기록 활성화", - "SettingsTabLoggingFsGlobalAccessLogMode": "파일 시스템 전역 접속 로그 모드 :", - "SettingsTabLoggingDeveloperOptions": "개발자 옵션", - "SettingsTabLoggingDeveloperOptionsNote": "경고 : 성능이 감소합니다.", - "SettingsTabLoggingGraphicsBackendLogLevel": "그래픽 후단부 기록 레벨 :", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "없음", - "SettingsTabLoggingGraphicsBackendLogLevelError": "오류", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "감속", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "모두", - "SettingsTabLoggingEnableDebugLogs": "디버그 기록 활성화", - "SettingsTabInput": "입력", - "SettingsTabInputEnableDockedMode": "도킹 모드", - "SettingsTabInputDirectKeyboardAccess": "키보드 직접 접속", - "SettingsButtonSave": "저장", - "SettingsButtonClose": "닫기", - "SettingsButtonOk": "확인", - "SettingsButtonCancel": "취소", - "SettingsButtonApply": "적용", - "ControllerSettingsPlayer": "플레이어", - "ControllerSettingsPlayer1": "플레이어 1", - "ControllerSettingsPlayer2": "플레이어 2", - "ControllerSettingsPlayer3": "플레이어 3", - "ControllerSettingsPlayer4": "플레이어 4", - "ControllerSettingsPlayer5": "플레이어 5", - "ControllerSettingsPlayer6": "플레이어 6", - "ControllerSettingsPlayer7": "플레이어 7", - "ControllerSettingsPlayer8": "플레이어 8", - "ControllerSettingsHandheld": "휴대", - "ControllerSettingsInputDevice": "입력 장치", - "ControllerSettingsRefresh": "새로 고침", - "ControllerSettingsDeviceDisabled": "비활성화됨", - "ControllerSettingsControllerType": "컨트롤러 유형", - "ControllerSettingsControllerTypeHandheld": "휴대용", - "ControllerSettingsControllerTypeProController": "프로 컨트롤러", - "ControllerSettingsControllerTypeJoyConPair": "조이콘 페어링", - "ControllerSettingsControllerTypeJoyConLeft": "좌측 조이콘", - "ControllerSettingsControllerTypeJoyConRight": "우측 조이콘", - "ControllerSettingsProfile": "프로필", - "ControllerSettingsProfileDefault": "기본", - "ControllerSettingsLoad": "불러오기", - "ControllerSettingsAdd": "추가", - "ControllerSettingsRemove": "제거", - "ControllerSettingsButtons": "버튼", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "방향키", - "ControllerSettingsDPadUp": "↑", - "ControllerSettingsDPadDown": "↓", - "ControllerSettingsDPadLeft": "←", - "ControllerSettingsDPadRight": "→", - "ControllerSettingsStickButton": "버튼", - "ControllerSettingsStickUp": "↑", - "ControllerSettingsStickDown": "↓", - "ControllerSettingsStickLeft": "←", - "ControllerSettingsStickRight": "→", - "ControllerSettingsStickStick": "스틴", - "ControllerSettingsStickInvertXAxis": "스틱 X축 반전", - "ControllerSettingsStickInvertYAxis": "스틱 Y축 반전", - "ControllerSettingsStickDeadzone": "데드존 :", - "ControllerSettingsLStick": "좌측 스틱", - "ControllerSettingsRStick": "우측 스틱", - "ControllerSettingsTriggersLeft": "좌측 트리거", - "ControllerSettingsTriggersRight": "우측 트리거", - "ControllerSettingsTriggersButtonsLeft": "좌측 트리거 버튼", - "ControllerSettingsTriggersButtonsRight": "우측 트리거 버튼", - "ControllerSettingsTriggers": "트리거", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "좌측 버튼", - "ControllerSettingsExtraButtonsRight": "우측 버튼", - "ControllerSettingsMisc": "기타", - "ControllerSettingsTriggerThreshold": "트리거 임계값 :", - "ControllerSettingsMotion": "모션", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "CemuHook 호환 모션 사용", - "ControllerSettingsMotionControllerSlot": "컨트롤러 슬롯 :", - "ControllerSettingsMotionMirrorInput": "미러 입력", - "ControllerSettingsMotionRightJoyConSlot": "우측 조이콘 슬롯:", - "ControllerSettingsMotionServerHost": "서버 호스트 :", - "ControllerSettingsMotionGyroSensitivity": "자이로 감도 :", - "ControllerSettingsMotionGyroDeadzone": "자이로 데드존 :", - "ControllerSettingsSave": "저장", - "ControllerSettingsClose": "닫기", - "KeyUnknown": "알 수 없음", - "KeyShiftLeft": "좌측 Shift", - "KeyShiftRight": "우측 Shift", - "KeyControlLeft": "좌측 Ctrl", - "KeyMacControlLeft": "좌측 ⌃", - "KeyControlRight": "우측 Ctrl", - "KeyMacControlRight": "우측 ⌃", - "KeyAltLeft": "좌측 Alt", - "KeyMacAltLeft": "좌측 ⌥", - "KeyAltRight": "우측 Alt", - "KeyMacAltRight": "우측 ⌥", - "KeyWinLeft": "좌측 ⊞", - "KeyMacWinLeft": "좌측 ⌘", - "KeyWinRight": "우측 ⊞", - "KeyMacWinRight": "우측 ⌘", - "KeyMenu": "메뉴", - "KeyUp": "↑", - "KeyDown": "↓", - "KeyLeft": "←", - "KeyRight": "→", - "KeyEnter": "엔터", - "KeyEscape": "Esc", - "KeySpace": "스페이스", - "KeyTab": "탭", - "KeyBackSpace": "백스페이스", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "지우기", - "KeyKeypad0": "키패드 0", - "KeyKeypad1": "키패드 1", - "KeyKeypad2": "키패드 2", - "KeyKeypad3": "키패드 3", - "KeyKeypad4": "키패드 4", - "KeyKeypad5": "키패드 5", - "KeyKeypad6": "키패드 6", - "KeyKeypad7": "키패드 7", - "KeyKeypad8": "키패드 8", - "KeyKeypad9": "키패드 9", - "KeyKeypadDivide": "키패드 분할", - "KeyKeypadMultiply": "키패드 멀티플", - "KeyKeypadSubtract": "키패드 빼기", - "KeyKeypadAdd": "키패드 추가", - "KeyKeypadDecimal": "숫자 키패드", - "KeyKeypadEnter": "키패드 입력", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "연동 해제", - "GamepadLeftStick": "좌측 스틱 버튼", - "GamepadRightStick": "우측 스틱 버튼", - "GamepadLeftShoulder": "좌측 숄더", - "GamepadRightShoulder": "우측 숄더", - "GamepadLeftTrigger": "좌측 트리거", - "GamepadRightTrigger": "우측 트리거", - "GamepadDpadUp": "↑", - "GamepadDpadDown": "↓", - "GamepadDpadLeft": "←", - "GamepadDpadRight": "→", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "가이드", - "GamepadMisc1": "기타", - "GamepadPaddle1": "패들 1", - "GamepadPaddle2": "패들 2", - "GamepadPaddle3": "패들 3", - "GamepadPaddle4": "패들 4", - "GamepadTouchpad": "터치패드", - "GamepadSingleLeftTrigger0": "좌측 트리거 0", - "GamepadSingleRightTrigger0": "우측 트리거 0", - "GamepadSingleLeftTrigger1": "좌측 트리거 1", - "GamepadSingleRightTrigger1": "우측 트리거 1", - "StickLeft": "좌측 스틱", - "StickRight": "우측 스틱", - "UserProfilesSelectedUserProfile": "선택된 사용자 프로필 :", - "UserProfilesSaveProfileName": "프로필 이름 저장", - "UserProfilesChangeProfileImage": "프로필 이미지 변경", - "UserProfilesAvailableUserProfiles": "사용 가능한 사용자 프로필 :", - "UserProfilesAddNewProfile": "프로필 만들기", - "UserProfilesDelete": "삭제", - "UserProfilesClose": "닫기", - "ProfileNameSelectionWatermark": "별명 선택", - "ProfileImageSelectionTitle": "프로필 이미지 선택", - "ProfileImageSelectionHeader": "프로필 이미지를 선택", - "ProfileImageSelectionNote": "사용자 지정 프로필 이미지를 가져오거나 시스템 펌웨어에서 아바타 선택 가능", - "ProfileImageSelectionImportImage": "이미지 파일 가져오기", - "ProfileImageSelectionSelectAvatar": "펌웨어 아바타 선택", - "InputDialogTitle": "대화 상자 입력", - "InputDialogOk": "확인", - "InputDialogCancel": "취소", - "InputDialogCancelling": "취소하기", - "InputDialogClose": "닫기", - "InputDialogAddNewProfileTitle": "프로필 이름 선택", - "InputDialogAddNewProfileHeader": "프로필 이름을 입력", - "InputDialogAddNewProfileSubtext": "(최대 길이 : {0})", - "AvatarChoose": "아바타 선택", - "AvatarSetBackgroundColor": "배경색 설정", - "AvatarClose": "닫기", - "ControllerSettingsLoadProfileToolTip": "프로필 불러오기", - "ControllerSettingsViewProfileToolTip": "프로필 보기", - "ControllerSettingsAddProfileToolTip": "프로필 추가", - "ControllerSettingsRemoveProfileToolTip": "프로필 삭제", - "ControllerSettingsSaveProfileToolTip": "프로필 추가", - "MenuBarFileToolsTakeScreenshot": "스크린샷 찍기", - "MenuBarFileToolsHideUi": "UI 숨기기", - "GameListContextMenuRunApplication": "앱 실행", - "GameListContextMenuToggleFavorite": "즐겨찾기 전환", - "GameListContextMenuToggleFavoriteToolTip": "게임의 즐겨찾기 상태 전환", - "SettingsTabGeneralTheme": "테마 :", - "SettingsTabGeneralThemeAuto": "자동", - "SettingsTabGeneralThemeDark": "다크", - "SettingsTabGeneralThemeLight": "라이트", - "ControllerSettingsConfigureGeneral": "설정", - "ControllerSettingsRumble": "진동", - "ControllerSettingsRumbleStrongMultiplier": "강력한 진동 증폭기", - "ControllerSettingsRumbleWeakMultiplier": "약한 진동 증폭기", - "DialogMessageSaveNotAvailableMessage": "{0} [{1:x16}]에 대한 저장 데이터가 없음", - "DialogMessageSaveNotAvailableCreateSaveMessage": "이 게임의 저장 데이터를 만들겠습니까?", - "DialogConfirmationTitle": "Ryujinx - 확인", - "DialogUpdaterTitle": "Ryujinx - 업데이터", - "DialogErrorTitle": "Ryujinx - 오류", - "DialogWarningTitle": "Ryujinx - 경고", - "DialogExitTitle": "Ryujinx - 종료", - "DialogErrorMessage": "Ryujinx에서 오류 발생", - "DialogExitMessage": "정말 Ryujinx를 닫으시겠습니까?", - "DialogExitSubMessage": "저장되지 않은 모든 데이터는 손실됩니다!", - "DialogMessageCreateSaveErrorMessage": "지정된 저장 데이터를 생성하는 동안 오류가 발생 : {0}", - "DialogMessageFindSaveErrorMessage": "지정된 저장 데이터를 찾는 중 오류가 발생 : {0}", - "FolderDialogExtractTitle": "압축을 풀 폴더를 선택", - "DialogNcaExtractionMessage": "{1}에서 {0} 단면 추출 중...", - "DialogNcaExtractionTitle": "NCA 단면 추출기", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "추출에 실패했습니다. 선택한 파일에 기본 NCA가 없습니다.", - "DialogNcaExtractionCheckLogErrorMessage": "추출에 실패했습니다. 자세한 내용은 로그 파일을 확인하시기 바랍니다.", - "DialogNcaExtractionSuccessMessage": "성공적으로 추출이 완료되었습니다.", - "DialogUpdaterConvertFailedMessage": "현재 Ryujinx 버전을 변환할 수 없습니다.", - "DialogUpdaterCancelUpdateMessage": "업데이트가 취소되었습니다!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "이미 최신 버전의 Ryujinx를 사용 중입니다!", - "DialogUpdaterFailedToGetVersionMessage": "GitHub에서 릴리스 정보를 검색하는 동안 오류가 발생했습니다. 현재 GitHub Actions에서 새 릴리스를 컴파일하는 중일 때 발생할 수 있습니다. 몇 분 후에 다시 시도해 주세요.", - "DialogUpdaterConvertFailedGithubMessage": "GitHub에서 받은 Ryujinx 버전을 변환하지 못했습니다.", - "DialogUpdaterDownloadingMessage": "업데이트 내려받는 중...", - "DialogUpdaterExtractionMessage": "업데이트 추출 중...", - "DialogUpdaterRenamingMessage": "이름 변경 업데이트...", - "DialogUpdaterAddingFilesMessage": "새 업데이트 추가 중...", - "DialogUpdaterShowChangelogMessage": "변경 로그 보기", - "DialogUpdaterCompleteMessage": "업데이트가 완료되었습니다!", - "DialogUpdaterRestartMessage": "지금 Ryujinx를 다시 시작하시겠습니까?", - "DialogUpdaterNoInternetMessage": "인터넷에 연결되어 있지 않습니다!", - "DialogUpdaterNoInternetSubMessage": "인터넷이 제대로 연결되어 있는지 확인하세요!", - "DialogUpdaterDirtyBuildMessage": "Ryujinx의 더티 빌드는 업데이트할 수 없습니다!", - "DialogUpdaterDirtyBuildSubMessage": "지원되는 버전을 찾으신다면 https://ryujinx.app/download 에서 Ryujinx를 내려받으세요.", - "DialogRestartRequiredMessage": "다시 시작 필요", - "DialogThemeRestartMessage": "테마를 저장했습니다. 테마를 적용하려면 다시 시작해야 합니다.", - "DialogThemeRestartSubMessage": "다시 시작하시겠습니까?", - "DialogFirmwareInstallEmbeddedMessage": "이 게임에 포함된 펌웨어를 설치하시겠습니까?(Firmware {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "설치된 펌웨어를 찾을 수 없지만 Ryujinx는 제공된 게임에서 펌웨어 {0}을(를) 설치할 수 있습니다.\n이제 에뮬레이터가 시작됩니다.", - "DialogFirmwareNoFirmwareInstalledMessage": "펌웨어가 설치되어 있지 않음", - "DialogFirmwareInstalledMessage": "펌웨어 {0}이(가) 설치됨", - "DialogInstallFileTypesSuccessMessage": "파일 형식을 성공적으로 설치했습니다!", - "DialogInstallFileTypesErrorMessage": "파일 형식을 설치하지 못했습니다.", - "DialogUninstallFileTypesSuccessMessage": "파일 형식이 성공적으로 제거되었습니다!", - "DialogUninstallFileTypesErrorMessage": "파일 형식을 제거하지 못했습니다.", - "DialogOpenSettingsWindowLabel": "설정 창 열기", - "DialogOpenXCITrimmerWindowLabel": "XCI 트리머 창", - "DialogControllerAppletTitle": "컨트롤러 애플릿", - "DialogMessageDialogErrorExceptionMessage": "메시지 대화 상자 표시 오류 : {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "소프트웨어 키보드 표시 오류 : {0}", - "DialogErrorAppletErrorExceptionMessage": "애플릿 오류류 대화 상자 표시 오류 : {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\n이 오류를 해결하는 방법에 대한 자세한 내용은 설정 가이드를 참조하세요.", - "DialogUserErrorDialogTitle": "Ryujinx 오류 ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "API에서 정보를 가져오는 중에 오류가 발생했습니다.", - "DialogAmiiboApiConnectErrorMessage": "Amiibo API 서버에 연결할 수 없습니다. 서비스가 다운되었거나 인터넷 연결이 온라인 상태인지 확인이 필요합니다.", - "DialogProfileInvalidProfileErrorMessage": "프로필 {0}은(는) 현재 입력 구성 시스템과 호환되지 않습니다.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "기본 프로필은 덮어쓸 수 없음", - "DialogProfileDeleteProfileTitle": "프로필 삭제하기", - "DialogProfileDeleteProfileMessage": "이 작업은 되돌릴 수 없습니다. 계속하시겠습니까?", - "DialogWarning": "경고", - "DialogPPTCDeletionMessage": "다음에 부팅할 때, PPTC 재구축을 대기열에 추가하려고 합니다.\n\n{0}\n\n계속하시겠습니까?", - "DialogPPTCDeletionErrorMessage": "{0}에서 PPTC 캐시를 지우는 중 오류 발생 : {1}", - "DialogShaderDeletionMessage": "다음 셰이더 캐시를 삭제 :\n\n{0}\n\n계속하시겠습니까?", - "DialogShaderDeletionErrorMessage": "{0}에서 셰이더 캐시를 삭제하는 중 오류 발생 : {1}", - "DialogRyujinxErrorMessage": "Ryujinx에서 오류 발생", - "DialogInvalidTitleIdErrorMessage": "UI 오류 : 선택한 게임에 유효한 타이틀 ID가 없음", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "{0}에서 유효한 시스템 펌웨어를 찾을 수 없습니다.", - "DialogFirmwareInstallerFirmwareInstallTitle": "펌웨어 {0} 설치", - "DialogFirmwareInstallerFirmwareInstallMessage": "시스템 버전 {0}이(가) 설치됩니다.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\n현재 시스템 버전 {0}을(를) 대체합니다.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n계속하시겠습니까?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "펌웨어 설치 중...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "시스템 버전 {0}이(가) 설치되었습니다.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "{0}에서 잘못된 키 파일이 발견", - "DialogKeysInstallerKeysInstallTitle": "설치 키", - "DialogKeysInstallerKeysInstallMessage": "새로운 키 파일이 설치됩니다.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\n이로 인해 현재 설치된 키 중 일부가 대체될 수 있습니다.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\n계속하시겠습니까?", - "DialogKeysInstallerKeysInstallWaitMessage": "키 설치 중...", - "DialogKeysInstallerKeysInstallSuccessMessage": "새로운 키 파일이 성공적으로 설치되었습니다.", - "DialogUserProfileDeletionWarningMessage": "선택한 프로필을 삭제하면 다른 프로필을 열 수 없음", - "DialogUserProfileDeletionConfirmMessage": "선택한 프로필을 삭제하시겠습니까?", - "DialogUserProfileUnsavedChangesTitle": "경고 - 저장되지 않은 변경 사항", - "DialogUserProfileUnsavedChangesMessage": "저장되지 않은 사용자 프로필의 변경 사항이 있습니다.", - "DialogUserProfileUnsavedChangesSubMessage": "변경 사항을 취소하시겠습니까?", - "DialogControllerSettingsModifiedConfirmMessage": "현재 컨트롤러 설정이 업데이트되었습니다.", - "DialogControllerSettingsModifiedConfirmSubMessage": "저장하시겠습니까?", - "DialogLoadFileErrorMessage": "{0}. 오류 파일 : {1}", - "DialogModAlreadyExistsMessage": "이미 존재하는 모드", - "DialogModInvalidMessage": "지정한 디렉터리에 모드가 없습니다!", - "DialogModDeleteNoParentMessage": "삭제 실패 : \"{0}\" 모드의 상위 디렉터리를 찾을 수 없습니다!", - "DialogDlcNoDlcErrorMessage": "지정된 파일에 선택한 타이틀의 DLC가 포함되어 있지 않습니다!", - "DialogPerformanceCheckLoggingEnabledMessage": "개발자만 사용하도록 설계된 추적 기록이 활성화되어 있습니다.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "최적의 성능을 위해서는 추적 기록을 비활성화하는 것이 좋습니다. 지금 추적 기록을 비활성화하시겠습니까?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "개발자만 사용하도록 설계된 셰이더 덤핑이 활성화되어 있습니다.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "최적의 성능을 위해서는 셰이더 덤핑을 비활성화하는 것이 좋습니다. 지금 셰이더 덤핑을 비활성화하시겠습니까?", - "DialogLoadAppGameAlreadyLoadedMessage": "이미 게임을 불러옴", - "DialogLoadAppGameAlreadyLoadedSubMessage": "다른 게임을 실행하기 전에 에뮬레이션을 중지하거나 에뮬레이터를 닫으세요.", - "DialogUpdateAddUpdateErrorMessage": "지정한 파일에 선택한 타이틀에 대한 업데이트가 포함되어 있지 않습니다!", - "DialogSettingsBackendThreadingWarningTitle": "경고 - 후단부 스레딩", - "DialogSettingsBackendThreadingWarningMessage": "완전히 적용하려면 이 옵션을 변경한 후 Ryujinx를 다시 시작해야 합니다. 플랫폼에 따라 Ryujinx를 사용할 때 드라이버 자체의 다중 스레딩을 수동으로 비활성화해야 할 수도 있습니다.", - "DialogModManagerDeletionWarningMessage": "모드 삭제 : {0}\n\n계속하시겠습니까?", - "DialogModManagerDeletionAllWarningMessage": "이 타이틀에 대한 모드를 모두 삭제하려고 합니다.\n\n계속하시겠습니까?", - "SettingsTabGraphicsFeaturesOptions": "기능", - "SettingsTabGraphicsBackendMultithreading": "그래픽 후단부 다중 스레딩 :", - "CommonAuto": "자동", - "CommonOff": "끔", - "CommonOn": "켬", - "InputDialogYes": "예", - "InputDialogNo": "아니오", - "DialogProfileInvalidProfileNameErrorMessage": "파일 이름에 잘못된 문자가 포함되어 있습니다. 다시 시도하세요.", - "MenuBarOptionsPauseEmulation": "일시 중지", - "MenuBarOptionsResumeEmulation": "다시 시작", - "AboutUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx 웹사이트가 열립니다.", - "AboutDisclaimerMessage": "Ryujinx는 Nintendo™\n또는 그 파트너와 제휴한 바가 없습니다.", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI(www.amiiboapi.com)는\nAmiibo 에뮬레이션에 사용됩니다.", - "AboutPatreonUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx Patreon 페이지가 열립니다.", - "AboutGithubUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx GitHub 페이지가 열립니다.", - "AboutDiscordUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx 디스코드 서버 초대장이 열립니다.", - "AboutTwitterUrlTooltipMessage": "클릭하면 기본 브라우저에서 Ryujinx 트위터 페이지가 열립니다.", - "AboutRyujinxAboutTitle": "정보 :", - "AboutRyujinxAboutContent": "Ryujinx는 Nintendo Switch™용 에뮬레이터입니다.\nPatreon에서 저희를 후원해 주세요.\nTwitter나 Discord에서 최신 뉴스를 모두 받아보세요.\n기여에 관심이 있는 개발자는 GitHub이나 Discord에서 자세한 내용을 알아볼 수 있습니다.", - "AboutRyujinxMaintainersTitle": "유지 관리 :", - "AboutRyujinxMaintainersContentTooltipMessage": "클릭하면 기본 브라우저에서 기여자 페이지가 열립니다.", - "AboutRyujinxSupprtersTitle": "Patreon에서 후원 :", - "AmiiboSeriesLabel": "Amiibo 시리즈", - "AmiiboCharacterLabel": "캐릭터", - "AmiiboScanButtonLabel": "스캔하기", - "AmiiboOptionsShowAllLabel": "모든 Amiibo 표시", - "AmiiboOptionsUsRandomTagLabel": "핵 : 무작위 태그 Uuid 사용", - "DlcManagerTableHeadingEnabledLabel": "활성화", - "DlcManagerTableHeadingTitleIdLabel": "타이틀 ID", - "DlcManagerTableHeadingContainerPathLabel": "컨테이너 경로", - "DlcManagerTableHeadingFullPathLabel": "전체 경로", - "DlcManagerRemoveAllButton": "모두 제거", - "DlcManagerEnableAllButton": "모두 활성화", - "DlcManagerDisableAllButton": "모두 비활성화", - "ModManagerDeleteAllButton": "모두 삭제", - "MenuBarOptionsChangeLanguage": "언어 변경", - "MenuBarShowFileTypes": "파일 형식 표시", - "CommonSort": "정렬", - "CommonShowNames": "이름 표시", - "CommonFavorite": "즐겨찾기", - "OrderAscending": "오름차순", - "OrderDescending": "내림차순", - "SettingsTabGraphicsFeatures": "기능 및 개선 사항", - "ErrorWindowTitle": "오류 창", - "ToggleDiscordTooltip": "\"현재 진행 중인\" 디스코드 활동에 Ryujinx를 표시할지 여부를 선택", - "AddGameDirBoxTooltip": "목록에 추가할 게임 디렉터리를 입력", - "AddGameDirTooltip": "목록에 게임 디렉터리 추가", - "RemoveGameDirTooltip": "선택한 게임 디렉터리 제거", - "AddAutoloadDirBoxTooltip": "목록에 추가할 자동 불러오기 디렉터리를 입력", - "AddAutoloadDirTooltip": "목록에 자동 불러오기 디렉터리 추가", - "RemoveAutoloadDirTooltip": "선택한 자동 불러오기 디렉터리 제거", - "CustomThemeCheckTooltip": "GUI용 사용자 정의 Avalonia 테마를 사용하여 에뮬레이터 메뉴의 모양 변경", - "CustomThemePathTooltip": "사용자 정의 GUI 테마 경로", - "CustomThemeBrowseTooltip": "사용자 정의 GUI 테마 찾아보기", - "DockModeToggleTooltip": "도킹 모드를 사용하면 에뮬레이트된 시스템이 도킹된 Nintendo Switch처럼 동작합니다. 이 경우, 대부분의 게임에서 그래픽 충실도를 향상시킵니다. 반대로 이 기능을 비활성화하면 에뮬레이트된 시스템이 휴대용 Nintendo Switch처럼 작동하여 그래픽 품질이 저하됩니다.\n\n도킹 모드를 사용할 계획이라면 플레이어 1 컨트롤을 구성하세요. 휴대용 모드를 사용하려는 경우 휴대용 컨트롤을 구성하십시오.\n\n모르면 켬으로 두세요.", - "DirectKeyboardTooltip": "키보드 직접 접속(HID)을 지원합니다. 텍스트 입력 장치로 키보드에 대한 게임 접속을 제공합니다.\n\nSwitch 하드웨어에서 키보드 사용을 기본적으로 지원하는 게임에서만 작동합니다.\n\n모르면 끔으로 두세요.", - "DirectMouseTooltip": "마우스 직접 접속(HID)을 지원합니다. 마우스에 대한 게임 접속을 포인팅 장치로 제공합니다.\n\nSwitch 하드웨어에서 마우스 컨트롤을 기본적으로 지원하는 게임에서만 작동하며 거의 없습니다.\n\n활성화하면 터치 스크린 기능이 작동하지 않을 수 있습니다.\n\n모르면 끔으로 두세요.", - "RegionTooltip": "시스템 지역 변경", - "LanguageTooltip": "시스템 언어 변경", - "TimezoneTooltip": "시스템 시간대 변경", - "TimeTooltip": "시스템 시간 변경", - "VSyncToggleTooltip": "에뮬레이트된 콘솔의 수직 동기화입니다. 기본적으로 대부분의 게임에서 프레임 제한 기능으로, 비활성화하면 게임이 더 빠른 속도로 실행되거나 로딩 화면이 더 오래 걸리거나 멈출 수 있습니다.\n\n게임 내에서 원하는 단축키(기본값은 F1)로 전환할 수 있습니다. 비활성화하려면 이 작업을 수행하는 것이 좋습니다.\n\n모르면 켬으로 두세요.", - "PptcToggleTooltip": "번역된 JIT 함수를 저장하여 게임을 불러올 때마다 번역할 필요가 없도록 합니다.\n\n게임을 처음 부팅한 후 끊김 현상을 줄이고 부팅 시간을 크게 단축합니다.\n\n모르면 켬으로 두세요.", - "LowPowerPptcToggleTooltip": "코어의 3분의 1을 사용하여 PPTC를 불러옵니다.", - "FsIntegrityToggleTooltip": "게임을 부팅할 때 손상된 파일을 확인하고, 손상된 파일이 감지되면 로그에 해시 오류를 표시합니다.\n\n성능에 영향을 미치지 않으며 문제 해결에 도움이 됩니다.\n\n모르면 켬으로 두세요.", - "AudioBackendTooltip": "오디오 렌더링에 사용되는 백엔드를 변경합니다.\n\nSDL2가 선호되는 반면 OpenAL 및 SoundIO는 대체 수단으로 사용됩니다. 더미에는 소리가 나지 않습니다.\n\n모르면 SDL2로 설정하세요.", - "MemoryManagerTooltip": "게스트 메모리 매핑 및 접속 방법을 변경합니다. 에뮬레이트된 CPU 성능에 큰 영향을 미칩니다.\n\n모르면 호스트 확인 안 함으로 설정합니다.", - "MemoryManagerSoftwareTooltip": "주소 번역에 소프트웨어 페이지 테이블을 사용합니다. 정확도는 가장 높지만 가장 느립니다.", - "MemoryManagerHostTooltip": "호스트 주소 공간에 메모리를 직접 매핑합니다. JIT 컴파일 및 실행 속도가 훨씬 빨라집니다.", - "MemoryManagerUnsafeTooltip": "메모리를 직접 매핑하되 접속하기 전에 게스트 주소 공간 내의 주소를 마스킹하지 않습니다. 더 빠르지만 안전성이 희생됩니다. 게스트 애플리케이션은 Ryujinx의 어느 곳에서나 메모리에 접속할 수 있으므로 이 모드에서는 신뢰할 수 있는 프로그램만 실행하세요.", - "UseHypervisorTooltip": "JIT 대신 Hypervisor를 사용하세요. 사용 가능한 경우 성능이 크게 향상되지만 현재 상태에서는 불안정할 수 있습니다.", - "DRamTooltip": "Switch 개발 모델을 모방하기 위해 8GB DRAM이 포함된 대체 메모리 모드를 활용합니다.\n\n이는 고해상도 텍스처 팩 또는 4K 해상도 모드에만 유용합니다. 성능을 개선하지 않습니다.\n\n모르면 끔으로 두세요.", - "IgnoreMissingServicesTooltip": "구현되지 않은 Horizon OS 서비스는 무시됩니다. 특정 게임을 부팅할 때, 발생하는 충돌을 우회하는 데 도움이 될 수 있습니다.\n\n모르면 끔으로 두세요.", - "IgnoreAppletTooltip": "게임 플레이 중에 게임패드 연결이 끊어지면 외부 대화 상자 \"컨트롤러 애플릿\"이 나타나지 않습니다. 대화 상자를 닫거나 새 컨트롤러를 설정하라는 메시지가 표시되지 않습니다. 이전에 연결이 끊어진 컨트롤러가 다시 연결되면 게임이 자동으로 다시 시작됩니다.", - "GraphicsBackendThreadingTooltip": "2번째 스레드에서 그래픽 후단부 명령을 실행합니다.\n\n셰이더 컴파일 속도를 높이고, 끊김 현상을 줄이며, 자체 다중 스레딩 지원 없이 GPU 드라이버의 성능을 향상시킵니다. 다중 스레딩이 있는 드라이버에서 성능이 좀 더 좋습니다.\n\n모르면 자동으로 설정합니다.", - "GalThreadingTooltip": "2번째 스레드에서 그래픽 후단부 명령을 실행합니다.\n\n셰이더 컴파일 속도를 높이고 끊김 현상을 줄이며 자체 다중 스레딩 지원 없이 GPU 드라이버의 성능을 향상시킵니다. 다중 스레딩이 있는 드라이버에서 성능이 좀 더 좋습니다.\n\n모르면 자동으로 설정합니다.", - "ShaderCacheToggleTooltip": "후속 실행 시 끊김 현상을 줄이는 디스크 셰이더 캐시를 저장합니다.\n\n모르면 켬으로 두세요.", - "ResolutionScaleTooltip": "게임의 렌더링 해상도를 배가시킵니다.\n\n일부 게임에서는 이 기능이 작동하지 않고 해상도가 높아져도 픽셀화되어 보일 수 있습니다. 해당 게임의 경우 앤티 앨리어싱을 제거하거나 내부 렌더링 해상도를 높이는 모드를 찾아야 할 수 있습니다. 후자를 사용하려면 기본을 선택하는 것이 좋습니다.\n\n이 옵션은 아래의 \"적용\"을 클릭하여 게임이 실행되는 동안 변경할 수 있습니다. 설정 창을 옆으로 옮기고 원하는 게임 모양을 찾을 때까지 실험해 보세요.\n\n4배는 거의 모든 설정에서 과하다는 점을 명심하세요.", - "ResolutionScaleEntryTooltip": "부동 소수점 해상도 스케일(예: 1.5)입니다. 적분이 아닌 스케일은 문제나 충돌을 일으킬 가능성이 높습니다.", - "AnisotropyTooltip": "이방성 필터링 수준입니다. 게임에서 요청한 값을 사용하려면 자동으로 설정하세요.", - "AspectRatioTooltip": "렌더러 창에 적용되는 종횡비입니다.\n\n게임에 종횡비 모드를 사용하는 경우에만 이 설정을 변경하세요. 그렇지 않으면 그래픽이 늘어납니다.\n\n모르면 16:9로 두세요.", - "ShaderDumpPathTooltip": "그래픽 셰이더 덤프 경로", - "FileLogTooltip": "디스크의 로그 파일에 콘솔 기록을 저장합니다. 성능에 영향을 주지 않습니다.", - "StubLogTooltip": "콘솔에 조각 기록 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", - "InfoLogTooltip": "콘솔에 정보 기록 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", - "WarnLogTooltip": "콘솔에 경고 기록 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", - "ErrorLogTooltip": "콘솔에 오류 기록 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", - "TraceLogTooltip": "콘솔에 추적 기록 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", - "GuestLogTooltip": "콘솔에 게스트 로그 메시지를 출력합니다. 성능에 영향을 주지 않습니다.", - "FileAccessLogTooltip": "콘솔에 파일 접속 기록 메시지를 출력합니다.", - "FSAccessLogModeTooltip": "콘솔에 파일 시스템 접속 기록 출력을 활성화합니다. 가능한 모드는 0-3", - "DeveloperOptionTooltip": "주의해서 사용", - "OpenGlLogLevel": "적절한 기록 수준이 활성화되어 있어야 함", - "DebugLogTooltip": "콘솔에 디버그 기록 메시지를 출력합니다.\n\n담당자가 특별히 요청한 경우에만 이 기능을 사용하십시오. 로그를 읽기 어렵게 만들고 에뮬레이터 성능을 저하시킬 수 있기 때문입니다.", - "LoadApplicationFileTooltip": "파일 탐색기를 열어 불러올 Switch 호환 파일을 선택", - "LoadApplicationFolderTooltip": "Switch와 호환되는 압축 해제된 앱을 선택하여 불러오려면 파일 탐색기를 엽니다.", - "LoadDlcFromFolderTooltip": "파일 탐색기를 열어 DLC를 일괄 불러오기할 폴더를 하나 이상 선택", - "LoadTitleUpdatesFromFolderTooltip": "파일 탐색기를 열어 하나 이상의 폴더를 선택하여 대량으로 타이틀 업데이트 불러오기", - "OpenRyujinxFolderTooltip": "Ryujinx 파일 시스템 폴더 열기", - "OpenRyujinxLogsTooltip": "로그가 기록되는 폴더 열기", - "ExitTooltip": "Ryujinx 종료", - "OpenSettingsTooltip": "설정 창 열기", - "OpenProfileManagerTooltip": "사용자 프로필 관리자 창 열기", - "StopEmulationTooltip": "현재 게임의 에뮬레이션을 중지하고 게임 선택으로 돌아가기", - "CheckUpdatesTooltip": "Ryujinx 업데이트 확인", - "OpenAboutTooltip": "정보 창 열기", - "GridSize": "그리드 크기", - "GridSizeTooltip": "그리드 항목의 크기 변경", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "브라질 포르투갈어", - "AboutRyujinxContributorsButtonHeader": "모든 기여자 보기", - "SettingsTabSystemAudioVolume": "음량 : ", - "AudioVolumeTooltip": "음량 변경", - "SettingsTabSystemEnableInternetAccess": "게스트 인터넷 접속/LAN 모드", - "EnableInternetAccessTooltip": "에뮬레이트된 앱을 인터넷에 연결할 수 있습니다.\n\nLAN 모드가 있는 게임은 이 기능이 활성화되고 시스템이 동일한 접속 포인트에 연결되어 있을 때 서로 연결할 수 있습니다. 이는 실제 콘솔도 포함됩니다.\n\nNintendo 서버 연결을 허용하지 않습니다. 인터넷에 연결을 시도하는 특정 게임에서 충돌이 발생할 수 있습니다.\n\n모르면 끔으로 두세요.", - "GameListContextMenuManageCheatToolTip": "치트 관리", - "GameListContextMenuManageCheat": "치트 관리", - "GameListContextMenuManageModToolTip": "모드 관리", - "GameListContextMenuManageMod": "모드 관리", - "ControllerSettingsStickRange": "범위 :", - "DialogStopEmulationTitle": "Ryujinx - 에뮬레이션 중지", - "DialogStopEmulationMessage": "에뮬레이션을 중지하시겠습니까?", - "SettingsTabCpu": "CPU", - "SettingsTabAudio": "음향", - "SettingsTabNetwork": "네트워크", - "SettingsTabNetworkConnection": "네트워크 연결", - "SettingsTabCpuCache": "CPU 캐시", - "SettingsTabCpuMemory": "CPU 모드", - "DialogUpdaterFlatpakNotSupportedMessage": "FlatHub를 통해 Ryujinx를 업데이트하세요.", - "UpdaterDisabledWarningTitle": "업데이터가 비활성화되었습니다!", - "ControllerSettingsRotate90": "시계 방향으로 90° 회전", - "IconSize": "아이콘 크기", - "IconSizeTooltip": "게임 아이콘 크기 변경", - "MenuBarOptionsShowConsole": "콘솔 표시", - "ShaderCachePurgeError": "{0}에서 셰이더 캐시를 삭제하는 중 오류 발생 : {1}", - "UserErrorNoKeys": "키를 찾을 수 없음", - "UserErrorNoFirmware": "펌웨어를 찾을 수 없음", - "UserErrorFirmwareParsingFailed": "펌웨어 구문 분석 오류", - "UserErrorApplicationNotFound": "앱을 찾을 수 없음", - "UserErrorUnknown": "알 수 없는 오류", - "UserErrorUndefined": "정의되지 않은 오류", - "UserErrorNoKeysDescription": "Ryujinx가 'prod.keys' 파일을 찾지 못함", - "UserErrorNoFirmwareDescription": "설치된 펌웨어를 찾을 수 없음", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx가 제공된 펌웨어를 구문 분석하지 못했습니다. 이는 일반적으로 오래된 키로 인해 발생합니다.", - "UserErrorApplicationNotFoundDescription": "Ryujinx가 해당 경로에서 유효한 앱을 찾을 수 없습니다.", - "UserErrorUnknownDescription": "알 수 없는 오류가 발생했습니다!", - "UserErrorUndefinedDescription": "정의되지 않은 오류가 발생했습니다! 이런 일이 발생하면 안 되니 개발자에게 문의하세요!", - "OpenSetupGuideMessage": "설정 가이드 열기", - "NoUpdate": "업데이트 없음", - "TitleUpdateVersionLabel": "버전 {0}", - "TitleBundledUpdateVersionLabel": "번들 : 버전 {0}", - "TitleBundledDlcLabel": "번들 :", - "TitleXCIStatusPartialLabel": "일부", - "TitleXCIStatusTrimmableLabel": "트리밍되지 않음", - "TitleXCIStatusUntrimmableLabel": "트리밍됨", - "TitleXCIStatusFailedLabel": "(실패)", - "TitleXCICanSaveLabel": "{0:n0} Mb 저장", - "TitleXCISavingLabel": "{0:n0}Mb 저장됨", - "RyujinxInfo": "Ryujinx - 정보", - "RyujinxConfirm": "Ryujinx - 확인", - "FileDialogAllTypes": "모든 형식", - "Never": "절대 안 함", - "SwkbdMinCharacters": "{0}자 이상이어야 함", - "SwkbdMinRangeCharacters": "{0}-{1}자 길이여야 함", - "CabinetTitle": "캐비닛 대화 상자", - "CabinetDialog": "Amiibo의 새 이름 입력하기", - "CabinetScanDialog": "지금 Amiibo를 스캔하세요.", - "SoftwareKeyboard": "소프트웨어 키보드", - "SoftwareKeyboardModeNumeric": "0-9 또는 '.'만 가능", - "SoftwareKeyboardModeAlphabet": "CJK 문자가 아닌 문자만 가능", - "SoftwareKeyboardModeASCII": "ASCII 텍스트만 가능", - "ControllerAppletControllers": "지원되는 컨트롤러 :", - "ControllerAppletPlayers": "플레이어 :", - "ControllerAppletDescription": "현재 구성이 유효하지 않습니다. 설정을 열고 입력을 다시 구성하십시오.", - "ControllerAppletDocked": "도킹 모드가 설정되었습니다. 휴대용 제어 기능을 비활성화해야 합니다.", - "UpdaterRenaming": "오래된 파일 이름 바꾸기...", - "UpdaterRenameFailed": "업데이터가 파일 이름을 바꿀 수 없음 : {0}", - "UpdaterAddingFiles": "새 파일 추가...", - "UpdaterExtracting": "업데이트 추출...", - "UpdaterDownloading": "업데이트 내려받기 중...", - "Docked": "도킹", - "Handheld": "휴대", - "ConnectionError": "연결 오류가 발생했습니다.", - "AboutPageDeveloperListMore": "{0} 외...", - "ApiError": "API 오류.", - "LoadingHeading": "{0} 불러오는 중", - "CompilingPPTC": "PTC 컴파일", - "CompilingShaders": "셰이더 컴파일", - "AllKeyboards": "모든 키보드", - "OpenFileDialogTitle": "지원되는 파일을 선택하여 열기", - "OpenFolderDialogTitle": "압축 해제된 게임이 있는 폴더를 선택", - "AllSupportedFormats": "지원되는 모든 형식", - "RyujinxUpdater": "Ryujinx 업데이터", - "SettingsTabHotkeys": "키보드 단축키", - "SettingsTabHotkeysHotkeys": "키보드 단축키", - "SettingsTabHotkeysToggleVsyncHotkey": "수직 동기화 전환 :", - "SettingsTabHotkeysScreenshotHotkey": "스크린샷 :", - "SettingsTabHotkeysShowUiHotkey": "UI 표시 :", - "SettingsTabHotkeysPauseHotkey": "중지 :", - "SettingsTabHotkeysToggleMuteHotkey": "음소거 :", - "ControllerMotionTitle": "모션 컨트롤 설정", - "ControllerRumbleTitle": "진동 설정", - "SettingsSelectThemeFileDialogTitle": "테마 파일 선택", - "SettingsXamlThemeFile": "Xaml 테마 파일", - "AvatarWindowTitle": "계정 관리 - 아바타", - "Amiibo": "Amiibo", - "Unknown": "알 수 없음", - "Usage": "사용법", - "Writable": "쓰기 가능", - "SelectDlcDialogTitle": "DLC 파일 선택", - "SelectUpdateDialogTitle": "업데이트 파일 선택", - "SelectModDialogTitle": "모드 디렉터리 선택", - "TrimXCIFileDialogTitle": "XCI 파일 확인 및 정리", - "TrimXCIFileDialogPrimaryText": "이 기능은 먼저 충분한 공간을 확보한 다음 XCI 파일을 트리밍하여 디스크 공간을 절약합니다.", - "TrimXCIFileDialogSecondaryText": "현재 파일 크기 : {0:n}MB\n게임 데이터 크기 : {1:n}MB\n디스크 공간 절약 : {2:n}MB", - "TrimXCIFileNoTrimNecessary": "XCI 파일은 트리밍할 필요가 없습니다. 자세한 내용은 로그를 확인", - "TrimXCIFileNoUntrimPossible": "XCI 파일은 트리밍을 해제할 수 없습니다. 자세한 내용은 로그를 확인", - "TrimXCIFileReadOnlyFileCannotFix": "XCI 파일은 읽기 전용이므로 쓰기 가능하게 만들 수 없습니다. 자세한 내용은 로그를 확인", - "TrimXCIFileFileSizeChanged": "XCI 파일이 스캔된 후 크기가 변경되었습니다. 파일이 쓰여지고 있지 않은지 확인하고 다시 시도하세요.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI 파일에 여유 공간 영역에 데이터가 있으므로 트리밍하는 것이 안전하지 않음", - "TrimXCIFileInvalidXCIFile": "XCI 파일에 유효하지 않은 데이터가 포함되어 있습니다. 자세한 내용은 로그를 확인", - "TrimXCIFileFileIOWriteError": "XCI 파일을 쓰기 위해 열 수 없습니다. 자세한 내용은 로그를 확인", - "TrimXCIFileFailedPrimaryText": "XCI 파일 트리밍에 실패", - "TrimXCIFileCancelled": "작업이 취소됨", - "TrimXCIFileFileUndertermined": "작업이 수행되지 않음", - "UserProfileWindowTitle": "사용자 프로필 관리자", - "CheatWindowTitle": "치트 관리자", - "DlcWindowTitle": "{0} ({1})의 내려받기 가능한 콘텐츠 관리", - "ModWindowTitle": "{0}({1})의 모드 관리", - "UpdateWindowTitle": "타이틀 업데이트 관리자", - "XCITrimmerWindowTitle": "XCI 파일 트리머", - "XCITrimmerTitleStatusCount": "{1}개 타이틀 중 {0}개 선택됨", - "XCITrimmerTitleStatusCountWithFilter": "{1}개 타이틀 중 {0}개 선택됨({2}개 표시됨)", - "XCITrimmerTitleStatusTrimming": "{0}개의 타이틀을 트리밍 중...", - "XCITrimmerTitleStatusUntrimming": "{0}개의 타이틀을 트리밍 해제 중...", - "XCITrimmerTitleStatusFailed": "실패", - "XCITrimmerPotentialSavings": "잠재적 비용 절감", - "XCITrimmerActualSavings": "실제 비용 절감", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "표시됨 선택", - "XCITrimmerDeselectDisplayed": "표시됨 선택 취소", - "XCITrimmerSortName": "타이틀", - "XCITrimmerSortSaved": "공간 절약s", - "XCITrimmerTrim": "트림", - "XCITrimmerUntrim": "언트림", - "UpdateWindowUpdateAddedMessage": "{0}개의 새 업데이트가 추가됨", - "UpdateWindowBundledContentNotice": "번들 업데이트는 제거할 수 없으며, 비활성화만 가능합니다.", - "CheatWindowHeading": "{0} [{1}]에 사용 가능한 치트", - "BuildId": "빌드ID:", - "DlcWindowBundledContentNotice": "번들 DLC는 제거할 수 없으며 비활성화만 가능합니다.", - "DlcWindowHeading": "{1} ({2})에 내려받기 가능한 콘텐츠 {0}개 사용 가능", - "DlcWindowDlcAddedMessage": "{0}개의 새로운 내려받기 가능한 콘텐츠가 추가됨", - "AutoloadDlcAddedMessage": "{0}개의 새로운 내려받기 가능한 콘텐츠가 추가됨", - "AutoloadDlcRemovedMessage": "{0}개의 내려받기 가능한 콘텐츠가 제거됨", - "AutoloadUpdateAddedMessage": "{0}개의 새 업데이트가 추가됨", - "AutoloadUpdateRemovedMessage": "누락된 업데이트 {0}개 삭제", - "ModWindowHeading": "{0} 모드", - "UserProfilesEditProfile": "선택 항목 편집", - "Continue": "계속", - "Cancel": "취소", - "Save": "저장", - "Discard": "폐기", - "Paused": "일시 중지됨", - "UserProfilesSetProfileImage": "프로필 이미지 설정", - "UserProfileEmptyNameError": "이름 필수 입력", - "UserProfileNoImageError": "프로필 이미지를 설정해야 함", - "GameUpdateWindowHeading": "{0} ({1})에 대한 업데이트 관리", - "SettingsTabHotkeysResScaleUpHotkey": "해상도 증가 :", - "SettingsTabHotkeysResScaleDownHotkey": "해상도 감소 :", - "UserProfilesName": "이름 :", - "UserProfilesUserId": "사용자 ID :", - "SettingsTabGraphicsBackend": "그래픽 후단부", - "SettingsTabGraphicsBackendTooltip": "에뮬레이터에서 사용할 그래픽 후단부를 선택합니다.\n\nVulkan은 드라이버가 최신 상태인 한 모든 최신 그래픽 카드에 전반적으로 더 좋습니다. Vulkan은 또한 모든 GPU 공급업체에서 더 빠른 셰이더 컴파일(덜 끊김)을 제공합니다.\n\nOpenGL은 오래된 Nvidia GPU, Linux의 오래된 AMD GPU 또는 VRAM이 낮은 GPU에서 더 나은 결과를 얻을 수 있지만 셰이더 컴파일 끊김이 더 큽니다.\n\n모르면 Vulkan으로 설정합니다. 최신 그래픽 드라이버를 사용해도 GPU가 Vulkan을 지원하지 않는 경우 OpenGL로 설정하세요..", - "SettingsEnableTextureRecompression": "텍스처 재압축 활성화", - "SettingsEnableTextureRecompressionTooltip": "VRAM 사용량을 줄이기 위해 ASTC 텍스처를 압축합니다.\n\n이 텍스처 형식을 사용하는 게임에는 Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder, The Legend of Zelda: Tears of the Kingdom이 있습니다.\n\n4GiB VRAM 이하의 그래픽 카드는 이러한 게임을 실행하는 동안 어느 시점에서 충돌할 가능성이 있습니다.\n\n위에서 언급한 게임에서 VRAM이 부족한 경우에만 활성화합니다. 모르면 끔으로 두세요.", - "SettingsTabGraphicsPreferredGpu": "기본 GPU", - "SettingsTabGraphicsPreferredGpuTooltip": "Vulkan 그래픽 후단부와 함께 사용할 그래픽 카드를 선택하세요.\n\nOpenGL에서 사용할 GPU에는 영향을 미치지 않습니다.\n\n모르면 \"dGPU\"로 플래그가 지정된 GPU로 설정하세요. 없으면 그대로 두세요.", - "SettingsAppRequiredRestartMessage": "Ryujinx 다시 시작 필요", - "SettingsGpuBackendRestartMessage": "그래픽 후단부 또는 GPU 설정이 수정되었습니다. 이를 적용하려면 다시 시작이 필요", - "SettingsGpuBackendRestartSubMessage": "지금 다시 시작하시겠습니까?", - "RyujinxUpdaterMessage": "Ryujinx를 최신 버전으로 업데이트하시겠습니까?", - "SettingsTabHotkeysVolumeUpHotkey": "음량 증가 :", - "SettingsTabHotkeysVolumeDownHotkey": "음량 감소 :", - "SettingsEnableMacroHLE": "매크로 HLE 활성화", - "SettingsEnableMacroHLETooltip": "GPU 매크로 코드의 고수준 에뮬레이션입니다.\n\n성능은 향상되지만 일부 게임에서 그래픽 오류가 발생할 수 있습니다.\n\n모르면 켬으로 두세요.", - "SettingsEnableColorSpacePassthrough": "색 공간 통과", - "SettingsEnableColorSpacePassthroughTooltip": "Vulkan 후단부가 색 공간을 지정하지 않고 색상 정보를 전달하도록 지시합니다. 넓은 색역 화면 표시 장치를 사용하는 사용자의 경우 색상 정확성을 희생하고 더 생생한 색상이 나올 수 있습니다.", - "VolumeShort": "음량", - "UserProfilesManageSaves": "저장 관리", - "DeleteUserSave": "이 게임의 사용자 저장을 삭제하시겠습니까?", - "IrreversibleActionNote": "이 작업은 되돌릴 수 없습니다.", - "SaveManagerHeading": "{0} ({1})에 대한 저장 관리", - "SaveManagerTitle": "관리자 저장", - "Name": "이름", - "Size": "크기", - "Search": "찾기", - "UserProfilesRecoverLostAccounts": "잃어버린 계정 복구", - "Recover": "복구", - "UserProfilesRecoverHeading": "다음 계정에 대한 저장 발견", - "UserProfilesRecoverEmptyList": "복구할 프로필 없음", - "GraphicsAATooltip": "게임 렌더에 앤티 앨리어싱을 적용합니다.\n\nFXAA는 이미지 대부분을 흐리게 처리하지만 SMAA는 들쭉날쭉한 가장자리를 찾아 부드럽게 처리합니다.\n\nFSR 스케일링 필터와 함께 사용하지 않는 것이 좋습니다.\n\n이 옵션은 아래의 \"적용\"을 클릭하여 게임을 실행하는 동안 변경할 수 있습니다. 설정 창을 옆으로 옮겨 원하는 게임의 모습을 찾을 때까지 실험해 볼 수 있습니다.\n\n모르면 없음으로 두세요.", - "GraphicsAALabel": "앤티 앨리어싱 :", - "GraphicsScalingFilterLabel": "크기 조정 필터 :", - "GraphicsScalingFilterTooltip": "해상도 스케일을 사용할 때 적용될 스케일링 필터를 선택합니다.\n\n쌍선형은 3D 게임에 적합하며 안전한 기본 옵션입니다.\n\nNearest는 픽셀 아트 게임에 권장됩니다.\n\nFSR 1.0은 단순히 선명도 필터일 뿐이며 FXAA 또는 SMAA와 함께 사용하는 것은 권장되지 않습니다.\n\nArea 스케일링은 출력 창보다 큰 해상도를 다운스케일링할 때 권장됩니다. 2배 이상 다운스케일링할 때 슈퍼샘플링된 앤티앨리어싱 효과를 얻는 데 사용할 수 있습니다.\n\n이 옵션은 아래의 \"적용\"을 클릭하여 게임을 실행하는 동안 변경할 수 있습니다. 설정 창을 옆으로 옮겨 원하는 게임 모양을 찾을 때까지 실험하면 됩니다.\n\n모르면 쌍선형을 그대로 두세요.", - "GraphicsScalingFilterBilinear": "쌍선형", - "GraphicsScalingFilterNearest": "근린", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "영역", - "GraphicsScalingFilterLevelLabel": "레벨", - "GraphicsScalingFilterLevelTooltip": "FSR 1.0 선명도 레벨을 설정합니다. 높을수록 더 선명합니다.", - "SmaaLow": "SMAA 낮음", - "SmaaMedium": "SMAA 중간", - "SmaaHigh": "SMAA 높음", - "SmaaUltra": "SMAA 울트라", - "UserEditorTitle": "사용자 편집", - "UserEditorTitleCreate": "사용자 만들기", - "SettingsTabNetworkInterface": "네트워크 인터페이스:", - "NetworkInterfaceTooltip": "LAN/LDN 기능에 사용되는 네트워크 인터페이스입니다.\n\nVPN이나 ​​XLink Kai와 LAN 지원 게임과 함께 사용하면 인터넷을 통한 동일 네트워크 연결을 스푸핑하는 데 사용할 수 있습니다.\n\n모르면 기본값으로 두세요.", - "NetworkInterfaceDefault": "기본값", - "PackagingShaders": "패키징 셰이더", - "AboutChangelogButton": "GitHub에서 변경 내역 보기", - "AboutChangelogButtonTooltipMessage": "기본 브라우저에서 이 버전의 변경 내역을 열람하려면 클릭하세요.", - "SettingsTabNetworkMultiplayer": "멀티플레이어", - "MultiplayerMode": "모드 :", - "MultiplayerModeTooltip": "LDN 멀티플레이어 모드를 변경합니다.\n\nLdnMitm은 게임의 로컬 무선/로컬 플레이 기능을 LAN처럼 작동하도록 수정하여 다른 Ryujinx 인스턴스나 ldn_mitm 모듈이 설치된 해킹된 Nintendo Switch 콘솔과 로컬, 동일 네트워크 연결이 가능합니다.\n\n멀티플레이어는 모든 플레이어가 동일한 게임 버전을 사용해야 합니다(예: Super Smash Bros. Ultimate v13.0.1은 v13.0.0에 연결할 수 없음).\n\n모르면 비활성화 상태로 두세요.", - "MultiplayerModeDisabled": "비활성화됨", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "P2P 네트워크 호스팅 비활성화(대기 시간이 늘어날 수 있음)", - "MultiplayerDisableP2PTooltip": "P2P 네트워크 호스팅을 비활성화하면 피어가 직접 연결하지 않고 마스터 서버를 통해 프록시합니다.", - "LdnPassphrase": "네트워크 암호 문구 :", - "LdnPassphraseTooltip": "귀하는 귀하와 동일한 암호를 사용하는 호스팅 게임만 볼 수 있습니다.", - "LdnPassphraseInputTooltip": "Ryujinx-<8 hex chars> 형식으로 암호를 입력하세요. 귀하는 귀하와 동일한 암호를 사용하는 호스팅 게임만 볼 수 있습니다.", - "LdnPassphraseInputPublic": "(일반)", - "GenLdnPass": "무작위 생성", - "GenLdnPassTooltip": "다른 플레이어와 공유할 수 있는 새로운 암호 문구를 생성합니다.", - "ClearLdnPass": "지우기", - "ClearLdnPassTooltip": "현재 암호를 지우고 공용 네트워크로 돌아갑니다.", - "InvalidLdnPassphrase": "유효하지 않은 암호입니다! \"Ryujinx-<8 hex chars>\" 형식이어야 합니다." -} diff --git a/src/Ryujinx/Assets/Locales/pl_PL.json b/src/Ryujinx/Assets/Locales/pl_PL.json deleted file mode 100644 index d87453ef2..000000000 --- a/src/Ryujinx/Assets/Locales/pl_PL.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "Polski", - "MenuBarFileOpenApplet": "Otwórz Aplet", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Otwórz aplet Mii Editor w trybie indywidualnym", - "SettingsTabInputDirectMouseAccess": "Bezpośredni dostęp do myszy", - "SettingsTabSystemMemoryManagerMode": "Tryb menedżera pamięci:", - "SettingsTabSystemMemoryManagerModeSoftware": "Oprogramowanie", - "SettingsTabSystemMemoryManagerModeHost": "Gospodarz (szybki)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Gospodarza (NIESPRAWDZONY, najszybszy, niebezpieczne)", - "SettingsTabSystemUseHypervisor": "Użyj Hipernadzorcy", - "MenuBarFile": "_Plik", - "MenuBarFileOpenFromFile": "_Załaduj aplikację z pliku", - "MenuBarFileOpenFromFileError": "No applications found in selected file.", - "MenuBarFileOpenUnpacked": "Załaduj _rozpakowaną grę", - "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder", - "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder", - "MenuBarFileOpenEmuFolder": "Otwórz folder Ryujinx", - "MenuBarFileOpenLogsFolder": "Otwórz folder plików dziennika zdarzeń", - "MenuBarFileExit": "_Wyjdź", - "MenuBarOptions": "_Opcje", - "MenuBarOptionsToggleFullscreen": "Przełącz na tryb pełnoekranowy", - "MenuBarOptionsStartGamesInFullscreen": "Uruchamiaj gry w trybie pełnoekranowym", - "MenuBarOptionsStopEmulation": "Zatrzymaj emulację", - "MenuBarOptionsSettings": "_Ustawienia", - "MenuBarOptionsManageUserProfiles": "_Zarządzaj profilami użytkowników", - "MenuBarActions": "_Akcje", - "MenuBarOptionsSimulateWakeUpMessage": "Symuluj wiadomość wybudzania", - "MenuBarActionsScanAmiibo": "Skanuj Amiibo", - "MenuBarTools": "_Narzędzia", - "MenuBarToolsInstallFirmware": "Zainstaluj oprogramowanie", - "MenuBarFileToolsInstallFirmwareFromFile": "Zainstaluj oprogramowanie z XCI lub ZIP", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Zainstaluj oprogramowanie z katalogu", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "Zarządzaj rodzajami plików", - "MenuBarToolsInstallFileTypes": "Typy plików instalacyjnych", - "MenuBarToolsUninstallFileTypes": "Typy plików dezinstalacyjnych", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_View", - "MenuBarViewWindow": "Window Size", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Pomoc", - "MenuBarHelpCheckForUpdates": "Sprawdź aktualizacje", - "MenuBarHelpAbout": "O programie", - "MenuSearch": "Wyszukaj...", - "GameListHeaderFavorite": "Ulubione", - "GameListHeaderIcon": "Ikona", - "GameListHeaderApplication": "Nazwa", - "GameListHeaderDeveloper": "Twórca", - "GameListHeaderVersion": "Wersja", - "GameListHeaderTimePlayed": "Czas w grze:", - "GameListHeaderLastPlayed": "Ostatnio grane", - "GameListHeaderFileExtension": "Rozszerzenie pliku", - "GameListHeaderFileSize": "Rozmiar pliku", - "GameListHeaderPath": "Ścieżka", - "GameListContextMenuOpenUserSaveDirectory": "Otwórz katalog zapisów użytkownika", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Otwiera katalog, który zawiera zapis użytkownika dla tej aplikacji", - "GameListContextMenuOpenDeviceSaveDirectory": "Otwórz katalog zapisów urządzenia", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Otwiera katalog, który zawiera zapis urządzenia dla tej aplikacji", - "GameListContextMenuOpenBcatSaveDirectory": "Otwórz katalog zapisu BCAT obecnego użytkownika", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Otwiera katalog, który zawiera zapis BCAT dla tej aplikacji", - "GameListContextMenuManageTitleUpdates": "Zarządzaj aktualizacjami", - "GameListContextMenuManageTitleUpdatesToolTip": "Otwiera okno zarządzania aktualizacjami danej aplikacji", - "GameListContextMenuManageDlc": "Zarządzaj dodatkową zawartością (DLC)", - "GameListContextMenuManageDlcToolTip": "Otwiera okno zarządzania dodatkową zawartością", - "GameListContextMenuCacheManagement": "Zarządzanie Cache", - "GameListContextMenuCacheManagementPurgePptc": "Zakolejkuj rekompilację PPTC", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Zainicjuj Rekompilację PPTC przy następnym uruchomieniu gry", - "GameListContextMenuCacheManagementPurgeShaderCache": "Wyczyść pamięć podręczną cieni", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Usuwa pamięć podręczną cieni danej aplikacji", - "GameListContextMenuCacheManagementOpenPptcDirectory": "Otwórz katalog PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Otwiera katalog, który zawiera pamięć podręczną PPTC aplikacji", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Otwórz katalog pamięci podręcznej cieni", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Otwiera katalog, który zawiera pamięć podręczną cieni aplikacji", - "GameListContextMenuExtractData": "Wypakuj dane", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Wyodrębnij sekcję ExeFS z bieżącej konfiguracji aplikacji (w tym aktualizacje)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Wyodrębnij sekcję RomFS z bieżącej konfiguracji aplikacji (w tym aktualizacje)", - "GameListContextMenuExtractDataLogo": "Logo", - "GameListContextMenuExtractDataLogoToolTip": "Wyodrębnij sekcję z logiem z bieżącej konfiguracji aplikacji (w tym aktualizacje)", - "GameListContextMenuCreateShortcut": "Utwórz skrót aplikacji", - "GameListContextMenuCreateShortcutToolTip": "Utwórz skrót na pulpicie, który uruchamia wybraną aplikację", - "GameListContextMenuCreateShortcutToolTipMacOS": "Utwórz skrót w folderze 'Aplikacje' w systemie macOS, który uruchamia wybraną aplikację", - "GameListContextMenuOpenModsDirectory": "Otwórz katalog modów", - "GameListContextMenuOpenModsDirectoryToolTip": "Otwiera katalog zawierający mody dla danej aplikacji", - "GameListContextMenuOpenSdModsDirectory": "Otwórz katalog modów Atmosphere", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Otwiera alternatywny katalog Atmosphere na karcie SD, który zawiera mody danej aplikacji. Przydatne dla modów przygotowanych pod prawdziwy sprzęt.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} Załadowane gry", - "StatusBarSystemVersion": "Wersja systemu: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Wykryto niski limit dla przypisań pamięci", - "LinuxVmMaxMapCountDialogTextPrimary": "Czy chcesz zwiększyć wartość vm.max_map_count do {0}", - "LinuxVmMaxMapCountDialogTextSecondary": "Niektóre gry mogą próbować przypisać sobie więcej pamięci niż obecnie, jest to dozwolone. Ryujinx ulegnie awarii, gdy limit zostanie przekroczony.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Tak, do następnego ponownego uruchomienia", - "LinuxVmMaxMapCountDialogButtonPersistent": "Tak, permanentnie ", - "LinuxVmMaxMapCountWarningTextPrimary": "Maksymalna ilość przypisanej pamięci jest mniejsza niż zalecana.", - "LinuxVmMaxMapCountWarningTextSecondary": "Obecna wartość vm.max_map_count ({0}) jest mniejsza niż {1}. Niektóre gry mogą próbować stworzyć więcej mapowań pamięci niż obecnie jest to dozwolone. Ryujinx napotka crash, gdy dojdzie do takiej sytuacji.\n\nMożesz chcieć ręcznie zwiększyć limit lub zainstalować pkexec, co pozwala Ryujinx na pomoc w tym zakresie.", - "Settings": "Ustawienia", - "SettingsTabGeneral": "Interfejs użytkownika", - "SettingsTabGeneralGeneral": "Ogólne", - "SettingsTabGeneralEnableDiscordRichPresence": "Włącz Bogatą Obecność Discord", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Sprawdzaj aktualizacje przy uruchomieniu", - "SettingsTabGeneralShowConfirmExitDialog": "Pokazuj okno dialogowe \"Potwierdź wyjście\"", - "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "Ukryj kursor:", - "SettingsTabGeneralHideCursorNever": "Nigdy", - "SettingsTabGeneralHideCursorOnIdle": "Gdy bezczynny", - "SettingsTabGeneralHideCursorAlways": "Zawsze", - "SettingsTabGeneralGameDirectories": "Katalogi gier", - "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "Dodaj", - "SettingsTabGeneralRemove": "Usuń", - "SettingsTabSystem": "System", - "SettingsTabSystemCore": "Główne", - "SettingsTabSystemSystemRegion": "Region systemu:", - "SettingsTabSystemSystemRegionJapan": "Japonia", - "SettingsTabSystemSystemRegionUSA": "Stany Zjednoczone", - "SettingsTabSystemSystemRegionEurope": "Europa", - "SettingsTabSystemSystemRegionAustralia": "Australia", - "SettingsTabSystemSystemRegionChina": "Chiny", - "SettingsTabSystemSystemRegionKorea": "Korea", - "SettingsTabSystemSystemRegionTaiwan": "Tajwan", - "SettingsTabSystemSystemLanguage": "Język systemu:", - "SettingsTabSystemSystemLanguageJapanese": "Japoński", - "SettingsTabSystemSystemLanguageAmericanEnglish": "Angielski (Stany Zjednoczone)", - "SettingsTabSystemSystemLanguageFrench": "Francuski", - "SettingsTabSystemSystemLanguageGerman": "Niemiecki", - "SettingsTabSystemSystemLanguageItalian": "Włoski", - "SettingsTabSystemSystemLanguageSpanish": "Hiszpański", - "SettingsTabSystemSystemLanguageChinese": "Chiński", - "SettingsTabSystemSystemLanguageKorean": "Koreański", - "SettingsTabSystemSystemLanguageDutch": "Holenderski", - "SettingsTabSystemSystemLanguagePortuguese": "Portugalski", - "SettingsTabSystemSystemLanguageRussian": "Rosyjski", - "SettingsTabSystemSystemLanguageTaiwanese": "Tajwański", - "SettingsTabSystemSystemLanguageBritishEnglish": "Angielski (Wielka Brytania)", - "SettingsTabSystemSystemLanguageCanadianFrench": "Kanadyjski Francuski", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Hiszpański (Ameryka Łacińska)", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Chiński (Uproszczony)", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Chiński (Tradycyjny)", - "SettingsTabSystemSystemTimeZone": "Strefa czasowa systemu:", - "SettingsTabSystemSystemTime": "Czas systemu:", - "SettingsTabSystemEnableVsync": "Synchronizacja pionowa", - "SettingsTabSystemEnablePptc": "PPTC (Profilowana pamięć podręczna trwałych łłumaczeń)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "Sprawdzanie integralności systemu plików", - "SettingsTabSystemAudioBackend": "Backend Dżwięku:", - "SettingsTabSystemAudioBackendDummy": "Atrapa", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "Hacki", - "SettingsTabSystemHacksNote": " (mogą powodować niestabilność)", - "SettingsTabSystemDramSize": "Użyj alternatywnego układu pamięci (Deweloperzy)", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "Ignoruj Brakujące Usługi", - "SettingsTabSystemIgnoreApplet": "Ignoruj ​​aplet", - "SettingsTabGraphics": "Grafika", - "SettingsTabGraphicsAPI": "Graficzne API", - "SettingsTabGraphicsEnableShaderCache": "Włącz pamięć podręczną cieni", - "SettingsTabGraphicsAnisotropicFiltering": "Filtrowanie anizotropowe:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Automatyczne", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "Skalowanie rozdzielczości:", - "SettingsTabGraphicsResolutionScaleCustom": "Niestandardowa (Niezalecane)", - "SettingsTabGraphicsResolutionScaleNative": "Natywna (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (niezalecane)", - "SettingsTabGraphicsAspectRatio": "Format obrazu:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "Rozciągnij do Okna", - "SettingsTabGraphicsDeveloperOptions": "Opcje programisty", - "SettingsTabGraphicsShaderDumpPath": "Ścieżka do zgranych cieni graficznych:", - "SettingsTabLogging": "Dziennik zdarzeń", - "SettingsTabLoggingLogging": "Dziennik zdarzeń", - "SettingsTabLoggingEnableLoggingToFile": "Włącz rejestrowanie zdarzeń do pliku", - "SettingsTabLoggingEnableStubLogs": "Wlącz Skróty Logów", - "SettingsTabLoggingEnableInfoLogs": "Włącz Logi Informacyjne", - "SettingsTabLoggingEnableWarningLogs": "Włącz Logi Ostrzeżeń", - "SettingsTabLoggingEnableErrorLogs": "Włącz Logi Błędów", - "SettingsTabLoggingEnableTraceLogs": "Włącz Logi Śledzenia", - "SettingsTabLoggingEnableGuestLogs": "Włącz Logi Gości", - "SettingsTabLoggingEnableFsAccessLogs": "Włącz Logi Dostępu do Systemu Plików", - "SettingsTabLoggingFsGlobalAccessLogMode": "Tryb globalnego dziennika zdarzeń systemu plików:", - "SettingsTabLoggingDeveloperOptions": "Opcje programisty (UWAGA: wpływa na wydajność)", - "SettingsTabLoggingDeveloperOptionsNote": "UWAGA: Pogrorszy wydajność", - "SettingsTabLoggingGraphicsBackendLogLevel": "Poziom rejestrowania do dziennika zdarzeń Backendu Graficznego:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "Nic", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Błędy", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Spowolnienia", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "Wszystko", - "SettingsTabLoggingEnableDebugLogs": "Włącz dzienniki zdarzeń do debugowania", - "SettingsTabInput": "Sterowanie", - "SettingsTabInputEnableDockedMode": "Tryb zadokowany", - "SettingsTabInputDirectKeyboardAccess": "Bezpośredni dostęp do klawiatury", - "SettingsButtonSave": "Zapisz", - "SettingsButtonClose": "Zamknij", - "SettingsButtonOk": "OK", - "SettingsButtonCancel": "Anuluj", - "SettingsButtonApply": "Zastosuj", - "ControllerSettingsPlayer": "Gracz", - "ControllerSettingsPlayer1": "Gracz 1", - "ControllerSettingsPlayer2": "Gracz 2", - "ControllerSettingsPlayer3": "Gracz 3", - "ControllerSettingsPlayer4": "Gracz 4", - "ControllerSettingsPlayer5": "Gracz 5", - "ControllerSettingsPlayer6": "Gracz 6", - "ControllerSettingsPlayer7": "Gracz 7", - "ControllerSettingsPlayer8": "Gracz 8", - "ControllerSettingsHandheld": "Przenośny", - "ControllerSettingsInputDevice": "Urządzenie wejściowe", - "ControllerSettingsRefresh": "Odśwież", - "ControllerSettingsDeviceDisabled": "Wyłączone", - "ControllerSettingsControllerType": "Typ kontrolera", - "ControllerSettingsControllerTypeHandheld": "Przenośny", - "ControllerSettingsControllerTypeProController": "Pro Kontroler", - "ControllerSettingsControllerTypeJoyConPair": "Para JoyCon-ów", - "ControllerSettingsControllerTypeJoyConLeft": "Lewy JoyCon", - "ControllerSettingsControllerTypeJoyConRight": "Prawy JoyCon", - "ControllerSettingsProfile": "Profil", - "ControllerSettingsProfileDefault": "Domyślny", - "ControllerSettingsLoad": "Wczytaj", - "ControllerSettingsAdd": "Dodaj", - "ControllerSettingsRemove": "Usuń", - "ControllerSettingsButtons": "Przyciski", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Krzyżak (D-Pad)", - "ControllerSettingsDPadUp": "Góra", - "ControllerSettingsDPadDown": "Dół", - "ControllerSettingsDPadLeft": "Lewo", - "ControllerSettingsDPadRight": "Prawo", - "ControllerSettingsStickButton": "Przycisk", - "ControllerSettingsStickUp": "Góra ", - "ControllerSettingsStickDown": "Dół ", - "ControllerSettingsStickLeft": "Lewo", - "ControllerSettingsStickRight": "Prawo", - "ControllerSettingsStickStick": "Gałka", - "ControllerSettingsStickInvertXAxis": "Odwróć gałkę X", - "ControllerSettingsStickInvertYAxis": "Odwróć gałkę Y", - "ControllerSettingsStickDeadzone": "Martwa strefa:", - "ControllerSettingsLStick": "Lewa Gałka", - "ControllerSettingsRStick": "Prawa Gałka", - "ControllerSettingsTriggersLeft": "Lewe Triggery", - "ControllerSettingsTriggersRight": "Prawe Triggery", - "ControllerSettingsTriggersButtonsLeft": "Lewe Przyciski Triggerów", - "ControllerSettingsTriggersButtonsRight": "Prawe Przyciski Triggerów", - "ControllerSettingsTriggers": "Triggery", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Lewe Przyciski", - "ControllerSettingsExtraButtonsRight": "Prawe Przyciski", - "ControllerSettingsMisc": "Różne", - "ControllerSettingsTriggerThreshold": "Próg Triggerów:", - "ControllerSettingsMotion": "Ruch", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Użyj ruchu zgodnego z CemuHook", - "ControllerSettingsMotionControllerSlot": "Slot Kontrolera:", - "ControllerSettingsMotionMirrorInput": "Odzwierciedlaj Sterowanie", - "ControllerSettingsMotionRightJoyConSlot": "Prawy Slot JoyCon:", - "ControllerSettingsMotionServerHost": "Host Serwera:", - "ControllerSettingsMotionGyroSensitivity": "Czułość Żyroskopu:", - "ControllerSettingsMotionGyroDeadzone": "Deadzone Żyroskopu:", - "ControllerSettingsSave": "Zapisz", - "ControllerSettingsClose": "Zamknij", - "KeyUnknown": "Unknown", - "KeyShiftLeft": "Shift Left", - "KeyShiftRight": "Shift Right", - "KeyControlLeft": "Ctrl Left", - "KeyMacControlLeft": "⌃ Left", - "KeyControlRight": "Ctrl Right", - "KeyMacControlRight": "⌃ Right", - "KeyAltLeft": "Alt Left", - "KeyMacAltLeft": "⌥ Left", - "KeyAltRight": "Alt Right", - "KeyMacAltRight": "⌥ Right", - "KeyWinLeft": "⊞ Left", - "KeyMacWinLeft": "⌘ Left", - "KeyWinRight": "⊞ Right", - "KeyMacWinRight": "⌘ Right", - "KeyMenu": "Menu", - "KeyUp": "Up", - "KeyDown": "Down", - "KeyLeft": "Left", - "KeyRight": "Right", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Right", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Left Trigger 0", - "GamepadSingleRightTrigger0": "Right Trigger 0", - "GamepadSingleLeftTrigger1": "Left Trigger 1", - "GamepadSingleRightTrigger1": "Right Trigger 1", - "StickLeft": "Left Stick", - "StickRight": "Right Stick", - "UserProfilesSelectedUserProfile": "Wybrany profil użytkownika:", - "UserProfilesSaveProfileName": "Zapisz nazwę profilu", - "UserProfilesChangeProfileImage": "Zmień obrazek profilu", - "UserProfilesAvailableUserProfiles": "Dostępne profile użytkownika:", - "UserProfilesAddNewProfile": "Utwórz profil", - "UserProfilesDelete": "Usuń", - "UserProfilesClose": "Zamknij", - "ProfileNameSelectionWatermark": "Wybierz pseudonim", - "ProfileImageSelectionTitle": "Wybór Obrazu Profilu", - "ProfileImageSelectionHeader": "Wybierz zdjęcie profilowe", - "ProfileImageSelectionNote": "Możesz zaimportować niestandardowy obraz profilu lub wybrać awatar z firmware'u systemowego", - "ProfileImageSelectionImportImage": "Importuj Plik Obrazu", - "ProfileImageSelectionSelectAvatar": "Wybierz domyślny awatar z oprogramowania konsoli", - "InputDialogTitle": "Okno Dialogowe Wprowadzania", - "InputDialogOk": "OK", - "InputDialogCancel": "Anuluj", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "Wybierz nazwę profilu", - "InputDialogAddNewProfileHeader": "Wprowadź nazwę profilu", - "InputDialogAddNewProfileSubtext": "(Maksymalna długość: {0})", - "AvatarChoose": "Wybierz awatar", - "AvatarSetBackgroundColor": "Ustaw kolor tła", - "AvatarClose": "Zamknij", - "ControllerSettingsLoadProfileToolTip": "Wczytaj profil", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "Dodaj profil", - "ControllerSettingsRemoveProfileToolTip": "Usuń profil", - "ControllerSettingsSaveProfileToolTip": "Zapisz profil", - "MenuBarFileToolsTakeScreenshot": "Zrób zrzut ekranu", - "MenuBarFileToolsHideUi": "Ukryj interfejs użytkownika", - "GameListContextMenuRunApplication": "Uruchom aplikację ", - "GameListContextMenuToggleFavorite": "Przełącz na ulubione", - "GameListContextMenuToggleFavoriteToolTip": "Przełącz status Ulubionej Gry", - "SettingsTabGeneralTheme": "Motyw:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "Ciemny", - "SettingsTabGeneralThemeLight": "Jasny", - "ControllerSettingsConfigureGeneral": "Konfiguruj", - "ControllerSettingsRumble": "Wibracje", - "ControllerSettingsRumbleStrongMultiplier": "Mnożnik mocnych wibracji", - "ControllerSettingsRumbleWeakMultiplier": "Mnożnik słabych wibracji", - "DialogMessageSaveNotAvailableMessage": "Nie ma zapisanych danych dla {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "Czy chcesz utworzyć zapis danych dla tej gry?", - "DialogConfirmationTitle": "Ryujinx - Potwierdzenie", - "DialogUpdaterTitle": "Ryujinx - Asystent aktualizacji", - "DialogErrorTitle": "Ryujinx - Błąd", - "DialogWarningTitle": "Ryujinx - Ostrzeżenie", - "DialogExitTitle": "Ryujinx - Wyjdź", - "DialogErrorMessage": "Ryujinx napotkał błąd", - "DialogExitMessage": "Czy na pewno chcesz zamknąć Ryujinx?", - "DialogExitSubMessage": "Wszystkie niezapisane dane zostaną utracone!", - "DialogMessageCreateSaveErrorMessage": "Wystąpił błąd podczas tworzenia określonych zapisanych danych: {0}", - "DialogMessageFindSaveErrorMessage": "Wystąpił błąd podczas próby znalezienia określonych zapisanych danych: {0}", - "FolderDialogExtractTitle": "Wybierz folder, do którego chcesz rozpakować", - "DialogNcaExtractionMessage": "Wypakowywanie sekcji {0} z {1}...", - "DialogNcaExtractionTitle": "Asystent wypakowania sekcji NCA", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Niepowodzenie podczas wypakowywania. W wybranym pliku nie było głównego NCA.", - "DialogNcaExtractionCheckLogErrorMessage": "Niepowodzenie podczas wypakowywania. Przeczytaj plik dziennika, aby uzyskać więcej informacji.", - "DialogNcaExtractionSuccessMessage": "Wypakowywanie zakończone pomyślnie.", - "DialogUpdaterConvertFailedMessage": "Nie udało się przekonwertować obecnej wersji Ryujinx.", - "DialogUpdaterCancelUpdateMessage": "Anulowanie aktualizacji!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "Używasz już najnowszej wersji Ryujinx!", - "DialogUpdaterFailedToGetVersionMessage": "Wystąpił błąd podczas próby uzyskania informacji o obecnej wersji z GitHub Release. Może to być spowodowane nową wersją kompilowaną przez GitHub Actions. Spróbuj ponownie za kilka minut.", - "DialogUpdaterConvertFailedGithubMessage": "Nie udało się przekonwertować otrzymanej wersji Ryujinx z Github Release.", - "DialogUpdaterDownloadingMessage": "Pobieranie aktualizacji...", - "DialogUpdaterExtractionMessage": "Wypakowywanie Aktualizacji...", - "DialogUpdaterRenamingMessage": "Zmiana Nazwy Aktualizacji...", - "DialogUpdaterAddingFilesMessage": "Dodawanie Nowej Aktualizacji...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "Aktualizacja Zakończona!", - "DialogUpdaterRestartMessage": "Czy chcesz teraz zrestartować Ryujinx?", - "DialogUpdaterNoInternetMessage": "Nie masz połączenia z Internetem!", - "DialogUpdaterNoInternetSubMessage": "Sprawdź, czy masz działające połączenie internetowe!", - "DialogUpdaterDirtyBuildMessage": "Nie możesz zaktualizować Dirty wersji Ryujinx!", - "DialogUpdaterDirtyBuildSubMessage": "Pobierz Ryujinx ze strony https://ryujinx.app/download, jeśli szukasz obsługiwanej wersji.", - "DialogRestartRequiredMessage": "Wymagane Ponowne Uruchomienie", - "DialogThemeRestartMessage": "Motyw został zapisany. Aby zastosować motyw, konieczne jest ponowne uruchomienie.", - "DialogThemeRestartSubMessage": "Czy chcesz uruchomić ponownie?", - "DialogFirmwareInstallEmbeddedMessage": "Czy chcesz zainstalować firmware wbudowany w tę grę? (Firmware {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "Nie znaleziono zainstalowanego oprogramowania, ale Ryujinx był w stanie zainstalować oprogramowanie {0} z dostarczonej gry.\n\nEmulator uruchomi się teraz.", - "DialogFirmwareNoFirmwareInstalledMessage": "Brak Zainstalowanego Firmware'u", - "DialogFirmwareInstalledMessage": "Firmware {0} został zainstalowany", - "DialogInstallFileTypesSuccessMessage": "Pomyślnie zainstalowano typy plików!", - "DialogInstallFileTypesErrorMessage": "Nie udało się zainstalować typów plików.", - "DialogUninstallFileTypesSuccessMessage": "Pomyślnie odinstalowano typy plików!", - "DialogUninstallFileTypesErrorMessage": "Nie udało się odinstalować typów plików.", - "DialogOpenSettingsWindowLabel": "Otwórz Okno Ustawień", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "Aplet Kontrolera", - "DialogMessageDialogErrorExceptionMessage": "Błąd wyświetlania okna Dialogowego Wiadomości: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Błąd wyświetlania Klawiatury Oprogramowania: {0}", - "DialogErrorAppletErrorExceptionMessage": "Błąd wyświetlania okna Dialogowego ErrorApplet: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nAby uzyskać więcej informacji o tym, jak naprawić ten błąd, zapoznaj się z naszym Przewodnikiem instalacji.", - "DialogUserErrorDialogTitle": "Błąd Ryujinxa ({0})", - "DialogAmiiboApiTitle": "API Amiibo", - "DialogAmiiboApiFailFetchMessage": "Wystąpił błąd podczas pobierania informacji z API.", - "DialogAmiiboApiConnectErrorMessage": "Nie można połączyć się z serwerem API Amiibo. Usługa może nie działać lub może być konieczne sprawdzenie, czy połączenie internetowe jest online.", - "DialogProfileInvalidProfileErrorMessage": "Profil {0} jest niezgodny z bieżącym systemem konfiguracji sterowania.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "Profil Domyślny nie może zostać nadpisany", - "DialogProfileDeleteProfileTitle": "Usuwanie Profilu", - "DialogProfileDeleteProfileMessage": "Ta czynność jest nieodwracalna, czy na pewno chcesz kontynuować?", - "DialogWarning": "Uwaga", - "DialogPPTCDeletionMessage": "Masz zamiar umieścić w kolejce rekompilację PPTC przy następnym uruchomieniu:\n\n{0}\n\nCzy na pewno chcesz kontynuować?", - "DialogPPTCDeletionErrorMessage": "Błąd czyszczenia cache PPTC w {0}: {1}", - "DialogShaderDeletionMessage": "Zamierzasz usunąć cache Shaderów dla :\n\n{0}\n\nNa pewno chcesz kontynuować?", - "DialogShaderDeletionErrorMessage": "Błąd czyszczenia cache Shaderów w {0}: {1}", - "DialogRyujinxErrorMessage": "Ryujinx napotkał błąd", - "DialogInvalidTitleIdErrorMessage": "Błąd UI: Wybrana gra nie miała prawidłowego ID tytułu", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Nie znaleziono prawidłowego firmware'u systemowego w {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Zainstaluj Firmware {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "Wersja systemu {0} zostanie zainstalowana.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nZastąpi to obecną wersję systemu {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nCzy chcesz kontynuować?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Instalowanie firmware'u...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Wersja systemu {0} została pomyślnie zainstalowana.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "Nie będzie innych profili do otwarcia, jeśli wybrany profil zostanie usunięty", - "DialogUserProfileDeletionConfirmMessage": "Czy chcesz usunąć wybrany profil", - "DialogUserProfileUnsavedChangesTitle": "Uwaga - Niezapisane zmiany", - "DialogUserProfileUnsavedChangesMessage": "Wprowadziłeś zmiany dla tego profilu użytkownika, które nie zostały zapisane.", - "DialogUserProfileUnsavedChangesSubMessage": "Czy chcesz odrzucić zmiany?", - "DialogControllerSettingsModifiedConfirmMessage": "Aktualne ustawienia kontrolera zostały zaktualizowane.", - "DialogControllerSettingsModifiedConfirmSubMessage": "Czy chcesz zapisać?", - "DialogLoadFileErrorMessage": "{0}. Błędny plik: {1}", - "DialogModAlreadyExistsMessage": "Modyfikacja już istnieje", - "DialogModInvalidMessage": "Podany katalog nie zawiera modyfikacji!", - "DialogModDeleteNoParentMessage": "Nie udało się usunąć: Nie można odnaleźć katalogu nadrzędnego dla modyfikacji \"{0}\"!", - "DialogDlcNoDlcErrorMessage": "Określony plik nie zawiera DLC dla wybranego tytułu!", - "DialogPerformanceCheckLoggingEnabledMessage": "Masz włączone rejestrowanie śledzenia, które jest przeznaczone tylko dla programistów.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "Aby uzyskać optymalną wydajność, zaleca się wyłączenie rejestrowania śledzenia. Czy chcesz teraz wyłączyć rejestrowanie śledzenia?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "Masz włączone zrzucanie shaderów, które jest przeznaczone tylko dla programistów.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Aby uzyskać optymalną wydajność, zaleca się wyłączenie zrzucania shaderów. Czy chcesz teraz wyłączyć zrzucanie shaderów?", - "DialogLoadAppGameAlreadyLoadedMessage": "Gra została już załadowana", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Zatrzymaj emulację lub zamknij emulator przed uruchomieniem innej gry.", - "DialogUpdateAddUpdateErrorMessage": "Określony plik nie zawiera aktualizacji dla wybranego tytułu!", - "DialogSettingsBackendThreadingWarningTitle": "Ostrzeżenie — Wątki Backend", - "DialogSettingsBackendThreadingWarningMessage": "Ryujinx musi zostać ponownie uruchomiony po zmianie tej opcji, aby działał w pełni. W zależności od platformy może być konieczne ręczne wyłączenie sterownika wielowątkowości podczas korzystania z Ryujinx.", - "DialogModManagerDeletionWarningMessage": "Zamierzasz usunąć modyfikacje: {0}\n\nCzy na pewno chcesz kontynuować?", - "DialogModManagerDeletionAllWarningMessage": "Zamierzasz usunąć wszystkie modyfikacje dla wybranego tytułu: {0}\n\nCzy na pewno chcesz kontynuować?", - "SettingsTabGraphicsFeaturesOptions": "Funkcje", - "SettingsTabGraphicsBackendMultithreading": "Wielowątkowość Backendu Graficznego:", - "CommonAuto": "Auto", - "CommonOff": "Wyłączone", - "CommonOn": "Włączone", - "InputDialogYes": "Tak", - "InputDialogNo": "Nie", - "DialogProfileInvalidProfileNameErrorMessage": "Nazwa pliku zawiera nieprawidłowe znaki. Proszę spróbuj ponownie.", - "MenuBarOptionsPauseEmulation": "Pauza", - "MenuBarOptionsResumeEmulation": "Wznów", - "AboutUrlTooltipMessage": "Kliknij, aby otworzyć stronę Ryujinx w domyślnej przeglądarce.", - "AboutDisclaimerMessage": "Ryujinx nie jest w żaden sposób powiązany z Nintendo™,\nani z żadnym z jej partnerów.", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) jest używane\nw naszej emulacji Amiibo.", - "AboutPatreonUrlTooltipMessage": "Kliknij, aby otworzyć stronę Patreon Ryujinx w domyślnej przeglądarce.", - "AboutGithubUrlTooltipMessage": "Kliknij, aby otworzyć stronę GitHub Ryujinx w domyślnej przeglądarce.", - "AboutDiscordUrlTooltipMessage": "Kliknij, aby otworzyć zaproszenie na serwer Discord Ryujinx w domyślnej przeglądarce.", - "AboutTwitterUrlTooltipMessage": "Kliknij, aby otworzyć stronę Twitter Ryujinx w domyślnej przeglądarce.", - "AboutRyujinxAboutTitle": "O Aplikacji:", - "AboutRyujinxAboutContent": "Ryujinx to emulator Nintendo Switch™.\nWspieraj nas na Patreonie.\nOtrzymuj najnowsze wiadomości na naszym Twitterze lub Discordzie.\nDeweloperzy zainteresowani współpracą mogą dowiedzieć się więcej na naszym GitHubie lub Discordzie.", - "AboutRyujinxMaintainersTitle": "Utrzymywany Przez:", - "AboutRyujinxMaintainersContentTooltipMessage": "Kliknij, aby otworzyć stronę Współtwórcy w domyślnej przeglądarce.", - "AboutRyujinxSupprtersTitle": "Wspierani na Patreonie Przez:", - "AmiiboSeriesLabel": "Seria Amiibo", - "AmiiboCharacterLabel": "Postać", - "AmiiboScanButtonLabel": "Zeskanuj", - "AmiiboOptionsShowAllLabel": "Pokaż Wszystkie Amiibo", - "AmiiboOptionsUsRandomTagLabel": "Hack: Użyj losowego UUID tagu", - "DlcManagerTableHeadingEnabledLabel": "Włączone", - "DlcManagerTableHeadingTitleIdLabel": "ID Tytułu", - "DlcManagerTableHeadingContainerPathLabel": "Ścieżka Kontenera", - "DlcManagerTableHeadingFullPathLabel": "Pełna Ścieżka", - "DlcManagerRemoveAllButton": "Usuń Wszystkie", - "DlcManagerEnableAllButton": "Włącz Wszystkie", - "DlcManagerDisableAllButton": "Wyłącz Wszystkie", - "ModManagerDeleteAllButton": "Usuń wszystko", - "MenuBarOptionsChangeLanguage": "Zmień język", - "MenuBarShowFileTypes": "Pokaż typy plików", - "CommonSort": "Sortuj", - "CommonShowNames": "Pokaż Nazwy", - "CommonFavorite": "Ulubione", - "OrderAscending": "Rosnąco", - "OrderDescending": "Malejąco", - "SettingsTabGraphicsFeatures": "Funkcje i Ulepszenia", - "ErrorWindowTitle": "Okno Błędu", - "ToggleDiscordTooltip": "Wybierz, czy chcesz wyświetlać Ryujinx w swojej \"aktualnie grane\" aktywności Discord", - "AddGameDirBoxTooltip": "Wprowadź katalog gier aby dodać go do listy", - "AddGameDirTooltip": "Dodaj katalog gier do listy", - "RemoveGameDirTooltip": "Usuń wybrany katalog gier", - "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list", - "AddAutoloadDirTooltip": "Add an autoload directory to the list", - "RemoveAutoloadDirTooltip": "Remove selected autoload directory", - "CustomThemeCheckTooltip": "Użyj niestandardowego motywu Avalonia dla GUI, aby zmienić wygląd menu emulatora", - "CustomThemePathTooltip": "Ścieżka do niestandardowego motywu GUI", - "CustomThemeBrowseTooltip": "Wyszukaj niestandardowy motyw GUI", - "DockModeToggleTooltip": "Tryb Zadokowany sprawia, że emulowany system zachowuje się jak zadokowany Nintendo Switch. Poprawia to jakość grafiki w większości gier. I odwrotnie, wyłączenie tej opcji sprawi, że emulowany system będzie zachowywał się jak przenośny Nintendo Switch, zmniejszając jakość grafiki.\n\nSkonfiguruj sterowanie gracza 1, jeśli planujesz używać trybu Zadokowanego; Skonfiguruj sterowanie przenośne, jeśli planujesz używać trybu przenośnego.\n\nPozostaw WŁĄCZONY, jeśli nie masz pewności.", - "DirectKeyboardTooltip": "Obsługa bezpośredniego dostępu do klawiatury (HID). Zapewnia dostęp gier do klawiatury jako urządzenia do wprowadzania tekstu.\n\nDziała tylko z grami, które natywnie wspierają użycie klawiatury w urządzeniu Switch hardware.\n\nPozostaw wyłączone w razie braku pewności.", - "DirectMouseTooltip": "Obsługa bezpośredniego dostępu do myszy (HID). Zapewnia dostęp gier do myszy jako urządzenia wskazującego.\n\nDziała tylko z grami, które natywnie obsługują przyciski myszy w urządzeniu Switch, które są nieliczne i daleko między nimi.\n\nPo włączeniu funkcja ekranu dotykowego może nie działać.\n\nPozostaw wyłączone w razie wątpliwości.", - "RegionTooltip": "Zmień Region Systemu", - "LanguageTooltip": "Zmień język systemu", - "TimezoneTooltip": "Zmień Strefę Czasową Systemu", - "TimeTooltip": "Zmień czas systemowy", - "VSyncToggleTooltip": "Synchronizacja pionowa emulowanej konsoli. Zasadniczo ogranicznik klatek dla większości gier; wyłączenie jej może spowodować, że gry będą działać z większą szybkością, ekrany wczytywania wydłużą się lub nawet utkną.\n\nMoże być przełączana w grze za pomocą preferowanego skrótu klawiszowego. Zalecamy to zrobić, jeśli planujesz ją wyłączyć.\n\nW razie wątpliwości pozostaw WŁĄCZONĄ.", - "PptcToggleTooltip": "Zapisuje przetłumaczone funkcje JIT, dzięki czemu nie muszą być tłumaczone za każdym razem, gdy gra się ładuje.\n\nZmniejsza zacinanie się i znacznie przyspiesza uruchamianie po pierwszym uruchomieniu gry.\n\nJeśli nie masz pewności, pozostaw WŁĄCZONE", - "LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", - "FsIntegrityToggleTooltip": "Sprawdza pliki podczas uruchamiania gry i jeśli zostaną wykryte uszkodzone pliki, wyświetla w dzienniku błąd hash.\n\nNie ma wpływu na wydajność i ma pomóc w rozwiązywaniu problemów.\n\nPozostaw WŁĄCZONE, jeśli nie masz pewności.", - "AudioBackendTooltip": "Zmienia backend używany do renderowania dźwięku.\n\nSDL2 jest preferowany, podczas gdy OpenAL i SoundIO są używane jako rezerwy. Dummy nie będzie odtwarzać dźwięku.\n\nW razie wątpliwości ustaw SDL2.", - "MemoryManagerTooltip": "Zmień sposób mapowania i uzyskiwania dostępu do pamięci gości. Znacznie wpływa na wydajność emulowanego procesora.\n\nUstaw na HOST UNCHECKED, jeśli nie masz pewności.", - "MemoryManagerSoftwareTooltip": "Użyj tabeli stron oprogramowania do translacji adresów. Najwyższa celność, ale najwolniejsza wydajność.", - "MemoryManagerHostTooltip": "Bezpośrednio mapuj pamięć w przestrzeni adresowej hosta. Znacznie szybsza kompilacja i wykonanie JIT.", - "MemoryManagerUnsafeTooltip": "Bezpośrednio mapuj pamięć, ale nie maskuj adresu w przestrzeni adresowej gościa przed uzyskaniem dostępu. Szybciej, ale kosztem bezpieczeństwa. Aplikacja gościa może uzyskać dostęp do pamięci z dowolnego miejsca w Ryujinx, więc w tym trybie uruchamiaj tylko programy, którym ufasz.", - "UseHypervisorTooltip": "Użyj Hiperwizora zamiast JIT. Znacznie poprawia wydajność, gdy jest dostępny, ale może być niestabilny w swoim obecnym stanie ", - "DRamTooltip": "Wykorzystuje alternatywny układ MemoryMode, aby naśladować model rozwojowy Switcha.\n\nJest to przydatne tylko w przypadku pakietów tekstur o wyższej rozdzielczości lub modów w rozdzielczości 4k. NIE poprawia wydajności.\n\nW razie wątpliwości pozostaw WYŁĄCZONE.", - "IgnoreMissingServicesTooltip": "Ignoruje niezaimplementowane usługi Horizon OS. Może to pomóc w ominięciu awarii podczas uruchamiania niektórych gier.\n\nW razie wątpliwości pozostaw WYŁĄCZONE.", - "IgnoreAppletTooltip": "Zewnętrzny dialog \"Controller Applet\" nie pojawi się, jeśli gamepad zostanie odłączony podczas rozgrywki. Nie pojawi się monit o zamknięcie dialogu lub skonfigurowanie nowego kontrolera. Po ponownym podłączeniu poprzednio odłączonego kontrolera gra zostanie automatycznie wznowiona.", - "GraphicsBackendThreadingTooltip": "Wykonuje polecenia backend'u graficznego w drugim wątku.\n\nPrzyspiesza kompilację shaderów, zmniejsza zacinanie się i poprawia wydajność sterowników GPU bez własnej obsługi wielowątkowości. Nieco lepsza wydajność w sterownikach z wielowątkowością.\n\nUstaw na AUTO, jeśli nie masz pewności.", - "GalThreadingTooltip": "Wykonuje polecenia backend'u graficznego w drugim wątku.\n\nPrzyspiesza kompilację shaderów, zmniejsza zacinanie się i poprawia wydajność sterowników GPU bez własnej obsługi wielowątkowości. Nieco lepsza wydajność w sterownikach z wielowątkowością.\n\nUstaw na AUTO, jeśli nie masz pewności.", - "ShaderCacheToggleTooltip": "Zapisuje pamięć podręczną shaderów na dysku, co zmniejsza zacinanie się w kolejnych uruchomieniach.\n\nPozostaw WŁĄCZONE, jeśli nie masz pewności.", - "ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.", - "ResolutionScaleEntryTooltip": "Skala rozdzielczości zmiennoprzecinkowej, np. 1,5. Skale niecałkowite częściej powodują problemy lub awarie.", - "AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.", - "AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.", - "ShaderDumpPathTooltip": "Ścieżka Zrzutu Shaderów Grafiki", - "FileLogTooltip": "Zapisuje logowanie konsoli w pliku dziennika na dysku. Nie wpływa na wydajność.", - "StubLogTooltip": "Wyświetla w konsoli skrótowe komunikaty dziennika. Nie wpływa na wydajność.", - "InfoLogTooltip": "Wyświetla komunikaty dziennika informacyjnego w konsoli. Nie wpływa na wydajność.", - "WarnLogTooltip": "Wyświetla komunikaty dziennika ostrzeżeń w konsoli. Nie wpływa na wydajność.", - "ErrorLogTooltip": "Wyświetla w konsoli komunikaty dziennika błędów. Nie wpływa na wydajność.", - "TraceLogTooltip": "Wyświetla komunikaty dziennika śledzenia w konsoli. Nie wpływa na wydajność.", - "GuestLogTooltip": "Wyświetla komunikaty dziennika gości w konsoli. Nie wpływa na wydajność.", - "FileAccessLogTooltip": "Wyświetla w konsoli komunikaty dziennika dostępu do plików.", - "FSAccessLogModeTooltip": "Włącza wyjście dziennika dostępu FS do konsoli. Możliwe tryby to 0-3", - "DeveloperOptionTooltip": "Używaj ostrożnie", - "OpenGlLogLevel": "Wymaga włączonych odpowiednich poziomów logów", - "DebugLogTooltip": "Wyświetla komunikaty dziennika debugowania w konsoli.\n\nUżywaj tego tylko na wyraźne polecenie członka załogi, ponieważ utrudni to odczytanie dzienników i pogorszy wydajność emulatora.", - "LoadApplicationFileTooltip": "Otwórz eksplorator plików, aby wybrać plik kompatybilny z Switch do wczytania", - "LoadApplicationFolderTooltip": "Otwórz eksplorator plików, aby wybrać zgodną z Switch, rozpakowaną aplikację do załadowania", - "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from", - "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from", - "OpenRyujinxFolderTooltip": "Otwórz folder systemu plików Ryujinx", - "OpenRyujinxLogsTooltip": "Otwiera folder, w którym zapisywane są logi", - "ExitTooltip": "Wyjdź z Ryujinx", - "OpenSettingsTooltip": "Otwórz okno ustawień", - "OpenProfileManagerTooltip": "Otwórz okno Menedżera Profili Użytkownika", - "StopEmulationTooltip": "Zatrzymaj emulację bieżącej gry i wróć do wyboru gier", - "CheckUpdatesTooltip": "Sprawdź aktualizacje Ryujinx", - "OpenAboutTooltip": "Otwórz Okno Informacje", - "GridSize": "Wielkość siatki", - "GridSizeTooltip": "Zmień rozmiar elementów siatki", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Brazylijski Portugalski", - "AboutRyujinxContributorsButtonHeader": "Zobacz Wszystkich Współtwórców", - "SettingsTabSystemAudioVolume": "Głośność: ", - "AudioVolumeTooltip": "Zmień Głośność Dźwięku", - "SettingsTabSystemEnableInternetAccess": "Dostęp do Internetu Gościa/Tryb LAN", - "EnableInternetAccessTooltip": "Pozwala emulowanej aplikacji na łączenie się z Internetem.\n\nGry w trybie LAN mogą łączyć się ze sobą, gdy ta opcja jest włączona, a systemy są połączone z tym samym punktem dostępu. Dotyczy to również prawdziwych konsol.\n\nNie pozwala na łączenie się z serwerami Nintendo. Może powodować awarie niektórych gier, które próbują połączyć się z Internetem.\n\nPozostaw WYŁĄCZONE, jeśli nie masz pewności.", - "GameListContextMenuManageCheatToolTip": "Zarządzaj Kodami", - "GameListContextMenuManageCheat": "Zarządzaj Kodami", - "GameListContextMenuManageModToolTip": "Zarządzaj modyfikacjami", - "GameListContextMenuManageMod": "Zarządzaj modyfikacjami", - "ControllerSettingsStickRange": "Zasięg:", - "DialogStopEmulationTitle": "Ryujinx - Zatrzymaj Emulację", - "DialogStopEmulationMessage": "Czy na pewno chcesz zatrzymać emulację?", - "SettingsTabCpu": "CPU", - "SettingsTabAudio": "Dżwięk", - "SettingsTabNetwork": "Sieć", - "SettingsTabNetworkConnection": "Połączenie Sieciowe", - "SettingsTabCpuCache": "Cache CPU", - "SettingsTabCpuMemory": "Pamięć CPU", - "DialogUpdaterFlatpakNotSupportedMessage": "Zaktualizuj Ryujinx przez FlatHub.", - "UpdaterDisabledWarningTitle": "Aktualizator Wyłączony!", - "ControllerSettingsRotate90": "Obróć o 90° w Prawo", - "IconSize": "Rozmiar ikon", - "IconSizeTooltip": "Zmień rozmiar ikon gry", - "MenuBarOptionsShowConsole": "Pokaż Konsolę", - "ShaderCachePurgeError": "Błąd podczas czyszczenia cache shaderów w {0}: {1}", - "UserErrorNoKeys": "Nie znaleziono kluczy", - "UserErrorNoFirmware": "Nie znaleziono firmware'u", - "UserErrorFirmwareParsingFailed": "Błąd parsowania firmware'u", - "UserErrorApplicationNotFound": "Aplikacja nie znaleziona", - "UserErrorUnknown": "Nieznany błąd", - "UserErrorUndefined": "Niezdefiniowany błąd", - "UserErrorNoKeysDescription": "Ryujinx nie mógł znaleźć twojego pliku 'prod.keys'", - "UserErrorNoFirmwareDescription": "Ryujinx nie mógł znaleźć żadnego zainstalowanego firmware'u", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx nie był w stanie zparsować dostarczonego firmware'u. Jest to zwykle spowodowane nieaktualnymi kluczami.", - "UserErrorApplicationNotFoundDescription": "Ryujinx nie mógł znaleźć prawidłowej aplikacji na podanej ścieżce.", - "UserErrorUnknownDescription": "Wystąpił nieznany błąd!", - "UserErrorUndefinedDescription": "Wystąpił niezdefiniowany błąd! To nie powinno się zdarzyć, skontaktuj się z deweloperem!", - "OpenSetupGuideMessage": "Otwórz Podręcznik Konfiguracji", - "NoUpdate": "Brak Aktualizacji", - "TitleUpdateVersionLabel": "Wersja {0} - {1}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - Info", - "RyujinxConfirm": "Ryujinx - Potwierdzenie", - "FileDialogAllTypes": "Wszystkie typy", - "Never": "Nigdy", - "SwkbdMinCharacters": "Musi mieć co najmniej {0} znaków", - "SwkbdMinRangeCharacters": "Musi mieć długość od {0}-{1} znaków", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Klawiatura Oprogramowania", - "SoftwareKeyboardModeNumeric": "Może składać się jedynie z 0-9 lub '.'", - "SoftwareKeyboardModeAlphabet": "Nie może zawierać znaków CJK", - "SoftwareKeyboardModeASCII": "Musi zawierać tylko tekst ASCII", - "ControllerAppletControllers": "Obsługiwane Kontrolery:", - "ControllerAppletPlayers": "Gracze:", - "ControllerAppletDescription": "Twoja aktualna konfiguracja jest nieprawidłowa. Otwórz ustawienia i skonfiguruj swoje wejścia.", - "ControllerAppletDocked": "Ustawiony tryb zadokowany. Sterowanie przenośne powinno być wyłączone.", - "UpdaterRenaming": "Zmienianie Nazw Starych Plików...", - "UpdaterRenameFailed": "Aktualizator nie mógł zmienić nazwy pliku: {0}", - "UpdaterAddingFiles": "Dodawanie Nowych Plików...", - "UpdaterExtracting": "Wypakowywanie Aktualizacji...", - "UpdaterDownloading": "Pobieranie Aktualizacji...", - "Docked": "Zadokowany", - "Handheld": "Przenośny", - "ConnectionError": "Błąd Połączenia.", - "AboutPageDeveloperListMore": "{0} i więcej...", - "ApiError": "Błąd API.", - "LoadingHeading": "Wczytywanie {0}", - "CompilingPPTC": "Kompilowanie PTC", - "CompilingShaders": "Kompilowanie Shaderów", - "AllKeyboards": "Wszystkie klawiatury", - "OpenFileDialogTitle": "Wybierz obsługiwany plik do otwarcia", - "OpenFolderDialogTitle": "Wybierz folder z rozpakowaną grą", - "AllSupportedFormats": "Wszystkie Obsługiwane Formaty", - "RyujinxUpdater": "Aktualizator Ryujinx", - "SettingsTabHotkeys": "Skróty Klawiszowe Klawiatury", - "SettingsTabHotkeysHotkeys": "Skróty Klawiszowe Klawiatury", - "SettingsTabHotkeysToggleVsyncHotkey": "Przełącz VSync:", - "SettingsTabHotkeysScreenshotHotkey": "Zrzut Ekranu:", - "SettingsTabHotkeysShowUiHotkey": "Pokaż UI:", - "SettingsTabHotkeysPauseHotkey": "Pauza:", - "SettingsTabHotkeysToggleMuteHotkey": "Wycisz:", - "ControllerMotionTitle": "Ustawienia Sterowania Ruchowego", - "ControllerRumbleTitle": "Ustawienia Wibracji", - "SettingsSelectThemeFileDialogTitle": "Wybierz Plik Motywu", - "SettingsXamlThemeFile": "Plik Motywu Xaml", - "AvatarWindowTitle": "Zarządzaj Kontami — Avatar", - "Amiibo": "Amiibo", - "Unknown": "Nieznane", - "Usage": "Użycie", - "Writable": "Zapisywalne", - "SelectDlcDialogTitle": "Wybierz pliki DLC", - "SelectUpdateDialogTitle": "Wybierz pliki aktualizacji", - "SelectModDialogTitle": "Wybierz katalog modów", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "Menedżer Profili Użytkowników", - "CheatWindowTitle": "Menedżer Kodów", - "DlcWindowTitle": "Menedżer Zawartości do Pobrania", - "ModWindowTitle": "Zarządzaj modami dla {0} ({1})", - "UpdateWindowTitle": "Menedżer Aktualizacji Tytułu", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} new update(s) added", - "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.", - "CheatWindowHeading": "Kody Dostępne dla {0} [{1}]", - "BuildId": "Identyfikator wersji:", - "DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.", - "DlcWindowHeading": "{0} Zawartości do Pobrania dostępna dla {1} ({2})", - "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} new update(s) added", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "{0} Mod(y/ów)", - "UserProfilesEditProfile": "Edytuj Zaznaczone", - "Continue": "Continue", - "Cancel": "Anuluj", - "Save": "Zapisz", - "Discard": "Odrzuć", - "Paused": "Wstrzymano", - "UserProfilesSetProfileImage": "Ustaw Obraz Profilu", - "UserProfileEmptyNameError": "Nazwa jest wymagana", - "UserProfileNoImageError": "Należy ustawić obraz profilowy", - "GameUpdateWindowHeading": "{0} Aktualizacje dostępne dla {1} ({2})", - "SettingsTabHotkeysResScaleUpHotkey": "Zwiększ Rozdzielczość:", - "SettingsTabHotkeysResScaleDownHotkey": "Zmniejsz Rozdzielczość:", - "UserProfilesName": "Nazwa:", - "UserProfilesUserId": "ID Użytkownika:", - "SettingsTabGraphicsBackend": "Backend Graficzny", - "SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.", - "SettingsEnableTextureRecompression": "Włącz Rekompresję Tekstur", - "SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.", - "SettingsTabGraphicsPreferredGpu": "Preferowane GPU", - "SettingsTabGraphicsPreferredGpuTooltip": "Wybierz kartę graficzną, która będzie używana z backendem graficznym Vulkan.\n\nNie wpływa na GPU używane przez OpenGL.\n\nW razie wątpliwości ustaw flagę GPU jako \"dGPU\". Jeśli żadnej nie ma, pozostaw nietknięte.", - "SettingsAppRequiredRestartMessage": "Wymagane Zrestartowanie Ryujinx", - "SettingsGpuBackendRestartMessage": "Zmieniono ustawienia Backendu Graficznego lub GPU. Będzie to wymagało ponownego uruchomienia", - "SettingsGpuBackendRestartSubMessage": "Czy chcesz zrestartować teraz?", - "RyujinxUpdaterMessage": "Czy chcesz zaktualizować Ryujinx do najnowszej wersji?", - "SettingsTabHotkeysVolumeUpHotkey": "Zwiększ Głośność:", - "SettingsTabHotkeysVolumeDownHotkey": "Zmniejsz Głośność:", - "SettingsEnableMacroHLE": "Włącz Macro HLE", - "SettingsEnableMacroHLETooltip": "Wysokopoziomowa emulacja kodu GPU Macro.\n\nPoprawia wydajność, ale może powodować błędy graficzne w niektórych grach.\n\nW razie wątpliwości pozostaw WŁĄCZONE.", - "SettingsEnableColorSpacePassthrough": "Przekazywanie przestrzeni kolorów", - "SettingsEnableColorSpacePassthroughTooltip": "Nakazuje API Vulkan przekazywać informacje o kolorze bez określania przestrzeni kolorów. Dla użytkowników z wyświetlaczami o szerokim zakresie kolorów może to skutkować bardziej żywymi kolorami, kosztem ich poprawności.", - "VolumeShort": "Głoś", - "UserProfilesManageSaves": "Zarządzaj Zapisami", - "DeleteUserSave": "Czy chcesz usunąć zapis użytkownika dla tej gry?", - "IrreversibleActionNote": "Ta czynność nie jest odwracalna.", - "SaveManagerHeading": "Zarządzaj Zapisami dla {0}", - "SaveManagerTitle": "Menedżer Zapisów", - "Name": "Nazwa", - "Size": "Rozmiar", - "Search": "Wyszukaj", - "UserProfilesRecoverLostAccounts": "Odzyskaj Utracone Konta", - "Recover": "Odzyskaj", - "UserProfilesRecoverHeading": "Znaleziono zapisy dla następujących kont", - "UserProfilesRecoverEmptyList": "Brak profili do odzyskania", - "GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.", - "GraphicsAALabel": "Antyaliasing:", - "GraphicsScalingFilterLabel": "Filtr skalowania:", - "GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", - "GraphicsScalingFilterBilinear": "Dwuliniowe", - "GraphicsScalingFilterNearest": "Najbliższe", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "Poziom", - "GraphicsScalingFilterLevelTooltip": "Ustaw poziom ostrzeżenia FSR 1.0. Wyższy jest ostrzejszy.", - "SmaaLow": "SMAA Niskie", - "SmaaMedium": "SMAA Średnie", - "SmaaHigh": "SMAA Wysokie", - "SmaaUltra": "SMAA Ultra", - "UserEditorTitle": "Edytuj użytkownika", - "UserEditorTitleCreate": "Utwórz użytkownika", - "SettingsTabNetworkInterface": "Interfejs sieci:", - "NetworkInterfaceTooltip": "Interfejs sieciowy używany dla funkcji LAN/LDN.\n\nw połączeniu z VPN lub XLink Kai i grą z obsługą sieci LAN, może być użyty do spoofowania połączenia z tą samą siecią przez Internet.\n\nZostaw DOMYŚLNE, jeśli nie ma pewności.", - "NetworkInterfaceDefault": "Domyślny", - "PackagingShaders": "Pakuje Shadery ", - "AboutChangelogButton": "Zobacz listę zmian na GitHubie", - "AboutChangelogButtonTooltipMessage": "Kliknij, aby otworzyć listę zmian dla tej wersji w domyślnej przeglądarce.", - "SettingsTabNetworkMultiplayer": "Gra Wieloosobowa", - "MultiplayerMode": "Tryb:", - "MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.", - "MultiplayerModeDisabled": "Wyłączone", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/pt_BR.json b/src/Ryujinx/Assets/Locales/pt_BR.json deleted file mode 100644 index c240bd804..000000000 --- a/src/Ryujinx/Assets/Locales/pt_BR.json +++ /dev/null @@ -1,879 +0,0 @@ -{ - "Language": "Português (BR)", - "MenuBarFileOpenApplet": "Abrir Applet", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Abrir editor Mii em modo avulso", - "SettingsTabInputDirectMouseAccess": "Acesso direto ao mouse", - "SettingsTabSystemMemoryManagerMode": "Modo de gerenciamento de memória:", - "SettingsTabSystemMemoryManagerModeSoftware": "Software", - "SettingsTabSystemMemoryManagerModeHost": "Hóspede (rápido)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Hóspede sem verificação (mais rápido, inseguro)", - "SettingsTabSystemUseHypervisor": "Usar Hipervisor", - "MenuBarFile": "_Arquivo", - "MenuBarFileOpenFromFile": "_Abrir ROM do jogo...", - "MenuBarFileOpenFromFileError": "Nenhum aplicativo encontrado no arquivo selecionado.", - "MenuBarFileOpenUnpacked": "Abrir jogo _extraído...", - "MenuBarFileLoadDlcFromFolder": "Carregar DLC da Pasta", - "MenuBarFileLoadTitleUpdatesFromFolder": "Carregar Atualizações de Jogo da Pasta", - "MenuBarFileOpenEmuFolder": "Abrir diretório do e_mulador...", - "MenuBarFileOpenLogsFolder": "Abrir diretório de _logs...", - "MenuBarFileExit": "_Sair", - "MenuBarOptions": "_Opções", - "MenuBarOptionsToggleFullscreen": "_Mudar para tela cheia", - "MenuBarOptionsStartGamesInFullscreen": "Iniciar jogos em tela cheia", - "MenuBarOptionsStopEmulation": "_Encerrar emulação", - "MenuBarOptionsSettings": "_Configurações", - "MenuBarOptionsManageUserProfiles": "_Gerenciar perfis de usuário", - "MenuBarActions": "_Ações", - "MenuBarOptionsSimulateWakeUpMessage": "_Simular mensagem de acordar console", - "MenuBarActionsScanAmiibo": "Escanear um Amiibo", - "MenuBarTools": "_Ferramentas", - "MenuBarToolsInstallFirmware": "_Instalar firmware", - "MenuBarFileToolsInstallFirmwareFromFile": "Instalar firmware a partir de um arquivo ZIP/XCI", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Instalar firmware a partir de um diretório", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "Gerenciar tipos de arquivo", - "MenuBarToolsInstallFileTypes": "Instalar tipos de arquivo", - "MenuBarToolsUninstallFileTypes": "Desinstalar tipos de arquivos", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_View", - "MenuBarViewWindow": "Window Size", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Ajuda", - "MenuBarHelpCheckForUpdates": "_Verificar se há atualizações", - "MenuBarHelpAbout": "_Sobre", - "MenuSearch": "Buscar...", - "GameListHeaderFavorite": "Favorito", - "GameListHeaderIcon": "Ícone", - "GameListHeaderApplication": "Nome", - "GameListHeaderDeveloper": "Desenvolvedor", - "GameListHeaderVersion": "Versão", - "GameListHeaderTimePlayed": "Tempo de jogo", - "GameListHeaderLastPlayed": "Último jogo", - "GameListHeaderFileExtension": "Extensão", - "GameListHeaderFileSize": "Tamanho", - "GameListHeaderPath": "Caminho", - "GameListContextMenuOpenUserSaveDirectory": "Abrir diretório de saves do usuário", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Abre o diretório que contém jogos salvos para o usuário atual", - "GameListContextMenuOpenDeviceSaveDirectory": "Abrir diretório de saves de dispositivo do usuário", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Abre o diretório que contém saves do dispositivo para o usuário atual", - "GameListContextMenuOpenBcatSaveDirectory": "Abrir diretório de saves BCAT do usuário", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Abre o diretório que contém saves BCAT para o usuário atual", - "GameListContextMenuManageTitleUpdates": "Gerenciar atualizações do jogo", - "GameListContextMenuManageTitleUpdatesToolTip": "Abre a janela de gerenciamento de atualizações", - "GameListContextMenuManageDlc": "Gerenciar DLCs", - "GameListContextMenuManageDlcToolTip": "Abre a janela de gerenciamento de DLCs", - "GameListContextMenuCacheManagement": "Gerenciamento de cache", - "GameListContextMenuCacheManagementPurgePptc": "Limpar cache PPTC", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Deleta o cache PPTC armazenado em disco do jogo", - "GameListContextMenuCacheManagementPurgeShaderCache": "Limpar cache de Shader", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Deleta o cache de Shader armazenado em disco do jogo", - "GameListContextMenuCacheManagementOpenPptcDirectory": "Abrir diretório do cache PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Abre o diretório contendo os arquivos do cache PPTC", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Abrir diretório do cache de Shader", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Abre o diretório contendo os arquivos do cache de Shader", - "GameListContextMenuExtractData": "Extrair dados", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Extrai a seção ExeFS do jogo (incluindo atualizações)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Extrai a seção RomFS do jogo (incluindo atualizações)", - "GameListContextMenuExtractDataLogo": "Logo", - "GameListContextMenuExtractDataLogoToolTip": "Extrai a seção Logo do jogo (incluindo atualizações)", - "GameListContextMenuCreateShortcut": "Criar atalho da aplicação", - "GameListContextMenuCreateShortcutToolTip": "Criar um atalho de área de trabalho que inicia o aplicativo selecionado", - "GameListContextMenuCreateShortcutToolTipMacOS": "Crie um atalho na pasta Aplicativos do macOS que abre o Aplicativo selecionado", - "GameListContextMenuOpenModsDirectory": "Abrir pasta de Mods", - "GameListContextMenuOpenModsDirectoryToolTip": "Abre a pasta que contém os mods da aplicação ", - "GameListContextMenuOpenSdModsDirectory": "Abrir diretório de mods Atmosphere", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} jogos carregados", - "StatusBarSystemVersion": "Versão do firmware: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Limite baixo para mapeamentos de memória detectado", - "LinuxVmMaxMapCountDialogTextPrimary": "Você gostaria de aumentar o valor de vm.max_map_count para {0}", - "LinuxVmMaxMapCountDialogTextSecondary": "Alguns jogos podem tentar criar mais mapeamentos de memória do que o atualmente permitido. Ryujinx irá falhar assim que este limite for excedido.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Sim, até a próxima reinicialização", - "LinuxVmMaxMapCountDialogButtonPersistent": "Sim, permanentemente", - "LinuxVmMaxMapCountWarningTextPrimary": "A quantidade máxima de mapeamentos de memória é menor que a recomendada.", - "LinuxVmMaxMapCountWarningTextSecondary": "O valor atual de vm.max_map_count ({0}) é menor que {1}. Alguns jogos podem tentar criar mais mapeamentos de memória do que o permitido no momento. Ryujinx vai falhar assim que este limite for excedido.\n\nTalvez você queira aumentar o limite manualmente ou instalar pkexec, o que permite que Ryujinx ajude com isso.", - "Settings": "Configurações", - "SettingsTabGeneral": "Geral", - "SettingsTabGeneralGeneral": "Geral", - "SettingsTabGeneralEnableDiscordRichPresence": "Habilitar Rich Presence do Discord", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Verificar se há atualizações ao iniciar", - "SettingsTabGeneralShowConfirmExitDialog": "Exibir diálogo de confirmação ao sair", - "SettingsTabGeneralRememberWindowState": "Lembrar tamanho/posição da Janela", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "Esconder o cursor do mouse:", - "SettingsTabGeneralHideCursorNever": "Nunca", - "SettingsTabGeneralHideCursorOnIdle": "Esconder o cursor quando ocioso", - "SettingsTabGeneralHideCursorAlways": "Sempre", - "SettingsTabGeneralGameDirectories": "Diretórios de jogo", - "SettingsTabGeneralAutoloadDirectories": "Carregar Automaticamente Diretórios de DLC/Atualizações", - "SettingsTabGeneralAutoloadNote": "DLCs e Atualizações que se referem a arquivos ausentes serão descarregadas automaticamente", - "SettingsTabGeneralAdd": "Adicionar", - "SettingsTabGeneralRemove": "Remover", - "SettingsTabSystem": "Sistema", - "SettingsTabSystemCore": "Principal", - "SettingsTabSystemSystemRegion": "Região do sistema:", - "SettingsTabSystemSystemRegionJapan": "Japão", - "SettingsTabSystemSystemRegionUSA": "EUA", - "SettingsTabSystemSystemRegionEurope": "Europa", - "SettingsTabSystemSystemRegionAustralia": "Austrália", - "SettingsTabSystemSystemRegionChina": "China", - "SettingsTabSystemSystemRegionKorea": "Coreia", - "SettingsTabSystemSystemRegionTaiwan": "Taiwan", - "SettingsTabSystemSystemLanguage": "Idioma do sistema:", - "SettingsTabSystemSystemLanguageJapanese": "Japonês", - "SettingsTabSystemSystemLanguageAmericanEnglish": "Inglês americano", - "SettingsTabSystemSystemLanguageFrench": "Francês", - "SettingsTabSystemSystemLanguageGerman": "Alemão", - "SettingsTabSystemSystemLanguageItalian": "Italiano", - "SettingsTabSystemSystemLanguageSpanish": "Espanhol", - "SettingsTabSystemSystemLanguageChinese": "Chinês", - "SettingsTabSystemSystemLanguageKorean": "Coreano", - "SettingsTabSystemSystemLanguageDutch": "Holandês", - "SettingsTabSystemSystemLanguagePortuguese": "Português", - "SettingsTabSystemSystemLanguageRussian": "Russo", - "SettingsTabSystemSystemLanguageTaiwanese": "Taiwanês", - "SettingsTabSystemSystemLanguageBritishEnglish": "Inglês britânico", - "SettingsTabSystemSystemLanguageCanadianFrench": "Francês canadense", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Espanhol latino", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Chinês simplificado", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Chinês tradicional", - "SettingsTabSystemSystemTimeZone": "Fuso horário do sistema:", - "SettingsTabSystemSystemTime": "Hora do sistema:", - "SettingsTabSystemEnableVsync": "Habilitar sincronia vertical", - "SettingsTabSystemEnablePptc": "Habilitar PPTC (Profiled Persistent Translation Cache)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "Habilitar verificação de integridade do sistema de arquivos", - "SettingsTabSystemAudioBackend": "Biblioteca de saída de áudio:", - "SettingsTabSystemAudioBackendDummy": "Nenhuma", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "Hacks", - "SettingsTabSystemHacksNote": " (Pode causar instabilidade)", - "SettingsTabSystemDramSize": "Tamanho da DRAM:", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "Ignorar serviços não implementados", - "SettingsTabSystemIgnoreApplet": "Ignorar applet", - "SettingsTabGraphics": "Gráficos", - "SettingsTabGraphicsAPI": "API gráfica", - "SettingsTabGraphicsEnableShaderCache": "Habilitar cache de shader", - "SettingsTabGraphicsAnisotropicFiltering": "Filtragem anisotrópica:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Automático", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "Escala de resolução:", - "SettingsTabGraphicsResolutionScaleCustom": "Customizada (não recomendado)", - "SettingsTabGraphicsResolutionScaleNative": "Nativa (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (não recomendado)", - "SettingsTabGraphicsAspectRatio": "Proporção:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "Esticar até caber", - "SettingsTabGraphicsDeveloperOptions": "Opções do desenvolvedor", - "SettingsTabGraphicsShaderDumpPath": "Diretório para despejo de shaders:", - "SettingsTabLogging": "Log", - "SettingsTabLoggingLogging": "Log", - "SettingsTabLoggingEnableLoggingToFile": "Salvar logs em arquivo", - "SettingsTabLoggingEnableStubLogs": "Habilitar logs de stub", - "SettingsTabLoggingEnableInfoLogs": "Habilitar logs de informação", - "SettingsTabLoggingEnableWarningLogs": "Habilitar logs de alerta", - "SettingsTabLoggingEnableErrorLogs": "Habilitar logs de erro", - "SettingsTabLoggingEnableTraceLogs": "Habilitar logs de rastreamento", - "SettingsTabLoggingEnableGuestLogs": "Habilitar logs do programa convidado", - "SettingsTabLoggingEnableFsAccessLogs": "Habilitar logs de acesso ao sistema de arquivos", - "SettingsTabLoggingFsGlobalAccessLogMode": "Modo global de logs do sistema de arquivos:", - "SettingsTabLoggingDeveloperOptions": "Opções do desenvolvedor (AVISO: Vai reduzir a performance)", - "SettingsTabLoggingDeveloperOptionsNote": "AVISO: Reduzirá o desempenho", - "SettingsTabLoggingGraphicsBackendLogLevel": "Nível de log do backend gráfico:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "Nenhum", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Erro", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Lentidão", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "Todos", - "SettingsTabLoggingEnableDebugLogs": "Habilitar logs de depuração", - "SettingsTabInput": "Controle", - "SettingsTabInputEnableDockedMode": "Habilitar modo TV", - "SettingsTabInputDirectKeyboardAccess": "Acesso direto ao teclado", - "SettingsButtonSave": "Salvar", - "SettingsButtonClose": "Fechar", - "SettingsButtonOk": "OK", - "SettingsButtonCancel": "Cancelar", - "SettingsButtonApply": "Aplicar", - "ControllerSettingsPlayer": "Jogador", - "ControllerSettingsPlayer1": "Jogador 1", - "ControllerSettingsPlayer2": "Jogador 2", - "ControllerSettingsPlayer3": "Jogador 3", - "ControllerSettingsPlayer4": "Jogador 4", - "ControllerSettingsPlayer5": "Jogador 5", - "ControllerSettingsPlayer6": "Jogador 6", - "ControllerSettingsPlayer7": "Jogador 7", - "ControllerSettingsPlayer8": "Jogador 8", - "ControllerSettingsHandheld": "Portátil", - "ControllerSettingsInputDevice": "Dispositivo de entrada", - "ControllerSettingsRefresh": "Atualizar", - "ControllerSettingsDeviceDisabled": "Desabilitado", - "ControllerSettingsControllerType": "Tipo do controle", - "ControllerSettingsControllerTypeHandheld": "Portátil", - "ControllerSettingsControllerTypeProController": "Pro Controller", - "ControllerSettingsControllerTypeJoyConPair": "Par de JoyCon", - "ControllerSettingsControllerTypeJoyConLeft": "JoyCon esquerdo", - "ControllerSettingsControllerTypeJoyConRight": "JoyCon direito", - "ControllerSettingsProfile": "Perfil", - "ControllerSettingsProfileDefault": "Padrão", - "ControllerSettingsLoad": "Carregar", - "ControllerSettingsAdd": "Adicionar", - "ControllerSettingsRemove": "Remover", - "ControllerSettingsButtons": "Botões", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Direcional", - "ControllerSettingsDPadUp": "Cima", - "ControllerSettingsDPadDown": "Baixo", - "ControllerSettingsDPadLeft": "Esquerda", - "ControllerSettingsDPadRight": "Direita", - "ControllerSettingsStickButton": "Botão", - "ControllerSettingsStickUp": "Cima", - "ControllerSettingsStickDown": "Baixo", - "ControllerSettingsStickLeft": "Esquerda", - "ControllerSettingsStickRight": "Direita", - "ControllerSettingsStickStick": "Analógico", - "ControllerSettingsStickInvertXAxis": "Inverter eixo X", - "ControllerSettingsStickInvertYAxis": "Inverter eixo Y", - "ControllerSettingsStickDeadzone": "Zona morta:", - "ControllerSettingsLStick": "Analógico esquerdo", - "ControllerSettingsRStick": "Analógico direito", - "ControllerSettingsTriggersLeft": "Gatilhos esquerda", - "ControllerSettingsTriggersRight": "Gatilhos direita", - "ControllerSettingsTriggersButtonsLeft": "Botões de gatilho esquerda", - "ControllerSettingsTriggersButtonsRight": "Botões de gatilho direita", - "ControllerSettingsTriggers": "Gatilhos", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Botões esquerda", - "ControllerSettingsExtraButtonsRight": "Botões direita", - "ControllerSettingsMisc": "Miscelâneas", - "ControllerSettingsTriggerThreshold": "Sensibilidade do gatilho:", - "ControllerSettingsMotion": "Sensor de movimento", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Usar sensor compatível com CemuHook", - "ControllerSettingsMotionControllerSlot": "Slot do controle:", - "ControllerSettingsMotionMirrorInput": "Espelhar movimento", - "ControllerSettingsMotionRightJoyConSlot": "Slot do JoyCon direito:", - "ControllerSettingsMotionServerHost": "Endereço do servidor:", - "ControllerSettingsMotionGyroSensitivity": "Sensibilidade do giroscópio:", - "ControllerSettingsMotionGyroDeadzone": "Zona morta do giroscópio:", - "ControllerSettingsSave": "Salvar", - "ControllerSettingsClose": "Fechar", - "KeyUnknown": "Unknown", - "KeyShiftLeft": "Shift Left", - "KeyShiftRight": "Shift Right", - "KeyControlLeft": "Ctrl Left", - "KeyMacControlLeft": "⌃ Left", - "KeyControlRight": "Ctrl Right", - "KeyMacControlRight": "⌃ Right", - "KeyAltLeft": "Alt Left", - "KeyMacAltLeft": "⌥ Left", - "KeyAltRight": "Alt Right", - "KeyMacAltRight": "⌥ Right", - "KeyWinLeft": "⊞ Left", - "KeyMacWinLeft": "⌘ Left", - "KeyWinRight": "⊞ Right", - "KeyMacWinRight": "⌘ Right", - "KeyMenu": "Menu", - "KeyUp": "Up", - "KeyDown": "Down", - "KeyLeft": "Left", - "KeyRight": "Right", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Right", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Left Trigger 0", - "GamepadSingleRightTrigger0": "Right Trigger 0", - "GamepadSingleLeftTrigger1": "Left Trigger 1", - "GamepadSingleRightTrigger1": "Right Trigger 1", - "StickLeft": "Left Stick", - "StickRight": "Right Stick", - "UserProfilesSelectedUserProfile": "Perfil de usuário selecionado:", - "UserProfilesSaveProfileName": "Salvar nome de perfil", - "UserProfilesChangeProfileImage": "Mudar imagem de perfil", - "UserProfilesAvailableUserProfiles": "Perfis de usuário disponíveis:", - "UserProfilesAddNewProfile": "Adicionar novo perfil", - "UserProfilesDelete": "Apagar", - "UserProfilesClose": "Fechar", - "ProfileNameSelectionWatermark": "Escolha um apelido", - "ProfileImageSelectionTitle": "Seleção da imagem de perfil", - "ProfileImageSelectionHeader": "Escolha uma imagem de perfil", - "ProfileImageSelectionNote": "Você pode importar uma imagem customizada, ou selecionar um avatar do firmware", - "ProfileImageSelectionImportImage": "Importar arquivo de imagem", - "ProfileImageSelectionSelectAvatar": "Selecionar avatar do firmware", - "InputDialogTitle": "Diálogo de texto", - "InputDialogOk": "OK", - "InputDialogCancel": "Cancelar", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "Escolha o nome de perfil", - "InputDialogAddNewProfileHeader": "Escreva o nome do perfil", - "InputDialogAddNewProfileSubtext": "(Máximo de caracteres: {0})", - "AvatarChoose": "Escolher", - "AvatarSetBackgroundColor": "Definir cor de fundo", - "AvatarClose": "Fechar", - "ControllerSettingsLoadProfileToolTip": "Carregar perfil", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "Adicionar perfil", - "ControllerSettingsRemoveProfileToolTip": "Remover perfil", - "ControllerSettingsSaveProfileToolTip": "Salvar perfil", - "MenuBarFileToolsTakeScreenshot": "Salvar captura de tela", - "MenuBarFileToolsHideUi": "Esconder Interface", - "GameListContextMenuRunApplication": "Executar Aplicativo", - "GameListContextMenuToggleFavorite": "Alternar favorito", - "GameListContextMenuToggleFavoriteToolTip": "Marca ou desmarca jogo como favorito", - "SettingsTabGeneralTheme": "Tema:", - "SettingsTabGeneralThemeDark": "Escuro", - "SettingsTabGeneralThemeAuto": "Automático", - "SettingsTabGeneralThemeLight": "Claro", - "ControllerSettingsConfigureGeneral": "Configurar", - "ControllerSettingsRumble": "Vibração", - "ControllerSettingsRumbleStrongMultiplier": "Multiplicador de vibração forte", - "ControllerSettingsRumbleWeakMultiplier": "Multiplicador de vibração fraca", - "DialogMessageSaveNotAvailableMessage": "Não há jogos salvos para {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "Gostaria de criar o diretório de salvamento para esse jogo?", - "DialogConfirmationTitle": "Ryujinx - Confirmação", - "DialogUpdaterTitle": "Ryujinx - Atualizador", - "DialogErrorTitle": "Ryujinx - Erro", - "DialogWarningTitle": "Ryujinx - Alerta", - "DialogExitTitle": "Ryujinx - Sair", - "DialogErrorMessage": "Ryujinx encontrou um erro", - "DialogExitMessage": "Tem certeza que deseja fechar o Ryujinx?", - "DialogExitSubMessage": "Todos os dados que não foram salvos serão perdidos!", - "DialogMessageCreateSaveErrorMessage": "Ocorreu um erro ao criar o diretório de salvamento: {0}", - "DialogMessageFindSaveErrorMessage": "Ocorreu um erro ao tentar encontrar o diretório de salvamento: {0}", - "FolderDialogExtractTitle": "Escolha o diretório onde os arquivos serão extraídos", - "DialogNcaExtractionMessage": "Extraindo seção {0} de {1}...", - "DialogNcaExtractionTitle": "Extrator de seções NCA", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Falha na extração. O NCA principal não foi encontrado no arquivo selecionado.", - "DialogNcaExtractionCheckLogErrorMessage": "Falha na extração. Leia o arquivo de log para mais informações.", - "DialogNcaExtractionSuccessMessage": "Extração concluída com êxito.", - "DialogUpdaterConvertFailedMessage": "Falha ao converter a versão atual do Ryujinx.", - "DialogUpdaterCancelUpdateMessage": "Cancelando atualização!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "Você já está usando a versão mais recente do Ryujinx!", - "DialogUpdaterFailedToGetVersionMessage": "Ocorreu um erro ao tentar obter as informações de atualização do GitHub Release. Isso pode ser causado se uma nova versão estiver sendo compilado pelas Ações do GitHub. Tente novamente em alguns minutos.", - "DialogUpdaterConvertFailedGithubMessage": "Falha ao converter a versão do Ryujinx recebida do AppVeyor.", - "DialogUpdaterDownloadingMessage": "Baixando atualização...", - "DialogUpdaterExtractionMessage": "Extraindo atualização...", - "DialogUpdaterRenamingMessage": "Renomeando atualização...", - "DialogUpdaterAddingFilesMessage": "Adicionando nova atualização...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "Atualização concluída!", - "DialogUpdaterRestartMessage": "Deseja reiniciar o Ryujinx agora?", - "DialogUpdaterNoInternetMessage": "Você não está conectado à Internet!", - "DialogUpdaterNoInternetSubMessage": "Por favor, certifique-se de que você tem uma conexão funcional à Internet!", - "DialogUpdaterDirtyBuildMessage": "Você não pode atualizar uma compilação Dirty do Ryujinx!", - "DialogUpdaterDirtyBuildSubMessage": "Por favor, baixe o Ryujinx em https://ryujinx.app/download se está procurando por uma versão suportada.", - "DialogRestartRequiredMessage": "Reinicialização necessária", - "DialogThemeRestartMessage": "O tema foi salvo. Uma reinicialização é necessária para aplicar o tema.", - "DialogThemeRestartSubMessage": "Deseja reiniciar?", - "DialogFirmwareInstallEmbeddedMessage": "Gostaria de instalar o firmware incluso neste jogo? (Firmware {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "Nenhum firmware instalado foi encontrado, mas o Ryujinx conseguiu instalar o firmware {0} a partir do jogo fornecido.\nO emulador será iniciado agora.", - "DialogFirmwareNoFirmwareInstalledMessage": "Firmware não foi instalado", - "DialogFirmwareInstalledMessage": "Firmware {0} foi instalado", - "DialogInstallFileTypesSuccessMessage": "Tipos de arquivo instalados com sucesso!", - "DialogInstallFileTypesErrorMessage": "Falha ao instalar tipos de arquivo.", - "DialogUninstallFileTypesSuccessMessage": "Tipos de arquivo desinstalados com sucesso!", - "DialogUninstallFileTypesErrorMessage": "Falha ao desinstalar tipos de arquivo.", - "DialogOpenSettingsWindowLabel": "Abrir janela de configurações", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "Applet de controle", - "DialogMessageDialogErrorExceptionMessage": "Erro ao exibir diálogo de mensagem: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Erro ao exibir teclado virtual: {0}", - "DialogErrorAppletErrorExceptionMessage": "Erro ao exibir applet ErrorApplet: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nPara mais informações sobre como corrigir esse erro, siga nosso Guia de Configuração.", - "DialogUserErrorDialogTitle": "Erro do Ryujinx ({0})", - "DialogAmiiboApiTitle": "API Amiibo", - "DialogAmiiboApiFailFetchMessage": "Um erro ocorreu ao tentar obter informações da API.", - "DialogAmiiboApiConnectErrorMessage": "Não foi possível conectar ao servidor da API Amiibo. O serviço pode estar fora do ar ou você precisa verificar sua conexão com a Internet.", - "DialogProfileInvalidProfileErrorMessage": "Perfil {0} é incompatível com o sistema de configuração de controle atual.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "O perfil Padrão não pode ser substituído", - "DialogProfileDeleteProfileTitle": "Apagando perfil", - "DialogProfileDeleteProfileMessage": "Essa ação é irreversível, tem certeza que deseja continuar?", - "DialogWarning": "Alerta", - "DialogPPTCDeletionMessage": "Você está prestes a apagar o cache PPTC para :\n\n{0}\n\nTem certeza que deseja continuar?", - "DialogPPTCDeletionErrorMessage": "Erro apagando cache PPTC em {0}: {1}", - "DialogShaderDeletionMessage": "Você está prestes a apagar o cache de Shader para :\n\n{0}\n\nTem certeza que deseja continuar?", - "DialogShaderDeletionErrorMessage": "Erro apagando o cache de Shader em {0}: {1}", - "DialogRyujinxErrorMessage": "Ryujinx encontrou um erro", - "DialogInvalidTitleIdErrorMessage": "Erro de interface: O jogo selecionado não tem um ID de título válido", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Um firmware de sistema válido não foi encontrado em {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Instalar firmware {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "A versão do sistema {0} será instalada.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nIsso substituirá a versão do sistema atual {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDeseja continuar?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Instalando firmware...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Versão do sistema {0} instalada com sucesso.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "Não haveria nenhum perfil selecionado se o perfil atual fosse deletado", - "DialogUserProfileDeletionConfirmMessage": "Deseja deletar o perfil selecionado", - "DialogUserProfileUnsavedChangesTitle": "Alerta - Alterações não salvas", - "DialogUserProfileUnsavedChangesMessage": "Você fez alterações para este perfil de usuário que não foram salvas.", - "DialogUserProfileUnsavedChangesSubMessage": "Deseja descartar as alterações?", - "DialogControllerSettingsModifiedConfirmMessage": "As configurações de controle atuais foram atualizadas.", - "DialogControllerSettingsModifiedConfirmSubMessage": "Deseja salvar?", - "DialogLoadFileErrorMessage": "{0}. Arquivo com erro: {1}", - "DialogModAlreadyExistsMessage": "O mod já existe", - "DialogModInvalidMessage": "O diretório especificado não contém um mod!", - "DialogModDeleteNoParentMessage": "Falha ao excluir: Não foi possível encontrar o diretório pai do mod \"{0}\"!", - "DialogDlcNoDlcErrorMessage": "O arquivo especificado não contém DLCs para o título selecionado!", - "DialogPerformanceCheckLoggingEnabledMessage": "Os logs de depuração estão ativos, esse recurso é feito para ser usado apenas por desenvolvedores.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "Para melhor performance, é recomendável desabilitar os logs de depuração. Gostaria de desabilitar os logs de depuração agora?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "O despejo de shaders está ativo, esse recurso é feito para ser usado apenas por desenvolvedores.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Para melhor performance, é recomendável desabilitar o despejo de shaders. Gostaria de desabilitar o despejo de shaders agora?", - "DialogLoadAppGameAlreadyLoadedMessage": "Um jogo já foi carregado", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Por favor, pare a emulação ou feche o emulador antes de abrir outro jogo.", - "DialogUpdateAddUpdateErrorMessage": "O arquivo especificado não contém atualizações para o título selecionado!", - "DialogSettingsBackendThreadingWarningTitle": "Alerta - Threading da API gráfica", - "DialogSettingsBackendThreadingWarningMessage": "Ryujinx precisa ser reiniciado após mudar essa opção para que ela tenha efeito. Dependendo da sua plataforma, pode ser preciso desabilitar o multithreading do driver de vídeo quando usar o Ryujinx.", - "DialogModManagerDeletionWarningMessage": "Você está prestes a excluir o mod: {0}\n\nTem certeza de que deseja continuar?", - "DialogModManagerDeletionAllWarningMessage": "Você está prestes a excluir todos os mods para este jogo.\n\nTem certeza de que deseja continuar?", - "SettingsTabGraphicsFeaturesOptions": "Recursos", - "SettingsTabGraphicsBackendMultithreading": "Multithreading da API gráfica:", - "CommonAuto": "Automático", - "CommonOff": "Desligado", - "CommonOn": "Ligado", - "InputDialogYes": "Sim", - "InputDialogNo": "Não", - "DialogProfileInvalidProfileNameErrorMessage": "O nome do arquivo contém caracteres inválidos. Por favor, tente novamente.", - "MenuBarOptionsPauseEmulation": "Pausar", - "MenuBarOptionsResumeEmulation": "Resumir", - "AboutUrlTooltipMessage": "Clique para abrir o site do Ryujinx no seu navegador padrão.", - "AboutDisclaimerMessage": "Ryujinx não é afiliado com a Nintendo™,\nou qualquer um de seus parceiros, de nenhum modo.", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) é usado\nem nossa emulação de Amiibo.", - "AboutPatreonUrlTooltipMessage": "Clique para abrir a página do Patreon do Ryujinx no seu navegador padrão.", - "AboutGithubUrlTooltipMessage": "Clique para abrir a página do GitHub do Ryujinx no seu navegador padrão.", - "AboutDiscordUrlTooltipMessage": "Clique para abrir um convite ao servidor do Discord do Ryujinx no seu navegador padrão.", - "AboutTwitterUrlTooltipMessage": "Clique para abrir a página do Twitter do Ryujinx no seu navegador padrão.", - "AboutRyujinxAboutTitle": "Sobre:", - "AboutRyujinxAboutContent": "Ryujinx é um emulador de Nintendo Switch™.\nPor favor, nos dê apoio no Patreon.\nFique por dentro de todas as novidades no Twitter ou Discord.\nDesenvolvedores com interesse em contribuir podem conseguir mais informações no GitHub ou Discord.", - "AboutRyujinxMaintainersTitle": "Mantido por:", - "AboutRyujinxMaintainersContentTooltipMessage": "Clique para abrir a página de contribuidores no seu navegador padrão.", - "AboutRyujinxSupprtersTitle": "Apoiado no Patreon por:", - "AmiiboSeriesLabel": "Franquia Amiibo", - "AmiiboCharacterLabel": "Personagem", - "AmiiboScanButtonLabel": "Escanear", - "AmiiboOptionsShowAllLabel": "Exibir todos os Amiibos", - "AmiiboOptionsUsRandomTagLabel": "Hack: Usar Uuid de tag aleatório", - "DlcManagerTableHeadingEnabledLabel": "Habilitado", - "DlcManagerTableHeadingTitleIdLabel": "ID do título", - "DlcManagerTableHeadingContainerPathLabel": "Caminho do container", - "DlcManagerTableHeadingFullPathLabel": "Caminho completo", - "DlcManagerRemoveAllButton": "Remover todos", - "DlcManagerEnableAllButton": "Habilitar todos", - "DlcManagerDisableAllButton": "Desabilitar todos", - "ModManagerDeleteAllButton": "Apagar Tudo", - "MenuBarOptionsChangeLanguage": "Mudar idioma", - "MenuBarShowFileTypes": "Mostrar tipos de arquivo", - "CommonSort": "Ordenar", - "CommonShowNames": "Exibir nomes", - "CommonFavorite": "Favorito", - "OrderAscending": "Ascendente", - "OrderDescending": "Descendente", - "SettingsTabGraphicsFeatures": "Recursos & Melhorias", - "ErrorWindowTitle": "Janela de erro", - "ToggleDiscordTooltip": "Habilita ou desabilita Discord Rich Presence", - "AddGameDirBoxTooltip": "Escreva um diretório de jogo para adicionar à lista", - "AddGameDirTooltip": "Adicionar um diretório de jogo à lista", - "RemoveGameDirTooltip": "Remover diretório de jogo selecionado", - "AddAutoloadDirBoxTooltip": "Insira um diretório de carregamento automático para adicionar à lista", - "AddAutoloadDirTooltip": "Adicionar um diretório de carregamento automático à lista", - "RemoveAutoloadDirTooltip": "Remover o diretório de carregamento automático selecionado", - "CustomThemeCheckTooltip": "Habilita ou desabilita temas customizados na interface gráfica", - "CustomThemePathTooltip": "Diretório do tema customizado", - "CustomThemeBrowseTooltip": "Navegar até um tema customizado", - "DockModeToggleTooltip": "O modo TV faz o sistema emulado se comportar como um Nintendo Switch na TV, o que melhora a fidelidade gráfica na maioria dos jogos. Por outro lado, desativar essa opção fará o sistema emulado se comportar como um Nintendo Switch portátil, reduzindo a qualidade gráfica.\n\nConfigure os controles do jogador 1 se planeja usar o modo TV; configure os controles de portátil se planeja usar o modo Portátil.\n\nMantenha ativado se estiver em dúvida.", - "DirectKeyboardTooltip": "Suporte para acesso direto ao teclado (HID). Permite que os jogos acessem seu teclado como um dispositivo de entrada de texto.\n\nFunciona apenas com jogos que suportam o uso de teclado nativamente no hardware do Switch.\n\nDeixe desativado se estiver em dúvida.", - "DirectMouseTooltip": "Suporte para acesso direto ao mouse (HID). Permite que os jogos acessem seu mouse como um dispositivo de apontamento.\n\nFunciona apenas com jogos que suportam controles de mouse nativamente no hardware do Switch, o que é raro.\n\nQuando ativado, a funcionalidade de tela sensível ao toque pode não funcionar.\n\nDeixe desativado se estiver em dúvida.", - "RegionTooltip": "Mudar a região do sistema", - "LanguageTooltip": "Mudar o idioma do sistema", - "TimezoneTooltip": "Mudar o fuso-horário do sistema", - "TimeTooltip": "Mudar a hora do sistema", - "VSyncToggleTooltip": "V-Sync do console emulado. Funciona essencialmente como um limitador de quadros para a maioria dos jogos; desativá-lo pode fazer com que os jogos rodem em uma velocidade mais alta ou que telas de carregamento demorem mais ou travem.\n\nPode ser alternado durante o jogo com uma tecla de atalho de sua preferência (F1 por padrão). Recomendamos isso caso planeje desativá-lo.\n\nMantenha ligado se estiver em dúvida.", - "PptcToggleTooltip": "Habilita ou desabilita PPTC", - "LowPowerPptcToggleTooltip": "Carregar o PPTC usando um terço da quantidade de núcleos.", - "FsIntegrityToggleTooltip": "Habilita ou desabilita verificação de integridade dos arquivos do jogo", - "AudioBackendTooltip": "Mudar biblioteca de áudio", - "MemoryManagerTooltip": "Muda como a memória do sistema convidado é acessada. Tem um grande impacto na performance da CPU emulada.", - "MemoryManagerSoftwareTooltip": "Usar uma tabela de página via software para tradução de endereços. Maior precisão, porém performance mais baixa.", - "MemoryManagerHostTooltip": "Mapeia memória no espaço de endereço hóspede diretamente. Compilação e execução do JIT muito mais rápida.", - "MemoryManagerUnsafeTooltip": "Mapeia memória diretamente, mas sem limitar o acesso ao espaço de endereçamento do sistema convidado. Mais rápido, porém menos seguro. O aplicativo convidado pode acessar memória de qualquer parte do Ryujinx, então apenas rode programas em que você confia nesse modo.", - "UseHypervisorTooltip": "Usa o Hypervisor em vez de JIT (recompilador dinâmico). Melhora significativamente o desempenho quando disponível, mas pode ser instável no seu estado atual.", - "DRamTooltip": "Expande a memória do sistema emulado de 4GiB para 6GiB", - "IgnoreMissingServicesTooltip": "Habilita ou desabilita a opção de ignorar serviços não implementados", - "IgnoreAppletTooltip": "O diálogo externo \"Controller Applet\" não aparecerá se o gamepad for desconectado durante o jogo. Não haverá prompt para fechar o diálogo ou configurar um novo controle. Assim que o controle desconectado anteriormente for reconectado, o jogo será retomado automaticamente.", - "GraphicsBackendThreadingTooltip": "Habilita multithreading do backend gráfico", - "GalThreadingTooltip": "Executa comandos do backend gráfico em uma segunda thread. Permite multithreading em tempo de execução da compilação de shader, diminui os travamentos, e melhora performance em drivers sem suporte embutido a multithreading. Pequena variação na performance máxima em drivers com suporte a multithreading. Ryujinx pode precisar ser reiniciado para desabilitar adequadamente o multithreading embutido do driver, ou você pode precisar fazer isso manualmente para ter a melhor performance.", - "ShaderCacheToggleTooltip": "Habilita ou desabilita o cache de shader", - "ResolutionScaleTooltip": "Multiplica a resolução de renderização do jogo.\n\nAlguns jogos podem não funcionar bem com essa opção e apresentar uma aparência pixelada, mesmo com o aumento da resolução; para esses jogos, talvez seja necessário encontrar mods que removam o anti-aliasing ou aumentem a resolução de renderização interna. Ao usar a segunda opção, provavelmente desejará selecionar Nativa.\n\nEssa opção pode ser alterada enquanto um jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nLembre-se de que 4x é exagerado para praticamente qualquer configuração.", - "ResolutionScaleEntryTooltip": "Escala de resolução de ponto flutuante, como 1.5. Valores não inteiros tem probabilidade maior de causar problemas ou quebras.", - "AnisotropyTooltip": "Nível de Filtragem Anisotrópica. Defina como Automático para usar o valor solicitado pelo jogo.", - "AspectRatioTooltip": "Proporção de Tela aplicada à janela do renderizador.\n\nAltere isso apenas se estiver usando um mod de proporção para o seu jogo; caso contrário, os gráficos ficarão esticados.\n\nMantenha em 16:9 se estiver em dúvida.", - "ShaderDumpPathTooltip": "Diretòrio de despejo de shaders", - "FileLogTooltip": "Habilita ou desabilita log para um arquivo no disco", - "StubLogTooltip": "Habilita ou desabilita exibição de mensagens de stub", - "InfoLogTooltip": "Habilita ou desabilita exibição de mensagens informativas", - "WarnLogTooltip": "Habilita ou desabilita exibição de mensagens de alerta", - "ErrorLogTooltip": "Habilita ou desabilita exibição de mensagens de erro", - "TraceLogTooltip": "Habilita ou desabilita exibição de mensagens de rastreamento", - "GuestLogTooltip": "Habilita ou desabilita exibição de mensagens do programa convidado", - "FileAccessLogTooltip": "Habilita ou desabilita exibição de mensagens do acesso de arquivos", - "FSAccessLogModeTooltip": "Habilita exibição de mensagens de acesso ao sistema de arquivos no console. Modos permitidos são 0-3", - "DeveloperOptionTooltip": "Use com cuidado", - "OpenGlLogLevel": "Requer que os níveis de log apropriados estejaam habilitados", - "DebugLogTooltip": "Habilita exibição de mensagens de depuração", - "LoadApplicationFileTooltip": "Abre o navegador de arquivos para seleção de um arquivo do Switch compatível a ser carregado", - "LoadApplicationFolderTooltip": "Abre o navegador de pastas para seleção de pasta extraída do Switch compatível a ser carregada", - "OpenRyujinxFolderTooltip": "Abre o diretório do sistema de arquivos do Ryujinx", - "LoadTitleUpdatesFromFolderTooltip": "Abra o explorador de arquivos para selecionar uma ou mais pastas e carregar atualizações de jogo em massa.", - "OpenRyujinxLogsTooltip": "Abre o diretório onde os logs são salvos", - "ExitTooltip": "Sair do Ryujinx", - "OpenSettingsTooltip": "Abrir janela de configurações", - "OpenProfileManagerTooltip": "Abrir janela de gerenciamento de perfis", - "StopEmulationTooltip": "Parar emulação do jogo atual e voltar a seleção de jogos", - "CheckUpdatesTooltip": "Verificar por atualizações para o Ryujinx", - "OpenAboutTooltip": "Abrir janela sobre", - "GridSize": "Tamanho da grade", - "GridSizeTooltip": "Mudar tamanho dos items da grade", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Português do Brasil", - "AboutRyujinxContributorsButtonHeader": "Ver todos os contribuidores", - "SettingsTabSystemAudioVolume": "Volume:", - "AudioVolumeTooltip": "Mudar volume do áudio", - "SettingsTabSystemEnableInternetAccess": "Habilitar acesso à internet do programa convidado", - "EnableInternetAccessTooltip": "Habilita acesso à internet do programa convidado. Se habilitado, o aplicativo vai se comportar como se o sistema Switch emulado estivesse conectado a Internet. Note que em alguns casos, aplicativos podem acessar a Internet mesmo com essa opção desabilitada", - "GameListContextMenuManageCheatToolTip": "Gerenciar Cheats", - "GameListContextMenuManageCheat": "Gerenciar Cheats", - "GameListContextMenuManageModToolTip": "Gerenciar Mods", - "GameListContextMenuManageMod": "Gerenciar Mods", - "ControllerSettingsStickRange": "Intervalo:", - "DialogStopEmulationTitle": "Ryujinx - Parar emulação", - "DialogStopEmulationMessage": "Tem certeza que deseja parar a emulação?", - "SettingsTabCpu": "CPU", - "SettingsTabAudio": "Áudio", - "SettingsTabNetwork": "Rede", - "SettingsTabNetworkConnection": "Conexão de rede", - "SettingsTabCpuCache": "Cache da CPU", - "SettingsTabCpuMemory": "Memória da CPU", - "DialogUpdaterFlatpakNotSupportedMessage": "Por favor, atualize o Ryujinx pelo FlatHub.", - "UpdaterDisabledWarningTitle": "Atualizador desabilitado!", - "ControllerSettingsRotate90": "Rodar 90° sentido horário", - "IconSize": "Tamanho do ícone", - "IconSizeTooltip": "Muda o tamanho do ícone do jogo", - "MenuBarOptionsShowConsole": "Exibir console", - "ShaderCachePurgeError": "Erro ao deletar o shader em {0}: {1}", - "UserErrorNoKeys": "Chaves não encontradas", - "UserErrorNoFirmware": "Firmware não encontrado", - "UserErrorFirmwareParsingFailed": "Erro na leitura do Firmware", - "UserErrorApplicationNotFound": "Aplicativo não encontrado", - "UserErrorUnknown": "Erro desconhecido", - "UserErrorUndefined": "Erro indefinido", - "UserErrorNoKeysDescription": "Ryujinx não conseguiu encontrar o seu arquivo 'prod.keys'", - "UserErrorNoFirmwareDescription": "Ryujinx não conseguiu encontrar nenhum Firmware instalado", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx não conseguiu ler o Firmware fornecido. Geralmente isso é causado por chaves desatualizadas.", - "UserErrorApplicationNotFoundDescription": "Ryujinx não conseguiu encontrar um aplicativo válido no caminho fornecido.", - "UserErrorUnknownDescription": "Um erro desconhecido foi encontrado!", - "UserErrorUndefinedDescription": "Um erro indefinido occoreu! Isso não deveria acontecer, por favor contate um desenvolvedor!", - "OpenSetupGuideMessage": "Abrir o guia de configuração", - "NoUpdate": "Sem atualizações", - "TitleUpdateVersionLabel": "Versão {0}", - "TitleBundledUpdateVersionLabel": "Empacotado: Versão {0}", - "TitleBundledDlcLabel": "Empacotado:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - Informação", - "RyujinxConfirm": "Ryujinx - Confirmação", - "FileDialogAllTypes": "Todos os tipos", - "Never": "Nunca", - "SwkbdMinCharacters": "Deve ter pelo menos {0} caracteres", - "SwkbdMinRangeCharacters": "Deve ter entre {0}-{1} caracteres", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Teclado por Software", - "SoftwareKeyboardModeNumeric": "Deve ser somente 0-9 ou '.'", - "SoftwareKeyboardModeAlphabet": "Apenas devem ser caracteres não CJK.", - "SoftwareKeyboardModeASCII": "Deve ser apenas texto ASCII", - "ControllerAppletControllers": "Supported Controllers:", - "ControllerAppletPlayers": "Jogadores:", - "ControllerAppletDescription": "Your current configuration is invalid. Open settings and reconfigure your inputs.", - "ControllerAppletDocked": "Docked mode set. Handheld control should be disabled.", - "UpdaterRenaming": "Renomeando arquivos antigos...", - "UpdaterRenameFailed": "O atualizador não conseguiu renomear o arquivo: {0}", - "UpdaterAddingFiles": "Adicionando novos arquivos...", - "UpdaterExtracting": "Extraíndo atualização...", - "UpdaterDownloading": "Baixando atualização...", - "Docked": "TV", - "Handheld": "Portátil", - "ConnectionError": "Erro de conexão.", - "AboutPageDeveloperListMore": "{0} e mais...", - "ApiError": "Erro de API.", - "LoadingHeading": "Carregando {0}", - "CompilingPPTC": "Compilando PTC", - "CompilingShaders": "Compilando Shaders", - "AllKeyboards": "Todos os teclados", - "OpenFileDialogTitle": "Selecione um arquivo suportado para abrir", - "OpenFolderDialogTitle": "Selecione um diretório com um jogo extraído", - "AllSupportedFormats": "Todos os formatos suportados", - "RyujinxUpdater": "Atualizador do Ryujinx", - "SettingsTabHotkeys": "Atalhos do teclado", - "SettingsTabHotkeysHotkeys": "Atalhos do teclado", - "SettingsTabHotkeysToggleVsyncHotkey": "Mudar VSync:", - "SettingsTabHotkeysScreenshotHotkey": "Captura de tela:", - "SettingsTabHotkeysShowUiHotkey": "Exibir UI:", - "SettingsTabHotkeysPauseHotkey": "Pausar:", - "SettingsTabHotkeysToggleMuteHotkey": "Mudo:", - "ControllerMotionTitle": "Configurações do controle de movimento", - "ControllerRumbleTitle": "Configurações de vibração", - "SettingsSelectThemeFileDialogTitle": "Selecionar arquivo do tema", - "SettingsXamlThemeFile": "Arquivo de tema Xaml", - "AvatarWindowTitle": "Gerenciar contas - Avatar", - "Amiibo": "Amiibo", - "Unknown": "Desconhecido", - "Usage": "Uso", - "Writable": "Gravável", - "SelectDlcDialogTitle": "Selecionar arquivos de DLC", - "SelectUpdateDialogTitle": "Selecionar arquivos de atualização", - "SelectModDialogTitle": "Select mod directory", - "UserProfileWindowTitle": "Gerenciador de perfis de usuário", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "CheatWindowTitle": "Gerenciador de Cheats", - "DlcWindowTitle": "Gerenciador de DLC", - "ModWindowTitle": "Gerenciar Mods para {0} ({1})", - "UpdateWindowTitle": "Gerenciador de atualizações", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} nova(s) atualização(ões) adicionada(s)", - "UpdateWindowBundledContentNotice": "Atualizações incorporadas não podem ser removidas, apenas desativadas.", - "CheatWindowHeading": "Cheats disponíveis para {0} [{1}]", - "BuildId": "ID da Build:", - "DlcWindowBundledContentNotice": "DLCs incorporadas não podem ser removidas, apenas desativadas.", - "DlcWindowHeading": "{0} DLCs disponíveis para {1} ({2})", - "DlcWindowDlcAddedMessage": "{0} novo(s) conteúdo(s) para download adicionado(s)", - "AutoloadDlcAddedMessage": "{0} novo(s) conteúdo(s) para download adicionado(s)", - "AutoloadDlcRemovedMessage": "{0} conteúdo(s) para download ausente(s) removido(s)", - "AutoloadUpdateAddedMessage": "{0} nova(s) atualização(ões) adicionada(s)", - "AutoloadUpdateRemovedMessage": "{0} atualização(ões) ausente(s) removida(s)", - "ModWindowHeading": "{0} Mod(s)", - "UserProfilesEditProfile": "Editar selecionado", - "Continue": "Continue", - "Cancel": "Cancelar", - "Save": "Salvar", - "Discard": "Descartar", - "Paused": "Paused", - "UserProfilesSetProfileImage": "Definir imagem de perfil", - "UserProfileEmptyNameError": "É necessário um nome", - "UserProfileNoImageError": "A imagem de perfil deve ser definida", - "GameUpdateWindowHeading": "{0} atualizações disponíveis para {1} ({2})", - "SettingsTabHotkeysResScaleUpHotkey": "Aumentar a resolução:", - "SettingsTabHotkeysResScaleDownHotkey": "Diminuir a resolução:", - "UserProfilesName": "Nome:", - "UserProfilesUserId": "ID de usuário:", - "SettingsTabGraphicsBackend": "Backend gráfico", - "SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.", - "SettingsEnableTextureRecompression": "Habilitar recompressão de texturas", - "SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.", - "SettingsTabGraphicsPreferredGpu": "GPU preferencial", - "SettingsTabGraphicsPreferredGpuTooltip": "Selecione a placa de vídeo que será usada com o backend gráfico Vulkan.\n\nNão afeta a GPU que OpenGL usará.\n\nSelecione \"dGPU\" em caso de dúvida. Se não houver nenhuma, não mexa.", - "SettingsAppRequiredRestartMessage": "Reinicialização do Ryujinx necessária", - "SettingsGpuBackendRestartMessage": "Configurações do backend gráfico ou da GPU foram alteradas. Uma reinicialização é necessária para que as mudanças tenham efeito.", - "SettingsGpuBackendRestartSubMessage": "Deseja reiniciar agora?", - "RyujinxUpdaterMessage": "Você quer atualizar o Ryujinx para a última versão?", - "SettingsTabHotkeysVolumeUpHotkey": "Aumentar volume:", - "SettingsTabHotkeysVolumeDownHotkey": "Diminuir volume:", - "SettingsEnableMacroHLE": "Habilitar emulação de alto nível para Macros", - "SettingsEnableMacroHLETooltip": "Habilita emulação de alto nível de códigos Macro da GPU.\n\nMelhora a performance, mas pode causar problemas gráficos em alguns jogos.\n\nEm caso de dúvida, deixe ATIVADO.", - "SettingsEnableColorSpacePassthrough": "Passagem de Espaço Cor", - "SettingsEnableColorSpacePassthroughTooltip": "Direciona o backend Vulkan para passar informações de cores sem especificar um espaço de cores. Para usuários com telas de ampla gama, isso pode resultar em cores mais vibrantes, ao custo da correção de cores.", - "VolumeShort": "Vol", - "UserProfilesManageSaves": "Gerenciar jogos salvos", - "DeleteUserSave": "Deseja apagar o jogo salvo do usuário para este jogo?", - "IrreversibleActionNote": "Esta ação não é reversível.", - "SaveManagerHeading": "Gerenciar jogos salvos para {0}", - "SaveManagerTitle": "Gerenciador de jogos salvos", - "Name": "Nome", - "Size": "Tamanho", - "Search": "Buscar", - "UserProfilesRecoverLostAccounts": "Recuperar contas perdidas", - "Recover": "Recuperar", - "UserProfilesRecoverHeading": "Jogos salvos foram encontrados para as seguintes contas", - "UserProfilesRecoverEmptyList": "Nenhum perfil para recuperar", - "GraphicsAATooltip": "Aplica anti-aliasing à renderização do jogo.\n\nFXAA borrará a maior parte da imagem, enquanto SMAA tentará identificar e suavizar bordas serrilhadas.\n\nNão é recomendado usar em conjunto com o filtro de escala FSR.\n\nEssa opção pode ser alterada enquanto o jogo está em execução clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nDeixe em NENHUM se estiver em dúvida.", - "GraphicsAALabel": "Anti-serrilhado:", - "GraphicsScalingFilterLabel": "Filtro de escala:", - "GraphicsScalingFilterTooltip": "Escolha o filtro de escala que será aplicado ao usar a escala de resolução.\n\nBilinear funciona bem para jogos 3D e é uma opção padrão segura.\n\nNearest é recomendado para jogos em pixel art.\n\nFSR 1.0 é apenas um filtro de nitidez, não recomendado para uso com FXAA ou SMAA.\n\nEssa opção pode ser alterada enquanto o jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nMantenha em BILINEAR se estiver em dúvida.", - "GraphicsScalingFilterBilinear": "Bilinear", - "GraphicsScalingFilterNearest": "Nearest", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "Nível", - "GraphicsScalingFilterLevelTooltip": "Defina o nível de nitidez do FSR 1.0. Quanto maior, mais nítido.", - "SmaaLow": "SMAA Baixo", - "SmaaMedium": "SMAA Médio", - "SmaaHigh": "SMAA Alto", - "SmaaUltra": "SMAA Ultra", - "UserEditorTitle": "Editar usuário", - "UserEditorTitleCreate": "Criar usuário", - "SettingsTabNetworkInterface": "Interface de rede:", - "NetworkInterfaceTooltip": "A interface de rede usada para recursos de LAN/LDN.\n\nEm conjunto com uma VPN ou XLink Kai e um jogo com suporte a LAN, pode ser usada para simular uma conexão na mesma rede pela Internet.\n\nMantenha em PADRÃO se estiver em dúvida.", - "NetworkInterfaceDefault": "Padrão", - "PackagingShaders": "Empacotamento de Shaders", - "AboutChangelogButton": "Ver mudanças no GitHub", - "AboutChangelogButtonTooltipMessage": "Clique para abrir o relatório de alterações para esta versão no seu navegador padrão.", - "SettingsTabNetworkMultiplayer": "Multiplayer", - "MultiplayerMode": "Modo:", - "MultiplayerModeTooltip": "Alterar o modo multiplayer LDN.\n\nLdnMitm modificará a funcionalidade de jogo sem fio/local nos jogos para funcionar como se fosse LAN, permitindo conexões locais, na mesma rede, com outras instâncias do Ryujinx e consoles Nintendo Switch hackeados que possuem o módulo ldn_mitm instalado.\n\nO multiplayer exige que todos os jogadores estejam na mesma versão do jogo (ex.: Super Smash Bros. Ultimate v13.0.1 não consegue se conectar à v13.0.0).\n\nDeixe DESATIVADO se estiver em dúvida.", - "MultiplayerModeDisabled": "Desativado", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/ru_RU.json b/src/Ryujinx/Assets/Locales/ru_RU.json deleted file mode 100644 index 1046208fb..000000000 --- a/src/Ryujinx/Assets/Locales/ru_RU.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "Русский (RU)", - "MenuBarFileOpenApplet": "Открыть апплет", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Открывает апплет Mii Editor в автономном режиме", - "SettingsTabInputDirectMouseAccess": "Прямой ввод мыши", - "SettingsTabSystemMemoryManagerMode": "Режим менеджера памяти:", - "SettingsTabSystemMemoryManagerModeSoftware": "Программное обеспечение", - "SettingsTabSystemMemoryManagerModeHost": "Хост (быстро)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Хост не установлен (самый быстрый, небезопасный)", - "SettingsTabSystemUseHypervisor": "Использовать Hypervisor", - "MenuBarFile": "_Файл", - "MenuBarFileOpenFromFile": "_Добавить приложение из файла", - "MenuBarFileOpenFromFileError": "No applications found in selected file.", - "MenuBarFileOpenUnpacked": "Добавить _распакованную игру", - "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder", - "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder", - "MenuBarFileOpenEmuFolder": "Открыть папку Ryujinx", - "MenuBarFileOpenLogsFolder": "Открыть папку с логами", - "MenuBarFileExit": "_Выход", - "MenuBarOptions": "_Настройки", - "MenuBarOptionsToggleFullscreen": "Включить полноэкранный режим", - "MenuBarOptionsStartGamesInFullscreen": "Запускать игры в полноэкранном режиме", - "MenuBarOptionsStopEmulation": "Остановить эмуляцию", - "MenuBarOptionsSettings": "_Параметры", - "MenuBarOptionsManageUserProfiles": "_Менеджер учетных записей", - "MenuBarActions": "_Действия", - "MenuBarOptionsSimulateWakeUpMessage": "Имитировать сообщение пробуждения", - "MenuBarActionsScanAmiibo": "Сканировать Amiibo", - "MenuBarTools": "_Инструменты", - "MenuBarToolsInstallFirmware": "Установка прошивки", - "MenuBarFileToolsInstallFirmwareFromFile": "Установить прошивку из XCI или ZIP", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Установить прошивку из папки", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "Управление типами файлов", - "MenuBarToolsInstallFileTypes": "Установить типы файлов", - "MenuBarToolsUninstallFileTypes": "Удалить типы файлов", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_Вид", - "MenuBarViewWindow": "Размер окна", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Помощь", - "MenuBarHelpCheckForUpdates": "Проверить наличие обновлений", - "MenuBarHelpAbout": "О программе", - "MenuSearch": "Поиск...", - "GameListHeaderFavorite": "Избранное", - "GameListHeaderIcon": "Значок", - "GameListHeaderApplication": "Название", - "GameListHeaderDeveloper": "Разработчик", - "GameListHeaderVersion": "Версия", - "GameListHeaderTimePlayed": "Время в игре", - "GameListHeaderLastPlayed": "Последний запуск", - "GameListHeaderFileExtension": "Расширение файла", - "GameListHeaderFileSize": "Размер файла", - "GameListHeaderPath": "Путь", - "GameListContextMenuOpenUserSaveDirectory": "Открыть папку с сохранениями", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Открывает папку с пользовательскими сохранениями", - "GameListContextMenuOpenDeviceSaveDirectory": "Открыть папку сохраненных устройств", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Открывает папку, содержащую сохраненные устройства", - "GameListContextMenuOpenBcatSaveDirectory": "Открыть папку сохраненных BCAT", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Открывает папку, содержащую сохраненные BCAT", - "GameListContextMenuManageTitleUpdates": "Управление обновлениями", - "GameListContextMenuManageTitleUpdatesToolTip": "Открывает окно управления обновлениями приложения", - "GameListContextMenuManageDlc": "Управление DLC", - "GameListContextMenuManageDlcToolTip": "Открывает окно управления DLC", - "GameListContextMenuCacheManagement": "Управление кэшем", - "GameListContextMenuCacheManagementPurgePptc": "Перестроить очередь PPTC", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Запускает перестройку PPTC во время следующего запуска игры.", - "GameListContextMenuCacheManagementPurgeShaderCache": "Очистить кэш шейдеров", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Удаляет кеш шейдеров приложения", - "GameListContextMenuCacheManagementOpenPptcDirectory": "Открыть папку PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Открывает папку, содержащую PPTC кэш приложений и игр", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Открыть папку с кэшем шейдеров", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Открывает папку, содержащую кэш шейдеров приложений и игр", - "GameListContextMenuExtractData": "Извлечь данные", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Извлечение раздела ExeFS из текущих настроек приложения (включая обновления)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Извлечение раздела RomFS из текущих настроек приложения (включая обновления)", - "GameListContextMenuExtractDataLogo": "Логотип", - "GameListContextMenuExtractDataLogoToolTip": "Извлечение раздела с логотипом из текущих настроек приложения (включая обновления)", - "GameListContextMenuCreateShortcut": "Создать ярлык приложения", - "GameListContextMenuCreateShortcutToolTip": "Создает ярлык на рабочем столе, с помощью которого можно запустить игру или приложение", - "GameListContextMenuCreateShortcutToolTipMacOS": "Создает ярлык игры или приложения в папке Программы macOS", - "GameListContextMenuOpenModsDirectory": "Открыть папку с модами", - "GameListContextMenuOpenModsDirectoryToolTip": "Открывает папку, содержащую моды для приложений и игр", - "GameListContextMenuOpenSdModsDirectory": "Открыть папку с модами Atmosphere", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Открывает папку Atmosphere на альтернативной SD-карте, которая содержит моды для приложений и игр. Полезно для модов, сделанных для реальной консоли.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} игр загружено", - "StatusBarSystemVersion": "Версия прошивки: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Обнаружен низкий лимит разметки памяти", - "LinuxVmMaxMapCountDialogTextPrimary": "Хотите увеличить значение vm.max_map_count до {0}", - "LinuxVmMaxMapCountDialogTextSecondary": "Некоторые игры могут создавать большую разметку памяти, чем разрешено на данный момент по умолчанию. Ryujinx вылетит при превышении этого лимита.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Да, до следующего перезапуска", - "LinuxVmMaxMapCountDialogButtonPersistent": "Да, постоянно", - "LinuxVmMaxMapCountWarningTextPrimary": "Максимальная разметка памяти меньше, чем рекомендуется.", - "LinuxVmMaxMapCountWarningTextSecondary": "Текущее значение vm.max_map_count ({0}) меньше, чем {1}. Некоторые игры могут попытаться создать большую разметку памяти, чем разрешено в данный момент. Ryujinx вылетит как только этот лимит будет превышен.\n\nВозможно, вам потребуется вручную увеличить лимит или установить pkexec, что позволит Ryujinx помочь справиться с превышением лимита.", - "Settings": "Параметры", - "SettingsTabGeneral": "Интерфейс", - "SettingsTabGeneralGeneral": "Общее", - "SettingsTabGeneralEnableDiscordRichPresence": "Статус активности в Discord", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Проверять наличие обновлений при запуске", - "SettingsTabGeneralShowConfirmExitDialog": "Подтверждать выход из приложения", - "SettingsTabGeneralRememberWindowState": "Запомнить размер/положение окна", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "Скрывать курсор", - "SettingsTabGeneralHideCursorNever": "Никогда", - "SettingsTabGeneralHideCursorOnIdle": "В простое", - "SettingsTabGeneralHideCursorAlways": "Всегда", - "SettingsTabGeneralGameDirectories": "Папки с играми", - "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "Добавить", - "SettingsTabGeneralRemove": "Удалить", - "SettingsTabSystem": "Система", - "SettingsTabSystemCore": "Основные настройки", - "SettingsTabSystemSystemRegion": "Регион прошивки:", - "SettingsTabSystemSystemRegionJapan": "Япония", - "SettingsTabSystemSystemRegionUSA": "США", - "SettingsTabSystemSystemRegionEurope": "Европа", - "SettingsTabSystemSystemRegionAustralia": "Австралия", - "SettingsTabSystemSystemRegionChina": "Китай", - "SettingsTabSystemSystemRegionKorea": "Корея", - "SettingsTabSystemSystemRegionTaiwan": "Тайвань", - "SettingsTabSystemSystemLanguage": "Язык прошивки:", - "SettingsTabSystemSystemLanguageJapanese": "Японский", - "SettingsTabSystemSystemLanguageAmericanEnglish": "Английский (США)", - "SettingsTabSystemSystemLanguageFrench": "Французский", - "SettingsTabSystemSystemLanguageGerman": "Германский", - "SettingsTabSystemSystemLanguageItalian": "Итальянский", - "SettingsTabSystemSystemLanguageSpanish": "Испанский", - "SettingsTabSystemSystemLanguageChinese": "Китайский", - "SettingsTabSystemSystemLanguageKorean": "Корейский", - "SettingsTabSystemSystemLanguageDutch": "Нидерландский", - "SettingsTabSystemSystemLanguagePortuguese": "Португальский", - "SettingsTabSystemSystemLanguageRussian": "Русский", - "SettingsTabSystemSystemLanguageTaiwanese": "Тайванский", - "SettingsTabSystemSystemLanguageBritishEnglish": "Английский (Британия)", - "SettingsTabSystemSystemLanguageCanadianFrench": "Французский (Канада)", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Испанский (Латинская Америка)", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Китайский (упрощённый)", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Китайский (традиционный)", - "SettingsTabSystemSystemTimeZone": "Часовой пояс прошивки:", - "SettingsTabSystemSystemTime": "Системное время в прошивке:", - "SettingsTabSystemEnableVsync": "Вертикальная синхронизация", - "SettingsTabSystemEnablePptc": "Использовать PPTC (Profiled Persistent Translation Cache)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "Проверка целостности файловой системы", - "SettingsTabSystemAudioBackend": "Аудио бэкенд:", - "SettingsTabSystemAudioBackendDummy": "Без звука", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "Хаки", - "SettingsTabSystemHacksNote": "Возможна нестабильная работа", - "SettingsTabSystemDramSize": "Использовать альтернативный макет памяти (для разработчиков)", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "Игнорировать отсутствующие службы", - "SettingsTabSystemIgnoreApplet": "Игнорировать Апплет", - "SettingsTabGraphics": "Графика", - "SettingsTabGraphicsAPI": "Графические API", - "SettingsTabGraphicsEnableShaderCache": "Кэшировать шейдеры", - "SettingsTabGraphicsAnisotropicFiltering": "Анизотропная фильтрация:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Автоматически", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "Масштабирование:", - "SettingsTabGraphicsResolutionScaleCustom": "Пользовательское (не рекомендуется)", - "SettingsTabGraphicsResolutionScaleNative": "Нативное (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (не рекомендуется)", - "SettingsTabGraphicsAspectRatio": "Соотношение сторон:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "Растянуть до размеров окна", - "SettingsTabGraphicsDeveloperOptions": "Параметры разработчика", - "SettingsTabGraphicsShaderDumpPath": "Путь дампа графических шейдеров", - "SettingsTabLogging": "Журналирование", - "SettingsTabLoggingLogging": "Журналирование", - "SettingsTabLoggingEnableLoggingToFile": "Включить запись в файл", - "SettingsTabLoggingEnableStubLogs": "Включить журнал-заглушку", - "SettingsTabLoggingEnableInfoLogs": "Включить информационный журнал", - "SettingsTabLoggingEnableWarningLogs": "Включить журнал предупреждений", - "SettingsTabLoggingEnableErrorLogs": "Включить журнал ошибок", - "SettingsTabLoggingEnableTraceLogs": "Включить журнал трассировки", - "SettingsTabLoggingEnableGuestLogs": "Включить гостевые журналы", - "SettingsTabLoggingEnableFsAccessLogs": "Включить журналы доступа файловой системы", - "SettingsTabLoggingFsGlobalAccessLogMode": "Режим журнала глобального доступа файловой системы:", - "SettingsTabLoggingDeveloperOptions": "Параметры разработчика", - "SettingsTabLoggingDeveloperOptionsNote": "ВНИМАНИЕ: эти настройки снижают производительность", - "SettingsTabLoggingGraphicsBackendLogLevel": "Уровень журнала бэкенда графики:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "Нет", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Ошибка", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Замедления", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "Всё", - "SettingsTabLoggingEnableDebugLogs": "Включить журнал отладки", - "SettingsTabInput": "Управление", - "SettingsTabInputEnableDockedMode": "Стационарный режим", - "SettingsTabInputDirectKeyboardAccess": "Прямой ввод клавиатуры", - "SettingsButtonSave": "Сохранить", - "SettingsButtonClose": "Закрыть", - "SettingsButtonOk": "Ок", - "SettingsButtonCancel": "Отмена", - "SettingsButtonApply": "Применить", - "ControllerSettingsPlayer": "Игрок", - "ControllerSettingsPlayer1": "Игрок 1", - "ControllerSettingsPlayer2": "Игрок 2", - "ControllerSettingsPlayer3": "Игрок 3", - "ControllerSettingsPlayer4": "Игрок 4", - "ControllerSettingsPlayer5": "Игрок 5", - "ControllerSettingsPlayer6": "Игрок 6", - "ControllerSettingsPlayer7": "Игрок 7", - "ControllerSettingsPlayer8": "Игрок 8", - "ControllerSettingsHandheld": "Портативный", - "ControllerSettingsInputDevice": "Устройство ввода", - "ControllerSettingsRefresh": "Обновить", - "ControllerSettingsDeviceDisabled": "Отключить", - "ControllerSettingsControllerType": "Тип контроллера", - "ControllerSettingsControllerTypeHandheld": "Портативный", - "ControllerSettingsControllerTypeProController": "Pro Controller", - "ControllerSettingsControllerTypeJoyConPair": "JoyCon (пара)", - "ControllerSettingsControllerTypeJoyConLeft": "JoyCon (левый)", - "ControllerSettingsControllerTypeJoyConRight": "JoyCon (правый)", - "ControllerSettingsProfile": "Профиль", - "ControllerSettingsProfileDefault": "По умолчанию", - "ControllerSettingsLoad": "Загрузить", - "ControllerSettingsAdd": "Добавить", - "ControllerSettingsRemove": "Удалить", - "ControllerSettingsButtons": "Кнопки", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Кнопки направления", - "ControllerSettingsDPadUp": "Вверх", - "ControllerSettingsDPadDown": "Вниз", - "ControllerSettingsDPadLeft": "Влево", - "ControllerSettingsDPadRight": "Вправо", - "ControllerSettingsStickButton": "Нажатие на стик", - "ControllerSettingsStickUp": "Вверх", - "ControllerSettingsStickDown": "Вниз", - "ControllerSettingsStickLeft": "Влево", - "ControllerSettingsStickRight": "Вправо", - "ControllerSettingsStickStick": "Стик", - "ControllerSettingsStickInvertXAxis": "Инвертировать ось X", - "ControllerSettingsStickInvertYAxis": "Инвертировать ось Y", - "ControllerSettingsStickDeadzone": "Мёртвая зона:", - "ControllerSettingsLStick": "Левый стик", - "ControllerSettingsRStick": "Правый стик", - "ControllerSettingsTriggersLeft": "Триггеры слева", - "ControllerSettingsTriggersRight": "Триггеры справа", - "ControllerSettingsTriggersButtonsLeft": "Триггерные кнопки слева", - "ControllerSettingsTriggersButtonsRight": "Триггерные кнопки справа", - "ControllerSettingsTriggers": "Триггеры", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Левые кнопки", - "ControllerSettingsExtraButtonsRight": "Правые кнопки", - "ControllerSettingsMisc": "Разное", - "ControllerSettingsTriggerThreshold": "Порог срабатывания:", - "ControllerSettingsMotion": "Движение", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Включить совместимость с CemuHook", - "ControllerSettingsMotionControllerSlot": "Слот контроллера:", - "ControllerSettingsMotionMirrorInput": "Зеркальный ввод", - "ControllerSettingsMotionRightJoyConSlot": "Слот правого JoyCon:", - "ControllerSettingsMotionServerHost": "Хост сервера:", - "ControllerSettingsMotionGyroSensitivity": "Чувствительность гироскопа:", - "ControllerSettingsMotionGyroDeadzone": "Мертвая зона гироскопа:", - "ControllerSettingsSave": "Сохранить", - "ControllerSettingsClose": "Закрыть", - "KeyUnknown": "Неизвестно", - "KeyShiftLeft": "Левый Shift", - "KeyShiftRight": "Правый Shift", - "KeyControlLeft": "Левый Ctrl", - "KeyMacControlLeft": "Левый ⌃", - "KeyControlRight": "Правый Ctrl", - "KeyMacControlRight": "Правый ⌃", - "KeyAltLeft": "Левый Alt", - "KeyMacAltLeft": "Левый ⌥", - "KeyAltRight": "Правый Alt", - "KeyMacAltRight": "Правый ⌥", - "KeyWinLeft": "Левый ⊞", - "KeyMacWinLeft": "Левый ⌘", - "KeyWinRight": "Правый ⊞", - "KeyMacWinRight": "Правый ⌘", - "KeyMenu": "Меню", - "KeyUp": "Вверх", - "KeyDown": "Вниз", - "KeyLeft": "Влево", - "KeyRight": "Вправо", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Пробел", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Очистить", - "KeyKeypad0": "Блок цифр 0", - "KeyKeypad1": "Блок цифр 1", - "KeyKeypad2": "Блок цифр 2", - "KeyKeypad3": "Блок цифр 3", - "KeyKeypad4": "Блок цифр 4", - "KeyKeypad5": "Блок цифр 5", - "KeyKeypad6": "Блок цифр 6", - "KeyKeypad7": "Блок цифр 7", - "KeyKeypad8": "Блок цифр 8", - "KeyKeypad9": "Блок цифр 9", - "KeyKeypadDivide": "/ (блок цифр)", - "KeyKeypadMultiply": "* (блок цифр)", - "KeyKeypadSubtract": "- (блок цифр)", - "KeyKeypadAdd": "+ (блок цифр)", - "KeyKeypadDecimal": ". (блок цифр)", - "KeyKeypadEnter": "Enter (блок цифр)", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Не привязано", - "GamepadLeftStick": "Кнопка лев. стика", - "GamepadRightStick": "Кнопка пр. стика", - "GamepadLeftShoulder": "Левый бампер", - "GamepadRightShoulder": "Правый бампер", - "GamepadLeftTrigger": "Левый триггер", - "GamepadRightTrigger": "Правый триггер", - "GamepadDpadUp": "Вверх", - "GamepadDpadDown": "Вниз", - "GamepadDpadLeft": "Влево", - "GamepadDpadRight": "Вправо", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Кнопка Xbox", - "GamepadMisc1": "Прочее", - "GamepadPaddle1": "Доп.кнопка 1", - "GamepadPaddle2": "Доп.кнопка 2", - "GamepadPaddle3": "Доп.кнопка 3", - "GamepadPaddle4": "Доп.кнопка 4", - "GamepadTouchpad": "Тачпад", - "GamepadSingleLeftTrigger0": "Левый триггер 0", - "GamepadSingleRightTrigger0": "Правый триггер 0", - "GamepadSingleLeftTrigger1": "Левый триггер 1", - "GamepadSingleRightTrigger1": "Правый триггер 1", - "StickLeft": "Левый стик", - "StickRight": "Правый стик", - "UserProfilesSelectedUserProfile": "Выбранный пользовательский профиль:", - "UserProfilesSaveProfileName": "Сохранить пользовательский профиль", - "UserProfilesChangeProfileImage": "Изменить аватар", - "UserProfilesAvailableUserProfiles": "Доступные профили пользователей:", - "UserProfilesAddNewProfile": "Добавить новый профиль", - "UserProfilesDelete": "Удалить", - "UserProfilesClose": "Закрыть", - "ProfileNameSelectionWatermark": "Укажите никнейм", - "ProfileImageSelectionTitle": "Выбор изображения профиля", - "ProfileImageSelectionHeader": "Выбор аватара", - "ProfileImageSelectionNote": "Вы можете импортировать собственное изображение или выбрать аватар из системной прошивки.", - "ProfileImageSelectionImportImage": "Импорт изображения", - "ProfileImageSelectionSelectAvatar": "Встроенные аватары", - "InputDialogTitle": "Диалоговое окно ввода", - "InputDialogOk": "ОК", - "InputDialogCancel": "Отмена", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "Выберите никнейм", - "InputDialogAddNewProfileHeader": "Пожалуйста, введите никнейм", - "InputDialogAddNewProfileSubtext": "(Максимальная длина: {0})", - "AvatarChoose": "Выбрать аватар", - "AvatarSetBackgroundColor": "Установить цвет фона", - "AvatarClose": "Закрыть", - "ControllerSettingsLoadProfileToolTip": "Загрузить профиль", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "Добавить профиль", - "ControllerSettingsRemoveProfileToolTip": "Удалить профиль", - "ControllerSettingsSaveProfileToolTip": "Сохранить профиль", - "MenuBarFileToolsTakeScreenshot": "Сделать снимок экрана", - "MenuBarFileToolsHideUi": "Скрыть интерфейс", - "GameListContextMenuRunApplication": "Запуск приложения", - "GameListContextMenuToggleFavorite": "Добавить в избранное", - "GameListContextMenuToggleFavoriteToolTip": "Добавляет игру в избранное и помечает звездочкой", - "SettingsTabGeneralTheme": "Тема:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "Темная", - "SettingsTabGeneralThemeLight": "Светлая", - "ControllerSettingsConfigureGeneral": "Настройка", - "ControllerSettingsRumble": "Вибрация", - "ControllerSettingsRumbleStrongMultiplier": "Множитель сильной вибрации", - "ControllerSettingsRumbleWeakMultiplier": "Множитель слабой вибрации", - "DialogMessageSaveNotAvailableMessage": "Нет сохранений для {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "Создать сохранение для этой игры?", - "DialogConfirmationTitle": "Ryujinx - Подтверждение", - "DialogUpdaterTitle": "Ryujinx - Обновление", - "DialogErrorTitle": "Ryujinx - Ошибка", - "DialogWarningTitle": "Ryujinx - Предупреждение", - "DialogExitTitle": "Ryujinx - Выход", - "DialogErrorMessage": "Ryujinx обнаружил ошибку", - "DialogExitMessage": "Вы уверены, что хотите выйти из Ryujinx?", - "DialogExitSubMessage": "Все несохраненные данные будут потеряны", - "DialogMessageCreateSaveErrorMessage": "Произошла ошибка при создании указанных данных сохранения: {0}", - "DialogMessageFindSaveErrorMessage": "Произошла ошибка при поиске указанных данных сохранения: {0}", - "FolderDialogExtractTitle": "Выберите папку для извлечения", - "DialogNcaExtractionMessage": "Извлечение {0} раздела из {1}...", - "DialogNcaExtractionTitle": "Извлечение разделов NCA", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Ошибка извлечения. Основной NCA не присутствовал в выбранном файле.", - "DialogNcaExtractionCheckLogErrorMessage": "Ошибка извлечения. Прочтите файл журнала для получения дополнительной информации.", - "DialogNcaExtractionSuccessMessage": "Извлечение завершено успешно.", - "DialogUpdaterConvertFailedMessage": "Не удалось преобразовать текущую версию Ryujinx.", - "DialogUpdaterCancelUpdateMessage": "Отмена обновления...", - "DialogUpdaterAlreadyOnLatestVersionMessage": "Вы используете самую последнюю версию Ryujinx", - "DialogUpdaterFailedToGetVersionMessage": "Произошла ошибка при попытке получить информацию о выпуске от GitHub Release. Это может быть вызвано тем, что в данный момент в GitHub Actions компилируется новый релиз. Повторите попытку позже.", - "DialogUpdaterConvertFailedGithubMessage": "Не удалось преобразовать полученную версию Ryujinx из Github Release.", - "DialogUpdaterDownloadingMessage": "Загрузка обновления...", - "DialogUpdaterExtractionMessage": "Извлечение обновления...", - "DialogUpdaterRenamingMessage": "Переименование обновления...", - "DialogUpdaterAddingFilesMessage": "Добавление нового обновления...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "Обновление завершено", - "DialogUpdaterRestartMessage": "Перезапустить Ryujinx?", - "DialogUpdaterNoInternetMessage": "Вы не подключены к интернету", - "DialogUpdaterNoInternetSubMessage": "Убедитесь, что у вас работает подключение к интернету", - "DialogUpdaterDirtyBuildMessage": "Вы не можете обновлять Dirty Build", - "DialogUpdaterDirtyBuildSubMessage": "Загрузите Ryujinx по адресу https://ryujinx.app/download если вам нужна поддерживаемая версия.", - "DialogRestartRequiredMessage": "Требуется перезагрузка", - "DialogThemeRestartMessage": "Тема сохранена. Для применения темы требуется перезапуск.", - "DialogThemeRestartSubMessage": "Хотите перезапустить", - "DialogFirmwareInstallEmbeddedMessage": "Хотите установить прошивку, встроенную в эту игру? (Прошивка {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "Установленная прошивка не была найдена, но Ryujinx удалось установить прошивку {0} из предоставленной игры.\nТеперь эмулятор запустится.", - "DialogFirmwareNoFirmwareInstalledMessage": "Прошивка не установлена", - "DialogFirmwareInstalledMessage": "Прошивка {0} была установлена", - "DialogInstallFileTypesSuccessMessage": "Типы файлов успешно установлены", - "DialogInstallFileTypesErrorMessage": "Не удалось установить типы файлов.", - "DialogUninstallFileTypesSuccessMessage": "Типы файлов успешно удалены", - "DialogUninstallFileTypesErrorMessage": "Не удалось удалить типы файлов.", - "DialogOpenSettingsWindowLabel": "Открывает окно параметров", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "Апплет контроллера", - "DialogMessageDialogErrorExceptionMessage": "Ошибка отображения сообщения: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Ошибка отображения программной клавиатуры: {0}", - "DialogErrorAppletErrorExceptionMessage": "Ошибка отображения диалогового окна ErrorApplet: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nДля получения дополнительной информации о том, как исправить эту ошибку, следуйте нашему Руководству по установке.", - "DialogUserErrorDialogTitle": "Ошибка Ryujinx ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "Произошла ошибка при получении информации из API.", - "DialogAmiiboApiConnectErrorMessage": "Не удалось подключиться к серверу Amiibo API. Служба может быть недоступна или вам может потребоваться проверить ваше интернет-соединение.", - "DialogProfileInvalidProfileErrorMessage": "Профиль {0} несовместим с текущей системой конфигурации ввода.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "Профиль по умолчанию не может быть перезаписан", - "DialogProfileDeleteProfileTitle": "Удаление профиля", - "DialogProfileDeleteProfileMessage": "Это действие необратимо. Вы уверены, что хотите продолжить?", - "DialogWarning": "Внимание", - "DialogPPTCDeletionMessage": "Вы собираетесь перестроить кэш PPTC при следующем запуске для:\n\n{0}\n\nВы уверены, что хотите продолжить?", - "DialogPPTCDeletionErrorMessage": "Ошибка очистки кэша PPTC в {0}: {1}", - "DialogShaderDeletionMessage": "Вы собираетесь удалить кэш шейдеров для:\n\n{0}\n\nВы уверены, что хотите продолжить?", - "DialogShaderDeletionErrorMessage": "Ошибка очистки кэша шейдеров в {0}: {1}", - "DialogRyujinxErrorMessage": "Ryujinx обнаружил ошибку", - "DialogInvalidTitleIdErrorMessage": "Ошибка пользовательского интерфейса: выбранная игра не имеет действительного ID.", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Валидная системная прошивка не найдена в {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Установить прошивку {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "Будет установлена версия прошивки {0}.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nЭто заменит текущую версию прошивки {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nПродолжить?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Установка прошивки...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Прошивка версии {0} успешно установлена.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "Если выбранный профиль будет удален, другие профили не будут открываться.", - "DialogUserProfileDeletionConfirmMessage": "Удалить выбранный профиль?", - "DialogUserProfileUnsavedChangesTitle": "Внимание - Несохраненные изменения", - "DialogUserProfileUnsavedChangesMessage": "В эту учетную запись внесены изменения, которые не были сохранены.", - "DialogUserProfileUnsavedChangesSubMessage": "Отменить изменения?", - "DialogControllerSettingsModifiedConfirmMessage": "Текущие настройки управления обновлены.", - "DialogControllerSettingsModifiedConfirmSubMessage": "Сохранить?", - "DialogLoadFileErrorMessage": "{0}. Файл с ошибкой: {1}", - "DialogModAlreadyExistsMessage": "Мод уже существует", - "DialogModInvalidMessage": "Выбранная папка не содержит модов", - "DialogModDeleteNoParentMessage": "Невозможно удалить: не удалось найти папку мода \"{0}\"", - "DialogDlcNoDlcErrorMessage": "Указанный файл не содержит DLC для выбранной игры", - "DialogPerformanceCheckLoggingEnabledMessage": "У вас включено ведение журнала отладки, предназначенное только для разработчиков.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "Для оптимальной производительности рекомендуется отключить ведение журнала отладки. Хотите отключить ведение журнала отладки?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "У вас включен дамп шейдеров, который предназначен только для разработчиков.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Для оптимальной производительности рекомендуется отключить дамп шейдеров. Хотите отключить дамп шейдеров?", - "DialogLoadAppGameAlreadyLoadedMessage": "Игра уже загружена", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Пожалуйста, остановите эмуляцию или закройте эмулятор перед запуском другой игры.", - "DialogUpdateAddUpdateErrorMessage": "Указанный файл не содержит обновлений для выбранного приложения", - "DialogSettingsBackendThreadingWarningTitle": "Предупреждение: многопоточность в бэкенде", - "DialogSettingsBackendThreadingWarningMessage": "Для применения этой настройки необходимо перезапустить Ryujinx. В зависимости от используемой вами операционной системы вам может потребоваться вручную отключить многопоточность драйвера при использовании Ryujinx.", - "DialogModManagerDeletionWarningMessage": "Вы сейчас удалите мод: {0}\n\nВы уверены, что хотите продолжить?", - "DialogModManagerDeletionAllWarningMessage": "Вы сейчас удалите все выбранные моды для этой игры.\n\nВы уверены, что хотите продолжить?", - "SettingsTabGraphicsFeaturesOptions": "Функции & Улучшения", - "SettingsTabGraphicsBackendMultithreading": "Многопоточность графического бэкенда:", - "CommonAuto": "Автоматически", - "CommonOff": "Выключено", - "CommonOn": "Включено", - "InputDialogYes": "Да", - "InputDialogNo": "Нет", - "DialogProfileInvalidProfileNameErrorMessage": "Имя файла содержит недопустимые символы. Пожалуйста, попробуйте еще раз.", - "MenuBarOptionsPauseEmulation": "Пауза эмуляции", - "MenuBarOptionsResumeEmulation": "Продолжить", - "AboutUrlTooltipMessage": "Нажмите, чтобы открыть веб-сайт Ryujinx", - "AboutDisclaimerMessage": "Ryujinx никоим образом не связан ни с Nintendo™, ни с кем-либо из ее партнеров.", - "AboutAmiiboDisclaimerMessage": "Amiibo API (www.amiiboapi.com) используется для эмуляции Amiibo.", - "AboutPatreonUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx на Patreon", - "AboutGithubUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx на GitHub", - "AboutDiscordUrlTooltipMessage": "Нажмите, чтобы открыть приглашение на сервер Ryujinx в Discord", - "AboutTwitterUrlTooltipMessage": "Нажмите, чтобы открыть страницу Ryujinx в X (бывший Twitter)", - "AboutRyujinxAboutTitle": "О программе:", - "AboutRyujinxAboutContent": "Ryujinx — это эмулятор Nintendo Switch™.\nПожалуйста, поддержите нас на Patreon.\nЧитайте последние новости в наших X (Twitter) или Discord.\nРазработчики, заинтересованные в участии, могут ознакомиться с проектом на GitHub или в Discord.", - "AboutRyujinxMaintainersTitle": "Разработка:", - "AboutRyujinxMaintainersContentTooltipMessage": "Нажмите, чтобы открыть страницу с участниками", - "AboutRyujinxSupprtersTitle": "Поддержка на Patreon:", - "AmiiboSeriesLabel": "Серия Amiibo", - "AmiiboCharacterLabel": "Персонаж", - "AmiiboScanButtonLabel": "Сканировать", - "AmiiboOptionsShowAllLabel": "Показать все Amiibo", - "AmiiboOptionsUsRandomTagLabel": "Хак: Использовать случайный тег Uuid", - "DlcManagerTableHeadingEnabledLabel": "Включено", - "DlcManagerTableHeadingTitleIdLabel": "ID приложения", - "DlcManagerTableHeadingContainerPathLabel": "Путь к контейнеру", - "DlcManagerTableHeadingFullPathLabel": "Полный путь", - "DlcManagerRemoveAllButton": "Удалить все", - "DlcManagerEnableAllButton": "Включить все", - "DlcManagerDisableAllButton": "Отключить все", - "ModManagerDeleteAllButton": "Удалить все", - "MenuBarOptionsChangeLanguage": "Сменить язык", - "MenuBarShowFileTypes": "Показывать форматы файлов", - "CommonSort": "Сортировка", - "CommonShowNames": "Показывать названия", - "CommonFavorite": "Избранное", - "OrderAscending": "По возрастанию", - "OrderDescending": "По убыванию", - "SettingsTabGraphicsFeatures": "Функции", - "ErrorWindowTitle": "Окно ошибки", - "ToggleDiscordTooltip": "Включает или отключает отображение статуса \"Играет в игру\" в Discord", - "AddGameDirBoxTooltip": "Введите путь к папке с играми для добавления ее в список выше", - "AddGameDirTooltip": "Добавить папку с играми в список", - "RemoveGameDirTooltip": "Удалить выбранную папку игры", - "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list", - "AddAutoloadDirTooltip": "Add an autoload directory to the list", - "RemoveAutoloadDirTooltip": "Remove selected autoload directory", - "CustomThemeCheckTooltip": "Включить или отключить пользовательские темы", - "CustomThemePathTooltip": "Путь к пользовательской теме для интерфейса", - "CustomThemeBrowseTooltip": "Просмотр пользовательской темы интерфейса", - "DockModeToggleTooltip": "\"Стационарный\" режим запускает эмулятор, как если бы Nintendo Switch находилась в доке, что улучшает графику и разрешение в большинстве игр. И наоборот, при отключении этого режима эмулятор будет запускать игры в \"Портативном\" режиме, снижая качество графики.\n\nНастройте управление для Игрока 1 если планируете использовать в \"Стационарном\" режиме; настройте портативное управление если планируете использовать эмулятор в \"Портативном\" режиме.\n\nРекомендуется оставить включенным.", - "DirectKeyboardTooltip": "Поддержка прямого ввода с клавиатуры (HID). Предоставляет игре прямой доступ к клавиатуре в качестве устройства ввода текста.\nРаботает только с играми, которые изначально поддерживают использование клавиатуры с Switch.\nРекомендуется оставить выключенным.", - "DirectMouseTooltip": "Поддержка прямого ввода мыши (HID). Предоставляет игре прямой доступ к мыши в качестве указывающего устройства.\nРаботает только с играми, которые изначально поддерживают использование мыши совместно с железом Switch.\nРекомендуется оставить выключенным.", - "RegionTooltip": "Сменяет регион прошивки", - "LanguageTooltip": "Меняет язык прошивки", - "TimezoneTooltip": "Меняет часовой пояс прошивки", - "TimeTooltip": "Меняет системное время прошивки", - "VSyncToggleTooltip": "Эмуляция вертикальной синхронизации консоли, которая ограничивает количество кадров в секунду в большинстве игр; отключение может привести к тому, что игры будут запущены с более высокой частотой кадров, но загрузка игры может занять больше времени, либо игра не запустится вообще.\n\nМожно включать и выключать эту настройку непосредственно в игре с помощью горячих клавиш (F1 по умолчанию). Если планируете отключить вертикальную синхронизацию, рекомендуем настроить горячие клавиши.\n\nРекомендуется оставить включенным.", - "PptcToggleTooltip": "Сохраняет скомпилированные JIT-функции для того, чтобы не преобразовывать их по новой каждый раз при запуске игры.\n\nУменьшает статтеры и значительно ускоряет последующую загрузку игр.\n\nРекомендуется оставить включенным.", - "LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", - "FsIntegrityToggleTooltip": "Проверяет файлы при загрузке игры и если обнаружены поврежденные файлы, выводит сообщение о поврежденном хэше в журнале.\n\nНе влияет на производительность и необходим для помощи в устранении неполадок.\n\nРекомендуется оставить включенным.", - "AudioBackendTooltip": "Изменяет используемый аудио бэкенд для рендера звука.\n\nSDL2 является предпочтительным вариантом, в то время как OpenAL и SoundIO используются в качестве резервных.\n\nРекомендуется использование SDL2.", - "MemoryManagerTooltip": "Меняет разметку и доступ к гостевой памяти. Значительно влияет на производительность процессора.\n\nРекомендуется оставить \"Хост не установлен\"", - "MemoryManagerSoftwareTooltip": "Использует таблицу страниц для преобразования адресов. \nСамая высокая точность, но самая низкая производительность.", - "MemoryManagerHostTooltip": "Прямая разметка памяти в адресном пространстве хоста. \nЗначительно более быстрые запуск и компиляция JIT.", - "MemoryManagerUnsafeTooltip": "Производит прямую разметку памяти, но не маскирует адрес в гостевом адресном пространстве перед получением доступа. \nБыстро, но небезопасно. Гостевое приложение может получить доступ к памяти из Ryujinx, поэтому в этом режиме рекомендуется запускать только те программы, которым вы доверяете.", - "UseHypervisorTooltip": "Использует Hypervisor вместо JIT. Значительно увеличивает производительность, но может работать нестабильно.", - "DRamTooltip": "Использует альтернативный макет MemoryMode для имитации использования Nintendo Switch в режиме разработчика.\n\nПолезно только для пакетов текстур с высоким разрешением или модов добавляющих разрешение 4К. Не улучшает производительность.\n\nРекомендуется оставить выключенным.", - "IgnoreMissingServicesTooltip": "Игнорирует нереализованные сервисы Horizon в новых прошивках. Эта настройка поможет избежать вылеты при запуске определенных игр.\n\nРекомендуется оставить выключенным.", - "IgnoreAppletTooltip": "Внешний диалог \"Апплет контроллера\" не появится, если геймпад будет отключен во время игры. Не будет предложено закрыть диалог или настроить новый контроллер. После повторного подключения ранее отключенного контроллера игра автоматически возобновится.", - "GraphicsBackendThreadingTooltip": "Выполняет команды графического бэкенда на втором потоке.\n\nУскоряет компиляцию шейдеров, уменьшает статтеры и повышает производительность на драйверах видеоадаптера без поддержки многопоточности. Производительность на драйверах с многопоточностью немного выше.\n\nРекомендуется оставить Автоматически.", - "GalThreadingTooltip": "Выполняет команды графического бэкенда на втором потоке.\n\nУскоряет компиляцию шейдеров, уменьшает статтеры и повышает производительность на драйверах видеоадаптера без поддержки многопоточности. Производительность на драйверах с многопоточностью немного выше.\n\nРекомендуется оставить Автоматически.", - "ShaderCacheToggleTooltip": "Сохраняет кэш шейдеров на диске, для уменьшения статтеров при последующих запусках.\n\nРекомендуется оставить включенным.", - "ResolutionScaleTooltip": "Увеличивает разрешение рендера игры.\n\nНекоторые игры могут не работать с этой настройкой и выглядеть смазано даже когда разрешение увеличено. Для таких игр может потребоваться установка модов, которые убирают сглаживание или увеличивают разрешение рендеринга. \nДля использования последнего, вам нужно будет выбрать опцию \"Нативное\".\n\nЭта опция может быть изменена во время игры по нажатию кнопки \"Применить\" ниже. Вы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nИмейте в виду, что \"4x\" является излишеством.", - "ResolutionScaleEntryTooltip": "Масштабирование разрешения с плавающей запятой, например 1,5. Неинтегральное масштабирование с большой вероятностью вызовет сбои в работе.", - "AnisotropyTooltip": "Уровень анизотропной фильтрации. \n\nУстановите значение Автоматически, чтобы использовать значение по умолчанию игры.", - "AspectRatioTooltip": "Соотношение сторон окна рендерера.\n\nИзмените эту настройку только если вы используете мод для соотношения сторон, иначе изображение будет растянуто.\n\nРекомендуется настройка 16:9.", - "ShaderDumpPathTooltip": "Путь с дампами графических шейдеров", - "FileLogTooltip": "Включает ведение журнала в файл на диске. Не влияет на производительность.", - "StubLogTooltip": "Включает ведение журнала-заглушки. Не влияет на производительность.", - "InfoLogTooltip": "Включает вывод сообщений информационного журнала в консоль. Не влияет на производительность.", - "WarnLogTooltip": "Включает вывод сообщений журнала предупреждений в консоль. Не влияет на производительность.", - "ErrorLogTooltip": "Включает вывод сообщений журнала ошибок. Не влияет на производительность.", - "TraceLogTooltip": "Выводит сообщения журнала трассировки в консоли. Не влияет на производительность.", - "GuestLogTooltip": "Включает вывод сообщений гостевого журнала. Не влияет на производительность.", - "FileAccessLogTooltip": "Включает вывод сообщений журнала доступа к файлам.", - "FSAccessLogModeTooltip": "Включает вывод журнала доступа к файловой системе. Возможные режимы: 0-3", - "DeveloperOptionTooltip": "Используйте с осторожностью", - "OpenGlLogLevel": "Требует включения соответствующих уровней ведения журнала", - "DebugLogTooltip": "Выводит журнал сообщений отладки в консоли.\n\nИспользуйте только в случае просьбы разработчика, так как включение этой функции затруднит чтение журналов и ухудшит работу эмулятора.", - "LoadApplicationFileTooltip": "Открывает файловый менеджер для выбора файла, совместимого с Nintendo Switch.", - "LoadApplicationFolderTooltip": "Открывает файловый менеджер для выбора распакованного приложения, совместимого с Nintendo Switch.", - "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from", - "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from", - "OpenRyujinxFolderTooltip": "Открывает папку с файлами Ryujinx. ", - "OpenRyujinxLogsTooltip": "Открывает папку в которую записываются логи", - "ExitTooltip": "Выйти из Ryujinx", - "OpenSettingsTooltip": "Открывает окно параметров", - "OpenProfileManagerTooltip": "Открыть менеджер учетных записей", - "StopEmulationTooltip": "Остановка эмуляции текущей игры и возврат к списку игр", - "CheckUpdatesTooltip": "Проверяет наличие обновлений для Ryujinx", - "OpenAboutTooltip": "Открывает окно «О программе»", - "GridSize": "Размер сетки", - "GridSizeTooltip": "Меняет размер сетки элементов", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Португальский язык (Бразилия)", - "AboutRyujinxContributorsButtonHeader": "Посмотреть всех участников", - "SettingsTabSystemAudioVolume": "Громкость: ", - "AudioVolumeTooltip": "Изменяет громкость звука", - "SettingsTabSystemEnableInternetAccess": "Гостевой доступ в интернет/сетевой режим", - "EnableInternetAccessTooltip": "Позволяет эмулированному приложению подключаться к Интернету.\n\nПри включении этой функции игры с возможностью сетевой игры могут подключаться друг к другу, если все эмуляторы (или реальные консоли) подключены к одной и той же точке доступа.\n\nНЕ разрешает подключение к серверам Nintendo. Может вызвать сбой в некоторых играх, которые пытаются подключиться к Интернету.\n\nРекомендутеся оставить выключенным.", - "GameListContextMenuManageCheatToolTip": "Открывает окно управления читами", - "GameListContextMenuManageCheat": "Управление читами", - "GameListContextMenuManageModToolTip": "Открывает окно управления модами", - "GameListContextMenuManageMod": "Управление модами", - "ControllerSettingsStickRange": "Диапазон:", - "DialogStopEmulationTitle": "Ryujinx - Остановка эмуляции", - "DialogStopEmulationMessage": "Вы уверены, что хотите остановить эмуляцию?", - "SettingsTabCpu": "Процессор", - "SettingsTabAudio": "Аудио", - "SettingsTabNetwork": "Сеть", - "SettingsTabNetworkConnection": "Подключение к сети", - "SettingsTabCpuCache": "Кэш процессора", - "SettingsTabCpuMemory": "Режим процессора", - "DialogUpdaterFlatpakNotSupportedMessage": "Пожалуйста, обновите Ryujinx через FlatHub.", - "UpdaterDisabledWarningTitle": "Средство обновления отключено", - "ControllerSettingsRotate90": "Повернуть на 90° по часовой стрелке", - "IconSize": "Размер обложек", - "IconSizeTooltip": "Меняет размер обложек", - "MenuBarOptionsShowConsole": "Показать консоль", - "ShaderCachePurgeError": "Ошибка очистки кэша шейдеров в {0}: {1}", - "UserErrorNoKeys": "Ключи не найдены", - "UserErrorNoFirmware": "Прошивка не найдена", - "UserErrorFirmwareParsingFailed": "Ошибка извлечения прошивки", - "UserErrorApplicationNotFound": "Приложение не найдено", - "UserErrorUnknown": "Неизвестная ошибка", - "UserErrorUndefined": "Неопределенная ошибка", - "UserErrorNoKeysDescription": "Ryujinx не удалось найти ваш 'prod.keys' файл", - "UserErrorNoFirmwareDescription": "Ryujinx не удалось найти ни одной установленной прошивки", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx не удалось распаковать выбранную прошивку. Обычно это вызвано устаревшими ключами.", - "UserErrorApplicationNotFoundDescription": "Ryujinx не удалось найти валидное приложение по указанному пути.", - "UserErrorUnknownDescription": "Произошла неизвестная ошибка", - "UserErrorUndefinedDescription": "Произошла неизвестная ошибка. Этого не должно происходить, пожалуйста, свяжитесь с разработчиками.", - "OpenSetupGuideMessage": "Открыть руководство по установке", - "NoUpdate": "Без обновлений", - "TitleUpdateVersionLabel": "Version {0} - {1}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - Информация", - "RyujinxConfirm": "Ryujinx - Подтверждение", - "FileDialogAllTypes": "Все типы", - "Never": "Никогда", - "SwkbdMinCharacters": "Должно быть не менее {0} символов.", - "SwkbdMinRangeCharacters": "Должно быть {0}-{1} символов", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Программная клавиатура", - "SoftwareKeyboardModeNumeric": "Должно быть в диапазоне 0-9 или '.'", - "SoftwareKeyboardModeAlphabet": "Не должно быть CJK-символов", - "SoftwareKeyboardModeASCII": "Текст должен быть только в ASCII кодировке", - "ControllerAppletControllers": "Поддерживаемые геймпады:", - "ControllerAppletPlayers": "Игроки:", - "ControllerAppletDescription": "Текущая конфигурация некорректна. Откройте параметры и перенастройте управление.", - "ControllerAppletDocked": "Используется стационарный режим. Управление в портативном режиме должно быть отключено.", - "UpdaterRenaming": "Переименование старых файлов...", - "UpdaterRenameFailed": "Программе обновления не удалось переименовать файл: {0}", - "UpdaterAddingFiles": "Добавление новых файлов...", - "UpdaterExtracting": "Извлечение обновления...", - "UpdaterDownloading": "Загрузка обновления...", - "Docked": "Стационарный режим", - "Handheld": "Портативный режим", - "ConnectionError": "Ошибка соединения", - "AboutPageDeveloperListMore": "{0} и другие...", - "ApiError": "Ошибка API.", - "LoadingHeading": "Загрузка {0}", - "CompilingPPTC": "Компиляция PTC", - "CompilingShaders": "Компиляция шейдеров", - "AllKeyboards": "Все клавиатуры", - "OpenFileDialogTitle": "Выберите совместимый файл для открытия", - "OpenFolderDialogTitle": "Выберите папку с распакованной игрой", - "AllSupportedFormats": "Все поддерживаемые форматы", - "RyujinxUpdater": "Ryujinx - Обновление", - "SettingsTabHotkeys": "Горячие клавиши", - "SettingsTabHotkeysHotkeys": "Горячие клавиши", - "SettingsTabHotkeysToggleVsyncHotkey": "Вертикальная синхронизация:", - "SettingsTabHotkeysScreenshotHotkey": "Сделать скриншот:", - "SettingsTabHotkeysShowUiHotkey": "Показать интерфейс:", - "SettingsTabHotkeysPauseHotkey": "Пауза эмуляции:", - "SettingsTabHotkeysToggleMuteHotkey": "Выключить звук:", - "ControllerMotionTitle": "Настройки управления движением", - "ControllerRumbleTitle": "Настройки вибрации", - "SettingsSelectThemeFileDialogTitle": "Выбрать файл темы", - "SettingsXamlThemeFile": "Файл темы Xaml", - "AvatarWindowTitle": "Управление аккаунтами - Аватар", - "Amiibo": "Amiibo", - "Unknown": "Неизвестно", - "Usage": "Применение", - "Writable": "Доступно для записи", - "SelectDlcDialogTitle": "Выберите файлы DLC", - "SelectUpdateDialogTitle": "Выберите файлы обновлений", - "SelectModDialogTitle": "Выбрать папку с модами", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "Менеджер учетных записей", - "CheatWindowTitle": "Менеджер читов", - "DlcWindowTitle": "Управление DLC для {0} ({1})", - "ModWindowTitle": "Управление модами для {0} ({1})", - "UpdateWindowTitle": "Менеджер обновлений игр", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} new update(s) added", - "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.", - "CheatWindowHeading": "Доступные читы для {0} [{1}]", - "BuildId": "ID версии:", - "DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.", - "DlcWindowHeading": "{0} DLC", - "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} new update(s) added", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "Моды для {0} ", - "UserProfilesEditProfile": "Изменить выбранные", - "Continue": "Continue", - "Cancel": "Отмена", - "Save": "Сохранить", - "Discard": "Отменить", - "Paused": "Приостановлено", - "UserProfilesSetProfileImage": "Установить аватар", - "UserProfileEmptyNameError": "Необходимо ввести никнейм", - "UserProfileNoImageError": "Необходимо установить аватар", - "GameUpdateWindowHeading": "Доступные обновления для {0} ({1})", - "SettingsTabHotkeysResScaleUpHotkey": "Увеличить разрешение:", - "SettingsTabHotkeysResScaleDownHotkey": "Уменьшить разрешение:", - "UserProfilesName": "Никнейм:", - "UserProfilesUserId": "ID пользователя:", - "SettingsTabGraphicsBackend": "Графический бэкенд", - "SettingsTabGraphicsBackendTooltip": "Выберает бэкенд, который будет использован в эмуляторе.\n\nVulkan является лучшим выбором для всех современных графических карт с актуальными драйверами. В Vulkan также включена более быстрая компиляция шейдеров (меньше статтеров) для всех видеоадаптеров.\n\nПри использовании OpenGL можно достичь лучших результатов на старых видеоадаптерах Nvidia и AMD в Linux или на видеоадаптерах с небольшим количеством видеопамяти, хотя статтеров при компиляции шейдеров будет больше.\n\nРекомендуется использовать Vulkan. Используйте OpenGL, если ваш видеоадаптер не поддерживает Vulkan даже с актуальными драйверами.", - "SettingsEnableTextureRecompression": "Пережимать текстуры", - "SettingsEnableTextureRecompressionTooltip": "Сжатие ASTC текстур для уменьшения использования VRAM. \n\nИгры, использующие этот формат текстур: Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder и The Legend of Zelda: Tears of the Kingdom. \nНа видеоадаптерах с 4GiB видеопамяти или менее возможны вылеты при запуске этих игр. \n\nВключите, только если у вас заканчивается видеопамять в вышеупомянутых играх. \n\nРекомендуется оставить выключенным.", - "SettingsTabGraphicsPreferredGpu": "Предпочтительный видеоадаптер", - "SettingsTabGraphicsPreferredGpuTooltip": "Выберает видеоадаптер, который будет использоваться графическим бэкендом Vulkan.\n\nЭта настройка не влияет на видеоадаптер, который будет использоваться с OpenGL.\n\nЕсли вы не уверены что нужно выбрать, используйте графический процессор, помеченный как \"dGPU\". Если его нет, оставьте выбор по умолчанию.", - "SettingsAppRequiredRestartMessage": "Требуется перезапуск Ryujinx", - "SettingsGpuBackendRestartMessage": "Графический бэкенд или настройки графического процессора были изменены. Требуется перезапуск для вступления в силу изменений.", - "SettingsGpuBackendRestartSubMessage": "Перезапустить сейчас?", - "RyujinxUpdaterMessage": "Обновить Ryujinx до последней версии?", - "SettingsTabHotkeysVolumeUpHotkey": "Увеличить громкость:", - "SettingsTabHotkeysVolumeDownHotkey": "Уменьшить громкость:", - "SettingsEnableMacroHLE": "Использовать макрос высокоуровневой эмуляции видеоадаптера", - "SettingsEnableMacroHLETooltip": "Высокоуровневая эмуляции макрокода видеоадаптера.\n\nПовышает производительность, но может вызывать графические артефакты в некоторых играх.\n\nРекомендуется оставить включенным.", - "SettingsEnableColorSpacePassthrough": "Пропускать цветовое пространство", - "SettingsEnableColorSpacePassthroughTooltip": "Направляет бэкенд Vulkan на передачу информации о цвете без указания цветового пространства. Для пользователей с экранами с расширенной гаммой данная настройка приводит к получению более ярких цветов за счет снижения корректности цветопередачи.", - "VolumeShort": "Громкость", - "UserProfilesManageSaves": "Управление сохранениями", - "DeleteUserSave": "Удалить сохранения для этой игры?", - "IrreversibleActionNote": "Данное действие является необратимым.", - "SaveManagerHeading": "Редактирование сохранений для {0} ({1})", - "SaveManagerTitle": "Менеджер сохранений", - "Name": "Название", - "Size": "Размер", - "Search": "Поиск", - "UserProfilesRecoverLostAccounts": "Восстановить учетные записи", - "Recover": "Восстановление", - "UserProfilesRecoverHeading": "Были найдены сохранения для следующих аккаунтов", - "UserProfilesRecoverEmptyList": "Нет учетных записей для восстановления", - "GraphicsAATooltip": "Применимое сглаживание для рендера.\n\nFXAA размывает большую часть изображения, SMAA попытается найти \"зазубренные\" края и сгладить их.\n\nНе рекомендуется использовать вместе с масштабирующим фильтром FSR.\n\nЭта опция может быть изменена во время игры по нажатию \"Применить\" ниже; \nВы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не найдёте подходящую настройку игры.\n\nРекомендуется использовать \"Нет\".", - "GraphicsAALabel": "Сглаживание:", - "GraphicsScalingFilterLabel": "Интерполяция:", - "GraphicsScalingFilterTooltip": "Фильтрация текстур, которая будет применяться при масштабировании.\n\nБилинейная хорошо работает для 3D-игр и является настройкой по умолчанию.\n\nСтупенчатая рекомендуется для пиксельных игр.\n\nFSR это фильтр резкости, который не рекомендуется использовать с FXAA или SMAA.\n\nЭта опция может быть изменена во время игры по нажатию кнопки \"Применить\" ниже; \nВы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nРекомендуется использовать \"Билинейная\".", - "GraphicsScalingFilterBilinear": "Билинейная", - "GraphicsScalingFilterNearest": "Ступенчатая", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "Уровень", - "GraphicsScalingFilterLevelTooltip": "Выбор режима работы FSR 1.0. Выше - четче.", - "SmaaLow": "SMAA Низкое", - "SmaaMedium": "SMAA Среднее", - "SmaaHigh": "SMAA Высокое", - "SmaaUltra": "SMAA Ультра", - "UserEditorTitle": "Редактирование пользователя", - "UserEditorTitleCreate": "Создание пользователя", - "SettingsTabNetworkInterface": "Сетевой интерфейс:", - "NetworkInterfaceTooltip": "Сетевой интерфейс, используемый для функций LAN/LDN.\n\nМожет использоваться для игры через интернет в сочетании с VPN или XLink Kai и игрой с поддержкой LAN.\n\nРекомендуется использовать \"По умолчанию\".", - "NetworkInterfaceDefault": "По умолчанию", - "PackagingShaders": "Упаковка шейдеров", - "AboutChangelogButton": "Список изменений на GitHub", - "AboutChangelogButtonTooltipMessage": "Нажмите, чтобы открыть список изменений для этой версии", - "SettingsTabNetworkMultiplayer": "Мультиплеер", - "MultiplayerMode": "Режим:", - "MultiplayerModeTooltip": "Меняет многопользовательский режим LDN.\n\nLdnMitm модифицирует функциональность локальной беспроводной/игры на одном устройстве в играх, позволяя играть с другими пользователями Ryujinx или взломанными консолями Nintendo Switch с установленным модулем ldn_mitm, находящимися в одной локальной сети друг с другом.\n\nМногопользовательская игра требует наличия у всех игроков одной и той же версии игры (т.е. Super Smash Bros. Ultimate v13.0.1 не может подключиться к v13.0.0).\n\nРекомендуется оставить отключенным.", - "MultiplayerModeDisabled": "Отключено", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/th_TH.json b/src/Ryujinx/Assets/Locales/th_TH.json deleted file mode 100644 index e29004e10..000000000 --- a/src/Ryujinx/Assets/Locales/th_TH.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "ภาษาไทย", - "MenuBarFileOpenApplet": "เปิด Applet", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "เปิดโปรแกรม Mii Editor Applet", - "SettingsTabInputDirectMouseAccess": "เข้าถึงเมาส์ได้โดยตรง", - "SettingsTabSystemMemoryManagerMode": "โหมดจัดการหน่วยความจำ:", - "SettingsTabSystemMemoryManagerModeSoftware": "ซอฟต์แวร์", - "SettingsTabSystemMemoryManagerModeHost": "โฮสต์ (เร็ว)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "ไม่ได้ตรวจสอบโฮสต์ (เร็วที่สุด, แต่ไม่ปลอดภัย)", - "SettingsTabSystemUseHypervisor": "ใช้งาน Hypervisor", - "MenuBarFile": "ไฟล์", - "MenuBarFileOpenFromFile": "โหลดแอปพลิเคชั่นจากไฟล์", - "MenuBarFileOpenFromFileError": "ไม่พบแอปพลิเคชั่นจากไฟล์ที่เลือก", - "MenuBarFileOpenUnpacked": "โหลดเกมที่แตกไฟล์แล้ว", - "MenuBarFileLoadDlcFromFolder": "โหลด DLC จากโฟลเดอร์", - "MenuBarFileLoadTitleUpdatesFromFolder": "โหลดไฟล์อัพเดตจากโฟลเดอร์", - "MenuBarFileOpenEmuFolder": "เปิดโฟลเดอร์ Ryujinx", - "MenuBarFileOpenLogsFolder": "เปิดโฟลเดอร์ Logs", - "MenuBarFileExit": "_ออก", - "MenuBarOptions": "_ตัวเลือก", - "MenuBarOptionsToggleFullscreen": "สลับเป็นโหมดเต็มหน้าจอ", - "MenuBarOptionsStartGamesInFullscreen": "เริ่มเกมในโหมดเต็มหน้าจอ", - "MenuBarOptionsStopEmulation": "หยุดการจำลอง", - "MenuBarOptionsSettings": "_ตั้งค่า", - "MenuBarOptionsManageUserProfiles": "_จัดการโปรไฟล์ผู้ใช้งาน", - "MenuBarActions": "การดำเนินการ", - "MenuBarOptionsSimulateWakeUpMessage": "จำลองข้อความปลุก", - "MenuBarActionsScanAmiibo": "สแกนหา Amiibo", - "MenuBarTools": "_เครื่องมือ", - "MenuBarToolsInstallFirmware": "ติดตั้งเฟิร์มแวร์", - "MenuBarFileToolsInstallFirmwareFromFile": "ติดตั้งเฟิร์มแวร์จาก ไฟล์ XCI หรือ ไฟล์ ZIP", - "MenuBarFileToolsInstallFirmwareFromDirectory": "ติดตั้งเฟิร์มแวร์จากไดเร็กทอรี", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "จัดการประเภทไฟล์", - "MenuBarToolsInstallFileTypes": "ติดตั้งประเภทไฟล์", - "MenuBarToolsUninstallFileTypes": "ถอนการติดตั้งประเภทไฟล์", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_มุมมอง", - "MenuBarViewWindow": "ขนาดหน้าต่าง", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_ช่วยเหลือ", - "MenuBarHelpCheckForUpdates": "ตรวจสอบอัปเดต", - "MenuBarHelpAbout": "เกี่ยวกับ", - "MenuSearch": "กำลังค้นหา...", - "GameListHeaderFavorite": "ชื่นชอบ", - "GameListHeaderIcon": "ไอคอน", - "GameListHeaderApplication": "ชื่อ", - "GameListHeaderDeveloper": "ผู้พัฒนา", - "GameListHeaderVersion": "เวอร์ชั่น", - "GameListHeaderTimePlayed": "เล่นไปแล้ว", - "GameListHeaderLastPlayed": "เล่นล่าสุด", - "GameListHeaderFileExtension": "นามสกุลไฟล์", - "GameListHeaderFileSize": "ขนาดไฟล์", - "GameListHeaderPath": "ที่อยู่ไฟล์", - "GameListContextMenuOpenUserSaveDirectory": "เปิดไดเร็กทอรี่บันทึกของผู้ใช้", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "เปิดไดเร็กทอรี่ซึ่งมีการบันทึกข้อมูลของผู้ใช้แอปพลิเคชัน", - "GameListContextMenuOpenDeviceSaveDirectory": "เปิดไดเร็กทอรี่บันทึกของอุปกรณ์", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "เปิดไดเรกทอรี่ซึ่งมีบันทึกข้อมูลของอุปกรณ์ในแอปพลิเคชัน", - "GameListContextMenuOpenBcatSaveDirectory": "เปิดไดเรกทอรี่บันทึกของ BCAT", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "เปิดไดเรกทอรี่ซึ่งมีการบันทึกข้อมูลของ BCAT ในแอปพลิเคชัน", - "GameListContextMenuManageTitleUpdates": "จัดการเวอร์ชั่นอัปเดต", - "GameListContextMenuManageTitleUpdatesToolTip": "เปิดหน้าต่างการจัดการเวอร์ชั่นการอัพเดต", - "GameListContextMenuManageDlc": "จัดการ DLC", - "GameListContextMenuManageDlcToolTip": "เปิดหน้าต่างจัดการ DLC", - "GameListContextMenuCacheManagement": "จัดการแคช", - "GameListContextMenuCacheManagementPurgePptc": "เพิ่มคิวการสร้าง PPTC ใหม่", - "GameListContextMenuCacheManagementPurgePptcToolTip": "ให้ PPTC สร้างใหม่ในเวลาบูตเมื่อเปิดเกมครั้งถัดไป", - "GameListContextMenuCacheManagementPurgeShaderCache": "ล้างแคช แสงเงา", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "ลบแคช แสงเงา ของแอปพลิเคชัน", - "GameListContextMenuCacheManagementOpenPptcDirectory": "เปิดไดเรกทอรี่ PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "เปิดไดเร็กทอรี่ของ แคช PPTC ในแอปพลิเคชัน", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "เปิดไดเรกทอรี่ แคช แสงเงา", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "เปิดไดเรกทอรี่ของ แคช แสงเงา ในแอปพลิเคชัน", - "GameListContextMenuExtractData": "แยกส่วนข้อมูล", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "แยกส่วน ExeFS ออกจากการตั้งค่าปัจจุบันของแอปพลิเคชัน (รวมถึงอัปเดต)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "แยกส่วน RomFS ออกจากการตั้งค่าปัจจุบันของแอปพลิเคชัน (รวมถึงอัพเดต)", - "GameListContextMenuExtractDataLogo": "โลโก้", - "GameListContextMenuExtractDataLogoToolTip": "แยกส่วน โลโก้ ออกจากการตั้งค่าปัจจุบันของแอปพลิเคชัน (รวมถึงอัปเดต)", - "GameListContextMenuCreateShortcut": "สร้างทางลัดของแอปพลิเคชัน", - "GameListContextMenuCreateShortcutToolTip": "สร้างทางลัดบนเดสก์ท็อปสำหรับใช้แอปพลิเคชันที่เลือก", - "GameListContextMenuCreateShortcutToolTipMacOS": "สร้างทางลัดในโฟลเดอร์ Applications ของ macOS สำหรับใช้แอปพลิเคชันที่เลือก", - "GameListContextMenuOpenModsDirectory": "เปิดไดเร็กทอรี่ Mods", - "GameListContextMenuOpenModsDirectoryToolTip": "เปิดไดเร็กทอรี่ Mods ของแอปพลิเคชัน", - "GameListContextMenuOpenSdModsDirectory": "เปิดไดเร็กทอรี่ Mods Atmosphere", - "GameListContextMenuOpenSdModsDirectoryToolTip": "เปิดไดเร็กทอรี่ Atmosphere ของการ์ด SD สำรองซึ่งมี Mods ของแอปพลิเคชัน ซึ่งมีประโยชน์สำหรับ Mods ที่บรรจุมากับฮาร์ดแวร์จริง", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "เกมส์โหลดแล้ว {0}/{1}", - "StatusBarSystemVersion": "เวอร์ชั่นของระบบ: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "การตั้งค่าหน่วยความถึงขีดจำกัดต่ำสุดแล้ว", - "LinuxVmMaxMapCountDialogTextPrimary": "คุณต้องเพิ่มค่า vm.max_map_count ไปยัง {0}", - "LinuxVmMaxMapCountDialogTextSecondary": "บางเกมอาจพยายามใช้งานหน่วยความจำมากกว่าที่ได้รับอนุญาตในปัจจุบัน Ryujinx จะปิดตัวลงเมื่อเกินขีดจำกัดนี้", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "ใช่, จนกว่าจะรีสตาร์ทครั้งถัดไป", - "LinuxVmMaxMapCountDialogButtonPersistent": "ใช่, อย่างถาวร", - "LinuxVmMaxMapCountWarningTextPrimary": "จำนวนสูงสุดของการจัดการหน่วยความจำ ต่ำกว่าที่แนะนำ", - "LinuxVmMaxMapCountWarningTextSecondary": "ค่าปัจจุบันของ vm.max_map_count ({0}) มีค่าต่ำกว่า {1} บางเกมอาจพยายามใช้หน่วยความจำมากกว่าที่ได้รับอนุญาตในปัจจุบัน Ryujinx จะปิดตัวลงเมื่อเกินขีดจำกัดนี้\n\nคุณอาจต้องการตั้งค่าเพิ่มขีดจำกัดด้วยตนเองหรือติดตั้ง pkexec ซึ่งอนุญาตให้ Ryujinx ช่วยเหลือคุณได้", - "Settings": "ตั้งค่า", - "SettingsTabGeneral": "หน้าจอผู้ใช้", - "SettingsTabGeneralGeneral": "ทั่วไป", - "SettingsTabGeneralEnableDiscordRichPresence": "เปิดใช้งาน Discord Rich Presence", - "SettingsTabGeneralCheckUpdatesOnLaunch": "ตรวจหาการอัปเดตเมื่อเปิดโปรแกรม", - "SettingsTabGeneralShowConfirmExitDialog": "แสดง \"ปุ่มยืนยันการออก\" เมื่อออกเกม", - "SettingsTabGeneralRememberWindowState": "จดจำ ขนาดหน้าต่างแอพพลิเคชั่น/คำแหน่ง", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "ซ่อน เคอร์เซอร์:", - "SettingsTabGeneralHideCursorNever": "ไม่ต้อง", - "SettingsTabGeneralHideCursorOnIdle": "เมื่อไม่ได้ใช้งาน", - "SettingsTabGeneralHideCursorAlways": "ตลอดเวลา", - "SettingsTabGeneralGameDirectories": "ไดเรกทอรี่ของเกม", - "SettingsTabGeneralAutoloadDirectories": "โหลดไดเรกทอรี DLC/ไฟล์อัปเดต อัตโนมัติ", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "เพิ่ม", - "SettingsTabGeneralRemove": "เอาออก", - "SettingsTabSystem": "ระบบ", - "SettingsTabSystemCore": "แกนกลาง", - "SettingsTabSystemSystemRegion": "ภูมิภาคของระบบ:", - "SettingsTabSystemSystemRegionJapan": "ญี่ปุ่น", - "SettingsTabSystemSystemRegionUSA": "สหรัฐอเมริกา", - "SettingsTabSystemSystemRegionEurope": "ยุโรป", - "SettingsTabSystemSystemRegionAustralia": "ออสเตรเลีย", - "SettingsTabSystemSystemRegionChina": "จีน", - "SettingsTabSystemSystemRegionKorea": "เกาหลี", - "SettingsTabSystemSystemRegionTaiwan": "ไต้หวัน", - "SettingsTabSystemSystemLanguage": "ภาษาของระบบ:", - "SettingsTabSystemSystemLanguageJapanese": "ญี่ปุ่น", - "SettingsTabSystemSystemLanguageAmericanEnglish": "อังกฤษ (อเมริกัน)", - "SettingsTabSystemSystemLanguageFrench": "ฝรั่งเศส", - "SettingsTabSystemSystemLanguageGerman": "เยอรมัน", - "SettingsTabSystemSystemLanguageItalian": "อิตาลี", - "SettingsTabSystemSystemLanguageSpanish": "สเปน", - "SettingsTabSystemSystemLanguageChinese": "จีน", - "SettingsTabSystemSystemLanguageKorean": "เกาหลี", - "SettingsTabSystemSystemLanguageDutch": "ดัตช์", - "SettingsTabSystemSystemLanguagePortuguese": "โปรตุเกส", - "SettingsTabSystemSystemLanguageRussian": "รัสเซีย", - "SettingsTabSystemSystemLanguageTaiwanese": "จีนตัวเต็ม (ไต้หวัน)", - "SettingsTabSystemSystemLanguageBritishEnglish": "อังกฤษ (บริติช)", - "SettingsTabSystemSystemLanguageCanadianFrench": "ฝรั่งเศส (แคนาดา)", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "สเปน (ลาตินอเมริกา)", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "จีน (ตัวย่อ)", - "SettingsTabSystemSystemLanguageTraditionalChinese": "จีน (ดั้งเดิม)", - "SettingsTabSystemSystemTimeZone": "เขตเวลาของระบบ:", - "SettingsTabSystemSystemTime": "เวลาของระบบ:", - "SettingsTabSystemEnableVsync": "VSync", - "SettingsTabSystemEnablePptc": "PPTC (แคชโปรไฟล์การแปลแบบถาวร)", - "SettingsTabSystemEnableLowPowerPptc": "PPTC แบบพลังงานตํ่า", - "SettingsTabSystemEnableFsIntegrityChecks": "ตรวจสอบความถูกต้องของ FS", - "SettingsTabSystemAudioBackend": "ระบบเสียงเบื้องหลัง:", - "SettingsTabSystemAudioBackendDummy": "Dummy", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "แฮ็ก", - "SettingsTabSystemHacksNote": "อาจทำให้เกิดข้อผิดพลาดได้", - "SettingsTabSystemDramSize": "ใช้หน่วยความจำสำรอง (โหมดนักพัฒนา)", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "เมินเฉยบริการที่หายไป", - "SettingsTabSystemIgnoreApplet": "เมินเฉย Applet", - "SettingsTabGraphics": "กราฟฟิก", - "SettingsTabGraphicsAPI": "API กราฟฟิก", - "SettingsTabGraphicsEnableShaderCache": "เปิดใช้งาน แคชแสงเงา", - "SettingsTabGraphicsAnisotropicFiltering": "ตัวกรองแบบ Anisotropic:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "อัตโนมัติ", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "อัตราส่วนความละเอียด:", - "SettingsTabGraphicsResolutionScaleCustom": "กำหนดเอง (ไม่แนะนำ)", - "SettingsTabGraphicsResolutionScaleNative": "พื้นฐานระบบ (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (ไม่แนะนำ)", - "SettingsTabGraphicsAspectRatio": "อัตราส่วนภาพ:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "ยืดภาพเพื่อให้พอดีกับหน้าต่าง", - "SettingsTabGraphicsDeveloperOptions": "ตัวเลือกนักพัฒนา", - "SettingsTabGraphicsShaderDumpPath": "ที่เก็บ ดัมพ์ไฟล์ แสงเงา:", - "SettingsTabLogging": "ประวัติ", - "SettingsTabLoggingLogging": "ประวัติ", - "SettingsTabLoggingEnableLoggingToFile": "เปิดใช้งานการบันทึกประวัติ ไปยังไฟล์", - "SettingsTabLoggingEnableStubLogs": "เปิดใช้งานการบันทึกประวัติ", - "SettingsTabLoggingEnableInfoLogs": "เปิดใช้งานการบันทึกประวัติการใช้งาน", - "SettingsTabLoggingEnableWarningLogs": "เปิดใช้งานการบันทึกประวัติคำเตือน", - "SettingsTabLoggingEnableErrorLogs": "เปิดใช้งานการบันทึกประวัติข้อผิดพลาด", - "SettingsTabLoggingEnableTraceLogs": "เปิดใช้งานการบันทึกประวัติการติดตาม", - "SettingsTabLoggingEnableGuestLogs": "เปิดใช้งานการบันทึกประวัติผู้เยี่ยมชม", - "SettingsTabLoggingEnableFsAccessLogs": "เปิดใช้งานการบันทึกประวัติการเข้าถึง Fs", - "SettingsTabLoggingFsGlobalAccessLogMode": "โหมด การเข้าถึงประวัติส่วนกลาง:", - "SettingsTabLoggingDeveloperOptions": "ตัวเลือกนักพัฒนา", - "SettingsTabLoggingDeveloperOptionsNote": "คำเตือน: จะทำให้ประสิทธิภาพลดลง", - "SettingsTabLoggingGraphicsBackendLogLevel": "ระดับการบันทึกประวัติ กราฟิกเบื้องหลัง:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "ไม่มี", - "SettingsTabLoggingGraphicsBackendLogLevelError": "ผิดพลาด", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "ช้าลง", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "ทั้งหมด", - "SettingsTabLoggingEnableDebugLogs": "เปิดใช้งาน ประวัติข้อบกพร่อง", - "SettingsTabInput": "ป้อนข้อมูล", - "SettingsTabInputEnableDockedMode": "ด็อกโหมด", - "SettingsTabInputDirectKeyboardAccess": "เข้าถึงคีย์บอร์ดโดยตรง", - "SettingsButtonSave": "บันทึก", - "SettingsButtonClose": "ปิด", - "SettingsButtonOk": "ตกลง", - "SettingsButtonCancel": "ยกเลิก", - "SettingsButtonApply": "นำไปใช้", - "ControllerSettingsPlayer": "ผู้เล่น", - "ControllerSettingsPlayer1": "ผู้เล่นคนที่ 1", - "ControllerSettingsPlayer2": "ผู้เล่นคนที่ 2", - "ControllerSettingsPlayer3": "ผู้เล่นคนที่ 3", - "ControllerSettingsPlayer4": "ผู้เล่นคนที่ 4", - "ControllerSettingsPlayer5": "ผู้เล่นคนที่ 5", - "ControllerSettingsPlayer6": "ผู้เล่นคนที่ 6", - "ControllerSettingsPlayer7": "ผู้เล่นคนที่ 7", - "ControllerSettingsPlayer8": "ผู้เล่นคนที่ 8", - "ControllerSettingsHandheld": "แฮนด์เฮลด์โหมด", - "ControllerSettingsInputDevice": "อุปกรณ์ป้อนข้อมูล", - "ControllerSettingsRefresh": "รีเฟรช", - "ControllerSettingsDeviceDisabled": "ปิดการใช้งาน", - "ControllerSettingsControllerType": "ประเภทคอนโทรลเลอร์", - "ControllerSettingsControllerTypeHandheld": "แฮนด์เฮลด์", - "ControllerSettingsControllerTypeProController": "โปรคอนโทรลเลอร์", - "ControllerSettingsControllerTypeJoyConPair": "จับคู่ จอยคอน", - "ControllerSettingsControllerTypeJoyConLeft": "จอยคอน ด้านซ้าย", - "ControllerSettingsControllerTypeJoyConRight": "จอยคอน ด้านขวา", - "ControllerSettingsProfile": "โปรไฟล์", - "ControllerSettingsProfileDefault": "ค่าเริ่มต้น", - "ControllerSettingsLoad": "โหลด", - "ControllerSettingsAdd": "เพิ่ม", - "ControllerSettingsRemove": "เอาออก", - "ControllerSettingsButtons": "ปุ่มกด", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "ปุ่มลูกศร", - "ControllerSettingsDPadUp": "ขึ้น", - "ControllerSettingsDPadDown": "ลง", - "ControllerSettingsDPadLeft": "ซ้าย", - "ControllerSettingsDPadRight": "ขวา", - "ControllerSettingsStickButton": "ปุ่ม", - "ControllerSettingsStickUp": "ขึ้น", - "ControllerSettingsStickDown": "ลง", - "ControllerSettingsStickLeft": "ซ้าย", - "ControllerSettingsStickRight": "ขวา", - "ControllerSettingsStickStick": "จอยสติ๊ก", - "ControllerSettingsStickInvertXAxis": "กลับทิศทางของแกน X", - "ControllerSettingsStickInvertYAxis": "กลับทิศทางของแกน Y", - "ControllerSettingsStickDeadzone": "โซนที่ไม่ทำงานของ จอยสติ๊ก:", - "ControllerSettingsLStick": "จอยสติ๊ก ด้านซ้าย", - "ControllerSettingsRStick": "จอยสติ๊ก ด้านขวา", - "ControllerSettingsTriggersLeft": "ทริกเกอร์ ด้านซ้าย", - "ControllerSettingsTriggersRight": "ทริกเกอร์ ด้านขวา", - "ControllerSettingsTriggersButtonsLeft": "ปุ่มทริกเกอร์ ด้านซ้าย", - "ControllerSettingsTriggersButtonsRight": "ปุ่มทริกเกอร์ ด้านขวา", - "ControllerSettingsTriggers": "ทริกเกอร์", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "ปุ่มกดเสริม ด้านซ้าย", - "ControllerSettingsExtraButtonsRight": "ปุ่มกดเสริม ด้านขวา", - "ControllerSettingsMisc": "การควบคุมเพิ่มเติม", - "ControllerSettingsTriggerThreshold": "ตั้งค่าขีดจำกัดการกด:", - "ControllerSettingsMotion": "การเคลื่อนไหว", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "ใช้การเคลื่อนไหวที่เข้ากันได้กับ CemuHook", - "ControllerSettingsMotionControllerSlot": "ช่องเสียบ คอนโทรลเลอร์:", - "ControllerSettingsMotionMirrorInput": "นำเข้าการสะท้อน การควบคุม", - "ControllerSettingsMotionRightJoyConSlot": "ช่องเสียบ จอยคอน ด้านขวา:", - "ControllerSettingsMotionServerHost": "เจ้าของเซิร์ฟเวอร์:", - "ControllerSettingsMotionGyroSensitivity": "ความไวของ Gyro:", - "ControllerSettingsMotionGyroDeadzone": "ส่วนไม่ทำงานของ Gyro:", - "ControllerSettingsSave": "บันทึก", - "ControllerSettingsClose": "ปิด", - "KeyUnknown": "ไม่รู้จัก", - "KeyShiftLeft": "Shift Left", - "KeyShiftRight": "Shift Right", - "KeyControlLeft": "Ctrl Left", - "KeyMacControlLeft": "⌃ Left", - "KeyControlRight": "Ctrl Right", - "KeyMacControlRight": "⌃ Right", - "KeyAltLeft": "Alt Left", - "KeyMacAltLeft": "⌥ Left", - "KeyAltRight": "Alt Right", - "KeyMacAltRight": "⌥ Right", - "KeyWinLeft": "⊞ Left", - "KeyMacWinLeft": "⌘ Left", - "KeyWinRight": "⊞ Right", - "KeyMacWinRight": "⌘ Right", - "KeyMenu": "Menu", - "KeyUp": "Up", - "KeyDown": "Down", - "KeyLeft": "Left", - "KeyRight": "Right", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Right", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Left Trigger 0", - "GamepadSingleRightTrigger0": "Right Trigger 0", - "GamepadSingleLeftTrigger1": "Left Trigger 1", - "GamepadSingleRightTrigger1": "Right Trigger 1", - "StickLeft": "Left Stick", - "StickRight": "Right Stick", - "UserProfilesSelectedUserProfile": "เลือกโปรไฟล์ผู้ใช้งาน:", - "UserProfilesSaveProfileName": "บันทึกชื่อโปรไฟล์", - "UserProfilesChangeProfileImage": "เปลี่ยนรูปโปรไฟล์", - "UserProfilesAvailableUserProfiles": "โปรไฟล์ผู้ใช้ที่ใช้งานได้:", - "UserProfilesAddNewProfile": "สร้างโปรไฟล์ใหม่", - "UserProfilesDelete": "ลบ", - "UserProfilesClose": "ปิด", - "ProfileNameSelectionWatermark": "เลือก ชื่อเล่น", - "ProfileImageSelectionTitle": "เลือก รูปโปรไฟล์ ของคุณ", - "ProfileImageSelectionHeader": "เลือก รูปโปรไฟล์", - "ProfileImageSelectionNote": "คุณสามารถนำเข้ารูปโปรไฟล์ที่กำหนดเองได้ หรือ เลือกรูปที่มีจากระบบ", - "ProfileImageSelectionImportImage": "นำเข้า ไฟล์รูปภาพ", - "ProfileImageSelectionSelectAvatar": "เลือก รูปอวาต้า จากระบบ", - "InputDialogTitle": "กล่องโต้ตอบการป้อนข้อมูล", - "InputDialogOk": "ตกลง", - "InputDialogCancel": "ยกเลิก", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "เลือก ชื่อโปรไฟล์", - "InputDialogAddNewProfileHeader": "กรุณาใส่ชื่อโปรไฟล์", - "InputDialogAddNewProfileSubtext": "(ความยาวสูงสุด: {0})", - "AvatarChoose": "เลือก รูปอวาต้า ของคุณ", - "AvatarSetBackgroundColor": "ตั้งค่าสีพื้นหลัง", - "AvatarClose": "ปิด", - "ControllerSettingsLoadProfileToolTip": "โหลด โปรไฟล์", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "เพิ่ม โปรไฟล์", - "ControllerSettingsRemoveProfileToolTip": "ลบ โปรไฟล์", - "ControllerSettingsSaveProfileToolTip": "บันทึก โปรไฟล์", - "MenuBarFileToolsTakeScreenshot": "ถ่ายภาพหน้าจอ", - "MenuBarFileToolsHideUi": "ซ่อน UI", - "GameListContextMenuRunApplication": "เปิดใช้งานแอปพลิเคชัน", - "GameListContextMenuToggleFavorite": "สลับรายการโปรด", - "GameListContextMenuToggleFavoriteToolTip": "สลับสถานะเกมที่ชื่นชอบ", - "SettingsTabGeneralTheme": "ธีม:", - "SettingsTabGeneralThemeAuto": "อัตโนมัติ", - "SettingsTabGeneralThemeDark": "มืด", - "SettingsTabGeneralThemeLight": "สว่าง", - "ControllerSettingsConfigureGeneral": "กำหนดค่า", - "ControllerSettingsRumble": "การสั่นไหว", - "ControllerSettingsRumbleStrongMultiplier": "เพิ่มความแรงการสั่น", - "ControllerSettingsRumbleWeakMultiplier": "ลดความแรงการสั่น", - "DialogMessageSaveNotAvailableMessage": "ไม่มีข้อมูลบันทึกไว้สำหรับ {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "คุณต้องการสร้างบันทึกข้อมูลสำหรับเกมนี้หรือไม่?", - "DialogConfirmationTitle": "Ryujinx - ยืนยัน", - "DialogUpdaterTitle": "Ryujinx - อัพเดต", - "DialogErrorTitle": "Ryujinx - ผิดพลาด", - "DialogWarningTitle": "Ryujinx - คำเตือน", - "DialogExitTitle": "Ryujinx - ออก", - "DialogErrorMessage": "Ryujinx พบข้อผิดพลาด", - "DialogExitMessage": "คุณแน่ใจหรือไม่ว่าต้องการปิด Ryujinx หรือไม่?", - "DialogExitSubMessage": "ข้อมูลทั้งหมดที่ไม่ได้บันทึกทั้งหมดจะสูญหาย!", - "DialogMessageCreateSaveErrorMessage": "มีข้อผิดพลาดในการสร้างข้อมูลบันทึกที่ระบุ: {0}", - "DialogMessageFindSaveErrorMessage": "มีข้อผิดพลาดในการค้นหาข้อมูลบันทึกที่ระบุไว้: {0}", - "FolderDialogExtractTitle": "เลือกโฟลเดอร์ที่จะแตกไฟล์เข้าไป", - "DialogNcaExtractionMessage": "กำลังแตกไฟล์ {0} จากส่วน {1}...", - "DialogNcaExtractionTitle": "เครื่องมือแตกไฟล์ของ NCA", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "เกิดความล้มเหลวในการแตกไฟล์เนื่องจากไม่พบ NCA หลักในไฟล์ที่เลือก", - "DialogNcaExtractionCheckLogErrorMessage": "เกิดความล้มเหลวในการแตกไฟล์ โปรดอ่านไฟล์บันทึกประวัติเพื่อดูข้อมูลเพิ่มเติม", - "DialogNcaExtractionSuccessMessage": "การแตกไฟล์เสร็จสมบูรณ์แล้ว", - "DialogUpdaterConvertFailedMessage": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ปัจจุบันได้", - "DialogUpdaterCancelUpdateMessage": "ยกเลิกการอัพเดต!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "คุณกำลังใช้ Ryujinx เวอร์ชั่นที่อัปเดตล่าสุด!", - "DialogUpdaterFailedToGetVersionMessage": "เกิดข้อผิดพลาดขณะพยายามรับข้อมูลเวอร์ชั่นจาก GitHub Release ปัญหานี้อาจเกิดขึ้นได้หากมีการรวบรวมเวอร์ชั่นใหม่โดย GitHub โปรดลองอีกครั้งในอีกไม่กี่นาทีข้างหน้า", - "DialogUpdaterConvertFailedGithubMessage": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ที่ได้รับจาก Github Release", - "DialogUpdaterDownloadingMessage": "กำลังดาวน์โหลดอัปเดต...", - "DialogUpdaterExtractionMessage": "กำลังแตกไฟล์อัปเดต...", - "DialogUpdaterRenamingMessage": "กำลังลบไฟล์เก่า...", - "DialogUpdaterAddingFilesMessage": "กำลังเพิ่มไฟล์อัปเดตใหม่...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "อัปเดตเสร็จสมบูรณ์แล้ว!", - "DialogUpdaterRestartMessage": "คุณต้องการรีสตาร์ท Ryujinx ตอนนี้หรือไม่?", - "DialogUpdaterNoInternetMessage": "คุณไม่ได้เชื่อมต่อกับอินเทอร์เน็ต!", - "DialogUpdaterNoInternetSubMessage": "โปรดตรวจสอบว่าคุณมีการเชื่อมต่ออินเทอร์เน็ตว่ามีการใช้งานได้หรือไม่!", - "DialogUpdaterDirtyBuildMessage": "คุณไม่สามารถอัปเดต Dirty build ของ Ryujinx ได้!", - "DialogUpdaterDirtyBuildSubMessage": "โปรดดาวน์โหลด Ryujinx ได้ที่ https://ryujinx.app/download หากคุณกำลังมองหาเวอร์ชั่นที่รองรับ", - "DialogRestartRequiredMessage": "จำเป็นต้องรีสตาร์ทเพื่อให้การอัพเดตสามารถให้งานได้", - "DialogThemeRestartMessage": "บันทึกธีมแล้ว จำเป็นต้องรีสตาร์ทเพื่อใช้ธีม", - "DialogThemeRestartSubMessage": "คุณต้องการรีสตาร์ทหรือไม่?", - "DialogFirmwareInstallEmbeddedMessage": "คุณต้องการติดตั้งเฟิร์มแวร์ที่ฝังอยู่ในเกมนี้หรือไม่? (เฟิร์มแวร์ {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "ไม่พบเฟิร์มแวร์ที่ติดตั้งไว้ แต่ Ryujinx จะติดตั้งเฟิร์มแวร์ได้ {0} จากเกมที่ให้มา\nขณะนี้โปรแกรมจำลองจะเริ่มทำงาน", - "DialogFirmwareNoFirmwareInstalledMessage": "ไม่มีการติดตั้งเฟิร์มแวร์", - "DialogFirmwareInstalledMessage": "เฟิร์มแวร์ {0} ติดตั้งแล้ว", - "DialogInstallFileTypesSuccessMessage": "ติดตั้งตามประเภทของไฟล์สำเร็จแล้ว!", - "DialogInstallFileTypesErrorMessage": "ติดตั้งตามประเภทของไฟล์ไม่สำเร็จ", - "DialogUninstallFileTypesSuccessMessage": "ถอนการติดตั้งตามประเภทของไฟล์สำเร็จแล้ว!", - "DialogUninstallFileTypesErrorMessage": "ไม่สามารถถอนการติดตั้งตามประเภทของไฟล์ได้", - "DialogOpenSettingsWindowLabel": "เปิดหน้าต่างการตั้งค่า", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "คอนโทรลเลอร์ Applet", - "DialogMessageDialogErrorExceptionMessage": "เกิดข้อผิดพลาดในการแสดงกล่องโต้ตอบข้อความ: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "เกิดข้อผิดพลาดในการแสดงซอฟต์แวร์แป้นพิมพ์: {0}", - "DialogErrorAppletErrorExceptionMessage": "เกิดข้อผิดพลาดในการแสดงกล่องโต้ตอบ ข้อผิดพลาดของ Applet: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีแก้ไขข้อผิดพลาดนี้ โปรดทำตามคำแนะนำในการตั้งค่าของเรา", - "DialogUserErrorDialogTitle": "ข้อผิดพลาด Ryujinx ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "เกิดข้อผิดพลาดขณะเรียกข้อมูลจาก API", - "DialogAmiiboApiConnectErrorMessage": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ Amiibo API บางบริการอาจหยุดทำงาน หรือไม่คุณต้องทำการตรวจสอบว่าอินเทอร์เน็ตของคุณอยู่ในสถานะเชื่อมต่ออยู่หรือไม่", - "DialogProfileInvalidProfileErrorMessage": "โปรไฟล์ {0} ไม่สามารถทำงานได้กับระบบกำหนดค่าอินพุตปัจจุบัน", - "DialogProfileDefaultProfileOverwriteErrorMessage": "โปรไฟล์เริ่มต้นไม่สามารถเขียนทับได้", - "DialogProfileDeleteProfileTitle": "กำลังลบโปรไฟล์", - "DialogProfileDeleteProfileMessage": "การดำเนินการนี้ไม่สามารถย้อนกลับได้ คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", - "DialogWarning": "คำเตือน", - "DialogPPTCDeletionMessage": "คุณกำลังตั้งค่าให้มีการสร้าง PPTC ใหม่ในการบูตครั้งถัดไป:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", - "DialogPPTCDeletionErrorMessage": "มีข้อผิดพลาดในการล้างแคช PPTC {0}: {1}", - "DialogShaderDeletionMessage": "คุณกำลังจะลบแคชแสงเงา:\n\n{0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อหรือไม่?", - "DialogShaderDeletionErrorMessage": "เกิดข้อผิดพลาดในการล้าง แคชแสงเงา {0}: {1}", - "DialogRyujinxErrorMessage": "Ryujinx พบข้อผิดพลาด", - "DialogInvalidTitleIdErrorMessage": "ข้อผิดพลาดของ UI: เกมที่เลือกไม่มีชื่อ ID ที่ถูกต้อง", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "ไม่พบเฟิร์มแวร์ของระบบที่ถูกต้อง {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "ติดตั้งเฟิร์มแวร์ {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "ระบบเวอร์ชั่น {0} ได้รับการติดตั้งเร็วๆ นี้", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nสิ่งนี้จะแทนที่เวอร์ชั่นของระบบเวอร์ชั่นปัจจุบัน {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nคุณต้องการดำเนินการต่อหรือไม่?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "กำลังติดตั้งเฟิร์มแวร์...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "ระบบเวอร์ชั่น {0} ติดตั้งเรียบร้อยแล้ว", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "จะไม่มีโปรไฟล์อื่นให้เปิดหากโปรไฟล์ที่เลือกถูกลบ", - "DialogUserProfileDeletionConfirmMessage": "คุณต้องการลบโปรไฟล์ที่เลือกหรือไม่?", - "DialogUserProfileUnsavedChangesTitle": "คำเตือน - มีการเปลี่ยนแปลงที่ไม่ได้บันทึก", - "DialogUserProfileUnsavedChangesMessage": "คุณได้ทำการเปลี่ยนแปลงโปรไฟล์ผู้ใช้นี้โดยไม่ได้รับการบันทึก", - "DialogUserProfileUnsavedChangesSubMessage": "คุณต้องการทิ้งการเปลี่ยนแปลงของคุณหรือไม่?", - "DialogControllerSettingsModifiedConfirmMessage": "การตั้งค่าคอนโทรลเลอร์ปัจจุบันได้รับการอัปเดตแล้ว", - "DialogControllerSettingsModifiedConfirmSubMessage": "คุณต้องการบันทึกหรือไม่?", - "DialogLoadFileErrorMessage": "{0} ไฟล์เกิดข้อผิดพลาด: {1}", - "DialogModAlreadyExistsMessage": "มีม็อดนี้อยู่แล้ว", - "DialogModInvalidMessage": "ไดเร็กทอรีที่ระบุไม่มี ม็อดอยู่!", - "DialogModDeleteNoParentMessage": "ไม่สามารถลบ: ไม่พบไดเร็กทอรีหลักสำหรับ ม็อด \"{0}\"!", - "DialogDlcNoDlcErrorMessage": "ไฟล์ที่ระบุไม่มี DLC สำหรับชื่อที่เลือก!", - "DialogPerformanceCheckLoggingEnabledMessage": "คุณได้เปิดใช้งานการบันทึกการติดตาม ซึ่งออกแบบมาเพื่อให้นักพัฒนาใช้เท่านั้น", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "เพื่อประสิทธิภาพสูงสุด ขอแนะนำให้ปิดใช้งานการบันทึกการติดตาม คุณต้องการปิดใช้การบันทึกการติดตามตอนนี้หรือไม่?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "คุณได้เปิดใช้งาน การดัมพ์เชเดอร์ ซึ่งออกแบบมาเพื่อให้นักพัฒนาใช้งานเท่านั้น", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "เพื่อประสิทธิภาพสูงสุด ขอแนะนำให้ปิดใช้การดัมพ์เชเดอร์ คุณต้องการปิดการใช้งานการ ดัมพ์เชเดอร์ ตอนนี้หรือไม่?", - "DialogLoadAppGameAlreadyLoadedMessage": "ทำการโหลดเกมเรียบร้อยแล้ว", - "DialogLoadAppGameAlreadyLoadedSubMessage": "โปรดหยุดการจำลอง หรือปิดโปรแกรมจำลองก่อนที่จะเปิดเกมอื่น", - "DialogUpdateAddUpdateErrorMessage": "ไฟล์ที่ระบุไม่มีการอัพเดตสำหรับชื่อเรื่องที่เลือก!", - "DialogSettingsBackendThreadingWarningTitle": "คำเตือน - การทำเธรดแบ็กเอนด์", - "DialogSettingsBackendThreadingWarningMessage": "Ryujinx ต้องรีสตาร์ทหลังจากเปลี่ยนตัวเลือกนี้จึงจะใช้งานได้อย่างสมบูรณ์ คุณอาจต้องปิดการใช้งาน มัลติเธรด ของไดรเวอร์ของคุณด้วยตนเองเมื่อใช้ Ryujinx ทั้งนี้ขึ้นอยู่กับแพลตฟอร์มของคุณ", - "DialogModManagerDeletionWarningMessage": "คุณกำลังจะลบ ม็อด: {0}\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", - "DialogModManagerDeletionAllWarningMessage": "คุณกำลังจะลบม็อดทั้งหมดสำหรับชื่อนี้\n\nคุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?", - "SettingsTabGraphicsFeaturesOptions": "คุณสมบัติ", - "SettingsTabGraphicsBackendMultithreading": "มัลติเธรด กราฟิกเบื้องหลัง:", - "CommonAuto": "อัตโนมัติ", - "CommonOff": "ปิดการใช้งาน", - "CommonOn": "เปิดใช้งาน", - "InputDialogYes": "ใช่", - "InputDialogNo": "ไม่ใช่", - "DialogProfileInvalidProfileNameErrorMessage": "ชื่อไฟล์ประกอบด้วยอักขระที่ไม่ถูกต้อง กรุณาลองอีกครั้ง", - "MenuBarOptionsPauseEmulation": "หยุดชั่วคราว", - "MenuBarOptionsResumeEmulation": "ดำเนินการต่อ", - "AboutUrlTooltipMessage": "คลิกเพื่อเปิดเว็บไซต์ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", - "AboutDisclaimerMessage": "ทางผู้พัฒนาโปรแกรม Ryujinx ไม่มีส่วนเกี่ยวข้องกับทางบริษัท Nintendo™\nหรือพันธมิตรใดๆ ทั้งสิ้น!", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) ถูกใช้\nในการจำลอง อะมิโบ ของเรา", - "AboutPatreonUrlTooltipMessage": "คลิกเพื่อเปิดหน้า Patreon ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", - "AboutGithubUrlTooltipMessage": "คลิกเพื่อเปิดหน้า Github ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", - "AboutDiscordUrlTooltipMessage": "คลิกเพื่อเปิดคำเชิญเข้าสู่เซิร์ฟเวอร์ Discord ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", - "AboutTwitterUrlTooltipMessage": "คลิกเพื่อเปิดหน้าเพจ Twitter ของ Ryujinx บนเบราว์เซอร์เริ่มต้นของคุณ", - "AboutRyujinxAboutTitle": "เกี่ยวกับ:", - "AboutRyujinxAboutContent": "Ryujinx เป็นอีมูเลเตอร์สำหรับ Nintendo Switch™\nโปรดสนับสนุนเราบน Patreon\nรับข่าวสารล่าสุดทั้งหมดบน Twitter หรือ Discord ของเรา\nนักพัฒนาที่สนใจจะมีส่วนร่วมสามารถดูข้อมูลเพิ่มเติมได้ที่ GitHub หรือ Discord ของเรา", - "AboutRyujinxMaintainersTitle": "ได้รับการดูแลโดย:", - "AboutRyujinxMaintainersContentTooltipMessage": "คลิกเพื่อเปิดหน้าผู้มีส่วนร่วมบนเบราว์เซอร์เริ่มต้นของคุณ", - "AboutRyujinxSupprtersTitle": "ผู้สนับสนุนบน Patreon:", - "AmiiboSeriesLabel": "Amiibo Series", - "AmiiboCharacterLabel": "ตัวละคร", - "AmiiboScanButtonLabel": "สแกนเลย", - "AmiiboOptionsShowAllLabel": "แสดง Amiibo ทั้งหมด", - "AmiiboOptionsUsRandomTagLabel": "แฮ็ค: สุ่มแท็ก Uuid", - "DlcManagerTableHeadingEnabledLabel": "เปิดใช้งานแล้ว", - "DlcManagerTableHeadingTitleIdLabel": "ชื่อไอดี", - "DlcManagerTableHeadingContainerPathLabel": "คอนเทนเนอร์เก็บไฟล์", - "DlcManagerTableHeadingFullPathLabel": "ที่เก็บไฟล์แบบเต็ม", - "DlcManagerRemoveAllButton": "ลบทั้งหมด", - "DlcManagerEnableAllButton": "เปิดใช้งานทั้งหมด", - "DlcManagerDisableAllButton": "ปิดใช้งานทั้งหมด", - "ModManagerDeleteAllButton": "ลบทั้งหมด", - "MenuBarOptionsChangeLanguage": "เปลี่ยนภาษา", - "MenuBarShowFileTypes": "แสดงประเภทของไฟล์", - "CommonSort": "เรียงลำดับ", - "CommonShowNames": "แสดงชื่อ", - "CommonFavorite": "สิ่งที่ชื่นชอบ", - "OrderAscending": "จากน้อยไปมาก", - "OrderDescending": "จากมากไปน้อย", - "SettingsTabGraphicsFeatures": "คุณสมบัติ และ การเพิ่มประสิทธิภาพ", - "ErrorWindowTitle": "หน้าต่างแสดงข้อผิดพลาด", - "ToggleDiscordTooltip": "เลือกว่าจะแสดง Ryujinx ในกิจกรรม Discord \"ที่กำลังเล่นอยู่\" ของคุณหรือไม่?", - "AddGameDirBoxTooltip": "ป้อนไดเรกทอรี่เกมที่จะทำการเพิ่มลงในรายการ", - "AddGameDirTooltip": "เพิ่มไดเรกทอรี่เกมลงในรายการ", - "RemoveGameDirTooltip": "ลบไดเรกทอรี่เกมที่เลือก", - "AddAutoloadDirBoxTooltip": "ป้อนไดเร็กทอรีสำหรับโหลดอัตโนมัติเพื่อเพิ่มลงในรายการ", - "AddAutoloadDirTooltip": "ป้อนไดเร็กทอรีสำหรับโหลดอัตโนมัติเพื่อเพิ่มลงในรายการ", - "RemoveAutoloadDirTooltip": "ลบไดเรกทอรีสำหรับโหลดอัตโนมัติที่เลือก", - "CustomThemeCheckTooltip": "ใช้ธีม Avalonia แบบกำหนดเองสำหรับ GUI เพื่อเปลี่ยนรูปลักษณ์ของเมนูโปรแกรมจำลอง", - "CustomThemePathTooltip": "ไปยังที่เก็บไฟล์ธีม GUI แบบกำหนดเอง", - "CustomThemeBrowseTooltip": "เรียกดูธีม GUI ที่กำหนดเอง", - "DockModeToggleTooltip": "ด็อกโหมด ทำให้ระบบจำลองการทำงานเสมือน Nintendo ที่กำลังเชื่อมต่ออยู่ด็อก สิ่งนี้จะปรับปรุงความเสถียรภาพของกราฟิกในเกมส่วนใหญ่ ในทางกลับกัน การปิดใช้จะทำให้ระบบจำลองทำงานเหมือนกับ Nintendo Switch แบบพกพา ส่งผลให้คุณภาพกราฟิกลดลง\n\nแนะนำกำหนดค่าควบคุมของผู้เล่น 1 หากวางแผนที่จะใช้ด็อกโหมด กำหนดค่าการควบคุมแบบ แฮนด์เฮลด์ หากวางแผนที่จะใช้โหมดแฮนด์เฮลด์\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", - "DirectKeyboardTooltip": "รองรับการเข้าถึงแป้นพิมพ์โดยตรง (HID) ให้เกมเข้าถึงคีย์บอร์ดของคุณเป็นอุปกรณ์ป้อนข้อความ\n\nใช้งานได้กับเกมที่รองรับการใช้งานคีย์บอร์ดบนฮาร์ดแวร์ของ Switch เท่านั้น\n\nหากคุณไม่แน่ใจให้ปิดใช้งานไว้", - "DirectMouseTooltip": "รองรับการเข้าถึงเมาส์โดยตรง (HID) ให้เกมเข้าถึงเมาส์ของคุณเป็นอุปกรณ์ชี้ตำแหน่ง\n\nใช้งานได้เฉพาะกับเกมที่รองรับการควบคุมเมาส์บนฮาร์ดแวร์ของ Switch เท่านั้น ซึ่งมีอยู่ไม่มากนัก\n\nเมื่อเปิดใช้งาน ฟังก์ชั่นหน้าจอสัมผัสอาจไม่ทำงาน\n\nหากคุณไม่แน่ใจให้ปิดใช้งานไว้", - "RegionTooltip": "เปลี่ยนภูมิภาคของระบบ", - "LanguageTooltip": "เปลี่ยนภาษาของระบบ", - "TimezoneTooltip": "เปลี่ยนโซนเวลาของระบบ", - "TimeTooltip": "เปลี่ยนเวลาของระบบ", - "VSyncToggleTooltip": "Vertical Sync ของคอนโซลจำลอง โดยพื้นฐานแล้วเป็นตัวจำกัดเฟรมสำหรับเกมส่วนใหญ่ การปิดใช้งานอาจทำให้เกมทำงานด้วยความเร็วสูงขึ้น หรือทำให้หน้าจอการโหลดใช้เวลานานขึ้นหรือค้าง\n\nสามารถสลับได้ในเกมด้วยปุ่มลัดตามที่คุณต้องการ (F1 เป็นค่าเริ่มต้น) เราขอแนะนำให้ทำเช่นนี้หากคุณวางแผนที่จะปิดการใช้งาน\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", - "PptcToggleTooltip": "บันทึกฟังก์ชั่น JIT ที่แปลแล้ว ดังนั้นจึงไม่จำเป็นต้องแปลทุกครั้งที่โหลดเกม\n\nลดอาการกระตุกและเร่งความเร็วการบูตได้อย่างมากหลังจากการบูตครั้งแรกของเกม\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", - "LowPowerPptcToggleTooltip": "โหลด PPTC โดยใช้หนึ่งในสามของจำนวนคอร์", - "FsIntegrityToggleTooltip": "ตรวจสอบไฟล์ที่เสียหายเมื่อบูตเกม และหากตรวจพบไฟล์ที่เสียหาย จะแสดงข้อผิดพลาดของแฮชในบันทึก\n\nไม่มีผลกระทบต่อประสิทธิภาพการทำงานและมีไว้เพื่อช่วยในการแก้ไขปัญหา\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", - "AudioBackendTooltip": "เปลี่ยนแบ็กเอนด์ที่ใช้ในการเรนเดอร์เสียง\n\nแนะนำเป็น SDL2 ในขณะที่ OpenAL และ SoundIO ถูกใช้เป็นทางเลือกสำรอง ดัมมี่จะไม่มีเสียง\n\nตั้งค่าเป็น SDL2 หากคุณไม่แน่ใจ", - "MemoryManagerTooltip": "เปลี่ยนวิธีการเข้าถึงหน่วยความจำของผู้เยี่ยมชม ส่งผลอย่างมากต่อประสิทธิภาพการทำงานของ CPU ที่จำลอง\n\nตั้งค่าเป็น ไม่ได้ตรวจสอบโฮสต์ หากคุณไม่แน่ใจ", - "MemoryManagerSoftwareTooltip": "ใช้ตารางหน้าซอฟต์แวร์สำหรับการแปลที่อยู่ ความแม่นยำสูงสุดแต่ประสิทธิภาพช้าที่สุด", - "MemoryManagerHostTooltip": "แมปหน่วยความจำในพื้นที่ที่อยู่โฮสต์โดยตรง การคอมไพล์และดำเนินการของ JIT เร็วขึ้นมาก", - "MemoryManagerUnsafeTooltip": "แมปหน่วยความจำโดยตรง แต่อย่าตั้งค่าที่อยู่ของผู้เยี่ยมชมก่อนที่จะเข้าถึง เร็วกว่า แต่ต้องแลกกับความปลอดภัย แอปพลิเคชั่นของผู้เยี่ยมชมสามารถเข้าถึงหน่วยความจำได้จากทุกที่ใน Ryujinx แนะนำให้รันเฉพาะโปรแกรมที่คุณเชื่อถือในโหมดนี้", - "UseHypervisorTooltip": "ใช้ Hypervisor แทน JIT ปรับปรุงประสิทธิภาพอย่างมากเมื่อพร้อมใช้งาน แต่อาจไม่เสถียรในสถานะปัจจุบัน", - "DRamTooltip": "ใช้รูปแบบ MemoryMode ทางเลือกเพื่อเลียนแบบโมเดลการพัฒนาสวิตช์\n\nสิ่งนี้มีประโยชน์สำหรับแพ็กพื้นผิวที่มีความละเอียดสูงกว่าหรือม็อดที่มีความละเอียด 4k เท่านั้น\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ", - "IgnoreMissingServicesTooltip": "ละเว้นบริการ Horizon OS ที่ยังไม่ได้ใช้งาน วิธีนี้อาจช่วยในการหลีกเลี่ยงข้อผิดพลาดเมื่อบูตเกมบางเกม\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ", - "IgnoreAppletTooltip": "กล่องโต้ตอบภายนอก \"แอปเพล็ตตัวควบคุม\" จะไม่ปรากฏขึ้นหากแป้นเกมถูกตัดการเชื่อมต่อระหว่างการเล่นเกม จะไม่มีข้อความแจ้งให้ปิดกล่องโต้ตอบหรือตั้งค่าตัวควบคุมใหม่ เมื่อเชื่อมต่อคอนโทรลเลอร์ที่ตัดการเชื่อมต่อก่อนหน้านี้อีกครั้ง เกมจะดำเนินการต่อโดยอัตโนมัติ", - "GraphicsBackendThreadingTooltip": "ดำเนินการคำสั่งแบ็กเอนด์กราฟิกบนเธรดที่สอง\n\nเร่งความเร็วการคอมไพล์ ลดการกระตุก และปรับปรุงประสิทธิภาพการทำงานของไดรเวอร์ GPU โดยไม่ต้องรองรับมัลติเธรดในตัว ประสิทธิภาพที่ดีขึ้นเล็กน้อยสำหรับไดรเวอร์ที่มีมัลติเธรด\n\nตั้งเป็น อัตโนมัติ หากคุณไม่แน่ใจ", - "GalThreadingTooltip": "ดำเนินการคำสั่งแบ็กเอนด์กราฟิกบนเธรดที่สอง\n\nเร่งความเร็วการคอมไพล์เชเดอร์ ลดการกระตุก และปรับปรุงประสิทธิภาพการทำงานของไดรเวอร์ GPU โดยไม่ต้องรองรับมัลติเธรดในตัว ประสิทธิภาพที่ดีขึ้นเล็กน้อยสำหรับไดรเวอร์ที่มีมัลติเธรด\n\nตั้งเป็น อัตโนมัติ หากคุณไม่แน่ใจ", - "ShaderCacheToggleTooltip": "บันทึกแคชแสงเงาของดิสก์ซึ่งช่วยลดการกระตุกในการรันครั้งต่อๆ ไป\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", - "ResolutionScaleTooltip": "คูณความละเอียดการเรนเดอร์ของเกม\n\nเกมบางเกมอาจไม่สามารถใช้งานได้และดูเป็นพิกเซลแม้ว่าความละเอียดจะเพิ่มขึ้นก็ตาม สำหรับเกมเหล่านั้น คุณอาจต้องค้นหาม็อดที่ลบรอยหยักของภาพหรือเพิ่มความละเอียดในการเรนเดอร์ภายใน หากต้องการใช้อย่างหลัง คุณอาจต้องเลือก Native\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำมาใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nโปรดทราบว่า 4x นั้นเกินความจำเป็นสำหรับการตั้งค่าแทบทุกประเภท", - "ResolutionScaleEntryTooltip": "สเกลความละเอียดจุดทศนิยม เช่น 1.5 ไม่ใช่จำนวนเต็มของสเกล มีแนวโน้มที่จะก่อให้เกิดปัญหาหรือความผิดพลาดได้", - "AnisotropyTooltip": "ระดับของ Anisotropic ตั้งค่าเป็นอัตโนมัติเพื่อใช้ค่าพื้นฐานของเกม", - "AspectRatioTooltip": "อัตราส่วนภาพที่ใช้กับหน้าต่างตัวแสดงภาพ\n\nเปลี่ยนสิ่งนี้หากคุณใช้ตัวดัดแปลงอัตราส่วนกว้างยาวสำหรับเกมของคุณ ไม่เช่นนั้นกราฟิกจะถูกยืดออก\n\nทิ้งไว้ที่ 16:9 หากไม่แน่ใจ", - "ShaderDumpPathTooltip": "ที่เก็บ ดัมพ์ไฟล์เชเดอร์", - "FileLogTooltip": "บันทึกประวัติคอนโซลลงในไฟล์บันทึก จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", - "StubLogTooltip": "พิมพ์ข้อความประวัติในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", - "InfoLogTooltip": "พิมพ์ข้อความบันทึกข้อมูลในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", - "WarnLogTooltip": "พิมพ์ข้อความประวัติการเตือนในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", - "ErrorLogTooltip": "พิมพ์ข้อความบันทึกข้อผิดพลาดในคอนโซล จะไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", - "TraceLogTooltip": "พิมพ์ข้อความประวัติการติดตามในคอนโซล ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", - "GuestLogTooltip": "พิมพ์ข้อความประวัติของผู้เยี่ยมชมในคอนโซล ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน", - "FileAccessLogTooltip": "พิมพ์ข้อความบันทึกการเข้าถึงไฟล์ในคอนโซล", - "FSAccessLogModeTooltip": "เปิดใช้งาน เอาต์พุตประวัติการเข้าถึง FS ไปยังคอนโซล โหมดที่เป็นไปได้คือ 0-3", - "DeveloperOptionTooltip": "โปรดใช้ด้วยความระมัดระวัง", - "OpenGlLogLevel": "จำเป็นต้องเปิดใช้งานระดับบันทึกที่เหมาะสม", - "DebugLogTooltip": "พิมพ์ข้อความประวัติการแก้ไขข้อบกพร่องในคอนโซล\n\nใช้สิ่งนี้เฉพาะเมื่อได้รับคำแนะนำจากผู้ดูแลเท่านั้น เนื่องจากจะทำให้บันทึกอ่านยากและทำให้ประสิทธิภาพของโปรแกรมจำลองแย่ลง", - "LoadApplicationFileTooltip": "เปิดตัวสำรวจไฟล์เพื่อเลือกไฟล์ที่เข้ากันได้กับ Switch ที่จะโหลด", - "LoadApplicationFolderTooltip": "เปิดตัวสำรวจไฟล์เพื่อเลือกไฟล์ที่เข้ากันได้กับ Switch ที่จะโหลด", - "LoadDlcFromFolderTooltip": "เปิดตัวสำรวจไฟล์เพื่อเลือกหนึ่งโฟลเดอร์ขึ้นไปเพื่อโหลด DLC จำนวนมาก", - "LoadTitleUpdatesFromFolderTooltip": "เปิดตัวสำรวจไฟล์เพื่อเลือกหนึ่งโฟลเดอร์ขึ้นไปเพื่อโหลดไฟล์อัปเดตจำนวนมาก", - "OpenRyujinxFolderTooltip": "เปิดโฟลเดอร์ระบบไฟล์ Ryujinx", - "OpenRyujinxLogsTooltip": "เปิดโฟลเดอร์ ที่เก็บไฟล์ประวัติ", - "ExitTooltip": "ออกจากโปรแกรม Ryujinx", - "OpenSettingsTooltip": "เปิดหน้าต่างการตั้งค่า", - "OpenProfileManagerTooltip": "เปิดหน้าต่างตัวจัดการโปรไฟล์ผู้ใช้", - "StopEmulationTooltip": "หยุดการจำลองของเกมที่เปิดอยู่ในปัจจุบันและกลับไปยังการเลือกเกม", - "CheckUpdatesTooltip": "ตรวจสอบอัปเดตของ Ryujinx", - "OpenAboutTooltip": "เปิดหน้าต่าง เกี่ยวกับ", - "GridSize": "ขนาดตาราง", - "GridSizeTooltip": "เปลี่ยนขนาด ของตาราง", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "บราซิล โปรตุเกส", - "AboutRyujinxContributorsButtonHeader": "ดูผู้มีส่วนร่วมทั้งหมด", - "SettingsTabSystemAudioVolume": "ระดับเสียง: ", - "AudioVolumeTooltip": "ปรับระดับเสียง", - "SettingsTabSystemEnableInternetAccess": "การเข้าถึงอินเทอร์เน็ตของผู้เยี่ยมชม/โหมด LAN", - "EnableInternetAccessTooltip": "อนุญาตให้แอปพลิเคชันจำลองเชื่อมต่ออินเทอร์เน็ต\n\nเกมที่มีโหมด LAN สามารถเชื่อมต่อระหว่างกันได้เมื่อเปิดใช้งานและระบบเชื่อมต่อกับจุดเชื่อมต่อเดียวกัน รวมถึงคอนโซลจริงด้วย\n\nไม่อนุญาตให้มีการเชื่อมต่อกับเซิร์ฟเวอร์ Nintendo อาจทำให้เกิดการหยุดทำงานในบางเกมที่พยายามเชื่อมต่ออินเทอร์เน็ต\n\nปล่อยให้ปิดหากคุณไม่แน่ใจ", - "GameListContextMenuManageCheatToolTip": "ฟังก์ชั่นจัดการสูตรโกง", - "GameListContextMenuManageCheat": "ฟังก์ชั่นจัดการสูตรโกง", - "GameListContextMenuManageModToolTip": "ฟังก์ชั่นจัดการม็อด", - "GameListContextMenuManageMod": "ฟังก์ชั่นจัดการม็อด", - "ControllerSettingsStickRange": "ขอบเขต:", - "DialogStopEmulationTitle": "Ryujinx - หยุดการจำลอง", - "DialogStopEmulationMessage": "คุณแน่ใจหรือไม่ว่าต้องการหยุดการจำลองหรือไม่?", - "SettingsTabCpu": "ซีพียู", - "SettingsTabAudio": "เสียง", - "SettingsTabNetwork": "เครือข่าย", - "SettingsTabNetworkConnection": "การเชื่อมต่อเครือข่าย", - "SettingsTabCpuCache": "แคชซีพียู", - "SettingsTabCpuMemory": "โหมดซีพียู", - "DialogUpdaterFlatpakNotSupportedMessage": "โปรดอัปเดต Ryujinx ผ่านช่องทาง FlatHub", - "UpdaterDisabledWarningTitle": "ปิดใช้งานการอัปเดตแล้ว!", - "ControllerSettingsRotate90": "หมุน 90 องศา ตามเข็มนาฬิกา", - "IconSize": "ขนาดไอคอน", - "IconSizeTooltip": "เปลี่ยนขนาดของไอคอนเกม", - "MenuBarOptionsShowConsole": "แสดง คอนโซล", - "ShaderCachePurgeError": "เกิดข้อผิดพลาดในการล้างแคชแสงเงา {0}: {1}", - "UserErrorNoKeys": "ไม่พบ คีย์", - "UserErrorNoFirmware": "ไม่พบ เฟิร์มแวร์", - "UserErrorFirmwareParsingFailed": "เกิดข้อผิดพลาดในการวิเคราะห์เฟิร์มแวร์", - "UserErrorApplicationNotFound": "ไม่พบ แอปพลิเคชัน", - "UserErrorUnknown": "ข้อผิดพลาดที่ไม่รู้จัก", - "UserErrorUndefined": "ข้อผิดพลาดที่ไม่ได้ระบุ", - "UserErrorNoKeysDescription": "Ryujinx ไม่พบไฟล์ 'prod.keys' ในเครื่องของคุณ", - "UserErrorNoFirmwareDescription": "Ryujinx ไม่พบ เฟิร์มแวร์ที่ติดตั้งไว้ในเครื่องของคุณ", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx ไม่สามารถวิเคราะห์เฟิร์มแวร์ที่ให้มาได้ ซึ่งมักมีสาเหตุมาจากคีย์ที่เก่าจนเกินไป", - "UserErrorApplicationNotFoundDescription": "Ryujinx ไม่พบแอปพลิเคชันที่ถูกต้องในที่เก็บไฟล์ที่กำหนด", - "UserErrorUnknownDescription": "เกิดข้อผิดพลาดที่ไม่รู้จัก!", - "UserErrorUndefinedDescription": "เกิดข้อผิดพลาดที่ไม่สามารถระบุได้! สิ่งนี้ไม่ควรเกิดขึ้น โปรดติดต่อผู้พัฒนา!", - "OpenSetupGuideMessage": "เปิดคู่มือการตั้งค่า", - "NoUpdate": "ไม่มีการอัปเดต", - "TitleUpdateVersionLabel": "เวอร์ชั่น {0}", - "TitleBundledUpdateVersionLabel": "Bundled: เวอร์ชั่น {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx – ข้อมูล", - "RyujinxConfirm": "Ryujinx - ยืนยัน", - "FileDialogAllTypes": "ทุกประเภท", - "Never": "ไม่ต้อง", - "SwkbdMinCharacters": "ต้องมีความยาวของตัวอักษรอย่างน้อย {0} ตัว", - "SwkbdMinRangeCharacters": "ต้องมีความยาวของตัวอักษร {0}-{1} ตัว", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "ซอฟต์แวร์คีย์บอร์ด", - "SoftwareKeyboardModeNumeric": "ต้องเป็น 0-9 หรือ '.' เท่านั้น", - "SoftwareKeyboardModeAlphabet": "ต้องเป็นตัวอักษรที่ไม่ใช่ประเภท CJK เท่านั้น", - "SoftwareKeyboardModeASCII": "ต้องเป็นตัวอักษร ASCII เท่านั้น", - "ControllerAppletControllers": "คอนโทรลเลอร์ที่รองรับ:", - "ControllerAppletPlayers": "ผู้เล่น:", - "ControllerAppletDescription": "การกำหนดค่าปัจจุบันของคุณไม่ถูกต้อง กรุณาเปิดการตั้งค่าและกำหนดค่าอินพุตของคุณใหม่", - "ControllerAppletDocked": "ตั้งค่าด็อกโหมด ควรปิดใช้งานการควบคุมแบบแฮนด์เฮลด์", - "UpdaterRenaming": "กำลังเปลี่ยนชื่อไฟล์เก่า...", - "UpdaterRenameFailed": "โปรแกรมอัปเดตไม่สามารถเปลี่ยนชื่อไฟล์ได้: {0}", - "UpdaterAddingFiles": "กำลังเพิ่มไฟล์ใหม่...", - "UpdaterExtracting": "กำลังแยกการอัปเดต...", - "UpdaterDownloading": "กำลังดาวน์โหลดอัปเดต...", - "Docked": "ด็อก", - "Handheld": "แฮนด์เฮลด์", - "ConnectionError": "การเชื่อมต่อล้มเหลว", - "AboutPageDeveloperListMore": "{0} และอื่นๆ ...", - "ApiError": "ข้อผิดพลาดของ API", - "LoadingHeading": "กำลังโหลด {0}", - "CompilingPPTC": "กำลังคอมไพล์ PTC", - "CompilingShaders": "กำลังคอมไพล์ พื้นผิวและแสงเงา", - "AllKeyboards": "คีย์บอร์ดทั้งหมด", - "OpenFileDialogTitle": "เลือกไฟล์ที่สนับสนุนเพื่อเปิด", - "OpenFolderDialogTitle": "เลือกโฟลเดอร์ที่มีเกมที่แตกไฟล์แล้ว", - "AllSupportedFormats": "รูปแบบที่รองรับทั้งหมด", - "RyujinxUpdater": "ตัวอัปเดต Ryujinx", - "SettingsTabHotkeys": "ปุ่มลัดของคีย์บอร์ด", - "SettingsTabHotkeysHotkeys": "ปุ่มลัดของคีย์บอร์ด", - "SettingsTabHotkeysToggleVsyncHotkey": "สลับเป็น VSync:", - "SettingsTabHotkeysScreenshotHotkey": "ภาพหน้าจอ:", - "SettingsTabHotkeysShowUiHotkey": "แสดง UI:", - "SettingsTabHotkeysPauseHotkey": "หยุดชั่วคราว:", - "SettingsTabHotkeysToggleMuteHotkey": "ปิดเสียง:", - "ControllerMotionTitle": "ตั้งค่าควบคุมการเคลื่อนไหว", - "ControllerRumbleTitle": "ตั้งค่าการสั่นไหว", - "SettingsSelectThemeFileDialogTitle": "เลือกธีมไฟล์", - "SettingsXamlThemeFile": "ไฟล์ธีมรูปแบบ XAML", - "AvatarWindowTitle": "จัดการบัญชี - อวาต้า", - "Amiibo": "Amiibo", - "Unknown": "ไม่รู้จัก", - "Usage": "การใช้งาน", - "Writable": "สามารถเขียนทับได้", - "SelectDlcDialogTitle": "เลือกไฟล์ DLC", - "SelectUpdateDialogTitle": "เลือกไฟล์อัพเดต", - "SelectModDialogTitle": "เลือกไดเรกทอรี Mods", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "จัดการโปรไฟล์ผู้ใช้", - "CheatWindowTitle": "จัดการสูตรโกง", - "DlcWindowTitle": "จัดการ DLC ที่ดาวน์โหลดได้สำหรับ {0} ({1})", - "ModWindowTitle": "จัดการม็อดที่ดาวน์โหลดได้สำหรับ {0} ({1})", - "UpdateWindowTitle": "จัดการอัปเดตหัวข้อ", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} อัพเดตที่เพิ่มมาใหม่", - "UpdateWindowBundledContentNotice": "แพ็คที่อัพเดตมาไม่สามารถลบทิ้งได้ สามารถปิดใช้งานได้เท่านั้น", - "CheatWindowHeading": "สูตรโกงมีให้สำหรับ {0} [{1}]", - "BuildId": "รหัสการสร้าง:", - "DlcWindowBundledContentNotice": "แพ็ค DLC ไม่สามารถลบทิ้งได้ สามารถปิดใช้งานได้เท่านั้น", - "DlcWindowHeading": "{0} DLC ที่สามารถดาวน์โหลดได้", - "DlcWindowDlcAddedMessage": "{0} DLC ใหม่ที่เพิ่มเข้ามา", - "AutoloadDlcAddedMessage": "{0} ใหม่ที่เพิ่มเข้ามา", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} อัพเดตใหม่ที่เพิ่มเข้ามา", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "{0} ม็อด", - "UserProfilesEditProfile": "แก้ไขที่เลือกแล้ว", - "Continue": "Continue", - "Cancel": "ยกเลิก", - "Save": "บันทึก", - "Discard": "ละทิ้ง", - "Paused": "หยุดชั่วคราว", - "UserProfilesSetProfileImage": "ตั้งค่ารูปโปรไฟล์", - "UserProfileEmptyNameError": "จำเป็นต้องระบุชื่อ", - "UserProfileNoImageError": "จำเป็นต้องตั้งค่ารูปโปรไฟล์", - "GameUpdateWindowHeading": "จัดการอัพเดตสำหรับ {0} ({1})", - "SettingsTabHotkeysResScaleUpHotkey": "เพิ่มความละเอียด:", - "SettingsTabHotkeysResScaleDownHotkey": "ลดความละเอียด:", - "UserProfilesName": "ชื่อ:", - "UserProfilesUserId": "รหัสผู้ใช้:", - "SettingsTabGraphicsBackend": "กราฟิกเบื้องหลัง", - "SettingsTabGraphicsBackendTooltip": "เลือกกราฟิกเบื้องหลังที่จะใช้ในโปรแกรมจำลอง\n\nโดยรวมแล้ว Vulkan นั้นดีกว่าสำหรับการ์ดจอรุ่นใหม่ทั้งหมด ตราบใดที่ไดรเวอร์ยังอัพเดทอยู่เสมอ Vulkan ยังมีคุณสมบัติการคอมไพล์เชเดอร์ที่เร็วขึ้น(และลดอาการกระตุก) สำหรับ GPU อื่นๆทุกอัน\n\nOpenGL อาจได้รับผลลัพธ์ที่ดีกว่าบน Nvidia GPU รุ่นเก่า, AMD GPU รุ่นเก่าบน Linux หรือบน GPU ที่มี VRAM น้อย แม้ว่าการคอมไพล์เชเดอร์ จะทำให้อาการกระตุกมากขึ้นก็ตาม\n\nตั้งค่าเป็น Vulkan หากไม่แน่ใจ ตั้งค่าเป็น OpenGL หาก GPU ของคุณไม่รองรับ Vulkan แม้จะมีไดรเวอร์กราฟิกล่าสุดก็ตาม", - "SettingsEnableTextureRecompression": "เปิดใช้งาน การบีบอัดพื้นผิวอีกครั้ง", - "SettingsEnableTextureRecompressionTooltip": "บีบอัดพื้นผิว ASTC เพื่อลดการใช้งาน VRAM\n\nเกมที่ใช้รูปแบบพื้นผิวนี้ ได้แก่ Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder และ The Legend of Zelda: Tears of the Kingdom\n\nการ์ดจอที่มี 4GiB VRAM หรือน้อยกว่ามีแนวโน้มที่จะพังในบางจุดขณะเล่นเกมเหล่านี้\n\nเปิดใช้งานเฉพาะในกรณีที่ VRAM ของคุณใกล้หมดในเกมที่กล่าวมาข้างต้น ปล่อยให้ปิดหากไม่แน่ใจ", - "SettingsTabGraphicsPreferredGpu": "GPU ที่ต้องการ", - "SettingsTabGraphicsPreferredGpuTooltip": "เลือกการ์ดจอที่จะใช้กับแบ็กเอนด์กราฟิก Vulkan\n\nไม่ส่งผลต่อ GPU ที่ OpenGL จะใช้\n\nตั้งค่าเป็น GPU ที่ถูกตั้งค่าสถานะเป็น \"dGPU\" ถ้าหากคุณไม่แน่ใจ ,หากไม่มีก็ปล่อยทิ้งไว้โดยไม่ต้องแตะต้องมัน", - "SettingsAppRequiredRestartMessage": "จำเป็นต้องรีสตาร์ท Ryujinx", - "SettingsGpuBackendRestartMessage": "การตั้งค่ากราฟิกเบื้องหลังหรือ GPU ได้รับการแก้ไขแล้ว สิ่งนี้จะต้องมีการรีสตาร์ทจึงจะสามารถใช้งานได้", - "SettingsGpuBackendRestartSubMessage": "คุณต้องการรีสตาร์ทตอนนี้หรือไม่?", - "RyujinxUpdaterMessage": "คุณต้องการอัพเดต Ryujinx เป็นเวอร์ชั่นล่าสุดหรือไม่?", - "SettingsTabHotkeysVolumeUpHotkey": "เพิ่มระดับเสียง:", - "SettingsTabHotkeysVolumeDownHotkey": "ลดระดับเสียง:", - "SettingsEnableMacroHLE": "เปิดใช้งาน มาโคร HLE", - "SettingsEnableMacroHLETooltip": "การจำลองระดับสูงของโค้ดมาโคร GPU\n\nปรับปรุงประสิทธิภาพ แต่อาจทำให้เกิดข้อผิดพลาดด้านกราฟิกในบางเกม\n\nเปิดทิ้งไว้หากคุณไม่แน่ใจ", - "SettingsEnableColorSpacePassthrough": "ทะลุผ่านพื้นที่สี", - "SettingsEnableColorSpacePassthroughTooltip": "สั่งให้แบ็กเอนด์ Vulkan ส่งผ่านข้อมูลสีโดยไม่ต้องระบุค่าของสี สำหรับผู้ใช้ที่มีการแสดงกระจายตัวของสี อาจส่งผลให้สีสดใสมากขึ้น โดยต้องแลกกับความถูกต้องของสี", - "VolumeShort": "ระดับเสียง", - "UserProfilesManageSaves": "จัดการบันทึก", - "DeleteUserSave": "คุณต้องการลบบันทึกผู้ใช้สำหรับเกมนี้หรือไม่?", - "IrreversibleActionNote": "การดำเนินการนี้ไม่สามารถย้อนกลับได้", - "SaveManagerHeading": "จัดการบันทึกสำหรับ {0} ({1})", - "SaveManagerTitle": "จัดการบันทึก", - "Name": "ชื่อ", - "Size": "ขนาด", - "Search": "ค้นหา", - "UserProfilesRecoverLostAccounts": "กู้คืนบัญชีที่สูญหาย", - "Recover": "กู้คืน", - "UserProfilesRecoverHeading": "พบบันทึกสำหรับบัญชีดังต่อไปนี้", - "UserProfilesRecoverEmptyList": "ไม่มีโปรไฟล์ที่สามารถกู้คืนได้", - "GraphicsAATooltip": "ใช้การลดรอยหยักกับการเรนเดอร์เกม\n\nFXAA จะเบลอภาพส่วนใหญ่ ในขณะที่ SMAA จะพยายามค้นหารอยหยักและปรับให้เรียบ\n\nไม่แนะนำให้ใช้ร่วมกับตัวกรองสเกล FSR\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nปล่อยไว้ที่ NONE หากไม่แน่ใจ", - "GraphicsAALabel": "ลดการฉีกขาดของภาพ:", - "GraphicsScalingFilterLabel": "ปรับขนาดตัวกรอง:", - "GraphicsScalingFilterTooltip": "เลือกตัวกรองสเกลที่จะใช้เมื่อใช้สเกลความละเอียด\n\nBilinear ทำงานได้ดีกับเกม 3D และเป็นตัวเลือกเริ่มต้นที่ปลอดภัย\n\nแนะนำให้ใช้เกมภาพพิกเซลที่ใกล้เคียงที่สุด\n\nFSR 1.0 เป็นเพียงตัวกรองความคมชัด ไม่แนะนำให้ใช้กับ FXAA หรือ SMAA\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม", - "GraphicsScalingFilterBilinear": "Bilinear", - "GraphicsScalingFilterNearest": "ใกล้สุด", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "ระดับ", - "GraphicsScalingFilterLevelTooltip": "ตั้งค่าระดับความคมชัด FSR 1.0 ยิ่งสูงกว่าจะยิ่งคมชัดกว่า", - "SmaaLow": "SMAA ต่ำ", - "SmaaMedium": "SMAA ปานกลาง", - "SmaaHigh": "SMAA สูง", - "SmaaUltra": "SMAA สูงมาก", - "UserEditorTitle": "แก้ไขผู้ใช้", - "UserEditorTitleCreate": "สร้างผู้ใช้", - "SettingsTabNetworkInterface": "เชื่อมต่อเครือข่าย:", - "NetworkInterfaceTooltip": "อินเทอร์เฟซเครือข่ายที่ใช้สำหรับคุณสมบัติ LAN/LDN\n\nเมื่อใช้ร่วมกับ VPN หรือ XLink Kai และเกมที่รองรับ LAN สามารถใช้เพื่อปลอมการเชื่อมต่อเครือข่ายเดียวกันผ่านทางอินเทอร์เน็ต\n\nปล่อยให้เป็น ค่าเริ่มต้น หากคุณไม่แน่ใจ", - "NetworkInterfaceDefault": "ค่าเริ่มต้น", - "PackagingShaders": "รวม Shaders เข้าด้วยกัน", - "AboutChangelogButton": "ดูประวัติการเปลี่ยนแปลงบน GitHub", - "AboutChangelogButtonTooltipMessage": "คลิกเพื่อเปิดประวัติการเปลี่ยนแปลงสำหรับเวอร์ชั่นนี้ บนเบราว์เซอร์เริ่มต้นของคุณ", - "SettingsTabNetworkMultiplayer": "ผู้เล่นหลายคน", - "MultiplayerMode": "โหมด:", - "MultiplayerModeTooltip": "เปลี่ยนโหมดผู้เล่นหลายคนของ LDN\n\nLdnMitm จะปรับเปลี่ยนฟังก์ชันการเล่นแบบไร้สาย/ภายใน จะให้เกมทำงานเหมือนกับว่าเป็น LAN ช่วยให้สามารถเชื่อมต่อภายในเครือข่ายเดียวกันกับอินสแตนซ์ Ryujinx อื่น ๆ และคอนโซล Nintendo Switch ที่ถูกแฮ็กซึ่งมีโมดูล ldn_mitm ติดตั้งอยู่\n\nผู้เล่นหลายคนต้องการให้ผู้เล่นทุกคนอยู่ในเกมเวอร์ชันเดียวกัน (เช่น Super Smash Bros. Ultimate v13.0.1 ไม่สามารถเชื่อมต่อกับ v13.0.0)\n\nปล่อยให้ปิดการใช้งานหากไม่แน่ใจ", - "MultiplayerModeDisabled": "ปิดใช้งาน", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/tr_TR.json b/src/Ryujinx/Assets/Locales/tr_TR.json deleted file mode 100644 index 101206210..000000000 --- a/src/Ryujinx/Assets/Locales/tr_TR.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "Türkçe", - "MenuBarFileOpenApplet": "Applet'i Aç", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Mii Editör Applet'ini Bağımsız Mod'da Aç", - "SettingsTabInputDirectMouseAccess": "Doğrudan Mouse Erişimi", - "SettingsTabSystemMemoryManagerMode": "Hafıza Yönetim Modu:", - "SettingsTabSystemMemoryManagerModeSoftware": "Yazılım", - "SettingsTabSystemMemoryManagerModeHost": "Host (hızlı)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Host Unchecked (en hızlısı, tehlikeli)", - "SettingsTabSystemUseHypervisor": "Hypervisor Kullan", - "MenuBarFile": "_Dosya", - "MenuBarFileOpenFromFile": "_Dosyadan Uygulama Aç", - "MenuBarFileOpenFromFileError": "No applications found in selected file.", - "MenuBarFileOpenUnpacked": "_Sıkıştırılmamış Oyun Aç", - "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder", - "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder", - "MenuBarFileOpenEmuFolder": "Ryujinx Klasörünü aç", - "MenuBarFileOpenLogsFolder": "Logs Klasörünü aç", - "MenuBarFileExit": "_Çıkış", - "MenuBarOptions": "_Seçenekler", - "MenuBarOptionsToggleFullscreen": "Tam Ekran Modunu Aç", - "MenuBarOptionsStartGamesInFullscreen": "Oyunları Tam Ekran Modunda Başlat", - "MenuBarOptionsStopEmulation": "Emülasyonu Durdur", - "MenuBarOptionsSettings": "_Seçenekler", - "MenuBarOptionsManageUserProfiles": "_Kullanıcı Profillerini Yönet", - "MenuBarActions": "_Eylemler", - "MenuBarOptionsSimulateWakeUpMessage": "Uyandırma Mesajı Simüle Et", - "MenuBarActionsScanAmiibo": "Bir Amiibo Tara", - "MenuBarTools": "_Araçlar", - "MenuBarToolsInstallFirmware": "Yazılım Yükle", - "MenuBarFileToolsInstallFirmwareFromFile": "XCI veya ZIP'ten Yazılım Yükle", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Bir Dizin Üzerinden Yazılım Yükle", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "Dosya uzantılarını yönet", - "MenuBarToolsInstallFileTypes": "Dosya uzantılarını yükle", - "MenuBarToolsUninstallFileTypes": "Dosya uzantılarını kaldır", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_Görüntüle", - "MenuBarViewWindow": "Pencere Boyutu", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Yardım", - "MenuBarHelpCheckForUpdates": "Güncellemeleri Denetle", - "MenuBarHelpAbout": "Hakkında", - "MenuSearch": "Ara...", - "GameListHeaderFavorite": "Favori", - "GameListHeaderIcon": "Simge", - "GameListHeaderApplication": "Oyun Adı", - "GameListHeaderDeveloper": "Geliştirici", - "GameListHeaderVersion": "Sürüm", - "GameListHeaderTimePlayed": "Oynama Süresi", - "GameListHeaderLastPlayed": "Son Oynama Tarihi", - "GameListHeaderFileExtension": "Dosya Uzantısı", - "GameListHeaderFileSize": "Dosya Boyutu", - "GameListHeaderPath": "Yol", - "GameListContextMenuOpenUserSaveDirectory": "Kullanıcı Kayıt Dosyası Dizinini Aç", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Uygulamanın Kullanıcı Kaydı'nın bulunduğu dizini açar", - "GameListContextMenuOpenDeviceSaveDirectory": "Kullanıcı Cihaz Dizinini Aç", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Uygulamanın Kullanıcı Cihaz Kaydı'nın bulunduğu dizini açar", - "GameListContextMenuOpenBcatSaveDirectory": "Kullanıcı BCAT Dizinini Aç", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Uygulamanın Kullanıcı BCAT Kaydı'nın bulunduğu dizini açar", - "GameListContextMenuManageTitleUpdates": "Oyun Güncellemelerini Yönet", - "GameListContextMenuManageTitleUpdatesToolTip": "Oyun Güncelleme Yönetim Penceresini Açar", - "GameListContextMenuManageDlc": "DLC'leri Yönet", - "GameListContextMenuManageDlcToolTip": "DLC yönetim penceresini açar", - "GameListContextMenuCacheManagement": "Önbellek Yönetimi", - "GameListContextMenuCacheManagementPurgePptc": "PPTC Yeniden Yapılandırmasını Başlat", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Oyunun bir sonraki açılışında PPTC'yi yeniden yapılandır", - "GameListContextMenuCacheManagementPurgeShaderCache": "Shader Önbelleğini Temizle", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Uygulamanın shader önbelleğini temizler", - "GameListContextMenuCacheManagementOpenPptcDirectory": "PPTC Dizinini Aç", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Uygulamanın PPTC Önbelleğinin bulunduğu dizini açar", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Shader Önbelleği Dizinini Aç", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Uygulamanın shader önbelleğinin bulunduğu dizini açar", - "GameListContextMenuExtractData": "Veriyi Ayıkla", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Uygulamanın geçerli yapılandırmasından ExeFS kısmını ayıkla (Güncellemeler dahil)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Uygulamanın geçerli yapılandırmasından RomFS kısmını ayıkla (Güncellemeler dahil)", - "GameListContextMenuExtractDataLogo": "Simge", - "GameListContextMenuExtractDataLogoToolTip": "Uygulamanın geçerli yapılandırmasından Logo kısmını ayıkla (Güncellemeler dahil)", - "GameListContextMenuCreateShortcut": "Uygulama Kısayolu Oluştur", - "GameListContextMenuCreateShortcutToolTip": "Seçilmiş uygulamayı çalıştıracak bir masaüstü kısayolu oluştur", - "GameListContextMenuCreateShortcutToolTipMacOS": "Create a shortcut in macOS's Applications folder that launches the selected Application", - "GameListContextMenuOpenModsDirectory": "Mod Dizinini Aç", - "GameListContextMenuOpenModsDirectoryToolTip": "Opens the directory which contains Application's Mods", - "GameListContextMenuOpenSdModsDirectory": "Open Atmosphere Mods Directory", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Opens the alternative SD card Atmosphere directory which contains Application's Mods. Useful for mods that are packaged for real hardware.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} Oyun Yüklendi", - "StatusBarSystemVersion": "Sistem Sürümü: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Bellek Haritaları İçin Düşük Limit Tespit Edildi ", - "LinuxVmMaxMapCountDialogTextPrimary": "vm.max_map_count değerini {0} sayısına yükseltmek ister misiniz", - "LinuxVmMaxMapCountDialogTextSecondary": "Bazı oyunlar şu an izin verilen bellek haritası limitinden daha fazlasını yaratmaya çalışabilir. Ryujinx bu limitin geçildiği takdirde kendini kapatıcaktır.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Evet, bir sonraki yeniden başlatmaya kadar", - "LinuxVmMaxMapCountDialogButtonPersistent": "Evet, kalıcı olarak", - "LinuxVmMaxMapCountWarningTextPrimary": "İzin verilen maksimum bellek haritası değeri tavsiye edildiğinden daha düşük. ", - "LinuxVmMaxMapCountWarningTextSecondary": "Şu anki vm.max_map_count değeri {0}, bu {1} değerinden daha az. Bazı oyunlar şu an izin verilen bellek haritası limitinden daha fazlasını yaratmaya çalışabilir. Ryujinx bu limitin geçildiği takdirde kendini kapatıcaktır.\n\nManuel olarak bu limiti arttırmayı deneyebilir ya da pkexec'i yükleyebilirsiniz, bu da Ryujinx'in yardımcı olmasına izin verir.", - "Settings": "Ayarlar", - "SettingsTabGeneral": "Kullancı Arayüzü", - "SettingsTabGeneralGeneral": "Genel", - "SettingsTabGeneralEnableDiscordRichPresence": "Discord Zengin İçerik'i Etkinleştir", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Her Açılışta Güncellemeleri Denetle", - "SettingsTabGeneralShowConfirmExitDialog": "\"Çıkışı Onayla\" Diyaloğunu Göster", - "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "İşaretçiyi Gizle:", - "SettingsTabGeneralHideCursorNever": "Hiçbir Zaman", - "SettingsTabGeneralHideCursorOnIdle": "Hareketsiz Durumda", - "SettingsTabGeneralHideCursorAlways": "Her Zaman", - "SettingsTabGeneralGameDirectories": "Oyun Dizinleri", - "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "Ekle", - "SettingsTabGeneralRemove": "Kaldır", - "SettingsTabSystem": "Sistem", - "SettingsTabSystemCore": "Çekirdek", - "SettingsTabSystemSystemRegion": "Sistem Bölgesi:", - "SettingsTabSystemSystemRegionJapan": "Japonya", - "SettingsTabSystemSystemRegionUSA": "ABD", - "SettingsTabSystemSystemRegionEurope": "Avrupa", - "SettingsTabSystemSystemRegionAustralia": "Avustralya", - "SettingsTabSystemSystemRegionChina": "Çin", - "SettingsTabSystemSystemRegionKorea": "Kore", - "SettingsTabSystemSystemRegionTaiwan": "Tayvan", - "SettingsTabSystemSystemLanguage": "Sistem Dili:", - "SettingsTabSystemSystemLanguageJapanese": "Japonca", - "SettingsTabSystemSystemLanguageAmericanEnglish": "Amerikan İngilizcesi", - "SettingsTabSystemSystemLanguageFrench": "Fransızca", - "SettingsTabSystemSystemLanguageGerman": "Almanca", - "SettingsTabSystemSystemLanguageItalian": "İtalyanca", - "SettingsTabSystemSystemLanguageSpanish": "İspanyolca", - "SettingsTabSystemSystemLanguageChinese": "Çince", - "SettingsTabSystemSystemLanguageKorean": "Korece", - "SettingsTabSystemSystemLanguageDutch": "Flemenkçe", - "SettingsTabSystemSystemLanguagePortuguese": "Portekizce", - "SettingsTabSystemSystemLanguageRussian": "Rusça", - "SettingsTabSystemSystemLanguageTaiwanese": "Tayvanca", - "SettingsTabSystemSystemLanguageBritishEnglish": "İngiliz İngilizcesi", - "SettingsTabSystemSystemLanguageCanadianFrench": "Kanada Fransızcası", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Latin Amerika İspanyolcası", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Basitleştirilmiş Çince", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Geleneksel Çince", - "SettingsTabSystemSystemTimeZone": "Sistem Saat Dilimi:", - "SettingsTabSystemSystemTime": "Sistem Saati:", - "SettingsTabSystemEnableVsync": "Dikey Eşitleme", - "SettingsTabSystemEnablePptc": "PPTC (Profilli Sürekli Çeviri Önbelleği)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "FS Bütünlük Kontrolleri", - "SettingsTabSystemAudioBackend": "Ses Motoru:", - "SettingsTabSystemAudioBackendDummy": "Yapay", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "Hack'ler", - "SettingsTabSystemHacksNote": " (dengesizlik oluşturabilir)", - "SettingsTabSystemDramSize": "Alternatif bellek düzeni kullan (Geliştirici)", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "Eksik Servisleri Görmezden Gel", - "SettingsTabSystemIgnoreApplet": "Ignore Applet", - "SettingsTabGraphics": "Grafikler", - "SettingsTabGraphicsAPI": "Grafikler API", - "SettingsTabGraphicsEnableShaderCache": "Shader Önbelleğini Etkinleştir", - "SettingsTabGraphicsAnisotropicFiltering": "Eşyönsüz Doku Süzmesi:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Otomatik", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "Çözünürlük Ölçeği:", - "SettingsTabGraphicsResolutionScaleCustom": "Özel (Tavsiye Edilmez)", - "SettingsTabGraphicsResolutionScaleNative": "Yerel (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Tavsiye Edilmez)", - "SettingsTabGraphicsAspectRatio": "En-Boy Oranı:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "Pencereye Sığdırmak İçin Genişlet", - "SettingsTabGraphicsDeveloperOptions": "Geliştirici Seçenekleri", - "SettingsTabGraphicsShaderDumpPath": "Grafik Shader Döküm Yolu:", - "SettingsTabLogging": "Loglama", - "SettingsTabLoggingLogging": "Loglama", - "SettingsTabLoggingEnableLoggingToFile": "Logları Dosyaya Kaydetmeyi Etkinleştir", - "SettingsTabLoggingEnableStubLogs": "Stub Loglarını Etkinleştir", - "SettingsTabLoggingEnableInfoLogs": "Bilgi Loglarını Etkinleştir", - "SettingsTabLoggingEnableWarningLogs": "Uyarı Loglarını Etkinleştir", - "SettingsTabLoggingEnableErrorLogs": "Hata Loglarını Etkinleştir", - "SettingsTabLoggingEnableTraceLogs": "Trace Loglarını Etkinleştir", - "SettingsTabLoggingEnableGuestLogs": "Guest Loglarını Etkinleştir", - "SettingsTabLoggingEnableFsAccessLogs": "Fs Erişim Loglarını Etkinleştir", - "SettingsTabLoggingFsGlobalAccessLogMode": "Fs Evrensel Erişim Log Modu:", - "SettingsTabLoggingDeveloperOptions": "Geliştirici Seçenekleri (UYARI: Performansı düşürecektir)", - "SettingsTabLoggingDeveloperOptionsNote": "UYARI: Oyun performansı azalacak", - "SettingsTabLoggingGraphicsBackendLogLevel": "Grafik Arka Uç Günlük Düzeyi", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "Hiçbiri", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Hata", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Yavaşlamalar", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "Hepsi", - "SettingsTabLoggingEnableDebugLogs": "Hata Ayıklama Loglarını Etkinleştir", - "SettingsTabInput": "Giriş Yöntemi", - "SettingsTabInputEnableDockedMode": "Docked Modu Etkinleştir", - "SettingsTabInputDirectKeyboardAccess": "Doğrudan Klavye Erişimi", - "SettingsButtonSave": "Kaydet", - "SettingsButtonClose": "Kapat", - "SettingsButtonOk": "Tamam", - "SettingsButtonCancel": "İptal", - "SettingsButtonApply": "Uygula", - "ControllerSettingsPlayer": "Oyuncu", - "ControllerSettingsPlayer1": "Oyuncu 1", - "ControllerSettingsPlayer2": "Oyuncu 2", - "ControllerSettingsPlayer3": "Oyuncu 3", - "ControllerSettingsPlayer4": "Oyuncu 4", - "ControllerSettingsPlayer5": "Oyuncu 5", - "ControllerSettingsPlayer6": "Oyuncu 6", - "ControllerSettingsPlayer7": "Oyuncu 7", - "ControllerSettingsPlayer8": "Oyuncu 8", - "ControllerSettingsHandheld": "Portatif Mod", - "ControllerSettingsInputDevice": "Giriş Cihazı", - "ControllerSettingsRefresh": "Yenile", - "ControllerSettingsDeviceDisabled": "Devre Dışı", - "ControllerSettingsControllerType": "Kumanda Tipi", - "ControllerSettingsControllerTypeHandheld": "Portatif Mod", - "ControllerSettingsControllerTypeProController": "Profesyonel Kumanda", - "ControllerSettingsControllerTypeJoyConPair": "JoyCon Çifti", - "ControllerSettingsControllerTypeJoyConLeft": "JoyCon Sol", - "ControllerSettingsControllerTypeJoyConRight": "JoyCon Sağ", - "ControllerSettingsProfile": "Profil", - "ControllerSettingsProfileDefault": "Varsayılan", - "ControllerSettingsLoad": "Yükle", - "ControllerSettingsAdd": "Ekle", - "ControllerSettingsRemove": "Kaldır", - "ControllerSettingsButtons": "Tuşlar", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Yön Tuşları", - "ControllerSettingsDPadUp": "Yukarı", - "ControllerSettingsDPadDown": "Aşağı", - "ControllerSettingsDPadLeft": "Sol", - "ControllerSettingsDPadRight": "Sağ", - "ControllerSettingsStickButton": "Tuş", - "ControllerSettingsStickUp": "Yukarı", - "ControllerSettingsStickDown": "Aşağı", - "ControllerSettingsStickLeft": "Sol", - "ControllerSettingsStickRight": "Sağ", - "ControllerSettingsStickStick": "Analog", - "ControllerSettingsStickInvertXAxis": "X Eksenini Tersine Çevir", - "ControllerSettingsStickInvertYAxis": "Y Eksenini Tersine Çevir", - "ControllerSettingsStickDeadzone": "Ölü Bölge", - "ControllerSettingsLStick": "Sol Analog", - "ControllerSettingsRStick": "Sağ Analog", - "ControllerSettingsTriggersLeft": "Tetikler Sol", - "ControllerSettingsTriggersRight": "Tetikler Sağ", - "ControllerSettingsTriggersButtonsLeft": "Tetik Tuşları Sol", - "ControllerSettingsTriggersButtonsRight": "Tetik Tuşları Sağ", - "ControllerSettingsTriggers": "Tetikler", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Tuşlar Sol", - "ControllerSettingsExtraButtonsRight": "Tuşlar Sağ", - "ControllerSettingsMisc": "Diğer", - "ControllerSettingsTriggerThreshold": "Tetik Eşiği:", - "ControllerSettingsMotion": "Hareket", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "CemuHook uyumlu hareket kullan", - "ControllerSettingsMotionControllerSlot": "Kumanda Yuvası:", - "ControllerSettingsMotionMirrorInput": "Girişi Aynala", - "ControllerSettingsMotionRightJoyConSlot": "Sağ JoyCon Yuvası:", - "ControllerSettingsMotionServerHost": "Sunucu Sahibi:", - "ControllerSettingsMotionGyroSensitivity": "Gyro Hassasiyeti:", - "ControllerSettingsMotionGyroDeadzone": "Gyro Ölü Bölgesi:", - "ControllerSettingsSave": "Kaydet", - "ControllerSettingsClose": "Kapat", - "KeyUnknown": "Unknown", - "KeyShiftLeft": "Sol Shift", - "KeyShiftRight": "Sağ Shift", - "KeyControlLeft": "Sol Ctrl", - "KeyMacControlLeft": "⌃ Sol", - "KeyControlRight": "Sağ Control", - "KeyMacControlRight": "⌃ Sağ", - "KeyAltLeft": "Sol Alt", - "KeyMacAltLeft": "⌥ Sol", - "KeyAltRight": "Sağ Alt", - "KeyMacAltRight": "⌥ Sağ", - "KeyWinLeft": "⊞ Sol", - "KeyMacWinLeft": "⌘ Sol", - "KeyWinRight": "⊞ Sağ", - "KeyMacWinRight": "⌘ Sağ", - "KeyMenu": "Menü", - "KeyUp": "Yukarı", - "KeyDown": "Aşağı", - "KeyLeft": "Sol", - "KeyRight": "Sağ", - "KeyEnter": "Enter", - "KeyEscape": "Esc", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Geri tuşu", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Sağ", - "GamepadMinus": "-", - "GamepadPlus": "4", - "GamepadGuide": "Rehber", - "GamepadMisc1": "Diğer", - "GamepadPaddle1": "Pedal 1", - "GamepadPaddle2": "Pedal 2", - "GamepadPaddle3": "Pedal 3", - "GamepadPaddle4": "Pedal 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Sol Tetik 0", - "GamepadSingleRightTrigger0": "Sağ Tetik 0", - "GamepadSingleLeftTrigger1": "Sol Tetik 1", - "GamepadSingleRightTrigger1": "Sağ Tetik 1", - "StickLeft": "Sol Çubuk", - "StickRight": "Sağ çubuk", - "UserProfilesSelectedUserProfile": "Seçili Kullanıcı Profili:", - "UserProfilesSaveProfileName": "Profil İsmini Kaydet", - "UserProfilesChangeProfileImage": "Profil Resmini Değiştir", - "UserProfilesAvailableUserProfiles": "Mevcut Kullanıcı Profilleri:", - "UserProfilesAddNewProfile": "Yeni Profil Ekle", - "UserProfilesDelete": "Sil", - "UserProfilesClose": "Kapat", - "ProfileNameSelectionWatermark": "Kullanıcı Adı Seç", - "ProfileImageSelectionTitle": "Profil Resmi Seçimi", - "ProfileImageSelectionHeader": "Profil Resmi Seç", - "ProfileImageSelectionNote": "Özel bir profil resmi içeri aktarabilir veya sistem avatarlarından birini seçebilirsiniz", - "ProfileImageSelectionImportImage": "Resim İçeri Aktar", - "ProfileImageSelectionSelectAvatar": "Yazılım Avatarı Seç", - "InputDialogTitle": "Giriş Yöntemi Diyaloğu", - "InputDialogOk": "Tamam", - "InputDialogCancel": "İptal", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "Profil İsmini Seç", - "InputDialogAddNewProfileHeader": "Lütfen Bir Profil İsmi Girin", - "InputDialogAddNewProfileSubtext": "(Maksimum Uzunluk: {0})", - "AvatarChoose": "Seç", - "AvatarSetBackgroundColor": "Arka Plan Rengi Ayarla", - "AvatarClose": "Kapat", - "ControllerSettingsLoadProfileToolTip": "Profil Yükle", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "Profil Ekle", - "ControllerSettingsRemoveProfileToolTip": "Profili Kaldır", - "ControllerSettingsSaveProfileToolTip": "Profili Kaydet", - "MenuBarFileToolsTakeScreenshot": "Ekran Görüntüsü Al", - "MenuBarFileToolsHideUi": "Arayüzü Gizle", - "GameListContextMenuRunApplication": "Uygulamayı Çalıştır", - "GameListContextMenuToggleFavorite": "Favori Ayarla", - "GameListContextMenuToggleFavoriteToolTip": "Oyunu Favorilere Ekle/Çıkar", - "SettingsTabGeneralTheme": "Tema:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "Karanlık", - "SettingsTabGeneralThemeLight": "Aydınlık", - "ControllerSettingsConfigureGeneral": "Ayarla", - "ControllerSettingsRumble": "Titreşim", - "ControllerSettingsRumbleStrongMultiplier": "Güçlü Titreşim Çoklayıcı", - "ControllerSettingsRumbleWeakMultiplier": "Zayıf Titreşim Seviyesi", - "DialogMessageSaveNotAvailableMessage": "{0} [{1:x16}] için kayıt verisi bulunamadı", - "DialogMessageSaveNotAvailableCreateSaveMessage": "Bu oyun için kayıt verisi oluşturmak ister misiniz?", - "DialogConfirmationTitle": "Ryujinx - Onay", - "DialogUpdaterTitle": "Ryujinx - Güncelleyici", - "DialogErrorTitle": "Ryujinx - Hata", - "DialogWarningTitle": "Ryujinx - Uyarı", - "DialogExitTitle": "Ryujinx - Çıkış", - "DialogErrorMessage": "Ryujinx bir hata ile karşılaştı", - "DialogExitMessage": "Ryujinx'i kapatmak istediğinizden emin misiniz?", - "DialogExitSubMessage": "Kaydedilmeyen bütün veriler kaybedilecek!", - "DialogMessageCreateSaveErrorMessage": "Belirtilen kayıt verisi oluşturulurken bir hata oluştu: {0}", - "DialogMessageFindSaveErrorMessage": "Belirtilen kayıt verisi bulunmaya çalışırken hata: {0}", - "FolderDialogExtractTitle": "İçine ayıklanacak klasörü seç", - "DialogNcaExtractionMessage": "{1} den {0} kısmı ayıklanıyor...", - "DialogNcaExtractionTitle": "NCA Kısmı Ayıklayıcısı", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Ayıklama hatası. Ana NCA seçilen dosyada bulunamadı.", - "DialogNcaExtractionCheckLogErrorMessage": "Ayıklama hatası. Ek bilgi için kayıt dosyasını okuyun.", - "DialogNcaExtractionSuccessMessage": "Ayıklama başarıyla tamamlandı.", - "DialogUpdaterConvertFailedMessage": "Güncel Ryujinx sürümü dönüştürülemedi.", - "DialogUpdaterCancelUpdateMessage": "Güncelleme iptal ediliyor!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "Zaten Ryujinx'in en güncel sürümünü kullanıyorsunuz!", - "DialogUpdaterFailedToGetVersionMessage": "GitHub tarafından sürüm bilgileri alınırken bir hata oluştu. Eğer yeni sürüm için hazırlıklar yapılıyorsa bu hatayı almanız olasıdır. Lütfen birkaç dakika sonra tekrar deneyiniz.", - "DialogUpdaterConvertFailedGithubMessage": "Github Release'den alınan Ryujinx sürümü dönüştürülemedi.", - "DialogUpdaterDownloadingMessage": "Güncelleme İndiriliyor...", - "DialogUpdaterExtractionMessage": "Güncelleme Ayıklanıyor...", - "DialogUpdaterRenamingMessage": "Güncelleme Yeniden Adlandırılıyor...", - "DialogUpdaterAddingFilesMessage": "Yeni Güncelleme Ekleniyor...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "Güncelleme Tamamlandı!", - "DialogUpdaterRestartMessage": "Ryujinx'i şimdi yeniden başlatmak istiyor musunuz?", - "DialogUpdaterNoInternetMessage": "İnternete bağlı değilsiniz!", - "DialogUpdaterNoInternetSubMessage": "Lütfen aktif bir internet bağlantınız olduğunu kontrol edin!", - "DialogUpdaterDirtyBuildMessage": "Ryujinx'in Dirty build'lerini güncelleyemezsiniz!", - "DialogUpdaterDirtyBuildSubMessage": "Desteklenen bir sürüm için lütfen Ryujinx'i https://ryujinx.app/download sitesinden indirin.", - "DialogRestartRequiredMessage": "Yeniden Başlatma Gerekli", - "DialogThemeRestartMessage": "Tema kaydedildi. Temayı uygulamak için yeniden başlatma gerekiyor.", - "DialogThemeRestartSubMessage": "Yeniden başlatmak ister misiniz", - "DialogFirmwareInstallEmbeddedMessage": "Bu oyunun içine gömülü olan yazılımı yüklemek ister misiniz? (Firmware {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "No installed firmware was found but Ryujinx was able to install firmware {0} from the provided game.\nThe emulator will now start.", - "DialogFirmwareNoFirmwareInstalledMessage": "Yazılım Yüklü Değil", - "DialogFirmwareInstalledMessage": "Yazılım {0} yüklendi", - "DialogInstallFileTypesSuccessMessage": "Dosya uzantıları başarıyla yüklendi!", - "DialogInstallFileTypesErrorMessage": "Dosya uzantıları yükleme işlemi başarısız oldu.", - "DialogUninstallFileTypesSuccessMessage": "Dosya uzantıları başarıyla kaldırıldı!", - "DialogUninstallFileTypesErrorMessage": "Dosya uzantıları kaldırma işlemi başarısız oldu.", - "DialogOpenSettingsWindowLabel": "Seçenekler Penceresini Aç", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "Kumanda Applet'i", - "DialogMessageDialogErrorExceptionMessage": "Mesaj diyaloğu gösterilirken hata: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Mesaj diyaloğu gösterilirken hata: {0}", - "DialogErrorAppletErrorExceptionMessage": "Applet diyaloğu gösterilirken hata: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nBu hatayı düzeltmek adına daha fazla bilgi için kurulum kılavuzumuzu takip edin.", - "DialogUserErrorDialogTitle": "Ryujinx Hatası ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "API'dan bilgi alırken bir hata oluştu.", - "DialogAmiiboApiConnectErrorMessage": "Amiibo API sunucusuna bağlanılamadı. Sunucu çevrimdışı olabilir veya uygun bir internet bağlantınızın olduğunu kontrol etmeniz gerekebilir.", - "DialogProfileInvalidProfileErrorMessage": "Profil {0} güncel giriş konfigürasyon sistemi ile uyumlu değil.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "Varsayılan Profil'in üstüne yazılamaz", - "DialogProfileDeleteProfileTitle": "Profil Siliniyor", - "DialogProfileDeleteProfileMessage": "Bu eylem geri döndürülemez, devam etmek istediğinizden emin misiniz?", - "DialogWarning": "Uyarı", - "DialogPPTCDeletionMessage": "Belirtilen PPTC cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?", - "DialogPPTCDeletionErrorMessage": "Belirtilen PPTC cache temizlenirken hata {0}: {1}", - "DialogShaderDeletionMessage": "Belirtilen Shader cache silinecek :\n\n{0}\n\nDevam etmek istediğinizden emin misiniz?", - "DialogShaderDeletionErrorMessage": "Belirtilen Shader cache temizlenirken hata {0}: {1}", - "DialogRyujinxErrorMessage": "Ryujinx bir hata ile karşılaştı", - "DialogInvalidTitleIdErrorMessage": "Arayüz hatası: Seçilen oyun geçerli bir title ID'ye sahip değil", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "{0} da geçerli bir sistem firmware'i bulunamadı.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Firmware {0} Yükle", - "DialogFirmwareInstallerFirmwareInstallMessage": "Sistem sürümü {0} yüklenecek.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nBu şimdiki sistem sürümünün yerini alacak {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDevam etmek istiyor musunuz?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Firmware yükleniyor...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Sistem sürümü {0} başarıyla yüklendi.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "Seçilen profil silinirse kullanılabilen başka profil kalmayacak", - "DialogUserProfileDeletionConfirmMessage": "Seçilen profili silmek istiyor musunuz", - "DialogUserProfileUnsavedChangesTitle": "Uyarı - Kaydedilmemiş Değişiklikler", - "DialogUserProfileUnsavedChangesMessage": "Kullanıcı profilinizde kaydedilmemiş değişiklikler var.", - "DialogUserProfileUnsavedChangesSubMessage": "Yaptığınız değişiklikleri iptal etmek istediğinize emin misiniz?", - "DialogControllerSettingsModifiedConfirmMessage": "Geçerli kumanda seçenekleri güncellendi.", - "DialogControllerSettingsModifiedConfirmSubMessage": "Kaydetmek istiyor musunuz?", - "DialogLoadFileErrorMessage": "{0}. Hatalı Dosya: {1}", - "DialogModAlreadyExistsMessage": "Mod zaten var", - "DialogModInvalidMessage": "The specified directory does not contain a mod!", - "DialogModDeleteNoParentMessage": "Silme Başarısız: \"{0}\" Modu için üst dizin bulunamadı! ", - "DialogDlcNoDlcErrorMessage": "Belirtilen dosya seçilen oyun için DLC içermiyor!", - "DialogPerformanceCheckLoggingEnabledMessage": "Sadece geliştiriler için dizayn edilen Trace Loglama seçeneği etkin.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "En iyi performans için trace loglama'nın devre dışı bırakılması tavsiye edilir. Trace loglama seçeneğini şimdi devre dışı bırakmak ister misiniz?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "Sadece geliştiriler için dizayn edilen Shader Dumping seçeneği etkin.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "En iyi performans için Shader Dumping'in devre dışı bırakılması tavsiye edilir. Shader Dumping seçeneğini şimdi devre dışı bırakmak ister misiniz?", - "DialogLoadAppGameAlreadyLoadedMessage": "Bir oyun zaten yüklendi", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Lütfen yeni bir oyun açmadan önce emülasyonu durdurun veya emülatörü kapatın.", - "DialogUpdateAddUpdateErrorMessage": "Belirtilen dosya seçilen oyun için güncelleme içermiyor!", - "DialogSettingsBackendThreadingWarningTitle": "Uyarı - Backend Threading", - "DialogSettingsBackendThreadingWarningMessage": "Bu seçeneğin tamamen uygulanması için Ryujinx'in kapatıp açılması gerekir. Kullandığınız işletim sistemine bağlı olarak, Ryujinx'in multithreading'ini kullanırken driver'ınızın multithreading seçeneğini kapatmanız gerekebilir.", - "DialogModManagerDeletionWarningMessage": "You are about to delete the mod: {0}\n\nAre you sure you want to proceed?", - "DialogModManagerDeletionAllWarningMessage": "You are about to delete all mods for this title.\n\nAre you sure you want to proceed?", - "SettingsTabGraphicsFeaturesOptions": "Özellikler", - "SettingsTabGraphicsBackendMultithreading": "Grafik Backend Multithreading:", - "CommonAuto": "Otomatik", - "CommonOff": "Kapalı", - "CommonOn": "Açık", - "InputDialogYes": "Evet", - "InputDialogNo": "Hayır", - "DialogProfileInvalidProfileNameErrorMessage": "Dosya adı geçersiz karakter içeriyor. Lütfen tekrar deneyin.", - "MenuBarOptionsPauseEmulation": "Durdur", - "MenuBarOptionsResumeEmulation": "Devam Et", - "AboutUrlTooltipMessage": "Ryujinx'in websitesini varsayılan tarayıcınızda açmak için tıklayın.", - "AboutDisclaimerMessage": "Ryujinx, Nintendo™ veya ortaklarıyla herhangi bir şekilde bağlantılı değildir.", - "AboutAmiiboDisclaimerMessage": "Amiibo emülasyonumuzda \nAmiiboAPI (www.amiiboapi.com) kullanılmaktadır.", - "AboutPatreonUrlTooltipMessage": "Ryujinx'in Patreon sayfasını varsayılan tarayıcınızda açmak için tıklayın.", - "AboutGithubUrlTooltipMessage": "Ryujinx'in GitHub sayfasını varsayılan tarayıcınızda açmak için tıklayın.", - "AboutDiscordUrlTooltipMessage": "Varsayılan tarayıcınızda Ryujinx'in Discord'una bir davet açmak için tıklayın.", - "AboutTwitterUrlTooltipMessage": "Ryujinx'in Twitter sayfasını varsayılan tarayıcınızda açmak için tıklayın.", - "AboutRyujinxAboutTitle": "Hakkında:", - "AboutRyujinxAboutContent": "Ryujinx bir Nintendo Switch™ emülatörüdür.\nLütfen bizi Patreon'da destekleyin.\nEn son haberleri Twitter veya Discord'umuzdan alın.\nKatkıda bulunmak isteyen geliştiriciler GitHub veya Discord üzerinden daha fazla bilgi edinebilir.", - "AboutRyujinxMaintainersTitle": "Geliştiriciler:", - "AboutRyujinxMaintainersContentTooltipMessage": "Katkıda bulunanlar sayfasını varsayılan tarayıcınızda açmak için tıklayın.", - "AboutRyujinxSupprtersTitle": "Patreon Destekleyicileri:", - "AmiiboSeriesLabel": "Amiibo Serisi", - "AmiiboCharacterLabel": "Karakter", - "AmiiboScanButtonLabel": "Tarat", - "AmiiboOptionsShowAllLabel": "Tüm Amiibo'ları Göster", - "AmiiboOptionsUsRandomTagLabel": "Hack: Rastgele bir Uuid kullan", - "DlcManagerTableHeadingEnabledLabel": "Etkin", - "DlcManagerTableHeadingTitleIdLabel": "Başlık ID", - "DlcManagerTableHeadingContainerPathLabel": "Container Yol", - "DlcManagerTableHeadingFullPathLabel": "Tam Yol", - "DlcManagerRemoveAllButton": "Tümünü kaldır", - "DlcManagerEnableAllButton": "Tümünü Aktif Et", - "DlcManagerDisableAllButton": "Tümünü Devre Dışı Bırak", - "ModManagerDeleteAllButton": "Hepsini Sil", - "MenuBarOptionsChangeLanguage": "Dili Değiştir", - "MenuBarShowFileTypes": "Dosya Uzantılarını Göster", - "CommonSort": "Sırala", - "CommonShowNames": "İsimleri Göster", - "CommonFavorite": "Favori", - "OrderAscending": "Artan", - "OrderDescending": "Azalan", - "SettingsTabGraphicsFeatures": "Özellikler & İyileştirmeler", - "ErrorWindowTitle": "Hata Penceresi", - "ToggleDiscordTooltip": "Ryujinx'i \"şimdi oynanıyor\" Discord aktivitesinde göstermeyi veya göstermemeyi seçin", - "AddGameDirBoxTooltip": "Listeye eklemek için oyun dizini seçin", - "AddGameDirTooltip": "Listeye oyun dizini ekle", - "RemoveGameDirTooltip": "Seçili oyun dizinini kaldır", - "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list", - "AddAutoloadDirTooltip": "Add an autoload directory to the list", - "RemoveAutoloadDirTooltip": "Remove selected autoload directory", - "CustomThemeCheckTooltip": "Emülatör pencerelerinin görünümünü değiştirmek için özel bir Avalonia teması kullan", - "CustomThemePathTooltip": "Özel arayüz temasının yolu", - "CustomThemeBrowseTooltip": "Özel arayüz teması için göz at", - "DockModeToggleTooltip": "Docked modu emüle edilen sistemin yerleşik Nintendo Switch gibi davranmasını sağlar. Bu çoğu oyunda grafik kalitesini arttırır. Diğer yandan, bu seçeneği devre dışı bırakmak emüle edilen sistemin portatif Ninendo Switch gibi davranmasını sağlayıp grafik kalitesini düşürür.\n\nDocked modu kullanmayı düşünüyorsanız 1. Oyuncu kontrollerini; Handheld modunu kullanmak istiyorsanız portatif kontrollerini konfigüre edin.\n\nEmin değilseniz aktif halde bırakın.", - "DirectKeyboardTooltip": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.", - "DirectMouseTooltip": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.", - "RegionTooltip": "Sistem Bölgesini Değiştir", - "LanguageTooltip": "Sistem Dilini Değiştir", - "TimezoneTooltip": "Sistem Saat Dilimini Değiştir", - "TimeTooltip": "Sistem Saatini Değiştir", - "VSyncToggleTooltip": "Emulated console's Vertical Sync. Essentially a frame-limiter for the majority of games; disabling it may cause games to run at higher speed or make loading screens take longer or get stuck.\n\nCan be toggled in-game with a hotkey of your preference (F1 by default). We recommend doing this if you plan on disabling it.\n\nLeave ON if unsure.", - "PptcToggleTooltip": "Çevrilen JIT fonksiyonlarını oyun her açıldığında çevrilmek zorunda kalmaması için kaydeder.\n\nTeklemeyi azaltır ve ilk açılıştan sonra oyunların ilk açılış süresini ciddi biçimde hızlandırır.\n\nEmin değilseniz aktif halde bırakın.", - "LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", - "FsIntegrityToggleTooltip": "Oyun açarken hatalı dosyaların olup olmadığını kontrol eder, ve hatalı dosya bulursa log dosyasında hash hatası görüntüler.\n\nPerformansa herhangi bir etkisi yoktur ve sorun gidermeye yardımcı olur.\n\nEmin değilseniz aktif halde bırakın.", - "AudioBackendTooltip": "Ses çıkış motorunu değiştirir.\n\nSDL2 tercih edilen seçenektir, OpenAL ve SoundIO ise alternatif olarak kullanılabilir. Dummy seçeneğinde ses çıkışı olmayacaktır.\n\nEmin değilseniz SDL2 seçeneğine ayarlayın.", - "MemoryManagerTooltip": "Guest hafızasının nasıl tahsis edilip erişildiğini değiştirir. Emüle edilen CPU performansını ciddi biçimde etkiler.\n\nEmin değilseniz HOST UNCHECKED seçeneğine ayarlayın.", - "MemoryManagerSoftwareTooltip": "Adres çevirisi için bir işlemci sayfası kullanır. En yüksek doğruluğu ve en yavaş performansı sunar.", - "MemoryManagerHostTooltip": "Hafızayı doğrudan host adres aralığında tahsis eder. Çok daha hızlı JIT derleme ve işletimi sunar.", - "MemoryManagerUnsafeTooltip": "Hafızayı doğrudan tahsis eder, ancak host aralığına erişimden önce adresi maskelemez. Daha iyi performansa karşılık emniyetten ödün verir. Misafir uygulama Ryujinx içerisinden istediği hafızaya erişebilir, bu sebeple bu seçenek ile sadece güvendiğiniz uygulamaları çalıştırın.", - "UseHypervisorTooltip": "JIT yerine Hypervisor kullan. Uygun durumlarda performansı büyük oranda arttırır. Ancak şu anki halinde stabil durumda çalışmayabilir.", - "DRamTooltip": "Emüle edilen sistem hafızasını 4GiB'dan 6GiB'a yükseltir.\n\nBu seçenek yalnızca yüksek çözünürlük doku paketleri veya 4k çözünürlük modları için kullanılır. Performansı artırMAZ!\n\nEmin değilseniz devre dışı bırakın.", - "IgnoreMissingServicesTooltip": "Henüz programlanmamış Horizon işletim sistemi servislerini görmezden gelir. Bu seçenek belirli oyunların açılırken çökmesinin önüne geçmeye yardımcı olabilir.\n\nEmin değilseniz devre dışı bırakın.", - "IgnoreAppletTooltip": "Oyun sırasında oyun kumandasının bağlantısı kesilirse, harici \"Controller Applet\" iletişim kutusu görünmez. İletişim kutusunu kapatma veya yeni bir kumanda ayarlama isteği olmaz. Daha önce bağlantısı kesilen kumanda tekrar bağlandığında oyun otomatik olarak devam eder.", - "GraphicsBackendThreadingTooltip": "Grafik arka uç komutlarını ikinci bir iş parçacığında işletir.\n\nKendi multithreading desteği olmayan sürücülerde shader derlemeyi hızlandırıp performansı artırır. Multithreading desteği olan sürücülerde çok az daha iyi performans sağlar.\n\nEmin değilseniz Otomatik seçeneğine ayarlayın.", - "GalThreadingTooltip": "Grafik arka uç komutlarını ikinci bir iş parçacığında işletir.\n\nKendi multithreading desteği olmayan sürücülerde shader derlemeyi hızlandırıp performansı artırır. Multithreading desteği olan sürücülerde çok az daha iyi performans sağlar.\n\nEmin değilseniz Otomatik seçeneğine ayarlayın.", - "ShaderCacheToggleTooltip": "Sonraki çalışmalarda takılmaları engelleyen bir gölgelendirici disk önbelleğine kaydeder.", - "ResolutionScaleTooltip": "Multiplies the game's rendering resolution.\n\nA few games may not work with this and look pixelated even when the resolution is increased; for those games, you may need to find mods that remove anti-aliasing or that increase their internal rendering resolution. For using the latter, you'll likely want to select Native.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nKeep in mind 4x is overkill for virtually any setup.", - "ResolutionScaleEntryTooltip": "Küsüratlı çözünürlük ölçeği, 1.5 gibi. Küsüratlı ölçekler hata oluşturmaya ve çökmeye daha yatkındır.", - "AnisotropyTooltip": "Level of Anisotropic Filtering. Set to Auto to use the value requested by the game.", - "AspectRatioTooltip": "Aspect Ratio applied to the renderer window.\n\nOnly change this if you're using an aspect ratio mod for your game, otherwise the graphics will be stretched.\n\nLeave on 16:9 if unsure.", - "ShaderDumpPathTooltip": "Grafik Shader Döküm Yolu", - "FileLogTooltip": "Konsol loglarını diskte bir log dosyasına kaydeder. Performansı etkilemez.", - "StubLogTooltip": "Stub log mesajlarını konsola yazdırır. Performansı etkilemez.", - "InfoLogTooltip": "Bilgi log mesajlarını konsola yazdırır. Performansı etkilemez.", - "WarnLogTooltip": "Uyarı log mesajlarını konsola yazdırır. Performansı etkilemez.", - "ErrorLogTooltip": "Hata log mesajlarını konsola yazdırır. Performansı etkilemez.", - "TraceLogTooltip": "Trace log mesajlarını konsola yazdırır. Performansı etkilemez.", - "GuestLogTooltip": "Guest log mesajlarını konsola yazdırır. Performansı etkilemez.", - "FileAccessLogTooltip": "Dosya sistemi erişim log mesajlarını konsola yazdırır.", - "FSAccessLogModeTooltip": "Konsola FS erişim loglarının yazılmasını etkinleştirir. Kullanılabilir modlar 0-3'tür", - "DeveloperOptionTooltip": "Dikkatli kullanın", - "OpenGlLogLevel": "Uygun log seviyesinin aktif olmasını gerektirir", - "DebugLogTooltip": "Debug log mesajlarını konsola yazdırır.\n\nBu seçeneği yalnızca geliştirici üyemiz belirtirse aktifleştirin, çünkü bu seçenek log dosyasını okumayı zorlaştırır ve emülatörün performansını düşürür.", - "LoadApplicationFileTooltip": "Switch ile uyumlu bir dosya yüklemek için dosya tarayıcısını açar", - "LoadApplicationFolderTooltip": "Switch ile uyumlu ayrıştırılmamış bir uygulama yüklemek için dosya tarayıcısını açar", - "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from", - "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from", - "OpenRyujinxFolderTooltip": "Ryujinx dosya sistem klasörünü açar", - "OpenRyujinxLogsTooltip": "Log dosyalarının bulunduğu klasörü açar", - "ExitTooltip": "Ryujinx'ten çıkış yapmayı sağlar", - "OpenSettingsTooltip": "Seçenekler penceresini açar", - "OpenProfileManagerTooltip": "Kullanıcı profil yöneticisi penceresini açar", - "StopEmulationTooltip": "Oynanmakta olan oyunun emülasyonunu durdurup oyun seçimine geri döndürür", - "CheckUpdatesTooltip": "Ryujinx güncellemelerini denetlemeyi sağlar", - "OpenAboutTooltip": "Hakkında penceresini açar", - "GridSize": "Öge Boyutu", - "GridSizeTooltip": "Grid ögelerinin boyutunu değiştirmeyi sağlar", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Brezilya Portekizcesi", - "AboutRyujinxContributorsButtonHeader": "Tüm katkıda bulunanları gör", - "SettingsTabSystemAudioVolume": "Ses Seviyesi: ", - "AudioVolumeTooltip": "Ses seviyesini değiştirir", - "SettingsTabSystemEnableInternetAccess": "Guest Internet Erişimi/LAN Modu", - "EnableInternetAccessTooltip": "Emüle edilen uygulamanın internete bağlanmasını sağlar.\n\nLAN modu bulunan oyunlar bu seçenek ile birbirine bağlanabilir ve sistemler aynı access point'e bağlanır. Bu gerçek konsolları da kapsar.\n\nNintendo sunucularına bağlanmayı sağlaMAZ. Internete bağlanmaya çalışan baz oyunların çökmesine sebep olabilr.\n\nEmin değilseniz devre dışı bırakın.", - "GameListContextMenuManageCheatToolTip": "Hileleri yönetmeyi sağlar", - "GameListContextMenuManageCheat": "Hileleri Yönet", - "GameListContextMenuManageModToolTip": "Modları Yönet", - "GameListContextMenuManageMod": "Modları Yönet", - "ControllerSettingsStickRange": "Menzil:", - "DialogStopEmulationTitle": "Ryujinx - Emülasyonu Durdur", - "DialogStopEmulationMessage": "Emülasyonu durdurmak istediğinizden emin misiniz?", - "SettingsTabCpu": "İşlemci", - "SettingsTabAudio": "Ses", - "SettingsTabNetwork": "Ağ", - "SettingsTabNetworkConnection": "Ağ Bağlantısı", - "SettingsTabCpuCache": "İşlemci Belleği", - "SettingsTabCpuMemory": "CPU Hafızası", - "DialogUpdaterFlatpakNotSupportedMessage": "Lütfen Ryujinx'i FlatHub aracılığıyla güncelleyin.", - "UpdaterDisabledWarningTitle": "Güncelleyici Devre Dışı!", - "ControllerSettingsRotate90": "Saat yönünde 90° Döndür", - "IconSize": "Ikon Boyutu", - "IconSizeTooltip": "Oyun ikonlarının boyutunu değiştirmeyi sağlar", - "MenuBarOptionsShowConsole": "Konsol'u Göster", - "ShaderCachePurgeError": "Belirtilen shader cache temizlenirken hata {0}: {1}", - "UserErrorNoKeys": "Keys bulunamadı", - "UserErrorNoFirmware": "Firmware bulunamadı", - "UserErrorFirmwareParsingFailed": "Firmware çözümleme hatası", - "UserErrorApplicationNotFound": "Uygulama bulunamadı", - "UserErrorUnknown": "Bilinmeyen hata", - "UserErrorUndefined": "Tanımlanmayan hata", - "UserErrorNoKeysDescription": "Ryujinx 'prod.keys' dosyasını bulamadı", - "UserErrorNoFirmwareDescription": "Ryujinx yüklü herhangi firmware bulamadı", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx temin edilen firmware'i çözümleyemedi. Bu durum genellikle güncel olmayan keys'den kaynaklanır.", - "UserErrorApplicationNotFoundDescription": "Ryujinx belirtilen yolda geçerli bir uygulama bulamadı.", - "UserErrorUnknownDescription": "Bilinmeyen bir hata oluştu!", - "UserErrorUndefinedDescription": "Tanımlanmayan bir hata oluştu! Bu durum ile karşılaşılmamalıydı, lütfen bir geliştirici ile iletişime geçin!", - "OpenSetupGuideMessage": "Kurulum Kılavuzunu Aç", - "NoUpdate": "Güncelleme Yok", - "TitleUpdateVersionLabel": "Sürüm {0} - {1}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - Bilgi", - "RyujinxConfirm": "Ryujinx - Doğrulama", - "FileDialogAllTypes": "Tüm türler", - "Never": "Hiçbir Zaman", - "SwkbdMinCharacters": "En az {0} karakter uzunluğunda olmalı", - "SwkbdMinRangeCharacters": "{0}-{1} karakter uzunluğunda olmalı", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Yazılım Klavyesi", - "SoftwareKeyboardModeNumeric": "Sadece 0-9 veya '.' olabilir", - "SoftwareKeyboardModeAlphabet": "Sadece CJK-characters olmayan karakterler olabilir", - "SoftwareKeyboardModeASCII": "Sadece ASCII karakterler olabilir", - "ControllerAppletControllers": "Desteklenen Kumandalar:", - "ControllerAppletPlayers": "Oyuncular:", - "ControllerAppletDescription": "Halihazırdaki konfigürasyonunuz geçersiz. Ayarları açın ve girişlerinizi yeniden konfigüre edin.", - "ControllerAppletDocked": "Docked mod ayarlandı. Portatif denetim devre dışı bırakılmalı.", - "UpdaterRenaming": "Eski dosyalar yeniden adlandırılıyor...", - "UpdaterRenameFailed": "Güncelleyici belirtilen dosyayı yeniden adlandıramadı: {0}", - "UpdaterAddingFiles": "Yeni Dosyalar Ekleniyor...", - "UpdaterExtracting": "Güncelleme Ayrıştırılıyor...", - "UpdaterDownloading": "Güncelleme İndiriliyor...", - "Docked": "Docked", - "Handheld": "El tipi", - "ConnectionError": "Bağlantı Hatası.", - "AboutPageDeveloperListMore": "{0} ve daha fazla...", - "ApiError": "API Hatası.", - "LoadingHeading": "{0} Yükleniyor", - "CompilingPPTC": "PTC Derleniyor", - "CompilingShaders": "Shaderlar Derleniyor", - "AllKeyboards": "Tüm Klavyeler", - "OpenFileDialogTitle": "Açmak için desteklenen bir dosya seçin", - "OpenFolderDialogTitle": "Ayrıştırılmamış oyun içeren bir klasör seçin", - "AllSupportedFormats": "Tüm Desteklenen Formatlar", - "RyujinxUpdater": "Ryujinx Güncelleyicisi", - "SettingsTabHotkeys": "Klavye Kısayolları", - "SettingsTabHotkeysHotkeys": "Klavye Kısayolları", - "SettingsTabHotkeysToggleVsyncHotkey": "VSync'i Etkinleştir/Devre Dışı Bırak:", - "SettingsTabHotkeysScreenshotHotkey": "Ekran Görüntüsü Al:", - "SettingsTabHotkeysShowUiHotkey": "Arayüzü Göster:", - "SettingsTabHotkeysPauseHotkey": "Durdur:", - "SettingsTabHotkeysToggleMuteHotkey": "Sustur:", - "ControllerMotionTitle": "Hareket Kontrol Seçenekleri", - "ControllerRumbleTitle": "Titreşim Seçenekleri", - "SettingsSelectThemeFileDialogTitle": "Tema Dosyası Seç", - "SettingsXamlThemeFile": "Xaml Tema Dosyası", - "AvatarWindowTitle": "Hesapları Yönet - Avatar", - "Amiibo": "Amiibo", - "Unknown": "Bilinmeyen", - "Usage": "Kullanım", - "Writable": "Yazılabilir", - "SelectDlcDialogTitle": "DLC dosyalarını seç", - "SelectUpdateDialogTitle": "Güncelleme dosyalarını seç", - "SelectModDialogTitle": "Mod Dizinini Seç", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "Kullanıcı Profillerini Yönet", - "CheatWindowTitle": "Oyun Hilelerini Yönet", - "DlcWindowTitle": "Oyun DLC'lerini Yönet", - "ModWindowTitle": "Manage Mods for {0} ({1})", - "UpdateWindowTitle": "Oyun Güncellemelerini Yönet", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} new update(s) added", - "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.", - "CheatWindowHeading": "{0} için Hile mevcut [{1}]", - "BuildId": "BuildId:", - "DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.", - "DlcWindowHeading": "{0} Downloadable Content(s) available for {1} ({2})", - "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} new update(s) added", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "{0} Mod(lar)", - "UserProfilesEditProfile": "Seçiliyi Düzenle", - "Continue": "Continue", - "Cancel": "İptal", - "Save": "Kaydet", - "Discard": "Iskarta", - "Paused": "Durduruldu", - "UserProfilesSetProfileImage": "Profil Resmi Ayarla", - "UserProfileEmptyNameError": "İsim gerekli", - "UserProfileNoImageError": "Profil resmi ayarlanmalıdır", - "GameUpdateWindowHeading": "{0} için güncellemeler mevcut [{1}]", - "SettingsTabHotkeysResScaleUpHotkey": "Çözünürlüğü artır:", - "SettingsTabHotkeysResScaleDownHotkey": "Çözünürlüğü azalt:", - "UserProfilesName": "İsim:", - "UserProfilesUserId": "Kullanıcı Adı:", - "SettingsTabGraphicsBackend": "Grafik Arka Ucu", - "SettingsTabGraphicsBackendTooltip": "Select the graphics backend that will be used in the emulator.\n\nVulkan is overall better for all modern graphics cards, as long as their drivers are up to date. Vulkan also features faster shader compilation (less stuttering) on all GPU vendors.\n\nOpenGL may achieve better results on old Nvidia GPUs, on old AMD GPUs on Linux, or on GPUs with lower VRAM, though shader compilation stutters will be greater.\n\nSet to Vulkan if unsure. Set to OpenGL if your GPU does not support Vulkan even with the latest graphics drivers.", - "SettingsEnableTextureRecompression": "Yeniden Doku Sıkıştırılmasını Aktif Et", - "SettingsEnableTextureRecompressionTooltip": "Compresses ASTC textures in order to reduce VRAM usage.\n\nGames using this texture format include Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder and The Legend of Zelda: Tears of the Kingdom.\n\nGraphics cards with 4GiB VRAM or less will likely crash at some point while running these games.\n\nEnable only if you're running out of VRAM on the aforementioned games. Leave OFF if unsure.", - "SettingsTabGraphicsPreferredGpu": "Kullanılan GPU", - "SettingsTabGraphicsPreferredGpuTooltip": "Vulkan Grafik Arka Ucu ile kullanılacak Ekran Kartını Seçin.\n\nOpenGL'nin kullanacağı GPU'yu etkilemez.\n\n Emin değilseniz \"dGPU\" olarak işaretlenmiş GPU'ya ayarlayın. Eğer yoksa, dokunmadan bırakın.\n", - "SettingsAppRequiredRestartMessage": "Ryujinx'i Yeniden Başlatma Gerekli", - "SettingsGpuBackendRestartMessage": "Grafik Motoru ya da GPU ayarları değiştirildi. Bu işlemin uygulanması için yeniden başlatma gerekli.", - "SettingsGpuBackendRestartSubMessage": "Şimdi yeniden başlatmak istiyor musunuz?", - "RyujinxUpdaterMessage": "Ryujinx'i en son sürüme güncellemek ister misiniz?", - "SettingsTabHotkeysVolumeUpHotkey": "Sesi Arttır:", - "SettingsTabHotkeysVolumeDownHotkey": "Sesi Azalt:", - "SettingsEnableMacroHLE": "Macro HLE'yi Aktifleştir", - "SettingsEnableMacroHLETooltip": "GPU Macro kodunun yüksek seviye emülasyonu.\n\nPerformansı arttırır, ama bazı oyunlarda grafik hatalarına yol açabilir.\n\nEmin değilseniz AÇIK bırakın.", - "SettingsEnableColorSpacePassthrough": "Renk Alanı Geçişi", - "SettingsEnableColorSpacePassthroughTooltip": "Vulkan Backend'ini renk alanı belirtmeden renk bilgisinden geçmeye yönlendirir. Geniş gam ekranlı kullanıcılar için bu, renk doğruluğu pahasına daha canlı renklerle sonuçlanabilir.", - "VolumeShort": "Ses", - "UserProfilesManageSaves": "Kayıtları Yönet", - "DeleteUserSave": "Bu oyun için kullanıcı kaydını silmek istiyor musunuz?", - "IrreversibleActionNote": "Bu eylem geri alınamaz.", - "SaveManagerHeading": "{0} için Kayıt Dosyalarını Yönet", - "SaveManagerTitle": "Kayıt Yöneticisi", - "Name": "İsim", - "Size": "Boyut", - "Search": "Ara", - "UserProfilesRecoverLostAccounts": "Kayıp Hesapları Kurtar", - "Recover": "Kurtar", - "UserProfilesRecoverHeading": "Aşağıdaki hesaplar için kayıtlar bulundu", - "UserProfilesRecoverEmptyList": "Kurtarılacak profil bulunamadı", - "GraphicsAATooltip": "Applies anti-aliasing to the game render.\n\nFXAA will blur most of the image, while SMAA will attempt to find jagged edges and smooth them out.\n\nNot recommended to use in conjunction with the FSR scaling filter.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on NONE if unsure.", - "GraphicsAALabel": "Kenar Yumuşatma:", - "GraphicsScalingFilterLabel": "Ölçekleme Filtresi:", - "GraphicsScalingFilterTooltip": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", - "GraphicsScalingFilterBilinear": "Bilinear", - "GraphicsScalingFilterNearest": "Nearest", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "Seviye", - "GraphicsScalingFilterLevelTooltip": "Set FSR 1.0 sharpening level. Higher is sharper.", - "SmaaLow": "Düşük SMAA", - "SmaaMedium": "Orta SMAA", - "SmaaHigh": "Yüksek SMAA", - "SmaaUltra": "En Yüksek SMAA", - "UserEditorTitle": "Kullanıcıyı Düzenle", - "UserEditorTitleCreate": "Kullanıcı Oluştur", - "SettingsTabNetworkInterface": "Ağ Bağlantısı:", - "NetworkInterfaceTooltip": "The network interface used for LAN/LDN features.\n\nIn conjunction with a VPN or XLink Kai and a game with LAN support, can be used to spoof a same-network connection over the Internet.\n\nLeave on DEFAULT if unsure.", - "NetworkInterfaceDefault": "Varsayılan", - "PackagingShaders": "Gölgeler Paketleniyor", - "AboutChangelogButton": "GitHub'da Değişiklikleri Görüntüle", - "AboutChangelogButtonTooltipMessage": "Kullandığınız versiyon için olan değişiklikleri varsayılan tarayıcınızda görmek için tıklayın", - "SettingsTabNetworkMultiplayer": "Çok Oyunculu", - "MultiplayerMode": "Mod:", - "MultiplayerModeTooltip": "Change LDN multiplayer mode.\n\nLdnMitm will modify local wireless/local play functionality in games to function as if it were LAN, allowing for local, same-network connections with other Ryujinx instances and hacked Nintendo Switch consoles that have the ldn_mitm module installed.\n\nMultiplayer requires all players to be on the same game version (i.e. Super Smash Bros. Ultimate v13.0.1 can't connect to v13.0.0).\n\nLeave DISABLED if unsure.", - "MultiplayerModeDisabled": "Devre Dışı", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/uk_UA.json b/src/Ryujinx/Assets/Locales/uk_UA.json deleted file mode 100644 index 89e565bf3..000000000 --- a/src/Ryujinx/Assets/Locales/uk_UA.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "Українська", - "MenuBarFileOpenApplet": "Відкрити аплет", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "Відкрити аплет Mii Editor в автономному режимі", - "SettingsTabInputDirectMouseAccess": "Прямий доступ мишею", - "SettingsTabSystemMemoryManagerMode": "Режим диспетчера пам’яті:", - "SettingsTabSystemMemoryManagerModeSoftware": "Програмне забезпечення", - "SettingsTabSystemMemoryManagerModeHost": "Хост (швидко)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "Неперевірений хост (найшвидший, небезпечний)", - "SettingsTabSystemUseHypervisor": "Використовувати гіпервізор", - "MenuBarFile": "_Файл", - "MenuBarFileOpenFromFile": "_Завантажити програму з файлу", - "MenuBarFileOpenFromFileError": "No applications found in selected file.", - "MenuBarFileOpenUnpacked": "Завантажити _розпаковану гру", - "MenuBarFileLoadDlcFromFolder": "Load DLC From Folder", - "MenuBarFileLoadTitleUpdatesFromFolder": "Load Title Updates From Folder", - "MenuBarFileOpenEmuFolder": "Відкрити теку Ryujinx", - "MenuBarFileOpenLogsFolder": "Відкрити теку журналів змін", - "MenuBarFileExit": "_Вихід", - "MenuBarOptions": "_Параметри", - "MenuBarOptionsToggleFullscreen": "На весь екран", - "MenuBarOptionsStartGamesInFullscreen": "Запускати ігри на весь екран", - "MenuBarOptionsStopEmulation": "Зупинити емуляцію", - "MenuBarOptionsSettings": "_Налаштування", - "MenuBarOptionsManageUserProfiles": "_Керувати профілями користувачів", - "MenuBarActions": "_Дії", - "MenuBarOptionsSimulateWakeUpMessage": "Симулювати повідомлення про пробудження", - "MenuBarActionsScanAmiibo": "Сканувати Amiibo", - "MenuBarTools": "_Інструменти", - "MenuBarToolsInstallFirmware": "Установити прошивку", - "MenuBarFileToolsInstallFirmwareFromFile": "Установити прошивку з XCI або ZIP", - "MenuBarFileToolsInstallFirmwareFromDirectory": "Установити прошивку з теки", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "Керувати типами файлів", - "MenuBarToolsInstallFileTypes": "Установити типи файлів", - "MenuBarToolsUninstallFileTypes": "Видалити типи файлів", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "_View", - "MenuBarViewWindow": "Window Size", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "_Допомога", - "MenuBarHelpCheckForUpdates": "Перевірити оновлення", - "MenuBarHelpAbout": "Про застосунок", - "MenuSearch": "Пошук...", - "GameListHeaderFavorite": "Обране", - "GameListHeaderIcon": "Значок", - "GameListHeaderApplication": "Назва", - "GameListHeaderDeveloper": "Розробник", - "GameListHeaderVersion": "Версія", - "GameListHeaderTimePlayed": "Зіграно часу", - "GameListHeaderLastPlayed": "Востаннє зіграно", - "GameListHeaderFileExtension": "Розширення файлу", - "GameListHeaderFileSize": "Розмір файлу", - "GameListHeaderPath": "Шлях", - "GameListContextMenuOpenUserSaveDirectory": "Відкрити теку збереження користувача", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "Відкриває каталог, який містить збереження користувача програми", - "GameListContextMenuOpenDeviceSaveDirectory": "Відкрити каталог пристроїв користувача", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "Відкриває каталог, який містить збереження пристрою програми", - "GameListContextMenuOpenBcatSaveDirectory": "Відкрити каталог користувача BCAT", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "Відкриває каталог, який містить BCAT-збереження програми", - "GameListContextMenuManageTitleUpdates": "Керування оновленнями заголовків", - "GameListContextMenuManageTitleUpdatesToolTip": "Відкриває вікно керування оновленням заголовка", - "GameListContextMenuManageDlc": "Керування DLC", - "GameListContextMenuManageDlcToolTip": "Відкриває вікно керування DLC", - "GameListContextMenuCacheManagement": "Керування кешем", - "GameListContextMenuCacheManagementPurgePptc": "Очистити кеш PPTC", - "GameListContextMenuCacheManagementPurgePptcToolTip": "Видаляє кеш PPTC програми", - "GameListContextMenuCacheManagementPurgeShaderCache": "Очистити кеш шейдерів", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "Видаляє кеш шейдерів програми", - "GameListContextMenuCacheManagementOpenPptcDirectory": "Відкрити каталог PPTC", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "Відкриває каталог, який містить кеш PPTC програми", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "Відкрити каталог кешу шейдерів", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "Відкриває каталог, який містить кеш шейдерів програми", - "GameListContextMenuExtractData": "Видобути дані", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "Видобуває розділ ExeFS із поточної конфігурації програми (включаючи оновлення)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "Видобуває розділ RomFS із поточної конфігурації програми (включаючи оновлення)", - "GameListContextMenuExtractDataLogo": "Логотип", - "GameListContextMenuExtractDataLogoToolTip": "Видобуває розділ логотипу з поточної конфігурації програми (включаючи оновлення)", - "GameListContextMenuCreateShortcut": "Створити ярлик застосунку", - "GameListContextMenuCreateShortcutToolTip": "Створити ярлик на робочому столі, який запускає вибраний застосунок", - "GameListContextMenuCreateShortcutToolTipMacOS": "Створити ярлик у каталозі macOS програм, що запускає обраний Додаток", - "GameListContextMenuOpenModsDirectory": "Відкрити теку з модами", - "GameListContextMenuOpenModsDirectoryToolTip": "Відкриває каталог, який містить модифікації Додатків", - "GameListContextMenuOpenSdModsDirectory": "Відкрити каталог модифікацій Atmosphere", - "GameListContextMenuOpenSdModsDirectoryToolTip": "Відкриває альтернативний каталог SD-карти Atmosphere, що містить модифікації Додатків. Корисно для модифікацій, зроблених для реального обладнання.", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} ігор завантажено", - "StatusBarSystemVersion": "Версія системи: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "Виявлено низьку межу для відображення памʼяті", - "LinuxVmMaxMapCountDialogTextPrimary": "Бажаєте збільшити значення vm.max_map_count на {0}", - "LinuxVmMaxMapCountDialogTextSecondary": "Деякі ігри можуть спробувати створити більше відображень памʼяті, ніж дозволено наразі. Ryujinx завершить роботу, щойно цей ліміт буде перевищено.", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "Так, до наст. перезапуску", - "LinuxVmMaxMapCountDialogButtonPersistent": "Так, назавжди", - "LinuxVmMaxMapCountWarningTextPrimary": "Максимальна кількість відображення памʼяті менша, ніж рекомендовано.", - "LinuxVmMaxMapCountWarningTextSecondary": "Поточне значення vm.max_map_count ({0}) менше за {1}. Деякі ігри можуть спробувати створити більше відображень пам’яті, ніж дозволено наразі. Ryujinx завершить роботу, щойно цей ліміт буде перевищено.\n\nВи можете збільшити ліміт вручну або встановити pkexec, який дозволяє Ryujinx допомогти з цим.", - "Settings": "Налаштування", - "SettingsTabGeneral": "Інтерфейс користувача", - "SettingsTabGeneralGeneral": "Загальні", - "SettingsTabGeneralEnableDiscordRichPresence": "Увімкнути розширену присутність Discord", - "SettingsTabGeneralCheckUpdatesOnLaunch": "Перевіряти наявність оновлень під час запуску", - "SettingsTabGeneralShowConfirmExitDialog": "Показати діалогове вікно «Підтвердити вихід».", - "SettingsTabGeneralRememberWindowState": "Remember Window Size/Position", - "SettingsTabGeneralShowTitleBar": "Show Title Bar (Requires restart)", - "SettingsTabGeneralHideCursor": "Сховати вказівник:", - "SettingsTabGeneralHideCursorNever": "Ніколи", - "SettingsTabGeneralHideCursorOnIdle": "Сховати у режимі очікування", - "SettingsTabGeneralHideCursorAlways": "Завжди", - "SettingsTabGeneralGameDirectories": "Тека ігор", - "SettingsTabGeneralAutoloadDirectories": "Autoload DLC/Updates Directories", - "SettingsTabGeneralAutoloadNote": "DLC and Updates which refer to missing files will be unloaded automatically", - "SettingsTabGeneralAdd": "Додати", - "SettingsTabGeneralRemove": "Видалити", - "SettingsTabSystem": "Система", - "SettingsTabSystemCore": "Ядро", - "SettingsTabSystemSystemRegion": "Регіон системи:", - "SettingsTabSystemSystemRegionJapan": "Японія", - "SettingsTabSystemSystemRegionUSA": "США", - "SettingsTabSystemSystemRegionEurope": "Європа", - "SettingsTabSystemSystemRegionAustralia": "Австралія", - "SettingsTabSystemSystemRegionChina": "Китай", - "SettingsTabSystemSystemRegionKorea": "Корея", - "SettingsTabSystemSystemRegionTaiwan": "Тайвань", - "SettingsTabSystemSystemLanguage": "Мова системи:", - "SettingsTabSystemSystemLanguageJapanese": "Японська", - "SettingsTabSystemSystemLanguageAmericanEnglish": "Англійська (США)", - "SettingsTabSystemSystemLanguageFrench": "Французька", - "SettingsTabSystemSystemLanguageGerman": "Німецька", - "SettingsTabSystemSystemLanguageItalian": "Італійська", - "SettingsTabSystemSystemLanguageSpanish": "Іспанська", - "SettingsTabSystemSystemLanguageChinese": "Китайська", - "SettingsTabSystemSystemLanguageKorean": "Корейська", - "SettingsTabSystemSystemLanguageDutch": "Нідерландська", - "SettingsTabSystemSystemLanguagePortuguese": "Португальська", - "SettingsTabSystemSystemLanguageRussian": "Російська", - "SettingsTabSystemSystemLanguageTaiwanese": "Тайванська", - "SettingsTabSystemSystemLanguageBritishEnglish": "Англійська (Великобританія)", - "SettingsTabSystemSystemLanguageCanadianFrench": "Французька (Канада)", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "Іспанська (Латиноамериканська)", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "Спрощена китайська", - "SettingsTabSystemSystemLanguageTraditionalChinese": "Традиційна китайська", - "SettingsTabSystemSystemTimeZone": "Часовий пояс системи:", - "SettingsTabSystemSystemTime": "Час системи:", - "SettingsTabSystemEnableVsync": "Вертикальна синхронізація", - "SettingsTabSystemEnablePptc": "PPTC (профільований постійний кеш перекладу)", - "SettingsTabSystemEnableLowPowerPptc": "Low-power PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "Перевірка цілісності FS", - "SettingsTabSystemAudioBackend": "Аудіосистема:", - "SettingsTabSystemAudioBackendDummy": "Dummy", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "Хитрощі", - "SettingsTabSystemHacksNote": " (може викликати нестабільність)", - "SettingsTabSystemDramSize": "Використовувати альтернативне розташування пам'яті (розробники)", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "Ігнорувати відсутні служби", - "SettingsTabSystemIgnoreApplet": "Ігнорувати Аплет", - "SettingsTabGraphics": "Графіка", - "SettingsTabGraphicsAPI": "Графічний API", - "SettingsTabGraphicsEnableShaderCache": "Увімкнути кеш шейдерів", - "SettingsTabGraphicsAnisotropicFiltering": "Анізотропна фільтрація:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "Авто", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "Роздільна здатність:", - "SettingsTabGraphicsResolutionScaleCustom": "Користувацька (не рекомендовано)", - "SettingsTabGraphicsResolutionScaleNative": "Стандартний (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2x (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3x (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4x (2880p/4320p) (Не рекомендується)", - "SettingsTabGraphicsAspectRatio": "Співвідношення сторін:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "Розтягнути до розміру вікна", - "SettingsTabGraphicsDeveloperOptions": "Параметри розробника", - "SettingsTabGraphicsShaderDumpPath": "Шлях скидання графічного шейдера:", - "SettingsTabLogging": "Налагодження", - "SettingsTabLoggingLogging": "Налагодження", - "SettingsTabLoggingEnableLoggingToFile": "Увімкнути налагодження у файл", - "SettingsTabLoggingEnableStubLogs": "Увімкнути журнали заглушки", - "SettingsTabLoggingEnableInfoLogs": "Увімкнути інформаційні журнали", - "SettingsTabLoggingEnableWarningLogs": "Увімкнути журнали попереджень", - "SettingsTabLoggingEnableErrorLogs": "Увімкнути журнали помилок", - "SettingsTabLoggingEnableTraceLogs": "Увімкнути журнали трасування", - "SettingsTabLoggingEnableGuestLogs": "Увімкнути журнали гостей", - "SettingsTabLoggingEnableFsAccessLogs": "Увімкнути журнали доступу Fs", - "SettingsTabLoggingFsGlobalAccessLogMode": "Режим журналу глобального доступу Fs:", - "SettingsTabLoggingDeveloperOptions": "Параметри розробника (УВАГА: знизиться продуктивність)", - "SettingsTabLoggingDeveloperOptionsNote": "УВАГА: Знижує продуктивність", - "SettingsTabLoggingGraphicsBackendLogLevel": "Рівень журналу графічного сервера:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "Немає", - "SettingsTabLoggingGraphicsBackendLogLevelError": "Помилка", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "Уповільнення", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "Все", - "SettingsTabLoggingEnableDebugLogs": "Увімкнути журнали налагодження", - "SettingsTabInput": "Введення", - "SettingsTabInputEnableDockedMode": "Режим док-станції", - "SettingsTabInputDirectKeyboardAccess": "Прямий доступ з клавіатури", - "SettingsButtonSave": "Зберегти", - "SettingsButtonClose": "Закрити", - "SettingsButtonOk": "Гаразд", - "SettingsButtonCancel": "Скасувати", - "SettingsButtonApply": "Застосувати", - "ControllerSettingsPlayer": "Гравець", - "ControllerSettingsPlayer1": "Гравець 1", - "ControllerSettingsPlayer2": "Гравець 2", - "ControllerSettingsPlayer3": "Гравець 3", - "ControllerSettingsPlayer4": "Гравець 4", - "ControllerSettingsPlayer5": "Гравець 5", - "ControllerSettingsPlayer6": "Гравець 6", - "ControllerSettingsPlayer7": "Гравець 7", - "ControllerSettingsPlayer8": "Гравець 8", - "ControllerSettingsHandheld": "Портативний", - "ControllerSettingsInputDevice": "Пристрій введення", - "ControllerSettingsRefresh": "Оновити", - "ControllerSettingsDeviceDisabled": "Вимкнено", - "ControllerSettingsControllerType": "Тип контролера", - "ControllerSettingsControllerTypeHandheld": "Портативний", - "ControllerSettingsControllerTypeProController": "Контролер Pro", - "ControllerSettingsControllerTypeJoyConPair": "Обидва JoyCon", - "ControllerSettingsControllerTypeJoyConLeft": "Лівий JoyCon", - "ControllerSettingsControllerTypeJoyConRight": "Правий JoyCon", - "ControllerSettingsProfile": "Профіль", - "ControllerSettingsProfileDefault": "Типовий", - "ControllerSettingsLoad": "Завантажити", - "ControllerSettingsAdd": "Додати", - "ControllerSettingsRemove": "Видалити", - "ControllerSettingsButtons": "Кнопки", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "Панель направлення", - "ControllerSettingsDPadUp": "Вгору", - "ControllerSettingsDPadDown": "Вниз", - "ControllerSettingsDPadLeft": "Вліво", - "ControllerSettingsDPadRight": "Вправо", - "ControllerSettingsStickButton": "Кнопка", - "ControllerSettingsStickUp": "Уверх", - "ControllerSettingsStickDown": "Униз", - "ControllerSettingsStickLeft": "Ліворуч", - "ControllerSettingsStickRight": "Праворуч", - "ControllerSettingsStickStick": "Стик", - "ControllerSettingsStickInvertXAxis": "Обернути вісь стику X", - "ControllerSettingsStickInvertYAxis": "Обернути вісь стику Y", - "ControllerSettingsStickDeadzone": "Мертва зона:", - "ControllerSettingsLStick": "Лівий джойстик", - "ControllerSettingsRStick": "Правий джойстик", - "ControllerSettingsTriggersLeft": "Тригери ліворуч", - "ControllerSettingsTriggersRight": "Тригери праворуч", - "ControllerSettingsTriggersButtonsLeft": "Кнопки тригерів ліворуч", - "ControllerSettingsTriggersButtonsRight": "Кнопки тригерів праворуч", - "ControllerSettingsTriggers": "Тригери", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "Кнопки ліворуч", - "ControllerSettingsExtraButtonsRight": "Кнопки праворуч", - "ControllerSettingsMisc": "Різне", - "ControllerSettingsTriggerThreshold": "Поріг спрацьовування:", - "ControllerSettingsMotion": "Рух", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "Використовувати рух, сумісний з CemuHook", - "ControllerSettingsMotionControllerSlot": "Слот контролера:", - "ControllerSettingsMotionMirrorInput": "Дзеркальний вхід", - "ControllerSettingsMotionRightJoyConSlot": "Правий слот JoyCon:", - "ControllerSettingsMotionServerHost": "Хост сервера:", - "ControllerSettingsMotionGyroSensitivity": "Чутливість гіроскопа:", - "ControllerSettingsMotionGyroDeadzone": "Мертва зона гіроскопа:", - "ControllerSettingsSave": "Зберегти", - "ControllerSettingsClose": "Закрити", - "KeyUnknown": "Unknown", - "KeyShiftLeft": "Shift Left", - "KeyShiftRight": "Shift Right", - "KeyControlLeft": "Ctrl Left", - "KeyMacControlLeft": "⌃ Left", - "KeyControlRight": "Ctrl Right", - "KeyMacControlRight": "⌃ Right", - "KeyAltLeft": "Alt Left", - "KeyMacAltLeft": "⌥ Left", - "KeyAltRight": "Alt Right", - "KeyMacAltRight": "⌥ Right", - "KeyWinLeft": "⊞ Left", - "KeyMacWinLeft": "⌘ Left", - "KeyWinRight": "⊞ Right", - "KeyMacWinRight": "⌘ Right", - "KeyMenu": "Menu", - "KeyUp": "Up", - "KeyDown": "Down", - "KeyLeft": "Left", - "KeyRight": "Right", - "KeyEnter": "Enter", - "KeyEscape": "Escape", - "KeySpace": "Space", - "KeyTab": "Tab", - "KeyBackSpace": "Backspace", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "Clear", - "KeyKeypad0": "Keypad 0", - "KeyKeypad1": "Keypad 1", - "KeyKeypad2": "Keypad 2", - "KeyKeypad3": "Keypad 3", - "KeyKeypad4": "Keypad 4", - "KeyKeypad5": "Keypad 5", - "KeyKeypad6": "Keypad 6", - "KeyKeypad7": "Keypad 7", - "KeyKeypad8": "Keypad 8", - "KeyKeypad9": "Keypad 9", - "KeyKeypadDivide": "Keypad Divide", - "KeyKeypadMultiply": "Keypad Multiply", - "KeyKeypadSubtract": "Keypad Subtract", - "KeyKeypadAdd": "Keypad Add", - "KeyKeypadDecimal": "Keypad Decimal", - "KeyKeypadEnter": "Keypad Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "Unbound", - "GamepadLeftStick": "L Stick Button", - "GamepadRightStick": "R Stick Button", - "GamepadLeftShoulder": "Left Shoulder", - "GamepadRightShoulder": "Right Shoulder", - "GamepadLeftTrigger": "Left Trigger", - "GamepadRightTrigger": "Right Trigger", - "GamepadDpadUp": "Up", - "GamepadDpadDown": "Down", - "GamepadDpadLeft": "Left", - "GamepadDpadRight": "Right", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "Guide", - "GamepadMisc1": "Misc", - "GamepadPaddle1": "Paddle 1", - "GamepadPaddle2": "Paddle 2", - "GamepadPaddle3": "Paddle 3", - "GamepadPaddle4": "Paddle 4", - "GamepadTouchpad": "Touchpad", - "GamepadSingleLeftTrigger0": "Left Trigger 0", - "GamepadSingleRightTrigger0": "Right Trigger 0", - "GamepadSingleLeftTrigger1": "Left Trigger 1", - "GamepadSingleRightTrigger1": "Right Trigger 1", - "StickLeft": "Left Stick", - "StickRight": "Right Stick", - "UserProfilesSelectedUserProfile": "Вибраний профіль користувача:", - "UserProfilesSaveProfileName": "Зберегти ім'я профілю", - "UserProfilesChangeProfileImage": "Змінити зображення профілю", - "UserProfilesAvailableUserProfiles": "Доступні профілі користувачів:", - "UserProfilesAddNewProfile": "Створити профіль", - "UserProfilesDelete": "Видалити", - "UserProfilesClose": "Закрити", - "ProfileNameSelectionWatermark": "Оберіть псевдонім", - "ProfileImageSelectionTitle": "Вибір зображення профілю", - "ProfileImageSelectionHeader": "Виберіть зображення профілю", - "ProfileImageSelectionNote": "Ви можете імпортувати власне зображення профілю або вибрати аватар із мікропрограми системи", - "ProfileImageSelectionImportImage": "Імпорт файлу зображення", - "ProfileImageSelectionSelectAvatar": "Виберіть аватар прошивки ", - "InputDialogTitle": "Діалог введення", - "InputDialogOk": "Гаразд", - "InputDialogCancel": "Скасувати", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "Виберіть ім'я профілю", - "InputDialogAddNewProfileHeader": "Будь ласка, введіть ім'я профілю", - "InputDialogAddNewProfileSubtext": "(Макс. довжина: {0})", - "AvatarChoose": "Вибрати", - "AvatarSetBackgroundColor": "Встановити колір фону", - "AvatarClose": "Закрити", - "ControllerSettingsLoadProfileToolTip": "Завантажити профіль", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "Додати профіль", - "ControllerSettingsRemoveProfileToolTip": "Видалити профіль", - "ControllerSettingsSaveProfileToolTip": "Зберегти профіль", - "MenuBarFileToolsTakeScreenshot": "Зробити знімок екрана", - "MenuBarFileToolsHideUi": "Сховати інтерфейс", - "GameListContextMenuRunApplication": "Запустити додаток", - "GameListContextMenuToggleFavorite": "Перемкнути вибране", - "GameListContextMenuToggleFavoriteToolTip": "Перемкнути улюблений статус гри", - "SettingsTabGeneralTheme": "Тема:", - "SettingsTabGeneralThemeAuto": "Auto", - "SettingsTabGeneralThemeDark": "Темна", - "SettingsTabGeneralThemeLight": "Світла", - "ControllerSettingsConfigureGeneral": "Налаштування", - "ControllerSettingsRumble": "Вібрація", - "ControllerSettingsRumbleStrongMultiplier": "Множник сильної вібрації", - "ControllerSettingsRumbleWeakMultiplier": "Множник слабкої вібрації", - "DialogMessageSaveNotAvailableMessage": "Немає збережених даних для {0} [{1:x16}]", - "DialogMessageSaveNotAvailableCreateSaveMessage": "Хочете створити дані збереження для цієї гри?", - "DialogConfirmationTitle": "Ryujinx - Підтвердження", - "DialogUpdaterTitle": "Ryujinx - Програма оновлення", - "DialogErrorTitle": "Ryujinx - Помилка", - "DialogWarningTitle": "Ryujinx - Попередження", - "DialogExitTitle": "Ryujinx - Вихід", - "DialogErrorMessage": "У Ryujinx сталася помилка", - "DialogExitMessage": "Ви впевнені, що бажаєте закрити Ryujinx?", - "DialogExitSubMessage": "Усі незбережені дані буде втрачено!", - "DialogMessageCreateSaveErrorMessage": "Під час створення вказаних даних збереження сталася помилка: {0}", - "DialogMessageFindSaveErrorMessage": "Під час пошуку вказаних даних збереження сталася помилка: {0}", - "FolderDialogExtractTitle": "Виберіть папку для видобування", - "DialogNcaExtractionMessage": "Видобування розділу {0} з {1}...", - "DialogNcaExtractionTitle": "Екстрактор розділів NCA", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "Помилка видобування. Основний NCA не був присутній у вибраному файлі.", - "DialogNcaExtractionCheckLogErrorMessage": "Помилка видобування. Прочитайте файл журналу для отримання додаткової інформації.", - "DialogNcaExtractionSuccessMessage": "Видобування успішно завершено.", - "DialogUpdaterConvertFailedMessage": "Не вдалося конвертувати поточну версію Ryujinx.", - "DialogUpdaterCancelUpdateMessage": "Скасування оновлення!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "Ви вже використовуєте останню версію Ryujinx!", - "DialogUpdaterFailedToGetVersionMessage": "Під час спроби отримати інформацію про випуск із GitHub Release сталася помилка. Це може бути спричинено, якщо новий випуск компілюється GitHub Actions. Повторіть спробу через кілька хвилин.", - "DialogUpdaterConvertFailedGithubMessage": "Не вдалося конвертувати отриману версію Ryujinx із випуску Github.", - "DialogUpdaterDownloadingMessage": "Завантаження оновлення...", - "DialogUpdaterExtractionMessage": "Видобування оновлення...", - "DialogUpdaterRenamingMessage": "Перейменування оновлення...", - "DialogUpdaterAddingFilesMessage": "Додавання нового оновлення...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "Оновлення завершено!", - "DialogUpdaterRestartMessage": "Перезапустити Ryujinx зараз?", - "DialogUpdaterNoInternetMessage": "Ви не підключені до Інтернету!", - "DialogUpdaterNoInternetSubMessage": "Будь ласка, переконайтеся, що у вас є робоче підключення до Інтернету!", - "DialogUpdaterDirtyBuildMessage": "Ви не можете оновити брудну збірку Ryujinx!", - "DialogUpdaterDirtyBuildSubMessage": "Будь ласка, завантажте Ryujinx на https://ryujinx.app/download, якщо ви шукаєте підтримувану версію.", - "DialogRestartRequiredMessage": "Потрібен перезапуск", - "DialogThemeRestartMessage": "Тему збережено. Щоб застосувати тему, потрібен перезапуск.", - "DialogThemeRestartSubMessage": "Ви хочете перезапустити", - "DialogFirmwareInstallEmbeddedMessage": "Бажаєте встановити прошивку, вбудовану в цю гру? (Прошивка {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "Встановлену прошивку не знайдено, але Ryujinx вдалося встановити прошивку {0} з наданої гри.\nТепер запуститься емулятор.", - "DialogFirmwareNoFirmwareInstalledMessage": "Прошивка не встановлена", - "DialogFirmwareInstalledMessage": "Встановлено прошивку {0}", - "DialogInstallFileTypesSuccessMessage": "Успішно встановлено типи файлів!", - "DialogInstallFileTypesErrorMessage": "Не вдалося встановити типи файлів.", - "DialogUninstallFileTypesSuccessMessage": "Успішно видалено типи файлів!", - "DialogUninstallFileTypesErrorMessage": "Не вдалося видалити типи файлів.", - "DialogOpenSettingsWindowLabel": "Відкрити вікно налаштувань", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "Аплет контролера", - "DialogMessageDialogErrorExceptionMessage": "Помилка показу діалогового вікна повідомлення: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "Помилка показу програмної клавіатури: {0}", - "DialogErrorAppletErrorExceptionMessage": "Помилка показу діалогового вікна ErrorApplet: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\nДля отримання додаткової інформації про те, як виправити цю помилку, дотримуйтесь нашого посібника з налаштування.", - "DialogUserErrorDialogTitle": "Помилка Ryujinx ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "Під час отримання інформації з API сталася помилка.", - "DialogAmiiboApiConnectErrorMessage": "Неможливо підключитися до сервера Amiibo API. Можливо, служба не працює або вам потрібно перевірити, чи є підключення до Інтернету.", - "DialogProfileInvalidProfileErrorMessage": "Профіль {0} несумісний із поточною системою конфігурації вводу.", - "DialogProfileDefaultProfileOverwriteErrorMessage": "Стандартний профіль не можна перезаписати", - "DialogProfileDeleteProfileTitle": "Видалення профілю", - "DialogProfileDeleteProfileMessage": "Цю дію неможливо скасувати. Ви впевнені, що бажаєте продовжити?", - "DialogWarning": "Увага", - "DialogPPTCDeletionMessage": "Ви збираєтеся видалити кеш PPTC для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?", - "DialogPPTCDeletionErrorMessage": "Помилка очищення кешу PPTC на {0}: {1}", - "DialogShaderDeletionMessage": "Ви збираєтеся видалити кеш шейдерів для:\n\n{0}\n\nВи впевнені, що бажаєте продовжити?", - "DialogShaderDeletionErrorMessage": "Помилка очищення кешу шейдерів на {0}: {1}", - "DialogRyujinxErrorMessage": "У Ryujinx сталася помилка", - "DialogInvalidTitleIdErrorMessage": "Помилка інтерфейсу: вибрана гра не мала дійсного ідентифікатора назви", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "Дійсна прошивка системи не знайдена в {0}.", - "DialogFirmwareInstallerFirmwareInstallTitle": "Встановити прошивку {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "Буде встановлено версію системи {0}.", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\nЦе замінить поточну версію системи {0}.", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nВи хочете продовжити?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Встановлення прошивки...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "Версію системи {0} успішно встановлено.", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "Якщо вибраний профіль буде видалено, інші профілі не відкриватимуться", - "DialogUserProfileDeletionConfirmMessage": "Ви хочете видалити вибраний профіль", - "DialogUserProfileUnsavedChangesTitle": "Увага — Незбережені зміни", - "DialogUserProfileUnsavedChangesMessage": "Ви зробили зміни у цьому профілю користувача які не було збережено.", - "DialogUserProfileUnsavedChangesSubMessage": "Бажаєте скасувати зміни?", - "DialogControllerSettingsModifiedConfirmMessage": "Поточні налаштування контролера оновлено.", - "DialogControllerSettingsModifiedConfirmSubMessage": "Ви хочете зберегти?", - "DialogLoadFileErrorMessage": "{0}. Файл з помилкою: {1}", - "DialogModAlreadyExistsMessage": "Модифікація вже існує", - "DialogModInvalidMessage": "Вказаний каталог не містить модифікації!", - "DialogModDeleteNoParentMessage": "Не видалено: Не знайдено батьківський каталог для модифікації \"{0}\"!", - "DialogDlcNoDlcErrorMessage": "Зазначений файл не містить DLC для вибраного заголовку!", - "DialogPerformanceCheckLoggingEnabledMessage": "Ви увімкнули журнал налагодження, призначений лише для розробників.", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "Для оптимальної продуктивності рекомендується вимкнути ведення журналу налагодження. Ви хочете вимкнути ведення журналу налагодження зараз?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "Ви увімкнули скидання шейдерів, призначений лише для розробників.", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "Для оптимальної продуктивності рекомендується вимкнути скидання шейдерів. Ви хочете вимкнути скидання шейдерів зараз?", - "DialogLoadAppGameAlreadyLoadedMessage": "Гру вже завантажено", - "DialogLoadAppGameAlreadyLoadedSubMessage": "Зупиніть емуляцію або закрийте емулятор перед запуском іншої гри.", - "DialogUpdateAddUpdateErrorMessage": "Зазначений файл не містить оновлення для вибраного заголовка!", - "DialogSettingsBackendThreadingWarningTitle": "Попередження - потокове керування сервером", - "DialogSettingsBackendThreadingWarningMessage": "Ryujinx потрібно перезапустити після зміни цього параметра, щоб він застосовувався повністю. Залежно від вашої платформи вам може знадобитися вручну вимкнути власну багатопотоковість драйвера під час використання Ryujinx.", - "DialogModManagerDeletionWarningMessage": "Ви збираєтесь видалити модифікацію: {0}\n\nВи дійсно бажаєте продовжити?", - "DialogModManagerDeletionAllWarningMessage": "Ви збираєтесь видалити всі модифікації для цього Додатка.\n\nВи дійсно бажаєте продовжити?", - "SettingsTabGraphicsFeaturesOptions": "Особливості", - "SettingsTabGraphicsBackendMultithreading": "Багатопотоковість графічного сервера:", - "CommonAuto": "Авто", - "CommonOff": "Вимкнути", - "CommonOn": "Увімкнути", - "InputDialogYes": "Так", - "InputDialogNo": "Ні", - "DialogProfileInvalidProfileNameErrorMessage": "Ім'я файлу містить неприпустимі символи. Будь ласка, спробуйте ще раз.", - "MenuBarOptionsPauseEmulation": "Пауза", - "MenuBarOptionsResumeEmulation": "Продовжити", - "AboutUrlTooltipMessage": "Натисніть, щоб відкрити сайт Ryujinx у браузері за замовчування.", - "AboutDisclaimerMessage": "Ryujinx жодним чином не пов’язано з Nintendo™,\nчи будь-яким із їхніх партнерів.", - "AboutAmiiboDisclaimerMessage": "AmiiboAPI (www.amiiboapi.com) використовується в нашій емуляції Amiibo.", - "AboutPatreonUrlTooltipMessage": "Натисніть, щоб відкрити сторінку Patreon Ryujinx у вашому браузері за замовчування.", - "AboutGithubUrlTooltipMessage": "Натисніть, щоб відкрити сторінку GitHub Ryujinx у браузері за замовчуванням.", - "AboutDiscordUrlTooltipMessage": "Натисніть, щоб відкрити запрошення на сервер Discord Ryujinx у браузері за замовчуванням.", - "AboutTwitterUrlTooltipMessage": "Натисніть, щоб відкрити сторінку Twitter Ryujinx у браузері за замовчуванням.", - "AboutRyujinxAboutTitle": "Про програму:", - "AboutRyujinxAboutContent": "Ryujinx — це емулятор для Nintendo Switch™.\nБудь ласка, підтримайте нас на Patreon.\nОтримуйте всі останні новини в нашому Twitter або Discord.\nРозробники, які хочуть зробити внесок, можуть дізнатися більше на нашому GitHub або в Discord.", - "AboutRyujinxMaintainersTitle": "Підтримується:", - "AboutRyujinxMaintainersContentTooltipMessage": "Натисніть, щоб відкрити сторінку співавторів у вашому браузері за замовчування.", - "AboutRyujinxSupprtersTitle": "Підтримується на Patreon:", - "AmiiboSeriesLabel": "Серія Amiibo", - "AmiiboCharacterLabel": "Персонаж", - "AmiiboScanButtonLabel": "Сканувати", - "AmiiboOptionsShowAllLabel": "Показати всі Amiibo", - "AmiiboOptionsUsRandomTagLabel": "Хитрість: Використовувати випадковий тег Uuid", - "DlcManagerTableHeadingEnabledLabel": "Увімкнено", - "DlcManagerTableHeadingTitleIdLabel": "ID заголовка", - "DlcManagerTableHeadingContainerPathLabel": "Шлях до контейнеру", - "DlcManagerTableHeadingFullPathLabel": "Повний шлях", - "DlcManagerRemoveAllButton": "Видалити все", - "DlcManagerEnableAllButton": "Увімкнути всі", - "DlcManagerDisableAllButton": "Вимкнути всі", - "ModManagerDeleteAllButton": "Видалити все", - "MenuBarOptionsChangeLanguage": "Змінити мову", - "MenuBarShowFileTypes": "Показати типи файлів", - "CommonSort": "Сортувати", - "CommonShowNames": "Показати назви", - "CommonFavorite": "Вибрані", - "OrderAscending": "За зростанням", - "OrderDescending": "За спаданням", - "SettingsTabGraphicsFeatures": "Функції та вдосконалення", - "ErrorWindowTitle": "Вікно помилок", - "ToggleDiscordTooltip": "Виберіть, чи відображати Ryujinx у вашій «поточній грі» в Discord", - "AddGameDirBoxTooltip": "Введіть каталог ігор, щоб додати до списку", - "AddGameDirTooltip": "Додати каталог гри до списку", - "RemoveGameDirTooltip": "Видалити вибраний каталог гри", - "AddAutoloadDirBoxTooltip": "Enter an autoload directory to add to the list", - "AddAutoloadDirTooltip": "Add an autoload directory to the list", - "RemoveAutoloadDirTooltip": "Remove selected autoload directory", - "CustomThemeCheckTooltip": "Використовуйте користувацьку тему Avalonia для графічного інтерфейсу, щоб змінити вигляд меню емулятора", - "CustomThemePathTooltip": "Шлях до користувацької теми графічного інтерфейсу", - "CustomThemeBrowseTooltip": "Огляд користувацької теми графічного інтерфейсу", - "DockModeToggleTooltip": "У режимі док-станції емульована система веде себе як приєднаний Nintendo Switch. Це покращує точність графіки в більшості ігор. І навпаки, вимкнення цього призведе до того, що емульована система поводитиметься як портативний комутатор Nintendo, погіршуючи якість графіки.\n\nНалаштуйте елементи керування для гравця 1, якщо плануєте використовувати режим док-станції; налаштуйте ручні елементи керування, якщо плануєте використовувати портативний режим.\n\nЗалиште увімкненим, якщо не впевнені.", - "DirectKeyboardTooltip": "Підтримка прямого доступу до клавіатури (HID). Надає іграм доступ до клавіатури для вводу тексту.\n\nПрацює тільки з іграми, які підтримують клавіатуру на обладнанні Switch.\n\nЗалиште вимкненим, якщо не впевнені.", - "DirectMouseTooltip": "Підтримка прямого доступу до миші (HID). Надає іграм доступ до миші, як пристрій вказування.\n\nПрацює тільки з іграми, які підтримують мишу на обладнанні Switch, їх небагато.\n\nФункціонал сенсорного екрана може не працювати, якщо функція ввімкнена.\n\nЗалиште вимкненим, якщо не впевнені.", - "RegionTooltip": "Змінити регіон системи", - "LanguageTooltip": "Змінити мову системи", - "TimezoneTooltip": "Змінити часовий пояс системи", - "TimeTooltip": "Змінити час системи", - "VSyncToggleTooltip": "Емульована вертикальна синхронізація консолі. По суті, обмежувач кадрів для більшості ігор; його вимкнення може призвести до того, що ігри працюватимуть на вищій швидкості, екрани завантаження триватимуть довше чи зупинятимуться.\n\nМожна перемикати в грі гарячою клавішею (За умовчанням F1). Якщо ви плануєте вимкнути функцію, рекомендуємо зробити це через гарячу клавішу.\n\nЗалиште увімкненим, якщо не впевнені.", - "PptcToggleTooltip": "Зберігає перекладені функції JIT, щоб їх не потрібно було перекладати кожного разу, коли гра завантажується.\n\nЗменшує заїкання та значно прискорює час завантаження після першого завантаження гри.\n\nЗалиште увімкненим, якщо не впевнені.", - "LowPowerPptcToggleTooltip": "Load the PPTC using a third of the amount of cores.", - "FsIntegrityToggleTooltip": "Перевіряє наявність пошкоджених файлів під час завантаження гри, і якщо виявлено пошкоджені файли, показує помилку хешу в журналі.\n\nНе впливає на продуктивність і призначений для усунення несправностей.\n\nЗалиште увімкненим, якщо не впевнені.", - "AudioBackendTooltip": "Змінює серверну частину, яка використовується для відтворення аудіо.\n\nSDL2 є кращим, тоді як OpenAL і SoundIO використовуються як резервні варіанти. Dummy не матиме звуку.\n\nВстановіть SDL2, якщо не впевнені.", - "MemoryManagerTooltip": "Змінює спосіб відображення та доступу до гостьової пам’яті. Значно впливає на продуктивність емульованого ЦП.\n\nВстановіть «Неперевірений хост», якщо не впевнені.", - "MemoryManagerSoftwareTooltip": "Використовує програмну таблицю сторінок для перекладу адрес. Найвища точність, але найповільніша продуктивність.", - "MemoryManagerHostTooltip": "Пряме відображення пам'яті в адресному просторі хосту. Набагато швидша компіляція та виконання JIT.", - "MemoryManagerUnsafeTooltip": "Пряме відображення пам’яті, але не маскує адресу в гостьовому адресному просторі перед доступом. Швидше, але ціною безпеки. Гостьова програма може отримати доступ до пам’яті з будь-якого місця в Ryujinx, тому запускайте в цьому режимі лише програми, яким ви довіряєте.", - "UseHypervisorTooltip": "Використання гіпервізор замість JIT. Значно покращує продуктивність, коли доступний, але може бути нестабільним у поточному стані.", - "DRamTooltip": "Використовує альтернативний макет MemoryMode для імітації моделі розробки Switch.\n\nЦе корисно лише для пакетів текстур з вищою роздільною здатністю або модифікацій із роздільною здатністю 4K. НЕ покращує продуктивність.\n\nЗалиште вимкненим, якщо не впевнені.", - "IgnoreMissingServicesTooltip": "Ігнорує нереалізовані служби Horizon OS. Це може допомогти в обході збоїв під час завантаження певних ігор.\n\nЗалиште вимкненим, якщо не впевнені.", - "IgnoreAppletTooltip": "Зовнішнє діалогове вікно \"Аплет контролера\" не з’являтиметься, якщо геймпад буде від’єднано під час гри. Не буде запиту закрити діалогове вікно чи налаштувати новий контролер. Після повторного підключення раніше від’єднаного контролера гра автоматично відновиться.", - "GraphicsBackendThreadingTooltip": "Виконує команди графічного сервера в другому потоці.\n\nПрискорює компіляцію шейдерів, зменшує затримки та покращує продуктивність драйверів GPU без власної підтримки багатопоточності. Трохи краща продуктивність на драйверах з багатопотоковістю.\nВстановіть значення «Авто», якщо не впевнені", - "GalThreadingTooltip": "Виконує команди графічного сервера в другому потоці.\n\nПрискорює компіляцію шейдерів, зменшує затримки та покращує продуктивність драйверів GPU без власної підтримки багатопоточності. Трохи краща продуктивність на драйверах з багатопотоковістю.\n\nВстановіть значення «Авто», якщо не впевнені.", - "ShaderCacheToggleTooltip": "Зберігає кеш дискового шейдера, що зменшує затримки під час наступних запусків.\n\nЗалиште увімкненим, якщо не впевнені.", - "ResolutionScaleTooltip": "Множить роздільну здатність гри.\n\nДеякі ігри можуть не працювати з цією функцією, і виглядатимуть піксельними; для цих ігор треба знайти модифікації, що зупиняють згладжування або підвищують роздільну здатність. Для останніх модифікацій, вибирайте \"Native\".\n\nЦей параметр можна міняти коли гра запущена кліком на \"Застосувати\"; ви можете перемістити вікно налаштувань і поекспериментувати з видом гри.\n\nМайте на увазі, що 4x це занадто для будь-якого комп'ютера.", - "ResolutionScaleEntryTooltip": "Масштаб роздільної здатності з плаваючою комою, наприклад 1,5. Не інтегральні масштаби, швидше за все, спричинять проблеми або збій.", - "AnisotropyTooltip": "Рівень анізотропної фільтрації. Встановіть на «Авто», щоб використовувати значення, яке вимагає гра.", - "AspectRatioTooltip": "Співвідношення сторін застосовано до вікна рендера.\n\nМіняйте тільки, якщо використовуєте модифікацію співвідношення сторін для гри, інакше графіка буде розтягнута.\n\nЗалиште на \"16:9\", якщо не впевнені.", - "ShaderDumpPathTooltip": "Шлях скидання графічних шейдерів", - "FileLogTooltip": "Зберігає журнал консолі у файл журналу на диску. Не впливає на продуктивність.", - "StubLogTooltip": "Друкує повідомлення журналу-заглушки на консолі. Не впливає на продуктивність.", - "InfoLogTooltip": "Друкує повідомлення інформаційного журналу на консолі. Не впливає на продуктивність.", - "WarnLogTooltip": "Друкує повідомлення журналу попереджень у консолі. Не впливає на продуктивність.", - "ErrorLogTooltip": "Друкує повідомлення журналу помилок у консолі. Не впливає на продуктивність.", - "TraceLogTooltip": "Друкує повідомлення журналу трасування на консолі. Не впливає на продуктивність.", - "GuestLogTooltip": "Друкує повідомлення журналу гостей у консолі. Не впливає на продуктивність.", - "FileAccessLogTooltip": "Друкує повідомлення журналу доступу до файлів у консолі.", - "FSAccessLogModeTooltip": "Вмикає виведення журналу доступу до FS на консоль. Можливі режими 0-3", - "DeveloperOptionTooltip": "Використовуйте з обережністю", - "OpenGlLogLevel": "Потрібно увімкнути відповідні рівні журналу", - "DebugLogTooltip": "Друкує повідомлення журналу налагодження на консолі.\n\nВикористовуйте це лише за спеціальною вказівкою співробітника, оскільки це ускладнить читання журналів і погіршить роботу емулятора.", - "LoadApplicationFileTooltip": "Відкриває файловий провідник, щоб вибрати для завантаження сумісний файл Switch", - "LoadApplicationFolderTooltip": "Відкриває файловий провідник, щоб вибрати сумісну з комутатором розпаковану програму для завантаження", - "LoadDlcFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load DLC from", - "LoadTitleUpdatesFromFolderTooltip": "Open a file explorer to choose one or more folders to bulk load title updates from", - "OpenRyujinxFolderTooltip": "Відкриває папку файлової системи Ryujinx", - "OpenRyujinxLogsTooltip": "Відкриває папку, куди записуються журнали", - "ExitTooltip": "Виходить з Ryujinx", - "OpenSettingsTooltip": "Відкриває вікно налаштувань", - "OpenProfileManagerTooltip": "Відкриває вікно диспетчера профілів користувачів", - "StopEmulationTooltip": "Зупиняє емуляцію поточної гри та повертається до вибору гри", - "CheckUpdatesTooltip": "Перевіряє наявність оновлень для Ryujinx", - "OpenAboutTooltip": "Відкриває вікно «Про програму».", - "GridSize": "Розмір сітки", - "GridSizeTooltip": "Змінити розмір елементів сітки", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "Португальська (Бразилія)", - "AboutRyujinxContributorsButtonHeader": "Переглянути всіх співавторів", - "SettingsTabSystemAudioVolume": "Гучність: ", - "AudioVolumeTooltip": "Змінити гучність звуку", - "SettingsTabSystemEnableInternetAccess": "Гостьовий доступ до Інтернету/режим LAN", - "EnableInternetAccessTooltip": "Дозволяє емульованій програмі підключатися до Інтернету.\n\nІгри з режимом локальної мережі можуть підключатися одна до одної, якщо це увімкнено, і системи підключені до однієї точки доступу. Сюди входять і справжні консолі.\n\nНЕ дозволяє підключатися до серверів Nintendo. Може призвести до збою в деяких іграх, які намагаються підключитися до Інтернету.\n\nЗалиште вимкненим, якщо не впевнені.", - "GameListContextMenuManageCheatToolTip": "Керування читами", - "GameListContextMenuManageCheat": "Керування читами", - "GameListContextMenuManageModToolTip": "Керування модами", - "GameListContextMenuManageMod": "Керування модами", - "ControllerSettingsStickRange": "Діапазон:", - "DialogStopEmulationTitle": "Ryujinx - Зупинити емуляцію", - "DialogStopEmulationMessage": "Ви впевнені, що хочете зупинити емуляцію?", - "SettingsTabCpu": "ЦП", - "SettingsTabAudio": "Аудіо", - "SettingsTabNetwork": "Мережа", - "SettingsTabNetworkConnection": "Підключення до мережі", - "SettingsTabCpuCache": "Кеш ЦП", - "SettingsTabCpuMemory": "Пам'ять ЦП", - "DialogUpdaterFlatpakNotSupportedMessage": "Будь ласка, оновіть Ryujinx через FlatHub.", - "UpdaterDisabledWarningTitle": "Програму оновлення вимкнено!", - "ControllerSettingsRotate90": "Повернути на 90° за годинниковою стрілкою", - "IconSize": "Розмір значка", - "IconSizeTooltip": "Змінити розмір значків гри", - "MenuBarOptionsShowConsole": "Показати консоль", - "ShaderCachePurgeError": "Помилка очищення кешу шейдера {0}: {1}", - "UserErrorNoKeys": "Ключі не знайдено", - "UserErrorNoFirmware": "Прошивка не знайдена", - "UserErrorFirmwareParsingFailed": "Помилка аналізу прошивки", - "UserErrorApplicationNotFound": "Додаток не знайдено", - "UserErrorUnknown": "Невідома помилка", - "UserErrorUndefined": "Невизначена помилка", - "UserErrorNoKeysDescription": "Ryujinx не вдалося знайти ваш файл «prod.keys».", - "UserErrorNoFirmwareDescription": "Ryujinx не вдалося знайти встановлену прошивку", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx не вдалося проаналізувати прошивку. Зазвичай це спричинено застарілими ключами.", - "UserErrorApplicationNotFoundDescription": "Ryujinx не вдалося знайти дійсний додаток за вказаним шляхом", - "UserErrorUnknownDescription": "Сталася невідома помилка!", - "UserErrorUndefinedDescription": "Сталася невизначена помилка! Цього не повинно статися, зверніться до розробника!", - "OpenSetupGuideMessage": "Відкрити посібник із налаштування", - "NoUpdate": "Немає оновлень", - "TitleUpdateVersionLabel": "Версія {0} - {1}", - "TitleBundledUpdateVersionLabel": "Bundled: Version {0}", - "TitleBundledDlcLabel": "Bundled:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujin x - Інформація", - "RyujinxConfirm": "Ryujinx - Підтвердження", - "FileDialogAllTypes": "Всі типи", - "Never": "Ніколи", - "SwkbdMinCharacters": "Мінімальна кількість символів: {0}", - "SwkbdMinRangeCharacters": "Має бути {0}-{1} символів", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "Програмна клавіатура", - "SoftwareKeyboardModeNumeric": "Повинно бути лише 0-9 або “.”", - "SoftwareKeyboardModeAlphabet": "Повинно бути лише не CJK-символи", - "SoftwareKeyboardModeASCII": "Повинно бути лише ASCII текст", - "ControllerAppletControllers": "Підтримувані контролери:", - "ControllerAppletPlayers": "Гравці:", - "ControllerAppletDescription": "Поточна конфігурація невірна. Відкрийте налаштування та переналаштуйте Ваші дані.", - "ControllerAppletDocked": "Встановлений режим в док-станції. Вимкніть портативні контролери.", - "UpdaterRenaming": "Перейменування старих файлів...", - "UpdaterRenameFailed": "Програмі оновлення не вдалося перейменувати файл: {0}", - "UpdaterAddingFiles": "Додавання нових файлів...", - "UpdaterExtracting": "Видобування оновлення...", - "UpdaterDownloading": "Завантаження оновлення...", - "Docked": "Док-станція", - "Handheld": "Портативний", - "ConnectionError": "Помилка з'єднання.", - "AboutPageDeveloperListMore": "{0} та інші...", - "ApiError": "Помилка API.", - "LoadingHeading": "Завантаження {0}", - "CompilingPPTC": "Компіляція PTC", - "CompilingShaders": "Компіляція шейдерів", - "AllKeyboards": "Всі клавіатури", - "OpenFileDialogTitle": "Виберіть підтримуваний файл для відкриття", - "OpenFolderDialogTitle": "Виберіть теку з розпакованою грою", - "AllSupportedFormats": "Усі підтримувані формати", - "RyujinxUpdater": "Програма оновлення Ryujinx", - "SettingsTabHotkeys": "Гарячі клавіші клавіатури", - "SettingsTabHotkeysHotkeys": "Гарячі клавіші клавіатури", - "SettingsTabHotkeysToggleVsyncHotkey": "Увімк/вимк вертикальну синхронізацію:", - "SettingsTabHotkeysScreenshotHotkey": "Знімок екрана:", - "SettingsTabHotkeysShowUiHotkey": "Показати інтерфейс:", - "SettingsTabHotkeysPauseHotkey": "Пауза:", - "SettingsTabHotkeysToggleMuteHotkey": "Вимкнути звук:", - "ControllerMotionTitle": "Налаштування керування рухом", - "ControllerRumbleTitle": "Налаштування вібрації", - "SettingsSelectThemeFileDialogTitle": "Виберіть файл теми", - "SettingsXamlThemeFile": "Файл теми Xaml", - "AvatarWindowTitle": "Керування обліковими записами - Аватар", - "Amiibo": "Amiibo", - "Unknown": "Невідомо", - "Usage": "Використання", - "Writable": "Можливість запису", - "SelectDlcDialogTitle": "Виберіть файли DLC", - "SelectUpdateDialogTitle": "Виберіть файли оновлення", - "SelectModDialogTitle": "Виберіть теку з модами", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "Менеджер профілів користувачів", - "CheatWindowTitle": "Менеджер читів", - "DlcWindowTitle": "Менеджер вмісту для завантаження", - "ModWindowTitle": "Керувати модами для {0} ({1})", - "UpdateWindowTitle": "Менеджер оновлення назв", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} new update(s) added", - "UpdateWindowBundledContentNotice": "Bundled updates cannot be removed, only disabled.", - "CheatWindowHeading": "Коди доступні для {0} [{1}]", - "BuildId": "ID збірки:", - "DlcWindowBundledContentNotice": "Bundled DLC cannot be removed, only disabled.", - "DlcWindowHeading": "Вміст для завантаження, доступний для {1} ({2}): {0}", - "DlcWindowDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcAddedMessage": "{0} new downloadable content(s) added", - "AutoloadDlcRemovedMessage": "{0} missing downloadable content(s) removed", - "AutoloadUpdateAddedMessage": "{0} new update(s) added", - "AutoloadUpdateRemovedMessage": "{0} missing update(s) removed", - "ModWindowHeading": "{0} мод(ів)", - "UserProfilesEditProfile": "Редагувати вибране", - "Continue": "Continue", - "Cancel": "Скасувати", - "Save": "Зберегти", - "Discard": "Скасувати", - "Paused": "Призупинено", - "UserProfilesSetProfileImage": "Встановити зображення профілю", - "UserProfileEmptyNameError": "Імʼя обовʼязкове", - "UserProfileNoImageError": "Зображення профілю обовʼязкове", - "GameUpdateWindowHeading": "{0} Доступні оновлення для {1} ({2})", - "SettingsTabHotkeysResScaleUpHotkey": "Збільшити роздільність:", - "SettingsTabHotkeysResScaleDownHotkey": "Зменшити роздільність:", - "UserProfilesName": "Імʼя", - "UserProfilesUserId": "ID користувача:", - "SettingsTabGraphicsBackend": "Графічний сервер", - "SettingsTabGraphicsBackendTooltip": "Виберіть backend графіки, що буде використовуватись в емуляторі.\n\n\"Vulkan\" краще для всіх сучасних відеокарт, якщо драйвери вчасно оновлюються. У Vulkan також швидше компілюються шейдери (менше \"заїкання\" зображення) на відеокартах всіх компаній.\n\n\"OpenGL\" може дати кращі результати на старих відеокартах Nvidia, старих відеокартах AMD на Linux, або на відеокартах з маленькою кількістю VRAM, але \"заїкання\" через компіляцію шейдерів будуть частіші.\n\nЯкщо не впевнені, встановіть на \"Vulkan\". Встановіть на \"OpenGL\", якщо Ваша відеокарта не підтримує Vulkan навіть на останніх драйверах.", - "SettingsEnableTextureRecompression": "Увімкнути рекомпресію текстури", - "SettingsEnableTextureRecompressionTooltip": "Стискає текстури ASTC, щоб зменшити використання VRAM.\n\nЦим форматом текстур користуються такі ігри, як Astral Chain, Bayonetta 3, Fire Emblem Engage, Metroid Prime Remastered, Super Mario Bros. Wonder і The Legend of Zelda: Tears of the Kingdom.\n\nЦі ігри, скоріше всього крашнуться на відеокартах з розміром VRAM в 4 Гб і менше.\n\nВмикайте тільки якщо у Вас закінчується VRAM на цих іграх. Залиште на \"Вимкнути\", якщо не впевнені.", - "SettingsTabGraphicsPreferredGpu": "Бажаний GPU", - "SettingsTabGraphicsPreferredGpuTooltip": "Виберіть відеокарту, яка використовуватиметься з графічним сервером Vulkan.\n\nНе впливає на графічний процесор, який використовуватиме OpenGL.\n\nВстановіть графічний процесор, позначений як «dGPU», якщо не впевнені. Якщо такого немає, не чіпайте.", - "SettingsAppRequiredRestartMessage": "Необхідно перезапустити Ryujinx", - "SettingsGpuBackendRestartMessage": "Налаштування графічного сервера або GPU було змінено. Для цього знадобиться перезапуск", - "SettingsGpuBackendRestartSubMessage": "Бажаєте перезапустити зараз?", - "RyujinxUpdaterMessage": "Бажаєте оновити Ryujinx до останньої версії?", - "SettingsTabHotkeysVolumeUpHotkey": "Збільшити гучність:", - "SettingsTabHotkeysVolumeDownHotkey": "Зменшити гучність:", - "SettingsEnableMacroHLE": "Увімкнути макрос HLE", - "SettingsEnableMacroHLETooltip": "Високорівнева емуляція коду макросу GPU.\n\nПокращує продуктивність, але може викликати графічні збої в деяких іграх.\n\nЗалиште увімкненим, якщо не впевнені.", - "SettingsEnableColorSpacePassthrough": "Наскрізний колірний простір", - "SettingsEnableColorSpacePassthroughTooltip": "Дозволяє серверу Vulkan передавати інформацію про колір без вказівки колірного простору. Для користувачів з екранами з широкою гамою це може призвести до більш яскравих кольорів, але шляхом втрати коректності передачі кольору.", - "VolumeShort": "Гуч.", - "UserProfilesManageSaves": "Керувати збереженнями", - "DeleteUserSave": "Ви хочете видалити збереження користувача для цієї гри?", - "IrreversibleActionNote": "Цю дію не можна скасувати.", - "SaveManagerHeading": "Керувати збереженнями для {0}", - "SaveManagerTitle": "Менеджер збереження", - "Name": "Назва", - "Size": "Розмір", - "Search": "Пошук", - "UserProfilesRecoverLostAccounts": "Відновлення втрачених облікових записів", - "Recover": "Відновити", - "UserProfilesRecoverHeading": "Знайдено збереження для наступних облікових записів", - "UserProfilesRecoverEmptyList": "Немає профілів для відновлення", - "GraphicsAATooltip": "Застосовує згладження до рендера гри.\n\nFXAA розмиє більшість зображення, а SMAA спробує знайти нерівні краї та згладити їх.\n\nНе рекомендується використовувати разом з фільтром масштабування FSR.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште на \"Немає\", якщо не впевнені.", - "GraphicsAALabel": "Згладжування:", - "GraphicsScalingFilterLabel": "Фільтр масштабування:", - "GraphicsScalingFilterTooltip": "Виберіть фільтр масштабування, що використається при збільшенні роздільної здатності.\n\n\"Білінійний\" добре виглядає в 3D іграх, і хороше налаштування за умовчуванням.\n\n\"Найближчий\" рекомендується для ігор з піксель-артом.\n\n\"FSR 1.0\" - це просто фільтр різкості, не рекомендується використовувати разом з FXAA або SMAA.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште на \"Білінійний\", якщо не впевнені.", - "GraphicsScalingFilterBilinear": "Білінійний", - "GraphicsScalingFilterNearest": "Найближчий", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "Рівень", - "GraphicsScalingFilterLevelTooltip": "Встановити рівень різкості в FSR 1.0. Чим вище - тим різкіше.", - "SmaaLow": "SMAA Низький", - "SmaaMedium": "SMAA Середній", - "SmaaHigh": "SMAA Високий", - "SmaaUltra": "SMAA Ультра", - "UserEditorTitle": "Редагувати користувача", - "UserEditorTitleCreate": "Створити користувача", - "SettingsTabNetworkInterface": "Мережевий інтерфейс:", - "NetworkInterfaceTooltip": "Мережевий інтерфейс, що використовується для LAN/LDN.\n\nРазом з VPN або XLink Kai, і грою що підтримує LAN, може імітувати з'єднання в однаковій мережі через Інтернет.", - "NetworkInterfaceDefault": "Стандартний", - "PackagingShaders": "Пакування шейдерів", - "AboutChangelogButton": "Переглянути журнал змін на GitHub", - "AboutChangelogButtonTooltipMessage": "Клацніть, щоб відкрити журнал змін для цієї версії у стандартному браузері.", - "SettingsTabNetworkMultiplayer": "Мережева гра", - "MultiplayerMode": "Режим:", - "MultiplayerModeTooltip": "Змінити LDN мультиплеєру.\n\nLdnMitm змінить функціонал бездротової/локальної гри в іграх, щоб вони працювали так, ніби це LAN, що дозволяє локальні підключення в тій самій мережі з іншими екземплярами Ryujinx та хакнутими консолями Nintendo Switch, які мають встановлений модуль ldn_mitm.\n\nМультиплеєр вимагає, щоб усі гравці були на одній і тій же версії гри (наприклад Super Smash Bros. Ultimate v13.0.1 не зможе під'єднатися до v13.0.0).\n\nЗалиште на \"Вимкнено\", якщо не впевнені, ", - "MultiplayerModeDisabled": "Вимкнено", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/zh_CN.json b/src/Ryujinx/Assets/Locales/zh_CN.json deleted file mode 100644 index 66ac309de..000000000 --- a/src/Ryujinx/Assets/Locales/zh_CN.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "简体中文", - "MenuBarFileOpenApplet": "打开小程序", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "打开独立的 Mii 小程序", - "SettingsTabInputDirectMouseAccess": "直通鼠标操作", - "SettingsTabSystemMemoryManagerMode": "内存管理模式:", - "SettingsTabSystemMemoryManagerModeSoftware": "软件管理", - "SettingsTabSystemMemoryManagerModeHost": "本机映射 (较快)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "跳过检查的本机映射 (最快,不安全)", - "SettingsTabSystemUseHypervisor": "使用 Hypervisor 虚拟化", - "MenuBarFile": "文件(_F)", - "MenuBarFileOpenFromFile": "加载游戏文件(_L)", - "MenuBarFileOpenFromFileError": "未发现应用", - "MenuBarFileOpenUnpacked": "加载解包后的游戏(_U)", - "MenuBarFileLoadDlcFromFolder": "从文件夹加载DLC", - "MenuBarFileLoadTitleUpdatesFromFolder": "从文件夹加载游戏更新", - "MenuBarFileOpenEmuFolder": "打开 Ryujinx 系统目录", - "MenuBarFileOpenLogsFolder": "打开日志目录", - "MenuBarFileExit": "退出(_E)", - "MenuBarOptions": "选项(_O)", - "MenuBarOptionsToggleFullscreen": "切换全屏", - "MenuBarOptionsStartGamesInFullscreen": "全屏模式启动游戏", - "MenuBarOptionsStopEmulation": "停止模拟", - "MenuBarOptionsSettings": "设置(_S)", - "MenuBarOptionsManageUserProfiles": "管理用户账户(_M)", - "MenuBarActions": "操作(_A)", - "MenuBarOptionsSimulateWakeUpMessage": "模拟唤醒消息", - "MenuBarActionsScanAmiibo": "扫描 Amiibo", - "MenuBarTools": "工具(_T)", - "MenuBarToolsInstallFirmware": "安装系统固件", - "MenuBarFileToolsInstallFirmwareFromFile": "从 XCI 或 ZIP 文件中安装系统固件", - "MenuBarFileToolsInstallFirmwareFromDirectory": "从文件夹中安装系统固件", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "管理文件扩展名", - "MenuBarToolsInstallFileTypes": "关联文件扩展名", - "MenuBarToolsUninstallFileTypes": "取消关联扩展名", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "视图(_V)", - "MenuBarViewWindow": "窗口大小", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "帮助(_H)", - "MenuBarHelpCheckForUpdates": "检查更新", - "MenuBarHelpAbout": "关于", - "MenuSearch": "搜索…", - "GameListHeaderFavorite": "收藏", - "GameListHeaderIcon": "图标", - "GameListHeaderApplication": "名称", - "GameListHeaderDeveloper": "制作商", - "GameListHeaderVersion": "版本", - "GameListHeaderTimePlayed": "游玩时长", - "GameListHeaderLastPlayed": "最近游玩", - "GameListHeaderFileExtension": "扩展名", - "GameListHeaderFileSize": "大小", - "GameListHeaderPath": "路径", - "GameListContextMenuOpenUserSaveDirectory": "打开用户存档目录", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "打开储存游戏用户存档的目录", - "GameListContextMenuOpenDeviceSaveDirectory": "打开系统数据目录", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "打开储存游戏系统数据的目录", - "GameListContextMenuOpenBcatSaveDirectory": "打开 BCAT 数据目录", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "打开储存游戏 BCAT 数据的目录", - "GameListContextMenuManageTitleUpdates": "管理游戏更新", - "GameListContextMenuManageTitleUpdatesToolTip": "打开游戏更新管理窗口", - "GameListContextMenuManageDlc": "管理 DLC", - "GameListContextMenuManageDlcToolTip": "打开 DLC 管理窗口", - "GameListContextMenuCacheManagement": "缓存管理", - "GameListContextMenuCacheManagementPurgePptc": "清除 PPTC 缓存文件", - "GameListContextMenuCacheManagementPurgePptcToolTip": "删除游戏的 PPTC 缓存文件,下次启动游戏时重新编译生成 PPTC 缓存文件", - "GameListContextMenuCacheManagementPurgeShaderCache": "清除着色器缓存文件", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "删除游戏的着色器缓存文件,下次启动游戏时重新生成着色器缓存文件", - "GameListContextMenuCacheManagementOpenPptcDirectory": "打开 PPTC 缓存目录", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "打开储存游戏 PPTC 缓存文件的目录", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "打开着色器缓存目录", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "打开储存游戏着色器缓存文件的目录", - "GameListContextMenuExtractData": "提取数据", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "从游戏的当前状态中提取 ExeFS 分区 (包括更新)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "从游戏的当前状态中提取 RomFS 分区 (包括更新)", - "GameListContextMenuExtractDataLogo": "图标", - "GameListContextMenuExtractDataLogoToolTip": "从游戏的当前状态中提取图标 (包括更新)", - "GameListContextMenuCreateShortcut": "创建游戏快捷方式", - "GameListContextMenuCreateShortcutToolTip": "创建一个直接启动此游戏的桌面快捷方式", - "GameListContextMenuCreateShortcutToolTipMacOS": "在 macOS 的应用程序目录中创建一个直接启动此游戏的快捷方式", - "GameListContextMenuOpenModsDirectory": "打开 MOD 目录", - "GameListContextMenuOpenModsDirectoryToolTip": "打开存放游戏 MOD 的目录", - "GameListContextMenuOpenSdModsDirectory": "打开大气层系统 MOD 目录", - "GameListContextMenuOpenSdModsDirectoryToolTip": "打开存放适用于大气层系统的游戏 MOD 的目录,对于为真实硬件打包的 MOD 非常有用", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} 游戏加载完成", - "StatusBarSystemVersion": "系统固件版本:{0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "检测到操作系统内存映射最大数量被设置的过低", - "LinuxVmMaxMapCountDialogTextPrimary": "你想要将操作系统 vm.max_map_count 的值增加到 {0} 吗", - "LinuxVmMaxMapCountDialogTextSecondary": "有些游戏可能会尝试创建超过当前系统允许的内存映射最大数量,若超过当前最大数量,Ryujinx 模拟器将会闪退。", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "确定,临时保存(重启后失效)", - "LinuxVmMaxMapCountDialogButtonPersistent": "确定,永久保存", - "LinuxVmMaxMapCountWarningTextPrimary": "内存映射的最大数量低于推荐值。", - "LinuxVmMaxMapCountWarningTextSecondary": "vm.max_map_count ({0}) 的当前值小于 {1}。 有些游戏可能会尝试创建超过当前系统允许的内存映射最大数量,若超过当前最大数量,Ryujinx 模拟器将会闪退。\n\n你可以手动增加内存映射最大数量,或者安装 pkexec,它可以辅助 Ryujinx 完成内存映射最大数量的修改操作。", - "Settings": "设置", - "SettingsTabGeneral": "用户界面", - "SettingsTabGeneralGeneral": "常规", - "SettingsTabGeneralEnableDiscordRichPresence": "启用 Discord 在线状态展示", - "SettingsTabGeneralCheckUpdatesOnLaunch": "启动时检查更新", - "SettingsTabGeneralShowConfirmExitDialog": "退出游戏时需要确认", - "SettingsTabGeneralRememberWindowState": "记住窗口大小和位置", - "SettingsTabGeneralShowTitleBar": "显示标题栏 (需要重启)", - "SettingsTabGeneralHideCursor": "隐藏鼠标指针:", - "SettingsTabGeneralHideCursorNever": "从不隐藏", - "SettingsTabGeneralHideCursorOnIdle": "自动隐藏", - "SettingsTabGeneralHideCursorAlways": "始终隐藏", - "SettingsTabGeneralGameDirectories": "游戏目录", - "SettingsTabGeneralAutoloadDirectories": "自动加载DLC/游戏更新目录", - "SettingsTabGeneralAutoloadNote": "DLC/游戏更新可自动加载和卸载", - "SettingsTabGeneralAdd": "添加", - "SettingsTabGeneralRemove": "删除", - "SettingsTabSystem": "系统", - "SettingsTabSystemCore": "核心", - "SettingsTabSystemSystemRegion": "系统区域:", - "SettingsTabSystemSystemRegionJapan": "日本", - "SettingsTabSystemSystemRegionUSA": "美国", - "SettingsTabSystemSystemRegionEurope": "欧洲", - "SettingsTabSystemSystemRegionAustralia": "澳大利亚", - "SettingsTabSystemSystemRegionChina": "中国", - "SettingsTabSystemSystemRegionKorea": "韩国", - "SettingsTabSystemSystemRegionTaiwan": "台湾地区", - "SettingsTabSystemSystemLanguage": "系统语言:", - "SettingsTabSystemSystemLanguageJapanese": "日语", - "SettingsTabSystemSystemLanguageAmericanEnglish": "英语(美国)", - "SettingsTabSystemSystemLanguageFrench": "法语", - "SettingsTabSystemSystemLanguageGerman": "德语", - "SettingsTabSystemSystemLanguageItalian": "意大利语", - "SettingsTabSystemSystemLanguageSpanish": "西班牙语", - "SettingsTabSystemSystemLanguageChinese": "中文(简体)——无效", - "SettingsTabSystemSystemLanguageKorean": "韩语", - "SettingsTabSystemSystemLanguageDutch": "荷兰语", - "SettingsTabSystemSystemLanguagePortuguese": "葡萄牙语", - "SettingsTabSystemSystemLanguageRussian": "俄语", - "SettingsTabSystemSystemLanguageTaiwanese": "中文(繁体)——无效", - "SettingsTabSystemSystemLanguageBritishEnglish": "英语(英国)", - "SettingsTabSystemSystemLanguageCanadianFrench": "加拿大法语", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "拉美西班牙语", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "简体中文(推荐)", - "SettingsTabSystemSystemLanguageTraditionalChinese": "繁体中文(推荐)", - "SettingsTabSystemSystemTimeZone": "系统时区:", - "SettingsTabSystemSystemTime": "系统时钟:", - "SettingsTabSystemEnableVsync": "启用垂直同步", - "SettingsTabSystemEnablePptc": "开启 PPTC 缓存", - "SettingsTabSystemEnableLowPowerPptc": "低功耗 PPTC 加载", - "SettingsTabSystemEnableFsIntegrityChecks": "启用文件系统完整性检查", - "SettingsTabSystemAudioBackend": "音频处理引擎:", - "SettingsTabSystemAudioBackendDummy": "无", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "修改", - "SettingsTabSystemHacksNote": "会导致模拟器不稳定", - "SettingsTabSystemDramSize": "使用开发机的内存布局(开发人员使用)", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "忽略缺失的服务", - "SettingsTabSystemIgnoreApplet": "忽略小程序", - "SettingsTabGraphics": "图形", - "SettingsTabGraphicsAPI": "图形 API", - "SettingsTabGraphicsEnableShaderCache": "启用着色器缓存", - "SettingsTabGraphicsAnisotropicFiltering": "各向异性过滤:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "自动", - "SettingsTabGraphicsAnisotropicFiltering2x": "2x", - "SettingsTabGraphicsAnisotropicFiltering4x": "4x", - "SettingsTabGraphicsAnisotropicFiltering8x": "8x", - "SettingsTabGraphicsAnisotropicFiltering16x": "16x", - "SettingsTabGraphicsResolutionScale": "分辨率缩放:", - "SettingsTabGraphicsResolutionScaleCustom": "自定义(不推荐)", - "SettingsTabGraphicsResolutionScaleNative": "原生 (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2 倍 (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3 倍 (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4 倍 (2880p/4320p) (不推荐)", - "SettingsTabGraphicsAspectRatio": "宽高比:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "拉伸以适应窗口", - "SettingsTabGraphicsDeveloperOptions": "开发者选项", - "SettingsTabGraphicsShaderDumpPath": "图形着色器转储路径:", - "SettingsTabLogging": "日志", - "SettingsTabLoggingLogging": "日志", - "SettingsTabLoggingEnableLoggingToFile": "将日志写入文件", - "SettingsTabLoggingEnableStubLogs": "启用存根日志", - "SettingsTabLoggingEnableInfoLogs": "启用信息日志", - "SettingsTabLoggingEnableWarningLogs": "启用警告日志", - "SettingsTabLoggingEnableErrorLogs": "启用错误日志", - "SettingsTabLoggingEnableTraceLogs": "启用跟踪日志", - "SettingsTabLoggingEnableGuestLogs": "启用访客日志", - "SettingsTabLoggingEnableFsAccessLogs": "启用文件访问日志", - "SettingsTabLoggingFsGlobalAccessLogMode": "文件系统全局访问日志模式:", - "SettingsTabLoggingDeveloperOptions": "开发者选项", - "SettingsTabLoggingDeveloperOptionsNote": "警告:会降低模拟器性能", - "SettingsTabLoggingGraphicsBackendLogLevel": "图形引擎日志级别:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "无", - "SettingsTabLoggingGraphicsBackendLogLevelError": "错误", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "减速", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "全部", - "SettingsTabLoggingEnableDebugLogs": "启用调试日志", - "SettingsTabInput": "输入", - "SettingsTabInputEnableDockedMode": "主机模式", - "SettingsTabInputDirectKeyboardAccess": "直通键盘控制", - "SettingsButtonSave": "保存", - "SettingsButtonClose": "关闭", - "SettingsButtonOk": "确定", - "SettingsButtonCancel": "取消", - "SettingsButtonApply": "应用", - "ControllerSettingsPlayer": "玩家", - "ControllerSettingsPlayer1": "玩家 1", - "ControllerSettingsPlayer2": "玩家 2", - "ControllerSettingsPlayer3": "玩家 3", - "ControllerSettingsPlayer4": "玩家 4", - "ControllerSettingsPlayer5": "玩家 5", - "ControllerSettingsPlayer6": "玩家 6", - "ControllerSettingsPlayer7": "玩家 7", - "ControllerSettingsPlayer8": "玩家 8", - "ControllerSettingsHandheld": "掌机模式", - "ControllerSettingsInputDevice": "输入设备", - "ControllerSettingsRefresh": "刷新", - "ControllerSettingsDeviceDisabled": "禁用", - "ControllerSettingsControllerType": "手柄类型", - "ControllerSettingsControllerTypeHandheld": "掌机", - "ControllerSettingsControllerTypeProController": "Pro 手柄", - "ControllerSettingsControllerTypeJoyConPair": "双 JoyCon 手柄", - "ControllerSettingsControllerTypeJoyConLeft": "左 JoyCon 手柄", - "ControllerSettingsControllerTypeJoyConRight": "右 JoyCon 手柄", - "ControllerSettingsProfile": "配置文件", - "ControllerSettingsProfileDefault": "默认设置", - "ControllerSettingsLoad": "加载", - "ControllerSettingsAdd": "新建", - "ControllerSettingsRemove": "删除", - "ControllerSettingsButtons": "基础按键", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "方向键", - "ControllerSettingsDPadUp": "上", - "ControllerSettingsDPadDown": "下", - "ControllerSettingsDPadLeft": "左", - "ControllerSettingsDPadRight": "右", - "ControllerSettingsStickButton": "按下摇杆", - "ControllerSettingsStickUp": "上", - "ControllerSettingsStickDown": "下", - "ControllerSettingsStickLeft": "左", - "ControllerSettingsStickRight": "右", - "ControllerSettingsStickStick": "摇杆", - "ControllerSettingsStickInvertXAxis": "摇杆左右反转", - "ControllerSettingsStickInvertYAxis": "摇杆上下反转", - "ControllerSettingsStickDeadzone": "死区:", - "ControllerSettingsLStick": "左摇杆", - "ControllerSettingsRStick": "右摇杆", - "ControllerSettingsTriggersLeft": "左扳机", - "ControllerSettingsTriggersRight": "右扳机", - "ControllerSettingsTriggersButtonsLeft": "左扳机键", - "ControllerSettingsTriggersButtonsRight": "右扳机键", - "ControllerSettingsTriggers": "扳机", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "左背键", - "ControllerSettingsExtraButtonsRight": "右背键", - "ControllerSettingsMisc": "其他", - "ControllerSettingsTriggerThreshold": "扳机阈值:", - "ControllerSettingsMotion": "体感", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "使用 CemuHook 兼容的体感协议", - "ControllerSettingsMotionControllerSlot": "手柄槽位:", - "ControllerSettingsMotionMirrorInput": "镜像操作", - "ControllerSettingsMotionRightJoyConSlot": "右 JoyCon 槽位:", - "ControllerSettingsMotionServerHost": "服务器地址:", - "ControllerSettingsMotionGyroSensitivity": "陀螺仪敏感度:", - "ControllerSettingsMotionGyroDeadzone": "陀螺仪死区:", - "ControllerSettingsSave": "保存", - "ControllerSettingsClose": "关闭", - "KeyUnknown": "未知", - "KeyShiftLeft": "左侧Shift", - "KeyShiftRight": "右侧Shift", - "KeyControlLeft": "左侧Ctrl", - "KeyMacControlLeft": "左侧⌃", - "KeyControlRight": "右侧Ctrl", - "KeyMacControlRight": "右侧⌃", - "KeyAltLeft": "左侧Alt", - "KeyMacAltLeft": "左侧⌥", - "KeyAltRight": "右侧Alt", - "KeyMacAltRight": "右侧⌥", - "KeyWinLeft": "左侧⊞", - "KeyMacWinLeft": "左侧⌘", - "KeyWinRight": "右侧⊞", - "KeyMacWinRight": "右侧⌘", - "KeyMenu": "菜单键", - "KeyUp": "上", - "KeyDown": "下", - "KeyLeft": "左", - "KeyRight": "右", - "KeyEnter": "回车键", - "KeyEscape": "Esc", - "KeySpace": "空格键", - "KeyTab": "Tab", - "KeyBackSpace": "退格键", - "KeyInsert": "Insert", - "KeyDelete": "Delete", - "KeyPageUp": "Page Up", - "KeyPageDown": "Page Down", - "KeyHome": "Home", - "KeyEnd": "End", - "KeyCapsLock": "Caps Lock", - "KeyScrollLock": "Scroll Lock", - "KeyPrintScreen": "Print Screen", - "KeyPause": "Pause", - "KeyNumLock": "Num Lock", - "KeyClear": "清除键", - "KeyKeypad0": "小键盘0", - "KeyKeypad1": "小键盘1", - "KeyKeypad2": "小键盘2", - "KeyKeypad3": "小键盘3", - "KeyKeypad4": "小键盘4", - "KeyKeypad5": "小键盘5", - "KeyKeypad6": "小键盘6", - "KeyKeypad7": "小键盘7", - "KeyKeypad8": "小键盘8", - "KeyKeypad9": "小键盘9", - "KeyKeypadDivide": "小键盘/", - "KeyKeypadMultiply": "小键盘*", - "KeyKeypadSubtract": "小键盘-", - "KeyKeypadAdd": "小键盘+", - "KeyKeypadDecimal": "小键盘.", - "KeyKeypadEnter": "小键盘回车键", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "未分配", - "GamepadLeftStick": "左摇杆按键", - "GamepadRightStick": "右摇杆按键", - "GamepadLeftShoulder": "左肩键L", - "GamepadRightShoulder": "右肩键R", - "GamepadLeftTrigger": "左扳机键ZL", - "GamepadRightTrigger": "右扳机键ZR", - "GamepadDpadUp": "上键", - "GamepadDpadDown": "下键", - "GamepadDpadLeft": "左键", - "GamepadDpadRight": "右键", - "GamepadMinus": "-键", - "GamepadPlus": "+键", - "GamepadGuide": "主页键", - "GamepadMisc1": "截图键", - "GamepadPaddle1": "其他按键1", - "GamepadPaddle2": "其他按键2", - "GamepadPaddle3": "其他按键3", - "GamepadPaddle4": "其他按键4", - "GamepadTouchpad": "触摸板", - "GamepadSingleLeftTrigger0": "左扳机0", - "GamepadSingleRightTrigger0": "右扳机0", - "GamepadSingleLeftTrigger1": "左扳机1", - "GamepadSingleRightTrigger1": "右扳机1", - "StickLeft": "左摇杆", - "StickRight": "右摇杆", - "UserProfilesSelectedUserProfile": "选定的用户账户:", - "UserProfilesSaveProfileName": "保存名称", - "UserProfilesChangeProfileImage": "更换头像", - "UserProfilesAvailableUserProfiles": "现有用户账户:", - "UserProfilesAddNewProfile": "新建账户", - "UserProfilesDelete": "删除", - "UserProfilesClose": "关闭", - "ProfileNameSelectionWatermark": "输入昵称", - "ProfileImageSelectionTitle": "选择头像", - "ProfileImageSelectionHeader": "选择合适的头像图片", - "ProfileImageSelectionNote": "您可以导入自定义头像,或从模拟器系统固件中选择预设头像", - "ProfileImageSelectionImportImage": "导入图像文件", - "ProfileImageSelectionSelectAvatar": "选择预设头像", - "InputDialogTitle": "输入对话框", - "InputDialogOk": "完成", - "InputDialogCancel": "取消", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "选择用户名称", - "InputDialogAddNewProfileHeader": "请输入账户名称", - "InputDialogAddNewProfileSubtext": "(最大长度:{0})", - "AvatarChoose": "保存选定头像", - "AvatarSetBackgroundColor": "设置背景色", - "AvatarClose": "关闭", - "ControllerSettingsLoadProfileToolTip": "加载配置文件", - "ControllerSettingsViewProfileToolTip": "预览配置文件", - "ControllerSettingsAddProfileToolTip": "新增配置文件", - "ControllerSettingsRemoveProfileToolTip": "删除配置文件", - "ControllerSettingsSaveProfileToolTip": "保存配置文件", - "MenuBarFileToolsTakeScreenshot": "保存截屏", - "MenuBarFileToolsHideUi": "隐藏菜单栏和状态栏", - "GameListContextMenuRunApplication": "启动游戏", - "GameListContextMenuToggleFavorite": "收藏", - "GameListContextMenuToggleFavoriteToolTip": "切换游戏的收藏状态", - "SettingsTabGeneralTheme": "主题:", - "SettingsTabGeneralThemeAuto": "自动", - "SettingsTabGeneralThemeDark": "深色(暗黑)", - "SettingsTabGeneralThemeLight": "浅色(亮色)", - "ControllerSettingsConfigureGeneral": "配置", - "ControllerSettingsRumble": "震动", - "ControllerSettingsRumbleStrongMultiplier": "强震动幅度", - "ControllerSettingsRumbleWeakMultiplier": "弱震动幅度", - "DialogMessageSaveNotAvailableMessage": "没有{0} [{1:x16}]的游戏存档", - "DialogMessageSaveNotAvailableCreateSaveMessage": "是否创建该游戏的存档?", - "DialogConfirmationTitle": "Ryujinx - 确认", - "DialogUpdaterTitle": "Ryujinx - 更新", - "DialogErrorTitle": "Ryujinx - 错误", - "DialogWarningTitle": "Ryujinx - 警告", - "DialogExitTitle": "Ryujinx - 退出", - "DialogErrorMessage": "Ryujinx 模拟器发生错误", - "DialogExitMessage": "是否关闭 Ryujinx 模拟器?", - "DialogExitSubMessage": "未保存的进度将会丢失!", - "DialogMessageCreateSaveErrorMessage": "创建指定存档时出错:{0}", - "DialogMessageFindSaveErrorMessage": "查找指定存档时出错:{0}", - "FolderDialogExtractTitle": "选择要提取到的文件夹", - "DialogNcaExtractionMessage": "提取 {1} 的 {0} 分区...", - "DialogNcaExtractionTitle": "NCA 分区提取", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "提取失败,所选文件中没有 NCA 文件", - "DialogNcaExtractionCheckLogErrorMessage": "提取失败,请查看日志文件获取详情", - "DialogNcaExtractionSuccessMessage": "提取成功!", - "DialogUpdaterConvertFailedMessage": "无法切换当前 Ryujinx 版本。", - "DialogUpdaterCancelUpdateMessage": "取消更新!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "您使用的 Ryujinx 模拟器是最新版本。", - "DialogUpdaterFailedToGetVersionMessage": "尝试从 Github 获取版本信息时无效,可能由于 GitHub Actions 正在编译新版本。\n请过一会再试。", - "DialogUpdaterConvertFailedGithubMessage": "无法切换至从 Github 接收到的新版 Ryujinx 模拟器。", - "DialogUpdaterDownloadingMessage": "下载更新中...", - "DialogUpdaterExtractionMessage": "正在提取更新...", - "DialogUpdaterRenamingMessage": "正在重命名更新...", - "DialogUpdaterAddingFilesMessage": "安装更新中...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "更新成功!", - "DialogUpdaterRestartMessage": "是否立即重启 Ryujinx 模拟器?", - "DialogUpdaterNoInternetMessage": "没有连接到网络", - "DialogUpdaterNoInternetSubMessage": "请确保互联网连接正常。", - "DialogUpdaterDirtyBuildMessage": "无法更新非官方版本的 Ryujinx 模拟器!", - "DialogUpdaterDirtyBuildSubMessage": "如果想使用受支持的版本,请您在 https://ryujinx.app/download 下载官方版本。", - "DialogRestartRequiredMessage": "需要重启模拟器", - "DialogThemeRestartMessage": "主题设置已保存,需要重启模拟器才能生效。", - "DialogThemeRestartSubMessage": "是否要重启模拟器?", - "DialogFirmwareInstallEmbeddedMessage": "要安装游戏文件中内嵌的系统固件吗?(固件版本 {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "Ryujinx 模拟器已经从当前游戏文件中安装了系统固件 {0} 。\n模拟器现在可以正常运行了。", - "DialogFirmwareNoFirmwareInstalledMessage": "未安装系统固件", - "DialogFirmwareInstalledMessage": "已安装系统固件 {0}", - "DialogInstallFileTypesSuccessMessage": "关联文件类型成功!", - "DialogInstallFileTypesErrorMessage": "关联文件类型失败!", - "DialogUninstallFileTypesSuccessMessage": "成功解除文件类型关联!", - "DialogUninstallFileTypesErrorMessage": "解除文件类型关联失败!", - "DialogOpenSettingsWindowLabel": "打开设置窗口", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "控制器小窗口", - "DialogMessageDialogErrorExceptionMessage": "显示消息对话框时出错:{0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "显示软件键盘时出错:{0}", - "DialogErrorAppletErrorExceptionMessage": "显示错误对话框时出错:{0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\n有关修复此错误的更多信息,可以查看我们的安装指南。", - "DialogUserErrorDialogTitle": "Ryujinx 错误 ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "从 API 获取信息时出错。", - "DialogAmiiboApiConnectErrorMessage": "无法连接到 Amiibo API 服务器,服务可能已关闭,或者没有连接互联网。", - "DialogProfileInvalidProfileErrorMessage": "配置文件 {0} 与当前输入配置系统不兼容。", - "DialogProfileDefaultProfileOverwriteErrorMessage": "不允许覆盖默认配置文件", - "DialogProfileDeleteProfileTitle": "删除配置文件", - "DialogProfileDeleteProfileMessage": "删除后不可恢复,确认删除吗?", - "DialogWarning": "警告", - "DialogPPTCDeletionMessage": "您即将删除:\n\n{0} 的 PPTC 缓存文件\n\n确定吗?", - "DialogPPTCDeletionErrorMessage": "清除 {0} 的 PPTC 缓存文件时出错:{1}", - "DialogShaderDeletionMessage": "您即将删除:\n\n{0} 的着色器缓存文件\n\n确定吗?", - "DialogShaderDeletionErrorMessage": "清除 {0} 的着色器缓存文件时出错:{1}", - "DialogRyujinxErrorMessage": "Ryujinx 模拟器发生错误", - "DialogInvalidTitleIdErrorMessage": "用户界面错误:所选游戏没有有效的游戏 ID", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "在路径 {0} 中找不到有效的 Switch 系统固件。", - "DialogFirmwareInstallerFirmwareInstallTitle": "安装系统固件 {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "即将安装系统固件版本 {0} 。", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\n替换当前系统固件版本 {0} 。", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n是否继续?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "安装系统固件中...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "成功安装系统固件版本 {0} 。", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "删除后将没有可用的账户", - "DialogUserProfileDeletionConfirmMessage": "是否删除所选账户", - "DialogUserProfileUnsavedChangesTitle": "警告 - 有未保存的更改", - "DialogUserProfileUnsavedChangesMessage": "您对该账户的更改尚未保存。", - "DialogUserProfileUnsavedChangesSubMessage": "确定要放弃更改吗?", - "DialogControllerSettingsModifiedConfirmMessage": "当前的输入设置已更新", - "DialogControllerSettingsModifiedConfirmSubMessage": "是否保存?", - "DialogLoadFileErrorMessage": "{0}. 错误的文件:{1}", - "DialogModAlreadyExistsMessage": "MOD 已存在", - "DialogModInvalidMessage": "指定的目录找不到 MOD 文件!", - "DialogModDeleteNoParentMessage": "删除失败:找不到 MOD 的父目录“{0}”!", - "DialogDlcNoDlcErrorMessage": "选择的文件不是当前游戏的 DLC!", - "DialogPerformanceCheckLoggingEnabledMessage": "您启用了跟踪日志,该功能仅供开发人员使用。", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "为了获得最佳性能,建议禁用跟踪日志记录。您是否要立即禁用?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "您启用了着色器转储,该功能仅供开发人员使用。", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "为了获得最佳性能,建议禁用着色器转储。您是否要立即禁用?", - "DialogLoadAppGameAlreadyLoadedMessage": "游戏已经启动", - "DialogLoadAppGameAlreadyLoadedSubMessage": "请停止模拟或关闭模拟器,再启动另一个游戏。", - "DialogUpdateAddUpdateErrorMessage": "选择的文件不是当前游戏的更新!", - "DialogSettingsBackendThreadingWarningTitle": "警告 - 图形引擎多线程", - "DialogSettingsBackendThreadingWarningMessage": "更改此选项后,必须重启 Ryujinx 模拟器才能生效。\n\n当启用图形引擎多线程时,根据显卡不同,您可能需要手动禁用显卡驱动程序自身的多线程(线程优化)。", - "DialogModManagerDeletionWarningMessage": "您即将删除 MOD:{0} \n\n确定吗?", - "DialogModManagerDeletionAllWarningMessage": "您即将删除该游戏的所有 MOD,\n\n确定吗?", - "SettingsTabGraphicsFeaturesOptions": "功能", - "SettingsTabGraphicsBackendMultithreading": "图形引擎多线程:", - "CommonAuto": "自动(推荐)", - "CommonOff": "关闭", - "CommonOn": "打开", - "InputDialogYes": "是", - "InputDialogNo": "否", - "DialogProfileInvalidProfileNameErrorMessage": "文件名包含无效字符,请重试。", - "MenuBarOptionsPauseEmulation": "暂停", - "MenuBarOptionsResumeEmulation": "继续", - "AboutUrlTooltipMessage": "在浏览器中打开 Ryujinx 模拟器官网。", - "AboutDisclaimerMessage": "Ryujinx 与 Nintendo™ 以及其合作伙伴没有任何关联。", - "AboutAmiiboDisclaimerMessage": "我们的 Amiibo 模拟使用了\nAmiiboAPI (www.amiiboapi.com)。", - "AboutPatreonUrlTooltipMessage": "在浏览器中打开 Ryujinx 的 Patreon 赞助页。", - "AboutGithubUrlTooltipMessage": "在浏览器中打开 Ryujinx 的 GitHub 代码库。", - "AboutDiscordUrlTooltipMessage": "在浏览器中打开 Ryujinx 的 Discord 邀请链接。", - "AboutTwitterUrlTooltipMessage": "在浏览器中打开 Ryujinx 的 Twitter 主页。", - "AboutRyujinxAboutTitle": "关于:", - "AboutRyujinxAboutContent": "Ryujinx 是一款 Nintendo Switch™ 模拟器。\n您可以在 Patreon 上赞助 Ryujinx。\n关注 Twitter 或 Discord 可以获取模拟器最新动态。\n如果您对开发感兴趣,欢迎来 GitHub 或 Discord 加入我们!", - "AboutRyujinxMaintainersTitle": "开发维护人员名单:", - "AboutRyujinxMaintainersContentTooltipMessage": "在浏览器中打开贡献者页面", - "AboutRyujinxSupprtersTitle": "感谢 Patreon 上的赞助者:", - "AmiiboSeriesLabel": "Amiibo 系列", - "AmiiboCharacterLabel": "角色", - "AmiiboScanButtonLabel": "扫描", - "AmiiboOptionsShowAllLabel": "显示所有 Amiibo", - "AmiiboOptionsUsRandomTagLabel": "修改:使用随机生成的Amiibo ID", - "DlcManagerTableHeadingEnabledLabel": "已启用", - "DlcManagerTableHeadingTitleIdLabel": "游戏 ID", - "DlcManagerTableHeadingContainerPathLabel": "容器路径", - "DlcManagerTableHeadingFullPathLabel": "完整路径", - "DlcManagerRemoveAllButton": "全部删除", - "DlcManagerEnableAllButton": "全部启用", - "DlcManagerDisableAllButton": "全部停用", - "ModManagerDeleteAllButton": "全部刪除", - "MenuBarOptionsChangeLanguage": "更改界面语言", - "MenuBarShowFileTypes": "主页显示的文件类型", - "CommonSort": "排序", - "CommonShowNames": "显示名称", - "CommonFavorite": "收藏", - "OrderAscending": "升序", - "OrderDescending": "降序", - "SettingsTabGraphicsFeatures": "功能与优化", - "ErrorWindowTitle": "错误窗口", - "ToggleDiscordTooltip": "选择是否在 Discord 中显示您的游玩状态", - "AddGameDirBoxTooltip": "输入要添加的游戏目录", - "AddGameDirTooltip": "添加游戏目录到列表中", - "RemoveGameDirTooltip": "移除选中的目录", - "AddAutoloadDirBoxTooltip": "输入需要添加到列表中的自动加载目录", - "AddAutoloadDirTooltip": "添加一个自动加载目录到列表中", - "RemoveAutoloadDirTooltip": "移除被选中的自动加载目录", - "CustomThemeCheckTooltip": "使用自定义的 Avalonia 主题作为模拟器菜单的外观", - "CustomThemePathTooltip": "自定义主题的目录", - "CustomThemeBrowseTooltip": "查找自定义主题", - "DockModeToggleTooltip": "启用 Switch 的主机模式(电视模式、底座模式),就是模拟 Switch 连接底座的情况;若禁用主机模式,则使用 Switch 的掌机模式,就是模拟手持 Switch 运行游戏的情况。\n对于绝大多数游戏而言,主机模式会比掌机模式,画质更高,同时性能消耗也更高。\n\n简而言之,想要更好画质则启用主机模式;电脑硬件性能不足则禁用主机模式。\n\n如果使用主机模式,请选择“玩家 1”的手柄设置;如果使用掌机模式,请选择“掌机模式”的手柄设置。\n\n如果不确定,请保持开启状态。", - "DirectKeyboardTooltip": "直接键盘访问(HID)支持,游戏可以直接访问键盘作为文本输入设备。\n\n仅适用于在 Switch 硬件上原生支持键盘的游戏。\n\n如果不确定,请保持关闭状态。", - "DirectMouseTooltip": "直接鼠标访问(HID)支持,游戏可以直接访问鼠标作为指针输入设备。\n\n只适用于在 Switch 硬件上原生支持鼠标控制的游戏,这种游戏很少。\n\n启用后,触屏功能可能无法正常工作。\n\n如果不确定,请保持关闭状态。", - "RegionTooltip": "更改系统区域", - "LanguageTooltip": "更改系统语言", - "TimezoneTooltip": "更改系统时区", - "TimeTooltip": "更改系统时间", - "VSyncToggleTooltip": "模拟控制台的垂直同步,开启后会降低大部分游戏的帧率。关闭后,可以获得更高的帧率,但也可能导致游戏画面加载耗时更长或卡住。\n\n在游戏中可以使用热键进行切换(默认为 F1 键)。\n\n如果不确定,请保持开启状态。", - "PptcToggleTooltip": "缓存已编译的游戏指令,这样每次游戏加载时就无需重新编译。\n\n可以减少卡顿和启动时间,提高游戏响应速度。\n\n如果不确定,请保持开启状态。", - "LowPowerPptcToggleTooltip": "使用三分之一的核心数加载PPTC.", - "FsIntegrityToggleTooltip": "启动游戏时检查游戏文件的完整性,并在日志中记录损坏的文件。\n\n对性能没有影响,用于排查故障。\n\n如果不确定,请保持开启状态。", - "AudioBackendTooltip": "更改音频处理引擎。\n\n推荐选择“SDL2”,另外“OpenAL”和“SoundIO”可以作为备选,选择“无”将没有声音。\n\n如果不确定,请设置为“SDL2”。", - "MemoryManagerTooltip": "更改模拟器内存映射和访问的方式,对模拟器 CPU 的性能影响很大。\n\n如果不确定,请设置为“跳过检查的本机映射”。", - "MemoryManagerSoftwareTooltip": "使用软件内存页进行内存地址映射,最准确但是速度最慢。", - "MemoryManagerHostTooltip": "直接映射内存页到电脑内存,使得即时编译和执行的效率更高。", - "MemoryManagerUnsafeTooltip": "直接映射内存页到电脑内存,并且不检查内存溢出,使得效率更高,但牺牲了安全。\n游戏程序可以访问模拟器内存的任意地址,所以不安全。\n建议此模式下只运行您信任的游戏程序。", - "UseHypervisorTooltip": "使用 Hypervisor 虚拟机代替即时编译,在可用的情况下能大幅提高性能,但目前可能还不稳定。", - "DRamTooltip": "模拟 Switch 开发机的内存布局。\n\n不会提高性能,某些高清纹理包或 4k 分辨率 MOD 可能需要使用此选项。\n\n如果不确定,请保持关闭状态。", - "IgnoreMissingServicesTooltip": "开启后,游戏会忽略未实现的系统服务,从而继续运行。\n少部分新发布的游戏由于使用了新的未知系统服务,可能需要此选项来避免闪退。\n模拟器更新完善系统服务之后,则无需开启此选项。\n\n如果不确定,请保持关闭状态。", - "IgnoreAppletTooltip": "如果游戏手柄在游戏过程中断开连接,则不会出现外部对话框“控制器小程序”。不会提示关闭对话框或设置新控制器。一旦先前断开连接的控制器重新连接,游戏将自动恢复。", - "GraphicsBackendThreadingTooltip": "在第二个线程上执行图形引擎指令。\n\n可以加速着色器编译,减少卡顿,提高 GPU 的性能。\n\n如果不确定,请设置为“自动”。", - "GalThreadingTooltip": "在第二个线程上执行图形引擎指令。\n\n可以加速着色器编译,减少卡顿,提高 GPU 的性能。\n\n如果不确定,请设置为“自动”。", - "ShaderCacheToggleTooltip": "模拟器将已编译的着色器保存到硬盘,可以减少游戏再次渲染相同图形导致的卡顿。\n\n如果不确定,请保持开启状态。", - "ResolutionScaleTooltip": "将游戏的渲染分辨率乘以一个倍数。\n\n有些游戏可能不适用这项设置,而且即使提高了分辨率仍然看起来像素化;对于这些游戏,您可能需要找到移除抗锯齿或提高内部渲染分辨率的 MOD。当使用这些 MOD 时,建议设置为“原生”。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n请记住,对于几乎所有人而言,4倍分辨率都是过度的。", - "ResolutionScaleEntryTooltip": "建议设置为整数倍,带小数的分辨率缩放倍数(例如1.5),非整数倍的缩放容易导致问题或闪退。", - "AnisotropyTooltip": "各向异性过滤等级,可以提高倾斜视角纹理的清晰度。\n当设置为“自动”时,使用游戏自身设定的等级。", - "AspectRatioTooltip": "游戏渲染窗口的宽高比。\n\n只有当游戏使用了修改宽高比的 MOD 时才需要修改这个设置,否则图像会被拉伸。\n\n如果不确定,请保持为“16:9”。", - "ShaderDumpPathTooltip": "转储图形着色器的路径", - "FileLogTooltip": "将控制台日志保存到硬盘文件,不影响性能。", - "StubLogTooltip": "在控制台中显示存根日志,不影响性能。", - "InfoLogTooltip": "在控制台中显示信息日志,不影响性能。", - "WarnLogTooltip": "在控制台中显示警告日志,不影响性能。", - "ErrorLogTooltip": "在控制台中显示错误日志,不影响性能。", - "TraceLogTooltip": "在控制台中显示跟踪日志。", - "GuestLogTooltip": "在控制台中显示访客日志,不影响性能。", - "FileAccessLogTooltip": "在控制台中显示文件访问日志。", - "FSAccessLogModeTooltip": "在控制台中显示文件系统访问日志,可选模式为 0-3。", - "DeveloperOptionTooltip": "请谨慎使用", - "OpenGlLogLevel": "需要启用适当的日志级别", - "DebugLogTooltip": "在控制台中显示调试日志。\n\n仅在特别需要时使用此功能,因为它会导致日志信息难以阅读,并降低模拟器性能。", - "LoadApplicationFileTooltip": "选择 Switch 游戏文件并加载", - "LoadApplicationFolderTooltip": "选择解包后的 Switch 游戏目录并加载", - "LoadDlcFromFolderTooltip": "打开文件资源管理器以选择一个或多个文件夹来批量加载DLC。", - "LoadTitleUpdatesFromFolderTooltip": "打开文件资源管理器以选择一个或多个文件夹来批量加载游戏更新。", - "OpenRyujinxFolderTooltip": "打开 Ryujinx 模拟器系统目录", - "OpenRyujinxLogsTooltip": "打开日志存放的目录", - "ExitTooltip": "退出 Ryujinx 模拟器", - "OpenSettingsTooltip": "打开设置窗口", - "OpenProfileManagerTooltip": "打开用户账户管理窗口", - "StopEmulationTooltip": "停止运行当前游戏,并回到主界面", - "CheckUpdatesTooltip": "检查 Ryujinx 新版本", - "OpenAboutTooltip": "打开关于窗口", - "GridSize": "网格尺寸", - "GridSizeTooltip": "调整网格项目的大小", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "巴西葡萄牙语", - "AboutRyujinxContributorsButtonHeader": "查看所有贡献者", - "SettingsTabSystemAudioVolume": "音量:", - "AudioVolumeTooltip": "调节音量", - "SettingsTabSystemEnableInternetAccess": "启用网络连接(局域网)", - "EnableInternetAccessTooltip": "允许模拟的游戏程序访问网络。\n\n当多个模拟器或实体 Switch 连接到同一个网络时,带有局域网模式的游戏便可以相互通信。\n\n即使开启此选项也无法访问 Nintendo 服务器,有可能导致某些尝试联网的游戏闪退。\n\n如果不确定,请保持关闭状态。", - "GameListContextMenuManageCheatToolTip": "管理当前游戏的金手指", - "GameListContextMenuManageCheat": "管理金手指", - "GameListContextMenuManageModToolTip": "管理当前游戏的 MOD", - "GameListContextMenuManageMod": "管理 MOD", - "ControllerSettingsStickRange": "范围:", - "DialogStopEmulationTitle": "Ryujinx - 停止模拟", - "DialogStopEmulationMessage": "确定要停止模拟?", - "SettingsTabCpu": "CPU", - "SettingsTabAudio": "音频", - "SettingsTabNetwork": "网络", - "SettingsTabNetworkConnection": "网络连接", - "SettingsTabCpuCache": "CPU 缓存", - "SettingsTabCpuMemory": "CPU 模式", - "DialogUpdaterFlatpakNotSupportedMessage": "请通过 FlatHub 更新 Ryujinx 模拟器。", - "UpdaterDisabledWarningTitle": "已禁用更新!", - "ControllerSettingsRotate90": "顺时针旋转 90°", - "IconSize": "图标尺寸", - "IconSizeTooltip": "更改游戏图标的显示尺寸", - "MenuBarOptionsShowConsole": "显示控制台", - "ShaderCachePurgeError": "清除 {0} 的着色器缓存文件时出错:{1}", - "UserErrorNoKeys": "找不到密钥Keys", - "UserErrorNoFirmware": "未安装系统固件", - "UserErrorFirmwareParsingFailed": "固件文件解析出错", - "UserErrorApplicationNotFound": "找不到游戏程序", - "UserErrorUnknown": "未知错误", - "UserErrorUndefined": "未定义错误", - "UserErrorNoKeysDescription": "Ryujinx 模拟器找不到“prod.keys”密钥文件", - "UserErrorNoFirmwareDescription": "Ryujinx 模拟器未安装 Switch 系统固件", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx 模拟器无法解密当前固件,一般是由于使用了旧版的密钥导致的。", - "UserErrorApplicationNotFoundDescription": "Ryujinx 模拟器在所选路径中找不到有效的游戏程序。", - "UserErrorUnknownDescription": "出现未知错误!", - "UserErrorUndefinedDescription": "出现未定义错误!此类错误不应出现,请联系开发者!", - "OpenSetupGuideMessage": "打开安装指南", - "NoUpdate": "无更新(默认版本)", - "TitleUpdateVersionLabel": "游戏更新的版本 {0}", - "TitleBundledUpdateVersionLabel": "捆绑:版本 {0}", - "TitleBundledDlcLabel": "捆绑:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - 信息", - "RyujinxConfirm": "Ryujinx - 确认", - "FileDialogAllTypes": "全部类型", - "Never": "从不", - "SwkbdMinCharacters": "不少于 {0} 个字符", - "SwkbdMinRangeCharacters": "必须为 {0}-{1} 个字符", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "软键盘", - "SoftwareKeyboardModeNumeric": "只能输入 0-9 或 \".\"", - "SoftwareKeyboardModeAlphabet": "仅支持非中文字符", - "SoftwareKeyboardModeASCII": "仅支持 ASCII 字符", - "ControllerAppletControllers": "支持的手柄:", - "ControllerAppletPlayers": "玩家:", - "ControllerAppletDescription": "您当前的输入配置无效。打开设置并重新设置您的输入选项。", - "ControllerAppletDocked": "已经设置为主机模式,应禁用掌机手柄操控。", - "UpdaterRenaming": "正在重命名旧文件...", - "UpdaterRenameFailed": "更新过程中无法重命名文件:{0}", - "UpdaterAddingFiles": "安装更新中...", - "UpdaterExtracting": "正在提取更新...", - "UpdaterDownloading": "下载更新中...", - "Docked": "主机模式", - "Handheld": "掌机模式", - "ConnectionError": "连接错误。", - "AboutPageDeveloperListMore": "{0} 等开发者...", - "ApiError": "API 错误。", - "LoadingHeading": "正在启动 {0}", - "CompilingPPTC": "编译 PPTC 缓存中", - "CompilingShaders": "编译着色器中", - "AllKeyboards": "所有键盘", - "OpenFileDialogTitle": "选择支持的游戏文件并加载", - "OpenFolderDialogTitle": "选择包含解包游戏的目录并加载", - "AllSupportedFormats": "所有支持的格式", - "RyujinxUpdater": "Ryujinx 更新", - "SettingsTabHotkeys": "快捷键", - "SettingsTabHotkeysHotkeys": "键盘快捷键", - "SettingsTabHotkeysToggleVsyncHotkey": "开启或关闭垂直同步:", - "SettingsTabHotkeysScreenshotHotkey": "保存截屏:", - "SettingsTabHotkeysShowUiHotkey": "隐藏菜单栏和状态栏:", - "SettingsTabHotkeysPauseHotkey": "暂停:", - "SettingsTabHotkeysToggleMuteHotkey": "静音:", - "ControllerMotionTitle": "体感设置", - "ControllerRumbleTitle": "震动设置", - "SettingsSelectThemeFileDialogTitle": "选择主题文件", - "SettingsXamlThemeFile": "Xaml 主题文件", - "AvatarWindowTitle": "管理账户 - 头像", - "Amiibo": "Amiibo", - "Unknown": "未知", - "Usage": "用法", - "Writable": "可写入", - "SelectDlcDialogTitle": "选择 DLC 文件", - "SelectUpdateDialogTitle": "选择更新文件", - "SelectModDialogTitle": "选择 MOD 目录", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "管理用户账户", - "CheatWindowTitle": "金手指管理器", - "DlcWindowTitle": "管理 {0} ({1}) 的 DLC", - "ModWindowTitle": "管理 {0} ({1}) 的 MOD", - "UpdateWindowTitle": "游戏更新管理器", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "{0} 个更新被添加", - "UpdateWindowBundledContentNotice": "游戏整合的更新无法移除,可尝试禁用。", - "CheatWindowHeading": "适用于 {0} [{1}] 的金手指", - "BuildId": "游戏版本 ID:", - "DlcWindowBundledContentNotice": "游戏整合的DLC无法移除,可尝试禁用。", - "DlcWindowHeading": "{0} 个 DLC", - "DlcWindowDlcAddedMessage": "{0} 个DLC被添加", - "AutoloadDlcAddedMessage": "{0} 个DLC被添加", - "AutoloadDlcRemovedMessage": "{0} 个失效的DLC已移除", - "AutoloadUpdateAddedMessage": "{0} 个游戏更新被添加", - "AutoloadUpdateRemovedMessage": "{0} 个失效的游戏更新已移除", - "ModWindowHeading": "{0} Mod", - "UserProfilesEditProfile": "编辑所选", - "Continue": "Continue", - "Cancel": "取消", - "Save": "保存", - "Discard": "放弃", - "Paused": "已暂停", - "UserProfilesSetProfileImage": "选择头像", - "UserProfileEmptyNameError": "必须输入名称", - "UserProfileNoImageError": "必须设置头像", - "GameUpdateWindowHeading": "管理 {0} ({1}) 的更新", - "SettingsTabHotkeysResScaleUpHotkey": "提高分辨率:", - "SettingsTabHotkeysResScaleDownHotkey": "降低分辨率:", - "UserProfilesName": "名称:", - "UserProfilesUserId": "用户 ID:", - "SettingsTabGraphicsBackend": "图形渲染引擎:", - "SettingsTabGraphicsBackendTooltip": "选择模拟器中使用的图像渲染引擎。\n\n安装了最新显卡驱动程序的所有现代显卡基本都支持 Vulkan,Vulkan 能够提供更快的着色器编译(较少的卡顿)。\n\n在旧版 Nvidia 显卡上、Linux 上的旧版 AMD 显卡,或者显存较低的显卡上,OpenGL 可能会取得更好的效果,但着色器编译更慢(更多的卡顿)。\n\n如果不确定,请设置为“Vulkan”。如果您的 GPU 已安装了最新显卡驱动程序也不支持 Vulkan,那请设置为“OpenGL”。", - "SettingsEnableTextureRecompression": "启用纹理压缩", - "SettingsEnableTextureRecompressionTooltip": "压缩 ASTC 纹理以减少 VRAM (显存)的占用。\n\n使用此纹理格式的游戏包括:异界锁链(Astral Chain),蓓优妮塔3(Bayonetta 3),火焰纹章Engage(Fire Emblem Engage),密特罗德 究极(Metroid Prime Remased),超级马力欧兄弟 惊奇(Super Mario Bros. Wonder)以及塞尔达传说 王国之泪(The Legend of Zelda: Tears of the Kingdom)。\n\n显存小于4GB的显卡在运行这些游戏时可能会偶发闪退。\n\n只有当您在上述游戏中的显存不足时才需要启用此选项。\n\n如果不确定,请保持关闭状态。", - "SettingsTabGraphicsPreferredGpu": "首选 GPU:", - "SettingsTabGraphicsPreferredGpuTooltip": "选择 Vulkan 图形引擎使用的 GPU。\n\n此选项不会影响 OpenGL 使用的 GPU。\n\n如果不确定,建议选择\"独立显卡(dGPU)\"。如果没有独立显卡,则无需改动此选项。", - "SettingsAppRequiredRestartMessage": "Ryujinx 模拟器需要重启", - "SettingsGpuBackendRestartMessage": "您修改了图形引擎或 GPU 设置,需要重启模拟器才能生效", - "SettingsGpuBackendRestartSubMessage": "是否要立即重启模拟器?", - "RyujinxUpdaterMessage": "是否更新 Ryujinx 到最新的版本?", - "SettingsTabHotkeysVolumeUpHotkey": "音量加:", - "SettingsTabHotkeysVolumeDownHotkey": "音量减:", - "SettingsEnableMacroHLE": "启用 HLE 宏加速", - "SettingsEnableMacroHLETooltip": "GPU 宏指令的高级模拟。\n\n提高性能表现,但一些游戏可能会出现图形错误。\n\n如果不确定,请保持开启状态。", - "SettingsEnableColorSpacePassthrough": "色彩空间直通", - "SettingsEnableColorSpacePassthroughTooltip": "使 Vulkan 图形引擎直接传输原始色彩信息。对于广色域 (例如 DCI-P3) 显示器的用户来说,可以产生更鲜艳的颜色,代价是损失部分色彩准确度。", - "VolumeShort": "音量", - "UserProfilesManageSaves": "管理存档", - "DeleteUserSave": "确定删除此游戏的用户存档吗?", - "IrreversibleActionNote": "删除后不可恢复。", - "SaveManagerHeading": "管理 {0} ({1}) 的存档", - "SaveManagerTitle": "存档管理器", - "Name": "名称", - "Size": "大小", - "Search": "搜索", - "UserProfilesRecoverLostAccounts": "恢复丢失的账户", - "Recover": "恢复", - "UserProfilesRecoverHeading": "找到了这些用户的存档数据", - "UserProfilesRecoverEmptyList": "没有可以恢复的用户数据", - "GraphicsAATooltip": "抗锯齿是一种图形处理技术,用于减少图像边缘的锯齿状现象,使图像更加平滑。\n\nFXAA(快速近似抗锯齿)是一种性能开销相对较小的抗锯齿方法,但可能会使得整体图像看起来有些模糊。\n\nSMAA(增强型子像素抗锯齿)则更加精细,它会尝试找到锯齿边缘并平滑它们,相比 FXAA 有更好的图像质量,但性能开销可能会稍大一些。\n\n如果开启了 FSR(FidelityFX Super Resolution,超级分辨率锐画技术)来提高性能或图像质量,不建议再启用抗锯齿,因为它们会产生不必要的图形处理开销,或者相互之间效果不协调。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“无”。", - "GraphicsAALabel": "抗锯齿:", - "GraphicsScalingFilterLabel": "缩放过滤:", - "GraphicsScalingFilterTooltip": "选择在分辨率缩放时将使用的缩放过滤器。\n\nBilinear(双线性过滤)对于3D游戏效果较好,是一个安全的默认选项。\n\nNearest(最近邻过滤)推荐用于像素艺术游戏。\n\nFSR(超级分辨率锐画)只是一个锐化过滤器,不推荐与 FXAA 或 SMAA 抗锯齿一起使用。\n\nArea(局部过滤),当渲染分辨率大于窗口实际分辨率,推荐该选项。该选项在渲染比例大于2.0的情况下,可以实现超采样的效果。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“Bilinear(双线性过滤)”。", - "GraphicsScalingFilterBilinear": "Bilinear(双线性过滤)", - "GraphicsScalingFilterNearest": "Nearest(邻近过滤)", - "GraphicsScalingFilterFsr": "FSR(超级分辨率锐画技术)", - "GraphicsScalingFilterArea": "Area(区域过滤)", - "GraphicsScalingFilterLevelLabel": "等级", - "GraphicsScalingFilterLevelTooltip": "设置 FSR 1.0 的锐化等级,数值越高,图像越锐利。", - "SmaaLow": "SMAA 低质量", - "SmaaMedium": "SMAA 中质量", - "SmaaHigh": "SMAA 高质量", - "SmaaUltra": "SMAA 超高质量", - "UserEditorTitle": "编辑用户", - "UserEditorTitleCreate": "创建用户", - "SettingsTabNetworkInterface": "网络接口:", - "NetworkInterfaceTooltip": "用于局域网(LAN)/本地网络发现(LDN)功能的网络接口。\n\n结合 VPN 或 XLink Kai 以及支持局域网功能的游戏,可以在互联网上伪造为同一网络连接。\n\n如果不确定,请保持为“默认”。", - "NetworkInterfaceDefault": "默认", - "PackagingShaders": "整合着色器中", - "AboutChangelogButton": "在 Github 上查看更新日志", - "AboutChangelogButtonTooltipMessage": "点击这里在浏览器中打开此版本的更新日志。", - "SettingsTabNetworkMultiplayer": "多人联机游玩", - "MultiplayerMode": "联机模式:", - "MultiplayerModeTooltip": "修改 LDN 多人联机游玩模式。\n\nldn_mitm 联机插件将修改游戏中的本地无线和本地游玩功能,使其表现得像局域网一样,允许和其他安装了 ldn_mitm 插件的 Ryujinx 模拟器和破解的任天堂 Switch 主机在同一网络下进行本地连接,实现多人联机游玩。\n\n多人联机游玩要求所有玩家必须运行相同的游戏版本(例如,游戏版本 v13.0.1 无法与 v13.0.0 联机)。\n\n如果不确定,请保持为“禁用”。", - "MultiplayerModeDisabled": "禁用", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Locales/zh_TW.json b/src/Ryujinx/Assets/Locales/zh_TW.json deleted file mode 100644 index 792ced42b..000000000 --- a/src/Ryujinx/Assets/Locales/zh_TW.json +++ /dev/null @@ -1,880 +0,0 @@ -{ - "Language": "繁體中文 (台灣)", - "MenuBarFileOpenApplet": "開啟小程式", - "MenuBarFileOpenAppletOpenMiiApplet": "Mii Edit Applet", - "MenuBarFileOpenAppletOpenMiiAppletToolTip": "在獨立模式下開啟 Mii 編輯器小程式", - "SettingsTabInputDirectMouseAccess": "滑鼠直接存取", - "SettingsTabSystemMemoryManagerMode": "記憶體管理員模式:", - "SettingsTabSystemMemoryManagerModeSoftware": "軟體模式", - "SettingsTabSystemMemoryManagerModeHost": "主體模式 (快速)", - "SettingsTabSystemMemoryManagerModeHostUnchecked": "主體略過檢查模式 (最快,不安全)", - "SettingsTabSystemUseHypervisor": "使用 Hypervisor", - "MenuBarFile": "檔案(_F)", - "MenuBarFileOpenFromFile": "從檔案載入應用程式(_L)", - "MenuBarFileOpenFromFileError": "未能從已選擇的檔案中找到應用程式。", - "MenuBarFileOpenUnpacked": "載入未封裝的遊戲(_U)", - "MenuBarFileLoadDlcFromFolder": "從資料夾中載入 DLC", - "MenuBarFileLoadTitleUpdatesFromFolder": "從資料夾中載入遊戲更新", - "MenuBarFileOpenEmuFolder": "開啟 Ryujinx 資料夾", - "MenuBarFileOpenLogsFolder": "開啟日誌資料夾", - "MenuBarFileExit": "結束(_E)", - "MenuBarOptions": "選項(_O)", - "MenuBarOptionsToggleFullscreen": "切換全螢幕模式", - "MenuBarOptionsStartGamesInFullscreen": "使用全螢幕模式啟動遊戲", - "MenuBarOptionsStopEmulation": "停止模擬", - "MenuBarOptionsSettings": "設定(_S)", - "MenuBarOptionsManageUserProfiles": "管理使用者設定檔(_M)", - "MenuBarActions": "動作(_A)", - "MenuBarOptionsSimulateWakeUpMessage": "模擬喚醒訊息", - "MenuBarActionsScanAmiibo": "掃描 Amiibo", - "MenuBarTools": "工具(_T)", - "MenuBarToolsInstallFirmware": "安裝韌體", - "MenuBarFileToolsInstallFirmwareFromFile": "從 XCI 或 ZIP 安裝韌體", - "MenuBarFileToolsInstallFirmwareFromDirectory": "從資料夾安裝韌體", - "MenuBarToolsInstallKeys": "Install Keys", - "MenuBarFileToolsInstallKeysFromFile": "Install keys from KEYS or ZIP", - "MenuBarFileToolsInstallKeysFromFolder": "Install keys from a directory", - "MenuBarToolsManageFileTypes": "管理檔案類型", - "MenuBarToolsInstallFileTypes": "安裝檔案類型", - "MenuBarToolsUninstallFileTypes": "移除檔案類型", - "MenuBarToolsXCITrimmer": "Trim XCI Files", - "MenuBarView": "檢視(_V)", - "MenuBarViewWindow": "視窗大小", - "MenuBarViewWindow720": "720p", - "MenuBarViewWindow1080": "1080p", - "MenuBarHelp": "說明(_H)", - "MenuBarHelpCheckForUpdates": "檢查更新", - "MenuBarHelpAbout": "關於", - "MenuSearch": "搜尋...", - "GameListHeaderFavorite": "我的最愛", - "GameListHeaderIcon": "圖示", - "GameListHeaderApplication": "名稱", - "GameListHeaderDeveloper": "開發者", - "GameListHeaderVersion": "版本", - "GameListHeaderTimePlayed": "遊玩時數", - "GameListHeaderLastPlayed": "最近遊玩", - "GameListHeaderFileExtension": "副檔名", - "GameListHeaderFileSize": "檔案大小", - "GameListHeaderPath": "路徑", - "GameListContextMenuOpenUserSaveDirectory": "開啟使用者存檔資料夾", - "GameListContextMenuOpenUserSaveDirectoryToolTip": "開啟此應用程式的使用者存檔資料夾", - "GameListContextMenuOpenDeviceSaveDirectory": "開啟裝置存檔資料夾", - "GameListContextMenuOpenDeviceSaveDirectoryToolTip": "開啟此應用程式的裝置存檔資料夾", - "GameListContextMenuOpenBcatSaveDirectory": "開啟 BCAT 存檔資料夾", - "GameListContextMenuOpenBcatSaveDirectoryToolTip": "開啟此應用程式的 BCAT 存檔資料夾", - "GameListContextMenuManageTitleUpdates": "管理遊戲更新", - "GameListContextMenuManageTitleUpdatesToolTip": "開啟遊戲更新管理視窗", - "GameListContextMenuManageDlc": "管理 DLC", - "GameListContextMenuManageDlcToolTip": "開啟 DLC 管理視窗", - "GameListContextMenuCacheManagement": "快取管理", - "GameListContextMenuCacheManagementPurgePptc": "佇列 PPTC 重建", - "GameListContextMenuCacheManagementPurgePptcToolTip": "下一次啟動遊戲時,觸發 PPTC 進行重建", - "GameListContextMenuCacheManagementPurgeShaderCache": "清除著色器快取", - "GameListContextMenuCacheManagementPurgeShaderCacheToolTip": "刪除應用程式的著色器快取", - "GameListContextMenuCacheManagementOpenPptcDirectory": "開啟 PPTC 資料夾", - "GameListContextMenuCacheManagementOpenPptcDirectoryToolTip": "開啟此應用程式的 PPTC 快取資料夾", - "GameListContextMenuCacheManagementOpenShaderCacheDirectory": "開啟著色器快取資料夾", - "GameListContextMenuCacheManagementOpenShaderCacheDirectoryToolTip": "開啟此應用程式的著色器快取資料夾", - "GameListContextMenuExtractData": "提取資料", - "GameListContextMenuExtractDataExeFS": "ExeFS", - "GameListContextMenuExtractDataExeFSToolTip": "從應用程式的目前配置中提取 ExeFS 分區 (包含更新)", - "GameListContextMenuExtractDataRomFS": "RomFS", - "GameListContextMenuExtractDataRomFSToolTip": "從應用程式的目前配置中提取 RomFS 分區 (包含更新)", - "GameListContextMenuExtractDataLogo": "Logo", - "GameListContextMenuExtractDataLogoToolTip": "從應用程式的目前配置中提取 Logo 分區 (包含更新)", - "GameListContextMenuCreateShortcut": "建立應用程式捷徑", - "GameListContextMenuCreateShortcutToolTip": "建立桌面捷徑,啟動選取的應用程式", - "GameListContextMenuCreateShortcutToolTipMacOS": "在 macOS 的應用程式資料夾中建立捷徑,啟動選取的應用程式", - "GameListContextMenuOpenModsDirectory": "開啟模組資料夾", - "GameListContextMenuOpenModsDirectoryToolTip": "開啟此應用程式模組的資料夾", - "GameListContextMenuOpenSdModsDirectory": "開啟 Atmosphere 模組資料夾", - "GameListContextMenuOpenSdModsDirectoryToolTip": "開啟此應用程式模組的另一個 SD 卡 Atmosphere 資料夾。適用於為真實硬體封裝的模組。", - "GameListContextMenuTrimXCI": "Check and Trim XCI File", - "GameListContextMenuTrimXCIToolTip": "Check and Trim XCI File to Save Disk Space", - "StatusBarGamesLoaded": "{0}/{1} 遊戲已載入", - "StatusBarSystemVersion": "系統版本: {0}", - "StatusBarXCIFileTrimming": "Trimming XCI File '{0}'", - "LinuxVmMaxMapCountDialogTitle": "檢測到記憶體映射的低限值", - "LinuxVmMaxMapCountDialogTextPrimary": "您是否要將 vm.max_map_count 的數值增至 {0}?", - "LinuxVmMaxMapCountDialogTextSecondary": "某些遊戲可能會嘗試建立超過目前允許的記憶體映射。一旦超過此限制,Ryujinx 就會崩潰。", - "LinuxVmMaxMapCountDialogButtonUntilRestart": "是的,直到下次重新啟動", - "LinuxVmMaxMapCountDialogButtonPersistent": "是的,永久設定", - "LinuxVmMaxMapCountWarningTextPrimary": "記憶體映射的最大值低於建議值。", - "LinuxVmMaxMapCountWarningTextSecondary": "目前 vm.max_map_count ({0}) 的數值小於 {1}。某些遊戲可能會嘗試建立比目前允許值更多的記憶體映射。一旦超過此限制,Ryujinx 就會崩潰。\n\n您可能需要手動提高上限,或者安裝 pkexec,讓 Ryujinx 協助提高上限。", - "Settings": "設定", - "SettingsTabGeneral": "使用者介面", - "SettingsTabGeneralGeneral": "一般", - "SettingsTabGeneralEnableDiscordRichPresence": "啟用 Discord 動態狀態展示", - "SettingsTabGeneralCheckUpdatesOnLaunch": "啟動時檢查更新", - "SettingsTabGeneralShowConfirmExitDialog": "顯示「確認結束」對話方塊", - "SettingsTabGeneralRememberWindowState": "記住視窗大小/位置", - "SettingsTabGeneralShowTitleBar": "顯示「標題列」 (需要重新開啟Ryujinx)", - "SettingsTabGeneralHideCursor": "隱藏滑鼠游標:", - "SettingsTabGeneralHideCursorNever": "從不", - "SettingsTabGeneralHideCursorOnIdle": "閒置時", - "SettingsTabGeneralHideCursorAlways": "總是", - "SettingsTabGeneralGameDirectories": "遊戲資料夾", - "SettingsTabGeneralAutoloadDirectories": "自動載入 DLC/遊戲更新資料夾", - "SettingsTabGeneralAutoloadNote": "遺失的 DLC 及遊戲更新檔案將會在自動載入中移除", - "SettingsTabGeneralAdd": "新增", - "SettingsTabGeneralRemove": "刪除", - "SettingsTabSystem": "系統", - "SettingsTabSystemCore": "核心", - "SettingsTabSystemSystemRegion": "系統區域:", - "SettingsTabSystemSystemRegionJapan": "日本", - "SettingsTabSystemSystemRegionUSA": "美國", - "SettingsTabSystemSystemRegionEurope": "歐洲", - "SettingsTabSystemSystemRegionAustralia": "澳洲", - "SettingsTabSystemSystemRegionChina": "中國", - "SettingsTabSystemSystemRegionKorea": "韓國", - "SettingsTabSystemSystemRegionTaiwan": "台灣 (中華民國)", - "SettingsTabSystemSystemLanguage": "系統語言:", - "SettingsTabSystemSystemLanguageJapanese": "日文", - "SettingsTabSystemSystemLanguageAmericanEnglish": "英文 (美國)", - "SettingsTabSystemSystemLanguageFrench": "法文", - "SettingsTabSystemSystemLanguageGerman": "德文", - "SettingsTabSystemSystemLanguageItalian": "義大利文", - "SettingsTabSystemSystemLanguageSpanish": "西班牙文", - "SettingsTabSystemSystemLanguageChinese": "中文 (中國)", - "SettingsTabSystemSystemLanguageKorean": "韓文", - "SettingsTabSystemSystemLanguageDutch": "荷蘭文", - "SettingsTabSystemSystemLanguagePortuguese": "葡萄牙文", - "SettingsTabSystemSystemLanguageRussian": "俄文", - "SettingsTabSystemSystemLanguageTaiwanese": "中文 (台灣)", - "SettingsTabSystemSystemLanguageBritishEnglish": "英文 (英國)", - "SettingsTabSystemSystemLanguageCanadianFrench": "加拿大法文", - "SettingsTabSystemSystemLanguageLatinAmericanSpanish": "美洲西班牙文", - "SettingsTabSystemSystemLanguageSimplifiedChinese": "簡體中文", - "SettingsTabSystemSystemLanguageTraditionalChinese": "正體中文 (建議)", - "SettingsTabSystemSystemTimeZone": "系統時區:", - "SettingsTabSystemSystemTime": "系統時鐘:", - "SettingsTabSystemEnableVsync": "垂直同步", - "SettingsTabSystemEnablePptc": "PPTC (剖析式持久轉譯快取, Profiled Persistent Translation Cache)", - "SettingsTabSystemEnableLowPowerPptc": "低功耗 PPTC", - "SettingsTabSystemEnableFsIntegrityChecks": "檔案系統完整性檢查", - "SettingsTabSystemAudioBackend": "音效後端:", - "SettingsTabSystemAudioBackendDummy": "虛設 (Dummy)", - "SettingsTabSystemAudioBackendOpenAL": "OpenAL", - "SettingsTabSystemAudioBackendSoundIO": "SoundIO", - "SettingsTabSystemAudioBackendSDL2": "SDL2", - "SettingsTabSystemHacks": "補釘修正", - "SettingsTabSystemHacksNote": "可能導致模擬器不穩定", - "SettingsTabSystemDramSize": "使用替代的記憶體配置 (開發者專用)", - "SettingsTabSystemDramSize4GiB": "4GiB", - "SettingsTabSystemDramSize6GiB": "6GiB", - "SettingsTabSystemDramSize8GiB": "8GiB", - "SettingsTabSystemDramSize12GiB": "12GiB", - "SettingsTabSystemIgnoreMissingServices": "忽略缺少的模擬器功能", - "SettingsTabSystemIgnoreApplet": "忽略小程式", - "SettingsTabGraphics": "圖形", - "SettingsTabGraphicsAPI": "圖形 API", - "SettingsTabGraphicsEnableShaderCache": "啟用著色器快取", - "SettingsTabGraphicsAnisotropicFiltering": "各向異性過濾:", - "SettingsTabGraphicsAnisotropicFilteringAuto": "自動", - "SettingsTabGraphicsAnisotropicFiltering2x": "2 倍", - "SettingsTabGraphicsAnisotropicFiltering4x": "4 倍", - "SettingsTabGraphicsAnisotropicFiltering8x": "8 倍", - "SettingsTabGraphicsAnisotropicFiltering16x": "16 倍", - "SettingsTabGraphicsResolutionScale": "解析度比例:", - "SettingsTabGraphicsResolutionScaleCustom": "自訂 (不建議使用)", - "SettingsTabGraphicsResolutionScaleNative": "原生 (720p/1080p)", - "SettingsTabGraphicsResolutionScale2x": "2 倍 (1440p/2160p)", - "SettingsTabGraphicsResolutionScale3x": "3 倍 (2160p/3240p)", - "SettingsTabGraphicsResolutionScale4x": "4 倍 (2880p/4320p) (不建議使用)", - "SettingsTabGraphicsAspectRatio": "顯示長寬比例:", - "SettingsTabGraphicsAspectRatio4x3": "4:3", - "SettingsTabGraphicsAspectRatio16x9": "16:9", - "SettingsTabGraphicsAspectRatio16x10": "16:10", - "SettingsTabGraphicsAspectRatio21x9": "21:9", - "SettingsTabGraphicsAspectRatio32x9": "32:9", - "SettingsTabGraphicsAspectRatioStretch": "拉伸以適應視窗", - "SettingsTabGraphicsDeveloperOptions": "開發者選項", - "SettingsTabGraphicsShaderDumpPath": "圖形著色器傾印路徑:", - "SettingsTabLogging": "日誌", - "SettingsTabLoggingLogging": "日誌", - "SettingsTabLoggingEnableLoggingToFile": "啟用日誌到檔案", - "SettingsTabLoggingEnableStubLogs": "啟用 Stub 日誌", - "SettingsTabLoggingEnableInfoLogs": "啟用資訊日誌", - "SettingsTabLoggingEnableWarningLogs": "啟用警告日誌", - "SettingsTabLoggingEnableErrorLogs": "啟用錯誤日誌", - "SettingsTabLoggingEnableTraceLogs": "啟用追蹤日誌", - "SettingsTabLoggingEnableGuestLogs": "啟用客體日誌", - "SettingsTabLoggingEnableFsAccessLogs": "啟用檔案系統存取日誌", - "SettingsTabLoggingFsGlobalAccessLogMode": "檔案系統全域存取日誌模式:", - "SettingsTabLoggingDeveloperOptions": "開發者選項", - "SettingsTabLoggingDeveloperOptionsNote": "警告: 會降低效能", - "SettingsTabLoggingGraphicsBackendLogLevel": "圖形後端日誌等級:", - "SettingsTabLoggingGraphicsBackendLogLevelNone": "無", - "SettingsTabLoggingGraphicsBackendLogLevelError": "錯誤", - "SettingsTabLoggingGraphicsBackendLogLevelPerformance": "減速", - "SettingsTabLoggingGraphicsBackendLogLevelAll": "全部", - "SettingsTabLoggingEnableDebugLogs": "啟用偵錯日誌", - "SettingsTabInput": "輸入", - "SettingsTabInputEnableDockedMode": "底座模式", - "SettingsTabInputDirectKeyboardAccess": "鍵盤直接存取", - "SettingsButtonSave": "儲存", - "SettingsButtonClose": "關閉", - "SettingsButtonOk": "確定", - "SettingsButtonCancel": "取消", - "SettingsButtonApply": "套用", - "ControllerSettingsPlayer": "玩家", - "ControllerSettingsPlayer1": "玩家 1", - "ControllerSettingsPlayer2": "玩家 2", - "ControllerSettingsPlayer3": "玩家 3", - "ControllerSettingsPlayer4": "玩家 4", - "ControllerSettingsPlayer5": "玩家 5", - "ControllerSettingsPlayer6": "玩家 6", - "ControllerSettingsPlayer7": "玩家 7", - "ControllerSettingsPlayer8": "玩家 8", - "ControllerSettingsHandheld": "手提模式", - "ControllerSettingsInputDevice": "輸入裝置", - "ControllerSettingsRefresh": "重新整理", - "ControllerSettingsDeviceDisabled": "已停用", - "ControllerSettingsControllerType": "控制器類型", - "ControllerSettingsControllerTypeHandheld": "手提模式", - "ControllerSettingsControllerTypeProController": "Pro 控制器", - "ControllerSettingsControllerTypeJoyConPair": "雙 JoyCon", - "ControllerSettingsControllerTypeJoyConLeft": "左 JoyCon", - "ControllerSettingsControllerTypeJoyConRight": "右 JoyCon", - "ControllerSettingsProfile": "設定檔", - "ControllerSettingsProfileDefault": "預設", - "ControllerSettingsLoad": "載入", - "ControllerSettingsAdd": "新增", - "ControllerSettingsRemove": "刪除", - "ControllerSettingsButtons": "按鍵", - "ControllerSettingsButtonA": "A", - "ControllerSettingsButtonB": "B", - "ControllerSettingsButtonX": "X", - "ControllerSettingsButtonY": "Y", - "ControllerSettingsButtonPlus": "+", - "ControllerSettingsButtonMinus": "-", - "ControllerSettingsDPad": "方向鍵", - "ControllerSettingsDPadUp": "上", - "ControllerSettingsDPadDown": "下", - "ControllerSettingsDPadLeft": "左", - "ControllerSettingsDPadRight": "右", - "ControllerSettingsStickButton": "按鍵", - "ControllerSettingsStickUp": "上", - "ControllerSettingsStickDown": "下", - "ControllerSettingsStickLeft": "左", - "ControllerSettingsStickRight": "右", - "ControllerSettingsStickStick": "搖桿", - "ControllerSettingsStickInvertXAxis": "搖桿左右反向", - "ControllerSettingsStickInvertYAxis": "搖桿上下反向", - "ControllerSettingsStickDeadzone": "無感帶:", - "ControllerSettingsLStick": "左搖桿", - "ControllerSettingsRStick": "右搖桿", - "ControllerSettingsTriggersLeft": "左扳機", - "ControllerSettingsTriggersRight": "右扳機", - "ControllerSettingsTriggersButtonsLeft": "左扳機鍵", - "ControllerSettingsTriggersButtonsRight": "右扳機鍵", - "ControllerSettingsTriggers": "板機", - "ControllerSettingsTriggerL": "L", - "ControllerSettingsTriggerR": "R", - "ControllerSettingsTriggerZL": "ZL", - "ControllerSettingsTriggerZR": "ZR", - "ControllerSettingsLeftSL": "SL", - "ControllerSettingsLeftSR": "SR", - "ControllerSettingsRightSL": "SL", - "ControllerSettingsRightSR": "SR", - "ControllerSettingsExtraButtonsLeft": "左背鍵", - "ControllerSettingsExtraButtonsRight": "右背鍵", - "ControllerSettingsMisc": "其他", - "ControllerSettingsTriggerThreshold": "扳機閾值:", - "ControllerSettingsMotion": "體感", - "ControllerSettingsMotionUseCemuhookCompatibleMotion": "使用與 CemuHook 相容的體感", - "ControllerSettingsMotionControllerSlot": "控制器插槽:", - "ControllerSettingsMotionMirrorInput": "鏡像輸入", - "ControllerSettingsMotionRightJoyConSlot": "右 JoyCon 插槽:", - "ControllerSettingsMotionServerHost": "伺服器主機位址:", - "ControllerSettingsMotionGyroSensitivity": "陀螺儀靈敏度:", - "ControllerSettingsMotionGyroDeadzone": "陀螺儀無感帶:", - "ControllerSettingsSave": "儲存", - "ControllerSettingsClose": "關閉", - "KeyUnknown": "未知", - "KeyShiftLeft": "左 Shift", - "KeyShiftRight": "右 Shift", - "KeyControlLeft": "左 Ctrl", - "KeyMacControlLeft": "左 ⌃", - "KeyControlRight": "右 Ctrl", - "KeyMacControlRight": "右 ⌃", - "KeyAltLeft": "左 Alt", - "KeyMacAltLeft": "左 ⌥", - "KeyAltRight": "右 Alt", - "KeyMacAltRight": "右 ⌥", - "KeyWinLeft": "左 ⊞", - "KeyMacWinLeft": "左 ⌘", - "KeyWinRight": "右 ⊞", - "KeyMacWinRight": "右 ⌘", - "KeyMenu": "功能表", - "KeyUp": "上", - "KeyDown": "下", - "KeyLeft": "左", - "KeyRight": "右", - "KeyEnter": "Enter 鍵", - "KeyEscape": "Esc 鍵", - "KeySpace": "空白鍵", - "KeyTab": "Tab 鍵", - "KeyBackSpace": "Backspace 鍵", - "KeyInsert": "Insert 鍵", - "KeyDelete": "Delete 鍵", - "KeyPageUp": "向上捲頁鍵", - "KeyPageDown": "向下捲頁鍵", - "KeyHome": "Home 鍵", - "KeyEnd": "End 鍵", - "KeyCapsLock": "Caps Lock 鍵", - "KeyScrollLock": "Scroll Lock 鍵", - "KeyPrintScreen": "Print Screen 鍵", - "KeyPause": "Pause 鍵", - "KeyNumLock": "Num Lock 鍵", - "KeyClear": "清除", - "KeyKeypad0": "數字鍵 0", - "KeyKeypad1": "數字鍵 1", - "KeyKeypad2": "數字鍵 2", - "KeyKeypad3": "數字鍵 3", - "KeyKeypad4": "數字鍵 4", - "KeyKeypad5": "數字鍵 5", - "KeyKeypad6": "數字鍵 6", - "KeyKeypad7": "數字鍵 7", - "KeyKeypad8": "數字鍵 8", - "KeyKeypad9": "數字鍵 9", - "KeyKeypadDivide": "數字鍵除號", - "KeyKeypadMultiply": "數字鍵乘號", - "KeyKeypadSubtract": "數字鍵減號", - "KeyKeypadAdd": "數字鍵加號", - "KeyKeypadDecimal": "數字鍵小數點", - "KeyKeypadEnter": "數字鍵 Enter", - "KeyNumber0": "0", - "KeyNumber1": "1", - "KeyNumber2": "2", - "KeyNumber3": "3", - "KeyNumber4": "4", - "KeyNumber5": "5", - "KeyNumber6": "6", - "KeyNumber7": "7", - "KeyNumber8": "8", - "KeyNumber9": "9", - "KeyTilde": "~", - "KeyGrave": "`", - "KeyMinus": "-", - "KeyPlus": "+", - "KeyBracketLeft": "[", - "KeyBracketRight": "]", - "KeySemicolon": ";", - "KeyQuote": "\"", - "KeyComma": ",", - "KeyPeriod": ".", - "KeySlash": "/", - "KeyBackSlash": "\\", - "KeyUnbound": "未分配", - "GamepadLeftStick": "左搖桿按鍵", - "GamepadRightStick": "右搖桿按鍵", - "GamepadLeftShoulder": "左肩鍵", - "GamepadRightShoulder": "右肩鍵", - "GamepadLeftTrigger": "左扳機", - "GamepadRightTrigger": "右扳機", - "GamepadDpadUp": "上", - "GamepadDpadDown": "下", - "GamepadDpadLeft": "左", - "GamepadDpadRight": "右", - "GamepadMinus": "-", - "GamepadPlus": "+", - "GamepadGuide": "快顯功能表鍵", - "GamepadMisc1": "其他按鍵", - "GamepadPaddle1": "其他按鍵 1", - "GamepadPaddle2": "其他按鍵 2", - "GamepadPaddle3": "其他按鍵 3", - "GamepadPaddle4": "其他按鍵 4", - "GamepadTouchpad": "觸控板", - "GamepadSingleLeftTrigger0": "左扳機 0", - "GamepadSingleRightTrigger0": "右扳機 0", - "GamepadSingleLeftTrigger1": "左扳機 1", - "GamepadSingleRightTrigger1": "右扳機 1", - "StickLeft": "左搖桿", - "StickRight": "右搖桿", - "UserProfilesSelectedUserProfile": "選取的使用者設定檔:", - "UserProfilesSaveProfileName": "儲存設定檔名稱", - "UserProfilesChangeProfileImage": "變更設定檔圖像", - "UserProfilesAvailableUserProfiles": "可用的使用者設定檔:", - "UserProfilesAddNewProfile": "建立設定檔", - "UserProfilesDelete": "刪除", - "UserProfilesClose": "關閉", - "ProfileNameSelectionWatermark": "選擇暱稱", - "ProfileImageSelectionTitle": "設定檔圖像選取", - "ProfileImageSelectionHeader": "選擇設定檔圖像", - "ProfileImageSelectionNote": "您可以匯入自訂的設定檔圖像,或從系統韌體中選取大頭貼。", - "ProfileImageSelectionImportImage": "匯入圖像檔案", - "ProfileImageSelectionSelectAvatar": "選取韌體大頭貼", - "InputDialogTitle": "輸入對話方塊", - "InputDialogOk": "確定", - "InputDialogCancel": "取消", - "InputDialogCancelling": "Cancelling", - "InputDialogClose": "Close", - "InputDialogAddNewProfileTitle": "選擇設定檔名稱", - "InputDialogAddNewProfileHeader": "請輸入設定檔名稱", - "InputDialogAddNewProfileSubtext": "(最大長度: {0})", - "AvatarChoose": "選擇大頭貼", - "AvatarSetBackgroundColor": "設定背景顏色", - "AvatarClose": "關閉", - "ControllerSettingsLoadProfileToolTip": "載入設定檔", - "ControllerSettingsViewProfileToolTip": "View Profile", - "ControllerSettingsAddProfileToolTip": "新增設定檔", - "ControllerSettingsRemoveProfileToolTip": "刪除設定檔", - "ControllerSettingsSaveProfileToolTip": "儲存設定檔", - "MenuBarFileToolsTakeScreenshot": "儲存擷取畫面", - "MenuBarFileToolsHideUi": "隱藏 UI", - "GameListContextMenuRunApplication": "執行應用程式", - "GameListContextMenuToggleFavorite": "加入/移除為我的最愛", - "GameListContextMenuToggleFavoriteToolTip": "切換遊戲的我的最愛狀態", - "SettingsTabGeneralTheme": "佈景主題:", - "SettingsTabGeneralThemeAuto": "自動", - "SettingsTabGeneralThemeDark": "深色", - "SettingsTabGeneralThemeLight": "淺色", - "ControllerSettingsConfigureGeneral": "配置", - "ControllerSettingsRumble": "震動", - "ControllerSettingsRumbleStrongMultiplier": "強震動調節", - "ControllerSettingsRumbleWeakMultiplier": "弱震動調節", - "DialogMessageSaveNotAvailableMessage": "沒有 {0} [{1:x16}] 的存檔", - "DialogMessageSaveNotAvailableCreateSaveMessage": "您想為這款遊戲建立存檔嗎?", - "DialogConfirmationTitle": "Ryujinx - 確認", - "DialogUpdaterTitle": "Ryujinx - 更新程式", - "DialogErrorTitle": "Ryujinx - 錯誤", - "DialogWarningTitle": "Ryujinx - 警告", - "DialogExitTitle": "Ryujinx - 結束", - "DialogErrorMessage": "Ryujinx 遇到了錯誤", - "DialogExitMessage": "您確定要關閉 Ryujinx 嗎?", - "DialogExitSubMessage": "所有未儲存的資料將會遺失!", - "DialogMessageCreateSaveErrorMessage": "建立指定的存檔時出現錯誤: {0}", - "DialogMessageFindSaveErrorMessage": "尋找指定的存檔時出現錯誤: {0}", - "FolderDialogExtractTitle": "選擇要解壓到的資料夾", - "DialogNcaExtractionMessage": "從 {1} 提取 {0} 分區...", - "DialogNcaExtractionTitle": "NCA 分區提取器", - "DialogNcaExtractionMainNcaNotFoundErrorMessage": "提取失敗。所選檔案中不存在主 NCA 檔案。", - "DialogNcaExtractionCheckLogErrorMessage": "提取失敗。請閱讀日誌檔案了解更多資訊。", - "DialogNcaExtractionSuccessMessage": "提取成功。", - "DialogUpdaterConvertFailedMessage": "無法轉換目前的 Ryujinx 版本。", - "DialogUpdaterCancelUpdateMessage": "取消更新!", - "DialogUpdaterAlreadyOnLatestVersionMessage": "您已經在使用最新版本的 Ryujinx!", - "DialogUpdaterFailedToGetVersionMessage": "嘗試從 GitHub Release 取得發布資訊時發生錯誤。如果 GitHub Actions 正在編譯新版本,則可能會出現這種情況。請幾分鐘後再試一次。", - "DialogUpdaterConvertFailedGithubMessage": "無法轉換從 Github Release 接收到的 Ryujinx 版本。", - "DialogUpdaterDownloadingMessage": "正在下載更新...", - "DialogUpdaterExtractionMessage": "正在提取更新...", - "DialogUpdaterRenamingMessage": "重新命名更新...", - "DialogUpdaterAddingFilesMessage": "加入新更新...", - "DialogUpdaterShowChangelogMessage": "Show Changelog", - "DialogUpdaterCompleteMessage": "更新成功!", - "DialogUpdaterRestartMessage": "您現在要重新啟動 Ryujinx 嗎?", - "DialogUpdaterNoInternetMessage": "您沒有連線到網際網路!", - "DialogUpdaterNoInternetSubMessage": "請確認您的網際網路連線正常!", - "DialogUpdaterDirtyBuildMessage": "您無法更新非官方版本的 Ryujinx!", - "DialogUpdaterDirtyBuildSubMessage": "如果您正在尋找受官方支援的版本,請從 https://ryujinx.app/download 下載 Ryujinx。", - "DialogRestartRequiredMessage": "需要重新啟動", - "DialogThemeRestartMessage": "佈景主題設定已儲存。需要重新啟動才能套用主題。", - "DialogThemeRestartSubMessage": "您要重新啟動嗎", - "DialogFirmwareInstallEmbeddedMessage": "您想安裝遊戲內建的韌體嗎? (韌體 {0})", - "DialogFirmwareInstallEmbeddedSuccessMessage": "未找到已安裝的韌體,但 Ryujinx 可以從現有的遊戲安裝韌體{0}。\n模擬器現在可以執行。", - "DialogFirmwareNoFirmwareInstalledMessage": "未安裝韌體", - "DialogFirmwareInstalledMessage": "已安裝韌體{0}", - "DialogInstallFileTypesSuccessMessage": "成功安裝檔案類型!", - "DialogInstallFileTypesErrorMessage": "無法安裝檔案類型。", - "DialogUninstallFileTypesSuccessMessage": "成功移除檔案類型!", - "DialogUninstallFileTypesErrorMessage": "無法移除檔案類型。", - "DialogOpenSettingsWindowLabel": "開啟設定視窗", - "DialogOpenXCITrimmerWindowLabel": "XCI Trimmer Window", - "DialogControllerAppletTitle": "控制器小程式", - "DialogMessageDialogErrorExceptionMessage": "顯示訊息對話方塊時出現錯誤: {0}", - "DialogSoftwareKeyboardErrorExceptionMessage": "顯示軟體鍵盤時出現錯誤: {0}", - "DialogErrorAppletErrorExceptionMessage": "顯示錯誤對話方塊時出現錯誤: {0}", - "DialogUserErrorDialogMessage": "{0}: {1}", - "DialogUserErrorDialogInfoMessage": "\n有關如何修復此錯誤的更多資訊,請參閱我們的設定指南。", - "DialogUserErrorDialogTitle": "Ryujinx 錯誤 ({0})", - "DialogAmiiboApiTitle": "Amiibo API", - "DialogAmiiboApiFailFetchMessage": "從 API 取得資訊時出現錯誤。", - "DialogAmiiboApiConnectErrorMessage": "無法連接 Amiibo API 伺服器。服務可能已停機,或者您可能需要確認網際網路連線是否在線上。", - "DialogProfileInvalidProfileErrorMessage": "設定檔 {0} 與目前輸入配置系統不相容。", - "DialogProfileDefaultProfileOverwriteErrorMessage": "無法覆蓋預設設定檔", - "DialogProfileDeleteProfileTitle": "刪除設定檔", - "DialogProfileDeleteProfileMessage": "此動作不可復原,您確定要繼續嗎?", - "DialogWarning": "警告", - "DialogPPTCDeletionMessage": "您將在下一次啟動時佇列重建以下遊戲的 PPTC:\n\n{0}\n\n您確定要繼續嗎?", - "DialogPPTCDeletionErrorMessage": "在 {0} 清除 PPTC 快取時出錯: {1}", - "DialogShaderDeletionMessage": "您將刪除以下遊戲的著色器快取:\n\n{0}\n\n您確定要繼續嗎?", - "DialogShaderDeletionErrorMessage": "在 {0} 清除著色器快取時出錯: {1}", - "DialogRyujinxErrorMessage": "Ryujinx 遇到錯誤", - "DialogInvalidTitleIdErrorMessage": "UI 錯誤: 所選遊戲沒有有效的遊戲 ID", - "DialogFirmwareInstallerFirmwareNotFoundErrorMessage": "在 {0} 中未發現有效的系統韌體。", - "DialogFirmwareInstallerFirmwareInstallTitle": "安裝韌體 {0}", - "DialogFirmwareInstallerFirmwareInstallMessage": "將安裝系統版本 {0}。", - "DialogFirmwareInstallerFirmwareInstallSubMessage": "\n\n這將取代目前的系統版本 {0}。", - "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\n您確定要繼續嗎?", - "DialogFirmwareInstallerFirmwareInstallWaitMessage": "正在安裝韌體...", - "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "成功安裝系統版本 {0}。", - "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}", - "DialogKeysInstallerKeysInstallTitle": "Install Keys", - "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", - "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.", - "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", - "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", - "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", - "DialogUserProfileDeletionWarningMessage": "如果刪除選取的設定檔,將無法開啟其他設定檔", - "DialogUserProfileDeletionConfirmMessage": "您是否要刪除所選設定檔", - "DialogUserProfileUnsavedChangesTitle": "警告 - 未儲存的變更", - "DialogUserProfileUnsavedChangesMessage": "您對該使用者設定檔所做的變更尚未儲存。", - "DialogUserProfileUnsavedChangesSubMessage": "您確定要放棄變更嗎?", - "DialogControllerSettingsModifiedConfirmMessage": "目前控制器設定已更新。", - "DialogControllerSettingsModifiedConfirmSubMessage": "您想要儲存嗎?", - "DialogLoadFileErrorMessage": "{0}。出錯檔案: {1}", - "DialogModAlreadyExistsMessage": "模組已經存在", - "DialogModInvalidMessage": "指定資料夾不包含模組!", - "DialogModDeleteNoParentMessage": "刪除失敗: 無法找到模組「{0}」的父資料夾!", - "DialogDlcNoDlcErrorMessage": "指定檔案不包含所選遊戲的 DLC!", - "DialogPerformanceCheckLoggingEnabledMessage": "您已啟用追蹤日誌,該功能僅供開發者使用。", - "DialogPerformanceCheckLoggingEnabledConfirmMessage": "為獲得最佳效能,建議停用追蹤日誌。您是否要立即停用追蹤日誌嗎?", - "DialogPerformanceCheckShaderDumpEnabledMessage": "您已啟用著色器傾印,該功能僅供開發者使用。", - "DialogPerformanceCheckShaderDumpEnabledConfirmMessage": "為獲得最佳效能,建議停用著色器傾印。您是否要立即停用著色器傾印嗎?", - "DialogLoadAppGameAlreadyLoadedMessage": "已載入此遊戲", - "DialogLoadAppGameAlreadyLoadedSubMessage": "請停止模擬或關閉模擬器,然後再啟動另一款遊戲。", - "DialogUpdateAddUpdateErrorMessage": "指定檔案不包含所選遊戲的更新!", - "DialogSettingsBackendThreadingWarningTitle": "警告 - 後端執行緒處理中", - "DialogSettingsBackendThreadingWarningMessage": "變更此選項後,必須重新啟動 Ryujinx 才能完全生效。使用 Ryujinx 的多執行緒功能時,可能需要手動停用驅動程式本身的多執行緒功能,這取決於您的平台。", - "DialogModManagerDeletionWarningMessage": "您將刪除模組: {0}\n\n您確定要繼續嗎?", - "DialogModManagerDeletionAllWarningMessage": "您即將刪除此遊戲的所有模組。\n\n您確定要繼續嗎?", - "SettingsTabGraphicsFeaturesOptions": "功能", - "SettingsTabGraphicsBackendMultithreading": "圖形後端多執行緒:", - "CommonAuto": "自動", - "CommonOff": "關閉", - "CommonOn": "開啟", - "InputDialogYes": "是", - "InputDialogNo": "否", - "DialogProfileInvalidProfileNameErrorMessage": "檔案名稱包含無效字元。請重試。", - "MenuBarOptionsPauseEmulation": "暫停", - "MenuBarOptionsResumeEmulation": "繼續", - "AboutUrlTooltipMessage": "在預設瀏覽器中開啟 Ryujinx 網站。", - "AboutDisclaimerMessage": "Ryujinx 和 Nintendo™\n或其任何合作夥伴完全沒有關聯。", - "AboutAmiiboDisclaimerMessage": "我們在 Amiibo 模擬中\n使用了 AmiiboAPI (www.amiiboapi.com)。", - "AboutPatreonUrlTooltipMessage": "在預設瀏覽器中開啟 Ryujinx 的 Patreon 網頁。", - "AboutGithubUrlTooltipMessage": "在預設瀏覽器中開啟 Ryujinx 的 GitHub 網頁。", - "AboutDiscordUrlTooltipMessage": "在預設瀏覽器中開啟 Ryujinx 的 Discord 邀請連結。", - "AboutTwitterUrlTooltipMessage": "在預設瀏覽器中開啟 Ryujinx 的 Twitter 網頁。", - "AboutRyujinxAboutTitle": "關於:", - "AboutRyujinxAboutContent": "Ryujinx 是一款 Nintendo Switch™ 模擬器。\n請在 Patreon 上支持我們。\n關注我們的 Twitter 或 Discord 取得所有最新消息。\n對於有興趣貢獻的開發者,可以在我們的 GitHub 或 Discord 上了解更多資訊。", - "AboutRyujinxMaintainersTitle": "維護者:", - "AboutRyujinxMaintainersContentTooltipMessage": "在預設瀏覽器中開啟貢獻者的網頁", - "AboutRyujinxSupprtersTitle": "Patreon 支持者:", - "AmiiboSeriesLabel": "Amiibo 系列", - "AmiiboCharacterLabel": "角色", - "AmiiboScanButtonLabel": "掃描", - "AmiiboOptionsShowAllLabel": "顯示所有 Amiibo", - "AmiiboOptionsUsRandomTagLabel": "補釘修正:使用隨機標記的 Uuid", - "DlcManagerTableHeadingEnabledLabel": "已啟用", - "DlcManagerTableHeadingTitleIdLabel": "遊戲 ID", - "DlcManagerTableHeadingContainerPathLabel": "容器路徑", - "DlcManagerTableHeadingFullPathLabel": "完整路徑", - "DlcManagerRemoveAllButton": "全部刪除", - "DlcManagerEnableAllButton": "全部啟用", - "DlcManagerDisableAllButton": "全部停用", - "ModManagerDeleteAllButton": "全部刪除", - "MenuBarOptionsChangeLanguage": "變更語言", - "MenuBarShowFileTypes": "顯示檔案類型", - "CommonSort": "排序", - "CommonShowNames": "顯示名稱", - "CommonFavorite": "我的最愛", - "OrderAscending": "從小到大", - "OrderDescending": "從大到小", - "SettingsTabGraphicsFeatures": "功能與改進", - "ErrorWindowTitle": "錯誤視窗", - "ToggleDiscordTooltip": "啟用或關閉 Discord 動態狀態展示", - "AddGameDirBoxTooltip": "輸入要新增到清單中的遊戲資料夾", - "AddGameDirTooltip": "新增遊戲資料夾到清單中", - "RemoveGameDirTooltip": "移除選取的遊戲資料夾", - "AddAutoloadDirBoxTooltip": "輸入要新增到清單中的「自動載入 DLC/遊戲更新資料夾」", - "AddAutoloadDirTooltip": "新增「自動載入 DLC/遊戲更新資料夾」到清單中", - "RemoveAutoloadDirTooltip": "移除選取的「自動載入 DLC/遊戲更新資料夾」", - "CustomThemeCheckTooltip": "為圖形使用者介面使用自訂 Avalonia 佈景主題,變更模擬器功能表的外觀", - "CustomThemePathTooltip": "自訂 GUI 佈景主題的路徑", - "CustomThemeBrowseTooltip": "瀏覽自訂 GUI 佈景主題", - "DockModeToggleTooltip": "底座模式可使模擬系統表現為底座的 Nintendo Switch。這可以提高大多數遊戲的圖形保真度。反之,停用該模式將使模擬系統表現為手提模式的 Nintendo Switch,從而降低圖形品質。\n\n如果計劃使用底座模式,請配置玩家 1 控制;如果計劃使用手提模式,請配置手提控制。\n\n如果不確定,請保持開啟狀態。", - "DirectKeyboardTooltip": "支援直接鍵盤存取 (HID)。遊戲可將鍵盤作為文字輸入裝置。\n\n僅適用於在 Switch 硬體上原生支援使用鍵盤的遊戲。\n\n如果不確定,請保持關閉狀態。", - "DirectMouseTooltip": "支援滑鼠直接存取 (HID)。遊戲可將滑鼠作為指向裝置使用。\n\n僅適用於在 Switch 硬體上原生支援滑鼠控制的遊戲,這類遊戲很少。\n\n啟用後,觸控螢幕功能可能無法使用。\n\n如果不確定,請保持關閉狀態。", - "RegionTooltip": "變更系統區域", - "LanguageTooltip": "變更系統語言", - "TimezoneTooltip": "變更系統時區", - "TimeTooltip": "變更系統時鐘", - "VSyncToggleTooltip": "模擬遊戲機的垂直同步。對大多數遊戲來說,它本質上是一個幀率限制器;停用它可能會導致遊戲以更高的速度執行,或使載入畫面耗時更長或卡住。\n\n可以在遊戲中使用快速鍵進行切換 (預設為 F1)。如果您打算停用,我們建議您這樣做。\n\n如果不確定,請保持開啟狀態。", - "PptcToggleTooltip": "儲存已轉譯的 JIT 函數,這樣每次載入遊戲時就無需再轉譯這些函數。\n\n減少遊戲首次啟動後的卡頓現象,並大大加快啟動時間。\n\n如果不確定,請保持開啟狀態。", - "LowPowerPptcToggleTooltip": "使用 CPU 核心數量的三分之一載入 PPTC。", - "FsIntegrityToggleTooltip": "在啟動遊戲時檢查損壞的檔案,如果檢測到損壞的檔案,則在日誌中顯示雜湊值錯誤。\n\n對效能沒有影響,旨在幫助排除故障。\n\n如果不確定,請保持開啟狀態。", - "AudioBackendTooltip": "變更用於繪製音訊的後端。\n\nSDL2 是首選,而 OpenAL 和 SoundIO 則作為備用。虛設 (Dummy) 將沒有聲音。\n\n如果不確定,請設定為 SDL2。", - "MemoryManagerTooltip": "變更客體記憶體的映射和存取方式。這會極大地影響模擬 CPU 效能。\n\n如果不確定,請設定為主體略過檢查模式。", - "MemoryManagerSoftwareTooltip": "使用軟體分頁表進行位址轉換。精度最高,但效能最差。", - "MemoryManagerHostTooltip": "直接映射主體位址空間中的記憶體。更快的 JIT 編譯和執行速度。", - "MemoryManagerUnsafeTooltip": "直接映射記憶體,但在存取前不封鎖客體位址空間內的位址。速度更快,但相對不安全。訪客應用程式可以從 Ryujinx 中的任何地方存取記憶體,因此只能使用該模式執行您信任的程式。", - "UseHypervisorTooltip": "使用 Hypervisor 取代 JIT。使用時可大幅提高效能,但在目前狀態下可能不穩定。", - "DRamTooltip": "利用另一種 MemoryMode 配置來模仿 Switch 開發模式。\n\n這僅對高解析度紋理套件或 4K 解析度模組有用。不會提高效能。\n\n如果不確定,請設定為 4GiB。", - "IgnoreMissingServicesTooltip": "忽略未實現的 Horizon OS 服務。這可能有助於在啟動某些遊戲時避免崩潰。\n\n如果不確定,請保持關閉狀態。", - "IgnoreAppletTooltip": "如果遊戲手把在遊戲過程中斷開連接,則外部對話方塊「控制器小程式」將不會出現。不會提示關閉對話方塊或設定新控制器。一旦先前斷開的控制器重新連接,遊戲將自動恢復。", - "GraphicsBackendThreadingTooltip": "在第二個執行緒上執行圖形後端指令。\n\n在本身不支援多執行緒的 GPU 驅動程式上,可加快著色器編譯、減少卡頓並提高效能。在支援多執行緒的驅動程式上效能略有提升。\n\n如果不確定,請設定為自動。", - "GalThreadingTooltip": "在第二個執行緒上執行圖形後端指令。\n\n在本身不支援多執行緒的 GPU 驅動程式上,可加快著色器編譯、減少卡頓並提高效能。在支援多執行緒的驅動程式上效能略有提升。\n\n如果不確定,請設定為自動。", - "ShaderCacheToggleTooltip": "儲存磁碟著色器快取,減少後續執行時的卡頓。\n\n如果不確定,請保持開啟狀態。", - "ResolutionScaleTooltip": "使用倍數提升遊戲的繪製解析度。\n\n少數遊戲可能無法使用此功能,即使提高解析度也會顯得像素化;對於這些遊戲,您可能需要找到去除反鋸齒或提高內部繪製解析度的模組。對於後者,您可能需要選擇原生。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n請記住,4 倍幾乎對任何設定都是過度的。", - "ResolutionScaleEntryTooltip": "浮點解析度刻度,如 1.5。非整數刻度更容易出現問題或崩潰。", - "AnisotropyTooltip": "各向異性過濾等級。設定為自動可使用遊戲要求的值。", - "AspectRatioTooltip": "套用於繪製器視窗的長寬比。\n\n只有在遊戲中使用長寬比模組時才可變更,否則圖形會被拉伸。\n\n如果不確定,請保持 16:9 狀態。", - "ShaderDumpPathTooltip": "圖形著色器傾印路徑", - "FileLogTooltip": "將控制台日誌儲存到磁碟上的日誌檔案中。不會影響效能。", - "StubLogTooltip": "在控制台中輸出日誌訊息。不會影響效能。", - "InfoLogTooltip": "在控制台中輸出資訊日誌訊息。不會影響效能。", - "WarnLogTooltip": "在控制台中輸出警告日誌訊息。不會影響效能。", - "ErrorLogTooltip": "在控制台中輸出錯誤日誌訊息。不會影響效能。", - "TraceLogTooltip": "在控制台中輸出追蹤日誌訊息。不會影響效能。", - "GuestLogTooltip": "在控制台中輸出客體日誌訊息。不會影響效能。", - "FileAccessLogTooltip": "在控制台中輸出檔案存取日誌訊息。", - "FSAccessLogModeTooltip": "啟用檔案系統存取日誌輸出到控制台中。可能的模式為 0 到 3", - "DeveloperOptionTooltip": "謹慎使用", - "OpenGlLogLevel": "需要啟用適當的日誌等級", - "DebugLogTooltip": "在控制台中輸出偵錯日誌訊息。\n\n只有在人員特別指示的情況下才能使用,因為這會導致日誌難以閱讀,並降低模擬器效能。", - "LoadApplicationFileTooltip": "開啟檔案總管,選擇與 Switch 相容的檔案來載入", - "LoadApplicationFolderTooltip": "開啟檔案總管,選擇與 Switch 相容且未封裝的應用程式來載入", - "LoadDlcFromFolderTooltip": "開啟檔案總管,選擇一個或多個資料夾來大量載入 DLC", - "LoadTitleUpdatesFromFolderTooltip": "開啟檔案總管,選擇一個或多個資料夾來大量載入遊戲更新", - "OpenRyujinxFolderTooltip": "開啟 Ryujinx 檔案系統資料夾", - "OpenRyujinxLogsTooltip": "開啟日誌被寫入的資料夾", - "ExitTooltip": "結束 Ryujinx", - "OpenSettingsTooltip": "開啟設定視窗", - "OpenProfileManagerTooltip": "開啟使用者設定檔管理員視窗", - "StopEmulationTooltip": "停止模擬目前遊戲,返回遊戲選擇介面", - "CheckUpdatesTooltip": "檢查 Ryujinx 的更新", - "OpenAboutTooltip": "開啟關於視窗", - "GridSize": "網格尺寸", - "GridSizeTooltip": "調整網格的大小", - "SettingsTabSystemSystemLanguageBrazilianPortuguese": "巴西葡萄牙文", - "AboutRyujinxContributorsButtonHeader": "查看所有貢獻者", - "SettingsTabSystemAudioVolume": "音量:", - "AudioVolumeTooltip": "調節音量", - "SettingsTabSystemEnableInternetAccess": "訪客網際網路存取/區域網路模式", - "EnableInternetAccessTooltip": "允許模擬應用程式連線網際網路。\n\n當啟用此功能且系統連線到同一接入點時,具有區域網路模式的遊戲可相互連線。這也包括真正的遊戲機。\n\n不允許連接 Nintendo 伺服器。可能會導致某些嘗試連線網際網路的遊戲崩潰。\n\n如果不確定,請保持關閉狀態。", - "GameListContextMenuManageCheatToolTip": "管理密技", - "GameListContextMenuManageCheat": "管理密技", - "GameListContextMenuManageModToolTip": "管理模組", - "GameListContextMenuManageMod": "管理模組", - "ControllerSettingsStickRange": "範圍:", - "DialogStopEmulationTitle": "Ryujinx - 停止模擬", - "DialogStopEmulationMessage": "您確定要停止模擬嗎?", - "SettingsTabCpu": "CPU", - "SettingsTabAudio": "音訊", - "SettingsTabNetwork": "網路", - "SettingsTabNetworkConnection": "網路連線", - "SettingsTabCpuCache": "CPU 快取", - "SettingsTabCpuMemory": "CPU 模式", - "DialogUpdaterFlatpakNotSupportedMessage": "請透過 Flathub 更新 Ryujinx。", - "UpdaterDisabledWarningTitle": "更新已停用!", - "ControllerSettingsRotate90": "順時針旋轉 90°", - "IconSize": "圖示大小", - "IconSizeTooltip": "變更遊戲圖示的大小", - "MenuBarOptionsShowConsole": "顯示控制台", - "ShaderCachePurgeError": "在 {0} 清除著色器快取時出錯: {1}", - "UserErrorNoKeys": "找不到金鑰", - "UserErrorNoFirmware": "找不到韌體", - "UserErrorFirmwareParsingFailed": "韌體解析錯誤", - "UserErrorApplicationNotFound": "找不到應用程式", - "UserErrorUnknown": "未知錯誤", - "UserErrorUndefined": "未定義錯誤", - "UserErrorNoKeysDescription": "Ryujinx 無法找到您的「prod.keys」檔案", - "UserErrorNoFirmwareDescription": "Ryujinx 無法找到已安裝的任何韌體", - "UserErrorFirmwareParsingFailedDescription": "Ryujinx 無法解析所提供的韌體。這通常是由於金鑰過時造成的。", - "UserErrorApplicationNotFoundDescription": "Ryujinx 無法在指定路徑下找到有效的應用程式。", - "UserErrorUnknownDescription": "發生未知錯誤!", - "UserErrorUndefinedDescription": "發生未定義錯誤! 這種情況不應該發生,請聯絡開發人員!", - "OpenSetupGuideMessage": "開啟設定指南", - "NoUpdate": "沒有更新", - "TitleUpdateVersionLabel": "版本 {0}", - "TitleBundledUpdateVersionLabel": "附帶: 版本 {0}", - "TitleBundledDlcLabel": "附帶:", - "TitleXCIStatusPartialLabel": "Partial", - "TitleXCIStatusTrimmableLabel": "Untrimmed", - "TitleXCIStatusUntrimmableLabel": "Trimmed", - "TitleXCIStatusFailedLabel": "(Failed)", - "TitleXCICanSaveLabel": "Save {0:n0} Mb", - "TitleXCISavingLabel": "Saved {0:n0} Mb", - "RyujinxInfo": "Ryujinx - 資訊", - "RyujinxConfirm": "Ryujinx - 確認", - "FileDialogAllTypes": "全部類型", - "Never": "從不", - "SwkbdMinCharacters": "長度必須至少為 {0} 個字元", - "SwkbdMinRangeCharacters": "長度必須為 {0} 到 {1} 個字元", - "CabinetTitle": "Cabinet Dialog", - "CabinetDialog": "Enter your Amiibo's new name", - "CabinetScanDialog": "Please scan your Amiibo now.", - "SoftwareKeyboard": "軟體鍵盤", - "SoftwareKeyboardModeNumeric": "必須是 0 到 9 或「.」", - "SoftwareKeyboardModeAlphabet": "必須是「非中日韓字元」 (non CJK)", - "SoftwareKeyboardModeASCII": "必須是 ASCII 文字", - "ControllerAppletControllers": "支援的控制器:", - "ControllerAppletPlayers": "玩家:", - "ControllerAppletDescription": "您目前的配置無效。開啟設定並重新配置輸入。", - "ControllerAppletDocked": "已設定底座模式。手提控制應該停用。", - "UpdaterRenaming": "正在重新命名舊檔案...", - "UpdaterRenameFailed": "更新程式無法重新命名檔案: {0}", - "UpdaterAddingFiles": "正在加入新檔案...", - "UpdaterExtracting": "正在提取更新...", - "UpdaterDownloading": "正在下載更新...", - "Docked": "底座模式", - "Handheld": "手提模式", - "ConnectionError": "連線錯誤。", - "AboutPageDeveloperListMore": "{0} 等人...", - "ApiError": "API 錯誤。", - "LoadingHeading": "正在載入 {0}", - "CompilingPPTC": "正在編譯 PTC", - "CompilingShaders": "正在編譯著色器", - "AllKeyboards": "所有鍵盤", - "OpenFileDialogTitle": "選取支援的檔案格式", - "OpenFolderDialogTitle": "選取未封裝遊戲的資料夾", - "AllSupportedFormats": "所有支援的格式", - "RyujinxUpdater": "Ryujinx 更新程式", - "SettingsTabHotkeys": "鍵盤快速鍵", - "SettingsTabHotkeysHotkeys": "鍵盤快捷鍵", - "SettingsTabHotkeysToggleVsyncHotkey": "切換垂直同步:", - "SettingsTabHotkeysScreenshotHotkey": "擷取畫面:", - "SettingsTabHotkeysShowUiHotkey": "顯示 UI:", - "SettingsTabHotkeysPauseHotkey": "暫停:", - "SettingsTabHotkeysToggleMuteHotkey": "靜音:", - "ControllerMotionTitle": "體感控制設定", - "ControllerRumbleTitle": "震動設定", - "SettingsSelectThemeFileDialogTitle": "選取佈景主題檔案", - "SettingsXamlThemeFile": "Xaml 佈景主題檔案", - "AvatarWindowTitle": "管理帳戶 - 大頭貼", - "Amiibo": "Amiibo", - "Unknown": "未知", - "Usage": "用途", - "Writable": "可寫入", - "SelectDlcDialogTitle": "選取 DLC 檔案", - "SelectUpdateDialogTitle": "選取更新檔", - "SelectModDialogTitle": "選取模組資料夾", - "TrimXCIFileDialogTitle": "Check and Trim XCI File", - "TrimXCIFileDialogPrimaryText": "This function will first check the empty space and then trim the XCI File to save disk space.", - "TrimXCIFileDialogSecondaryText": "Current File Size: {0:n} MB\nGame Data Size: {1:n} MB\nDisk Space Savings: {2:n} MB", - "TrimXCIFileNoTrimNecessary": "XCI File does not need to be trimmed. Check logs for further details", - "TrimXCIFileNoUntrimPossible": "XCI File cannot be untrimmed. Check logs for further details", - "TrimXCIFileReadOnlyFileCannotFix": "XCI File is Read Only and could not be made writable. Check logs for further details", - "TrimXCIFileFileSizeChanged": "XCI File has changed in size since it was scanned. Please check the file is not being written to and try again.", - "TrimXCIFileFreeSpaceCheckFailed": "XCI File has data in the free space area, it is not safe to trim", - "TrimXCIFileInvalidXCIFile": "XCI File contains invalid data. Check logs for further details", - "TrimXCIFileFileIOWriteError": "XCI File could not be opened for writing. Check logs for further details", - "TrimXCIFileFailedPrimaryText": "Trimming of the XCI file failed", - "TrimXCIFileCancelled": "The operation was cancelled", - "TrimXCIFileFileUndertermined": "No operation was performed", - "UserProfileWindowTitle": "使用者設定檔管理員", - "CheatWindowTitle": "密技管理員", - "DlcWindowTitle": "管理 {0} 的可下載內容 ({1})", - "ModWindowTitle": "管理 {0} 的模組 ({1})", - "UpdateWindowTitle": "遊戲更新管理員", - "XCITrimmerWindowTitle": "XCI File Trimmer", - "XCITrimmerTitleStatusCount": "{0} of {1} Title(s) Selected", - "XCITrimmerTitleStatusCountWithFilter": "{0} of {1} Title(s) Selected ({2} displayed)", - "XCITrimmerTitleStatusTrimming": "Trimming {0} Title(s)...", - "XCITrimmerTitleStatusUntrimming": "Untrimming {0} Title(s)...", - "XCITrimmerTitleStatusFailed": "Failed", - "XCITrimmerPotentialSavings": "Potential Savings", - "XCITrimmerActualSavings": "Actual Savings", - "XCITrimmerSavingsMb": "{0:n0} Mb", - "XCITrimmerSelectDisplayed": "Select Shown", - "XCITrimmerDeselectDisplayed": "Deselect Shown", - "XCITrimmerSortName": "Title", - "XCITrimmerSortSaved": "Space Savings", - "XCITrimmerTrim": "Trim", - "XCITrimmerUntrim": "Untrim", - "UpdateWindowUpdateAddedMessage": "已加入 {0} 個遊戲更新", - "UpdateWindowBundledContentNotice": "附帶的遊戲更新只能被停用而無法被刪除。", - "CheatWindowHeading": "可用於 {0} [{1}] 的密技", - "BuildId": "組建識別碼:", - "DlcWindowBundledContentNotice": "附帶的 DLC 只能被停用而無法被刪除。", - "DlcWindowHeading": "{0} 個可下載內容", - "DlcWindowDlcAddedMessage": "已加入 {0} 個 DLC", - "AutoloadDlcAddedMessage": "已加入 {0} 個 DLC", - "AutoloadDlcRemovedMessage": "已刪除 {0} 個遺失的 DLC", - "AutoloadUpdateAddedMessage": "已加入 {0} 個遊戲更新", - "AutoloadUpdateRemovedMessage": "已刪除 {0} 個遺失的遊戲更新", - "ModWindowHeading": "{0} 模組", - "UserProfilesEditProfile": "編輯所選", - "Continue": "Continue", - "Cancel": "取消", - "Save": "儲存", - "Discard": "放棄變更", - "Paused": "暫停", - "UserProfilesSetProfileImage": "設定設定檔圖像", - "UserProfileEmptyNameError": "名稱為必填", - "UserProfileNoImageError": "必須設定設定檔圖像", - "GameUpdateWindowHeading": "管理 {0} 的更新 ({1})", - "SettingsTabHotkeysResScaleUpHotkey": "提高解析度:", - "SettingsTabHotkeysResScaleDownHotkey": "降低解析度:", - "UserProfilesName": "名稱:", - "UserProfilesUserId": "使用者 ID:", - "SettingsTabGraphicsBackend": "圖形後端", - "SettingsTabGraphicsBackendTooltip": "選擇模擬器將使用的圖形後端。\n\n只要驅動程式是最新的,Vulkan 對所有現代顯示卡來說都更好用。Vulkan 還能在所有 GPU 廠商上實現更快的著色器編譯 (減少卡頓)。\n\nOpenGL 在舊式 Nvidia GPU、Linux 上的舊式 AMD GPU 或 VRAM 較低的 GPU 上可能會取得更好的效果,不過著色器編譯的卡頓會更嚴重。\n\n如果不確定,請設定為 Vulkan。如果您的 GPU 使用最新的圖形驅動程式也不支援 Vulkan,請設定為 OpenGL。", - "SettingsEnableTextureRecompression": "開啟材質重新壓縮", - "SettingsEnableTextureRecompressionTooltip": "壓縮 ASTC 紋理,以減少 VRAM 占用。\n\n使用這種紋理格式的遊戲包括 Astral Chain、Bayonetta 3、Fire Emblem Engage、Metroid Prime Remastered、Super Mario Bros. Wonder 和 The Legend of Zelda: Tears of the Kingdom。\n\n使用 4GB 或更低 VRAM 的顯示卡在執行這些遊戲時可能會崩潰。\n\n只有在上述遊戲的 VRAM 即將耗盡時才啟用。如果不確定,請保持關閉狀態。", - "SettingsTabGraphicsPreferredGpu": "優先選取的 GPU", - "SettingsTabGraphicsPreferredGpuTooltip": "選擇將與 Vulkan 圖形後端一起使用的顯示卡。\n\n不會影響 OpenGL 將使用的 GPU。\n\n如果不確定,請設定為標記為「dGPU」的 GPU。如果沒有,則保持原狀。", - "SettingsAppRequiredRestartMessage": "需要重新啟動 Ryujinx", - "SettingsGpuBackendRestartMessage": "圖形後端或 GPU 設定已修改。這需要重新啟動才能套用。", - "SettingsGpuBackendRestartSubMessage": "您現在要重新啟動嗎?", - "RyujinxUpdaterMessage": "您想將 Ryujinx 升級到最新版本嗎?", - "SettingsTabHotkeysVolumeUpHotkey": "提高音量:", - "SettingsTabHotkeysVolumeDownHotkey": "降低音量:", - "SettingsEnableMacroHLE": "啟用 Macro HLE", - "SettingsEnableMacroHLETooltip": "GPU 巨集程式碼的進階模擬。\n\n可提高效能,但在某些遊戲中可能會導致圖形閃爍。\n\n如果不確定,請保持開啟狀態。", - "SettingsEnableColorSpacePassthrough": "色彩空間直通", - "SettingsEnableColorSpacePassthroughTooltip": "指示 Vulkan 後端在不指定色彩空間的情況下傳遞色彩資訊。對於使用廣色域顯示器的使用者來說,這可能會帶來更鮮艷的色彩,但代價是犧牲色彩的正確性。", - "VolumeShort": "音量", - "UserProfilesManageSaves": "管理存檔", - "DeleteUserSave": "您想刪除此遊戲的使用者存檔嗎?", - "IrreversibleActionNote": "此動作將無法復原。", - "SaveManagerHeading": "管理 {0} 的存檔 ({1})", - "SaveManagerTitle": "存檔管理員", - "Name": "名稱", - "Size": "大小", - "Search": "搜尋", - "UserProfilesRecoverLostAccounts": "復原遺失的帳戶", - "Recover": "復原", - "UserProfilesRecoverHeading": "發現下列帳戶有一些存檔", - "UserProfilesRecoverEmptyList": "無設定檔可復原", - "GraphicsAATooltip": "對遊戲繪製進行反鋸齒處理。\n\nFXAA 會模糊大部分圖像,而 SMAA 則會嘗試找出鋸齒邊緣並將其平滑化。\n\n不建議與 FSR 縮放濾鏡一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請選擇無狀態。", - "GraphicsAALabel": "反鋸齒:", - "GraphicsScalingFilterLabel": "縮放過濾器:", - "GraphicsScalingFilterTooltip": "選擇使用解析度縮放時套用的縮放過濾器。\n\n雙線性 (Bilinear) 濾鏡適用於 3D 遊戲,是一個安全的預設選項。\n\n建議像素美術遊戲使用近鄰性 (Nearest) 濾鏡。\n\nFSR 1.0 只是一個銳化濾鏡,不建議與 FXAA 或 SMAA 一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請保持雙線性 (Bilinear) 狀態。", - "GraphicsScalingFilterBilinear": "雙線性 (Bilinear)", - "GraphicsScalingFilterNearest": "近鄰性 (Nearest)", - "GraphicsScalingFilterFsr": "FSR", - "GraphicsScalingFilterArea": "Area", - "GraphicsScalingFilterLevelLabel": "日誌等級", - "GraphicsScalingFilterLevelTooltip": "設定 FSR 1.0 銳化等級。越高越清晰。", - "SmaaLow": "低階 SMAA", - "SmaaMedium": "中階 SMAA", - "SmaaHigh": "高階 SMAA", - "SmaaUltra": "超高階 SMAA", - "UserEditorTitle": "編輯使用者", - "UserEditorTitleCreate": "建立使用者", - "SettingsTabNetworkInterface": "網路介面:", - "NetworkInterfaceTooltip": "用於 LAN/LDN 功能的網路介面。\n\n與 VPN 或 XLink Kai 以及支援區域網路的遊戲配合使用,可用於在網路上偽造同網際網路連線。\n\n如果不確定,請保持預設狀態。", - "NetworkInterfaceDefault": "預設", - "PackagingShaders": "封裝著色器", - "AboutChangelogButton": "在 GitHub 上檢視更新日誌", - "AboutChangelogButtonTooltipMessage": "在預設瀏覽器中開啟此版本的更新日誌。", - "SettingsTabNetworkMultiplayer": "多人遊戲", - "MultiplayerMode": "模式:", - "MultiplayerModeTooltip": "變更 LDN 多人遊戲模式。\n\nLdnMitm 將修改遊戲中的本機無線/本機遊戲功能,使其如同區域網路一樣執行,允許與其他安裝了 ldn_mitm 模組的 Ryujinx 實例和已破解的 Nintendo Switch 遊戲機進行本機同網路連線。\n\n多人遊戲要求所有玩家使用相同的遊戲版本 (例如,Super Smash Bros. Ultimate v13.0.1 無法連接 v13.0.0)。\n\n如果不確定,請保持 Disabled (停用) 狀態。", - "MultiplayerModeDisabled": "已停用", - "MultiplayerModeLdnMitm": "ldn_mitm", - "MultiplayerModeLdnRyu": "RyuLDN", - "MultiplayerDisableP2P": "Disable P2P Network Hosting (may increase latency)", - "MultiplayerDisableP2PTooltip": "Disable P2P network hosting, peers will proxy through the master server instead of connecting to you directly.", - "LdnPassphrase": "Network Passphrase:", - "LdnPassphraseTooltip": "You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputTooltip": "Enter a passphrase in the format Ryujinx-<8 hex chars>. You will only be able to see hosted games with the same passphrase as you.", - "LdnPassphraseInputPublic": "(public)", - "GenLdnPass": "Generate Random", - "GenLdnPassTooltip": "Generates a new passphrase, which can be shared with other players.", - "ClearLdnPass": "Clear", - "ClearLdnPassTooltip": "Clears the current passphrase, returning to the public network.", - "InvalidLdnPassphrase": "Invalid Passphrase! Must be in the format \"Ryujinx-<8 hex chars>\"" -} diff --git a/src/Ryujinx/Assets/Styles/Styles.xaml b/src/Ryujinx/Assets/Styles/Styles.xaml index 878b5e7f1..ea6096792 100644 --- a/src/Ryujinx/Assets/Styles/Styles.xaml +++ b/src/Ryujinx/Assets/Styles/Styles.xaml @@ -1,7 +1,8 @@ - + Content="Add" + Classes="red"/> + + @@ -218,6 +225,15 @@ + + + + + + + + + + diff --git a/src/Ryujinx/Assets/Styles/Themes.xaml b/src/Ryujinx/Assets/Styles/Themes.xaml index 056eba228..de7584240 100644 --- a/src/Ryujinx/Assets/Styles/Themes.xaml +++ b/src/Ryujinx/Assets/Styles/Themes.xaml @@ -1,86 +1,62 @@ - - - - #FF00C3E3 - #FF00C3E3 - #FF00C3E3 - #FF00C3E3 - #FF00C3E3 - #FF00C3E3 - #FF00C3E3 - #FFe8e8e8 + #008AA8 #FF00FABB #FFF0F0F0 #FFd6d6d6 - #FFFFFFFF - #FFFFFFFF #FF000000 #C1C1C1 #b3ffffff #80cccccc + #FF6347 #A0000000 + #fffcd12a #FF2EEAC9 #FFFF4554 #6483F5 + #800080 - - - #FF00C3E3 - #FF00C3E3 - #FF00C3E3 - #FF00C3E3 - #FF00C3E3 - #FF00C3E3 - #FF00C3E3 - #FFe8e8e8 + #3ddcff #FF00FABB - #FFF0F0F0 - #FFd6d6d6 - #FFFFFFFF - #FFFFFFFF + #dedede + #c2c2c2 #FF000000 #C1C1C1 #b3ffffff #80cccccc + #FF6347 #A0000000 + #fffcd12a + #13c3a4 + #FFFF4554 + #6483F5 + #800080 - - #008AA8 - #FF00C3E3 - #FF99b000 - #FF006d7d - #FF00525E - #FF00dbff - #FF19dfff - #FF33e3ff #FF00FABB #FF2D2D2D #FF505050 - #FFFFFFFF - #FFFFFFFF #FFFFFFFF #3D3D3D #0FFFFFFF #1EFFFFFF + #FF6347 #A0FFFFFF + #fffcd12a + #FF2EEAC9 + #FFFF4554 + #6483F5 + #FFA500 diff --git a/src/Ryujinx.UI.Common/Resources/Icon_Blank.png b/src/Ryujinx/Assets/UIImages/Icon_Blank.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_Blank.png rename to src/Ryujinx/Assets/UIImages/Icon_Blank.png diff --git a/src/Ryujinx.UI.Common/Resources/Icon_NCA.png b/src/Ryujinx/Assets/UIImages/Icon_NCA.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_NCA.png rename to src/Ryujinx/Assets/UIImages/Icon_NCA.png diff --git a/src/Ryujinx.UI.Common/Resources/Icon_NRO.png b/src/Ryujinx/Assets/UIImages/Icon_NRO.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_NRO.png rename to src/Ryujinx/Assets/UIImages/Icon_NRO.png diff --git a/src/Ryujinx.UI.Common/Resources/Icon_NSO.png b/src/Ryujinx/Assets/UIImages/Icon_NSO.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_NSO.png rename to src/Ryujinx/Assets/UIImages/Icon_NSO.png diff --git a/src/Ryujinx.UI.Common/Resources/Icon_NSP.png b/src/Ryujinx/Assets/UIImages/Icon_NSP.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_NSP.png rename to src/Ryujinx/Assets/UIImages/Icon_NSP.png diff --git a/src/Ryujinx.UI.Common/Resources/Icon_XCI.png b/src/Ryujinx/Assets/UIImages/Icon_XCI.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Icon_XCI.png rename to src/Ryujinx/Assets/UIImages/Icon_XCI.png diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Amiibo.png b/src/Ryujinx/Assets/UIImages/Logo_Amiibo.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Logo_Amiibo.png rename to src/Ryujinx/Assets/UIImages/Logo_Amiibo.png diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Discord_Dark.png b/src/Ryujinx/Assets/UIImages/Logo_Discord_Dark.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Logo_Discord_Dark.png rename to src/Ryujinx/Assets/UIImages/Logo_Discord_Dark.png diff --git a/src/Ryujinx.UI.Common/Resources/Logo_Discord_Light.png b/src/Ryujinx/Assets/UIImages/Logo_Discord_Light.png similarity index 100% rename from src/Ryujinx.UI.Common/Resources/Logo_Discord_Light.png rename to src/Ryujinx/Assets/UIImages/Logo_Discord_Light.png diff --git a/src/Ryujinx/Assets/UIImages/Logo_GitLab_Dark.png b/src/Ryujinx/Assets/UIImages/Logo_GitLab_Dark.png new file mode 100644 index 000000000..e6fb5ecb5 Binary files /dev/null and b/src/Ryujinx/Assets/UIImages/Logo_GitLab_Dark.png differ diff --git a/src/Ryujinx/Assets/UIImages/Logo_GitLab_Light.png b/src/Ryujinx/Assets/UIImages/Logo_GitLab_Light.png new file mode 100644 index 000000000..17a4feefb Binary files /dev/null and b/src/Ryujinx/Assets/UIImages/Logo_GitLab_Light.png differ diff --git a/src/Ryujinx/Assets/UIImages/Logo_Ryujinx.png b/src/Ryujinx/Assets/UIImages/Logo_Ryujinx.png new file mode 100644 index 000000000..e61358a95 Binary files /dev/null and b/src/Ryujinx/Assets/UIImages/Logo_Ryujinx.png differ diff --git a/src/Ryujinx/Assets/UIImages/Logo_Ryujinx_AntiAlias.png b/src/Ryujinx/Assets/UIImages/Logo_Ryujinx_AntiAlias.png new file mode 100644 index 000000000..a00c7ce68 Binary files /dev/null and b/src/Ryujinx/Assets/UIImages/Logo_Ryujinx_AntiAlias.png differ diff --git a/src/Ryujinx/Common/ApplicationHelper.cs b/src/Ryujinx/Common/ApplicationHelper.cs index db5961347..afdab3af5 100644 --- a/src/Ryujinx/Common/ApplicationHelper.cs +++ b/src/Ryujinx/Common/ApplicationHelper.cs @@ -1,6 +1,6 @@ -using Avalonia.Controls.Notifications; using Avalonia.Platform.Storage; using Avalonia.Threading; +using Gommon; using LibHac; using LibHac.Account; using LibHac.Common; @@ -13,14 +13,15 @@ using LibHac.Tools.Fs; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common.Locale; -using Ryujinx.Ava.UI.Controls; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.Loaders.Processes.Extensions; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; using System; using System.Buffers; using System.IO; @@ -143,10 +144,10 @@ namespace Ryujinx.Ava.Common public static void ExtractSection(string destination, NcaSectionType ncaSectionType, string titleFilePath, string titleName, int programIndex = 0) { - var cancellationToken = new CancellationTokenSource(); + CancellationTokenSource cancellationToken = new(); UpdateWaitWindow waitingDialog = new( - App.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), + RyujinxApp.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogNcaExtractionMessage, ncaSectionType, Path.GetFileName(titleFilePath)), cancellationToken); @@ -170,14 +171,14 @@ namespace Ryujinx.Ava.Common } else { - var pfsTemp = new PartitionFileSystem(); + PartitionFileSystem pfsTemp = new(); pfsTemp.Initialize(file.AsStorage()).ThrowIfFailure(); pfs = pfsTemp; } foreach (DirectoryEntryEx fileEntry in pfs.EnumerateEntries("/", "*.nca")) { - using var ncaFile = new UniqueRef(); + using UniqueRef ncaFile = new(); pfs.OpenFile(ref ncaFile.Ref, fileEntry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); @@ -215,11 +216,7 @@ namespace Ryujinx.Ava.Common return; } - IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks - ? IntegrityCheckLevel.ErrorOnInvalid - : IntegrityCheckLevel.None; - - (Nca updatePatchNca, _) = mainNca.GetUpdateData(_virtualFileSystem, checkLevel, programIndex, out _); + (Nca updatePatchNca, _) = mainNca.GetUpdateData(_virtualFileSystem, ConfigurationState.Instance.System.IntegrityCheckLevel, programIndex, out _); if (updatePatchNca is not null) { patchNca = updatePatchNca; @@ -243,8 +240,8 @@ namespace Ryujinx.Ava.Common string source = DateTime.Now.ToFileTime().ToString()[10..]; string output = DateTime.Now.ToFileTime().ToString()[10..]; - using var uniqueSourceFs = new UniqueRef(ncaFileSystem); - using var uniqueOutputFs = new UniqueRef(new LocalFileSystem(destination)); + using UniqueRef uniqueSourceFs = new(ncaFileSystem); + using UniqueRef uniqueOutputFs = new(new LocalFileSystem(destination)); fsClient.Register(source.ToU8Span(), ref uniqueSourceFs.Ref); fsClient.Register(output.ToU8Span(), ref uniqueOutputFs.Ref); @@ -268,10 +265,9 @@ namespace Ryujinx.Ava.Common { Dispatcher.UIThread.Post(waitingDialog.Close); - NotificationHelper.Show( - App.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), - $"{titleName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}", - NotificationType.Information); + NotificationHelper.ShowInformation( + RyujinxApp.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), + $"{titleName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}"); } } @@ -297,21 +293,146 @@ namespace Ryujinx.Ava.Common extractorThread.Start(); } + public static void ExtractAoc(string destination, string updateFilePath, string updateName) + { + CancellationTokenSource cancellationToken = new(); + + UpdateWaitWindow waitingDialog = new( + RyujinxApp.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), + LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogNcaExtractionMessage, NcaSectionType.Data, Path.GetFileName(updateFilePath)), + cancellationToken); + + Thread extractorThread = new(() => + { + Dispatcher.UIThread.Post(waitingDialog.Show); + + using FileStream file = new(updateFilePath, FileMode.Open, FileAccess.Read); + + Nca publicDataNca = null; + + string extension = Path.GetExtension(updateFilePath).ToLower(); + if (extension is ".nsp") + { + PartitionFileSystem pfsTemp = new(); + pfsTemp.Initialize(file.AsStorage()).ThrowIfFailure(); + IFileSystem pfs = pfsTemp; + + foreach (DirectoryEntryEx fileEntry in pfs.EnumerateEntries("/", "*.nca")) + { + using UniqueRef ncaFile = new(); + + pfs.OpenFile(ref ncaFile.Ref, fileEntry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); + + Nca nca = new(_virtualFileSystem.KeySet, ncaFile.Get.AsStorage()); + if (nca.Header.ContentType is NcaContentType.PublicData && nca.SectionExists(NcaSectionType.Data)) + { + publicDataNca = nca; + } + } + } + + if (publicDataNca is null) + { + Logger.Error?.Print(LogClass.Application, "Extraction failure. The PublicData NCA was not present in the selected file"); + + Dispatcher.UIThread.InvokeAsync(async () => + { + waitingDialog.Close(); + + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionMainNcaNotFoundErrorMessage]); + }); + + return; + } + + int index = Nca.GetSectionIndexFromType(NcaSectionType.Data, publicDataNca.Header.ContentType); + + try + { + IFileSystem ncaFileSystem = publicDataNca.OpenFileSystem(index, IntegrityCheckLevel.ErrorOnInvalid); + + FileSystemClient fsClient = _horizonClient.Fs; + + string source = DateTime.Now.ToFileTime().ToString()[10..]; + string output = DateTime.Now.ToFileTime().ToString()[10..]; + + using UniqueRef uniqueSourceFs = new(ncaFileSystem); + using UniqueRef uniqueOutputFs = new(new LocalFileSystem(destination)); + + fsClient.Register(source.ToU8Span(), ref uniqueSourceFs.Ref); + fsClient.Register(output.ToU8Span(), ref uniqueOutputFs.Ref); + + (Result? resultCode, bool canceled) = CopyDirectory(fsClient, $"{source}:/", $"{output}:/", cancellationToken.Token); + + if (!canceled) + { + if (resultCode.Value.IsFailure()) + { + Logger.Error?.Print(LogClass.Application, $"LibHac returned error code: {resultCode.Value.ErrorCode}"); + + Dispatcher.UIThread.InvokeAsync(async () => + { + waitingDialog.Close(); + + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionCheckLogErrorMessage]); + }); + } + else if (resultCode.Value.IsSuccess()) + { + Dispatcher.UIThread.Post(waitingDialog.Close); + + NotificationHelper.ShowInformation( + RyujinxApp.FormatTitle(LocaleKeys.DialogNcaExtractionTitle), + $"{updateName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}"); + } + } + + fsClient.Unmount(source.ToU8Span()); + fsClient.Unmount(output.ToU8Span()); + } + catch (ArgumentException ex) + { + Logger.Error?.Print(LogClass.Application, $"{ex.Message}"); + + Dispatcher.UIThread.InvokeAsync(async () => + { + waitingDialog.Close(); + + await ContentDialogHelper.CreateErrorDialog(ex.Message); + }); + } + }) + { + Name = "GUI.AocExtractorThread", + IsBackground = true, + }; + extractorThread.Start(); + } + + public static async Task ExtractAoc(IStorageProvider storageProvider, string updateFilePath, string updateName) + { + Optional result = await storageProvider.OpenSingleFolderPickerAsync(new FolderPickerOpenOptions + { + Title = LocaleManager.Instance[LocaleKeys.FolderDialogExtractTitle] + }); + + if (!result.HasValue) + return; + + ExtractAoc(result.Value.Path.LocalPath, updateFilePath, updateName); + } public static async Task ExtractSection(IStorageProvider storageProvider, NcaSectionType ncaSectionType, string titleFilePath, string titleName, int programIndex = 0) { - var result = await storageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions + Optional result = await storageProvider.OpenSingleFolderPickerAsync(new FolderPickerOpenOptions { - Title = LocaleManager.Instance[LocaleKeys.FolderDialogExtractTitle], - AllowMultiple = false, + Title = LocaleManager.Instance[LocaleKeys.FolderDialogExtractTitle] }); - if (result.Count == 0) - { + if (!result.HasValue) return; - } - ExtractSection(result[0].Path.LocalPath, ncaSectionType, titleFilePath, titleName, programIndex); + ExtractSection(result.Value.Path.LocalPath, ncaSectionType, titleFilePath, titleName, programIndex); } public static (Result? result, bool canceled) CopyDirectory(FileSystemClient fs, string sourcePath, string destPath, CancellationToken token) diff --git a/src/Ryujinx/Common/KeyboardHotkeyState.cs b/src/Ryujinx/Common/KeyboardHotkeyState.cs index 060c678d2..b6fb02f04 100644 --- a/src/Ryujinx/Common/KeyboardHotkeyState.cs +++ b/src/Ryujinx/Common/KeyboardHotkeyState.cs @@ -14,5 +14,6 @@ namespace Ryujinx.Ava.Common VolumeDown, CustomVSyncIntervalIncrement, CustomVSyncIntervalDecrement, + TurboMode, } } diff --git a/src/Ryujinx/Common/LocaleManager.cs b/src/Ryujinx/Common/LocaleManager.cs index b57caa468..e5538603f 100644 --- a/src/Ryujinx/Common/LocaleManager.cs +++ b/src/Ryujinx/Common/LocaleManager.cs @@ -1,11 +1,14 @@ +using Gommon; +using Ryujinx.Ava.Systems; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Common; using Ryujinx.Common.Utilities; -using Ryujinx.UI.Common.Configuration; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Globalization; +using System.Text.Json.Serialization; namespace Ryujinx.Ava.Common.Locale { @@ -14,7 +17,6 @@ namespace Ryujinx.Ava.Common.Locale private const string DefaultLanguageCode = "en_US"; private readonly Dictionary _localeStrings; - private Dictionary _localeDefaultStrings; private readonly ConcurrentDictionary _dynamicValues; private string _localeLanguageCode; @@ -24,19 +26,30 @@ namespace Ryujinx.Ava.Common.Locale public LocaleManager() { _localeStrings = new Dictionary(); - _localeDefaultStrings = new Dictionary(); - _dynamicValues = new ConcurrentDictionary(); + _dynamicValues = new ConcurrentDictionary(new Dictionary + { + { LocaleKeys.DialogConfirmationTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.DialogUpdaterTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.DialogErrorTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.DialogWarningTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.DialogExitTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.DialogStopEmulationTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.RyujinxInfo, [RyujinxApp.FullAppName] }, + { LocaleKeys.RyujinxConfirm, [RyujinxApp.FullAppName] }, + { LocaleKeys.RyujinxUpdater, [RyujinxApp.FullAppName] }, + { LocaleKeys.RyujinxRebooter, [RyujinxApp.FullAppName] }, + { LocaleKeys.CompatibilityListSearchBoxWatermarkWithCount, [CompatibilityDatabase.Entries.Length] }, + { LocaleKeys.CompatibilityListTitle, [CompatibilityDatabase.Entries.Length] } + }); Load(); } private void Load() { - var localeLanguageCode = !string.IsNullOrEmpty(ConfigurationState.Instance.UI.LanguageCode.Value) ? + string localeLanguageCode = !string.IsNullOrEmpty(ConfigurationState.Instance.UI.LanguageCode.Value) ? ConfigurationState.Instance.UI.LanguageCode.Value : CultureInfo.CurrentCulture.Name.Replace('-', '_'); - // Load en_US as default, if the target language translation is missing or incomplete. - LoadDefaultLanguage(); LoadLanguage(localeLanguageCode); // Save whatever we ended up with. @@ -48,6 +61,13 @@ namespace Ryujinx.Ava.Common.Locale } } + public static string GetUnformatted(LocaleKeys key) => Instance.Get(key); + + public string Get(LocaleKeys key) => + _localeStrings.TryGetValue(key, out string value) + ? value + : key.ToString(); + public string this[LocaleKeys key] { get @@ -56,33 +76,21 @@ namespace Ryujinx.Ava.Common.Locale if (_localeStrings.TryGetValue(key, out string value)) { // Check if the localized string needs to be formatted. - if (_dynamicValues.TryGetValue(key, out var dynamicValue)) + if (_dynamicValues.TryGetValue(key, out object[] dynamicValue)) try { return string.Format(value, dynamicValue); } catch { - // If formatting failed use the default text instead. - if (_localeDefaultStrings.TryGetValue(key, out value)) - try - { - return string.Format(value, dynamicValue); - } - catch - { - // If formatting the default text failed return the key. - return key.ToString(); - } + // If formatting the text failed, + // continue to the below line & return the text without formatting. } return value; } - // If the locale doesn't contain the key return the default one. - return _localeDefaultStrings.TryGetValue(key, out string defaultValue) - ? defaultValue - : key.ToString(); // If the locale text doesn't exist return the key. + return key.ToString(); // If the locale text doesn't exist return the key. } set { @@ -102,28 +110,28 @@ namespace Ryujinx.Ava.Common.Locale public static string FormatDynamicValue(LocaleKeys key, params object[] values) => Instance.UpdateAndGetDynamicValue(key, values); - public string UpdateAndGetDynamicValue(LocaleKeys key, params object[] values) + public void SetDynamicValues(LocaleKeys key, params object[] values) { _dynamicValues[key] = values; - OnPropertyChanged("Item"); + OnPropertyChanged("Translation"); + } + + public string UpdateAndGetDynamicValue(LocaleKeys key, params object[] values) + { + SetDynamicValues(key, values); return this[key]; } - private void LoadDefaultLanguage() - { - _localeDefaultStrings = LoadJsonLanguage(DefaultLanguageCode); - } - public void LoadLanguage(string languageCode) { - var locale = LoadJsonLanguage(languageCode); + Dictionary locale = LoadJsonLanguage(languageCode); if (locale == null) { _localeLanguageCode = DefaultLanguageCode; - locale = _localeDefaultStrings; + locale = LoadJsonLanguage(_localeLanguageCode); } else { @@ -135,33 +143,64 @@ namespace Ryujinx.Ava.Common.Locale _localeStrings[key] = val; } - OnPropertyChanged("Item"); + OnPropertyChanged("Translation"); LocaleChanged?.Invoke(); } + private static LocalesJson? _localeData; + private static Dictionary LoadJsonLanguage(string languageCode) { - var localeStrings = new Dictionary(); - string languageJson = EmbeddedResources.ReadAllText($"Ryujinx/Assets/Locales/{languageCode}.json"); + Dictionary localeStrings = new(); - if (languageJson == null) + _localeData ??= EmbeddedResources.ReadAllText("Ryujinx/Assets/Locale.json") + .Into(it => JsonHelper.Deserialize(it, LocalesJsonContext.Default.LocalesJson)); + + foreach (LocalesEntry locale in _localeData.Value.Locales) { - // We were unable to find file for that language code. - return null; - } - - var strings = JsonHelper.Deserialize(languageJson, CommonJsonContext.Default.StringDictionary); - - foreach ((string key, string val) in strings) - { - if (Enum.TryParse(key, out var localeKey)) + if (locale.Translations.Count < _localeData.Value.Languages.Count) { - localeStrings[localeKey] = val; + throw new Exception($"Locale key {{{locale.ID}}} is missing languages! Has {locale.Translations.Count} translations, expected {_localeData.Value.Languages.Count}!"); } + + if (locale.Translations.Count > _localeData.Value.Languages.Count) + { + throw new Exception($"Locale key {{{locale.ID}}} has too many languages! Has {locale.Translations.Count} translations, expected {_localeData.Value.Languages.Count}!"); + } + + if (!Enum.TryParse(locale.ID, out LocaleKeys localeKey)) + continue; + + string str = locale.Translations.TryGetValue(languageCode, out string val) && !string.IsNullOrEmpty(val) + ? val + : locale.Translations[DefaultLanguageCode]; + + if (string.IsNullOrEmpty(str)) + { + throw new Exception($"Locale key '{locale.ID}' has no valid translations for desired language {languageCode}! {DefaultLanguageCode} is an empty string or null"); + } + + localeStrings[localeKey] = str; } return localeStrings; } } + + public struct LocalesJson + { + public List Languages { get; set; } + public List Locales { get; set; } + } + + public struct LocalesEntry + { + public string ID { get; set; } + public Dictionary Translations { get; set; } + } + + [JsonSourceGenerationOptions(WriteIndented = true)] + [JsonSerializable(typeof(LocalesJson))] + internal partial class LocalesJsonContext : JsonSerializerContext; } diff --git a/src/Ryujinx/Common/Markup/BasicMarkupExtension.cs b/src/Ryujinx/Common/Markup/BasicMarkupExtension.cs index 67c016562..d55e3c9a7 100644 --- a/src/Ryujinx/Common/Markup/BasicMarkupExtension.cs +++ b/src/Ryujinx/Common/Markup/BasicMarkupExtension.cs @@ -1,4 +1,4 @@ -using Avalonia.Data.Core; +using Avalonia.Data.Core; using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml.MarkupExtensions; using Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings; @@ -14,20 +14,20 @@ namespace Ryujinx.Ava.Common.Markup { internal abstract class BasicMarkupExtension : MarkupExtension { - public virtual string Name => "Item"; + public abstract string Name { get; } public virtual Action? Setter => null; - protected abstract T? GetValue(); + protected abstract T? Value { get; } protected virtual void ConfigureBindingExtension(CompiledBindingExtension _) { } private ClrPropertyInfo PropertyInfo => new(Name, - _ => GetValue(), + _ => Value, Setter as Action, typeof(T)); - public override object ProvideValue(IServiceProvider serviceProvider) + public override object ProvideValue(IServiceProvider serviceProvider) => new CompiledBindingExtension( new CompiledBindingPathBuilder() .Property(PropertyInfo, PropertyInfoAccessorFactory.CreateInpcPropertyAccessor) diff --git a/src/Ryujinx/Common/Markup/MarkupExtensions.cs b/src/Ryujinx/Common/Markup/MarkupExtensions.cs index a804792c7..b2ed01517 100644 --- a/src/Ryujinx/Common/Markup/MarkupExtensions.cs +++ b/src/Ryujinx/Common/Markup/MarkupExtensions.cs @@ -6,19 +6,35 @@ namespace Ryujinx.Ava.Common.Markup { internal class IconExtension(string iconString) : BasicMarkupExtension { - protected override Icon GetValue() => new() { Value = iconString }; + public override string Name => "Icon"; + protected override Icon Value => new() { Value = iconString }; } - + internal class SpinningIconExtension(string iconString) : BasicMarkupExtension { - protected override Icon GetValue() => new() { Value = iconString, Animation = IconAnimation.Spin }; + public override string Name => "SIcon"; + protected override Icon Value => new() { Value = iconString, Animation = IconAnimation.Spin }; } - + internal class LocaleExtension(LocaleKeys key) : BasicMarkupExtension { - protected override string GetValue() => LocaleManager.Instance[key]; + public override string Name => "Translation"; + protected override string Value => LocaleManager.Instance[key]; - protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension) + protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension) + => bindingExtension.Source = LocaleManager.Instance; + } + + internal class WindowTitleExtension(LocaleKeys key, bool includeVersion) : BasicMarkupExtension + { + public WindowTitleExtension(LocaleKeys key) : this(key, true) + { + } + + public override string Name => "WindowTitleTranslation"; + protected override string Value => RyujinxApp.FormatTitle(key, includeVersion); + + protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension) => bindingExtension.Source = LocaleManager.Instance; } } diff --git a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApi.cs b/src/Ryujinx/Common/Models/Amiibo/AmiiboApi.cs similarity index 97% rename from src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApi.cs rename to src/Ryujinx/Common/Models/Amiibo/AmiiboApi.cs index 7989f0f1a..826e98d4f 100644 --- a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApi.cs +++ b/src/Ryujinx/Common/Models/Amiibo/AmiiboApi.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Amiibo +namespace Ryujinx.Ava.Common.Models.Amiibo { public struct AmiiboApi : IEquatable { diff --git a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiGamesSwitch.cs b/src/Ryujinx/Common/Models/Amiibo/AmiiboApiGamesSwitch.cs similarity index 90% rename from src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiGamesSwitch.cs rename to src/Ryujinx/Common/Models/Amiibo/AmiiboApiGamesSwitch.cs index 40e635bf0..7d43506e4 100644 --- a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiGamesSwitch.cs +++ b/src/Ryujinx/Common/Models/Amiibo/AmiiboApiGamesSwitch.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Amiibo +namespace Ryujinx.Ava.Common.Models.Amiibo { public class AmiiboApiGamesSwitch { diff --git a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiUsage.cs b/src/Ryujinx/Common/Models/Amiibo/AmiiboApiUsage.cs similarity index 84% rename from src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiUsage.cs rename to src/Ryujinx/Common/Models/Amiibo/AmiiboApiUsage.cs index 4f8d292b1..911323182 100644 --- a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboApiUsage.cs +++ b/src/Ryujinx/Common/Models/Amiibo/AmiiboApiUsage.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Amiibo +namespace Ryujinx.Ava.Common.Models.Amiibo { public class AmiiboApiUsage { diff --git a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJson.cs b/src/Ryujinx/Common/Models/Amiibo/AmiiboJson.cs similarity index 87% rename from src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJson.cs rename to src/Ryujinx/Common/Models/Amiibo/AmiiboJson.cs index 15083f505..39ca94bb6 100644 --- a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJson.cs +++ b/src/Ryujinx/Common/Models/Amiibo/AmiiboJson.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Amiibo +namespace Ryujinx.Ava.Common.Models.Amiibo { public struct AmiiboJson { diff --git a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJsonSerializerContext.cs b/src/Ryujinx/Common/Models/Amiibo/AmiiboJsonSerializerContext.cs similarity index 69% rename from src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJsonSerializerContext.cs rename to src/Ryujinx/Common/Models/Amiibo/AmiiboJsonSerializerContext.cs index bc3f1303c..e0fe11bc5 100644 --- a/src/Ryujinx.UI.Common/Models/Amiibo/AmiiboJsonSerializerContext.cs +++ b/src/Ryujinx/Common/Models/Amiibo/AmiiboJsonSerializerContext.cs @@ -1,9 +1,7 @@ using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Models.Amiibo +namespace Ryujinx.Ava.Common.Models.Amiibo { [JsonSerializable(typeof(AmiiboJson))] - public partial class AmiiboJsonSerializerContext : JsonSerializerContext - { - } + public partial class AmiiboJsonSerializerContext : JsonSerializerContext; } diff --git a/src/Ryujinx.UI.Common/Models/DownloadableContentModel.cs b/src/Ryujinx/Common/Models/DownloadableContentModel.cs similarity index 80% rename from src/Ryujinx.UI.Common/Models/DownloadableContentModel.cs rename to src/Ryujinx/Common/Models/DownloadableContentModel.cs index 95c64f078..de7a334ee 100644 --- a/src/Ryujinx.UI.Common/Models/DownloadableContentModel.cs +++ b/src/Ryujinx/Common/Models/DownloadableContentModel.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Models +namespace Ryujinx.Ava.Common.Models { // NOTE: most consuming code relies on this model being value-comparable public record DownloadableContentModel(ulong TitleId, string ContainerPath, string FullPath) @@ -6,7 +6,7 @@ namespace Ryujinx.UI.Common.Models public bool IsBundled { get; } = System.IO.Path.GetExtension(ContainerPath)?.ToLower() == ".xci"; public string FileName => System.IO.Path.GetFileName(ContainerPath); - public string TitleIdStr => TitleId.ToString("x16"); + public string TitleIdStr => TitleId.ToString("x16").ToUpper(); public ulong TitleIdBase => TitleId & ~0x1FFFUL; } } diff --git a/src/Ryujinx.UI.Common/Models/TitleUpdateModel.cs b/src/Ryujinx/Common/Models/TitleUpdateModel.cs similarity index 91% rename from src/Ryujinx.UI.Common/Models/TitleUpdateModel.cs rename to src/Ryujinx/Common/Models/TitleUpdateModel.cs index 5422e1303..fedecddbe 100644 --- a/src/Ryujinx.UI.Common/Models/TitleUpdateModel.cs +++ b/src/Ryujinx/Common/Models/TitleUpdateModel.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Models +namespace Ryujinx.Ava.Common.Models { // NOTE: most consuming code relies on this model being value-comparable public record TitleUpdateModel(ulong TitleId, ulong Version, string DisplayVersion, string Path) diff --git a/src/Ryujinx.UI.Common/Models/XCITrimmerFileModel.cs b/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs similarity index 78% rename from src/Ryujinx.UI.Common/Models/XCITrimmerFileModel.cs rename to src/Ryujinx/Common/Models/XCITrimmerFileModel.cs index 95fb3985b..233ac2b6d 100644 --- a/src/Ryujinx.UI.Common/Models/XCITrimmerFileModel.cs +++ b/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs @@ -1,8 +1,8 @@ +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; -using Ryujinx.UI.App.Common; -namespace Ryujinx.UI.Common.Models +namespace Ryujinx.Ava.Common.Models { public record XCITrimmerFileModel( string Name, @@ -16,7 +16,7 @@ namespace Ryujinx.UI.Common.Models { public static XCITrimmerFileModel FromApplicationData(ApplicationData applicationData, XCIFileTrimmerLog logger) { - var trimmer = new XCIFileTrimmer(applicationData.Path, logger); + XCIFileTrimmer trimmer = new(applicationData.Path, logger); return new XCITrimmerFileModel( applicationData.Name, @@ -34,8 +34,8 @@ namespace Ryujinx.UI.Common.Models { get { - return ProcessingOutcome != XCIFileTrimmer.OperationOutcome.Undetermined && - ProcessingOutcome != XCIFileTrimmer.OperationOutcome.Successful; + return ProcessingOutcome is not XCIFileTrimmer.OperationOutcome.Undetermined and + not XCIFileTrimmer.OperationOutcome.Successful; } } @@ -43,10 +43,10 @@ namespace Ryujinx.UI.Common.Models { if (obj == null) return false; - + return this.Path == obj.Path; } - + public override int GetHashCode() { return this.Path.GetHashCode(); diff --git a/src/Ryujinx/Common/ThemeManager.cs b/src/Ryujinx/Common/ThemeManager.cs deleted file mode 100644 index 8c52c2a66..000000000 --- a/src/Ryujinx/Common/ThemeManager.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace Ryujinx.Ava.Common -{ - public static class ThemeManager - { - public static event EventHandler ThemeChanged; - - public static void OnThemeChanged() - { - ThemeChanged?.Invoke(null, EventArgs.Empty); - } - } -} diff --git a/src/Ryujinx/Common/XCIFileTrimmerMainWindowLog.cs b/src/Ryujinx/Common/XCIFileTrimmerMainWindowLog.cs deleted file mode 100644 index 98347968e..000000000 --- a/src/Ryujinx/Common/XCIFileTrimmerMainWindowLog.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Avalonia.Threading; -using Ryujinx.Ava.UI.ViewModels; - -namespace Ryujinx.Ava.Common -{ - internal class XCIFileTrimmerMainWindowLog : Ryujinx.Common.Logging.XCIFileTrimmerLog - { - private readonly MainWindowViewModel _viewModel; - - public XCIFileTrimmerMainWindowLog(MainWindowViewModel viewModel) - { - _viewModel = viewModel; - } - - public override void Progress(long current, long total, string text, bool complete) - { - Dispatcher.UIThread.Post(() => - { - _viewModel.StatusBarProgressMaximum = (int)(total); - _viewModel.StatusBarProgressValue = (int)(current); - }); - } - } -} diff --git a/src/Ryujinx/Common/XCIFileTrimmerWindowLog.cs b/src/Ryujinx/Common/XCIFileTrimmerWindowLog.cs deleted file mode 100644 index 2481d9107..000000000 --- a/src/Ryujinx/Common/XCIFileTrimmerWindowLog.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Avalonia.Threading; -using Ryujinx.Ava.UI.ViewModels; - -namespace Ryujinx.Ava.Common -{ - internal class XCIFileTrimmerWindowLog : Ryujinx.Common.Logging.XCIFileTrimmerLog - { - private readonly XCITrimmerViewModel _viewModel; - - public XCIFileTrimmerWindowLog(XCITrimmerViewModel viewModel) - { - _viewModel = viewModel; - } - - public override void Progress(long current, long total, string text, bool complete) - { - Dispatcher.UIThread.Post(() => - { - _viewModel.SetProgress((int)(current), (int)(total)); - }); - } - } -} diff --git a/src/Ryujinx/Common/XCITrimmerLog.cs b/src/Ryujinx/Common/XCITrimmerLog.cs new file mode 100644 index 000000000..3f840abba --- /dev/null +++ b/src/Ryujinx/Common/XCITrimmerLog.cs @@ -0,0 +1,45 @@ +using Avalonia.Threading; +using Ryujinx.Ava.UI.ViewModels; + +namespace Ryujinx.Ava.Common +{ + public static class XCITrimmerLog + { + internal class MainWindow : Ryujinx.Common.Logging.XCIFileTrimmerLog + { + private readonly MainWindowViewModel _viewModel; + + public MainWindow(MainWindowViewModel viewModel) + { + _viewModel = viewModel; + } + + public override void Progress(long current, long total, string text, bool complete) + { + Dispatcher.UIThread.Post(() => + { + _viewModel.StatusBarProgressMaximum = (int)(total); + _viewModel.StatusBarProgressValue = (int)(current); + }); + } + } + + internal class TrimmerWindow : Ryujinx.Common.Logging.XCIFileTrimmerLog + { + private readonly XciTrimmerViewModel _viewModel; + + public TrimmerWindow(XciTrimmerViewModel viewModel) + { + _viewModel = viewModel; + } + + public override void Progress(long current, long total, string text, bool complete) + { + Dispatcher.UIThread.Post(() => + { + _viewModel.SetProgress((int)(current), (int)(total)); + }); + } + } + } +} diff --git a/src/Ryujinx.Headless.SDL2/HeadlessDynamicTextInputHandler.cs b/src/Ryujinx/Headless/HeadlessDynamicTextInputHandler.cs similarity index 97% rename from src/Ryujinx.Headless.SDL2/HeadlessDynamicTextInputHandler.cs rename to src/Ryujinx/Headless/HeadlessDynamicTextInputHandler.cs index 40eb5ba98..2a507d2b7 100644 --- a/src/Ryujinx.Headless.SDL2/HeadlessDynamicTextInputHandler.cs +++ b/src/Ryujinx/Headless/HeadlessDynamicTextInputHandler.cs @@ -2,7 +2,7 @@ using Ryujinx.HLE.UI; using System.Threading; using System.Threading.Tasks; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { /// /// Headless text processing class, right now there is no way to forward the input to it. diff --git a/src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs b/src/Ryujinx/Headless/HeadlessHostUiTheme.cs similarity index 93% rename from src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs rename to src/Ryujinx/Headless/HeadlessHostUiTheme.cs index 78cd43ae5..b5e1ce526 100644 --- a/src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs +++ b/src/Ryujinx/Headless/HeadlessHostUiTheme.cs @@ -1,6 +1,6 @@ using Ryujinx.HLE.UI; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { internal class HeadlessHostUiTheme : IHostUITheme { diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs new file mode 100644 index 000000000..f15d24e8a --- /dev/null +++ b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs @@ -0,0 +1,355 @@ +using DiscordRPC; +using LibHac.Tools.FsSystem; +using Ryujinx.Audio.Backends.SDL2; +using Ryujinx.Ava; +using Ryujinx.Ava.Systems; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Common.Configuration; +using Ryujinx.Common.Configuration.Hid; +using Ryujinx.Common.Configuration.Hid.Controller; +using Ryujinx.Common.Configuration.Hid.Controller.Motion; +using Ryujinx.Common.Configuration.Hid.Keyboard; +using Ryujinx.Common.Logging; +using Ryujinx.Common.Utilities; +using Ryujinx.Cpu; +using Ryujinx.Graphics.GAL; +using Ryujinx.Graphics.OpenGL; +using Ryujinx.Graphics.Vulkan; +using Ryujinx.HLE; +using Ryujinx.Input; +using Silk.NET.Vulkan; +using System; +using System.IO; +using System.Text.Json; +using System.Threading.Tasks; +using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId; +using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId; +using Key = Ryujinx.Common.Configuration.Hid.Key; + +namespace Ryujinx.Headless +{ + public partial class HeadlessRyujinx + { + public static void Initialize() + { + // Ensure Discord presence timestamp begins at the absolute start of when Ryujinx is launched + DiscordIntegrationModule.EmulatorStartedAt = Timestamps.Now; + + // Delete backup files after updating. + Task.Run(Updater.CleanupUpdate); + + // Hook unhandled exception and process exit events. + AppDomain.CurrentDomain.UnhandledException += (sender, e) + => Program.ProcessUnhandledException(sender, e.ExceptionObject as Exception, e.IsTerminating); + AppDomain.CurrentDomain.ProcessExit += (_, _) => Program.Exit(); + + // Initialize the configuration. + ConfigurationState.Initialize(); + + // Initialize Discord integration. + DiscordIntegrationModule.Initialize(); + + // Logging system information. + Program.PrintSystemInfo(); + } + + private static InputConfig HandlePlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index) + { + if (inputId == null) + { + if (index == PlayerIndex.Player1) + { + Logger.Info?.Print(LogClass.Application, $"{index} not configured, defaulting to default keyboard."); + + // Default to keyboard + inputId = "0"; + } + else + { + Logger.Info?.Print(LogClass.Application, $"{index} not configured"); + + return null; + } + } + + IGamepad gamepad = _inputManager.KeyboardDriver.GetGamepad(inputId); + + bool isKeyboard = true; + + if (gamepad == null) + { + gamepad = _inputManager.GamepadDriver.GetGamepad(inputId); + isKeyboard = false; + + if (gamepad == null) + { + Logger.Error?.Print(LogClass.Application, $"{index} gamepad not found (\"{inputId}\")"); + + return null; + } + } + + string gamepadName = gamepad.Name; + + gamepad.Dispose(); + + InputConfig config; + + if (inputProfileName == null || inputProfileName.Equals("default")) + { + if (isKeyboard) + { + config = new StandardKeyboardInputConfig + { + Version = InputConfig.CurrentVersion, + Backend = InputBackendType.WindowKeyboard, + Id = null, + ControllerType = ControllerType.JoyconPair, + LeftJoycon = new LeftJoyconCommonConfig + { + DpadUp = Key.Up, + DpadDown = Key.Down, + DpadLeft = Key.Left, + DpadRight = Key.Right, + ButtonMinus = Key.Minus, + ButtonL = Key.E, + ButtonZl = Key.Q, + ButtonSl = Key.Unbound, + ButtonSr = Key.Unbound, + }, + + LeftJoyconStick = new JoyconConfigKeyboardStick + { + StickUp = Key.W, + StickDown = Key.S, + StickLeft = Key.A, + StickRight = Key.D, + StickButton = Key.F, + }, + + RightJoycon = new RightJoyconCommonConfig + { + ButtonA = Key.Z, + ButtonB = Key.X, + ButtonX = Key.C, + ButtonY = Key.V, + ButtonPlus = Key.Plus, + ButtonR = Key.U, + ButtonZr = Key.O, + ButtonSl = Key.Unbound, + ButtonSr = Key.Unbound, + }, + + RightJoyconStick = new JoyconConfigKeyboardStick + { + StickUp = Key.I, + StickDown = Key.K, + StickLeft = Key.J, + StickRight = Key.L, + StickButton = Key.H, + }, + }; + } + else + { + bool isNintendoStyle = gamepadName.Contains("Nintendo"); + + config = new StandardControllerInputConfig + { + Version = InputConfig.CurrentVersion, + Backend = InputBackendType.GamepadSDL2, + Id = null, + ControllerType = ControllerType.JoyconPair, + DeadzoneLeft = 0.1f, + DeadzoneRight = 0.1f, + RangeLeft = 1.0f, + RangeRight = 1.0f, + TriggerThreshold = 0.5f, + LeftJoycon = new LeftJoyconCommonConfig + { + DpadUp = ConfigGamepadInputId.DpadUp, + DpadDown = ConfigGamepadInputId.DpadDown, + DpadLeft = ConfigGamepadInputId.DpadLeft, + DpadRight = ConfigGamepadInputId.DpadRight, + ButtonMinus = ConfigGamepadInputId.Minus, + ButtonL = ConfigGamepadInputId.LeftShoulder, + ButtonZl = ConfigGamepadInputId.LeftTrigger, + ButtonSl = ConfigGamepadInputId.Unbound, + ButtonSr = ConfigGamepadInputId.Unbound, + }, + + LeftJoyconStick = new JoyconConfigControllerStick + { + Joystick = ConfigStickInputId.Left, + StickButton = ConfigGamepadInputId.LeftStick, + InvertStickX = false, + InvertStickY = false, + Rotate90CW = false, + }, + + RightJoycon = new RightJoyconCommonConfig + { + ButtonA = isNintendoStyle ? ConfigGamepadInputId.A : ConfigGamepadInputId.B, + ButtonB = isNintendoStyle ? ConfigGamepadInputId.B : ConfigGamepadInputId.A, + ButtonX = isNintendoStyle ? ConfigGamepadInputId.X : ConfigGamepadInputId.Y, + ButtonY = isNintendoStyle ? ConfigGamepadInputId.Y : ConfigGamepadInputId.X, + ButtonPlus = ConfigGamepadInputId.Plus, + ButtonR = ConfigGamepadInputId.RightShoulder, + ButtonZr = ConfigGamepadInputId.RightTrigger, + ButtonSl = ConfigGamepadInputId.Unbound, + ButtonSr = ConfigGamepadInputId.Unbound, + }, + + RightJoyconStick = new JoyconConfigControllerStick + { + Joystick = ConfigStickInputId.Right, + StickButton = ConfigGamepadInputId.RightStick, + InvertStickX = false, + InvertStickY = false, + Rotate90CW = false, + }, + + Motion = new StandardMotionConfigController + { + MotionBackend = MotionInputBackendType.GamepadDriver, + EnableMotion = true, + Sensitivity = 100, + GyroDeadzone = 1, + }, + Rumble = new RumbleConfigController + { + StrongRumble = 1f, + WeakRumble = 1f, + EnableRumble = false, + }, + }; + } + } + else + { + string profileBasePath; + + if (isKeyboard) + { + profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "keyboard"); + } + else + { + profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "controller"); + } + + string path = Path.Combine(profileBasePath, inputProfileName + ".json"); + + if (!File.Exists(path)) + { + Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" not found for \"{inputId}\""); + + return null; + } + + try + { + config = JsonHelper.DeserializeFromFile(path, _serializerContext.InputConfig); + } + catch (JsonException) + { + Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" parsing failed for \"{inputId}\""); + + return null; + } + } + + config.Id = inputId; + config.PlayerIndex = index; + + string inputTypeName = isKeyboard ? "Keyboard" : "Gamepad"; + + Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} configured with {inputTypeName} \"{config.Id}\""); + + // If both stick ranges are 0 (usually indicative of an outdated profile load) then both sticks will be set to 1.0. + if (config is StandardControllerInputConfig controllerConfig) + { + if (controllerConfig.RangeLeft <= 0.0f && controllerConfig.RangeRight <= 0.0f) + { + controllerConfig.RangeLeft = 1.0f; + controllerConfig.RangeRight = 1.0f; + + Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} stick range reset. Save the profile now to update your configuration"); + } + } + + return config; + } + + private static IRenderer CreateRenderer(Options options, WindowBase window) + { + if (options.GraphicsBackend == GraphicsBackend.Vulkan && window is VulkanWindow vulkanWindow) + { + string preferredGpuId = string.Empty; + Vk api = Vk.GetApi(); + + if (!string.IsNullOrEmpty(options.PreferredGPUVendor)) + { + string preferredGpuVendor = options.PreferredGPUVendor.ToLowerInvariant(); + DeviceInfo[] devices = VulkanRenderer.GetPhysicalDevices(api); + + foreach (DeviceInfo device in devices) + { + if (device.Vendor.Equals(preferredGpuVendor, StringComparison.OrdinalIgnoreCase)) + { + preferredGpuId = device.Id; + break; + } + } + } + + return new VulkanRenderer( + api, + (instance, vk) => new SurfaceKHR((ulong)(vulkanWindow.CreateWindowSurface(instance.Handle))), + vulkanWindow.GetRequiredInstanceExtensions, + preferredGpuId); + } + + return new OpenGLRenderer(); + } + + private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options) => + new( + new HleConfiguration( + options.DramSize, + options.SystemLanguage, + options.SystemRegion, + options.VSyncMode, + !options.DisableDockedMode, + !options.DisablePTC, + ITickSource.RealityTickScalar, + options.EnableInternetAccess, + !options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, + options.FsGlobalAccessLogMode, + options.SystemTimeOffset, + options.SystemTimeZone, + options.MemoryManagerMode, + options.IgnoreMissingServices, + options.AspectRatio, + options.AudioVolume, + options.UseHypervisor ?? true, + options.MultiplayerLanInterfaceId, + Common.Configuration.Multiplayer.MultiplayerMode.Disabled, + false, + string.Empty, + string.Empty, + options.CustomVSyncInterval + ) + .Configure( + _virtualFileSystem, + _libHacHorizonManager, + _contentManager, + _accountManager, + _userChannelPersistence, + renderer.TryMakeThreaded(options.BackendThreading), + new SDL2HardwareDeviceDriver(), + window + ) + ); + } +} diff --git a/src/Ryujinx.Headless.SDL2/Program.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs similarity index 50% rename from src/Ryujinx.Headless.SDL2/Program.cs rename to src/Ryujinx/Headless/HeadlessRyujinx.cs index ff87a3845..9a06482f9 100644 --- a/src/Ryujinx.Headless.SDL2/Program.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs @@ -1,12 +1,11 @@ using CommandLine; -using LibHac.Tools.FsSystem; -using Ryujinx.Audio.Backends.SDL2; +using Gommon; +using Ryujinx.Ava; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Controller; -using Ryujinx.Common.Configuration.Hid.Controller.Motion; -using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.GraphicsDriver; using Ryujinx.Common.Logging; using Ryujinx.Common.Logging.Targets; @@ -14,14 +13,9 @@ using Ryujinx.Common.SystemInterop; using Ryujinx.Common.Utilities; using Ryujinx.Cpu; using Ryujinx.Graphics.GAL; -using Ryujinx.Graphics.GAL.Multithreading; using Ryujinx.Graphics.Gpu; using Ryujinx.Graphics.Gpu.Shader; -using Ryujinx.Graphics.OpenGL; -using Ryujinx.Graphics.Vulkan; using Ryujinx.Graphics.Vulkan.MoltenVK; -using Ryujinx.Headless.SDL2.OpenGL; -using Ryujinx.Headless.SDL2.Vulkan; using Ryujinx.HLE; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; @@ -30,22 +24,16 @@ using Ryujinx.Input; using Ryujinx.Input.HLE; using Ryujinx.Input.SDL2; using Ryujinx.SDL2.Common; -using Silk.NET.Vulkan; using System; using System.Collections.Generic; using System.IO; -using System.Text.Json; +using System.Linq; using System.Threading; -using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId; -using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId; -using Key = Ryujinx.Common.Configuration.Hid.Key; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { - class Program + public partial class HeadlessRyujinx { - public static string Version { get; private set; } - private static VirtualFileSystem _virtualFileSystem; private static ContentManager _contentManager; private static AccountManager _accountManager; @@ -55,20 +43,18 @@ namespace Ryujinx.Headless.SDL2 private static Switch _emulationContext; private static WindowBase _window; private static WindowsMultimediaTimerResolution _windowsMultimediaTimerResolution; - private static List _inputConfiguration; + private static List _inputConfiguration = []; private static bool _enableKeyboard; private static bool _enableMouse; private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); - static void Main(string[] args) + public static void Entrypoint(string[] args) { - Version = ReleaseInformation.Version; - // Make process DPI aware for proper window sizing on high-res screens. ForceDpiAware.Windows(); - Console.Title = $"Ryujinx Console {Version} (Headless SDL2)"; + Console.Title = $"HeadlessRyujinx Console {Program.Version}"; if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux()) { @@ -96,242 +82,92 @@ namespace Ryujinx.Headless.SDL2 } Parser.Default.ParseArguments(args) - .WithParsed(Load) - .WithNotParsed(errors => errors.Output()); + .WithParsed(options => Load(args, options)) + .WithNotParsed(errors => + { + Logger.Error?.PrintMsg(LogClass.Application, "Error parsing command-line arguments:"); + + errors.ForEach(err => Logger.Error?.PrintMsg(LogClass.Application, $" - {err.Tag}")); + }); } - private static InputConfig HandlePlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index) + public static void ReloadConfig(string customConfigPath = null) { - if (inputId == null) + string localConfigurationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ReleaseInformation.ConfigName); + string appDataConfigurationPath = Path.Combine(AppDataManager.BaseDirPath, ReleaseInformation.ConfigName); + + string configurationPath = null; + + // Now load the configuration as the other subsystems are now registered + if (customConfigPath != null && File.Exists(customConfigPath)) { - if (index == PlayerIndex.Player1) - { - Logger.Info?.Print(LogClass.Application, $"{index} not configured, defaulting to default keyboard."); - - // Default to keyboard - inputId = "0"; - } - else - { - Logger.Info?.Print(LogClass.Application, $"{index} not configured"); - - return null; - } + configurationPath = customConfigPath; + } + else if (File.Exists(localConfigurationPath)) + { + configurationPath = localConfigurationPath; + } + else if (File.Exists(appDataConfigurationPath)) + { + configurationPath = appDataConfigurationPath; } - IGamepad gamepad = _inputManager.KeyboardDriver.GetGamepad(inputId); - - bool isKeyboard = true; - - if (gamepad == null) + if (configurationPath == null) { - gamepad = _inputManager.GamepadDriver.GetGamepad(inputId); - isKeyboard = false; + // No configuration, we load the default values and save it to disk + configurationPath = appDataConfigurationPath; + Logger.Notice.Print(LogClass.Application, $"No configuration file found. Saving default configuration to: {configurationPath}"); - if (gamepad == null) - { - Logger.Error?.Print(LogClass.Application, $"{index} gamepad not found (\"{inputId}\")"); - - return null; - } - } - - string gamepadName = gamepad.Name; - - gamepad.Dispose(); - - InputConfig config; - - if (inputProfileName == null || inputProfileName.Equals("default")) - { - if (isKeyboard) - { - config = new StandardKeyboardInputConfig - { - Version = InputConfig.CurrentVersion, - Backend = InputBackendType.WindowKeyboard, - Id = null, - ControllerType = ControllerType.JoyconPair, - LeftJoycon = new LeftJoyconCommonConfig - { - DpadUp = Key.Up, - DpadDown = Key.Down, - DpadLeft = Key.Left, - DpadRight = Key.Right, - ButtonMinus = Key.Minus, - ButtonL = Key.E, - ButtonZl = Key.Q, - ButtonSl = Key.Unbound, - ButtonSr = Key.Unbound, - }, - - LeftJoyconStick = new JoyconConfigKeyboardStick - { - StickUp = Key.W, - StickDown = Key.S, - StickLeft = Key.A, - StickRight = Key.D, - StickButton = Key.F, - }, - - RightJoycon = new RightJoyconCommonConfig - { - ButtonA = Key.Z, - ButtonB = Key.X, - ButtonX = Key.C, - ButtonY = Key.V, - ButtonPlus = Key.Plus, - ButtonR = Key.U, - ButtonZr = Key.O, - ButtonSl = Key.Unbound, - ButtonSr = Key.Unbound, - }, - - RightJoyconStick = new JoyconConfigKeyboardStick - { - StickUp = Key.I, - StickDown = Key.K, - StickLeft = Key.J, - StickRight = Key.L, - StickButton = Key.H, - }, - }; - } - else - { - bool isNintendoStyle = gamepadName.Contains("Nintendo"); - - config = new StandardControllerInputConfig - { - Version = InputConfig.CurrentVersion, - Backend = InputBackendType.GamepadSDL2, - Id = null, - ControllerType = ControllerType.JoyconPair, - DeadzoneLeft = 0.1f, - DeadzoneRight = 0.1f, - RangeLeft = 1.0f, - RangeRight = 1.0f, - TriggerThreshold = 0.5f, - LeftJoycon = new LeftJoyconCommonConfig - { - DpadUp = ConfigGamepadInputId.DpadUp, - DpadDown = ConfigGamepadInputId.DpadDown, - DpadLeft = ConfigGamepadInputId.DpadLeft, - DpadRight = ConfigGamepadInputId.DpadRight, - ButtonMinus = ConfigGamepadInputId.Minus, - ButtonL = ConfigGamepadInputId.LeftShoulder, - ButtonZl = ConfigGamepadInputId.LeftTrigger, - ButtonSl = ConfigGamepadInputId.Unbound, - ButtonSr = ConfigGamepadInputId.Unbound, - }, - - LeftJoyconStick = new JoyconConfigControllerStick - { - Joystick = ConfigStickInputId.Left, - StickButton = ConfigGamepadInputId.LeftStick, - InvertStickX = false, - InvertStickY = false, - Rotate90CW = false, - }, - - RightJoycon = new RightJoyconCommonConfig - { - ButtonA = isNintendoStyle ? ConfigGamepadInputId.A : ConfigGamepadInputId.B, - ButtonB = isNintendoStyle ? ConfigGamepadInputId.B : ConfigGamepadInputId.A, - ButtonX = isNintendoStyle ? ConfigGamepadInputId.X : ConfigGamepadInputId.Y, - ButtonY = isNintendoStyle ? ConfigGamepadInputId.Y : ConfigGamepadInputId.X, - ButtonPlus = ConfigGamepadInputId.Plus, - ButtonR = ConfigGamepadInputId.RightShoulder, - ButtonZr = ConfigGamepadInputId.RightTrigger, - ButtonSl = ConfigGamepadInputId.Unbound, - ButtonSr = ConfigGamepadInputId.Unbound, - }, - - RightJoyconStick = new JoyconConfigControllerStick - { - Joystick = ConfigStickInputId.Right, - StickButton = ConfigGamepadInputId.RightStick, - InvertStickX = false, - InvertStickY = false, - Rotate90CW = false, - }, - - Motion = new StandardMotionConfigController - { - MotionBackend = MotionInputBackendType.GamepadDriver, - EnableMotion = true, - Sensitivity = 100, - GyroDeadzone = 1, - }, - Rumble = new RumbleConfigController - { - StrongRumble = 1f, - WeakRumble = 1f, - EnableRumble = false, - }, - }; - } + ConfigurationState.Instance.LoadDefault(); + ConfigurationState.Instance.ToFileFormat().SaveConfig(configurationPath); } else { - string profileBasePath; + Logger.Notice.Print(LogClass.Application, $"Loading configuration from: {configurationPath}"); - if (isKeyboard) + if (ConfigurationFileFormat.TryLoad(configurationPath, out ConfigurationFileFormat configurationFileFormat)) { - profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "keyboard"); + ConfigurationState.Instance.Load(configurationFileFormat, configurationPath); } else { - profileBasePath = Path.Combine(AppDataManager.ProfilesDirPath, "controller"); - } + Logger.Warning?.PrintMsg(LogClass.Application, $"Failed to load config! Loading the default config instead.\nFailed config location: {configurationPath}"); - string path = Path.Combine(profileBasePath, inputProfileName + ".json"); - - if (!File.Exists(path)) - { - Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" not found for \"{inputId}\""); - - return null; - } - - try - { - config = JsonHelper.DeserializeFromFile(path, _serializerContext.InputConfig); - } - catch (JsonException) - { - Logger.Error?.Print(LogClass.Application, $"Input profile \"{inputProfileName}\" parsing failed for \"{inputId}\""); - - return null; + ConfigurationState.Instance.LoadDefault(); } } - - config.Id = inputId; - config.PlayerIndex = index; - - string inputTypeName = isKeyboard ? "Keyboard" : "Gamepad"; - - Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} configured with {inputTypeName} \"{config.Id}\""); - - // If both stick ranges are 0 (usually indicative of an outdated profile load) then both sticks will be set to 1.0. - if (config is StandardControllerInputConfig controllerConfig) - { - if (controllerConfig.RangeLeft <= 0.0f && controllerConfig.RangeRight <= 0.0f) - { - controllerConfig.RangeLeft = 1.0f; - controllerConfig.RangeRight = 1.0f; - - Logger.Info?.Print(LogClass.Application, $"{config.PlayerIndex} stick range reset. Save the profile now to update your configuration"); - } - } - - return config; } - static void Load(Options option) + static void Load(string[] originalArgs, Options option) { + Initialize(); + + bool useLastUsedProfile = false; + + if (option.InheritConfig) + { + option.InheritMainConfig(originalArgs, ConfigurationState.Instance, out useLastUsedProfile); + } + AppDataManager.Initialize(option.BaseDataDir); + if (useLastUsedProfile && AccountSaveDataManager.GetLastUsedUser().TryGet(out UserProfile profile)) + option.UserProfile = profile.Name; + + // Check if keys exists. + if (!File.Exists(Path.Combine(AppDataManager.KeysDirPath, "prod.keys"))) + { + if (!(AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile && File.Exists(Path.Combine(AppDataManager.KeysDirPathUser, "prod.keys")))) + { + Logger.Error?.Print(LogClass.Application, "Keys not found"); + } + } + + ReloadConfig(); + + if (!option.DisableMainInputConfig) + option.InheritMainConfigInput(originalArgs, ConfigurationState.Instance); + _virtualFileSystem = VirtualFileSystem.CreateInstance(); _libHacHorizonManager = new LibHacHorizonManager(); @@ -346,7 +182,7 @@ namespace Ryujinx.Headless.SDL2 _inputManager = new InputManager(new SDL2KeyboardDriver(), new SDL2GamepadDriver()); - GraphicsConfig.EnableShaderCache = true; + GraphicsConfig.EnableShaderCache = !option.DisableShaderCache; if (OperatingSystem.IsMacOS()) { @@ -357,15 +193,13 @@ namespace Ryujinx.Headless.SDL2 } } - IGamepad gamepad; - if (option.ListInputIds) { Logger.Info?.Print(LogClass.Application, "Input Ids:"); foreach (string id in _inputManager.KeyboardDriver.GamepadsIds) { - gamepad = _inputManager.KeyboardDriver.GetGamepad(id); + IGamepad gamepad = _inputManager.KeyboardDriver.GetGamepad(id); Logger.Info?.Print(LogClass.Application, $"- {id} (\"{gamepad.Name}\")"); @@ -374,7 +208,7 @@ namespace Ryujinx.Headless.SDL2 foreach (string id in _inputManager.GamepadDriver.GamepadsIds) { - gamepad = _inputManager.GamepadDriver.GetGamepad(id); + IGamepad gamepad = _inputManager.GamepadDriver.GetGamepad(id); Logger.Info?.Print(LogClass.Application, $"- {id} (\"{gamepad.Name}\")"); @@ -391,20 +225,10 @@ namespace Ryujinx.Headless.SDL2 return; } - _inputConfiguration = new List(); + _inputConfiguration ??= []; _enableKeyboard = option.EnableKeyboard; _enableMouse = option.EnableMouse; - static void LoadPlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index) - { - InputConfig inputConfig = HandlePlayerConfiguration(inputProfileName, inputId, index); - - if (inputConfig != null) - { - _inputConfiguration.Add(inputConfig); - } - } - LoadPlayerConfiguration(option.InputProfile1Name, option.InputId1, PlayerIndex.Player1); LoadPlayerConfiguration(option.InputProfile2Name, option.InputId2, PlayerIndex.Player2); LoadPlayerConfiguration(option.InputProfile3Name, option.InputId3, PlayerIndex.Player3); @@ -425,7 +249,7 @@ namespace Ryujinx.Headless.SDL2 Logger.SetEnable(LogLevel.Stub, !option.LoggingDisableStub); Logger.SetEnable(LogLevel.Info, !option.LoggingDisableInfo); Logger.SetEnable(LogLevel.Warning, !option.LoggingDisableWarning); - Logger.SetEnable(LogLevel.Error, option.LoggingEnableError); + Logger.SetEnable(LogLevel.Error, !option.LoggingDisableError); Logger.SetEnable(LogLevel.Trace, option.LoggingEnableTrace); Logger.SetEnable(LogLevel.Guest, !option.LoggingDisableGuest); Logger.SetEnable(LogLevel.AccessLog, option.LoggingEnableFsAccessLog); @@ -463,6 +287,10 @@ namespace Ryujinx.Headless.SDL2 DriverUtilities.InitDriverConfig(option.BackendThreading == BackendThreading.Off); + if (_inputConfiguration.OfType() + .Any(ic => ic?.Led?.UseRainbow ?? false)) + Rainbow.Enable(); + while (true) { LoadApplication(option); @@ -475,7 +303,29 @@ namespace Ryujinx.Headless.SDL2 _userChannelPersistence.ShouldRestart = false; } - _inputManager.Dispose(); + try + { + _inputManager.Dispose(); + } + catch { } + + return; + + void LoadPlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index) + { + if (index == PlayerIndex.Handheld && _inputConfiguration.Count > 0) + { + Logger.Info?.Print(LogClass.Configuration, "Skipping handheld configuration as there are already other players configured."); + return; + } + + InputConfig inputConfig = option.InheritedInputConfigs[index] ?? HandlePlayerConfiguration(inputProfileName, inputId, index); + + if (inputConfig != null) + { + _inputConfiguration.Add(inputConfig); + } + } } private static void SetupProgressHandler() @@ -494,96 +344,21 @@ namespace Ryujinx.Headless.SDL2 { string label = state switch { - LoadState => $"PTC : {current}/{total}", - ShaderCacheState => $"Shaders : {current}/{total}", - _ => throw new ArgumentException($"Unknown Progress Handler type {typeof(T)}"), + LoadState => "PTC", + ShaderCacheState => "Shaders", + _ => throw new ArgumentException($"Unknown Progress Handler type {typeof(T)}") }; - Logger.Info?.Print(LogClass.Application, label); + Logger.Info?.Print(LogClass.Application, $"{label} : {current}/{total}"); } private static WindowBase CreateWindow(Options options) { - return options.GraphicsBackend == GraphicsBackend.Vulkan - ? new VulkanWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursorMode, options.IgnoreControllerApplet) - : new OpenGLWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursorMode, options.IgnoreControllerApplet); - } - - private static IRenderer CreateRenderer(Options options, WindowBase window) - { - if (options.GraphicsBackend == GraphicsBackend.Vulkan && window is VulkanWindow vulkanWindow) + return options.GraphicsBackend switch { - string preferredGpuId = string.Empty; - Vk api = Vk.GetApi(); - - if (!string.IsNullOrEmpty(options.PreferredGPUVendor)) - { - string preferredGpuVendor = options.PreferredGPUVendor.ToLowerInvariant(); - var devices = VulkanRenderer.GetPhysicalDevices(api); - - foreach (var device in devices) - { - if (device.Vendor.ToLowerInvariant() == preferredGpuVendor) - { - preferredGpuId = device.Id; - break; - } - } - } - - return new VulkanRenderer( - api, - (instance, vk) => new SurfaceKHR((ulong)(vulkanWindow.CreateWindowSurface(instance.Handle))), - vulkanWindow.GetRequiredInstanceExtensions, - preferredGpuId); - } - - return new OpenGLRenderer(); - } - - private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options) - { - BackendThreading threadingMode = options.BackendThreading; - - bool threadedGAL = threadingMode == BackendThreading.On || (threadingMode == BackendThreading.Auto && renderer.PreferThreading); - - if (threadedGAL) - { - renderer = new ThreadedRenderer(renderer); - } - - HLEConfiguration configuration = new(_virtualFileSystem, - _libHacHorizonManager, - _contentManager, - _accountManager, - _userChannelPersistence, - renderer, - new SDL2HardwareDeviceDriver(), - options.DramSize, - window, - options.SystemLanguage, - options.SystemRegion, - options.VSyncMode, - !options.DisableDockedMode, - !options.DisablePTC, - options.EnableInternetAccess, - !options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, - options.FsGlobalAccessLogMode, - options.SystemTimeOffset, - options.SystemTimeZone, - options.MemoryManagerMode, - options.IgnoreMissingServices, - options.AspectRatio, - options.AudioVolume, - options.UseHypervisor ?? true, - options.MultiplayerLanInterfaceId, - Common.Configuration.Multiplayer.MultiplayerMode.Disabled, - false, - "", - "", - options.CustomVSyncInterval); - - return new Switch(configuration); + GraphicsBackend.Vulkan => new VulkanWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursorMode, options.IgnoreControllerApplet), + _ => new OpenGLWindow(_inputManager, options.LoggingGraphicsDebugLevel, options.AspectRatio, options.EnableMouse, options.HideCursorMode, options.IgnoreControllerApplet) + }; } private static void ExecutionEntrypoint() @@ -680,6 +455,7 @@ namespace Ryujinx.Headless.SDL2 return false; } + break; case ".nca": Logger.Info?.Print(LogClass.Application, "Loading as NCA."); @@ -690,6 +466,7 @@ namespace Ryujinx.Headless.SDL2 return false; } + break; case ".nsp": case ".pfs0": @@ -701,6 +478,7 @@ namespace Ryujinx.Headless.SDL2 return false; } + break; default: Logger.Info?.Print(LogClass.Application, "Loading as Homebrew."); @@ -713,7 +491,7 @@ namespace Ryujinx.Headless.SDL2 return false; } } - catch (ArgumentOutOfRangeException) + catch { Logger.Error?.Print(LogClass.Application, "The specified file is not supported by Ryujinx."); @@ -721,6 +499,7 @@ namespace Ryujinx.Headless.SDL2 return false; } + break; } } diff --git a/src/Ryujinx.Headless.SDL2/Options.cs b/src/Ryujinx/Headless/Options.cs similarity index 57% rename from src/Ryujinx.Headless.SDL2/Options.cs rename to src/Ryujinx/Headless/Options.cs index 4e2ad5b58..49050005c 100644 --- a/src/Ryujinx.Headless.SDL2/Options.cs +++ b/src/Ryujinx/Headless/Options.cs @@ -1,14 +1,202 @@ using CommandLine; +using Gommon; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.Configuration.System; using Ryujinx.Common.Configuration; +using Ryujinx.Common.Configuration.Hid; using Ryujinx.HLE; using Ryujinx.HLE.HOS.SystemState; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { public class Options { + public void InheritMainConfig(string[] originalArgs, ConfigurationState configurationState, out bool needsProfileSet) + { + needsProfileSet = NeedsOverride(nameof(UserProfile)); + + if (NeedsOverride(nameof(IsFullscreen))) + IsFullscreen = configurationState.UI.StartFullscreen; + + if (NeedsOverride(nameof(EnableKeyboard))) + EnableKeyboard = configurationState.Hid.EnableKeyboard; + + if (NeedsOverride(nameof(EnableMouse))) + EnableMouse = configurationState.Hid.EnableMouse; + + if (NeedsOverride(nameof(HideCursorMode))) + HideCursorMode = configurationState.HideCursor; + + if (NeedsOverride(nameof(DisablePTC))) + DisablePTC = !configurationState.System.EnablePtc; + + if (NeedsOverride(nameof(EnableInternetAccess))) + EnableInternetAccess = configurationState.System.EnableInternetAccess; + + if (NeedsOverride(nameof(DisableFsIntegrityChecks))) + DisableFsIntegrityChecks = !configurationState.System.EnableFsIntegrityChecks; + + if (NeedsOverride(nameof(FsGlobalAccessLogMode))) + FsGlobalAccessLogMode = configurationState.System.FsGlobalAccessLogMode; + + if (NeedsOverride(nameof(VSyncMode))) + VSyncMode = configurationState.Graphics.VSyncMode; + + if (NeedsOverride(nameof(CustomVSyncInterval))) + CustomVSyncInterval = configurationState.Graphics.CustomVSyncInterval; + + if (NeedsOverride(nameof(DisableShaderCache))) + DisableShaderCache = !configurationState.Graphics.EnableShaderCache; + + if (NeedsOverride(nameof(EnableTextureRecompression))) + EnableTextureRecompression = configurationState.Graphics.EnableTextureRecompression; + + if (NeedsOverride(nameof(DisableDockedMode))) + DisableDockedMode = !configurationState.System.EnableDockedMode; + + if (NeedsOverride(nameof(SystemLanguage))) + SystemLanguage = configurationState.System.Language.Value.ToHLE(); + + if (NeedsOverride(nameof(SystemRegion))) + SystemRegion = configurationState.System.Region.Value.ToHLE(); + + if (NeedsOverride(nameof(SystemTimeZone))) + SystemTimeZone = configurationState.System.TimeZone; + + if (NeedsOverride(nameof(SystemTimeOffset))) + SystemTimeOffset = configurationState.System.SystemTimeOffset; + + if (NeedsOverride(nameof(MemoryManagerMode))) + MemoryManagerMode = configurationState.System.MemoryManagerMode; + + if (NeedsOverride(nameof(AudioVolume))) + AudioVolume = configurationState.System.AudioVolume; + + if (NeedsOverride(nameof(UseHypervisor)) && OperatingSystem.IsMacOS()) + UseHypervisor = configurationState.System.UseHypervisor; + + if (NeedsOverride(nameof(MultiplayerLanInterfaceId))) + MultiplayerLanInterfaceId = configurationState.Multiplayer.LanInterfaceId; + + if (NeedsOverride(nameof(DisableFileLog))) + DisableFileLog = !configurationState.Logger.EnableFileLog; + + if (NeedsOverride(nameof(LoggingEnableDebug))) + LoggingEnableDebug = configurationState.Logger.EnableDebug; + + if (NeedsOverride(nameof(LoggingDisableStub))) + LoggingDisableStub = !configurationState.Logger.EnableStub; + + if (NeedsOverride(nameof(LoggingDisableInfo))) + LoggingDisableInfo = !configurationState.Logger.EnableInfo; + + if (NeedsOverride(nameof(LoggingDisableWarning))) + LoggingDisableWarning = !configurationState.Logger.EnableWarn; + + if (NeedsOverride(nameof(LoggingDisableError))) + LoggingDisableError = !configurationState.Logger.EnableError; + + if (NeedsOverride(nameof(LoggingEnableTrace))) + LoggingEnableTrace = configurationState.Logger.EnableTrace; + + if (NeedsOverride(nameof(LoggingDisableGuest))) + LoggingDisableGuest = !configurationState.Logger.EnableGuest; + + if (NeedsOverride(nameof(LoggingEnableFsAccessLog))) + LoggingEnableFsAccessLog = configurationState.Logger.EnableFsAccessLog; + + if (NeedsOverride(nameof(LoggingGraphicsDebugLevel))) + LoggingGraphicsDebugLevel = configurationState.Logger.GraphicsDebugLevel; + + if (NeedsOverride(nameof(ResScale))) + ResScale = configurationState.Graphics.ResScale; + + if (NeedsOverride(nameof(MaxAnisotropy))) + MaxAnisotropy = configurationState.Graphics.MaxAnisotropy; + + if (NeedsOverride(nameof(AspectRatio))) + AspectRatio = configurationState.Graphics.AspectRatio; + + if (NeedsOverride(nameof(BackendThreading))) + BackendThreading = configurationState.Graphics.BackendThreading; + + if (NeedsOverride(nameof(DisableMacroHLE))) + DisableMacroHLE = !configurationState.Graphics.EnableMacroHLE; + + if (NeedsOverride(nameof(GraphicsShadersDumpPath))) + GraphicsShadersDumpPath = configurationState.Graphics.ShadersDumpPath; + + if (NeedsOverride(nameof(GraphicsBackend))) + GraphicsBackend = configurationState.Graphics.GraphicsBackend; + + if (NeedsOverride(nameof(AntiAliasing))) + AntiAliasing = configurationState.Graphics.AntiAliasing; + + if (NeedsOverride(nameof(ScalingFilter))) + ScalingFilter = configurationState.Graphics.ScalingFilter; + + if (NeedsOverride(nameof(ScalingFilterLevel))) + ScalingFilterLevel = configurationState.Graphics.ScalingFilterLevel; + + if (NeedsOverride(nameof(DramSize))) + DramSize = configurationState.System.DramSize; + + if (NeedsOverride(nameof(IgnoreMissingServices))) + IgnoreMissingServices = configurationState.System.IgnoreMissingServices; + + if (NeedsOverride(nameof(IgnoreControllerApplet))) + IgnoreControllerApplet = configurationState.System.IgnoreControllerApplet; + + if (NeedsOverride(nameof(SkipUserProfilesManager))) + SkipUserProfilesManager = configurationState.System.SkipUserProfilesManager; + + return; + + bool NeedsOverride(string argKey) => originalArgs.None(arg => arg.TrimStart('-').EqualsIgnoreCase(OptionName(argKey))); + } + + public void InheritMainConfigInput(string[] originalArgs, ConfigurationState configurationState) + { + Dictionary indicesToProperties = new() + { + { PlayerIndex.Handheld, (nameof(InputIdHandheld), nameof(InputProfileHandheldName)) }, + { PlayerIndex.Player1, (nameof(InputId1), nameof(InputProfile1Name)) }, + { PlayerIndex.Player2, (nameof(InputId2), nameof(InputProfile2Name)) }, + { PlayerIndex.Player3, (nameof(InputId3), nameof(InputProfile3Name)) }, + { PlayerIndex.Player4, (nameof(InputId4), nameof(InputProfile4Name)) }, + { PlayerIndex.Player5, (nameof(InputId5), nameof(InputProfile5Name)) }, + { PlayerIndex.Player6, (nameof(InputId6), nameof(InputProfile6Name)) }, + { PlayerIndex.Player7, (nameof(InputId7), nameof(InputProfile7Name)) }, + { PlayerIndex.Player8, (nameof(InputId8), nameof(InputProfile8Name)) } + }; + + foreach ((PlayerIndex playerIndex, _) in indicesToProperties + .Where(it => NeedsOverride(it.Value.InputId) && NeedsOverride(it.Value.InputProfileName))) + { + configurationState.Hid.InputConfig.Value.FindFirst(x => x.PlayerIndex == playerIndex) + .IfPresent(ic => InheritedInputConfigs[playerIndex] = ic); + } + + return; + + bool NeedsOverride(string argKey) => originalArgs.None(arg => arg.TrimStart('-').EqualsIgnoreCase(OptionName(argKey))); + } + + private static string OptionName(string propertyName) => + typeof(Options)!.GetProperty(propertyName)!.GetCustomAttribute()!.LongName; + // General + [Option("use-main-config", Required = false, Default = false, HelpText = "Use the settings from what was configured via the UI.")] + public bool InheritConfig { get; set; } + + [Option("disable-main-input-config", Required = false, Default = false, HelpText = "Do not use the input-related settings from what was configured via the UI.")] + public bool DisableMainInputConfig { get; set; } + [Option("root-data-dir", Required = false, HelpText = "Set the custom folder path for Ryujinx data.")] public string BaseDataDir { get; set; } @@ -95,10 +283,10 @@ namespace Ryujinx.Headless.SDL2 [Option("hide-cursor", Required = false, Default = HideCursorMode.OnIdle, HelpText = "Change when the cursor gets hidden.")] public HideCursorMode HideCursorMode { get; set; } - [Option("list-input-profiles", Required = false, HelpText = "List inputs profiles.")] + [Option("list-input-profiles", Required = false, HelpText = "List input profiles.")] public bool ListInputProfiles { get; set; } - [Option("list-inputs-ids", Required = false, HelpText = "List inputs ids.")] + [Option("list-input-ids", Required = false, HelpText = "List input IDs.")] public bool ListInputIds { get; set; } // System @@ -172,7 +360,7 @@ namespace Ryujinx.Headless.SDL2 public bool LoggingDisableWarning { get; set; } [Option("disable-error-logs", Required = false, HelpText = "Disables printing error log messages.")] - public bool LoggingEnableError { get; set; } + public bool LoggingDisableError { get; set; } [Option("enable-trace-logs", Required = false, Default = false, HelpText = "Enables printing trace log messages.")] public bool LoggingEnableTrace { get; set; } @@ -206,7 +394,7 @@ namespace Ryujinx.Headless.SDL2 [Option("graphics-shaders-dump-path", Required = false, HelpText = "Dumps shaders in this local directory. (Developer only)")] public string GraphicsShadersDumpPath { get; set; } - [Option("graphics-backend", Required = false, Default = GraphicsBackend.OpenGl, HelpText = "Change Graphics Backend to use.")] + [Option("graphics-backend", Required = false, Default = GraphicsBackend.Vulkan, HelpText = "Change Graphics Backend to use.")] public GraphicsBackend GraphicsBackend { get; set; } [Option("preferred-gpu-vendor", Required = false, Default = "", HelpText = "When using the Vulkan backend, prefer using the GPU from the specified vendor.")] @@ -215,7 +403,7 @@ namespace Ryujinx.Headless.SDL2 [Option("anti-aliasing", Required = false, Default = AntiAliasing.None, HelpText = "Set the type of anti aliasing being used. [None|Fxaa|SmaaLow|SmaaMedium|SmaaHigh|SmaaUltra]")] public AntiAliasing AntiAliasing { get; set; } - [Option("scaling-filter", Required = false, Default = ScalingFilter.Bilinear, HelpText = "Set the scaling filter. [Bilinear|Nearest|Fsr]")] + [Option("scaling-filter", Required = false, Default = ScalingFilter.Bilinear, HelpText = "Set the scaling filter. [Bilinear|Nearest|Fsr|Area]")] public ScalingFilter ScalingFilter { get; set; } [Option("scaling-filter-level", Required = false, Default = 0, HelpText = "Set the scaling filter intensity (currently only applies to FSR). [0-100]")] @@ -228,13 +416,18 @@ namespace Ryujinx.Headless.SDL2 [Option("ignore-missing-services", Required = false, Default = false, HelpText = "Enable ignoring missing services.")] public bool IgnoreMissingServices { get; set; } - + [Option("ignore-controller-applet", Required = false, Default = false, HelpText = "Enable ignoring the controller applet when your game loses connection to your controller.")] public bool IgnoreControllerApplet { get; set; } + [Option("skip-user-profiles-manager", Required = false, Default = false, HelpText = "Enable skips the Profiles Manager popup during gameplay. Select the desired profile before starting the game")] + public bool SkipUserProfilesManager { get; set; } + // Values [Value(0, MetaName = "input", HelpText = "Input to load.", Required = true)] public string InputPath { get; set; } + + public SafeDictionary InheritedInputConfigs = new(); } } diff --git a/src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs b/src/Ryujinx/Headless/Windows/OpenGLWindow.cs similarity index 96% rename from src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs rename to src/Ryujinx/Headless/Windows/OpenGLWindow.cs index 8c4854a11..02f24f218 100644 --- a/src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs +++ b/src/Ryujinx/Headless/Windows/OpenGLWindow.cs @@ -7,7 +7,7 @@ using Ryujinx.Input.HLE; using System; using static SDL2.SDL; -namespace Ryujinx.Headless.SDL2.OpenGL +namespace Ryujinx.Headless { class OpenGLWindow : WindowBase { @@ -109,7 +109,6 @@ namespace Ryujinx.Headless.SDL2.OpenGL } } - private readonly GraphicsDebugLevel _glLogLevel; private SDL2OpenGLContext _openGLContext; public OpenGLWindow( @@ -121,15 +120,14 @@ namespace Ryujinx.Headless.SDL2.OpenGL bool ignoreControllerApplet) : base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet) { - _glLogLevel = glLogLevel; } - public override SDL_WindowFlags GetWindowFlags() => SDL_WindowFlags.SDL_WINDOW_OPENGL; + public override SDL_WindowFlags WindowFlags => SDL_WindowFlags.SDL_WINDOW_OPENGL; protected override void InitializeWindowRenderer() { // Ensure to not share this context with other contexts before this point. - SetupOpenGLAttributes(false, _glLogLevel); + SetupOpenGLAttributes(false, GlLogLevel); nint context = SDL_GL_CreateContext(WindowHandle); CheckResult(SDL_GL_SetSwapInterval(1)); diff --git a/src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs b/src/Ryujinx/Headless/Windows/VulkanWindow.cs similarity index 93% rename from src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs rename to src/Ryujinx/Headless/Windows/VulkanWindow.cs index b88e0fe83..2abbbd1e9 100644 --- a/src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs +++ b/src/Ryujinx/Headless/Windows/VulkanWindow.cs @@ -6,12 +6,10 @@ using System; using System.Runtime.InteropServices; using static SDL2.SDL; -namespace Ryujinx.Headless.SDL2.Vulkan +namespace Ryujinx.Headless { class VulkanWindow : WindowBase { - private readonly GraphicsDebugLevel _glLogLevel; - public VulkanWindow( InputManager inputManager, GraphicsDebugLevel glLogLevel, @@ -21,10 +19,9 @@ namespace Ryujinx.Headless.SDL2.Vulkan bool ignoreControllerApplet) : base(inputManager, glLogLevel, aspectRatio, enableMouse, hideCursorMode, ignoreControllerApplet) { - _glLogLevel = glLogLevel; } - public override SDL_WindowFlags GetWindowFlags() => SDL_WindowFlags.SDL_WINDOW_VULKAN; + public override SDL_WindowFlags WindowFlags => SDL_WindowFlags.SDL_WINDOW_VULKAN; protected override void InitializeWindowRenderer() { } diff --git a/src/Ryujinx.Headless.SDL2/WindowBase.cs b/src/Ryujinx/Headless/Windows/WindowBase.cs similarity index 91% rename from src/Ryujinx.Headless.SDL2/WindowBase.cs rename to src/Ryujinx/Headless/Windows/WindowBase.cs index fbe7cb49c..14b090264 100644 --- a/src/Ryujinx.Headless.SDL2/WindowBase.cs +++ b/src/Ryujinx/Headless/Windows/WindowBase.cs @@ -1,14 +1,17 @@ using Humanizer; -using LibHac.Tools.Fs; +using LibHac.Ns; +using Ryujinx.Ava; +using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL.Multithreading; -using Ryujinx.Graphics.Gpu; using Ryujinx.Graphics.OpenGL; using Ryujinx.HLE.HOS.Applets; +using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; +using Ryujinx.HLE.Loaders.Processes; using Ryujinx.HLE.UI; using Ryujinx.Input; using Ryujinx.Input.HLE; @@ -25,8 +28,9 @@ using static SDL2.SDL; using AntiAliasing = Ryujinx.Common.Configuration.AntiAliasing; using ScalingFilter = Ryujinx.Common.Configuration.ScalingFilter; using Switch = Ryujinx.HLE.Switch; +using UserProfile = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile; -namespace Ryujinx.Headless.SDL2 +namespace Ryujinx.Headless { abstract partial class WindowBase : IHostUIHandler, IDisposable { @@ -52,8 +56,6 @@ namespace Ryujinx.Headless.SDL2 public Switch Device { get; private set; } public IRenderer Renderer { get; private set; } - public event EventHandler StatusUpdatedEvent; - protected nint WindowHandle { get; set; } public IHostUITheme HostUITheme { get; } @@ -71,7 +73,7 @@ namespace Ryujinx.Headless.SDL2 protected SDL2MouseDriver MouseDriver; private readonly InputManager _inputManager; private readonly IKeyboard _keyboardInterface; - private readonly GraphicsDebugLevel _glLogLevel; + protected readonly GraphicsDebugLevel GlLogLevel; private readonly Stopwatch _chrono; private readonly long _ticksPerFrame; private readonly CancellationTokenSource _gpuCancellationTokenSource; @@ -103,7 +105,7 @@ namespace Ryujinx.Headless.SDL2 NpadManager = _inputManager.CreateNpadManager(); TouchScreenManager = _inputManager.CreateTouchScreenManager(); _keyboardInterface = (IKeyboard)_inputManager.KeyboardDriver.GetGamepad("0"); - _glLogLevel = glLogLevel; + GlLogLevel = glLogLevel; _chrono = new Stopwatch(); _ticksPerFrame = Stopwatch.Frequency / TargetFps; _gpuCancellationTokenSource = new CancellationTokenSource(); @@ -136,7 +138,7 @@ namespace Ryujinx.Headless.SDL2 private void SetWindowIcon() { - Stream iconStream = typeof(WindowBase).Assembly.GetManifestResourceStream("Ryujinx.Headless.SDL2.Ryujinx.bmp"); + Stream iconStream = EmbeddedResources.GetStream("Ryujinx/Assets/UIImages/Logo_Ryujinx.png"); byte[] iconBytes = new byte[iconStream!.Length]; if (iconStream.Read(iconBytes, 0, iconBytes.Length) != iconBytes.Length) @@ -164,8 +166,8 @@ namespace Ryujinx.Headless.SDL2 private void InitializeWindow() { - var activeProcess = Device.Processes.ActiveApplication; - var nacp = activeProcess.ApplicationControlProperties; + ProcessResult activeProcess = Device.Processes.ActiveApplication; + ApplicationControlProperty nacp = activeProcess.ApplicationControlProperties; int desiredLanguage = (int)Device.System.State.DesiredTitleLanguage; string titleNameSection = string.IsNullOrWhiteSpace(nacp.Title[desiredLanguage].NameString.ToString()) ? string.Empty : $" - {nacp.Title[desiredLanguage].NameString.ToString()}"; @@ -190,7 +192,7 @@ namespace Ryujinx.Headless.SDL2 FullscreenFlag = SDL_WindowFlags.SDL_WINDOW_FULLSCREEN_DESKTOP; } - WindowHandle = SDL_CreateWindow($"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}", SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), Width, Height, DefaultFlags | FullscreenFlag | GetWindowFlags()); + WindowHandle = SDL_CreateWindow($"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}", SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), SDL_WINDOWPOS_CENTERED_DISPLAY(DisplayId), Width, Height, DefaultFlags | FullscreenFlag | WindowFlags); if (WindowHandle == nint.Zero) { @@ -224,6 +226,7 @@ namespace Ryujinx.Headless.SDL2 Renderer?.Window.SetSize(Width, Height); MouseDriver.SetClientSize(Width, Height); } + break; case SDL_WindowEventID.SDL_WINDOWEVENT_CLOSE: @@ -245,7 +248,7 @@ namespace Ryujinx.Headless.SDL2 protected abstract void SwapBuffers(); - public abstract SDL_WindowFlags GetWindowFlags(); + public abstract SDL_WindowFlags WindowFlags { get; } private string GetGpuDriverName() { @@ -254,12 +257,12 @@ namespace Ryujinx.Headless.SDL2 private void SetAntiAliasing() { - Renderer?.Window.SetAntiAliasing((Graphics.GAL.AntiAliasing)AntiAliasing); + Renderer?.Window.SetAntiAliasing(AntiAliasing); } private void SetScalingFilter() { - Renderer?.Window.SetScalingFilter((Graphics.GAL.ScalingFilter)ScalingFilter); + Renderer?.Window.SetScalingFilter(ScalingFilter); Renderer?.Window.SetScalingFilterLevel(ScalingFilterLevel); } @@ -267,7 +270,7 @@ namespace Ryujinx.Headless.SDL2 { InitializeWindowRenderer(); - Device.Gpu.Renderer.Initialize(_glLogLevel); + Device.Gpu.Renderer.Initialize(GlLogLevel); InitializeRenderer(); @@ -307,21 +310,6 @@ namespace Ryujinx.Headless.SDL2 if (_ticks >= _ticksPerFrame) { - string dockedMode = Device.System.State.DockedMode ? "Docked" : "Handheld"; - float scale = GraphicsConfig.ResScale; - if (scale != 1) - { - dockedMode += $" ({scale}x)"; - } - - StatusUpdatedEvent?.Invoke(this, new StatusUpdatedEventArgs( - Device.VSyncMode.ToString(), - dockedMode, - Device.Configuration.AspectRatio.ToText(), - $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", - $"FIFO: {Device.Statistics.GetFifoPercent():0.00} %", - $"GPU: {_gpuDriverName}")); - _ticks = Math.Min(_ticks - _ticksPerFrame, _ticksPerFrame); } } @@ -501,8 +489,9 @@ namespace Ryujinx.Headless.SDL2 public bool DisplayMessageDialog(ControllerAppletUIArgs args) { - if (_ignoreControllerApplet) return false; - + if (_ignoreControllerApplet) + return false; + string playerCount = args.PlayerCountMin == args.PlayerCountMax ? $"exactly {args.PlayerCountMin}" : $"{args.PlayerCountMin}-{args.PlayerCountMax}"; string message = $"Application requests {playerCount} {"player".ToQuantity(args.PlayerCountMin + args.PlayerCountMax, ShowQuantityAs.None)} with:\n\n" @@ -526,7 +515,7 @@ namespace Ryujinx.Headless.SDL2 Exit(); } - public bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText) + public bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText, (uint Module, uint Description)? errorCode = null) { SDL_MessageBoxData data = new() { @@ -534,7 +523,7 @@ namespace Ryujinx.Headless.SDL2 message = message, buttons = new SDL_MessageBoxButtonData[buttonsText.Length], numbuttons = buttonsText.Length, - window = WindowHandle, + window = WindowHandle }; for (int i = 0; i < buttonsText.Length; i++) @@ -571,5 +560,10 @@ namespace Ryujinx.Headless.SDL2 SDL2Driver.Instance.Dispose(); } } + + public UserProfile ShowPlayerSelectDialog() + { + return AccountSaveDataManager.GetLastUsedUser(); + } } } diff --git a/src/Ryujinx/Input/AvaloniaKeyboard.cs b/src/Ryujinx/Input/AvaloniaKeyboard.cs index 95d2936f6..031d8b033 100644 --- a/src/Ryujinx/Input/AvaloniaKeyboard.cs +++ b/src/Ryujinx/Input/AvaloniaKeyboard.cs @@ -1,9 +1,11 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Keyboard; +using Ryujinx.Common.Logging; using Ryujinx.Input; using System; using System.Collections.Generic; using System.Numerics; +using System.Threading; using ConfigKey = Ryujinx.Common.Configuration.Hid.Key; using Key = Ryujinx.Input.Key; @@ -15,7 +17,7 @@ namespace Ryujinx.Ava.Input private readonly AvaloniaKeyboardDriver _driver; private StandardKeyboardInputConfig _configuration; - private readonly object _userMappingLock = new(); + private readonly Lock _userMappingLock = new(); public string Id { get; } public string Name { get; } @@ -142,6 +144,11 @@ namespace Ryujinx.Ava.Input } } + public void SetLed(uint packedRgb) + { + Logger.Info?.Print(LogClass.UI, "SetLed called on an AvaloniaKeyboard"); + } + public void SetTriggerThreshold(float triggerThreshold) { } public void Rumble(float lowFrequency, float highFrequency, uint durationMs) { } diff --git a/src/Ryujinx/Input/AvaloniaKeyboardDriver.cs b/src/Ryujinx/Input/AvaloniaKeyboardDriver.cs index 9f87e821a..5fbfb1bbf 100644 --- a/src/Ryujinx/Input/AvaloniaKeyboardDriver.cs +++ b/src/Ryujinx/Input/AvaloniaKeyboardDriver.cs @@ -11,7 +11,7 @@ namespace Ryujinx.Ava.Input { internal class AvaloniaKeyboardDriver : IGamepadDriver { - private static readonly string[] _keyboardIdentifers = new string[1] { "0" }; + private static readonly string[] _keyboardIdentifers = ["0"]; private readonly Control _control; private readonly HashSet _pressedKeys; @@ -25,7 +25,7 @@ namespace Ryujinx.Ava.Input public AvaloniaKeyboardDriver(Control control) { _control = control; - _pressedKeys = new HashSet(); + _pressedKeys = []; _control.KeyDown += OnKeyPress; _control.KeyUp += OnKeyRelease; @@ -59,6 +59,8 @@ namespace Ryujinx.Ava.Input return new AvaloniaKeyboard(this, _keyboardIdentifers[0], LocaleManager.Instance[LocaleKeys.AllKeyboards]); } + public IEnumerable GetGamepads() => [GetGamepad("0")]; + protected virtual void Dispose(bool disposing) { if (disposing) @@ -84,12 +86,12 @@ namespace Ryujinx.Ava.Input internal bool IsPressed(Key key) { - if (key == Key.Unbound || key == Key.Unknown) + if (key is Key.Unbound or Key.Unknown) { return false; } - AvaloniaKeyboardMappingHelper.TryGetAvaKey(key, out var nativeKey); + AvaloniaKeyboardMappingHelper.TryGetAvaKey(key, out AvaKey nativeKey); return _pressedKeys.Contains(nativeKey); } diff --git a/src/Ryujinx/Input/AvaloniaKeyboardMappingHelper.cs b/src/Ryujinx/Input/AvaloniaKeyboardMappingHelper.cs index 97ebd721d..48e49a7fa 100644 --- a/src/Ryujinx/Input/AvaloniaKeyboardMappingHelper.cs +++ b/src/Ryujinx/Input/AvaloniaKeyboardMappingHelper.cs @@ -7,7 +7,8 @@ namespace Ryujinx.Ava.Input { internal static class AvaloniaKeyboardMappingHelper { - private static readonly AvaKey[] _keyMapping = { + private static readonly AvaKey[] _keyMapping = + [ // NOTE: Invalid AvaKey.None, @@ -143,21 +144,21 @@ namespace Ryujinx.Ava.Input AvaKey.OemBackslash, // NOTE: invalid - AvaKey.None, - }; + AvaKey.None + ]; private static readonly Dictionary _avaKeyMapping; static AvaloniaKeyboardMappingHelper() { - var inputKeys = Enum.GetValues(); + Key[] inputKeys = Enum.GetValues(); // NOTE: Avalonia.Input.Key is not contiguous and quite large, so use a dictionary instead of an array. _avaKeyMapping = new Dictionary(); - foreach (var key in inputKeys) + foreach (Key key in inputKeys) { - if (TryGetAvaKey(key, out var index)) + if (TryGetAvaKey(key, out AvaKey index)) { _avaKeyMapping[index] = key; } diff --git a/src/Ryujinx/Input/AvaloniaMouse.cs b/src/Ryujinx/Input/AvaloniaMouse.cs index 1aa2d586a..52a341a01 100644 --- a/src/Ryujinx/Input/AvaloniaMouse.cs +++ b/src/Ryujinx/Input/AvaloniaMouse.cs @@ -1,4 +1,5 @@ using Ryujinx.Common.Configuration.Hid; +using Ryujinx.Common.Logging; using Ryujinx.Input; using System; using System.Drawing; @@ -74,6 +75,11 @@ namespace Ryujinx.Ava.Input throw new NotImplementedException(); } + public void SetLed(uint packedRgb) + { + Logger.Info?.Print(LogClass.UI, "SetLed called on an AvaloniaMouse"); + } + public void SetTriggerThreshold(float triggerThreshold) { throw new NotImplementedException(); diff --git a/src/Ryujinx/Input/AvaloniaMouseDriver.cs b/src/Ryujinx/Input/AvaloniaMouseDriver.cs index e71bbf64a..be1441101 100644 --- a/src/Ryujinx/Input/AvaloniaMouseDriver.cs +++ b/src/Ryujinx/Input/AvaloniaMouseDriver.cs @@ -3,6 +3,7 @@ using Avalonia.Controls; using Avalonia.Input; using Ryujinx.Input; using System; +using System.Collections.Generic; using System.Numerics; using MouseButton = Ryujinx.Input.MouseButton; using Size = System.Drawing.Size; @@ -134,6 +135,8 @@ namespace Ryujinx.Ava.Input return new AvaloniaMouse(this); } + public IEnumerable GetGamepads() => [GetGamepad("0")]; + public void Dispose() { if (_isDisposed) diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index 05fd66b90..09759d7cc 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -5,24 +5,24 @@ using Gommon; using Projektanker.Icons.Avalonia; using Projektanker.Icons.Avalonia.FontAwesome; using Projektanker.Icons.Avalonia.MaterialDesign; -using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.Configuration.System; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; +using Ryujinx.Ava.Utilities.SystemInfo; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.GraphicsDriver; using Ryujinx.Common.Logging; using Ryujinx.Common.SystemInterop; using Ryujinx.Graphics.Vulkan.MoltenVK; +using Ryujinx.Headless; using Ryujinx.SDL2.Common; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; -using Ryujinx.UI.Common.SystemInfo; using System; +using System.Collections.Generic; using System.IO; -using System.Linq; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -34,8 +34,11 @@ namespace Ryujinx.Ava public static double DesktopScaleFactor { get; set; } = 1.0; public static string Version { get; private set; } public static string ConfigurationPath { get; private set; } + public static string GlobalConfigurationPath { get; private set; } + public static bool UseExtraConfig { get; set; } public static bool PreviewerDetached { get; private set; } public static bool UseHardwareAcceleration { get; private set; } + public static string BackendThreadingArg { get; private set; } [LibraryImport("user32.dll", SetLastError = true)] public static partial int MessageBoxA(nint hWnd, [MarshalAs(UnmanagedType.LPStr)] string text, [MarshalAs(UnmanagedType.LPStr)] string caption, uint type); @@ -45,14 +48,21 @@ namespace Ryujinx.Ava public static int Main(string[] args) { Version = ReleaseInformation.Version; - - if (OperatingSystem.IsWindows() && !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 17134)) + + if (OperatingSystem.IsWindows() && !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 19041)) { - _ = MessageBoxA(nint.Zero, "You are running an outdated version of Windows.\n\nRyujinx supports Windows 10 version 1803 and newer.\n", $"Ryujinx {Version}", MbIconwarning); + _ = MessageBoxA(nint.Zero, "You are running an outdated version of Windows.\n\nRyujinx supports Windows 10 version 20H1 and newer.\n", $"Ryujinx {Version}", MbIconwarning); + return 0; } PreviewerDetached = true; + if (args.Length > 0 && args[0] is "--no-gui" or "nogui") + { + HeadlessRyujinx.Entrypoint(args[1..]); + return 0; + } + Initialize(args); LoggerAdapter.Register(); @@ -65,7 +75,7 @@ namespace Ryujinx.Ava } public static AppBuilder BuildAvaloniaApp() => - AppBuilder.Configure() + AppBuilder.Configure() .UsePlatformDetect() .With(new X11PlatformOptions { @@ -87,7 +97,7 @@ namespace Ryujinx.Ava private static void Initialize(string[] args) { // Ensure Discord presence timestamp begins at the absolute start of when Ryujinx is launched - DiscordIntegrationModule.StartedAt = Timestamps.Now; + DiscordIntegrationModule.EmulatorStartedAt = Timestamps.Now; // Parse arguments CommandLineState.ParseArguments(args); @@ -100,19 +110,19 @@ namespace Ryujinx.Ava // Delete backup files after updating. Task.Run(Updater.CleanupUpdate); - Console.Title = $"{App.FullAppName} Console {Version}"; + Console.Title = $"{RyujinxApp.FullAppName} Console {Version}"; // Hook unhandled exception and process exit events. AppDomain.CurrentDomain.UnhandledException += (sender, e) => ProcessUnhandledException(sender, e.ExceptionObject as Exception, e.IsTerminating); + TaskScheduler.UnobservedTaskException += (sender, e) + => ProcessUnhandledException(sender, e.Exception, false); AppDomain.CurrentDomain.ProcessExit += (_, _) => Exit(); + // Setup base data directory. AppDataManager.Initialize(CommandLineState.BaseDirPathArg); - // Set the delegate for localizing the word "never" in the UI - ApplicationData.LocalizedNever = () => LocaleManager.Instance[LocaleKeys.Never]; - // Initialize the configuration. ConfigurationState.Initialize(); @@ -150,8 +160,28 @@ namespace Ryujinx.Ava } } + + public static string GetDirGameUserConfig(string gameId, bool changeFolderForGame = false) + { + if (string.IsNullOrEmpty(gameId)) + { + return ""; + } + + string gameDir = Path.Combine(AppDataManager.GamesDirPath, gameId, ReleaseInformation.ConfigName); + + if (changeFolderForGame) + { + ConfigurationPath = gameDir; + UseExtraConfig = true; + } + + return gameDir; + } + public static void ReloadConfig() { + string localConfigurationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ReleaseInformation.ConfigName); string appDataConfigurationPath = Path.Combine(AppDataManager.BaseDirPath, ReleaseInformation.ConfigName); @@ -190,6 +220,12 @@ namespace Ryujinx.Ava } } + // When you first load the program, copy to remember the path for the global configuration + if (GlobalConfigurationPath == null) + { + GlobalConfigurationPath = ConfigurationPath; + } + UseHardwareAcceleration = ConfigurationState.Instance.EnableHardwareAcceleration; // Check if graphics backend was overridden @@ -201,11 +237,25 @@ namespace Ryujinx.Ava _ => ConfigurationState.Instance.Graphics.GraphicsBackend }; + // Check if backend threading was overridden + if (CommandLineState.OverrideBackendThreading is not null) + ConfigurationState.Instance.Graphics.BackendThreading.Value = CommandLineState.OverrideBackendThreading.ToLower() switch + { + "auto" => BackendThreading.Auto, + "off" => BackendThreading.Off, + "on" => BackendThreading.On, + _ => ConfigurationState.Instance.Graphics.BackendThreading + }; + + if (CommandLineState.OverrideBackendThreadingAfterReboot is not null) + { + BackendThreadingArg = CommandLineState.OverrideBackendThreadingAfterReboot; + } + // Check if docked mode was overriden. if (CommandLineState.OverrideDockedMode.HasValue) ConfigurationState.Instance.System.EnableDockedMode.Value = CommandLineState.OverrideDockedMode.Value; - // Check if HideCursor was overridden. if (CommandLineState.OverrideHideCursor is not null) ConfigurationState.Instance.HideCursor.Value = CommandLineState.OverrideHideCursor.ToLower() switch @@ -216,22 +266,50 @@ namespace Ryujinx.Ava _ => ConfigurationState.Instance.HideCursor, }; + // Check if memoryManagerMode was overridden. + if (CommandLineState.OverrideMemoryManagerMode is not null) + if (Enum.TryParse(CommandLineState.OverrideMemoryManagerMode, true, out MemoryManagerMode result)) + { + ConfigurationState.Instance.System.MemoryManagerMode.Value = result; + } + + // Check if PPTC was overridden. + if (CommandLineState.OverridePPTC is not null) + if (Enum.TryParse(CommandLineState.OverridePPTC, true, out bool result)) + { + ConfigurationState.Instance.System.EnablePtc.Value = result; + } + + // Check if region was overridden. + if (CommandLineState.OverrideSystemRegion is not null) + if (Enum.TryParse(CommandLineState.OverrideSystemRegion, true, out HLE.HOS.SystemState.RegionCode result)) + { + ConfigurationState.Instance.System.Region.Value = result.ToUI(); + } + + //Check if language was overridden. + if (CommandLineState.OverrideSystemLanguage is not null) + if (Enum.TryParse(CommandLineState.OverrideSystemLanguage, true, out HLE.HOS.SystemState.SystemLanguage result)) + { + ConfigurationState.Instance.System.Language.Value = result.ToUI(); + } // Check if hardware-acceleration was overridden. if (CommandLineState.OverrideHardwareAcceleration != null) UseHardwareAcceleration = CommandLineState.OverrideHardwareAcceleration.Value; } - private static void PrintSystemInfo() + internal static void PrintSystemInfo() { - Logger.Notice.Print(LogClass.Application, $"{App.FullAppName} Version: {Version}"); + Logger.Notice.Print(LogClass.Application, $"{RyujinxApp.FullAppName} Version: {Version}"); + Logger.Notice.Print(LogClass.Application, $".NET Runtime: {RuntimeInformation.FrameworkDescription}"); SystemInfo.Gather().Print(); - var enabledLogLevels = Logger.GetEnabledLevels().ToArray(); - - Logger.Notice.Print(LogClass.Application, $"Logs Enabled: {(enabledLogLevels.Length is 0 - ? "" - : enabledLogLevels.JoinToString(", "))}"); + Logger.Notice.Print(LogClass.Application, $"Logs Enabled: {Logger.GetEnabledLevels() + .FormatCollection( + x => x.ToString(), + separator: ", ", + emptyCollectionFallback: "")}"); Logger.Notice.Print(LogClass.Application, AppDataManager.Mode == AppDataManager.LaunchMode.Custom @@ -239,22 +317,37 @@ namespace Ryujinx.Ava : $"Launch Mode: {AppDataManager.Mode}"); } - private static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating) + internal static void ProcessUnhandledException(object sender, Exception initialException, bool isTerminating) { Logger.Log log = Logger.Error ?? Logger.Notice; - string message = $"Unhandled exception caught: {ex}"; - // ReSharper disable once ConstantConditionalAccessQualifier - if (sender?.GetType()?.AsPrettyString() is { } senderName) - log.Print(LogClass.Application, message, senderName); + List exceptions = []; + + if (initialException is AggregateException ae) + { + exceptions.AddRange(ae.InnerExceptions); + } else - log.PrintMsg(LogClass.Application, message); + { + exceptions.Add(initialException); + } + + foreach (Exception e in exceptions) + { + string message = $"Unhandled exception caught: {e}"; + // ReSharper disable once ConstantConditionalAccessQualifier + if (sender?.GetType()?.AsPrettyString() is { } senderName) + log.Print(LogClass.Application, message, senderName); + else + log.PrintMsg(LogClass.Application, message); + } + if (isTerminating) Exit(); } - public static void Exit() + internal static void Exit() { DiscordIntegrationModule.Exit(); diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 989a3a5bd..480d14781 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -1,7 +1,6 @@ - net8.0 - win-x64;osx-x64;linux-x64 + win-x64;osx-x64;linux-x64;win-arm64;osx-arm64;linux-arm64; Exe true 1.0.0-dirty @@ -14,6 +13,11 @@ $(DefaultItemExcludes);._* + + + + + @@ -25,12 +29,18 @@ partial + + true + false + + + true @@ -45,20 +55,27 @@ + + + - - + + + + + + - + @@ -71,22 +88,23 @@ - - + Always alsoft.ini Always THIRDPARTY.md + False Always LICENSE.txt + False @@ -104,6 +122,10 @@ Designer + + + + MSBuild:Compile @@ -112,24 +134,7 @@ - - - - - - - - - - - - - - - - - - + @@ -139,31 +144,40 @@ - - - - - - - - - - - - - - - - - - + + Assets\ShortcutFiles\shortcut-template.desktop + + + Assets\ShortcutFiles\shortcut-launch-script.sh + + + Assets\ShortcutFiles\shortcut-template.plist + + + Assets\RyujinxGameCompatibility.csv + + + Assets\Locale.json + + + + + + + + + + + + + - + diff --git a/src/Ryujinx/Ryujinx.ico b/src/Ryujinx/Ryujinx.ico index 0da5a311f..e1ac423e7 100644 Binary files a/src/Ryujinx/Ryujinx.ico and b/src/Ryujinx/Ryujinx.ico differ diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/Systems/AppHost.cs similarity index 84% rename from src/Ryujinx/AppHost.cs rename to src/Ryujinx/Systems/AppHost.cs index 9a7f82661..1c5f64309 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/Systems/AppHost.cs @@ -3,7 +3,10 @@ using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Input; using Avalonia.Threading; -using LibHac.Tools.FsSystem; +using DiscordRPC; +using Gommon; +using LibHac.Common; +using LibHac.Ns; using Ryujinx.Audio.Backends.Dummy; using Ryujinx.Audio.Backends.OpenAL; using Ryujinx.Audio.Backends.SDL2; @@ -12,34 +15,31 @@ using Ryujinx.Audio.Integration; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Input; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.Renderer; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.Logging; using Ryujinx.Common.SystemInterop; +using Ryujinx.Common.UI; using Ryujinx.Common.Utilities; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL.Multithreading; using Ryujinx.Graphics.Gpu; using Ryujinx.Graphics.OpenGL; using Ryujinx.Graphics.Vulkan; -using Ryujinx.HLE; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS.Services.Account.Acc; -using Ryujinx.HLE.HOS.SystemState; using Ryujinx.Input; using Ryujinx.Input.HLE; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; -using Silk.NET.Vulkan; using SkiaSharp; using SPB.Graphics.Vulkan; using System; @@ -60,7 +60,7 @@ using Size = Avalonia.Size; using Switch = Ryujinx.HLE.Switch; using VSyncMode = Ryujinx.Common.Configuration.VSyncMode; -namespace Ryujinx.Ava +namespace Ryujinx.Ava.Systems { internal class AppHost { @@ -75,6 +75,7 @@ namespace Ryujinx.Ava private readonly long _ticksPerFrame; private readonly Stopwatch _chrono; + private readonly Stopwatch _playTimer; private long _ticks; private readonly AccountManager _accountManager; @@ -122,7 +123,7 @@ namespace Ryujinx.Ava private bool _dialogShown; private readonly bool _isFirmwareTitle; - private readonly object _lockObject = new(); + private readonly Lock _lockObject = new(); public event EventHandler AppExit; public event EventHandler StatusUpdatedEvent; @@ -175,6 +176,7 @@ namespace Ryujinx.Ava _chrono = new Stopwatch(); _ticksPerFrame = Stopwatch.Frequency / TargetFps; + _playTimer = new Stopwatch(); if (ApplicationPath.StartsWith("@SystemContent")) { @@ -236,10 +238,10 @@ namespace Ryujinx.Ava _lastCursorMoveTime = Stopwatch.GetTimestamp(); } - var point = e.GetCurrentPoint(window).Position; - var bounds = RendererHost.EmbeddedWindow.Bounds; - var windowYOffset = bounds.Y + window.MenuBarHeight; - var windowYLimit = (int)window.Bounds.Height - window.StatusBarHeight - 1; + Point point = e.GetCurrentPoint(window).Position; + Rect bounds = RendererHost.EmbeddedWindow.Bounds; + double windowYOffset = bounds.Y + window.MenuBarHeight; + double windowYLimit = (int)window.Bounds.Height - window.StatusBarHeight - 1; if (!_viewModel.ShowMenuAndStatusBar) { @@ -263,10 +265,10 @@ namespace Ryujinx.Ava if (sender is MainWindow window) { - var point = e.GetCurrentPoint(window).Position; - var bounds = RendererHost.EmbeddedWindow.Bounds; - var windowYOffset = bounds.Y + window.MenuBarHeight; - var windowYLimit = (int)window.Bounds.Height - window.StatusBarHeight - 1; + Point point = e.GetCurrentPoint(window).Position; + Rect bounds = RendererHost.EmbeddedWindow.Bounds; + double windowYOffset = bounds.Y + window.MenuBarHeight; + double windowYLimit = (int)window.Bounds.Height - window.StatusBarHeight - 1; if (!_viewModel.ShowMenuAndStatusBar) { @@ -285,19 +287,19 @@ namespace Ryujinx.Ava private void UpdateScalingFilterLevel(object sender, ReactiveEventArgs e) { - _renderer.Window?.SetScalingFilter((Graphics.GAL.ScalingFilter)ConfigurationState.Instance.Graphics.ScalingFilter.Value); - _renderer.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel.Value); + _renderer.Window?.SetScalingFilter(ConfigurationState.Instance.Graphics.ScalingFilter); + _renderer.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel); } private void UpdateScalingFilter(object sender, ReactiveEventArgs e) { - _renderer.Window?.SetScalingFilter((Graphics.GAL.ScalingFilter)ConfigurationState.Instance.Graphics.ScalingFilter.Value); - _renderer.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel.Value); + _renderer.Window?.SetScalingFilter(ConfigurationState.Instance.Graphics.ScalingFilter); + _renderer.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel); } private void UpdateColorSpacePassthrough(object sender, ReactiveEventArgs e) { - _renderer.Window?.SetColorSpacePassthrough((bool)ConfigurationState.Instance.Graphics.EnableColorSpacePassthrough.Value); + _renderer.Window?.SetColorSpacePassthrough(ConfigurationState.Instance.Graphics.EnableColorSpacePassthrough); } public void UpdateVSyncMode(object sender, ReactiveEventArgs e) @@ -307,39 +309,21 @@ namespace Ryujinx.Ava Device.VSyncMode = e.NewValue; Device.UpdateVSyncInterval(); } - _renderer.Window?.ChangeVSyncMode((Ryujinx.Graphics.GAL.VSyncMode)e.NewValue); - _viewModel.ShowCustomVSyncIntervalPicker = (e.NewValue == VSyncMode.Custom); + _renderer.Window?.ChangeVSyncMode(e.NewValue); + + _viewModel.UpdateVSyncIntervalPicker(); } public void VSyncModeToggle() { VSyncMode oldVSyncMode = Device.VSyncMode; - VSyncMode newVSyncMode = VSyncMode.Switch; bool customVSyncIntervalEnabled = ConfigurationState.Instance.Graphics.EnableCustomVSyncInterval.Value; - switch (oldVSyncMode) - { - case VSyncMode.Switch: - newVSyncMode = VSyncMode.Unbounded; - break; - case VSyncMode.Unbounded: - if (customVSyncIntervalEnabled) - { - newVSyncMode = VSyncMode.Custom; - } - else - { - newVSyncMode = VSyncMode.Switch; - } - - break; - case VSyncMode.Custom: - newVSyncMode = VSyncMode.Switch; - break; - } - - UpdateVSyncMode(this, new ReactiveEventArgs(oldVSyncMode, newVSyncMode)); + UpdateVSyncMode(this, new ReactiveEventArgs( + oldVSyncMode, + oldVSyncMode.Next(customVSyncIntervalEnabled)) + ); } private void UpdateCustomVSyncIntervalValue(object sender, ReactiveEventArgs e) @@ -432,7 +416,7 @@ namespace Ryujinx.Ava return; } - var colorType = e.IsBgra ? SKColorType.Bgra8888 : SKColorType.Rgba8888; + SKColorType colorType = e.IsBgra ? SKColorType.Bgra8888 : SKColorType.Rgba8888; using SKBitmap bitmap = new(new SKImageInfo(e.Width, e.Height, colorType, SKAlphaType.Premul)); Marshal.Copy(e.Data, 0, bitmap.GetPixels(), e.Data.Length); @@ -445,7 +429,7 @@ namespace Ryujinx.Ava float scaleX = e.FlipX ? -1 : 1; float scaleY = e.FlipY ? -1 : 1; - var matrix = SKMatrix.CreateScale(scaleX, scaleY, bitmap.Width / 2f, bitmap.Height / 2f); + SKMatrix matrix = SKMatrix.CreateScale(scaleX, scaleY, bitmap.Width / 2f, bitmap.Height / 2f); canvas.SetMatrix(matrix); canvas.DrawBitmap(bitmap, SKPoint.Empty); @@ -464,8 +448,8 @@ namespace Ryujinx.Ava private static void SaveBitmapAsPng(SKBitmap bitmap, string path) { - using var data = bitmap.Encode(SKEncodedImageFormat.Png, 100); - using var stream = File.OpenWrite(path); + using SKData data = bitmap.Encode(SKEncodedImageFormat.Png, 100); + using FileStream stream = File.OpenWrite(path); data.SaveTo(stream); } @@ -479,14 +463,22 @@ namespace Ryujinx.Ava DisplaySleep.Prevent(); - NpadManager.Initialize(Device, ConfigurationState.Instance.Hid.InputConfig, ConfigurationState.Instance.Hid.EnableKeyboard, ConfigurationState.Instance.Hid.EnableMouse); + if (ConfigurationState.Instance.System.UseInputGlobalConfig.Value && Program.UseExtraConfig) + { + NpadManager.Initialize(Device, ConfigurationState.InstanceExtra.Hid.InputConfig, ConfigurationState.Instance.Hid.EnableKeyboard, ConfigurationState.Instance.Hid.EnableMouse); + } + else + { + NpadManager.Initialize(Device, ConfigurationState.Instance.Hid.InputConfig, ConfigurationState.Instance.Hid.EnableKeyboard, ConfigurationState.Instance.Hid.EnableMouse); + } + TouchScreenManager.Initialize(Device); _viewModel.IsGameRunning = true; Dispatcher.UIThread.InvokeAsync(() => { - _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device.Processes.ActiveApplication, Program.Version); + _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI); }); _viewModel.SetUiProgressHandlers(Device); @@ -499,6 +491,8 @@ namespace Ryujinx.Ava _viewModel.Volume = ConfigurationState.Instance.System.AudioVolume.Value; + Rainbow.Enable(); + MainLoop(); Exit(); @@ -522,7 +516,7 @@ namespace Ryujinx.Ava private void UpdateAntiAliasing(object sender, ReactiveEventArgs e) { - _renderer?.Window?.SetAntiAliasing((Graphics.GAL.AntiAliasing)e.NewValue); + _renderer?.Window?.SetAntiAliasing(e.NewValue); } private void UpdateDockedModeState(object sender, ReactiveEventArgs e) @@ -530,7 +524,7 @@ namespace Ryujinx.Ava Device?.System.ChangeDockedModeState(e.NewValue); } - private void UpdateAudioVolumeState(object sender, ReactiveEventArgs e) + public void UpdateAudioVolumeState(object sender, ReactiveEventArgs e) { Device?.SetVolume(e.NewValue); @@ -573,7 +567,7 @@ namespace Ryujinx.Ava public void Stop() { _isActive = false; - DiscordIntegrationModule.SwitchToMainState(); + _playTimer.Stop(); } private void Exit() @@ -585,6 +579,17 @@ namespace Ryujinx.Ava return; } + foreach (IGamepad gamepad in RyujinxApp.MainWindow.InputManager.GamepadDriver.GetGamepads()) + { + gamepad?.ClearLed(); + gamepad?.Dispose(); + } + + DiscordIntegrationModule.GuestAppStartedAt = null; + + Rainbow.Disable(); + Rainbow.Reset(); + _isStopped = true; Stop(); } @@ -614,8 +619,7 @@ namespace Ryujinx.Ava private void Dispose() { if (Device.Processes != null) - MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText); - + MainWindowViewModel.UpdateGameMetadata(Device.Processes.ActiveApplication.ProgramIdText, _playTimer.Elapsed); ConfigurationState.Instance.System.IgnoreMissingServices.Event -= UpdateIgnoreMissingServicesState; ConfigurationState.Instance.Graphics.AspectRatio.Event -= UpdateAspectRatioState; @@ -634,6 +638,7 @@ namespace Ryujinx.Ava _gpuCancellationTokenSource.Dispose(); _chrono.Stop(); + _playTimer.Stop(); } public void DisposeGpu() @@ -670,9 +675,11 @@ namespace Ryujinx.Ava _cursorState = CursorStates.ForceChangeCursor; } - public async Task LoadGuestApplication() + public async Task LoadGuestApplication(BlitStruct? customNacpData = null) { - InitializeSwitchInstance(); + DiscordIntegrationModule.GuestAppStartedAt = Timestamps.Now; + + InitEmulatedSwitch(); MainWindow.UpdateGraphicsConfig(); SystemVersion firmwareVersion = ContentManager.GetCurrentFirmwareVersion(); @@ -680,13 +687,13 @@ namespace Ryujinx.Ava if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime) { if (!SetupValidator.CanStartApplication(ContentManager, ApplicationPath, out UserError userError)) - { + { if (SetupValidator.CanFixStartApplication(ContentManager, ApplicationPath, userError, out firmwareVersion)) { if (userError is UserError.NoFirmware) { UserResult result = await ContentDialogHelper.CreateConfirmationDialog( - LocaleManager.Instance[LocaleKeys.DialogFirmwareNoFirmwareInstalledMessage], + LocaleManager.Instance[LocaleKeys.DialogFirmwareNoFirmwareInstalledMessage], LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallEmbeddedMessage, firmwareVersion.VersionString), LocaleManager.Instance[LocaleKeys.InputDialogYes], LocaleManager.Instance[LocaleKeys.InputDialogNo], @@ -740,7 +747,7 @@ namespace Ryujinx.Ava { Logger.Info?.Print(LogClass.Application, "Loading as Firmware Title (NCA)."); - if (!Device.LoadNca(ApplicationPath)) + if (!Device.LoadNca(ApplicationPath, customNacpData)) { Device.Dispose(); @@ -756,6 +763,8 @@ namespace Ryujinx.Ava romFsFiles = Directory.GetFiles(ApplicationPath, "*.romfs"); } + Logger.Notice.Print(LogClass.Application, $"Loading unpacked content archive from '{ApplicationPath}'."); + if (romFsFiles.Length > 0) { Logger.Info?.Print(LogClass.Application, "Loading as cart with RomFS."); @@ -781,6 +790,8 @@ namespace Ryujinx.Ava } else if (File.Exists(ApplicationPath)) { + Logger.Notice.Print(LogClass.Application, $"Loading content archive from '{ApplicationPath}'."); + switch (Path.GetExtension(ApplicationPath).ToLowerInvariant()) { case ".xci": @@ -858,11 +869,10 @@ namespace Ryujinx.Ava return false; } - ApplicationMetadata appMeta = ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText, + ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText, appMetadata => appMetadata.UpdatePreGame() ); - - DiscordIntegrationModule.SwitchToPlayingState(appMeta, Device.Processes.ActiveApplication); + _playTimer.Start(); return true; } @@ -872,7 +882,8 @@ namespace Ryujinx.Ava Device?.System.TogglePauseEmulation(false); _viewModel.IsPaused = false; - _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version); + _playTimer.Start(); + _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI); Logger.Info?.Print(LogClass.Emulation, "Emulation was resumed"); } @@ -881,78 +892,52 @@ namespace Ryujinx.Ava Device?.System.TogglePauseEmulation(true); _viewModel.IsPaused = true; - _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, LocaleManager.Instance[LocaleKeys.Paused]); + _playTimer.Stop(); + _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI, LocaleManager.Instance[LocaleKeys.Paused]); Logger.Info?.Print(LogClass.Emulation, "Emulation was paused"); } - private void InitializeSwitchInstance() + private void InitEmulatedSwitch() { // Initialize KeySet. VirtualFileSystem.ReloadKeySet(); // Initialize Renderer. - IRenderer renderer = ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.OpenGl - ? new OpenGLRenderer() - : VulkanRenderer.Create( + GraphicsBackend backend = ConfigurationState.Instance.Graphics.GraphicsBackend; + + IRenderer renderer = backend switch + { + GraphicsBackend.Vulkan => VulkanRenderer.Create( ConfigurationState.Instance.Graphics.PreferredGpu, (RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface, - VulkanHelper.GetRequiredInstanceExtensions); - - BackendThreading threadingMode = ConfigurationState.Instance.Graphics.BackendThreading; - - var isGALThreaded = threadingMode == BackendThreading.On || (threadingMode == BackendThreading.Auto && renderer.PreferThreading); - if (isGALThreaded) - { - renderer = new ThreadedRenderer(renderer); - } - - Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}"); + VulkanHelper.GetRequiredInstanceExtensions), + _ => new OpenGLRenderer() + }; // Initialize Configuration. - var memoryConfiguration = ConfigurationState.Instance.System.DramSize.Value; - - Device = new HLE.Switch(new HLEConfiguration( - VirtualFileSystem, - _viewModel.LibHacHorizonManager, - ContentManager, - _accountManager, - _userChannelPersistence, - renderer, - InitializeAudio(), - memoryConfiguration, - _viewModel.UiHandler, - (SystemLanguage)ConfigurationState.Instance.System.Language.Value, - (RegionCode)ConfigurationState.Instance.System.Region.Value, - ConfigurationState.Instance.Graphics.VSyncMode, - ConfigurationState.Instance.System.EnableDockedMode, - ConfigurationState.Instance.System.EnablePtc, - ConfigurationState.Instance.System.EnableInternetAccess, - ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, - ConfigurationState.Instance.System.FsGlobalAccessLogMode, - ConfigurationState.Instance.System.SystemTimeOffset, - ConfigurationState.Instance.System.TimeZone, - ConfigurationState.Instance.System.MemoryManagerMode, - ConfigurationState.Instance.System.IgnoreMissingServices, - ConfigurationState.Instance.Graphics.AspectRatio, - ConfigurationState.Instance.System.AudioVolume, - ConfigurationState.Instance.System.UseHypervisor, - ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value, - ConfigurationState.Instance.Multiplayer.Mode, - ConfigurationState.Instance.Multiplayer.DisableP2p, - ConfigurationState.Instance.Multiplayer.LdnPassphrase, - ConfigurationState.Instance.Multiplayer.LdnServer, - ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value)); + Device = new Switch(ConfigurationState.Instance.CreateHleConfiguration() + .Configure( + VirtualFileSystem, + _viewModel.LibHacHorizonManager, + ContentManager, + _accountManager, + _userChannelPersistence, + renderer.TryMakeThreaded(ConfigurationState.Instance.Graphics.BackendThreading), + InitializeAudio(), + _viewModel.UiHandler + ) + ); } private static IHardwareDeviceDriver InitializeAudio() { - var availableBackends = new List - { + List availableBackends = + [ AudioBackend.SDL2, AudioBackend.SoundIo, AudioBackend.OpenAl, - AudioBackend.Dummy, - }; + AudioBackend.Dummy + ]; AudioBackend preferredBackend = ConfigurationState.Instance.System.AudioBackend.Value; @@ -1029,9 +1014,10 @@ namespace Ryujinx.Ava if (_viewModel.StartGamesInFullscreen) { _viewModel.WindowState = WindowState.FullScreen; + _viewModel.Window.TitleBar.ExtendsContentIntoTitleBar = true; } - if (_viewModel.WindowState is WindowState.FullScreen) + if (_viewModel.WindowState is WindowState.FullScreen || _viewModel.StartGamesWithoutUI) { _viewModel.ShowMenuAndStatusBar = false; } @@ -1045,10 +1031,10 @@ namespace Ryujinx.Ava Device.Gpu.Renderer.Initialize(_glLogLevel); - _renderer?.Window?.SetAntiAliasing((Graphics.GAL.AntiAliasing)ConfigurationState.Instance.Graphics.AntiAliasing.Value); - _renderer?.Window?.SetScalingFilter((Graphics.GAL.ScalingFilter)ConfigurationState.Instance.Graphics.ScalingFilter.Value); - _renderer?.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel.Value); - _renderer?.Window?.SetColorSpacePassthrough(ConfigurationState.Instance.Graphics.EnableColorSpacePassthrough.Value); + _renderer?.Window?.SetAntiAliasing(ConfigurationState.Instance.Graphics.AntiAliasing); + _renderer?.Window?.SetScalingFilter(ConfigurationState.Instance.Graphics.ScalingFilter); + _renderer?.Window?.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel); + _renderer?.Window?.SetColorSpacePassthrough(ConfigurationState.Instance.Graphics.EnableColorSpacePassthrough); Width = (int)RendererHost.Bounds.Width; Height = (int)RendererHost.Bounds.Height; @@ -1062,7 +1048,7 @@ namespace Ryujinx.Ava Device.Gpu.SetGpuThread(); Device.Gpu.InitializeShaderCache(_gpuCancellationTokenSource.Token); - _renderer.Window.ChangeVSyncMode((Ryujinx.Graphics.GAL.VSyncMode)Device.VSyncMode); + _renderer.Window.ChangeVSyncMode(Device.VSyncMode); while (_isActive) { @@ -1105,11 +1091,18 @@ namespace Ryujinx.Ava }); (RendererHost.EmbeddedWindow as EmbeddedWindowOpenGL)?.MakeCurrent(true); + + // Reload settings when the game is turned off + // (resets custom settings if there were any) + Program.ReloadConfig(); + + // Reload application list (changes the status of the user setting if it was added or removed during the game) + Dispatcher.UIThread.Post(() => RyujinxApp.MainWindow.LoadApplications()); } public void InitStatus() { - _viewModel.BackendText = ConfigurationState.Instance.Graphics.GraphicsBackend.Value switch + _viewModel.BackendText = RendererHost.Backend switch { GraphicsBackend.Vulkan => "Vulkan", GraphicsBackend.OpenGl => "OpenGL", @@ -1137,11 +1130,23 @@ namespace Ryujinx.Ava LocaleManager.Instance[LocaleKeys.VolumeShort] + $": {(int)(Device.GetVolume() * 100)}%", dockedMode, ConfigurationState.Instance.Graphics.AspectRatio.Value.ToText(), - $"{Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", - $"FIFO: {Device.Statistics.GetFifoPercent():00.00} %", + Device.System.IsPaused ? LocaleManager.GetUnformatted(LocaleKeys.Paused) : FormatGameFrameRate(), + Device.System.IsPaused ? string.Empty : Device.Statistics.FormatFifoPercent(), _displayCount)); } + private string FormatGameFrameRate() + { + string frameRate = Device.Statistics.GetGameFrameRate().ToString("00.00"); + string frameTime = Device.Statistics.GetGameFrameTime().ToString("00.00"); + + return Device.TurboMode + ? LocaleManager.GetUnformatted(LocaleKeys.FpsTurboStatusBarText) + .Format(frameRate, frameTime, Device.TickScalar) + : LocaleManager.GetUnformatted(LocaleKeys.FpsStatusBarText) + .Format(frameRate, frameTime); + } + public async Task ShowExitPrompt() { bool shouldExit = !ConfigurationState.Instance.ShowConfirmExit; @@ -1154,6 +1159,24 @@ namespace Ryujinx.Ava _dialogShown = true; + // The hard-coded hotkey mapped to exit is Escape, but it's also the same key + // that causes the dialog we launch to close (without doing anything). In release + // mode, a race is observed that between ShowExitPrompt() appearing on KeyDown + // and the ContentDialog we create seeing the key state before KeyUp. Merely waiting + // for the key to no longer be pressed appears to be insufficient. + // NB: Using _keyboardInterface.IsPressed(Key.Escape) does not currently work. + if (OperatingSystem.IsWindows()) + { + while (GetAsyncKeyState(0x1B) != 0) + { + await Task.Delay(100); + } + } + else + { + await Task.Delay(250); + } + shouldExit = await ContentDialogHelper.CreateStopEmulationDialog(); _dialogShown = false; @@ -1167,6 +1190,9 @@ namespace Ryujinx.Ava private void UpdateShaderCount() { + if (_displayCount is 0 && _renderer.ProgramCount is 0) + return; + // If there is a mismatch between total program compile and previous count // this means new shaders have been compiled and should be displayed. if (_renderer.ProgramCount != _previousCount) @@ -1234,18 +1260,29 @@ namespace Ryujinx.Ava if (currentHotkeyState != _prevHotkeyState) { + if (ConfigurationState.Instance.Hid.Hotkeys.Value.TurboModeWhileHeld && + _keyboardInterface.IsPressed((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.TurboMode) != Device.TurboMode) + { + Device.ToggleTurbo(); + } + switch (currentHotkeyState) { case KeyboardHotkeyState.ToggleVSyncMode: VSyncModeToggle(); break; case KeyboardHotkeyState.CustomVSyncIntervalDecrement: - Device.DecrementCustomVSyncInterval(); - _viewModel.CustomVSyncInterval -= 1; + _viewModel.CustomVSyncInterval = Device.DecrementCustomVSyncInterval(); break; case KeyboardHotkeyState.CustomVSyncIntervalIncrement: - Device.IncrementCustomVSyncInterval(); - _viewModel.CustomVSyncInterval += 1; + _viewModel.CustomVSyncInterval = Device.IncrementCustomVSyncInterval(); + break; + case KeyboardHotkeyState.TurboMode: + if (!ConfigurationState.Instance.Hid.Hotkeys.Value.TurboModeWhileHeld) + { + Device.ToggleTurbo(); + } + break; case KeyboardHotkeyState.Screenshot: ScreenshotRequested = true; @@ -1262,6 +1299,7 @@ namespace Ryujinx.Ava { Pause(); } + break; case KeyboardHotkeyState.ToggleMute: if (Device.IsAudioMuted()) @@ -1376,6 +1414,10 @@ namespace Ryujinx.Ava { state = KeyboardHotkeyState.CustomVSyncIntervalDecrement; } + else if (_keyboardInterface.IsPressed((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.TurboMode)) + { + state = KeyboardHotkeyState.TurboMode; + } return state; } diff --git a/src/Ryujinx.UI.Common/App/ApplicationCountUpdatedEventArgs.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationCountUpdatedEventArgs.cs similarity index 81% rename from src/Ryujinx.UI.Common/App/ApplicationCountUpdatedEventArgs.cs rename to src/Ryujinx/Systems/AppLibrary/ApplicationCountUpdatedEventArgs.cs index 5ed7baf19..7866ffa3a 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationCountUpdatedEventArgs.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationCountUpdatedEventArgs.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.UI.App.Common +namespace Ryujinx.Ava.Systems.AppLibrary { public class ApplicationCountUpdatedEventArgs : EventArgs { diff --git a/src/Ryujinx.UI.Common/App/ApplicationData.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs similarity index 65% rename from src/Ryujinx.UI.Common/App/ApplicationData.cs rename to src/Ryujinx/Systems/AppLibrary/ApplicationData.cs index 7aa0dccaa..5656d6e73 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationData.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs @@ -1,3 +1,4 @@ +using Gommon; using LibHac.Common; using LibHac.Fs; using LibHac.Fs.Fsa; @@ -7,28 +8,52 @@ using LibHac.Ns; using LibHac.Tools.Fs; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.PlayReport; +using Ryujinx.Ava.Utilities; using Ryujinx.Common.Logging; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.Loaders.Processes.Extensions; -using Ryujinx.UI.Common.Helper; using System; using System.IO; using System.Text.Json.Serialization; -namespace Ryujinx.UI.App.Common +namespace Ryujinx.Ava.Systems.AppLibrary { public class ApplicationData { - public static Func LocalizedNever { get; set; } = () => "Never"; - public bool Favorite { get; set; } + public bool HasIndependentConfiguration { get; set; } public byte[] Icon { get; set; } public string Name { get; set; } = "Unknown"; - public ulong Id { get; set; } + + private ulong _id; + + public ulong Id + { + get => _id; + set + { + _id = value; + + Compatibility = CompatibilityDatabase.Find(value); + RichPresenceSpec = PlayReports.Analyzer.TryGetSpec(IdString, out GameSpec gameSpec) + ? gameSpec + : default(Optional); + } + } + public Optional RichPresenceSpec { get; set; } + public string Developer { get; set; } = "Unknown"; public string Version { get; set; } = "0"; public int PlayerCount { get; set; } public int GameCount { get; set; } + + public bool HasLdnGames => PlayerCount != 0 && GameCount != 0; + + public bool HasRichPresenceAsset => DiscordIntegrationModule.HasAssetImage(IdString); + public bool HasDynamicRichPresenceSupport => RichPresenceSpec.HasValue; + public TimeSpan TimePlayed { get; set; } public DateTime? LastPlayed { get; set; } public string FileExtension { get; set; } @@ -36,12 +61,44 @@ namespace Ryujinx.UI.App.Common public string Path { get; set; } public BlitStruct ControlHolder { get; set; } + public bool HasControlHolder => ControlHolder.ByteSpan.Length > 0 && !ControlHolder.ByteSpan.IsZeros(); + public string TimePlayedString => ValueFormatUtils.FormatTimeSpan(TimePlayed); - public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed) ?? LocalizedNever(); + public bool HasPlayedPreviously => TimePlayed.TotalSeconds > 1; + + public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed)?.Replace(" ", "\n"); public string FileSizeString => ValueFormatUtils.FormatFileSize(FileSize); + public Optional Compatibility { get; private set; } + + public bool HasPlayabilityInfo => Compatibility.HasValue; + + public string LocalizedStatus => Compatibility.Convert(x => x.LocalizedStatus); + + public bool HasCompatibilityLabels => !FormattedCompatibilityLabels.Equals(string.Empty); + + public string FormattedCompatibilityLabels + => Compatibility.Convert(x => x.FormattedIssueLabels).OrElse(string.Empty); + + public LocaleKeys? PlayabilityStatus => Compatibility.Convert(x => x.Status).OrElse(null); + + public string LocalizedStatusTooltip => + Compatibility.Convert(x => +#pragma warning disable CS8509 // It is exhaustive for all possible values this can contain. + LocaleManager.Instance[x.Status switch +#pragma warning restore CS8509 + { + LocaleKeys.CompatibilityListPlayable => LocaleKeys.CompatibilityListPlayableTooltip, + LocaleKeys.CompatibilityListIngame => LocaleKeys.CompatibilityListIngameTooltip, + LocaleKeys.CompatibilityListMenus => LocaleKeys.CompatibilityListMenusTooltip, + LocaleKeys.CompatibilityListBoots => LocaleKeys.CompatibilityListBootsTooltip, + LocaleKeys.CompatibilityListNothing => LocaleKeys.CompatibilityListNothingTooltip, + }] + ).OrElse(string.Empty); + + [JsonIgnore] public string IdString => Id.ToString("x16"); [JsonIgnore] public ulong IdBase => Id & ~0x1FFFUL; @@ -50,17 +107,17 @@ namespace Ryujinx.UI.App.Common public static string GetBuildId(VirtualFileSystem virtualFileSystem, IntegrityCheckLevel checkLevel, string titleFilePath) { - using FileStream file = new(titleFilePath, FileMode.Open, FileAccess.Read); - - Nca mainNca = null; - Nca patchNca = null; - if (!System.IO.Path.Exists(titleFilePath)) { Logger.Error?.Print(LogClass.Application, $"File \"{titleFilePath}\" does not exist."); return string.Empty; } + using FileStream file = new(titleFilePath, FileMode.Open, FileAccess.Read); + + Nca mainNca = null; + Nca patchNca = null; + string extension = System.IO.Path.GetExtension(titleFilePath).ToLower(); if (extension is ".nsp" or ".xci") @@ -75,14 +132,14 @@ namespace Ryujinx.UI.App.Common } else { - var pfsTemp = new PartitionFileSystem(); + PartitionFileSystem pfsTemp = new(); pfsTemp.Initialize(file.AsStorage()).ThrowIfFailure(); pfs = pfsTemp; } foreach (DirectoryEntryEx fileEntry in pfs.EnumerateEntries("/", "*.nca")) { - using var ncaFile = new UniqueRef(); + using UniqueRef ncaFile = new(); pfs.OpenFile(ref ncaFile.Ref, fileEntry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); @@ -157,14 +214,14 @@ namespace Ryujinx.UI.App.Common return string.Empty; } - using var nsoFile = new UniqueRef(); + using UniqueRef nsoFile = new(); codeFs.OpenFile(ref nsoFile.Ref, $"/{MainExeFs}".ToU8Span(), OpenMode.Read).ThrowIfFailure(); NsoReader reader = new(); reader.Initialize(nsoFile.Release().AsStorage().AsFile(OpenMode.Read)).ThrowIfFailure(); - return BitConverter.ToString(reader.Header.ModuleId.ItemsRo.ToArray()).Replace("-", string.Empty).ToUpper()[..16]; + return Convert.ToHexString(reader.Header.ModuleId).Replace("-", string.Empty).ToUpper()[..16]; } } } diff --git a/src/Ryujinx.UI.Common/App/ApplicationJsonSerializerContext.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationJsonSerializerContext.cs similarity index 85% rename from src/Ryujinx.UI.Common/App/ApplicationJsonSerializerContext.cs rename to src/Ryujinx/Systems/AppLibrary/ApplicationJsonSerializerContext.cs index ada7cc346..3fd24a6ba 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationJsonSerializerContext.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationJsonSerializerContext.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Ryujinx.UI.App.Common +namespace Ryujinx.Ava.Systems.AppLibrary { [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(ApplicationMetadata))] diff --git a/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs similarity index 84% rename from src/Ryujinx.UI.Common/App/ApplicationLibrary.cs rename to src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs index 174db51ad..1db2332b8 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs @@ -11,6 +11,11 @@ using LibHac.Ns; using LibHac.Tools.Fs; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; +using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Utilities; +using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.Logging; @@ -20,16 +25,11 @@ using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.Loaders.Npdm; using Ryujinx.HLE.Loaders.Processes.Extensions; using Ryujinx.HLE.Utilities; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Configuration.System; -using Ryujinx.UI.Common.Helper; -using Ryujinx.UI.Common.Models; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; -using System.Reflection; using System.Text; using System.Text.Json; using System.Threading; @@ -37,22 +37,40 @@ using System.Threading.Tasks; using ContentType = LibHac.Ncm.ContentType; using MissingKeyException = LibHac.Common.Keys.MissingKeyException; using Path = System.IO.Path; -using SpanHelpers = LibHac.Common.SpanHelpers; using TimeSpan = System.TimeSpan; -namespace Ryujinx.UI.App.Common +namespace Ryujinx.Ava.Systems.AppLibrary { public class ApplicationLibrary { - public static string DefaultLanPlayWebHost = "ryuldnweb.vudjun.com"; public Language DesiredLanguage { get; set; } public event EventHandler ApplicationCountUpdated; - public event EventHandler LdnGameDataReceived; + public event Action LdnGameDataReceived; public readonly IObservableCache Applications; public readonly IObservableCache<(TitleUpdateModel TitleUpdate, bool IsSelected), TitleUpdateModel> TitleUpdates; public readonly IObservableCache<(DownloadableContentModel Dlc, bool IsEnabled), DownloadableContentModel> DownloadableContents; + private Gommon.Optional _totalTimePlayed; + + public Gommon.Optional TotalTimePlayed + { + get => _totalTimePlayed; + private set + { + _totalTimePlayed = value; + _totalTimePlayedChanged.Call(value); + } + } + + public event Action> TotalTimePlayedRecalculated + { + add => _totalTimePlayedChanged.Add(value); + remove => _totalTimePlayedChanged.Remove(value); + } + + private readonly Event> _totalTimePlayedChanged = new(); + private readonly byte[] _nspIcon; private readonly byte[] _xciIcon; private readonly byte[] _ncaIcon; @@ -78,21 +96,11 @@ namespace Ryujinx.UI.App.Common TitleUpdates = _titleUpdates.AsObservableCache(); DownloadableContents = _downloadableContents.AsObservableCache(); - _nspIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NSP.png"); - _xciIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_XCI.png"); - _ncaIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NCA.png"); - _nroIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NRO.png"); - _nsoIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NSO.png"); - } - - private static byte[] GetResourceBytes(string resourceName) - { - Stream resourceStream = Assembly.GetCallingAssembly().GetManifestResourceStream(resourceName)!; - byte[] resourceByteArray = new byte[resourceStream.Length]; - - resourceStream.ReadExactly(resourceByteArray); - - return resourceByteArray; + _nspIcon = EmbeddedResources.Read("Ryujinx/Assets.UIImages.Icon_NSP.png"); + _xciIcon = EmbeddedResources.Read("Ryujinx/Assets.UIImages.Icon_XCI.png"); + _ncaIcon = EmbeddedResources.Read("Ryujinx/Assets.UIImages.Icon_NCA.png"); + _nroIcon = EmbeddedResources.Read("Ryujinx/Assets.UIImages.Icon_NRO.png"); + _nsoIcon = EmbeddedResources.Read("Ryujinx/Assets.UIImages.Icon_NSO.png"); } /// The npdm file doesn't contain valid data. @@ -123,6 +131,67 @@ namespace Ryujinx.UI.App.Common return data; } + /// + /// Gets a name for an available content file based on the Application ID ''. + ///

+ /// For Applications, this returns the localized name of the app found in the file. + /// For DLCs, this returns the name of the file that contains the DLC, minus the file extension. + ///
+ /// The Application ID to search for. + /// + /// If the provided Application ID does not have a corresponding Application OR DLC file, + /// formatted as hexadecimal is returned. + /// + /// A formatted Application name, or as hexadecimal if none is found. + public string GetNameForApplicationId(ulong id) + { + DynamicData.Kernel.Optional appData = Applications.Lookup(id); + if (appData.HasValue) + return appData.Value.Name; + + if (!DownloadableContents.Keys.FindFirst(x => x.TitleId == id).TryGet(out DownloadableContentModel dlcData)) + return id.ToString("X16"); + + string name = Path.GetFileNameWithoutExtension(dlcData.FileName)!; + int idx = name.IndexOf('['); + if (idx != -1) + name = name[..idx]; + + return name; + } + + public bool FindApplication(ulong id, out ApplicationData foundData) + { + DynamicData.Kernel.Optional appData = Applications.Lookup(id); + foundData = appData.HasValue ? appData.Value : null; + + return appData.HasValue; + } + + public bool FindUpdate(ulong id, out TitleUpdateModel foundData) + { + Gommon.Optional appData = + TitleUpdates.Keys.FindFirst(x => x.TitleId == id); + foundData = appData.HasValue ? appData.Value : null; + + return appData.HasValue; + } + + public TitleUpdateModel[] FindUpdatesFor(ulong id) + => TitleUpdates.Keys.Where(x => x.TitleIdBase == (id & ~0x1FFFUL)).ToArray(); + + public (TitleUpdateModel TitleUpdate, bool IsSelected)[] FindUpdateConfigurationFor(ulong id) + => TitleUpdates.Items.Where(x => x.TitleUpdate.TitleIdBase == (id & ~0x1FFFUL)).ToArray(); + + public DownloadableContentModel[] FindDlcsFor(ulong id) + => DownloadableContents.Keys.Where(x => x.TitleIdBase == (id & ~0x1FFFUL)).ToArray(); + + public (DownloadableContentModel Dlc, bool IsEnabled)[] FindDlcConfigurationFor(ulong id) + => DownloadableContents.Items.Where(x => x.Dlc.TitleIdBase == (id & ~0x1FFFUL)).ToArray(); + + public bool HasDlcs(ulong id) + => DownloadableContents.Keys.Any(x => x.TitleIdBase == (id & ~0x1FFFUL)); + /// The configured key set is missing a key. /// The NCA header could not be decrypted. /// The NCA version is not supported. @@ -191,12 +260,9 @@ namespace Ryujinx.UI.App.Common } } - if (isExeFs) - { - return GetApplicationFromExeFs(pfs, filePath); - } - - return null; + return isExeFs + ? GetApplicationFromExeFs(pfs, filePath) + : null; } /// The configured key set is missing a key. @@ -205,7 +271,7 @@ namespace Ryujinx.UI.App.Common /// An error occured while reading PFS data. private List GetApplicationsFromPfs(IFileSystem pfs, string filePath) { - var applications = new List(); + List applications = []; string extension = Path.GetExtension(filePath).ToLower(); foreach ((ulong titleId, ContentMetaData content) in pfs.GetContentData(ContentMetaType.Application, _virtualFileSystem, _checkLevel)) @@ -260,7 +326,7 @@ namespace Ryujinx.UI.App.Common continue; } - using var icon = new UniqueRef(); + using UniqueRef icon = new(); controlFs.OpenFile(ref icon.Ref, entry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); @@ -328,7 +394,7 @@ namespace Ryujinx.UI.App.Common case ".nsp": case ".pfs0": { - var pfs = new PartitionFileSystem(); + PartitionFileSystem pfs = new(); pfs.Initialize(file.AsStorage()).ThrowIfFailure(); ApplicationData result = GetApplicationFromNsp(pfs, applicationPath); @@ -375,6 +441,10 @@ namespace Ryujinx.UI.App.Common Read(assetOffset + (int)nacpOffset, (int)nacpSize).AsSpan().CopyTo(controlHolder.ByteSpan); GetApplicationInformation(ref controlHolder.Value, ref application); + + if ("Switch Verification" == controlHolder.Value + .Title[(int)TitleLanguage.AmericanEnglish].NameString.ToString()) + return false; } else { @@ -453,7 +523,7 @@ namespace Ryujinx.UI.App.Common return false; } - foreach (var data in applications) + foreach (ApplicationData data in applications) { // Only load metadata for applications with an ID if (data.Id != 0) @@ -480,13 +550,13 @@ namespace Ryujinx.UI.App.Common // Migration successful: deleting last_played from the metadata file. appMetadata.LastPlayedOld = default; } - } }); data.Favorite = appMetadata.Favorite; data.TimePlayed = appMetadata.TimePlayed; data.LastPlayed = appMetadata.LastPlayed; + data.HasIndependentConfiguration = File.Exists(Program.GetDirGameUserConfig(data.IdBaseString)); // Just check user config } data.FileExtension = Path.GetExtension(applicationPath).TrimStart('.').ToUpper(); @@ -512,15 +582,11 @@ namespace Ryujinx.UI.App.Common case ".xci": case ".nsp": { - IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks - ? IntegrityCheckLevel.ErrorOnInvalid - : IntegrityCheckLevel.None; - using IFileSystem pfs = PartitionFileSystemUtils.OpenApplicationFileSystem(filePath, _virtualFileSystem); foreach (DirectoryEntryEx fileEntry in pfs.EnumerateEntries("/", "*.nca")) { - using var ncaFile = new UniqueRef(); + using UniqueRef ncaFile = new(); pfs.OpenFile(ref ncaFile.Ref, fileEntry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); @@ -575,15 +641,11 @@ namespace Ryujinx.UI.App.Common case ".xci": case ".nsp": { - IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks - ? IntegrityCheckLevel.ErrorOnInvalid - : IntegrityCheckLevel.None; - using IFileSystem pfs = PartitionFileSystemUtils.OpenApplicationFileSystem(filePath, _virtualFileSystem); Dictionary updates = - pfs.GetContentData(ContentMetaType.Patch, _virtualFileSystem, checkLevel); + pfs.GetContentData(ContentMetaType.Patch, _virtualFileSystem, ConfigurationState.Instance.System.IntegrityCheckLevel); if (updates.Count == 0) { @@ -604,11 +666,11 @@ namespace Ryujinx.UI.App.Common controlNca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.None) .OpenFile(ref nacpFile.Ref, "/control.nacp".ToU8Span(), OpenMode.Read) .ThrowIfFailure(); - nacpFile.Get.Read(out _, 0, SpanHelpers.AsByteSpan(ref controlData), + nacpFile.Get.Read(out _, 0, LibHac.Common.SpanHelpers.AsByteSpan(ref controlData), ReadOption.None).ThrowIfFailure(); - var displayVersion = controlData.DisplayVersionString.ToString(); - var update = new TitleUpdateModel(content.ApplicationId, content.Version.Version, + string displayVersion = controlData.DisplayVersionString.ToString(); + TitleUpdateModel update = new(content.ApplicationId, content.Version.Version, displayVersion, filePath); titleUpdates.Add(update); @@ -661,7 +723,7 @@ namespace Ryujinx.UI.App.Common _applications.Clear(); // Builds the applications list with paths to found applications - List applicationPaths = new(); + List applicationPaths = []; try { @@ -704,11 +766,11 @@ namespace Ryujinx.UI.App.Common return; } - var fileInfo = new FileInfo(app); + FileInfo fileInfo = new(app); try { - var fullPath = fileInfo.ResolveLinkTarget(true)?.FullName ?? fileInfo.FullName; + string fullPath = fileInfo.ResolveLinkTarget(true)?.FullName ?? fileInfo.FullName; applicationPaths.Add(fullPath); numApplicationsFound++; @@ -725,7 +787,6 @@ namespace Ryujinx.UI.App.Common } } - // Loops through applications list, creating a struct and then firing an event containing the struct for each application foreach (string applicationPath in applicationPaths) { @@ -738,7 +799,7 @@ namespace Ryujinx.UI.App.Common { _applications.Edit(it => { - foreach (var application in applications) + foreach (ApplicationData application in applications) { it.AddOrUpdate(application); LoadDlcForApplication(application); @@ -782,9 +843,24 @@ namespace Ryujinx.UI.App.Common } } + public Task RefreshTotalTimePlayedAsync() + { + TotalTimePlayed = Gommon.Optional.None; + + TimeSpan temporary = TimeSpan.Zero; + + foreach (var installedApplication in Applications.Items) + { + temporary += LoadAndSaveMetaData(installedApplication.IdString).TimePlayed; + } + + TotalTimePlayed = temporary; + + return Task.CompletedTask; + } + public async Task RefreshLdn() { - if (ConfigurationState.Instance.Multiplayer.Mode == MultiplayerMode.LdnRyu) { try @@ -792,34 +868,22 @@ namespace Ryujinx.UI.App.Common string ldnWebHost = ConfigurationState.Instance.Multiplayer.LdnServer; if (string.IsNullOrEmpty(ldnWebHost)) { - ldnWebHost = DefaultLanPlayWebHost; + ldnWebHost = SharedConstants.DefaultLanPlayWebHost; } - IEnumerable ldnGameDataArray = Array.Empty(); - using HttpClient httpClient = new HttpClient(); + + using HttpClient httpClient = new(); string ldnGameDataArrayString = await httpClient.GetStringAsync($"https://{ldnWebHost}/api/public_games"); - ldnGameDataArray = JsonHelper.Deserialize(ldnGameDataArrayString, _ldnDataSerializerContext.IEnumerableLdnGameData); - var evt = new LdnGameDataReceivedEventArgs - { - LdnData = ldnGameDataArray - }; - LdnGameDataReceived?.Invoke(null, evt); + LdnGameData[] ldnGameDataArray = JsonHelper.Deserialize(ldnGameDataArrayString, _ldnDataSerializerContext.IEnumerableLdnGameData).ToArray(); + LdnGameDataReceived?.Invoke(new LdnGameDataReceivedEventArgs(ldnGameDataArray)); + return; } catch (Exception ex) { Logger.Warning?.Print(LogClass.Application, $"Failed to fetch the public games JSON from the API. Player and game count in the game list will be unavailable.\n{ex.Message}"); - LdnGameDataReceived?.Invoke(null, new LdnGameDataReceivedEventArgs() - { - LdnData = Array.Empty() - }); } } - else - { - LdnGameDataReceived?.Invoke(null, new LdnGameDataReceivedEventArgs() - { - LdnData = Array.Empty() - }); - } + + LdnGameDataReceived?.Invoke(LdnGameDataReceivedEventArgs.Empty); } // Replace the currently stored DLC state for the game with the provided DLC state. @@ -827,7 +891,7 @@ namespace Ryujinx.UI.App.Common { _downloadableContents.Edit(it => { - DownloadableContentsHelper.SaveDownloadableContentsJson(_virtualFileSystem, application.IdBase, dlcs); + DownloadableContentsHelper.SaveDownloadableContentsJson(application.IdBase, dlcs); it.Remove(it.Items.Where(item => item.Dlc.TitleIdBase == application.IdBase)); it.AddOrUpdate(dlcs); @@ -839,7 +903,7 @@ namespace Ryujinx.UI.App.Common { _titleUpdates.Edit(it => { - TitleUpdatesHelper.SaveTitleUpdatesJson(_virtualFileSystem, application.IdBase, updates); + TitleUpdatesHelper.SaveTitleUpdatesJson(application.IdBase, updates); it.Remove(it.Items.Where(item => item.TitleUpdate.TitleIdBase == application.IdBase)); it.AddOrUpdate(updates); @@ -853,15 +917,14 @@ namespace Ryujinx.UI.App.Common { _cancellationToken = new CancellationTokenSource(); - List dlcPaths = new(); + List dlcPaths = []; int newDlcLoaded = 0; numDlcRemoved = 0; try { // Remove any downloadable content which can no longer be located on disk - Logger.Notice.Print(LogClass.Application, $"Removing non-existing Title DLCs"); - var dlcToRemove = _downloadableContents.Items + List<(DownloadableContentModel Dlc, bool IsEnabled)> dlcToRemove = _downloadableContents.Items .Where(dlc => !File.Exists(dlc.Dlc.ContainerPath)) .ToList(); dlcToRemove.ForEach(dlc => @@ -872,8 +935,6 @@ namespace Ryujinx.UI.App.Common foreach (string appDir in appDirs) { - Logger.Notice.Print(LogClass.Application, $"Auto loading DLC from: {appDir}"); - if (_cancellationToken.Token.IsCancellationRequested) { return newDlcLoaded; @@ -905,11 +966,11 @@ namespace Ryujinx.UI.App.Common return newDlcLoaded; } - var fileInfo = new FileInfo(app); + FileInfo fileInfo = new(app); try { - var fullPath = fileInfo.ResolveLinkTarget(true)?.FullName ?? fileInfo.FullName; + string fullPath = fileInfo.ResolveLinkTarget(true)?.FullName ?? fileInfo.FullName; dlcPaths.Add(fullPath); } @@ -927,7 +988,7 @@ namespace Ryujinx.UI.App.Common } } - var appIdLookup = Applications.Items.Select(it => it.IdBase).ToHashSet(); + HashSet appIdLookup = Applications.Items.Select(it => it.IdBase).ToHashSet(); foreach (string dlcPath in dlcPaths) { @@ -936,9 +997,9 @@ namespace Ryujinx.UI.App.Common return newDlcLoaded; } - if (TryGetDownloadableContentFromFile(dlcPath, out var foundDlcs)) + if (TryGetDownloadableContentFromFile(dlcPath, out List foundDlcs)) { - foreach (var dlc in foundDlcs.Where(it => appIdLookup.Contains(it.TitleIdBase))) + foreach (DownloadableContentModel dlc in foundDlcs.Where(it => appIdLookup.Contains(it.TitleIdBase))) { if (!_downloadableContents.Lookup(dlc).HasValue) { @@ -966,18 +1027,17 @@ namespace Ryujinx.UI.App.Common { _cancellationToken = new CancellationTokenSource(); - List updatePaths = new(); + List updatePaths = []; int numUpdatesLoaded = 0; numUpdatesRemoved = 0; try { - var titleIdsToSave = new HashSet(); - var titleIdsToRefresh = new HashSet(); + HashSet titleIdsToSave = []; + HashSet titleIdsToRefresh = []; // Remove any updates which can no longer be located on disk - Logger.Notice.Print(LogClass.Application, $"Removing non-existing Title Updates"); - var updatesToRemove = _titleUpdates.Items + List<(TitleUpdateModel TitleUpdate, bool IsSelected)> updatesToRemove = _titleUpdates.Items .Where(it => !File.Exists(it.TitleUpdate.Path)) .ToList(); @@ -991,8 +1051,6 @@ namespace Ryujinx.UI.App.Common foreach (string appDir in appDirs) { - Logger.Notice.Print(LogClass.Application, $"Auto loading updates from: {appDir}"); - if (_cancellationToken.Token.IsCancellationRequested) { return numUpdatesLoaded; @@ -1024,11 +1082,11 @@ namespace Ryujinx.UI.App.Common return numUpdatesLoaded; } - var fileInfo = new FileInfo(app); + FileInfo fileInfo = new(app); try { - var fullPath = fileInfo.ResolveLinkTarget(true)?.FullName ?? fileInfo.FullName; + string fullPath = fileInfo.ResolveLinkTarget(true)?.FullName ?? fileInfo.FullName; updatePaths.Add(fullPath); } @@ -1046,7 +1104,7 @@ namespace Ryujinx.UI.App.Common } } - var appIdLookup = Applications.Items.Select(it => it.IdBase).ToHashSet(); + HashSet appIdLookup = Applications.Items.Select(it => it.IdBase).ToHashSet(); foreach (string updatePath in updatePaths) { @@ -1055,9 +1113,9 @@ namespace Ryujinx.UI.App.Common return numUpdatesLoaded; } - if (TryGetTitleUpdatesFromFile(updatePath, out var foundUpdates)) + if (TryGetTitleUpdatesFromFile(updatePath, out List foundUpdates)) { - foreach (var update in foundUpdates.Where(it => appIdLookup.Contains(it.TitleIdBase))) + foreach (TitleUpdateModel update in foundUpdates.Where(it => appIdLookup.Contains(it.TitleIdBase))) { if (!_titleUpdates.Lookup(update).HasValue) { @@ -1088,11 +1146,14 @@ namespace Ryujinx.UI.App.Common private bool AddAndAutoSelectUpdate(TitleUpdateModel update) { - var currentlySelected = TitleUpdates.Items.FirstOrOptional(it => + if (update == null) + return false; + + DynamicData.Kernel.Optional<(TitleUpdateModel TitleUpdate, bool IsSelected)> currentlySelected = TitleUpdates.Items.FirstOrOptional(it => it.TitleUpdate.TitleIdBase == update.TitleIdBase && it.IsSelected); - var shouldSelect = !currentlySelected.HasValue || - currentlySelected.Value.TitleUpdate.Version < update.Version; + bool shouldSelect = !currentlySelected.HasValue || + currentlySelected.Value.TitleUpdate.Version < update.Version; _titleUpdates.AddOrUpdate((update, shouldSelect)); @@ -1194,7 +1255,7 @@ namespace Ryujinx.UI.App.Common } else { - var pfsTemp = new PartitionFileSystem(); + PartitionFileSystem pfsTemp = new(); pfsTemp.Initialize(file.AsStorage()).ThrowIfFailure(); pfs = pfsTemp; @@ -1228,7 +1289,7 @@ namespace Ryujinx.UI.App.Common // Read the icon from the ControlFS and store it as a byte array try { - using var icon = new UniqueRef(); + using UniqueRef icon = new(); controlFs.OpenFile(ref icon.Ref, $"/icon_{desiredTitleLanguage}.dat".ToU8Span(), OpenMode.Read).ThrowIfFailure(); @@ -1246,7 +1307,7 @@ namespace Ryujinx.UI.App.Common continue; } - using var icon = new UniqueRef(); + using UniqueRef icon = new(); controlFs.OpenFile(ref icon.Ref, entry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); @@ -1341,7 +1402,7 @@ namespace Ryujinx.UI.App.Common { _ = Enum.TryParse(DesiredLanguage.ToString(), out TitleLanguage desiredTitleLanguage); - if (controlData.Title.ItemsRo.Length > (int)desiredTitleLanguage) + if (controlData.Title.Length > (int)desiredTitleLanguage) { data.Name = controlData.Title[(int)desiredTitleLanguage].NameString.ToString(); data.Developer = controlData.Title[(int)desiredTitleLanguage].PublisherString.ToString(); @@ -1354,7 +1415,7 @@ namespace Ryujinx.UI.App.Common if (string.IsNullOrWhiteSpace(data.Name)) { - foreach (ref readonly var controlTitle in controlData.Title.ItemsRo) + foreach (ref readonly ApplicationControlProperty.ApplicationTitle controlTitle in controlData.Title) { if (!controlTitle.NameString.IsEmpty()) { @@ -1367,7 +1428,7 @@ namespace Ryujinx.UI.App.Common if (string.IsNullOrWhiteSpace(data.Developer)) { - foreach (ref readonly var controlTitle in controlData.Title.ItemsRo) + foreach (ref readonly ApplicationControlProperty.ApplicationTitle controlTitle in controlData.Title) { if (!controlTitle.PublisherString.IsEmpty()) { @@ -1443,16 +1504,16 @@ namespace Ryujinx.UI.App.Common { _downloadableContents.Edit(it => { - var savedDlc = + List<(DownloadableContentModel, bool IsEnabled)> savedDlc = DownloadableContentsHelper.LoadDownloadableContentsJson(_virtualFileSystem, application.IdBase); it.AddOrUpdate(savedDlc); - if (TryGetDownloadableContentFromFile(application.Path, out var bundledDlc)) + if (TryGetDownloadableContentFromFile(application.Path, out List bundledDlc)) { - var savedDlcLookup = savedDlc.Select(dlc => dlc.Item1).ToHashSet(); + HashSet savedDlcLookup = savedDlc.Select(dlc => dlc.Item1).ToHashSet(); bool addedNewDlc = false; - foreach (var dlc in bundledDlc) + foreach (DownloadableContentModel dlc in bundledDlc) { if (!savedDlcLookup.Contains(dlc)) { @@ -1463,8 +1524,8 @@ namespace Ryujinx.UI.App.Common if (addedNewDlc) { - var gameDlcs = it.Items.Where(dlc => dlc.Dlc.TitleIdBase == application.IdBase).ToList(); - DownloadableContentsHelper.SaveDownloadableContentsJson(_virtualFileSystem, application.IdBase, + List<(DownloadableContentModel Dlc, bool IsEnabled)> gameDlcs = it.Items.Where(dlc => dlc.Dlc.TitleIdBase == application.IdBase).ToList(); + DownloadableContentsHelper.SaveDownloadableContentsJson(application.IdBase, gameDlcs); } } @@ -1475,32 +1536,32 @@ namespace Ryujinx.UI.App.Common // file itself private bool LoadTitleUpdatesForApplication(ApplicationData application) { - var modifiedVersion = false; + bool modifiedVersion = false; _titleUpdates.Edit(it => { - var savedUpdates = + List<(TitleUpdateModel Update, bool IsSelected)> savedUpdates = TitleUpdatesHelper.LoadTitleUpdatesJson(_virtualFileSystem, application.IdBase); it.AddOrUpdate(savedUpdates); - var selectedUpdate = savedUpdates.FirstOrOptional(update => update.IsSelected); + DynamicData.Kernel.Optional<(TitleUpdateModel Update, bool IsSelected)> selectedUpdate = savedUpdates.FirstOrOptional(update => update.IsSelected); - if (TryGetTitleUpdatesFromFile(application.Path, out var bundledUpdates)) + if (TryGetTitleUpdatesFromFile(application.Path, out List bundledUpdates)) { - var savedUpdateLookup = savedUpdates.Select(update => update.Item1).ToHashSet(); + HashSet savedUpdateLookup = savedUpdates.Select(update => update.Update).ToHashSet(); bool updatesChanged = false; - foreach (var update in bundledUpdates.OrderByDescending(bundled => bundled.Version)) + foreach (TitleUpdateModel update in bundledUpdates.OrderByDescending(bundled => bundled.Version)) { if (!savedUpdateLookup.Contains(update)) { bool shouldSelect = false; - if (!selectedUpdate.HasValue || selectedUpdate.Value.Item1.Version < update.Version) + if (!selectedUpdate.HasValue || selectedUpdate.Value.Update.Version < update.Version) { shouldSelect = true; if (selectedUpdate.HasValue) - _titleUpdates.AddOrUpdate((selectedUpdate.Value.Item1, false)); - selectedUpdate = DynamicData.Kernel.Optional<(TitleUpdateModel, bool IsSelected)>.Create((update, true)); + _titleUpdates.AddOrUpdate((selectedUpdate.Value.Update, false)); + selectedUpdate = (update, true); } modifiedVersion = modifiedVersion || shouldSelect; @@ -1512,8 +1573,8 @@ namespace Ryujinx.UI.App.Common if (updatesChanged) { - var gameUpdates = it.Items.Where(update => update.TitleUpdate.TitleIdBase == application.IdBase).ToList(); - TitleUpdatesHelper.SaveTitleUpdatesJson(_virtualFileSystem, application.IdBase, gameUpdates); + List<(TitleUpdateModel TitleUpdate, bool IsSelected)> gameUpdates = it.Items.Where(update => update.TitleUpdate.TitleIdBase == application.IdBase).ToList(); + TitleUpdatesHelper.SaveTitleUpdatesJson(application.IdBase, gameUpdates); } } }); @@ -1524,22 +1585,22 @@ namespace Ryujinx.UI.App.Common // Save the _currently tracked_ DLC state for the game private void SaveDownloadableContentsForGame(ulong titleIdBase) { - var dlcs = DownloadableContents.Items.Where(dlc => dlc.Dlc.TitleIdBase == titleIdBase).ToList(); - DownloadableContentsHelper.SaveDownloadableContentsJson(_virtualFileSystem, titleIdBase, dlcs); + List<(DownloadableContentModel Dlc, bool IsEnabled)> dlcs = DownloadableContents.Items.Where(dlc => dlc.Dlc.TitleIdBase == titleIdBase).ToList(); + DownloadableContentsHelper.SaveDownloadableContentsJson(titleIdBase, dlcs); } // Save the _currently tracked_ update state for the game private void SaveTitleUpdatesForGame(ulong titleIdBase) { - var updates = TitleUpdates.Items.Where(update => update.TitleUpdate.TitleIdBase == titleIdBase).ToList(); - TitleUpdatesHelper.SaveTitleUpdatesJson(_virtualFileSystem, titleIdBase, updates); + List<(TitleUpdateModel TitleUpdate, bool IsSelected)> updates = TitleUpdates.Items.Where(update => update.TitleUpdate.TitleIdBase == titleIdBase).ToList(); + TitleUpdatesHelper.SaveTitleUpdatesJson(titleIdBase, updates); } // ApplicationData isnt live-updating (e.g. when an update gets applied) and so this is meant to trigger a refresh // of its state private void RefreshApplicationInfo(ulong appIdBase) { - var application = _applications.Lookup(appIdBase); + DynamicData.Kernel.Optional application = _applications.Lookup(appIdBase); if (!application.HasValue) return; @@ -1547,7 +1608,7 @@ namespace Ryujinx.UI.App.Common if (!TryGetApplicationsFromFile(application.Value.Path, out List newApplications)) return; - var newApplication = newApplications.First(it => it.IdBase == appIdBase); + ApplicationData newApplication = newApplications.First(it => it.IdBase == appIdBase); _applications.AddOrUpdate(newApplication); } } diff --git a/src/Ryujinx.UI.Common/App/ApplicationMetadata.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs similarity index 71% rename from src/Ryujinx.UI.Common/App/ApplicationMetadata.cs rename to src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs index 81193c5b3..8940657b0 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationMetadata.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs @@ -1,7 +1,7 @@ using System; using System.Text.Json.Serialization; -namespace Ryujinx.UI.App.Common +namespace Ryujinx.Ava.Systems.AppLibrary { public class ApplicationMetadata { @@ -33,19 +33,11 @@ namespace Ryujinx.UI.App.Common /// /// Updates and . Call this after a game ends. /// - public void UpdatePostGame() + /// The active gameplay time this past session. + public void UpdatePostGame(TimeSpan playTime) { - DateTime? prevLastPlayed = LastPlayed; UpdatePreGame(); - - if (!prevLastPlayed.HasValue) - { - return; - } - - TimeSpan diff = DateTime.UtcNow - prevLastPlayed.Value; - double newTotalSeconds = TimePlayed.Add(diff).TotalSeconds; - TimePlayed = TimeSpan.FromSeconds(Math.Round(newTotalSeconds, MidpointRounding.AwayFromZero)); + TimePlayed += playTime; } } } diff --git a/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs b/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs new file mode 100644 index 000000000..e5e7abc42 --- /dev/null +++ b/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs @@ -0,0 +1,49 @@ +using Gommon; +using LibHac.Ns; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Ryujinx.Ava.Systems.AppLibrary +{ + public struct LdnGameData + { + public string Id { get; set; } + public int PlayerCount { get; set; } + public int MaxPlayerCount { get; set; } + public string GameName { get; set; } + public string TitleId { get; set; } + public string Mode { get; set; } + public string Status { get; set; } + public IEnumerable Players { get; set; } + + public static Array GetArrayForApp( + LdnGameData[] receivedData, ref ApplicationControlProperty acp) + { + LibHac.Common.FixedArrays.Array8 communicationId = acp.LocalCommunicationId; + + return new Array(receivedData.Where(game => + communicationId.AsReadOnlySpan().Contains(game.TitleId.ToULong()) + )); + } + + public class Array + { + private readonly LdnGameData[] _ldnDatas; + + internal Array(IEnumerable receivedData) + { + _ldnDatas = receivedData.ToArray(); + } + + public int PlayerCount => _ldnDatas.Sum(it => it.PlayerCount); + public int GameCount => _ldnDatas.Length; + } + } + + public static class LdnGameDataHelper + { + public static LdnGameData.Array Where(this LdnGameData[] unfilteredDatas, ref ApplicationControlProperty acp) + => LdnGameData.GetArrayForApp(unfilteredDatas, ref acp); + } +} diff --git a/src/Ryujinx/Systems/AppLibrary/LdnGameDataReceivedEventArgs.cs b/src/Ryujinx/Systems/AppLibrary/LdnGameDataReceivedEventArgs.cs new file mode 100644 index 000000000..8b207c6bd --- /dev/null +++ b/src/Ryujinx/Systems/AppLibrary/LdnGameDataReceivedEventArgs.cs @@ -0,0 +1,17 @@ +using System; + +namespace Ryujinx.Ava.Systems.AppLibrary +{ + public class LdnGameDataReceivedEventArgs : EventArgs + { + public static new readonly LdnGameDataReceivedEventArgs Empty = new(null); + + public LdnGameDataReceivedEventArgs(LdnGameData[] ldnData) + { + LdnData = ldnData ?? []; + } + + + public LdnGameData[] LdnData { get; set; } + } +} diff --git a/src/Ryujinx.UI.Common/App/LdnGameDataSerializerContext.cs b/src/Ryujinx/Systems/AppLibrary/LdnGameDataSerializerContext.cs similarity index 76% rename from src/Ryujinx.UI.Common/App/LdnGameDataSerializerContext.cs rename to src/Ryujinx/Systems/AppLibrary/LdnGameDataSerializerContext.cs index ce8edcdb6..ff7718ed5 100644 --- a/src/Ryujinx.UI.Common/App/LdnGameDataSerializerContext.cs +++ b/src/Ryujinx/Systems/AppLibrary/LdnGameDataSerializerContext.cs @@ -1,11 +1,8 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Ryujinx.UI.App.Common +namespace Ryujinx.Ava.Systems.AppLibrary { [JsonSerializable(typeof(IEnumerable))] - internal partial class LdnGameDataSerializerContext : JsonSerializerContext - { - - } + internal partial class LdnGameDataSerializerContext : JsonSerializerContext; } diff --git a/src/Ryujinx/Systems/CompatibilityDatabase.cs b/src/Ryujinx/Systems/CompatibilityDatabase.cs new file mode 100644 index 000000000..1a780a785 --- /dev/null +++ b/src/Ryujinx/Systems/CompatibilityDatabase.cs @@ -0,0 +1,185 @@ +using Gommon; +using Humanizer; +using nietras.SeparatedValues; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Common.Logging; +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace Ryujinx.Ava.Systems +{ + public class CompatibilityDatabase + { + static CompatibilityDatabase() => Load(); + + public static void Load() + { + using Stream csvStream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream("RyujinxGameCompatibilityList")!; + csvStream.Position = 0; + + using SepReader reader = Sep.Reader().From(csvStream); + ColumnIndices columnIndices = new(reader.Header.IndexOf); + + _entries = reader + .Enumerate(row => new CompatibilityEntry(ref columnIndices, row)) + .OrderBy(it => it.GameName) + .ToArray(); + + Logger.Debug?.Print(LogClass.UI, "Compatibility CSV loaded.", "LoadCompatibility"); + } + + private static CompatibilityEntry[] _entries; + + public static CompatibilityEntry[] Entries + { + get + { + if (_entries == null) + Load(); + + return _entries; + } + } + + public static CompatibilityEntry Find(string titleId) + => Entries.FirstOrDefault(x => x.TitleId.HasValue && x.TitleId.Value.EqualsIgnoreCase(titleId)); + + public static CompatibilityEntry Find(ulong titleId) + => Find(titleId.ToString("X16")); + } + + public class CompatibilityEntry + { + public CompatibilityEntry(ref ColumnIndices indices, SepReader.Row row) + { + string titleIdRow = ColStr(row[indices.TitleId]); + TitleId = !string.IsNullOrEmpty(titleIdRow) + ? titleIdRow + : default(Optional); + + GameName = ColStr(row[indices.GameName]); + + Labels = ColStr(row[indices.Labels]).Split(';'); + Status = ColStr(row[indices.Status]).ToLower() switch + { + "playable" => LocaleKeys.CompatibilityListPlayable, + "ingame" => LocaleKeys.CompatibilityListIngame, + "menus" => LocaleKeys.CompatibilityListMenus, + "boots" => LocaleKeys.CompatibilityListBoots, + "nothing" => LocaleKeys.CompatibilityListNothing, + _ => null + }; + + if (DateTime.TryParse(ColStr(row[indices.LastUpdated]), out DateTime dt)) + LastUpdated = dt; + + return; + + static string ColStr(SepReader.Col col) => col.ToString().Trim('"'); + } + + public string GameName { get; } + public Optional TitleId { get; } + public string[] Labels { get; } + public LocaleKeys? Status { get; } + + public LocaleKeys? StatusDescription + => Status switch + { + LocaleKeys.CompatibilityListPlayable => LocaleKeys.CompatibilityListPlayableTooltip, + LocaleKeys.CompatibilityListIngame => LocaleKeys.CompatibilityListIngameTooltip, + LocaleKeys.CompatibilityListMenus => LocaleKeys.CompatibilityListMenusTooltip, + LocaleKeys.CompatibilityListBoots => LocaleKeys.CompatibilityListBootsTooltip, + LocaleKeys.CompatibilityListNothing => LocaleKeys.CompatibilityListNothingTooltip, + _ => null + }; + + public DateTime LastUpdated { get; } + + public string LocalizedLastUpdated => + LocaleManager.FormatDynamicValue(LocaleKeys.CompatibilityListLastUpdated, LastUpdated.Humanize()); + + public string LocalizedStatus => LocaleManager.Instance[Status!.Value]; + public string LocalizedStatusDescription => LocaleManager.Instance[StatusDescription!.Value]; + public string FormattedTitleId => TitleId + .OrElse(new string(' ', 16)); + + public string FormattedIssueLabels => Labels + .Select(FormatLabelName) + .Where(x => x != null) + .JoinToString(", "); + + public override string ToString() => + new StringBuilder("CompatibilityEntry: {") + .Append($"{nameof(GameName)}=\"{GameName}\", ") + .Append($"{nameof(TitleId)}={TitleId}, ") + .Append($"{nameof(Labels)}={Labels.FormatCollection(it => $"\"{it}\"", separator: ", ", prefix: "[", suffix: "]")}, ") + .Append($"{nameof(Status)}=\"{Status}\", ") + .Append($"{nameof(LastUpdated)}=\"{LastUpdated}\"") + .Append('}') + .ToString(); + + public static string FormatLabelName(string labelName) => labelName.ToLower() switch + { + "audio" => "Audio", + "bug" => "Bug", + "cpu" => "CPU", + "gpu" => "GPU", + "gui" => "GUI", + "help wanted" => "Help Wanted", + "horizon" => "Horizon", + "invalid" => "Invalid", + "kernel" => "Kernel", + "ldn" => "LDN", + "linux" => "Linux", + "macos" => "macOS", + "question" => "Question", + "windows" => "Windows", + "graphics-backend:opengl" => "Graphics: OpenGL", + "graphics-backend:vulkan" => "Graphics: Vulkan", + "ldn-works" => "LDN Works", + "ldn-untested" => "LDN Untested", + "ldn-broken" => "LDN Broken", + "ldn-partial" => "Partial LDN", + "nvdec" => "GPU Video Decoding", + "services" => "HLE Services", + "services-horizon" => "New HLE Services", + "slow" => "Runs Slow", + "crash" => "Crashes", + "deadlock" => "Deadlock", + "regression" => "Regression", + "opengl" => "OpenGL", + "opengl-backend-bug" => "OpenGL Backend Bug", + "vulkan-backend-bug" => "Vulkan Backend Bug", + "mac-bug" => "Mac-specific Problems", + "amd-vendor-bug" => "AMD GPU Bug", + "intel-vendor-bug" => "Intel GPU Bug", + "loader-allocator" => "Loader Allocator", + "audout" => "AudOut", + "32-bit" => "32-bit Game", + "UE4" => "Unreal Engine 4", + "homebrew" => "Homebrew Content", + "online-broken" => "Online Broken", + _ => null + }; + } + + public struct ColumnIndices(Func, int> getIndex) + { + private const string TitleIdCol = "\"title_id\""; + private const string GameNameCol = "\"game_name\""; + private const string LabelsCol = "\"labels\""; + private const string StatusCol = "\"status\""; + private const string LastUpdatedCol = "\"last_updated\""; + + public readonly int TitleId = getIndex(TitleIdCol); + public readonly int GameName = getIndex(GameNameCol); + public readonly int Labels = getIndex(LabelsCol); + public readonly int Status = getIndex(StatusCol); + public readonly int LastUpdated = getIndex(LastUpdatedCol); + } +} diff --git a/src/Ryujinx.UI.Common/Configuration/AudioBackend.cs b/src/Ryujinx/Systems/Configuration/AudioBackend.cs similarity index 84% rename from src/Ryujinx.UI.Common/Configuration/AudioBackend.cs rename to src/Ryujinx/Systems/Configuration/AudioBackend.cs index a952e7ac0..a0aa30f38 100644 --- a/src/Ryujinx.UI.Common/Configuration/AudioBackend.cs +++ b/src/Ryujinx/Systems/Configuration/AudioBackend.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Utilities; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Systems.Configuration { [JsonConverter(typeof(TypedStringEnumConverter))] public enum AudioBackend diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs similarity index 85% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs index 027e1052b..c21383349 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs @@ -1,23 +1,21 @@ -using Ryujinx.Common; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.HLE; -using Ryujinx.UI.Common.Configuration.System; -using Ryujinx.UI.Common.Configuration.UI; using System.Collections.Generic; -using System.Text.Json.Nodes; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Systems.Configuration { public class ConfigurationFileFormat { /// /// The current version of the file format /// - public const int CurrentVersion = 57; + public const int CurrentVersion = 70; /// /// Version of the configuration file format @@ -114,6 +112,11 @@ namespace Ryujinx.UI.Common.Configuration /// public bool LoggingEnableFsAccessLog { get; set; } + /// + /// Enables log messages from Avalonia + /// + public bool LoggingEnableAvalonia { get; set; } + /// /// Controls which log messages are written to the log targets /// @@ -144,6 +147,16 @@ namespace Ryujinx.UI.Common.Configuration ///
public long SystemTimeOffset { get; set; } + /// + /// Instead of setting the time via configuration, use the values provided by the system. + /// + public bool MatchSystemTime { get; set; } + + /// + /// Enable or disable use global input config (Independent from controllers binding) + /// + public bool UseInputGlobalConfig { get; set; } + /// /// Enables or disables Docked Mode /// @@ -155,20 +168,35 @@ namespace Ryujinx.UI.Common.Configuration public bool EnableDiscordIntegration { get; set; } /// - /// Checks for updates when Ryujinx starts when enabled + /// DEPRECATED: Checks for updates when Ryujinx starts when enabled /// public bool CheckUpdatesOnStart { get; set; } + /// + /// Checks for updates when Ryujinx starts when enabled, either prompting when an update is found or just showing a notification. + /// + public UpdaterType UpdateCheckerType { get; set; } + + /// + /// How the emulator should behave when you click off/on the window. + /// + public FocusLostType FocusLostActionType { get; set; } + /// /// Show "Confirm Exit" Dialog /// public bool ShowConfirmExit { get; set; } /// - /// ignore "Applet" dialog + /// Ignore Controller Applet dialog /// public bool IgnoreApplet { get; set; } + /// + /// Skip user profiles manager dialog during gameplay(the used profile in the configuration will be selected) + /// + public bool SkipUserProfiles { get; set; } + /// /// Enables or disables save window size, position and state on close. /// @@ -241,6 +269,11 @@ namespace Ryujinx.UI.Common.Configuration /// public bool EnableLowPowerPtc { get; set; } + /// + /// Clock tick scalar, in percent points (100 = 1.0). + /// + public long TickScalar { get; set; } + /// /// Enables or disables guest Internet access /// @@ -272,7 +305,7 @@ namespace Ryujinx.UI.Common.Configuration public MemoryManagerMode MemoryManagerMode { get; set; } /// - /// Expands the RAM amount on the emulated system from 4GiB to 8GiB + /// Expands the RAM amount on the emulated system /// public MemoryConfiguration DramSize { get; set; } @@ -351,6 +384,11 @@ namespace Ryujinx.UI.Common.Configuration /// public bool StartFullscreen { get; set; } + /// + /// Start games with UI hidden + /// + public bool StartNoUI { get; set; } + /// /// Show console window /// @@ -366,30 +404,26 @@ namespace Ryujinx.UI.Common.Configuration /// public bool EnableMouse { get; set; } + /// + /// Enable/disable the ability to control Ryujinx when it's not the currently focused window. + /// + public bool DisableInputWhenOutOfFocus { get; set; } + /// /// Hotkey Keyboard Bindings /// public KeyboardHotkeys Hotkeys { get; set; } - /// - /// Legacy keyboard control bindings - /// - /// Kept for file format compatibility (to avoid possible failure when parsing configuration on old versions) - /// TODO: Remove this when those older versions aren't in use anymore. - public List KeyboardConfig { get; set; } - - /// - /// Legacy controller control bindings - /// - /// Kept for file format compatibility (to avoid possible failure when parsing configuration on old versions) - /// TODO: Remove this when those older versions aren't in use anymore. - public List ControllerConfig { get; set; } - /// /// Input configurations /// public List InputConfig { get; set; } + /// + /// The speed of spectrum cycling for the Rainbow LED feature. + /// + public float RainbowSpeed { get; set; } + /// /// Graphics backend /// @@ -430,6 +464,16 @@ namespace Ryujinx.UI.Common.Configuration /// public bool UseHypervisor { get; set; } + /// + /// Show toggles for dirty hacks in the UI. + /// + public bool ShowDirtyHacks { get; set; } + + /// + /// The packed values of the enabled dirty hacks. + /// + public ulong[] DirtyHacks { get; set; } + /// /// Loads a configuration file from disk /// diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormatSettings.cs b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormatSettings.cs similarity index 84% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormatSettings.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationFileFormatSettings.cs index 9861ebf1f..1d0350dd3 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormatSettings.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormatSettings.cs @@ -1,6 +1,6 @@ using Ryujinx.Common.Utilities; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Systems.Configuration { internal static class ConfigurationFileFormatSettings { diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationJsonSerializerContext.cs b/src/Ryujinx/Systems/Configuration/ConfigurationJsonSerializerContext.cs similarity index 74% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationJsonSerializerContext.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationJsonSerializerContext.cs index 3c3e3f20d..8574b3a93 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationJsonSerializerContext.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationJsonSerializerContext.cs @@ -1,10 +1,8 @@ using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Systems.Configuration { [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(ConfigurationFileFormat))] - internal partial class ConfigurationJsonSerializerContext : JsonSerializerContext - { - } + internal partial class ConfigurationJsonSerializerContext : JsonSerializerContext; } diff --git a/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs new file mode 100644 index 000000000..afabdb4e3 --- /dev/null +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs @@ -0,0 +1,485 @@ +using Avalonia.Media; +using Gommon; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Configuration.UI; +using Ryujinx.Common.Configuration; +using Ryujinx.Common.Configuration.Hid; +using Ryujinx.Common.Configuration.Hid.Controller; +using Ryujinx.Common.Configuration.Hid.Keyboard; +using Ryujinx.Common.Configuration.Multiplayer; +using Ryujinx.Common.Logging; +using Ryujinx.HLE; +using System; +using System.Collections.Generic; +using System.Linq; +using RyuLogger = Ryujinx.Common.Logging.Logger; + +namespace Ryujinx.Ava.Systems.Configuration +{ + public partial class ConfigurationState + { + public void Load(ConfigurationFileFormat cff, string configurationFilePath, string titleId = "") + { + bool configurationFileUpdated = false; + bool shouldLoadFromFile = string.IsNullOrEmpty(titleId); + + if (cff.Version is < 0 or > ConfigurationFileFormat.CurrentVersion) + { + RyuLogger.Warning?.Print(LogClass.Application, $"Unsupported configuration version {cff.Version}, loading default."); + + LoadDefault(); + } + + foreach ((int newVersion, Action migratorFunction) + in _migrations.OrderBy(x => x.Key)) + { + if (cff.Version >= newVersion) + continue; + + RyuLogger.Warning?.Print(LogClass.Application, + $"Outdated configuration version {cff.Version}, migrating to version {newVersion}."); + + migratorFunction(cff); + + configurationFileUpdated = true; + } + + + EnableDiscordIntegration.Value = cff.EnableDiscordIntegration; + UpdateCheckerType.Value = shouldLoadFromFile ? cff.UpdateCheckerType : UpdateCheckerType.Value; // Get from global config only + FocusLostActionType.Value = cff.FocusLostActionType; + ShowConfirmExit.Value = shouldLoadFromFile ? cff.ShowConfirmExit : ShowConfirmExit.Value; // Get from global config only + RememberWindowState.Value = shouldLoadFromFile ? cff.RememberWindowState : RememberWindowState.Value; // Get from global config only + ShowOldUI.Value = shouldLoadFromFile ? cff.ShowTitleBar : ShowOldUI.Value; // Get from global config only + EnableHardwareAcceleration.Value = shouldLoadFromFile ? cff.EnableHardwareAcceleration : EnableHardwareAcceleration.Value; // Get from global config only + HideCursor.Value = cff.HideCursor; + + Logger.EnableFileLog.Value = cff.EnableFileLog; + Logger.EnableDebug.Value = cff.LoggingEnableDebug; + Logger.EnableStub.Value = cff.LoggingEnableStub; + Logger.EnableInfo.Value = cff.LoggingEnableInfo; + Logger.EnableWarn.Value = cff.LoggingEnableWarn; + Logger.EnableError.Value = cff.LoggingEnableError; + Logger.EnableTrace.Value = cff.LoggingEnableTrace; + Logger.EnableGuest.Value = cff.LoggingEnableGuest; + Logger.EnableFsAccessLog.Value = cff.LoggingEnableFsAccessLog; + Logger.FilteredClasses.Value = cff.LoggingFilteredClasses; + Logger.GraphicsDebugLevel.Value = cff.LoggingGraphicsDebugLevel; + + Graphics.ResScale.Value = cff.ResScale; + Graphics.ResScaleCustom.Value = cff.ResScaleCustom; + Graphics.MaxAnisotropy.Value = cff.MaxAnisotropy; + Graphics.AspectRatio.Value = cff.AspectRatio; + Graphics.ShadersDumpPath.Value = cff.GraphicsShadersDumpPath; + Graphics.BackendThreading.Value = cff.BackendThreading; + Graphics.GraphicsBackend.Value = cff.GraphicsBackend; + Graphics.PreferredGpu.Value = cff.PreferredGpu; + Graphics.AntiAliasing.Value = cff.AntiAliasing; + Graphics.ScalingFilter.Value = cff.ScalingFilter; + Graphics.ScalingFilterLevel.Value = cff.ScalingFilterLevel; + Graphics.VSyncMode.Value = cff.VSyncMode; + Graphics.EnableCustomVSyncInterval.Value = cff.EnableCustomVSyncInterval; + Graphics.CustomVSyncInterval.Value = cff.CustomVSyncInterval; + Graphics.EnableShaderCache.Value = cff.EnableShaderCache; + Graphics.EnableTextureRecompression.Value = cff.EnableTextureRecompression; + Graphics.EnableMacroHLE.Value = cff.EnableMacroHLE; + Graphics.EnableColorSpacePassthrough.Value = cff.EnableColorSpacePassthrough; + + System.Language.Value = cff.SystemLanguage; + System.Region.Value = cff.SystemRegion; + System.TimeZone.Value = cff.SystemTimeZone; + System.SystemTimeOffset.Value = shouldLoadFromFile ? cff.SystemTimeOffset : System.SystemTimeOffset.Value; // Get from global config only + System.MatchSystemTime.Value = shouldLoadFromFile ? cff.MatchSystemTime : System.MatchSystemTime.Value; // Get from global config only + System.UseInputGlobalConfig.Value = cff.UseInputGlobalConfig; + System.EnableDockedMode.Value = cff.DockedMode; + System.EnablePtc.Value = cff.EnablePtc; + System.EnableLowPowerPtc.Value = cff.EnableLowPowerPtc; + System.TickScalar.Value = cff.TickScalar; + System.EnableInternetAccess.Value = cff.EnableInternetAccess; + System.EnableFsIntegrityChecks.Value = cff.EnableFsIntegrityChecks; + System.FsGlobalAccessLogMode.Value = cff.FsGlobalAccessLogMode; + System.AudioBackend.Value = cff.AudioBackend; + System.AudioVolume.Value = cff.AudioVolume; + System.MemoryManagerMode.Value = cff.MemoryManagerMode; + System.DramSize.Value = cff.DramSize; + System.IgnoreMissingServices.Value = cff.IgnoreMissingServices; + System.IgnoreControllerApplet.Value = cff.IgnoreApplet; + System.SkipUserProfilesManager.Value = cff.SkipUserProfiles; + System.UseHypervisor.Value = cff.UseHypervisor; + + UI.GuiColumns.FavColumn.Value = shouldLoadFromFile ? cff.GuiColumns.FavColumn : UI.GuiColumns.FavColumn.Value; + UI.GuiColumns.IconColumn.Value = shouldLoadFromFile ? cff.GuiColumns.IconColumn : UI.GuiColumns.IconColumn.Value; + UI.GuiColumns.AppColumn.Value = shouldLoadFromFile ? cff.GuiColumns.AppColumn : UI.GuiColumns.AppColumn.Value; + UI.GuiColumns.DevColumn.Value = shouldLoadFromFile ? cff.GuiColumns.DevColumn : UI.GuiColumns.DevColumn.Value; + UI.GuiColumns.VersionColumn.Value = shouldLoadFromFile ? cff.GuiColumns.VersionColumn : UI.GuiColumns.VersionColumn.Value; + UI.GuiColumns.TimePlayedColumn.Value = shouldLoadFromFile ? cff.GuiColumns.TimePlayedColumn : UI.GuiColumns.TimePlayedColumn.Value; + UI.GuiColumns.LastPlayedColumn.Value = shouldLoadFromFile ? cff.GuiColumns.LastPlayedColumn : UI.GuiColumns.LastPlayedColumn.Value; + UI.GuiColumns.FileExtColumn.Value = shouldLoadFromFile ? cff.GuiColumns.FileExtColumn : UI.GuiColumns.FileExtColumn.Value; + UI.GuiColumns.FileSizeColumn.Value = shouldLoadFromFile ? cff.GuiColumns.FileSizeColumn : UI.GuiColumns.FileSizeColumn.Value; + UI.GuiColumns.PathColumn.Value = shouldLoadFromFile ? cff.GuiColumns.PathColumn : UI.GuiColumns.PathColumn.Value; + UI.ColumnSort.SortColumnId.Value = shouldLoadFromFile ? cff.ColumnSort.SortColumnId : UI.ColumnSort.SortColumnId.Value; + UI.ColumnSort.SortAscending.Value = shouldLoadFromFile ? cff.ColumnSort.SortAscending : UI.ColumnSort.SortAscending.Value; + UI.GameDirs.Value = shouldLoadFromFile ? cff.GameDirs : UI.GameDirs.Value; + UI.AutoloadDirs.Value = shouldLoadFromFile ? (cff.AutoloadDirs ?? []) : UI.AutoloadDirs.Value; + UI.ShownFileTypes.NSP.Value = shouldLoadFromFile ? cff.ShownFileTypes.NSP : UI.ShownFileTypes.NSP.Value; + UI.ShownFileTypes.PFS0.Value = shouldLoadFromFile ? cff.ShownFileTypes.PFS0 : UI.ShownFileTypes.PFS0.Value; + UI.ShownFileTypes.XCI.Value = shouldLoadFromFile ? cff.ShownFileTypes.XCI : UI.ShownFileTypes.XCI.Value; + UI.ShownFileTypes.NCA.Value = shouldLoadFromFile ? cff.ShownFileTypes.NCA : UI.ShownFileTypes.NCA.Value; + UI.ShownFileTypes.NRO.Value = shouldLoadFromFile ? cff.ShownFileTypes.NRO : UI.ShownFileTypes.NRO.Value; + UI.ShownFileTypes.NSO.Value = shouldLoadFromFile ? cff.ShownFileTypes.NSO : UI.ShownFileTypes.NSO.Value; + UI.LanguageCode.Value = shouldLoadFromFile ? cff.LanguageCode : UI.LanguageCode.Value; + UI.BaseStyle.Value = shouldLoadFromFile ? cff.BaseStyle : UI.BaseStyle.Value; + UI.GameListViewMode.Value = shouldLoadFromFile ? cff.GameListViewMode : UI.GameListViewMode.Value; + UI.ShowNames.Value = shouldLoadFromFile ? cff.ShowNames : UI.ShowNames.Value; + UI.IsAscendingOrder.Value = shouldLoadFromFile ? cff.IsAscendingOrder : UI.IsAscendingOrder.Value; + UI.GridSize.Value = shouldLoadFromFile ? cff.GridSize : UI.GridSize.Value; + UI.ApplicationSort.Value = shouldLoadFromFile ? cff.ApplicationSort : UI.ApplicationSort.Value; + UI.StartFullscreen.Value = shouldLoadFromFile ? cff.StartFullscreen : UI.StartFullscreen.Value; + UI.StartNoUI.Value = shouldLoadFromFile ? cff.StartNoUI : UI.StartNoUI.Value; + UI.ShowConsole.Value = shouldLoadFromFile ? cff.ShowConsole : UI.ShowConsole.Value; + UI.WindowStartup.WindowSizeWidth.Value = shouldLoadFromFile ? cff.WindowStartup.WindowSizeWidth : UI.WindowStartup.WindowSizeWidth.Value; + UI.WindowStartup.WindowSizeHeight.Value = shouldLoadFromFile ? cff.WindowStartup.WindowSizeHeight : UI.WindowStartup.WindowSizeHeight.Value; + UI.WindowStartup.WindowPositionX.Value = shouldLoadFromFile ? cff.WindowStartup.WindowPositionX : UI.WindowStartup.WindowPositionX.Value; + UI.WindowStartup.WindowPositionY.Value = shouldLoadFromFile ? cff.WindowStartup.WindowPositionY : UI.WindowStartup.WindowPositionY.Value; + UI.WindowStartup.WindowMaximized.Value = shouldLoadFromFile ? cff.WindowStartup.WindowMaximized : UI.WindowStartup.WindowMaximized.Value; + + Hid.EnableKeyboard.Value = cff.EnableKeyboard; + Hid.EnableMouse.Value = cff.EnableMouse; + Hid.DisableInputWhenOutOfFocus.Value = shouldLoadFromFile ? cff.DisableInputWhenOutOfFocus : Hid.DisableInputWhenOutOfFocus.Value; // Get from global config only + Hid.Hotkeys.Value = shouldLoadFromFile ? cff.Hotkeys : Hid.Hotkeys.Value; // Get from global config only + Hid.InputConfig.Value = cff.InputConfig ?? [] ; + Hid.RainbowSpeed.Value = cff.RainbowSpeed; + + Multiplayer.LanInterfaceId.Value = cff.MultiplayerLanInterfaceId; + Multiplayer.Mode.Value = cff.MultiplayerMode; + Multiplayer.DisableP2p.Value = cff.MultiplayerDisableP2p; + Multiplayer.LdnPassphrase.Value = cff.MultiplayerLdnPassphrase; + Multiplayer.LdnServer.Value = cff.LdnServer; + + { + Hacks.ShowDirtyHacks.Value = shouldLoadFromFile ? cff.ShowDirtyHacks : Hacks.ShowDirtyHacks.Value; // Get from global config only + + DirtyHacks hacks = new(cff.DirtyHacks ?? []); + + Hacks.Xc2MenuSoftlockFix.Value = hacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix); + + } + + if (configurationFileUpdated) + { + ToFileFormat().SaveConfig(configurationFilePath); + + RyuLogger.Notice.Print(LogClass.Application, $"Configuration file updated to version {ConfigurationFileFormat.CurrentVersion}"); + } + } + + private static readonly Dictionary> _migrations = + Collections.NewDictionary>( + (2, static cff => cff.SystemRegion = Region.USA), + (3, static cff => cff.SystemTimeZone = "UTC"), + (4, static cff => cff.MaxAnisotropy = -1), + (5, static cff => cff.SystemTimeOffset = 0), + (8, static cff => cff.EnablePtc = true), + (9, static cff => + { + cff.ColumnSort = new ColumnSort { SortColumnId = 0, SortAscending = false }; + cff.Hotkeys = new KeyboardHotkeys { ToggleVSyncMode = Key.F1 }; + } + ), + (10, static cff => cff.AudioBackend = AudioBackend.OpenAl), + (11, static cff => + { + cff.ResScale = 1; + cff.ResScaleCustom = 1.0f; + } + ), + (12, static cff => cff.LoggingGraphicsDebugLevel = GraphicsDebugLevel.None), + // 13 -> LDN1 + (14, static cff => cff.CheckUpdatesOnStart = true), + (16, static cff => cff.EnableShaderCache = true), + (17, static cff => cff.StartFullscreen = false), + (18, static cff => cff.AspectRatio = AspectRatio.Fixed16x9), + // 19 -> LDN2 + (20, static cff => cff.ShowConfirmExit = true), + (21, static cff => + { + // Initialize network config. + + cff.MultiplayerMode = MultiplayerMode.Disabled; + cff.MultiplayerLanInterfaceId = "0"; + } + ), + (22, static cff => cff.HideCursor = HideCursorMode.Never), + (24, static cff => + { + cff.InputConfig = + [ + new StandardKeyboardInputConfig + { + Version = InputConfig.CurrentVersion, + Backend = InputBackendType.WindowKeyboard, + Id = "0", + PlayerIndex = PlayerIndex.Player1, + ControllerType = ControllerType.ProController, + LeftJoycon = new LeftJoyconCommonConfig + { + DpadUp = Key.Up, + DpadDown = Key.Down, + DpadLeft = Key.Left, + DpadRight = Key.Right, + ButtonMinus = Key.Minus, + ButtonL = Key.E, + ButtonZl = Key.Q, + ButtonSl = Key.Unbound, + ButtonSr = Key.Unbound, + }, + LeftJoyconStick = new JoyconConfigKeyboardStick + { + StickUp = Key.W, + StickDown = Key.S, + StickLeft = Key.A, + StickRight = Key.D, + StickButton = Key.F, + }, + RightJoycon = new RightJoyconCommonConfig + { + ButtonA = Key.Z, + ButtonB = Key.X, + ButtonX = Key.C, + ButtonY = Key.V, + ButtonPlus = Key.Plus, + ButtonR = Key.U, + ButtonZr = Key.O, + ButtonSl = Key.Unbound, + ButtonSr = Key.Unbound, + }, + RightJoyconStick = new JoyconConfigKeyboardStick + { + StickUp = Key.I, + StickDown = Key.K, + StickLeft = Key.J, + StickRight = Key.L, + StickButton = Key.H, + }, + } + ]; + } + ), + (26, static cff => cff.MemoryManagerMode = MemoryManagerMode.HostMappedUnsafe), + (27, static cff => cff.EnableMouse = false), + (29, + static cff => + cff.Hotkeys = new KeyboardHotkeys + { + ToggleVSyncMode = Key.F1, + Screenshot = Key.F8, + ShowUI = Key.F4 + }), + (30, static cff => + { + foreach (StandardControllerInputConfig config in cff.InputConfig.OfType()) + { + config.Rumble = new RumbleConfigController + { + EnableRumble = false, + StrongRumble = 1f, + WeakRumble = 1f, + }; + } + } + ), + (31, static cff => cff.BackendThreading = BackendThreading.Auto), + (32, static cff => cff.Hotkeys = new KeyboardHotkeys + { + ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode, + Screenshot = cff.Hotkeys.Screenshot, + ShowUI = cff.Hotkeys.ShowUI, + Pause = Key.F5, + }), + (33, static cff => + { + cff.Hotkeys = new KeyboardHotkeys + { + ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode, + Screenshot = cff.Hotkeys.Screenshot, + ShowUI = cff.Hotkeys.ShowUI, + Pause = cff.Hotkeys.Pause, + ToggleMute = Key.F2, + }; + + cff.AudioVolume = 1; + } + ), + (34, static cff => cff.EnableInternetAccess = false), + (35, static cff => + { + foreach (StandardControllerInputConfig config in cff.InputConfig + .OfType()) + { + config.RangeLeft = 1.0f; + config.RangeRight = 1.0f; + } + } + ), + + (36, static cff => cff.LoggingEnableTrace = false), + (37, static cff => cff.ShowConsole = true), + (38, static cff => + { + cff.BaseStyle = "Dark"; + cff.GameListViewMode = 0; + cff.ShowNames = true; + cff.GridSize = 2; + cff.LanguageCode = "en_US"; + } + ), + (39, + static cff => cff.Hotkeys = new KeyboardHotkeys + { + ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode, + Screenshot = cff.Hotkeys.Screenshot, + ShowUI = cff.Hotkeys.ShowUI, + Pause = cff.Hotkeys.Pause, + ToggleMute = cff.Hotkeys.ToggleMute, + ResScaleUp = Key.Unbound, + ResScaleDown = Key.Unbound + }), + (40, static cff => cff.GraphicsBackend = GraphicsBackend.OpenGl), + (41, + static cff => cff.Hotkeys = new KeyboardHotkeys + { + ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode, + Screenshot = cff.Hotkeys.Screenshot, + ShowUI = cff.Hotkeys.ShowUI, + Pause = cff.Hotkeys.Pause, + ToggleMute = cff.Hotkeys.ToggleMute, + ResScaleUp = cff.Hotkeys.ResScaleUp, + ResScaleDown = cff.Hotkeys.ResScaleDown, + VolumeUp = Key.Unbound, + VolumeDown = Key.Unbound + }), + (42, static cff => cff.EnableMacroHLE = true), + (43, static cff => cff.UseHypervisor = true), + (44, static cff => + { + cff.AntiAliasing = AntiAliasing.None; + cff.ScalingFilter = ScalingFilter.Bilinear; + cff.ScalingFilterLevel = 80; + } + ), + (45, + static cff => cff.ShownFileTypes = new ShownFileTypes + { + NSP = true, + PFS0 = true, + XCI = true, + NCA = true, + NRO = true, + NSO = true + }), + (46, static cff => cff.UseHypervisor = OperatingSystem.IsMacOS()), + (47, + static cff => cff.WindowStartup = new WindowStartup + { + WindowPositionX = 0, + WindowPositionY = 0, + WindowSizeHeight = 760, + WindowSizeWidth = 1280, + WindowMaximized = false + }), + (48, static cff => cff.EnableColorSpacePassthrough = false), + (49, static _ => + { + if (OperatingSystem.IsMacOS()) + { + AppDataManager.FixMacOSConfigurationFolders(); + } + } + ), + (50, static cff => cff.EnableHardwareAcceleration = true), + (51, static cff => cff.RememberWindowState = true), + (52, static cff => cff.AutoloadDirs = []), + (53, static cff => cff.EnableLowPowerPtc = false), + (54, static cff => cff.DramSize = MemoryConfiguration.MemoryConfiguration4GiB), + (55, static cff => cff.IgnoreApplet = false), + (56, static cff => cff.ShowTitleBar = !OperatingSystem.IsWindows()), + (57, static cff => + { + cff.VSyncMode = VSyncMode.Switch; + cff.EnableCustomVSyncInterval = false; + + cff.Hotkeys = new KeyboardHotkeys + { + ToggleVSyncMode = Key.F1, + Screenshot = cff.Hotkeys.Screenshot, + ShowUI = cff.Hotkeys.ShowUI, + Pause = cff.Hotkeys.Pause, + ToggleMute = cff.Hotkeys.ToggleMute, + ResScaleUp = cff.Hotkeys.ResScaleUp, + ResScaleDown = cff.Hotkeys.ResScaleDown, + VolumeUp = cff.Hotkeys.VolumeUp, + VolumeDown = cff.Hotkeys.VolumeDown, + CustomVSyncIntervalIncrement = Key.Unbound, + CustomVSyncIntervalDecrement = Key.Unbound, + }; + + cff.CustomVSyncInterval = 120; + } + ), + // 58 migration accidentally got skipped, but it worked with no issues somehow lol + (59, static cff => + { + cff.ShowDirtyHacks = false; + cff.DirtyHacks = []; + + // This was accidentally enabled by default when it was PRed. That is not what we want, + // so as a compromise users who want to use it will simply need to re-enable it once after updating. + cff.IgnoreApplet = false; + } + ), + (60, static cff => cff.StartNoUI = false), + (61, static cff => + { + foreach (StandardControllerInputConfig config in cff.InputConfig.OfType()) + { + config.Led = new LedConfigController + { + EnableLed = false, + TurnOffLed = false, + UseRainbow = false, + LedColor = new Color(255, 5, 1, 253).ToUInt32() + }; + } + } + ), + (62, static cff => cff.RainbowSpeed = 1f), + (63, static cff => cff.MatchSystemTime = false), + (64, static cff => cff.LoggingEnableAvalonia = false), + (65, static cff => cff.UpdateCheckerType = cff.CheckUpdatesOnStart ? UpdaterType.PromptAtStartup : UpdaterType.Off), + (66, static cff => cff.DisableInputWhenOutOfFocus = false), + (67, static cff => cff.FocusLostActionType = cff.DisableInputWhenOutOfFocus ? FocusLostType.BlockInput : FocusLostType.DoNothing), + (68, static cff => + { + cff.TickScalar = 200; + cff.Hotkeys = new KeyboardHotkeys + { + ToggleVSyncMode = cff.Hotkeys.ToggleVSyncMode, + Screenshot = cff.Hotkeys.Screenshot, + ShowUI = cff.Hotkeys.ShowUI, + Pause = cff.Hotkeys.Pause, + ToggleMute = cff.Hotkeys.ToggleMute, + ResScaleUp = cff.Hotkeys.ResScaleUp, + ResScaleDown = cff.Hotkeys.ResScaleDown, + VolumeUp = cff.Hotkeys.VolumeUp, + VolumeDown = cff.Hotkeys.VolumeDown, + CustomVSyncIntervalIncrement = cff.Hotkeys.CustomVSyncIntervalIncrement, + CustomVSyncIntervalDecrement = cff.Hotkeys.CustomVSyncIntervalDecrement, + TurboMode = Key.Unbound, + TurboModeWhileHeld = false + }; + } + ), + (69, static cff => cff.SkipUserProfiles = false) + ); + } +} diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Model.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs similarity index 77% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationState.Model.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs index f28ce0348..29a390b26 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.Model.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs @@ -1,19 +1,25 @@ using ARMeilleure; +using Gommon; +using LibHac.Tools.FsSystem; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Multiplayer; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; +using Ryujinx.Common.Utilities; using Ryujinx.HLE; -using Ryujinx.UI.Common.Configuration.System; -using Ryujinx.UI.Common.Helper; using System.Collections.Generic; +using System.Linq; +using RyuLogger = Ryujinx.Common.Logging.Logger; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Systems.Configuration { public partial class ConfigurationState { - /// + /// /// UI configuration section /// public class UISection @@ -149,6 +155,11 @@ namespace Ryujinx.UI.Common.Configuration /// public ReactiveObject StartFullscreen { get; private set; } + /// + /// Start games with UI hidden + /// + public ReactiveObject StartNoUI { get; private set; } + /// /// Hide / Show Console Window /// @@ -189,6 +200,7 @@ namespace Ryujinx.UI.Common.Configuration WindowStartup = new WindowStartupSettings(); BaseStyle = new ReactiveObject(); StartFullscreen = new ReactiveObject(); + StartNoUI = new ReactiveObject(); GameListViewMode = new ReactiveObject(); ShowNames = new ReactiveObject(); GridSize = new ReactiveObject(); @@ -245,6 +257,11 @@ namespace Ryujinx.UI.Common.Configuration /// public ReactiveObject EnableFsAccessLog { get; private set; } + /// + /// Enables log messages from Avalonia + /// + public ReactiveObject EnableAvaloniaLog { get; private set; } + /// /// Controls which log messages are written to the log targets /// @@ -271,6 +288,7 @@ namespace Ryujinx.UI.Common.Configuration EnableTrace = new ReactiveObject(); EnableGuest = new ReactiveObject(); EnableFsAccessLog = new ReactiveObject(); + EnableAvaloniaLog = new ReactiveObject(); FilteredClasses = new ReactiveObject(); EnableFileLog = new ReactiveObject(); EnableFileLog.LogChangesToValue(nameof(EnableFileLog)); @@ -303,6 +321,17 @@ namespace Ryujinx.UI.Common.Configuration /// public ReactiveObject SystemTimeOffset { get; private set; } + /// + /// Instead of setting the time via configuration, use the values provided by the system. + /// + public ReactiveObject MatchSystemTime { get; private set; } + + + /// + /// Enable or disable use global input config (Independent from controllers binding) + /// + public ReactiveObject UseInputGlobalConfig { get; private set; } + /// /// Enables or disables Docked Mode /// @@ -313,6 +342,11 @@ namespace Ryujinx.UI.Common.Configuration /// public ReactiveObject EnablePtc { get; private set; } + /// + /// Clock tick scalar, in percent points (100 = 1.0). + /// + public ReactiveObject TickScalar { get; set; } + /// /// Enables or disables low-power persistent profiled translation cache loading /// @@ -328,6 +362,10 @@ namespace Ryujinx.UI.Common.Configuration /// public ReactiveObject EnableFsIntegrityChecks { get; private set; } + public IntegrityCheckLevel IntegrityCheckLevel => EnableFsIntegrityChecks + ? IntegrityCheckLevel.ErrorOnInvalid + : IntegrityCheckLevel.None; + /// /// Enables FS access log output to the console. Possible modes are 0-3 /// @@ -358,6 +396,16 @@ namespace Ryujinx.UI.Common.Configuration /// public ReactiveObject IgnoreMissingServices { get; private set; } + /// + /// Ignore Controller Applet + /// + public ReactiveObject IgnoreControllerApplet { get; private set; } + + /// + /// Skip User Profiles Manager + /// + public ReactiveObject SkipUserProfilesManager { get; private set; } + /// /// Uses Hypervisor over JIT if available /// @@ -373,14 +421,27 @@ namespace Ryujinx.UI.Common.Configuration TimeZone.LogChangesToValue(nameof(TimeZone)); SystemTimeOffset = new ReactiveObject(); SystemTimeOffset.LogChangesToValue(nameof(SystemTimeOffset)); + MatchSystemTime = new ReactiveObject(); + MatchSystemTime.LogChangesToValue(nameof(MatchSystemTime)); + UseInputGlobalConfig = new ReactiveObject(); + UseInputGlobalConfig.LogChangesToValue(nameof(UseInputGlobalConfig)); EnableDockedMode = new ReactiveObject(); EnableDockedMode.LogChangesToValue(nameof(EnableDockedMode)); EnablePtc = new ReactiveObject(); EnablePtc.LogChangesToValue(nameof(EnablePtc)); EnableLowPowerPtc = new ReactiveObject(); EnableLowPowerPtc.LogChangesToValue(nameof(EnableLowPowerPtc)); - EnableLowPowerPtc.Event += (_, evnt) + EnableLowPowerPtc.Event += (_, evnt) => Optimizations.LowPower = evnt.NewValue; + TickScalar = new ReactiveObject(); + TickScalar.LogChangesToValue(nameof(TickScalar)); + TickScalar.Event += (_, evnt) => + { + if (Switch.Shared is null) + return; + + Switch.Shared.Configuration.TickScalar = evnt.NewValue; + }; EnableInternetAccess = new ReactiveObject(); EnableInternetAccess.LogChangesToValue(nameof(EnableInternetAccess)); EnableFsIntegrityChecks = new ReactiveObject(); @@ -395,6 +456,10 @@ namespace Ryujinx.UI.Common.Configuration DramSize.LogChangesToValue(nameof(DramSize)); IgnoreMissingServices = new ReactiveObject(); IgnoreMissingServices.LogChangesToValue(nameof(IgnoreMissingServices)); + IgnoreControllerApplet = new ReactiveObject(); + IgnoreControllerApplet.LogChangesToValue(nameof(IgnoreControllerApplet)); + SkipUserProfilesManager = new ReactiveObject(); + SkipUserProfilesManager.LogChangesToValue(nameof(SkipUserProfilesManager)); AudioVolume = new ReactiveObject(); AudioVolume.LogChangesToValue(nameof(AudioVolume)); UseHypervisor = new ReactiveObject(); @@ -417,6 +482,11 @@ namespace Ryujinx.UI.Common.Configuration /// public ReactiveObject EnableMouse { get; private set; } + /// + /// Enable/disable the ability to control Ryujinx when it's not the currently focused window. + /// + public ReactiveObject DisableInputWhenOutOfFocus { get; private set; } + /// /// Hotkey Keyboard Bindings /// @@ -429,12 +499,20 @@ namespace Ryujinx.UI.Common.Configuration /// public ReactiveObject> InputConfig { get; private set; } + /// + /// The speed of spectrum cycling for the Rainbow LED feature. + /// + public ReactiveObject RainbowSpeed { get; } + public HidSection() { EnableKeyboard = new ReactiveObject(); EnableMouse = new ReactiveObject(); + DisableInputWhenOutOfFocus = new ReactiveObject(); Hotkeys = new ReactiveObject(); InputConfig = new ReactiveObject>(); + RainbowSpeed = new ReactiveObject(); + RainbowSpeed.Event += (_, args) => Rainbow.Speed = args.NewValue; } } @@ -603,6 +681,14 @@ namespace Ryujinx.UI.Common.Configuration /// public ReactiveObject LdnServer { get; private set; } + public string GetLdnServer() + { + string ldnServer = LdnServer; + return string.IsNullOrEmpty(ldnServer) + ? SharedConstants.DefaultLanPlayHost + : ldnServer; + } + public MultiplayerSection() { LanInterfaceId = new ReactiveObject(); @@ -617,11 +703,74 @@ namespace Ryujinx.UI.Common.Configuration } } + public class HacksSection + { + /// + /// Show toggles for dirty hacks in the UI. + /// + public ReactiveObject ShowDirtyHacks { get; private set; } + + public ReactiveObject Xc2MenuSoftlockFix { get; private set; } + + public ReactiveObject DisableNifmIsAnyInternetRequestAccepted { get; private set; } + + public HacksSection() + { + ShowDirtyHacks = new ReactiveObject(); + Xc2MenuSoftlockFix = new ReactiveObject(); + Xc2MenuSoftlockFix.Event += HackChanged; + DisableNifmIsAnyInternetRequestAccepted = new ReactiveObject(); + DisableNifmIsAnyInternetRequestAccepted.Event += HackChanged; + } + + private void HackChanged(object sender, ReactiveEventArgs rxe) + { + if (!ShowDirtyHacks) + return; + + string newHacks = EnabledHacks.Select(x => x.Hack) + .JoinToString(", "); + + if (newHacks != _lastHackCollection) + { + RyuLogger.Info?.Print(LogClass.Configuration, + $"EnabledDirtyHacks set to: [{newHacks}]", "LogValueChange"); + + _lastHackCollection = newHacks; + } + } + + private static string _lastHackCollection; + + public EnabledDirtyHack[] EnabledHacks + { + get + { + List enabledHacks = []; + + if (Xc2MenuSoftlockFix) + Apply(DirtyHack.Xc2MenuSoftlockFix); + + if (DisableNifmIsAnyInternetRequestAccepted) + Apply(DirtyHack.NifmServiceDisableIsAnyInternetRequestAccepted); + + return enabledHacks.ToArray(); + + void Apply(DirtyHack hack, int value = 0) + { + enabledHacks.Add(new EnabledDirtyHack(hack, value)); + } + } + } + } + /// /// The default configuration instance /// public static ConfigurationState Instance { get; private set; } + public static ConfigurationState InstanceExtra{ get; private set; } + /// /// The UI section /// @@ -652,35 +801,40 @@ namespace Ryujinx.UI.Common.Configuration /// public MultiplayerSection Multiplayer { get; private set; } + /// + /// The Dirty Hacks section + /// + public HacksSection Hacks { get; private set; } + /// /// Enables or disables Discord Rich Presence /// public ReactiveObject EnableDiscordIntegration { get; private set; } /// - /// Checks for updates when Ryujinx starts when enabled + /// Checks for updates when Ryujinx starts when enabled, either prompting when an update is found or just showing a notification. /// - public ReactiveObject CheckUpdatesOnStart { get; private set; } + public ReactiveObject UpdateCheckerType { get; private set; } + + /// + /// How the emulator should behave when you click off/on the window. + /// + public ReactiveObject FocusLostActionType { get; private set; } /// /// Show "Confirm Exit" Dialog /// public ReactiveObject ShowConfirmExit { get; private set; } - /// - /// Ignore Applet - /// - public ReactiveObject IgnoreApplet { get; private set; } - /// /// Enables or disables save window size, position and state on close. /// public ReactiveObject RememberWindowState { get; private set; } /// - /// Enables or disables the redesigned title bar + /// Disable the new title bar layout & window layout changes. /// - public ReactiveObject ShowTitleBar { get; private set; } + public ReactiveObject ShowOldUI { get; private set; } /// /// Enables hardware-accelerated rendering for Avalonia @@ -700,15 +854,46 @@ namespace Ryujinx.UI.Common.Configuration Graphics = new GraphicsSection(); Hid = new HidSection(); Multiplayer = new MultiplayerSection(); - EnableDiscordIntegration = new ReactiveObject(); - CheckUpdatesOnStart = new ReactiveObject(); - ShowConfirmExit = new ReactiveObject(); - IgnoreApplet = new ReactiveObject(); - IgnoreApplet.LogChangesToValue(nameof(IgnoreApplet)); - RememberWindowState = new ReactiveObject(); - ShowTitleBar = new ReactiveObject(); - EnableHardwareAcceleration = new ReactiveObject(); + Hacks = new HacksSection(); + UpdateCheckerType = new ReactiveObject(); + FocusLostActionType = new ReactiveObject(); HideCursor = new ReactiveObject(); + EnableDiscordIntegration = new ReactiveObject(); + ShowConfirmExit = new ReactiveObject(); + RememberWindowState = new ReactiveObject(); + ShowOldUI = new ReactiveObject(); + EnableHardwareAcceleration = new ReactiveObject(); } + + public HleConfiguration CreateHleConfiguration() => + new( + System.DramSize, + System.Language.Value.ToHLE(), + System.Region.Value.ToHLE(), + Graphics.VSyncMode, + System.EnableDockedMode, + System.EnablePtc, + System.TickScalar, + System.EnableInternetAccess, + System.EnableFsIntegrityChecks + ? IntegrityCheckLevel.ErrorOnInvalid + : IntegrityCheckLevel.None, + System.FsGlobalAccessLogMode, + System.MatchSystemTime + ? 0 + : System.SystemTimeOffset, + System.TimeZone, + System.MemoryManagerMode, + System.IgnoreMissingServices, + Graphics.AspectRatio, + System.AudioVolume, + System.UseHypervisor, + Multiplayer.LanInterfaceId, + Multiplayer.Mode, + Multiplayer.DisableP2p, + Multiplayer.LdnPassphrase, + Multiplayer.GetLdnServer(), + Graphics.CustomVSyncInterval, + Hacks.ShowDirtyHacks ? Hacks.EnabledHacks : null); } } diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.cs similarity index 87% rename from src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationState.cs index badb047df..4a565d5d3 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.cs @@ -1,30 +1,28 @@ -using ARMeilleure; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; -using Ryujinx.Common.Configuration.Hid.Controller; using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Configuration.Multiplayer; -using Ryujinx.Common.Logging; using Ryujinx.Graphics.Vulkan; using Ryujinx.HLE; -using Ryujinx.UI.Common.Configuration.System; -using Ryujinx.UI.Common.Configuration.UI; using System; -using System.Collections.Generic; +using System.Linq; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Systems.Configuration { public partial class ConfigurationState { public static void Initialize() { - if (Instance != null) + if (Instance != null || InstanceExtra!= null) { throw new InvalidOperationException("Configuration is already initialized"); - } + } Instance = new ConfigurationState(); - } + InstanceExtra= new ConfigurationState(); + } public ConfigurationFileFormat ToFileFormat() { @@ -49,19 +47,22 @@ namespace Ryujinx.UI.Common.Configuration LoggingEnableTrace = Logger.EnableTrace, LoggingEnableGuest = Logger.EnableGuest, LoggingEnableFsAccessLog = Logger.EnableFsAccessLog, + LoggingEnableAvalonia = Logger.EnableAvaloniaLog, LoggingFilteredClasses = Logger.FilteredClasses, LoggingGraphicsDebugLevel = Logger.GraphicsDebugLevel, SystemLanguage = System.Language, SystemRegion = System.Region, SystemTimeZone = System.TimeZone, SystemTimeOffset = System.SystemTimeOffset, + MatchSystemTime = System.MatchSystemTime, + UseInputGlobalConfig = System.UseInputGlobalConfig, DockedMode = System.EnableDockedMode, EnableDiscordIntegration = EnableDiscordIntegration, - CheckUpdatesOnStart = CheckUpdatesOnStart, + UpdateCheckerType = UpdateCheckerType, + FocusLostActionType = FocusLostActionType, ShowConfirmExit = ShowConfirmExit, - IgnoreApplet = IgnoreApplet, RememberWindowState = RememberWindowState, - ShowTitleBar = ShowTitleBar, + ShowTitleBar = ShowOldUI, EnableHardwareAcceleration = EnableHardwareAcceleration, HideCursor = HideCursor, VSyncMode = Graphics.VSyncMode, @@ -73,6 +74,7 @@ namespace Ryujinx.UI.Common.Configuration EnableColorSpacePassthrough = Graphics.EnableColorSpacePassthrough, EnablePtc = System.EnablePtc, EnableLowPowerPtc = System.EnableLowPowerPtc, + TickScalar = System.TickScalar, EnableInternetAccess = System.EnableInternetAccess, EnableFsIntegrityChecks = System.EnableFsIntegrityChecks, FsGlobalAccessLogMode = System.FsGlobalAccessLogMode, @@ -81,6 +83,8 @@ namespace Ryujinx.UI.Common.Configuration MemoryManagerMode = System.MemoryManagerMode, DramSize = System.DramSize, IgnoreMissingServices = System.IgnoreMissingServices, + IgnoreApplet = System.IgnoreControllerApplet, + SkipUserProfiles = System.SkipUserProfilesManager, UseHypervisor = System.UseHypervisor, GuiColumns = new GuiColumns { @@ -128,13 +132,14 @@ namespace Ryujinx.UI.Common.Configuration ApplicationSort = UI.ApplicationSort, IsAscendingOrder = UI.IsAscendingOrder, StartFullscreen = UI.StartFullscreen, + StartNoUI = UI.StartNoUI, ShowConsole = UI.ShowConsole, EnableKeyboard = Hid.EnableKeyboard, EnableMouse = Hid.EnableMouse, + DisableInputWhenOutOfFocus = Hid.DisableInputWhenOutOfFocus, Hotkeys = Hid.Hotkeys, - KeyboardConfig = [], - ControllerConfig = [], InputConfig = Hid.InputConfig, + RainbowSpeed = Hid.RainbowSpeed, GraphicsBackend = Graphics.GraphicsBackend, PreferredGpu = Graphics.PreferredGpu, MultiplayerLanInterfaceId = Multiplayer.LanInterfaceId, @@ -142,6 +147,8 @@ namespace Ryujinx.UI.Common.Configuration MultiplayerDisableP2p = Multiplayer.DisableP2p, MultiplayerLdnPassphrase = Multiplayer.LdnPassphrase, LdnServer = Multiplayer.LdnServer, + ShowDirtyHacks = Hacks.ShowDirtyHacks, + DirtyHacks = Hacks.EnabledHacks.Select(it => it.Pack()).ToArray(), }; return configurationFile; @@ -166,19 +173,21 @@ namespace Ryujinx.UI.Common.Configuration Logger.EnableTrace.Value = false; Logger.EnableGuest.Value = true; Logger.EnableFsAccessLog.Value = false; + Logger.EnableAvaloniaLog.Value = false; Logger.FilteredClasses.Value = []; Logger.GraphicsDebugLevel.Value = GraphicsDebugLevel.None; System.Language.Value = Language.AmericanEnglish; System.Region.Value = Region.USA; System.TimeZone.Value = "UTC"; System.SystemTimeOffset.Value = 0; + System.UseInputGlobalConfig.Value = false; System.EnableDockedMode.Value = true; EnableDiscordIntegration.Value = true; - CheckUpdatesOnStart.Value = true; + UpdateCheckerType.Value = UpdaterType.PromptAtStartup; + FocusLostActionType.Value = FocusLostType.DoNothing; ShowConfirmExit.Value = true; - IgnoreApplet.Value = false; RememberWindowState.Value = true; - ShowTitleBar.Value = !OperatingSystem.IsWindows(); + ShowOldUI.Value = !OperatingSystem.IsWindows(); EnableHardwareAcceleration.Value = true; HideCursor.Value = HideCursorMode.OnIdle; Graphics.VSyncMode.Value = VSyncMode.Switch; @@ -200,12 +209,14 @@ namespace Ryujinx.UI.Common.Configuration System.MemoryManagerMode.Value = MemoryManagerMode.HostMappedUnsafe; System.DramSize.Value = MemoryConfiguration.MemoryConfiguration4GiB; System.IgnoreMissingServices.Value = false; + System.IgnoreControllerApplet.Value = false; + System.SkipUserProfilesManager.Value = false; System.UseHypervisor.Value = true; Multiplayer.LanInterfaceId.Value = "0"; Multiplayer.Mode.Value = MultiplayerMode.Disabled; Multiplayer.DisableP2p.Value = false; - Multiplayer.LdnPassphrase.Value = ""; - Multiplayer.LdnServer.Value = ""; + Multiplayer.LdnPassphrase.Value = string.Empty; + Multiplayer.LdnServer.Value = string.Empty; UI.GuiColumns.FavColumn.Value = true; UI.GuiColumns.IconColumn.Value = true; UI.GuiColumns.AppColumn.Value = true; @@ -234,6 +245,7 @@ namespace Ryujinx.UI.Common.Configuration UI.ApplicationSort.Value = 0; UI.IsAscendingOrder.Value = true; UI.StartFullscreen.Value = false; + UI.StartNoUI.Value = false; UI.ShowConsole.Value = true; UI.WindowStartup.WindowSizeWidth.Value = 1280; UI.WindowStartup.WindowSizeHeight.Value = 760; @@ -242,6 +254,7 @@ namespace Ryujinx.UI.Common.Configuration UI.WindowStartup.WindowMaximized.Value = false; Hid.EnableKeyboard.Value = false; Hid.EnableMouse.Value = false; + Hid.DisableInputWhenOutOfFocus.Value = false; Hid.Hotkeys.Value = new KeyboardHotkeys { ToggleVSyncMode = Key.F1, @@ -253,7 +266,12 @@ namespace Ryujinx.UI.Common.Configuration ResScaleDown = Key.Unbound, VolumeUp = Key.Unbound, VolumeDown = Key.Unbound, + CustomVSyncIntervalIncrement = Key.Unbound, + CustomVSyncIntervalDecrement = Key.Unbound, + TurboMode = Key.Unbound, + TurboModeWhileHeld = false }; + Hid.RainbowSpeed.Value = 1f; Hid.InputConfig.Value = [ new StandardKeyboardInputConfig @@ -261,6 +279,7 @@ namespace Ryujinx.UI.Common.Configuration Version = InputConfig.CurrentVersion, Backend = InputBackendType.WindowKeyboard, Id = "0", + Name = "Keyboard", PlayerIndex = PlayerIndex.Player1, ControllerType = ControllerType.ProController, LeftJoycon = new LeftJoyconCommonConfig @@ -318,5 +337,5 @@ namespace Ryujinx.UI.Common.Configuration return GraphicsBackend.OpenGl; } - } - } + } +} diff --git a/src/Ryujinx.UI.Common/Extensions/FileTypeExtensions.cs b/src/Ryujinx/Systems/Configuration/FileTypes.cs similarity index 73% rename from src/Ryujinx.UI.Common/Extensions/FileTypeExtensions.cs rename to src/Ryujinx/Systems/Configuration/FileTypes.cs index 7e71ba7a4..92c6550f4 100644 --- a/src/Ryujinx.UI.Common/Extensions/FileTypeExtensions.cs +++ b/src/Ryujinx/Systems/Configuration/FileTypes.cs @@ -1,8 +1,19 @@ using System; -using static Ryujinx.UI.Common.Configuration.ConfigurationState.UISection; -namespace Ryujinx.UI.Common +using static Ryujinx.Ava.Systems.Configuration.ConfigurationState.UISection; + +namespace Ryujinx.Ava.Systems.Configuration { + public enum FileTypes + { + NSP, + PFS0, + XCI, + NCA, + NRO, + NSO + } + public static class FileTypesExtensions { /// @@ -10,7 +21,7 @@ namespace Ryujinx.UI.Common /// /// The name of the parameter to get the value of. /// The config instance to get the value from. - /// The current value of the setting. Value is if the file type is the be shown on the games list, otherwise. + /// The current value of the setting. Value is if the file type is to be shown on the games list, otherwise. public static bool GetConfigValue(this FileTypes type, ShownFileTypeSettings config) => type switch { FileTypes.NSP => config.NSP.Value, diff --git a/src/Ryujinx.UI.Common/Configuration/LoggerModule.cs b/src/Ryujinx/Systems/Configuration/LoggerModule.cs similarity index 93% rename from src/Ryujinx.UI.Common/Configuration/LoggerModule.cs rename to src/Ryujinx/Systems/Configuration/LoggerModule.cs index a7913f142..e3d08ab8c 100644 --- a/src/Ryujinx.UI.Common/Configuration/LoggerModule.cs +++ b/src/Ryujinx/Systems/Configuration/LoggerModule.cs @@ -4,39 +4,39 @@ using Ryujinx.Common.Logging.Targets; using System; using System.IO; -namespace Ryujinx.UI.Common.Configuration +namespace Ryujinx.Ava.Systems.Configuration { public static class LoggerModule { public static void Initialize() { - ConfigurationState.Instance.Logger.EnableDebug.Event += + ConfigurationState.Instance.Logger.EnableDebug.Event += (_, e) => Logger.SetEnable(LogLevel.Debug, e.NewValue); - ConfigurationState.Instance.Logger.EnableStub.Event += + ConfigurationState.Instance.Logger.EnableStub.Event += (_, e) => Logger.SetEnable(LogLevel.Stub, e.NewValue); - ConfigurationState.Instance.Logger.EnableInfo.Event += + ConfigurationState.Instance.Logger.EnableInfo.Event += (_, e) => Logger.SetEnable(LogLevel.Info, e.NewValue); - ConfigurationState.Instance.Logger.EnableWarn.Event += + ConfigurationState.Instance.Logger.EnableWarn.Event += (_, e) => Logger.SetEnable(LogLevel.Warning, e.NewValue); - ConfigurationState.Instance.Logger.EnableError.Event += + ConfigurationState.Instance.Logger.EnableError.Event += (_, e) => Logger.SetEnable(LogLevel.Error, e.NewValue); - ConfigurationState.Instance.Logger.EnableTrace.Event += + ConfigurationState.Instance.Logger.EnableTrace.Event += (_, e) => Logger.SetEnable(LogLevel.Trace, e.NewValue); - ConfigurationState.Instance.Logger.EnableGuest.Event += + ConfigurationState.Instance.Logger.EnableGuest.Event += (_, e) => Logger.SetEnable(LogLevel.Guest, e.NewValue); ConfigurationState.Instance.Logger.EnableFsAccessLog.Event += (_, e) => Logger.SetEnable(LogLevel.AccessLog, e.NewValue); - + ConfigurationState.Instance.Logger.FilteredClasses.Event += (_, e) => { bool noFilter = e.NewValue.Length == 0; - foreach (var logClass in Enum.GetValues()) + foreach (LogClass logClass in Enum.GetValues()) { Logger.SetEnable(logClass, noFilter); } - foreach (var logClass in e.NewValue) + foreach (LogClass logClass in e.NewValue) { Logger.SetEnable(logClass, true); } diff --git a/src/Ryujinx.UI.Common/Configuration/System/Language.cs b/src/Ryujinx/Systems/Configuration/System/Language.cs similarity index 58% rename from src/Ryujinx.UI.Common/Configuration/System/Language.cs rename to src/Ryujinx/Systems/Configuration/System/Language.cs index d1d395b00..ff1476b73 100644 --- a/src/Ryujinx.UI.Common/Configuration/System/Language.cs +++ b/src/Ryujinx/Systems/Configuration/System/Language.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Utilities; using System.Text.Json.Serialization; -namespace Ryujinx.UI.Common.Configuration.System +namespace Ryujinx.Ava.Systems.Configuration.System { [JsonConverter(typeof(TypedStringEnumConverter))] public enum Language @@ -25,4 +25,13 @@ namespace Ryujinx.UI.Common.Configuration.System TraditionalChinese, BrazilianPortuguese, } + + public static class LanguageEnumHelper + { + public static Language ToUI(this HLE.HOS.SystemState.SystemLanguage hleLanguage) + => (Language)hleLanguage; + + public static HLE.HOS.SystemState.SystemLanguage ToHLE(this Language uiLanguage) + => (HLE.HOS.SystemState.SystemLanguage)uiLanguage; + } } diff --git a/src/Ryujinx/Systems/Configuration/System/Region.cs b/src/Ryujinx/Systems/Configuration/System/Region.cs new file mode 100644 index 000000000..0c86093cc --- /dev/null +++ b/src/Ryujinx/Systems/Configuration/System/Region.cs @@ -0,0 +1,26 @@ +using Ryujinx.Common.Utilities; +using System.Text.Json.Serialization; + +namespace Ryujinx.Ava.Systems.Configuration.System +{ + [JsonConverter(typeof(TypedStringEnumConverter))] + public enum Region + { + Japan, + USA, + Europe, + Australia, + China, + Korea, + Taiwan, + } + + public static class RegionEnumHelper + { + public static Region ToUI(this HLE.HOS.SystemState.RegionCode hleRegion) + => (Region)hleRegion; + + public static HLE.HOS.SystemState.RegionCode ToHLE(this Region uiRegion) + => (HLE.HOS.SystemState.RegionCode)uiRegion; + } +} diff --git a/src/Ryujinx.UI.Common/Configuration/UI/ColumnSort.cs b/src/Ryujinx/Systems/Configuration/UI/ColumnSort.cs similarity index 74% rename from src/Ryujinx.UI.Common/Configuration/UI/ColumnSort.cs rename to src/Ryujinx/Systems/Configuration/UI/ColumnSort.cs index 44e98c407..e5f54c799 100644 --- a/src/Ryujinx.UI.Common/Configuration/UI/ColumnSort.cs +++ b/src/Ryujinx/Systems/Configuration/UI/ColumnSort.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Configuration.UI +namespace Ryujinx.Ava.Systems.Configuration.UI { public struct ColumnSort { diff --git a/src/Ryujinx/Systems/Configuration/UI/FocusLostType.cs b/src/Ryujinx/Systems/Configuration/UI/FocusLostType.cs new file mode 100644 index 000000000..9e22f3dca --- /dev/null +++ b/src/Ryujinx/Systems/Configuration/UI/FocusLostType.cs @@ -0,0 +1,15 @@ +using Ryujinx.Common.Utilities; +using System.Text.Json.Serialization; + +namespace Ryujinx.Ava.Systems.Configuration.UI +{ + [JsonConverter(typeof(TypedStringEnumConverter))] + public enum FocusLostType + { + DoNothing, + BlockInput, + MuteAudio, + BlockInputAndMuteAudio, + PauseEmulation + } +} diff --git a/src/Ryujinx.UI.Common/Configuration/UI/GuiColumns.cs b/src/Ryujinx/Systems/Configuration/UI/GuiColumns.cs similarity index 92% rename from src/Ryujinx.UI.Common/Configuration/UI/GuiColumns.cs rename to src/Ryujinx/Systems/Configuration/UI/GuiColumns.cs index c486492e0..a0021be96 100644 --- a/src/Ryujinx.UI.Common/Configuration/UI/GuiColumns.cs +++ b/src/Ryujinx/Systems/Configuration/UI/GuiColumns.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Configuration.UI +namespace Ryujinx.Ava.Systems.Configuration.UI { public struct GuiColumns { diff --git a/src/Ryujinx.UI.Common/Configuration/UI/ShownFileTypes.cs b/src/Ryujinx/Systems/Configuration/UI/ShownFileTypes.cs similarity index 85% rename from src/Ryujinx.UI.Common/Configuration/UI/ShownFileTypes.cs rename to src/Ryujinx/Systems/Configuration/UI/ShownFileTypes.cs index 6c72a6930..bc32bd153 100644 --- a/src/Ryujinx.UI.Common/Configuration/UI/ShownFileTypes.cs +++ b/src/Ryujinx/Systems/Configuration/UI/ShownFileTypes.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Configuration.UI +namespace Ryujinx.Ava.Systems.Configuration.UI { public struct ShownFileTypes { diff --git a/src/Ryujinx/Systems/Configuration/UI/UpdaterType.cs b/src/Ryujinx/Systems/Configuration/UI/UpdaterType.cs new file mode 100644 index 000000000..bc2696780 --- /dev/null +++ b/src/Ryujinx/Systems/Configuration/UI/UpdaterType.cs @@ -0,0 +1,13 @@ +using Ryujinx.Common.Utilities; +using System.Text.Json.Serialization; + +namespace Ryujinx.Ava.Systems.Configuration.UI +{ + [JsonConverter(typeof(TypedStringEnumConverter))] + public enum UpdaterType + { + Off, + PromptAtStartup, + CheckInBackground + } +} diff --git a/src/Ryujinx.UI.Common/Configuration/UI/WindowStartup.cs b/src/Ryujinx/Systems/Configuration/UI/WindowStartup.cs similarity index 86% rename from src/Ryujinx.UI.Common/Configuration/UI/WindowStartup.cs rename to src/Ryujinx/Systems/Configuration/UI/WindowStartup.cs index 0df459134..be93ef4b6 100644 --- a/src/Ryujinx.UI.Common/Configuration/UI/WindowStartup.cs +++ b/src/Ryujinx/Systems/Configuration/UI/WindowStartup.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.UI.Common.Configuration.UI +namespace Ryujinx.Ava.Systems.Configuration.UI { public struct WindowStartup { diff --git a/src/Ryujinx/Systems/DiscordIntegrationModule.cs b/src/Ryujinx/Systems/DiscordIntegrationModule.cs new file mode 100644 index 000000000..5b61340b6 --- /dev/null +++ b/src/Ryujinx/Systems/DiscordIntegrationModule.cs @@ -0,0 +1,184 @@ +using DiscordRPC; +using Gommon; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.PlayReport; +using Ryujinx.Ava.Utilities; +using Ryujinx.Common; +using Ryujinx.Common.Logging; +using Ryujinx.HLE; +using Ryujinx.HLE.Loaders.Processes; +using Ryujinx.Horizon; +using System.Text; + +namespace Ryujinx.Ava.Systems +{ + public static class DiscordIntegrationModule + { + public static Timestamps EmulatorStartedAt { get; set; } + public static Timestamps GuestAppStartedAt { get; set; } + + private static string VersionString + => (ReleaseInformation.IsCanaryBuild ? "Canary " : string.Empty) + $"v{ReleaseInformation.Version}"; + + private static readonly string _description = ReleaseInformation.IsValid ? VersionString : "dev build"; + + private const string ApplicationId = "1293250299716173864"; + + private const int ApplicationByteLimit = 128; + private const string Ellipsis = "…"; + + private static DiscordRpcClient _discordClient; + private static RichPresence _discordPresenceMain; + private static RichPresence _discordPresencePlaying; + private static ApplicationMetadata _currentApp; + + public static bool HasAssetImage(string titleId) => TitleIDs.DiscordGameAssetKeys.ContainsIgnoreCase(titleId); + public static bool HasAnalyzer(string titleId) => PlayReports.Analyzer.TitleIds.ContainsIgnoreCase(titleId); + + public static void Initialize() + { + _discordPresenceMain = new RichPresence + { + Assets = new Assets + { + LargeImageKey = "ryujinx", + LargeImageText = TruncateToByteLength(_description) + }, + Details = "Main Menu", + State = "Idling", + Timestamps = EmulatorStartedAt + }; + + ConfigurationState.Instance.EnableDiscordIntegration.Event += Update; + TitleIDs.CurrentApplication.Event += (_, e) => Use(e.NewValue); + HorizonStatic.PlayReport += HandlePlayReport; + PlayReports.Initialize(); + } + + private static void Update(object sender, ReactiveEventArgs evnt) + { + if (evnt.OldValue != evnt.NewValue) + { + // If the integration was active, disable it and unload everything + if (evnt.OldValue) + { + _discordClient?.Dispose(); + + _discordClient = null; + } + + // If we need to activate it and the client isn't active, initialize it + if (evnt.NewValue && _discordClient == null) + { + _discordClient = new DiscordRpcClient(ApplicationId); + + _discordClient.Initialize(); + + Use(TitleIDs.CurrentApplication); + } + } + } + + public static void Use(Optional titleId) + { + if (titleId.TryGet(out string tid)) + SwitchToPlayingState( + ApplicationLibrary.LoadAndSaveMetaData(tid), + Switch.Shared.Processes.ActiveApplication + ); + else + SwitchToMainState(); + } + + private static RichPresence CreatePlayingState(ApplicationMetadata appMeta, ProcessResult procRes) => + new() + { + Assets = new Assets + { + LargeImageKey = TitleIDs.GetDiscordGameAsset(procRes.ProgramIdText), + LargeImageText = TruncateToByteLength($"{appMeta.Title} (v{procRes.DisplayVersion})"), + SmallImageKey = "ryujinx", + SmallImageText = TruncateToByteLength(_description) + }, + Details = TruncateToByteLength($"Playing {appMeta.Title}"), + State = appMeta.LastPlayed.HasValue && appMeta.TimePlayed.TotalSeconds > 5 + ? $"Total play time: {ValueFormatUtils.FormatTimeSpan(appMeta.TimePlayed)}" + : "Never played", + Timestamps = GuestAppStartedAt ??= Timestamps.Now + }; + + private static void SwitchToPlayingState(ApplicationMetadata appMeta, ProcessResult procRes) + { + _discordClient?.SetPresence(_discordPresencePlaying ??= CreatePlayingState(appMeta, procRes)); + _currentApp = appMeta; + } + + private static void SwitchToMainState() + { + _discordClient?.SetPresence(_discordPresenceMain); + _discordPresencePlaying = null; + _currentApp = null; + } + + private static void HandlePlayReport(Horizon.Prepo.Types.PlayReport playReport) + { + if (_discordClient is null) + return; + if (!TitleIDs.CurrentApplication.Value.HasValue) + return; + if (_discordPresencePlaying is null) + return; + + FormattedValue formattedValue = + PlayReports.Analyzer.Format(TitleIDs.CurrentApplication.Value, _currentApp, playReport); + + if (!formattedValue.Handled) + return; + + _discordPresencePlaying.Details = TruncateToByteLength( + formattedValue.Reset + ? $"Playing {_currentApp.Title}" + : formattedValue.FormattedString + ); + + if (_discordClient.CurrentPresence.Details.Equals(_discordPresencePlaying.Details)) + return; //don't trigger an update if the set presence Details are identical to current + + _discordClient.SetPresence(_discordPresencePlaying); + Logger.Info?.Print(LogClass.UI, "Updated Discord RPC based on a supported play report."); + } + + private static string TruncateToByteLength(string input) + { + if (Encoding.UTF8.GetByteCount(input) <= ApplicationByteLimit) + { + return input; + } + + // Find the length to trim the string to guarantee we have space for the trailing ellipsis. + int trimLimit = ApplicationByteLimit - Encoding.UTF8.GetByteCount(Ellipsis); + + // Make sure the string is long enough to perform the basic trim. + // Amount of bytes != Length of the string + if (input.Length > trimLimit) + { + // Basic trim to best case scenario of 1 byte characters. + input = input[..trimLimit]; + } + + while (Encoding.UTF8.GetByteCount(input) > trimLimit) + { + // Remove one character from the end of the string at a time. + input = input[..^1]; + } + + return input.TrimEnd() + Ellipsis; + } + + public static void Exit() + { + _discordClient?.Dispose(); + } + } +} diff --git a/src/Ryujinx/Systems/PlayReport/Analyzer.cs b/src/Ryujinx/Systems/PlayReport/Analyzer.cs new file mode 100644 index 000000000..42f74bc63 --- /dev/null +++ b/src/Ryujinx/Systems/PlayReport/Analyzer.cs @@ -0,0 +1,146 @@ +using Gommon; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Common.Logging; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Globalization; +using System.Linq; + +namespace Ryujinx.Ava.Systems.PlayReport +{ + /// + /// The entrypoint for the Play Report analysis system. + /// + public class Analyzer + { + private readonly List _specs = []; + + public string[] TitleIds => Specs.SelectMany(x => x.TitleIds).ToArray(); + + public IReadOnlyList Specs => new ReadOnlyCollection(_specs); + + public GameSpec GetSpec(string titleId) => _specs.First(x => x.TitleIds.ContainsIgnoreCase(titleId)); + + public bool TryGetSpec(string titleId, out GameSpec gameSpec) + => (gameSpec = _specs.FirstOrDefault(x => x.TitleIds.ContainsIgnoreCase(titleId))) != null; + + /// + /// Add an analysis spec matching a specific game by title ID, with the provided spec configuration. + /// + /// The ID of the game to listen to Play Reports in. + /// The configuration function for the analysis spec. + /// The current , for chaining convenience. + public Analyzer AddSpec(string titleId, Func transform) + { + if (ulong.TryParse(titleId, NumberStyles.HexNumber, null, out _)) + return AddSpec(transform(GameSpec.Create(titleId))); + + Logger.Notice.PrintMsg(LogClass.Application, + $"Tried to add a {nameof(GameSpec)} with a non-hexadecimal title ID value. Input: '{titleId}'"); + return this; + } + + /// + /// Add an analysis spec matching a specific game by title ID, with the provided spec configuration. + /// + /// The ID of the game to listen to Play Reports in. + /// The configuration function for the analysis spec. + /// The current , for chaining convenience. + public Analyzer AddSpec(string titleId, Action transform) + { + if (ulong.TryParse(titleId, NumberStyles.HexNumber, null, out _)) + return AddSpec(GameSpec.Create(titleId).Apply(transform)); + + Logger.Notice.PrintMsg(LogClass.Application, + $"Tried to add a {nameof(GameSpec)} with a non-hexadecimal title ID value. Input: '{titleId}'"); + return this; + } + + /// + /// Add an analysis spec matching a specific set of games by title IDs, with the provided spec configuration. + /// + /// The IDs of the games to listen to Play Reports in. + /// The configuration function for the analysis spec. + /// The current , for chaining convenience. + public Analyzer AddSpec(IEnumerable titleIds, + Func transform) + { + string[] tids = titleIds.ToArray(); + if (tids.All(x => ulong.TryParse(x, NumberStyles.HexNumber, null, out _) && !string.IsNullOrEmpty(x))) + return AddSpec(transform(GameSpec.Create(tids))); + + Logger.Notice.PrintMsg(LogClass.Application, + $"Tried to add a {nameof(GameSpec)} with a non-hexadecimal title ID value. Input: '{tids.FormatCollection( + x => x, + separator: ", ", + prefix: "[", + suffix: "]" + )}'"); + return this; + } + + /// + /// Add an analysis spec matching a specific set of games by title IDs, with the provided spec configuration. + /// + /// The IDs of the games to listen to Play Reports in. + /// The configuration function for the analysis spec. + /// The current , for chaining convenience. + public Analyzer AddSpec(IEnumerable titleIds, Action transform) + { + string[] tids = titleIds.ToArray(); + if (tids.All(x => ulong.TryParse(x, NumberStyles.HexNumber, null, out _) && !string.IsNullOrEmpty(x))) + return AddSpec(GameSpec.Create(tids).Apply(transform)); + + Logger.Notice.PrintMsg(LogClass.Application, + $"Tried to add a {nameof(GameSpec)} with a non-hexadecimal title ID value. Input: '{tids.FormatCollection( + x => x, + separator: ", ", + prefix: "[", + suffix: "]" + )}'"); + return this; + } + + /// + /// Add an analysis spec matching a specific game by title ID, with the provided pre-configured spec. + /// + /// The to add. + /// The current , for chaining convenience. + public Analyzer AddSpec(GameSpec spec) + { + _specs.Add(spec); + return this; + } + + /// + /// Runs the configured for the specified game title ID. + /// + /// The game currently running. + /// The Application metadata information, including localized game name and play time information. + /// The Play Report received from HLE. + /// A struct representing a possible formatted value. + public FormattedValue Format( + string runningGameId, + ApplicationMetadata appMeta, + Horizon.Prepo.Types.PlayReport playReport + ) + { + if (!playReport.ReportData.IsDictionary) + return FormattedValue.Unhandled; + + if (!TryGetSpec(runningGameId, out GameSpec spec)) + return FormattedValue.Unhandled; + + foreach (FormatterSpecBase formatSpec in spec.ValueFormatters.OrderBy(x => x.Priority)) + { + if (!formatSpec.TryFormat(appMeta, playReport, out FormattedValue value)) + continue; + + return value; + } + + return FormattedValue.Unhandled; + } + } +} diff --git a/src/Ryujinx/Systems/PlayReport/Delegates.cs b/src/Ryujinx/Systems/PlayReport/Delegates.cs new file mode 100644 index 000000000..bca70a7fa --- /dev/null +++ b/src/Ryujinx/Systems/PlayReport/Delegates.cs @@ -0,0 +1,40 @@ +namespace Ryujinx.Ava.Systems.PlayReport +{ + /// + /// The delegate type that powers single value formatters.
+ /// Takes in the result value from the Play Report, and outputs: + ///
+ /// a formatted string, + ///
+ /// a signal that nothing was available to handle it, + ///
+ /// OR a signal to reset the value that the caller is using the for. + ///
+ public delegate FormattedValue SingleValueFormatter(SingleValue value); + + /// + /// The delegate type that powers multiple value formatters.
+ /// Takes in the result values from the Play Report, and outputs: + ///
+ /// a formatted string, + ///
+ /// a signal that nothing was available to handle it, + ///
+ /// OR a signal to reset the value that the caller is using the for. + ///
+ public delegate FormattedValue MultiValueFormatter(MultiValue value); + + /// + /// The delegate type that powers multiple value formatters. + /// The dictionary passed to this delegate is sparsely populated; + /// that is, not every key specified in the Play Report needs to match for this to be used.
+ /// Takes in the result values from the Play Report, and outputs: + ///
+ /// a formatted string, + ///
+ /// a signal that nothing was available to handle it, + ///
+ /// OR a signal to reset the value that the caller is using the for. + ///
+ public delegate FormattedValue SparseMultiValueFormatter(SparseMultiValue value); +} diff --git a/src/Ryujinx/Systems/PlayReport/MatchedValues.cs b/src/Ryujinx/Systems/PlayReport/MatchedValues.cs new file mode 100644 index 000000000..9fbd01b4b --- /dev/null +++ b/src/Ryujinx/Systems/PlayReport/MatchedValues.cs @@ -0,0 +1,73 @@ +using MsgPack; +using Ryujinx.Ava.Systems.AppLibrary; +using System.Collections.Generic; + +namespace Ryujinx.Ava.Systems.PlayReport +{ + public abstract class MatchedValue + { + protected MatchedValue(T matched) + { + Matched = matched; + } + + /// + /// The currently running application's . + /// + public ApplicationMetadata Application { get; init; } + + /// + /// The entire play report. + /// + public Horizon.Prepo.Types.PlayReport PlayReport { get; init; } + + /// + /// The matched value from the Play Report. + /// + public T Matched { get; init; } + } + + /// + /// The input data to a , + /// containing the currently running application's , + /// and the matched from the Play Report. + /// + public class SingleValue : MatchedValue + { + public SingleValue(Value matched) : base(matched) + { + } + } + + /// + /// The input data to a , + /// containing the currently running application's , + /// and the matched s from the Play Report. + /// + public class MultiValue : MatchedValue + { + public MultiValue(Value[] matched) : base(matched) + { + } + + public MultiValue(IEnumerable matched) : base(Value.ConvertPackedObjects(matched)) + { + } + } + + /// + /// The input data to a , + /// containing the currently running application's , + /// and the matched s from the Play Report. + /// + public class SparseMultiValue : MatchedValue> + { + public SparseMultiValue(Dictionary matched) : base(matched) + { + } + + public SparseMultiValue(Dictionary matched) : base(Value.ConvertPackedObjectMap(matched)) + { + } + } +} diff --git a/src/Ryujinx/Systems/PlayReport/PlayReports.Formatters.cs b/src/Ryujinx/Systems/PlayReport/PlayReports.Formatters.cs new file mode 100644 index 000000000..dacf3ef0e --- /dev/null +++ b/src/Ryujinx/Systems/PlayReport/PlayReports.Formatters.cs @@ -0,0 +1,643 @@ +using Gommon; +using Humanizer; +using System; +using System.Buffers.Binary; +using System.Collections.Generic; +using System.Linq; + +namespace Ryujinx.Ava.Systems.PlayReport +{ + public partial class PlayReports + { + private static FormattedValue BreathOfTheWild_MasterMode(SingleValue value) + => value.Matched.BoxedValue is 1 ? "Playing Master Mode" : FormattedValue.ForceReset; + + private static FormattedValue TearsOfTheKingdom_CurrentField(SingleValue value) => + value.Matched.DoubleValue switch + { + > 800d => "Exploring the Sky Islands", + < -201d => "Exploring the Depths", + _ => "Roaming Hyrule" + }; + + private static FormattedValue SkywardSwordHD_Rupees(SingleValue value) + => "rupee".ToQuantity(value.Matched.IntValue); + + private static FormattedValue SuperMarioOdyssey_AssistMode(SingleValue value) + => value.Matched.BoxedValue is 1 ? "Playing in Assist Mode" : "Playing in Regular Mode"; + + private static FormattedValue SuperMarioOdysseyChina_AssistMode(SingleValue value) + => value.Matched.BoxedValue is 1 ? "Playing in 帮助模式" : "Playing in 普通模式"; + + private static FormattedValue SuperMario3DWorldOrBowsersFury(SingleValue value) + => value.Matched.BoxedValue is 0 ? "Playing Super Mario 3D World" : "Playing Bowser's Fury"; + + private static FormattedValue MarioKart8Deluxe_Mode(SingleValue value) + => value.Matched.StringValue switch + { + // Single Player + "Single" => "Single Player", + // Multiplayer + "Multi-2players" => "Multiplayer 2 Players", + "Multi-3players" => "Multiplayer 3 Players", + "Multi-4players" => "Multiplayer 4 Players", + // Wireless/LAN Play + "Local-Single" => "Wireless/LAN Play", + "Local-2players" => "Wireless/LAN Play 2 Players", + // CC Classes + "50cc" => "50cc", + "100cc" => "100cc", + "150cc" => "150cc", + "Mirror" => "Mirror (150cc)", + "200cc" => "200cc", + // Modes + "GrandPrix" => "Grand Prix", + "TimeAttack" => "Time Trials", + "VS" => "VS Races", + "Battle" => "Battle Mode", + "RaceStart" => "Selecting a Course", + "Race" => "Racing", + _ => FormattedValue.ForceReset + }; + + private static FormattedValue PokemonSV(MultiValue values) + { + + string playStatus = values.Matched[0].BoxedValue is 0 ? "Playing Alone" : "Playing in a group"; + + FormattedValue locations = values.Matched[1].ToString() switch + { + // Base Game Locations + "a_w01" => "South Area One", + "a_w02" => "Mesagoza", + "a_w03" => "The Pokemon League", + "a_w04" => "South Area Two", + "a_w05" => "South Area Four", + "a_w06" => "South Area Six", + "a_w07" => "South Area Five", + "a_w08" => "South Area Three", + "a_w09" => "West Area One", + "a_w10" => "Asado Desert", + "a_w11" => "West Area Two", + "a_w12" => "Medali", + "a_w13" => "Tagtree Thicket", + "a_w14" => "East Area Three", + "a_w15" => "Artazon", + "a_w16" => "East Area Two", + "a_w18" => "Casseroya Lake", + "a_w19" => "Glaseado Mountain", + "a_w20" => "North Area Three", + "a_w21" => "North Area One", + "a_w22" => "North Area Two", + "a_w23" => "The Great Crater of Paldea", + "a_w24" => "South Paldean Sea", + "a_w25" => "West Paldean Sea", + "a_w26" => "East Paldean Sea", + "a_w27" => "North Paldean Sea", + //TODO DLC Locations + _ => FormattedValue.ForceReset + }; + + return $"{playStatus} in {locations}"; + } + + private static FormattedValue SuperSmashBrosUltimate_Mode(SparseMultiValue values) + { + // Check if the PlayReport is for a challenger approach or an achievement. + if (values.Matched.TryGetValue("fighter", out Value fighter) && values.Matched.ContainsKey("reason")) + { + return $"Challenger Approaches - {SuperSmashBrosUltimate_Character(fighter)}"; + } + + if (values.Matched.TryGetValue("fighter", out fighter) && values.Matched.ContainsKey("challenge_count")) + { + return $"Fighter Unlocked - {SuperSmashBrosUltimate_Character(fighter)}"; + } + + if (values.Matched.TryGetValue("anniversary", out Value anniversary)) + { + return $"Achievement Unlocked - ID: {anniversary}"; + } + + if (values.Matched.ContainsKey("is_created")) + { + return "Edited a Custom Stage!"; + } + + if (values.Matched.ContainsKey("adv_slot")) + { + return + "Playing Adventure Mode"; // Doing this as it can be a placeholder until we can grab the character. + } + + // Check if we have a match_mode at this point, if not, go to default. + if (!values.Matched.TryGetValue("match_mode", out Value matchMode)) + { + return "Smashing"; + } + + return matchMode.BoxedValue switch + { + 0 when values.Matched.TryGetValue("player_1_fighter", out Value player) && + values.Matched.TryGetValue("player_2_fighter", out Value challenger) + => $"Last Smashed: {SuperSmashBrosUltimate_Character(challenger)}'s Fighter Challenge - {SuperSmashBrosUltimate_Character(player)}", + 1 => $"Last Smashed: Normal Battle - {SuperSmashBrosUltimate_PlayerListing(values)}", + 2 when values.Matched.TryGetValue("player_1_rank", out Value team) + => team.BoxedValue is 0 + ? "Last Smashed: Squad Strike - Red Team Wins" + : "Last Smashed: Squad Strike - Blue Team Wins", + 3 => $"Last Smashed: Custom Smash - {SuperSmashBrosUltimate_PlayerListing(values)}", + 4 => $"Last Smashed: Super Sudden Death - {SuperSmashBrosUltimate_PlayerListing(values)}", + 5 => $"Last Smashed: Smashdown - {SuperSmashBrosUltimate_PlayerListing(values)}", + 6 => $"Last Smashed: Tourney Battle - {SuperSmashBrosUltimate_PlayerListing(values)}", + 7 when values.Matched.TryGetValue("player_1_fighter", out Value player) + => $"Last Smashed: Spirit Board Battle as {SuperSmashBrosUltimate_Character(player)}", + 8 when values.Matched.TryGetValue("player_1_fighter", out Value player) + => $"Playing Adventure Mode as {SuperSmashBrosUltimate_Character(player)}", + 10 when values.Matched.TryGetValue("match_submode", out Value battle) && + values.Matched.TryGetValue("player_1_fighter", out Value player) + => $"Last Smashed: Classic Mode, Battle {(int)battle.BoxedValue + 1}/8 as {SuperSmashBrosUltimate_Character(player)}", + 12 => $"Last Smashed: Century Smash - {SuperSmashBrosUltimate_PlayerListing(values)}", + 13 => $"Last Smashed: All-Star Smash - {SuperSmashBrosUltimate_PlayerListing(values)}", + 14 => $"Last Smashed: Cruel Smash - {SuperSmashBrosUltimate_PlayerListing(values)}", + 15 when values.Matched.TryGetValue("player_1_fighter", out Value player) + => $"Last Smashed: Home-Run Contest - {SuperSmashBrosUltimate_Character(player)}", + 16 when values.Matched.TryGetValue("player_1_fighter", out Value player1) && + values.Matched.TryGetValue("player_2_fighter", out Value player2) + => $"Last Smashed: Home-Run Content (Co-op) - {SuperSmashBrosUltimate_Character(player1)} and {SuperSmashBrosUltimate_Character(player2)}", + 17 => $"Last Smashed: Home-Run Contest (Versus) - {SuperSmashBrosUltimate_PlayerListing(values)}", + 18 when values.Matched.TryGetValue("player_1_fighter", out Value player1) && + values.Matched.TryGetValue("player_2_fighter", out Value player2) + => $"Fresh out of Training mode - {SuperSmashBrosUltimate_Character(player1)} with {SuperSmashBrosUltimate_Character(player2)}", + 58 => $"Last Smashed: LDN Battle - {SuperSmashBrosUltimate_PlayerListing(values)}", + 63 when values.Matched.TryGetValue("player_1_fighter", out Value player) + => $"Last Smashed: DLC Spirit Board Battle as {SuperSmashBrosUltimate_Character(player)}", + _ => "Smashing" + }; + } + + private static string SuperSmashBrosUltimate_Character(Value value) => + BinaryPrimitives.ReverseEndianness( + BitConverter.ToInt64(((MsgPack.MessagePackExtendedTypeObject)value.BoxedValue).GetBody(), 0)) switch + { + 0x0 => "Mario", + 0x1 => "Donkey Kong", + 0x2 => "Link", + 0x3 => "Samus", + 0x4 => "Dark Samus", + 0x5 => "Yoshi", + 0x6 => "Kirby", + 0x7 => "Fox", + 0x8 => "Pikachu", + 0x9 => "Luigi", + 0xA => "Ness", + 0xB => "Captain Falcon", + 0xC => "Jigglypuff", + 0xD => "Peach", + 0xE => "Daisy", + 0xF => "Bowser", + 0x10 => "Ice Climbers", + 0x11 => "Sheik", + 0x12 => "Zelda", + 0x13 => "Dr. Mario", + 0x14 => "Pichu", + 0x15 => "Falco", + 0x16 => "Marth", + 0x17 => "Lucina", + 0x18 => "Young Link", + 0x19 => "Ganondorf", + 0x1A => "Mewtwo", + 0x1B => "Roy", + 0x1C => "Chrom", + 0x1D => "Mr Game & Watch", + 0x1E => "Meta Knight", + 0x1F => "Pit", + 0x20 => "Dark Pit", + 0x21 => "Zero Suit Samus", + 0x22 => "Wario", + 0x23 => "Snake", + 0x24 => "Ike", + 0x25 => "Pokémon Trainer", + 0x26 => "Diddy Kong", + 0x27 => "Lucas", + 0x28 => "Sonic", + 0x29 => "King Dedede", + 0x2A => "Olimar", + 0x2B => "Lucario", + 0x2C => "R.O.B.", + 0x2D => "Toon Link", + 0x2E => "Wolf", + 0x2F => "Villager", + 0x30 => "Mega Man", + 0x31 => "Wii Fit Trainer", + 0x32 => "Rosalina & Luma", + 0x33 => "Little Mac", + 0x34 => "Greninja", + 0x35 => "Palutena", + 0x36 => "Pac-Man", + 0x37 => "Robin", + 0x38 => "Shulk", + 0x39 => "Bowser Jr.", + 0x3A => "Duck Hunt", + 0x3B => "Ryu", + 0x3C => "Ken", + 0x3D => "Cloud", + 0x3E => "Corrin", + 0x3F => "Bayonetta", + 0x40 => "Richter", + 0x41 => "Inkling", + 0x42 => "Ridley", + 0x43 => "King K. Rool", + 0x44 => "Simon", + 0x45 => "Isabelle", + 0x46 => "Incineroar", + 0x47 => "Mii Brawler", + 0x48 => "Mii Swordfighter", + 0x49 => "Mii Gunner", + 0x4A => "Piranha Plant", + 0x4B => "Joker", + 0x4C => "Hero", + 0x4D => "Banjo", + 0x4E => "Terry", + 0x4F => "Byleth", + 0x50 => "Min Min", + 0x51 => "Steve", + 0x52 => "Sephiroth", + 0x53 => "Pyra/Mythra", + 0x54 => "Kazuya", + 0x55 => "Sora", + 0xFE => "Random", + 0xFF => "Scripted Entity", + _ => "Unknown" + }; + + private static string SuperSmashBrosUltimate_PlayerListing(SparseMultiValue values) + { + List<(string Character, int PlayerNumber, int? Rank)> players = []; + + foreach (KeyValuePair player in values.Matched) + { + if (player.Key.StartsWith("player_") && player.Key.EndsWith("_fighter") && + player.Value.BoxedValue is not null) + { + if (!int.TryParse(player.Key.Split('_')[1], out int playerNumber)) + continue; + + string character = SuperSmashBrosUltimate_Character(player.Value); + int? rank = values.Matched.TryGetValue($"player_{playerNumber}_rank", out Value rankValue) + ? rankValue.IntValue + : null; + + players.Add((character, playerNumber, rank)); + } + } + + players = players.OrderBy(p => p.Rank ?? int.MaxValue).ToList(); + + return players.Count > 4 + ? $"{players.Count} Players - {players.Take(3) + .Select(p => $"{p.Character}({p.PlayerNumber}){RankMedal(p.Rank)}") + .JoinToString(", ")}" + : players + .Select(p => $"{p.Character}({p.PlayerNumber}){RankMedal(p.Rank)}") + .JoinToString(", "); + + static string RankMedal(int? rank) => rank switch + { + 0 => "🥇", + 1 => "🥈", + 2 => "🥉", + _ => "" + }; + } + + private static FormattedValue NsoEmulator_LaunchedGame(SingleValue value) => value.Matched.StringValue switch + { + #region SEGA Genesis + + "m_0054_e" => Playing("Alien Soldier"), + "m_3978_e" => Playing("Alien Storm"), + "m_5234_e" => Playing("ALISIA DRAGOON"), + "m_5003_e" => Playing("Streets of Rage 2"), + "m_4843_e" => Playing("Kid Chameleon"), + "m_2874_e" => Playing("Columns"), + "m_3167_e" => Playing("Comix Zone"), + "m_5007_e" => Playing("Contra: Hard Corps"), + "m_0865_e" => Playing("Ghouls 'n Ghosts"), + "m_0935_e" => Playing("Dynamite Headdy"), + "m_8314_e" => Playing("Earthworm Jim"), + "m_5012_e" => Playing("Ecco the Dolphin"), + "m_2207_e" => Playing("Flicky"), + "m_9432_e" => Playing("Golden Axe II"), + "m_5015_e" => Playing("Golden Axe"), + "m_5017_e" => Playing("Gunstar Heroes"), + "m_0732_e" => Playing("Altered Beast"), + "m_2245_e" or "m_2245_pd" or "m_2245_pf" => Playing("Landstalker"), + "m_1654_e" => Playing("Target Earth"), + "m_7050_e" => Playing("Light Crusader"), + "m_5027_e" => Playing("M.U.S.H.A."), + "m_5028_e" => Playing("Phantasy Star IV"), + "m_9155_e" => Playing("Pulseman"), + "m_5030_e" => Playing("Dr. Robotnik's Mean Bean Machine"), + "m_0098_e" => Playing("Crusader of Centy"), + "m_0098_k" => Playing("신창세기 라그나센티"), + "m_0098_pd" or "m_0098_pf" or "m_0098_ps" => Playing("Soleil"), + "m_5033_e" => Playing("Ristar"), + "m_1987_e" => Playing("MEGA MAN: THE WILY WARS"), + "m_2609_e" => Playing("WOLF OF THE BATTLEFIELD: MERCS"), + "m_3353_e" => Playing("Shining Force II"), + "m_5036_e" => Playing("Shining Force"), + "m_9866_e" => Playing("Sonic The Hedgehog Spinball"), + "m_5041_e" => Playing("Sonic The Hedgehog 2"), + "m_5523_e" => Playing("Space Harrier II"), + "m_0041_e" => Playing("STREET FIGHTER II' : SPECIAL CHAMPION EDITION"), + "m_5044_e" => Playing("STRIDER"), + "m_6353_e" => Playing("Super Fantasy Zone"), + "m_9569_e" => Playing("Beyond Oasis"), + "m_9569_k" => Playing("스토리 오브 도어"), + "m_9569_pd" or "m_9569_ps" => Playing("The Story of Thor"), + "m_9569_pf" => Playing("La Légende de Thor"), + "m_5049_e" => Playing("Shinobi III: Return of the Ninja Master"), + "m_6811_e" => Playing("The Revenge of Shinobi"), + "m_4372_e" => Playing("Thunder Force II"), + "m_1535_e" => Playing("ToeJam & Earl in Panic on Funkotron"), + "m_0432_e" => Playing("ToeJam & Earl"), + "m_5052_e" => Playing("Castlevania: BLOODLINES"), + "m_3626_e" => Playing("VectorMan"), + "m_7955_e" => Playing("Sword of Vermilion"), + "m_0394_e" => Playing("Virtua Fighter 2"), + "m_9417_e" => Playing("Zero Wing"), + + #endregion + + #region Nintendo 64 + + "n_1653_e" or "n_1653_p" => Playing("1080º ™ Snowboarding"), + "n_4868_e" or "n_4868_p" => Playing("Banjo Kazooie™"), + "n_1226_e" or "n_1226_p" => Playing("Banjo-Tooie™"), + "n_3083_e" or "n_3083_p" => Playing("Blast Corps"), + "n_3007_e" => Playing("Dr. Mario™ 64"), + "n_4238_e" => Playing("Excitebike™ 64"), + "n_1870_e" => Playing("Extreme G"), + "n_2456_e" => Playing("F-Zero™ X"), + "n_4631_e" => Playing("GoldenEye 007"), + "n_1635_e" => Playing("Harvest Moon 64"), + "n_2225_e" => Playing("Iggy’s Reckin’ Balls"), + "n_1625_e" or "n_1625_p" => Playing("JET FORCE GEMINI™"), + "n_3052_e" => Playing("Kirby 64™: The Crystal Shards"), + "n_4371_e" => Playing("Mario Golf™"), + "n_3013_e" => Playing("Mario Kart™ 64"), + "n_1053_e" or "n_1053_p" => Playing("Mario Party™ 2"), + "n_2965_e" or "n_2965_p" => Playing("Mario Party™ 3"), + "n_4737_e" or "n_4737_p" => Playing("Mario Party™"), + "n_3017_e" => Playing("Mario Tennis™"), + "n_2992_e" or "n_2992_p" => Playing("Paper Mario™"), + "n_3783_e" or "n_3783_p" => Playing("Pilotwings™ 64"), + "n_1848_e" or "n_1848_pd" or "n_1848_pf" => Playing("Pokémon™ Puzzle League"), + "n_3240_e" or "n_3240_pd" or "n_3240_pf" or "n_3240_pi" or "n_3240_ps" => Playing("Pokémon Snap™"), + "n_4590_e" or "n_4590_pd" or "n_4590_pf" or "n_4590_pi" or "n_4590_ps" => Playing("Pokémon Stadium™"), + "n_3309_e" or "n_3309_pd" or "n_3309_pf" or "n_3309_pi" or "n_3309_ps" => Playing("Pokémon Stadium 2™"), + "n_3029_e" => Playing("Sin & Punishment™"), + "n_3030_e" => Playing("Star Fox™ 64"), + "n_3030_p" => Playing("Lylat Wars™"), + "n_3031_e" or "n_3031_p" => Playing("Super Mario 64™"), + "n_4813_e" or "n_4813_p" => Playing("Wave Race™ 64"), + "n_3034_e" => Playing("WIN BACK: COVERT OPERATIONS"), + "n_3034_p" => Playing("OPERATION: WIN BACK"), + "n_3036_e" or "n_3036_p" => Playing("Yoshi's Story™"), + "n_1407_e" or "n_1407_p" => Playing("The Legend of Zelda™: Majora's Mask™"), + "n_3038_e" or "n_3038_p" => Playing("The Legend of Zelda™: Ocarina of Time™"), + + #endregion + + #region NES + + "clv_p_naaae" => Playing("Super Mario Bros.™"), + "clv_p_naabe" => Playing("Super Mario Bros.™: The Lost Levels"), + "clv_p_naace" or "clv_p_naace_sp1" => Playing("Super Mario Bros.™ 3"), + "clv_p_naade" => Playing("Super Mario Bros.™ 2"), + "clv_p_naaee" => Playing("Donkey Kong™"), + "clv_p_naafe" => Playing("Donkey Kong Jr.™"), + "clv_p_naage" => Playing("Donkey Kong™ 3"), + "clv_p_naahe" => Playing("Excitebike™"), + "clv_p_naaje" => Playing("EarthBound Beginnings"), + "clv_p_naame" => Playing("NES™ Open Tournament Golf"), + "clv_p_naane" or "clv_p_naane_sp1" => Playing("The Legend of Zelda™"), + "clv_p_naape" or "clv_p_naape_sp1" => Playing("Kirby's Adventure™"), + "clv_p_naaqe" or "clv_p_naaqe_sp1" or "clv_p_naaqe_sp2" => Playing("Metroid™"), + "clv_p_naare" => Playing("Balloon Fight™"), + "clv_p_naase" or "clv_p_naase_sp1" => Playing("Zelda II - The Adventure of Link™"), + "clv_p_naate" => Playing("Punch-Out!!™ Featuring Mr. Dream"), + "clv_p_naaue" => Playing("Ice Climber™"), + "clv_p_naave" or "clv_p_naave_sp1" => Playing("Kid Icarus™"), + "clv_p_naawe" => Playing("Mario Bros.™"), + "clv_p_naaxe" or "clv_p_naaxe_sp1" => Playing("Dr. Mario™"), + "clv_p_naaye" => Playing("Yoshi™"), + "clv_p_naaze" => Playing("StarTropics™"), + "clv_p_nabce" or "clv_p_nabce_sp1" => Playing("Ghosts'n Goblins™"), + "clv_p_nabre" or "clv_p_nabre_sp1" or "clv_p_nabre_sp2" => Playing("Gradius"), + "clv_p_nacbe" or "clv_p_nacbe_sp1" => Playing("Ninja Gaiden"), + "clv_p_nacce" => Playing("Solomon's Key"), + "clv_p_nacde" => Playing("Tecmo Bowl"), + "clv_p_nacfe" => Playing("Double Dragon"), + "clv_p_nache" => Playing("Double Dragon II: The Revenge"), + "clv_p_nacje" => Playing("River City Ransom"), + "clv_p_nacke" => Playing("Super Dodge Ball"), + "clv_p_nacle" => Playing("Downtown Nekketsu March Super-Awesome Field Day!"), + "clv_p_nacpe" => Playing("The Mystery of Atlantis"), + "clv_p_nacre" => Playing("Soccer"), + "clv_p_nacse" or "clv_p_nacse_sp1" => Playing("Ninja JaJaMaru-kun"), + "clv_p_nacte" => Playing("Ice Hockey"), + "clv_p_nacue" or "clv_p_nacue_sp1" => Playing("Blaster Master"), + "clv_p_nacwe" => Playing("ADVENTURES OF LOLO"), + "clv_p_nacxe" => Playing("Wario's Woods™"), + "clv_p_nacye" => Playing("Tennis"), + "clv_p_nacze" => Playing("Wrecking Crew™"), + "clv_p_nadbe" => Playing("Joy Mech Fight™"), + "clv_p_nadde" or "clv_p_nadde_sp1" => Playing("Star Soldier"), + "clv_p_nadke" => Playing("Tetris®"), + "clv_p_nadle" => Playing("Pro Wrestling"), + "clv_p_nadpe" => Playing("Baseball"), + "clv_p_nadte" or "clv_p_nadte_sp1" => Playing("TwinBee"), + "clv_p_nadue" or "clv_p_nadue_sp1" => Playing("Mighty Bomb Jack"), + "clv_p_nadve" => Playing("Kung-Fu Heroes"), + "clv_p_nadxe" => Playing("City Connection"), + "clv_p_nadye" => Playing("Rygar"), + "clv_p_naeae" => Playing("Crystalis"), + "clv_p_naece" => Playing("Vice: Project Doom"), + "clv_p_naehe" => Playing("Clu Clu Land™"), + "clv_p_naeie" => Playing("VS. Excitebike™"), + "clv_p_naeje" => Playing("Volleyball™"), + "clv_p_naeke" => Playing("JOURNEY TO SILIUS"), + "clv_p_naele" => Playing("S.C.A.T.: Special Cybernetic Attack Team"), + "clv_p_naeme" => Playing("Shadow of the Ninja"), + "clv_p_naene" => Playing("Nightshade"), + "clv_p_naepe" => Playing("The Immortal"), + "clv_p_naeqe" => Playing("Eliminator Boat Duel"), + "clv_p_naere" => Playing("Fire 'n Ice"), + "clv_p_nafce" => Playing("XEVIOUS"), + "clv_p_nagpe" => Playing("DAIVA STORY 6 IMPERIAL OF NIRSARTIA"), + "clv_p_nagqe" => Playing("DIG DUGⅡ"), + "clv_p_nague" => Playing("MAPPY-LAND"), + "clv_p_nahhe" => Playing("Mach Rider™"), + "clv_p_nahje" => Playing("Pinball"), + "clv_p_nahre" => Playing("Mystery Tower"), + "clv_p_nahte" => Playing("Urban Champion™"), + "clv_p_nahue" => Playing("Donkey Kong Jr.™ Math"), + "clv_p_nahve" => Playing("The Mysterious Murasame Castle"), + "clv_p_najae" => Playing("DEVIL WORLD™"), + "clv_p_najbe" => Playing("Golf"), + "clv_p_najpe" => Playing("R.C. PRO-AM™"), + "clv_p_najre" => Playing("COBRA TRIANGLE™"), + "clv_p_najse" => Playing("SNAKE RATTLE N ROLL™"), + "clv_p_najte" => Playing("SOLAR® JETMAN"), + + #endregion + + #region SNES + + "s_2180_e" => Playing("BATTLETOADS™ DOUBLE DRAGON™"), + "s_2179_e" => Playing("BATTLETOADS™ IN BATTLEMANIACS"), + "s_2182_e" => Playing("BIG RUN"), + "s_2156_e" => Playing("Bombuzal"), + "s_2002_e" => Playing("BRAWL BROTHERS"), + "s_2025_e" => Playing("Breath of Fire II"), + "s_2003_e" => Playing("Breath Of Fire"), + "s_2163_e" => Playing("Claymates"), + "s_2150_e" => Playing("Congo's Caper"), + "s_2171_e" => Playing("COSMO GANG THE PUZZLE"), + "s_2004_e" => Playing("Demon's Crest"), + "s_2026_e" => Playing("Kunio-kun no Dodgeball da yo Zen'in Shūgō!"), + "s_2060_e" => Playing("Donkey Kong Country 2: Diddy's Kong Quest"), + "s_2061_e" => Playing("Donkey Kong Country 3: Dixie Kong's Double Trouble!"), + "s_2055_e" => Playing("Donkey Kong Country"), + "s_2139_e" => Playing("DOOMSDAY WARRIOR"), + "s_2051_e" => Playing("EarthBound"), + "s_2162_e" => Playing("Earthworm Jim™ 2"), + "s_2005_e" => Playing("F-ZERO™"), + "s_2183_e" => Playing("FATAL FURY 2"), + "s_2174_e" => Playing("Fighter's History"), + "s_2037_e" => Playing("Harvest Moon"), + "s_2161_e" => Playing("Jelly Boy"), + "s_2006_e" => Playing("Joe & Mac 2: Lost in the Tropics"), + "s_2169_e" => Playing("Caveman Ninja"), + "s_2181_e" => Playing("KILLER INSTINCT™"), + "s_2029_e" or "s_2029_e_sp1" => Playing("Kirby Super Star™"), + "s_2121_e" => Playing("Kirby's Avalanche™"), + "s_2007_e" or "s_2007_e_sp1" => Playing("Kirby's Dream Course™"), + "s_2008_e" or "s_2008_e_sp1" => Playing("Kirby's Dream Land™ 3"), + "s_2172_e" => Playing("Kirby’s Star Stacker™"), + "s_2151_e" => Playing("Magical Drop2"), + "s_2044_e" => Playing("Mario's Super Picross"), + "s_2038_e" => Playing("Natsume Championship Wrestling"), + "s_2140_e" => Playing("Operation Logic Bomb"), + "s_2034_e" => Playing("Panel de Pon"), + "s_2009_e" => Playing("Pilotwings™"), + "s_2010_e" => Playing("Pop'n TwinBee"), + "s_2157_e" => Playing("Prehistorik Man"), + "s_2145_e" => Playing("Psycho Dream"), + "s_2141_e" => Playing("Rival Turf!"), + "s_2152_e" => Playing("SIDE POCKET"), + "s_2158_e" => Playing("Spanky’s™ Quest"), + "s_2031_e" => Playing("Star Fox™ 2"), + "s_2011_e" => Playing("Star Fox™"), + "s_2012_e" => Playing("Stunt Race FX™"), + "s_2032_e" => Playing("Amazing Hebereke"), + "s_2159_e" => Playing("Super Baseball Simulator 1.000"), + "s_2013_e" => Playing("SUPER E.D.F. EARTH DEFENSE FORCE"), + "s_2014_e" => Playing("Smash Tennis"), + "s_2015_e" => Playing("Super Ghouls'n Ghosts™"), + "s_2033_e" => Playing("Super Mario All-Stars™"), + "s_2016_e" or "s_2016_e_sp1" => Playing("Super Mario Kart™"), + "s_2017_e" or "s_2017_e_sp1" => Playing("Super Mario World™"), + "s_2018_e" or "s_2018_e_sp1" => Playing("Super Metroid™"), + "s_2184_e" => Playing("Super Ninja Boy"), + "s_2019_e" or "s_2019_e_sp1" => Playing("Super Punch-Out!!™"), + "s_2020_e" => Playing("Super Puyo Puyo 2"), + "s_2133_e" => Playing("SUPER R-TYPE"), + "s_2021_e" => Playing("Super Soccer"), + "s_2022_e" => Playing("Super Tennis"), + "s_2136_e" => Playing("Sutte Hakkun"), + "s_2142_e" => Playing("The Ignition Factor"), + "s_2143_e" => Playing("The Peace Keepers"), + "s_2146_e" => Playing("Tuff E Nuff"), + "s_2144_e" => Playing("SUPER VALIS Ⅳ"), + "s_2049_e" => Playing("Wild Guns"), + "s_2096_e" => Playing("Wrecking Crew™ '98"), + "s_2023_e" => Playing("Super Mario World™ 2: Yoshi's Island™"), + "s_2024_e" => Playing("The Legend of Zelda™: A Link to the Past™"), + + #endregion + + #region GameBoy + + "c_7224_e" or "c_7224_p" => Playing("Alone in the Dark: The New Nightmare"), + "c_5022_e" => Playing("Blaster Master: Enemy Below"), + "c_3381_e" => Playing("Game & Watch™ Gallery 3"), + "c_0282_e" => Playing("Kirby Tilt ‘n’ Tumble™"), + "c_4471_e" or "c_4471_p" => Playing("Mario Golf™"), + "c_9947_e" => Playing("Mario Tennis™"), + "c_3191_e" or "c_3191_p" or "c_3191_x" => Playing("Pokémon™ Trading Card Game"), + "c_8914_e" or "c_8914_p" => Playing("Quest for Camelot™"), + "c_2648_e" => Playing("Tetris® DX"), + "c_5928_e" => Playing("Wario Land™ 3"), + "c_3996_e" or "c_3996_pd" or "c_3996_pf" => Playing("The Legend of Zelda™: Link's Awakening DX™"), + "c_8852_e" or "c_8852_p" => Playing("The Legend of Zelda™: Oracle of Ages™"), + "c_9130_e" or "c_9130_p" => Playing("The Legend of Zelda™: Oracle of Seasons™"), + "d_6879_e" => Playing("Alleyway™"), + "d_7618_e" => Playing("Baseball"), + "d_6005_e" => Playing("BurgerTime Deluxe"), + "d_7120_e" => Playing("Castlevania Legends"), + "d_2744_e" => Playing("Dr. Mario™"), + "d_1593_e" => Playing("Donkey Kong Land 2™"), + "d_7216_e" => Playing("Donkey Kong Land III™"), + "d_4971_e" => Playing("Donkey Kong Land™"), + "d_7984_e" => Playing("GARGOYLE'S QUEST"), + "d_8212_e" => Playing("Kirby's Dream Land™ 2"), + "d_5661_e" => Playing("Kirby's Dream Land™"), + "d_3837_e" => Playing("MEGA MAN II"), + "d_1965_e" => Playing("MEGA MAN III"), + "d_0194_e" => Playing("MEGA MAN IV"), + "d_1425_e" => Playing("MEGA MAN V"), + "d_9324_e" => Playing("MEGA MAN: DR. WILY'S REVENGE"), + "d_1577_e" => Playing("Metroid™ II - Return of Samus™"), + "d_5124_e" => Playing("Super Mario Land™ 2 - 6 Golden Coins™"), + "d_7970_e" => Playing("Super Mario Land™"), + "d_8484_e" => Playing("Tetris®"), + + #endregion + + #region GameBoy Advance + + "a_9694_e" => Playing("Densetsu no Starfy 1"), + "a_5600_e" => Playing("Densetsu no Starfy 2"), + "a_7565_e" => Playing("Densetsu no Starfy 3"), + "a_6553_e" => Playing("F-ZERO CLIMAX"), + "a_7842_e" or "a_7842_p" => Playing("F-Zero™- GP Legend"), + "a_9283_e" => Playing("F-Zero™ Maximum Velocity"), + "a_3744_e" or "a_3744_x" or "a_3744_y" => Playing("Fire Emblem™"), + "a_8978_d" or "a_8978_e" or "a_8978_f" or "a_8978_i" or "a_8978_s" => Playing("Golden Sun™: The Lost Age"), + "a_3108_d" or "a_3108_e" or "a_3108_f" or "a_3108_i" or "a_3108_s" => Playing("Golden Sun™"), + "a_3654_e" or "a_3654_p" => Playing("Kirby™ & The Amazing Mirror"), + "a_7279_p" => Playing("Kuru Kuru Kururin™"), + "a_7311_e" or "a_7311_p" => Playing("Mario & Luigi™: Superstar Saga"), + "a_6845_e" => Playing("Mario Kart™: Super Circuit™"), + "a_4139_e" or "a_4139_p" => Playing("Metroid™ Fusion"), + "a_6834_e" or "a_6834_p" => Playing("Metroid™: Zero Mission"), + "a_8989_e" or "a_8989_p" => Playing("Pokémon™ Mystery Dungeon: Red Rescue Team"), + "a_9444_e" => Playing("Super Mario™ Advance"), + "a_9901_e" or "a_9901_p" => Playing("Super Mario™ Advance 4: Super Mario Bros.™ 3"), + "a_2939_e" => Playing("Super Mario World™: Super Mario Advance 2"), + "a_2939_p" => Playing("Super Mario World™: Super Mario Advance 2™"), + "a_1302_e" => Playing("WarioWare™, Inc.: Mega Microgame$!"), + "a_1302_p" => Playing("WarioWare™, Inc.: Minigame Mania."), + "a_6960_e" or "a_6960_p" => Playing("Yoshi's Island™: Super Mario™ Advance 3"), + "a_5190_e" or "a_5190_p" => Playing("The Legend of Zelda™: A Link to the Past™ Four Swords"), + "a_8665_e" or "a_8665_p" => Playing("The Legend of Zelda™: The Minish Cap"), + + #endregion + + _ => FormattedValue.ForceReset + }; + } +} diff --git a/src/Ryujinx/Systems/PlayReport/PlayReports.cs b/src/Ryujinx/Systems/PlayReport/PlayReports.cs new file mode 100644 index 000000000..628194b19 --- /dev/null +++ b/src/Ryujinx/Systems/PlayReport/PlayReports.cs @@ -0,0 +1,98 @@ +using System; + +namespace Ryujinx.Ava.Systems.PlayReport +{ + public static partial class PlayReports + { + public static void Initialize() + { + // init lazy value + _ = Analyzer; + } + + public static Analyzer Analyzer => _analyzerLazy.Value; + + private static readonly Lazy _analyzerLazy = new(() => new Analyzer() + .AddSpec( + "01007ef00011e000", + spec => spec + .WithDescription("based on being in Master Mode.") + .AddValueFormatter("IsHardMode", BreathOfTheWild_MasterMode) + // reset to normal status when switching between normal & master mode in title screen + .AddValueFormatter("AoCVer", FormattedValue.SingleAlwaysResets) + ) + .AddSpec( + "0100f2c0115b6000", + spec => spec + .WithDescription("based on where you are in Hyrule (Depths, Surface, Sky).") + .AddValueFormatter("PlayerPosY", TearsOfTheKingdom_CurrentField)) + .AddSpec( + "01002da013484000", + spec => spec + .WithDescription("based on how many Rupees you have.") + .AddValueFormatter("rupees", SkywardSwordHD_Rupees)) + .AddSpec( + "0100000000010000", + spec => spec + .WithDescription("based on if you're playing with Assist Mode.") + .AddValueFormatter("is_kids_mode", SuperMarioOdyssey_AssistMode) + ) + .AddSpec( + "010075000ecbe000", + spec => spec + .WithDescription("based on if you're playing with Assist Mode.") + .AddValueFormatter("is_kids_mode", SuperMarioOdysseyChina_AssistMode) + ) + .AddSpec( + "010028600ebda000", + spec => spec + .WithDescription("based on being in either Super Mario 3D World or Bowser's Fury.") + .AddValueFormatter("mode", SuperMario3DWorldOrBowsersFury) + ) + .AddSpec( // Global & China IDs + ["0100152000022000", "010075100e8ec000"], + spec => spec + .WithDescription( + "based on what modes you're selecting in the menu & whether or not you're in a race.") + .AddValueFormatter("To", MarioKart8Deluxe_Mode) + ) + .AddSpec( + ["0100a3d008c5c000", "01008f6008c5e000"], + spec => spec + .WithDescription("based on if you're playing alone or in a group and what area of Paldea you're exploring.") + .AddMultiValueFormatter(["team_circle", "area_no"], PokemonSV) + ) + .AddSpec( + "01006a800016e000", + spec => spec + .WithDescription("based on what mode you're playing, who won, and what characters were present.") + .AddSparseMultiValueFormatter( + [ + // Metadata to figure out what PlayReport we have. + "match_mode", "match_submode", "anniversary", "fighter", "reason", "challenge_count", + "adv_slot", "is_created", + // List of Fighters + "player_1_fighter", "player_2_fighter", "player_3_fighter", "player_4_fighter", + "player_5_fighter", "player_6_fighter", "player_7_fighter", "player_8_fighter", + // List of rankings/placements + "player_1_rank", "player_2_rank", "player_3_rank", "player_4_rank", "player_5_rank", + "player_6_rank", "player_7_rank", "player_8_rank" + ], + SuperSmashBrosUltimate_Mode + ) + ) + .AddSpec( + [ + "0100c9a00ece6000", "01008d300c50c000", "0100d870045b6000", + "010012f017576000", "0100c62011050000", "0100b3c014bda000" + ], + spec => spec + .WithDescription( + "based on what game you first launch.\n\nNSO emulators do not print any Play Report information past the first game launch so it's all we got.") + .AddValueFormatter("launch_title_id", NsoEmulator_LaunchedGame) + ) + ); + + private static string Playing(string game) => $"Playing {game}"; + } +} diff --git a/src/Ryujinx/Systems/PlayReport/Specs.cs b/src/Ryujinx/Systems/PlayReport/Specs.cs new file mode 100644 index 000000000..27ad6d868 --- /dev/null +++ b/src/Ryujinx/Systems/PlayReport/Specs.cs @@ -0,0 +1,254 @@ +using MsgPack; +using Ryujinx.Ava.Systems.AppLibrary; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Ryujinx.Ava.Systems.PlayReport +{ + /// + /// A mapping of title IDs to value formatter specs. + /// + /// Generally speaking, use the .AddSpec(...) methods instead of creating this class yourself. + /// + public class GameSpec + { + public static GameSpec Create(string requiredTitleId, params IEnumerable otherTitleIds) + => new() { TitleIds = otherTitleIds.Prepend(requiredTitleId).ToArray() }; + + public static GameSpec Create(IEnumerable titleIds) + => new() { TitleIds = titleIds.ToArray() }; + + private int _lastPriority; + + public required string[] TitleIds { get; init; } + + public const string DefaultDescription = "Formats the details on your Discord presence based on logged data from the game."; + + private string _valueDescription; + + public string Description => _valueDescription ?? DefaultDescription; + + public GameSpec WithDescription(string description) + { + _valueDescription = description != null + ? $"Formats the details on your Discord presence {description}" + : null; + return this; + } + + public List ValueFormatters { get; } = []; + + /// + /// Add a value formatter to the current + /// matching a specific key that could exist in a Play Report for the previously specified title IDs. + /// + /// The key name to match. + /// The function which can return a potential formatted value. + /// The current , for chaining convenience. + public GameSpec AddValueFormatter( + string reportKey, + SingleValueFormatter valueFormatter + ) => AddValueFormatter(_lastPriority++, reportKey, valueFormatter); + + /// + /// Add a value formatter at a specific priority to the current + /// matching a specific key that could exist in a Play Report for the previously specified title IDs. + /// + /// The resolution priority of this value formatter. Higher resolves sooner. + /// The key name to match. + /// The function which can return a potential formatted value. + /// The current , for chaining convenience. + public GameSpec AddValueFormatter( + int priority, + string reportKey, + SingleValueFormatter valueFormatter + ) => AddValueFormatter(new FormatterSpec + { + Priority = priority, + ReportKeys = [reportKey], + Formatter = valueFormatter + }); + + /// + /// Add a multi-value formatter to the current + /// matching a specific set of keys that could exist in a Play Report for the previously specified title IDs. + /// + /// The key names to match. + /// The function which can format the values. + /// The current , for chaining convenience. + public GameSpec AddMultiValueFormatter( + string[] reportKeys, + MultiValueFormatter valueFormatter + ) => AddMultiValueFormatter(_lastPriority++, reportKeys, valueFormatter); + + /// + /// Add a multi-value formatter at a specific priority to the current + /// matching a specific set of keys that could exist in a Play Report for the previously specified title IDs. + /// + /// The resolution priority of this value formatter. Higher resolves sooner. + /// The key names to match. + /// The function which can format the values. + /// The current , for chaining convenience. + public GameSpec AddMultiValueFormatter( + int priority, + string[] reportKeys, + MultiValueFormatter valueFormatter + ) => AddValueFormatter(new MultiFormatterSpec + { + Priority = priority, + ReportKeys = reportKeys, + Formatter = valueFormatter + }); + + /// + /// Add a multi-value formatter to the current + /// matching a specific set of keys that could exist in a Play Report for the previously specified title IDs. + ///

+ /// The 'Sparse' multi-value formatters do not require every key to be present. + /// If you need this requirement, use . + ///
+ /// The key names to match. + /// The function which can format the values. + /// The current , for chaining convenience. + public GameSpec AddSparseMultiValueFormatter( + string[] reportKeys, + SparseMultiValueFormatter valueFormatter + ) => AddSparseMultiValueFormatter(_lastPriority++, reportKeys, valueFormatter); + + /// + /// Add a multi-value formatter at a specific priority to the current + /// matching a specific set of keys that could exist in a Play Report for the previously specified title IDs. + ///

+ /// The 'Sparse' multi-value formatters do not require every key to be present. + /// If you need this requirement, use . + ///
+ /// The resolution priority of this value formatter. Higher resolves sooner. + /// The key names to match. + /// The function which can format the values. + /// The current , for chaining convenience. + public GameSpec AddSparseMultiValueFormatter( + int priority, + string[] reportKeys, + SparseMultiValueFormatter valueFormatter + ) => AddValueFormatter(new SparseMultiFormatterSpec + { + Priority = priority, + ReportKeys = reportKeys, + Formatter = valueFormatter + }); + + private GameSpec AddValueFormatter(T formatterSpec) where T : FormatterSpecBase + { + ValueFormatters.Add(formatterSpec); + return this; + } + } + + /// + /// A struct containing the data for a mapping of a key in a Play Report to a formatter for its potential value. + /// + public class FormatterSpec : FormatterSpecBase + { + public override bool GetData(Horizon.Prepo.Types.PlayReport playReport, out object result) + { + if (!playReport.ReportData.AsDictionary().TryGetValue(ReportKeys[0], out MessagePackObject valuePackObject)) + { + result = null; + return false; + } + + result = valuePackObject; + return true; + } + } + + /// + /// A struct containing the data for a mapping of an arbitrary key set in a Play Report to a formatter for their potential values. + /// + public class MultiFormatterSpec : FormatterSpecBase + { + public override bool GetData(Horizon.Prepo.Types.PlayReport playReport, out object result) + { + List packedObjects = []; + foreach (string reportKey in ReportKeys) + { + if (!playReport.ReportData.AsDictionary().TryGetValue(reportKey, out MessagePackObject valuePackObject)) + { + result = null; + return false; + } + + packedObjects.Add(valuePackObject); + } + + result = packedObjects; + return true; + } + } + + /// + /// A struct containing the data for a mapping of an arbitrary key set in a Play Report to a formatter for their sparsely populated potential values. + /// + public class SparseMultiFormatterSpec : FormatterSpecBase + { + public override bool GetData(Horizon.Prepo.Types.PlayReport playReport, out object result) + { + Dictionary packedObjects = []; + foreach (string reportKey in ReportKeys) + { + if (!playReport.ReportData.AsDictionary().TryGetValue(reportKey, out MessagePackObject valuePackObject)) + continue; + + packedObjects.Add(reportKey, valuePackObject); + } + + result = packedObjects; + return true; + } + } + + public abstract class FormatterSpecBase + { + public abstract bool GetData(Horizon.Prepo.Types.PlayReport playReport, out object data); + + public int Priority { get; init; } + public string[] ReportKeys { get; init; } + public Delegate Formatter { get; init; } + + public bool TryFormat(ApplicationMetadata appMeta, Horizon.Prepo.Types.PlayReport playReport, + out FormattedValue formattedValue) + { + formattedValue = default; + if (!GetData(playReport, out object data)) + return false; + + if (data is FormattedValue fv) + { + formattedValue = fv; + return true; + } + + switch (Formatter) + { + case SingleValueFormatter svf when data is MessagePackObject match: + formattedValue = svf( + new SingleValue(match) { Application = appMeta, PlayReport = playReport } + ); + return true; + case MultiValueFormatter mvf when data is List matches: + formattedValue = mvf( + new MultiValue(matches) { Application = appMeta, PlayReport = playReport } + ); + return true; + case SparseMultiValueFormatter smvf when data is Dictionary sparseMatches: + formattedValue = smvf( + new SparseMultiValue(sparseMatches) { Application = appMeta, PlayReport = playReport } + ); + return true; + default: + throw new InvalidOperationException("Formatter delegate is not of a known type!"); + } + } + } +} diff --git a/src/Ryujinx/Systems/PlayReport/Value.cs b/src/Ryujinx/Systems/PlayReport/Value.cs new file mode 100644 index 000000000..9edbc42f1 --- /dev/null +++ b/src/Ryujinx/Systems/PlayReport/Value.cs @@ -0,0 +1,160 @@ +using MsgPack; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Ryujinx.Ava.Systems.PlayReport +{ + /// + /// The base input data to a ValueFormatter delegate, + /// and the matched from the Play Report. + /// + public readonly struct Value + { + public Value(MessagePackObject packedValue) + { + PackedValue = packedValue; + } + + /// + /// The matched value from the Play Report. + /// + public MessagePackObject PackedValue { get; init; } + + /// + /// Access the as its underlying .NET type.
+ /// + /// Does not seem to work well with comparing numeric types, + /// so use XValue properties for that. + ///
+ public object BoxedValue => PackedValue.ToObject(); + + public override string ToString() + { + object boxed = BoxedValue; + return boxed == null + ? "null" + : boxed.ToString(); + } + + public static implicit operator Value(MessagePackObject matched) => new(matched); + + public static Value[] ConvertPackedObjects(IEnumerable packObjects) + => packObjects.Select(packObject => new Value(packObject)).ToArray(); + + public static Dictionary ConvertPackedObjectMap(Dictionary packObjects) + => packObjects.ToDictionary( + x => x.Key, + x => new Value(x.Value) + ); + + #region AsX accessors + + public bool BooleanValue => PackedValue.AsBoolean(); + public byte ByteValue => PackedValue.AsByte(); + public sbyte SByteValue => PackedValue.AsSByte(); + public short ShortValue => PackedValue.AsInt16(); + public ushort UShortValue => PackedValue.AsUInt16(); + public int IntValue => PackedValue.AsInt32(); + public uint UIntValue => PackedValue.AsUInt32(); + public long LongValue => PackedValue.AsInt64(); + public ulong ULongValue => PackedValue.AsUInt64(); + public float FloatValue => PackedValue.AsSingle(); + public double DoubleValue => PackedValue.AsDouble(); + public string StringValue => PackedValue.AsString(); + public Span BinaryValue => PackedValue.AsBinary(); + + #endregion + } + + /// + /// A potential formatted value returned by a ValueFormatter delegate. + /// + public readonly struct FormattedValue + { + /// + /// Was any handler able to match anything in the Play Report? + /// + public bool Handled { get; private init; } + + /// + /// Did the handler request the caller of the to reset the existing value? + /// + public bool Reset { get; private init; } + + /// + /// The formatted value, only present if is true, and is false. + /// + public string FormattedString { get; private init; } + + /// + /// The intended path of execution for having a string to return: simply return the string. + /// This implicit conversion will make the struct for you.

+ /// + /// If the input is null, is returned. + ///
+ /// The formatted string value. + /// The automatically constructed struct. + public static implicit operator FormattedValue(string formattedValue) + => formattedValue is not null + ? new FormattedValue { Handled = true, FormattedString = formattedValue } + : Unhandled; + + public override string ToString() + { + if (!Handled) + return ""; + + if (Reset) + return ""; + + return FormattedString; + } + + /// + /// Return this to tell the caller there is no value to return. + /// + public static readonly FormattedValue Unhandled = default; + + /// + /// Return this to suggest the caller reset the value it's using the for. + /// + public static readonly FormattedValue ForceReset = new() { Handled = true, Reset = true }; + + /// + /// A delegate singleton you can use to always return in a . + /// + public static readonly SingleValueFormatter SingleAlwaysResets = _ => ForceReset; + + /// + /// A delegate singleton you can use to always return in a . + /// + public static readonly MultiValueFormatter MultiAlwaysResets = _ => ForceReset; + + /// + /// A delegate singleton you can use to always return in a . + /// + public static readonly SparseMultiValueFormatter SparseMultiAlwaysResets = _ => ForceReset; + + /// + /// A delegate factory you can use to always return the specified + /// in a . + /// + /// The string to always return for this delegate instance. + public static SingleValueFormatter SingleAlwaysReturns(string formattedValue) => _ => formattedValue; + + /// + /// A delegate factory you can use to always return the specified + /// in a . + /// + /// The string to always return for this delegate instance. + public static MultiValueFormatter MultiAlwaysReturns(string formattedValue) => _ => formattedValue; + + /// + /// A delegate factory you can use to always return the specified + /// in a . + /// + /// The string to always return for this delegate instance. + public static SparseMultiValueFormatter SparseMultiAlwaysReturns(string formattedValue) => _ => formattedValue; + } +} diff --git a/src/Ryujinx/Systems/Rebooter.cs b/src/Ryujinx/Systems/Rebooter.cs new file mode 100644 index 000000000..ac22dfb15 --- /dev/null +++ b/src/Ryujinx/Systems/Rebooter.cs @@ -0,0 +1,72 @@ +using FluentAvalonia.UI.Controls; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Utilities; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.Systems +{ + internal static class Rebooter + { + + private static readonly string _updateDir = Path.Combine(Path.GetTempPath(), "Ryujinx", "update"); + + public static void RebootAppWithGame(string gamePath, List args) + { + _ = Reboot(gamePath, args); + + } + + private static async Task Reboot(string gamePath, List args) + { + + bool shouldRestart = true; + + TaskDialog taskDialog = new() + { + Header = LocaleManager.Instance[LocaleKeys.RyujinxRebooter], + SubHeader = LocaleManager.Instance[LocaleKeys.DialogRebooterMessage], + IconSource = new SymbolIconSource { Symbol = Symbol.Games }, + XamlRoot = RyujinxApp.MainWindow, + }; + + if (shouldRestart) + { + string executableDirectory = AppDomain.CurrentDomain.BaseDirectory; + + _ = taskDialog.ShowAsync(true); + await Task.Delay(500); + + // Find the process name. + string ryuName = Path.GetFileName(Environment.ProcessPath) ?? string.Empty; + + // Fallback if the executable could not be found. + if (ryuName.Length == 0 || !Path.Exists(Path.Combine(executableDirectory, ryuName))) + { + ryuName = OperatingSystem.IsWindows() ? "Ryujinx.exe" : "Ryujinx"; + } + + ProcessStartInfo processStart = new(ryuName) + { + UseShellExecute = true, + WorkingDirectory = executableDirectory, + }; + + foreach (var arg in args) + { + processStart.ArgumentList.Add(arg); + } + + processStart.ArgumentList.Add(gamePath); + + Process.Start(processStart); + + Environment.Exit(0); + } + } + } +} diff --git a/src/Ryujinx/Systems/Updater/Updater.GitLab.cs b/src/Ryujinx/Systems/Updater/Updater.GitLab.cs new file mode 100644 index 000000000..3411daa5d --- /dev/null +++ b/src/Ryujinx/Systems/Updater/Updater.GitLab.cs @@ -0,0 +1,107 @@ +using Gommon; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Common; +using Ryujinx.Common.Helper; +using Ryujinx.Common.Logging; +using Ryujinx.Systems.Update.Client; +using Ryujinx.Systems.Update.Common; +using System; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.Systems +{ + internal static partial class Updater + { + private static VersionResponse _versionResponse; + + private static UpdateClient CreateUpdateClient() + => UpdateClient.Builder() + .WithServerEndpoint("https://update.ryujinx.app") // This is the default, and doesn't need to be provided; it's here for transparency. + .WithLogger((format, args, caller) => + Logger.Info?.Print( + LogClass.Application, + args.Length is 0 ? format : format.Format(args), + caller: caller) + ); + + public static async Task> CheckVersionAsync(bool showVersionUpToDate = false) + { + if (!Version.TryParse(Program.Version, out Version currentVersion)) + { + Logger.Error?.Print(LogClass.Application, + $"Failed to convert the current {RyujinxApp.FullAppName} version!"); + + await ContentDialogHelper.CreateWarningDialog( + LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedMessage], + LocaleManager.Instance[LocaleKeys.DialogUpdaterCancelUpdateMessage]); + + _running = false; + + return default; + } + + using UpdateClient updateClient = CreateUpdateClient(); + + try + { + _versionResponse = await updateClient.QueryLatestAsync(ReleaseInformation.IsCanaryBuild + ? ReleaseChannel.Canary + : ReleaseChannel.Stable); + } + catch (Exception e) + { + Logger.Error?.Print(LogClass.Application, $"An error occurred when requesting for updates ({e.GetType().AsFullNamePrettyString()}): {e.Message}"); + + _running = false; + return default; + } + + if (_versionResponse == null) + { + // logging is done via the UpdateClient library + _running = false; + return default; + } + + // If build URL not found, assume no new update is available. + if (_versionResponse.ArtifactUrl is null or "") + { + if (showVersionUpToDate) + { + UserResult userResult = await ContentDialogHelper.CreateUpdaterUpToDateInfoDialog( + LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage], + string.Empty); + + if (userResult is UserResult.Ok) + { + OpenHelper.OpenUrl(_versionResponse.ReleaseUrlFormat.Format(currentVersion)); + } + } + + Logger.Info?.Print(LogClass.Application, "Up to date."); + + _running = false; + + return default; + } + + + if (!Version.TryParse(_versionResponse.Version, out Version newVersion)) + { + Logger.Error?.Print(LogClass.Application, + $"Failed to convert the received {RyujinxApp.FullAppName} version from the update server!"); + + await ContentDialogHelper.CreateWarningDialog( + LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedServerMessage], + LocaleManager.Instance[LocaleKeys.DialogUpdaterCancelUpdateMessage]); + + _running = false; + + return default; + } + + return (currentVersion, newVersion); + } + } +} diff --git a/src/Ryujinx/Updater.cs b/src/Ryujinx/Systems/Updater/Updater.cs similarity index 76% rename from src/Ryujinx/Updater.cs rename to src/Ryujinx/Systems/Updater/Updater.cs index 6a1701208..39bb5d9d4 100644 --- a/src/Ryujinx/Updater.cs +++ b/src/Ryujinx/Systems/Updater/Updater.cs @@ -6,11 +6,10 @@ using ICSharpCode.SharpZipLib.Tar; using ICSharpCode.SharpZipLib.Zip; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.Utilities; using Ryujinx.Common; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; -using Ryujinx.Common.Utilities; -using Ryujinx.UI.Common.Helper; -using Ryujinx.UI.Common.Models.Github; using System; using System.Collections.Generic; using System.Diagnostics; @@ -26,30 +25,21 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -namespace Ryujinx.Ava +namespace Ryujinx.Ava.Systems { - internal static class Updater + internal static partial class Updater { - private const string GitHubApiUrl = "https://api.github.com"; - private const string LatestReleaseUrl = - $"{GitHubApiUrl}/repos/{ReleaseInformation.ReleaseChannelOwner}/{ReleaseInformation.ReleaseChannelRepo}/releases/latest"; - - private static readonly GithubReleasesJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); - private static readonly string _homeDir = AppDomain.CurrentDomain.BaseDirectory; private static readonly string _updateDir = Path.Combine(Path.GetTempPath(), "Ryujinx", "update"); private static readonly string _updatePublishDir = Path.Combine(_updateDir, "publish"); private const int ConnectionCount = 4; - - private static string _buildVer; - private static string _platformExt; - private static string _buildUrl; + private static long _buildSize; private static bool _updateSuccessful; private static bool _running; private static readonly string[] _windowsDependencyDirs = []; - + public static async Task BeginUpdateAsync(bool showVersionUpToDate = false) { if (_running) @@ -59,127 +49,12 @@ namespace Ryujinx.Ava _running = true; - // Detect current platform - if (OperatingSystem.IsMacOS()) - { - _platformExt = "macos_universal.app.tar.gz"; - } - else if (OperatingSystem.IsWindows()) - { - _platformExt = "win_x64.zip"; - } - else if (OperatingSystem.IsLinux()) - { - var arch = RuntimeInformation.OSArchitecture == Architecture.Arm64 ? "arm64" : "x64"; - _platformExt = $"linux_{arch}.tar.gz"; - } - - Version newVersion; - Version currentVersion; - - try - { - currentVersion = Version.Parse(Program.Version); - } - catch - { - Logger.Error?.Print(LogClass.Application, $"Failed to convert the current {App.FullAppName} version!"); - - await ContentDialogHelper.CreateWarningDialog( - LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedMessage], - LocaleManager.Instance[LocaleKeys.DialogUpdaterCancelUpdateMessage]); - - _running = false; + Optional<(Version, Version)> versionTuple = await CheckVersionAsync(showVersionUpToDate); + if (_running is false || !versionTuple.HasValue) return; - } - // Get latest version number from GitHub API - try - { - using HttpClient jsonClient = ConstructHttpClient(); - - string fetchedJson = await jsonClient.GetStringAsync(LatestReleaseUrl); - var fetched = JsonHelper.Deserialize(fetchedJson, _serializerContext.GithubReleasesJsonResponse); - _buildVer = fetched.TagName; - - foreach (var asset in fetched.Assets) - { - if (asset.Name.StartsWith("ryujinx") && asset.Name.EndsWith(_platformExt)) - { - _buildUrl = asset.BrowserDownloadUrl; - - if (asset.State != "uploaded") - { - if (showVersionUpToDate) - { - UserResult userResult = await ContentDialogHelper.CreateUpdaterUpToDateInfoDialog( - LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage], - string.Empty); - - if (userResult is UserResult.Ok) - { - OpenHelper.OpenUrl(ReleaseInformation.GetChangelogForVersion(currentVersion)); - } - } - - _running = false; - - return; - } - - break; - } - } - - // If build not done, assume no new update are available. - if (_buildUrl is null) - { - if (showVersionUpToDate) - { - UserResult userResult = await ContentDialogHelper.CreateUpdaterUpToDateInfoDialog( - LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage], - string.Empty); - - if (userResult is UserResult.Ok) - { - OpenHelper.OpenUrl(ReleaseInformation.GetChangelogForVersion(currentVersion)); - } - } - - _running = false; - - return; - } - } - catch (Exception exception) - { - Logger.Error?.Print(LogClass.Application, exception.Message); - - await ContentDialogHelper.CreateErrorDialog( - LocaleManager.Instance[LocaleKeys.DialogUpdaterFailedToGetVersionMessage]); - - _running = false; - - return; - } - - try - { - newVersion = Version.Parse(_buildVer); - } - catch - { - Logger.Error?.Print(LogClass.Application, $"Failed to convert the received {App.FullAppName} version from GitHub!"); - - await ContentDialogHelper.CreateWarningDialog( - LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedGithubMessage], - LocaleManager.Instance[LocaleKeys.DialogUpdaterCancelUpdateMessage]); - - _running = false; - - return; - } + (Version currentVersion, Version newVersion) = versionTuple.Value; if (newVersion <= currentVersion) { @@ -191,10 +66,12 @@ namespace Ryujinx.Ava if (userResult is UserResult.Ok) { - OpenHelper.OpenUrl(ReleaseInformation.GetChangelogForVersion(currentVersion)); + OpenHelper.OpenUrl(_versionResponse.ReleaseUrlFormat.Format(currentVersion)); } } + Logger.Info?.Print(LogClass.Application, "Up to date."); + _running = false; return; @@ -205,8 +82,11 @@ namespace Ryujinx.Ava try { buildSizeClient.DefaultRequestHeaders.Add("Range", "bytes=0-0"); + + // GitLab instance is located in Ukraine. Connection times will vary across the world. + buildSizeClient.Timeout = TimeSpan.FromSeconds(10); - HttpResponseMessage message = await buildSizeClient.GetAsync(new Uri(_buildUrl), HttpCompletionOption.ResponseHeadersRead); + HttpResponseMessage message = await buildSizeClient.GetAsync(new Uri(_versionResponse.ArtifactUrl), HttpCompletionOption.ResponseHeadersRead); _buildSize = message.Content.Headers.ContentRange.Length.Value; } @@ -223,7 +103,9 @@ namespace Ryujinx.Ava string newVersionString = ReleaseInformation.IsCanaryBuild ? $"Canary {currentVersion} -> Canary {newVersion}" : $"{currentVersion} -> {newVersion}"; - + + Logger.Info?.Print(LogClass.Application, $"Version found: {newVersionString}"); + RequestUserToUpdate: // Show a message asking the user if they want to update UserResult shouldUpdate = await ContentDialogHelper.CreateUpdaterChoiceDialog( @@ -234,7 +116,7 @@ namespace Ryujinx.Ava switch (shouldUpdate) { case UserResult.Yes: - await UpdateRyujinx(_buildUrl); + await UpdateRyujinx(_versionResponse.ArtifactUrl); break; // Secondary button maps to no, which in this case is the show changelog button. case UserResult.No: @@ -252,7 +134,7 @@ namespace Ryujinx.Ava HttpClient result = new(); // Required by GitHub to interact with APIs. - result.DefaultRequestHeaders.Add("User-Agent", "Ryujinx-Updater/1.0.0"); + result.DefaultRequestHeaders.Add("User-Agent", $"Ryujinx-Updater/{ReleaseInformation.Version}"); return result; } @@ -277,7 +159,7 @@ namespace Ryujinx.Ava SubHeader = LocaleManager.Instance[LocaleKeys.UpdaterDownloading], IconSource = new SymbolIconSource { Symbol = Symbol.Download }, ShowProgressBar = true, - XamlRoot = App.MainWindow, + XamlRoot = RyujinxApp.MainWindow, }; taskDialog.Opened += (s, e) => @@ -372,7 +254,7 @@ namespace Ryujinx.Ava for (int i = 0; i < ConnectionCount; i++) { - list.Add(Array.Empty()); + list.Add([]); } for (int i = 0; i < ConnectionCount; i++) @@ -434,7 +316,8 @@ namespace Ryujinx.Ava // On macOS, ensure that we remove the quarantine bit to prevent Gatekeeper from blocking execution. if (OperatingSystem.IsMacOS()) { - using Process xattrProcess = Process.Start("xattr", new List { "-d", "com.apple.quarantine", updateFile }); + using Process xattrProcess = Process.Start("xattr", + ["-d", "com.apple.quarantine", updateFile]); xattrProcess.WaitForExit(); } @@ -482,7 +365,7 @@ namespace Ryujinx.Ava using HttpResponseMessage response = client.GetAsync(downloadUrl, HttpCompletionOption.ResponseHeadersRead).Result; using Stream remoteFileStream = response.Content.ReadAsStreamAsync().Result; - using Stream updateFileStream = File.Open(updateFile, FileMode.Create); + using FileStream updateFileStream = File.Open(updateFile, FileMode.Create); long totalBytes = response.Content.Headers.ContentLength.Value; long bytesWritten = 0; @@ -501,7 +384,7 @@ namespace Ryujinx.Ava bytesWritten += readSize; taskDialog.SetProgressBarState(GetPercentage(bytesWritten, totalBytes), TaskDialogProgressState.Normal); - App.SetTaskbarProgressValue(bytesWritten, totalBytes); + RyujinxApp.SetTaskbarProgressValue(bytesWritten, totalBytes); updateFileStream.Write(buffer, 0, readSize); } @@ -529,7 +412,7 @@ namespace Ryujinx.Ava [SupportedOSPlatform("macos")] private static void ExtractTarGzipFile(TaskDialog taskDialog, string archivePath, string outputDirectoryPath) { - using Stream inStream = File.OpenRead(archivePath); + using FileStream inStream = File.OpenRead(archivePath); using GZipInputStream gzipStream = new(inStream); using TarInputStream tarStream = new(gzipStream, Encoding.ASCII); @@ -697,22 +580,11 @@ namespace Ryujinx.Ava #else if (showWarnings) { - if (ReleaseInformation.IsFlatHubBuild) - { - Dispatcher.UIThread.InvokeAsync(() => - ContentDialogHelper.CreateWarningDialog( - LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle], - LocaleManager.Instance[LocaleKeys.DialogUpdaterFlatpakNotSupportedMessage]) + Dispatcher.UIThread.InvokeAsync(() => + ContentDialogHelper.CreateWarningDialog( + LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle], + LocaleManager.Instance[LocaleKeys.DialogUpdaterDirtyBuildSubMessage]) ); - } - else - { - Dispatcher.UIThread.InvokeAsync(() => - ContentDialogHelper.CreateWarningDialog( - LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle], - LocaleManager.Instance[LocaleKeys.DialogUpdaterDirtyBuildSubMessage]) - ); - } } return false; @@ -722,15 +594,15 @@ namespace Ryujinx.Ava // NOTE: This method should always reflect the latest build layout. private static IEnumerable EnumerateFilesToDelete() { - var files = Directory.EnumerateFiles(_homeDir); // All files directly in base dir. + IEnumerable files = Directory.EnumerateFiles(_homeDir); // All files directly in base dir. // Determine and exclude user files only when the updater is running, not when cleaning old files if (_running && !OperatingSystem.IsMacOS()) { // Compare the loose files in base directory against the loose files from the incoming update, and store foreign ones in a user list. - var oldFiles = Directory.EnumerateFiles(_homeDir, "*", SearchOption.TopDirectoryOnly).Select(Path.GetFileName); - var newFiles = Directory.EnumerateFiles(_updatePublishDir, "*", SearchOption.TopDirectoryOnly).Select(Path.GetFileName); - var userFiles = oldFiles.Except(newFiles).Select(filename => Path.Combine(_homeDir, filename)); + IEnumerable oldFiles = Directory.EnumerateFiles(_homeDir, "*", SearchOption.TopDirectoryOnly).Select(Path.GetFileName); + IEnumerable newFiles = Directory.EnumerateFiles(_updatePublishDir, "*", SearchOption.TopDirectoryOnly).Select(Path.GetFileName); + IEnumerable userFiles = oldFiles.Except(newFiles).Select(filename => Path.Combine(_homeDir, filename)); // Remove user files from the paths in files. files = files.Except(userFiles); @@ -783,5 +655,34 @@ namespace Ryujinx.Ava public static void CleanupUpdate() => Directory.GetFiles(_homeDir, "*.ryuold", SearchOption.AllDirectories) .ForEach(File.Delete); + + private static string BuildPlatformExtension() + { + if (RunningPlatform.IsMacOS) + return "macos_universal.app.tar.gz"; + +#pragma warning disable CS8509 // It is exhaustive for any values this can contain. + string osPrefix = RunningPlatform.CurrentOS switch + { + OperatingSystemType.Linux => "linux", + OperatingSystemType.Windows => "win" + }; + + string archSuffix = RunningPlatform.Architecture switch + { + Architecture.Arm64 => "arm64", + Architecture.X64 => "x64", + _ => throw new PlatformNotSupportedException($"Unknown architecture {Enum.GetName(RunningPlatform.Architecture)}."), + }; + + string fileExtension = RunningPlatform.CurrentOS switch +#pragma warning restore CS8509 + { + OperatingSystemType.Linux => "tar.gz", + OperatingSystemType.Windows => "zip" + }; + + return $"{osPrefix}_{archSuffix}.{fileExtension}"; + } } } diff --git a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs index 893ea95ac..38670e5d5 100644 --- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs +++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs @@ -1,17 +1,23 @@ using Avalonia.Controls; using Avalonia.Threading; using FluentAvalonia.UI.Controls; +using Gommon; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Common; using Ryujinx.HLE; using Ryujinx.HLE.HOS.Applets; using Ryujinx.HLE.HOS.Applets.SoftwareKeyboard; +using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; using Ryujinx.HLE.UI; -using Ryujinx.UI.Common.Configuration; using System; +using System.Collections.ObjectModel; +using System.Linq; using System.Threading; namespace Ryujinx.Ava.UI.Applet @@ -35,12 +41,12 @@ namespace Ryujinx.Ava.UI.Applet bool okPressed = false; - if (ConfigurationState.Instance.IgnoreApplet) + if (ConfigurationState.Instance.System.IgnoreControllerApplet) return false; Dispatcher.UIThread.InvokeAsync(async () => { - var response = await ControllerAppletDialog.ShowControllerAppletDialog(_parent, args); + UserResult response = await ControllerAppletDialog.ShowControllerAppletDialog(_parent, args); if (response == UserResult.Ok) { okPressed = true; @@ -69,31 +75,32 @@ namespace Ryujinx.Ava.UI.Applet bool opened = false; UserResult response = await ContentDialogHelper.ShowDeferredContentDialog(_parent, - title, - message, - string.Empty, - LocaleManager.Instance[LocaleKeys.DialogOpenSettingsWindowLabel], - string.Empty, - LocaleManager.Instance[LocaleKeys.SettingsButtonClose], - (int)Symbol.Important, - deferEvent, - async window => - { - if (opened) - { - return; - } + title, + message, + string.Empty, + LocaleManager.Instance[LocaleKeys.DialogOpenSettingsWindowLabel], + string.Empty, + LocaleManager.Instance[LocaleKeys.SettingsButtonClose], + (int)Symbol.Important, + deferEvent, + async window => + { + if (opened) + { + return; + } - opened = true; + opened = true; - _parent.SettingsWindow = new SettingsWindow(_parent.VirtualFileSystem, _parent.ContentManager); + _parent.SettingsWindow = + new SettingsWindow(_parent.VirtualFileSystem, _parent.ContentManager); - await _parent.SettingsWindow.ShowDialog(window); + await StyleableAppWindow.ShowAsync(_parent.SettingsWindow, window); - _parent.SettingsWindow = null; + _parent.SettingsWindow = null; - opened = false; - }); + opened = false; + }); if (response == UserResult.Ok) { @@ -104,7 +111,9 @@ namespace Ryujinx.Ava.UI.Applet } catch (Exception ex) { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogMessageDialogErrorExceptionMessage, ex)); + await ContentDialogHelper.CreateErrorDialog( + LocaleManager.Instance.UpdateAndGetDynamicValue( + LocaleKeys.DialogMessageDialogErrorExceptionMessage, ex)); dialogCloseEvent.Set(); } @@ -128,7 +137,9 @@ namespace Ryujinx.Ava.UI.Applet try { _parent.ViewModel.AppHost.NpadManager.BlockInputUpdates(); - (UserResult result, string userInput) = await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.SoftwareKeyboard], args); + (UserResult result, string userInput) = + await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.SoftwareKeyboard], + args); if (result == UserResult.Ok) { @@ -140,7 +151,9 @@ namespace Ryujinx.Ava.UI.Applet { error = true; - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogSoftwareKeyboardErrorExceptionMessage, ex)); + await ContentDialogHelper.CreateErrorDialog( + LocaleManager.Instance.UpdateAndGetDynamicValue( + LocaleKeys.DialogSoftwareKeyboardErrorExceptionMessage, ex)); } finally { @@ -166,12 +179,15 @@ namespace Ryujinx.Ava.UI.Applet try { _parent.ViewModel.AppHost.NpadManager.BlockInputUpdates(); - SoftwareKeyboardUIArgs args = new SoftwareKeyboardUIArgs(); - args.KeyboardMode = KeyboardMode.Default; - args.InitialText = "Ryujinx"; - args.StringLengthMin = 1; - args.StringLengthMax = 25; - (UserResult result, string userInput) = await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.CabinetDialog], args); + SoftwareKeyboardUIArgs args = new() + { + KeyboardMode = KeyboardMode.Default, + InitialText = "Ryujinx", + StringLengthMin = 1, + StringLengthMax = 25 + }; + (UserResult result, string userInput) = + await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.CabinetDialog], args); if (result == UserResult.Ok) { inputText = userInput; @@ -195,23 +211,25 @@ namespace Ryujinx.Ava.UI.Applet Dispatcher.UIThread.InvokeAsync(async () => { dialogCloseEvent.Set(); - await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.CabinetScanDialog], - string.Empty, - LocaleManager.Instance[LocaleKeys.InputDialogOk], - string.Empty, - LocaleManager.Instance[LocaleKeys.CabinetTitle]); + await ContentDialogHelper.CreateInfoDialog( + LocaleManager.Instance[LocaleKeys.CabinetScanDialog], + string.Empty, + LocaleManager.Instance[LocaleKeys.InputDialogOk], + string.Empty, + LocaleManager.Instance[LocaleKeys.CabinetTitle] + ); }); dialogCloseEvent.WaitOne(); } - public void ExecuteProgram(Switch device, ProgramSpecifyKind kind, ulong value) { device.Configuration.UserChannelPersistence.ExecuteProgram(kind, value); _parent.ViewModel.AppHost?.Stop(); } - public bool DisplayErrorAppletDialog(string title, string message, string[] buttons) + public bool DisplayErrorAppletDialog(string title, string message, string[] buttons, + (uint Module, uint Description)? errorCode = null) { ManualResetEvent dialogCloseEvent = new(false); @@ -243,7 +261,9 @@ namespace Ryujinx.Ava.UI.Applet { dialogCloseEvent.Set(); - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogErrorAppletErrorExceptionMessage, ex)); + await ContentDialogHelper.CreateErrorDialog( + LocaleManager.Instance.UpdateAndGetDynamicValue( + LocaleKeys.DialogErrorAppletErrorExceptionMessage, ex)); } }); @@ -253,5 +273,59 @@ namespace Ryujinx.Ava.UI.Applet } public IDynamicTextInputHandler CreateDynamicTextInputHandler() => new AvaloniaDynamicTextInputHandler(_parent); + + public UserProfile ShowPlayerSelectDialog() + { + UserId selected = UserId.Null; + byte[] defaultGuestImage = EmbeddedResources.Read("Ryujinx.HLE/HOS/Services/Account/Acc/GuestUserImage.jpg"); + UserProfile guest = new(new UserId("00000000000000000000000000000080"), "Guest", defaultGuestImage); + + ManualResetEvent dialogCloseEvent = new(false); + + Dispatcher.UIThread.InvokeAsync(async () => + { + ObservableCollection profiles = []; + NavigationDialogHost nav = new(); + + _parent.AccountManager.GetAllUsers() + .OrderBy(x => x.Name) + .ForEach(profile => profiles.Add(new Models.UserProfile(profile, nav))); + + profiles.Add(new Models.UserProfile(guest, nav)); + ProfileSelectorDialogViewModel viewModel = new() + { + Profiles = profiles, + SelectedUserId = _parent.AccountManager.LastOpenedUser.UserId + }; + (selected, _) = await ProfileSelectorDialog.ShowInputDialog(viewModel); + + dialogCloseEvent.Set(); + }); + + dialogCloseEvent.WaitOne(); + + UserProfile profile = _parent.AccountManager.LastOpenedUser; + if (selected == guest.UserId) + { + profile = guest; + } + else if (selected == UserId.Null) + { + profile = null; + } + else + { + foreach (UserProfile p in _parent.AccountManager.GetAllUsers()) + { + if (p.UserId == selected) + { + profile = p; + break; + } + } + } + + return profile; + } } } diff --git a/src/Ryujinx/UI/Applet/AvaloniaDynamicTextInputHandler.cs b/src/Ryujinx/UI/Applet/AvaloniaDynamicTextInputHandler.cs index 0cd3f18e5..397eab72c 100644 --- a/src/Ryujinx/UI/Applet/AvaloniaDynamicTextInputHandler.cs +++ b/src/Ryujinx/UI/Applet/AvaloniaDynamicTextInputHandler.cs @@ -65,7 +65,7 @@ namespace Ryujinx.Ava.UI.Applet private void AvaloniaDynamicTextInputHandler_KeyRelease(object sender, KeyEventArgs e) { - var key = (HidKey)AvaloniaKeyboardMappingHelper.ToInputKey(e.Key); + HidKey key = (HidKey)AvaloniaKeyboardMappingHelper.ToInputKey(e.Key); if (!(KeyReleasedEvent?.Invoke(key)).GetValueOrDefault(true)) { @@ -85,7 +85,7 @@ namespace Ryujinx.Ava.UI.Applet private void AvaloniaDynamicTextInputHandler_KeyPressed(object sender, KeyEventArgs e) { - var key = (HidKey)AvaloniaKeyboardMappingHelper.ToInputKey(e.Key); + HidKey key = (HidKey)AvaloniaKeyboardMappingHelper.ToInputKey(e.Key); if (!(KeyPressedEvent?.Invoke(key)).GetValueOrDefault(true)) { diff --git a/src/Ryujinx/UI/Applet/AvaloniaHostUITheme.cs b/src/Ryujinx/UI/Applet/AvaloniaHostUITheme.cs index 79a1eacd8..3ab2fdc70 100644 --- a/src/Ryujinx/UI/Applet/AvaloniaHostUITheme.cs +++ b/src/Ryujinx/UI/Applet/AvaloniaHostUITheme.cs @@ -2,29 +2,104 @@ using Avalonia.Media; using Ryujinx.Ava.UI.Windows; using Ryujinx.HLE.UI; using System; +using System.Globalization; namespace Ryujinx.Ava.UI.Applet { - class AvaloniaHostUITheme(MainWindow parent) : IHostUITheme + class AvaloniaHostUITheme : IHostUITheme { - public string FontFamily { get; } = OperatingSystem.IsWindows() && OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) ? "Segoe UI Variable" : parent.FontFamily.Name; + private readonly MainWindow _parent; - public ThemeColor DefaultBackgroundColor { get; } = BrushToThemeColor(parent.Background); - public ThemeColor DefaultForegroundColor { get; } = BrushToThemeColor(parent.Foreground); - public ThemeColor DefaultBorderColor { get; } = BrushToThemeColor(parent.BorderBrush); - public ThemeColor SelectionBackgroundColor { get; } = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionBrush); - public ThemeColor SelectionForegroundColor { get; } = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionForegroundBrush); + public string FontFamily { get; } + public ThemeColor DefaultBackgroundColor { get; } + public ThemeColor DefaultForegroundColor { get; } + public ThemeColor DefaultBorderColor { get; } + public ThemeColor SelectionBackgroundColor { get; } + public ThemeColor SelectionForegroundColor { get; } + + public AvaloniaHostUITheme(MainWindow parent) + { + _parent = parent; + + // Initialize font property + FontFamily = GetSystemFontFamily(); + + // Initialize all properties that depend on parent + DefaultBackgroundColor = BrushToThemeColor(parent.Background); + DefaultForegroundColor = BrushToThemeColor(parent.Foreground); + DefaultBorderColor = BrushToThemeColor(parent.BorderBrush); + SelectionBackgroundColor = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionBrush); + SelectionForegroundColor = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionForegroundBrush); + } + + private string GetSystemFontFamily() + { + if (OperatingSystem.IsWindows()) + { + return GetWindowsFontByLanguage(); + } + else if (OperatingSystem.IsMacOS()) + { + return GetMacOSFontByLanguage(); + } + else // Linux and other platforms + { + return GetLinuxFontByLanguage(); + } + } + + private string GetWindowsFontByLanguage() + { + var culture = CultureInfo.CurrentUICulture; + string langCode = culture.Name; + + return culture.TwoLetterISOLanguageName switch + { + "zh" => langCode == "zh-CN" || langCode == "zh-Hans" || langCode == "zh-SG" + ? "Microsoft YaHei UI" // Simplified Chinese + : "Microsoft JhengHei UI", // Traditional Chinese + + "ja" => "Yu Gothic UI", // Japanese + "ko" => "Malgun Gothic", // Korean + _ => OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) + ? "Segoe UI Variable" // Other languages - Windows 11+ + : _parent.FontFamily.Name // Fallback to parent window font + }; + } + + private string GetMacOSFontByLanguage() + { + return CultureInfo.CurrentUICulture.TwoLetterISOLanguageName switch + { + "zh" => "PingFang SC", // Chinese (both simplified and traditional) + "ja" => "Hiragino Sans", // Japanese + "ko" => "Apple SD Gothic Neo", // Korean + _ => _parent.FontFamily.Name // Fallback to parent window font + }; + } + + private string GetLinuxFontByLanguage() + { + return CultureInfo.CurrentUICulture.TwoLetterISOLanguageName switch + { + "zh" => "Noto Sans CJK SC", // Chinese + "ja" => "Noto Sans CJK JP", // Japanese + "ko" => "Noto Sans CJK KR", // Korean + _ => _parent.FontFamily.Name // Fallback to parent window font + }; + } private static ThemeColor BrushToThemeColor(IBrush brush) { if (brush is SolidColorBrush solidColor) { - return new ThemeColor((float)solidColor.Color.A / 255, + return new ThemeColor( + (float)solidColor.Color.A / 255, (float)solidColor.Color.R / 255, (float)solidColor.Color.G / 255, - (float)solidColor.Color.B / 255); + (float)solidColor.Color.B / 255 + ); } - return new ThemeColor(); } } diff --git a/src/Ryujinx/UI/Applet/ErrorAppletWindow.axaml b/src/Ryujinx/UI/Applet/ErrorAppletWindow.axaml index c7aa56fb8..22c2851e1 100644 --- a/src/Ryujinx/UI/Applet/ErrorAppletWindow.axaml +++ b/src/Ryujinx/UI/Applet/ErrorAppletWindow.axaml @@ -25,7 +25,7 @@ Height="80" MinWidth="50" Margin="5,10,20,10" - Source="resm:Ryujinx.UI.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.UI.Common" /> + Source="resm:Ryujinx.Assets.UIImages.Logo_Ryujinx.png?assembly=Ryujinx" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs b/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs new file mode 100644 index 000000000..838a2f10a --- /dev/null +++ b/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs @@ -0,0 +1,123 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using FluentAvalonia.UI.Controls; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.UI.Controls; +using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Common.Logging; +using Ryujinx.HLE.HOS.Services.Account.Acc; +using System.Collections.ObjectModel; +using System.Threading.Tasks; +using UserProfile = Ryujinx.Ava.UI.Models.UserProfile; +using UserProfileSft = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile; + +namespace Ryujinx.Ava.UI.Applet +{ + public partial class ProfileSelectorDialog : RyujinxControl + { + public ProfileSelectorDialog(ProfileSelectorDialogViewModel viewModel) + { + DataContext = ViewModel = viewModel; + + InitializeComponent(); + } + + private void Grid_PointerEntered(object sender, PointerEventArgs e) + { + if (sender is Grid { DataContext: UserProfile profile }) + { + profile.IsPointerOver = true; + } + } + + private void Grid_OnPointerExited(object sender, PointerEventArgs e) + { + if (sender is Grid { DataContext: UserProfile profile }) + { + profile.IsPointerOver = false; + } + } + + private void ProfilesList_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (sender is ListBox listBox) + { + int selectedIndex = listBox.SelectedIndex; + + if (selectedIndex >= 0 && selectedIndex < ViewModel.Profiles.Count) + { + if (ViewModel.Profiles[selectedIndex] is UserProfile userProfile) + { + ViewModel.SelectedUserId = userProfile.UserId; + Logger.Info?.Print(LogClass.UI, $"Selected: {userProfile.UserId}", "ProfileSelector"); + + ObservableCollection newProfiles = []; + + foreach (BaseModel item in ViewModel.Profiles) + { + if (item is UserProfile originalItem) + { + UserProfileSft profile = new(originalItem.UserId, originalItem.Name, originalItem.Image); + + if (profile.UserId == ViewModel.SelectedUserId) + { + profile.AccountState = AccountState.Open; + } + + newProfiles.Add(new UserProfile(profile, new NavigationDialogHost())); + } + } + + ViewModel.Profiles = newProfiles; + } + } + } + } + + public static async Task<(UserId Id, bool Result)> ShowInputDialog(ProfileSelectorDialogViewModel viewModel) + { + + if (ConfigurationState.Instance.System.SkipUserProfilesManager) + { + UserId defaultId = viewModel.SelectedUserId; + return (defaultId, true); + } + + ContentDialog contentDialog = new() + { + Title = LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle], + PrimaryButtonText = LocaleManager.Instance[LocaleKeys.Continue], + SecondaryButtonText = string.Empty, + CloseButtonText = LocaleManager.Instance[LocaleKeys.Cancel], + Content = new ProfileSelectorDialog(viewModel), + Padding = new Thickness(0) + }; + + UserId result = UserId.Null; + bool input = false; + + contentDialog.Closed += Handler; + + await ContentDialogHelper.ShowAsync(contentDialog); + + return (result, input); + + void Handler(ContentDialog sender, ContentDialogClosedEventArgs eventArgs) + { + if (eventArgs.Result == ContentDialogResult.Primary) + { + result = viewModel.SelectedUserId; + input = true; + } + else + { + result = UserId.Null; + input = false; + } + } + } + } +} diff --git a/src/Ryujinx/UI/Applet/SwkbdAppletDialog.axaml b/src/Ryujinx/UI/Applet/SwkbdAppletDialog.axaml index 0b7304936..dd5e1e324 100644 --- a/src/Ryujinx/UI/Applet/SwkbdAppletDialog.axaml +++ b/src/Ryujinx/UI/Applet/SwkbdAppletDialog.axaml @@ -20,7 +20,7 @@ MinWidth="50" Margin="5,10,20,10" VerticalAlignment="Center" - Source="resm:Ryujinx.UI.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.UI.Common" /> + Source="resm:Ryujinx.Assets.UIImages.Logo_Ryujinx.png?assembly=Ryujinx" /> text.All(NumericCharacterValidation.IsNumeric); + _checkInput = text => text.All(CharacterValidation.IsNumeric); break; case KeyboardMode.Alphabet: localeText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.SoftwareKeyboardModeAlphabet); validationInfoText = string.IsNullOrEmpty(validationInfoText) ? localeText : string.Join("\n", validationInfoText, localeText); - _checkInput = text => text.All(value => !CJKCharacterValidation.IsCJK(value)); + _checkInput = text => text.All(value => !CharacterValidation.IsCJK(value)); break; case KeyboardMode.ASCII: localeText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.SoftwareKeyboardModeASCII); diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml index 951f7f616..fee589297 100644 --- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml +++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml @@ -6,109 +6,166 @@ xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" x:DataType="viewModels:MainWindowViewModel"> + + + + - + + diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs index 74fb41efa..c54cd390c 100644 --- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs +++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs @@ -1,25 +1,25 @@ using Avalonia.Controls; -using Avalonia.Interactivity; using Avalonia.Markup.Xaml; using Avalonia.Platform.Storage; -using Avalonia.Threading; +using CommunityToolkit.Mvvm.Input; using LibHac.Fs; using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.UI.Views.Dialog; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; using Ryujinx.Common.Configuration; +using Ryujinx.Common.Helper; using Ryujinx.HLE.HOS; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Helper; using SkiaSharp; using System; using System.Collections.Generic; using System.IO; -using System.Threading; -using System.Threading.Tasks; using Path = System.IO.Path; namespace Ryujinx.Ava.UI.Controls @@ -35,306 +35,5 @@ namespace Ryujinx.Ava.UI.Controls { AvaloniaXamlLoader.Load(this); } - - public void ToggleFavorite_Click(object sender, RoutedEventArgs args) - { - if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - return; - - viewModel.SelectedApplication.Favorite = !viewModel.SelectedApplication.Favorite; - - ApplicationLibrary.LoadAndSaveMetaData(viewModel.SelectedApplication.IdString, appMetadata => - { - appMetadata.Favorite = viewModel.SelectedApplication.Favorite; - }); - - viewModel.RefreshView(); - } - - public void OpenUserSaveDirectory_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - OpenSaveDirectory(viewModel, SaveDataType.Account, new UserId((ulong)viewModel.AccountManager.LastOpenedUser.UserId.High, (ulong)viewModel.AccountManager.LastOpenedUser.UserId.Low)); - } - - public void OpenDeviceSaveDirectory_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - OpenSaveDirectory(viewModel, SaveDataType.Device, default); - } - - public void OpenBcatSaveDirectory_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - OpenSaveDirectory(viewModel, SaveDataType.Bcat, default); - } - - private static void OpenSaveDirectory(MainWindowViewModel viewModel, SaveDataType saveDataType, UserId userId) - { - var saveDataFilter = SaveDataFilter.Make(viewModel.SelectedApplication.Id, saveDataType, userId, saveDataId: default, index: default); - - ApplicationHelper.OpenSaveDir(in saveDataFilter, viewModel.SelectedApplication.Id, viewModel.SelectedApplication.ControlHolder, viewModel.SelectedApplication.Name); - } - - public async void OpenTitleUpdateManager_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await TitleUpdateWindow.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication); - } - - public async void OpenDownloadableContentManager_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await DownloadableContentManagerWindow.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication); - } - - public async void OpenCheatManager_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await new CheatWindow( - viewModel.VirtualFileSystem, - viewModel.SelectedApplication.IdString, - viewModel.SelectedApplication.Name, - viewModel.SelectedApplication.Path).ShowDialog((Window)viewModel.TopLevel); - } - - public void OpenModsDirectory_Click(object sender, RoutedEventArgs args) - { - if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - return; - - string modsBasePath = ModLoader.GetModsBasePath(); - string titleModsPath = ModLoader.GetApplicationDir(modsBasePath, viewModel.SelectedApplication.IdString); - - OpenHelper.OpenFolder(titleModsPath); - } - - public void OpenSdModsDirectory_Click(object sender, RoutedEventArgs args) - { - if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - return; - - string sdModsBasePath = ModLoader.GetSdModsBasePath(); - string titleModsPath = ModLoader.GetApplicationDir(sdModsBasePath, viewModel.SelectedApplication.IdString); - - OpenHelper.OpenFolder(titleModsPath); - } - - public async void OpenModManager_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await ModManagerWindow.Show(viewModel.SelectedApplication.Id, viewModel.SelectedApplication.Name); - } - - public async void PurgePtcCache_Click(object sender, RoutedEventArgs args) - { - if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - return; - - UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog( - LocaleManager.Instance[LocaleKeys.DialogWarning], - LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogPPTCDeletionMessage, viewModel.SelectedApplication.Name) - ); - - if (result == UserResult.Yes) - { - DirectoryInfo mainDir = new(Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu", "0")); - DirectoryInfo backupDir = new(Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu", "1")); - - List cacheFiles = new(); - - if (mainDir.Exists) - { - cacheFiles.AddRange(mainDir.EnumerateFiles("*.cache")); - } - - if (backupDir.Exists) - { - cacheFiles.AddRange(backupDir.EnumerateFiles("*.cache")); - } - - if (cacheFiles.Count > 0) - { - foreach (FileInfo file in cacheFiles) - { - try - { - file.Delete(); - } - catch (Exception ex) - { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogPPTCDeletionErrorMessage, file.Name, ex)); - } - } - } - } - } - - public async void PurgeShaderCache_Click(object sender, RoutedEventArgs args) - { - if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - return; - - UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog( - LocaleManager.Instance[LocaleKeys.DialogWarning], - LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogShaderDeletionMessage, viewModel.SelectedApplication.Name) - ); - - if (result == UserResult.Yes) - { - DirectoryInfo shaderCacheDir = new(Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "shader")); - - List oldCacheDirectories = new(); - List newCacheFiles = new(); - - if (shaderCacheDir.Exists) - { - oldCacheDirectories.AddRange(shaderCacheDir.EnumerateDirectories("*")); - newCacheFiles.AddRange(shaderCacheDir.GetFiles("*.toc")); - newCacheFiles.AddRange(shaderCacheDir.GetFiles("*.data")); - } - - if ((oldCacheDirectories.Count > 0 || newCacheFiles.Count > 0)) - { - foreach (DirectoryInfo directory in oldCacheDirectories) - { - try - { - directory.Delete(true); - } - catch (Exception ex) - { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogPPTCDeletionErrorMessage, directory.Name, ex)); - } - } - - foreach (FileInfo file in newCacheFiles) - { - try - { - file.Delete(); - } - catch (Exception ex) - { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.ShaderCachePurgeError, file.Name, ex)); - } - } - } - } - } - - public void OpenPtcDirectory_Click(object sender, RoutedEventArgs args) - { - if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - return; - - string ptcDir = Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu"); - string mainDir = Path.Combine(ptcDir, "0"); - string backupDir = Path.Combine(ptcDir, "1"); - - if (!Directory.Exists(ptcDir)) - { - Directory.CreateDirectory(ptcDir); - Directory.CreateDirectory(mainDir); - Directory.CreateDirectory(backupDir); - } - - OpenHelper.OpenFolder(ptcDir); - } - - public void OpenShaderCacheDirectory_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - { - string shaderCacheDir = Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "shader"); - - if (!Directory.Exists(shaderCacheDir)) - { - Directory.CreateDirectory(shaderCacheDir); - } - - OpenHelper.OpenFolder(shaderCacheDir); - } - } - - public async void ExtractApplicationExeFs_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - { - await ApplicationHelper.ExtractSection( - viewModel.StorageProvider, - NcaSectionType.Code, - viewModel.SelectedApplication.Path, - viewModel.SelectedApplication.Name); - } - } - - public async void ExtractApplicationRomFs_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await ApplicationHelper.ExtractSection( - viewModel.StorageProvider, - NcaSectionType.Data, - viewModel.SelectedApplication.Path, - viewModel.SelectedApplication.Name); - } - - public async void ExtractApplicationLogo_Click(object sender, RoutedEventArgs args) - { - if (sender is not MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - return; - - var result = await viewModel.StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions - { - Title = LocaleManager.Instance[LocaleKeys.FolderDialogExtractTitle], - AllowMultiple = false, - }); - - if (result.Count == 0) - return; - - ApplicationHelper.ExtractSection( - result[0].Path.LocalPath, - NcaSectionType.Logo, - viewModel.SelectedApplication.Path, - viewModel.SelectedApplication.Name); - - var iconFile = await result[0].CreateFileAsync($"{viewModel.SelectedApplication.IdString}.png"); - await using var fileStream = await iconFile.OpenWriteAsync(); - - using var bitmap = SKBitmap.Decode(viewModel.SelectedApplication.Icon) - .Resize(new SKSizeI(512, 512), SKFilterQuality.High); - - using var png = bitmap.Encode(SKEncodedImageFormat.Png, 100); - - png.SaveTo(fileStream); - } - - public void CreateApplicationShortcut_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - ShortcutHelper.CreateAppShortcut( - viewModel.SelectedApplication.Path, - viewModel.SelectedApplication.Name, - viewModel.SelectedApplication.IdString, - viewModel.SelectedApplication.Icon - ); - } - - public async void RunApplication_Click(object sender, RoutedEventArgs args) - { - if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await viewModel.LoadApplication(viewModel.SelectedApplication); - } - - public async void TrimXCI_Click(object sender, RoutedEventArgs args) - { - var viewModel = (sender as MenuItem)?.DataContext as MainWindowViewModel; - - if (viewModel?.SelectedApplication != null) - { - await viewModel.TrimXCIFile(viewModel.SelectedApplication.Path); - } - } } } diff --git a/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs deleted file mode 100644 index 5b4a6b8d4..000000000 --- a/src/Ryujinx/UI/Controls/ApplicationListView.axaml.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Interactivity; -using Ryujinx.Ava.UI.Helpers; -using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.UI.App.Common; -using System; - -namespace Ryujinx.Ava.UI.Controls -{ - public partial class ApplicationListView : UserControl - { - public static readonly RoutedEvent ApplicationOpenedEvent = - RoutedEvent.Register(nameof(ApplicationOpened), RoutingStrategies.Bubble); - - public event EventHandler ApplicationOpened - { - add => AddHandler(ApplicationOpenedEvent, value); - remove => RemoveHandler(ApplicationOpenedEvent, value); - } - - public ApplicationListView() => InitializeComponent(); - - public void GameList_DoubleTapped(object sender, TappedEventArgs args) - { - if (sender is ListBox { SelectedItem: ApplicationData selected }) - RaiseEvent(new ApplicationOpenedEventArgs(selected, ApplicationOpenedEvent)); - } - - public void GameList_SelectionChanged(object sender, SelectionChangedEventArgs args) - { - if (DataContext is MainWindowViewModel viewModel && sender is ListBox { SelectedItem: ApplicationData selected }) - viewModel.ListSelectedApplication = selected; - } - } -} diff --git a/src/Ryujinx/UI/Controls/MiniVerticalSeparator.cs b/src/Ryujinx/UI/Controls/MiniVerticalSeparator.cs new file mode 100644 index 000000000..7b802e165 --- /dev/null +++ b/src/Ryujinx/UI/Controls/MiniVerticalSeparator.cs @@ -0,0 +1,19 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Media; + +namespace Ryujinx.Ava.UI.Controls +{ + public class MiniVerticalSeparator : Border + { + public MiniVerticalSeparator() + { + Width = 2; + Height = 12; + Margin = new Thickness(); + BorderBrush = Brushes.Gray; + Background = Brushes.Gray; + BorderThickness = new Thickness(1); + } + } +} diff --git a/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs b/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs index c27a3ac9b..fb0bd5e82 100644 --- a/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs +++ b/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs @@ -23,13 +23,12 @@ using UserProfile = Ryujinx.Ava.UI.Models.UserProfile; namespace Ryujinx.Ava.UI.Controls { - public partial class NavigationDialogHost : UserControl + public partial class NavigationDialogHost : RyujinxControl { public AccountManager AccountManager { get; } public ContentManager ContentManager { get; } public VirtualFileSystem VirtualFileSystem { get; } public HorizonClient HorizonClient { get; } - public UserProfileViewModel ViewModel { get; set; } public NavigationDialogHost() { @@ -69,7 +68,7 @@ namespace Ryujinx.Ava.UI.Controls VirtualFileSystem ownerVirtualFileSystem, HorizonClient ownerHorizonClient) { - var content = new NavigationDialogHost(ownerAccountManager, ownerContentManager, ownerVirtualFileSystem, ownerHorizonClient); + NavigationDialogHost content = new(ownerAccountManager, ownerContentManager, ownerVirtualFileSystem, ownerHorizonClient); ContentDialog contentDialog = new() { Title = LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle], @@ -106,15 +105,15 @@ namespace Ryujinx.Ava.UI.Controls .OrderBy(x => x.Name) .ForEach(profile => ViewModel.Profiles.Add(new UserProfile(profile, this))); - var saveDataFilter = SaveDataFilter.Make(programId: default, saveType: SaveDataType.Account, default, saveDataId: default, index: default); + SaveDataFilter saveDataFilter = SaveDataFilter.Make(programId: default, saveType: SaveDataType.Account, default, saveDataId: default, index: default); - using var saveDataIterator = new UniqueRef(); + using UniqueRef saveDataIterator = new(); HorizonClient.Fs.OpenSaveDataIterator(ref saveDataIterator.Ref, SaveDataSpaceId.User, in saveDataFilter).ThrowIfFailure(); Span saveDataInfo = stackalloc SaveDataInfo[10]; - HashSet lostAccounts = new(); + HashSet lostAccounts = []; while (true) { @@ -127,8 +126,8 @@ namespace Ryujinx.Ava.UI.Controls for (int i = 0; i < readCount; i++) { - var save = saveDataInfo[i]; - var id = new UserId((long)save.UserId.Id.Low, (long)save.UserId.Id.High); + SaveDataInfo save = saveDataInfo[i]; + UserId id = new((long)save.UserId.Id.Low, (long)save.UserId.Id.High); if (ViewModel.Profiles.Cast().FirstOrDefault(x => x.UserId == id) == null) { lostAccounts.Add(id); @@ -136,7 +135,7 @@ namespace Ryujinx.Ava.UI.Controls } } - foreach (var account in lostAccounts) + foreach (UserId account in lostAccounts) { ViewModel.LostProfiles.Add(new UserProfile(new HLE.HOS.Services.Account.Acc.UserProfile(account, string.Empty, null), this)); } @@ -146,26 +145,26 @@ namespace Ryujinx.Ava.UI.Controls public async void DeleteUser(UserProfile userProfile) { - var lastUserId = AccountManager.LastOpenedUser.UserId; + UserId lastUserId = AccountManager.LastOpenedUser.UserId; if (userProfile.UserId == lastUserId) { // If we are deleting the currently open profile, then we must open something else before deleting. - var profile = ViewModel.Profiles.Cast().FirstOrDefault(x => x.UserId != lastUserId); + UserProfile profile = ViewModel.Profiles.Cast().FirstOrDefault(x => x.UserId != lastUserId); if (profile == null) { - _ = Dispatcher.UIThread.InvokeAsync(async () + _ = Dispatcher.UIThread.InvokeAsync(async () => await ContentDialogHelper.CreateErrorDialog( LocaleManager.Instance[LocaleKeys.DialogUserProfileDeletionWarningMessage])); return; - } + } AccountManager.OpenUser(profile.UserId); } - var result = await ContentDialogHelper.CreateConfirmationDialog( + UserResult result = await ContentDialogHelper.CreateConfirmationDialog( LocaleManager.Instance[LocaleKeys.DialogUserProfileDeletionConfirmMessage], string.Empty, LocaleManager.Instance[LocaleKeys.InputDialogYes], diff --git a/src/Ryujinx/UI/Controls/RyujinxControl.cs b/src/Ryujinx/UI/Controls/RyujinxControl.cs new file mode 100644 index 000000000..f63f3f537 --- /dev/null +++ b/src/Ryujinx/UI/Controls/RyujinxControl.cs @@ -0,0 +1,24 @@ +using Avalonia.Controls; +using Gommon; +using Ryujinx.Ava.UI.ViewModels; +using System; + +namespace Ryujinx.Ava.UI.Controls +{ + public class RyujinxControl : UserControl where TViewModel : BaseModel + { + public TViewModel ViewModel + { + get + { + if (DataContext is not TViewModel viewModel) + throw new InvalidOperationException( + $"Underlying DataContext is not of type {typeof(TViewModel).AsPrettyString()}; " + + $"Actual type is {DataContext?.GetType().AsPrettyString()}"); + + return viewModel; + } + set => DataContext = value; + } + } +} diff --git a/src/Ryujinx/UI/Controls/RyujinxLogo.cs b/src/Ryujinx/UI/Controls/RyujinxLogo.cs new file mode 100644 index 000000000..e1908fc2b --- /dev/null +++ b/src/Ryujinx/UI/Controls/RyujinxLogo.cs @@ -0,0 +1,28 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Media.Imaging; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.UI.ViewModels; +using System.Reflection; + +namespace Ryujinx.Ava.UI.Controls +{ + public class RyujinxLogo : Image + { + // The UI specifically uses a thicker bordered variant of the icon to avoid crunching out the border at lower resolutions. + // For an example of this, download canary 1.2.95, then open the settings menu, and look at the icon in the top-left. + // The border gets reduced to colored pixels in the 4 corners. + public static readonly Bitmap Bitmap = + new(Assembly.GetAssembly(typeof(MainWindowViewModel))! + .GetManifestResourceStream("Ryujinx.Assets.UIImages.Logo_Ryujinx_AntiAlias.png")!); + + public RyujinxLogo() + { + Margin = new Thickness(7, 7, 7, 0); + Height = 25; + Width = 25; + Source = Bitmap; + IsVisible = !ConfigurationState.Instance.ShowOldUI; + } + } +} diff --git a/src/Ryujinx/UI/Controls/SliderScroll.axaml.cs b/src/Ryujinx/UI/Controls/SliderScroll.cs similarity index 100% rename from src/Ryujinx/UI/Controls/SliderScroll.axaml.cs rename to src/Ryujinx/UI/Controls/SliderScroll.cs diff --git a/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs b/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs index bc5622b54..93f6b4c3c 100644 --- a/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs +++ b/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs @@ -1,5 +1,5 @@ using Avalonia.Interactivity; -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Systems.AppLibrary; namespace Ryujinx.Ava.UI.Helpers { diff --git a/src/Ryujinx/UI/Helpers/AvaloniaListExtensions.cs b/src/Ryujinx/UI/Helpers/AvaloniaListExtensions.cs index b3bb53bd0..60251a70f 100644 --- a/src/Ryujinx/UI/Helpers/AvaloniaListExtensions.cs +++ b/src/Ryujinx/UI/Helpers/AvaloniaListExtensions.cs @@ -21,7 +21,7 @@ namespace Ryujinx.Ava.UI.Helpers /// public static bool ReplaceWith(this AvaloniaList list, T item, bool addIfNotFound = true) { - var index = list.IndexOf(item); + int index = list.IndexOf(item); if (index != -1) { @@ -45,9 +45,9 @@ namespace Ryujinx.Ava.UI.Helpers /// The items to use as matching records to search for in the `sourceList', if not found this item will be added instead public static void AddOrReplaceMatching(this AvaloniaList list, IList sourceList, IList matchingList) { - foreach (var match in matchingList) + foreach (T match in matchingList) { - var index = sourceList.IndexOf(match); + int index = sourceList.IndexOf(match); if (index != -1) { list.ReplaceWith(sourceList[index]); @@ -59,4 +59,4 @@ namespace Ryujinx.Ava.UI.Helpers } } } -} \ No newline at end of file +} diff --git a/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs b/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs index 2781a32b1..a3939abf7 100644 --- a/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs +++ b/src/Ryujinx/UI/Helpers/ButtonKeyAssigner.cs @@ -83,8 +83,13 @@ namespace Ryujinx.Ava.UI.Helpers ToggledButton.IsChecked = false; - ButtonAssigned?.Invoke(this, new ButtonAssignedEventArgs(ToggledButton, pressedButton)); + if (pressedButton.HasValue && pressedButton.Value.AsHidType() == Key.BackSpace) + { + ButtonAssigned?.Invoke(this, new ButtonAssignedEventArgs(ToggledButton, new Button(Key.Unbound))); + return; + } + ButtonAssigned?.Invoke(this, new ButtonAssignedEventArgs(ToggledButton, pressedButton)); }); } diff --git a/src/Ryujinx/UI/Helpers/Commands.cs b/src/Ryujinx/UI/Helpers/Commands.cs new file mode 100644 index 000000000..7ca35e885 --- /dev/null +++ b/src/Ryujinx/UI/Helpers/Commands.cs @@ -0,0 +1,48 @@ +using CommunityToolkit.Mvvm.Input; +using System; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.UI.Helpers +{ +#nullable enable + public static class Commands + { + public static RelayCommand Create(Action action) + => new(action); + public static RelayCommand CreateConditional(Func canExecute, Action action) + => new(action, canExecute); + + public static RelayCommand Create(Action action) + => new(action); + public static RelayCommand CreateConditional(Predicate canExecute, Action action) + => new(action, canExecute); + + public static AsyncRelayCommand Create(Func action) + => new(action, AsyncRelayCommandOptions.None); + public static AsyncRelayCommand CreateConcurrent(Func action) + => new(action, AsyncRelayCommandOptions.AllowConcurrentExecutions); + public static AsyncRelayCommand CreateSilentFail(Func action) + => new(action, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); + + public static AsyncRelayCommand Create(Func action) + => new(action, AsyncRelayCommandOptions.None); + public static AsyncRelayCommand CreateConcurrent(Func action) + => new(action, AsyncRelayCommandOptions.AllowConcurrentExecutions); + public static AsyncRelayCommand CreateSilentFail(Func action) + => new(action, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); + + public static AsyncRelayCommand CreateConditional(Func canExecute, Func action) + => new(action, canExecute, AsyncRelayCommandOptions.None); + public static AsyncRelayCommand CreateConcurrentConditional(Func canExecute, Func action) + => new(action, canExecute, AsyncRelayCommandOptions.AllowConcurrentExecutions); + public static AsyncRelayCommand CreateSilentFailConditional(Func canExecute, Func action) + => new(action, canExecute, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); + + public static AsyncRelayCommand CreateConditional(Predicate canExecute, Func action) + => new(action, canExecute, AsyncRelayCommandOptions.None); + public static AsyncRelayCommand CreateConcurrentConditional(Predicate canExecute, Func action) + => new(action, canExecute, AsyncRelayCommandOptions.AllowConcurrentExecutions); + public static AsyncRelayCommand CreateSilentFailConditional(Predicate canExecute, Func action) + => new(action, canExecute, AsyncRelayCommandOptions.FlowExceptionsToTaskScheduler); + } +} diff --git a/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs b/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs index 3f0f0f033..e8730913c 100644 --- a/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs +++ b/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs @@ -1,8 +1,10 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Input; using Avalonia.Layout; using Avalonia.Media; +using Avalonia.Styling; using Avalonia.Threading; using FluentAvalonia.Core; using FluentAvalonia.UI.Controls; @@ -20,6 +22,23 @@ namespace Ryujinx.Ava.UI.Helpers private static bool _isChoiceDialogOpen; private static ContentDialogOverlayWindow _contentDialogOverlayWindow; + public static ContentDialog ApplyStyles( + this ContentDialog contentDialog, + double closeButtonWidth = 80, + HorizontalAlignment buttonSpaceAlignment = HorizontalAlignment.Right) + { + Style closeButton = new(x => x.Name("CloseButton")); + closeButton.Setters.Add(new Setter(Layoutable.WidthProperty, closeButtonWidth)); + + Style closeButtonParent = new(x => x.Name("CommandSpace")); + closeButtonParent.Setters.Add(new Setter(Layoutable.HorizontalAlignmentProperty, buttonSpaceAlignment)); + + contentDialog.Styles.Add(closeButton); + contentDialog.Styles.Add(closeButtonParent); + + return contentDialog; + } + private async static Task ShowContentDialog( string title, object content, @@ -39,19 +58,19 @@ namespace Ryujinx.Ava.UI.Helpers SecondaryButtonText = secondaryButton, CloseButtonText = closeButton, Content = content, - PrimaryButtonCommand = MiniCommand.Create(() => + PrimaryButtonCommand = Commands.Create(() => { result = primaryButtonResult; }) }; - contentDialog.SecondaryButtonCommand = MiniCommand.Create(() => + contentDialog.SecondaryButtonCommand = Commands.Create(() => { result = UserResult.No; contentDialog.PrimaryButtonClick -= deferCloseAction; }); - contentDialog.CloseButtonCommand = MiniCommand.Create(() => + contentDialog.CloseButtonCommand = Commands.Create(() => { result = UserResult.Cancel; contentDialog.PrimaryButtonClick -= deferCloseAction; @@ -121,7 +140,7 @@ namespace Ryujinx.Ava.UI.Helpers startedDeferring = true; - var deferral = args.GetDeferral(); + Deferral deferral = args.GetDeferral(); sender.PrimaryButtonClick -= DeferClose; @@ -159,6 +178,7 @@ namespace Ryujinx.Ava.UI.Helpers Symbol = (Symbol)symbol, Margin = new Thickness(10), FontSize = 40, + FlowDirection = FlowDirection.LeftToRight, VerticalAlignment = VerticalAlignment.Center, }; @@ -261,7 +281,7 @@ namespace Ryujinx.Ava.UI.Helpers string.Empty, LocaleManager.Instance[LocaleKeys.InputDialogOk], (int)Symbol.Important); - + internal static async Task CreateUpdaterUpToDateInfoDialog(string primary, string secondaryText) => await ShowTextDialog( LocaleManager.Instance[LocaleKeys.DialogUpdaterTitle], @@ -319,7 +339,7 @@ namespace Ryujinx.Ava.UI.Helpers return response == UserResult.Yes; } - + internal static async Task CreateUpdaterChoiceDialog(string title, string primary, string secondaryText) { if (_isChoiceDialogOpen) @@ -384,6 +404,10 @@ namespace Ryujinx.Ava.UI.Helpers ShowInTaskbar = false, }; +#if DEBUG + _contentDialogOverlayWindow.AttachDevTools(new KeyGesture(Key.F12, KeyModifiers.Control)); +#endif + parent.PositionChanged += OverlayOnPositionChanged; void OverlayOnPositionChanged(object sender, PixelPointEventArgs e) @@ -456,7 +480,7 @@ namespace Ryujinx.Ava.UI.Helpers await dialogWindow.ShowDialog(_contentDialogOverlayWindow ?? mainWindow ?? GetMainWindow()); } - private static Window GetMainWindow() + private static MainWindow GetMainWindow() { if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime al) { diff --git a/src/Ryujinx/UI/Helpers/BitmapArrayValueConverter.cs b/src/Ryujinx/UI/Helpers/Converters/BitmapArrayValueConverter.cs similarity index 92% rename from src/Ryujinx/UI/Helpers/BitmapArrayValueConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/BitmapArrayValueConverter.cs index 7b599a48b..750523068 100644 --- a/src/Ryujinx/UI/Helpers/BitmapArrayValueConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/BitmapArrayValueConverter.cs @@ -9,7 +9,7 @@ namespace Ryujinx.Ava.UI.Helpers { internal class BitmapArrayValueConverter : IValueConverter { - public static BitmapArrayValueConverter Instance = new(); + public static readonly BitmapArrayValueConverter Instance = new(); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { diff --git a/src/Ryujinx/UI/Helpers/DownloadableContentLabelConverter.cs b/src/Ryujinx/UI/Helpers/Converters/DownloadableContentLabelConverter.cs similarity index 93% rename from src/Ryujinx/UI/Helpers/DownloadableContentLabelConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/DownloadableContentLabelConverter.cs index 22193b97e..8053c1b65 100644 --- a/src/Ryujinx/UI/Helpers/DownloadableContentLabelConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/DownloadableContentLabelConverter.cs @@ -11,7 +11,7 @@ namespace Ryujinx.Ava.UI.Helpers { internal class DownloadableContentLabelConverter : IMultiValueConverter { - public static DownloadableContentLabelConverter Instance = new(); + public static readonly DownloadableContentLabelConverter Instance = new(); public object Convert(IList values, Type targetType, object parameter, CultureInfo culture) { @@ -37,6 +37,5 @@ namespace Ryujinx.Ava.UI.Helpers { throw new NotImplementedException(); } - } } diff --git a/src/Ryujinx/UI/Helpers/GlyphValueConverter.cs b/src/Ryujinx/UI/Helpers/Converters/GlyphValueConverter.cs similarity index 92% rename from src/Ryujinx/UI/Helpers/GlyphValueConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/GlyphValueConverter.cs index 6196421c8..fe50aab58 100644 --- a/src/Ryujinx/UI/Helpers/GlyphValueConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/GlyphValueConverter.cs @@ -23,7 +23,7 @@ namespace Ryujinx.Ava.UI.Helpers } public string this[string key] => - _glyphs.TryGetValue(Enum.Parse(key), out var val) + _glyphs.TryGetValue(Enum.Parse(key), out string val) ? val : string.Empty; diff --git a/src/Ryujinx/UI/Helpers/KeyValueConverter.cs b/src/Ryujinx/UI/Helpers/Converters/KeyValueConverter.cs similarity index 99% rename from src/Ryujinx/UI/Helpers/KeyValueConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/KeyValueConverter.cs index d20098426..d153adc74 100644 --- a/src/Ryujinx/UI/Helpers/KeyValueConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/KeyValueConverter.cs @@ -10,7 +10,7 @@ namespace Ryujinx.Ava.UI.Helpers { internal class KeyValueConverter : IValueConverter { - public static KeyValueConverter Instance = new(); + public static readonly KeyValueConverter Instance = new(); private static readonly Dictionary _keysMap = new() { @@ -150,6 +150,7 @@ namespace Ryujinx.Ava.UI.Helpers { keyString = key.ToString(); } + break; case GamepadInputId gamepadInputId: if (_gamepadInputIdMap.TryGetValue(gamepadInputId, out localeKey)) @@ -160,6 +161,7 @@ namespace Ryujinx.Ava.UI.Helpers { keyString = gamepadInputId.ToString(); } + break; case StickInputId stickInputId: if (_stickInputIdMap.TryGetValue(stickInputId, out localeKey)) @@ -170,6 +172,7 @@ namespace Ryujinx.Ava.UI.Helpers { keyString = stickInputId.ToString(); } + break; } diff --git a/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs b/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs similarity index 50% rename from src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs index 8bd8b5f0d..28552d611 100644 --- a/src/Ryujinx/UI/Helpers/MultiplayerInfoConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs @@ -1,34 +1,31 @@ using Avalonia.Data.Converters; using Avalonia.Markup.Xaml; +using Gommon; using Ryujinx.Ava.Common.Locale; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Helper; +using Ryujinx.Ava.Systems.AppLibrary; using System; using System.Globalization; +using System.Text; namespace Ryujinx.Ava.UI.Helpers { internal class MultiplayerInfoConverter : MarkupExtension, IValueConverter { - private static readonly MultiplayerInfoConverter _instance = new(); + public static readonly MultiplayerInfoConverter Instance = new(); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { - if (value is ApplicationData applicationData) - { - if (applicationData.PlayerCount != 0 && applicationData.GameCount != 0) - { - return $"Hosted Games: {applicationData.GameCount}\nOnline Players: {applicationData.PlayerCount}"; - } - else - { - return ""; - } - } - else - { + if (value is not ApplicationData { HasLdnGames: true } applicationData) return ""; - } + + return new StringBuilder() + .AppendLine( + LocaleManager.Instance[LocaleKeys.GameListHeaderHostedGames] + .Format(applicationData.GameCount)) + .Append( + LocaleManager.Instance[LocaleKeys.GameListHeaderPlayerCount] + .Format(applicationData.PlayerCount)) + .ToString(); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) @@ -38,7 +35,7 @@ namespace Ryujinx.Ava.UI.Helpers public override object ProvideValue(IServiceProvider serviceProvider) { - return _instance; + return Instance; } } } diff --git a/src/Ryujinx/UI/Helpers/Converters/PlayabilityStatusConverter.cs b/src/Ryujinx/UI/Helpers/Converters/PlayabilityStatusConverter.cs new file mode 100644 index 000000000..dce42fa29 --- /dev/null +++ b/src/Ryujinx/UI/Helpers/Converters/PlayabilityStatusConverter.cs @@ -0,0 +1,28 @@ +using Avalonia.Data.Converters; +using Avalonia.Media; +using Gommon; +using Ryujinx.Ava.Common.Locale; +using System; +using System.Globalization; + +namespace Ryujinx.Ava.UI.Helpers +{ + public class PlayabilityStatusConverter : IValueConverter + { + private static readonly Lazy _shared = new(() => new()); + public static PlayabilityStatusConverter Shared => _shared.Value; + + public object Convert(object value, Type _, object __, CultureInfo ___) + => value.Cast() switch + { + LocaleKeys.CompatibilityListNothing or + LocaleKeys.CompatibilityListBoots or + LocaleKeys.CompatibilityListMenus => Brushes.Red, + LocaleKeys.CompatibilityListIngame => Brushes.DarkOrange, + _ => Brushes.ForestGreen + }; + + public object ConvertBack(object value, Type _, object __, CultureInfo ___) + => throw new NotSupportedException(); + } +} diff --git a/src/Ryujinx/UI/Helpers/TimeZoneConverter.cs b/src/Ryujinx/UI/Helpers/Converters/TimeZoneConverter.cs similarity index 100% rename from src/Ryujinx/UI/Helpers/TimeZoneConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/TimeZoneConverter.cs diff --git a/src/Ryujinx/UI/Helpers/TitleUpdateLabelConverter.cs b/src/Ryujinx/UI/Helpers/Converters/TitleUpdateLabelConverter.cs similarity index 84% rename from src/Ryujinx/UI/Helpers/TitleUpdateLabelConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/TitleUpdateLabelConverter.cs index cbb6edff1..f1e6b8958 100644 --- a/src/Ryujinx/UI/Helpers/TitleUpdateLabelConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/TitleUpdateLabelConverter.cs @@ -11,7 +11,7 @@ namespace Ryujinx.Ava.UI.Helpers { internal class TitleUpdateLabelConverter : IMultiValueConverter { - public static TitleUpdateLabelConverter Instance = new(); + public static readonly TitleUpdateLabelConverter Instance = new(); public object Convert(IList values, Type targetType, object parameter, CultureInfo culture) { @@ -30,7 +30,7 @@ namespace Ryujinx.Ava.UI.Helpers return null; } - var key = isBundled ? LocaleKeys.TitleBundledUpdateVersionLabel : LocaleKeys.TitleUpdateVersionLabel; + LocaleKeys key = isBundled ? LocaleKeys.TitleBundledUpdateVersionLabel : LocaleKeys.TitleUpdateVersionLabel; return LocaleManager.Instance.UpdateAndGetDynamicValue(key, label); } diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileSpaceSavingsConverter.cs similarity index 77% rename from src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileSpaceSavingsConverter.cs index c6e814e90..d70a795c0 100644 --- a/src/Ryujinx/UI/Helpers/XCITrimmerFileSpaceSavingsConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileSpaceSavingsConverter.cs @@ -1,8 +1,9 @@ using Avalonia; using Avalonia.Data; using Avalonia.Data.Converters; +using Gommon; using Ryujinx.Ava.Common.Locale; -using Ryujinx.UI.Common.Models; +using Ryujinx.Ava.Common.Models; using System; using System.Globalization; @@ -11,7 +12,7 @@ namespace Ryujinx.Ava.UI.Helpers internal class XCITrimmerFileSpaceSavingsConverter : IValueConverter { private const long _bytesPerMB = 1024 * 1024; - public static XCITrimmerFileSpaceSavingsConverter Instance = new(); + public static readonly XCITrimmerFileSpaceSavingsConverter Instance = new(); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { @@ -32,11 +33,11 @@ namespace Ryujinx.Ava.UI.Helpers if (app.CurrentSavingsB < app.PotentialSavingsB) { - return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TitleXCICanSaveLabel, (app.PotentialSavingsB - app.CurrentSavingsB) / _bytesPerMB); + return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TitleXCICanSaveLabel, ((app.PotentialSavingsB - app.CurrentSavingsB) / _bytesPerMB).CoerceAtLeast(0)); } else { - return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TitleXCISavingLabel, app.CurrentSavingsB / _bytesPerMB); + return LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TitleXCISavingLabel, (app.CurrentSavingsB / _bytesPerMB).CoerceAtLeast(0)); } } diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusConverter.cs b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs similarity index 86% rename from src/Ryujinx/UI/Helpers/XCITrimmerFileStatusConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs index 56a102415..9a0e9fcbf 100644 --- a/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusConverter.cs @@ -2,7 +2,7 @@ using Avalonia; using Avalonia.Data; using Avalonia.Data.Converters; using Ryujinx.Ava.Common.Locale; -using Ryujinx.UI.Common.Models; +using Ryujinx.Ava.Common.Models; using System; using System.Globalization; using static Ryujinx.Common.Utilities.XCIFileTrimmer; @@ -31,7 +31,7 @@ namespace Ryujinx.Ava.UI.Helpers } return app.PercentageProgress != null ? String.Empty : - app.ProcessingOutcome != OperationOutcome.Successful && app.ProcessingOutcome != OperationOutcome.Undetermined ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusFailedLabel] : + app.ProcessingOutcome is not OperationOutcome.Successful and not OperationOutcome.Undetermined ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusFailedLabel] : app.Trimmable & app.Untrimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusPartialLabel] : app.Trimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusTrimmableLabel] : app.Untrimmable ? LocaleManager.Instance[LocaleKeys.TitleXCIStatusUntrimmableLabel] : diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusDetailConverter.cs b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusDetailConverter.cs similarity index 84% rename from src/Ryujinx/UI/Helpers/XCITrimmerFileStatusDetailConverter.cs rename to src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusDetailConverter.cs index cd4e27f01..b83fe485d 100644 --- a/src/Ryujinx/UI/Helpers/XCITrimmerFileStatusDetailConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/XCITrimmerFileStatusDetailConverter.cs @@ -1,7 +1,7 @@ using Avalonia; using Avalonia.Data; using Avalonia.Data.Converters; -using Ryujinx.UI.Common.Models; +using Ryujinx.Ava.Common.Models; using System; using System.Globalization; using static Ryujinx.Common.Utilities.XCIFileTrimmer; @@ -30,7 +30,7 @@ namespace Ryujinx.Ava.UI.Helpers } return app.PercentageProgress != null ? null : - app.ProcessingOutcome != OperationOutcome.Successful && app.ProcessingOutcome != OperationOutcome.Undetermined ? app.ProcessingOutcome.ToLocalisedText() : + app.ProcessingOutcome is not OperationOutcome.Successful and not OperationOutcome.Undetermined ? app.ProcessingOutcome.ToLocalisedText() : null; } diff --git a/src/Ryujinx/UI/Windows/IconColorPicker.cs b/src/Ryujinx/UI/Helpers/IconColorPicker.cs similarity index 85% rename from src/Ryujinx/UI/Windows/IconColorPicker.cs rename to src/Ryujinx/UI/Helpers/IconColorPicker.cs index bfa33eb43..f73f58c17 100644 --- a/src/Ryujinx/UI/Windows/IconColorPicker.cs +++ b/src/Ryujinx/UI/Helpers/IconColorPicker.cs @@ -2,9 +2,9 @@ using SkiaSharp; using System; using System.Collections.Generic; -namespace Ryujinx.Ava.UI.Windows +namespace Ryujinx.Ava.UI.Helpers { - static class IconColorPicker + public static class IconColorPicker { private const int ColorsPerLine = 64; private const int TotalColors = ColorsPerLine * ColorsPerLine; @@ -29,8 +29,7 @@ namespace Ryujinx.Ava.UI.Windows public static SKColor GetFilteredColor(SKBitmap image) { - var color = GetColor(image); - + SKColor color = GetColor(image); // We don't want colors that are too dark. // If the color is too dark, make it brighter by reducing the range @@ -49,10 +48,10 @@ namespace Ryujinx.Ava.UI.Windows public static SKColor GetColor(SKBitmap image) { - var colors = new PaletteColor[TotalColors]; - var dominantColorBin = new Dictionary(); + PaletteColor[] colors = new PaletteColor[TotalColors]; + Dictionary dominantColorBin = new(); - var buffer = GetBuffer(image); + SKColor[] buffer = GetBuffer(image); int i = 0; int maxHitCount = 0; @@ -70,7 +69,7 @@ namespace Ryujinx.Ava.UI.Windows byte cg = pixel.Green; byte cb = pixel.Blue; - var qck = GetQuantizedColorKey(cr, cg, cb); + int qck = GetQuantizedColorKey(cr, cg, cb); if (dominantColorBin.TryGetValue(qck, out int hitCount)) { @@ -95,7 +94,7 @@ namespace Ryujinx.Ava.UI.Windows for (i = 0; i < TotalColors; i++) { - var score = GetColorScore(dominantColorBin, maxHitCount, colors[i]); + int score = GetColorScore(dominantColorBin, maxHitCount, colors[i]); if (highScore < score) { @@ -109,7 +108,7 @@ namespace Ryujinx.Ava.UI.Windows public static SKColor[] GetBuffer(SKBitmap image) { - var pixels = new SKColor[image.Width * image.Height]; + SKColor[] pixels = new SKColor[image.Width * image.Height]; for (int y = 0; y < image.Height; y++) { @@ -124,17 +123,17 @@ namespace Ryujinx.Ava.UI.Windows private static int GetColorScore(Dictionary dominantColorBin, int maxHitCount, PaletteColor color) { - var hitCount = dominantColorBin[color.Qck]; - var balancedHitCount = BalanceHitCount(hitCount, maxHitCount); - var quantSat = (GetColorSaturation(color) >> SatQuantShift) << SatQuantShift; - var value = GetColorValue(color); + int hitCount = dominantColorBin[color.Qck]; + int balancedHitCount = BalanceHitCount(hitCount, maxHitCount); + int quantSat = (GetColorSaturation(color) >> SatQuantShift) << SatQuantShift; + int value = GetColorValue(color); // If the color is rarely used on the image, // then chances are that there's a better candidate, even if the saturation value // is high. By multiplying the saturation value with a weight, we can lower // it if the color is almost never used (hit count is low). - var satWeighted = quantSat; - var satWeight = balancedHitCount << 5; + int satWeighted = quantSat; + int satWeight = balancedHitCount << 5; if (satWeight < 0x100) { satWeighted = (satWeighted * satWeight) >> 8; @@ -142,7 +141,7 @@ namespace Ryujinx.Ava.UI.Windows // Compute score from saturation and dominance of the color. // We prefer more vivid colors over dominant ones, so give more weight to the saturation. - var score = ((satWeighted << 1) + balancedHitCount) * value; + int score = ((satWeighted << 1) + balancedHitCount) * value; return score; } diff --git a/src/Ryujinx/UI/Helpers/LoggerAdapter.cs b/src/Ryujinx/UI/Helpers/LoggerAdapter.cs index 7982c17a6..c9d1c79c2 100644 --- a/src/Ryujinx/UI/Helpers/LoggerAdapter.cs +++ b/src/Ryujinx/UI/Helpers/LoggerAdapter.cs @@ -1,6 +1,7 @@ using Avalonia.Logging; using Avalonia.Utilities; using Gommon; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common.Logging; using System; using System.Text; @@ -14,20 +15,27 @@ namespace Ryujinx.Ava.UI.Helpers internal class LoggerAdapter : ILogSink { + private static bool _avaloniaLogsEnabled = ConfigurationState.Instance.Logger.EnableAvaloniaLog; + public static void Register() { AvaLogger.Sink = new LoggerAdapter(); + ConfigurationState.Instance.Logger.EnableAvaloniaLog.Event + += (_, e) => _avaloniaLogsEnabled = e.NewValue; } - private static RyuLogger.Log? GetLog(AvaLogLevel level) + private static RyuLogger.Log? GetLog(AvaLogLevel level, string area) { + if (!_avaloniaLogsEnabled) + return null; + return level switch { AvaLogLevel.Verbose => RyuLogger.Debug, AvaLogLevel.Debug => RyuLogger.Debug, AvaLogLevel.Information => RyuLogger.Debug, AvaLogLevel.Warning => RyuLogger.Debug, - AvaLogLevel.Error => RyuLogger.Error, + AvaLogLevel.Error => area is "IME" ? RyuLogger.Debug : RyuLogger.Error, AvaLogLevel.Fatal => RyuLogger.Error, _ => throw new ArgumentOutOfRangeException(nameof(level), level, null), }; @@ -35,23 +43,23 @@ namespace Ryujinx.Ava.UI.Helpers public bool IsEnabled(AvaLogLevel level, string area) { - return GetLog(level) != null; + return GetLog(level, area) != null; } public void Log(AvaLogLevel level, string area, object source, string messageTemplate) { - GetLog(level)?.PrintMsg(RyuLogClass.UI, Format(level, area, messageTemplate, source, null)); + GetLog(level, area)?.PrintMsg(RyuLogClass.UI, Format(level, area, messageTemplate, source, null)); } public void Log(AvaLogLevel level, string area, object source, string messageTemplate, params object[] propertyValues) { - GetLog(level)?.PrintMsg(RyuLogClass.UI, Format(level, area, messageTemplate, source, propertyValues)); + GetLog(level, area)?.PrintMsg(RyuLogClass.UI, Format(level, area, messageTemplate, source, propertyValues)); } private static string Format(AvaLogLevel level, string area, string template, object source, object[] v) { - var result = new StringBuilder(); - var r = new CharacterReader(template.AsSpan()); + StringBuilder result = new(); + CharacterReader r = new(template.AsSpan()); int i = 0; result.Append('['); @@ -64,7 +72,7 @@ namespace Ryujinx.Ava.UI.Helpers while (!r.End) { - var c = r.Take(); + char c = r.Take(); if (c != '{') { diff --git a/src/Ryujinx/UI/Helpers/MiniCommand.cs b/src/Ryujinx/UI/Helpers/MiniCommand.cs deleted file mode 100644 index 7e1bb9a68..000000000 --- a/src/Ryujinx/UI/Helpers/MiniCommand.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Threading.Tasks; -using System.Windows.Input; - -namespace Ryujinx.Ava.UI.Helpers -{ - public sealed class MiniCommand : MiniCommand, ICommand - { - private readonly Action _callback; - private bool _busy; - private readonly Func _asyncCallback; - - public MiniCommand(Action callback) - { - _callback = callback; - } - - public MiniCommand(Func callback) - { - _asyncCallback = callback; - } - - private bool Busy - { - get => _busy; - set - { - _busy = value; - CanExecuteChanged?.Invoke(this, EventArgs.Empty); - } - } - - public override event EventHandler CanExecuteChanged; - public override bool CanExecute(object parameter) => !_busy; - - public override async void Execute(object parameter) - { - if (Busy) - { - return; - } - try - { - Busy = true; - if (_callback != null) - { - _callback((T)parameter); - } - else - { - await _asyncCallback((T)parameter); - } - } - finally - { - Busy = false; - } - } - } - - public abstract class MiniCommand : ICommand - { - public static MiniCommand Create(Action callback) => new MiniCommand(_ => callback()); - public static MiniCommand Create(Action callback) => new MiniCommand(callback); - public static MiniCommand CreateFromTask(Func callback) => new MiniCommand(_ => callback()); - - public abstract bool CanExecute(object parameter); - public abstract void Execute(object parameter); - public abstract event EventHandler CanExecuteChanged; - } -} diff --git a/src/Ryujinx/UI/Helpers/NotificationHelper.cs b/src/Ryujinx/UI/Helpers/NotificationHelper.cs index 656a8b52f..dfc5844d5 100644 --- a/src/Ryujinx/UI/Helpers/NotificationHelper.cs +++ b/src/Ryujinx/UI/Helpers/NotificationHelper.cs @@ -28,7 +28,7 @@ namespace Ryujinx.Ava.UI.Helpers Margin = new Thickness(0, 0, 15, 40), }; - var maybeAsyncWorkQueue = new Lazy>( + Lazy> maybeAsyncWorkQueue = new( () => new AsyncWorkQueue(notification => { Dispatcher.UIThread.Post(() => @@ -57,14 +57,51 @@ namespace Ryujinx.Ava.UI.Helpers public static void Show(string title, string text, NotificationType type, bool waitingExit = false, Action onClick = null, Action onClose = null) { - var delay = waitingExit ? TimeSpan.FromMilliseconds(0) : TimeSpan.FromMilliseconds(NotificationDelayInMs); + TimeSpan delay = waitingExit ? TimeSpan.FromMilliseconds(0) : TimeSpan.FromMilliseconds(NotificationDelayInMs); _notifications.Add(new Notification(title, text, type, delay, onClick, onClose)); } - public static void ShowError(string message) - { - Show(LocaleManager.Instance[LocaleKeys.DialogErrorTitle], $"{LocaleManager.Instance[LocaleKeys.DialogErrorMessage]}\n\n{message}", NotificationType.Error); - } + public static void ShowError(string message) => + ShowError( + LocaleManager.Instance[LocaleKeys.DialogErrorTitle], + $"{LocaleManager.Instance[LocaleKeys.DialogErrorMessage]}\n\n{message}" + ); + + public static void ShowInformation(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) => + Show( + title, + text, + NotificationType.Information, + waitingExit, + onClick, + onClose); + + public static void ShowSuccess(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) => + Show( + title, + text, + NotificationType.Success, + waitingExit, + onClick, + onClose); + + public static void ShowWarning(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) => + Show( + title, + text, + NotificationType.Warning, + waitingExit, + onClick, + onClose); + + public static void ShowError(string title, string text, bool waitingExit = false, Action onClick = null, Action onClose = null) => + Show( + title, + text, + NotificationType.Error, + waitingExit, + onClick, + onClose); } } diff --git a/src/Ryujinx/UI/Helpers/UserErrorDialog.cs b/src/Ryujinx/UI/Helpers/UserErrorDialog.cs index b981a8275..c30fb4348 100644 --- a/src/Ryujinx/UI/Helpers/UserErrorDialog.cs +++ b/src/Ryujinx/UI/Helpers/UserErrorDialog.cs @@ -1,5 +1,5 @@ using Ryujinx.Ava.Common.Locale; -using Ryujinx.UI.Common; +using Ryujinx.Common.UI; using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Helpers diff --git a/src/Ryujinx/UI/Helpers/Win32NativeInterop.cs b/src/Ryujinx/UI/Helpers/Win32NativeInterop.cs index 48f98f44a..c7d217bf5 100644 --- a/src/Ryujinx/UI/Helpers/Win32NativeInterop.cs +++ b/src/Ryujinx/UI/Helpers/Win32NativeInterop.cs @@ -28,7 +28,6 @@ namespace Ryujinx.Ava.UI.Helpers IdcArrow = 32512, } - [SuppressMessage("Design", "CA1069: Enums values should not be duplicated")] public enum WindowsMessages : uint { NcHitTest = 0x0084, @@ -111,5 +110,8 @@ namespace Ryujinx.Ava.UI.Helpers [LibraryImport("user32.dll", SetLastError = true)] public static partial nint SetWindowLongPtrW(nint hWnd, int nIndex, nint value); + + [LibraryImport("user32.dll", SetLastError = true)] + public static partial ushort GetAsyncKeyState(int nVirtKey); } } diff --git a/src/Ryujinx/UI/Helpers/XCITrimmerOperationOutcomeHelper.cs b/src/Ryujinx/UI/Helpers/XCITrimmerOperationOutcomeHelper.cs index 93489f806..1a0e126c8 100644 --- a/src/Ryujinx/UI/Helpers/XCITrimmerOperationOutcomeHelper.cs +++ b/src/Ryujinx/UI/Helpers/XCITrimmerOperationOutcomeHelper.cs @@ -33,4 +33,4 @@ namespace Ryujinx.Ava.UI.Helpers } } } -} \ No newline at end of file +} diff --git a/src/Ryujinx/UI/Models/CheatNode.cs b/src/Ryujinx/UI/Models/CheatNode.cs index 8e9aee254..b036ba6b9 100644 --- a/src/Ryujinx/UI/Models/CheatNode.cs +++ b/src/Ryujinx/UI/Models/CheatNode.cs @@ -8,8 +8,8 @@ namespace Ryujinx.Ava.UI.Models public class CheatNode : BaseModel { private bool _isEnabled = false; - public ObservableCollection SubNodes { get; } = new(); - public string CleanName => Name[1..^7]; + public ObservableCollection SubNodes { get; } = []; + public string CleanName => Name.Length > 0 ? Name[1..^7] : Name; public string BuildIdKey => $"{BuildId}-{Name}"; public bool IsRootNode { get; } public string Name { get; } @@ -28,7 +28,7 @@ namespace Ryujinx.Ava.UI.Models } set { - foreach (var cheat in SubNodes) + foreach (CheatNode cheat in SubNodes) { cheat.IsEnabled = value; cheat.OnPropertyChanged(); diff --git a/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs b/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs index 224f78f45..3808ae6a2 100644 --- a/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs +++ b/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs @@ -1,4 +1,4 @@ -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Systems.AppLibrary; using System; using System.Collections.Generic; diff --git a/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs b/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs index f0fb035d1..321bde09b 100644 --- a/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs +++ b/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs @@ -1,4 +1,4 @@ -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Systems.AppLibrary; using System; using System.Collections.Generic; diff --git a/src/Ryujinx/UI/Models/Input/GamepadInputConfig.cs b/src/Ryujinx/UI/Models/Input/GamepadInputConfig.cs index 833670bdc..526e63afe 100644 --- a/src/Ryujinx/UI/Models/Input/GamepadInputConfig.cs +++ b/src/Ryujinx/UI/Models/Input/GamepadInputConfig.cs @@ -1,12 +1,13 @@ +using Avalonia.Media; +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Controller; using Ryujinx.Common.Configuration.Hid.Controller.Motion; -using System; namespace Ryujinx.Ava.UI.Models.Input { - public class GamepadInputConfig : BaseModel + public partial class GamepadInputConfig : BaseModel { public bool EnableCemuHookMotion { get; set; } public string DsuServerHost { get; set; } @@ -21,391 +22,89 @@ namespace Ryujinx.Ava.UI.Models.Input public float StrongRumble { get; set; } public string Id { get; set; } + + public string Name { get; set; } public ControllerType ControllerType { get; set; } public PlayerIndex PlayerIndex { get; set; } - private StickInputId _leftJoystick; - public StickInputId LeftJoystick + [ObservableProperty] private StickInputId _leftJoystick; + [ObservableProperty] private bool _leftInvertStickX; + [ObservableProperty] private bool _leftInvertStickY; + [ObservableProperty] private bool _leftRotate90; + [ObservableProperty] private GamepadInputId _leftStickButton; + + [ObservableProperty] private StickInputId _rightJoystick; + [ObservableProperty] private bool _rightInvertStickX; + [ObservableProperty] private bool _rightInvertStickY; + [ObservableProperty] private bool _rightRotate90; + [ObservableProperty] private GamepadInputId _rightStickButton; + + [ObservableProperty] private GamepadInputId _dpadUp; + [ObservableProperty] private GamepadInputId _dpadDown; + [ObservableProperty] private GamepadInputId _dpadLeft; + [ObservableProperty] private GamepadInputId _dpadRight; + + [ObservableProperty] private GamepadInputId _buttonMinus; + [ObservableProperty] private GamepadInputId _buttonPlus; + + [ObservableProperty] private GamepadInputId _buttonA; + [ObservableProperty] private GamepadInputId _buttonB; + [ObservableProperty] private GamepadInputId _buttonX; + [ObservableProperty] private GamepadInputId _buttonY; + + [ObservableProperty] private GamepadInputId _buttonZl; + [ObservableProperty] private GamepadInputId _buttonZr; + + [ObservableProperty] private GamepadInputId _buttonL; + [ObservableProperty] private GamepadInputId _buttonR; + + [ObservableProperty] private GamepadInputId _leftButtonSl; + [ObservableProperty] private GamepadInputId _leftButtonSr; + + [ObservableProperty] private GamepadInputId _rightButtonSl; + [ObservableProperty] private GamepadInputId _rightButtonSr; + + [ObservableProperty] private float _deadzoneLeft; + [ObservableProperty] private float _deadzoneRight; + + [ObservableProperty] private float _rangeLeft; + [ObservableProperty] private float _rangeRight; + + [ObservableProperty] private float _triggerThreshold; + + [ObservableProperty] private bool _enableMotion; + + [ObservableProperty] private bool _enableRumble; + + [ObservableProperty] private bool _enableLedChanging; + + [ObservableProperty] private Color _ledColor; + + public bool ShowLedColorPicker => !TurnOffLed && !UseRainbowLed; + + private bool _turnOffLed; + + public bool TurnOffLed { - get => _leftJoystick; + get => _turnOffLed; set { - _leftJoystick = value; + _turnOffLed = value; OnPropertyChanged(); + OnPropertyChanged(nameof(ShowLedColorPicker)); } } - private bool _leftInvertStickX; - public bool LeftInvertStickX - { - get => _leftInvertStickX; - set - { - _leftInvertStickX = value; - OnPropertyChanged(); - } - } + private bool _useRainbowLed; - private bool _leftInvertStickY; - public bool LeftInvertStickY + public bool UseRainbowLed { - get => _leftInvertStickY; + get => _useRainbowLed; set { - _leftInvertStickY = value; - OnPropertyChanged(); - } - } - - private bool _leftRotate90; - public bool LeftRotate90 - { - get => _leftRotate90; - set - { - _leftRotate90 = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _leftStickButton; - public GamepadInputId LeftStickButton - { - get => _leftStickButton; - set - { - _leftStickButton = value; - OnPropertyChanged(); - } - } - - private StickInputId _rightJoystick; - public StickInputId RightJoystick - { - get => _rightJoystick; - set - { - _rightJoystick = value; - OnPropertyChanged(); - } - } - - private bool _rightInvertStickX; - public bool RightInvertStickX - { - get => _rightInvertStickX; - set - { - _rightInvertStickX = value; - OnPropertyChanged(); - } - } - - private bool _rightInvertStickY; - public bool RightInvertStickY - { - get => _rightInvertStickY; - set - { - _rightInvertStickY = value; - OnPropertyChanged(); - } - } - - private bool _rightRotate90; - public bool RightRotate90 - { - get => _rightRotate90; - set - { - _rightRotate90 = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _rightStickButton; - public GamepadInputId RightStickButton - { - get => _rightStickButton; - set - { - _rightStickButton = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _dpadUp; - public GamepadInputId DpadUp - { - get => _dpadUp; - set - { - _dpadUp = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _dpadDown; - public GamepadInputId DpadDown - { - get => _dpadDown; - set - { - _dpadDown = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _dpadLeft; - public GamepadInputId DpadLeft - { - get => _dpadLeft; - set - { - _dpadLeft = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _dpadRight; - public GamepadInputId DpadRight - { - get => _dpadRight; - set - { - _dpadRight = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _buttonL; - public GamepadInputId ButtonL - { - get => _buttonL; - set - { - _buttonL = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _buttonMinus; - public GamepadInputId ButtonMinus - { - get => _buttonMinus; - set - { - _buttonMinus = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _leftButtonSl; - public GamepadInputId LeftButtonSl - { - get => _leftButtonSl; - set - { - _leftButtonSl = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _leftButtonSr; - public GamepadInputId LeftButtonSr - { - get => _leftButtonSr; - set - { - _leftButtonSr = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _buttonZl; - public GamepadInputId ButtonZl - { - get => _buttonZl; - set - { - _buttonZl = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _buttonA; - public GamepadInputId ButtonA - { - get => _buttonA; - set - { - _buttonA = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _buttonB; - public GamepadInputId ButtonB - { - get => _buttonB; - set - { - _buttonB = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _buttonX; - public GamepadInputId ButtonX - { - get => _buttonX; - set - { - _buttonX = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _buttonY; - public GamepadInputId ButtonY - { - get => _buttonY; - set - { - _buttonY = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _buttonR; - public GamepadInputId ButtonR - { - get => _buttonR; - set - { - _buttonR = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _buttonPlus; - public GamepadInputId ButtonPlus - { - get => _buttonPlus; - set - { - _buttonPlus = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _rightButtonSl; - public GamepadInputId RightButtonSl - { - get => _rightButtonSl; - set - { - _rightButtonSl = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _rightButtonSr; - public GamepadInputId RightButtonSr - { - get => _rightButtonSr; - set - { - _rightButtonSr = value; - OnPropertyChanged(); - } - } - - private GamepadInputId _buttonZr; - public GamepadInputId ButtonZr - { - get => _buttonZr; - set - { - _buttonZr = value; - OnPropertyChanged(); - } - } - - private float _deadzoneLeft; - public float DeadzoneLeft - { - get => _deadzoneLeft; - set - { - _deadzoneLeft = MathF.Round(value, 3); - OnPropertyChanged(); - } - } - - private float _deadzoneRight; - public float DeadzoneRight - { - get => _deadzoneRight; - set - { - _deadzoneRight = MathF.Round(value, 3); - OnPropertyChanged(); - } - } - - private float _rangeLeft; - public float RangeLeft - { - get => _rangeLeft; - set - { - _rangeLeft = MathF.Round(value, 3); - OnPropertyChanged(); - } - } - - private float _rangeRight; - public float RangeRight - { - get => _rangeRight; - set - { - _rangeRight = MathF.Round(value, 3); - OnPropertyChanged(); - } - } - - private float _triggerThreshold; - public float TriggerThreshold - { - get => _triggerThreshold; - set - { - _triggerThreshold = MathF.Round(value, 3); - OnPropertyChanged(); - } - } - - private bool _enableMotion; - public bool EnableMotion - { - get => _enableMotion; - set - { - _enableMotion = value; - OnPropertyChanged(); - } - } - - private bool _enableRumble; - public bool EnableRumble - { - get => _enableRumble; - set - { - _enableRumble = value; + _useRainbowLed = value; OnPropertyChanged(); + OnPropertyChanged(nameof(ShowLedColorPicker)); } } @@ -414,6 +113,7 @@ namespace Ryujinx.Ava.UI.Models.Input if (config != null) { Id = config.Id; + Name = config.Name; ControllerType = config.ControllerType; PlayerIndex = config.PlayerIndex; @@ -483,14 +183,28 @@ namespace Ryujinx.Ava.UI.Models.Input WeakRumble = controllerInput.Rumble.WeakRumble; StrongRumble = controllerInput.Rumble.StrongRumble; } + + if (controllerInput.Led != null) + { + EnableLedChanging = controllerInput.Led.EnableLed; + TurnOffLed = controllerInput.Led.TurnOffLed; + UseRainbowLed = controllerInput.Led.UseRainbow; + uint rawColor = controllerInput.Led.LedColor; + byte alpha = (byte)(rawColor >> 24); + byte red = (byte)(rawColor >> 16); + byte green = (byte)(rawColor >> 8); + byte blue = (byte)(rawColor % 256); + LedColor = new Color(alpha, red, green, blue); + } } } public InputConfig GetConfig() { - var config = new StandardControllerInputConfig + StandardControllerInputConfig config = new() { Id = Id, + Name = Name, Backend = InputBackendType.GamepadSDL2, PlayerIndex = PlayerIndex, ControllerType = ControllerType, @@ -540,6 +254,13 @@ namespace Ryujinx.Ava.UI.Models.Input WeakRumble = WeakRumble, StrongRumble = StrongRumble, }, + Led = new LedConfigController + { + EnableLed = EnableLedChanging, + TurnOffLed = this.TurnOffLed, + UseRainbow = UseRainbowLed, + LedColor = LedColor.ToUInt32() + }, Version = InputConfig.CurrentVersion, DeadzoneLeft = DeadzoneLeft, DeadzoneRight = DeadzoneRight, diff --git a/src/Ryujinx/UI/Models/Input/HotkeyConfig.cs b/src/Ryujinx/UI/Models/Input/HotkeyConfig.cs index 4c7a6bd02..9e557d7b1 100644 --- a/src/Ryujinx/UI/Models/Input/HotkeyConfig.cs +++ b/src/Ryujinx/UI/Models/Input/HotkeyConfig.cs @@ -1,152 +1,59 @@ +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Common.Configuration.Hid; namespace Ryujinx.Ava.UI.Models.Input { - public class HotkeyConfig : BaseModel + public partial class HotkeyConfig : BaseModel { - private Key _toggleVSyncMode; - public Key ToggleVSyncMode - { - get => _toggleVSyncMode; - set - { - _toggleVSyncMode = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _toggleVSyncMode; - private Key _screenshot; - public Key Screenshot - { - get => _screenshot; - set - { - _screenshot = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _screenshot; - private Key _showUI; - public Key ShowUI - { - get => _showUI; - set - { - _showUI = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _showUI; - private Key _pause; - public Key Pause - { - get => _pause; - set - { - _pause = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _pause; - private Key _toggleMute; - public Key ToggleMute - { - get => _toggleMute; - set - { - _toggleMute = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _toggleMute; - private Key _resScaleUp; - public Key ResScaleUp - { - get => _resScaleUp; - set - { - _resScaleUp = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _resScaleUp; - private Key _resScaleDown; - public Key ResScaleDown - { - get => _resScaleDown; - set - { - _resScaleDown = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _resScaleDown; - private Key _volumeUp; - public Key VolumeUp - { - get => _volumeUp; - set - { - _volumeUp = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _volumeUp; - private Key _volumeDown; - public Key VolumeDown - { - get => _volumeDown; - set - { - _volumeDown = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _volumeDown; - private Key _customVSyncIntervalIncrement; - public Key CustomVSyncIntervalIncrement - { - get => _customVSyncIntervalIncrement; - set - { - _customVSyncIntervalIncrement = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _customVSyncIntervalIncrement; - private Key _customVSyncIntervalDecrement; - public Key CustomVSyncIntervalDecrement - { - get => _customVSyncIntervalDecrement; - set - { - _customVSyncIntervalDecrement = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _customVSyncIntervalDecrement; + + [ObservableProperty] private Key _turboMode; + + [ObservableProperty] private bool _turboModeWhileHeld; public HotkeyConfig(KeyboardHotkeys config) { - if (config != null) - { - ToggleVSyncMode = config.ToggleVSyncMode; - Screenshot = config.Screenshot; - ShowUI = config.ShowUI; - Pause = config.Pause; - ToggleMute = config.ToggleMute; - ResScaleUp = config.ResScaleUp; - ResScaleDown = config.ResScaleDown; - VolumeUp = config.VolumeUp; - VolumeDown = config.VolumeDown; - CustomVSyncIntervalIncrement = config.CustomVSyncIntervalIncrement; - CustomVSyncIntervalDecrement = config.CustomVSyncIntervalDecrement; - } + if (config == null) + return; + + ToggleVSyncMode = config.ToggleVSyncMode; + Screenshot = config.Screenshot; + ShowUI = config.ShowUI; + Pause = config.Pause; + ToggleMute = config.ToggleMute; + ResScaleUp = config.ResScaleUp; + ResScaleDown = config.ResScaleDown; + VolumeUp = config.VolumeUp; + VolumeDown = config.VolumeDown; + CustomVSyncIntervalIncrement = config.CustomVSyncIntervalIncrement; + CustomVSyncIntervalDecrement = config.CustomVSyncIntervalDecrement; + TurboMode = config.TurboMode; + TurboModeWhileHeld = config.TurboModeWhileHeld; } - public KeyboardHotkeys GetConfig() - { - var config = new KeyboardHotkeys + public KeyboardHotkeys GetConfig() => + new() { ToggleVSyncMode = ToggleVSyncMode, Screenshot = Screenshot, @@ -159,9 +66,8 @@ namespace Ryujinx.Ava.UI.Models.Input VolumeDown = VolumeDown, CustomVSyncIntervalIncrement = CustomVSyncIntervalIncrement, CustomVSyncIntervalDecrement = CustomVSyncIntervalDecrement, + TurboMode = TurboMode, + TurboModeWhileHeld = TurboModeWhileHeld }; - - return config; - } } } diff --git a/src/Ryujinx/UI/Models/Input/KeyboardInputConfig.cs b/src/Ryujinx/UI/Models/Input/KeyboardInputConfig.cs index 66f1f62a2..0213d72fe 100644 --- a/src/Ryujinx/UI/Models/Input/KeyboardInputConfig.cs +++ b/src/Ryujinx/UI/Models/Input/KeyboardInputConfig.cs @@ -1,328 +1,61 @@ +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Keyboard; +using System.Xml.Linq; namespace Ryujinx.Ava.UI.Models.Input { - public class KeyboardInputConfig : BaseModel + public partial class KeyboardInputConfig : BaseModel { public string Id { get; set; } + public string Name { get; set; } public ControllerType ControllerType { get; set; } public PlayerIndex PlayerIndex { get; set; } - private Key _leftStickUp; - public Key LeftStickUp - { - get => _leftStickUp; - set - { - _leftStickUp = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _leftStickUp; + [ObservableProperty] private Key _leftStickDown; + [ObservableProperty] private Key _leftStickLeft; + [ObservableProperty] private Key _leftStickRight; + [ObservableProperty] private Key _leftStickButton; - private Key _leftStickDown; - public Key LeftStickDown - { - get => _leftStickDown; - set - { - _leftStickDown = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _rightStickUp; + [ObservableProperty] private Key _rightStickDown; + [ObservableProperty] private Key _rightStickLeft; + [ObservableProperty] private Key _rightStickRight; + [ObservableProperty] private Key _rightStickButton; - private Key _leftStickLeft; - public Key LeftStickLeft - { - get => _leftStickLeft; - set - { - _leftStickLeft = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _dpadUp; + [ObservableProperty] private Key _dpadDown; + [ObservableProperty] private Key _dpadLeft; + [ObservableProperty] private Key _dpadRight; - private Key _leftStickRight; - public Key LeftStickRight - { - get => _leftStickRight; - set - { - _leftStickRight = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _buttonMinus; + [ObservableProperty] private Key _buttonPlus; - private Key _leftStickButton; - public Key LeftStickButton - { - get => _leftStickButton; - set - { - _leftStickButton = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _buttonA; + [ObservableProperty] private Key _buttonB; + [ObservableProperty] private Key _buttonX; + [ObservableProperty] private Key _buttonY; - private Key _rightStickUp; - public Key RightStickUp - { - get => _rightStickUp; - set - { - _rightStickUp = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _buttonL; + [ObservableProperty] private Key _buttonR; - private Key _rightStickDown; - public Key RightStickDown - { - get => _rightStickDown; - set - { - _rightStickDown = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _buttonZl; + [ObservableProperty] private Key _buttonZr; - private Key _rightStickLeft; - public Key RightStickLeft - { - get => _rightStickLeft; - set - { - _rightStickLeft = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _leftButtonSl; + [ObservableProperty] private Key _leftButtonSr; - private Key _rightStickRight; - public Key RightStickRight - { - get => _rightStickRight; - set - { - _rightStickRight = value; - OnPropertyChanged(); - } - } - - private Key _rightStickButton; - public Key RightStickButton - { - get => _rightStickButton; - set - { - _rightStickButton = value; - OnPropertyChanged(); - } - } - - private Key _dpadUp; - public Key DpadUp - { - get => _dpadUp; - set - { - _dpadUp = value; - OnPropertyChanged(); - } - } - - private Key _dpadDown; - public Key DpadDown - { - get => _dpadDown; - set - { - _dpadDown = value; - OnPropertyChanged(); - } - } - - private Key _dpadLeft; - public Key DpadLeft - { - get => _dpadLeft; - set - { - _dpadLeft = value; - OnPropertyChanged(); - } - } - - private Key _dpadRight; - public Key DpadRight - { - get => _dpadRight; - set - { - _dpadRight = value; - OnPropertyChanged(); - } - } - - private Key _buttonL; - public Key ButtonL - { - get => _buttonL; - set - { - _buttonL = value; - OnPropertyChanged(); - } - } - - private Key _buttonMinus; - public Key ButtonMinus - { - get => _buttonMinus; - set - { - _buttonMinus = value; - OnPropertyChanged(); - } - } - - private Key _leftButtonSl; - public Key LeftButtonSl - { - get => _leftButtonSl; - set - { - _leftButtonSl = value; - OnPropertyChanged(); - } - } - - private Key _leftButtonSr; - public Key LeftButtonSr - { - get => _leftButtonSr; - set - { - _leftButtonSr = value; - OnPropertyChanged(); - } - } - - private Key _buttonZl; - public Key ButtonZl - { - get => _buttonZl; - set - { - _buttonZl = value; - OnPropertyChanged(); - } - } - - private Key _buttonA; - public Key ButtonA - { - get => _buttonA; - set - { - _buttonA = value; - OnPropertyChanged(); - } - } - - private Key _buttonB; - public Key ButtonB - { - get => _buttonB; - set - { - _buttonB = value; - OnPropertyChanged(); - } - } - - private Key _buttonX; - public Key ButtonX - { - get => _buttonX; - set - { - _buttonX = value; - OnPropertyChanged(); - } - } - - private Key _buttonY; - public Key ButtonY - { - get => _buttonY; - set - { - _buttonY = value; - OnPropertyChanged(); - } - } - - private Key _buttonR; - public Key ButtonR - { - get => _buttonR; - set - { - _buttonR = value; - OnPropertyChanged(); - } - } - - private Key _buttonPlus; - public Key ButtonPlus - { - get => _buttonPlus; - set - { - _buttonPlus = value; - OnPropertyChanged(); - } - } - - private Key _rightButtonSl; - public Key RightButtonSl - { - get => _rightButtonSl; - set - { - _rightButtonSl = value; - OnPropertyChanged(); - } - } - - private Key _rightButtonSr; - public Key RightButtonSr - { - get => _rightButtonSr; - set - { - _rightButtonSr = value; - OnPropertyChanged(); - } - } - - private Key _buttonZr; - public Key ButtonZr - { - get => _buttonZr; - set - { - _buttonZr = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private Key _rightButtonSl; + [ObservableProperty] private Key _rightButtonSr; public KeyboardInputConfig(InputConfig config) { if (config != null) { Id = config.Id; + Name = config.Name; ControllerType = config.ControllerType; PlayerIndex = config.PlayerIndex; @@ -367,9 +100,10 @@ namespace Ryujinx.Ava.UI.Models.Input public InputConfig GetConfig() { - var config = new StandardKeyboardInputConfig + StandardKeyboardInputConfig config = new() { Id = Id, + Name = Name, Backend = InputBackendType.WindowKeyboard, PlayerIndex = PlayerIndex, ControllerType = ControllerType, diff --git a/src/Ryujinx/UI/Models/Input/StickVisualizer.cs b/src/Ryujinx/UI/Models/Input/StickVisualizer.cs new file mode 100644 index 000000000..f88f4ea72 --- /dev/null +++ b/src/Ryujinx/UI/Models/Input/StickVisualizer.cs @@ -0,0 +1,268 @@ +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.UI.ViewModels.Input; +using Ryujinx.Input; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.UI.Models.Input +{ + public class StickVisualizer : BaseModel, IDisposable + { + public const int DrawStickPollRate = 50; // Milliseconds per poll. + public const int DrawStickCircumference = 5; + public const float DrawStickScaleFactor = DrawStickCanvasCenter; + public const int DrawStickCanvasSize = 100; + public const int DrawStickBorderSize = DrawStickCanvasSize + 5; + public const float DrawStickCanvasCenter = (DrawStickCanvasSize - DrawStickCircumference) / 2; + public const float MaxVectorLength = DrawStickCanvasSize / 2; + + public CancellationTokenSource PollTokenSource; + public CancellationToken PollToken; + + private static float _vectorLength; + private static float _vectorMultiplier; + + private bool disposedValue; + + private DeviceType _type; + public DeviceType Type + { + get => _type; + set + { + _type = value; + + OnPropertyChanged(); + } + } + + private GamepadInputConfig _gamepadConfig; + public GamepadInputConfig GamepadConfig + { + get => _gamepadConfig; + set + { + _gamepadConfig = value; + + OnPropertyChanged(); + } + } + + private KeyboardInputConfig _keyboardConfig; + public KeyboardInputConfig KeyboardConfig + { + get => _keyboardConfig; + set + { + _keyboardConfig = value; + + OnPropertyChanged(); + } + } + + private (float, float) _uiStickLeft; + public (float, float) UiStickLeft + { + get => (_uiStickLeft.Item1 * DrawStickScaleFactor, _uiStickLeft.Item2 * DrawStickScaleFactor); + set + { + _uiStickLeft = value; + + OnPropertyChanged(); + OnPropertyChanged(nameof(UiStickRightX)); + OnPropertyChanged(nameof(UiStickRightY)); + OnPropertyChanged(nameof(UiDeadzoneRight)); + } + } + + private (float, float) _uiStickRight; + public (float, float) UiStickRight + { + get => (_uiStickRight.Item1 * DrawStickScaleFactor, _uiStickRight.Item2 * DrawStickScaleFactor); + set + { + _uiStickRight = value; + + OnPropertyChanged(); + OnPropertyChanged(nameof(UiStickLeftX)); + OnPropertyChanged(nameof(UiStickLeftY)); + OnPropertyChanged(nameof(UiDeadzoneLeft)); + } + } + + public float UiStickLeftX => ClampVector(UiStickLeft).Item1; + public float UiStickLeftY => ClampVector(UiStickLeft).Item2; + public float UiStickRightX => ClampVector(UiStickRight).Item1; + public float UiStickRightY => ClampVector(UiStickRight).Item2; + + public static int UiStickCircumference => DrawStickCircumference; + public static int UiCanvasSize => DrawStickCanvasSize; + public static int UiStickBorderSize => DrawStickBorderSize; + + public float? UiDeadzoneLeft => _gamepadConfig?.DeadzoneLeft * DrawStickCanvasSize - DrawStickCircumference; + public float? UiDeadzoneRight => _gamepadConfig?.DeadzoneRight * DrawStickCanvasSize - DrawStickCircumference; + + private InputViewModel Parent; + + public StickVisualizer(InputViewModel parent) + { + Parent = parent; + + PollTokenSource = new CancellationTokenSource(); + PollToken = PollTokenSource.Token; + + Task.Run(Initialize, PollToken); + } + + public void UpdateConfig(object config) + { + if (config is ControllerInputViewModel padConfig) + { + GamepadConfig = padConfig.Config; + Type = DeviceType.Controller; + + return; + } + else if (config is KeyboardInputViewModel keyConfig) + { + KeyboardConfig = keyConfig.Config; + Type = DeviceType.Keyboard; + + return; + } + + Type = DeviceType.None; + } + + public async Task Initialize() + { + (float, float) leftBuffer; + (float, float) rightBuffer; + + while (!PollToken.IsCancellationRequested) + { + leftBuffer = (0f, 0f); + rightBuffer = (0f, 0f); + + switch (Type) + { + case DeviceType.Keyboard: + IKeyboard keyboard = (IKeyboard)Parent.AvaloniaKeyboardDriver.GetGamepad("0"); + + if (keyboard != null) + { + KeyboardStateSnapshot snapshot = keyboard.GetKeyboardStateSnapshot(); + + if (snapshot.IsPressed((Key)KeyboardConfig.LeftStickRight)) + { + leftBuffer.Item1 += 1; + } + + if (snapshot.IsPressed((Key)KeyboardConfig.LeftStickLeft)) + { + leftBuffer.Item1 -= 1; + } + + if (snapshot.IsPressed((Key)KeyboardConfig.LeftStickUp)) + { + leftBuffer.Item2 += 1; + } + + if (snapshot.IsPressed((Key)KeyboardConfig.LeftStickDown)) + { + leftBuffer.Item2 -= 1; + } + + if (snapshot.IsPressed((Key)KeyboardConfig.RightStickRight)) + { + rightBuffer.Item1 += 1; + } + + if (snapshot.IsPressed((Key)KeyboardConfig.RightStickLeft)) + { + rightBuffer.Item1 -= 1; + } + + if (snapshot.IsPressed((Key)KeyboardConfig.RightStickUp)) + { + rightBuffer.Item2 += 1; + } + + if (snapshot.IsPressed((Key)KeyboardConfig.RightStickDown)) + { + rightBuffer.Item2 -= 1; + } + + UiStickLeft = leftBuffer; + UiStickRight = rightBuffer; + } + + break; + + case DeviceType.Controller: + IGamepad controller = Parent.SelectedGamepad; + + if (controller != null) + { + leftBuffer = controller.GetStick((StickInputId)GamepadConfig.LeftJoystick); + rightBuffer = controller.GetStick((StickInputId)GamepadConfig.RightJoystick); + } + + break; + + case DeviceType.None: + break; + default: + throw new ArgumentException($"Unable to poll device type \"{Type}\""); + } + + UiStickLeft = leftBuffer; + UiStickRight = rightBuffer; + + await Task.Delay(DrawStickPollRate, PollToken); + } + + PollTokenSource.Dispose(); + } + + public static (float, float) ClampVector((float, float) vect) + { + _vectorMultiplier = 1; + _vectorLength = MathF.Sqrt((vect.Item1 * vect.Item1) + (vect.Item2 * vect.Item2)); + + if (_vectorLength > MaxVectorLength) + { + _vectorMultiplier = MaxVectorLength / _vectorLength; + } + + vect.Item1 = vect.Item1 * _vectorMultiplier + DrawStickCanvasCenter; + vect.Item2 = vect.Item2 * _vectorMultiplier + DrawStickCanvasCenter; + + return vect; + } + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + PollTokenSource.Cancel(); + } + + KeyboardConfig = null; + GamepadConfig = null; + Parent = null; + + disposedValue = true; + } + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Ryujinx/UI/Models/ModModel.cs b/src/Ryujinx/UI/Models/ModModel.cs index ee28ca5f5..91804d365 100644 --- a/src/Ryujinx/UI/Models/ModModel.cs +++ b/src/Ryujinx/UI/Models/ModModel.cs @@ -1,26 +1,22 @@ +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.ViewModels; -using System.IO; +using System.Globalization; namespace Ryujinx.Ava.UI.Models { - public class ModModel : BaseModel + public partial class ModModel : BaseModel { - private bool _enabled; - - public bool Enabled - { - get => _enabled; - set - { - _enabled = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private bool _enabled; public bool InSd { get; } public string Path { get; } public string Name { get; } + public string FormattedName => + InSd && ulong.TryParse(Name, NumberStyles.HexNumber, null, out ulong applicationId) + ? $"Atmosphère: {RyujinxApp.MainWindow.ApplicationLibrary.GetNameForApplicationId(applicationId)}" + : Name; + public ModModel(string path, string name, bool enabled, bool inSd) { Path = path; diff --git a/src/Ryujinx/UI/Models/ProfileImageModel.cs b/src/Ryujinx/UI/Models/ProfileImageModel.cs index 99365dfc7..f12aa7bd4 100644 --- a/src/Ryujinx/UI/Models/ProfileImageModel.cs +++ b/src/Ryujinx/UI/Models/ProfileImageModel.cs @@ -1,9 +1,10 @@ using Avalonia.Media; +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.ViewModels; namespace Ryujinx.Ava.UI.Models { - public class ProfileImageModel : BaseModel + public partial class ProfileImageModel : BaseModel { public ProfileImageModel(string name, byte[] data) { @@ -14,19 +15,6 @@ namespace Ryujinx.Ava.UI.Models public string Name { get; set; } public byte[] Data { get; set; } - private SolidColorBrush _backgroundColor = new(Colors.White); - - public SolidColorBrush BackgroundColor - { - get - { - return _backgroundColor; - } - set - { - _backgroundColor = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private SolidColorBrush _backgroundColor = new(Colors.White); } } diff --git a/src/Ryujinx/UI/Models/SaveModel.cs b/src/Ryujinx/UI/Models/SaveModel.cs index cfc397c6e..d245ed4d9 100644 --- a/src/Ryujinx/UI/Models/SaveModel.cs +++ b/src/Ryujinx/UI/Models/SaveModel.cs @@ -1,11 +1,10 @@ +using Gommon; using LibHac.Fs; using LibHac.Ncm; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; using Ryujinx.HLE.FileSystem; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Helper; -using System; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -47,7 +46,7 @@ namespace Ryujinx.Ava.UI.Models TitleId = info.ProgramId; UserId = info.UserId; - var appData = MainWindow.MainWindowViewModel.Applications.FirstOrDefault(x => x.IdString.Equals(TitleIdString, StringComparison.OrdinalIgnoreCase)); + ApplicationData appData = RyujinxApp.MainWindow.ViewModel.Applications.FirstOrDefault(x => x.IdString.EqualsIgnoreCase(TitleIdString)); InGameList = appData != null; @@ -58,13 +57,13 @@ namespace Ryujinx.Ava.UI.Models } else { - var appMetadata = ApplicationLibrary.LoadAndSaveMetaData(TitleIdString); + ApplicationMetadata appMetadata = ApplicationLibrary.LoadAndSaveMetaData(TitleIdString); Title = appMetadata.Title ?? TitleIdString; } Task.Run(() => { - var saveRoot = Path.Combine(VirtualFileSystem.GetNandPath(), $"user/save/{info.SaveDataId:x16}"); + string saveRoot = Path.Combine(VirtualFileSystem.GetNandPath(), $"user/save/{info.SaveDataId:x16}"); long totalSize = GetDirectorySize(saveRoot); @@ -73,14 +72,14 @@ namespace Ryujinx.Ava.UI.Models long size = 0; if (Directory.Exists(path)) { - var directories = Directory.GetDirectories(path); - foreach (var directory in directories) + string[] directories = Directory.GetDirectories(path); + foreach (string directory in directories) { size += GetDirectorySize(directory); } - var files = Directory.GetFiles(path); - foreach (var file in files) + string[] files = Directory.GetFiles(path); + foreach (string file in files) { size += new FileInfo(file).Length; } diff --git a/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs b/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs index 6f0f5ab5d..bda998bd8 100644 --- a/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs +++ b/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs @@ -22,5 +22,22 @@ namespace Ryujinx.Ava.UI.Models FifoStatus = fifoStatus; ShaderCount = shaderCount; } + + public override bool Equals(object obj) + { + if (obj is not StatusUpdatedEventArgs suea) + return false; + return + VSyncMode == suea.VSyncMode && + VolumeStatus == suea.VolumeStatus && + DockedMode == suea.DockedMode && + AspectRatio == suea.AspectRatio && + GameStatus == suea.GameStatus && + FifoStatus == suea.FifoStatus && + ShaderCount == suea.ShaderCount; + } + + public override int GetHashCode() + => HashCode.Combine(VSyncMode, VolumeStatus, AspectRatio, DockedMode, FifoStatus, GameStatus, ShaderCount); } } diff --git a/src/Ryujinx/UI/Models/TempProfile.cs b/src/Ryujinx/UI/Models/TempProfile.cs index 659092e6d..51e86fb7f 100644 --- a/src/Ryujinx/UI/Models/TempProfile.cs +++ b/src/Ryujinx/UI/Models/TempProfile.cs @@ -1,28 +1,18 @@ +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.HLE.HOS.Services.Account.Acc; using System; namespace Ryujinx.Ava.UI.Models { - public class TempProfile : BaseModel + public partial class TempProfile : BaseModel { - private readonly UserProfile _profile; - private byte[] _image; - private string _name = String.Empty; + [ObservableProperty] private byte[] _image; + [ObservableProperty] private string _name = String.Empty; private UserId _userId; public static uint MaxProfileNameLength => 0x20; - public byte[] Image - { - get => _image; - set - { - _image = value; - OnPropertyChanged(); - } - } - public UserId UserId { get => _userId; @@ -36,21 +26,9 @@ namespace Ryujinx.Ava.UI.Models public string UserIdString => _userId.ToString(); - public string Name - { - get => _name; - set - { - _name = value; - OnPropertyChanged(); - } - } - public TempProfile(UserProfile profile) { - _profile = profile; - - if (_profile != null) + if (profile != null) { Image = profile.Image; Name = profile.Name; diff --git a/src/Ryujinx/UI/Models/UserProfile.cs b/src/Ryujinx/UI/Models/UserProfile.cs index 7a9237fe1..f14e74d07 100644 --- a/src/Ryujinx/UI/Models/UserProfile.cs +++ b/src/Ryujinx/UI/Models/UserProfile.cs @@ -1,4 +1,6 @@ +using Avalonia; using Avalonia.Media; +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Views.User; @@ -7,65 +9,15 @@ using Profile = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile; namespace Ryujinx.Ava.UI.Models { - public class UserProfile : BaseModel + public partial class UserProfile : BaseModel { private readonly Profile _profile; private readonly NavigationDialogHost _owner; - private byte[] _image; - private string _name; - private UserId _userId; - private bool _isPointerOver; - private IBrush _backgroundColor; - - public byte[] Image - { - get => _image; - set - { - _image = value; - OnPropertyChanged(); - } - } - - public UserId UserId - { - get => _userId; - set - { - _userId = value; - OnPropertyChanged(); - } - } - - public string Name - { - get => _name; - set - { - _name = value; - OnPropertyChanged(); - } - } - - public bool IsPointerOver - { - get => _isPointerOver; - set - { - _isPointerOver = value; - OnPropertyChanged(); - } - } - - public IBrush BackgroundColor - { - get => _backgroundColor; - set - { - _backgroundColor = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private byte[] _image; + [ObservableProperty] private string _name; + [ObservableProperty] private UserId _userId; + [ObservableProperty] private bool _isPointerOver; + [ObservableProperty] private IBrush _backgroundColor; public UserProfile(Profile profile, NavigationDialogHost owner) { @@ -87,7 +39,7 @@ namespace Ryujinx.Ava.UI.Models private void UpdateBackground() { - var currentApplication = Avalonia.Application.Current; + Application currentApplication = Avalonia.Application.Current; currentApplication.Styles.TryGetResource("ControlFillColorSecondary", currentApplication.ActualThemeVariant, out object color); if (color is not null) diff --git a/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs b/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs index ea5a8dbdd..e360d42f7 100644 --- a/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs +++ b/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs @@ -1,10 +1,9 @@ using Avalonia; using Avalonia.Controls; -using Avalonia.Input; using Avalonia.Platform; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common.Configuration; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; +using Ryujinx.Common.Helper; using SPB.Graphics; using SPB.Platform; using SPB.Platform.GLX; @@ -116,7 +115,7 @@ namespace Ryujinx.Ava.UI.Renderer } [SupportedOSPlatform("linux")] - private IPlatformHandle CreateLinux(IPlatformHandle control) + private PlatformHandle CreateLinux(IPlatformHandle control) { if (ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.Vulkan) { @@ -135,7 +134,7 @@ namespace Ryujinx.Ava.UI.Renderer } [SupportedOSPlatform("windows")] - IPlatformHandle CreateWin32(IPlatformHandle control) + PlatformHandle CreateWin32(IPlatformHandle control) { _className = "NativeWindow-" + Guid.NewGuid(); @@ -172,7 +171,7 @@ namespace Ryujinx.Ava.UI.Renderer } [SupportedOSPlatform("macos")] - IPlatformHandle CreateMacOS() + PlatformHandle CreateMacOS() { // Create a new CAMetalLayer. ObjectiveC.Object layerObject = new("CAMetalLayer"); @@ -216,11 +215,9 @@ namespace Ryujinx.Ava.UI.Renderer } [SupportedOSPlatform("macos")] -#pragma warning disable CA1822 // Mark member as static - void DestroyMacOS() + static void DestroyMacOS() { // TODO } -#pragma warning restore CA1822 } } diff --git a/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs b/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs index 3842301de..e788272f6 100644 --- a/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs +++ b/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs @@ -1,9 +1,9 @@ using OpenTK.Graphics.OpenGL; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.OpenGL; -using Ryujinx.UI.Common.Configuration; using SPB.Graphics; using SPB.Graphics.Exceptions; using SPB.Graphics.OpenGL; @@ -44,13 +44,13 @@ namespace Ryujinx.Ava.UI.Renderer throw new PlatformNotSupportedException(); } - var flags = OpenGLContextFlags.Compat; + OpenGLContextFlags flags = OpenGLContextFlags.Compat; if (ConfigurationState.Instance.Logger.GraphicsDebugLevel != GraphicsDebugLevel.None) { flags |= OpenGLContextFlags.Debug; } - var graphicsMode = Environment.OSVersion.Platform == PlatformID.Unix ? new FramebufferFormat(new ColorFormat(8, 8, 8, 0), 16, 0, ColorFormat.Zero, 0, 2, false) : FramebufferFormat.Default; + FramebufferFormat graphicsMode = Environment.OSVersion.Platform == PlatformID.Unix ? new FramebufferFormat(new ColorFormat(8, 8, 8, 0), 16, 0, ColorFormat.Zero, 0, 2, false) : FramebufferFormat.Default; Context = PlatformHelper.CreateOpenGLContext(graphicsMode, 3, 3, flags); diff --git a/src/Ryujinx/UI/Renderer/RendererHost.axaml b/src/Ryujinx/UI/Renderer/RendererHost.axaml deleted file mode 100644 index e0b586b45..000000000 --- a/src/Ryujinx/UI/Renderer/RendererHost.axaml +++ /dev/null @@ -1,12 +0,0 @@ - - diff --git a/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs b/src/Ryujinx/UI/Renderer/RendererHost.cs similarity index 64% rename from src/Ryujinx/UI/Renderer/RendererHost.axaml.cs rename to src/Ryujinx/UI/Renderer/RendererHost.cs index 4bf10d0d7..9d24fbbad 100644 --- a/src/Ryujinx/UI/Renderer/RendererHost.axaml.cs +++ b/src/Ryujinx/UI/Renderer/RendererHost.cs @@ -1,12 +1,13 @@ using Avalonia; using Avalonia.Controls; +using Avalonia.Media; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common.Configuration; -using Ryujinx.UI.Common.Configuration; using System; namespace Ryujinx.Ava.UI.Renderer { - public partial class RendererHost : UserControl, IDisposable + public class RendererHost : UserControl, IDisposable { public readonly EmbeddedWindow EmbeddedWindow; @@ -15,20 +16,28 @@ namespace Ryujinx.Ava.UI.Renderer public RendererHost() { - InitializeComponent(); + Focusable = true; + FlowDirection = FlowDirection.LeftToRight; - if (ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.OpenGl) + EmbeddedWindow = ConfigurationState.Instance.Graphics.GraphicsBackend.Value switch { - EmbeddedWindow = new EmbeddedWindowOpenGL(); - } - else - { - EmbeddedWindow = new EmbeddedWindowVulkan(); - } + GraphicsBackend.OpenGl => new EmbeddedWindowOpenGL(), + GraphicsBackend.Vulkan => new EmbeddedWindowVulkan(), + _ => throw new NotSupportedException() + }; Initialize(); } + public GraphicsBackend Backend => + EmbeddedWindow switch + { + EmbeddedWindowVulkan => GraphicsBackend.Vulkan, + EmbeddedWindowOpenGL => GraphicsBackend.OpenGl, + _ => throw new NotImplementedException() + }; + + private void Initialize() { EmbeddedWindow.WindowCreated += CurrentWindow_WindowCreated; diff --git a/src/Ryujinx/App.axaml b/src/Ryujinx/UI/RyujinxApp.axaml similarity index 54% rename from src/Ryujinx/App.axaml rename to src/Ryujinx/UI/RyujinxApp.axaml index 5a603509c..bffb5cece 100644 --- a/src/Ryujinx/App.axaml +++ b/src/Ryujinx/UI/RyujinxApp.axaml @@ -1,17 +1,25 @@ + + avares://Ryujinx/Assets/Fonts/Mono/#JetBrains Mono + - + + + + + + diff --git a/src/Ryujinx/App.axaml.cs b/src/Ryujinx/UI/RyujinxApp.axaml.cs similarity index 78% rename from src/Ryujinx/App.axaml.cs rename to src/Ryujinx/UI/RyujinxApp.axaml.cs index 15ada201c..34c2d96ca 100644 --- a/src/Ryujinx/App.axaml.cs +++ b/src/Ryujinx/UI/RyujinxApp.axaml.cs @@ -1,42 +1,53 @@ using Avalonia; using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Input.Platform; using Avalonia.Markup.Xaml; using Avalonia.Platform; using Avalonia.Styling; using Avalonia.Threading; using FluentAvalonia.UI.Windowing; using Gommon; -using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.Views.Dialog; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; using Ryujinx.Common; using Ryujinx.Common.Logging; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; using System; using System.Diagnostics; namespace Ryujinx.Ava { - public class App : Application + public class RyujinxApp : Application { - internal static string FormatTitle(LocaleKeys? windowTitleKey = null) - => windowTitleKey is null - ? $"{FullAppName} {Program.Version}" - : $"{FullAppName} {Program.Version} - {LocaleManager.Instance[windowTitleKey.Value]}"; + public static event Action ThemeChanged; - public static readonly string FullAppName = ReleaseInformation.IsCanaryBuild ? "Ryujinx Canary" : "Ryujinx"; + internal static string FormatTitle(LocaleKeys? windowTitleKey = null, bool includeVersion = true) + => windowTitleKey is null + ? $"{FullAppName}{(includeVersion ? $" {Program.Version}" : string.Empty)}" + : $"{FullAppName}{(includeVersion ? $" {Program.Version}" : string.Empty)} - {LocaleManager.Instance[windowTitleKey.Value]}"; + + public static readonly string FullAppName = string.Intern(ReleaseInformation.IsCanaryBuild ? "Ryujinx Canary" : "Ryujinx"); public static MainWindow MainWindow => Current! .ApplicationLifetime.Cast() .MainWindow.Cast(); + public static IClassicDesktopStyleApplicationLifetime AppLifetime => Current! + .ApplicationLifetime.Cast(); + + public static bool IsClipboardAvailable(out IClipboard clipboard) + { + clipboard = MainWindow.Clipboard; + return clipboard != null; + } + public static void SetTaskbarProgress(TaskBarProgressBarState state) => MainWindow.PlatformFeatures.SetTaskBarProgressBarState(state); public static void SetTaskbarProgressValue(ulong current, ulong total) => MainWindow.PlatformFeatures.SetTaskBarProgressBarValue(current, total); public static void SetTaskbarProgressValue(long current, long total) => SetTaskbarProgressValue(Convert.ToUInt64(current), Convert.ToUInt64(total)); - public override void Initialize() { Name = FormatTitle(); @@ -72,7 +83,7 @@ namespace Ryujinx.Ava { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - var result = await ContentDialogHelper.CreateConfirmationDialog( + UserResult result = await ContentDialogHelper.CreateConfirmationDialog( LocaleManager.Instance[LocaleKeys.DialogThemeRestartMessage], LocaleManager.Instance[LocaleKeys.DialogThemeRestartSubMessage], LocaleManager.Instance[LocaleKeys.InputDialogYes], @@ -102,7 +113,7 @@ namespace Ryujinx.Ava baseStyle = ConfigurationState.Instance.UI.BaseStyle; } - ThemeManager.OnThemeChanged(); + ThemeChanged?.Invoke(); RequestedThemeVariant = baseStyle switch { @@ -132,8 +143,13 @@ namespace Ryujinx.Ava }; public static ThemeVariant DetectSystemTheme() => - Current is App { PlatformSettings: not null } app + Current is RyujinxApp { PlatformSettings: not null } app ? ConvertThemeVariant(app.PlatformSettings.GetColorValues().ThemeVariant) : ThemeVariant.Default; + + private async void AboutRyujinx_OnClick(object sender, EventArgs e) + { + await AboutView.Show(); + } } } diff --git a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs index c48ad378f..727294992 100644 --- a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs @@ -1,81 +1,58 @@ using Avalonia.Media.Imaging; using Avalonia.Styling; using Avalonia.Threading; -using Ryujinx.Ava.Common; +using CommunityToolkit.Mvvm.ComponentModel; +using Gommon; using Ryujinx.Ava.Common.Locale; -using Ryujinx.UI.Common.Configuration; +using Ryujinx.Ava.Systems.Configuration; using System; namespace Ryujinx.Ava.UI.ViewModels { - public class AboutWindowViewModel : BaseModel, IDisposable + public partial class AboutWindowViewModel : BaseModel, IDisposable { - private Bitmap _githubLogo; - private Bitmap _discordLogo; + [ObservableProperty] private Bitmap _gitLabLogo; + [ObservableProperty] private Bitmap _discordLogo; + [ObservableProperty] private string _version; - private string _version; + public string Developers => "GreemDev, LotP"; - public Bitmap GithubLogo - { - get => _githubLogo; - set - { - _githubLogo = value; - OnPropertyChanged(); - } - } - - public Bitmap DiscordLogo - { - get => _discordLogo; - set - { - _discordLogo = value; - OnPropertyChanged(); - } - } - - public string Version - { - get => _version; - set - { - _version = value; - OnPropertyChanged(); - } - } - - public string Developers => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.AboutPageDeveloperListMore, "gdkchan, Ac_K, marysaka, rip in peri peri, LDj3SNuD, emmaus, Thealexbarney, GoffyDude, TSRBerry, IsaacMarovitz, GreemDev"); + public string FormerDevelopers => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.AboutPageDeveloperListMore, "gdkchan, Ac_K, marysaka, rip in peri peri, LDj3SNuD, emmaus, Thealexbarney, GoffyDude, TSRBerry, IsaacMarovitz"); public AboutWindowViewModel() { - Version = App.FullAppName + "\n" + Program.Version; + Version = RyujinxApp.FullAppName + "\n" + Program.Version; UpdateLogoTheme(ConfigurationState.Instance.UI.BaseStyle.Value); - ThemeManager.ThemeChanged += ThemeManager_ThemeChanged; + RyujinxApp.ThemeChanged += Ryujinx_ThemeChanged; } - private void ThemeManager_ThemeChanged(object sender, EventArgs e) + private void Ryujinx_ThemeChanged() { Dispatcher.UIThread.Post(() => UpdateLogoTheme(ConfigurationState.Instance.UI.BaseStyle.Value)); } + private const string LogoPathFormat = "resm:Ryujinx.Assets.UIImages.Logo_{0}_{1}.png?assembly=Ryujinx"; + private void UpdateLogoTheme(string theme) { - bool isDarkTheme = theme == "Dark" || (theme == "Auto" && App.DetectSystemTheme() == ThemeVariant.Dark); + bool isDarkTheme = theme == "Dark" || (theme == "Auto" && RyujinxApp.DetectSystemTheme() == ThemeVariant.Dark); - string basePath = "resm:Ryujinx.UI.Common.Resources."; - string themeSuffix = isDarkTheme ? "Dark.png" : "Light.png"; + string themeName = isDarkTheme ? "Dark" : "Light"; - GithubLogo = LoadBitmap($"{basePath}Logo_GitHub_{themeSuffix}?assembly=Ryujinx.UI.Common"); - DiscordLogo = LoadBitmap($"{basePath}Logo_Discord_{themeSuffix}?assembly=Ryujinx.UI.Common"); + DiscordLogo = LoadBitmap(LogoPathFormat.Format("Discord", themeName)); + GitLabLogo = LoadBitmap(LogoPathFormat.Format("GitLab", themeName)); } private static Bitmap LoadBitmap(string uri) => new(Avalonia.Platform.AssetLoader.Open(new Uri(uri))); public void Dispose() { - ThemeManager.ThemeChanged -= ThemeManager_ThemeChanged; + RyujinxApp.ThemeChanged -= Ryujinx_ThemeChanged; + + GitLabLogo.Dispose(); + DiscordLogo.Dispose(); + GC.SuppressFinalize(this); } } diff --git a/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs index a852d474c..48c0837b4 100644 --- a/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs @@ -3,13 +3,13 @@ using Avalonia.Collections; using Avalonia.Media.Imaging; using Avalonia.Threading; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models.Amiibo; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Windows; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; -using Ryujinx.UI.Common.Models.Amiibo; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -64,11 +64,11 @@ namespace Ryujinx.Ava.UI.ViewModels Directory.CreateDirectory(Path.Join(AppDataManager.BaseDirPath, "system", "amiibo")); _amiiboJsonPath = Path.Join(AppDataManager.BaseDirPath, "system", "amiibo", "Amiibo.json"); - _amiiboList = new List(); - _amiiboSeries = new ObservableCollection(); - _amiibos = new AvaloniaList(); + _amiiboList = []; + _amiiboSeries = []; + _amiibos = []; - _amiiboLogoBytes = EmbeddedResources.Read("Ryujinx.UI.Common/Resources/Logo_Amiibo.png"); + _amiiboLogoBytes = EmbeddedResources.Read("Ryujinx/Assets/UIImages/Logo_Amiibo.png"); _ = LoadContentAsync(); } @@ -264,7 +264,7 @@ namespace Ryujinx.Ava.UI.ViewModels Logger.Error?.Print(LogClass.Application, $"Couldn't get valid amiibo data: {exception}"); // Neither local or remote files are valid JSON, close window. - ShowInfoDialog(); + await ShowInfoDialog(); Close(); } else if (!remoteIsValid) @@ -273,7 +273,7 @@ namespace Ryujinx.Ava.UI.ViewModels // Only the local file is valid, the local one should be used // but the user should be warned. - ShowInfoDialog(); + await ShowInfoDialog(); } } @@ -332,7 +332,7 @@ namespace Ryujinx.Ava.UI.ViewModels private void SelectLastScannedAmiibo() { - AmiiboApi scanned = _amiiboList.Find(amiibo => amiibo.GetId() == LastScannedAmiiboId); + AmiiboApi scanned = _amiiboList.FirstOrDefault(amiibo => amiibo.GetId() == LastScannedAmiiboId); SeriesSelectedIndex = AmiiboSeries.IndexOf(scanned.AmiiboSeries); AmiiboSelectedIndex = AmiiboList.IndexOf(scanned); @@ -393,7 +393,7 @@ namespace Ryujinx.Ava.UI.ViewModels AmiiboApi selected = _amiibos[_amiiboSelectedIndex]; - string imageUrl = _amiiboList.Find(amiibo => amiibo.Equals(selected)).Image; + string imageUrl = _amiiboList.FirstOrDefault(amiibo => amiibo.Equals(selected)).Image; StringBuilder usageStringBuilder = new(); @@ -432,7 +432,7 @@ namespace Ryujinx.Ava.UI.ViewModels { try { - HttpResponseMessage response = await _httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, "https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/Amiibo.json")); + HttpResponseMessage response = await _httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, "https://raw.githubusercontent.com/Ryubing/Nfc/refs/heads/main/tags.json")); if (response.IsSuccessStatusCode) { @@ -451,7 +451,7 @@ namespace Ryujinx.Ava.UI.ViewModels { try { - HttpResponseMessage response = await _httpClient.GetAsync($"https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/assets/amiibo/Amiibo.json"); + HttpResponseMessage response = await _httpClient.GetAsync("https://raw.githubusercontent.com/Ryubing/Nfc/refs/heads/main/tags.json"); if (response.IsSuccessStatusCode) { @@ -525,7 +525,7 @@ namespace Ryujinx.Ava.UI.ViewModels AmiiboImage = bitmap; } - private static async void ShowInfoDialog() + private static async Task ShowInfoDialog() { await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogAmiiboApiTitle], LocaleManager.Instance[LocaleKeys.DialogAmiiboApiConnectErrorMessage], diff --git a/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs b/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs index e80984508..c8d648b99 100644 --- a/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs +++ b/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs @@ -1,4 +1,4 @@ -using Ryujinx.UI.App.Common; +using Ryujinx.Ava.Systems.AppLibrary; using System; namespace Ryujinx.Ava.UI.ViewModels diff --git a/src/Ryujinx/UI/ViewModels/ApplicationDataViewModel.cs b/src/Ryujinx/UI/ViewModels/ApplicationDataViewModel.cs new file mode 100644 index 000000000..431503e71 --- /dev/null +++ b/src/Ryujinx/UI/ViewModels/ApplicationDataViewModel.cs @@ -0,0 +1,29 @@ +using Gommon; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.Systems.PlayReport; + +namespace Ryujinx.Ava.UI.ViewModels +{ + public class ApplicationDataViewModel : BaseModel + { + public ApplicationData AppData { get; } + + public ApplicationDataViewModel(ApplicationData appData) => AppData = appData; + + public string DynamicRichPresenceDescription => + AppData.HasDynamicRichPresenceSupport + ? AppData.RichPresenceSpec.Value.Description + : GameSpec.DefaultDescription; + + public string FormattedVersion => LocaleManager.Instance[LocaleKeys.GameListHeaderVersion].Format(AppData.Version); + public string FormattedDeveloper => LocaleManager.Instance[LocaleKeys.GameListHeaderDeveloper].Format(AppData.Developer); + public string FormattedFileExtension => LocaleManager.Instance[LocaleKeys.GameListHeaderFileExtension].Format(AppData.FileExtension); + public string FormattedFileSize => LocaleManager.Instance[LocaleKeys.GameListHeaderFileSize].Format(AppData.FileSizeString); + + public string FormattedLdnInfo => + $"{LocaleManager.Instance[LocaleKeys.GameListHeaderHostedGames].Format(AppData.GameCount)}" + + $"\n" + + $"{LocaleManager.Instance[LocaleKeys.GameListHeaderPlayerCount].Format(AppData.PlayerCount)}"; + } +} diff --git a/src/Ryujinx/UI/ViewModels/BaseModel.cs b/src/Ryujinx/UI/ViewModels/BaseModel.cs index 4db9cf812..94c5ddfdb 100644 --- a/src/Ryujinx/UI/ViewModels/BaseModel.cs +++ b/src/Ryujinx/UI/ViewModels/BaseModel.cs @@ -1,15 +1,17 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; +using CommunityToolkit.Mvvm.ComponentModel; +using System; namespace Ryujinx.Ava.UI.ViewModels { - public class BaseModel : INotifyPropertyChanged + public class BaseModel : ObservableObject { - public event PropertyChangedEventHandler PropertyChanged; - - protected void OnPropertyChanged([CallerMemberName] string propertyName = null) + protected void OnPropertiesChanged(string firstPropertyName, params ReadOnlySpan propertyNames) { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + OnPropertyChanged(firstPropertyName); + foreach (string propertyName in propertyNames) + { + OnPropertyChanged(propertyName); + } } } } diff --git a/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs b/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs new file mode 100644 index 000000000..8a5ae441b --- /dev/null +++ b/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs @@ -0,0 +1,167 @@ +using Gommon; +using Ryujinx.Ava.Systems; +using Ryujinx.Ava.Systems.AppLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using Ryujinx.Ava.Common.Locale; + +namespace Ryujinx.Ava.UI.ViewModels +{ + public class CompatibilityViewModel : BaseModel, IDisposable + { + private readonly ApplicationLibrary _appLibrary; + + private (int Status, int Name) _sorting; + + public bool IsSortedByTitle => true; + public bool IsSortedByStatus => true; + + // Avalonia takes names of status from these variables + public LocaleKeys IsStringPlayable => LocaleKeys.CompatibilityListPlayable; + public LocaleKeys IsStringInGame => LocaleKeys.CompatibilityListIngame; + public LocaleKeys IsStringMenus => LocaleKeys.CompatibilityListMenus; + public LocaleKeys IsStringBoots => LocaleKeys.CompatibilityListBoots; + public LocaleKeys IsStringNothing => LocaleKeys.CompatibilityListNothing; + + public string PlayableInfoText { get; set; } + public string InGameInfoText { get; set; } + public string MenusInfoText { get; set; } + public string BootsInfoText { get; set; } + public string NothingInfoText { get; set; } + + + private IEnumerable _currentEntries = CompatibilityDatabase.Entries; + + private string[] _ownedGameTitleIds = []; + + private Func _sortKeySelector = x => x.GameName; // Default sort by GameName + + public IEnumerable CurrentEntries => OnlyShowOwnedGames + ? _currentEntries.Where(x => + x.TitleId.Check(tid => _ownedGameTitleIds.ContainsIgnoreCase(tid))) + : _currentEntries; + + public CompatibilityViewModel() {} + + private void AppCountUpdated(object _, ApplicationCountUpdatedEventArgs __) + => _ownedGameTitleIds = _appLibrary.Applications.Keys.Select(x => x.ToString("X16")).ToArray(); + + public CompatibilityViewModel(ApplicationLibrary appLibrary) + { + _appLibrary = appLibrary; + AppCountUpdated(null, null); + CountByStatus(); + _appLibrary.ApplicationCountUpdated += AppCountUpdated; + } + + public void CountByStatus() + { + PlayableInfoText = LocaleManager.Instance[LocaleKeys.CompatibilityListPlayable] + ": " + CurrentEntries.Count(x => x.Status == LocaleKeys.CompatibilityListPlayable); + InGameInfoText = LocaleManager.Instance[LocaleKeys.CompatibilityListIngame] + ": " + CurrentEntries.Count(x => x.Status == LocaleKeys.CompatibilityListIngame); + MenusInfoText = LocaleManager.Instance[LocaleKeys.CompatibilityListMenus] + ": " + CurrentEntries.Count(x => x.Status == LocaleKeys.CompatibilityListMenus); + BootsInfoText = LocaleManager.Instance[LocaleKeys.CompatibilityListBoots] + ": " + CurrentEntries.Count(x => x.Status == LocaleKeys.CompatibilityListBoots); + NothingInfoText = LocaleManager.Instance[LocaleKeys.CompatibilityListNothing] + ": " + CurrentEntries.Count(x => x.Status == LocaleKeys.CompatibilityListNothing); + + _onlyShowOwnedGames = true; + } + + void IDisposable.Dispose() + { + GC.SuppressFinalize(this); + _appLibrary.ApplicationCountUpdated -= AppCountUpdated; + } + + private bool _onlyShowOwnedGames; + + public bool OnlyShowOwnedGames + { + get => _onlyShowOwnedGames; + set + { + OnPropertyChanging(); + OnPropertyChanging(nameof(CurrentEntries)); + _onlyShowOwnedGames = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(CurrentEntries)); + } + } + + + public void NameSorting(int nameSort = 0) + { + _sorting.Name = nameSort; + SortApply(); + OnPropertyChanged(); + OnPropertyChanged(nameof(SortName)); + } + + public void StatusSorting(int statusSort = 0) + { + _sorting.Status = statusSort; + SortApply(); + OnPropertyChanged(); + OnPropertyChanged(nameof(SortName)); + } + + public void Search(string searchTerm) + { + if (string.IsNullOrEmpty(searchTerm)) + { + SetEntries(CompatibilityDatabase.Entries); + SortApply(); + return; + } + + SetEntries(CompatibilityDatabase.Entries.Where(x => + x.GameName.ContainsIgnoreCase(searchTerm) + || x.TitleId.Check(tid => tid.ContainsIgnoreCase(searchTerm)))); + + SortApply(); + } + + private void SetEntries(IEnumerable entries) + { + _currentEntries = entries.ToList(); + OnPropertyChanged(nameof(CurrentEntries)); + } + + private void SortApply() + { + try + { + _currentEntries = (_sorting switch + { + (0, 0) => _currentEntries.OrderBy(x => _sortKeySelector(x) ?? string.Empty), // A - Z + (0, 1) => _currentEntries.OrderByDescending(x => _sortKeySelector(x) ?? string.Empty), // Z - A + (1, 0) => _currentEntries.OrderBy(x => x.Status).ThenBy(x => x.GameName, StringComparer.OrdinalIgnoreCase), // Status Playable - Nothing, then A - Z + (1, 1) => _currentEntries.OrderBy(x => x.Status).ThenByDescending(x => x.GameName, StringComparer.OrdinalIgnoreCase), // Status Nothing - Playable, then A - Z + (2, 0) => _currentEntries.OrderByDescending(x => x.Status).ThenBy(x => x.GameName, StringComparer.OrdinalIgnoreCase), // Status Playable - Nothing, then Z - A + (2, 1) => _currentEntries.OrderByDescending(x => x.Status).ThenByDescending(x => x.GameName, StringComparer.OrdinalIgnoreCase), // Status Nothing - Playable, then Z - A + _ => _currentEntries.OrderBy(x => x.Status) + }).ToList(); + } + catch (Exception) + { + + } + + OnPropertyChanged(); + OnPropertyChanged(nameof(CurrentEntries)); + } + + public string SortName + { + get + { + return (_sorting.Name) switch + { + (0) => LocaleManager.Instance[LocaleKeys.GameListSortStatusNameAscending], + (1) => LocaleManager.Instance[LocaleKeys.GameListSortStatusNameDescending], + _ => string.Empty, + }; + } + } + + } +} diff --git a/src/Ryujinx/UI/ViewModels/DlcSelectViewModel.cs b/src/Ryujinx/UI/ViewModels/DlcSelectViewModel.cs new file mode 100644 index 000000000..643614d6e --- /dev/null +++ b/src/Ryujinx/UI/ViewModels/DlcSelectViewModel.cs @@ -0,0 +1,23 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Systems.AppLibrary; +using System.Linq; + +namespace Ryujinx.Ava.UI.ViewModels +{ + public partial class DlcSelectViewModel : BaseModel + { + [ObservableProperty] private DownloadableContentModel[] _dlcs; +#nullable enable + [ObservableProperty] private DownloadableContentModel? _selectedDlc; +#nullable disable + + public DlcSelectViewModel(ulong titleId, ApplicationLibrary appLibrary) + { + _dlcs = appLibrary.FindDlcsFor(titleId) + .OrderBy(it => it.IsBundled ? 0 : 1) + .ThenBy(it => it.TitleId) + .ToArray(); + } + } +} diff --git a/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs b/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs index 3abaae3ae..c048b481c 100644 --- a/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs @@ -1,29 +1,28 @@ using Avalonia.Collections; -using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Platform.Storage; using Avalonia.Threading; +using CommunityToolkit.Mvvm.ComponentModel; using DynamicData; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Ava.UI.Helpers; -using Ryujinx.HLE.FileSystem; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Models; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Threading.Tasks; -using Application = Avalonia.Application; namespace Ryujinx.Ava.UI.ViewModels { - public class DownloadableContentManagerViewModel : BaseModel + public partial class DownloadableContentManagerViewModel : BaseModel { private readonly ApplicationLibrary _applicationLibrary; - private AvaloniaList _downloadableContents = new(); - private AvaloniaList _selectedDownloadableContents = new(); - private AvaloniaList _views = new(); - private bool _showBundledContentNotice = false; + private AvaloniaList _downloadableContents = []; + [ObservableProperty] private AvaloniaList _selectedDownloadableContents = []; + [ObservableProperty] private AvaloniaList _views = []; + [ObservableProperty] private bool _showBundledContentNotice = false; private string _search; private readonly ApplicationData _applicationData; @@ -41,26 +40,6 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public AvaloniaList Views - { - get => _views; - set - { - _views = value; - OnPropertyChanged(); - } - } - - public AvaloniaList SelectedDownloadableContents - { - get => _selectedDownloadableContents; - set - { - _selectedDownloadableContents = value; - OnPropertyChanged(); - } - } - public string Search { get => _search; @@ -77,34 +56,20 @@ namespace Ryujinx.Ava.UI.ViewModels get => string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowHeading], DownloadableContents.Count); } - public bool ShowBundledContentNotice - { - get => _showBundledContentNotice; - set - { - _showBundledContentNotice = value; - OnPropertyChanged(); - } - } - public DownloadableContentManagerViewModel(ApplicationLibrary applicationLibrary, ApplicationData applicationData) { _applicationLibrary = applicationLibrary; _applicationData = applicationData; - if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - _storageProvider = desktop.MainWindow.StorageProvider; - } + _storageProvider = RyujinxApp.MainWindow.StorageProvider; LoadDownloadableContents(); } private void LoadDownloadableContents() { - var dlcs = _applicationLibrary.DownloadableContents.Items - .Where(it => it.Dlc.TitleIdBase == _applicationData.IdBase); + (DownloadableContentModel Dlc, bool IsEnabled)[] dlcs = _applicationLibrary.FindDlcConfigurationFor(_applicationData.Id); bool hasBundledContent = false; foreach ((DownloadableContentModel dlc, bool isEnabled) in dlcs) @@ -133,14 +98,14 @@ namespace Ryujinx.Ava.UI.ViewModels .ThenBy(it => it.TitleId) .AsObservableChangeSet() .Filter(Filter) - .Bind(out var view).AsObservableList(); + .Bind(out ReadOnlyObservableCollection view).AsObservableList(); // NOTE(jpr): this works around a bug where calling _views.Clear also clears SelectedDownloadableContents for // some reason. so we save the items here and add them back after - var items = SelectedDownloadableContents.ToArray(); + DownloadableContentModel[] items = SelectedDownloadableContents.ToArray(); - _views.Clear(); - _views.AddRange(view); + Views.Clear(); + Views.AddRange(view); foreach (DownloadableContentModel item in items) { @@ -154,7 +119,7 @@ namespace Ryujinx.Ava.UI.ViewModels { if (arg is DownloadableContentModel content) { - return string.IsNullOrWhiteSpace(_search) || content.FileName.ToLower().Contains(_search.ToLower()) || content.TitleIdStr.ToLower().Contains(_search.ToLower()); + return string.IsNullOrWhiteSpace(_search) || content.FileName.Contains(_search, System.StringComparison.OrdinalIgnoreCase) || content.TitleIdStr.Contains(_search, System.StringComparison.OrdinalIgnoreCase); } return false; @@ -162,7 +127,7 @@ namespace Ryujinx.Ava.UI.ViewModels public async void Add() { - var result = await _storageProvider.OpenFilePickerAsync(new FilePickerOpenOptions + IReadOnlyList result = await _storageProvider.OpenFilePickerAsync(new FilePickerOpenOptions { Title = LocaleManager.Instance[LocaleKeys.SelectDlcDialogTitle], AllowMultiple = true, @@ -170,17 +135,17 @@ namespace Ryujinx.Ava.UI.ViewModels { new("NSP") { - Patterns = new[] { "*.nsp" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.nsp" }, - MimeTypes = new[] { "application/x-nx-nsp" }, + Patterns = ["*.nsp"], + AppleUniformTypeIdentifiers = ["com.ryujinx.nsp"], + MimeTypes = ["application/x-nx-nsp"], }, }, }); - var totalDlcAdded = 0; - foreach (var file in result) + int totalDlcAdded = 0; + foreach (IStorageFile file in result) { - if (!AddDownloadableContent(file.Path.LocalPath, out var newDlcAdded)) + if (!AddDownloadableContent(file.Path.LocalPath, out int newDlcAdded)) { await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogDlcNoDlcErrorMessage]); } @@ -203,18 +168,18 @@ namespace Ryujinx.Ava.UI.ViewModels return false; } - if (!_applicationLibrary.TryGetDownloadableContentFromFile(path, out var dlcs) || dlcs.Count == 0) + if (!_applicationLibrary.TryGetDownloadableContentFromFile(path, out List dlcs) || dlcs.Count == 0) { return false; } - var dlcsForThisGame = dlcs.Where(it => it.TitleIdBase == _applicationData.IdBase).ToList(); + List dlcsForThisGame = dlcs.Where(it => it.TitleIdBase == _applicationData.IdBase).ToList(); if (dlcsForThisGame.Count == 0) { return false; } - foreach (var dlc in dlcsForThisGame) + foreach (DownloadableContentModel dlc in dlcsForThisGame) { if (!DownloadableContents.Contains(dlc)) { @@ -278,22 +243,22 @@ namespace Ryujinx.Ava.UI.ViewModels public void Save() { - var dlcs = DownloadableContents.Select(it => (it, SelectedDownloadableContents.Contains(it))).ToList(); + List<(DownloadableContentModel it, bool)> dlcs = DownloadableContents.Select(it => (it, SelectedDownloadableContents.Contains(it))).ToList(); _applicationLibrary.SaveDownloadableContentsForGame(_applicationData, dlcs); } private Task ShowNewDlcAddedDialog(int numAdded) { - var msg = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowDlcAddedMessage], numAdded); + string msg = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowDlcAddedMessage], numAdded); return Dispatcher.UIThread.InvokeAsync(async () => { await ContentDialogHelper.ShowTextDialog( - LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle], - msg, - string.Empty, - string.Empty, - string.Empty, - LocaleManager.Instance[LocaleKeys.InputDialogOk], + LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle], + msg, + string.Empty, + string.Empty, + string.Empty, + LocaleManager.Instance[LocaleKeys.InputDialogOk], (int)Symbol.Checkmark); }); } diff --git a/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs index 6ee79a371..61d3ffd59 100644 --- a/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs @@ -1,10 +1,14 @@ using Avalonia.Svg.Skia; +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.Models.Input; using Ryujinx.Ava.UI.Views.Input; +using Ryujinx.Common.Utilities; +using Ryujinx.UI.Views.Input; +using System.Drawing; namespace Ryujinx.Ava.UI.ViewModels.Input { - public class ControllerInputViewModel : BaseModel + public partial class ControllerInputViewModel : BaseModel { private GamepadInputConfig _config; public GamepadInputConfig Config @@ -13,6 +17,19 @@ namespace Ryujinx.Ava.UI.ViewModels.Input set { _config = value; + + OnPropertyChanged(); + } + } + + private StickVisualizer _visualizer; + public StickVisualizer Visualizer + { + get => _visualizer; + set + { + _visualizer = value; + OnPropertyChanged(); } } @@ -43,35 +60,52 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public bool HasSides => IsLeft ^ IsRight; - private SvgImage _image; - public SvgImage Image - { - get => _image; - set - { - _image = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private SvgImage _image; - public readonly InputViewModel ParentModel; + public InputViewModel ParentModel { get; } - public ControllerInputViewModel(InputViewModel model, GamepadInputConfig config) + public ControllerInputViewModel(InputViewModel model, GamepadInputConfig config, StickVisualizer visualizer) { ParentModel = model; + Visualizer = visualizer; model.NotifyChangesEvent += OnParentModelChanged; OnParentModelChanged(); + config.PropertyChanged += (_, args) => + { + if (args.PropertyName is nameof(Config.UseRainbowLed)) + { + if (Config is { UseRainbowLed: true, TurnOffLed: false, EnableLedChanging: true }) + Rainbow.Updated += (ref Color color) => ParentModel.SelectedGamepad.SetLed((uint)color.ToArgb()); + else + { + Rainbow.Reset(); + + if (Config.TurnOffLed) + ParentModel.SelectedGamepad.ClearLed(); + else + ParentModel.SelectedGamepad.SetLed(Config.LedColor.ToUInt32()); + } + } + }; Config = config; } public async void ShowMotionConfig() { await MotionInputView.Show(this); + ParentModel.IsModified = true; } public async void ShowRumbleConfig() { await RumbleInputView.Show(this); + ParentModel.IsModified = true; + } + + public async void ShowLedConfig() + { + await LedInputView.Show(this); + ParentModel.IsModified = true; } public void OnParentModelChanged() diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs index 54f278cec..81aae6b74 100644 --- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs @@ -1,11 +1,12 @@ -using Avalonia; using Avalonia.Collections; using Avalonia.Controls; -using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Svg.Skia; using Avalonia.Threading; +using CommunityToolkit.Mvvm.ComponentModel; +using Gommon; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Input; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.Models.Input; @@ -19,10 +20,10 @@ using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.Input; -using Ryujinx.UI.Common.Configuration; using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Drawing; using System.IO; using System.Linq; using System.Text.Json; @@ -32,13 +33,13 @@ using Key = Ryujinx.Common.Configuration.Hid.Key; namespace Ryujinx.Ava.UI.ViewModels.Input { - public class InputViewModel : BaseModel, IDisposable + public partial class InputViewModel : BaseModel, IDisposable { private const string Disabled = "disabled"; - private const string ProControllerResource = "Ryujinx.UI.Common/Resources/Controller_ProCon.svg"; - private const string JoyConPairResource = "Ryujinx.UI.Common/Resources/Controller_JoyConPair.svg"; - private const string JoyConLeftResource = "Ryujinx.UI.Common/Resources/Controller_JoyConLeft.svg"; - private const string JoyConRightResource = "Ryujinx.UI.Common/Resources/Controller_JoyConRight.svg"; + private const string ProControllerResource = "Ryujinx/Assets/Icons/Controller_ProCon.svg"; + private const string JoyConPairResource = "Ryujinx/Assets/Icons/Controller_JoyConPair.svg"; + private const string JoyConLeftResource = "Ryujinx/Assets/Icons/Controller_JoyConLeft.svg"; + private const string JoyConRightResource = "Ryujinx/Assets/Icons/Controller_JoyConRight.svg"; private const string KeyboardString = "keyboard"; private const string ControllerString = "controller"; private readonly MainWindow _mainWindow; @@ -49,13 +50,36 @@ namespace Ryujinx.Ava.UI.ViewModels.Input private string _controllerImage; private int _device; private object _configViewModel; - private string _profileName; + private bool _isChangeTrackingActive; + private string _chosenProfile; + [ObservableProperty] private bool _isModified; + [ObservableProperty] private string _profileName; + [ObservableProperty] private bool _notificationIsVisible; // Automatically call the NotificationView property with OnPropertyChanged() + [ObservableProperty] private string _notificationText; // Automatically call the NotificationText property with OnPropertyChanged() private bool _isLoaded; private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); public IGamepadDriver AvaloniaKeyboardDriver { get; } - public IGamepad SelectedGamepad { get; private set; } + + private IGamepad _selectedGamepad; + + public IGamepad SelectedGamepad + { + get => _selectedGamepad; + private set + { + Rainbow.Reset(); + + _selectedGamepad = value; + + if (ConfigViewModel is ControllerInputViewModel { Config.UseRainbowLed: true }) + Rainbow.Updated += (ref Color color) => _selectedGamepad.SetLed((uint)color.ToArgb()); + + OnPropertiesChanged(nameof(HasLed), nameof(CanClearLed)); + } + } + public StickVisualizer VisualStick { get; private set; } public ObservableCollection PlayerIndexes { get; set; } public ObservableCollection<(DeviceType Type, string Id, string Name)> Devices { get; set; } @@ -63,15 +87,32 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public AvaloniaList ProfilesList { get; set; } public AvaloniaList DeviceList { get; set; } + public bool UseGlobalConfig; + // XAML Flags public bool ShowSettings => _device > 0; public bool IsController => _device > 1; public bool IsKeyboard => !IsController; public bool IsRight { get; set; } public bool IsLeft { get; set; } + public string RevertDeviceId { get; set; } + public bool HasLed => SelectedGamepad.Features.HasFlag(GamepadFeaturesFlag.Led); + public bool CanClearLed => SelectedGamepad.Name.ContainsIgnoreCase("DualSense"); - public bool IsModified { get; set; } public event Action NotifyChangesEvent; + + public string ChosenProfile + { + get => _chosenProfile; + set + { + // When you select a profile, the settings from the profile will be applied. + // To save the settings, you still need to click the apply button + _chosenProfile = value; + LoadProfile(); + OnPropertyChanged(); + } + } public object ConfigViewModel { @@ -80,6 +121,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input { _configViewModel = value; + VisualStick.UpdateConfig(value); + OnPropertyChanged(); } } @@ -97,27 +140,28 @@ namespace Ryujinx.Ava.UI.ViewModels.Input { if (IsModified) { - _playerIdChoose = value; return; } IsModified = false; _playerId = value; + _isChangeTrackingActive = false; - if (!Enum.IsDefined(typeof(PlayerIndex), _playerId)) + if (!Enum.IsDefined(_playerId)) { _playerId = PlayerIndex.Player1; } - _isLoaded = false; + _isLoaded = false; LoadConfiguration(); LoadDevice(); LoadProfiles(); + RevertDeviceId = Devices[Device].Id; _isLoaded = true; - + _isChangeTrackingActive = true; OnPropertyChanged(); } } @@ -127,6 +171,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input get => _controller; set { + MarkAsChanged(); + _controller = value; if (_controller == -1) @@ -200,21 +246,13 @@ namespace Ryujinx.Ava.UI.ViewModels.Input } } - public string ProfileName - { - get => _profileName; set - { - _profileName = value; - - OnPropertyChanged(); - } - } - public int Device { get => _device; set { + MarkAsChanged(); + _device = value < 0 ? 0 : value; if (_device >= Devices.Count) @@ -222,7 +260,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input return; } - var selected = Devices[_device].Type; + DeviceType selected = Devices[_device].Type; if (selected != DeviceType.None) { @@ -234,6 +272,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input } } + FindPairedDeviceInConfigFile(); OnPropertyChanged(); NotifyChanges(); } @@ -241,13 +280,11 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public InputConfig Config { get; set; } - public InputViewModel(UserControl owner) : this() + public InputViewModel(UserControl owner, bool useGlobal = false) : this() { if (Program.PreviewerDetached) { - _mainWindow = - (MainWindow)((IClassicDesktopStyleApplicationLifetime)Application.Current - .ApplicationLifetime).MainWindow; + _mainWindow = RyujinxApp.MainWindow; AvaloniaKeyboardDriver = new AvaloniaKeyboardDriver(owner); @@ -256,21 +293,26 @@ namespace Ryujinx.Ava.UI.ViewModels.Input _mainWindow.ViewModel.AppHost?.NpadManager.BlockInputUpdates(); + UseGlobalConfig = useGlobal; + _isLoaded = false; LoadDevices(); PlayerId = PlayerIndex.Player1; } + + _isChangeTrackingActive = true; } public InputViewModel() { - PlayerIndexes = new ObservableCollection(); - Controllers = new ObservableCollection(); - Devices = new ObservableCollection<(DeviceType Type, string Id, string Name)>(); - ProfilesList = new AvaloniaList(); - DeviceList = new AvaloniaList(); + PlayerIndexes = []; + Controllers = []; + Devices = []; + ProfilesList = []; + DeviceList = []; + VisualStick = new StickVisualizer(this); ControllerImage = ProControllerResource; @@ -285,21 +327,68 @@ namespace Ryujinx.Ava.UI.ViewModels.Input PlayerIndexes.Add(new(PlayerIndex.Handheld, LocaleManager.Instance[LocaleKeys.ControllerSettingsHandheld])); } + + private void LoadConfiguration(InputConfig inputConfig = null) { - Config = inputConfig ?? ConfigurationState.Instance.Hid.InputConfig.Value.Find(inputConfig => inputConfig.PlayerIndex == _playerId); + if (UseGlobalConfig && Program.UseExtraConfig) + { + Config = inputConfig ?? ConfigurationState.InstanceExtra.Hid.InputConfig.Value.FirstOrDefault(inputConfig => inputConfig.PlayerIndex == _playerId); + } + else + { + Config = inputConfig ?? ConfigurationState.Instance.Hid.InputConfig.Value.FirstOrDefault(inputConfig => inputConfig.PlayerIndex == _playerId); + } if (Config is StandardKeyboardInputConfig keyboardInputConfig) { - ConfigViewModel = new KeyboardInputViewModel(this, new KeyboardInputConfig(keyboardInputConfig)); + ConfigViewModel = new KeyboardInputViewModel(this, new KeyboardInputConfig(keyboardInputConfig), VisualStick); } if (Config is StandardControllerInputConfig controllerInputConfig) { - ConfigViewModel = new ControllerInputViewModel(this, new GamepadInputConfig(controllerInputConfig)); + ConfigViewModel = new ControllerInputViewModel(this, new GamepadInputConfig(controllerInputConfig), VisualStick); } } + private void FindPairedDeviceInConfigFile() + { + // This function allows you to output a message about the device configuration found in the file + // NOTE: if the configuration is found, we display the message "Waiting for controller connection", + // but only if the id gamepad belongs to the selected player + + NotificationIsVisible = Config != null && Devices.FirstOrDefault(d => d.Id == Config.Id).Id != Config.Id && Config.PlayerIndex == PlayerId; + if (NotificationIsVisible) + { + if (string.IsNullOrEmpty(Config.Name)) + { + NotificationText = $"{LocaleManager.Instance[LocaleKeys.ControllerSettingsWaitingConnectDevice].Format("No information", Config.Id)}"; + } + else + { + NotificationText = $"{LocaleManager.Instance[LocaleKeys.ControllerSettingsWaitingConnectDevice].Format(Config.Name, Config.Id)}"; + } + } + } + + private void MarkAsChanged() + { + //If tracking is active, then allow changing the modifier + if (!IsModified && _isChangeTrackingActive) + { + RevertDeviceId = Devices[Device].Id; // Remember the device to undo changes + IsModified = true; + } + } + + public void UnlinkDevice() + { + // "Disabled" mode is available after unbinding the device + // NOTE: the IsModified flag to be able to apply the settings. + NotificationIsVisible = false; + IsModified = true; + } + public void LoadDevice() { if (Config == null || Config.Backend == InputBackendType.Invalid) @@ -308,7 +397,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input } else { - var type = DeviceType.None; + DeviceType type = DeviceType.None; if (Config is StandardKeyboardInputConfig) { @@ -320,7 +409,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input type = DeviceType.Controller; } - var item = Devices.FirstOrDefault(x => x.Type == type && x.Id == Config.Id); + (DeviceType Type, string Id, string Name) item = Devices.FirstOrDefault(x => x.Type == type && x.Id == Config.Id); if (item != default) { Device = Devices.ToList().FindIndex(x => x.Id == item.Id); @@ -340,7 +429,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input } string id = GetCurrentGamepadId(); - var type = Devices[Device].Type; + DeviceType type = Devices[Device].Type; if (type == DeviceType.None) { @@ -367,12 +456,29 @@ namespace Ryujinx.Ava.UI.ViewModels.Input private void HandleOnGamepadDisconnected(string id) { - Dispatcher.UIThread.Post(LoadDevices); + _isChangeTrackingActive = false; // Disable configuration change tracking + + LoadDevices(); + + IsModified = true; + RevertChanges(); + FindPairedDeviceInConfigFile(); + + _isChangeTrackingActive = true; // Enable configuration change tracking + } private void HandleOnGamepadConnected(string id) { - Dispatcher.UIThread.Post(LoadDevices); + _isChangeTrackingActive = false; // Disable configuration change tracking + + LoadDevices(); + + IsModified = true; + RevertChanges(); + + _isChangeTrackingActive = true;// Enable configuration change tracking + } private string GetCurrentGamepadId() @@ -382,7 +488,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input return string.Empty; } - var device = Devices[Device]; + (DeviceType Type, string Id, string Name) device = Devices[Device]; if (device.Type == DeviceType.None) { @@ -447,6 +553,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input { return $"{GetShortGamepadName(gamepad.Name)} ({controllerNumber})"; } + string GetUniqueGamepadName(IGamepad gamepad, ref int controllerNumber) { string name = GetGamepadName(gamepad, controllerNumber); @@ -455,6 +562,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input controllerNumber++; name = GetGamepadName(gamepad, controllerNumber); } + return name; } @@ -494,7 +602,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input private string GetProfileBasePath() { string path = AppDataManager.ProfilesDirPath; - var type = Devices[Device == -1 ? 0 : Device].Type; + DeviceType type = Devices[Device == -1 ? 0 : Device].Type; if (type == DeviceType.Keyboard) { @@ -534,7 +642,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public InputConfig LoadDefaultConfiguration() { - var activeDevice = Devices.FirstOrDefault(); + (DeviceType Type, string Id, string Name) activeDevice = Devices.FirstOrDefault(); if (Devices.Count > 0 && Device < Devices.Count && Device >= 0) { @@ -545,12 +653,14 @@ namespace Ryujinx.Ava.UI.ViewModels.Input if (activeDevice.Type == DeviceType.Keyboard) { string id = activeDevice.Id; + string name = activeDevice.Name; config = new StandardKeyboardInputConfig { Version = InputConfig.CurrentVersion, Backend = InputBackendType.WindowKeyboard, Id = id, + Name = name, ControllerType = ControllerType.ProController, LeftJoycon = new LeftJoyconCommonConfig { @@ -597,15 +707,17 @@ namespace Ryujinx.Ava.UI.ViewModels.Input } else if (activeDevice.Type == DeviceType.Controller) { - bool isNintendoStyle = Devices.ToList().Find(x => x.Id == activeDevice.Id).Name.Contains("Nintendo"); + bool isNintendoStyle = Devices.ToList().FirstOrDefault(x => x.Id == activeDevice.Id).Name.Contains("Nintendo"); string id = activeDevice.Id.Split(" ")[0]; + string name = activeDevice.Name; config = new StandardControllerInputConfig { Version = InputConfig.CurrentVersion, Backend = InputBackendType.GamepadSDL2, Id = id, + Name = name, ControllerType = ControllerType.ProController, DeadzoneLeft = 0.1f, DeadzoneRight = 0.1f, @@ -675,6 +787,12 @@ namespace Ryujinx.Ava.UI.ViewModels.Input return config; } + public void LoadProfileButton() + { + LoadProfile(); + IsModified = true; + } + public async void LoadProfile() { if (Device == 0) @@ -704,6 +822,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input { ProfilesList.RemoveAt(index); } + return; } @@ -726,9 +845,11 @@ namespace Ryujinx.Ava.UI.ViewModels.Input { _isLoaded = false; + config.Id = Config.Id; // Set current device id instead of changing device(independent profiles) + LoadConfiguration(config); - LoadDevice(); + //LoadDevice(); This line of code hard-links profiles to controllers, the commented line allows profiles to be applied to all controllers _isLoaded = true; @@ -738,6 +859,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public async void SaveProfile() { + if (Device == 0) { return; @@ -780,6 +902,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input await File.WriteAllTextAsync(path, jsonString); LoadProfiles(); + + ChosenProfile = ProfileName; // Show new profile } else { @@ -812,43 +936,73 @@ namespace Ryujinx.Ava.UI.ViewModels.Input } LoadProfiles(); + + ChosenProfile = ProfilesList[0].ToString(); // Show default profile } } + public void RevertChanges() + { + LoadConfiguration(); // configuration preload is required if the paired gamepad was disconnected but was changed to another gamepad + Device = Devices.ToList().FindIndex(d => d.Id == RevertDeviceId); + + LoadDevice(); + LoadConfiguration(); + + OnPropertyChanged(); + IsModified = false; + } + public void Save() { + + if (!IsModified) + { + return; //If the input settings were not touched, then do nothing + } + IsModified = false; - List newConfig = new(); + RevertDeviceId = Devices[Device].Id; // Remember selected device after saving - newConfig.AddRange(ConfigurationState.Instance.Hid.InputConfig.Value); + List newConfig = []; - newConfig.Remove(newConfig.Find(x => x == null)); - - if (Device == 0) + if (UseGlobalConfig && Program.UseExtraConfig) { - newConfig.Remove(newConfig.Find(x => x.PlayerIndex == this.PlayerId)); + newConfig.AddRange(ConfigurationState.InstanceExtra.Hid.InputConfig.Value); } else { - var device = Devices[Device]; + newConfig.AddRange(ConfigurationState.Instance.Hid.InputConfig.Value); + } + + newConfig.Remove(newConfig.FirstOrDefault(x => x == null)); + + if (Device == 0) + { + newConfig.Remove(newConfig.FirstOrDefault(x => x.PlayerIndex == this.PlayerId)); + } + else + { + (DeviceType Type, string Id, string Name) device = Devices[Device]; if (device.Type == DeviceType.Keyboard) { - var inputConfig = (ConfigViewModel as KeyboardInputViewModel).Config; + KeyboardInputConfig inputConfig = (ConfigViewModel as KeyboardInputViewModel).Config; inputConfig.Id = device.Id; } else { - var inputConfig = (ConfigViewModel as ControllerInputViewModel).Config; + GamepadInputConfig inputConfig = (ConfigViewModel as ControllerInputViewModel).Config; inputConfig.Id = device.Id.Split(" ")[0]; } - var config = !IsController + InputConfig config = !IsController ? (ConfigViewModel as KeyboardInputViewModel).Config.GetConfig() : (ConfigViewModel as ControllerInputViewModel).Config.GetConfig(); config.ControllerType = Controllers[_controller].Type; config.PlayerIndex = _playerId; + config.Name = device.Name; int i = newConfig.FindIndex(x => x.PlayerIndex == PlayerId); if (i == -1) @@ -861,18 +1015,21 @@ namespace Ryujinx.Ava.UI.ViewModels.Input } } - _mainWindow.ViewModel.AppHost?.NpadManager.ReloadConfiguration(newConfig, ConfigurationState.Instance.Hid.EnableKeyboard, ConfigurationState.Instance.Hid.EnableMouse); - // Atomically replace and signal input change. // NOTE: Do not modify InputConfig.Value directly as other code depends on the on-change event. - ConfigurationState.Instance.Hid.InputConfig.Value = newConfig; + _mainWindow.ViewModel.AppHost?.NpadManager.ReloadConfiguration(newConfig, ConfigurationState.Instance.Hid.EnableKeyboard, ConfigurationState.Instance.Hid.EnableMouse); - ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath); - } - - public void NotifyChange(string property) - { - OnPropertyChanged(property); + if (UseGlobalConfig && Program.UseExtraConfig) + { + // In User Settings when "Use Global Input" is enabled, it saves global input to global setting + ConfigurationState.InstanceExtra.Hid.InputConfig.Value = newConfig; + ConfigurationState.InstanceExtra.ToFileFormat().SaveConfig(Program.GlobalConfigurationPath); + } + else + { + ConfigurationState.Instance.Hid.InputConfig.Value = newConfig; + ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath); + } } public void NotifyChanges() @@ -895,6 +1052,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input _mainWindow.ViewModel.AppHost?.NpadManager.UnblockInputUpdates(); + VisualStick.Dispose(); + SelectedGamepad?.Dispose(); AvaloniaKeyboardDriver.Dispose(); diff --git a/src/Ryujinx/UI/ViewModels/Input/KeyboardInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/KeyboardInputViewModel.cs index 0b530eb09..bab8db7ce 100644 --- a/src/Ryujinx/UI/ViewModels/Input/KeyboardInputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/KeyboardInputViewModel.cs @@ -1,9 +1,10 @@ using Avalonia.Svg.Skia; +using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.UI.Models.Input; namespace Ryujinx.Ava.UI.ViewModels.Input { - public class KeyboardInputViewModel : BaseModel + public partial class KeyboardInputViewModel : BaseModel { private KeyboardInputConfig _config; public KeyboardInputConfig Config @@ -12,6 +13,19 @@ namespace Ryujinx.Ava.UI.ViewModels.Input set { _config = value; + + OnPropertyChanged(); + } + } + + private StickVisualizer _visualizer; + public StickVisualizer Visualizer + { + get => _visualizer; + set + { + _visualizer = value; + OnPropertyChanged(); } } @@ -42,22 +56,14 @@ namespace Ryujinx.Ava.UI.ViewModels.Input public bool HasSides => IsLeft ^ IsRight; - private SvgImage _image; - public SvgImage Image - { - get => _image; - set - { - _image = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private SvgImage _image; public readonly InputViewModel ParentModel; - public KeyboardInputViewModel(InputViewModel model, KeyboardInputConfig config) + public KeyboardInputViewModel(InputViewModel model, KeyboardInputConfig config, StickVisualizer visualizer) { ParentModel = model; + Visualizer = visualizer; model.NotifyChangesEvent += OnParentModelChanged; OnParentModelChanged(); Config = config; diff --git a/src/Ryujinx/UI/ViewModels/Input/LedInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/LedInputViewModel.cs new file mode 100644 index 000000000..71c404c21 --- /dev/null +++ b/src/Ryujinx/UI/ViewModels/Input/LedInputViewModel.cs @@ -0,0 +1,70 @@ +using Avalonia.Media; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Humanizer; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.UI.Helpers; +using System.Globalization; + +namespace Ryujinx.Ava.UI.ViewModels.Input +{ + public partial class LedInputViewModel : BaseModel + { + public required InputViewModel ParentModel { get; init; } + + public RelayCommand LedDisabledChanged => Commands.Create(() => + { + if (!EnableLedChanging) + return; + + if (TurnOffLed) + ParentModel.SelectedGamepad.ClearLed(); + else + ParentModel.SelectedGamepad.SetLed(LedColor.ToUInt32()); + }); + + [ObservableProperty] private bool _enableLedChanging; + [ObservableProperty] private Color _ledColor; + + public string RainbowSpeedText => RainbowSpeed.ToString(CultureInfo.CurrentCulture).Truncate(4, string.Empty); + + public float RainbowSpeed + { + get => ConfigurationState.Instance.Hid.RainbowSpeed; + set + { + ConfigurationState.Instance.Hid.RainbowSpeed.Value = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(RainbowSpeedText)); + } + } + + public bool ShowLedColorPicker => !TurnOffLed && !UseRainbowLed; + + private bool _turnOffLed; + + public bool TurnOffLed + { + get => _turnOffLed; + set + { + _turnOffLed = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(ShowLedColorPicker)); + } + } + + private bool _useRainbowLed; + + public bool UseRainbowLed + { + get => _useRainbowLed; + set + { + _useRainbowLed = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(ShowLedColorPicker)); + } + } + } +} diff --git a/src/Ryujinx/UI/ViewModels/Input/MotionInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/MotionInputViewModel.cs index c9ed8f2d4..ba8686831 100644 --- a/src/Ryujinx/UI/ViewModels/Input/MotionInputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/MotionInputViewModel.cs @@ -1,93 +1,23 @@ +using CommunityToolkit.Mvvm.ComponentModel; + namespace Ryujinx.Ava.UI.ViewModels.Input { - public class MotionInputViewModel : BaseModel + public partial class MotionInputViewModel : BaseModel { - private int _slot; - public int Slot - { - get => _slot; - set - { - _slot = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private int _slot; - private int _altSlot; - public int AltSlot - { - get => _altSlot; - set - { - _altSlot = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private int _altSlot; - private string _dsuServerHost; - public string DsuServerHost - { - get => _dsuServerHost; - set - { - _dsuServerHost = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private string _dsuServerHost; - private int _dsuServerPort; - public int DsuServerPort - { - get => _dsuServerPort; - set - { - _dsuServerPort = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private int _dsuServerPort; - private bool _mirrorInput; - public bool MirrorInput - { - get => _mirrorInput; - set - { - _mirrorInput = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private bool _mirrorInput; - private int _sensitivity; - public int Sensitivity - { - get => _sensitivity; - set - { - _sensitivity = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private int _sensitivity; - private double _gryoDeadzone; - public double GyroDeadzone - { - get => _gryoDeadzone; - set - { - _gryoDeadzone = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private double _gyroDeadzone; - private bool _enableCemuHookMotion; - public bool EnableCemuHookMotion - { - get => _enableCemuHookMotion; - set - { - _enableCemuHookMotion = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private bool _enableCemuHookMotion; } } diff --git a/src/Ryujinx/UI/ViewModels/Input/RumbleInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/RumbleInputViewModel.cs index 8ad33cf4c..c4158fced 100644 --- a/src/Ryujinx/UI/ViewModels/Input/RumbleInputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/RumbleInputViewModel.cs @@ -1,27 +1,11 @@ +using CommunityToolkit.Mvvm.ComponentModel; + namespace Ryujinx.Ava.UI.ViewModels.Input { - public class RumbleInputViewModel : BaseModel + public partial class RumbleInputViewModel : BaseModel { - private float _strongRumble; - public float StrongRumble - { - get => _strongRumble; - set - { - _strongRumble = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private float _strongRumble; - private float _weakRumble; - public float WeakRumble - { - get => _weakRumble; - set - { - _weakRumble = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private float _weakRumble; } } diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 1bfcd439b..4ca21e788 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -3,37 +3,47 @@ using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Input; using Avalonia.Media; -using Avalonia.Media.Imaging; using Avalonia.Platform.Storage; using Avalonia.Threading; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; using DynamicData; using DynamicData.Binding; using FluentAvalonia.UI.Controls; +using Gommon; using LibHac.Common; +using LibHac.Fs; +using LibHac.Ns; +using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.Input; +using Ryujinx.Ava.Systems; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.Models.Generic; using Ryujinx.Ava.UI.Renderer; +using Ryujinx.Ava.UI.Views.Dialog; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; using Ryujinx.Common; using Ryujinx.Common.Configuration; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; +using Ryujinx.Common.UI; using Ryujinx.Common.Utilities; using Ryujinx.Cpu; using Ryujinx.HLE; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS.Services.Account.Acc; +using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; using Ryujinx.HLE.UI; using Ryujinx.Input.HLE; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; using SkiaSharp; using System; using System.Collections.Generic; @@ -41,90 +51,98 @@ using System.Collections.ObjectModel; using System.Globalization; using System.IO; using System.Linq; -using System.Reflection; using System.Threading; using System.Threading.Tasks; using Key = Ryujinx.Input.Key; using MissingKeyException = LibHac.Common.Keys.MissingKeyException; +using Path = System.IO.Path; using ShaderCacheLoadingState = Ryujinx.Graphics.Gpu.Shader.ShaderCacheState; +using UserId = Ryujinx.HLE.HOS.Services.Account.Acc.UserId; namespace Ryujinx.Ava.UI.ViewModels { - public class MainWindowViewModel : BaseModel + public partial class MainWindowViewModel : BaseModel { private const int HotKeyPressDelayMs = 500; private delegate int LoadContentFromFolderDelegate(List dirs, out int numRemoved); - private ObservableCollectionExtended _applications; - private string _aspectStatusText; + [ObservableProperty] private ObservableCollectionExtended _applications; + [ObservableProperty] private string _aspectRatioStatusText; + [ObservableProperty] private string _loadHeading; + [ObservableProperty] private string _cacheLoadStatus; + [ObservableProperty] private string _dockedStatusText; + [ObservableProperty] private string _fifoStatusText; + [ObservableProperty] private string _gameStatusText; + [ObservableProperty] private string _volumeStatusText; + [ObservableProperty] private string _gpuNameText; + [ObservableProperty] private string _backendText; + [ObservableProperty] private string _shaderCountText; + [ObservableProperty] private bool _showShaderCompilationHint; + [ObservableProperty] private bool _isFullScreen; + [ObservableProperty] private int _progressMaximum; + [ObservableProperty] private int _progressValue; + [ObservableProperty] private bool _showMenuAndStatusBar = true; + [ObservableProperty] private bool _showStatusSeparator; + [ObservableProperty] private Brush _progressBarForegroundColor; + [ObservableProperty] private Brush _progressBarBackgroundColor; + [ObservableProperty] private Brush _vSyncModeColor; +#nullable enable + [ObservableProperty] private byte[]? _selectedIcon; +#nullable disable + [ObservableProperty] private int _statusBarProgressMaximum; + [ObservableProperty] private int _statusBarProgressValue; + [ObservableProperty] private string _statusBarProgressStatusText; + [ObservableProperty] private bool _statusBarProgressStatusVisible; + [ObservableProperty] private bool _isPaused; + [ObservableProperty] private bool _isLoadingIndeterminate = true; + [ObservableProperty] private bool _showAll; + [ObservableProperty] private string _lastScannedAmiiboId; + [ObservableProperty] private ReadOnlyObservableCollection _appsObservableList; + [ObservableProperty] private long _lastFullscreenToggle = Environment.TickCount64; + [ObservableProperty] private bool _showContent = true; + [ObservableProperty] private float _volumeBeforeMute; + [ObservableProperty] private bool _areMimeTypesRegistered = FileAssociationHelper.AreMimeTypesRegistered; + [ObservableProperty] private Cursor _cursor; + [ObservableProperty] private string _title; + [ObservableProperty] private WindowState _windowState; + [ObservableProperty] private double _windowWidth; + [ObservableProperty] private double _windowHeight; + [ObservableProperty] private bool _isActive; + [ObservableProperty] private bool _isSubMenuOpen; + [ObservableProperty] private ApplicationContextMenu _listAppContextMenu; + [ObservableProperty] private ApplicationContextMenu _gridAppContextMenu; + [ObservableProperty] private bool _updateAvailable; - private string _loadHeading; - private string _cacheLoadStatus; + public static AsyncRelayCommand UpdateCommand { get; } = Commands.Create(async () => + { + if (Updater.CanUpdate(true)) + await Updater.BeginUpdateAsync(true); + }); + + private bool _showTotalTimePlayed; + private bool _showLoadProgress; + private bool _isGameRunning; + private bool _isAmiiboRequested; + private bool _isAmiiboBinRequested; private string _searchText; private Timer _searchTimer; - private string _dockedStatusText; private string _vSyncModeText; - private string _fifoStatusText; - private string _gameStatusText; - private string _volumeStatusText; - private string _gpuStatusText; - private string _shaderCountText; - private bool _isAmiiboRequested; - private bool _showShaderCompilationHint; - private bool _isGameRunning; - private bool _isFullScreen; - private int _progressMaximum; - private int _progressValue; - private long _lastFullscreenToggle = Environment.TickCount64; - private bool _showLoadProgress; - private bool _showMenuAndStatusBar = true; - private bool _showStatusSeparator; - private Brush _progressBarForegroundColor; - private Brush _progressBarBackgroundColor; - private Brush _vSyncModeColor; - private byte[] _selectedIcon; - private bool _isAppletMenuActive; - private int _statusBarProgressMaximum; - private int _statusBarProgressValue; - private string _statusBarProgressStatusText; - private bool _statusBarProgressStatusVisible; - private bool _isPaused; - private bool _showContent = true; - private bool _isLoadingIndeterminate = true; - private bool _showAll; - private string _lastScannedAmiiboId; - private bool _statusBarVisible; - private ReadOnlyObservableCollection _appsObservableList; - private string _showUiKey = "F4"; private string _pauseKey = "F5"; private string _screenshotKey = "F8"; private float _volume; - private float _volumeBeforeMute; - private string _backendText; - - private bool _areMimeTypesRegistered = FileAssociationHelper.AreMimeTypesRegistered; + private bool _isAppletMenuActive; + private bool _statusBarVisible; private bool _canUpdate = true; - private Cursor _cursor; - private string _title; private ApplicationData _currentApplicationData; private readonly AutoResetEvent _rendererWaitEvent; - private WindowState _windowState; - private double _windowWidth; - private double _windowHeight; private int _customVSyncInterval; private int _customVSyncIntervalPercentageProxy; + private ApplicationData _listSelectedApplication; + private ApplicationData _gridSelectedApplication; - private bool _isActive; - private bool _isSubMenuOpen; - - public ApplicationData ListSelectedApplication; - public ApplicationData GridSelectedApplication; - - public IEnumerable LastLdnGameData; - - public static readonly Bitmap IconBitmap = - new(Assembly.GetAssembly(typeof(ConfigurationState))!.GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Ryujinx.png")!); + // Key is Title ID + public SafeDictionary LdnData = []; public MainWindow Window { get; init; } @@ -137,8 +155,9 @@ namespace Ryujinx.Ava.UI.ViewModels Applications.ToObservableChangeSet() .Filter(Filter) .Sort(GetComparer()) - .Bind(out _appsObservableList) - .AsObservableList(); + .OnItemAdded(_ => OnPropertyChanged(nameof(AppsObservableList))) + .OnItemRemoved(_ => OnPropertyChanged(nameof(AppsObservableList))) + .Bind(out _appsObservableList); _rendererWaitEvent = new AutoResetEvent(false); @@ -147,8 +166,8 @@ namespace Ryujinx.Ava.UI.ViewModels LoadConfigurableHotKeys(); Volume = ConfigurationState.Instance.System.AudioVolume; + CustomVSyncInterval = ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value; } - CustomVSyncInterval = ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value; } public void Initialize( @@ -184,6 +203,8 @@ namespace Ryujinx.Ava.UI.ViewModels #if DEBUG topLevel.AttachDevTools(new KeyGesture(Avalonia.Input.Key.F12, KeyModifiers.Control)); #endif + + Window.ApplicationLibrary.TotalTimePlayedRecalculated += TotalTimePlayed_Recalculated; } #region Properties @@ -209,7 +230,7 @@ namespace Ryujinx.Ava.UI.ViewModels public bool CanUpdate { - get => _canUpdate && EnableNonGameRunningControls && Updater.CanUpdate(false); + get => _canUpdate && EnableNonGameRunningControls && Updater.CanUpdate(); set { _canUpdate = value; @@ -217,49 +238,6 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public Cursor Cursor - { - get => _cursor; - set - { - _cursor = value; - OnPropertyChanged(); - } - } - - public ReadOnlyObservableCollection AppsObservableList - { - get => _appsObservableList; - set - { - _appsObservableList = value; - - OnPropertyChanged(); - } - } - - public bool IsPaused - { - get => _isPaused; - set - { - _isPaused = value; - - OnPropertyChanged(); - } - } - - public long LastFullscreenToggle - { - get => _lastFullscreenToggle; - set - { - _lastFullscreenToggle = value; - - OnPropertyChanged(); - } - } - public bool StatusBarVisible { get => _statusBarVisible && EnableNonGameRunningControls; @@ -275,17 +253,6 @@ namespace Ryujinx.Ava.UI.ViewModels public bool ShowFirmwareStatus => !ShowLoadProgress; - public bool ShowShaderCompilationHint - { - get => _showShaderCompilationHint; - set - { - _showShaderCompilationHint = value; - - OnPropertyChanged(); - } - } - public bool IsGameRunning { get => _isGameRunning; @@ -316,6 +283,18 @@ namespace Ryujinx.Ava.UI.ViewModels OnPropertyChanged(); } } + public bool IsAmiiboBinRequested + { + get => _isAmiiboBinRequested && _isGameRunning; + set + { + _isAmiiboBinRequested = value; + + OnPropertyChanged(); + } + } + + public bool CanScanAmiiboBinaries => AmiiboBinReader.HasAmiiboKeyFile; public bool ShowLoadProgress { @@ -329,56 +308,56 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public string GameStatusText + private void TotalTimePlayed_Recalculated(Optional ts) { - get => _gameStatusText; + if (ts.HasValue) + { + var formattedPlayTime = ValueFormatUtils.FormatTimeSpan(ts.Value); + LocaleManager.Instance.SetDynamicValues(LocaleKeys.GameListLabelTotalTimePlayed, formattedPlayTime); + ShowTotalTimePlayed = formattedPlayTime != string.Empty; + return; + } + + ShowTotalTimePlayed = ts.HasValue; + } + + public bool ShowTotalTimePlayed + { + get => _showTotalTimePlayed && EnableNonGameRunningControls; set { - _gameStatusText = value; + _showTotalTimePlayed = value; + OnPropertyChanged(); + } + } + + public ApplicationData ListSelectedApplication + { + get => _listSelectedApplication; + set + { + _listSelectedApplication = value; + + if (_listSelectedApplication != null && ListAppContextMenu == null) + ListAppContextMenu = new ApplicationContextMenu(); + else if (_listSelectedApplication == null && ListAppContextMenu != null) + ListAppContextMenu = null!; OnPropertyChanged(); } } - public bool IsFullScreen + public ApplicationData GridSelectedApplication { - get => _isFullScreen; + get => _gridSelectedApplication; set { - _isFullScreen = value; + _gridSelectedApplication = value; - OnPropertyChanged(); - } - } - - public bool IsSubMenuOpen - { - get => _isSubMenuOpen; - set - { - _isSubMenuOpen = value; - - OnPropertyChanged(); - } - } - - public bool ShowAll - { - get => _showAll; - set - { - _showAll = value; - - OnPropertyChanged(); - } - } - - public string LastScannedAmiiboId - { - get => _lastScannedAmiiboId; - set - { - _lastScannedAmiiboId = value; + if (_gridSelectedApplication != null && GridAppContextMenu == null) + GridAppContextMenu = new ApplicationContextMenu(); + else if (_gridSelectedApplication == null && GridAppContextMenu != null) + GridAppContextMenu = null!; OnPropertyChanged(); } @@ -395,91 +374,31 @@ namespace Ryujinx.Ava.UI.ViewModels _ => null, }; } - } - - public bool OpenUserSaveDirectoryEnabled => !SelectedApplication.ControlHolder.ByteSpan.IsZeros() && SelectedApplication.ControlHolder.Value.UserAccountSaveDataSize > 0; - - public bool OpenDeviceSaveDirectoryEnabled => !SelectedApplication.ControlHolder.ByteSpan.IsZeros() && SelectedApplication.ControlHolder.Value.DeviceSaveDataSize > 0; - - public bool TrimXCIEnabled => Ryujinx.Common.Utilities.XCIFileTrimmer.CanTrim(SelectedApplication.Path, new Common.XCIFileTrimmerMainWindowLog(this)); - - public bool OpenBcatSaveDirectoryEnabled => !SelectedApplication.ControlHolder.ByteSpan.IsZeros() && SelectedApplication.ControlHolder.Value.BcatDeliveryCacheStorageSize > 0; - - public bool CreateShortcutEnabled => !ReleaseInformation.IsFlatHubBuild; - - public string LoadHeading - { - get => _loadHeading; set { - _loadHeading = value; - - OnPropertyChanged(); + ListSelectedApplication = value; + GridSelectedApplication = value; } } - public string CacheLoadStatus - { - get => _cacheLoadStatus; - set - { - _cacheLoadStatus = value; + public bool HasCompatibilityEntry => SelectedApplication.HasPlayabilityInfo; - OnPropertyChanged(); - } - } + public bool HasDlc => ApplicationLibrary.HasDlcs(SelectedApplication.Id); - public Brush ProgressBarBackgroundColor - { - get => _progressBarBackgroundColor; - set - { - _progressBarBackgroundColor = value; + public bool OpenUserSaveDirectoryEnabled => SelectedApplication.HasControlHolder && SelectedApplication.ControlHolder.Value.UserAccountSaveDataSize > 0; - OnPropertyChanged(); - } - } + public bool OpenDeviceSaveDirectoryEnabled => SelectedApplication.HasControlHolder && SelectedApplication.ControlHolder.Value.DeviceSaveDataSize > 0; - public Brush ProgressBarForegroundColor - { - get => _progressBarForegroundColor; - set - { - _progressBarForegroundColor = value; + public bool TrimXCIEnabled => XCIFileTrimmer.CanTrim(SelectedApplication.Path, new XCITrimmerLog.MainWindow(this)); - OnPropertyChanged(); - } - } - - public Brush VSyncModeColor - { - get => _vSyncModeColor; - set - { - _vSyncModeColor = value; - - OnPropertyChanged(); - } - } + public bool OpenBcatSaveDirectoryEnabled => SelectedApplication.HasControlHolder && SelectedApplication.ControlHolder.Value.BcatDeliveryCacheStorageSize > 0; public bool ShowCustomVSyncIntervalPicker + => _isGameRunning && AppHost.Device.VSyncMode == VSyncMode.Custom; + + public void UpdateVSyncIntervalPicker() { - get - { - if (_isGameRunning) - { - return AppHost.Device.VSyncMode == - VSyncMode.Custom; - } - else - { - return false; - } - } - set - { - OnPropertyChanged(); - } + OnPropertyChanged(nameof(ShowCustomVSyncIntervalPicker)); } public int CustomVSyncIntervalPercentageProxy @@ -495,6 +414,7 @@ namespace Ryujinx.Ava.UI.ViewModels AppHost.Device.CustomVSyncInterval = newInterval; AppHost.Device.UpdateVSyncInterval(); } + OnPropertyChanged((nameof(CustomVSyncInterval))); OnPropertyChanged((nameof(CustomVSyncIntervalPercentageText))); } @@ -526,132 +446,13 @@ namespace Ryujinx.Ava.UI.ViewModels AppHost.Device.CustomVSyncInterval = value; AppHost.Device.UpdateVSyncInterval(); } + OnPropertyChanged(nameof(CustomVSyncIntervalPercentageProxy)); OnPropertyChanged(nameof(CustomVSyncIntervalPercentageText)); OnPropertyChanged(); } } - public byte[] SelectedIcon - { - get => _selectedIcon; - set - { - _selectedIcon = value; - - OnPropertyChanged(); - } - } - - public int ProgressMaximum - { - get => _progressMaximum; - set - { - _progressMaximum = value; - - OnPropertyChanged(); - } - } - - public int ProgressValue - { - get => _progressValue; - set - { - _progressValue = value; - - OnPropertyChanged(); - } - } - - public int StatusBarProgressMaximum - { - get => _statusBarProgressMaximum; - set - { - _statusBarProgressMaximum = value; - - OnPropertyChanged(); - } - } - - public int StatusBarProgressValue - { - get => _statusBarProgressValue; - set - { - _statusBarProgressValue = value; - - OnPropertyChanged(); - } - } - - public bool StatusBarProgressStatusVisible - { - get => _statusBarProgressStatusVisible; - set - { - _statusBarProgressStatusVisible = value; - - OnPropertyChanged(); - } - } - - public string StatusBarProgressStatusText - { - get => _statusBarProgressStatusText; - set - { - _statusBarProgressStatusText = value; - - OnPropertyChanged(); - } - } - - public string FifoStatusText - { - get => _fifoStatusText; - set - { - _fifoStatusText = value; - - OnPropertyChanged(); - } - } - - public string GpuNameText - { - get => _gpuStatusText; - set - { - _gpuStatusText = value; - - OnPropertyChanged(); - } - } - - public string ShaderCountText - { - get => _shaderCountText; - set - { - _shaderCountText = value; - OnPropertyChanged(); - } - } - - public string BackendText - { - get => _backendText; - set - { - _backendText = value; - - OnPropertyChanged(); - } - } - public string VSyncModeText { get => _vSyncModeText; @@ -660,39 +461,7 @@ namespace Ryujinx.Ava.UI.ViewModels _vSyncModeText = value; OnPropertyChanged(); - } - } - - public string DockedStatusText - { - get => _dockedStatusText; - set - { - _dockedStatusText = value; - - OnPropertyChanged(); - } - } - - public string AspectRatioStatusText - { - get => _aspectStatusText; - set - { - _aspectStatusText = value; - - OnPropertyChanged(); - } - } - - public string VolumeStatusText - { - get => _volumeStatusText; - set - { - _volumeStatusText = value; - - OnPropertyChanged(); + OnPropertyChanged(nameof(ShowCustomVSyncIntervalPicker)); } } @@ -716,73 +485,6 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public float VolumeBeforeMute - { - get => _volumeBeforeMute; - set - { - _volumeBeforeMute = value; - - OnPropertyChanged(); - } - } - - public bool ShowStatusSeparator - { - get => _showStatusSeparator; - set - { - _showStatusSeparator = value; - - OnPropertyChanged(); - } - } - - public bool ShowMenuAndStatusBar - { - get => _showMenuAndStatusBar; - set - { - _showMenuAndStatusBar = value; - - OnPropertyChanged(); - } - } - - public bool IsLoadingIndeterminate - { - get => _isLoadingIndeterminate; - set - { - _isLoadingIndeterminate = value; - - OnPropertyChanged(); - } - } - - public bool IsActive - { - get => _isActive; - set - { - _isActive = value; - - OnPropertyChanged(); - } - } - - - public bool ShowContent - { - get => _showContent; - set - { - _showContent = value; - - OnPropertyChanged(); - } - } - public bool IsAppletMenuActive { get => _isAppletMenuActive && EnableNonGameRunningControls; @@ -794,39 +496,6 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public WindowState WindowState - { - get => _windowState; - internal set - { - _windowState = value; - - OnPropertyChanged(); - } - } - - public double WindowWidth - { - get => _windowWidth; - set - { - _windowWidth = value; - - OnPropertyChanged(); - } - } - - public double WindowHeight - { - get => _windowHeight; - set - { - _windowHeight = value; - - OnPropertyChanged(); - } - } - public bool IsGrid => Glyph == Glyph.Grid; public bool IsList => Glyph == Glyph.List; @@ -857,6 +526,19 @@ namespace Ryujinx.Ava.UI.ViewModels } } + public bool StartGamesWithoutUI + { + get => ConfigurationState.Instance.UI.StartNoUI; + set + { + ConfigurationState.Instance.UI.StartNoUI.Value = value; + + ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath); + + OnPropertyChanged(); + } + } + public bool ShowConsole { get => ConfigurationState.Instance.UI.ShowConsole; @@ -870,17 +552,6 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public string Title - { - get => _title; - set - { - _title = value; - - OnPropertyChanged(); - } - } - public bool ShowConsoleVisible { get => ConsoleHelper.SetConsoleWindowStateSupported; @@ -891,27 +562,6 @@ namespace Ryujinx.Ava.UI.ViewModels get => FileAssociationHelper.IsTypeAssociationSupported; } - public bool AreMimeTypesRegistered - { - get => _areMimeTypesRegistered; - set { - _areMimeTypesRegistered = value; - - OnPropertyChanged(); - } - } - - public ObservableCollectionExtended Applications - { - get => _applications; - set - { - _applications = value; - - OnPropertyChanged(); - } - } - public Glyph Glyph { get => (Glyph)ConfigurationState.Instance.UI.GameListViewMode.Value; @@ -929,7 +579,8 @@ namespace Ryujinx.Ava.UI.ViewModels public bool ShowNames { - get => ConfigurationState.Instance.UI.ShowNames && ConfigurationState.Instance.UI.GridSize > 1; set + get => ConfigurationState.Instance.UI.ShowNames && ConfigurationState.Instance.UI.GridSize > 1; + set { ConfigurationState.Instance.UI.ShowNames.Value = value; @@ -1016,14 +667,15 @@ namespace Ryujinx.Ava.UI.ViewModels { return SortMode switch { - ApplicationSort.Title => LocaleManager.Instance[LocaleKeys.GameListHeaderApplication], - ApplicationSort.Developer => LocaleManager.Instance[LocaleKeys.GameListHeaderDeveloper], - ApplicationSort.LastPlayed => LocaleManager.Instance[LocaleKeys.GameListHeaderLastPlayed], - ApplicationSort.TotalTimePlayed => LocaleManager.Instance[LocaleKeys.GameListHeaderTimePlayed], - ApplicationSort.FileType => LocaleManager.Instance[LocaleKeys.GameListHeaderFileExtension], - ApplicationSort.FileSize => LocaleManager.Instance[LocaleKeys.GameListHeaderFileSize], - ApplicationSort.Path => LocaleManager.Instance[LocaleKeys.GameListHeaderPath], ApplicationSort.Favorite => LocaleManager.Instance[LocaleKeys.CommonFavorite], + ApplicationSort.TitleId => LocaleManager.Instance[LocaleKeys.DlcManagerTableHeadingTitleIdLabel], + ApplicationSort.Title => LocaleManager.Instance[LocaleKeys.GameListHeaderApplication], + ApplicationSort.Developer => LocaleManager.Instance[LocaleKeys.GameListSortDeveloper], + ApplicationSort.LastPlayed => LocaleManager.Instance[LocaleKeys.GameListSortLastPlayed], + ApplicationSort.TotalTimePlayed => LocaleManager.Instance[LocaleKeys.GameListSortTimePlayed], + ApplicationSort.FileType => LocaleManager.Instance[LocaleKeys.GameListSortFileExtension], + ApplicationSort.FileSize => LocaleManager.Instance[LocaleKeys.GameListSortFileSize], + ApplicationSort.Path => LocaleManager.Instance[LocaleKeys.GameListSortPath], _ => string.Empty, }; } @@ -1094,6 +746,7 @@ namespace Ryujinx.Ava.UI.ViewModels public IHostUIHandler UiHandler { get; internal set; } public bool IsSortedByFavorite => SortMode == ApplicationSort.Favorite; public bool IsSortedByTitle => SortMode == ApplicationSort.Title; + public bool IsSortedByTitleId => SortMode == ApplicationSort.TitleId; public bool IsSortedByDeveloper => SortMode == ApplicationSort.Developer; public bool IsSortedByLastPlayed => SortMode == ApplicationSort.LastPlayed; public bool IsSortedByTimePlayed => SortMode == ApplicationSort.TotalTimePlayed; @@ -1109,7 +762,7 @@ namespace Ryujinx.Ava.UI.ViewModels #region PrivateMethods - private static IComparer CreateComparer(bool ascending, Func selector) => + private static SortExpressionComparer CreateComparer(bool ascending, Func selector) => ascending ? SortExpressionComparer.Ascending(selector) : SortExpressionComparer.Descending(selector); @@ -1126,6 +779,7 @@ namespace Ryujinx.Ava.UI.ViewModels ApplicationSort.FileSize => CreateComparer(IsAscending, app => app.FileSize), ApplicationSort.Path => CreateComparer(IsAscending, app => app.Path), ApplicationSort.Favorite => CreateComparer(IsAscending, app => new AppListFavoriteComparable(app)), + ApplicationSort.TitleId => CreateComparer(IsAscending, app => app.Id), _ => null, #pragma warning restore IDE0055 }; @@ -1137,12 +791,13 @@ namespace Ryujinx.Ava.UI.ViewModels private void RefreshGrid() { - Applications.ToObservableChangeSet() + var appsList = Applications.ToObservableChangeSet() .Filter(Filter) .Sort(GetComparer()) - .Bind(out _appsObservableList).AsObservableList(); + .Bind(out var apps) + .AsObservableList(); - OnPropertyChanged(nameof(AppsObservableList)); + AppsObservableList = apps; } private bool Filter(object arg) @@ -1162,7 +817,7 @@ namespace Ryujinx.Ava.UI.ViewModels return false; } - private async Task HandleFirmwareInstallation(string filename) + public async Task HandleFirmwareInstallation(string filename) { try { @@ -1217,10 +872,10 @@ namespace Ryujinx.Ava.UI.ViewModels string message = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallerFirmwareInstallSuccessMessage, firmwareVersion.VersionString); await ContentDialogHelper.CreateInfoDialog( - dialogTitle, - message, - LocaleManager.Instance[LocaleKeys.InputDialogOk], - string.Empty, + dialogTitle, + message, + LocaleManager.Instance[LocaleKeys.InputDialogOk], + string.Empty, LocaleManager.Instance[LocaleKeys.RyujinxInfo]); Logger.Info?.Print(LogClass.Application, message); @@ -1339,7 +994,7 @@ namespace Ryujinx.Ava.UI.ViewModels waitingDialog.Close(); string message = ex.Message; - if(ex is FormatException) + if (ex is FormatException) { message = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysNotFoundErrorMessage, filename); } @@ -1397,6 +1052,7 @@ namespace Ryujinx.Ava.UI.ViewModels CacheLoadStatus = string.Empty; break; } + break; case ShaderCacheLoadingState shaderCacheState: CacheLoadStatus = $"{current} / {total}"; @@ -1417,6 +1073,7 @@ namespace Ryujinx.Ava.UI.ViewModels CacheLoadStatus = string.Empty; break; } + break; default: throw new ArgumentException($"Unknown Progress Handler type {typeof(T)}"); @@ -1427,9 +1084,9 @@ namespace Ryujinx.Ava.UI.ViewModels private void PrepareLoadScreen() { using MemoryStream stream = new(SelectedIcon); - using var gameIconBmp = SKBitmap.Decode(stream); + using SKBitmap gameIconBmp = SKBitmap.Decode(stream); - var dominantColor = IconColorPicker.GetFilteredColor(gameIconBmp); + SKColor dominantColor = IconColorPicker.GetFilteredColor(gameIconBmp); const float ColorMultiple = 0.5f; @@ -1489,8 +1146,6 @@ namespace Ryujinx.Ava.UI.ViewModels } VSyncModeText = args.VSyncMode == "Custom" ? "Custom" : "VSync"; - ShowCustomVSyncIntervalPicker = - args.VSyncMode == VSyncMode.Custom.ToString(); DockedStatusText = args.DockedMode; AspectRatioStatusText = args.AspectRatio; GameStatusText = args.GameStatus; @@ -1515,7 +1170,7 @@ namespace Ryujinx.Ava.UI.ViewModels private async Task LoadContentFromFolder(LocaleKeys localeMessageAddedKey, LocaleKeys localeMessageRemovedKey, LoadContentFromFolderDelegate onDirsSelected) { - var result = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions + IReadOnlyList result = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions { Title = LocaleManager.Instance[LocaleKeys.OpenFolderDialogTitle], AllowMultiple = true, @@ -1523,23 +1178,23 @@ namespace Ryujinx.Ava.UI.ViewModels if (result.Count > 0) { - var dirs = result.Select(it => it.Path.LocalPath).ToList(); - var numAdded = onDirsSelected(dirs, out int numRemoved); + List dirs = result.Select(it => it.Path.LocalPath).ToList(); + int numAdded = onDirsSelected(dirs, out int numRemoved); - var msg = String.Join("\r\n", new string[] { + string msg = string.Join("\n", string.Format(LocaleManager.Instance[localeMessageRemovedKey], numRemoved), string.Format(LocaleManager.Instance[localeMessageAddedKey], numAdded) - }); + ); await Dispatcher.UIThread.InvokeAsync(async () => { await ContentDialogHelper.ShowTextDialog( LocaleManager.Instance[numAdded > 0 || numRemoved > 0 ? LocaleKeys.RyujinxConfirm : LocaleKeys.RyujinxInfo], - msg, - string.Empty, - string.Empty, - string.Empty, - LocaleManager.Instance[LocaleKeys.InputDialogOk], + msg, + string.Empty, + string.Empty, + string.Empty, + LocaleManager.Instance[LocaleKeys.InputDialogOk], (int)Symbol.Checkmark); }); } @@ -1563,17 +1218,17 @@ namespace Ryujinx.Ava.UI.ViewModels public void LoadConfigurableHotKeys() { - if (AvaloniaKeyboardMappingHelper.TryGetAvaKey((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.ShowUI, out var showUiKey)) + if (AvaloniaKeyboardMappingHelper.TryGetAvaKey((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.ShowUI, out Avalonia.Input.Key showUiKey)) { ShowUiKey = new KeyGesture(showUiKey); } - if (AvaloniaKeyboardMappingHelper.TryGetAvaKey((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.Screenshot, out var screenshotKey)) + if (AvaloniaKeyboardMappingHelper.TryGetAvaKey((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.Screenshot, out Avalonia.Input.Key screenshotKey)) { ScreenshotKey = new KeyGesture(screenshotKey); } - if (AvaloniaKeyboardMappingHelper.TryGetAvaKey((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.Pause, out var pauseKey)) + if (AvaloniaKeyboardMappingHelper.TryGetAvaKey((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.Pause, out Avalonia.Input.Key pauseKey)) { PauseKey = new KeyGesture(pauseKey); } @@ -1594,6 +1249,11 @@ namespace Ryujinx.Ava.UI.ViewModels StartGamesInFullscreen = !StartGamesInFullscreen; } + public void ToggleStartGamesWithoutUI() + { + StartGamesWithoutUI = !StartGamesWithoutUI; + } + public void ToggleShowConsole() { ShowConsole = !ShowConsole; @@ -1616,28 +1276,28 @@ namespace Ryujinx.Ava.UI.ViewModels public async Task InstallFirmwareFromFile() { - var result = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions + IReadOnlyList result = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions { AllowMultiple = false, FileTypeFilter = new List { new(LocaleManager.Instance[LocaleKeys.FileDialogAllTypes]) { - Patterns = new[] { "*.xci", "*.zip" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.xci", "public.zip-archive" }, - MimeTypes = new[] { "application/x-nx-xci", "application/zip" }, + Patterns = ["*.xci", "*.zip"], + AppleUniformTypeIdentifiers = ["com.ryujinx.xci", "public.zip-archive"], + MimeTypes = ["application/x-nx-xci", "application/zip"], }, new("XCI") { - Patterns = new[] { "*.xci" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.xci" }, - MimeTypes = new[] { "application/x-nx-xci" }, + Patterns = ["*.xci"], + AppleUniformTypeIdentifiers = ["com.ryujinx.xci"], + MimeTypes = ["application/x-nx-xci"], }, new("ZIP") { - Patterns = new[] { "*.zip" }, - AppleUniformTypeIdentifiers = new[] { "public.zip-archive" }, - MimeTypes = new[] { "application/zip" }, + Patterns = ["*.zip"], + AppleUniformTypeIdentifiers = ["public.zip-archive"], + MimeTypes = ["application/zip"], }, }, }); @@ -1650,7 +1310,7 @@ namespace Ryujinx.Ava.UI.ViewModels public async Task InstallFirmwareFromFolder() { - var result = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions + IReadOnlyList result = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions { AllowMultiple = false, }); @@ -1663,28 +1323,28 @@ namespace Ryujinx.Ava.UI.ViewModels public async Task InstallKeysFromFile() { - var result = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions + IReadOnlyList result = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions { AllowMultiple = false, FileTypeFilter = new List { new(LocaleManager.Instance[LocaleKeys.FileDialogAllTypes]) { - Patterns = new[] { "*.keys", "*.zip" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.xci", "public.zip-archive" }, - MimeTypes = new[] { "application/keys", "application/zip" }, + Patterns = ["*.keys", "*.zip"], + AppleUniformTypeIdentifiers = ["com.ryujinx.xci", "public.zip-archive"], + MimeTypes = ["application/keys", "application/zip"], }, new("KEYS") { - Patterns = new[] { "*.keys" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.xci" }, - MimeTypes = new[] { "application/keys" }, + Patterns = ["*.keys"], + AppleUniformTypeIdentifiers = ["com.ryujinx.xci"], + MimeTypes = ["application/keys"], }, new("ZIP") { - Patterns = new[] { "*.zip" }, - AppleUniformTypeIdentifiers = new[] { "public.zip-archive" }, - MimeTypes = new[] { "application/zip" }, + Patterns = ["*.zip"], + AppleUniformTypeIdentifiers = ["public.zip-archive"], + MimeTypes = ["application/zip"], }, }, }); @@ -1697,7 +1357,7 @@ namespace Ryujinx.Ava.UI.ViewModels public async Task InstallKeysFromFolder() { - var result = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions + IReadOnlyList result = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions { AllowMultiple = false, }); @@ -1713,6 +1373,25 @@ namespace Ryujinx.Ava.UI.ViewModels OpenHelper.OpenFolder(AppDataManager.BaseDirPath); } + public void OpenScreenshotsFolder() + { + string screenshotsDir = Path.Combine(AppDataManager.BaseDirPath, "screenshots"); + + try + { + if (!Directory.Exists(screenshotsDir)) + Directory.CreateDirectory(screenshotsDir); + } + catch (Exception ex) + { + Logger.Error?.Print(LogClass.Application, $"Failed to create directory at path {screenshotsDir}. Error : {ex.GetType().Name}", "Screenshot"); + + return; + } + + OpenHelper.OpenFolder(screenshotsDir); + } + public void OpenLogsFolder() { string logPath = AppDataManager.GetOrCreateLogsDir(); @@ -1788,7 +1467,7 @@ namespace Ryujinx.Ava.UI.ViewModels public async Task OpenFile() { - var result = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions + IReadOnlyList result = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions { Title = LocaleManager.Instance[LocaleKeys.OpenFileDialogTitle], AllowMultiple = false, @@ -1796,53 +1475,53 @@ namespace Ryujinx.Ava.UI.ViewModels { new(LocaleManager.Instance[LocaleKeys.AllSupportedFormats]) { - Patterns = new[] { "*.nsp", "*.xci", "*.nca", "*.nro", "*.nso" }, - AppleUniformTypeIdentifiers = new[] - { + Patterns = ["*.nsp", "*.xci", "*.nca", "*.nro", "*.nso"], + AppleUniformTypeIdentifiers = + [ "com.ryujinx.nsp", "com.ryujinx.xci", "com.ryujinx.nca", "com.ryujinx.nro", - "com.ryujinx.nso", - }, - MimeTypes = new[] - { + "com.ryujinx.nso" + ], + MimeTypes = + [ "application/x-nx-nsp", "application/x-nx-xci", "application/x-nx-nca", "application/x-nx-nro", - "application/x-nx-nso", - }, + "application/x-nx-nso" + ], }, new("NSP") { - Patterns = new[] { "*.nsp" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.nsp" }, - MimeTypes = new[] { "application/x-nx-nsp" }, + Patterns = ["*.nsp"], + AppleUniformTypeIdentifiers = ["com.ryujinx.nsp"], + MimeTypes = ["application/x-nx-nsp"], }, new("XCI") { - Patterns = new[] { "*.xci" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.xci" }, - MimeTypes = new[] { "application/x-nx-xci" }, + Patterns = ["*.xci"], + AppleUniformTypeIdentifiers = ["com.ryujinx.xci"], + MimeTypes = ["application/x-nx-xci"], }, new("NCA") { - Patterns = new[] { "*.nca" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.nca" }, - MimeTypes = new[] { "application/x-nx-nca" }, + Patterns = ["*.nca"], + AppleUniformTypeIdentifiers = ["com.ryujinx.nca"], + MimeTypes = ["application/x-nx-nca"], }, new("NRO") { - Patterns = new[] { "*.nro" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.nro" }, - MimeTypes = new[] { "application/x-nx-nro" }, + Patterns = ["*.nro"], + AppleUniformTypeIdentifiers = ["com.ryujinx.nro"], + MimeTypes = ["application/x-nx-nro"], }, new("NSO") { - Patterns = new[] { "*.nso" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.nso" }, - MimeTypes = new[] { "application/x-nx-nso" }, + Patterns = ["*.nso"], + AppleUniformTypeIdentifiers = ["com.ryujinx.nso"], + MimeTypes = ["application/x-nx-nso"], }, }, }); @@ -1879,7 +1558,7 @@ namespace Ryujinx.Ava.UI.ViewModels public async Task OpenFolder() { - var result = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions + IReadOnlyList result = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions { Title = LocaleManager.Instance[LocaleKeys.OpenFolderDialogTitle], AllowMultiple = false, @@ -1897,8 +1576,49 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public async Task LoadApplication(ApplicationData application, bool startFullscreen = false) + public bool InitializeUserConfig(ApplicationData application) { + // Code where conditions will be met before loading the user configuration (Global Config) + string backendThreadingInit = Program.BackendThreadingArg ?? ConfigurationState.Instance.Graphics.BackendThreading.Value.ToString(); + + // If a configuration is found in the "/games/xxxxxxxxxxxxxx" folder, the program will load the user setting. + string idGame = application.IdBaseString; + if (ConfigurationFileFormat.TryLoad(Program.GetDirGameUserConfig(idGame), out ConfigurationFileFormat configurationFileFormat)) + { + // Loads the user configuration, having previously changed the global configuration to the user configuration + ConfigurationState.Instance.Load(configurationFileFormat, Program.GetDirGameUserConfig(idGame, true), idGame); + + if (ConfigurationFileFormat.TryLoad(Program.GlobalConfigurationPath, out ConfigurationFileFormat configurationFileFormatExtra)) + { + //This is where the global configuration will be stored. + //This allows you to change the global configuration settings during the game (for example, the global input setting) + ConfigurationState.InstanceExtra.Load(configurationFileFormatExtra, Program.GlobalConfigurationPath); + } + } + + // Code where conditions will be executed after loading user configuration + if (ConfigurationState.Instance.Graphics.BackendThreading.Value.ToString() != backendThreadingInit) + { + Rebooter.RebootAppWithGame(application.Path, + [ + "--bt", + ConfigurationState.Instance.Graphics.BackendThreading.Value.ToString() + ]); + + return true; + } + + return false; + } + + public async Task LoadApplication(ApplicationData application, bool startFullscreen = false, BlitStruct? customNacpData = null) + { + + if (InitializeUserConfig(application)) + { + return; + } + if (AppHost != null) { await ContentDialogHelper.CreateInfoDialog( @@ -1935,7 +1655,7 @@ namespace Ryujinx.Ava.UI.ViewModels this, TopLevel); - if (!await AppHost.LoadGuestApplication()) + if (!await AppHost.LoadGuestApplication(customNacpData)) { AppHost.DisposeContext(); AppHost = null; @@ -1959,6 +1679,7 @@ namespace Ryujinx.Ava.UI.ViewModels Thread gameThread = new(InitializeGame) { Name = "GUI.WindowThread" }; gameThread.Start(); + } public void SwitchToRenderer(bool startFullscreen) => @@ -1971,8 +1692,8 @@ namespace Ryujinx.Ava.UI.ViewModels RendererHostControl.Focus(); }); - public static void UpdateGameMetadata(string titleId) - => ApplicationLibrary.LoadAndSaveMetaData(titleId, appMetadata => appMetadata.UpdatePostGame()); + public static void UpdateGameMetadata(string titleId, TimeSpan playTime) + => ApplicationLibrary.LoadAndSaveMetaData(titleId, appMetadata => appMetadata.UpdatePostGame(playTime)); public void RefreshFirmwareStatus() { @@ -1996,7 +1717,7 @@ namespace Ryujinx.Ava.UI.ViewModels } else { - LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarSystemVersion, "0.0"); + LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarSystemVersion, "NaN"); } IsAppletMenuActive = hasApplet; @@ -2034,21 +1755,18 @@ namespace Ryujinx.Ava.UI.ViewModels Dispatcher.UIThread.InvokeAsync(() => { - Title = App.FormatTitle(); + Title = RyujinxApp.FormatTitle(); }); } public async Task OpenAmiiboWindow() { - if (!IsAmiiboRequested) - return; - - if (AppHost.Device.System.SearchingForAmiibo(out int deviceId)) + if (AppHost.Device.System.SearchingForAmiibo(out int deviceId) && IsGameRunning) { string titleId = AppHost.Device.Processes.ActiveApplication.ProgramIdText.ToUpper(); AmiiboWindow window = new(ShowAll, LastScannedAmiiboId, titleId); - await window.ShowDialog(Window); + await StyleableAppWindow.ShowAsync(window); if (window.IsScanned) { @@ -2059,6 +1777,28 @@ namespace Ryujinx.Ava.UI.ViewModels } } } + public async Task OpenBinFile() + { + if (AppHost.Device.System.SearchingForAmiibo(out _) && IsGameRunning) + { + IReadOnlyList result = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions + { + Title = LocaleManager.Instance[LocaleKeys.OpenFileDialogTitle], + AllowMultiple = false, + FileTypeFilter = new List + { + new(LocaleManager.Instance[LocaleKeys.AllSupportedFormats]) + { + Patterns = ["*.bin"], + } + } + }); + if (result.Count > 0) + { + AppHost.Device.System.ScanAmiiboFromBin(result[0].Path.LocalPath); + } + } + } public void ToggleFullscreen() { @@ -2072,7 +1812,7 @@ namespace Ryujinx.Ava.UI.ViewModels if (WindowState is not WindowState.Normal) { WindowState = WindowState.Normal; - Window.TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowTitleBar; + Window.TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowOldUI; if (IsGameRunning) { @@ -2131,7 +1871,7 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public async void ProcessTrimResult(String filename, Ryujinx.Common.Utilities.XCIFileTrimmer.OperationOutcome operationOutcome) + public async void ProcessTrimResult(String filename, XCIFileTrimmer.OperationOutcome operationOutcome) { string notifyUser = operationOutcome.ToLocalisedText(); @@ -2146,12 +1886,8 @@ namespace Ryujinx.Ava.UI.ViewModels { switch (operationOutcome) { - case Ryujinx.Common.Utilities.XCIFileTrimmer.OperationOutcome.Successful: - if (Avalonia.Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - if (desktop.MainWindow is MainWindow mainWindow) - mainWindow.LoadApplications(); - } + case XCIFileTrimmer.OperationOutcome.Successful: + RyujinxApp.MainWindow.LoadApplications(); break; } } @@ -2164,16 +1900,16 @@ namespace Ryujinx.Ava.UI.ViewModels return; } - var trimmer = new XCIFileTrimmer(filename, new Common.XCIFileTrimmerMainWindowLog(this)); + XCIFileTrimmer trimmer = new(filename, new XCITrimmerLog.MainWindow(this)); if (trimmer.CanBeTrimmed) { - var savings = (double)trimmer.DiskSpaceSavingsB / 1024.0 / 1024.0; - var currentFileSize = (double)trimmer.FileSizeB / 1024.0 / 1024.0; - var cartDataSize = (double)trimmer.DataSizeB / 1024.0 / 1024.0; + double savings = (double)trimmer.DiskSpaceSavingsB / 1024.0 / 1024.0; + double currentFileSize = (double)trimmer.FileSizeB / 1024.0 / 1024.0; + double cartDataSize = (double)trimmer.DataSizeB / 1024.0 / 1024.0; string secondaryText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.TrimXCIFileDialogSecondaryText, currentFileSize, cartDataSize, savings); - var result = await ContentDialogHelper.CreateConfirmationDialog( + UserResult result = await ContentDialogHelper.CreateConfirmationDialog( LocaleManager.Instance[LocaleKeys.TrimXCIFileDialogPrimaryText], secondaryText, LocaleManager.Instance[LocaleKeys.Continue], @@ -2223,5 +1959,396 @@ namespace Ryujinx.Ava.UI.ViewModels } #endregion + + #region Context Menu commands + + public static AsyncRelayCommand RunApplication { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => viewModel.LoadApplication(viewModel.SelectedApplication)); + + public static RelayCommand ToggleFavorite { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => + { + viewModel.SelectedApplication.Favorite = !viewModel.SelectedApplication.Favorite; + + ApplicationLibrary.LoadAndSaveMetaData(viewModel.SelectedApplication.IdString, appMetadata => + { + appMetadata.Favorite = viewModel.SelectedApplication.Favorite; + }); + + viewModel.RefreshView(); + } + ); + + public static RelayCommand CreateApplicationShortcut { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => ShortcutHelper.CreateAppShortcut( + viewModel.SelectedApplication.Path, + viewModel.SelectedApplication.Name, + viewModel.SelectedApplication.IdString, + viewModel.SelectedApplication.Icon + )); + + public static AsyncRelayCommand EditGameConfiguration { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + async viewModel => + { + await StyleableAppWindow.ShowAsync(new GameSpecificSettingsWindow(viewModel)); + + // just checking for file presence + viewModel.SelectedApplication.HasIndependentConfiguration = File.Exists( + Program.GetDirGameUserConfig(viewModel.SelectedApplication.IdString)); + + viewModel.RefreshView(); + }); + + public static AsyncRelayCommand OpenApplicationCompatibility { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => CompatibilityListWindow.Show(viewModel.SelectedApplication.IdString)); + + public static AsyncRelayCommand OpenApplicationData { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => ApplicationDataView.Show(viewModel.SelectedApplication)); + + public static RelayCommand OpenUserSaveDirectory { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => + OpenSaveDirectory(viewModel, SaveDataType.Account, viewModel.AccountManager.LastOpenedUser.UserId.ToLibHac()) + ); + + public static RelayCommand OpenDeviceSaveDirectory { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => OpenSaveDirectory(viewModel, SaveDataType.Device, default)); + + public static RelayCommand OpenBcatSaveDirectory { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => OpenSaveDirectory(viewModel, SaveDataType.Bcat, default)); + + private static void OpenSaveDirectory(MainWindowViewModel viewModel, SaveDataType saveDataType, + LibHac.Fs.UserId userId) + { + SaveDataFilter saveDataFilter = SaveDataFilter.Make(viewModel.SelectedApplication.Id, saveDataType, userId, + saveDataId: default, index: default); + + ApplicationHelper.OpenSaveDir(in saveDataFilter, viewModel.SelectedApplication.Id, + viewModel.SelectedApplication.ControlHolder, viewModel.SelectedApplication.Name); + } + + public static AsyncRelayCommand OpenTitleUpdateManager { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => TitleUpdateManagerView.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication) + ); + + public static AsyncRelayCommand OpenDownloadableContentManager { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => + DownloadableContentManagerView.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication) + ); + + public static AsyncRelayCommand OpenCheatManager { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => StyleableAppWindow.ShowAsync( + new CheatWindow( + viewModel.VirtualFileSystem, + viewModel.SelectedApplication.IdString, + viewModel.SelectedApplication.Name, + viewModel.SelectedApplication.Path + ) + )); + + public static AsyncRelayCommand OpenModManager { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => ModManagerView.Show( + viewModel.SelectedApplication.Id, + viewModel.SelectedApplication.IdBase, + viewModel.ApplicationLibrary, + viewModel.SelectedApplication.Name)); + + public static RelayCommand OpenModsDirectory { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => + { + string modsBasePath = ModLoader.GetModsBasePath(); + string titleModsPath = ModLoader.GetApplicationDir(modsBasePath, viewModel.SelectedApplication.IdString); + + OpenHelper.OpenFolder(titleModsPath); + }); + + public static RelayCommand OpenSdModsDirectory { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => + { + string sdModsBasePath = ModLoader.GetSdModsBasePath(); + string titleModsPath = ModLoader.GetApplicationDir(sdModsBasePath, viewModel.SelectedApplication.IdString); + + OpenHelper.OpenFolder(titleModsPath); + }); + + public static AsyncRelayCommand TrimXci { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => viewModel.TrimXCIFile(viewModel.SelectedApplication.Path)); + + public static AsyncRelayCommand PurgePtcCache { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + async viewModel => + { + UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog( + LocaleManager.Instance[LocaleKeys.DialogWarning], + LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogPPTCDeletionMessage, + viewModel.SelectedApplication.Name) + ); + + if (result == UserResult.Yes) + { + DirectoryInfo mainDir = new(Path.Combine(AppDataManager.GamesDirPath, + viewModel.SelectedApplication.IdString, "cache", "cpu", "0")); + DirectoryInfo backupDir = new(Path.Combine(AppDataManager.GamesDirPath, + viewModel.SelectedApplication.IdString, "cache", "cpu", "1")); + + List cacheFiles = []; + + if (mainDir.Exists) + { + cacheFiles.AddRange(mainDir.EnumerateFiles("*.cache")); + } + + if (backupDir.Exists) + { + cacheFiles.AddRange(backupDir.EnumerateFiles("*.cache")); + } + + if (cacheFiles.Count > 0) + { + foreach (FileInfo file in cacheFiles) + { + try + { + file.Delete(); + } + catch (Exception ex) + { + await ContentDialogHelper.CreateErrorDialog( + LocaleManager.Instance.UpdateAndGetDynamicValue( + LocaleKeys.DialogPPTCDeletionErrorMessage, file.Name, ex)); + } + } + } + } + }); + + public static AsyncRelayCommand NukePtcCache { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + async viewModel => + { + UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog( + LocaleManager.Instance[LocaleKeys.DialogWarning], + LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogPPTCNukeMessage, + viewModel.SelectedApplication.Name) + ); + + if (result == UserResult.Yes) + { + DirectoryInfo mainDir = new(Path.Combine(AppDataManager.GamesDirPath, + viewModel.SelectedApplication.IdString, "cache", "cpu", "0")); + DirectoryInfo backupDir = new(Path.Combine(AppDataManager.GamesDirPath, + viewModel.SelectedApplication.IdString, "cache", "cpu", "1")); + + List cacheFiles = []; + + if (mainDir.Exists) + { + cacheFiles.AddRange(mainDir.EnumerateFiles("*.cache")); + cacheFiles.AddRange(mainDir.EnumerateFiles("*.info")); + } + + if (backupDir.Exists) + { + cacheFiles.AddRange(backupDir.EnumerateFiles("*.cache")); + cacheFiles.AddRange(backupDir.EnumerateFiles("*.info")); + } + + if (cacheFiles.Count > 0) + { + foreach (FileInfo file in cacheFiles) + { + try + { + file.Delete(); + } + catch (Exception ex) + { + await ContentDialogHelper.CreateErrorDialog( + LocaleManager.Instance.UpdateAndGetDynamicValue( + LocaleKeys.DialogPPTCDeletionErrorMessage, file.Name, ex)); + } + } + } + } + }); + + public static AsyncRelayCommand PurgeShaderCache { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + async viewModel => + { + UserResult result = await ContentDialogHelper.CreateLocalizedConfirmationDialog( + LocaleManager.Instance[LocaleKeys.DialogWarning], + LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogShaderDeletionMessage, + viewModel.SelectedApplication.Name) + ); + + if (result == UserResult.Yes) + { + DirectoryInfo shaderCacheDir = new(Path.Combine(AppDataManager.GamesDirPath, + viewModel.SelectedApplication.IdString, "cache", "shader")); + + List oldCacheDirectories = []; + List newCacheFiles = []; + + if (shaderCacheDir.Exists) + { + oldCacheDirectories.AddRange(shaderCacheDir.EnumerateDirectories("*")); + newCacheFiles.AddRange(shaderCacheDir.GetFiles("*.toc")); + newCacheFiles.AddRange(shaderCacheDir.GetFiles("*.data")); + } + + if ((oldCacheDirectories.Count > 0 || newCacheFiles.Count > 0)) + { + foreach (DirectoryInfo directory in oldCacheDirectories) + { + try + { + directory.Delete(true); + } + catch (Exception ex) + { + await ContentDialogHelper.CreateErrorDialog( + LocaleManager.Instance.UpdateAndGetDynamicValue( + LocaleKeys.DialogPPTCDeletionErrorMessage, directory.Name, ex)); + } + } + + foreach (FileInfo file in newCacheFiles) + { + try + { + file.Delete(); + } + catch (Exception ex) + { + await ContentDialogHelper.CreateErrorDialog( + LocaleManager.Instance.UpdateAndGetDynamicValue( + LocaleKeys.ShaderCachePurgeError, file.Name, ex)); + } + } + } + } + }); + + public static RelayCommand OpenPtcDirectory { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => + { + string ptcDir = Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, + "cache", "cpu"); + string mainDir = Path.Combine(ptcDir, "0"); + string backupDir = Path.Combine(ptcDir, "1"); + + if (!Directory.Exists(ptcDir)) + { + Directory.CreateDirectory(ptcDir); + Directory.CreateDirectory(mainDir); + Directory.CreateDirectory(backupDir); + } + + OpenHelper.OpenFolder(ptcDir); + }); + + public static RelayCommand OpenShaderCacheDirectory { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + viewModel => + { + string shaderCacheDir = Path.Combine(AppDataManager.GamesDirPath, + viewModel.SelectedApplication.IdString.ToLower(), "cache", "shader"); + + if (!Directory.Exists(shaderCacheDir)) + { + Directory.CreateDirectory(shaderCacheDir); + } + + OpenHelper.OpenFolder(shaderCacheDir); + }); + + public static AsyncRelayCommand ExtractApplicationExeFs { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + async viewModel => + { + await ApplicationHelper.ExtractSection( + viewModel.StorageProvider, + NcaSectionType.Code, + viewModel.SelectedApplication.Path, + viewModel.SelectedApplication.Name); + }); + + public static AsyncRelayCommand ExtractApplicationRomFs { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + async viewModel => + { + await ApplicationHelper.ExtractSection( + viewModel.StorageProvider, + NcaSectionType.Data, + viewModel.SelectedApplication.Path, + viewModel.SelectedApplication.Name); + }); + + public static AsyncRelayCommand ExtractApplicationAocRomFs { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + async viewModel => + { + DownloadableContentModel selectedDlc = await DlcSelectView.Show(viewModel.SelectedApplication.Id, + viewModel.ApplicationLibrary); + + if (selectedDlc is not null) + { + await ApplicationHelper.ExtractAoc( + viewModel.StorageProvider, + selectedDlc.ContainerPath, + selectedDlc.FileName); + } + }); + + public static AsyncRelayCommand ExtractApplicationLogo { get; } = + Commands.CreateConditional(vm => vm?.SelectedApplication != null, + async viewModel => + { + IReadOnlyList result = await viewModel.StorageProvider.OpenFolderPickerAsync( + new FolderPickerOpenOptions + { + Title = LocaleManager.Instance[LocaleKeys.FolderDialogExtractTitle], + AllowMultiple = false, + }); + + if (result.Count == 0) + return; + + ApplicationHelper.ExtractSection( + result[0].Path.LocalPath, + NcaSectionType.Logo, + viewModel.SelectedApplication.Path, + viewModel.SelectedApplication.Name); + + IStorageFile iconFile = + await result[0].CreateFileAsync($"{viewModel.SelectedApplication.IdString}.png"); + await using Stream fileStream = await iconFile.OpenWriteAsync(); + + using SKBitmap bitmap = SKBitmap.Decode(viewModel.SelectedApplication.Icon) + .Resize(new SKSizeI(512, 512), SKFilterQuality.High); + + using SKData png = bitmap.Encode(SKEncodedImageFormat.Png, 100); + + png.SaveTo(fileStream); + }); + + #endregion } } diff --git a/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs b/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs index df2ef266e..1d65ba336 100644 --- a/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs @@ -1,11 +1,11 @@ -using Avalonia; using Avalonia.Collections; -using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Platform.Storage; using Avalonia.Threading; +using CommunityToolkit.Mvvm.ComponentModel; using DynamicData; using Gommon; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.Common.Configuration; @@ -13,21 +13,24 @@ using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.HLE.HOS; using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; using System.Linq; namespace Ryujinx.Ava.UI.ViewModels { - public class ModManagerViewModel : BaseModel + public partial class ModManagerViewModel : BaseModel { private readonly string _modJsonPath; - private AvaloniaList _mods = new(); - private AvaloniaList _views = new(); - private AvaloniaList _selectedMods = new(); + private AvaloniaList _mods = []; + [ObservableProperty] private AvaloniaList _views = []; + [ObservableProperty] private AvaloniaList _selectedMods = []; private string _search; private readonly ulong _applicationId; + private readonly ulong[] _installedDlcIds; private readonly IStorageProvider _storageProvider; private static readonly ModMetadataJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions()); @@ -44,26 +47,6 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public AvaloniaList Views - { - get => _views; - set - { - _views = value; - OnPropertyChanged(); - } - } - - public AvaloniaList SelectedMods - { - get => _selectedMods; - set - { - _selectedMods = value; - OnPropertyChanged(); - } - } - public string Search { get => _search; @@ -80,58 +63,60 @@ namespace Ryujinx.Ava.UI.ViewModels get => string.Format(LocaleManager.Instance[LocaleKeys.ModWindowHeading], Mods.Count); } - public ModManagerViewModel(ulong applicationId) + public ModManagerViewModel(ulong applicationId, ulong applicationIdBase, ApplicationLibrary appLibrary) { _applicationId = applicationId; + _installedDlcIds = appLibrary.DownloadableContents.Keys + .Where(x => x.TitleIdBase == applicationIdBase) + .Select(x => x.TitleId) + .ToArray(); + _modJsonPath = Path.Combine(AppDataManager.GamesDirPath, applicationId.ToString("x16"), "mods.json"); - if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - _storageProvider = desktop.MainWindow.StorageProvider; - } + _storageProvider = RyujinxApp.MainWindow.StorageProvider; - LoadMods(applicationId); + LoadMods(applicationId, _installedDlcIds); } - private void LoadMods(ulong applicationId) + private void LoadMods(ulong applicationId, ulong[] installedDlcIds) { Mods.Clear(); SelectedMods.Clear(); string[] modsBasePaths = [ModLoader.GetSdModsBasePath(), ModLoader.GetModsBasePath()]; - foreach (var path in modsBasePaths) + foreach (string path in modsBasePaths) { - var inSd = path == ModLoader.GetSdModsBasePath(); - var modCache = new ModLoader.ModCache(); + bool inSd = path == ModLoader.GetSdModsBasePath(); + ModLoader.ModCache modCache = new(); - ModLoader.QueryContentsDir(modCache, new DirectoryInfo(Path.Combine(path, "contents")), applicationId); + ModLoader.QueryContentsDir(modCache, new DirectoryInfo(Path.Combine(path, "contents")), applicationId, _installedDlcIds); - foreach (var mod in modCache.RomfsDirs) + foreach (ModLoader.Mod mod in modCache.RomfsDirs) { - var modModel = new ModModel(mod.Path.Parent.FullName, mod.Name, mod.Enabled, inSd); + ModModel modModel = new(mod.Path.Parent.FullName, mod.Name, mod.Enabled, inSd); if (Mods.All(x => x.Path != mod.Path.Parent.FullName)) { Mods.Add(modModel); } } - foreach (var mod in modCache.RomfsContainers) + foreach (ModLoader.Mod mod in modCache.RomfsContainers) { Mods.Add(new ModModel(mod.Path.FullName, mod.Name, mod.Enabled, inSd)); } - foreach (var mod in modCache.ExefsDirs) + foreach (ModLoader.Mod mod in modCache.ExefsDirs) { - var modModel = new ModModel(mod.Path.Parent.FullName, mod.Name, mod.Enabled, inSd); + ModModel modModel = new(mod.Path.Parent.FullName, mod.Name, mod.Enabled, inSd); if (Mods.All(x => x.Path != mod.Path.Parent.FullName)) { Mods.Add(modModel); } } - foreach (var mod in modCache.ExefsContainers) + foreach (ModLoader.Mod mod in modCache.ExefsContainers) { Mods.Add(new ModModel(mod.Path.FullName, mod.Name, mod.Enabled, inSd)); } @@ -144,12 +129,12 @@ namespace Ryujinx.Ava.UI.ViewModels { Mods.AsObservableChangeSet() .Filter(Filter) - .Bind(out var view).AsObservableList(); + .Bind(out ReadOnlyObservableCollection view).AsObservableList(); - _views.Clear(); - _views.AddRange(view); + Views.Clear(); + Views.AddRange(view); - SelectedMods = new(Views.Where(x => x.Enabled)); + SelectedMods = [.. Views.Where(x => x.Enabled)]; OnPropertyChanged(nameof(ModCount)); OnPropertyChanged(nameof(Views)); @@ -160,7 +145,7 @@ namespace Ryujinx.Ava.UI.ViewModels { if (arg is ModModel content) { - return string.IsNullOrWhiteSpace(_search) || content.Name.ToLower().Contains(_search.ToLower()); + return string.IsNullOrWhiteSpace(_search) || content.Name.Contains(_search, StringComparison.OrdinalIgnoreCase); } return false; @@ -185,10 +170,10 @@ namespace Ryujinx.Ava.UI.ViewModels public void Delete(ModModel model, bool removeFromList = true) { - var isSubdir = true; - var pathToDelete = model.Path; - var basePath = model.InSd ? ModLoader.GetSdModsBasePath() : ModLoader.GetModsBasePath(); - var modsDir = ModLoader.GetApplicationDir(basePath, _applicationId.ToString("x16")); + bool isSubdir = true; + string pathToDelete = model.Path; + string basePath = model.InSd ? ModLoader.GetSdModsBasePath() : ModLoader.GetModsBasePath(); + string modsDir = ModLoader.GetApplicationDir(basePath, _applicationId.ToString("x16")); if (new DirectoryInfo(model.Path).Parent?.FullName == modsDir) { @@ -197,9 +182,9 @@ namespace Ryujinx.Ava.UI.ViewModels if (isSubdir) { - var parentDir = String.Empty; + string parentDir = String.Empty; - foreach (var dir in Directory.GetDirectories(modsDir, "*", SearchOption.TopDirectoryOnly)) + foreach (string dir in Directory.GetDirectories(modsDir, "*", SearchOption.TopDirectoryOnly)) { if (Directory.GetDirectories(dir, "*", SearchOption.AllDirectories).Contains(model.Path)) { @@ -228,6 +213,7 @@ namespace Ryujinx.Ava.UI.ViewModels Mods.Remove(model); OnPropertyChanged(nameof(ModCount)); } + Sort(); } @@ -251,10 +237,10 @@ namespace Ryujinx.Ava.UI.ViewModels return; } - var destinationDir = ModLoader.GetApplicationDir(ModLoader.GetSdModsBasePath(), _applicationId.ToString("x16")); + string destinationDir = ModLoader.GetApplicationDir(ModLoader.GetSdModsBasePath(), _applicationId.ToString("x16")); // TODO: More robust checking for valid mod folders - var isDirectoryValid = true; + bool isDirectoryValid = true; if (directories.Length == 0) { @@ -270,7 +256,7 @@ namespace Ryujinx.Ava.UI.ViewModels return; } - foreach (var dir in directories) + foreach (string dir in directories) { string dirToCreate = dir.Replace(directory.Parent.ToString(), destinationDir); @@ -291,25 +277,25 @@ namespace Ryujinx.Ava.UI.ViewModels Directory.CreateDirectory(dirToCreate); } - var files = Directory.GetFiles(directory.ToString(), "*", SearchOption.AllDirectories); + string[] files = Directory.GetFiles(directory.ToString(), "*", SearchOption.AllDirectories); - foreach (var file in files) + foreach (string file in files) { File.Copy(file, file.Replace(directory.Parent.ToString(), destinationDir), true); } - LoadMods(_applicationId); + LoadMods(_applicationId, _installedDlcIds); } public async void Add() { - var result = await _storageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions + IReadOnlyList result = await _storageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions { Title = LocaleManager.Instance[LocaleKeys.SelectModDialogTitle], AllowMultiple = true, }); - foreach (var folder in result) + foreach (IStorageFolder folder in result) { AddMod(new DirectoryInfo(folder.Path.LocalPath)); } @@ -325,7 +311,7 @@ namespace Ryujinx.Ava.UI.ViewModels public void EnableAll() { - SelectedMods = new(Mods); + SelectedMods = [.. Mods]; } public void DisableAll() diff --git a/src/Ryujinx/UI/ViewModels/ProfileSelectorDialogViewModel.cs b/src/Ryujinx/UI/ViewModels/ProfileSelectorDialogViewModel.cs new file mode 100644 index 000000000..979e1616a --- /dev/null +++ b/src/Ryujinx/UI/ViewModels/ProfileSelectorDialogViewModel.cs @@ -0,0 +1,14 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Ryujinx.HLE.HOS.Services.Account.Acc; +using System.Collections.ObjectModel; + +namespace Ryujinx.Ava.UI.ViewModels +{ + public partial class ProfileSelectorDialogViewModel : BaseModel + { + + [ObservableProperty] private UserId _selectedUserId; + + [ObservableProperty] private ObservableCollection _profiles = []; + } +} diff --git a/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs new file mode 100644 index 000000000..230887e34 --- /dev/null +++ b/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs @@ -0,0 +1,43 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Gommon; +using Ryujinx.Ava.Systems.Configuration; + +namespace Ryujinx.Ava.UI.ViewModels +{ + public partial class SettingsHacksViewModel : BaseModel + { + private readonly SettingsViewModel _baseViewModel; + + public SettingsHacksViewModel() { } + + public SettingsHacksViewModel(SettingsViewModel settingsVm) + { + _baseViewModel = settingsVm; + } + + [ObservableProperty] private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix; + [ObservableProperty] private bool _nifmDisableIsAnyInternetRequestAccepted = ConfigurationState.Instance.Hacks.DisableNifmIsAnyInternetRequestAccepted; + + public static string Xc2MenuFixTooltip { get; } = Lambda.String(sb => + { + sb.AppendLine( + "This hack applies a 2ms delay (via 'Thread.Sleep(2)') every time the game tries to read data from the emulated Switch filesystem.") + .AppendLine(); + + sb.AppendLine("From the issue on GitHub:").AppendLine(); + sb.Append( + "When clicking very fast from game main menu to 2nd submenu, " + + "there is a low chance that the game will softlock, " + + "the submenu won't show up, while background music is still there."); + }); + + public static string NifmDisableIsAnyInternetRequestAcceptedTooltip { get; } = Lambda.String(sb => + { + sb.AppendLine( + "This hack simply sets 'IsAnyInternetRequestAccepted' to 'false' when initializing the Nifm IGeneralService.") + .AppendLine(); + + sb.Append("Lets DOOM 2016 go in game."); + }); + } +} diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index a5abeb36b..654eb0c43 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -1,31 +1,36 @@ using Avalonia.Collections; using Avalonia.Controls; +using Avalonia.Media.Imaging; using Avalonia.Threading; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; using LibHac.Tools.FsSystem; using Ryujinx.Audio.Backends.OpenAL; using Ryujinx.Audio.Backends.SDL2; using Ryujinx.Audio.Backends.SoundIo; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models.Input; using Ryujinx.Ava.UI.Windows; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.GraphicsDriver; +using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; +using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Vulkan; using Ryujinx.HLE; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS.Services.Time.TimeZone; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Configuration.System; using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.IO; using System.Linq; using System.Net.NetworkInformation; -using System.Runtime.InteropServices; -using System.Text.RegularExpressions; using System.Threading.Tasks; using TimeZone = Ryujinx.Ava.UI.Models.TimeZone; @@ -45,10 +50,10 @@ namespace Ryujinx.Ava.UI.ViewModels private int _resolutionScale; private int _graphicsBackendMultithreadingIndex; private float _volume; - private bool _isVulkanAvailable = true; - private bool _gameDirectoryChanged; - private bool _autoloadDirectoryChanged; - private readonly List _gpuIds = new(); + [ObservableProperty] private bool _isVulkanAvailable = true; + [ObservableProperty] private bool _gameListNeedsRefresh; + private readonly List _gpuIds = []; + public bool _useInputGlobalConfig; private int _graphicsBackendIndex; private int _scalingFilter; private int _scalingFilterLevel; @@ -56,13 +61,31 @@ namespace Ryujinx.Ava.UI.ViewModels private bool _enableCustomVSyncInterval; private int _customVSyncIntervalPercentageProxy; private VSyncMode _vSyncMode; + private long _turboModeMultiplier; public event Action CloseWindow; public event Action SaveSettingsEvent; + public event Action LocalGlobalInputSwitchEvent; private int _networkInterfaceIndex; private int _multiplayerModeIndex; private string _ldnPassphrase; - private string _LdnServer; + [ObservableProperty] private string _ldnServer; + + public SettingsHacksViewModel DirtyHacks { get; } + + private readonly bool _isGameRunning; + private readonly Bitmap _gameIcon; + private readonly string _gameTitle; + private readonly string _gamePath; + private readonly string _gameId; + public bool IsGameRunning => _isGameRunning; + public Bitmap GameIcon => _gameIcon; + public string GamePath => _gamePath; + public string GameTitle => _gameTitle; + public string GameId => _gameId; + public bool IsGameTitleNotNull => !string.IsNullOrEmpty(GameTitle); + public double PanelOpacity => IsGameTitleNotNull ? 0.5 : 1; + public int ResolutionScale { @@ -71,8 +94,7 @@ namespace Ryujinx.Ava.UI.ViewModels { _resolutionScale = value; - OnPropertyChanged(nameof(CustomResolutionScale)); - OnPropertyChanged(nameof(IsCustomResolutionScaleActive)); + OnPropertiesChanged(nameof(CustomResolutionScale), nameof(IsCustomResolutionScaleActive)); } } @@ -109,63 +131,42 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public bool IsVulkanAvailable - { - get => _isVulkanAvailable; - set - { - _isVulkanAvailable = value; - - OnPropertyChanged(); - } - } - public bool IsOpenGLAvailable => !OperatingSystem.IsMacOS(); - public bool IsHypervisorAvailable => OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64; - - public bool GameDirectoryChanged - { - get => _gameDirectoryChanged; - set - { - _gameDirectoryChanged = value; - - OnPropertyChanged(); - } - } - - public bool AutoloadDirectoryChanged - { - get => _autoloadDirectoryChanged; - set - { - _autoloadDirectoryChanged = value; - - OnPropertyChanged(); - } - } - - public bool IsMacOS => OperatingSystem.IsMacOS(); - public bool EnableDiscordIntegration { get; set; } - public bool CheckUpdatesOnStart { get; set; } public bool ShowConfirmExit { get; set; } public bool IgnoreApplet { get; set; } + public bool SkipUserProfiles { get; set; } public bool RememberWindowState { get; set; } - public bool ShowTitleBar { get; set; } + public bool ShowOldUI { get; set; } public int HideCursor { get; set; } + public int UpdateCheckerType { get; set; } public bool EnableDockedMode { get; set; } public bool EnableKeyboard { get; set; } public bool EnableMouse { get; set; } - public VSyncMode VSyncMode - { - get => _vSyncMode; + public bool DisableInputWhenOutOfFocus { get; set; } + public int FocusLostActionType { get; set; } + + public bool UseGlobalInputConfig + { + get => _useInputGlobalConfig; set { - if (value == VSyncMode.Custom || - value == VSyncMode.Switch || - value == VSyncMode.Unbounded) + _useInputGlobalConfig = value; + LocalGlobalInputSwitchEvent?.Invoke(_useInputGlobalConfig); + OnPropertyChanged(nameof(InputPanelOpacity)); + OnPropertyChanged(); + } + } + + public double InputPanelOpacity => UseGlobalInputConfig ? 0.5 : 1; + + public VSyncMode VSyncMode + { + get => _vSyncMode; + set + { + if (value is VSyncMode.Custom or VSyncMode.Switch or VSyncMode.Unbounded) { _vSyncMode = value; OnPropertyChanged(); @@ -181,19 +182,13 @@ namespace Ryujinx.Ava.UI.ViewModels int newInterval = (int)((value / 100f) * 60); _customVSyncInterval = newInterval; _customVSyncIntervalPercentageProxy = value; - OnPropertyChanged((nameof(CustomVSyncInterval))); - OnPropertyChanged((nameof(CustomVSyncIntervalPercentageText))); + OnPropertiesChanged( + nameof(CustomVSyncInterval), + nameof(CustomVSyncIntervalPercentageText)); } } - public string CustomVSyncIntervalPercentageText - { - get - { - string text = CustomVSyncIntervalPercentageProxy.ToString() + "%"; - return text; - } - } + public string CustomVSyncIntervalPercentageText => CustomVSyncIntervalPercentageProxy + "%"; public bool EnableCustomVSyncInterval { @@ -209,6 +204,7 @@ namespace Ryujinx.Ava.UI.ViewModels { VSyncMode = VSyncMode.Custom; } + OnPropertyChanged(); } } @@ -221,13 +217,33 @@ namespace Ryujinx.Ava.UI.ViewModels _customVSyncInterval = value; int newPercent = (int)((value / 60f) * 100); _customVSyncIntervalPercentageProxy = newPercent; - OnPropertyChanged(nameof(CustomVSyncIntervalPercentageProxy)); - OnPropertyChanged(nameof(CustomVSyncIntervalPercentageText)); + OnPropertiesChanged( + nameof(CustomVSyncIntervalPercentageProxy), + nameof(CustomVSyncIntervalPercentageText)); OnPropertyChanged(); } } public bool EnablePptc { get; set; } public bool EnableLowPowerPptc { get; set; } + + + public long TurboMultiplier + { + get => _turboModeMultiplier; + set + { + if (_turboModeMultiplier != value) + { + _turboModeMultiplier = value; + + OnPropertyChanged(); + OnPropertyChanged((nameof(TurboMultiplierPercentageText))); + } + } + } + + public string TurboMultiplierPercentageText => $"{TurboMultiplier}%"; + public bool EnableInternetAccess { get; set; } public bool EnableFsIntegrityChecks { get; set; } public bool IgnoreMissingServices { get; set; } @@ -236,7 +252,7 @@ namespace Ryujinx.Ava.UI.ViewModels public bool EnableTextureRecompression { get; set; } public bool EnableMacroHLE { get; set; } public bool EnableColorSpacePassthrough { get; set; } - public bool ColorSpacePassthroughAvailable => IsMacOS; + public bool ColorSpacePassthroughAvailable => RunningPlatform.IsMacOS; public bool EnableFileLog { get; set; } public bool EnableStub { get; set; } public bool EnableInfo { get; set; } @@ -245,6 +261,7 @@ namespace Ryujinx.Ava.UI.ViewModels public bool EnableTrace { get; set; } public bool EnableGuest { get; set; } public bool EnableFsAccessLog { get; set; } + public bool EnableAvaloniaLog { get; set; } public bool EnableDebug { get; set; } public bool IsOpenAlEnabled { get; set; } public bool IsSoundIoEnabled { get; set; } @@ -252,10 +269,13 @@ namespace Ryujinx.Ava.UI.ViewModels public bool IsCustomResolutionScaleActive => _resolutionScale == 4; public bool IsScalingFilterActive => _scalingFilter == (int)Ryujinx.Common.Configuration.ScalingFilter.Fsr; - public bool IsVulkanSelected => GraphicsBackendIndex == 0; + public bool IsVulkanSelected => + GraphicsBackendIndex == 1 || (GraphicsBackendIndex == 0 && !OperatingSystem.IsMacOS()); public bool UseHypervisor { get; set; } public bool DisableP2P { get; set; } + public bool ShowDirtyHacks => ConfigurationState.Instance.Hacks.ShowDirtyHacks; + public string TimeZone { get; set; } public string ShaderDumpPath { get; set; } @@ -329,7 +349,10 @@ namespace Ryujinx.Ava.UI.ViewModels } } + [ObservableProperty] private bool _matchSystemTime; + public DateTimeOffset CurrentDate { get; set; } + public TimeSpan CurrentTime { get; set; } internal AvaloniaList TimeZones { get; set; } @@ -339,7 +362,7 @@ namespace Ryujinx.Ava.UI.ViewModels public AvaloniaList NetworkInterfaceList { - get => new(_networkInterfaces.Keys); + get => [.. _networkInterfaces.Keys]; } public HotkeyConfig KeyboardHotkey { get; set; } @@ -350,7 +373,6 @@ namespace Ryujinx.Ava.UI.ViewModels set { _networkInterfaceIndex = value != -1 ? value : 0; - ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value = _networkInterfaces[NetworkInterfaceList[_networkInterfaceIndex]]; } } @@ -360,32 +382,72 @@ namespace Ryujinx.Ava.UI.ViewModels set { _multiplayerModeIndex = value; - ConfigurationState.Instance.Multiplayer.Mode.Value = (MultiplayerMode)_multiplayerModeIndex; } } - [GeneratedRegex("Ryujinx-[0-9a-f]{8}")] - private static partial Regex LdnPassphraseRegex(); - public bool IsInvalidLdnPassphraseVisible { get; set; } - public string LdnServer - { - get => _LdnServer; - set - { - _LdnServer = value; - OnPropertyChanged(); - } - } - public SettingsViewModel(VirtualFileSystem virtualFileSystem, ContentManager contentManager) : this() { _virtualFileSystem = virtualFileSystem; _contentManager = contentManager; + if (Program.PreviewerDetached) { Task.Run(LoadTimeZones); + + DirtyHacks = new SettingsHacksViewModel(this); + } + } + + public SettingsViewModel( + VirtualFileSystem virtualFileSystem, + ContentManager contentManager, + bool gameRunning, + string gamePath, + string gameName, + string gameId, + byte[] gameIconData, + bool customConfig) : this() + { + _virtualFileSystem = virtualFileSystem; + _contentManager = contentManager; + + if (gameIconData != null && gameIconData.Length > 0) + { + using var ms = new MemoryStream(gameIconData); + _gameIcon = new Bitmap(ms); + } + + _isGameRunning = gameRunning; + _gamePath = gamePath; + _gameTitle = gameName; + _gameId = gameId; + + if (customConfig) // During the game. If there is no user config, then load the global config window + { + string gameDir = Program.GetDirGameUserConfig(gameId, true); + + Program.UseExtraConfig = true; + + if (ConfigurationFileFormat.TryLoad(Program.GlobalConfigurationPath, out ConfigurationFileFormat configurationFileFormatExtra)) + { + // Extra load global configuration for input setting and save global input setting with other global config + ConfigurationState.InstanceExtra.Load(configurationFileFormatExtra, Program.GlobalConfigurationPath); + } + + if (ConfigurationFileFormat.TryLoad(gameDir, out ConfigurationFileFormat configurationFileFormat)) + { + ConfigurationState.Instance.Load(configurationFileFormat, gameDir, gameId); + } + + LoadCurrentConfiguration(); // Needed to load custom configuration + } + + if (Program.PreviewerDetached) + { + Task.Run(LoadTimeZones); + } } @@ -404,7 +466,11 @@ namespace Ryujinx.Ava.UI.ViewModels if (Program.PreviewerDetached) { Task.Run(LoadAvailableGpus); + + // if (!noLoadGlobalConfig)// Default is false, but loading custom config avoids double call LoadCurrentConfiguration(); + + DirtyHacks = new SettingsHacksViewModel(this); } } @@ -426,16 +492,16 @@ namespace Ryujinx.Ava.UI.ViewModels { AvailableGpus.Clear(); - var devices = VulkanRenderer.GetPhysicalDevices(); + DeviceInfo[] devices = VulkanRenderer.GetPhysicalDevices(); if (devices.Length == 0) { IsVulkanAvailable = false; - GraphicsBackendIndex = 1; + GraphicsBackendIndex = 2; } else { - foreach (var device in devices) + foreach (DeviceInfo device in devices) { await Dispatcher.UIThread.InvokeAsync(() => { @@ -498,7 +564,7 @@ namespace Ryujinx.Ava.UI.ViewModels private bool ValidateLdnPassphrase(string passphrase) { - return string.IsNullOrEmpty(passphrase) || (passphrase.Length == 16 && LdnPassphraseRegex().IsMatch(passphrase)); + return string.IsNullOrEmpty(passphrase) || (passphrase.Length == 16 && Patterns.LdnPassphrase.IsMatch(passphrase)); } public void ValidateAndSetTimeZone(string location) @@ -509,18 +575,18 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public void LoadCurrentConfiguration() + public void LoadCurrentConfiguration(bool global = false) { - ConfigurationState config = ConfigurationState.Instance; + ConfigurationState config = global ? ConfigurationState.InstanceExtra: ConfigurationState.Instance; // User Interface EnableDiscordIntegration = config.EnableDiscordIntegration; - CheckUpdatesOnStart = config.CheckUpdatesOnStart; ShowConfirmExit = config.ShowConfirmExit; - IgnoreApplet = config.IgnoreApplet; RememberWindowState = config.RememberWindowState; - ShowTitleBar = config.ShowTitleBar; + ShowOldUI = config.ShowOldUI; HideCursor = (int)config.HideCursor.Value; + UpdateCheckerType = (int)config.UpdateCheckerType.Value; + FocusLostActionType = (int)config.FocusLostActionType.Value; GameDirectories.Clear(); GameDirectories.AddRange(config.UI.GameDirs.Value); @@ -537,9 +603,11 @@ namespace Ryujinx.Ava.UI.ViewModels }; // Input + UseGlobalInputConfig = config.System.UseInputGlobalConfig; EnableDockedMode = config.System.EnableDockedMode; EnableKeyboard = config.Hid.EnableKeyboard; EnableMouse = config.Hid.EnableMouse; + DisableInputWhenOutOfFocus = config.Hid.DisableInputWhenOutOfFocus; // Keyboard Hotkeys KeyboardHotkey = new HotkeyConfig(config.Hid.Hotkeys.Value); @@ -555,18 +623,23 @@ namespace Ryujinx.Ava.UI.ViewModels CurrentDate = currentDateTime.Date; CurrentTime = currentDateTime.TimeOfDay; - EnableCustomVSyncInterval = config.Graphics.EnableCustomVSyncInterval.Value; + MatchSystemTime = config.System.MatchSystemTime; + + EnableCustomVSyncInterval = config.Graphics.EnableCustomVSyncInterval; CustomVSyncInterval = config.Graphics.CustomVSyncInterval; VSyncMode = config.Graphics.VSyncMode; EnableFsIntegrityChecks = config.System.EnableFsIntegrityChecks; DramSize = config.System.DramSize; IgnoreMissingServices = config.System.IgnoreMissingServices; + IgnoreApplet = config.System.IgnoreControllerApplet; + SkipUserProfiles = config.System.SkipUserProfilesManager; // CPU EnablePptc = config.System.EnablePtc; EnableLowPowerPptc = config.System.EnableLowPowerPtc; MemoryMode = (int)config.System.MemoryManagerMode.Value; UseHypervisor = config.System.UseHypervisor; + TurboMultiplier = config.System.TickScalar; // Graphics GraphicsBackendIndex = (int)config.Graphics.GraphicsBackend.Value; @@ -603,39 +676,30 @@ namespace Ryujinx.Ava.UI.ViewModels EnableGuest = config.Logger.EnableGuest; EnableDebug = config.Logger.EnableDebug; EnableFsAccessLog = config.Logger.EnableFsAccessLog; + EnableAvaloniaLog = config.Logger.EnableAvaloniaLog; FsGlobalAccessLogMode = config.System.FsGlobalAccessLogMode; OpenglDebugLevel = (int)config.Logger.GraphicsDebugLevel.Value; MultiplayerModeIndex = (int)config.Multiplayer.Mode.Value; - DisableP2P = config.Multiplayer.DisableP2p.Value; - LdnPassphrase = config.Multiplayer.LdnPassphrase.Value; - LdnServer = config.Multiplayer.LdnServer.Value; + DisableP2P = config.Multiplayer.DisableP2p; + LdnPassphrase = config.Multiplayer.LdnPassphrase; + LdnServer = config.Multiplayer.LdnServer; } - public void SaveSettings() + public void SaveSettings(bool global = false) { - ConfigurationState config = ConfigurationState.Instance; + ConfigurationState config = global ? ConfigurationState.InstanceExtra: ConfigurationState.Instance; // User Interface config.EnableDiscordIntegration.Value = EnableDiscordIntegration; - config.CheckUpdatesOnStart.Value = CheckUpdatesOnStart; config.ShowConfirmExit.Value = ShowConfirmExit; - config.IgnoreApplet.Value = IgnoreApplet; config.RememberWindowState.Value = RememberWindowState; - config.ShowTitleBar.Value = ShowTitleBar; + config.ShowOldUI.Value = ShowOldUI; config.HideCursor.Value = (HideCursorMode)HideCursor; - - if (_gameDirectoryChanged) - { - List gameDirs = new(GameDirectories); - config.UI.GameDirs.Value = gameDirs; - } - - if (_autoloadDirectoryChanged) - { - List autoloadDirs = new(AutoloadDirectories); - config.UI.AutoloadDirs.Value = autoloadDirs; - } + config.UpdateCheckerType.Value = (UpdaterType)UpdateCheckerType; + config.FocusLostActionType.Value = (FocusLostType)FocusLostActionType; + config.UI.GameDirs.Value = [.. GameDirectories]; + config.UI.AutoloadDirs.Value = [.. AutoloadDirectories]; config.UI.BaseStyle.Value = BaseStyleIndex switch { @@ -646,37 +710,46 @@ namespace Ryujinx.Ava.UI.ViewModels }; // Input + config.System.UseInputGlobalConfig.Value = UseGlobalInputConfig; config.System.EnableDockedMode.Value = EnableDockedMode; config.Hid.EnableKeyboard.Value = EnableKeyboard; config.Hid.EnableMouse.Value = EnableMouse; + config.Hid.DisableInputWhenOutOfFocus.Value = DisableInputWhenOutOfFocus; // Keyboard Hotkeys config.Hid.Hotkeys.Value = KeyboardHotkey.GetConfig(); // System config.System.Region.Value = (Region)Region; - config.System.Language.Value = (Language)Language; + if (config.System.Language.Value != (Language)Language) + GameListNeedsRefresh = true; + + config.System.Language.Value = (Language)Language; if (_validTzRegions.Contains(TimeZone)) { config.System.TimeZone.Value = TimeZone; } + config.System.MatchSystemTime.Value = MatchSystemTime; config.System.SystemTimeOffset.Value = Convert.ToInt64((CurrentDate.ToUnixTimeSeconds() + CurrentTime.TotalSeconds) - DateTimeOffset.Now.ToUnixTimeSeconds()); - config.Graphics.VSyncMode.Value = VSyncMode; - config.Graphics.EnableCustomVSyncInterval.Value = EnableCustomVSyncInterval; - config.Graphics.CustomVSyncInterval.Value = CustomVSyncInterval; config.System.EnableFsIntegrityChecks.Value = EnableFsIntegrityChecks; config.System.DramSize.Value = DramSize; config.System.IgnoreMissingServices.Value = IgnoreMissingServices; + config.System.IgnoreControllerApplet.Value = IgnoreApplet; + config.System.SkipUserProfilesManager.Value = SkipUserProfiles; // CPU config.System.EnablePtc.Value = EnablePptc; config.System.EnableLowPowerPtc.Value = EnableLowPowerPptc; config.System.MemoryManagerMode.Value = (MemoryManagerMode)MemoryMode; config.System.UseHypervisor.Value = UseHypervisor; + config.System.TickScalar.Value = TurboMultiplier; // Graphics + config.Graphics.VSyncMode.Value = VSyncMode; + config.Graphics.EnableCustomVSyncInterval.Value = EnableCustomVSyncInterval; + config.Graphics.CustomVSyncInterval.Value = CustomVSyncInterval; config.Graphics.GraphicsBackend.Value = (GraphicsBackend)GraphicsBackendIndex; config.Graphics.PreferredGpu.Value = _gpuIds.ElementAtOrDefault(PreferredGpuIndex); config.Graphics.EnableShaderCache.Value = EnableShaderCache; @@ -723,6 +796,7 @@ namespace Ryujinx.Ava.UI.ViewModels config.Logger.EnableGuest.Value = EnableGuest; config.Logger.EnableDebug.Value = EnableDebug; config.Logger.EnableFsAccessLog.Value = EnableFsAccessLog; + config.Logger.EnableAvaloniaLog.Value = EnableAvaloniaLog; config.System.FsGlobalAccessLogMode.Value = FsGlobalAccessLogMode; config.Logger.GraphicsDebugLevel.Value = (GraphicsDebugLevel)OpenglDebugLevel; @@ -732,19 +806,30 @@ namespace Ryujinx.Ava.UI.ViewModels config.Multiplayer.LdnPassphrase.Value = LdnPassphrase; config.Multiplayer.LdnServer.Value = LdnServer; + // Dirty Hacks + config.Hacks.Xc2MenuSoftlockFix.Value = DirtyHacks.Xc2MenuSoftlockFix; + config.Hacks.DisableNifmIsAnyInternetRequestAccepted.Value = + DirtyHacks.NifmDisableIsAnyInternetRequestAccepted; + config.ToFileFormat().SaveConfig(Program.ConfigurationPath); MainWindow.UpdateGraphicsConfig(); - MainWindow.MainWindowViewModel.VSyncModeSettingChanged(); + RyujinxApp.MainWindow.ViewModel.VSyncModeSettingChanged(); SaveSettingsEvent?.Invoke(); - _gameDirectoryChanged = false; - _autoloadDirectoryChanged = false; + GameListNeedsRefresh = false; } private static void RevertIfNotSaved() { + /* + maybe this is an unnecessary check(all options need to be tested) + if (string.IsNullOrEmpty(Program.GlobalConfigurationPath)) + { + Program.ReloadConfig(); + } + */ Program.ReloadConfig(); } @@ -753,12 +838,52 @@ namespace Ryujinx.Ava.UI.ViewModels SaveSettings(); } + public void DeleteConfigGame() + { + string gameDir = Program.GetDirGameUserConfig(GameId); + + if (File.Exists(gameDir)) + { + File.Delete(gameDir); + } + + RevertIfNotSaved(); + CloseWindow?.Invoke(); + } + + public void SaveUserConfig() + { + SaveSettings(); + RevertIfNotSaved(); // Revert global configuration after saving user configuration + CloseWindow?.Invoke(); + } + public void OkButton() { SaveSettings(); CloseWindow?.Invoke(); } + [ObservableProperty] private bool _wantsToReset; + + public AsyncRelayCommand ResetButton => Commands.Create(async () => + { + if (!WantsToReset) + return; + + CloseWindow?.Invoke(); + ConfigurationState.Instance.LoadDefault(); + ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath); + RyujinxApp.MainWindow.LoadApplications(); + + await ContentDialogHelper.CreateInfoDialog( + $"Your {RyujinxApp.FullAppName} configuration has been reset.", + "", + string.Empty, + LocaleManager.Instance[LocaleKeys.SettingsButtonClose], + "Configuration Reset"); + }); + public void CancelButton() { RevertIfNotSaved(); diff --git a/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs b/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs index dacdc3056..74876774e 100644 --- a/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs @@ -1,74 +1,32 @@ using Avalonia.Collections; -using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Platform.Storage; using Avalonia.Threading; +using CommunityToolkit.Mvvm.ComponentModel; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Ava.UI.Helpers; -using Ryujinx.HLE.FileSystem; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Models; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; -using Application = Avalonia.Application; namespace Ryujinx.Ava.UI.ViewModels { - public record TitleUpdateViewNoUpdateSentinal(); + public record TitleUpdateViewModelNoUpdate; - public class TitleUpdateViewModel : BaseModel + public partial class TitleUpdateViewModel : BaseModel { private ApplicationLibrary ApplicationLibrary { get; } private ApplicationData ApplicationData { get; } - private AvaloniaList _titleUpdates = new(); - private AvaloniaList _views = new(); - private object _selectedUpdate = new TitleUpdateViewNoUpdateSentinal(); - private bool _showBundledContentNotice = false; + [ObservableProperty] private AvaloniaList _titleUpdates = []; + [ObservableProperty] private AvaloniaList _views = []; + [ObservableProperty] private object _selectedUpdate = new TitleUpdateViewModelNoUpdate(); + [ObservableProperty] private bool _showBundledContentNotice; - public AvaloniaList TitleUpdates - { - get => _titleUpdates; - set - { - _titleUpdates = value; - OnPropertyChanged(); - } - } - - public AvaloniaList Views - { - get => _views; - set - { - _views = value; - OnPropertyChanged(); - } - } - - public object SelectedUpdate - { - get => _selectedUpdate; - set - { - _selectedUpdate = value; - OnPropertyChanged(); - } - } - - public bool ShowBundledContentNotice - { - get => _showBundledContentNotice; - set - { - _showBundledContentNotice = value; - OnPropertyChanged(); - } - } - - public IStorageProvider StorageProvider; + private readonly IStorageProvider _storageProvider; public TitleUpdateViewModel(ApplicationLibrary applicationLibrary, ApplicationData applicationData) { @@ -76,21 +34,17 @@ namespace Ryujinx.Ava.UI.ViewModels ApplicationData = applicationData; - if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - StorageProvider = desktop.MainWindow.StorageProvider; - } + _storageProvider = RyujinxApp.MainWindow.StorageProvider; LoadUpdates(); } private void LoadUpdates() { - var updates = ApplicationLibrary.TitleUpdates.Items - .Where(it => it.TitleUpdate.TitleIdBase == ApplicationData.IdBase); + (TitleUpdateModel TitleUpdate, bool IsSelected)[] updates = ApplicationLibrary.FindUpdateConfigurationFor(ApplicationData.Id); bool hasBundledContent = false; - SelectedUpdate = new TitleUpdateViewNoUpdateSentinal(); + SelectedUpdate = new TitleUpdateViewModelNoUpdate(); foreach ((TitleUpdateModel update, bool isSelected) in updates) { TitleUpdates.Add(update); @@ -109,19 +63,19 @@ namespace Ryujinx.Ava.UI.ViewModels public void SortUpdates() { - var sortedUpdates = TitleUpdates.OrderByDescending(update => update.Version); + IOrderedEnumerable sortedUpdates = TitleUpdates.OrderByDescending(update => update.Version); // NOTE(jpr): this works around a bug where calling Views.Clear also clears SelectedUpdate for // some reason. so we save the item here and restore it after - var selected = SelectedUpdate; + object selected = SelectedUpdate; Views.Clear(); - Views.Add(new TitleUpdateViewNoUpdateSentinal()); + Views.Add(new TitleUpdateViewModelNoUpdate()); Views.AddRange(sortedUpdates); SelectedUpdate = selected; - if (SelectedUpdate is TitleUpdateViewNoUpdateSentinal) + if (SelectedUpdate is TitleUpdateViewModelNoUpdate) { SelectedUpdate = Views[0]; } @@ -141,18 +95,18 @@ namespace Ryujinx.Ava.UI.ViewModels return false; } - if (!ApplicationLibrary.TryGetTitleUpdatesFromFile(path, out var updates)) + if (!ApplicationLibrary.TryGetTitleUpdatesFromFile(path, out List updates)) { return false; } - var updatesForThisGame = updates.Where(it => it.TitleIdBase == ApplicationData.Id).ToList(); + List updatesForThisGame = updates.Where(it => it.TitleIdBase == ApplicationData.Id).ToList(); if (updatesForThisGame.Count == 0) { return false; } - foreach (var update in updatesForThisGame) + foreach (TitleUpdateModel update in updatesForThisGame) { if (!TitleUpdates.Contains(update)) { @@ -179,7 +133,7 @@ namespace Ryujinx.Ava.UI.ViewModels } else if (update == SelectedUpdate as TitleUpdateModel) { - SelectedUpdate = new TitleUpdateViewNoUpdateSentinal(); + SelectedUpdate = new TitleUpdateViewModelNoUpdate(); } SortUpdates(); @@ -187,24 +141,24 @@ namespace Ryujinx.Ava.UI.ViewModels public async Task Add() { - var result = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions + IReadOnlyList result = await _storageProvider.OpenFilePickerAsync(new FilePickerOpenOptions { AllowMultiple = true, FileTypeFilter = new List { new(LocaleManager.Instance[LocaleKeys.AllSupportedFormats]) { - Patterns = new[] { "*.nsp" }, - AppleUniformTypeIdentifiers = new[] { "com.ryujinx.nsp" }, - MimeTypes = new[] { "application/x-nx-nsp" }, + Patterns = ["*.nsp"], + AppleUniformTypeIdentifiers = ["com.ryujinx.nsp"], + MimeTypes = ["application/x-nx-nsp"], }, }, }); - var totalUpdatesAdded = 0; - foreach (var file in result) + int totalUpdatesAdded = 0; + foreach (IStorageFile file in result) { - if (!AddUpdate(file.Path.LocalPath, out var newUpdatesAdded)) + if (!AddUpdate(file.Path.LocalPath, out int newUpdatesAdded)) { await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogUpdateAddUpdateErrorMessage]); } @@ -220,21 +174,21 @@ namespace Ryujinx.Ava.UI.ViewModels public void Save() { - var updates = TitleUpdates.Select(it => (it, it == SelectedUpdate as TitleUpdateModel)).ToList(); + List<(TitleUpdateModel it, bool)> updates = TitleUpdates.Select(it => (it, it == SelectedUpdate as TitleUpdateModel)).ToList(); ApplicationLibrary.SaveTitleUpdatesForGame(ApplicationData, updates); } - private Task ShowNewUpdatesAddedDialog(int numAdded) + private Task ShowNewUpdatesAddedDialog(int numAdded) { - var msg = string.Format(LocaleManager.Instance[LocaleKeys.UpdateWindowUpdateAddedMessage], numAdded); - return Dispatcher.UIThread.InvokeAsync(async () => + string msg = string.Format(LocaleManager.Instance[LocaleKeys.UpdateWindowUpdateAddedMessage], numAdded); + return Dispatcher.UIThread.InvokeAsync(async () => await ContentDialogHelper.ShowTextDialog( - LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle], - msg, - string.Empty, - string.Empty, - string.Empty, - LocaleManager.Instance[LocaleKeys.InputDialogOk], + LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle], + msg, + string.Empty, + string.Empty, + string.Empty, + LocaleManager.Instance[LocaleKeys.InputDialogOk], (int)Symbol.Checkmark )); } diff --git a/src/Ryujinx/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs b/src/Ryujinx/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs index b07bf78b9..8c6a71038 100644 --- a/src/Ryujinx/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs @@ -1,4 +1,5 @@ using Avalonia.Media; +using CommunityToolkit.Mvvm.ComponentModel; using LibHac.Common; using LibHac.Fs; using LibHac.Fs.Fsa; @@ -20,41 +21,25 @@ using Image = SkiaSharp.SKImage; namespace Ryujinx.Ava.UI.ViewModels { - internal class UserFirmwareAvatarSelectorViewModel : BaseModel + public partial class UserFirmwareAvatarSelectorViewModel : BaseModel { private static readonly Dictionary _avatarStore = new(); - private ObservableCollection _images; - private Color _backgroundColor = Colors.White; + [ObservableProperty] private ObservableCollection _images; + [ObservableProperty] private Color _backgroundColor = Colors.White; private int _selectedIndex; public UserFirmwareAvatarSelectorViewModel() { - _images = new ObservableCollection(); + _images = []; LoadImagesFromStore(); - } - - public Color BackgroundColor - { - get => _backgroundColor; - set + PropertyChanged += (_, args) => { - _backgroundColor = value; - OnPropertyChanged(); - ChangeImageBackground(); - } - } - - public ObservableCollection Images - { - get => _images; - set - { - _images = value; - OnPropertyChanged(); - } + if (args.PropertyName == nameof(BackgroundColor)) + ChangeImageBackground(); + }; } public int SelectedIndex @@ -70,7 +55,7 @@ namespace Ryujinx.Ava.UI.ViewModels } else { - SelectedImage = _images[_selectedIndex].Data; + SelectedImage = Images[_selectedIndex].Data; } OnPropertyChanged(); @@ -83,7 +68,7 @@ namespace Ryujinx.Ava.UI.ViewModels { Images.Clear(); - foreach (var image in _avatarStore) + foreach (KeyValuePair image in _avatarStore) { Images.Add(new ProfileImageModel(image.Key, image.Value)); } @@ -91,7 +76,7 @@ namespace Ryujinx.Ava.UI.ViewModels private void ChangeImageBackground() { - foreach (var image in Images) + foreach (ProfileImageModel image in Images) { image.BackgroundColor = new SolidColorBrush(BackgroundColor); } @@ -119,7 +104,7 @@ namespace Ryujinx.Ava.UI.ViewModels // TODO: Parse DatabaseInfo.bin and table.bin files for more accuracy. if (item.Type == DirectoryEntryType.File && item.FullPath.Contains("chara") && item.FullPath.Contains("szs")) { - using var file = new UniqueRef(); + using UniqueRef file = new(); romfs.OpenFile(ref file.Ref, ("/" + item.FullPath).ToU8Span(), OpenMode.Read).ThrowIfFailure(); @@ -143,7 +128,7 @@ namespace Ryujinx.Ava.UI.ViewModels } } - private static byte[] DecompressYaz0(Stream stream) + private static byte[] DecompressYaz0(MemoryStream stream) { using BinaryReader reader = new(stream); diff --git a/src/Ryujinx/UI/ViewModels/UserProfileImageSelectorViewModel.cs b/src/Ryujinx/UI/ViewModels/UserProfileImageSelectorViewModel.cs index 8e7d41a55..f9f9ca2f5 100644 --- a/src/Ryujinx/UI/ViewModels/UserProfileImageSelectorViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/UserProfileImageSelectorViewModel.cs @@ -1,18 +1,9 @@ +using CommunityToolkit.Mvvm.ComponentModel; + namespace Ryujinx.Ava.UI.ViewModels { - internal class UserProfileImageSelectorViewModel : BaseModel + public partial class UserProfileImageSelectorViewModel : BaseModel { - private bool _firmwareFound; - - public bool FirmwareFound - { - get => _firmwareFound; - - set - { - _firmwareFound = value; - OnPropertyChanged(); - } - } + [ObservableProperty] private bool _firmwareFound; } } diff --git a/src/Ryujinx/UI/ViewModels/UserProfileViewModel.cs b/src/Ryujinx/UI/ViewModels/UserProfileViewModel.cs index 0b65e6d13..f3a9e432a 100644 --- a/src/Ryujinx/UI/ViewModels/UserProfileViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/UserProfileViewModel.cs @@ -9,8 +9,8 @@ namespace Ryujinx.Ava.UI.ViewModels { public UserProfileViewModel() { - Profiles = new ObservableCollection(); - LostProfiles = new ObservableCollection(); + Profiles = []; + LostProfiles = []; IsEmpty = !LostProfiles.Any(); } diff --git a/src/Ryujinx/UI/ViewModels/UserSaveManagerViewModel.cs b/src/Ryujinx/UI/ViewModels/UserSaveManagerViewModel.cs index 85adef005..894af8c6c 100644 --- a/src/Ryujinx/UI/ViewModels/UserSaveManagerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/UserSaveManagerViewModel.cs @@ -1,3 +1,4 @@ +using CommunityToolkit.Mvvm.ComponentModel; using DynamicData; using DynamicData.Binding; using Ryujinx.Ava.Common.Locale; @@ -8,74 +9,31 @@ using System.Collections.ObjectModel; namespace Ryujinx.Ava.UI.ViewModels { - public class UserSaveManagerViewModel : BaseModel + public partial class UserSaveManagerViewModel : BaseModel { - private int _sortIndex; - private int _orderIndex; - private string _search; - private ObservableCollection _saves = new(); - private ObservableCollection _views = new(); + [ObservableProperty] private int _sortIndex; + [ObservableProperty] private int _orderIndex; + [ObservableProperty] private string _search; + [ObservableProperty] private ObservableCollection _saves = []; + [ObservableProperty] private ObservableCollection _views = []; private readonly AccountManager _accountManager; public string SaveManagerHeading => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.SaveManagerHeading, _accountManager.LastOpenedUser.Name, _accountManager.LastOpenedUser.UserId); - public int SortIndex - { - get => _sortIndex; - set - { - _sortIndex = value; - OnPropertyChanged(); - Sort(); - } - } - - public int OrderIndex - { - get => _orderIndex; - set - { - _orderIndex = value; - OnPropertyChanged(); - Sort(); - } - } - - public string Search - { - get => _search; - set - { - _search = value; - OnPropertyChanged(); - Sort(); - } - } - - public ObservableCollection Saves - { - get => _saves; - set - { - _saves = value; - OnPropertyChanged(); - Sort(); - } - } - - public ObservableCollection Views - { - get => _views; - set - { - _views = value; - OnPropertyChanged(); - } - } - public UserSaveManagerViewModel(AccountManager accountManager) { _accountManager = accountManager; + PropertyChanged += (_, evt) => + { + if (evt.PropertyName is + nameof(SortIndex) or + nameof(OrderIndex) or + nameof(Search) or + nameof(Saves)) + { + Sort(); + } + }; } public void Sort() @@ -83,10 +41,10 @@ namespace Ryujinx.Ava.UI.ViewModels Saves.AsObservableChangeSet() .Filter(Filter) .Sort(GetComparer()) - .Bind(out var view).AsObservableList(); + .Bind(out ReadOnlyObservableCollection view).AsObservableList(); - _views.Clear(); - _views.AddRange(view); + Views.Clear(); + Views.AddRange(view); OnPropertyChanged(nameof(Views)); } @@ -94,13 +52,13 @@ namespace Ryujinx.Ava.UI.ViewModels { if (arg is SaveModel save) { - return string.IsNullOrWhiteSpace(_search) || save.Title.ToLower().Contains(_search.ToLower()); + return string.IsNullOrWhiteSpace(Search) || save.Title.Contains(Search, System.StringComparison.OrdinalIgnoreCase); } return false; } - private IComparer GetComparer() + private SortExpressionComparer GetComparer() { return SortIndex switch { diff --git a/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs similarity index 82% rename from src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs rename to src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs index b582360f1..dab42fbf8 100644 --- a/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs @@ -1,21 +1,22 @@ using Avalonia.Collections; +using Avalonia.Threading; using DynamicData; using Gommon; -using Avalonia.Threading; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Common.Utilities; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Models; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Threading; using static Ryujinx.Common.Utilities.XCIFileTrimmer; namespace Ryujinx.Ava.UI.ViewModels { - public class XCITrimmerViewModel : BaseModel + public class XciTrimmerViewModel : BaseModel { private const long _bytesPerMB = 1024 * 1024; private enum ProcessingMode @@ -33,32 +34,31 @@ namespace Ryujinx.Ava.UI.ViewModels private const string _FileExtXCI = "XCI"; private readonly Ryujinx.Common.Logging.XCIFileTrimmerLog _logger; - private readonly ApplicationLibrary _applicationLibrary; + private ApplicationLibrary ApplicationLibrary => _mainWindowViewModel.ApplicationLibrary; private Optional _processingApplication = null; - private AvaloniaList _allXCIFiles = new(); - private AvaloniaList _selectedXCIFiles = new(); - private AvaloniaList _displayedXCIFiles = new(); - private MainWindowViewModel _mainWindowViewModel; + private readonly AvaloniaList _allXCIFiles = []; + private AvaloniaList _selectedXCIFiles = []; + private readonly AvaloniaList _displayedXCIFiles = []; + private readonly MainWindowViewModel _mainWindowViewModel; private CancellationTokenSource _cancellationTokenSource; private string _search; private ProcessingMode _processingMode; private SortField _sortField = SortField.Name; private bool _sortAscending = true; - public XCITrimmerViewModel(MainWindowViewModel mainWindowViewModel) + public XciTrimmerViewModel(MainWindowViewModel mainWindowViewModel) { - _logger = new XCIFileTrimmerWindowLog(this); + _logger = new XCITrimmerLog.TrimmerWindow(this); _mainWindowViewModel = mainWindowViewModel; - _applicationLibrary = _mainWindowViewModel.ApplicationLibrary; LoadXCIApplications(); } private void LoadXCIApplications() { - var apps = _applicationLibrary.Applications.Items + IEnumerable apps = ApplicationLibrary.Applications.Items .Where(app => app.FileExtension == _FileExtXCI); - foreach (var xciApp in apps) + foreach (ApplicationData xciApp in apps) AddOrUpdateXCITrimmerFile(CreateXCITrimmerFile(xciApp.Path)); ApplicationsChanged(); @@ -68,7 +68,7 @@ namespace Ryujinx.Ava.UI.ViewModels string path, OperationOutcome operationOutcome = OperationOutcome.Undetermined) { - var xciApp = _applicationLibrary.Applications.Items.First(app => app.FileExtension == _FileExtXCI && app.Path == path); + ApplicationData xciApp = ApplicationLibrary.Applications.Items.First(app => app.FileExtension == _FileExtXCI && app.Path == path); return XCITrimmerFileModel.FromApplicationData(xciApp, _logger) with { ProcessingOutcome = operationOutcome }; } @@ -92,39 +92,42 @@ namespace Ryujinx.Ava.UI.ViewModels private void SortingChanged() { - OnPropertyChanged(nameof(IsSortedByName)); - OnPropertyChanged(nameof(IsSortedBySaved)); - OnPropertyChanged(nameof(SortingAscending)); - OnPropertyChanged(nameof(SortingField)); - OnPropertyChanged(nameof(SortingFieldName)); + OnPropertiesChanged( + nameof(IsSortedByName), + nameof(IsSortedBySaved), + nameof(SortingAscending), + nameof(SortingField), + nameof(SortingFieldName)); + SortAndFilter(); } private void DisplayedChanged() { - OnPropertyChanged(nameof(Status)); - OnPropertyChanged(nameof(DisplayedXCIFiles)); - OnPropertyChanged(nameof(SelectedDisplayedXCIFiles)); + OnPropertiesChanged(nameof(Status), nameof(DisplayedXCIFiles), nameof(SelectedDisplayedXCIFiles)); } private void ApplicationsChanged() { - OnPropertyChanged(nameof(AllXCIFiles)); - OnPropertyChanged(nameof(Status)); - OnPropertyChanged(nameof(PotentialSavings)); - OnPropertyChanged(nameof(ActualSavings)); - OnPropertyChanged(nameof(CanTrim)); - OnPropertyChanged(nameof(CanUntrim)); + OnPropertiesChanged( + nameof(AllXCIFiles), + nameof(Status), + nameof(PotentialSavings), + nameof(ActualSavings), + nameof(CanTrim), + nameof(CanUntrim)); + DisplayedChanged(); SortAndFilter(); } private void SelectionChanged(bool displayedChanged = true) { - OnPropertyChanged(nameof(Status)); - OnPropertyChanged(nameof(CanTrim)); - OnPropertyChanged(nameof(CanUntrim)); - OnPropertyChanged(nameof(SelectedXCIFiles)); + OnPropertiesChanged( + nameof(Status), + nameof(CanTrim), + nameof(CanUntrim), + nameof(SelectedXCIFiles)); if (displayedChanged) OnPropertyChanged(nameof(SelectedDisplayedXCIFiles)); @@ -132,11 +135,12 @@ namespace Ryujinx.Ava.UI.ViewModels private void ProcessingChanged() { - OnPropertyChanged(nameof(Processing)); - OnPropertyChanged(nameof(Cancel)); - OnPropertyChanged(nameof(Status)); - OnPropertyChanged(nameof(CanTrim)); - OnPropertyChanged(nameof(CanUntrim)); + OnPropertiesChanged( + nameof(Processing), + nameof(Cancel), + nameof(Status), + nameof(CanTrim), + nameof(CanUntrim)); } private IEnumerable GetSelectedDisplayedXCIFiles() @@ -153,17 +157,17 @@ namespace Ryujinx.Ava.UI.ViewModels _processingMode = processingMode; Processing = true; - var cancellationToken = _cancellationTokenSource.Token; + CancellationToken cancellationToken = _cancellationTokenSource.Token; Thread XCIFileTrimThread = new(() => { - var toProcess = Sort(SelectedXCIFiles + List toProcess = Sort(SelectedXCIFiles .Where(xci => (processingMode == ProcessingMode.Untrimming && xci.Untrimmable) || (processingMode == ProcessingMode.Trimming && xci.Trimmable) )).ToList(); - var viewsSaved = DisplayedXCIFiles.ToList(); + List viewsSaved = DisplayedXCIFiles.ToList(); Dispatcher.UIThread.Post(() => { @@ -174,19 +178,19 @@ namespace Ryujinx.Ava.UI.ViewModels try { - foreach (var xciApp in toProcess) + foreach (XCITrimmerFileModel xciApp in toProcess) { if (cancellationToken.IsCancellationRequested) break; - var trimmer = new XCIFileTrimmer(xciApp.Path, _logger); + XCIFileTrimmer trimmer = new(xciApp.Path, _logger); Dispatcher.UIThread.Post(() => { ProcessingApplication = xciApp; }); - var outcome = OperationOutcome.Undetermined; + OperationOutcome outcome = OperationOutcome.Undetermined; try { @@ -241,8 +245,8 @@ namespace Ryujinx.Ava.UI.ViewModels if (arg is XCITrimmerFileModel content) { return string.IsNullOrWhiteSpace(_search) - || content.Name.ToLower().Contains(_search.ToLower()) - || content.Path.ToLower().Contains(_search.ToLower()); + || content.Name.Contains(_search, System.StringComparison.OrdinalIgnoreCase) + || content.Path.Contains(_search, System.StringComparison.OrdinalIgnoreCase); } return false; @@ -250,9 +254,9 @@ namespace Ryujinx.Ava.UI.ViewModels private class CompareXCITrimmerFiles : IComparer { - private XCITrimmerViewModel _viewModel; + private readonly XciTrimmerViewModel _viewModel; - public CompareXCITrimmerFiles(XCITrimmerViewModel ViewModel) + public CompareXCITrimmerFiles(XciTrimmerViewModel ViewModel) { _viewModel = ViewModel; } @@ -344,7 +348,7 @@ namespace Ryujinx.Ava.UI.ViewModels Sort(AllXCIFiles) .AsObservableChangeSet() .Filter(Filter) - .Bind(out var view).AsObservableList(); + .Bind(out ReadOnlyObservableCollection view).AsObservableList(); _displayedXCIFiles.Clear(); _displayedXCIFiles.AddRange(view); @@ -361,13 +365,23 @@ namespace Ryujinx.Ava.UI.ViewModels value = _processingApplication.Value with { PercentageProgress = null }; if (value.HasValue) - _displayedXCIFiles.ReplaceWith(value.Value); + _displayedXCIFiles.ReplaceWith(value); _processingApplication = value; OnPropertyChanged(); } } + public XCITrimmerFileModel NullableProcessingApplication + { + get => _processingApplication.OrDefault(); + set + { + _processingApplication = value; + OnPropertyChanged(); + } + } + public bool Processing { get => _cancellationTokenSource != null; @@ -538,4 +552,4 @@ namespace Ryujinx.Ava.UI.ViewModels } } } -} \ No newline at end of file +} diff --git a/src/Ryujinx/UI/Windows/AboutWindow.axaml b/src/Ryujinx/UI/Views/Dialog/AboutView.axaml similarity index 82% rename from src/Ryujinx/UI/Windows/AboutWindow.axaml rename to src/Ryujinx/UI/Views/Dialog/AboutView.axaml index 1d0e36ae9..5788f533f 100644 --- a/src/Ryujinx/UI/Windows/AboutWindow.axaml +++ b/src/Ryujinx/UI/Views/Dialog/AboutView.axaml @@ -1,5 +1,5 @@ - @@ -141,44 +143,38 @@ + VerticalAlignment="Stretch" RowDefinitions="Auto,Auto,Auto"> + + + - diff --git a/src/Ryujinx/UI/Windows/AboutWindow.axaml.cs b/src/Ryujinx/UI/Views/Dialog/AboutView.axaml.cs similarity index 53% rename from src/Ryujinx/UI/Windows/AboutWindow.axaml.cs rename to src/Ryujinx/UI/Views/Dialog/AboutView.axaml.cs index 3cf709019..8cfb18d15 100644 --- a/src/Ryujinx/UI/Windows/AboutWindow.axaml.cs +++ b/src/Ryujinx/UI/Views/Dialog/AboutView.axaml.cs @@ -1,51 +1,37 @@ using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; -using Avalonia.Layout; -using Avalonia.Styling; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.Common; -using Ryujinx.UI.Common.Helper; +using Ryujinx.Common.Helper; using System.Threading.Tasks; using Button = Avalonia.Controls.Button; -namespace Ryujinx.Ava.UI.Windows +namespace Ryujinx.Ava.UI.Views.Dialog { - public partial class AboutWindow : UserControl + public partial class AboutView : RyujinxControl { - public AboutWindow() + public AboutView() { - DataContext = new AboutWindowViewModel(); - InitializeComponent(); - - GitHubRepoButton.Tag = - $"https://github.com/{ReleaseInformation.ReleaseChannelOwner}/{ReleaseInformation.ReleaseChannelRepo}"; } public static async Task Show() { + using AboutWindowViewModel viewModel = new(); + ContentDialog contentDialog = new() { PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose], - Content = new AboutWindow(), + Content = new AboutView { ViewModel = viewModel } }; - Style closeButton = new(x => x.Name("CloseButton")); - closeButton.Setters.Add(new Setter(WidthProperty, 80d)); - - Style closeButtonParent = new(x => x.Name("CommandSpace")); - closeButtonParent.Setters.Add(new Setter(HorizontalAlignmentProperty, HorizontalAlignment.Right)); - - contentDialog.Styles.Add(closeButton); - contentDialog.Styles.Add(closeButtonParent); - - await ContentDialogHelper.ShowAsync(contentDialog); + await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles()); } private void Button_OnClick(object sender, RoutedEventArgs e) diff --git a/src/Ryujinx/UI/Views/Dialog/ApplicationDataView.axaml b/src/Ryujinx/UI/Views/Dialog/ApplicationDataView.axaml new file mode 100644 index 000000000..7ba4ad784 --- /dev/null +++ b/src/Ryujinx/UI/Views/Dialog/ApplicationDataView.axaml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Views/Dialog/ApplicationDataView.axaml.cs b/src/Ryujinx/UI/Views/Dialog/ApplicationDataView.axaml.cs new file mode 100644 index 000000000..8f6be58a9 --- /dev/null +++ b/src/Ryujinx/UI/Views/Dialog/ApplicationDataView.axaml.cs @@ -0,0 +1,70 @@ +using Avalonia.Controls; +using Avalonia.Input.Platform; +using Avalonia.Interactivity; +using Avalonia.Layout; +using FluentAvalonia.UI.Controls; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.UI.Controls; +using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.UI.Windows; +using System.Linq; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.UI.Views.Dialog +{ + public partial class ApplicationDataView : RyujinxControl + { + public static async Task Show(ApplicationData appData) + { + ContentDialog contentDialog = new() + { + Title = appData.Name, + PrimaryButtonText = string.Empty, + SecondaryButtonText = string.Empty, + CloseButtonText = LocaleManager.Instance[LocaleKeys.SettingsButtonClose], + MinWidth = 256, + Content = new ApplicationDataView { ViewModel = new ApplicationDataViewModel(appData) } + }; + + await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles(160, HorizontalAlignment.Center)); + } + + public ApplicationDataView() + { + InitializeComponent(); + } + + private async void PlayabilityStatus_OnClick(object sender, RoutedEventArgs e) + { + if (sender is not Button { Content: TextBlock playabilityLabel }) + return; + + if (RyujinxApp.AppLifetime.Windows.TryGetFirst(x => x is ContentDialogOverlayWindow, out Window window)) + window.Close(ContentDialogResult.None); + + await CompatibilityListWindow.Show((string)playabilityLabel.Tag); + } + + private async void IdString_OnClick(object sender, RoutedEventArgs e) + { + if (sender is not Button { Content: TextBlock idText }) + return; + + if (!RyujinxApp.IsClipboardAvailable(out IClipboard clipboard)) + return; + + ApplicationData appData = RyujinxApp.MainWindow.ViewModel.Applications.FirstOrDefault(it => it.IdString == idText.Text); + if (appData is null) + return; + + await clipboard.SetTextAsync(appData.IdString); + + NotificationHelper.ShowInformation( + "Copied Title ID", + $"{appData.Name} ({appData.IdString})"); + } + } +} + diff --git a/src/Ryujinx/UI/Views/Dialog/DlcSelectView.axaml b/src/Ryujinx/UI/Views/Dialog/DlcSelectView.axaml new file mode 100644 index 000000000..05d1f7ae5 --- /dev/null +++ b/src/Ryujinx/UI/Views/Dialog/DlcSelectView.axaml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Views/Dialog/DlcSelectView.axaml.cs b/src/Ryujinx/UI/Views/Dialog/DlcSelectView.axaml.cs new file mode 100644 index 000000000..8390b7403 --- /dev/null +++ b/src/Ryujinx/UI/Views/Dialog/DlcSelectView.axaml.cs @@ -0,0 +1,38 @@ +using FluentAvalonia.UI.Controls; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.UI.Controls; +using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.ViewModels; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.UI.Views.Dialog +{ + public partial class DlcSelectView : RyujinxControl + { + public DlcSelectView() + { + InitializeComponent(); + } + +#nullable enable + public static async Task Show(ulong selectedTitleId, ApplicationLibrary appLibrary) +#nullable disable + { + DlcSelectViewModel viewModel = new(selectedTitleId, appLibrary); + + ContentDialog contentDialog = new() + { + PrimaryButtonText = LocaleManager.Instance[LocaleKeys.Continue], + SecondaryButtonText = string.Empty, + CloseButtonText = string.Empty, + Content = new DlcSelectView { ViewModel = viewModel } + }; + + await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles()); + + return viewModel.SelectedDlc; + } + } +} diff --git a/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml b/src/Ryujinx/UI/Views/Dialog/DownloadableContentManagerView.axaml similarity index 94% rename from src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml rename to src/Ryujinx/UI/Views/Dialog/DownloadableContentManagerView.axaml index df70f02eb..8b97a4822 100644 --- a/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml +++ b/src/Ryujinx/UI/Views/Dialog/DownloadableContentManagerView.axaml @@ -1,22 +1,19 @@ - - - - + @@ -101,7 +98,7 @@ TextWrapping="Wrap" TextTrimming="CharacterEllipsis"> - + @@ -112,7 +109,7 @@ Margin="10 0" HorizontalAlignment="Left" VerticalAlignment="Center" - Text="{Binding TitleId}" /> + Text="{Binding TitleIdStr}" /> { - public DownloadableContentManagerViewModel ViewModel; - - public DownloadableContentManagerWindow() + public DownloadableContentManagerView() { - DataContext = this; - - InitializeComponent(); - } - - public DownloadableContentManagerWindow(ApplicationLibrary applicationLibrary, ApplicationData applicationData) - { - DataContext = ViewModel = new DownloadableContentManagerViewModel(applicationLibrary, applicationData); - InitializeComponent(); } @@ -36,8 +26,11 @@ namespace Ryujinx.Ava.UI.Windows PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = string.Empty, - Content = new DownloadableContentManagerWindow(applicationLibrary, applicationData), Title = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowTitle], applicationData.Name, applicationData.IdBaseString), + Content = new DownloadableContentManagerView + { + ViewModel = new DownloadableContentManagerViewModel(applicationLibrary, applicationData) + } }; Style bottomBorder = new(x => x.OfType().Name("DialogSpace").Child().OfType()); @@ -61,29 +54,23 @@ namespace Ryujinx.Ava.UI.Windows private void RemoveDLC(object sender, RoutedEventArgs e) { - if (sender is Button button) + if (sender is Button { DataContext: DownloadableContentModel dlc }) { - if (button.DataContext is DownloadableContentModel model) - { - ViewModel.Remove(model); - } + ViewModel.Remove(dlc); } } private void OpenLocation(object sender, RoutedEventArgs e) { - if (sender is Button button) + if (sender is Button { DataContext: DownloadableContentModel dlc }) { - if (button.DataContext is DownloadableContentModel model) - { - OpenHelper.LocateFile(model.ContainerPath); - } + OpenHelper.LocateFile(dlc.ContainerPath); } } private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { - foreach (var content in e.AddedItems) + foreach (object content in e.AddedItems) { if (content is DownloadableContentModel model) { @@ -91,7 +78,7 @@ namespace Ryujinx.Ava.UI.Windows } } - foreach (var content in e.RemovedItems) + foreach (object content in e.RemovedItems) { if (content is DownloadableContentModel model) { diff --git a/src/Ryujinx/UI/Windows/ModManagerWindow.axaml b/src/Ryujinx/UI/Views/Dialog/ModManagerView.axaml similarity index 94% rename from src/Ryujinx/UI/Windows/ModManagerWindow.axaml rename to src/Ryujinx/UI/Views/Dialog/ModManagerView.axaml index 3a1c4e6dd..ee913b56d 100644 --- a/src/Ryujinx/UI/Windows/ModManagerWindow.axaml +++ b/src/Ryujinx/UI/Views/Dialog/ModManagerView.axaml @@ -10,7 +10,7 @@ Width="500" Height="380" mc:Ignorable="d" - x:Class="Ryujinx.Ava.UI.Windows.ModManagerWindow" + x:Class="Ryujinx.Ava.UI.Views.Dialog.ModManagerView" x:CompileBindings="True" x:DataType="viewModels:ModManagerViewModel" Focusable="True"> @@ -70,18 +70,14 @@ - - - - - + + Text="{Binding FormattedName}" /> { - public readonly ModManagerViewModel ViewModel; - - public ModManagerWindow() + public ModManagerView() { - DataContext = this; - InitializeComponent(); } - public ModManagerWindow(ulong titleId) - { - DataContext = ViewModel = new ModManagerViewModel(titleId); - - InitializeComponent(); - } - - public static async Task Show(ulong titleId, string titleName) + public static async Task Show(ulong titleId, ulong titleIdBase, ApplicationLibrary appLibrary, string titleName) { ContentDialog contentDialog = new() { PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = string.Empty, - Content = new ModManagerWindow(titleId), + Content = new ModManagerView + { + ViewModel = new ModManagerViewModel(titleId, titleIdBase, appLibrary) + }, Title = string.Format(LocaleManager.Instance[LocaleKeys.ModWindowTitle], titleName, titleId.ToString("X16")), }; @@ -66,7 +60,7 @@ namespace Ryujinx.Ava.UI.Windows { if (button.DataContext is ModModel model) { - var result = await ContentDialogHelper.CreateConfirmationDialog( + UserResult result = await ContentDialogHelper.CreateConfirmationDialog( LocaleManager.Instance[LocaleKeys.DialogWarning], LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogModManagerDeletionWarningMessage, model.Name), LocaleManager.Instance[LocaleKeys.InputDialogYes], @@ -83,7 +77,7 @@ namespace Ryujinx.Ava.UI.Windows private async void DeleteAll(object sender, RoutedEventArgs e) { - var result = await ContentDialogHelper.CreateConfirmationDialog( + UserResult result = await ContentDialogHelper.CreateConfirmationDialog( LocaleManager.Instance[LocaleKeys.DialogWarning], LocaleManager.Instance[LocaleKeys.DialogModManagerDeletionAllWarningMessage], LocaleManager.Instance[LocaleKeys.InputDialogYes], @@ -109,11 +103,11 @@ namespace Ryujinx.Ava.UI.Windows private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { - foreach (var content in e.AddedItems) + foreach (object content in e.AddedItems) { if (content is ModModel model) { - var index = ViewModel.Mods.IndexOf(model); + int index = ViewModel.Mods.IndexOf(model); if (index != -1) { @@ -122,11 +116,11 @@ namespace Ryujinx.Ava.UI.Windows } } - foreach (var content in e.RemovedItems) + foreach (object content in e.RemovedItems) { if (content is ModModel model) { - var index = ViewModel.Mods.IndexOf(model); + int index = ViewModel.Mods.IndexOf(model); if (index != -1) { diff --git a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml b/src/Ryujinx/UI/Views/Dialog/TitleUpdateManagerView.axaml similarity index 93% rename from src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml rename to src/Ryujinx/UI/Views/Dialog/TitleUpdateManagerView.axaml index 6e22cfed7..ba3e85e8b 100644 --- a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml +++ b/src/Ryujinx/UI/Views/Dialog/TitleUpdateManagerView.axaml @@ -1,22 +1,19 @@ - - - - + @@ -95,7 +92,7 @@ + DataType="viewModels:TitleUpdateViewModelNoUpdate"> diff --git a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs b/src/Ryujinx/UI/Views/Dialog/TitleUpdateManagerView.axaml.cs similarity index 74% rename from src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs rename to src/Ryujinx/UI/Views/Dialog/TitleUpdateManagerView.axaml.cs index a13ad4012..3c745f3cb 100644 --- a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml.cs +++ b/src/Ryujinx/UI/Views/Dialog/TitleUpdateManagerView.axaml.cs @@ -3,29 +3,19 @@ using Avalonia.Interactivity; using Avalonia.Styling; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common.Helper; -using Ryujinx.UI.Common.Models; +using Ryujinx.Common.Helper; using System.Threading.Tasks; -namespace Ryujinx.Ava.UI.Windows +namespace Ryujinx.Ava.UI.Views.Dialog { - public partial class TitleUpdateWindow : UserControl + public partial class TitleUpdateManagerView : RyujinxControl { - public readonly TitleUpdateViewModel ViewModel; - - public TitleUpdateWindow() + public TitleUpdateManagerView() { - DataContext = this; - - InitializeComponent(); - } - - public TitleUpdateWindow(ApplicationLibrary applicationLibrary, ApplicationData applicationData) - { - DataContext = ViewModel = new TitleUpdateViewModel(applicationLibrary, applicationData); - InitializeComponent(); } @@ -36,8 +26,11 @@ namespace Ryujinx.Ava.UI.Windows PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = string.Empty, - Content = new TitleUpdateWindow(applicationLibrary, applicationData), Title = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.GameUpdateWindowHeading, applicationData.Name, applicationData.IdBaseString), + Content = new TitleUpdateManagerView + { + ViewModel = new TitleUpdateViewModel(applicationLibrary, applicationData) + } }; Style bottomBorder = new(x => x.OfType().Name("DialogSpace").Child().OfType()); diff --git a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml b/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml similarity index 84% rename from src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml rename to src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml index d726f8099..d149d246c 100644 --- a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml +++ b/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml @@ -1,32 +1,19 @@ - - - - - - - - - - - - - + @@ -36,12 +23,7 @@ Margin="0 0 10 10" IsVisible="{Binding !Processing}" Grid.Row="1"> - - - - - - + @@ -140,7 +122,7 @@ Padding="2.5"> - - - - - + - - - - - + @@ -187,7 +161,7 @@ HorizontalAlignment="Left" VerticalAlignment="Center" MaxLines="1" - Text="{Binding ., Converter={StaticResource StatusLabel}}"> + Text="{Binding ., Converter={x:Static helpers:XCITrimmerFileStatusConverter.Instance}}"> @@ -195,7 +169,7 @@ Classes="h1" Text="{ext:Locale XCITrimmerTitleStatusFailed}" /> > + Text="{Binding ., Converter={x:Static helpers:XCITrimmerFileSpaceSavingsConverter.Instance}}">> @@ -232,15 +206,7 @@ BorderThickness="1" CornerRadius="5" Padding="2.5"> - - - - - - - - - + - - - - - + { - public XCITrimmerViewModel ViewModel; - - public XCITrimmerWindow() + public XciTrimmerView() { - DataContext = this; - InitializeComponent(); } - public XCITrimmerWindow(MainWindowViewModel mainWindowViewModel) - { - DataContext = ViewModel = new XCITrimmerViewModel(mainWindowViewModel); - - InitializeComponent(); - } - - public static async Task Show(MainWindowViewModel mainWindowViewModel) + public static async Task Show() { ContentDialog contentDialog = new() { PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = string.Empty, - Content = new XCITrimmerWindow(mainWindowViewModel), - Title = string.Format(LocaleManager.Instance[LocaleKeys.XCITrimmerWindowTitle]), + Content = new XciTrimmerView + { + ViewModel = new XciTrimmerViewModel(RyujinxApp.MainWindow.ViewModel) + }, + Title = LocaleManager.Instance[LocaleKeys.XCITrimmerWindowTitle] }; Style bottomBorder = new(x => x.OfType().Name("DialogSpace").Child().OfType()); @@ -70,7 +63,7 @@ namespace Ryujinx.Ava.UI.Windows public void Sort_Checked(object sender, RoutedEventArgs args) { if (sender is RadioButton { Tag: string sortField }) - ViewModel.SortingField = Enum.Parse(sortField); + ViewModel.SortingField = Enum.Parse(sortField); } public void Order_Checked(object sender, RoutedEventArgs args) @@ -81,7 +74,7 @@ namespace Ryujinx.Ava.UI.Windows private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { - foreach (var content in e.AddedItems) + foreach (object content in e.AddedItems) { if (content is XCITrimmerFileModel applicationData) { @@ -89,7 +82,7 @@ namespace Ryujinx.Ava.UI.Windows } } - foreach (var content in e.RemovedItems) + foreach (object content in e.RemovedItems) { if (content is XCITrimmerFileModel applicationData) { diff --git a/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml b/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml index 7daf23eb6..3fba2b804 100644 --- a/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml +++ b/src/Ryujinx/UI/Views/Input/ControllerInputView.axaml @@ -7,6 +7,7 @@ xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels.Input" xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers" + xmlns:pt="using:Projektanker.Icons.Avalonia" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" d:DesignHeight="800" @@ -19,9 +20,6 @@ - - - - - + Header="{ext:Locale MenuBarOptionsStartGamesInFullscreen}" + Classes="withCheckbox"> - - - - + + + + + + Header="{ext:Locale MenuBarOptionsShowConsole}" + Classes="withCheckbox"> - - - - - - - - + Icon="{ext:Icon fa-solid fa-language}" + Classes="withCheckbox"> - - - - + ToolTip.Tip="{ext:Locale OpenSettingsTooltip}" + Classes="withCheckbox"> - - - - + ToolTip.Tip="{ext:Locale OpenProfileManagerTooltip}" + Classes="withCheckbox"> + IsVisible="{Binding !EnableNonGameRunningControls}"> + - - - - + + + + - - - + + + - - - + + + - + - - + + + + - - + + + + + + + + diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs index a3aa58f2c..113f2e63a 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs @@ -1,43 +1,68 @@ using Avalonia; using Avalonia.Controls; -using Avalonia.Interactivity; +using Avalonia.Layout; using Avalonia.Threading; using Gommon; -using LibHac.Ncm; -using LibHac.Tools.FsSystem.NcaUtils; +using LibHac.Common; +using LibHac.Ns; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.UI.Views.Dialog; using Ryujinx.Ava.UI.Windows; +using Ryujinx.Ava.Utilities; using Ryujinx.Common; +using Ryujinx.Common.Helper; using Ryujinx.Common.Utilities; -using Ryujinx.UI.App.Common; -using Ryujinx.UI.Common; -using Ryujinx.UI.Common.Configuration; -using Ryujinx.UI.Common.Helper; +using Ryujinx.HLE.HOS.Services.Nfc.AmiiboDecryption; using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Views.Main { - public partial class MainMenuBarView : UserControl + public partial class MainMenuBarView : RyujinxControl { public MainWindow Window { get; private set; } - public MainWindowViewModel ViewModel { get; private set; } public MainMenuBarView() { InitializeComponent(); - RyuLogo.IsVisible = !ConfigurationState.Instance.ShowTitleBar; - ToggleFileTypesMenuItem.ItemsSource = GenerateToggleFileTypeItems(); ChangeLanguageMenuItem.ItemsSource = GenerateLanguageMenuItems(); + + MiiAppletMenuItem.Command = Commands.Create(OpenMiiApplet); + CloseRyujinxMenuItem.Command = Commands.Create(CloseWindow); + OpenSettingsMenuItem.Command = Commands.Create(OpenSettings); + PauseEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.Pause()); + ResumeEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.Resume()); + StopEmulationMenuItem.Command = Commands.Create(() => ViewModel.AppHost?.ShowExitPrompt().OrCompleted()); + CheatManagerMenuItem.Command = Commands.CreateSilentFail(OpenCheatManagerForCurrentApp); + InstallFileTypesMenuItem.Command = Commands.Create(InstallFileTypes); + UninstallFileTypesMenuItem.Command = Commands.Create(UninstallFileTypes); + XciTrimmerMenuItem.Command = Commands.Create(XciTrimmerView.Show); + AboutWindowMenuItem.Command = Commands.Create(AboutView.Show); + CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityListWindow.Show()); + + UpdateMenuItem.Command = MainWindowViewModel.UpdateCommand; + + FaqMenuItem.Command = + SetupGuideMenuItem.Command = + LdnGuideMenuItem.Command = Commands.Create(OpenHelper.OpenUrl); + + WindowSize720PMenuItem.Command = + WindowSize1080PMenuItem.Command = + WindowSize1440PMenuItem.Command = + WindowSize2160PMenuItem.Command = Commands.Create(ChangeWindowSize); } - private CheckBox[] GenerateToggleFileTypeItems() => + private IEnumerable GenerateToggleFileTypeItems() => Enum.GetValues() .Select(it => (FileName: Enum.GetName(it)!, FileType: it)) .Select(it => @@ -45,43 +70,46 @@ namespace Ryujinx.Ava.UI.Views.Main { Content = $".{it.FileName}", IsChecked = it.FileType.GetConfigValue(ConfigurationState.Instance.UI.ShownFileTypes), - Command = MiniCommand.Create(() => Window.ToggleFileType(it.FileName)) + Command = Commands.Create(() => Window.ToggleFileType(it.FileName)) } - ).ToArray(); + ); - private static MenuItem[] GenerateLanguageMenuItems() + private static IEnumerable GenerateLanguageMenuItems() { - List menuItems = new(); + const string LocalePath = "Ryujinx/Assets/Locale.json"; - string localePath = "Ryujinx/Assets/Locales"; - string localeExt = ".json"; + string languageJson = EmbeddedResources.ReadAllText(LocalePath); - string[] localesPath = EmbeddedResources.GetAllAvailableResources(localePath, localeExt); + LocalesJson locales = JsonHelper.Deserialize(languageJson, LocalesJsonContext.Default.LocalesJson); - Array.Sort(localesPath); - - foreach (string locale in localesPath) + foreach (string language in locales.Languages) { - string languageCode = Path.GetFileNameWithoutExtension(locale).Split('.').Last(); - string languageJson = EmbeddedResources.ReadAllText($"{localePath}/{languageCode}{localeExt}"); - var strings = JsonHelper.Deserialize(languageJson, CommonJsonContext.Default.StringDictionary); + int index = locales.Locales.FindIndex(x => x.ID == "Language"); + string languageName; - if (!strings.TryGetValue("Language", out string languageName)) + if (index == -1) { - languageName = languageCode; + languageName = language; + } + else + { + string tr = locales.Locales[index].Translations[language]; + languageName = string.IsNullOrEmpty(tr) + ? language + : tr; } MenuItem menuItem = new() { - Padding = new Thickness(10, 0, 0, 0), - Header = " " + languageName, - Command = MiniCommand.Create(() => MainWindowViewModel.ChangeLanguage(languageCode)) + Padding = new Thickness(15, 0, 0, 0), + Margin = new Thickness(3, 0, 3, 0), + HorizontalAlignment = HorizontalAlignment.Stretch, + Header = languageName, + Command = Commands.Create(() => MainWindowViewModel.ChangeLanguage(language)) }; - menuItems.Add(menuItem); + yield return menuItem; } - - return menuItems.ToArray(); } protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) @@ -95,64 +123,63 @@ namespace Ryujinx.Ava.UI.Views.Main } } - private async void StopEmulation_Click(object sender, RoutedEventArgs e) - { - await ViewModel.AppHost?.ShowExitPrompt().OrCompleted()!; - } - - private void PauseEmulation_Click(object sender, RoutedEventArgs e) - { - ViewModel.AppHost?.Pause(); - } - - private void ResumeEmulation_Click(object sender, RoutedEventArgs e) - { - ViewModel.AppHost?.Resume(); - } - - public async void OpenSettings(object sender, RoutedEventArgs e) + public async Task OpenSettings() { Window.SettingsWindow = new(Window.VirtualFileSystem, Window.ContentManager); - await Window.SettingsWindow.ShowDialog(Window); + Rainbow.Enable(); + + if (ViewModel.SelectedApplication is null) // Checks if game data exists + { + await StyleableAppWindow.ShowAsync(Window.SettingsWindow); + } + else + { + bool customConfigExists = File.Exists(Program.GetDirGameUserConfig(ViewModel.SelectedApplication.IdString)); + + if (!ViewModel.IsGameRunning || !customConfigExists) + { + await Window.SettingsWindow.ShowDialog(Window); // The game is not running, or if the user configuration does not exist + } + else + { + // If there is a custom configuration in the folder + await StyleableAppWindow.ShowAsync(new GameSpecificSettingsWindow(ViewModel, customConfigExists)); + } + } + + Rainbow.Disable(); + Rainbow.Reset(); Window.SettingsWindow = null; ViewModel.LoadConfigurableHotKeys(); } - public async void OpenMiiApplet(object sender, RoutedEventArgs e) + public AppletMetadata MiiApplet => new(ViewModel.ContentManager, "miiEdit", 0x0100000000001009); + + public async Task OpenMiiApplet() { - string contentPath = ViewModel.ContentManager.GetInstalledContentPath(0x0100000000001009, StorageId.BuiltInSystem, NcaContentType.Program); + if (!MiiApplet.CanStart(out ApplicationData appData, out BlitStruct nacpData)) + return; - if (!string.IsNullOrEmpty(contentPath)) - { - ApplicationData applicationData = new() - { - Name = "miiEdit", - Id = 0x0100000000001009, - Path = contentPath, - }; - - await ViewModel.LoadApplication(applicationData, ViewModel.IsFullScreen || ViewModel.StartGamesInFullscreen); - } + await ViewModel.LoadApplication(appData, ViewModel.IsFullScreen || ViewModel.StartGamesInFullscreen, nacpData); } - public async void OpenAmiiboWindow(object sender, RoutedEventArgs e) - => await ViewModel.OpenAmiiboWindow(); - - public async void OpenCheatManagerForCurrentApp(object sender, RoutedEventArgs e) + public async Task OpenCheatManagerForCurrentApp() { if (!ViewModel.IsGameRunning) return; string name = ViewModel.AppHost.Device.Processes.ActiveApplication.ApplicationControlProperties.Title[(int)ViewModel.AppHost.Device.System.State.DesiredTitleLanguage].NameString.ToString(); - await new CheatWindow( - Window.VirtualFileSystem, - ViewModel.AppHost.Device.Processes.ActiveApplication.ProgramIdText, - name, - ViewModel.SelectedApplication.Path).ShowDialog(Window); + await StyleableAppWindow.ShowAsync( + new CheatWindow( + Window.VirtualFileSystem, + ViewModel.AppHost.Device.Processes.ActiveApplication.ProgramIdText, + name, + ViewModel.SelectedApplication.Path) + ); ViewModel.AppHost.Device.EnableCheats(); } @@ -163,7 +190,13 @@ namespace Ryujinx.Ava.UI.Views.Main ViewModel.IsAmiiboRequested = ViewModel.AppHost.Device.System.SearchingForAmiibo(out _); } - private async void InstallFileTypes_Click(object sender, RoutedEventArgs e) + private void ScanBinAmiiboMenuItem_AttachedToVisualTree(object sender, VisualTreeAttachmentEventArgs e) + { + if (sender is MenuItem) + ViewModel.IsAmiiboBinRequested = ViewModel.IsAmiiboRequested && AmiiboBinReader.HasAmiiboKeyFile; + } + + private async Task InstallFileTypes() { ViewModel.AreMimeTypesRegistered = FileAssociationHelper.Install(); if (ViewModel.AreMimeTypesRegistered) @@ -172,7 +205,7 @@ namespace Ryujinx.Ava.UI.Views.Main await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogInstallFileTypesErrorMessage]); } - private async void UninstallFileTypes_Click(object sender, RoutedEventArgs e) + private async Task UninstallFileTypes() { ViewModel.AreMimeTypesRegistered = !FileAssociationHelper.Uninstall(); if (!ViewModel.AreMimeTypesRegistered) @@ -181,24 +214,21 @@ namespace Ryujinx.Ava.UI.Views.Main await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogUninstallFileTypesErrorMessage]); } - private async void ChangeWindowSize_Click(object sender, RoutedEventArgs e) + private void ChangeWindowSize(string resolution) { - if (sender is not MenuItem { Tag: string resolution }) - return; - (int resolutionWidth, int resolutionHeight) = resolution.Split(' ', 2) - .Into(parts => + .Into(parts => (int.Parse(parts[0]), int.Parse(parts[1])) ); // Correctly size window when 'TitleBar' is enabled (Nov. 14, 2024) double barsHeight = ((Window.StatusBarHeight + Window.MenuBarHeight) + - (ConfigurationState.Instance.ShowTitleBar ? (int)Window.TitleBar.Height : 0)); + (ConfigurationState.Instance.ShowOldUI ? (int)Window.TitleBar.Height : 0)); double windowWidthScaled = (resolutionWidth * Program.WindowScaleFactor); double windowHeightScaled = ((resolutionHeight + barsHeight) * Program.WindowScaleFactor); - await Dispatcher.UIThread.InvokeAsync(() => + Dispatcher.UIThread.Post(() => { ViewModel.WindowState = WindowState.Normal; @@ -206,16 +236,7 @@ namespace Ryujinx.Ava.UI.Views.Main }); } - public async void CheckForUpdates(object sender, RoutedEventArgs e) - { - if (Updater.CanUpdate(true)) - await Updater.BeginUpdateAsync(true); - } + public void CloseWindow() => Window.Close(); - public async void OpenXCITrimmerWindow(object sender, RoutedEventArgs e) => await XCITrimmerWindow.Show(ViewModel); - - public async void OpenAboutWindow(object sender, RoutedEventArgs e) => await AboutWindow.Show(); - - public void CloseWindow(object sender, RoutedEventArgs e) => Window.Close(); } } diff --git a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml index 6e72a8b4b..b03736681 100644 --- a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml @@ -23,13 +23,13 @@ Background="{DynamicResource ThemeContentBackgroundColor}" DockPanel.Dock="Bottom" IsVisible="{Binding ShowMenuAndStatusBar}" - ColumnDefinitions="Auto,Auto,*,Auto,Auto"> + ColumnDefinitions="Auto,Auto,*,Auto,Auto,Auto"> - + - + - + - + - + - + + + + + + + + - + - + - + + + + + + + + + + - + { public MainWindow Window; @@ -29,7 +30,7 @@ namespace Ryujinx.Ava.UI.Views.Main if (VisualRoot is MainWindow window) { Window = window; - DataContext = window.ViewModel; + ViewModel = window.ViewModel; LocaleManager.Instance.LocaleChanged += () => Dispatcher.UIThread.Post(() => { if (Window.ViewModel.EnableNonGameRunningControls) @@ -41,7 +42,7 @@ namespace Ryujinx.Ava.UI.Views.Main private void VSyncMode_PointerReleased(object sender, PointerReleasedEventArgs e) { Window.ViewModel.ToggleVSyncMode(); - Logger.Info?.Print(LogClass.Application, $"VSync Mode toggled to: {Window.ViewModel.AppHost.Device.VSyncMode}"); + Logger.Info?.PrintMsg(LogClass.Application, $"VSync Mode toggled to: {Window.ViewModel.AppHost.Device.VSyncMode}"); } private void DockedStatus_PointerReleased(object sender, PointerReleasedEventArgs e) @@ -52,7 +53,7 @@ namespace Ryujinx.Ava.UI.Views.Main private void AspectRatioStatus_OnClick(object sender, RoutedEventArgs e) { AspectRatio aspectRatio = ConfigurationState.Instance.Graphics.AspectRatio.Value; - ConfigurationState.Instance.Graphics.AspectRatio.Value = (int)aspectRatio + 1 > Enum.GetNames(typeof(AspectRatio)).Length - 1 ? AspectRatio.Fixed4x3 : aspectRatio + 1; + ConfigurationState.Instance.Graphics.AspectRatio.Value = (int)aspectRatio + 1 > Enum.GetNames().Length - 1 ? AspectRatio.Fixed4x3 : aspectRatio + 1; } private void Refresh_OnClick(object sender, RoutedEventArgs e) => Window.LoadApplications(); @@ -62,12 +63,7 @@ namespace Ryujinx.Ava.UI.Views.Main // Change the volume by 5% at a time float newValue = Window.ViewModel.Volume + (float)e.Delta.Y * 0.05f; - Window.ViewModel.Volume = newValue switch - { - < 0 => 0, - > 1 => 1, - _ => newValue, - }; + Window.ViewModel.Volume = Math.Clamp(newValue, 0, 1); e.Handled = true; } diff --git a/src/Ryujinx/UI/Views/Main/MainViewControls.axaml b/src/Ryujinx/UI/Views/Main/MainViewControls.axaml index 1c6895db1..db557b417 100644 --- a/src/Ryujinx/UI/Views/Main/MainViewControls.axaml +++ b/src/Ryujinx/UI/Views/Main/MainViewControls.axaml @@ -107,37 +107,43 @@ Tag="Title" /> + diff --git a/src/Ryujinx/UI/Views/Main/MainViewControls.axaml.cs b/src/Ryujinx/UI/Views/Main/MainViewControls.axaml.cs index d5f7fbd1c..8ebc89f26 100644 --- a/src/Ryujinx/UI/Views/Main/MainViewControls.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainViewControls.axaml.cs @@ -3,16 +3,15 @@ using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using Ryujinx.Ava.Common; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; using System; namespace Ryujinx.Ava.UI.Views.Main { - public partial class MainViewControls : UserControl + public partial class MainViewControls : RyujinxControl { - public MainWindowViewModel ViewModel; - public MainViewControls() { InitializeComponent(); @@ -24,9 +23,8 @@ namespace Ryujinx.Ava.UI.Views.Main if (VisualRoot is MainWindow window) { - DataContext = ViewModel = window.ViewModel; + ViewModel = window.ViewModel; } - } public void Sort_Checked(object sender, RoutedEventArgs args) diff --git a/src/Ryujinx/UI/Controls/ApplicationGridView.axaml b/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml similarity index 60% rename from src/Ryujinx/UI/Controls/ApplicationGridView.axaml rename to src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml index 98a1c004b..4d1db1507 100644 --- a/src/Ryujinx/UI/Controls/ApplicationGridView.axaml +++ b/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml @@ -1,5 +1,5 @@ - - - - - - - - + + ItemsSource="{Binding AppsObservableList}"> - - - - - + + Source="{Binding Icon, Converter={x:Static helpers:BitmapArrayValueConverter.Instance}}" /> - + + + + @@ -90,10 +86,28 @@ Margin="5,5,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" - FontSize="16" - Foreground="{DynamicResource SystemAccentColor}" + FontSize="18" + Foreground="{DynamicResource FavoriteApplicationIconColor}" IsVisible="{Binding Favorite}" Symbol="StarFilled" /> + + + + + diff --git a/src/Ryujinx/UI/Controls/ApplicationGridView.axaml.cs b/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml.cs similarity index 69% rename from src/Ryujinx/UI/Controls/ApplicationGridView.axaml.cs rename to src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml.cs index 25a34b423..4b4e08d3d 100644 --- a/src/Ryujinx/UI/Controls/ApplicationGridView.axaml.cs +++ b/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml.cs @@ -1,14 +1,15 @@ using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.UI.App.Common; using System; -namespace Ryujinx.Ava.UI.Controls +namespace Ryujinx.Ava.UI.Views.Misc { - public partial class ApplicationGridView : UserControl + public partial class ApplicationGridView : RyujinxControl { public static readonly RoutedEvent ApplicationOpenedEvent = RoutedEvent.Register(nameof(ApplicationOpened), RoutingStrategies.Bubble); @@ -26,11 +27,5 @@ namespace Ryujinx.Ava.UI.Controls if (sender is ListBox { SelectedItem: ApplicationData selected }) RaiseEvent(new ApplicationOpenedEventArgs(selected, ApplicationOpenedEvent)); } - - public void GameList_SelectionChanged(object sender, SelectionChangedEventArgs args) - { - if (DataContext is MainWindowViewModel viewModel && sender is ListBox { SelectedItem: ApplicationData selected }) - viewModel.GridSelectedApplication = selected; - } } } diff --git a/src/Ryujinx/UI/Controls/ApplicationListView.axaml b/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml similarity index 63% rename from src/Ryujinx/UI/Controls/ApplicationListView.axaml rename to src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml index 0daa77ac4..c9926301b 100644 --- a/src/Ryujinx/UI/Controls/ApplicationListView.axaml +++ b/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml @@ -1,37 +1,29 @@ - - - - - - - - + + ItemsSource="{Binding AppsObservableList}"> + Source="{Binding Icon, Converter={x:Static helpers:BitmapArrayValueConverter.Instance}}" /> + - + + diff --git a/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs b/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs new file mode 100644 index 000000000..a3e1c438d --- /dev/null +++ b/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs @@ -0,0 +1,61 @@ +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Input.Platform; +using Avalonia.Interactivity; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.UI.Controls; +using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.UI.Windows; +using System; +using System.Linq; + +namespace Ryujinx.Ava.UI.Views.Misc +{ + public partial class ApplicationListView : RyujinxControl + { + public static readonly RoutedEvent ApplicationOpenedEvent = + RoutedEvent.Register(nameof(ApplicationOpened), RoutingStrategies.Bubble); + + public event EventHandler ApplicationOpened + { + add => AddHandler(ApplicationOpenedEvent, value); + remove => RemoveHandler(ApplicationOpenedEvent, value); + } + + public ApplicationListView() => InitializeComponent(); + + public void GameList_DoubleTapped(object sender, TappedEventArgs args) + { + if (sender is ListBox { SelectedItem: ApplicationData selected }) + RaiseEvent(new ApplicationOpenedEventArgs(selected, ApplicationOpenedEvent)); + } + + private async void PlayabilityStatus_OnClick(object sender, RoutedEventArgs e) + { + if (sender is not Button { Content: TextBlock playabilityLabel }) + return; + + await CompatibilityListWindow.Show((string)playabilityLabel.Tag); + } + + private async void IdString_OnClick(object sender, RoutedEventArgs e) + { + if (sender is not Button { Content: TextBlock idText }) + return; + + if (!RyujinxApp.IsClipboardAvailable(out IClipboard clipboard)) + return; + + ApplicationData appData = ViewModel.Applications.FirstOrDefault(it => it.IdString == idText.Text); + if (appData is null) + return; + + await clipboard.SetTextAsync(appData.IdString); + + NotificationHelper.ShowInformation( + "Copied Title ID", + $"{appData.Name} ({appData.IdString})"); + } + } +} diff --git a/src/Ryujinx/UI/Views/Settings/SettingsCPUView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsCPUView.axaml index c7f03a45d..0be13d9a5 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsCPUView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsCPUView.axaml @@ -6,6 +6,8 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" + xmlns:helper="clr-namespace:Ryujinx.Common.Helper;assembly=Ryujinx.Common" + xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" mc:Ignorable="d" x:DataType="viewModels:SettingsViewModel"> @@ -69,12 +71,63 @@ + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Views/Settings/SettingsGraphicsView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsGraphicsView.axaml index 219efcef8..5a91b0435 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsGraphicsView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsGraphicsView.axaml @@ -56,7 +56,27 @@ SelectedIndex="{Binding PreferredGpuIndex}" ItemsSource="{Binding AvailableGpus}"/> - + + + + + + + + + + + + + + + @@ -255,32 +275,7 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs new file mode 100644 index 000000000..0017b5583 --- /dev/null +++ b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml.cs @@ -0,0 +1,12 @@ +using Avalonia.Controls; + +namespace Ryujinx.Ava.UI.Views.Settings +{ + public partial class SettingsHacksView : UserControl + { + public SettingsHacksView() + { + InitializeComponent(); + } + } +} diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml index da0957e02..917177fb5 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml @@ -14,15 +14,12 @@ - - - - @@ -50,71 +47,79 @@ Classes="h1" Text="{ext:Locale SettingsTabHotkeysHotkeys}" /> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs index 609f61633..b9a5462b2 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs +++ b/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs @@ -3,19 +3,24 @@ using Avalonia.Controls.Primitives; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.LogicalTree; +using Avalonia.Threading; using Ryujinx.Ava.Input; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Input; using Ryujinx.Input.Assigner; +using System; +using System.Collections.Generic; +using Button = Ryujinx.Input.Button; using Key = Ryujinx.Common.Configuration.Hid.Key; namespace Ryujinx.Ava.UI.Views.Settings { - public partial class SettingsHotkeysView : UserControl + public partial class SettingsHotkeysView : RyujinxControl { private ButtonKeyAssigner _currentAssigner; - private readonly IGamepadDriver _avaloniaKeyboardDriver; + private readonly AvaloniaKeyboardDriver _avaloniaKeyboardDriver; public SettingsHotkeysView() { @@ -45,12 +50,48 @@ namespace Ryujinx.Ava.UI.Views.Settings private void MouseClick(object sender, PointerPressedEventArgs e) { bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed; + bool shouldRemoveBinding = e.GetCurrentPoint(this).Properties.IsRightButtonPressed; + + if (shouldRemoveBinding) + { + DeleteBind(); + } _currentAssigner?.Cancel(shouldUnbind); PointerPressed -= MouseClick; } + private void DeleteBind() + { + if (DataContext is not SettingsViewModel viewModel) + return; + + if (_currentAssigner != null) + { + Dictionary buttonActions = new() + { + { "ToggleVSyncMode", () => viewModel.KeyboardHotkey.ToggleVSyncMode = Key.Unbound }, + { "Screenshot", () => viewModel.KeyboardHotkey.Screenshot = Key.Unbound }, + { "ShowUI", () => viewModel.KeyboardHotkey.ShowUI = Key.Unbound }, + { "Pause", () => viewModel.KeyboardHotkey.Pause = Key.Unbound }, + { "ToggleMute", () => viewModel.KeyboardHotkey.ToggleMute = Key.Unbound }, + { "ResScaleUp", () => viewModel.KeyboardHotkey.ResScaleUp = Key.Unbound }, + { "ResScaleDown", () => viewModel.KeyboardHotkey.ResScaleDown = Key.Unbound }, + { "VolumeUp", () => viewModel.KeyboardHotkey.VolumeUp = Key.Unbound }, + { "VolumeDown", () => viewModel.KeyboardHotkey.VolumeDown = Key.Unbound }, + { "CustomVSyncIntervalIncrement", () => viewModel.KeyboardHotkey.CustomVSyncIntervalIncrement = Key.Unbound }, + { "CustomVSyncIntervalDecrement", () => viewModel.KeyboardHotkey.CustomVSyncIntervalDecrement = Key.Unbound }, + { "TurboMode", () => viewModel.KeyboardHotkey.TurboMode = Key.Unbound } + }; + + if (buttonActions.TryGetValue(_currentAssigner.ToggledButton.Name, out Action action)) + { + action(); + } + } + } + private void Button_IsCheckedChanged(object sender, RoutedEventArgs e) { if (sender is ToggleButton button) @@ -70,52 +111,59 @@ namespace Ryujinx.Ava.UI.Views.Settings PointerPressed += MouseClick; - var keyboard = (IKeyboard)_avaloniaKeyboardDriver.GetGamepad("0"); + IKeyboard keyboard = (IKeyboard)_avaloniaKeyboardDriver.GetGamepad("0"); IButtonAssigner assigner = new KeyboardKeyAssigner(keyboard); _currentAssigner.ButtonAssigned += (sender, e) => { if (e.ButtonValue.HasValue) { - var viewModel = (DataContext) as SettingsViewModel; - var buttonValue = e.ButtonValue.Value; + Button buttonValue = e.ButtonValue.Value; - switch (button.Name) + Dispatcher.UIThread.Post(() => { - case "ToggleVSyncMode": - viewModel.KeyboardHotkey.ToggleVSyncMode = buttonValue.AsHidType(); - break; - case "Screenshot": - viewModel.KeyboardHotkey.Screenshot = buttonValue.AsHidType(); - break; - case "ShowUI": - viewModel.KeyboardHotkey.ShowUI = buttonValue.AsHidType(); - break; - case "Pause": - viewModel.KeyboardHotkey.Pause = buttonValue.AsHidType(); - break; - case "ToggleMute": - viewModel.KeyboardHotkey.ToggleMute = buttonValue.AsHidType(); - break; - case "ResScaleUp": - viewModel.KeyboardHotkey.ResScaleUp = buttonValue.AsHidType(); - break; - case "ResScaleDown": - viewModel.KeyboardHotkey.ResScaleDown = buttonValue.AsHidType(); - break; - case "VolumeUp": - viewModel.KeyboardHotkey.VolumeUp = buttonValue.AsHidType(); - break; - case "VolumeDown": - viewModel.KeyboardHotkey.VolumeDown = buttonValue.AsHidType(); - break; - case "CustomVSyncIntervalIncrement": - viewModel.KeyboardHotkey.CustomVSyncIntervalIncrement = buttonValue.AsHidType(); - break; - case "CustomVSyncIntervalDecrement": - viewModel.KeyboardHotkey.CustomVSyncIntervalDecrement = buttonValue.AsHidType(); - break; - } + switch (button.Name) + { + case "ToggleVSyncMode": + ViewModel.KeyboardHotkey.ToggleVSyncMode = buttonValue.AsHidType(); + break; + case "Screenshot": + ViewModel.KeyboardHotkey.Screenshot = buttonValue.AsHidType(); + break; + case "ShowUI": + ViewModel.KeyboardHotkey.ShowUI = buttonValue.AsHidType(); + break; + case "Pause": + ViewModel.KeyboardHotkey.Pause = buttonValue.AsHidType(); + break; + case "ToggleMute": + ViewModel.KeyboardHotkey.ToggleMute = buttonValue.AsHidType(); + break; + case "ResScaleUp": + ViewModel.KeyboardHotkey.ResScaleUp = buttonValue.AsHidType(); + break; + case "ResScaleDown": + ViewModel.KeyboardHotkey.ResScaleDown = buttonValue.AsHidType(); + break; + case "VolumeUp": + ViewModel.KeyboardHotkey.VolumeUp = buttonValue.AsHidType(); + break; + case "VolumeDown": + ViewModel.KeyboardHotkey.VolumeDown = buttonValue.AsHidType(); + break; + case "CustomVSyncIntervalIncrement": + ViewModel.KeyboardHotkey.CustomVSyncIntervalIncrement = + buttonValue.AsHidType(); + break; + case "CustomVSyncIntervalDecrement": + ViewModel.KeyboardHotkey.CustomVSyncIntervalDecrement = + buttonValue.AsHidType(); + break; + case "TurboMode": + ViewModel.KeyboardHotkey.TurboMode = buttonValue.AsHidType(); + break; + } + }); } }; diff --git a/src/Ryujinx/UI/Views/Settings/SettingsInputView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsInputView.axaml index b0edc51a5..e79898125 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsInputView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsInputView.axaml @@ -1,4 +1,4 @@ - - - - - - - - + + + + + @@ -39,6 +41,13 @@ + + + + + + { - public SettingsViewModel ViewModel; + private readonly Random _random; public SettingsNetworkView() { + _random = new Random(); InitializeComponent(); } private void GenLdnPassButton_OnClick(object sender, RoutedEventArgs e) { byte[] code = new byte[4]; - new Random().NextBytes(code); + _random.NextBytes(code); ViewModel.LdnPassphrase = $"Ryujinx-{BitConverter.ToUInt32(code):x8}"; } private void ClearLdnPassButton_OnClick(object sender, RoutedEventArgs e) { - ViewModel.LdnPassphrase = ""; + ViewModel.LdnPassphrase = string.Empty; } } } diff --git a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml index e04e541c3..dbe4433dd 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml @@ -10,9 +10,6 @@ xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers" mc:Ignorable="d" x:DataType="viewModels:SettingsViewModel"> - - - @@ -156,9 +153,11 @@ Text="{Binding Path=TimeZone, Mode=OneWay}" TextChanged="TimeZoneBox_OnTextChanged" ToolTip.Tip="{ext:Locale TimezoneTooltip}" - ValueMemberBinding="{Binding Mode=OneWay, Converter={StaticResource TimeZone}}" /> + ValueMemberBinding="{Binding Mode=OneWay, Converter={x:Static helpers:TimeZoneConverter.Instance}}" /> + + - + + + + + + + - + ToolTip.Tip="{ext:Locale IgnoreControllerAppletTooltip}"> + + + + diff --git a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml.cs index 2c9eac28c..a81e0fb75 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml.cs +++ b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml.cs @@ -1,13 +1,12 @@ using Avalonia.Controls; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.ViewModels; using TimeZone = Ryujinx.Ava.UI.Models.TimeZone; namespace Ryujinx.Ava.UI.Views.Settings { - public partial class SettingsSystemView : UserControl + public partial class SettingsSystemView : RyujinxControl { - public SettingsViewModel ViewModel; - public SettingsSystemView() { InitializeComponent(); diff --git a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml index 3f23a75fd..ad05efd06 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml @@ -18,174 +18,265 @@ HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + Margin="10" + Spacing="10" + Grid.Column="2" + Orientation="Vertical" HorizontalAlignment="Stretch"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs index 3532e1855..f0742a579 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs +++ b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs @@ -1,48 +1,51 @@ +using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Platform.Storage; -using Avalonia.VisualTree; +using Gommon; +using Ryujinx.Ava.UI.Controls; +using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; -using System; +using Ryujinx.Ava.Utilities; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Views.Settings { - public partial class SettingsUiView : UserControl + public partial class SettingsUiView : RyujinxControl { - public SettingsViewModel ViewModel; - public SettingsUiView() { InitializeComponent(); - ShowTitleBarBox.IsVisible = OperatingSystem.IsWindows(); + AddGameDirButton.Command = + Commands.Create(() => AddDirButton(GameDirPathBox, ViewModel.GameDirectories)); + AddAutoloadDirButton.Command = + Commands.Create(() => AddDirButton(AutoloadDirPathBox, ViewModel.AutoloadDirectories)); } - private async void AddGameDirButton_OnClick(object sender, RoutedEventArgs e) + private async Task AddDirButton(TextBox addDirBox, AvaloniaList directories) { - string path = GameDirPathBox.Text; + string path = addDirBox.Text; - if (!string.IsNullOrWhiteSpace(path) && Directory.Exists(path) && !ViewModel.GameDirectories.Contains(path)) + if (!string.IsNullOrWhiteSpace(path) && Directory.Exists(path) && !directories.Contains(path)) { - ViewModel.GameDirectories.Add(path); - ViewModel.GameDirectoryChanged = true; + directories.Add(path); + + addDirBox.Clear(); + + ViewModel.GameListNeedsRefresh = true; } else { - if (this.GetVisualRoot() is Window window) - { - var result = await window.StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions - { - AllowMultiple = false, - }); + Optional folder = await RyujinxApp.MainWindow.ViewModel.StorageProvider.OpenSingleFolderPickerAsync(); - if (result.Count > 0) - { - ViewModel.GameDirectories.Add(result[0].Path.LocalPath); - ViewModel.GameDirectoryChanged = true; - } + if (folder.HasValue) + { + directories.Add(folder.Value.Path.LocalPath); + + ViewModel.GameListNeedsRefresh = true; } } } @@ -54,7 +57,7 @@ namespace Ryujinx.Ava.UI.Views.Settings foreach (string path in new List(GameDirsList.SelectedItems.Cast())) { ViewModel.GameDirectories.Remove(path); - ViewModel.GameDirectoryChanged = true; + ViewModel.GameListNeedsRefresh = true; } if (GameDirsList.ItemCount > 0) @@ -63,33 +66,6 @@ namespace Ryujinx.Ava.UI.Views.Settings } } - private async void AddAutoloadDirButton_OnClick(object sender, RoutedEventArgs e) - { - string path = AutoloadDirPathBox.Text; - - if (!string.IsNullOrWhiteSpace(path) && Directory.Exists(path) && !ViewModel.AutoloadDirectories.Contains(path)) - { - ViewModel.AutoloadDirectories.Add(path); - ViewModel.AutoloadDirectoryChanged = true; - } - else - { - if (this.GetVisualRoot() is Window window) - { - var result = await window.StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions - { - AllowMultiple = false, - }); - - if (result.Count > 0) - { - ViewModel.AutoloadDirectories.Add(result[0].Path.LocalPath); - ViewModel.AutoloadDirectoryChanged = true; - } - } - } - } - private void RemoveAutoloadDirButton_OnClick(object sender, RoutedEventArgs e) { int oldIndex = AutoloadDirsList.SelectedIndex; @@ -97,7 +73,7 @@ namespace Ryujinx.Ava.UI.Views.Settings foreach (string path in new List(AutoloadDirsList.SelectedItems.Cast())) { ViewModel.AutoloadDirectories.Remove(path); - ViewModel.AutoloadDirectoryChanged = true; + ViewModel.GameListNeedsRefresh = true; } if (AutoloadDirsList.ItemCount > 0) diff --git a/src/Ryujinx/UI/Views/User/UserEditorView.axaml b/src/Ryujinx/UI/Views/User/UserEditorView.axaml index 7a4af4823..47f6a60e1 100644 --- a/src/Ryujinx/UI/Views/User/UserEditorView.axaml +++ b/src/Ryujinx/UI/Views/User/UserEditorView.axaml @@ -14,18 +14,7 @@ mc:Ignorable="d" Focusable="True" x:DataType="models:TempProfile"> - - - - - - - - - - - - + + Source="{Binding Image, Converter={x:Static helpers:BitmapArrayValueConverter.Instance}}" /> diff --git a/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs b/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs index 588fa471e..62add2393 100644 --- a/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs +++ b/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs @@ -8,18 +8,16 @@ using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.HLE.HOS.Services.Account.Acc; -using System; using UserProfile = Ryujinx.Ava.UI.Models.UserProfile; namespace Ryujinx.Ava.UI.Views.User { - public partial class UserEditorView : UserControl + public partial class UserEditorView : RyujinxControl { private NavigationDialogHost _parent; private UserProfile _profile; private bool _isNewUser; - public TempProfile TempProfile { get; set; } public static uint MaxProfileNameLength => 0x20; public bool IsDeletable => _profile.UserId != AccountManager.DefaultUserId; @@ -39,10 +37,10 @@ namespace Ryujinx.Ava.UI.Views.User switch (arg.NavigationMode) { case NavigationMode.New: - var (parent, profile, isNewUser) = ((NavigationDialogHost parent, UserProfile profile, bool isNewUser))arg.Parameter; + (NavigationDialogHost parent, UserProfile profile, bool isNewUser) = ((NavigationDialogHost parent, UserProfile profile, bool isNewUser))arg.Parameter; _isNewUser = isNewUser; _profile = profile; - TempProfile = new TempProfile(_profile); + ViewModel = new TempProfile(_profile); _parent = parent; break; @@ -51,8 +49,6 @@ namespace Ryujinx.Ava.UI.Views.User ((ContentDialog)_parent.Parent).Title = $"{LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle]} - " + $"{(_isNewUser ? LocaleManager.Instance[LocaleKeys.UserEditorTitleCreate] : LocaleManager.Instance[LocaleKeys.UserEditorTitle])}"; - DataContext = TempProfile; - AddPictureButton.IsVisible = _isNewUser; ChangePictureButton.IsVisible = !_isNewUser; IdLabel.IsVisible = _profile != null; @@ -72,7 +68,7 @@ namespace Ryujinx.Ava.UI.Views.User { if (_isNewUser) { - if (TempProfile.Name != String.Empty || TempProfile.Image != null) + if (ViewModel.Name != string.Empty || ViewModel.Image != null) { if (await ContentDialogHelper.CreateChoiceDialog( LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesTitle], @@ -89,7 +85,7 @@ namespace Ryujinx.Ava.UI.Views.User } else { - if (_profile.Name != TempProfile.Name || _profile.Image != TempProfile.Image) + if (_profile.Name != ViewModel.Name || _profile.Image != ViewModel.Image) { if (await ContentDialogHelper.CreateChoiceDialog( LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesTitle], @@ -115,31 +111,31 @@ namespace Ryujinx.Ava.UI.Views.User { DataValidationErrors.ClearErrors(NameBox); - if (string.IsNullOrWhiteSpace(TempProfile.Name)) + if (string.IsNullOrWhiteSpace(ViewModel.Name)) { DataValidationErrors.SetError(NameBox, new DataValidationException(LocaleManager.Instance[LocaleKeys.UserProfileEmptyNameError])); return; } - if (TempProfile.Image == null) + if (ViewModel.Image == null) { - _parent.Navigate(typeof(UserProfileImageSelectorView), (_parent, TempProfile)); + _parent.Navigate(typeof(UserProfileImageSelectorView), (_parent, ViewModel)); return; } if (_profile != null && !_isNewUser) { - _profile.Name = TempProfile.Name; - _profile.Image = TempProfile.Image; + _profile.Name = ViewModel.Name; + _profile.Image = ViewModel.Image; _profile.UpdateState(); _parent.AccountManager.SetUserName(_profile.UserId, _profile.Name); _parent.AccountManager.SetUserImage(_profile.UserId, _profile.Image); } else if (_isNewUser) { - _parent.AccountManager.AddUser(TempProfile.Name, TempProfile.Image, TempProfile.UserId); + _parent.AccountManager.AddUser(ViewModel.Name, ViewModel.Image, ViewModel.UserId); } else { @@ -151,7 +147,7 @@ namespace Ryujinx.Ava.UI.Views.User public void SelectProfileImage() { - _parent.Navigate(typeof(UserProfileImageSelectorView), (_parent, TempProfile)); + _parent.Navigate(typeof(UserProfileImageSelectorView), (_parent, ViewModel)); } private void ChangePictureButton_Click(object sender, RoutedEventArgs e) diff --git a/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml b/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml index d6a78bf9b..c22624fd5 100644 --- a/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml +++ b/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml @@ -17,19 +17,10 @@ - - - - - - - - - + VerticalAlignment="Stretch" RowDefinitions="Auto,*,Auto,Auto"> - + diff --git a/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml.cs b/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml.cs index 064b5e908..f34d8f603 100644 --- a/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml.cs +++ b/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml.cs @@ -1,4 +1,3 @@ -using Avalonia.Controls; using Avalonia.Interactivity; using FluentAvalonia.UI.Controls; using FluentAvalonia.UI.Navigation; @@ -11,7 +10,7 @@ using System.IO; namespace Ryujinx.Ava.UI.Views.User { - public partial class UserFirmwareAvatarSelectorView : UserControl + public partial class UserFirmwareAvatarSelectorView : RyujinxControl { private NavigationDialogHost _parent; private TempProfile _profile; @@ -20,8 +19,6 @@ namespace Ryujinx.Ava.UI.Views.User { ContentManager = contentManager; - DataContext = ViewModel; - InitializeComponent(); } @@ -55,8 +52,6 @@ namespace Ryujinx.Ava.UI.Views.User public ContentManager ContentManager { get; private set; } - internal UserFirmwareAvatarSelectorViewModel ViewModel { get; set; } - private void GoBack(object sender, RoutedEventArgs e) { _parent.GoBack(); @@ -66,11 +61,11 @@ namespace Ryujinx.Ava.UI.Views.User { if (ViewModel.SelectedImage != null) { - using var streamJpg = new MemoryStream(); - using var bitmap = SKBitmap.Decode(ViewModel.SelectedImage); - using var newBitmap = new SKBitmap(bitmap.Width, bitmap.Height); + using MemoryStream streamJpg = new(); + using SKBitmap bitmap = SKBitmap.Decode(ViewModel.SelectedImage); + using SKBitmap newBitmap = new(bitmap.Width, bitmap.Height); - using (var canvas = new SKCanvas(newBitmap)) + using (SKCanvas canvas = new(newBitmap)) { canvas.Clear(new SKColor( ViewModel.BackgroundColor.R, @@ -80,8 +75,8 @@ namespace Ryujinx.Ava.UI.Views.User canvas.DrawBitmap(bitmap, 0, 0); } - using (var image = SKImage.FromBitmap(newBitmap)) - using (var dataJpeg = image.Encode(SKEncodedImageFormat.Jpeg, 100)) + using (SKImage image = SKImage.FromBitmap(newBitmap)) + using (SKData dataJpeg = image.Encode(SKEncodedImageFormat.Jpeg, 100)) { dataJpeg.SaveTo(streamJpg); } diff --git a/src/Ryujinx/UI/Views/User/UserProfileImageSelectorView.axaml b/src/Ryujinx/UI/Views/User/UserProfileImageSelectorView.axaml index 26e27176b..03aebec8f 100644 --- a/src/Ryujinx/UI/Views/User/UserProfileImageSelectorView.axaml +++ b/src/Ryujinx/UI/Views/User/UserProfileImageSelectorView.axaml @@ -17,12 +17,7 @@ - - - - - + VerticalAlignment="Center" RowDefinitions="Auto,70,Auto"> { private ContentManager _contentManager; private NavigationDialogHost _parent; private TempProfile _profile; - internal UserProfileImageSelectorViewModel ViewModel { get; private set; } - public UserProfileImageSelectorView() { InitializeComponent(); @@ -56,6 +54,7 @@ namespace Ryujinx.Ava.UI.Views.User { _parent.GoBack(); } + break; } } @@ -63,16 +62,16 @@ namespace Ryujinx.Ava.UI.Views.User private async void Import_OnClick(object sender, RoutedEventArgs e) { - var result = await ((Window)this.GetVisualRoot()!).StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions + IReadOnlyList result = await ((Window)this.GetVisualRoot()!).StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions { AllowMultiple = false, FileTypeFilter = new List { new(LocaleManager.Instance[LocaleKeys.AllSupportedFormats]) { - Patterns = new[] { "*.jpg", "*.jpeg", "*.png", "*.bmp" }, - AppleUniformTypeIdentifiers = new[] { "public.jpeg", "public.png", "com.microsoft.bmp" }, - MimeTypes = new[] { "image/jpeg", "image/png", "image/bmp" }, + Patterns = ["*.jpg", "*.jpeg", "*.png", "*.bmp"], + AppleUniformTypeIdentifiers = ["public.jpeg", "public.png", "com.microsoft.bmp"], + MimeTypes = ["image/jpeg", "image/png", "image/bmp"], }, }, }); @@ -99,16 +98,16 @@ namespace Ryujinx.Ava.UI.Views.User private static byte[] ProcessProfileImage(byte[] buffer) { - using var bitmap = SKBitmap.Decode(buffer); + using SKBitmap bitmap = SKBitmap.Decode(buffer); - var resizedBitmap = bitmap.Resize(new SKImageInfo(256, 256), SKFilterQuality.High); + SKBitmap resizedBitmap = bitmap.Resize(new SKImageInfo(256, 256), SKFilterQuality.High); - using var streamJpg = new MemoryStream(); + using MemoryStream streamJpg = new(); if (resizedBitmap != null) { - using var image = SKImage.FromBitmap(resizedBitmap); - using var dataJpeg = image.Encode(SKEncodedImageFormat.Jpeg, 100); + using SKImage image = SKImage.FromBitmap(resizedBitmap); + using SKData dataJpeg = image.Encode(SKEncodedImageFormat.Jpeg, 100); dataJpeg.SaveTo(streamJpg); } diff --git a/src/Ryujinx/UI/Views/User/UserRecovererView.axaml b/src/Ryujinx/UI/Views/User/UserRecovererView.axaml index f49444642..43d84787d 100644 --- a/src/Ryujinx/UI/Views/User/UserRecovererView.axaml +++ b/src/Ryujinx/UI/Views/User/UserRecovererView.axaml @@ -18,11 +18,7 @@ - - - - + VerticalAlignment="Stretch" RowDefinitions="*,Auto"> - - - - - + { private NavigationDialogHost _parent; @@ -27,7 +27,7 @@ namespace Ryujinx.Ava.UI.Views.User switch (arg.NavigationMode) { case NavigationMode.New: - var parent = (NavigationDialogHost)arg.Parameter; + NavigationDialogHost parent = (NavigationDialogHost)arg.Parameter; _parent = parent; diff --git a/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml b/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml index e43c39dfa..f04b8a7a3 100644 --- a/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml +++ b/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml @@ -19,22 +19,10 @@ - - - - - - - - - + - - - - + HorizontalAlignment="Stretch" ColumnDefinitions="Auto,*"> - - - - + Margin="10,0, 0, 0" ColumnDefinitions="Auto,*">